1178 - the peb hooker_by_shearer and dreg

Download 1178 - The PEB Hooker_by_Shearer and Dreg

If you can't read please download the document

Upload: ivan-portilla

Post on 29-Nov-2014

587 views

Category:

Documents


5 download

TRANSCRIPT

Spanish translation of the article published in phrack 65, phook - The PEB Hooker: http://phrack.org/issues.html?issue=65&id=10#article http://www.phrack.org/ ==Phrack Inc.== Volume 0x0c, Issue 0x41, Phile #0x0a of 0x0f =-----------------------------------------------------------------------= =---------------------=[ phook - The PEB Hooker ]=----------------------= =-----------------------------------------------------------------------= =-----------------------------------------------------------------------= =----------------=[ [Shearer] - eunimedesAThotmail.com ]=---------------= =----------------=[ Dreg - DregATfr33project.org ]=---------------= =-----------------------------------------------------------------------= =--=[ http://www.fr33project.org / Mirror: http://www.disidents.com ]=--= =-----------------------------------------------------------------------= =-------------------------=[ October 15 2007 ]=-------------------------= =-----------------------------------------------------------------------= ------[ Index 0.- Antes de leer 1.- Introduccin 2.- Conceptos previos 2.1 - Process Environment Block 2.1.1 - LoaderData 2.2 - Import Address Table 2.2.1 - Carga de la Import Address Table 2.3 - Inicio de un proceso en estado suspendido 2.4 - Inyeccin de una DLL en un proceso 2.5 - Hooks en ring3 2.5.1 - Problemas 3.- Diseo 3.1 - Pasos previos a PEB HOOKING 3.2 - Intercambio de datos en LoaderData 3.3 - Carga de mdulos dinmicamente 3.4 - Reparacin de la IAT 3.5 - Comienza la ejecucin 3.6 - Las APIs que trabajan con mdulos 3.7 - Un nuevo concepto: DLL MINIFILTER 3.8 - Problemas frecuentes 4.- phook 4.1 - InjectorDLL 4.2 - Console Control 4.3 - CreateExp 4.3.1 - Forwarder DLL 4.4 - ph_ker32.dll 4.4.1 - Los problemas con la pila 4.4.2 - Los problemas con los registros 4.4.3 - La macro JMP 4.4.4 - Versiones 4.5 - Usando phook 4.5.1 - DLL MINIFILTER 4.6 - Problemas frecuentes

