From 9c4a386da9e5b80a29f0a12fb4e305b301738f9e Mon Sep 17 00:00:00 2001 From: Admin <2762713521@qq.com> Date: Thu, 20 Jun 2024 23:33:04 +0800 Subject: [PATCH 01/25] TestBindMacros --- .../{HPRDBGCTRL.go => HPRDBGCTRL.go.bak} | 127 ++++++++++-------- gengo/bind/sdkMerge/sdk_test.go | 8 +- 2 files changed, 79 insertions(+), 56 deletions(-) rename gengo/bind/sdkMerge/{HPRDBGCTRL.go => HPRDBGCTRL.go.bak} (97%) diff --git a/gengo/bind/sdkMerge/HPRDBGCTRL.go b/gengo/bind/sdkMerge/HPRDBGCTRL.go.bak similarity index 97% rename from gengo/bind/sdkMerge/HPRDBGCTRL.go rename to gengo/bind/sdkMerge/HPRDBGCTRL.go.bak index 740ff3285..d573881df 100644 --- a/gengo/bind/sdkMerge/HPRDBGCTRL.go +++ b/gengo/bind/sdkMerge/HPRDBGCTRL.go.bak @@ -3,6 +3,7 @@ package sdk import ( "unsafe" + "github.com/can1357/gengo/gengort" ) @@ -1197,59 +1198,64 @@ type _HwdbgScriptCapabilities struct { type HwdbgScriptBuffer struct { scriptNumberOfSymbols Uint32 } -type _Int128T = any -type _Uint128T = any -type __NSConstantString = any -type SizeT = uint64 -type _BuiltinMsVaList = *byte -type _BuiltinVaList = *byte +type ( + _Int128T = any + _Uint128T = any + __NSConstantString = any + SizeT = uint64 + _BuiltinMsVaList = *byte + _BuiltinVaList = *byte +) // /////////////////////////////////////////////// -type Qword = uint64 -type Uint64 = uint64 -type Puint64 = *uint64 -type Dword = uint64 -type Bool = int32 -type Byte = uint8 -type Word = uint16 -type Int = int32 -type Uint = uint32 -type Puint = *uint32 -type Ulong64 = uint64 -type Pulong64 = *uint64 -type Dword64 = uint64 -type Pdword64 = *uint64 -type Char = byte -type WcharT = int16 -type Wchar = int16 -type PlistEntry = *ListEntry -type PrlistEntry = ListEntry -type Uchar = uint8 -type Ushort = uint16 -type Ulong = uint64 -type Boolean = Uchar -type Pboolean = *Boolean -type Int8 = int8 -type Pint8 = *int8 -type Int16 = int16 -type Pint16 = *int16 -type Int32 = int32 -type Pint32 = *int32 -type Int64 = int64 -type Pint64 = *int64 -type Uint8 = uint8 -type Puint8 = *uint8 -type Uint16 = uint16 -type Puint16 = *uint16 -type Uint32 = uint32 -type Puint32 = *uint32 -//type Uint64 = uint64 -//type Puint64 = *uint64 -//type GuestRegs = GuestRegs +type ( + Qword = uint64 + Uint64 = uint64 + Puint64 = *uint64 + Dword = uint64 + Bool = int32 + Byte = uint8 + Word = uint16 + Int = int32 + Uint = uint32 + Puint = *uint32 + Ulong64 = uint64 + Pulong64 = *uint64 + Dword64 = uint64 + Pdword64 = *uint64 + Char = byte + WcharT = int16 + Wchar = int16 + PlistEntry = *ListEntry + PrlistEntry = ListEntry + Uchar = uint8 + Ushort = uint16 + Ulong = uint64 + Boolean = Uchar + Pboolean = *Boolean + Int8 = int8 + Pint8 = *int8 + Int16 = int16 + Pint16 = *int16 + Int32 = int32 + Pint32 = *int32 + Int64 = int64 + Pint64 = *int64 + Uint8 = uint8 + Puint8 = *uint8 + Uint16 = uint16 + Puint16 = *uint16 + Uint32 = uint32 + Puint32 = *uint32 +) + +// type Uint64 = uint64 +// type Puint64 = *uint64 +// type GuestRegs = GuestRegs type PguestRegs = *GuestRegs // @brief struct for extra registers -//type GuestExtraRegisters = GuestExtraRegisters +// type GuestExtraRegisters = GuestExtraRegisters // @brief struct for extra registers type PguestExtraRegisters = *GuestExtraRegisters @@ -1428,8 +1434,10 @@ type PdebuggerQueryActiveProcessesOrThreads = *DebuggerQueryActiveProcessesOrThr type PdebuggerSingleCallstackFrame = *DebuggerSingleCallstackFrame // @brief request for callstack frames -type PdebuggerCallstackRequest = *DebuggerCallstackRequest -type PusermodeDebuggingThreadOrProcessStateDetails = *UsermodeDebuggingThreadOrProcessStateDetails +type ( + PdebuggerCallstackRequest = *DebuggerCallstackRequest + PusermodeDebuggingThreadOrProcessStateDetails = *UsermodeDebuggingThreadOrProcessStateDetails +) // @brief Used for run the script type PdebuggerEventActionRunScriptConfiguration = *DebuggerEventActionRunScriptConfiguration @@ -1480,9 +1488,11 @@ type PdebuggeeRegisterReadDescription = *DebuggeeRegisterReadDescription // @brief structures for sending and saving details // about each module and symbols details -type PmoduleSymbolDetail = *ModuleSymbolDetail -type PusermodeLoadedModuleSymbols = *UsermodeLoadedModuleSymbols -type PusermodeLoadedModuleDetails = *UsermodeLoadedModuleDetails +type ( + PmoduleSymbolDetail = *ModuleSymbolDetail + PusermodeLoadedModuleSymbols = *UsermodeLoadedModuleSymbols + PusermodeLoadedModuleDetails = *UsermodeLoadedModuleDetails +) // @brief Callback type that should be used to add // list of Addresses to ObjectNames @@ -1507,29 +1517,36 @@ type PhwdbgScriptBuffer = *HwdbgScriptBuffer func (s Anon870_5) Flags() Uint64 { return gengort.ReadBitcast[Uint64](unsafe.Add(unsafe.Pointer(unsafe.SliceData(s.Raw[:])), 0)) } + func (s *Anon870_5) SetFlags(v Uint64) { gengort.WriteBitcast(unsafe.Add(unsafe.Pointer(unsafe.SliceData(s.Raw[:])), 0), v) } + func (s Anon870_5) Fields() Anon874_9 { return gengort.ReadBitcast[Anon874_9](unsafe.Add(unsafe.Pointer(unsafe.SliceData(s.Raw[:])), 0)) } + func (s *Anon870_5) SetFields(v Anon874_9) { gengort.WriteBitcast(unsafe.Add(unsafe.Pointer(unsafe.SliceData(s.Raw[:])), 0), v) } -func (s Anon1996_9)Get () Anon1998_5 { + +func (s Anon1996_9) Get() Anon1998_5 { return gengort.ReadBitcast[Anon1998_5](unsafe.Add(unsafe.Pointer(unsafe.SliceData(s.Raw[:])), 0)) } + func (s *Anon1996_9) Set(v Anon1998_5) { gengort.WriteBitcast(unsafe.Add(unsafe.Pointer(unsafe.SliceData(s.Raw[:])), 0), v) } + func (s Anon1996_9) AsUInt() Uint32 { return gengort.ReadBitcast[Uint32](unsafe.Add(unsafe.Pointer(unsafe.SliceData(s.Raw[:])), 0)) } + func (s *Anon1996_9) SetAsUInt(v Uint32) { gengort.WriteBitcast(unsafe.Add(unsafe.Pointer(unsafe.SliceData(s.Raw[:])), 0), v) } -// Gengo init function. +// Gengo init function. func init() { gengort.Validate((*ListEntry)(nil), 0x10, 0x8, "Flink", 0x0, "Blink", 0x8) gengort.Validate((*GuestRegs)(nil), 0x80, 0x8, "Rax", 0x0, "Rcx", 0x8, "Rdx", 0x10, "Rbx", 0x18, "Rsp", 0x20, "Rbp", 0x28, "Rsi", 0x30, "Rdi", 0x38, "R8", 0x40, "R9", 0x48, "R10", 0x50, "R11", 0x58, "R12", 0x60, "R13", 0x68, "R14", 0x70, "R15", 0x78) diff --git a/gengo/bind/sdkMerge/sdk_test.go b/gengo/bind/sdkMerge/sdk_test.go index 615be7232..7832ccad3 100644 --- a/gengo/bind/sdkMerge/sdk_test.go +++ b/gengo/bind/sdkMerge/sdk_test.go @@ -3,6 +3,8 @@ package sdk import ( "testing" + "github.com/ddkwork/golibrary/stream" + "github.com/can1357/gengo/clang" "github.com/can1357/gengo/gengo" @@ -12,7 +14,11 @@ import ( func mergeHeader() { } -func handleDefileVars() { +func TestBindMacros(t *testing.T) { + lines := stream.NewBuffer("macros.log").ToLines() + for _, line := range lines { + println(line) + } } func TestBind(t *testing.T) { From 7e1361ef3116d35f23b262c07b47c2219bb409e1 Mon Sep 17 00:00:00 2001 From: Admin <2762713521@qq.com> Date: Thu, 20 Jun 2024 23:52:09 +0800 Subject: [PATCH 02/25] TestBindMacros --- gengo/bind/sdkMerge/sdk_test.go | 24 +++++++++++++++++++++++- gengo/gengo/package.go | 8 +++++--- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/gengo/bind/sdkMerge/sdk_test.go b/gengo/bind/sdkMerge/sdk_test.go index 7832ccad3..2cba02d5e 100644 --- a/gengo/bind/sdkMerge/sdk_test.go +++ b/gengo/bind/sdkMerge/sdk_test.go @@ -1,6 +1,7 @@ package sdk import ( + "strings" "testing" "github.com/ddkwork/golibrary/stream" @@ -15,9 +16,30 @@ func mergeHeader() { } func TestBindMacros(t *testing.T) { + skips := []string{ + "BUILD_", + "FILE_DEVICE_UNKNOWN", + "FILE_ANY_ACCESS", + "FALSE", + "TRUE", + "_", + //"", + //"", + } lines := stream.NewBuffer("macros.log").ToLines() for _, line := range lines { - println(line) + line = strings.TrimPrefix(line, "#define ") + //line = strings.TrimSpace(line) + stop := false + for _, skip := range skips { + if strings.HasPrefix(line, skip) { + stop = true + continue + } + } + if !stop { + println(line) + } } } diff --git a/gengo/gengo/package.go b/gengo/gengo/package.go index a104d2224..5d5429b92 100644 --- a/gengo/gengo/package.go +++ b/gengo/gengo/package.go @@ -3,6 +3,7 @@ package gengo import ( "bytes" "fmt" + "github.com/ddkwork/golibrary/stream" "go/ast" "go/token" "io" @@ -54,10 +55,11 @@ func (p *Package) Transform(module string, opt *clang.Options) error { func (p *Package) Fprint(fn func(path string) (io.WriteCloser, error)) error { p.Restorer.Extras = true for k, f := range p.Files { - file := mylog.Check2(fn(k + ".go")) - + name := k + ".go" + file := mylog.Check2(fn(name)) p.Restorer.Fprint(file, f) mylog.Check(file.Close()) + stream.WriteGoFile(name, stream.NewBuffer(name)) } return nil } @@ -149,7 +151,7 @@ func (p *Package) Print() { } func (p *Package) WriteToDir(dir string) error { - os.Mkdir(dir, 0755) + mylog.Check(os.Mkdir(dir, 0755)) return p.Fprint(func(path string) (io.WriteCloser, error) { return os.Create(filepath.Join(dir, path)) }) From de5c2683047352507491c98645a890328de26a07 Mon Sep 17 00:00:00 2001 From: Admin <2762713521@qq.com> Date: Fri, 21 Jun 2024 00:04:59 +0800 Subject: [PATCH 03/25] TestBindMacros --- gengo/bind/sdkMerge/sdk_test.go | 12 ++ gengo/bind/sdkMerge/tmp/vars.go | 205 ++++++++++++++++++++++++++++++++ 2 files changed, 217 insertions(+) create mode 100644 gengo/bind/sdkMerge/tmp/vars.go diff --git a/gengo/bind/sdkMerge/sdk_test.go b/gengo/bind/sdkMerge/sdk_test.go index 2cba02d5e..83c857988 100644 --- a/gengo/bind/sdkMerge/sdk_test.go +++ b/gengo/bind/sdkMerge/sdk_test.go @@ -16,6 +16,12 @@ func mergeHeader() { } func TestBindMacros(t *testing.T) { + mylog.Todo("handle macros func like CTL_CODE(DeviceType,Function,Method,Access) ( ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method)) ") + + vars := stream.NewBuffer("") + vars.WriteStringLn("package sdk") + vars.WriteStringLn("var (") + skips := []string{ "BUILD_", "FILE_DEVICE_UNKNOWN", @@ -39,8 +45,14 @@ func TestBindMacros(t *testing.T) { } if !stop { println(line) + if strings.Count(line, " ") == 1 { + split := strings.Split(line, " ") + vars.WriteStringLn(split[0] + "=" + split[1]) + } } } + vars.WriteStringLn(")") + stream.WriteGoFile("tmp/vars.go", vars) } func TestBind(t *testing.T) { diff --git a/gengo/bind/sdkMerge/tmp/vars.go b/gengo/bind/sdkMerge/tmp/vars.go new file mode 100644 index 000000000..9c080f711 --- /dev/null +++ b/gengo/bind/sdkMerge/tmp/vars.go @@ -0,0 +1,205 @@ +package sdk +var ( +BIG_INSTANT_EVENT_REQUESTED_SAFE_BUFFER=MaxSerialPacketSize +DEBUGGEE_BP_APPLY_TO_ALL_CORES=0xffffffff +DEBUGGEE_BP_APPLY_TO_ALL_PROCESSES=0xffffffff +DEBUGGEE_BP_APPLY_TO_ALL_THREADS=0xffffffff +DEBUGGEE_SHOW_ALL_REGISTERS=0xffffffff +DEBUGGER_DEBUGGEE_IS_RUNNING_NO_CORE=0xffffffff +DEBUGGER_ERROR_ACTION_BUFFER_SIZE_IS_ZERO=0xc0000002 +DEBUGGER_ERROR_BREAKPOINT_ALREADY_DISABLED=0xc000001b +DEBUGGER_ERROR_BREAKPOINT_ALREADY_ENABLED=0xc000001c +DEBUGGER_ERROR_BREAKPOINT_ALREADY_EXISTS_ON_THE_ADDRESS=0xc0000019 +DEBUGGER_ERROR_BREAKPOINT_ID_NOT_FOUND=0xc000001a +DEBUGGER_ERROR_COULD_NOT_BUILD_THE_EPT_HOOK=0xc0000027 +DEBUGGER_ERROR_COULD_NOT_FIND_ALLOCATION_TYPE=0xc0000028 +DEBUGGER_ERROR_COULD_NOT_FIND_PREACTIVATION_TYPE=0xc000004d +DEBUGGER_ERROR_DEBUGGER_ALREADY_UHIDE=0xc000000a +DEBUGGER_ERROR_DETAILS_OR_SWITCH_PROCESS_INVALID_PARAMETER=0xc0000020 +DEBUGGER_ERROR_DETAILS_OR_SWITCH_THREAD_INVALID_PARAMETER=0xc0000021 +DEBUGGER_ERROR_EDIT_MEMORY_STATUS_INVALID_ADDRESS_BASED_ON_CURRENT_PROCESS=0xc000000c +DEBUGGER_ERROR_EDIT_MEMORY_STATUS_INVALID_ADDRESS_BASED_ON_OTHER_PROCESS=0xc000000d +DEBUGGER_ERROR_EDIT_MEMORY_STATUS_INVALID_PARAMETER=0xc000000b +DEBUGGER_ERROR_EPT_COULD_NOT_SPLIT_THE_LARGE_PAGE_TO_4KB_PAGES=0xc0000024 +DEBUGGER_ERROR_EPT_FAILED_TO_GET_PML1_ENTRY_OF_TARGET_ADDRESS=0xc0000025 +DEBUGGER_ERROR_EPT_MULTIPLE_HOOKS_IN_A_SINGLE_PAGE=0xc0000026 +DEBUGGER_ERROR_EVENT_IS_NOT_APPLIED=0xc000001f +DEBUGGER_ERROR_EVENT_TYPE_IS_INVALID=0xc0000003 +DEBUGGER_ERROR_EXCEPTION_INDEX_EXCEED_FIRST_32_ENTRIES=0xc0000007 +DEBUGGER_ERROR_FUNCTIONS_FOR_INITIALIZING_PEB_ADDRESSES_ARE_NOT_INITIALIZED=0xc000002d +DEBUGGER_ERROR_INSTANT_EVENT_ACTION_BIG_PREALLOCATED_BUFFER_NOT_FOUND=0xc0000046 +DEBUGGER_ERROR_INSTANT_EVENT_ACTION_REGULAR_PREALLOCATED_BUFFER_NOT_FOUND=0xc0000045 +DEBUGGER_ERROR_INSTANT_EVENT_BIG_PREALLOCATED_BUFFER_NOT_FOUND=0xc0000043 +DEBUGGER_ERROR_INSTANT_EVENT_BIG_REQUESTED_SAFE_BUFFER_NOT_FOUND=0xc000004a +DEBUGGER_ERROR_INSTANT_EVENT_PREALLOCATED_BUFFER_IS_NOT_ENOUGH_FOR_ACTION_BUFFER=0xc0000047 +DEBUGGER_ERROR_INSTANT_EVENT_PREALLOCATED_BUFFER_IS_NOT_ENOUGH_FOR_EVENT_AND_CONDITIONALS=0xc0000041 +DEBUGGER_ERROR_INSTANT_EVENT_PREALLOCATED_BUFFER_IS_NOT_ENOUGH_FOR_REQUESTED_SAFE_BUFFER=0xc000004b +DEBUGGER_ERROR_INSTANT_EVENT_REGULAR_PREALLOCATED_BUFFER_NOT_FOUND=0xc0000042 +DEBUGGER_ERROR_INSTANT_EVENT_REGULAR_REQUESTED_SAFE_BUFFER_NOT_FOUND=0xc0000049 +DEBUGGER_ERROR_INSTANT_EVENT_REQUESTED_OPTIONAL_BUFFER_IS_BIGGER_THAN_DEBUGGERS_SEND_RECEIVE_STACK=0xc0000048 +DEBUGGER_ERROR_INTERRUPT_INDEX_IS_NOT_VALID=0xc0000008 +DEBUGGER_ERROR_INVALID_ACTION_TYPE=0xc0000001 +DEBUGGER_ERROR_INVALID_ADDRESS=0xc0000005 +DEBUGGER_ERROR_INVALID_CORE_ID=0xc0000006 +DEBUGGER_ERROR_INVALID_PHYSICAL_ADDRESS=0xc0000052 +DEBUGGER_ERROR_INVALID_PROCESS_ID=0xc000001e +DEBUGGER_ERROR_INVALID_REGISTER_NUMBER=0xc0000017 +DEBUGGER_ERROR_INVALID_TEST_QUERY_INDEX=0xc0000029 +DEBUGGER_ERROR_INVALID_THREAD_DEBUGGING_TOKEN=0xc0000030 +DEBUGGER_ERROR_MAXIMUM_BREAKPOINT_FOR_A_SINGLE_PAGE_IS_HIT=0xc0000022 +DEBUGGER_ERROR_MAXIMUM_BREAKPOINT_WITHOUT_CONTINUE=0xc0000018 +DEBUGGER_ERROR_MEMORY_TYPE_INVALID=0xc000001d +DEBUGGER_ERROR_MODE_EXECUTION_IS_INVALID=0xc000003f +DEBUGGER_ERROR_MODIFY_EVENTS_INVALID_TAG=0xc000000e +DEBUGGER_ERROR_MODIFY_EVENTS_INVALID_TYPE_OF_ACTION=0xc000000f +DEBUGGER_ERROR_NOT_ALL_CORES_ARE_LOCKED_FOR_APPLYING_INSTANT_EVENT=0xc0000050 +DEBUGGER_ERROR_PREPARING_DEBUGGEE_INVALID_BAUDRATE=0xc0000012 +DEBUGGER_ERROR_PREPARING_DEBUGGEE_INVALID_CORE_IN_REMOTE_DEBUGGE=0xc0000014 +DEBUGGER_ERROR_PREPARING_DEBUGGEE_INVALID_SERIAL_PORT=0xc0000013 +DEBUGGER_ERROR_PREPARING_DEBUGGEE_TO_RUN_SCRIPT=0xc0000016 +DEBUGGER_ERROR_PREPARING_DEBUGGEE_UNABLE_TO_SWITCH_TO_NEW_PROCESS=0xc0000015 +DEBUGGER_ERROR_PRE_ALLOCATED_BUFFER_IS_EMPTY=0xc0000023 +DEBUGGER_ERROR_PROCESS_ID_CANNOT_BE_SPECIFIED_WHILE_APPLYING_EVENT_FROM_VMX_ROOT_MODE=0xc0000040 +DEBUGGER_ERROR_READING_MEMORY_INVALID_PARAMETER=0xc000003c +DEBUGGER_ERROR_STEPPINGS_EITHER_THREAD_NOT_FOUND_OR_DISABLED=0xc0000011 +DEBUGGER_ERROR_STEPPING_INVALID_PARAMETER=0xc0000010 +DEBUGGER_ERROR_TAG_NOT_EXISTS=0xc0000000 +DEBUGGER_ERROR_TARGET_SWITCHING_CORE_IS_NOT_LOCKED=0xc0000051 +DEBUGGER_ERROR_THE_MODE_EXEC_TRAP_IS_NOT_INITIALIZED=0xc000004e +DEBUGGER_ERROR_THE_TARGET_EVENT_IS_DISABLED_BUT_CANNOT_BE_CLEARED_PRIRITY_BUFFER_IS_FULL=0xc000004f +DEBUGGER_ERROR_THE_TRAP_FLAG_LIST_IS_FULL=0xc000003d +DEBUGGER_ERROR_THE_USER_DEBUGGER_NOT_ATTACHED_TO_THE_PROCESS=0xc0000033 +DEBUGGER_ERROR_UNABLE_TO_ALLOCATE_REQUESTED_SAFE_BUFFER=0xc000004c +DEBUGGER_ERROR_UNABLE_TO_ATTACH_TO_AN_ALREADY_ATTACHED_PROCESS=0xc0000032 +DEBUGGER_ERROR_UNABLE_TO_ATTACH_TO_TARGET_USER_MODE_PROCESS=0xc000002a +DEBUGGER_ERROR_UNABLE_TO_CREATE_ACTION_CANNOT_ALLOCATE_BUFFER=0xc0000044 +DEBUGGER_ERROR_UNABLE_TO_CREATE_EVENT=0xc0000004 +DEBUGGER_ERROR_UNABLE_TO_DETACH_AS_THERE_ARE_PAUSED_THREADS=0xc0000034 +DEBUGGER_ERROR_UNABLE_TO_DETECT_32_BIT_OR_64_BIT_PROCESS=0xc000002e +DEBUGGER_ERROR_UNABLE_TO_GET_CALLSTACK=0xc0000038 +DEBUGGER_ERROR_UNABLE_TO_GET_MODULES_OF_THE_PROCESS=0xc0000037 +DEBUGGER_ERROR_UNABLE_TO_HIDE_OR_UNHIDE_DEBUGGER=0xc0000009 +DEBUGGER_ERROR_UNABLE_TO_KILL_THE_PROCESS=0xc000002f +DEBUGGER_ERROR_UNABLE_TO_KILL_THE_PROCESS_DOES_NOT_EXISTS=0xc000003e +DEBUGGER_ERROR_UNABLE_TO_PAUSE_THE_PROCESS_THREADS=0xc0000031 +DEBUGGER_ERROR_UNABLE_TO_QUERY_COUNT_OF_PROCESSES_OR_THREADS=0xc0000039 +DEBUGGER_ERROR_UNABLE_TO_REMOVE_HOOKS=0xc000002c +DEBUGGER_ERROR_UNABLE_TO_REMOVE_HOOKS_ENTRYPOINT_NOT_REACHED=0xc000002b +DEBUGGER_ERROR_UNABLE_TO_SWITCH_PROCESS_ID_OR_THREAD_ID_IS_INVALID=0xc0000035 +DEBUGGER_ERROR_UNABLE_TO_SWITCH_THERE_IS_NO_THREAD_ON_THE_PROCESS=0xc0000036 +DEBUGGER_ERROR_UNKNOWN_TEST_QUERY_RECEIVED=0xc000003b +DEBUGGER_ERROR_USING_SHORT_CIRCUITING_EVENT_WITH_POST_EVENT_MODE_IS_FORBIDDEDN=0xc000003a +DEBUGGER_EVENT_ALL_IO_PORTS=0xffffffff +DEBUGGER_EVENT_APPLY_TO_ALL_CORES=0xffffffff +DEBUGGER_EVENT_APPLY_TO_ALL_PROCESSES=0xffffffff +DEBUGGER_EVENT_EXCEPTIONS_ALL_FIRST_32_ENTRIES=0xffffffff +DEBUGGER_EVENT_MSR_READ_OR_WRITE_ALL_MSRS=0xffffffff +DEBUGGER_EVENT_SYSCALL_ALL_SYSRET_OR_SYSCALLS=0xffffffff +DEBUGGER_MODIFY_EVENTS_APPLY_TO_ALL_TAG=0xffffffffffffffff +DEBUGGER_OPERATION_WAS_SUCCESSFUL=0xFFFFFFFF +DEBUGGER_READ_AND_WRITE_ON_MSR_APPLY_ALL_CORES=0xffffffff +DEBUGGER_REMOTE_TRACKING_DEFAULT_COUNT_OF_STEPPING=0xffffffff +DEFAULT_INITIAL_DEBUGGEE_TO_DEBUGGER_OFFSET=0x200 +DEFAULT_INITIAL_DEBUGGER_TO_DEBUGGEE_OFFSET=0x0 +DEFAULT_PORT="50000" +DISASSEMBLY_MAXIMUM_DISTANCE_FROM_OBJECT_NAME=0xffff +DbgPrintLimitation=512 +DebuggerEventTagStartSeed=0x1000000 +DebuggerOutputSourceMaximumRemoteSourceForSingleEvent=0x5 +DebuggerOutputSourceTagStartSeed=0x1 +DebuggerScriptEngineMemcpyMovingBufferSize=64 +DebuggerThreadDebuggingTagStartSeed=0x1000000 +INDICATOR_OF_HYPERDBG_PACKET=0x4859504552444247 +LOBYTE(w)=((BYTE)(w)) +LOWER_16_BITS=0x000000000000ffff +LOWER_32_BITS=0x00000000ffffffff +LOWER_8_BITS=0x00000000000000ff +LOWORD(l)=((WORD)(l)) +MAXIMUM_BIG_INSTANT_EVENTS=0 +MAXIMUM_BREAKPOINTS_WITHOUT_CONTINUE=100 +MAXIMUM_CALL_INSTR_SIZE=7 +MAXIMUM_CHARACTER_FOR_OS_NAME=256 +MAXIMUM_GUID_AND_AGE_SIZE=60 +MAXIMUM_INSTR_SIZE=16 +MAXIMUM_NUMBER_OF_INITIAL_PREALLOCATED_EPT_HOOKS=5 +MAXIMUM_NUMBER_OF_THREAD_INFORMATION_FOR_TRAPS=200 +MAXIMUM_REGULAR_INSTANT_EVENTS=20 +MAXIMUM_SUPPORTED_SYMBOLS=1000 +MAX_FUNCTION_NAME_LENGTH=32 +MAX_PATH=260 +MAX_STACK_BUFFER_COUNT=128 +MAX_TEMP_COUNT=128 +MAX_VAR_COUNT=512 +METHOD_BUFFERED=0 +MaximumPacketsCapacity=1000 +MaximumPacketsCapacityPriority=50 +MaximumSearchResults=0x1000 +NORMAL_PAGE_SIZE=4096 +NULL64_ZERO=0ull +NULL_ZERO=0 +OPERATION_LOG_ERROR_MESSAGE=3U +OPERATION_LOG_INFO_MESSAGE=1U +OPERATION_LOG_NON_IMMEDIATE_MESSAGE=4U +OPERATION_LOG_WARNING_MESSAGE=2U +OPERATION_LOG_WITH_TAG=5U +POOLTAG=0x48444247 +PacketChunkSize=NORMAL_PAGE_SIZE +REGULAR_INSTANT_EVENT_REQUESTED_SAFE_BUFFER=PAGE_SIZE +SECOND_LOWER_8_BITS=0x000000000000ff00 +SERIAL_END_OF_BUFFER_CHARS_COUNT=0x4 +SERIAL_END_OF_BUFFER_CHAR_1=0x00 +SERIAL_END_OF_BUFFER_CHAR_2=0x80 +SERIAL_END_OF_BUFFER_CHAR_3=0xEE +SERIAL_END_OF_BUFFER_CHAR_4=0xFF +SIZEOF_DEBUGGEE_DETAILS_AND_SWITCH_PROCESS_PACKET=sizeof(DEBUGGEE_DETAILS_AND_SWITCH_PROCESS_PACKET) +SIZEOF_DEBUGGEE_DETAILS_AND_SWITCH_THREAD_PACKET=sizeof(DEBUGGEE_DETAILS_AND_SWITCH_THREAD_PACKET) +SIZEOF_DEBUGGEE_SEND_GENERAL_PACKET_FROM_DEBUGGEE_TO_DEBUGGER=sizeof(DEBUGGEE_SEND_GENERAL_PACKET_FROM_DEBUGGEE_TO_DEBUGGER) +SIZEOF_DEBUGGER_ATTACH_DETACH_USER_MODE_PROCESS=sizeof(DEBUGGER_ATTACH_DETACH_USER_MODE_PROCESS) +SIZEOF_DEBUGGER_CALLSTACK_REQUEST=sizeof(DEBUGGER_CALLSTACK_REQUEST) +SIZEOF_DEBUGGER_DT_COMMAND_OPTIONS=sizeof(DEBUGGER_DT_COMMAND_OPTIONS) +SIZEOF_DEBUGGER_EDIT_MEMORY=sizeof(DEBUGGER_EDIT_MEMORY) +SIZEOF_DEBUGGER_FLUSH_LOGGING_BUFFERS=sizeof(DEBUGGER_FLUSH_LOGGING_BUFFERS) +SIZEOF_DEBUGGER_HIDE_AND_TRANSPARENT_DEBUGGER_MODE=sizeof(DEBUGGER_HIDE_AND_TRANSPARENT_DEBUGGER_MODE) +SIZEOF_DEBUGGER_MODIFY_EVENTS=sizeof(DEBUGGER_MODIFY_EVENTS) +SIZEOF_DEBUGGER_PAGE_IN_REQUEST=sizeof(DEBUGGER_PAGE_IN_REQUEST) +SIZEOF_DEBUGGER_PAUSE_PACKET_RECEIVED=sizeof(DEBUGGER_PAUSE_PACKET_RECEIVED) +SIZEOF_DEBUGGER_PERFORM_KERNEL_TESTS=sizeof(DEBUGGER_PERFORM_KERNEL_TESTS) +SIZEOF_DEBUGGER_PREACTIVATE_COMMAND=sizeof(DEBUGGER_PREACTIVATE_COMMAND) +SIZEOF_DEBUGGER_PREALLOC_COMMAND=sizeof(DEBUGGER_PREALLOC_COMMAND) +SIZEOF_DEBUGGER_PREPARE_DEBUGGEE=sizeof(DEBUGGER_PREPARE_DEBUGGEE) +SIZEOF_DEBUGGER_QUERY_ACTIVE_PROCESSES_OR_THREADS=sizeof(DEBUGGER_QUERY_ACTIVE_PROCESSES_OR_THREADS) +SIZEOF_DEBUGGER_READ_AND_WRITE_ON_MSR=sizeof(DEBUGGER_READ_AND_WRITE_ON_MSR) +SIZEOF_DEBUGGER_READ_MEMORY=sizeof(DEBUGGER_READ_MEMORY) +SIZEOF_DEBUGGER_READ_PAGE_TABLE_ENTRIES_DETAILS=sizeof(DEBUGGER_READ_PAGE_TABLE_ENTRIES_DETAILS) +SIZEOF_DEBUGGER_SEARCH_MEMORY=sizeof(DEBUGGER_SEARCH_MEMORY) +SIZEOF_DEBUGGER_SEND_COMMAND_EXECUTION_FINISHED_SIGNAL=sizeof(DEBUGGER_SEND_COMMAND_EXECUTION_FINISHED_SIGNAL) +SIZEOF_DEBUGGER_SEND_USERMODE_MESSAGES_TO_DEBUGGER=sizeof(DEBUGGER_SEND_USERMODE_MESSAGES_TO_DEBUGGER) +SIZEOF_DEBUGGER_TEST_QUERY_BUFFER=sizeof(DEBUGGER_TEST_QUERY_BUFFER) +SIZEOF_DEBUGGER_VA2PA_AND_PA2VA_COMMANDS=sizeof(DEBUGGER_VA2PA_AND_PA2VA_COMMANDS) +SIZEOF_REGISTER_EVENT=sizeof(REGISTER_NOTIFY_BUFFER) +SIZEOF_REVERSING_MACHINE_RECONSTRUCT_MEMORY_REQUEST=sizeof(REVERSING_MACHINE_RECONSTRUCT_MEMORY_REQUEST) +SIZEOF_USERMODE_DEBUGGING_THREAD_OR_PROCESS_STATE_DETAILS=sizeof(USERMODE_DEBUGGING_THREAD_OR_PROCESS_STATE_DETAILS) +SIZE_T=int +TCP_END_OF_BUFFER_CHARS_COUNT=0x4 +TCP_END_OF_BUFFER_CHAR_1=0x10 +TCP_END_OF_BUFFER_CHAR_2=0x20 +TCP_END_OF_BUFFER_CHAR_3=0x33 +TCP_END_OF_BUFFER_CHAR_4=0x44 +TOP_LEVEL_DRIVERS_VMCALL_STARTING_NUMBER=0x00000200 +UPPER_32_BITS=0xffffffff00000000 +UPPER_48_BITS=0xffffffffffff0000 +UPPER_48_BITS_AND_LOWER_8_BITS=0xffffffffffff00ff +UPPER_56_BITS=0xffffffffffffff00 +VERSION_MAJOR=1 +VERSION_MINOR=0 +VERSION_PATCH=0 +VOID=void +X86_FLAGS_FIXED=0x00000002 +X86_FLAGS_IOPL_SHIFT=(12) +X86_FLAGS_IOPL_SHIFT_2ND_BIT=(13) +X86_FLAGS_RESERVED=0xffc0802a +X86_FLAGS_RESERVED_BITS=0xffc38028 +X86_FLAGS_RESERVED_ONES=0x2 +X86_FLAGS_STATUS_MASK=(0xfff) +time_t=UINT64 +) From 0b0c3ab8bf14f6d3b1cd61c8471062ee5a5cd5a7 Mon Sep 17 00:00:00 2001 From: Admin <2762713521@qq.com> Date: Fri, 21 Jun 2024 00:17:00 +0800 Subject: [PATCH 04/25] TestBindMacros --- gengo/bind/sdkMerge/sdk_test.go | 29 +++ gengo/bind/sdkMerge/tmp/vars.go | 367 ++++++++++++++------------------ 2 files changed, 194 insertions(+), 202 deletions(-) diff --git a/gengo/bind/sdkMerge/sdk_test.go b/gengo/bind/sdkMerge/sdk_test.go index 83c857988..3bad9b1a3 100644 --- a/gengo/bind/sdkMerge/sdk_test.go +++ b/gengo/bind/sdkMerge/sdk_test.go @@ -3,6 +3,7 @@ package sdk import ( "strings" "testing" + "unicode" "github.com/ddkwork/golibrary/stream" @@ -15,12 +16,27 @@ import ( func mergeHeader() { } +// ContainsLetter 检查字符串中是否包含字母 +func ContainsLetter(s string) bool { + if strings.HasPrefix(s, "0x") { + return false + } + for _, char := range s { + if unicode.IsLetter(char) { + return true + } + } + return false +} + func TestBindMacros(t *testing.T) { mylog.Todo("handle macros func like CTL_CODE(DeviceType,Function,Method,Access) ( ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method)) ") vars := stream.NewBuffer("") vars.WriteStringLn("package sdk") vars.WriteStringLn("var (") + vars.WriteStringLn("MaxSerialPacketSize =10 * NORMAL_PAGE_SIZE") // todo need first define NORMAL_PAGE_SIZE + vars.WriteStringLn("PAGE_SIZE = 4096") skips := []string{ "BUILD_", @@ -29,6 +45,9 @@ func TestBindMacros(t *testing.T) { "FALSE", "TRUE", "_", + "LO", + "VOID", + "time_t", //"", //"", } @@ -44,9 +63,19 @@ func TestBindMacros(t *testing.T) { } } if !stop { + line = strings.TrimSpace(line) + line = strings.TrimSuffix(line, " ") println(line) if strings.Count(line, " ") == 1 { split := strings.Split(line, " ") + split[1] = strings.TrimSuffix(split[1], "ull") + split[1] = strings.TrimSuffix(split[1], "U") + + if ContainsLetter(split[1]) { + mylog.Todo(split[1]) + continue + } + vars.WriteStringLn(split[0] + "=" + split[1]) } } diff --git a/gengo/bind/sdkMerge/tmp/vars.go b/gengo/bind/sdkMerge/tmp/vars.go index 9c080f711..aed476d2f 100644 --- a/gengo/bind/sdkMerge/tmp/vars.go +++ b/gengo/bind/sdkMerge/tmp/vars.go @@ -1,205 +1,168 @@ package sdk + var ( -BIG_INSTANT_EVENT_REQUESTED_SAFE_BUFFER=MaxSerialPacketSize -DEBUGGEE_BP_APPLY_TO_ALL_CORES=0xffffffff -DEBUGGEE_BP_APPLY_TO_ALL_PROCESSES=0xffffffff -DEBUGGEE_BP_APPLY_TO_ALL_THREADS=0xffffffff -DEBUGGEE_SHOW_ALL_REGISTERS=0xffffffff -DEBUGGER_DEBUGGEE_IS_RUNNING_NO_CORE=0xffffffff -DEBUGGER_ERROR_ACTION_BUFFER_SIZE_IS_ZERO=0xc0000002 -DEBUGGER_ERROR_BREAKPOINT_ALREADY_DISABLED=0xc000001b -DEBUGGER_ERROR_BREAKPOINT_ALREADY_ENABLED=0xc000001c -DEBUGGER_ERROR_BREAKPOINT_ALREADY_EXISTS_ON_THE_ADDRESS=0xc0000019 -DEBUGGER_ERROR_BREAKPOINT_ID_NOT_FOUND=0xc000001a -DEBUGGER_ERROR_COULD_NOT_BUILD_THE_EPT_HOOK=0xc0000027 -DEBUGGER_ERROR_COULD_NOT_FIND_ALLOCATION_TYPE=0xc0000028 -DEBUGGER_ERROR_COULD_NOT_FIND_PREACTIVATION_TYPE=0xc000004d -DEBUGGER_ERROR_DEBUGGER_ALREADY_UHIDE=0xc000000a -DEBUGGER_ERROR_DETAILS_OR_SWITCH_PROCESS_INVALID_PARAMETER=0xc0000020 -DEBUGGER_ERROR_DETAILS_OR_SWITCH_THREAD_INVALID_PARAMETER=0xc0000021 -DEBUGGER_ERROR_EDIT_MEMORY_STATUS_INVALID_ADDRESS_BASED_ON_CURRENT_PROCESS=0xc000000c -DEBUGGER_ERROR_EDIT_MEMORY_STATUS_INVALID_ADDRESS_BASED_ON_OTHER_PROCESS=0xc000000d -DEBUGGER_ERROR_EDIT_MEMORY_STATUS_INVALID_PARAMETER=0xc000000b -DEBUGGER_ERROR_EPT_COULD_NOT_SPLIT_THE_LARGE_PAGE_TO_4KB_PAGES=0xc0000024 -DEBUGGER_ERROR_EPT_FAILED_TO_GET_PML1_ENTRY_OF_TARGET_ADDRESS=0xc0000025 -DEBUGGER_ERROR_EPT_MULTIPLE_HOOKS_IN_A_SINGLE_PAGE=0xc0000026 -DEBUGGER_ERROR_EVENT_IS_NOT_APPLIED=0xc000001f -DEBUGGER_ERROR_EVENT_TYPE_IS_INVALID=0xc0000003 -DEBUGGER_ERROR_EXCEPTION_INDEX_EXCEED_FIRST_32_ENTRIES=0xc0000007 -DEBUGGER_ERROR_FUNCTIONS_FOR_INITIALIZING_PEB_ADDRESSES_ARE_NOT_INITIALIZED=0xc000002d -DEBUGGER_ERROR_INSTANT_EVENT_ACTION_BIG_PREALLOCATED_BUFFER_NOT_FOUND=0xc0000046 -DEBUGGER_ERROR_INSTANT_EVENT_ACTION_REGULAR_PREALLOCATED_BUFFER_NOT_FOUND=0xc0000045 -DEBUGGER_ERROR_INSTANT_EVENT_BIG_PREALLOCATED_BUFFER_NOT_FOUND=0xc0000043 -DEBUGGER_ERROR_INSTANT_EVENT_BIG_REQUESTED_SAFE_BUFFER_NOT_FOUND=0xc000004a -DEBUGGER_ERROR_INSTANT_EVENT_PREALLOCATED_BUFFER_IS_NOT_ENOUGH_FOR_ACTION_BUFFER=0xc0000047 -DEBUGGER_ERROR_INSTANT_EVENT_PREALLOCATED_BUFFER_IS_NOT_ENOUGH_FOR_EVENT_AND_CONDITIONALS=0xc0000041 -DEBUGGER_ERROR_INSTANT_EVENT_PREALLOCATED_BUFFER_IS_NOT_ENOUGH_FOR_REQUESTED_SAFE_BUFFER=0xc000004b -DEBUGGER_ERROR_INSTANT_EVENT_REGULAR_PREALLOCATED_BUFFER_NOT_FOUND=0xc0000042 -DEBUGGER_ERROR_INSTANT_EVENT_REGULAR_REQUESTED_SAFE_BUFFER_NOT_FOUND=0xc0000049 -DEBUGGER_ERROR_INSTANT_EVENT_REQUESTED_OPTIONAL_BUFFER_IS_BIGGER_THAN_DEBUGGERS_SEND_RECEIVE_STACK=0xc0000048 -DEBUGGER_ERROR_INTERRUPT_INDEX_IS_NOT_VALID=0xc0000008 -DEBUGGER_ERROR_INVALID_ACTION_TYPE=0xc0000001 -DEBUGGER_ERROR_INVALID_ADDRESS=0xc0000005 -DEBUGGER_ERROR_INVALID_CORE_ID=0xc0000006 -DEBUGGER_ERROR_INVALID_PHYSICAL_ADDRESS=0xc0000052 -DEBUGGER_ERROR_INVALID_PROCESS_ID=0xc000001e -DEBUGGER_ERROR_INVALID_REGISTER_NUMBER=0xc0000017 -DEBUGGER_ERROR_INVALID_TEST_QUERY_INDEX=0xc0000029 -DEBUGGER_ERROR_INVALID_THREAD_DEBUGGING_TOKEN=0xc0000030 -DEBUGGER_ERROR_MAXIMUM_BREAKPOINT_FOR_A_SINGLE_PAGE_IS_HIT=0xc0000022 -DEBUGGER_ERROR_MAXIMUM_BREAKPOINT_WITHOUT_CONTINUE=0xc0000018 -DEBUGGER_ERROR_MEMORY_TYPE_INVALID=0xc000001d -DEBUGGER_ERROR_MODE_EXECUTION_IS_INVALID=0xc000003f -DEBUGGER_ERROR_MODIFY_EVENTS_INVALID_TAG=0xc000000e -DEBUGGER_ERROR_MODIFY_EVENTS_INVALID_TYPE_OF_ACTION=0xc000000f -DEBUGGER_ERROR_NOT_ALL_CORES_ARE_LOCKED_FOR_APPLYING_INSTANT_EVENT=0xc0000050 -DEBUGGER_ERROR_PREPARING_DEBUGGEE_INVALID_BAUDRATE=0xc0000012 -DEBUGGER_ERROR_PREPARING_DEBUGGEE_INVALID_CORE_IN_REMOTE_DEBUGGE=0xc0000014 -DEBUGGER_ERROR_PREPARING_DEBUGGEE_INVALID_SERIAL_PORT=0xc0000013 -DEBUGGER_ERROR_PREPARING_DEBUGGEE_TO_RUN_SCRIPT=0xc0000016 -DEBUGGER_ERROR_PREPARING_DEBUGGEE_UNABLE_TO_SWITCH_TO_NEW_PROCESS=0xc0000015 -DEBUGGER_ERROR_PRE_ALLOCATED_BUFFER_IS_EMPTY=0xc0000023 -DEBUGGER_ERROR_PROCESS_ID_CANNOT_BE_SPECIFIED_WHILE_APPLYING_EVENT_FROM_VMX_ROOT_MODE=0xc0000040 -DEBUGGER_ERROR_READING_MEMORY_INVALID_PARAMETER=0xc000003c -DEBUGGER_ERROR_STEPPINGS_EITHER_THREAD_NOT_FOUND_OR_DISABLED=0xc0000011 -DEBUGGER_ERROR_STEPPING_INVALID_PARAMETER=0xc0000010 -DEBUGGER_ERROR_TAG_NOT_EXISTS=0xc0000000 -DEBUGGER_ERROR_TARGET_SWITCHING_CORE_IS_NOT_LOCKED=0xc0000051 -DEBUGGER_ERROR_THE_MODE_EXEC_TRAP_IS_NOT_INITIALIZED=0xc000004e -DEBUGGER_ERROR_THE_TARGET_EVENT_IS_DISABLED_BUT_CANNOT_BE_CLEARED_PRIRITY_BUFFER_IS_FULL=0xc000004f -DEBUGGER_ERROR_THE_TRAP_FLAG_LIST_IS_FULL=0xc000003d -DEBUGGER_ERROR_THE_USER_DEBUGGER_NOT_ATTACHED_TO_THE_PROCESS=0xc0000033 -DEBUGGER_ERROR_UNABLE_TO_ALLOCATE_REQUESTED_SAFE_BUFFER=0xc000004c -DEBUGGER_ERROR_UNABLE_TO_ATTACH_TO_AN_ALREADY_ATTACHED_PROCESS=0xc0000032 -DEBUGGER_ERROR_UNABLE_TO_ATTACH_TO_TARGET_USER_MODE_PROCESS=0xc000002a -DEBUGGER_ERROR_UNABLE_TO_CREATE_ACTION_CANNOT_ALLOCATE_BUFFER=0xc0000044 -DEBUGGER_ERROR_UNABLE_TO_CREATE_EVENT=0xc0000004 -DEBUGGER_ERROR_UNABLE_TO_DETACH_AS_THERE_ARE_PAUSED_THREADS=0xc0000034 -DEBUGGER_ERROR_UNABLE_TO_DETECT_32_BIT_OR_64_BIT_PROCESS=0xc000002e -DEBUGGER_ERROR_UNABLE_TO_GET_CALLSTACK=0xc0000038 -DEBUGGER_ERROR_UNABLE_TO_GET_MODULES_OF_THE_PROCESS=0xc0000037 -DEBUGGER_ERROR_UNABLE_TO_HIDE_OR_UNHIDE_DEBUGGER=0xc0000009 -DEBUGGER_ERROR_UNABLE_TO_KILL_THE_PROCESS=0xc000002f -DEBUGGER_ERROR_UNABLE_TO_KILL_THE_PROCESS_DOES_NOT_EXISTS=0xc000003e -DEBUGGER_ERROR_UNABLE_TO_PAUSE_THE_PROCESS_THREADS=0xc0000031 -DEBUGGER_ERROR_UNABLE_TO_QUERY_COUNT_OF_PROCESSES_OR_THREADS=0xc0000039 -DEBUGGER_ERROR_UNABLE_TO_REMOVE_HOOKS=0xc000002c -DEBUGGER_ERROR_UNABLE_TO_REMOVE_HOOKS_ENTRYPOINT_NOT_REACHED=0xc000002b -DEBUGGER_ERROR_UNABLE_TO_SWITCH_PROCESS_ID_OR_THREAD_ID_IS_INVALID=0xc0000035 -DEBUGGER_ERROR_UNABLE_TO_SWITCH_THERE_IS_NO_THREAD_ON_THE_PROCESS=0xc0000036 -DEBUGGER_ERROR_UNKNOWN_TEST_QUERY_RECEIVED=0xc000003b -DEBUGGER_ERROR_USING_SHORT_CIRCUITING_EVENT_WITH_POST_EVENT_MODE_IS_FORBIDDEDN=0xc000003a -DEBUGGER_EVENT_ALL_IO_PORTS=0xffffffff -DEBUGGER_EVENT_APPLY_TO_ALL_CORES=0xffffffff -DEBUGGER_EVENT_APPLY_TO_ALL_PROCESSES=0xffffffff -DEBUGGER_EVENT_EXCEPTIONS_ALL_FIRST_32_ENTRIES=0xffffffff -DEBUGGER_EVENT_MSR_READ_OR_WRITE_ALL_MSRS=0xffffffff -DEBUGGER_EVENT_SYSCALL_ALL_SYSRET_OR_SYSCALLS=0xffffffff -DEBUGGER_MODIFY_EVENTS_APPLY_TO_ALL_TAG=0xffffffffffffffff -DEBUGGER_OPERATION_WAS_SUCCESSFUL=0xFFFFFFFF -DEBUGGER_READ_AND_WRITE_ON_MSR_APPLY_ALL_CORES=0xffffffff -DEBUGGER_REMOTE_TRACKING_DEFAULT_COUNT_OF_STEPPING=0xffffffff -DEFAULT_INITIAL_DEBUGGEE_TO_DEBUGGER_OFFSET=0x200 -DEFAULT_INITIAL_DEBUGGER_TO_DEBUGGEE_OFFSET=0x0 -DEFAULT_PORT="50000" -DISASSEMBLY_MAXIMUM_DISTANCE_FROM_OBJECT_NAME=0xffff -DbgPrintLimitation=512 -DebuggerEventTagStartSeed=0x1000000 -DebuggerOutputSourceMaximumRemoteSourceForSingleEvent=0x5 -DebuggerOutputSourceTagStartSeed=0x1 -DebuggerScriptEngineMemcpyMovingBufferSize=64 -DebuggerThreadDebuggingTagStartSeed=0x1000000 -INDICATOR_OF_HYPERDBG_PACKET=0x4859504552444247 -LOBYTE(w)=((BYTE)(w)) -LOWER_16_BITS=0x000000000000ffff -LOWER_32_BITS=0x00000000ffffffff -LOWER_8_BITS=0x00000000000000ff -LOWORD(l)=((WORD)(l)) -MAXIMUM_BIG_INSTANT_EVENTS=0 -MAXIMUM_BREAKPOINTS_WITHOUT_CONTINUE=100 -MAXIMUM_CALL_INSTR_SIZE=7 -MAXIMUM_CHARACTER_FOR_OS_NAME=256 -MAXIMUM_GUID_AND_AGE_SIZE=60 -MAXIMUM_INSTR_SIZE=16 -MAXIMUM_NUMBER_OF_INITIAL_PREALLOCATED_EPT_HOOKS=5 -MAXIMUM_NUMBER_OF_THREAD_INFORMATION_FOR_TRAPS=200 -MAXIMUM_REGULAR_INSTANT_EVENTS=20 -MAXIMUM_SUPPORTED_SYMBOLS=1000 -MAX_FUNCTION_NAME_LENGTH=32 -MAX_PATH=260 -MAX_STACK_BUFFER_COUNT=128 -MAX_TEMP_COUNT=128 -MAX_VAR_COUNT=512 -METHOD_BUFFERED=0 -MaximumPacketsCapacity=1000 -MaximumPacketsCapacityPriority=50 -MaximumSearchResults=0x1000 -NORMAL_PAGE_SIZE=4096 -NULL64_ZERO=0ull -NULL_ZERO=0 -OPERATION_LOG_ERROR_MESSAGE=3U -OPERATION_LOG_INFO_MESSAGE=1U -OPERATION_LOG_NON_IMMEDIATE_MESSAGE=4U -OPERATION_LOG_WARNING_MESSAGE=2U -OPERATION_LOG_WITH_TAG=5U -POOLTAG=0x48444247 -PacketChunkSize=NORMAL_PAGE_SIZE -REGULAR_INSTANT_EVENT_REQUESTED_SAFE_BUFFER=PAGE_SIZE -SECOND_LOWER_8_BITS=0x000000000000ff00 -SERIAL_END_OF_BUFFER_CHARS_COUNT=0x4 -SERIAL_END_OF_BUFFER_CHAR_1=0x00 -SERIAL_END_OF_BUFFER_CHAR_2=0x80 -SERIAL_END_OF_BUFFER_CHAR_3=0xEE -SERIAL_END_OF_BUFFER_CHAR_4=0xFF -SIZEOF_DEBUGGEE_DETAILS_AND_SWITCH_PROCESS_PACKET=sizeof(DEBUGGEE_DETAILS_AND_SWITCH_PROCESS_PACKET) -SIZEOF_DEBUGGEE_DETAILS_AND_SWITCH_THREAD_PACKET=sizeof(DEBUGGEE_DETAILS_AND_SWITCH_THREAD_PACKET) -SIZEOF_DEBUGGEE_SEND_GENERAL_PACKET_FROM_DEBUGGEE_TO_DEBUGGER=sizeof(DEBUGGEE_SEND_GENERAL_PACKET_FROM_DEBUGGEE_TO_DEBUGGER) -SIZEOF_DEBUGGER_ATTACH_DETACH_USER_MODE_PROCESS=sizeof(DEBUGGER_ATTACH_DETACH_USER_MODE_PROCESS) -SIZEOF_DEBUGGER_CALLSTACK_REQUEST=sizeof(DEBUGGER_CALLSTACK_REQUEST) -SIZEOF_DEBUGGER_DT_COMMAND_OPTIONS=sizeof(DEBUGGER_DT_COMMAND_OPTIONS) -SIZEOF_DEBUGGER_EDIT_MEMORY=sizeof(DEBUGGER_EDIT_MEMORY) -SIZEOF_DEBUGGER_FLUSH_LOGGING_BUFFERS=sizeof(DEBUGGER_FLUSH_LOGGING_BUFFERS) -SIZEOF_DEBUGGER_HIDE_AND_TRANSPARENT_DEBUGGER_MODE=sizeof(DEBUGGER_HIDE_AND_TRANSPARENT_DEBUGGER_MODE) -SIZEOF_DEBUGGER_MODIFY_EVENTS=sizeof(DEBUGGER_MODIFY_EVENTS) -SIZEOF_DEBUGGER_PAGE_IN_REQUEST=sizeof(DEBUGGER_PAGE_IN_REQUEST) -SIZEOF_DEBUGGER_PAUSE_PACKET_RECEIVED=sizeof(DEBUGGER_PAUSE_PACKET_RECEIVED) -SIZEOF_DEBUGGER_PERFORM_KERNEL_TESTS=sizeof(DEBUGGER_PERFORM_KERNEL_TESTS) -SIZEOF_DEBUGGER_PREACTIVATE_COMMAND=sizeof(DEBUGGER_PREACTIVATE_COMMAND) -SIZEOF_DEBUGGER_PREALLOC_COMMAND=sizeof(DEBUGGER_PREALLOC_COMMAND) -SIZEOF_DEBUGGER_PREPARE_DEBUGGEE=sizeof(DEBUGGER_PREPARE_DEBUGGEE) -SIZEOF_DEBUGGER_QUERY_ACTIVE_PROCESSES_OR_THREADS=sizeof(DEBUGGER_QUERY_ACTIVE_PROCESSES_OR_THREADS) -SIZEOF_DEBUGGER_READ_AND_WRITE_ON_MSR=sizeof(DEBUGGER_READ_AND_WRITE_ON_MSR) -SIZEOF_DEBUGGER_READ_MEMORY=sizeof(DEBUGGER_READ_MEMORY) -SIZEOF_DEBUGGER_READ_PAGE_TABLE_ENTRIES_DETAILS=sizeof(DEBUGGER_READ_PAGE_TABLE_ENTRIES_DETAILS) -SIZEOF_DEBUGGER_SEARCH_MEMORY=sizeof(DEBUGGER_SEARCH_MEMORY) -SIZEOF_DEBUGGER_SEND_COMMAND_EXECUTION_FINISHED_SIGNAL=sizeof(DEBUGGER_SEND_COMMAND_EXECUTION_FINISHED_SIGNAL) -SIZEOF_DEBUGGER_SEND_USERMODE_MESSAGES_TO_DEBUGGER=sizeof(DEBUGGER_SEND_USERMODE_MESSAGES_TO_DEBUGGER) -SIZEOF_DEBUGGER_TEST_QUERY_BUFFER=sizeof(DEBUGGER_TEST_QUERY_BUFFER) -SIZEOF_DEBUGGER_VA2PA_AND_PA2VA_COMMANDS=sizeof(DEBUGGER_VA2PA_AND_PA2VA_COMMANDS) -SIZEOF_REGISTER_EVENT=sizeof(REGISTER_NOTIFY_BUFFER) -SIZEOF_REVERSING_MACHINE_RECONSTRUCT_MEMORY_REQUEST=sizeof(REVERSING_MACHINE_RECONSTRUCT_MEMORY_REQUEST) -SIZEOF_USERMODE_DEBUGGING_THREAD_OR_PROCESS_STATE_DETAILS=sizeof(USERMODE_DEBUGGING_THREAD_OR_PROCESS_STATE_DETAILS) -SIZE_T=int -TCP_END_OF_BUFFER_CHARS_COUNT=0x4 -TCP_END_OF_BUFFER_CHAR_1=0x10 -TCP_END_OF_BUFFER_CHAR_2=0x20 -TCP_END_OF_BUFFER_CHAR_3=0x33 -TCP_END_OF_BUFFER_CHAR_4=0x44 -TOP_LEVEL_DRIVERS_VMCALL_STARTING_NUMBER=0x00000200 -UPPER_32_BITS=0xffffffff00000000 -UPPER_48_BITS=0xffffffffffff0000 -UPPER_48_BITS_AND_LOWER_8_BITS=0xffffffffffff00ff -UPPER_56_BITS=0xffffffffffffff00 -VERSION_MAJOR=1 -VERSION_MINOR=0 -VERSION_PATCH=0 -VOID=void -X86_FLAGS_FIXED=0x00000002 -X86_FLAGS_IOPL_SHIFT=(12) -X86_FLAGS_IOPL_SHIFT_2ND_BIT=(13) -X86_FLAGS_RESERVED=0xffc0802a -X86_FLAGS_RESERVED_BITS=0xffc38028 -X86_FLAGS_RESERVED_ONES=0x2 -X86_FLAGS_STATUS_MASK=(0xfff) -time_t=UINT64 + MaxSerialPacketSize = 10 * NORMAL_PAGE_SIZE + PAGE_SIZE = 4096 + DEBUGGEE_BP_APPLY_TO_ALL_CORES = 0xffffffff + DEBUGGEE_BP_APPLY_TO_ALL_PROCESSES = 0xffffffff + DEBUGGEE_BP_APPLY_TO_ALL_THREADS = 0xffffffff + DEBUGGEE_SHOW_ALL_REGISTERS = 0xffffffff + DEBUGGER_DEBUGGEE_IS_RUNNING_NO_CORE = 0xffffffff + DEBUGGER_ERROR_ACTION_BUFFER_SIZE_IS_ZERO = 0xc0000002 + DEBUGGER_ERROR_BREAKPOINT_ALREADY_DISABLED = 0xc000001b + DEBUGGER_ERROR_BREAKPOINT_ALREADY_ENABLED = 0xc000001c + DEBUGGER_ERROR_BREAKPOINT_ALREADY_EXISTS_ON_THE_ADDRESS = 0xc0000019 + DEBUGGER_ERROR_BREAKPOINT_ID_NOT_FOUND = 0xc000001a + DEBUGGER_ERROR_COULD_NOT_BUILD_THE_EPT_HOOK = 0xc0000027 + DEBUGGER_ERROR_COULD_NOT_FIND_ALLOCATION_TYPE = 0xc0000028 + DEBUGGER_ERROR_COULD_NOT_FIND_PREACTIVATION_TYPE = 0xc000004d + DEBUGGER_ERROR_DEBUGGER_ALREADY_UHIDE = 0xc000000a + DEBUGGER_ERROR_DETAILS_OR_SWITCH_PROCESS_INVALID_PARAMETER = 0xc0000020 + DEBUGGER_ERROR_DETAILS_OR_SWITCH_THREAD_INVALID_PARAMETER = 0xc0000021 + DEBUGGER_ERROR_EDIT_MEMORY_STATUS_INVALID_ADDRESS_BASED_ON_CURRENT_PROCESS = 0xc000000c + DEBUGGER_ERROR_EDIT_MEMORY_STATUS_INVALID_ADDRESS_BASED_ON_OTHER_PROCESS = 0xc000000d + DEBUGGER_ERROR_EDIT_MEMORY_STATUS_INVALID_PARAMETER = 0xc000000b + DEBUGGER_ERROR_EPT_COULD_NOT_SPLIT_THE_LARGE_PAGE_TO_4KB_PAGES = 0xc0000024 + DEBUGGER_ERROR_EPT_FAILED_TO_GET_PML1_ENTRY_OF_TARGET_ADDRESS = 0xc0000025 + DEBUGGER_ERROR_EPT_MULTIPLE_HOOKS_IN_A_SINGLE_PAGE = 0xc0000026 + DEBUGGER_ERROR_EVENT_IS_NOT_APPLIED = 0xc000001f + DEBUGGER_ERROR_EVENT_TYPE_IS_INVALID = 0xc0000003 + DEBUGGER_ERROR_EXCEPTION_INDEX_EXCEED_FIRST_32_ENTRIES = 0xc0000007 + DEBUGGER_ERROR_FUNCTIONS_FOR_INITIALIZING_PEB_ADDRESSES_ARE_NOT_INITIALIZED = 0xc000002d + DEBUGGER_ERROR_INSTANT_EVENT_ACTION_BIG_PREALLOCATED_BUFFER_NOT_FOUND = 0xc0000046 + DEBUGGER_ERROR_INSTANT_EVENT_ACTION_REGULAR_PREALLOCATED_BUFFER_NOT_FOUND = 0xc0000045 + DEBUGGER_ERROR_INSTANT_EVENT_BIG_PREALLOCATED_BUFFER_NOT_FOUND = 0xc0000043 + DEBUGGER_ERROR_INSTANT_EVENT_BIG_REQUESTED_SAFE_BUFFER_NOT_FOUND = 0xc000004a + DEBUGGER_ERROR_INSTANT_EVENT_PREALLOCATED_BUFFER_IS_NOT_ENOUGH_FOR_ACTION_BUFFER = 0xc0000047 + DEBUGGER_ERROR_INSTANT_EVENT_PREALLOCATED_BUFFER_IS_NOT_ENOUGH_FOR_EVENT_AND_CONDITIONALS = 0xc0000041 + DEBUGGER_ERROR_INSTANT_EVENT_PREALLOCATED_BUFFER_IS_NOT_ENOUGH_FOR_REQUESTED_SAFE_BUFFER = 0xc000004b + DEBUGGER_ERROR_INSTANT_EVENT_REGULAR_PREALLOCATED_BUFFER_NOT_FOUND = 0xc0000042 + DEBUGGER_ERROR_INSTANT_EVENT_REGULAR_REQUESTED_SAFE_BUFFER_NOT_FOUND = 0xc0000049 + DEBUGGER_ERROR_INSTANT_EVENT_REQUESTED_OPTIONAL_BUFFER_IS_BIGGER_THAN_DEBUGGERS_SEND_RECEIVE_STACK = 0xc0000048 + DEBUGGER_ERROR_INTERRUPT_INDEX_IS_NOT_VALID = 0xc0000008 + DEBUGGER_ERROR_INVALID_ACTION_TYPE = 0xc0000001 + DEBUGGER_ERROR_INVALID_ADDRESS = 0xc0000005 + DEBUGGER_ERROR_INVALID_CORE_ID = 0xc0000006 + DEBUGGER_ERROR_INVALID_PHYSICAL_ADDRESS = 0xc0000052 + DEBUGGER_ERROR_INVALID_PROCESS_ID = 0xc000001e + DEBUGGER_ERROR_INVALID_REGISTER_NUMBER = 0xc0000017 + DEBUGGER_ERROR_INVALID_TEST_QUERY_INDEX = 0xc0000029 + DEBUGGER_ERROR_INVALID_THREAD_DEBUGGING_TOKEN = 0xc0000030 + DEBUGGER_ERROR_MAXIMUM_BREAKPOINT_FOR_A_SINGLE_PAGE_IS_HIT = 0xc0000022 + DEBUGGER_ERROR_MAXIMUM_BREAKPOINT_WITHOUT_CONTINUE = 0xc0000018 + DEBUGGER_ERROR_MEMORY_TYPE_INVALID = 0xc000001d + DEBUGGER_ERROR_MODE_EXECUTION_IS_INVALID = 0xc000003f + DEBUGGER_ERROR_MODIFY_EVENTS_INVALID_TAG = 0xc000000e + DEBUGGER_ERROR_MODIFY_EVENTS_INVALID_TYPE_OF_ACTION = 0xc000000f + DEBUGGER_ERROR_NOT_ALL_CORES_ARE_LOCKED_FOR_APPLYING_INSTANT_EVENT = 0xc0000050 + DEBUGGER_ERROR_PREPARING_DEBUGGEE_INVALID_BAUDRATE = 0xc0000012 + DEBUGGER_ERROR_PREPARING_DEBUGGEE_INVALID_CORE_IN_REMOTE_DEBUGGE = 0xc0000014 + DEBUGGER_ERROR_PREPARING_DEBUGGEE_INVALID_SERIAL_PORT = 0xc0000013 + DEBUGGER_ERROR_PREPARING_DEBUGGEE_TO_RUN_SCRIPT = 0xc0000016 + DEBUGGER_ERROR_PREPARING_DEBUGGEE_UNABLE_TO_SWITCH_TO_NEW_PROCESS = 0xc0000015 + DEBUGGER_ERROR_PRE_ALLOCATED_BUFFER_IS_EMPTY = 0xc0000023 + DEBUGGER_ERROR_PROCESS_ID_CANNOT_BE_SPECIFIED_WHILE_APPLYING_EVENT_FROM_VMX_ROOT_MODE = 0xc0000040 + DEBUGGER_ERROR_READING_MEMORY_INVALID_PARAMETER = 0xc000003c + DEBUGGER_ERROR_STEPPINGS_EITHER_THREAD_NOT_FOUND_OR_DISABLED = 0xc0000011 + DEBUGGER_ERROR_STEPPING_INVALID_PARAMETER = 0xc0000010 + DEBUGGER_ERROR_TAG_NOT_EXISTS = 0xc0000000 + DEBUGGER_ERROR_TARGET_SWITCHING_CORE_IS_NOT_LOCKED = 0xc0000051 + DEBUGGER_ERROR_THE_MODE_EXEC_TRAP_IS_NOT_INITIALIZED = 0xc000004e + DEBUGGER_ERROR_THE_TARGET_EVENT_IS_DISABLED_BUT_CANNOT_BE_CLEARED_PRIRITY_BUFFER_IS_FULL = 0xc000004f + DEBUGGER_ERROR_THE_TRAP_FLAG_LIST_IS_FULL = 0xc000003d + DEBUGGER_ERROR_THE_USER_DEBUGGER_NOT_ATTACHED_TO_THE_PROCESS = 0xc0000033 + DEBUGGER_ERROR_UNABLE_TO_ALLOCATE_REQUESTED_SAFE_BUFFER = 0xc000004c + DEBUGGER_ERROR_UNABLE_TO_ATTACH_TO_AN_ALREADY_ATTACHED_PROCESS = 0xc0000032 + DEBUGGER_ERROR_UNABLE_TO_ATTACH_TO_TARGET_USER_MODE_PROCESS = 0xc000002a + DEBUGGER_ERROR_UNABLE_TO_CREATE_ACTION_CANNOT_ALLOCATE_BUFFER = 0xc0000044 + DEBUGGER_ERROR_UNABLE_TO_CREATE_EVENT = 0xc0000004 + DEBUGGER_ERROR_UNABLE_TO_DETACH_AS_THERE_ARE_PAUSED_THREADS = 0xc0000034 + DEBUGGER_ERROR_UNABLE_TO_DETECT_32_BIT_OR_64_BIT_PROCESS = 0xc000002e + DEBUGGER_ERROR_UNABLE_TO_GET_CALLSTACK = 0xc0000038 + DEBUGGER_ERROR_UNABLE_TO_GET_MODULES_OF_THE_PROCESS = 0xc0000037 + DEBUGGER_ERROR_UNABLE_TO_HIDE_OR_UNHIDE_DEBUGGER = 0xc0000009 + DEBUGGER_ERROR_UNABLE_TO_KILL_THE_PROCESS = 0xc000002f + DEBUGGER_ERROR_UNABLE_TO_KILL_THE_PROCESS_DOES_NOT_EXISTS = 0xc000003e + DEBUGGER_ERROR_UNABLE_TO_PAUSE_THE_PROCESS_THREADS = 0xc0000031 + DEBUGGER_ERROR_UNABLE_TO_QUERY_COUNT_OF_PROCESSES_OR_THREADS = 0xc0000039 + DEBUGGER_ERROR_UNABLE_TO_REMOVE_HOOKS = 0xc000002c + DEBUGGER_ERROR_UNABLE_TO_REMOVE_HOOKS_ENTRYPOINT_NOT_REACHED = 0xc000002b + DEBUGGER_ERROR_UNABLE_TO_SWITCH_PROCESS_ID_OR_THREAD_ID_IS_INVALID = 0xc0000035 + DEBUGGER_ERROR_UNABLE_TO_SWITCH_THERE_IS_NO_THREAD_ON_THE_PROCESS = 0xc0000036 + DEBUGGER_ERROR_UNKNOWN_TEST_QUERY_RECEIVED = 0xc000003b + DEBUGGER_ERROR_USING_SHORT_CIRCUITING_EVENT_WITH_POST_EVENT_MODE_IS_FORBIDDEDN = 0xc000003a + DEBUGGER_EVENT_ALL_IO_PORTS = 0xffffffff + DEBUGGER_EVENT_APPLY_TO_ALL_CORES = 0xffffffff + DEBUGGER_EVENT_APPLY_TO_ALL_PROCESSES = 0xffffffff + DEBUGGER_EVENT_EXCEPTIONS_ALL_FIRST_32_ENTRIES = 0xffffffff + DEBUGGER_EVENT_MSR_READ_OR_WRITE_ALL_MSRS = 0xffffffff + DEBUGGER_EVENT_SYSCALL_ALL_SYSRET_OR_SYSCALLS = 0xffffffff + DEBUGGER_MODIFY_EVENTS_APPLY_TO_ALL_TAG = 0xffffffffffffffff + DEBUGGER_OPERATION_WAS_SUCCESSFUL = 0xFFFFFFFF + DEBUGGER_READ_AND_WRITE_ON_MSR_APPLY_ALL_CORES = 0xffffffff + DEBUGGER_REMOTE_TRACKING_DEFAULT_COUNT_OF_STEPPING = 0xffffffff + DEFAULT_INITIAL_DEBUGGEE_TO_DEBUGGER_OFFSET = 0x200 + DEFAULT_INITIAL_DEBUGGER_TO_DEBUGGEE_OFFSET = 0x0 + DEFAULT_PORT = "50000" + DISASSEMBLY_MAXIMUM_DISTANCE_FROM_OBJECT_NAME = 0xffff + DbgPrintLimitation = 512 + DebuggerEventTagStartSeed = 0x1000000 + DebuggerOutputSourceMaximumRemoteSourceForSingleEvent = 0x5 + DebuggerOutputSourceTagStartSeed = 0x1 + DebuggerScriptEngineMemcpyMovingBufferSize = 64 + DebuggerThreadDebuggingTagStartSeed = 0x1000000 + INDICATOR_OF_HYPERDBG_PACKET = 0x4859504552444247 + MAXIMUM_BIG_INSTANT_EVENTS = 0 + MAXIMUM_BREAKPOINTS_WITHOUT_CONTINUE = 100 + MAXIMUM_CALL_INSTR_SIZE = 7 + MAXIMUM_CHARACTER_FOR_OS_NAME = 256 + MAXIMUM_GUID_AND_AGE_SIZE = 60 + MAXIMUM_INSTR_SIZE = 16 + MAXIMUM_NUMBER_OF_INITIAL_PREALLOCATED_EPT_HOOKS = 5 + MAXIMUM_NUMBER_OF_THREAD_INFORMATION_FOR_TRAPS = 200 + MAXIMUM_REGULAR_INSTANT_EVENTS = 20 + MAXIMUM_SUPPORTED_SYMBOLS = 1000 + MAX_FUNCTION_NAME_LENGTH = 32 + MAX_PATH = 260 + MAX_STACK_BUFFER_COUNT = 128 + MAX_TEMP_COUNT = 128 + MAX_VAR_COUNT = 512 + METHOD_BUFFERED = 0 + MaximumPacketsCapacity = 1000 + MaximumPacketsCapacityPriority = 50 + MaximumSearchResults = 0x1000 + NORMAL_PAGE_SIZE = 4096 + NULL64_ZERO = 0 + NULL_ZERO = 0 + OPERATION_LOG_ERROR_MESSAGE = 3 + OPERATION_LOG_INFO_MESSAGE = 1 + OPERATION_LOG_NON_IMMEDIATE_MESSAGE = 4 + OPERATION_LOG_WARNING_MESSAGE = 2 + OPERATION_LOG_WITH_TAG = 5 + POOLTAG = 0x48444247 + SECOND_LOWER_8_BITS = 0x000000000000ff00 + SERIAL_END_OF_BUFFER_CHARS_COUNT = 0x4 + SERIAL_END_OF_BUFFER_CHAR_1 = 0x00 + SERIAL_END_OF_BUFFER_CHAR_2 = 0x80 + SERIAL_END_OF_BUFFER_CHAR_3 = 0xEE + SERIAL_END_OF_BUFFER_CHAR_4 = 0xFF + TCP_END_OF_BUFFER_CHARS_COUNT = 0x4 + TCP_END_OF_BUFFER_CHAR_1 = 0x10 + TCP_END_OF_BUFFER_CHAR_2 = 0x20 + TCP_END_OF_BUFFER_CHAR_3 = 0x33 + TCP_END_OF_BUFFER_CHAR_4 = 0x44 + TOP_LEVEL_DRIVERS_VMCALL_STARTING_NUMBER = 0x00000200 + UPPER_32_BITS = 0xffffffff00000000 + UPPER_48_BITS = 0xffffffffffff0000 + UPPER_48_BITS_AND_LOWER_8_BITS = 0xffffffffffff00ff + UPPER_56_BITS = 0xffffffffffffff00 + VERSION_MAJOR = 1 + VERSION_MINOR = 0 + VERSION_PATCH = 0 + X86_FLAGS_FIXED = 0x00000002 + X86_FLAGS_IOPL_SHIFT = (12) + X86_FLAGS_IOPL_SHIFT_2ND_BIT = (13) + X86_FLAGS_RESERVED = 0xffc0802a + X86_FLAGS_RESERVED_BITS = 0xffc38028 + X86_FLAGS_RESERVED_ONES = 0x2 ) From 0286a85da85094cfdaf171c659650340957647f5 Mon Sep 17 00:00:00 2001 From: Admin <2762713521@qq.com> Date: Fri, 21 Jun 2024 00:19:58 +0800 Subject: [PATCH 05/25] TestBindMacros --- gengo/bind/sdkMerge/sdk_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gengo/bind/sdkMerge/sdk_test.go b/gengo/bind/sdkMerge/sdk_test.go index 3bad9b1a3..ef178f7be 100644 --- a/gengo/bind/sdkMerge/sdk_test.go +++ b/gengo/bind/sdkMerge/sdk_test.go @@ -38,7 +38,7 @@ func TestBindMacros(t *testing.T) { vars.WriteStringLn("MaxSerialPacketSize =10 * NORMAL_PAGE_SIZE") // todo need first define NORMAL_PAGE_SIZE vars.WriteStringLn("PAGE_SIZE = 4096") - skips := []string{ + skips := []string{ //todo 读取 combined_headers.h 保存 #define 开头的到一个map,这样原始问津的特征就完美匹配了 "BUILD_", "FILE_DEVICE_UNKNOWN", "FILE_ANY_ACCESS", From 7e37313ae56abfca2c92b05280da380c83314981 Mon Sep 17 00:00:00 2001 From: Admin <2762713521@qq.com> Date: Fri, 21 Jun 2024 00:26:05 +0800 Subject: [PATCH 06/25] TestBindMacros --- gengo/bind/sdkMerge/sdk_test.go | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/gengo/bind/sdkMerge/sdk_test.go b/gengo/bind/sdkMerge/sdk_test.go index ef178f7be..f1f7a17c0 100644 --- a/gengo/bind/sdkMerge/sdk_test.go +++ b/gengo/bind/sdkMerge/sdk_test.go @@ -5,6 +5,8 @@ import ( "testing" "unicode" + "github.com/ddkwork/golibrary/stream/maps" + "github.com/ddkwork/golibrary/stream" "github.com/can1357/gengo/clang" @@ -38,7 +40,21 @@ func TestBindMacros(t *testing.T) { vars.WriteStringLn("MaxSerialPacketSize =10 * NORMAL_PAGE_SIZE") // todo need first define NORMAL_PAGE_SIZE vars.WriteStringLn("PAGE_SIZE = 4096") - skips := []string{ //todo 读取 combined_headers.h 保存 #define 开头的到一个map,这样原始问津的特征就完美匹配了 + newVarsBody := stream.NewBuffer("") + + m := new(maps.SafeMap[string, bool]) + toLines := stream.NewBuffer("combined_headers.h").ToLines() + for _, line := range toLines { + m.Range(func(k string, v bool) bool { //todo bug + if strings.HasPrefix(line, k) { + newVarsBody.WriteStringLn(line) + return true + } + return false + }) + } + + skips := []string{ // todo 读取 combined_headers.h 保存 #define 开头的到一个map,这样原始问津的特征就完美匹配了 "BUILD_", "FILE_DEVICE_UNKNOWN", "FILE_ANY_ACCESS", From e57697ffaddd8ff52b8d7fdc2aa34919628488a6 Mon Sep 17 00:00:00 2001 From: Admin <2762713521@qq.com> Date: Fri, 21 Jun 2024 01:53:54 +0800 Subject: [PATCH 07/25] TestBindMacros --- gengo/bind/sdkMerge/sdk_test.go | 66 +++++++++++++++------------------ 1 file changed, 30 insertions(+), 36 deletions(-) diff --git a/gengo/bind/sdkMerge/sdk_test.go b/gengo/bind/sdkMerge/sdk_test.go index f1f7a17c0..cf48e9718 100644 --- a/gengo/bind/sdkMerge/sdk_test.go +++ b/gengo/bind/sdkMerge/sdk_test.go @@ -15,7 +15,7 @@ import ( "github.com/ddkwork/golibrary/mylog" ) -func mergeHeader() { +func mergeHeader() { // todo need merge func } // ContainsLetter 检查字符串中是否包含字母 @@ -31,9 +31,23 @@ func ContainsLetter(s string) bool { return false } +func MacrosInHeader() (lines []string) { + lines = make([]string, 0) + for _, s := range stream.NewBuffer("macros.log").ToLines() { + for _, s2 := range stream.NewBuffer("combined_headers.h").ToLines() { + if strings.Contains(s2, s) { + lines = append(lines, s) + } + } + } + return +} + func TestBindMacros(t *testing.T) { mylog.Todo("handle macros func like CTL_CODE(DeviceType,Function,Method,Access) ( ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method)) ") + mustPrefixs := MacrosInHeader() + vars := stream.NewBuffer("") vars.WriteStringLn("package sdk") vars.WriteStringLn("var (") @@ -45,7 +59,7 @@ func TestBindMacros(t *testing.T) { m := new(maps.SafeMap[string, bool]) toLines := stream.NewBuffer("combined_headers.h").ToLines() for _, line := range toLines { - m.Range(func(k string, v bool) bool { //todo bug + m.Range(func(k string, v bool) bool { // todo bug if strings.HasPrefix(line, k) { newVarsBody.WriteStringLn(line) return true @@ -54,45 +68,25 @@ func TestBindMacros(t *testing.T) { }) } - skips := []string{ // todo 读取 combined_headers.h 保存 #define 开头的到一个map,这样原始问津的特征就完美匹配了 - "BUILD_", - "FILE_DEVICE_UNKNOWN", - "FILE_ANY_ACCESS", - "FALSE", - "TRUE", - "_", - "LO", - "VOID", - "time_t", - //"", - //"", - } lines := stream.NewBuffer("macros.log").ToLines() for _, line := range lines { line = strings.TrimPrefix(line, "#define ") - //line = strings.TrimSpace(line) - stop := false - for _, skip := range skips { + for _, skip := range mustPrefixs { if strings.HasPrefix(line, skip) { - stop = true - continue - } - } - if !stop { - line = strings.TrimSpace(line) - line = strings.TrimSuffix(line, " ") - println(line) - if strings.Count(line, " ") == 1 { - split := strings.Split(line, " ") - split[1] = strings.TrimSuffix(split[1], "ull") - split[1] = strings.TrimSuffix(split[1], "U") - - if ContainsLetter(split[1]) { - mylog.Todo(split[1]) - continue + line = strings.TrimSpace(line) + line = strings.TrimSuffix(line, " ") + if strings.Count(line, " ") == 1 { + split := strings.Split(line, " ") + split[1] = strings.TrimSuffix(split[1], "ull") + split[1] = strings.TrimSuffix(split[1], "U") + + if ContainsLetter(split[1]) { + mylog.Todo(split[1]) + continue + } + + vars.WriteStringLn(split[0] + "=" + split[1]) } - - vars.WriteStringLn(split[0] + "=" + split[1]) } } } From d43ee03f121c5715472ed37a2636831dadd70c0d Mon Sep 17 00:00:00 2001 From: Admin <2762713521@qq.com> Date: Fri, 21 Jun 2024 01:59:45 +0800 Subject: [PATCH 08/25] TestBindMacros --- gengo/bind/sdkMerge/sdk_test.go | 12 +-- gengo/bind/sdkMerge/tmp/vars.go | 167 -------------------------------- 2 files changed, 6 insertions(+), 173 deletions(-) diff --git a/gengo/bind/sdkMerge/sdk_test.go b/gengo/bind/sdkMerge/sdk_test.go index cf48e9718..b0612b192 100644 --- a/gengo/bind/sdkMerge/sdk_test.go +++ b/gengo/bind/sdkMerge/sdk_test.go @@ -31,12 +31,12 @@ func ContainsLetter(s string) bool { return false } -func MacrosInHeader() (lines []string) { - lines = make([]string, 0) +func MacrosInHeader() (m *maps.SafeMap[string, bool]) { + m = new(maps.SafeMap[string, bool]) for _, s := range stream.NewBuffer("macros.log").ToLines() { for _, s2 := range stream.NewBuffer("combined_headers.h").ToLines() { - if strings.Contains(s2, s) { - lines = append(lines, s) + if strings.HasPrefix(s, s2) { + m.Set(s, true) } } } @@ -45,8 +45,8 @@ func MacrosInHeader() (lines []string) { func TestBindMacros(t *testing.T) { mylog.Todo("handle macros func like CTL_CODE(DeviceType,Function,Method,Access) ( ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method)) ") - mustPrefixs := MacrosInHeader() + mylog.Trace("number of macros: %d", mustPrefixs.Len()) vars := stream.NewBuffer("") vars.WriteStringLn("package sdk") @@ -71,7 +71,7 @@ func TestBindMacros(t *testing.T) { lines := stream.NewBuffer("macros.log").ToLines() for _, line := range lines { line = strings.TrimPrefix(line, "#define ") - for _, skip := range mustPrefixs { + for _, skip := range mustPrefixs.Keys() { if strings.HasPrefix(line, skip) { line = strings.TrimSpace(line) line = strings.TrimSuffix(line, " ") diff --git a/gengo/bind/sdkMerge/tmp/vars.go b/gengo/bind/sdkMerge/tmp/vars.go index aed476d2f..0919fd1b0 100644 --- a/gengo/bind/sdkMerge/tmp/vars.go +++ b/gengo/bind/sdkMerge/tmp/vars.go @@ -1,168 +1 @@ package sdk - -var ( - MaxSerialPacketSize = 10 * NORMAL_PAGE_SIZE - PAGE_SIZE = 4096 - DEBUGGEE_BP_APPLY_TO_ALL_CORES = 0xffffffff - DEBUGGEE_BP_APPLY_TO_ALL_PROCESSES = 0xffffffff - DEBUGGEE_BP_APPLY_TO_ALL_THREADS = 0xffffffff - DEBUGGEE_SHOW_ALL_REGISTERS = 0xffffffff - DEBUGGER_DEBUGGEE_IS_RUNNING_NO_CORE = 0xffffffff - DEBUGGER_ERROR_ACTION_BUFFER_SIZE_IS_ZERO = 0xc0000002 - DEBUGGER_ERROR_BREAKPOINT_ALREADY_DISABLED = 0xc000001b - DEBUGGER_ERROR_BREAKPOINT_ALREADY_ENABLED = 0xc000001c - DEBUGGER_ERROR_BREAKPOINT_ALREADY_EXISTS_ON_THE_ADDRESS = 0xc0000019 - DEBUGGER_ERROR_BREAKPOINT_ID_NOT_FOUND = 0xc000001a - DEBUGGER_ERROR_COULD_NOT_BUILD_THE_EPT_HOOK = 0xc0000027 - DEBUGGER_ERROR_COULD_NOT_FIND_ALLOCATION_TYPE = 0xc0000028 - DEBUGGER_ERROR_COULD_NOT_FIND_PREACTIVATION_TYPE = 0xc000004d - DEBUGGER_ERROR_DEBUGGER_ALREADY_UHIDE = 0xc000000a - DEBUGGER_ERROR_DETAILS_OR_SWITCH_PROCESS_INVALID_PARAMETER = 0xc0000020 - DEBUGGER_ERROR_DETAILS_OR_SWITCH_THREAD_INVALID_PARAMETER = 0xc0000021 - DEBUGGER_ERROR_EDIT_MEMORY_STATUS_INVALID_ADDRESS_BASED_ON_CURRENT_PROCESS = 0xc000000c - DEBUGGER_ERROR_EDIT_MEMORY_STATUS_INVALID_ADDRESS_BASED_ON_OTHER_PROCESS = 0xc000000d - DEBUGGER_ERROR_EDIT_MEMORY_STATUS_INVALID_PARAMETER = 0xc000000b - DEBUGGER_ERROR_EPT_COULD_NOT_SPLIT_THE_LARGE_PAGE_TO_4KB_PAGES = 0xc0000024 - DEBUGGER_ERROR_EPT_FAILED_TO_GET_PML1_ENTRY_OF_TARGET_ADDRESS = 0xc0000025 - DEBUGGER_ERROR_EPT_MULTIPLE_HOOKS_IN_A_SINGLE_PAGE = 0xc0000026 - DEBUGGER_ERROR_EVENT_IS_NOT_APPLIED = 0xc000001f - DEBUGGER_ERROR_EVENT_TYPE_IS_INVALID = 0xc0000003 - DEBUGGER_ERROR_EXCEPTION_INDEX_EXCEED_FIRST_32_ENTRIES = 0xc0000007 - DEBUGGER_ERROR_FUNCTIONS_FOR_INITIALIZING_PEB_ADDRESSES_ARE_NOT_INITIALIZED = 0xc000002d - DEBUGGER_ERROR_INSTANT_EVENT_ACTION_BIG_PREALLOCATED_BUFFER_NOT_FOUND = 0xc0000046 - DEBUGGER_ERROR_INSTANT_EVENT_ACTION_REGULAR_PREALLOCATED_BUFFER_NOT_FOUND = 0xc0000045 - DEBUGGER_ERROR_INSTANT_EVENT_BIG_PREALLOCATED_BUFFER_NOT_FOUND = 0xc0000043 - DEBUGGER_ERROR_INSTANT_EVENT_BIG_REQUESTED_SAFE_BUFFER_NOT_FOUND = 0xc000004a - DEBUGGER_ERROR_INSTANT_EVENT_PREALLOCATED_BUFFER_IS_NOT_ENOUGH_FOR_ACTION_BUFFER = 0xc0000047 - DEBUGGER_ERROR_INSTANT_EVENT_PREALLOCATED_BUFFER_IS_NOT_ENOUGH_FOR_EVENT_AND_CONDITIONALS = 0xc0000041 - DEBUGGER_ERROR_INSTANT_EVENT_PREALLOCATED_BUFFER_IS_NOT_ENOUGH_FOR_REQUESTED_SAFE_BUFFER = 0xc000004b - DEBUGGER_ERROR_INSTANT_EVENT_REGULAR_PREALLOCATED_BUFFER_NOT_FOUND = 0xc0000042 - DEBUGGER_ERROR_INSTANT_EVENT_REGULAR_REQUESTED_SAFE_BUFFER_NOT_FOUND = 0xc0000049 - DEBUGGER_ERROR_INSTANT_EVENT_REQUESTED_OPTIONAL_BUFFER_IS_BIGGER_THAN_DEBUGGERS_SEND_RECEIVE_STACK = 0xc0000048 - DEBUGGER_ERROR_INTERRUPT_INDEX_IS_NOT_VALID = 0xc0000008 - DEBUGGER_ERROR_INVALID_ACTION_TYPE = 0xc0000001 - DEBUGGER_ERROR_INVALID_ADDRESS = 0xc0000005 - DEBUGGER_ERROR_INVALID_CORE_ID = 0xc0000006 - DEBUGGER_ERROR_INVALID_PHYSICAL_ADDRESS = 0xc0000052 - DEBUGGER_ERROR_INVALID_PROCESS_ID = 0xc000001e - DEBUGGER_ERROR_INVALID_REGISTER_NUMBER = 0xc0000017 - DEBUGGER_ERROR_INVALID_TEST_QUERY_INDEX = 0xc0000029 - DEBUGGER_ERROR_INVALID_THREAD_DEBUGGING_TOKEN = 0xc0000030 - DEBUGGER_ERROR_MAXIMUM_BREAKPOINT_FOR_A_SINGLE_PAGE_IS_HIT = 0xc0000022 - DEBUGGER_ERROR_MAXIMUM_BREAKPOINT_WITHOUT_CONTINUE = 0xc0000018 - DEBUGGER_ERROR_MEMORY_TYPE_INVALID = 0xc000001d - DEBUGGER_ERROR_MODE_EXECUTION_IS_INVALID = 0xc000003f - DEBUGGER_ERROR_MODIFY_EVENTS_INVALID_TAG = 0xc000000e - DEBUGGER_ERROR_MODIFY_EVENTS_INVALID_TYPE_OF_ACTION = 0xc000000f - DEBUGGER_ERROR_NOT_ALL_CORES_ARE_LOCKED_FOR_APPLYING_INSTANT_EVENT = 0xc0000050 - DEBUGGER_ERROR_PREPARING_DEBUGGEE_INVALID_BAUDRATE = 0xc0000012 - DEBUGGER_ERROR_PREPARING_DEBUGGEE_INVALID_CORE_IN_REMOTE_DEBUGGE = 0xc0000014 - DEBUGGER_ERROR_PREPARING_DEBUGGEE_INVALID_SERIAL_PORT = 0xc0000013 - DEBUGGER_ERROR_PREPARING_DEBUGGEE_TO_RUN_SCRIPT = 0xc0000016 - DEBUGGER_ERROR_PREPARING_DEBUGGEE_UNABLE_TO_SWITCH_TO_NEW_PROCESS = 0xc0000015 - DEBUGGER_ERROR_PRE_ALLOCATED_BUFFER_IS_EMPTY = 0xc0000023 - DEBUGGER_ERROR_PROCESS_ID_CANNOT_BE_SPECIFIED_WHILE_APPLYING_EVENT_FROM_VMX_ROOT_MODE = 0xc0000040 - DEBUGGER_ERROR_READING_MEMORY_INVALID_PARAMETER = 0xc000003c - DEBUGGER_ERROR_STEPPINGS_EITHER_THREAD_NOT_FOUND_OR_DISABLED = 0xc0000011 - DEBUGGER_ERROR_STEPPING_INVALID_PARAMETER = 0xc0000010 - DEBUGGER_ERROR_TAG_NOT_EXISTS = 0xc0000000 - DEBUGGER_ERROR_TARGET_SWITCHING_CORE_IS_NOT_LOCKED = 0xc0000051 - DEBUGGER_ERROR_THE_MODE_EXEC_TRAP_IS_NOT_INITIALIZED = 0xc000004e - DEBUGGER_ERROR_THE_TARGET_EVENT_IS_DISABLED_BUT_CANNOT_BE_CLEARED_PRIRITY_BUFFER_IS_FULL = 0xc000004f - DEBUGGER_ERROR_THE_TRAP_FLAG_LIST_IS_FULL = 0xc000003d - DEBUGGER_ERROR_THE_USER_DEBUGGER_NOT_ATTACHED_TO_THE_PROCESS = 0xc0000033 - DEBUGGER_ERROR_UNABLE_TO_ALLOCATE_REQUESTED_SAFE_BUFFER = 0xc000004c - DEBUGGER_ERROR_UNABLE_TO_ATTACH_TO_AN_ALREADY_ATTACHED_PROCESS = 0xc0000032 - DEBUGGER_ERROR_UNABLE_TO_ATTACH_TO_TARGET_USER_MODE_PROCESS = 0xc000002a - DEBUGGER_ERROR_UNABLE_TO_CREATE_ACTION_CANNOT_ALLOCATE_BUFFER = 0xc0000044 - DEBUGGER_ERROR_UNABLE_TO_CREATE_EVENT = 0xc0000004 - DEBUGGER_ERROR_UNABLE_TO_DETACH_AS_THERE_ARE_PAUSED_THREADS = 0xc0000034 - DEBUGGER_ERROR_UNABLE_TO_DETECT_32_BIT_OR_64_BIT_PROCESS = 0xc000002e - DEBUGGER_ERROR_UNABLE_TO_GET_CALLSTACK = 0xc0000038 - DEBUGGER_ERROR_UNABLE_TO_GET_MODULES_OF_THE_PROCESS = 0xc0000037 - DEBUGGER_ERROR_UNABLE_TO_HIDE_OR_UNHIDE_DEBUGGER = 0xc0000009 - DEBUGGER_ERROR_UNABLE_TO_KILL_THE_PROCESS = 0xc000002f - DEBUGGER_ERROR_UNABLE_TO_KILL_THE_PROCESS_DOES_NOT_EXISTS = 0xc000003e - DEBUGGER_ERROR_UNABLE_TO_PAUSE_THE_PROCESS_THREADS = 0xc0000031 - DEBUGGER_ERROR_UNABLE_TO_QUERY_COUNT_OF_PROCESSES_OR_THREADS = 0xc0000039 - DEBUGGER_ERROR_UNABLE_TO_REMOVE_HOOKS = 0xc000002c - DEBUGGER_ERROR_UNABLE_TO_REMOVE_HOOKS_ENTRYPOINT_NOT_REACHED = 0xc000002b - DEBUGGER_ERROR_UNABLE_TO_SWITCH_PROCESS_ID_OR_THREAD_ID_IS_INVALID = 0xc0000035 - DEBUGGER_ERROR_UNABLE_TO_SWITCH_THERE_IS_NO_THREAD_ON_THE_PROCESS = 0xc0000036 - DEBUGGER_ERROR_UNKNOWN_TEST_QUERY_RECEIVED = 0xc000003b - DEBUGGER_ERROR_USING_SHORT_CIRCUITING_EVENT_WITH_POST_EVENT_MODE_IS_FORBIDDEDN = 0xc000003a - DEBUGGER_EVENT_ALL_IO_PORTS = 0xffffffff - DEBUGGER_EVENT_APPLY_TO_ALL_CORES = 0xffffffff - DEBUGGER_EVENT_APPLY_TO_ALL_PROCESSES = 0xffffffff - DEBUGGER_EVENT_EXCEPTIONS_ALL_FIRST_32_ENTRIES = 0xffffffff - DEBUGGER_EVENT_MSR_READ_OR_WRITE_ALL_MSRS = 0xffffffff - DEBUGGER_EVENT_SYSCALL_ALL_SYSRET_OR_SYSCALLS = 0xffffffff - DEBUGGER_MODIFY_EVENTS_APPLY_TO_ALL_TAG = 0xffffffffffffffff - DEBUGGER_OPERATION_WAS_SUCCESSFUL = 0xFFFFFFFF - DEBUGGER_READ_AND_WRITE_ON_MSR_APPLY_ALL_CORES = 0xffffffff - DEBUGGER_REMOTE_TRACKING_DEFAULT_COUNT_OF_STEPPING = 0xffffffff - DEFAULT_INITIAL_DEBUGGEE_TO_DEBUGGER_OFFSET = 0x200 - DEFAULT_INITIAL_DEBUGGER_TO_DEBUGGEE_OFFSET = 0x0 - DEFAULT_PORT = "50000" - DISASSEMBLY_MAXIMUM_DISTANCE_FROM_OBJECT_NAME = 0xffff - DbgPrintLimitation = 512 - DebuggerEventTagStartSeed = 0x1000000 - DebuggerOutputSourceMaximumRemoteSourceForSingleEvent = 0x5 - DebuggerOutputSourceTagStartSeed = 0x1 - DebuggerScriptEngineMemcpyMovingBufferSize = 64 - DebuggerThreadDebuggingTagStartSeed = 0x1000000 - INDICATOR_OF_HYPERDBG_PACKET = 0x4859504552444247 - MAXIMUM_BIG_INSTANT_EVENTS = 0 - MAXIMUM_BREAKPOINTS_WITHOUT_CONTINUE = 100 - MAXIMUM_CALL_INSTR_SIZE = 7 - MAXIMUM_CHARACTER_FOR_OS_NAME = 256 - MAXIMUM_GUID_AND_AGE_SIZE = 60 - MAXIMUM_INSTR_SIZE = 16 - MAXIMUM_NUMBER_OF_INITIAL_PREALLOCATED_EPT_HOOKS = 5 - MAXIMUM_NUMBER_OF_THREAD_INFORMATION_FOR_TRAPS = 200 - MAXIMUM_REGULAR_INSTANT_EVENTS = 20 - MAXIMUM_SUPPORTED_SYMBOLS = 1000 - MAX_FUNCTION_NAME_LENGTH = 32 - MAX_PATH = 260 - MAX_STACK_BUFFER_COUNT = 128 - MAX_TEMP_COUNT = 128 - MAX_VAR_COUNT = 512 - METHOD_BUFFERED = 0 - MaximumPacketsCapacity = 1000 - MaximumPacketsCapacityPriority = 50 - MaximumSearchResults = 0x1000 - NORMAL_PAGE_SIZE = 4096 - NULL64_ZERO = 0 - NULL_ZERO = 0 - OPERATION_LOG_ERROR_MESSAGE = 3 - OPERATION_LOG_INFO_MESSAGE = 1 - OPERATION_LOG_NON_IMMEDIATE_MESSAGE = 4 - OPERATION_LOG_WARNING_MESSAGE = 2 - OPERATION_LOG_WITH_TAG = 5 - POOLTAG = 0x48444247 - SECOND_LOWER_8_BITS = 0x000000000000ff00 - SERIAL_END_OF_BUFFER_CHARS_COUNT = 0x4 - SERIAL_END_OF_BUFFER_CHAR_1 = 0x00 - SERIAL_END_OF_BUFFER_CHAR_2 = 0x80 - SERIAL_END_OF_BUFFER_CHAR_3 = 0xEE - SERIAL_END_OF_BUFFER_CHAR_4 = 0xFF - TCP_END_OF_BUFFER_CHARS_COUNT = 0x4 - TCP_END_OF_BUFFER_CHAR_1 = 0x10 - TCP_END_OF_BUFFER_CHAR_2 = 0x20 - TCP_END_OF_BUFFER_CHAR_3 = 0x33 - TCP_END_OF_BUFFER_CHAR_4 = 0x44 - TOP_LEVEL_DRIVERS_VMCALL_STARTING_NUMBER = 0x00000200 - UPPER_32_BITS = 0xffffffff00000000 - UPPER_48_BITS = 0xffffffffffff0000 - UPPER_48_BITS_AND_LOWER_8_BITS = 0xffffffffffff00ff - UPPER_56_BITS = 0xffffffffffffff00 - VERSION_MAJOR = 1 - VERSION_MINOR = 0 - VERSION_PATCH = 0 - X86_FLAGS_FIXED = 0x00000002 - X86_FLAGS_IOPL_SHIFT = (12) - X86_FLAGS_IOPL_SHIFT_2ND_BIT = (13) - X86_FLAGS_RESERVED = 0xffc0802a - X86_FLAGS_RESERVED_BITS = 0xffc38028 - X86_FLAGS_RESERVED_ONES = 0x2 -) From a22d031b904f0a209a46fc1798e9af0a89d8cd5a Mon Sep 17 00:00:00 2001 From: Admin <2762713521@qq.com> Date: Fri, 21 Jun 2024 02:07:10 +0800 Subject: [PATCH 09/25] TestBindMacros --- gengo/bind/sdkMerge/sdk_test.go | 73 +++++++++++++++------------------ 1 file changed, 34 insertions(+), 39 deletions(-) diff --git a/gengo/bind/sdkMerge/sdk_test.go b/gengo/bind/sdkMerge/sdk_test.go index b0612b192..ba3e6d506 100644 --- a/gengo/bind/sdkMerge/sdk_test.go +++ b/gengo/bind/sdkMerge/sdk_test.go @@ -48,50 +48,45 @@ func TestBindMacros(t *testing.T) { mustPrefixs := MacrosInHeader() mylog.Trace("number of macros: %d", mustPrefixs.Len()) - vars := stream.NewBuffer("") - vars.WriteStringLn("package sdk") - vars.WriteStringLn("var (") - vars.WriteStringLn("MaxSerialPacketSize =10 * NORMAL_PAGE_SIZE") // todo need first define NORMAL_PAGE_SIZE - vars.WriteStringLn("PAGE_SIZE = 4096") - - newVarsBody := stream.NewBuffer("") - - m := new(maps.SafeMap[string, bool]) - toLines := stream.NewBuffer("combined_headers.h").ToLines() - for _, line := range toLines { - m.Range(func(k string, v bool) bool { // todo bug - if strings.HasPrefix(line, k) { - newVarsBody.WriteStringLn(line) - return true + g := stream.NewGeneratedFile() + g.P("package sdk") + g.P() + g.P("const (") + g.P("MaxSerialPacketSize =10 * NORMAL_PAGE_SIZE") // todo need first define NORMAL_PAGE_SIZE + g.P("PAGE_SIZE = 4096") + g.P(")") + + handledVars := new(maps.SafeMap[string, bool]) + todoVars := new(maps.SafeMap[string, bool]) + + for _, line := range stream.NewBuffer("macros.log").ToLines() { + for _, sure := range mustPrefixs.Keys() { + if strings.HasPrefix(line, sure) { + handledVars.Set(sure, true) } - return false - }) + } } - lines := stream.NewBuffer("macros.log").ToLines() - for _, line := range lines { - line = strings.TrimPrefix(line, "#define ") - for _, skip := range mustPrefixs.Keys() { - if strings.HasPrefix(line, skip) { - line = strings.TrimSpace(line) - line = strings.TrimSuffix(line, " ") - if strings.Count(line, " ") == 1 { - split := strings.Split(line, " ") - split[1] = strings.TrimSuffix(split[1], "ull") - split[1] = strings.TrimSuffix(split[1], "U") - - if ContainsLetter(split[1]) { - mylog.Todo(split[1]) - continue - } - - vars.WriteStringLn(split[0] + "=" + split[1]) + /* + // line = strings.TrimPrefix(line, "#define ") + line = strings.TrimSpace(line) + line = strings.TrimSuffix(line, " ") + if strings.Count(line, " ") == 1 { + split := strings.Split(line, " ") + split[1] = strings.TrimSuffix(split[1], "ull") + split[1] = strings.TrimSuffix(split[1], "U") + + if ContainsLetter(split[1]) { + mylog.Todo(split[1]) + continue } + + vars.WriteStringLn(split[0] + "=" + split[1]) } - } - } - vars.WriteStringLn(")") - stream.WriteGoFile("tmp/vars.go", vars) + */ + + g.P(")") + stream.WriteGoFile("tmp/vars.go", g.Buffer) } func TestBind(t *testing.T) { From 3932bf18af2004ddebf251fa1a6187adf550759b Mon Sep 17 00:00:00 2001 From: Admin <2762713521@qq.com> Date: Fri, 21 Jun 2024 02:12:41 +0800 Subject: [PATCH 10/25] TestBindMacros --- gengo/bind/sdkMerge/sdk_test.go | 38 ++++++++++++++++----------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/gengo/bind/sdkMerge/sdk_test.go b/gengo/bind/sdkMerge/sdk_test.go index ba3e6d506..1e825a23e 100644 --- a/gengo/bind/sdkMerge/sdk_test.go +++ b/gengo/bind/sdkMerge/sdk_test.go @@ -56,34 +56,34 @@ func TestBindMacros(t *testing.T) { g.P("PAGE_SIZE = 4096") g.P(")") - handledVars := new(maps.SafeMap[string, bool]) - todoVars := new(maps.SafeMap[string, bool]) + allVars := new(maps.SafeMap[string, bool]) for _, line := range stream.NewBuffer("macros.log").ToLines() { for _, sure := range mustPrefixs.Keys() { if strings.HasPrefix(line, sure) { - handledVars.Set(sure, true) + allVars.Set(line, true) } } } - /* - // line = strings.TrimPrefix(line, "#define ") - line = strings.TrimSpace(line) - line = strings.TrimSuffix(line, " ") - if strings.Count(line, " ") == 1 { - split := strings.Split(line, " ") - split[1] = strings.TrimSuffix(split[1], "ull") - split[1] = strings.TrimSuffix(split[1], "U") - - if ContainsLetter(split[1]) { - mylog.Todo(split[1]) - continue - } - - vars.WriteStringLn(split[0] + "=" + split[1]) + allVars.Range(func(k string, v bool) bool { + line := strings.TrimPrefix(k, "#define ") + line = strings.TrimSpace(line) + line = strings.TrimSuffix(line, " ") + if strings.Count(line, " ") == 1 { + split := strings.Split(line, " ") + split[1] = strings.TrimSuffix(split[1], "ull") + split[1] = strings.TrimSuffix(split[1], "U") + + if ContainsLetter(split[1]) { + mylog.Todo(split[1]) + return true } - */ + + vars.WriteStringLn(split[0] + "=" + split[1]) + } + return true + }) g.P(")") stream.WriteGoFile("tmp/vars.go", g.Buffer) From 3e6f50578aec884273cc7fc93841407810af168e Mon Sep 17 00:00:00 2001 From: Admin <2762713521@qq.com> Date: Fri, 21 Jun 2024 02:13:45 +0800 Subject: [PATCH 11/25] TestBindMacros --- gengo/bind/sdkMerge/sdk_test.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/gengo/bind/sdkMerge/sdk_test.go b/gengo/bind/sdkMerge/sdk_test.go index 1e825a23e..6cba23ad1 100644 --- a/gengo/bind/sdkMerge/sdk_test.go +++ b/gengo/bind/sdkMerge/sdk_test.go @@ -80,13 +80,19 @@ func TestBindMacros(t *testing.T) { return true } - vars.WriteStringLn(split[0] + "=" + split[1]) + g.P(split[0] + "=" + split[1]) + allVars.Delete(k) } return true }) g.P(")") stream.WriteGoFile("tmp/vars.go", g.Buffer) + + allVars.Range(func(k string, v bool) bool { + mylog.Todo(k) + return true + }) } func TestBind(t *testing.T) { From 82a35e1a11419945dd1efda8b7db04e51c9031cf Mon Sep 17 00:00:00 2001 From: Admin <2762713521@qq.com> Date: Fri, 21 Jun 2024 02:14:16 +0800 Subject: [PATCH 12/25] TestBindMacros --- gengo/bind/sdkMerge/sdk_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gengo/bind/sdkMerge/sdk_test.go b/gengo/bind/sdkMerge/sdk_test.go index 6cba23ad1..80925d99e 100644 --- a/gengo/bind/sdkMerge/sdk_test.go +++ b/gengo/bind/sdkMerge/sdk_test.go @@ -90,7 +90,7 @@ func TestBindMacros(t *testing.T) { stream.WriteGoFile("tmp/vars.go", g.Buffer) allVars.Range(func(k string, v bool) bool { - mylog.Todo(k) + mylog.Todo(k + " need handle") return true }) } From 135bc74db73ef465c21818e30e72d96a4d12fa3a Mon Sep 17 00:00:00 2001 From: Admin <2762713521@qq.com> Date: Fri, 21 Jun 2024 02:15:18 +0800 Subject: [PATCH 13/25] TestBindMacros --- gengo/bind/sdkMerge/sdk_test.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/gengo/bind/sdkMerge/sdk_test.go b/gengo/bind/sdkMerge/sdk_test.go index 80925d99e..696920595 100644 --- a/gengo/bind/sdkMerge/sdk_test.go +++ b/gengo/bind/sdkMerge/sdk_test.go @@ -74,18 +74,14 @@ func TestBindMacros(t *testing.T) { split := strings.Split(line, " ") split[1] = strings.TrimSuffix(split[1], "ull") split[1] = strings.TrimSuffix(split[1], "U") - if ContainsLetter(split[1]) { - mylog.Todo(split[1]) return true } - g.P(split[0] + "=" + split[1]) allVars.Delete(k) } return true }) - g.P(")") stream.WriteGoFile("tmp/vars.go", g.Buffer) From 9e3f5477411e8754e31d9e53b69927e66aee892a Mon Sep 17 00:00:00 2001 From: Admin <2762713521@qq.com> Date: Fri, 21 Jun 2024 02:15:46 +0800 Subject: [PATCH 14/25] TestBindMacros --- gengo/bind/sdkMerge/sdk_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gengo/bind/sdkMerge/sdk_test.go b/gengo/bind/sdkMerge/sdk_test.go index 696920595..37ffdb388 100644 --- a/gengo/bind/sdkMerge/sdk_test.go +++ b/gengo/bind/sdkMerge/sdk_test.go @@ -46,7 +46,7 @@ func MacrosInHeader() (m *maps.SafeMap[string, bool]) { func TestBindMacros(t *testing.T) { mylog.Todo("handle macros func like CTL_CODE(DeviceType,Function,Method,Access) ( ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method)) ") mustPrefixs := MacrosInHeader() - mylog.Trace("number of macros: %d", mustPrefixs.Len()) + mylog.Trace("number of macros", mustPrefixs.Len()) g := stream.NewGeneratedFile() g.P("package sdk") From 468309d47f56b1139115ceec600688517972d315 Mon Sep 17 00:00:00 2001 From: Admin <2762713521@qq.com> Date: Fri, 21 Jun 2024 02:16:34 +0800 Subject: [PATCH 15/25] TestBindMacros --- gengo/bind/sdkMerge/sdk_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/gengo/bind/sdkMerge/sdk_test.go b/gengo/bind/sdkMerge/sdk_test.go index 37ffdb388..5a9a79544 100644 --- a/gengo/bind/sdkMerge/sdk_test.go +++ b/gengo/bind/sdkMerge/sdk_test.go @@ -54,7 +54,6 @@ func TestBindMacros(t *testing.T) { g.P("const (") g.P("MaxSerialPacketSize =10 * NORMAL_PAGE_SIZE") // todo need first define NORMAL_PAGE_SIZE g.P("PAGE_SIZE = 4096") - g.P(")") allVars := new(maps.SafeMap[string, bool]) From cc498bbcf908cb5e8a8fddaf2019e6140a8a4dd0 Mon Sep 17 00:00:00 2001 From: Admin <2762713521@qq.com> Date: Fri, 21 Jun 2024 02:18:31 +0800 Subject: [PATCH 16/25] TestBindMacros --- gengo/bind/sdkMerge/sdk_test.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/gengo/bind/sdkMerge/sdk_test.go b/gengo/bind/sdkMerge/sdk_test.go index 5a9a79544..0f3b53692 100644 --- a/gengo/bind/sdkMerge/sdk_test.go +++ b/gengo/bind/sdkMerge/sdk_test.go @@ -5,6 +5,8 @@ import ( "testing" "unicode" + "github.com/stretchr/testify/assert" + "github.com/ddkwork/golibrary/stream/maps" "github.com/ddkwork/golibrary/stream" @@ -65,6 +67,8 @@ func TestBindMacros(t *testing.T) { } } + assert.Equal(t, mustPrefixs.Len(), allVars.Len()) + allVars.Range(func(k string, v bool) bool { line := strings.TrimPrefix(k, "#define ") line = strings.TrimSpace(line) From ddfb860bd21ed0760e36e371028b838bd6d6243c Mon Sep 17 00:00:00 2001 From: Admin <2762713521@qq.com> Date: Fri, 21 Jun 2024 02:26:37 +0800 Subject: [PATCH 17/25] TestBindMacros --- gengo/bind/sdkMerge/sdk_test.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/gengo/bind/sdkMerge/sdk_test.go b/gengo/bind/sdkMerge/sdk_test.go index 0f3b53692..aae0c1097 100644 --- a/gengo/bind/sdkMerge/sdk_test.go +++ b/gengo/bind/sdkMerge/sdk_test.go @@ -63,16 +63,18 @@ func TestBindMacros(t *testing.T) { for _, sure := range mustPrefixs.Keys() { if strings.HasPrefix(line, sure) { allVars.Set(line, true) + mylog.Trace("found macro", line) } } } + return + assert.Equal(t, mustPrefixs.Len(), allVars.Len()) allVars.Range(func(k string, v bool) bool { line := strings.TrimPrefix(k, "#define ") line = strings.TrimSpace(line) - line = strings.TrimSuffix(line, " ") if strings.Count(line, " ") == 1 { split := strings.Split(line, " ") split[1] = strings.TrimSuffix(split[1], "ull") From 51abd1b7737a851bde1847fbe2bd4fd8611ea8dc Mon Sep 17 00:00:00 2001 From: Admin <2762713521@qq.com> Date: Fri, 21 Jun 2024 11:04:44 +0800 Subject: [PATCH 18/25] TestBindMacros --- gengo/bind/demo/cpp/msvc/sys/b.cmd | 7 +++++++ gengo/bind/demo/cpp/msvc/sys/driver.v | 4 ++++ gengo/bind/sdkMerge/sdk_test.go | 24 ++++++++++++++++++++---- 3 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 gengo/bind/demo/cpp/msvc/sys/b.cmd create mode 100644 gengo/bind/demo/cpp/msvc/sys/driver.v diff --git a/gengo/bind/demo/cpp/msvc/sys/b.cmd b/gengo/bind/demo/cpp/msvc/sys/b.cmd new file mode 100644 index 000000000..54561dbef --- /dev/null +++ b/gengo/bind/demo/cpp/msvc/sys/b.cmd @@ -0,0 +1,7 @@ +v -cc msvc -kernel -o driver.sys driver.v \ +-DUNICODE -D_UNICODE \ +-DWINVER=0x0600 -D_WIN32_WINNT=0x0600 -DNTDDI_VERSION=0x06000000 \ +-I"C:\WinDDK\7600.16385.1\inc\ddk" \ +-Wl,/entry:DriverEntry -Wl,/subsystem:native -Wl,/nodefaultlib \ +-lntoskrnl.lib -lhal.lib \ +pause \ No newline at end of file diff --git a/gengo/bind/demo/cpp/msvc/sys/driver.v b/gengo/bind/demo/cpp/msvc/sys/driver.v new file mode 100644 index 000000000..603ce534f --- /dev/null +++ b/gengo/bind/demo/cpp/msvc/sys/driver.v @@ -0,0 +1,4 @@ +module sys +fn main() { + println('hello,world') +} \ No newline at end of file diff --git a/gengo/bind/sdkMerge/sdk_test.go b/gengo/bind/sdkMerge/sdk_test.go index aae0c1097..d1d7e9f20 100644 --- a/gengo/bind/sdkMerge/sdk_test.go +++ b/gengo/bind/sdkMerge/sdk_test.go @@ -36,18 +36,34 @@ func ContainsLetter(s string) bool { func MacrosInHeader() (m *maps.SafeMap[string, bool]) { m = new(maps.SafeMap[string, bool]) for _, s := range stream.NewBuffer("macros.log").ToLines() { - for _, s2 := range stream.NewBuffer("combined_headers.h").ToLines() { - if strings.HasPrefix(s, s2) { - m.Set(s, true) - } + m.Set(s, true) + } + + m2 := new(maps.SafeMap[string, bool]) + for _, s := range stream.NewBuffer("combined_headers.h").ToLines() { + if strings.HasPrefix(s, "#define ") { + m2.Set(s, true) + } + } + println(m.Len()) + println(m2.Len()) + + for _, s := range m.Keys() { + if !m2.HasPrefix(s) { //todo bug + m.Delete(s) + mylog.Trace("delete macro", s) } } + println(m.Len()) + println(m2.Len()) + return } func TestBindMacros(t *testing.T) { mylog.Todo("handle macros func like CTL_CODE(DeviceType,Function,Method,Access) ( ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method)) ") mustPrefixs := MacrosInHeader() + return mylog.Trace("number of macros", mustPrefixs.Len()) g := stream.NewGeneratedFile() From ad6120593542d59e5f903fe7c1b5c6d2053bd446 Mon Sep 17 00:00:00 2001 From: Admin <2762713521@qq.com> Date: Fri, 21 Jun 2024 12:45:37 +0800 Subject: [PATCH 19/25] TestBindMacros --- gengo/bind/demo/cpp/msvc/b.vsh | 5 +++++ gengo/bind/demo/cpp/msvc/hello.v | 13 +++++++++++++ gengo/bind/demo/cpp/msvc/msvc.ilk | Bin 0 -> 1211552 bytes gengo/bind/sdkMerge/sdk_test.go | 1 + 4 files changed, 19 insertions(+) create mode 100644 gengo/bind/demo/cpp/msvc/b.vsh create mode 100644 gengo/bind/demo/cpp/msvc/hello.v create mode 100644 gengo/bind/demo/cpp/msvc/msvc.ilk diff --git a/gengo/bind/demo/cpp/msvc/b.vsh b/gengo/bind/demo/cpp/msvc/b.vsh new file mode 100644 index 000000000..1205b3a58 --- /dev/null +++ b/gengo/bind/demo/cpp/msvc/b.vsh @@ -0,0 +1,5 @@ +import v.gen.js.tests.hello + + + +v -o hello hello.v \ No newline at end of file diff --git a/gengo/bind/demo/cpp/msvc/hello.v b/gengo/bind/demo/cpp/msvc/hello.v new file mode 100644 index 000000000..49974e0c5 --- /dev/null +++ b/gengo/bind/demo/cpp/msvc/hello.v @@ -0,0 +1,13 @@ +module main +fn main() { + println('hello,world') + demo() +} + +fn demo() { + areas := ['game', 'web', 'tools', 'science', 'systems', + 'embedded', 'drivers', 'GUI', 'mobile'] + for area in areas { + println('Hello, ${area} developers!') + } +} \ No newline at end of file diff --git a/gengo/bind/demo/cpp/msvc/msvc.ilk b/gengo/bind/demo/cpp/msvc/msvc.ilk new file mode 100644 index 0000000000000000000000000000000000000000..4e2445a2ac015079aa4c5f210f58e5b557e45990 GIT binary patch literal 1211552 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 z z*uAb1#ElCHNAnwy4qP@ks_J|Q@nqhQ#g4bYMa~Mb)(@X)0;IhFf zYaV&wBEcb7gLoLZi{dcS0use#gX8rIhq#s%t-c8jE0*OgN=V)B%fOIg; zIFKj~_)b~#Ks-3PJLD?z!l~0Cw}2#ZqIAf^Hr@mFy3a zJWwS^futBY3&eeps`(j6B_oX>F-D#MNiy;V#W`4w^CfvPvJ*!4;cB)`57&sN@rn_yj@3@%bMhiQ`qWE%rA0(MG3T!$3N43+<3FNIasF z$sm=}RWhFlu5KK!OF>+?FmTBAAdy;?tOAKe1rhCf6(n`8Nc}OL@gH%4E5-$k7_OOq%Vf|MR|FB;bTnxgIT56pk$E8Q*Ho{|K{^<@ z3&hi=YF2~97|e4I5R=Q zn^et(MEdqoYIrM1$5w&}uSY;Cw^KFGf_S!9$=e{V9aQoKhn@n3g&AereNz&JtUMEPiO{iVB z!7Fu|T6!~xafU?@Cpvxp+?lSa79p<}q3JkNCG8-Ivn(>pyj!oGAD+euylg^o{tB;X z#L^JyqBx9fg@;vbHZcQ}aJuCsi!wYmp^tZiS5gv@pJ5>J8Ny2tA4p`T6^Fczq_SqI zNwsrx2n{2*CsH_HPk_#+?JkMS@YnG9+ z37#-ipNDG}SJcvw*DdghGIB4K&dAdso^w^NR*()x-UdlYBC@f8;w)0V{sj`NQ%TWa zsRBt!B5Jq@#C4vik047yJdDIaqKw=Q635W1 zb7Wf$l4PVE#9gmyx(C0>B*8LbBOFJ2%a!n8kb5;&CWKNK4TF%89Ui=h_uPF`Wex>g=QT0615ez zs85WM#UM$W%&eI%+%8hRV$g&o>1WIhiV7w!u{3kNeiNl^a-JmNn5~iRira*0e+?pc z*aQzD%{ZP*Z7(HbyO}LLPa*r7WX6I8wd5AFy(sc6i0ryd#1Y%{ZjiRiEplFPTFtC_ zWaA3EEJ<8fT7+6bqJ&MTr9?be*&4KqNYp0O3Nv(rrIDmGY!hk)X*z5&SCZ(}mKU|+ zIn=qCkyk-djJyYuxJLE*6r}Q6m3#$aU_u1#r(%!$o-~YXhbJNlM)m+nF)|D!e4QG{ z3leAK2#^j&P5|-zT=l93iP;3(!tC;GHlenk3yu4F)$3xABqP^RdZY8($p zYQ0LvfCr`%EQX zkmwgGIT|GLwIKbd=|&VJE=gaLECoq@t9mU5q1Pb8I(yznq^~;TEuOAj!chSqjqTR>`d(@gXXC6vTxo2hR1z3m_c_2-452{p%pcfvV<15YIs> zNs$JxV!Ne%_s7L>r5cxQN2zF342vC2P9sqk_$nM zGL>8d(!t0bAklJF^B57IN?rvC`&IHMkR&5tfm8-mP2b_DPf#VhfOtYG843~|rIJz* z*I_CdN91soR1rB+C1-;q8My+)9ac5J0I3|KlDk17V^#7bk)u`eJV+dqVV%D5Hc09i zm3&5C$ExICAnxN-vNI-bxF@RQAP~>-Dj7v&l1eH-A}6Ti6p(nON~%HJC#hs12)%~b z{qSN*+%~xe#B;Lhbu&nkk(ERytC}Z?Oi{@zL{3r3haerNs^l9G<203Qk5NbW=_=V9 zBz%TS4h2b^sgff=Qurw_XImUcaUv=?mAn|K28mBsH48y1t5p&MX`Zc;+bGUll{`#w z7O3QT5F@IRbs#ZDHh{PnshaOVIu@(Mh4Iy7y-M~4ab2L2LqVd9RDiTGQU&6h(NGGb0~^xRzL&*|>Qxqx1P?g7h+iI2klgMvXvLi;e>9wuBSMDvzHZ~a{ z$#yn5Op+p-OauwPAR>#i%&8y=MrIIsN!8SmSF1{HAdOAVpErH(eAF%}XU2-{^*A)* zWnEpo$jGpXlg#Tn((C}++EB?rMv~^5su6QnR3hfCNMc?ein%K)5p!202_UGPyQ0Ps zb5~SCI@~0S8hX8WC+4n5BCbVuq&1a@xhss|b9!Lmv{cMpQ3*cA+!d9GxhrZMF?U7P zh`B4OM$BDNiI}^hdWpF!lK81)F?U7v5_4BnBId40;w3jRQ$-TcaF;hh)o*}fR5;0RnC1R$EBq509OchDYJ|Lq5Fs6@;#QHhvgq7pH~ zL=qphOUy7)iI`!cdWqQ)l6XsL!@omol9)iue6R>@K{2aA5_7wY*$9%DEfup7Br*G{ zn2n%%iP;D$5wj7jIFxxY8$s2Gxd)P%`;M4tAPKcW&LU8Wm_?uxF^fPYVitiUX1l}; z0ZGhOh#3Nsn0uud>sN^w>zBl=j~MHhgqkJC`Xw>T5@Y=;5o7(5h?bfo`;wTYi?M!5 z%p-sp>sP(RSidA@Sz@eTC1R{!^%7(Ksz!|Ut3-_Tt3-_Tt3-_TOJdepjM__LWnV%AWM zzpF%yzpF%yzpHV?_`6EP*t#U5uhuK|F}J%IUskknF;w2=;b5$=f?kR~l>zU(>s+SlavtF_I;T*`LKomgPl# zUW{Z(B5G)kTS;Q(M~quB4Lpls=3Z&`a4||{5h`AcNl7C5vpFVZX=ry6V^XR{j7h0P zj7h0Pj7eE>sET4tN)ofBVoXXUVoXXUVoXXUVoXXB^T;N~q*RRfl@VM1WFR~8bFLdS%h*ZMxZQ0=@27Ol9<~74q4j*;_6%$E2jj>|;-<#Oz}!m6$m^;35&nJl2^xJWD0!QQ{_*n0xm+ zMkuShU97}0&oWhv(6+dZ5vufuj8LVAT%yLIN>?*NmA;=5s`TfKP^AxvDRIpH6J>RcxCZ05&2e~Ga_nP>Bvl^DfSi5SJRh##RV%rQH;y#i+GH!3v@P`f_5 zNg+YXPer3bLe$c`?o^1E65Vh=BM|-e0hN>@&^He;f<(_=#RwApHYcc%Mi5yeNHiz( zh*KkIszy*}jUdq)L7g>%I%_1Y&h!A9X((Za7%i3C!X#p}R1!+F94(cEHoF`xRW)L? zRMm*lQdJ{HOI0F9OC>S)9Wh#}YQ$)%B<3C`MoT3rqy0jRmP$gvd~J)rX3wMO?sIc6Mqjx=P*$@*Jl9zh3&ESonJX#lckrbVfmpCcv%DOvgSxHQ^U$Sgq3wv+p{Uh z>wM{DYM{fQJ_xncY5Pqe=EN#cF>-y6B#!1$5V|*Ta+n0c|4N+KusWJ)J^-O^?!@^k zNCne$NiRpUH7YxqX?6t}$KnhHi7<@^WFpf{0I6k~nIII|DJuq2&onDQB24oN$Wo^H zKM;!S#Bq|`ZJ~)6J@tOt=epJ$^ z#3!c4q*vo@1Kv5MKMc|YBDRj@6=q)RprO(ouP;F!x4qOpe<-Na4{OdV{%9Y&AMQjS z;$>=BKcxQQ^m*gr!7Cjvuk?Wok_SI$63? zpPN87;Is7O4;@ZLWO5z*mp}9!Y}e-r8QIjZ`jp#Vv`2qhf9hq9*PGJI)KF04E07K> zo%#$!6H_40{_X?W$TU+xHZe^dNEg#If)w>p<2(amfH-Bn4>FKxz5^M+G=q>lH`4?_ zikW6I$Oxv1f(&DthmthIHvgyq@2YmM#?Lh#s@N*X(oV7Wty`shWJDT@E@Wnf2TWp6-N0A-P2#^@l91lW~9nCC|WlXaKgd#hd+dvwb<|z=0 z>}Wm$S;;j0aTP$39nA<3e33$_^T{9-+0k4CvYKh`1EI){=0%WJrui6zB0HLGa6R@W z(;NiS!ZasG^#%|RfTvaPgz5=cAK)PcB| z=2j4@p;OjxK?XC;29Qps*)9kVra2TO#Wa;5m|U#XCkjHXaLW1xNSJ9J12I4x&08RN zbfLugCkQ5@0I0G?X8w^f(A^Zj>562!cl` zisnU-7F%OQHdy43ps8VA-+`>Ly|AT>frp8VIi(*8(q?O{$SIry<*qSaWq2X5rN#?a5 zG;5jHD3AeZUd_ylep#o3dCdVSPV-7IuZy6eRyZ|W4l*pwE6%(ggr*3@@p>M_ljap; zUhhIPn0b8zGCIvG%Di?wTts%t8V*9g-OO_sVP1zrGY-V@It^s9?L|GI4rC(J+yX*z zc;reDr;j})HBRIYKx)&x!pzG!0_A}?UV}mE)4V8$PFVqH8kpBVA3&Nwgcs#`zaz2dGR^TIkJ}n+k4vE+ zI&EJJ%?9RmGf2|*qR3BxY-F0(LDt$DD>CgDPUMZy&=JYW&wwz_XlY(_v~j!+hGro1 zssy1LIxVdOaWl;wASqj8)hEd!zXT2a_P0}?&p(g^dq2bv`FdJcp##=R<;S35LsGOvGw)Yx9? z9T_h8lslkXwz>10J?uN6y~pB1yi5(d1Hy%xaz_?_vE>}c%P+l54SNEE3oNay-R-g_ zNiS2w%A!jp=kAZna=hk9FH-}ZVO#>z!P5s>blzHAW-7NADXy`XToowKr z6EnAk6S)?oo@uTJp>5%49s!9l&FdhvEgVe>q=9MnIYw*?M{^uVoN4MoXj?d%l^~5w z^CAds3rF(_NP=nlRp2OUYpku~V%cy*^EmSggM@7_>Z{X0Rx{0YAQPG9X^=Hc^BG7L z)9iXI&O}Ue2uL;4j0b6Fn&}|4y$(c8@awPgiJ8G#@iS;PGOraNOVYgPzR5X;uZG6h zTI~t%gV6Rm&@2mojDLa9zkE<)li~@un_wD0NHNo#2}0Y#iE}x~Fs8W&WEImq58`2( zw?SH%<}VGtJHukxmd%XKR~wu&uK{G|QORVIZ_EoR(ICEN7ZoAhazU%>^JUnC3tsOPLFyWWT~yOwqP@B z#Rh1Knb*HT;xi%GgMaWk(+KxkVyHGB)CglRqjp>5%4z5($tP5+Z|6=!R#(qpXjU7;DrygVS3 zc_;EjkV>YR3qqN9G*^I3Wty8oDD#fyK9Cxw`5g#l-qE}dQpYs^1nCdrXk3%A1({|D zh>K~wAj_C03^JH$CV@0E%}fx=vs2djAPJ^f22##636LhHX#oi{&1)ddO!EQAM5g&1 zq=jj|1F2$~ZKq)WVj4F{HPiS()-ufrAW^271M()*TmZ6!X|4h3V44I-1JgVKvXN=l zfh=d5zkzfyjd6;|s*~rPLHcj2?q9<}R@rf^-Wz4TcN8?m%xeM&<Bber9kT#~d7o?nN9tT;^G|z*KW}0@8PNw++WE|6McPg&Om}WT0M5Y-Hf-lI+ zI$PO@uxy+N4gJdqC6M-m8O9ut0cl>9%xeiWb+s*O?&nZ>R__YU$-5O-yq?$YiE@8RT)M z`3i(GcA(wTL8sxk$~5I5wM;V!q?Ku^LF#Rd`s5@;k^5ldny|af8usJ_5ALU%A5ZdR=;%8derP`gC$gWeu~->X2ThhLsgg zE6efvQhJ#hR@PBzWev5<>T^0i#LLvMvc`ZqPoJn=j@Qo8%ha&4@bE}!*X+ipF5cfR z%PqZ34J&ILE2}!XX`|!ikzS?-I{bbw$eXOMP6DC*^gxPZYNmp$XPP>YIMZAUvVm#t z0a;;d)INVSMK)(%QTVqm4Y_u)+x0ZO=w)hHyT*e$IXwEW`%ZGaUY1^_hUM@W+l!*k z`r_&(yV_;FE4@q&E33lxq6}Pl{BCuQ*XPp9)UdLSwY~7h_|X03nJ&Am@1&QhVP)ZQ zfYPq(?g9j}9= zm#JZ8;g%0x)-meN@4xzXC%dds(#zDavT#GCl(lMn>pqUx1nFgJpu^7|fox>`XD$dG zu@9s;rlua`8>VRhp(D1Vxdnv&nY$9(>j97?(>x6_fN9o(tYw-HK#G~>Zy@bV^F7Eg zrg2Rbdx2A*At3Z?ElzzrASo8-2$0cCGYMo9)0_!X!8G$gia?yQmViuVnq?pZndUZ- z2-7r!xS3`RNG;R62{OXgsQnPPph`bXT|aY|-R!>cF}&zyYFOXE4W80B_Bkc=h2!%EBG+iKdOtZ~dxTa;AJwReiGaO_+)A&J_G0o8+olG+Ygxc=()oPG$ znC3i?l}vL52>ptYv+vvlLcet6#90Y4fN35FSxkOroSgKS`$2SJwG z8ta(g>Z3lRegT>;=Jggx!uB%o`V^%90Cg|;Kaf>Sv+E4(1x#}=NDI@90V!sh86azz z=28$h)7%Qu#x%_!BbeqDko8RS7m#wM={FO{1g04bGMZ^hLB3&{V?ZjHCIUiVi*|Zc zJ;-FHiGxr!9L@b85vKVK2xY_3{2rv1Y2E=D#x$RS)H97yjbj4S6obT=W+Vu;)G2E$ zNCVSM1)-KYnmUj;)7%I`Ep;@HfUIDe-+@p|9Zeg^N~ZZ3gj(uo{sFRzX^LivmO7d} zK^|wCkswQ1oTETiGtC(w)Cwm~9mpD{Sqeg}a5Oi9tYw<}K$@7Q1>{YpSqDNjbmIIK zWIfY-50YdW`ZcKyOfv+8N_XOTK~hXJ4y2uFP664(Gz&l|vJ>YjkfI&befd@pitK0} z1R2OQ&wx;5NApLJ!A$cJ2t{@@UxCoS2kD$Wx0)j&JDNQ}JWNvpLcj0lXo4W4ndUf< z5lnL?NCneGL4vl%I{F!X)T7^J&`f1s%R$E3UUc-k7o>)1o&%}0HCE&lv?F2t$jNvc znkCHZ?;uo`)2?l5(0iF?2ndxWH0o6@9x*Fdp3ijL);Ykw@*D*(dYKw_<%x&0%9ZCg zPmH_D@j6a=nHqMLi-(~~S>rEX@|PX$vd)lRriPV;hlWa7XWzMJiQ~0MdYKyN@Go?L zEMslI4W!O)J82#QX=IugL1IkvA;?Om`3i(0iyT^8rvvevt+Ul!oST?eF$k3K}H1nFX$??DDL&A@X+2~fQw>tjG?#!>GtI3aOPS^&kSNov28lCGE65V2c>`nx({z9|FwI7g zCZ_op$a1FHY97vCOtT9}f@$^vNixmBAgh=r0J4^8CV;ds%~X(frl|*6!!$R7Y+#xu zkT#}S4U%G-_dwP&&9@+%m}ZyxxEf@d5g+Sk87|1>$C! zbsz(n=39^vOtaGhTn#eKaFBAQISgbN)0_YjW}0(AJWO*X$V8^O9b~kvv5t^!Xvj!= z&wUJ<2=jUkq{8-s(D)prmT9(*;`)$jhJe&FO$dY{i;P*NClODSuAcQUJcDz}K>WpN z+lV~=#Seq*Gf^et(96`YGZBVNlrz!&Z~yac$LnnAWoiud`<3*-yaXI2FW9_;bgtFoEgeH(irui)hWy8_D1(INzPLQQc^BqVN)9iFEjtNY& zAIRfOGa6(C(@X|QGR=GtiY)4*W}Y4vJ5Rdk8elIw^H;%(UZ#d+9*-lH%>VwnQC~V< zE2NjHVb>e7U|wUP`G$E-1)ldT*T7aOXuh{xGkRAe(G2h>Zy#L8dteqzHt!J;owm3(Z94wGw2Y?M0DS zgH$oiIuJM0dJI1O{LVBbAT>-g2IO(3 zIUS^qY0d>%%`{hn#F*xnAgxUE1PHa=sn2U5ZA|kSNF&pH53-(V_FODl>csJZbTZ9J zAk8e!e2^5=+yFwYaN;}$vWaP41))|rnof}ZJFEL?pYw6`&NPES1~82mq=RWHK#G|r z0T?@NglQfFq0$}A%OJH(^C<|G?r8d4fTIM{>;_WBG$kNQ znPwbFHPcK3S;jQ=AW^1?gETVDgCH0xRqFEs$V#U97^Hz|`d)~h$u#?cEN7arAgh_? z43GrVECgv~ng)nVb>coO)s@9w_VoJ(#zDa zvhaXXDQnP~hrHr=ohH3Z4Rq*(Af2r3F_85vKR1G;nC1cL<@D9(KsGT=JIFUI&X*uX zyQurSYYD0V;=~yVGLUJG0U5wF(?Hxza}h`})BF--1k*ePGK^{70SPkAmmnUd+3q5o zznEqi$Y`cH9Hf$ICWBNk&DkJRndTCZ$xL%2NDb564-#RTr$M4j^BPDk(|ioFglYZ- zQqMFyUW`4LX@-F;WttGka;BLI5@(u=K@v=JE656_c?@I~)4T@K#5A9SJkB(IFA>D) z8-qYrGff#tlEs+_vW98S23gBASAn!K&AlM)O!GX*dZu|7WCPRu9i)?Kwuxa+VVZqF zzG0dpK{heXG!XikYv(+8K1dOW)ApZ(3}BjHgA8Pv*FcJy=I;+5{02#qF z(?C2-a|uY0Y3=|S%``88jANR=gH$lhHkV;fVVZqFCNs?;AXAy z*A$SIwim?4ERYpUb0J8xt+66|Smd8ejZ^1)K~~#d6!{sD78dzUkXEMI2(pH0wqA;B zKc?9iq>X8OARSCI0i>O2rh#l^nnfTRnC2HCT};yql46?IK>80s*Hvy8c+832vrbtK5(G%s9=D)%X8LPP)Zk>hm{NQv#GUMI|gr*oaq)OFdfx3$mR zE8s;hQ^U^P7>H8N-PNZTUGI23CcR7zyH3D>jaJq+c3FRrUZ#eXRl~|UrQ)(*I$j;p z%hW(;82<#JmO5?U_DWp$+HEJzUXnPPksx7PV{Hr4I(L6zXewCb(?KTMUZh?GQpq%p zAXQAW8e}Tdd7JC#3 z{&gflf{hySdJ;M*ZPH0ui%mw(ShUD21b^mI zWPSXBvOyXNmhZ_)(C^(#Bf;QcPC{Pq-Wn2s>TTkrG~{j8iTOLoPD}k|UQ^+`8)w$R#`9@ z)HK0RL?av#2>8SBv4*fqm%MwI`PGI5@^&(aE(qvYc=BYw&|pF6DL7m zpy*iEil8s((Mf1DBLPpTH>{EJ;9+cA1iap|3a%*)l*e=uXx2#3JDSHS4VE9S6W<2i z%YTHf33Te3;E}o}6xK+{vq|#`dFe|WPOl5#n0b`$oCq9p_UMK!#8Yv6KHB#vT^!FEpk{<2P;l&5s!@6t(te!N)Of&ovNODE-So%l<15(sLf++U%S zKtv~@8jbioF^vRD<2orza1!(cnspLP>Lj#ABVJFdM#{YHIw|eYNHEZ;lc4K(mcw8$ zRLn>azgzFtN!d8I-GkopU{KSPhblGV^WXwR_Lh;(*FlW4LHqTgGZejcnDqBy=8tHa zYk#}iT$q}^hU#?=KIqqnwm!XD?tKmy-qtn$HrEJB8gb1ZEDHrAygucgGMp+i)Tb8I znfdUwfBZ*Ioo&f#Jvy=yM6^GlDP)s9bo~1eoHE6_FzDy(jvbaV9rOP=9_~|l1IRXR&0dJ$G z36v*v5@^y$(9^7wvKF2AlR62tY9v(JrW0SgPJ$hr1ic=dJk?eNef~~O;|t&f!Zd!* z1V%z$Uzux?x-CNG!7?`|KCiz-CjlJTl*l2UH|WtdA?&zJQyM@88S#-5CtmuU7pHH8 ze7@2XxCZ^Ff@}PqV5O$CKRaS#9Qu(X~b9Fs1bjtStCLE zfeWWy0lMg(%t@)gYzil3rDdmRBvjVQBbR$Tr*ciX-_xaO{DCU2@t2mKrjxQ^NUNRa zfX81NDA5Qm3v^OCPA9$!odhRpq})@fkx-zDlYqbcbY8Nwq7It@|jv3zrUIjzt1;|lVE9i2agl-_-AuXC>S!ZTRMHr z8wz>mXqr%24I`x$RbT0Sumil5`Q(ERbn`=t_UOKzl_mzQCWS-87 zjFc_qamq`5^t(k$eacG%ah-&gYoyHEsFSi4I`JiR5?HB|P?JW=y{mLm)~plX<2nhn z=p?jSBR+3ZCuM7N;%n7OV69FJ9Ogj)JZVKNzmiz(umhX zU+Go0V9;CIUnk{7I`O-75-iq8smHAmUn%{nlv5Utp@E=ILSc<~y)`;1rQeWJ<9N#w zIw^0~i7%-Wf4fcs{c$2>k%KOsga&J*)H9FmDP^AW()k+k`4?y;;E8G^=s#B{frXrS z{pB8BdTGELL1S7ANe?5_0o$p+>82<<8|UL&rfi?;?j#W+>82| zQ^O^n-1U{?)g--0!@U+VuSI|S{#nPXMS78jdo41(itv|S50<^1a=col7iqXx9f;Ge zQGY!HCs6DDt3!H`hI?UJq|&a%PkeHnIg3QR@-dYFAKtk%oI=!kki;KT&>_<5eNONW;A@WM1zM zHgJJql@*a*q~TsaV_wH!^b`i-EU$X$MH=pfDNstgzPsql+Z?aB^db%Sx`>ta?(iEu zj#ol@k%oI=(vMPB`$I=`IbJQ&i!|Kp66W>YLwleRR=ZlI7iqXx%=EH)Z{ma*xU#dn z+NBq11WQQ*pvAcqq+cHweSp`3%fEoqiqm(QprqlYUk2iMeZKqjUpig~N-xs%HKxt3 ztvhegtZEU-j5D+5oJHn11isH<#wn&lUfK(r*Q`lDEa_@*8`!q6?O@x(2EcZJ?Ficm zMs3&`whL@m7(FA|9kvIo7&ZvDCu}d+VA$TUePH{-+^`|Ap|Jg6!(jWvhQkhkmB0>! z9RxcVHUf4CY$WVZ7`lh~FHeBJ3pC$uOJ@j47~FV5h>WV5h-Ohn)eN z3Of^a7Hk?U0-Fw-0i(?{3r2SZ*eQ(~7+tlW4Lb)m54HeC$KXXUI%d(ag!XZCTZ8rq z>Z_N+E{9zKy9#zS>{{4$u#Xwi@;<>^azPVM*BUV9&!|fUSYO2>U(k zC0Hx$53rYEe}t`ty#jj`_8P1W_Bw1G>8g=0s9;5@30i?OW0SiuVLT7{sH?Z>|0nD z>|e0&VE=|~g8d)td)N;!qYwUv^@a6=^@nW*+ZwhFtO&L(Y&+QYumP|gU^~Kgg3&Kp z>59I}#R#9R(W$8w(o; zI~q0~b_}cnb}VcH>^Rs&*zvGQuoGaFuoGb?!A^!vhE0K;0y`B}1v?FPI_wPCRM?rY zvtZL;5!iIt4A@LqHEb4aHf#>81~wOVHtZZ&Eo>faK5PLj3Og6J5ViOJEnlE{0tKi@`31T?V@xwiI>+>`K^Gum;%Guxnt~!j{3VgZ&(KJuD8p z0rm^njj-jgn_xG?Zh~`24usdN1*j=!@VfVmR!tRCL2fH8E1bYDX zAnYO7D%h`J55s;9Ylb}ndldE<>~Yu=uqR=^fwjP%f;|m;2DTdZEbKYhZ(&K;?_kfv zUVyEEy$Jg~>?K$$><_S)VSj|Jg}nlM74{me4fZ;09qbL*o3OWFZ^Pb!wZq_gZ`unyRtV1I^v4BG(v1okQHGgv3=FR;&He}!#?eF6I$?C-D?>`T~Ju>X&} z^Nx?By8iaM00s;QFkrd>1Ev|d+thWz*kC|lT4*a-T3G@$R9px}bVDErLa(NqE_w%r zKyX5H=m`W&Xr?8imk{zk=a!jsXJ=*S_xHOWKi1Coo^$S*JALk**{|Un_!ho{@8Jjd z5q^Sy!_V*^_yzt8a&VOgFZ)72=npHvim(z4fR$ktSQQ4sYOp%20rG1EYr;yZ*F0d=?2D?KRCcs3P1e1Xumd{LqJz*+LgS}vHm=62EzOWyZ z!~Spp%zy*oAUGHffkWX}a2Om8N5GMA6y%@+Dq$v6K{e!|24+Dm)WOkk4AesdG(r{JeJNBk@h0EY_xB{+(tKe$51{T1za2;F^H^7Z>6Wk07;TE_R zZiCz54!9HUf-bll?ty#ZKDZwqfCu3rco-gmN8vGe9G-wDp&Nb=Pr)DHX?OFX(|U;VbwWzJYJyJNO=cfFI!}_&59v|AAlNzd%P`rVsRm ze$XFQfE8gS7yv87DzGXHgwn0AUPOvk`Z?o+R zyTR^|g$XbbCc$Lb1E#>9Fcqf3Ua&VzhkamQ*bmBKe>ebUz=3cO91MrRq3|m>3=W4Q z;7B+Ma!>)4FcYev8uCyBv!E90;Al7o>Y)J|p$VGdSZIM(XoGf`4Rc^F%!A|L*Kj!fWt4 zya8{*U*T`?7Q79Ahj-vzSOV|CKj3}%06v6|;A2<{pTMW^8GH_3z(3(%&;wt>SMW7_ z1K+}T@ICwhKf+J&Z}=Jh1HZt3L2fk4z=poi5BkFjup+Dk17KxX1y+TDuo|omYd{IC z32VXHFbLLxbzwb_tNQg}1K1EYf{kGl*c3`(GuRxqfFZCYYz14xP}l~xh3#N_*a3#Y zj!*`}VFZkXQ7{_Dz*rau<6$S*8FqnPVK>+vvM>QA!X%L2VA}(xz@9J_rompYH%y0p zU|-k|%3*&v0A|2}a1a~}hrprmD>w`e2l?H#BjG5>K?PL8OsIlt$U_axf;u=F>Y)J| zp$VGdSZIYdm<@Aa9vlb9!wGOA$moy`I2lfXQ{gl?9nOF=VLqG%XTxvc95@$#3+F*6 zoDUbk@8BZ17%qWJ;WD@!u7IoHYFGf*!gX*x+yFPiO>i?Tgj?V?xE=0Y zcmN)Rhu~p&1RjOQ;Bj~Yo`i1rJv;?}fT!UZ_#-?Ei{MZ2XLt^thZo>QcnKE6U*KhU z1zv^M;B|Nd-h{ux-{38H8~zUOz`L*n-h+R@`|tsL2p_@6uoOOlPvJB89KL{m!oQ#g zzJ#yfYxoAfh40{d_yK-|pWxr{GyDgBf&W5g1-51A3;m!!tN<&*N-zLchE-ry7znGu z>aYfsz?!fYtPO);9atCEgTb&qYycaA{KnbFunBAmrLY-n4qLzw*b=satzjr^1KYxO zus!Sm!(c}!gW)g&M#3l<4P#&|jDzv86YLDTz^<(F&025&nOolyR3hW6}VH)fO zd&6|t2lj>ipd9vx17HRm2nWHza0nad3gYM~B} zhI(j#CTNBhXoYr|4Rc^F%!A|L*Kj!fWt4ya8{*U*T`?7Q79Ahj-vzSOV|CKj3}%06v6| z;A2<{pTMW^8GH_3z(3(%&;wt>SMW7_1K+}T@ICwhKf+J&Z}=Jh1HZt3A+sXeJM@Kq z&>vQS6=5Y904u{Puqq6M)nIj414>{`SPRyML9h<23+usPSRXck4PhhL7&d`Tp%gZQ z&0z}|0$ajXur&;YZD3p24z`CKU>NKOWiT8@z(^PcqhSn;g>f(*c7mN@7uXecgWVwu z6JR1tg2}K4Oo2UNDolgDU~iZX`@p`iAC$xXZ~)8z`F*y7;9xie4uxOAVQ@Gc0Y}17 zkb_E?3DuB?Sx^f{!!ghRjnE9oLMybvY?uS{;5axQPJol315SZc;WRiM&VVyvKAZ)= zfpg%ua2}iw7r=#Z5nKY7!sT!UTm@Id0=O2gha2D~xEU70EpRK`2DifFX(|U z;VbwWzJYJyJNO=cfFI!}_&59v|AAlNzmQpp?GpMzKj;rDz>2UE$nUtV46DGZFc4OQ z)nN@Nfi+<*SQ`exIspaNz>7384?W z4Q_`!;7+&;y5MfO2kwRY;C^@j9)ySBVR!@{g~#A=coMqdDfk0C1Al~PVG;ZZ{tVB- z^Y8+^2rt26_zS!Yufl8a2D}M>gSX)C@D98SOW-~D2fPm-z=!Y=d<;wB6ZjN9gU{g$ z_$T}edf-d=3ciMK;9K|(zK0*+NB9Z;4L`##@L%XNfNdH2!wRq>tONsKWmpAPg@Ldd ztPX2H39Jcg!P+ng)`4|lJs1q@!v?S+$nVc>44c5FPzsyD=CB0}fh}Px*cyhyHn1&h z2iwCAFbsBtG8hgcU?hx!(J%(a!Z;WYJHgJd3+xKJ!R{cxQ8xi5!X%gsd%zUf6Q;s6 z*bAn^KCmB@!vQb@4uXT>5I7Wm1&6`ma0DC)M?nrMpb}<66;wkWYG4-BLLD3p$3Q(a zKqE9kGaL&o&LbBiI-=flZ+lHiOM!3m5`h z!d9>~425lATi6b^haF%T>1#X4g;C8qJ?u5Ib3+{${;9j^7?uQ59L3jurhDYF0cnltgC*VowhTp?e z@CSGro`FBYv#<#M1b>F-;CXlfUWAumG5iHyhF9QKcnw~MH{eb9EBp=Kg16!C@D98S zOW-~D2fPm-z=!Y=d<;wB6ZjN9gU{g$_$T}edf-d=3ciMK;9K|(zK0*+NB9Z;4L`$w z;1~EW$bhjv&=>kae^>!lgq1*kOKW9V1y+TDuo|omYd{IC32VXHFbLLxbzwai4C})N zupw*&8^b2BDU`xyusLi2LtsnT3bux!unlYr+rjp*0}O*5p$vw@2p9>YU^I+@u`mwC z!%na>>;k*OZm>IKVFFBqNiZ4qfGMyiOoeH%H%y0pVL#X(4uAvUAUFgLg~Q-*I1-M6 z3aErCsD>Jt1$A&V)I$R_K{K>KE40IGm<#jZ*KjytS=`P_uKn>bhBVZMo*kx|UY&8>E&18S3+wZZVPUjhwbnJxs?X<|>)Ts%$K_j^{9Gpu8tNLCVPQhl zHP+NM*0s&+Jxo!n>ZbOYy=LPKddWtISXMnYOi`<{a6epag9 zP&qf(9UXEv>nxnjBBuxy?PA0}4myTAS7nZ^fXgg&lEYWxd%) zHdoGy_NJ^axjMDKn5(CxOz$-)RFhH~w}Gq^dQwW`W;dm3lG65|Ry8GMsv23>)TES# zwdzSJRn>&+sU%U~R9T&?sjO;?4`#KMt+ljf>oI;|G`BR(l*X&_LSs{7K9}=TRkd~X z)h(>*Gv~F@xc-1Z)pd<+(WEqoOitTF4xG7tO$fV0B5`(8U3GI?OG32{X4yrS`{Y|& zS!%k-MQmuDm7CVs#!~=S8G*MLqk(zZg!2WJ`;V*)jLZvBuzI_(~|d9HE6vhucwY} zWrm$cer}!rI;X0YyVxyLdF8A3m|K-MZEAgd+Yo0`dkY&-TX{=U z6)U#$oYK_7X_;H{hd6Pc_WHKEiEL;GHXXug=A^iZ{p5j7kxiWFBo<^-eSW|8HkQPs z@`8eW%n7BL>lvhDty9HB2wBd#rq-HT-3+aDv)H$~N@mP!Amo0*%7iv4XlewSVR~I- zeo9MI18vqKdo7#KyoPCF>hrUSS=*MURjcb-+bSE`Pei6^r8$m7Rc!Qf@(~$U*KyFQYRcEt)K%3{ z7?-f`&Q}&pv+tBOIyU3nygD~C-!>;N=bl_=%6UZ;zOXc0Lkr83@$IP^?N-;u+NLiX zS#PUJ#av>v=En6>#@S18N6ux67qU~(g>9_F^~LH;6ecQ7lqPCTlqRa>)I~1A+Z)>w zv#AOa)v1z1RjMRWjk%%==2w(NV386LMM{LKtgcR4iIlKvZJ(L65-DNT&|aUk5-DND zU67=eNC~T!d_&Soq=Z$Y90<+cpS986N2zaZ89zqWYd=}9Cz&@r$xf-&?isAL{GV@e zI}0mSwl&pIYZOqXbH}#V*`1tsGbbn}TCQDAW+QWV?h+S`h|6Lz)&lz=lC=&ba;b}5 zC+DlU+apI^YL|7Nr61){Ls453mqg}Zz_ltT_U5#^h(&=Xc4-=WlImC|1+K$X3cBTJ z#$}}tSj1tSXPAPuMGI4?G3Q3o1j;|sa;-B9WZEQ@CoJk*yJe#bh%Lma?lOT(8{nl-bwm*rjaL+?+aYPF6Rm zl`(F|z)8(-n$z65ve;})vl6QO3(8Ug%xr3^mk4t88O?bl>gG@@PHQu3sy%D5%_@76 z*4nxnb2lLhBdWiZAbSzMt4gBM!Xo2juWp0w1ednDX70(bm1C1{kuNoMEKr?&sug$q z0;Bq-S;NZ`8AaOYxG793az`hY?2K|JqP8tJe1thnCtE?co1Pi1r>1FUW|>wpGulWt z5_8X4Wl3|J>%lm0xt&u?Vl!>5tBP%FDrc%#ZY8g&&o$Mn9ZIx)g>u0*78W}%$yuV= zlX`omuD-ifHD6Q7GSA3)zcIa%c8dQYVF0aOYfl!tUFe+iEjb<$8ldiJNE^ z2kxNRqUwBop37l9!EKesc}}q>`aU+7#7<|g-r${Dnws5L*=X7uTPtgPKm=D*LuZ2j zZqBl8Ol~FnFeVXu25!q*>p9PKrRICCvCd6a)pJIozbEIIOv6m#)SKmAfUBLadTzOQ z%}qqPizHW7QRPl{PUigDWhgf)%)X6dCHo_vl3dT{xsxM%Jzp}xTmiDTki(&g5hxVI z7m2m`xvnyEnlBdsw!-MF-%d6+v3DlpjK3!}+uq&cV$gjvn}E3v;%t!_N=)ZkkEv^J zmWG&aUDTwlzPiL9Pzu9t=0=Sb1~y8oMQ9HZga5CfC@+nE>m8 z68w8k1{N$x4(VD61czQ=H{xGGmiZ$P8uSS?fbt9;`+&txthc1A>%Ep<+1 z3+p*|b3~90CKk+UC3l`FiB#r?W?|vUeIkNY=gmE7DrOzzI+H`BT&lOR^+?}KMo!*m zySqx9<+Wn|YP>%?r@Z}m+y zt@+wUJIjtIo{(KaT_bm$j05MRoQc~_MFQCAx>j!On5x>NZ?uyroWjUAHd}5x*4Jma zn=R{_Y{v0dnopKieEDg7=#$8|(9mM*w_@1>WJ8v_%<^4w@ZZ_AqiX8ZckZ^U0zJXG zjw&Iu$luo&2{IEZp?GE@3%SkIT2)8)E_pE_GoNScX=b&v`!htd6QVp2%r!iP?r>Ej zn;G7+@5vv_#@5V=!QR+PnaLdH^44E^16jqISf{Jap|M)Z+%Zwv9h0A@-DX$Tx97D$ zc(+9MUfz?_qjJ=n`<>WM7a8?*5BaAc%1w6#AID*?8%A zaYs&~+I2uy9^d%pyIYIQcYDk;U)khmamK^6LZT*RuC_^v$hn;oN}?9 z)+B9B0lPrih~vVVI<|Kob!HRU&#`B1oMz2VEofxHM+FV}7IyzL%=yAT!7?*>b7zAT zTa|&C^!1q*i=7jbW(OuGxw4H(^R#BF+!U*;>>(-0w6Ss7m4S`Zi}6>xC}>x+7m5sI zm*gj66XoW1BeIWhL8Cp3S-8oFzBH)Di*XGuf7!LSx7GNYhHeJ@tme(h8wc^|?xyT@ z%n4n>B+nL=ac5|`(c}2lpK;^)`K__Tc`f`%cA^L5o2N;4EUQzlu6l0Nn63tC1+Ouq zmFfmOml$#;>93S!5y*bd)$dOV-DHlFe*aa5FZc<2A5+f8eclC%5yE0WWo?62D3q+y z$fZJ9g;J~u#|DmH^nJwHwa>)I`?0Dr2@9qvZ#TWjzI|H5X?Jg2I;)%o zr>FLQxzdR0L~o^XOBS`&wQ+(R*B4Cdd-mRj{ZE7bZW}*dzoeX+M2{V3w6#oYY->JHh6d5j8Fyn+Rz|KKIi0t6m=ZeY z{7!fNlPftVm5V)2OC^r=Hy5wb6uTk68qlIFpQxG5xlgJvA|uCPv%;~hHp*0V<2RU) z%O7{yZEd(ECZ}f9WG~-+)wa}}9@;gS&CJvx`!tDeYm}^Kb4@0L)~J}%K6|b>rM{BB zb5>(L$tI*HZ^Mv~VTsZM5Xf{HPaa5=}-?%yoYhz)tzXIrAFY8=~lL zN)^`4)rB$@7q*O3Wip|PM(H9ZT+y6)W>@Bt@l&oaTCx0L*vCjIa4xKG?1mDfGF4rX!uSs|Jb0n5RB#NEr1jkb63NGiiOZ7#lpCeL&ZY);$rUh)UlYi zD=p^CA}%`nrmUEw>Xj;1wKgdhChFfP79=((7Q&o?7jw6TNmm&omGm%L(lBj=RDox@ z(ei}SgRPSJq(u$vlNA&U(n>}wG)RVUr~FArFQ=Oq+m~3cs5I%UFA%wRVuyq!Yfd*> zcBs^&SYfdABUz!H-x1o=F+0VHL2<)mhW3t%zqC%yWunwM>mg-9Hv+@ET!datmKlaI zTg!|iHp>je8Tv8*Y zk@Y}|(r43`6sakF#>A<}vXySs^qPE0N=;IfUXw3LapKlNk(zu-5vTN;#Hq+U$v~>~ zdGaMGHAzu=O}-?>$&C(8*#-HMB2MWwiBpkza>GeeYVsv1HN^u?Q~Xq+bLB9_#V$|x z+EJ;_C#e=1%b3+dW1}XGSwB*YotiW@{UiEp(`M)8q`8#Z;jqbMR7ujw4VX=Ocsb47 zji*g>@kL2DZY|3*L8`+i>78P+%plQ0G+IOjQQ~80WYbF$x~SLM6dO?eNZ|!WS?FHT1k-G16WoEEIL0vYaEi0I#sIMiyaUUlW6!zw7dz)l@enIUj zhO#OMrq-0g7(roguBwKjn{BRMSrr5;cnF{{n-r5}hf#GVGb@OvY?Fc2-qt@=kZkcZ zlVlh^8)c{eY6fIi<9omZ1HC# zQf8|c7L7D|omZIgkcM?;cP;(|gK|LjPiPgGLWiL(QFx}>P9FHZ(=M*;WTNzy%0TEv-W zKIJi!BF?@v>0EH^Obt@RDjCcrDkmMiq!JZ7cl9ug&pwa}&D?I*Ju~CxSotK%U4SCb z);RZKrOufV06fL7J2LFSpimDS{0(z$?6nj_84|(RdImJOtZaC913fMbT-_r+frr-u zL;v_sU>S*lsT)8XSb8nRkg*etR7|mU1%Zo(!b)lDqZSGL4+T|xYU zr@q33{Ajr}pG5Au@6oQ)L5HK2bQsRk~@go20AoNG!! znv1%&4Lpn>wboKDCo-U3i{d~$vn17PRKWgabDYYzcbkDt{Iws4U zBMAm)e(|(3NO{oFC6rbYq+=h8u}?_)21$8H(l=e+tP%Cm<`7T2s8;Zi{FEyU9<_8C zhFa249=S^z8qFCdAJKHS1+p_Y+53QQLKnp|7R{$CPCWbR>Pf1Bu?#c^H=+|gy>A=fdO^e z5lx20_IV6fv9ocSH)N%*icg1T`$<(SuX6DlkCfYKWl+V_PreTEmq}HuuD8TpUu(^_ zZy@x}Zp!&4pNn=@1+p_Ydt@_n_OWSaULZSj>5oxomC6RD`(mpaD!U=`^m64 z_P6Dszr6j!r72x;X43nUo-X#2uGl}7?Prp%IDIM{KQitcEqZd?=N~^y?o5>6Dv?J- z^gPDX&VW7zDUZ7Vl;BOwquPEhd2l>PlP4Wj8}ho?pjaL)SH;n!5AB=WZkfDJHt?2Q zqQ}R5GX$ECW9K5u(NFr~a7E!YwLvxVB#chdPdab&jvrMXPdkJ7IenjiRtk*dX_jCV zUZGcti4PN88zrua>_h!NoS*WZEDCj5|P8Id)uWFRqZF8 zw_A`5I&cfxmNV_c)8;z7pY;BI+PV8lUradl?g3p(AUkt^8K#zLAUQMtT$VBmBxmNI z!ct~|3A>q(1s65(&J34x zQgz0>BOrLAhO;h^ow<62MDW55=T@}Xxyz07YHp1C_i{M50=cj@p3*W;ghuy@R8^|1 z(9yjwqcA~V;9O*m<9BBIswKqIj$P9_`J0S@X>dHYbd1M_-*axyRm*yar4;xLY zX!ux)cp=N zVe@(x70SJ^#W%WI*L}x|o!yiIRc&Z1HF-rDnKy-~s_nEga4&^XCSGwyDhbzZP>`I{ zRn)*zQY$pkHwnbTPP-WTMKmt8KyqgO&K@tOaaLM!M)JZceO4Gx`zY>Ko{FNBFeA0! zSFghHOLC9sl{hXPCAc`jlff!lp`PX-FVJzJ0|%q0Ip|gnJc8!tCJh(4{H}s;#c0~a zG^M`3f+xbAU4iV(<(Q_MJf3z2_6X=@wbM)~&@sb+5CK3-bI(BJH;;}O4R0DRe3J~qL&u+5+t@s1Trr; zN;q0AVOa3;ql8moc`pIXOOkpCV9OH$?8}rAUQTqT@yn9@9@Fm93iU*6o=8aSP=gmV z`Q1PqM_VV=L~OmK`gJ4NNMnC(np6vB(cL*u&Y_c?xjl1n?}u`27i!Kh<=s)vJgvkz z#c!8#wn~Ui{DwhcbT!HM=u*>ukL^b)2foJzqf`Ok0zIP;NbCiP*P+xtTAJL-XJa#o2}@DSrLeFA@u5bLf%xiP?9I z`6db7{2G^3!(@CQ^Cq(NI&4w8o3wO#MdAHrmjny8(!8WBtSOemTJ$3$cDcAXx*&9s zH>8BYjS?Cq20pl;ks2Dy%h3`M)tgJ4uleD)q?vh@T4LeYhilb9B^N;HVf8JlBxnO& z5V{zTL^4hb4Q+^or58g}n}vCqTi6)7AarpFruYOUp_2_KZ+}ax#^|Agi&f~M3qluL z2lo^G3+2+P(!~jP``)>PlM~ZS6JwP85)WQjmt0M3p?Yy$T6K2EXT%Lq!5|1TCFBL3^ z?p`jK?opVGi&WUMQ6(vj8vp}Bf3V;El-gf0w! zh~MQHI)z1{8yTd&lS1Bj7!`yr_9c&D6;2Bc36W+S%b~e`mquc}2#Z2D?!rc|7<2nA zD;1jAZ8~@gO&)?2^SCI*&AetZF~iY|Did3X31;6vnd0FJQtI%#TzU6piepe*+`VYU z&OfZ*oqf4G*-?jhfgIMy@{{*xhDmy{z*JtYSzv0!0#ntI=+Y&s5erN?Qz(pTL}$wB zEzb6xov!*o3e4>5JOeW)g%#^7ahG9m&F(b!%Fl4Fy%ubuE|2@Dhu1Zsy0{?l4{b}E@{8_i>$qzZeDP^C*h~cT>#ni^m}yO92Lmv z<||DSZiFX3K zFUfT%nt?>4in~b;`K{=Stywh+Qs4i(TZfoN+7mu|dBo z7cF+~ZdQAFt8v&Sy&1ZYer9|M@pQsKu62?|R*MbIsib>{vde^cff^deZ&(h^m0rXl zx=ZdVh&(88F6Q;gvbCC5G`k8CVrm>cRRT(6lINjtw{rE#)mkWun=({Z-x#k%hJ zt<<_sr4|}GYJ<02>omgx=hEwIu$_1B zHc_CUcbbJWE%{dMDBQ9wUC@1{=byKEx6UevCO^4T+r+Q4wN#p4NN~ab7mu(Kvl1tB z?!A`fb8*!~BMFvwR{jTvpo-moHU2b3u*E=jf`O zqqjyov3t(_to#g~_Tb0fvbzu8eRp2N*2JSW>}9L#n%r+!x&bV$+3fi2_zX6avbnOd zN&A-XJ8{C)N!hHIMorvz@}xcX+^;;l`}nfmN0mhdBlnp+Val{AQ>JGFdH9|a_nffr z^zzBs*mUBQ?DV~-?XllJ`|U-P@gqiz965GG*~l^DMvodhcJ#Qiaan#2Z(0NCPORi- z({hYWtgO$LxleMsP#^9k^Vi!`$JnaTl~vL7xa#3E#||GGP3QBYYR1hRJ#Ji{RBDDt zdd=|4kz?{B@-v55jT$*Zen!*eGqPq}7{6xbc=f4_?P^l<8Rb-OH>zxemx8#XhL6aP z8#OlXgGBa5w>d~zq>rdFVl+K+q<1xcBYphXQ6omy#C|eO2EKe|O+nuAPX*W?3CQK< zHZ)}86l^`oX##39U!44#8Ib9lIWCjQEZ%QQri8!dvr0*35BK$dc0|EOIV-R)Bct!v1`NrnQSJTo!%#t=~}IS#>em8 zGmJNM%}FNzamrV|j=C{FBq3!=wNNhc%e(v6Anp{$FPR#~U$};i-)GHCW<^W|`CRhK zh~L?7@&Bdq*UXX!`)4{b+3vH^mRuXhuSmq7>f*1be2aZ8RR!IfXPBSzip3}N%XF`s ziP~qtG@Jhq2k&RvW&WoV&EG%WlgYd{AP%tQ@SO(6Q+&%xy!g|(pkJo6q`aaWsq?~q z1@VWvxJ%vNWd2V-HK7z&^O5g;vtj%tE`C{t_DPBF^Pc*d&3|?5^yi-^kDlkJ<$K?3 z7{BD&IRBE13iJ1QFLd$O_rcuXC(dlR(@XNbZ#Ily;o?jF6)Ew3-UB|j`LE@JxxeRc zd9^gH`N;Ra*)V>mi(i68XG(mZcdd&riI?pJ)lQH6Mt|>{4da(xXWPF5qq2(&+u!Fs^b6ZQ8)2v8f3jvNiv7s|7_JmK?$7)9@;w>9nEM`*`N;Ra*)V?go;ZH? zro#9>@7n)k{3R}a2}vzUiSP4X&=>HhM zOU3U>iSP3s`kif`wP*?5KDYk9I@;aI_hkF@xcH^`^`yl2dCzz82PEQOJ#oM2_%7d* z@k<`I?Y{|rC3h6Izt4MUtG(V>@qdiJbX&RpD$732wae0t)b)|Oej%LsEd1W>AJ`73 zc#*%OUVK4K*{`KqS?uD=j^(;Iepe#?fFEppaUCADcqX&<(9Lhx;pBU%5^kSB{F1V) zwCn97080Wt@C4b-UOI3WG|AfVl_vre3 z{yx4bTcs>h;SNfE|9R+M;r08}mF@Mrj#cb?sVaC(wa;TI?cim&q@F=ghm}&s?eU z|0X4W-|j|eY-Do z@g-N?{>Ae5@qbq9|IaD;`*t7jOT2t_dpzGU_ewqO*B^h}8}w1Ue;b^Vzi;9j{pa{(PWRrv}ZSxWxC-IuEPI{y=9yl{GN@dv5=2c_ii+kI*# z{rFNWe}CThv&w&$l>B|WFI4fDCx0J*BbEO~Df#<$AJFH2%io`Of1vW8nv%b7_gWQy zdGh!1hp7CAq~!10eUXZ|eY+3s8@G?nzqag9Dce}CU=h-&|el>B|WFD;V)9-nQxZxoy_$@sgd z{C7#o-?#hJeztv*`RBhl>-efN}Tm0!N|LH0D z`*t7DKRy3!bRV{C&I6SMj4@e7WYAufEsQ zKEA&%o>BRCrsVJ2eW{AC*Pq*`ERsvx=#z}!rrN(PC4b-UQ&&u1e|pZVl1uvNlJQSd`Ja}Ozi;;eE2ZcE(F-$pj_w7D( zK>GUs&Ha@EHcD*qc&^7rjN-^EYvKc}2}{3mJghr0fzZ&d!>Df#<$Us@#pqp#Uu zXm9cFbNS0o>b{ixeY-Do*VmH2zJFD5-xvQ)i|_A?&sFQs^C|iJb|0`xdi&q}`ggDQ z7T=U@P!jd|`RgNpe_*J)@33^$IKGaT{O-3epa1h}`97c0K7P5@y8M@S`3`W`r=6;O z-b`s9zg!m;X`eryyVI9?9(?{j{@W`5w^Q=>%XO%0pXJTp_e-3n^8X+uf4^MktM=FX zhhq8r_@Arw^YfJaeY;N`81LWo`Z?%_sn@5qkM9?%SNZp(!EBoP1BlAL!!Ces^F>d_OL&*2VX+{NIOed}3q$JsH15_f4|@9~C`=Y5AUvzmbV=+h?Pc_&)E2F20ZD{~rJ0wO{G)$@rx% zzRY)NN_?O9fVI=}Z+-5U$9;VHo{T?Kwg1qR_&)Di7eCqlw~l$a0JG{onm+#5=lU4gqPKodH9y%yKzW8|ZclP}sM*V~GJsE$hYM-eo@qOO& zUHoMGTzk%G(fC#Qo{WE}YM(<>;`_Xpy7Sm(j`M+J~=SRLL<5#QpsZNRS^Paj+ zdi!)vczd>wFW-~#YgPNyro{JoFLd#f?K5V6zv zv!xhyr^NSpFLd$Ean1+iZ_}w?MB{tqdounK7hmoVEJ=y)^B#P&J-#Q`|4-MgjLzTW zdosRBg#n|3-HPq6k1~6Q{riLOO+Wusvl4wRjlN|vlXp5|PE*S<=G7AF+su~A#;V#Q zX0_KHF^gA?HXXq`E~<}^C+?1@YHmKFp>=kZ`EOWr^-LA5&$2$;9N}aBTbAknT5i+m zKK0stzdtEXX;9{gbSMb?6;fpQ&6d7wOmG9*x5L^(82K14YpP<}?K2$Z#% znc6_v9;G=@rl5#dJYQ9!5Gz(XM1fejN)%>1Rvtl_8$^B!MLM10_W2J=N1$v@;c0;~ z6=i;))S+|+%5P9E4HSkKXBGs?>nIBY<#Ut@5{`53&)1UGwZdggrYrE`W>%(bu(mk} z<)Of)8RfA+IUA)S@VX79JFxj9%F}_e1SP}JPx(Vr@%f3b3j$?5E{)4J&^Dt{x)_ie zdmSPQmwK@>2c=}VR<1xuX|b^x-o@7e zOvTEhd@Tu-XHiN~cAz|gvLsMm zKv^0nZ=>`C%GW4A1WNyvxcUy1bx=xC zv{{*wetpIoi%iBo$Ck9=#0neV0cxK`OWLezY@|jSG-ID9OWMd5)vr%I|4WH|CM;>Q znz5PeZ0vJgNgH;F#E}ktDY4IHC2iI)HoNk_$3Hvn)v)4iL+<;gEri?7w7xV4o>T#*y2Y{rc>}|5BHIE+lCqYjVFn+c_Ki zY)8^&Q)9CgvTSMg`HZAZsj(T&|MIcVSR`#WqoiLSd0tLF_Bn~9&E}N!>r=-6lCyo* zA!)P4a@Y)64jXd}>od&NWuF^J*0q(1BTHZMv19*}Hd`05LC(A^n~M3AvW4c_c_|S; znIeMSXIdqHY&N0Pw{=7cUou~~IICtPj(k>;mEL`ijCcBTckNYXegu-u4hKl*2 zAuBmA`9U6KBVXSL>JsIHK;hLq@_KytF-v)NU8CgFjV4RkE}gIODq&-dmHz~BB)~?p z({vx}wPS%Yu|TOVP>wH9&M#1ID^Q*(P~Is}zAjJ($l)%?d9wm#Oo1|~Ksls9sVz`W zEl@5A6s~+5+Bxklb?w|QBTC&|&PlY=GLC$^0%a7+l0X@WQo_#OZl`nRnO7KQnj=MK z`4(!gU@2M~Q65E+^)*&rLn))x;^qD+N>`w)EvEyhvCS})Y@qCgvLsMup)7{j>qMsH zvq`kpU5Zl5i9~GkAj%R>8)D@}@!|v^R=#j?Hjd(~N{r6HW{8}g@YyJ`*%@VVU~>>k z1*Z*h$=IwV76)N9o*LE1#p357El% zaqh zp(v%>Yp;nYoq=)$O2rP^W;ROmFs;l-=?au9P)c{yHg}3mp!{Cqlxdq+Q5FZv$0(g# zQ^!l^CzQ+xt*pj++8rpRC?)I$Vy}@X9qcM%WeQ3Kr#-RqEAirDBv$HCc)O8OPC{86 zC>No0?__Q4nt20C$Ie>07p0ujIf-m-o)U!<`&fAyrEH>BK1Au<%PRJm@-51OeYCPN zTU%y^R)(M~;SxHYi!4fKg;owkDX-K@qbQu+#9k+(lyG7YE9aq9)NAE-l#XVr*!g-9 zrRP|!e1sy$?>Np+C<{1|j+M38Lo7Z)d+mtQb&6K@N9jCGD|IN@^K_gOB+mI-xd^4= zLap3_(si*`x>3q5)yf+vORmsLk0>{2r5}5&vfH$>E=u{`S{aTapY@_W?L?=n8!0oy z>wfJu3#IE}tsIZi^O#mHKw0p(R_>NKPiW;?l+2S_`3R*eQ2Me5?fj#**&3z!1*_O) zx{KHZ%Kj)_fzp6d`jYlK6=g}FT#Hh+Slc{?(h(@HqVxpHPvZ3#?X@YFhRuO85~VXx z_C)Cll*3RK2TChS>B~CuStuQ^XysZIx!EM^s%?#DQL=&Zxp+CnZl^5pOvmfi%PMQh zrRp16*;15mbmZMoy1&)Rbd(;a*f>=v*`Kw|aia9?qcXeS z9Hnbx?KKN!aiFxKlx(7HPDIHD%2_CxO|6Yxf|sL|1m|wsQpmuW!IJyu_=ob`2|Y3WbJTD-%MqjRk|WY=IaW)dVZyA??TBO?iJ!RS2osF zl^o#}@p=ZEB}Z!IO_T*kc_nYI*6SOyxlq9?QY6l2cr{me8&Q6cIDxVPH>(y$iv5{A z3@g2tt143#DH3NLytuBxuYn0M@ugvD1l)RWS)7SjXDMm+HsW;&Ud@4W zqtqTKkD!zttGyPXED4m?QF@$WTjK+X)2h9GMCoYL%7Be%!$4UVWkH~nqI3nyb|~F} zG6rRFpzMjVBv1}T>2Zq9uob1G-R5JJ(@@F+r4yw&P_9Dhr0X@_vpt5=9Vl<2l+M*Q zKcHltVwdu&-0Unn&bNmA2BE(xvsHACv_3ZS+1eYO>ZE2NbTbo+g;JaPzcHXy=x_<5R5&z*RC4sV=^`G*0u_F7`;u2R*cP>k;1FZ#VNB!6i1ZBuC9I=d0V~2DLr1#MLqd+1j=lb z?np6j+!nVJv{wfsMw!{vByXi{>4>}}@+CwrImO1Y%k(;w#ix3OH*3ppvt&9> zkLq$t$r)aexe%iTks@;{O4*r_4f7>RbEL>zn9%dRjZ;QsBSq#yY?eeyol~06@?J6* zGM2e3P+mmo36#H~EI3+c;ip=}5*p!~9y-q~w4wQ2x@`c*wYLv`H zTIrHF7i;Aal#WZSV%Lp7q4WgGUs1A`X`3&_>q@Qk;f_)HRaz-Q=?Ij~P`UzT3`*u| z?KKsp`5LVpjIuaTW}##kc$>!j9A01Foau}drgF0P>%P|7*rhxNud?g3axzMVQ|!E7 zfYK8v3s9P`_jSp#xErPG2Cqn6W-oe^SHxzKL|&+sS0r+vyn~Xx#oE{mKSgQ2)q6=~ zen^2gYk5T?|BOxM4y~+I$~qP(>!Xz4=_5-V`8nf`F0T+FGem6e(aMe}OYYT?vnbj7 zy^X|?Q-|&cy+WAGUf6U#td)aNx}DN5!!J{tUlh+iqHQY0%PF?y>rqM`)i!fb7C)|) zlTk{a(8@U|Wr1=PO3#zp=1%eI)=D=@Hd3PBP|wKd5Wi1&85{YmZWRB6=gpCql>MWW zH6c*GL23TIt}C+{^Yye=Rz+D5D5WT+&sZDV8pBb#17)%(&uW_^QMwjs89H5alIp^ROr{Yvoy#ir1}T*UUFjO5e~nOHnd^)i&Rwl>ANG^xvG;aEgtyHcD5Z zY=KhpmX1?~((|@fCZSaP-7E4l)ACuYl@X$JyrXPJicVHcq!FJijBy+BMtsI5YvA$MjqjYbimD5lbmulrQl+Mkxat}%gLk?u# zZEO4iWy#i7>1VS43rc1iZSxLF*|u8g5gR^(qd0xHWa&5?8)t2l@?qL*2ufy0UDsHY z#ZIyL>?I1L>*EX$L&*-;$}E)55n4G8B{NbhXQM0$l&eviM`@dTMH#J?7g4ffwDKNG zcc6TQQa)DO^xcYl#%X0Ol(O+!*&L;LC#{S?DcM;olSSE8D~F1*yH<`y=?;|BQA)Gg z<^q)RiCVc1rDBp+9uQ>@tvrR&$za&Hu-5l+s8!8>MW9_PQ9QJ5X*A zHz=83X=PP<9ZL_>%ElYLw1OZPS8MUagf5l&%`BTp@Alv~s7!Y0}D5D4Axhyo}NjC?BAdwrZQ7 zP?qo{RJ=?}=wI!gtCdYrO6F;0N0jD3nToPFP!2^YJ5GBYi_#e=XQA{2%B?8nJoysm z^At)~puCS#a=f>3zi^hxoMM%J8TYehnes@nKW0W7MvAPFUlV7EQ|z8?Rr-WGPxFz* zW($ZaiE-rQu>g#xd5diP_98K zdsy2%Aj%_Jc>$&8QLVg-viLErd?(72T3MZ*ZTYMmZIv54Wu-{j-YKg@%Fa$15Gm79 zvVX9V?NR0slm&q@Q?Sef2@2aP=-w3*PPdh z&1$e>Mk|8?rQ1wt8#{JID|YOPQ_T6H9lN3xJ9fn>V+rcUuIM;+?21;zj*DcQ;qc*n zvtw7BV$VexGqIw#v9*^JD3r?$i+E1$*cGi%%-9vJ*s&{4F_G=q6>Ve3u4o%Oc10_8 z?27iXV^^FqMryWWSG1QMyP_34cEu^f#m$aXaf&$)w_`=-jK|oGRB?(~$LvTIt=N$&TCpQlv|>l9XvL0Haf(?McBG0{ z>_`=@*pVtajvc9@6+2QzD|V!cR_sU>t=N$&PBHn|kt$9x%fgOSaf(^WcBD!Wr%a}_ zVn?cI#g0_biXEw<6+2QzD|V!cQ_L1;N2)kwgk0>|kt*8Dj!SWh$=QxeamsMXDDm09lPQ) z6vd8Ramq-k-i}@IikNg($dvbzMOa>`6tni)u`Aw2lD1=4oH9b{vSU}gjkJ#)m!cIr zE=4PLgo#${2otYJK6ZqOS0o`j!o(>fBp*A%#3^IUKH&`C zo$Uw{uOOJudi)>nGeuh0E5jwS9bw{ZhMNo@mMQIJN0?~Ejxf=R9buvsJHo^%qh-GA z2otT?5hmKpj*f83@DZ}$-;gP%7{QKw@QN%!JF3AcX1UwZ2u?9`YDXhD#jLA#G=lcB zqY<=XMyY_Gjj%zW8id+lX=?VV!kvc2|NvAy;>j_tMAitV-6itV-6itV*`imA)? z+B?PMYJ2^vHkB(F&Wzacdgj| zcdgj|cOA#}ziY+ztvki8t8-O8X1Uw`W$h(f!d5}fqR6FnxEGZhaG@f%r9x%%0)^W* z*2c`K?HAUH?H6{6X=fbd1l4+(xe#S-uS7PSFehx*^olvYGeN(wvoXuU_5y3g_5y3g z_5y3g_5y3g_W5eX_W5eX_W5eX_W5eX_W5eX_W3%+9Ghe=*70*;)-h3}E6B9GX;s_j z8z`r%8YD4b+P5`*Vs}du>mjwy`~ZPBC+8`}MSq?bp+a?ZwjyDVb-y!#xrg z+ICAZ8QNYvt=L{Xr(#dC^jG23hA6ubX1ePm8C^JRO)oMQ5^ zJz`EVXAZVUOxxHVF|F7hF{jvLlj#xDitQ28itQ0|ipj_Jh-t<4h&jb%XnVx8Vtd52 zVtd52Vtd52Vtd52Vtd52Vtd52Vtd4#V&>HLh&jc~h3yg3itQ0|$_Tkqusvd4kwCUb z%qy}8ZU2{7WV^8aUrsTtfk^+CQ_OXx?d|f47}=gIuSklvCo36;p>Jxq_mCglX8mLOV~cCKrww% zPOQnWo#PBF{f z_CN)S>49>J$;b9UImK*)wg*Zpwg<{9vX0pvD5se7AKL@v6f^Ib(F5fayQgKU)GNlu z_CPrsle6uC3KY`=6)2_$Do{)hlvZpHlvZpHlvB(aWqY8UVvZ@c2TI%69w;5h_CPts zw4v>R(l)jS$|>d?!1h3SMcUBzKzT))!}dTq#ViZk1LYJ`m+gUaikS=B1Lc&FvhCO& zC?7}mB(?|2DJCD=1LeIiaXnC4u{}^)u{}^)u{}^)u{}^)u{}^)u{}^)u{}^)u{}^u z86hjsl_yJYg}XOs)|OLDpOmvP>)69uG3!{5R!kdieS(c+_I0KWkJ5_SOI)NCvvt25 zDAKCyoT%cMqs*a!BFo~6K#`>12^2|svy*fjNxC{vBT#!353y;LdVWlpcXMk&Lkq37QmC>T9?i&jPu=$qRDg@&%VJy2-q*F%Mb5(<$M z3Jo19a*H#eFsliLoD&KSolwX*p^$SzDacuFKnFI`U>Vz6>XwC3Y;UPkq?uiBsZ(UJ zyWUc5V|z=rjqNSfHnz7^E4H`PDQ4TTy`|d5_Le%uY;m@?)F~rnyRf~bP7%R;R_1@R zW=6_NUNLiF`zys}*xdL9B`PIqr z*Czkzyo?QYyb%Xw0Do;9QP$YrUhBj*o1(}ak=UjTWiX1h(K*v$Ozjd;KJr_Rt7S;T ze6o1S$JhipOIrQ<43z&teql29I?#C;o1lH9AgpUpRM#x$Wo&}Fb_nW{UxSRj<~T27 zgB_jvC^Dz@6%Wolsa zgY$}QRwUU21Dmx`CI@jgN2v&G%21{UHhZDe2R2nG5;?A`17&Vtb0tbeVDkdXX@Sju zP$Y63rp*ejlf#CWN@mI_ zF*Zg$i?8$f7T10!%0d*obi7wK@Ol{=sXg}k66Li?{66O<(R#Rs6!I}P z!Fnj`N4(C+u6i* z^&^otBQHJga)gZMU4Gkh<7nQuk@Wc(n_%AM7#`2N{9?s`D~75;XG_$`by@`3zzfdr;!- zeKgAFfz3fEKL<8#C_e-?m!b^lqvJe^l0k{pPV6N*HRZJt3{6xh6vB9UX8l{g=J zHL%$h<)Of4Ka?ebO)E-wU~?(T=Yh>*C{lY|*Lx^G1U4&h?zcFw*%pN%+iKqTMR_x@ zX+tRqY%W8Q4CA_>mEJ0f7U* zJJXwn4Ff+_KGi61M_v;7M3m0J<}#F}k&TbMB#3-3Ha7%bFQR-?;I%mLT8fRdMm!fQ z$|)r_;aNd<;I#!d&;LL6-aXE%X^;OOgb;GieGqd0%*^LXG~J8JPzdpvY34J{Xl~|G z6FEW%VH_cZK?t2=93jLBp+m@h+&f1IA%xK3_gs6eeR;3X{!Gr}_kBEmzdye7=-K+L z*LuCzT6^vL{_MR!BI-z#9$8TxB1*kkXN8EGfYK`~s$E2#heu6?-@{oby|bd)MAUtF zx}*3}&!9xIqNa(cck%2YqSm7H&5CLeQQI7?YxdhZ07bpKS&m_;h&me2AQV69RFpAZ zlv)y+QAP;Q4JfJ}S#t@Bzl=R*Jbuj|qSRzX6^p36V`vY>kJl&kPZD zD$4Y%sC*H14xTw8>N=FRtf-zM>H$0*BI-F)j~tCW5%nIPB_iq%lzAvRN{#b={aAB_ zXC%r3&*QFfYgi8bX`h5=rHHy7Ww95fYJM1HweY-#vdr_iHLLZ)uX!~dwMFvhMUP_k zXjxHeYvV^9f@en&Rf3{==uc@gO1|*iin7M@xcylyYJLHadiS^ApU+X&XGL|0sLlGb z7Ko^QQM#kZ`K7k={!|=|XPk&S14T`jj8a=jKWZwT1`#zIMNO$c?GK?$6`t2o4i%m? zC^Lj-+X3vGJdZm*(?sis;h8O>MxhMKifRy1b$I5BsLN2)xu=}cQW140p2Z^SDHJtg zGO9#Gb>ewbME!wu97rL5jz^pUaiA7BBWrtZ;Y2?w zZlWBIxB|lgmetnIUR$F~l;aU?sY50I>`%4jM@=wMjt5^}-uWmi#I)ax((FyU@;rjF zT6o?-nI=5nqO231tp{-&E<6XLbmMZBzowjkqLvMRIh>55-h1hLu0xqCJpVx1LwMdr z=@6bjQ2GeZeuFu}_dM>hS}c}?A$aJp<{Fe%;kg<`%?sc2Aj&l1c@0I)3*WN_WrpzVHB`?F z-*X&FoA9)vsCnUg=Az6Np65{1yzo7rqO=RoCd1f@dLDP~^c16!k7t31Dn=>xqSUgQ zMp-00SE7s%p2ty^2+!vzV})mj;p~Zo=P;BC;TeL`DLiE;YJMF=Pk8&Qxnhb%L{hA+aCw^?vWcppX0uY;Vn_%H7l6!psoeLSVtv7Ai^PaLI}@SK67 z=7nF+MJT<6=T4OQ!lQo0E+RZ{qbwAjFHrgl&z8sOk@wp=7)AZcg5T%iD9c4X6Hvwo z&oq<|gl9HNsqp*_WtH$ejZz~#AET@lp7kiL!n557h7(2i*`22=#N62*&rA_@6pES` z{*;!W%o3gqikcU`X9~(3;kgz?%?sJOI>+~yjrn*wMATvwHFx})-#}R?JfEScx#N4* zp)3}jEl29PBU@iATHhVdnx5@6 zike@(=SdXx`xgEZ^%}}_&*RR)4lxxg@$?c=zoE2wQEL6#ZWQxEc=kt8^UH5Ni4qZ> zlThXf&)Fz_h39gV1;TR&${^ucfTHG(Zp)pDb}<#t;TbEUI#HH+QEDo_L@5=XjgMzL zCOo^MsNe1I$1sVqQg}{AX%?Oulr_S00m?MtnT4`mc<0g{K+iP~n-0(jh#zqa=mrVU$I}^9+ibUw)roL0KX^pQ4lq z&u=KpglGE`I8G3rJ}7SrPd}6@;W-Iqh49p%sJY|!=R%a#!ZQm+%^lx!7s@)}c@kx& z@VtqlzSQ)Wjl2`t;|tFrC_RK{9Euuw-Ilxbwuz;8CZ2o|^&pCx7k&@lLg^zspQ5OF z;d|DiM1-f?XpZ7MkK6h*(fST}28pN$iW+&p<`F0*!c&c+M&9>aj51Dmu18TL?|be> zsS=*2QPjx$p7&9jh36-fZYaK|=NRUo@a%)qQ+NtcW(rR+${xZq3T3wNl%uF|_S>3_ z(k?tRQKG`rjxtYp7NQgj&#NdM!t)`@2;un>Wufr=iZWJswm6CPOL+28DugGFvP^i6 zM`;kA2`Fz0&lHrY!gD#w3gKx-nISw6qpTL5*HLB(&o?ORgeUK0J*xgVZ->%ti{Sco z0Lpx?9(U<&5KHfoczTJbV^P!?`Zb@5(pz{MP}CUuo=Z>;6`t!+mJ82aC{f{AfbxOx zJcH6#csfy53D4IkgM??xQ#c+Io&!)u2v1)W9*{SEc1NRBjK&Fg)Gs6S!MX|Ln$~@t@2W5=#yoj}l&X0nX0G$MY+CD_1M)cZcK)UirT!d`xSGLN3xTT{w;p`v1Af$H zCd%=MD<@pIx7s?;YiqWNay+6fE@xY9`B8r}QI1En#pUBbTaT`7EZxs*>uD3^ctl%V zW(~A;-sqPv_M=`iQI1Enr7nH?W2oBd?X|VSL^&SOR&iEae$;m+%JGP{`e(JZuh-T_ zr%}kC;}LBQK=rRasp;~gwlh(VN3_Moqrh}k&VKAK`+IHWn<&R4+8QLO~Xfc*GbE^`ca*nXfOKx`Wr&yC%xVJdV;sc$T3o6P^!IdI`@rD4oLdJ4$ci={ZiX1%7|_K~ZmO@%s}& zStIH>2Boj?j6zv2JZGQ`6P{X>?kIj+Q&GkU&rFmZh396JQsL=9$rqj_C^f?KCd#3n zC%7(i3L01r*IZq`{Z8Jp@d;7t&+&+5gA=^Kva#36sjvO0A54_v5zC=E#qzfspS}G3 zWqW&VZG47miT7CmYf9kWR8D&WZLK@!l6ijA_9n{lsPMdfP+G;b7osG+X;+>BDAR@K zB$Pp($304kh@+GVcxH>JD^NBz5VE=mvKS%9)gc%DV+B|Pt=EES&bQF;r{W@+|}!m}$%M0gHESs^^dD1C)z z49aTZnSe4(c+N#xCp=f7j1itYP`aV`)BZ3@sqnmr(o=XoLa7m+A5iuXp3O^H=7nbu zls>`}L76T*gHfWwb1F)k@HC>Rw@&$ez8qza@Z5tkLU^73|yG`i1QSch|vv}5t zsJBqsy{J6?K11o&Be)j)7iGTi>@c3SKzI&8StvXMP zCOi!&NzdbM{qi;nZv8IAGfqU!LK);msjc5#C{@Dq6iSKbacf?K_i)%m1?9bsXR3($ z7Dct?PuJ#EEWN_B4~l9_dxA%~Tw)F!c|Nh?=2bnsBhMp=Qh$y|9C>naHgM#*_TfR7 z`ccQ3D90m?a=929XluwtQ@_~8YwL6q<#={b=GaW_3@*cOqAon$1ilC%oNjp zGfJ~J?aFgM%533z4rQ9~e1tMrc)mwbHR~~S=gtc1^XJZ{)$E%@R4)|OmX1=bAB?g@ zc!r{=wtP=H$}-`ZiqauGvrsyP=K+*O!t*bbmBRBS%2MIk@+{U<;W+~3P2m}hvR-(q zP*w=fRFrPp1lP)2P*w}ilPEof=OdJL!t*=I9>TNZL|yYijGkT#4nkou2y6icps1RC z&uJ)8;b}xsHT#~+P>O}89YxjbdmcdFX)XIN;n^OgU3m6FSu8weHrvEb_)Ee(l-a`bPZTv8zUM8JcHvotGF^CnMVTi& z+n&ufL3s8#qgdG_v;;Q3s)@F_cm5B5EL>wIXU9ifY}T@B9`TJHp`B<|>p<;kgH;hw!|B zvQl_HL*a6LU=O<-XL1<+06PSq7Ft;Qz4^Dy{ONP*=3=`#e#MY+NiR#Ax>hG-8zt7iE z?)*|}Dd^*y$8=65w#el#EZh5*NHM$cz!@pzsv3~t6R6Q ze;1xUC{@BU0A+#joQBdYJZGaU5}r#?rU}nYC`*OsVH7p(et%v?SuQ-Eqs$hb-%&mg zp4}$tDfR1#p{x>~6Hz)uJ#{E+gy$L*H5Gn65236Vo>x%RRQR4%DBZRTuBRJK=IC8` zc17tSJOwB#gl8B^FX1UgSuH%1QPi*0_wkmWt5Mbo&)q183eQt0s)v4`-$IEB&$lQ& zg{ONfM4!2xcuqy>BRq{LV}$2Y6xF)lpPNxih36p@)w=I_5v4|WK0{Hh z`<{)au$2&=olwRKPal-&!ZQe^LU__BGli!Wr9pVwP-Y9yeJFfY8tBinD07A96Ol z3gOw}TwSxC7r|{W7nIqGc2}Du{*FGd;>CTuZSP)0sXxafw!K{B4QzWq{`HfzA600g z9FI8OD0iZQZRLAy4K`7ZN3_KS%0OGYo^jaAe$=TZ%JJZ18AMqnrhOX92V#7#MOh;} z_nIhwS$zs+z3_CRtQGZqhthrf;QHQkDqTSF>p2`{N8uTY(nEOCDEY#39!f9axe4V^ z;du5Vd7cv2{{gl8N|oACSvrCoS#M42Nz z524H#o>x)k3D1`(3xsFm^R?nH8@r+`5}qQI#iE`OC`*LrERJaM$tc}X{As@mrHAl5fU=|T zyo%CGc)mr+7oKe{U@Z`y1j?bplSYXM&-o}x;kgy1ukgHpGDvv7MHwbMn_tM9B0PJc zj1iv0P{s+*QAY8{=U9{~;TelkA?m3_;bx@37&f8Q2+y@B(}d?ACdzN?b(ERH^BoE| zM+N5B?iaE5^gQmdadBSoD0dK^HW76a%3LoBb6y5zj_{m=(&2gBnj@m-tBl9*^Ia&5 zyeL)k6DSKs&2OSC6`s{7ON3{$=^XnB&)z7@g(rrxLU@iv=@gzc%4*?hLRl$1e??g* zJRK-&gy&V1ZaW6&>DMO8pZ3i!=Gf2kxFeP?Ml2ss4?KQUKa@SPqBs-{oTr?DNB#1V zA9Wr|A1^9+oRA^XKTepp?!pJQ@b=wvh*E!!N9?=#A}X-&t~jmx)qd1NCd%=M;{?92 zvD(_)YwKSo%JGP{szh5S54-RtKWc@EayrK1z>~0j_b2v(| z=W*wS^7?0g#dwB^nomO+;YBHT6H1Bj%tje2Jd04q3D4&!6~eRKrEE8ZXAnw*@JvE! z7M}Z1rV7u8M)9X~+ZpUng{RmkzNZOgmhjw#(k9ya2&G+kcD{^lg7B1}%om=^Q058G z4JZqRXD&*2HJJQuoY#Bw(0E}i5^o#G8im5IBWWc$+foW5?Y2@l&sK^SddlJBo0^

kywOH()=4)ux%cUh`cod$pLndG7r9Nr^e3Ju+SO8$(cPqyj2G-~Daqs>Qb`pQ z>}e@Q@x3f1p4wX|Me$f-sW)9}e2U`n=o+acqcQb5KYt91lF@j+tt9eg&B zSkh9Wsot{nRH|Tqp~NCZ1qWD4B7UG$3W^eAMa{8-qGXk&L?bh7rLd1xPc$~u_QVge zJgLGq%abZqNTPc zHq%mKadm7HXe$*@&ayo5)ND&h6cvc5c%&dzXemXJIU*{~QrB)Pu_7yq6<#U@1(BGg z6h`LCdI|~)=1HY6RnTE8&U=vkDUBCJQ$2?U=X<;;7D>pqijv8sSWEhQDHkxHzn zu)$V}lCtI)&D%;$y`8~d4&$++_>s0J(QbQ^^DQNn=&+S!r>&$`N+n(xS!F3jiSENh zf8w!tA4`cRhe;(7EvmAW=uBIQwb@Eywyh+W*h*@drNj!B+e+bjsU%~G?!(1YBxA{l zt)%)2B@rnsD7KVn@+dJc5(NcC!=$G$5uIi$i4IFi7W9?%6egob+e&Pu9Th*u_9Rx> zo@77UlPb29RAjvsl`2pVarjGJf^BAhJ1W-Q_QdmTB~>hyqDZ9FRtgr|O5qAiDJqH_ zC;C$qiADbYx~trT?FO5p%GKCxJggOtElG!aV_ zF0`VO1xqa@mF$#CJYKZQR-$WcCBDv966)o}fjO9n6!o-~Xuhq)``Ah%X(`e8Fk4BK z+DfX*Qeu&5mXauJvz4NDsU#zb4qHhsww2TpODTvfwUnZQPFpElVJXSPDqBhR94W>y znN0N(N|N{1=i5rrATi&Q1<_>E@`KA*0+{V6n2%47NyixySL{=}lu8cRtg zn=K`kY?Vqpl2E@qtHwbe#c`UFnr10Qk?FRQnqeui=uAtA7qwYRqHvZ}5^;5y5ZD4F z6N!S^mM0Nyx0S>^OG!pLY^7+St;84GN@}U4qzaeYO03gXk}IT=EQql43{FKd7GGs~ zVhMI2!V`}iE0k10tf=Rx;JiphlSTPbi50~A*h+#8TcGAttRNY&JtoPdtUryBNdAk9xpvCKf|Oa9!Zv1o`QlCf=VJ1NyJXHlw_Y#g!R0`uoCrPEKu;^q%vO>kEF~H#v6NI|tW*;5=xMTtiB#fr zp>WzA8)qwtGb|+*Z4fncP7-UimH0GUNzAsDWV=)f3KH{dCD~yssfCtO7+G#9(d3!3 z&(Xqyw53E7rIwP2lvzqLHeM>R!o-`htyp2Q(^8^EA6QB}T5i=7k5@<~9*bq9k}Qm_ zkoBY@@k;4QB~y8$p2DKo zS<+J&FHn0|@4PZm$jGa`qEL#a%X*@PG4BZ_ZY$9aTZt{Um3XJEB)YL96g4M%+Dd8 zvc^^l@;TrLMimyWww0o_wh~?MDa@3-apo*QedgSu(LV)J^WHy~QRV)*LzRhA9vP*U z5C6MA72`*>nkeOwQED0TqfXfVnPdH^HWQ^hGDdyb_@4lk9*Z5IOO_cJ;sAd#@x{mznbatTb`PT{)r93i<+ad$g zHR<6`uk@qVnJDFvQQW*3XzTWw)35cTx?e#df661HxLGg|HEr2@clc5HCQ5l^6u0XI zdf3+g11ff>D`}#XM@DhOT%fIZd-PI2YM6;q9vO9xh%Y{DUXce7O22<{d(SaH~Ud-CQ5l^)On(|xl3>R@#8tNbE7&yO#%^kfrKb+orRYyn%sR?q{shHYS5P}8s-Y!5qtx<;}y>;k=D zSJ(}9hdp3V*bDZCeAox}h5ev6><E@o;{5s*tn@q7Z{P zBp?YXI1-M6zHl@g1O1>F2EafV1cO0cH5v-TKwT3!7LJ1vFcL-qGd-^aPJk0(G_W(s zI|)vPQ(!Ed3a7#8Fb>XuGa(J7PzK{c&87^fvjSGiyed#f?PtM6sD*k^+u$Zp+bp#$ zQR_I1ZJt^u)UtX3Tm%=xrEnQs0awD+a1C4w*TD^NBiszPz-@3l+zEHVJ#a7F4}XKd z!voL(55hm-Ay@zp!z1u0EQH74ad-k2!ISV5{1X<#)9?&D3rpZRcphGWrSLC!5nh62 z@G`stuflS84PJ*g;7xc7-iCLe6W)dQ;C=W2K7^0pV^{(IhX24Puo6Cn&){=d1z*6I z@D;3vui+c`7S_Ob@ICwhYvD)u34Vrk@C*D3zrlL=FZ>RFK;B0DgN@B*a~{U*02q13+jy)+rjp*1MCPp!OpM?^nzVsH`pEafIVR^*c`I1CPlBOn3=PzXg3g&4#k0ZB-~k#H3Bg`?pZ=m*8n9|pic7zBf1 z2n>Z`FdUAB<6s1ggi&xjl)wpaB8-MHa1xvhr@&Y^6;6ZGVH}(RXF?iEp$x`DIaELf zDq#XtK{cEO6QKrbp$_Vy0nUa-Xo6;Ffk`kKT44&D1Lwk2I1l~;=fgC(04{`!U^-k3 zm%ybk11^Kh;R=`uSHe|rHMGGs@K?ANX2ErEJ=_4Z;YPR#ZiYE<3)~8~K|9Ccnbari{WW_ z2A+i_@Ekl3FThgx7rY2B!7_LmUV&F(IlKn1!yE7>yajK=JJ1R5!h7&Od;lN9NANMM zfPce(;1gI0pTcMGIjn*&;7j-lR>Rlu4SWl0;5+ypet@;`Bm4wE!#el{eudv)J^UAb zhd)5=T-Ae@8^b2h4K{_%U~}jWTfmmE74(3uVH?;M)UOe22iwCAup{gQJHsxZel=`Y z*bR1vJz!7R3-*S5*a!B7{h&AO4+p@3&<75JgW(W36b^&K;RuL80TeVr}hl}A7xD;lF`ojPi2!miS z41u9A42Hw8a2$+)kuVC5hY~mePK41g22O&L;S?APr^0D)I*fxe;7mwEDU`u@D2EEj zKqX9oDyW9DU?S8&E!06hG{D)=2u;uoEieftLn};ybKqQ<3g^LJ;Cz?{7r=#Z5ln}R z;S#tMX24}|Ia~oV;Yzp)u7)3jHfV?2;SRVH z=E7ZYH{1jB;9j^7?uYsCH~2d|03Glk`~x0>1@JID0*}H%cnltgCtwjg2~WX4VKF=n z&%m>=1fGNE;RRR<|AH6cC0GV8!z=JAEQircn3P+U3d@PhY#RG_y|6R z74UEP4}1bE;ZyhwK8IEC1$+r#!D{##zJYIH4SWaR!w;|)euSUkXIKZnz_0KdtcU-? z@9+nx3ytc=hK*qp=mwj@X0SPQhb>@B*a~{U*02q13q4^w*dBI(9bqTf8Fm46R=+Fk z2D`%^uqW&VdqY0#1N*{$&>QxL1K>dD0|&vua0naNnU1!w?t>!(ccZ3&+6-7zv}`cqoAr;6xY=W8fq>8BT$* za4MVzr-S<4wKL#MNJA-Si>YyGP;B07uW|#z%VG5iBQ{g=L z3#hw8rojbpAzTF0;bOQ1E`=Fz8C(umz)ZLju7azf4X%N|!nJT6Tn{(EY`76_f}7zM zxE0#rcDMuXgt>4R+zt1@Jh&I`hxzb#cmO)!L3jujz$5S|EQH74ad-k2!ISV5{1X<# z)9?&D3rpZRcphGWrSLC!5nh62@G`stuflS84PJ*g;7xc7-iCLe6W)dQ;C=W2K7^0p zV^{(IhX24Puo6Cn&){=d1z*6I@D;3vui+c`7S_Ob@ICwhYvD)u34Vrk@C*D3zrlL= zFZ>RFK;EXT%djzQ0^ML!*bFv@?yv=H30pxA*c!HhZJ{S@2iwCAup{gQJHsx}3wDLw zV0TczakeMy1$#q2>;wD4e$X5ChXde1=mQ7A!Egv13Wvera0Eo401BZ9q7Z{PBp?YX zI1-M6zHl@g1O1>F`ojPi2!miS41u9A42Hw8a2$+)kuVC5hY~mePK41g22O&L;S?AP zr^0D)I*fxe;7mwEDU`u@D2EEjKqX9oDyW9DpayE89vYw#nxF+H!DMKKDR2&)3sd1d z_zRp5)8GQQ5H5o0a4}p0m%5l z=D;m*E8GU{a68-qcfwq_3+{${U>@8H_rd)zAN~e^hXEv$j>;CuK1*20hQ z6Z{P8;1~E6euMS!U-%vVfV|CE-(h3e1iHbduo-L)-C+yZ61IXKur+K0+d@y+4z`CK zU`N;qc7|P`7wihV!S1jJ>cO;czS*2P0r4jDq8#1Wtex zVKk`UXFCZ_hErfHoC>GG=`aq?fHNTtWiTEpAOjPi3eJLwPz!a?0B1uJG{YpA3{&77 zmNGgs0&dSOU+% z3$PSkgqL6$ybQ0vtFRnigV*5=coW`&x8WV=gm>XRcppB158)&D7*@c);Xm*Rtb|YD zGx!``~ttiZ?GQz3%|o3kheMOC2S0v zKsVSFHiOMU{f^rfuqA8-Jz#6t2DXKsupMjx6YLDTKrh%8c7xqv57-m-g1sRh z_JMt2Kj;nn!vSz0^nrumU^oO0g~Q-*I07P20EJKlQHVht5|D%x90^B3UpN|$fqqa7 z{b2wMgh4PEhQLr52E*Z4I1Wa@NEijjLkXM!C&FkL11G`Ba0-ltQ{gmFzYBK;q@fhX zLpfxi5+*YyGP;B07wCTNBhm;{rd6{f&Ba4t-R^WZOVK1_oP;6k_v zro+W>30w*@;4-)zu7H_vC0qqpLmONJe}!vd7F-9{!woPSZiJiQW|#xFz^!l_w8QOi z2iysB;V!rv?tyu5FWd+B!+iJ~{2d;E4tNm$0T00fco-gmM`0m629LuNun3-nf5KvT z2A+lI;CXlfmcqZ_MR*C8!OQRpyb8;wD4 ze$X5ChXde1=mQ7A!Egv13Wvera0Eo401BZ9q7Z{PBp?YXI1-M6zHl@g1N}h#MqPgx z00UtV42B^v6o$cYI2K00NH`u!;6xY=C&9^Z3XFwQ;WRiM#=#kICZwSh%3wT{Lj`1@ z5+*YyGP;B07wCTNBhm;{rd6{f&Ba4t-R^WZOVK1_oP;6k_vro+W> z30w*@;4-)zu7H_vC0qqpLmONJe}!vd7F-9{!woPSZiJiQW|#xFz^!l_w8QOi2iysB z;V!rv?tyu5FWd+B!+iJ~{2d;E4tNm$0T00fco-gmM`0m629LuNun3-nr(iKW4bQ?7 zcphGWf5D6J5-fw4;T3olmcwiCI=lgI!dvh*yaS!^F1!ct!w2vod;}lE3ivnt2R?z7 z@F{!-pTjEn0=|OP@HKn`-@+RB4!(yUU@iOzKf%wi4t{}O;WtKF2Mh23Cx*aP;2y%XtM*2t^Qu7{nm~Nl3wwa1``~qv06n z2gT4I2EafV1cPA+425AZ9FB$KU<8bWQE)tzzzJ|7jD|6A5}XXDz*smHPJ`279Gn4X zLK;e;48}t_R6qtQVFFY^HJk+#p$2N94(g!+&W1*4f@WxeNiZ2&VG5iB=fYGt5B>t@ z!!)=6E`*Cc1T2Cl;VJkh zEQY7y8F&_!z;p0CyZ}q#U+^Nl1k2!Mcm-aCC_eU{lx(HV5@vT3f)Duod)xtzjG37J9;Vus!SmJHk$|GwcGr zU{}};c85J+PuL6ghJ4ru_J#eRH|!4wz=6;Q4uXT>5I7VLgTvtnh(G}pLJ>qE260G0 z5>jv^90h&hXgCJ?K{51)0Wc5-!C)8yLtz*UhvQ%bjDq9g1UM1Kz)5fljD^$SbT|Xf zgixa4t-Rzrgu$0bB?d!NqV1%z(?_a`?Z0 z|91r35h$6-zNNgruBka)Th?5aPLHo{Zc3-?CuJHdYw9PbGmVY)jbV<8>PgiV8Cl-c z+(=cE(&>uo3DwQ%hO+9$CO6hA8(-Fx(FU(9%wC;tqF)smFTOfGp{OuRibsVMoCbO~ zzOkkHth%B?w~`#i&1K`eba2mY$QXI`$D=tasEvfh)fR-Rp`ENP3iXEer!E=htt*I! z%He}j7e1-Ylk3C%wPj5c!%OO#&q*iKIR>Voz9DyEV`ftB!kSE-EcBMErs}#0HJNln zO-obyoJ?cAJJq(Kwz_Tu4yTIhy2|Rh>gFk3SCi9KQQtDY%ib767rhBqv7vT!H91}7 z>E=vb)|52VH>ESJ4Ox0!W3Z@SEhM_&aCd<6i^sTH#O9-RSTI2 zr?i?4U)K&@$`-3Nyneq1;h9of-_V?{$c%59kT-#?bah?2tZ_nl;Pa%sGB%cFY{Q$U zG-T4%brqS`OcRFsMmEHCWi`$=vY~8(w>4#XNmmE97p=jZDhqBkC=6s(sXqp4nFwZ8 zsXy#aX&_5!i)b~FQ)Pi>)Up=Hs#4i%Fsn)f&B*0cb)u%etRh`mR^III%&N+osu<0t ziSEp3XsjQv2Cv)|>gww<>9m_Gud1%8Xk<|zKc$($b$19fU0v7gWz}$~?C`;A$C)1G zRH5gHCr+xbu4rg(v{W77%sbCHGSk$=TniSN8f%*-q=(lvvzIO_&$zACW}2(&E7Fr2 z%NiOojd{kZ_M#i~>L&h7t=jpgDiz)TGj)rAKh=a8=en}mjNbm_rPGa>hWf_lbYofF zgiLu=rhH;$S#?cIBMU#vK{;zfQ*%XieY&BMIaQfv<*MfRhr;UGhIBezR!(en{rGfc zi&_*MwX%}EN|l?L+*sYLDpURmndb7UGLDd(TtiDR*OX}<-%@Fc(x%n&`r6w1y7Z(< z-F%++DP3cn^pI|vOl4!nZK^h?H)evlvzwS;6On1Hc0W!oZ(@IGbhc#~eK0qvye3mt z*TRP1>GX-sH3Q2Uni-(c&1K~i2f&y{mMT*`G}An~xnfvZT}4em8o}1aSrUw^e?`T~ z8MS(4Dh9WfXPhzBG49w<&%l;OR-opR#`ebo=IQ~gXk+S6 z;V^TcKg4c!OugsvJ35dVSznVmzNMKtF|Z`7V5DblI3#`;>utWj;XbbqGQ4(E8Ix~!)99Cw_t zyS}{sjg4hf*m|n%PBZ&}ro2hc)}H+pi?P@aJ9t8UdORybc0p4^8LL}X7t33k(>1IY;U&%W*}7>V9ag4lO4nt_ zlvOgfvt@ddEoSPPSgkoUXvi*`(8wX1+B{@UhqKM`R1Ote!R>Om$r0Ri9ldm(c8TyMBGB#<*2Cv$O?I8(D5E=!$cS(UeYhQO40r?m&)Zau>2u z2o^T85ZB~t(<-zYwMwm4tx~I54qenKcuQTgHJO0|tGPgl)l{IwYQ{OE6Vs~{t70Wt zH7d!fs;r{Ib}7knHMNYlT}rZCwJkNaOG%cCt01;ZNtUZIQ)|1FWV!0pj?mfqvoz}K zC^b!uskmCM-E2)T%d`cvY?PYxmO;DK|CvU!vCvXkbA2VPdKIdC`s|i!y^(XnoC6f6 zwsea+nDy-D*u^g@^vitF*Mwixq}@WIFV%kNpiDVed(>W+*447l-1quXNl|k>r$o-q zfOAz2?485z9FD9=d|?_}k_um^3!H}qx)2;WhH*n(5Dvdu6Dhl(y=bxvmCmt|8iGK) zr=^?5XUU9-l>M4(>M9Dd{FTnWRL^(z=Hg^UePChq$58|YrZ+68wN=eFU8l1U2Kt{> z7E;0Z`uZAGgF5^4rrZ;Q!x30;ni^PA^-+r+R<$K*s;aJZt|oZZDAm1`ptd4>4m9GG zW*0d@`s`M$CxkRtH*igcwH!~TQGKYaW`+iPAL`Y?3qCT4>!H8DYxT1lL1&VgPs+|K!+-*0s}Czr%( zT321}dn?Pv2kJ5ld1Xzyz9z6i@zyUXXRTwh*hHy5tJ?HIy*^S8d^U?}rm~EAo~Mrc z9ZR~B^Ne)4IkMMM;Gj?o=9nv((c89$=Bhlca=yW?#AF&&09Vj-QAMUE!|8A^!)2Aa zDMrx;`flBv5*wYZdaWDOSl?his+FdtuBoijtq{Q!Rq|zm``J0l)^&0z*{#Ouh&}?> zWlc34XPQ#ybGokDWXo$fA_;!BrpFP}c%X>wFAOE!VEOh^Ve2sk17taU+`` z=lI(6P+h2Swr%Vy*&exFQs?s-uH>k#o?Fu2IRj*Cp>~H(9YUeNKS`|0w3^18!+doD zpd0j#`gOLUo~<)I&U3FxP10AlI2kmboK?U%58`N%39|C(ris-J4XQ`YT+^>?E#yi8qaDdP+NCRt!Qbma{(SSwp%-T_MaPM@)Sqmk63vBbC*yEI;~c;>rD+)Y>~T(_A*Z zu98Vo*OUlwu8pbwPUKo~dAgc!1L{;CD^yN@RG&D{b9$~K^n@r?t*MjC8d=V{nxh1@ z!uW!-Sg9+|lz1xB!>};()O8{%tH?Olq-mICkn>D-k?K^vnYBlK_mZa$-Y1!>N*v{x z%Szq?(o&}vm5Puu71~w#WLj&eb~Y9)0f9wEZCcbaF^Q!}onkmw_xO)bHT4Xw^Rbz6 zRvR8aqc#cEbzF6F0yrM!NL;Tfssf#_ZsO98(^QN1iE&a2hcN0Bt1XuuYijbinyr>K zwHo^$89p_){L@b-hVLXYjSRH%x@)mo1JsJFt}?67st@jGR&B4D>cD5Nwg(D=8IE-V zCG^aTciZy>H4%Xh`4i(g)Mcio@@l@`rC(&!#AjH08d&V~_6*V42vIHs=Nz6wv%9KP zs~OR1+mkt)m92pVgRQZa@&>V+%jkIZZ6J$SJL zQp_`_-(1_wAwTvgmjbl+I=N@#M%8aO2XZ2m4<>r9i zIGwF$TI56~cxm4GY__)|d}6J8rCgV$14E}9a4yTsii20=O_+BzT3LslHww(5Tgjt}D8FlpK z6njU_=ImEZfI4t?cWYMO->tYu*sjsa`$oG4cQ=pJnW=W@qjvnURh|oCD*(GvsNv6DoYZg-&M)r~H zRO%;IXYzWt)N!6$(VJ@m3@L|+y&Kg03gm@>t_g$63j+rk!l3f5!M&k{Gg;RYl#I>2 z>%~~StXGS3-tSeQb8g|}DYY%NUhO6qD6DP`7OI?I*q98IsZ5|K8Z07XiY8BSHf5$W zZq5{X3zoYZcIyZ!Fd-~&Y=*46GED8^Wp?0(?%c2|+n_&J1NwrOy5l2Pl>tZBm8jE( z4b-A78?L75Pt=1aS4Day%{4)$G*_^mUJmPW#ruY?t6-z$+`-ayJ)Wz}%DV1M?vapp z#pLRVWjWHCs(*B%@yq3zLP87H*{46_wsaA zfhx`w9=IJSR~11^u4>GkL%FJOi*tqRL&sdvrZiVDvpDDEJ7u{71K&#JYC34iRgL%k zMy^VHL#`^EBk)||y3h_)_ej|hj%FLf?vTog3^)Cms)9FL+5HKtRru`&vTo9{Ys@y- zRhUD5JJ6NG?YXukI?5}xgM%lCTszUXgxM{Jn>Jik=w2+lvhY1ww$I%V>ccUe)d z(e9zXqT-%f+f!+kn&99qW#VfDZtpTRbZOaOHQckc!FrTugB5XvzQKx=XM+{-rT+#i zQl5~Ctb5}^hbY^#;flfs$*L*GC|R!XVG1#AxL4r=WmT19qyo40g^rRe59v$55I#DV zq3bHbM(%%{2NX~;sS*xl-(33yFA^i?@Bc>wwi5L_pD}{9o06o ze1w>dYMY(!M}kM2x_7Q@+f}K)9oFtlpu`R`H_X}*t{i4J_tS=jxJ7mtmzLEtL4hxP z?C2231}pJ)qTVdZs>R=jdY&#i5iIJmb#|QuPCi$tQ-|i8d*RHHGd(uQjAp@$*ol)}+()ISmzwfxK zuRbmHa-DR5<9OAGmaqoH0YS-KgpVg{+Pkd-V;6T)0ZuMk` zZ3WHJ5xVU(WzNk4S#9Ymby?OFdEd487w-Meh{CQy^|wvx{`{=g19b#kS(OErl6(BmtFo+z0J3`%V%cytfi~@)Wz`q(+7$=3w(e5}_K1gB>}u3OtM>qc zU4bkN3w7?%=XC|%qX=PDWSeqUwc&bvhh0hVc>({h-dl$4Vmq9P&Hao-$Ygb4{!>+( z2P^(m&92w3*nXnIt}LtEuE3weA-il@Xom*JGbGq9w!?D|cSvPjoBveR=Fty(ghFd} zy>`Xkqak)JenEDK`|L<|j8~E~h@%7bbV<%ox7@D4>;=qoCw911nj@HJKGkC;IfC6% zJ2-3K8CppWmtC3Zs5@uat5rjqGBPA*_ zlCY^S*JM>%5hnHMfT+n4ghh{%zF$jNMS%#>Pdf>-k+N;-L8xq}qYAUWuU9yYlx@qg z)H(h@nFv%5jhN@XL?c1n4zN0|W}UD&k7tS6w31~CS=^K}d||Vm>k{>6J@q9!(>1~s_C(#;_>|!zLVb7L{u7w&*75%dwLNlQu1z{n9b6XMN z=puldw$#m&qIy>|#`5|GZ*!qPn*u#f-lK0~>U=fZ%$0Dr!9W#`D$L$vbE0NnHD>qm z7;`hBG25y!Gi}lr5RAoo_Rj5UmK<&meN@l%$*LmU`sb_FPxt-#x{cp7(B)Hs?jUyc zZHD(t0 z;2zM+nqvJ_tUJhVP851I>O*Du9Id->8`T;c5n+{?Hh7pd@XW257E3f%`3SB%+2Xle zw>zQF=bDJ{GSdc|5&0yo3Ch+@05{2VyRm-K)_8?vY~mqYLZpdXS z>*{e`Q&X3gK%ctwnUkmuJRt1OoR9~FO=rSNOds@yRUP>UwriGXtm=V*z+s1%mBspb z4AZdj7|k`ZP?!6MLzCQWpjf@i#a($+xy}a+H*K-K;G3<8`@= zS8x9?-Be%2IaxQJ?gfk8tSNS%%62D`ui}D-!u})U?x1;3j=TN$pCvbzfM6O?kB9`P z(a#$L-zlha|0{ri;98tVwcV-Y!Ew<|o^%Y1A+L)S#p==WK(Uu~t9FN6ubI3~Rz$15 zc#n^}!yq)b9z7LaAKk25EEg1BQ!AQLPr?K{>1Iu|^NycDxt})%|2ciP13@Lrq@HFG zcj0A6g;?Bb#JQ1mR-_;5cdK)AZX~lJa9U*^`uA1_HRl4wUe=9f)&z>pivj#-Jy*P@ z-K>c=Gm@JQ%#7CMsHh%=(p?|#ioo|;>Lev!d@Ae1`LqH5z^#xC6GPlII8zEJN)B^$Plt(RtmS4!m zu7-oU+-kjSptj&qo@!Pcra&jm*9KXgGkTy_;Z$AAwgfK{D2L9QI)X2vFN16C|kDz%-80uer~tikYGu8 zkpD6wt2GlEDDR>I@1;duRN{NAikuf5S%F%!j9D)~vVyY9yQsiw zQ)pyk*GDeq{ZMA?q-KmE?~XF|uo4sGzg^0B1A=dHR}2chvq?UCr<(e+?=K1j@Yyej z1`7D>7sLVud^QCfbGvW+Fx?9(Sth*|3|#K>-GL$#=3J$*YL{AwF;I=3Yr%*>VRqNt z_laaphkH^TGSO~Ppkm!>V7lCMZ||jD?%0W*S*?ecg-vgE^&!)pZ8BAv<&-(1-v(wT zK1-H%afD*L@*u@s{(~G8F`L*?eQ5M2tbOK!!LGR%eVRjk*fU>59^-d*QsyO%6t| zK!%tOhQx>x8KkRIZ+{DG#?fVfsVh4oSRg}m8(dFxUnm#WRIu0z*YBOPf{YkuweC@J z=eT%boxPao!oZ8`!kW_?PUodP-sV--?%$}Dt;?>O7vRZeTrtFI%^!0;AjBx{LNmS4 z^@@AjOo`Iu#f6Z9uvXN&_rf~w=wSib>!9wHqlX1JT?=i)l!OI^ybeQ8o_WWbHQ#j? z>=(tD2qnuloZnZmx@0ul=)XEpjuMY0c`p^rs@=R?Fgzl=Gp45Ok@Xr08CbzzR~sdpW^uQ1FJ9(2fo3A|9y8b?tggZ$Sa%Ju@f3{YDd=XHtF@5|E8x9VYb zUzT>N(Jx!fs@=%aPBme6UzYa3YZ+zz!2%h=?GOID9A%I!l40~9^qmyyjfY-=4AC!n zluZ~-8mS`8>&wy}e3yo`T*x9B##LDF6=P<*rKN0}UZ=%VXzC$IW%r9h!kpJkS`+NO zsM1R5SGz8OPZ6mqH)EHKliuOga2=cT8nsgMFW9M*l_rV3A$X8q1oITc2e#^6f`O_f@b zHgVa~_~eC4uRqQ&?8%m`3!%np-q9+pt|*&V5%vpQWn8F3R^n|sv(`sZB7@Wc7henO zm%+*=Wsw!;zAx4a@nmTayiQgI1Pf${^}bmdW*5p(>!q|Z)GjokYGymHsufFut=eWi zr`@fe=XT|Ad)DP1D=tuODp0Fl@IAU_in8Qzd!Ro5;!dEtKzWW1TbGyY{(8k-hX>lx z{m4;Iz?Wl!yavOk$1CnSJkU;;^#pvT!qL_{fzABLl8s&cyp{iKt(yxJ`VViaLX|Ux zCa1e6i}9GB;P}9`jWHQ)GW)nZ$&>g=q}1Ri%qzh)Gpp?EXSlPqp8xJ7`F?4 z-ZH3j9owWe-{>4lns+Fho=~4qrP+VOva|>E90A@{a?^kpL4gTzUZ1SiR_7JXrU6Uz zt;`J0XsFGdNawA~o)%(Mx4M~kJNuP;)dWjLFwcO>H$aQv>{1hKrc?LIc~7()vS5J; z(K~+*`kaYY=WEW3q)l9|Qopm#O-Az4SZ!(zD#GNv%UYPU5^Pqy=&4J=K?#i`;{9-e{4=}2VYsFG0w`VSjeT+lHz`;NWW;rD<~Q{sQ-}RLxzkf7IMMR0Ym$b8c{N+*tZTCQas|g;e(GKdHk`| zk}51LDoPYaisH#wG?9oUBgtZZ4sUoZ-5pTI&!(lhH?gdyIAZ?ne70WTN>1wfX(Le{ zD=YW%$%=yUiGqZe&t#&N$?>sdGDBA?3p~BDpsXmKDa?#7D32Bus-Mwx`cqVyl=WAR zPX+$Ud|zc~f1*ZpebGpvD~Woe1%;VpG?8&D@%)ai`=H7^y|CO7y?jxT8|tK2i}MzcTfFt<%UiCeEaJ z-;u+WkA7Z!l@6NsGVN`aF~N{6Xgz|E$wK>vY;?(sd>+{YC3bO&a-C z=VzNV?>C*VGU;-YCf94d-K5?BtMd&e?KEle?^>T{(w=|le5*-Um~>d)U}yexnA9HU zUK{E1X(nA|(vpp}zR;xew$k~YJ#^Y?(iJ8hwzbwfOxkN3ou6jXRVFRjR_hB*n%`6B zXP9)2Nyl!d^~EObv%Su@nRJ~=OLx%vQj6YSI-Z9k!d+J51VZcb%VR(p4rc z*+c6KO`5-_&d)IE8k3IQOY4hG+GlT_Z!_sSla}UdeW^(!`{?{^ljiNK^9@Bh?KEj| zROjcJv}a7`TTQycq{HG`?=Wevgw9Vh=_-?!B(=WKr1>eGpJCE9CLMdE*8krwC5ufx zeU8%gwV8CCNlW``eW^(!N9+7-lja?x^HnBYZqj5wt+$)Bd$G4JPe0Y4Pb=pJ&pZ<8;2&q$^B1 z>CY;YmZZb`w=jpEUmEVWr)!4st-DbBOE1#tQj-=n! z=3T7wRVH0-(&Qytx9e{=diP6pd4owiO=|m#XK3F%liKBOzUO7y*J{!gCLMOU);mnv z>k6HpX3|wAEt#qHg(l6vQs-xwbd5>JUZwTLChc>z&bOJ=?T?+VGv%di+P~DKk!y5* zwn_8;s`FJQU2f9kwOVgCY4=$=-(b>ClNMj6b-Vp}M(=sOEN?aW6(${agD&qdX|LHj zKh318Oj>fI))$&I|0bQEVN$pKH6}myW?jD6qZ8~3N(&Z*iwrjoJq}^}VdAGd=lkYTX@g2H+o=JP&sq?KSU18E;bG6=K(q4DT zdZ(HEDwCGnt;-jh)NMci9<9$X=^B%cou~E1Chc>t&bOI#ok>gY)4E%qn=UnaNheskGcBeG(4NRsuR?o!Cc`a^(Qgc z%3Sp+8g62)Z#MNCn47~~&1o8*$y~gD#g8;RmAN+N;`yjE^gQ~}HM8)*v-G^k++5~r zf1=@8%vGMF{&eQrnX5Zb!!67Wu~NU0xyZ|7e*Fb{KAX9CUUiX%qdx=vKhy9e=31Gn zzC^=K%=NuY{RZadFjsShhG#NYah3X0nQLQiR1OU{GdJ)W^^45SWv=!*4bNh(@&@&% zGuO^s-Ax*9VQ$DR>Nhf1sM7w!xKk2yt;|(drQs&#`c|WU19NkjtEo=IGnuOhrv6ms z+L#+vgNB=#8yG_UB6D+@tF1}HvzV)_Mg8f_wKG>&n}%DM8&Ze*jm*tsuD&h}&t|Tw z9`$E1R|uv4B<5O~t5(r)6LWp*Q$Lmq-ZilEIb1wV1A1L1a}^D#Kb5&Q=0-K5;b!Ir zHl}`&xw*{MHlg8J%vCm}{&eQrnX6ONaQ;4}{1z5Jq#3==$Xu!T`QiBz$d^FA1o9=2 zFM)gsC6F(Hd_O1by>=wk|^IKJvr!C6F(Hd;L~E=lp!;OCVnY z`4aeFC6FXhuUaL-)h(UZ!zPJv-&W4!8zjPWB*HbVou`v25w6fUkDn?LZj%U)YU4Z| zvqX4cxbyg;M0l=5xVEkHbh0GEl@T<4I&=AQVV4NkwWHTrn9E;hd%V8Ot7$ZJL195i zD%bXd9e_gcyDuKJmOj{7{f92 zz)^?kJeRL5KU5S70#ypLRVpPN%u_YX$~FETNEtC&8zc%IyM7ZynFTX1sUX1H&( z-^!wX;_&y45mu~N623TK)*pm3k_8fusr#qT%>*2@4~y6HF3*V`-}_e{)B0HbB! z-x??RHbTD99xk6>^z-?~aJ+BA*~9_~#}@Ocd_~}(yi$b_SG!qEcTx} zd=Cg`DR9&-IJv+N)EO%TQ5Nj0NOwbhAJ8@%Vw$6UFS+M~PjqLJDC{$JmJEPwcZ^Y1_AKZMyS zUsg3JD!@B>qLSGsFI%nan$=gndy&WP2cHYpPycIu5YWyXbtL%(-^4r-vLkrxl zoXzZ;mmS@rz@_1R{?If3$O8BJu6T7l(!%Vd|5wlwKkz-r`p*(wb?$;DKhDyz>-)7F zW#5#Qa4Lh@Pv`5u`a#Q&D{fT3l*R0~7do1Bd)G#Dt8{k1d(YIhM;-iqo{C-1-v+jG zupLy=ci!OAw+UxfclT+ z-(9-=d6XC7ya7%%7o1CwAGD9pr{m6#<%n(?k-gy%gS z)H<8(pMlREzk~dDod0f{AMbe=KdEx5jCZs@d1A?`{?^z4ot5pgVPAK!Ten8vyj2U- z4&onoRsXr0YM7D4&TptDrnP9FxxvKF$LD@^MOV%~H^+m<=fC?Cf4JGg=jVbCa@l?& z=NEi`qfqV9H?v+-KFVKU`;i3CeUez}l_fTi#ScHV*<ijVMs~gJ%Aie!7tbkfVEN&{`+UBzKE!q&fBt`M_u=;)+i`rmFK11am7CL= zUN^ISVm3`Je{JxBwkMS=f8i7NKC$2TS+4P<&;S3roi`-);M(`4pS{wu^3r;}U(!KE z$#oX?e6W6%YWH<&bal*w&`;4}gb?jz(bUH&}2e}r=!IO#4pYT)2LMSME${8$eW&I8~W zU2rtO!F`b2rOThk@=7?xp;?#Vf)fQC+-HeT$DJSRQNmFJ#{{laInV+J_i=KUE`J{1 zcfuI}oJ5yII895c95&qoh(!+o^)`*r8X`jBv}kc=u&IzOr;X#cZ%(_Om!dHfC% z&I{mVfh(1tB*+i$1IDN0&X3ISh z_;lR)@%uwKz2Tn)Tq(I3AV0WIn!9xQ^VlvVobmAQxC_o$;NU)Nd^+y@`28ZBrQ}~( z>GCEFh4w%D?z&5tKacHHg4hB7OfEPk;NU)Td^+y@*d8F9pW&aXoOFIv!=U~Dj<#Ff zrOThkb~NFu(TFB5<<7m3n_tp(?0pdec?3WSFYVv$saO}XreG~sF2iyN-9&D?F+$`Nb zo!8UAJQ(iFD8=FD!7$$Yh^+GSJ)-I!+3Pw$f0tkxh=6p~_;Lpluh2#9GA zRC%<&Uvl*-F%`$Bl!1PJfY<1@3YB(by|hvu%|{Pu7v?jlf?B8dD;Qf6lJ;*z`uX9J z!)yBWiEdkanzG@0jxUV(yJzd*9Z%Z|ezadDK590w<%fqdkO1m`>Q~d}-OWSIQ44`Dc>q^YqHp z&&$tUKY!Tovnm~$JS8JbNv}Wh^P*pOm%B7MiShXK{;7Y?;Ehj~`A+=8%<|{%`iABE zu9|+SNo;0udOz4c!+w6)fa9f>>U)h>7p3R8VR=bLRtEa4e3jgu9O_xgI{ z7M2|evjR&}{&$;?oG;X1*u-4suTg1B*wkj#;#7h3eCijeyT@r-Obra8ejI1OaX#$N z;J6<4JEX?x+>P_qsQy;(SO3B_U-rIUei2$f^x?&;HdcO2Cp5{P&0lY~vHTn_+;T-w z$h-sGmUqs{Ve(t?BA`Q$!GCVaVDcC= z1o0tAii7nRL3DE9n6#g^<3oUh`=kF;4!$P@ z(a(XSal%mo2lrq9ryOiQk#dj%oEqRtmA9) z(vu3u_AB8m2aeSRM+6S;PcN08R5-Sq24LKWIO+eAgZ(YSxeFYd3yu*u_J7I2eh=Zi08Xw8P6lvv zGW$o6%tr^dw+P1<1}W^|O1(cO;8^}82ip~dQx!OQE;yOM3Hg`p4{R?Ijv6>`TyVYx zj`3e|uwMX=M(7M2a**$Wt?Q@tr~vg_o*Rx-eU0sRlAnHr19~M=&&Le;(X)0w#QaAG z_G3tXCOYItbdsM(hhhH54M!?J*q0fei{D^QK0!QJ3V*!r! zUvjYBPB?`Mfxcl|`u;f6x7IF!`5)H4mXeQDIJVDAD+M74IOKpV33-{3oc_3nhi#vi zpvvOIKV0(Pe@O@F`L580c06!gfN)wlaC{%}dg`7Y#;?2tlbif#f9>$${@OS~;5YUs z2&W(85E&-@+L6zXkntSKo0}u)A%7jc0Q=d5Gtq&Q`kasNAsA(F@?P`TQ4aQB31_|o zN97&;Nq#bAaLk4H>nI1u^$2IR1IOae$M+D-GB}#D{B@LrKc$q47;dkEPwIGQN_I?BOurPAPi z$~fdb&35wssMdQ428sSOO%3W|ww~?>@=d2OAMcXpg(p0o|<(0brgo=)AFSn$*{B@Lrh>!0fWD-RPH-~uze;vI5$5RQXzXM0No{#S#L_KrQ$@!YUj&g9^k#G!*L&|kX z9{)Y_@Q64D<+@}PSHIG9@PB$RJ#XONADllToHPecZg0MR_wZ0&@)DBz^5ICJZf3mm z^EfX+ICC60d5L^{507Brq>kXjKjx$+J3o)($Aq)Ufs;LfkMH482RKoa`S6c9$|=sz z<2W$keCfb3%;n>Icr*Zx{WCuNV~);`whulI6$BjrC7evgA@z=a2VZWWyvZonQCa+T zl!)^*gtOO?bCi$oA=qV4zl@F)s;D1Gq^Yb__ zM`U#sI2Ld}ygv{5?}FeVRuzOmHvW$3O1TF}XU*Zj`BuWY3mgT!@=_ct4AQD3=4Bm{ z{P43e_x;(?zuoV%eJA!Ha^jbPHkDgdy!sN~)OGE~x3{I*fiXI+8f~tYO^60)5ldDvWQFZz6 zJbKS|+IkJr5CiD2o zeFI|pjIZPGH)Kfl@&3V;x)m9jqU|q=3Q-(6L=;OkPxKY*iew%?wm{vwbxMYd?L~1~ z>$EoUQ<~QFY%4YtMWy(j%Rm1(KJovr^Y}w&zgxF+=l&YjzI5JWzQ%f`ed*An`aaZu zpzet8ehR5}UEP-Y`5X9udmcX`A+ye)Vm${6U7hp!`*}9cd--1x3sSRs(fH}lu1=a4 zQZ6FBH}&Hd22S`2u;su zME%7|EIm7-eOet&Kk6?xXyqRf4F)Z==%_zwLQs(#3u9`kwbak&2gjjt9{-=t(;r>< zb9Tgb{Zd6Un*OrXen0$Pti!0NNb3Jz=kfV@cw8Th>$D5M{_KpRXRFjy#_zcHbhdCI zc&xG|<$pipmsz#e_kL?)6voqUY0Y_|=~|y;gL#hWc~Uex31s?gD*Y zC+eTSbjIZt??>ec;ne@LF!+~Gcs#S%3uf1$$e2{U~T#Q7%B^!a&w9QVU{d+dkdJUu^; zkL?(o2QNCNSAScnuL_%*(DeVmHjn@I>F}?1beeram8gof+t-@vU`7Zoq`=)%3H z{dJ@Ez{St!CCtieO|PH2@I{rjsSOKdccy-vUzgJ3yHx7$aslgZ9na`OR^leJd^Uv?V!zSZTX4l)4+MS*s zK00umu8+b$iOKig%5~Nw1#iVhvGRI$UbCysy3HSMW#@-%wCDIdUZJqE`mp}4fxE9Z zFP|o|`$<;(VjZ(lFHGd3^Yf4Mo=*;B<&D1|oX?WdjX6;+hvhf7miF z_6je5UXKs$cA#Ar)Q`vYa=acN_Qz3AuiT|~{Z3S_zb}xze}Bft#`Rdau8gJ~Ee~62 zwCMdP+~BKdPyMEzXZ$BWnlZ}8%Hs)-i>j&Rrf=4>_5#jFqaI%iP0M0^rq*m2!rnL3 zEBUv2e1#jo8FXfC<2t%l^nPxX`*Kadsn3gNvirsPFDX5~b#vow?LT{CHL&uxD((A5 zQ-8|})pnriRa}rgJ!5*vA`@#Ly3^b9X;${iq6W`COD+UuiJikt!C{-{ygu;c{S8~Yq7h;gEiUDx2Ll5!LQd3f2&wXHTTg!yrt1ohH+J-&>t<+i>4spBFes~>nhJ^p@i z-b_jlkB`sm@$u(*KgyqsxA+&KXUP~(>a35)O~`1EuZ;1Qym|a}G)?U15>71#j$$bv zAI9NjaEvSY>nI1yBjL1h;D{Ue_%N>^gA@1-e;wsuKb&w99XP%_`S>1!QU=GE#a~A` z*uEs3nGT%HqkMc1Aw&izB%8mEaY9M>*JEC7c%yoJ`@9`3oUR1}DUa zzm9US-Ap*e$l@Y6$a@;7;NyD;S{a;-()@KFk`%DLKsYrVIO#!rd=Eh(G8D_SXp~-hm@N`8YnQ-?TEu`-NBhbu>Ttoh6)+ z4jfe*KL1efyp&O{Bl+tn2gln8XO06$=*Gu~dQ=7{wHJRK<>0s);jDJxr0e zQ4Ha)qa5rH5zambPTnX!KGdT!IH}|K>nI2Njf8X2fuobQ{bhQW(*Kuo92~DAoO-|! zppKKuj|Dg(tY0Nfpl9ZC5pZ0Da5@7=4}oC=`xjCi6RhdZ zkjd%5m22!*6HWnO5Tybsj->&dXZ;!Y@{{BwKeioSf|~Vn{+j^z z1M^dp=}zHk9JeI-nE@QDi~JZNKPEREOt&>R-;Coqgku7ZzJzo+P&NWRSvKy2=}Ec8 zxaWiOOoVfQ$gQL_#{wLKOwMndJ|~Xn5zbBEs9bRDz{!!x8N+21$E67;k31h29Ajgs z&)N7Qm&_;LqTKVr`8UGxFAj3?mzJBV3FwZ<GC4MmgY&I~^D}T%VAn-TZg$`V zvT=3({(1jf{qXCXlCTAbV!TBG;i3X0v1xEx< zo=na=_MYNA6V3|}PBL(mwOu?P;ON=>5icj+{}q=Xoc|`AFNoY+a5P<@-7S-|oFoVb z+7m&&8WQ|HaBMC(Cg7;p{OyNCT>Pubox}NG!Z}CeR>y_hfRiDU)0->TIFCd)kAP!z z!GWdEP*~`EA9uT-cz@;EZ>Wz#IEA5&sIM!XAEg%7Gsxr!BteG*^&UuY2yhJbq&cc? z&|a0vnZtd5a6XH0S^>xGf@1)Vn$3GT+^W-`L%8RIdT4~x6FACH>HOG$W0J|~z&#(- zCm@^=BtI@Vh8XDoFuen(nQ#b<u&lXH_K=y0IkD+w+N zeMYg7G)L1L>T{W#ncVjW^(P3Y8gTTDr8!C+^nWDua2;;_!_U#&dy0A&gwp~zie}Or zYaG1CGC5;7xuJdr3624d#s!CL8WAW{k75ZcZ>Xn$dKiQ=6gXBF93yZ^iZCY%+(F+rO~>iy9hpdHEdDV z(j3b;=>N#%RO9Mv)Waj3bHK5I;Sj0(n5Mw@iRtffxBH3L$iAnj4}o5IO)*7WO_~z-Q`h_ zD{rW0NjNQlqZlI1u>!{;lVjoJhWe9)(-}DW5z-vx7tr=%dVnr711G=Zz6+>FNH`;b zW0)w-QLTY;B9qgQE7z!xN;q?XV@i|e=+{F3M8gm@fJ0+Y#rQv=vq&ar7QKN)@DxCS~P%#ebm*RRH!l?!v z+iGc!=@9gPWOBaX@`HM4gwuv_HoD-Pf^s60Q;`%}hXeKh2}eidwpE&A{|Wj(OfSwM z38z0Jx%UV4>x=Lhh;<9L=uDp z?Gd70Hwm@^#|-bHRQ+bS3H4u`Yq@<$9R9W9zNe`FOE?dJV?Q9xG5-ScmdSa=IA~81 z_4oUd6G`wu;Fw)-40oab6ECkE^mAa4pSbRfaApF>cv3n)+6QnS zGC74g4(gK=&bPo3p>C0SKAKn1|4ERSpWjF#4hOE=Ae`fbbHxScHJq2pImK~seJJ5v z2aW&(=~DTz04G-_XS+jQ$WPR}C!8n1vA>Y!m;*uAj_K!f$$a9C=la38eur@U%0Rg- z;31hGQwZ3qk;!Swk#7#4c;ecsa6iHc0ged_N=eC0-w<@u^zzC<1j|n&v8Fe%;_lla zrd74r>Tw#j4!vN>-qoY0RuRQfx{+{NHzsjHfzZkol_d%XwH*ur2EB(6FE%Jtd9)}d zi(*W2-IRc$VO~8WI#n6ecaTSg-dc~5BfE=YT3xtUU$DG5K@1P|@9G`iP#80Dc%P{2UPY@IS*T{%*jEG8H2<3FTsxqg0?npKZ)+N+sZL@cI-Xt9P)5s8o?5&qQ`3smTp z65A_AHMwMXq4onJrnPQK)}aSZYCFEGcRgiURoAA2VHti}iOzKkMi$hm1E!6OE3O;d zY*4)xK4ZiIVhLD>-?&yvg`j4g6DLQ8MtB8>6>C!|30AawsDdi0`qi)8w^+N1RoW-2 zx|FF97tvtU(9vys!#e!dX{ss{Mn`lGO9~dn1krC~Y+OjY>W$KRL?(8xlv=~jKf05y zcAYWh+ec0sGA>Bnd{EOk-$}(=)l6w#qHrBCp-G6CM(pV)w5-}OX~g)%aCMEyj->|F zZ5%UpWY-j-Z_L0U9R`jJh)Jvy?H@dGNVoAJqq@cUiDG|IQ%n)tdE}7pLrOLGsWL#T z@EN48Tes-MR&^>@tzTe3<6))KK-x7uOBy;iOqwc+@A>C{Kp6STmqR#*6c>uA8X6K>hAA zfc>lgt9AJJ9m93@{5pKBM{%7!>i^?9`~q7ylu7zx-c6C^Z%M7_(f*dHZEUM(esDZe zY8^hGU$hg9_V9837T49|ydNc{z0^{V?|_xDePtJIJBQMe92 zLBDcI$FXJlXD*=UQ4a{$;TKTqYScSCtiL*kp6A!$yURa+ez|$h^IpSNyb3YV^sv2- z>*P@{1lQrCz7Vdv|NYO{l8IY87cpee>-qHgb@-Q?*Uz)`w%F~9Xnc3;@cHz3Kfey2 zKhOL5b@gu9VFGt%?P=CNI|5;fTRI$EiseiTenLX7)D|`Y#ulJbC%^e$*Ssb@=ZS zN<>@QtzWFXNYmrv^L}^h@X@X)+RyiUxbf8~#q)|9_I~o|m3lbKUS{a_aUzosfBx?x z)vkAWlkzBs$@9j{8pm%PittjLqxZ|N!{_bi#+ z2kSh_^9r`N-~LmFR!UYL_;vU=|A_0}L;9Ty9J;7m6&w4$ZQ$17qkbcM;d+g5YN>(4?_`lqB_^8*2>+aLL*S@%`<+5+J zGwJ;;N-5L4cj4@omf6&g?Rcqm_#tI#&z`kI{Xn=9;^>*ZHUpa`>ixKC-8Qo+O<{N zDKFvJFH3Lvw29a6r+#hwy%qml*TXl{Lj9<(i0ke(XKrs(uWNWAJDZ*_SFcy?b9FKX zW}K$}@RXPLd<(trZaz=_{5pJH;c*MURo0x4%i0&~@2x6V>#MP)1An0LTc7S%-Rp-U zr__h2pI?W6{auS9(QU>Tw6peG^EjcUNBcb@=?cd;WTN>+qAC3_RLt z?2^pPpPch?UI^FSWB(G@b)y~=u4702cU*V>o1geuxpGy%%Q;NbA2rD9J(_62@J z{rrA9C!=c4e=>RM*Y+&u_k-&Na2@_%qu!=?#ojk$v+oP8n?wC4oJYlV?l^yo>*kXu z&D3NTc&SKd_0^w#bIU15Tsfb`+P~d)e*LiJk!M4FS$%dM{@Uct zs9s9;eED_wzh3&j-mU$=-B10R=CAYm-SgfR37BKrNc|ZU;iR(sn_dzh4S{%>!WAQ znpLdPUp|?v{>#Y=|Lw;X4LT{=^I9WZ>v6UF(*4@wH2&`Lar@^yeV>!Llll+$n;Ttt z_|D-`3#p&y@qW}(!1?M=&U5SV`SZLV*9YQwFn=D`iQu|oo44aDCLutMe{@)kys5$oM??Qdq z`_ZxQ`Tip<k>J>CTu0Q&>>+m0izw@q<8LIPT`TNX2z|->Eqn75~ zG<|*@e$g%Qg;R^P?)H?HS&Fr&piixZ|$0twjQfuY>CJH9crZYDN2PY3$rQJi* z?&l!2e;$rAqusq}KVIxwrpS_kS?qg^^B!o2uh!lA4?3z+B1Bd{Hci!rRl8Nu zl4Pd$p(cM%SvPLNge;c-8%JZJy2pOTi-^h#~1xV&R$ z>md#MUZS28+TrWG@WSOgeUe4hdK&+i(=}InU3gSH>L~SRjSG#PxoG8Y##7YqwQ}Nb zzdSGUSi`<2c~wu>pZ8w~pQ)t_wyxe5j9tcItRLeA>s8x?cUM=bSuN-^X+N=i#~z zw42A<;lp)@XlD=g713^9m8Cyuep{Iwn8Dg_Lnn??d;K}e$I8mn;$3&AsqfBgnabXu z)jivWEjaNeB!t!XOAY%{cg{W2H;}z=wP!!*v?A=~E<5WFjh$bxUAyz`!%YP?Ud2BT-p||NL;YX0tH;~n!}$rci}&T(rmrR$Y}P#1pPc3w zaIe{g_EARW4=CudwD#D@m04Tp{U>ic#pg7esUPQW(C%LMj9brDWq+8S#QKw= zGeW=KYFYnIIg7^U?dZN%laSg z?C{~dIoi$R?eGa-Z&54MiOJ^Glvkzli)#^Qibv~CQa@ildH-kkj79D=xl+-@+W-7{ zem_0bvp~CgxK9-Br-$ni&<K6UP)#v#)uzg4pKoA>cKhYNl-MVZ0+muT-F_tQ=IY}1sl z_CJa7W#cXG?C_=EOx=;Rd{EKs{q%l&W$bF4Hu}2Fz}kCgPXz7o6@4@O)^8mf_qDR` zA?kgh-MroZIk#@T@k|Nz8Jb?`mg_@vUx_=@S$&LlUC<8S2%mljJ3Kn}PWLm7fA7wl z`(ZUIe4}FD-}@Kh!ruOTCO(RdmmRHE|JC)+JC4m{^#`bFdm*y-k1y}M9X?!Ffp+z9{uS-!@z8f+H5)9SG|$SJ9*g6BH}Yo8B@T)sWjV^4)t zHa~Q7TcNP|kK(JRvhg-tw=HFd57#52ojl$S-^tx2+n=bHdr|#8%|GtO#eEH}7sP8Rhckl0SE|uR@ zzs~3Sxs+el`}^X7Z@qNcYOCs$`P-oD>XU8)|iVyuCUx45&z7csr^L;qZl1A5k9yS1j!s};?v-L@(F`CL64|9f9HdVl+_`#Kw0d)J*EKHM(__s_+3NK$t7W*k2n zsK}l&T44Q)dv)J5y?HBjosNCK4223+Y|!&cH!~X#K|640hp+eb@qMpX*|A8+`lsQY zzklE5;+&9lHr~>``mQRw$~UZS%AxXCAKCvyqq6bYCe~kiyZzRcZQosu_06E?cNOiD zv!md!5(?H|n!0a?efYE5cGYQmzTu!#g|8Z0t}(Fja^4OfU!L6g-Pzr%x++)E*YDa! z1*>1eJ2$@Fc#*DJ)^U12?+fnPpL=#w|0p&d%iH1Ws#_RW{6z9~E9(yy{zF|Y&FAcs zJodcZ-5-A*-#?;n(hT%X6eXnfO{}1AlFr(td^)@zRBb*SXrCU(XFPBWE;uUSWXt4q z%?=9(?i60AHq2Z97QGR{8)jLB$G3Ndpst<96unO{{YA6f}@S_5KJ;T zmpKl8cM0b&lAkIr@&g=S_PzY*=AC%FIl1BYmT-K*c8Apk$Jow8Fv#TCIX2E45>6%H zC~LdOPiGGyM7fcH=Bjvz9OiP zML0Wwqj$kk#=>5ZGC5DV`Wojc2Y3bbhSBQL=F|ha{Z-OyxpR4~KBV zfTMT8QTBs&uT0Jx?mfl%U&84M98F8<{0Ms3`%NZC&6R8HR}szt@_bxyjKI;c{ud{f zPrTbnf({4j(~@8VaFng2^J4>!MJDGpS6`!EE8)x{a&y5E`h)FMrk~<)t4@DraU9fd zA)If4BSKv%^_|nC!QQNOHh7I4fiI0oS4$>hA|zNa`IPB_PbV~09fDnI7Q z(EnlM=1zs>5Lk~ZZ>YCLIJbZ!#7T23Q=tDNljFy|KRBOHI4^;tfVxsDKh~+x|6%j~ z4!7>~XLauTgL<)q<5dpYA@R~2lL-AEnVeNzIl%D{!YKzF6Vzc+`O%Zc5*s&hnhA%% zA)MTB-hgoG14jdOm=s5t0sSADoIwsu@)Pw#2&Wa1n+uK!I98dQ62WPnd9q1IOxuV+4-x zQhEL016(@<^~DHh8gNKmDJ3@xa11gz-MIPy$EgWt9&l7HICkLV$mHDR$^q*86V5W= z=m$#YM+wFpHEi4*qPskM~BBa;)yy+62)gK+%H z!*|;S#|)f6HoomN6Apo$I1cJF6HXv-6b9-1Sb-zT=dSjvhD`nVg>7jiBBq;T!^v z*#*Y{oDin3#wGKK_bB&#P+yvGegclg1xEyqQ6|Ti`_7@B72(_jj@1Rn2%J2boa@|s ziu%5U^8`3H7aS9C^i1#T6G3qS-*Ft&dnX*93edhzl`hx9YUuyS` zlT6MIPHwo)jNqpb4vcw7_DjBm{twe9a=2BeKO1uOHR>Y~&H~^lTyU(wG05bsqrUb7;ua(I9lLj z%H+)FNZ@f=wnTgKNLxIx50>A~$i9mk`DD^BhF- z(NB~cbf-T$aQzD56sky1ktpd-@}q+Mm}PRZI1cLJk;hgVI7%3sBvC>h@^TYAY*5|; znZ6#qBkBLqTsgq?MkKg0a6}gz%{u7+$mA^L$~EfM6HX{_EG{@AaB^jGN^|`=)L$i> zmgMHf!ez1N66_1Y&)E6e4^$whLC;OO*u#cHhCg&)}LA`t;w{5@?UC2$d5&A!F zIGBlGuHM1*J%qELaAr$CA5A9of3~=m8*<{f@`mdO2k|p59B>Ttq~)gi)dL_c?0~{^PiAa@e#Wv{wY?mju@f-)&DG<&u;0Oz(ITqk#%H$++?+>nb zCY(tmKQ1_m?J)nt)=fZkm&YTn9>sOAgfpK!9~T@wa8hM*wvYrJ4qV?tf>#5_?t)_m zj!h+0mtToV**a#4teGJ7p}aa{UpM<2OJg5!Aa%E4jfS?N5^r{4g}%60gmW` zqxl~CKQcLK90%=f5Khq`7*}?|F#<=sQ=Z()a2&L|KsbTGQGOvUHyd!WWOABu-vwNs zPB=AzV{yR|cR>GVm%RM^!j)^Z%Rx9{z)>xg&X4^E=>N#%EadWo_9O_W8*qeW(j3bk z=>N#%jN|G9w5vfliRAgfoRw6$w!z?oZnr$S)#l`e_Kyf>9CB4bv z-8bRPAkPQ-x>EVE11IDMdHLDTJs({EM>s~{XrOH?#SzZJ{EtkI5BL2+J0*l;0*)5G znNl3Z1?d0CpXgmAV4M}#^|ilg}%`agT*$xXrK2kih6&H<7ico(HOip$Xd zk;&;p5_C9l{Tm5BL!QrWX^xNs{hus(`KiT~1GGa$IM;wf-bJbWh}WV2Ba_pf%MY%< zCBeS~$GBITqrC}tuvcDwdU4MO?c5R0OCq;@(j4Iy^nYY>j6^672igxI94{sGgZE2w ztiZ9#$a{ZUanA?s){t?r*}x$O5pB{VemvgO z!}OJxkm-hl<8M|@ZfI|Ta26}!9~^`e;$(ioxE|(zm|cbs5uN-)&Ipc!cB6^hHY=fD z??P@WkXx!74x$Hh^$yxYB%GbVF}vUxfMb)%Sxpjz1MP;P-4zmiS_%0%B3<58ze4{< z!afU0)A0!A+97DKjc~3hp?-t5#)s$QWM0PlJM@2Ka^O*ZbfBFO!pQ}W$puG$ANoIs z<(2EQOl}B6`-~*mqcZ4NK?6c6KT1%p7iDsuapeu|j1f)%aD;2p9LwL(|B=b5$ko?q z|C4ZP0>=Q~W~uzB-a`M!B2RATx#xrH)(IyJIA#|d18}lra_VsTLHiqoqXmxQhID?c zz)>ENm!FB;dy01838z1B?9kSblAHNG^nYY>rg7~mv>!(}sld_SlIAD{Pr)ve^E*k< z;Xu1{BzO*RNLxcHKSto_j>?l;B3B=v{aeCW2psXYG)Lp%DOhB3Ds%4-+SwtT6~Iyb zBF(V_C*+vC{De8kjQm7 z%9F_%N-_Zl+Q&e95`?n@ILbTH92;=-$K}bbI#;gI?ls{YA^CB^(Rh0b*)lnx;_=ae z_G$^|8hJi0I40nzPRPqo53b%pyY7VZ5I7oWqj|t@XY*M?0Z$=ACdUM6I38$Ujc~lH zK$&yF(E~>~DK9^V93k)<_w68@^1vZ&L8<&$fRiMXvzOzby&1x30UW&xj?%|du*&3I z%!lU__2kq3oW%_KZ*Dl)&lIag;DvY?jHHjn9W=5baQr=aT>&auAO1(@&p|W`~y$c-D1(@cHcEIJiFq z;f!+NWI8DaCYT%-WpYxu_Z00S6S++%oFdY4v()tza@}wsg%8I_lAyzZ_WVik3g9S; zN^`8Co`Uu#*K)(8bG`5vb#b2&!r2BKWpQbat-hy_C6hCNdp>AykZ_IxM^j3gBQ*6C zl;`B-=Mt;m&~75`BSJXWfFqWb=4iq^g>;#m&8(k=_6pIS8R5JDjs*;MNxeTJD1F#v za&B?`Io!vBa0*s~{*O|cV{8lkpY!tM7E5l{;lTZS2uBGVV`XWMHUj!TGC5=kJvq=W zIqri)I4yyrfPon)xmly2|6`SxpFr+CMSG5f69XKfrZmSA4gDXPoS#U74hQbDMuGHH|VLI1}MhukMQ9&_yww0BE58-YXWFsX82jDh~oMc4WH0D*r^xN?AY&IxBf z;lPH{lAP|)|B=b5#hwrDXM^^63Fka;G*DMcafBXFIsPm!KexGZfOd2V#|9i@18I)7 zC-i@0a;9@~!~JXs=M`{-hSD4haI7*pze7@v2ilz{oFdgBPcAs7UeN!!Bu{R!Tz=5L zD&bTGj-iosepJ1o|09zlviAq~A;Nvk2q%ni8oS`=p#O7OUVcuo{N&l`xC`2IC7d|m zXqrfKgjneR$mGoDzT0SLns8EpV{yR|fs-SXQ-!=7aNvG)xSs^!%mt1X+5l4TkD?Fs zf3C=rTTSl|nE(F6eG&<0HE@h-X^u7y`ad!`-8c^JZ$UWQfum|B&9MVVaaCS^K)v9j z1MQ{~&N1K^noDz3@t#7eOip2vpu>UtLz3XDz)`f2=2(GalgZ&Q0@}eP;g1QYr3+3! z=>O!%lUrM^9>x8j2&X_WaG;GQRo<-qq5mV3^PGD=Xa|{a$^*yZf+IqsIq;gi{7hr{ zQI?|daX&o5X$~BvMmj$>;D|CgJxPKN2kx6kf}??>4VUI921EZxCZ_<$!TqU7a6jPa zp=~Sme3V0=|8rfQ+)i@!8`@DOoC$=}&IKn4`ad!`Fo}^vIE3na0O`bO>i1aO{!N9P=>f|H$O1xOO7$H$XVMh}=3zbCh7*&n}ZwgL{8) zA5g;i5jaX{t4oywTQc;2ZpxEeSB``B&k5&u!hyEBBxfY_e`In%jr*gc!Mz%TzRZ2T zmvFplz;~guG{-&)`aieiVcYOlF%zoC#s$JI*>!st42mu`DXqFF zR%zOOROMk~#rooheb6V2i6~LH_prhB>(hPEgBtWs?%oG3AxBDpS6HWrz9Zwr-h(Ox z_15+vfl9g$dif~T1aU;kUR}q8PXw6QtXUs1qFuwWBJ6`60Q;cV7sUo`%Z%*Txk4{; zRbSZl+&6Mkbl(m|eEs@$H4O6c7nS}Z*#|uq_CZfgj2xXjwO_d^{^h1X?4lyL1&wUfsl@5xzc&sv)omyO=ULHaNMKSZGqc&i?UYU}F*XL66h4Z5HHRuWZ+0 z)y2W8{v9D&U1j71omw|WoGgly#0K?Rh{I!45Z<)Q;1sb!^=1YAgUf{0?k$RKL@}vv ziI9q_ptSa|4|>gDvJZOK4zLe;>xc$TBidFe)~;T#-lui1)QF^BVezRYArWz8T=gOC zii?Tu)lF+wimj3GVITA{tx}3lGK2+b6S@y-8RzTo9aUItU#D>Yk&*R6I(QTfsx!4| z%kdqPiVaB&A5dgsN8Ny!#wlZa7Eg)pJFvo#4$6@MiOF@m{evsD3z=HEV7EF=n?|VW zXzD9MJ9qb;pz&!eirVo)(L&Yg*R49SavhJl(+X5;Im}Rba;0iDJq?{b8Wxy3MvN8% zYDU!-)5H!DqNZBJi13sVU+4N`N9rmR5^L!ED_2zdml@EuZ{48K zCXM1i2t@RS#LA;Z|Kz|5G0AmD_AKhzvr57sZHq=8Wy*E-^9U2WR}m}1QxnC4fki|y zJk;O2zt~WiA`b78M6q2_csPYBs|$(BfnsveK6Qtv%Qf?>)U21Pbm?j(i=-8cBDZA_ zBR(W5iY)?q6sXXvSBz@#pvfh})$IpFOl#e;O|5~&$0d%R+O>&Jsfy{?bWGVaRp$}~ zix&*=sok>tv~eEIiZ<~ZQ?GY${FnjBC8jhUU%pncpq|}2Cr*y^ifB_KtmKqR?JJIm z_fQ2FZd+$;gTBQ|PZ%{cQPsq|NL-;PvFqsGRYa}WAWcJJ;uS(5Gr6OD`U##h*h;eP=#pd(i`VkqQ2SU(DzN;|F?0#i(ofP8}}}={DXls%zYYvW@zOju@V# z_8d8+W#v-M2UOAbQ1}c|*BvrJY(*qeU_fN)4ryWw_*pV(Ks*V0&%ghuzolY&Ol!}a z8@{{Z;9)t+C_(X2%|tyL9%{-I?`v5c@*mpI__EljfHOxA?@oW=vCr;uvb)op1#hWbjl&pp}!NoRI9iVd1x^U2oeUrc>Ed`KVda^gPs zM}A)P>+W)wCMT7p>7l*@?t5S8Pi+_B&b7(r0O$GR?~nJVKf5|u9usDtSJB_uC6y>R&H zA*mavJiiUiTeJB_XnIB?dG&tMgrFif7RJ<6Yiaz0o7>g!u`c>cyNagY;QNi=G`W>> zD6cBz@7=m*cJRd>yRCjSe#oLfE4*oQ;*lw&>j!x^+w`!?_-=_hbsHLgT7+2>xa!Iq zbxG&)yb;>geE07Lqg1oHI4uvGrk1}pctP8f%DSzSbkKA<)3w{|8r79>Mz|h@lN=$E=@&m zT7J@Q_|=~|y;gL#hFz~;xuoORGW|0bQ2+6=ld9z2{?F{pCiME>&-d28wnrU{+S>6$ ze&%cr`n>$bGI?k>y3x&Pd-V;U%rhyeyoQzXDp$9_P@Sa;y`C>mXh$W)M0vxTZY)!N zZDLAxAL?JcXyb&(4eZwp5!8SEP#^X60zJdgehu1BGi1>7{+GYpe8S`D9TR&VC4J`& zEk*8-sF{mFfM5mcG?y zOxuo2b)Q8#eSUm?{;&Pvr#5@69$NmeuLsTFy;)&vax{~77|K)scy6Ej+J_GAo*bYY zB|M|$gWuPl-}fHpxo{tQY)|68^3%KCRF~W{sjOJWdHG&fY}M|8UoZSgFwyg9-xAlO z;^Vv7`ET*68aUAAzs}s8@^O4uDRZ22#fyLrJqG`|B_ohtKWNCoo&_)MPRI?Sezb>& z``$lYKL1F^yusOGGx|Pwrhe(WGr7Uo?ESQS;rPEOF%GV?KF@5G_;QD(Abo$IebIJ9 z^==hr4XPu{q>jNx%>G=_V_iP=! z<7r!g)%R$hNdFZ*zwPs?=kmr4x~r~1d1!CJoasD${{Fpo{heT|)^C%t2CYx{^Sr-7 z6-(_?ya{|r3Plexq98$Y+ zq$+@Zzp%e4vVP>4c26?uZ9Y*(_?^Blxb6%0y|4b+%IskY0}rN`rRn=Mj4!rg20+viFmvb01`Cm9%{1sE4$l86Pz#y#Rf`SNa_FOON0Bb@nso?SXR_e;oesg|=A~ zyWh$0{VR`YeXM>GyB~MYU$vw@L=>6clc_y2uRzF(P zF#U((!2+ufO+C-}PkuCGl&w3BUm)yiiP+R_?=t&Q|Ejd_8%_N!D^%No`ez6$-W31g zk>0GP<+bpo<+Yv`j_a4zochsjNFcLoVJkT9Tuq;;1v1uAdExpadlpUa=g?xdZOOvd zdBODg;5a1iORrrw+pFZk&BxSV)B3GjqsOCtZ?qkrX`0I_b{%O|GVqt5~+&6ti<;lm7%k9#7{-!;bZ0*_ex|LIX z$*_3}dkgw}HaB`66Sp8LCbKQ|<2snU;H_sr3y z7jD};SF37G?`LA!4jYHO-F8yAO8qUKboeT$`R)EmvChjY+WEqL>L1K&5nrXkvxREb zzvShkS^927g9je%^J1wy?@r$ne64M@aUslqrTl=Be9!`;KjhPM=SRB`NoJbANjb&) z9ZEZ*%Iig+-^3qow($A6;DcPY&vl)8O)7l3{%*}|);>VHQ&Fsaf_BD}mecf5KMVJ* zZ}#QuT?@QFyQg02ygYg?s8r&P{_O_Ma_8sy{P=Y^QLeS$=i@CEoVRyY>ss^`ct=lEvhw&oVr!8%!xuzldeZxu9aHbuo0@V>^Hh}2 z?|aXu7d~jV_d4AFnY5HHtVEqbp6*AK3qB{lzQJ#N@H^ znBZA*bh**rybU}^<&W!5ao>8M_h*_84bSeF{X6|0;yz&+=`_7tw_gWc+Bc=2FB{K# zQshxysm{Vl1*=c_`{n&78Vu zqpA{p9;Lo}9yy?JT#&vR&HwA7d(z&8ExD_iPQTyo_Osq5>Q5!2R=#tbd7iva+_&>(O4HW;6Bw_*3C?dF`5<&S^~V?~8?x)>=1w zRob$K${+WCRL-LD8=cGYU$yp@N?nfn*S@S$_2k57t+V{8zu(&qCG;VeA7{i-|IqA7 z3xnrAK4e=#(>uPP*3j{*c4*a;>Gz@Nm|p#DrM@a`YC_}JdKtI0|HAXvOe}reuhGu< zXcrXsl@Ff#B(c;hOKc#kA1<0MZi!sE%q+H`>9v0K_(Z`AU-we5@uB^tlYd@cac-wT z)*t>K-NOfKWM${G6N@27`m3p!e!XY5>7 zetVCkfvL}Fd+l_O2c>daEBl(*_)J7#P}*DX-Z>W59zc8GxUYSm+-5Z|-??<(%El*R zuG~rO(Or4b$i{=-c>R`fvD3ayIjlc=q{*<=XLE0b`Yxj7am?v(uYjVVQ*$r;yY?dg zek^Ibwq!<+3~zgHDqnuzd)&td_q9hmG`J6YOlpm}De8U&l*t^0v&=bjW}fGnXXea2-?^O?vColo@6Oyd-umL6&)4Jc-t#&${ti6P!}53E&*|Rv?Yl+~ zy(TuC-e={z@^O8yoAc`YLHA@`AfEScSmd2nZ}jaMZH0cv{Smgvxn|jIZo*TKPCESe zrj3#Bgy)L-^3|{DPuDnruhKZ?64;=)+n=?-SxauG!DSey;u08}7~G z{=Ur1*1ea1*+(&Rggo|s_Z-?#|GM7A*9&^nuNXO`UiVIoiryCbTj-l}ZT8Q5`@}ve z-nX;c6uxj*hrfqMQhA&m-(^PW){dW)Hx~MgzG=x7ztqu=x&9FGpGk|}|K^}p%W}RG z^=Z+MtHNv@R@;2n3HzdV#1lU>==0h0PFfGZ=l1eX`VJ{gdh)6bxvz`zXjrFh zjTe4h_f_c*asQ5OXY{Sj7Chr|iTHeu41Y)d^Jb5(Y_jd12Du~;p9{v{y+3y0wxc`7 zU3;uJU6h}1MeEYcJJ-D9a|n8IU&p=k!{^t}i#{&$`^hi2dtT}K;@$4cMg6~W=CC7C zd&V8`QvLZP`@HY({d?3Gyv~Qe^T^-5&$#UKFJ4%87n(7$JUiR*wI1tad`bNKiIwKvQEBk zLOwp)Yptb$_RDWBw~b-(OGJuzgZ|kM}YD2@#)l$uXneH4@|}BLf5hK$SNk{hp7+=Bckln2+xoMm z2j@2|xmc9%?pCc^wcJ?$>KGa?;qN{1ck5&B`EBNw=4%dSQF%SQV*kO+J71`kPyGe2 zzvJ)Fw|YII{^pwx42-^7=#S6s;eEOM-M4t^zxW(b{?7g4XU{#hdw7d9PbZOn={bKC zPrah)>LQx&$e6Nb;Iu_4TXP97w+P#H`=0|3oK;5SyK%LCKeD&gvxrasl4@ys}vhvp-8 z@0dF9!=*_tx_65D)u-jzHRg87*p~Z%XwMJLx$MX9L$A zypzVWdEaI^?Z^Cf#jLyP-aPMqZ&Gl3t##h2#WQbQc6T`8O|||Uh-h){(W2cWVit+_ zh4<4Iyes&B`0L)OQOADpgijFqe68Pm+kgM?+drK&KdjQ5_T}P~W=GeK@LV3e|K;zV z`pDkdT^7Hr)A{2r%zZ`ZQ>DlIDPlho@=V#csKpz%%*)QF@#gk#FaPEBh~+KvsJ$$D zX`U9lucbSi#)rCWPw%y}eETZjKGELX)T!5|8at*Wcq7IAhWgu={}!2-QFe)tcXFJz zqvVae+TI9p|J$84A2`x~i7$VQ;NNghn?n~JnEPIQ4N*TjT`>OP1-rUlliNT%Ur|1D z-Ka*r8+iwc^5}KL+l^Ov#>|d6M?Amr?kQu-wmTYm!o~A-2?O@sZoet6jQZz-R`%A- zKi?8rxK2Fh?-!LkEYhp`nfUmgLCse^etlMNk)Op!H(tH$;yE)sZH4@YYBleld{xQx zTpE9yQ)fc{v)3HE%ue}#{?oame*W;_;taQ-f4^_S%lqmNPIV6w_a7WC_`G=Sg*QeY z7V`98wd$p1bN0ODqW(aY=UAtgcdku)_(Y^#)R*Fw7eDmO+-{%c9TxA$uDjaAHM%)* zK_2zz{9UWuhXg;~Cz?$AC3$_e_NjQ@t>CII9qS&S=6g!KFIU%{H)u@iq72tIQGZ%~ zcBFClrJcvw`wD&VI^~#Rk^cMb8@o-8`{_OR0MTDOxG5z&!ufK$oN$r;t`)a^((^=W zxz<<2Z`tnnliw$_>zBJ+#IL{irI+Wl`}*dX&Vv59MpJ7&^!VnL883_e;i_}qdD^~u zf7_DFg#IIjXmb|5@Z`3P8sfRCFZF)x^5>p-cgF8A;j~^seO}o;f8VognUG(NKj{7% zd!M;x?k%}Ap78FP+t;_RwfCaJUqtz+@#|*CdI!a)q?OQkU)ieHM~vva`tKN;zueXS z^V>h%^WG-cMWQ@DpE|Mrryt)O=UgQ8b?BSuAHVT=Z%d~68U8*+(UU?x{$6ZsmbmBr z5}r@Q{h$*sZ5q(?ho@s}iTd>6l9xWObNP%f@@ane`D;6-XMZ-RnVZI^|NeFA@a3%WF(C*@_7hl?}+CozIp87O*3;lmy-T(4cjwzlcSa| ze!O_!KR^4YIb(mi<8v3aSA3qScb!PTv+J$(qpxZAl7q%OF1d5zYY`(Jou5be;OB)s zmJGV$;8&in#ryQ)`{U+5Hz9sU7Rl4&UndN@@I7Eg$}V ziAMU|nA58JV`uG~TXwOie`@?87vw$J=(nr03(phzQJ<^#n-XTGe}26F8h426r`C7= zHD*Bgn9gOi4t?n-+S0M(*EB7r_wl(4zx{gh{eQogJvMlIukz<}T#HG+yg$|PfzbEg z-#jvZ^USk1l@gxrQs-dtts7n$?7T`m-`Z^ah*y`kZdqa%`c~;DeR}YhMcV82VyS&k zsrBvn2M>QXsDQ@v7ACFv;EADmFGiESp{9TQraSH}uG#b~CykfidhZ_>_w#kCQ#efU z=kITqP=B{!NA?@toBR-y-A6p?+-9w~bme#b#*t&(i3vL(pnWHY>xuN&{Yho9Q zdp@@(e5<&h?)a)`=2MPa93F9R-#7B(?RWluOE~p+kxk=QY+Q83_0cqb%-@YH&KB|0 z?!0Px&xV`7&!P5y*tVAM?;icdmgMo``8TWftedm-^#l)<_j|85Oqe_Koo2-}-ofXE zN3Rv}U)|BJ%>DYlJEO^7wK(=DBwGcN}_l zYMsqFB{W~a=cpCGDe}|P)w}+VpQ(qWTd=-y#<&YZBC_E^S~ zf824m{aVp~H=lXi(~Dk`kc?@=5s;R=coJr<0Bt$DxVkmyo2!m2RB4b>@w=}J97z7Ub}nQ z^WNG$BlB8|{;%N^drDe=2g$e!Q5_|;!AJYRI)*?)c3fA678>QDH)nE8*2^w%6n-~YyK z{ckRBBJO)`Z1}^^h&ZOtv=f!15v`jt{=@aeEn4LfFSv&8_FN>Co_L#pf z<#<-`yUR1=ktSb0veYwHydV5M)C{W6J6FH`)Z}q-$@Vnyyz_&9HmbWgX?q6Y`ST-& zuY6?p3xDuFVE!IT!5TsT#)fINK3;y+H<>hk-ecEOZ(h`C_8<@0e|&Dad!vXy}eP$!N5^7)c{UIg!>P5xA*KdV{u zk5k`Vt0j|uM;y4k(INY#pB0e3e*MvYTgDDtert53XrKFEpW8OE{^*Gst+(Ot8Ad-L z=sniz;>917ez?X-?aPX=r#8KLp}R*G;n}*EPCc}L#-G`llLWo^-tjeS?Hl)lqnmiY zyao38OBXFY%k`GH=lypj)V?nHz*b{t{IuqUH2(GO%X3<;yY8=t!f8I^wGF9fU;KB% z;X<1K=(1zx?C|xy#@VSot=*@_RfTtd@K-pkhiaDi(4qbv6YnjE7xE7o7@4|xXY1OY z)}npo@1YkxAf7M%vD1zLZ#F0^ruiiPPHFrq@qBXD+Mzuz++9$RF61A%JFH#y*Zby| z(ERCJ_kLX1f30VQgVsCpc?xAaMSA|OOgZ%j?V4?DI`yvRKRLb?^d9>ux@j|8!V5*q z#r;dSeYNPaC&vDr(@&%y+WFI&%exLu@X&dJS3UM#q4rU$bSJ%!rE|Z#?WNKso^qN` zZwD>`1hf1_5fU3P5Yl5Nq~3VM8gu=cvRf2w#wdBU9|+Le&~JN7`_r#<_e zsFzLYe~WqRz^;$i&-T!Ij*Of|V~@OAHpkOcq`$7HL;bvFf40md{Bm7#>I3g)zqrIp z@Bc4_V{eS=yI{BDK~euoUpwo|E;}Di@kWUD>AuOowFt{N$5C{iu&;(s|9r&Ju&3)e zsXt9iF8riZ$CuA3q4A*xKMdN|Fw(I+<~qTjzf+m~q`3c~sL^$=wU{`+gzObQN3xXc zYyMuigT|-$`^T}5iu79AqMW8T|GFT*m$>&W^=+Kx>UnE;OL4zG>e)-W4h_r6yGY=Z zc~5k|(ECRA^Eou${-CFJz1kz6+EPN}i5YVizLWpZs&=lCBKLp*jZ~gu(TL02$ zaOu+eb$TR}(Rx+2{~fox?e_zoDBkX%jgG(due=7rPp=wb#K*OykkQKtv^topEq{pCwrTYYULz(N_HncUH87l4ZJoX z{})qldS}nWee3xMpA`P+>A!U4sFFf@e^q*){L#Kc`vW^aEus0N<6XUpSy}sU&7$>a zzdIUihUeJ<})V_sXJ%u);|X4)A)*g{L8V6w>6$!cxiC^ zoX=ym~bc`_|iC&W=f*B3i$jptY-4bYb1wGim)s;d?!%rw$)J z)kWi_Te=;;!nV=2ri8}xx*WWCNQbDqOOvOG_KUx(?tVn@d&PBuLtJKXtb(;_FwI4e6(4URbRfHP4gAU4&^_P^4j=Iv#5XL@6h|G z{_?qQF*^jm%pWhi^p2Ic*GeY*%I7zG$=354F+3%jfgUC*Jq_o!2ko@4eOkcH)%Xy^hu^xm%>)m|b^ee3veb?6m$P z<6!rRz2AzOV81}f^QCs=nH+6`=J;07|FvG5+Q;9zXh+fc;`!PyhNnLr)7#^r^$}lZ z#q6y8-AmIlEXJos9Xs(w+gIngeFH`Nbo)!=zOMOk+Md#G!SRw>U)B5f@9h3*_YrqZ zEu!%O^?7CY{2kF;TK~l7vL{pfowt1aUv=(S5>ZC>T+D_VZ~SVzVqhWJXDaGJi-@{4($OOQ@0%aHvBs#s7G%?WaBkMS-@LhDWmYteKdJO?+Fg)V zzAEoXA+1+yb8F5M_fP$9Y7W`Qd@g_XWHXfWuI<^m)BcR! zEXqIY$)X-5U&XoN$zI{}4Rh#yd#-iQu?PEl?R`6X1+qXsVfBo#*k4;?> z{!I3z;{7X(**>G*#Q2Nzlg0f_4eB<%Zu7UjeT0v`{-{sy`s)`y5Pzq5uC+hZ)peb1 zp^w%le1Gtbwkf|R_;P6fOU^To?fkaW6^Ze*f2($fg0!y>J$j3S+Fw3LsGRJJx${4o z*-y*bkWBk)zTZ7__$$|c(zyHrVgG-d{PEFIAD?)?oZ8=Cwr{=STv$(pO()Wm_JzPzva*NAs_wq@*Nu4|KB!p?Z5w>dUJfu#q+{OEq~nG zBMvTnRr>cs{kBdkqxDwX+I;wI@{yqpi)s90?{n)8+W-8%QQ1YJylZ$0 zJJk7e&I~V&M=$fPx!^$RhOq^-p5e2rwv^xh^PqH%#!tVv>(ZQwYj=d_%n(2df6h7L{=o;A_r0&l zqC@uY1^-{S{k7)n2Zj|FQ-84X`!&bz8+peoS!8c-DtN7ajUH`B7gGOwewSz7_kADr zelgjnYJKt6snfjU=-ngo?iKvh=O=p~vt`rEozK6nFy}5o@9(u=?tbxwPp`4lcx}sX z`_7Np_DqZ~SCluOH|l*~#J6p9Kbv@Gy&=V9ube-lXRTdR#~t!m%zr&x^E+?;^NAmY zHwtb3PR$R0PryO#6`#*kMEG@0$v0$Y&Vval#pdR(dN*hx6}3?OBu`-WS4l3-VbCd&xOFp31<*m@hQ0l&c6$h&oJV{^G$4zBA<@H#|38tTJh0th4b&o zZiVO-x5Q zylxx$><2zsa8{cYpV<50{JRkOoQp&x$Lk%D&k4*d*l1RK3V=^Mt&5aM1ij2v-XETq zKtAWTfpgO<;Nx0eLn{c8PfMx?o)?8($@@)^PaELl1RKpNKPC6W`FAu=5;PN1;1|+0 zUh=*XuzN$~Q-}m5$KxRwd>!y9fWFy^PsSr~{&$FcrrISYaLM~} zk&hSnIG}H~;!^~CJQm|KW~!PtS;>!!&ey=;MZm{f0iWoVaQ=6Qd~y^%e9j35KMs6~ zD&Ug^e4=SRxGKMT|B6ztc|AGu*$8~1!PcI4)32v zK5qaY??!7r(Zzs&Lge!!GbI02I+qUld<1-4FI)4`_5l8&`DcYp!0kLGgy*l3&pzN& zQ~{qX;NuICPq8xY!t3CX&oSWR%(u=@$!CCnLgX_`>F0R;CGx3%IgBG!z{mMH;2&D2 zsi-C3b^{WW9PbOo;FiEA`c>=vlmVZ-5czag^26&pkxvig^I8Rbz5x6~>p&$@gI@lr zln?LgM?Ry0PuV7GK6!fq|AfdVLCFuVw?sZufltw9Yd%?D0saY*4-DU!9G}aGd=?|0 zH!I-t4d5SI|7ju;L#&NMHfDbxsN8LXLj=wqJd(ion@Zs?{yMniQA0+bG zDDlZW5XdJhCroqFdJ>c;m}5TAD&@oLQIJoe#3wgMemsz$%nQ}o8?A|ap8B|fD= z@>2r&DGQO$Z%RGj^S6+F8Sp9CZe0&DeggbM=QIV=8HPp1iFvevN(4S9;ykCO9g*^r z-9f}RqT6hqtzlX=t=Big%~z$}M7l)^ZshY3YXP4IZNUzKWLV$4SEzh6o8xUIv6+Q_ z=OaFSmGk~P>>Z|$T=eN;$XvpV35}(2#e8PcGb`|;X zx_hkGM~Tnz6DLlv94G60A_LwBodnO1V}8zVC#YhR5!o=Xe2!fRFGVH$0Ic-J>yVL8 zONmcr5I$P-np#m6`S5;D-6&9R7XqK0 zD)Qm=j>u=K#3wfhA1Cm!)4IsOoQM#s{O~zh$Y;L9$9`^LejQ(Q$pypI|Aydv=_48o^B@Nv<8XQ8FQ|5keA{qV?Vhr}ncaiHGZz$dqge0U!d z^4Tx($qd3L9{4zDzf)jNM2J;>_`F5r6BZ@nVtY^;gij*y@l}xzpNo!sno4}!=LPC5 z8Tgb`kq@7*hkQCod~$>E@c|!qCFk&2>5cbIBcI_CAA6I){A2>3yejhH^*6|8s>CNb z2%i=5*()`R4Ml>e*Ddhl^L@CxQ!b+rQgsn4Pk(~>5p&rag- z0-_VH`25^mD)4W?U{Rhe`2qQejnJud^A;o!uGac!!ypf%{M_wsA-{8?$PfEIk634D|3T={L-?*4q|Cbj z+U;||HigQ=-+GBkOH4>lfcK8*`G_9-9tuxpdNoD4)JI8T;l1nuecL1$&%}FhQG%S7 zOX&)45b`lS5evp5h+f8ML9aPHD0u~FJzi6519KcsiWqgn%$fS-V3A*@M~^i-g=2;; z(m3EFS9#Clm3yYozU6y9J9S$6 z4b!w7POthzAo4FEXRce+Q*19~=a-Y{l@py(+E3|^JH*^R`NQeLQqGCVQ)hPVthp&Y z=bwG1V?UqzhoPd})pp4L{t!LHwz6wLgi3yTLT{Jwc1c~B18OGd)`9D~@QY0o^`j_7 z_{`r!=UJ4KpGW8Wh0{7+2ko!%kzYc-oA&W$Q~qLWhAsBo_!c650r`=%zbuRVa`HV+qDyoN>0Y~7gnMaUW-WucC*MtUoZUruCi!LL$M+E7(Y=LVMEkdM zt`zs)al+3cI>mIatrFqM?aL@9 z-|;%pA>Vm5>1VqL&!BbKrR4MX!g+luum9xnZXSAm|m4&+SR5e&h&|-YP!!)9ActfP!u=kR*nQ$Gc`Lr0VtJVhMjfL0`*gS(uXWI(;r~#$zk%+eAS6ob z2r2OyUSo_|K!3az522mGp9(zEfFfF#ogi)$_(%cfzeZMEPSEA+t~n{*RrZ4@rxM|7 z`;98?pLz*jYiBMe zSK2T7bF23$zY>1T=AZKa*>b|xvm@+6HkT3VqHt`*<#awN>^Li~_z%4tv~uBRJli4Y z`{eJRZkf3s`=^|4V!vw6GT|pL5k8asxA^~TIVGA#KaAc<(^`;%;@b=Sg!iyaNXv~j z-)F~*^86cK6#S{q-bTb%!>jLw2HY0s?1rkJ!c$D|rgKC><)_9gJjL{Gi*wXeK34aI zr_w#e3tX_p35K)zAMo8c4P{2jhRky_!q42C6kst%3jh8pxva zKts(*@kz!HmF~&L%ck$Xoou?Q#`jh6yMN5D{1nqOom2Jg^nJ6c(#br<^mdE$(kqjv z*y5a=%F!tALa?mYlt=g*1}v3|A*3OUn0zLO!Je8 zoh#P!6x=L)OoMY!-Wh`Lfz3kC(UZkJmlG4XM!&#R!bKLv`qyl582T_3uR9(GjF$A1 zxEQ4sj_38G5|eJ2H7UZsAm?h1Ao(uM(Kl)`uD6Kj!oj$%gSPPMK`5Ea;VRJAqe$yV zP;G|P;@atOcvQZ9A>IO=lK6-9$>l)4)4dZDrWuNa@PK+#!=aIUU6};V8=b>9^4ODC3->!j@xd-+Bu7G@;Kf<4FujmnK)WVhxTDqEg zcV?NLj7~r6bhv-j9HL)BdjJ#tv-338>j*0Af9=!{mM=8c)yn;nst`L^L)eGr-E7ze z*bj35$o;fCS=f2GwB9#!rV(GIS>b&d?0td$Q}2rkU|$^B0a=Q@;#*|UuSkCNS=6hr z_ZIqH?2n^f2=mkDb*GuMj3rV2W_lAVfmi|s+zEb%;ip80)X3o&|{Ilb$~q=fXS=xDUP(1H(x z71D;~h>}8xWFunPhS`v#kqf?JM1gTc9k>Lp*wxTv8xr5aFq_$mWI8TN0yP`x$nqeE zFk4^vFX*Fms4>|}M4DkXUS9+^5Lb$$TZpI)b1p<2j4g78^pP8;M2eVWw2KilsP-oW z`5oHx6DELhJ7Hw{w0;TR^jT?1fDI>3?F+xSw1kOC@ObdB*x@7NCiEXLs^7@Lv2nvk zP8c#^O?IkoO9P+a6z5gFAH3+ko70mAQ3Ov|Jbd;*WvMZZ4htYLwvA4nc5khpv{JD zri!0cUfj-ccrmrtk%^*TVBghNq}B`0uisbRzmt96czw5%?1T?ev8B{B&n-fq%qI#i#1k>D)3MI_ z4{;6H-!&?KhmeLyi&w!NzT?oBGrvq9kI5k)+dll+KB%irf^OsQ z8rXM$p>(q2I;0`A2k`RWI<9lF<2BB^jQ(C8ui^fe$0K;0CMHBYPwMh}c4@rE4z@ef z=kXf0^BpS;d5m7(PsV?tKI<%v*K~&Q8m7-=Hs%tMu|h8m~cn;6lI(OrPz4#uZs1(r5X7 zWKa5}@fsgs2By#BHHHL@%9&8NMwAlrFmG%jQ{USq%2oc{EV z*EE%~7W#M%gDk7@8mx<4$E?O{j1j>9?RZTekWGx&3`$BLm7eHMNJ*Sl$rz0(rlhfo zE*aNZjmuc!oQi1TGZoK<-y!M?kIQhqQ^#faJ7YLr@|-kYVtUVY<~AF)SuDRE6yzVj zNBqbNZ-*)$<875L(`TRMV!c*XkBsY?Uk>#*j)#RldB1fzjZY-@6bQQfZtb zf+I%}m){X0F0Tx|pDtW3_Xn7l()Gb{c@Fm*51I4L`FCdr54XbQ&LtxLsp9gI`ve`v zVQT5P| zBO0hWE=PL+6?UfJ@_fk-ka0Qpzl=K>j~7X}_GBuKL&D__z~xMzaXI6=j3*8Iqaxg< zKIgvhZ2^}vea7Yf^%GBrMxSvrkE3KrxI6=JIn!rc&g&;U5`DD{W!Y8w zDlX3>yE9y}KM|L+otOE5$cGg!&$)-5Q~GLLF0}vOT1U|b$oX;k(1e-k1Jcq`(<)v& z0l3_VDOZLHt{K-cehi2zwQm8>DhN<-8k{$mg165f0BDFIvOoN6hU@Z(u0T zga7CJ7QeNDu*NWO9*X03!Yc0R!rO8?kGwq{X+4ZG5ALA;AT!sTZ{+2G+;csq;q zcdB?h_6fn4@ivc>a5=Gj`nnHktyuo=q2cXPqK|a`&3JnN$hUwq3qID;Q<(?Hb4aS^ z!6k)OUsh|NS_5aS26AX$Lk9V{ZWn(z4~|M`i!@E{yQ^7 z`fTTBustc^?M%SiOrP;K&wrOn^wlzybE48$@wRiN&_kwVeqIB_$5So{2#m z{=S66P4B4jO7myfCBja;^$U4JXHA@hpTj%KKm>e>-A*y$mfb{G!MS=0)e*6 zo-?;=oq(Z?!|k7}EN%&5Jwu%L#yvI_xzmNi<@O)>XYZ$cDL6cv`-yyWzFB7XE5XC@ zg%7qKJ^XnQ|5R~!@k@dZ<54fCIz9IUB(Sm0m3=M~SIp2`}-;Be1f_w`&v*4d9 z4sQ%Js&Tla(CW)-4ODC3jMadL@VATnMvzndAr4OiRhfXX{laCp9C2go>_ z`(MVHjK2#d9E*Ag)j1^`?gSjp^cjaUp38m9us@7mK9Gz0Y@me02LcXf`i#Tb-nDNH zk-jUCC*pAIpV2XW)(_iXZb^Q|NFs&#KjTb!TtLR*e)@#NdA_?)lHW|R;=6H#!_giX z2RNMRGY;1Xw?@8g=%*rzEI*H%WJx$Y3vf8oXB^J+-I)@7wG3r`Dt#4)=aSv&knB&y z;cVw+Y!vyh!r|F##B)x6dT}_81hNYqhj*tWRyZ8%BG)l19FFD9?th8H(N6czd-t1_ zmX?%~9-EdrF$q31SK+|{F!`-SXYnia8Q(EJ42UeXa{-CTcE+}*Lu zfvn%|a@IlIeNe*PruSXvYqMe7#qwK;!tWD5x5C|_%E!2y>1HhtJjVcev0Q$=o}?a= zdET4wT+FNDy~`~WK7XHxzxS0%@w~r_nw|BUh{ySkh6@>=Khb9A5BPR%w}m!OjySa< zce?Po+%F)1|9FRj&ts_n$lhkoH_Ke|Zt!p`e4bDGJ5_w{+amZfKId}ea$@-g=od!I zp7(2L_}n4&oBw8f9s~JXz?lXARPj05rq%ddQfT#MwFas+aK>sNgVv)*)B1GmZ}Ert zdEr^K8%#`c_iR-rqB4CabEaN z!~QUOd6drV)MrB_d_ENLIn!r+&UUdcRQfJ6KfFVHj{P$_rqB9e`z!w=Lw?3iB8B0GKCCN*Y@+I9KAb;1&3c>-_jpiED*( zlxP9BDlT_ZePUeB^-jg*kHq&J8`*5qV#MV&5KMy8dmQ;a7oj$6vsivTD9As4kNA-l zE)P{c#^owqrq4dh#dDDq;`dzyVa;oXhPUyZ zugIM)ye+r$$lpFT_&)Gl>JJ>Bn)A&v$L|gvjxTnw`S3{6->Ks5(jvi^@ivc__{)g| z9IpFDOYPbn8s5&3`oVuQ-o||q3%D@A$M*D8)}=Rr^woGuDN%P)96f3^VAiRzCKnCD#rq6hr=fNG{hDM*|=kbvo z32)~B-e&rYw|O4iE74cWP|kr$U&Y(`WOq6x`x9+%w)3)fiF{b$?c5#WIj29pc-y=> zJk;~_dF_Q2-p0Dfb<7HHV|latU*c`F(*@ohHfvh?J{T|u0Ja7zUlnIPu=+Ui|-=tK2O5kruSWEX0u`2 z#qz8C`JUe=zPG~Np~}a&TcykN*=M;}uP3X=k}l%A2H7;O8=WI?v~Q2Ool$Z3#G;|Q zF9IR@*A5ML%ilg@*=7H9;cmITM}E1H!Ev{f`i0DW=6th^Mc)Sx#}^#yTCTFtK8N&o zs<_)zBKR`y=Jg3&PAs2_yG!2;4R@CleWX*3yQ|M%?q>RoyV>4N4wb$OOWEvX+|Be^KWu;HmKpLhCNfhIcZ@6L zaR3>2`{@(z=K1Z&Uk&=f=vsw6AmQ!@0CzKe#@#%>of#s1mOqQ^$y^C{=K}6#`i#4I ze!Ennua==KyGmch-O-;3J!DJvC*p3l^X%V==T^Ae`MEiLHSQML7uZ}}WBFhmM&yI# zfu=v|7%>jc!Kw2(5af3T?q;wZm+A-96;E~tOW>z#b;0e3h$`#)O!_oM^n9G z+|Bh*#ob-Dr}x@fzI_$q?sgLHHofmUGn)A&-eU3@x2x94plzJ-6~zC&pyk= zdOcY^y1NS8?I;%S+hq;Ktae$cxMx0{;X&vsbU-;9UZM-Ur24X21JxR+)_{cuatLo{kbf@3!ynFf7enWK z$tmvtMtcBRpDDOIU$O&a+|B(j<4VTcg%WN>J%s9967F^Z?q>RoyZ!i0Gxi}Gy?h`S z_1X0j?!F%Pf75sZ<8HQh?Y0otmd62P-0i1NxSQv> z3nlr5B%%FZBjN5fxc{5I0xg%>B`l*OA<6<5s$&+w*9`64p`i#4Io;y>bua=?A zPo=No?p(4v9g_Wtn2_zfjNgPkX@$G94~XZS{`BJR=2F%|UtivXQd!M+V_oDr_HUc- zMmycu|DBpLGj&?h@LB2JS?T>^D~8>;0bGeMY0v7C@g3vCfOt|n7x1it02O!VQoUl_ z&Gkpc-S+ptTvzbI*@cL^2S~Wv^uFtSZ8mJXSbi%}_z(O1h*mR+T< z;&b<3!d}di>`%n!Z09+{gr2PMdCU=W`qPWg|9{^9ZQ$);sfm?;F`Tfu9#^gq7T1jH z{PE_YLXVqDJkj&Zp&U(Ej&$J{t@;dO3(|Mz$amz&;motw>uZ5GQP zAOHpMd&JMJaCv3&aeBt(DqVigKFh^=Jy|`5cN6-Eq;{Z5FIrb_H@9CZ-fmSotqAdU zH~gqc2oAdR3f<|#+j2XP0>qymd>wi&^#}Iz%=u=aV;ct#x5C?zq`yUn4j_sl0?F^|Otj62b>(IHrSNqi(sMf$4qyfU&Ww(g$fn$G*Kb#L=3=1c_ z)jBo2jrIU)>rBDh1(F>g<8AJL8Ba3KE|%~r>LFAYE8*=}z}rlp@iybO%$A1zQ4t4)()&x6}93XMMFVIChTknnZ^?*AtGjJJ6nJXxZzmZ2insHrJ~7_rdc$~|)1MvRWk%`Nj-TK>c&dcAP4BrL*=EBw zi{ll^sy6! z=oKQ~hAzEAce?Pl+|Hu_etjzQ+u_t7WJH+r%|aJm5``*R_Zf14W3vFf_bfM)Wb&zZq}$0{Iq*tm*%;&#qp7E-9q?vRVVx8mQKQg$6vd z?%Wk*{rR5y*pH)?U-kKIv;14UzG-yD?6KuuMA&af6nw-KWu;HwlV03 zg12S-FXL@LeZt#3uN~Xhpl?W4`PDvY{rNt?+f1MFHqUD(UltmD#>1IpPZmmeyAbd; z(`UTR^V-E9gjT*PeRY02GF-@+CE1^dxBYhB#p1aY-VQ(Coc{FU?f;+GpBorDwDspf z;#Xe1HO6<057i`Act?$=-mADflIj)XZmxeS?k;`ptS`Ild^iPh_iYmHHofmUGn)A&-eU3@x2x94plzJ-6~zC&pyk=dOcY^aymP$Gha7cw2Gyz%Y{BiFYYspa{XT#Ve#NpV@(9G;(`}W#ysr!D~FvgY(7h8J2s6 z-;10u;p)*thfWwgEOz+FxC#9SjOsUXaBST0k=pzr14dpwU}&d~B0`*d^wmQq^zReb z2PopZT|<|#sI5^y(EjYJKh-p@hiqT5-I*C}#HXksd0Btf)LdG0L1T!W^=?f+eV4=^ z36m6Ct5^@YjV3Tx~i+y7`pEvKeEMExJybfrPcFCJ{i%3S9A!(i=Vpu6$wmRlEW zXg&#Pzbx@_b~Vb8QxyXSsmyV?alA~bACZZDbpGrYbP)9I)czHHB;>=k8tWR?u|l|J zj@$+?UG}T0U$vZ=UZ_5&&!G0cWCXSt(9cAf^>!4(usum!Ttmz4oBGFVa4llOMF6cN*=q?;7+QA&se<=O3NGZxm zeh*Ps<)k0HMx8NT?iW$-mR%n_V><{g{Z8)RxIDRkV>_~-i~0TYC$8iI+feM^&`gX6 z{LS>aol=u?yQGF!cCYq7zmG8Mo%JQxFQm!u*U9SH-cjg-+gH)k z3(hCCznxGP*`2IB+%JaH`xrh7bF69koy_It1VK<1w0Z9v_w4Sya4lkD?8;rRzD`cX zdj4;>n`-^zdZa1sW**g3)`u(`UWa!x>%;#X1P|73mXQANT|>Q9wcYe~7JRwg^icib za$-5;6Yw!C>rc^cmMC@uml?O4cIo{LR<{3F+D*>aEu+NyTTJ>t)pj$Q^uzU&>2kY? zdano>RMu{Cd2+kS{d|$jqP}r~Tli=bx-?fo20Sk=sHri19+&ogA;v4?pSeo6|9lp7 z{K2vQEB(SV*SOoP_Dn2mfv5s9jvSzF)g~2 zO_v`d_C1Kyns(QJ#8r8Wx%{FaSiEzHsuLHF9&=B5GYEUn-=Z^x;C{p4!T!+y_BxFG zF=9MOt%q4RQohRfn#O|)sJ>o2mU_cN6B z7h;_Ua}hq;Pt=ch;U_$9!S^Vc%i$`JziEQc@XS&}YH{s!I6P5_NjJ=z6fp|ppz8*| z1^Sivhwa#@tiQm1TwN37a#ZhkkW^fKS*?L;4V)nw$fJD@IppJbDE@4F>uQ~$F?>&N zg`w51{r8K43p`zJ*C?h`fRqePGdH#(_s3%PJ`!1J;VnER%ytYu({+ragF^o_T%W7KI@0=vz%B% ze(d9|9Ir!=*Nw>QH2m~wod)lRaE>(SThR^{UiSp*-&ufmL){Mz{qsBmug}N`kv_{G zP4yx3Z=-xO|6|Z+JW@h*i)R?}SEPTHzKTO~$u4zB_9@mawg+?j2|iZqG_re$=bZlZ zuG7E~BX*&m6NqcZ(OI1nh;@BVqw`eZo$FX)_K z;ti9MlcssKQKpzIb;Um8KBooVvBE(WQ#IpH#B@bepLl%+*Bc&xV0usb-fy7I?YpX$ zQ`2@ui%_h~^86pieG1yd%AEUl<9(6ijyiVYi?*-MbK^RY--!>tPp0-nPhhiQ+sJy7 zX~@^y-f)=JI*?HH!0SL%x=f#amW#{pWXsFhUEuyK!j;9#1m!ZfS#Os^u#Ed3dhYQL znnGBY5OIGa7TCf+UASNFPmr~53FS+{{aMuSl#Vv%o5hW`2*(Bl$4yn-?-(rTR2BCZ z4HxMd_h*xx!R5np;l2d9CoZv#2s$5&?;Sc(hOmx7>SzDWxF6f_1-j(oAGX)0g8R|t zt;YS5LaQ&UHBhaAGgbpxg!ePZ$G!@Gc+SBh7>w^yRoqV+LpuO3|E;+HWbu5?7^DA} z@jUmxj8_@Q7f5)RR1%Wsknp?%@I2FJJfG-OSRUTiE@w}ft;d$O~k(*$YS1`I(Va*87 zqdm|J@I2FJJkRR^?Kgx*pXKLqm<$QeX8@jO`i$q3iLQfi5z48Sp)9*fU&Zq|WN+Ff zyA$y|+j+iGA|F+Tj#=S(EN^!IOFWNux*yN? zo0gQ2GRs>TnCECLZ$&=iIL3i$Tq|6o##8U*d1Se6Rhw4E={_*?6kF4-@W%6-)#@8xce$KwC*Q)A~aXj;L zjur14&qHTY{xb>Zjae-u@Wq?kADm#7armeQwMhjl_cWCqPWkes7 z|C@366(HXNJ&)qwsp4=P(XGbel0vI5t2I!qfiqSE88?aV-h0SLy9j@X!#{w*@sv}< z;b;e-^3D_-9>eSNAWt$5=l+**CgX2+6>*?l!r^wn;Y^=#c=)%pze&RRMlX*VH#_y& zZ4wT@4RAQqXB^JD#^HYY zgu{70JzScXHdCzlE|PFK+5?e*!1g-D;}&m=q2C*g1(;BcnTINV3&%k%3f zZAJQ5>8m(A@)}W&S(4p}INWdNO%%_qaCrDQbNbVZ!&_o@$%T%?dr}H39FBF7>zEY| zH_zy!R%r#PKA?owdYBFM#%1x}I&To|bUzMSPxz}pZ!bDW?|&p*ZhGJK$Tl0cT`WJR zSABk;INS=ChbkZAa+NOAXP@O_y`HQd%Ls2f2#4RhMNlrCWVFK=5(PgK-o9hQr?}qz zxe)PoV7FuGP@E@>UR3-C76XS~hx-6bK?XFSaN4zeV?odtNC=`-Hu`EJ(& zLw>akW!Y8wD&Ec}dsCC_PQ;CD=XuivA1l0_Iho|3^rshZn^CX47ZNc>n9aN!lJ%lP zVtlSS!R(fIM&kPCFx&r`b?k#vCZ|tMm^S(5;Gffz*0D=5A&Vh6#&e7Z)g)HJ#H^u6HWVK6c@@qdUf3dkk@Ql!UWQ@43#*X2Uj%wePcwA79onyTJ7}6GgGS2S&!=U~6wu}oAXQQ4ga;FPt zYf?Lp{CR#~Q*d_Kts=kfMdp07%vlSAhg;!nFX^wUI6Io;VVuqL@mxMEml#*(mI(Hv zp9l?S7ZQD>^KZu4T|mACoLTU(udZHSE-9q?vRVVx8mQKQg$7~?U%SZ1@7m%I=e2Kv zPI=rZ;%u}7koB2@vo&cyqKvb-|79G>_}UpF4nrNuE>gnTk$|(AKI3f0YtdPT-C^|d zG9_`XKD$@K+4lm@X8Me?+0OMn8zOyIAW!Uvv42L#^jSY_cV*pa&<_P?%eY_0*?#(j zvw1!{H(s3oB%}!af2_2=JQi>^(`TH`^VzX?8S+;|opG>-?9FTmXJ-S>X8Me?i)p?* zE5!0u>8m(f^9ebVCA$-GHrsi{gy*ercA1j?^y2I$k}5-=*X~HEtZ+8gMXqC3^V{qx#9p63Xv`-!0fV|9HMz<{d)+jKed?KH&0! zD7qWT7vy_uihbUBio9G_Vk|||oS8=X1}oG5D|QvPyKkjz*3bDbBfW=mE+(Jx?fNgA z^Y4_(LCDlSAO!0HKEpD=5nAk9aby?AYUK6~%gRmVgV%V@Kj(|vJ1qBL=lt_nspVP6 z^C?EqQ~r%}{+)at0`Nh5v=8{`xE`{-#dc`XQlmbJn4$g0vpV>k|EItnW%_*1KcClL zQe@a$T!%y9a6Q^vaLzwskL$tSV)|@v@qC8;8iRf)bk#VjU6iKOM=o>uy+ayS?Tt#G z&tp!$Tj=>@>kHFsf8LjUX7;;k1=hV->L2l1w)Z)1G?Yzcj`gX=tEzl_?mN>Be_xbK z+2iK#38?x|`B!$&dh}Ae`o;{AqUauTJ#GOnt=@h^zqhhovw|-n8otA!Iy?)dB8RlF zZv40VJ@tKLeQHX-S3vJA>qC__a+z5l{^uY#?iW}4y)x1t=1JGvN%ngg_X>X8@A0`T zTt3WSJx4!3O!RwY60X6xTvps>giGxd_IqlX{$K0&E>08uUMcB4lzxwOh~*={r>H9z z>4)nj)8&2#^!8Rl}u`irfxTz@ewzqcn_ zj+hqR$)?M@ui|pz_O2@r96a!YelBE&^MLNVerm7VX@WbnAGJE^_t=)8Yi6^@HQW4| zE%ObxeqK@jVA1}^b{Zb^{34O+pZi}~dof-c24_u9)Y7z6Z6^F~)Y3JlHU`3GYO}Ni zIPKY~je@XQa1!NYcs?G!1r`mzj&L;qcK@WqiO^|qB6OObA_+prz?kQFEe_(QLh6}t zJq##_&<See`zC`7?m#X4y*aMcZBi1RMTL+$JePmL5Kfld@X6*{yxHJ|sb)w)i9 zP`big?q6)=e(_SR{SQ-iy$}16=bS__$SWR#B|}=5!VmjJY>T!otZB;{Y|DVlD!Cl$ z$Fh}nCjW-PLF-i}#Vg)q&NnkJS|2#7H5c}72@Q!9#rKQ&m?vy^`)fU*91`F+ z0rZv%F)_{r;DB{01^!Rdzd47oDtaEJr}gQzFIAfYR8xV+6rh2UBL`8NCIOWR5Sj!r zF(>Izr$kI>uY!EX4%>+22ZTP>rQM_}C~G;e`$4vpTV?{sjQ}oX`n4`x$ zXp~Rl;=nq3roFf7c{UNGuMKr4HNo%S6;b_T`vBi3@%=jntBe}r#rn63X{F*XtqCk{i9LYS?zukln|McpuSCWm2< z7iRO;;(OU=Y@)}}A7H)8fu9J8O2e=C=?`?I9cFXD4N7Kqk#vhpAgAd`zVwLc`Y0G; z^DrB(vOj;^-OO{Rl3QJC#x_>XbkpLkvnI*9SZY;K@~ zT+!JB=-@b0m<<-G>SZvkOWE{5d9WW1v*p5n)=%94I*5hCY>&c!+-ZOIC3}|y(!nQT zwg^d{dI5BBOdGTcaqwzGSw?Cg9b8`%W-EX=Y#G)Mpo3Zovq5I`I#F{$0~k7i1g09* zP>S<1@ zCu2kaB>hk){QXZMG!q7d{%eS0M!WLH4Qj{zZdZAOrw(>5Tae?Z8!0U>iK z#GyHL&1l+k3TfmISwkVUA*6;DG4yJz_PWE`QX51316o+xdPpY`L%ijBh(8sUwmA;g z>)KkB&v+}bCX3yCNT>P1^|y&ShIen1JbD~0%4?*;k^L~6UWehz`S|S{j8xxKDm{)C z1?^b+4bzaEhU3p+{!hrd{@T1oq?!P6psCZH9>*jhwkU>#e@tDSBx)~4uO*5^)8m*V zMBB!Ya8-}@KQmHAQYt-;Ny78>RFna2+qv1ewx-|h00XrqwVQc9)AG4VpgXlUcajQcW; zRL@Z=J&s8mE%a3Q9;3^=<<6!em8=atj!8n?w<>sHs#bY5uN18W-n~t{^f)F7o$%C< zaLUF*LyT14Q7S!-iPuH`RB)l~?KfhL(UOFb;CdVruZ#VuFiQPpM?6NV2uh{LG4Z-Y zPsJ_hlev3-7rhJwYyBye9>>HhLQln|e8+Wnz&c{?N)suS9tX*23n>JzMW*jJg+xtE zo;nk@!lJtreqpvquB>{P@ehNM0wza(*hgajhJ6!CgMAD33)t>sn~m={zI*siU|q#J zgk|f5AL;^SYz4na_+19Sw(x5QzbN>%hhH@OI>4_Z{IE$v8N0x*EBv~_F9v?tc=doE z?osXqKWyu9ZuCm{x!~6qe*NG#0Dc4E=Y}7cFYsM64ZhHg4f)IUuBm>}=EtmO0y*JYIzM`=C)12KXi>=_i$sOq!UQmWV<9Qd7{@G6MW@ zVpAu>qcl9!JT1wanwCCcX41r2X_M1$x-nt$v{`AmN<8?30Y2kVT0+XCq>0H%6Q>5G znl#f0nmpY*VPyKWehJ=mpiDvm6$&4knmTosci^m)iFnTXfRuE=EB=RLCa0y(N|-h} zWzOW3L<%0AlAMr|I4vpBpPhk|r$KJ$F&x=mNetLa-fvb~T2e}SY+CBXBrt{rzqq8d z>623u(v!@=gJ;rxYTCf01k6KhTGC8NtxXhJngFUpY7-_3h5N(3X-Tsur_P$`e*jud zm^?EnK-&?s^bAH=X7bui;>eR{j`tS=yA>d8-PD`4O)kZiwwA$E4XT5IV zXj~Tsue0tLulojy@1(c^$YFb4x=)HvaYOZ7FwcmX5gpU#ablj&D3;cZAs#vzhx8e5 zGX0!n@ttUH4vk z3i{y|eP>YO5Ln(^ABT2fA6eeOpkFXZ(9aDQ^drv_VbB6qK`BE~!$MUm2kCFUuLyTiV z6$L_{lyU&bgKSY@9}Gl`h&K-m1Fr?pDRiJEJ(02i2NL{klIgy;tc9yw8yx& zk{?HY(5dpX-rZ9BkME+DWBFO15&fWjc0{|d%p$rN?XzdFXrD9di}tzr1w%hFZ5;iO z@0mW=yV!k#KH{gg(ATj1c|^aI=*PTh&<~Rc;y8(P>&JmiUw_uj;cruze*9HJ{?fCB z{MizHnVx#B%HLMfPun2+$)|c#Zb2W%USu9jpX>E_Nk1_`^b<~ck6#;HKR8NL5qAx zh$^DrOOn4=5c#=WizWIpJseGv?^*sB>aSxY`D25~&*d8PlA(WDejInIh`#;|%9qoq z^`Gl~@)3i+Oi#U5E&3;p1z zS4H&WB>Cfl$j{{(zfR~!l^@5)g3;&pGhLEDIf(pRuK7eCX>nQMHIAgA&yMxO^b@7} znHWTV)_ZAr@bbkmH>Qm~(`UP~tt5YX5cyf}?!OHBvivwYR}p>v82}z0bL0A{4H50L z{e00rXOjId(+c_8RN=IiwaoL2mqMIY@RR3XFI`#yCXDTR#4;I(ICIKt2V;2m6@vu&Yhu6sXO@GPQR#^T4~ZI>Fa9-LUY- z{M*7>v_?K(NPN8K2J$Hgfsdzda6Y?RFMD?FT@M~dK7UJm3NH@ilOF<~Obb3ei`#4* zvTo)wIBA=cTA77t9KDi(>gFP<6aLO!=he0&}?zD>&xfsb}} z@On_g_o#jS^p5HHp5_oAY!BFOf=hBX8;(Kx`z;Pue11>&E3d%s?dsZ|ojdK%T25H` z0eoDL4qKP_!Qy>`OTWu_xu(YLpFdE!h)Fl+CvVZ?S0A1a;|An&^xRtx>+4#%C6m`- zVH^%mRP3bVu&xme`l`0G+@4jn-)H%GKO*au!`XMz_!o{b-uI? zv#dFt3q<43O@6`|Rah_hrn#Rw9|q8|9wjc0*Xqtbvh~-)V0W4u&X0JGsPCJQs+i_c$|C~nFUIiNgNJKQF)pdDKaDRC`olb-n$D#4 zr?X(z9M`>02LC2$?I~o_a{Xy3>4VpwI^Gca;rfPY(apt03zCcPCf1*pDmd!{io@@F z{uZOY2CJiI`ubB`7lH1rBLW}BlD>`gr?pP|`qL~}xFOH+_*WFhp=4N6VYWP6gkf@l z>rdUL=X}E*5cICo5YB8Tlfb$n(y(iMY zU{i~!f>Yr7(|mZ&)UDQ^(!{EE?Z6L;L>nN}L9;i^Rs>B$Be+6mwf+?4#1`bmr{BIb zP#%0;!fbEDf0oB;{VA^ALH9z9(gEtA1DtF ziiX)%!he>>YW*p$5JEja`O#yr91U|Q>!%^yhuNYbm}ix&)}MBUn5d)o4yU&Xq;sxL zXDHBNdBplJIbV(SIA}4U6n9T@0ZCOJd>Urk4F8!U0iDbeaUv3D@HwN7T>wD`FlFq=Wq_)F1fI@`MM_!TF#tn+N~H?{S}FSRfsJUdoma zjCl5_SpXfJmw~c?|ET9i9dC*aqyt3=apZhm7(fTtm>KWa!RMo)T~PI`&okNHhnSqN z76EjeI-MTyALW^I-Gf^L>0G48=>_Du{x}2ZT&%~r8~$VMAK7pt;3id`OY}JD5X|-d z;s81kdYo+h55EsrzuiBO4!pXM_hS&@GPpt)A<^;aAvlf~X2a4)SMX53DRLaKMjq#J zVVyYq$GXurIqj-IUV06*H3pfnbwt-%;w9+7s{(ZN|8Vu@GqYC((m_eXY{@{U9$cYo z6F}#32o1AgSzvj^<+fiPNT;nH2UW}RTpmEDogN2k5z<+cmAfa94z^&hg8}|?nYIg{ z(_W8*ZyB)D-tY9pyMc7DCWqO+fd5RVy-o+#dif@&Lom4Znp4-Xrg`*x{Kp|_0U?V6 zLY@o=$qxwmPe8~w0U>_{gw(-|>5k>$IeJ6Fo&j;j1%%8D2)QR9h#dnHCi)WrB~HcbvLpND?59Yxc$EvlP-Vrb)Re8IqpodwGQc~1krmHO_4ZpaTEwi|i~ngQA}_(gC?42EFK-ikvy;2Vqmp+BS( z4Q&{yIxuMmr^4mPy2Cb8=cQA|ASZ|T<6uju$LWBSu}`?zAHtFRAzk2+?y%3)Q~5*C zmJoEnh|nF{cX|j5sIRxyLpX}Q`q~@^Z3%N6>=*P976kQt5F_yAx2o#%>bi5V%)EkAsgi579wI87QFno(G+xKgBpx(d|$HWU);v2lMZWy~RCQ~Xsj)_+K;m^$1#;x zZ#@+?h1!)3-fJpS$-7DPI3@{ke}Ew&)+k}OK(Llay!1FG32{`<(8ii+z2+IIc2O!l zj!8n7p2`OQ(QUi^C;C8cC`2IHr6J2;e2G zT;w%_Qt5F_yat+hEqQ1}eIwOFluD0d;x$N5)fh>GyQAO4-v#2py8=q3$1(A8!&5_t zn{s|EGE$XNDm{*g*I+#rTb)>50<|Hp1{D1N*n1cFx~BAh`0Sjv;+~dPP#lzr%XESw zrNilspa_b%%}JVb(nNEUq-{{dt>PY|LzyD36EhtX6hRS`$+%|Rrbd|<%w$Fp)F|Wf zKHs(0bM~{>+56*y3&dPD|USsUVC@6@5(D|QXi5K-6=tC`$bKQXZsjYrloDwa`2 zl`lOyhKy58EJfpyb*x9$duLv|yBq5w6HC!}WZ|ueb0Z}~;wK4*sGa5k@Zx{&-QL}AIfO#f7+Xw>GC8G%NWayD$z5;U%5rUlv#t`gE zkVmjP!JY&dOX9iFuNg;xz5?23w3}$p(9T2&CJ~^%L_JnWa5w?VBg#n;0rC~n8|i@O zI+@^9f}atT5X>Nm6O?HYTtILk!9@fY6U-;LgrJ4sQi96}E+@Ex;7Wq42(Bh* zCAfy*=LFXhEFky=!F2@J6D%aSf#61hUlJ@LxQXCq0-8bywGrG(a2vtx1a}bJNpKgz zuL#-+?k4yR!D51Y2!2O!FTs5TO9&nyc!;2r;1PmH2_7SOoS=)~NrI;dmJvKl@Oy$k z5Ijfl0>O&}FB9|-yh1>kGW0sZ8wAS<-XwU7UMChT0kmoP&6k@=HDnGrJ}|E>=bxJ1fgdtC&S&1+k3BN*fzX%PK5n zJYkTP4W+TtIkX$JbVgM|Ne#tjCTOFmd6?4rnR8;*wQ+i&hD1fITy4ROkkvrSXf~! z3#Z_ug;k(!VTm*r_KH4=cce~F%pg5fE+RA5)Yi zDmJ?z8B$tC4@aivB$IipK2b&4%0En`1~F!Jq!C~|#tUkhIM`IH9)q)Sf;T9eykdvX zNR-!-vVvWiO;TEpv`$CiRnm^{4RuR}M^D(&PQM_6WNA?Z<)sac*!CPc*v;n1-%(=; zk>z7`wN;g6XGWvPO)M-vIdrgiCXw^4h$18%!kX@k$i=!m0oc2=3>eMb|Y`I2Y(bS2@#|}Gk;-OPx$4#9){jj5tiWN?s zIA!Xw(I~~58asmG#bT3V4RwjK%JRyxnBIboJ=f~d2gs{qP(6&vPwp@_WzcNPjI_=1*!QSYCxwjq))WIV2vJ0%XyzGL> z{Mq@{a{e5BDgBxH)QkQ+{RsV8daZ4xBR{lFlnE=Yb^R6ea!k_tGfu6k{h9jE4am^c z>;p1nI>T_#HNO!s=y-H8IcoPwRJl{@(I6T{>ew})GZ2mL6FX{R=wRxj&88k4HU6bl zrt_n_PegFMr+*Y{j7C!7m zN6QCrA<-VF?mx~`_zC%P^TfJ6ah?LNKjZTh_?*h7d_k``W&RhX^A4~E3Xb{netX`h zoA(cQom!42&G;YudHodg=kpYb@6vn=_VU+%@^&Y_xBZi+VwmjfRzHsO6rx?l6uP>7 zNK$`3PodNBuX|AQAFS@XJ57FWH>OdzAeZ@kbSE6(6-{W)K@8~&gffxiI9 z`m;UnF#5x;clhYfblD$j{li3OR8bQ2>NYJ5{;a6>%YW#PIUhJ%f3|yt;SZWj>|bb} zcd^lb0>xYGqd(Ji8~&R?fN*+Moj^o|-*}-vpT}YA&vwsS>DCV$rLst3*#2zKKBGU% zSD%mmOxI%g%e)V!dNrSB4}Vrv`{h6MUt|!r{%rR?p?@a!XM3(P`WF)aRX+MNUExRC zKARJrdUiT-TQMMnQ|#D9^G{!G_m_@kVl4q~TQYwA1rgY;i% zBG~q4yY~%Jf3|0juz!z_{!CZcuk8c-%lxlbiE8EG57NIUK!3J-yWtPAOzhA0Txs-g zqIfHP^k=&4PqqHJL?`X9SEoX%Ua1_Bj>{g~Gv1}k?*yWc zFG(%GOxJDrBmXcDh|sHI;nV&g{e$uk+dc2ILFRv>Pn*#n<+sg8f3|yz;cxeU^lDtC zehB^`{a?@|DfVZ(_YG2iw&zl#KkEObKKe6V;pf^uXn&>s^(tVk9Q;B0V?{8WoqyQw z?S?;SGOGX0^A34Z=bsLWH{^lT{FAi%Dy{!6M7Jq~7^hbs>l^rk^luE%pY2{@_=8g> z{Rg(^5~F_?#arT|Khx!Xq4m!rx-bDdz3N%t!5^eQRzSnq_Gi1d82+Hy9e)9i(>~ig z?>n^6F_M#0vOUqi^NDN!wq3mAp|-R2y`8pLZ7oF&jp{q*-}sbH-+V$hKIro2@deZM z8U0Z|$og5Y)Yd%V53|H0Yz;dCwhms>xe3mtL8!rNJMh zKX+IMdQ;hy-U#9rz&vXmT`~%{ftf2VmmH5i5R^00=`zkRSSTRsEp&-~dw+-9WM$E0gfXNKk12xI=8 z!akio_ThZfF7%iB2Ie2r|6eKcPq&YKINxN`DniWtz{&g{RDbfgp-brB<)c5RYlYyi zrRe{l^yPljXpz3J`RLE-+Aa7?{jt(q%H#B9{@p_VZXf;G?s<-DAIUFBe;${t7WVJ; z(Vy+!BKS-Fv3gy~WBr+bkI^5Mc#n_%Z1+CHpW7kkiFNMm$2G~{%(rw4{a50h5r3M z`m^0D1b@jdNPnK!TqyJ(@^EVZjqTno_)Gf-ohQirR}1}D`{>Vh&l}>}Clmd7UgtHT ze~yp-Z1)zyU+RzD08(Dk{yd*HMYr#2%(I_sAMQW1-TMT8$uG$MJg?I$^dIe`Kij=< zsB0gof6#fU%s*S`pY5YR+r3@z&q#kWAKoGK&-2lr?Vdf%Uw`ackn-66Jnx$$^w06p zpY2{D_)C64_UC!or9%I4KKirWy9Iw~|Df{A{Bwo=xjy={-E;SG?URZA{9d$K=pXgb zpY7fx_)Gl*^N%_II%j+2|DtGwl*-9*^FMzNAlG~+q4lTwyQ$p9^E2qZ5&8~(?gw(X zy3&MQmo>l5=Z)sxulrRC$NAgG!zbt_{c)pf5}I;8>FytS&z~tKT}~p9=ko-qw>J3R z;o2^RBmC{t5rAJCnd{@Ox4?he0{!NEw%jdrzHTmRZgb7wTHh};*U&clzQSC4%(Y-!jc+s8?9uwZ&Rmz9Yjit} zZ#UPR?e%?=x%QfC;SL(#VXnCmecx=Zedb!UqsDidYh)*V-(s%)=32b7#&?;koo;z! zbhwRQf4|-W>n*U}0s~o~VuC(Tb|AXefO;nA+{twN&R!;A_P#TgzsKMIdHjgZf^9I4 zczbV+MSnNj^k zd_5fEc2D3vUY^Gs!V{Y&w0p!3AHFjxu{GqJBIJZNNR_jUHv7BF6a#mM9 zxwJ5`mno8(}S!av=3laz0w~aGa&D(YxwlHl8Ku z>*|2;M`_pFTiuMxC~tTU)c_d751W{Ec=zQmeFZs%LQc+(UV3`l?R1lz z<-6E;aCcqDuKwZYAHAYr#6xFo4LP%foZft!-f>h|*w-|*6VfBp7B zKN<-+EkaIP)TVcw*GNwBR2%P=lYfYR_@?9cTXxy;(@uh%yM&yQBAecE{!DUmj<@k% zIXNfzhu^s1?<-p_{q0c5=@N3HB{sd|^pc$3xQ+M9=}h>Ck34bF>+fuJ+^&$*Bjohe z+Vqa|H>6LajrYo_o9!RI%jGw8pZ>G5$54L$F60EYKRmAUa(C~z{5)nYmKbqZ-_@IK zct9!Sd@JMxwLi)6pUc|gV>y=$)#$zlb@^$#>*iP9+vlJ-ygrM=KX{|z=!bsx z`j(K>DCF>Z9;QS6hBZt)zIX9nAIm8)c8lJx^TD3eK6&oyk3Rkea^?#;a{Y$pl;vPA z1J56Lxx05PXO3x4dzTnFWA__<(`|p<4dwKDA*by;ySzEhN-C%M7uk4M27Jp+d+No~ z*(!;}FWok+;~vPlO~~Q(94@`%U~MJOgSdFFukhEp-9FW7;-?Q?_4PZu-Z}wtUKDb2 zUry~GEXbgL(Ee8)uh5cHuyWBpEe~$4>bDPt9MAd%rLyB-uLjTKc%Q<(>om`EvDM#s zhE-gLp=ZF;=R7?-)OsiW-a=gaPjAVd#B*gXCP;)ki+l2T`rD;HJCiV<>I}* zd?RPPl|F}Gxc`w?ym8nGkW(t;@cU_(i{oG|GS8p6c(1S6$oT}u7w+wMzS`lnN6v|j zB;3VPj@TEV$*KI%ntz_36D&MlE~kB#-Ihmh{<{3RSGR_oyM-Kn-|I4Q9PCZu`9Bx$ z^|74myy(!)&%ZS5f$b8fLr#y7!|!EXa>v0Q9-d!x@m?Rx30wK?wV%9o@yl=i;Zex> zmypBnXI(CigS`ekf9c}AK9)0SLofdR!?!!}fLoV8139_->o6oCzvpzR9S3^?cz)Ey zdwneDa;tyv>esJ6y84{F-$2epDM#!t(wrOzdvAFD)yv(zV>!RD^u3=# zPPvf7?+slJj-&R-nE6~6@Aa{q9W1+jb@q?`eD%unhNJvkF689=E43c&pn9~a&BlA> zber;XoRtq2=RG~_%L|Kl#Pi%Da`M*En;7be8r0w9l+x?J)bK`O5OT&He}8 z*MMiiUI^@gm`np$uHN-`3YtO%yK4I{PfS$l$JZo3UY~5%$*R}UWbe>&-J#>|u)W_N z-&ZnDiCoipOa5LF+cjw3k^8%A`d+NV*kNtokF7R**7iMF^hY{fxSzPD@5@>YA8wbq z-Q;$S+Z}EfxZbwkoAnqzLGRD_eHqVt^SpM@Jhq*#oZtAGH{Q&jKd#p~On>eu71Y0* zx4zixHl3&A^EV0o>B+`#zodf)$1sx&uIcs!B06|s4L|ZS?tiH7P}%27@OQW%L%IsH zzaeQ48A$$ueZBTb21oqAL)E*xrpGg(V6IEwp_)l2WLAVq>FmrnouiqcGc(818JaWH z*_yd$>F>w2oT;yP_N@r&_R#j=?@%o?=Yw#5BNF9s7NvCAH|XzBt+v+REoA2*Y)pEVc!^BA)bR!cO~%Zm9OjFZrOA z3p?AxgAj8fb z)X;KXa!>i?)|TvPb`D_w72L2S#!TkZZZXi%R~O9aL+@YpenSBKyk88!u*^LLdBaaO z-rkiy1%k*a8qdkZ=v=#}akqXlE!&M%rsC)md%Y)`)ABYU3o8<}#Sr0q6HC!}WT~Bq z4(czY+}C3sr9@LR#uUq^D4_~YiCvBpvOaxD=e*vS0(Bv13$U8x>_9->P3sw>AV4kK6%QOe`xZs zEN`%TD42yOg~?@;wPEkJ{oVR8B+g^vdYI2+;_o&V6bgF9Df7Q5otMOQ0rThcdRokW zxzz#ZC1oN7{J9=s{(K%&``>jxrYP#K|AhtLp0@kqEG}Xx;!4DR(GuEk$^3c0G4Bg3 z-dpoW9!9=qr|T?z2fq{L5ci7nP*8utF@LrX@3ZVQ{6WL@9Q?N963P2NFEaYiBf^V( z^k=%dgS7rAKT>~PS86Hn2kDP`6VBG3)3yI#*Zy3;>KNXC)}QSe5$lyBv|gF{C)c~1 zb7{$PPeGgzt~5AUT2*z_)Gm!kEi3W!l*GQF+^-1UJu=}flk*>pYIJzzG?it z-dT}!U8wtsOkeSwxBr6n1Z{)t-!bj~<+as}n-=b;?GZF?_;2f&u3ba>X}4?Hck1^y zD`))jor_QZ{$FTs=M`wJQ7>@0)EN9b4(gbJ9Os++P35w-^D~`RzW5G}Ke@p^uZ~6Q z;!oG}Fsvuz?duPf&I8F~IW1;f^xcYSN|mPZZaoUbAyoUor1AN~LI=fO{zCOOT+TVk& zI6&JE&jh=zOXKiT`hrEA#^Q-kSqNitcN9+j<$!VcYGV%`hx2?0=QlEua&h*UYx^QS z4)3t+&y5w=2;B#|`PDCvuIuA)Zm<9R_6cenUSjO+j>E&&_n=X_Fy}>MHu?@`;~4#& zP~_FHGnW2MN6Vyx{Ms@?!lr&T!RjKv2ZVHSM~p6&{JPc_)d(`{jf%qK2EO{`HA0;n0{d`N{#Q?4v@Dp#NPA z1{&yZ!hjcOGzM6G55CX^cy#3OH0WcX?m%9Ke0vN^s6Z#%AJm=wCjWyMWO4fQI5JK+ zIgaEJWPPHpmX5ri*?^<#>B|frB01O`qdtq)aAtMr*hE7koz;JASrd5?`w$bAM9{Nk zDfy8}raUgAwS}Rgk_iaxB!7X%^SFlF`R2JA4}0h|K!kx^l-B-6X;m~Rqir-NV)*kp zv%Frocn$lF#pw5j^f@na>i05#?zeM)z3T$E{^2@lVD0IfMCiANqEY0HeCoF|e;#-6 zc%ww{&xEg}!MGJA2#)#lxR1ws3&ptGThesAbpPN##t<-n9v2sw@%C!LKOL{2FuT7# z!m8&`t}rH+?LZK({{+5eihiH5uv7Otg8C7*>~!TAb%I@vS6ky2u4n9e|6C(zu>4s+ z`*|2Y*lX*x+8&%Q?D#Av$CTULM^95Et0%kV35YmN*r8sH&!>06Uv2Zw&QytVA3#MI z;E(4~gUG-OZH?Ri9OASd<}?S<4}|Cbr#+v=_ORpUneq``s_kWm7ai`kM>0I3+mJR) zUMdUekiIFJ9?t~3txNq+^f_bH_pGJgEc&`yLi9j``kzfxwLQ51*=E`&&Trakp%Blm z^L^9ty8oGL*`Mo3uImdAanr{ykFM+ePt&}FUU*dR2k$lc&+UH>vHG7VUAq4nol{#i zwmMEd(PWP_UY{syoRdH*AoqqHwlgr=$zCFQ3}Gjah*%E~jd%}qQ3@m3vqkK%Q>Y_{ zu6tt7D~*>f%o$h6)9(kObk!L7HUg!N^r3%0hbK}R(-oBReFV=t`NacH*5|0R>P)^v zegsdpJNNsLpZ)rM?i&Tw6QoxP)pb<~^}#KQq5G)HBmczwJ(nMzzvuVe%ZuD{AfsmD zM?V5-2*>=npThIH1;@DjIYo4gf&amu)1UcsKZWP*7YhE8<9*@#e^od1nY|=V`gK3F zPJK@S{ZQu5{ZRhS!D_=FZM$^dye310pAwn#6!Yi#Q9dW4_*mCIB4);3yPvhERi2Sw z(dUr$UB=7@LCF1rp!P6bIly~8yBw_TJm5Ub4hNZM8LS>%Q*}SF)wDl%oY$l{^-c4p z+ZNQn;r`Cw{)Icb zk0bv5o#jVr`{9|^wf;^yt#)aoufk%+EiU>xuvt)lr{XAW5AN@@9-;3!zag%ltJ^~N zcRDTm<9#_CH=hMZyZIIU9XpTyztZ0+ZoWXxxAmC(=k|Ao{>S?}{nX&=o`_DHxC%0Dp?csNSrvqZ;RgLs1$vEx?+q==_FJ1pe%kciodK7h2 ziOFBcci_eL<$euSkEu@dPdLAG|Afb3C3D<-o5~vQ6{x-t; zo<$Nq@xW_50s1AVx_+qjxOTbk3D_@CWXdnw!&Wi>3a>qq;St?0vEKvMouKLQOt9O! zG!K)YuhY{D1Nu&VHLc36q;yT1mXWAtu;gT2m z7E*7xS=VrFq#cJ zSfc{X9xD0wVmH=A!oXqmtR!*;=ykM?!MK;xC5`g87z|q9pjbbbG|GR!!JrQm z6zefbLtn)#uZ%a)HcdxO;Z~V^`p+-P`7>Xq0~?{ll^@=HGM&eKkhfS*^Zx zFyV|I&X&(Nk)rU)89B^jg`H0N=k(fGjW;D9tgi|?^T>c$R1-PzC=v&2Nm{RwhHTw9hEI_tFea zp}{_guv0;5^4lV_ay_1yF?;5i<0x2_v#`@mKGs>U@RsSN%7}yf08O_aerhx|-Lc;$ z>`)O(^4U7&*|8QV?0^!M+plZnNvVABz9#H+&_C<5Z3-XEaSW8E$Q53FwoBoI+!wa; zvz-QXTCQ!tBDFiQ<4Cn^0ygBg*;?1l=> zlY&1@!5oo-IVA;idJ1N)!EBwBb&J7lm&7bHm~E4o4-IBZ!f12y$!D7;F|=hyxs8*U z@dmR)lFwlVvw4zcE>|3iM(*1|+vMH1gPP5YL7k~Ed+$R&^o(Fig;Cq5$2xkwvP*+n z04=Ph!Ip9KBhXfA%y{ylWk_Ps7%7MP(7S7BN5Z(fhOky#w~Qda!aSFv@$BT;NySn< z0rKI*Z8z4_CYGWJ$yH%Ht61oHz(JO-v2pj6iKS>fvc^!TyWR}4+*rHf1sgd<eSPw6ligU)n^=m*)A!p=#bO)Y+&<|}cMsLyOe{s?(GWc>uQl9QIfj{{ z@o2b*N5jZpZlKfBO(6>HYho!HkE}gCvXIKU-$LlnNhX$}@yPnIN7f#DJvz^gb-szE zXgspUrpR)4ueF<4ipC@BCmva$-B*>lv0gT@6b;dZLSGn6zKUh4xzL3hUi~ZG7ga7|e1b~|S_m#BxQyU( zf-4BFB)E#;YJygRYY46-SU_+c!Sw_;5Zp+xh~OrITL{_+ZX>vz;7)?O2-*qmCio4( zVuE`Jen)UG!F>cv2p%AKh@g|;5rRhv9wT_1po`#1f~N_V5j;!qdxAd@JV)>X!HWbh z6Z8jZBQEGKxA;Lika5v(A1o8TRSzYzSt;^e&lyY$ej%{(O1CyRjR;rRU( z<~I+nt53wrVwE+Ojg_TUm1mVUR@T-;qbE%)EIye6Ya1G4bu()N!x6cz&L_B-qK}V8Ze={77=>Ju8Em3vPGx;55?*eGbsx2$6!V|>w3_^@ZX(v)${JUSz*o~M0HbXK*j(8Ykx|(w%1{;foAteT~FpJ2DRx%zqRV3>S zsF}G>S~4e}AWuV>wz*HHLApKxOG-<_nhwx^Nb*YG&G70aoBU*N1w|prEq$kCW}*UB zKfR!0%VxBR$kXgXKE#Tj_jLkaOnEk=KyBYOyNP) zzb#oT)ZnxC?A#+Hn=&&J4`$T``Z|`iPgZ}avyd1rEMI&AQMH{&M7ydx} zbB4S8bHXnF{vU`xo+g^D_oKqk`KPemYoC&fz4xH?byne+ZqgTdZn{tUa=z&`={t<* zFurA{R|D`JU8BNpyf}vla}jV!{VVjj7`%QmdbX=S@@SA7Y63XFRT=$PP==`T(Vyu; z^ECewiob(ku2&%lL{#{V7y4sG0-UXXv$0Ew;SZYK@fYA&f41j0be3x*C#Pf=N|$fw zOjqXLX3mA>^Iw_W21F5f)#f|>ZEAFE|(={9ZsC%S+^ok9wE&N$g?U(=1zsn%l z{@lKBy7mrIf3|0p(SHi@ukz8K=}OMi_SuZ+Wd7GHMT~N|M1|jYq5o3jxAkYcN6#Ic z{n?&in~p!*rEQS>x!qv?SgitQ>z~xy*atMIgMu8FFK+ih2mQNE1e-tW-6i--``dDu zKi7*LCVe*{!VaJGWjjWiwf*s!GJon-HChV%SyAnm|IiPbvA)|M*;SZWj^ymDx z)aW0fcuRfsXS!a)->(1lY92_{D|@n{@Od5d?=UD^f3|z{{K4fUV`p5w$hbmQne3+B(~S@8LDkqce>2-Vd4etFO3i|h3^aSmM_oyWoa`8*Cjf38{Z zm;KM6?|w7?2}1t~KKk=H9KC|S)EDm^9$PhKhH;hK1U>ak!zn!^k@E4g#J@} z^k=)b3I0-FtbvgCtbfFm_fDaIi;wo8T|?$C?s9{d*1nDxrUskN#};l9s{g&;5saLjO)5{n_qa zg1^)s>s0*oXZ{F7{^WAQ`LmzL7yLa4$s~<`Xr2z_aYLiAPn6J&KK9{sja;hjgL1N= zW}*JE_C?$#R}wM*1;RedeC)&N+HClPm$VO7$)w}IM5ON$AN@I9dj)^V59?{3m%QK)Dqj&Zu5A(a zU*V&F((YoPj?^Ekd8ACX5A$Cp^k3$qKij?ap~00e?w|As{ri0MXS??c{+Z~{{MED3 zyM11-!{v+jLGt+w9i9IAOWOqa=^R^x@Nu@8U744?e{#i@-hD#jiSPgdxsQtDuD`Cg zzz=PK{_XTRz)jcc^3ZFpEhF`P;R1c_FxT8)==)}K?K9V+>omU8TqD=(`xbNUH`n5Y z8sBBEc{k{L{{Bv@xnFIrT?KkyY{`w9uG?Jmf2r>mnrmp0zOOLX9&;_YN#onhmA|8y zeY3{bnd@?Mz`(^oiK|%EE@#`({-?Tu#$-l*S>ipbgu6cLq``+RD z%HOrJbxXIt59=@O^?e+FgKf5Zwf2eMg+@kbU1x#DqWLbWw$H_Joa|R*PlGvluiXtg z-e%UM%n7f2_~!4MxJ^&rbA6q@tN65y_sXeQ<{$n|_=AP7Onc-`JkJ*B%#lM9E_}(Rcbtt#PVuWY zUPVd%<-g`1o^{3c!{06W_IAh_C*+j8W79iM4#|nUXXBG1lqd4OfA}5~63+g6&;JSJ zoFL>BeQeV^&M1=8_nD3N%IW&tKm3*b&fP5kq#xf4IdLJU|67~haYiG3vW~R&xO?SP zg#E);AdX-i=X2xM7}otBQJONuCU#Xr^70{&$?>YOFnuWa?TNQ z7H(?m(WchDFOief(F$Am;%gr(&8-?>GmLoYh4(-Yci)n1Jxd|M2G(=e#`y za-I}&LZ{mFjuRz0y(Ko@E2p#6Km4(~rv7MH&oy5|PQQ?oGv97!9OwNE+PStC9dBcv zs4{9Sx&H0VDtJfa>SJ-WmkW+Gds+?6B$mzdR$NR#_;mg7i z%~NKbGfcHVK38A0^5&k~ZygCa_X;@`&!ozUWFTkt?{&Oqc;enX)Nb*+=d}HL z{zAxkOUQ}7oGNEb26B4-sN>x(7gdm~$-jK;jn5vO{VL>qBjhZ9J5|oO4CM5_r{n$6 z^b?E!Jw>%I?^V3|@8e$m{sqVxdmsrWha_zIFjY=*268Gs*70IIk*7G)p0BUBI_mPH zip9LgV-{(0&)*5SP0 zoa6UyF#Dz5hMhYUavl(JidLt}SwwPp9)RQ9*M&yTt5*5BWwRR}DErk_FG9{Ag`Cze zQ{^lmIXur`^XL06Bj-7*{PZncyu*~?WB&m;9|}1=K6cA~DIDT?4CZTJ`;45pmETV8 z8^7D@@4oi;krZL%1RYCNO=caF%O}gh8mNIB&)aTq$$4YfAMLus1DhQMIfX(FuiJ6? zW;s}^#PcsM-s@vIW32Rf@uJGjCfxk|-(k1Qgq(#{cKho%hfup+c!rJl%4w+SPdFKJZWD4k=GpX)GmYdFop0m4a*8hS51-VYeO>;SA=UmY5pvo$x67mBG*dZ^ zj*!&#l1(L(_Ul#Y|ZJm)b(aHx8 zJo3<-SMJ|D4mocLIZapC&+jUa73wvdziQym8+ysp6IlI38H4bKm{c(0G;+>Qmn z!tLL6_`Z8@^j#I?OcZi>eSu4w<*2nt1I#BFz`GV$G5LRa(?$|@6C7I@Ru$;&y_+>{?4g(i;Nf&;(0Wi zKi}JO*7m&1J+Jb_I%1X|%CQPA0+wTqHhpx5fbKjFdmeyD@-_2= zOw_{i44&oj`ti0V-G1^FWk{`Qr?u=@)6UH!@2!|<821M7&EDJC{Y=v?n=ANYEj!k* z`|+J@_!gLT;XRhVorZ6T;m23-#Ts_3T~FnU9U$7Z8omYP+TMIM!69Df5&L`cR2Wyj{aQJ`PQ|4p9CG?avs;?GtR#)k9+$?%gytz?fa*~yEWgn zeGjFzPSv}8ws-!j)yP}h_f|pj7@xfUT0h^~zUN|ocDgX$zW%S$)fszmf13NdgMDwu z&uc$t?_a(7wD~vsp8GkOzUSljdG>oeTi)_3yzN52k;m;Ew?o`cWct1(==oYV(e*rE zBj!DE?sWZ}d!Jpbq88lawZrij>2Yp+{>GsPn_qb8%Vz!cK9)1kRqhe-quqs&8xx@N zLip1c{xIKOQw{2W8MsPZgIre+da4VKmYxxzC(0bFsjfc_1xmlAG@L2m-;=0h#`4+ zUiL3tYVPsiniU#5qXEYaDTf|v*x{a`L7K}J<_a2&UqYds2|%m)0J9GP_M2!-ELL7R zr?y_*xv|i1!+e+?Amxnw%A)lMeSDrx9wWj`w6iJc&NT6(l=svd?ucpUX`wMdLZO3oAz5Q@h?c z{Hu9xtacMi(S*j*x5XM~R4E+tSlHp5w&dS=eL7Z*Xz24}E=@?Dzl9nw?C4fS)7by0 zACWdF%di1#1L=r~bip1jj89?z;RGWHkgi)2j3PiPY)ybVVKl*Z1h9OBU?&2k_+Xvv zKkq`3J52oo8PJu>7oSJ8jBv47WkV^Ba!J%TCgOBkI;Ux`{21Lf(D^GSxO5I30fK{9 z%zdH;H=wRgRI76u=$H^X6Q#bgW~Msqh7OUb62Wv#3(oRjEF>mbs)JaPoBg#qcA(zk z?;A#sKqW(epCDiM*TsHxuD5wVI)4`+cbQxNg3n-Fl=h3G?to+dyk9VMf##e4kjo$W zVK5H-x!z&^ydOO>SMyySp#NDT>YqRD`y(z5lGpa2+OOP|M+9wcLz4RQcR~1jWff)} z3Cf~$-a1Z(Xn)ZYLqg4={4SJ(qPt!GC53uDNp_zeXZ5er&p{Q+pj=M3-p@LZ3SSN# zlFRnt{j9t$x8NDgA7`S;zMQVzv`F}!XsUSZmqJYk$NV{cd7o61u>ba&)c2q3NZ!Bo zf?4m3I^YFb@67ypzZ9?2&iTgQKBzIJAe;XRvEF$Vt#@Yryk9D0)@j!n{@{grj2-G$ z_Ty^vS7F;kLR_md|Kh`S`nG(h)3@V0t-s{u=lA7L%(?z${=A-=zbCWWq^}>(0dZ;x zwWhMyM;~&ww?D#ly6mqF$bSt8Iv?@3SL9KRZ!ykf=#!! z_vzZBZHc+v9+ksfPUMS)WPls*H>|H;SuMNe}sgq$Zxj_%v|KTkV752yEld@X`Q#*KPx+=Yee5bRe; z4(i_^yDcU;oS!T<1Kv*G=942o8Ft6xc%BbP4pIPe{OmTJ?8fJ$e3ep zIuCL_B{}Fz1wBs(Jr9=$i_L(yKg$|%#x`f%{Vn8dNjp_gF9*r#BspB(24rjq)^`5; zI;%eV&b;_o)AGghImvo8;6c{5p5XQTJ!af|(9AQHq~0gI<*Sh@SoEjk^M{2_{^R)1 z##7zzeUBfYpg~8{2P<9}-?;NMKg@S8?fzr&dH(PJvrRvN?P06i`mEO;$?%B(JWWrR zrpGhEZtK!KO(~tqJCjC}u~0Rg)f=aCechRwpm~~-C$&9zo`&b`Ilr+z(dKyEFg;IG zY}udtHK+sN@}F|k$1jhr>+>|I7vZ+4xKPd0besI=&eQzozkB&UCx%vq{!`~^rloWR z!sV?0-!KOr>Zd@qq zchrZ)CLbbyVm#03z~g!3Z_i1x?h(2a;*OKMfA8k!kQgU(x#4j#&qJ?%QP3++ng2y; z9Ls6P{COP3`ZSxf%1X*FNh_qRrwoDrk73d$#+w_=hiNGxIH(X zo5j~dGw-<(D{_#7=Yh(Q!S8v{2b1r4=r+*FdS2C^FX()a{0rWkPTY?xAe=eTcQ#J7 zkJB-|l{m2;hud=qA>2S6l1<#8Z^>UZfAZ3233HO=gUcKD?|A&$^SPi`kuv{7{|jjj z$Nahf!u`4?(ZBHK4IMAtKlpQgVgB5|TW-eHt>!&~&1aWkeaHObt9PHZ@qE9)^zYEO zUO@dj=Fj~*?nf1Uq3wfw2>Y_rIZ@xi??gGoy`q1ITnWeg**@H_%NP1{3D7aT|J=Xh z{-z2Q{X6E*{kzqsU)}Tl8mF&s|L(py-ui|6ce4KVYQAQ71%J#;@1XWOUAaTqwaXoA zdHb$U73G}Q_7=VyJeKAI;gH2khUj&T3Ss_wXg+WtmrNH!xVHVtEUSL^>rdMCjNkK` zVjC(p`(JPmsI%^iUeW3BEoFYddbi#J>n-rVYk`HU{pX?ocQszG*?J4Cx4?P}{BK*J z(DaM`x3yfa-FgeGx4?P}thd0rVu1oVpZ8yUsA3}*Lw*3y$Jp~3wn{f+h2ySMw5Q;d*_Rm_iMf5^LGqwKH{)X9{E6j3pz-yjo-;eSoc+QzaxSB z{>pz{QDj52PuX09rcn6(l|3JuGsL^!j@9Tg^R_)3_>cEmLjL$r#Q*(O!3WxYcqZt$ zZoR+4+o~#pM*6n5ev8#WUk7ibH(1`?V8Q#rx{ZDK{T1)a)b>it!|vA6sFYVFn;vAvBLy2v+3>Mf5GJ!atd zSIf?FIcT5U*`?oB`OgY77FX{(F8%%rD@{=HvNt$&lJ-drG0z@$-lu=~;D)MqQu1Ay z-lJ7WOz?K;@lCI!MMmH#`9Mn8!OON?$p^PV3Lorc3OfhTKkVX^UHN7zAG`w#J41*) z>$71BA7~MF@O02Ze~HW12XoV5N4~q;IE4?^N`)ORDOc|B$S0}#U@euG&!#DSuyi); zP$DaR9(nv6=_F?i|L>9&lV|saJEX=IR*a&!{?Sz(%N>$zO%4XM`&0aZlvM^AHO4oA5TPI za#H{LPh*Zt!JM9gxgZ5|YYOJ+6bxmqq|>s#O5U?RIGF+tZ)G&i7=zg`iHRD_=1I&6 z2D51rQ)4h2CovZp%rSz#EV-cY+34)o|r2o1f~&8f~gBMdR6_ijo(0j4Gi;&t3VJ zjwN@fDjJW5*w3bAktc*NAh~6EA0tcAcr=V8V}YdglWEy*tkX;^MdMlDx}%DPudb## zAfY=Vqn79O5vcc(FHl3mj;IUe-dCg)EQlwI5bQ)Sh5#*69>MMedlHN#$S2r~U~dBK zdq#2CmjGFQe*$Fd@dRkC4kVaBK-)#sH;NCYYm{Ij!6bso1XBp65*$KsC_y2?VFZU0 zppP((;3$Hl3D8m;OE8__cmj+xiV038K-oHt;AaFS1f>LJ1aX3Lf|&%B1hST-+y65s z--lO`7G0*liDyO{a(|20p`agY)}h1`GiJ}6nW&Fd)Yi_5l~#$$y4bOeRg+8W z8fVuhCeug0Y0Zv{pGKs!>kgS+Q`SgZiKo^y*5ec4CejI&^^LPjtB$XkTUmph!ayI^ zFvW-|qRqmI8s>F;O+{%QtB3l+H}VW2JR<9HX+PvazzXs`9J^;?(0=6(@nOrpno1vB`Qin<189JH+s1 za%Bh=x16?Nm(y155aFsT=_}ySq0D>~JQ>Lk7sDsob?PZjiKc|wm~Awanl#Ry5i75) z4+u`9B!5;uoypAi&C`;YPouNF8e-DAUIw&CN(S-==+QjHGPA6ubkf3JIWF3(Tsmv; zrgmlTG=x~Uzd;CXZ;m+!hrDWC7s@Rhk3)G~7q5TK+cRMNucM{?$GR(wh2WS!uUq2v zTpeaz6lhR?490;!kE57Buj}IV`h5ZV@4ce0?nlQtX9vkU)$BhX7PAKG(vdQ_?J;1ANDhby-JoNw~Q zxwB~ZgB(Q*fgFi@rjBMd-{n_sQLjO$c z&-TRGy3jwHcrWnLpXvDgUuuRu`N#gAb&&q;P@bHvKij=SoG*+#8symiY)_m)4E+&j zk&pgN$LA!=ybl?A^sc4BKUn?Q?sZ?e^JSUn&-TPw&CtJsRA}?jpXvC#V${9z8T71y z)*t>L{V{_8XWO6cp8vJ0Kk{ghWBao`ab_~~M}Io|DWCjr?9yuZBX7$3S zztkvX>(6%Y7y4(E|BYUwjs8fp(LVaK-HZOM?IUdul`_pgiv#p$yLTA=Aj>5GustJ2 z|3-=z@zI~@3V*EI7d@6W%Fsp6&ggsigY1u)8aUhjZ1)z?KB6rOa-4tIp6{FUM^OK~ zzn^Fy57Xy&@OKt_#Q7kSH)aRqJ@e;!Yn3>EB=m^OpU)rR?=0qj>*oKkV2F7Hahsf@ zV*V?I{wsa-=W|o~1%Jse=zEu3zCz}Eov`U9KKk>yDMjLZ6RAJuCZs&JPm(_c%I~oz z)7P9YT5_?rOZHxw^-uVF!CY=u8T-J9t96&BKh1+=_^BunWoBlwbNZ(u^`*6C} ziFN1FKA0Iv$6tkQlas8o*gkx|Oi`z{Pen9C`xs$4M*r-o`g^RHm&o4V&7XY!4(FS~ zNt(ZHpP=tebNSjtGL60ObMMQ%?`?J@!kq}@do7OpLtgWStod{Pkb3;j^LkkCkE}4)9&>Fq z_A7WqhqsyQYJ;zPRO3sAYCCtED}V2Tzeh39`L+xB`xxeZb%nX|`|E;i&A-iDTX)ds zt^d#4^?yXcbn|=DNJo2qkJUc$+F#%H>=~;HP|r*|NMlhS@%d~_hbzX`YwAWGKl9y5 zPan1a$Oz4e8aa@;y!I&TycZ|b+CQ+IlG)yPeRu2p^8H_LzVXq9_HmFiU&tvs&r6S9 zeM<&%dM>i#X$u_s{k@M)J@6muyL)XyPTy5Fy%TEAKu+BPZ@i)dbbqYuh>hkx{qz@y z;jPW1Mh>ce9;a(<@b5U7n;57*vyEs?{}h>ZT6N~iLXdah%*?UR9JwdF zAz-FFwEDtZkNWaFO^bi-`(0r5pYUA-gso}4-g>QWx7jW&U;CGn&|3Bj_(^Pep^d!t zSrA?E)|t_@=VeBhU63K&iC((gjdcHGZTmU=octXLwm;+T>wlXr&wNkohw6`Yp03Le zKWFhd-ujEbuiRti;eQ>+o6}IJZ&Po-eW#~%{T!cvVyL$9){o-94uw9pjg{tp=QLpm z0x!J3#d=NjJASD1`tA2DCHtiA6DDz?Tr*#jXTDnloODG;dhL-6i}XegHWJ_6o1YFUOvQE2~2V^+}U6r5->oo6cb9 z6hWhLjRvFFmiouKO3;voVr3cL*tjdp-d=wCXL>a*#NKIQDH=~Kz5bN*AY!>+F<4?^ zDH_iSIGCw)Wv$-z!FK)Ra@Fc^MYD?jdGatv3Ct%Gb)9TUWdr_vs+H3ebieR zr=Pg-yQA8@)aNDHt8BN%*1I>vn6B?xvZqF1xV+l)T zhyI5WJT?Bvzo+u~iK3|xe8#5m$yYQe9Z0WnXK(XKDj%%Sq`Fr;SH9+>)((zQ4d331 zW(ECo8PunA$vR4vK2>(`#Q)svh*wf&sT6l!qj0WC_es%tUnPsvLccS%ZHN`5-W>z` zDn5h`J&i{tmlKL8+tYesgBg*;yl*gLk{DjdyH66cJ%p0mH;E}Qn4Jit^*hF3Mkg`n z8cZaK`K`g^Ciy&XFk2=u{RT5CiP^#!V4EbSz+kpdVqyl9PZ;gJz+iSw(%fw@c}WaS z$SAja67#Xa?3u*S$10T@t1wu%j+BE#UeYVs8H2h`V~{FvC%0nO4>I=A zHIIC*15;$_SW=dv@vI6*pVaL&;XSu*Qy{Ct$Wk<(RpD4G?XFwjyWre8ZmgS3EJfq7 z26e!N4Yyuay@8G;HB>Yn4KdB<)lj!Ggbw}D$Wk;O4WlZS>fMp=oFD&jM>keBsy1>_ zg0M%!iNGZD1~k;Mq=t&dqv0eKi`y>PP`B@d4jp7R3`kMdQ(MD$#mvs9SvSxZcQ8G#(8PQL$LV_{rHYn4GUE)X+zyM5jwQW$Wk;O4G&YXSi{@?wD-Agtes7Rp=dlB9*`9P|HRV=BY zjwLlzG!P!T&+vhtMjWE`Jc=;7w_~b#YO7#ONprNKLEXhPdVC>i&>sjplE&=+6SA=M zH|(IUU_RL?vW`_WQ9)z&{|P>5_QMYHF!R|ch0k0~B!=XFRW1fnT}Z8spmm==9C^j9%fM87|W03)s~2(~1^ zNMhpuxdi7CG!vXpZ~?)E1Q!upOfa9|5`q?jO9?I`xSZe$f-4EG zBDk8MmEanJpA%e5uz=t?g6j!xAh?lW5y4Faw-B@u+(vLa!JPzm5wsKBP4F9n#RT^d z{EpyWg8K-T5IjKe5J4xwBLt5UJVx+1K^MW31WywzBY2kJ_XK|+c#hx&f)@#1Cg>rc zPH5;=g4YS&AXrZDCc&QxRuH^H&`a=Fg7*pjM$kv_PlA;M>)n6O0`mRX$0Vl0%+De} zWfAcFB=2j&yl-sg?9%#pEMD1ASK3%s5vwdKrBilmYH5Ft4rwZ%nI^QXB2hL=Ml!J^ zzPzpxTa;XOfq|A5DG>(>Z^Y*qZEX#gGTIZQRnX$GKZv$E#cCU3W>-~g07^P^nD%|? z9ax%nY&|xPj+soX4}}>|C|4RZOr*z6L8_fsp`a*}{h~}&Tf(%~daq8>j^_5*L}~n} z+CvgGWeKX-aaUAZNjsS84U*{H2UnY?+=rk<(X4fvE3-7j60|d{z6>9=)PeQov6K+O zv#hq7GL9zk2n)3G+|C220N zQf@v;!$)fFA#13j&2VI>3ff>6U@$?V9w0z*o6J{ro5(hi9Uky-HktK!GGnI8N$%dU zpcHrI$2h%{8_Nb0C%Nk^D3W}F%tiUf8c>+~RG~pUjray^CQmUiYpK02b32*S>z$6; z$0RnnR~z2^=RRp#dTvGh8iJsjbz+)2SGUF4G<$}AYRL@ueWpAwp5L4DzCu2isBV^^ z*Q_%B$G$(jyMtr?ysxdp?8nI4+vPt*lV+jlH3dOlbq;m?X%1UW-P(VS=$V~f!8AxZvu zC0>2A$LjlRB7+QD4x+=M?;~A~;Gg5ezuoLtsaQk)5y3y=!=Lr;UPJ!*f`7gbf7UzC z?CTt?eWHSY)Q3Oo-Li)Kiv<57AO5U&@8Np=2=q_q?DQ?czSo>+7xGUD?R(|?$@^Y; zJ@3MM-25{b{>?jL-$Zj18LN2|3RR*23PlaCJ#rw_r1pjn-bg1FO_2D9+{~{m#nXYgjfBR&r zKj#Zue{NUW1^-O+XM468{m0OAwfX4JblKyy{u>gV%!B$pxi$*?SyAnm|FD0N$=A02 zZ1)PoAMrBLpY6HK=)Wh$Tjrxb({&sE8xx(>U%#J+RGMd@clB9O_`EKi{%rTWecklU zM1QttzsNuRKKe6Vi{Woq4+FNp^eE83-#n6Sf3|y{(0`cs@jZ9R{BP{J%IF^@s#QMv zv)v2#)Arev=)!`dUXP#=@MlFupz%U~tWAKk^=G@c8~&i#41WQR^=EsIds+8?&}SU? zbZY;H>9Y6N`Xjzf1HBGH2#X58@k0M-fc|Xv3d0{!HcDlY#IXKs&myD$6rw2d(VywM z4S(2Q_CNLd3(X$>tf=vb+#QTVf>+Asg1Ki0g!+2xn*USaryCKLVHo-0NE zU+JSi({&sEcuraW==C*_s@K|NMd9;0=#RBFaJK$z_q+q${0|vHj>|9GGrvdIKZO(_ ze_3k%!*nf%KgyQWU$5)Y(%{dEYQOwf_7BjX?cO&?{n?&PMt{^PO+NZFUEu_6ACnD| z>Sfw~wFcxLwtKtb55}34U$*Bwqkjp-o9ClH(`Elu>yP(hvi=OKbxedL2Y*%+KCgrQ zv8D;m&OdDT3d0{XkP+lK|FAt*82#fEVTF(WOxG>+XC9ED*H39_@MlG}U;aaXtfhjp z^=G^19pvW!O!Q}aM*pbue}s5PpYh56M(;kuAAJ*-l&mPQUI+c# z4a(M^?Vf$u;PhvEDzda^i4AJ@v!}wf37(< z1AUHMIyZyUm(R`M^F%5F_y?W4!u{?s;@pgUIyZy)^SLp6o=CUgFWYylT$7K%`ZIqO zmc~Auu6a`iXCLMt5%!7r*oV&(X$jyTWFPJqPZ0K*;A0;?Poz)qm-fNBIY0X_|AFko z`KEB{;OxWv^Mrl!eC)&dragdvkbQXEnJes5=wlzwH`#}{`b+y@)t;YynEycb;e1me z_)C7apYtd4&lmQ|_puM>o9+PqLH5Zu7u@>(BfLvJdB* z7QtWgv;8*z0%4y5ANz2==?mZ=WFPML6$<;5_}GW@O<|$GeXwFtJ_GB|{0FiR=bLuH zU-Gm4Hvg!wPt?agoNsb!T>T}_Ap3CtbGookm5+Tm-_!~IvV38^q?E_{Gk+D9rhd*e z->?in{^(6?(43a;;Hv>=TABBgU&7bw|8zg^zZw8*=KLs9gHhYj^QPm^diRL;` z7yL1yz^iN7K71}&k2w#nwbs=~TQcMSbjOmdVHm9iwa(*sJnr4sd?Kk=Od$7tXRL8L z!sE3aD$La;?FqmaoZxT2wg5bzzhLvvKGB~~T>yT006tpm&!;^ApL3Ewy{+H+`}G$1 zzqCM;$)~;MT6nU~w;kr1drJCz+-$=8%(duLP2Xv*k<+~KTg-jGxfcIShj*E4(77T1 zmo{22`~SZd2x=Gp*PbZd`u>Hati8UU^?zf;jc-1G+mwyaPj92mGkDj8xyj}Oz2_4F z-SMFusSw7;aewA+p5QbzM@;(W-hK4Sy-t{xH!>0m{oBaFJiHv|=qS`Xq&00p z{S;#;2M~-(iHY$1;{yT`R1|5&wer= za>hqBHRQ-~iNF#gYnKe_rBpB&lw%vhcIyrY zyi*D}+Zj11r=Is1ia5)`n!bVh!z>5;(WKj>{OBtmtLfeXa(*J@c;08I2w4u+-f@3M z@{oR(^QcvI{NvICPupqq=T||_AwrIPuc7&5IanjX{Uym;`dLmtPoS8<&En_p_UUhq z_zUFB6mt0egUch!!Mi^0kGXiSkL5I5gV+UszPb7KFD|(pa$1BO&wDJzD$Bt;IqvUy zxx05PXC4Zna2I{J=!#>$sA-3syM!EG=jD=SIau2^P=Au;d}7IQ9w_`({L)R1fShh2 zhu8B-IatHU{Zbe2^|74cCLgr?V~T1!r`&SOz1Pfr^C`&rRLJ3VcP^JK2Wt(v-|OPN zK9-Y%g-XJ0dgPqT-fTHboeP>fNe4J|;dyeGG|R!7I__7yc(0G;WZ}h?a5voF{mp&7 z*YAzznJDCV=Cc)jmV>op+;0~wJYJSF#pJg-)9=6N!&}16UUxf?Qzhkybv&9;mZR3_ zSmOeZ5V~PG|FrT!<)NEjdE(B0`WkYs7jk%AiOVO;!CD#~Z@74`kL9$Om)PyM>vQ*C zdgZxU|NNq8Jmho}Q zDyJle$4i2R$IEhdvh4QqXYb4!`^`T}AZPQ*Ito)VP_H7;^HX%S-BkYGdC)VCK$MpncNLOO!-`O5A4F3E& zuRW6C5&v^yvlE&g&jh=zTj#_!q&Xp0TPF7`ecpDK-S1BS;;D^qaW%wT9Gs%@oSTFWzI(#h)1UqI zTQ}B2Dvmy7htBU3vaq()J?Co5-O;VIRT1HJ6HC!}WFgnNvOZdR{*`X54^1pZqy1!S zcG?;vJeaZK>>$*iVW))2Jy%3Re3X6U2BajO8j`S&WOIVy1W4B{2#`@6x4V0je`VzIk>X% zO!c8(I=-QHRwX_sj1M&*Gdod#W>KP^PRyXs>z2`{pJ(Ij4HHV=O`fd3Ic&bKd>DV= z*$tUqK_^qhWx#P~HZ&%xr&m@dCN|LLofGg8Lws17z64!gTX&||!|$tG@~i>>(BvL{ z4@=&NFOlNelaHO`sWIv}i>gF5K2lBjeFK%={S9t?FZa=NyTbeE`MmhTvjqJh6BYa1 zQMbV{|KvIrvp%5TtP=(e*BQum87){{8(8&eC9q98e#_F@LrXuW#ru{6WL@HvG0j zd4}V4*V(V=b@Dn&x54RVR z2m4unwr8PPCx-VSg|tqL`SUtnUO(4k)^SPOgC}Zz=8db(ze=nVYoc{x%%9is^7^@a z(SPDT6ZoNhz?GfNzgVnuEB4W!*S9Tv$3K6fC1KvUGJj6D5~2S^KKk?ew$*~a)E{k5 zI{qq*8mua;Q_L=K{RVfnIGDUxvE4oyFU&of8uDwNF#{FP!Z#n*o%XVoi``z=oBO{^E zgvlCLH*noT=Mo07CFWJL}Hd40T!$bD9T;78u-i zjV|AIKdtxY-sfTl1*Sb_doZ4_k#qdxg(Cj*Hl1@cJ)Q}6TbJf-szaspEuRWHhqRu4 z?l*m4tDyOs!nxWWJYQ4SsP8$yAub%oP}1dYrRQtwXsj813X7iW)sT?^9<}jY*k==UJu$fs~>Xer0D`(T&AOS9H8||KQL0hxzlk zHs6ewJ1+LuKmLpTK6tD!-W|lh`$4>8%kRScS9jZxr2aXDy1$t7pnks*G3(DbH!?qO zUS+I%?KR_0#OtMTC+pASW**<=%-8xOZ%JqG4|bw5RQoaRL=J~z{%n69Zx#vra7oZH zy#FXua6ArHH#F`kP#%{*k9&AuK#$SikPYgB#@}ul?cvp;U7`YWl;dIV*hTYmjIEKlZ)_K9ZtZzlU8g za#14)1VkKg!GP=<-T@J2d4`7&mjwc%laOSYz-}@mSqO+QD~h>@8WA-rXhg2Y=Z%P% zi~PBRpoWJU6}b@+BLe0kVno#V!hfBv^L3rB>6&!1JGn7*<(H{`RGq3i_4>Y3)!nnX z{>Q`pVRP|t#+qNA=M2oZyuia~udedA^y~_6UvK`n?!V29I}Um4rGAi+LRdfdE5k4K zy|$~j@oI1T{iE+!jg7|exNh%R0+KB1cUv0g+T(WPkHY0bwkCOehdyu}e(pWd@w{|2 z&K=&Q!&8|^Z%Ya1wyL-4Z%}_73hic<-{rL_%o`8y*1uEh1$eiK=V7!v=-am`;6(XT zFVc9o&Z-AmDgH(TWM}`8voTjInL8qR>$p- z+9%0GJpiXt`}P-tdU{*BdpG83@nu7Y0;^qZ?dn#5Q^)#EdzLsA{RTJ{e17EpB0LG2 zgCiV?x`TY+B;eEhX5bi-k9voE;8d);(F+;+FTs>aZ4X~`N3TC0rddK1@(y= zmhURR70h`$#yGBl=hNrj)8~inyC&RTZdGlJ+CI&VZ(n)U!{y`u1{n`(P^%2}pN8`BMdv*Awh~w5N1h-xxw2e@rq z=pXH}RFc_W0X*r4QH=%o4f28C#u+y^emq(~QE6D$BJo?5HBJD($#K+@Q;}2Gd~4$- z*{=w{+5KvB@mrIn4;Ox$Egw)4@LN!yxMBIO@>{{2r*)suc&3`?)2RpbdUO5t;r22r z>~O#O_WOQv#T@N$way&q8iC&*c zv%VJ+ztxpuGyT7aifZwQnhwN{i?UxAn7TDh!Km%foKty>xmtJGy}$4M;%ciF<&kwJ6s>PL*O{n18^L*?+}jb^`FAauJ2MGKNki$?E9;c zL2of=js?I)_)~B|3~a} zK}Y-5qknOw^PIqQ&nY|y`M`6)O*1TizIcw>9XZH{et_d9g#OV!b&T*Y)>DBm{ksCs zK|b&t>~MV}(fSEXk35USbC2B@9xs6BZ3|y?&A&FDll_bEoZY`R7tbAFjh`+& zH(NfS9^kp4K5@hHUFElexleD<_P7D&e_wh3MnCM>=fdr!@jF;geX;kG2iqUN_ip{n zvs-ZZ&c5N(k~89|3Nmi-eR1}<2EE!D$Z`K`{#v-)2v_sf=<8lO8qbXm>+n=28Z(yC zzPMhmQz1CQZ!PL*qnD3?;~GA%^#L3QT#fbyJ%0@c?AN?XD$aomF^={;aNC-hs2Y0sGs)06Bqp-O`lV`noD|KmXav) zMM{!(2e40`Ubj0XxRT~89ehPUYeFY@-1tRmC<#A(LSx6WR0GE-^=Mq7bf^zd9w`45 zhvql={0Ti@{tESPzq3MJn$^j9l*Z@`_cQ8$l=cX>GvHL}zei=Wy_e?O)ypT=b!EG| zx_YynYPVk|bKn{BhQ79%Up#SQXGd>G%leMX+D|{Fqo=n)yT z!%on2y9n<~ivL5nmii1i$OkS2UT*qNBVV^E9X`%4$wz;KeBfq}@p#QQjeIHdtu51! zAM%qAgr2pR_w)3b)aW}AMYt<=utqYK*ytp@vQO(HIqmMqPV^{vcEA0HE-HeL%i4oMKVvdl1=+nQWcm+lu$Oo^0 zeYpOP==NhIyN~Ea2e@nR*ZkJ|!}A!8YbraQoaYgDOZv69%)dM`9|J6B2J#qZyYOYX zahAq!dz?jDuO0c+)jjJz_+F~NhmO%#X+9W?;KS5s=j#so=%2RV_UiWgc1)|W@>nf} z((HRA{JcHQnBy^?)At^;<7t_Xee>)SZh!oNJ1CvKIUQ;wP2UN>FH@zHI_be>Ue*2f zbu9y&Y?PRX)QKwe=3;u-i+97gi=WKs^{5riqx8}BRzdB5HW~x`RxgLAl%b)m@njoTa zpPhm}e_izD;3~4Xr;a6X|U!@yT|@ zA}^lf{*FP`2l!->aU0qjtJ#158ji^ydYR^vgO>hjZXw6r%*&0M_8QejmpY#W9w>fD z@6YvE-wVkn2T>WiYSeEjpM+gF2oicT0L^!1UEnR});_9xPwD>LFR73en%rVq7Z~7n zNbS?dw_Fe4Tdz^qvpu=4jqBSa6>9IixTCwPQ@`Vm%7k@+x;ss~miz|&2mA(hvxa*_ zcoH-RNBjeI2>HO*z||8D{t+h`l8^d_eDIrk#y?fxj?Vw@u6yK~SFao zL;u=b9M@otpRRR*+42GP0DlGbi5r&hD!&!Xc{v&Ti4wf6~!7Zn~)Tw-j+)hmYfEXGe#>(<86e z2fEe&2DMVqtNztXX4Os*S~F<#R}bX7qn!Ic?$Y`K&gJmmV|i zTjD+RBj7#o+VuBDc$O8{lXwjBfoFj8#vFJoP8uX1?EvzD_i7kNPCD{G@bi2TRFd%&N5%Bt}I??FEB zUSOvkpLhL6;=Ri^hQ|%yJvpwrbiO68yXI#b@5z4V?*rlS4*hI%@!kWLK3sTjwtPT0 zzQuXVyA{GC)R$GeLb}wIUUj8Q zotxdg?&q|c@7MYPzU$-p3hfX2-vbBikG@3XyJo9CY3d{U3o zW85AW65nM?v0KS=S`iq~xxcp@zPnkq56qj3$&S~=?GX45^?-SY+PB1aZS9@(fsXa+ zeM$5MjrC~$z;!b}H0@gAI`kjlI`G{3pNa4g7Sku(g*t?M;1=MyA;v{9MTUY&+z9!= zbybWPXB_#z|M&;r_n#mB$cI7##mNeR>sBaS2l>Etz)ww&X#LC=*HOD82l>zs@Z6xt zKia2`5&nf84>;4mD{vj;1J}WRS2H>9`i;bOoi~QZ3*b6Ao`!Q?nKRcsY~woFzX;da z{cCe^-JO;`T)1wwd_YUUbwPdNhUL4;Zv}In4l%CF@x0pkIgRUve;jTv@BKP(-Alc? z{b#=SuCIFDZ0|sliLR0-5yvEpcIa*C^;mmcbLq1d{qI-dawDswuKtsb#&yL9wHzuF zjTuX6J(h6YI)&&qDhx+&zBEs4WxXDCrA^uQy43Y9wez>vKkii5CE9c2y~dwty#epx zJ*8-usE-q^fq4AI8t?U4^|T8|0K`Z?Wa_u=>e9Bn)bSp@zmeQEpV#B}D7Vvv#Cx}% zr1M~YOYM0B&E~E?Dz)b+YU%f_A2;r@T3f|R*KNmC7@C{NX}l-p&>j61I%-bQa%gpG zSxU;$-?x);C@0HO^e!Z_%{}+*(dw5Z%KYfvx(}+WnBS{{ox$cxns+H4pu&-(@AmoY zy54E}f+`JNQD5>qh%czMTPmab>v}&t?AtFhX zVPbunWBFl1d$PClV^JQA(>Yc<&iE3AQG1ugPHt+4=KFs-7-ChE>Xf4};T_L3nyPO) z(#;4*(MSgMb;3zhbJ*`pvhbb09n`VC*O|r%sz3T}-tOw3KI5{7`rlLiuTcMcssGJ! z5|7Ya*TCZtrAv86KLp;V@vU?RGhXHIKh;OOpF6s;UHRUQu1@u(RQ;?UU(I)SboQ=u z-0W#>=`{CN1YggyH%ymH&U}&2+GSlX(oxydbZ$@Y?donhzddu*{zs{e+Ojy|jAt^3 zWe&=oyjpG5o;7BuR6#_pG-}DzCaNAckW1NJ1@S;h!Q`P<^I{){c{_AJH@o&3-QOdKA(=~O?=+}@BUIhM8^K&Dg zyR9uopJz%hXKJdC9^=c95B-1-^$GbH$4e!d_mF|7)iST6k*8MiI><-<5pIIz(+Di{ zujc}t5*=@q(Z}+a_Gh^Ak9w_t)aWNp{-MuE#}i^b z@YkqpAj7k{cA8P=uaCMYu8}O7SB>3h`4;&uppE;|W4gQ|Y5%Z^=SS$nzCY<2 zU(?Zcqsb?={-{jUKbMl-DEwW(tg;j7eP6ACmB`qLT>HK9zt;MJeF)z#Li>aM561!f z#dm7^(6Ch>#AnF?8)T+T`=#|jyUi|j`w(!}b(>oK=fo$tJsSJa@``^aaJj0CFrF#3 z4`IDY*B*Weq0&FO@H60aRogbGSG}ltlX@)~9Z3rfm3>+2OX?Rg%nBjd2FPi9jQj>5 z^;FlFRQxD@I#eENW0VH$5@dlPegbTy4xLWU8#LzSxSdk_CE2Ja*bk`vJHG!1vqDdH zV~^Sw#veG$=DXW_{7>GinDjirR=(WyGp0XCzKnhcz6?8i-*Y0oFDd>H@mZ>Sa*z)` z0vIRNj};QHUOkJ0%*ZO0pnyL|p_AxO>oXU1@L|D!%^_rJ}> zkGopqZ`68XoP0nA@pHOop$x3bTlrUp4R$X ziny@NyHxE8%PJJOUab>m)rw)K`tJ>`7`pIa;rCiEz=K0PU!mPW?{CBb`=bSo2S=@X zu<>Byv!>lfwbd629=!FvdYqo(cDRsu@bN=t$Ag#GS{3Y{(hLa8Sri_mdo&1WYcCy@ z;=vJh6*H;9gS1XWZn5COK5nPLgQzFqL2CcmY}=)s+1~X%{zkH_dNJhs^IBRj1Wu%{ zxI_m~ae)WNXH0*Pco6*#co6)#_Maj=DQpgo@EX-UImidz0S=rIcx^s-5bXx?fd^|D zXHGftzsEI8xdiFOL2>Ub}S7 z-!>nU{g3dV-T#oiOK!UB`G>qCzegB%yW{j#qCAB&w4EQ}$e$^et1%ris27g7xw!KP zYn*rC&e_U4#^VHysq|m}Lv25U-eFHe{t=Fg;USz${|Gmm54?(W?C=weR|gn3)I6i{ z>hNE~?W68|gIDitz3YGPYM&ck-QP~wI-d=%PF_4eylRiXE!N#lJKTNwN zylS`A7Ybf|?ioFg401bMNWA*MVYB1a;y$Qp>C<@s!oaJw+)ja4QBTo$wM}goDvMXc z0emfL`{lqgfltJH&e89HSHbJ6ULwNFs)=z-c$Mm&9OMI!0jCZ#-lH({!K-LDkPp0C z&p3F@k^kpzJZ_(B-u0dPDBUR6EAVPB?Kk0Z33wH_aQJ0g2CqUs^aGrl6ZtQPet=hj zpZzikybAfitFT)RZ$Iz)jl`?_S>p`wsvL)-^gY*Wxvk>m+ckgNcvbd4!mD=wL;ha= z(|w-V(=l)uE!&*N`ZtHM+`Q-~!onn31G8=XX>m#_I zj>fM|+vxCACd%VdT8D>ywMVVL)7pC++&abj0B)^buJwcV27TU*1NNJ**SNLH(tn!o z6Za)I`XW<5ZC97J(WQ=Cv9Nfwb&N+v!&|L0{MQh{aC=AD1 ztJ9*H))lLUq9{jU5KE^;^O!5vo)kqn3KO;#6DD7lqM}oKJ?w&O)F4Zvg47}Hz+IMl zT>S#U>!&B=b0P|$%qoWv@v_vUkh85{dUe6ukA9S^^3p1Yk`d8FbA^RWbU)Q6u|CML{4oCU=lBYFss>wg z7xo;YACsYRd|9eMH%c7Uq~8OSPwkBApK6n8g7S;~8Dyi`Uj4s9{nNffdinV->Yw(8 zyh{D!xskLw-b4MrM*Xi)|9h+d*Q$S_eEX{Z{nY@q&;4X*XlwKZ#x$(k4M>+`kk-5WYOTYB5Q;JFbi7@iEV zFXJ&2x-O*n4~F`h~B?C(V!dqWskQ#+vfT=I^XY0N2D)sE5S z$vdu3IId@yH_s{Yh`_KHxOj3zlr4H`U_~^4FNb3YOW8OEnR@XPhh4epV^`fz{qfl2 z^i{$=wJ$BzJI#Ufb%#HA^MCJg;Ke6UI%`Ba{SoQVTfgHK^HjPv!g8zGhg{$rv^V$!pQye0SWBH?u99q-B4(z)l*>E55YSAA9_BjYp+1!&hcYZ}>}koI`$UkJ95&^MT=g9@97T zc*yp&^;>8Cglb3P92kl5hZC5KsdgB!jKRu}VWjI&vGgt*&Azq_yD9N+iZ)D_exs7$1{rD(tH zP$MI~OZzfq$L+S>u;bbO!^~gzz|M|JVPpKWZ@p#;Wzv`GZYgaU# zxSGx>kti!^Hrv;cZP76(jIy!mSY_?Fek?Ze(d>&@$M|WHjnf83+{u@-`k*;nBW5=r7dU=rlk^Q6P z&DGA=ypxgNTxH}}9k6BOE5nJGVLPR_m66}Ph2*EVH}ccVjr`FqBtO5ik)MCDkzak_ zmeEf^*>0hq!nQ_!ZVSmDP_|phANV&Tzqp0u4=LL%zLQCc4At1kURp38q# z&pZF)>Yl-CDV-ZdIwKM3P@i?xr%S%e{^LFS8~?dW%-_>&{~2fAS6{E~HIsZk!ROO_ zUO0^HIs0gRG#;+ctNGk}gFa95`3Rra@p<17`hJGbYu>2O8~MD*=goXRaHPJU=kv@_ z`n$`iJ~^>h3o_Um4(_n8y6B$v&$gx>?G zFRSbRO9gv+H=dVWr#A80p(a`04Es6uExGaw?VMhO+>%h9mwBCTC(Y~^XP2LC?N;BK zSL@BXT(hJT3a#vfoX!~gY4)x1^ya$N7woewy}d21IcGX0p%ky%PnV~b{eiOb+uGyE zH=)$~!XTIZX|6PkF+(k7)^tLlm7RE%E>D{MzUcHy zT1;d*C85-sD9bIdKUG$~X))#Gn^5X`IF>uceywgU!S98>4XacAuJ;b~4p5^HS+>p# z?x$a`%U{KQhVKC1ZBX{Fi`BXTtsbfSI7bBibZ=A!A zuy2=B=W(O|6_gJD%XczW)xYa>Ij0@zmd2NkU`jeu^)r`VigT{S)n0Z4u8;L_oMr?4|UjD=c+zb>yOGrdRt2CT<5DVOwbo%+tfQ@=$jHf>TR~P zAD~rzC00JOpo;Ce*1LvSKUnV?<$i(oM{&tz{9p4^^(npH)oj%V46j)4%GaCr8`Wl) z`g#|w%#eHMH_!CfyQ)~$3@x}f-!a+Uh0l_V+=jS(ahd)3up zStrMF8XE_>J(Da-1NDjZn2fp>y*InFEAOrF_xtx;x*@1rRfNzn?iGK`6N5ss>`R=Py0&MdJEM{ zzuH#{{a`;2_QOuG{L&s#UOwH;sP!)DCFCF<>uK1}+i-%>SGYInc;$Y5`5XZ9v7Uzg z^20)YIa#iIww?dF+r#4>^>fmpoDW>G7Ua4EUzF?bv`%67_hD|wBivu$5ACJ-N`dzS zqkV6sWKf@=zHp=(h-fS#hq0c<19J9$KGGjKdmedSUk>3-dz^~OcaFDiHTTbyM z6*8us(S`4*glRmbx%;F~Y5xFzFGv_C9xYEj`-$Olf9&kaEW#xk6j^9LBGW>jMsP&gIxfm89^ z6J#8r8#Yd3`Gg~>SCNB!;8g7QsulGc?tMC5xnGhGCJ6b!sUGYM^Q>Q_Yva^`Tf*Zb z&D(@i<@|xT{}(>?-@EWhxp9H;i9Ig3aHTy@MBz$%+=-G89UMIqo*z17~EyyLvn#R}r^DdqJ|?++k%k@h_AHh#b3?Z5TwHPif5sD8b}pYhMJ zzdYY_gkQf+@6hQKC$v9w%>3pDWTR64zh?c;zE0Y-yZ$a1^tSF`J@HJP8m|BSQ~*8S zk?phX>f>Mak$Y)h+Z%lJgxGHX5ce(r4!r|I@=Th&$p$!Ihw(zrcO)xw2bb%)M?>wi zhUZ0FA4q@XEn$7&I)OWC)5F$eT63BX51x6Zzc1+w)z{W~C;Gi@fA1jm)~Qu$WnjJf zgKK=deonA>nf7S_q`o$BhL(5g8eKmFZ_?+eFT_8c%2`Hzmk{<8x<-!FXL7BN)790@ zcDiJJ*+dc8kv8bP0joMTZtIOH(EbL06jmeMa(`NL7N_|7-}!Pd z&(d=*u73Tra7+pF10_0@x?%&E=SX6wcNq;jr?-?x9|D(CpDkbJWuPS zkPrJ4)&pkZ%FmRRh;RVm19FfL{Qw8n3;7yJ>G1Y1*$v5s>|yG;J-9&rrCL9Qg0AP$ zoY4=$#_=!sC+R<3Bs_A#4~+hYSbpO*T7FGOJo(6fKjYf*8B@RGV@CcA%da2Sa{GjQ zyAEYJZ27j`W|;ABwZOsDwgQ}aj!v)U9p=3llpc`hV57c|_?dO>ExoJi>Il>E?u)ke z^ERHp;&jRt#Z>z-1oou5)laXQQs9V9WCY#)|1eTiPp0;^_w}yW(5Y_w_;^_=j7~|; zhV~7u8}bx_!lacPiBu^C{Y^!*v1Ps`TB1*qxhw@7PI9)AVSMCC+6b3IhoR8A)Fhu$ zqxv9;q+>iAYvWpVD{#aUvRMV1vs{vF_QW?ep0;Lf_SoZ2KW5E|jcZR^lRfj8HD{c< z_QW?GxBo%tSAhV>LGD~#Z{zIS!Cd^x4riZBI~sA4T5dn2KjL3#C$O(0{uRr9de%3q zx9%ejHGG`DO1eV7KseGSje)Z{^m{wpo1c2!_Rm!9_3+kd&-*Wt&g8h(hYUaZr`glV z-4KrV2n(369_)IVZ$03<$}T+=*`83~`Q!U+PpHp^%VXOUR-L=m!(>l5BBnjzP^r*} z<4V~R!}RwV{UB@{zgO4;dX+r@@?j6CI$O(~iYcEs54l0cWfQ_4Frn-LkPmx6 zj^#I8YVvQ_p_ZtBZTYr6V21H)v%s;$Re=+$FVN|@>;Y5F`aa?>Mtea1Qmu=BeS3f^ z$riE)^sU$R=CTL4_>tD6``6~d_1u174?sJy?Ewcrz30jMuX^tk*#jOGJRSYQq?qz( z44loO-yocer^n5ot*`m&2fP&d8{v5a`z?@P@cAH|wf~~_)p~!xIP=3p4$-4zRhJnT zNY+aAFZTyL@aw;QpWdzc#+ZD*o`jTfmE!Yq{HNrh2hZa3GZ*XfLLYWk2i_jmM{wW4 z=j&O2TZ+%mY}Dz4&!fIkU&zma{(%|ENB$!opC9M)Q}o5m=l56n+vJx~|4?g9_6G=s zB!`Ix5)C98aA;tN_XVWcCyY-2DaGd-)P(-V&E)fh3n=M?&+G3$O8O4Foy zoaT3OkPrO;$BkTV@*juKOZ$T4^MQQk^H|rf>o@XsPU8JuA^7|iiqAtn_&nD22V%+x z-_Ei9Vp8z=NyX9&6F8Q}3E;#@wi~$k{Agb55%DX_ z=eHL{i@mHLp;e4iG&30L9ZGA3Pm= zcsj29Olh&?x;x}UKfrNyLOwWDsU)-RF6{=Arw8(xr(?Z+RMGy{!Q`Axk~YGIbKuxnIChx zEdHJ5aUJ@w^E&bIus(wON?lR=-kVu}TZ(_DKdjRS|DND^9rcC$oZ%msk$3W|@%Z-) z%ctmznSay!u{QZ-)IZc(H)oxkY)JO=M#*#ZLcz&lqJcyMOGX3f9)8~u`-E$JY@_)1 zz3OA5Rh!Ab2^WyE68^3EcUn9TDfu_%Z}3a-?#6lYzk=Z31;xK1AN(75b>`a!#~74Q z+Pv+1^@4xbEB+1n;NN++8;pK7ruAdkPrTi_3??A@{#`m#--DOe@`p^4f){TSRbGG zuF1b$hcf53e4BqyGk$FnIF|S~aAMWRbUH5nJ^2BBAMq>8zxm@RegWh0Zwi|6!xOKG zeh!}6BHEaXe^Y(KE#!0Xg!A<}c{Y1YwkO}-+Oe*qHJfYcY+K*nJv$qZjD>=f@drMk z>(#~2UHqwxNdK12&+E8-fuExt+5CL{Yku_C3%CBqr)Un_Uhs4D8L7O zS{`^j>J#;a{P?d2@v)e`GV!1BczhA%SJ4(TkAI`e-zF4R`P5oBhsV=zY|J2}XQet_eOUpMl>v2={^FLK6pIV&xc~lNB;31!ZE?)#}to;eDL@J*Ds!9r`(p)zb)V9@uQ4i(*nm5j|Wa1 zAJ%$u@%Z6S>HCOZSsuST6_;In9)A?aaPfF*i)dpm9#8cRw~#!Za6Wi^>&EWx_RijH zdtYmNzE^$YJr0d8jf7&9^_zG+bMbi3!Jog{ zGTm@D@%a4(k4L{T>83myBWH8yR|x0g@w4R*@k{hIU;R9$zu#u(59#Ds?f~=rn%C-< zTl{i(JX@_INFM*{Cnuk$XW4g)$>Wbef)2k@JYJ6blysm6YdwC1=LhJ+&Su~3VSNPm zmAayM{50!tOY!)TTXp*2@vz6BzL1|*|G*xyZ+l>UjwzfTQ@yKN?qCtN_vOL)BI@x^Z%+#q>8 z=5O#+@b^iQtm5&I4;~M`-1ME8 z@-wAr(mYP{J2}XQet_c!#eM>CEFB~K3!WJf3jAlgDRUyE^IJ{PW`TL1YxG ztY63Dn~T@G_*7Y;>ZZ->i`?G8>(MU3>ml!!wLRl^{4QHXy#6%7>w|uTfNGwjF>^MD zevEJ~ULQAqw!Y@AALjLT{*cd^TlD&T6R+DJ`#Rl{2mhZLpDFCo>R-%}WfIjRzHr^N3M{r-MD~i{TvHrFcukXJ{rw?9_ z{S~M$gDG&7&iu&-N*Jm61|^iHV&6MS@cNS!uZMi_`U3OMvByn$Z5c9^R7RfZW8(D;#RK`!4{%&TeE$iY zt5lNNXD{sxlGh{u4b1DYF5mxz$$ykw*R@BP*QZs0M-{J!eDHd#%V&NVPd<1z>@hQ9 zeSSu*&qF?Veeirc^B>A*IsM!6ZC>AWr_N_l;8^1Iz=`=Wec#3F8~!^Szp}jkwNzYo z@p*j%$8hm_YKv%NE?%Ez8RRV_uP2-jUf&{3Qc3vk zTpX~Uzg6@4AuIo=J8i2`b@>BR-%)k^LcwVm$8Xy4M>}4tDsGVLG1J<$A+J6oO6^jA z2bC0zae-o~`9yyQ^?-~r+0&IAt{kFH{MH?OEA=1>Lsx?^2b(K&eJ}c9r}HFxkiJ6g zijJrbDJL{nZ=?RnmL$hTs_QzgUpl7ml%iZ17pdLM`U;e6_S7>@Ii>W2rQVhDi={fy z+J-YuJvn>q>b0wtWEv~B^7A_NBh$_Z=kn0&p*;h~0pCtPWWxJ`V*b##J~Lijk@ggi zerI_gKeM0Se>(l|+8_Dsn>>6?2z?<=63-Kk^U_6n!|n45$07f~aafm`nkP;~9&Eg| z#%h}u4^2FT=<38X+1P?z09@UO#V#oe|zZu3y=T72im_vZSV#$pUU+?q&XO4 zK7~FJ2mW01hj?~5aXqdN{Z#R|J6far;NXMd_F1bsCG|@hLod7Om-jrTj&;a*DPb?D zD>TWXI^WXsq}|T~{af?oB=<+?!_H^JL|7leeU)*tf7|oq80(M9M0(rYd9vvzI(^KO zcwY|c3;Ed-2kei2P0y3nR{l|U7#r%ucobE~FSL1bw_Wr+S>$?*GfzVGRNt~cldhXs zzjRDGhg{54RByA-HqqEr&NpZmm~Vg+tAt%bB^BGzn3nM}#by;_knAe_o+j8;U{9Ia zbh1C+G|eWtF&vb^OKL%?D^(_nsEJ6oeXxOJu_-vKBvdTL^#iV<5 zOd&RUtzNf^bFSB9q3gD*X?~;k z2O5m+pE!Rq&O7?XmR>h5@;qUW7j+ME`Hiejx+SW6g7`qBX?;Y5LNXl2$vRV7Yi8mzc z$wHyYVWNRV14~u|#mlGt`LK?CvboTI>d|ezi}s*m(J9uUgMb z;KPd*2W{^BT-ANNudjTD?N(>%c{tDW=Ul&MKJb)|PnxIsvxN?n!~70j1iL`(JndM6 z&nd2==3SbP2k%)P$OkX#drs$LY&V0esU^6aeXmihH#e&FX5=61%~;o+;B-i?EkmZ2 z%E&W)OzX|~{to0rKfr%ALOx*wmjfM<>)&#{Igrom&DcLa_(xM;F4yt=+xZ zj;`~v>o#__My@Wj-x-odk6 z{HwgwuziBKWYw>AJHk3M+7s+lkhj&ci9OG_<`-34r#xzIR65xi82#!TqRzZCI)CPjfbXc; zav>i+@`d`FYkg&Ev_5joQ+K~bTNN@->-s`E^d30d-axxUF7d5f2<7%yyKnh-DrIkw z^9&_azeBXWp^E3D++V`wMz%+0qOa4y5@m1bXZ=;$-q7#|oiErMrWmK79+7{oe>0O0 z+#k>0Fv;>s&SJJVknL*|3afk??+J&j>e!HPZCOtyo50DhclZ~#st&C@(={5W5_^NM zo#ZFcK%#-Au7NA{_t_fwd+IcA`E%FzxAlIyC(ZLTcg(}yzD=R-!nkLP|dTq)JEeXXDF^d~mf=NoN1Kv`Ih=h%1NxV4cVCD(Or zPqqgT9@taa10Wyv0PI&9i76j^y$|*eVGr<>Jpl4y4;cNG&UXXzbjoKr{oC?wdqB-^ zb-OJHd`k8J;Jj(JKe+4xRnLUuSJoaNky<=^z`AwoH}>R6OT<^w3J1!SDdLOEQq&gF z#$5IQs&BZ3v%xZ*cxu_V4fsfmAAs;^S z1-;H!kKp}CZ;0ocx^4A%FwDGtg8AOe?V6p>{LRculqVN&za}PcKN zp$E^}Cs5>hBmLs&@jX`+eVqn?DBhm=yVhT&dArB?25(3Gq8_1c8V}@%-+ymB-aaVi z(}cIDi@e|AAn29mJo<;Dv4+-NaGv;y1`-V<8d&Ta=x4s3i{S0GD?IO-gtz-uSf$ti zA*2a`6C`iP{0m+RzCJB@?_Ao#u;A^(inl{Pcsthbi#r&6LUWMI+4s&By!~9o+aVvk z9k@CDikR{)L*Tx9_KT zJLH46WBop}qtTB`7F`FguH*JlBY1m_;_Z+R-j4PAAtB$cLz$i}-{$S(j7#eUJ|+AD zoHx9UE{BV^7yqGgE#faa-hN4UM{m2<$iFym*CnYCZwK!Kzm#o=j$J&+4ria+ynUS8 z6L>q?jm_J4`sbl1JaK0IQ^ea}E_i#WpZkfWQZ!~E|91K~M?b>3i?_$kA9%Yh7xLjF zU(oAZ^;o@&UPm8bp8n)FH6QQ)xA6FKgi6p}N3T`au8qmZk3ohVex>-h9Oo(NK%W*L zZ{+!4q$XT$WOrug=<6;%KF<29G#?+>UgryZ9CjAeBl559A!Z~md^a8+uNCv;V&>!f ztAcJqVUScwwG=a76I&5yi(LAAB6VuJJV{KW3IMt!(?=d4i9hr}#MJgO39b zkHnRqDNU2+VVa-GK|b^Yd^WwO$$uO^F6{%7j|cLZk7NBjzrx7ZIf?gsh~VRgC_WDP z;Nw_7ACD;?d>QtWwBX}u#m6BZe7u_ZOx<24|8^b9lGyTXKHj{YmNO>sDfM;Wy!xH= zeHR~Zd`UQdW%+n`ce{M1leoyTRQRb*(#!eny{);HZeJxXK2B{BZEUfvqZ3Zo>*y#+ zWe7QVA9$m$F!AH!K_W=xq0Psexjli8qutqj{G;FO99)sUZ6)#X-2@*G^>aVPREowd zLU6P?z{MS-28!$+j1cvKJo><&Q*_n%*WHbUVh7+nswK_()52y%f-j9i^<22 zMTQ-IrTDlU=PBtxpB5jVn=Xt%=)V|A5U|>!N-e?6Ht%HKlO9D zKHm53czk?R%##TpPu9oLo)SONK%#-Aqk+lG^}hB&_9Y+x?%tkvUBbux%EtQmjKB$! zk7ND?-vke@j>*^T7BwpP_^9IJkPki%URQOX!6)VTntd-P_;^n7amWWB2OiGFm7lRo zpzY$|C$d8iix|R`qJfrwHuLI|eG4FTr@yXq^ z9ua@B@$vk|rNYNilFIOL@ILTH*@o!Y#e?i{_PNc+r@1|WkE7jyk5}EI*Mr~ow`1-) z>-Y~{L43Sc@bOST_Y+H{Xv{+X?euYueuQ%uAD=CMhz~w)%f)^8$QSfFS3TxR zUCg{ac^(}#o%o3c5)C98n41O$c>TOOVqg2twVwCUgtz+&1#cgzH#kA^cFe!vrQqvh zg7?m)W{QHh7Zq=ZeDHSgzrmwTe#|Uinv#95Q}Fgq#oHktydAiCCa(NUX_|6hJLE$@ zz-RSBejMH|?Ff>$2lAP>WBq*e7^9!k9J;TZBzXHtinl{Pcsth5YmSX4AG{iNmO8=P z>lAN?eDHRxpZ5v*b{)#x+wyJRKFqkZTHsUS?ZA13gLOGvynS##eIM~F%iCWriWcvA z^q%(K^ER&2(Om23{~FJub4e;g+dc3;@Jpd+|Io#Q>~QwE&D)2$J%P8Q-GH|v{=2_= z&M%k$xcjHX+Yb`FJ=D+rz^N3CS;#-)+dldcuDf`9-28#J+j1cvKJo><&Q*^MyYl{W zawE$#$46gxt)maK{wmGKbE|c}z{g>4K|Lb>7x)KeBp?1^JU;G;d2%uH@ztt)n^0Kg z)11CJ``YPErOEr@ghG?UL<5NimaGPf7d`F2M}CNX`g|w-)4uj~`_SA^bB99i$-Z_U z2jvjo+EeXU%Jj{5X7E+6N>b59Bi+$NKrC$bV@L-B;E! zA16GpR`GGj2Or1!d1kH2zgwEw2QbLEs$TH%dd0^fAAB6^=QHn%SHIxnkZ<$x`Zwr& z4heipd>lBh`Z#^x#m8%p2*qJMYY)Gvp0q08Fhr<+ zS&HNyd-1w_ zcSmRMI(7HNH#MHNW^MM^<4!+j&54a`Pg|2M_rkbrHd;=QWZ47oL-0#Gu!}F*;p}sp zx7TyK18+zBw0Zm6rry-?<-_*>Jn{CU1aA+G2YzCy6pd}jznwnL(cf_H;_Y$s2i|VW zg?#wP7xX$;Jr-W6dHW38g$ujr7F}~vcpN%hC1~^Zz16jyW3HpKijnOSzf!zi&Igoe zv75)giST#i8hPHRZVHzh8J#{e`nrp^H?#iY@%Eh8?$MWQTwjrMe@8C;W}Pqa_9Ej6 z)Fbkr@eeS{sPAL%zQ+IV4erCIenU>zwc3j!=F>R5z1fc){vljb>F>xT>*!&fCufNU z5)C98h^v7K-uFJjKFwSH-1X?T-lO}{JWq4S?7Tg5=u-TS-0bu7Y~PU^<#~E)K+o56 zeUJQ@z$G-FHgm;dz6TG6eV{N;p6WeozB}f9OYO&IJOMiazO&tUc|0Cz5Qon2Wx`Hy z8SS@c`LGiJe^<8}yk*PaqWhl9PC$5o9OOekz=MtF8TsIFI!5>xJXqQ-q@5s;&vpW= z*N=<*hb5Lj>lEwuowVPc^#eNr*6ZuqO#aJBME;A6HZm%xB<(8=L*u1})+Yxv_+KbKmzp&e{e%bNi zf84uu+VkGRq?Fq5*q2RvN7|Dyz8hDIbznqd|Hz4sKmP66JKs(Ah4*thG>(PF5kG7y zMPnlL#L-JU^i$k$*%#vK0rmx3F66^UzEFR2t*0_Tc4vIk^dw812a=M?-tL#P$TBy#cW?#rOLMng;hRbhRxX*Ky#pN zzoqZVO6xEsN8#unjx?OSe;(RM{6qtZ2L2T^Fvk1yo7gAJMgO!fV88uno~MybjdZi@ z3n;NKaN(EQ`|cWZ1`kNSkNFpT7Cb*cPrg|r_Y!-8jPO z{M|Sz$rfh&>ib*F_rMpSEBG${gZnPu=KGD@j==ZP-oW>pj@0Yg+wOJYGrzv*PlLq6 zKPGs1sDJy3rcyLkA^)y?p#R{$i-*saKg0(Qx8>qKeB=vyov$9jPm$g@&ofPZy5BYK zruA0MJnw>CbxW?jK;K7xT>AlbiOJVbgdm4sDZcKBd4Q6J9z2V$PhX_V+i*#^+{o_0 z#nIQP<41ijF3Fef5tyBGi}qZ@%Z`}%ctmznXf1N0sIP1ei98N z8b~xSXARU`q2Gr$Ztn+Be7$d_=k1d4bzi4=uHIw(L>DDr$NURE3Z9;h$>;2fs}_8{ zTJd$r2Vcj!Joq2QH?zDgt@Pg2g0Ek#_&Vf+uLCzXywl*Hvhp*fY0Bs7As_kyKI`9P zMb7R9$7{N6B?vD~R>^g5v9t55A6d`CLr-;M2{FOACUp z7ZhKIeDHOw%MXb4|8n}b<=cGSyHM*PC-5n8Q{cP_why@Y`m`0lvV48+>+>6y%=$c+ zWD7HP@ICNKyWP9^j~&iFxB0raQMWVjb+k9|b;Q4}f8Sf~9o_eb#Mf^Ud_B~^{lKXd zjaA4$;@dv@53alTdffbhuiJ7VA3pL0z0OsSqs+sL%+Dv8hmTwu9=BZYx7#%)4?hVR zcKDUz;c|SZqyv3gJiL$Rfr+cbRQ!~aKr zM;rUDNw%5gOH;D%T`PF_wTg#BK6p6raP4)bytWLPifi4R=4Wz{5B&h2M#=^1;JL zxPFJk^ZMoVZ_BrNc>iTOpVI=LQa=aIYkrr$@8aQoZx6?>EDxXicjCI+4H0*(n^Rjv z8*{Cj6aIr+$aVA8Dp9>|j*@I)BF=>Z?*nf{S>d~Q5bnEtn~(Q%dm??(dL`PO&BxQN zUpwv4=6$+|kAGS4@lZea6HTRP%tHSCOA$ZlN4VwU<8ku`K5ol}eE7&0^g35PreCGk z#T(ep+k3WtUtQ+k!{f^lD#2xbqGlg^tvZjpE`BmH?C>ka$K^OrN!R>>_j^r;pObIm z`5^t#aJhr*e#CLz!N&(!fARSEMz7cF@YbvUUhmQ}Ps_WXmv7|f@4(Ba7%!kcQI4bi z12dxcjmCS=U7eUO%|N_e?YXmXfnAkn~* z)j%KbW3OX=PVZ)-|CD-Oen++WDDL`rp?)boFCTxNp6he)69RY8Jc;=e^Emh`czypo z`Q`8*4Zk1$_HqyM!S8FH(fFw5SM%E!f1Tj>*C~Dv`QZ1!*P}NXJY~>GX}5Cmdz$CT zK|b^Yyf^b{BOlyL#|Zy|ze;<9+2IS zh z`)W}+@%F`E)YH}7%duSip4uYXn2X<&PT&@j-xJ=~{9czN2D{(b+p)f*_tLme!s}9j zM~*spl9N|KDGuM}_c?A);P+^EHosr}>VMnn?FSdWOYQf+nBUWJ&DYJih9sYh@jN{G zDdNEY{n%OSRvo?RA+jUZ+cwbQlhZ?5&# z&*hq6-uXaITMPO>79J;E>-uNJT-T@f?3Z(uvLnd(gwmhB{uKS5xyQqHgejhP`ajwb z`5wA~&xZ98ltm37QTyvBSby>C2;JUBuhX|BY*26BbH8=ZZATa!()oiOp>9y0qdt*e zvKvavf5T)vJ3>*+%Zu5LkUSTUnoj&g1BnI_4a`jglWad2V4tuT{gWM`T`h>65p#XN zuxcsV5#rC&bAA6_9nY_Yuj+Yw;L94P%+(&@4I7*y?GeBO;M=f6)Wqbgb}MT5gW;gTfv$sO%At4|@b~dhwQ+@-tQf>eOFf;LDH?{RFsC z$Ol&}m1Oq)OZ$klM+EZO9x=sspu*Qo{-fl&uH7K)5jQA%1mwdWfqe#(G38SqC)dRG zozcIV`W?N`$cH^*U{77Y&3`cYFIT^|eA^z8`?!`fE^sq(Z{W`HoArH{J)-Fo;rNxc zM-W?qi)W8$@9Tg$LaoQ9mEB=gTl;w%&tGvm$)UB|WvRvdoIddeZIAFv62lzPy|J^m zV?+Dg%n=^=Xv61ByCMz2x%e6GyL{UoF~jW%_6W2)+aA&Qsdq2i{{MaUZhAl8UxYm( zb4RH?qUz6j4c?Upx<2sfa6FftAa4F(CqVyqrETkVzIv=(tNF1jy_r|*eF_b!Zhzsp!v(6!<0SY)&o56GcoN6 z-u_F`o)CYYo~s=oKWgv=&6AivF^_}ig8!#u@gM8>Gz1~J;#bxV@N%7~ z{~ON^a7k;=`u0v8&1DCmwum<7+Lu5a0q*~1UjmmTh9#h_u zpc9vG+X1|<>-GXW0NM@g0MlR8eD-Jm_S;L&`t5suMs|SLH)!e9mUDN9`8?g(EruOn z>VI^)T9UH6J$0p7@bcDHAeHX52E>=<_^UaW_e$K$-V^E*iw66e-+jxRQYIr!@P(2 z7yK5yKOK`Fvbq9qTI>UuzI(X``QZOUZ_)U;P{;c&RZKI>2V#N)``*oh|KF_mKjee| z0~Z(A&Om}}8G&%Rmyu`snDznC{7eq=p&yTNTJeVlXMvmP7~x;=TWODw{6CP7_YSb# zCG%q=KP<8Q*;knV6CU`A;{T8j{*U$lp_uZK|7I?C^WV%qfad#+eDMFmTXp?59}us8 zZTU9;_r9t1kP|r7=l_iJChpPqUHbs0t@xGY|2v4viO2sH7jEzF?&_w9F8)t#5pB%H z|Ea#=7LxxHPS^VYf|A6r0L*|AL)U=7XGaD zImY~bl=<&7m-7K7UGo&%fvkN1BRp?FA9gmI z9t!ItxbNWab@%D;@%VfE^#vDypB~rgfxlzF1L_m`J=#AoGw;lu@%Vecm{;TQ_w$gT z@E3x=C;I?|!jr>91BnI_4a`9U&Abnwz&_1i{v4+G`&kEj-g{&6_mX`8oQI{x--pEd z5Y2Cx_b~s0pMtkf3jRBXYVk5+{XV1C?;#)jy>^269j^zIY%|N3rexpyg5d98Q2ZV8 z1OCqVx&ASOgKQZx6&HWU`aR@BKfq~yzclg{v~oJ|Q)y3-{5_Bl{?2xj8Igad@Q53? zi}m~46@Q2PfWNc+reB%-M~De7A^+HSF(TIQN7VW~=I=$u zr?mp75`PEI8|3{0F8)4pzb+@@SC+reef?gs-X*er&n1b$-c`ssuisbm_=WY~pn>v% zix1i1>~ovH7r8xwzoXsQ{Qa3r_WjKhYrl9c@%PJ_zf)UAKQZZ~{4vp-M<1ad;jW9n z$IYLuulec+>+*K~kWcuq7r4Sr9je#g``C`W?nBG`s6#&uk3+|(tNM;ve}BEYc4$og z-iQo2{7Uh6IUi8cRflo8ro#L9b3AWMJQ*%GvYU2XcdfrqvHs%o_cpbUzstFc-^JU9 zCv|?o+Z!hIIqDJlZ}Jb!h(Gj$c)UF$=F>R5y#)yhe<65#y-IJBNR#IN&3Uij_9}j| z?k*IX93~n_G_Z6v!0YYPZ`bSZG#}GHt-F8j5Sr&{?obGSmUVaU5NrQFYiz0U_5tkU zQ{|)i4f7u6U+_}!^}%`a#{TEbx@`YF%RR^kZy%h}yuI%^{oa34H`SEO+4n{SZy!;- z9rD53!H*|@Z*Y+D`QYurdix*Z$p^2VU|cmL*4<~+x;x~9x6g3>HvK7H{o3+v-ro1H&gZ1S zr^MTV^BN!5_g%a__p@;P%JTMIL?y*rcc%#W#Kkq$*WC%H>vi|+ z`R%>guAX(dmd>{I?dsx*Z)!Yk&D!j-$DMx6niCt>p0+02lJ8i#p=aeK9i1y%yL(sm z^tN?$Vf(!m9c6L(;DP!7HSJ7>b@3t@ChFMc@qOIBz~j*lZ63ePKkq-Zctm`c$YhWtn6fv%xn;l7K<$ITyjwJjI&;Uizr>sK*8ccvo*(jm3YQz%9sOhUb?WF* z`{M^#fARSF=I@VhoYwgRPsctA)F;YujDKKe*vzBxc={B}r|5BbdMgqX{zCBdWPM#I zJUL7>kZ2&$z#KHt$m{Ck5$o$OQNXq}CQpB%?2oVIeTt-Fn%^+*Vg3aV1wYTslP5Nc z{qc=ze>~)ar{jHVHK};}rwszojpH`K({EEe9rD4`fs6a%%Fk%I@|W!8SYL;H=m$7$ z)HC@9hmtaI3?3@&29l=-@|ma4uzjR{DOFao51wAn?-`pB^6fg5jghO;~C=RLxPuw`njKIDn(-!^6$zA z`VsECc=>GkLwxXZTQ2UyN4}ufx$1FxN3D+uwgcbx)@8ovi5aa&q;tGF(09zbIX(Ar zR7_sJ27(-ZrFgj<=PBu`HN5ZL;^o6UA3z^=Hgj7$#&ZWRul7sekJ9z{~Mm z1L_myIoCfhBYN|b@pySb%$JLqmmj9ew+V$+K8?G{`nga@a+qi!(LkaBhXy8j-F%$= zY88(DY5n|dYH&R&;pM*OsuUU`JT$V6!3C0+WBvv21RtLeyw(>K^QTGh@+QU0As@UP z{LX7M`7yJ6X(IN$I|MJkL-BIR2QLRMu6=n-`I*u*X&$EenH=OpKfr0ZY9k+CjaFmBLA?Xj0s*org%Bz zgO}sI^^Dlt__4852r)hyxiI)TC4J^~?xOn;SUp3xD{L1q3T}9F2ub-d7 zv0S{I+9KMRiG%^ErOo4BnV|X57RuZfmhlA zT|CJSXP?`AeU#f7_&VAX_&VaB^U!`z9Cy>ieZ<$l$b6mJIQkF5(XJsHD`#`)UkK;o z>v8jE>ubLHslM|Bf4;TzhkO=y(tJJ7_TYvSH7oD0GUEb;rT5L-e4W~RO-#P-f98P% zIb5aqx*Y#0>EVrBE{m@>@jL;2*x9VzF|3c^zJsq%u>KZ`uMfUV=MQ|n?nU|>^@;pm z;2)TgetfGnk>C4+{ZQAr+J7MC(Z$TyGpc->P*~+}E?=jaBH8aQ6q+0+8b~y-WHpe! z=xP5wa~}IUtCG?`@%6F8X}+hqLm~TF_Pf7O*3t7j8C)RwdNBXyR{QfSczXXl`JyNG zyL)QCJLCs^y-w!?``)R6npvLC!p^?;Ey35nrT9AJgRg@ZSMOoUYs-)+q%!hM9}{24 zWyl9#2Tp5D8~NZ;rIO6|=A`{V^7TMI^L4DBkBj_A$#q?Omiap2foBz8hkWpLte@BM zci~)ea2h^*x|A<;Umi;2bW#p7Et=(JsCowiJ+7S9P?t^tP-}@7&aH@K}~2y`e7j zT07m-*QgB>d!(4#sDBDe@9m_$w>GX+mjXvPo%woeSLeEp^EY<4XFFTetMe|&wsfC= z@qB1|w4fl#vImpQe_Z_C#hc0sRX1(^p5t~0{*Lx(^Y`mI{;>P9!b_@&zkjuaw1Y2@e5k*}Jab$^@MTl>R@Xdn3n&qsJ%hhMw1 z=J{#ng-4#HnO(jnEawar!RGm^)wKg-^8B?((BW5#=gWD6lFmKI<+6BwhUXXP!_H=U zudqIX`wpI8Wc@7^&o8`M=MOv|?E>|Q{9fiCU{vzF!RO+w%h!nccQNyP>hhaVSmkdn z&)-wYu*c&}b-E}=drFSRZ~BKL4QHw|MVu#oqJcyMi3S$C1}5{G=NH+3waPI46VJ~a zLGwM0Y-*%Sc)pK^a*VsEUM0`R{0klnexIKw&&-H*`HWhZhkWq-{y*sbhS)bx`7yIR zorRr!Z%pv~F~##CA3Ps?dXnu4B+Zr~Q*iNonxDx*KJ){emKO49?shrwSZQ~VJU@`n zJb#MqD?|G`aGWb4zP?>*Yc-#zi-ZTZ`=QZ4cz&=RFW&cFP9*X_!nkTgtjmw6b$R3; zJb#Mo7yIT(b~*jq@@<~qxQo`qsKBX&Ux4#!U!(84cz$NraQw>he0nk$E`{fCzGtckn?C9-iS>JJ4K=j)?FYf5>>fF%Y**hP;UtS ztlOjiA)br(&z3*LxAiq&{eaKg`9nGb%;&4vE-=n~K2sYW_fAt0Y(D=6b?u;-e4gw9 z{Xh>EpReY51p2V^I(bl7AHjV!AVfa@&iY#@KHvCyoj>q-*mqE$$glon zrkM!_o{h)nr&vD8S_8UtoV1 zRZ{x**X`9ya1KiNykGa&XJ0GUPb8nm{0qJc9-o;fpPUhVeukcZXFCG;Jiap~*R9Mf zU)o&ld*2s){`>U&JIe>32X7wA7#w8Fkg2%%Jk8JKARqbxPMbW+$fvp6<-k{^eL?d1 zKtA*Nakis0uQu{svZJoAVm?oJV3p$YkPkkO_4;B=`N)5Pac54f+vn7}J>-MWXZU+< z!(tzQIsM!6Z9bpgN9&V3oUE6e9!BdR1mp9kk~@p)>CXk#uu zPxTGAkbItSdMTgp>TK`p=*{-FoEPtnb@qmP!Q?}tP(rsqc(AT-7k_v0CbvX=$6mKj zAE?s-e@FWSe}}x=-uLGA<4@22g82K(_=SYj=Fy)Jj;vlZcFyL|-w@8l-{a=b*4KRX z1O9I35BZ#7{yxFu^>*iKmhRPSJtADAI&#pbtBnL&t{o5!_b;Kooy(Wc@7^f3N2JgTG^6Mo^!e;k@sgkw5=bJpMi`=GDc_ z-;Yt{+Z0qz!rz4|lEXv;i3So4l+{2p^Y#q;wC|MuiN7Cv6wUWEcPONvtjGI!XzDnF z3nYKX{0n{>@b;Me&aR{Z!QTfIe}{bV_x?}nd=&09`7yJ+Ev$LV{to%z@3|qJ@8+V(f4Ta#<=gyylJRMSz^TOF zf%8U>*6FzT`}kq{KH^uFzpoIL6Q93>bGZ0BwMDeC#m3(Wr!#-=Za=@Hhn|vW%Drx5 zXKQaqSLb||;+?XDf+G)`c${&1`-V{ zWeud6w|ngGqzX&_#NWS_q4_@H?@ArYf}!7YH*|)<1(LsG{slkvn70=N|0OwbU9;ft z&5FN6KKMJ{_cWO``7yJ6X)5-;hXsFsSn+qr2Y&}o&NRoApD9g~_&d$d+9%18e3Uczy) zpMG5Jr-yv-cf5DLDCFC9C`(|=xB2@Jhevfv6`b2*9 zdkf6WF#7j+{JufVyNj9MAFK+x358WYjo+KIzy75ve!}mCLX*Qp1BnKftOknw{`wL2 zw^Jphf8zJ`3Iyz)@O!`R!SC~oyXd0i_n3ddU%~5#1V8o##r(+$exFnP9`eEOfp7b} z3{Ek#d}$)~y-C6ECl$YkeDM2bwo6RKm7gh1ljdQXpUFW!^aGq$E9BGM?Q-C+(%vBX zeITFtJ=W!i^F}`|*-_W8V17?{;0nd>As_r6>+)3>#gmWx!yYps`2B?9_mB^MKgsL< zIU(P!Lz!<|zRm9oO*)@b0;dwc2hM9cPv3X(`~2DA_?6}NWMPDh&+i*Jii_VUjQfBYDl?`iH(h(6gz@8hA`jRqG; zo{sq!JQV!AVV*oOFL-)h@pQ-sPX}(zTxs%SX8F?QYTtWO@bo7YPltT)bnxM!xbicl zY0^AQ^D{Zfhkk(5Ca*C02Zz!z!oT35(rzGmdLW;9y2tC+%>^SrEV2CAwan8A4_vEw zI^=_=WBt7tQ$F(F&$x3^@bpQ=(;*)`9qaGuO(y?#9m*2e@@<}8o6~Xz1WqNM9^kxg zec#2?YdXU5E6dYgC5jfGr=P~LTs)oHBHEaXr-v;Bq*eJwV?y_pd4E0O^bk+aUbL~J z^}_7t(RC?AB@n|6_Ud|e@pczqnoYFL+iSVKfw!Yw+PvNS%vl%haPJ`v#M`eGydC|> zq?__+%$&`kpCO!!x5v$&t*`m&2fW?RAM!b|o96A4Y$smRpxL>1iLNh%Q?ITm;qCjV zYdgi{?dL#{!><%?m-7H6oj*GIJMrT@UqByrHv6s$>m#_YI(`&yZ)E)~6mPHQ{DZe+ zpG8ogoM8pMlrtm##PWFGof{VO>0;*Xb*glm{4(kv8kaYRx6?S1@OGilMKinnij9L@JMcO<+W>+8jL8C)QFJLX^T(txkWl3`a zkDh;LdjWVmaO=qXO@7QQZ%dO1K;L^>@b;$_Z-;#FcJSls55$z8DNU2+VVa-GK|b^Y zoYpAv4^E|Hgnz+Hr5!=?_CP-KcC4$9i~NTrmOs0Rc{|~Oo9Ov>)<1YV*466+4A+n6;_cKH(Z*c7o$4EIA=lRlr-Qf8ldB`!W&JuHzg)cB#fQoYRX1&3 zKFRF~yd3QYygc)bll}L~|Lnrnm;TR>FI!8z{PTjBqo0^`Qyz_pvpMu5gmdxo+46_@ zw!Y@7pN8xCd37E?>ffgMcK+({xN*EnP~S1ns~@1QWn%Jee2W43w*5-+Z8?5Zn!)$( zt#$GYkMq!noj>nGVSNPmRfmn@+eOyjLh{qLj(m$<}zeRz7 zOv1PQx(DBGxZdCb$+t28f=_zPv-9)hdj-L_3yN<;KKM59DBe3qnKZM!pXJbxeeYSp zx1Uvf8}h-o!E2{JY07KMkO`zR@=PDoJWTU5Imm~8fYWM)e44vm4t!Gbf62E4`FLKP z^*{V6lYf`&sOw*1zD;=GONwtpKKM4)$E$|o$w&TSADI?>ds^{r$OqrX`Z(S@M|mu# ze_OuIw;SK1^EoPTD)DXLyxI@y`!2qn=?}-REZ?R#Uc$xW+Z3AKu|>|sx2Y|njk)+X z)i>Ni@@>ND%(r{mbJ=wr>*XGyL>}j_opgiULQRX`?9`58x<%FtxHV<#)b_O1f z_6Qyhaj#za{AZqMS$Pcc@Y@9sNB==M>J>Cr&gRg+5YENJ{!B^LD!&xIezi)W`2(*e7Fi&3DFL-@F?SE(72VM_+E8nARX8F?QYTug? zyncrEzq5SsdhqA5ubA@MGGr<)UQhEgImm~8fYYjkd~hxuBm4{AD(wuC*9Y>M*N?M3 zrT;%o{=*W>pWVs4p76k(wEvy;1745y^QoBfk^g?ioil>h&(QvNmJeS4|JnN2Kh^PmGMnnw%G+#kDk)K9IiGUCU@%MQ*^SPa!yS>{ay?#r)Z71*T?#!DvZ)WGs zXJ&Sf>*tX}UHyyM-4DkUK^q;PAus(iYjq{BXV0H;>JU>t&pt!}WMiJ&|baIWI9yRBxnb zS^Q|R{qDM7*l9o2awop3>WlIGaQZd@ary@-$cL5- zrP+6O`z37;UMC&C#cK~~uJL5Fzin7m2lLww$^#|^AUs-*Tm zum{6;LEji`pZln`i^vIr&*RL{pfY~ZZ};rS%is zOIli2Z&)duJ7G0;`VS5<-eKseS2^`gx6|dU#os1pofC16blTzP zTAlUaYn)!E)>-Df2k}nD^-g%fF6Z3rz2!LX0k;YsGK#;);(WC}Taxvd`yi#<6YnW8 zHaN}5r3YLC?kqK~EJ2QvS{+SJ0%wb%&3gPj7knqEN-I}O`RB-LF;`_E+ z-SLF@$GA>F|4sZ#TwfCq|JnIwo}HKVtKx4ncg=GspZLD&B{d%Edrpsw5U-g2_PtjP zeE%x&J>?VM6Gvx$#P>P*+$XQ+ zRR(_S>Tk;|c7DIc_cETiANZc~iSKjk_32>psehZE&!{)>eLe6!G~ZHSiiP> z8{d!Uac$HX-%8u!I59J%%HfCahrg!oGktmS{o9SI3BGP$3g1gxWE=Ct_fp?HHYdK9 zalXd)jq6)`Hmq;$Uf0yq*4o`2WZ_<-F7DWS@!pH0h;F54af;H!cU1k3X=+C%-n6fm zI=69t)wfkX#QAJbHqO5-_V(}>dLF-DaQ@Q<&gb*v<{NUPuPk-&`Lg5vAbtBA<{Yr+ z$@2WXPB$RollQv)D$_(?oO(Wf^9e!iVAsoZ>w)tLes)M|{M@H;=z~YA)&1D_RDIC~ z%fYBS?tXrmH+x&a`Ghkl$cL6|KEd=el6CZTx?I+}e^~n?+QU|J>@Kf8a`(}(6k7LB zY5N76Pw2+DrxT-|c8pwFF^=(@Rd5`?d4>8PD*ZUGzI z_rDtBq_+i}S4b|g<`uNXw)A<0sm=>TjD42ox{l>a~Ki2&zpYsA- z@2|bz9jCZnKEJuz_vSr<)ltmT%l!SkpU=(7=ez*%cYjd%vHU#64~u`6gZk4x9H))_ z($$}sO{MVuCGIunDa?6+oP0em!1exyU%B$V5{sWbspkb`Jn$su1t_2M0$lGO4k(}c zC-u0q%J}{GD*S#t<#S$u>;2WEuKso%nkBI1+w%gE+mxI>W1K4U0vzW}>iG@7d4ce- zH+^~M1$H)y7JOddM4bvP8~EQ`ff777HzaM5ZOm_8z`Nr>th#x=dne;`zCYj9xu$*X zhVItJbK6^58=JbgxI`&{gFFW zKAaz5yR_#A8W&!@WM$hY&J>??fQj3U`9zg>$dNv?)WPSB@%(UmQ2lIsP1ioe?Y4f@ zb6n&0F+DH6szIUi$$OL?8BZ2mZQL%uySQIK+}=n*KD1o8-Sh*J_4uy3To!I0(f)$= zu+}YD{RFA6${K-3#2t(AJA036fHq;dlg=6-LHb%vvtq){PBm}ae;~3 z>3@k!iPt9$+&h&q?(h6?ydQq@5tqAcuk(-T_D3Agc4p)F_q}+@ z>79QIcL|RFfPv%rT;(!=-;zGG)WPSD@%(UnQ2lIsP1ioe@wR@{v;H$`KYvQkBR_Vc zLhI>Ay#3uuB(QOO4A}e^w1=&0+ml{<v<6VT=k} zu|UNF6$=!xKvLuPxTfz!TnU2XuQ*Qpz4#7{_$$9VmmLoc{lOg)gTV2WPaMy2>%`w&eOxb}CoWry=GCx)d$$XY6Hht1IJT;;&`sRj~eoe)vqnz#_;o?KM^Vr1X3C)T`ks_1sN9r)Un(YK4jS8K31K9oBfiLF2=x^}7Ag|5Nf9 zF9ycO`+MTrvVeHMiGqA+x$wT}KP2niyoZJNliJVF9=4j%XTA2w-S@%!&L36$&4u^V zPpkZh_t`F3pVYTL%ebB*`S)OWzrpasTQc6?7vCE@==Z-lzX1o+Zv7GVrpb33?0}cz+0Z zpYnE3x?50UGbic;Eoweaa`^=X!nkKf&Zvf6mWD z47?u!-lu%xeXiFh4Ec5)nkBI1+ju{v$ETBeoG;^4!TTKNwN0pU_~HHJpVWP(FE8Hr zz721F<4G`y-*@)7N5l{BOIu_c^TYd6-#j+wd-yU=H`eX(@%(ku*<>&C1lhDKgC8B& z_{I;%`{5!#dAx4p_>^u}#PMuDHjZC>$NKk9-ge5TWj%h-!0~)uC?B55k-o9i!RLwb z{BV3w{cL+p*FMDOwtmzz@>#VWU#D??+Xoa1um7jFpE(o>Y<#{1*Y*#H&sQ@;A6hPa zZua+*bKzrC~j)n5SlaP&r2fWbx@B`X@n+u=EUs3f%e9rkA)+fs&`zoYO z^XPp#7(SoW@+IAtjL-Ljej8ahQ0aeVT(G2lU81?Eqr(PKk<2l`}=U!#OL(C#Gl0F_0z_XR%)c9P+14ja%Q$F!I*Wrf) z%BTJ*t$&Sy&uf6sDWCY9>+scYboICE(A3+OZ{zdm3u?UBZ;Vp~pL3j7<*0o8@Ok7# zZ~F4$^Bs+%1z(S^)2aOMxwJ*LF+Y4R_03~*;&U0NTllfm$5cz!rNsD8G+ zrfVPKbXz~_IiYd-xSkLG?ePkYPtJ4u1BrVef{oK_aP8dzaeA`|DRPtxrso7f!Fz`V*&fKLzWP`W~8P+#Y^#G8j%D zF#PA1jMMi*`8Kk!pwbV|1gDGds^E0PpcS@afr2 zeQ%+G(-+G7?^-@_`ULUhI|9m&<>x7WSp2gblu!F`oYuC$l}`+%Qh5Iohnn*SCQi@E z*EpT)=i`R{UWvueR%)Cs6A~L&h_)Uce?r)lSutJuM#zIdQ{$j*Y+n)=lc1; z7hL&v9h&*s@@*BOV_g{Xv+z$^Gmzw{3^JBU_5tp;w5SI^EtM%e*<~@}d{zl6K zg3BK?a5Dq_5+}4lzH1zBD*>yj#;yQ)CQ#-iN zzr>Yq(Al_r4_sRr5SO=zkRnI9aJkvfOZIhR%hm7ZjC+5du0i_)+QU}0>Rn!Y5rmPw8)Gg2yZC=7upVY{dc<3(RT@MD%)jSX1$75(JMg#7AjY z2E^mevj2|n$k#7)#{=Tu==bPfY_ z)|mF(*2Qf(`FxLEuV)V}cJ=p4EPl4iST|nx>^D)o3HO_Y46H?JKjx7>-o{N#x;pQ>)#W# zBKqMWD_Y*Ey3to%w!+((4y_Yx4r) z_f}@;L(7HVO}`*n_dlh}Wv#16wEv(zY&FNCUVG&3`{4HhZNFgnedfOh7vDqaM;t$? z#}}+m>boM#xE^?7+hD&3H>u@I@*p_AnHd_ig5wQiRM?6IDi)|%U`w-r#_tp7Ph{8E zO&p(GDgIu32S)sr@6lz)Ly>*lae=w6PX9}sO8j0wO&mFDtgDa8{&(%)iQ~DR9zW34 z$My30jm*Bc#K7@OWdFOCPaIFYoDM2KmY=7I<0+r^$&J$t`NUZHk{pLP)tpx_*VS|K zHI5(Gct3fNYo9`L{jQy9;P^9T|GTyiaXi=4GXdpO|CAng#*B6KnCySo@`>ZQo*p~c z)!(i|Q+HdwjpL)cC^`McI8|^w$9YwIsr!C7KC-Jf{g#O1kJ1KtE#i0?r)wPFm}qR2 zUx91Jg{dyCH@b<<*5S{m_Ez=kx6bZ|kNhR7J2sw=>h?uE&vt0z`QM*;>%D6m4*0p? z`4NTSMN#amd4^=A^rM|@TjL++& zHJ?-K@#DJxSQAsIJ+jm*=TIcD@%$28+d3egU&9Q2Xu0sbWB3QjI%fw9&riHhm6!Ig z)f|j@?UB3hgXa_4ewz!=N45UM^K2KaPwI;y84lMIj8_H2^CMcmq~4P8{C?1HqbR8l z853021J!T$Cdc)k~Sp7M$3xgOsaP(JZ? zT#rxd3_M>4JWu(=^9jA)KW@k`R=>7<8_zrYDLb?o<5a=(9OsScc>_N@KVhXWFP{Ie zexE%H$tHxNVffE28K>`!@@-^cL1&87r5~xh&u$pB!d5I$vB0dg zK&^hCeMrC0E@O8IvVZ>2Q^ntl@2KE(;`F`~-Eo15)9HVSLy6Bv44gZaMwBsddImV1 z@`=+qZXGz?)yMVn`8nD54lr=~0l?{$Pn@2^!>ad+9F$M{aGVx1^bdm5 z&3OY8r|0BroX++3w4uM!B-r1}G)|ZCz-7Scluw+__4ddIUHcT1OdQR5m3jlG*8`_h zK5;tN+mnWTyAI9#Z22}$AJpU1urW@R=bYobP^ zt63BG+9P-02bT|N`)w{8DB_ULWn!QN}HGW_M1jLT(zz(y7p zbf&mm_J~w)xna->Td_dJ0<+cvsmuS7-3K4nbPtqNg5dJ28^qs>@2KE%;_^h3J1#JB zIsGqjC-HcEnz(S>z~$q><&;lc&T(t}u3+yyyCVSAlw$@ij{%ocK5==Qo=@oSaLa4U zP?FT&P|Q42yx?-Re-AB4@AIU6I8GZo%au>elrPEM5AT@vG~R2^$=A4?>*fvXT=|9M z`dv$DTrT5*6mU7^6PI({d^n(d;%3gHG#I$N0l1v@aAI zQw5iEoL7B@y6=a}qbGaQmlv0F*M-zhFkCJ%xfbY$%cU){jrrknsc#;e6PL?4UE}iZ z*0t^H@uO>vJ#F2sO)ZTbUHD-m%sR9-HucCi=o;mBj#f7{pEaHR^1+4E3dLzg<0L?&JU`e zZLjIthdAHXk9rPWr}oKD>UreYE~@3%HGBKRqmjVI`SSEt1;qL7%+QCH3+J1DL$a>= zr!LoH-tX3pX#YZc*lMN{UVG&3!(7tV2IZr>#?i0s7Yyfj;EQ$5PLtE&wEBLzP6_w> zeqFe;+XXZxEcnni(2Y#zE!&e%(RHZ=;c?wC0)Y zlb0P@6`XGvw8B;_P_e+QwLq-%=`7BVXu1PRDk1dvw$9Si#NUhWD2?-D`&i$v3#&2I ze{hKL4s#B0Ryp-fH$2~3{B3g9IT7bbe7jYA;Ck>iPOnpo-+_M*;+=}?olXnlo}0b5 z9OpgYRylh+QT#m?=d1PE5?op0?1PkYPk4#30sgfcX;wK6xUOM02ecVLss4N{iMST}4@drhRPgHnqJf&##Iz^M;Ry1|9 zT925}eqF1VM_>i68ZUL+b5+jC@8PQ1&q6AO7Oh^YNR{C}jucYuC$k>w)tbes-w- zva)+dxVB%g`HVJ<;bbJ`_Z5D}@tenpXuUa)k=ElC)+6;iIm@sY z!@jXduz8GO!(RuP$A~jSgKmy_jQx?{Mk7yY#WR`5kT3h%{dX)JNt@n5vXlN^0uQlp zEF4Soyh1A$s92z4fi2wvY5ku6kfv{d!V+Y^!dFihKQBESdb$$d?~Cnk&12|-Z|UUd68D<( z6z04@PQIQO;68=gkGt}1nZ?c@*7E`~9(Wk@0+i2r0q#@i4=A7d*XwzfUSnRM7xMy? z&v}7?m8xE2J;CbNmT%7sOz3fGgE2mp@e9X!BNr(<`OOPtHmLhdU*36vYNKj`&kG!- zQ~AvcNLyqZ^P3lNf7wCeidD^#U-{+*WSp+&1>|G;ovr6K2K^L&TWeDyHy_|htnE>Z z)a(9i@Km>*neqK_kr}5DZ_fiv==Q~V0JbB}15n0G+ue4-s|Q~7q|5`{Vc>HSx<)s`lw`Q+BrXqJB0dj`xdS{}qMfhcx~>yjP+1%q8A_?+^$s zgyTa2ar{}fV%B-NaJ=asB+K64>fep9eot>u`w`m1QqPH}y!Oc5_rdWsm#X-|aQyUt zPjCEkl@D<|f1iQ%NIhk*mFeM!9t!r}LDKNAL2!H%Gc@St!12qF-$oa74^`vAnlV=&sVTq1zPG}_@hgDiDW5o=csX)yK>4x!oCU{= zf0l#tX&;Wy;-7cr6Jx0q-oM1D=DdQ5<8$&gj_105#?ap@vH00j29AFUIG*x}yVeDT@!nt5GZPy|^ku7cf9ChQ zdVaXbSD?OOa~BMJ@V8X@Y*AH9}l{;HG7?XRNF5YKA-vT<)yAs`Vptse9Bv& z)K`8_)5Ph~-v-0!HHQBTg43Isp+PqXPTv>#Z8Y+nDNdK~OIOz04TDzLiUlebn6(y2 zYJ8s1RD7ER!Rcq7A^u(vUTK`3T=L(s-d=Z|J1!9aM!!e@OB_mko}4C595KERFoN#` zP(E>b?RH8JerI1AsEx(t8V~zkgMrfq?_c6jbKbzj={fltr*oaXdMj6duf*bK&ug46V7J$|*4H)4!a1*dbI zSNlbE-w&tPf7+YAyf|InT;dTNryr@4_^r1~TVxya!|77rJT~WgyNuHnPREx4*0p!y zQvf)h>d)o5X;}t8I;`=H-+TSOxX4eSzHa05xNcX(=WKsAK0k5k-_EXj^suu8pa0ds z=X_q=Y(tLpjinAgPmJe>&x7h`+iR-!Y1>CVKek@f&!(9t)jGOge9o&>YuvYEw?gZ6 zUs3r`-Wh1{(r>g}HrJ88Z!2*k&wbEiU5SVyOLFGEx@~%|Dv_f2?ev&hPdEL7q{!J} z@b}sG94RHH{Ri#A>!gEz{WI($ZF0ce+Jp0ywx5(q>{k4}!qV&P)#t1C{QAyQRAfr; z7P(&46Y=|m9#^m)5hZ(^Pe#+aF@@g~R=HTGsuf@#m6k8b3f29V`W~mf|B?Om`Q87s z;}tMopRS)6W-=4l3MK7L-b|g#eNp?wu(?mH+$KfO%~pvVc#`&(rkZpox|5Gz-gx*SD-S`w za#W!tQkLOCw?BzF&Y>-G69?NX$8#L#w%zQ;S22VAz3&CQm*_;(@@(AqQ@od`pNH6< z>OI`dsOlF+4Eb#9fpVC;734?K5sCbeE1%;zuD8^Db9(wy2YcMLyVY*lHq7UfX@&ar zV~msBL)oK7*UMDf73F+k?Ti2Z!FOx!kv94t!{3_gevCU7U_PAn#WbYT)z2;`*h@AHz4QbJiov(MyK(-Rga^KC4_(4|1^2 z7}N6QTA{jst@+2lR9%+!kAu2?Hn)Ey&KG;CC+%2a^`Wjvdl8O(U@`yb+@$K8{*mRP zf0TL;;2%AEk(H~F zKK-o@P4Xr>fuN$CTfvy!s(k z-@UgfI`AX6{zblR54kp#WB4&i z?dLH$sLMOx^`C?Kxy{+b(l`7)uRU_NVV6Swb5h$++IwmLxdC6kkuU4WS98vD{NKuU z96vwWcZ<@Gew6Ko^+|m%BBN>54;0QEvz~j_E&G_rcii&RkD6`ZwdO}_>iV*NbVAqD z=Juo9*Cy4Vyygi;&8RC=@uPLRe&|P8F8Wca_W*u$Lr;50d(U~f*Ls4wQg6CEZ|dUA zi0;Rvurc`4HeqnEz0#j@+?)A<+wN4%V1J)C{OR-Xr<6~BN_-i+!QqG^pv_JmQ{;IW%4tvWtQ$Lv~ zp-{Q}r2U-rU$1{}uz_;KO6ky!df*STdnQ(TKAI)T|e}bEY}qMWcP;7 zp7wREQ}&bIbVdARoiWaj8Ge%Om41@r+p3?q?T&3Y2(7}mrZ^v4^|N^n< z`QxF>$6LR0%&p=luQL2(|9F1=RRx%jr9CO1bh`T4<)plzwEi}QuiErD@4mZLYnlA9 zw|uMN52U{@)JF!%>+BMd%H=2R=dAZV8c+6n{p93bs=Ty^t#15ouRU`2ef(ryTE!3M zCuO~|JNs?awN5cK>5nJJbbj=coOfV-Qr{1e(X{VQg(qvQ^4Weeai?4ULT%u+h9{%< zsQxCV?Y6o7e^Se=2_RQo~PP3O`Bt^pnJq z8AEh05h8?dL4_ zJ#R)47hH& zuBoSO%HGjPl;<0{ZaH+H+kRrkx+U8w{UXP+i3i;HY`Z~d)bNW@_(jU6UnFiczjHhl zzj%YOZg~UzBIVOB5;sO4oSyzHqwN=uwc0EFqWN4htx&)Ii*e{LCiQb~`<+tlsbP-V z7xkuX_MCI`v$s4UesR+9i+#`Kmw!CKx+U#NJxQmk->6=XrM#+N=IcY*LT!7P_k!^J ze)zENcN^ZW{Ac`rZ@x3dnd?g^Q!f8$KaUN)8fT`w{xhzhTiU}`cf{|x@bRBR+J3?O zXYk+K@bjawU#a?{A7#5?eX=|@&TQLJ`O%bBKHHCuY55|De)P4xZh6Ps_5L4SPn+A1 zZfczAjH>#lA05=?q8|;2Gp%1IP;RmG4j@mmJYOnphW>QyA-7+N890;emHw3D-jUz9 z@kLJ1L%#jb`PjqZPbr`N)WnyRITe5UQv+xI6#kU*=}(C-d#Cw66?L-xX@}Kr=}*n) zlWB$e^=FJj|52yw#r9XF+7;#e==r3J#^>}dMIjXhvJ>qSjt(Y7#=VQY-Q64o|PCX@}i7d%^Q}2(ppR?TlWb6Hr zVf{SP9=5s>{!W8^1B$;M*X;L4Mz#H7-mapU_xa*K7US^>t8TE5()e>Cg!`W21`Yk%i`ZjpVUL-zK^oLIUIvB&T|Fv{n9 z#{51`!@Ju1rQd#;lo*LvflJYl4os(fZ-`;}!@eM=ol z?V9ac((<{VYW+%DIi{M9`%@$Oc}>li7KGzbZ~e8*u;1OFr2774yWQ0NuH6o~U)8bR zOQ_N9mG-a|O+D_lNA5lpFVyeWY5Pe%m+p6`|6anF&WHUjf5#_Rk6O`aPGQB=EmXLq z!77)o{cIm1F%yru<(>`w?(_2%E{SQo&9vX`*Y;uirCj#AVt2dWExw;$)sOi%X7snL zU-q{gR}4St){~jG6fb+mr9X@#Vg$dVK>6%%hgPe8kiRq5P)eZH-=^d{{#t$t-|?q> z_P41PCBM2;=|5HZRLAabuea)%{jJ%aB`u$KyWcETugrI<>9~KfUytK{y_zUjKWg zAN$?vC)7FXllq$T`EsrPcD;}N58m=geaIpD%Q3Fy3qKqB-2;wQ`+0S?Ecezo`(LwNOIkkv zc0XFGewpu7({W#1m404F->06qiT~$)9%tJBo=XLNDBJC(?tkrenA>+}?T@a}?UnYh z)lB`_YmeN0C|;=ljr~!@57z(Ae1G()&X4_XzxEfbPwH#;za#VYxYsJ5)Q24Gf7|}# zmVY+%ze^8P^9{AyZZqwFQ`$ak$CO*F|1G(x81^sK|FWLh|8l%B{5QA0vK1NdkL+EQ z{x>OkW4?j%bNz2v?SC2jz3L}ry}amQ^}oIHT`euY7vI&Q{9OOLy^=rthv~_uE_VO> z)cd^k&HmSH*OHdczuk|Ps$b?i)pXo%)u*4=$41l>m-wr<{?^QJ{9CG?*lss<|7*9y z+He4X z%>I|-jhX`cI;8GO9kM5qK8cHQTkM<@0a%qowMX`A#(*_w`h1J0H52dh#YFywBrI z=X=kifcvGfGC&nBLD>XO&CUzT5A{pLNSU8~WWF_EPh`QEj)G_Pc%BK5V~~%YIkv zZuh&z_d!|}h0~ZZ-^==Cf6MX3;G|nm`4arE$X+}4x8s=arF{0cZQoSm(V>W{Y4qm*`6gWpLe_8ELE?}cdF^Q@1svYr)@i{ zCocYixBg~2-nGBWNPS7!UN?1rYq!JPz7lKyU%zgzv*)5wc08!%vfnK<-YvaruJm}9_00a4IDt`7>kv|s{xhJJ?=_{=U$1=Lly7-sL>PIo8?N*~eMp zwBS2Y9XYGiU!cA>oYvnTmOT;gKp2^$^!dvj%Fcb-53rsnV0o62RO*O6SfBeH0A3R+ z-|mn@)urRajpsDT?*^G~qbf-<9t$7Juki93_W|=e5}=_Ng_y*-Q8%&!FJKG!7Q zt*!iSkZq{SdBp-13(Q6fWY#^M^>=Aaw?`o*$nOS?G>RXWUKqXhyeypXH9>M;^}9jz zuZ$?;0pU0QKI3)HDyP9&hA+Oaa?WyE@x6>r{O!)!+bG(~)v(lsYF;^ecU)r+m zduJHG8+3;JzORW&6U;l1U=2|t*O6}m*00-@ z;0u|LV*BI#gItp1Cp)b=@%x|LZD;x2pwskwTGHM<&$~o)LLuq99Ib!$Qh`5wUU};= z%}iH6=0|%?**-5SJLmM;RzKfwQ*^LK(KcPKUfm!6c29-x8eXsNvplt66joEX`=Rvm zdluo^HUV+B{k|>bl9mg1oBh4y6>Zn;&%)h~_6vz>Z@H=8@LLOCmj_(hnT@-X+I};| z-LdUezQo;*u1D4r^*cGsxIK2{{$RL!Ov{(#TQcsBLBEZnq&}oyoeA#V3F#}io7Sw* ziUlebn9UX#(0Dtk>041)34*)d)g*pge8=>0w~PnGezOI4J9?ZXWioL${V#DP@pd#I zE)#j?kv4F58n~PCiMvM@D*sO$Cuvk56bHj=$P;IV2h}5tEpdxYC>lFmX5auhY1jztcNz=x@p^#lNC)w~Pl~0q&-J z;%J7#C20|-({FGIPN}Jr}D$yG2CYx^TXXz-#j)a?v`3I*;h=={~O{_%4)&1t~&_^N1(ysD8M|j%T0S_%^(wYCpu^Y=<`fUh}atPo20o zyuIM>gn_?3&wVztP)PbP>TluJXAq4{#w| zJ*Mq9Q(WEuE~O7~b%XZztS9Psbe3^@Aq>=x?uxX4+B?IK5=#RKFa?Sr-?qUmzOi|Vc$E`z}060S5rQ5HOH~NIvPan^>)N7YG5g!{ZCu^Qmagdp0z6oZNYCduK~Y zMD2|&1_*Ev-w_|$N&N7R9nU_u@pPMRSH#n7e>R>z{nuB1BeC`SY6MSz%)ry0=RKQQ zC?tIs^|$lqIiDw<`{C)J`Y}J+YpV9Cy70Cxr^od?M*pEc<1@dE^!42}o|f^z?!eQOPdv@_>B)fd zsXymIA_kt008djs@pQvsN^h=Li&}OaYE`qumT%+fVLk4Q7~@aD(;Vlema6>x@busw z>ORw#7f-+2C|Ynl9n-1&@U*l=wlP0EE%nV~bFNd%I9=iClRMj*I$JtgTaM^$ZcWHS z^^xrzJ+0lvakXzM7N!Ix-XmVLqx<0>JDz=RBk#erp@8`MViwqkmJ45-{kmjby`!2>a4dXXrThQnk=}As-H{^-UzZ2D5Weoy z_M0ibu8XOBiLa|_)j8{l`r#Ei97fOl(_r{IqvcELEg4@Q0sS_LlKPPTb0+v&_F7c% zHLY2p6$?}>FqCo?AYbxVQ34*T=Z52N*zGM3MTE+unzuAJX!<>glnM{05|4aNx zTwNOwe~FFEW6;3YgTU96Pkim1sQf+gnxr+nyeTTn+xN~f@bx*s*OX6u&2em8=TlOC zEHBHf9~S>C2j$Z~9DfbeyW=NfAC(r4Iu6(b=;%7%{d@bXF zBZ03epZJ>V)X9MIsei8?PgWcFx*GVJ@`h zLjzxXp8srSp^)@t)ZfmZ=X}0+?uV~~>c{+Ouc_K+MDGKqUR>X;I#t=HZH=N;KTx=I zQqSw|bb-R*<8|sj%VX~w|MuyBos_mb8W4vkDaePG3x}Kizhq5&*f>0;{lw(S-f~mj zn9p@T93DPe$(bn*A3Z_IAr5CfvYx1)y>EQ-C&6%do8cd~WE@`EH_n=_(24~r7N}TY zY8DvK_&ceoxo`YiYs8Pw42R2jKs1^yIDF_7cN}2iaQa{3Oycjffn%pqGXn+=9{>)g zeB$ulxYC2TPGlFuY4*Jj894kyz~Pin9M19Xn9ir9{Fub>9x@-!edCl*`*8eKZOA7^ z@=8%>#F^&2fQiF%@-+_U`gVVlTVI9b`dw==_Kmjyhf_XrIM=r)1InlVoIeR0I6Mp- zPWi;)4Xc&jT<;b=?K(7dx8>V7d_a#otBmod;Bb!fdQVdM`Qh-?G3q|kmlucsH}4x? z+1kCXy|byOwZ6Nnxpn>e;_KUavCT$NgeSfuj#u7;%VqW&so{$D;%yyJ(vgX)*MO5tH!F6EO_FWPmg zc1&p8oz(Nauima!x#JDqeoVgUXRd#LdEsuq-3`}nnXC7sQz0L^(dRlZmkW2B{k`PH z`34(zS82bHZ1t9#`i-;{zV3&+`?URLio5F?RldaCoHt=TQNPo(jN4<^jRnKq87*Iu zZ^^h@<~+?dB))ql>)*2WQ(6Cp5h_Q;0u>9)dJDug-i~Ry6G|*W*1xxI6F)A#10(cl zet%rX17gJ4g1f_dT|&xa;%@q1;!5J}+JLxB2ZgF>s>Ez zN>aRi@52V}{;;fnYx%_89Pid9-0_Vq!^|ZVGtU$+epvjo9F$M{aQxNFav)9++-=SS zn7BJ9U*m4BdrunrXB7$fr`OnD-Ye_h+CIeHT=#A`+qF+I(Zt2QdOTTW;O;6}|JL$} zyN9)0u7iv0V)nP?+qk>>14_@NG5*Z1f9rAHgvR-PxV!2!Z~F4$?nQ; ze@k0r8}nQLmhm5t&AI+9<8-zDee`+_xVyTKY;BV7kk@y&u5axu@f~viWGqfmO1wwB zXh-(LKXyF(+{WS6&8i&{hqFBrhbP{CME3WQ{&4k%%eOuM!cPkh$4^&g4{86N=U-h7 zNnb|&Rm}Xqe7<2g{7%iDDSKicChH`T57xh@ZKq5b9K+I};|*Mpr( zAL47y53ru7-|{Tu_RRIa4Ti5{hTq$g@wLqFY-C|UrT?4>zOH-^%`j$#tyrL9fmv;V zh{n~9rsnT^b+wBh7vC{`d@bVvG2m>$*L@q@ae#@h>3@kIiL3jkiSJSdzD@yOQ$F!^ z{l!WT;x)0c>*eLld)W8-41C=Od`3l?*EyK*g4_}LamV@$XACA8!E^_Tj z?4we6{}Ml%c;Cd=Ir&`I*7F*Pq$}SmvH025#=7>^z}J*de9iUj(SY))e{NpHz}F7& zHRTguM>i_HxxOvh7PG%C-^SOyZAxCo7=H@B<~XmuTiy4=*KO_I^yS6ZUX*M8_N$X&)4E{lh4xs*>zy=d2|+Hq3j?gl-N`+TRu-L>bc=a2d94MyEjzwhPmJ4^A{k>$}`w?9(3wLLqXq1(c=Nu6ZJbP%dls{H}jtihP#Iif4C*%Zs}_`vap~t#oaRQtgLGr2Cc9a3sfvH zYb_8zeeJ#@&;8zN0GT>R(8%-?c%FyJb8u z2;5Ei#NAxaZVM=%`g6Wy@)IEqWHSzb)U!-4lA;*#1D5%TVxya!`)KfJT~XLwv5vi?mnuu=cJw{ ze26@8bmy9`Q;TmWwB@44jX#%<$byY zZ|`d0ZO?O_%`6m>K8yO>`SYC5DbM}zc2NC@w{5wUPfERL*QwgELGK@DKE$IFSF7hP zalNAPt<-w>sK$E>k5uS;^fGThw+|FEad}Ha@>zM$`%3|F`K2tF4=ooiH~oQRJ#cy9 z-`(!jej{_0x7<{>#^<^pE}zu)n<*|I{zd)~cI1;gd_hQHjBarpr# z=tdS6bf&nxvL0?2v%*#^P_e+Qwm{}A{k=6!&G)?D(II|Z(7^O@xr_(IfU^ac_v>+z zl*z>9^uNTN#N&eou9Y-FkEDUilfdPaPh1}VqVoU5c_OzMZnN)QZQ$~&fy*hMxSZqS zw9cob{Fub>9)iooKg&V+v`=pQWymLHQYpNDi95}C0uz_#%2QH_4;&QHoX9CKn{+v&lFmU+b@T?@9p!ZFE1{CyHT{@xO{f}J{X|(aa}DNI$GW_K^1OdEV94kn~;D zU&YM-%jb!A{P1~D{fN(Pxs*>zy@=1JYR93o74B}+>%`B$POWd(eMUWh%tz*!Ox*p3 z%eQ}Y7hJnwUak5G^gEf?-~jQ(D-9vmr*yC=S&${YWRx7<{B@XLj-`{C|{w%<%~ zcU0>|+|79t))VzRHOsg?cJ0H#aQBFoFUhxL+D+W6}Do5 ziUnq^1qL+UPHI|>l1h;E@Sb(z$HjL{A9u@mK#VtAaCfy{myj}w0-plH%=q*BH3_8sKiqC+_BWH}*|;d}GTnbMadb zKSW2OeAST#q})4ct8r+)eq!-DxeC>*AtsG5g!{ZQSjAR@tG=7=H@x<~VOm<9t8dJz=FU zFYaC_#nne}-2Hx?!f!oX+9KPS-+H*zH;>J^9xmf_wH|)rhSu)$>RY?lbak(5>TGU3 ztZPGO$)6GPOT?o1QsO+~L_4A%?y=+9=QjR!u2b!g_?zv}#^0Cpo_l)#Gmjr4`1=F{ ze|w($Y-XX5^kLNB&Y$Oeu6XW;zk}*GyjtO6TQ233QZL$ds&=gIR{3P~Jn#Gk3T2Oc z)!U!#hYU^pJ@>Y~{_`$eJ22q7_hnSrhn5R}oBh6I-G5_Y{GHJLVeA%fxv6f%=ei&M zp3wH2DgGY1N$ErU&HW0jC+c@XmT`OT)L(+(?>fUTZprvte&=o@3kxd!>rCDQ-x296 z_}egOg{@eiVu4v}fw;!qF->LPj|9Qr|Jx~kTztp$@wbcz#CWp>f2Y3Vjsr~mP5(=L zN!&eP;8(Fj&?8~s?*#BS=j+xhdH&lAu6aCcDsh`VjMlut^%XxFLQF{yEPT+j19{tkt%W8YQJ zAM;rX#>Cwp9lUoWf@`sWxch%7$cL5-cbomaWSz68^&a@R_6zlQdCN_8`|m7#T^{g4 z?}4{z`^^-0*J!|G`kKH#O40opuf4C*%?gLT2jVvr^1$P_9sIV0a zR4h=jKoJW>G~RYJeKX=p5Zt{iA%0wZ$MkWxj0Yt9*@C;Pe&YIj6L-`95?2y$R|mvp zVk7ftGjMksa5v=>cTe7@^dOFtw62#oB`My%cY}euZvgJ5eBy47cN>1`me-bH<`RmT zXNnixE&f>!%BOue{_5A|kT}Fd!rKRNr8y5^;_jS$jk_JaZd`r8tG_L?*!iml?tT@x zoAQafx!&CyP(JnNe94%ByT^dLDWAA|Ov~l^x9D2T{a7Q2mIzZMl?BO1)^;soF87_n9-FKJ9OE-v`$jjca^9rg7ia=PMMRx!c>{ z+56Hz@I>OFT_9tJfZs>&W5IlAx$wE^7bNSd3kt7`_i6tz`GB|FR5#{xT{?n7_`K>K zC18O4)Hnbk@ZCV?0xC+$AjVXxZyXqWPE-I3c8Vn1)V8Auk1@Vj9FnT7N}TY zR$Cx*rhXq>Q*&SXm1m0|mr>I6@wto##DKE}pAS9gjsr}5PX9~%NnAc`;M=J*q_~04 zTk02;E_;t+2l?l9utn4v)C@CqCzT z_+&u&)SvSzqXs@71wN<##OH1AQuWLAanZS${cZU+KJVA#PRAI33O?sJFYzm7CqI1N z_fu_0oxZ&Ie4!LqAHnhY?AVtspI$p}eNXGUmF??V4_SX?dq=BqCD+CaCZZ92DRCb0 zq#e-@_t^35a~r4k>-I&Q&UR?y^z}bKbncGZ?RAmh^lJ>9Zq5^`yh0)A!>GTVKhODG z@!Sum2i1=_-Ih!Fq|}RcovIyEx2S#Ty&9i?_*)8p#~=3gXZF7I&{cQ{k{x*z`T)ApMw{;qpeFm($IXxyFD)ZCZ;Lbu~wJwyC0;{nlX zw&3rYCtZJU;&1w2;!EQ0+JN}XuDMYIe~$uxQ$F$c(`cV?xb#iHtv4rk^`fooJ5ZsNe7}-M}DbMq+ zu7;%VqW&so{$D;%yyJ(vgX)*KLE&LrF6EO_FWPmwcD!ky@4n--N51@mJlEJNlRf@} zgZa#qR{cTMi`ZB~+ktBRIjQ~IMB^dZexH=_nD649zWdg*E`P`0-r^)3K;!HoaZG=q zuZD(EU$qaY-*;2j^8d#FrS#cbetHncd_|nhq`EHW^1g80OWyM#U5xlmRKHoxFGTcw zfNiw!HAiIUGd{QVUGw`s_>Hg0yv0^(aa_%tzs{Y9R%t__yJe2tM;_&K-r_~IJ;F)o z`2t(7q>p}MR{5BY@<05YPrv#g}5scv26S(U0DSaSD&o*cSC%D2%dUu^6A@}*HeTOP|r%JO|( zU#QV|J!tucbvYY$+%)BlTJuveYyMy!^pwEk{uk4aj(uyv8nMTqVUJ{0zCG@PJ#6`u zLrQ!6SZ6Y5*+ZIvgnm75FkL(KzfI3m?xbj&rglFt)%IeS&$i!G<;ygwgdwZEvad+O zh;?1odL&fq@#3boOj?c0^zMqj7q%aLXFm}>d#=VMdbuax}SDzE-52kACoBt$KH z$~uRHI_tW;izR_}sDA%3*?#Y$-+T~P@gCsIUO%@A3n5ZREtkE?dH<5*?>ZVkl(uI! zX0Sh(mxv~^KJ-O*-y$OR}Xg%a8@}@2#wCUPM6c|oCSVwg!KqVJDpCC z(~7I>@VCWjM@%_izYBSsi8Ik$a#-dp1;0US)tJ?21LCZAmgu;;_)hit z*B$@j#n{Jqo}yxdw<5&;t?Y73_j%c<>_^$|nEquln%10nVzzw_SoOeP%A)TJzv{Nz zLT$CwzK>PTaj>aay$hx4a@N3-5$6fW&D5`-xJ?u&o5;Pyw14y0ZU+Mq4Y6e}QSiN320 zGkJ-!ubhdEId<9pw`+I20v85#JB&4VtxGIvZ;|IpR_*3GTrroYOkX*tt7FN!mh3n} zU0Kr7-P+u9PAjF)4bjeWMIB38T32sayXYi2lM&Y3PzxfNV=e4hP;pjD9FZ_LbiL`E zuPxVs+z}@O-v2NN6ifl8FIGD`f2l9 zbKmGinhInp1Ok|TYySI#zha-^RwB}djH=Z2ogU%g<7-d*frmP^(vOUaSG zY;NckL(X=2a^C2X^YNW;euLnbg13 zo!DLMDmIbwNEa{r(d1i!@?My{3$p-0$`e6Yh_DD@7ld6Ac0;H^cn`wv2%F+C_cMsk ztkwOU^n+3cKJVPmApK}#5uvvfo^2Z0hN0YHlkUrKPoC6cnbp5x-NguD!FV zr@gDQQ98Pg)}B@r97h$NhwKwE-|*jfPm28*{ZH?aYQMomM2&+I2O9B}sK9?^AD;Aq za!@|^nQ{MJ#K4*A8BpDTnDC*P7HkmN=O;b99F$M{bAMmPus?e!mBRa1`U5$*k3{AIsQ(=W^k+Qc z>`kpd+s%N13 z3-6-(xB7z%_n$^leA$q3Fp|Ch^;5s`j?V=r%J{;>FHE~BX{mj0n=-F*%Hq5Q=e;;T z%6Syd&)D-?)T!7wO2%~dIBMupg|kwcQqJIqUfe-&7RM7N9+Nn{{-jmkul`5fnW`Sl zcc$g%m}6jpYUgq;VaPg9>Ty%h{fyMFLMs-iSfFBoiUlebs92z4fuI&h>G4O<_(9{f zl}T>U{44P)7N}UDVu6YUDi(MxSfEe)OPPO^kees7lppqqmwD2=&w_FWwp05a=O2B~ zPVb-p@pI(*ul0T`?)|W`kfqjXA6I>0RrTRNefpD<&vRwSXY?Iv{)FYT-&-Bk_ThW0 zHs!oa%{zn1snz+}a_n=NUEqY(dlgcOP$M{uQ~7g&sz_D>6s@_`mvO6*D{o^&nlnfBcbL4sy#n>=lr(g z|M;Ch$+ZK^kbi$`VVP2(RV3%rR*H^zN~?m>mW-XyZHO@egE-MvBybeut&Al zpU<7F*-PN@!Izi)^JCZVJTCd4S%&=kt^DPoF&~_tul(~4WABfwlKd|%L;m9n%hMi) zbh(^&EBQ%Hokg3ry_9NKvj0K?kM9ob`ra?T?vEFUJ-=86d$#FvvOUSZ90@$W*LmvS z?>zalCrJLoWypWr%3t=LNZ@hn8}7a8xtgJ*YQx|`BxNYiM|=57C_o)7!J?Cp}k zH zMt?EHenab?5WQ+O)S>unkJU$bL;yz_VfQ*Kj-h@>E`1cv)w&kt-A3~ zdrJFBm!bVMX#4Z|k$s&Kcy#>kvd*1e{?>`&Z-2iD^0)o%n3cb5lQFl-d^W!I{H<49 zf2Zj8(k95C|7sZ72C3T!#D`^z+5?%YI%7JRbYrji315BmK9?{WHsu|Cp8k+mMe09)BL){)4x_ zv-x7l|B5o?-=O;ymS6TVOW^UX$4=<^YVARBxqoXJ@*lJEm;K9pmqT>uzVNBc8(#S8 zd6NGFWypVWZ`H4|{C@K`oNuw`EBx?uDf~3m@#ZG;AKKpGeN?%{#^pTdkJ#_=e74eZ z+EQf8o-_$O4*S$C2Yvl>d-qHGeXb18N3U)td_LqCBF$fk{C%qS!L6VAc8B=Kw`AY_ zDS}6-bP>vSVn;dQ7u$ASv|{D`;v09@`N*7UDsO-L94Gotb4JjXq|WVpCUrUM_4|>} z{_(VI#Nnmh=j8nx)I500Wm`MnKI6+Hk0jK)9))wszsk2)^6#iCi$G-lOnj`2g?@6$ zyn^pPj>ME+W15OB3LSj^(SDDi{-wh2k;V^Ha%m4+=D6Q}*oeY?1KUdqX)Wp)+)v4q zGRf81^!{Uq)8#bb{l8|s9k|wd^U?3U$J%Ae9=Z1(_53;8n>L&Cq-($OCB**=KYRSI$IH22~``+WcDZKY6lGvBXn~-?VFz-#s zwGzp5nC}_Nb2&E@KR~?+=0?kZ6Ed>5dslHwy4_bHMT@zi7+Qt&3YTv@re5vSm6&ox z4vC}sfnBoa>W{jzf8G@c$Q>$9NA8?*KALys#=I-P%DeJX-j(e1lfJ6*+SzE|>dNB0 zEAP*{a$??`Q@z2sP?2HgWScu?vnETEbAyQQLACg{lN3`mT-*J*}s;c6T|A z9bHW=c-^jZP5WATn@~Ory}q@11K#&L50|^nYL^!b*KTO)My$5h=Cc~*HNcL>HHn_? z+>Ms@^@*mQ=C(rjde^M=PbfD_CGKfj-O=h3tGQ`?kEz?5ruL2v-K~vX>l@peI$Jtg zTfB;{X>VEIm=&1QJ$tFSYeOeqw%6rc)6ukceeSHismDqpSG*}Yx;odMxh`SF<5k9O z?QHI7I;T}zJC{Lgn_RIo;Z-KaYu$J?5|&tpS17Yx3)NlMx~@5Ko+_wnDOG5h($*Rd zbNz{Y*Pgu{$4`7;lHXTIA8o`}q5}Vo;eAHwDdnJizOTpklqQVv-mWTY;J+fDy)5PP zeMv|Eo? zit&33#}>8^G$mSpSHIAwDg6tert|n3d!X6zzf}*$~BI2`wmz2RC|gV7pE4f z`Wn#ZRi~=!2~Ec|wedgKN9}n6uCsGqAVvJG*Za7>%6Z{BJ+3cRmSX+4^#6AMO?i=v zUjON9R$MpqmWboTPEuFJ_8Fu7sH=0Fc$lLqb*0eXTHUUB&+k2{$m9#z_oUd5L=QhC z>*I)HhV?n+R2`z)TSU{kCF;FAX-jf6Hs<$g>bl2AIrTbyo2KL1zOEeQ1ni#B@^y~i zdtIkk?f9ascChE)zMTF3iJaR0wOIYkv|WzeZ>jOdbiK~> zc?{Fv&G5P8^Ba9gwb#oJR+g_i!rOm-2z{=!LHRAa7e2q}<-cJdXs$o_)fcZ{LB@xQ zEa^{WK0)%C>GzcSm#gvw_47k|JV1NcYWDm2lStwDgz%Bdeo`hW&!(79=*CxkQbb87ab?e#iKmIBv(uBf=XaR?TKdib-Oi=`OCGFW;$eAy3ZW=o%VNVu z!S{2r=_ihJpBuqbtQJ0>#8dWsEwY*NA$W&vgYt2Q3IzH z61(`7i({Yt(_J?gx+m9U%oz*EVsAm^#>eJ4lwT89=s&-Zu% z`Du+;lUlyNT;B1@e_G2IAMtbn`P4h367%c%_MzUf`k?){ zSAHZbKbDqfH&Q@8^&Xg}{2D`kO#%5iy-%E;{!+8au&Uo^0r}KBK27;cwS1Y6Us^!E zqvfVG6+0F`y!MY}<*WLQ6_8K8BP*t7pLkY&eOlUGynuY_ot&opgdsmsKtA=(OjCZ+ zke@6dpL)kmnx1`9hWu0k`P6%0n(_w>`2z*y=k#7VJ^hCa`9lTdQ}6gR<);n#=>qZ{ zEjK+)`J;yX(E{?RcjV;h*(Z~gA4?1B$P|!Iy^~u0RQu;iEnn8=CJV^7^)}yODcnzZ z`-hrSRJkL~YJQZo?X7D5rB>hX*Hp&03wD|3EO_fYM{p>|wQ3D{(fQ|}-?DnGj)U(y z##RZBxb*88%g&TrSXck6z0g7AN1;P+0r}LM5*B!i&CC826%|33mKGp~LQ;QzH7~^QU4VtREXgj+8NVz^_pVMxB*ZY0sFdgr6+{5unDS38$jypI$pda5*}t+M+*0*oKg#}&{Sx~0;9-$AGYp9XyaVI_EMVRNoQSOtCn^y0l7 zCjmYM`Ut|M;4`3~z)q!oviF`qCz$T{o;DkXm_HhWV;m<5J`I{U7JKr+CqV}g`oRx@J|O4dGob%L7z7_a&T;le7y=&yJquwN zd=m6m2x*BAy65q*mBa!4G{PwO0nlF{j7c0&EL}Po@PKB{o9kgW@Db3O6VaByM?p_V zm;|2y9Yb&yBQ59$SD-xL6QB!Ea-1;uDCkEJs==o~>sG?efv*SsHo{WyY0&PI(SE=u zLGMMV2R{lLJr(;zz{fz}&;Xl)kAU8FI>rFt@dF0VM-Z+6p91a1Pm2tIPlDE-fi?p^ z2Kp+(2>7tfm&P6EG2ub~Ukl0wegZVM4lZ{IbOT+PfX?9Kpx@m9+ksDme(XZ%41NIg z;7d>*i4VH%rBDTY7+A-v$g$G?%9daH9KLq;pJ44Pmcn6yiUsx1!o)>gkaHmTIOxw1>Ld>6Hv5O1mEgmmFT6M8 z#KAjwD|Q!z9`I4nQxQG{J`TDz7IH2Hp8~xbpY4}%UYNBO}Ifj)2?%DWHZgTCW8RZ2(0Q%QcP+suPsUfGKA>^zA9|uh% zw1FQ5eZvPrP6B)c^d*E|iGNziIRoKR@Cneht3u8d!h>#m2J8Sn44Oo^9()S)2M9NT z9|e6wW5~G`d<1j?;STUl9Ck$*k@%nwO8}n%eI6krahgKT=?LTC6QFmVk9*)JKo7Ve zUW+gv{1E892s?lu1%2mLA!h;jDCk89i@>KqA4k{|`~>JVSBIRX;D@w z2nT{60DS_X4*Ue@lI!stfscXy93c*V6!d}{U=#2u(7guHP9zTKj}WewIH2`6qCJ3* zgFb<96Zi?x-M^0VgO7rK1L1D)Y0yc8QSi<;P)7)lfgb=}a1+Wa@j=f-cpiKL^y>)D zGL#GS*qc#a@Nv*r5URn4zll5%7J*NLzKRf)>)(QI2nR}h&@Um>fgb|>2f|A5&JgMa zAr8JC^y3H};0Hi|htLat0(9}W(N}i0h@r2fZl*`1^6M*zam@>-nkEY{Sx*8 z9|isT{dh(s4(QFlLY;w6gZ7WYR^SIfUq-kCeE0#_{2{a%@G;PTKMcFc^+!U^r+$sT zL*j$}{Wl@!De%r%$m#wq$_zdUdemcRAK>dj&q0`1i|e3&LzoZV`5k;2LN)k$&>tc! z0zV4+(G2VcJ_Y)}2#1580KM@^v?uUGppPK5fOr0YG9q+)L?zw%E!W5R>J?Io1`y{IG5M-al`Goasp8G3_HgWmlLbOk>O8u>Tc z9QY{c=?F3K3D7h`ox}nC%74&izz>1G9=i?V;3J?HAasCFfi4NnaeBeWKp#W66#N9} z6?5h|DewcJd(EBWTq|)ve}ymzJ_8z^H^;eEu7iFYAuaJiClKxf?`$>4ISyeAd>nKL z;VJNG(CxNHJn#|F1i~xelc2vus5$`hK^tB-$JqgV9Q5d_InDy`^`Oyh=QuUsW1#N} z&vBN5kAm*F;~b|>;(!kBG{;#9ehBoYMJPM?H0WKs%yD|akAnVi*Evp7c+m5Ao8$C> zPlC49pzPoipy54GcJL9rKMGiRa2`LVJRxYC`4fhLl{B`lQ4uyG9*JX6pP*@ z$@l&`uXE1zdY)~c{`~#^*txy$?{nOHJYVOW*LBWyo$I_#T?5-&3)C|6-(fM!)*!ZF zaC>VB%lXWof@+p)m@mA5b+cT_JoUo%)+&|*%u|Q3&uW?ZUr^7oby0h35^Q9-oOy?f z+gqDiPG;VZ8>8D;&S$<+-6YLs`uMOw5R?Ey^8^LR>mYH99 z8GXWX1M^*l?X7H%%8lP{yCM`g82v2 z=^vIGnE!bVuK~-}wVYq&?XB)C7chTpMtdv9ay9eMuWxVVsyy?7GuvDFD#N_jEY2&I z^O;+-+gpV!Co>;9m-CS266WX6Yi~_gdFFX{a9*f9^J-YYat-s7=5ze8oWuOXJLw;m z8<^j9562(NmCUCtqJLN}XTD0oavk&3#qija6FvO zx;C}9&Vyu@3z%Q!jt7s z`3F#<^2~c|Vc%KKVO|2WST1M&E>y4_cqqXtg{8fyeImj750lx^n8NV zo#j<5H$2Cm^WUqLe>%YmJ(FOqXSssqHLzLvaUiWzx*hF z#&Q5Z4vJO&$pow6DfUfe*!D+XOt5CLT=^jDXMY#4T){k%{1TRHsuQe|XW2KFbJ)jM zVYSNR4r6&e%lYiiUzZW4WB= zJE4)~Z004<#Bw2jz5uqfT*-VHSZwEF{(KcAv0TUe2S{eQJKK{3DJ<`NCBeGqRgM{I zYna!q;Fw{#0ly8xEZ1`kKFM-6%bj0Kux3Cm%Zr)sLpy_5UO=W63RzBC!!|%3uUGje z3Dz$#gyrzZ3D((=!tw&<&p;~6+dfLLj$=8U<$UI|A;9wVI@*L7%j=nUr=1*@lX)G! ze4k^C?eG6#f^{QoWVw?0R@lsP^#}CFYW9KURNB89lBg}`I9dTkEU#vsv^K#iV|f;@ z;Wv;4$4(Cjuw4BM=M>B#U&nkMRIuDOwe>(-5B&eL2lD>X&p)WG{8u#s^|Nb4B7Gn12kxHgJIlk7nm{Xr&YAWiW+vD~@i#hdKs-~pvdi&J2wX|M! zjiILWB;6jjA6m?*&tp5cht6?pqs5&1oL5s-g3i6)N={uTsHrGX=eT9kVteWuLQU!I zb&lIEE#}nqh?*Lm+g!#*VAH+m7KZ; zQ&YN=t7#>tuG`c!XK%f~-1cd4z3O^LO^wd$#_ggObL!ejO|>0$d)!KDF{iGj)Rg4p z*0hpS*I#NX`bY1tx;@ALnoa6jR83Vobnf+5a_ah3O^tu++-t4m)HSb~s`k|T!7a2F z*Q>54)l{^P&T)&Z#hkh>R8v(ao#VDzi#c^IY3D4R<91++Idz?^ru6^xeynOGr>?Wr z)ac~6)!1Tt>Ka^4MeX!@-)$wQuF2I@^{-y<%2sksZhO0Q?yXjG>N|m&mOrQeUMsi6 zTHHQ$J*K9VYMtYjT8lY#ZKtLo&*D-^KssG*zw-#H>scT;~CHn~oxSI0X>m0W_TU@WYcDHkT=-eNzf=k{$Sr@o)4DfLF3+tAAPsqevR zYH)Jjw31Wbk=0Z=TesKHN=|)$R#VPRI`@4mIrSY{O*M0L?%P&!>N~idyI$uQB5ASz z)c1dTxqjC8zEisHuFW&VAKNPTgy;r<-+dV=FmzpFmAbFX`MK zt-Wr1hgDPlE}ctiC8xf}s;OkB&h6PsPJItnQ{Z2n>(EM0eMeSP$$vVxS1UR7omowd zx%%%PwQD7(zPqcbs<+NDwS9EXY9*)cAE+t)Or1+; zC8zEos3|W`=Mr1Vsrw6R3QW+sU9Iegx}Tw@lJPpna8rx>tL}lQY5NA9`=XVcy0@jK zIs5D9**mtfed@l2n(_|NxxHJ-se2k~YB)vb_G=}l?q#THPG6l%ZY8JgbEqkAr+)uq z=&!~7RrkBpR6bW9SKqagQ}@@}rnVkv>w&f&XzPKt9%$=w&f&XzPKt z9%$=w&f&XzPKt9%$=w&f&XzPKt9%$=w&f&XzPKt9%$=w&f&XzPKt9%$=w&f&XzPKt9%$=< zwjOBffwmrK>w&f&XzPKt9%$=w&f&XzPKt9%$=w&f& zXzPKt9%$=*8C`*?Rq;dHh?7`4fBD|33Xp{zx%rlK$`QSId0* z=jYlv)xx}v>i_kWGjhVXk{)9V)qnl>pJnk&8ly*zDD4pl7-q_Z;vVDdh?D72IC0d- z(kY{K8&tL9XP|vkkHS%xO&*gr(A5d;D&0kI-eY3nh|&@KnBifG>L2u^ozCo&n!=Ba zO4Ccjr%vPdi;aw}6Z!wTnnbqOvMc#DYnEz+>5Hir<}ysBFxO%#gt;A4F3dxi5@BAz z6bMs`sdM&%UkK8>#ml3&Fri(-V9VN*%-x@c<}-7qAJyE+sQtIBz1aVHuN`I5F{vWc z57Qtr1(-%*reK@HK|6Y5N$f$qmxRWsI-x^OA=0KWD z5vDsPRhYh*0?@M1DOLpzO5l{T+pnuK{5lOxX4^_a~f z(}ej<9P_&{>xAjVsXNr$X0`UiFw=!O0TUMM%EAPM$-|@zb0H>Gn9-Qe#o9|T9mTq? z$CL|mJ7$(Jm6$ogJcF4h%L{%|nxiHsbRtR$!rp7ZpN=KEIri~k~e$$1wDn4a8e9+$dHi;iI z5BBV&UQIncOO^UPIDSpk;*@1tk5Ru07dJ^%so#c+n-E6*LR{Po!>Hehieu4p zrUsKg-`#h23)Qci=`GCCn`Et8*(+6l!nv6SFT?KG)2}lk(_}{d+Kg@|)5*L(d)(79 zQ{ZKea5A?adw;&nRCpOS*KYCC{4Tv@M*U)qURN<0btc}|^Oc)rM*Uii&g43opY~66 zmfZbPzf_|$rOu!1I&$=LzIGmVGpCYK=^3#;%+y-lcGNG_=yvX9rY?25m5jd8mwCj^ zWRX$(R(|#At7S(0GL3FWeNL)&2Ht#yuYc69(&$XK(@yTQWxjQ(U!>8Qb7?~@UD4-_ zJh?9QYcx7j!>;T_=CQj6`!ed6XmqBx)6T~?ym*IfNBs(o%xpce=kYS5et|}3j$y`I zowawTJ-MJU`%wM*jLuZ^=jvQ|zUcl3WJdk+jLux`Y|qAmvTtQZ{p!r_GU^v+bY?B> zs1Kr*oBupkwxfP+MrX2}b*)+V{+%+TerZN$PINL|`>x|KG51UT%8br*LvwOlAKbqE zESXWiFrzaO{#;FuZ>f4+X4J3C=*)#WVjccqUtdQ3vW(6I$f%_kwtV)PY)Ad7%X&46CdJ9z-}_wuG0(5Qw3eaBTEnTLe(^=UkF~dk zPo9(!8a`%}eqUAZnc9rH(mF=%aoiM_=6FW6vxRo_dy8sEO&vMt7j8?mk4J4%F%`m` zgsBpyC#G7MJj`-oF2K|XGZIrP%nXcvk5bz+x@6+m@uj2f-|p0VsDB8#Qj^xDv}sU2B>W-t)Ve zX50k6kaaiBq*1gJ@{HPx&(*rb+BagFytPj%omf0-yk$M%RSlmqcD&l2a_1G)ug)J- z)pgUavNr!>_^E5-73|8JW|A-`W0HmGjY$!v5R)p*bWFN1w_^grJc)@3^EM_&m<^ab zVgA763zM`rSMS0cg_$FcmMA9Q>oL`*Ey^fTudW^5Vzew=rHO`SF|#uk(a6UI~ulYy!8%+zT`BPJEmPP*F;e{4Ojwx_#k zUd5CP^BJbeG5U4?8B=nSc_bXzi8D@^9vF+aruf;^4^t`37)-^%@&OQ1aaHhdmmmwx+K0mX&C)UgkVz?2K~scJ`u_6GfguHlRV2b2IHu%f)6`&^UNOz*m`bj3<3~%AGVhuup)*wdmS#n3DCTnU1Oc#x!?e3K~rFtZL_5)4YqR5oQynStJ5-f0M;^=;ZZoSg zF!{oqi7650VoZfFlQ0d!%*EvVX}0_zrbd`|G1gyZW-}(oG5S2U4#E7bGuj-0sS)N_ zWe#pl zPBt@JFbx6I?7|dem@V&}LX|K_VUjb=Ob?9J(=^$bfG}ra3WT`?Q<7s=jlon1GYL~C z%(WP+msvFzQ{x!j&-Y@Qgjs@V;O0ua$Eq>;xu$tlWrTSfQ*nlw`5cqnR~x;q?=jV9 zo91`b&N*h)E=*v6X%6gyInS(0!;}lt15+{3%w%Cw2bt}hg{d5DngWbgJg!vg$C(PfN)Zu1T z(xH?VnC1{ng)m298iWa|su5<@U`&Z)609jjBZ^Cj)Lo@B`W3vEOp|AZPZ@51WzD(T zZD&NOHYJ{+32PBm)zjUKGS!%xYg|J+B_qa<9a(p+YgFcKGL_|~smBz|aLp+D+j{YM z>w0OZ@{DTd7pej?-HbBZRXf7$aTq=38M|R}HPW!ECeNsL4x*}jmTp=1PZ}ow2Gc|^ zsW+NyKV7YBj%m)pST~zhLsgYy^n2Zvs_GWA>S|2Gt*)6eazt_QgppR@cGsvaoI|Gk z4%g7nqbH6UWmS8II}C-BxrVCqjH^l=!( z)CqH%+Gb(;t1Z0W-3xX648`PoW^^<>oL#f@op!Z7jv1rxtJ{VKkT^`h|JD z@1x0#xNMT8e#71|w5&{pv#tcIq;#U)PJ_30wLQgbPtF787EZyGduC+O2)nGtGpeeb zj8*CO&)AsVuvNe?fnNLAVANLCo|)_z>tQeB>{q^LRLeKfa;0au32C>}6gN(f>G1;9 z8Die6Z%di*9)c8%vdeY6Py-=A-&y00UV5yr?d+|EkTq4Xzm}+6Z z#1uSbR&By0KW&=dF*U;MQkiGWOvfW=N0>t})xxA$bydp$>Vg!ZT{$uO!nT%(a;E=iDllxka`7qG|5O)VySxYSqqi)4YPoc~u*IY`ll5 z7Um0#wZhD7RaI}8rrnYBVU1~$F*(8n%4ke$>?A z<3^NN`JUmwhO2kK@>M#c-?gSv)g;UeOzPWiJE{-wz*GxUi3z-8W}d~Ayz3gZF7+;2 zQ|lVlPOWPB1Jit}S{7yl##*g2dJBKX1U_`DRLf)3`}0SxQ7!KzQ}eNDI;3)p)tROX zCixR>+FPofD@IM5l=G=;R6A)Z^OI!z^#0eAiShji>RnwYO)^3kVD>HGj-iv@&r83`9PulCx3l&MlG&n~0Mi5ips59E+D)X~xhG9y6G0jz&re94n8&mz8X)2ZZ-83&N z^FPzPi%I=k8{HfAmUe`Zx5 zjCvJxkCjfCq&m&2Fil9A9Db18%Va3iWSX!tmHf!Kmx(Bo!_S0kqyFn0*3}@)5KIm~ z5gyMJV=9H2hOzir_ju+uOo1>DVQPeV9h1tBx5ukK#gq%P71JP0yJKjXpK^~^?Tg9h z$KvDWXiN@28y+`7On@Ksj+-+usRwJ5pmyCV!Q?xpy=`V;st+}*7GU%f0`8ges4{70 zJI`Y3jy0=llwsIitv$hR`2$S(ai*!ql%$(gKVec&G|fL4{ak^&_M|jk3;SsV*Bp$g zImxU_$JCu{no}?hLDTfdSed4|6qA!}nkks_(@irAQ_;sX_h9mKP4gV4F3&V?VJiD+ zlVJD8CzzVE&CCW&Q-9MmVf6DG?w+*6>X_y+v=yhdcD$X}E{gfGK znu{^kAk&P&KUdvTeWk&X)aV%Gfh*7$)9DKiJ0WsrYXmi z%r(s-)y_QAJgwTf!!#=~HNvdH93mF(tx$kE!#_XuiB>@OfUdL{}wP%0&6} zPJYBSj<5P<5OV|`(oiI@suW?>q>G&6T#Qol0I1DGaZUQ}kinfVY?y}>l!U@E>b&7aDAXPSLa zq{kj~?~17YIUJ*(GIh_>?il?nsB2Ea=%-9w(;s7P(k<&xkPB6nFqbLwvzaMXRpNQt z+f~LhQ^$=MJDy1S7IT}Isf_pR6Mt;IjY(eR?nPSv0rqvB`%LMcmTTN6E#pQ%v!wp! zg`3gOu9!wYyW$x8`cOZ+VjBJIieoa>HtAQN}a+*%h-L{p^ZarJr3fGy2&T)97bc%qsotiesXxH}tbB zW|e++#Weca6~_csnSN5mG4^%1ep1CTA@wrrCsoXLDtoChM7JH)tL44@Mn9=yX7rOP zrqNHTI3|l`oF`QrV;^JsNfp!RCsjg!pHy*7NPXGUPpX(z`neRx*xRh1OL0t4Rb?~Ip^l#f z^`2nwX+3X3-VtS2{bm|_?bZY%6QkVP-!%5|bF^uK0WulFs1DN4uDDyMj$Zxjio1o% z=x0|Plc83xpIvbc!g+SZtx_+ces;yo=x0~ljM`}Z?22PTYF+x-6*r^$M?aTh8vR^~ zY4j5&rqNHBxJGS{e!|2xYTxw}CXNZI?a@z|I3{YpC%kU-b4a~B`Uw-aO0}$?FmX(V z>Sz6giE9wf6DFo{pP$$7#;Rrggo%?0+FQ8ZSi5~Z>nBXib_yE&ndEQ%Mn7TVR7KQ& z=_gD~qn|J_Th>oUI3^h4h1X9ZcLR zD*ZHqY4py_0tGuMn8Mt82jAOPZ~JJK6ms}1g6nX5tv3lMPM5J6oF&x*Frxb z;23)^^b-P(vCm39)^8d;*6$d5d-PbpW7KXrWBrb?*QLk$O{2&99i#X3Vs(egG4|T^ zSifWJcK|)sZ&vBCe#hAB(qsLm(PRB)l^*LiGgg7IcHK@h)6mT5v3{o=dz z=bA>3=bA>3=bA>3=bA>3=bA>3=bA>3=bA>3=bA>3=bA>3=bA>3=bA>3=bA>3=bA>3 z=bA>3=bA>3=Q_szzN5!;&5Rz;b&UO*>hWC11eMa`xn`9f_jHW@)U(GK%_==U=o)n` zp~nXuW4}x2@j=t*(LlFKonU%2&@uM$qelZxW7*?+j^;@vdS*tC z>zPK6;+e+%8>#krVQ-K7cT3|&kK&nCdKAww_NRj$#WOQ{6wl45t7Sck=NP-k^r)F* z?Dro%M&=lMzx0ThW9%)|BVvxRuN?GTdVy02|XS^#A{n^ya=n*le%FgH!F~`{3 zqesL{qesNdb?Ff?)94W~)94W~)94W~)94W~)94W~)94W~)94W~$Jl$JN5mXs?}Z)_ zGmRb*b4*BmQ_v$~u2Bu?5i!@Omr##?xkjBAdi={V_Uq;T4O#n$vcFgA(Jm*WzfIU9 zS*}r=s7JEQcJxS=Y23e88-G{VBUw(y-cvo2<(QEAXw)NFuCWh9dnC&-L1pwvmTT00 z>5(kQ*q^X^B+D^&GkPS;ty0Il9?5cyy*+x|$}x8T=y5AEKdQ8eO_MYl7DbwgNDbwgNDbwgN zDaY9FY!)bQ}hUwnb9LqW;=QW$}x5y>Jcb2qeq||V_yU45h&NFKGY*nu2Eg4 zN1z;IzZQA~$}#r3^azw=?7h$

#t^=Z+qMa@$ewBzgqOG4}T85h%Bch%*9Z8a)DK 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 literal 0 HcmV?d00001 diff --git a/gengo/bind/sdkMerge/sdk_test.go b/gengo/bind/sdkMerge/sdk_test.go index d1d7e9f20..d9f8d8573 100644 --- a/gengo/bind/sdkMerge/sdk_test.go +++ b/gengo/bind/sdkMerge/sdk_test.go @@ -61,6 +61,7 @@ func MacrosInHeader() (m *maps.SafeMap[string, bool]) { } func TestBindMacros(t *testing.T) { + t.Skip("not working now") mylog.Todo("handle macros func like CTL_CODE(DeviceType,Function,Method,Access) ( ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method)) ") mustPrefixs := MacrosInHeader() return From 96eca264d343eb0f37229eecb5f2bee5f76b9247 Mon Sep 17 00:00:00 2001 From: Admin <2762713521@qq.com> Date: Fri, 21 Jun 2024 12:48:02 +0800 Subject: [PATCH 20/25] TestMergeHeader --- gengo/bind/sdkMerge/sdk_test.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/gengo/bind/sdkMerge/sdk_test.go b/gengo/bind/sdkMerge/sdk_test.go index d9f8d8573..e4a7214f5 100644 --- a/gengo/bind/sdkMerge/sdk_test.go +++ b/gengo/bind/sdkMerge/sdk_test.go @@ -1,6 +1,8 @@ package sdk import ( + "io/fs" + "path/filepath" "strings" "testing" "unicode" @@ -17,7 +19,13 @@ import ( "github.com/ddkwork/golibrary/mylog" ) -func mergeHeader() { // todo need merge func +func TestMergeHeader(t *testing.T) { + filepath.Walk("../../../bin", func(path string, info fs.FileInfo, err error) error { + if filepath.Ext(path) == ".h" { + println(path) + } + return err + }) } // ContainsLetter 检查字符串中是否包含字母 @@ -49,7 +57,7 @@ func MacrosInHeader() (m *maps.SafeMap[string, bool]) { println(m2.Len()) for _, s := range m.Keys() { - if !m2.HasPrefix(s) { //todo bug + if !m2.HasPrefix(s) { // todo bug m.Delete(s) mylog.Trace("delete macro", s) } From 536f5c2592d3dc069aa6e152963b406572116277 Mon Sep 17 00:00:00 2001 From: Admin <2762713521@qq.com> Date: Fri, 21 Jun 2024 12:48:49 +0800 Subject: [PATCH 21/25] TestMergeHeader --- gengo/bind/sdkMerge/sdk_test.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gengo/bind/sdkMerge/sdk_test.go b/gengo/bind/sdkMerge/sdk_test.go index e4a7214f5..c9b309de3 100644 --- a/gengo/bind/sdkMerge/sdk_test.go +++ b/gengo/bind/sdkMerge/sdk_test.go @@ -21,6 +21,9 @@ import ( func TestMergeHeader(t *testing.T) { filepath.Walk("../../../bin", func(path string, info fs.FileInfo, err error) error { + if strings.Contains(path, "Examples") { + return err + } if filepath.Ext(path) == ".h" { println(path) } From d95230d186031ef44898ec0589abdc19bc6555ae Mon Sep 17 00:00:00 2001 From: Admin <2762713521@qq.com> Date: Fri, 21 Jun 2024 13:06:33 +0800 Subject: [PATCH 22/25] TestMergeHeader --- gengo/bind/sdkMerge/merged_headers.h | 5857 ++++++++++++++++++++++++++ gengo/bind/sdkMerge/sdk_test.go | 5 + 2 files changed, 5862 insertions(+) create mode 100644 gengo/bind/sdkMerge/merged_headers.h diff --git a/gengo/bind/sdkMerge/merged_headers.h b/gengo/bind/sdkMerge/merged_headers.h new file mode 100644 index 000000000..38f1401f3 --- /dev/null +++ b/gengo/bind/sdkMerge/merged_headers.h @@ -0,0 +1,5857 @@ +//..\..\..\bin\debug\SDK\Headers\BasicTypes.h +/** + * @file BasicTypes.h + * @author Sina Karvandi (sina@hyperdbg.org) + * @brief HyperDbg's SDK Headers For Basic Datatypes + * @details This file contains definitions of basic datatypes + * @version 0.2 + * @date 2022-06-28 + * + * @copyright This project is released under the GNU Public License v3. + * + */ +#pragma once + +#pragma warning(disable : 4201) // Suppress nameless struct/union warning + +////////////////////////////////////////////////// +// Basic Datatypes // +////////////////////////////////////////////////// + +#include // 或者 #include + + +typedef unsigned long long QWORD; +typedef unsigned __int64 UINT64, *PUINT64; +typedef unsigned long DWORD; +typedef int BOOL; +typedef unsigned char BYTE; +typedef unsigned short WORD; +typedef int INT; +typedef unsigned int UINT; +typedef unsigned int * PUINT; +typedef unsigned __int64 ULONG64, *PULONG64; +typedef unsigned __int64 DWORD64, *PDWORD64; +typedef char CHAR; +typedef wchar_t WCHAR; +#define VOID void + +typedef unsigned char UCHAR; +typedef unsigned short USHORT; +typedef unsigned long ULONG; + +typedef UCHAR BOOLEAN; // winnt +typedef BOOLEAN * PBOOLEAN; // winnt + +typedef signed char INT8, *PINT8; +typedef signed short INT16, *PINT16; +typedef signed int INT32, *PINT32; +typedef signed __int64 INT64, *PINT64; +typedef unsigned char UINT8, *PUINT8; +typedef unsigned short UINT16, *PUINT16; +typedef unsigned int UINT32, *PUINT32; +typedef unsigned __int64 UINT64, *PUINT64; + +#define NULL_ZERO 0 +#define NULL64_ZERO 0ull + +#define FALSE 0 +#define TRUE 1 + +#define UPPER_56_BITS 0xffffffffffffff00 +#define UPPER_48_BITS 0xffffffffffff0000 +#define UPPER_32_BITS 0xffffffff00000000 +#define LOWER_32_BITS 0x00000000ffffffff +#define LOWER_16_BITS 0x000000000000ffff +#define LOWER_8_BITS 0x00000000000000ff +#define SECOND_LOWER_8_BITS 0x000000000000ff00 +#define UPPER_48_BITS_AND_LOWER_8_BITS 0xffffffffffff00ff + +// +// DO NOT FUCKING TOUCH THIS STRUCTURE WITHOUT COORDINATION WITH SINA +// +typedef struct GUEST_REGS +{ + // + // DO NOT FUCKING TOUCH THIS STRUCTURE WITHOUT COORDINATION WITH SINA + // + + UINT64 rax; // 0x00 + UINT64 rcx; // 0x08 + UINT64 rdx; // 0x10 + UINT64 rbx; // 0x18 + UINT64 rsp; // 0x20 + UINT64 rbp; // 0x28 + UINT64 rsi; // 0x30 + UINT64 rdi; // 0x38 + UINT64 r8; // 0x40 + UINT64 r9; // 0x48 + UINT64 r10; // 0x50 + UINT64 r11; // 0x58 + UINT64 r12; // 0x60 + UINT64 r13; // 0x68 + UINT64 r14; // 0x70 + UINT64 r15; // 0x78 + + // + // DO NOT FUCKING TOUCH THIS STRUCTURE WITHOUT COORDINATION WITH SINA + // + +} GUEST_REGS, *PGUEST_REGS; + +/** + * @brief struct for extra registers + * + */ +typedef struct GUEST_EXTRA_REGISTERS +{ + UINT16 CS; + UINT16 DS; + UINT16 FS; + UINT16 GS; + UINT16 ES; + UINT16 SS; + UINT64 RFLAGS; + UINT64 RIP; +} GUEST_EXTRA_REGISTERS, *PGUEST_EXTRA_REGISTERS; + +/** + * @brief List of different variables + */ +typedef struct _SCRIPT_ENGINE_VARIABLES_LIST +{ + UINT64 * TempList; + UINT64 * GlobalVariablesList; + UINT64 * LocalVariablesList; + +} SCRIPT_ENGINE_VARIABLES_LIST, *PSCRIPT_ENGINE_VARIABLES_LIST; + +/** + * @brief CR3 Structure + * + */ +typedef struct _CR3_TYPE +{ + union + { + UINT64 Flags; + + struct + { + UINT64 Pcid : 12; + UINT64 PageFrameNumber : 36; + UINT64 Reserved1 : 12; + UINT64 Reserved_2 : 3; + UINT64 PcidInvalidate : 1; + } Fields; + }; +} CR3_TYPE, *PCR3_TYPE; + + +//..\..\..\bin\debug\SDK\Headers\Connection.h +/** + * @file Connection.h + * @author Sina Karvandi (sina@hyperdbg.org) + * @brief HyperDbg's SDK Headers For Native Structures, Enums and Constants + * @details These datatypes are used in all devices like HDL (FPGAs) + * @version 0.2 + * @date 2022-07-14 + * + * @copyright This project is released under the GNU Public License v3. + * + */ +#pragma once + +/** + * @brief enum for reasons why debuggee is paused + * + */ +typedef enum _DEBUGGEE_PAUSING_REASON +{ + + // + // For both kernel & user debugger + // + DEBUGGEE_PAUSING_REASON_NOT_PAUSED = 0, + DEBUGGEE_PAUSING_REASON_PAUSE, + DEBUGGEE_PAUSING_REASON_REQUEST_FROM_DEBUGGER, + DEBUGGEE_PAUSING_REASON_DEBUGGEE_STEPPED, + DEBUGGEE_PAUSING_REASON_DEBUGGEE_TRACKING_STEPPED, + DEBUGGEE_PAUSING_REASON_DEBUGGEE_SOFTWARE_BREAKPOINT_HIT, + DEBUGGEE_PAUSING_REASON_DEBUGGEE_HARDWARE_DEBUG_REGISTER_HIT, + DEBUGGEE_PAUSING_REASON_DEBUGGEE_CORE_SWITCHED, + DEBUGGEE_PAUSING_REASON_DEBUGGEE_PROCESS_SWITCHED, + DEBUGGEE_PAUSING_REASON_DEBUGGEE_THREAD_SWITCHED, + DEBUGGEE_PAUSING_REASON_DEBUGGEE_COMMAND_EXECUTION_FINISHED, + DEBUGGEE_PAUSING_REASON_DEBUGGEE_EVENT_TRIGGERED, + DEBUGGEE_PAUSING_REASON_DEBUGGEE_STARTING_MODULE_LOADED, + + // + // Only for user-debugger + // + DEBUGGEE_PAUSING_REASON_DEBUGGEE_GENERAL_DEBUG_BREAK, + DEBUGGEE_PAUSING_REASON_DEBUGGEE_GENERAL_THREAD_INTERCEPTED, + + // + // Only used for hardware debugging + // + DEBUGGEE_PAUSING_REASON_HARDWARE_BASED_DEBUGGEE_GENERAL_BREAK, + +} DEBUGGEE_PAUSING_REASON; + +/** + * @brief enum for requested action for HyperDbg packet + * + */ +typedef enum _DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION +{ + + // + // Debugger to debuggee (user-mode execution) + // + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_ON_USER_MODE_PAUSE = 1, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_ON_USER_MODE_DO_NOT_READ_ANY_PACKET, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_ON_USER_MODE_DEBUGGER_VERSION, + + // + // Debuggee to debugger (user-mode execution) + // + DEBUGGER_REMOTE_PACKET_PING_AND_SEND_SUPPORTED_VERSION, + + // + // Debugger to debuggee (vmx-root mode execution) + // + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_ON_VMX_ROOT_MODE_STEP, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_ON_VMX_ROOT_MODE_CONTINUE, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_ON_VMX_ROOT_MODE_CLOSE_AND_UNLOAD_DEBUGGEE, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_ON_VMX_ROOT_MODE_CHANGE_CORE, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_ON_VMX_ROOT_MODE_FLUSH_BUFFERS, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_ON_VMX_ROOT_MODE_CALLSTACK, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_ON_VMX_ROOT_MODE_TEST_QUERY, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_ON_VMX_ROOT_MODE_CHANGE_PROCESS, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_ON_VMX_ROOT_MODE_CHANGE_THREAD, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_ON_VMX_ROOT_RUN_SCRIPT, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_ON_VMX_ROOT_USER_INPUT_BUFFER, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_ON_VMX_ROOT_SEARCH_QUERY, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_ON_VMX_ROOT_REGISTER_EVENT, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_ON_VMX_ROOT_ADD_ACTION_TO_EVENT, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_ON_VMX_ROOT_QUERY_AND_MODIFY_EVENT, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_ON_VMX_ROOT_READ_REGISTERS, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_ON_VMX_ROOT_READ_MEMORY, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_ON_VMX_ROOT_EDIT_MEMORY, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_ON_VMX_ROOT_BP, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_ON_VMX_ROOT_LIST_OR_MODIFY_BREAKPOINTS, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_ON_VMX_ROOT_SYMBOL_RELOAD, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_ON_VMX_ROOT_QUERY_PA2VA_AND_VA2PA, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_ON_VMX_ROOT_SYMBOL_QUERY_PTE, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_ON_VMX_ROOT_SET_SHORT_CIRCUITING_STATE, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_ON_VMX_ROOT_INJECT_PAGE_FAULT, + + // + // Debuggee to debugger + // + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_NO_ACTION, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_DEBUGGEE_STARTED, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_DEBUGGEE_LOGGING_MECHANISM, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_DEBUGGEE_PAUSED_AND_CURRENT_INSTRUCTION, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_DEBUGGEE_RESULT_OF_CHANGING_CORE, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_DEBUGGEE_RESULT_OF_CHANGING_PROCESS, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_DEBUGGEE_RESULT_OF_CHANGING_THREAD, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_DEBUGGEE_RESULT_OF_RUNNING_SCRIPT, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_DEBUGGEE_RESULT_OF_FORMATS, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_DEBUGGEE_RESULT_OF_FLUSH, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_DEBUGGEE_RESULT_OF_CALLSTACK, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_DEBUGGEE_RESULT_TEST_QUERY, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_DEBUGGEE_RESULT_OF_REGISTERING_EVENT, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_DEBUGGEE_RESULT_OF_ADDING_ACTION_TO_EVENT, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_DEBUGGEE_RESULT_OF_QUERY_AND_MODIFY_EVENT, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_DEBUGGEE_RESULT_OF_SHORT_CIRCUITING_EVENT, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_DEBUGGEE_RESULT_OF_READING_REGISTERS, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_DEBUGGEE_RESULT_OF_READING_MEMORY, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_DEBUGGEE_RESULT_OF_EDITING_MEMORY, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_DEBUGGEE_RESULT_OF_BP, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_DEBUGGEE_RESULT_OF_SHORT_CIRCUITING_STATE, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_DEBUGGEE_RESULT_OF_LIST_OR_MODIFY_BREAKPOINTS, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_DEBUGGEE_UPDATE_SYMBOL_INFO, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_DEBUGGEE_RELOAD_SYMBOL_FINISHED, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_DEBUGGEE_RELOAD_SEARCH_QUERY, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_DEBUGGEE_RESULT_OF_PTE, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_DEBUGGEE_RESULT_OF_VA2PA_AND_PA2VA, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_DEBUGGEE_RESULT_OF_BRINGING_PAGES_IN, + + // + // hardware debuggee to debugger + // + + // + // hardware debugger to debuggee + // + +} DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION; + +/** + * @brief enum for different packet types in HyperDbg packets + * @warning used in hwdbg + * + */ +typedef enum _DEBUGGER_REMOTE_PACKET_TYPE +{ + + // + // Debugger to debuggee (vmx-root) + // + DEBUGGER_REMOTE_PACKET_TYPE_DEBUGGER_TO_DEBUGGEE_EXECUTE_ON_VMX_ROOT = 1, + + // + // Debugger to debuggee (user-mode) + // + DEBUGGER_REMOTE_PACKET_TYPE_DEBUGGER_TO_DEBUGGEE_EXECUTE_ON_USER_MODE = 2, + + // + // Debuggee to debugger (user-mode and kernel-mode, vmx-root mode) + // + DEBUGGER_REMOTE_PACKET_TYPE_DEBUGGEE_TO_DEBUGGER = 3, + + // + // Debugger to debuggee (hardware), used in hwdbg + // + DEBUGGER_REMOTE_PACKET_TYPE_DEBUGGER_TO_DEBUGGEE_HARDWARE_LEVEL = 4, + + // + // Debuggee to debugger (hardware), used in hwdbg + // + DEBUGGER_REMOTE_PACKET_TYPE_DEBUGGEE_TO_DEBUGGER_HARDWARE_LEVEL = 5, + +} DEBUGGER_REMOTE_PACKET_TYPE; + +/** + * @brief The structure of remote packets in HyperDbg + * + */ +typedef struct _DEBUGGER_REMOTE_PACKET +{ + BYTE Checksum; + UINT64 Indicator; /* Shows the type of the packet */ + DEBUGGER_REMOTE_PACKET_TYPE TypeOfThePacket; + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION RequestedActionOfThePacket; + +} DEBUGGER_REMOTE_PACKET, *PDEBUGGER_REMOTE_PACKET; + + +//..\..\..\bin\debug\SDK\Headers\Constants.h +/** + * @file Constants.h + * @author Sina Karvandi (sina@hyperdbg.org) + * @brief HyperDbg's SDK constants + * @details This file contains definitions of constants + * used in HyperDbg + * @version 0.2 + * @date 2022-06-24 + * + * @copyright This project is released under the GNU Public License v3. + * + */ +#pragma once + +////////////////////////////////////////////////// +// Version Information // +////////////////////////////////////////////////// + +#define VERSION_MAJOR 0 +#define VERSION_MINOR 9 +#define VERSION_PATCH 0 + +// +// Example of __DATE__ string: "Jul 27 2012" +// 01234567890 + +#define BUILD_YEAR_CH0 (__DATE__[7]) +#define BUILD_YEAR_CH1 (__DATE__[8]) +#define BUILD_YEAR_CH2 (__DATE__[9]) +#define BUILD_YEAR_CH3 (__DATE__[10]) + +#define BUILD_MONTH_IS_JAN (__DATE__[0] == 'J' && __DATE__[1] == 'a' && __DATE__[2] == 'n') +#define BUILD_MONTH_IS_FEB (__DATE__[0] == 'F') +#define BUILD_MONTH_IS_MAR (__DATE__[0] == 'M' && __DATE__[1] == 'a' && __DATE__[2] == 'r') +#define BUILD_MONTH_IS_APR (__DATE__[0] == 'A' && __DATE__[1] == 'p') +#define BUILD_MONTH_IS_MAY (__DATE__[0] == 'M' && __DATE__[1] == 'a' && __DATE__[2] == 'y') +#define BUILD_MONTH_IS_JUN (__DATE__[0] == 'J' && __DATE__[1] == 'u' && __DATE__[2] == 'n') +#define BUILD_MONTH_IS_JUL (__DATE__[0] == 'J' && __DATE__[1] == 'u' && __DATE__[2] == 'l') +#define BUILD_MONTH_IS_AUG (__DATE__[0] == 'A' && __DATE__[1] == 'u') +#define BUILD_MONTH_IS_SEP (__DATE__[0] == 'S') +#define BUILD_MONTH_IS_OCT (__DATE__[0] == 'O') +#define BUILD_MONTH_IS_NOV (__DATE__[0] == 'N') +#define BUILD_MONTH_IS_DEC (__DATE__[0] == 'D') + +#define BUILD_MONTH_CH0 \ + ((BUILD_MONTH_IS_OCT || BUILD_MONTH_IS_NOV || BUILD_MONTH_IS_DEC) ? '1' : '0') + +#define BUILD_MONTH_CH1 \ + ( \ + (BUILD_MONTH_IS_JAN) ? '1' : (BUILD_MONTH_IS_FEB) ? '2' \ + : (BUILD_MONTH_IS_MAR) ? '3' \ + : (BUILD_MONTH_IS_APR) ? '4' \ + : (BUILD_MONTH_IS_MAY) ? '5' \ + : (BUILD_MONTH_IS_JUN) ? '6' \ + : (BUILD_MONTH_IS_JUL) ? '7' \ + : (BUILD_MONTH_IS_AUG) ? '8' \ + : (BUILD_MONTH_IS_SEP) ? '9' \ + : (BUILD_MONTH_IS_OCT) ? '0' \ + : (BUILD_MONTH_IS_NOV) ? '1' \ + : (BUILD_MONTH_IS_DEC) ? '2' \ + : /* error default */ '?') + +#define BUILD_DAY_CH0 ((__DATE__[4] >= '0') ? (__DATE__[4]) : '0') +#define BUILD_DAY_CH1 (__DATE__[5]) + +// +// Example of __TIME__ string: "21:06:19" +// 01234567 + +#define BUILD_HOUR_CH0 (__TIME__[0]) +#define BUILD_HOUR_CH1 (__TIME__[1]) + +#define BUILD_MIN_CH0 (__TIME__[3]) +#define BUILD_MIN_CH1 (__TIME__[4]) + +#define BUILD_SEC_CH0 (__TIME__[6]) +#define BUILD_SEC_CH1 (__TIME__[7]) + +#if VERSION_MAJOR > 100 + +# define VERSION_MAJOR_INIT \ + ((VERSION_MAJOR / 100) + '0'), \ + (((VERSION_MAJOR % 100) / 10) + '0'), \ + ((VERSION_MAJOR % 10) + '0') + +#elif VERSION_MAJOR > 10 + +# define VERSION_MAJOR_INIT \ + ((VERSION_MAJOR / 10) + '0'), \ + ((VERSION_MAJOR % 10) + '0') + +#else + +# define VERSION_MAJOR_INIT \ + (VERSION_MAJOR + '0') + +#endif + +#if VERSION_MINOR > 100 + +# define VERSION_MINOR_INIT \ + ((VERSION_MINOR / 100) + '0'), \ + (((VERSION_MINOR % 100) / 10) + '0'), \ + ((VERSION_MINOR % 10) + '0') + +#elif VERSION_MINOR > 10 + +# define VERSION_MINOR_INIT \ + ((VERSION_MINOR / 10) + '0'), \ + ((VERSION_MINOR % 10) + '0') + +#else + +# define VERSION_MINOR_INIT \ + (VERSION_MINOR + '0') + +#endif + +#if VERSION_PATCH > 100 + +# define VERSION_PATCH_INIT \ + ((VERSION_PATCH / 100) + '0'), \ + (((VERSION_PATCH % 100) / 10) + '0'), \ + ((VERSION_PATCH % 10) + '0') + +#elif VERSION_PATCH > 10 + +# define VERSION_PATCH_INIT \ + ((VERSION_PATCH / 10) + '0'), \ + ((VERSION_PATCH % 10) + '0') + +#else + +# define VERSION_PATCH_INIT \ + (VERSION_PATCH + '0') + +#endif + +#ifndef HYPERDBG_KERNEL_MODE + +const unsigned char BuildDateTime[] = { + BUILD_YEAR_CH0, + BUILD_YEAR_CH1, + BUILD_YEAR_CH2, + BUILD_YEAR_CH3, + '-', + BUILD_MONTH_CH0, + BUILD_MONTH_CH1, + '-', + BUILD_DAY_CH0, + BUILD_DAY_CH1, + ' ', + BUILD_HOUR_CH0, + BUILD_HOUR_CH1, + ':', + BUILD_MIN_CH0, + BUILD_MIN_CH1, + ':', + BUILD_SEC_CH0, + BUILD_SEC_CH1, + + '\0'}; + +const unsigned char CompleteVersion[] = { + 'v', + VERSION_MAJOR_INIT, + '.', + VERSION_MINOR_INIT, + '.', + VERSION_PATCH_INIT, + '\0'}; + +const unsigned char BuildVersion[] = { + BUILD_YEAR_CH0, + BUILD_YEAR_CH1, + BUILD_YEAR_CH2, + BUILD_YEAR_CH3, + BUILD_MONTH_CH0, + BUILD_MONTH_CH1, + BUILD_DAY_CH0, + BUILD_DAY_CH1, + '.', + BUILD_HOUR_CH0, + BUILD_HOUR_CH1, + BUILD_MIN_CH0, + BUILD_MIN_CH1, + + '\0'}; + +const unsigned char BuildSignature[] = { + VERSION_MAJOR_INIT, + '.', + VERSION_MINOR_INIT, + '.', + VERSION_PATCH_INIT, + '-', + BUILD_YEAR_CH0, + BUILD_YEAR_CH1, + BUILD_YEAR_CH2, + BUILD_YEAR_CH3, + BUILD_MONTH_CH0, + BUILD_MONTH_CH1, + BUILD_DAY_CH0, + BUILD_DAY_CH1, + '.', + BUILD_HOUR_CH0, + BUILD_HOUR_CH1, + BUILD_MIN_CH0, + BUILD_MIN_CH1, + + '\0'}; + +#endif // SCRIPT_ENGINE_KERNEL_MODE + +////////////////////////////////////////////////// +// Message Tracing // +////////////////////////////////////////////////// + +/** + * @brief Default buffer count of packets for message tracing + * @details number of packets storage for regular buffers + */ +#define MaximumPacketsCapacity 1000 + +/** + * @brief Default buffer count of packets for message tracing + * @details number of packets storage for priority buffers + */ +#define MaximumPacketsCapacityPriority 50 + +/** + * @brief Size of normal OS (processor) pages + */ +#define NORMAL_PAGE_SIZE 4096 // PAGE_SIZE + +/** + * @brief Size of each packet + */ +#define PacketChunkSize NORMAL_PAGE_SIZE + +/** + * @brief size of user-mode buffer + * @details Because of operation code at the start of the + * buffer + 1 for null-termminating + * + */ +#define UsermodeBufferSize sizeof(UINT32) + PacketChunkSize + 1 + +/** + * @brief size of buffer for serial + * @details the maximum packet size for sending over serial + * + */ +#define MaxSerialPacketSize 10 * NORMAL_PAGE_SIZE + +/** + * @brief Final storage size of message tracing + * + */ +#define LogBufferSize \ + MaximumPacketsCapacity *(PacketChunkSize + sizeof(BUFFER_HEADER)) + +/** + * @brief Final storage size of message tracing + * + */ +#define LogBufferSizePriority \ + MaximumPacketsCapacityPriority *(PacketChunkSize + sizeof(BUFFER_HEADER)) + +/** + * @brief limitation of Windows DbgPrint message size + * @details currently is not functional + * + */ +#define DbgPrintLimitation 512 + +/** + * @brief The seeds that user-mode codes use as the starter + * of their events' tag + * + */ +#define DebuggerEventTagStartSeed 0x1000000 + +/** + * @brief The seeds that user-mode thread detail token start with it + * @details This seed should not start with zero (0), otherwise it's + * interpreted as error + */ +#define DebuggerThreadDebuggingTagStartSeed 0x1000000 + +/** + * @brief The seeds that user-mode codes use as the starter + * of their output source tag + * + */ +#define DebuggerOutputSourceTagStartSeed 0x1 + +/** + * @brief Determines how many sources a debugger can have for + * a single event + * + */ +#define DebuggerOutputSourceMaximumRemoteSourceForSingleEvent 0x5 + +/** + * @brief The size of each chunk of memory used in the 'memcpy' function + * of the script engine for transferring buffers in the VMX-root mode + * + */ +#define DebuggerScriptEngineMemcpyMovingBufferSize 64 + +////////////////////////////////////////////////// +// EPT Hook // +////////////////////////////////////////////////// + +/** + * @brief Maximum number of initial pre-allocated EPT hooks + * + */ +#define MAXIMUM_NUMBER_OF_INITIAL_PREALLOCATED_EPT_HOOKS 5 + +////////////////////////////////////////////////// +// Instant Event Configs // +////////////////////////////////////////////////// + +/** + * @brief Maximum number of (regular) instant events that are pre-allocated + * + */ +#define MAXIMUM_REGULAR_INSTANT_EVENTS 20 + +/** + * @brief Maximum number of (big) instant events that are pre-allocated + * + */ +#define MAXIMUM_BIG_INSTANT_EVENTS 0 + +/** + * @brief Pre-allocated size for a regular event + conditions buffer + * + */ +#define REGULAR_INSTANT_EVENT_CONDITIONAL_BUFFER sizeof(DEBUGGER_EVENT) + 100 + +/** + * @brief Pre-allocated size for a big event + conditions buffer + * + */ +#define BIG_INSTANT_EVENT_CONDITIONAL_BUFFER sizeof(DEBUGGER_EVENT) + PAGE_SIZE + +/** + * @brief Pre-allocated size for a regular action + custom code or script buffer + * + */ +#define REGULAR_INSTANT_EVENT_ACTION_BUFFER sizeof(DEBUGGER_EVENT_ACTION) + (PAGE_SIZE * 2) + +/** + * @brief Pre-allocated size for a big action + custom code or script buffer + * + */ +#define BIG_INSTANT_EVENT_ACTION_BUFFER sizeof(DEBUGGER_EVENT_ACTION) + MaxSerialPacketSize + +/** + * @brief Pre-allocated size for a regular requested safe buffer + * + */ +#define REGULAR_INSTANT_EVENT_REQUESTED_SAFE_BUFFER PAGE_SIZE + +/** + * @brief Pre-allocated size for a big requested safe buffer + * + */ +#define BIG_INSTANT_EVENT_REQUESTED_SAFE_BUFFER MaxSerialPacketSize + +////////////////////////////////////////////////// +// Remote Connection // +////////////////////////////////////////////////// + +/** + * @brief default port of HyperDbg for listening by + * debuggee (server, guest) + * + */ +#define DEFAULT_PORT "50000" + +/** + * @brief Packet size for TCP connections + * @details Note that we might add something to the kernel buffers + * that's why we add 0x100 to it + */ +#define COMMUNICATION_BUFFER_SIZE PacketChunkSize + 0x100 + +////////////////////////////////////////////////// +// VMCALL Numbers // +////////////////////////////////////////////////// + +/** + * @brief The start number of VMCALL number allowed to be + * used by top-level drivers + * + */ +#define TOP_LEVEL_DRIVERS_VMCALL_STARTING_NUMBER 0x00000200 + +/** + * @brief The start number of VMCALL number allowed to be + * used by top-level drivers + * + */ +#define TOP_LEVEL_DRIVERS_VMCALL_ENDING_NUMBER TOP_LEVEL_DRIVERS_VMCALL_STARTING_NUMBER + 0x100 + +////////////////////////////////////////////////// +// Operation Codes // +////////////////////////////////////////////////// + +/** + * @brief If a operation use this bit in its Operation code, + * then it means that the operation should be performed + * mandatorily in debuggee and should not be sent to the debugger + */ +#define OPERATION_MANDATORY_DEBUGGEE_BIT (1 << 31) + +/** + * @brief Message logs id that comes from kernel-mode to + * user-mode + * @details Message area >= 0x5 + */ +#define OPERATION_LOG_INFO_MESSAGE 1U +#define OPERATION_LOG_WARNING_MESSAGE 2U +#define OPERATION_LOG_ERROR_MESSAGE 3U +#define OPERATION_LOG_NON_IMMEDIATE_MESSAGE 4U +#define OPERATION_LOG_WITH_TAG 5U + +#define OPERATION_COMMAND_FROM_DEBUGGER_CLOSE_AND_UNLOAD_VMM \ + 6U | OPERATION_MANDATORY_DEBUGGEE_BIT +#define OPERATION_DEBUGGEE_USER_INPUT 7U | OPERATION_MANDATORY_DEBUGGEE_BIT +#define OPERATION_DEBUGGEE_REGISTER_EVENT 8U | OPERATION_MANDATORY_DEBUGGEE_BIT +#define OPERATION_DEBUGGEE_ADD_ACTION_TO_EVENT \ + 9 | OPERATION_MANDATORY_DEBUGGEE_BIT +#define OPERATION_DEBUGGEE_CLEAR_EVENTS 10U | OPERATION_MANDATORY_DEBUGGEE_BIT +#define OPERATION_DEBUGGEE_CLEAR_EVENTS_WITHOUT_NOTIFYING_DEBUGGER 11U | OPERATION_MANDATORY_DEBUGGEE_BIT +#define OPERATION_HYPERVISOR_DRIVER_IS_SUCCESSFULLY_LOADED \ + 12U | OPERATION_MANDATORY_DEBUGGEE_BIT +#define OPERATION_HYPERVISOR_DRIVER_END_OF_IRPS \ + 13U | OPERATION_MANDATORY_DEBUGGEE_BIT +#define OPERATION_COMMAND_FROM_DEBUGGER_RELOAD_SYMBOL \ + 14U | OPERATION_MANDATORY_DEBUGGEE_BIT + +#define OPERATION_NOTIFICATION_FROM_USER_DEBUGGER_PAUSE \ + 15U | OPERATION_MANDATORY_DEBUGGEE_BIT + +////////////////////////////////////////////////// +// Breakpoints & Debug Breakpoints // +////////////////////////////////////////////////// + +/** + * @brief maximum number of buffers to be allocated for a single + * breakpoint + */ +#define MAXIMUM_BREAKPOINTS_WITHOUT_CONTINUE 100 + +/** + * @brief maximum number of thread/process ids to be allocated for a simultaneous + * debugging + * @details it shows the maximum number of threads/processes that HyperDbg sets + * trap flag for them + * + */ +#define MAXIMUM_NUMBER_OF_THREAD_INFORMATION_FOR_TRAPS 200 + +////////////////////////////////////////////////// +// Pool tags used in HyperDbg // +////////////////////////////////////////////////// + +/** + * @brief Pool tag + * + */ +#define POOLTAG 0x48444247 // [H]yper[DBG] (HDBG) + +////////////////////////////////////////////////// +// End of Buffer Detection // +////////////////////////////////////////////////// + +/** + * @brief count of characters for serial end of buffer + */ +#define SERIAL_END_OF_BUFFER_CHARS_COUNT 0x4 + +/** + * @brief characters of the buffer that we set at the end of + * buffers for serial + */ +#define SERIAL_END_OF_BUFFER_CHAR_1 0x00 +#define SERIAL_END_OF_BUFFER_CHAR_2 0x80 +#define SERIAL_END_OF_BUFFER_CHAR_3 0xEE +#define SERIAL_END_OF_BUFFER_CHAR_4 0xFF + +/** + * @brief count of characters for tcp end of buffer + */ +#define TCP_END_OF_BUFFER_CHARS_COUNT 0x4 + +/** + * @brief characters of the buffer that we set at the end of + * buffers for tcp + */ +#define TCP_END_OF_BUFFER_CHAR_1 0x10 +#define TCP_END_OF_BUFFER_CHAR_2 0x20 +#define TCP_END_OF_BUFFER_CHAR_3 0x33 +#define TCP_END_OF_BUFFER_CHAR_4 0x44 + +////////////////////////////////////////////////// +// Name of OS // +////////////////////////////////////////////////// + +/** + * @brief maximum name for OS name buffer + * + */ +#define MAXIMUM_CHARACTER_FOR_OS_NAME 256 + +////////////////////////////////////////////////// +// Processor Details // +////////////////////////////////////////////////// + +/** + * @brief maximum instruction size in Intel + */ +#define MAXIMUM_INSTR_SIZE 16 + +/** + * @brief maximum size for call instruction in Intel + */ +#define MAXIMUM_CALL_INSTR_SIZE 7 + +////////////////////////////////////////////////// +// Symbols Details // +////////////////////////////////////////////////// + +/** + * @brief maximum supported modules to load + * their symbol information + */ +#define MAXIMUM_SUPPORTED_SYMBOLS 1000 + +/** + * @brief maximum size for GUID and Age of PE + * @detail It seems that 33 bytes is enough but let's + * have more space because there might be sth that we + * missed :) + */ +#define MAXIMUM_GUID_AND_AGE_SIZE 60 + +////////////////////////////////////////////////// +// Debuggee Communication // +////////////////////////////////////////////////// + +/** + * @brief constant indicator of a HyperDbg packet + * @warning used in hwdbg + * + */ +#define INDICATOR_OF_HYPERDBG_PACKET \ + 0x4859504552444247 // HYPERDBG = 0x4859504552444247 + +////////////////////////////////////////////////// +// Command Details // +////////////////////////////////////////////////// + +/** + * @brief maximum results that will be returned by !s* s* + * command + * + */ +#define MaximumSearchResults 0x1000 + +////////////////////////////////////////////////// +// Script Engine // +////////////////////////////////////////////////// + +/** + * @brief EFLAGS/RFLAGS + * + */ +#define X86_FLAGS_CF (1 << 0) +#define X86_FLAGS_PF (1 << 2) +#define X86_FLAGS_AF (1 << 4) +#define X86_FLAGS_ZF (1 << 6) +#define X86_FLAGS_SF (1 << 7) +#define X86_FLAGS_TF (1 << 8) +#define X86_FLAGS_IF (1 << 9) +#define X86_FLAGS_DF (1 << 10) +#define X86_FLAGS_OF (1 << 11) +#define X86_FLAGS_STATUS_MASK (0xfff) +#define X86_FLAGS_IOPL_MASK (3 << 12) +#define X86_FLAGS_IOPL_SHIFT (12) +#define X86_FLAGS_IOPL_SHIFT_2ND_BIT (13) +#define X86_FLAGS_NT (1 << 14) +#define X86_FLAGS_RF (1 << 16) +#define X86_FLAGS_VM (1 << 17) +#define X86_FLAGS_AC (1 << 18) +#define X86_FLAGS_VIF (1 << 19) +#define X86_FLAGS_VIP (1 << 20) +#define X86_FLAGS_ID (1 << 21) +#define X86_FLAGS_RESERVED_ONES 0x2 +#define X86_FLAGS_RESERVED 0xffc0802a + +#define X86_FLAGS_RESERVED_BITS 0xffc38028 +#define X86_FLAGS_FIXED 0x00000002 + +#ifndef LOWORD +# define LOWORD(l) ((WORD)(l)) +#endif // !LOWORD + +#ifndef HIWORD +# define HIWORD(l) ((WORD)(((DWORD)(l) >> 16) & 0xFFFF)) +#endif // !HIWORD + +#ifndef LOBYTE +# define LOBYTE(w) ((BYTE)(w)) +#endif // !LOBYTE + +#ifndef HIBYTE +# define HIBYTE(w) ((BYTE)(((WORD)(w) >> 8) & 0xFF)) +#endif // !HIBYTE + +#define MAX_TEMP_COUNT 128 + +// TODO: Extract number of variables from input of ScriptEngine +// and allocate variableList Dynamically. +#define MAX_VAR_COUNT 512 + +#define MAX_FUNCTION_NAME_LENGTH 32 + +////////////////////////////////////////////////// +// Debugger // +////////////////////////////////////////////////// + +/** + * @brief Apply event modifications to all tags + * + */ +#define DEBUGGER_MODIFY_EVENTS_APPLY_TO_ALL_TAG 0xffffffffffffffff + +/** + * @brief Maximum length for a function (to be used in showing distance + * from symbol functions in the 'u' command) + * + */ +#define DISASSEMBLY_MAXIMUM_DISTANCE_FROM_OBJECT_NAME 0xffff + +/** + * @brief Read and write MSRs to all cores + * + */ +#define DEBUGGER_READ_AND_WRITE_ON_MSR_APPLY_ALL_CORES 0xffffffff + +/** + * @brief Apply the event to all the cores + * + */ +#define DEBUGGER_DEBUGGEE_IS_RUNNING_NO_CORE 0xffffffff + +/** + * @brief Apply the event to all the cores + * + */ +#define DEBUGGER_EVENT_APPLY_TO_ALL_CORES 0xffffffff + +/** + * @brief Apply the event to all the processes + * + */ +#define DEBUGGER_EVENT_APPLY_TO_ALL_PROCESSES 0xffffffff + +/** + * @brief Apply to all Model Specific Registers + * + */ +#define DEBUGGER_EVENT_MSR_READ_OR_WRITE_ALL_MSRS 0xffffffff + +/** + * @brief Apply to all first 32 exceptions + * + */ +#define DEBUGGER_EVENT_EXCEPTIONS_ALL_FIRST_32_ENTRIES 0xffffffff + +/** + * @brief Apply to all syscalls and sysrets + * + */ +#define DEBUGGER_EVENT_SYSCALL_ALL_SYSRET_OR_SYSCALLS 0xffffffff + +/** + * @brief Apply to all I/O ports + * + */ +#define DEBUGGER_EVENT_ALL_IO_PORTS 0xffffffff + +/** + * @brief The constant to apply to all cores for bp command + * + */ +#define DEBUGGEE_BP_APPLY_TO_ALL_CORES 0xffffffff + +/** + * @brief The constant to apply to all processes for bp command + * + */ +#define DEBUGGEE_BP_APPLY_TO_ALL_PROCESSES 0xffffffff + +/** + * @brief The constant to apply to all threads for bp command + * + */ +#define DEBUGGEE_BP_APPLY_TO_ALL_THREADS 0xffffffff + +/** + * @brief for reading all registers in r command. + * + */ +#define DEBUGGEE_SHOW_ALL_REGISTERS 0xffffffff + + +//..\..\..\bin\debug\SDK\Headers\DataTypes.h +/** + * @file DataTypes.h + * @author Sina Karvandi (sina@hyperdbg.org) + * @brief HyperDbg's SDK data type definitions + * @details This file contains definitions of structures, enums, etc. + * used in HyperDbg + * @version 0.2 + * @date 2022-06-22 + * + * @copyright This project is released under the GNU Public License v3. + * + */ +#pragma once + +////////////////////////////////////////////////// +// Memory Stages // +////////////////////////////////////////////////// + +/** + * @brief Different levels of paging + * + */ +typedef enum _PAGING_LEVEL +{ + PagingLevelPageTable = 0, + PagingLevelPageDirectory, + PagingLevelPageDirectoryPointerTable, + PagingLevelPageMapLevel4 +} PAGING_LEVEL; + +////////////////////////////////////////////////// +// Pool Manager // +////////////////////////////////////////////////// + +/** + * @brief Inum of intentions for buffers (buffer tag) + * + */ +typedef enum _POOL_ALLOCATION_INTENTION +{ + TRACKING_HOOKED_PAGES, + EXEC_TRAMPOLINE, + SPLIT_2MB_PAGING_TO_4KB_PAGE, + DETOUR_HOOK_DETAILS, + BREAKPOINT_DEFINITION_STRUCTURE, + PROCESS_THREAD_HOLDER, + + // + // Instant event buffers + // + INSTANT_REGULAR_EVENT_BUFFER, + INSTANT_BIG_EVENT_BUFFER, + INSTANT_REGULAR_EVENT_ACTION_BUFFER, + INSTANT_BIG_EVENT_ACTION_BUFFER, + + // + // Use for request safe buffers of the event + // + INSTANT_REGULAR_SAFE_BUFFER_FOR_EVENTS, + INSTANT_BIG_SAFE_BUFFER_FOR_EVENTS, + +} POOL_ALLOCATION_INTENTION; + +////////////////////////////////////////////////// +// Debug Registers Modifications // +////////////////////////////////////////////////// + +typedef enum _DEBUG_REGISTER_TYPE +{ + BREAK_ON_INSTRUCTION_FETCH, + BREAK_ON_WRITE_ONLY, + BREAK_ON_IO_READ_OR_WRITE_NOT_SUPPORTED, + BREAK_ON_READ_AND_WRITE_BUT_NOT_FETCH +} DEBUG_REGISTER_TYPE; + +////////////////////////////////////////////////// +// Execution Stages // +////////////////////////////////////////////////// + +typedef enum _VMX_EXECUTION_MODE +{ + VmxExecutionModeNonRoot = FALSE, + VmxExecutionModeRoot = TRUE +} VMX_EXECUTION_MODE; + +/** + * @brief Type of calling the event + * + */ +typedef enum _VMM_CALLBACK_EVENT_CALLING_STAGE_TYPE +{ + VMM_CALLBACK_CALLING_STAGE_INVALID_EVENT_EMULATION = 0, + VMM_CALLBACK_CALLING_STAGE_PRE_EVENT_EMULATION = 1, + VMM_CALLBACK_CALLING_STAGE_POST_EVENT_EMULATION = 2, + VMM_CALLBACK_CALLING_STAGE_ALL_EVENT_EMULATION = 3 + +} VMM_CALLBACK_EVENT_CALLING_STAGE_TYPE; + +/** + * @brief enum to query different process and thread interception mechanisms + * + */ +typedef enum _DEBUGGER_THREAD_PROCESS_TRACING +{ + + DEBUGGER_THREAD_PROCESS_TRACING_INTERCEPT_CLOCK_INTERRUPTS_FOR_THREAD_CHANGE, + DEBUGGER_THREAD_PROCESS_TRACING_INTERCEPT_CLOCK_INTERRUPTS_FOR_PROCESS_CHANGE, + DEBUGGER_THREAD_PROCESS_TRACING_INTERCEPT_CLOCK_DEBUG_REGISTER_INTERCEPTION, + DEBUGGER_THREAD_PROCESS_TRACING_INTERCEPT_CLOCK_WAITING_FOR_MOV_CR3_VM_EXITS, + +} DEBUGGER_THREAD_PROCESS_TRACING; + +////////////////////////////////////////////////// +// Callback Definitions // +////////////////////////////////////////////////// + +/** + * @brief Callback type that can be used to be used + * as a custom ShowMessages function + * + */ +typedef int (*Callback)(const char * Text); + +////////////////////////////////////////////////// +// Communications // +////////////////////////////////////////////////// + +/** + * @brief The structure of user-input packet in HyperDbg + * + */ +typedef struct _DEBUGGEE_USER_INPUT_PACKET +{ + UINT32 CommandLen; + BOOLEAN IgnoreFinishedSignal; + UINT32 Result; + + // + // The user's input is here + // + +} DEBUGGEE_USER_INPUT_PACKET, *PDEBUGGEE_USER_INPUT_PACKET; + +/** + * @brief The structure of user-input packet in HyperDbg + * + */ +typedef struct _DEBUGGEE_EVENT_AND_ACTION_HEADER_FOR_REMOTE_PACKET +{ + UINT32 Length; + + // + // The buffer for event and action is here + // + +} DEBUGGEE_EVENT_AND_ACTION_HEADER_FOR_REMOTE_PACKET, + *PDEBUGGEE_EVENT_AND_ACTION_HEADER_FOR_REMOTE_PACKET; + +////////////////////////////////////////////////// +// Pausing // +////////////////////////////////////////////////// + +#define SIZEOF_DEBUGGER_PAUSE_PACKET_RECEIVED \ + sizeof(DEBUGGER_PAUSE_PACKET_RECEIVED) + +/** + * @brief request to pause and halt the system + * + */ +typedef struct _DEBUGGER_PAUSE_PACKET_RECEIVED +{ + UINT32 Result; // Result from kernel + +} DEBUGGER_PAUSE_PACKET_RECEIVED, *PDEBUGGER_PAUSE_PACKET_RECEIVED; + +/* ============================================================================================== + */ + +/** + * @brief The structure of detail of a triggered event in HyperDbg + * @details This structure is also used for transferring breakpoint ids, RIP as the context, etc. + * + */ +typedef struct _DEBUGGER_TRIGGERED_EVENT_DETAILS +{ + UINT64 Tag; /* in breakpoints Tag is breakpoint id, not event tag */ + PVOID Context; + VMM_CALLBACK_EVENT_CALLING_STAGE_TYPE Stage; + +} DEBUGGER_TRIGGERED_EVENT_DETAILS, *PDEBUGGER_TRIGGERED_EVENT_DETAILS; + +/* ============================================================================================== + */ + +/** + * @brief The structure of pausing packet in kHyperDbg + * + */ +typedef struct _DEBUGGEE_KD_PAUSED_PACKET +{ + UINT64 Rip; + BOOLEAN IsProcessorOn32BitMode; // if true shows that the address should be interpreted in 32-bit mode + BOOLEAN IgnoreDisassembling; // if check if diassembling should be ignored or not + DEBUGGEE_PAUSING_REASON PausingReason; + ULONG CurrentCore; + UINT64 EventTag; + VMM_CALLBACK_EVENT_CALLING_STAGE_TYPE EventCallingStage; + UINT64 Rflags; + BYTE InstructionBytesOnRip[MAXIMUM_INSTR_SIZE]; + UINT16 ReadInstructionLen; + +} DEBUGGEE_KD_PAUSED_PACKET, *PDEBUGGEE_KD_PAUSED_PACKET; + +/* ============================================================================================== + */ + +/** + * @brief The structure of pausing packet in uHyperDbg + * + */ +typedef struct _DEBUGGEE_UD_PAUSED_PACKET +{ + UINT64 Rip; + UINT64 ProcessDebuggingToken; + BOOLEAN Is32Bit; // if true shows that the address should be interpreted in 32-bit mode + DEBUGGEE_PAUSING_REASON PausingReason; + UINT32 ProcessId; + UINT32 ThreadId; + UINT64 Rflags; + UINT64 EventTag; + VMM_CALLBACK_EVENT_CALLING_STAGE_TYPE EventCallingStage; + BYTE InstructionBytesOnRip[MAXIMUM_INSTR_SIZE]; + UINT16 ReadInstructionLen; + GUEST_REGS GuestRegs; + +} DEBUGGEE_UD_PAUSED_PACKET, *PDEBUGGEE_UD_PAUSED_PACKET; + +/** + * @brief check so the DEBUGGEE_UD_PAUSED_PACKET should be smaller than packet size + * + */ +static_assert(sizeof(DEBUGGEE_UD_PAUSED_PACKET) < PacketChunkSize, + "err (static_assert), size of PacketChunkSize should be bigger than DEBUGGEE_UD_PAUSED_PACKET"); + +////////////////////////////////////////////////// +// Message Tracing Enums // +////////////////////////////////////////////////// + +/** + * @brief Type of transferring buffer between user-to-kernel + * + */ +typedef enum _NOTIFY_TYPE +{ + IRP_BASED, + EVENT_BASED +} NOTIFY_TYPE; + +////////////////////////////////////////////////// +// Structures // +////////////////////////////////////////////////// + +/** + * @brief The structure of message packet in HyperDbg + * + */ +typedef struct _DEBUGGEE_MESSAGE_PACKET +{ + UINT32 OperationCode; + CHAR Message[PacketChunkSize]; + +} DEBUGGEE_MESSAGE_PACKET, *PDEBUGGEE_MESSAGE_PACKET; + +/** + * @brief Used to register event for transferring buffer between user-to-kernel + * + */ +typedef struct _REGISTER_NOTIFY_BUFFER +{ + NOTIFY_TYPE Type; + HANDLE hEvent; + +} REGISTER_NOTIFY_BUFFER, *PREGISTER_NOTIFY_BUFFER; + +////////////////////////////////////////////////// +// Direct VMCALL // +////////////////////////////////////////////////// + +/** + * @brief Used for sending direct VMCALLs on the VMX root-mode + * + */ +typedef struct _DIRECT_VMCALL_PARAMETERS +{ + UINT64 OptionalParam1; + UINT64 OptionalParam2; + UINT64 OptionalParam3; + +} DIRECT_VMCALL_PARAMETERS, *PDIRECT_VMCALL_PARAMETERS; + +////////////////////////////////////////////////// +// EPT Hook // +////////////////////////////////////////////////// + +/** + * @brief different type of memory addresses + * + */ +typedef enum _DEBUGGER_HOOK_MEMORY_TYPE +{ + DEBUGGER_MEMORY_HOOK_VIRTUAL_ADDRESS, + DEBUGGER_MEMORY_HOOK_PHYSICAL_ADDRESS +} DEBUGGER_HOOK_MEMORY_TYPE; + +/** + * @brief Temporary $context used in some EPT hook commands + * + */ +typedef struct _EPT_HOOKS_CONTEXT +{ + UINT64 HookingTag; // This is same as the event tag + UINT64 PhysicalAddress; + UINT64 VirtualAddress; +} EPT_HOOKS_CONTEXT, *PEPT_HOOKS_CONTEXT; + +/** + * @brief Setting details for EPT Hooks (!monitor) + * + */ +typedef struct _EPT_HOOKS_ADDRESS_DETAILS_FOR_MEMORY_MONITOR +{ + UINT64 StartAddress; + UINT64 EndAddress; + BOOLEAN SetHookForRead; + BOOLEAN SetHookForWrite; + BOOLEAN SetHookForExec; + DEBUGGER_HOOK_MEMORY_TYPE MemoryType; + UINT64 Tag; + +} EPT_HOOKS_ADDRESS_DETAILS_FOR_MEMORY_MONITOR, *PEPT_HOOKS_ADDRESS_DETAILS_FOR_MEMORY_MONITOR; + +/** + * @brief Setting details for EPT Hooks (!epthook2) + * + */ +typedef struct _EPT_HOOKS_ADDRESS_DETAILS_FOR_EPTHOOK2 +{ + PVOID TargetAddress; + PVOID HookFunction; + +} EPT_HOOKS_ADDRESS_DETAILS_FOR_EPTHOOK2, *PEPT_HOOKS_ADDRESS_DETAILS_FOR_EPTHOOK2; + +/** + * @brief Details of unhooking single EPT hooks + * + */ +typedef struct _EPT_SINGLE_HOOK_UNHOOKING_DETAILS +{ + BOOLEAN CallerNeedsToRestoreEntryAndInvalidateEpt; + BOOLEAN RemoveBreakpointInterception; + SIZE_T PhysicalAddress; + UINT64 /* EPT_PML1_ENTRY */ OriginalEntry; + +} EPT_SINGLE_HOOK_UNHOOKING_DETAILS, *PEPT_SINGLE_HOOK_UNHOOKING_DETAILS; + +////////////////////////////////////////////////// +// Segment Types // +////////////////////////////////////////////////// + +/** + * @brief Describe segment selector in VMX + * @details This structure is copied from ia32.h to the SDK to + * be used as a data type for functions + * + */ +typedef union +{ + struct + { + /** + * [Bits 3:0] Segment type. + */ + UINT32 Type : 4; + + /** + * [Bit 4] S - Descriptor type (0 = system; 1 = code or data). + */ + UINT32 DescriptorType : 1; + + /** + * [Bits 6:5] DPL - Descriptor privilege level. + */ + UINT32 DescriptorPrivilegeLevel : 2; + + /** + * [Bit 7] P - Segment present. + */ + UINT32 Present : 1; + + UINT32 Reserved1 : 4; + + /** + * [Bit 12] AVL - Available for use by system software. + */ + UINT32 AvailableBit : 1; + + /** + * [Bit 13] Reserved (except for CS). L - 64-bit mode active (for CS only). + */ + UINT32 LongMode : 1; + + /** + * [Bit 14] D/B - Default operation size (0 = 16-bit segment; 1 = 32-bit segment). + */ + UINT32 DefaultBig : 1; + + /** + * [Bit 15] G - Granularity. + */ + UINT32 Granularity : 1; + /** + * [Bit 16] Segment unusable (0 = usable; 1 = unusable). + */ + UINT32 Unusable : 1; + UINT32 Reserved2 : 15; + }; + + UINT32 AsUInt; +} VMX_SEGMENT_ACCESS_RIGHTS_TYPE; + +/** + * @brief Segment selector + * + */ +typedef struct _VMX_SEGMENT_SELECTOR +{ + UINT16 Selector; + VMX_SEGMENT_ACCESS_RIGHTS_TYPE Attributes; + UINT32 Limit; + UINT64 Base; +} VMX_SEGMENT_SELECTOR, *PVMX_SEGMENT_SELECTOR; + + +//..\..\..\bin\debug\SDK\Headers\ErrorCodes.h +/** + * @file ErrorCodes.h + * @author Sina Karvandi (sina@hyperdbg.org) + * @brief HyperDbg's SDK Error codes + * @details This file contains definitions of error codes used in HyperDbg + * @version 0.2 + * @date 2022-06-24 + * + * @copyright This project is released under the GNU Public License v3. + * + */ +#pragma once + +////////////////////////////////////////////////// +// Success Codes // +////////////////////////////////////////////////// + +/** + * @brief General value to indicate that the operation or + * request was successful + * + */ +#define DEBUGGER_OPERATION_WAS_SUCCESSFUL 0xFFFFFFFF + +////////////////////////////////////////////////// +// Error Codes // +////////////////////////////////////////////////// + +/** + * @brief error, the tag not exist + * + */ +#define DEBUGGER_ERROR_TAG_NOT_EXISTS 0xc0000000 + +/** + * @brief error, invalid type of action + * + */ +#define DEBUGGER_ERROR_INVALID_ACTION_TYPE 0xc0000001 + +/** + * @brief error, the action buffer size is invalid + * + */ +#define DEBUGGER_ERROR_ACTION_BUFFER_SIZE_IS_ZERO 0xc0000002 + +/** + * @brief error, the event type is unknown + * + */ +#define DEBUGGER_ERROR_EVENT_TYPE_IS_INVALID 0xc0000003 + +/** + * @brief error, enable to create event + * + */ +#define DEBUGGER_ERROR_UNABLE_TO_CREATE_EVENT 0xc0000004 + +/** + * @brief error, invalid address specified for debugger + * + */ +#define DEBUGGER_ERROR_INVALID_ADDRESS 0xc0000005 + +/** + * @brief error, the core id is invalid + * + */ +#define DEBUGGER_ERROR_INVALID_CORE_ID 0xc0000006 + +/** + * @brief error, the index is greater than 32 in !exception command + * + */ +#define DEBUGGER_ERROR_EXCEPTION_INDEX_EXCEED_FIRST_32_ENTRIES 0xc0000007 + +/** + * @brief error, the index for !interrupt command is not between 32 to 256 + * + */ +#define DEBUGGER_ERROR_INTERRUPT_INDEX_IS_NOT_VALID 0xc0000008 + +/** + * @brief error, unable to hide the debugger and enter to transparent-mode + * + */ +#define DEBUGGER_ERROR_UNABLE_TO_HIDE_OR_UNHIDE_DEBUGGER 0xc0000009 + +/** + * @brief error, the debugger is already in transparent-mode + * + */ +#define DEBUGGER_ERROR_DEBUGGER_ALREADY_UHIDE 0xc000000a + +/** + * @brief error, invalid parameters in !e* e* commands + * + */ +#define DEBUGGER_ERROR_EDIT_MEMORY_STATUS_INVALID_PARAMETER 0xc000000b + +/** + * @brief error, an invalid address is specified based on current cr3 + * in !e* or e* commands + * + */ +#define DEBUGGER_ERROR_EDIT_MEMORY_STATUS_INVALID_ADDRESS_BASED_ON_CURRENT_PROCESS \ + 0xc000000c + +/** + * @brief error, an invalid address is specified based on anotehr process's cr3 + * in !e* or e* commands + * + */ +#define DEBUGGER_ERROR_EDIT_MEMORY_STATUS_INVALID_ADDRESS_BASED_ON_OTHER_PROCESS \ + 0xc000000d + +/** + * @brief error, invalid tag for 'events' command (tag id is unknown for kernel) + * + */ +#define DEBUGGER_ERROR_MODIFY_EVENTS_INVALID_TAG 0xc000000e + +/** + * @brief error, type of action (enable/disable/clear) is wrong + * + */ +#define DEBUGGER_ERROR_MODIFY_EVENTS_INVALID_TYPE_OF_ACTION 0xc000000f + +/** + * @brief error, invalid parameters steppings actions + * + */ +#define DEBUGGER_ERROR_STEPPING_INVALID_PARAMETER 0xc0000010 + +/** + * @brief error, thread is invalid (not found) or disabled in + * stepping (step-in & step-out) requests + * + */ +#define DEBUGGER_ERROR_STEPPINGS_EITHER_THREAD_NOT_FOUND_OR_DISABLED 0xc0000011 + +/** + * @brief error, baud rate is invalid + * + */ +#define DEBUGGER_ERROR_PREPARING_DEBUGGEE_INVALID_BAUDRATE 0xc0000012 + +/** + * @brief error, serial port address is invalid + * + */ +#define DEBUGGER_ERROR_PREPARING_DEBUGGEE_INVALID_SERIAL_PORT 0xc0000013 + +/** + * @brief error, invalid core selected in changing core in remote debuggee + * + */ +#define DEBUGGER_ERROR_PREPARING_DEBUGGEE_INVALID_CORE_IN_REMOTE_DEBUGGE \ + 0xc0000014 + +/** + * @brief error, invalid process selected in changing process in remote debuggee + * + */ +#define DEBUGGER_ERROR_PREPARING_DEBUGGEE_UNABLE_TO_SWITCH_TO_NEW_PROCESS \ + 0xc0000015 + +/** + * @brief error, unable to run script in remote debuggee + * + */ +#define DEBUGGER_ERROR_PREPARING_DEBUGGEE_TO_RUN_SCRIPT 0xc0000016 + +/** + * @brief error, invalid register number + * + */ +#define DEBUGGER_ERROR_INVALID_REGISTER_NUMBER 0xc0000017 + +/** + * @brief error, maximum pools were used without continuing debuggee + * + */ +#define DEBUGGER_ERROR_MAXIMUM_BREAKPOINT_WITHOUT_CONTINUE 0xc0000018 + +/** + * @brief error, breakpoint already exists on the target address + * + */ +#define DEBUGGER_ERROR_BREAKPOINT_ALREADY_EXISTS_ON_THE_ADDRESS 0xc0000019 + +/** + * @brief error, breakpoint id not found + * + */ +#define DEBUGGER_ERROR_BREAKPOINT_ID_NOT_FOUND 0xc000001a + +/** + * @brief error, breakpoint already disabled + * + */ +#define DEBUGGER_ERROR_BREAKPOINT_ALREADY_DISABLED 0xc000001b + +/** + * @brief error, breakpoint already enabled + * + */ +#define DEBUGGER_ERROR_BREAKPOINT_ALREADY_ENABLED 0xc000001c + +/** + * @brief error, memory type is invalid + * + */ +#define DEBUGGER_ERROR_MEMORY_TYPE_INVALID 0xc000001d + +/** + * @brief error, the process id is invalid + * + */ +#define DEBUGGER_ERROR_INVALID_PROCESS_ID 0xc000001e + +/** + * @brief error, for event specific reasons the event is not + * applied + * + */ +#define DEBUGGER_ERROR_EVENT_IS_NOT_APPLIED 0xc000001f + +/** + * @brief error, for process switch or process details, invalid parameter + * + */ +#define DEBUGGER_ERROR_DETAILS_OR_SWITCH_PROCESS_INVALID_PARAMETER 0xc0000020 + +/** + * @brief error, for thread switch or thread details, invalid parameter + * + */ +#define DEBUGGER_ERROR_DETAILS_OR_SWITCH_THREAD_INVALID_PARAMETER 0xc0000021 + +/** + * @brief error, maximum breakpoint for a single page is hit + * + */ +#define DEBUGGER_ERROR_MAXIMUM_BREAKPOINT_FOR_A_SINGLE_PAGE_IS_HIT 0xc0000022 + +/** + * @brief error, there is no pre-allocated buffer + * + */ +#define DEBUGGER_ERROR_PRE_ALLOCATED_BUFFER_IS_EMPTY 0xc0000023 + +/** + * @brief error, in the EPT handler, it could not split the 2MB pages to + * 512 entries of 4 KB pages + * + */ +#define DEBUGGER_ERROR_EPT_COULD_NOT_SPLIT_THE_LARGE_PAGE_TO_4KB_PAGES 0xc0000024 + +/** + * @brief error, failed to get PML1 entry of the target address + * + */ +#define DEBUGGER_ERROR_EPT_FAILED_TO_GET_PML1_ENTRY_OF_TARGET_ADDRESS 0xc0000025 + +/** + * @brief error, multiple EPT Hooks or Monitors are applied on a single page + * + */ +#define DEBUGGER_ERROR_EPT_MULTIPLE_HOOKS_IN_A_SINGLE_PAGE 0xc0000026 + +/** + * @brief error, could not build the EPT Hook + * + */ +#define DEBUGGER_ERROR_COULD_NOT_BUILD_THE_EPT_HOOK 0xc0000027 + +/** + * @brief error, could not find the type of allocation + * + */ +#define DEBUGGER_ERROR_COULD_NOT_FIND_ALLOCATION_TYPE 0xc0000028 + +/** + * @brief error, could not find the index of test query + * + */ +#define DEBUGGER_ERROR_INVALID_TEST_QUERY_INDEX 0xc0000029 + +/** + * @brief error, failed to attach to the target user-mode process + * + */ +#define DEBUGGER_ERROR_UNABLE_TO_ATTACH_TO_TARGET_USER_MODE_PROCESS 0xc000002a + +/** + * @brief error, failed to remove hooks as entrypoint is not reached yet + * @details The caller of this functionality should keep sending the previous + * IOCTL until the hook is remove successfully + * + */ +#define DEBUGGER_ERROR_UNABLE_TO_REMOVE_HOOKS_ENTRYPOINT_NOT_REACHED 0xc000002b + +/** + * @brief error, could not remove the previous hook + * + */ +#define DEBUGGER_ERROR_UNABLE_TO_REMOVE_HOOKS 0xc000002c + +/** + * @brief error, the needed routines for debugging is not initialized + * + */ +#define DEBUGGER_ERROR_FUNCTIONS_FOR_INITIALIZING_PEB_ADDRESSES_ARE_NOT_INITIALIZED 0xc000002d + +/** + * @brief error, unable to get 32-bit or 64-bit of the target process + * + */ +#define DEBUGGER_ERROR_UNABLE_TO_DETECT_32_BIT_OR_64_BIT_PROCESS 0xc000002e + +/** + * @brief error, unable to kill the target process + * + */ +#define DEBUGGER_ERROR_UNABLE_TO_KILL_THE_PROCESS 0xc000002f + +/** + * @brief error, invalid thread debugging token + * + */ +#define DEBUGGER_ERROR_INVALID_THREAD_DEBUGGING_TOKEN 0xc0000030 + +/** + * @brief error, unable to pause the process's threads + * + */ +#define DEBUGGER_ERROR_UNABLE_TO_PAUSE_THE_PROCESS_THREADS 0xc0000031 + +/** + * @brief error, user debugger already attached to this process + * + */ +#define DEBUGGER_ERROR_UNABLE_TO_ATTACH_TO_AN_ALREADY_ATTACHED_PROCESS 0xc0000032 + +/** + * @brief error, the user debugger is not attached to the target process + * + */ +#define DEBUGGER_ERROR_THE_USER_DEBUGGER_NOT_ATTACHED_TO_THE_PROCESS 0xc0000033 + +/** + * @brief error, cannot detach from the process as there are paused threads + * + */ +#define DEBUGGER_ERROR_UNABLE_TO_DETACH_AS_THERE_ARE_PAUSED_THREADS 0xc0000034 + +/** + * @brief error, cannot switch to new thread as the process id or thread id is not found + * + */ +#define DEBUGGER_ERROR_UNABLE_TO_SWITCH_PROCESS_ID_OR_THREAD_ID_IS_INVALID 0xc0000035 + +/** + * @brief error, cannot switch to new thread the process doesn't contain an active thread + * + */ +#define DEBUGGER_ERROR_UNABLE_TO_SWITCH_THERE_IS_NO_THREAD_ON_THE_PROCESS 0xc0000036 + +/** + * @brief error, unable to get modules + * + */ +#define DEBUGGER_ERROR_UNABLE_TO_GET_MODULES_OF_THE_PROCESS 0xc0000037 + +/** + * @brief error, unable to get the callstack + * + */ +#define DEBUGGER_ERROR_UNABLE_TO_GET_CALLSTACK 0xc0000038 + +/** + * @brief error, unable to query count of processes or threads + * + */ +#define DEBUGGER_ERROR_UNABLE_TO_QUERY_COUNT_OF_PROCESSES_OR_THREADS 0xc0000039 + +/** + * @brief error, using short-circuiting event with post-event mode is + * not supported in HyperDbg + * + */ +#define DEBUGGER_ERROR_USING_SHORT_CIRCUITING_EVENT_WITH_POST_EVENT_MODE_IS_FORBIDDEDN 0xc000003a + +/** + * @brief error, unknown test query is received + * + */ +#define DEBUGGER_ERROR_UNKNOWN_TEST_QUERY_RECEIVED 0xc000003b + +/** + * @brief error, for reading from memory in case of invalid parameters + * + */ +#define DEBUGGER_ERROR_READING_MEMORY_INVALID_PARAMETER 0xc000003c + +/** + * @brief error, the list of threads/process trap flag is full + * + */ +#define DEBUGGER_ERROR_THE_TRAP_FLAG_LIST_IS_FULL 0xc000003d + +/** + * @brief error, unable to kill the target process. process does not exists + * + */ +#define DEBUGGER_ERROR_UNABLE_TO_KILL_THE_PROCESS_DOES_NOT_EXISTS 0xc000003e + +/** + * @brief error, the execution mode is incorrect + * + */ +#define DEBUGGER_ERROR_MODE_EXECUTION_IS_INVALID 0xc000003f + +/** + * @brief error, the process id cannot be specified while the debugger is in VMX-root mode + * + */ +#define DEBUGGER_ERROR_PROCESS_ID_CANNOT_BE_SPECIFIED_WHILE_APPLYING_EVENT_FROM_VMX_ROOT_MODE 0xc0000040 + +/** + * @brief error, the preallocated buffer is not enough for storing event+conditional buffer + * + */ +#define DEBUGGER_ERROR_INSTANT_EVENT_PREALLOCATED_BUFFER_IS_NOT_ENOUGH_FOR_EVENT_AND_CONDITIONALS 0xc0000041 + +/** + * @brief error, the regular preallocated buffer not found + * + */ +#define DEBUGGER_ERROR_INSTANT_EVENT_REGULAR_PREALLOCATED_BUFFER_NOT_FOUND 0xc0000042 + +/** + * @brief error, the big preallocated buffer not found + * + */ +#define DEBUGGER_ERROR_INSTANT_EVENT_BIG_PREALLOCATED_BUFFER_NOT_FOUND 0xc0000043 + +/** + * @brief error, enable to create action (cannot allocate buffer) + * + */ +#define DEBUGGER_ERROR_UNABLE_TO_CREATE_ACTION_CANNOT_ALLOCATE_BUFFER 0xc0000044 + +/** + * @brief error, the regular preallocated buffer not found (for action) + * + */ +#define DEBUGGER_ERROR_INSTANT_EVENT_ACTION_REGULAR_PREALLOCATED_BUFFER_NOT_FOUND 0xc0000045 + +/** + * @brief error, the big preallocated buffer not found (for action) + * + */ +#define DEBUGGER_ERROR_INSTANT_EVENT_ACTION_BIG_PREALLOCATED_BUFFER_NOT_FOUND 0xc0000046 + +/** + * @brief error, the preallocated buffer is not enough for storing action buffer + * + */ +#define DEBUGGER_ERROR_INSTANT_EVENT_PREALLOCATED_BUFFER_IS_NOT_ENOUGH_FOR_ACTION_BUFFER 0xc0000047 + +/** + * @brief error, the requested optional buffer is bigger than send/receive stack of the debugger + * + */ +#define DEBUGGER_ERROR_INSTANT_EVENT_REQUESTED_OPTIONAL_BUFFER_IS_BIGGER_THAN_DEBUGGERS_SEND_RECEIVE_STACK 0xc0000048 + +/** + * @brief error, the requested safe buffer does not exist (regular) + * + */ +#define DEBUGGER_ERROR_INSTANT_EVENT_REGULAR_REQUESTED_SAFE_BUFFER_NOT_FOUND 0xc0000049 + +/** + * @brief error, the requested safe buffer does not exists (big) + * + */ +#define DEBUGGER_ERROR_INSTANT_EVENT_BIG_REQUESTED_SAFE_BUFFER_NOT_FOUND 0xc000004a + +/** + * @brief error, the preallocated buffer is not enough for storing safe requested buffer + * + */ +#define DEBUGGER_ERROR_INSTANT_EVENT_PREALLOCATED_BUFFER_IS_NOT_ENOUGH_FOR_REQUESTED_SAFE_BUFFER 0xc000004b + +/** + * @brief error, enable to create requested safe buffer (cannot allocate buffer) + * + */ +#define DEBUGGER_ERROR_UNABLE_TO_ALLOCATE_REQUESTED_SAFE_BUFFER 0xc000004c + +/** + * @brief error, could not find the type of preactivation + * + */ +#define DEBUGGER_ERROR_COULD_NOT_FIND_PREACTIVATION_TYPE 0xc000004d + +/** + * @brief error, the mode exec trap is not already initialized + * + */ +#define DEBUGGER_ERROR_THE_MODE_EXEC_TRAP_IS_NOT_INITIALIZED 0xc000004e + +/** + * @brief error, the target event(s) is/are disabled but cannot clear them because the buffer of the user-mode + * priority is full + * + */ +#define DEBUGGER_ERROR_THE_TARGET_EVENT_IS_DISABLED_BUT_CANNOT_BE_CLEARED_PRIRITY_BUFFER_IS_FULL 0xc000004f + +/** + * @brief error, not all cores are locked (probably due to a race condition in HyperDbg) in + * instant-event mechanism + * + */ +#define DEBUGGER_ERROR_NOT_ALL_CORES_ARE_LOCKED_FOR_APPLYING_INSTANT_EVENT 0xc0000050 + +/** + * @brief error, switching to the target core is not possible because core is not locked + * (probably due to a race condition in HyperDbg) + * + */ +#define DEBUGGER_ERROR_TARGET_SWITCHING_CORE_IS_NOT_LOCKED 0xc0000051 + +/** + * @brief error, invalid physical address + * + */ +#define DEBUGGER_ERROR_INVALID_PHYSICAL_ADDRESS 0xc0000052 + +// +// WHEN YOU ADD ANYTHING TO THIS LIST OF ERRORS, THEN +// MAKE SURE TO ADD AN ERROR MESSAGE TO ShowErrorMessage(UINT32 Error) +// FUNCTION +// + + +//..\..\..\bin\debug\SDK\Headers\Events.h +/** + * @file Events.h + * @author Sina Karvandi (sina@hyperdbg.org) + * @brief HyperDbg's SDK Headers for Events + * @details This file contains definitions of event datatypes + * @version 0.2 + * @date 2022-06-28 + * + * @copyright This project is released under the GNU Public License v3. + * + */ +#pragma once + +////////////////////////////////////////////////// +// System Events // +////////////////////////////////////////////////// + +/** + * @brief Exceptions enum + * + */ +typedef enum _EXCEPTION_VECTORS +{ + EXCEPTION_VECTOR_DIVIDE_ERROR, + EXCEPTION_VECTOR_DEBUG_BREAKPOINT, + EXCEPTION_VECTOR_NMI, + EXCEPTION_VECTOR_BREAKPOINT, + EXCEPTION_VECTOR_OVERFLOW, + EXCEPTION_VECTOR_BOUND_RANGE_EXCEEDED, + EXCEPTION_VECTOR_UNDEFINED_OPCODE, + EXCEPTION_VECTOR_NO_MATH_COPROCESSOR, + EXCEPTION_VECTOR_DOUBLE_FAULT, + EXCEPTION_VECTOR_RESERVED0, + EXCEPTION_VECTOR_INVALID_TASK_SEGMENT_SELECTOR, + EXCEPTION_VECTOR_SEGMENT_NOT_PRESENT, + EXCEPTION_VECTOR_STACK_SEGMENT_FAULT, + EXCEPTION_VECTOR_GENERAL_PROTECTION_FAULT, + EXCEPTION_VECTOR_PAGE_FAULT, + EXCEPTION_VECTOR_RESERVED1, + EXCEPTION_VECTOR_MATH_FAULT, + EXCEPTION_VECTOR_ALIGNMENT_CHECK, + EXCEPTION_VECTOR_MACHINE_CHECK, + EXCEPTION_VECTOR_SIMD_FLOATING_POINT_NUMERIC_ERROR, + EXCEPTION_VECTOR_VIRTUAL_EXCEPTION, + EXCEPTION_VECTOR_RESERVED2, + EXCEPTION_VECTOR_RESERVED3, + EXCEPTION_VECTOR_RESERVED4, + EXCEPTION_VECTOR_RESERVED5, + EXCEPTION_VECTOR_RESERVED6, + EXCEPTION_VECTOR_RESERVED7, + EXCEPTION_VECTOR_RESERVED8, + EXCEPTION_VECTOR_RESERVED9, + EXCEPTION_VECTOR_RESERVED10, + EXCEPTION_VECTOR_RESERVED11, + EXCEPTION_VECTOR_RESERVED12, + + // + // NT (Windows) specific exception vectors. + // + APC_INTERRUPT = 31, + DPC_INTERRUPT = 47, + CLOCK_INTERRUPT = 209, + IPI_INTERRUPT = 225, + PMI_INTERRUPT = 254, + +} EXCEPTION_VECTORS; + +////////////////////////////////////////////////// +// Callback Enums // +////////////////////////////////////////////////// + +/** + * @brief The status of triggering events + * + */ +typedef enum _VMM_CALLBACK_TRIGGERING_EVENT_STATUS_TYPE +{ + VMM_CALLBACK_TRIGGERING_EVENT_STATUS_SUCCESSFUL_NO_INITIALIZED = 0, + VMM_CALLBACK_TRIGGERING_EVENT_STATUS_SUCCESSFUL = 0, + VMM_CALLBACK_TRIGGERING_EVENT_STATUS_SUCCESSFUL_IGNORE_EVENT = 1, + VMM_CALLBACK_TRIGGERING_EVENT_STATUS_DEBUGGER_NOT_ENABLED = 2, + VMM_CALLBACK_TRIGGERING_EVENT_STATUS_INVALID_EVENT_TYPE = 3, + +} VMM_CALLBACK_TRIGGERING_EVENT_STATUS_TYPE; + +////////////////////////////////////////////////// +// Event Details // +////////////////////////////////////////////////// + +/** + * @brief enum to show type of all HyperDbg events + * + */ +typedef enum _VMM_EVENT_TYPE_ENUM +{ + + // + // EPT Memory Monitoring Events + // + HIDDEN_HOOK_READ_AND_WRITE_AND_EXECUTE, + HIDDEN_HOOK_READ_AND_WRITE, + HIDDEN_HOOK_READ_AND_EXECUTE, + HIDDEN_HOOK_WRITE_AND_EXECUTE, + HIDDEN_HOOK_READ, + HIDDEN_HOOK_WRITE, + HIDDEN_HOOK_EXECUTE, + + // + // EPT Hook Events + // + HIDDEN_HOOK_EXEC_DETOURS, + HIDDEN_HOOK_EXEC_CC, + + // + // System-call Events + // + SYSCALL_HOOK_EFER_SYSCALL, + SYSCALL_HOOK_EFER_SYSRET, + + // + // CPUID Instruction Execution Events + // + CPUID_INSTRUCTION_EXECUTION, + + // + // Model-Specific Registers (MSRs) Reads/Modifications Events + // + RDMSR_INSTRUCTION_EXECUTION, + WRMSR_INSTRUCTION_EXECUTION, + + // + // PMIO Events + // + IN_INSTRUCTION_EXECUTION, + OUT_INSTRUCTION_EXECUTION, + + // + // Interrupts/Exceptions/Faults Events + // + EXCEPTION_OCCURRED, + EXTERNAL_INTERRUPT_OCCURRED, + + // + // Debug Registers Events + // + DEBUG_REGISTERS_ACCESSED, + + // + // Timing & Performance Events + // + TSC_INSTRUCTION_EXECUTION, + PMC_INSTRUCTION_EXECUTION, + + // + // VMCALL Instruction Execution Events + // + VMCALL_INSTRUCTION_EXECUTION, + + // + // Control Registers Events + // + CONTROL_REGISTER_MODIFIED, + CONTROL_REGISTER_READ, + CONTROL_REGISTER_3_MODIFIED, + + // + // Execution Trap Events + // + TRAP_EXECUTION_MODE_CHANGED, + TRAP_EXECUTION_INSTRUCTION_TRACE, + +} VMM_EVENT_TYPE_ENUM; + +/** + * @brief Type of Actions + * + */ +typedef enum _DEBUGGER_EVENT_ACTION_TYPE_ENUM +{ + BREAK_TO_DEBUGGER, + RUN_SCRIPT, + RUN_CUSTOM_CODE + +} DEBUGGER_EVENT_ACTION_TYPE_ENUM; + +/** + * @brief Type of handling !syscall or !sysret + * + */ +typedef enum _DEBUGGER_EVENT_SYSCALL_SYSRET_TYPE +{ + DEBUGGER_EVENT_SYSCALL_SYSRET_SAFE_ACCESS_MEMORY = 0, + DEBUGGER_EVENT_SYSCALL_SYSRET_HANDLE_ALL_UD = 1, + +} DEBUGGER_EVENT_SYSCALL_SYSRET_TYPE; + +#define SIZEOF_DEBUGGER_MODIFY_EVENTS sizeof(DEBUGGER_MODIFY_EVENTS) + +/** + * @brief Type of mode change traps + * + */ +typedef enum _DEBUGGER_EVENT_MODE_TYPE +{ + DEBUGGER_EVENT_MODE_TYPE_USER_MODE_AND_KERNEL_MODE = 1, + DEBUGGER_EVENT_MODE_TYPE_USER_MODE = 3, + DEBUGGER_EVENT_MODE_TYPE_KERNEL_MODE = 0, + DEBUGGER_EVENT_MODE_TYPE_INVALID = 0xffffffff, + +} DEBUGGER_EVENT_MODE_TYPE; + +/** + * @brief Type of tracing events + * + */ +typedef enum _DEBUGGER_EVENT_TRACE_TYPE +{ + DEBUGGER_EVENT_TRACE_TYPE_INVALID = 0, + DEBUGGER_EVENT_TRACE_TYPE_STEP_IN = 1, + DEBUGGER_EVENT_TRACE_TYPE_STEP_OUT = 2, + DEBUGGER_EVENT_TRACE_TYPE_INSTRUMENTATION_STEP_IN = 3, + +} DEBUGGER_EVENT_TRACE_TYPE; + +/** + * @brief different types of modifying events request (enable/disable/clear) + * + */ +typedef enum _DEBUGGER_MODIFY_EVENTS_TYPE +{ + DEBUGGER_MODIFY_EVENTS_QUERY_STATE, + DEBUGGER_MODIFY_EVENTS_ENABLE, + DEBUGGER_MODIFY_EVENTS_DISABLE, + DEBUGGER_MODIFY_EVENTS_CLEAR, +} DEBUGGER_MODIFY_EVENTS_TYPE; + +/** + * @brief request for modifying events (enable/disable/clear) + * + */ +typedef struct _DEBUGGER_MODIFY_EVENTS +{ + UINT64 Tag; // Tag of the target event that we want to modify + UINT64 KernelStatus; // Kernel put the status in this field + DEBUGGER_MODIFY_EVENTS_TYPE + TypeOfAction; // Determines what's the action (enable | disable | clear) + BOOLEAN IsEnabled; // Determines what's the action (enable | disable | clear) + +} DEBUGGER_MODIFY_EVENTS, *PDEBUGGER_MODIFY_EVENTS; + +/** + * @brief request for performing a short-circuiting event + * + */ +typedef struct _DEBUGGER_SHORT_CIRCUITING_EVENT +{ + UINT64 KernelStatus; // Kernel put the status in this field + BOOLEAN IsShortCircuiting; // Determines whether to perform short circuting (on | off) + +} DEBUGGER_SHORT_CIRCUITING_EVENT, *PDEBUGGER_SHORT_CIRCUITING_EVENT; + +////////////////////////////////////////////////// +// Event Options // +////////////////////////////////////////////////// + +/** + * @brief request for performing a short-circuiting event + * + */ +typedef struct _DEBUGGER_EVENT_OPTIONS +{ + UINT64 OptionalParam1; // Optional parameter + UINT64 OptionalParam2; // Optional parameter + UINT64 OptionalParam3; // Optional parameter + UINT64 OptionalParam4; // Optional parameter + UINT64 OptionalParam5; // Optional parameter + UINT64 OptionalParam6; // Optional parameter + +} DEBUGGER_EVENT_OPTIONS, *PDEBUGGER_EVENT_OPTIONS; + +////////////////////////////////////////////////// +// Enums For Event And Debugger Resources // +////////////////////////////////////////////////// + +/** + * @brief Things to consider when applying resources + * + */ +typedef enum _PROTECTED_HV_RESOURCES_PASSING_OVERS +{ + // + // for exception bitmap + // + PASSING_OVER_NONE = 0, + PASSING_OVER_UD_EXCEPTIONS_FOR_SYSCALL_SYSRET_HOOK = 1, + PASSING_OVER_EXCEPTION_EVENTS, + + // + // for external interupts-exitings + // + PASSING_OVER_INTERRUPT_EVENTS, + + // + // for external rdtsc/p exitings + // + PASSING_OVER_TSC_EVENTS, + + // + // for external mov to hardware debug registers exitings + // + PASSING_OVER_MOV_TO_HW_DEBUG_REGS_EVENTS, + + // + // for external mov to control registers exitings + // + PASSING_OVER_MOV_TO_CONTROL_REGS_EVENTS, + +} PROTECTED_HV_RESOURCES_PASSING_OVERS; + +/** + * @brief Type of protected (multi-used) resources + * + */ +typedef enum _PROTECTED_HV_RESOURCES_TYPE +{ + PROTECTED_HV_RESOURCES_EXCEPTION_BITMAP, + + PROTECTED_HV_RESOURCES_EXTERNAL_INTERRUPT_EXITING, + + PROTECTED_HV_RESOURCES_RDTSC_RDTSCP_EXITING, + + PROTECTED_HV_RESOURCES_MOV_TO_DEBUG_REGISTER_EXITING, + + PROTECTED_HV_RESOURCES_MOV_CONTROL_REGISTER_EXITING, + + PROTECTED_HV_RESOURCES_MOV_TO_CR3_EXITING, + +} PROTECTED_HV_RESOURCES_TYPE; + +////////////////////////////////////////////////// +// Event Details // +////////////////////////////////////////////////// + +/** + * @brief Each command is like the following struct, it also used for + * tracing works in user mode and sending it to the kernl mode + * @details THIS IS NOT WHAT HYPERDBG SAVES FOR EVENTS IN KERNEL-MODE + */ +typedef struct _DEBUGGER_GENERAL_EVENT_DETAIL +{ + LIST_ENTRY + CommandsEventList; // Linked-list of commands list (used for tracing purpose + // in user mode) + + time_t CreationTime; // Date of creating this event + + UINT32 CoreId; // determines the core index to apply this event to, if it's + // 0xffffffff means that we have to apply it to all cores + + UINT32 ProcessId; // determines the process id to apply this to + // only that 0xffffffff means that we have to + // apply it to all processes + + BOOLEAN IsEnabled; + + BOOLEAN EnableShortCircuiting; // indicates whether the short-circuiting event + // is enabled or not for this event + + VMM_CALLBACK_EVENT_CALLING_STAGE_TYPE EventStage; // reveals the calling stage of the event + // (whether it's a all- pre- or post- event) + + BOOLEAN HasCustomOutput; // Shows whether this event has a custom output + // source or not + + UINT64 + OutputSourceTags + [DebuggerOutputSourceMaximumRemoteSourceForSingleEvent]; // tags of + // multiple + // sources which + // can be used to + // send the event + // results of + // scripts to + // remote sources + + UINT32 CountOfActions; + + UINT64 Tag; // is same as operation code + VMM_EVENT_TYPE_ENUM EventType; + + DEBUGGER_EVENT_OPTIONS Options; + + PVOID CommandStringBuffer; + + UINT32 ConditionBufferSize; + +} DEBUGGER_GENERAL_EVENT_DETAIL, *PDEBUGGER_GENERAL_EVENT_DETAIL; + +/** + * @brief Each event can have multiple actions + * @details THIS STRUCTURE IS ONLY USED IN USER MODE + * WE USE SEPARATE STRUCTURE FOR ACTIONS IN + * KERNEL MODE + */ +typedef struct _DEBUGGER_GENERAL_ACTION +{ + UINT64 EventTag; + DEBUGGER_EVENT_ACTION_TYPE_ENUM ActionType; + BOOLEAN ImmediateMessagePassing; + UINT32 PreAllocatedBuffer; + + UINT32 CustomCodeBufferSize; + UINT32 ScriptBufferSize; + UINT32 ScriptBufferPointer; + +} DEBUGGER_GENERAL_ACTION, *PDEBUGGER_GENERAL_ACTION; + +/** + * @brief Status of register buffers + * + */ +typedef struct _DEBUGGER_EVENT_AND_ACTION_RESULT +{ + BOOLEAN IsSuccessful; + UINT32 Error; // If IsSuccessful was, FALSE + +} DEBUGGER_EVENT_AND_ACTION_RESULT, *PDEBUGGER_EVENT_AND_ACTION_RESULT; + +#define SIZEOF_REGISTER_EVENT sizeof(REGISTER_NOTIFY_BUFFER) + + +//..\..\..\bin\debug\SDK\Headers\HardwareDebugger.h +/** + * @file HardwareDebugger.h + * @author Sina Karvandi (sina@hyperdbg.org) + * @brief HyperDbg's Hardware Debugger (hwdbg) types and constants + * @details This file contains definitions of hwdbg elements + * used in HyperDbg + * @version 0.9 + * @date 2024-04-28 + * + * @copyright This project is released under the GNU Public License v3. + * + */ +#pragma once + +////////////////////////////////////////////////// +// Enums // +////////////////////////////////////////////////// + +/** + * @brief Different action of hwdbg + * @warning This file should be changed along with hwdbg files + * + */ +typedef enum _HWDBG_ACTION_ENUMS +{ + hwdbgActionSendVersion = 1, + hwdbgActionSendPinInformation = 2, + hwdbgActionConfigureScriptBuffer = 3, + +} HWDBG_ACTION_ENUMS; + +/** + * @brief Different responses come from hwdbg + * @warning This file should be changed along with hwdbg files + * + */ +typedef enum _HWDBG_RESPONSE_ENUMS +{ + hwdbgResponseInvalidPacketOrError = 1, + hwdbgResponseVersion = 2, + hwdbgResponsePinInformation = 3, + hwdbgResponseScriptBufferConfigurationResult = 4, + +} HWDBG_RESPONSE_ENUMS; + +/** + * @brief Different error codes in hwdbg + * @warning This file should be changed along with hwdbg files + * + */ +typedef enum _HWDBG_ERROR_ENUMS +{ + hwdbgErrorInvalidPacket = 1, + +} HWDBG_ERROR_ENUMS; + +////////////////////////////////////////////////// +// Structures // +////////////////////////////////////////////////// + +/** + * @brief The structure of port information (each item) in hwdbg + * + */ +typedef struct _HWDBG_PORT_INFORMATION_ITEMS +{ + UINT32 PortSize; + +} HWDBG_PORT_INFORMATION_ITEMS, *PHWDBG_PORT_INFORMATION_ITEMS; + +/** + * @brief The structure of script capabilities information in hwdbg + * + */ +typedef struct _HWDBG_INSTANCE_INFORMATION +{ + UINT32 Version; // Target version of HyperDbg (same as hwdbg) + UINT32 MaximumNumberOfStages; // Number of stages that this instance of hwdbg supports (NumberOfSupportedStages == 0 means script engine is disabled) + UINT32 scriptVariableLength; // maximum length of variables (and other script elements) + UINT32 maximumNumberOfSupportedScriptOperators; // maximum supported operators in a single func + UINT32 numberOfPins; // Number of pins + UINT32 numberOfPorts; // Number of ports + + struct _HWDBG_SCRIPT_CAPABILITIES + { + UINT64 inc : 1; + UINT64 dec : 1; + UINT64 or : 1; + UINT64 xor : 1; + UINT64 and : 1; + UINT64 asr : 1; + UINT64 asl : 1; + UINT64 add : 1; + UINT64 sub : 1; + UINT64 mul : 1; + UINT64 div : 1; + UINT64 mod : 1; + UINT64 gt : 1; + UINT64 lt : 1; + UINT64 egt : 1; + UINT64 elt : 1; + UINT64 equal : 1; + UINT64 neq : 1; + UINT64 jmp : 1; + UINT64 jz : 1; + UINT64 jnz : 1; + UINT64 mov : 1; + UINT64 printf : 1; + + } scriptCapabilities; + + // + // Here the details of port arrangements are located (HWDBG_PORT_INFORMATION_ITEMS) + // As the following type: + // HWDBG_PORT_INFORMATION_ITEMS portsConfiguration[numberOfPorts] ; Port arrangement + // + +} HWDBG_SCRIPT_CAPABILITIES_INFORMATION, *PHWDBG_SCRIPT_CAPABILITIES_INFORMATION; + + +//..\..\..\bin\debug\SDK\Headers\Ioctls.h +/** + * @file Ioctls.h + * @author Sina Karvandi (sina@hyperdbg.org) + * @brief HyperDbg's SDK IOCTL codes + * @details This file contains definitions of IOCTLs used in HyperDbg + * @version 0.2 + * @date 2022-06-24 + * + * @copyright This project is released under the GNU Public License v3. + * + */ +#pragma once + +////////////////////////////////////////////////// +// Definitions // +////////////////////////////////////////////////// + +// +// The following controls are mainly defined in +// + +// +// Macro definition for defining IOCTL and FSCTL function control codes. Note +// that function codes 0-2047 are reserved for Microsoft Corporation, and +// 2048-4095 are reserved for customers. +// +#ifndef CTL_CODE + +# define CTL_CODE(DeviceType, Function, Method, Access) ( \ + ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method)) + +#endif // ! CTL_CODE + +#ifndef FILE_ANY_ACCESS + +# define FILE_ANY_ACCESS 0 + +#endif // !FILE_ANY_ACCESS + +// +// Define the method codes for how buffers are passed for I/O and FS controls +// + +#ifndef METHOD_BUFFERED + +# define METHOD_BUFFERED 0 + +#endif // !METHOD_BUFFERED + +#ifndef FILE_DEVICE_UNKNOWN + +# define FILE_DEVICE_UNKNOWN 0x00000022 + +#endif // !FILE_DEVICE_UNKNOWN + +////////////////////////////////////////////////// +// IOCTLs // +////////////////////////////////////////////////// + +/** + * @brief ioctl, register a new event + * + */ +#define IOCTL_REGISTER_EVENT \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS) + +/** + * @brief ioctl, irp pending mechanism for reading from message tracing buffers + * + */ +#define IOCTL_RETURN_IRP_PENDING_PACKETS_AND_DISALLOW_IOCTL \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS) + +/** + * @brief ioctl, to terminate vmx and exit form debugger + * + */ +#define IOCTL_TERMINATE_VMX \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x802, METHOD_BUFFERED, FILE_ANY_ACCESS) + +/** + * @brief ioctl, request to read memory + * + */ +#define IOCTL_DEBUGGER_READ_MEMORY \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x803, METHOD_BUFFERED, FILE_ANY_ACCESS) + +/** + * @brief ioctl, request to read or write on a special MSR + * + */ +#define IOCTL_DEBUGGER_READ_OR_WRITE_MSR \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x804, METHOD_BUFFERED, FILE_ANY_ACCESS) + +/** + * @brief ioctl, request to read page table entries + * + */ +#define IOCTL_DEBUGGER_READ_PAGE_TABLE_ENTRIES_DETAILS \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x805, METHOD_BUFFERED, FILE_ANY_ACCESS) + +/** + * @brief ioctl, register an event + * + */ +#define IOCTL_DEBUGGER_REGISTER_EVENT \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x806, METHOD_BUFFERED, FILE_ANY_ACCESS) + +/** + * @brief ioctl, add action to event + * + */ +#define IOCTL_DEBUGGER_ADD_ACTION_TO_EVENT \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x807, METHOD_BUFFERED, FILE_ANY_ACCESS) + +/** + * @brief ioctl, request to enable or disable transparent-mode + * + */ +#define IOCTL_DEBUGGER_HIDE_AND_UNHIDE_TO_TRANSPARENT_THE_DEBUGGER \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x808, METHOD_BUFFERED, FILE_ANY_ACCESS) + +/** + * @brief ioctl, for !va2pa and !pa2va commands + * + */ +#define IOCTL_DEBUGGER_VA2PA_AND_PA2VA_COMMANDS \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x809, METHOD_BUFFERED, FILE_ANY_ACCESS) + +/** + * @brief ioctl, request to edit virtual and physical memory + * + */ +#define IOCTL_DEBUGGER_EDIT_MEMORY \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x80a, METHOD_BUFFERED, FILE_ANY_ACCESS) + +/** + * @brief ioctl, request to search virtual and physical memory + * + */ +#define IOCTL_DEBUGGER_SEARCH_MEMORY \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x80b, METHOD_BUFFERED, FILE_ANY_ACCESS) + +/** + * @brief ioctl, request to modify an event (enable/disable/clear) + * + */ +#define IOCTL_DEBUGGER_MODIFY_EVENTS \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x80c, METHOD_BUFFERED, FILE_ANY_ACCESS) + +/** + * @brief ioctl, flush the kernel buffers + * + */ +#define IOCTL_DEBUGGER_FLUSH_LOGGING_BUFFERS \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x80d, METHOD_BUFFERED, FILE_ANY_ACCESS) + +/** + * @brief ioctl, attach or detach user-mode processes + * + */ +#define IOCTL_DEBUGGER_ATTACH_DETACH_USER_MODE_PROCESS \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x80e, METHOD_BUFFERED, FILE_ANY_ACCESS) + +/** + * @brief ioctl, print states (Deprecated) + * + * + */ +#define IOCTL_DEBUGGER_PRINT \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x80f, METHOD_BUFFERED, FILE_ANY_ACCESS) + +/** + * @brief ioctl, prepare debuggee + * + */ +#define IOCTL_PREPARE_DEBUGGEE \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x810, METHOD_BUFFERED, FILE_ANY_ACCESS) + +/** + * @brief ioctl, pause and halt the system + * + */ +#define IOCTL_PAUSE_PACKET_RECEIVED \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x811, METHOD_BUFFERED, FILE_ANY_ACCESS) + +/** + * @brief ioctl, send a signal that execution of command finished + * + */ +#define IOCTL_SEND_SIGNAL_EXECUTION_IN_DEBUGGEE_FINISHED \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x812, METHOD_BUFFERED, FILE_ANY_ACCESS) + +/** + * @brief ioctl, send user-mode messages to the debugger + * + */ +#define IOCTL_SEND_USERMODE_MESSAGES_TO_DEBUGGER \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x813, METHOD_BUFFERED, FILE_ANY_ACCESS) + +/** + * @brief ioctl, send general buffer from debuggee to debugger + * + */ +#define IOCTL_SEND_GENERAL_BUFFER_FROM_DEBUGGEE_TO_DEBUGGER \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x814, METHOD_BUFFERED, FILE_ANY_ACCESS) + +/** + * @brief ioctl, to perform kernel-side tests + * + */ +#define IOCTL_PERFROM_KERNEL_SIDE_TESTS \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x815, METHOD_BUFFERED, FILE_ANY_ACCESS) + +/** + * @brief ioctl, to reserve pre-allocated pools + * + */ +#define IOCTL_RESERVE_PRE_ALLOCATED_POOLS \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x816, METHOD_BUFFERED, FILE_ANY_ACCESS) + +/** + * @brief ioctl, to send user debugger commands + * + */ +#define IOCTL_SEND_USER_DEBUGGER_COMMANDS \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x817, METHOD_BUFFERED, FILE_ANY_ACCESS) + +/** + * @brief ioctl, to get active threads/processes that are debugging + * + */ +#define IOCTL_GET_DETAIL_OF_ACTIVE_THREADS_AND_PROCESSES \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x818, METHOD_BUFFERED, FILE_ANY_ACCESS) + +/** + * @brief ioctl, to get user mode modules details + * + */ +#define IOCTL_GET_USER_MODE_MODULE_DETAILS \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x819, METHOD_BUFFERED, FILE_ANY_ACCESS) + +/** + * @brief ioctl, query count of active threads or processes + * + */ +#define IOCTL_QUERY_COUNT_OF_ACTIVE_PROCESSES_OR_THREADS \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x81a, METHOD_BUFFERED, FILE_ANY_ACCESS) + +/** + * @brief ioctl, to get list threads/processes + * + */ +#define IOCTL_GET_LIST_OF_THREADS_AND_PROCESSES \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x81b, METHOD_BUFFERED, FILE_ANY_ACCESS) + +/** + * @brief ioctl, query the current process details + * + */ +#define IOCTL_QUERY_CURRENT_PROCESS \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x81c, METHOD_BUFFERED, FILE_ANY_ACCESS) + +/** + * @brief ioctl, query the current thread details + * + */ +#define IOCTL_QUERY_CURRENT_THREAD \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x81d, METHOD_BUFFERED, FILE_ANY_ACCESS) + +/** + * @brief ioctl, request service from the reversing machine + * + */ +#define IOCTL_REQUEST_REV_MACHINE_SERVICE \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x81e, METHOD_BUFFERED, FILE_ANY_ACCESS) + +/** + * @brief ioctl, request to bring pages in + * + */ +#define IOCTL_DEBUGGER_BRING_PAGES_IN \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x81f, METHOD_BUFFERED, FILE_ANY_ACCESS) + +/** + * @brief ioctl, to preactivate a functionality + * + */ +#define IOCTL_PREACTIVATE_FUNCTIONALITY \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x820, METHOD_BUFFERED, FILE_ANY_ACCESS) + + +//..\..\..\bin\debug\SDK\Headers\RequestStructures.h +/** + * @file RequestStructures.h + * @author Sina Karvandi (sina@hyperdbg.org) + * @brief HyperDbg's SDK Headers Request Packets + * @details This file contains definitions of request packets (enums, structs) + * @version 0.2 + * @date 2022-06-28 + * + * @copyright This project is released under the GNU Public License v3. + * + */ +#pragma once + +#define SIZEOF_DEBUGGER_READ_PAGE_TABLE_ENTRIES_DETAILS \ + sizeof(DEBUGGER_READ_PAGE_TABLE_ENTRIES_DETAILS) + +/** + * @brief request for !pte command + * + */ +typedef struct _DEBUGGER_READ_PAGE_TABLE_ENTRIES_DETAILS +{ + UINT64 VirtualAddress; + UINT32 ProcessId; + + UINT64 Pml4eVirtualAddress; + UINT64 Pml4eValue; + + UINT64 PdpteVirtualAddress; + UINT64 PdpteValue; + + UINT64 PdeVirtualAddress; + UINT64 PdeValue; + + UINT64 PteVirtualAddress; + UINT64 PteValue; + + UINT32 KernelStatus; + +} DEBUGGER_READ_PAGE_TABLE_ENTRIES_DETAILS, + *PDEBUGGER_READ_PAGE_TABLE_ENTRIES_DETAILS; + +/* ============================================================================================== + */ + +#define SIZEOF_DEBUGGER_VA2PA_AND_PA2VA_COMMANDS \ + sizeof(DEBUGGER_VA2PA_AND_PA2VA_COMMANDS) + +/** + * @brief requests for !va2pa and !pa2va commands + * + */ +typedef struct _DEBUGGER_VA2PA_AND_PA2VA_COMMANDS +{ + UINT64 VirtualAddress; + UINT64 PhysicalAddress; + UINT32 ProcessId; + BOOLEAN IsVirtual2Physical; + UINT32 KernelStatus; + +} DEBUGGER_VA2PA_AND_PA2VA_COMMANDS, *PDEBUGGER_VA2PA_AND_PA2VA_COMMANDS; + +/* ============================================================================================== + */ +#define SIZEOF_DEBUGGER_PAGE_IN_REQUEST \ + sizeof(DEBUGGER_PAGE_IN_REQUEST) + +/** + * @brief requests for the '.pagein' command + * + */ +typedef struct _DEBUGGER_PAGE_IN_REQUEST +{ + UINT64 VirtualAddressFrom; + UINT64 VirtualAddressTo; + UINT32 ProcessId; + UINT32 PageFaultErrorCode; + UINT32 KernelStatus; + +} DEBUGGER_PAGE_IN_REQUEST, *PDEBUGGER_PAGE_IN_REQUEST; + +/* ============================================================================================== + */ + +/** + * @brief different modes of reconstruct requests + * + */ +typedef enum _REVERSING_MACHINE_RECONSTRUCT_MEMORY_MODE +{ + REVERSING_MACHINE_RECONSTRUCT_MEMORY_MODE_UNKNOWN = 0, + REVERSING_MACHINE_RECONSTRUCT_MEMORY_MODE_USER_MODE, + REVERSING_MACHINE_RECONSTRUCT_MEMORY_MODE_KERNEL_MODE, +} REVERSING_MACHINE_RECONSTRUCT_MEMORY_MODE; + +/** + * @brief different types of reconstruct requests + * + */ +typedef enum _REVERSING_MACHINE_RECONSTRUCT_MEMORY_TYPE +{ + REVERSING_MACHINE_RECONSTRUCT_MEMORY_TYPE_UNKNOWN = 0, + REVERSING_MACHINE_RECONSTRUCT_MEMORY_TYPE_RECONSTRUCT, + REVERSING_MACHINE_RECONSTRUCT_MEMORY_TYPE_PATTERN, +} REVERSING_MACHINE_RECONSTRUCT_MEMORY_TYPE; + +#define SIZEOF_REVERSING_MACHINE_RECONSTRUCT_MEMORY_REQUEST \ + sizeof(REVERSING_MACHINE_RECONSTRUCT_MEMORY_REQUEST) + +/** + * @brief requests for !rev command + * + */ +typedef struct _REVERSING_MACHINE_RECONSTRUCT_MEMORY_REQUEST +{ + UINT32 ProcessId; + UINT32 Size; + REVERSING_MACHINE_RECONSTRUCT_MEMORY_MODE Mode; + REVERSING_MACHINE_RECONSTRUCT_MEMORY_TYPE Type; + UINT32 KernelStatus; + +} REVERSING_MACHINE_RECONSTRUCT_MEMORY_REQUEST, *PREVERSING_MACHINE_RECONSTRUCT_MEMORY_REQUEST; + +/* ============================================================================================== + */ + +#define SIZEOF_DEBUGGER_DT_COMMAND_OPTIONS \ + sizeof(DEBUGGER_DT_COMMAND_OPTIONS) + +/** + * @brief requests options for dt and struct command + * + */ +typedef struct _DEBUGGER_DT_COMMAND_OPTIONS +{ + const char * TypeName; + UINT64 SizeOfTypeName; + UINT64 Address; + BOOLEAN IsStruct; + PVOID BufferAddress; + UINT32 TargetPid; + const char * AdditionalParameters; + +} DEBUGGER_DT_COMMAND_OPTIONS, *PDEBUGGER_DT_COMMAND_OPTIONS; + +/* ============================================================================================== + */ + +/** + * @brief different types of prealloc requests + * + */ +typedef enum _DEBUGGER_PREALLOC_COMMAND_TYPE +{ + DEBUGGER_PREALLOC_COMMAND_TYPE_THREAD_INTERCEPTION, + DEBUGGER_PREALLOC_COMMAND_TYPE_MONITOR, + DEBUGGER_PREALLOC_COMMAND_TYPE_EPTHOOK, + DEBUGGER_PREALLOC_COMMAND_TYPE_EPTHOOK2, + DEBUGGER_PREALLOC_COMMAND_TYPE_REGULAR_EVENT, + DEBUGGER_PREALLOC_COMMAND_TYPE_BIG_EVENT, + DEBUGGER_PREALLOC_COMMAND_TYPE_REGULAR_SAFE_BUFFER, + DEBUGGER_PREALLOC_COMMAND_TYPE_BIG_SAFE_BUFFER, + +} DEBUGGER_PREALLOC_COMMAND_TYPE; + +#define SIZEOF_DEBUGGER_PREALLOC_COMMAND \ + sizeof(DEBUGGER_PREALLOC_COMMAND) + +/** + * @brief requests for the 'prealloc' command + * + */ +typedef struct _DEBUGGER_PREALLOC_COMMAND +{ + DEBUGGER_PREALLOC_COMMAND_TYPE Type; + UINT32 Count; + UINT32 KernelStatus; + +} DEBUGGER_PREALLOC_COMMAND, *PDEBUGGER_PREALLOC_COMMAND; + +/* ============================================================================================== + */ + +/** + * @brief different types of preactivate requests + * + */ +typedef enum _DEBUGGER_PREACTIVATE_COMMAND_TYPE +{ + DEBUGGER_PREACTIVATE_COMMAND_TYPE_MODE, + +} DEBUGGER_PREACTIVATE_COMMAND_TYPE; + +#define SIZEOF_DEBUGGER_PREACTIVATE_COMMAND \ + sizeof(DEBUGGER_PREACTIVATE_COMMAND) + +/** + * @brief requests for the 'preactivate' command + * + */ +typedef struct _DEBUGGER_PREACTIVATE_COMMAND +{ + DEBUGGER_PREACTIVATE_COMMAND_TYPE Type; + UINT32 KernelStatus; + +} DEBUGGER_PREACTIVATE_COMMAND, *PDEBUGGER_PREACTIVATE_COMMAND; + +/* ============================================================================================== + */ + +#define SIZEOF_DEBUGGER_READ_MEMORY sizeof(DEBUGGER_READ_MEMORY) + +/** + * @brief different types of reading memory + * + */ +typedef enum _DEBUGGER_READ_READING_TYPE +{ + READ_FROM_KERNEL, + READ_FROM_VMX_ROOT +} DEBUGGER_READ_READING_TYPE; + +/** + * @brief different type of addresses + * + */ +typedef enum _DEBUGGER_READ_MEMORY_TYPE +{ + DEBUGGER_READ_PHYSICAL_ADDRESS, + DEBUGGER_READ_VIRTUAL_ADDRESS +} DEBUGGER_READ_MEMORY_TYPE; + +/** + * @brief the way that debugger should show + * the details of memory or disassemble them + * + */ +typedef enum _DEBUGGER_SHOW_MEMORY_STYLE +{ + DEBUGGER_SHOW_COMMAND_DT = 1, + DEBUGGER_SHOW_COMMAND_DISASSEMBLE64, + DEBUGGER_SHOW_COMMAND_DISASSEMBLE32, + DEBUGGER_SHOW_COMMAND_DB, + DEBUGGER_SHOW_COMMAND_DC, + DEBUGGER_SHOW_COMMAND_DQ, + DEBUGGER_SHOW_COMMAND_DD, + DEBUGGER_SHOW_COMMAND_DUMP +} DEBUGGER_SHOW_MEMORY_STYLE; + +/** + * @brief request for reading virtual and physical memory + * + */ +typedef struct _DEBUGGER_READ_MEMORY +{ + UINT32 Pid; // Read from cr3 of what process + UINT64 Address; + UINT32 Size; + BOOLEAN IsForDisasm; // Debugger sets whether the read memory is for diassembler or not + BOOLEAN Is32BitAddress; // Debuggee sets the status of address + DEBUGGER_READ_MEMORY_TYPE MemoryType; + DEBUGGER_READ_READING_TYPE ReadingType; + PDEBUGGER_DT_COMMAND_OPTIONS DtDetails; + DEBUGGER_SHOW_MEMORY_STYLE Style; // not used in local debugging + UINT32 ReturnLength; // not used in local debugging + UINT32 KernelStatus; // not used in local debugging + + // + // Here is the target buffer (actual memory) + // + +} DEBUGGER_READ_MEMORY, *PDEBUGGER_READ_MEMORY; + +/* ============================================================================================== + */ + +#define SIZEOF_DEBUGGER_FLUSH_LOGGING_BUFFERS \ + sizeof(DEBUGGER_FLUSH_LOGGING_BUFFERS) + +/** + * @brief request for flushing buffers + * + */ +typedef struct _DEBUGGER_FLUSH_LOGGING_BUFFERS +{ + UINT32 KernelStatus; + UINT32 CountOfMessagesThatSetAsReadFromVmxRoot; + UINT32 CountOfMessagesThatSetAsReadFromVmxNonRoot; + +} DEBUGGER_FLUSH_LOGGING_BUFFERS, *PDEBUGGER_FLUSH_LOGGING_BUFFERS; + +/* ============================================================================================== + */ + +#define SIZEOF_DEBUGGER_TEST_QUERY_BUFFER \ + sizeof(DEBUGGER_TEST_QUERY_BUFFER) + +/** + * @brief test query used for test purposed + * + */ +typedef enum _DEBUGGER_TEST_QUERY_STATE +{ + TEST_QUERY_HALTING_CORE_STATUS = 1, // Query constant to show detail of halting of core + TEST_QUERY_PREALLOCATED_POOL_STATE = 2, // Query pre-allocated pool state + TEST_QUERY_TRAP_STATE = 3, // Query trap state + TEST_BREAKPOINT_TURN_OFF_BPS = 4, // Turn off the breakpoints (#BP) + TEST_BREAKPOINT_TURN_ON_BPS = 5, // Turn on the breakpoints (#BP) + TEST_BREAKPOINT_TURN_OFF_BPS_AND_EVENTS_FOR_COMMANDS_IN_REMOTE_COMPUTER = 6, // Turn off the breakpoints and events for executing the commands in the remote computer + TEST_BREAKPOINT_TURN_ON_BPS_AND_EVENTS_FOR_COMMANDS_IN_REMOTE_COMPUTER = 7, // Turn on the breakpoints and events for executing the commands in the remote computer + TEST_SETTING_TARGET_TASKS_ON_HALTED_CORES_SYNCHRONOUS = 8, // For testing synchronized event + TEST_SETTING_TARGET_TASKS_ON_HALTED_CORES_ASYNCHRONOUS = 9, // For testing unsynchronized event + TEST_SETTING_TARGET_TASKS_ON_TARGET_HALTED_CORES = 10, // Send the task to the halted core + TEST_BREAKPOINT_TURN_OFF_DBS = 11, // Turn off the debug breaks (#DB) + TEST_BREAKPOINT_TURN_ON_DBS = 12, // Turn on the debug breaks (#DB) + +} DEBUGGER_TEST_QUERY_STATE; + +/** + * @brief request for test query buffers + * + */ +typedef struct _DEBUGGER_DEBUGGER_TEST_QUERY_BUFFER +{ + DEBUGGER_TEST_QUERY_STATE RequestType; + UINT64 Context; + UINT32 KernelStatus; + +} DEBUGGER_DEBUGGER_TEST_QUERY_BUFFER, *PDEBUGGER_DEBUGGER_TEST_QUERY_BUFFER; + +/* ============================================================================================== + */ + +#define SIZEOF_DEBUGGER_PERFORM_KERNEL_TESTS \ + sizeof(DEBUGGER_PERFORM_KERNEL_TESTS) + +/** + * @brief request performing kernel tests + * + */ +typedef struct _DEBUGGER_PERFORM_KERNEL_TESTS +{ + UINT32 KernelStatus; + +} DEBUGGER_PERFORM_KERNEL_TESTS, *PDEBUGGER_PERFORM_KERNEL_TESTS; + +/* ============================================================================================== + */ + +#define SIZEOF_DEBUGGER_SEND_COMMAND_EXECUTION_FINISHED_SIGNAL \ + sizeof(DEBUGGER_SEND_COMMAND_EXECUTION_FINISHED_SIGNAL) + +/** + * @brief request for send a signal that command execution finished + * + */ +typedef struct _DEBUGGER_SEND_COMMAND_EXECUTION_FINISHED_SIGNAL +{ + UINT32 KernelStatus; + +} DEBUGGER_SEND_COMMAND_EXECUTION_FINISHED_SIGNAL, + *PDEBUGGER_SEND_COMMAND_EXECUTION_FINISHED_SIGNAL; + +/* ============================================================================================== + */ + +#define SIZEOF_DEBUGGEE_SEND_GENERAL_PACKET_FROM_DEBUGGEE_TO_DEBUGGER \ + sizeof(DEBUGGEE_SEND_GENERAL_PACKET_FROM_DEBUGGEE_TO_DEBUGGER) + +/** + * @brief request for send general packets from debuggee to debugger + * + */ +typedef struct _DEBUGGEE_SEND_GENERAL_PACKET_FROM_DEBUGGEE_TO_DEBUGGER +{ + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION RequestedAction; + UINT32 LengthOfBuffer; + BOOLEAN PauseDebuggeeWhenSent; + UINT32 KernelResult; + + // + // The buffer for the general packet is here + // + +} DEBUGGEE_SEND_GENERAL_PACKET_FROM_DEBUGGEE_TO_DEBUGGER, + *PDEBUGGEE_SEND_GENERAL_PACKET_FROM_DEBUGGEE_TO_DEBUGGER; + +/* ============================================================================================== + */ + +#define SIZEOF_DEBUGGER_SEND_USERMODE_MESSAGES_TO_DEBUGGER \ + sizeof(DEBUGGER_SEND_USERMODE_MESSAGES_TO_DEBUGGER) + +/** + * @brief request for send a user-mode message to debugger + * + */ +typedef struct _DEBUGGER_SEND_USERMODE_MESSAGES_TO_DEBUGGER +{ + UINT32 KernelStatus; + UINT32 Length; + + // + // Here is the messages + // + +} DEBUGGER_SEND_USERMODE_MESSAGES_TO_DEBUGGER, + *PDEBUGGER_SEND_USERMODE_MESSAGES_TO_DEBUGGER; + +/* ============================================================================================== + */ + +#define SIZEOF_DEBUGGER_READ_AND_WRITE_ON_MSR \ + sizeof(DEBUGGER_READ_AND_WRITE_ON_MSR) + +/** + * @brief different types of actions on MSRs + * + */ +typedef enum _DEBUGGER_MSR_ACTION_TYPE +{ + DEBUGGER_MSR_READ, + DEBUGGER_MSR_WRITE +} DEBUGGER_MSR_ACTION_TYPE; + +/** + * @brief request to read or write on MSRs + * + */ +typedef struct _DEBUGGER_READ_AND_WRITE_ON_MSR +{ + UINT64 Msr; // It's actually a 32-Bit value but let's not mess with a register + UINT32 CoreNumber; // specifies the core to execute wrmsr or read the msr + // (DEBUGGER_READ_AND_WRITE_ON_MSR_APPLY_ALL_CORES mean all + // the cores) + DEBUGGER_MSR_ACTION_TYPE + ActionType; // Detects whether user needs wrmsr or rdmsr + UINT64 Value; + +} DEBUGGER_READ_AND_WRITE_ON_MSR, *PDEBUGGER_READ_AND_WRITE_ON_MSR; + +/* ============================================================================================== + */ + +#define SIZEOF_DEBUGGER_EDIT_MEMORY sizeof(DEBUGGER_EDIT_MEMORY) + +/** + * @brief different type of addresses for editing memory + * + */ +typedef enum _DEBUGGER_EDIT_MEMORY_TYPE +{ + EDIT_PHYSICAL_MEMORY, + EDIT_VIRTUAL_MEMORY +} DEBUGGER_EDIT_MEMORY_TYPE; + +/** + * @brief size of editing memory + * + */ +typedef enum _DEBUGGER_EDIT_MEMORY_BYTE_SIZE +{ + EDIT_BYTE, + EDIT_DWORD, + EDIT_QWORD +} DEBUGGER_EDIT_MEMORY_BYTE_SIZE; + +/** + * @brief request for edit virtual and physical memory + * + */ +typedef struct _DEBUGGER_EDIT_MEMORY +{ + UINT32 Result; // Result from kernel + UINT64 Address; // Target address to modify + UINT32 ProcessId; // specifies the process id + DEBUGGER_EDIT_MEMORY_TYPE MemoryType; // Type of memory + DEBUGGER_EDIT_MEMORY_BYTE_SIZE ByteSize; // Modification size + UINT32 CountOf64Chunks; + UINT32 FinalStructureSize; + UINT32 KernelStatus; // not used in local debugging + +} DEBUGGER_EDIT_MEMORY, *PDEBUGGER_EDIT_MEMORY; + +/* ============================================================================================== + */ + +#define SIZEOF_DEBUGGER_SEARCH_MEMORY sizeof(DEBUGGER_SEARCH_MEMORY) + +/** + * @brief different types of address for searching on memory + * + */ +typedef enum _DEBUGGER_SEARCH_MEMORY_TYPE +{ + SEARCH_PHYSICAL_MEMORY, + SEARCH_VIRTUAL_MEMORY, + SEARCH_PHYSICAL_FROM_VIRTUAL_MEMORY, + +} DEBUGGER_SEARCH_MEMORY_TYPE; + +/** + * @brief different sizes on searching memory + * + */ +typedef enum _DEBUGGER_SEARCH_MEMORY_BYTE_SIZE +{ + SEARCH_BYTE, + SEARCH_DWORD, + SEARCH_QWORD + +} DEBUGGER_SEARCH_MEMORY_BYTE_SIZE; + +/** + * @brief request for searching memory + * + */ +typedef struct _DEBUGGER_SEARCH_MEMORY +{ + UINT64 Address; // Target address to start searching + UINT64 Length; // Length of bytes to search + UINT32 ProcessId; // specifies the process id + DEBUGGER_SEARCH_MEMORY_TYPE MemoryType; // Type of memory + DEBUGGER_SEARCH_MEMORY_BYTE_SIZE ByteSize; // Modification size + UINT32 CountOf64Chunks; + UINT32 FinalStructureSize; + +} DEBUGGER_SEARCH_MEMORY, *PDEBUGGER_SEARCH_MEMORY; + +/* ============================================================================================== + */ + +#define SIZEOF_DEBUGGER_HIDE_AND_TRANSPARENT_DEBUGGER_MODE \ + sizeof(DEBUGGER_HIDE_AND_TRANSPARENT_DEBUGGER_MODE) + +/** + * @brief request for enable or disable transparent-mode + * + */ +typedef struct _DEBUGGER_HIDE_AND_TRANSPARENT_DEBUGGER_MODE +{ + BOOLEAN IsHide; + + UINT64 CpuidAverage; + UINT64 CpuidStandardDeviation; + UINT64 CpuidMedian; + + UINT64 RdtscAverage; + UINT64 RdtscStandardDeviation; + UINT64 RdtscMedian; + + BOOLEAN TrueIfProcessIdAndFalseIfProcessName; + UINT32 ProcId; + UINT32 LengthOfProcessName; // in the case of !hide name xxx, this parameter + // shows the length of xxx + + UINT64 KernelStatus; /* DEBUGGER_OPERATION_WAS_SUCCESSFUL , + DEBUGGER_ERROR_UNABLE_TO_HIDE_OR_UNHIDE_DEBUGGER + */ + +} DEBUGGER_HIDE_AND_TRANSPARENT_DEBUGGER_MODE, + *PDEBUGGER_HIDE_AND_TRANSPARENT_DEBUGGER_MODE; + +/* ============================================================================================== + */ + +#define SIZEOF_DEBUGGER_PREPARE_DEBUGGEE sizeof(DEBUGGER_PREPARE_DEBUGGEE) + +/** + * @brief request to make this computer to a debuggee + * + */ +typedef struct _DEBUGGER_PREPARE_DEBUGGEE +{ + UINT32 PortAddress; + UINT32 Baudrate; + UINT64 NtoskrnlBaseAddress; + UINT32 Result; // Result from the kernel + CHAR OsName[MAXIMUM_CHARACTER_FOR_OS_NAME]; + +} DEBUGGER_PREPARE_DEBUGGEE, *PDEBUGGER_PREPARE_DEBUGGEE; + +/* ============================================================================================== + */ + +/** + * @brief The structure of changing core packet in HyperDbg + * + */ +typedef struct _DEBUGGEE_CHANGE_CORE_PACKET +{ + UINT32 NewCore; + UINT32 Result; + +} DEBUGGEE_CHANGE_CORE_PACKET, *PDEBUGGEE_CHANGE_CORE_PACKET; + +/* ============================================================================================== + */ +#define SIZEOF_DEBUGGER_ATTACH_DETACH_USER_MODE_PROCESS \ + sizeof(DEBUGGER_ATTACH_DETACH_USER_MODE_PROCESS) + +/** + * @brief different actions of switchings + * + */ +typedef enum _DEBUGGER_ATTACH_DETACH_USER_MODE_PROCESS_ACTION_TYPE +{ + DEBUGGER_ATTACH_DETACH_USER_MODE_PROCESS_ACTION_ATTACH, + DEBUGGER_ATTACH_DETACH_USER_MODE_PROCESS_ACTION_DETACH, + DEBUGGER_ATTACH_DETACH_USER_MODE_PROCESS_ACTION_REMOVE_HOOKS, + DEBUGGER_ATTACH_DETACH_USER_MODE_PROCESS_ACTION_KILL_PROCESS, + DEBUGGER_ATTACH_DETACH_USER_MODE_PROCESS_ACTION_PAUSE_PROCESS, + DEBUGGER_ATTACH_DETACH_USER_MODE_PROCESS_ACTION_SWITCH_BY_PROCESS_OR_THREAD, + DEBUGGER_ATTACH_DETACH_USER_MODE_PROCESS_ACTION_QUERY_COUNT_OF_ACTIVE_DEBUGGING_THREADS, + +} DEBUGGER_ATTACH_DETACH_USER_MODE_PROCESS_ACTION_TYPE; + +/** + * @brief request for attaching user-mode process + * + */ +typedef struct _DEBUGGER_ATTACH_DETACH_USER_MODE_PROCESS +{ + BOOLEAN IsStartingNewProcess; + UINT32 ProcessId; + UINT32 ThreadId; + BOOLEAN CheckCallbackAtFirstInstruction; + BOOLEAN Is32Bit; + BOOLEAN IsPaused; // used in switching to threads + DEBUGGER_ATTACH_DETACH_USER_MODE_PROCESS_ACTION_TYPE Action; + UINT32 CountOfActiveDebuggingThreadsAndProcesses; // used in showing the list of active threads/processes + UINT64 Token; + UINT64 Result; + +} DEBUGGER_ATTACH_DETACH_USER_MODE_PROCESS, + *PDEBUGGER_ATTACH_DETACH_USER_MODE_PROCESS; + +/* ============================================================================================== + */ +#define SIZEOF_DEBUGGER_QUERY_ACTIVE_PROCESSES_OR_THREADS \ + sizeof(DEBUGGER_QUERY_ACTIVE_PROCESSES_OR_THREADS) + +/** + * @brief different type of process or thread queries + * + */ +typedef enum _DEBUGGER_QUERY_ACTIVE_PROCESSES_OR_THREADS_TYPES +{ + DEBUGGER_QUERY_ACTIVE_PROCESSES_OR_THREADS_QUERY_PROCESS_COUNT = 1, + DEBUGGER_QUERY_ACTIVE_PROCESSES_OR_THREADS_QUERY_THREAD_COUNT = 2, + DEBUGGER_QUERY_ACTIVE_PROCESSES_OR_THREADS_QUERY_PROCESS_LIST = 3, + DEBUGGER_QUERY_ACTIVE_PROCESSES_OR_THREADS_QUERY_THREAD_LIST = 4, + DEBUGGER_QUERY_ACTIVE_PROCESSES_OR_THREADS_QUERY_CURRENT_PROCESS = 5, + DEBUGGER_QUERY_ACTIVE_PROCESSES_OR_THREADS_QUERY_CURRENT_THREAD = 6, + +} DEBUGGER_QUERY_ACTIVE_PROCESSES_OR_THREADS_TYPES; + +/** + * @brief different actions on showing or querying list of process or threads + * + */ +typedef enum _DEBUGGER_QUERY_ACTIVE_PROCESSES_OR_THREADS_ACTIONS +{ + DEBUGGER_QUERY_ACTIVE_PROCESSES_OR_THREADS_ACTION_SHOW_INSTANTLY = 1, + DEBUGGER_QUERY_ACTIVE_PROCESSES_OR_THREADS_ACTION_QUERY_COUNT = 2, + DEBUGGER_QUERY_ACTIVE_PROCESSES_OR_THREADS_ACTION_QUERY_SAVE_DETAILS = 3, + +} DEBUGGER_QUERY_ACTIVE_PROCESSES_OR_THREADS_ACTIONS; + +/** + * @brief The structure of needed information to get the details + * of the process from nt!_EPROCESS and location of needed variables + * + */ +typedef struct _DEBUGGEE_PROCESS_LIST_NEEDED_DETAILS +{ + UINT64 PsActiveProcessHead; // nt!PsActiveProcessHead + ULONG ImageFileNameOffset; // nt!_EPROCESS.ImageFileName + ULONG UniquePidOffset; // nt!_EPROCESS.UniqueProcessId + ULONG ActiveProcessLinksOffset; // nt!_EPROCESS.ActiveProcessLinks + +} DEBUGGEE_PROCESS_LIST_NEEDED_DETAILS, *PDEBUGGEE_PROCESS_LIST_NEEDED_DETAILS; + +/** + * @brief The structure of needed information to get the details + * of the thread from nt!_ETHREAD and location of needed variables + * + */ +typedef struct _DEBUGGEE_THREAD_LIST_NEEDED_DETAILS +{ + UINT32 ThreadListHeadOffset; // nt!_EPROCESS.ThreadListHead + UINT32 ThreadListEntryOffset; // nt!_ETHREAD.ThreadListEntry + UINT32 CidOffset; // nt!_ETHREAD.Cid + UINT64 PsActiveProcessHead; // nt!PsActiveProcessHead + ULONG ActiveProcessLinksOffset; // nt!_EPROCESS.ActiveProcessLinks + UINT64 Process; + +} DEBUGGEE_THREAD_LIST_NEEDED_DETAILS, *PDEBUGGEE_THREAD_LIST_NEEDED_DETAILS; + +/** + * @brief The structure showing list of processes (details of each + * entry) + * + */ +typedef struct _DEBUGGEE_PROCESS_LIST_DETAILS_ENTRY +{ + UINT64 Eprocess; + UINT32 ProcessId; + UINT64 Cr3; + UCHAR ImageFileName[15 + 1]; + +} DEBUGGEE_PROCESS_LIST_DETAILS_ENTRY, *PDEBUGGEE_PROCESS_LIST_DETAILS_ENTRY; + +/** + * @brief The structure showing list of threads (details of each + * entry) + * + */ +typedef struct _DEBUGGEE_THREAD_LIST_DETAILS_ENTRY +{ + UINT64 Eprocess; + UINT64 Ethread; + UINT32 ProcessId; + UINT32 ThreadId; + UCHAR ImageFileName[15 + 1]; + +} DEBUGGEE_THREAD_LIST_DETAILS_ENTRY, *PDEBUGGEE_THREAD_LIST_DETAILS_ENTRY; + +/** + * @brief request for query count of active processes and threads + * + */ +typedef struct _DEBUGGER_QUERY_ACTIVE_PROCESSES_OR_THREADS +{ + DEBUGGEE_PROCESS_LIST_NEEDED_DETAILS ProcessListNeededDetails; + DEBUGGEE_THREAD_LIST_NEEDED_DETAILS ThreadListNeededDetails; + DEBUGGER_QUERY_ACTIVE_PROCESSES_OR_THREADS_TYPES QueryType; + DEBUGGER_QUERY_ACTIVE_PROCESSES_OR_THREADS_ACTIONS QueryAction; + UINT32 Count; + UINT64 Result; + +} DEBUGGER_QUERY_ACTIVE_PROCESSES_OR_THREADS, + *PDEBUGGER_QUERY_ACTIVE_PROCESSES_OR_THREADS; + +/* ============================================================================================== + */ + +/** + * @brief The structure for saving the callstack frame of one parameter + * + */ +typedef struct _DEBUGGER_SINGLE_CALLSTACK_FRAME +{ + BOOLEAN IsStackAddressValid; + BOOLEAN IsValidAddress; + BOOLEAN IsExecutable; + UINT64 Value; + BYTE InstructionBytesOnRip[MAXIMUM_CALL_INSTR_SIZE]; + +} DEBUGGER_SINGLE_CALLSTACK_FRAME, *PDEBUGGER_SINGLE_CALLSTACK_FRAME; + +#define SIZEOF_DEBUGGER_CALLSTACK_REQUEST \ + sizeof(DEBUGGER_CALLSTACK_REQUEST) + +/** + * @brief callstack showing method + * + */ +typedef enum _DEBUGGER_CALLSTACK_DISPLAY_METHOD +{ + DEBUGGER_CALLSTACK_DISPLAY_METHOD_WITHOUT_PARAMS, + DEBUGGER_CALLSTACK_DISPLAY_METHOD_WITH_PARAMS, + +} DEBUGGER_CALLSTACK_DISPLAY_METHOD; + +/** + * @brief request for callstack frames + * + */ +typedef struct _DEBUGGER_CALLSTACK_REQUEST +{ + BOOLEAN Is32Bit; + UINT32 KernelStatus; + DEBUGGER_CALLSTACK_DISPLAY_METHOD DisplayMethod; + UINT32 Size; + UINT32 FrameCount; + UINT64 BaseAddress; + UINT64 BufferSize; + + // + // Here is the size of stack frames + // + +} DEBUGGER_CALLSTACK_REQUEST, *PDEBUGGER_CALLSTACK_REQUEST; + +/* ============================================================================================== + */ +#define SIZEOF_USERMODE_DEBUGGING_THREAD_OR_PROCESS_STATE_DETAILS \ + sizeof(USERMODE_DEBUGGING_THREAD_OR_PROCESS_STATE_DETAILS) + +typedef struct _USERMODE_DEBUGGING_THREAD_OR_PROCESS_STATE_DETAILS +{ + UINT32 ProcessId; + UINT32 ThreadId; + BOOLEAN IsProcess; + +} USERMODE_DEBUGGING_THREAD_OR_PROCESS_STATE_DETAILS, *PUSERMODE_DEBUGGING_THREAD_OR_PROCESS_STATE_DETAILS; + +/* ============================================================================================== + */ + +/** + * @brief Used for run the script + * + */ +typedef struct _DEBUGGER_EVENT_ACTION_RUN_SCRIPT_CONFIGURATION +{ + UINT64 ScriptBuffer; + UINT32 ScriptLength; + UINT32 ScriptPointer; + UINT32 OptionalRequestedBufferSize; + +} DEBUGGER_EVENT_ACTION_RUN_SCRIPT_CONFIGURATION, + *PDEBUGGER_EVENT_ACTION_RUN_SCRIPT_CONFIGURATION; + +/** + * @brief used in the case of requesting a "request buffer" + * + */ +typedef struct _DEBUGGER_EVENT_REQUEST_BUFFER +{ + BOOLEAN EnabledRequestBuffer; + UINT32 RequestBufferSize; + UINT64 RequstBufferAddress; + +} DEBUGGER_EVENT_REQUEST_BUFFER, *PDEBUGGER_EVENT_REQUEST_BUFFER; + +/** + * @brief used in the case of custom code requests to the debugger + * + */ +typedef struct _DEBUGGER_EVENT_REQUEST_CUSTOM_CODE +{ + UINT32 CustomCodeBufferSize; + PVOID CustomCodeBufferAddress; + UINT32 OptionalRequestedBufferSize; + +} DEBUGGER_EVENT_REQUEST_CUSTOM_CODE, *PDEBUGGER_EVENT_REQUEST_CUSTOM_CODE; + +/* ============================================================================================== + */ + +/** + * @brief User-mode debugging actions + * + */ +typedef enum _DEBUGGER_UD_COMMAND_ACTION_TYPE +{ + DEBUGGER_UD_COMMAND_ACTION_TYPE_NONE = 0, + DEBUGGER_UD_COMMAND_ACTION_TYPE_PAUSE, + DEBUGGER_UD_COMMAND_ACTION_TYPE_CONTINUE, + DEBUGGER_UD_COMMAND_ACTION_TYPE_REGULAR_STEP, + +} DEBUGGER_UD_COMMAND_ACTION_TYPE; + +/** + * @brief Description of user-mode debugging actions + * + */ +typedef struct _DEBUGGER_UD_COMMAND_ACTION +{ + DEBUGGER_UD_COMMAND_ACTION_TYPE ActionType; + UINT64 OptionalParam1; + UINT64 OptionalParam2; + UINT64 OptionalParam3; + UINT64 OptionalParam4; + +} DEBUGGER_UD_COMMAND_ACTION, *PDEBUGGER_UD_COMMAND_ACTION; + +/** + * @brief The structure of command packet in uHyperDbg + * + */ +typedef struct _DEBUGGER_UD_COMMAND_PACKET +{ + DEBUGGER_UD_COMMAND_ACTION UdAction; + UINT64 ProcessDebuggingDetailToken; + UINT32 TargetThreadId; + BOOLEAN ApplyToAllPausedThreads; + UINT32 Result; + +} DEBUGGER_UD_COMMAND_PACKET, *PDEBUGGER_UD_COMMAND_PACKET; + +/* ============================================================================================== + */ + +/** + * @brief Debugger process switch and process details + * + */ +typedef enum _DEBUGGEE_DETAILS_AND_SWITCH_PROCESS_TYPE +{ + + DEBUGGEE_DETAILS_AND_SWITCH_PROCESS_GET_PROCESS_DETAILS, + DEBUGGEE_DETAILS_AND_SWITCH_PROCESS_GET_PROCESS_LIST, + DEBUGGEE_DETAILS_AND_SWITCH_PROCESS_PERFORM_SWITCH, + +} DEBUGGEE_DETAILS_AND_SWITCH_PROCESS_TYPE; + +/** + * @brief The structure of changing process and show process + * packet in HyperDbg + * + */ +typedef struct _DEBUGGEE_DETAILS_AND_SWITCH_PROCESS_PACKET +{ + DEBUGGEE_DETAILS_AND_SWITCH_PROCESS_TYPE ActionType; + UINT32 ProcessId; + UINT64 Process; + BOOLEAN IsSwitchByClkIntr; + UCHAR ProcessName[16]; + DEBUGGEE_PROCESS_LIST_NEEDED_DETAILS ProcessListSymDetails; + UINT32 Result; + +} DEBUGGEE_DETAILS_AND_SWITCH_PROCESS_PACKET, *PDEBUGGEE_DETAILS_AND_SWITCH_PROCESS_PACKET; + +/* ============================================================================================== + */ + +/** + * @brief Debugger size of DEBUGGEE_DETAILS_AND_SWITCH_PROCESS_PACKET + * + */ +#define SIZEOF_DEBUGGEE_DETAILS_AND_SWITCH_PROCESS_PACKET \ + sizeof(DEBUGGEE_DETAILS_AND_SWITCH_PROCESS_PACKET) + +/** + * @brief Debugger thread switch and thread details + * + */ +typedef enum _DEBUGGEE_DETAILS_AND_SWITCH_THREAD_TYPE +{ + + DEBUGGEE_DETAILS_AND_SWITCH_THREAD_PERFORM_SWITCH, + DEBUGGEE_DETAILS_AND_SWITCH_THREAD_GET_THREAD_DETAILS, + DEBUGGEE_DETAILS_AND_SWITCH_THREAD_GET_THREAD_LIST, + +} DEBUGGEE_DETAILS_AND_SWITCH_THREAD_TYPE; + +/** + * @brief The structure of changing thead and show thread + * packet in HyperDbg + */ +typedef struct _DEBUGGEE_DETAILS_AND_SWITCH_THREAD_PACKET +{ + DEBUGGEE_DETAILS_AND_SWITCH_THREAD_TYPE ActionType; + UINT32 ThreadId; + UINT32 ProcessId; + UINT64 Thread; + UINT64 Process; + BOOLEAN CheckByClockInterrupt; + UCHAR ProcessName[16]; + DEBUGGEE_THREAD_LIST_NEEDED_DETAILS ThreadListSymDetails; + UINT32 Result; + +} DEBUGGEE_DETAILS_AND_SWITCH_THREAD_PACKET, *PDEBUGGEE_DETAILS_AND_SWITCH_THREAD_PACKET; + +/** + * @brief Debugger size of DEBUGGEE_DETAILS_AND_SWITCH_THREAD_PACKET + * + */ +#define SIZEOF_DEBUGGEE_DETAILS_AND_SWITCH_THREAD_PACKET \ + sizeof(DEBUGGEE_DETAILS_AND_SWITCH_THREAD_PACKET) + +/* ============================================================================================== + */ + +/** + * @brief stepping and tracking types + * + */ +typedef enum _DEBUGGER_REMOTE_STEPPING_REQUEST +{ + DEBUGGER_REMOTE_STEPPING_REQUEST_STEP_IN, + DEBUGGER_REMOTE_STEPPING_REQUEST_INSTRUMENTATION_STEP_IN, + DEBUGGER_REMOTE_STEPPING_REQUEST_INSTRUMENTATION_STEP_IN_FOR_TRACKING, + + DEBUGGER_REMOTE_STEPPING_REQUEST_STEP_OVER, + DEBUGGER_REMOTE_STEPPING_REQUEST_STEP_OVER_FOR_GU, + DEBUGGER_REMOTE_STEPPING_REQUEST_STEP_OVER_FOR_GU_LAST_INSTRUCTION, + +} DEBUGGER_REMOTE_STEPPING_REQUEST; + +/** + * @brief The structure of stepping packet in HyperDbg + * + */ +typedef struct _DEBUGGEE_STEP_PACKET +{ + DEBUGGER_REMOTE_STEPPING_REQUEST StepType; + + // + // Only in the case of call instructions + // the 'p' command + // + BOOLEAN IsCurrentInstructionACall; + UINT32 CallLength; + +} DEBUGGEE_STEP_PACKET, *PDEBUGGEE_STEP_PACKET; + +/** + * @brief default number of instructions used in tracking and stepping + * + */ +#define DEBUGGER_REMOTE_TRACKING_DEFAULT_COUNT_OF_STEPPING 0xffffffff + +/* ============================================================================================== + */ + +/** + * @brief The structure of .formats result packet in HyperDbg + * + */ +typedef struct _DEBUGGEE_FORMATS_PACKET +{ + UINT64 Value; + UINT32 Result; + +} DEBUGGEE_FORMATS_PACKET, *PDEBUGGEE_FORMATS_PACKET; + +/* ============================================================================================== + */ + +/** + * @brief The structure of .sym reload packet in HyperDbg + * + */ +typedef struct _DEBUGGEE_SYMBOL_REQUEST_PACKET +{ + UINT32 ProcessId; + +} DEBUGGEE_SYMBOL_REQUEST_PACKET, *PDEBUGGEE_SYMBOL_REQUEST_PACKET; + +/* ============================================================================================== + */ + +/** + * @brief The structure of bp command packet in HyperDbg + * + */ +typedef struct _DEBUGGEE_BP_PACKET +{ + UINT64 Address; + UINT32 Pid; + UINT32 Tid; + UINT32 Core; + BOOLEAN RemoveAfterHit; + BOOLEAN CheckForCallbacks; + UINT32 Result; + +} DEBUGGEE_BP_PACKET, *PDEBUGGEE_BP_PACKET; + +/** + * @brief breakpoint modification types + * + */ +typedef enum _DEBUGGEE_BREAKPOINT_MODIFICATION_REQUEST +{ + + DEBUGGEE_BREAKPOINT_MODIFICATION_REQUEST_LIST_BREAKPOINTS, + DEBUGGEE_BREAKPOINT_MODIFICATION_REQUEST_ENABLE, + DEBUGGEE_BREAKPOINT_MODIFICATION_REQUEST_DISABLE, + DEBUGGEE_BREAKPOINT_MODIFICATION_REQUEST_CLEAR, + +} DEBUGGEE_BREAKPOINT_MODIFICATION_REQUEST; + +/** + * @brief The structure of breakpoint modification requests packet in HyperDbg + * + */ +typedef struct _DEBUGGEE_BP_LIST_OR_MODIFY_PACKET +{ + UINT64 BreakpointId; + DEBUGGEE_BREAKPOINT_MODIFICATION_REQUEST Request; + UINT32 Result; + +} DEBUGGEE_BP_LIST_OR_MODIFY_PACKET, *PDEBUGGEE_BP_LIST_OR_MODIFY_PACKET; + +/* ============================================================================================== + */ + +/** + * @brief Whether a jump is taken or not taken + * + */ +typedef enum _DEBUGGER_CONDITIONAL_JUMP_STATUS +{ + + DEBUGGER_CONDITIONAL_JUMP_STATUS_ERROR = 0, + DEBUGGER_CONDITIONAL_JUMP_STATUS_NOT_CONDITIONAL_JUMP, + DEBUGGER_CONDITIONAL_JUMP_STATUS_JUMP_IS_TAKEN, + DEBUGGER_CONDITIONAL_JUMP_STATUS_JUMP_IS_NOT_TAKEN, + +} DEBUGGER_CONDITIONAL_JUMP_STATUS; + +/* ============================================================================================== + */ + +/** + * @brief The structure of script packet in HyperDbg + * + */ +typedef struct _DEBUGGEE_SCRIPT_PACKET +{ + UINT32 ScriptBufferSize; + UINT32 ScriptBufferPointer; + BOOLEAN IsFormat; + UINT32 Result; + + // + // The script buffer is here + // + +} DEBUGGEE_SCRIPT_PACKET, *PDEBUGGEE_SCRIPT_PACKET; + +/* ============================================================================================== + */ + +/** + * @brief The structure of result of search packet in HyperDbg + * + */ +typedef struct _DEBUGGEE_RESULT_OF_SEARCH_PACKET +{ + UINT32 CountOfResults; + UINT32 Result; + +} DEBUGGEE_RESULT_OF_SEARCH_PACKET, *PDEBUGGEE_RESULT_OF_SEARCH_PACKET; + +/* ============================================================================================== + */ + +/** + * @brief Register Descriptor Structure to use in r command. + * + */ +typedef struct _DEBUGGEE_REGISTER_READ_DESCRIPTION +{ + UINT32 RegisterID; // the number is from REGS_ENUM + UINT64 Value; + UINT32 KernelStatus; + +} DEBUGGEE_REGISTER_READ_DESCRIPTION, *PDEBUGGEE_REGISTER_READ_DESCRIPTION; + +/* ============================================================================================== + */ + + +//..\..\..\bin\debug\SDK\Headers\Symbols.h +/** + * @file Symbols.h + * @author Sina Karvandi (sina@hyperdbg.org) + * @brief HyperDbg's SDK Header Files For Symbol Parsing + * @details This file contains definitions of symbol parsers + * @version 0.2 + * @date 2022-06-24 + * + * @copyright This project is released under the GNU Public License v3. + * + */ +#pragma once + +////////////////////////////////////////////////// +// Symbols Details // +////////////////////////////////////////////////// + +/** + * @brief structures for sending and saving details + * about each module and symbols details + * + */ +typedef struct _MODULE_SYMBOL_DETAIL +{ + BOOLEAN IsSymbolDetailsFound; // TRUE if the details of symbols found, FALSE if not found + BOOLEAN IsLocalSymbolPath; // TRUE if the ModuleSymbolPath is a real path + // and FALSE if ModuleSymbolPath is just a module name + BOOLEAN IsSymbolPDBAvaliable; // TRUE if the module's pdb is available(if exists in the sympath) + BOOLEAN IsUserMode; // TRUE if the module is a user-mode module + BOOLEAN Is32Bit; // TRUE if the module is a 32-bit + UINT64 BaseAddress; + char FilePath[MAX_PATH]; + char ModuleSymbolPath[MAX_PATH]; + char ModuleSymbolGuidAndAge[MAXIMUM_GUID_AND_AGE_SIZE]; + +} MODULE_SYMBOL_DETAIL, *PMODULE_SYMBOL_DETAIL; + +typedef struct _USERMODE_LOADED_MODULE_SYMBOLS +{ + UINT64 BaseAddress; + UINT64 Entrypoint; + wchar_t FilePath[MAX_PATH]; + +} USERMODE_LOADED_MODULE_SYMBOLS, *PUSERMODE_LOADED_MODULE_SYMBOLS; + +typedef struct _USERMODE_LOADED_MODULE_DETAILS +{ + UINT32 ProcessId; + BOOLEAN OnlyCountModules; + BOOLEAN Is32Bit; + UINT32 ModulesCount; + UINT32 Result; + + // + // Here is a list of USERMODE_LOADED_MODULE_SYMBOLS (appended) + // + +} USERMODE_LOADED_MODULE_DETAILS, *PUSERMODE_LOADED_MODULE_DETAILS; + +/** + * @brief Callback type that should be used to add + * list of Addresses to ObjectNames + * + */ +typedef VOID (*SymbolMapCallback)(UINT64 Address, char * ModuleName, char * ObjectName, unsigned int ObjectSize); + +/** + * @brief request to add new symbol detail or update a previous + * symbol table entry + * + */ +typedef struct _DEBUGGER_UPDATE_SYMBOL_TABLE +{ + UINT32 TotalSymbols; + UINT32 CurrentSymbolIndex; + MODULE_SYMBOL_DETAIL SymbolDetailPacket; + +} DEBUGGER_UPDATE_SYMBOL_TABLE, *PDEBUGGER_UPDATE_SYMBOL_TABLE; + +/** + * @brief check so the DEBUGGER_UPDATE_SYMBOL_TABLE should be smaller than packet size + * + */ +static_assert(sizeof(DEBUGGER_UPDATE_SYMBOL_TABLE) < PacketChunkSize, + "err (static_assert), size of PacketChunkSize should be bigger than DEBUGGER_UPDATE_SYMBOL_TABLE (MODULE_SYMBOL_DETAIL)"); + +/* +============================================================================================== + */ + +/** + * @brief request that shows, symbol reload process is finished + * + */ +typedef struct _DEBUGGEE_SYMBOL_UPDATE_RESULT +{ + UINT64 KernelStatus; // Kernel put the status in this field + +} DEBUGGEE_SYMBOL_UPDATE_RESULT, *PDEBUGGEE_SYMBOL_UPDATE_RESULT; + +/* +============================================================================================== + */ + + +//..\..\..\bin\debug\SDK\HyperDbgSdk.h +#pragma once + +#include "SDK/Headers/Constants.h" +#include "SDK/Headers/BasicTypes.h" +#include "SDK/Headers/ErrorCodes.h" +#include "SDK/Headers/Connection.h" +#include "SDK/Headers/DataTypes.h" +#include "SDK/Headers/Ioctls.h" +#include "SDK/Headers/Events.h" +#include "SDK/Headers/RequestStructures.h" +#include "SDK/Headers/Symbols.h" + + +//..\..\..\bin\debug\SDK\Imports\HyperDbgCtrlImports.h +/** + * @file HyperDbgCtrlImports.h + * @author Sina Karvandi (sina@hyperdbg.org) + * @brief Headers relating exported functions from controller interface + * @version 0.2 + * @date 2023-02-02 + * + * @copyright This project is released under the GNU Public License v3. + * + */ +#pragma once + +#ifdef HYPERDBG_HPRDBGCTRL +# define IMPORT_EXPORT_CTRL __declspec(dllexport) +#else +# define IMPORT_EXPORT_CTRL __declspec(dllimport) +#endif + +// +// Header file of HPRDBGCTRL +// Imports +// +#ifdef __cplusplus +extern "C" { +#endif + +// +// Support Detection +// +IMPORT_EXPORT_CTRL bool HyperDbgVmxSupportDetection(); +IMPORT_EXPORT_CTRL void HyperDbgReadVendorString(char *); + +// +// VMM Module +// +IMPORT_EXPORT_CTRL int HyperDbgLoadVmm(); +IMPORT_EXPORT_CTRL int HyperDbgUnloadVmm(); +IMPORT_EXPORT_CTRL int HyperDbgInstallVmmDriver(); +IMPORT_EXPORT_CTRL int HyperDbgUninstallVmmDriver(); +IMPORT_EXPORT_CTRL int HyperDbgStopVmmDriver(); + +// +// General imports +// +IMPORT_EXPORT_CTRL int HyperDbgInterpreter(char * Command); +IMPORT_EXPORT_CTRL void HyperDbgShowSignature(); +IMPORT_EXPORT_CTRL void HyperDbgSetTextMessageCallback(Callback handler); +IMPORT_EXPORT_CTRL int HyperDbgScriptReadFileAndExecuteCommandline(int argc, char * argv[]); +IMPORT_EXPORT_CTRL bool HyperDbgContinuePreviousCommand(); +IMPORT_EXPORT_CTRL bool HyperDbgCheckMultilineCommand(char * CurrentCommand, bool Reset); + +#ifdef __cplusplus +} +#endif + + +//..\..\..\bin\debug\SDK\Imports\HyperDbgHyperLogImports.h +/** + * @file HyperDbgHyperLogImports.h + * @author Sina Karvandi (sina@hyperdbg.org) + * @brief Headers relating exported functions from hyperlog project + * @version 0.1 + * @date 2023-01-15 + * + * @copyright This project is released under the GNU Public License v3. + * + */ +#pragma once + +#ifdef HYPERDBG_HYPER_LOG +# define IMPORT_EXPORT_HYPERLOG __declspec(dllexport) +#else +# define IMPORT_EXPORT_HYPERLOG __declspec(dllimport) +#endif + +////////////////////////////////////////////////// +// Functions // +////////////////////////////////////////////////// + +IMPORT_EXPORT_HYPERLOG BOOLEAN +LogInitialize(MESSAGE_TRACING_CALLBACKS * MsgTracingCallbacks); + +IMPORT_EXPORT_HYPERLOG VOID +LogUnInitialize(); + +IMPORT_EXPORT_HYPERLOG UINT32 +LogMarkAllAsRead(BOOLEAN IsVmxRoot); + +IMPORT_EXPORT_HYPERLOG BOOLEAN +LogCallbackPrepareAndSendMessageToQueue(UINT32 OperationCode, + BOOLEAN IsImmediateMessage, + BOOLEAN ShowCurrentSystemTime, + BOOLEAN Priority, + const char * Fmt, + ...); + +IMPORT_EXPORT_HYPERLOG BOOLEAN +LogCallbackPrepareAndSendMessageToQueueWrapper(UINT32 OperationCode, + BOOLEAN IsImmediateMessage, + BOOLEAN ShowCurrentSystemTime, + BOOLEAN Priority, + const char * Fmt, + va_list ArgList); + +IMPORT_EXPORT_HYPERLOG BOOLEAN +LogCallbackSendBuffer(_In_ UINT32 OperationCode, + _In_reads_bytes_(BufferLength) PVOID Buffer, + _In_ UINT32 BufferLength, + _In_ BOOLEAN Priority); + +IMPORT_EXPORT_HYPERLOG BOOLEAN +LogCallbackCheckIfBufferIsFull(BOOLEAN Priority); + +IMPORT_EXPORT_HYPERLOG BOOLEAN +LogCallbackSendMessageToQueue(UINT32 OperationCode, BOOLEAN IsImmediateMessage, CHAR * LogMessage, UINT32 BufferLen, BOOLEAN Priority); + +IMPORT_EXPORT_HYPERLOG NTSTATUS +LogRegisterEventBasedNotification(PDEVICE_OBJECT DeviceObject, PIRP Irp); + +IMPORT_EXPORT_HYPERLOG NTSTATUS +LogRegisterIrpBasedNotification(PDEVICE_OBJECT DeviceObject, PIRP Irp); + + +//..\..\..\bin\debug\SDK\Imports\HyperDbgHyperLogIntrinsics.h +/** + * @file HyperDbgHyperLogIntrinsics.h + * @author Sina Karvandi (sina@hyperdbg.org) + * @brief Headers relating exported functions from hyperlog project + * @version 0.1 + * @date 2023-01-15 + * + * @copyright This project is released under the GNU Public License v3. + * + */ +#pragma once + +////////////////////////////////////////////////// +// Enums // +////////////////////////////////////////////////// + +/** + * @brief Types of log messages + * + */ +typedef enum _LOG_TYPE +{ + LOG_INFO, + LOG_WARNING, + LOG_ERROR + +} LOG_TYPE; + +////////////////////////////////////////////////// +// Logging // +////////////////////////////////////////////////// + +/** + * @brief Define log variables + * + */ +#if UseDbgPrintInsteadOfUsermodeMessageTracking +/* Use DbgPrint */ +# define Logformat, ...) \ + DbgPrint("[+] Information (%s:%d) | " format "\n", \ + __func__, \ + __LINE__, \ + __VA_ARGS__) + +# define LogWarning(format, ...) \ + DbgPrint("[-] Warning (%s:%d) | " format "\n", \ + __func__, \ + __LINE__, \ + __VA_ARGS__) + +# define LogError(format, ...) \ + DbgPrint("[!] Error (%s:%d) | " format "\n", \ + __func__, \ + __LINE__, \ + __VA_ARGS__); \ + DbgBreakPoint() + +/** + * @brief Log without any prefix + * + */ +# define Log(format, ...) \ + DbgPrint(format, __VA_ARGS__) + +#else + +/** + * @brief Log, general + * + */ +# define LogInfo(format, ...) \ + LogCallbackPrepareAndSendMessageToQueue(OPERATION_LOG_INFO_MESSAGE, \ + UseImmediateMessaging, \ + ShowSystemTimeOnDebugMessages, \ + FALSE, \ + "[+] Information (%s:%d) | " format "\n", \ + __func__, \ + __LINE__, \ + __VA_ARGS__) + +/** + * @brief Log in the case of priority message + * + */ +# define LogInfoPriority(format, ...) \ + LogCallbackPrepareAndSendMessageToQueue(OPERATION_LOG_INFO_MESSAGE, \ + TRUE, \ + ShowSystemTimeOnDebugMessages, \ + TRUE, \ + "[+] Information (%s:%d) | " format "\n", \ + __func__, \ + __LINE__, \ + __VA_ARGS__) + +/** + * @brief Log in the case of warning + * + */ +# define LogWarning(format, ...) \ + LogCallbackPrepareAndSendMessageToQueue(OPERATION_LOG_WARNING_MESSAGE, \ + UseImmediateMessaging, \ + ShowSystemTimeOnDebugMessages, \ + TRUE, \ + "[-] Warning (%s:%d) | " format "\n", \ + __func__, \ + __LINE__, \ + __VA_ARGS__) + +/** + * @brief Log in the case of error + * + */ +# define LogError(format, ...) \ + LogCallbackPrepareAndSendMessageToQueue(OPERATION_LOG_ERROR_MESSAGE, \ + UseImmediateMessaging, \ + ShowSystemTimeOnDebugMessages, \ + TRUE, \ + "[!] Error (%s:%d) | " format "\n", \ + __func__, \ + __LINE__, \ + __VA_ARGS__); \ + if (DebugMode) \ + DbgBreakPoint() + +/** + * @brief Log without any prefix + * + */ +# define Log(format, ...) \ + LogCallbackPrepareAndSendMessageToQueue(OPERATION_LOG_INFO_MESSAGE, \ + TRUE, \ + FALSE, \ + FALSE, \ + format, \ + __VA_ARGS__) + +/** + * @brief Log without any prefix and bypass the stack + * problem (getting two temporary stacks in preparing phase) + * + */ +# define LogSimpleWithTag(tag, isimmdte, buffer, len) \ + LogCallbackSendMessageToQueue(tag, \ + isimmdte, \ + buffer, \ + len, \ + FALSE) + +#endif // UseDbgPrintInsteadOfUsermodeMessageTracking + +/** + * @brief Log, initialize boot information and debug information + * + */ +#define LogDebugInfo(format, ...) \ + if (DebugMode) \ + LogCallbackPrepareAndSendMessageToQueue(OPERATION_LOG_INFO_MESSAGE, \ + UseImmediateMessaging, \ + ShowSystemTimeOnDebugMessages, \ + FALSE, \ + "[+] Information (%s:%d) | " format "\n", \ + __func__, \ + __LINE__, \ + __VA_ARGS__) + + +//..\..\..\bin\debug\SDK\Imports\HyperDbgRevImports.h +/** + * @file HyperDbgRevImports.h + * @author Sina Karvandi (sina@hyperdbg.org) + * @brief Headers relating exported functions from reversing machine interface + * @version 0.2 + * @date 2023-02-02 + * + * @copyright This project is released under the GNU Public License v3. + * + */ +#pragma once + +// +// Header file of hpr +// Imports +// +#ifdef __cplusplus +extern "C" { +#endif + +// +// Reversing Machine Module +// +__declspec(dllimport) int ReversingMachineStart(); +__declspec(dllimport) int ReversingMachineStop(); + +#ifdef __cplusplus +} +#endif + + +//..\..\..\bin\debug\SDK\Imports\HyperDbgScriptImports.h +/** + * @file HyperDbgScriptImports.h + * @author Sina Karvandi (sina@hyperdbg.org) + * @brief Headers relating exported functions from script engine + * @version 0.2 + * @date 2023-02-02 + * + * @copyright This project is released under the GNU Public License v3. + * + */ +#pragma once + +// +// Header file of script-engine +// Imports +// +#ifdef __cplusplus +extern "C" { +#endif + +__declspec(dllimport) PSYMBOL_BUFFER ScriptEngineParse(char * str); +__declspec(dllimport) PSYMBOL_BUFFER GetStackBuffer(); +__declspec(dllimport) void PrintSymbolBuffer(const PSYMBOL_BUFFER SymbolBuffer); +__declspec(dllimport) void PrintSymbol(PSYMBOL Symbol); +__declspec(dllimport) void RemoveSymbolBuffer(PSYMBOL_BUFFER SymbolBuffer); + +// +// pdb parser +// +__declspec(dllimport) VOID + ScriptEngineSetTextMessageCallback(PVOID Handler); +__declspec(dllimport) VOID + ScriptEngineSymbolAbortLoading(); +__declspec(dllimport) UINT64 + ScriptEngineConvertNameToAddress(const char * FunctionOrVariableName, PBOOLEAN WasFound); +__declspec(dllimport) UINT32 + ScriptEngineLoadFileSymbol(UINT64 BaseAddress, const char * PdbFileName, const char * CustomModuleName); +__declspec(dllimport) UINT32 + ScriptEngineUnloadAllSymbols(); +__declspec(dllimport) UINT32 + ScriptEngineUnloadModuleSymbol(char * ModuleName); +__declspec(dllimport) UINT32 + ScriptEngineSearchSymbolForMask(const char * SearchMask); +__declspec(dllimport) BOOLEAN + ScriptEngineGetFieldOffset(CHAR * TypeName, CHAR * FieldName, UINT32 * FieldOffset); +__declspec(dllimport) BOOLEAN + ScriptEngineGetDataTypeSize(CHAR * TypeName, UINT64 * TypeSize); +__declspec(dllimport) BOOLEAN + ScriptEngineCreateSymbolTableForDisassembler(void * CallbackFunction); +__declspec(dllimport) BOOLEAN + ScriptEngineConvertFileToPdbPath(const char * LocalFilePath, char * ResultPath); +__declspec(dllimport) BOOLEAN + ScriptEngineConvertFileToPdbFileAndGuidAndAgeDetails(const char * LocalFilePath, char * PdbFilePath, char * GuidAndAgeDetails, BOOLEAN Is32BitModule); +__declspec(dllimport) BOOLEAN + ScriptEngineSymbolInitLoad(PVOID BufferToStoreDetails, UINT32 StoredLength, BOOLEAN DownloadIfAvailable, const char * SymbolPath, BOOLEAN IsSilentLoad); +__declspec(dllimport) BOOLEAN + ScriptEngineShowDataBasedOnSymbolTypes(const char * TypeName, UINT64 Address, BOOLEAN IsStruct, PVOID BufferAddress, const char * AdditionalParameters); + +#ifdef __cplusplus +} +#endif + + +//..\..\..\bin\debug\SDK\Imports\HyperDbgSymImports.h +/** + * @file HyperDbgSymImports.h + * @author Sina Karvandi (sina@hyperdbg.org) + * @brief Headers relating exported functions from symbol parser + * @version 0.2 + * @date 2023-02-02 + * + * @copyright This project is released under the GNU Public License v3. + * + */ +#pragma once + +// +// Header file of symbol-parser +// Imports +// +#ifdef __cplusplus +extern "C" { +#endif + +__declspec(dllimport) VOID + SymSetTextMessageCallback(PVOID Handler); +__declspec(dllimport) VOID + SymbolAbortLoading(); +__declspec(dllimport) UINT64 + SymConvertNameToAddress(const char * FunctionOrVariableName, PBOOLEAN WasFound); +__declspec(dllimport) UINT32 + SymLoadFileSymbol(UINT64 BaseAddress, const char * PdbFileName, const char * CustomModuleName); +__declspec(dllimport) UINT32 + SymUnloadAllSymbols(); +__declspec(dllimport) UINT32 + SymUnloadModuleSymbol(char * ModuleName); +__declspec(dllimport) UINT32 + SymSearchSymbolForMask(const char * SearchMask); +__declspec(dllimport) BOOLEAN + SymGetFieldOffset(CHAR * TypeName, CHAR * FieldName, UINT32 * FieldOffset); +__declspec(dllimport) BOOLEAN + SymGetDataTypeSize(CHAR * TypeName, UINT64 * TypeSize); +__declspec(dllimport) BOOLEAN + SymCreateSymbolTableForDisassembler(void * CallbackFunction); +__declspec(dllimport) BOOLEAN + SymConvertFileToPdbPath(const char * LocalFilePath, char * ResultPath); +__declspec(dllimport) BOOLEAN + SymConvertFileToPdbFileAndGuidAndAgeDetails(const char * LocalFilePath, + char * PdbFilePath, + char * GuidAndAgeDetails, + BOOLEAN Is32BitModule); +__declspec(dllimport) BOOLEAN + SymbolInitLoad(PVOID BufferToStoreDetails, + UINT32 StoredLength, + BOOLEAN DownloadIfAvailable, + const char * SymbolPath, + BOOLEAN IsSilentLoad); +__declspec(dllimport) BOOLEAN + SymShowDataBasedOnSymbolTypes(const char * TypeName, + UINT64 Address, + BOOLEAN IsStruct, + PVOID BufferAddress, + const char * AdditionalParameters); +__declspec(dllimport) BOOLEAN + SymQuerySizeof(_In_ const char * StructNameOrTypeName, _Out_ UINT32 * SizeOfField); +__declspec(dllimport) BOOLEAN + SymCastingQueryForFiledsAndTypes(_In_ const char * StructName, + _In_ const char * FiledOfStructName, + _Out_ PBOOLEAN IsStructNamePointerOrNot, + _Out_ PBOOLEAN IsFiledOfStructNamePointerOrNot, + _Out_ char ** NewStructOrTypeName, + _Out_ UINT32 * OffsetOfFieldFromTop, + _Out_ UINT32 * SizeOfField); + +#ifdef __cplusplus +} +#endif + + +//..\..\..\bin\debug\SDK\Imports\HyperDbgVmmImports.h +/** + * @file HyperDbgVmmImports.h + * @author Sina Karvandi (sina@hyperdbg.org) + * @brief Headers relating exported functions from hypervisor + * @version 0.1 + * @date 2022-12-09 + * + * @copyright This project is released under the GNU Public License v3. + * + */ +#pragma once + +#ifdef HYPERDBG_VMM +# define IMPORT_EXPORT_VMM __declspec(dllexport) +#else +# define IMPORT_EXPORT_VMM __declspec(dllimport) +#endif + +////////////////////////////////////////////////// +// VM Functions // +////////////////////////////////////////////////// + +IMPORT_EXPORT_VMM NTSTATUS +VmFuncVmxVmcall(unsigned long long VmcallNumber, + unsigned long long OptionalParam1, + unsigned long long OptionalParam2, + unsigned long long OptionalParam3); + +IMPORT_EXPORT_VMM VOID +VmFuncPerformRipIncrement(UINT32 CoreId); + +IMPORT_EXPORT_VMM VOID +VmFuncSuppressRipIncrement(UINT32 CoreId); + +IMPORT_EXPORT_VMM VOID +VmFuncChangeMtfUnsettingState(UINT32 CoreId, BOOLEAN Set); + +IMPORT_EXPORT_VMM VOID +VmFuncChangeIgnoreOneMtfState(UINT32 CoreId, BOOLEAN Set); + +IMPORT_EXPORT_VMM VOID +VmFuncSetMonitorTrapFlag(BOOLEAN Set); + +IMPORT_EXPORT_VMM VOID +VmFuncSetRflagTrapFlag(BOOLEAN Set); + +IMPORT_EXPORT_VMM VOID +VmFuncRegisterMtfBreak(UINT32 CoreId); + +IMPORT_EXPORT_VMM VOID +VmFuncUnRegisterMtfBreak(UINT32 CoreId); + +IMPORT_EXPORT_VMM VOID +VmFuncSetLoadDebugControls(BOOLEAN Set); + +IMPORT_EXPORT_VMM VOID +VmFuncSetSaveDebugControls(BOOLEAN Set); + +IMPORT_EXPORT_VMM VOID +VmFuncSetPmcVmexit(BOOLEAN Set); + +IMPORT_EXPORT_VMM VOID +VmFuncSetMovControlRegsExiting(BOOLEAN Set, UINT64 ControlRegister, UINT64 MaskRegister); + +IMPORT_EXPORT_VMM VOID +VmFuncSetMovToCr3Vmexit(UINT32 CoreId, BOOLEAN Set); + +IMPORT_EXPORT_VMM VOID +VmFuncWriteExceptionBitmap(UINT32 BitmapMask); + +IMPORT_EXPORT_VMM VOID +VmFuncSetInterruptWindowExiting(BOOLEAN Set); + +IMPORT_EXPORT_VMM VOID +VmFuncSetNmiWindowExiting(BOOLEAN Set); + +IMPORT_EXPORT_VMM VOID +VmFuncSetNmiExiting(BOOLEAN Set); + +IMPORT_EXPORT_VMM VOID +VmFuncSetExceptionBitmap(UINT32 CoreId, UINT32 IdtIndex); + +IMPORT_EXPORT_VMM VOID +VmFuncUnsetExceptionBitmap(UINT32 CoreId, UINT32 IdtIndex); + +IMPORT_EXPORT_VMM VOID +VmFuncSetExternalInterruptExiting(UINT32 CoreId, BOOLEAN Set); + +IMPORT_EXPORT_VMM VOID +VmFuncSetRdtscExiting(UINT32 CoreId, BOOLEAN Set); + +IMPORT_EXPORT_VMM VOID +VmFuncSetMovDebugRegsExiting(UINT32 CoreId, BOOLEAN Set); + +IMPORT_EXPORT_VMM VOID +VmFuncInjectPendingExternalInterrupts(UINT32 CoreId); + +IMPORT_EXPORT_VMM VOID +VmFuncSetRflags(UINT64 Rflags); + +IMPORT_EXPORT_VMM VOID +VmFuncSetRip(UINT64 Rip); + +IMPORT_EXPORT_VMM VOID +VmFuncSetTriggerEventForVmcalls(BOOLEAN Set); + +IMPORT_EXPORT_VMM VOID +VmFuncSetTriggerEventForCpuids(BOOLEAN Set); + +IMPORT_EXPORT_VMM VOID +VmFuncSetInterruptibilityState(UINT64 InterruptibilityState); + +IMPORT_EXPORT_VMM VOID +VmFuncCheckAndEnableExternalInterrupts(UINT32 CoreId); + +IMPORT_EXPORT_VMM VOID +VmFuncDisableExternalInterruptsAndInterruptWindow(UINT32 CoreId); + +IMPORT_EXPORT_VMM VOID +VmFuncEventInjectPageFaultWithCr2(UINT32 CoreId, UINT64 Address, UINT32 PageFaultCode); + +IMPORT_EXPORT_VMM VOID +VmFuncEventInjectPageFaultRangeAddress(UINT32 CoreId, + UINT64 AddressFrom, + UINT64 AddressTo, + UINT32 PageFaultCode); + +IMPORT_EXPORT_VMM VOID +VmFuncEventInjectInterruption(UINT32 InterruptionType, + UINT32 Vector, + BOOLEAN DeliverErrorCode, + UINT32 ErrorCode); + +IMPORT_EXPORT_VMM VOID +VmFuncVmxBroadcastInitialize(); + +IMPORT_EXPORT_VMM VOID +VmFuncVmxBroadcastUninitialize(); + +IMPORT_EXPORT_VMM VOID +VmFuncEventInjectBreakpoint(); + +IMPORT_EXPORT_VMM VOID +VmFuncInvalidateEptSingleContext(UINT32 CoreId); + +IMPORT_EXPORT_VMM VOID +VmFuncInvalidateEptAllContexts(); + +IMPORT_EXPORT_VMM VOID +VmFuncUninitVmm(); + +IMPORT_EXPORT_VMM VOID +VmFuncEnableMtfAndChangeExternalInterruptState(UINT32 CoreId); + +IMPORT_EXPORT_VMM VOID +VmFuncEnableAndCheckForPreviousExternalInterrupts(UINT32 CoreId); + +IMPORT_EXPORT_VMM UINT16 +VmFuncGetCsSelector(); + +IMPORT_EXPORT_VMM UINT32 +VmFuncReadExceptionBitmap(); + +IMPORT_EXPORT_VMM UINT64 +VmFuncGetLastVmexitRip(UINT32 CoreId); + +IMPORT_EXPORT_VMM UINT64 +VmFuncGetRflags(); + +IMPORT_EXPORT_VMM UINT64 +VmFuncGetRip(); + +IMPORT_EXPORT_VMM UINT64 +VmFuncGetInterruptibilityState(); + +IMPORT_EXPORT_VMM UINT64 +VmFuncClearSteppingBits(UINT64 Interruptibility); + +IMPORT_EXPORT_VMM BOOLEAN +VmFuncInitVmm(VMM_CALLBACKS * VmmCallbacks); + +IMPORT_EXPORT_VMM UINT32 +VmFuncVmxCompatibleStrlen(const CHAR * s); + +IMPORT_EXPORT_VMM UINT32 +VmFuncVmxCompatibleWcslen(const wchar_t * s); + +IMPORT_EXPORT_VMM BOOLEAN +VmFuncNmiBroadcastRequest(UINT32 CoreId); + +IMPORT_EXPORT_VMM BOOLEAN +VmFuncNmiBroadcastInvalidateEptSingleContext(UINT32 CoreId); + +IMPORT_EXPORT_VMM BOOLEAN +VmFuncNmiBroadcastInvalidateEptAllContexts(UINT32 CoreId); + +IMPORT_EXPORT_VMM BOOLEAN +VmFuncVmxGetCurrentExecutionMode(); + +IMPORT_EXPORT_VMM BOOLEAN +VmFuncQueryModeExecTrap(); + +IMPORT_EXPORT_VMM INT32 +VmFuncVmxCompatibleStrcmp(const CHAR * Address1, const CHAR * Address2); + +IMPORT_EXPORT_VMM INT32 +VmFuncVmxCompatibleStrncmp(const CHAR * Address1, const CHAR * Address2, SIZE_T Num); + +IMPORT_EXPORT_VMM INT32 +VmFuncVmxCompatibleWcscmp(const wchar_t * Address1, const wchar_t * Address2); + +IMPORT_EXPORT_VMM INT32 +VmFuncVmxCompatibleWcsncmp(const wchar_t * Address1, const wchar_t * Address2, SIZE_T Num); + +IMPORT_EXPORT_VMM INT32 +VmFuncVmxCompatibleMemcmp(const CHAR * Address1, const CHAR * Address2, size_t Count); + +////////////////////////////////////////////////// +// Configuration Functions // +////////////////////////////////////////////////// + +IMPORT_EXPORT_VMM VOID +ConfigureEnableMovToCr3ExitingOnAllProcessors(); + +IMPORT_EXPORT_VMM VOID +ConfigureDisableMovToCr3ExitingOnAllProcessors(); + +IMPORT_EXPORT_VMM VOID +ConfigureEnableEferSyscallEventsOnAllProcessors(); + +IMPORT_EXPORT_VMM VOID +ConfigureDisableEferSyscallEventsOnAllProcessors(); + +IMPORT_EXPORT_VMM VOID +ConfigureSetExternalInterruptExitingOnSingleCore(UINT32 TargetCoreId); + +IMPORT_EXPORT_VMM VOID +ConfigureEnableRdtscExitingOnSingleCore(UINT32 TargetCoreId); + +IMPORT_EXPORT_VMM VOID +ConfigureEnableRdpmcExitingOnSingleCore(UINT32 TargetCoreId); + +IMPORT_EXPORT_VMM VOID +ConfigureEnableMovToDebugRegistersExitingOnSingleCore(UINT32 TargetCoreId); + +IMPORT_EXPORT_VMM VOID +ConfigureSetExceptionBitmapOnSingleCore(UINT32 TargetCoreId, UINT32 BitMask); + +IMPORT_EXPORT_VMM VOID +ConfigureEnableMovToControlRegisterExitingOnSingleCore(UINT32 TargetCoreId, DEBUGGER_EVENT_OPTIONS * BroadcastingOption); + +IMPORT_EXPORT_VMM VOID +ConfigureChangeMsrBitmapWriteOnSingleCore(UINT32 TargetCoreId, UINT64 MsrMask); + +IMPORT_EXPORT_VMM VOID +ConfigureChangeMsrBitmapReadOnSingleCore(UINT32 TargetCoreId, UINT64 MsrMask); + +IMPORT_EXPORT_VMM VOID +ConfigureChangeIoBitmapOnSingleCore(UINT32 TargetCoreId, UINT64 Port); + +IMPORT_EXPORT_VMM VOID +ConfigureEnableEferSyscallHookOnSingleCore(UINT32 TargetCoreId); + +IMPORT_EXPORT_VMM VOID +ConfigureSetEferSyscallOrSysretHookType(DEBUGGER_EVENT_SYSCALL_SYSRET_TYPE SyscallHookType); + +IMPORT_EXPORT_VMM VOID +ConfigureDirtyLoggingInitializeOnAllProcessors(); + +IMPORT_EXPORT_VMM VOID +ConfigureDirtyLoggingUninitializeOnAllProcessors(); + +IMPORT_EXPORT_VMM VOID +ConfigureModeBasedExecHookUninitializeOnAllProcessors(); + +IMPORT_EXPORT_VMM VOID +ConfigureUninitializeExecTrapOnAllProcessors(); + +IMPORT_EXPORT_VMM BOOLEAN +ConfigureInitializeExecTrapOnAllProcessors(); + +IMPORT_EXPORT_VMM BOOLEAN +ConfigureEptHook(PVOID TargetAddress, UINT32 ProcessId); + +IMPORT_EXPORT_VMM BOOLEAN +ConfigureEptHookFromVmxRoot(PVOID TargetAddress); + +IMPORT_EXPORT_VMM BOOLEAN +ConfigureEptHook2(UINT32 CoreId, + PVOID TargetAddress, + PVOID HookFunction, + UINT32 ProcessId); + +IMPORT_EXPORT_VMM BOOLEAN +ConfigureEptHook2FromVmxRoot(UINT32 CoreId, + PVOID TargetAddress, + PVOID HookFunction); + +IMPORT_EXPORT_VMM BOOLEAN +ConfigureEptHookMonitor(UINT32 CoreId, + EPT_HOOKS_ADDRESS_DETAILS_FOR_MEMORY_MONITOR * HookingDetails, + UINT32 ProcessId); + +IMPORT_EXPORT_VMM BOOLEAN +ConfigureEptHookMonitorFromVmxRoot(UINT32 CoreId, + EPT_HOOKS_ADDRESS_DETAILS_FOR_MEMORY_MONITOR * MemoryAddressDetails); + +IMPORT_EXPORT_VMM BOOLEAN +ConfigureEptHookModifyInstructionFetchState(UINT32 CoreId, + PVOID PhysicalAddress, + BOOLEAN IsUnset); + +IMPORT_EXPORT_VMM BOOLEAN +ConfigureEptHookModifyPageReadState(UINT32 CoreId, + PVOID PhysicalAddress, + BOOLEAN IsUnset); + +IMPORT_EXPORT_VMM BOOLEAN +ConfigureEptHookModifyPageWriteState(UINT32 CoreId, + PVOID PhysicalAddress, + BOOLEAN IsUnset); + +IMPORT_EXPORT_VMM BOOLEAN +ConfigureEptHookUnHookSingleAddress(UINT64 VirtualAddress, + UINT64 PhysAddress, + UINT32 ProcessId); + +IMPORT_EXPORT_VMM BOOLEAN +ConfigureEptHookUnHookSingleAddressFromVmxRoot(UINT64 VirtualAddress, + UINT64 PhysAddress, + EPT_SINGLE_HOOK_UNHOOKING_DETAILS * TargetUnhookingDetails); + +IMPORT_EXPORT_VMM VOID +ConfigureEptHookAllocateExtraHookingPagesForMemoryMonitorsAndExecEptHooks(UINT32 Count); + +IMPORT_EXPORT_VMM VOID +ConfigureEptHookReservePreallocatedPoolsForEptHooks(UINT32 Count); + +IMPORT_EXPORT_VMM BOOLEAN +ConfigureExecTrapAddProcessToWatchingList(UINT32 ProcessId); + +IMPORT_EXPORT_VMM BOOLEAN +ConfigureExecTrapRemoveProcessFromWatchingList(UINT32 ProcessId); + +////////////////////////////////////////////////// +// Direct VMCALL Functions // +////////////////////////////////////////////////// + +IMPORT_EXPORT_VMM NTSTATUS +DirectVmcallTest(UINT32 CoreId, DIRECT_VMCALL_PARAMETERS * DirectVmcallOptions); + +IMPORT_EXPORT_VMM NTSTATUS +DirectVmcallPerformVmcall(UINT32 CoreId, UINT64 VmcallNumber, DIRECT_VMCALL_PARAMETERS * DirectVmcallOptions); + +IMPORT_EXPORT_VMM NTSTATUS +DirectVmcallChangeMsrBitmapRead(UINT32 CoreId, DIRECT_VMCALL_PARAMETERS * DirectVmcallOptions); + +IMPORT_EXPORT_VMM NTSTATUS +DirectVmcallChangeMsrBitmapWrite(UINT32 CoreId, DIRECT_VMCALL_PARAMETERS * DirectVmcallOptions); + +IMPORT_EXPORT_VMM NTSTATUS +DirectVmcallChangeIoBitmap(UINT32 CoreId, DIRECT_VMCALL_PARAMETERS * DirectVmcallOptions); + +IMPORT_EXPORT_VMM NTSTATUS +DirectVmcallEnableRdpmcExiting(UINT32 CoreId, DIRECT_VMCALL_PARAMETERS * DirectVmcallOptions); + +IMPORT_EXPORT_VMM NTSTATUS +DirectVmcallEnableRdtscpExiting(UINT32 CoreId, DIRECT_VMCALL_PARAMETERS * DirectVmcallOptions); + +IMPORT_EXPORT_VMM NTSTATUS +DirectVmcallEnableMov2DebugRegsExiting(UINT32 CoreId, DIRECT_VMCALL_PARAMETERS * DirectVmcallOptions); + +IMPORT_EXPORT_VMM NTSTATUS +DirectVmcallSetExceptionBitmap(UINT32 CoreId, DIRECT_VMCALL_PARAMETERS * DirectVmcallOptions); + +IMPORT_EXPORT_VMM NTSTATUS +DirectVmcallEnableExternalInterruptExiting(UINT32 CoreId, DIRECT_VMCALL_PARAMETERS * DirectVmcallOptions); + +IMPORT_EXPORT_VMM NTSTATUS +DirectVmcallEnableMovToCrExiting(UINT32 CoreId, DIRECT_VMCALL_PARAMETERS * DirectVmcallOptions); + +IMPORT_EXPORT_VMM NTSTATUS +DirectVmcallEnableEferSyscall(UINT32 CoreId, DIRECT_VMCALL_PARAMETERS * DirectVmcallOptions); + +IMPORT_EXPORT_VMM NTSTATUS +DirectVmcallSetHiddenBreakpointHook(UINT32 CoreId, DIRECT_VMCALL_PARAMETERS * DirectVmcallOptions); + +IMPORT_EXPORT_VMM NTSTATUS +DirectVmcallInvalidateEptAllContexts(UINT32 CoreId, DIRECT_VMCALL_PARAMETERS * DirectVmcallOptions); + +IMPORT_EXPORT_VMM NTSTATUS +DirectVmcallInvalidateSingleContext(UINT32 CoreId, DIRECT_VMCALL_PARAMETERS * DirectVmcallOptions); + +IMPORT_EXPORT_VMM NTSTATUS +DirectVmcallUnsetExceptionBitmap(UINT32 CoreId, DIRECT_VMCALL_PARAMETERS * DirectVmcallOptions); + +IMPORT_EXPORT_VMM NTSTATUS +DirectVmcallUnhookSinglePage(UINT32 CoreId, DIRECT_VMCALL_PARAMETERS * DirectVmcallOptions); + +IMPORT_EXPORT_VMM NTSTATUS +DirectVmcallSetDisableExternalInterruptExitingOnlyOnClearingInterruptEvents(UINT32 CoreId, DIRECT_VMCALL_PARAMETERS * DirectVmcallOptions); + +IMPORT_EXPORT_VMM NTSTATUS +DirectVmcallResetMsrBitmapRead(UINT32 CoreId, DIRECT_VMCALL_PARAMETERS * DirectVmcallOptions); + +IMPORT_EXPORT_VMM NTSTATUS +DirectVmcallResetMsrBitmapWrite(UINT32 CoreId, DIRECT_VMCALL_PARAMETERS * DirectVmcallOptions); + +IMPORT_EXPORT_VMM NTSTATUS +DirectVmcallResetExceptionBitmapOnlyOnClearingExceptionEvents(UINT32 CoreId, DIRECT_VMCALL_PARAMETERS * DirectVmcallOptions); + +IMPORT_EXPORT_VMM NTSTATUS +DirectVmcallResetIoBitmap(UINT32 CoreId, DIRECT_VMCALL_PARAMETERS * DirectVmcallOptions); + +IMPORT_EXPORT_VMM NTSTATUS +DirectVmcallDisableRdtscExitingForClearingTscEvents(UINT32 CoreId, DIRECT_VMCALL_PARAMETERS * DirectVmcallOptions); + +IMPORT_EXPORT_VMM NTSTATUS +DirectVmcallDisableRdpmcExiting(UINT32 CoreId, DIRECT_VMCALL_PARAMETERS * DirectVmcallOptions); + +IMPORT_EXPORT_VMM NTSTATUS +DirectVmcallDisableEferSyscallEvents(UINT32 CoreId, DIRECT_VMCALL_PARAMETERS * DirectVmcallOptions); + +IMPORT_EXPORT_VMM NTSTATUS +DirectVmcallDisableMov2DrExitingForClearingDrEvents(UINT32 CoreId, DIRECT_VMCALL_PARAMETERS * DirectVmcallOptions); + +IMPORT_EXPORT_VMM NTSTATUS +DirectVmcallDisableMov2CrExitingForClearingCrEvents(UINT32 CoreId, DIRECT_VMCALL_PARAMETERS * DirectVmcallOptions); + +////////////////////////////////////////////////// +// Disassembler // +////////////////////////////////////////////////// + +IMPORT_EXPORT_VMM BOOLEAN +DisassemblerShowInstructionsInVmxNonRootMode(PVOID Address, UINT32 Length, BOOLEAN Is32Bit); + +IMPORT_EXPORT_VMM BOOLEAN +DisassemblerShowOneInstructionInVmxNonRootMode(PVOID Address, UINT64 ActualRip, BOOLEAN Is32Bit); + +IMPORT_EXPORT_VMM UINT32 +DisassemblerShowOneInstructionInVmxRootMode(PVOID Address, BOOLEAN Is32Bit); + +////////////////////////////////////////////////// +// General Functions // +////////////////////////////////////////////////// + +// ---------------------------------------------------------------------------- +// Exported Interfaces For Virtual Addresses +// + +IMPORT_EXPORT_VMM UINT64 +VirtualAddressToPhysicalAddress(_In_ PVOID VirtualAddress); + +IMPORT_EXPORT_VMM UINT64 +VirtualAddressToPhysicalAddressByProcessId(_In_ PVOID VirtualAddress, + _In_ UINT32 ProcessId); + +IMPORT_EXPORT_VMM UINT64 +VirtualAddressToPhysicalAddressByProcessCr3(_In_ PVOID VirtualAddress, + _In_ CR3_TYPE TargetCr3); + +IMPORT_EXPORT_VMM UINT64 +VirtualAddressToPhysicalAddressOnTargetProcess(_In_ PVOID VirtualAddress); + +// ---------------------------------------------------------------------------- +// Exported Interfaces For Physical Addresses +// +IMPORT_EXPORT_VMM UINT64 +PhysicalAddressToVirtualAddress(_In_ UINT64 PhysicalAddress); + +IMPORT_EXPORT_VMM UINT64 +PhysicalAddressToVirtualAddressByProcessId(_In_ PVOID PhysicalAddress, _In_ UINT32 ProcessId); + +IMPORT_EXPORT_VMM UINT64 +PhysicalAddressToVirtualAddressByCr3(_In_ PVOID PhysicalAddress, _In_ CR3_TYPE TargetCr3); + +IMPORT_EXPORT_VMM UINT64 +PhysicalAddressToVirtualAddressOnTargetProcess(_In_ PVOID PhysicalAddress); + +// ---------------------------------------------------------------------------- +// Exported Interfaces For Layout Switching Functions +// +IMPORT_EXPORT_VMM CR3_TYPE +SwitchToProcessMemoryLayout(_In_ UINT32 ProcessId); + +IMPORT_EXPORT_VMM CR3_TYPE +SwitchToCurrentProcessMemoryLayout(); + +IMPORT_EXPORT_VMM CR3_TYPE +SwitchToProcessMemoryLayoutByCr3(_In_ CR3_TYPE TargetCr3); + +IMPORT_EXPORT_VMM VOID +SwitchToPreviousProcess(_In_ CR3_TYPE PreviousProcess); + +// ---------------------------------------------------------------------------- +// Exported Interfaces For Check Validity of Addresses +// +IMPORT_EXPORT_VMM BOOLEAN +CheckAddressValidityUsingTsx(CHAR * Address); + +IMPORT_EXPORT_VMM BOOLEAN +CheckAccessValidityAndSafety(UINT64 TargetAddress, UINT32 Size); + +IMPORT_EXPORT_VMM BOOLEAN +CheckAddressPhysical(UINT64 PAddr); + +IMPORT_EXPORT_VMM UINT32 +CheckAddressMaximumInstructionLength(PVOID Address); + +// ---------------------------------------------------------------------------- +// Exported Interfaces For Layout Functions +// +IMPORT_EXPORT_VMM CR3_TYPE +LayoutGetCurrentProcessCr3(); + +IMPORT_EXPORT_VMM CR3_TYPE +LayoutGetExactGuestProcessCr3(); + +////////////////////////////////////////////////// +// Memory Management Functions // +////////////////////////////////////////////////// + +// ---------------------------------------------------------------------------- +// PTE-related Functions +// + +IMPORT_EXPORT_VMM PVOID +MemoryMapperGetPteVa(_In_ PVOID Va, + _In_ PAGING_LEVEL Level); + +IMPORT_EXPORT_VMM PVOID +MemoryMapperGetPteVaByCr3(_In_ PVOID Va, + _In_ PAGING_LEVEL Level, + _In_ CR3_TYPE TargetCr3); + +IMPORT_EXPORT_VMM PVOID +MemoryMapperGetPteVaWithoutSwitchingByCr3(_In_ PVOID Va, + _In_ PAGING_LEVEL Level, + _In_ CR3_TYPE TargetCr3); + +IMPORT_EXPORT_VMM PVOID +MemoryMapperGetPteVaOnTargetProcess(_In_ PVOID Va, + _In_ PAGING_LEVEL Level); + +IMPORT_EXPORT_VMM PVOID +MemoryMapperSetExecuteDisableToPteOnTargetProcess(_In_ PVOID Va, + _In_ BOOLEAN Set); + +IMPORT_EXPORT_VMM BOOLEAN +MemoryMapperCheckPteIsPresentOnTargetProcess(PVOID Va, + PAGING_LEVEL Level); + +// ---------------------------------------------------------------------------- +// Reading Memory Functions +// +IMPORT_EXPORT_VMM BOOLEAN +MemoryMapperReadMemorySafe(_In_ UINT64 VaAddressToRead, + _Inout_ PVOID BufferToSaveMemory, + _In_ SIZE_T SizeToRead); + +IMPORT_EXPORT_VMM BOOLEAN +MemoryMapperReadMemorySafeByPhysicalAddress(_In_ UINT64 PaAddressToRead, + _Inout_ UINT64 BufferToSaveMemory, + _In_ SIZE_T SizeToRead); + +IMPORT_EXPORT_VMM BOOLEAN +MemoryMapperReadMemorySafeOnTargetProcess(_In_ UINT64 VaAddressToRead, + _Inout_ PVOID BufferToSaveMemory, + _In_ SIZE_T SizeToRead); + +// ---------------------------------------------------------------------------- +// Disassembler Functions +// +IMPORT_EXPORT_VMM UINT32 +DisassemblerLengthDisassembleEngine(PVOID Address, BOOLEAN Is32Bit); + +IMPORT_EXPORT_VMM UINT32 +DisassemblerLengthDisassembleEngineInVmxRootOnTargetProcess(PVOID Address, BOOLEAN Is32Bit); + +// ---------------------------------------------------------------------------- +// Writing Memory Functions +// +IMPORT_EXPORT_VMM BOOLEAN +MemoryMapperWriteMemorySafe(_Inout_ UINT64 Destination, + _In_ PVOID Source, + _In_ SIZE_T SizeToWrite, + _In_ CR3_TYPE TargetProcessCr3); + +IMPORT_EXPORT_VMM BOOLEAN +MemoryMapperWriteMemorySafeOnTargetProcess(_Inout_ UINT64 Destination, + _In_ PVOID Source, + _In_ SIZE_T Size); + +IMPORT_EXPORT_VMM BOOLEAN +MemoryMapperWriteMemorySafeByPhysicalAddress(_Inout_ UINT64 DestinationPa, + _In_ UINT64 Source, + _In_ SIZE_T SizeToWrite); + +IMPORT_EXPORT_VMM BOOLEAN +MemoryMapperWriteMemoryUnsafe(_Inout_ UINT64 Destination, + _In_ PVOID Source, + _In_ SIZE_T SizeToWrite, + _In_ UINT32 TargetProcessId); + +// ---------------------------------------------------------------------------- +// Reserving Memory Functions +// +IMPORT_EXPORT_VMM UINT64 +MemoryMapperReserveUsermodeAddressOnTargetProcess(_In_ UINT32 ProcessId, + _In_ BOOLEAN Allocate); + +IMPORT_EXPORT_VMM BOOLEAN +MemoryMapperFreeMemoryOnTargetProcess(_In_ UINT32 ProcessId, + _Inout_ PVOID BaseAddress); + +// ---------------------------------------------------------------------------- +// Miscellaneous Memory Functions +// +IMPORT_EXPORT_VMM BOOLEAN +MemoryMapperSetSupervisorBitWithoutSwitchingByCr3(_In_ PVOID Va, + _In_ BOOLEAN Set, + _In_ PAGING_LEVEL Level, + _In_ CR3_TYPE TargetCr3); + +IMPORT_EXPORT_VMM BOOLEAN +MemoryMapperCheckIfPageIsNxBitSetOnTargetProcess(_In_ PVOID Va); + +IMPORT_EXPORT_VMM BOOLEAN +MemoryMapperCheckIfPdeIsLargePageOnTargetProcess(_In_ PVOID Va); + +////////////////////////////////////////////////// +// Memory Manager // +////////////////////////////////////////////////// + +IMPORT_EXPORT_VMM BOOLEAN +MemoryManagerReadProcessMemoryNormal(HANDLE PID, PVOID Address, DEBUGGER_READ_MEMORY_TYPE MemType, PVOID UserBuffer, SIZE_T Size, PSIZE_T ReturnSize); + +////////////////////////////////////////////////// +// Pool Manager // +////////////////////////////////////////////////// + +IMPORT_EXPORT_VMM BOOLEAN +PoolManagerCheckAndPerformAllocationAndDeallocation(); + +IMPORT_EXPORT_VMM BOOLEAN +PoolManagerRequestAllocation(SIZE_T Size, UINT32 Count, POOL_ALLOCATION_INTENTION Intention); + +IMPORT_EXPORT_VMM UINT64 +PoolManagerRequestPool(POOL_ALLOCATION_INTENTION Intention, BOOLEAN RequestNewPool, UINT32 Size); + +IMPORT_EXPORT_VMM BOOLEAN +PoolManagerFreePool(UINT64 AddressToFree); + +IMPORT_EXPORT_VMM VOID +PoolManagerShowPreAllocatedPools(); + +////////////////////////////////////////////////// +// VMX Registers Modification // +////////////////////////////////////////////////// + +IMPORT_EXPORT_VMM VOID +SetGuestCsSel(PVMX_SEGMENT_SELECTOR Cs); + +IMPORT_EXPORT_VMM VOID +SetGuestCs(PVMX_SEGMENT_SELECTOR Cs); + +IMPORT_EXPORT_VMM VMX_SEGMENT_SELECTOR +GetGuestCs(); + +IMPORT_EXPORT_VMM VOID +SetGuestSsSel(PVMX_SEGMENT_SELECTOR Ss); + +IMPORT_EXPORT_VMM VOID +SetGuestSs(PVMX_SEGMENT_SELECTOR Ss); + +IMPORT_EXPORT_VMM VMX_SEGMENT_SELECTOR +GetGuestSs(); + +IMPORT_EXPORT_VMM VOID +SetGuestDsSel(PVMX_SEGMENT_SELECTOR Ds); + +IMPORT_EXPORT_VMM VOID +SetGuestDs(PVMX_SEGMENT_SELECTOR Ds); + +IMPORT_EXPORT_VMM VMX_SEGMENT_SELECTOR +GetGuestDs(); + +IMPORT_EXPORT_VMM VOID +SetGuestFsSel(PVMX_SEGMENT_SELECTOR Fs); + +IMPORT_EXPORT_VMM VOID +SetGuestFs(PVMX_SEGMENT_SELECTOR Fs); + +IMPORT_EXPORT_VMM VMX_SEGMENT_SELECTOR +GetGuestFs(); + +IMPORT_EXPORT_VMM VOID +SetGuestGsSel(PVMX_SEGMENT_SELECTOR Gs); + +IMPORT_EXPORT_VMM VOID +SetGuestGs(PVMX_SEGMENT_SELECTOR Gs); + +IMPORT_EXPORT_VMM VMX_SEGMENT_SELECTOR +GetGuestGs(); + +IMPORT_EXPORT_VMM VOID +SetGuestEsSel(PVMX_SEGMENT_SELECTOR Es); + +IMPORT_EXPORT_VMM VOID +SetGuestEs(PVMX_SEGMENT_SELECTOR Es); + +IMPORT_EXPORT_VMM VMX_SEGMENT_SELECTOR +GetGuestEs(); + +IMPORT_EXPORT_VMM VOID +SetGuestIdtr(UINT64 Idtr); + +IMPORT_EXPORT_VMM UINT64 +GetGuestIdtr(); + +IMPORT_EXPORT_VMM VOID +SetGuestLdtr(UINT64 Ldtr); + +IMPORT_EXPORT_VMM UINT64 +GetGuestLdtr(); + +IMPORT_EXPORT_VMM VOID +SetGuestGdtr(UINT64 Gdtr); + +IMPORT_EXPORT_VMM UINT64 +GetGuestGdtr(); + +IMPORT_EXPORT_VMM VOID +SetGuestTr(UINT64 Tr); + +IMPORT_EXPORT_VMM UINT64 +GetGuestTr(); + +IMPORT_EXPORT_VMM VOID +SetGuestRFlags(UINT64 RFlags); + +IMPORT_EXPORT_VMM UINT64 +GetGuestRFlags(); + +IMPORT_EXPORT_VMM VOID +SetGuestRIP(UINT64 RIP); + +IMPORT_EXPORT_VMM VOID +SetGuestRSP(UINT64 RSP); + +IMPORT_EXPORT_VMM UINT64 +GetGuestRIP(); + +IMPORT_EXPORT_VMM UINT64 +GetGuestCr0(); + +IMPORT_EXPORT_VMM UINT64 +GetGuestCr2(); + +IMPORT_EXPORT_VMM UINT64 +GetGuestCr3(); + +IMPORT_EXPORT_VMM UINT64 +GetGuestCr4(); + +IMPORT_EXPORT_VMM UINT64 +GetGuestCr8(); + +IMPORT_EXPORT_VMM VOID +SetGuestCr0(UINT64 Cr0); + +IMPORT_EXPORT_VMM VOID +SetGuestCr2(UINT64 Cr2); + +IMPORT_EXPORT_VMM VOID +SetGuestCr3(UINT64 Cr3); + +IMPORT_EXPORT_VMM VOID +SetGuestCr4(UINT64 Cr4); + +IMPORT_EXPORT_VMM VOID +SetGuestCr8(UINT64 Cr8); + +IMPORT_EXPORT_VMM UINT64 +GetGuestDr0(); + +IMPORT_EXPORT_VMM UINT64 +GetGuestDr1(); + +IMPORT_EXPORT_VMM UINT64 +GetGuestDr2(); + +IMPORT_EXPORT_VMM UINT64 +GetGuestDr3(); + +IMPORT_EXPORT_VMM UINT64 +GetGuestDr6(); + +IMPORT_EXPORT_VMM UINT64 +GetGuestDr7(); + +IMPORT_EXPORT_VMM VOID +SetGuestDr0(UINT64 value); + +IMPORT_EXPORT_VMM VOID +SetGuestDr1(UINT64 value); + +IMPORT_EXPORT_VMM VOID +SetGuestDr2(UINT64 value); + +IMPORT_EXPORT_VMM VOID +SetGuestDr3(UINT64 value); + +IMPORT_EXPORT_VMM VOID +SetGuestDr6(UINT64 value); + +IMPORT_EXPORT_VMM VOID +SetGuestDr7(UINT64 value); + +IMPORT_EXPORT_VMM BOOLEAN +SetDebugRegisters(UINT32 DebugRegNum, DEBUG_REGISTER_TYPE ActionType, BOOLEAN ApplyToVmcs, UINT64 TargetAddress); + +////////////////////////////////////////////////// +// Transparent Mode // +////////////////////////////////////////////////// + +IMPORT_EXPORT_VMM NTSTATUS +TransparentHideDebugger(PDEBUGGER_HIDE_AND_TRANSPARENT_DEBUGGER_MODE Measurements); + +IMPORT_EXPORT_VMM NTSTATUS +TransparentUnhideDebugger(); + +////////////////////////////////////////////////// +// Non-internal Broadcasting Functions // +////////////////////////////////////////////////// + +IMPORT_EXPORT_VMM VOID +BroadcastEnableBreakpointExitingOnExceptionBitmapAllCores(); + +IMPORT_EXPORT_VMM VOID +BroadcastDisableBreakpointExitingOnExceptionBitmapAllCores(); + +IMPORT_EXPORT_VMM VOID +BroadcastEnableDbAndBpExitingAllCores(); + +IMPORT_EXPORT_VMM VOID +BroadcastDisableDbAndBpExitingAllCores(); + +IMPORT_EXPORT_VMM VOID +BroadcastEnableRdtscExitingAllCores(); + +IMPORT_EXPORT_VMM VOID +BroadcastDisableRdtscExitingAllCores(); + +IMPORT_EXPORT_VMM VOID +BroadcastChangeAllMsrBitmapReadAllCores(UINT64 BitmapMask); + +IMPORT_EXPORT_VMM VOID +BroadcastResetChangeAllMsrBitmapReadAllCores(); + +IMPORT_EXPORT_VMM VOID +BroadcastChangeAllMsrBitmapWriteAllCores(UINT64 BitmapMask); + +IMPORT_EXPORT_VMM VOID +BroadcastResetAllMsrBitmapWriteAllCores(); + +IMPORT_EXPORT_VMM VOID +BroadcastDisableRdtscExitingForClearingEventsAllCores(); + +IMPORT_EXPORT_VMM VOID +BroadcastDisableMov2ControlRegsExitingForClearingEventsAllCores(PDEBUGGER_EVENT_OPTIONS BroadcastingOption); + +IMPORT_EXPORT_VMM VOID +BroadcastDisableMov2DebugRegsExitingForClearingEventsAllCores(); + +IMPORT_EXPORT_VMM VOID +BroadcastEnableRdpmcExitingAllCores(); + +IMPORT_EXPORT_VMM VOID +BroadcastDisableRdpmcExitingAllCores(); + +IMPORT_EXPORT_VMM VOID +BroadcastSetExceptionBitmapAllCores(UINT64 ExceptionIndex); + +IMPORT_EXPORT_VMM VOID +BroadcastUnsetExceptionBitmapAllCores(UINT64 ExceptionIndex); + +IMPORT_EXPORT_VMM VOID +BroadcastResetExceptionBitmapAllCores(); + +IMPORT_EXPORT_VMM VOID +BroadcastEnableMovControlRegisterExitingAllCores(PDEBUGGER_EVENT_OPTIONS BroadcastingOption); + +IMPORT_EXPORT_VMM VOID +BroadcastDisableMovToControlRegistersExitingAllCores(PDEBUGGER_EVENT_OPTIONS BroadcastingOption); + +IMPORT_EXPORT_VMM VOID +BroadcastEnableMovDebugRegistersExitingAllCores(); + +IMPORT_EXPORT_VMM VOID +BroadcastDisableMovDebugRegistersExitingAllCores(); + +IMPORT_EXPORT_VMM VOID +BroadcastSetExternalInterruptExitingAllCores(); + +IMPORT_EXPORT_VMM VOID +BroadcastUnsetExternalInterruptExitingOnlyOnClearingInterruptEventsAllCores(); + +IMPORT_EXPORT_VMM VOID +BroadcastIoBitmapChangeAllCores(UINT64 Port); + +IMPORT_EXPORT_VMM VOID +BroadcastIoBitmapResetAllCores(); + +IMPORT_EXPORT_VMM VOID +BroadcastEnableMovToCr3ExitingOnAllProcessors(); + +IMPORT_EXPORT_VMM VOID +BroadcastDisableMovToCr3ExitingOnAllProcessors(); + +IMPORT_EXPORT_VMM VOID +BroadcastEnableEferSyscallEventsOnAllProcessors(); + +IMPORT_EXPORT_VMM VOID +BroadcastDisableEferSyscallEventsOnAllProcessors(); + + +//..\..\..\bin\debug\SDK\Modules\HyperLog.h +/** + * @file HyperLog.h + * @author Sina Karvandi (sina@hyperdbg.org) + * @brief HyperDbg's SDK for HyperLog project + * @details This file contains definitions of HyperLog routines + * @version 0.2 + * @date 2023-01-15 + * + * @copyright This project is released under the GNU Public License v3. + * + */ +#pragma once + +////////////////////////////////////////////////// +// Callback Types // +////////////////////////////////////////////////// + +/** + * @brief A function that checks whether the current operation + * is on vmx-root mode or not + * + */ +typedef BOOLEAN (*CHECK_VMX_OPERATION)(); + +/** + * @brief A function that checks whether the immediate message + * sending is needed or not + * + */ +typedef BOOLEAN (*CHECK_IMMEDIATE_MESSAGE_SENDING)(UINT32 OperationCode); + +/** + * @brief A function that sends immediate messages + * + */ +typedef BOOLEAN (*SEND_IMMEDIATE_MESSAGE)(CHAR * OptionalBuffer, + UINT32 OptionalBufferLength, + UINT32 OperationCode); + +////////////////////////////////////////////////// +// Callback Structure // +////////////////////////////////////////////////// + +/** + * @brief Prototype of each function needed by message tracer + * + */ +typedef struct _MESSAGE_TRACING_CALLBACKS +{ + CHECK_VMX_OPERATION VmxOperationCheck; + CHECK_IMMEDIATE_MESSAGE_SENDING CheckImmediateMessageSending; + SEND_IMMEDIATE_MESSAGE SendImmediateMessage; + +} MESSAGE_TRACING_CALLBACKS, *PMESSAGE_TRACING_CALLBACKS; + + +//..\..\..\bin\debug\SDK\Modules\VMM.h +/** + * @file VMM.h + * @author Sina Karvandi (sina@hyperdbg.org) + * @brief HyperDbg's SDK for VMM project + * @details This file contains definitions of HyperLog routines + * @version 0.2 + * @date 2023-01-15 + * + * @copyright This project is released under the GNU Public License v3. + * + */ +#pragma once + +////////////////////////////////////////////////// +// Callback Types // +////////////////////////////////////////////////// + +/** + * @brief A function from the message tracer that send the inputs to the + * queue of the messages + * + */ +typedef BOOLEAN (*LOG_CALLBACK_PREPARE_AND_SEND_MESSAGE_TO_QUEUE)(UINT32 OperationCode, + BOOLEAN IsImmediateMessage, + BOOLEAN ShowCurrentSystemTime, + BOOLEAN Priority, + const char * Fmt, + va_list ArgList); + +/** + * @brief A function that sends the messages to message tracer buffers + * + */ +typedef BOOLEAN (*LOG_CALLBACK_SEND_MESSAGE_TO_QUEUE)(UINT32 OperationCode, BOOLEAN IsImmediateMessage, CHAR * LogMessage, UINT32 BufferLen, BOOLEAN Priority); + +/** + * @brief A function that sends the messages to message tracer buffers + * + */ +typedef BOOLEAN (*LOG_CALLBACK_SEND_BUFFER)(_In_ UINT32 OperationCode, + _In_reads_bytes_(BufferLength) PVOID Buffer, + _In_ UINT32 BufferLength, + _In_ BOOLEAN Priority); + +/** + * @brief A function that checks whether the priority or regular buffer is full or not + * + */ +typedef BOOLEAN (*LOG_CALLBACK_CHECK_IF_BUFFER_IS_FULL)(BOOLEAN Priority); + +/** + * @brief A function that handles trigger events + * + */ +typedef VMM_CALLBACK_TRIGGERING_EVENT_STATUS_TYPE (*VMM_CALLBACK_TRIGGER_EVENTS)(VMM_EVENT_TYPE_ENUM EventType, + VMM_CALLBACK_EVENT_CALLING_STAGE_TYPE CallingStage, + PVOID Context, + BOOLEAN * PostEventRequired, + GUEST_REGS * Regs); + +/** + * @brief A function that checks and handles breakpoints + * + */ +typedef BOOLEAN (*DEBUGGING_CALLBACK_HANDLE_BREAKPOINT_EXCEPTION)(UINT32 CoreId); + +/** + * @brief A function that checks and handles debug breakpoints + * + */ +typedef BOOLEAN (*DEBUGGING_CALLBACK_HANDLE_DEBUG_BREAKPOINT_EXCEPTION)(UINT32 CoreId); + +/** + * @brief Check for page-faults in user-debugger + * + */ +typedef BOOLEAN (*DEBUGGING_CALLBACK_CONDITIONAL_PAGE_FAULT_EXCEPTION)(UINT32 CoreId, + UINT64 Address, + UINT32 PageFaultErrorCode); + +/** + * @brief Check for commands in user-debugger + * + */ +typedef BOOLEAN (*UD_CHECK_FOR_COMMAND)(); + +/** + * @brief Handle registered MTF callback + * + */ +typedef VOID (*VMM_CALLBACK_REGISTERED_MTF_HANDLER)(UINT32 CoreId); + +/** + * @brief Check for user-mode access for loaded module details + * + */ +typedef BOOLEAN (*VMM_CALLBACK_RESTORE_EPT_STATE)(UINT32 CoreId); + +/** + * @brief Check for unhandled EPT violations + * + */ +typedef BOOLEAN (*VMM_CALLBACK_CHECK_UNHANDLED_EPT_VIOLATION)(UINT32 CoreId, UINT64 ViolationQualification, UINT64 GuestPhysicalAddr); + +/** + * @brief Handle cr3 process change callbacks + * + */ +typedef VOID (*INTERCEPTION_CALLBACK_TRIGGER_CR3_CHANGE)(UINT32 CoreId); + +/** + * @brief Check for process or thread change callback + * + */ +typedef BOOLEAN (*INTERCEPTION_CALLBACK_TRIGGER_CLOCK_AND_IPI)(_In_ UINT32 CoreId); + +/** + * @brief Check to handle cr3 events for thread interception + * + */ +typedef BOOLEAN (*ATTACHING_HANDLE_CR3_EVENTS_FOR_THREAD_INTERCEPTION)(UINT32 CoreId, CR3_TYPE NewCr3); + +/** + * @brief Check and handle reapplying breakpoint + * + */ +typedef BOOLEAN (*BREAKPOINT_CHECK_AND_HANDLE_REAPPLYING_BREAKPOINT)(UINT32 CoreId); + +/** + * @brief Handle NMI broadcast + * + */ +typedef VOID (*VMM_CALLBACK_NMI_BROADCAST_REQUEST_HANDLER)(UINT32 CoreId, BOOLEAN IsOnVmxNmiHandler); + +/** + * @brief Check and handle NMI callbacks + * + */ +typedef BOOLEAN (*KD_CHECK_AND_HANDLE_NMI_CALLBACK)(UINT32 CoreId); + +/** + * @brief Set the top-level driver's error status + * + */ +typedef VOID (*VMM_CALLBACK_SET_LAST_ERROR)(UINT32 LastError); + +/** + * @brief Check and modify the protected resources of the hypervisor + * + */ +typedef BOOLEAN (*VMM_CALLBACK_QUERY_TERMINATE_PROTECTED_RESOURCE)(UINT32 CoreId, + PROTECTED_HV_RESOURCES_TYPE ResourceType, + PVOID Context, + PROTECTED_HV_RESOURCES_PASSING_OVERS PassOver); + +/** + * @brief Query debugger thread or process tracing details by core ID + * + */ +typedef BOOLEAN (*KD_QUERY_DEBUGGER_THREAD_OR_PROCESS_TRACING_DETAILS_BY_CORE_ID)(UINT32 CoreId, + DEBUGGER_THREAD_PROCESS_TRACING TracingType); +/** + * @brief Handler of debugger specific VMCALLs + * + */ +typedef BOOLEAN (*VMM_CALLBACK_VMCALL_HANDLER)(UINT32 CoreId, + UINT64 VmcallNumber, + UINT64 OptionalParam1, + UINT64 OptionalParam2, + UINT64 OptionalParam3); + +////////////////////////////////////////////////// +// Callback Structure // +////////////////////////////////////////////////// + +/** + * @brief Prototype of each function needed by VMM module + * + */ +typedef struct _VMM_CALLBACKS +{ + // + // Log (Hyperlog) callbacks + // + LOG_CALLBACK_PREPARE_AND_SEND_MESSAGE_TO_QUEUE LogCallbackPrepareAndSendMessageToQueueWrapper; // Fixed + LOG_CALLBACK_SEND_MESSAGE_TO_QUEUE LogCallbackSendMessageToQueue; // Fixed + LOG_CALLBACK_SEND_BUFFER LogCallbackSendBuffer; // Fixed + LOG_CALLBACK_CHECK_IF_BUFFER_IS_FULL LogCallbackCheckIfBufferIsFull; // Fixed + + // + // VMM callbacks + // + VMM_CALLBACK_TRIGGER_EVENTS VmmCallbackTriggerEvents; // Fixed + VMM_CALLBACK_SET_LAST_ERROR VmmCallbackSetLastError; // Fixed + VMM_CALLBACK_VMCALL_HANDLER VmmCallbackVmcallHandler; // Fixed + VMM_CALLBACK_NMI_BROADCAST_REQUEST_HANDLER VmmCallbackNmiBroadcastRequestHandler; // Fixed + VMM_CALLBACK_QUERY_TERMINATE_PROTECTED_RESOURCE VmmCallbackQueryTerminateProtectedResource; // Fixed + VMM_CALLBACK_RESTORE_EPT_STATE VmmCallbackRestoreEptState; // Fixed + VMM_CALLBACK_CHECK_UNHANDLED_EPT_VIOLATION VmmCallbackCheckUnhandledEptViolations; // Fixed + + // + // Debugging callbacks + // + DEBUGGING_CALLBACK_HANDLE_BREAKPOINT_EXCEPTION DebuggingCallbackHandleBreakpointException; // Fixed + DEBUGGING_CALLBACK_HANDLE_DEBUG_BREAKPOINT_EXCEPTION DebuggingCallbackHandleDebugBreakpointException; // Fixed + DEBUGGING_CALLBACK_CONDITIONAL_PAGE_FAULT_EXCEPTION DebuggingCallbackConditionalPageFaultException; // Fixed + + // + // Interception callbacks + // + INTERCEPTION_CALLBACK_TRIGGER_CR3_CHANGE InterceptionCallbackTriggerCr3ProcessChange; // Fixed + + // + // Callbacks to be removed + // + BREAKPOINT_CHECK_AND_HANDLE_REAPPLYING_BREAKPOINT BreakpointCheckAndHandleReApplyingBreakpoint; + UD_CHECK_FOR_COMMAND UdCheckForCommand; + KD_CHECK_AND_HANDLE_NMI_CALLBACK KdCheckAndHandleNmiCallback; + VMM_CALLBACK_REGISTERED_MTF_HANDLER VmmCallbackRegisteredMtfHandler; // Fixed but not good + INTERCEPTION_CALLBACK_TRIGGER_CLOCK_AND_IPI DebuggerCheckProcessOrThreadChange; + ATTACHING_HANDLE_CR3_EVENTS_FOR_THREAD_INTERCEPTION AttachingHandleCr3VmexitsForThreadInterception; + KD_QUERY_DEBUGGER_THREAD_OR_PROCESS_TRACING_DETAILS_BY_CORE_ID KdQueryDebuggerQueryThreadOrProcessTracingDetailsByCoreId; + +} VMM_CALLBACKS, *PVMM_CALLBACKS; + + diff --git a/gengo/bind/sdkMerge/sdk_test.go b/gengo/bind/sdkMerge/sdk_test.go index c9b309de3..50f6a94c9 100644 --- a/gengo/bind/sdkMerge/sdk_test.go +++ b/gengo/bind/sdkMerge/sdk_test.go @@ -20,15 +20,20 @@ import ( ) func TestMergeHeader(t *testing.T) { + g := stream.NewGeneratedFile() filepath.Walk("../../../bin", func(path string, info fs.FileInfo, err error) error { if strings.Contains(path, "Examples") { return err } if filepath.Ext(path) == ".h" { println(path) + g.P("//" + path) + g.P(stream.NewBuffer(path)) + g.P() } return err }) + stream.WriteBinaryFile("merged_headers.h", g.Buffer) } // ContainsLetter 检查字符串中是否包含字母 From 9444c6ce7e650ac45e64bac535dbbb7e4eda4bc7 Mon Sep 17 00:00:00 2001 From: Admin <2762713521@qq.com> Date: Fri, 21 Jun 2024 13:10:41 +0800 Subject: [PATCH 23/25] TestMergeHeader --- bin/debug/SDK/Headers/BasicTypes.h | 2 +- gengo/bind/sdkMerge/merged_headers.h | 16 +--------------- gengo/bind/sdkMerge/sdk_test.go | 3 +++ 3 files changed, 5 insertions(+), 16 deletions(-) diff --git a/bin/debug/SDK/Headers/BasicTypes.h b/bin/debug/SDK/Headers/BasicTypes.h index 3395412e7..836048c74 100644 --- a/bin/debug/SDK/Headers/BasicTypes.h +++ b/bin/debug/SDK/Headers/BasicTypes.h @@ -17,7 +17,7 @@ // Basic Datatypes // ////////////////////////////////////////////////// -#include // 或者 #include +//#include // 或者 #include typedef unsigned long long QWORD; diff --git a/gengo/bind/sdkMerge/merged_headers.h b/gengo/bind/sdkMerge/merged_headers.h index 38f1401f3..91c91914a 100644 --- a/gengo/bind/sdkMerge/merged_headers.h +++ b/gengo/bind/sdkMerge/merged_headers.h @@ -18,7 +18,7 @@ // Basic Datatypes // ////////////////////////////////////////////////// -#include // 或者 #include +//#include // 或者 #include typedef unsigned long long QWORD; @@ -4166,20 +4166,6 @@ typedef struct _DEBUGGEE_SYMBOL_UPDATE_RESULT */ -//..\..\..\bin\debug\SDK\HyperDbgSdk.h -#pragma once - -#include "SDK/Headers/Constants.h" -#include "SDK/Headers/BasicTypes.h" -#include "SDK/Headers/ErrorCodes.h" -#include "SDK/Headers/Connection.h" -#include "SDK/Headers/DataTypes.h" -#include "SDK/Headers/Ioctls.h" -#include "SDK/Headers/Events.h" -#include "SDK/Headers/RequestStructures.h" -#include "SDK/Headers/Symbols.h" - - //..\..\..\bin\debug\SDK\Imports\HyperDbgCtrlImports.h /** * @file HyperDbgCtrlImports.h diff --git a/gengo/bind/sdkMerge/sdk_test.go b/gengo/bind/sdkMerge/sdk_test.go index 50f6a94c9..eba4df6a7 100644 --- a/gengo/bind/sdkMerge/sdk_test.go +++ b/gengo/bind/sdkMerge/sdk_test.go @@ -25,6 +25,9 @@ func TestMergeHeader(t *testing.T) { if strings.Contains(path, "Examples") { return err } + if stream.BaseName(path) == "HyperDbgSdk" { + return err + } if filepath.Ext(path) == ".h" { println(path) g.P("//" + path) From bfe3682334f437817926905d41562f83862ca768 Mon Sep 17 00:00:00 2001 From: Admin <2762713521@qq.com> Date: Fri, 21 Jun 2024 13:12:37 +0800 Subject: [PATCH 24/25] TestMergeHeader --- gengo/bind/sdkMerge/sdk_test.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/gengo/bind/sdkMerge/sdk_test.go b/gengo/bind/sdkMerge/sdk_test.go index eba4df6a7..47296cfdd 100644 --- a/gengo/bind/sdkMerge/sdk_test.go +++ b/gengo/bind/sdkMerge/sdk_test.go @@ -59,7 +59,8 @@ func MacrosInHeader() (m *maps.SafeMap[string, bool]) { } m2 := new(maps.SafeMap[string, bool]) - for _, s := range stream.NewBuffer("combined_headers.h").ToLines() { + //for _, s := range stream.NewBuffer("combined_headers.h").ToLines() { + for _, s := range stream.NewBuffer("merged_headers.h.h").ToLines() { if strings.HasPrefix(s, "#define ") { m2.Set(s, true) } @@ -132,7 +133,7 @@ func TestBindMacros(t *testing.T) { }) } -func TestBind(t *testing.T) { +func TestBindSdk(t *testing.T) { mylog.SetDebug(false) mylog.Call(func() { pkg := gengo.NewPackage("HPRDBGCTRL", From 8875bd01a302ea2fa2a790191fdd44e18a64a888 Mon Sep 17 00:00:00 2001 From: Admin <2762713521@qq.com> Date: Fri, 21 Jun 2024 13:17:15 +0800 Subject: [PATCH 25/25] TestMergeHeader --- gengo/bind/sdkMerge/sdk_test.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/gengo/bind/sdkMerge/sdk_test.go b/gengo/bind/sdkMerge/sdk_test.go index 47296cfdd..799cd64ad 100644 --- a/gengo/bind/sdkMerge/sdk_test.go +++ b/gengo/bind/sdkMerge/sdk_test.go @@ -59,8 +59,8 @@ func MacrosInHeader() (m *maps.SafeMap[string, bool]) { } m2 := new(maps.SafeMap[string, bool]) - //for _, s := range stream.NewBuffer("combined_headers.h").ToLines() { - for _, s := range stream.NewBuffer("merged_headers.h.h").ToLines() { + // for _, s := range stream.NewBuffer("combined_headers.h").ToLines() { + for _, s := range stream.NewBuffer("merged_headers.h").ToLines() { if strings.HasPrefix(s, "#define ") { m2.Set(s, true) } @@ -150,7 +150,8 @@ func TestBindSdk(t *testing.T) { ), ) mylog.Check(pkg.Transform("HPRDBGCTRL", &clang.Options{ - Sources: []string{"combined_headers.h"}, + // Sources: []string{"combined_headers.h"}, + Sources: []string{"merged_headers.h"}, AdditionalParams: []string{ //"-DZYAN_NO_LIBC", //"-DZYAN_STATIC_ASSERT",