5.- TODO 6.- Testing 7.- Ventajas y posibilidades 8.- Conclusin 9.- Agradecimientos 10.- Trabajos relacionados 11.- Referencias 12.- Cdigo fuente ------[ 0.- Antes de leer Nomenclaturas: .- [T.Index]: trabajos relacionados (apartado 10). .- [R.Index]: referencias (apartado 11). Index es el identificador de la nomenclatura. Para entender el documento es necesario tener conocimiento en win32 de: - Tipos de ejecutables: - PE32 [R.3]: DLLs, EXE... - Programacion: - Uso de APIs [R.20]: LoadLibrary, GetModuleHandle ... - Hooks [R.10] [R.8] [...] - Win32 ASM [R.21]. Se usarn dos trminos a lo largo de todo el documento: 1.- DLL_FAKE: DLL que suplantar a una DLL legtima (DLL_REAL). 2.- DLL_REAL: DLL que ser suplantada por DLL_FAKE. Cada vez que se mencione la palabra hook/s se referir a hook/s en win32, a no ser que se especifique lo contrario. ------[ 1.- Introduccin Los hooks en win32 son muy usados para hacer ingenieria inversa, las motivaciones ms comunes suelen ser el anlisis de malware y sistemas de proteccin de software (packers). Los hooks tambin se suelen usar para monotorizar partes de un software: acceso a ficheros, sockets, modificacin del registro ... Los mtodos actuales para realizar hooks en ring3 (ver apartado 2.5) tienen diferentes problemas (ver apartado 2.5.1). El problema ms importante para nosotros fue que cierto software los detectan. Hay sistemas de proteccin de software que son capaces de alterar el flujo de ejecucin cuando detectan algn tipo de hook conocido, incluso los ms sofisticados son capaces de eliminar algunos tipos de hooks y seguir el flujo de ejecucion normal. Otro problema surge cuando se intenta realizar un hook en los virus que rastrean las direcciones de las APIs en memoria, inutilizando algunos tipos de hooks como el IAT HOOKING (ver apartado 2.5). Hay sistemas de proteccin

de software que usan algunas tcnicas de virus y viceversa. Debido a estos problemas hemos creado phook, que usa un mtodo poco documentado para realizar hooks en ring3 y adems consigue que algunas tcnicas de virus usen nuestro hook. Este documento explica como funciona phook y el mtodo PEB HOOKING [T.1]. phook es una herramienta que usa PEB HOOKING [T.1] para realizar un hook de una DLL, tambin permite de forma interactiva realizar otras tareas: - Listar los mdulos cargados. - Cargar una DLL. - Descargar una DLL. - ... El mtodo PEB HOOKING [T.1] consiste en suplantar una DLL_REAL en memoria por una DLL_FAKE, de forma que todos los mdulos de un proceso que usen la DLL_REAL pasen a usar la DLL_FAKE. ------[ 2 - Conceptos previos Para entender el mtodo PEB HOOKING [T.1] y como funciona phook, es necesario tener claros ciertos conceptos: ------[ 2.1 - Process Environment Block El Process Environment Block (PEB) es una estructura [R.1] ubicada en el espacio de usuario, que contiene los datos de entorno del proceso [R.2]: Variables de entorno. Lista de mdulos cargados. Direcciones en memoria del Heap. Si el proceso est siendo depurado. ...

------[ CODE typedef struct _PEB { BOOLEAN InheritedAddressSpace; BOOLEAN ReadImageFileExecOptions; BOOLEAN BeingDebugged; BOOLEAN Spare; HANDLE Mutant; PVOID ImageBaseAddress; PPEB_LDR_DATA LoaderData; PRTL_USER_PROCESS_PARAMETERS ProcessParameters; PVOID SubSystemData; PVOID ProcessHeap; PVOID FastPebLock; PPEBLOCKROUTINE FastPebLockRoutine; PPEBLOCKROUTINE FastPebUnlockRoutine; ... } PEB, *PPEB; ------[ END CODE Para realizar PEB HOOKING es necesario usar el campo LoaderData [T.1].

------[ 2.1.1 - LoaderData Es una estructura [R.1] en la que se encuentran algunos datos de los mdulos de un proceso. Se trata de una lista doblemente enlazada y que se puede recorrer segun tres criterios [R.2]: 1.- Orden de carga. 2.- Orden en memoria. 3.- Orden de inicializacin. ------[ CODE typedef struct _PEB_LDR_DATA { ULONG Length; BOOLEAN Initialized; PVOID SsHandle; LIST_ENTRY InLoadOrderModuleList; LIST_ENTRY InMemoryOrderModuleList; LIST_ENTRY InInitializationOrderModuleList; } PEB_LDR_DATA, *PPEB_LDR_DATA; ------[ END CODE Cada campo flink y blink de LIST_ENTRY son en realidad punteros a LDR_MODULE. ------[ CODE typedef struct _LIST_ENTRY { struct _LIST_ENTRY * Flink; struct _LIST_ENTRY * Blink; } LIST_ENTRY,*PLIST_ENTRY; ------[ END CODE Los datos que vamos a manipular de LDR_MODULE para realizar PEB HOOKING son [T.1]: - BaseAddress: La base del mdulo en memoria. - EntryPoint : Direccin donde se encuentra la primera instruccin a ejecutar del mdulo. - SizeOfImage: Tamao del mdulo en memoria. ------[ CODE typedef struct _LDR_MODULE { LIST_ENTRY InLoadOrderModuleList; LIST_ENTRY InMemoryOrderModuleList; LIST_ENTRY InInitializationOrderModuleList; PVOID BaseAddress; PVOID EntryPoint; ULONG SizeOfImage; UNICODE_STRING FullDllName; UNICODE_STRING BaseDllName; ULONG Flags;

SHORT LoadCount; SHORT TlsIndex; LIST_ENTRY HashTableEntry; ULONG TimeDateStamp; } LDR_MODULE, *PLDR_MODULE; ------[ END CODE ------[ 2.2 - Import Address Table La Import Address Table (IAT) es una tabla, que tienen los PE32 [R.3], la cual rellena el cargador de win32 en la carga de un mdulo [R.4]. Los smbolos externos que necesita un mdulo se llaman importaciones, los smbolos que un mdulo proporciona a otros mdulos se llaman exportaciones. En la IAT [R.3] de un mdulo estn las direcciones de sus importaciones, o dicho de otra manera, en la IAT [R.3] de un mdulo estn las direcciones de las exportaciones que usa de otros mdulos. ------[ 2.2.1 - Carga de la Import Address Table Para que el cargador de win32 pueda obtener la exportacin necesita conocer: el mdulo en el que se encuentra, el nombre de la exportacin y/o el ordinal [R.3]. Los PE32 tienen una estructura llamada IMAGE_IMPORT_DESCRIPTOR [R.5] en la que destacan los campos: - Name : Nombre del mdulo donde se encuentran las exportaciones. - OriginalFirstThunk: Direccin de tabla donde se encuentran los nombres y/o los ordinales de las exportaciones que importa el mdulo. - FirstThunk : Direccin de una tabla, idntica a OriginalFirstThunk, en la que el cargador de win32 pone las direcciones de las importaciones. ------[ CODE typedef struct _IMAGE_IMPORT_DESCRIPTOR { DWORD OriginalFirstThunk; DWORD TimeDateStamp; DWORD ForwarderChain; DWORD Name; DWORD FirstThunk; } IMAGE_IMPORT_DESCRIPTOR,*PIMAGE_IMPORT_DESCRIPTOR; ------[ END CODE Cada entrada de la tabla de FirstThunk y OriginalFirstThunk tiene dos campos [R.3]: - Hint: si los primeros 31/63 bits son 0x80000000 se importa teniendo en cuenta solo el ordinal, en caso contrario se usar el nombre. Los bits 15-0 representan el ordinal. - Name: Direccin donde se se encuentra el nombre de la exportacin.

------[ CODE typedef struct _IMAGE_IMPORT_BY_NAME { WORD Hint; BYTE Name[1]; } IMAGE_IMPORT_BY_NAME,*PIMAGE_IMPORT_BY_NAME; ------[ END CODE ------[ 2.3 - Inicio de un proceso en estado suspendido Cuando se quiere crear un proceso en estado suspendido hay que saber de que tipo es [R.6]: - Console - GUI Los procesos de tipo Console se pueden crear con la API CreateProcess y el flag CREATE_SUSPENDED. Los procesos de tipo GUI si se abren con el flag CREATE_SUSPENDED pueden no funcionar bien, as que hay que crearlos usando las APIs: 1.- CreateProcess : Se crea el proceso sin flag CREATE_SUSPENDED. 2.- WaitForInputIdle: Se espera a la correcta carga del proceso [R.6]. 3.- SuspendThread : Se suspende el hilo principal. ------[ 2.4 - Inyeccin de una DLL en un proceso Para inyectar una DLL en un proceso hay varios mtodos [R.7], el mtodo ms simple es usando las APIs: 1.- VirtualAllocEx : Reservar memoria en el proceso. 2.- WriteProcessMemory: Escribir en el espacio reservado un cdigo que cargue una DLL. 3.- CreateRemoteThread: Se crea un hilo en el proceso que ejecute el cdigo escrito. 4.- VirtualFreeEx : Una vez cargada la DLL se libera la memoria reservada. ------[ 2.5 - Hooks en ring3 Siempre han existido varias formas de realizar "hooks" en win32, tanto en ring3 como en ring0. El problema de trabajar en ring0 es que si algo falla el SO puede volverse inestable. El mtodo ms estable para el SO es realizar el "hook" desde ring3. Los mtodos ms cnocidos son: - IAT HOOKING: Se modifican las entradas en la IAT [R.3], que pone el cargador de win32, para que apunten a otra zona [R.8]. - PUSH + RET: Se introduce en un area de cdigo las instrucciones PUSH DIRECCION y RET para saltar a la direccin deseada. Generalmente es necesario pasar el control al area original, teniendo que restaurarla en un momento determinado [R.9]. - SetWindowHook...: Con estas APIs, se puede registrar una callback para diferentes eventos del sistema [R.10].

------[ 2.5.1 - Problemas Algunos problemas en los mtodos para realizar hooks en ring3: +-------------------------------------------------------------------------+ Algunos Mtodos Algunos problemas +------------------------+------------------------------------------------+ IAT HOOKING [R.8] 1.- Hay que cambiar la IAT [R.3] de todos los los mdulos cargados. 2.- Un mdulo no necesita IAT [R.3] para usar smbolos exportados por otro. 3.- Es muy conocido. 4.- Fcil de reparar. 5.- Puede ser detectable. 6.- No permite control total desde el inicio. ------------------------+-----------------------------------------------PUSH + RET [R.9] 1.- El mtodo no es genrico para todas las reas de cdigo. 2.- Es complicado de implementar. 3.- Fcil de reparar. 4.- Puede ser detectable. 5.- No permite control total desde el inicio. ------------------------+-----------------------------------------------Otros "hooks": 1.- No permite control total. SetWindowHook... [R.10] 2.- Fcil de reparar. 3.- Puede ser detectable. ------------------------+-----------------------------------------------PEB HOOKING [T.1] 1.- Es complicado de implementar. 2.- La DLL original y la inyectada tienen que exportar los mismos smbolos en el mismo orden (como mnimo). 3.- Puede ser detectable. 4.- No permite control total desde el inicio. +------------------------+------------------------------------------------+ Nota: Esta tabla solo representa la opinin de los autores. Las llamadas desde ring3 a ring0 usando SYSENTER no se pueden controlar mediante solo los mtodos anteriores. Una llamada al sistema desde ring3 se puede realizar con SYSENTER [R.11] sin pasar por ninguna DLL, de tal forma que los mtodos anteriores quedan inutilizados en esta situacin poco comn. Debido a los problemas anteriores, hemos decidido usar PEB HOOKING [T.1] para crear un motor que realiza ms que "hooks": phook - The PEB Hooker. Nota: Las ventajas y posibilidades de PEB HOOKING [T.1] se explican en el apartado 7. ------[ 3.- Diseo En este apartado se hablar del diseo base para realizar PEB HOOKING [T.1] con xito. La implementacin no es complicada cuando se comprende por que se hace cada cosa.

Los pasos: 1.- Cargar DLL_FAKE y DLL_REAL. 2.- En la lista que usa el cargador de win32, en la que se encuentran todos los mdulos cargados en ese momento, hay que intercambiar varios campos entre DLL_FAKE y DLL_REAL. 3.- Es necesario que las IATs [R.3] de todos los mdulos cargados, excepto DLL_REAL y quizs DLL_FAKE, apunten a las funciones que exporta la DLL_FAKE. ------[ 3.1 - Pasos previos a PEB HOOKING Es necesario antes de nada cargar en la memoria del proceso, al que se quiere realizar PEB HOOKING [T.1], una DLL_FAKE. La DLL_FAKE debe tener como mnimo las mismas exportaciones y en el mismo orden que DLL_REAL. ------[ 3.2 - Intercambio de datos en LoaderData Es necesario buscar DLL_FAKE y DLL_REAL por algun campo identificativo de LDR_MODULE, una vez encontrados se intercambiarn los siguientes datos: - EntryPoint - BaseAddress - SizeOfImage (casi siempre) La bsqueda usando el campo BaseDllName obtendr los datos del LDR_MODULE perteneciente a DLL_FAKE. Algunos virus, packers y APIs usan esta forma de bsqueda para encontrar la BaseAddress o EntryPoint de un mdulo. El campo SizeOfImage es necesario cambiarlo en caso de que DLL_FAKE y DLL_REAL no tengan el mismo tamao en memoria. Flujo de bsqueda de BaseAddress de kernel32.dll en un proceso sin PEB HOOKING [T.1]: 0 +---------------------------------+ [ process ] ---------+ Process Environment Block (PEB) --------------------------------InheritedAddressSpace ReadImageFileExecOptions BeingDebugged Spare Mutant ImageBaseAddress +-> LoaderData --+ ... +---------------------------------+ 1

+--------------------------------------------------------------+ +----------------------------+ +----------------------------+ LoaderData LDR_MODULE +----------------------------+ ---------------------------- flink Length InLoadOrderModList -----+ Initialized InMemoryOrderModList SsHandle InInitOrderModList

+-> InLoadOrderModList 2 ... InMemoryOrderModList ----> BaseDllName "ntdll.dll" ---+ InInitOrderModList - Flink +----------------------------+ +----------------------------+ +------------------------------------+ +----------------------------+ LDR_MODULE (DLL_REAL) ---------------------------InLoadOrderModList 6 +---------------------+ 3 InMemoryOrderModList Es "kernel32.dll"? InLoadOrderModList 2 ... InMemoryOrderModList ----> BaseDllName "ntdll.dll" ---+ InInitOrderModList - Flink +----------------------------+ +----------------------------+ +------------------------------------+ +----------------------------+ LDR_MODULE (DLL_REAL) ---------------------------6 InLoadOrderModList +---------------------+ 3 InMemoryOrderModList flink Es "kernel32.dll"? [DLL_FAKE ntdll.dll] ------------------+ 0 ^ 1 CALL RtlInitUnicodeString v +--------------------------- [DLL_ANY kernel32.dll] 2 Flujo de una llamada a RtlHeapAlloc, cuando se ha hecho PEB HOOKING [T.1] sobre NTDLL.DLL y NO se ha cambiado la IAT [R.3] de kernel32.dll: [ proceso ] [ DLL_FAKE ntdll.dll] ------------------+ 0 ^ 1 +------------------+ 3 CALL RtlInitUnicodeString v [DLL_REAL old_nt.dll] LoadLibrary 2 (Nr_LoadLibrary) -+ DLL_REAL kernel32.dll .... ----------------------+--------------------------------+ ... 1 LoadLibrary: LoadLibrary 2 (Nr_LoadLibrary) -+ DLL_FAKE kernel32.dll .... ------------------------+--------------------------------+ 4 ... 1 Own_LoadLibrary: [DLL_FAKE] --> [DLL_REAL] ^ 2 +----------------------------+ Flujo de una llamada de un proceso, con PEB HOOKING [T.1], con tres DLL_FAKEs: 0 1 2 3 [proceso] --> [DLL_FAKE 3] --> [DLL_FAKE 2] --> [DLL_FAKE 1] --> [DLL_REAL] ^ 4 +---------------------------------------------------------------+ En los ejemplos anteriores, todas las DLL_FAKEs pasan el control a la DLL_REAL correspondiente. ------[ 3.8 - Problemas frecuentes A la hora de realizar PEB HOOKING [T.1] pueden ocurrir ciertos problemas, a continuacin se muestra una tabla con los problemas y las posibles soluciones: +-------------------------------------------------------------------------+ Problema Posible/s Solucin/es -------------------------------+----------------------------------------- Falla el PEB HOOKING [T.1] - Comprobar que se pueden intercambiar los campos necesario en el PEB [T.1]. - Comprobar si se tienen los permisos correctos para cambiar las IATs [R.3] necesarias. -------------------------------+----------------------------------------- Falla la ejecucin del - Comprobar que se recorre bien el PEB proceso [R.1]. - Comprobar si se recorren bien las IATs [R.3] de todos los mdulos del del proceso.

- Comprobar si se han restaurado los permisos en memoria modificados en el PEB HOOKING [T.1]. +-------------------------------------------------------------------------+ ------[ 4.- phook phook es capaz de realizar PEB HOOKING [T.1] (y otras cosas) de una manera sencilla. phook es un proyecto de varios mdulos: - InjectorDLL: Programa que crea un proceso suspendido de forma y le inyecta una DLL. - Console Control: DLL que se inyecta en el proceso en el que deseemos hacer PEB HOOKING [T.1]. Permite hacer PEB HOOKING [T.1] y otras tareas de forma interactiva mediante una consola de comandos por sockets. - CreateExp: Programa que genera a partir de una DLL_REAL el cdigo fuente necesario para realizar una DLL_FAKE. - ph_ker32.dll: DLL_FAKE de kernel32.dll. ph_ker32.dll monotoriza el acceso a las APIs: CreateFileA y CreateFileW [R.14].

------[ 4.1 - InjectorDLL Programa que crea un proceso suspendido y le inyecta una DLL. Para inyectar la DLL C:\console.dll en el proceso correspondiente a C:\poc.exe: - Especificar el tipo de proceso: - CONSOLE: - InjectorDLL.exe C:\console.dll -c C:\poc.exe - GUI: - InjectorDLL.exe C:\console.dll -g C:\poc.exe - No especificar el tipo de proceso - InjectorDLL.exe C:\console.dll -u C:\poc.exe InjectorDLL, con el parmetro -u, suele detectar si un proceso es GUI o Console para saber como crearlo suspendido (ver apartado 2.3). El mtodo que hemos creado consiste en crear el proceso con la API CreateProcess y el flag CREATE_SUSPENDED [R.6]. Despus se llama a WaitForInputIdle, si la espera falla se trata de un proceso Console, en caso contrario ser GUI. ------[ CODE CreateProcess ( program_name NULL NULL NULL FALSE CREATE_SUSPENDED NULL NULL pstart_inf ppro_inf )

, , , , , CREATE_NEW_CONSOLE , , , ,

// Hay que comprobar la creacin correcta del proceso... if ( WaitForInputIdle( ppro_inf->hProcess, 0 ) == WAIT_FAILED ) // "Console process" else // "GUI process" ------[ END CODE Una vez que se sabe el tipo de proceso, ya se sabemos como crearlo suspendido correctamente (ver apartado 2.3). Nota: el mtodo puede no funcionar siempre, en alguna ocasin un "Console process" lo detecta como "GUI process". El cdigo que (ver apartado ensamblador y la estructura entrypoint el LOADER_DLL_s. carga la DLL se mete en una estructura llamada LOADER_DLL_s 2.3). LOADER_DLL_s se carga con las instrucciones en los datos necesarios. Hay que escribir en el proceso creado LOADER_DLL_s y llamar a CreateRemoteThread, pasndole como inicio de la estructura, para que se ejecute el cdigo de

Una vez cargada la DLL se suspende el hilo desde el cual se est ejecutando LOADER_DLL_s y incrementa un flag para indicarlo. ------[ CODE typedef struct LOADER_DLL_s { /* - CODE ------------------------------------------------------ */ PUSH_ASM_t push_name_dll; /* PUSH "DLL_INJECT.DLL"*/ CALL_ASM_t call_load_library; /* CALL LoadLibraryA */ CALL_ASM_t INC_BYTE_MEM_t char CALL_ASM_t call_get_current_thread; inc_flag; PUSH_EAX; call_suspendthread; /* /* /* /* CALL GetCurrentThread*/ INC [FLAG] */ PUSH EAX */ CALL SuspendThread */

/* - DATA ------------------------------------------------------ */ char name_dll[MAX_PATH]; /* DLL_INJECT.DLL'\0' */ char flag; /* [FLAG] */ } LOADER_DLL_t; ------[ END CODE ------[ 4.2 - Console Control Console Control es la DLL que se inyecta en el proceso en el que se quiera hacer PEB HOOKING [T.1]. Permite hacer PEB HOOKING [T.1] y otras tareas de forma interactiva mediante una consola de comandos por sockets. El puerto que escucha lo escribe en el fichero C:\ph_listen_ports.log, con la nomenclatura PID - PORT. Ejemplo de un proceso con PID 2456, escuchando en el puerto 1234: 2456 - 1234. Actualmente tiene la siguiente lista de comandos: help - Muestra esta pantalla exit - Cierra y descarga la consola

suspend resume showmodules load [param1] unload [param1]

- Pausa la ejecucin del programa - Resume la ejecucin del programa - Muestra la lista de modulos - Carga en memoria la biblioteca especificada en [param1] - Descarga una biblioteca en memoria

especificada en [param1] pebhook [param1] [param2] - Realiza PEB HOOKING [T.1] sobre una dll [param1]: Nombre de la dll original [param2]: Ruta a la DLL_FAKE Es facil entender cada uno de los comandos que admite nuestra consola, asi que explicaremos el funcionamiento de "showmodules", "pebhook" y "suspend". El comando "showmodules" realiza una bsqueda en el PEB [R.1] de los mdulos cargados sin usar APIs. pebhook es el comando que realiza todo el proceso de PEB HOOKING (ver apartado 3). Si se quiere hacer PEB HOOKING [T.1] sobre kernel32.dll, usando como DLL_FAKE "C:\phook\bin\windows_xp_sp2\ph_ker32.dll", para el SO Windows XP SP2, solo es necesario enviar el comando: - pebhook kernel32.dll c:\phook\bin\windows_xp_sp2\ph_ker32.dll El comando suspend es capaz de suspender la ejecucin del hilo principal del proceso. El TID del hilo principal se obtiene recorriendo los THREADENTRY32 [R.13] del sistema hasta llegar al primero del proceso: ------[ CODE BOOL GetMainThreadId( DWORD * thread_id ) { HANDLE hThreadSnap; THREADENTRY32 th32; BOOL return_function; DWORD process_id; process_id = GetCurrentProcessId(); hThreadSnap = INVALID_HANDLE_VALUE; return_function = FALSE; hThreadSnap = \ CreateToolhelp32Snapshot( TH32CS_SNAPTHREAD, process_id ); if( hThreadSnap == INVALID_HANDLE_VALUE ) { ShowGetLastErrorString ( " GetMainThreadId() - CreateToolhelp32Snapshot()" ); return FALSE; } th32.dwSize = sizeof( THREADENTRY32 ); if( !Thread32First( hThreadSnap, & th32 ) ) ShowGetLastErrorString( "GetMainThreadId() - Thread32First()");

do { if ( th32.th32OwnerProcessID == process_id ) { * thread_id = th32.th32ThreadID; return_function = TRUE; } } while ( Thread32Next( hThreadSnap, & th32 ) && return_function != TRUE ); CloseHandle( hThreadSnap ); return return_function; } ------[ END CODE ------[ 4.3 - CreateExp CreateExp es un programa que genera a partir de una DLL_REAL el cdigo fuente necesario para realizar una DLL_FAKE. Actualmente crea los ficheros .c y .def, para usar con mingw. Para crear una DLL_FAKE de kernel32.dll es necesario ejecutar: - CreateExp C:\WINDOWS\SYSTEM32\KERNEL32.DLL C:\ph_ker32 Si ha funcionado bien se crearn los ficheros C:\ph_ker32.c y C:\ph_ker32.def ph_ker32.c contiene las definiciones de las exportaciones de kernel32.dll y salta automticamente a las originales. ph_ker32.def contiene los alias y los nombres de las exportaciones de kernel32.dll. Por defecto las exportaciones de DLL_FAKE saltarn a la exportacin correspondiente de DLL_REAL. ------[ 4.3.1 - Forwarder DLL CreateExp tranforma las Forwarder DLL [R.3] en exportaciones, as que se puede hacer PEB HOOKING de una funcin Forwarder. Ejemplo: kernel32.dll tiene como Forwarder HeapAlloc que va a la exportacin RtlAllocateHeap de NTDL.DLL. Cuando un mdulo importa HeapAlloc de kernel32.dll, automticamente el Loader de win32 pone la direccin de la exportacin de NTDLL.DLL y nunca pasa por kernel32.dll: CALL HeapAlloc [proceso] ------------------> [NTDLL.DLL] ^ 0 +-------------------------------+

1 Si se crea una DLL_FAKE de kernel32.dll con CreateExp, el flujo ser: CALL HeapAlloc (DLL_FAKE) [proceso] ------------------> [KERNEL32.DLL] --------> [NTDLL.DLL] ^ 0 1 +-----------------------------------------------------+ 2 De tal forma que podemos implementar un hook de HeapAlloc (kernel32.dll). ------[ 4.4 - ph_ker32.dll ph_ker32.dll fue creado para hacer PEB HOOKING [T.1] a kernel32.dll; monotoriza el acceso a las APIs "CreateFileA" y "CreateFileW" [R.14], y cuando se llama a cualquier otra API automticamente se salta la original. Para facilitar el salto a una API se ha creado la macro JMP, hay que pasarle el nombre de la DLL y el ordinal de la exportacin (para ver la macro JMP ver apartado 4.4.2). ph_ker32.c creado con CreateExp (se ha omitido la macro JMP): ------[ CODE #define FAKE_LIB "ph_ker32.dll" DLLEXPORT void _ActivateActCtx ( void ) { JMP( FAKE_LIB, 1 ); } DLLEXPORT void _AddAtomA ( void ) { JMP( FAKE_LIB, 2 ); } DLLEXPORT void _AddAtomW ( void ) { JMP( FAKE_LIB, 3 ); } DLLEXPORT void _AddConsoleAliasA ( void ) { JMP( FAKE_LIB, 4 ); } .... ------[ END CODE Hay que recordar que una vez se ha realizado PEB HOOKING [T.1], kernel32.dll tendr de nombre ph_ker32.dll, por eso se indica ph_ker32.dll en la constante simblica FAKE_LIB. ph_ker32.def creado con CreateExp: ------[ CODE

LIBRARY default EXPORTS ActivateActCtx=_ActivateActCtx AddAtomA=_AddAtomA AddAtomW=_AddAtomW ... ------[ END CODE

@ 1 @ 2 @ 3

Por motivos de claridad la implementacin de las APIs CreateFileA y CreateFileW [R.14] se ha puesto en el fichero owns.c. Cuando se llama a CreateFileA y a CreateFileW [R.14] se escribe el parmetro lpFileName en el fichero C:\CreateFile.log owns.c: ------[ CODE #define FILE_LOG C:\CreateFile.log DLLEXPORT HANDLE _stdcall _CreateFileW ( LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDistribution, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile ) { char asc_str[MAX_PATH]; if ( UnicodeToANSI( (WCHAR *) lpFileName, asc_str ) == 0 ) CreateFileLogger( asc_str ); return CreateFileW( lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDistribution, dwFlagsAndAttributes, hTemplateFile ); } DLLEXPORT HANDLE _stdcall _CreateFileA ( LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDistribution, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile )

{ char asc_str[MAX_PATH]; CreateFileLogger( lpFileName ); return CreateFileA( lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDistribution, dwFlagsAndAttributes, hTemplateFile ); } static void CreateFileLogger( const char * file_to_log ) { HANDLE file; DWORD chars; file = \ CreateFileA ( FILE_LOG GENERIC_WRITE 0 NULL OPEN_ALWAYS 0 NULL );

GENERIC_READ

, , , , , ,

if ( file != INVALID_HANDLE_VALUE ) { if ( SetFilePointer( file, 0, NULL, FILE_END ) != -1 ) { WriteFile ( file, file_to_log, strlen( file_to_log ), &chars, NULL ); WriteFile( file, "\x0D\x0A", 2, &chars, NULL ); } CloseHandle( file ); } } ------[ END CODE ------[ 4.4.1 - Los problemas en la pila Cuando se quiere pasar el control directamente a una API a la que no se conoce el prototipo de forma genrica, hay que pasarle la pila intacta a la API original. Esto se consigue en mingw con la opcin del compilador -fomit-frame-pointer [R.15] y un JMP (ASM) a la API original. Las funciones que se implementan hay que ponerlas prototipo y deben ser de tipo _stdcall. Las funciones de tipo _stdcall tienen una sintaxis diferente en el fichero .def:

- Nombre_exportacion=Alias@argumentos * 4

@ Ordinal

Ejemplo de fichero .def con las APIs de tipo _stdcall CreateFileA y CreateFileW [R.14] (las dos tienen siete argumentos): ------[ CODE LIBRARY EXPORTS ph_ker32 Ordinal Windows XP SP2 @ 83 @ 80

; Name Exp Alias N Args * 4 CreateFileW=_CreateFileW@28 CreateFileA=_CreateFileA@28 ------[ END CODE

Las funciones de tipo _stdcall no se deben compilar con la opcin -fomit-frame-pointer [R.15]. ------[ 4.4.2 - Los problemas con los registros No solo es necesario pasar la pila intacta a una exportacin, en ocasiones las exportaciones usan directamente valores de los registros directamente. Antes de pasar el control a la exportacin original es necesario dejar los registros intactos, esto se consigue metiendo entre el cdigo las instrucciones PUSHAD y POPAD: [PUSHAD] [ CDIGO NECESARIO PARA SALTAR A LA EXPORTACIN ] [POPAD] Un ejemplo de exportacin que usa directamente los registros es _chkstk de NTDLL.DLL: _chkstk en NTDLL.DLL (WINDOWS XP SP2): ------[ CODE 7C911A09 >/$ 3D 00100000 7C911A0E . 73 0E 7C911A10 . F7D8 7C911A12 . 03C4 7C911A14 . 83C0 04 7C911A17 . 8500 7C911A19 . 94 7C911A1A . 8B00 7C911A1C . 50 7C911A1D . C3 7C911A1E > 51 7C911A1F . 8D4C24 08 7C911A23 > 81E9 00100000 7C911A29 . 2D 00100000 7C911A2E . 8501 7C911A30 . 3D 00100000 7C911A35 .^73 EC 7C911A37 . 2BC8 7C911A39 . 8BC4 7C911A3B . 8501 7C911A3D . 8BE1 7C911A3F . 8B08 7C911A41 . 8B40 04 7C911A44 . 50 CMP EAX,1000 JNB SHORT ntdll.7C911A1E NEG EAX ADD EAX,ESP ADD EAX,4 TEST DWORD PTR DS:[EAX],EAX XCHG EAX,ESP MOV EAX,DWORD PTR DS:[EAX] PUSH EAX RETN PUSH ECX LEA ECX,DWORD PTR SS:[ESP+8] /SUB ECX,1000 SUB EAX,1000 TEST DWORD PTR DS:[ECX],EAX CMP EAX,1000 \JNB SHORT ntdll.7C911A23 SUB ECX,EAX MOV EAX,ESP TEST DWORD PTR DS:[ECX],EAX MOV ESP,ECX MOV ECX,DWORD PTR DS:[EAX] MOV EAX,DWORD PTR DS:[EAX+4] PUSH EAX

7C911A45 \. C3 ------[ END CODE ------[ 4.4.3 - La macro JMP

RETN

La macro JMP es necesaria ya que no siempre se tienen en la cabecera de una DLL (fichero .h) todas sus declaraciones. Con la macro JMP se obtiene la direccin de la exportacin con GetProcAddress [R.12] en tiempo de ejecucin. ------[ CODE unsigned long tmp; #define JMP( lib, func ) asm ( "pushad" ); asm ( " push edx " push %1 " call eax " pop edx " push %2 " push eax " call edx " mov %4, eax " popad : : "a" "g" "g" "d" "g" (GetModuleHandle) (lib) (func) (GetProcAddress) (tmp) , , , , \ \ \ \ \n" \n" \n" \n" \n" \n" \n" \n" \n" \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \

); asm ( "jmp %0" : : "g" (tmp) ); ------[ END CODE

El cdigo es para mingw [R.16] con la opcin del compilador -masm=intel. ------[ 4.4.4 - Versiones Hemos incluidos en phook varias versiones de ph_ker32 para los sistemas: - Windows XP SP2 v5.1.2600 - Windows Server 2003 R2 v5.2.3790 - Windows Vista v6.0.6000 Cdigo fuente en ph_ker32/SO y binarios en bin/SO. ------[ 4.5 - Usando phook Imaginemos que queremos hacer PEB HOOKING [T.1] a kernel32.dll con ph_ker32.dll, se ha elegido el programa poc.exe para el ejemplo (viene el carpeta bin\ de phook).

Pasos a seguir: 1.- Ejecutar InjectorDLL indicando un programa a ejecutar y la DLL de la consola que se inyectar en el proceso: - InjectorDLL.exe console.dll -u poc.exe El proceso se quedar en estado suspendido y habr un socket escuchando en el puerto indicado en el fichero C:\ph_listen_ports.log C:\phook\bin>InjectorDll.exe console.dll -u poc.exe ________________________________________________________________ InjectorDLL v1.0 Juan Carlos Montes [email protected] David Reguera Garcia [email protected] / [email protected] -------------------------------------------------------------http://www.fr33project.org ________________________________________________________________ Showing injection data ..... Program to inject : poc.exe Library to inject: console.dll [OK] [OK] - CONSOLE. - Create process: [INFO] PID: 0x0960 [INFO] P. HANDLE: 0x000007B8 [INFO] TID: 0x0AE0 [INFO] T. HANDLE: 0x000007B0 [INFO] - Injecting DLL... [OK] - Allocate memory in the extern process. [INFO] - Address reserved on the other process: 0x00240000 [INFO] - Space requested: 306 [OK] - Creating structure for the dll load. [OK] - Writing structure for the dll load. [OK] - Creating remote thread. [INFO] - Thread created with TID: 0x0B28 [INFO] - Attempt: 1 [INFO] - Thread has entered suspension mode. [OK] - Injection thread ended. [OK] - Memory in remote thread freed. [OK] - DLL injected. [OK] - Injection ended.

2.- Es necesario conectarse con un cliente de tipo netcat al puerto abierto, en este caso: 1234. C:\>nc 127.0.0.1 1234 ________________________________________________________________ Phook Prompt v1.0 Juan Carlos Montes [email protected] David Reguera Garcia [email protected] / [email protected] -------------------------------------------------------------http://www.fr33project.org ________________________________________________________________ ph > help _________________________________________________________________

Phook Prompt v1.0 Command list: --------------------------------------------------------------help - Shows this screen exit - Closes and unloads the console suspend - Pauses the programs execution resume - Resumes the programs execution showmodules - Shows the modules list load [param1] - Loads in memory the library especified in [param1] unload [param1] - Unloads a librery in memory especified in [param1] pebhook [param1] [param2] - Performs PEB Hook over a dll [param1]: Name of the original dll [param2]: Path to the DLL hook _________________________________________________________________ 3.- Se realiza PEB HOOKING [T.1] a kernel32.dll con la ph_ker32.dll: ph > pebhook kernel32.dll C:\phook\bin\windows_xp_sp2\ph_ker32.dll 4.- Se enva el comando resume para que empiece la ejecucin del proceso. ph > resume ph > C:\phook\bin> 5.- poc.exe crea los ficheros en C:\ - file - file2 - file3 6.- ph_ker32.dll registra las llamadas con xito a las APIs CreateFileA y CreateFileW [R.14] en el fichero C:\CreateFile.log 7.C:\>more CreateFile.log C:\file1 C:\file2 C:\file3 ------[ 4.5.1 - DLL MINIFILTER phook permite realizar DLL MINIFILTER (ver apartado 3.7) de una manera sencilla. Solo hay que realizar PEB HOOKING [T.1], con el comando pebhook, sobre el nombre de DLL_FAKE, que es el que tena la primera DLL_REAL. Suponiendo que tenemos dos DLL_FAKEs: - ph_ker32_1.dll: Monotoriza acceso a las APIs CreateFile [R.14]. - ph_ker32_2.dll: Monotoriza el acceso de las API ReadFile [R.17]. Realizar DLL MINIFILTER es tan sencillo como: C:\>nc 127.0.0.1 1234 ________________________________________________________________ Phook Prompt v1.0 Juan Carlos Montes [email protected] David Reguera Garcia [email protected] / [email protected]

-------------------------------------------------------------http://www.fr33project.org ________________________________________________________________ ph > pebhook kernel32.dll C:\phook\bin\windows_xp_sp2\ph_ker32_1.dll ph > pebhook kernel32.dll C:\phook\bin\windows_xp_sp2\ph_ker32_2.dll Flujo de una llamada del proceso a kernel32.dll: 0 1 2 [proceso] --> [ph_ker32_2.dll] --> [ph_ker32_2.dll] -> [kernel32.dll] ^ 3 +------------------------------------------------------+ ------[ 4.6 - Problemas frecuentes Adems de los problemas del apartado 3.8, existen otros: +-------------------------------------------------------------------------+ Problema Posible/s Solucin/es -------------------------------+----------------------------------------- Falla la compilacin de - Comprobar que no se repiten las DLL_FAKE funciones que van directamente a DLL_REAL y las que se implementan. - Comprobar que las funciones implementadas (que deben ser de tipo _stdcall) estn bien definidas en el fichero .def (ver apartado 4.4.1). -------------------------------+----------------------------------------- Falla la ejecucin del - Comprobar que las funciones que van proceso directamente a DLL_REAL han sido compiladas con la opcion -fomit-frame-pointer (ver apartado 4.4.1). - Comprobar que las funciones implementadas son de tipo _stdcall. - Comprobar que DLL_FAKE se ha creado a partir de la DLL_REAL y no de otra. - Comprobar si InjectorDLL ha detectado correctamente el tipo real de proceso (GUI o CONSOLE). -------------------------------+----------------------------------------- No se puede conectar a - Comprobar que el puerto 1234 est la consola abierto antes de hacer PEB HOOKING [T.1]. - Comprobar bloqueos de firewall... - Comprobar que se ha indicado la ruta completa de console.dll en InjectorDLL. -------------------------------+----------------------------------------- No funciona InjectorDLL - Comprobar que se tienen privilegios para inyectar una DLL (CreateRemoteThread..) - Comprobar bloqueo de anti-virus... -------------------------------+----------------------------------------- No funciona CreateExp - Comprobar que la ruta de DLL_REAL es un PE32 correcto y que el EXPORT DIRECTORY no est corrupto [R.3].

+-------------------------------------------------------------------------+ Pueden existir otros problemas debidos a fallos de programacin y/o de diseo. ------[ 5.- TODO Actualmente estamos intentando: - Realizar PEB HOOKING [T.1] antes de la ejecucin de: - TLS Table y DLLMain [R.3]. - Crear ficheros de debug y configuracin para la consola. - Reglas para reparacin de IATs [R.4]. - Lista personalizada de puertos de escucha. - ... - Mejorar InjectorDLL: - Deteccin automtica de "GUI process" y "Console process". ------[ 6.- Testing Se han realizado pruebas con phook en diferentes versiones de Windows y programas. Windows: - Windows XP SP2 v5.1.2600 - Windows Server 2003 R2 v5.2.3790 - Windows Vista v6.0.6000 Y tericamente debera funcionar en Windows 2000, pero no lo hemos comprobado. Programas: - Microsoft Word - Regedit - Notepad - Calc - CMD - piathook - pebtry - pe32analyzer 10.0.2627.0 5.1.2600.2180 5.1.2600.2180 5.1.2600.0 5.1.2600.2180 1.4 Beta 5 Beta 2

------[ 7.- Ventajas y posibilidades La mayor ventaja de PEB HOOKING [T.1] frente a los otros mtodos de hooking es que solo se tiene que aplicar una vez. En el momento que se ha hecho un hook a una DLL, cualquier mdulo que se cargue tendr automticamente en su IAT [R.3] las exportaciones que use de DLL_FAKE. El resto de los mtodos tienen que aplicar el hook cada vez que se cargue un mdulo. Otras de las ventajas de usar PEB HOOKING [T.1]: - Una bsqueda en el PEB (usando el campo BaseDllName) para llegar a DLL_REAL, llegar a DLL_FAKE. - PEB HOOKING es un mtodo ms estable para el SO que otros en ring0. - Algunos packers no detectan PEB HOOKING [T.1] al ser un mtodo poco documentado.

- No es necesario cambiar el comportamiento de las APIs que trabajan con mdulos. Cuando un mdulo intenta obtener el manejador de DLL_REAL, obtendr automticamente el manejador DLL_FAKE. - Posibilidad de crear DLL MINIFILTER (ver apartado 3.7). - Se puede hacer PEB HOOKING de una exportacin Forwarder[R.3] sin hacer PEB HOOKING a la Forwarder DLL. El espectro de posibilidades que permite el mtodo PEB HOOKING [T.1] y phook es bastante amplio, a continuacin planteamos algunos ejemplos: - Monotorizar/virtualizar el acceso a registro de un proceso. - POC [R.18]: 1.- Usar la herramienta CreateExp (ver apartado 4.3) sobre "advapi32.dll". 2.- En funcion de lo que se desee hacer es necesario implementar la monitorizacion/virtualizacion en las siguientes APIs: - RegCloseKey - RegCreateKeyA/RegCreateKeyW - RegCreateKeyExA/RegCreateKeyExW - RegDeleteKeyA/RegDeleteKeyW - RegLoadKeyA/RegLoadKeyW - RegOpenKeyA/RegOpenKeyW - RegOpenKeyExA/RegOpenKeyExW - RegQueryValueA/RegQueryValueW - RegQueryValueExA/RegQueryValueExW - RegReplaceKeyA/RegReplaceKeyW - RegRestoreKeyA/RegRestoreKeyW - RegSaveKeyA/RegSaveKeyW - RegSaveKeyExA/RegSaveKeyExW - RegSetValueA/RegSetValueW - RegSetValueExA/RegSetValueExW - RegUnLoadKeyA/RegUnLoadKeyW ... - Monotorizar/virtualizar conexiones. - POC [R.20]: 1.- Usar la herramienta CreateExp (ver apartado 4.3) sobre "ws2_32.dll". 2.- En funcion de lo que se desee hacer es necesario implementar la monitorizacion/virtualizacion en las siguientes APIs: - accept - bind - closesocket - connect - listen - recv - recvfrom - send - sendto - socket - WSAAccept - WSAConnect - WSARecv - WSARecvFrom

- WSASend - WSASendTo - WSASocketA/W ... - Syscall Proxy de ficheros: - POC [R.19]: 1.- Usar la herramienta CreateExp (ver apartado 4.3) sobre "kernel32.dll". 2.- En funcion de lo que se desee hacer es necesario implementar la redireccion de las siguientes APIs: - CreateFileA/CreateFileW - CreateFileExA/CreateFileExW - ReadFile - ReadFileEx - WriteFile - WriteFileEx ... - ... and free your mind ;-) ------[ 8.- Conclusin Si es necesario hacer un hook a una API/exportacin, se puede usar cualquier mtodo actual. Pero si se necesita monotorizar o virtualizar el acceso a varias APIs/exportaciones con phook se hace mucho ms sencilla la implementacin, puesto que solo es necesario programar la funcionalidad de las APIs/exportaciones. Adems, es un mtodo orientado a la ingenieria inversa de sistemas de proteccin de software y malware, ya que dificulta mtodos alternativos de bsqueda de exportaciones y eliminacin de hooks. ------[ 9.- Agradecimientos Recomendaciones para el paper: - phrack staff - Miguel Tarasc Acua (aka Tarako) Traduccion a ingls de las cadenas de phook: - Javier Nez (aka Southern) - LogicMan - XENMAX Traducciones del paper a ingls: - BETA : Ana Hijosa - BETA 2: delcoyote - ACTUAL: LogicMan Virii scene: - GriYo, zert, Slow, pluf, xezaw, sha0 ... Reversing scene: - pOpE, JKD, ilo, Ripe, int27h, at4r, uri, numitor, vikt0ry, kania, remains, S-P-A-R-K ... Other scene: - sync, ryden, xenmax, ozone/membrive, \^snake^\, topo, fixgrain, ia64,

overdrive, success, scorpionn, oyzzo, simkin, !dSR ... ALL vx.7a69ezine.org and 7a69ezine.org people ;-) Y especialmente gracias a YJesus - http://www.security-projects.com ------[ 10.- Trabajos relacionados [T.1] .- No conocemos ningn trabajo parecido a phook, pero existe un artculo que habla sobre PEB HOOKING escrito por Deroko: "PEB DLL Hooking Novel method to Hook DLLs". El artculo fue publicado en la ARTeam-Ezine nmero 2. - http://www.arteam.accessroot.com/ezine/file_info/download1.php? file=ARTeam.eZine.Number2.rar ------[ 11.- Referencias [R.1] .- Estructuras del PEB: - http://undocumented.ntinternals.net/ [R.2] .- Gaining important datas from PEB under NT boxes: - http://vx.netlux.org/29a/29a-6/29a-6.224 [R.3] .- Visual Studio, Microsoft Portable Executable and Common Object File Format Specification. Revision 8.0 - May 16, 2006: - http://www.microsoft.com/whdc/system/platform/firmware/ PECOFF.mspx [R.4] .- What Goes On Inside Windows 2000: Solving the Mysteries of the Loader: - http://msdn.microsoft.com/msdnmag/issues/02/03/Loader/ [R.5] .- winnt.h (DEV-CPP): - http://www.bloodshed.net/devcpp.html [R.6] - CreateProcess: - http://msdn2.microsoft.com/en-us/library/ms682425(vs.80).aspx [R.7] - Three Ways to Inject Your Code into Another Process: - http://www.codeproject.com/threads/winspy.asp [R.8] - Import address table hooks: - http://www.securityfocus.com/infocus/1850 [R.9] - Code overwriting: - http://www.codeproject.com/system/hooksys.asp [R.10] - Hooks: - http://msdn2.microsoft.com/en-us/library/ms632589.aspx [R.11] - System Call Optimization with the SYSENTER Instruction: - http://blog.donews.com/zwell/archive/2005/03/13/300440.aspx [R.12] - Run-Time Dynamic Linking - http://msdn2.microsoft.com/en-us/library/ms685090.aspx [R.13] - Thread Walking

- http://msdn2.microsoft.com/en-us/library/ms686780.aspx [R.14] - CreateFile - http://msdn2.microsoft.com/en-us/library/aa363858.aspx [R.15] - MAN GCC (-fomit-frame-pointer): - http://www.astro.uni-bonn.de/~webstw/cm/gnu/gcc/gcc.1.html [R.16] - MINGW: - http://www.mingw.org/ [R.17] - ReadFile: - http://msdn2.microsoft.com/en-us/library/aa365467.aspx [R.18] - Registry Functions: - http://msdn2.microsoft.com/en-us/library/ms724875.aspx [R.19] - File Management Functions: - http://msdn2.microsoft.com/en-us/library/aa364232.aspx [R.20] - Winsock Functions: - http://msdn2.microsoft.com/en-us/library/ms741394.aspx [R.20] - MSDN LIBRARY: - http://msdn2.microsoft.com/en-us/library/ [R.21] - Iczelion's Win32 Assembly Homepage: - http://win32assembly.online.fr/ ------[ 12.- Cdigo fuente Message-ID: MIME-Version: 1.0 Content-Description: "UU encode of phookt~1.gz by Wincode 2.7.3" Content-Type: application/X-gzip; name="phookt~1.gz" Content-Transfer-Encoding: X-uuencode Content-Disposition: attachment; filename="phookt~1.gz" begin 644 phookt~1.gz M'XL("-%*$TWGG5_UEH#='+2L[.G]-#^K8/1 M:.S9LZ=1O(O!S^%='_'WZ^D7%!(4&!+24XP'^X>$&+5@[3_#OWN0^W]B1M:_ M\1CX;^S_8+\0/]K_/0,"_[/__S\?'.`? M$!1BW_]!`7[^1C$2$!ADU/RT_PS_[F'H(XLU9_'N(E[5U9JV5EOKFRT*,! M;53:,>+5Y;ZZ:-^)%@NY%#/XFU6F]C*H/7W;Y(B7JWB%_M5\S9G9*?HVFJNO M0_1]=7U]+=;DB=24B]A;BP5JB_?8>^L,KGJ=Q9J[PU!+TU:*&A?Q/LCIOCKM M/\._9$@JO#AJ9$)^A5O1'+?\:B?W!>^(L'!V>Y>BL1Y%0UT+Q[1W+71K7W:Q MD4@/B#*J>6&/?VG!3?ZG3_GMCZ544WU2S,UU1>T24R5A;'M/WHLM[DK5%.G5U*OK'WG11T[J(^I(Q18K,MVV M%^@?#!0?V#=E77W7E0>(92SVW(^FQ65OK. MKB@R>5+PO@Q07D'!C;O5U86F2C$QC?V(L>M%(DBZ7A3M&=[7T]J$ML5*M5$_ M]Z35JLS/\]1L;@=-Y[/Z#U&>M&I;2MJ(%HS+#46VP@Y_PY;JSX"5%AWQM) M8M8_BME8)A8EN0D6>\MM$R`_[K0;M97UAG++U8BL#[BJ^K8GU=3GG+XMA` MEV)Q#&CESQ>9O*C5>,]"#[$HB6(-+H5-YG6)3E3B3 M]Q2+QC27\G?TI9)7"%>'A;KH95\H=&%+U4*Y>5!O=;NFN_36\T=O55?;ST@W MO8NXTM()5\%\G[GWYLXBOZ=GOB[[9'4L7'??$ET[W%3A_O1&K%Q%X;'=YPU. MQ^S=EJU2935;H+(H-M`U/+:1Q_3@^S\=RZ:HV3AB"H.KQ9B"[I-HZ]@7@[:G?K.F M&MB%=?0N+#B'C4+_5MN:E=T43Y^]+XIM;JUWL&"EFKV'DWQWJQ8#&JV9P9;UW_0GE&VMUU< MAZDA\G?:OR.+5#>JUC,!JW4K`>?=&4+.2F-VR?=CDF]MM(Q M?%A\"[3XGD$^]][;*U(+A_V1P.Z8;6UOOIU2L53G*B)#71 MOK^4M/)I^+9ZK-9SOJ1_P^7_U4UP4#5V)6Y#LN_Z"^6XXB: MM"%;C@'BPHS-+2/8BSP8`-D`%=ZE$,%A;P#!/@,#V\2#?EB"0."+_L!]-) M@O5$G%OPNG+N2&OQYO!RK+8.-X`8T!U8\QDMB:3@%//#Z2O;V>+Y6%WK)',/3&R_K9RW,KJ!GS1WL.#QJ56PWKBWZ_L3`()0;?8E27JZNDW:X/D)+3"Z3;UR&_K:=/T@IYAG1[+F6^EM0B0:K!S0[K%6[Q@(1)#4C6 MFELTVV-`HQTL2:VKGFU,A&"PNX7%"+%?UW^V=.&Z09J]9,6D8RM0A0ZM0`]> M:`4:`$ZGE:SX-R0O31BBI&4\2ACV7+B0T(%)&0/O16@GNKDT.!V9^TD5BYZ' MUP!ZZU-O\JX.VAI$X,T%W1?7#V^V:R0.,22B:D@1Q'#K(_1,:"7%?%SQ"N"< M&S'MAQ=C]BG?7W;NS0*3Y#C6[[email protected]&:)A8!ZHD-A'4I;HA2A-ZN44CFT>XX[TR4*#FN@"_ABCAN;^-*.!!7QF&X"AZ&J^)5N!I^@JOCG'V,:^"6N":>@VOA M\[@V]N]K7`?".W!U;#,( MGZ&?*=XJ,R4'&_]*WQ3?P]'8]UCQ"^.7]'W%\4;^]-W$L\0;\4V5>88%[7SXJGB M]7@YOH=7X-QSN1]Q.%Z%O\6K\0F\!B?\SG@MKHK7X>%X/3Z`-^"D\S@?N.VKA6*!'$CMHM&57^AZS^8*M?;N*=7%F,O`EL2`'0%Q9 M($M;`1!7*J,*\K[KIFKFFCM1KG+*/T;YX#,8H=,:^*';%E8N([WG*]=3D6*A9VP'R186G+['[)LK); MT[7J8Q7.T$*ZL/_%),HF8O?K](.OG1#A0Z//-I.L%MVY:X(7L^-06-#W

MZPT?-5,5UA=!?[=HEA9!+]G;MBT/>O:T]TC?YIKU.H0`:5[>MYNW*Y8\=U.Q5:#6@G5^R::V?_!YL+&O;OEVN)EX1[60 MJJ\?'O+,8LS0$&T5ZA53]V\+%0]*C2$=RORKN*E`JD=^"[S@9KTOKN:C,N>: M2I@D>`5@)4/9U76S^Q]\-VR,RI7KZ>S+8O5B#>.P#J?K$R\61YD&NOE-YI:$ M'^G1YONP]6+E>OID/7Y^O%\O)_:@(;TDY`W#UCIKO](^>!CP_>MTR848-F!B MW)73C=.9*X1S3T:V./9:M#6V&N*["@!.3I1QU96+6XAS?O3H%P?O.KV1FYX/ M6&R#SH>['YV'V4^784$^1#;%_76D+.:G(C"Q(6,$+6=L*B.7X&N27-8!'^RV M^J'=8:U*NT?Q=7&\)L[INU7*+`1:9MPFR#DFV_';MQW?A]NJ*KZW6NP6TZ6# MYS(U#C816&Y7BP*3L0U5[."!M2T,S;@&X9#-#BL!(WH@A"S-F5KG0H4*/HSH M:OAF[=*.ZAQML30[MJ-$OTDLYZ>>M[OLT:K+KV>B;Z?0MUEQ&SY7I"TPX#S( MJX0A2?,EBF*V02SE3[".ODW=\4O)!@X3LHBM=A829K`,1L>M7HQ7]0OU%CZ>T:62DWU?[@^%F:S&([@`>`82MF:RL;QNSQ!H2K, MM02LXFJ_0OF*PP).]!J3F^E5B93#'ASZ599M50%TJ\!T-.KO&S+`!`[`P4?\ODBF97WB&7#>C[,'.,^R0A3CE51%C`I#P]*=2.*L#X.5+(+83;-JKP>A3 M:^2&.A=!76G%X^K_4>%>3+QQ"RI[$%&__S5)G>/;_']]DS'LVZOE-C>.0CG2K'FY^0)%):,\S8^;8$`^/&;BB#S8+Y\V MCS;7ZXV^'-?'_=O#4?67;*LF-A3W@13(B&W\[=OEH!6&29QCQ5^19B%S-B;? MW,E(0-L/N9[HWYS]"M:E!,U.;!4>UNSE4O\3T"_;TCX$*@O#]$MZT`4M_LXX-W70#M,2VK38I@F%S3.EFH6[G3$[_NU=).6\[NU=X(FZ:Y1 M)$:M1`EU?P>@WN@(BJK*:E7I\$-.1S\LD``3,\Y_G?I+07U9I!'*0E-T`^:U MG\U@DN^G7;V[GB[\QV:)"P&>)?R-DL%;6F>%&,54'RD1"@=J0M6NUAV'NF]N MY4HAR6X6Z%[Y/>W3E3NQ"C!3^M+I;3]Q`-_S*%[WLAR#3I^@:'

M8B(1RC3(]&X$/V1>S:_\WD-(S$5B_;N>:1%I^K.:KG\12?IK?2D&GY\Y_KZ: MSM:RC69^=18SB1O*_JEA\L;\D\]BG0!;\)5!,VQ97YHMI=B"WX$M^"GYJO5? MB;Z(B>.8!6W][X0`@*6J`OWAK@)PE-5G.-(J(KR^/74`Q407L M3,9);DMK[6QH3C4D7!T2=L!6,YFB0R*`M49 MRJ)E'?*!J2!8"?,OES+?0,,Q9GB3I//.3,RW_[C8[[9B^_?N-=CP(X10?JSR M'>3S/+1JJ.]Y_H1BWAX?SM3M*.F);_7DQ/>GSA,*KY+F3Y[C1$",QQ.T])NS MMF2Q-43J5:-2-2JA4M:V(>+%RV$+#W6RA,=W9>92AU7]P M1;__$*>]_@-V!Z';WS9,;=>HU-DKF=/S1Y+5:+^DJ2GW-K/+!)W2U9]H&/Q, M+]IO3505I:HHH*)>A_G71:V#VR06$A7X'>D'D&`#B7C%PF1QU,ZF!?:7_1G[ M?NR24[IV'C1Q:L+^2H-];^'U3M?94%\39L1.*GMGHC++. M7[YN=L]D@GHFMO#\J&ZEVRUWE#Z2@Q\6T]M,#$Z-`2:6^D6T_KNMO&E6S[I]P?58T_+'D>1.Y[YX*;:2^,:Q/;;)]E+]4BZ,GJZ0B//D8/CET^UUO.1J%7]BKBUDDG2# M"1Y`M$,LB>OGY_4/)*:/P8?B[Y")@8K+O$P'4"PRBW:`]%_B,Z!_K._;W'!A MY?8/P=W$ES&8D:2\,FEW;OW+X\MV\Z!ZYNWCW%^N'W0X%'@_Q_7Z_F[](C/J M@"'&0"V(L(PG8[*>[O'N111M7% MQ1'$_?7CP^.G3T`ZG:*\OU:?Y?(''O]4_E[7^'U?Q)U2O_UN\AKZ!%)XMTK MDMF[=R2W=]_(,][](N4D;^S=/]+">V"DH_\9W)GG21_NM?Y)J\Y'1[Z?WW-U_QK#NY@__UCKSE9U)$,UWME MLZ\39[?W+Q.W#L?^\[_++)XK/B!.G"#X!?%T\V(Z,;1+I&S?6S)]X^XN7XXT=RMCF MD5E^;'/IMQ"WC#?V/S']I)^;W&?>&.?NF%C[;RCB1_[JO3[BP?$ M&UN=L8,CK_NQ@Z7_FGA(O+&M&/MF9+X?^Z;TAXJ'Q1L[G+$C([O]V)'2'R5^ M*][8V8P=$[GJQXZ1_ECQN'AC-S)V8B1#INA81O/W:)]#\7+XTW]E7&KHAD MRQP=:P[]+\0KXXV=P=C5DNEOT&\,=[8TXS= M')GBQVZ6_A;QUGAC4]RRL3;'M%X8WLP]E@DKQ][3/K?BH_'&_LV8T]&ZOJQ)Z5_2OQ] MO+'+&7LF\JH?>T;Z9\7GXHT]Q-CSD=E^['GI7Q#_'&_L&BFSQ8R])_U?Q MY?B?7\;^$;GHQ_XA_2OBJ_'&/GK;C?TSDO+1Z%ASZ-\0WXPWMC1C[T2*^+%W MI/^7^.]X8QLR]G[D93_VOO3_$?\;__-K8\T)WHP;:P[]!.*$"?[/L3/=6#L+ M6.C')I9^$G'2>&.7_B_V[CHZJGQ;^WU2[A;PK0S[*M!5A0TG6R/P#ML:L*\)74O8NF3K!AK2J59I;5\/NKZP7@*[UJE=;VOT'W M$38'V?Z!X6S[PWX`]._"EB([.+`1V\&P'P(]5-@69$Z$_2[H MW?+YBNR^P"P95:NTMM\/?4#8,60/!U9@>QCV1Z"/RNS:I76]@$ZK0-U_]/^1=:@BV1K@+T1VB3L![)671.V5MC; MH.W"6K_YK4LWF*T+]FYHC[!9R`;I5K`[email protected]"QI!-I3O+-A7L4T.G$3:6 M;'K=1[;I89\!.J.P?QJLOET M;=GF@WU^Z`+"'B4;HAO+-@3VH=!APCXG&ZG;Q#82]E'0TZGK!+R#;4[6';$/:-H!L+NX]L M,]T#MLU@WQRZA;`WR+;66;*I5FEMWP8Z5MA_R+;7%6#;'O9QT!V$=?[GMYUT M==AV@GT"=**P. M)^\;9"?JFK&="/M)T).%_4IVFFXHVVFPGPX]0UC7#[^=K5O%=C;LYT#/%38W MV?FZ\VSGPWX!]$)AJY!=HOO,=@GLET(O$[8UV96Z=#E4J[2V7P6]6MB!9-?I M2K%=!_OUT!N$G4UVLZX]V\VPWP*]5=@M9'?HQK/=`?N=T+MTNQ> MW7:V>V&_#WJ_L(_)'M+=8WL(]H>ACPAK_.FW?^JL.56KM+8_#GU"V#1D3^M" MV9Z&_1GHL\(&D[V@:\SV`NPO0E\2M@S9J[JA;*_"_AKT=6&;D;VI6\OV)NQO M0=\6M@_9>[JK;._!_C[T`V%GD7VD^\GV$>P?0S\1=A?9Y[IS;0\$(VQ2P3PF=2MC-9-,:7K%-"_MTT.F%O48VDR%%J&J5 MUO:9H;,(^YUL=D-QMMEAGP,ZI["9S7Z;Q]">;1[8YX7.)VP)LL&&26R#85\0 M.D385F3##;O8AL,^`CI2V*%D"QD>LBT$^\+0,+^PYLHL,)=@N M@OUBZ"7"OB>[W!#'=CGL5T"O%-9N\]LUALELU\!^+?0Z8;.0W6C8S78C[#=! M;Q8VANPVP]]LM\%^._0.8>N0W6UP1JE6:6V_!WJOL!W)'C!$LCT`^X/0A^3/ M([)'#V&ME7AN5L7\'^-?0;8=N1?6\XS_8][#]` M?Q2V']E_#%^2K-+P^G_H+\).(OO=D*60:I6&U_]#_Q!V)=E`8^4DJ[2VUT'K MC?_3'B1K,G9G:X*]&=HB[%6R=N,?;.VP=T`[A?V'K,=XC*T']EYHG["I''Z; MW/B&;7+8IX!.*6Q^LFF,J0JK5FEMGQ8ZG;#5R68TEF2;$?:9H#,+&TLVF[$# MVVRPSPZ=0]BA9',;I[#-#?L\T'F%74:V@'$/VP*P#X8N*.PVLF'&1VS#8!\. M'2'L:;+11E>,:I76]H6@"PO[@&Q18Q3;HK`O!EUVQ:P;PG=2MBE9&.-O[.MA7U;Z';"[B?;P;B";0?8=X2.%_8)V43C!;:)L.\,W478'V2[&[^R[0[['M`] MA0UR^>UOQJQ%5:NTMN\#W5?88+(#C%78#H#][]`#A:U$=HBQ!]LAL!\*/4S8 M%F1'&N>Q'0G[4="CA?V-[#CCGVS'P7X\]`1A)Y.=;'S+=C+LIT!/%78UV1G& MU,54J[2VGPD]2]A39.JVP1S/0'[D]"GA/U$]JSQ%MNSL#\'?5Y8M\=O+QF-)52KM+:_#'U%V+QD MKQL+L+T.^[^@;PA;E>QM8WVVMV%_!_JNL(ED'Q@'LGT`^X?0?\N?*62?&%>R M?0+[I]#/A%U(]J7Q(MN7L'\%_5K8O63?&;^Q?0?[]]`?A+U']K,Q6TG5*@VO M_X?^5UBKUV^_&:NR_0;[[]#_"1M*-L#4,\DJK>T#H74F\J:P=\G. M,75B.P?VB_A*U( M]I9I,-M;L+\-?4?8%F3OFU:SO0_[!]`/A>U%]K'I,MO'L'\"_538Z61?F/Y+

MLDK#Z_^A7PF[C>Q;4XZ*JE4:7O\/_5[8JV0_F:JS_03[S]#_"/L/V:^FWFR_ MPOX;]'=A4Z7TVY^FA6Q_PC[`K'6@6;R/@*S!?)*M`?9&:).PU>3365.8)L*]JFATPB[ MEVQZ\PRVZ6&?`3JCL#?)9C$?8)L%]EFALPG[#]F]C'07PSV?T(?E_H1M"MBGA$XE;$VR::VOV*:%?3KH],(FDLUD3=%8 MM4IK^\S0682=0#:[M3C;[+#/`9U3V&5D\UC;L\T#^[S0^83]DVRP=1+;8-@7 MA`X1]BG9W&=A3L1T./$?8&V?'6N6S'PWX"]$3Y,X7L M%.M1ME-@/Q5ZFK"^'/3^7^MKMC-A/PMZMK"YR/YA3=E]A^@/PI;ANP_UB])5FEX_3_T%V$3R'ZW9FFE6J7A]?_0/^3WB&R@K7*2 M55K;ZZ#U-O'/G\F:;-W9FF!OAK8(>Y"LW?8'6SOL'=!.8?\BZ[$=8^N!O1?: M)^P[LLEM;]@FAWT*Z)3"FG+[;1I;JM:J55K;IX5.)VQZLAEM)=EFA'TFZ,S" M1I'-9NO`-AOLLT/G$+8&V=RV*6QSPSX/=%YAX\@6L.UA6P#VP=`%A>U'-LSV MB&T8[,.A(X2=1#;:YFJC6J6U?2'HPL(N)5O4%L6V*.R+01>7]TFRI6PMV):" M?6GH,L+>)EO>-HIM>=A7@*XH[`>R56R;V%:!?57H:L*:\_AM3=M-MC5A7PNZ MMK!9R=:S&6)5J[2VKP_=0-B29!O;\K-M#/LFT$V%;4"VA:T>VQ:P;PG=2MAX MLK&VW]G&PKXM=#MA!Y/M8%O!M@/L.T+'"SN#;*+M`MM$V'>&[B+L6K+=;5_9 M=H=]#^B>\CY)]C=;UK:J55K;]X'N*^Q5L@-L5=@.@/WOT`.%?4-VB*T'VR&P M'PH]3-XG\]+[?VWSV(Z$_2CHTP3V1Z&/R>=8LB=LF]F>@/U)Z%/"1I`]:[O%]BSLST&?%[82V4LV8YQJE=;V MEZ&O"-N,['5;`;;78?\7]`UANY"];:O/]C;L[T#?%78$V0>V@6P?P/XA]-_R M_DSVB6TEVR>P?PK]3-@-9%_:+K)]"?M7T*^%O43VG>T;VW>P?P_]05A=?GK_ MKRU;!]4J#:__A_Y7V(QDO]FJLOT&^^_0_PE;EFR`O6>255K;!T+K[.)W0K)& M^WRV1MB;H,W"CB!KLQ]G:X.]'=HA[!*R;OL[MF[8>Z"]PAXAF\R>IJ-JE=;V MR:%3"/N0;&I[:;:I89\&.JVP@07\-H,]GFT&V&>$SB1L5K)9[=/89H5]-NCL MPI8CF\N^CVTNV.>&SB-L.[+Y[4_8YH=]`>A@8?N3#;5[XE6KM+8/@PX7=@;9 M*'LAME&PCX8N).PFLD7LK=@6@7U1Z&+"'B=;TCZ&;4G8EX(N+>Q]LN7L6]B6 M@WUYZ`K"?B5;V7Z;;6785X&N*JPWV&]KV$V=5*NTMJ\)74O8W&3KVH/9UH5] M/>CZPI8FV\C>@&TCV#>&;B)L,[+-[8/8-H=]"^B6PO8AV\:^BFT;V,="MQ5V M,MDX^R6VFNU.V.^"WBUL7K+[[&/9[H/]?N@#PI8@>]B^E>UAV!^!/BIL#;+'[7?8 M'H?]">B3PK8@>\9N[J):I;7]6>ASPG8A>]%>D.U%V%^"OBSL!++7[`W97H/] M=>B_A%U*]I9],-M;L+\-?4?8O63OVU>SO0_[!]`/A;U"]K'],MO'L'\"_538 M%V1?V/]+LDK#Z_^A7PG[D^Q;>XZNJE4:7O\/_5X^/X?2^W_MU=E^@OUGZ'_D MSVZR7^V]V7Z%_3?H[\(6)_O3OI#M3]@'.+0.=(C[)%F#XR1;`^R-T"9ANY.U M.CZPM!FT7=@19ER-=-]4JK>W=T!YAYY(-&3B/L4;+I'3/8IH=]!NB,PMX@F\5Q@&T6V&>%SB;L*[(Y'0W>R(9;L9]EN@MPI[GNP.QWBV.V"_$WJ7L`_( M[G5L9[L7]ON@]PO[G>PAQSVVAV!_&/J(L"DBZ?V_#NMOJE5:VQ^'/B%L`;*G M':%L3\/^#/198!HS/8"["]"7Q*V$=FKCJ%LK\+^&O1U81/(WG2L97L3 M]K>@;PL[A.P]QU6V]V!_'_J!L(O)/G+\9/L(]H^AGPB[F^QS1ZX^JE4:7O\/ M_5+82V3?.&JR?0/[M]#OA'U"]J.C#]N/L/\$_5E8?12]_]>QF.T7V'^%_B9L M1K(_'*?9_H#]3^@`I_COWR"K=WY*LDIK>P.T4=CZ9"W.#'U5J[2VMT+;A.U* MUNDLS]8)>Q>T6]AQ9'W.SFQ]L`^"3B;L$K(IG;/8IH1]*NC4PAXGF\YYB&TZ MV*>'SB#L;;*9G2_89H9]%NBLPGXFF\.9K)]JE=;V.:%S"9L\VF_S.HNRS0O[ M?-#YAMOVJ5UO9EHQ=LG>=@8-5 MJ[2VOP=]7]AO9/]VYF'[-^P?03\6-F41>O^OLS;;9[!_#OU"/F^0?>WLQ_8U M[-]`OQ6V&=D/SJ5L/\#^(_0G88>1_==YENV_L/\"_578963_T, M^R[0786-)-O#=8YM#]CWA.XE;%6R?5S_LNT#^[[0_83M0O9W5^81JE5:VP^$

M'B3L-+)#7978#H7],.CAPJXB.\K5C>THV(^&'B/L?K+C77/9CH?]!.B)PEXF M.\5UE.T4V$^%GB;L:[(S7:_9SH3]+.C9PEI*T/M_72E'JE9I;3\/>KZP![* M259I;:^#UKO%_SX[69.[.UL3[,W0%F&'DK6[_V!KA[T#VBGL7+(>]S&V'MA[ MH7W"[B6;W/V&;7+8IX!.*>P=LFGAKPA;D.QU=P&VUV'_%_0-8VNS_8V[.]`WQ6V.=D'[H%L'\#^ M(?3?PHXD^\2]DNT3V#^%?B:?-\B^=%]D^Q+VKZ!?"WN*[#OW-[;O8/\>^H.P M#\E^=F>;HEJEX?7_T/\*&UB!WO_KKLKV&^R_0_\G;!:R`9Z>259I;1\(K?.( M[R]9HVP;0S>1WU^RS3V#V#:'?0OHEL+V(]O&LXIM&]C' M0KEJSW0G[7="[A9U%=I]G+-M]L-\/?4#8360/>[:R/0S[(]!'A3U% M]KCG#MOCL#\!?5+89V3/>,RS5:NTMC\+?4Y81JRO0;[Z]!_"1M.]I9G,-M;L+\-?4?8ZF3O>U:SO0_[!]`/A8TG^]ASF>UC MV#^!?BKL4+(O//\E6:7A]?_0KX2=0O:M)\P^RG0_[!=`+A8TFN\3[G.T2V"^%7B9L+;(KO4$+ M5:NTME\%O5K8>++KO$78KH/]>N@-PHXBN]D;RW8S[+=`;Q5V!=D=WO%L=\!^ M)_0N88^0W>O=SG8O[/=![Q?V'ME#WGML#\'^,/0183^3_=-K7:1:I;7]@3 MPKIJT?M_O:%L3\/^#/198;.2O>!MS/8"["]"7Q*V,-FKWJ%LK\+^&O1U8:N3 MO>E=R_8F[&]!WY:_7Y&]Y[V:9)6&U_]#/Q!V$-E'WI]L'\'^,?0386>0?>[MM5BU2L/K_Z%?"KN>[!MO3;9O8/\6^IVPQ\A^]/9A^Q'VGZ`_"_N2[!?O8K9? M8/\5^INP^MKT_E_O:;8_8/\3.L`GWF]%5N_[E&25UO8&:*.PQP_L,T,^RS0685]1C:'+]E2U2JM[7-"YQ+V*]F\ MOJ)L\\(^'W1^8;/4\=N"OK9L"\(^!#I4V(ID(WP3V$;`/A(Z2MC.9`O[=K`M M#/L8Z"+"CB!;W'>?;7'8EX`N*>QBLF5\MF6J55K;EX4N)^PALA5]86PKPKX2

M=&5A[Y.MYFO"MAKLJT/7$/8_LK5]P]C6AGT=Z+K"IJGKMPU\Z]@V@'U#Z$;" M%B?;U'>-;5/8-X-N+FPLV5:^@.6J55K;MX9N(^P8LNU\N=FV@WU[Z#AA5Y"M]]5B&P_[3M`)PNXGV\77EVT7V'>%[B;L1;(]?4O8]H1]+^C>PCXAV]=WAFU? MV/>#[B]L0#UZ_Z_O,]N!L!\$/5C8[&2'^3*N4*W2VGXX]`AA*Y$=[:O`=C3L MQT"/%3:![`1?%[838#\1>I*PD\E.]*FRR^O3^7U\QMBM@OQ)ZE;"A M9-?ZVK%="_MUT.N%K4YVDV\BVTVPWPR]1=AXLMM].]ENA_T.Z)W"#B&[Q_>` M[1[8[X7>)^QLL@=]]E6J55K;'X(^+.PJLL=\X6R/P?Y/Z./"[B9[RM>4[2G8 MGX8^(W]G('O>-YSM>=A?@+XH[&VR5WSKV5Z!_57H:\*^)GO#=YWM#=C?A+XE M[`^R=WV!JU6KM+:_!WU?6%O^O+T^251I>_P_]6-B,9)_Y:K-]!OOGT"^$ M+4CVM:\?V]>P?P/]5MA29#_XEK+]`/N/T)^$K4/V7]]9MO_"_@OT5_DSE.Q_ MOG^2K-+P^G_HG\+V(JL+RK1&M4IK>SVT(4C\^WVRYJ"*;,VPMT!;A9U#UA'4 ME:T#]DYHE[#KR'J#YK#UPMX''23L0;(I@HZP30'[E-"IA+U(-FW0*[9I89\. M.KVP?Y/-%)1BK6J5UO:9H;,(^YEL]J#B;+/#/@=T3F$M#?TV3U![MGE@GQO[_OY3_4,2VG4++MFF4UQ"7+?N75NV2>P:7+9;ZZYQ MW1.[QB4&=VZ?F-A1^7OSCK%=PT*#`]JU;AW:O'5BI\YQ\;%M"@3$)70OW#U7 MP7PAN8MVI0\Q^4-#PJ/"H\,BPZ-C.*-B`EJW;]F5IJ'*E#[$%(P)"54NB4], M:)#4.7+F\?_41F42DR,_W6H M?AWS*W\D/8QC>^8OW;ES#;%THWF;X1]*?2ETF[5+FE_@]T6J5ZM?*_3L-^G:I?V3#E^LIH1+FE M_@_J+24)ET:IERJF=+WJ%=73Z%^GZA%T'%J0C^O3IT:'_AL:25\>.`SU+^GAE('7A>%) M%P9H9Q%\5JU^C=IUZ&KHH4:GQ/DTBD_A,!JFI?EJZ1-1'G9T.^AAUE&]/3RB M1QJ-B-(UTG$8'^-IN'9*GRX=TJWW/]SHCZ'/-NG*HY(N"N"C:#ZJ1I\J'1;B MPRI\&%Z0#[6S$!@J=\A?AZ%T&$Y?;^5C^*_/DSY-AA'JAB"?1O)I'>T>[[_1 MQ)O#873281UZ?J8S_ZVF?4`-94EG$07I+(*>=]7+-!&AW%+_!_H:,0E3#_U3 M_RVCPW!M":CSH"NB9R6X"OI$Z`)Z:H)+"JG4_]Q7 MC8ZB_9\-_3GTBTK9DNHQ?3IT\_Z/XU#^5:"U77E0E4 M$;VF0(DX'Y/[@^PI9179%WTUV=/YAJ9+S@%[U?0(^``FTW1./]D>BI'HB4PS M.-9$)/&I,SRO&5D]66J&S$V^&8^:[D$``U+3,4,E=H8"GX=Q#0@KW::#O_3G M,TN,(.4A7"AR#+)OQ@78)*39J96*C)2F9Z`'31:K?$!T"+RZNB..7]6(+HA# M2T6'8:;7U-!@)46,X1(5+Q8)14P@`#_3Y:02-S0YR(`.T0JPH2IS0T^$-#GT M*R&X7$4-!*RIH6`[W6Y_.IU?=*:?[:B.)4@ZK#H?GW^\HE`Y,T1JPMZ+>XMR MX;5,[_(CIB'XAI#A&=.+00F8$J85)6R90JC!BQW]D5&3^=\W%R/:S7;2MHD? MS1OTWW:[`95*(VP,!,T:D_YY3?9!SN"?8-.447-#YIK&]2_[DT&76CZF/OR( M=F81VODQW^2[8CG)%RLH'G-SF?YU5Y0Y,XBL./VG?'FH>7&H>)WUNJ)GL7T< M/U8!*L961>/TK_(3RT_10.#FG6Y__JG?Z?4GMA49M2+L+//9\T/>0IPG_=,V M4W6+BAB$').H&MU>_W+05]KF_S=M$716H^4]4A$61>368R'$,'@^?3[=-:_ MF'>N>H-9K:KG_P\9(UBULA$O)J:,!5!#FRKYWS2 M_S*8#D:7\\'E^6ART9G1WZP\IPQ:>7F1T&Z_,']"/GHY,+VP73MVF#;)C$YS2\AA]$&]QO@$)&8(%J-/8!+!:,.. M1P.R_F3*IDV-:5^U4O6PRT-=LF8L:6)6454E([=?X'%HRS"H,)';W:C*8?7?Z+[/IYF:8;V[+.ZWI^F&: M+P^[HGSNY68#V`.2+1*1^';-3QN?:._8.C>R4H$U3EACDQC\`CQE.%XN MLIR(+/+#B)FPX.!$UU-5)Z,AJPL MUDN;B!V#X^2*?,FHA-E)N*(6Q5"C[4HQ/#\U')2&1G';0ZP3']J&HN-'C?P/35XVPV-+8%%K(!, M8^QR?>8B9``F%5(>>=&9?+=ZIL^S2@YI4MCQO3.:R* MC2B:-#21IEU$2M.+'^

MZW9GGO/IK"'>[C(D#@%9/)V$\*@U-=R0DZ@*9/32Y,1TF:$RSM]4>[B[L34. M[2*S_-EE^\Q&NL2X^6!$(>Z*7Q&`BC0I-9O@1C0V,#!XYE&+O]@+]RJ?)]@1 M3;^[UP`RR9H::(UDLZ>!H/AHHE3A`E),IU*%"T#4Y*E(M8Z-$+$13";GZ&-$RV5EG.N@ZV5.`S7A^>D8'RO16G*1*G=;DTX@V!L$L-$+S.-BK M%F';''&VQ:FY1*35)"(=+A-LN_%:2U3K0VZ]&>3O0".&8HQ#!H::3CL? M^[2GQRZNS_NT\/"=S60&>*RR1?2M%\M&6K6?=$:9:`M"J?M")I'0?**Z$I(\ MS'',\RU@Q*Z!PZN5A-N2L^&H^[DU`]*'E]+,-E@=;^X0B@X(LZU)JPMGT\7K ME;!:/,*QH^I-8,A`G/5B"5?_7F?68?5C3.-VA]CH!B%WK]O!%&`3)WF':K*. M^VH]K!B",NK3+7!QU3%H!&06F`]I-4^[3XRENO-UL?D!S7!0%W^(VIHG\YHJ MIP0/=H588^PP0V;B#,B`SK+V'46PURJ\K#PTQ@``768K+:E+1S@$LC$^A4D9 M$QL-P%6GHP*[?ZJS+FXW]_G1XRS4L9NJ:NVJ*-3+'S#L]/;L_/\140,0#!F)'ST?1+ M?V*.?9CLI+'X]^V.$F3&KZT9&,AYD_A?UXQ9^)H9?;:CW\0.J*.F ME1",N.V!MJ,&Q`Q(8$#P).-V([&B6'>CD'F%P;&I-7O$9@^E&QU(S!",16"E M&UUP*N`&[;LTCR-?OO4DOP8+HS&+\\"?WR]NBZ7.2=N&>DTS)SH!?DBM`O51 M4_V0J6N\BU6=#.KRX0`:NKKG5KF%])N&MX-(IG M&$_:.B74]=F*&$HNFP,+3B0#5X^BSM4W,30P$=G62ZEF:X@8=I\M;K'E3AM2 MQD^2D$@XW$S_L#]3$@EKE]*)4MN]+;9M2YMM2W>$M:O395(&RHW-AI MN!Z-D8?1"`,TQN^C/8OVL)4-8F+=_K?Q:#+3KXF!#)`SNYF>^,+IM^G._C49 MG\[V-5GK0@_J""IO/M%3.BA7\[3:RJ39IB25%:LE4"TJ^Z"P[#8L8AE4(X$\T M)`ZY*?:\CM.4E^LVFJ-7;%HH(C6K[T?M4O)7&SKCNC(W+;Q6>AN!01;673VY M9>0,K*\V@`OTN;MQU)$EZKUIYJ+)&3N`?H\9X\"CVE7XWNUW^O`K^M;=EJ56 M>MW#K]+Q[CF6+'9/'R)\.N=D=.1T3][JR-E_,M>.YBN\7W-O[_1UN.%%L42=KSI0Z-J]XU->=U>*A MY$+##^:JIMM-\0B,UU'JGI/?9=EN:(T'FTWK0^\ M#QW:5(X__0\]'%S'C^!#K]B;)!N_0JB@RE8J8""A#JC0GTSJKT\H'8(FZ3"X MI?D^QW>F28U+\QG:-7[ALWX_JW]JFYP&H&7?,%\T7S)?-E\Q7S57&:^9KYNOF$N-]\TWS+?-M\Q MWS7?,]\W/S`_-#\R/S8_,3\U/S,_-[\P5YA?FE^97YO?F-^:WYG?FS^8*\T? MS9_,G\U?S%_-5>9OYN_F'^:?YE_FW^8_YK_F?Z:PI&58IF59JUE=K-6M-:PU MK:[66M;:UCK6NM9ZUOK6!M:&UD;6QM8FUJ;69M;FUA;6EM96UM;6-M:VUG;6 M]M8.UH[63E8W:V=K%VM7:S=K=VL/:T]K+VMO:Q]K7VL_:W_K`*N[=:!UD'6P M=8AUJ/4_ZS#KEJ]K!JKM]7'ZFO56L=:QUEU5C^K MOS7`JK>.MP9:4,X7(TW>\A/[X M':+Z>]9'>,\/]KL2JDM[*5PDXO33V7-S.L\[PP],CPI\BKC]],GHN])5KO+3 M=;1(DBZD/:>WV`_SX%`L9AIRGGO,LC[][B2*962C?UR&_[@/,N5,-D6BI5?/ M'K%0,9?RGBU4/9/0,Q3MM/O&O9A^][T7UN]Z'^$\ORW2KUI"-=GT M6%6W]++_O%PWW#M?L"O*@%RVW9O];L:>!77IIF2VUX#XH;WRI>ZQ:HF$FW!N M@@P]/Y@`VLYX=!B_N[RS%(I%$(!)/ M^T-X3S>*A0-^_]4?[>KWH1X]K)5J(N6$5O9+VA99C_C]4/"J4&3[$*N6\(?V MGJH4*M?FU*YXMEH\/+Q?5IL_MYWW8H'G(H`A7V6G._ M0//M%?3&M$HX$0Q[A:HO-%%I;2T)1ZB$T9CJ\L*1IU152_!IG-E7F_?WE-S? M:/9G\U^A8/_"*#JI8C'?F&$=T=[YW+N0;^GX!41OC9&=LEZY8M]\L90CTI#7 M#S)4SR7(L829G/Z@*16N3Y::_2>4VX58Y7""&*1RG"E7SU0;5RC..L3XHS'&4#E::?A0 MK*&]E7%&8PQ=.5II>#?FK%G>ZU\8:S2J]ZN_W;`8S*B'VP4"^C(HQJJF]`EH MRU&+\56B06]@:J6VLFD1!@R%O,$&U6JK@1;Q^E$'H=34@DT#_5?/.L-RX$GM M%]!9;.0O/;3T+N>\BLC&Q]\\47";,J>;!_?8':TT"Q6>(EL]E5"I%26HU/VAXCI12_K;#4[7CX3:"/*&J)\$]5'PH4 M]6]&0/]B!*+?JWHJ,AHWX&_KM2)+/1((#>`6G9$%UMGPA+V4^_!*U10@58WK9[;UGO5XJ?',_;ZDU:OCZ0?YQMK^[N1"&,.A_3/IJ;"U$[@L+R6LKQSN!K:.>4*XZFL_.LO5M&G9=-;93PX/%OVD M_B^CL9VIXF/58@QW6@P$8B5U'Y[L*_@^E(YK(U5>X=(I:@V-7=6 M5@C5IJ)!5OC`!D`[9!6-N"/HV.3%]#*?.A1(4*[T?I/*8;=O=;PM\-X!%GJ"6TO=ZQ [email protected])3*E%4>=X2YNY9!EZTE2ZRFT$P]%XF%=$?E%[+WEKE"A2< MM2D0J+JX]+?$:2&MW?+C'*50Z"CG'\EWBW\WAYWQHYVO M!.^M^.QH.3>-=YN("XE3FZ=XD_ MP4OQ?'P,+\!7\:?X\4K."W%AO`AW-D?7P?`2?$C\KW1*579>AEN)IYBC>Z]X M-#\9+X`4Z'LU=W3H\; MXJ?P6^)E.`,^*TY5P_EI7%S*;XMUNTW;,=ANBW=X.J:PV>;X\9AKX#&X'1Z+ M)^!Q>!$>C[>9HWNUG3BWDL?O[)U-7,X2#);^#/R-/WOQ`OP%_@@7H6OX>"1K!OG9?(\YC"OB]>0]Y;\?;R6 M?!->A\_C]3A>=^B*OCX)&Y!\=5\A+B!N+N./;8U9/K&.2OBT>)/S-' MGS7NQ?4'\EGB'>*+YK`_IS?7$,@WBR^*X_3Q_2_Q5?)OQ7'>\,YLCM8,X%OD MI\7_B)_N*\=#?)=\E/@+\7'IS^F'@\_"BW\2Q^_O'` M6]Q0W,\19Q#7%7\7@E=1MQ\I%Q#&^T\@?PM\0+QKM$R!AOKO(#\F/BA.,,X&\]U-O*, M$[RKB;N:PWZ]25SS(>\MGB/>;H[NLT_F.BKY5O%-9JIW)7$W M:P7V(Z8UKRSN*%XK/39?N?X1PG`>5SQ?O,\Q_CZ>2/Q+G6>)= MUQSV=^,/R*^*TR_U+FN.YB-X3O`\Q7](I\7GSO.#;4^\$L>.^91MQ3 M/,L+I`0> M@$?B&7CT?U[+Y^0M\&'%@P]_G-N[PY M6D][W6^?!'^6Z*CN`Z^+7XV@7-=7$[< M&=?[SWW2$9:[G_6./^+8%17_?"HD(I=;]%>BKQO[`]D9TKUAJ MW7\$?=-8?R>^_XT^$$NM^[O0]^SGR_9A-.90TOTO[!]!?VQL-;:?17.+I8;W M_]!?&-N;[5?1QF*IX?T_]!-C%[#]+CI*+#6\_X=^:NPVMC]&-XNEAO?_T,^M/__H?\T]@7;?Z(9#R?=_\+^-?2_QB;K M[/K_.EE-L=2ZCX5V)#/_?7ZVKF0#Q5+KW@WM,;8I6U^RE6*I=9\`[3>V']O$ M9.^)I=9]"#IL[%RVR9+]*)9:]\FA4QB[CVWJ9,F/B$T-^S30:8V]QS9#LO)B MJ76?$3J3L7^PS9JLAUAJW6>#SFYLVBXNZES)YHNEUGWN_\?>EX"YEE7EED(K MB.!`#>#T6L8NJ.Z;G)PD)RE;2*52]Z8[50F5U+U]6R2DDE.WTC>5%$FJ[KTM MRJ2@@,H@.""#.`$B,\@,,G4S"_A4%!450?2I#,\1Q??[?V>=O6Y6#1?T(=_S M-4V?56O__]YKKSV>/9PH^0&&FR3WVNG7"1>RPU^GY!.&6R;7F_Y3X4)V^)22 M?.*NE^>]0I/?>[JDZ9$J6?P9>!!SX4XZ_J3(A2F0R\WY M)3]F_&$\5IL6C?9H@A+@TJ-%4/J!V;\[G)X M@$PJY#M#33UU/_^"&RDX+4-"QH7>JGS@K$XS\?WSYN#S_7AW[?'PJ_UWF*(_ M/Y'D']1@OBR0DQGF#S$,N7!DFJWCCPP@Z50`T`>&X3202`,)-/"[*TIU0D"% MK.2?7:F1$\*ID9\]L/3,T64%`$!\BRB$8+TLIT=.EP$C_NBZBB4I*\;#[$G($"YC^=KG#G=P"?`;+;E?/>\UK]T`UO_QDIN]]?% MNP4>RWA>__7QW>#H5P2Y_\]@L_EUN5ZL7N[+7[]RP;=K9N[V]P@"'_*.E^M? M__K77U?+NU^_+!:_/B',\S6.?HW_FOPU`J/Z[S^>29#P]O;+^F5Q^\?\=H40 M(Q2$>^7TMA$:VU*A-/):*KJ@$FX''_I7"@DAD2RS]W6*Y%+5;754B:X]CH7F=$]#CCN,-A8^Z9$OQ+AYK!!;ARKFLSF;D-^-4] M(H1$/)3DF$EAF=CY7(OKM?I2.::X\_.>J2`/+CH,U8'T5`=:^?EE5UJ3L0;%`P)K6S1MJ44P5IU%MB=U.=I04'6]'M`':"1=U MM`59D>=%'?+SQK]X M%S@-M]RLEN766$\(@T/=[>>80EE3XIC]9F:]+,`%N9E[LK92KO*QJWQ$Q83\ MA'PM[`BD'X]*P!+>5@AS6N],6LO7/C2`.A\1#B^1JV9G4/&D9"$?TU%5@W1V[`HC"=]T-X#),N%"TETJ,E*9P0BW`VFX["8@ M\G[.]7IEZ84#&^,X_CT; MN0;&I.J-!B["!F;*)(4C@^AA"]^H,7IJC$PM'(+]NRHIIVMRM-/>EKG@Q6"BB%[7,X;UAXIC:B M?&RK)I_JD*@.'.]:0*E`G&T/T< MP=S.+YYX,>"4M`'L_[.A`@AQ4'(QKAKK\_6]TMY+2)H)(B2

M4W;I`>3_T@9Q=,?47A`II@Y5GWH;-AT]`2L5!N]2_,(-U(&6ZW]!+?OM)/\F MW09*@-*P#1#*@&X'8=JG8`^@XC7.\^9&MK`HRG97,//KT>5,XF$ZI.@@EK5K M:+2S/[6&[I9`,7(5-M-(2#,=_U6B#I@"@%`HH.1@5G$MJEJXOKF43\"$:U^3 ML:_)TB_-&';'S?_]@,(O9VZZ9XV+A,48CQ_6V^WR05CEPT,SF5XMSIO1JYEP M6@M.!)U%0EBG2S8M>3%Z>'BY/.!5IKF0,&VPQ>J=N[AJR;IL MC>(*S!R@ATLQZ9OEPX.$0]W[9"6/R/U-U/3^('J:;TZN)9N$RNI4C=Y;JA:P MLS(.J1124U%%H"AU;YO\`459ZRL*"?_KBK)V4%'J+IA'HHI45`@Q"L$0!BP5 MY??=F$9*&_!&%=72Y@(I2>>JD-/IL'GW>&H/T_/9F3.9LV^7GQ$.U!=FH#:I M1B+DN03%'C*IZ+F*GE%BO]?"Q^VB?GZ)2T@LK3R4.!/&S.3X M/-X5F=HN5>0"(O]T,[E^>_WR0@`06@/.D:YV4V1($JDQN(A\DI9)8`9O!6IZ M74@ZRO5RUI)K+1G#0@20Z9"`^"^1W4%?@>HQF!M'`59SRI`3D$&OIU#.,&I( M%K=]+X/T8C$^>SV=_I4YY(CLR0]"J_*K4EF+[6GC+E9$`@MHYUU: M[M'.K[NTPJ--SR^[Q-(C7LE'IZN1!!C_#OF=7/7(1Y?42_G6K_I5_/_^R]DG_ M,N5S^IP]3*;!#W M.%L?5X?-PPDR2%YN-S_Y&'L+G0IQM]"IL*@%_^&$;6R=L-J-''+>^LE9%G-! M+F'=-)_+UN MXZ:WZJ;%5[KI]^A4?#?UNY6PNXF[*:FAFY(2NBDI,3>M4P8_NWFT;=E/V@ M]J:X`RZD5DI%;ZJP)L1E"7&^F]H?YB"B,S6!DU[*50,N,3A&WWT:V&6J)6KS MRM"\^D2K1+0N134A+%81>:-IWXPHRY: M;XI\ZGN0>V'N-^\[E"*B%4,EEUH3&BP`5`J`P1391*%50JBG%;_=5.F7M6+* MF%9(";4"0J`5)H=:(26N%090U%3=R2P]N_`"B;DOD04F=9%O#,&J`B`:0EM8EB; M."SKWS&J3@SB6Z& MX#GA09]IZ9A8ASVE[IC0E@6P-2&8&H=4A*`Q$=S$T65"=-"6,O;RI:X4@MY< M90V[?TF->@SG([UR*`L-@G#L`,82`X,0W0S!\Q8>5.^6U2O\ZH5]1="'?&/U M;BD+;8>XZ@"F(@;&([H9@%)I#)`JP!C44J%-%&L=EM7K]`\`_%-@/@RH&[!1HB:JUERA(# M2$5E57`3@IL!M'%H;_BRY3$4U[3B&A/PB$,V4MCD^GK* M>AI+QJQEI!O7CO-5A+,@IU?"Q8R/:!-5$M56QJ`RN-R*;#=X:(:L?#)&L-:K MEU^-J#4LR?+A'NLK;G0YGC3,8#QJ&F:01E;&^F6DSL%_.P'?R+&,6>9M%,92%WYV0OR1_U?+7 MY.]K'+E>NU>>BU8&P[=(`L^;*6+RBA+W%T=$1?T,!$7]'B1E#LND;0K=2(9U]=BL8;P4I&(NUXB43=; M*!)S:V!$XF[.023AQI6'L;B8-Q5Q,2=$7,QC13*N5F>QAO`HD8B;2Q&)NMZ7 M2,R-J47B;JY`).&>*N)A[ M1&)N-8)(W(W^1!*NGA=)NGI#).7J0Y&T6VD@DG%S(#\CL89P+N)A;1-+N*HMDW%4F\1\Q@4B*7=2;$ULN'_;NI%X5:9G)$/L5_YX@LC_W?*;(6Y`V1 M32`K_8"E`=(@,APR6:0#0#D2$OD7?BR]`LN**$K;BFP$&2>R.Z1/I`URGLC!D+M%3H*\)7(-9)45 M69Z%1$7>A>PKLAQ*RN$B&T(N$=D9\@@D:$&&Y7*]>#XH:5J09KV5Y%I`=A4Y M`C)#Y'S(1#RC,AKD"]%/H)LOC++,BB#S2+K0+I%MH.9(/56*Z`["YR-Z1#Y$7("2+O0:X3 M66EY](A$=H)\+3(&'`5D M!Y'W(!-%OH',%5D=]^AO1(9"[A-)0?XILA=DC359ID.2(GV0:2)G0HX4N1IR MAR*60M=9EN0F2%KD?0SRBLBKD!4V8_D2$A%9'JW0 M5)&-($>)I"!7BXR$/"NR/^1;D5[(-IO7!'N%3!`Y#S)/Y'+(12)_@CPJ\B+D M$Y&W(9ML(>,F2+/(:FCQBB)#(>>(Q"'WB+1"_BG2"5E[2Y9#(;N*G`')B5P+ M.5GD(1^D6;(!RS6QUP_ M*GB!WBQP/>4?D?,A:(V7^ M$+(+BXU?.T2>@9PD\B;D9I%O(*^(K(N1Z`JCY+Z`1$3V@$P5F00Y2F06Y&J1 MGT&>%3D=\JW(I9!M1DM/#S)!Y'[(/)&_0BX2^1?D49'5,>K]1&0;R"9[23L( M:1:9`BF*E"'GB)P$N4?D?,@_1:Z'K+VW'`5D5Y$7(#F1=R$G5R58N'.+R/J0 MA2([0E80-*C,AO(/>++(!\(/(\9/W]I,_/SXML$$%?020104].I!GRADA;!&=D&DL7)"ER&&2ZR.D1W!LBET5P M]XK0'416B*+N$-D8R=0&LMLG\"48H0KR$LB*[GOD,])KS+IUN/+[`JD+2?U M(62^2!OD=R*SDBA#)'A'$A'DY)HF1E-C6-/K3(M1#ONE;D`\CS\JZ).?2]#F%IR>5F;6=2K=7Q MKHDL]I3FIR*;0"X1&0EY7&0RY%.13LAF/Y46'S)*Y.>0@T7.@)PGD7^0KR&Y%51F'^1V1#R(%&DJ(X[@\Z@[_43)=]\%LGFG_9]DYTZ+ MCF1R9WV$79U!C11(7RC-L2$Y"U(9@P2?*0>IM,+!7VIW5MNXX!F0VX^[G!G+F]:T)G\"Z5M#W(Q6R_C'X)6]$Z)WD^8A+D,>O[%U4W%0\N+*\_K@,^5_BQ%6\BXA;BX>+E^'@ M+7=5Z\KD-+IXN_BJ^$T#>6T;LEXEGRC>(?Y5'+61=WIQ&7$[ M\03Q>O$E'+SU:6R]GWRN^)CXOCA>$S^[$1\G_UD+MC;K M5Y;8F+]5]6XFS-_A6=T*\^]5MWR'W>?/C=WGSXWE\^?&?/[\+.:S MY>9SAIC/&9X\B?F,W_DKF,]9S;N.^8R3.=>*.=>*.==JCG$PQSB9_[;KBK(L M7RS+QMQP.7'Y0'I99C.8_XHS6RF0PZPV:A/HACO"VQTL\:^OU]\(&PV#;.'`U?R)0*2D;O:$]$^*3X7-MF?V;""3FS7V_7/B\^&_7V8O!:JX66/? MORS^*7S99_9JX$LW:^S[U\37PV8W,GLC,-/-&OO^3?%O8;.7F+T5V.5FC7W_ MMOA.V.P#9O\*_.%FC7W_GOA^V&R\IU&,_P[$>M_-_BW]1^+'8;.YF'T6R.EF MC7W_N?B?L-D*S+X*?.YFC7W_7_'KL-EF9M8XHJ^;-?;]"'&DB+#W!K-1(Q:Y M66/?CR:.'C8[A]D8$4?YK9 MXA'MW:RQ[Y%#8[@MFI$8_3][>2T!Z!^DM/:$'"+T$$D!J!!(@ ME(`0>N\@*%($:0)2%!3I2A-!0`0I"DH31!$+35`I(@AW[96LK'57]&]%?Z,Q+: M?)0O.^ENC:R@:?&+:>Z2E9:-XGB*ZO;!6TB:8RI-Q?=0MGN:%N;!I&%YGV2Z#;*CD6;8EI(%IKW[42W5W8) MVHZFO62A>=])=&=E-Z/M9KI*%IKWJ:)?5/88VIXF1QFR/Q'M)Z;OR$+S_J#H0\K>07O$Y"Q' M]HC8?R;ZJ+*69X8];HH@"\W[$Z)/*EL,[9>FSF2A>7]:]!EE:Z`]:YI"%IKW MYT2?5[8CVF],&\E"\_Z2Z,O*CD+[G>DL66C>?R_ZJK)+T?YH>D86FOUH;YC*ER=[0^QOBKZE[#FT=TQMR$+S_J[HWY2]A_:>:119:-[?%_U`V0(A M5NA'IM5DH7G_E^C'RM9"^]1TG"PT[Y^)#C'_TW9&:S;?)PO->XMHJ[*CT#K, MQ2J0=8B]4[1+V;&9*%Y[Q/M5W87VC#S(++0O,\C.J^RI]'F-R\F"\W[ M`J(+*GL=;1'S)V2A>5]4=#%E;:&&+6F^21::]Z5$EU:V%-JRYKP5R985^W*B MRRM;!VTECQ$]5MFJ:">8'Y"%YOU$T9.4;8%VJKEX%;)3Q7Z:Z.G*]D7[LKD) M66C>SQ(]6]G):.>87R(+S?O71,]5=AW:!>8E9*%Y_[KHA1;O8?)`L-.^7 MB%ZJ[(]HWS3?(@O-^Q6B5RH;:C'L:O-S5AXG.H^P\M/DLA\A"\SZ_Z`+*?HBVL.4V66C> M%Q%=5-E+:$M8\D60+2'V)4674O8QVNCQ8]1EF+T[#C M+26CR8X7^PFB)^K'!MHIEF9DH7D_5?0T9:/0SK0,(0O-^Y=%SU*V`]I7+HNP&M,LM^6/(+A?[ M-T6OT*\;:-^RU",+S?O5HM?H]Q2T;ULRR$+S_AW1ZY7]`^U[EGEDH7F_4?3[ MRGIB?6(I%4_VB=C_+?JI MLA^C#;4V)PO->Y-HLU7]V1=:FS6++#3O[:(=RCY!Z[8N)PO->X]HK[(>CV$#

MUD_)0O,^*#I,V5)HG[/>(0O-^WRB\RL;A[:0M4`-LH7$OK#H(LJV1EO;]% M]%9E)Z+=8?77);M#[#\0_:&RJ]'NML:1A>;]'M%[E3V,]F-K=[+0O-\O^H!^ M3T%[R/HR66C>'Q;]J;(/T1ZU;B,+S?MCHC]7-D_`L">ME\A"\_Z4Z"^4C4%[ MQFJM1_:,V'\E^FME4]&>MU8E"\W["Z(O*CL#[65K![+0O/]6]!5EWT5[U3J! M+#3O?Q!]3=FC:'^VKBTMZRGR4+S_K;H7Y6U!0W[F_4Q66C> M_R[Z#_U9%.T#:YD$L@_$_J'H/Y6M@_:QM259:-X_$?VW_OFB#;$-(PO-^U#1 M)ML_[02T5ML*LM"\MXFV*[L*KY0]A-9O^XTL-.\#HH/*WD2; MUU:H/MF\8O^UQ9=1]E':!-LL\A"\[Z^Z`;* MYLECV$:V[62A>=]8=!-EJZ%M;KM,%IKW+42W5+8YVB2;K2'9)+%O([JMLNEH MV]FJD87F?7O1'92=@K:3[06RT+SO++J+LF^A3;5-)`O-^Q=%=U=V/]HTVP:R MT+Q/%]U+V6_09MC.D(7F?5_1_93]$VVF[0E9:-X/%#U(OV[D->P0V_.)9(>( M?9;HH;]SZ)_4?8#M#=M?Y.%YOTMT;>5/8WVKJUL4[)WQ?XWT;\K>Q?M?5MK MLM"\?R#ZH;*^_(;]RS:"+#3O'XM^HA\;:)_95I&%YGV(G3O4_D_;"JW%?HPL M-.^MHFW*]D3KM/]!%IKW+M%N94>A]=F+-"/K$WN_Z("R2A>9]7M'/ M*;L&;0%[)EEHWA1A>9],='%E7V`MI1]/UEHWI;]6-'CE+V#=J+]K*R[D*&G6:_1Q::]]-% MSU#V>;2S[$5;D9TE]K-%OZ)L`MK7[(W(0O-^KNAYRG9%^[I](%EHWB\4O4C9 MX6B7V-\@"\W[I:*7*;L8[0K[`;+0O%\I>I6R>]"NL=\@"\W[M:+7*?LUVO7V M/*W)KA?[#:+?5?9WM._;:Y&%YOTFT9N5]18V[#9[.EEHWF\7O4/9\FAWVE\E M"\W[7:)W*]L$[4?V#\E"\WZ?Z(_UZP;:3^S?D87F_4'1AY1]%>T1NS.)[!&Q M_TST464WHSUNCR`+S?L3HD_JSQMHO[1W)@O-^].BSRA[$^U9^Q2RT+P_)_J\ MLM8BAOW&OI$L-.\OB;ZL;'&TW]G/DH7F_?>BKRI;#^V/]F=DH7G_D^B?E>VM]H:]?!NR-\3^INA;^O,DVCOV-F2A>7]7]&_*KD)[SSZ*+#3O[XM^H.P^M(_L MJ\E"\_XOT8^5/8_VJ?TX66C>/Q,=XE#_W`JMV7&?+#3O+:*MRN8K:EB'HUA; ML@ZQ=XIV*1N/UNMH3!::]S[1?F6[HPUS#"(+S?L\HO,J.Q-M?L=BLM"\+R"Z MH++OH2WB^(0L-.^+BBZF[$FT)1TWR4+SOI3HTLK>15O6D3>9;%FQ+R>ZO+)A MQ0Q;R5&;+#3O*XNNHFP4VNJ.7F2A>1\N.D+9%FBC'7/(0O,^1G2LLOW1UG#L M)`O-^YJB:RD["VU=Q_=DH7E?3W2"LJO1-G2X4L@V%/M$T8V4W8NVJ2.2+#3O MFXENKNQIM*TWMJ$`6FO=]1]1]B.TPQQKR$+S?KCH$0#O: MSQ(]6]E6:./9*%Y'R4Z6MEDM'$N7QK9.+&/%UU#V?YH:[MBR4+SOH[HNOHQ MB;:^ZT6RT+QO(+JALF^@;>R:21::]TU$-U7V7;0M7%O)0O.^I>A6RNY'V\;U M#5EHWKHZO;`VT`UU?DH7F_2#1 M+RG[`MHLUU]DH7D_5/0P90>B'>DJW8OL2+$?)7JT?CRC'>=J01::]^-%3]"O ML6@GNX:2A>;]%-%3E=V*=H;K3;+0O)\I^F5ECZ!]Q76$+#3O7Q4]1]EOT,YS MW24+S?OYHA9]0'10 MV1UH\[H+]2.;5^R?$YU/V1-H"[H;D(7F?2'1A96]B[:8NS]9:-X7%UU"V6!5 MPY9VOTX6FO=E1#^O;$6TY=W[R$+SOH+HBLHV05O%_3-9:-Y7%5U-V52T$>Y` M?[(18A\I.DK946ACW?%DH7D?)SI>V7EH:[E[D(7F?6W1=91]!VV">Q99:-[7 M%]U`V7UH&[FWDX7F?6/1390]A;:Y^S)9:-ZW$-U2V6MHD]RV`623Q+Z-Z+;* MWD/;SEV-+#3OVXONH*R[FF$[N5\@"\W[SJ*[*%L8;:I[(EEHWK\HNKNRE="F MN3>0A>9]NNA>RM9#F^$^0Q::]WU%]U.V'=I,]Q.RT+P?*'J0LNEHA[B?SR0[ M1.RS1`]5=BC:$>Y69*%Y/U+T*&6GH1WK'DX6FO?C1(]7=@W:2>Z59*%Y/UGT M%&5WHYWN/DH6FO[?R4+S_A71KRI[`^U*_3S1\Y4MJ6[8A>Z&9*%YOTCT&\KF1;O4/8`L-.^7B5ZN7Y_1KG0O)`O-^U6BWU*V#MJU M[H_)0O-^G>BWE4U!N\']"UEHWK\K^CW]F$2[R1T7]( M]&%E+Z+]S/TM66C>'Q5]3-D[:$^X[2^1/2'V)T6?4M84;MC3[NIDH7E_1O17 MRN9'>\[=D2PT[\^+OJ!L!;27W)/(0O/^LNAOE:V-]GOWNV2A>7]5]`_*)J/] MR?T566C>_RSZ%V5?0GO3_3=9:-[?$GU;V85H[[K+#B9[5^Q_$_V[LAO1WG>W M)@O-^P>B'RK[*=J_W"/(0O/^L>@GREY&^\R]BBPT[T,\W*$>]L"RRE MDH7F?8;HOLH^1#O`4VX8V0%BGREZH++^*,,.]B21A>;]$-%9RI9#.]PSDBPT M[T>('JEL3;1C/&^1A>;]6-'CE&V-=J+GK*R:6BG>>Z1A>;]=-$S ME)V"=I:GZ'"RL\1^MNA7E%V&]C5/([+0O)\K>IZRV]&^[AE(%IKW"T4O4O8S MM$L\;Y"%YOU2TKQ2]2K_611MVC>KQ6]3MDB:-=[

M\HP@NU[L-XA^5]DXM.][:I&%YOTFT9N534:[S9-.%IKWVT7O4#83[4[/JV2A M>;]+]&YEIZ+]R/,A66C>[Q/]L;+KT7[B^8XL-.\/BCZD[#ZT1SS.D62/B/UG MHH\J>P[MGQ!]4MD':+_T="8+S?O3HL\HZXLQ[%G/%++0O#\G^KQ^ MO4+[C67Q)]6=DZ:+_SG"4+S?OO15]5MCW:'SW/R$+S_B?1/RN;A?:& MI_PHLC?$_J;H6\K.0'O'TX8L-._OBOY-V:5H[WE&D87F_7W1#_1[*-I'GM5D MH7G_E^C'RAY#^]1SG"PT[Y^)#O&J_YUMM&;O?;+0O+>(MBK[!*W#6VPT68?8 M.T6[E"T>:UBOMS%9:-[[1/N5;8(VS#N(+#3O\XC.JVP&VOS>Q62A>5]`=$%E M9Z,MXOV$+#3OBXHNINQ.M"6]-\E"\[Z4Z-+*GD1;UIMW#-FR8E].='EEKZ.M MY*U-%IKWE457438TSK#5O;W(0O,^7'2$LOG11GOGD(7F?8SH6&4CT-;P[B0+ MS?N:HFLIVQIM7>_W9*%Y7T]T@K+]T3;TNL:2;2CVB:(;*3L=;5-O)%EHWC;N0A>9]:]%)RAY!F^R=2A::]RFBVRE["^T+WO?)0O.^H^A.R@;C M#=O5>XXL-.^[B4Y5M@K:'MZ0 MMF2A>3]`=*:R66A?\HXF"\W[P:*'*#L#[3#O&K+0O!\N>H2RJ]".]IX@"\W[ M,:+'*KL7[03O`[+0O)\H>I*RY]%.]18?3W:JV$\3/5W9>VA?]C8A"\W[6:)G M*QNH8=@YWI?(0O/^-=%S]>L&V@7>)62A>?^ZZ(7*=D"[V'N0+#3OEXA>JNPX MM&]Z;Y&%YOT*T2N578%VM?>Y"617B_T:T6OU>PK:=[QUR$+S?KWH#0KO1 MVYLL-._?%[U)V1_1;O6^1A::]]M$;U?V&=H/O;O(0O-^I^A=RA:L:=B]WJMD MH7G_D>A]RD:B/>!U3R1[0.P_$7U0V6YH/_5&D87F_1'1GRD[$^WGWJYDH7E_ M7/0)9;>@_\V2A>?^-Z$O* M_H[VBC=T$MDK8O^=Z.^5]=?"?__76Y$L-.]_%/V3?D]!>]V;3!::]S=$WU0V M`>VOWC%DH7E_1_1=93NA_S+:/_V M/B0+S?NGHI\INQ:MR5=B=]#=$]EMZ'MY4LA"\W[WJ+[*'L*;3_?6++0O.\O>H"R-]$. M\JTC"\W[ET0/5M9:U[!#?:?(0O-^F.CARE9".\KW)UEHWH\6/4;9!+3C?26G MDQTO]A-$3]2O.6BG^)J1A>;]5-'3E)V&=J9O"%EHWK\L>I:R*]&^ZEM&%IKW MVWOLIDH7E_ M1?1WRKZ']@=?.[+0O+\F^D=ECZ/]Q3>.+#3OKXN^H>PO:&_[WB8+S?M?1=]1 MUES?L+_[OB`+S?L_1-]3MAS:A[Y'9*%Y_Z?H1\HV0?O$5VH6V2=B_[?HI_KG MBS;4WYPL-.]-HLU^]7D2K9]4'28LI?1/N>_0Q::]_E$YU?V,=I"_@*SR182^\*BBRA;J(%AB_L3R$+S MOH3HDLK&HRWC[TL6FO?/BRZK;#+:"O[Y9*%Y7U%T)64'H*WJWTL6FO?51%=7 M=C+:2/^/9*%Y'R4Z6MDU:./\OE?(QHE]O.@:RAY&6]L?2Q::]W5$UU7V&[3U M_2^2A>9]`]$-E;V-MK%_)EEHWC7];]*_*'D/[F_\Q66C> M_R[Z#V5OHGW@+S.?[`.Q?RCZ3V5M30S[V-^2+#3OGXC^6]GB:$,"P\A"\SY4 MM"F@_AP)K36P@BPT[VVB[B MS1LHM(!L7K%_3G0^9?>B+1AH0!::]X5$%U;V:[3%`OW)0O.^N.@2RMY%6SKP M.EEHWIRQ]#Z@D66D?6)O5]T0-EK:/,$$\E"\SZOZ.>4 M_1MM@6`F66C>%Q1=2-E\K0Q;-+B(+#3OBXDNKFPDVE+!_62A>5]:=!EED]"6 M"UXG"\W[\J(K*-L';>5@V'*REQHN.4W8ZV9O`5LM"\KR6ZMK)?HJT7_(`L-.\31-=7]B[:Q.`5LM"\;R2Z ML;*>UH9M%G2\2;:9V#N@30EV(@O-^W:BVRO; M'FW'X&2RT+SO)+JSLF/1=@N^1Q::]ZFB7U1V'MJ>P:_)0O,^372ZLNO1]@D^ M)0O-^PS1?97=AW9`L-P*L@/$/E/T0&7/HAT"CP9MR;";9*%Y7TIT:67OH"T;EG66] M*8:M%%:;+#3O*XNNHFPEM-7#>I&%YGVXZ`AEFZ"-#IM#%IKW,:)CE4U'6R-L M)UEHWM^3A>9]1]&= ME/T9;=>P=]-=*JR#]'V"`MYFVP/L>\I.DU9>SO#]@ZK0!::]WU$9RA; M`&W_L+9DH7D_0'2FLA70OA0VFBPT[P>+'J)L3;3#PM:0A>;]0ZHEI`W(R,P8DC6X M>]K`P=42A_0:]4A M*3D%;P:?:G@4>>[1V-RCXF"3RU MU3V\!OYTLW^+:1R(,`[$X^\QPV/P2&3V$7CGHR-1 M-8P;@3O:GLG?BM#Z)B?,O.BN$F M$I2*IHYTK4X6$&F3E=.Q'H*RA@?AX2Y!!Q;(`B.+_TXV2-*3):Q>K#:$H)1! M&6P`.BB1H=)@32DOA!1O-`FU_M5W" MU2"5:.A^.!YL43NV>QI2QSFG[9,-@27SM9T`,Q.!X%E7=#9DKL\]];NU+]6ZQ4M4!?[PR(8M#(!ZY@)[8)#,ND3LNUX M#!=Y7!:+XXXX3")QYA.5P&%!`%6/[email protected];?XO.DT^]1%Z#;-(7YNO^S` M.G8'>AVLM&X+R>WVLB:5G8`)&4Y_T/T;G MC';IH8@%4N$T7Y8LY^;;YM]OOOU'=RB;:;W;H^R+$\,N9=^:>*1+":9,"7.D M3PDH34L"2:=JW=^[Q_!>W?-N@L@B:!QV._OH-UW"5*I_Y-NN::(=/48KM6?S M6EY%89[^%+B\6$*>^CP[Z?]$QW*;^_@WD@YI\6H'"Z$:YBPPB$ M=E%4$G50:1C"?]/"6Z6?R0:/F!_HZ2VC MSL#Z6@>$P)B;6ZXZDH1Y-LV]:'(D'4#.,0%W\ZAYJO"CM]_IY5>S"QI&6]T, M#>*M-'QPCZ69![YZM5W767UAN?O,;X M$7UJ;>L5_HP_7>+B.GXDGR[G&Y=DXUV[3L/)'/Z'=6\+)TV:V\S=YATL4.2N1$SWR=]'2+V.5A&R# M6K&KRN)G:Y64/Z:56#]+1$YTPM]%IX*V73#9R'`V.CW?G]D:"4LN+`592KY8 M,,C*TBIAK3DIBI1U+Z6Y%&S.[C$*(V"XPWU@:",%;U.)D'JAV\]75,G%5CF5 M'L*E@LLH=QR6]U;DS8/R)N6PO-5!>>>G'P.X4K!8;01!C/S^WUT?F*@ M4Y$2Z[U+!@M`X8J2R:YTM47,G%#)?50BJ!0HL)FU+6'5BEGBK4 M4Y^8")&54[F5\VITVI@@/,+!D:NRC\S;,.>[2[.6O>[U\Y/%N_5Z9U[?T-%+ M]X7-&G=W6V)N7T'>]C:>MS.FH]"L8*D&HJI)H0#ZM+*H54L09SU*!IH6?-U%QXG[8!"J9H MK;8R[1O03\MFW7'?I^7O2R;PP7HO9`(2T%-U@QF6OW%B+4$]0L5#7BRD0@Q& MZC!MD`T?+8D4AD("15]Y4..H'2NQ8PDS^_0:=%E!!9!V;EN'8V>>-.N[DQR0^ZX[ MN74S.C$X&8R,`N^'I^,;'3H[K:`A/5#>>9!]M%C,DIMB/ ME)=(^@5`EL+*@IE,B%Y:.MJ/Q35A8$T@=#'+OZ=M8`/5)([D[LZIV>#\ZJI" M[=C=#:I79)YZ1I:?8Z!1@$T0F1'H"WUJ!T]03."F[`B,I+/"M%",]"$F/ MEHEU,UA70(V'2HCJ""I6193$HGJ&H/M(CA+(43.RQ8AE$;RP3\N%!JL*J/%0 M)5'LPMR`>".1%R]H!Q\U?Z\3,0)6#MYR6W[)N5F M->_1V+Q/^5:)-FV8S33JUC]AL50^9HHL0FXM#S.J>/BDIRGK36H>+YN$(;DX M`*(K$ML,@1."0^85=\#$-J[_KY@WDS[39.C;-\ZCL('%WW+Q6,R&!R"Y0."X M@FV&P.4>W.EZ-&R4A54"JR7/@L=UPFR2>R$#9I&0+0VR"5IT2VKT^Y[6+N?LV]W^!(EG[,O7]$WJ5L%=T]/3Q\0X*\[?,XNV-`)[ZM(T%JEW=+*P2^*[?KU0=S=>9Q[8H*+/Z7)O+TUUD;%DSJ+;&UT':>G72IG9C5 M@QZS@\B):'>`)F\F[?8/$@I_^PJVD\7EJZ_&V M#!Z6/_X)_@ZXS,:,U8L4,V#;$MC)Y@QV=C#&0L!:T,D.#7XI9>O?C_RR[7G[ M)\-J97"CZI'KG^?'K]LF-.:0DL6>;ER]U(WFPJL]([9< M_QTTW,M",D7V&H='QG&-ED83VHN0X;2U"7N/QRD,`JAX6D6X MO76/:Q383OML#W>[\^UW079`-M.5H5A+X6*8I$YJM."CN7#`_$=_O]UM50C7 M*AA_O]"Q"'@,6J->B3X]OD,GOVW&,=)4JH!%C(!G'"`@(#I\_UFDOAGS`4)& MAO0II@^.BK11H][1);:TPMZ=M:AN%M6F;E/=_JR7MBES__?#UF1T4(*6"36[5A*ZBNWO9\FUTH7]BQ]'152J! MHV/`@N"8B-H%/)5?9((*+B`0&ET&TH.2&_0SJ5'-]D5&!WNY8G]D=!H9ZP>_ M5(76B%E+%:*OU7)L,/J/N^WW!%TIV@*-`"'XY?;A^AN@M4)=.O'/4/(_@(T" MVW1^EX&TT/H2D1P.8[%'#/D/4*FAOR%D.\SY&-" M?M60R^\H/8XA]Q5RAWL8?Q;R!$.N$7*C(7TAMQAR3LBK#;E5R-M!_+L+^8@A M/R#D'E_.Y`U"FH:\5\@S#?E+(*.1:0Q(A.X8$?+P@0C^98ACQ?R/8:TA/RJ(2M"_M:0DT*N?*1Y"R$-0UXBY-F& M_)20%QCR5B$_9\A[A'S`D+\10'2&?->1Y0A[^:"8O$W*=(3\L9&[(KPMYE2$?%/(.0SXJY..&?%'(?1_#

MY&[W%+L->9B0L2$U(2\WY+"0MQCR;"$?-N06(>F777/RG4*:AKQ.R!E#?E'( M"PUYFY`W&O*'0C[(!#.=*[[*U*"0)QARF?I&*A?($)$&2)7(RT!>1^0M()\@\GZ0NXE\!N3QFV@)X*^,> M-[N[)Q+]?,D35^2Y3/1BN5_RHJ-4[3?K)Z;^]7)>;_9T`=_=7+?):9M6P5=4 M'TW",#L11'*K#\L%7=D=?::M@N^JW7Q9R9A'%+FK[[YQDA:L2HOZ+]2. M9^-)[_?':A.\P#Q?3"K-R3->O5QLZ0/=_7^F_OF0.W7%5]#F]3; M^^4^H#/=49T7T.$[_L"^;]X=>.[4[X)/S3&8D_BNIEN@/_0L#P&]3CQI=E)B MW2RH2Y2MQPU5YJ+U>>`Q>T'S3@2^>_$Z^*[>T+6N@IOC6WIMT;=-"E24`C;O M[ZD%^_:3X(@/_3.9#@HU)"W>=7X7U$OQ6>.#VJ]X(C34J;3NPZ#9!5]5!T[_ M+FB$8SR@1'\*5M7A1'[1O:JZ44+3="^IX:V'1`HG2E'Y>K5?"VIO9V_>ZX M>BA%"!Z45[??OWQ]&YR]^%-0GKUZ=?;B]D^_(_CAOJ%8:J=+L>6:WMY(FZYN M5VT.GRC]R@,O7YU_3Z2S9U?75[=_XNOX]NKVQ>5L%GS[\E5P%MR%EM[0@^`%W1\JM4%P17O@MT[^=4M*O57N%YGD39.OOZQU419?1&*78H+M;E5SS(;< M;B?2H5U0W,7]]OA_Z2\#Z"/SKH;ZZ06;>ZNGRQ^Y1#7BGE_4/,E0W-=:)FC^ M2^7TMZN6KX/SE\YNKZ[.+EW3T(K@^"U[>G%_]UPO_.RKI2>G_ MJ;[;!E_J[[M?"O."7\;J4_/\2W,\#T'XG^-F3PLNT+T6-^^PWO[.I/[^^AB\.V[FP0-=Z'\0EU+MZ>:2ZG%_7RV^#.C^T@\0\+,QI!`,8OCW9M!\-"'O",D>>(#4Z@; MR>[Z8!"Y$&:P.:E,9DA!FZB-0_0.BQ.H2_S"(@@=4H/_3J[2@OHAF M?3:H,1G4*`UWIGW]NF745G6+2OU!P.U?Q^]`WL*3.\C\UQ

MRVN\#,ND0S+4L'P_+),-R?!LJQ%7E??I[&DZ[3S60TK:J`J3N3VUT82#IVI,!?=7D\)_Y`S8][EB]QK8H+$2 M]GYKW:F-P^OUGN7/Z$Y?AB:C%J3RJI_[37Z=D7\PXM#I+$.14;D*BCFJI2C[ MV;=P-QY=#M#1T`6"7-86[KWH(H$>]R5(3")Q\]\Z/Y(G?5W7P#TU;211**/4 M)>"Z*1FE)?!V=0Q#G>[DOQW6]M4+$S3`H-->,(@$OEB0C;TMB\0$AVED;%ZFC8\W>2N^R05N\G)1]OA^L[F= M^_D`EHX@B^&IZ$"]L(()L8IZV^_K";LFI#IH7`V/>(Y=E9=C/[LA/]`@JVU4 M55P>&7`4FZBKI%,='S(L4X4=VV*3Q2A:"@/V&UT-MBLU4(=5695NU_]&`ZQJ MXEWEGR3: M;9)I(KX9M@\D`=8D>P&7?$_7Q"5$CXF$%C"-_3ZQ@M3)PO?]: MPCVWNYYD25CK.([XDZSU+4#RHP0.)+B*0C:;EF75)DPC8ZNH9,JU45C8QSK% M4&!43E;%?X1EP6+O3".2S-@V,LG4'67^T4_K_A,ZN3G?"B4CE5528M+Y(1VN MU&-=1#RZSSE9)\>G'\,*WL=*C7QK(AU8'[7[T3;#D(706\ MGUF+"QN53,HGC4/V997'N6QHE>C]\KR-K2_1U$D#M.%H(0N865O1YILB7YVOESKC"/&\93P?1Y`8Y(PGT-LOASF[C+8W M_917-3CNEQ!HGDXSA]S0O8[/.7P.-$XOMZ3J MB8L),.%J'RMR6-]_A4ZQI"JD1_R`P"4-64!E*KA*J+Q63FL[F MR6$>/)DG3XDMY_(4JE36S,+)`?L2%O[;PR)2"6XHI>5^W]MY82BUY7;1XZL[VN&GV^O=3# MTEY7+?Z8:F M.;J*G;/-P.D*Y?#X2`IT>U>Q?^`.L56@=ZF4$C2!\\A8%S2P@56,/GBA+JZOF+VS?Y>SW_07;3D"B+W*Y#)]*&3X>' MAV&ZF88]6@"B:/[Y_>/5D)/FA^/O4`_X^BB*X)RLO?V?\1-@& MY:-C_C.;&WA`&H*DAL-F/[S\1J*'(22),SV4GIGUIP9!"N,NJ7I++S!BK5%5 M2%?#;H89)B'J&FS#H/:%>K??Y8D!_[4"0KT9R[O9(-Z_[:56JI\-5T2/)7-^C[X=$ M