PK G*nQUԨ(( PyWin32.chmUT h_@[x`ux ITSF`k} |{ "|{ "`xT(ITSPT MLN j].!"TPMGL8//#IDXHDRT/#ITBITS /#STRINGS˓3/#SYSTEM/#TOCIDXT /#TOPICSt /#URLSTR,/#URLTBL /#WINDOWS+L /$FIftiMainnf /$OBJINST/?/$WWAssociativeLinks//$WWAssociativeLinks/Property+/$WWKeywordLinks//$WWKeywordLinks/BTreewL/$WWKeywordLinks/DataCn/$WWKeywordLinks/Map1Z/$WWKeywordLinks/Property /_winxptheme.htmlw&/_winxptheme__CloseThemeData_meth.htmlק(+/_winxptheme__DrawThemeBackground_meth.html׬Ei%/_winxptheme__DrawThemeText_meth.html״.0/_winxptheme__EnableThemeDialogTexture_meth.html׽4g%/_winxptheme__EnableTheming_meth.htmlC+/_winxptheme__GetCurrentThemeName_meth.html^W-/_winxptheme__GetThemeAppProperties_meth.html5_5/_winxptheme__GetThemeBackgroundContentRect_meth.html~0/_winxptheme__GetThemeBackgroundExtent_meth.html[&/_winxptheme__GetWindowTheme_meth.htmlm#/_winxptheme__IsAppThemed_meth.htmloY%/_winxptheme__IsThemeActive_meth.htmlH~3/_winxptheme__IsThemeDialogTextureEnabled_meth.htmlFb%/_winxptheme__OpenThemeData_meth.html(&/_winxptheme__SetWindowTheme_meth.html:&/_winxptheme_ETDT_DISABLE.html(n/_winxptheme_ETDT_ENABLE.htmlk /_winxptheme_ETDT_ENABLETAB.htmlt$/_winxptheme_ETDT_USETABTEXTURE.htmlu /adsi.htmlw1#/adsi__ADsBuildEnumerator_meth.html؂`d!/adsi__ADsEnumerateNext_meth.html؆DX /adsi__ADsGetLastError_meth.html،/adsi__ADsGetObject_meth.html؎5/adsi__ADsOpenObject_meth.htmlؒCO&/adsi__DSOP_SCOPE_INIT_INFOs_meth.htmlؘE*/adsi__StringAsDS_SELECTION_LIST_meth.html؜W(/ASP_and_Python.htmly&/authorization__EditSecurity_meth.htmlؠ~/axcontrol.html(/axcontrol__OleCreate_meth.htmlإ}.$/axcontrol__OleLoadPicture_meth.htmlر+(/axcontrol__OleLoadPicturePath_meth.htmlغE+/axcontrol__OleSetContainedObject_meth.htmlU-/axcontrol__OleTranslateAccelerator_meth.htmlrk!/axcontrol_EMBDHLP_CREATENOW.htmlO{#/axcontrol_EMBDHLP_DELAYCREATE.htmlJ&/axcontrol_EMBDHLP_INPROC_HANDLER.htmlK %/axcontrol_EMBDHLP_INPROC_SERVER.htmlU/axcontrol_OLECLOSE_NOSAVE.htmljj#/axcontrol_OLECLOSE_PROMPTSAVE.htmlT$/axcontrol_OLECLOSE_SAVEIFDIRTY.htmli./axcontrol_OLECMDF_ENABLED.htmlu/axcontrol_OLECMDF_LATCHED.html u/axcontrol_OLECMDF_NINCHED.htmlu!/axcontrol_OLECMDF_SUPPORTED.htmlv{ /axcontrol_OLECMDTEXTF_NAME.htmlqx /axcontrol_OLECMDTEXTF_NONE.htmlix"/axcontrol_OLECMDTEXTF_STATUS.htmla~&/axcontrol_OLECREATE_LEAVERUNNING.html_ )/axcontrol_OLEIVERB_DISCARDUNDOSTATE.htmli/axcontrol_OLEIVERB_HIDE.html|o(/axcontrol_OLEIVERB_INPLACEACTIVATE.htmlځk/axcontrol_OLEIVERB_OPEN.htmlڃ{o /axcontrol_OLEIVERB_PRIMARY.htmlڅjx/axcontrol_OLEIVERB_SHOW.htmlڇbo#/axcontrol_OLEIVERB_UIACTIVATE.htmlډQ /axdebug.html:q)/axdebug_APPBREAKFLAG_DEBUGGER_BLOCK.html^](/axdebug_APPBREAKFLAG_DEBUGGER_HALT.html;Y/axdebug_APPBREAKFLAG_STEP.html( /axdebug_BREAKPOINT_DELETED.html:|!/axdebug_BREAKPOINT_DISABLED.html6 /axdebug_BREAKPOINT_ENABLED.htmlā5|$/axdebug_BREAKREASON_BREAKPOINT.htmlă1((/axdebug_BREAKREASON_DEBUGGER_BLOCK.htmląY5'/axdebug_BREAKREASON_DEBUGGER_HALT.htmlĈ7/axdebug_BREAKREASON_ERROR.htmlĊE(/axdebug_BREAKREASON_HOST_INITIATED.htmlČZ2,/axdebug_BREAKREASON_LANGUAGE_INITIATED.htmlď :/axdebug_BREAKREASON_STEP.htmlđF%/axdebug_BREAKRESUMEACTION_ABORT.htmlēW (/axdebug_BREAKRESUMEACTION_CONTINUE.htmlĕw$)/axdebug_BREAKRESUMEACTION_STEP_INTO.htmlĘ,(/axdebug_BREAKRESUMEACTION_STEP_OUT.htmlĚG5)/axdebug_BREAKRESUMEACTION_STEP_OVER.htmlĜ|,//axdebug_CLSID_DefaultDebugSessionProvider.htmlłp6'/axdebug_CLSID_MachineDebugManager.htmlŅ&'/axdebug_CLSID_ProcessDebugManager.htmlŇD)/axdebug_DBGPROP_ATTRIB_ACCESS_FINAL.htmlƒ=+/axdebug_DBGPROP_ATTRIB_ACCESS_PRIVATE.htmlƔT-/axdebug_DBGPROP_ATTRIB_ACCESS_PROTECTED.htmlƖq#LUq " Q < AfPMGL5*/axdebug_DBGPROP_ATTRIB_ACCESS_PUBLIC.htmlƙ1/axdebug_DBGPROP_ATTRIB_HAS_EXTENDED_ATTRIBS.htmlƛ./&/axdebug_DBGPROP_ATTRIB_NO_ATTRIB.htmlƝ]*/axdebug_DBGPROP_ATTRIB_STORAGE_FIELD.htmlƟk+/axdebug_DBGPROP_ATTRIB_STORAGE_GLOBAL.htmlƢ+/axdebug_DBGPROP_ATTRIB_STORAGE_STATIC.htmlƤ",/axdebug_DBGPROP_ATTRIB_STORAGE_VIRTUAL.htmlƦ? -/axdebug_DBGPROP_ATTRIB_TYPE_IS_CONSTANT.htmlƨ_#1/axdebug_DBGPROP_ATTRIB_TYPE_IS_SYNCHRONIZED.htmlƫ/-/axdebug_DBGPROP_ATTRIB_TYPE_IS_VOLATILE.htmlƭ1#0/axdebug_DBGPROP_ATTRIB_VALUE_IS_EXPANDABLE.htmlƯT,-/axdebug_DBGPROP_ATTRIB_VALUE_IS_INVALID.htmlƲ#+/axdebug_DBGPROP_ATTRIB_VALUE_READONLY.htmlƴ#%/axdebug_DBGPROP_INFO_ATTRIBUTES.htmlƶ@ %/axdebug_DBGPROP_INFO_AUTOEXPAND.htmlƸK $/axdebug_DBGPROP_INFO_DEBUGPROP.htmlƺV#/axdebug_DBGPROP_INFO_FULLNAME.htmlƼ^/axdebug_DBGPROP_INFO_NAME.htmlƾcy/axdebug_DBGPROP_INFO_TYPE.html\y /axdebug_DBGPROP_INFO_VALUE.htmlU|)/axdebug_DEBUG_TEXT_ALLOWBREAKPOINTS.html//%/axdebug_DEBUG_TEXT_ISEXPRESSION.html^"&/axdebug_DOCUMENTNAMETYPE_APPNODE.htmlǂZ=(/axdebug_DOCUMENTNAMETYPE_FILE_TAIL.htmlDžI$/axdebug_DOCUMENTNAMETYPE_TITLE.htmlLJ`C"/axdebug_DOCUMENTNAMETYPE_URL.htmlNJ#&?/axdebug_ERRORRESUMEACTION_AbortCallAndReturnErrorToCaller.html\Y7/axdebug_ERRORRESUMEACTION_ReexecuteErrorStatement.html5A2/axdebug_ERRORRESUMEACTION_SkipErrorStatement.htmlv2*/axdebug_EX_DBGPROP_INFO_DEBUGEXTPROP.htmla /axdebug_EX_DBGPROP_INFO_ID.html{|'/axdebug_EX_DBGPROP_INFO_LOCKBYTES.htmlw#/axdebug_EX_DBGPROP_INFO_NTYPE.html$/axdebug_EX_DBGPROP_INFO_NVALUE.html %/axdebug_SOURCETEXT_ATTR_COMMENT.htmld ,/axdebug_SOURCETEXT_ATTR_FUNCTION_START.htmlo %/axdebug_SOURCETEXT_ATTR_KEYWORD.html '/axdebug_SOURCETEXT_ATTR_NONSOURCE.html$/axdebug_SOURCETEXT_ATTR_NUMBER.html+&/axdebug_SOURCETEXT_ATTR_OPERATOR.html3$/axdebug_SOURCETEXT_ATTR_STRING.htmlA$/axdebug_TEXT_DOC_ATTR_READONLY.htmlj1/axscript.html+s/CHARFORMAT.htmlL/classesandcmember.htmlΙWT /com.htmlU/com_constants.html }/com_error.htmlj/com_modules.html:/com_objects.htmlL@/com_overview.htmlhR/COMMTIMEOUTS.htmlzo/COMPONENT.htmli/COMPONENTSOPT.html /COMPPOS.html/COMPSTATEINFO.html*G/connection.htmlq/connection__close_meth.html] /connection__commit_meth.htmlf /connection__cursor_meth.htmlr'/connection__rollback_meth.html$/connection__setautocommit_meth.html-~/constants.htmlΟbF/CopyProgressRoutine.html </CREATESTRUCT.htmlIp /cursor.html9|/cursor__close_meth.html+H/cursor__execute_meth.htmls6/cursor__fetchall_meth.html)/cursor__fetchmany_meth.html=/cursor__fetchone_meth.htmlU /cursor__setinputsizes_meth.htmla /cursor__setoutputsize_meth.html` /dde.html5[/DEFCONTENTMENU.htmlu/directsound.html0/directsound__DirectSoundCaptureCreate_meth.html_C3/directsound__DirectSoundCaptureEnumerate_meth.html" )/directsound__DirectSoundCreate_meth.html. ,/directsound__DirectSoundEnumerate_meth.htmlNl/directsound__DSBCAPS_meth.html:C$/directsound__DSBUFFERDESC_meth.html}a/directsound__DSCAPS_meth.htmlف^> /directsound__DSCBCAPS_meth.htmlلI%/directsound__DSCBUFFERDESC_meth.htmlنeg/directsound__DSCCAPS_meth.htmlىLC"/directsound_DS3DMODE_DISABLE.htmlǛFf'/directsound_DS3DMODE_HEADRELATIVE.htmlǞ,!/directsound_DS3DMODE_NORMAL.htmlǢA# /directsound_DSBCAPS_CTRL3D.htmlǶ@J'/directsound_DSBCAPS_CTRLFREQUENCY.htmlǺ ;!/directsound_DSBCAPS_CTRLPAN.htmlǼE#,/directsound_DSBCAPS_CTRLPOSITIONNOTIFY.htmlǾhP$/directsound_DSBCAPS_CTRLVOLUME.html8/-/directsound_DSBCAPS_GETCURRENTPOSITION2.htmlg %/directsound_DSBCAPS_GLOBALFOCUS.htmlU%/directsound_DSBCAPS_LOCHARDWARE.html\=%/directsound_DSBCAPS_LOCSOFTWARE.html=L0Cr  v / =bPMGL(-/directsound_DSBCAPS_MUTE3DATMAXDISTANCE.htmlVA'/directsound_DSBCAPS_PRIMARYBUFFER.html /directsound_DSBCAPS_STATIC.html"'%/directsound_DSBCAPS_STICKYFOCUS.htmlI&/directsound_DSBLOCK_ENTIREBUFFER.html`)/directsound_DSBLOCK_FROMWRITECURSOR.htmlnP!/directsound_DSBPLAY_LOOPING.html>8&/directsound_DSBSTATUS_BUFFERLOST.htmlvT#/directsound_DSBSTATUS_LOOPING.htmlJ7#/directsound_DSBSTATUS_PLAYING.htmlD"/directsound_DSCAPS_CERTIFIED.htmlE1'/directsound_DSCAPS_CONTINUOUSRATE.htmlvu#/directsound_DSCAPS_EMULDRIVER.htmlk#%/directsound_DSCAPS_PRIMARY16BIT.htmlȃA$/directsound_DSCAPS_PRIMARY8BIT.htmlȅOH$/directsound_DSCAPS_PRIMARYMONO.htmlȈ/&/directsound_DSCAPS_PRIMARYSTEREO.htmlȊF1'/directsound_DSCAPS_SECONDARY16BIT.htmlȌw\&/directsound_DSCAPS_SECONDARY8BIT.htmlȏSN&/directsound_DSCAPS_SECONDARYMONO.htmlȒ!F(/directsound_DSCAPS_SECONDARYSTEREO.htmlȔgH%/directsound_DSCBCAPS_WAVEMAPPED.htmlȗ/R$/directsound_DSCCAPS_EMULDRIVER.htmlȚ&!/directsound_DSSCL_EXCLUSIVE.htmlȝ'+/directsound_DSSCL_NORMAL.htmlȣR /directsound_DSSCL_PRIORITY.htmlȦi$/directsound_DSSCL_WRITEPRIMARY.htmlȩ#(/directsound_DSSPEAKER_GEOMETRY_MAX.htmlȭ"A(/directsound_DSSPEAKER_GEOMETRY_MIN.htmlȯc?+/directsound_DSSPEAKER_GEOMETRY_NARROW.htmlȲ"I)/directsound_DSSPEAKER_GEOMETRY_WIDE.htmlȴkC%/directsound_DSSPEAKER_HEADPHONE.htmlȷ. /directsound_DSSPEAKER_MONO.htmlȹM /directsound_DSSPEAKER_QUAD.htmlȻ["/directsound_DSSPEAKER_STEREO.htmlȽm"$/directsound_DSSPEAKER_SURROUND.html /DirectSound_examples.htmlH /DOCINFO.html@/ELEMDESC.html[ /error.htmlu/exchange.html 8)/exchange__HrCreateDirEntryIdEx_meth.htmlٌ(/exchange__HrCreateProfileName_meth.htmlّ"`4/exchange__HrFindExchangeGlobalAddressList_meth.htmlٕ>(/exchange__HrGetExchangeStatus_meth.htmlٙ@<#/exchange__HrGetMailboxDN_meth.htmlٝ|2"/exchange__HrGetServerDN_meth.html١..$/exchange__HrMailboxLogoff_meth.html٤\%#/exchange__HrMailboxLogon_meth.html٨./exchange__HrMAPIFindDefaultMsgStore_meth.htmlٮi%/exchange__HrMAPIFindFolder_meth.htmlٱzR'/exchange__HrMAPIFindFolderEx_meth.htmlٶLK$/exchange__HrMAPIFindInbox_meth.htmlټ5)/exchange__HrMAPIFindIPMSubtree_meth.htmlٿL^$/exchange__HrMAPIFindStore_meth.html*M*/exchange__HrMAPIFindSubfolderEx_meth.htmlw'/exchange__HrMAPIOpenFolderEx_meth.htmlv)/exchange__HrMAPISetPropBoolean_meth.htmlj&/exchange__HrMAPISetPropLong_meth.htmlq^//exchange__HrOpenExchangePrivateStore_meth.htmlO0/exchange__HrOpenExchangePublicFolders_meth.htmlj./exchange__HrOpenExchangePublicStore_meth.html$(/exchange__HrOpenSessionObject_meth.html)4(/exchange__HrOpenSiteContainer_meth.html]'2/exchange__HrOpenSiteContainerAddressing_meth.htmlP#/exchange_OPENSTORE_HOME_LOGON.htmlږa*/exchange_OPENSTORE_OVERRIDE_HOME_MDB.htmlژd/exchange_OPENSTORE_PUBLIC.htmlښ|w'/exchange_OPENSTORE_TAKE_OWNERSHIP.htmlڜs,/exchange_OPENSTORE_USE_ADMIN_PRIVILEGE.htmlڟ/exchdapi.htmlBw)/exchdapi__HrAdminProgramExists_meth.htmlT+/exchdapi__HrCreateGatewayProfile_meth.htmlnR0/exchdapi__HrCreateMailboxAgentProfile_meth.html@a%/exchdapi__HrEnumContainers_meth.html!I(/exchdapi__HrEnumOrganizations_meth.htmlڃjH%/exchdapi__HrEnumSiteAdmins_meth.htmlڈ2 /exchdapi__HrEnumSites_meth.htmlڌ4$,/exchdapi__HrGetServiceAccountName_meth.htmlڐX*/exchdapi__HrInstallMailboxAgent_meth.htmlڔs%/exchdapi__HrInstallService_meth.htmlڗ)/exchdapi__HrMailboxAgentExists_meth.htmlڙH)/exchdapi__HrRemoveMailboxAgent_meth.htmlڝfZ$/exchdapi__HrRemoveProfile_meth.htmlڢ@/EXP_DARWIN_LINK.html9/EXP_SPECIAL_FOLDER.htmlL/EXP_SZ_LINK.html^/ExportCallback.htmlmD/EXTENSION_CONTROL_BLOCK.html13/EXTENSION_CONTROL_BLOCK__DoneWithSession_meth.htmlڥ?;+/EXTENSION_CONTROL_BLOCK__ExecURL_meth.htmlکz.0 : S K T oF_[PMGL+5/EXTENSION_CONTROL_BLOCK__GetAnonymousToken_meth.htmlڰ( 4/EXTENSION_CONTROL_BLOCK__GetExecURLStatus_meth.htmlڴ49/EXTENSION_CONTROL_BLOCK__GetImpersonationToken_meth.htmlڻ45/EXTENSION_CONTROL_BLOCK__GetServerVariable_meth.htmlھH./EXTENSION_CONTROL_BLOCK__IOCallback_meth.html\0/EXTENSION_CONTROL_BLOCK__IOCompletion_meth.htmln//EXTENSION_CONTROL_BLOCK__IsKeepAlive_meth.htmla./EXTENSION_CONTROL_BLOCK__IsKeepConn_meth.htmlfd0/EXTENSION_CONTROL_BLOCK__MapURLToPath_meth.htmlJg./EXTENSION_CONTROL_BLOCK__ReadClient_meth.html1 ,/EXTENSION_CONTROL_BLOCK__Redirect_meth.htmlQ=3/EXTENSION_CONTROL_BLOCK__ReportUnhealthy_meth.htmlw7/EXTENSION_CONTROL_BLOCK__SendResponseHeaders_meth.htmlO0/EXTENSION_CONTROL_BLOCK__SetFlushFlag_meth.htmlT,0/EXTENSION_CONTROL_BLOCK__TransmitFile_meth.html$//EXTENSION_CONTROL_BLOCK__WriteClient_meth.html$/FORM_INFO_1.html?2/FUNCDESC.htmlq/functions.htmlΛ+4/HSE_VERSION_INFO.html u/html/CHANGES.txtF/html/com/help/$/html/com/help/active_directory.html.x/html/com/help/adsi.html&B/html/com/win32com//html/com/win32com/HTML/%/html/com/win32com/HTML/docindex.htmlk-/html/com/win32com/HTML/GeneratedSupport.htmlz/html/com/win32com/HTML/image/'/html/com/win32com/HTML/image/blank.gif`./html/com/win32com/HTML/image/BTN_HomePage.gifzS//html/com/win32com/HTML/image/BTN_ManualTop.gifMW./html/com/win32com/HTML/image/BTN_NextPage.gif$Z./html/com/win32com/HTML/image/BTN_PrevPage.gif~X//html/com/win32com/HTML/image/pycom_blowing.gifV>+/html/com/win32com/HTML/image/pythoncom.gif*/html/com/win32com/HTML/image/www_icon.gif"/html/com/win32com/HTML/index.html]!/html/com/win32com/HTML/misc.html^ $/html/com/win32com/HTML/package.htmlj5&/html/com/win32com/HTML/PythonCOM.htmlo0/html/com/win32com/HTML/QuickStartClientCom.html0/html/com/win32com/HTML/QuickStartServerCom.html $/html/com/win32com/HTML/variant.html(r/html/com/win32com/readme.htm>-//html/com/win32comext/axscript/demos/client/ie/7/html/com/win32comext/axscript/demos/client/ie/calc.htmhI:/html/com/win32comext/axscript/demos/client/ie/CHARTPY.HTM1[:/html/com/win32comext/axscript/demos/client/ie/dbgtest.htm >7/html/com/win32comext/axscript/demos/client/ie/demo.htmJ==/html/com/win32comext/axscript/demos/client/ie/demo_check.htm_=/html/com/win32comext/axscript/demos/client/ie/demo_intro.htmf'/html/com/win32comext/axscript/demos/client/ie/marqueeDemo.htm?/html/com/win32comext/axscript/demos/client/ie/MarqueeText1.htm?=/html/com/win32comext/axscript/demos/client/ie/mousetrack.htmN+@/html/com/win32comext/axscript/demos/client/ie/pycom_blowing.gify>/html/isapi/doc//html/isapi/doc/isapi.html7@/html/pythonwin//html/pythonwin/doc/%/html/pythonwin/doc/architecture.htmlx /html/pythonwin/doc/debugger/)/html/pythonwin/doc/debugger/general.htmll'/html/pythonwin/doc/debugger/index.htmlr.+/html/pythonwin/doc/debugger/postmortem.gif X'/html/pythonwin/doc/debugger/probs.htmlxN*/html/pythonwin/doc/debugger/pythonwin.gifF%/html/pythonwin/doc/debugger/tut1.gifc^'/html/pythonwin/doc/debugger/tutbp1.gifA */html/pythonwin/doc/debugger/tutorial.htmlMy /html/pythonwin/doc/docview.htmle)/html/pythonwin/doc/EmbeddingWin32ui.htmlj '/html/pythonwin/doc/guienvironment.htmlvs!/html/pythonwin/doc/pythonwin.gifi/html/pythonwin/readme.htmlw/html/win32/help/"/html/win32/help/process_info.html!/html/win32/help/py3k.html>Jz.0_  q <MiX^@-SPMGLT*/html/win32/help/security_directories.html-/html/win32/help/win32net.html5 /HTTP_FILTER_AUTHENT.html~/HTTP_FILTER_CONTEXT.html2/HTTP_FILTER_CONTEXT__AddResponseHeaders_meth.htmlۀA<4/HTTP_FILTER_CONTEXT__DisableNotifications_meth.htmlۃ}'/HTTP_FILTER_CONTEXT__GetData_meth.htmlۆ~61/HTTP_FILTER_CONTEXT__GetServerVariable_meth.htmlے42/HTTP_FILTER_CONTEXT__SendResponseHeader_meth.htmlۘ<7+/HTTP_FILTER_CONTEXT__WriteClient_meth.htmlۛs'/HTTP_FILTER_LOG.html5,!/HTTP_FILTER_PREPROC_HEADERS.htmlav1/HTTP_FILTER_PREPROC_HEADERS__AddHeader_meth.html۟21/HTTP_FILTER_PREPROC_HEADERS__GetHeader_meth.htmlۡLp1/HTTP_FILTER_PREPROC_HEADERS__SetHeader_meth.htmlۥ<*/HTTP_FILTER_RAW_DATA.htmlWq/HTTP_FILTER_URL_MAP.htmlH/HTTP_FILTER_VERSION.htmld /IDLDESC.htmlhs/ImportCallback.html['/internet.htmlj4/internet__CoInternetCreateSecurityManager_meth.htmlۨfR//internet__CoInternetIsFeatureEnabled_meth.html۬8n0/internet__CoInternetSetFeatureEnabled_meth.html۰&4'/internet_FEATURE_ADDON_MANAGEMENT.html̑L /internet_FEATURE_BEHAVIORS.html̓[z*/internet_FEATURE_DISABLE_MK_PROTOCOL.html̕U"/internet_FEATURE_ENTRY_COUNT.html̗m5/internet_FEATURE_GET_URL_DOM_FILEPATH_UNENCODED.html̙m95/internet_FEATURE_HTTP_USERNAME_PASSWORD_DISABLE.html̜&9,/internet_FEATURE_LOCALMACHINE_LOCKDOWN.html̞_$/internet_FEATURE_MIME_HANDLING.html̠}$/internet_FEATURE_MIME_SNIFFING.htmḷ%/internet_FEATURE_OBJECT_CACHING.html̥ (/internet_FEATURE_PROTOCOL_LOCKDOWN.htmļ./internet_FEATURE_RESTRICT_ACTIVEXINSTALL.html̩$$,/internet_FEATURE_RESTRICT_FILEDOWNLOAD.html̫H(/internet_FEATURE_SAFE_BINDTOOBJECT.htmḽf#/internet_FEATURE_SECURITYBAND.html̯x)/internet_FEATURE_UNC_SAVEDFILECHECK.htmḻ{,/internet_FEATURE_VALIDATE_NAVIGATE_URL.html̴,/internet_FEATURE_WEBOC_POPUPMANAGEMENT.html̶.*/internet_FEATURE_WINDOW_RESTRICTIONS.html̸L%/internet_FEATURE_ZONE_ELEVATION.html̺d '/internet_GET_FEATURE_FROM_PROCESS.htmlΣ(/internet_GET_FEATURE_FROM_REGISTRY.htmlΥ&/internet_GET_FEATURE_FROM_THREAD.htmlΧ& //internet_GET_FEATURE_FROM_THREAD_INTERNET.htmlΩ2'//internet_GET_FEATURE_FROM_THREAD_INTRANET.htmlΫY'3/internet_GET_FEATURE_FROM_THREAD_LOCALMACHINE.htmlή31/internet_GET_FEATURE_FROM_THREAD_RESTRICTED.htmlΰ3-./internet_GET_FEATURE_FROM_THREAD_TRUSTED.htmlβ`$&/internet_SET_FEATURE_IN_REGISTRY.html %/internet_SET_FEATURE_ON_PROCESS.html $/internet_SET_FEATURE_ON_THREAD.html-/internet_SET_FEATURE_ON_THREAD_INTERNET.html !-/internet_SET_FEATURE_ON_THREAD_INTRANET.htmlA!1/internet_SET_FEATURE_ON_THREAD_LOCALMACHINE.htmlb-//internet_SET_FEATURE_ON_THREAD_RESTRICTED.html',/internet_SET_FEATURE_ON_THREAD_TRUSTED.html6 /isapi.htmlx/isapi.install.html!+/isapi.install__AddExtensionFiles_meth.html۳Z.*/isapi.install__AssignScriptMaps_meth.html۸$'/isapi.install__FindWebServer_meth.html۾,%*/isapi.install__get_unique_items_meth.htmlQh&/isapi.install__GetWebServer_meth.html9%+/isapi.install__HandleCommandLine_meth.html^.'/isapi.install__InstallModule_meth.html [-/isapi.install__LocateWebServerPath_meth.htmlg./isapi.install__MergeStandardOptions_meth.html{*/isapi.install__RemoveScriptMaps_meth.htmlj$/isapi.install__split_path_meth.html-)/isapi.install__UninstallModule_meth.html,`/isapi.isapicon.html/x6/isapi.isapicon_HSE_EXEC_URL_DISABLE_CUSTOM_ERROR.htmlo]5/isapi.isapicon_HSE_EXEC_URL_HTTP_CACHE_ELIGIBLE.htmlLZJz.0  : , 6 /9CZ\lSPMGL61/isapi.isapicon_HSE_IO_DISCONNECT_AFTER_SEND.htmlф"G&/isapi.isapicon_HSE_IO_FINAL_SEND.htmlцi#/isapi.isapicon_HSE_IO_NODELAY.htmlщ(/isapi.isapicon_HSE_IO_SEND_HEADERS.htmlы# /isapi.isapicon_HSE_IO_SYNC.htmlэ>%/isapi.isapicon_HSE_STATUS_ERROR.htmlяA'/isapi.isapicon_HSE_STATUS_PENDING.htmlёX'/isapi.isapicon_HSE_STATUS_SUCCESS.htmlѓw5/isapi.isapicon_HSE_STATUS_SUCCESS_AND_KEEP_CONN.htmlіW"/isapi.isapicon_HTTP_ACCEPTED.htmlјm%/isapi.isapicon_HTTP_BAD_GATEWAY.htmlњ{%/isapi.isapicon_HTTP_BAD_REQUEST.htmlѝ"/isapi.isapicon_HTTP_CONFLICT.htmlџ1"/isapi.isapicon_HTTP_CONTINUE.htmlѡ@!/isapi.isapicon_HTTP_CREATED.htmlѣN ,/isapi.isapicon_HTTP_EXPECTATION_FAILED.htmlѥX7#/isapi.isapicon_HTTP_FORBIDDEN.htmlѨ*/isapi.isapicon_HTTP_GATEWAY_TIME_OUT.htmlѪ"//isapi.isapicon_HTTP_GONE.htmlѬQ//isapi.isapicon_HTTP_INTERNAL_SERVER_ERROR.htmlѮPC)/isapi.isapicon_HTTP_LENGTH_REQUIRED.htmlѱ+,/isapi.isapicon_HTTP_METHOD_NOT_ALLOWED.htmlѳ>7+/isapi.isapicon_HTTP_MOVED_PERMANENTLY.htmlѵu3+/isapi.isapicon_HTTP_MOVED_TEMPORARILY.htmlѸ(3&/isapi.isapicon_HTTP_MULTI_STATUS.htmlѺ[*/isapi.isapicon_HTTP_MULTIPLE_CHOICES.htmlѼy/$/isapi.isapicon_HTTP_NO_CONTENT.htmlѿ(+/isapi.isapicon_HTTP_NON_AUTHORITATIVE.html>2(/isapi.isapicon_HTTP_NOT_ACCEPTABLE.htmlp'#/isapi.isapicon_HTTP_NOT_FOUND.html)/isapi.isapicon_HTTP_NOT_IMPLEMENTED.html*+&/isapi.isapicon_HTTP_NOT_MODIFIED.htmlU/isapi.isapicon_HTTP_OK.htmltv)/isapi.isapicon_HTTP_PARTIAL_CONTENT.htmlj**/isapi.isapicon_HTTP_PAYMENT_REQUIRED.html/-/isapi.isapicon_HTTP_PRECONDITION_FAILED.htmlC;$/isapi.isapicon_HTTP_PROCESSING.html~7/isapi.isapicon_HTTP_PROXY_AUTHENTICATION_REQUIRED.htmlc//isapi.isapicon_HTTP_RANGE_NOT_SATISFIABLE.htmlwC2/isapi.isapicon_HTTP_REQUEST_ENTITY_TOO_LARGE.html:O*/isapi.isapicon_HTTP_REQUEST_TIME_OUT.html ///isapi.isapicon_HTTP_REQUEST_URI_TOO_LARGE.html8C'/isapi.isapicon_HTTP_RESET_CONTENT.html{"#/isapi.isapicon_HTTP_SEE_OTHER.html-/isapi.isapicon_HTTP_SERVICE_UNAVAILABLE.html0;-/isapi.isapicon_HTTP_SWITCHING_PROTOCOLS.htmlk:,/isapi.isapicon_HTTP_TEMPORARY_REDIRECT.html%7&/isapi.isapicon_HTTP_UNAUTHORIZED.html\./isapi.isapicon_HTTP_UNPROCESSABLE_ENTITY.html{?0/isapi.isapicon_HTTP_UNSUPPORTED_MEDIA_TYPE.html:G#/isapi.isapicon_HTTP_USE_PROXY.html-/isapi.isapicon_HTTP_VARIANT_ALSO_VARIES.html;//isapi.isapicon_HTTP_VERSION_NOT_SUPPORTED.htmlOC,/isapi.isapicon_SF_NOTIFY_ACCESS_DENIED.htmlf8-/isapi.isapicon_SF_NOTIFY_AUTHENTICATION.html=1/isapi.isapicon_SF_NOTIFY_END_OF_NET_SESSION.html[K-/isapi.isapicon_SF_NOTIFY_END_OF_REQUEST.html&:"/isapi.isapicon_SF_NOTIFY_LOG.html`-/isapi.isapicon_SF_NOTIFY_NONSECURE_PORT.htmlo7,/isapi.isapicon_SF_NOTIFY_ORDER_DEFAULT.html&<)/isapi.isapicon_SF_NOTIFY_ORDER_HIGH.htmlb0(/isapi.isapicon_SF_NOTIFY_ORDER_LOW.html,)/isapi.isapicon_SF_NOTIFY_ORDER_MASK.html>0+/isapi.isapicon_SF_NOTIFY_ORDER_MEDIUM.htmln8./isapi.isapicon_SF_NOTIFY_PREPROC_HEADERS.html&B,/isapi.isapicon_SF_NOTIFY_READ_RAW_DATA.htmlh:*/isapi.isapicon_SF_NOTIFY_SECURE_PORT.html"+,/isapi.isapicon_SF_NOTIFY_SEND_RAW_DATA.htmlM8,/isapi.isapicon_SF_NOTIFY_SEND_RESPONSE.html5&/isapi.isapicon_SF_NOTIFY_URL_MAP.html:!(/isapi.isapicon_SF_STATUS_REQ_ERROR.html[1+/isapi.isapicon_SF_STATUS_REQ_FINISHED.html =5/isapi.isapicon_SF_STATUS_REQ_FINISHED_KEEP_CONN.htmlIe7/isapi.isapicon_SF_STATUS_REQ_HANDLED_NOTIFICATION.html.m4/isapi.isapicon_SF_STATUS_REQ_NEXT_NOTIFICATION.htmla,/isapi.isapicon_SF_STATUS_REQ_READ_NEXT.html|A/isapi.simple.html'p/isapi.threaded_extension.html'/isapi.threaded_extension_INFINITE.html;,/isapi.threaded_extension_ISAPI_REQUEST.html3-/isapi.threaded_extension_ISAPI_SHUTDOWN.htmlH/isapi_constants.html{Rhtml>Jz.0dr v { z z u}lRPMGLH/isapi_modules.htmlR/isapi_objects.htmlg/isapi_overview.htmlw/Keyboard_Bindings.html\[/LARGE_INTEGER.html0f/LV_COLUMN.html* /LV_ITEM.html@ /mapi.html]N/mapi__BinFromHex_meth.html R!/mapi__CloseIMsgSession_meth.html^/mapi__HexFromBin_meth.html`A"/mapi__HrAllocAdviseSink_meth.html! /mapi__HrGetOneProp_meth.html.&/mapi__HrQueryAllRows_meth.html܃Tv/mapi__HrSetOneProp_meth.html܎J?'/mapi__HrThisThreadAdviseSink_meth.htmlܓ ~"/mapi__MAPIAdminProfiles_meth.htmlܗ|/mapi__MAPIInitialize_meth.htmlܚZ/mapi__MAPILogonEx_meth.htmlܝ]*!/mapi__MAPIUninitialize_meth.htmlܥc/mapi__OpenIMsgOnIStg_meth.htmlܧje /mapi__OpenIMsgSession_meth.htmlܰO!/mapi__OpenStreamOnFile_meth.htmlܲWK"/mapi__OpenStreamOnFileW_meth.htmlܷ"P /mapi__RTFStreamToHTML_meth.htmlܻr6/mapi__RTFSync_meth.htmlܿ((/mapi__WrapCompressedRTFStream_meth.htmlFo*/mapi__WrapCompressedRTFStreamEx_meth.html5/mapi_AB_NO_DIALOG.htmlç+g/mapi_ATTACH_BY_REF_ONLY.html%/PyCComboBox__GetExtendedUI_meth.html~i#/PyCComboBox__GetItemData_meth.htmlgK$/PyCComboBox__GetItemValue_meth.html2J!/PyCComboBox__GetLBText_meth.html|'$/PyCComboBox__GetLBTextLen_meth.html#R$/PyCComboBox__InsertString_meth.htmlu!/PyCComboBox__LimitText_meth.html 1$/PyCComboBox__ResetContent_meth.html=k$/PyCComboBox__SelectString_meth.html(!/PyCComboBox__SetCurSel_meth.htmlCJ"/PyCComboBox__SetEditSel_meth.html -%/PyCComboBox__SetExtendedUI_meth.html: #/PyCComboBox__SetItemData_meth.htmlZ,$/PyCComboBox__SetItemValue_meth.htmlu$/PyCComboBox__ShowDropDown_meth.html{@/PyCCommonDialog.htmlFM/PyCControl.html/PyCControlBar.html*+/PyCControlBar__CalcDynamicLayout_meth.html;~./PyCControlBar__CalcDynamicLayout_virtual.html9Q)/PyCControlBar__CalcFixedLayout_meth.html ~,/PyCControlBar__CalcFixedLayout_virtual.htmlG'/PyCControlBar__EnableDocking_meth.htmlOV(/PyCControlBar__EraseNonClient_meth.html%%/PyCControlBar__GetBarStyle_meth.html<="/PyCControlBar__GetCount_meth.htmlyF)/PyCControlBar__GetDockingFrame_meth.html?$/PyCControlBar__IsFloating_meth.html@fAce_meth.html޼51nts.html{RhtmlMi 3 ] !]vDdPMGL< -/PyCControlBar__OnBarStyleChange_virtual.html&{*/PyCControlBar__OnUpdateCmdUI_virtual.html!_%/PyCControlBar__SetBarStyle_meth.html $/PyCControlBar__ShowWindow_meth.html ;/PyCCtrlView.html8k!/PyCCtrlView__OnCommand_meth.htmlD /PyCDC.html#/PyCDC__AbortDoc_meth.htmlb/PyCDC__Arc_meth.htmla /PyCDC__BeginPath_meth.htmlm/PyCDC__BitBlt_meth.html1/PyCDC__Chord_meth.html8 $/PyCDC__CreateCompatibleDC_meth.htmlXb!/PyCDC__CreatePrinterDC_meth.html:r/PyCDC__DeleteDC_meth.html,x/PyCDC__DPtoLP_meth.html$j/PyCDC__Draw3dRect_meth.html/PyCDC__DrawFocusRect_meth.html}"/PyCDC__DrawFrameControl_meth.htmlc/PyCDC__DrawIcon_meth.htmlv/PyCDC__DrawText_meth.html/PyCDC__Ellipse_meth.htmlc/PyCDC__EndDoc_meth.htmlj/PyCDC__EndPage_meth.html /PyCDC__EndPath_meth.htmlQ/PyCDC__ExtTextOut_meth.html`T/PyCDC__FillPath_meth.html4</PyCDC__FillRect_meth.htmlpJ/PyCDC__FillSolidRect_meth.html:F/PyCDC__FrameRect_meth.htmlS/PyCDC__GetBrushOrg_meth.htmlS/PyCDC__GetClipBox_meth.htmllv$/PyCDC__GetCurrentPosition_meth.htmlbL/PyCDC__GetDeviceCaps_meth.html.8!/PyCDC__GetHandleAttrib_meth.htmlf=!/PyCDC__GetHandleOutput_meth.html#:/PyCDC__GetMapMode_meth.html]Z!/PyCDC__GetNearestColor_meth.html7/PyCDC__GetPixel_meth.htmlR*/PyCDC__GetSafeHdc_meth.html|O/PyCDC__GetTextExtent_meth.htmlKg$/PyCDC__GetTextExtentPoint_meth.html2m/PyCDC__GetTextFace_meth.html^ /PyCDC__GetTextMetrics_meth.html} /PyCDC__GetViewportExt_meth.html4 /PyCDC__GetViewportOrg_meth.html44/PyCDC__GetWindowExt_meth.htmlh,/PyCDC__GetWindowOrg_meth.htmlf#/PyCDC__IntersectClipRect_meth.htmlzv/PyCDC__IsPrinting_meth.htmlp*/PyCDC__LineTo_meth.htmlY/PyCDC__LPtoDP_meth.htmls/PyCDC__MoveTo_meth.htmls#/PyCDC__OffsetViewportOrg_meth.htmlv'!/PyCDC__OffsetWindowOrg_meth.html/PyCDC__PatBlt_meth.html2/PyCDC__Pie_meth.htmlH /PyCDC__PolyBezier_meth.htmlU/PyCDC__Polygon_meth.htmli{/PyCDC__Polyline_meth.htmldd /PyCDC__RealizePalette_meth.htmlH/PyCDC__Rectangle_meth.htmlHb/PyCDC__RectVisible_meth.html*/PyCDC__RestoreDC_meth.htmlEw/PyCDC__SaveDC_meth.html<"/PyCDC__ScaleViewportExt_meth.htmlVI /PyCDC__ScaleWindowExt_meth.htmlA/PyCDC__SelectClipRgn_meth.html`./PyCDC__SelectObject_meth.htmld/PyCDC__SelectPalette_meth.htmlr /PyCDC__SetBkColor_meth.html{#/PyCDC__SetBkMode_meth.html/PyCDC__SetBrushOrg_meth.html8X!/PyCDC__SetGraphicsMode_meth.html/PyCDC__SetMapMode_meth.html d/PyCDC__SetPixel_meth.htmla!/PyCDC__SetPolyFillMode_meth.htmle1/PyCDC__SetROP2_meth.html/PyCDC__SetTextAlign_meth.html/"/PyCDC__SetTextColor_meth.htmlQJ /PyCDC__SetViewportExt_meth.html% /PyCDC__SetViewportOrg_meth.html@ /PyCDC__SetWindowExt_meth.htmlJ&/PyCDC__SetWindowOrg_meth.htmlp#/PyCDC__SetWorldTransform_meth.htmlr^/PyCDC__StartDoc_meth.htmlP/PyCDC__StartPage_meth.htmlS/PyCDC__StretchBlt_meth.htmldm#/PyCDC__StrokeAndFillPath_meth.htmlQJ/PyCDC__StrokePath_meth.html'/PyCDC__TextOut_meth.htmlB=/PyCDialog.html'@"/PyCDialog__CreateWindow_meth.html/PyCDialog__DoModal_meth.html{/PyCDialog__EndDialog_meth.html}x!/PyCDialog__GotoDlgCtrl_meth.htmluA#/PyCDialog__MapDialogRect_meth.html6Y/PyCDialog__OnCancel_meth.html !/PyCDialog__OnCancel_virtual.html{"/PyCDialog__OnInitDialog_meth.htmlj-%/PyCDialog__OnInitDialog_virtual.htmlQ/PyCDialog__OnOK_meth.htmlrw/PyCDialog__OnOK_virtual.html[/PyCDialogBar.htmlgt%/PyCDialogBar__CreateWindow_meth.htmlib/PyCDockContext.html["/PyCDockContext__EndDrag_meth.htmlK $/PyCDockContext__EndResize_meth.htmlV{Rhtml>  P  R G;-wlPMGLF $/PyCDockContext__StartDrag_meth.htmlgV&/PyCDockContext__StartResize_meth.html=(/PyCDockContext__ToggleDocking_meth.htmlS/PyCDocTemplate.htmlc`//PyCDocTemplate__CreateNewDocument_virtual.htmlpR,/PyCDocTemplate__CreateNewFrame_virtual.htmlBF&/PyCDocTemplate__DoCreateDoc_meth.htmlY+/PyCDocTemplate__FindOpenDocument_meth.htmla'/PyCDocTemplate__GetDocString_meth.htmlb*/PyCDocTemplate__GetDocumentList_meth.htmlsH(/PyCDocTemplate__GetResourceID_meth.html;6(/PyCDocTemplate__GetSharedMenu_meth.htmlq6-/PyCDocTemplate__InitialUpdateFrame_meth.html;G0/PyCDocTemplate__InitialUpdateFrame_virtual.html'*/PyCDocTemplate__MatchDocType_virtual.htmlq+/PyCDocTemplate__OpenDocumentFile_meth.htmls7./PyCDocTemplate__OpenDocumentFile_virtual.html*T+/PyCDocTemplate__SetContainerInfo_meth.html~9(/PyCDocTemplate__SetDocStrings_meth.html7o/PyCDocument.htmlC7&/PyCDocument__DeleteContents_meth.html-r)/PyCDocument__DeleteContents_virtual.html&"/PyCDocument__DoFileSave_meth.html>%/PyCDocument__DoFileSave_virtual.html]/PyCDocument__DoSave_meth.htmlu/!/PyCDocument__DoSave_virtual.html$c#/PyCDocument__GetAllViews_meth.htmlM&/PyCDocument__GetDocTemplate_meth.htmlT($/PyCDocument__GetFirstView_meth.html|_#/PyCDocument__GetPathName_meth.html[: /PyCDocument__GetTitle_meth.html)"/PyCDocument__IsModified_meth.html>)/PyCDocument__OnChangedViewList_meth.html>O,/PyCDocument__OnChangedViewList_virtual.html '/PyCDocument__OnCloseDocument_meth.htmlz*/PyCDocument__OnCloseDocument_virtual.htmla%/PyCDocument__OnNewDocument_meth.htmll(/PyCDocument__OnNewDocument_virtual.htmlq+&/PyCDocument__OnOpenDocument_meth.html&e)/PyCDocument__OnOpenDocument_virtual.html&/PyCDocument__OnSaveDocument_meth.html'e)/PyCDocument__OnSaveDocument_virtual.html (/PyCDocument__PreCloseFrame_virtual.html )$/PyCDocument__SaveModified_meth.html5h'/PyCDocument__SaveModified_virtual.html'/PyCDocument__SetModifiedFlag_meth.html%[#/PyCDocument__SetPathName_meth.htmlL /PyCDocument__SetTitle_meth.htmlLo&/PyCDocument__UpdateAllViews_meth.html;S /PyCEdit.htmlzH/PyCEdit__Clear_meth.htmlD/PyCEdit__Copy_meth.htmlRD /PyCEdit__CreateWindow_meth.htmlz/PyCEdit__Cut_meth.html?/PyCEdit__FmtLines_meth.htmlO|'/PyCEdit__GetFirstVisibleLine_meth.htmlK/PyCEdit__GetLine_meth.html`h /PyCEdit__GetLineCount_meth.htmlH\/PyCEdit__GetSel_meth.html$ /PyCEdit__LimitText_meth.html.L /PyCEdit__LineFromChar_meth.htmlz}/PyCEdit__LineIndex_meth.htmlwa/PyCEdit__LineScroll_meth.htmlX/PyCEdit__Paste_meth.html`Q/PyCEdit__ReplaceSel_meth.html1L/PyCEdit__SetReadOnly_meth.html}U/PyCEdit__SetSel_meth.htmlRr/PyCEditView.htmlB@#/PyCEditView__GetEditCtrl_meth.htmlDL"/PyCEditView__IsModified_meth.htmlF /PyCEditView__LoadFile_meth.htmlV !/PyCEditView__OnCommand_meth.htmla'/PyCEditView__PreCreateWindow_meth.htmlP /PyCEditView__SaveFile_meth.htmlO '/PyCEditView__SetModifiedFlag_meth.htmlY1/PyCEHANDLE.html{/PyCERT_ALT_NAME_ENTRY.html}U/PyCERT_ALT_NAME_INFO.htmlR)"/PyCERT_AUTHORITY_KEY_ID_INFO.html{Z$/PyCERT_BASIC_CONSTRAINTS2_INFO.htmlU~#/PyCERT_BASIC_CONSTRAINTS_INFO.htmlS/PyCERT_CONTEXT.htmln+9/PyCERT_CONTEXT__CertDeleteCertificateFromStore_meth.html p?/PyCERT_CONTEXT__CertEnumCertificateContextProperties_meth.htmlz5/PyCERT_CONTEXT__CertFreeCertificateContext_meth.html[  cW  \ *@RlZPMGLC >/PyCERT_CONTEXT__CertVerifySubjectCertificateContext_meth.html7lz%/PyCFontDialog__IsStrikeOut_meth.html8 %/PyCFontDialog__IsUnderline_meth.htmlA /PyCFormView.html8k!/PyCFormView__OnCommand_meth.htmlJ/PyCFrameWnd.html#I'/PyCFrameWnd__BeginModalState_meth.htmlh3$/PyCFrameWnd__CreateWindow_meth.htmlZ&/PyCFrameWnd__DockControlBar_meth.htmluh%/PyCFrameWnd__EnableDocking_meth.html]o%/PyCFrameWnd__EndModalState_meth.htmlL,'/PyCFrameWnd__FloatControlBar_meth.htmlx$)/PyCFrameWnd__GetActiveDocument_meth.html5%/PyCFrameWnd__GetActiveView_meth.htmlQM%/PyCFrameWnd__GetControlBar_meth.htmlH%/PyCFrameWnd__GetMessageBar_meth.htmlfY(/PyCFrameWnd__GetMessageString_meth.html?/$/PyCFrameWnd__InModalState_meth.htmln^"/PyCFrameWnd__IsTracking_meth.htmlL?&/PyCFrameWnd__LoadAccelTable_meth.html G$/PyCFrameWnd__LoadBarState_meth.htmlR-!/PyCFrameWnd__LoadFrame_meth.html"/PyCFrameWnd__OnBarCheck_meth.html./PyCFrameWnd__OnUpdateControlBarMenu_meth.html8C'/PyCFrameWnd__PreCreateWindow_meth.html{G$/PyCFrameWnd__RecalcLayout_meth.htmlB$/PyCFrameWnd__SaveBarState_meth.htmlY-%/PyCFrameWnd__SetActiveView_meth.htmlm&/PyCFrameWnd__ShowControlBar_meth.htmlsE(/PyCFrameWnd__ShowOwnedWindows_meth.html8P/PyCGdiObject.htmllt/PyCImageList.html`{/PyCImageList__Add_meth.htmlO(/PyCImageList__DeleteImageList_meth.htmlW9 /PyCImageList__Destroy_meth.html>#/PyCImageList__GetBkColor_meth.htmlN>&/PyCImageList__GetImageCount_meth.html G%/PyCImageList__GetImageInfo_meth.htmlSr&/PyCImageList__GetSafeHandle_meth.htmlE>#/PyCImageList__SetBkColor_meth.html/PyCListBox.html[& /PyCListBox__AddString_meth.html;#/PyCListBox__DeleteString_meth.htmlQ"/PyCListBox__Dir_meth.htmlse$/PyCListBox__GetCaretIndex_meth.htmlX'/PyCListBox__GetCount_meth.html8 /PyCListBox__GetCurSel_meth.html7@"/PyCListBox__GetItemData_meth.htmlwHV{Rhtml> W  1 M m ;\PMGL/ #/PyCListBox__GetItemValue_meth.html?G/PyCListBox__GetSel_meth.html%"/PyCListBox__GetSelCount_meth.html+ "/PyCListBox__GetSelItems_meth.html5H&/PyCListBox__GetSelTextItems_meth.html}p/PyCListBox__GetText_meth.htmlm!/PyCListBox__GetTextLen_meth.html v"/PyCListBox__GetTopIndex_meth.htmlF#/PyCListBox__InsertString_meth.htmlF#/PyCListBox__ResetContent_meth.htmlVf#/PyCListBox__SelectString_meth.html<#/PyCListBox__SelItemRange_meth.htmlOT$/PyCListBox__SetCaretIndex_meth.html#< /PyCListBox__SetCurSel_meth.html_V"/PyCListBox__SetItemData_meth.html5)#/PyCListBox__SetItemValue_meth.html^r/PyCListBox__SetSel_meth.htmlP,"/PyCListBox__SetTabStops_meth.html|w"/PyCListBox__SetTopIndex_meth.htmls/PyCListCtrl.htmlw/PyCListCtrl__Arrange_meth.htmls'/PyCListCtrl__CreateDragImage_meth.htmluj$/PyCListCtrl__CreateWindow_meth.html_J&/PyCListCtrl__DeleteAllItems_meth.html)1$/PyCListCtrl__DeleteColumn_meth.htmlZ,"/PyCListCtrl__DeleteItem_meth.htmlw!/PyCListCtrl__EditLabel_meth.html}/%/PyCListCtrl__EnsureVisible_meth.html,'"/PyCListCtrl__GetBkColor_meth.htmlS9!/PyCListCtrl__GetColumn_meth.html a&/PyCListCtrl__GetColumnWidth_meth.htmlmK'/PyCListCtrl__GetCountPerPage_meth.html8l&/PyCListCtrl__GetEditControl_meth.html$ $/PyCListCtrl__GetImageList_meth.html10/PyCListCtrl__GetItem_meth.htmla3$/PyCListCtrl__GetItemCount_meth.htmlF#/PyCListCtrl__GetItemData_meth.htmlZJ'/PyCListCtrl__GetItemPosition_meth.html$:#/PyCListCtrl__GetItemRect_meth.html^6$/PyCListCtrl__GetItemState_meth.html##/PyCListCtrl__GetItemText_meth.html7#/PyCListCtrl__GetNextItem_meth.htmlU(/PyCListCtrl__GetSelectedCount_meth.htmld]&/PyCListCtrl__GetStringWidth_meth.htmlA]&/PyCListCtrl__GetTextBkColor_meth.htmlR$/PyCListCtrl__GetTextColor_meth.htmlpA#/PyCListCtrl__GetTopIndex_meth.html1>/PyCListCtrl__HitTest_meth.htmlo$/PyCListCtrl__InsertColumn_meth.htmlw"/PyCListCtrl__InsertItem_meth.html #/PyCListCtrl__RedrawItems_meth.htmlg"/PyCListCtrl__SetBkColor_meth.html !/PyCListCtrl__SetColumn_meth.html'&/PyCListCtrl__SetColumnWidth_meth.html:$/PyCListCtrl__SetImageList_meth.htmlBf/PyCListCtrl__SetItem_meth.html(-$/PyCListCtrl__SetItemCount_meth.htmlU)#/PyCListCtrl__SetItemData_meth.html~%$/PyCListCtrl__SetItemState_meth.html#g#/PyCListCtrl__SetItemText_meth.html p&/PyCListCtrl__SetTextBkColor_meth.htmlz&$/PyCListCtrl__SetTextColor_meth.html /PyCListCtrl__Update_meth.html*z/PyCListView.htmlxB#/PyCListView__GetListCtrl_meth.html$`!/PyCListView__OnCommand_meth.html'/PyCListView__PreCreateWindow_meth.html"P/PyCMDIChildWnd.html:E(/PyCMDIChildWnd__ActivateFrame_meth.html}2+/PyCMDIChildWnd__ActivateFrame_virtual.htmlr '/PyCMDIChildWnd__CreateWindow_meth.html/M&/PyCMDIChildWnd__GetMDIFrame_meth.html|-./PyCMDIChildWnd__GetMessageString_virtual.html)&/PyCMDIChildWnd__MDIActivate_meth.htmlB$"/PyCMDIChildWnd__OnClose_meth.htmlf$/PyCMDIChildWnd__OnCommand_meth.html',/PyCMDIChildWnd__OnCreateClient_virtual.html,E*/PyCMDIChildWnd__PreCreateWindow_meth.htmlqP./PyCMDIChildWnd__PreTranslateMessage_meth.htmlAR/PyCMDIFrameWnd.htmlg'/PyCMDIFrameWnd__GetMDIClient_meth.htmld&/PyCMDIFrameWnd__MDIActivate_meth.htmlw\'/PyCMDIFrameWnd__MDIGetActive_meth.htmlSD"/PyCMDIFrameWnd__MDINext_meth.html"/PyCMDIFrameWnd__OnClose_meth.html28$/PyCMDIFrameWnd__OnCommand_meth.htmlj'(/PyCMDIFrameWnd__OnContextHelp_meth.htmlL*/PyCMDIFrameWnd__PreCreateWindow_meth.html]P./PyCMDIFrameWnd__PreTranslateMessage_meth.html-R /PyCMenu.htmlf/PyCMenu__AppendMenu_meth.htmlO/PyCMenu__DeleteMenu_meth.htmlN."/PyCMenu__EnableMenuItem_meth.html|z/PyCMenu__GetHandle_meth.htmlv'> "Ii * R~2u^PMGL3 $/PyCMenu__GetMenuItemCount_meth.html&!/PyCMenu__GetMenuItemID_meth.htmlC$!/PyCMenu__GetMenuString_meth.htmlg`/PyCMenu__GetSubMenu_meth.htmlG-/PyCMenu__InsertMenu_meth.htmlt;/PyCMenu__ModifyMenu_meth.html/n"/PyCMenu__TrackPopupMenu_meth.htmlL/PyCMINVOKECOMMANDINFO.html{c/PyCOleClientItem.html^"/PyCOleClientItem__Close_meth.htmli*/PyCOleClientItem__CreateNewItem_meth.html}6#/PyCOleClientItem__DoVerb_meth.html3$!/PyCOleClientItem__Draw_meth.htmlWb*/PyCOleClientItem__GetActiveView_meth.html9f(/PyCOleClientItem__GetDocument_meth.htmlm-/PyCOleClientItem__GetInPlaceWindow_meth.html )/PyCOleClientItem__GetItemState_meth.html#>&/PyCOleClientItem__GetObject_meth.htmla '/PyCOleClientItem__GetStorage_meth.htmlm;'/PyCOleClientItem__OnActivate_meth.htmlD4*/PyCOleClientItem__OnActivate_virtual.html(%/PyCOleClientItem__OnChange_meth.html".(/PyCOleClientItem__OnChange_virtual.htmlx*1/PyCOleClientItem__OnChangeItemPosition_meth.htmlK4/PyCOleClientItem__OnChangeItemPosition_virtual.htmlPK+/PyCOleClientItem__OnDeactivateUI_meth.html\F./PyCOleClientItem__OnDeactivateUI_virtual.htmlfv1/PyCOleClientItem__OnGetItemPosition_virtual.html"1 /PyCOleClientItem__Run_meth.htmlS.)/PyCOleClientItem__SetItemRects_meth.html_/PyCOleDialog.htmlpP/PyCOleDocument.html@"-/PyCOleDocument__EnableCompoundFile_meth.html` //PyCOleDocument__GetInPlaceActiveItem_meth.htmlmG&/PyCOleDocument__GetNextItem_meth.html4+/PyCOleDocument__GetStartPosition_meth.html;b/PyCOleInsertDialog.htmlby)/PyCOleInsertDialog__GetClassID_meth.htmlU*/PyCOleInsertDialog__GetPathName_meth.htmlr5//PyCOleInsertDialog__GetSelectionType_meth.html'V/PyCOMSTAT.html["/PyConsoleScreenBuffer.html}\/PyConsoleScreenBuffer__SetConsoleActiveScreenBuffer_meth.html;6/PyConsoleScreenBuffer__SetConsoleCursorInfo_meth.htmlQA:/PyConsoleScreenBuffer__SetConsoleCursorPosition_meth.html 7/PyConsoleScreenBuffer__SetConsoleDisplayMode_meth.html2 0/PyConsoleScreenBuffer__SetConsoleFont_meth.html;{0/PyConsoleScreenBuffer__SetConsoleMode_meth.html6` "Ii 2 S .^c_mOPMGL@ /PyCPrintInfo__DoModal_meth.html@T%/PyCPrintInfo__FreeDefaults_meth.htmlm,/PyCPrintInfo__GetContinuePrinting_meth.html."/PyCPrintInfo__GetCopies_meth.html/#/PyCPrintInfo__GetCurPage_meth.html1f$/PyCPrintInfo__GetDefaults_meth.htmlY&/PyCPrintInfo__GetDeviceName_meth.htmlp"/PyCPrintInfo__GetDirect_meth.html'/PyCPrintInfo__GetDlgFromPage_meth.html %/PyCPrintInfo__GetDlgToPage_meth.html$z)/PyCPrintInfo__GetDocOffsetPage_meth.htmlI /PyCPrintInfo__GetDraw_meth.htmlgy&/PyCPrintInfo__GetDriverName_meth.html`0#/PyCPrintInfo__GetDwFlags_meth.html'!/PyCPrintInfo__GetFlags_meth.html7d$/PyCPrintInfo__GetFromPage_meth.htmlr/PyCPrintInfo__GetHDC_meth.html =#/PyCPrintInfo__GetMaxPage_meth.htmlJs#/PyCPrintInfo__GetMinPage_meth.html=t+/PyCPrintInfo__GetNumPreviewPages_meth.html1&/PyCPrintInfo__GetOffsetPage_meth.htmlF\$/PyCPrintInfo__GetPageDesc_meth.html"$/PyCPrintInfo__GetPortName_meth.html6#/PyCPrintInfo__GetPreview_meth.htmlU}*/PyCPrintInfo__GetPRINTDLGCopies_meth.htmlR;+/PyCPrintInfo__GetPRINTDLGMinPage_meth.html )%/PyCPrintInfo__GetPrinterDC_meth.html6E"/PyCPrintInfo__GetToPage_meth.html{i$/PyCPrintInfo__GetUserData_meth.htmlde!/PyCPrintInfo__PrintAll_meth.htmlI'%/PyCPrintInfo__PrintCollate_meth.htmlpD#/PyCPrintInfo__PrintRange_meth.html4;'/PyCPrintInfo__PrintSelection_meth.htmlo=,/PyCPrintInfo__SetContinuePrinting_meth.html, #/PyCPrintInfo__SetCurPage_meth.htmlLf"/PyCPrintInfo__SetDirect_meth.html2)/PyCPrintInfo__SetDocOffsetPage_meth.htmlPI /PyCPrintInfo__SetDraw_meth.htmly#/PyCPrintInfo__SetDwFlags_meth.html*!/PyCPrintInfo__SetFlags_meth.html++/PyCPropertySheet__GetActiveIndex_meth.htmlic*/PyCPropertySheet__GetActivePage_meth.htmlLAh.htmlE{v'> " $ 9 S 7XuYPMGL+$/PyCPropertySheet__GetPage_meth.html )/PyCPropertySheet__GetPageCount_meth.html<)/PyCPropertySheet__GetPageIndex_meth.htmlT\'/PyCPropertySheet__GetTabCtrl_meth.html0i)/PyCPropertySheet__OnInitDialog_meth.htmlP,/PyCPropertySheet__OnInitDialog_virtual.htmlkf./PyCPropertySheet__OnInitDialog_virtual_1.htmli(/PyCPropertySheet__PressButton_meth.htmlQ3'/PyCPropertySheet__RemovePage_meth.htmlt*/PyCPropertySheet__SetActivePage_meth.htmlxF*/PyCPropertySheet__SetFinishText_meth.html>&/PyCPropertySheet__SetPSHBit_meth.html\g%/PyCPropertySheet__SetTitle_meth.htmlC-/PyCPropertySheet__SetWizardButtons_meth.htmlQ*/PyCPropertySheet__SetWizardMode_meth.htmlg4*/PyCPropertySheet__WindowProc_virtual.html4 /PyCRect.htmlK/PyCREDENTIAL.htmlbt/PyCREDENTIAL_ATTRIBUTE.htmlV%/PyCREDENTIAL_TARGET_INFORMATION.htmlpP/PyCredHandle.html@6/PyCredHandle__Detach_meth.htmlOH./PyCredHandle__FreeCredentialsHandle_meth.htmlb3/PyCredHandle__QueryCredentialsAttributes_meth.htmly1/PyCREDUI_INFO.htmlv` /PyCRgn.htmlVg/PyCRgn__CombineRgn_meth.html*/PyCRgn__CopyRgn_meth.htmlI^$/PyCRgn__CreateEllipticRgn_meth.html'e /PyCRgn__CreateRectRgn_meth.html Z/PyCRgn__DeleteObject_meth.htmlf/PyCRgn__GetRgnBox_meth.html|~ /PyCRgn__GetSafeHandle_meth.htmlz /PyCRichEditCtrl.html=;!/PyCRichEditCtrl__Clear_meth.htmld /PyCRichEditCtrl__Copy_meth.htmlhd(/PyCRichEditCtrl__CreateWindow_meth.htmlL/PyCRichEditCtrl__Cut_meth.htmlc_$/PyCRichEditCtrl__FindText_meth.htmlB&/PyCRichEditCtrl__GetCharPos_meth.htmlZ/0/PyCRichEditCtrl__GetDefaultCharFormat_meth.html a(/PyCRichEditCtrl__GetEventMask_meth.htmlj|//PyCRichEditCtrl__GetFirstVisibleLine_meth.htmlf5#/PyCRichEditCtrl__GetLine_meth.html(/PyCRichEditCtrl__GetLineCount_meth.html|%/PyCRichEditCtrl__GetModify_meth.html)/PyCRichEditCtrl__GetParaFormat_meth.html+w"/PyCRichEditCtrl__GetSel_meth.html"*2/PyCRichEditCtrl__GetSelectionCharFormat_meth.htmlL;&/PyCRichEditCtrl__GetSelText_meth.html=)/PyCRichEditCtrl__GetTextLength_meth.htmlD%/PyCRichEditCtrl__LimitText_meth.htmlSl(/PyCRichEditCtrl__LineFromChar_meth.html?%/PyCRichEditCtrl__LineIndex_meth.html\&/PyCRichEditCtrl__LineScroll_meth.html](!/PyCRichEditCtrl__Paste_meth.htmlq&/PyCRichEditCtrl__ReplaceSel_meth.htmlvl./PyCRichEditCtrl__SetBackgroundColor_meth.htmlb0/PyCRichEditCtrl__SetDefaultCharFormat_meth.html(/PyCRichEditCtrl__SetEventMask_meth.htmlU%/PyCRichEditCtrl__SetModify_meth.htmlgr&/PyCRichEditCtrl__SetOptions_meth.htmlYl)/PyCRichEditCtrl__SetParaFormat_meth.htmlEz'/PyCRichEditCtrl__SetReadOnly_meth.html?u"/PyCRichEditCtrl__SetSel_meth.html4//PyCRichEditCtrl__SetSelAndCharFormat_meth.htmlB"2/PyCRichEditCtrl__SetSelectionCharFormat_meth.htmld[+/PyCRichEditCtrl__SetTargetDevice_meth.html?W-/PyCRichEditCtrl__SetWordCharFormat_meth.htmlN$/PyCRichEditCtrl__StreamIn_meth.htmld%%/PyCRichEditCtrl__StreamOut_meth.html o/PyCRichEditDoc.htmlxZ*/PyCRichEditDoc__OnCloseDocument_meth.htmlx/PyCRichEditDocTemplate.htmlR|6/PyCRichEditDocTemplate__DoCreateRichEditDoc_meth.html~/PyCRichEditView.htmlN+/PyCRichEditView__GetRichEditCtrl_meth.html (/PyCRichEditView__SaveTextFile_meth.html*'/PyCRichEditView__SetWordWrap_meth.html/PyCTabCtrl.html]H /PyCTabCtrl__GetCurSel_meth.html=$/PyCTabCtrl__GetItemCountl_meth.htmlY; /PyCTabCtrl__SetCurSel_meth.htmlp/PyCTL_CONTEXT.html%v0/PyCTL_CONTEXT__CertDeleteCTLFromStore_meth.htmle6/PyCTL_CONTEXT__CertEnumCTLContextProperties_meth.htmlip4/PyCTL_CONTEXT__CertEnumSubjectInSortedCTL_meth.htmlYr,/PyCTL_CONTEXT__CertFreeCTLContext_meth.htmlK86/PyCTL_CONTEXT__CertSerializeCTLStoreElement_meth.html\/PyCTL_USAGE.html/PyCToolBar.html2B%/PyCToolBar__GetButtonStyle_meth.html_&$/PyCToolBar__GetButtonText_meth.html% /PyCToolBar__GetItemID_meth.html*6%/PyCToolBar__GetToolBarCtrl_meth.html`p"/PyCToolBar__GetToolTips_meth.htmlP,!/PyCToolBar__LoadBitmap_meth.html|q"/PyCToolBar__LoadToolBar_meth.htmlmZ"/PyCToolBar__SetBarStyle_meth.htmlG /PyCToolBar__SetBitmap_meth.htmlJi$/PyCToolBar__SetButtonInfo_meth.html3S!/PyCToolBar__SetButtons_meth.html%/PyCToolBar__SetButtonStyle_meth.htmlY$/PyCToolBar__SetButtonText_meth.htmlaU /PyCToolBar__SetHeight_meth.html6 /PyCToolBar__SetSizes_meth.html@_"/PyCToolBar__SetToolTips_meth.html0/PyCToolBarCtrl.htmltX$/PyCToolBarCtrl__AddBitmap_meth.htmlO%/PyCToolBarCtrl__AddButtons_meth.htmlTw%/PyCToolBarCtrl__AddStrings_meth.htmlK8#/PyCToolBarCtrl__AutoSize_meth.htmld&/PyCToolBarCtrl__CheckButton_meth.htmlg[)/PyCToolBarCtrl__CommandToIndex_meth.htmlB7'/PyCToolBarCtrl__CreateWindow_meth.htmlyR$/PyCToolBarCtrl__Customize_meth.htmlKp'/PyCToolBarCtrl__DeleteButton_meth.html;Y'/PyCToolBarCtrl__EnableButton_meth.html;)/PyCToolBarCtrl__GetBitmapFlags_meth.htmlO $/PyCToolBarCtrl__GetButton_meth.html[)/PyCToolBarCtrl__GetButtonCount_meth.htmlt"&/PyCToolBarCtrl__GetItemRect_meth.html"/PyCToolBarCtrl__GetRows_meth.html%/PyCToolBarCtrl__HideButton_meth.html,.(/PyCToolBarCtrl__Indeterminate_meth.htmlZ7'/PyCToolBarCtrl__InsertButton_meth.html */PyCToolBarCtrl__IsButtonChecked_meth.html*/PyCToolBarCtrl__IsButtonEnabled_meth.html&)/PyCToolBarCtrl__IsButtonHidden_meth.html.0/PyCToolBarCtrl__IsButtonIndeterminate_meth.html1**/PyCToolBarCtrl__IsButtonPressed_meth.html[&/PyCToolBarCtrl__PressButton_meth.htmlc,(/PyCToolBarCtrl__SetBitmapSize_meth.htmlq(/PyCToolBarCtrl__SetButtonSize_meth.htmlS#/PyCToolBarCtrl__SetCmdID_meth.htmlS"/PyCToolBarCtrl__SetRows_meth.htmle2(/PyCToolBarCtrl__TBUTTON_tuple_meth.htmlc/PyCToolTipCtrl.htmlLW"/PyCToolTipCtrl__AddTool_meth.htmlz~'/PyCToolTipCtrl__CreateWindow_meth.htmlx)/PyCToolTipCtrl__SetMaxTipWidth_meth.htmlys(/PyCToolTipCtrl__UpdateTipText_meth.htmllB/PyCTreeCtrl.html#P'/PyCTreeCtrl__CreateDragImage_meth.html.Y$/PyCTreeCtrl__CreateWindow_meth.htmlJ&/PyCTreeCtrl__DeleteAllItems_meth.htmlQ:"/PyCTreeCtrl__DeleteItem_meth.html |!/PyCTreeCtrl__EditLabel_meth.html,%/PyCTreeCtrl__EnsureVisible_meth.html31/PyCTreeCtrl__Expand_meth.htmld^$/PyCTreeCtrl__GetChildItem_meth.htmlB /PyCTreeCtrl__GetCount_meth.htmlTL*/PyCTreeCtrl__GetDropHilightItem_meth.html [&/PyCTreeCtrl__GetEditControl_meth.html{ +/PyCTreeCtrl__GetFirstVisibleItem_meth.htmlf$/PyCTreeCtrl__GetImageList_meth.htmln0!/PyCTreeCtrl__GetIndent_meth.htmlM/PyCTreeCtrl__GetItem_meth.htmlk'#/PyCTreeCtrl__GetItemData_meth.htmlP$/PyCTreeCtrl__GetItemImage_meth.htmlb#/PyCTreeCtrl__GetItemRect_meth.html|3$/PyCTreeCtrl__GetItemState_meth.html/q#/PyCTreeCtrl__GetItemText_meth.html 1#/PyCTreeCtrl__GetNextItem_meth.htmlQl*/PyCTreeCtrl__GetNextSiblingItem_meth.html=@*/PyCTreeCtrl__GetNextVisibleItem_meth.html}E%/PyCTreeCtrl__GetParentItem_meth.htmlB0_meth.htmlb   @ j 6e[PMGLE*/PyCTreeCtrl__GetPrevSiblingItem_meth.htmlrD*/PyCTreeCtrl__GetPrevVisibleItem_meth.html6M#/PyCTreeCtrl__GetRootItem_meth.htmlG'/PyCTreeCtrl__GetSelectedItem_meth.htmlJP#/PyCTreeCtrl__GetToolTips_meth.html?'/PyCTreeCtrl__GetVisibleCount_meth.htmlYm/PyCTreeCtrl__HitTest_meth.htmlFS"/PyCTreeCtrl__InsertItem_meth.html3'/PyCTreeCtrl__ItemHasChildren_meth.htmlL,/PyCTreeCtrl__Select_meth.htmlxY(/PyCTreeCtrl__SelectDropTarget_meth.htmlQ4"/PyCTreeCtrl__SelectItem_meth.html-/PyCTreeCtrl__SelectSetFirstVisible_meth.html ?$/PyCTreeCtrl__SetImageList_meth.htmlHf!/PyCTreeCtrl__SetIndent_meth.html./PyCTreeCtrl__SetItem_meth.htmlG-#/PyCTreeCtrl__SetItemData_meth.htmlt$/PyCTreeCtrl__SetItemImage_meth.html:$/PyCTreeCtrl__SetItemState_meth.htmlM#/PyCTreeCtrl__SetItemText_meth.html^ $/PyCTreeCtrl__SortChildren_meth.htmlk/PyCTreeView.htmlsB#/PyCTreeView__GetTreeCtrl_meth.html`!/PyCTreeView__OnCommand_meth.htmlc'/PyCTreeView__PreCreateWindow_meth.htmlP/PyCtxtHandle.html54*/PyCtxtHandle__CompleteAuthToken_meth.htmlQL'/PyCtxtHandle__DecryptMessage_meth.htmlD./PyCtxtHandle__DeleteSecurityContext_meth.htmla^/PyCtxtHandle__Detach_meth.html?:'/PyCtxtHandle__EncryptMessage_meth.htmlyJ3/PyCtxtHandle__ImpersonateSecurityContext_meth.htmlC^&/PyCtxtHandle__MakeSignature_meth.html!//PyCtxtHandle__QueryContextAttributes_meth.html$2/PyCtxtHandle__QuerySecurityContextToken_meth.html= ./PyCtxtHandle__RevertSecurityContext_meth.htmlH>(/PyCtxtHandle__VerifySignature_meth.html /PyCView.htmli /PyCView__CreateWindow_meth.htmli%/PyCView__DoPreparePrinting_meth.htmlws/PyCView__GetDocument_meth.htmljI"/PyCView__OnActivateView_meth.html3V%/PyCView__OnActivateView_virtual.html 8#/PyCView__OnBeginPrinting_meth.htmlA1&/PyCView__OnBeginPrinting_virtual.htmlrP/PyCView__OnDraw_virtual.htmlB@!/PyCView__OnEndPrinting_meth.html%$/PyCView__OnEndPrinting_virtual.html/PyCView__OnFilePrint_meth.html>(&/PyCView__OnFilePrintPreview_meth.htmlfD#/PyCView__OnInitialUpdate_meth.html*1&/PyCView__OnInitialUpdate_virtual.html[u#/PyCView__OnMouseActivate_meth.htmlP/PyCView__OnPrepareDC_meth.htmlT"/PyCView__OnPrepareDC_virtual.htmlmW%/PyCView__OnPreparePrinting_meth.html C(/PyCView__OnPreparePrinting_virtual.htmlDH/PyCView__OnPrint_virtual.htmlO'/PyCView__OnUpdate_virtual.htmlv:#/PyCView__PreCreateWindow_meth.html0;/PyCWinApp.htmlw$/PyCWinApp__AddDocTemplate_meth.htmlkE&/PyCWinApp__FindOpenDocument_meth.html0r(/PyCWinApp__GetDocTemplateList_meth.html"y%/PyCWinApp__InitDlgInstance_meth.html/PyCWinApp__IsInproc_meth.htmlX /PyCWinApp__LoadCursor_meth.htmlv7/PyCWinApp__LoadIcon_meth.html-#/PyCWinApp__LoadOEMCursor_meth.html. (/PyCWinApp__LoadStandardCursor_meth.html9X&/PyCWinApp__LoadStandardIcon_meth.html`/PyCWinApp__OnFileNew_meth.htmlq& /PyCWinApp__OnFileOpen_meth.html*&/PyCWinApp__OpenDocumentFile_meth.htmlA'/PyCWinApp__RemoveDocTemplate_meth.html`/PyCWinApp__Run_meth.htmlz/PyCWinThread.html (%/PyCWinThread__CreateThread_meth.htmlA!/PyCWinThread__PumpIdle_meth.htmlX%/PyCWinThread__PumpMessages_meth.htmlrh/PyCWinThread__Run_meth.htmlZ&%/PyCWinThread__SetMainFrame_meth.html1*/PyCWinThread__SetThreadPriority_meth.html1R /PyCWnd.html5h /PyCWnd__ActivateFrame_meth.htmla/PyCWnd__BeginPaint_meth.htmldY#/PyCWnd__BringWindowToTop_meth.html=!/PyCWnd__CalcWindowRect_meth.htmlQd/PyCWnd__CenterWindow_meth.html5##/PyCWnd__CheckRadioButton_meth.htmlX^'/PyCWnd__ChildWindowFromPoint_meth.html6!/PyCWnd__ClientToScreen_meth.html7!/PyCWnd__CreateWindow_meth.htmlXY!/PyCWnd__CreateWindowEx_meth.html1mlB0_meth.htmlb 4u  @ k  ?w^PMGLI /PyCWnd__DefWindowProc_meth.htmlJe /PyCWnd__DestroyWindow_meth.html/[/PyCWnd__DlgDirList_meth.html %/PyCWnd__DlgDirListComboBox_meth.htmlM/PyCWnd__DlgDirSelect_meth.htmlg'/PyCWnd__DlgDirSelectComboBox_meth.html_"/PyCWnd__DragAcceptFiles_meth.html_/PyCWnd__DrawMenuBar_meth.htmle2/PyCWnd__EnableWindow_meth.htmln/PyCWnd__EndModalLoop_meth.html|/PyCWnd__EndPaint_meth.html8(/PyCWnd__GetCheckedRadioButton_meth.html9 /PyCWnd__GetClientRect_meth.html8i/PyCWnd__GetDC_meth.html!"/PyCWnd__GetDCEx_meth.htmlCD/PyCWnd__GetDlgCtrlID_meth.html]/PyCWnd__GetDlgItem_meth.htmld0 /PyCWnd__GetDlgItemInt_meth.htmlF!/PyCWnd__GetDlgItemText_meth.htmlZz/PyCWnd__GetExStyle_meth.htmlT!%/PyCWnd__GetLastActivePopup_meth.htmlu$/PyCWnd__GetMenu_meth.htmlV/PyCWnd__GetParent_meth.htmloa!/PyCWnd__GetParentFrame_meth.htmlPt!/PyCWnd__GetParentOwner_meth.htmlD/PyCWnd__GetSafeHwnd_meth.htmlVU /PyCWnd__GetScrollInfo_meth.html+h/PyCWnd__GetScrollPos_meth.htmlU/PyCWnd__GetStyle_meth.htmlh /PyCWnd__GetSystemMenu_meth.htmlx#/PyCWnd__GetTopLevelFrame_meth.html #/PyCWnd__GetTopLevelOwner_meth.html $/PyCWnd__GetTopLevelParent_meth.html/PyCWnd__GetTopWindow_meth.html/ /PyCWnd__GetWindow_meth.html9/PyCWnd__GetWindowDC_meth.html9=%/PyCWnd__GetWindowPlacement_meth.htmlvl /PyCWnd__GetWindowRect_meth.htmlb /PyCWnd__GetWindowText_meth.htmlyY/PyCWnd__HideCaret_meth.htmlRb$/PyCWnd__HookAllKeyStrokes_meth.html4W /PyCWnd__HookKeyStroke_meth.html N/PyCWnd__HookMessage_meth.htmlYB!/PyCWnd__InvalidateRect_meth.html! /PyCWnd__InvalidateRgn_meth.html<}/PyCWnd__IsChild_meth.html9W%/PyCWnd__IsDlgButtonChecked_meth.html^/PyCWnd__IsIconic_meth.htmln1/PyCWnd__IsWindow_meth.htmlB"/PyCWnd__IsWindowEnabled_meth.htmla9"/PyCWnd__IsWindowVisible_meth.html9/PyCWnd__IsZoomed_meth.htmlS&/PyCWnd__KillTimer_meth.htmlyA#/PyCWnd__LockWindowUpdate_meth.html:g"/PyCWnd__MapWindowPoints_meth.html!7/PyCWnd__MessageBox_meth.htmlX/PyCWnd__ModifyStyle_meth.htmlks /PyCWnd__ModifyStyleEx_meth.html^ /PyCWnd__MouseCaptured_meth.html{:/PyCWnd__MoveWindow_meth.html5V/PyCWnd__OnClose_meth.html 2/PyCWnd__OnClose_virtual.html="/PyCWnd__OnCommand_virtual.html_+/PyCWnd__OnCreate_virtual.html O/PyCWnd__OnCtlColor_meth.htmlX] /PyCWnd__OnCtlColor_virtual.htmlY/PyCWnd__OnEraseBkgnd_meth.html56"/PyCWnd__OnEraseBkgnd_virtual.htmlkM#/PyCWnd__OnMDIActivate_virtual.html8o"/PyCWnd__OnMouseActivate_meth.html.%/PyCWnd__OnMouseActivate_virtual.html'"/PyCWnd__OnNcCalcSize_virtual.html/)/PyCWnd__OnNcHitTest_meth.htmlXh!/PyCWnd__OnNcHitTest_virtual.html@\/PyCWnd__OnPaint_meth.html7/PyCWnd__OnPaint_virtual.htmlSG&/PyCWnd__OnPaletteChanged_virtual.html")/PyCWnd__OnPaletteIsChanging_virtual.html<|"/PyCWnd__OnQueryDragIcon_meth.html80%/PyCWnd__OnQueryDragIcon_virtual.htmlhv$/PyCWnd__OnQueryNewPalette_meth.html^>'/PyCWnd__OnQueryNewPalette_virtual.html\/PyCWnd__OnSetCursor_meth.htmlNi!/PyCWnd__OnSetCursor_virtual.htmlxV&/PyCWnd__OnSysColorChange_virtual.html7@/PyCWnd__OnTimer_virtual.htmlw$/PyCWnd__OnWinIniChange_virtual.html~w/PyCWnd__OnWndMsg_meth.htmlu*/PyCWnd__PostMessage_meth.html`"/PyCWnd__PreCreateWindow_meth.htmlW8%/PyCWnd__PreCreateWindow_virtual.htmlX)/PyCWnd__PreTranslateMessage_virtual.htmlH&/PyCWnd__PumpWaitingMessages_meth.htmlW9/PyCWnd__RedrawWindow_meth.html%!/PyCWnd__ReleaseCapture_meth.html5q/PyCWnd__ReleaseDC_meth.html&(!/PyCWnd__RepositionBars_meth.htmlN]/PyCWnd__RunModalLoop_meth.html+k!/PyCWnd__ScreenToClient_meth.htmlw/PyCWnd__SendMessage_meth.html 11mlB0_meth.htmlb@ h > ~.gSdPMGLQ+/PyCWnd__SendMessageToDescendants_meth.html>"/PyCWnd__SetActiveWindow_meth.htmlYE/PyCWnd__SetCapture_meth.htmle!/PyCWnd__SetDlgItemText_meth.html!/PyCWnd__SetFocus_meth.html$;/PyCWnd__SetFont_meth.html_p&/PyCWnd__SetForegroundWindow_meth.htmlON/PyCWnd__SetIcon_meth.html/PyCWnd__SetMenu_meth.html: /PyCWnd__SetRedraw_meth.htmlEb /PyCWnd__SetScrollInfo_meth.html'J/PyCWnd__SetScrollPos_meth.htmlq/PyCWnd__SetTimer_meth.htmltu%/PyCWnd__SetWindowPlacement_meth.htmlij/PyCWnd__SetWindowPos_meth.htmlS /PyCWnd__SetWindowText_meth.htmla&/PyCWnd__ShowCaret_meth.htmlb /PyCWnd__ShowScrollBar_meth.htmli)/PyCWnd__ShowWindow_meth.html>%/PyCWnd__UnlockWindowUpdate_meth.htmlP/PyCWnd__UpdateData_meth.htmlQy'/PyCWnd__UpdateDialogControls_meth.htmlJG/PyCWnd__UpdateWindow_meth.htmlx/PyDateTime.html /PyDateTime__Format_meth.html /PyDCB.html)k/PyDDEConv.htmlZ/PyDDEConv__Connected_meth.html(/PyDDEConv__ConnectTo_meth.html;B/PyDDEConv__Exec_meth.html}d/PyDDEConv__Poke_meth.htmlaz/PyDDEConv__Request_meth.html[/PyDDEServer.htmln /PyDDEServer__AddTopic_meth.htmla{/PyDDEServer__Create_meth.html\ /PyDDEServer__Destroy_meth.htmlf|$/PyDDEServer__GetLastError_meth.htmlb /PyDDEServer__Shutdown_meth.htmlsy/PyDDEStringItem.html|#/PyDDEStringItem__Destroy_meth.htmll#/PyDDEStringItem__SetData_meth.html/PyDDETopic.html=/PyDDETopic__AddItem_meth.htmlv/PyDDETopic__Destroy_meth.html /PyDEVMODE.htmlQY/PyDEVMODE__Clear_meth.html/PyDEVMODE__Clear_meth_1.html0/PyDEVMODEW.html*@/PyDialogTemplate.htmljM/PyDISPLAY_DEVICE.html7"/PyDISPLAY_DEVICE__Clear_meth.htmlC(/PyDLGITEMTEMPLATE.html</PyDLGTEMPLATE.htmlWA /PyDLL.html5/PyDLL____repr___meth.htmlk*/PyDLL__AttachToMFC_meth.html/PyDLL__GetFileName_meth.html4</PyDS_HANDLE.htmlM1/PyDS_NAME_RESULT_ITEM.html~Z/PyDSBCAPS.htmlX/PyDSBUFFERDESC.htmll/PyDSCAPS.htmlk/PyDSCBCAPS.html~O/PyDSCBUFFERDESC.htmlM)/PyDSCCAPS.htmlv$/PyDSOP_FILTER_FLAGS.htmlW/PyDSOP_SCOPE_INIT_INFO.htmlqt/PyDSOP_SCOPE_INIT_INFOs.htmle1!/PyDSOP_UPLEVEL_FILTER_FLAGS.html]/PyEventLogRecord.htmls|/PyEVT_HANDLE.htmlow/PyEVT_RPC_LOGIN.htmlf|/PyEVTLOG_HANDLE.htmlbc/PyFORMATETC.htmlE?/PyGdiHANDLE.htmlG/PyGetSignerCertificate.htmlK]"/PyGFileOperationProgressSink.html(b9/PyGFileOperationProgressSink__FinishOperations_meth.htmlpa3/PyGFileOperationProgressSink__PauseTimer_meth.htmlQZ5/PyGFileOperationProgressSink__PostCopyItem_meth.html+/7/PyGFileOperationProgressSink__PostDeleteItem_meth.htmlZ]5/PyGFileOperationProgressSink__PostMoveItem_meth.html7b4/PyGFileOperationProgressSink__PostNewItem_meth.html7/PyGFileOperationProgressSink__PostRenameItem_meth.html+O4/PyGFileOperationProgressSink__PreCopyItem_meth.htmlzc6/PyGFileOperationProgressSink__PreDeleteItem_meth.html][4/PyGFileOperationProgressSink__PreMoveItem_meth.html8V3/PyGFileOperationProgressSink__PreNewItem_meth.htmlP6/PyGFileOperationProgressSink__PreRenameItem_meth.html^63/PyGFileOperationProgressSink__ResetTimer_meth.htmlZ4/PyGFileOperationProgressSink__ResumeTimer_meth.htmln]8/PyGFileOperationProgressSink__StartOperations_meth.htmlK7/PyGFileOperationProgressSink__UpdateProgress_meth.htmlOe/PyGROUP_INFO_.2a.html g/PyGROUP_INFO_0.htmlq/PyGROUP_INFO_1.html /PyGROUP_INFO_1002.html/PyGROUP_INFO_1005.html$o/PyGROUP_INFO_2.htmlX/PyGROUP_USERS_INFO_.2a.htmlk/PyGROUP_USERS_INFO_0.htmlz5/PyGROUP_USERS_INFO_1.html/a/PyGSecurityInformation.html/2/PyGSecurityInformation__GetAccessRights_meth.html4l 11mlB0_meth.htmlb_j <  | M{dLhPMGL;2/PyGSecurityInformation__GetInheritTypes_meth.htmlI"7/PyGSecurityInformation__GetObjectInformation_meth.htmlkL./PyGSecurityInformation__GetSecurity_meth.html75-/PyGSecurityInformation__MapGeneric_meth.htmllR3./PyGSecurityInformation__SetSecurity_meth.htmlq /PyHANDLE.html?$/PyHANDLE____hash___meth.html~3/PyHANDLE____int___meth.html1 /PyHANDLE____long___meth.html> /PyHANDLE____nonzero___meth.htmlO[/PyHANDLE____print___meth.html* /PyHANDLE____str___meth.htmlJ6/PyHANDLE__Close_meth.html`/PyHANDLE__Detach_meth.html`F /PyHDESK.htmlc_ /PyHDESK__CloseDesktop_meth.html&&/PyHDESK__EnumDesktopWindows_meth.html>{$/PyHDESK__SetThreadDesktop_meth.html95!/PyHDESK__SwitchDesktop_meth.htmln/PyHDEVNOTIFY.htmlB/PyHH_AKLINK.htmlU1/PyHH_FTS_QUERY.html)/PyHH_POPUP.html/S/PyHH_WINTYPE.htmlw/PyHHN_NOTIFY.htmlyt/PyHHNTRACK.htmlm/PyHINTERNET.htmlt} /PyHKEY.htmlqL/PyHTHEME.html=A/PyHWINSTA.html~u(/PyHWINSTA__CloseWindowStation_meth.html"/PyHWINSTA__EnumDesktops_meth.html!D-/PyHWINSTA__SetProcessWindowStation_meth.htmle\/PyIActiveDesktop.htmlsB+/PyIActiveDesktop__AddDesktopItem_meth.htmlA1/PyIActiveDesktop__AddDesktopItemWithUI_meth.htmlS#/PyIActiveDesktop__AddUrl_meth.htmldQ)/PyIActiveDesktop__ApplyChanges_meth.html5T4/PyIActiveDesktop__GenerateDesktopItemHtml_meth.html ;+/PyIActiveDesktop__GetDesktopItem_meth.htmlD //PyIActiveDesktop__GetDesktopItemByID_meth.htmlPa3/PyIActiveDesktop__GetDesktopItemBySource_meth.html1&0/PyIActiveDesktop__GetDesktopItemCount_meth.htmlWW2/PyIActiveDesktop__GetDesktopItemOptions_meth.html.B'/PyIActiveDesktop__GetPattern_meth.htmlpp)/PyIActiveDesktop__GetWallpaper_meth.html`@0/PyIActiveDesktop__GetWallpaperOptions_meth.html s./PyIActiveDesktop__ModifyDesktopItem_meth.html./PyIActiveDesktop__RemoveDesktopItem_meth.html2;2/PyIActiveDesktop__SetDesktopItemOptions_meth.htmlm'/PyIActiveDesktop__SetPattern_meth.html )/PyIActiveDesktop__SetWallpaper_meth.html&0/PyIActiveDesktop__SetWallpaperOptions_meth.htmlE/PyIActiveDesktopP.html5)/PyIActiveDesktopP__SetSafeMode_meth.html[/PyIActiveScriptDebug.htmlEy;/PyIActiveScriptDebug__EnumCodeContextsOfPosition_meth.htmly.;/PyIActiveScriptDebug__GetScriptletTextAttributes_meth.html'8/PyIActiveScriptDebug__GetScriptTextAttributes_meth.html9D/PyIActiveScriptError.html>.1/PyIActiveScriptError__GetExceptionInfo_meth.html}R2/PyIActiveScriptError__GetSourceLineText_meth.htmlOV2/PyIActiveScriptError__GetSourcePosition_meth.html%V/PyIActiveScriptErrorDebug.htmll28/PyIActiveScriptErrorDebug__GetDocumentContext_meth.html{i3/PyIActiveScriptErrorDebug__GetStackFrame_meth.htmldU#/PyIActiveScriptParseProcedure.html;+/PyIActiveScriptSite__GetItemInfo_meth.html_&'/PyIActiveScriptSite__GetLCID_meth.html-/PyIActiveScriptSite__OnEnterScript_meth.html,-/PyIActiveScriptSite__OnLeaveScript_meth.htmlK,-/PyIActiveScriptSite__OnScriptError_meth.htmlw,1/PyIActiveScriptSite__OnScriptTerminate_meth.html#8-/PyIActiveScriptSite__OnStateChange_meth.html[,/PyIActiveScriptSiteDebug.html 3/PyIActiveScriptSiteDebug__GetApplication_meth.htmlVC/PyIActiveScriptSiteDebug__GetDocumentContextFromPosition_meth.html]J;/PyIActiveScriptSiteDebug__GetRootApplicationNode_meth.html'v7/PyIActiveScriptSiteDebug__OnScriptErrorDebug_meth.htmlz/PyIAddrBook.html,'/PyIAddrBook__CompareEntryIDs_meth.htmlI!/PyIAddrBook__OpenEntry_meth.html`F#/PyIAddrBook__ResolveName_meth.html&[meth.htmlb_j ]HD = 2 < # 2.OY(WPMGLJ/PyIADesktopP2.html117/PyIADesktopP2__UpdateAllDesktopSubscriptions_meth.htmlp /PyIADs.htmlb6/PyIADs__Get_meth.htmlq /PyIADs__GetInfo_meth.html/PyIADs__Put_meth.html=/PyIADs__SetInfo_meth.htmlR/PyIADsContainer.html_%/PyIADsContainer__get_Count_meth.htmlV&/PyIADsContainer__get_Filter_meth.htmlj%/PyIADsContainer__get_Hints_meth.html%/PyIADsContainer__GetObject_meth.htmlE&/PyIADsContainer__put_Filter_meth.html`V%/PyIADsContainer__put_Hints_meth.html6S/PyIADsUser.htmlwr%/PyIADsUser__ChangePassword_meth.html */PyIADsUser__get_AccountDisabled_meth.html#0/PyIADsUser__get_AccountExpirationDate_meth.html>5*/PyIADsUser__get_BadLoginAddress_meth.htmls'(/PyIADsUser__get_BadLoginCount_meth.html%/PyIADsUser__get_Department_meth.html7&/PyIADsUser__get_Description_meth.htmlO#/PyIADsUser__get_Division_meth.htmlj'/PyIADsUser__get_EmailAddress_meth.html|%/PyIADsUser__get_EmployeeID_meth.html$/PyIADsUser__get_FirstName_meth.html2#/PyIADsUser__get_FullName_meth.htmlG(/PyIADsUser__get_HomeDirectory_meth.htmlY!#/PyIADsUser__get_HomePage_meth.htmlz&/PyIADsUser__get_LoginScript_meth.html */PyIADsUser__put_AccountDisabled_meth.html'_0/PyIADsUser__put_AccountExpirationDate_meth.html%/PyIADsUser__put_Department_meth.htmlT&/PyIADsUser__put_Description_meth.htmlhW#/PyIADsUser__put_Division_meth.html?N'/PyIADsUser__put_EmailAddress_meth.html Z%/PyIADsUser__put_EmployeeID_meth.htmlgT$/PyIADsUser__put_FirstName_meth.html;Q#/PyIADsUser__put_FullName_meth.html N(/PyIADsUser__put_HomeDirectory_meth.htmlZ]#/PyIADsUser__put_HomePage_meth.html7N&/PyIADsUser__put_LoginScript_meth.htmlW"/PyIADsUser__SetPassword_meth.html\K/PyIApplicationDebugger.htmlie;/PyIApplicationDebugger__CreateInstanceAtDebugger_meth.html' */PyIApplicationDebugger__onClose_meth.html42/PyIApplicationDebugger__onDebuggerEvent_meth.html5!0/PyIApplicationDebugger__onDebugOutput_meth.htmlVf5/PyIApplicationDebugger__onHandleBreakPoint_meth.htmlh*/PyIAsyncOperation__EndOperation_meth.html_k*/PyIAsyncOperation__GetAsyncMode_meth.htmlJ@)/PyIAsyncOperation__InOperation_meth.html 5*/PyIAsyncOperation__SetAsyncMode_meth.html?#,/PyIAsyncOperation__StartOperation_meth.htmlbS/PyIAttach.html&9"/PyIAttach__GetLastError_meth.html5/PyIBindCtx.html_/&/PyIBindCtx__EnumObjectParam_meth.htmlTu%/PyIBindCtx__GetBindOptions_meth.htmlIj%/PyIBindCtx__GetObjectParam_meth.html3~,/PyIBindCtx__GetRunningObjectTable_meth.html1$*/PyIBindCtx__RegisterObjectParam_meth.htmlUw(/PyIBindCtx__RevokeObjectParam_meth.htmlL[%/PyIBindCtx__SetBindOptions_meth.html'T/PyIBrowserFrameOptions.html2/PyIBrowserFrameOptions__GetFrameOptions_meth.html{2/PyICancelMethodCalls.html+r'/PyICancelMethodCalls__Cancel_meth.html- +/PyICancelMethodCalls__TestCancel_meth.html8+/PyICategoryProvider.html;3/PyICategoryProvider__CanCategorizeOnSCID_meth.htmlcH./PyICategoryProvider__CreateCategory_meth.html+./PyICategoryProvider__EnumCategories_meth.htmlEG2/PyICategoryProvider__GetCategoryForSCID_meth.html D//PyICategoryProvider__GetCategoryName_meth.htmlP2/PyICategoryProvider__GetDefaultCategory_meth.htmlOW/PyICatInformation.htmlXi,/PyICatInformation__EnumCategories_meth.html&~eth.html&[meth.htmlb_j O8X k ,3fWPMGLG5/PyICatInformation__EnumClassesOfCategories_meth.html$-/PyICatInformation__GetCategoryDesc_meth.html?/PyICatRegister.htmlAb-/PyICatRegister__RegisterCategories_meth.htmlF 6/PyICatRegister__RegisterClassImplCategories_meth.htmlQ*5/PyICatRegister__RegisterClassReqCategories_meth.html{$//PyICatRegister__UnregisterCategories_meth.html8/PyICatRegister__UnRegisterClassImplCategories_meth.html%47/PyICatRegister__UnRegisterClassReqCategories_meth.htmlY-/PyIClassFactory.html#+*/PyIClassFactory__CreateInstance_meth.html:&/PyIClassFactory__LockServer_meth.html@/PyIClientSecurity.htmlN2'/PyIClientSecurity__CopyProxy_meth.htmlTt*/PyIClientSecurity__QueryBlanket_meth.htmlHi(/PyIClientSecurity__SetBlanket_meth.html1v/PyIColumnProvider.htmlo+/PyIColumnProvider__GetColumnInfo_meth.html')/PyIColumnProvider__GetItemData_meth.htmlE~(/PyIColumnProvider__Initialize_meth.htmlC /PyICONINFO.htmlo/PyIConnectionPoint.html %/PyIConnectionPoint__Advise_meth.htmlc./PyIConnectionPoint__EnumConnections_meth.htmlt95/PyIConnectionPoint__GetConnectionInterface_meth.html-*:/PyIConnectionPoint__GetConnectionPointContainer_meth.htmlWQ'/PyIConnectionPoint__Unadvise_meth.html( !/PyIConnectionPointContainer.html,%'/PyIContext__EnumContextProps_meth.html$"/PyIContext__GetProperty_meth.html%a%/PyIContext__RemoveProperty_meth.htmlA"/PyIContext__SetProperty_meth.htmlG`/PyIContextMenu.htmlc+/PyIContextMenu__GetCommandString_meth.html'x(/PyIContextMenu__InvokeCommand_meth.htmlu+/PyIContextMenu__QueryContextMenu_meth.htmlH/PyICopyHookA.html{v%/PyICopyHookA__CopyCallback_meth.html\ /PyICopyHookW.htmlqv%/PyICopyHookW__CopyCallback_meth.htmlh /PyICreateTypeInfo.htmlg)/PyICreateTypeInfo__AddFuncDesc_meth.htmlt)/PyICreateTypeInfo__AddImplType_meth.htmlR,/PyICreateTypeInfo__AddRefTypeInfo_meth.htmlVF(/PyICreateTypeInfo__AddVarDesc_meth.html 2/PyICreateTypeInfo__DefineFuncAsDllEntry_meth.html({$/PyICreateTypeInfo__LayOut_meth.html#!*/PyICreateTypeInfo__SetAlignment_meth.htmlD&*/PyICreateTypeInfo__SetDocString_meth.htmlj)2/PyICreateTypeInfo__SetFuncAndParamNames_meth.html0./PyICreateTypeInfo__SetFuncDocString_meth.htmlC 0/PyICreateTypeInfo__SetFuncHelpContext_meth.htmlO %/PyICreateTypeInfo__SetGuid_meth.htmlZ,/PyICreateTypeInfo__SetHelpContext_meth.htmlr4./PyICreateTypeInfo__SetImplTypeFlags_meth.html&%/PyICreateTypeInfo__SetMops_meth.html)_'/PyICreateTypeInfo__SetSchema_meth.html&./PyICreateTypeInfo__SetTypeDescAlias_meth.html.I*/PyICreateTypeInfo__SetTypeFlags_meth.htmlw#-/PyICreateTypeInfo__SetVarDocString_meth.html//PyICreateTypeInfo__SetVarHelpContext_meth.html"(/PyICreateTypeInfo__SetVarName_meth.html)e(/PyICreateTypeInfo__SetVersion_meth.html}/PyICreateTypeLib.html}/PyICreateTypeLib2.html",/PyICreateTypeLib2__CreateTypeInfo_meth.htmle.,/PyICreateTypeLib2__SaveAllChanges_meth.htmlA*/PyICreateTypeLib2__SetDocString_meth.htmlT#%/PyICreateTypeLib2__SetGuid_meth.htmlw,/PyICreateTypeLib2__SetHelpContext_meth.html4-/PyICreateTypeLib2__SetHelpFileName_meth.htmlCJ%/PyICreateTypeLib2__SetLcid_meth.html %)/PyICreateTypeLib2__SetLibFlags_meth.html2%/PyICreateTypeLib2__SetName_meth.htmlN(/PyICreateTypeLib2__SetVersion_meth.html`}+/PyICreateTypeLib__CreateTypeInfo_meth.html ++/PyICreateTypeLib__SaveAllChanges_meth.html6>)/PyICreateTypeLib__SetDocString_meth.htmlt $/PyICreateTypeLib__SetGuid_meth.html+/PyICreateTypeLib__SetHelpContext_meth.html)1,/PyICreateTypeLib__SetHelpFileName_meth.htmlZG.html&[meth.htmlb_j O #  , %aTPMGLD$/PyICreateTypeLib__SetLcid_meth.html!"(/PyICreateTypeLib__SetLibFlags_meth.htmlC$/PyICreateTypeLib__SetName_meth.html\'/PyICreateTypeLib__SetVersion_meth.htmlkz/PyICurrentItem.html5(/PyICustomDestinationList.html]./PyICustomDestinationList__AbortList_meth.html]=1/PyICustomDestinationList__AddUserTasks_meth.htmlJ3/PyICustomDestinationList__AppendCategory_meth.htmld8/PyICustomDestinationList__AppendKnownCategory_meth.htmlsn./PyICustomDestinationList__BeginList_meth.htmla!//PyICustomDestinationList__CommitList_meth.html>//PyICustomDestinationList__DeleteList_meth.html@;/PyICustomDestinationList__GetRemovedDestinations_meth.html?B-/PyICustomDestinationList__SetAppID_meth.html)/PyIDataObject.htmlv!/PyIDataObject__DAdvise_meth.html*#/PyIDataObject__DUnadvise_meth.htmlC0%/PyIDataObject__EnumDAdvise_meth.htmlsf'/PyIDataObject__EnumFormatEtc_meth.htmlYb//PyIDataObject__GetCanonicalFormatEtc_meth.html;!/PyIDataObject__GetData_meth.html=0%/PyIDataObject__GetDataHere_meth.htmlmA&/PyIDataObject__QueryGetData_meth.html.!/PyIDataObject__SetData_meth.htmlF#/PyIDebugApplication.htmlz!B/PyIDebugApplication__AddGlobalExpressionContextProvider_meth.htmli;4/PyIDebugApplication__AddStackFrameSniffer_meth.html$%/PyIDebugApplication__Close_meth.html#35/PyIDebugApplication__CreateApplicationNode_meth.htmlVA9/PyIDebugApplication__CreateAsyncDebugOperation_meth.htmlM+/PyIDebugApplication__DebugOutput_meth.htmld#,/PyIDebugApplication__FCanJitDebug_meth.html?1/PyIDebugApplication__FireDebuggerEvent_meth.htmlF16/PyIDebugApplication__FIsAutoJitDebugEnabled_meth.htmlwg-/PyIDebugApplication__GetBreakFlags_meth.html^`0/PyIDebugApplication__GetCurrentThread_meth.html>O0/PyIDebugApplication__HandleBreakPoint_meth.html 2/PyIDebugApplication__HandleRuntimeError_meth.htmlB/PyIDebugApplication__QueryCurrentThreadIsDebuggerThread_meth.html1+E/PyIDebugApplication__RemoveGlobalExpressionContextProvider_meth.html\ 7/PyIDebugApplication__RemoveStackFrameSniffer_meth.htmlgF'/PyIDebugApplication__SetName_meth.html-11/PyIDebugApplication__StartDebugSession_meth.html^//PyIDebugApplication__StepOutComplete_meth.htmlbg?/PyIDebugApplication__SynchronousCallInDebuggerThread_meth.htmlI;/PyIDebugApplicationNode.html*/PyIDebugApplicationNode__Attach_meth.htmlq)/PyIDebugApplicationNode__Close_meth.htmlu/*/PyIDebugApplicationNode__Detach_meth.html$;0/PyIDebugApplicationNode__EnumChildren_meth.html_K-/PyIDebugApplicationNode__GetParent_meth.html*7/PyIDebugApplicationNode__SetDocumentProvider_meth.html-#/PyIDebugApplicationNodeEvents.html!4/PyIDebugApplicationNodeEvents__onAddChild_meth.html-~2/PyIDebugApplicationNodeEvents__onAttach_meth.html+y2/PyIDebugApplicationNodeEvents__onDetach_meth.html$M7/PyIDebugApplicationNodeEvents__onRemoveChild_meth.htmlq /PyIDebugApplicationThread.html;:/PyIDebugApplicationThread__QueryIsCurrentThread_meth.html{q;/PyIDebugApplicationThread__QueryIsDebuggerThread_meth.htmllu4/PyIDebugApplicationThread__SetDescription_meth.htmlaY4/PyIDebugApplicationThread__SetStateString_meth.html:Y?/PyIDebugApplicationThread__SynchronousCallIntoThread_meth.htmlj/PyIDebugCodeContext.htmlZ2/PyIDebugCodeContext__GetDocumentContext_meth.html}W-/PyIDebugCodeContext__SetBreakPoint_meth.htmlT/PyIDebugDocument.htmltD/PyIDebugDocumentContext.html84/PyIDebugDocumentContext__EnumCodeContexts_meth.htmll[//PyIDebugDocumentContext__GetDocument_meth.htmlGG/PyIDebugDocumentHelper.htmlV ./PyIDebugDocumentHelper__AddDBCSText_meth.htmlD2/PyIDebugDocumentHelper__AddDeferredText_meth.htmlR1/PyIDebugDocumentHelper__AddUnicodeText_meth.htmlo@)/PyIDebugDocumentHelper__Attach_meth.html/uml&[meth.htmlb_j Ows b F 3 2 LPMGL3,/PyIDebugDocumentHost__GetPathName_meth.htmlh>8/PyIDebugDocumentHost__GetScriptTextAttributes_meth.html&./PyIDebugDocumentHost__NotifyChanged_meth.htmlBF8/PyIDebugDocumentHost__OnCreateDocumentContext_meth.htmln/PyIDebugDocumentInfo.html3[3/PyIDebugDocumentInfo__GetDocumentClassId_meth.htmlv(/PyIDebugDocumentInfo__GetName_meth.html|C/PyIDebugDocumentProvider.html+0/PyIDebugDocumentProvider__GetDocument_meth.html?./PyIDebugDocumentText.html9 5/PyIDebugDocumentText__GetContextOfPosition_meth.htmlm76/PyIDebugDocumentText__GetDocumentAttributes_meth.html$f2/PyIDebugDocumentText__GetLineOfPosition_meth.html X5/PyIDebugDocumentText__GetPositionOfContext_meth.htmlbv2/PyIDebugDocumentText__GetPositionOfLine_meth.htmlXC(/PyIDebugDocumentText__GetSize_meth.html.(/PyIDebugDocumentText__GetText_meth.htmlI= /PyIDebugDocumentTextAuthor.htmlF1/PyIDebugDocumentTextAuthor__InsertText_meth.html 1/PyIDebugDocumentTextAuthor__RemoveText_meth.html*2/PyIDebugDocumentTextAuthor__ReplaceText_meth.html< /PyIDebugDocumentTextEvents.htmlYg0/PyIDebugDocumentTextEvents__onDestroy_meth.htmlOH3/PyIDebugDocumentTextEvents__onInsertText_meth.html23/PyIDebugDocumentTextEvents__onRemoveText_meth.htmlI24/PyIDebugDocumentTextEvents__onReplaceText_meth.html{9A/PyIDebugDocumentTextEvents__onUpdateDocumentAttributes_meth.html4y=/PyIDebugDocumentTextEvents__onUpdateTextAttributes_meth.html-Z(/PyIDebugDocumentTextExternalAuthor.html@G:/PyIDebugDocumentTextExternalAuthor__GetFileName_meth.htmlh:/PyIDebugDocumentTextExternalAuthor__GetPathName_meth.htmloh(/PyIDirectSoundBuffer__GetCaps_meth.html>j3/PyIDirectSoundBuffer__GetCurrentPosition_meth.html(Z*/PyIDirectSoundBuffer__GetFormat_meth.html6-/PyIDirectSoundBuffer__GetFrequency_meth.html8B'/PyIDirectSoundBuffer__GetPan_meth.htmlz**/PyIDirectSoundBuffer__GetStatus_meth.html$N*/PyIDirectSoundBuffer__GetVolume_meth.htmlr6+/PyIDirectSoundBuffer__Initialize_meth.html(:%/PyIDirectSoundBuffer__Play_meth.htmlb"(/PyIDirectSoundBuffer__Restore_meth.html}3/PyIDirectSoundBuffer__SetCurrentPosition_meth.htmlZ*/PyIDirectSoundBuffer__SetFormat_meth.html[s-/PyIDirectSoundBuffer__SetFrequency_meth.htmlNB'/PyIDirectSoundBuffer__SetPan_meth.html**/PyIDirectSoundBuffer__SetVolume_meth.html:6%/PyIDirectSoundBuffer__Stop_meth.htmlp"'/PyIDirectSoundBuffer__Update_meth.html*/PyIDirectSoundCapture.htmlH5/PyIDirectSoundCapture__CreateCaptureBuffer_meth.html<)/PyIDirectSoundCapture__GetCaps_meth.html>M,/PyIDirectSoundCapture__Initialize_meth.html f!/PyIDirectSoundCaptureBuffer.html_>//PyIDirectSoundCaptureBuffer__GetCaps_meth.htmlqg:/PyIDirectSoundCaptureBuffer__GetCurrentPosition_meth.htmlX?1/PyIDirectSoundCaptureBuffer__GetFormat_meth.html1/PyIDirectSoundCaptureBuffer__GetStatus_meth.htmlk2/PyIDirectSoundCaptureBuffer__Initialize_meth.html -/PyIDirectSoundCaptureBuffer__Start_meth.html z,/PyIDirectSoundCaptureBuffer__Stop_meth.htmlo./PyIDirectSoundCaptureBuffer__Update_meth.htmlt^/PyIDirectSoundNotify.html9/PyIDirectSoundNotify__SetNotificationPositions_meth.htmlRa/PyIDispatch.html4z%/PyIDispatch__GetIDsOfNames_meth.html3o#/PyIDispatch__GetTypeInfo_meth.html"j(/PyIDispatch__GetTypeInfoCount_meth.html u/PyIDispatch__Invoke_meth.html#/PyIDispatch__InvokeTypes_meth.htmly/PyIDispatchEx.html../PyIDispatchEx__DeleteMemberByDispID_meth.html q,/PyIDispatchEx__DeleteMemberByName_meth.html|k#/PyIDispatchEx__GetDispID_meth.htmlgU&lb_j O $ QPMGL/'/PyIDispatchEx__GetMemberName_meth.html<-/PyIDispatchEx__GetMemberProperties_meth.htmlW'/PyIDispatchEx__GetNextDispID_meth.htmllG"/PyIDispatchEx__InvokeEx_meth.html3p/PyIDisplayItem.htmlD( /PyIDL.htmll./PyIDocHostUIHandler.htmls./PyIDocHostUIHandler__EnableModeless_meth.html#(0/PyIDocHostUIHandler__FilterDataObject_meth.htmlKO-/PyIDocHostUIHandler__GetDropTarget_meth.html[+/PyIDocHostUIHandler__GetExternal_meth.htmlu;+/PyIDocHostUIHandler__GetHostInfo_meth.html0;0/PyIDocHostUIHandler__GetOptionKeyPath_meth.htmlk!&/PyIDocHostUIHandler__HideUI_meth.html '3/PyIDocHostUIHandler__OnDocWindowActivate_meth.html3B5/PyIDocHostUIHandler__OnFrameWindowActivate_meth.htmluJ,/PyIDocHostUIHandler__ResizeBorder_meth.html?//PyIDocHostUIHandler__ShowContextMenu_meth.html]s&/PyIDocHostUIHandler__ShowUI_meth.htmlP84/PyIDocHostUIHandler__TranslateAccelerator_meth.html ,/PyIDocHostUIHandler__TranslateUrl_meth.html (/PyIDocHostUIHandler__UpdateUI_meth.html //PyIDropSource.html |&/PyIDropSource__GiveFeedback_meth.htmlO+/PyIDropSource__QueryContinueDrag_meth.html`/PyIDropTarget.html 9#/PyIDropTarget__DragEnter_meth.htmlpO#/PyIDropTarget__DragLeave_meth.html?>"/PyIDropTarget__DragOver_meth.html};/PyIDropTarget__Drop_meth.html8 /PyIDropTargetHelper.htmlBC)/PyIDropTargetHelper__DragEnter_meth.htmlCy)/PyIDropTargetHelper__DragLeave_meth.html<3(/PyIDropTargetHelper__DragOver_meth.htmlo $/PyIDropTargetHelper__Drop_meth.htmlzC/PyIDsObjectPicker.htmll(/PyIDsObjectPicker__Initialize_meth.html==*/PyIDsObjectPicker__InvokeDialog_meth.htmlz^/PyIEmptyVolumeCache.htmlqC/PyIEmptyVolumeCache2.html42-/PyIEmptyVolumeCache2__InitializeEx_meth.htmll&*/PyIEmptyVolumeCache__Deactivate_meth.htmlX,/PyIEmptyVolumeCache__GetSpaceUsed_meth.htmlu#*/PyIEmptyVolumeCache__Initialize_meth.html%/PyIEmptyVolumeCache__Purge_meth.html5./PyIEmptyVolumeCache__ShowProperties_meth.htmlC)!/PyIEmptyVolumeCacheCallBack.htmlf?5/PyIEmptyVolumeCacheCallBack__PurgeProgress_meth.htmlH4/PyIEmptyVolumeCacheCallBack__ScanProgress_meth.htmlZr/PyIEnumCATEGORYINFO.html%%/PyIEnumCATEGORYINFO__Clone_meth.htmlL%$/PyIEnumCATEGORYINFO__Next_meth.htmlqw%/PyIEnumCATEGORYINFO__Reset_meth.htmlh?$/PyIEnumCATEGORYINFO__Skip_meth.html'/PyIEnumConnectionPoints.html,#)/PyIEnumConnectionPoints__Clone_meth.htmlC9(/PyIEnumConnectionPoints__Next_meth.html|)/PyIEnumConnectionPoints__Reset_meth.htmlK(/PyIEnumConnectionPoints__Skip_meth.htmlJ?/PyIEnumConnections.htmlO$/PyIEnumConnections__Clone_meth.html #/PyIEnumConnections__Next_meth.html)7$/PyIEnumConnections__Reset_meth.html`<#/PyIEnumConnections__Skip_meth.html0/PyIEnumContextProps.htmlOR%/PyIEnumContextProps__Clone_meth.htmlL%$/PyIEnumContextProps__Next_meth.htmlqv%/PyIEnumContextProps__Reset_meth.htmlg?$/PyIEnumContextProps__Skip_meth.html&3"/PyIEnumDebugApplicationNodes.html! ./PyIEnumDebugApplicationNodes__Clone_meth.htmlYR-/PyIEnumDebugApplicationNodes__Next_meth.html+U./PyIEnumDebugApplicationNodes__Reset_meth.htmlZ-/PyIEnumDebugApplicationNodes__Skip_meth.htmlZN/PyIEnumDebugCodeContexts.html.q*/PyIEnumDebugCodeContexts__Clone_meth.html(>)/PyIEnumDebugCodeContexts__Next_meth.htmlfI*/PyIEnumDebugCodeContexts__Reset_meth.html/N)/PyIEnumDebugCodeContexts__Skip_meth.html}B$/PyIEnumDebugExpressionContexts.html0/PyIEnumDebugExpressionContexts__Clone_meth.html?\//PyIEnumDebugExpressionContexts__Next_meth.html_0/PyIEnumDebugExpressionContexts__Reset_meth.htmlz`//PyIEnumDebugExpressionContexts__Skip_meth.htmlZT/PyIEnumDebugPropertyInfo.html:h*/PyIEnumDebugPropertyInfo__Clone_meth.html.>-/PyIEnumDebugPropertyInfo__GetCount_meth.htmllGb_j VR` d  IjWPMGL+)/PyIEnumDebugPropertyInfo__Next_meth.html3I*/PyIEnumDebugPropertyInfo__Reset_meth.html|N)/PyIEnumDebugPropertyInfo__Skip_meth.htmlJB/PyIEnumDebugStackFrames.html"j)/PyIEnumDebugStackFrames__Clone_meth.html 9(/PyIEnumDebugStackFrames__Next_meth.htmlEF)/PyIEnumDebugStackFrames__Reset_meth.html K(/PyIEnumDebugStackFrames__Skip_meth.htmlV?/PyIEnumExplorerCommand.html c(/PyIEnumExplorerCommand__Clone_meth.html4'/PyIEnumExplorerCommand__Next_meth.htmlIC(/PyIEnumExplorerCommand__Reset_meth.html H'/PyIEnumExplorerCommand__Skip_meth.htmlT</PyIEnumFORMATETC.htmlo9"/PyIEnumFORMATETC__Clone_meth.html!/PyIEnumFORMATETC__Next_meth.html&1"/PyIEnumFORMATETC__Reset_meth.htmlW6!/PyIEnumFORMATETC__Skip_meth.html */PyIEnumGUID.html(O/PyIEnumGUID__Clone_meth.html7}/PyIEnumGUID__Next_meth.html4?/PyIEnumGUID__Reset_meth.htmls'/PyIEnumGUID__Skip_meth.html/PyIEnumIDList.htmlw$/PyIEnumIDList__Clone_meth.html/PyIEnumIDList__Next_meth.html%(/PyIEnumIDList__Reset_meth.htmlM-/PyIEnumIDList__Skip_meth.htmlz!/PyIEnumMoniker.htmld /PyIEnumMoniker__Clone_meth.html /PyIEnumMoniker__Next_meth.html'K /PyIEnumMoniker__Reset_meth.htmlr0/PyIEnumMoniker__Skip_meth.html" /PyIEnumObjects.html: /PyIEnumObjects__Clone_meth.html/ /PyIEnumObjects__Next_meth.html;K /PyIEnumObjects__Reset_meth.html0/PyIEnumObjects__Skip_meth.html6$$/PyIEnumRemoteDebugApplications.html90/PyIEnumRemoteDebugApplications__Clone_meth.htmlZ\//PyIEnumRemoteDebugApplications__Next_meth.html6_0/PyIEnumRemoteDebugApplications__Reset_meth.html`//PyIEnumRemoteDebugApplications__Skip_meth.htmluT*/PyIEnumRemoteDebugApplicationThreads.htmlTE6/PyIEnumRemoteDebugApplicationThreads__Clone_meth.htmlIz5/PyIEnumRemoteDebugApplicationThreads__Next_meth.htmlCq6/PyIEnumRemoteDebugApplicationThreads__Reset_meth.html4r5/PyIEnumRemoteDebugApplicationThreads__Skip_meth.html&f/PyIEnumResources.html9"/PyIEnumResources__Clone_meth.html !/PyIEnumResources__Next_meth.html"1"/PyIEnumResources__Reset_meth.htmlS6!/PyIEnumResources__Skip_meth.html */PyIEnumShellItems.htmlR@#/PyIEnumShellItems__Clone_meth.html3"/PyIEnumShellItems__Next_meth.htmlNd#/PyIEnumShellItems__Reset_meth.html29"/PyIEnumShellItems__Skip_meth.htmlk-/PyIEnumSTATPROPSETSTG.html\'/PyIEnumSTATPROPSETSTG__Clone_meth.html/&/PyIEnumSTATPROPSETSTG__Next_meth.htmlG@'/PyIEnumSTATPROPSETSTG__Reset_meth.htmlE&/PyIEnumSTATPROPSETSTG__Skip_meth.htmlL9/PyIEnumSTATPROPSTG.htmlnG$/PyIEnumSTATPROPSTG__Clone_meth.html #/PyIEnumSTATPROPSTG__Next_meth.html%7$/PyIEnumSTATPROPSTG__Reset_meth.html\<#/PyIEnumSTATPROPSTG__Skip_meth.html0/PyIEnumSTATSTG.html5 /PyIEnumSTATSTG__Clone_meth.htmlH /PyIEnumSTATSTG__Next_meth.htmlTN /PyIEnumSTATSTG__Reset_meth.html"0/PyIEnumSTATSTG__Skip_meth.htmlR$/PyIEnumString.htmlPg/PyIEnumString__Clone_meth.htmlv/PyIEnumString__Next_meth.html}N/PyIEnumString__Reset_meth.htmlK-/PyIEnumString__Skip_meth.htmlx!/PyIErrorLog.html7 /PyIErrorLog__AddError_meth.htmlI/PyIExplorerBrowser.html?|%/PyIExplorerBrowser__Advise_meth.htmlbC-/PyIExplorerBrowser__BrowseToIDList_meth.html%-/PyIExplorerBrowser__BrowseToObject_meth.html' &/PyIExplorerBrowser__Destroy_meth.html2(-/PyIExplorerBrowser__FillFromObject_meth.htmlZ3-/PyIExplorerBrowser__GetCurrentView_meth.html b)/PyIExplorerBrowser__GetOptions_meth.htmlo:)/PyIExplorerBrowser__Initialize_meth.html)V(/PyIExplorerBrowser__RemoveAll_meth.html0+/PyIExplorerBrowser__SetEmptyText_meth.html/&0/PyIExplorerBrowser__SetFolderSettings_meth.htmlU=)/PyIExplorerBrowser__SetOptions_meth.html4-/PyIExplorerBrowser__SetPropertyBag_meth.htmlF4_  [  5 ooY_^PMGL=&/PyIExplorerBrowser__SetRect_meth.htmlz*'/PyIExplorerBrowser__Unadvise_meth.html$/PyIExplorerBrowserEvents.html;Y9/PyIExplorerBrowserEvents__OnNavigationComplete_meth.html4s7/PyIExplorerBrowserEvents__OnNavigationFailed_meth.html'k8/PyIExplorerBrowserEvents__OnNavigationPending_meth.htmlo2/PyIExplorerBrowserEvents__OnViewCreated_meth.htmlP/PyIExplorerCommand.html!./PyIExplorerCommand__EnumSubCommands_meth.htmlQ //PyIExplorerCommand__GetCanonicalName_meth.html\m'/PyIExplorerCommand__GetFlags_meth.htmlI2&/PyIExplorerCommand__GetIcon_meth.html{U'/PyIExplorerCommand__GetState_meth.htmlP2'/PyIExplorerCommand__GetTitle_meth.htmlY)/PyIExplorerCommand__GetToolTip_meth.html[a%/PyIExplorerCommand__Invoke_meth.html<- /PyIExplorerCommandProvider.html5/PyIExplorerPaneVisibility.html92/PyIExplorerPaneVisibility__GetPaneState_meth.htmli%/PyIExternalConnection.htmlG[//PyIExternalConnection__AddConnection_meth.html~3/PyIExternalConnection__ReleaseConnection_meth.html p/PyIExtractIcon.html"k"/PyIExtractIcon__Extract_meth.html|x*/PyIExtractIcon__GetIconLocation_meth.htmlt /PyIExtractIconW.html o#/PyIExtractIconW__Extract_meth.html~{+/PyIExtractIconW__GetIconLocation_meth.htmly /PyIExtractImage.html|c#/PyIExtractImage__Extract_meth.html'/PyIExtractImage__GetLocation_meth.html%/PyIFileOperation.html_M#/PyIFileOperation__Advise_meth.html;2/PyIFileOperation__ApplyPropertiesToItem_meth.htmlC 3/PyIFileOperation__ApplyPropertiesToItems_meth.htmlL%/PyIFileOperation__CopyItem_meth.htmlkp&/PyIFileOperation__CopyItems_meth.html[ '/PyIFileOperation__DeleteItem_meth.htmldk(/PyIFileOperation__DeleteItems_meth.htmlO~4/PyIFileOperation__GetAnyOperationsAborted_meth.htmlMq%/PyIFileOperation__MoveItem_meth.html>&/PyIFileOperation__MoveItems_meth.htmlR$/PyIFileOperation__NewItem_meth.htmlb2./PyIFileOperation__PerformOperations_meth.htmlY'/PyIFileOperation__RenameItem_meth.htmlm((/PyIFileOperation__RenameItems_meth.htmlm./PyIFileOperation__SetOperationFlags_meth.htmlR+/PyIFileOperation__SetOwnerWindow_meth.htmlTJ./PyIFileOperation__SetProgressDialog_meth.html*//PyIFileOperation__SetProgressMessage_meth.htmlH*/PyIFileOperation__SetProperties_meth.htmle1%/PyIFileOperation__Unadvise_meth.htmll /PyIID.html,$/PyIID____hash___meth.html(/PyIID____repr___meth.html*v/PyIID____str___meth.html 0/PyIIdentityName.htmlP*/PyIInitializeWithFile.htmlzU,/PyIInitializeWithFile__Initialize_meth.htmlPN/PyIInitializeWithStream.htmlOX./PyIInitializeWithStream__Initialize_meth.htmlk/PyIInputObject.html'o%/PyIInputObject__HasFocusIO_meth.html %//PyIInputObject__TranslateAccelerator_meth.html.*%/PyIInputObject__UIActivate_meth.htmlX/PyIInternetBindInfo.html+/PyIInternetBindInfo__GetBindInfo_meth.html^;-/PyIInternetBindInfo__GetBindString_meth.htmlC/PyIInternetPriority.html+/PyIInternetPriority__GetPriority_meth.html\;+/PyIInternetPriority__SetPriority_meth.html"/PyIInternetProtocol.htmlI+/PyIInternetProtocol__LockRequest_meth.html9"$/PyIInternetProtocol__Read_meth.html[q$/PyIInternetProtocol__Seek_meth.htmlL~-/PyIInternetProtocol__UnlockRequest_meth.htmlJC/PyIInternetProtocolInfo.htmlcp./PyIInternetProtocolInfo__CombineUrl_meth.html 8./PyIInternetProtocolInfo__CompareUrl_meth.htmlEq,/PyIInternetProtocolInfo__ParseUrl_meth.html6-/PyIInternetProtocolInfo__QueryInfo_meth.html</PyIInternetProtocolRoot.htmlS-)/PyIInternetProtocolRoot__Abort_meth.htmlZf,/PyIInternetProtocolRoot__Continue_meth.html@;*/PyIInternetProtocolRoot__Resume_meth.html{3)/PyIInternetProtocolRoot__Start_meth.html.^+/PyIInternetProtocolRoot__Suspend_meth.html 7g_meth.htmlF4_KZ`  Q K_i| WPMGLH -/PyIInternetProtocolRoot__Terminate_meth.htmlC&/PyIInternetProtocolSink.html./PyIInternetProtocolSink__ReportData_meth.htmliY2/PyIInternetProtocolSink__ReportProgress_meth.htmlB.0/PyIInternetProtocolSink__ReportResult_meth.htmlp[*/PyIInternetProtocolSink__Switch_meth.htmlK3 /PyIInternetSecurityManager.html%4/PyIInternetSecurityManager__GetSecurityId_meth.html~'6/PyIInternetSecurityManager__GetSecuritySite_meth.html%`6/PyIInternetSecurityManager__GetZoneMappings_meth.html 3/PyIInternetSecurityManager__MapUrlToZone_meth.html7/PyIInternetSecurityManager__ProcessUrlAction_meth.html!)6/PyIInternetSecurityManager__SetSecuritySite_meth.htmlJ]5/PyIInternetSecurityManager__SetZoneMapping_meth.html'o/PyIKnownFolder.html$'&/PyIKnownFolder__GetCategory_meth.htmlQ./PyIKnownFolder__GetFolderDefinition_meth.htmlgF(/PyIKnownFolder__GetFolderType_meth.html-' /PyIKnownFolder__GetId_meth.htmlT<$/PyIKnownFolder__GetIDList_meth.htmlv"/PyIKnownFolder__GetPath_meth.htmlA5/PyIKnownFolder__GetRedirectionCapabilities_meth.htmlGX'/PyIKnownFolder__GetShellItem_meth.htmlt"/PyIKnownFolder__SetPath_meth.htmlQ/PyIKnownFolderManager.htmlK&6/PyIKnownFolderManager__FindFolderFromIDList_meth.htmld!4/PyIKnownFolderManager__FindFolderFromPath_meth.html@3/PyIKnownFolderManager__FolderIdFromCsidl_meth.htmlEu1/PyIKnownFolderManager__FolderIdToCsidl_meth.html:e+/PyIKnownFolderManager__GetFolder_meth.htmlm1/PyIKnownFolderManager__GetFolderByName_meth.html r./PyIKnownFolderManager__GetFolderIds_meth.html~o*/PyIKnownFolderManager__Redirect_meth.htmlm70/PyIKnownFolderManager__RegisterFolder_meth.html$y2/PyIKnownFolderManager__UnregisterFolder_meth.htmla/PyILockBytes.htmlq/PyILockBytes__Flush_meth.html~j#/PyILockBytes__LockRegion_meth.htmlh[/PyILockBytes__ReadAt_meth.htmlC /PyILockBytes__SetSize_meth.html_/PyILockBytes__Stat_meth.html{w%/PyILockBytes__UnlockRegion_meth.htmlr> /PyILockBytes__WriteAt_meth.html0/PyIMachineDebugManager.htmlr/1/PyIMachineDebugManager__AddApplication_meth.htmlEh3/PyIMachineDebugManager__EnumApplications_meth.html-X4/PyIMachineDebugManager__RemoveApplication_meth.htmlI"/PyIMachineDebugManagerEvents.html!J9/PyIMachineDebugManagerEvents__onAddApplication_meth.htmlN[&/PyIMAPIFolder__CopyMessages_meth.htmlS&/PyIMAPIFolder__CreateFolder_meth.htmlW]'/PyIMAPIFolder__CreateMessage_meth.html4(&/PyIMAPIFolder__DeleteFolder_meth.html\o(/PyIMAPIFolder__DeleteMessages_meth.htmlK!%/PyIMAPIFolder__EmptyFolder_meth.htmllm&/PyIMAPIFolder__GetLastError_meth.htmlY+&/PyIMAPIFolder__SetReadFlags_meth.htmlG/PyIMAPIProp.htmllM!/PyIMAPIProp__CopyProps_meth.htmlK*/PyIMAPIProp__CopyTo_meth.htmlu#/PyIMAPIProp__DeleteProps_meth.html9'/PyIMAPIProp__GetIDsFromNames_meth.htmlG$/PyIMAPIProp__GetLastError_meth.htmlO%'/PyIMAPIProp__GetNamesFromIDs_meth.htmlt##/PyIMAPIProp__GetPropList_meth.html! /PyIMAPIProp__GetProps_meth.html8$/PyIMAPIProp__OpenProperty_meth.html7#/PyIMAPIProp__SaveChanges_meth.htmlIv /PyIMAPIProp__SetProps_meth.html?+/PyIMAPISession.html9-(/PyIMAPISession__AdminServices_meth.htmlj!/PyIMAPISession__Advise_meth.html*/PyIMAPISession__CompareEntryIDs_meth.htmlR'/PyIMAPISession__GetLastError_meth.htmlf.,/PyIMAPISession__GetMsgStoresTable_meth.html4)/PyIMAPISession__GetStatusTable_meth.htmlH!/PyIMAPISession__Logoff_meth.htmld6*/PyIMAPISession__OpenAddressBook_meth.html+html 7g_meth.htmlF4_K< a $ %TPMGL5!$/PyIMAPISession__OpenEntry_meth.htmlE'/PyIMAPISession__OpenMsgStore_meth.html[_-/PyIMAPISession__OpenProfileSection_meth.html:a(/PyIMAPISession__QueryIdentity_meth.html~#/PyIMAPISession__Unadvise_meth.html1/PyIMAPIStatus.htmlf[(/PyIMAPIStatus__ChangePassword_meth.htmlJe%/PyIMAPIStatus__FlushQueues_meth.htmlx['/PyIMAPIStatus__FlushQueues_meth_1.html/I(/PyIMAPIStatus__SettingsDialog_meth.htmlS'/PyIMAPIStatus__ValidateState_meth.htmln/PyIMAPITable.htmlA/PyIMAPITable__Abort_meth.html?/PyIMAPITable__Advise_meth.htmlEs'/PyIMAPITable__CreateBookmark_meth.html8= /PyIMAPITable__FindRow_meth.htmlu8%/PyIMAPITable__FreeBookmark_meth.html- %/PyIMAPITable__GetLastError_meth.html6($/PyIMAPITable__GetRowCount_meth.html^"/PyIMAPITable__GetStatus_meth.htmlzv%/PyIMAPITable__QueryColumns_meth.htmlp&/PyIMAPITable__QueryPosition_meth.html7"/PyIMAPITable__QueryRows_meth.html> !/PyIMAPITable__Restrict_meth.htmlJ /PyIMAPITable__SeekRow_meth.htmlb&/PyIMAPITable__SeekRowApprox_meth.html|u#/PyIMAPITable__SetColumns_meth.htmlqO"/PyIMAPITable__SortTable_meth.html@n!/PyIMAPITable__Unadvise_meth.html./PyIMessage.htmlI.#/PyIMessage__CreateAttach_meth.html2#/PyIMessage__DeleteAttach_meth.htmlP )/PyIMessage__GetAttachmentTable_meth.html\p(/PyIMessage__GetRecipientTable_meth.htmlLl'/PyIMessage__ModifyRecipients_meth.html8!/PyIMessage__OpenAttach_meth.htmlM|"/PyIMessage__SetReadFlag_meth.htmlI$/PyIMessage__SubmitMessage_meth.htmlfR/PyIMoniker.htmlwO#/PyIMoniker__BindToObject_meth.html8t$/PyIMoniker__BindToStorage_meth.html,&"/PyIMoniker__ComposeWith_meth.htmlR//PyIMoniker__Enum_meth.html-%/PyIMoniker__GetDisplayName_meth.html./PyIMoniker__Hash_meth.htmlC:/PyIMoniker__IsEqual_meth.html}\&/PyIMoniker__IsSystemMoniker_meth.htmlYk/PyIMsgServiceAdmin.htmlFD-/PyIMsgServiceAdmin__AdminProviders_meth.htmlD42/PyIMsgServiceAdmin__ConfigureMsgService_meth.htmlxO//PyIMsgServiceAdmin__CreateMsgService_meth.htmlG$//PyIMsgServiceAdmin__DeleteMsgService_meth.htmlk=+/PyIMsgServiceAdmin__GetLastError_meth.html(:1/PyIMsgServiceAdmin__GetMsgServiceTable_meth.htmlbE//PyIMsgServiceAdmin__GetProviderTable_meth.html'H1/PyIMsgServiceAdmin__OpenProfileSection_meth.htmlo//PyIMsgServiceAdmin__RenameMsgService_meth.html+/PyIMsgStore.html #/PyIMsgStore__AbortSubmit_meth.html+ /PyIMsgStore__Advise_meth.html6X'/PyIMsgStore__CompareEntryIDs_meth.htmlI$/PyIMsgStore__GetLastError_meth.htmlW%(/PyIMsgStore__GetReceiveFolder_meth.html|5-/PyIMsgStore__GetReceiveFolderTable_meth.html1L!/PyIMsgStore__OpenEntry_meth.html}F /PyIMsgStore__Unadvise_meth.htmlC/PyINamedPropertyStore.htmlR+/PyINamedPropertyStore__GetNameAt_meth.htmlT3./PyINamedPropertyStore__GetNameCount_meth.htmld//PyINamedPropertyStore__GetNamedValue_meth.htmlkW//PyINamedPropertyStore__SetNamedValue_meth.htmlBK/PyINameSpaceTreeControl.htmljv./PyINameSpaceTreeControl__AppendRoot_meth.html `//PyINameSpaceTreeControl__CollapseAll_meth.htmlmG5/PyINameSpaceTreeControl__EnsureItemVisible_meth.html4]6/PyINameSpaceTreeControl__GetItemCustomState_meth.htmla//PyINameSpaceTreeControl__GetItemRect_meth.htmlrG0/PyINameSpaceTreeControl__GetItemState_meth.html9//PyINameSpaceTreeControl__GetNextItem_meth.htmlX0/PyINameSpaceTreeControl__GetRootItems_meth.htmlgK4/PyINameSpaceTreeControl__GetSelectedItems_meth.html2[+/PyINameSpaceTreeControl__HitTest_meth.html ./PyINameSpaceTreeControl__Initialize_meth.htmlZ./PyINameSpaceTreeControl__InsertRoot_meth.htmlx*2/PyINameSpaceTreeControl__RemoveAllRoots_meth.html"S./PyINameSpaceTreeControl__RemoveRoot_meth.htmluM6/PyINameSpaceTreeControl__SetItemCustomState_meth.htmlB=tmlF4_C. ! 8 ^ Mj5_WPMGL@ "0/PyINameSpaceTreeControl__SetItemState_meth.htmlx,/PyINameSpaceTreeControl__SetTheme_meth.htmlw../PyINameSpaceTreeControl__TreeAdvise_meth.html%@0/PyINameSpaceTreeControl__TreeUnadvise_meth.htmle//PyINPUT_RECORD.html`0/PyIObjectArray.html} /PyIObjectArray__GetAt_meth.html&#/PyIObjectArray__GetCount_meth.html:5/PyIObjectCollection.html !,/PyIObjectCollection__AddFromArray_meth.htmlo!)/PyIObjectCollection__AddObject_meth.html;%/PyIObjectCollection__Clear_meth.htmlK$./PyIObjectCollection__RemoveObjectAt_meth.htmlo</PyIObjectWithPropertyKey.html.>3/PyIObjectWithPropertyKey__GetPropertyKey_meth.html+3/PyIObjectWithPropertyKey__SetPropertyKey_meth.html+W/PyIObjectWithSite.htmll_%/PyIObjectWithSite__GetSite_meth.html%/PyIObjectWithSite__SetSite_meth.html/PyIOleClientSite.htmlKa)/PyIOleClientSite__GetContainer_meth.html76'/PyIOleClientSite__GetMoniker_meth.htmlmt)/PyIOleClientSite__OnShowWindow_meth.htmla3/PyIOleClientSite__RequestNewObjectLayout_meth.htmlr^'/PyIOleClientSite__SaveObject_meth.htmlP.'/PyIOleClientSite__ShowObject_meth.html~./PyIOleCommandTarget.html,j$/PyIOleCommandTarget__Exec_meth.html,+/PyIOleCommandTarget__QueryStatus_meth.htmlK;/PyIOleControl.htmlv&/PyIOleControl__FreezeEvents_meth.html(/PyIOleControl__GetControlInfo_meth.html51/PyIOleControl__OnAmbientPropertyChange_meth.htmlI8$/PyIOleControl__OnMnemonic_meth.html/PyIOleControlSite.html /0/PyIOleControlSite__GetExtendedControl_meth.htmlQ//PyIOleControlSite__LockInPlaceActive_meth.htmld(2/PyIOleControlSite__OnControlInfoChanged_meth.html Y%/PyIOleControlSite__OnFocus_meth.htmle //PyIOleControlSite__ShowPropertyFrame_meth.htmlqM-/PyIOleControlSite__TransformCoords_meth.html>y2/PyIOleControlSite__TranslateAccelerator_meth.html7(/PyIOleInPlaceActiveObject.html;k4/PyIOleInPlaceActiveObject__EnableModeless_meth.html_:9/PyIOleInPlaceActiveObject__OnDocWindowActivate_meth.htmlT;/PyIOleInPlaceActiveObject__OnFrameWindowActivate_meth.htmlm\2/PyIOleInPlaceActiveObject__ResizeBorder_meth.htmlI1:/PyIOleInPlaceActiveObject__TranslateAccelerator_meth.htmlzg/PyIOleInPlaceFrame.html&q-/PyIOleInPlaceFrame__EnableModeless_meth.htmla%*/PyIOleInPlaceFrame__InsertMenus_meth.html*/PyIOleInPlaceFrame__RemoveMenus_meth.html%*&/PyIOleInPlaceFrame__SetMenu_meth.htmlO\,/PyIOleInPlaceFrame__SetStatusText_meth.html+B3/PyIOleInPlaceFrame__TranslateAccelerator_meth.htmlm/PyIOleInPlaceObject.html1/PyIOleInPlaceObject__InPlaceDeactivate_meth.htmlS1/PyIOleInPlaceObject__ReactivateAndUndo_meth.htmlSS./PyIOleInPlaceObject__SetObjectRects_meth.html&G,/PyIOleInPlaceObject__UIDeactivate_meth.htmlm?/PyIOleInPlaceSite.html40/PyIOleInPlaceSite__CanInPlaceActivate_meth.html,Q//PyIOleInPlaceSite__DeactivateAndUndo_meth.html}M./PyIOleInPlaceSite__DiscardUndoState_meth.htmlJI./PyIOleInPlaceSite__GetWindowContext_meth.htmlI//PyIOleInPlaceSite__OnInPlaceActivate_meth.html\M1/PyIOleInPlaceSite__OnInPlaceDeactivate_meth.html)U-/PyIOleInPlaceSite__OnPosRectChange_meth.html~E*/PyIOleInPlaceSite__OnUIActivate_meth.htmlC9,/PyIOleInPlaceSite__OnUIDeactivate_meth.html|($/PyIOleInPlaceSite__Scroll_meth.html$!/PyIOleInPlaceSiteEx.htmlK>3/PyIOleInPlaceSiteEx__OnInPlaceActivateEx_meth.htmlE<5/PyIOleInPlaceSiteEx__OnInPlaceDeactivateEx_meth.htmlJ1/PyIOleInPlaceSiteEx__RequestUIActivate_meth.htmlKS!/PyIOleInPlaceSiteWindowless.html !2/PyIOleInPlaceSiteWindowless__AdjustRect_meth.htmlO=/PyIOleInPlaceSiteWindowless__CanWindowlessActivate_meth.htmlm{2/PyIOleInPlaceSiteWindowless__GetCapture_meth.htmlhO-/PyIOleInPlaceSiteWindowless__GetDC_meth.html7`0/PyIOleInPlaceSiteWindowless__GetFocus_meth.htmlGhtmlB=tmlF4_Ct]_ T Z ] \ H5(F|QPMGL?!#6/PyIOleInPlaceSiteWindowless__InvalidateRect_meth.html^~5/PyIOleInPlaceSiteWindowless__InvalidateRgn_meth.html\{:/PyIOleInPlaceSiteWindowless__OnDefWindowMessage_meth.htmlWY1/PyIOleInPlaceSiteWindowless__ReleaseDC_meth.html0 2/PyIOleInPlaceSiteWindowless__ScrollRect_meth.htmlP_2/PyIOleInPlaceSiteWindowless__SetCapture_meth.html/30/PyIOleInPlaceSiteWindowless__SetFocus_meth.htmlb%/PyIOleInPlaceUIWindow.html*+/PyIOleInPlaceUIWindow__GetBorder_meth.html94/PyIOleInPlaceUIWindow__RequestBorderSpace_meth.html@_1/PyIOleInPlaceUIWindow__SetActiveObject_meth.htmll0/PyIOleInPlaceUIWindow__SetBorderSpace_meth.html O/PyIOleObject.htmlG/PyIOleObject__Advise_meth.htmlZ /PyIOleObject__Close_meth.htmle~/PyIOleObject__DoVerb_meth.htmlc?#/PyIOleObject__EnumAdvise_meth.html"""/PyIOleObject__EnumVerbs_meth.htmlD&/PyIOleObject__GetClientSite_meth.htmlb.)/PyIOleObject__GetClipboardData_meth.html$"/PyIOleObject__GetExtent_meth.html4_&/PyIOleObject__GetMiscStatus_meth.html#/PyIOleObject__GetMoniker_meth.html%h'/PyIOleObject__GetUserClassID_meth.html 2$/PyIOleObject__GetUserType_meth.html?%/PyIOleObject__InitFromData_meth.htmlUk#/PyIOleObject__IsUpToDate_meth.html@"&/PyIOleObject__SetClientSite_meth.htmlbL'/PyIOleObject__SetColorScheme_meth.html.2"/PyIOleObject__SetExtent_meth.html`_%/PyIOleObject__SetHostNames_meth.html? #/PyIOleObject__SetMoniker_meth.html_~!/PyIOleObject__Unadvise_meth.html] /PyIOleObject__Update_meth.htmlg/PyIOleWindow.htmlMx-/PyIOleWindow__ContextSensitiveHelp_meth.htmly4"/PyIOleWindow__GetWindow_meth.html-/PyIPersist.htmlEJ!/PyIPersist__GetClassID_meth.htmlKa/PyIPersistFile.htmla%/PyIPersistFile__GetCurFile_meth.html,Q"/PyIPersistFile__IsDirty_meth.html}u/PyIPersistFile__Load_meth.htmlr%/PyIPersistFile__Save_meth.html#(/PyIPersistFile__SaveCompleted_meth.html:c/PyIPersistFolder.htmlp|/PyIPersistFolder2.htmll*/PyIPersistFolder2__GetCurFolder_meth.html>9'/PyIPersistFolder__Initialize_meth.html!/PyIPersistPropertyBag.htmlq,)/PyIPersistPropertyBag__InitNew_meth.htmlwu&/PyIPersistPropertyBag__Load_meth.htmllP&/PyIPersistPropertyBag__Save_meth.html/PyIPersistSerializedPropStorage__GetPropertyStorage_meth.html4/PyIPersistSerializedPropStorage__SetFlags_meth.html<>/PyIPersistSerializedPropStorage__SetPropertyStorage_meth.htmlZ/PyIPersistStorage.htmlL-/PyIPersistStorage__HandsOffStorage_meth.htmla %/PyIPersistStorage__InitNew_meth.htmljq%/PyIPersistStorage__IsDirty_meth.html[P"/PyIPersistStorage__Load_meth.html+>"/PyIPersistStorage__Save_meth.htmlie+/PyIPersistStorage__SaveCompleted_meth.htmlNV/PyIPersistStream.htmlgr'/PyIPersistStream__GetSizeMax_meth.html$k$/PyIPersistStream__IsDirty_meth.htmlM!/PyIPersistStream__Load_meth.html\h!/PyIPersistStream__Save_meth.htmlD-/PyIPersistStreamInit.htmlYd(/PyIPersistStreamInit__InitNew_meth.htmlqA/PyIProcessDebugManager.html=o1/PyIProcessDebugManager__AddApplication_meth.html2\4/PyIProcessDebugManager__CreateApplication_meth.html\\%/PyIProfAdmin__GetLastError_meth.html(&/PyIProfAdmin__RenameProfile_meth.htmlB6*/PyIProfAdmin__SetDefaultProfile_meth.htmlx!/PyIPropertyBag.htmly/PyIPropertyBag__Read_meth.html /PyIPropertyBag__Write_meth.htmlTtmlB=tmlF4_BYi \ "f 40XPMGL$"$/PyIPropertyChange.html{0/PyIPropertyChange__ApplyToPropVariant_meth.htmln/PyIPropertyChangeArray.htmlt)/PyIPropertyChangeArray__Append_meth.htmlX2/PyIPropertyChangeArray__AppendOrReplace_meth.htmlX-(/PyIPropertyChangeArray__GetAt_meth.htmlY+/PyIPropertyChangeArray__GetCount_meth.html^P+/PyIPropertyChangeArray__InsertAt_meth.html.7//PyIPropertyChangeArray__IsKeyInArray_meth.htmlej+/PyIPropertyChangeArray__RemoveAt_meth.htmlO"/PyIPropertyDescription.htmlsH9/PyIPropertyDescription__CoerceToCanonicalValue_meth.htmlqf3/PyIPropertyDescription__FormatForDisplay_meth.htmlWi5/PyIPropertyDescription__GetAggregationType_meth.html@ 3/PyIPropertyDescription__GetCanonicalName_meth.htmlJ^1/PyIPropertyDescription__GetColumnState_meth.html( 3/PyIPropertyDescription__GetConditionType_meth.html1z8/PyIPropertyDescription__GetDefaultColumnWidth_meth.html+t1/PyIPropertyDescription__GetDisplayName_meth.htmld1/PyIPropertyDescription__GetDisplayType_meth.htmlY4/PyIPropertyDescription__GetEditInvitation_meth.html\o2/PyIPropertyDescription__GetEnumTypeList_meth.htmlKT3/PyIPropertyDescription__GetGroupingRange_meth.htmlm1/PyIPropertyDescription__GetPropertyKey_meth.html 2/PyIPropertyDescription__GetPropertyType_meth.htmlj9/PyIPropertyDescription__GetRelativeDescription_meth.htmlW=/PyIPropertyDescription__GetRelativeDescriptionType_meth.html\ 5/PyIPropertyDescription__GetSortDescription_meth.htmlg:/PyIPropertyDescription__GetSortDescriptionLabel_meth.htmlwk//PyIPropertyDescription__GetTypeFlags_meth.htmlbU//PyIPropertyDescription__GetViewFlags_meth.html73/PyIPropertyDescription__IsValueCanonical_meth.html7k%/PyIPropertyDescriptionAliasInfo.html;F/PyIPropertyDescriptionAliasInfo__GetAdditionalSortByAliases_meth.html"x:/PyIPropertyDescriptionAliasInfo__GetSortByAlias_meth.htmlR /PyIPropertyDescriptionList.htmlK6,/PyIPropertyDescriptionList__GetAt_meth.htmllp//PyIPropertyDescriptionList__GetCount_meth.html\[&/PyIPropertyDescriptionSearchInfo.htmlT?/PyIPropertyDescriptionSearchInfo__GetColumnIndexType_meth.html7b7/PyIPropertyDescriptionSearchInfo__GetMaxSize_meth.html~@/PyIPropertyDescriptionSearchInfo__GetProjectionString_meth.html?/PyIPropertyDescriptionSearchInfo__GetSearchInfoFlags_meth.html&l/PyIPropertyEnumType.htmlUk./PyIPropertyEnumType__GetDisplayText_meth.htmlY+/PyIPropertyEnumType__GetEnumType_meth.htmlkr0/PyIPropertyEnumType__GetRangeMinValue_meth.html]0/PyIPropertyEnumType__GetRangeSetValue_meth.htmlo(/PyIPropertyEnumType__GetValue_meth.html}c/PyIPropertyEnumTypeList.html@E5/PyIPropertyEnumTypeList__FindMatchingIndex_meth.html`E)/PyIPropertyEnumTypeList__GetAt_meth.html%Y,/PyIPropertyEnumTypeList__GetCount_meth.html~R/PyIPropertySetStorage.html[(/PyIPropertySetStorage__Create_meth.htmlPt(/PyIPropertySetStorage__Delete_meth.htmlDP&/PyIPropertySetStorage__Enum_meth.html&/PyIPropertySetStorage__Open_meth.html"/PyIPropertyStorage.html`"%/PyIPropertyStorage__Commit_meth.html"3-/PyIPropertyStorage__DeleteMultiple_meth.htmlUx2/PyIPropertyStorage__DeletePropertyNames_meth.htmlM\#/PyIPropertyStorage__Enum_meth.html){+/PyIPropertyStorage__ReadMultiple_meth.html$b0/PyIPropertyStorage__ReadPropertyNames_meth.html%/PyIPropertyStorage__Revert_meth.html6'/PyIPropertyStorage__SetClass_meth.html<,'/PyIPropertyStorage__SetTimes_meth.htmlh#/PyIPropertyStorage__Stat_meth.htmlo,/PyIPropertyStorage__WriteMultiple_meth.html1/PyIPropertyStorage__WritePropertyNames_meth.htmlb/PyIPropertyStore.htmla#/PyIPropertyStore__Commit_meth.htmlg "/PyIPropertyStore__GetAt_meth.htmlK%/PyIPropertyStore__GetCount_meth.htmlRA%/PyIPropertyStore__GetValue_meth.html0%/PyIPropertyStore__SetValue_meth.htmlCpBYn H$MPMGL4#%/PyIPropertyStoreCache.htmlc$*/PyIPropertyStoreCache__GetState_meth.html342/PyIPropertyStoreCache__GetValueAndState_meth.htmlg$*/PyIPropertyStoreCache__SetState_meth.html 2/PyIPropertyStoreCache__SetValueAndState_meth.html!"/PyIPropertyStoreCapabilities.html};/PyIPropertyStoreCapabilities__IsPropertyWritable_meth.html3/PyIPropertySystem.htmlA;/PyIPropertySystem__EnumeratePropertyDescriptions_meth.html8./PyIPropertySystem__FormatForDisplay_meth.htmlHz4/PyIPropertySystem__GetPropertyDescription_meth.htmlBZ:/PyIPropertySystem__GetPropertyDescriptionByName_meth.html9/PyIRemoteDebugApplicationEvents__OnDebugOutput_meth.htmlSN;/PyIRemoteDebugApplicationEvents__OnDestroyThread_meth.html!@/PyIRemoteDebugApplicationEvents__OnDisconnectDebugger_meth.html:=/PyIRemoteDebugApplicationEvents__OnEnterBreakPoint_meth.html=!=/PyIRemoteDebugApplicationEvents__OnLeaveBreakPoint_meth.html^!5/PyIRemoteDebugApplicationEvents__OnSetName_meth.htmlJ%/PyIRemoteDebugApplicationThread.htmlJk;/PyIRemoteDebugApplicationThread__EnumStackFrames_meth.htmlIo:/PyIRemoteDebugApplicationThread__GetApplication_meth.html8k:/PyIRemoteDebugApplicationThread__GetDescription_meth.html#k4/PyIRemoteDebugApplicationThread__GetState_meth.htmlS;/PyIRemoteDebugApplicationThread__GetSuspendCount_meth.htmlao=/PyIRemoteDebugApplicationThread__GetSystemThreadId_meth.htmlPw2/PyIRemoteDebugApplicationThread__Resume_meth.htmlGKd1/PyIScheduledWorkItem__GetTriggerString_meth.html"0/PyIScheduledWorkItem__GetWorkItemData_meth.html2Z$/PyIScheduledWorkItem__Run_meth.html 6/PyIScheduledWorkItem__SetAccountInformation_meth.html"i+/PyIScheduledWorkItem__SetComment_meth.html ++/PyIScheduledWorkItem__SetCreator_meth.html6d3/PyIScheduledWorkItem__SetErrorRetryCount_meth.html6/PyIScheduledWorkItem__SetErrorRetryInterval_meth.html)/PyIScheduledWorkItem__SetFlags_meth.html,/PyIScheduledWorkItem__SetIdleWait_meth.html7~0/PyIScheduledWorkItem__SetWorkItemData_meth.html5b*/PyIScheduledWorkItem__Terminate_meth.htmlA/PyIServerSecurity.htmlGh//PyIServerSecurity__ImpersonateClient_meth.htmlXM-/PyIServerSecurity__IsImpersonating_meth.html%e*/PyIServerSecurity__QueryBlanket_meth.html _*/PyIServerSecurity__RevertToSelf_meth.htmli9/PyIServiceProvider.html/)+/PyIServiceProvider__QueryService_meth.html"[/PyIShellBrowser.htmlXH(/PyIShellBrowser__BrowseObject_meth.html}/,/PyIShellBrowser__EnableModelessSB_meth.html,Q,/PyIShellBrowser__GetControlWindow_meth.html}8./PyIShellBrowser__GetViewStateStream_meth.html5)/PyIShellBrowser__InsertMenusSB_meth.htmlRp./PyIShellBrowser__OnViewWindowActive_meth.htmlBa0/PyIShellBrowser__QueryActiveShellView_meth.html#)/PyIShellBrowser__RemoveMenusSB_meth.html%h*/PyIShellBrowser__SendControlMsg_meth.html 5%/PyIShellBrowser__SetMenuSB_meth.htmlBG+/PyIShellBrowser__SetStatusTextSB_meth.html 9+/PyIShellBrowser__SetToolbarItems_meth.htmlBW2/PyIShellBrowser__TranslateAcceleratorSB_meth.html7/PyIShellExtInit.html y&/PyIShellExtInit__Initialize_meth.htmlP/PyIShellFolder.html>/PyIShellFolder2.htmlW+(/PyIShellFolder2__EnumSearches_meth.htmlED,/PyIShellFolder2__GetDefaultColumn_meth.html `1/PyIShellFolder2__GetDefaultColumnState_meth.htmli00/PyIShellFolder2__GetDefaultSearchGUID_meth.htmlq(/PyIShellFolder2__GetDetailsEx_meth.html S(/PyIShellFolder2__GetDetailsOf_meth.html]<+/PyIShellFolder2__MapColumnToSCID_meth.htmlm'/PyIShellFolder__BindToObject_meth.html`(/PyIShellFolder__BindToStorage_meth.html~ %/PyIShellFolder__CompareIDs_meth.html +/PyIShellFolder__CreateViewObject_meth.htmlv&/PyIShellFolder__EnumObjects_meth.htmlQ*/PyIShellFolder__GetAttributesOf_meth.htmlWn+/PyIShellFolder__GetDisplayNameOf_meth.htmlEY(/PyIShellFolder__GetUIObjectOf_meth.html6+/PyIShellFolder__ParseDisplayName_meth.htmlT$/PyIShellFolder__SetNameOf_meth.htmlh]/PyIShellIcon.htmlm"/PyIShellIcon__GetIconOf_meth.html/PyIShellIconOverlay.htmlo#3/PyIShellIconOverlay__GetOverlayIconIndex_meth.htmlN//PyIShellIconOverlay__GetOverlayIndex_meth.htmle>#/PyIShellIconOverlayIdentifier.html 8/PyIShellIconOverlayIdentifier__GetOverlayInfo_meth.html#N5/PyIShellIconOverlayIdentifier__GetPriority_meth.htmlqs4/PyIShellIconOverlayIdentifier__IsMemberOf_meth.htmldM /PyIShellIconOverlayManager.htmlO9/PyIShellIconOverlayManager__GetFileOverlayInfo_meth.html1@r_meth.html3&meth.htmlCpBY  DO>0(PPMGL/%'=/PyIShellIconOverlayManager__GetReservedOverlayInfo_meth.htmlq>F/PyIShellIconOverlayManager__LoadNonloadedOverlayIdentifiers_meth.html/ A/PyIShellIconOverlayManager__OverlayIndexFromImageIndex_meth.htmlO.;/PyIShellIconOverlayManager__RefreshOverlayImages_meth.html}O/PyIShellItem.htmll*/PyIShellItem2.htmlO!/PyIShellItem2__GetBool_meth.htmlzG"/PyIShellItem2__GetCLSID_meth.htmlAl%/PyIShellItem2__GetFileTime_meth.html-o"/PyIShellItem2__GetInt32_meth.htmlL%/PyIShellItem2__GetProperty_meth.htmlhY4/PyIShellItem2__GetPropertyDescriptionList_meth.htmlAj*/PyIShellItem2__GetPropertyStore_meth.html+1/PyIShellItem2__GetPropertyStoreForKeys_meth.html;8:/PyIShellItem2__GetPropertyStoreWithCreateObject_meth.htmls#/PyIShellItem2__GetString_meth.htmlsJ#/PyIShellItem2__GetUInt32_meth.html=U#/PyIShellItem2__GetUInt64_meth.htmlV /PyIShellItem2__Update_meth.htmlhd&/PyIShellItem__BindToHandler_meth.htmlL` /PyIShellItem__Compare_meth.html,&/PyIShellItem__GetAttributes_meth.htmlC'/PyIShellItem__GetDisplayName_meth.htmlWN"/PyIShellItem__GetParent_meth.html%U/PyIShellItemArray.htmlex+/PyIShellItemArray__BindToHandler_meth.htmlLB'/PyIShellItemArray__EnumItems_meth.html+/PyIShellItemArray__GetAttributes_meth.html&/PyIShellItemArray__GetCount_meth.html)C'/PyIShellItemArray__GetItemAt_meth.htmllK8/PyIShellItemArray__GetPropertyDescriptionList_meth.html7t./PyIShellItemArray__GetPropertyStore_meth.html+m/PyIShellItemResources.html]0/PyIShellItemResources__CreateResource_meth.htmlO//PyIShellItemResources__EnumResources_meth.htmlg//PyIShellItemResources__GetAttributes_meth.htmlgI8/PyIShellItemResources__GetResourceDescription_meth.html0)/PyIShellItemResources__GetSize_meth.html37*/PyIShellItemResources__GetTimes_meth.htmlj5//PyIShellItemResources__MarkForDelete_meth.htmlI./PyIShellItemResources__OpenResource_meth.htmlhl*/PyIShellItemResources__SetTimes_meth.htmlT2/PyIShellItemResources__SupportsResource_meth.htmlpu/PyIShellLibrary.html\`%/PyIShellLibrary__AddFolder_meth.htmle@"/PyIShellLibrary__Commit_meth.html%<0/PyIShellLibrary__GetDefaultSaveFolder_meth.htmla2&/PyIShellLibrary__GetFolders_meth.htmlA)/PyIShellLibrary__GetFolderType_meth.htmlTi#/PyIShellLibrary__GetIcon_meth.html=u&/PyIShellLibrary__GetOptions_meth.html2//PyIShellLibrary__LoadLibraryFromItem_meth.html4R6/PyIShellLibrary__LoadLibraryFromKnownFolder_meth.htmlQ(/PyIShellLibrary__RemoveFolder_meth.htmlWH)/PyIShellLibrary__ResolveFolder_meth.html /PyIShellLibrary__Save_meth.html)U-/PyIShellLibrary__SaveInKnownFolder_meth.html~z0/PyIShellLibrary__SetDefaultSaveFolder_meth.htmlx\)/PyIShellLibrary__SetFolderType_meth.htmlT;#/PyIShellLibrary__SetIcon_meth.html &/PyIShellLibrary__SetOptions_meth.html/PyIShellLink.html<7%/PyIShellLink__GetArguments_meth.html2T'/PyIShellLink__GetDescription_meth.htmln"/PyIShellLink__GetHotkey_meth.htmltl(/PyIShellLink__GetIconLocation_meth.html`"/PyIShellLink__GetIDList_meth.htmlbn /PyIShellLink__GetPath_meth.htmlP1#/PyIShellLink__GetShowCmd_meth.htmlG,/PyIShellLink__GetWorkingDirectory_meth.htmlH` /PyIShellLink__Resolve_meth.html(%/PyIShellLink__SetArguments_meth.html;('/PyIShellLink__SetDescription_meth.htmlc4"/PyIShellLink__SetHotkey_meth.html (/PyIShellLink__SetIconLocation_meth.html""/PyIShellLink__SetIDList_meth.html2E /PyIShellLink__SetPath_meth.htmlw(/PyIShellLink__SetRelativePath_meth.html#/PyIShellLink__SetShowCmd_meth.html,#,/PyIShellLink__SetWorkingDirectory_meth.htmlO//PyIShellLinkDataList.htmls;-/PyIShellLinkDataList__AddDataBlock_meth.html~I./PyIShellLinkDataList__CopyDataBlock_meth.htmlGd)/PyIShellLinkDataList__GetFlags_meth.html+htmlCpB@ _ 9TPMGL>&(0/PyIShellLinkDataList__RemoveDataBlock_meth.html1^)/PyIShellLinkDataList__SetFlags_meth.html;/PyIShellView.html.+)/PyIShellView__CreateViewWindow_meth.htmlJJ*/PyIShellView__DestroyViewWindow_meth.html>'/PyIShellView__EnableModeless_meth.htmlR'/PyIShellView__GetCurrentInfo_meth.htmleP&/PyIShellView__GetItemObject_meth.html5 /PyIShellView__Refresh_meth.htmlL&/PyIShellView__SaveViewState_meth.htmlb.#/PyIShellView__SelectItem_meth.htmlk-/PyIShellView__TranslateAccelerator_meth.html{#/PyIShellView__UIActivate_meth.html /PyISpecifyPropertyPages.htmlY ,/PyISpecifyPropertyPages__GetPages_meth.html ;/PyIStorage.htmldy/PyIStorage__Commit_meth.htmlGc/PyIStorage__CopyTo_meth.html*Q$/PyIStorage__CreateStorage_meth.html{#/PyIStorage__CreateStream_meth.html}q%/PyIStorage__DestroyElement_meth.htmln<#/PyIStorage__EnumElements_meth.html*!$/PyIStorage__MoveElementTo_meth.htmlK1"/PyIStorage__OpenStorage_meth.html| !/PyIStorage__OpenStream_meth.html$$/PyIStorage__RenameElement_meth.html+3/PyIStorage__Revert_meth.html^K/PyIStorage__SetClass_meth.html)^&/PyIStorage__SetElementTimes_meth.html #/PyIStorage__SetStateBits_meth.htmlK/PyIStorage__Stat_meth.html_O/PyIStream.html]x/PyIStream__Clone_meth.html. /PyIStream__Commit_meth.html7^/PyIStream__CopyTo_meth.html8 /PyIStream__LockRegion_meth.htmlM{/PyIStream__Read_meth.htmlH/PyIStream__Revert_meth.htmlJ/PyIStream__Seek_meth.htmlMK/PyIStream__SetSize_meth.html}/PyIStream__Stat_meth.html"/PyIStream__UnlockRegion_meth.html)V/PyIStream__Write_meth.htmlf /PyITask.htmlU&/PyITask__GetApplicationName_meth.htmlee!/PyITask__GetMaxRunTime_meth.htmlJ)!/PyITask__GetParameters_meth.htmlsS/PyITask__GetPriority_meth.htmlFA /PyITask__GetTaskFlags_meth.html1'/PyITask__GetWorkingDirectory_meth.html8u&/PyITask__SetApplicationName_meth.html-3!/PyITask__SetMaxRunTime_meth.html`;!/PyITask__SetParameters_meth.html&/PyITask__SetPriority_meth.htmlAA /PyITask__SetTaskFlags_meth.htmlr'/PyITask__SetWorkingDirectory_meth.htmlt?/PyITaskbarList.htmlZ &/PyITaskbarList__ActivateTab_meth.html3S!/PyITaskbarList__AddTab_meth.html3$/PyITaskbarList__DeleteTab_meth.html9?!/PyITaskbarList__HrInit_meth.htmlx%'/PyITaskbarList__SetActiveAlt_meth.html}/PyITaskScheduler.htmlf%%/PyITaskScheduler__Activate_meth.htmli(/PyITaskScheduler__AddWorkItem_meth.html/#/PyITaskScheduler__Delete_meth.html2 !/PyITaskScheduler__Enum_meth.html>J./PyITaskScheduler__GetTargetComputer_meth.html%/PyITaskScheduler__IsOfType_meth.html .(/PyITaskScheduler__NewWorkItem_meth.html8./PyITaskScheduler__SetTargetComputer_meth.htmlOL/PyITaskTrigger.html 5%/PyITaskTrigger__GetTrigger_meth.htmls+/PyITaskTrigger__GetTriggerString_meth.htmlf%/PyITaskTrigger__SetTrigger_meth.htmlth/PyITransferAdviseSink.html@q7/PyITransferAdviseSink__ConfirmEncryptionLoss_meth.html\2/PyITransferAdviseSink__ConfirmOverwrite_meth.htmlw-/PyITransferAdviseSink__FileFailure_meth.html~#1/PyITransferAdviseSink__PropertyFailure_meth.html!.2/PyITransferAdviseSink__SubStreamFailure_meth.htmlOD0/PyITransferAdviseSink__UpdateProgress_meth.html5/PyITransferAdviseSink__UpdateTransferState_meth.html[/PyITransferDestination.html11)/PyITransferDestination__Advise_meth.htmlr-/PyITransferDestination__CreateItem_meth.htmlvz+/PyITransferDestination__Unadvise_meth.htmlp|/PyITransferMediumItem.htmlb6/PyITransferSource.html $/PyITransferSource__Advise_meth.htmllf3/PyITransferSource__ApplyPropertiesToItem_meth.htmlR)/PyITransferSource__EnterFolder_meth.htmlW7/PyITransferSource__GetDefaultDestinationName_meth.htmlreth.html+htmlC-)  @ Y g <e]PMGL7'))/PyITransferSource__LeaveFolder_meth.html&/PyITransferSource__LinkItem_meth.html"&/PyITransferSource__MoveItem_meth.html9N&/PyITransferSource__OpenItem_meth.htmlW)/PyITransferSource__RecycleItem_meth.html^`(/PyITransferSource__RemoveItem_meth.html>b(/PyITransferSource__RenameItem_meth.html +/PyITransferSource__SetProperties_meth.html7j&/PyITransferSource__Unadvise_meth.html!Z/PyITypeComp.html#M/PyITypeComp__Bind_meth.html{K /PyITypeComp__BindType_meth.htmlF/PyITypeInfo.htmlpl,/PyITypeInfo__GetContainingTypeLib_meth.htmlH<(/PyITypeInfo__GetDocumentation_meth.html##/PyITypeInfo__GetFuncDesc_meth.html'n%/PyITypeInfo__GetIDsOfNames_meth.htmlh(/PyITypeInfo__GetImplTypeFlags_meth.html}U /PyITypeInfo__GetNames_meth.htmlR&/PyITypeInfo__GetRefTypeInfo_meth.htmlRv,/PyITypeInfo__GetRefTypeOfImplType_meth.htmlH=#/PyITypeInfo__GetTypeAttr_meth.html #/PyITypeInfo__GetTypeComp_meth.html%"/PyITypeInfo__GetVarDesc_meth.html+R/PyITypeLib.html\X'/PyITypeLib__GetDocumentation_meth.html}T!/PyITypeLib__GetLibAttr_meth.htmlQK"/PyITypeLib__GetTypeComp_meth.html"/PyITypeLib__GetTypeInfo_meth.htmld'/PyITypeLib__GetTypeInfoCount_meth.htmlr(/PyITypeLib__GetTypeInfoOfGuid_meth.htmlul&/PyITypeLib__GetTypeInfoType_meth.htmlaJ/PyIUniformResourceLocator.html4',/PyIUniformResourceLocator__GetURL_meth.html+I3/PyIUniformResourceLocator__InvokeCommand_meth.htmlt3,/PyIUniformResourceLocator__SetURL_meth.html'u/PyIUnknown.html[S/PyIUnknown____cmp___meth.htmlM/PyIUnknown____repr___meth.html.w%/PyIUnknown__QueryInterface_meth.htmli4/PyIViewObject.html%r/PyIViewObject2.htmls$/PyIViewObject2__GetExtent_meth.html L/PyIViewObject__Draw_meth.html /PyIViewObject__Freeze_meth.html0N#/PyIViewObject__GetAdvise_meth.html~!%/PyIViewObject__GetColorSet_meth.html>#/PyIViewObject__SetAdvise_meth.html]+"/PyIViewObject__Unfreeze_meth.html/PyLOCALGROUP_INFO_.2a.html k/PyLOCALGROUP_INFO_0.htmlu*/PyLOCALGROUP_INFO_1.html/PyLOCALGROUP_INFO_1002.html0%#/PyLOCALGROUP_MEMBERS_INFO_.2a.htmlU!/PyLOCALGROUP_MEMBERS_INFO_0.htmlh%!/PyLOCALGROUP_MEMBERS_INFO_1.html !/PyLOCALGROUP_MEMBERS_INFO_2.html,!/PyLOCALGROUP_MEMBERS_INFO_3.html='/PyLOGBRUSH.htmldS/PyLOGFONT.html7/PyLSA_HANDLE.htmlU3/PyLsaLogon_HANDLE.html~/PyLUID_AND_ATTRIBUTES.html/PyMAPINAMEIDArray.html/Pymmapfile.html3T/Pymmapfile__close_meth.htmlU*/Pymmapfile__find_meth.html0/Pymmapfile__flush_meth.html//Pymmapfile__move_meth.html/ /Pymmapfile__read_byte_meth.htmlf. /Pymmapfile__read_line_meth.html0/Pymmapfile__read_meth.html?'/Pymmapfile__resize_meth.htmlD/Pymmapfile__seek_meth.htmlH'/Pymmapfile__size_meth.htmlo/Pymmapfile__tell_meth.html!/Pymmapfile__write_byte_meth.html /Pymmapfile__write_meth.htmln /PyMSG.htmlU-/PyNET_VALIDATE_AUTHENTICATION_INPUT_ARG.html\0./PyNET_VALIDATE_PASSWORD_CHANGE_INPUT_ARG.html %/PyNET_VALIDATE_PERSISTED_FIELDS.htmlT/PyNETRESOURCE.htmle, /PyNMHDR.htmlX/PyNOTIFYICONDATA.htmlip/PyOLEMENUGROUPWIDTHS.htmlY/PyOVERLAPPED.htmlt/PyOVERLAPPEDReadBuffer.html /PyPERF_COUNTER_DEFINITION.html//PyPERF_COUNTER_DEFINITION__Decrement_meth.html[)/PyPERF_COUNTER_DEFINITION__Get_meth.htmll?//PyPERF_COUNTER_DEFINITION__Increment_meth.html+[)/PyPERF_COUNTER_DEFINITION__Set_meth.html>/PyPERF_OBJECT_TYPE.html&f$/PyPERF_OBJECT_TYPE__Close_meth.htmlD/PyPerfMonManager.html `"/PyPerfMonManager__Close_meth.htmla, /PyPOINT.htmllp/PyPrinterHANDLE.html\6/PyPROFILEINFO.html/PyPROPERTYKEY.html'/PyPROPVARIANT.htmlAf$/PyPROPVARIANT__ChangeType_meth.html Il+htmlS  j F O9mgPMGLR(*"/PyPROPVARIANT__GetValue_meth.htmlV>"/PyPROPVARIANT__ToString_meth.html6 /PyRECT.html'{/PyResourceId.html"`/PySAndRestriction.html /PySBinaryArray.htmlx/PySBitMaskRestriction.htmlw/PySC_HANDLE.html}e/PySContentRestriction.htmlb%/PySCROLLINFO.htmlk/PySecBuffer.htmlr7/PySecBuffer__Clear_meth.htmlJ:/PySecBufferDesc.html)"/PySecBufferDesc__append_meth.htmlo/PySECURITY_ATTRIBUTES.html7 /PySECURITY_DESCRIPTOR.htmlD>+/PySECURITY_DESCRIPTOR__GetLength_meth.htmlsc>/PySECURITY_DESCRIPTOR__GetSecurityDescriptorControl_meth.htmlV;/PySECURITY_DESCRIPTOR__GetSecurityDescriptorDacl_meth.htmlu-I>/PySECURITY_DESCRIPTOR__SetSecurityDescriptorControl_meth.htmlZ;/PySECURITY_DESCRIPTOR__SetSecurityDescriptorDacl_meth.htmla ChangeType_meth.html Il+htmlS N B @y%6cPMGL<)+$/pythoncom__CoUninitialize_meth.htmlA*/pythoncom__CoUnmarshalInterface_meth.htmlD=./pythoncom__CoWaitForMultipleHandles_meth.html>#/pythoncom__CreateBindCtx_meth.html?q'/pythoncom__CreateFileMoniker_meth.html0a /pythoncom__CreateGuid_meth.html//pythoncom__CreateILockBytesOnHGlobal_meth.html0o'/pythoncom__CreateItemMoniker_meth.html */pythoncom__CreatePointerMoniker_meth.html++/pythoncom__CreateStreamOnHGlobal_meth.html@W$/pythoncom__CreateTypeLib2_meth.html#/pythoncom__CreateTypeLib_meth.html|(/pythoncom__CreateURLMonikerEx_meth.html?/pythoncom__dcom_prop.html;+ /pythoncom__DoDragDrop_meth.htmlS*'/pythoncom__EnableQuitMessage_meth.html}.(/pythoncom__FmtIdToPropStgName_meth.html+v/pythoncom__frozen_prop.htmlfz/pythoncom__FUNCDESC_meth.html!=%/pythoncom__GetActiveObject_meth.html^e"/pythoncom__GetClassFile_meth.htmlCg'/pythoncom__GetFacilityString_meth.html*H(/pythoncom__GetRecordFromGuids_meth.htmlra+/pythoncom__GetRecordFromTypeInfo_meth.htmlS*+/pythoncom__GetRunningObjectTable_meth.html}])/pythoncom__GetScodeRangeString_meth.htmlZS$/pythoncom__GetScodeString_meth.html-"'/pythoncom__GetSeverityString_meth.htmlOH)/pythoncom__IsGatewayRegistered_meth.htmlQ$/pythoncom__LoadRegTypeLib_meth.htmlhR!/pythoncom__LoadTypeLib_meth.html:W#/pythoncom__MakePyFactory_meth.htmlA(/pythoncom__MkParseDisplayName_meth.htmlR%/pythoncom__new_meth.htmlw#'/pythoncom__ObjectFromAddress_meth.html$'/pythoncom__ObjectFromLresult_meth.html>'/pythoncom__OleFlushClipboard_meth.htmlEm%/pythoncom__OleGetClipboard_meth.html2#/pythoncom__OleInitialize_meth.htmlFQ+/pythoncom__OleIsCurrentClipboard_meth.htmlF/pythoncom__OleLoad_meth.html]9'/pythoncom__OleLoadFromStream_meth.html+%/pythoncom__OleSaveToStream_meth.htmlA0%/pythoncom__OleSetClipboard_meth.htmlq}%/pythoncom__ProgIDFromCLSID_meth.htmlnF(/pythoncom__PropStgNameToFmtId_meth.html4N"/pythoncom__PumpMessages_meth.htmlG)/pythoncom__PumpWaitingMessages_meth.htmlI&+/pythoncom__QueryPathOfRegTypeLib_meth.htmlo)"/pythoncom__ReadClassStg_meth.html\"/pythoncom__ReadClassStm_meth.htmlt@*/pythoncom__RegisterActiveObject_meth.html40&/pythoncom__RegisterDragDrop_meth.htmldk%/pythoncom__RegisterTypeLib_meth.htmlO(/pythoncom__RevokeActiveObject_meth.htmldo$/pythoncom__RevokeDragDrop_meth.htmlS &/pythoncom__StgCreateDocfile_meth.htmls2/pythoncom__StgCreateDocfileOnILockBytes_meth.htmlv4(/pythoncom__StgCreateStorageEx_meth.html*S&/pythoncom__StgIsStorageFile_meth.html}z/pythoncom__STGMEDIUM_meth.htmlwG$/pythoncom__StgOpenStorage_meth.html>V&/pythoncom__StgOpenStorageEx_meth.html0/pythoncom__StgOpenStorageOnILockBytes_meth.html-c/pythoncom__TYPEATTR_meth.html='/pythoncom__UnRegisterTypeLib_meth.htmlMS"/pythoncom__UnwrapObject_meth.html 9/pythoncom__VARDESC_meth.htmlY7 /pythoncom__WrapObject_meth.html#/pythoncom__WriteClassStg_meth.html"#/pythoncom__WriteClassStm_meth.html2y/pythonwin.html }/pythonwin_constants.htmlX /pythonwin_modules.html~>/pythonwin_objects.html</pythonwin_overview.htmlx /PyTime.html`</PyTime____cmp___meth.html+/PyTime____float___meth.htmlB</PyTime____hash___meth.html~,/PyTime____int___meth.html*Y/PyTime____nonzero___meth.htmlJ/PyTime____repr___meth.htmlMp/PyTime____str___meth.html=?/PyTime__Format_meth.html|/PyTOKEN_GROUPS.htmlt/PyTOKEN_PRIVILEGES.htmlg/PyTRIVERTEX.htmlwj/PyTRUSTEE.htmlab/PyTS_HANDLE.htmlC`/PyUnicode.html#!/PyUrlCacheHANDLE.htmlD//PyUSE_INFO_.2a.htmlso/PyUSE_INFO_0.htmlbV/PyUSE_INFO_1.html8O/PyUSE_INFO_2.htmly/PyUSE_INFO_3.html /PyUSER_INFO_.2a.html s Il+htmlS_U i 4`wbPMGLE*,/PyUSER_INFO_0.html/PyUSER_INFO_1.htmlT/PyUSER_INFO_10.htmln /PyUSER_INFO_1003.htmlw/PyUSER_INFO_1005.html f/PyUSER_INFO_1006.htmlq/PyUSER_INFO_1007.html/PyUSER_INFO_1008.htmlg/PyUSER_INFO_1009.html/PyUSER_INFO_1010.htmll/PyUSER_INFO_1011.html/PyUSER_INFO_11.htmlw/PyUSER_INFO_2.htmlt/PyUSER_INFO_20.html/PyUSER_INFO_3.html./PyUSER_INFO_4.html2J/PyUSER_MODALS_INFO_.2a.html|G/PyUSER_MODALS_INFO_0.htmlC=/PyUSER_MODALS_INFO_1.htmlE/PyUSER_MODALS_INFO_2.htmlEi/PyUSER_MODALS_INFO_3.html.u/PyWAVEFORMATEX.html# /PyWin32.hhcM /PyWin32.hhkΘO\ /PyWin32.HTML^_!/PyWINHTTP_AUTOPROXY_OPTIONS.html1 /PyWINHTTP_PROXY_INFO.html%/pywintypes__UnicodeFromRaw_meth.html!/shell__SHSetFolderPath_meth.html?@/shell__SHUpdateImage_meth.html,/shell__StringAsCIDA_meth.html+--/shell__StringAsFILEGROUPDESCRIPTOR_meth.htmlX?/shell__StringAsPIDL_meth.htmlD/SHFILEINFO.htmlq@/SHFILEOPSTRUCT.html1r/SI_ACCESS.html##/SI_INHERIT_TYPE.htmlFH/SI_OBJECT_INFO.htmlk'/Source_code_folding_in_the_editor.htmlTQ/Source_Safe_Integration.html%/sspi.ClientAuth.html5 /sspi.htmly</sspi.ServerAuth.html= /STATSTG.htmlE/structsnenum.htmlΞQ(/Tabs_and_indentation_in_the_editor.html)y /timer.htmlbQ/timer__kill_timer_meth.html[/timer__set_timer_meth.html`=/TLIBATTR.html3;/TRACKMOUSEEVENT.htmlny /TV_ITEM.htmlgA/TYPEATTR.html(u/TYPEDESC.html/ULARGE_INTEGER.html6 /VARDESC.htmlUt/win2kras.htmlIH,/win2kras__PyRasGetEapUserIdentity_meth.html]/win2kras_RASEAPF_Logon.html/%%/win2kras_RASEAPF_NonInteractive.htmlTA/win2kras_RASEAPF_Preview.htmlK /win32.htmlNY/win32_constants.html"q/WIN32_FIND_DATA.html /win32_modules.htmltD/win32_objects.html8j/win32_overview.html'M/win32api.html(/win32api__AbortSystemShutdown_meth.htmlz/win32api__Apply_meth.html/win32api__Beep_meth.html(/win32api__BeginUpdateResource_meth.htmlO*/win32api__ChangeDisplaySettings_meth.htmlj,/win32api__ChangeDisplaySettingsEx_meth.htmloj/win32api__ClipCursor_meth.htmlYf /win32api__CloseHandle_meth.html?&/win32api__CommandLineToArgv_meth.html\q/win32api__CopyFile_meth.htmlMs/win32api__DebugBreak_meth.html@/win32api__DeleteFile_meth.html@/win32api__DragFinish_meth.htmlF"/win32api__DragQueryFile_meth.htmleU$/win32api__DuplicateHandle_meth.html:W&/win32api__EndUpdateResource_meth.html '/win32api__EnumDisplayDevices_meth.html>(/win32api__EnumDisplayMonitors_meth.html[(/win32api__EnumDisplaySettings_meth.htmln-*/win32api__EnumDisplaySettingsEx_meth.html*/win32api__EnumResourceLanguages_meth.html6l&/win32api__EnumResourceNames_meth.html"k&/win32api__EnumResourceTypes_meth.html  /win32api__ExitWindows_meth.html%:"/win32api__ExitWindowsEx_meth.html_-/win32api__ExpandEnvironmentStrings_meth.htmlny0/win32api__FindCloseChangeNotification_meth.htmlg#/win32api__FindExecutable_meth.html?/win32api__FindFiles_meth.html?50/win32api__FindFirstChangeNotification_meth.htmltLgName_meth.htmle/ml s Il+htmr~  + V ( \ dPMGL1,.//win32api__FindNextChangeNotification_meth.html@ "/win32api__FormatMessage_meth.htmlK:#/win32api__FormatMessageW_meth.htmlt /win32api__FreeLibrary_meth.htmlyJ-/win32api__GenerateConsoleCtrlEvent_meth.htmlC %/win32api__GetAsyncKeyState_meth.htmlO-#/win32api__GetCommandLine_meth.html|<$/win32api__GetComputerName_meth.html81&/win32api__GetComputerNameEx_meth.htmlij*/win32api__GetComputerObjectName_meth.htmlSp$/win32api__GetConsoleTitle_meth.htmlC>&/win32api__GetCurrentProcess_meth.html-(/win32api__GetCurrentProcessId_meth.html.Y%/win32api__GetCurrentThread_meth.html%'/win32api__GetCurrentThreadId_meth.html,Q!/win32api__GetCursorPos_meth.html}:"/win32api__GetDateFormat_meth.html7V%/win32api__GetDiskFreeSpace_meth.html '/win32api__GetDiskFreeSpaceEx_meth.html2$/win32api__GetDllDirectory_meth.htmlIM"/win32api__GetDomainName_meth.html+/win32api__GetEnvironmentVariable_meth.html%,/win32api__GetEnvironmentVariableW_meth.htmlDN&/win32api__GetFileAttributes_meth.html'/win32api__GetFileVersionInfo_meth.html*d/win32api__GetFocus_meth.html($/win32api__GetFullPathName_meth.html6C)/win32api__GetHandleInformation_meth.htmlyX&/win32api__GetKeyboardLayout_meth.htmlQV*/win32api__GetKeyboardLayoutList_meth.html']*/win32api__GetKeyboardLayoutName_meth.html%/win32api__GetKeyboardState_meth.html  /win32api__GetKeyState_meth.html!/win32api__GetLastError_meth.html%/%/win32api__GetLastInputInfo_meth.htmlTD!/win32api__GetLocalTime_meth.html(%/win32api__GetLogicalDrives_meth.html@Y+/win32api__GetLogicalDriveStrings_meth.html$$/win32api__GetLongPathName_meth.html=/%/win32api__GetLongPathNameW_meth.htmllr&/win32api__GetModuleFileName_meth.html^]'/win32api__GetModuleFileNameW_meth.html;$/win32api__GetModuleHandle_meth.htmlCA#/win32api__GetMonitorInfo_meth.htmlG(/win32api__GetNativeSystemInfo_meth.htmlK#/win32api__GetProcAddress_meth.htmlQ&/win32api__GetProfileSection_meth.htmlg"/win32api__GetProfileVal_meth.htmllV'/win32api__GetPwrCapabilities_meth.htmlB\%/win32api__GetShortPathName_meth.html5!/win32api__GetStdHandle_meth.htmlS: /win32api__GetSysColor_meth.html +/win32api__GetSystemDefaultLangID_meth.htmlq)/win32api__GetSystemDefaultLCID_meth.htmla'/win32api__GetSystemDirectory_meth.htmliX+/win32api__GetSystemFileCacheSize_meth.htmlAz"/win32api__GetSystemInfo_meth.html;H%/win32api__GetSystemMetrics_meth.htmlk"/win32api__GetSystemTime_meth.htmln,$/win32api__GetTempFileName_meth.html$ /win32api__GetTempPath_meth.html>K$/win32api__GetThreadLocale_meth.html 5!/win32api__GetTickCount_meth.html>A"/win32api__GetTimeFormat_meth.htmlV+/win32api__GetTimeZoneInformation_meth.htmlUb)/win32api__GetUserDefaultLangID_meth.html7a'/win32api__GetUserDefaultLCID_meth.htmlQ /win32api__GetUserName_meth.htmli"/win32api__GetUserNameEx_meth.html|D/win32api__GetVersion_meth.html@!/win32api__GetVersionEx_meth.htmlG5)/win32api__GetVolumeInformation_meth.html|9"/win32api__GetWindowLong_meth.html57(/win32api__GetWindowsDirectory_meth.htmllJ'/win32api__GlobalMemoryStatus_meth.html6)/win32api__GlobalMemoryStatusEx_meth.htmlJd/win32api__HIBYTE_meth.html.L/win32api__HIWORD_meth.htmlzL+/win32api__InitiateSystemShutdown_meth.htmlFQ /win32api__keybd_event_meth.htmlt/win32api__LoadCursor_meth.html *'/win32api__LoadKeyboardLayout_meth.html5V /win32api__LoadLibrary_meth.html "/win32api__LoadLibraryEx_meth.html+.!/win32api__LoadResource_meth.htmlYm/win32api__LoadString_meth.htmlF8/win32api__LOBYTE_meth.html~L/win32api__LOWORD_meth.htmlJL/win32api__MAKELANGID_meth.htmly/win32api__MAKELONG_meth.htmlN/win32api__MAKEWORD_meth.html]Nhtmr~ : W ~ ;^|[PMGL--/"/win32api__MapVirtualKey_meth.html+ /win32api__MessageBeep_meth.html>T/win32api__MessageBox_meth.html%/win32api__MonitorFromPoint_meth.html$/win32api__MonitorFromRect_meth.html&/win32api__MonitorFromWindow_meth.html- /win32api__mouse_event_meth.html/N/win32api__MoveFile_meth.html}#/win32api__MoveFileEx_meth.html  /win32api__OpenProcess_meth.html.>/win32api__OpenThread_meth.htmll9&/win32api__OutputDebugString_meth.html% /win32api__PostMessage_meth.html>!$/win32api__PostQuitMessage_meth.html_&/win32api__PostThreadMessage_meth.htmleK /win32api__RegCloseKey_meth.html0 '/win32api__RegConnectRegistry_meth.html=< /win32api__RegCopyTree_meth.htmly[!/win32api__RegCreateKey_meth.htmlT%#/win32api__RegCreateKeyEx_meth.htmlyE!/win32api__RegDeleteKey_meth.html>6#/win32api__RegDeleteKeyEx_meth.htmlt"/win32api__RegDeleteTree_meth.html#/win32api__RegDeleteValue_meth.html/win32api__RegEnumKey_meth.html?!/win32api__RegEnumKeyEx_meth.html\%"/win32api__RegEnumKeyExW_meth.htmld!/win32api__RegEnumValue_meth.htmled /win32api__RegFlushKey_meth.htmlI&/win32api__RegGetKeySecurity_meth.htmlK*/win32api__RegisterWindowMessage_meth.htmlL}/win32api__RegLoadKey_meth.htmlIg,/win32api__RegNotifyChangeKeyValue_meth.html0J'/win32api__RegOpenCurrentUser_meth.htmlz/win32api__RegOpenKey_meth.htmlyG!/win32api__RegOpenKeyEx_meth.html@b)/win32api__RegOpenKeyTransacted_meth.html")/win32api__RegOverridePredefKey_meth.html7U$/win32api__RegQueryInfoKey_meth.html A%/win32api__RegQueryInfoKeyW_meth.htmlMa"/win32api__RegQueryValue_meth.html..$/win32api__RegQueryValueEx_meth.html\b"/win32api__RegRestoreKey_meth.html>/win32api__RegSaveKey_meth.htmlWz!/win32api__RegSaveKeyEx_meth.htmlQF&/win32api__RegSetKeySecurity_meth.htmlg /win32api__RegSetValue_meth.html~"/win32api__RegSetValueEx_meth.htmlc!/win32api__RegUnLoadKey_meth.htmlu(/win32api__RGB_meth.html./win32api__SearchPath_meth.htmlKZ /win32api__SendMessage_meth.html%/!/win32api__SetClassLong_meth.htmlT4!/win32api__SetClassWord_meth.htmlZ*/win32api__SetConsoleCtrlHandler_meth.htmlb$/win32api__SetConsoleTitle_meth.htmlx/win32api__SetCursor_meth.html~!/win32api__SetCursorPos_meth.html$/win32api__SetDllDirectory_meth.html1n+/win32api__SetEnvironmentVariable_meth.htmlN,/win32api__SetEnvironmentVariableW_meth.htmlm@!/win32api__SetErrorMode_meth.html-Q&/win32api__SetFileAttributes_meth.html~+)/win32api__SetHandleInformation_meth.html)X!/win32api__SetLastError_meth.html*!/win32api__SetLocalTime_meth.html+B!/win32api__SetStdHandle_meth.htmlmC!/win32api__SetSysColors_meth.html0o+/win32api__SetSystemFileCacheSize_meth.html-(/win32api__SetSystemPowerState_meth.htmlLb"/win32api__SetSystemTime_meth.html.z$/win32api__SetThreadLocale_meth.html(|+/win32api__SetTimeZoneInformation_meth.html$."/win32api__SetWindowLong_meth.htmlR"/win32api__SetWindowWord_meth.htmlY!/win32api__ShellExecute_meth.htmlY"/win32api__ShowCursor_meth.html{/win32api__Sleep_meth.html<%/win32api__TerminateProcess_meth.htmlJk/win32api__ToAsciiEx_meth.html5/win32api__Unicode_meth.htmlJ8#/win32api__UpdateResource_meth.htmlb/win32api__VkKeyScan_meth.htmld /win32api__VkKeyScanEx_meth.html@/win32api__WinExec_meth.htmlDQ/win32api__WinHelp_meth.htmlH(/win32api__WriteProfileSection_meth.html]1$/win32api__WriteProfileVal_meth.htmlY/win32clipboard.htmlI//win32clipboard__ChangeClipboardChain_meth.htmlg+)/win32clipboard__CloseClipboard_meth.html0/win32clipboard__CountClipboardFormats_meth.html'&)/win32clipboard__EmptyClipboard_meth.htmlM7//win32clipboard__EnumClipboardFormats_meth.htmlˆ-mr~Z  HFs^PMGL5.0+/win32clipboard__GetClipboardData_meth.htmlŸ1)1/win32clipboard__GetClipboardDataHandle_meth.html¾Zq1/win32clipboard__GetClipboardFormatName_meth.htmlKW,/win32clipboard__GetClipboardOwner_meth.html"t5/win32clipboard__GetClipboardSequenceNumber_meth.htmlu-/win32clipboard__GetClipboardViewer_meth.html */win32clipboard__GetGlobalMemory_meth.htmlv1/win32clipboard__GetOpenClipboardWindow_meth.html35/win32clipboard__GetPriorityClipboardFormat_meth.html8d5/win32clipboard__IsClipboardFormatAvailable_meth.htmlÉ9(/win32clipboard__OpenClipboard_meth.htmlØU.2/win32clipboard__RegisterClipboardFormat_meth.htmlå`+/win32clipboard__SetClipboardData_meth.htmlñc6+/win32clipboard__SetClipboardText_meth.htmlx-/win32clipboard__SetClipboardViewer_meth.htmly*/win32com.authorization.authorization.htmldh,/win32com.shell_and_Windows_Shell_Links.html"/win32console.htmlL](/win32console__AddConsoleAlias_meth.html ^%/win32console__AllocConsole_meth.htmlh&/win32console__AttachConsole_meth.html~2/win32console__CreateConsoleScreenBuffer_meth.html$/win32console__FreeConsole_meth.html)41/win32console__GenerateConsoleCtrlEvent_meth.html]*/win32console__GetConsoleAliases_meth.htmlāzV,/win32console__GetConsoleAliasExes_meth.htmlćPj%/win32console__GetConsoleCP_meth.htmlċ:M./win32console__GetConsoleDisplayMode_meth.htmlĎb+/win32console__GetConsoleOutputCP_meth.htmlđi`./win32console__GetConsoleProcessList_meth.htmlĔIn0/win32console__GetConsoleSelectionInfo_meth.htmlė7M(/win32console__GetConsoleTitle_meth.htmlĝg)/win32console__GetConsoleWindow_meth.htmlğkB0/win32console__GetNumberOfConsoleFonts_meth.htmlĤ-'%/win32console__GetStdHandle_meth.htmlħTS%/win32console__SetConsoleCP_meth.htmlĭ'(+/win32console__SetConsoleOutputCP_meth.htmlİO;(/win32console__SetConsoleTitle_meth.htmlĴ K/win32cred.html)I /win32cred__CredDelete_meth.htmlķUH#/win32cred__CredEnumerate_meth.htmlļ3'/win32cred__CredGetTargetInfo_meth.htmlPK//win32cred__CredIsMarshaledCredential_meth.htmly+/win32cred__CredMarshalCredential_meth.htmlO/win32cred__CredRead_meth.htmlc3//win32cred__CredReadDomainCredentials_meth.html' /win32cred__CredRename_meth.html=7/win32cred__CredUICmdLinePromptForCredentials_meth.htmlZv./win32cred__CredUIConfirmCredentials_meth.htmlP4)/win32cred__CredUIParseUserName_meth.htmlłI0/win32cred__CredUIPromptForCredentials_meth.htmlŇM.(/win32cred__CredUIReadSSOCredW_meth.htmlœ{)/win32cred__CredUIStoreSSOCredW_meth.htmlŗ{-/win32cred__CredUnmarshalCredential_meth.htmlŞw/win32cred__CredWrite_meth.htmlŧ 0/win32cred__CredWriteDomainCredentials_meth.htmlŭ /win32crypt.htmlrI6/win32crypt__CertAddSerializedElementToStore_meth.htmlŵ'X%/win32crypt__CertAlgIdToOID_meth.htmlŽ,/win32crypt__CertEnumPhysicalStore_meth.html6*/win32crypt__CertEnumSystemStore_meth.html6S2/win32crypt__CertEnumSystemStoreLocation_meth.html l$/win32crypt__CertNameToStr_meth.htmlub%/win32crypt__CertOIDToAlgId_meth.htmlW$/win32crypt__CertOpenStore_meth.htmlYj*/win32crypt__CertOpenSystemStore_meth.htmlCL./win32crypt__CertRegisterSystemStore_meth.html0/win32crypt__CertUnregisterSystemStore_meth.html */win32crypt__CryptAcquireContext_meth.html"t*/win32crypt__CryptBinaryToString_meth.htmlN)/win32crypt__CryptDecodeMessage_meth.htmlƆdQ*/win32crypt__CryptDecodeObjectEx_meth.htmlƛ5v$/win32evtlog__EvtSubscribe_meth.html )/win32evtlog__EvtUpdateBookmark_meth.htmlˁ62/win32evtlog__GetNumberOfEventLogRecords_meth.htmlˆKL//win32evtlog__GetOldestEventLogRecord_meth.htmlˊO,/win32evtlog__NotifyChangeEventLog_meth.htmlˍf */win32evtlog__OpenBackupEventLog_meth.html˖s$/win32evtlog__OpenEventLog_meth.html˚yf$/win32evtlog__ReadEventLog_meth.htmlˠ_]+/win32evtlog__RegisterEventSource_meth.html˧<<#/win32evtlog__ReportEvent_meth.html˫xI(/win32evtlog_EVENTLOG_AUDIT_FAILURE.html) (/win32evtlog_EVENTLOG_AUDIT_SUCCESS.html5 )/win32evtlog_EVENTLOG_BACKWARDS_READ.htmlɁA0/win32evtlog_EVENTLOG_END_ALL_PAIRED_EVENTS.htmlɃP$+/win32evtlog_EVENTLOG_END_PAIRED_EVENT.htmlɅt%/win32evtlog_EVENTLOG_ERROR_TYPE.htmlɈ (/win32evtlog_EVENTLOG_FORWARDS_READ.htmlɊ +/win32evtlog_EVENTLOG_INFORMATION_TYPE.htmlɌ./win32evtlog_EVENTLOG_PAIRED_EVENT_ACTIVE.htmlɎ-0/win32evtlog_EVENTLOG_PAIRED_EVENT_INACTIVE.htmlɐK$$/win32evtlog_EVENTLOG_SEEK_READ.htmlɒo*/win32evtlog_EVENTLOG_SEQUENTIAL_READ.htmlɔo-/win32evtlog_EVENTLOG_START_PAIRED_EVENT.htmlɗ"/win32evtlog_EVENTLOG_SUCCESS.htmləz'/win32evtlog_EVENTLOG_WARNING_TYPE.htmlɛ +/win32evtlog_EventMetadataEventChannel.htmlɝ&/win32evtlog_EventMetadataEventID.htmlɟ4+/win32evtlog_EventMetadataEventKeyword.htmlɡ:)/win32evtlog_EventMetadataEventLevel.htmlɣO-/win32evtlog_EventMetadataEventMessageID.htmlɥ^*/win32evtlog_EventMetadataEventOpcode.htmlɧy(/win32evtlog_EventMetadataEventTask.htmlɪ ,/win32evtlog_EventMetadataEventTemplate.htmlɬ+/win32evtlog_EventMetadataEventVersion.htmlɮ/(/win32evtlog_EvtChannelConfigAccess.htmlɰD 1/win32evtlog_EvtChannelConfigClassicEventlog.htmlɲP')/win32evtlog_EvtChannelConfigEnabled.htmlɴw+/win32evtlog_EvtChannelConfigIsolation.htmlɷ1/win32evtlog_EvtChannelConfigOwningPublisher.htmlɹ'//win32evtlog_EvtChannelConfigPropertyIdEND.htmlɻB!&/win32evtlog_EvtChannelConfigType.htmlɽc3/win32evtlog_EvtChannelLoggingConfigAutoBackup.htmlɿi-4/win32evtlog_EvtChannelLoggingConfigLogFilePath.html00/win32evtlog_EvtChannelLoggingConfigMaxSize.htmlF$2/win32evtlog_EvtChannelLoggingConfigRetention.htmlj*)/win32evtlog_EvtChannelPublisherList.html6/win32evtlog_EvtChannelPublishingConfigBufferSize.html#65/win32evtlog_EvtChannelPublishingConfigClockType.htmlY37/win32evtlog_EvtChannelPublishingConfigControlGuid.html 93/win32evtlog_EvtChannelPublishingConfigFileMax.htmlE-4/win32evtlog_EvtChannelPublishingConfigKeywords.htmlr03/win32evtlog_EvtChannelPublishingConfigLatency.html"-1/win32evtlog_EvtChannelPublishingConfigLevel.htmlO'6/win32evtlog_EvtChannelPublishingConfigMaxBuffers.htmlv66/win32evtlog_EvtChannelPublishingConfigMinBuffers.html,63/win32evtlog_EvtChannelPublishingConfigSidType.htmlb-//win32evtlog_EvtEventMetadataPropertyIdEND.html!/win32evtlog_EvtEventPath.html0n'/win32evtlog_EvtEventPropertyIdEND.html "/win32evtlog_EvtEventQueryIDs.html'z)/win32evtlog_EvtExportLogChannelPath.html!&/win32evtlog_EvtExportLogFilePath.html01/win32evtlog_EvtExportLogTolerateQueryErrors.html6')/win32evtlog_EvtFormatMessageChannel.html]'/win32evtlog_EvtFormatMessageEvent.htmll $/win32evtlog_EvtFormatMessageId.htmlu)/win32evtlog_EvtFormatMessageKeyword.htmlu'/win32evtlog_EvtFormatMessageLevel.html (/win32evtlog_EvtFormatMessageOpcode.html ʢiE-mr~%$ OPMGL?13*/win32evtlog_EvtFormatMessageProvider.html&/win32evtlog_EvtFormatMessageTask.htmlʀ+%/win32evtlog_EvtFormatMessageXml.htmlʂ1"/win32evtlog_EvtLogAttributes.htmlʄ4z$/win32evtlog_EvtLogCreationTime.htmlʆ. /win32evtlog_EvtLogFileSize.htmlʈ.t/win32evtlog_EvtLogFull.htmlʊ"h&/win32evtlog_EvtLogLastAccessTime.htmlʌ %/win32evtlog_EvtLogLastWriteTime.htmlʎ*/win32evtlog_EvtLogNumberOfLogRecords.htmlʐ*/win32evtlog_EvtLogOldestRecordNumber.htmlʒ%$/win32evtlog_EvtOpenChannelPath.htmlʔ7!/win32evtlog_EvtOpenFilePath.htmlʖ7w;/win32evtlog_EvtPublisherMetadataChannelReferenceFlags.htmlʘ.E8/win32evtlog_EvtPublisherMetadataChannelReferenceID.htmlʚs<;/win32evtlog_EvtPublisherMetadataChannelReferenceIndex.htmlʝ/E?/win32evtlog_EvtPublisherMetadataChannelReferenceMessageID.htmlʟtQ:/win32evtlog_EvtPublisherMetadataChannelReferencePath.htmlʢEB7/win32evtlog_EvtPublisherMetadataChannelReferences.htmlʥ9./win32evtlog_EvtPublisherMetadataHelpLink.htmlʧ@6/win32evtlog_EvtPublisherMetadataKeywordMessageID.htmlʩ^61/win32evtlog_EvtPublisherMetadataKeywordName.htmlʬ'./win32evtlog_EvtPublisherMetadataKeywords.htmlʮ;2/win32evtlog_EvtPublisherMetadataKeywordValue.htmlʰY*4/win32evtlog_EvtPublisherMetadataLevelMessageID.htmlʳ0//win32evtlog_EvtPublisherMetadataLevelName.htmlʵ3!,/win32evtlog_EvtPublisherMetadataLevels.htmlʷT0/win32evtlog_EvtPublisherMetadataLevelValue.htmlʹl$5/win32evtlog_EvtPublisherMetadataMessageFilePath.htmlʼ35/win32evtlog_EvtPublisherMetadataOpcodeMessageID.htmlʾC30/win32evtlog_EvtPublisherMetadataOpcodeName.htmlv$-/win32evtlog_EvtPublisherMetadataOpcodes.html1/win32evtlog_EvtPublisherMetadataOpcodeValue.html5'7/win32evtlog_EvtPublisherMetadataParameterFilePath.html\93/win32evtlog_EvtPublisherMetadataPropertyIdEND.html-3/win32evtlog_EvtPublisherMetadataPublisherGuid.htmlB-8/win32evtlog_EvtPublisherMetadataPublisherMessageID.htmlo<6/win32evtlog_EvtPublisherMetadataResourceFilePath.html+63/win32evtlog_EvtPublisherMetadataTaskEventGuid.htmla-3/win32evtlog_EvtPublisherMetadataTaskMessageID.html-./win32evtlog_EvtPublisherMetadataTaskName.html;+/win32evtlog_EvtPublisherMetadataTasks.htmlY//win32evtlog_EvtPublisherMetadataTaskValue.htmln!%/win32evtlog_EvtQueryChannelPath.html"/win32evtlog_EvtQueryFilePath.htmlz*/win32evtlog_EvtQueryForwardDirection.html */win32evtlog_EvtQueryReverseDirection.html-/win32evtlog_EvtQueryTolerateQueryErrors.html0#/win32evtlog_EvtRenderBookmark.htmlK}(/win32evtlog_EvtRenderContextSystem.htmlH &/win32evtlog_EvtRenderContextUser.htmlT(/win32evtlog_EvtRenderContextValues.htmlZ &/win32evtlog_EvtRenderEventValues.htmlf#/win32evtlog_EvtRenderEventXml.htmll}/win32evtlog_EvtRpcLogin.htmlik(/win32evtlog_EvtRpcLoginAuthDefault.htmlT )/win32evtlog_EvtRpcLoginAuthKerberos.html`*/win32evtlog_EvtRpcLoginAuthNegotiate.htmlo%/win32evtlog_EvtRpcLoginAuthNTLM.html#/win32evtlog_EvtSeekOriginMask.htmlˀ}+/win32evtlog_EvtSeekRelativeToBookmark.html˂*/win32evtlog_EvtSeekRelativeToCurrent.html˄(/win32evtlog_EvtSeekRelativeToFirst.htmlˆ( '/win32evtlog_EvtSeekRelativeToLast.htmlˈ4 /win32evtlog_EvtSeekStrict.htmlˊ=q+/win32evtlog_EvtSubscribeActionDeliver.htmlˌ.)/win32evtlog_EvtSubscribeActionError.htmlˎC(/win32evtlog_EvtSubscribeOriginMask.htmlːR 0/win32evtlog_EvtSubscribeStartAfterBookmark.html˒^$1/win32evtlog_EvtSubscribeStartAtOldestRecord.html˕'$/win32evtlog_EvtSubscribeStrict.html˗),/win32evtlog_EvtSubscribeToFutureEvents.html˙)1/win32evtlog_EvtSubscribeTolerateQueryErrors.html˛A'%/win32evtlog_EvtSystemActivityID.html˝h"/win32evtlog_EvtSystemChannel.html˟kz#/win32evtlog_EvtSystemComputer.htmlˡe}"/win32evtlog_EvtSystemEventID.htmlˣbz(/win32evtlog_EvtSystemEventRecordId.html˥\ html ʢiE-mr~%$(83 H ] gG*NPMGL<24#/win32evtlog_EvtSystemKeywords.html˧h} /win32evtlog_EvtSystemLevel.html˩et!/win32evtlog_EvtSystemOpcode.html˫Yw$/win32evtlog_EvtSystemProcessID.html˭P(/win32evtlog_EvtSystemPropertyIdEND.html˯P '/win32evtlog_EvtSystemProviderGuid.html˱\ '/win32evtlog_EvtSystemProviderName.html˳e %/win32evtlog_EvtSystemQualifiers.html˵n,/win32evtlog_EvtSystemRelatedActivityID.html˷q/win32evtlog_EvtSystemTask.html˺ q#/win32evtlog_EvtSystemThreadID.html˻z}&/win32evtlog_EvtSystemTimeCreated.html˽w!/win32evtlog_EvtSystemUserID.html˿}w"/win32evtlog_EvtSystemVersion.htmltz&/win32evtlog_EvtVarTypeAnsiString.htmln"/win32evtlog_EvtVarTypeBinary.htmltz#/win32evtlog_EvtVarTypeBoolean.htmln} /win32evtlog_EvtVarTypeByte.htmlkt"/win32evtlog_EvtVarTypeDouble.html_z%/win32evtlog_EvtVarTypeEvtHandle.htmlY"/win32evtlog_EvtVarTypeEvtXml.html\z$/win32evtlog_EvtVarTypeFileTime.htmlV /win32evtlog_EvtVarTypeGuid.htmlVt$/win32evtlog_EvtVarTypeHexInt32.htmlJ$/win32evtlog_EvtVarTypeHexInt64.htmlJ!/win32evtlog_EvtVarTypeInt16.htmlJw!/win32evtlog_EvtVarTypeInt32.htmlAw!/win32evtlog_EvtVarTypeInt64.html8w /win32evtlog_EvtVarTypeNull.html/t!/win32evtlog_EvtVarTypeSByte.html#w/win32evtlog_EvtVarTypeSid.htmlq"/win32evtlog_EvtVarTypeSingle.html z!/win32evtlog_EvtVarTypeSizeT.htmlw"/win32evtlog_EvtVarTypeString.html|z#/win32evtlog_EvtVarTypeSysTime.htmlv}"/win32evtlog_EvtVarTypeUInt16.htmlsz"/win32evtlog_EvtVarTypeUInt32.htmlmz"/win32evtlog_EvtVarTypeUInt64.htmlgz/win32file.html@$/win32file___get_osfhandle_meth.html˳A?"/win32file___getmaxstdio_meth.html˷8%/win32file___open_osfhandle_meth.html˹89"/win32file___setmaxstdio_meth.html˽q/win32file__AcceptEx_meth.htmlx-/win32file__AddUsersToEncryptedFile_meth.htmlP(/win32file__AllocateReadBuffer_meth.htmlXS%/win32file__AreFileApisANSI_meth.html+= /win32file__BackupRead_meth.htmlh| /win32file__BackupSeek_meth.htmldu!/win32file__BackupWrite_meth.htmlYi"/win32file__BuildCommDCB_meth.htmlBv1/win32file__CalculateSocketEndPointSize_meth.html8F/win32file__CancelIo_meth.html̄~($/win32file__ClearCommBreak_meth.html̈&$/win32file__ClearCommError_meth.htmľ#/win32file__FindFileNames_meth.htmlΰp'/win32file__FindFilesIterator_meth.htmlηp) /win32file__FindFilesW_meth.htmlD1/win32file__FindFirstChangeNotification_meth.html]rl ʢiE-mr~Ocm 2 Q{Bl\PMGL%350/win32file__FindNextChangeNotification_meth.htmlO(!/win32file__FindStreams_meth.htmlwh&/win32file__FlushFileBuffers_meth.html_ */win32file__GetAcceptExSockaddrs_meth.htmlkJ#/win32file__GetBinaryType_meth.html5C!/win32file__GetCommMask_meth.htmlxe(/win32file__GetCommModemStatus_meth.html]V"/win32file__GetCommState_meth.htmlρ30%/win32file__GetCommTimeouts_meth.htmlυc$+/win32file__GetCompressedFileSize_meth.htmlϊP&/win32file__GetDiskFreeSpace_meth.htmlόW(/win32file__GetDiskFreeSpaceEx_meth.htmlϑYs"/win32file__GetDriveType_meth.htmlϚL#/win32file__GetDriveTypeW_meth.htmlϞS.'/win32file__GetFileAttributes_meth.htmlϣ+)/win32file__GetFileAttributesEx_meth.htmlϫ,7(/win32file__GetFileAttributesW_meth.htmlc|0/win32file__GetFileInformationByHandle_meth.html_62/win32file__GetFileInformationByHandleEx_meth.html!/win32file__GetFileSize_meth.html+'!/win32file__GetFileTime_meth.htmlRz!/win32file__GetFileType_meth.htmlL$./win32file__GetFinalPathNameByHandle_meth.htmlp@%/win32file__GetFullPathName_meth.htmlІ0d&/win32file__GetLogicalDrives_meth.htmlЎI%/win32file__GetLongPathName_meth.htmlА]c%/win32file__GetMailslotInfo_meth.htmlЖ@0)/win32file__GetOverlappedResult_meth.htmlНp~//win32file__GetQueuedCompletionStatus_meth.htmlФn)6/win32file__GetVolumeNameForVolumeMountPoint_meth.htmlЬ'/win32file__GetVolumePathName_meth.htmlб)t5/win32file__GetVolumePathNamesForVolumeName_meth.htmlй_/win32file__LockFile_meth.htmlо|g /win32file__LockFileEx_meth.htmlcP/win32file__MoveFile_meth.html3L /win32file__MoveFileEx_meth.htmlg!/win32file__MoveFileExW_meth.htmlf/win32file__MoveFileW_meth.htmlts*/win32file__MoveFileWithProgress_meth.htmlgU*/win32file__OpenEncryptedFileRaw_meth.html+/win32file__WriteEncryptedFileRaw_meth.htmlӭo/win32file__WriteFile_meth.htmlӴ 2$/win32file__WSAAsyncSelect_meth.htmlӽ?9*/win32file__WSAEnumNetworkEvents_meth.htmlxf$/win32file__WSAEventSelect_meth.html^/win32file__WSARecv_meth.html^K/win32file__WSASend_meth.html)L}  0 ALpWPMGL846'/win32file_CALLBACK_CHUNK_FINISHED.htmlğ( &/win32file_CALLBACK_STREAM_SWITCH.htmlġ5 /win32file_CBR_110.htmlģ?]/win32file_CBR_115200.htmlĥf/win32file_CBR_1200.htmlħ`/win32file_CBR_128000.htmlĨbf/win32file_CBR_14400.htmlĪHc/win32file_CBR_19200.htmlĬ+c/win32file_CBR_2400.htmlĮ`/win32file_CBR_256000.htmlįnf/win32file_CBR_300.htmlıT]/win32file_CBR_38400.htmlij1c/win32file_CBR_4800.htmlĵ`/win32file_CBR_56000.htmlĶtc/win32file_CBR_57600.htmlĸWc/win32file_CBR_600.htmlĺ:]/win32file_CBR_9600.htmlļ`/win32file_CLRBREAK.htmlb/win32file_CLRDTR.htmlh/win32file_CLRRTS.htmlŀn5/win32file_COPY_FILE_ALLOW_DECRYPTED_DESTINATION.htmlř}7&/win32file_COPY_FILE_COPY_SYMLINK.htmlŜ4 (/win32file_COPY_FILE_FAIL_IF_EXISTS.htmlŞ>//win32file_COPY_FILE_OPEN_SOURCE_FOR_WRITE.htmlŠN%%/win32file_COPY_FILE_RESTARTABLE.htmlŢs/win32file_CREATE_ALWAYS.htmlŤz1/win32file_CREATE_FOR_DIR.htmlŮ&r!/win32file_CREATE_FOR_IMPORT.htmlŰ{/win32file_CREATE_NEW.htmlŲ2/win32file_DRIVE_CDROM.htmlnjI/win32file_DRIVE_FIXED.htmlǎN!/win32file_DRIVE_NO_ROOT_DIR.htmlǐa/win32file_DRIVE_RAMDISK.htmlǒ~/win32file_DRIVE_REMOTE.htmlǕ/win32file_DRIVE_REMOVABLE.htmlǗ/win32file_DRIVE_UNKNOWN.htmlǙ3#/win32file_DTR_CONTROL_DISABLE.html/H"/win32file_DTR_CONTROL_ENABLE.htmlw>%/win32file_DTR_CONTROL_HANDSHAKE.html5/win32file_EV_BREAK.htmlu~/win32file_EV_CTS.htmls/win32file_EV_DSR.htmlz/win32file_EV_ERR.html5/win32file_EV_RING.html7{/win32file_EV_RLSD.html2/win32file_EV_RXCHAR.htmlJ/win32file_EV_RXFLAG.htmle)/win32file_EV_TXEMPTY.html/win32file_EVENPARITY.html%f/win32file_FD_ACCEPT.html#c&/win32file_FD_ADDRESS_LIST_CHANGE.htmĺ /win32file_FD_CLOSE.html̃`/win32file_FD_CONNECT.html̄pf/win32file_FD_GROUP_QOS.html̆Vl/win32file_FD_OOB.html̈BZ/win32file_FD_QOS.html̊Z/win32file_FD_READ.html̋v]+/win32file_FD_ROUTING_INTERFACE_CHANGE.html̍S/win32file_FD_WRITE.html̏l`/win32file_FILE_ALL_ACCESS.html̼mu&/win32file_FILE_ATTRIBUTE_ARCHIVE.html̾bk)/win32file_FILE_ATTRIBUTE_COMPRESSED.htmlMf(/win32file_FILE_ATTRIBUTE_DIRECTORY.html3'%/win32file_FILE_ATTRIBUTE_HIDDEN.htmlZU%/win32file_FILE_ATTRIBUTE_NORMAL.html/X&/win32file_FILE_ATTRIBUTE_OFFLINE.html'/win32file_FILE_ATTRIBUTE_READONLY.htmlg%/win32file_FILE_ATTRIBUTE_SYSTEM.htmluJ(/win32file_FILE_ATTRIBUTE_TEMPORARY.html?/win32file_FILE_BEGIN.htmlSf/win32file_FILE_CURRENT.html9l /win32file_FILE_ENCRYPTABLE.html%x/win32file_FILE_END.html`*/win32file_FILE_FLAG_BACKUP_SEMANTICS.html}`)/win32file_FILE_FLAG_DELETE_ON_CLOSE.html]!&/win32file_FILE_FLAG_NO_BUFFERING.html~,/win32file_FILE_FLAG_OPEN_REPARSE_POINT.html$/win32file_FILE_FLAG_OVERLAPPED.htmlP)/win32file_FILE_FLAG_POSIX_SEMANTICS.html̈́U]'/win32file_FILE_FLAG_RANDOM_ACCESS.html͉2v)/win32file_FILE_FLAG_SEQUENTIAL_SCAN.html͌(='/win32file_FILE_FLAG_WRITE_THROUGH.html͒e*!/win32file_FILE_GENERIC_READ.html͖{"/win32file_FILE_GENERIC_WRITE.html͘ ~!/win32file_FILE_IS_ENCRYPTED.html͚{/win32file_FILE_READ_ONLY.html͜r/win32file_FILE_ROOT_DIR.html͝uo!/win32file_FILE_SHARE_DELETE.html͟de/win32file_FILE_SHARE_READ.html͢IL /win32file_FILE_SHARE_WRITE.htmlͥP /win32file_FILE_SYSTEM_ATTR.htmlͧex/win32file_FILE_SYSTEM_DIR.htmlͩ]u'/win32file_FILE_SYSTEM_NOT_SUPPORT.htmlͫR /win32file_FILE_TYPE_CHAR.htmlͭ_?/win32file_FILE_TYPE_DISK.htmlͰ/win32file_FILE_TYPE_PIPE.htmlͲ2)!/win32file_FILE_TYPE_UNKNOWN.htmlʹ[%/win32file_FILE_UNKNOWN.htmlͷl$/win32file_FILE_USER_DISALLOWED.html͸l"/win32file_FileAllocationInfo.htmlͺp~$/win32file_FileAttributeTagInfo.htmlͼn/win32file_FileBasicInfo.html;ro#/win32file_FileCompressionInfo.htmland_meth.html8o   I m tYdgPMGLN57#/win32file_FileDispositionInfo.htmlb!/win32file_FileEndOfFileInfo.htmlc{'/win32file_FileIdBothDirectoryInfo.html^ ./win32file_FileIdBothDirectoryRestartInfo.htmlk"/win32file_FileIdType.html f&/win32file_FileIoPriorityHintInfo.htmls /win32file_FileNameInfo.html}l/win32file_FileRenameInfo.htmlir /win32file_FileStandardInfo.html[x/win32file_FileStreamInfo.htmlSr/win32file_GENERIC_EXECUTE.htmlΚk/win32file_GENERIC_READ.htmlΜy/win32file_GENERIC_WRITE.htmlΟ}%/win32file_GetFileExInfoStandard.htmlε!/win32file_IoPriorityHintLow.html-{$/win32file_IoPriorityHintNormal.html(%/win32file_IoPriorityHintVeryLow.html,/win32file_MARKPARITY.htmlf%/win32file_MOVEFILE_COPY_ALLOWED.htmlٌ)F(/win32file_MOVEFILE_CREATE_HARDLINK.htmlُo+/win32file_MOVEFILE_DELAY_UNTIL_REBOOT.htmlّ>./win32file_MOVEFILE_FAIL_IF_NOT_TRACKABLE.htmlٖ=")/win32file_MOVEFILE_REPLACE_EXISTING.html٘_"&/win32file_MOVEFILE_WRITE_THROUGH.htmlٜj/win32file_NOPARITY.html`/win32file_ObjectIdType.html2l/win32file_ODDPARITY.htmlc/win32file_ONE5STOPBITS.htmlڋRl/win32file_ONESTOPBIT.htmlڍ>f/win32file_OPEN_ALWAYS.htmlڏ$n/win32file_OPEN_EXISTING.htmlڒ- /win32file_OVERWRITE_HIDDEN.htmlڡ x/win32file_PROGRESS_CANCEL.html'u!/win32file_PROGRESS_CONTINUE.html{/win32file_PROGRESS_QUIET.htmlr/win32file_PROGRESS_STOP.html o/win32file_PURGE_RXABORT.htmlܔvr/win32file_PURGE_RXCLEAR.htmlܗh&/win32file_PURGE_TXABORT.htmlܚt/win32file_PURGE_TXCLEAR.htmlܝ'//win32file_REPLACEFILE_IGNORE_MERGE_ERRORS.htmlݓi%)/win32file_REPLACEFILE_WRITE_THROUGH.htmlݖ#/win32file_RTS_CONTROL_DISABLE.htmlݻWH"/win32file_RTS_CONTROL_ENABLE.htmlݾ>%/win32file_RTS_CONTROL_HANDSHAKE.html]C"/win32file_RTS_CONTROL_TOGGLE.html  /win32file_SCS_32BIT_BINARY.html/win32file_SCS_DOS_BINARY.html  /win32file_SCS_OS216_BINARY.html//win32file_SCS_PIF_BINARY.htmlF( /win32file_SCS_POSIX_BINARY.htmln/win32file_SCS_WOW_BINARY.html"/win32file_SECURITY_ANONYMOUS.htmlQG)/win32file_SECURITY_CONTEXT_TRACKING.html #/win32file_SECURITY_DELEGATION.htmlGK'/win32file_SECURITY_EFFECTIVE_ONLY.html4'/win32file_SECURITY_IDENTIFICATION.htmlF[&/win32file_SECURITY_IMPERSONATION.html!W/win32file_SETBREAK.htmlTL/win32file_SETDTR.html /win32file_SETRTS.html%/win32file_SETXOFF.html&"/win32file_SETXON.htmlH/win32file_SO_CONNECT_TIME.htmlu(/win32file_SO_UPDATE_ACCEPT_CONTEXT.html)/win32file_SO_UPDATE_CONNECT_CONTEXT.html /win32file_SPACEPARITY.htmlIi#/win32gui__ClientToScreen_meth.html6 /win32gui__CloseFigure_meth.htmlJ, /win32gui__CloseWindow_meth.htmlv/win32gui__CombineRgn_meth.htmlu%/win32gui__CombineTransform_meth.htmlwG)/win32gui__CommDlgExtendedError_meth.html> /win32gui__CopyIcon_meth.html^_+/win32gui__CreateAcceleratorTable_meth.html=g!/win32gui__CreateBitmap_meth.html$q(/win32gui__CreateBrushIndirect_meth.html| /win32gui__CreateCaret_meth.htmlw+/win32gui__CreateCompatibleBitmap_meth.html'/win32gui__CreateCompatibleDC_meth.html'0/win32gui__CreateDC_meth.htmlWl)/win32gui__CreateDialogIndirect_meth.htmlCQ./win32gui__CreateEllipticRgnIndirect_meth.htmlՈ'/win32gui__CreateFontIndirect_meth.htmlՌ %/win32gui__CreateHatchBrush_meth.htmlՑ3b+/win32gui__CreateIconFromResource_meth.htmlՖ'/win32gui__CreateIconIndirect_meth.html՜&b/win32gui__CreateMenu_meth.htmlՠH'/win32gui__CreatePatternBrush_meth.htmlբPi/win32gui__CreatePen_meth.htmlզ9%/win32gui__CreatePolygonRgn_meth.htmlիKL$/win32gui__CreatePopupMenu_meth.htmlհW*/win32gui__CreateRectRgnIndirect_meth.htmlղn\'/win32gui__CreateRoundRectRgn_meth.htmlնJ8%/win32gui__CreateSolidBrush_meth.htmlվs!/win32gui__CreateWindow_meth.htmlu #/win32gui__CreateWindowEx_meth.html~v"/win32gui__DefWindowProc_meth.htmlt/win32gui__DeleteDC_meth.html|Q/win32gui__DeleteMenu_meth.htmlMY!/win32gui__DeleteObject_meth.html&N+/win32gui__DestroyAccleratorTable_meth.htmlt!/win32gui__DestroyCaret_meth.htmly! /win32gui__DestroyIcon_meth.htmlY /win32gui__DestroyMenu_meth.htmls!"/win32gui__DestroyWindow_meth.htmla/win32gui__DialogBox_meth.htmluW&/win32gui__DialogBoxIndirect_meth.htmlLc+/win32gui__DialogBoxIndirectParam_meth.htmlր/y-/win32gui__DialogBoxIndirectParam_meth_1.htmlփ(#/win32gui__DialogBoxParam_meth.htmlֆ'Q$/win32gui__DispatchMessage_meth.htmlֈxS$/win32gui__DragAcceptFiles_meth.html֋K/win32gui__DragDetect_meth.html֐Oj&/win32gui__DrawAnimatedRects_meth.html֘9|/win32gui__DrawEdge_meth.html֞5w"/win32gui__DrawFocusRect_meth.html֥,&/win32gui__DrawIcon_meth.html֩RS/win32gui__DrawIconEx_meth.html֯%. /win32gui__DrawMenuBar_meth.htmlָS[/win32gui__DrawText_meth.htmlֻ.{/win32gui__DrawTextW_meth.html)/win32gui__Ellipse_meth.htmlEY#/win32gui__EnableMenuItem_meth.html!/win32gui__EnableWindow_meth.html&/win32gui__EndDialog_meth.htmlC/win32gui__EndPaint_meth.htmla@/win32gui__EndPath_meth.html!I%/win32gui__EnumChildWindows_meth.htmlj0%/win32gui__EnumFontFamilies_meth.htmlO /win32gui__EnumPropsEx_meth.htmli &/win32gui__EnumThreadWindows_meth.html R /win32gui__EnumWindows_meth.htmlׂ[g/win32gui__EqualRgn_meth.html׈B!/win32gui__ExtCreatePen_meth.html׌Yv!/win32gui__ExtFloodFill_meth.htmlדO /win32gui__ExtractIcon_meth.htmlיYK"/win32gui__ExtractIconEx_meth.htmlן$/win32gui__ExtTextOut_meth.htmlץ7/win32gui__FillPath_meth.htmlױIY/win32gui__FillRect_meth.html׶"{/win32gui__FillRgn_meth.html׻e/win32gui__FindWindow_meth.html!/win32gui__FindWindowEx_meth.htmlm /win32gui__FlashWindow_meth.html e"/win32gui__FlashWindowEx_meth.htmlnn /win32gui__FlattenPath_meth.html\/win32gui__FrameRect_meth.htmlp</win32gui__FrameRgn_meth.html,il8L t * ? q:e`PMGL-79$/win32gui__GetActiveWindow_meth.html$/win32gui__GetArcDirection_meth.html'/win32gui__GetBkColor_meth.html5 /win32gui__GetBkMode_meth.html@x/win32gui__GetCapture_meth.html8, /win32gui__GetCaretPos_meth.htmld+!/win32gui__GetClassLong_meth.html!/win32gui__GetClassName_meth.htmlN"/win32gui__GetClientRect_meth.html؀_I%/win32gui__GetCurrentObject_meth.html؄(Q)/win32gui__GetCurrentPositionEx_meth.html؈yJ/win32gui__GetCursor_meth.html،C"/win32gui__GetCursorInfo_meth.html؎FK!/win32gui__GetCursorPos_meth.htmlؑF/win32gui__GetDC_meth.htmlؓWv%/win32gui__GetDesktopWindow_meth.htmlؖM.!/win32gui__GetDlgCtrlID_meth.htmlؘ{/win32gui__GetDlgItem_meth.html؜'"/win32gui__GetDlgItemInt_meth.htmlؠ9 #/win32gui__GetDlgItemText_meth.htmlإD'/win32gui__GetDoubleClickTime_meth.htmlةZ/win32gui__GetFocus_meth.htmlثt (/win32gui__GetForegroundWindow_meth.htmlخ$/win32gui__GetGraphicsMode_meth.htmlذ2 /win32gui__GetIconInfo_meth.htmlشH //win32gui__GetLayeredWindowAttributes_meth.htmlعRD/win32gui__GetLayout_meth.htmlؿi/win32gui__GetMapMode_meth.html/win32gui__GetMenu_meth.html'/win32gui__GetMenuDefaultItem_meth.html0` /win32gui__GetMenuInfo_meth.htmlq%/win32gui__GetMenuItemCount_meth.htmll"/win32gui__GetMenuItemID_meth.htmlm$/win32gui__GetMenuItemInfo_meth.htmls&$/win32gui__GetMenuItemRect_meth.htmld!/win32gui__GetMenuState_meth.html}H/win32gui__GetMessage_meth.htmlE*"/win32gui__GetMiterLimit_meth.htmlo5(/win32gui__GetNextDlgGroupItem_meth.html$ &/win32gui__GetNextDlgTabItem_meth.html1~/win32gui__GetObject_meth.html/&"/win32gui__GetObjectType_meth.htmlU3$/win32gui__GetOpenFileName_meth.htmlكS%/win32gui__GetOpenFileNameW_meth.htmlي[7/win32gui__GetParent_meth.htmlٞ/win32gui__GetPath_meth.html١.9/win32gui__GetPixel_meth.html٦g"$/win32gui__GetPolyFillMode_meth.html٫ /win32gui__GetRgnBox_meth.htmlٯG/win32gui__GetROP2_meth.htmlٳac%/win32gui__GetSaveFileNameW_meth.htmlٷDY"/win32gui__GetScrollInfo_meth.html.#/win32gui__GetStockObject_meth.htmlKg&/win32gui__GetStretchBltMode_meth.html2-/win32gui__GetSubMenu_meth.html_ /win32gui__GetSysColor_meth.htmlo%/win32gui__GetSysColorBrush_meth.html}["/win32gui__GetSystemMenu_meth.htmlXc!/win32gui__GetTextAlign_meth.html;*/win32gui__GetTextCharacterExtra_meth.htmlPD!/win32gui__GetTextColor_meth.htmlW)/win32gui__GetTextExtentPoint32_meth.htmlk! /win32gui__GetTextFace_meth.html ##/win32gui__GetTextMetrics_meth.htmlڂ/;!/win32gui__GetUpdateRgn_meth.htmlڄj%/win32gui__GetViewportExtEx_meth.htmlڋ %/win32gui__GetViewportOrgEx_meth.htmlڏ>/win32gui__GetWindow_meth.htmlڒM /win32gui__GetWindowDC_meth.htmlږN<#/win32gui__GetWindowExtEx_meth.htmlښ "/win32gui__GetWindowLong_meth.htmlڞ #/win32gui__GetWindowOrgEx_meth.htmlڡ4'/win32gui__GetWindowPlacement_meth.htmlڤF5"/win32gui__GetWindowRect_meth.htmlڭ{6!/win32gui__GetWindowRgn_meth.htmlڱ17$/win32gui__GetWindowRgnBox_meth.htmlڶhT"/win32gui__GetWindowText_meth.htmlڼ/win32gui__SaveDC_meth.html}E#/win32gui__ScreenToClient_meth.htmlB#/win32gui__ScrollWindowEx_meth.htmlV/!/win32gui__SelectObject_meth.html /win32gui__SendMessage_meth.html'/win32gui__SendMessageTimeout_meth.html2t/win32gui__set_logger_meth.html&f$/win32gui__SetActiveWindow_meth.html n$/win32gui__SetArcDirection_meth.htmlzp/win32gui__SetBkColor_meth.htmlj</win32gui__SetBkMode_meth.html&D/win32gui__SetCapture_meth.htmlރj( /win32gui__SetCaretPos_meth.htmlކ,/win32gui__SetCursor_meth.htmlމ>M"/win32gui__SetDlgItemInt_meth.htmlތ @#/win32gui__SetDlgItemText_meth.htmlޑKd'/win32gui__SetDoubleClickTime_meth.htmlޖ/\/win32gui__SetFocus_meth.htmlޙ u(/win32gui__SetForegroundWindow_meth.htmlޜz$/win32gui__SetGraphicsMode_meth.htmlޞz//win32gui__SetLayeredWindowAttributes_meth.htmlޤ /win32gui__SetLayout_meth.htmlޫ:/win32gui__SetMapMode_meth.htmlޯS/win32gui__SetMenu_meth.html޴S'/win32gui__SetMenuDefaultItem_meth.html޷cR /win32gui__SetMenuInfo_meth.html޻5'/win32gui__SetMenuItemBitmaps_meth.html6+$/win32gui__SetMenuItemInfo_meth.htmla&"/win32gui__SetMiterLimit_meth.html:/win32gui__SetParent_meth.htmlAw/win32gui__SetPixel_meth.html8IZ[l8Cm # ^ 3w4lbPMGL19;/win32gui__SetPixelV_meth.htmlq$/win32gui__SetPolyFillMode_meth.htmlr/win32gui__SetRectRgn_meth.htmlyk/win32gui__SetROP2_meth.htmld0"/win32gui__SetScrollInfo_meth.htmlj&/win32gui__SetStretchBltMode_meth.html~l!/win32gui__SetTextAlign_meth.htmljf*/win32gui__SetTextCharacterExtra_meth.html߁Pk!/win32gui__SetTextColor_meth.html߆;g%/win32gui__SetViewportExtEx_meth.htmlߋ"@%/win32gui__SetViewportOrgEx_meth.htmlߐb#/win32gui__SetWindowExtEx_meth.htmlߕu"/win32gui__SetWindowLong_meth.htmlߛd#/win32gui__SetWindowOrgEx_meth.htmlߡw'/win32gui__SetWindowPlacement_meth.htmlߦy!/win32gui__SetWindowPos_meth.html߫;!/win32gui__SetWindowRgn_meth.html߲J7"/win32gui__SetWindowText_meth.html߹&/win32gui__SetWorldTransform_meth.html߻B%/win32gui__Shell_NotifyIcon_meth.html]/win32gui__ShowCaret_meth.html|*/win32gui__ShowWindow_meth.html&k/win32gui__StretchBlt_meth.html9&/win32gui__StrokeAndFillPath_meth.htmlJ*/win32gui__StrokePath_meth.htmlt)/win32gui__SystemParametersInfo_meth.htmlyi#/win32gui__TrackPopupMenu_meth.htmlb)/win32gui__TranslateAccelerator_meth.htmlN%/win32gui__TranslateMessage_meth.htmlOV#/win32gui__TransparentBlt_meth.html% $/win32gui__UnregisterClass_meth.html/91/win32gui__UnregisterDeviceNotification_meth.htmlh (/win32gui__UpdateLayeredWindow_meth.htmlsn!/win32gui__UpdateWindow_meth.htmla^!/win32gui__ValidateRect_meth.html?M /win32gui__ValidateRgn_meth.html  /win32gui__WaitMessage_meth.html/win32gui__WidenPath_meth.html1+!/win32gui__WindowFromDC_meth.html\E$/win32gui__WindowFromPoint_meth.html!+/win32gui_CLR_NONE.html_/win32gui_ILC_COLOR.htmlԭ:b/win32gui_ILC_COLOR16.htmlԯh/win32gui_ILC_COLOR24.htmlԱh/win32gui_ILC_COLOR32.htmlԲlh/win32gui_ILC_COLOR4.htmlԴTe/win32gui_ILC_COLOR8.htmlԶ9e/win32gui_ILC_COLORDDB.htmlԸk/win32gui_ILC_MASK.htmlԺ _/win32gui_ILD_BLEND.htmlԻhb/win32gui_ILD_BLEND25.htmlԽJh/win32gui_ILD_BLEND50.htmlԿ2h/win32gui_ILD_FOCUS.htmlb/win32gui_ILD_MASK.html|_/win32gui_ILD_NORMAL.html[e/win32gui_ILD_SELECTED.html@k/win32gui_ILD_TRANSPARENT.html+t/win32gui_IMAGE_BITMAP.htmlk/win32gui_IMAGE_CURSOR.html k/win32gui_IMAGE_ICON.htmlue"/win32gui_LR_CREATEDIBSECTION.htmlֱ/win32gui_LR_DEFAULTCOLOR.htmlֳt/win32gui_LR_DEFAULTSIZE.htmlֵ q/win32gui_LR_LOADFROMFILE.htmlֶ~t!/win32gui_LR_LOADMAP3DCOLORS.htmlָr}!/win32gui_LR_LOADTRANSPARENT.htmlֺo}/win32gui_LR_MONOCHROME.htmlּln/win32gui_LR_SHARED.html־Zb/win32gui_LR_VGACOLOR.html}/win32gui_NIIF_NONE.htmlٯ;b/win32gui_NIIF_NOSOUND.htmlٱk/win32gui_NIIF_WARNING.htmlٳk/win32gui_NIM_ADD.htmlٴs|/win32gui_NIM_DELETE.htmlٶo /win32gui_NIM_MODIFY.htmlٸy /win32gui_NIM_SETFOCUS.htmlٻ/win32gui_NIM_SETVERSION.htmlٽq/win32gui_TPM_BOTTOMALIGN.htmlt/win32gui_TPM_CENTERALIGN.html t/win32gui_TPM_LEFTALIGN.htmln/win32gui_TPM_LEFTBUTTON.htmlnq/win32gui_TPM_NONOTIFY.html_k/win32gui_TPM_RETURNCMD.htmlJn/win32gui_TPM_RIGHTALIGN.html8q/win32gui_TPM_RIGHTBUTTON.html)t/win32gui_TPM_TOPALIGN.htmlk/win32gui_TPM_VCENTERALIGN.htmlw/win32help.htmlE(/win32help__HH_AKLINK_meth.htmlLH"/win32help__HH_FTS_QUERY_meth.htmlZ/win32help__HH_POPUP_meth.htmlnB /win32help__HH_WINTYPE_meth.html0N /win32help__HHN_NOTIFY_meth.html~N/win32help__HHNTRACK_meth.htmlLB/win32help__HtmlHelp_meth.html5/win32help__NMHDR_meth.htmlC0/win32help__WinHelp_meth.htmls}/win32help_debug.htmlLZ[l,s  h  V ^"YjPMGLI:</win32help_HH_ALINK_LOOKUP.htmlλ^/win32help_HH_CLOSE_ALL.htmlνu- /win32help_HH_DISPLAY_INDEX.html"!/win32help_HH_DISPLAY_SEARCH.html3%/win32help_HH_DISPLAY_TEXT_POPUP.htmlG?/win32help_HH_DISPLAY_TOC.html /win32help_HH_DISPLAY_TOPIC.htmlx /win32help_HH_ENUM_CATEGORY.html 6#/win32help_HH_ENUM_CATEGORY_IT.html?L!/win32help_HH_ENUM_INFO_TYPE.html :(/win32help_HH_FTS_DEFAULT_PROXIMITY.htmlE!/win32help_HH_GET_LAST_ERROR.htmlU&!/win32help_HH_GET_WIN_HANDLE.html{{/win32help_HH_GET_WIN_TYPE.htmlvu+/win32help_HH_GPROPID_CONTENT_LANGUAGE.htmlk>)/win32help_HH_GPROPID_CURRENT_SUBSET.html)('/win32help_HH_GPROPID_SINGLETHREAD.htmlQ5)/win32help_HH_GPROPID_TOOLBAR_MARGIN.htmlM&/win32help_HH_GPROPID_UI_LANGUAGE.htmlS!/win32help_HH_HELP_CONTEXT.htmlt/win32help_HH_HELP_FINDER.html/win32help_HH_INITIALIZE.html !/win32help_HH_KEYWORD_LOOKUP.html"{"/win32help_HH_MAX_TABS_CUSTOM.html~&/win32help_HH_PRETRANSLATEMESSAGE.html1/win32help_HH_RESERVED1.htmlLl/win32help_HH_RESERVED2.html8l/win32help_HH_RESERVED3.html$l"/win32help_HH_RESET_IT_FILTER.html/'/win32help_HH_SET_EXCLUSIVE_FILTER.html?^&/win32help_HH_SET_GLOBAL_PROPERTY.html<'/win32help_HH_SET_INCLUSIVE_FILTER.htmlπY\ /win32help_HH_SET_INFO_TYPE.htmlσ5/win32help_HH_SET_WIN_TYPE.htmlυEu/win32help_HH_SYNC.htmlχ:]/win32help_HH_TAB_AUTHOR.htmlωo/win32help_HH_TAB_CONTENTS.htmlϋu#/win32help_HH_TAB_CUSTOM_FIRST.htmlό{"/win32help_HH_TAB_CUSTOM_LAST.htmlώ|~ /win32help_HH_TAB_FAVORITES.htmlϐzx/win32help_HH_TAB_HISTORY.htmlϒrr/win32help_HH_TAB_INDEX.htmlϔdl/win32help_HH_TAB_SEARCH.htmlϖPo&/win32help_HH_TP_HELP_CONTEXTMENU.htmlϘ??"/win32help_HH_TP_HELP_WM_HELP.htmlϚ~//win32help_HH_UNINITIALIZE.htmlϝ-/win32help_HHACT_BACK.htmlϟ@f/win32help_HHACT_CONTRACT.htmlϡ&r/win32help_HHACT_CUSTOMIZE.htmlϣu/win32help_HHACT_EXPAND.htmlϥ l/win32help_HHACT_FORWARD.htmlϦyo/win32help_HHACT_HIGHLIGHT.htmlϨhu/win32help_HHACT_HOME.htmlϪ]f/win32help_HHACT_JUMP1.htmlϬCi/win32help_HHACT_JUMP2.htmlϮ,i/win32help_HHACT_LAST_ENUM.htmlϰu/win32help_HHACT_NOTES.htmlϲ i/win32help_HHACT_OPTIONS.htmlϳso/win32help_HHACT_PRINT.htmlϵbi/win32help_HHACT_REFRESH.htmlϷKo/win32help_HHACT_STOP.htmlϹ:f/win32help_HHACT_SYNC.htmlϻ f"/win32help_HHACT_TAB_CONTENTS.htmlϽ~#/win32help_HHACT_TAB_FAVORITES.htmlϿ!/win32help_HHACT_TAB_HISTORY.html{/win32help_HHACT_TAB_INDEX.htmlu /win32help_HHACT_TAB_SEARCH.htmlux/win32help_HHACT_TOC_NEXT.htmlmr/win32help_HHACT_TOC_PREV.html_r/win32help_HHACT_ZOOM.htmlQf/win32help_HHN_FIRST.html7c/win32help_HHN_LAST.html`/win32help_HHN_NAVCOMPLETE.htmlzu/win32help_HHN_TRACK.htmloc!/win32help_HHN_WINDOW_CREATE.htmlR{!/win32help_HHWIN_BUTTON_BACK.htmlM'/win32help_HHWIN_BUTTON_BROWSE_BCK.htmlS'/win32help_HHWIN_BUTTON_BROWSE_FWD.htmlo%/win32help_HHWIN_BUTTON_CONTENTS.html #/win32help_HHWIN_BUTTON_EXPAND.html!&/win32help_HHWIN_BUTTON_FAVORITES.html8$/win32help_HHWIN_BUTTON_FORWARD.htmlQ$/win32help_HHWIN_BUTTON_HISTORY.htmlc!/win32help_HHWIN_BUTTON_HOME.htmlv"/win32help_HHWIN_BUTTON_INDEX.html| "/win32help_HHWIN_BUTTON_JUMP1.html ~"/win32help_HHWIN_BUTTON_JUMP2.html~"/win32help_HHWIN_BUTTON_NOTES.html $/win32help_HHWIN_BUTTON_OPTIONS.html"/win32help_HHWIN_BUTTON_PRINT.html$ $/win32help_HHWIN_BUTTON_REFRESH.html.#/win32help_HHWIN_BUTTON_SEARCH.html@!/win32help_HHWIN_BUTTON_STOP.htmlP!/win32help_HHWIN_BUTTON_SYNC.htmlV%/win32help_HHWIN_BUTTON_TOC_NEXT.html\%/win32help_HHWIN_BUTTON_TOC_PREV.htmlc!/win32help_HHWIN_BUTTON_ZOOM.htmlЁj{!/win32help_HHWIN_DEF_BUTTONS.htmlЃe{#/win32help_HHWIN_NAVTAB_BOTTOM.htmlЅ`32help_debug.htmlLZ[l#O v ( f Az!UocPMGL*;=!/win32help_HHWIN_NAVTAB_LEFT.htmlЇa{ /win32help_HHWIN_NAVTAB_TOP.htmlЉ\x#/win32help_HHWIN_PARAM_CUR_TAB.htmlЋT%/win32help_HHWIN_PARAM_EXPANSION.htmlЍe$/win32help_HHWIN_PARAM_EXSTYLES.htmlЏ})/win32help_HHWIN_PARAM_HISTORY_COUNT.htmlВ!%/win32help_HHWIN_PARAM_INFOTYPES.htmlД0%/win32help_HHWIN_PARAM_NAV_WIDTH.htmlЖH&/win32help_HHWIN_PARAM_PROPERTIES.htmlИ] /win32help_HHWIN_PARAM_RECT.htmlКz%/win32help_HHWIN_PARAM_SHOWSTATE.htmlН"/win32help_HHWIN_PARAM_STYLES.htmlП $/win32help_HHWIN_PARAM_TABORDER.htmlС!"/win32help_HHWIN_PARAM_TABPOS.htmlУ3 $/win32help_HHWIN_PARAM_TB_FLAGS.htmlХ=$/win32help_HHWIN_PROP_AUTO_SYNC.htmlЧS.'/win32help_HHWIN_PROP_CHANGE_TITLE.htmlЪ4/win32help_HHWIN_PROP_MENU.htmlЬ5y'/win32help_HHWIN_PROP_NAV_ONLY_WIN.htmlЮ.3%/win32help_HHWIN_PROP_NO_TOOLBAR.htmlаa)/win32help_HHWIN_PROP_NODEF_EXSTYLES.htmlвS'/win32help_HHWIN_PROP_NODEF_STYLES.htmlеRB$/win32help_HHWIN_PROP_NOTB_TEXT.htmlи%/win32help_HHWIN_PROP_NOTITLEBAR.htmlк2 /win32help_HHWIN_PROP_ONTOP.htmlмE$/win32help_HHWIN_PROP_POST_QUIT.htmlоL/(/win32help_HHWIN_PROP_TAB_ADVSEARCH.html{ +/win32help_HHWIN_PROP_TAB_AUTOHIDESHOW.htmlD&/win32help_HHWIN_PROP_TAB_CUSTOM1.html_&/win32help_HHWIN_PROP_TAB_CUSTOM2.htmlz&/win32help_HHWIN_PROP_TAB_CUSTOM3.html&/win32help_HHWIN_PROP_TAB_CUSTOM4.html0&/win32help_HHWIN_PROP_TAB_CUSTOM5.htmlK&/win32help_HHWIN_PROP_TAB_CUSTOM6.htmlf&/win32help_HHWIN_PROP_TAB_CUSTOM7.html&/win32help_HHWIN_PROP_TAB_CUSTOM8.html&/win32help_HHWIN_PROP_TAB_CUSTOM9.html7(/win32help_HHWIN_PROP_TAB_FAVORITES.htmlR<&/win32help_HHWIN_PROP_TAB_HISTORY.html4%/win32help_HHWIN_PROP_TAB_SEARCH.htmlB0#/win32help_HHWIN_PROP_TRACKING.htmlr(#/win32help_HHWIN_PROP_TRI_PANE.html#/win32help_HHWIN_PROP_USER_POS.html0?/win32help_HHWIN_TB_MARGIN.htmlo/win32help_IDTB_BACK.htmlԀdc /win32help_IDTB_BROWSE_BACK.htmlԂGx/win32help_IDTB_BROWSE_FWD.htmlԄ?u/win32help_IDTB_CONTENTS.htmlԆ4~/win32help_IDTB_CONTRACT.htmlԈ2o/win32help_IDTB_CUSTOMIZE.htmlԊ!r/win32help_IDTB_EXPAND.htmlԌi/win32help_IDTB_FAVORITES.htmlԍ|/win32help_IDTB_FORWARD.htmlԏ}l/win32help_IDTB_HISTORY.htmlԑi{/win32help_IDTB_HOME.htmlԓdc/win32help_IDTB_INDEX.htmlԕGu/win32help_IDTB_JUMP1.htmlԗ"/win32inet__InternetOpen_meth.htmlQF%/win32inet__InternetOpenUrl_meth.html`)/win32inet__InternetQueryOption_meth.htmlwj&/win32inet__InternetReadFile_meth.htmlab'/win32inet__InternetSetCookie_meth.htmlC'/win32inet__InternetSetOption_meth.htmlIp'/win32inet__InternetWriteFile_meth.html9u+/win32inet__SetUrlCacheEntryGroup_meth.html.2//win32inet__SetUrlCacheGroupAttribute_meth.html`9/win32inet__WinHttpGetDefaultProxyConfiguration_meth.html}M;/win32inet__WinHttpGetIEProxyConfigForCurrentUser_meth.htmlJ+/win32inet__WinHttpGetProxyForUrl_meth.htmlQC!/win32inet__WinHttpOpen_meth.html"/win32job.htmlh-/win32job__AssignProcessToJobObject_meth.html6$/win32job__CreateJobObject_meth.htmlKn#/win32job__IsProcessInJob_meth.html9*"/win32job__OpenJobObject_meth.htmlcq./win32job__QueryInformationJobObject_meth.htmlT!,/win32job__SetInformationJobObject_meth.htmlua'/win32job__TerminateJobObject_meth.htmlVl*/win32job__UserHandleGrantAccess_meth.htmlBx$/win32job_JOB_OBJECT_ALL_ACCESS.htmla(/win32job_JOB_OBJECT_ASSIGN_PROCESS.htmlg1/win32job_JOB_OBJECT_BASIC_LIMIT_VALID_FLAGS.htmly-4/win32job_JOB_OBJECT_EXTENDED_LIMIT_VALID_FLAGS.html&9./win32job_JOB_OBJECT_LIMIT_ACTIVE_PROCESS.html_$(/win32job_JOB_OBJECT_LIMIT_AFFINITY.html,/win32job_JOB_OBJECT_LIMIT_BREAKAWAY_OK.html:/win32job_JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION.html3H*/win32job_JOB_OBJECT_LIMIT_JOB_MEMORY.html{(/win32job_JOB_OBJECT_LIMIT_JOB_TIME.html1/win32job_JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE.html%-1/win32job_JOB_OBJECT_LIMIT_PRESERVE_JOB_TIME.htmlR-./win32job_JOB_OBJECT_LIMIT_PRIORITY_CLASS.html$./win32job_JOB_OBJECT_LIMIT_PROCESS_MEMORY.htmlՀ#$,/win32job_JOB_OBJECT_LIMIT_PROCESS_TIME.htmlՂG0/win32job_JOB_OBJECT_LIMIT_SCHEDULING_CLASS.htmlՄe*3/win32job_JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK.htmlՇ3+/win32job_JOB_OBJECT_LIMIT_VALID_FLAGS.htmlՉB*/win32job_JOB_OBJECT_LIMIT_WORKINGSET.htmlՋ]3/win32job_JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESS.htmlՍu32/win32job_JOB_OBJECT_MSG_ACTIVE_PROCESS_LIMIT.htmlՐ(01/win32job_JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO.htmlՒX--/win32job_JOB_OBJECT_MSG_END_OF_JOB_TIME.htmlՕ!1/win32job_JOB_OBJECT_MSG_END_OF_PROCESS_TIME.html՗&-*/win32job_JOB_OBJECT_MSG_EXIT_PROCESS.htmlՙS./win32job_JOB_OBJECT_MSG_JOB_MEMORY_LIMIT.html՛k$)/win32job_JOB_OBJECT_MSG_NEW_PROCESS.html՞2/win32job_JOB_OBJECT_MSG_PROCESS_MEMORY_LIMIT.htmlՠ$0,/win32job_JOB_OBJECT_POST_AT_END_OF_JOB.htmlբT/win32job_JOB_OBJECT_QUERY.htmlդrw0/win32job_JOB_OBJECT_SECURITY_FILTER_TOKENS.htmlզi*+/win32job_JOB_OBJECT_SECURITY_NO_ADMIN.htmlթ-/win32job_JOB_OBJECT_SECURITY_ONLY_TOKEN.htmlի.!3/win32job_JOB_OBJECT_SECURITY_RESTRICTED_TOKEN.htmlխO3./win32job_JOB_OBJECT_SECURITY_VALID_FLAGS.htmlհ$(/win32job_JOB_OBJECT_SET_ATTRIBUTES.htmlղ&1/win32job_JOB_OBJECT_SET_SECURITY_ATTRIBUTES.htmlմ8-#/win32job_JOB_OBJECT_TERMINATE.htmlնe1/win32job_JOB_OBJECT_TERMINATE_AT_END_OF_JOB.htmlոh-(/win32job_JOB_OBJECT_UI_VALID_FLAGS.htmlջ%/win32job_JOB_OBJECT_UILIMIT_ALL.htmlս' )/win32job_JOB_OBJECT_UILIMIT_DESKTOP.htmlտ01/win32job_JOB_OBJECT_UILIMIT_DISPLAYSETTINGS.htmlE--/win32job_JOB_OBJECT_UILIMIT_EXITWINDOWS.htmlr!-/win32job_JOB_OBJECT_UILIMIT_GLOBALATOMS.html!)/win32job_JOB_OBJECT_UILIMIT_HANDLES.html4&/win32job_JOB_OBJECT_UILIMIT_NONE.htmlI //win32job_JOB_OBJECT_UILIMIT_READCLIPBOARD.htmlU'2/win32job_JOB_OBJECT_UILIMIT_SYSTEMPARAMETERS.html|00/win32job_JOB_OBJECT_UILIMIT_WRITECLIPBOARD.html,*:/win32job_JobObjectAssociateCompletionPortInformation.htmlVH2/win32job_JobObjectBasicAccountingInformation.html07/win32job_JobObjectBasicAndIoAccountingInformation.htmlN?-/win32job_JobObjectBasicLimitInformation.html !*/win32job_JobObjectBasicProcessIdList.html._InternetGoOnline_meth.htmlih,0C 9   MPMGLQ=?+/win32job_JobObjectBasicUIRestrictions.htmlF//win32job_JobObjectEndOfJobTimeInformation.htmla'0/win32job_JobObjectExtendedLimitInformation.html*)/win32job_JobObjectJobSetInformation.html20/win32job_JobObjectSecurityLimitInformation.htmlG*$/win32job_MaxJobObjectInfoClass.htmlz /win32lz.html)/win32lz__Close_meth.html:Q/win32lz__Copy_meth.html >#/win32lz__GetExpandedName_meth.htmlI /win32lz__Init_meth.htmli/win32lz__OpenFile_meth.html/win32net.html0{!/win32net__NetFileClose_meth.html /win32net__NetFileEnum_meth.htmlK#/win32net__NetFileGetInfo_meth.htmlQ$/win32net__NetGetAnyDCName_meth.htmlRc!/win32net__NetGetDCName_meth.html5D*/win32net__NetGetJoinInformation_meth.htmly /win32net__NetGroupAdd_meth.htmls$/win32net__NetGroupAddUser_meth.htmlx /win32net__NetGroupDel_meth.html$/win32net__NetGroupDelUser_meth.html&!/win32net__NetGroupEnum_meth.html;1$/win32net__NetGroupGetInfo_meth.htmllc%/win32net__NetGroupGetUsers_meth.htmlOW$/win32net__NetGroupSetInfo_meth.html&+%/win32net__NetGroupSetUsers_meth.htmlQY%/win32net__NetLocalGroupAdd_meth.html* ,/win32net__NetLocalGroupAddMembers_meth.htmlJJ%/win32net__NetLocalGroupDel_meth.html$,/win32net__NetLocalGroupDelMembers_meth.html8q&/win32net__NetLocalGroupEnum_meth.html)T)/win32net__NetLocalGroupGetInfo_meth.html},/win32net__NetLocalGroupGetMembers_meth.html ")/win32net__NetLocalGroupSetInfo_meth.html/X,/win32net__NetLocalGroupSetMembers_meth.html )/win32net__NetMessageBufferSend_meth.htmlm&/win32net__NetMessageNameAdd_meth.htmlX&/win32net__NetMessageNameDel_meth.htmlWa'/win32net__NetMessageNameEnum_meth.html8h-/win32net__NetServerComputerNameAdd_meth.html -/win32net__NetServerComputerNameDel_meth.html%&/win32net__NetServerDiskEnum_meth.html+"/win32net__NetServerEnum_meth.html?%/win32net__NetServerGetInfo_meth.htmlRy%/win32net__NetServerSetInfo_meth.htmlK"/win32net__NetSessionDel_meth.htmlMK#/win32net__NetSessionEnum_meth.html&/win32net__NetSessionGetInfo_meth.html /win32net__NetShareAdd_meth.html* "/win32net__NetShareCheck_meth.html5, /win32net__NetShareDel_meth.htmlaK!/win32net__NetShareEnum_meth.html,$/win32net__NetShareGetInfo_meth.html@a$/win32net__NetShareSetInfo_meth.html!v%/win32net__NetStatisticsGet_meth.html8/win32net__NetUseAdd_meth.htmlOK/win32net__NetUseDel_meth.html/win32net__NetUseEnum_meth.html)&"/win32net__NetUseGetInfo_meth.htmlO /win32net__NetUserAdd_meth.html\*/win32net__NetUserChangePassword_meth.html]u/win32net__NetUserDel_meth.htmlRv /win32net__NetUserEnum_meth.htmlH(%/win32net__NetUserGetGroups_meth.htmlpP#/win32net__NetUserGetInfo_meth.html@^*/win32net__NetUserGetLocalGroups_meth.htmlQ%/win32net__NetUserModalsGet_meth.htmlos%/win32net__NetUserModalsSet_meth.htmlbI#/win32net__NetUserSetInfo_meth.html+5$/win32net__NetValidateName_meth.html`A./win32net__NetValidatePasswordPolicy_meth.html!H$/win32net__NetWkstaGetInfo_meth.htmli $/win32net__NetWkstaSetInfo_meth.htmlv)/win32net__NetWkstaTransportAdd_meth.html )/win32net__NetWkstaTransportDel_meth.html*/win32net__NetWkstaTransportEnum_meth.html\%/win32net__NetWkstaUserEnum_meth.htmlz /win32pdh.html+r/win32pdh__AddCounter_meth.html &/win32pdh__AddEnglishCounter_meth.html:?#/win32pdh__BrowseCounters_meth.htmlyf/win32pdh__CloseQuery_meth.html_N%/win32pdh__CollectQueryData_meth.html-j#/win32pdh__ConnectMachine_meth.htmlY$/win32pdh__EnumObjectItems_meth.htmlp' /win32pdh__EnumObjects_meth.html9&/win32pdh__ExpandCounterPath_meth.htmlPl#/win32pdh__GetCounterInfo_meth.html@-/win32pdh__GetFormattedCounterValue_meth.htmlwb*/win32pdh__LookupPerfIndexByName_meth.htmlY**/win32pdh__LookupPerfNameByIndex_meth.html*$/win32pdh__MakeCounterPath_meth.html-\/win32pdh__OpenQuery_meth.html k%/win32pdh__ParseCounterPath_meth.htmltE&/win32pdh__ParseInstanceName_meth.html9F"/win32pdh__RemoveCounter_meth.htmlp*/win32pdh__SetCounterScaleFactor_meth.htmlo_!/win32pdh__ValidatePath_meth.htmlNV/win32pipe.htmlq#/win32pipe__CallNamedPipe_meth.html$!&/win32pipe__ConnectNamedPipe_meth.htmlE.%/win32pipe__CreateNamedPipe_meth.htmls$ /win32pipe__CreatePipe_meth.htmlT)/win32pipe__DisconnectNamedPipe_meth.htmlkp"/win32pipe__FdCreatePipe_meth.html[1/win32pipe__GetNamedPipeClientProcessId_meth.htmlk+1/win32pipe__GetNamedPipeClientSessionId_meth.html+-/win32pipe__GetNamedPipeHandleState_meth.htmlAH&/win32pipe__GetNamedPipeInfo_meth.html d1/win32pipe__GetNamedPipeServerProcessId_meth.htmlm 1/win32pipe__GetNamedPipeServerSessionId_meth.html ')/win32pipe__GetOverlappedResult_meth.html4~#/win32pipe__PeekNamedPipe_meth.html2u/win32pipe__popen2_meth.html#/win32pipe__popen3_meth.html5x/win32pipe__popen4_meth.html-/win32pipe__popen_meth.html'k-/win32pipe__SetNamedPipeHandleState_meth.html>.'/win32pipe__TransactNamedPipe_meth.htmll]#/win32pipe__WaitNamedPipe_meth.htmlIT/win32pipe_NMPWAIT_NOWAIT.htmlپrr(/win32pipe_NMPWAIT_USE_DEFAULT_WAIT.htmld$/win32pipe_NMPWAIT_WAIT_FOREVER.htmlt"/win32pipe_PIPE_ACCESS_DUPLEX.html~#/win32pipe_PIPE_ACCESS_INBOUND.htmlۀ$/win32pipe_PIPE_ACCESS_OUTBOUND.htmlۂ/win32pipe_PIPE_NOWAIT.htmlۄ"i"/win32pipe_PIPE_READMODE_BYTE.htmlۆ ~%/win32pipe_PIPE_READMODE_MESSAGE.htmlۈ /win32pipe_PIPE_TYPE_BYTE.htmlۊr!/win32pipe_PIPE_TYPE_MESSAGE.htmlی{(/win32pipe_PIPE_UNLIMITED_INSTANCES.htmlۍ}/win32pipe_PIPE_WAIT.htmlې c/win32print.html#/win32print__AbortDoc_meth.html\#/win32print__AbortPrinter_meth.htmly /win32print__AddForm_meth.html./win32print__AddJob_meth.html2s!/win32print__AddPrinter_meth.html%)+/win32print__AddPrinterConnection_meth.htmlN<#/win32print__ClosePrinter_meth.html 8!/win32print__DeleteForm_meth.htmlBQ$/win32print__DeletePrinter_meth.html./win32print__DeletePrinterConnection_meth.html)T*/win32print__DeletePrinterDriver_meth.html}_,/win32print__DeletePrinterDriverEx_meth.html\^)/win32print__DeviceCapabilities_meth.html:')/win32print__DocumentProperties_meth.htmla./win32print__EndDoc_meth.htmly$/win32print__EndDocPrinter_meth.html\/win32print__EndPage_meth.htmldm%/win32print__EndPagePrinter_meth.htmlQ /win32print__EnumForms_meth.htmlY/win32print__EnumJobs_meth.htmlj#/win32print__EnumMonitors_meth.htmlo+ /win32print__EnumPorts_meth.html)/win32print__EnumPrinterDrivers_meth.html2>#/win32print__EnumPrinters_meth.htmlpY2/win32print__EnumPrintProcessorDatatypes_meth.htmlI[*/win32print__EnumPrintProcessors_meth.html${#/win32print__FlushPrinter_meth.htmlU(/win32print__GetDefaultPrinter_meth.htmlt<)/win32print__GetDefaultPrinterW_meth.html0 $/win32print__GetDeviceCaps_meth.html< /win32print__GetForm_meth.htmlFl/win32print__GetJob_meth.html2]!/win32print__GetPrinter_meth.htmlQ0/win32print__GetPrinterDriverDirectory_meth.html`b1/win32print__GetPrintProcessorDirectory_meth.htmlBd"/win32print__OpenPrinter_meth.html&r"/win32print__ScheduleJob_meth.html(/win32print__SetDefaultPrinter_meth.html'%)/win32print__SetDefaultPrinterW_meth.htmlL/win32print__SetForm_meth.htmlZz/win32print__SetJob_meth.htmlT!/win32print__SetPrinter_meth.htmlqm/win32print__StartDoc_meth.html^Y&/win32print__StartDocPrinter_meth.html7o /win32print__StartPage_meth.html&uGoOnline_meth.htmlih $ X Z ~.R[PMGL=?A'/win32print__StartPagePrinter_meth.html@#/win32print__WritePrinter_meth.html[ /win32process.html1 */win32process__AttachThreadInput_meth.htmlg&/win32process__beginthreadex_meth.htmlhY&/win32process__CreateProcess_meth.htmlAX,/win32process__CreateProcessAsUser_meth.html|+/win32process__CreateRemoteThread_meth.html&/win32process__EnumProcesses_meth.html+K+/win32process__EnumProcessModules_meth.htmlvm-/win32process__EnumProcessModulesEx_meth.htmlc4$/win32process__ExitProcess_meth.htmll*/win32process__GetCurrentProcess_meth.htmlU,/win32process__GetCurrentProcessId_meth.htmlXa+/win32process__GetExitCodeProcess_meth.html9$*/win32process__GetExitCodeThread_meth.html] (/win32process__GetGuiResources_meth.html}J,/win32process__GetModuleFileNameEx_meth.htmlG)/win32process__GetPriorityClass_meth.html_//win32process__GetProcessAffinityMask_meth.html|a%/win32process__GetProcessId_meth.html]6-/win32process__GetProcessIoCounters_meth.html%-/win32process__GetProcessMemoryInfo_meth.html8'0/win32process__GetProcessPriorityBoost_meth.html_v5/win32process__GetProcessShutdownParameters_meth.htmlU (/win32process__GetProcessTimes_meth.htmlb */win32process__GetProcessVersion_meth.html0/win32process__GetProcessWindowStation_meth.htmlm1/win32process__GetProcessWorkingSetSize_meth.htmltG'/win32process__GetStartupInfo_meth.html;1//win32process__GetThreadIOPendingFlag_meth.htmllb*/win32process__GetThreadPriority_meth.htmlN //win32process__GetThreadPriorityBoost_meth.htmlno'/win32process__GetThreadTimes_meth.html]81/win32process__GetWindowThreadProcessId_meth.html8'/win32process__IsWow64Process_meth.htmlMq*/win32process__ReadProcessMemory_meth.html>%/win32process__ResumeThread_meth.html>\)/win32process__SetPriorityClass_meth.htmlr//win32process__SetProcessAffinityMask_meth.html 0/win32process__SetProcessPriorityBoost_meth.html`5/win32process__SetProcessShutdownParameters_meth.htmlp91/win32process__SetProcessWorkingSetSize_meth.html)e./win32process__SetThreadAffinityMask_meth.htmlY0/win32process__SetThreadIdealProcessor_meth.htmlg!*/win32process__SetThreadPriority_meth.htmli//win32process__SetThreadPriorityBoost_meth.htmlqY$/win32process__STARTUPINFO_meth.htmlJ]&/win32process__SuspendThread_meth.html' )/win32process__TerminateProcess_meth.html0&'/win32process__VirtualAllocEx_meth.htmlV&/win32process__VirtualFreeEx_meth.htmlV+/win32process__WriteProcessMemory_meth.htmlu./win32process_ABOVE_NORMAL_PRIORITY_CLASS.htmlé ./win32process_BELOW_NORMAL_PRIORITY_CLASS.html; ,/win32process_CREATE_BREAKAWAY_FROM_JOB.htmlŧ+,/win32process_CREATE_DEFAULT_ERROR_MODE.htmlũAe%/win32process_CREATE_NEW_CONSOLE.htmlŴE+/win32process_CREATE_NEW_PROCESS_GROUP.htmlŷMD#/win32process_CREATE_NO_WINDOW.htmlŽ{3/win32process_CREATE_PRESERVE_CODE_AUTHZ_LEVEL.htmlſ +*/win32process_CREATE_SEPARATE_WOW_VDM.html79(/win32process_CREATE_SHARED_WOW_VDM.htmlp(#/win32process_CREATE_SUSPENDED.html{-/win32process_CREATE_UNICODE_ENVIRONMENT.html!*/win32process_DEBUG_ONLY_THIS_PROCESS.htmlv{ /win32process_DEBUG_PROCESS.htmlq>#/win32process_DETACHED_PROCESS.htmls&/win32process_HIGH_PRIORITY_CLASS.htmlo&/win32process_IDLE_PRIORITY_CLASS.htmlKq%/win32process_LIST_MODULES_32BIT.htmlD%/win32process_LIST_MODULES_64BIT.htmlE#/win32process_LIST_MODULES_ALL.htmlF{'/win32process_LIST_MODULES_DEFAULT.htmlA%/win32process_MAXIMUM_PROCESSORS.htmlt(/win32process_NORMAL_PRIORITY_CLASS.htmlqF*/win32process_REALTIME_PRIORITY_CLASS.html`*/win32process_STARTF_FORCEOFFFEEDBACK.html2)/win32process_STARTF_FORCEONFEEDBACK.html1f'/win32process_STARTF_RUNFULLSCREEN.html3'/win32process_STARTF_USECOUNTCHARS.htmlJ_ne_meth.htmlih QPMGL0@B*/win32process_STARTF_USEFILLATTRIBUTE.html)V%/win32process_STARTF_USEPOSITION.htmlE'/win32process_STARTF_USESHOWWINDOW.htmlDI!/win32process_STARTF_USESIZE.html A'/win32process_STARTF_USESTDHANDLES.htmlN+//win32process_THREAD_MODE_BACKGROUND_BEGIN.htmlz1/win32process_THREAD_MODE_BACKGROUND_BEGIN_1.html-/win32process_THREAD_MODE_BACKGROUND_END.htmlQ//win32process_THREAD_MODE_BACKGROUND_END_1.html8//win32process_THREAD_PRIORITY_ABOVE_NORMAL.htmlj^//win32process_THREAD_PRIORITY_BELOW_NORMAL.htmlH^*/win32process_THREAD_PRIORITY_HIGHEST.html&P'/win32process_THREAD_PRIORITY_IDLE.htmlvD)/win32process_THREAD_PRIORITY_LOWEST.html:M)/win32process_THREAD_PRIORITY_NORMAL.html>0/win32process_THREAD_PRIORITY_TIME_CRITICAL.htmlE`/win32profile.html #/win32ras__GetErrorString_meth.htmlJ(/win32ras__HangUp_meth.htmlro"/win32ras__IsHandleValid_meth.htmla#!/win32ras__RasDialFunc1_meth.html~C'/win32ras__SetEntryDialParams_meth.html1(/win32ras_RASCS_AllDevicesConnected.htmlܺ )/win32ras_RASCS_AuthAck.htmlܼ3!/win32ras_RASCS_AuthCallback.htmlܾ8'/win32ras_RASCS_AuthChangePassword.htmlL&!/win32ras_RASCS_Authenticate.htmlr"/win32ras_RASCS_Authenticated.html"/win32ras_RASCS_AuthLinkSpeed.html/win32ras_RASCS_AuthNotify.html4 /win32ras_RASCS_AuthProject.htmlB/win32ras_RASCS_AuthRetry.htmlS %/win32ras_RASCS_CallbackComplete.html^ (/win32ras_RASCS_CallbackSetByCaller.html~)"/win32ras_RASCS_ConnectDevice.html'/win32ras_RASCS_Connected.html> $/win32ras_RASCS_DeviceConnected.htmlI!/win32ras_RASCS_Disconnected.htmlf /win32ras_RASCS_Interactive.htmlz!/win32ras_RASCS_LogonNetwork.html /win32ras_RASCS_OpenPort.html$/win32ras_RASCS_PasswordExpired.html'/win32ras_RASCS_PortOpened.htmlD'/win32ras_RASCS_PrepareForCallback.htmlR&/win32ras_RASCS_Projected.htmlx #/win32ras_RASCS_ReAuthenticate.html(/win32ras_RASCS_RetryAuthentication.html)(/win32ras_RASCS_StartAuthentication.htmlF)$/win32ras_RASCS_WaitForCallback.htmlo&/win32ras_RASCS_WaitForModemReset.html #/win32security.htmlA^//win32security__AcceptSecurityContext_meth.html5j/win32security__ACL_meth.html&2/win32security__AcquireCredentialsHandle_meth.htmlE/+/win32security__AdjustTokenGroups_meth.htmlt$//win32security__AdjustTokenPrivileges_meth.html1/win32security__AllocateLocallyUniqueId_meth.html5D./win32security__CheckTokenMembership_meth.htmlyM/win32security__ConvertSecurityDescriptorToStringSecurityDescriptor_meth.html//win32security__ConvertSidToStringSid_meth.htmlCM/win32security__ConvertStringSecurityDescriptorToSecurityDescriptor_meth.htmlI//win32security__ConvertStringSidToSid_meth.htmlef//win32security__CreateRestrictedToken_meth.htmlK(,/win32security__CreateWellKnownSid_meth.htmls|,/win32security__CryptEnumProviders_meth.htmloQ /win32security__DsBind_meth.html@ihn n ( \UPMGLDAC&/win32security__DsCrackNames_meth.html]Q%/win32security__DsGetDcName_meth.html. "/win32security__DsGetSpn_meth.html:-/win32security__DsListDomainsInSite_meth.htmlIC-/win32security__DsListInfoForServer_meth.html K%/win32security__DsListRoles_meth.htmlW+-/win32security__DsListServersInSite_meth.html//win32security__DsListServersInSite_meth_1.html_u//win32security__DsListServersInSite_meth_2.htmlC"/win32security__DsUnBind_meth.htmlTQ+/win32security__DsWriteAccountSpn_meth.html%j(/win32security__DuplicateToken_meth.htmlD*/win32security__DuplicateTokenEx_meth.htmlSA3/win32security__EnumerateSecurityPackages_meth.html&&/win32security__GetBinarySid_meth.html:)/win32security__GetFileSecurity_meth.htmlAg1/win32security__GetKernelObjectSecurity_meth.html(c./win32security__GetNamedSecurityInfo_meth.html i)/win32security__GetSecurityInfo_meth.htmlts-/win32security__GetTokenInformation_meth.htmlgL//win32security__GetUserObjectSecurity_meth.html3[3/win32security__ImpersonateAnonymousToken_meth.html 1/win32security__ImpersonateLoggedOnUser_meth.htmlk4/win32security__ImpersonateNamedPipeClient_meth.htmlG)/win32security__ImpersonateSelf_meth.htmlJv3/win32security__InitializeSecurityContext_meth.html@l+/win32security__IsTokenRestricted_meth.html,]#/win32security__LogonUser_meth.html %/win32security__LogonUserEx_meth.html L+/win32security__LookupAccountName_meth.htmlYT*/win32security__LookupAccountSid_meth.html-%4/win32security__LookupPrivilegeDisplayName_meth.htmlRg-/win32security__LookupPrivilegeName_meth.html9./win32security__LookupPrivilegeValue_meth.html@-/win32security__LsaAddAccountRights_meth.html[$6/win32security__LsaCallAuthenticationPackage_meth.htmlf"/win32security__LsaClose_meth.htmleb-/win32security__LsaConnectUntrusted_meth.htmlG'3/win32security__LsaDeregisterLogonProcess_meth.htmln;3/win32security__LsaEnumerateAccountRights_meth.html);/win32security__LsaEnumerateAccountsWithUserRight_meth.html03/win32security__LsaEnumerateLogonSessions_meth.html1`0/win32security__LsaGetLogonSessionData_meth.htmlR8/win32security__LsaLookupAuthenticationPackage_meth.htmlcT'/win32security__LsaOpenPolicy_meth.html73/win32security__LsaQueryInformationPolicy_meth.html9W1/win32security__LsaRegisterLogonProcess_meth.htmlX=/win32security__LsaRegisterPolicyChangeNotification_meth.htmlh;0/win32security__LsaRemoveAccountRights_meth.html#/0/win32security__LsaRetrievePrivateData_meth.htmlRR1/win32security__LsaSetInformationPolicy_meth.html$.-/win32security__LsaStorePrivateData_meth.htmlRU?/win32security__LsaUnregisterPolicyChangeNotification_meth.html'H(/win32security__MapGenericMask_meth.htmlon*/win32security__OpenProcessToken_meth.html]L)/win32security__OpenThreadToken_meth.html)$2/win32security__QuerySecurityPackageInfo_meth.htmlMV&/win32security__RevertToSelf_meth.html#F-/win32security__SECURITY_ATTRIBUTES_meth.htmli-/win32security__SECURITY_DESCRIPTOR_meth.html{)/win32security__SetFileSecurity_meth.html h1/win32security__SetKernelObjectSecurity_meth.htmluq./win32security__SetNamedSecurityInfo_meth.htmlfM)/win32security__SetSecurityInfo_meth.html3W(/win32security__SetThreadToken_meth.html G-/win32security__SetTokenInformation_meth.htmlQ&//win32security__SetUserObjectSecurity_meth.htmlwi/win32security__SID_meth.html`2'/win32security__TranslateName_meth.htmlg+/win32security_ACCESS_ALLOWED_ACE_TYPE.htmlìO2/win32security_ACCESS_ALLOWED_OBJECT_ACE_TYPE.htmlîk */win32security_ACCESS_DENIED_ACE_TYPE.htmlñwJ1/win32security_ACCESS_DENIED_OBJECT_ACE_TYPE.htmlôA /win32security_ACL_REVISION.html÷Hp#/win32security_ACL_REVISION_DS.htmlù8y-/win32security_AuditCategoryAccountLogon.htmlZind_meth.html@ihs{ m D  LPMGLZBD2/win32security_AuditCategoryAccountManagement.htmlq&1/win32security_AuditCategoryDetailedTracking.html#7/win32security_AuditCategoryDirectoryServiceAccess.html:5&/win32security_AuditCategoryLogon.htmlo-/win32security_AuditCategoryObjectAccess.htmlq-/win32security_AuditCategoryPolicyChange.html-/win32security_AuditCategoryPrivilegeUse.html'/win32security_AuditCategorySystem.html6)/win32security_CONTAINER_INHERIT_ACE.htmlŔR -/win32security_DACL_SECURITY_INFORMATION.htmlƏdY/win32security_DENY_ACCESS.htmlm)/win32security_DISABLE_MAX_PRIVILEGE.htmlǀO %/win32security_DS_SPN_ADD_SPN_OP.htmlǤd(/win32security_DS_SPN_DELETE_SPN_OP.htmlǦc"/win32security_DS_SPN_DN_HOST.htmlǨkv#/win32security_DS_SPN_DNS_HOST.htmlǪay!/win32security_DS_SPN_DOMAIN.htmlǬZs$/win32security_DS_SPN_NB_DOMAIN.htmlǮM|"/win32security_DS_SPN_NB_HOST.htmlǰIv)/win32security_DS_SPN_REPLACE_SPN_OP.htmlDz? "/win32security_DS_SPN_SERVICE.htmlǴJv*/win32security_FAILED_ACCESS_ACE_FLAG.html /win32security_GRANT_ACCESS.htmlη p./win32security_GROUP_SECURITY_INFORMATION.htmlθ{c$/win32security_INHERIT_ONLY_ACE.html>|!/win32security_INHERITED_ACE.html:s./win32security_LABEL_SECURITY_INFORMATION.html*'/win32security_LOGON32_LOGON_BATCH.html֋AD-/win32security_LOGON32_LOGON_INTERACTIVE.html֐)/win32security_LOGON32_LOGON_NETWORK.html֕b3/win32security_LOGON32_LOGON_NETWORK_CLEARTEXT.html֜f)1/win32security_LOGON32_LOGON_NEW_CREDENTIALS.html֟#)/win32security_LOGON32_LOGON_SERVICE.html֡2h(/win32security_LOGON32_LOGON_UNLOCK.html֤,/win32security_LOGON32_PROVIDER_DEFAULT.html֦"V,/win32security_LOGON32_PROVIDER_WINNT35.html֩x:,/win32security_LOGON32_PROVIDER_WINNT40.html֬29,/win32security_LOGON32_PROVIDER_WINNT50.html֮k."/win32security_NO_INHERITANCE.htmlv,/win32security_NO_PROPAGATE_INHERIT_ACE.html}#/win32security_NOT_USED_ACCESS.html7y&/win32security_OBJECT_INHERIT_ACE.html0./win32security_OWNER_SECURITY_INFORMATION.htmlڣ[%/win32security_POLICY_ALL_ACCESS.htmlۑp./win32security_POLICY_AUDIT_EVENT_FAILURE.htmlۓom+/win32security_POLICY_AUDIT_EVENT_NONE.htmlۖ\G./win32security_POLICY_AUDIT_EVENT_SUCCESS.htmlۙ#T0/win32security_POLICY_AUDIT_EVENT_UNCHANGED.htmlۛw*/win32security_POLICY_AUDIT_LOG_ADMIN.html۞z)/win32security_POLICY_CREATE_ACCOUNT.htmlۡ +/win32security_POLICY_CREATE_PRIVILEGE.htmlۣ(/win32security_POLICY_CREATE_SECRET.htmlۥ$"/win32security_POLICY_EXECUTE.htmlۧ,v2/win32security_POLICY_GET_PRIVATE_INFORMATION.html۩"&'/win32security_POLICY_LOOKUP_NAMES.html۫H'/win32security_POLICY_NOTIFICATION.htmlۭM/win32security_POLICY_READ.htmlۯRm'/win32security_POLICY_SERVER_ADMIN.html۱?1/win32security_POLICY_SET_AUDIT_REQUIREMENTS.html۳D#3/win32security_POLICY_SET_DEFAULT_QUOTA_LIMITS.html۵g)&/win32security_POLICY_TRUST_ADMIN.html۸1/win32security_POLICY_VIEW_AUDIT_INFORMATION.htmlۺ#1/win32security_POLICY_VIEW_LOCAL_INFORMATION.htmlۼ5# /win32security_POLICY_WRITE.html۾Xp2/win32security_PolicyAccountDomainInformation.htmlH&0/win32security_PolicyAuditEventsInformation.htmln 3/win32security_PolicyAuditFullQueryInformation.html)1/win32security_PolicyAuditFullSetInformation.html7#-/win32security_PolicyAuditLogInformation.htmlZ1/win32security_PolicyDefaultQuotaInformation.htmlq#./win32security_PolicyDnsDomainInformation.html2/win32security_PolicyLsaServerRoleInformation.html.&1/win32security_PolicyModificationInformation.htmlT#8/win32security_PolicyNotifyAccountDomainInformation.htmlw86/win32security_PolicyNotifyAuditEventsInformation.html/24/win32security_PolicyNotifyDnsDomainInformation.htmla,4/win32security_PolicyNotifyDomainEfsInformation.html ,?/win32security_PolicyNotifyDomainKerberosTicketInformation.html9McountLogon.htmlZind_meth.html@ih NPMGLACEA/win32security_PolicyNotifyMachineAccountPasswordInformation.htmlS5/win32security_PolicyNotifyServerRoleInformation.htmlY/./win32security_PolicyPdAccountInformation.html2/win32security_PolicyPrimaryDomainInformation.html"&2/win32security_PolicyReplicaSourceInformation.htmlH&(/win32security_PolicyServerDisabled.htmlv*/win32security_PolicyServerDisabled_1.htmln'/win32security_PolicyServerEnabled.html~)/win32security_PolicyServerEnabled_1.html*/win32security_PolicyServerRoleBackup.html+/win32security_PolicyServerRolePrimary.html7/win32security_PROTECTED_DACL_SECURITY_INFORMATION.html܀x57/win32security_PROTECTED_SACL_SECURITY_INFORMATION.html܃-5!/win32security_REVOKE_ACCESS.htmlݵs-/win32security_SACL_SECURITY_INFORMATION.html2R!/win32security_SANDBOX_INERT.htmls#/win32security_SDDL_REVISION_1.htmly*/win32security_SE_DACL_AUTO_INHERITED.html%/win32security_SE_DACL_DEFAULTED.html(#/win32security_SE_DACL_PRESENT.html'y%/win32security_SE_DACL_PROTECTED.htmlށ /win32security_SE_DS_OBJECT.htmlރ+p$/win32security_SE_DS_OBJECT_ALL.htmlޅ|"/win32security_SE_FILE_OBJECT.htmlއv&/win32security_SE_GROUP_DEFAULTED.htmlމ $/win32security_SE_GROUP_ENABLED.htmlދ|//win32security_SE_GROUP_ENABLED_BY_DEFAULT.htmlލ %/win32security_SE_GROUP_LOGON_ID.htmlޏ(&/win32security_SE_GROUP_MANDATORY.htmlޑ'"/win32security_SE_GROUP_OWNER.htmlޓ)v%/win32security_SE_GROUP_RESOURCE.htmlޕ./win32security_SE_GROUP_USE_FOR_DENY_ONLY.htmlޗ$/win32security_SE_KERNEL_OBJECT.htmlޙ8|/win32security_SE_LMSHARE.htmlޛ4j&/win32security_SE_OWNER_DEFAULTED.htmlޝ/win32security_SE_PRINTER.htmlޟ j(/win32security_SE_PRIVILEGE_ENABLED.htmlޡ 3/win32security_SE_PRIVILEGE_ENABLED_BY_DEFAULT.htmlޣ)(/win32security_SE_PRIVILEGE_REMOVED.htmlޥ;0/win32security_SE_PRIVILEGE_USED_FOR_ACCESS.htmlާC ./win32security_SE_PROVIDER_DEFINED_OBJECT.htmlީc#/win32security_SE_REGISTRY_KEY.htmlޫ}y+/win32security_SE_REGISTRY_WOW64_32KEY.htmlޭv*/win32security_SE_SACL_AUTO_INHERITED.htmlް%/win32security_SE_SACL_DEFAULTED.html޲!#/win32security_SE_SACL_PRESENT.html޴ y%/win32security_SE_SACL_PROTECTED.html޶ $/win32security_SE_SELF_RELATIVE.html޸$|/win32security_SE_SERVICE.html޺ j*/win32security_SE_UNKNOWN_OBJECT_TYPE.html޼ $/win32security_SE_WINDOW_OBJECT.html޾|%/win32security_SE_WMIGUID_OBJECT.html$/win32security_SECPKG_CRED_BOTH.html|'/win32security_SECPKG_CRED_INBOUND.html(/win32security_SECPKG_CRED_OUTBOUND.html1/win32security_SECPKG_FLAG_ACCEPT_WIN32_NAME.html#+/win32security_SECPKG_FLAG_CLIENT_ONLY.html?*/win32security_SECPKG_FLAG_CONNECTION.htmlP(/win32security_SECPKG_FLAG_DATAGRAM.html^./win32security_SECPKG_FLAG_EXTENDED_ERROR.htmlf-/win32security_SECPKG_FLAG_IMPERSONATION.html)/win32security_SECPKG_FLAG_INTEGRITY.html ./win32security_SECPKG_FLAG_MULTI_REQUIRED.html"'/win32security_SECPKG_FLAG_PRIVACY.html<&/win32security_SECPKG_FLAG_STREAM.htmlA*/win32security_SECPKG_FLAG_TOKEN_ONLY.htmlC2/win32security_SECURITY_CREATOR_SID_AUTHORITY.html!&0/win32security_SECURITY_LOCAL_SID_AUTHORITY.htmlx 1/win32security_SECURITY_NON_UNIQUE_AUTHORITY.html#)/win32security_SECURITY_NT_AUTHORITY.html; //win32security_SECURITY_NULL_SID_AUTHORITY.htmlF7/win32security_SECURITY_RESOURCE_MANAGER_AUTHORITY.htmlc50/win32security_SECURITY_WORLD_SID_AUTHORITY.html %/win32security_SecurityAnonymous.html8&/win32security_SecurityDelegation.html߁7*/win32security_SecurityIdentification.html߃9)/win32security_SecurityImpersonation.html߅G /win32security_SET_ACCESS.htmlj%/win32security_SET_AUDIT_FAILURE.html%/win32security_SET_AUDIT_SUCCESS.html /win32security_SidTypeAlias.htmli#/win32security_SidTypeComputer.htmlp_meth.html@ihXul ^ e a } 3$0RPMGL>DF)/win32security_SidTypeDeletedAccount.html2!/win32security_SidTypeDomain.html3 /win32security_SidTypeGroup.html="/win32security_SidTypeInvalid.htmlC"/win32security_SidTypeUnknown.htmlR/win32security_SidTypeUser.htmlf)/win32security_SidTypeWellKnownGroup.htmlh3 /win32security_STYPE_DEVICE.htmlup"/win32security_STYPE_DISKTREE.htmlev/win32security_STYPE_IPC.html[g /win32security_STYPE_PRINTQ.htmlBp!/win32security_STYPE_SPECIAL.html2s#/win32security_STYPE_TEMPORARY.html%y6/win32security_SUB_CONTAINERS_AND_OBJECTS_INHERIT.html2//win32security_SUB_CONTAINERS_ONLY_INHERIT.htmlP,/win32security_SUB_OBJECTS_ONLY_INHERIT.htmlm./win32security_SUCCESSFUL_ACCESS_ACE_FLAG.html)/win32security_SYSTEM_AUDIT_ACE_TYPE.htmlxE0/win32security_SYSTEM_AUDIT_OBJECT_ACE_TYPE.html= (/win32security_TOKEN_ADJUST_DEFAULT.html%W'/win32security_TOKEN_ADJUST_GROUPS.html|@+/win32security_TOKEN_ADJUST_PRIVILEGES.htmlf./win32service_SERVICE_WIN32_SHARE_PROCESS.html$y/win32service_UOI_FLAGS.html/win32timezone.TimeZoneInfo__get_sorted_time_zones_meth_1.htmlA4/win32timezone.TimeZoneInfo__GetDSTEndTime_meth.html5x6/win32timezone.TimeZoneInfo__GetDSTEndTime_meth_1.htmlGn6/win32timezone.TimeZoneInfo__GetDSTStartTime_meth.html-8/win32timezone.TimeZoneInfo__GetDSTStartTime_meth_1.html1z1/win32timezone.TimeZoneInfo__getWinInfo_meth.html+|3/win32timezone.TimeZoneInfo__getWinInfo_meth_1.html',/win32timezone.TimeZoneInfo__local_meth.html+ ./win32timezone.TimeZoneInfo__local_meth_1.html7**/win32timezone.TimeZoneInfo__utc_meth.html8*,/win32timezone.TimeZoneInfo__utc_meth_1.htmlaW0/win32timezone.TimeZoneInfo__utcoffset_meth.htmlbm2/win32timezone.TimeZoneInfo__utcoffset_meth_1.htmlO]+/win32timezone__GetTZCapabilities_meth.htmly/win32timezone__now_meth.html v,/win32timezone__resolveMUITimeZone_meth.html'[ /win32timezone__utcnow_meth.html,z/win32transaction.html./win32transaction__CommitTransaction_meth.html&Z3/win32transaction__CommitTransactionAsync_meth.html ./win32transaction__CreateTransaction_meth.html u-/win32transaction__GetTransactionId_meth.html{,/win32transaction__OpenTransaction_meth.html|v0/win32transaction__RollbackTransaction_meth.htmlrk5/win32transaction__RollbackTransactionAsync_meth.html] /win32ts.html5h(/win32ts__ProcessIdToSessionId_meth.htmlz"/win32ts__WTSCloseServer_meth.html #(/win32ts__WTSDisconnectSession_meth.html.r)/win32ts__WTSEnumerateProcesses_meth.html `'/win32ts__WTSEnumerateServers_meth.htmlMmeth.html/2th.html@iho T \QPMGL7GI(/win32ts__WTSEnumerateSessions_meth.htmlMX0/win32ts__WTSGetActiveConsoleSessionId_meth.html%,$/win32ts__WTSLogoffSession_meth.htmlQm!/win32ts__WTSOpenServer_meth.html>c./win32ts__WTSQuerySessionInformation_meth.html!&/win32ts__WTSQueryUserConfig_meth.html"=%/win32ts__WTSQueryUserToken_meth.html_A2/win32ts__WTSRegisterSessionNotification_meth.html j"/win32ts__WTSSendMessage_meth.html ^$/win32ts__WTSSetUserConfig_meth.htmlh/%/win32ts__WTSShutdownSystem_meth.html#'/win32ts__WTSTerminateProcess_meth.html:;4/win32ts__WTSUnRegisterSessionNotification_meth.htmlu&/win32ts__WTSWaitSystemEvent_meth.htmlyP /win32ui.htmlu'/win32ui__AddToRecentFileList_meth.htmlI}/win32ui__ComparePath_meth.htmlF1 /win32ui__CreateBitmap_meth.htmlw@*/win32ui__CreateBitmapFromHandle_meth.html7m/win32ui__CreateBrush_meth.html$T /win32ui__CreateButton_meth.htmlx)%/win32ui__CreateColorDialog_meth.html!I!/win32ui__CreateControl_meth.htmlj$/win32ui__CreateControlBar_meth.htmlY"/win32ui__CreateCtrlView_meth.html[u/win32ui__CreateDC_meth.htmlP&/win32ui__CreateDCFromHandle_meth.htmlk<(/win32ui__CreateDebuggerThread_meth.html'b /win32ui__CreateDialog_meth.html )#/win32ui__CreateDialogBar_meth.html2u(/win32ui__CreateDialogIndirect_meth.html'V%/win32ui__CreateDocTemplate_meth.html}Z/win32ui__CreateEdit_meth.htmlW"/win32ui__CreateEditView_meth.htmlqY$/win32ui__CreateFileDialog_meth.htmlJr/win32ui__CreateFont_meth.html<8$/win32ui__CreateFontDialog_meth.htmlt4"/win32ui__CreateFormView_meth.html(B/win32ui__CreateFrame_meth.htmlj%#/win32ui__CreateImageList_meth.htmlH"/win32ui__CreateListCtrl_meth.htmlWI"/win32ui__CreateListView_meth.html Z"/win32ui__CreateMDIChild_meth.htmlz:"/win32ui__CreateMDIFrame_meth.html4S/win32ui__CreateMenu_meth.html4!/win32ui__CreatePalette_meth.html;/win32ui__CreatePen_meth.htmlCW#/win32ui__CreatePopupMenu_meth.htmlI%/win32ui__CreatePrintDialog_meth.htmlc&/win32ui__CreateProgressCtrl_meth.html{*&/win32ui__CreatePropertyPage_meth.html%./win32ui__CreatePropertyPageIndirect_meth.html8,'/win32ui__CreatePropertySheet_meth.htmld/win32ui__CreateRgn_meth.htmliU&/win32ui__CreateRichEditCtrl_meth.html> -/win32ui__CreateRichEditDocTemplate_meth.htmlG&/win32ui__CreateRichEditView_meth.htmlI $/win32ui__CreateSliderCtrl_meth.htmlUV"/win32ui__CreateSplitter_meth.html+Y#/win32ui__CreateStatusBar_meth.html'/win32ui__CreateStatusBarCtrl_meth.html0 /win32ui__CreateThread_meth.html3o!/win32ui__CreateToolBar_meth.html"T%/win32ui__CreateToolBarCtrl_meth.htmlvQ%/win32ui__CreateToolTipCtrl_meth.htmlG("/win32ui__CreateTreeCtrl_meth.htmloI"/win32ui__CreateTreeView_meth.html8Z/win32ui__CreateView_meth.htmlS*/win32ui__CreateWindowFromHandle_meth.htmleo/win32ui__CreateWnd_meth.htmlTP)/win32ui__DestroyDebuggerThread_meth.html$$/win32ui__DisplayTraceback_meth.html60 /win32ui__DoWaitCursor_meth.htmlfN$/win32ui__Enable3dControls_meth.html4*/win32ui__EnableControlContainer_meth.htmlCS/win32ui__FindWindow_meth.html> /win32ui__FindWindowEx_meth.htmlTD/win32ui__FullPath_meth.html#/win32ui__GetActiveWindow_meth.htmlT/win32ui__GetApp_meth.htmll/win32ui__GetAppName_meth.html~%/win32ui__GetAppRegistryKey_meth.html;/win32ui__GetBytes_meth.htmlU"/win32ui__GetCommandLine_meth.htmlg/!/win32ui__GetDeviceCaps_meth.htmls /win32ui__GetFileTitle_meth.html /win32ui__GetFocus_meth.htmlG'/win32ui__GetForegroundWindow_meth.htmlXd$/win32ui__GetHalftoneBrush_meth.html*/win32ui__GetRect_meth.htmlhB/win32ui__GetResource_meth.html*\/win32ui__GetThread_meth.htmlC/win32ui__GetType_meth.htmlI& /win32ui__InitRichEdit_meth.htmlo,)/win32ui__InstallCallBackCaller_meth.html&/win32ui__IsDebug_meth.htmlAo/win32ui__IsObject_meth.html0/win32ui__IsWin32s_meth.html2/&/win32ui__LoadDialogResource_meth.htmlaC/win32ui__LoadLibrary_meth.html$K/win32ui__LoadMenu_meth.htmlo */win32ui__LoadStdProfileSettings_meth.htmlz'/win32ui__LoadString_meth.html!//win32ui__MessageBox_meth.htmlPk%/win32ui__OutputDebugString_meth.html;"/win32ui__PrintTraceback_meth.htmlQr'/win32ui__PumpWaitingMessages_meth.htmlCX$/win32ui__RegisterWndClass_meth.html1$/win32ui__RemoveRecentFile_meth.htmlLn"/win32ui__SetAppHelpPath_meth.html:6/win32ui__SetAppName_meth.htmlp,/win32ui__SetCurrentInstanceHandle_meth.html%,/win32ui__SetCurrentResourceHandle_meth.html3%$/win32ui__SetDialogBkColor_meth.htmlXB&/win32ui__SetProfileFileName_meth.html/"/win32ui__SetRegistryKey_meth.htmlIt/win32ui__SetResource_meth.html=!!/win32ui__SetStatusText_meth.html^<%/win32ui__StartDebuggerPump_meth.htmly$/win32ui__StopDebuggerPump_meth.htmlw$/win32ui__TranslateMessage_meth.html ;'/win32ui__TranslateVirtualKey_meth.htmlEv/win32ui__WinHelp_meth.html;}#/win32ui__WriteProfileVal_meth.html8$ /win32ui_AFX_IDW_PANE_FIRST.htmlû1/win32ui_AFX_IDW_PANE_LAST.htmlýJ!/win32ui_AFX_WS_DEFAULT_VIEW.htmlÿ_9/win32ui_CDocTemplate_Confidence_maybeAttemptForeign.html-G8/win32ui_CDocTemplate_Confidence_maybeAttemptNative.htmltD//win32ui_CDocTemplate_Confidence_noAttempt.html8)4/win32ui_CDocTemplate_Confidence_yesAlreadyOpen.htmla87/win32ui_CDocTemplate_Confidence_yesAttemptForeign.htmlA6/win32ui_CDocTemplate_Confidence_yesAttemptNative.htmlZ>"/win32ui_CDocTemplate_docName.html&/win32ui_CDocTemplate_fileNewName.html$/win32ui_CDocTemplate_filterExt.html(%/win32ui_CDocTemplate_filterName.html0 (/win32ui_CDocTemplate_regFileTypeId.html;*/win32ui_CDocTemplate_regFileTypeName.htmlO&/win32ui_CDocTemplate_windowTitle.htmli$/win32ui_CRichEditView_WrapNone.html4./win32ui_CRichEditView_WrapToTargetDevice.html<&(/win32ui_CRichEditView_WrapToWindow.htmlb/win32ui_debug.htmle/win32ui_FWS_ADDTOTITLE.htmlΑ:/win32ui_FWS_PREFIXTITLE.htmlΓP/win32ui_FWS_SNAPTOBARS.htmlΕd/win32ui_ID_APP_ABOUT.htmlj/win32ui_ID_APP_EXIT.htmlҀ|g/win32ui_ID_EDIT_CLEAR.html҂cm/win32ui_ID_EDIT_CLEAR_ALL.html҄Py/win32ui_ID_EDIT_COPY.html҆Ij/win32ui_ID_EDIT_CUT.html҈3g/win32ui_ID_EDIT_FIND.htmlҊj/win32ui_ID_EDIT_GOTO_LINE.htmlҌy/win32ui_ID_EDIT_PASTE.htmlҍ}m/win32ui_ID_EDIT_REDO.htmlҏjj/win32ui_ID_EDIT_REPEAT.htmlґTp/win32ui_ID_EDIT_REPLACE.htmlғDs /win32ui_ID_EDIT_SELECT_ALL.htmlҕ7|"/win32ui_ID_EDIT_SELECT_BLOCK.htmlҗ3/win32ui_ID_EDIT_UNDO.htmlҙ5j/win32ui_ID_FILE_CHECK.htmlқm/win32ui_ID_FILE_CLOSE.htmlҝ m/win32ui_ID_FILE_IMPORT.htmlҞyp/win32ui_ID_FILE_LOCATE.htmlҠip/win32ui_ID_FILE_MRU_FILE1.htmlҢYy/win32ui_ID_FILE_MRU_FILE2.htmlҤRy/win32ui_ID_FILE_MRU_FILE3.htmlҦKy/win32ui_ID_FILE_MRU_FILE4.htmlҨDy/win32ui_ID_FILE_NEW.htmlҪ=g/win32ui_ID_FILE_OPEN.htmlҬ$j /win32ui_ID_FILE_PAGE_SETUP.htmlҮ|/win32ui_ID_FILE_PRINT.htmlҰ m#/win32ui_ID_FILE_PRINT_PREVIEW.htmlұw!/win32ui_ID_FILE_PRINT_SETUP.htmlҳ|/win32ui_ID_FILE_RUN.htmlҵ{g/win32ui_ID_FILE_SAVE.htmlҷbj/win32ui_ID_FILE_SAVE_ALL.htmlҹLv/win32ui_ID_FILE_SAVE_AS.htmlһBs/win32ui_ID_HELP_GUI_REF.htmlҽ5s/win32ui_ID_HELP_OTHER.htmlҿ(m/win32ui_ID_HELP_PYTHON.htmlp!/win32ui_ID_INDICATOR_COLNUM.htmlileName_meth.html2S@ihP # n  S )WaPMGL3IK"/win32ui_ID_INDICATOR_LINENUM.html/win32ui_ID_NEXT_PANE.htmlj/win32ui_ID_PREV_PANE.htmlpj/win32ui_ID_SEPARATOR.htmlZj/win32ui_ID_VIEW_BROWSE.htmlDp/win32ui_ID_VIEW_EOL.html4g /win32ui_ID_VIEW_FIXED_FONT.html|#/win32ui_ID_VIEW_FOLD_COLLAPSE.html'/win32ui_ID_VIEW_FOLD_COLLAPSE_ALL.html!/win32ui_ID_VIEW_FOLD_EXPAND.html-%/win32ui_ID_VIEW_FOLD_EXPAND_ALL.html, !/win32ui_ID_VIEW_FOLD_TOGGLE.html7'/win32ui_ID_VIEW_INDENTATIONGUIDES.html6!/win32ui_ID_VIEW_INTERACTIVE.htmlG/win32ui_ID_VIEW_OPTIONS.htmlFs /win32ui_ID_VIEW_RIGHT_EDGE.html9| /win32ui_ID_VIEW_STATUS_BAR.html5|/win32ui_ID_VIEW_TOOLBAR.html1s!/win32ui_ID_VIEW_TOOLBAR_DBG.html$ /win32ui_ID_VIEW_WHITESPACE.html#|/win32ui_ID_WINDOW_ARRANGE.htmly/win32ui_ID_WINDOW_CASCADE.htmly/win32ui_ID_WINDOW_NEW.htmlm/win32ui_ID_WINDOW_SPLIT.html~s!/win32ui_ID_WINDOW_TILE_HORZ.htmlq!/win32ui_ID_WINDOW_TILE_VERT.htmlp/win32ui_IDB_BROWSER_HIER.htmlo/win32ui_IDB_DEBUGGER_HIER.html y/win32ui_IDB_HIERFOLDERS.html&/win32ui_IDC_ABOUT_VERSION.html)/win32ui_IDC_AUTO_RELOAD.htmlӀ9s/win32ui_IDC_AUTOCOMPLETE.htmlӂ,v/win32ui_IDC_BUTTON1.htmlӄ"g/win32ui_IDC_BUTTON2.htmlӆ g/win32ui_IDC_BUTTON3.htmlӇpg/win32ui_IDC_BUTTON4.htmlӉWg/win32ui_IDC_CALLTIPS.htmlӋ>j/win32ui_IDC_CHECK1.htmlӍ(d/win32ui_IDC_CHECK2.htmlӏ d/win32ui_IDC_CHECK3.htmlӐpd/win32ui_IDC_COMBO1.htmlӒTd/win32ui_IDC_COMBO2.htmlӔ8d/win32ui_IDC_EDIT1.htmlӖa/win32ui_IDC_EDIT2.htmlӗ}a/win32ui_IDC_EDIT3.htmlә^a/win32ui_IDC_EDIT4.htmlӛ?a/win32ui_IDC_EDIT_COLOE.htmlӝ p/win32ui_IDC_EDIT_TABS.htmlӟm/win32ui_IDC_INDENT_SIZE.htmlӠ}s!/win32ui_IDC_KEYBOARD_CONFIG.htmlӢp/win32ui_IDC_LIST1.htmlӤoa/win32ui_IDC_PROMPT1.htmlӦPg/win32ui_IDC_PROMPT2.htmlӨ7g/win32ui_IDC_PROMPT3.htmlӪg/win32ui_IDC_PROMPT4.htmlӬg/win32ui_IDC_PROMPT_TABS.htmlӭls/win32ui_IDC_RADIO1.htmlӯ_d/win32ui_IDC_RADIO2.htmlӱCd"/win32ui_IDC_RIGHTEDGE_COLUMN.htmlӳ'"/win32ui_IDC_RIGHTEDGE_DEFINE.htmlӵ)"/win32ui_IDC_RIGHTEDGE_ENABLE.htmlӷ+"/win32ui_IDC_RIGHTEDGE_SAMPLE.htmlӹ-/win32ui_IDC_SPIN1.htmlӻ/a/win32ui_IDC_SPIN2.htmlӽa/win32ui_IDC_SPIN3.htmlӾqa/win32ui_IDC_TAB_SIZE.htmlRj /win32ui_IDC_USE_SMART_TABS.html<|/win32ui_IDC_USE_TABS.html8j!/win32ui_IDC_VIEW_WHITESPACE.html"/win32ui_IDC_VSS_INTEGRATE.html!y/win32ui_IDD_ABOUTBOX.html /win32ui_IDD_DUMMYPROPPAGE.html% /win32ui_IDD_GENERAL_STATUS.html@Q/win32ui_IDD_LARGE_EDIT.html=/win32ui_IDD_PP_DEBUGGER.htmlNs/win32ui_IDD_PP_EDITOR.htmlA/win32ui_IDD_PP_FORMAT.htmlS/win32ui_IDD_PP_IDE.htmle/win32ui_IDD_PP_TABS.htmlk/win32ui_IDD_PP_TOOLMENU.html/win32ui_IDD_PROPDEMO1.html/win32ui_IDD_PROPDEMO2.html6/win32ui_IDD_RUN_SCRIPT.htmlM/win32ui_IDD_SET_TABSTOPS.html_/win32ui_IDD_SIMPLE_INPUT.htmlz"/win32ui_IDD_TREE.html/win32ui_IDD_TREE_MB.html$'/win32ui_IDR_CNTR_INPLACE.htmlA/win32ui_PD_PAGENUMS.htmlA/win32ui_PD_PRINTSETUP.html@J/win32ui_PD_PRINTTOFILE.html X/win32ui_PD_RETURNDC.htmlbu/win32ui_PD_RETURNDEFAULT.htmlWI/win32ui_PD_RETURNIC.html ./win32ui_PD_SELECTION.htmlN|/win32ui_PD_SHOWHELP.htmlJ>!/win32ui_PD_USEDEVMODECOPIES.html$+/win32ui_PD_USEDEVMODECOPIESANDCOLLATE.html,s/win32ui_PSWIZB_BACK.html܋q#/win32ui_PSWIZB_DISABLEDFINISH.html܎A/win32ui_PSWIZB_FINISH.htmlܐF/win32ui_PSWIZB_NEXT.htmlܒb/win32uiole.html!/win32uiole__AfxOleInit_meth.html\M)/win32uiole__CreateInsertDialog_meth.html)*/win32uiole__CreateOleClientItem_meth.html8(/win32uiole__CreateOleDocument_meth.htmlRn#/win32uiole__DaoGetEngine_meth.html@5'/win32uiole__EnableBusyDialog_meth.htmlu_0/win32uiole__EnableNotRespondingDialog_meth.htmlTz,/win32uiole__GetIDispatchForWindow_meth.htmlN%/win32uiole__OleGetUserCtrl_meth.htmlS1%/win32uiole__OleSetUserCtrl_meth.htmlG-/win32uiole__SetMessagePendingDelay_meth.htmlKl+/win32uiole_COleClientItem_activeState.htmlʼnb-/win32uiole_COleClientItem_activeUIState.htmlŋy*/win32uiole_COleClientItem_emptyState.htmlŎ+/win32uiole_COleClientItem_loadedState.htmlŐ*)/win32uiole_COleClientItem_openState.htmlŒA/win32uiole_OLE_CHANGED.html#/win32uiole_OLE_CHANGED_ASPECT.html"/win32uiole_OLE_CHANGED_STATE.html5+/win32uiole_OLE_CLOSED.html`z/win32uiole_OLE_RENAMED.htmlZ /win32uiole_OLE_SAVED.htmld/win32wnet.html|/win32wnet__NCBBuffer_meth.html7/win32wnet__Netbios_meth.htmlK(/win32wnet__WNetAddConnection2_meth.html[{(/win32wnet__WNetAddConnection3_meth.htmlVR+/win32wnet__WNetCancelConnection2_meth.html(v#/win32wnet__WNetCloseEnum_meth.html&/win32wnet__WNetEnumResource_meth.html!'/win32wnet__WNetGetConnection_meth.html2{&/win32wnet__WNetGetLastError_meth.html-0/win32wnet__WNetGetResourceInformation_meth.htmlKv+/win32wnet__WNetGetResourceParent_meth.htmlAn*/win32wnet__WNetGetUniversalName_meth.html/4!/win32wnet__WNetGetUser_meth.htmlc"/win32wnet__WNetOpenEnum_meth.htmlqW/wincerapi.htmlÄD%/wincerapi__CeCheckPassword_meth.htmlHV /wincerapi__CeCopyFile_meth.html~'/wincerapi__CeCreateDirectory_meth.html8"/wincerapi__CeCreateFile_meth.htmlT="/wincerapi__CeDeleteFile_meth.html,/wincerapi__CeGetDesktopDeviceCaps_meth.html*T)/wincerapi__CeGetFileAttributes_meth.html~Y#/wincerapi__CeGetFileSize_meth.htmlWC,/wincerapi__CeGetSpecialFolderPath_meth.html+/wincerapi__CeGetStoreInformation_meth.html!,%/wincerapi__CeGetSystemInfo_meth.htmlM>(/wincerapi__CeGetSystemMetrics_meth.html G./wincerapi__CeGetSystemPowerStatusEx_meth.htmlRG#/wincerapi__CeGetTempPath_meth.htmlU$/wincerapi__CeGetVersionEx_meth.htmlne*/wincerapi__CeGlobalMemoryStatus_meth.htmlS:/wincerapi__CEHANDLE_meth.html A /wincerapi__CeMoveFile_meth.htmlNR /wincerapi__CeRapiInit_meth.html "/wincerapi__CeRapiInitEx_meth.html:5"/wincerapi__CeRapiUninit_meth.htmlo" /wincerapi__CeReadFile_meth.html '/wincerapi__CeRemoveDirectory_meth.html?)/wincerapi__CeSetFileAttributes_meth.htmlY(/wincerapi__CeSHCreateShortcut_meth.htmlY?+/wincerapi__CeSHGetShortcutTarget_meth.htmlK#/wincerapi__CreateProcess_meth.htmlc/wincerapi__FindFiles_meth.htmlc/wincerapi__WriteFile_meth.html}|/wincerapi_CSIDL_BITBUCKET.htmlvc-/wincerapi_CSIDL_COMMON_DESKTOPDIRECTORY.htmlY~RINTTEMPLATE.htmlڲ0@" 8e  WA]PMGL K%/wincerapi_CSIDL_COMMON_PROGRAMS.htmlW&/wincerapi_CSIDL_COMMON_STARTMENU.html\s$/wincerapi_CSIDL_COMMON_STARTUP.htmlO?/wincerapi_CSIDL_CONTROLS.htmlC/wincerapi_CSIDL_DESKTOP.htmlQ,&/wincerapi_CSIDL_DESKTOPDIRECTORY.html} /wincerapi_CSIDL_DRIVES.html/wincerapi_CSIDL_FONTS.html /wincerapi_CSIDL_NETHOOD.html#@/wincerapi_CSIDL_NETWORK.htmlcG/wincerapi_CSIDL_PERSONAL.html*9/wincerapi_CSIDL_PRINTERS.htmlc//wincerapi_CSIDL_PROGRAMS.htmlƁW/wincerapi_CSIDL_RECENT.htmlƃi5/wincerapi_CSIDL_SENDTO.htmlƆ /wincerapi_CSIDL_STARTMENU.htmlƈ>'/wincerapi_CSIDL_STARTUP.htmlƊe:/wincerapi_CSIDL_TEMPLATES.htmlƍE/Windows_NT_Eventlog.html;\'/Windows_NT_Eventlog_and_Threading.html[%/Windows_NT_Files_.2d.2d_Locking.htmlr$./Windows_NT_Security_.2d.2d_Impersonation.htmla/winxpgui.htmläRY::DataSpace/NameList<(::DataSpace/Storage/MSCompressed/Content6$,::DataSpace/Storage/MSCompressed/ControlDataj)::DataSpace/Storage/MSCompressed/SpanInfob/::DataSpace/Storage/MSCompressed/Transform/List<&_::DataSpace/Storage/MSCompressed/Transform/{7FC28940-9D31-11D0-9B27-00A0C91E9C7C}/InstanceData/i::DataSpace/Storage/MSCompressed/Transform/{7FC28940-9D31-11D0-9B27-00A0C91E9C7C}/InstanceData/ResetTableS1%/win32uiole__OleSetUserCtrl_meth.htmlG-/win32uiole__SetMessagePendingDelay_meth.htmlKl+/win32uiole_COleClientItem_activeState.htmlʼnb-/win32uiole_COleClientItem_activeUIState.htmlŋy*/win32uiole_COleClientItem_emptyState.htmlŎ+/win32uiole_COleClientItem_loadedState.htmlŐ*)/win32uiole_COleClientItem_openState.htmlŒA/win32uiole_OLE_CHANGED.html#/win32uiole_OLE_CHANGED_ASPECT.html"/win32uiole_OLE_CHANGED_STATE.html5+/win32uiole_OLE_CLOSED.html`z/win32uiole_OLE_RENAMED.htmlZ /win32uiole_OLE_SAVED.htmld/win32wnet.html|/win32wnet__NCBBuffer_meth.html7/win32wnet__Netbios_meth.htmlK(/win32wnet__WNetAddConnection2_meth.html[{(/win32wnet__WNetAddConnection3_meth.htmlVR+/win32wnet__WNetCancelConnection2_meth.html(v#/win32wnet__WNetCloseEnum_meth.html&/win32wnet__WNetEnumResource_meth.html!'/win32wnet__WNetGetConnection_meth.html2{&/win32wnet__WNetGetLastError_meth.html-0/win32wnet__WNetGetResourceInformation_meth.htmlKv+/win32wnet__WNetGetResourceParent_meth.htmlAn*/win32wnet__WNetGetUniversalName_meth.html/4!/win32wnet__WNetGetUser_meth.htmlc"/win32wnet__WNetOpenEnum_meth.htmlqW/wincerapi.htmlÄD%/wincerapi__CeCheckPassword_meth.htmlHV /wincerapi__CeCopyFile_meth.html~'/wincerapi__CeCreateDirectory_meth.html8"/wincerapi__CeCreateFile_meth.htmlT="/wincerapi__CeDeleteFile_meth.html,/wincerapi__CeGetDesktopDeviceCaps_meth.html*T)/wincerapi__CeGetFileAttributes_meth.html~Y#/wincerapi__CeGetFileSize_meth.htmlWC,/wincerapi__CeGetSpecialFolderPath_meth.html+/wincerapi__CeGetStoreInformation_meth.html!,%/wincerapi__CeGetSystemInfo_meth.htmlM>(/wincerapi__CeGetSystemMetrics_meth.html G./wincerapi__CeGetSystemPowerStatusEx_meth.htmlRG#/wincerapi__CeGetTempPath_meth.htmlU$/wincerapi__CeGetVersionEx_meth.htmlne*/wincerapi__CeGlobalMemoryStatus_meth.htmlS:/wincerapi__CEHANDLE_meth.html A /wincerapi__CeMoveFile_meth.htmlNR /wincerapi__CeRapiInit_meth.html "/wincerapi__CeRapiInitEx_meth.html:5"/wincerapi__CeRapiUninit_meth.htmlo" /wincerapi__CeReadFile_meth.html '/wincerapi__CeRemoveDirectory_meth.html?)/wincerapi__CeSetFileAttributes_meth.htmlY(/wincerapi__CeSHCreateShortcut_meth.htmlY?+/wincerapi__CeSHGetShortcutTarget_meth.htmlK#/wincerapi__CreateProcess_meth.htmlc/wincerapi__FindFiles_meth.htmlc/wincerapi__WriteFile_meth.html}|/wincerapi_CSIDL_BITBUCKET.htmlvc-/wincerapi_CSIDL_COMMON_DESKTOPDIRECTORY.htmlY~RINTTEMPLATE.htmlڲ0@" 8e  WKPMGIy/*/axdebug_DBGPROP_ATTRIB_ACCESS_PUBLIC.html-/directsound_DSBCAPS_MUTE3DATMAXDISTANCE.html5/EXTENSION_CONTROL_BLOCK__GetAnonymousToken_meth.html*/html/win32/help/security_directories.html1/isapi.isapicon_HSE_IO_DISCONNECT_AFTER_SEND.html/isapi_modules.html /mapi_MAPI_E_END_OF_SESSION.html/mapi_MODRECIP_MODIFY.html/PyACL__DeleteAce_meth.html -/PyCControlBar__OnBarStyleChange_virtual.html $/PyCDockContext__StartDrag_meth.html >/PyCERT_CONTEXT__CertVerifySubjectCertificateContext_meth.html #/PyCListBox__GetItemValue_meth.html $/PyCMenu__GetMenuItemCount_meth.html /PyCPrintInfo__DoModal_meth.html$/PyCPropertySheet__GetPage_meth.html%/PyCRYPTHASH__CryptHashData_meth.html&/PyCStatusBarCtrl__SetSimple_meth.html*/PyCTreeCtrl__GetPrevSiblingItem_meth.html /PyCWnd__DefWindowProc_meth.html+/PyCWnd__SendMessageToDescendants_meth.html2/PyGSecurityInformation__GetInheritTypes_meth.html/PyIADesktopP2.html5/PyICatInformation__EnumClassesOfCategories_meth.html$/PyICreateTypeLib__SetLcid_meth.html-/win32pdh__GetFormattedCounterValue_meth.html?'/win32print__StartPagePrinter_meth.html@*/win32process_STARTF_USEFILLATTRIBUTE.htmlA&/win32security__DsCrackNames_meth.htmlB2/win32security_AuditCategoryAccountManagement.htmlCA/win32security_PolicyNotifyMachineAccountPasswordInformation.htmlD)/win32security_SidTypeDeletedAccount.htmlE&/win32service__OpenSCManager_meth.htmlF//win32service_SERVICE_ENUMERATE_DEPENDENTS.htmlG(/win32ts__WTSEnumerateSessions_meth.htmlH!/win32ui__GetProfileVal_meth.htmlI"/win32ui_ID_INDICATOR_LINENUM.htmlJ*/win32ui_PD_ENABLEPRINTTEMPLATEHANDLE.htmlK%/wincerapi_CSIDL_COMMON_PROGRAMS.htmlL, b l <DdM Uncompressed MSCompressed{7FC28940-9D31-11D0JLZXC(J$# JZ!'N-P17<(DIP6U\Tbphm tyBN$`4`r2vl@> )Z2 :BIRZBcj`t|rzƖZ j"x$V62\'1~9BDJ`S[\dDlv ~ª^H$1BnO^jz VX$ T#:@K_pN&;2Lc2sĄfbPlH  @,?bNa(uHBT7RGlZbnX6pl> &8ReFy؊ȯ4f  P 61 A $W k * T Ԧ . ( & J Vq b " d  4 ) @ ~\ m F ، | ° J  : J/ ? Y t z  P ' 28 E HM _ j x ҁ D  ^ f r  4 >8j`Hl-r`B"^5|E>YFkFj:V\NV6 `&,P37?ELRY^ejrR|lpXLLj'08,BIXSZdlJv~`ę0hxV8< ^$,<V^q5XMDhhiVR l"3̑hE2[Hs~^-DyR.3j(D>> ^e>H8\R h!|!!!!!b!j!""."X@"L"nY"f"t""ڐ"f"""H"#0# G#d#(## h_ HHA Version 4.74.8702$ ^tj}E PyWin32.HTMLpywin32Home D" D"  T#SML+T02f>{_wIwx:VڼZtWVr63@5` `FȃU=(W/a1@ S@р0QOh\[{`$SAZMe]8)hiqNe,xT0@ fFڶ4骕/*@>M Q|wn[mkvFſ/q+;HГ.~Fuo u ̘reoݼ_@D+O)kKz:%9!9ϰї7Cm0?C } ǝFrabXAKC7CPc6=C 紐Q.p4͊tnN _ev9e^^SEe$n/Cڼy68au4U.]łuv >ϼ&Ȳ(K(|ʓ`UzAD v2PyC  BU6{׋Nl2zS[/SADMԅFbj4YUAfAGP ;H1q !7^mj 1s4 c:Fh> Pq^:Mc=k.-"Ea1 -E1P' #$fn+avVjEbvI. v;/j)V b4vtYp &k&rR d0T6OӚ-UyRSH `yQ>kCTx?(VcSI؂~}f4ڌx5~!tɾ֏ό4Y J4A^ {3LHK IWdST5oaL Ioɳa$VQ$ix,be/86<ɔ"q-tux B4fSoثFcV#&\k&:FW 0:Gɞ$td#1#+\4tLbV uv? Ξ=#{`u_QfKb1w76eH)`՚ET5נᖈMW&W_jtfSC$h}@j@d\!34%E2Q7˗RSo.W[`d *)O."q Lt LG`G-8f 5"8ʡцw`+!{PТՂ.УF?+Xְ:UuWnFL2.g 2( GjQЩeϣ0f&C iSNuHajK@-١6&4Y8eo!bh1gaE&И 7y s6U6G\(<1ۀsm؃ ƶ{0=yZӖҀ4?USff-{z6I) vӲ.mc-ڶi0R[ MT;&Ɯ9I9e :qT,ȹW3kp83m2roݺmt>{vR l@ fU؋&Ȝ5s4N&D&Y^fkwuY6eXć ql0'f_;@5vYw'M"h 9aO'U#߷j?yCjDRc=kN,{& \th܀z"nIr%\j>=t~~T?\:HJJV8A6H ?HpQGEXF`%DmLlVE))AQsj˰uuMX> TNXhk\-,( J(ʊ!:^Et,J(J™ZXQ}2bau:Y ŰDD53EQ4c4M`5=mvh=@_*G[v2[ U A%9'l<,+<'8 0w3HI/sD"J!Pָ՗5j%C幦5UYjetwffX։&!?@lCƱ~xmv$M/$G<("ѼG>;&^*5}i,uNdd҈S,#͹XE/A>}VZ bH 2њykFztʆgIvE)l#Χ(s\y8<9lNctcYg4XtNkhEb'!mX(URѶV4Y)w4]DuP9s+e{TܸsoH;1IeȐbU `Aՙq`Ȅ:⢤%,ӂ)oRl;V ܖF}J! p6B2/Ulu]۵%H` 1ʀHj(:hW\dʙP"cPQ2E20YNBue6ޕ REQʥ;xU+:0ReY&Tdaxw<6u2Jzj RKfEZXf=uj?Sj> d2n`0OrweMFaBlXE"l*ݽ$aA層-ކCB򜘅 o/)nP9Dh#~F(zɑEbV\TTRA4nxfj~{51\8VSƂ6"WO 5J@B}ՇAw#m!,L#h<^ A+ L[R!H%24NU멦<R6|KjvDME~1B6U:xg"E|~]o?[ɶ5x #ȗ)h@PsL%ě4=,,ӻ[ѣ%j睨}"y4>|aңgD}S|@:a ((0R b`;uJ/ߜ(3-pgOyrWO{%HriFIB )*l1cfI3e+0yYNB'PU +> r&4ΩnP#}[=^{u\ ) Q5]̐@NӴVRQqL*wD0h׊[}WZ[4$g5C=\ 8&nIBoDvNbluSxG 謈 jwN PUK@S  r%I_O܀hY@$ux1H˟}"DZP,&xN;֔lRQYSc47#*=7ly?oͅf m;Eށe5aQ3u<% %r}PgȾ2". k Pf-"! ifzdׂ9_φ"B,(^2{MO8 nYB:N/KKlhA1B4+sĞNԾUG3)EL:x׵t9#qd2:'j Lt&P@}|E+߱!-HJh>I o `{f[ PC+cGW(ʗ,vW#Era cZTܠy?M~6_ |>/ԝ-{rR)ۍvS.݈iLYF|R E}uqAyБH͋QF4lg^3^ 'i+n^HQ8SSNZD X* 6HOMm{KJGKd`|'`%w}!PGz5цj\ꂪξvEv?J˕jkNSlJr!_e6}p&&p:A tKbޑf}bN `Y'[d08zhw"Y@7rcd.8hc I@эLAe]U:rsyh~z+N_NYܹ?:6"k/ʖU$?;^Ϸ%vE˥}/3ΡKTkz[S[Ѩ9qIoskg<G;\]rQqHG4e p*o9C=zUMTFeY%jA kv,zp YFoh[ i&=bTdYmqӶF:NiztKct ԡ[e,$Nڿ'A0%T6Yā}JpMq aQ w@FA)+ QC=CWT"#S,m%qAC:3P~<AVH&=mYRWS{7ۛLЁȧŶMEUèk׊1XZB H@VilܦJ(UdDo%B 8P@u΄BKK1s#7XXIP~9=T:kT~ʳ3)ND칝ڑ)𥌬NE'%Qho ¨>ǡ^ H$!LP7p΄FJ\Ar;"WBb1d1{[lL4fpe*T2Èq!Nϟgĺ'#t)ݿ_sDְ4J+ )ѡgF9Lxcs_<'Vāɵ_LBW`:7 2??}TaOe3 #FQى o#^Rfc:AQ<ً&FAuqͧg,P59JuJpw9:tǀ+Mv$ss<0Zjal"ETyuTDdׇ#5&VY!^x^ebģ18D &P&+#D^^sQ;=01cd٤|h !zW}M,93_6efo*$QFi@.Y{C+mSvpds*]I Pf.@8iDVIIF>9䇷ee/W`kOF|ƑfPg-Lr\нCL7"ddB7rTER8'ۤ Yۤ#mN kƛ x꺹0jp9\ wy/I'\aBKMnfJ Brg"U-${,ly@:*,H@/M[\GP% xrd )O 4TJ]A:ǃ*&E`',(;SX{ ;eu<ɞPC*!|+}obH}cӖl̉hX(Dȴ ?~y\%5W_r*r8D9&)ɔ1ZAQ*spK)bGUf]YLX]%Rs3 &U:~_U|cs % jxI0Idzv` uջUvN9tF'K(8P/WN?hňV0q5_v q=9pʾ0S^ªFHH7hp'Pb;5֑"T;CFr@DcQ z+B$c3ұ#JPȁax}3qCdHHQ:`r5LIՅ33Q(A@uMY}9 8 ,* a@.!mDËeR^lJ'_ ة$@Beqqh ]!"PT3{2(b)9#3:`x#}cMQo ]⚽_-d7-}1'߷YZt{ 虰VB=hN`EMicuQ#z[xu@1bC !tZH ?R*#.MKP'zNi!Mn޻ޏF{EpK)(^D,(P CܖcJ< BehƠ#.^)(&Cbâa`}ռ_RO,v8D5b84s <}9xj-2? 2'pm)Wl i] ԕ$zʱ:$Geu9Z!VHUuۻдhI%pq:ѤwмD62`ET}TY83Vx& d~J)+V&ߤ f=4.>i/#pAlw [{E=k=t4uX #,ĐbXr6RS'Mj](ۺM#$?Edze5'mߙuts_;G_.pk<;w|Ć2Ϲ&:?;~ټx_Ks0=7{.Umn% ?oνy'sGy~I9bQ,*dPOW=:)=ҽczpwQjb?]n~L1sJ }q T%}m@%kٶi5xKpI7}ޑ$syBSMhS o:+oyC֔#XJOUYB8]3boI&7@^ָr0U)1+iGrIDϥ%sqI+7( QifӒM=|ؗ7R~)oQA<'fMZ6W6sv8k۶99[/ y2}$ ; u3 <&H.4|HnF L )haV~Fj6:c]vVhT N޷b5-=h b:iI/V55u{|N廙7qTQnu.܊R)(@7!E^ ak!6)#EzzXV$N͌$=߱)#! A9sk6Ά@9%ݰIHR-Mݍwe͙!YA2& @0tL^hK;pxҪ>u^{)(dU8(sbRm!ُ57wt3D:??qQX3b>LYIyA98|+I/JjQB\=زz4Vj&`G헪8S1*o.2>@Նqj!a:YK +jV,&- %W5P-쩂n:B6Y ukM!@^!5!zG=háVJ3 4JI䠅,eLLR*.Q?Q\GZM;`:vO`bWTr(bpto\v:?)؃I]%|Q񹾐mxZ9̀ [~e"o*ju72%ݓ, '=<Hy˳':jv $. ˡ$ݼx֓S 4rωi'&)Q2<3N]];U T/P1}> Gc-Z6B\/@dPIchTuBȿatjJXS4,Ve|2l}@4Li4yo]O_b1 $yTWyHT bb2glL D8QBu ,xh8Ps'._j^RP)tt8S \bsRL[\IM 38̶cpDY\8} =m]mmw"$Iz$x Zpsi\iFN) 3k5V\_以85pH80:=HRq@חs^oX]0sfe~c?g &%G+QsCTSŶ}HQE ~$_k>w4TR,V$1$CףC}nL`03jdvbنpxZk䭒ʩS:2EGci#C'Pʦڨi_LU.@_] kb0xXv W  )D  +@- ,p ``.THA+>y * ^7I$uw W{"蒕`V@*t|x @ p/@/W@__W@t(b*z ʠ ._/`YF۹=@!uP#Y4\]UfPB޵m*-&T -e%QX{:wx8Op: K5$")i+#s$O)eּ:޵( Q&ݼ#6y=.jG^GF{coLZqSL'sAk^mQLVŸLq}sbNc謁 !U}} ~KԧP弜aP:0z=H1γJGO+xq?VTGcӳZֵ\˭Ư2VoOnn%p~dqCv޸B,TFK ظ{lԭE@:Pe; پqFƒԓIi 6'isk;&dRϜ*!QĐ _Hg'+Nq6cX5O:q]F3,PC <WeQȆ+BFD/3 ٩[s C #eCI_H9/ 鱫:R V$]ۏZa߁@u/GRVϢ$Pg@I([5H,ܲ^eL)v `q?K[T6kL~yNJtUs9f(߻:DysMd υ9qRq3FQ@/*;?),YyE&>e9A8Ǒ`:ډ7ȼQ-Pjg~wـWbH9{ omD|{C*>H @`+`0]f0P0O+`0]fGL 0S!mnOƌ(` (Kf֨Ā|qV 7,(4oh4f^5J~g̴ˆSCْD$Q}'Yˠ3 0zgct10@JfEx.ŀpbň*ŀjʼnsD+'+0͌[-kL:c+s0-ʉ|y oLB̿%lUi>ĿVRK 8\ʴFԥ]\E1'K̥3 s0Czf:* 6Nxړ0eI%e`x#jHF YFXZƴI̲.tWO>f _c{&P-^Ȥʓf0\N'\C|ꫜl rAWUTU63amR!B[} Y8[H x `F0/)$gM3i~a!2i$XNV”Dyg۝ROӐ!x@2QG8'KuW]kJmv"wS CNLP!H#–=qL⭕#$uh˕X+bӬ-ijr(fFb%SŲʌbΓJ4P35NQ fRu9{ij*v=" DZ?z}I5y0:,0/'& WܐG1:pNELXUDo%u}_t08ҧ1},ّ.mU@1Iz AcRj*d #\D>vwVHWF4vQh5P.o2{khy2RX^Ծ/(U:&^Xљe!˴p8Wdq$o33D4{~kTȯs #(06d`G ۥĹ)7ѩl1gBD6X EVI0,)+Y2;.=B)*T&7KeՉĨjg Ήpʿsȗ0b#@㵬+يۅ=EwKU^!B(ľgLpOEN\#c!a2ʺ|BLQ-}@UHd!c3c N˜`T;l".2G#ʸJnj d5;z-gN=Űd3+Ȥ'"u=A'yDW ' ,%.cF^*(:K<@p2IoQ"Nlp'M3Ɛ*O2;YN9#aB9pAP5 9"ļA SI 3u2m`lf ԭkTFUJ?F=9N ikwW*k ƭ3EzGCO4I|6J?*!Nd/wJ'8rvp( >bC6BnEU>s,i$6FƇ eZ f D6㙉g'/P#H*3Oި\.82TuuKYeMeY5es WIHDG&w3vD>HBh'*TAH/vw]ۻ{߾k,ۤ}&WC=%?ٺP *g܅guA4f g},\i ԅgirM*Ӑ;ڂo_RGY8G/:N~ZʯB5T\Za=1S`ujɘ(b e&dˢ~ڢO{~fR[я ,ry>{GNi[@%!x,PyS);T?6%`;{Rܠ)U7̕ ,fpMúA+5 [Tρ#>=iNk+4* -ˡv[oM ?+[Ca܃Og` Sk $IjG]&Z;H]_mpXdW"M鉝,Pt)jYiuJisIݩ2B4T)m9c#ovp@4 /CQYAlV%OrKT"G"Vx"6 |Re G=F=v)XEP$8;otC$*_QY@]ؒCj_(*As K<_"E;5;D4 >& qg -ۼ{򋍜I!: ’\X;/ @еx FYVkЇ8O#Ji1B K W@nw)tvzܪ5Yj}ܝKФKƓ(*#AUݧK} `#|cmyP 5=,W2iNCws,47Ueƻ1'gry*"ɰk{h"g T+̩?Y ȁ1EӞ=8HA;e&hNB~;YuA#?&I^?eX_.g/}{AH3M?=Jk4Ҳk> qu%W5~|T`ذӯOE^&2&L_5"m}'u !9`~BMV%*0LQ ") d_غ;u{GΎ]j;ԨEYO rF62*/Dcl0IW/WjZz.d B]S)Js l\Lfׯ~F2Lh@6#_dr) 7H0֙J8M+dR!::pm)ܬoie0_] .d6[աRGI߿rW{?3\J0z =:8h9K k `ɟ \`u |Ơ~^h$-1㣝TJw Ս2[..%i.;Wm@RO322AXn0"1FL9/irCVϝny0dG/\=xEHد;LjcoK]QH4Z~ mO{*M 2MMQ)e":Q; nO_ʳ٬0 =hCX Z \*{Rx=*$ .c“8 co969خm)a@oA{ ȐHBJ!e*?"'1"m:h~ysnD;D ksa|-c鮳Gp~iaxt0JZF[܆`8dIʂjp  ²ܝӔH(;CӇr\*A4놙{}+_5Q\C1AR૸jWA>JyPyH$L D#p5gwvE D"<$GP8WQD錡o[o0W~ ߹f~UʫWY9U[5ѶiW_{O}e%-SQ1|usf^N _NQ֚f.\䯵9K߯yzt}f"rז?ӵ*c_|kU1|3cfFWG"/[u[bZdEUf!#ʅ_N?,\r&PR F!g틉&1MW =a$!ĉHF: ~JA82tXhId2@#$" O[L "Vx/[XH`bh5iD(e dF]<҇8&Ú{=yd#ÆE0)kZaA`_>izIwjywzoR—eF,8Jv^ѥA[{pmJiB+r`+'B-0Tш -Sqn@Oj ´B \ p%fXI7Zq&ύٰ$'Kuunp#w%=ZB^!_ {f3ۂ Si2SXUjWTXTY1r:zAwØs`'rDeb Y P69#Ӕ*m]$a@.sTRbxkLvnv[+#6BAP YH*4O% 5#ƑϠ2 :ЅdJ28ÏH x)Q3j):y:R Ér8N)C%fh!i A3TLہ4C4E\fU)Ziwkq'ɺBJ!%M!;Jlwb+]mbɺadLrɶn?2RffRʒ Ln3f824 ߿T <*j;(j4[N0 Z ;+wdR񙹕ɧ#CD@0ҳ z<,#,J3p7)JpSnr.I 9M ${0X/clzַֻoe|wsΫcd54,0)ʁpT|I&O|J.ϋjQ'b< yFPŜ%hbxĞ81g*LJ㦢x1x<7bOx.7pKNUiU륱0 c1:+n2ӳ'6Aigg6_0Lz9DgÅS }P?5l#+%7Kd/~/^${t:vZF~ŦeU֕a+!pMy@gd=ZL(C52^UĪޚ߲{۵[8K-_&$%C1d");#bxgBT/<#M:d X2nBxpO~*G|23'ʹ|3f8IC#3` V--ܦDq*7]]]Qo`+-d)D.o>:=3?Wyͬut0ɂi{33yz:@|+?c吙^ʾI*W(L^W8ƒOgg۸7:/}[zA%ğEj^򇖭9wOڇLQ2A0e2n ?>MN 80ar*eA_Js( ֵҘAk\i(PYnMoQ&{z -nG((L(eYUIِ-I1PIcI/h @% %^oJi @:UOnF .*y6"xßXAw1Q"Juη^_A|q!O֯P´agm"dg1ָ>t*6ddS نMեiF+Yow" Zz~ÏiD;gsqC8&1#&I:iR^vm'V}CX'djIX]_ \&I:Nԧ-@}}THw^pfҭpH-!j{βFOt6p5<\A&%K!VdzRI? F` 8`F^UKc.J!ג iewɳ +^JKw:RdL~[65y#5: &/sDN  yLfDU/(e"@b,~jE> DȲlSh }#ݰډE)?!(i= ttM{,ہhe Lm W9=\-sMዜKS5$B77c¶;еO{O=9g'T}6#x38bݐQkL}Zn/^67p*:32)JbP}?ܦp4eQKEhlѰ *)rY~ci fn%FFif}JHH{VAGF,"Iy2Y{_/-zmtqd"1M]` Kp9+-+*|sE_ XI`˹̔,S# A3]`t\Xn 윾 u73^ +:͑/Xp1*Fb#@"?D~| e_I"$1'HF=S,-2HF< 6X.'iSVʉg1\p nCǖI @ Dw0iQ1vqȅI w .:ol7DL6?J!֩ԭ"{i?fcUvqx3r͇Ǖн7zfZ0zoi,]HC3qJ?6M91 s^)r 9O)ʀZ%)hXJܲg6f4nx'J@S,UҠwMAL3>[@)kߨz:k,*tU(qэeWxcs'ǝ&ysFtY 4 1E3(VFcL@$_֨u\UWVe^{PGSs0++f^񁙮oR]<EI_ZjC;$$lߪ I;WWF&wTLof`T Ώ)z$6`0)37ɀF-9zAhBZdɊw/G>crWV"¯ *-v>7ߒ6 JN?:'OK֯q}pUk[L/` %Zka kf[+4Xܬ7nKuLJOĸtv r~sσ=tP3(6|;t\I9OpC53Tџ jn34,[o[)@Eƒ絿 ]+@0-ͯo 7̭E^Aw?xT$8tmuG, 1 2-fƁIr=xWwVwڽk-\Y&߽yHX텛˟GNG?s Fιcry/oB}>mۆsgs.X\<ŷ=c?Au ^3[fic;Wows̾tW~vᶾ܈夷[E]Uz+I?x8IFg$VGDs4 v~4#YV-Љ#1HK>Z8>@БΘ7GxVF oނѲ:?o_Ssh57T,9V W!ہ(4X\V%q(^_Zù‚ivx"S{&0,A~oȑV6U3\'3MSi3Kji`*WZ3Fi;zOGxAk`7-J9Rco>(Gu׃~*.)q[re|=kOQ-$oJgH&7kL@ @tqZE{Y$ۋ $Cko8^ XŔɒ)$0W^K<Do{ HxX&K7=ٷIi75CL_>OҦr, f׍2菋^e"wQ 6ͧj {*ٌ8Ƣ#B{~h.D"NyxգZ\hvOhOv.iN*.Ji®lG.bO]ᇷCmbxD\.4+Q$hCJWC+͋g 8訕Z]w I&ĦFSّ̍8,Tarv&BwYl2Dơ7$5h3PuE;ل56P[[=3ɹ0϶!c]U{)FG`ƖV\npXmMEzz.- JCaEsC .LeJg*YbY Wb 0 #i3LFBmR[6 Uk!_|ve\FmYT HN}b? I`rւf)1 ]L LTFD3uv4uVn R$4$m$Er>x@|m8ѢQs'E*PeAz@Dhr c$ `$'&)XJPB]kSZ~Ǭ}ST{RegBPfqXJ }`|䐁A"jCE⌅xAɹ!*=nS+}Yƒ)di8J'c9W8]HuFF6('@1`400BӴ7DuQBF§ʺR[hba?s[ԍMJ\U9zyhZ3][4wh$ vƾL/` HjC˽pPrxg`y=(E|'SʞA g|C/϶'g*g2=./Ajq(+=HUfl"!* űj* ɵFɦHE;=W.-6:RT>y}e|[Y!cz9*Ы*JiHA<ӔPJufQS@5kT2jŤӸefg Y0 ˣvdѓҦ`P׆PH_ڎlk9mXy;ɽTöWQ9x}2ir2F}5e~W 5KuiRcrW& 4P E ]lԺ6H'e(g2*1ن5 We -ŠFxjѨLh!PLGaoMɋte,ݺƷ, Qﯥ(uSLh1fvLVO)%ł3v]xaq^coZ'ijݽN`%UU :@u$abKP!5QQ1Po}eW5 yU3G}>O0jU@@Х.Oj0M@i*M5`q  @p`RT8k)vJޟ2d44e|ߗ&abkm;[]ͶIP.h=Bʈ஠Ak(6 ³;w}Dt(CnÍnU֭.g&KCp ̀>Z:q=!lSjW[+{:OD̹7nfls^:6B͝_|q*p}-޾>m5MmMˮty9r'=o\ēe569u/Z|7e:ûZxlt3~P 39%GG`d ԉJ7&9MjH."6RFͳ+jCG뎃*q,݋ |o%WnJxzq|WUב5:zkw+kMqnLv,G7w—ѕaHbnf>;&.׆c+id ]75Q%XaE6P4Xrwc& }6.GqI'M}}kX=DvMMilqXUByȧq5Q- fvvjkLjtF2K6uij'YKFkQo zRVw|y &@\447r5OF:Ψk& ;TI5fі4"5k omvltU]RsC|s+LpDƉ0> 湮g9SbkfsVfNpLNN;FΕHZr%)[ aViޟbmX/p-mq0c;gχ\dbx$alW5sQbX_ç<Ti/$TP$T0 ]I$? f%:wƝ;U2(wnn|39@Ndp73=. laco܂=qVҀøpV.Yan~* R'<>.˼cNL=+QC=k+JjxmL*W Js$P`wOd>h;2/5'x*>;QUTDφ @( ;Z WjO\Kco53j7A1t}qm u;pw…xiT6 Q"RMEV3LpǴkf+Eys`s)U@/A6qU 3 DX%Ua[r#@r /תP^!n|ʼ!-cM1#Xyq@;fB9f Qj:[pO')q*Jԯ- nWPQw"iP2!RBDG[8&Ӵꊁm^?O/e; sH}Or:;@(T E,[gM)  qiUً'dIBs/ĖT2+WNWed@KTо9B6fR4  7QcP/U/fsN+d"!Id* ^JqWx4 +XteD~b-tP ic R[g=tV9˓tIE̕ M(sEK1N`W* M(rx^@A)NTn& 9ywşFŢzlG]I Dqrjdr;}LE2|DNf/$9 Uٜ߽͋uj%dг:E~>JE=g\bOv eq_JҟQ{%Pm 8-:L kH%rd x(@x6ޖgƹ1k̕q 32/Wp&c~4icد}`тu{pa7Cu&wggA1? Lrl`e"u"H=&U%gb]pgaady1W}S5&9ҥ>+dקn96jkZy/~Uy$#z]>KJUCuyHWCkE=DIiO Z]N:0ZVQ a֕Tsp*'en_34CU)ў̋4&IomսMks-n&M?I4PEP PNSDi>is ~'&B+~Ow9gdɻV(-Jq̭֑^Z,fۊu2CP0`fj m`=$ 'RޗP(q͑bT+o&.4;}ƴyj-~VLHKçp˚ڗ\,UTlW㙅 Qe:UkG>S|FlUW%[;<,#誒ͷӶzojc?J=1Auiij{NZz*ϋÉ ,C3+Mܬs,Oc `ᜅ-F'1yn7_vqUnZ6F(K6H;;Mc~j$ϭ5 '_n}#mTc qP:LB}ת?{h6|$djU&69N(PEP#'䑞TmI3:i;cUu(P R:7fX ݂.v'9TU~S\h̷Fu7#Q\{epVrP"MRqtyP Dn.&Hh +bI ?ۙԘ_dl^/<'ue;1Bx|Nf#)x&o40(}p"陴oZ+KEZ^瓚V02vOM: d񁗌, VKAI! _B?fE]p>Y--`l=Pt| `,e\_tH]w({6g0{?Yl$5Q6fFUm) ?7¼YD[01tCcܡ+b'EaFI&cq}PFu))^x !FЦgD:ϠB %,RMi2bQ4 !U`=#wT`>Be;_?I:Ǥ._6qK\rp#cvJn+)Y~5I՞~#w=v~C~@> _[{$}gi+ 4G䆍%?~uFqVaڴl.HGCϾkw֐94rfKbL$TAkyQo+'Q 6F: a|Cl{>A-0OA@Μ@|]  '(DOGPE}Z½B3ktO6r@m_S51یۆ>F?_fConD1GbVXY!5v6%ߵyFWh V%Lo*("G.uգyx0 z o]R,幨a*ZvZZ"p .! AJ-{)L>#d _VݗKd : }$~2(*bU۶ؔfdCjT#VSJ,WjOv. [.5HM- /҇"qJg=>@*2!@=},= 7T9[XjLx}6թ'(VM>4g'# \ /zu:u:c#D/{v?w |-jCJ]Hv@:K3 ]r aJ4y8D eb,еB8%ŁFi`+[/FRN"PLEDtSq8nxdJ3VZ[Ҁ}f6LJuZnC[i&R0F4u44ǘR)^gذhX K{rifЊ+hr؇Dv[L! @vcЪb7"d4V9 #JtrG?[p #߫i6o7jPr+UWP6p|!F;ޤor9Aof4`(O^ y{`͌Zu+SSPV)vSN d֪p`XmЃ 5ܬ2p9y12\ά Q 7Fɧ}?S#;#z'u3QyてCwKC7D64͟ 13h.u<}aehV9bYGLb=h ~Aan5nx. ؙj\Uďb4e0v8>l`}]_af2ׯ>P>09\i?M/Cd"!}0b Rf ;wXaHMF,dhy@w%D E0rE0هۮdZ\@ 穙pң+£a#o!22ƮVH34CU)ў̏%&`I r;MqF6MzI-L\eN"HI !)Vqq]7q["3* oH,yq5#+tW^]īK<q$1E6*m v6ͪ*DZ~o]7EX'zWo_sqVjWt=zͭY~\?Z56~X3@Ѿe !S{>VӴo'KkW~rO vfu+*׽C/Kɧ=j9vYl{OC\rPi~6Dc^ [͸E@RQބ~2k=/ujCښXVo6m_p=h]D&[oH}r$z21[xS{I{Eb6?dCoº@ M^MIǛܟ>`YFZip5uʱzrXBB;I1URn0ZF*=;wFvǦH%]㠑GU@WI*'ZP*B!Np?~sj\"^ҴMe}b*n\vO8LF7>E/],G}]>ĕy>;iM>ܬȦ-BsY׮?آQv7zX)!"VX8&QꛆY;q@ P Zo+F>:`z2Wk7\ AC-#1Yqg5n3o4!Q,7 ƚ%Ϭ읫E:5}<޼c rns{l59ckr']~z";F-T b0KAp]7E5BrZ>Va(E)"۳L##%GI#e="CA[ޡ::k-O˚R?y:?UuỉQ LLx<¤*1(ԨFXe$HQM'Nސ \p*wr@Ktz'/nT"*WV;a8+q+Fi)鳜L>^&]oΰT[Pӈ'x W)M Nb /DŽҳM㟧F }$Y^N$f0LI"AShPGcb21$kG{Qk- N^PT-~ ʁELBT溹$; v131< Ӌvll"3Ct%hg@*ie_MXݷv*aNyhmIsQnZ3w<3ʧ@Gbqcegޙh"*Kk}Ye[)]||c.c-6*V~I70(/t,&D/F$+,SijmЦS6-mFIIO*jN U9P}§SR%-i4a&mJ4PpX꯲E&2\MkPS h28x! 4` Sf2'k߮*u[̕KI'}0?CUßxYx1keek2h$8pC^,<|p`Ih| nI(RU^d'hI,$@O(w+e(F)#8C|}QsrU?C\uuƓ),09=ן ƪ֐PGIZΓWJfG&9HZVݒQVokbŸ'ęH/n Xy5}~^F(O{f8α?(:ج7M?md\_lYA-sA9*c3Uvo=("ӘTY-!6˞ct:sڜ&XP\!Inwˡqn՗QKҗar~@$#Z]PCGŇw;;簋Ğqwǰ#"OUaWX[Υ7g͙YlIF~<q$ܙuIOKG\l> 4m(RNC닖;xamS ^. mY Aas!F7P*\C5ljB7erF"a#" adN-M؝q1e؜҆9 ܏:/(Кͽz(rHHU(A~dڃN8.ZCYq yXiﹿ^饫~GDY1PZ0tSs9.qf&mST_ʽ . Rpi(IEcΑ`;tm-&˵rwpL7;1zY&瀪p;߾B;B4(F#"h]WATxmbbW X>:xv:9Hụzg7IBUHP'pks9XJ =qk=|5y?LE\Iբ*F~k`;810Os?FYDa-ُEޑ|DYM%䝈% #c yQff3z| N@'L'-5y1@a”˄ؓs8fʉJv@[J'9PtS,( :ODŽo1S46]i_"ۓUILV§)(N̊Wz&Z=Fakk&5"Q Iɡ$)cU0, HA'#$orRwJEeSgt\dʱ%#{Z,bH63 fu6Z|I%N^"׹w (lץv/8r9Fg/<"e۴4%ǽs+#G0 -dcbȵ! C!dx("9fξ3 C5R~_3ݨE@l[cA2[^babW xom> )7H"q(Ujjwbe=m~ىs8K1~Z3eiΧjkM!}2?15!;y/E;"sK>wb75N@Hf{ C6 mtsf jXH9ce>1jX/䅷H;Kh󫉘~ÎhW 1_CfPFDaCИLM/-4"r*" eDf > )~={:*5B!k #0 ÝW|wk_x eJCUId$9J\aOQgnHq8{2jo1& #\ or iod C[7+KQ_ v}w8v+e vN"]f}7lRw{y[oTBUK Nw%7$$у؅2HJf0qؕ[8 ] #^l6=GevӡEv7O: kqPmF<-gy['vp;ADBg+NZŃ@M)˔nixdqJvg*tNjP^( @8[=˞+{StϭghKg uJ`k#uLZW+n} {/kyj 9QR$3_b~Q(s;z VJbPpwoU][ID+ʿie+z|ˁLϝW@;Yr5үkm2mq؆qÉ 6;ܭ䢦DYNF㌙.'}GPʷ䩩4rrާپb"҂Xiͫ9&f|sSE?3"A~C:t.HfйԳTfruG'A6r]!x&d|a,CXytxd>BWx'{x|M'@!r풀i1 :Ox䔘'US{uUdcDI!(nF2Z WLuiW䪇 ,W+ԧϰC1ג!|>'1,D|X;pD F$AN(M&I5=٨؞$ W"3' u _ lބLq`'M'D$"(NQsmj}Ox8QNBr*Gy!%IZ|a24?ĸ`@unh{F$=OzZg> ڲ'= MCrFyp3rhh5-d!Mab'DmW*mdI1,rMkk&D4琁o rbt4/lNP[Vi딶32qi`ښg"g}DndX!XXĖ8!m]|%aM$ƞ1.*}gS@$2%$Gn'sp`N >GMm⃒+|5EfTQ(WL [+PTb!*?)UqsƬbً1 gblf]c*vccÎ,%h"ٕT# \ $6Pr@7N;\Tu2($Z2tY(ܹM(RJ$UQI8!1+d{8d4K|S)"4j,HF&.6"i.YOR(T7s|Q("SVqG?+`V;.ǜEօL_-qi >5 *1%uA@yN L6lĀ B4)sEVJ^ D6Be?LҌl+a_kG^hhv˿ao^B@l:{NODx D2g<1bJĸDfъD[Y4q K /[֭sF@NtJżuv羚MW¤kYC5W>C__ѣ牄4)&7ݜfz/~;G]yEż_v-/mmuyOKTsub /e Km=KbҦucïG͘;EsSA xfsF|_˒cʚuVx+ UIi}qìMC8F4p&ii;WwaC#wƔʭU4~`H^- ؆o݈BŶ2V,lZ׈* \=Ϲѳz]u~}b?7[@U#!K3Աgri$QbЏ4FV !2 =r +GtV5&ekɡ  ]V7qڛNU՝<Iמ$SfԷ֖v*NaqrP$.xDI39o; Y6CM8P0%Q!Vph%|֞N1F24ڌkY6q 2R*~.=<{< ri6 bcQjׯc1t/.@Nu#f߬tw2S+X=ABkT1TQ+phؓ+SFG4+JYf9\y.ǟ 8NPc )X`(z!yP4g<1pħs4KWƲݗyeW=c%q<4Hh}ȇïjl5q`SqD7Yӫ|]^$EN#M M8WD/8L"RRzAG,\8P;X4hsC+^µFvXs:z9u]xYglp4v06o;$ࢂJ-L-5+]me(_\4b:!#N0Qbc()LX>a7?zoim|P/҉VçR5ք 5UZlґ-l _ss rhj٣:8nk~wQ҃_U60:(' vc%~qA8_A 3ÿ؈D6\a3ޡBkhcM8+$V8'\=!<*KN** ZfMˇNF((Y:aCp%*,H 1=tū-*ov5T:;%ҵKV I <:'tUC 45ʞ]+ZA"?ҩG&Ct41q 2\r c+,2hdXk൱(S_\(Fً,g-fdV<6 CkL1 ,lbKJ'adaͦ"!cqEjΡ&IDAC$1"7AЊ]{yЇq4L$@^/^ m.tic0BAgy4fi  LbǀhAFɈhXtbB8*"r!oլ#?22rغ LXͮG !)fHZ&; ABTP(L%QE2I)jCzxɀ_W=u%+&Ae2&t>0T@ zgu"CϑGO: ސTD'${MH  sCJ$|!"B-uXd1n2``B8&XcY 21CG<FI;d`\0$ztI&%R=`&z"~h\Uc@Gp//FH؆If3b޶ޒ"M&&[dk0߰p 2^l (8nB X4 44ʵxe2 ت@h43CWot$[$ZFmYڒq,mz}^'Ӱ^!^:vn>‰\o򮾸~"O~o*e\ ]#>>Ⱦx'ĉ?m[7ֲ.J4syrx /V[y+<^.6oGq~O\F(-!^C4/Eޤ%F8%SA*&k:Nl\rb# 2p'8Zwb\ 'f/67o 0Rۆ}0LqoD23,%i#+Q-H/pѬ-%3FM!Z|- Ąk~D:<|-ԃ Ewypnras\cI=:*GD*ׅ)s?\x b0Htԛ\R{A*^WY`s "PyUz Ëlx/`4ZG*[&C3y]m9\Ks3vpsWqz(zʗuxYGC=qD^"c7dS΅VM#nSԡo5|/j;ܘ+@tfRƒgnAJCJC" '[!Xd5cb-s9<#zt/n7(p(U}z 7+ʇGѰ"I|X) wՇ#pGY8"ta$+7aldFαv vSLWݫV:z29CSJ℧7H HZl8[;1cA "M)\DGHk&Z} .S no|-_ Q2ϑ?il(lR='V4潢YZ|f `yqZy\clK:u Ֆ| Pێ*V8L+V蹋"p׈t'bЛ ^ rƩNmB]r}ޑ0նG4ӺK/B/=]CKrwmF"4nw[]Մz683cp0 SPJTB,BiK{K-<>MlcQw }ۻS> IwڬڝԓZL!ߥjiNgqOiHZ4[d?F8t:3/Se}x/66Y8(#l#㪥?{[Ɔ,-1]hFoۃfQ߃i+m&`T&q{aQy9{pݗ=DOXxp [t>~$(Qw] (;Iq[T$IG{HUؖۑsp-$nC02@NJ[yyc5Ο ;7#73e'qe6d ? 61ߨ}z _d>dR~瑜n&A䜸s֖$";?asZGxP B$X)YL(:mB v.dջN/,~jWPGBl8 V{%J"#n)Drtt!h vaΈb?ԁeg) | `%R0^Y1?RBDD'b D]ZypOR0ݭ\>K6}r>VA;%ZӮ P:{ [sJot@XZE_:PR/9?+?_)O^/`mL¼̤"VC<;byvQcI%f HloBm5~F<}HǮS̢UHP3X3HPs:GbV$bIF&5+;{NAKok'*kl͓3P9lUT!` bZQ1$>+YȝmH[T&V$S (_M tpbG< v=ȏ{2;S@!12VWc윳0+ Ta)ܭSZDV%M@leG)hi3d̜6LfYyCePRV#Į ዊ+HE;v+9r;Z8_S5~\mTL/QgJT6 $Z E%SeRugw@q Ԕj␸PTk^L_*Wt4:WT/p#Q A(9?d0~ZF8j*9qPXmvij tis+0lf~&lIPqILI*g5JN3*4,9(fM>Au'PILV@+$hꫯD;=^/chl^ 'U!nDMA ͔CT%nUSZy!Ԫ :'$~iWEqZ"`^K4iHo] 8,1 ę瀎T8wӋ(L@0;OT(uIZ|)kAчuψ$gĥ$+{f4Mh-)ΏwvYU XEJұ]Zl?dVMl9RWVj'"Q0,fZp>zp" bXWwOP?|TB0ce`T 1Du=7L29tLƟuQvP [L[o-pY =Ccx<UHl]Eij][yEēKtZh }<[qWQ*Z|S$ѬFgTQH|F3gdϓFl"$_kFfv_1:V &1:곹;/c-7œ$<`SQ 3Tךs. M7PʊoFE)T楩hQ]~ yь*@Z @g벊,)a }zbrNti29N%[/-SoU2:3Wݠ =ľv|YQ  Q`=C03U(H{wl#kdv]%e[n3*YqiڄIdg=PEpjPI8n$J4A@$JCx t22M|Z:b4CPmUݙL2q> , ^02sNmɖ33 ˑ *șdyGdj۪g]Gw{1V~F[f>n~~˝9UmZ~Z+}F.n/ɗu(4Fև4)RS5rl79+}m^,NR"dZ$,fL-"tFSD:x±BG.+,BٛPąUZ)oq_2f&2TB+TʰR5{V4R&&DH"t8LN J5bDg`GtiE9 l/@F/HYi{@}&+ZXਗ਼h&jB(,ADL-RH LiSiɩTSHR pfFdiIf|ɐ炡@e  %4[MViS$'e @xD\TN\:B+64ܒB=1ŒsĨ3N"xRŅ@ڽH.8z2 XVj:p@*I<8ڎad;CpqicE*PHF 2+R(/͆/̺TmDSDilq+pQd`1=mv:Lcl(-{8hP@vs&PEW,̤9 d -t:A Qy$E&τRP6,ЃhR SO5щt>5 -}-x ̶=K`SSyнJ "E PlBe {U?-֯X(3WiM 78L[Ӂ$RM߄lwHH߫ @,%!n8]ܝaA i 1E+VTGtv%^?7ʗe5f\`B-j=z;yl&bQo#T qԪMJ;N0֪l®XeCQHQ. j?IӔǞ&BGJg§X hAʴHґϖQtЄCDK\M:Ƚ4 oҦ7_hǫ5_fѩv)׈[\'ioK-ze.JLGc'uz8 [!j\zBHwuWv=@fJ^ R*uipQvaYJkg;s_6BA;xC4O-S8Rj@\(# %Tyqizi^[Y%sF):g|K_+bxؾG/AxDOvf,)5pR5)×6F3+rd Zw ͆3H^PD;o8t$Qx2;^s޷*JR<_z?7n:_{_ӍA82Bg cnx`v{Ƨg4ĜKL@Q{74R0u^˚ۆOz7ٰ Ǡ>ZV4Mk"P'\ڤ髺{1 fVWjAӴ'^DjRJ/j:Z_`(XP]4CZL_'~8?S?!CfERY&tRyQL"?h{?_i-G24FS b[o"2A%ppjի;yq4|z[[U䫶stX 5rV$60mҾ ,?з ?o筪G䙙>yբ2p܇ /;'75cRQeN{u:=!v!#v A}4\Mp=lu@$G]k}@B_7FɅr,ƀ}TI%Wl֐O4:H1!Zq6#CtUgvM$Kb/;Ȧj(2[xh'!Tn*PʦA:saqAU2d(NP3םއ;틥t-N$R\-nNywlN;mr.*Y噵pDb8iģVmYE09=FӺhD.`6Kc 0z^Vm[cڷh+>(#!${Ȫ.ViH[ïIb_ +J%il)k U$dQB Z'ᴂ $^\%cc[ѷF U'MC7$۠)㺩䄶Q<ץHq8Fx129.#CK^X֢mb`^޶bP1M"i!N$n.PN5Ln3ݙS[~eRdfb% D;_zHi[\x8r1te8iyNŴ,#GYb<7@?u[Ɇ W+9C]" 5R&vz?t t6\߱a W:ޑTI8nҴQJ62ȀX#z25&b;#v% bh^Z9}ld,Q梬Ml:3hI_aԸ`jx{Q}N @^__ 0^q&Ԅ{>6p AQa[yq.Jך h#վg٭G+R,>hHF?vg4@}ȑ!Ym9Kʄ^Khr}\/xܒ J ߲PBͅ'hQ!-rIOKl  KsT>y=|OT^_B^*͞do#c>eoC03DSD;1oIoeeŶ DMQ, _k YQ1@f{x_"p³ Amx2w_ O'aB&$bֹZsb1!0+vFHb$@,$YV$(|@.^mBc<{qWVU:K.[kCKvWzY[4UT_qwnRH(_cx=&J= ;bc;U7kumvnc7oͽNOՍֱ䧳Z#kky^<wxFjhi}ja3_ZĻjBmH섌;in]!H~ܱIu.Y*'e~߾[p ΰtVSReuZ֞רlqۻ~)2xw,ٽv*dBCV$.'#BA-7Z)Vb,;jӣղe(<2[ *EZ^m% W*Nw+e*Ԗ-l:VI {Q;LR tR:hEB*I ֿ W~l>;p7JuRfy5li]Ir<ȩ`{vo{^q CidHݠͤw7}d}L&lZD8YHtEiuXfHQ0N`0J(hBT%}K*( L$874yֲv r}QBLq`=G ^q} Vk0~1$f:Gkb!CɈ Þ9e@ %|%5=;~!b" +ҀaHiKHIEeɧD%)G %\hER1rOuD E3X`0*Hbh "uiv fZ\'b+'Z֌'!)>4DL눯VW/;c dgc$ D F<2_!J1 Ũ汌bh! yKu=QtLmo7g|tefkY\9 Nu:`4cS<}2aw"~V40v2#Sks_(q֫e"W#;rj|97fB`.&6W %;o;ck /^ne@/@qH:fS[7 :=9(9 dMI$H`Z5Em27^t /rA"NkyUPf,ү f_QsIb} &7owz7L;<1~tR2 | < δTaܓrn5e-I:H`ڴ$qVM=Q1S2lUy +\fTA~}cO{KBmb[ezw̼s{Z,:ol m!X^exMw__Y J.B7QoGj.7LIKve؂NN\:պuԲ([bO~Y-xL:m>ΤkɼoyBS۳f+Mv>w -*ϕ-? MG6kMRGlM ރPg{k{B.6JcLŦ ttqڒvm͇%(& E`Nw΁YZI:fL8TʠE\6SW<$SPX(W1!.zA0~\R |+aTT5#5USt_=nY0(E议(*1j1f =+5|F/hgD<4\%鈒!HG)WejJSڴk-]U:'$8勅 Ô(Ic פF$n|Z ʠ]5"`ejTi0(})IʜmNܶt'nSm&|) )@HV} x-Z6'aFwc!XSpqA=[l(Wx<`[Sf bR @LьSr!*՜wOK#V=dq Z0jZs)uqF 7xOdw-PS; ]C0vpOqz}}^7rNW*WvT(2mi6l_l>Bh)'֓_Ypoi=*ղc%=&ٴy#`T-J[^%mzIՠ 1pX*)F MMK'M" uF5"d:mX&)0F)J?6X43^_Q$+=RΔFHC!rפM@_H =KWHN ]#77hC`?#WsA.XrtejwtiΞ+]4~buQ:4@3 }1ątzMq*dRqÑlyd4d;0)Φ_UyhiB,!"g(IKes$) I([˾lQt T8v&AO숴~LtW aNN6uVƮ@0@EX֙Ϧ8@0b@̬*>& ZtSD$Џ<E7_?-o&G!t՘oށRPppE1rT zRCBl-HZG<=5eeęjpphy$6\ЗǠ'L~ygDAA pDȇ<,*8 b[5`&vXtncxҙi#*:f.#Āđ`+X2;Gwb^W-EhSA;Bn E7>IEǪ/?)ǣm.H$&Y9̮$i\x6wRLKʨu=H̓})y?6fs8WNU0oԽ;j-M,Sz?NTdqh+Ȯey 7!׵Z8}-m?3 bxM~$w::G~sk"s ϸwɼέ6-= ĎD92XG5`~(G@;;'3T. h*=G5 ' cIA`6hmȫU"@j'"Ĕs /6-*V5JRk9#F+#-<No@о_ewj9S4`b[9H::EqrE~T2a`ԿGfZV׺C}Gn 兵ı`/x* ȕ>~8ksAD&eny"Ւ\憈ϭ]ƹC܊{:fX4wX(=ҾjM,Y5tJ\ȷ{a=uCD63e~GCsB~܍_Vۮik#rtH2ffΠF M]'x9HRAM)^~_ 3 0K$1,XahH`j2 QWWQ~lu܀$uP$C̹BWUudP2!]^U\o${fzN_$!1b VXoQ'ꛥS*}ӠD0& 5)#l,ȁA,5 Y_z 6̪2tIu"3߅M@n(T p?X }uYJ P 8 Xu==lG0sU\' RH;(]z޷qD mC$yC !?ll `8n Ѻ\VCf| Xh][dl09;fU:߽/ٮd@9hL 5Dޙ.A-`T\!8qu&{eWohm_KR9nKU<( BL 俯 @.+|vua 嚹/}4`n,nk6D"A^;7 C./\$@5ia/eq#mavǩ/4?]eC{.C>QZww /3Mtd`lE@ZMDL~Q,ӡ2ϛˋ LS `icB@@EsiPU_;h3+J n۟%o M`uz5){پީ*?7 ?,-h Y e;^lqҧEvREb|k^*.7q}DJ!&h2mUE(B3|Š\l%_eJT%${^c\[X1x}{,S7(uWHl# d0JRd "~%G,3#E<YL}E N ]!ɌBť=@ࣞ?WXcwʹ[*VNAQkR &Rźy¼S9"d$~e葡B3tZi{SIfWBEGvFm4ō:1_չcC? ] X:jxϞ(_̪ __Qeݟ=V )h{ɡK†j0sʾw#C|w*ml/(5w]^VXپ>'[$^XC-y|d$. >ln^`FZ! nxi-:nτDD#5,$wwF N(ɁZ mۗvtһ\\ʮl_}D/ΡҿI5:Ȋu>/t$q&u) h'hhQ_"KEbβPS0K'9X[呡P+76p)[Tiqbߔ{=Q}⑦z~[_e-Ѕ dt0΍ ܷE(A~*wfqL(!(^q?#fk`>UdF#]+:"t&ށ4`F*[deܐ,?aa:udaX cKWj]xwZ>7A.qp ;oj"x&N_X|FU>/ZZgpi]DA":.V5FYUTG TULj8x. * !`<F$^sT>n4mf60LuF]KrmsOW )^'Ǝ\{np{swe7ZFY Lj,ѫҖ:kNnƥe."@`+ `ׂ5N2<v).o:%ܴ>>V'mo%3. t~."`,ЗWEkW{H|M.'(z gZCҪe}1H f::u@_:MCXw eq_8邒EWb{\\.2 J϶/>_}׆7yA3og!Au@0a ~H^4TjJ R=4.I}ѱT@|3+XETJ0. Ϸ$Aώlu7l-F$l]@05<: `qܨ =֔"ȗA|׾FQ>pd z5KSeю@''ްelʚX'b Cʧ,3%QeL-~!xc}efZW8* n,@$WUnXH9ADO2'z S0{|yG=ٞ|=]7c7b5{x.ɭ./'K`r01][vHYzNS4{q2 4wBwDI?݆t*D PA+&B( WFǸïAwL'ޗy_0IV:/>pa 1`xEI"D` 8$ - qZOO?+Ds آ(Z\X3_QÒ$Zκ!iw!x-ox:i&;K)=+AQLzyv̓܉!C&Yzɝa09ˍQy LA((j+w TIV:%|,4[=@`pojߞT[K0S* |p zVx%=8e p1,gVlm[S5Ik Xi$ # /РA@Ek~m#Wd%>b"K||FYX|_!q1k%'$`4$2peVQ޶h ;liwí$b/'Ⱦta󿘜=LO?|~w/S j|s\ZX o|98e^XiXU*αywD1?f;L⨓5a3MͮY~v_QfDtZfeu`<)܌h1ȠqLe)ξsA-ǖOj4O]nNZTHA]W)OLeXm8b.3Oωy2,4y^T(^[0)· 4SgSSUZlܿJ0-b\^rƟVQ~j5{W/煍mTIH(h}&tK WEF.Uu܏oK=#ޤ#'+j͘_#/Iط-e} B((D+IJ^ h^GrkŘ.j6BH˕ 4nj&+RPZ /s%Qwj86gfYL'#fz`dFQ)v$!a;wIqKaLN嫴K M;M.n&&%gy{ͪ1͕47w6c=C,M\Vf8Qp5'4CbU]{m]]Tv~؇:$a٤}(q;[,O1u6/3-S޻q}1z|gU_N&[1kZ`g!>]MW}0>r9HŢP=Jpu[ɓc MsYQ@*52߬gΆ '69VčNSsK\枅ad6i^Ǧ! vm})}pE0d wl*r\㜉O&Nú]r{vZPVm a,s#8ceb-,kE3;(F#I71RNw3Py4zA+% *rV^V4߄>4 PM>T"y¤r韐DqZf7Y.TX#b8 "ۭ[݀P"V<zk(А\ DFb.fDU* ,b JXȂ/  Os=8t-Lu 98~cfZO\SNf0oOSjN58cԊ:@! A b^(D-3덹K'6-C B `*+]T jB=ZChdM}}(`(' ^џ!8r82*[(s9c%-7$BK*^hd N`cC%|džo(8j*SGmAr ϡPPsG3F /o,-3 0W-4mj!] .y<* _oe-H_M@~M3=o,e0T] 6a}?靷*=(AZu? EXE|ӘpªPX[jV3]QΎ*P^6:]wϿ7a1۾yuW h.%Ex^bM:2q΋[B#.Տf^VW/?QH&QR=lه8-[2nS}aBCfTMOpyPK&_ <I(i,N3 Lr*k0лitAGl_5{gia]b 7s]]q]pfN9.S3!S]ĩD0Mхx ݋adiWm}51ԦlPKVt!dIG0'v|4Lu!cҾ#{-|b) cj0?]kt0mie L nRnCnvn&仂uv;߬c4\%Ftltӑo i a@Ad\lzt>X?NB (gr 7$(ATkkx`6u_}u<5 '9ʴgZJ<'(ї˿} 3''&!_ lR2$eyMpD!*lS ~p_`oeQo/Ģ[Kv .CNۋ?`cm6ZZ.1@2i*aA0t\}0_Qygzmkze=/P7|O {ބ637#%[S;[#c~ *h1-EPՍV'#f4#ȇy]r ȅB>$T&rpg#唂H9Fb)AI% K05melJ*6RII|L}D6@s]P*m"9M[*s\cK|tbK!Ur̎_Yw>^w혂˖ w72+h ߛC= Ο3j& *g؜4j {QR**ս}B+笙{gme`N0D2Jp% o%18cyHIRȫ5ufE+?lҙiT*yHm&/a-MCn_2یt;Qąw!ۂ00mY0+jPCS 'o薑x%=Pdt>7,5ˎb2f`$4Czsmu ՉrU[(|R:!RƮ(nދ,1P:vv|]U9\!B>%4߶"r]( B|u2ֽYn͌Jj`.MI ծm7uE|}DnbpkW`N;{4@l!C2 I#qA(q7>&@KesvJE~ b"z< GoRWm-CŔT_;v }(8Jʅ<rB67i]r4 x 3U03U)bwQ$폛]W\*FT–[SffhGD"O$||D۵~[ײL~x@I4#XZ qIhq%& p023FPmYwwbMe巍+ۀk(I)iIRf?)7qL!k9itƣ YZ~26a!Gf(xX|8n5,|"kr$\6i͡,ac7S7^v޺omMn[(?-umqVQ6s>{K] ە'\ϴ fQAI~ [.̽p n\ۅ'Q6Gq%=@GDBz}$ >Oz? 0۬8` 3܃V >aYQ0}(OJ Xo㙴\+^۩}Ӓgh7#{_}}FTPg* <C)"ΦEaogw0wga*Zk<ieg%d[.dڊ) ꓁ d!Yn^Q_x&ad J)U `6H>l*uFV#AVb+i#Įv]+ f*JYXzM%͎66k>䷆A=ˆuWtɺ/M/H]٤)Xm`@|ZM51 ^iOƘomx yV,&,uE\?83`!DW3v_<ӜP1OԄu/>5Me-JTE\Bp'V~8Z*,Q^"h{›Uχ)$AUŗrII7IJ &rlxA;-aVoДK(ʏ7f X\<h|}[zgNTS+!6WiW P' 18ͤvuIn%9֑92u:_⣕ >|1$,Y_A$e'Th^,/'LzG}M·]*)#.g-Y-$Ap2t?g?lĨhZ/H4tjG8EнȸXq!f? 5'65p.킦bc^̷[s;˭4*F>tZ._+<Ӊ[G\2w[e]"("{- [i %jE3{\*}䢬l*&d$_ 8_&zA36r[~gMYpOW*J>fgzje{wnJcl ?@;Ky9QvsV6D{!Lޭŭ7rEp!Ըi)TƠ6"_><~CלK;z%pʕVH4xz5; [H ' m $d+v-v9$7Q4aw#gmZHM&΢+W3V"ݾزw(%`P:sYsj-w;~ڋ]Yg #ݧ{HUջn卜>OҫV$mV9*vcZSu<뺪ҍTt=>BBBB38_$^q]i ft?F! zG 3.ʢ)kF5{8e)⟫$(8'IßQuar1BdnhJ} DhK#e[nD  7&VG fРwu׽M?OtTj P/}W@S+@YR9Ӛ"JQ0@H78 z#PnVeWWU?&Y_Bj!lvZGgXcB{Mkˎ1}AMjr0J!0uWё{d,[4W.*6h]SFKx=Nٮ$.轩?`S6-xμH<ҏhXYΞeGdmX&]OhbmҺv2O^einx7>G}^TQp@%9yWMޛ]JkՀQАzݕzJ};z #HA)qEjv3#$( ="Kv.UԥJӮmD3VGF@C[ΟyU3Q`ϿPT]".% ™){b`+} 7C~ф4CMdRM58XSE~öl`(y'T-ZNN[ g*BN37šVv 7ޥ6_c.7;I1Q5EtVǟV2#"[",\ڗ%CȇMKό3Z4@'&Lb Ǧ2/]τ  [#*{9~3w-JRn2v1j$;G65+3q&tԺSǼįvߗy̯jqnz٩yYt/ԡ;qkͮ&NyPx1J1C4;" Ou<lJuq'e֔s"0Lp $h{R6C3?jl[i"JvV;/7}* Gqn.w;yܘ2S#1l?iHɮd4&J׈Cf9Ɛ1 }9\RzwN\[HHxRYGJG9cU?1Dƚvd(ID3BN|pϐ S0SKA:E B)  ЃPCz"v=ngs+t~3ap k`698n ,K)ZJ']rMq2< _7DYfO/$BwX3u˒0gߒk\hCO{T?5G8n'sf6wՓ19`, l?pj7IH"JQێ8(2 o;5A>QM(rGռ jvSr~PAq9e#̡J.aDXݣ*?`\+;S*qµ0)Dǥ .u:9gz{HgS$`"q`V? $kV%kZ&R$fGa; Cٲ]r{  (Ս Pc6oOIG K{6;}u'PĦτbKOYe"yyRZ{ V2:[MLEi9SFHJ E_W:nM,>ՐYi߼`oj=ԵJS\|< (r=Ň|hz݇ȿlW3dF2EUv_2'iHAߘ?M%I~"D3FPt9D'@x2x2H K` ?~闻$3 т8P!,DD-,㥩&H )I0 [/k* MyMv=[p,>.\;#m?K$iH.@pw$s;{oyMcy_2{~gDKOzxTtr[R)/q饘{G⼵OaGUv_'S31bL\@> _>3w5'%<#\l|i5MJ=*6մ%DBkL蕎k[*$N.}5!A|%d\Bn׾o 09"T+2y"RGeFQ۱Y?TF#Nt$ m]#kqЍ1ǖ̀c/53K7:2 jWn*܅H+"2k .*`#LwBm M~c\vz N qCuB~3E`ڀ| nfP_He}ں OH}0] AK|^3iUnnUGcm[cZ~SWy-8tҪ;nؐ9UkiFXIkFkywɫǞE4&id! ;3gh 6gfĬ;1e Q]06}/M1-(i` *>a[WJZ(2QUE@/<6Rct$1.,|L&YGR)`6jOE'_B"m/m5yeNuBVwȜCra_FcXùXpqcWԪ|uFϞF7[4A,Gyֿ5ڪѫ8Ĺ!mE[Gf1Q^jjQf8)Whlvo$GU>z[;H3УhHZw8(Zrה* Rp: Yg@4lG6+ @#/Ҡz8V,OlB߳u'HZנqYDa!S9&Nz9e57ޣҴ<S#`ች([M Ʋ׍L0srqj Kﯡ\ ZԃBa`" \J+LگgP. dG (f)'lg% w FR|Yڲ$Ns |"@PsތbN+6(uYx,ЯzL%mn$=3-7^k*O|V!uW}QP l&3 "G [~H;w!{1]`5g }1<9F-m sԝ AJ߁R7B!VX㷽^} aZ{Pʣ.aN &^ ^ we]7uܶmڧYbS; hjM 1L*e7FB{6 pUvMt߿csK¾}myrNhjݨY5θWua\QOaN,m:t<T c/:z)J:՛UYT x'O,^3r\ɱCx *a==zpN-'Uy !M3',{/6Y0{ VA"ъBl =ZC{ :%lIބYml3Y .y{5"趨\EGNp$QM#[#J}gKmUus x0&n YQncIյ7Nu9wg`Pmi8~`eA5Kl/;HZ{W \j$5FF#d^iij44}5rԒR~1 C#QKij8I qmo´ lFHJLWWu?ca ׄUZN!q׎d`Kwʭ.o4a$-QЃkQYk~n>MA5uWcsN QzN̫P٤ScGo)|V}:<%|*HvPPqiYfoɃjaU 4njyPnUCoԻ%^;bk:v.6z퉭6#[IWGT/ɦ)y^UimÔΐM4{3P8xa{S.yLGLS,3Vn]97?zāڋh?N=?A#:}dsXekD$ӏ?W*AuTmPG|VJLYPh.a9FБȪՅpPW O!/bNQNvu,;b:@Y0 29o<~4Sh~(>G/m9 yH.hC-޵5 wlk*`Y7Ua>7훺k֪1> &iWz-t5MHUtPr,MP36ST2^38˔F j}Xd,2fn5Xs%p:K72ݠu^>Rx4,el퍘) u~䰏{{.7,RA.A]Rgt^|ŵm΃ᄹo+D2#Ǜ@ғ4NK72Jsrgf9u 7*^h:3!j['Iȥ">qY.q:)$N#Ȑ#z=pݓ Oyji93Fe' jǜ2=4x J94;e# =lT^T~+ydf@+$}y9ױ5>@+6>?Wp|zM{s~o9~%p?I5XwYS۝Ac~Orʨ\3u@%[ɧ۸ ) r7WCVGlT+cȆ~6M$̹" &2OI(&<~k-oZ$Ns$Prj[j7l\JD#pS6d6݄ܫ5u켻` Z)޳ =Ѩ*;QUN|DG=UcJSjRS R%[ z+Q/yMOE'8c!Z|h!!vNlܫ<'*Gw :pFE"+|E():xJ8b UM4'o=kWEoPT+ǡQ#HHDBeb$?5m &MPٌg}zjCGYMea=nρyCd6#EU}ޚ7eoH4s#[UORlVgHN$A||>" ) 7v2ؖD$M DRA1NqHbU|2"`@t"H@R33CVn\ɀIۨY#urԐ6EmwZ1B^ l'[‹?w.jBFE,9|^ZO xBp?OI$/*tտ7xr1f>޴&hE1No :Cbv =Swvpz9!?dYi瑑홇N%ѕ`Ȃ:%}NIaʏj5sIw&PDŽp8"=m=- D{.CЍEOd0Ds:ry.T7sf/ H$v_}=rTye͡`.!c`N\Lj^0\&V5&Nĺg?WǕ):\ޮUxܸrf>皝, ghup j{T'j0l<F^hCo?ZX =poCU y9tn5r^ϲUYѦxmPa9uReoQuI#1z}W-1낌H@%!גy} ">Bx_Dj9hO/hЏD5Aw WtW9_|~y+Y<%zqE B9#`=`op? YV4OBeی/& s C#dilBWYH|*6Jtl5*.i<*o w+%;ǗɑT+F[c D5h.7D`Az_ ۉ4 Fғ}9Xt4 Ɠc-dCNib%T >WR6'dneQ̑7nTT( Iu*ua-U4Re[z}[!n"`::y%all@Iؖڳʼn{E.f,E ȝ9;ĈЍFh5#ѳcOkoit;ٳ *n)ڪ:q-Tp߻ɏic(KBjڢX;B& ,mb%&޽l|n0_t l'y1+2utQ WR"q`|Hrnw4`/\=]MahN׮c&` 쉋I>Tu.Mo䉭+̟Py&v#F #I{676"67⍰F##g#iu~ȯcXq@C#`xH.eAô1C:—aEyo# O"^rioiq O~ r__Y'[ '_Gh=~]W8t)y*zD;d&7be8n|iJfHwe$] p-ber(Y$\- M~)v'  (f&hB.D}}r$IBG7']-vg\\{H< w!E->')܆;c﹢7^?OS .[k^$V*?\Zdkd۬fL^}dzil(+;M .mb"q$Emd޿hU+hWB}{~8-L HG oʟȼz)7+l+{jUWwNkg~î|m, 5F %d+aիP Jī|CIńB܆fߑmȻnyblmc=x:y!s#S۲wq W1!Ƅ>11S*C;e$GhUŏ_kX6&ґ ЧF>Kۉ"%rӋ35UTy *py^>a| JI +SѽܯAbg@A:fg3x {wi-Pp<&Al)3{?h~q6˦f3d (y1+?c%?l]zN䝒&VQtG=+OR`[fXa3Zdk򮯄 P壚pi2EJ`r$nVD{8OPk;zss[͇d*A[a1c=Tz`Xǜ+ Np ԫ~cîqW%:y+t鿘O}C,\A9g>pH m?$*ĥ eFjM?#Fܝ!.VGv]f#WM&UGNAȋ=^hekyKkV.HjԽ:ux,unfBm'E2[Ȇٝ}uOSnNLmo춽:Y𭙴 X ;UeK 80Lg},O|B2Wc%Di[W=7 ѝYKbCn-"[E佘ȋ8E`E"OB5U!5_kxh\T oSC}AVbAS da^X!,Y!RrSïd ƚЃ<X~czS"11LB߈J*-H} {a4Cmu\Z"k׈QՋÎo G^U+~n?~[JvN:PO ` }?-Hzu6g_?ǭ |!f @HSA5mև077ggțZtZ H8 răc^9,]n IfB(ʬ!Y+w=Mw`ϯ1g{tA hh R"+G;S8bL-„k'`kGa M2C@6W~5r6;D (Ѵxl>W۷3ςu} }sidCJc7kC5UE#M` 9@A Ep5NL Kv佼[p+ 2h\ }!2ܺz"]C7$;IdTg\!q8uhC&1Ġ^|:9M8p88^yBb_ϳp|(z!`{\FQFrtAUt+Ǜ'ED&eF5CP r 5 C>?.9ÚH4q6}5bͮMIٔ_ l? P*ecM5ӂ>F|_ K+{as,OAONFb s#Wp :]%0EH)*&J! yV|c7~7^gѹꖼ9I/z9bE}S\^zi ؆OhzAս){arÈl3ES/j*z{zq`+B\;),EQQת+>?._ijD+9h<|l6@8DFBLO1!!{`wBվu'L̉=ڤ5;CG4kdڻF0hЭ{@X!n~שESַ b/^ h7P6H`Y*S 0=tE~m6Ђ :0!1YW4zx솓\|]|mΚ>[AIK-48f 軧Oh8;[E$I["vxXEyt+Udnn-dzZBH+qcZ,$$YZEJKin[o|9 @L wn6}f%/Ta$l ^ڹͮߥgP ۆm06-/ 7wvKƩ_|"4' m" |RrqLɕOnٞUV{5f I>R~WeNěukA!䀏v4ןF(lK-OqPpe[w'&Led+y\&RTpHC9T;03!2B{#Md h &E@aտ(+մ=Q w"E곑yB tE͓L($)$@sH^ctA/( ʴҘ 8s8>o^DR3yB, NT 'QBA$;~Gix0×C 6=D'x8_`\UxBd`,3D A3c`NB3`Ջ#GK*vےg, 3}̓(+F!c]T(SeKJ0)-42l֋wheN(>9竍U_iX P8'XxD2=g 1„1(İ1L׸T~k沞fo!Hvs̊<WC]QW8*yurX^eG`'t/ D(ŀ,\ ?&f~~>27 ʪJdiL dDD';EVmVY1}ΣEƝv0?Cu5AtE2܎1q_׎fvUU`vb MA ď&=cR +םZ-岅HWx d,SjkH ٧C)| +6{ c]I=!:Gqvj%鞢L@#EE۰$H\3a bm{DOgaJA;d-)3rL{zAΗ(=%2D$Ymhf2H#7E*fe\ e;# !_l!1#ye6vJl1ɋ œsMa3X> {McQ bL9$3e63U}]|qKnk8$vmj/rD3FP(OE<Jx@ɷ;;{w7.m3Pqzp CTHqY,CEFECa<:ݺ;iN:K׵^m,/ڒrI.b{ɦP-PM,%P:P \4RS}侍A_HpMU*M/8Rhf.ڝ:9p7i8cѬ 9Yxϭ牠g?3IBk5kV1eV(P~B׬qq3dE>@ZG< qBq̽Cy)1q@V^8twOKN &1s9BF`ۢ&5vM~2M'V'w·"uxNC#ʯo"h+[s,wQ7^iX37aEzu m@/Ûܩ+llkWWm [Ogb/' G5q!'셊'q RUU߾Ug>b.D#vw+[ΝTaIHouqہ=܉k}TQƓGޤ@=5w?&~ P _ >h!D+&<ѻn nzVqRL@8c2?Ъ/i iоRwAdܴfU-HH^pIhG̞F>̒3]CLI^6^4sK)ktko2lZ2t:|2[R?DIDD6܏w,V~ѭ6mׄ뿳k롶S_ xMo:_;J?7J{H,w8Rr{A8F!sKtPs6}?nBӡ˽[ _/,@O Y=Ec#TÞHgs!Wqu& ߊJrAHK`0PTixP,MGޡbϪAO``O V+J nЭbۨ>wy<5B;HR1[^aƤ-<نɻ[_}=A?`[ׂGOțiʘ=Mcmlgk6wR ׷ڿlYk oE|#Lõ a }>OFiW.Ogd ģfkh k/eNư I`YVڇYqVku܁շ:C[:tVnusguwd_YoZ{]Ԕ6TVJU~iuܥ(/-n&eb׺kv,>ҺMԲ\Mb^xx{ӿz =POq_6 AҬSQ X|e77}G r1KKnU3FOPCZX2v,}ZzNIu~W|=H ew <GR?y?u\qj\Uı7jɞsB )9{*k"}A[%dH.!{d&yK\{#|=vp_d7|+tn?df:Ÿ'2iQdCߨܔ,Z`AS'F_~M13"5B*HTe 7+Y rw=TtףI z,ڣt6 ~ xJ(H IKJxK+P~#Vp"G.OàET{Kb,wPHIk& ;Es\#8vj,OݘxQ^0o?zQqD6nߍ0SQ*vRĤ)e zx.Svϭ}p-zF{ {7ƻϗRrX]-3fk.8coKEC Qc )5OH-<eU} j;; !}&w A{vo6|`xy*tO׶/vC9uaq(Y '< NF2XLjEQgPQt>ڗl.+smuA1o-Y{!I )H:0,*0|U ͦQ `7kiw:ಯl5!bv N26o@zG;Kԧ =^$r̤NXͅ ?pVUd0؜f̯vUF`)?.9٢ $]f!-5&*?JF-0) z;C9my6{#eD2%hQ$ - **d5Р\N9F}V :(^Rl. %Ku<]j-(eؒՈH֔(IĜO|ʍm_HM<9LƐVr[/= 9&BkR$k1D) աp 4ˉ)p7tpDg['A}y@|h0>ZvifOeLhuðml DSkXoȪwa[S#ato3Qn+'ϾXiϱ orkw~;ǼzV]^ Q߀H&I|?B\I_2;kXݬ.~x.9[Tr='U+!$\ Ҍ>X9T:)\Q f\n)-ո‡F&h(~t4?t3B'wUL)N"VbFh[ PC룱C9&On.XXv.r7Ϧgy-'Ǐt!yZ`[,IL~7o@f[믱ۆ z8y` j!f}E迆ћA7[믲\U?7ej[lԳCޡ㽶-{+)XmVP}iUQQ3uڛe7Mǟ61_\$7y<(A_ ;GE1Gc8PRy-?k$"R> NDOɷb/D%dKR'{_~R3ֱk_ǗJ To)E/i"NTBFBE|9lgGG.%n83dF2EUOD$I"dX-eiO j vR #D4f| |E&XR"S7w7s3wr.O8aiCdŊx #-0@0 D ́* wl m<ɽE ܸ=E^fLK!1@?_`F\;S9w(y'1i[8KUib.~t@ALšbYIIXp(dNz,A:QiT2QG+Y2L+ɑy"G~_{Q,@X,!XDQ4 FmE+Zp8 SH7Ajpz #H:PIz}m ?%(Vm΅;/NHfup)55Se2N%jAJ\*L])ѷ XNT GIL" S4\*T;$ִ z<8 z><<rA.R JeSF]Ti9yKQH;d5tBƉ_55ng|HT[ ,%TgI뢞zF`H On# Mn#ީXja d0H!`B%T^ >;opSO,{< H"A:SP4i(@,m Jgrmު 8qT=s&Jr"eY?4ㅒ-ft @%_ D :t%h14) 3\%Յ(B?U\YfzQ BWpjlڍy"bq3q 0zEׁEH30_2)P}Ww$UlnHVxsЕӫa"ʾ(}*gbe\q]*sn188򰂤!ˆWL'8j0 ~sqG! 1cS(]Qbؓ[zȘIGEIl^Lw,N[J.'&-9״t5v**8plpQTTX:`p"0.LM&$AX2Ay 멘&/nfFPl -TC Fjq#""*B.%[5JI:/ BƑ$v6epkl[Kd/';'p66eJ"c1Gxxa8uzE|3Px.FQ%Ɛ7[GdqWƏL*c$Ȋ* {&mR48V"]'zCTy$MrhmCVFY=%-A ) v}&`C>5TLI'oQAjZK[_O(zKdd̾ d>Ajvα Z>rO cxJ(CiA3f="y+W ט#^ּPsqg.5_w޶pr+Y]w8mw9vXuw8wu]kt {^u;SrԃX8~uY,z9Dd4J&2f Hƣ~mv2x-#փ+d}`-G{7:5,d5 Զٔ!RP]Sj1UZk*ڻuLt86Թ3eMh.;Wb_xIsӽz4xB|?69r)w TDk-үߺ عTx?>#4p2}s  [K$!gY@♴`p 2't4ceҧRAe;)?pA<Y%̓sS.p&5b8B;}Yst=>9Zar YѐiѲ+iE>}^,GF=Ĵ>&}~rۏL=z|suCjL)2CZ;zǡDI;SHS9\Tef®#TYe=Hq򡲲BR AAb3rΠt:Zg $'dr.xu3`dV ̋՟HÙo:TN (H m2 C/7s$ ;MM7o6ζ:E܂ j%&޹ah}ͯmW6L0!仟4_t;X=h(-,{OqJ: M4P`Ca7LJ`mQVOZW#3f'rE2N9#m/tާFb&QiW[DQa·K 7KC=Ix.Z̧}:ӚQT7\X+ѷuVɰvF%C-n!euyOI5+D&$`0 sԷz} /DTj)Y/cЖ>J @XU :_ woPV5. eϺ~ÇK!Xnn=T81_ϻtjWj$t_rWW’+" 5k&A5e2d")gAIfx.yb1PPb5 x宆H r+d < `;?^uץ4|&l%T ("@=+Rzvu#t%&Iڢ)ŐId j5S(0\H2xGHm@*TaӲ&͟`*x$ ؼ?qR؇L#1a!Xŭ J]1}m L=&b"bbfI1dfH/i31Z (kݫa'_>$!&M2xnSZ'zvJp \2H9(<#3/ewYŰF#CG|yvc/jd,~ g=B4Ru ]kWB0 `~w } N;?m y%50`OL~͓_Cte<`8/ }y @ЏBެ15CXF/>hm+yq (15X8^+|AaZނGˆUt?kVy_Wi~ָݿ)/~_/qH]MP?b MoM7!1ά)@>Iǐy>Ţ' VÞ,Oo1}I LaNRFdb''7/8 [ [%[Oer2H9/Ya(nMSg}|+S66Շ}3kb>[vszm34IG.v$SvqK岱"gFED.`.a|&ʬtrA: 8N\;9vN7ϵnl瑣ւ++h@3t O#3S؃9tRx BQt'ɊU¤$LqDV j)?)f?`Av*gn2Џ*ØAgBGOwzm?Ԧ>L3T63mDQ=: @8۟PxXnؿgD3`FP A2, JDB3V xI;wݿ˲3s%%>"|p1Q ħH0t8Y-g333UM[nd6l $sݶۮ˖i*"9 A@ O_i5<>ayw;iU6tj|.j+e?&7}%SP1c\0]%y/tuƐ<;F9hr4sR""b1`yT 0jI|r"Oã6L&E_4( QzD u`G3E(L 5cmpc4~p'DC_RGadMq$`IlԲq敤xPLunTBj+:w=L'.u5g t#r8SjO cDJ5ذKfM鋛^ .c_= &\"r~H Z*QgQaoi_e =AP[vc٭I@Φbz3ԵG-mBH3q*.oa@$}-jbQgZŽQSOkV XacBՓ]c@ ȂLHш&2h2EgW+ gMY`RbMh+pXF-`!KQ^&^ =/2ʢ^fBQN:RUP[WJF}O%Ir%ltQ7aNѕE 1ZK"l""z,84gt}l5hap-u,x4+F3hXS[!W4G6Cdr"|M X+}P#}[Dr|)}3?_+ۛ>402\WJO[1y.|+A v+B)aleɶyfgt"H}TjMyI%YJ2H+cnW͜,E=~z{}Ab`WL M閚rlt&`fRss?=_:2.& PN xNNOUEPOUMwns4C@C Ё E)ua'BQШWz}wܜE5dALfnZv}TbYJnSk~5-FՉ6.Y[ )z̓N5'us,Γ4гI&rM+ٹ(VamBfَ\e,6_PFխˎ%-A\%+~SR[$S%qɤwTSI(D/* ݽa;U=?iUD͌,Uy|2I\_[<ϼ=²Dlg@/[zN|9>mMRg?ycoҩ|C>g{gYz+O}>TVN1DфOz[W3a;%QWo^H ƨV?,EYqQŗZFQ])Tjm(+eF> ; |E5v䇵u jTi"}uJki+jk$J3Hm lmc3w9#J|%sP™eQ 8ka&?$zj֗T^[VCp4|KՙU`m2U x;j Y<')p}U]@êi'> R,u+ǖƜ?4^}u vn-5 E+.]-cӧ)Ah_Qxu;Tw ^n[>frNzZV@.(v#qbZL[p'\;t0*tJ_ `c(^–"W,q&m^eşOWؙL@:ѻ"?!8CXћ 8n. N@zbZ%E#Xe'7%T1 ̀D=rӓ-h8-J\c-nXJܚPY>sZG[ޥL{\B~QAWIl0 XB ZڹHz.yyD^~FO@ `B}pqbC!7 1rM%n:{' \+TbX<*(C9M;4ݐL^dR-*@EmlqDdn%a8n,!!n8^.T(6W$X{3:5Lc;l\|FL5>hXWG.T#Qt`D0#DT}sV)"o!6nc(O E(-[G!; ( uM8$F&<f{m}Vws0$O"d"&| `H2)GȑH$@Pfhdܶ`pGR _wn˲k` vKlҦi [(c+M?RU4?jgKhZx,ZV*3Fڛ"F1yuQ1BP -]@7鿧I+h"e&ohԢTϘGia֊CcڢFD给1)N{gDגGx\DT T]b3I\מm7[@DJ$Œ bٜcƲ;20&TnIɆZqƝ\_50Hj|JaĐX:Q/^E$ZUiٞ^;y!V*Kh**7Ίp~WEpq-:xXȐ*쮢Koۓ'X%Қ#QCEr_@:BNSY=stVuN,;+>Fp氹XUrЕ"ua- LYnM̑ˊgBviT4!8{jk=c:8>(TuِOB/2͢ڙgɒ_flg"Uq]W>7_)@OȽ>cVdDa0JX!ƽ۲Rs{qDM m <`zי {A4W:2kVKƕ-u/Z3f @;I؍INRwNIT؝1HjNuYf՝{2˩\ Vizja{<۶ ɒBw'Ta~G d0=vCn>C ({mST b7)֞?"tbq Oҍs 8G'#T OOo5$PRK()vbdWW&fݳ+EmNW-[Ζ\Ғz+ٵ𸝦ǣ-/0]cƻ{ݺ7k;#['8">~\?Xg?uq])8+;ʏlfaocXHiGxZyF5^mnB:_;*msݺi HGkfw R>DXYXwoDȯD ~x=ǿ>4wG^y}֜cǹ?s _c֟_-Yio;MR|NtXmrٕ4!QVxFa_V\HbGnR TWbHuv^bu $I!Ęn\o%(/!̛ kۗ+Љ%wy*2" 1'}DžZ)Ʃ Ll7I|RQPveeQ > QhrG»ex T+wNcrbj,(q̨*DHSH_Փ]%_FHY >3YL M2Pmt2Ah(wxf_ PsL~CœU1VVo2pBGx5U՘51=*I~X0HGNz"c319Ly>*o|du*i3xH30V_+f-Xý#f(xz1,Gvˉ6 +S0U ;Y0l."t_(l!jehE+yIZ橧jwYLWr.lw&BFB"a6`"N.@;埙9tc<>niBT'qNϷ U H% ѹ+)N !M 嫽.B oylڧ[oy*,axx:2"J'H*#izS)rƙWWVOVñas?€^-&`)L,`)RLEv`i‹lxb#F`՜Zuws@xCO}PrG!_AcJr)5-;)tOaLn{;DT,5ʸNZV*``iC/C AkO15Kltf.;"8:ٺg^SD[1;Iwԙk/ާĵ!M%M{k43^!8zE0 I& ?7YK$ny0p#D2ktD"+:^@'s 7gÉA'; =vt'=DOv+gJAqJ6&Sl6fJgJ6Q&Sb'ݐ pvTZRZ.͠)2-#-P)-EfPyK;+#NjT\[w9tfy  * O:L)/I:49.3<ċ6R(sݓ"NL@/)Z ثW5jfq0[K ,0Ǥb]& Xiׅelu={ U17hfc֎N mVsI]Nyuǎk CSa5Ä!C5兡밚]u[ꭜgw^Wq1R [ʐ1D8T<jPZ%ǜsS-| QEL=f^H]YמC, K7zuP 75IG%HT0`$x`&@(RTR/_/ +'%#Hz ux<΃(AJ Bf&UAf&r!K@+ 0+JFVk\U#((CӖI P AЃ;173fziq+:ǃ𨜨`^' 7*CFP6ұk1M.Aː*JWT {^l˻B sV* xL'xqnra %DfX'a9U}BD`-.-h[`}kteѬ/"c8Ov ۄ >9"RP}Ң Wu:x~*g/_d!$ D^R:~n* ]IRwq7=# M @Y̒G  |4T03ESEgT(ۖxz)Ǖds+ml< 4#fD `c<#* !UP1ffsV.e5Y$[ P$E*#q# @,¥&h&2L Бvwq>5xX!/滴AOnd1O?jΒ,q>ouJ>goqˇ6d`*SUn1v"t69Hއ*1AHW);yo@x;ݑ_or՞GW_Y#.L:>;s+s]brMщu"(;r%t:Nelvej9d7 3Ĭ,erʘv sZZ/OOIȰ"m'VDnG&]-lgS08`Ѫz Yw~սMi-D@"i=a?M043FhMT\ޢ[d=70ylxppZrazlKZe4;be) 68QUZ7o^Jy #2U$%0/ !)(r\@-zz7{ޡ?ż*iue1.X:AyaԌdjY'^KoqJaTGA'+xzҮ͉ |Ɂ5[QI Sqbp,b~_3xf6JBhͥЌv#Ў< xW筇՛=w7 o~~|/?R??Sw?d($Q_X,D7OM' `t0ap( J1VT[5.al2I.rrP6Ӄ@`DcqƤ!|gjx*J@\z:Z>zHu3Y40.?H'7&|6yvkcajM:%K#(K2y|ub.iږyF넏'HNj?6po90|vz9W [p"ib#^M=i&k*3R:}8SJu#X/02I`w^`qTl & 3 WDo眆7Hī&hI+ :c~d>f9vs],RHtlG#UpN)Y26n Q l5^1s2OMI6Vo=B(g§iwCd~Hx+ ojX񴄦|ihCC*6'GSOp58U㵅E -?@6f|3: NO :̂9c" *8*6ϋJfhgh7=\JwG*:J.y&oXQZ֋`:Ӕ9VLQ)` k=:T˙'f;^X]^4{ȶ@(@B/E)B-$KmB8Q']/󷰒eɓ)!Zo'Fry6D32m^F?쨈4Zz >?c>ne ctX8;' x)6xnq=;{84J! IO#<0Iɽ4y$Q_X,D-٭80 v}K|Kx Fz˪f -iwxZmuFJZe;'ܖb H,aV6#nMKTAD2F1%Nh(lns7=ua+XWJ:Z9`y\-O<(Qr ~=H^\_Ny/pFcB4䗵J)̀T0GKMsuI@%Kddn{G&]]|HX^D*α A r1ӯWa~"<-#tu{#xgȟT7/Qw՞H &G!`}^O[ޮbxK5=y>qQ0/RdhTR Bq9o5U]> ߶~b[BN1ӖӆמVv{ †E@bq MOs{&`fC@>> 4kd"@?ɧFT>^@ +t6P2O[Vkd8l$9\WЀdZ#?"KU _Xه0>όx'Dn<,9dv@FQ^!Dmyno;@CT=S,15L7:(G:pج+&8EmbBhmy웴XS[;>qxE}ԔFOR/8&ـ" `Dt|aH8<7qt}7Vz8| c䰷"G%fh{Kl^t6q9C] ]Ϝ p5>$]J8c@#]onFkJ7|dihpP=pcmm5 m{m^nbe鶰Wk3E`-yJsw3Esy̠A@m3klBSԓp|ur 8t{B%[ˊOf"b*t~D#'srTxn!_/Oen\^/ڳplP yF\Ч,uUY.`{z:*j2rs#}CVa }z8dH#rͳIHOœm1 ZR9Y@ڌ/ /}չb]n,A} 48I ڂfkpibqѼwwSIG#+zm<F*QZoKpP/?m$qz.fKO' ;J tl!t&I_JpԫStVA\ylx~${sbSdžQ~ҧQq*Ap =v~+#k8wN:@~~GSHc!:eAĸ:PH;z+bjy!6r}w#m99Xha ߞYF(j ø(,VTzSi3|g1-*~1ŌKbfԊn@E8Z>6q1.O뇟G}3Q}z8KƈTWi_303D@P=̅2P"ۗTfinidڴō#0(C$l>x2x|K%VF!`\ss-3UൿB*M8@aYNVfÊ0) ZV0 VHpmJlfnmG$@Xei8o @5#5;7g7s ipΚqμ5j,% e)X;~pVbi팵+A2c@1M\וm1>Kj|1'Oogַ9?,+qWCX=U>2,*qA݌5 *mvjԕRNUS+W0.m(M Ge~K5_yjt*f ;aҺ-=% ^F/(˔_Aniق~UTtbAH,@{3(Y-+tCr!`<tpi:H4]>~ J-#-@$G&CWeS4?σekMiyO!uƒJ p533as!D`5?zCJr(26A6%IK؀yZE@~YB/\5lֳkWO5A}& Dq1urwKO{{ʼw]GҪ;ѣ oiiЃAP jL<1 @nF±FPd8 I[KYIhdYк\DOVK즫zfbH6(WKQli%*^]42o9m 0h@4*m͡Mgޘ>-MIK1k%͜5d]!܄ ouqw"IdKX> вdC#"'4kZ9&O~S>waҐu) 6o%7!?xdZ",I) Drohzv=G#?WacOFHsy7I~0PC_'[@ tRbn#xZ) ~{=2B}2aymƙZ/G? nb=K}N:.Y{,Nn>:]| ada~O"QJ++.`b7XGI[{mx!nwڕZTECDtĤ<'%8D7EVy]Yx p^DD`GAq V=,V־Qp(!+[6^}ZyuOmpSpFʖ'C]d?6{1#.'Oܼ:`j^"E )f )kIUśL_4=ޟu>1#QF̙LC+`tQzyjjײszUY 71氉06MO=2Tc6>D't 9t"[.Zt=O\E'JE_ۆ$$YoYEdm.#!wm]nR'Щ[* P`>ra 7#,~!Yf?Dϲ=g cRo n4,xh ZOgu2-]jdjjqFƭFvķn` f2}2t.Kˎ"V9G狫8-O`Sw5ap`:ERJW"%운";󜬯QXUT 8 Tv$: $QRVssIS펝AIM:NLþ(>V4c' g$$Ki)&BN lQy1eLrߛ Wc0xƼTz5. #7ByPbP :Sƌ٥3Vb-XHw4K ?SЦw%IT!U4vx9i{)z zDOބkߕ}V=p)9Ԗ)C)#5uۂq  ?q |dz,ϼD/Mz=?ꗴ1\oiP AMd/ɍC6 ڇaףЋGwk)2Vԓ{g<n9\Nñ%A :0@!6fbUVՑ;ܲE/j8 8xNpAOq aOH -maw^)8JOCJwQ3wfa{\|L/HT[ig3y2xUwM}:nj1\\ɀh~`6tCfA@KWǽʼ\`MH@fQp9}y_5&p񸮤=*4 5p/{Lũ9z\b|n x9( ^X1V̍ \d  6gizk[:٬a1Z)DvyrE7̉-)8Hr8VNDW|Y7줢h9DuAWuFڂfZn ܬDmhtP1y厽!o#reNً:-E p@p=4–ZYIkbS6(=XTE(=Ʌ`p5` Br` W5! vWjc%lBg\"p!+9bWus&N?5 3c>[gd2gnj| -+ʞfea6xKA=F VvM,^Y.1^pHB)`ͶuB2 =HJtQpa#-# 6`#V' =qVW2`m^V\UQ֮H <<ͬ-`EM^в"RtaT9M^iF. ?-@%b ]X 1cBMy'{܁}86]/NO ǰi ~?sBOh,lCo+gߚVM4{$7h7r-q\·!]+=ߖ׮58'b%t!=Xal|E:?1V S)7^ $3h+vӢo)dupQ4N6IWCvٰ\-o<8+B ÐXYiKY[0DMM>4[n1O0Fpxw~!=>é{[/7HG k4A|I{TX*464nEQ0|afO=#ҧ,f).Uf~dfh?D'_ AW:v{bvol%vbȊ(@d[<d0񍇘HȖ4q# x`Jf`F $F&9moݺHdb߳mk(mw$If~xY{ 8~$}V JNo771+&*,#*-e8L|>1v-}ۛ+{| q3ٖyQ*ᾋ\̠uGߘpJV c*u4p$:?Vxб?Qƹ2ǂ:>vLGoT;оx9+?̠j R(X)~>&A唈mAu)#kqhag6-}Ճ)?ʹ3)6yt6<*~>ND@ytRl9l﮽@|A=0hzllQ}QApThRR}`os~]3i:a4]IcVrȞGf-/M G*M KLSٟgonduk\A4D]3KWFn Rl< AtBj,f#4,x %#QpRXL̈`z:QHvJR6=G/:X2N];fbejHGрuEK{х34iO" W-bnf0͝@|Ueuv4m=*8 q@gzΔTd`02 Lz :OֹQfv맹 M|$z E/֕y^jR9m΍bdBxqOy:?NV@XѦZk&#(Q%x,+)-QabB>Chr[9VMg^yX-T$Zx*ƭ|Sg^<:I¶0=ʊR;FKf% ǜ\0eg/S5gZJf*J|Èe74՟SV6W խzK/U1ߧwgHi`V{nD']F a N>=r{<_uO=mE-#݌߾^zA`oVڭ1|M.;Ur1/qw!f;eڟFINb[#̖"o:Th=oqnsPڷmdﵟFa>G?ȸ7(gRn'<Rho[ZT[>Z y'GrV_ UF8>b6Ul !~/Oc+-l)i_ p 0e;P##?H"sr]Z]+Hf@*U+i(R쓖JFrHɮmiUFQOׁoCRb H^58wq\_9icEZG ?>l%4- #A@)j'zbTۇg6;hۜ7tNݜ4iD{Oe PBW'S&oq, F@H !,-.$r q!t B_#_ZH\.Ces!QoZZXN8+HhU<i5_hyPiD-K[N?f}@aJP׃z EK ⲍ)h HAu ONiRjQ,kMM6Lwyg|(ǂ)PmھDkkϺ&4-galkFN]Jalh;vOؤުN68թD}ߑ|WFX8P2s hM*y 0A^Tv;Ecɮ\<^'w,:Dž>ΡtufJ,Z<#m&E_YH8i +OZXr7?(61 i T~$r~m ؍JRc<6T "^'y?GӇvmZ[ 7k}v:sEฯiQ4\y:Ǥ.Gc5/iq]֕%uA>v P1 yW78\:j>nEy&d ڀCH&FƲTa$dOf^S{Ůy%Le,M60FZ !\f!&@wY?z*Ú,\څIq& 8sv 'j[coN8DezU9薹 =ƱѶV38rXYkh#beњy\rn9 2Jq1xD{J)Dalo`1HsX] )44I!]~Qp4ĺik@+jRI mC ͽíA$Aot2Q)a `H7{K!ȹ_!!-!g|XXH[XT0̇6+Z%fwz0xu>啡 0VƑ>`>&Z5pB dc۪Ɓ(]>-܃E7- X6`HJM}gD1T,/BRP!BBBⅠBxAm :@D nvBB!UymWrcv{adK'Pu^eLnh(KT${Q[*2F6J7f5;>378@V:{ҦղB`&[w "& mk 0lІ;dqN` bd``^WYMd@B&o kI+_BfsJ+iN%:#b7`3p7,AM>׋ͼcV/T/L ]tۑut-څOC)b`e+tu' Ök w0(ZTݮoy1U$ƙ\*+O=] "FJ9ȝ{NU6s r=>IN kD\s f>XOܥcS363eb\Tip&l寳4-ٹ6ǵA+0VG| &X ?{oݻ,ii7Fx TH<*0c%qClZ/P$1 3wkXN\pp5`=ypǶ۲J#T-?R[#|޶Tq?Q8ƻnmʱD%+zNn;aWq !/{}88i| ʸcENC6W+MVE ?Ә ̛.p$T] *HF1n&7^eJlL%֚Fx9/KmwPsK]BUvvl[ S&061}:eP4cl!U՘R)MF-fSxլ<x(+RgP=lU^;|U>g '^ l v%DI*1-94t /z[kFS(f.(ey|֊wH[h}vSl|qR@D"ION"w"<<N}E8QJV03Sf`vlֵxeǐn0'́OkG_,h fp3x3}(qR*G||@ۗ z2;4[Y}ɚ? 4! 'IqG@/. jrO5*`ĝ=s>zĢiig=R?z]]#zf3"ޙ|'@!OE%ć86Mnts#' ߺ8Cfmy>gz Š$'b A3%f\XU|=wк:^վ 2_I<`YinAi+g{mϕ7X];~FFwfFNzLI`꼄|nOMGST0} $c0ۜ%=M-e.s[[K6=x]!NN6W['LG/yJh •3~; 噦=iX)<)G(z0IjpFEg0W7ke3@X +T ?ՎڨDFj|>թ{(<$߼9Lj഍Ҿ-.z: A @pC-tL̒]Qk\|.!`"6C-~܋ r5I` )` !0v>cI4AQN@0,7-OL]DY_+PG S:9_pБעftDxDH0s~Y:^hqQF(=" ].s FTd0B{4@vͧ]7 !a Mo gw/YsNie)BP}1@jM0Yyʒ)P 24]C\] +}%¬zLy(9*+;(EnլK̂,d4C# ͬ fCf7]Dvh*F_ww%UP-+;.őJGt a\m. 4EdF&ͣ049p4}bӫJձ &ܳW^*,vNo-*/+]Sȅ%T}lzdqB4xX'de6BBEuA?iJ$󄺽*#!c țދ*D+.ƍhsc"Nk$?Vrb5#2mnj51C1֬)p0Ze U+lJ9%tX?kG=: i`Or+n62p)6#۝"&&3QY|M,{{o&FO8K5@݁g:%mǧ2dzdP=3=l%!i۱?I*@$l˾U$ - R43fD< ē_ +<8F7r߲,[#5/1Fр#4E$Q8ƑTpIa H$h0 3720g `J# e}x%7~ Rr-'Kk/,C*/kJIcr3w $8xhw s|A ֛@5,#$ҏ]'zPI0 "LUDȏ## ;&87v 5HqiEL"P$gz~ G[u#g(p!E(.m9*e-9Ha`60зYI4 d3AMz&Dߝ%{>$ 34X'~V~iAA²N]jcg5EΞ@ێ,_vSm\Oե[12H<S]f1,PbbѯW7+_KE{~q*GXx$_w:t%Р͉upsc [@/[`/ ;f.9h#60 [,oVw`8g6m^;#]~- ;$ O܄'CU_]_?k.V\mK&`]@N:?a&&c&(#,>k0z'ЫGm? QOjA^ vjjvyg(_G֕u.׷Qŏ+],ʄI{t!t8пr<> (}b_c* إhoV=dzdB\={YCPk؃G-N~q e7B~ J,*ʄ7bihp ?7΍bT;vx$_16Cb!n_8P!(s z/Ҟg+:yyYWM^ARse<1ȫDm>ɑ26i8l7~0מK^V ;qo'Y̡sX`3C-xc^CD{J48{)kYi]df>H&qp2X(y6P~5 (&!PM(JJR٩[~"QږȊqg|.kHc'v $?N%Zh~F%୴X&g2ac39eQtq;\tQB. h]y!tDGZvkF^窂LT4ӂA2\.+bV+b(l9\ŖI\\'Qp)I,6$wWx6 Y,+5j]= KdIٔ VRzF2lmB ^ (uɒgHqk8"oMįuP@@&jE Fq,~uhsN@@B';g\PA ."F] v[8+0xˬߜ@Cg j;o me`t[!جfz %NNgSK[D▅Jp6%d_}xE 5s#KŠBxblv9sM, <\(tm.2$E/ #tqb=/&ymc[kOpa d0Hi  L ,R C33` e#Y.m![mߺ#Y4q(IqMؖ߱},uQf7!j! 39/}dcߡjw.F5cN">Ryzi DJfKkG);Ŗ3xD΀ IڂL͘} |lc7Q M}%|e$QE}ѵRRwR~dWS"-.R,6.u]}їYp0/=c圎$B A+@26OJ4 HR14TBjp.́ g3p˧u1s["^ -G!gꦀC:s"A(UB~uX112Un1'ltW'K#yzztQ4Q %) 0Pлp`ҸTӵ:3YS/oGB!8'r&h9*> %`=U QCCuYX1We5ܗ6d3V:#sv½ͧmـZ>*:.n(f>\J/YeqIzR| SȖaW>)2Q HcgHy) W=yV_={:|p!97|/nY`͌jsgg!=1>(gfS!FO!bb?o!?{-w\lUBR (8n\]ѝ>2H>(m؟gq6I80C<-ϟ% =b{_.ju@ >M=5,B4ACO ͂ W@w/7M^W{}AW! " @)'s#pSx.w:Ѽ\,_ }[r͡)sNb?yF`G[U-iDAӆ~!#6Q`cl}B.+5QGM3H(/+0n 2Wř`aL߿͑^-jk} bd?2J%SFPX o]9c&YQ`@$^,LY4\Ls uhً<1?FW yֽPMoTsL˫웷kq%~&@qAS:!ZI${[F*.F4ktp>* :>2+s0Ίpϼ#ߝ{ͼDd/$ KП/V`lN lX*w-woy9+ӤȠmx(0OF2&sQ)?,03(9ZM,Fl|Nu Zߡjt}AQPpgvaΞmسxm᳚iae盽u.8oskqmC_>q2aRު{ﬔ) /"34x+=-(, 6ź;ArvN (s)dM E_ QX¨5<B@z-Bo[|}nq7N7bZxCh^},aF,axqMh6h4>3a|MEHX g┹l]NiZTv ](f >py.tQpzzⱙeb)D g&:A/{qyG#.~CXO^f9'Sw+$[2jK =GPXߴ5J*_ )̣ w\J}g37-{OJ˔H/& |9`:oCLӺ-런>OmQQ-4e_.U0`3v[ K=;no~(oܡFO+nzC1r:+ v,7M=֬vu-YcqhM :@0^sXum`qN]V]] yQ#(ʪr? z}fC~1ɟ8{Ů_vr^ҸS?ڙJpd!,L/a6mo جTI$By*~ T((;eq7մ@? a[ ^Sy} ǻlu У/~߿6V۩ dD5jrwţW#ٸ43&ti_Ukfw]fv;0]Jv ?!TAE}'Ri"-:&Xmlf]W1j@vZ5͛`1z*Iv4JC| 6'e2o ~ª0k н_&NwL_FE#_/e#/1N̈Smr;qƦi_ꗷh\ieDӬzLD3.zLD3AzL.3AW?"q`DVhqeg'"uF1"Ecv 22 WGdrѵՁ =cj.RYQЉMHS}EzT`uTV~e7:li)q^ Js )&{ 4;WH)X8D1}UsHeE cdK_2nT7lv8-UFԹc w/gI% E]|L8/j1K_}c[7ƙC{lJv}~G#3/C7/?((]T*tn%;r"[f@4B3onD3Qe!4TwB*p*ipiiB!;T>.j4b[W9^T˽dH@k* \7Ey|lpw@<ﺾNRftaa>C35AWrVB,f4,fBℙ:,l;.Qw&Z{sOfzpcUPXwu\TLe)֞}_2F c-T?i8]crjS"Z>X2?FTS$Q/XG+a,֝ܫ3]{!vGwŶtf+⴩NȒ"@Y0 )/Xe-$JnuEoz*v+3(k$zA} !yܭ]݂8>iT5n9xP p4Qω銤 r*{aE܈O|#"\H:cwPڿM wo6@+@ 1{kTESJSPC@BoV)J{g f<LU/ۖ`{5zw{W6@PD  u@ F _(/d3ힻHODdq?e"cA0 xg0P0"3PeU:(!m]-/w" nkNIr l n$93P75*+{|)ϲJ{1hS־3g%AQ;ύǪn.O;'$K @=snβwg}W:^sDsͪghpM!m7%iQ٦Κ'; ! .9s5GuN'L*BE)=?#x#/WHN !'-pS,=x,3FI|[څ͏HiIPRM3x} n xræ}' }al@|n.y 7 d@˟H` "t/He[(~t-jh>w;ϋJpїE %M?2U #|X1b`(&$%ۖE[l; tm/3c7/̾ ҁ/J󞅣geb~g({AtѹXɏ[KoN\:mhl6-)BlaZ娅"ih [L B^22e'&xEb+A yHxiKj#ŠvmE-HY ;_r -"q}r4_G-DPLIʢ^lP`]Iy?L8+t\F:TUI;a/SVPq o6Ц?[2u*)a Y1<+||yn"2Ĉ^3=g̏W҉`?]ݝO Q./5_@X po9[?8Bg< PtpאY{SeXTWp36;W{Ks|) r'*Y˻$~x]H03~phwDL IڛS:G Q:Tc5n}y^wd=XNT> H M!JC泻uLhB$ۗdj5_lօ Ž3DxhA?=!\I$(NJq0̌C18Ӯc #.R C.>\^PBrI>B38NsSʃ{`CԩN yq=U{Epyepw٥`S]ԩn(5 h0;`^쌻wn!17*%Pʌ@2 l` )hP"G,sZ*GBq>ItvD1TwϠ/ct>r։!"_KrbUbtJ9/6;,%S:OD}b8ĀE,i糂I-o#aY<?/*6i\~o+UM<UJ0<|i}*:2B|Ui_yءKGȈZzKMd:#XqV2l*jRܷ0E1EOcCKXB?4 54\: &ha-F=0\hs?dKP7>Z/$u]|>|"M؅.0pQn$"]$؛$`a-xd(Ccmnl)8)#R-/Yeͦ6nڔ yN> M.>!ňh\dĦSAH5i{PB`v.}9DEj˹HYtI8_h:$:ΰ 17lAQn]/GIJS^n 9s F8BK(y%q<6-qo?Bܧg6/ArbDeTp*D4X`XZmF&{^D[V(}EN N`"UEsEQ䍕"8TUbfhr6$oh Ā5PHDp Tک)Fd( X#@_)+ `nU6-6DLp.X]c5=3VVr>,EPvAz(h,X )<ʡWR2\ ѵdRVga `+Fx\*RXD Ao X#H;\$zB fŦ 8 װ#, b]S?a⺠k׾!"0f4kݧiHAbKEU_nJ{C"WSrJ{=zxxz׾Q.6YKW%*+™<'Z[ڻz{AdƃI\ pqmu9ḰEp@- ̽TI/<sKy7ayGvP?2rR &C۲HśP){H@wxgo/r̄uZ@;ke1DdЛ;R!Rԉ#^^faD/پ^XK T[)ҽ3Td}%>͝w5 kjZ6pX|Ql\;%.C.poa6[ ^K/Îŷ˫yp;-+6w ]hǽºbwuG%ڻbBj˻Bs,x |HxP3\K> KrèXႚ"c^-¹FO>J~[[y^tSl+~sW֝ ʺsWU~缦Q 0Aq3 ,jFFlep @aj C(U-Vh1փ>u>uei"cZx, u#ADuPPyFI@ <0X/A M@.ģ"ȫe0G\D3X wzj3;=c$mfC'aB'SM l[ hSP"k/+%Ҭ :`xh9IENJ[뇘ܨFtqc|ieWp,oX'iP@ڷSͧEEFOgsDɠ3B!n1AU4==j\oSUng*D4P?V?Bxt`8@t#(u}~@ @/,>}G9PP@4sg6l-XjDVַ¨Yn79Y 0f h6ee6W2WXckci$݉&g6V -{]:Z{&2h>duUJf"bʀ!1P%wO WM W*w duB)/>pL((*:Z,[]ZWů_R]H#ْ5E_?~rhQ a6dZtdY## oR+6E6e7S׋ُvK 9 a]YC^K@xZH"UG(%.O*Hd+"[:CC7/ ėh5ZC 逻)t{uu}WB?K) jI01aCt^-m5Yk6KBhT+/@ )v촃?[w(J!a)Fhw 䓥=wC@wmuk=mI'/)(?mR?Qa 6P T$NQ68T!?F):,@;PJ>_U{H@0xA`e( (mQi} _lä\b(m* icj>>cw[|YjkCGis #l (wE"sI`VoK-(.0,8쇿SHh}42}`Bl>r@-UB(C?iY b2m_HA~ ~R\R* u@vu{L_J׏7d;oO/x"FxJ!"8yiཎ2_-JC`KPu< ⑨Tg6Թ\o.6&I-. 7:R+Sԣ =]Q|.NA~toc'ah*0,;h ##_ \$n'5>huևh8wCFnZ Ѝ]3zQ/YП,;}b7oH5=QPʻZ!#K[^C\Ѐ8`$%$:Wzv)*zQ$x/䝾HkAZc bkaHP !W0BR-Rޫ/ю,`VnǢPfhu|-?9ұ )x^??:HA p/#*BhK#tr)kn qU'05h-zBĖ\)ۃd[ ss jZCO Ȑ,2Iž=,.bd̄[Z4 MA*H-$԰ڄ  g롌 `A9>'Ո*1"uOqSz^ʇPy5dP)sn CcqmMs)_^ C9q4hCUp P~5EKFKNCD'[VPUVi>(| #So v4AG-6~@(6Я` p]5zZ<:C$ҵ9FPڄVA\N!1?"2-8а^x;UMB9d_dSòt#x|21%zpan'^ NXe|Bh*/:tܦY\DpHgf;^.1kY%WWV|⛘ YxʾHpi3R_,~ߕ#.tv"bD6u:qC Jׯ{kx-5*t|x)if7:7ޓ*Hɩ$XG2MZ?}aX0|[f>,Y NvGvt<0[/h?rmjiA8Ȧ^CDiЫ3K\@q٘tZ&`Mwj?b:L'B%,^KJmz,=C$vi7ryϝ"V䢆u~ Ҫ" ln&KO'GC:~zR#b%!}X?&k~$ԁhBk%̏?t4c1>>-+3z);c/̥8s+hZGrْ `/.i>j4t0X:\%}g F8_lAKǦTdhi>^]x%/D*56tBWOo] /{N[o7w^Qpzx#҃ރE8ʛۿ/";m7cps`y؄ǙH-@m-́@ׂ F~5I}[3D0BU*ڳ~e=MbIYlܦ8@hf̈ %9 c<1/D|Y`+{Cwn3o2d`|!#4BS $d$[||XIzpFo3442`mEHݎc4~ i>V'q. D~Z|jeꄚ㢜*"):w_Ǐ?oe|ʙl,;jl, Qz5~ֽBrx7RIp3fj9]jk$$b:'4i̍-;:$7=T?$m9S7zb[~˽5.iAAQi;t 1`QU0(|SI|(#A BLcVs9[0aL{GP6iC@*2ΤG#I$Fcgݲ'/ -Fe #)dBX!~ dg:ӳ\%!̓*^hߑ6&Y` 0c&iFSY<:jv2!#ak>H/QhbψhN@j a~jMT1( s;2x!&`Xfi,DXq60cۍ^q%ÀB&3fo]b7"\'ߥ?fFz\rɆ@Uu4M2N^o3i-nG!:#61XHrXl#: ƼPPJGr|1=#'Jv:A>0*@Cx>*^]ubE5p5nw.5GGFtNy6*:>FKlZVWu;{F# n}NVCL+: `4x鿣O~7-®7.A[cs7 :!t~ŕ8'a"",t~m=S9/*mZ9GB%{b ؤ Jn/[#lJ\࢘AL (CqP`~;qO tW)b0EUEId ?Q,g!UߏY؟Bʑ&Ց~QII _EynۣqO _p^ڍ3+hz Q+A&E$Ɏn'6I%^Cot#P0.B0: $OЇtm, @I8^?4JE`#]$Ixw[_(F鉡'(OQf,xkKy|1|0[Q)NʍctS:]ڎ"YvSo̡?)[D"FDFȀ{ӎSЀ6N>ܣ>}|G hꏡ#٠oL+ 4$b rTlqvvO ;#p I0#l_u)·@v4ґ5􇑛ma*W7距)As[MB"Fֻ{*9L@jȞ^h)Chh$fI}L AAd|P ;SҐJ0CT\TO&ugXK u$8w59~1)exkqiC3c W|j)F:! I kBTlv햬 #Ae ɘ|NS'IϏ:!Cdm:rR!2b ?Es429' xRlG8P *e>s(;ΤIS8GgQi:^F.lTG{^ŸٯDSDcm'fϝ2\Zo]tE(aߟlҹh v[7(t\~#doHD\Ǐ;pwp:d)k♞>e?t'~ACgJf“ 9qtw\xjޕu[Sh&7s# 枎ulH)AK-%$U.N趼I2T#[EF9⌷B=VuVnOUZϥO|lք#0}:O?"1U~Ȕ;)0~0WRuUjlj ,)cѤ]q5ԉ$jh%&ntsWӎ1hRǮ#pY.i,*e%v7+eT-d^{ `ʆRYԖȶ[j! F5e/Y ăuwz!Kh`.ԩwJBkVS~K=1+lo?U$􌗀Fiub+ڪQ8b-|"ڬDcR9.N?^ NkkT\pKr3u gM2N42w4+zE 1#.θեV_t~9x@Gw9%]\ >E^=o{(l#B>#3 (U<\[o^[]CߜiK&6C7КLնzw{w~gZ{ՙ7Xi nv4u K*>[M\K^PK`uw{pnl C۬7l +6/m.oΎ_eMY6-_Ew W^M l6f@g}^?uMRϖjO-ߎuhO z=ZݺxE{2XzDab@D8V# +Չ.{K&k;{+/rsﳔ[Oɵb֔ I08Hɾ8חp ֘ƄMGc1m"|OV |[O_gWhK` a1_OKlslB6|G3zs>v:Go-W&s՗@le 7. φԕa`pGT.yV3E79Ԥm)dHHk_OKH~YpDޚs DۆX{Ub-0`LK"3"$b6C?[h }ٵ߽@o=_ %hx7NJ}\  uGFϝkcz2^[jf9vjVdک-6njkyObnx22l La9ϤMMͨq#- B |V#t\qSc W;q K5.O.N;g&Q֞U{,VPc,a'!v(/g܋`a!щy+m Zz;^Mj^0 !p`#^j>y,]vU]Y>H h/tU fB P;j6kskt]_dH0J:llN\ [xTXb26K&ϑ9V;̑S$#5 IY\*mo@WTQk\S<%r@`@om@84@ځ[Mn'Q=i J/_hmgkѭb3(r쩟RѰDF2e?Mɍ&7C8^zNwWl(E3fT'DY_<L $b,b+ܟsw39mFj uI:5d 5C,:;"+k[0ɬI"ZCw@w-ӴT$P,F&I' ڥ&_~++U}^m#'ر~yo\lRǮ*]E$L F͓qa4]f *vlFZ3މEA^Ҧoo:}ʳ~_-F]ˇ ZThv\@l)}^u&FCwYb/1ӹ ~[AgT P7P>Q,R*/x3\h4hz$"*i2{mINO*@"TX>-M4{8IyRAbtѫ%CUдz5۔:v8H m=&s=~_؞`}im[izy7OTX5й3Y`mv1Z4uE|ʟYTصF^WB4k՞UwT^Cѳd@ؖ  A }WS˺mLBn{s3n<8rynЯr1Ͼ^ZKцDLJ)&¯XT({_d.7¾L:oM:s(]E++ˮ~ꫂ*!EۊO4?iO]#<!fk~݄m`uË\K=S!t}G±SCLQ=wno-{O(Lo*!˴߃Ʋ6Avߺ n|Qfr'ꈼb/^ 9* J+“ɷntRI['-l0ȳBH²HfY\p#o'_^VCʱ/!Ew?@=!*({Cc;az&^fJ6\ţѯ\~:171;1 Hr@`C fGB -Fy$;L:/֭qa+Sk8tP3b۶Zc 5 al#ua#>cIf,t n| tX6TLKK) T-(8.8BA s[ eC->)jh*iŘA0/#^-6x 3yW<=%v K>G+++5yZ A딜Hk :"'S.!.tx#-]Hu6B:t=a{tL o3۴bp/3`_οW;Vb^&S1WW׮ EI?Z<,p./u[d~gS|5/ʤӄrS il}(Fn6[ Z(j!X]WR*͍X݇THRVA=u0">pX-kz:𧗮\`E=o3ZhTq1V,1r1Zɫq; ; ྷ $ޮ] 7lsƼEƽeƊZo߶sgcD뻪%TkqR.QkR۔=xryŅYʆʥ yRjꊧ#Y%- Kj/'> v%b}epY^d6X~WO:N@!CCՐXo՛7֎w-ί-gRQgbbgyl%Vf hTݝC̍(dm'^Vţ^ƺ5_\}a3l'9¿İXC c18DHUV1? !x/`97tK?g0JIRmUg?Xo ʾpt׾V~*2K( P2@j\Z?z$fUHźd_;A 7|Ҫ2\MlccYa,[*9=N.eA:?n$`Zֿh5m(],RTĴB @B`&dNrd%${bVȮ ke۪hps ~+ZݷJlG!@P.x ܠ#"/I)܁$#_[ <.k@NǼ|K\`XSO,V*Pg]*d-Zkd}i'g#UDA??VyBb0.bbh^M^vAwZoڒs.wKNjXRVbnn%@c&YL @^wG+,xcoD:>΄7x:!0dS<@|?=|i<܆CvPbP;a:>Cy8HЇY!x!{?@PԇCC!?x}YLwfdCC,xCC!?k ?UHm!,XL!GfJ/|W]y-}[n/\{K9 *DT+n3 V|ѻcR #K!~8!׽HЁ f~*[*dOAPT\sYRzr iү#-Ie(PIoNű?ߚVO?x|1֮ i2a{ U[1Z~\iO85ߦi7v64{_cRu{]9QY *.Ș ]`cK [-5dB".XP:PFT#k f8A`dmX_7dž0sto΍uWz}%qS\O㝝a֭Wcy9%t@p+q|sK k/z2ƹAhLm`|sؠFz|hwխW@4h\@bOx tԥh[gu6H Is/I֥π*ʨnnGWd&Z4DR4I&<<$:̓BVUDWփӬho 2Ҳ6db1 ys,aD$YÀlaF7 vkxe8oS)4?lBQ5! |LAE&Gʯ뛻XA`Ѡކf#@+H=9IW /o[OeVFMJ#n K&t? h)$~j#44+ Ԓ]6P4Y|S͋X`ٵ0T՞"HXCU&`!66{7<$(CsӎQ$^ HnЋpRW.UC6DW*_IL%SsV!32ײhɜksC7h^q4"F"b+ru(ODA*> 8+zr!HB f5WivU9(M:1^@;Czj#) zVSN''؀jYɺiX:&cS |_q|Kt-ڎ#s8i})<&_1B-Aѐ$A4tJn6]9`A$T}S6<AXQڎ: +I4ѯ DB:ν@RxSLc1&Y'XRg{'L 󖢂Bby0k[ z ]3?8Nv_;G Kᚘ#&php$YFEtI}&$ Xe#3R>H;$_ /;`vAqpX1.pЌ4?\:N(5>۹,4^Xkmyh">}@3[Lrߓfo(,(?4x(qSW-|_-[i2 {7{S쾑J>(ݡ?wop*l cCYͅn2 gTQM9^JiJ,]vd ~(-g(Vڅt#}EPx: (40vT/sp[oaʫ`&2yQpɐĐ#a s}p尿,/f٭w{O#%(Lc-XxWY7'Ye椦ѥ6рSG׿ pMy{Rw`Fin-E5N}ڄ׋UD iAGyՍr$]r(qH)(v"^QTyBCR;GK 2^QO0'Z$XGL,ftDO[p٨G$*HZ@ȏ? )Uʲ_7PFr"6 !,m)Ds^&=phԠ\\X1Cc^y4$q |4qH/TI8gLrXVaeٳxLP#2d^&7oQzIg`I7x'=tw^o)|y嚫%`3Gxm8Y A+42G12-8YF:c|$ImGG=HR ƚZ&HƗ< 7/Gd񚉦25K4}Lo)|f{S}4벯w֮? RlUOKT|2<|l{$Cpj,'8/m((6=8;GsBKZ/ױm! N~,߱ӳH4`zb#i[}o~upO F%ֶ8Fv{n`Lχ + "kDwʛ0`C٦3]MZeKi/A963p쳨++!A"W` %`aʠqN32؏ Gq$1#+b+B[YzJw6jjl'Gcfh㞰ի{f1۶cnv{v4qpOƍV2[ ФYͼ+bi3&qԜkLpA#@bŘvQrۣيأ7/۔66p3Ԃ>-;-'|\B c!]8D }70@s$8B4C_ӇdJ lki-LZ]i~2hS&7H3}!W\h,A54wl¼a4顐]߮A1 _H.jh/Wkf`h+ B7C3@P88YfQ6Đ qcx! 4]SfDM_^fki +'8Zu$)MV \&ދb.Ȉb@-֍ 'd И(.а˜PIjԧmq2hiUhYpF>طR\ם*zS"^iͽVq"-=cl*|~_`VvrxeE fgG=< 9 B) )eAxaR08; ZQXw°0#0|lS۪ ٝRֱ(7YK .P1dwKY h@n&%#a[N 'WϿ$`c(B D!GpHX AdϘJu蔺wv"ImQw*jR>;Z$5,T&,hB%)i9vCMϳd )xg QRV/5ǚˠ|1_~8Y)xl >nE'h>Vs"'i>GCP' \#ڏl[Ud?g] ԭ BC"8P[,V,ޘ%QiB2$+VI*2yk{#% .yk=&^X3h%)j\U֏ ]2OeԗNÅJ}V(_r /~WSEf?餧Ӎ>ISn\C%\Bf JГ Roޥ֏Bn઴}GgO۾}H]HqْChh?~ihoQr1Bqp}~~}φt961(4na2K{),(l徨 p? L_h?o+^|AgzRX EtwC ݿ\QIz.ZBVc|r`TU>2cX[;HÌC^Z;(f0Q+pwGQ/Q_bQJ*K#[/S<ĵ2yTeeb@t|岄__`k硝dvg$9ХT QWJc@%伜O|H \5MO51:do`B b\[<:8K ˑ7 %t^RqMQ9R0Ȣ)pPf)lƝ?rn~l=MYi6(g+w _-yM归R,Su0v/MeDPϲ&[ >4?靚+nz mUBKH>r,т!6Ä ^Ao<bE<2\ Ir% 2J{/5/~[ٔX?r[aPKL EA}EC"ZtL["ݹ=]d5OxTȐ7oF)$T:$HJܳ|~H2PIp9 Uom,g]@_,*MqxTًP~dhXN)P`$ͯ d,Qܜwrnz׳6(fz> X|3}ۿW;5Ev @ xGIsYDfg!X4ٲ$#U>OLhۃ[p3`d923 1(euV4jP#MɾU hP? uI9DʂX[RUcU}]+A eDm໳u7hq,%&|#xKVuIL/إt#6u (E KEbhss2EF3@{PUɀ`wW|~7R~i~"-)BxqQLJ<P>Z^A*{~~X/qMn3fW2~Vy:)'-@;^6/倾s#s˸3V(3EDOQ/3`ĄȻ{wo엽vZHO|-D'$$"W'[-ŭڄ\ H{`(k0I-;?;-ްr\$eY> e|3d.o}C%O8)z2 / Li3GAbUyP,g-xB^,ߙ:ã<+v'*zzV.M?mF]$MTз飝8PlI6LoņHZ1DZ#\E˾zCyS}[;951wuzԜH`Yd)jYݕlN^5(:gp+??;NhuC)[Vmj}niMOQQMāQ9KW&ã5. $R1} 2ThBl 94){WUВrڔsvt+**{3R~E1'3)sʤ{MSRv)'ZIN˲Ooy١#B0bB@^!f{ i~SNqDOB)CLQ/HeW+t%}~J)BlxNJqΔYR9Uk^gmQ+-x!yl,zn _q"TBәs3^LpM#rv:2>]KD&o|;ɳi*lt-7ߡETܫ&ʁCI-Xn5r~}~LGr`9氕g7|9e #Gca̝ώ,_>Чƾ~U뢶 D5сNƼۙFB]n>ϳuXnv| Z/(D. !I q+<Ɠ8>r[dQ~9׋w2UݛGo\?۷&G7#_qyy\:WF!e9Ɨ,G3}?wvG3m,1w! /bnYyM#CU$us.7}]tw~#ђ%_ZJ lufGnW/#ecLvU}|_jQ;t9HUYp?_OȒZ޺L eW*)LcX__ˣ(ųbjq1 Ni6 ;zTl$gdș=n"pR@ }cָT0dHp|]s_]V[+V`J-}fZ綄ղlz:&{=~zǐ56vol bz:T .%_0֓n% ۫eAӫ.|ZA[>#ڝn@e,U$xf< Ӑ1,Ф\i'&IeTcUQ Žb=H).: {oO*iկ6UV[-Vm&l]rQxKbA &FZ4ly؃\Jy4`iΆJIm6 8l~m7,LfMSL'e29()Vee-eB~ T[uZҘ#\c׌W1j:%&[x\2˅*UrD%jEC!o?ի{(SF2}MJcaBro^YF h#^ :!NByC6(S P{C %Sľ| l(ޕ;phV%_>AXoTBptM`4wfnW{l!J. g(fCh:)Ww Qb\TeԋS#-$b PeGuiFQ,j ^*>2>óP KPy;ޗT@<1?Rjѹ-Xú؀y /f{^0& HP\rYĠdQ^}h6cd/迓P3#K쏄BI! &Bv*G]kdV#!"Fbcm()].¼FF#_kOOɜ=# 6x!R^_pů |r9Dž# 2i9,qᏠT"fr^[F i2c^[i;v .H,"vC jޔ{GlE Rp=rvo{>pD#_E>H,B#V B4,7y&w#>1@@CGCMECu363e~g\撆ivznVYW r.T։N (4#vD_"<g@_ d(3en˹mV&?O4T"eX8f*lq %B0$BG#Wֶն7B4wqmݫ(Z [j*If|&>ӟY ɘ-W K+n䳲3&Se^W159c0"E! mu.;JeWΝ/؋&fF\\U9EG*x.#x 5 B8-IG Ѳޠߋc~OF=nGoh~ۣ3e'/60E@AzOf5? C: Wnd)ev#AR ? IDѩČvFЌ@H%1) >J gl{)X5٤ʴ +M-7ea'eqd'yՃhK㈮+ Cм_ :NkcWhVx"ҰgeJȕ[]i\ $^-hzNN#PbVꣵEഅ v| ̈́¾KRBJ jP`SNI!fj<<`{|icb0(pzu}/@Z-^F@D&K—iAy9U/%E0U\gM>iz)Ҫr iGrKes3˓I=B *L#r;%R<}y+f$t[ܖa2^≐P*01T PIs ?2)Qff /7U\r"%҉+d/DũsTc%v1G\~ Pb&7 q6R\==;*s+Ou"\) 4+Ӆb\ǒr=ʠ@Bћz$FEK/A/FXxh)[+Ka- uEX 2/I6ZMWK6#T'7P$%̜ZQе2(x[hV $8$W8xMFe.Vt~M-,=V<}9>1M*Z(mv{$_c%Txgu3%-1r:-))en#7āyMpZXXq;_R 0q11XAr/Y̒6FʑsWQ<;{!/=iy@FȘhY؜{X! t~3WifM * f~3^Y3Uj|4y3"cLYRӭN+yat?xi-`c05)7ڞx~DŰephVŭTA*H݆&TtDwjHU4 y+LӯҀ-; &f?Iŝ@#u7zP]>ks$n|por %%}G3.2:pwY(\g{ W͊TʚtAWHR_$sAr\N~9x/,Yb5G1-'P*vƥ~hfqAKA #IŃ2{%J bLjh=:YZ9{0ŷocǾK1yoG&}|`t% vMR?bqf|iŠGP Mw#t u…xS>“.`i_:VAVvLy?/oy2gP(M7U!m$ykMfm ?FN/9'@'DD a'ÅQWaT7SV>ܫ/@</Kb7csK'qJ\hyW !8K4ɟߵE} :&4xT3 Q7P_|+>Qhxi7lYDC`H}xc`U%CV t9 8p.uA6+9{umd -NJถcGZL}IܜeVOjx"˶8X{\ĕK|'ʎ",,!M`]o^\ z6@'0 :\8 5ho4znì+\|Dn3 @f7e[_8)sj7~LuZH6UtV%DyVcҘ0KsQWwjj=9mg'6U}KeVMqa ZsV%h=X Xгtt}fÙUROy3]I2f(ӫ ӒbAX?IS 0Pl0"}Hi 4 MlId;C(1{BP%PR%# ~ lc-zd2ơDJC;C&J |JYs}yYQ>a5[Sc$!}48v"Yse%n0aQz<m\Bޭ:Yo#TC*MFD I*Oq}❴cB6nSIӉRH>x>[_2`DeuBmHA3tms+նRgGEñbAGjr7+C\\o,Pu[CmA̡5G}o=`` x/ YmPøx;g@&Z$c:/!Pa lwPc jW EbaEeud'D$`hw'h^^(ȡ0b$Dq Iv( z /xZ^\XրpBMJnB[ \X8C-2 Knf`RₙƫFrYT9ʔБ6O\YIyHxVe1Lu9? ؽ)PqZ,{&a%t u4A[ذ ],^foiVfsN/*:\!S+|H%|-YIsب{ [@&03AѩDaغppBV b|QmAI@QAhxo 4ňDh*r"D3ehiC5HL[o8#b@)p@9.nU9RDU\bho7Y4 x+Zc@5߹׿H1 yN5T$ #8Avl{ !~thI]AR߰a  ܶ4Rm{}1 >40 ݸ|m^z/נ/ a@ɎZSā_?G~ST[!'ƶC\M_Tk Ϛln0@WphC4#AlĚb[;MeEA\5z?D|#vP1;G4e="z *KvhQB@[ڥ<=qoC g(炏P)RtZnb"/3 6td\!9ހXѩk ͠Ug\N23w7ɚ2hťds0gZ6_8<(H~GR;Vۋr?M:8&Q\렲6 UdHxIsl fJeȰ "Az7t= uz6ͼ' Xo[`tDg*=#y!nobk#xLԵ\9#humWH%1>w?΢a_|XaffYpE]#7buhDO.7s-^[)XX$ƜLrׂ&u+%xJ ( x+(r[_+ Ʈj_CT03ES nZnWhq-v[֤In9FA @ ˈ/d gDŽ1wm-qd ҫ|` HH,NpR8JC/jt2(hL`F yx:ꀨayd9oZ訙LҚؼګUl$?Mw2Mã\f10zmv>$yISCh.TAJЦ Q[6JR*oD]uPOڥzdҨZ݉悵*{%:3t r0-pO*D7?0[ja71d I'TxS*C\S:8T"sjV\]<< yРZ;d }ͲEZn #'Z YҖ[HDi[K[V"-QKx^Yx5ӼWx=XS0L4'NEN2kό F Q๝Ȗ0fCєxY򯐌_Ctc@HPSD}Aeӹ~jeErWˢ `T`כ2oҙ[Jh۞:E5{pnQp,A>J ɿFFc3<ӏZi{(k &[!.gU*0.e4KL.Hc>sÍpҽ'Oޭ zl#zGG7U}P>q?K/U?z4`)vbeeLĉR}RA+V|DMQFE@,TS/kd/k6uw̝_DbNѤTѡ"=k*$srɟN;?FIAPsͣLl $݌#u62s(-B:yXaX R˾ ptSIWMNԖvbƛۍEl^GS ??;Gm8fsqvTVD17Ut*0?U=&{ѓ?R͚Φ F~QmD*|i,e x.4_=\MŀiX&?nBv Ԧc':_#6[lE~ zan\F쁡$3姏M| q-[-}.Ж&c貖J`Aʀc۴?9I BTs}wq #O29EVt$3`KX7!CKn%+_ٯIQ/f!'!Vy2ǜa'lb$*a ]ҋ{̘*)־.%A,@JRh+0'PxCS2rPW\kۉ=t w.E*D쌀]jP 0n;ȆТ_ō G&> p~7@Wd*i07v@ 3'.xhHS  Q#52vj \fnD{S:[G\~I%2~lpͻ栫;2RIgK)TB1F@T_ :omxn6|%mOMGKًqze+WH tINM\e@UD^Q_DK-g*hA&ռT * ʘH0MTA98pȺx =8cEìxkzh!H*6 bf6XP/QDlDC>' bq -Te<רs{T'xΨ6`W4xw-7{H_ڨ^ -avb1l Ȩ~WN12N8Mq`l*8 ;ÇL\d fI]oH0 !ZpB/?7NLW¶Br!|"r۵7M q]92-T4'T9Μ•^ձ x[6MT# g O"k||WW Sfxs0oC8rd1  ]䖸`USgE!t>=aEA1%`DgZ8Pǧ@ Y !+qQq&a wsY#Z&Ö 8C>DeỹA>%6)} irDLL 2AQQŌz pg럘y;bt_0 ?2!":tvցp8]Z:iF1 Jr/)"xV"NPrqYZo8HI1Cpk{m-Ņ] 0 1~Yrq9}{ɱtNd􉫚 "{/$^ҩ‰$^@ȱCQMdR\ƙz#S -D1T4⮤(Œ2% !CL\A>nY9y5=H'NF<΁C,4B[S% Æ}cʳ rit@֗PEU-zb Ml{}ēplpʁM(zF_HU[`0gh-&ux(mOQ(m|>mq/w ڼ;`O^}:aw?䤀c\K$"+6ye9P&c  nsW*% JPÁ?B8 0D4=A"Ą]"_Lw OrUp&ixɉ;à7{-rzx|{ݚŒfC_toEz_ϼ#e^RFl\WG*+=b8H_Hn᷻ݕz" 4(t1CxI J+h{"E} 36˄` 83d02V*/'Q'"Ͷen1b4N1e*Ä#XJ_-<M':ާ5(ܕ2t R(6us)\Wɕ_MGTSRś2>:Z;'It6i^xe;ʩ9J +OOhF; %"K|;ِm0- 'RiID>33y3=Lǯj:/ɡ CDI;?hxS>dwy[sy@8y$m"TFgwpkqBP0,< ˥HJ"26ǔPrb_onOva>?ݫB֨yUuCTR&na'Ppb(oS+--#$D)r#Vt=mH樏Swmq=rVeBiiRNO" U\5{ i}~Od|F #i22Zq352,QP؅iC-- I*gz/^S9brO88GmK+|nkvu*LJň֜YTS$[57]O){ 닢JWim.q@!I1lh9e3XNj.hTgh'y';'VŻnva*sP%;EE Gzsczz[{Bѝyh'gw+ôh3~j_ 0gwj*U EѳQ!R:PxwZH%lQ5F{b%='zZ쭋Cv /~?_;,u&[K^[I#rzw^r`UYD4o܄. PD yrn>B} T 7KC5½O&D,!ac*&V鳠z0CcpWwv$(oxfyN($wR1fu>s]TO!!dR{y<`1'qoQBE|zk MƅğHQ2ղ-kYvEBλneW߲S2ޙuJF.$f}Hn"Tu!O ꕨ-׿RV=Ƕȕ+< dَ7%o>02-9e#aN;v(J Akqs>qB{e Tװc4cldJ%rS:j WI9#FlXKN7_*\=:/z7W{z>"Gz LݓDC'THj͂6H 67~f%d'd10M`ީJZmԹ E,aL26p ~Q!{d$K~: B;!bDtVCbL Yli*j4?*l\uv+Cxz v9JOVm5[lV|BFoBVAf#b@>&~Ͽk*Vb2uK?PVH|b']^ZNykz=diwx jv)5u($ ` :_!w~T-/ #<(?PܠK,kM9u3/d@iY䯅^A!J2lp 3c;\U`r+ܭ8+jc{:9`Lf5?QcBչj];뀡'A 85%Zp12z#j%3Y8 x} FnG$U.-1l/2n=zifcLaW`*WM葨_U$F c`_n牺RG/:ǧ] 15QrCP5'7l.w쉄)!7̯bWa$ в&x^Cޟ]a:*QͩMD{-:@`H.-ޫ%^`g%l-/7h%cJi_Ⱦb&@)0^r} aL}廗 +o_ZԖ!F+X;ORVd@]{z+=bt| `|Bj&\ĩ }:0h"z B!`K%RYd{ ),lAm~?!JXa@[bO]:ĥȿfN(@@ Q\`Aа1ܝ|htӶ}d GxB;Fvbk/'^MiFy偧C77F?ɴ+Jm?k~B;5vFS|󎅡cv` %v bG;nk~=l eob$OW0K#8:XWW1!f %hoOID)47+t!ayǜ޽ip+1U"d.4$R%qO gm'i^!2)3* XO6cxPx liviTbiP(d{Khx;w&whOgw3̽$ 03I*H:ȏ:X `rzˁwbwb5VZwn`$|ew>/Ύһ[s?\2{i͕xslҝ.]pHpsz%j!$A1yTL:1؆􅀒ܪ\kZlvU?omP8v"O5#!3Y ]1;h$gy(dzHa$- FIdȗqXVU5t֒O$&쑥  2QI"DO+XwzETDCEd}:nY㑩#%9(ɓTukQ o㶛)\ Zra!Ny,'&!mkp)a :":T}GF'W$:wX_lbWQqc` PP%D"sb}]JVXi.H9Eߔ6MǘL7]0GXLWd\tŒ˧afϮȆ1Bu1{6Wal%G>8ngWx(hh٣hh"@˖)4DT T~ Sm+qJG$%1F)riaP_[o68+ܵ5q4\9m8:}֖HS;eL*Cjf>>}~^Ŀ o@2@dY^̳=FyNڡ(W˸A&p$-hen녙|3c_C=B>w@ڛP(5=pLo%14>w@ZoίZ|%;=joC.j(% F'S2Lg9lS3g]f|ux*Sr& Ȫiت|i"NE #(i ̜(im]^E^]"y bz,51ʲY6f<_3 j-XxaL܋atvJJsZl(c8 MNivG#U3kGʾĞ*DA+%Flw ̔WUU~Z~JfnU% b/%k5^E_o]uUy,C)Q.Ђjr[c:D\f t~zrhfba/wiVFAUWZ̴k>Ja H>>ù$/qGu!m<{6t ; W^WWWġ Խ@+ B<Vv26N*za=^zreU/P |]~P52ZT[6{w`M9]00dצoWƙ ^t}ДH'[JU~6!bY!=oa4Xи)8eTYs,vc<`ޜ٤i-At faM \x;Ddp3,>fʽo!)U+Gzsy54t=H5%F\7FfEgaǷ1 ;f$ = FټOK^&M7Q6GG-rB_DFZègQ 4+SxQ[+me_h\tUQoS4Tw:>dEEdbm; f+^Lo&tZ=8Amψ\=݋7L`ƒ`b!DXU(\ų>U8RJ8H(S #L:s M < "Icߘ~dp&to`K<5!ij6vb0779栠o`'jPu"^D&8S{,h:IRMXx^.|j zZ-VF .346zu rd26C m)e&Eۓ/*P>ժ'R.qxyV(BE(j0$a @Kqp&Щ}%81ZS\]6=C|.wckt# ł!a4T"hYM9j-bw ! D#aeՒ2kE$;$S8 8LߍK5ȘGP{2tɄr7t\ P=t3],Yi LS/3,Ng~&P2pT##6%V`UP &d(L %*#Bj8D^\)t$N0'1*%cP RËCJx@MWNnZz{GǨڕIقb ZG|H;zlܞzNa4Xx$u#LyZ<ƨ$>zHXԘ1>CŰ1>lkG<pɃ"hVwkOךE6$FG^l~1QG` aJ`cI'vz)v &nNaJ5s&vv7=s r$n7$?/ ܗL<>' Z9sز7܍vwڋdAOd{JCȁ]5x%ŗP+n&f cZJYKgSYaDAJ'RCNbw4ȪHӯd%c;ߞ27x@Åf-/ٿ倉) D_:UtiPIDžu|l3iЖ_NRs{aGOK1R)=\qubXM᰼~{,ҦU#5-O6\sk֒[0"SK8J'1UnloT])3}la!*-銲ݞ Dc;y+m{ uc*Mƞל58*̝|%eFpi{rsz/Y:Q3oI%V46sa3<>¶C:!kc\̗Lq u< h| +k1E55;|c*&{,]A^WrhnsGN^:;p^~ߚ[W)Hʈ/U;{.&H"bnvC0_ yi߁a;+uGk7}7mW):[Ǝuĝ r8ϖ<z-<5[P18@<_9g!I)&p%4–ؑWo9U;:F\ďIerȗ!^?Inb#C"ByOdo9)CH:b+kcAyIOB q<`:s VByŷT:A tG$!bqy8}O=RG~%J'qOaʩ|k1~3uiװKxu{C6 J/ {*wH_{ihDm! /J [KSCAWXϷmo>KOpN[o9Coũ:سC L7 7`"9Dar.8Czw$ u;^y 3WΖAFhUVeJ7uX~[mr`E)˾iie(aݿ}F+WZO76_SXPEhJؚw?,QUX0H4yfB{$J?c6OM `SȘ)\W.k}o2;ja7<s4܂v]w@7.;g>qd;Kܹ[M6 M=l.#ӱ4?P*YGG>@( bϾ)n`yT[sN $|_)o8O ‘*!Cf9[&d9h(hӀq>$H(SơŊ-Xx`Q6OGh/@Xsh&6m+H.n )BnF%bI3si5mi~gm2U5b8ib ~7Rp*?Am1% C֜3$J'\1f'8G5r6pC DQ88gI!pm2if́"wgE*ʱK~_gD/Y`C-7#n|sp0Ey-p$HTzQIcؒn2)_ ᬼȚun(Ǣ^9@jsEO w q`1/  ZN1SG@35"$E1% hoXu#{{yRN:M`y.G5,NHU,~'R'G/!#]z٘f>ꁩן~spq0Ͷ,`!C'`2hƐ"98~l,f0։+%p 9'p;Gqٔn \yrùtR!SXOw?nc'Ӵ H "]{cG(Y)qYoH>*N89|>dvu 0gZ \|NZ ɫH^Y]kʥ y'ѴB>;X1WKW.םϠ U$>vZz6h0@"x@8!q_B Ǚ0G2bN(6)YIG"e99wo+:mک̿j@nvERDaNN$; E344e[п0H8;UeY(/9g@4njyD\~.6Fn%bFEI%#&+=ƓWA3[iЇ=sw-o(#2ڔTV^L4d̊12$XOvH9" 9N8$ D ?)"%eVGb[KPi$:xUq%\#T.2(CƮMFFmv_|(lflY6K]KHRCN= Qd ]8HJbۇH>Y)a!  Y5HZ(7->"6a4,ʣFj4%iY<<&)i"\:;m * 9)% y9 Ȯ7ˮHO*S~noFTld&ǹ69$&?4[g< FYA&T` -.,RFW _?`0 _w$AWƖAZizF i6ڤSId1%}~2 Ihy] rmSHC*V XKFذ;R1,hnFqa+ l~q^'G1+1 D;"M/I aSF+ +5%xWJ96aIiGoi7!~Ȍ&OH ZKlAb01qR߾HXR"{o9(}Y|x!2'q(iH$(+?o[16g҇ql"T'.;.cRPK!ȧiH"eOQg?2 ) O g K~ݰɁ#\S ev8z h6Gh#͙9yIF 1Ӳ+ tၳS@ z$;8"kΈ3V[qٝ~w/'J&'i%`D*rymy08#I/xKDc96h|YQ:ڈ5BV1յ`VwH$"dU@G} VMl*w`C}\&e;5=l)!0*hHDTfy6S' a(kms+{V+˦gy+4cmPbLӘ81Ff# L3FT"GH5򗷻pmZh;}SF׻yerlϣc%8k -r- c E8ؔkA+N.!444ٟAYg<ۢ-V8"\yCDt׳(. qjX6m2=(\/p8`}K8L=lrЃeEcXbj:HI&W*qV*" ГLU\&e_> y鵉ƢHXKV|3A6t3l"s(4oJ*Fp-D!R?fWӨlWh͖V%7/kN+iD! yKs޸5ߊxB"@}ƜoJP〖']YiÊ G]Y2E]}DP1:_nEzr@ƱgxD8+eF.{,J< &pV\5Uݯ{9qH]ͫZk-=5&SY+S:Ovnv ~5+jut׳d،{Dud%좉'.6;jîq|eT_t0FcqmҴOQl^bpaGJ ۤ68mS-&Ʊ-\x(6]`zc9H6VCYq"yP:U?sGʾA%ڟPl!s 5WEiۂg%}ۅj= $~,9*J^p!p? wvd>,!kb}n fsW<}3;svγ`Of׸RŦFenMܬUj `bh̵\g"Uܔ̄bLVK@{:%_A|&LZv5<}Og#za ׋\9$trnO@"-RQ5WlQy߅P:h4V.~F z@ 83*F8lǡqO؝3ŕFL.zgZK+6jX5k2sͮ5e^5k0GCh3m k"_n"܈]%3d;;%l3_ΪlJ槞nfsmkZvSENS;7eVݒ7LhK\(kvֵfiٚp[s?gA xK6XeC[9A:g (PZK\s:-;{j%3tOV @%-Jt֖+y_Z9XV5ii`qhaoj8"̬[63L`i9efCPf=#8pWh^ @"&@l*a k`DhHK۪S z`lL9(H2XD-{y3!L&v{͝f >wb98%a@=_M'0+w*:lgq!}`ǕYIH L!=u+]PΪ7,l]O)D;U>ڧ[P#0Y;׍L;v':9{iĂ'oiw%B4~̺q-%Ui^=Z4#0/yg\BĎG R=+SVISǸ&N_(a8.]#)'f׸XVL7-A~ #?&M ?JI ?!Ԯ ~\_;Q1GDoo=`q gƇrV%:檊IN_ӧFVp(yN+3&{,b DMP;].\JyۻB:Oh?z9Q <9֋o41Dp[l#xqa(0\KhR'7r[اiC䱘SRA$GT[]M&7$q9"qߥ.}hD0ċZ2%Ԛg#Er\[[Z+%3""GS[EGþ,T OǠOxR'j$+]e8L:M\7@|*&: #} 7ԇvjCȎ"ۻ"`CaP'9DWw řOy-^Ffcxk󙷸M&>gZSLMq gh>ŅkQTt`i IrL7AarGYMuK)ovnjV |ӋV*}Qٟsrt(qUHHUGX xb=[%]0*QU*K/$5~rLY-~K/5+Dlzb l9wzϥ O8ԭ/N.ձ1#C!B{-Q6rQ1Gg)ZlMvw:x2R2zߒRh) pl[(Ѧk➴n.;sir6jp Li(ꫀ+]h*D5;T RЌ'T5`t zn=c\Pú/zhΪN?,$jXc*nW*Av.0ҫY ,2j!kTF}#AGOy5ux_yS?4gA \ߟ<1 > ?,cYc󨚱ǂD ;I7~FQǮ̔?Ħt2in {'~N'R..k3Rk K< vE]pnjXHx>c'|MswިBJ<ӫl^Jʼ|(TJn&WJ2J7ϥSDq@bSqwOq?d|ϑ" Ww?Þ"G*1sɁO >}Vo+2KhFR8wYv5탆(Li|UCZ:t?z+b_ѺꢆˆƨR152TS]do1 R WϥD!m(g+ؤG)){:G"6fZS mD"yug@O=łoY7 p!*U1H*RjH 1Vs R+ٛH!]1 de?SԔη;Sq~TƹxkF8R%/C4#Y tW'Cƭz9:Z?('+ý5Ql1 QW8.!!ڰNX_Va3wah_ۓP*HϞ'' w=daė sLq)Gx`DaQPsYoe)KQ{Q1~s \z枯Tit#=a? ėHR\+..f@شZMimw4+PwyKIBw\|d%Ӟޕ}hn=]*&0/%!1ZF\#>yM`Ѭ1?Fʹ>@ QTRd?LjD$qJ%=}PhbLI$"e.5 T_Eܔ<$ҥ 1`}jP߫Z.e~rIQ< G(J|:<#"#\4){qě?i|À@F9X<*:dVBfMcIT3aT򚑄JckPB{[n t ^Cl j7$2 (R bfYMAf3AmҚ\fSs_lx%=h*=w_{9Ĩ00$psgmvjL fT.eC$yt5%eizRx Lah`P  j(MKfky^i웅 Y~mUq?uƚ5qv($'}'rG8Pmۣ^׶Ի^ [pV ^zϩpi0( 8Ċ5'*2R\x35}1Ϯ!0k(fu'.+ 85I׬NMqm&:JlcZ}Ю)AϪ Ah_D3t!Ӷި5j_N av1S|epUlL^Ŧ=QP? ?K_.ZC82dF8swHJ8(> '6PhMFC()oѼ*Ip*O5HG!PdRG)YC+Uħf& ueU"׷40$59I fMb `5:L\J׻Z(H{V0WHSU+Erpg:SEcp/9=LKCN rj s#=6_T_L<_[L*bIIM%25ۃ^,N˯tHC@uCaCsT ZytQ&hs|*' cR?%m321FؐQ"L2g┢4bUH:n@V5(lSFL x81i;S6pXoB_-ky-Sօy2,1T%,O*N~_k6FXB0L$a|R̶{5' S[QwRJ|RrUَi]ʥܫdu6EM=AA"GK5$E9Y@߾c.#s5w${>P"UA*(|Sb؍]@A4馈2݌&ZeDÆVD'QVSw5ʙ?9'6Jy~EteWfyKvfg+ Q"eOkhi ,zi8 `A6x(٣M' str%BdC;٬8TzB<eb 6JH@pY׹ϧ[6ȋ?48Yd=?p@{,?y O8< t槏k;x5""PC,Ca!f0Y#UT/gnCvWu]KaV&;&]!P=XQpt}gm.?ì]B0qp&$m iB*@w—/zI[#tp3j]F!ƐܕroO"s!UG|`$K Dpb٭b/5[^u~,RV F`} y.@s']f aC=AP\a JX>raBj @VP.j,Rꩼǰ &;NI*nUP2q Xbhhώ!jQaR ,oe^iW)-ixi_JqL˚ ;G23 U~0ę0 y3*d>0H5>ڀ;\+\ eBwHknҪ$*6ຠV]Wcȷrp7?ioNcAAҍ𖃊]U%(N'V,T}ۈR4 O:n0a'|LYwĤ$w%;cݘZ(+G-jH0:`ZUzC^ƍ?OWC3Tw:;tc+쎉O(4CȰ\wsm!¥$]"%1öH"+N9Ęk`Kml%,"%4kwsUL1vrOࣻˢ\;$^ RRƯΩ+ c`J:ͅz]Y,sA, 1 M7&LXJ;/N(bD&tHj rXO" Q=g>^OTZ^KEM/6mNaR;uj"4!zV"jCꝵ3nؐG"WXGZZ (*Cw*!z!!١ֈވudwiU1CC";adʜWE%I%#AP[X]^N4WBy&? ##(r9*8'TE>O#`(&axg6/aNV/EQ4cOK.S1 ,6cx@!wȺ>B}\]F(o>Q^J(m?-,Z(x r;^x/l/Ԑ g g=W8]`-'ֈ IK<{r^f("PƱ-us!;'SL@@[/M܂}*5|ԋa"r-'n>J;C 跲$wf-zσMWx|0/٭h4qF%=i/hvq\+,v5@LoIin%u8;$;)Rlf/*UQ}C''oз67@sSdD>N׬\ū =i8'mZC_Lcڥ%`KꠝlГT>LA>~m2^>rOe ;F9'uO?. +`f﷽ȼy6}~0ydxr1Z0}pCmf]_B 770IDX*ҟ:9^L)ތE`ф 0!LSq?/=~|=6RWCJ}Hn!n$60P2,asW]\z#*U$~w\YgY I<%x wrT\l")<+)zM;n&⫱mMW+qWc~_'|?W?.LT6^xIR,!lQU bq}1yP_ʏ8[@&RuNox~ML$h]-)ˊFv&s~bhLᩄ Yq4.נ;9Ћ{=>oJ~(q0A"I&},:_l⨊TNw;i땀xu Ms<"+NgIi5Mi8k {:X #d, 5DI"pMS.YPE]غ Ħ`Dz@;bL0TqE=AG!Đ^\ a0 @VkF0^8H:61Z!]πGXg}NCtF?pLhB 3H@69_K:ꫭO\h];dj|Y$>NjףV*j9LЮQZv -8TZS%0m!oB1f 0!I-\Il4!*;8TyiG a0dO]ATfO/u!Q~f}543ZgnP}^`+3.&K3T*LRj3|p v #OqU(iJ#!lj ~FȝK!ȣE^>D@1`a<+R"#YWӐހ8"HY0fYU^ȘoY7ˬgp Zv3Z_&*ejh߉淔x7~!Md *9 18!YϯBlr/-~=jeR*Cxg>{<;#K3y4 RYa L_LE.U1gad,(~i"~El{Ob ѹ\LM&jaTEJkA?8gX#jHjdYT(bZcpeTr7{f˛׼7I닔v *4X|!Qz+SlՅ#K Y8ϡQ"m*:A^HKJۆh y sƲl*| E8;yĩqK 镳!,Zi嶠AI9/qKi^m%0ɥS:xEC|H9\TQӽ**Tdp7E%XH=hvv'CCPw)܆@omD=~d) gC"BD':;tn`&a@~fReR"9Z{C\-VbyndW>BaU䂕|9+H>.S^F 0% R\^+21Kh8/4Ug 6?IZ]p{Mz0"S>h\K5Aq+B>g`s+id9;' %Ba+XiD.yBO0$A :l=HL1 ;d+gzk_㈌鿊Ɍg{>c)2Zi5i1 -0rFGO]a'4&c20OR6sH>z_D-q.a\(L?WY!ʗ`JS"($ nAFa17Hc\0"1~$jT`HN]D?;#TPan,їrɂ7|ev5 TB"4a@!?~XfpXC59piPp?"'54gw!}l܀S  9Tùd!EKDĥ5cک=k%@~jqcFip˷.-"$Y(h9"̅bC^QB +4vG O6|%b-u_HoM1RjI*cրy-Z TʴUrHE[&Foh~X GB + coU!Fiu0RObfE&Q2`@L],C ̭=$P0f5֒Δe; yahT -y &p?d{ZskJWu:p)Ff1ia,O>+[[c(3$.d (?3 ԅ:T[E҄z)ԤzʦecD?P= b!iS@5^ /B`vTD8{j[?PYT?᪲TfaB*YW+@lt>Bsje@1H{JrAD!}wKu>|5P\iYmmWjLNWX7FA%[;A-nޠ*ܽ\, Ʃs^j4HȌ eT#|iIH޲ʺPD#ͿV)hA@"?w{ RnFJT>l\Xo@94yH:u~p Z:\=cC504nU}PP#z5GKakTnjD2^C+ $?$o ~Dv~-߽[i 7n=z8!=0'әZsTtMxڀScdB[h=I޽3o>7tn*fͫ+UzH=Uc۪Djz8^{WÁ /v>4?Dl vW;UhZjRLNu,0YZ➑Sc'$Q^FyđlEU):жJ򷚟lH%m+LZE'2L U8DoqX$)xeB~X,1$.pUWL2f͙~ݓQ`*+cNeAWCĉD6YL0%^:,U[nCS%3H/+rI:"sNݽ4M)c%R9ݵRd]B4jF0Ьa"M\wT:aS&4K" u=~6}6X<QBęDS"H&a0ĥqS锕0fJZPL'qe tLLd^M%)kjQ7jY|ǧ+֏Y¨ ,QDq*c3͵ "զ]#mhYn9*}f/D/D8#OWf+t+Tb&hGW@ʕ='3hC!493^M=0ݪïdLZu_ eH~"/ }o+VxǷۿOGqih?'_7Y'S+A;o %€Vϙ#?ZV!9p`A !sW_[^םi#jv,s dy V ?HI^N/ cĠFe$d,+rqQ&Ikrms9sT'd+'x8͜zŔ"44z(!hst ڝIRV3r0K ,WZtWF_h0_B5LR~u5$+pCNrbz$ }rSǨ'1kw-\qO|ats-%?MPrP^)3ITѪfYZ)A ]1MgǐXejXpH:Ѵ⑎om:|pGnKZp^"Ij,zۑ]ޠU4%vD%Bޖ_ahyٰ/YY`iAOhh-J*A<\S"c^׌MkW%;okɖE"[vm@8'rT'8jTd8Ny#f13"I96q-á7 -0D$G 6GMMF.{0-pw&rٜn*<Y8Rm>-"ƖIL"%ɲw#0* x,ʑ<*e(q@_%#}L~2ܨ$ȃͳ> 緡#y*րc}RSϐBm9q9#!%6+,hrfYÂ@. &8'JrݭMﺰmT3C-3GBb9f"*`r>xd\ilT)T20^^Q'=ANMr~ə ٧YR&u"lxeUX~Y܊ל|XL:2Wf߂ղOdzA˫Rfm 9șaǷys'~A#DʍIY$x[˻8ܔLWMRnҧxmT8ە>L0փbL/%iA-$Q3l4={V5EH )"T)a8dۥ.oHGÇTc[Q(n"{O־8^#o{:бfK#x 2bdKO&|GI iߜ-]o*(tG˿qppC<4_!WM H[Eh+me@K/9?Z&}~8w/`*p<F'& L"187{u0=Jx$$ t^X$aׂXP^V<(Q{Z72-%:֐.7) 4~$\=˕;??e^HS 籢Ia*iM _TE<^%"t`$:_tG-2#$N>%SE?9Imw^JP{@],>Hih1> ?xw\ hѰZ$;y9 .K!gNsub,C {&[V (jN#&~R/b*R,Kn4,,qK]p`WI-tb_ Hb"TelgWAiH u tI8$Wj$RȌf0N9Z0^U % r(e@n}2 ~3``kr9h{:FDҖqf=5!9: gM)ڛV(׬$l~nb.(no7g U"Ŕ56G fQ֌T,3oX=˖=z3j՟mxz-宧?z{gR6O}"sێŌz%eɬ](WݏaL@(qbQQ Oc}5[ \N#v;O!ٮ Lc~~ l:M庈 fVq)gfIEGt%dd=r >j3P" #)\(pv r_m條dJ_I;}tv/^jAg8Ld R#I) Sma.専:~:tM:+u:S)4 eCFf(BkA!f̈́5ҘP>= Р3O }p3ƎJ1xj Cf8>RLxŎ8}7G|~ *b7=\e4^ ,ヲT!JtP`B*1'gQw_wPY&`(06w <0OY)!:A-ǝ'3 H7"q>լD>,4u͝swwHU}7"-aF CS=l:2Jr% h;I7}~}ܙ\)H* * ‡T.:HX|d=]2-uHXư0ՃX44lr6s-%|R.jTISXQM=O{#p@HP柣H3ҫ=y@6n|ב(|++G\kIضi$uvCqqZy=h"qL%ׂS}\8aRt/ힼz@hqY/mQ@hE@.{n0$Gm9C\YnTDq%Z8[s2IwKynnݼ% -o&hT7nHgz6IALl| ;'o2B5QYI u9FLJoڝRN@/!sj*LuH>{6 ,(=}0]9+c'X _?7VôQHfYx~XʙqWY,ci-yp31rü8DQ$L8_?xE?մ5pP0rzp8TFϘgu^m:(O:+v䄘A3t6AqHb v3P 5ԥ0' 2-4%vGQ5ϢKQbqVW3R c@YQݓ7O}+`BJHK;lʅÕhyGFdPMq&>0ү[Ő}2 ~s:O_qwE ](5P6s9&B+ˆ Gz#}AFг;t(xjVlDB=;AqZpfbK1 ۼ1jx£cbt&2ZBɤ++쾻?'^|<ulFҜTeUFJ[BN?=8I7@~joCDc2P펜QԼ5dqOQ=kVA7 si//cɦefHBulns]AIpͦ弱_y^=P 95'!ȋs0ڎqĘ럴M+*yJ~7Ӡ#5@]BcuPAZCߙ±Әlў~EiGW3z99}!=OnpĪT!\8r+w/r.2,Y@؊ #5o )3`Xg,X`DAۡmP>+<ԖH!6ߍMJb!eJ 2Їh B *V>1_Ą`E0zY)jÉqoޗ1lXuK] 1u֫*TÑw: QY6Ƿ]_|M3~x$owhjuIe,d)\E,*džHW֭A7{*1Ovᑈ7[w׎`g,,rHU%D){`c2y-baMsv vrQ`@9癟e%/W❶ds$a N:s `t]IQ545gpbJXp='nFd܌g줍%G VǵJV?#/ }7$5 XW܂g٧>oughNn>F\nӲ~iEg#3+k{5 y\Φ f4;X0LpACٰ ɀd`n>nfy`q1sxk[㢬k/p2öWpİm[\mۤ7kU_("_Ƹ VD{]{wZ59L`4,))>K,eVTWu틴Ŭ0S4˜֊9:nD0לXݓҢ/ 9kL:\o%T<-oKĭD}Ӵ8jhfh^5iB܄+y}#ԜQm͸U4TAw"+A-6eI[./}DV Fjz ޠ(bHMû}N_ȇxn겎KRXD,y4 `Јl+UHcԷu+8m' :+95;U/ 8l͵X( D|g.zE/iͲ2U?0vf#2xZ DW޴s8T`/Ҷ]QP *Pc h*BnqDdUQ1C7^+D&x7LWȟVbL)(:pbsK%)WP퇬OΨ[>M-:ieqL](mJB-Y-l`FBlI_ZqNMdeFr]1nq3S8pK,ٻ QxJ :-SPʝ,X|a,dВŕoL֡ѽ /e Uu1؞?)͈. A,g薊.D3j2>"d[\B^ObjõyoF$ ?Vf~6! a@hTKj!?7Ӆ8]N59h8׊ĚJdQ>8{no, T_hR87֡[E@Wquz&R~pUο7}J}KLLJ&}uI[QN夌&檖{IPb d+Ppaitf3{6 &&*KNe.cL)V.G >'}Nz]q NG)-fj/Zu*(y oMb5T^╅3^4Wr\y!)幂f="38 ,*ev#ɮ_R4zPM9((-G7o\2Q %N QyHokA8X$ ^$q{ 5)r+Iةn9yOXdlQ*VҬ0}N>mG6 12"YaQ!siVE4{y&L*İ1+sDbV4viX B0UjVfe4ٚCJpWk.n7QK -L`E&࠵S 4nE9+Eϱu@g [ڈ])y̱g02Fe,%檻b:2ضB]lq}).r?~G+#=ةQ9KwɰL,2Cr!8W( &ŰAC UW~mXAt?xH729"wwT-|X1"Z64L/id)afYaJsE_8 Fe$ۗNe%fyLU5B9-{xSJ(LC~}!cDrmN4"~]/Ru FxVCՐb}#Jv9ӧ_#>\uKP]Kya&\qT܇zB z[Efxe)ǟ=ƒrPJw"wema4Fl]ɕ(I]s\Зꮰ݁3ԹTIY iʻЬtߏP+'w/8 H) 4ΩK(lm5Б9qaJa˩R8./qpo[G,hM;A!LZ6Q@G((YGbltzdY%nf<#a `$DTV>jAXq^=B4Vd VLL.t݌Ύ(8߷qL@NkXcs"J ۗ1~?f4n,;7A"cW Z ܂.[Bj&M_wC7$ֽw:{1$g&s.vnM+꛳P#+Y!+շ.=>+r3FSX?&@E SPH^qZo8{IXB:얖F庭<%; ,Rʮ2TYEkxy狅2)Oc%LNˤ9Vpl )}MmX`X~N0ĜVEYVz|ѰhyS_X2!6͜:sOˉO@4&OYC(cT$n~w^#y((~҉ Tہ9Pd2^Xs- K)G#MBKc*$lru]R5}qFHfL5 %uv C ӾZ%W̤ۏ?AvJ[HO`o4##B ~aKoVR KdF޲ut+ً~7@j$(5Ip3rӍ5m/jӯrO<"=YlfGxe0o1>]0Y?2'1G3fS̜[t;W/8Tt;ѧ7Y4yQ|y٦IJ6uhΪ(t0[J- *n_D2s?ulm\Oǵڰ5)C)}$ urT[Ե 0C1J瀁W iFkwq-{^_ڮkcv1+uPA8oTlM3$J&ʬJH-hI.&jsu=SZxhhYLB`h"s)*T4Hɻir5lD6zաx``NFЎ<]ʯD qnr6uDZ<CEDؖ?d@/5x a.p#l)yVJRݼ 6) ~W<.]zDuJt2{AC~~gt8}r\1^]暧x3Z,Mx Wh?UdŬr+#ydGVV6GX2GVGVPpx(`<1_wOMؙC8sDr\he+̋IfmZkq֧c b?t-7XT}ay)38,2]ђ g&aǣE*85[a" PLg1L~EŅˉ1@O׽GN RhѹܭՆ?tjW`r?i Jgt88cj'$NfLڂ{֥wNxPYuC8@55/<zmltu| Rжc+_Ƥܤ@.8)ơϬ8A!Rl3f/j?2qN**:SxGzk 5/"au) 5zAN]Kƅ9Ztoh_&$R%guiOl]FDb(:|hQF\ii}JO(1^wq9N:B3(=XweRDRpI8g?ee7j?#U{qh&8!V9;J4C 8N|:^&E5&e]V/ IZ +P,e7ߤ`FH 1 @ R_z$Ko3YNKU[/vO6)S&ѢޘMs+wr3psf<\A6D!D"C``dAS@v7fe5]^yi؜uUiFKm*+/%)2¿}=n@ #T10V%:yW"r+Ť7χXe=;,CsF ▊؁)kmxL]L+BOR^64@Ԅ'I/Πl2ܞHz&m%)f2H!`oIe RTy,t-mU A~P;CC(w{CKUC՚A=Mw;-O29{|7Bq Y4+ylMwsϦ(w*CС+K}iL\W$"xKqfCÑRXuYl6l$1[h\9I$zl?fw r[] C>#yd!*9JцQD`8%ZmĞXJ^5fδX||W};JZR\IRe|ԲW_"BaC>(S. Q zD0pĊ^6 9 b^⨬:AjQѦ5l Z18!140J7 G H'ϬǒZdJx*o!:Я<ADXdp@v!d I䁼!oU' đ-FQwͧSztza=weG,9|Z.q9%Nǁa#/&1`Ĥf_KZwnRxf"AAIO\zCҊ!CCס!w(;Tهb.~1?qna)27F(k${٪װ1p.3׬^5V0HHVLo֋+ bO\Z^' Y0G}ٸp6m'&/jh%~2zv3%"3>|CF;W&fGbNfECbS9gG'˾HFjYkubX?c{q߷yl}j8@)yʴܧ}aI8匘M3(ڧvmܙvqd+IhyX-`[Jo^ EXڄI>[H?IzR2I8h( #Fg'X)4d" G5o*cb 64WN9e#O lf}EyIʥ-um>oFSbrsB~^? Fbb ;}gEozw3f07 XQ.hbCeigi7 xV7DU0D=yAvAG:=g2bi$͕ ?M;_>dcOe|;$;DQ}߰r7a>&?20moN?Ew;C!Q!dƤrw;'NprDӍT-!N] @$Hvbkc`> <.9oCok7 baO`7 1{GjɦQo:j߶`ۊ`OEh7րqg;ot]*SIg_ngi/#}>xmѥ#lza&^FuCɱ1\T5`G+UŃ)Bz~?Ԉ"t*l1*q{:Isĝ9mΛ{҃)gup96{\L>EH$6"03N" #*_lΟ~c5)KK]]vF_S #KEkr\E -wk!=E Å!6pWͮ;=r2a6lg7|8ϓAzRV樐ʦ4zQ#N|!d,&48*tzSgǾFqj]p{qԮ0 f"z; \t%z]XNKWst44WpWl+{`dUr ,,]GicˤFېoy-\_`ʉvQ# ;+i/7CCPR?Qq"T=%AXӼMysXt%a\wd l]wi ;DFq\F3jz2oىJUl`+K8OȎo}Rr<ѫYlG`ҭ~>*5d=Y tHٶ^gY!OZzA6OKm5Kёj:5CN|l+z`C֤Ը8l9j3 ~Tq#UT>Q{깧0"ӴvV&D}CySA@TFyjb%=uDJ+)D5]_?mVӴL]5dZSvѵB r*/86EޱKyby@c?lL -+zupP@8VzI93#r"(ҊPL\{v#u%QS(uEE]^!TF_H}܉zΌ9!6ċT-K[vqvgV %`VߺZVǍL%0^8t'\)eyITL&X aՀ>~Kjㇱ/ .jmia[ -{*u:e^ p^VW5|sXLd>H[b["ĭ˰]*h'@hD>cXZӴ V @1J.j`P>/|Trlܘ'Cg |`oy"ZYWdU<-YҖu箨Ft?k+7lCm+1w0I!f;QFt¯]f(PVmoqw &b^Zy4dB&i?9B9{ޜw 3=oXf+"CHJLq\9˲_ó3.GF4wߙK^W:g$ږVG0#? $Y/_Ci&4m@`TAslb*z1bq1; # {*[]+2Er93CKϫ S)pvVn`D׿>AvEqJ&07PZd]5\jUwCgdSl7JXdPJU/+]`X}P~EE8p 3c5J/xVa!=z*HX8v]Yb^==N'01]q9W2^J~4w;h*I=8}4uxoԥ FĐ y_pM`{d7 !K bfcKy*,BA-lf!WFu8X(CWdW7096)mGbh030: vFYy XyAD 'YGE`I#hIzKZ#ɆYe{$dXo(Rr5ǵSSDr\dV2TL,RREOǎH\oMVħJ5޴cHE3/d"_ą1u-&%Px+5K)uݷNX5)2@"opIN=35!84˹ x)(dE-q!3EhdΘKWmK#^I\WV~E͜ThÊ.̩_'",\d"d8贩9yv b`t[_C;Qi \Zjn\ +*A5_[rz,"vSNYv Xrߚ-RzB9[D OMM%"׍Ւj.!jfNѨ ZaCKu iYR!דFHp 1Ϟi͝zaU3&S Yc#!Q; 2$ '"z:I_ϯU2.(/`x>Hȣ5y4pK6O*0N@#H:S(Dj<}Q5){{~ԡ )-U2/MZ0|U.QRiV:d}6כ' >5֭l%勒4f @qYҲw&쑣l8(tY;|JctN4P&S%aHNo\-sZ#O:ؒ t^#QBV=qowV[s,WqoJp2t*fD 4 ľ .%t fSn5JR"xH |yNoNı'k2@ɟÊg{]" }{yx7&F۴zZӠvBttɫ_,18OGԷϷ*ho:GVڿl3MI4뱿~_\Zo*o}|!s О "I9>R@CK$ :OB&<`"<;`j ]t&Ip(_:r5e&~_ WF1eK7lwu%f/Qjv'$ZdA<~6-d4vtgv”9W;u+DI)~w`>4ċ{agS#!T,0`ĤᄇItzpaCR'w۷?_в;mk}wόq?m23KaNl~_k;jEtHoϕyL범mܫȡ xҎýbʲSX!o:s"=*/lCa=NW&~L5MK34M"R.VNJ:;& 8,蹪s!I9v֪ ,&8a{X+sG?0%rR SL*WEQ^IGL羟FԤPB]跌1 рvκf|N%nӘvVܐ,].B0|}bNO^TAk#i >%*cTFGp^ ixUa?&p,3&|C(ݓ=]9M|@)vl1#k}wkyb+ JFep*T@sI՗{ON'riPb_Mvt4#ӔKNQW/rnwR.>E U~R`G$+Zz0@a96e7Bw}Vg~֯A g)sF v(:8KIM>!WQ`Ԥ7x!B4r9 yoxi_["Ρ4:U#+nޱgр)F'mb*f98 Ia3'I9)zJD'8} λ̵h$90e_Ggɪ+xeoWZ\K3^p@UF4#xu|v dQ[ 8&L;F≈i0k>պHrs+W׉ʶ\1 h4* qA){({΢4g>&t2k31eA!p)%ǟnoLf(z#tWkW04_kiCz]Ӎ3~Ρ]%Hz 8rn{q`?:_O&%WO8P \s9*53ĊK2NOH4{B/~B=x RWI`J9ᤨ.<7\E' ?m+mb K'}YHn| NC5l#0~ٕ0#]bwu<|FXWԼN۬Y=\4*87Tjd3Vq>d]Ki}RYA|?>v}΅4Er垏N[ɝCɧFː-r mW0: }&q34p*Fqf gOg% qo:1IFV|wn5{e_vBre3S<<9\Zy;}OTG#LSE xqhvKe&ZFJ)nR7<3?|g-Au9 ~@(W}XitzШL)OvKcsQI>,b48`R<38nPqV6* Εy#d C|\_L*.MvY\CnSZ 3`],,SH@35=kj\\r75_ixL!?uɐ.Bp8~ps}cA[VdjWSgJ%\z}}۱%~7+NiWOLK ߴ}QvA7"TNm'&TpKW>Ltz>D|GV>󪑋 +w ֕]@u+6Saϭ T@i4̍*~P];@e`'Q!Ap3QXV**7N5 8[֑+b.=NՁVm?z'gNr^o@6#~0kK=T΍*{|mD?5 @.s8ܮ=jNIV{g*$PYaƄ@D3Ǖb(CzF@/?;F0QW+`7.׻kZ<uz +4zP#d, E^@":h3˫!-JN9 x@l/* q:(_BXэ\gqU`eQߐ(ZnV|YZ|K!)c)o5t3J\PY #UdnWg_$3fze04Ʒq #TuW6T Zs ;'K0B|^<ƙX k91 +Pz:i=Xhq\ߌ;_qrSՠfIA)HJQJ"ҁ?Hùϲ:tjE(Td"FeIZYzQʟqWQ"_C3=8N1F1Kxw]=y5Jk6(z!7}u!W'T9'aW u]h)jk cW3N?8NdJMԛRS1F`Mz 1gZ.5B:s;ӬJVoJ<1p:+Z=Ң|`: \B8V+Wz;rOԨ "#e3]AbZu*aWS• +pO -ŎVfê+FPk+gkXU :~*zP#D8j I}NrfKV莾3#̴1i9) 0,,+GD 'Q(5{+h 58ic삿vqbekQZBR jR ˢj))y'y1})"I7i+BR VdS;#G}iftiW$ d/`hF-VP[FTQr+ ʧf䒉P:c^V:8_kJifce@b0{ߌlЙxE|uj,JuCqpJrVgV0Ix%yaUdB=gCr UE8*hL G%n1R%8v[ \l;':Xaaan*AVd !"S]T-:,EFȮ1bX2Qr^g*B#)v~\vC^̍*{P|GhVdفUB3{aC E=.혷o;zHs((1zK'n'w# 0_R1,l+ @t x_S>w⊆v{:([ ӈ< Q\;܀9>J (9Da4нMb $=Ck ?΀ZqqUnz1&b8dڧў̀29eJy ". &dOt'bkHN֐hNO&O%L?(}⟊&J!B0}=Н"l+qN LD '15%&3j{P f}Fl avAQ;p]ɄsO;j2!?KBv~H?ԐHNtO4'''F*)MdCP+>4ik\ڜ*j²C[֕0sf}br\"c>u',,ZpW2(yŮ6g_ZAan.59BFٖ61h_[56ƾ+ D%:Ê 6dWP-3Ii0R)3qc}ΎՂ+b%NPV/&%!_^cXqmQT!΂:lpn'@id(};Mпw6lV li5Xd0~=̷ 7_6]I1ЄhEA[?M\}wAqoŻi7bg6 D#`b\gasEPoSbT@MDlb[ F .o>WHܗx}əLH)X=P*y3cxHH#v8F3+N7`b9 HaR y9f!|r-Iw4|( &pJ\c9+QK$6=߼=%wҸ>Hy,}xh ''P0CK:I;?u`P ,,7 491v/oGYo)gj<#8%Mzt3r1N4Њ X>V>m''DKoui~HYoH݃&f =[X=_N iΰE*AM)jmc'W(pyB뵫"7τg_lhrpT+oio(j}E|P949 vćxNPV_·S<bOÑ3'8h$ zfȓ{/ Ɩb2> PQA묲Թ׸RA]ti tpgA&r).8aX?r(Ә33d")jěK2_ޭTkfd^]I)ٴbBk i̊ڤI@H=5@JM`x֖٬Pփ5iC9(Tpe*+_+ i#zr՚92K}(ɝ9r\],%B&:?a),D9"5f_٦a$py/I hݨ6峉Q^ZfEOy2ռAk$niaӲ?Õp;zmi8nU$[Vׄt"xY(NqOÛx&(!+q/P:}BQ3B ];F@8Kw_N:1?l7/6 (!f?P9 l k j@ 7hjSC #*ef RĚ@FT=*y*VH/OT''H '>H642 ˆCR.4JM/knHbw\$o.2&Opti'/۳Q#̿[l.rG ^C&f#%Y_ˈP Jկ IX3*?3h_y-q[E`~Y{Ě(RxPDQas<$?9jq83-Ck1s[OWD |6,LK51:¥yX~ cr7'o.Q8C;]BațOaX:}EH~;MDC02e|ߗꢿ1s5oVKR 2M!IX>HL!FFj0N̳#%Ŀd :S=̕$n!#}jWj}-:©(/{(PɇSQM_^`5jzZӗ[[k-:aZw'tFuvUwg;9!0$$)="V~vKS8;!QHt;}mm5;ҥ%wXVG|/ߣ4+_#ŘJA%EL]GOhCmX[N I3$cc( Bqu}:\C[ĩV.FIA&|Rn$`IH~:!40FJiSrEe!F8%!mjg 244,Tu 뎁ϥ[-ER6YC§m3Q"wmC^Qc%"thnMI 9*V q+( [F$nVk8-$ ;38[Üfr> fo/3OMr@Y,91oSԨU В(zV= *4z:1x)#k:%*A8 &LVUJ &=LpX÷:c XyN.)eR)ȷФge3xGW Y BCMeje-㭔N "/m6nf 7F鋹}RY4nd=ѸOn)( -'DxDm(~V::Yz},aF`!ɓ%6 Tʦ=$h_ӽޱBzB h;K7W־{7-N.gTmkVf$ǔd>)I&KjhcP%ThVf^57B2ݣ,Vg ++Pd촚&&+! EM 9/eГ=M'љ3X1e"-u:/l8D`eٵ,CRK]=o;Qx4<]NJ ^A*RwzE:' -϶}yPY#oO72}S㰽ێ<\`|zɦšKXGq\j+ft'YMLf?ׇ+ Z!v{ -~w;(&l EqF*pl侐_++縪xG1M CR7?DJE#AkfB/Mҹ ab e"ޢ/*,K҇-`o%KL-~q/Ele˯#uԡ)q~ izԙH]Krk #YFIr hq Z >REpN%t$;o-&2݇K9H\irXc Zyo} ],1K2,V$k1g&]CfJE4A3v(tvP "waeX@1km 49 NpQz 矙f+uu}lCBH WoE~ k7|Yդῐ>ZC=_~X* G TEGQI6v, V6?[U;U܍a#*vY|O 1XDڀD`#Ǖ&}pPN|G q306VƉթpr͐ &SM( 0nj17YIp[DQ-B L4mygm& Xm)bfZl(sѫY4LbNF9i[Xӄ)=[b8d20("oUa>x7=(VpV*.aZ I`1|SY9 YTYg1KO; ;BIFq='6.z$1%wE TQBHoQ 5|PZV&@c 1{6ViȌ<=``Eܸų ,K֎u0?* +QtJ7PܢSUAT)[TLc04(-}So+l_^^#sf8؅1W|f` Dti`b!=8 c.O)a0ibx19j`Ѕl^=R9h_ #BDF3zokJ!(v7.r(4Fq8P1\6 )g_`I冂P= D鿐'WV4gLԏsd4KyB udӌNg.ȧ.MCNs vY.FÚ0!nwVf)ZTo03:ê$݂*W? ʞUM"s~,Ccl肗v@cYaFk%/lv^|^5OZ#D epY Ȫ=m.LBMutFmAnE)m8 00r9eG롇@d|M1-q(0Viܜx[֮?:4OGa*v,F{4(tJL~ Qw$ !@bz7> G=V(=cSyW[i[&f/>%$i[Cx,7%pW᠖Ƥz.!X b/oqb\t Yc,d?V(&o_Xa(&4J[ܺ"'Ly{R42wĪf'&BùvהZ 'VFK84.n:qylxUQ|V$ۥfdٌVv e,pǕXU6?@ҍE[4 mac6vbz0r@h3 LFr^~@ў|xO<}˕Kc~#8uj@'`1q!`;%5jtR@q2qxObR"h XiVM_J=s(`MU$pBFlTkaB&*DȤPS dbp+ xF*|0N`iՃ³kJ tY(7uqN ЬYCaamg;5bI\'w6+JEPI4FaE=P%o,1uj+6xCD I݀_IƥPSFH9@㭣 k΁v b=i<=?MB2c]}zoYɦzKd~{r=N3s\F Ϗ-:aqon7N=]i]z$d#_wͻ$O%I JmƬ:Vr +m+)7M͍[tyĪ`E/,Yd% Ϝ*DnO˪R8|-OT) +߰xwRmf»Vp]7Ѥ7&#GA=EaPWNO&m_AsB9˷^,Dw3CO"g;-=D%cn?PhȱtbAٜ"9cyJ|yنa{`lG3oFII 3&<:痱~!\h--DzpXWtw8FPf[]'6qW: 7M6^[I&heӂA}0gC~f qu{-[0+nkwnj{:6δ=f3{wI{Kf,=Lso"pߖ9q@\]r?vkw\ohyÂC>~%~9iR|z:#ͷ[:==I<&t3Ggn8dYypvkoGֹM N˻KO+͒Mv@I62TSA&-ӎ.-,"&sMX٪×C2mmFީ5#"/@J֪iʈ8Zf6L-`D 0:N.Ti=vRiChKuwV,YIe/)%0aCSv  unW2zp˯Yq 6We18l}z%^uiA̚wr/ݳ33%Oe:ݙ柗/3FW=dTQ wn w Чb{Ny9dTŕ|Tw C&7KGㇽcncp \;nXqȌ{3g0efϺ$2.[c'AAr7 s"GqYʬBYԽΆ~r,H]])-)V] gTɱ"g7Ƃ\}]e%@k7[̧Ckl\y{P&$FjClS-\f.g=OYHiP>O##m8jkbɗU%XXX9ojILDM삫ض  !XI1 18?!+OJeMw؅ϓb8<lԛ4+=`<*&YB~Laig=0e,Ii .pb|/rUCh?tou!W= av< DqjA|zcTxx\~ wڬm_M2)ce<~q议f]Jh m?ӟ$ %# =3LKf3q0ioK2V^l!W(z@\[+*o\S|ћU4gqKP:HnAü9g֯6!.۶ ~C}Z0ot 6ja}Ιn%yf`FlD7B/@& >#R|,jsnclH'] hrEΕmYƫ]Ukސ)zk3Z%`/r _=0/IG4ЏVE&l_[WiFc$(%aS+yI"˼&gH8/ tYq"cQC)g;EjȲN'-ޫDPZ3f0ҫ)f*ҹxw"ܺD0b8t'2 1jSʽLaqB=㺖/3*e=Q%=pj4ڭ%7 2?9*o⮦Wip.аqM@E%iח N5W8Y2`c4\ȧ sфR2wBYRS +h 9 K`OZ%\>toM % ӧ%2Ħ4UUR9JDm Rjmx.kXZyH+ROp2=ed9l1Xf75z#"U rd,gbNڥq޲EnE]$D,`ݐXFa8r .LxYы+אu pg# enu4)5b,4Av oL w׬΃^@gD-msO/9ٹn-Ҹ`Awi.x\y6{%|'V4$H'D 70sb6{e[(_Ka;7|t=/VrkS8[[1e͝/\6ڢq)z/c$'c=8= /=>Q[X#&^@'aޡ!ɨ ?"V X('N縨_0oyswL#kȃ+5 El/ : Wt>yIPn(plP5^>6<,5^p[Y=H]{DI3@&~"YeI|z҅JT0IJM(d(MS@59:=ƻ =Dh);a!A.+Yq(Fa,|Yɻx-EGUz&vshYW[# .Q2U r002> 2X~6&9RrkUQЍCvsq0ӠDS03U)z$fuYKN[nmku73o5Ģ8@R0zwP&i+FjG~; BXm1i$km$k1cj]Y9֭Jl ̄ fIF @Ϟ{UZ)JZſ _Zه?{a_: MoOej{? ]!%{ZeuBmmWV&=v5띐kl,Xanm4icD'4jcKSIwhx K}/I74>ެDi,dijwOR򴎲կZB\vPb~"_n8V C{k~BQDS]c#*kBKW!Vp\ht+>kxmg Œ)~$Vuz`Bتj8^kV8[^ `wW ߭/ I9m}nS:nzBȓ$Ɣ9fYTH+-,wʠLںEYz3 3G%˜3OHy~'"ێ7>:o7[9wÃMDe`m-7K`q he9 3ZSHtvUru?En?S~%"R;!}gSgIk[pBJ0%*fěuTRa{xҳtр2)P"fX{2v2P5P{Z[ ]}x O#-; !u;<{{HHkZ=s ~ 6$E(.ɲm=c󓬢"YdS67kƐ ' )I?9{xu MkS)Hu(*O:oCP"[u5dQSuYV׵.57`RƏF%zw.Mv౏KWȹ:Wi譔-;pAlNt2`h0NC(Ӹ+\Mt |hIxܶ Ehg <*9A3u gkVmwZM#A)de"iX9SdJ:YQ@]}>U!}SU%K-C[~f-%;4df:CaٍtvK|kW cwم[_aYDJCO4m3Mُ[ WV%ZꗯFwoݭM$'S 5|48Uzs+@-ϕWVdI&vÑBOP ''a'';z!tGIBw0ΪkXo"eյjeaj6'y@5[9ѣ?Zb:s9wT鞁8{mkzӠcy5)"ݏsŻ!G =; S'BJ[.B~9LژJazI&ڱ ي3bfW\Oq*jA )oeϗ~T 7hsVgWK=9);^8o!%.q!CkW_E>类#@3BLJI\1~l)hz -‡{^?Oɟ=H"LYE9b@G/8 &#;4dڄe@ MwKmo#jD(X@2Su4yv`s=4tIdH/T d6|KJtfҵ<8K(*' 5JRtIcJlƊ[56J"Ř27 =T(T&*QMO2uĝ@e*1$Z<- %r\LR;d0ܒNd pI9{d=9l_F xRcfUYߪ3Ψ4 D*c&CRrfdL6qxgS}bf>BOXDL;6JJiFJg*(DlJdrW)<<4J0uN4f:D Wa$IK-s|036b]`g*'(AG.c.<1Ef:{US#OV(*"6g h*'G;{U&l=bjoDDDDbo=h|O4_&j$́uwn}6M޾o'7Itw1x}m1GS6 ,W*o<á)>(_ݢgwLcm_Vaܸ'^e{?97Hscٷ~c(oJtL,CvR*C`7-dsC&4vꨪw s9E.AӌI4?.ۧ8IxK@YzUAs\ys7yޞA$ U&QlŏF"8#xVI+glWU8[9e#u97r t-a݂|8b 2"ifU, kvvpkŊ !l|,m9[5[zd4CFT6[AN/iLJ;ELCQβA -_M]KH >y=E$@/Qtuc (M>pAQdC"ӼȒ)A.KE;d/0= 螥o&.b"z#Sޕ絥&͡<>?8TDe< AvϾʹ\_uv uv̼Id& I"Ub3_KPz*2 3]M[|V4 ՜s5!*d^U@hxTA|r&Dƈ\Pj[JFڰMXb& h}?ưO x8 I+Ծ$)#:3 Ǩ_@~W_'D.'$GNjCMl-Tt]aRV'hў0[@7,>A>>% !r&FVEO'M B[aS.DhFXfz HKFCCXv@gXo4( ӿLDn1c.v#A,@ ? 4 I@GWML{oFZ';PF6%2!;/h`)%*EHSR4aHH,Fu"Bw F>r}F " 7(#= Q9cp_>o.Zoǻ&<4@4Y~JqL$Ar9?D9x I9 )t fЎI<҆ي#N݈ !\|>PDdA@h VT=z-u~{ؖPB~[i'ݜd c/^41X Ф1qaOKn5l!G-vEX020ku 9{˻|踟AbLyw*DЁ{H#H4!V`v1 0]Ç9;*,Crrn lkҊ++`avpe 7pĊ%VL4!ˆXDAz+i`8HsXEpMH4]"RtLŊPDϡFv[^ =#o/*3(lsiDxb@#N"r<2 +ޚn;FthpSx^M/-8wǙUe+٧4g=fўp/^gc@ u ^ÖΝ9M5FQF tzCRM'"`>9`8DMEvX,pO%*s,Y\uM [2Aְfmota<ݑG~y,C XD6dE/h!`2i 3Ƥ3Ni<ĉqÄ 2ڏo8k9,M:e.֣2˭5+_ٌ}bFhpV.ڷA(Snvԇmv[ԛe6"[LY+Dh @Ttւ,֣y]gE01Pղ`۽tBk<⻭*0̟{hU_1OM@9(Y^ݾԧ/TCJ#'5Ո*Y!/lIvL&{uHU]nT|?|z)?^'eݮL5$#+1C Lu~0=:=#%첌m/2IF1˹Urg[שp3g+:.Rv(8m{Y?>PHCGB߆!iIHzC t=/xfYD *䑯 ԕ++ѴpEf3$0m/P-kS⌞m+EA@>!\|{p$fOcLs9"1܍2:'E3'@T5j8[Kn33L#y7.igqdF CBY~jzMR.95")ox$><e^)iKX\Rsfҙu:5.']Rz4[[u,Q7FYnmm~[n_vvvtbtWܬ!r᎗,3^&sf"'}Z yJrtb_6il ^Z- }桪gT63 bR7Qւ[ϢƠ)sahV4(2nS!ͭm W{)r L}µS[bͶ96;)03䓷_/g,_s"AzQ/Qt)՛A9ou^Uahj:+P3PH@WQTe,۴äFh,+j{j66E8|"q٩aX )DtaHuW\^AN#^j}xD O+(aEw'CbHN,ݎZY89CA5Eϩ%u2낄1t僩r_hzjk(*{Óğ p 0+b:1n ',.Z~fp?)nLEDEQ9c ysC2#}䂧?U%C $fo.IGy=<+t E`rLL~AlA(L绸@71Kq7[)q Р-\|Yu>JG<ph/6Slsʤ8`z.(u=(׌Yvt4*7q:;66q83D+Tz !"4 25&tdJ/;v-2=<9-O?ʽ`Wx 7F23PCP@D#m͐Q- B#p>OmzH|azXD DI7~ˬ7*r(-Dfe$n| vKɒV]za_O9բRś]sbYn _&,Ŗ˃"܆i/0mw*+b,V,pD] I3KƂ.  *3D@3e>0H3>Z4̬{޻Ws)@\u7lٱ%6ߠPٌ 'IG&H4I}%}[}um#oA}I#u֌tƳ!,AEZ2ʐwA+dB$S^$HJKK`hdn|!! @@ $I&کJv&TZtT |iiR% ucNq-\A)&1#}jgjD|;l!L6 )QA}ck>qzhzppۗ eM-c/2,OJ: Z!fǮXռ`'Pl N¶տ6U} ^ ۮJ%$4"-Y\•Ig'8 LK'|{?šs<.?a"-Ie)" |׆ BVgqR*+j!y&.AQ9{=l!þa{LrQQQ,>H|ż#;* k%w g(B}  jf'D%O$;籶B`"(A8z=CnCjy oU-.0u!@эuDBƇ//Ӈ&DC;i^*>ۊE^ Dϸr0ͽ,&ԃ@xKd+bLdKAB m!-~1pӽP[JNFZ/x{mH}`EvE'Br\bM c˦dxU }-Ŝ M}M&Tk LF[/NvQ*a}64aj:Cn\ uhK7N e6tfIU kj?Vub0BHϊi(DW0:G7iKTf“BZY65i`7A姄Ą#Db?x 094$9mESp@Bpl="p[QC%\j&;~+R!q\6 1=^Fq B}+ZF́~=&s`|f'y茦櫥 sSF0$ %Io[UC&8/G[[yZat؜|rPDt3/( ]pPI7WwIYm\i1 1Np%C$+;.YTНռXmY6mOm1yAHIЭ)H^ IeRU͔l*KZJ0cyLYc,8^*Y] y/R7 vf;fr+ w+?࿰pcThj&$I%*,жaD=i06 < T:_б6RjEݫJAU w与wjH2qQK20=l Th$r̺D.ZaXFJJnXp0&'] DB)zU+WEȑwA &IG[A =Bi8z:mIie7 ="hJIq.&/PrТxP.rYF!Pŝ$j*O[D•A_:sbCgM|m mE&a.E DaBEo N p hB ەgV Ow02I!F8U`x=y䉼(" ۬l!!4MEL0[!nm``hu(zDK+~:`udoϨ#P$@QGc] v+bNI VnOK~WM N1"-@7h N _"ckixc"\Ԑ^ Wpz{ I :feW[EG (tg n؍'LOjp@fbE %]}LnQ@103&܀ȹp"aŁhHtt|Xzt+DB霪J8>;.U$aI}8sQJ_=FLr7zaḢ{b3UF 8s+,M`'.qC;D]ڬօi+wddܸa^D~N8KbM VOUw[Hnp`:74w#&l[D4DSƽq[!K{0L!\OBԳpQ,/ֈk萍R-w$k#&DwzvLpGK><GUK䕦8]_= mO7>nمǖmMAMwSILUyBu>c@ܟ_U0bbt:}KsAhI WSI:Ш=dʈ۞v@3LY&yL ,ᄋ;f>c&[/Y ksuNW`lgC716@횤gIb@ܨ7)$UOJ]f/.r(TrF~AbD(g;虿s4BzN5Gx@113\Չ(1%rU=bݡ]Xê%2S#ۣ[WU=fWC2x ЙR/C;?/daJvj5!;({RJ%I nYB0f!r?'!,[l7(] s$%G,*R#Mqhc KbߤܮLwx8%Nz~=+rVsT!%\ot>y.%n:Q;,QtdԈ([\uAC?o{pqtCDd( #:BpCFǦJg|(0ßI.qۏ&>'CdjBaslT(nM]`Ӗn}ϾWyŇ?.+赐L3eT;q m9d '#:e: -1f b:~  -G(L]1-^Yw [Vɛ_@ᐿK#Mrꔪ:|8O U E-lI/$tˏ6(LS`m5lNC@▀ ,V1.ԳT_|eRNlؼǀSg(;zª֧ΩK"hx{j 2ĕhH%6@hCdԨ?5Qx=AGX>1p+C O89HsD 'ΨWWYA'z`:Q G0ԧ$/lzcN4ӑ4L3_a`=GL"Uwd})Q*T)%+yB/5nu^MY%Y}R20T9%W:0o -sWC/uqԨH`q9( 8I.93[/T~)IADڒG"m(ђ\ۺ,w+Q()!~.Jvarui{=j ?瀜(o <^%~߫%~t <.܉w< w;'ҩ? i5E:&ȓSʼnA%ktVX*"%uL1AhtP9IUSXף`S6K%N^ZuSpno:yiC#&RTiFqY8RN7O  jFռYW"70􊳬YuΆt_8=@p911{N&O?1 䊸Xmovh:]a@ĉ=Xe6cug?뉀G.V=Z0"]D:uՔc]ư'x7cyTÕЊ'MF|I<}M[[Ơof`AEd*8TA/gJp\x/݈ P]B$rEnW#v_]%GԺNό)LkS9X&G!"lj/mu3"*=]z[\^5YdxH=l@PBK8Sk=v氀Dw3#ʍĉ87o=FxQڅ@KY!R$3YhCCzTtBuAF@+hO+Ta# R[G h W'Q-X *8VW1$NI"&ø(9~itS꣪IG'';}" T0YII'"+(N)8&_[%b!XԛB|T0@VUF%~+e$XYzЧ;?5JVy |J#USCTu`ENUu{icyХbmڗe; aP]yrLEZ9q]2 ӄa 6x*i xpĴ3z_Ezl .uj8#sph@fc@8@\Yg5Ӝ7.Y\HVЯw93NzӺL0Y%]rEuu- MO aEɕJtTWߢa"2 H@3Pÿ5{)]ZZM%|SW>T~bmɡٛ.bԵFSŲE'S|5dDvlcQvJ\<0+~)!fq6 Ӧ ';jƒl"ݻ5}Y:̺~#L?8(qô" c%9B%/fUY\綢)0];iBo0Y8:3%ٸt(e#> +[t%PQtD2"SVf(3+" 穯)4/MYAHc`{)VqH4<Dxd0n Xȍ@]$@elaL}\4g|&`cuyD/O WΑm E`Ju"`Tpb|,p`!ѕ^}`ڟtU0ȨF8XKw.ĪېHՄ0d07 ʺ;HRp q"(QE*iW20Cp!Kmwul ~EZaV C*]v2Ib Hq?'3ٴֆ nU?Iz`uU6LmmO%pC!RfUmPg2񭼗Xc]ϛ)kz뭴--<=|j5[쭟YWym,Vp|R_Ƣ+.3핚edI{/džM,`6߸eqnzƒb-i :j aނ4MPB!:z:Mѳo$>1-!}~떪.)a=xԾ@'O~q=罶?ϭs@RR81/iҪw&5J#]ܤ .K[7/RaX9t@o{vc[rKI滷܌$d.LEo*2E \C^Fhmh'v>%]-> |/ͧf{zյ]6p={1{Zm^.;ɀoQ5dS|Pni59]Un[@~{{d{su7E#w[v}yj.98yz$nm}4pаi6dZKYofkϘWRTK-nj[bX4[)/ZRٟJHnZ~:1?xz(0彣W|>c/?vWUas﯃ۚ/-5mUri4:kɽ|Y9Wݩ͖GGt;b Q]Ĕ}H{3RV1ckQz_K t;;Gc&||uMеad˞}_+k\$W.43#dODI#;`2 1 7囗 }*V8m:=i"rl,APڹl<巾zqleT[ .2nZN^i3Fkr}beX>K|he/Ƚn2L!7p=q pc97i$xG?%J 8U c!.bR:`ίAێISS29H֧H:<;v#8YR|wOlh2D9#[ f34`2fx:j4;ՒumNT5@l \i]Ǧ׆F!"\ 35&]C&$?G&n;*%\)JE=h(L RE?.ڈ.ztڋ[C_ A :N BzҧQImFhݠ߻罻9˻ۼene.m,ƖHY e2"dYUba x3g@(|>&|Qƭ6Yt.W4P)-iTpuj& oJ&Uʾ~ _(``MD~4FHfF|5Tl:]"7w1ruЬtNc͹FͤT*:BَFr(?VYIbI5| UWF٫k(6fKRU]bD.:ʮpT#r3*U7w-PE)>wFiM=tƖ)ZkY)_&ĵ}TɊJd"ⵊ%{ꨮ^,̈sҀfGbՌrwX(K'5ЀOZ˚tVN1&e8 ;;zW-MKdPOop79b$D pPtmOP1X6r tRbݖC XxׅmBPeFT%]1&4e, ))I5!DzڞC:IUvm4QvR :(RRVRIahS= ]Hy YQEW9vEfo <Ɖ]89%zPՓظʖh:]YMEB'skOq34Kx(q{'asΣ MOovIU4ITR7A3-.}c&Wh(g #yy,-V8y@4)Wil"L XMvL<\inwIz/z7BrSLs۶U1ul9{+pE'"<>.j K Z_۝d 0${G`K2lKJ_zIӀ΃Yp5[X蚖6I>6;'EWrԇPH=nz&RfɻP$b֓X>*QKAa9s3u%20G͌CHX@DBq -OgyDqO?3i)BFp:Hԑ92Δ6oEL$[XEK̃<׊$̰Hr*:ѥ@iT2^ &cE7EqզX[3!.m,+=r;'<)ۈTw4>d`#C: #R#[Hd5Brΐ4c*T\6z9p: ' 1(\p=mӡvC!qc |c/͕k(vw9Rsw' a'؇ݯ4(C (K>#wpzl̄E;?b~PAnhK&Ǐ֞_b?'uqA1~ `{</}JJ5IE ?nO}Ib_'s7aeT(nGZ}g|3R5J6R"s"pAR6R*-0 Nt 'Ǝ/Y:GC2@ZTHtA`3?$R$|_J8-2>ؼFPbZZ_}dŸu^}4^,}59 vϣTӮ1qBz6ⳋ_uQiM>܅2_ۊj@pUy;1x{ kZ 8[n=..=#Ar@t@ĝ]~.ӿAu7s+V9kJbg~;cLe{©_*ɔTlENgGDEzF+<X̠YN DpiX 5QρCS>fYi #SQg?Y59i08}q{^E+Њyг+8f4&=#m ^w=ͼocdy- ^5WUֵ@ʶ'Nh^;vCA;6^kQ3# (5 U:AȩLB 7H=I=<&/ZYwbC/,#UpFWl %@:[ԲYxR'OaTƙ2iv~CCfaĶD$J&c!U m4vD9mBjDZNӞ4$Ie0Sy x8MTS@l,5wϣWX   t_wkyv:r.Lszt:OS!r3dO2K6%O\CU&&R͓tZFA~`3/_rYr%sZ Wde$tn')Njo&حc#)än0<+GOpdSb'7u\YA Cs݁uq SCJ*x^q]y^f1wA÷TqTm:P1 O'6xx0xn?K;.IlD9|p 7 DMhJ}pv<ּ4Ԫ@ Ktlz!\:!#\e7Hחɖ@VrmWW,vX0tKE3 -+P=`t-iu ,YuL:_e^l [( 23OT_.m[z#/X3Qq6|<(t#̕p^CxnR)T &K2>:AZrz[%\̈́K&Z%2Y[\1blA|*QhlPbόa{OJ?(G6F Gi% խ`5gw`%K^T/r0<t&K ͸F s Og~9fC[$-xF`̗bjL+jyuG #~!9y`CzAsW^zX2NU*]ؾ=K-x!(_|%l6%7U]~eע ߇8 z*<y 5  ݸ!}@g OUzeR틘0a m@yÛoIl;Xs֔EBg'l2&BXȷ j6o&%JDjJA&osk!~pu i5Z+vV`RI")8& xiBJe( wYFʃ9,<A.L@ߟ- ktKz/Z1IiN 9`|ǯR94Rr㧏cGB:n$U[{1dC ˒kv';H[3pB/(W'*[3qW-XsvdzI[M5|UvQʃV=jc(zD*fPﰡk~EnI l<7+RU\+4m'kHWBǐve@p<ɵ_~w0V/WwZzh|OĜo6-.LyaL͗ca-Jpg3|Kw3#gHHfOY:O:n@SX胵E6 n ݪ.p`8A8^V~^ϟ Ȏ_*R!/X TݓV5`˖z]đZxp,Q&\y8\Hq:E5n BEܽ!R.&FcQ.#ִE 6Sfټ?Z>paɱr8d0kaoOT֮6cUࢄQאI w6N-a?1TH|z$l̥k'UdB+6Tjol깻ea@5Ѳdk04bm+p{\O#ӮϚ2;{67b}gʺX$S)}YYƂgEHGgJ[BHG.@1`"ȏgvwS腻,eVk S)^w.ĆNضbe_ػK]Jkϱs(_.ᱮv}DC(6h$Jjv#@C{IT`쌦Ѱ)4##>0HG @| )@%:xlkYف|J(WQ^޻Š[mU[@j̉ġ6~9}RX{m37? PNaӍ6#^&rg]w1f_Mzz8Dh˺ХP-1p{&KcU\h}9>awU3vЉ9\S^ّj.'FkP>eN`ZQd)7z x#6iU񃁇FaYGi]&]!TZFͪLhfhϤŴ+ A/ α-P(v+rgӚ+ fZؕq( kv& B5ebYz[V%.Lf4;%.(Gϼ696oښH]V$"|<^1:K[&R{P!`:'+30ke]ifwa:Kp^w]re`(w>IhY+xS/K\u j; _\ǟmy)Oߜd$0gN)8|(cYPE۟ώ:.mڿebl۵#xN>Y?zWk@pnC'r)"(wk 0F,mGV2Dhz~ ,{!F4Gc, 'm:6`ohpςܳ8'Ȝi>ZhiFo+upcE=[?-&aι S |2]A[)!|i9G~Wg2 s1mmiLQx#ut.VWN1^Y8~H PDfOKGDTZ%2J2k ԥf.lqƈgM>zvBjqbl/<9wG2H\vLd4s]P$yćk[צz|RǓ[jh^g`<4a*In zU*·NfPSþwa +Y?<.K"x|\G}./TmK'M^j֧8:fH>mZس2iP"NES Od>% +f56GEr_IJ̰ Z-`?n$zBϻ[V l-Rn[Qe0 ]]The)x Xه풐tV@u3r!͂WCY4z%Bh 8$K.0µ韨0ˤfxM,@J@GaZ*#XCw;Ns?'`Y ZE<_&#T!kgDøOeKR̞&]J-2qPCn9|M/%vAsq0N (O0I-:LĜqľיNv)b~ՈN%2rG+3ʊrwiI$mMKScn{ӊryj#!)<_f Q[{2[V[оp'ف:\r]JKFC!l!2O\`O~.6(SR? ͟J~;00#()B#q؜,(YE-cqIRJPM^JW w3âdo->r|hbߥW->q_Z-}y[>o "4*e [ FJPCDɪi蟑!P]*Z^k›-J ^@:.Y‚-ިJA0,kƊcv穩zbwjr|t`=~nj[v7Rz2ҙm?,v݌rԓauhR_?PNjԮJ20<*֑ըaVlNu9uXhI<2P==tq-ں?hc(jEME]bK5+sI=j~[UE[4//)>:w&[0ƚ{WOV׬(cRCy&ǺQխ hi^ % |9`\(߈3i\a\neW] Xo0EumzIcC ~3lt2cRRct€~b-eؤ`MZ]slw:|H x/oX a]DS4wE\兂a >a奚HLK'c3mn,FjvcԺ5/<:\ j/zԂn眢mJWQ^Cae_!CPax/aj~Y癌(%*LJ+OB#9iAbjў QPoGuq8-y:(b/(h[EEu~o=8k. ZPv_WDRWeb/A33(e흘mP NF{T%`.}od\ܲ[DpPJ$9~Bm}d8 K['5H;^|{0s#vf =Xzln끲)ugc"4]'*SP`^v0gHfWy:ABkρkYwx3TP#U*Q]%ծMHKzmBۋ?F Hdff][˙wKd&$fnI67pBN D-R=B袷S QtУɒNr}42`TV ߽{g[nۙ+Y#\qj,+ELxֶAb"lA$B Osspg'/4`_;>`=0sButI4{Iᜈ߷<;+'?(J2AtG3sShN'J OC~%[.|b*<6xWڈ,lw(OUl.1E\#],+lxJM:rU8r%ݧ!c_Fce(^AZ qfrMZN%KkQ2L/T_FҢz(*YY4{9d*;i"5D?e#5:OI(xCM Z2;MԩV̋tTsyS6a RwNwOeBLy%OXԈŠ? ݙ)<ҜFtԶH:Lj$ !*W [kʧDa>zʌamb:K_a< u3S]ǹP7;@MD M( QnfjԋjdX۶ .KDK?`2uIP'xzbU9Hhmo-@z.fk7sxv1ЊN@ N|-Qˑ'0oY4|Ψzt:ɾy K7KsPRUh\)ig ^LtɠT]  9lF*<%uu6z!u]LCmz۩P$=Lt9 Bĸ1a`/`t70\V9l;=o~UwĀ LyBNCpMnL|~d"`*-tY om`?$ $ߤFDm34\w ۹.dž(ɺV#E*L(}J2sy|9ĚެcY_N`ו5g'qn-dyIz5r95>X }D@)9EG9 &}6I͗z։ }PE@,hv2.im̋COh,v "YHimKU#QIIӷWo7>frh]lU rǣm`mZ5\lП[:ǯD̐ \ |&խlQHLЇ_;na4qG#̩"\a"ۯ9t48AuWO;̖l ~F[z{,ޟ/ZXik~<6 Zc?Fi5lS[3Juzv0 2 2$Чe?"(G?CQp+3ٻ w){vL;MbN5^!WW$g3Tyj/>,OnM-_(|-/-Ɯ[0> +@a '=]VX=Zo:;e˦KaP"HZu5<)YT#ZI>Gܥh{ Loq1/"7>j$vA["k4sN2KAB v^'pܧa(QOL{3- ?>,]^i8tαV{F) :tgٛ~=>`Ӿa}+=(kSQ;XHezfU/YC7擰eEۭ5rqfV5rlx!. 6saGRаMiMc[FK a[~FXj|28hj\q2Pl,ZQ,.Su}'6\^Ivђ1 6X|Avŭg1ODsdYi2[N> 1m+ b+v>b+nr!˖'l C42O;R1-M)_|l |E ,G a"nIy}m3 s 98:3 ̳ENg*h+,5>AApLTnUmr)iTbPd X`b ,^nɥ 3f7I#Dڣw}kjZWoɵ" D5M FBxyp aLdjK[UxQhd *4Ooϋ7 da2=x< t«N_; b EwxOo I#FëA p4q kO&x>m \b9bn.MQjq3$wۇ4kjNl_c6=\Gl2PQ2Z]\On3@{^`hlyJhKpahڒ:_-G̺嵶T|+C;\Y&פ6_)O+i3#<7YFxa,C$lΑm = u¡Gq]΀@orriܶGݞ,"%kUya `D4.n<\f)^n[ |;J nӆ3V0޷Z> 9 UjuAZb U6ώ [;^w}q6d$6hԛw2욑6Is+4cDg˷dNrS@I'~4D=MH i /)1'swI$Rh'[,>jl`cje[n$DrȉrqcA {+nf}{lt)Pҗbom2P`TL`[g%+F )%?�M˯d$8;%uYP Njc[TNFܿzctt{wxwM2T7$ʜzPNyd$ƾ%~ efRU=.[6j,~BXU@ kNg$fF vU- j>fQOU ʮܳ܀(- 7i%^Na`V91냎P ~'#D;QnH >ȋdW/0 +c qTPm-AHum.=vz)V2Lr)iۙ(E:j0ho Ÿ @~=ι{=dEH R• 4Cԕ^p*#++i3k{$SxW-F9󪍛6|*kEkT LpU97y&eq I)\n4JFjiT# 䡇Ex$ԍMO rsx>ۓEEyoʓP+8ϥ$Qi+k3o/?AO~RIN{ʪ2!BQ7<߼+URpI"al]`5z^NNjg8p. ,OyrW -h츏'D;^q8X U-*{⪙0Ӄb[(+$c+7g.pqL'ḑ_ L^ɕHX] Ӊzud}oЗ nBwZ{>@r;%ǕGN|Pb6G1i~{k/maiČM-< 7@L@W⫳mqb/mu{zJgrC}c\ȾUWOVHJ|pF )c Z[_sJ5I@}gݵϗ6ُ=ۺEPfi.Cnrzb܏h+I WC+H*j(lZQ֥Y7=D;}+lU ~j؍!7WA9KkS#@V&2iH20y8VȘ<@`#]D ˿̸Iq񤣋J,@Rwz.>6SӂMbMCqw@`pStQy ̞l0pɜU!R3ʟo:tD5sh 73Mp?CH;XN>X6 dnFzcy*N|σx m5,rP'\ LjˌCXd] .E{FVR#dm*.ϖ>&@LD-iV<ٜҡ@ۥqW0*3YOb2a!/]37E'5-gvp#a ts d`\ckbUNyfJC.7._VLF@Tٮ2P}j`ѕuQ M7euILx3fTZ`pzF֎$ZR 5(#M/m$=!#YT4Gnߠt#\>ӯվNdT..G{׷/tq`T6*ݕsͫqBP&ܻSvGM{&Go9\,)? f?`-mdF{r=)ٓlY?C;>XVxlj 4zk&EQjU~ũi k6Lw]JȠђ7W2_Zfa(lAqE}XEa*"ƭM |%I`R\zUJ;uwCIJIY,(89H`EJ(8`mY:"u{S⟯kU<$\P2t m h p +uumƈ\$"5l0kOojL陈syph6(KxX@[XjztV5!p[u@!AsҊ&]8x9IUd?K!|ĮvQ?&yo)&Im\tc4M!&/0 COJKNT;µi' Ez;{DN3/Ўbʽ~sqB5?eF<ع] N`rq n2%[4󮑁 hŞ"'Y%6wC;fC840L2G^}!78 p7.M$ '?bDsn㝝P^> XySC~t9u1;y,#:hrp,S ߗcaḦ).-]%Or/s)alb pz{_ymDoI,@fQ̍IvvFkMxIBw<;nmu21/ph5*uv5AG T9>nn}8 qc$=l7A}ϧN1gsI,ԕ=iMMWW!| lR0hx2|S|; c 6n悶_6̧d0jLYLgǴci+UNucD=|/P 8}µ=OGEX'@r+rUk׻J>P%csIC}hnT@A'򧌧D\/G*)L̫j'bX'*~ D$Yw|gl#= ˓9Mÿ`fQwГӦ:&r\}. ^?[_%_c-VMC%/#YR'DVbeCYV/ Uc7fze j0q6ĊȞ@BQ4]]2$\ua- !Y@ +mX_vp>JWJ/ǶEE=/rNXNU;,BJ{yO"T%&':ƛ1ĵAjX3y? {?pL<^^@IS͇uԪg;Csq`Lcut4 Qb}l3uX^T\\^cPE<;y.I= m/9~yDFq O (UeZYa!] `FGcJJBKu Uo6ne't)DuEVObz|6Hi"Aۀ\!S *=յzLv9dL1ZBUMHK$֓ιĪ' QAn<,]XN?@ ɲT|B_U ۝Ʊ;lol)ask0Lf2*"I+T2+4c~n afeJ Z4OL`L0o%׃B`0\&SEۍҎ.2fKJX#"j"Ko4t kQk(KHg0sMȧ$tzTJEMۅYh_h<ъPTxg0z4#6 VIy6GWk +/qVxW,K3a7P1wׅ0mx>\$ʻiױI֣]QzjW`dWu*hߌI e3P|:M&^1bW!WSq Φj{Q=7O$*tt-8]еz=0k0yΒLLd`IDO NK#K>u`@}'*I rծ1oWMyQ xCףSv yIIH_Vxf~IFtt`*ɷ$Ri_Q*4UP0-C8Y4rJĴX28)Ƀfi2 t)[8 _n3Qr'e5 *"?]&%me9ݦ.e:A.(S\U >u j5nB+D'] 5%6P<V s1:қ)X,l>XF[vPU0%"kv%B /5pKq+QUkpcY6?r =*ꑖƜo$$Ш]0B0:wMf^]n*iL\;~QlV?F5= f2o}B#(znR՝=p5SN}2E7 !+Hv*ֽiMj5ٽa H|)Ha%jD]O9 ?bHN^/`l6|TG¾j#Q$t:y^ăQ|p6U7Ł( d[nh'bQ%m`~vE|P_EM=0?BMB: >?\f&SyC/1Ӡ{ͱD҃ģgxܨ2fSc,vALY Nu9io%4F\kLeW668[ |*%E40VF1Rus S˿I 2du.e,{y+XEoeڬ̡pVaL꽶Ne鶴@lae(v-!y0ܽk-ZŘ'([8TI&y^MNp! cJxYCl/}kX:BZR>X}%r⻛',Crj!9w}=BG=vWɿu<}$Lq9Wa=$jf$2F}hH Yow9E88`n1w6<%C:ϐRZV]˻>RY.o0t,.us-Qf:a(eJnT_UJ_(`+΃ C}']|rI`ҏ Q(Ȋ~o fzf l+D_fgzEZ=w_Of-G|uU~z] c'+Lv:OjyM"9!.y=s y޼<^fmrSk r֬%l} ="~`TW=ُHFJƶB nFqnh`5چ +OQ 4+] Ks\+>Ytٙ_]} 8`2\Tӷ)~o$5,A}"ƣ1E64ǟчTqyQ4E#trJݕ58?spW:S*m<(E^݋ @;G+̽sAǻ[5J8dCѝڔ6e:fC*;m)V3ԄKk,ytCZ]ќdbLh[@^\|oų ׍Q,si%:-%oa,VU/W8USIcT )E aj`aze+ͳڃB44`WDJѾ@Z2uHaO=I魹A魒8k+6s>ɽwլ>\)fR/יKܩ[%GvwztmC]4̤]D(Սw=|k ӰD!D41e֋򹖁sI/Fo)ƞ;!oS)6/#\p!H`Jkqð峸RP7԰OcY<&%4p)rSD]Aޚ6)E餲d+'JJ+#LCIciP,iMgüyb-= D*cNob?n.W1 9?S.Ћ]]Ȧ>e`k[FPIڀ[ac_FY(Od< BKm-߀$܀s$XggaAJR&fyfRm𒀘~Bcዟ#9V$f4g[3׭rEbun_Σ*rr_Zm)tuez)v}7q5UzŲXi 12,<͓3toga{FYA*9Cԣx;:]Ϭ~iURjȦ%lUxLjiШ-0;.{<$we^*Վt10+=`9*>NJyr#·'z&l$_CWJ9Us}$2&Đn`pN7mGV`0gF bAxDjYA!ݝ_p>]A?_y1C0̌@Goˤq?{'1sz<_C>|OP;ݔj6|֭i(:fY,.ƓO!=JeR`fq K+c9CXӎG9l; npPًgdVݯ!>|$a,HʂY;bm;1nhEAwvg@8DڅWqiU[X}*?ʕ*ioxsUuptU_%`H6mI$cǤ- 0z@֧ъ^ttTU񨺎mB; p/di:t.)Gj/1R}9j oMh q$m 4Mg3v@~S/!b`dEؾ u3ww=lD{5; [a* D4* ֌mQ`m54_0)ؽӣxqtiҔ y !0?u9YE{s)QIt yNJ~(Ҋt Ν9C(rRuBxh43!}Xk\XM ,(6Mxvp@B/Rfx AF5^N̾H23xM|}_;Mi0osppЙyS_h}._+;f?p< {8ٚPo?G{?t #t9Rq3E TolBi+0z +_ٗк~Q J6\4N+2#tyugZ;0u6WS`J*a ̩m9]GR\8VHACL~x&x;vE͂}*3(CK"apkfOdfxN396jyNO8bg(PAZ_9g[KehEᥓj'e_v>W/YNW֧"?viLգ~9Uܠ6nڎ ~- Lb][[}RLD!0 8&@էˉJtt6һ :^ɘM^;K;Dӕk:91v.?0h9`Rh%Tu >awҶXZo/j[,(mV}W|x"D= ky#DF{=\07Z9DȜy}4JMĵ7-)^ٖ{[>AonF z~-QJ|iϔHpn1])Z~&彶48P*ۍ`hK Jtx? 1S/8Ƃ4_GQNUHBKsl$9wh\p/O9 Y$02+T.<b\3騩&`l%J=ke5h4mGO5!Rc_֢70lgqq'gz"ZMleS6b[Ie\9VI AZh~\>a H6zGwA[ \%dgy!s"ɞIla7$8Z>ΌGw7ʪQ4qX?ҙc?y; _ & Kfj0jYTՌS~?{$ 0qŜ՜(N1i@ʫ׹uqH>8ռvX9)jRZq(iƏBrjڭh it qD5z/ܬ؈\#`z%ǜy~7nr]~s , Tơ36eÄ"&_ S0=IdԬ ^789a!0$ރ{\F"ԜSx'ADS{P{oʀ{i,ORqEt9@Cw֬IFj3 Vt9źhP_#4푲cM ڌ'ҙj&YJ+i1I;gtK2 ̈́+;鿴8OyE-)1F?-i|'l4 4+f˄\QğwVs9 Ƭ.{ó䥨6T1/2f%6tz6ܘ@@47L(J!ҋ(2N𩛻#K64}}X_d (k1a=i(c?^@s&eC![u~w`2;b d\ в 7EJ۝CDr#&(׃V3DMIFЃD3 ),)-e cǚO\mBS rS22$QE7=(2$|rj =N!hTp7aR~|}!HU$"FH'B"ܕq!l%Nfti~=o\-hCZbXB :l{jŏڟR˸U\EmN͌vMAQ zV5 /$QU8~NZ1y}4hw";*rYzP+QG4q?C,HEV>܋C 3 (<^qD poڅޟhCiK֋41ީCyct;D##y$,o ^?Y]F+L gn\9(SxFQjʢpBܞ(ΰ<)G2RYI_sPkӸTq3 0Dpk7F1? aFuUcdkݣ-(n6q4r}[rK+ovBUz cvK:?jO9ץ[ D+*)9 rSexg4U*a3LVwsҒ8#XXa kͤ3ƻ+*ܣCC|rr=KS~`,EB~ b=Mdžx^ڰ au374 ݜ1sR@vL8V{egqD"/0+Ik3lwFcevV_iiسmYJ*x^*W^uD k;9]v2VߝQ> ,-U@yT=ڕ Q74,WTaL"Ԧ j;R+1ֆO7g aZ1.}k@ t&P}y8Ă@ V~Hx\/ /s -vӣ8/ZAHM1c$uf' /e Nb KI62!7] NFNez1q:fJۥ`+Pԅ!oؔL0i`Z2Ug 6kKuO9ۨYՐwfb #R-8gNsjqX$Jk`Gtwv~,ѹG B{ef؇\NքivH䔯{ yם 2I$2CD:|4!aʗ`tq@y1h5 ,ЧߡqY͎ȇDxGyF 7Opt{gpK8(XhO8bϔ U8ג3hH.N+96"Z(q C6)`/ӏL<ݎʗ L1{Aj ŸgnNwuyb\=ӳ ,t!ڴ^X|JlцR@cU|1_Ss0kVن ̇1;o(ے1֬m@?1-˴ mG>iBwqݔ3O1꾹?*נI"9%%$ !%H"!ETr'3*JD0^4ݳ̎0!ewxY߀gzUZL:= *l9+O#h <,ZLF0f uPЉEQٚeͲDrra$`Qju|`y;bB4TAX0,d҇^O1{4'C)G"R%D(B/Y`I BۄcN5TBЂgX0:4 # ە>SJ)`Ib 4!HcAlY !YjqEdjqTш\׹k BLJTR.u$9SR4֙,m@Ɽm^QD3 &I9µ;WWN#6ZeNFCgW~AA)&L=%paUXe0$5,i놅Ct32[Sh~[ @3 % OPh棈PF/* m5%5g&']j3kxP=rT("v8>h ;b"\9KJS>DQA-0eaV d>0C+±v5v2G 1.eYfOB0fkEi%HY]:P5ATL9#W%&<=焕  !4+mrc,jw싻%\ OϩW@̒j ߩbPϣ׌ju6VuRuyTTNq}[e4ŷ|PcZ)#Kx՟;}_ z4W OI5-7]Tu }<Νm$OP.fvp"2:6(K #(6UTv$yWy1 uu|b"`{n]\ \ރ^A4^qčjk><jK8*RS %1K]Kƿ,ERKL"b.{Ec?Ѝ &括tv9A2hNTY>f/يŎ@<C50">Oyn^lE^;f6v_T{\B&`^ =x|n%36fKs^C8!!jG;~AȦgi5Eu\  &CvXq흥)]kced\ӺjoYw}glԀm=+"%L~OQ~96!DwKl1Fkq%21-w?x5?.O b} /Y N8y=&|M6| rچWlw FYU)C\wė@5abouP߄ |ѵA]DUf MRGo6߰*w`7fټWr3|>Ok=e K~NXɾ_8,D÷j=5I-N0>0gKܲ7c@s<-,b3<3=WcUf;$*E:ޞ o+%îv_ƖSJ_+G/_8h /haJ"OͷU+榖ޅ+ 1N"D ,6@Jg効ruXJӫzS3nE)^"$8TL+w!7&w_@ۉd/blweMz[˩EȪ+X<%SEȤWߐH"H qd{{bOJfO/qF&O%݊apa]u!T\b y8}_9 SN+z^ZjR@;{y1x:;d9Ջ R 5NGFVDސt]J͋ [Qi?yd 9Jmym:o@<߆RƋ!f{`xC=-$(Dp83Jzp͘J.V[oa0n{W|˜q8/OD|/X$u Fy;t&&EZe{袲m%V1"[-8m*OAƁ} :fjivvLߩ>ox| yImYęC'+Y1ːt Ѳp|^\O/zc*شy_5}X+&*ִyJon kHZCyb a!Z^`{72W^>v&٫AGtb͡e;?It) VeoeGe58˽U Sz2BdH)7ܨƗU oy.Aau/ݧhf- JCb,[6F$ R-t|?y}S@G+y'^9V_"`j_r=D u<{mP,̳ 7_I-$m[ ~=AP&bwuPU Dt0h(#*9IQ~3*~JSv;#gZ.q͌`c/hfԹo`7PHm5 @3T/%lS;&7R{&3 j^+gZ e ^6GvۧOa=~PTD=5cJ8 (9VSߡCp]ا&. xܬ</* ]W\]%Q_bGke͚Uu/DC8 y@0d=mܲ+w<]]ܭ\&> u7=`x97U_ZUkhyOm,yNǒMBdi0fXe wռbؒIJ0ĺ`篞zmw牝Ъ/~ԨM˓s!t )czٙ7xk=}TYPD:8,~3OVLrsՄ0cL5Z8Q-~=Po{m͜|p\!/_+g|rL?XI-Br_x?5d*Gf}>mVæ^fC*NQxGiGe>i+dPi.$ҳc IEI'23Pa؉^WÅ?בVeB+EYr .ŮsSUC&48&@cӴ Rh)In<^NN8ɑ͖u؍kkiS R.θ ?151UDR2t.Ս1Yd1v8Z3덭 KFnv̹iv e&N!v5ψ9g=:> K;CC\n}[4HGc9܉TJxX\u7~%m!'DeLi6FQ%G͌hs3dټ{ω<2J S gfzƇ+[yg Fw4 qQmaI.RmS z^2\i/..;[pyΠdcxå.~aˈ<[xpj5^U~ujYA_ D(Ťl#p"A #?mLCג}ꑓPP/Ywu7%߬i{HBVzp+CHF-jm{ŷ`whnVY}ZO D )4,wЄ;4SA<N:\~j-νb>6Ν42D">Z8lq߈̟%0BZΫ定S c[ mn y,%Ŝ s 'p| 0 }0kBqaM%lzA6G=MGĈk52bQ;v Mʲ;\&[[\jpو]BIdOuu'p vfEU_[ӬIK_?!}GgatQ:K6 3_$,B6廜&n`s:$Q}R|)*pT| b9Aե6U9a*?Si+Qaɖ˕sK/w,}tB5p5Jec:@8wC Ԁ^\iA_ }y{j&%j L䀑 ņ<1a{sleB'P+|m{ƌ瞯hHeycvq_+x!KnHRL$;R>0hwm:!b];8I? 9S#2`8A_S~X5퇾Z+k۫ J0vZ* |myCv& U֝g  &:5i^ܔ[\ XQx;e|Z7 #?y0G G9˧$[P+ (u?N"(dW얣ϣJOkfuI:\,5܃tڷ<֫ K,`;JܼV 4i Gj6?W6bF ě펙jdͭ+иF!qsEu,Ȃ?. d=(,^| -{Q;o 9 d\L9dwaesaՂ"Tɺ~wjq}cPj}a^V˟@n=HР>6vs;Jni6#/pnzpVEۗ Sċ$uvnwW+D߶\GL!u~T;6#e'KkIuoُoםrMWT-&Xurs]0PU(5pS~s8 jw>Tduyt = w'u_'m [^BTyL c :ͱ?f\er&gJX߻7Ӵ9 a6;)LcrGD禉A7X)[GY#e>ߗxZᕏeVlBHZYBՐ4ll hn*nǕ z:@L&K{0[XHgwDOcP̿ i,:M{_A쇝mݾ.L4lUߎXTy"tB[% @n> tBDf{k%W~J )ɩky~dYRBrzvW/N ɳɖ7= ` /nb\GhkFwIZVztĘa o7G]ɒF#E]ovEW{Ye-ۢ>flW0vF^Zr=UeH'/ Wnd–Jɻ^f+_ۧ@>0 Y .ܒ"+q|Eb]%4>r@"~Ñgɴ2X_C2@bsڐЗ>ٟ3l,;e%pΘ8C Š/2oF{ٞl&$V9Jdt;<>jz}Au艇{D8rs(iw<𔷐'@fR&-H#e~NY/6--_@6X*%*Ԗe$'[b)zh.Gi˜ϘEK Qk\]߄ɛ*Լ?pŁ2C#+e4Wuyq ~ lU "]i=^G%R9O{"˻-G"pFEĥFFZ;l k }d|ꈞfUFPQ۩E3ONi%V_&ctet@؛t|rrB~FIPibFn,@eD!05B$v8|oVX2yE}5&*j0<߅p N `9d'uJPubpg4(*g"O;QN zS,wN9Y}U/n)CDv\İ( }+cԣ x˒CK/bM( Kj@[_v廍6x P܃N% npϸ'L=nA,琷V5%k)*6e##5p`]x)ӧ32˶?%lQa/q:{|EUp߄#4\#LjUc'#x~%?DX$MN ^K ct\o,R>)WN1"疗\`m-ď{֤Z"Xzۮ >P>pNNR)i?l7~H9/Ǘ"I>(LQ:[rvg-okOs @lE#*;Ln١{dnQYN:sވ%耓۴eg|nNw5IzLTPL$okNǣU&qK؛QC!;IX(hZ'N@g &N]kE|BY:vג7ŷTSa9.PQO| +x'c0v>e$y;O.8]2؎p/F>ش WxG8ߥ;8:2l(.dih{8^QԱkӼvStgKO>vP(`m}> 5{՗<*h`NWGb:=wL,6knV4fU"xipp*O=Z`{.@9b7Hd&;تhA7_䁮 WKLpZ%fo2qL%\Q"\H* (%\U~L)Uj̵q.ULtSe[L\/ Vr[Xv],ܢi ԘwBVY ,s@i yog@Hf3+Pbq_ᜡ:t Ё4Rw[#W3,BsK?Ɩ5iu[yg jZ-YĽCrUŁ,SyW*' 5QKt> yhm5ɝJc]X^ysQևq#܅)8p J>dFwEi}=Y:%hҋ*Ďhȫxhؾl;bM<%Ra_Ԩk6ACs=+e, ,F` wƦn 7V/HjĎJ ғ+vK3][n/l1;}/Jq)×@nFz2mX^َfa} 7Vsߴbषs3,ДvVv 5a P<~EX{ﵰ8Qg0^*'EJ̦;ݔ'~eDLnHda0sUpvZnK+;" sr; d)!uS$g9c Ymug6CE$(FX5Q`q@-(3 t p`6P<$xKfT--0e@< `Oq{kkJlk਀ǃaE mLy@֙j/-Vh #Зf"Je[~W V9ü8"r)AYi۰l<*;v@ hu`_&V3rN h&.b1zk%dt]шFBU_m'xû69e)ORNz'0_矜\Gb+09hHG{2p;^س/X=hIîQ:f\uadadW"Gsy² @r(I,9 "1YmP. >1>iy8?DDTtLՎ:(!Yn%Jt7/R r$'@b &=QK^ypJԗXb)y!{6qh X( l.> yO j Zsd.At.SHA {.i|N5ai6LAAq~"t^h`VOFbI"PN3W'/]q>P}S U𜏏, tHifD2e؄L"9qiEŅ%&͉ͅ5M݅_unL8ݸ;vKHrt`Nu& 62SRq?f*aGv 's IU17&ɓA6wbw -GqcEV2ioʔDoL;+C\oKFl@`3\qUmzs^R۱:*+GTY8fEK>2`"-V7nǧ-q|VS(d+7C_,2Gm=N#9)SE9:wmVPN][{3._΄5LZĈiQw?QA 28hi$NRpL^A8&g&?5ǟDA X. f(SmN Xp^͓ Vȓ^ơ :`j녖10? T/wB/$Q^},Zu#qkŰӪapZn<{a0(ߔ!l:oCBe=}Ƅ`UoF^M Ap|CuIVͻ Ԑ%&?+4C!JCpRCMAazgt|hh]3NAEh*b_#s6qMg8WSOt\F<r E;`|\WK @t'W^~{Q2qw :0ac7: 7g=73c5;PL|BSlYMu1`_O>}Im uě(`bHt ZZXyOB17f !VZ 7 Ghryn.>G!g#C >ЫXC-C7TYZ%kȊQ%Zp}r RyýJD3)Ze~hBH^'pd9x^,wK^jDG]Sy׫?idin_"[eܑB'> ~(/||ڜBK 5$ Tlh&WVD+4eV4IF9U{hs e-~PVE}P <`- rȕh],Tx#Ŷ)|_#V+gcSv5~nʌpKhq*QU]Z7Dݾ|'  >^x(2m0c˩OZ/c »9y9y^ciRƓhqfUW#k:uV;J!<5ٯ~5N /V3pnik7z=n4lXn4ǐK d[~L*(?i[E1ٶÝcxG;9ŽxOEدt_nGpPm@"Z$#z߃#fw򂙞 ^? l=~X9agr Ƭp+pNfu+ڑߠV! &,n<2:=贓9 MD[3Bcf_*hs Jy%|f:^)oڔu ᓌQ@3ItvCi`gC36S[RGP\AZ?ool_t]nJp %$617Oʑ2$!6pgh?xjP%1@&FtԜ/Rj>[GHϺ8ׅ[i e]Ĭ >}gÞ͹{*V /Xl{hX $ZZceqLy~ҟӻMv7! i{T5"'cHD^9[;[y(M ]ې,7 E$`ܲ{^Cn:ZSPi(/:ۋc֭@yFey?G‡-Ba& !#@k҆`KQ^O`yl%>w<k/WUS=l+r(;nz`ĕ_W8EҨzIrb(T]Tozؙ 1i%( !vh6pF]@ 0Li/R)9ٽPKk\X:KC?s jx>LMO }!m(\5Tl*eka),mh!ҢtۺuϚ~xKИmIȘ)D(2J)u*L- 9{*݁0ڪ:Iߎ1ylʢPԔC3:%m bÏ,ǁCf5yur5X>>N[ ?!T'8n9@$>;@6E$_ EH*Qx|3erڿnp#<)$a|m!$l|'E[ .ndVH }T-BN:x b7}OS$^;伃_]x{U"A#rx a "Paj#f}GHU F[ы-!b~Mj Q_C95y^9H |men9?-p P'B~FxA}}4(X8xGO R#w\$Z ?n,8UYMos_IH/J{{~@T$6#A"p>t>n\?(В@kos7-)4?瘺~,2Eȟ5W@t:x:XKhItW 64l8ځP8{9 f4 P51ԂH_FoΌUhVV%QbC0\Ȗ}R5+8l1t#EIOc`4_L% Hrd{ } &N*#e@Xq;b[C@[CknDHUG9Җdޓ®śΤoP s[ݳ1ĝ@f}n -J EOv:W?\eQC[P(79.H>Mm~5]Mh!}rk=-UC~g?co+=u. $v}O` x'{@T &/ :`<07~46V%<kgjB5Bzs6FBt.<^;""=Ԫ&M.5b <+m>@rhʕ^{fFxYjB.(JByķ'dwq龕exd;Wn鬍;,?ϧQ/RctqS*3Kώ 1ȩukO4696Z>-{"y.ֵBsdT͂ܤW1uQd܄hٞ S5A|1t验Yxq6CWv5ctA\g3zn1R5/vlQY uvip2pesb`]'jtSu5>-MCй0A'Cd)N6G0Piv t5\Bf]ﰧxLȕ^TN>3w;0.7 v}.D5tAnjz3l X!/Ej$FHi ZT/ж$⒥ǹҲC0b@ C8и7γn(~SLArD Б+Ј %/W^~EX; /$lYPf0vfKW vd+,]L 3GUr*V%Ou[\%"5& Yl "#kMBQ֑jW[W|TK J(+>X@-yuy? OM/K0:ؕ.NC$?fHuP>W|C)t,Ϛ]!j[<9"﹵zd%DS 1 ,KAB^z//0j[pi5pq75O:zu^ib5Ymێ%44R;oa='d76/Ye!zu2ŋU@uxRf{ɳro 6$sF"m-$29BKcECfo ڥCrIئ pց|) E;Q|d蹲?δ5!hN'.=XXS.sA~FS(1Ʉ‡5F.>?氍R~7hӑ^q̥u]0sy@}lT1`}:K-؉M`cR:ע9{󘶿U^ [_$gRglq$~Mx R_{` :b h4(mFiS=~ng (ڴOoԼd<4R {_ IYD2]V]ԯw99jYBD'>J$B? #̥L:zZ*Pz*-KPm~G̼ǭoxu  `o!D$qW'!>G1ȰObH.c?Qgl"vY+\ _hnE;N Ubo*yy*?^^+PXD|ց .j7Tf!)2'1 t!Q~{q Kr_0  Wv_o}"j?&eNj$߬!\żlWQ剼p}&9US7D=3> >>Oqɒ5K0c5"Uww9朷Á3urEA*\iTj%%-[$ZV)>lR9SC|Yɣ-ձ93-CDz03G [|YTVх`=0`k4s35<`%X d[j(ȳV3~Q3Q&Z*Ji"f?90TYАDzL:H@$,&rMv*@FD&tgHPf$4Cϡ9=}D$Wy:D=H5>_kK6LmJ)>fɷO0u7sPph60ďq;kV foإMb5oeY \؉V -HsN$OS=BR4I\`F8SB29#2Z-`G5$: WqaJ_6̅ʫz UaO⭇_ch>,zlGqĀg8g +`0q SN)W7d:HX 1rMH?ZP JŖ]I>ܚU5ВF>K-)65[)Y!hRQb~Sw!uTJFbwF>ͺq uWh!eSR+A: $P<$@#"!1HJj)n0ЖC B< *3ywd7p<-hڪG[itD"iТ<$-M\2$HbM}nS+ Km{AZRjAOK@#U ):C8( ܿ. b0tQjZ(m٢Y~O"5/d%/.[RV&_)UۈFN Mʡ[eM<#'T`km&"pR!2wSHԹNNc"Fn#!M*2 EQ6LxO @U嫃Vq!N T] +]'S0xRhS?+Ҩ7򙒉[HUX4;UWcX-$+48 SoTT^W9􊱎M9d*31Rw%F·ޮ7 ]:}U VP8oPz:3< W7G> {P#E|F*LL( 1t/h Rsn7j'lHBZ۵Ta"6yag-~с,P,V;na܊rncmWn<0ʍ{uPtDōK,?G\#ֻ6~{ËPã_tL`gݰ*qK aF7!!>/ 3mO0{(10S0h@X.mD N@1epRI*.ޡ*-oF >y dBgJY5jX;`Ȼ6KmaH?ȱ!r7MTI3y HE<#Lf]Q8} ԢX|=.5v-3LZ4 EaΖVhb23@=;ͤ Isu6sWnREgy|S mX.7ff5ւ]uξu3͠~)'c>E"_hU*Fͼdh#),C&iPHCZ2̂D0GsDet 4KrBǍG&own"~P+Ttxӝ0Aư^\E @b3v# `PvC@5H\'aNY& 3&h/ÞXṛ1 tт2X-4X+WVݸWic f4 79_gW @UOϨ`FS#H5wR1M/'- Ui+txR#i{` t4aZů(!ptb߮E+Rzr*'D{ߘIخ⺷N@V2l߄_w6yt ULSw>RMvK)csfR̖'IhޛR0} 5-j^0 Ofۑ4? =xg$X]gU#9%ċ6x5XuvྺcS+SUM<(|Wy=!D'qFu՜v)%ZIőG~cCǽb9[ۂ&'!wtj(꠬lKm.Dy7/ÏCXBLN4nz+Jo(h[4h7,-YTAN&Ht:OF ʞ L~E ~W\yMG.$Нt5J6.^-`v41ĴF5\n6PeeM_xYsd%j'1@21\[Ŏ7?^mĚ8Da}o}pb<,1PGs*G$,֫vrj>M>syѫW q]8:Yuʇy+[(>žz9^#QL7wdOې͉e]F1a+dW~Òְ<؇BUurڮ&YgGi<[DƐ'VzqSokI#emdO\r`AW"|kb'hSH0w49d\lg3|!lbw*f;+W#d?T4 ZID le VEBum3صy>ʖn3БXwӓŚ 8l]%ygKy2#}u9† A=0W KkU}JY " 4Z%ռ;Qd@|s5Bh[ wF{jN} 7n_<:b{nMYR!VDX]7 AÏ8<~#IuSA5އa*nLŰbV@ 8 " a\!szit(ϼ̃MHʭZU lւƲ*Ljq1XVLv*f 4 Ln2ٲssCovI6|RK#_(k栛H~}l~&w F7RlW)։xG%hԃBllE;-),vS<)ƨ>4\fΓ tLb,$V/092&BlUt'R59s2q?1njbSo0EΡ?OI&) }.Օ ~F݁54x!" _#*8#+4(%Qd-e{8?菿I{A8`5Y;cjRBIa߁Vɹje=9ĐIW%vG?ǣh-[+TH6/Xjga>?@#6$(4#ir{wG/J eeq`hڠy"3 giJ;nm?‡ATiIktw)2yfExC;}a@DqNB$2qxA e@,YJbOW%Q!9"%lRXG|舦35JͩD'63-8s]VJ2ɶu:9K"̳ޘS(' d1Fd9 Aìo86d;fJG+;İw=$[3;.GWW4߬mio*ѮF"#Ϻ=-j/JFttH$$P$FoIH[jQ7ţre!*eiz]}\P} ]ړR\GxB;QZ=lIm~4vѿ/}Ө`/J8#'cj1;EQY~l苽!"DEESg>PU݅gMXkBF緈uA/-qZ qCjjͣX|$}w_L) W<, N z{+W=(ZI&W2{Q{MaawӀn-˯DAG'U8 d\XQvƐfF@̟͸t/OXt[]6&yAC US7{b] _bǢqm*"Txǎpq;InEihq =D ]pژ .=v!.O,Tr}Z 1n܀"(s?dTyJȶ)3?[]djH{GI)RY HX{[g<Ehp v]qcp%3# O_z!B$"dK>7nJ1V:٠o,䔡 M$7r9mS'p(\QTj$XzdrKSB~J=Cah6e1/CNǷ=0yL6E0 ƌ .S&15k=R1fW3[A2~$PS %7 ve+(W„/`:|{<{9)ث`|l aSiހV%|LBn[E}3gH gswF[.Qg; xMcJSbt|sMPK搃XR ;w^5z6^) FX\b0W-&/6mG+g%~EqtϗiAs&9+[xxQd7wNpDI}.Oz12F {لPaT)JfBhH~j}o?4pXZBIk[k ߙX/Zpa8ɞ&)CQyI, LT_O8!u|@BQLb`v"#ۏ,8,#/lиBfN:@|[Q=)7g)V{:x /(ϵw Ny;3Ĕ0yQǸNf/?9M}' qtbXֲ#ګcZ+fK)8*>DGހ̓Dy Aȡ /^?P~rR~QU%M4|IW{nsXrm; x,,tDEN{t9|KWC\l&8cxyNG$"6 %32y#b )EA tubd'}7QuĦ.)6jWCj ͝<kvu+b6ΐ}DFY8?ApFx;pgҩ7X&P~KO{Rq<>RpHPF w@11w"~͗Lɒ;!V}ս :D# 蹽3z1ɢMazsnt5[ $ϖl<>vt@1q'?-228!?= ?x(ÓRlY+%63PQO WİP)*jlk5c*y@_[f6˷c&|[?.t٧~2;eyѪCa`fQzxE];:gYA{!-d_j[6 %XqrE'U;Δ7cTD@ܓQVr@ıu,6Ǎt^ovΰtq ~7<ѯX2 e,sU`d ruzN1u7 @7_L󺸑sW x( .CzƦt?ݔ ͱ^ ?VTwB鯮[Pti^vMr& fNJ|M oQR͚A;;)p :&I+fcœN@xn#MLSѴYbzURO1/17n"Ӱ<6y۵ f6<,#@>tDG=GMWZ4YZٍ` ph Ͽ6*O$'` wM_]kG%Vr;+N 65AfBzѠ r5E"ĥǖZp _rId(WL #cW}#nfc̓™Q#ggf+5Bh~hA10:*N{ 񤒁|`LOd3T[B;NL*\VU1BzKJWߜ,(PI!R@P'rɜԻ"W xU}5Yi^gAUr9.``/-C[^Z$ yͦ7\>H!_Qzy)N]{%¨h;O(e+kE'9~&}+Lbjo)+V^%m $7#\ F,,SW1iPCo"èbC=]B>`_h4 a10V+?z\y᪮Bun\6GҺ_ѶZ*ZK&]^5J#}, 8OAj:b axI/g~qICra+|ݎp7Qk2ˈOA ce·BX'{p%M.*@b}k}+[PU{[RKP2P6z_ M#9gu!>1Wyq3ۏUtg$) DT~W3"SIw@P Ö+^*>ZjrDДWz tui$XV#[VZ 5ɳmZ׳3Ԋ?5qJYX iOZ뗆k/vd"s(`g҄Aڬ~͗n &Kt)jF Z?"W7@c+DxڻpyqS$3鋍 )}Gq]{?`t}K"eCn-N3>4sZ"zap+c+*%iKkl3MC~$;u?78N5:.P1yDr ]@جbB48qD:ՌEj3Br1_^f֩.H B*~sȰj v?v?(pipKRE<]HS |TIs-&{εInvr2=͚z*w5<:4u_[5'i%}>w|:&jʜr+Ǖ*Z~hHwv<27EAW~4RaJ@xO ^=H)N3B E>$:nͨx0APLB7A$gv C R\84SSjvYSbġla`Z%m]iFG6yZÿGF@Ƞi3¬V}a܇[ܨ>c7TT`?ҭ z;"#T6=z rG $hSDP#e7)Y0HލeXۊmem/XD$2XplMI&R~( ɭ$(ȫRʅrC)PTPm=-DTtK_: ~J:PL/FLHU{srלf:[rkjw5HVE.XBOEjFVB,} xy'IBjkzJX2$<噡҈4 $R+rQ'3 &sZS/N<9 I<~vL! %J=f!*=A5yYmUk5[SjASe5r .=^DRy+2S ?vj5ʦkҦsR?礲>:)&&.2]PQ!Z^_DF5rxalbgGC@9,,i&Ê]1OUʼXZlJ?})T"cr6BLjHJR4J|qWDDJ?xXr2˺^of^y ʑ+vVAf^y0^>Q[-NxHN?^-_84 aKZRD]fVy_7x7u b%7\7t!ݤ~VpW/"UcrR?#LGd3^u_E(=ypŶᯈ+zB~m3Nuٲ7u*{D߶U32Ud&'E+& AubH'`Y ]<hKd.5ѦLmao୉zm'hRVS[{M={6q5)"YWhys)0\ 6aѬyvD23nx'/O(vT弻TE8@mT fAP\,ݮ:"9XTYby5; Br3c/9e?ߖ_/^ejvA0T͟w!Dbd3$Y)0G琢jˊhy:?G]L產l IpA/NBfe;AE5;&OFHӤ(ZGs㧚1 @v WpP ĐKA\ue̜-j!ιk'r`xN!fs-Q׌Lm[Wxˊ e-ށ:3i(rөfM 4.ΫV.r|]:xF;ƒ(͹H"`KmؤiCOhZRJ#ֱA1'*fh@veę%䃆Ab8CD~N-4Zk/gmh{]T!{ K+9.]Eٟscg)\jSqclbU`Q6 ,v֊g >zWB6; o֏ ^hÛvGr#QT{x~K[h%SQ*Wzm6<{CwTIo㨋}p Wm۝hV8cftT9;w&tD3ɉ3gIb)  0FwaH`ۃ8o|ctW8>;0<\ϿX@ KQHpF7,"pTԧF'wijjI]IV'd/Fb8q?5ͷ}{:/=Ƹez<[@ <,<Mt/5(F}L Q8-(wn<}W"7c<58jčJNԴGwr;r@6Bd/0^9HYF@bOx[8Br9BE_w4ɀs8"tlF/ Q# Wc "ruV)ӕ@scB9/Dὄ N$L\Lg/x>HGXDc㶭Y| *:c8Pɻ 6섌47W a. [8wj1]Bʳ")DRoFPPq|cѥYp/M?s3J]-{2m:;Ay N:eY8 h9LD붗ܳ(쑍Z|/gb6ɬF(KNc%0ô_ 4]pkraFjGF{rqxNiKNc0&=^j(p6Ux;UoѶ{S-Ӌ c?b McWa{Ƕ1q n5)cs*u?mS)ȢZ['0 Q79?"XEclMK A&xjI? _`fY|`z_ R<mN>g t]]a#*!ViQ%᫉U<>j͖ ?ޮvG0pY>?ėY1K4%B:8RfSxEʯ"JP\5ɽc/8퐶Y:G|086OࠚA۱lo9Gj[c kpGA,ޝwhYg2aFd/>wө5mxo9=]WL-hDVCMH'++B]`ہ qE)`KOѥigASkQuø "9,ylOCU^}:_L Ȣwiuh6{zSTA]89ݚP[lпQhVĉp)x!AY <`{VT촓S Kw8hP\n=CAq'*>;A3,Ngt.YcSWkpwn)wh NeBİ ֗f ~^pi<6Oϯ.zof?u}ҫvK]п!f?Wß:-RW;\NCIB(R#K:?|Qhm_oo!p]~$IRF(%r$ >: ]Q0Ou2"y_&\#O}Qѕ\zۏQ#N#ӁF_%d1_n*w2a1Bi9|xh&ΌkxOs২׀ΘY) hyB~2[$@_A<@ėMsǀܕqC2АSF-Z^ cP9o9qV?(?6g1V}α{~0T]OQtΘxpwkvJQm%S-#f sHȾ(1e"j)%1\9ZL8Y$Kުw1I ~&CRh]xrE͗wDF}7`e7Ͷ:`b 0B?vL 7L_v *+ @q֠Xy០[v]Wl\y?_*S7+w _w&("g'.wʼfeb䔀Kԅ2nŎm&7P1+{Gk}Cܮ|`p!X;F*57uH lT-{S%I`a/&fI< ZQ?p.uwo1)y(7 LQ69ouC$$a@]$Yh&x:cVf\/G4jkEL Es}ojQh1EC+u@ ,Hgش [^ 2<:mGp'8>FtW񅚣##; ={ +G]A7 */|Eo4F q:x\!t/%X?_keTXj%+kHOx113c\k=T,w˼9+YOì|G2pV'nw)'/rfu]id#~h،A4Qǩ d} <2EMepgg}?Aļ2VB,CW>3*y>gNMjBxa \fkNO#8%4"~[ 9̛=Ãc #woQ (ZId+sYj;5Zl9V4Vzn lyCq_ڽEYd^${pNwH¹(Zr6E$hݤ 'cy2s+WˏJ #c "^@)Fh$Epc#s(LjuE;2tet/sp('',|, }Skoₖ99C[Y%Âzr7ӆ0 #7VEfQ` +L\;U)И#.S |>"  %<]&`%̖;,3I aH#*-wn UΐW{z!},0]K޲jffo {q սGmW!"jflf4J2ZN v%@|_ƯFb9x=C4h;hb4ifV@FB1!|] q&,L`~9X _7WzmHm2 "D 2P_Ic P)O* yf! Qu"P-nt|}wO ߒ!}mk}#5 <"MU@R ?io"ovIXG^ MAplW4s~vu#gR[yjn0 A`!Lϔ61 '(IR$ !,X+12ñAlj0Rs$DߝkPm=* MDQ-ܛxo5@ВoK~B }h+Ί$lx3ȅ: a`L8Ěezf"s0]z8-؉t}3+qzx 7 mg@Ԉ)AW욁N"RA^Ӊ~@(q)&eh-vi&עrOlt ek2&)2=cspd|;zMBsf!GڮĶX&jnwaj:TBvIz) HqK'x0#`T`;wG9i~Lus Ksg]_I\CRe_)NnvVFh;3I `cx\V1Cyb{NpD`dWL1Ʌ;#:EBHp`jMTrI_2!ír>uMgd źIaKT(`ձi_eE܎ d%mn?+@V@H{Cګ-#YgE9z4"Mu-vwewdoC?~f aņB7LD!/uipLaS*wݷm] -g%[,Kٿ|&`j젝: y%("NJՆ97':}Ijg;9с-.u+>(ߝXx]l ^i&CjvZj3S1Qu?]*k+}pw8UGfX=#ENs⯉ۦTu|WW1o*Y9 m4t(77ح7}$ *lC"{s}ZUI3:t-vI)m`ht#wHJHDU}*rS1uR0c Ҵ} c-Ry ;4:RӇHy@vsB ę'6 =fK3'* L'.Zϲ_ꨜB"N).7+mV٩ ";}?9)]_%gvv{v7&B&Ot @o+Z2lDPV$ =a|,=IVC?e١ϙ54Q5IFۂJ w`$_$u/Lo݉+?j}ֲ.V6gr\B(-0>b%Ό녗㊶ND P9Q{jPkͭ_k]\ߪҨѥl[(.K\*%OT5ONW1mܜ(c[8"'+\a=}`B%ut/${24~%:JtArMO$]-hmdݐ p⋾jQ|`pt$e45AZT<ăp6 B>ܣ!aesA:#gef87}279vF`35P3ea3ȩ&[{卤vn ` Mnz0,ϙ $$q-o!Aۥ^ @9~-}@DtA (zc%J|:qI:2 C43Uf{yn?-۳kȑI1v Ink,hb41v[lLH/` q x̆v4?%M D2L A~CC<,/z+!VL#+$U38[8gclBDjŗT=әb#ФN<1D/D*i,x b ԙ26wQ>Fn&-x T,xJCo-`F2*(dV@Yfrrrx֊DU B$>(+  YMqXjvǰ.FZ" vk$VtWm 8\|gM%<3]mvE{{K.ڴac.JUR' }x:"9+qu(-cgcY6[' q"DkK! [VAY L]@XE*hdEc2tԖSQrypʂv2E?2"4 G~ lHʼ5m"ÝaoB[pZGcXem=5e8x5v E!d[2Y9í Yj^FWɤHBA\-%ZB }a~: /*m P1w2#%X\brm +[J&Wk8 .biZ;T?n1 e`S.1x¬9P1cW9N=& ʌ?B4v_ Ox7$[g(Į k +n:J#ԩVƤ}yV)z5ʵHsc$ K᳒]*gftA(Bact!P#EV,xλn9)+S 6xՒr.|Rt̥j:d@_vZ6Ғ8*zD(ʰ3%K鎲 xjG_5Jb{k%mHe~U}]ݓr Os Hן{R6!-,1BB])*o)?2jCC-U.vJ@{KM 8iHl*VN-.ѢϦX#}j!IW|B;HÈ#F,G $=U۴[5 K]S/%ީt^^Xl ;vػ\Ӕ# h2x3 u`o=HD,/(Z*̓L†Q^'B,1R&SQU]'st:Rigr]"|Tvauԅ iIː6:F6zӾ C>[6NE_r*vC@hނGh moHj!fF62{ڨD!]fx;"\N]l "(6 Q,հ4)}2&9j)TVv1LRSrN}̫A'RVT4'VTM~ 2\^B'RLepƬʉ+nx4lT\Ͷ3Vl4oSyU.>قF!onGq3~uJɯc/V/2n ky' TC7S0Κo y)sp,p 1꓄аmK .hk8rx>uh FTaGER'_8l8gUb'p;9l62.YBLw>$?`:h~ 4i#$}L%CՎӉN|R[2 '| KlYe2|+IJ]>|Ԃ7($qi 9f0V?rǴ+f#t;I-XؾaPCI>TKUY"n+)編pfW]-*!&gI$<,;$j4,{}zUklQk.{}ޞ[n=Zc\|:<RjF(s=h' .WdXE"Y*D)+|Ę2đFåC29ڮNHWv=nX[|֊d%( ޺ EdUXwE_!G]/K6gqruNhrx!ZXrElɎv1$\F'eYUq>.S{[o86ec` +a:I%Ižc} @1Ř[Qywj1Pm\<,c|H Wpz-(vv4zU /`3 :kgH?jN>vi\Ghx>$f}>]oZ|'S`*ٷ 3j OF"P^:zkzBfD8'?@1uh]F{tVR%: *E$J~%Mcр`Ur0Y3r/XRmnIPvk՛)$6cO2A >˾eSx d~};bOpWjz X3sLG_ײb u}5id‡I<(B8؜*4ş9}SI  *nԞ wMcZno[a(PoVdd"G./IT {pOD&s*_/(%>໡Xj}DȂffv !.%Wͻ`x bASBMtH6VK)- i jܽ ]K>-EYcOvR5=tQnu. q儽٣ .vO.`A;lHs4x\vn->!yF"cIk1"Fb@cNz"sPl϶:HHѐ"bI+Y<>ςUhA;O]?3ALxTh]f˪ ̟(~QP 2uy{2['† OFDO 2;z|#Q"Uںr$f;l"e~ lGEvrM ͍)VӓD}A9~:7lV%!@4869aۖpPW1 G^x=%6U=_>Kؖ2&+\gD&㣿̏'S#H"GOowDLn5E~*>䵪|TMJ*\{ ~Gr1 ͬߐz= Ϛه*1FvC}m7HeeJj[Q%һ)ٴv~EWB=m\X(vwˎ)Y/FjTT C֎%f2. QT4A֖Xh;ԹW}fۊ_WWv/-o'w %Ob5|cdϧ"%s9GTŧzn8s66}Ą/<uwZ+M_ 7 kz> c Z;xcG*m vd{h O(qBW295a4ӁeSǒaMA;62p;:8d tGG"Q=rJq\|by5p _| K`kNE].L35]f`k.;H="\^aĻ zzIEfz ḁ-7,-- ̤C8z2њ'32ױv헆欦7o@jxtߖw+/GbT~v_* b' 󁺵5UTUϭ3G##j5_)@gZ?֏8H"yMfDZz`kXw>rF?GcgX!_\aj=.ۈoNP,^BN?]+.1gkFWr!*\Z `9*hWW1G dG2*1[`#.n=cɅj+0 yvDEyWɰ*7â U:ǖEőrƽ§֥dkrܶKY/%plNjp) 88*̜ʩBb=}Cd{G(Q;gNn,**p{t`#N@I] <(j n]j%W7BǍJGAKL_z bNGqcv_ٻNEƁռ{bp@xO_ȇ|B"͈߳<%CNZ_!A[&d'] A.U9˃Lt$_gR´o4͞]ZrvoE2oE(:/w۰OCNy{#-JRL(Rx % 1I'kEd|is0]VDכv7g"?j0~-4qakcbZ0,#\?t'!NʻI~'g7sRx=0V7&^O{|WfGΕuEY@9ë~Sxl_rU.E$nϡ؎SRETCZY 㦺|4/ B}j{'̟@-3x9^O}HzO;w\s^^|u[0 nbLVE_K=5/?<Aևba_8lrVMypj;nk~"9Sdrcc:la=%c˩IU>`W{]Ǖb}$B#;;R!Z-bvGMQyA\ 4GIv̌83yr0I?XΔ~8*@H 㩓 qGFzEaVN^JѰicIh<Z7X:]*Su KsӀ%TcM"D BbIM.?˗-i&J,=YUۦp|<؁Xg`Ma]_4@S*obm`>cEIkvZ_'}u3sW~p6ߚE O$_x@Gڧ (|E@m;a>jOEWO-)ܦbj!ekO]e܈jk`7?K(aV:Gܙ@m?+p)li( +%uz jfحrծE'J"Imh %473r ޕjвF ?Lxr SzId;.۞v.:*E{\[K0K(ZЙJVЉÂ Hg}_vao("bym~N/Uq__3p0*+3A8>-Tv_jiR.73,յo:V#LMAI= T`fh?n[%ݮ䪥'wtþ]\ Ne"17ԅC4@#e~Kڛ4wCs8iDZBmcn MxK[o3$ߤ`D 7w svw^f]ɥ$7ܚ\&BtPyBZT;Dr?Bшz"P):C:D6i!YdmS22U3`nPw眹{͹ۮrth[-v ]ٺF)"QI )MO4S'O#`:*h eBTrra?y?C^4: QΤl2Y" f IB0XK4?%h둅vl[. ג>2% VMZ#4s)Ϸ^XzĈhQeqNR? ii37je] UFPdlO/y;It8d Yɱ?eӎzMV7}2z>>} w<JDd8]ϩ#2b+ZQhC:oG)8vT0'ѝ֒׊΍Q_mzmd򟱃D<ѷM3$E`&Z&Xd٫5,QDp-I:69}cܫoIKi{&:dEH`Oa*5XAa΍WyGL`<v]V#q\* `zO-e9zhc}'2:e@`ZW˴O*ѱ `U53|4PɃiP fj LR vdkrw(^ulϫ A <4^fڲ U-tm~r;]9TCBkOٱ`Z9} 7S'3+#v6*vNM'u*Ԡꘊ1Zg._Q;#tD19 C' i?seI7SHY3o)pj@%"D{rQ5Hۧ~]-daR9!T" hR;:"8OylLDeL$hI~I#{u VD\ Vq."s%#Shnʐ h-ohmykD;㝩A\^ۖ+ Rwݬ*teDvx6=3,:svД\i2 D7P[ ́ 5+#³XbmH )h oxZG`6 w|)5 S\C׼Kk/6(:|Z@,Ҡ{lw΋z&1*G"ÖM-1Vo``Uo @@?۪ͣ&AOF.jj &b9,㸤YHģ(!kG)O-2QOOj ;}vys彘S-8$L~Wk掭j;?Ld?߯^?oB,MgaD32]J9g,$}qxs.cX\_V`o_?DZц4nHkOpr)ٟlKTeKYuާi#rd9jpAHvkFOFUgM5n.$:u znd+Oq~n!bxyIϷ١,hUP&-:q(b:U%:eM섈&kLD"N2$OXS?M|PD/eGvH\ 4*1n9'a< #+mT ^j&c!'|+ oշn c~62H|_8ފɉ#f;vk 쟤[IJL |BñRw?~oIV[*ez,a5J=Z 쇯c5fUP6X`4/]Y[3JVO-\s'/}|v JB}UAbU[WDH%3:ϵH8]_o\VeR+0 pPo}b'א]A\p3 ]B"ZRP>`W_^O|+ϻn߈!+rt(=! 8к%/x5G~>s1?Y0 q=3 qnL=7jԎ" ˉ![AjEB6b(!ٮjDyy8$BCeO?xR o`+i@IǃI2e\Hg?u2](<Cofzq7L+ACA|#v">0- 0-92}煂Wl]8M-k]Y-ݩEy->9o}%!}솨R+IdNӐ唃瀑N i[_;ǜkzF~-.PQklШ .௄tu:; Yu?^HE3vJs){tc?AK !Q7, uBtW]!#eTǿY_L, G/'?X٥ 25zF]+hJak(_b=Tu2` 6%*Rl&6,W;F$O 5d Pf,El>>I?V'd˳w8#]ŖdJKs'W-+o͞x.9XJ,%?"E[0Jnm\ٔ!Tmxyfv1^ӦaEdє|SwkGl@v~Q.OtWS9Gzf K7}o(V#wO[i>~S&>[)~$o{dvHkvO$hJ) lc=Nm_ص;uͳT*O{(X>] cSjry7$KgS?.\Zi 6C,O Ih L&6 _Ġ輝uL<:&O~0KvzmI2[LKy2&U ܊⥻*:ɹA!caռrkڒƧ~з֘9$? %lk Gt[{BG%\XȊk@1n#|sq'Am.Di.& $̼@s(- !6>R?یZ MPPFsahUDtA۪CQ6-WJ3$B.eݺX9Ȏ!i|.hF}ٽy>bL:psAP?Nb<~ng)L}0 {}Xhg`[R$e17USӥ\ȕTy1 @SKekw͗w1u@ U沐濎.S%6@^9nfWFA& #,_mdY_5nPF; A#""1H:UW 0L't$ z;Nyq8kȣx)O~^ ~4#wb fij R \>@q>-rxXiSXHc6tYVRꃠUP9dfeL:Bc8h[p7 IWdO0HNoP1ވ"9#b_Dbfq(<1*+g4|3y믞 ^jѰ/lUJc)ҢIIe4iq#ӑE$˜ EAaR6Ȳ_iņ\ Ea_R̝tUrɭQ%,\3AթP%YsI%V{eʂF- $?\"Ͽ,Awlu߹/h{`.] `6dc9 WјFʥ(Es=8cp&mraS$ǥF$)_y?_l?\a1(6J+А3K0O\JoTV/*Mڦe+yXeUmc+~o^z'a B]_4 -[/?KgcYjG;)M.i,,l*(bdVAkZ ú`X7uJChuy dh,+$id,<tcc!,Z%wylCq:۽|rfڶ:'&nףW=:7{A5X7J2[2kxaAvk׼];Z'E$X*"$4c6`մ!TҚF_v!BZw8Z*hc4cP|EۍW$G[a Sw4%HPD}=C:[#&AwavQwI+𮍍%/ TxkD0 F)ve{B'Ci#}Mbd0R;3ht|>X>rhyL,7qu9ZنlK"=$I^M5@QvIh"R:fCS !voۥ GW.S @G( :x_먠lED1d.'Yn+[d,' xb_f%-Ǭ jS*JP 5Wqc§/2z(Yi~% JK,ihAD C+e?ʒc%|-l܁ P*{H2gމGimJ',Zvc6̷TjlZ j5<] mH8[H5d‹ \ZbȔc:[/db謱g*&ŜQA׌FdK;/vu(D7ړmxy}n r$; ׍n1 j('FI)LN׍T'ӿ`Sv]ƍ2;tzk\5œ~ g /bNxm)MJ8IXIBòBoKQQ4J4we9sg C,%ϊ\/QYekvxsU{<*iWe{+ؾ)>T0-Yƌ Gؿ-6*x{ (xc$aƍa65Arr)?|f\{Z;^d !stj:z֡I$62ة|!%B(&:_8[\*P5?`NBb}h>p(gӑ:po#&#ɍ'RWP#FE°J3/`0R+28 ͅ:FHQj4}y*q j?(ʬa=MV9_3aDYPo~;EpTe{D\YeІ,-G_RPi,<}=:mCcV<J5A76Qx 0aLp lv?Wu.P=p.JYT1F9 g" ɭ ;Vo.r6܀,) ' c:e\R(PG02Bԥn .2KCb( \^1-bʤEFMH78MC[,zrÁ,U/?I< :an?MPH:ߙRILT fle$?#CXE|Ī$2v$HΝjrR{{s# IBqkt GϣeG0 F3OU6 "Pd2$ 0GT : ŽE@ pC}=5CHu W. BR}vNC#oe̟ tCpTP]՜-P׻ xg飐Xd@Q)!g$i?C(Ee@I5+o,r.Jwvj%c1%4ΝvSRy0In5yWDHWDEc+MJr>x-?Q4A: 07}$&sj֡j%)Ԍ l Hev)8E9>z=%|B)d:K2pkr uEJ%ivhLU" emKgqe11CBkcsm& > WR\6IbU\labVʌՊh' `OIR-n =,n{3%U;zl+w @?~̰O8bB(ӈJ"kToRfj,MZ( gJ*͔#xGBUfޓ4Ó<#KGW1vf{b"puCuY%Ry$vq8Æ/pD^j^ubfe mvdR.DLގ9Y#_'|mN!c)M}p{vO隃}F7k6~)It833P3nU.A+Fʜ넎ZTQ-3]ܟY@ 65&nd&ܐ#dv\@U;kʽyUJP}i햢z" :NR%zPJ$3}{w].t$뒍tO9!੃צ8lXi 6}!DHQS*'@IP|(j̯T%X=H)C"Q ́CE"*AXs8C  2T_nab`"Kʖ+qlrX?XEc4?Hi4` 9s| !5jU 010HO#6y2IqPfNk~Њ,< 5*2@%G2 QPIҽXnkMu>9M&YvL 8Un99mR+)Yg%M㑣>Hv)&f^P[X2AdW'窺iVЋ "2 UOԱ%Q'PZK hOeJL $ؖ49Ɣ+C C $<]v .V,EG0mlqMW@]5UMyrqĵrcY iY 1,Ϊ,K@IvK0-"^3y0]r%p{doc_J*OxVs/EA^*uB\oNA[EŖ!Vd'3rtO*xgNrREgڒ ()Rt("˭,r[WolPCρmּs6.%+ X#HX܁zI5jWJ)&. >ID 4]xzѪ/aP`nwD_T.wk 5|G)AOb{d5KQ ^.0q_5kQm^pQb0e[}ٖH#Tf!O[-qaGw3jKfT*Slkat]f_ʖlM%n3k rJ& ArdI?X5YK#5e6BDk5h3.XUA.*6w͂,V߁JsTȮI>jGA o駒8ϔ!4CkZցg͊_ @rfP A h`/ђ v/UP80uzGWm%t[MZp\PBKpI+ lڊ!8x|!3-hOeCZLI $\ɴ>x vbo^ҡ m/SQ'?ˌj9ЌpM$$= [5_:Kʍ֯%w(t"܊-?v`(27{ɬ\2b7a~p(>)=o8сdv}RtoRK'.ф3wGSҪEߎzydV^]o-& 5{񈭳#G4wj2>_KsNm6}%Zdp:i4/ߨ ~Gƕ:Q0$,͓M:@޷Zû!;#ȹZ-ڻtۮ]*#T6`7 `AsqؘuhH`:2؉^ǵ(o\6PSJ)sgRO1ELvllя[֘*K|vS(X z7?OY.g."oʙ-T)t Q&P!VД s[4:|-^KLYFk/HSOf8D NAbd ea/a!GWŖۮR;wJ #Z[^T`;Z+"Z| _exu[N-im'__R?Gi#/[.t7AZExW:Tizw :O'c kLlmI؃kZfnww6wp{oh˦x \ IU|)dinڅVPL+AlDD3OE1h"-f"b| gR`Q`j#ndj՟EQۣȋc &j\gmdӛg}!6leoճ2뺙'psa. ,6ա/ .nC~+ ˦!}7o?_p Ax N Ic:>j*5emfu"8H{X4NPDRY!?h>ʯ^c. e8ߒ= 9O6䷱;}<7X_bYlX8\I=%XOCt>>Z6WU5V a8"^zR*z[B^ r{A<>t$-^&3KM6ImJ4OLxLE :&I.L%[lY^,=KUg(5]&H}ݠw ״.I5~Od骠:UHRW~U#NƟYl>]@t&o2 &rW;HTYU[!GZ/*AהU3ge6E-m+; 5;l± 1 bEh]js5纰LtufMUmKOZ4_E%ȈArvLsuXju5BX#ȵ,f˰9I^z ,^Y0n)/hno?VR*("c̫_+J݁Ң/Ww+(FT!&XJ,4r$ d/$LR%L-P" xiI N<(Mq,xؒZEde 1;r͙u LM?ы5@]?jo,f~~׼FKIFPy '܁ j4B#r?H[+XYF./} Gp8?+uVw7R߷:?7lj')ƅCMP\a[{GPאYa+v/Pj\'7֝F A/&@t,]lza9 L6.j\wXȯNeM҅Ce~7F8{eŇuQ21`H^BOS;%`OàYwE46[Ӂ^b(!Es`F1rEntˆwjrRިZPKbXr琜ph:m?4?:c] *ED2T0Fl0ti Q~T(5MTS8Zz޳e>4kGߺ pmIh֝Υ!~~0oW#ݻD$`?|B'J$^bAĺ݇_wk e[zQֶ2S8ksyO\O*wh9m<۾o|b]Co~O7( e4eSgQ넁ʺ\e+ #q74<ֆ=ϺR nI0g!nPګJW)O'#>Ցv פE)fɴX'K`|ǜwwfo~|?\Eؾ(cڅ DK&ky-F[G`A:֥C )d_*{kV,ʤ{Fdnsh8,c:J3E620;o~>R_hjIދOH>fWlTR<_Nm;Ocn,FlH!y(zis;h 9]N<jy!K,5Ε^GQ?p@;x,̲C? t-X~tj #<3p0׮d 9T|IqH9ݪ!Y06:eXBG? pTX%ְ$HR!c>3Mp6.Þ݆ Oi`Ӱު&6$+əƗX7Tj»#, )DM* Q~t#&$(K,rRw"0ŏ?A#ڀvG/ 3 3 Pz֩O/w>R],TGR/`uS73KRr}:$77}-^:m}98rM  n0 _c85^fŇ\̛i>l9 [˧]%8I&+ 8HRakIm;aL[s 6rE?m> tlEXG_Iz#T33nmY*ϊk4Sd{[:1ws,"O'_5%\7?UeJ } ?nQ _&Ah+lWƕ#Qo G,>FȝfqJ\(3_4s NBoTgtzƘk ,)0_p:VsPo:AY,/-OW\pB TdH'qzG7PwFhVx 3'=F90#A)+/v2TN (>;~jG͖E?8Ӑ'B NT-#vd:6q6KFJE(T^jE,a'DA+T\<e2Z,K`kQ|%ۖ9̞'2"Q}lS 8d,:joPq NG|x"C7u?SwhY$>+fq:(8A1>/%1Yky>r6] SM<4SS+QQ$; NL,ι½h=c#L\+@# JRndkm;-ʷ6WG[RdAdq܀-/Vڽڍq&"LB )WϾt/2!Sgv$ / Ml'9kE 2j9BkL 싂@wXA/19Cĥ`rj[swgx.-wRFd[磅nA=ָzQd$OK[E}_淝D3 }[O# 1cc+Y>r 3Xޱo6YnawCVUy:Zq0*eğRRn'rOj֭ΝjPO _ߡ/F-YGæ>S$nGY̿rI@ƚ_~0kйRx(s {LPUxagݔ\tLoA1C>ExL@)l~*v07#!Ij-/s 'g129B,w{Xzg;/|R%'|]sG8ފm`yEIj+SZuDIsvuDU@ҷ_!p)K~㋕fQT 2^p}t[)*admiwZs(Aw5aJ'X1|ʼn;Brn8%T*xƃ>EoYʇ[Sϣ,BrLLđ֧9 nȈU\?g ~Ŀ.tVicPe 9#ԯgDqyP}%|7Vcu]@u(4Z654x':!i5R)GtyNW+VBgG4!HsB"GQP8w~L\Y sJF^,X>q:eП8x:C؍QS*_%:3;WKs{~rY;NҹxdXhDe j~ERbG٧33x1[˦7yT)Ovx!D p;cbM=Φ$%=D'>3hlc+7;:@?sjyF9W\7]]R5y,Y- ̣^v^hWt8s4t; 'c.-r*#uVYu31Հt킴Uվ}sb8^i |+$'iiSAf&^=b%J -7<3حc)E1VlNeu7G Oب4*pP Pp@VV7SaTc 6N:BX h]RIGyY4=msM.EEKxrRXSpVo&Iqq5֊F@N~QU^@#Qi2H dWuz}[^͛9pܸO]TDWp&ꋕ!{{z4 cVY37q:;M33CSˡjMqD25?} /Ej d'Sӂ1/$jÀݧ2Ì( q<9g;DZ4s  a!c8@bqP IKf!SŒj/ B|xC> 8m'`~8DzŤ+Tw{*bG5#PQFYR07`ҥTѻeqcyVto40:XbW0 ٲhtR7x}-o<{&|õRBΡ旐mcSDq(5jCŸpkR}1rЯ>LdZxdb+!E[XVќ) Q ;C7euTcʼn\82as2j*1^H)UP c$Ŷo1ĸm6TPOV)HsIoD I5~'AD-(*^w" K"7Om\:lGmf-cY>/F0eЕGYJLbYxw?>p,c w CՒKւxECRGgYX <ȭ& p/G(\g+mFƘEɓC7K\jT/ O?] V Of R;ppm-`285wsd>C° rl'4i|pr1(~}E|ШYո1A& ;Na\CD`mFψM36<$VY-Ia'w*΢KF18fH=ܻ=X J!F ē]:vG.*||JSx5`K&Fi8a?'Qdid c2ƥ5HɌ.y].ӡx:)Mk ߤAw vrYGYU4Ƈ*$O6Lc $A#tV}He1޿m$vM# 3FqS ݙs/G'W~!;> 3-IR,o0=W%BQt=2{Q̄r;nkKܾad#QDeW2Z6zLKy0!Jd|S|W"侻K~~P$Ы]|0CVCҿfhe2U4 0q gHyjWO $nM29Z*U)Ef} 54CP2U*\ġ˱ٱFv͵v *\$΀݆f&\&ٙ]KC~#gE@TASk[OKEzE( z:S6=YۅLz2*syܶU7$L[ncb4BH"eFI2"WےmI 1DJ^baġ(HH!d-LSHA9:PfTCDa}3B$] \%)ކcMjpYOg2)ObE4+RĀ ZS,3B=K^aa9$4K d'U*E-)IҘH+JZiVO(IEU6`I 35礎T42.Ri(]QYO>%cEx <`N.Ӗ6a۪#Ԗ[rU)FA^ l'ÙVrZ<5Sl{G^ۄ 99_ / mT _3@O=.F`9դ4BMMe | ;OoS}jL]z;3x}49xe3١\8W*}ZjLR+J%q.Q1XJء JKb ca Y胷 '֝ШCPM=V+<Е'KȽ-_|ЬҴhc?jVoTGJLEK3܊IwMgB'Wuc#<,\1c''+mY%[U%YD2G F-+0}AL qfᐍJ* 4-yQY^e(ܷ)[+nn; 5_x^ 3`0Bn젋:i &Hc,3/0EGZt؆W`go1JL[|Ʋ-L$Mя!(1#,i@w~(]lcD3EN*囹cp-t MH+&ά4L$zcpy[2N˃/S3R 4VZiQᄜO1AT9QƼAkr MugΧTxqcJx@BC2)Mɲ^IiH6$wkWER~22k:ə*Aly~`#횃?,ޡy{b|8tIZ13iêc f?a¦9ngsu p$+z .I8U϶< C53CݡgӺ+|lT\~s͹<@w׉*h uiiǑӕЧ)S"f|?y$˫K0;T&2&FzWv/ q;U⃊+Ʒxp ÛϬ.pͳj~aҹV(bs^A)%pνy{SIh2i#ϕAE "8I7bԪz 2GI^1WPl rh Ҋjw0 g&qT˱2HuOghWPjOf;'4;vjO;OyTI3RCuhLy$a,qŽm:rB:L#FӉE(o7htSk;ᛱEIvCjhP`Ěz0D's߇3% 8\$,frM 3qVh phVTs`p{z3E; f͜6ϏJ.Be_$܊]obڿIQ&ܸ~M*#?ٽ#Cr/V2l6%F;:M8qճQc|Mh>:OLmvӭg4:gYL# F_8_H?鯇O p :l RV`o+vUxk6&2,(S~==œGf0ˉgѪsG]fl45[4& mkNJ~V)|J篋i~je[[N6A虀vN~\(7dyջ-c?K!' >'L̵c`eyTL|qs{p*r7^]R 9:NO2#U~PQс{( acAv-8CL"1 _oN,2Ꝓhi2l4r$Q%`d;FB' c,iJŜrj<x!NdT!d@nwRA(31tjz3v j@˃_ BA drf=I RXNjVqm[SD+DrU^YhVb0Gc,w.as<3'6N U/P%/KK_aF4zn(nޛ[ K[oGg&eLx;qExrwn,Un /G~&]l:NN 6EL7_ʭ+~LX͸M6bZ!& jRT_(%jmN/o[ b`!yPWgڈ5෇>jˊ 9@ =f bab Yg iBB{Œ-U=8{E! ̇-*K>7NHt/6u*?O' EY!j`S;F躱em!v@$IaʹL>D&Lo`*>6dP{YdUW[24"_;'{31v&N)GRifC A`D֡Ꭷ]jrj]{!kTG Eiʸl  DjqL U/ w,޳WKD j=JVccBx쉘 .[k@D"@{ O6c;}:nxgoh[QO#p 0>zǔ~#{ZjY+ kOT{]VvHf.ֈkxё;#t}|CgDkKeF:UIzZzLT:0d-nNYI*IV+hOɟHybBT@Ob>]]U{ =`sI'.6Uw&aɒǟQ7dҦ韬z]% .,#3hUzl(_tIJN5aS2֥AR-{HIWӘYhE #.yɕ;aUx Hg BA`VHxcλ#jdnBWoq3=_?TH^@%H$IAˠ.( ;ke|sz3w1E۪ Lڶ *Uqz y;ǏE=?Z$4H/PO؉Z3Ӣb1 L]Q aU .cL/1|}Q&\X`/Iz$& |E0q+\yDBr[':1}b,.]T0%޸]-#A|5hy;1K/0/\ 96Ko>!.q$7Ors^ԏ,5(Bi ŽtoxD)Ws`Q^^tK}3ۆ>z[ɖC֪m&f~~ݪE^H^ m~elѥy7>Z7P<_i,Σv 55] pȳ i",A(b"fn:Fo%=D?jg !/ئ6(u>Xb 32g$^-h t$_<#LbfkuٌJ:P5cfJ z8G \hN1(= ri˙L=G%TNqudgdr#m fO)Ɉ{d~QcWֿO#3dg=qt:;ms9R,e- X>$ba'9rg~g,n<+.T#朻Cas 1q7< բΐoaeml:Z$v}>T~QaǃcL0|>zJql8 `"<=9!dђJ@O; 5H{F̔mM">IN: (9B}Sn]Kc{J3mJ/zH;:]%Kzvh5)$L4y`q `-= BkVaIREͪ.)l$;c)\djӟ96 Af&crGhĺ"9[N MIuo2/(]#K!ԡx~%PW;y 7)۔ K: (5'V.В'7ڗ5raD,pq$uVo9*ۓ㱡c$B{Z]b>ܠLWf=Zg/c?`݀NMyxּ Ҡ>cǍvaȱ,fkNׂhW$qs I"F!A?^罗ר#P^ImY\5{ܼ@G6t ߢQCIQeGݟg.q cNOZ2_VXv{7m1ܘf˿3,s2L9CLcwx ?Xcu *ë l(^0ack`y_yS+ƀ=A}8Ж#`| bxVa!29YguBD+F;8\mܷkkahRA|H&|ܛB]5|Eݶ-e:NW_tX8>m$а圸+_Ș̓v|(.h(T_zDTk(y<=|Iqv))<ƛt.$dz{C4s@j8F4ö_c,>gBzۏsJڼiJ۝45':~~biRTs=WdbV% Ȼו F]?JFFi A8Sy蘅?Ai(h IGqnᘽid1 +PИ/_gGs2H;lIЄE!lJNOw\|f]DrK7X^ɏOMFng򻯤G+3){.Q@bqF(].Orݕ} ]B2vMu `*v\4_s~ahɁ ZNh!C045 '+?>:O#CCc}NCQ ϴTi3mԥM`â8vg?ZP;q!cqO iNwؚ~=0b^7M / ԓ&{xu(@\Ngx/ ̳͠6 "Tj_/C4*i%%Lj&@Y2B'Xג[0$/bʅxA#1 y?P ag`PB!=82䎌,yK v0G$;#Hh\r\@qH; 9 P/PzM 8՟bP(t7hX5k5pwJX p g?4I:hB`^(87~yGJ%93C}a5Lk$ZG)MۡU`p\)prHg&OVrPHOtɧ#;_BrC5 Vwh塟2бMO nwN#D(G"p MFȽQt5NR:WvǺ=z#;|HJU!S!߅XOT ikt4d{Bu-Jr߰A;LH ҽ;҄F"♿kĠ^u:zTaEN Fu/+quEoz wKF);YbRL@><|%YaJ`xvJ0$MX@-f$ΪP;69IRO0f"CEvʄA:}XDW_2aOLAK WU~~C.]8P+v,e]̊/̂a56)0Ԙ.'F2軯,<^ԃ ^Z[`~)[aɬg jTZ62~2 D3 %`$l- p1<'ydCS@3oes) <ĥL3ں/c):ґ6Sv~dfhÆSNĿI;[kk#&o7֌;S}ڂnۦlmuX`rC9) < )eShfΈw~vfqYFWfv-l96*USH'2w HB@!VȒZ'f7KfJ )r.S-%%t%1m[-YRB]B$_6dxExM$ %tiyd|9ɂ y HyNcy6&}fϗnGiY;lXU@$dM !}$3*.tkVmZ4BaG.™Ou?kXF2$aq̞zyRo( pY` C*&&؞BTiwصp 5yMVR@ǓoMK3%<o]^OcȰmZ0lM Iޥ?y\k1xΧs{%2zh (0L#6d,g'UR4,21K>lUlHڊA•׽̃byFyV;T'Y?}ftxҚG{*2di&y'fˇۯPE.Q7\ZRR=~ŒijOD{D/n-2xpa\=ʛ!j6&:taBxڭG;qq{wI'aݝ su<`'eߡ>5Be{yO^;}$W[7d`5gC X<όEh4$٘<. kn,Xgΐm[*,}3"jZ/I\WoRXzӞP Ν%ji*e'uL^_⿲P1TQ.꩹8D]J^iKz6)zlk~IuP^6KК:ο=i@]&Hw/;!vbµ7 sRbJo`8Su5KHkrtY`n2 Uj6U5iT.Z6AQ){&' &! Cu_ zdF5YJ?%ŌWGPŮ*,N#hl9$IO=(iZAtM"j&uK JrcW.I4RDai2eamjì36KMVv)NGذh号^1f/L16hCQY{TZ[ק {^oygvr΄`\4l1>sΘdj}GɱXA{ ~>I=Io |ƒB^π Ee׽ҙ&Dn—6T)=򁱖 \\5oApe8o:kjx˖jSz{h!=((!a{X#j;(vϖ?(c)_c.87v4ھ L"dlb\Ʌg*}xux}X_R) N˧~G_F. n4i =V]/Edz nj+")ΊCݹg2mRÊ94 ) k5ʑnN( 05~4[hNhܬԝHQg;$8^G:+rzJqݢ"ZuCE!靜}o7ջ0XE7l~ mYL#fl U8s:|{8m ~޳ZkD#^Gׂni8^2ip`Z2۟ZQa)`^>g }Bl^:Ix+a & ̽pDw;}F(t>P#3mOWU6IvNcXЄQ=_W wi5Mwm2By2ࣿG UÕ|N"s&z㟢 Ok<&l:ѾaΦALvL8T×v:sxؽ ,ChOV 4HHaR eD$vH5uKzrpXtm\ `Z#Kb[7ŝ*|%3&C5#9_[meԉ$YXǔH_OAG%}j . 5۩cF;C2Wt=i¼BRbBo6! JH /k(q?R9цxU-SZ y aذ ,Yz6 "t\1Lumvu(L}cXAFqkݼ^x5-V&ަXjrXrWOS'f^e7\X+ ܧg[]Mj-uݪg)Rb #ʰwt⤘&+RUm;ՒҐs -uLh*m'% ngwW +F?C,z O.vԪ|T[ڵ-{K=h|K?uKre=;hIF{^^u1"'7y&ɗɵ{I)j|:ci+֣pjٹxބɇ!6Tܝ(늖Z Qʇ.Qʠ[@ k~+Zkl5ϮXK4X$da{}K9\gmbhtݺC.S1 olV*j \*wVQo'Wl SiSrQ9C}ķ`So#zM|E*oJ#{g/+0{h@ugIUj%"F`h tb%ANtqDXL+.XMKzaAN!9[^o-W7صp&t]́ΩƢc~Y,2P7o:m{;~] m+; m@ݧxKI x;ݕfnu(\2Cß 0lM'8ag p2]9OzC'LbjPԵcۇ,Puh>W#OA6>R;)~8RzѾ&^svi`On;8b;I_Mjs GzZ[b2ƪ[j\55nbpHv(t]}O[2wue(Z/H%Ow¾4_{l{I?t#Zs-1YF;/…b##*V@Ty>p0WYx|Ч)O'VtI=ۇ֩93kee`f\_)ǯ?/&ѩ 'gyyħs7ߙa*AlPN`3Ʌ^$vq=xljrJ ޥ,ByC""HL.܊Xt%)V6I{28K%1=Dr`XƴxTZEiJC{\R(j 'jFgOyfQ>ڏk |#i/*J-40=Q$aEmP]`e|QR^a:]-C}9bb=eWiFT_xqNLҀgM%LGOLxdM`. [0S-Ú"ulGg۟/Ӛ^heySwX؍!/+%ֿi3 O /λn?F?[ǿ`ߝ(Td77(M n?˰A~4OIDwu}r{(Ey|8AL{'=%eLqX#75#f}:˘Oq c4AA49QbI:5:K,0xu1^AsbU |e8+d' RK$cG骬o.l{_H 5eY=h=G ,\dv5uP|'(  \j`zvcG) .@죅ҢΠeXuU#}*q6+1`VW. d/EͰ]UzH1 K:_n0GXcG;]T i+7S}xY 9m"}~5pn{ e.fljUk+dwGv~ii?J61'M.}k2Xn9h,'?<m `ZP܊T1ﮚٽ\-SiYxІtUVsv4 6>0B^|cHfơ_ߝA6eӭgls4G^!a{2- '᥺- .o/rS-ŁR,DE ݉};/"*7ΡUh"]kۍ%Y@Gra6=yݨVԨ+s!]kjƃt3[˜.79^#f"P_\F*No>@p^xmSgC_q!LPp Fm!ݯjL|$$XW}3D &!^3zX!*$u٩zy?W$k4g<] v-Т97REC KT5 IbMW W/XFmsKTD/fxH,I(gOu!^p>T!;x{®nˠM302% m}J"Aw" [i!#&(H^+j&o$b}nĺ7 r""~ d|&~[\jdğ¢.ӏ%QWxN&'qV Sd@Z՘d%g::dtڠ{NW -Fmb$PNP;3%8y4(-Wܼ|On8[a@Mm8eV%<9*A;B ^#Dk2!?.)G_ +LÏ!3-bXZ$ذ D!֣χ t/WmZ1"=İA]H笁>8#*Z)d 6qˆ'[ߪ;\SBNi*y3sޢWRsM$hBSIlegN0%m/N瑢s2 Jˎu*g"MImIUϷˉZ#$k*ZxK2iRԴ&ŽLlfNk$|dZq gjV,p#xDyf'ygDZ{㮝[vs~ mi$]mGE(dnM]En\/Qƣb&xH`nlr8)5Q..!ZDX({ğ1`&1#g'z]>e,::#uIaSHd[5,%T$v=h9z|*4zG%/R XtAi3&, *! Di$OQE/~-eU;'z-( sqH"1PjF5k#fwasf$ܤT8q/tPJ,;˄割("VXL:Os .m蔩HPOf+'-_Y~*WMX!\>mgvEI4Mdev nB^fndkndž񏯱>o)>W /Ǻ$߷8;E\Ki0ʧEA0R$neD ?~0ִG${} 8X D@݌Ȫ !R:KEd.lŋ9.qHQnITPDL1J*w[ b&7h)9'@,9u5/Ǩ)z-,ܠI)Z X!~^fE<*dBBD\d V$%gls-頏>vϡf{uIB/L@@ (Сs-aGm+~* L"rZYhc2D@3U*ڳ ,ckfIBk -^/2o["D42Vp@w24s?wjmo[}j޾E[o"5[;~oV x𑗱+>_"5Μ\(40BF#H۷ֶvRڭjuvPBj-UHA030̬$܏“ Tc -~Pخ%Ph7"I`1P0KnB8S^< b'_,7'v>5(~WRA.92Ǖ >}I^gzCG<Tyjϕ lazPIpwۤ0؟ PwkR`Lt*Rcȓ& c)y&lqiIñO\&oU߾Uݑ"1ܛ"zf }l۸ cౡ7+|nN7uήfkl ib,˄k>0'bm}L~ʏ7H':&ur͑7AQ[I3P50iQtC0 I',rǡ9͌wIKI e xD?&Lƒ<e$3_>M=*e-=9b|ʇӏdOvuH<2sփ>9665Vn>kXoo[Hm#v74ǥr3 QF|g =brP eV0fײp; Bl`50#ԑJU'0X<zMuzX&ġӌS4 a؝)Np{V\]TKu6w$PZ6.w{3B,W=CQ_kMl! ҪObQA֭mWc,2R0GKp:([^VY7RIAV[$Pc uzlsw)c&UȾYжBP,u)O׸{Vx-Q D$sM˺ YCk=g<{hu2MPBfX͘C+cJKl% ]~?@KJ}S?͒(|9Wda[{$mcf8u鷒V(p#ߍliWb.%%Pi9? =i|`刄3>3iotwVfYeˊ6Pՠ-e$E㤌:7>/ >dߧhsԫlW8Xѻ%7 qSЏO /?züe[ul._W=ڈj!t2bd0>F-L)I u{^vo%kYx..+AVQ[֥a:( Z$Ov@YΡ.#ȹiFv] Wǯ*7,K(rFgks$Xs,Xmi< 8m;\G?j85UU1)KETif#;R^`.k`[ծ(PҲE̜##_|#\k^~cz-,:ѻ3%Ok%ZN1\X/Wά?Z8x+"]/Ta sCQUt{g{=E<8~z98sye5  48}f-Sa~+jY?_\!<>kt":}${/~B얺8Qa'$ |0ņiiG^aO݌hi.lЀ{YQg!?z4h'āL~ARZO|d) b$K"Qwlu؜kQn1?Z+՝WjÆKpưCRXWZSʨRTOp]XuBiXc>{빶SmsLɚX~Vt.PQy>Y%l?y{'.DBWoC其>&~z%qd ݔPfޒtZ`Q @,l0tS%d z_Wr; Tprs_`+V8c0ÿ=Eopp#K J/qg5z'-j~#N#Es% DsR5Sp0[lַkkGBʒiC* N_Q>i"fEp+^  XBA9}5l8A.͊=!H#¹ϖEpEz8)ycPu ZގAF4z,ze|xj/yo$pd76b慮 A*]H5JX縞2X?#&<8k}n A>q `>KǯHώ#F͆oeR<~Z@Qku^ ;k4P(ǤuVK]KX[ *!?P Ә<<ý .\.^\`}?u$b)w̠IM .4#L* )Hfl;Ԇ`mlF&X<"ܽ*F+?W6+反"f7A@P֞1Jp}g})z߰Vc\Xc-Uj*Bpxi9fgbۂ7 Usys 1(N{(Aqld?z ^ssIv0s77sL e0=`֖. B!W(sZE(5~5Qg!'P2Gh+2(Q4yp-A:Rџ`l\JH*`_bW`GOXc7؅iv"cß^A)3ꩈ1]5+R-{9I2Lh O\|c]ea TěPָ>8Mk~o ll~M`BπCQ u~){Xu?_=ưjk]M10gC/}q;M=)Tf6PN'2O"tG=^= >ic5`<8oOwrI[-geG"*Nt1.4oi 8VEx}u?ul¼>^{"`d yd` $[=!^d6/g,Iy[=b\~W++0hE/1.}ceܔTКoStRxzbXwQ!GIl$n)Q l~G ^ ډb S=E͋PY(nߧ8425^΀3D@#e|ߗf1Űz%klJ)cHzMkjݖhA!!"&L.7e&ߓY$1㒻H7[P #( {k jɭ|O@ EzSzC!m:fOLm6$% 363pH߯k˒$4r-[\[rjlIڭbFdƮځ0$ /OUr!0{-9s:bW~"t7@}d!,X ylO|411Y4b*!ASH2PI:LoR*YcG\0e 2C$,V)AJR"9L|4aeJ Qx*)ܼH֋ə*D唍vT7ȀJ0JHZ ^24t.S(pOFK?(|R{oP P#\"g yᶘ# N<&uͦK?kKt@R.5(Mlɶ*)b{  *aШq$ˣ0VdD ܬ ]=^qe-v=X-˅<`I\pb䰵 1ο/^Qt4g96# J ' &I*<3 QLz"65NN)UXײHi26qLP/{) 1R߽FAԬNL:"u ;0° ֹ8%EuY,wh8mF*9iH [NX؝RhkQxUʎT}fP=3UÈtc"U{ ۰r21CltDŽ4qլh?3l͸`wlxا_~]n==WǣϢ\{ e*fO,=I+@djI$?\r C7`8÷,P 5T[UB!U(G«AM/.Ys|m tvS~ɼ.VyY褝d^`q*zy>3uWH̅‰\L&['k⿭ 6ɔ]YM#fi_@WWMV',Y8#d-}L}y $šdeO&relX>\қz+:9%)1 f,.T>l*q8^nu^m7_OuB\WDwTlBO;[m'\^ h$ֲīĚzݱ%לtc*\ [+ye\q&{Bw-}] /Ns~/zё&'U.fۛ'y]bb6f,ef{V IwN?LC5 [o ۋZ0</, c7i-OlozA -Ienճl׷i *w3BX[J v]RzFuC[oN#vk}G#|{YEPSv"nkP&hkZHݩx*I?[~{Z XXwawa@F㰐M^!-Eɜ8E29:۫Zn)uf4/j(Xtͭ?}ˠu6 m1cġd2)C4fpݼL˺f La#,?-gdar̓oA ÙuyX7`S' ދu h]jJQܞ% d9|M#dcf"&Gϓ8_"ñFFIF# ce LA99(>$ Φ5|1wۑ-^&7*w5LjLIYnWS>z9E[/R Dn67 3owob=np[r<$k:Prqkjlf,^vDRѰ9)\Qpe_cgZ[*U7iRQÕ/ ! v | [L $J{",޴-ϸVln$Z#ρg؉ڡn %c !J>mE4/4IZ[nah[0C\܉jc;Mrn)X,on5Wc*e8u^Sx(k2薾+87' .+刹t!iSq l-O?aJ@oI@*hKm m>)yxdmרjW5oMHHzi[8s%]UuZ-M"9ˇSWǥ&&N3p>"ޗǭl99=8SO;EOwj6vںi`1Ǽx=!`NYM[7=)#?E3E>T1t>x4˚L7_(2)O"q̊#m j@AWoV`S# Z>4ogiN4vSCZɞv]Bkュ$_Q W 0W_CE7kZTA ZG [Ve}~eejF1p:o;=u鿐1O xh9ee׺bN @,xudk~FoJ~Oy#]W0y,hʮ,pOjeV|ЮVKځIG-WM  j9طm {j+ݎ)<=j{!=%c"Q^D<0{rLŇ4=`Ld na'M_ɠ5}KvvyK`,y2>q<0hy{e\[ͣibIF})9BvE5yfZĸK1W6ZU p1w?sv=> ^^y W#Rǧ/$=Q:*{tvf^1%Vkhf 8%R6CCyk#V'@B`2Lwuͩ3 碦4Zp!~Sj<"lٍۉpaV6&Dtx&|won,Mهbsnz'yPQFȗWzڒby^^i]k˵{t|h8W e"8П]\E x6Hs; ?8^>Mb\}󼓭{%vSc{ J>{P9)_w 8#e)J"G NI"63ki^& ڳoldޮICGZ xU]Ԟ4̊=ɲR \kL8lk\Q`.TTDE\2NjǟA  K x7||#?Z|5&["q葴}Xow/4HFיv{ 0==>\0R׹"6.ma+tK|HYzth l>>رG6 >Ok;@1y>ͯV"=*iN5GhBq{RKfĸea?=UT jf{WEgp FFJ4cָnqZU fbԫß-; i; 8&`)FqN~!sLWpEypkT?A܌B(m$XjMHƝc)sSWǡ`XjEmk9 0]$6 * 2Z6ÚVDWT {1WQ;o۷V /w'WGܾ~C Q+@tQ0K} { Vxz7v?lГױ'q& hQ~Fu1 އ(Ih&LqwNJ,H2"B D3!*CSmԈIDZaBٺaO0"6sh)D@c<u!x"xٰrXCY* $XLҶ՗ُ$ ёxb'e4Y2qMḻ/d]FAP!d+慏/`|;4oLD{7Lc !5EO-+P:>}~]MQib28nG9Yg[ovE]E\^o8X5/ᡔAAac#ڇ@PeD)6lbt8GҔ?8C,/BROOX=$}s)'ȣ+@og8 }E/W!Emyzܮ 'BW<^AS36_9Q(Ik/pz  ̈́`4ސ8W@{0{8i w.eSչ @ / ɽ_ue^\P4H ܰ0nD.8R֗TPЯȣMQVeqtẎ%::Z|s4uF~*%^sҬ&ʕQp=2Ļ]s'S%f}gKo&t35w\4M! ۓ]: &%E DϥRG1?2 ّQT.(K־EMǵD.gS71HDb;1z{=gNi,PtzE A ~O;=BE6':6%>D3fI%|59{I/yM,FBm aՖ43l|?8Vҥ\Oz_ 3khwᖓ3]KUt2 ;ԂlW.a0%`}>uÃ-2X衾8;d xNQ;SA>ZM?Ffg9UR1Ua"@6(jeܸ30X:W}LKN0vP]W `K_66 >RL52k'_FQN=Hk@2K4YiD-J\ΰU' Z:3)-mDJ}1ɘp.9qjTaiJ. OYy^nASl`χ̚3F!?"&z>}6!ި}fПGŎCQY*-B/8,qY;ʋ)<6 ^lRy!$jiY҉ɽKqzhdC>r)Nyz|دQ%(VpZ( MBj\ѦlM[ZCoVjܚehOU3A᱇Sm~]cZiK1Jge䆌d$ ^7ɫ`tá{].icGO;stRof(3!oNyKHP΀eeD SG[直ojdadXpL~R.Wc> G *d7RkaOJP1f?^6qy^KrJ0Y&A)c,>Xp8\4M{h L_s&rL LϬ.bcy Cr˜:dtM!ѳu R3"d73BcuM03/Fw>wʆiϯa"O/(3Α~$ڳ8ǯ\.)vKDC}\J㽁WF<~3/q;Q4-d%G f3od[qjs]An';ug;^+ؾwfNeg;SgI6NɪzNN~PdWq؅x8@UWCCsx?/(x=~EI9UtI]_<NjVv MB|w䇇oJV$*hW~o`7w)|mN3BCnB4ێ籹ߔּvkr+W?܄} dyw.2 4'U2>zf'LP(iuv, ȵi0!˂i2=%țQ'AR(,gf,tv&)cKȻZ#u׮XrdNVd?ۢNp׹֟-j,ѐmzGnϻFv}i6 +Y!|0!D}6Kae]##&õL?D!<E"C\[dUdCU O6൛!Wp QV%cF$Lr1]#$T';;d==ܫqzlw(NYАV;6CHkqKD:9d)Kto;H$z|Rg*qAukw!Âaֈ뼬45@#^Ui>Jd'IЉ)%"dinnv=FDh$ɻ 2 '&.Ig)dPG0QhQ^Uksoz^`۵|h]5MS==C8*0Agj5Ӳ4fkLD?(wwwmkkB5MY5dJ UZYư@F mW!QD$ (#1 Q>}}4]Sq4Ws3pXW%EMEm$z*NEV\|м{^&Ӻ0mPaPk{ ͓ew:BgBSè Kos)Ʉ;lWlvVw^πalmd[fHZW,&S[j2['# &dl+[QO&pR6#Qrjk]rp޶j}FFY%>X2p/J;@" ]l\+6~\k+/t>ձ9Jn)t `6kk~n qtW9Lр=oɜ+-~5])qxogf>ܺ.$ognUOOK礓| 9a7>dhW; 0FxH!R y>)er(" ,H 9ɖQܙ5 p#TJ҃9*^kA ;Dd-)@ޔqWAqu*! `XoC잒Chp" |$8px֍-GKg wqe5e#ډ'Y#EM(MqoNO'MPl<x =`#K5"!pf  Icʏj?!I~6)=K!ƅG AX9d !2F*qpNHqDO7\ߍUZ=elpCv6ᘊAkҀ fyId*vA{pbO#a 2m|ݓ>wpF*KOPQfgNN>bw+o+ } k(mIKlxNЃ5Q P~6f&%=kVKp7u˯[Qgم2DE QLtLJQF1<0miVQ ܐ]H~{o*'Bd^ نzLpX%x!@]fB&8d+ֻqJ|0P~zNiT +'8X1X1et* B|nbGR"vS) %ל'yah\5Ϛ'v-r4H#Iqx:U@NrJpd[35Y$Cn:w78`JCEju"Rx4EЭO,Nx2Oxl8m{/tz} Csx #Ǘr8jV_[Y= ޢ-WmqkyŖ7\uRm]cT#b3Z#j{c)TGQBL鱬 \=dݷGa$g1?Xo+#0 JD'?r_G{ybR+Hg>Cg_>Jv)%bKT1';5pCLS%pm=;uu軴j2_,שK#0{dfA5kIdw_p_\|zbLFS#wK[uiZAg}BWqXᤘ- U?(bL65 hqڽy\ g^BXN7&̂܃qLg(DWۋ/vHtta?dg\tάl7,^Rԥނrl_A'(xjlTӝ}m7vV_c]>o;C@TTV7;9[;]`9RZVP$IKS*壡AT7>Y$g0Pqaabs$[ É}΂7|MevI_==YK˩[m24A$wgikGI`>W",3qwA_E]"ݦCtŨpM?JƆ7_Y94򀜄=;Gs9-1|ة.7,,`b8*gQniBPA >i\oN2,'4[Y 1.<$m#ccvEbz׋zqαTBL#Đg0ml0C-'JLOW[xwwsdD(Oq%-o8J-D*#KKrwbC7H- zI$$8P5ɫg;Yp]%H9yfsu\LqVIϩfr +0mO>y/7(S3[w4=X~_DžˬBlXL)h!̏9"L?n,!6(]qCoZ4Jo?cʥ*g|ztڭ_ve7rA5Dt[UAzau[ ;w+}z|݉3u.DGy^XK?L=z~GB8#]Ej %m !H? %,yHm~Pxqe|/8䊲M\zi@ձE2s[tbFwٓS +9X9\07D}ȑMsS4kl$',2NH%@^a0lSvsMXd\9u+~/jXBQGof6c&gSYVJbNmeaMQ)9rJڌ+_"˽YvSKfznM^U3$|艁/c"trw|^ߪD_rkd'V!}HkgTNv/"bK1lWLnr>sο6%sQ._%f)O'(bg?y$HTxR~Y R-֨\},6#^@{v}DQqY̑@g7])ʵ2sk0|h*t8lN /jO6MڻL֚?YX/"@elfeC^[l(*ތhF, [pcelyR;*#o$ӔvETl ֳ}P$:\_xQpf6:3K3`>}_ЫkFU5`76_0x|S{e;?٠ sԡ9ʢ$w4 ?648װ{SXrϞ3#Sg*}r~vd@dg濽AΙ)nJ,P#{>-5 .ؠzv\Ѿg@q`2 j]-~cQˇ4Bk+̟MB4Sdžb%'G7RHi iR7:Կ^N )}T1aȃhmz`47_ Z j[E h@vaf![h?tҿRrÿQ]CVz:KcnnxrCdͻ0WҿpPOW,W4i ٨pqC F6CuSF#6&r /s)1ҦyqFif-8IӃNQߥb3Nw7g\Q c&mF֍|0~b_Rr7yEǧM\>^u@HEk,Xj.:&o8`@h=q vZuhubzsG{>njkX)u}JHN:m>F7׼򧬕w+H޴QX`Fviy^臊C).~3{'0",6v7U?㈎ R! TqjemC!Ln긣(NzI&za[2&"RϸHA:V}Wlyr`N>g`X KF[5t3u]%KwN`Xh\8aFH,=sGSˊ 2[ũcqLIèARҹӪ2?yK5~ =?֐4kMHIGվjZ: Y!1^G0ݩ1E{ss+b:GfK-GO%:6qXR$> K6r=N)@m<xŭ*3HӛapJ{LYQ'V:[|9nB&F̩xgTCp!>Q06[޽&\rz }DrLxH5XM/ae?N{9ģW]'l#Ӭv! i&ed\OzZ#w]v>嵨13byBZݝLǃ:sռbVRרb|)$lrb+溏$j[RQi&#`|l{1Tú!O~&?GnHci#bkH @\{ ߄M3>pYH(_RdK繻N9NRB>FY A6ŷ(E0,̐u 'ky:Υsp4ޮ զwk@4C[j&:\j#X<#DBрFҏN;ʗ igAiƊ"8g4 o4 "!71gh WK'h˱Yq%nMi|qAo!]u,0UWi譑9]35Lc֬ ؤX_@FTת*o:f-1E=Qd*Hφ= aGz7-]G9cㆍ5CB1L]>h2JzH4}K:QH!o_vpwﲥؖf9s8W'ٸlmFa$bKlbz<@g _hopY\)rbF ^*?N|1,ZNspRR@c5Rڣ!INz;Zxf989&<ѼfVGrYWt*Hsrt"\9tkJ M|("=LC?Ua`亡OG~^HI~Ymst+)'"oG.Y) _ӓдa[ű 8%0&3q̿,iQM!Y6c’ qB\w gūfw"CA'R&wPиUOGXHB\!z 󬨚y;0ZhBEA!;$&L4[[{ ͑ho hǮy3‘q 蠹/s@LGÉ YetaS:(Xٕx/lGNC32*a~Ϻ93מ\G1 vx<{sX\?*@,1XNlʻ`T%Q#`LR+9+Fy3&&+Yҍ|/nbpͬ!>|1w!!?~w(bcK`YF8T?b~ X!di#`whHG7SH "B6EFטMY/P{ !|fI*6}و_>d sR0Q-!T^_lq78vHY72?fSrpqџst~t{TiЯ8NፕJ,h2&(3̷(W\n{Zn䒱PMbwlF\1U_@--qz;;7zAUL*Tս)-ϔ젼b:z&zuG&CDNvjzoq* b׻3,\L~iUcz?߶zWjYçn\7/3#ަMT闏#g{<_ .y$isN(E0#oLA w-bS$ʫ7cfkꇢ5jqx._||mQdӜj\Z޸gAWBT>Vԟ?% $&t`lj1`=9^@C&$3Eȵb..q$F[v5wX&z#l&ϼv"o=k-}t[,~dç鐸1zp  TYvJWlPmQ [ Nݲ1ɖ꾴)l\ IX=BVlr& Ys@Kڊ堅d%&-直L[ DAn7Jf,(#k\o6 GhQq4V8jPuP^0q<І ~cf׺É/z4=!KyqH2&ZRuh ZAZd/̴Fbtatt1[yq R$;vP^AX-yt)Uꎜd-qdh#&@ L4mö670|ŦMPu}]~Nh@fcӹO~)7RzXַ́=Ԭ QՃ "q-yf}udYKcQ۩ aϡ*e'qJALKJ+ՋqNOzڇD0YvV-qi*9xgș{9~*9o5f̿gaP1{JzVR:FkR$s<9}twJo2vSn55";:-W ۟.0=%>Nzo1fΝ<2w&;LƫH&n׻`g7+2һiXrA P nTNQͩYVKVFx_9~22q4-Beeae{$O\n7lk{M0BTmGY0:W 1pҕtq7At7_jZy,2idTbjтfV5spuxizVfyUbNKj.t8 t:,gcr =>G(3c)jݾha.(äM{®I:KDIa-̵v`r:5!F'\R}TYKlUZjijL;8q$w3"&Au0Jx |_KIy O Vg&:~"RRj\?^9\ҁڄԋ:"kc/2ՏfB?ڷRWZO~lbB`}Snrf^,~ [2Nupt|*&f҇0-v oy M \}Yq njCޥ`F}ZVc5:&ddͨSY픇bl~S$ =ǜ m -MT>YR45-Qr#$[Z^+j2b]#} vsw_5\v K0Y DWL_Zo:C!8 ^d^Luń(Hr9uܨstx8a0SC{4/tpK=;qsW ׳- <|!;f́zd]mސx~'SIH5 冱d;?l" d$,2IE&วE_ɑ3Yr6JId]Y!TWZhY.Uݺ.8*2 0}yًNsJ!#L|hMoLPD uގfLMq\3Ar?zմ*L<Ԗ3TӧԫFi[yF?WvM+~Tk7Q]ի OMek5\y@ 4,l/XUU eM)Dlt&^u.:yMP7 _Ry64Q)ΪIXb_{:cg hhA[W1ӱ#U`Hξ/fLrb !' lrfμpDϱ`6fCh.zl(+6:3BN0҄0ˋ#iCG-uNkAK^grqO(;R\-OpzO;R(Z!saIu7=i@a+yE|p^)S܇Io^9نƕ"xbtρ5MޘAb+(qed v Sfe'=m3>fδ<|hMGH4\D h&Z 4" \q{#"ۧ.\^Y/(!K'#?@/wN"7S&aqiD$`ԕaPtT,t)۬?c?qC)Kl`\,Ɯ_"jrt"4D#JꠗhAD º/?@iH-Q0X7BS`=ENW,V?ܿP7 7sxj8A:]y :fkiȶaH ~1̓J?c5|da~݆ d'z[|p.di->o Ћ=:Dȣ}?OKKaaڪf9.v!rMv Cc W^~bAjWbWy pS,c%Sޕ3oi1`0xf>1w1'}[ 3ot7u0IraXy+0} ^NB9ݼ3v6ܱԆ3m8("O67LvT2hgV-"C;.Q,+R?ސC%Y_Uc5`#tDzVs!Qѩ ^ecws+R(AB޻@aQ~\#R0~Gb3o6X`C* O)-'ۑ@15f (T1JS./<ݒ5Ƨ($wqk $|<{xT{CR$êEjKl[`x8X+*`\j q8C4@3U(J{h,kbI8Vb Ko;םZ/P`Ddfl!d7$I6!rJyPE-4;R~)ETO] (::G ҷۆm͒IffЊvwn뻻46-[ۚHIn% 3uB`Fhqa&m@0__@/dl|%L7߿yV eEd IxI$'3(%UN>I$y,Fg82d ʳyDBʆ5ƹJ [.JhsT8̬&(mJ =^PiyF[ŬK4,AXzmYPW}])vxҟߊʑaQ1IYgXGuꩱ4-IJeW2XX5azfuYc)VYRSy˖`$c}] ̢{ցNk#1c&cmc7 Du.EGșY[~rZ&3/lzd~LFfA/˛[ve<֦@\Ԇx8gucWJ@e6٘~&ۥBKyzvf%ɺ D+I-,jAפCy6-b4$kUZۗPSa͕%$F g_[6?"%kKl@ A1Q~@E 8rp:ITQx+a$;DWrQvr^r7&UsCFɋpVm^R{I̎ր/me&{Lknz9ɢbaM( ;!},ޯz/!\2nԙ6 y3f7Mb4V^"{'Zٔ@o7?PiQ1E,XOj8'ֹK:$QE ? pJtVl[%F2:0W7>ladd)97s~[oTIjBPfkW쟦j+ӧy3$Nnzv!eglę+o=ygmx"( (MT?M.xbA,m,9Quр%$sׇW+_Q#ٚ/C#sOZ}YbZDmbgVғ{)cw[W7WhoƩu#(#{/rc{$??_955>xv~$ gP os2)YD)P"( %"C煳[s).ٞfX@}pŠ&{"_.YEulni[=hw9@~Ztuڨi)9 ]-fn~UyȆ,Dakd0)7fxmv]{ ݻ:;'~Shm%lԓs ph'­nec07 .~/W<: pʮSbLuZh0䬭mk^l7_ y){)*=5mq\z9TW&;8cC]Hl 9jir l U ZQ™X/'?A԰_ؙj ,51 z]O:P {Ё:0eW<ܥNz-T=^990 Y\)j։k`[gWs":gdƂNODy\c[z0ђuh`Jz8+'wN#K@w{Ze7<U-%9긎zx;9 mlG*^10k^UPq+OU杇gv ʓhkˬFVʵ|+8tN%yc26Ntz1xic F,fD̡Y C$篵znﶞUT^:gZ6xHֿ;0OB YkHiT<P%v7Rْɱ/&wztSiV66;^zV'a%ѿlrĒMg,)XJ]"njZ nR}Oc->ɲ(`#cusH;>L/kYglj>4= ~?!Eh><ĤGyW+FySɬ0 ?OWÛҭe ZPh 9zzˡ7|.5F*E M-,S͉w -)hYWc}̔*4kLJIIYB KJWvk#3DB$\L8|3;S$ >Q}} z]`>+GBr  ,foQ'C<htE##@}:RkiϖD€ja'#:Q'05АX,n+ugA3  Cc( r*D c^fk1җj B=Ɍ93fG? k$P?Gɏd^C'ѪUr^?\௦Ę>s/: (i=rH]0.qgNP^UqmoH[%}Gm:(MG1bPD \f=[0~Ɛ AOOH& :<6`GgdՋI7{.?\T#Iemn&=O >‘ialG5t&Z9Kgl89`jI׺/8A τ zrfhb g "_8Kh=?/a['R/uO͵lWfKـ]D.*;ծZv!3Hڗ9X[”O+@"$ni4 PM?YDRO2pf*:$ x)"\opRUa|wubs*l6恝C*Ъ}wC]<7=_MUvn@qB֛;TjEB~5W!IÂ-=^<nxۗ1\1+dY'DJ3IKǾCw‘b+Y <ö U;>lHbo8i=A1C ׍H KIUqN!\/et6E8Q[_:|{Pݥxi%d~UH-3_鞄Gt4$(M5?'9*'Ԋ)G.xPn@hkDs(!9_J8BG/+=4Ӆ /tEtROB8smb#Uȭz WS;` 3iTxK%0__H b% 2sYby6͂ ɉ4"JK!Dnz6\}ҶS"y^k4pT0̊Z8u~p_(d!"]|k* >=/=Ė: f@ fFN&Bn++0#c~XalU=kt1tH}q:QQ|bX&lsYJuYɜlC8R^H9ᜫyCXЛAy=IMMc(u2q&^2EF؇N9sȣRW7|N"Lyh;)mKNd}p tH'B&)%"> {Z6!qIqm Ie 0 ۣ} #$fst9֋\Iz9LuA :-0BzSn-a%cԨ=gOAճ (fD5_SBt@3& bR$?6E)Z#Mj1c*USQk[ 9s`N2GwC(vbt쀉 t` 玉W:YL>zimKr%Jah)'uTŗi[@^oå֤{fo:fa,qQy7O:x9ԣ!*dk1Mxcd.ٚXkEms3~Z9ub`iy~\UhB= 9s8qb>Sy­7"I`+m ϣ\O9WQ ??IqG Gk0ix'P!kiX4Jt,b`!О9>{g㪡v5 rfr=Q1!<'4׆M@SW#~<ߤ8jRH;ԛ|4/ hht]qXj9/N3BBeA4^x9P詄}+£Xb_By['T']ʬy X8^[Uճjcu8"BrHb- \|+siqpԔ;9U0{AY.! -lX^;ABI`cpTO*g!y|ke`PքldT̜ʩ̰cH($EY^d~7da<-p+af VwZ {rAV+f @=']r2CC@3oeAi@sh$|5"+F%KIzrݲ8 0CD"`Hf_2P~s!$nH|Shu1PRR*S[Dm)+zC:-iSl..cL 353Gw{nڻ-MLkYَlumZqݷXLIdKgJ6F$ɒ #7aՀPIHX!_@lG[1 k΋ BJ31jA"AQ >?q0~I&9> "[5 W4ᡑsr"^ ֚ZG-Fx">rQ*oB]+*] e̚mm TUcxhO.Aix6!aj^f %w[sRFbtfgkGajfޙYHb(d<VNٵьF!!j6eFL49^Y)a"9VL 0UlM#7aOmg;"z R e! 4 tlM°vbpuˆ<(~,F lJ#pV0܂i>€1S{A @ZhFԎ6KgZʕ`#]g|l%(6#\:ɂDC~yI^/EQccK*.=Fuj 刐-mO93Aa.J?]t.qb2Րl#zmװ FDKG3Op2{~}AD4k}OwYjeDvvfVKߘh%Ek֭etN+C5SZ)Mm[iŠ<nҧKVƐ+W )6Qx-֖-[kϴk"]dgU?Y xيO,hn{$]R6UzNSxf8$HgeTz&8ٌChE` Ʒ=M}ѳ-ͩ#|q4:V~P'r>Ȃ=[EZ?҈h6cZz|ڹ?3+pfݢ+. mu!CVO`RBc 슏+K-":٥:Liv'F#եGf'_/N3ismuY^[3+&fΓe0Cھ h\[5y3zY,1;-MXagm>58#6ե[m3|BzWx!W V'k: SY8o555DxI=R f|lQu.Kz$9Skw9ZHmb]sVC>.VxYoFG#_73lD;xxZTc$TW*mU&u/Lt6܎,y19:\:XvdxP w FtT(AfAo)rsaa7yw a#ZGhUjb eLoUENfϮGDYF>rݻ>/n_ʲF6mȚ='&wVPU[0BZVzdxG $س r2)}8m٣?AF>o$vy-Ȱ v5AwN9Zw/s4"rkBj̈́!.xTBWWE̤4}#5|sÍW1al7΋ ufÐ.h}Ga bc8̽&Vu-r<=z)-7DӂkއUƵ5Pkm|}~c7Uw 0$i{ '~T@تO_amֱ;7j|Bdwzٯ.'ɜ]ӟ'@vJ*xtK|ܑP.!fvlm D:fLm(g6^hNm,(+;qSTXi8ߢy]tt'Sxw˓_l:V <;n >N#ŰŜё[>lIϠ$Q\یi.:So(Y UfT[vv4g;I6ٵ`p{%^b5D\$tlr|m_ſM-}?i`߂;  ='!o;I6EkR:mwT|lJ-=a,0ťfYuOn$2+ﺮAIJyVɥ)fEB597 dK k H2ȼ袍\=쬏7Aha Rfo+D'>YbB20hEWnYƹ8gAKdݽqmU.cs{`R *gqY rknw.{_JKȨ;%OFyZ?# ށ1wޕѾ\݈U[%>SI6߶Dܯ|+nn?JפcAH=[ '1l:tao@ļP[<J̯|qGq mښM"qsG,ê||U\ŋ8˲H% *=Q8.dlaeŻJ K n~S,'+ɢwqD"~FKH*Oe7!ڈkn:N6d)„#>АD6sC /⹞6)z<9śþpYČ:gE/fojOf F&ކxn enJUn0'`mU7o %ٴx@H>|D~zlK@6"rcl:G[>$崅%Ρ^>QffOVJG&ҽHj"0:]uɴ1;2p6 lUyg@7[V;ctxATPޫ'{V䤐o #qRxR'~SדE;u?65|C[F'jE1Y`̈iCmX[E3 OT4H_//9"O5$g/ +Y?+ a˷q•u.({ÚIqn:y j y5}֌-*uh}G*Va+Qϖ9FV/?N:2,p'bm)!,ңC]M\ Q#M6eg uփ @\gM!ͦzCj[P+ؒ}9pQ=a70{oa%G3,?-}#VzD]II}[磏ߞ+lPJ9 Oij?G\G;6RC3L?5o?vb- T灾βKwg0fܝ_:SIu^:tB;I^An ^Zv$7je,bJ'O\> ȞAÕ mѿxwgH7ֳv:C-"xPwF[: t afdG& Hbrb/qks`hԏ,ҖCOg[*m~Ơ2Ѯ3t{SMayT EX ꐳ;Q8J[hxcYVؓ漻\j4k[6qEM%M?pNRGq_%55d6F?_=34 caS rIW.n:Ezl5t8+^jy ~hPw|3t~KOg*I|iI(d'[j1ljcoHT5pӢ_S ]2S0Ԇ7[ 2Wk33UּX1)(خB]Юg#]mqϭֵ*Cӿiw)Ĵ{iyhrb}镰Xpw# LOeWA9,=2L@mO_x?|ֿ`@ɳ w:)'|%Vn!Ud)Scj9EbV;I>DTB+B/֧'SL RC m풩x;tފ}wq3S%. p)]#k.ZA:( G9`lF`.(8 6DEZl`Wᙚ4Yl@a-w ZsbE5n>lw5ɣg%يڏKmi gECkЁ6k%o >:x;7OQ8 x[X)'tb (n5 O&;gsJ"IkRp n ES fPGY[4y Sa1 xDZ7p$ޘ־(q94/IgW<ďĈ?}NrGn(+8CA\TUN0ayt4Pۆ$ůALAZ,l%L!d:5>AA,aε.n^VWz&*ywb.kߒ:]߭P3RH)a 8gee!6[=a >?UkMetBTe4r==RrQ@/EVaX h=m=xBӽ:.a%-J吭M8Y rFoNӈ7<%ZG||;7lO@]$3\e+ Dn2{v͝fXaɊ@)ī6j~ @'Fs ȷ)aH&*3$b9 KQSa Rh 8 ~4uNLa#W"bDV9w O73@$%bqMZVÛy2EQ jR08rKܐO@L0 )guL`h"t:tzrv%ېy"++)O۱L reZR"y+;@9}I&1[s+?„sFL,`P$,[-\{04wrIa q)77g' w&$6 J@Ѿ,(7Q俭K&4P@`B~W U {+|Ĉr MoR 5M~` cB@='Gd II5 Dr- 2x#ÿtH7X[4F-^8@J,}'T߀NG!Kk藚>Z+ ~ B2Xt3d4Sƥdf[dKE^eY}m"Cf^.xf1 64E>TobIO?Z?GS|zk滊v<8Z@}YCkw25c2[@) QAIGqR,k]`߯c_f ~x^A RnUtSh޿5⶷3#GArzIk{T*j,D3w#5ƇS< \x qĽЧ**Z~賂&7̕_u_fopwٖ12tG0گx<c}QPz\Žzy_I8i,?{珺`d}w\G)&z߃2w=<ywj^a.6xCY:JlhtufO!@ޓ5A .DȌDŽsOAK4 Hj4tz3ϏcL}E#9VJY~`u5ɎK#h ĻA4UO74KLk3}a8t5h7AmiR!v߷Դ/j,\:_O#M^%c׾҈_;?nnPHBoFd-w,y/ ~ ly`:>eB?G~B4f*Smpm}Pkj3I !H)Dm? g |v`۾vRQi9; bTKhNd#Ř +9.:u24m}Y# n#S'ZTbȠ9fEWKbav>YbL=t|3fVMW>A^[,/o"O/E0&D'%߼t SF ѪGuTd#!Gl9"-8F p3$qbK%0m]/W-bvkn}BNli|4%* lP9"}*]%3/g)9,߄yﰤP~Y \/ZOS %=YH15CP-rB@Ko0Ξ)xm:BP՚Zt 3H4tڣﻵ( O"= K3? 5>Be}qЫj50Z|Әߐ{/ s> Vdo1Pu^$/CY[ p*Waej`|^Y&ޱs-l[UY#҃Z&wuZ; Vmwdۿݼ`Aݔ;Zx^""&D:r/ Jz(H_V;Gc6Jh-;{M::Y东%<%;~DPRy\ /Ty'kջ)?#X`K1  ]|Ȏ"DPti]Ýn3=@YCC4,sm1𽩻5RʂFQSC4@#U*ڳԪB!jfb:ZU-f6 xr% d\3iv$7$I&M٪G h * +C=ѷoCДth2oiII&hF{ywͷnr%ƶf[Kܕ[sF1HDdf(`` iI#]*jX&_x",Hۗ_`ᡓ A<|l4BR-Ae;W9 >m=Io mm!x#@7-ˉ3O>y򽖾8qYW-UfiH`j w6/he.3(d-qmtmi+Mam9SX%b8jzDH#뱺e dLnZ ZSMvqDxE\_\@b] ܑ푑]/5XQA%CO  *xR%Gs)?Tk,vmqk)#YK>\SY m}nJ&x}R@#ZUo/ ЍojB]lV۩.[Lh?Zo&U+ $al͍Y]u^&;]]uX6l)Dߘt_uG9opߖZmP,'~RV٦T.OiPdE4S$I֪޿=do+M 82-HG 6{ 1:}9(nm9q>AT Z@[%Vp:T-RWdɑ@{Ÿ'QģDͬgR׉/8t+QYD fM3ݹU ~1L_ѸzLxPh ÷̮4ڹ007 u*%o菪j+R NGd=N3t? WRteT8]69d /0$PPNg ٛCpvvV4p N];Èz,m'\!5r:K r^/Qϛmby{"6JǍ/HJ(GXjZZ."gӜXձ88`&dA)*YEgVpѨsUdSԱP]?P JeYyI-Eu"kY?{4.mZ wÝ :f8蟸P uY^CjGݴbE&^tp|*on?~dP0uD(Ê`9o>7mPoryd%2/<Srj YP+HM7O.'ډbg-,״P{npTC`_Q݊N'Ĝ/dRljEvf S,B\—){a+ d3SZhdƞue2]i}3uh㋼J@ʃkNß @ʟqXqD~{cwv=+P)mYWɚ cB*I鯀0|Y%nk*Iz]^"\ jY(x^R }IS_:=G 0ea6ʖ a!֬"c-}'K8<h&(kTEL}ڔxJ鰪.91'="  3.s;] QS~+Ι_ _՚DCrb%Ҡ9qyK:(n:r. ^|_ @9(j LA_/wb+yhT VQI19[ _G.Z|*:+`_\^@FwK០B@}!JZĉn\މD+ҖC,,o5٪ ٬b/LU%@(̷5g+}-*2]\W:tIS~\" f"/,&"69ԆwIg]C6fTaU%L/- AOZd-!8-7zܱ\[)uGMol  KGq>^0O&sf*+zl*d̆ G Bf6 ;&&Jo_ZyrtƮq^tڅV?nҙ[iq^@\y`i UPJb?6)w*?`AwÙ1/4Nub.xWhA"!e#\G{[IB":o0\Vq#/a{3uS;3IE=!81OeK KWX-NViΟxnU$ ;e1(v/D?.nNLS"GUk~>@d_&)4:F[P W.(^Q uLu R_*ӏ6jP A#U GvEŐ3A'pUTPStwcu eFՔܠ$T" W[!RJ/M\8.R%FoJf[GM^b[0cXU sfyT_!2UYF~bTbAxR@mE<(Y(StrMY 8}氅 :f~`?.*_+ нt={FFnƥ3gw,0 [_Q 0U5rdW.Yo|]<> EGR,-T+BɊJP6fi|}uICY ;'i:/S"~v@-Q=N sV $b"+լc l~j;~eؖ=x7 (9T(X8HD\}k|5,5zO]%*6 Ŋ+ du=6IJއheO߁EP-^kkp߳R0xj|;A SҮj'bw5ޝc.@ 4{`cƁ2,Z? yA ]J&*Gqc@7}2pl7 #` >N_݊0Gf_k( ,;;A@f/ 5tBL(Rt0BԀF9{d3kT)7t)04|ab.`F=ѹv2͓\̜5"T828ke|D:". k_?TL,W8^!P1rf~M]Dx6%crR-FY[iTԆKGJ$w=!I$t~>ȵWɱpQ!Zh%&SňϼJV8D7CMP6l$3Efʍ|)V6@k}PpA\KaVöYimXUՂ+=sۿe4 (>j3}d.=T3:k(1Bk r+!e@abWknPlѡȫkD:Ԙi&+(fWu}Ndޜ0|Ca%ΣmN#g= ȱߏ8[^ 'Au>n j/N6Bc`yӃ>Kw8%2NDN1 ;U9!kwa@_XKf WC`9Q69 -u)os#@9('b).: :FpVt$ .CJYRkfi ͆3I< rۦc8Xbfg}(O1KCTNKcn̾`I/{ nDݟ1R >΂JNjQSC##PͰ4o>6(d4@kx 9+ BV Q.i1kLǞ楜$R y1|(b4O@ݚz ԥBBX"k3~W=܄"-_]+|/ݩMa7m~Bh1Lcy:U2N p3e!? /Iuar7$D|%tU0^JߋT_ +bJ|[s"hl@Q#H -r!bWwVZxy&VYx |f(,;K8v^->S^YZ7B@K:` #Zrrw\KFڋH52ff($aH !AIBK2%0$a"# u t2=0-̈k ʞ8ཨ(߾S [s,+i1nk.GLOE͛O9^:PrcTGp"B5574@yL02o SlLvFou݅WdNhWJfpM2xS~$+ ;~W‘sK?rexa<%.ܲ`|^?wS+eAAń[G7Jr+HPd,Qf̾ԓ^G_Ċ{9^wN VrVm^n 1ez{%#Rc?5FቆS% M uiOc HMW gΦ'cvI oi&y]k-m%J!!EaWښ< qj~BpW܎E Skuq^|@p4n'%lg}n`YY2V\TxZ; :-I*(>)~ye=6^3]  4qbCr{<-9XӋ.|h䩟y+hNܽk蘻3ٶ%ߨ0K_^kF3InD -fzlgrXKh~s{:kp\,lYp+˩/8jm{uml^M!D*̍@Ӈ'*|L"FB#0XeZJ gZ9P'~pv Ty&. ;Ta!=q$B\d Gm Ùc1\?C&Q` +HA]qʽu0 SF t,c",{wR{x%-])Ճ=凎Yk:2~XqaPw@[¡Rt Ǚspm>;~Ĉk+eiج幸?@ 5&r ƛDu]%G_Ƀ;*a) _U%ːeZh %m|sS<1pڐxwp "d)P  c9AϺMƜ7 5.s{Fq77Mrq4/t͌˞_`J3:\FpmӮMu0m<(k%½R W\ tϧv;_9u'\z SRϢNȉ^}cw?w 2 % G#Dz@NwsOK{کO'K-AOc-;$CHG\^hLX_u\tQƒFb;.h)Z@Df)> \vVǙq,^AMi]ؖG͋/IB: <ߓVI4dXA\B:bPƟĠdz{iS[+hEK py#;h{lS ~r m6Űu}hÌK!>Ak@%DBY q*b4N|MeiR?bq \,?aH¡v;xM4ʗ:xd`}*[¶jϱKeҗ_xx%|؎R ,'g5ĄԍGUVAYӴ٤ 3D3Uf{ͻswy33LvtYr[jYKr cˍ- Hv+G6 ` (x(V\ 4Uh`e^ܨrġ<ɖxPzFY[$LuEY+?F卲f *\ٳ ͊TC#"n2労ii1O)_Hn Zi1c•YD>51V !x{DvL jQgi2{=zͱf(t!H}*:Abf`6s|fO7|0g5s{#%SE3r%"mᜰYWYMrZ5q{*2*ГYJy}C]|PmOl))&qG5Yj$u[A宖r Pb֕4aңKL0bi!KA!.y=8͆2VuP+:d#z ">0.fi!+ANK,OSBڞ9I 7xҧi[a = h4w+S4]<;2. NJ)*:=Uz{'8B9 VO*'œ '(@o!n8kXi A:8jJJ"`{X I[IYNe߃tϞnsa,cMZ=Ʃ"G!f|m:Hm3΢wtŭ9tHy$gxs@V 驈;B1sﬢXI+̼y=ͤѬUEqRޮP 4%0ϷYB %k>kNrAk q;DHyێi乯dw> iI|촭R~e$Ikr?&IUgӝ2kz%L,; (zK:e2ܾD=$GE1 N]g:GjJhA mQ@\s2 cLҲ-b+ZCj ڢ:IS\%㾇o6׹Bjlwl"P1n{)j 3 FߦD^5:f}Mϥl ʕVn!AݯctR9fkWZn]✨M]Ȍp'MbwO#$ܻ|})0#UB-&:ZBY} RnC68h~DͶ}F>8!:ȯBWnG(&˅R[g[}ug{Ft-J bFk+Lig%`|}0f'vT2tp=ji;fkیDbjVKϡ;L0bݠq̈́gBe8MG~Fr̋ӆ-ę.rdŔ\4E*_yGX'>h} bucX`t)0\06b7_Ewcub5x2&ٽ^3  TQc$z$.[#\4y%HJH'7By݁>g'#ab J}ɵYض- ~5-HN󢌊M/$5kԇ[(coh31בֿTCSD0& c䋿 7J(e)')MjZx|rAHyb1JMtXin1BŞLTO %HudqO'-!LvK_|6t } V(^ -['EItۦtt^ 0"3sdyXRw(ú[N0rl`~'Uµ//EՅ-Up}tc'6] ^'ۦ83.7}0]W1ь1P\j~+zp':&)<])wӱ>ӷj{D]ϝ6ؼun>vP{ɕ@-s*: K\ϾZxJ6w #}]h;hV}g;wjU/k $)u"Kǡ{:7h{COؿ|I҄/b7&zlC`w.PC]FIH:RtUdt| :݀K(nks1dBW8P`2Jq'>>3#P,7Fs\D.NJ)WuS@,|3gr tBi/ʲ ?ʿS-1x'<^qDsm;qb;nՉm!Ƕ)h'0r1j` .9Kf3sq$Ȭ}e^=b&=[p^G}&4W:A-uq{1&@fAc1y_{kh&.ϱXWW'R{r1f𼻦!Ѯr`ʳ Eì$:IKپT&IhZabE*u/PV~g]䂃3>vwڔ&Bpt3m8mc|*HOH /[M)"j-cgqsNzmkmp<u^d"(,ze>p1uJ ?fbQTL# ōlOw6I36\ufϹ2;8iŀ`pn]i~TvDT;|\on/ \z?Pg@U(S겣ݶ# Zfxj^+{}Q|ro)̼hCG\ o~(>s_qdwfi+B/6& Hǀw̨УZ:Ւ4ұq2SΪ&_47wF򕃆K57x= ;$ zУS vn8p\|wWΪ kmC&J툖:FbӯH)DrNuFx+R=J{S/"m)P^cJ ̵&Pa;bحe"σY>xJ}3Z ]7S259D$cc =.,⢦}OK\0qSAy< 62:dGsޟzdi h0an ]7!u@/R*zKJnGK_}22sbc>\;SJ׀> =ݐ> D>=o\Ƶ!m-wZx9 ̈́!;rbeDѤ)ZcV H 0'Thm?T)niTMؙD/<*_$`%4;Ol;]ߓXaL:ұd=O.9@+eh(fRcͣGF$B& m Oʅ-b3IG汘g)YEk6|v0OWʼbi,R(ŒꏨA}_Dƥڇ%&3v X1v6E|/i}=; 4.:-uyҿZ׸ou޵eGnIŧp΀BCצg/)9Y\.tF]pG^KKwz2s^3`3)B7+VxGDg46fÜ jE 5XV߁x;c Bq\s\;X` c~E=q-88;MNRCF5[8UNIa@DJLabE`wq?LAQK&dlek%n3@)!kEFi[]U[cjbnģ3"e wݟ5~z~ + F4`{ z*HM=T= r7F+3dW,c[!E*p3voڬo-=-6l1x5{ OTu65KjfshG7ڹmz,![t蹞. 9 s%~nc>Cr~cݙ͸/ KLT.i{Ss`Arg[C+ *7?;N%1{Sߵ\sW7 9p5"NޑJ9RΜ\1pg~ɆWⲠ;J6wp(Bc䏓"xQX8߆BgbЇh">ԵQɃq_0{Kܱ@Υd7$+N|S^ !BG*y" `鴵1@o+eUSh(hA<2,XdvAl|`KDENG.INXS4yg-ւ!"XНadwlR U&yI!3aȉ{\+צfh蒀*.\B}ᅘ5's9ryIYz ~'0[vOBJ@4ͤeW5r֐NXtW46.؊esc >0=kО?,Gw$"LtN(tZRʬ8x=Ԡd/y#2zlrtV T"+DGbMJ%:[Ei$ s_r\АPޛӗ8ddOwqdA_AcQ? Dcd) `V ^|jB!+r&c Iow8 ҁ/Sxv1*xgzQ-/-v?ʝ;D΍UȥgGR}{L3+RoR#pDnQ3ualt`ĩD\ Bp!T(dV=&S6E} _h5/Ů xd]m=% r8RM5< qyWo'<ȩF.}B\b67jfPKl}AK D] y<:(~0eV.<@/;0YO*1D6s 5U|ouh,9 .ɭzj$y  IBs zgR{W2,})!L1գ da>݃>|_ND)d(]-uhtQ]fl>@iim!j5F+*wZ߆)V b [6*@*h:֤MNr.Q0;xT otDCхV'm;H- mavDm nzWśfvnBӍu_YY@acd=np &mspcLD9GΜ{%Ws:sRTQ?b-0eBUazW&TfjoTaL%~cvJ.C}CD븊 UD$ ?DIO "KVXnPʬx<=BCܝV*~w0\=/ Y-)i|8DN)zTKzocyw0,2?K85OU^P`ۥ\?vc.+~ }8Umw> |WEzH{(QlBon- k qBX*Kօ!X;h-C:s]} bEjB V k+`#y(LϪl xG4c U &/L-7R6!~ok@aÊ$3i0` X_ (bu/$A2gH{A&K A+ԒQ5eXěV8Wu/g>. ӯC2 Ϙo#a6짟c~8p ŀBZ6VzH&fő|É쎖'2IoчPNLMCaPܰrpMaG -L)p=Xt?j"T@Tٲn1T,~E';gP.]7z΀Ϲ!?eu89Tڱ{p oׁܲQz .wq,Y)7IJR%EwxWBiAtAB5z{V`H]`!Lg-1_="yt|b=yBPWȘ4F6RKp}J$&uI\ b"P_f/L\ ogO8YJr-AF?`$~OoT[As*huy8blKmoDnLD]y$=稞1,@N&- O7//ltP+x@zi0^b2K"`EARP>Af9P8Re_zdz I8r(C>54lv+=SOܠRa⥦+qa@S {rQݻ"#ַj@XsnFXr A9v`鄪ڌh0d?.x]7gB;vJq^Us|7)c8!,;s6Ok ʱ ߊeAOf,m_P#|Qxز͌P{-L+*pBjjiS7&Lb%u)Ǯ*N;,S/i6~q&L(b=UW 7N !PDžk{4`DnVh` )0hܱ-jB:`h*9qy䊬߷G#v.>cqS- moN*dzZ}4Tбo6L"F6Gp0%kijۛ0q7X h)0ƒ{j%̛ma=D܎ՙnѲ> ~ G6b8l[zn)Wq~In9*k.nϔ2qle~J/#tY5U @.*eI`'W:D0[_ ÊD^5soy ~sAx}rw]ڒscax`Kw8tPQܺnHW{ٗb{ƪ'\'c񬽽$xmDFbH m0ϸnt'^ZP9 gA8tg{Ъmǹ6}svlÎ8eԏ*9"RfO 9M\ B弐j_\{!z`yVxpacI1;CC)r_u!z;}_vA\ǰk1ia]rbF3WY̍HF<^o12Q:'7HiPDqPM,ԍ迪Ʀ}StYg7?D+"gHbLӱ= u1{ _XcT`;C4@3e>J1nkH鱁Nd}s \쁓 [&/L/&6-AZw!/Ayȃ>Z~}TzQPS(ͤL͙ۺ֖IZmeem?lYARmH$$HjH8sp'@zH|1?eP2OaĞeɐr,ʫCfhǪL<(3 0MH@LcA<aNU.d) *l ~FhUes17h5@?@=]"/2B-דK{V4YrŒ0yC L'OI [x*ŭT-\) %$D qGLhE[ֲ |H'e>= Ǥ-䪷٠'DC&@[̆CZShf"߷yn v'DOsv̪zEL^(&I8Qݧ[L5W!"lGqh0JMeqYjD5'עAZGvJnZA+[bMy`h/VehxZAUbfŖ,dL 㸍ӯ壚^xxeSZi)|EZcZJzVl=0Z#BLQг.T2I4Je;+2])$ ?P('nB)UhyrIo3GUS6k<&AZ1TI2P$Aܴ+]$ Xd卩Y#T āi=ভUdKPo?k][{ZS>]i~.f6Rb]8J?tˉfͳecx2Z+ғ f dhsLՔ5c'BC@e}bq"Pm'6qyTŬO<&C YF`4{BbtMck"$l_.eV>,d3&ȶS ΪWnW4O*\Uu[d%oZEs[)od(VOpfz$-tqAqU"9)F5<4qÐXij9fߣ6IA?dp?xp ;UN?6o @I#.(lZz"pGhfnT<=qy;}FOG9mN)p qF +9BVsn ś7# \J(Q*k$??ARUֹGRCK@Ӂ,MOlfݿ|8MHge͕G4eLFNΤޠCu 1Qls*^PO@7bXXPd'o4 "%|flh(Uf8/wɄ="Wș6 ' 7zWV6E33Lz*䒆};^ %[ wQqIe`{ŨiY&'[%PCRt_]TΰUlݻKR]f%2vI30EjE\F?yҨoG^ۤAL9^ *zqTT֠ Wl_V6,w}//VFk`;ml)}lŏ. 53-܅>: Or*η( і)V7 ƋvƷ߿Бh 1)4鋦u F`j9x?n!m?~V=5•fEӹ}+M f,H$ZvtWϲD}_foe@:}{*+q>j@rB %cp}@Ad'm.1ڒSe; pQ_R)oYu jy?oWZ.3#!Զ >Vva(wP44U.J V=SqfH魭W3Tؽ U3l(r]ݿ&M'Bp65ۋ] P<1:hb,s9۝WXi4=CuuU5A[rJ:rbNSme7HUTO{ MxQ vO5iLH$fjRŠ@mf 8}6&+&9RסpݷiYJ@&8$|RVHZp}lDTsČgA]HrBtV?X f!ٴl"Kq#(Ϫ8AØx5SU07AsȞ}*m]J:DʄH puđ!ej$7IF8]ٲ{S2jQx/?^#섲u% rSC[J`p,OD?͜atXaoÕ]I0en8+p&`TثVɪ**ӄnM 6j<}Q_J7HeUYUŽd.J9sƷ ]Ċ,dAvnėn&RM!n/WNh9`,XR਩"MP; 2O f;]@ ;*1#8D į7p4wA>Z]% ͭ72K%$M:I>w@I,2so0;^ DR=wgk^T[ٱqp,\WM/aWOќh44% B/kFi}RB0px,F].zf 'Y[W}I'3~+hȟLocQh96BOo]ײ#d:rrpI6Q-xN}(}Dέ$-\(1U-ul󁣰5il~sS\yK&n/ͭfo++Cl71¬LXXHhZ<1/`va\)8& se׊"6_7jAJ/_-dV8`2zmt@ӃCxT$n(6bE#]"$21Op^coFz+܅;No7d/.ç}?/X!tcƴk7sOγxZ~֚ж"'ֱaܐ ҵSoA=AlЭ]($oFNuMu.^%0B꘱@].&%PKqX>kl$dE-4@e)7/e=xG9r[^c9BTHqKnRF~{o.}т;# $-'%`L=^49ݪH2<wkIK#B'D;Ϫ!ےYnvV 5]*ݕ@1؜I`k vj}nP.O+qd'NF:rgv-u?'oA=s|W+r3M#EDn~g֠'8& Q 7C-5twTwW62M_qŸ%ƈsV)F:a%Aџ`sFFL5_'lGX<#䲓ƀg(3LJ31Ȫ,Y1L~~&k#t+q[$i^Ia;9wEi3>7[{\[M:Ȁ=R6&᥉Y["Ir>!,fYϷ7=@r7vkD7gLDAnٞcyaJ72cXu쥮nXUyϦ[KThka;qDoKHq,;|iAň;q 1HBI(ݲey6q|Pù&zz2v-:_ks"QS^i\c`4q/ަ>,YѰzAQ -kǽY#)=(!`tI=b]`v r2Wh:@ƚW{t/pp$퉢"S9uΔ:,s[ĴN Fg'Quu%n87F%: 䜈>_8ò)nbTm8g;9?O8l7U5EMWBZ8WGyh\4 nNޑ*ϰaϫA~¼VP&1YS+qOSh9xN`$ÓSOt jv+i噙 MKʏUƉ&dGC]􉐘eve7Sڷ}I =sY&X=\IȬlc'Ѧδ7 _u{)N3˅uϑ={7 ț3켡}9)9t/_@ڤG9nw'9P[*O͊'Z`q6I&1'qb.B-/u^g';5v} oYn:-k `92s+-v J{Nȅp n6oPѿ_ A4)=nX%Jʹ7a 5f#Q!~;Iyy-*9* zSlvbHZ/AFdv JΝr!iGT\eBtg̲#PpktSr~dxeu5+.SDt{2:!4< JZ'-Woo=x@YVٮ ]Ҽx)XU-%:BbZXXv`MDtt[hGu^ܶ(\]]orOKb6XCtnA.$nOk_~ŕ8y@""G{\7Z&^1měb,$ 0c4r#l̫aB X]\evQLXi^ 333Yϣy&,?Uzy]svj K2иąolv.+UwǗ+tUF,g,BStYIUD_)rš*JJA8%G.'~*TsTE00F%MKn͜T:-q-~I-xX"h6HM/˖SrT;f*ZCs۩DJ·xdHуK-A3cMR0%V~{JqZ0iiDZ.E;fOw 6Y$EWl4lxC)GK5v͟0~ߖՆR5 ԶsME 1IpXmre*#KaӍ7-_)KD1}=PtG<4i񴬩]?Gbl*ڇ,T*F32O 1DC ?],$/P5f6d8t~Ry%o_3z\nO# :LX(Nج\$)?o+ݸ VS!.Ʋ. iT~}x#pFNEkv&$ ^ ׍}lSɛ^ sB3iM>JtmRԂ9 ;>Pm'o}S O[쥨H~-뚈ZA/^1WO]EH'[2hdvcv4lO;ҳ~e(IL_Jf&[ &`&h;YjT&tV'n,ʧ 'Ạ8mܶQYըRQ8+,ۼ<-;6?f4۪ q{vϏʆg_p~-⥈#<+-{Y2V75s[6`d'9iBD1o.XVLKc!iHCH4i#hfִocr\45Cq2طZ;ݧ_cMF BfGdpo}8xLB,~;x8oK[R}&/W]yؤy!Bhx@Q07{eimiL47ڵzSx$S]h\:o-/miٳTEj5休ĝ59A@Q&)֞1*|>#J~߃h80T)A;3\sav [)Km\UgS5%.Rʚ]h=\hiZO2*Jg+Vk0QCa Ll"lkgo6APQ[6i'GFa aNOhu'#GǾkaP@t`k(9ak*gFSu)Ղ %gm@ "厁P3Z>:T! kl&ɗ~WȠnz$b3P xsGś'=7"ClF#iO#}BƐ ׉z`wZ..1@o^9? 7v&5;"_wBwlQv#HC=1ji dVq;tbYZh9env|"X227_[bl g(ۘXۇg齤לW)_\r'Imʂ/]JC+HeӣI)?hk_e_J>ȕM*,nͳo d,j` Z*aW$H^Ud! vf0fK9I^0ݪ4}=+eU2oϕl,/4H1{Z$]Ѿe]1}400+8$Zx J\T^Xva C!2*_X .ә/;Ta uJf0޺$/Ro vzɨsk2G$\B{ĭ(WL<1`BNeeE"B4 _cPsj51葟7Wry/˞HZoJ>(V ޳Ly+{ /yF0u#<[a6W~[F˗[gFG9cIWAz긺hLY*]g{rlm*5?y?QyQpլDT-ㆻSZ@}X\LnL7'mWdϥwEYV8R"xۃiu>燯?DHA[`;t\xCSP#oebYͫfIƒ[2'ge#t!-W)#!"d.̥߹f6L;&6˪mrW)yPU}zi*=Z?=}D*ВIHw8y͹ڮwe@[ڭkFi&i9"i4Ir$ZI)}} 5[m>.QhhtYC><?"[K;"fu`А98gJs ǃ?R cA F?{s 0F)28qZ$8i.'cP )"yLKi^0$o{-Y;(uϊܝ67}|#{~s}>:GF {Z؇;;=>qiNJT*lP\_mRi( hIP-~7k ;JmM$NEգ֜T)~<r݌X*]?ڽI3R;˄ hCR޽N(Ժ9F8ps4`8sp(l^C_ACD< b* Ù=йԔv=c *,wfcP{L߯CFX52IY9)0&R`ǧm$b9cc 2S s@rXSؙDϴy*v^@ & . 0;#i2J/$1|)QCb6Mו{`i27er// AC-ͫDQiJ!yHpl(]2jWG 4Y!8^IisZܫ5$Y,Z@h!q~@3PXiK,nU?7R66CJfHV"L c#hhZ`7*pa9 voasJ?S&@+st" cj%ܤV^J Tu>/Ix]GtΟvFagPJi rvB1||ڦmJ@!p~Xer,HV1 x< MI-7*N  Or!VE. TO%  Ο퍮 E]`0P[Hpz-&ڀ$Ѿz$[nxZM\ ;{Nꊗh$Wag"n9{C^\YWbԟ819,}kWsLH|Y /9 G@N@ZCa Bko`8$bEY@ ס.AM*.  ^ʾ!Z>X*YE[SJӗ6\ %BRd<]xj4@<}#AqVdbԼvRbNQ XBP.щEiԣaB%2R ճfV} L_OToB* O՗:`v,ZOQcS~~Ԧ^DPerw[#"SVWפR \BU=-9mNK\B5ztqţ8C%E4š(kL;+p9ߥAϞ9](} ;(? $2/?7 F|CW7Z Ƕ`cBbGbj )G3;7gY\||Qp r&$ۋ?Y\U" aCo*Ȁ">,xIJqXev6Kϕ?.ڷ@I&-nJB~x)Bh { KTV4SOxMC,vd'ke˭,uq\-,\=<\DRfNńEWc>pKuJDnt[HҩFS_dG&V'ʟB"7/hS L9@RW+/  FL8{ ILZY\ݫQܖ4ĸ,>0MHť +gTsqRKX |Xe@]Ka(L玓50UHE` ,`$ UfyP?JtZ|& ]j S}/7A>Qu+Z3}FXܽő`;?p.{Dbhٶ~vweNy G>dNl/OMaW]w5eYqԇpWP+[+Y \H52Ta͎ 9kL.Q&G7\ T kduN|][#ÖT< H;КRK(K*L'QCdZqzuOz .c4/_Ѿj.KΗîI_U>ac"͠ wyGekkm('F~͜+(>.7`V@c][_UG~BZz6ZS5YT)+5̰y\4yD!Uct94y"P޶R M?}3IRa@rM6c^3lX!=vW|d﷕+s2i@%YmrV"Is eI7>C*+kKJ?B2)  C!VLgeCFvK@+dq5;-)9rN<ȃWߧť۔ͰL~p9k| E6 %[z6;X䏑kQj͂̚_B2L*?G{&*!HW"rv<35&e!#SD)}/%qǯyogqT6N=voXbYh4>ԤDue?T mD`K.cQآ*zz}lp3BY+#e5U$ű"UzryB/o9s`TdtN=t>u#1a(Guc2kwcC P.=SXoG#<Ɠwm!EMynm?6K)?QvLvӞɍ&%=xzs"5j9o~I|v!+< H[jy/4yi(1n;zxvϮ#?{%;>#EmZNJ=0_re\Aq:l{|W5X_Z}D3od l! LxE/Ϣj{7)!_V%A%eB.s{]e&/dG,o1@7 -e]m~9<9I,_Vb13= WɊ@,Infiu;[dUZ._ Z/TX֞R}]ѡT⪤xL]MצdV"%P+[&ˆ$G^ۼц }{6ȷ뚦5]˜?yȯ#.b[hTdM]9ulwx;x>uuht-z 3F wT/5ijŒeZ~ᅹZNi^yF(- Z,gZgWF8~JڦM-40itDAd|rvYt1rD"\3N_2Jb5tH*CђʆZ,Մa ;? vʨ2k>o/Ȋ2I2ݴl**ڣgCDUWog~ye0;ʝv*7 B.UXe 16}j$j ŀP RJ70DL^Y]331M<3l9qw?$V¬<B! *w:eVxS>(H]B  ˹~$|K _mwW{Ru{\Teu [ a+*/{SCctof?_Y'(m)u|kh`WA&+"w,LQBθggՉ_8b:;xĿR71F_я#l(sjH&SƝ"M#RsI_D4JԾ m}1D2u4XWaI9=ڋ)t+ǐDGL- ,CjN|[|JrU%Z"ͽ?legN ֬= x&%bϯnҵW.Uء-A+ 2^-NdnFW 4TE,pWC].lq[Ұ5(6-R~7Vי qlZ&JAPwўYrf)>&;r,mSRk̯o 񈓞ragZ>D%z^:bVatXO5e4ғ WguiBj04nT!/r6cNë<kQ}(·\N`MBkވCj2K-GditoTs` 02 ޣ}Ш#΢nt3v9͹u. T}i%7pFoR=ۓ[:-%d5pE?^9HؖQk`a*ZxY׊ N@O{ on LTwܵvv-2څK)k!}`˛_'_ lê{vyQ8 uy5UH I1dI VmX d>͓{\\Fo>65$vb}}۴H `Ռ=Ǔ@ %3 rD)ocѸ\I="9R4ː4tc5u]8;sqNdɏMH=:׻76gx% =-sVb<i![ұ-S1 P,I6z5w8ohcZ \\o0/MqbQ0x fy pHsQ`-9\spjfɧ||ɺxDRVR#+8kX]Off^W 3ekilSB xOlڨ /vϸyKJǘ"Bk S%H0ē2T˩@vj:^ctHӲwݴa 2"^Si VZ.|bCwt]yUӟ08:/?G8E4|f?nQYcezf՘ XB^mRҜ+MN_m"w-b81`Q7.et,6Hq.ϲ +Jj t)_Z?s+['+U j0k-u Tzr7o%RC]tMk"t%%{k^Y 6r˳pַy $,MMyrkkE ~('3HĐ2f_efb8{8ew6K>mѕ{'._ 5{dݐfEmk<~t!=lad1fFF8{0q,GnV̚1i85`O`t3 'u-/k (20R=t^%fX#utǺ0Xn bq+I\>l< ՌD} A6q}$ߋ}jdN=92 D ϑg3*hˤ@h98 "%i9o%zw3u.-.Pb]Ԁnd?̭͟Nߚ:̫Hui.504hӈwO18$/!ښ%ř4 p~Itjvc}kIİ4hci~6 }f19,.VC-ddiDIL?ZZs,>`cB牊xɦ"{Ie /*W*HJ= 轐]* x,R)V.Zo[abCVBcvc:5i.x!GQ"-┴`V 9rd-?j_`pGQ.L eܘ->j1(tn?e0WBE.+ܾ[j;"P`׈I#Wڱ ׸1 B}Jsˏrljq uKEeoBo:[rh)ӌ*BK~g`X))ӡ9]Ni)0beRcd kNhmF;3OMNj2*nBNk20$g~d>꿦ƲP\{CB5ˑJd&޾y ^7o쾅G:YH lmEkM #ǭ^S8gDMGh8MS̮U1791PM,{3t  ߩa4!@w?3-ocqMn$Y'}47u85#,ŁO-ؖH3>)4- _m/7.cڿˆ yB&8?Hh^Ӌ-j@vʺ q.~,T&?~HΑƖR&1 )|^;ۇkXi]I{J3U+hUGgK _h`N?0 ^oA}zOEŎQSgbÍ:w?F0ACN-'m,+F%R [`6̻-%4p oـdKBi#$sA4 X:5\^Naa,i.e];HZb7fm+8)ޱ.AgOr {.Sar#itY?ibf3-C>=aʋ50b<ҟV-&=ঢ়Y`Fm& {! LѲp{n0V(v Bȃ ?p\A3߶;=aohnٖs>\s-U(eU 2Fƥ1T!0 ! NYS6<$K4}p"&J:;QtKgl NpB7W:TG1V.Tݳ&?!!oĚJkWCKw*3qTY7AH n V]J?f1 #p*6ձZQ)c7"7 ⴉM~m;N RL x`GBLG(h4Bﮖ•h6EڠDxGi=z2jvfIT!:=M 1e> 5$W~Cx@Wkn70H{-bbt BDT7v3.\;xox|#\S|]>09٫-c^$)QO^B^23~gdg yhp(gU^5fپr ,B40jHͥ;$W('ȡiyd# d͒gNoCDUo= )>Mz Ye8-EWM ¼9ܷ1޳EhRCa z>*(ێřPRlofM\Se|Pۖ>٨ǼH)4.ȿñzejS*̸79'B@PcIkv"8tQV$"۞Gv"s+hc 7J4L6S̄U?DFM D<g(9]Wvbò_PV9Տcs@r)>_!We3G>Jֺ{*eEɦS!F C1{TZ0!OB4g^a bO GfLpNb!@"HVۘKԏH@lM v-z]ǃ}a{Tx_#?o-0$æ7HmEܗAoS`:Fjf};4+1z|tPM8rFU >HѲC%n݊Fu i(%SCіT տH{oM@5ɼUCi!|{MD}rF:k/^"dWȣ@X;=nK6B]An b2ilM:;Ѥg_kmeeX;E쌫N$J=ן7JG}D蠩Xқ4PvcB~4.J00lӄӏ1L!6'gG y,-uPxιon]| gM5Gj7F }-otKs/>6D땤?F9Ss[HUnsP1bI葝?}+h93 o#-QsF<0 E NP1dp.DŽ *z}&kV}B45wR"KmQ(nۦD~+V*sFs^Ams$3B:էruZYTVstxo,2nWn;ziO֐x4OwJqYBF@Urlaiyq}”n$q)Yl&owlK# unҭ5;FmL/Eu,O,ߔϏOUp*Za$GvV tQPS.{p-hY˸옑tŷF~F`yg|xIxwt"Hu@nS`[W opM0JEĒV GOpX ,ʶMՓ&1!7B ]SJD>91 |#Ӝ1` l=o9PDK808v*|1^]!s_T!lh,'a QL1'(5lS#X[.d)Υ~dٹ6zdD"`i'}00s^v?^)G@Bg%/tIG(b߾ /{|f5Ъ@f/P:oqTbID$p.HC Y@<#~A,]#{&N7 >/?Lh ]jBu2]W3(n =@xТ6hRT@2=i^/}SZ$ɭklg $L3FPz(v޽' RВ)VDPcl_-fJ  Fm7ͬ%`f <[JU2JI:3QcBG0ؓv.$C+{`YpBg0r̓oH7 iDŪZ=T1zDC~O"4$%͒o x "Nr p*I:^8j C`5ú"Dch4'i@i(!iN~GAA矷Xl3T95RbPR)>Pdh929zyU~)j9ZkxzHT\1\Ғ&V JQp  gk݊I2Ʃb>lP1ŔJҍj'k; @6y7)ǘgU{Nc6X<1cp-X,1Ϫcu S}AIܘ|;nyBcaLha5#+A!`/}'xFHF d*ЋzN_lTLEv*mo`s`QW6YcrQn uIriPDձ"/wÅ-ăh =B@ت=ŝ*_ 8D} \IXObzՌ/>?qXт]+_|;5T5syOX\xy2]$ZshKewWG֧dtvQ FQ~PdI[tNZq8 ͬ41{x^*Z_;"Q_L#^PsDA%FHK"Hka }QE;+4 shg?1$Y. 7I>8}gR43NDŰ 30,«p?Z.h&q(^iE{N=<- Q(Hm;>oe(HBC ~񻋄à/6 W"?CZOPyυ46Z]PheE\] lm5P6EXkmt[¥eǰrJW3nhwwS[9^֞%GM5*/Ϲx6G)7lJ:tO 4L5r(;݄_CgTUB=Jups02Z]wڎӅADLGˮy #tƐ>"*$ X.lm ^p}=Ōt ZTdh*uxkr@"in7-\%)^&WOVSKΩ=I1)BDYV,pz>$"D|cߪz},,ʁW%*TֆѢlN:GaQ^ye-Lfq!^ng8%PjXqf7^* *fSz])斮6V=7g9g0SWҶyqlo-ݥoXg"*w4^-' g҅"LT*p WANorwz /]薴~X?7߮'+CBف,Q ihZme0IZMJ#u}E9`2f\B[j_‚v[2徖\%"RrGҵR ) N6浂uq@FG: Gxbp,J>bu64AE+u2r)4}C2ephG 7~EQ>J,`d& Vc:ƺ":w>I:~KQ:>³B?לv/Aq9)\|M ZIf&KN[ؗD$+r@ [*9{g(5=j ȥt8.HyʷIbj.%2()-}2!OI-wdv$KCi[.|@C({CsE\)uݭ[2G7YCZ"ug1ynjS "0eɜa'SFa% ~>e.T)E]~5-q Z,TNU`B@{Xe͆ +q)_ҳٌ SLGD*zև77T5L_hW|`QA 6/G;ueXQ20ԯӢΜ~U/$KY'FUr9C_zÄN`$:fSv{ aԟK/(N0,i@׵^m^^vB29/)*dFt | P ݷ/_+Z9o"f=<)?u>%ywU 1W~c苡1V~{'/~ KqŮwJ㨢6`Bv!?Vmp>WCNj;~?~L7nt?m Hv`[P `Ox+ZzN[gm27*="J|z.,<]QВ>6G.BLVoZO$*( DU0RG¿ddi:1F$inW:GMSŽ9dFQw0^!%m ͼl'4M`?7TYywId=dh@z%_DlhΎ.PiMP>!iAu!(ܟ}+xJ&dt[m.+z`/`8N6 1[116a:}bKVsјәL7gCR:@v#δ !;Ĉ\E{;W=(4qf'rY.3t@Ma-"&|1/z`^VpfzyobOd79\".N DЇ bә9Pr,5T6@pe>=r*PlhoJs{Vҽ+%GvvT!D58{ۺ!գ~P$^}"=A$*jQin_YXwp’JT ;Cf^Th3 ЮK%^L4Z*ME:cF:j!D(8%`czL+Aj%T﹭i %0vd.=P+[ERfZ2Jhg!z_j)Z"[ (nw+n Ql9]_bdzG |}Ȱ0Cpkeu6Vܮ鷷$ԕ(U?h6% 2= utjVcBTvdtTf2¬vUXnb95,1s2[L.LWϼ|u2^Ge>i!}pmfTFվpλ z,nb0"ӤuIBޤ[+2G0t|zFN]t3Ȇ |n&+2$SEW#f"W[CxG*|T'KPk-d;>a'a[PhFo[!y,qa;z֢ꗻٞ6PLᤏƠ)4e)WJ z?"KG~ }*Љpt\rJ7gݗ(Wq &~<]d Jρ@BAݧ/>'ǵvD֊8D5nߴؑ`%*;qЕ<3SI)DFeR|Ob>W&e= WK\(jJbY g^mFUD{fSYF9w33:6bՍuc]pr:s؊nxT!. hafK]C`GR\JUĉ#] #"q*p#Ȥ]t$5C8%k'/%#h>gpYͺ [ ܻ]̣~3~5J3$1!OYN|>"`FՔs =|%?=LXz,:#btM[+ }ū,OΔ7CuBIvA7[*e"kĹÎ tGk{) [7/ÆQ"2BU5?zW! CdĸX`Q5`K:R޾7?"h6#sh%EKЍJL>qҰ07!F,%4Zo cR:)xNDSVNp#Byq$烬MX.q*:׏6o[?LI4;d Npt]/H0,"}={-%s|W+,?:ƝEt}^*W ;F&k;i}drB]Ʊ7"W Q~~,$hB-˳><5SL\)x j, *4B΁L~Pg~΃Z29s !FsJ%Ft*R:b[Oɘ!l☱VC-}M5/w]_S)"f(_X$eíqa(c"؇xkMND'ng1b/fM܏ȓ\8d=hXrw:WFOZ&F i W\eGbnt_`e-Lݢ=QǀGI-$%68[4"Ls \z CYqD}`_מ*xijU.EaEK%Oz_&s$H[}Ŷ& E2PG){VO[Zm)'b|Q2 ܇ ! D#RYA[W>r|5Jh x..D)Ig l-ýNϲ cvDI7yA[+a.2tka_7l4g-#p_}_Uqd";Ze{(Ti[X@~B8.ş* dBhK|)=.Ԭ4AW G$5[$}A5]qȮkld2 X(ֲDYm WpaR3` $iY^˸w>@2hoI> D> Gkh*!2ڲtI衕 th$9#FrBM'F|I= 1B# Ҷ1*% F$DsHf '5Y S*dK"w@ȏ|g"Pg[B2XIifB#NJ>.(J-צ5{**[z cPLH0O s%V/M!:ckL-aܶ%)>찙ZD?V92w67gԋ\(ҐQŴ$-DI?SƄFې.6M"jS,Kt6s;?$gT팕9TRW[|P PI ׏sb㶵onytw!BӜS_)rxB랳j '\Uu;_ہ+1xQC-7eXxSj~?qԺ⪮r4˘px=ѝ<_#R!Smy[t a]>fݩ~7|-&",׭|`\W98/˖24!$zSV~yߩ%Je7+<;M#2jCM)uaP_ 8?Qs>H3/V}^>Mσo7@@$ZA⢺?dP%r"lrΟEɭV}~kѼQ*JVw?mBF\ ! ཱF_ (DsikzJf蛵$aR$w䂳ouϳV=cFa +߶"]GBcI29,5 ZnKpTBd'F#eH5>6E徭Ʋb!9ow)6Dks`۵W 8VΘ^r6/Ȳ%㜫P;Uh*~& {)p}ڮ&;A>/(@n"Lc郶6=%|-_O{ ԚWY1;ܚlB`3ܓHwS>@*%c¬<n~GA؋m>:R4abcvk=k4wN QտknݕƿW8칅Dco=?jȅ}>/)tO?κ\;KJKF$ήab.rЬ\3nP'w[Y[ݰ_WV(~7h-V2_@%bxlׅx#12]%A :!\AI2|" !ގL=q:)8T]dѶ)BIv_`a%wA,U-s}YjS:3cqs2wh9E (Me0R^0r JJd .(Xo>\U,;vKMUvF ])~sWøHU81`kY{U}O $xJ`iNY[ѱ 녓m;MlAe?#cP۸h^]j1*i`V8;˕wM+}ʯ@[S< ?>!$=/&$F1Ff*X00^-WYoyetJQ8L}TMU(l% 6um]z\B<6[q_YjBCo /E^ sseNt[dvǵgR\Ox~C ,/lz%@ӑǃq 3ȶzЇap\qv>#-*C+f܀X SvR8g+.ǬRm_:WMTrRkn -ro9#NHݤx(+ZI.i~fg֗:0@ 9ߗY\~cz"v.+#:^bHMd45nuO>)o@ߗ5gFSu7~UT!֫3LfjlqD9y&BbpAc@Le0"}l6N^+)[h|CTP#oe4ڟ5f9sN1IZVIM [+[?\?I(g{uɖ''$<緉us-4tlyzy Y;%$NŵmXoO91#\Y8ۙIUf38B0}ԋ4g93 s(q45or25VXdtNZS6t 2IŃ!Ъıp̙]3`63"Ƕx^'OY\1 ZrN^Yt@k@:I`LB&ʉ鏤dyTE0N*S 7C~hJ&8dbwsaY#us16},h<Z;w=ߓL jj NA m : 6?ywh3bj\*0V|lyY  P#LP JsJ 5K0!7DpQZ0Gۆ5LJfCyJD_{e:3M?~BS2ZެSΩ0?˯E_3)R2LI1#FMz(aloLZuf9 n+~Px,bW~FNKQwj(3qJ% gX2wmR\dzk ^bŻh&ѡ d\pvJټNqcUKW7i`RL@;Tw# ].9m:ou9|h/`#J_ѵfRkj˸=<h#X='#܆$.aMXuXts[rnǍG6=ʭ6Շe Fm-9S~d\P: U0;o0Fcڙ O4lOP~ԕyIY1%<*Ëw}5Ry<4\/!V"zh/ljCЕ/*&m@[zW9#W%-e]l3#Ƒ3y>g'd_kDt[E}͝@ںHoѮ{nnR~%T4߬" Ȣ `-2 ˼I.tӞ`!_~O52mvF~Sɶ.VIq[rZȽZEjl=w5WKDު?>K"_A.C/Yk}n682A(-!ϋ%Z,"o_UsogsHw%O1T2hNuV{َO?tfm-m[P'(QnN1>xsLը.:JG[qsG(+=PvTpJE0DBla_CA)FĶNFb&%z\=qw){Qk.hĢ˼YrZ wb)iRs bu0վ&3wvѓ*멓8]Ǵ*=↞&]=fLD̥U$KSaHd:8jOUi TWq1y˿(u޿̘/I^2O,꒸gA W !tkU(8EYZW;F)?G (ݽEv8x'DEӾ}[ }C% B,5҃V#pU7bK_2D"uH.l$h`JҠwpbaG "d|A͡7?IS4ŷNƯ܌Q>$g:\ pt:0O}=gHZ 5t+BYs7OY>*}a'+xoo;%oGUﳴ.{J6X=$^k7F gvs@H-I>ah8BӸSNaA5Rۼ;pI85ed2,ȟMr9)g\@'kS'ʚ\FM4`a_TjWA 'ؾU p VF95'"-EIkKF*2;x*Q{)DMTe{jmezWopsvzp !fF_Q=8:@%A-{~0ZaQl@eƾ`*iwwX̀f`z? 1tF^zK;CzyyB_ɗz8 V*Ո¥s[aACT[X<L΁I. kr Z!Lj7Ujά)iaᦞKs1_8\4Y$<mdO٫hɫ)cEi|9#@vwkzwe!E458cBvͤ(%Lu6@UhMdo6R*ѣ\^Uʴt#Biy-''A'+t@wϫr!$h=K<[hKxs$(^?Uo-E#^}[svq"ϙZJmb#Oz@".>ruʶ5>,$@K]_:<:g~' #[-ÔN&s+Ne1 8@C D9;M4F:ȘEE,9 .7#)OjYnOBU;"Qg╘OVs ^gaC`&I*E$ ]RsQ&KN:l|2*jfGBdvrW*`džԤ{+5vCue/V5z}-)%CE(A)j9! S+E}OL~gu : )>%#9WӤՙȮ}S өP k^<%^hSܾo%8GYgr-#*xTo{&temYwYH޲,#88,XCb$#E$UMy2&(l.Xܛ1ˈ^ݦu2 # '*]V\7$ǻ[Of|JG)=;*чVfᏔLK`Fk _)^6_u77(MNJ)-5>kO.mUZf.=#$>)Cf|:`@g~L;ϝKvܩٳs$@3q] ZgWD@$tZ `-ПR#.HΟ)%_3ѡe܁NOJ+3_[ oBA XY?Y%_Ss0vD34Ɉ=Yo`kx;,L*?FRYT.Hbz}em}eMS+E}A'*r Kh-WHcr>75!0]/h4!Q G" KH՛}/-2lz}˲jwؤA6 d[`.,]RT%K|D#e6+O kui}澠˶ / ܿ^s2ꤎ[h_])W=.ozRUnb54Zr]<ڷ8>ˌA’\TFaZ,P_ f"Z`\ǧ˼GS^=>ݿS]8cǽtlկj#Ӝf'F&k cA/H\.sAf)kx_P:j0f.5(,eFm>=)-lY`f]37|S<^=4pNsP!t79"mkL>--clt-|5 70݌t]//h\(4>[FT?LhK˚fAüH='ZXCdVhV20z6 F;i~}8 JܴPqfEgRY?:lQOr'HۋP`D4A~\-"|K?5H$ɎB!#&+ l,XxkEʀ.,fk1aGpFt)-׺p6~XdMbne؛LPld%\MyJj }VB.*7J7=Ɋ.@f!/:+R8ϥꕽkǼl [,i[5;MK~,cU[֖RhNR"H֮[ c{pL32ZwAt *i57eKv᪕9NJe* 4XƟ4u]Lg gn\vE3Stv+ 6Nihq+RI=rF'(~1f>rjoh_~Q?R)1X9`Qga{5~Dש~Be"ye][aah7?{ rtkx~sX9@>)m,?huW C! oeX[ot>rCAӵ38-t 3MlC-G kpC,>ar (q.F/zվf~pv{ ܫ`:g>_pPhv2g+mcAP!> (p)x`󮘮SC˅A(:Fv'{Ryܜqے݄*Qe7v{@ X2"GQCKd $Vx=iKIT@}ӥup|BcFHGFsBwJpW\U P68cu0[8`0Cv2+YyޫSEDl|9Hal?h9;Z"gwX.ݳa_"ba,DT]o:=sSZt{r5$4%HX#͖gJ 㡇$΀o,sw~qVǵ6i'ek*+۾tGO0fJ!?\Ջm 74WiY]iG}Ȟm\vZ)aCů)3Îb9ݸX.ijbiSOn5&prQiʀHP( b^qF01ҔVg Be/#]Ճz)[hJƉ)Y6;>ZѩLUtX/+:]V̄W0CPld7))vF@~Э: 囩^8_M1m>*wc[n"d@an=#`8BR/Y`Lpw"l*Vα]v? \L{WԘm_HĊ݇4an81D!wi/̛Ѓ|-5w "3Eڵ/\.6.׏c#,6|,4*%pپ`fg_9AȦ0i;_(l3Gno_? 09*~.*&&F-;zYuBO$'f,hGn^,S-ͶjGV.x  Siip4_I֌9=ԝ^! v8lw"w SJó=9;pvMh ( L\K^WEޣfK[" kgb1žnB}mA~Wʧ0[\ۋ"I^;e=D(հF8!̴rs,ԀxT si 汀_ܭW7#P@DX*8[ȓH`V@I@\o+0keSDJ8 7G/__2@B\p_l^}MbQM=kIyyH3e`Cr_3934E9'j:S%QQ>Aj[قy,]qoKa5qoxhe$)v~i~ɉ#BƠpuz[,g੉AYc_6YNZF̬:nV+4`$^T?$RP;!*R;(69#(3'68/gerMʲJ(/-͓Q=.%EnDʟ]숄c"D"V|$ !3E2c#Y"Ovbe#,ܛ)HN"x f6TaS؎Sl6:64]]Pќl7'm崛A 29y| & ÂvN0A>5SinB;` Pv`@S9AĘv!:5T >^˟EՁXQ>N.()'!*Жn%6rS|cv):!,U j/'Js:. lג?\RMl \f¿ji]g>8dfpph弽R?Y_cn uzh'Pfe⇂)J{Ҡ>$L6X:ɅE Rw4d5v zd<_gd±~!(ya '"c ޠ[I 6Ki64߱n8?acyVOFxONHNXί# q*e}3{yv22P4&s (>!ygT_âѽ{<~ K_4:8u[׈ؘX~7u8&1F}ȳI]c~dJ4MljqbT5i~H 7 = R&xw*PS8@R3qE4] P$jfm|Ou}tT\ٽ"HPok+ȡG qwjNx]ln3aR /p3KF}`%l 6ޱ '3y$CHd~lq?4i>>;gZR<4R7p Xy*ȸnb-'Axj$[[_P֨k4w'XP DyHJ>P*k$9pnnyVJcΣ ATҗ@DZ+GAi=&ٱxpTܗKF{|.SY̭lҳ=Y?7шW>Ҥշ׹T=N^i8ש1#cH`vcE,ɤ5iS,EA'qEIˁ#R=#^ڿVBɼ@lY]C_ 8{Rphf'z|i6~hauR.Q0ޱk7~KTPheq%7y'GspBLb)?I|L4\dW1FCBeґiB{S ƃ[#'LFbVOrgf{F l=@Eh~oDJ#FʓH䄂"/A?OxPpz>qk7$6CWHk~# ~l?fTv ߮S:Φ18Zn H |qQ&: }[XP('8DRO4IC +|Ԭ0Fh1;^&4O? Digc]NDSgl}DMb`TYy-'B' [?H_7c%SAZ0BvTXzO +BңhԖ!K WX)G.PU)hU3}7g?y=*pC!Lv1 vEבR FָFp1,eyn[.6Ȫr󌈕55hNϬj 3be `~(Ū˛~53BjGSZ񤕨OV'|.߶mTd= E *k IEQ{ {%ơbHpshS1xDD vH3wfF|k;R~Hz&*z 6HV"Az{:h8H& z[*ƫn\v@N:>+OɀlFkj'icݲ7Ɏ?pN rn{’x[u%<[3D@2oebYQ,]$Ymcnp,+ {]UC3X?߀"(055vM&3KLmM$4QRU1- I ST1Bq@){&/#CrxsGEDc;ǖ+Py6lN$ ' DŋND-T ʢ&pHLSLLb6` BedTPuleP'?ɏEhM$HLH*QFTZ4gp'j{ 0N sȡUUp P$0UwK-Sǒc4O$`?c~=nã kЈE5 vŚI̯$1bSxJ`W^tb"ܹE ArN 4j]&V`*)+Λ|xI跄co"?E}*3ElYT b凲9.ę)a6bT4w>hqϣ2$;ͬ'l]b+\׎/~ U&]$aSs #IYl>'Œm:&Pug8g^CSQ-GGb %VP\ʕ"NZ<ɪsL)7[?=j:ÚgOn"LWfZܖz%gDv, oC$d31X>O UQ;4f?HKuΥn א&(u穱:MkKSu1+nL7N:ւX+YGĈq'kmq}ڱ|. KJZu V3S#k9T2q5ut.AB0DpVƲ3i7,y0?wP6TY$W .i?$4}\ GJ*F"y:9q1_ ȹFxhC)9IsxIXPЭݤ6/#CLNT2+ЊuC)FA); @ ՏV3*ߋTrnҧjj7jGއ_@۸g@Es)A[%ʴ]- +)= UɪUG(GlT@7Q J漮zEkvkޝHp]'`a VsjQ8+8Y&N|iV]yv'ҋ0%?[7}X!i";矲0k>p" U{ԁ*iĢ `|r/goIܚp͢!Y** ued1xsnSM sU^BG=TlY<~3\bs!&tIxV,MΦ U#ng]Kc;P&W+eQNiF:X5|JxIHz/$9:hc$@fKB?AZj.';+ݺd qdʿ+ևBͬ*C/gں<Ć|QK|dS8щ =9!pOiNilbQ/ad^K S"WhK٫kTJZjg'5PgIT|;./-t/).ɸdIsE5푆J9&yp\F uqnB]Mu Ոy)>ά^ҫ%XPhq'+ N2EbΘXP^4;D]stE{yc̰~+@e݇I ">֪۫,恊Ϋjiܺ8@ :UBW /uυ< '@ 8sWfRu~tO:2hp[({?;(fFXrL!=LδEi~^=a8ځnM {߶j~ @MWw17eTtpk< ݭY] g/'bl0PYJf'-=%lþߴ4 M\_0z=+0pB/tMNJZbSf=ن&"g*+4p*a13SpPTz٠!ZM$:R&{폼 d0M܃=҂ND$4sDKotczչXdF$6*Oݟ.\*?^.nq/w`! wY?]v"!zϚ48b)MȡGZ' 5L]Q>%nwN,"\*s,I+qG %^B,x66ÉZ1C6W^??: w Mߓ2g8U0 0|@ItOn1D⍦CH10Wkh*Vh=).KoGr![\,A,h7] -\su$F&JNGVChp3L$bcgo=Z̉iL $b)g´0! )9q*ҏ2hYS-pT)gݩtt-BoW'e &Cn/j5(ȹ_݅h" w|9=]क4w5* umSmCcL0ņ:Q}' ]v9ϖżIi7{lˮЩQBFǕ;jF(ypb6!=rb =|bsQ=Ï}ϲKNB~%2[ \.}6X .Ý5ze&H ('d=ǎ(ծ!*( KH"X#3nu-[^rG $Ŏ+^ wNcV=Z=NǛfz10Y@VrxAKP+_ +q/xmTH8Cw!+4SO(a%lhvgpېͬhW,7VM7wfk m͓b_WוϸCfB7AtqmE`|=>߃v烕:#wH'wSq|}pwR{IJ120ʜSSǮWB9V19P_ʱӸS |yF>^/ϷaaZM*E̘uÿQ<@}y72뾩T7սDWG&>Kso\_=Ab~QS/.jf%vȗmD^ܥ+Ҟ`<#909x"TL8ʤ} }Vl hpeeWa\y1I|*.J bR II3}5mŁyyu}Lq`]O}:#.gs- ߟi$P=ҥ&<na9 s$9gP^Xy5EOgGÕ6=$蓸jO&_g ӏ͢poã:eEHoV1/oc PNG}?3Gdlш/I_ӣY1v:At 4#h)h+G7h?:ty{{@t^~r2U~޼ˢlX}\#6>Sp}Յ N`Z> 5/pPK¦>.K/ a;/IZ%㨤8keu}Wm(XCmtOłR[{]sxt|TcrOc1Mp cGߣMo )+44vv *2_?e'ujg֗׉!GM>I\賬K+ϓ([[qRbs:_W_B{;5S.~FS{[oJŸ̲]_`>MMv2M7HLN/7%LYLȰt<ZX $AJ!=W;^$`!z|q]p{5D^Bۺ5.sQ[q^8;@72hVaWr-qDK=zۧdyƏ9١|>*t1s;ELK?ʷEB1ݑa¼5 ʝQA/Z}e+CjwwnwX['Kvs"~aC 9yU mw[FbꃀgGۮ9|;==M?y\RB:۰7= 澹$>j8hY1с\9(px/~}p{1*ؤƜӘ ɧ4kb帶91$ m,lv'O47m*lAbŮ(ZfHx@J>FU|ZnL%K ֕py.KQ=S@'0",Oǐxyη8w.QT_XO9 vLgMA5+? Y)^* JAS^ir!cPr*}}"d{991 ,?˾\ނ }7AF.1)ۚcX sS1J#`# BN> e ͵Yy-41 }3+2.pde%| a(+a+ѝ!=m]c/ J9+_/qn%srKu[vю˸ 16xwI9TΟ()]m='ft ؊`fMp+Fs"Pq%ǮHQ=Ȫ*w-cX}מo63Gwy3`vsuGiy)t:i sA&"V9 UZmsJRvV'3]ʛ޲U)nJ/B],*ɘ2>ui>ձCD,P];7zse78z[HlSe_C[w,|*J0c7$-`pƤB_2a"00Z6vӚ= u9k(d|TAs+}a齎Ѐ {.^z\TDIȢ[iz|æH @ٝpӕ*)O<M֠@]CeSSzKWq E"36TCZfԄYMF 漂5N PEȒis[Zq6O|4Ti_y85; KL}Z! [!nm}4yi`,3hfgi{89 $qu #{b']~^ ` +0*M,Qc^rrY^RhL$LRkSmDe[eDk5k7' nՕYb1!n4c9 SD4&a-HR XO_D,VΓTr+h hءƔtVÜ7tsZSGk}XJqJ8TΒp:ݗ>=nYKG[Mq_hA Me)ZW'-0LLqO xG#pڰ\.WDzp}3v\q?v((=rҁ> 71MwS0͂ 70m6Uot *uKYlz3 T5b K)s)HTqΦkO.jOh)]o(0}tLKfYu6v KNBc/ ,I/QyYB=>UΧjhC \:24xR 'l~_>Vd= p-C ";(ݳں}>q #9o#njgס& (!_vKd_~LƌH.N\O%e0=*Vm:Vl}Si5n&pP|$ڷzb@ ڥ|K r`Fև~L/dyi?H㱬4el6}]j ޝIjZV3}$&FNwhK'+|iPLt+t#,Fk)&ཊ** M*17FQ/ 6hz-78ӑ2K~}Ȑ?BK > 7Gޡz!wbWGXH;,{G'r7n&Hb !;@OPzPjx(OE|,Fa ;Q\h#,Nlf7 6J蝝b)Ֆ2"L(i)KiɋEq4)Hd郞]CocL_ ȁ#B}'}h !X*$y}񳻟Av#ٔƒO!łp{Iucq #uZ>Ag}Ԥյ.dUQ]~ǧz}3Ǹg**xaD-k<hfpƴh+F,D3 c2l4 HhDsY$$e7%,F=QQJXztue'RTix“J_h?4G g5y~/>T.WϡuJ +SusكɖQ8'7~(͋lJ4cQ #ԈÕLp"r:IsDæ.O31xL=w2v3WzSI0I ?~8[^[,O:am922=Z=~r"PC v^-;Nǝ`}$;##X[CInjpwdƧA$Xj3|ƱP].f=3d+* 3rTZ"3DP#nU/qK톍d덻l\Vo.$kK?"((2mhLfdw;$&](p*sȋ Z"t(z (@W қ>OitI2Hܕ@;~wL;vKjU\׭+ٖZ+ $@O9)Y9980 Nu~F?^ _0E+MPXK/OGCFEhCG6p.:rP2(=[r1T+R\Ryֿbr,OzA0V tgTI'aBIKA5U$Y) +`C D"&Ԥ ԕ5iƊIҡVm0U'1=P'zZhK+DJo|҃RR'UZ*T{0uWȊE-z8vAj"ڏ8yrl9/W46q.cY&b&{ּD,M"*UۺJ ֮";&MDFi$ϨHQ`` 8!S#cSTYRc,.2hۈLHjt(1az1)%8釡tkÖhY ~);eg'T19į1ZkPayJKЦCВzI.%\t=L3hGD!x CKAK*>t;S!M<JB0벨WP+F|.VjYCPQ@eJXz.YXإ[\ ]yx[g :EVua)?$C hԡXd@Uƪv 8IgYﴯ}Nؗ2okݡ˫-G)p9bqW?BHDx^*U&mIGj EA'2V浸L xgt$)&\UJA*7ӼWRc4PhIO[\!=.JS1#<85 n%,05!p{ Aks?F']*}̷1_xB.Z`~hFu8A ɼ<|Q1:l0kh9^tW>a߁dɷ.ѕAmP0R#7ihI:-Mkj$#.#P/jD6=&`3 "|Y,@oW}Le#POwۍżzB<\Bpm%VuFxۮl_Trnt:ӨPLRqPT.C88/LyQ:aF#g|>PCmFo)ylUU0^~Xb=jxȯHOkR^Y@ /]<xRth}})O.Dryĉ|"$b0M9J;o,fڀ Gܠ}n)Z9dإX7CQ܅!eozd+k `ĿNҼAٝ8iPpTwi- 9|4y$60~T@M86 gS\ShEmU+47ZʥMߦMVJNL#!fi1IȿHӁ)& e[' *I:)Ɂ{c^ŖޕIv):>G>|QYR0Kqo7W*WM6bƍ^gʟ:2N:\qAT?"VЀ{C٘1԰xmFWec\P|{-&&63Vhɛ˰2DRE? i]"=~dp1 Lv;gVXlإx]{;t,ĵkb+Yp;{˰SJbv&ON#ިT%O? ca槹Bq/U̹,ך*8`kiN|nAs0M=Rb@'s ӳPaot1j5KT0y)te NI~ 8AE\ln&}Ko'_$~8'=5h?d(Wt-rmYNrHDŽrWl;rv%h*[lf~N%wV}%![[[$H^x taE~{GEdY~8Dw7.hx"m!Xeo*\wkgTP8AK؏Kip+զ%DA3n(Ij 뺒{v:rnmNWzMqɾU٩݁B-}}~ˡ<>CT\l̄Woٴ]Ev\jB^O>%^[H||M繏7d⺪1[M)ufC.Ys)vڸbv"4 ~=o(xM=é*[.l#>@.Us|M(r(9ށ ;d'**C^+h_,DT2:wپD5!$ иi&v#nEF7rsOS̴PGuyOCpA`ؿuI]B=&o@[u\.W _E׺_ZF+րALHnݶo~)vԨ1nj/'*LNAw5 cA$P΃k;F?6t `խG{[b/p!s 8Ј#)~E_"v[7zfᖯ.%.Ƨ>@Y-'E`~-|nUFp ZalԴEئjY+44[S%D/9ܣ a\< qԶis_L@$n:Х,/SSd/ Sar}.v@*TlJWLvL!5sv&")m,%h'\CI9{@U[q@ַܬ8q.B yG%T$EK8V?;ߣfFӍX}F70"h_З_:+ |K'ijHAz##bC!G}/oL)n+v̇ӸE [ZmYɞRlnHK kPz bܠDFȫdraMO+q ˗-Hs1I.}B]OI]/Yn-.t#R70Y^_JF_75{(c[5rCaˌsk *%$cV:7?tJ]ylgc|$w` a 9ݩTD:|(4;t\d/s14xgykٝRhhoS/bsH6ͿW`j#un N1`\-0MQtMIk֥䈦2F|f# yjda=W_.P$J-iC =fp-0[,hX ɵe^N51|N,.uS00*,˾9ɴGDU_ܰ8 ~_+eF9?`OG=鑞T3:49Ȇ1fI :ko!(E8H,*Bu.0{+-5`Cli ݫnEkF f rRj_kjTGj ro=w9*S{?[0m9BW zTG41oеF $I{N'YIPLS:=S/_ s++gMqI2kgE"0e z\$a7Sh؛)-jV)7\*(Pm ~s9a1Ť'{JAmx)Fo6~Zh,ܦ@\+|G%ˈ*w@)?~H{ b xBG; $OB]::nY4^,s]? j^7>ե(TTc]*Gct__^Sj>XxHxbaR˗YmcP}s6$ zNΠH4jWՙꦱprGG[kgKx<܃Xy#7pcG3wCE03mfl=.?V_k=.Y}=i1fJOH>Qf:Z9q@x`o"B"1`!_ L.'Oܬ0y &R+: Y7{I^AzmB ,li.uq};y,+wNj{h^}HmWȡ3Ъ]TcIA ~Y.F]blLWN,+ɉ3M bt`ZZE>^v*_Gv'^ɶcߌiZϰ<7M fpC?)OavF4[B[7RdSO@ 2#γ.?-r`EERY7_92ww}r7kRPuaYjoJK=*TEb2J|݄:;Q,h_ZK;2ZbX 셸+n2SaI9k!әL<K?RvFf,<``*akPO/NCnYVP Y UhGk?;hl,\ 1Ta+ z^)i) zj̽,mUb a&jl6(\j 3MW1e6gg_4]wK;x/(_1 9uшN!:8>atK9*nB]H{7dm{!P8tW%;c; sL3N٤b[e\$Իzng?&@pokpgJvYϨBABDE ;Yxq'iN3c W}}ᕙ&b!5%uQcJ?p9M^x1#=~1Y@-&[XacU$0G5Hs"SL';t~{x'd$Y`7,awQ (NzW ˹@8'w ޤ/a4Z8KFBM|1?|3+ LXO *Cܥϗx|)/I[K |1/H|}HbH]7 [*,1'sR.G -2=6zj)?0E^ |{"U)i***7 @ϱ5!nO`:!OGӼ۸(r௱RM=Zb*P| "-@s h~'z 8{qcUZ@*c*nP^SįU7S߻n+ϠX0nb)@A:F:iLPoO,¹X`HnuF{jO语ki|64ǡ?N@g|e`$4 \:#1Y/3d WPW8Iz V7j9#_r7F2 gl{!m?k 7DdnSCC@3oe(m $m)5ʼ 쵋;$ݫwc} Hd3aw޹7Ka3H[b z̥ 5:7jMTQRf_EQEQ@ED_l(7Ҙ]c/gMw+}ymnϭȭ\;U+i%\Gdk(in"U$DV46616/ ¼l_5fGۿ#͂B$1-8֊ɯ9XC5+Li)WjNQPbd :q(AkLLnS?L24az&=3sG/iFIT>ekvNmW "[R6U19^OsX UyǑD`I%K1VNi 1 gfX1ʆJ B.EW$&Y5ߒegv  :y/oCՙ>Z2_2}&`H)@[ܛ t JCW+(_ځr.ŔaE(2Nn~~ZqHC#PhIZ3%, KқZ I@mK1iE#e:G1z$4CI&ͤk䧄r}RyK7w#P8S˚都 FiQ֞145Ή+HuipǧKoSG@/~MпF["e%8rpYEdNZ$ez'q ]Xp#d@ ~pH􏓛,{x a1ۢ|R5$N`s(SkNl*ECJ@ki(T*7|>4_jaM>4 Խ)dwu8>VT$&繥Dk*:^BRͽNILN}Bdѓ{D\WE0iQWlso;ZJ> `HޔVG bGvSe.IM͓;&V;XitC>d-RV\ӄ0'\U \ \iRzˆqqZ1bT })LTK0d{,*P7{~F*᫩<^G;"U|^4*L z%TPOCͰ&+}SJ;ʲ0mo(0"u6_t|yupOk9ړsXann.$gdFVJW1{ݡ<m 8|wL/uB6ٓ˲MF?tkeaf){e&YN$hT\*59{:sZV6WK.̍ʥ\\lHԛ5#G\_0olAK dxڕK'lZfNp9r :VpXBۮv7VfBQ'q *Kos^wĩ 9ϼ4nM.kX_;+ma]Bbʮ m%-ŴP Ը MxdݮQr{5cNHkT.}Z@;x͙'挆3 4YS$Iݺ<ҭN-R##d [> 4Vݠ;;n ;ƀܤSւ߹tkl-k)5=\J#.K_eBdܮ,| };@اyWt@qH}ᒿsF0(j aԖ lR4 k \1VW&Eg1 %(X֔po-C9J[Fjsg5ϒ_ j]t|)t$;6[溬+ *hRw\4 *Fd„-k{9% $moJfXo|EVm~> [*W޳փ pAw29XJI(;UT(k٭XjXgi_kugh |3fvw ]iA;q]q/RTZ7vw{'_1pwڑrVn-==H{-ŎmbϷ%]=^1.]YgDmװRO?vb8kׄF |M$1ڸSpǡgCY1#fOFri$1ɢh'16 M6C߈( mKo_"r'!Eݵ!-r4F %Cg$(:?<줺u8 7Tvy/{o9}cʅS28- _DiF&w޸5YQ~@>)^+vZ׏=Tm3NwftEq]@W6o8JhZq bt].'i?fBv,?@*.+9Vjk} $:W(3 %F_=b8쐏'"y+GX!ZUylpt T[۸KCAAEwlb ?>9rb/#8$r;)Xdߊ9?v'䩧4 8N4 &L/5)@, ;Gw [\L}\!!-Yyy *ڐYubx/O)rvTU!N (RGg y6Dg{Nk8 $AqTk[L66+w &dĩncTn }%Eb-4(-J%nH mSֶO8bnt*;KbUwn5}eR^a٬ܹ/>M*$1VY-:Hz7j%tcPqI՘}JɿD721X1``myS-t!<N?4.c\%6 _5o٭ $GTŮAie$BkdAѨVO iȲm*rq-&mh;GfTrாbzYXu2؏̗DY i#OW^ sO]=i*S祋-3_֔|ۭNC.Aijk>n+]ۋV䑥Gvt b>% ^.E$͘`q2`j1'_IWUl5c'۷}K5rlY/HMnA]hgTgw8 f-%tP@z.Ov/~Ъw9D/?}oٔXy4Q*I~kv nٺG |4ܴh#5^tM{РO@j I njK-m7zڞ/,}>`Q3d4[ O8HI}XSz(m~C[qYYb,mPvB!>qZXC*/_̨bl ₧G-޲ǧcYy"b^+Z,H>o]1}Q/F腁gb2•z"lWy#b`|\`x8ֱ^:m{aoxL7B1C+zT# >CsqҢwoV\IL=fe{qgl8'SCE^莏 S[:Ckߛb`bn4AnXhBj6vQR-Um`AZ \B_ܧ-xCXb}MM+G&>=$=xTwC !~@QчcJ!Fd"iW=k2d;<t!!?Fm4ĉ+m\!:}N]w4e:x+> †D@D &6WM Ԑo*͂ RB(}j ԭ.L5WUx&.+Jlg8_z4ljm{\1$Jg8{1=&j5S(2LݜP H@ؠg6h'%+K#7N4U HP3dK]䲊 #w4J*IDݴNt= L ؖdt]5(4~^qT5ܔ_WmB6k(=DygH=BիGRq(AڬġjxB]B)w EIאnE;"܋z$f@l=S~]w|aJ]3> %L콸2:vZ1E)ḧ́HbRzWP$ ~W̹.bƲz<˃r7[38 $k6hČě$)1bbҍ6h⊠Ð*aZayZ^,  o D$$eȗ,Aad<(.V[Q^fuY ʟyE*dy=oUjۨFI#&EgWPfWHJ-n׶נȐ2н޲+?Hh+ |_)|Zv2ʅvP[d>*kMb47Lo9'd=xuW9F@RcEŒ.. x)3q'F äqn.;1ٖ1=-r wO_3܌@#oojB_N䷾gɗ.5G 1s+S)Is / jL nCY$sq9g6MҘ J ZcVG0\0'$C ȳs/T2S>~˭I!e,1ߓ=~1g~.- 7._4hdry,s z>)ٝ˗ew$雊ϜYٿl?_i;y?OW.V1,!μ]鳲7P3k&==Lˋtf0IH0 nr,9=g 3#WoՏ%<-|^c}RREϹ4R? Lw$4PF\k͋FD/Ybz+FPO_ -8X` eyWg K)ՄsmpT MKem\YQ>r7ba 5+Bb>"O77Cow̿A}|7 zrsUqfTݛ#NA~+M)c{+5P=&*.6!21U# da P m~)׿sD6Tj]twc)ב [Lr0<ڕ`LP/A*kCRW (^eĆqwY%+uл=ꨡ%vO@ /]Uӝ@+C89IfV^bJRxwUˢ-<㫠bC_&Ǣ /9Ivu-㦃WjCgK?y]I h[w )o1=%l. w쒧{?YC[Hvok!}ݼ1Ѧ8~KـB7uUPIl7+$u+ׇ_<[ؿgk~87\! uJT[O=fd'b_1A`Ŭ9^w=Mc""G"TQ1Ըq]E+o*"?|/_7]<xLbȋ|:Q;p O_Cۓ3LG\{Θ{/Wp @sK>|쀏v{YvYpdV2ZSBb"mɥ5W 'cwVOeCŶ#y~yѡA[+#IA"3hQeP'f:ttHЧk%X Z 6 $5de++43(\*bO.= Z knd:wxh]Htg sA"q2~xQξ~]8 x]x7ߖFiçt!$$#_l( VdhY&s;4;;}X-Rk].gگA&1Պ#\jFn;mBm5AN!vFZHwIƃBUpj\c!*`r֯p؅ aMIⴸr;,QSi+1i:O@?#4!U&1CR|f)=f)1ೂ֌S&'+zØߎL}10T@&U;uڭ5kӭ]:ҿrnR5w1{hjڜ'K 4Lx x=a4x;s(&-.>Vs(h~U!Ok~ œ_Tt*ù@8M0Y kYȑf;?+c<}@YB,\{>(P4Z8eU0ӿogx&b)| >Վbappد{ɮRAh(Ҡs^td CMR> ʗæYd"e疻/80vQ_"5nr(cO(ck>{ >C/ wy$.Lo϶.p=tᏞ ,e1lfLg1#͜NSkT_$z?Y/.;O!$'DGXknA|8r2 Ү>.O%)6|!e 8P5աo%Z T%.Hw̃+u0Oc kGh^egNz&=FVI rZdG*5k)crg0֠aQ.D2ūO}Åy"x =SMOFsK+oڍ%k LįΜ7'Ub}qGZ7;v_@hqakZt0P|(xZ%8 yh2N`s9\4s[~)Irb>AO{"(C3P#f4ڟpNro[8u౦؀}ԶY7xӀۛ:9FdHL Lfo l2$nnBx^ -@@9|QQ@EAP}PB}5(_@6LItɤYyݿɖ-,;e#p )\*&L򓑓-!>XBJ,L RjRBiK@\tϼe R ,VCbx&ZQ`xAB )tX*:t$ +LkQ<tmq<ѾFuZ|ҤLyAER!CMB8H B$)<%%Hj lNei?$uND9XvyLct g0NϐMZX=ǐGZv§N̡\G_Bmc?ک@c=Y]4o{ n1j BMOY2IvK1iڻ~бB:unT5M@5$1 BJc|hBX\&ߟ.4aI <0JJ^!dbAmv5frIxn|3ꆘk>qj -~p(T9?16i{Bhε\1h#^oC0 [mDȱM@ Ч9MAzTuqZP$+G(88cT'af HUOb1R(=i;Ϳ[mPZ*E \yB9u呤(NC7X#a3Q6=`uDn4⸇4IQ"RLaTHnaM^*ٕ}!JH=\DTbpxa޺RI鹳> s)LJQ-ia!6m Cn\'\8mn'Ep[qzzS##IJr&b+m00f#7B&)CƁՀ&itǵ/Zض%@Ї:cI5|]m&I899ihlP NbKJ^hNC̚6 "&~J2_ u(O 0)뫐;#%}u|O| Qo Pը-m RڪP9x9.:%SC{ENuLW+9{MZy^V(z&S_qP:܇duv؀_ቺ] ȫ`3(zXk`7Q)wu&V ,0z"m))ޗӺ] {b(Ho)>&JWƣtT-UH$(L}WtsӠWSWGNBfLJ%tNzTrbҧsHcd_"K;5pTv` $Zty7`qc,&$EA8l $tD"waH)%6HZTk` --:6l~\,b_di 0~;ZZY"UCs%l-V{#(,LhWQ#jC6MV1̗KrZCOHG!ɓ@Vr<>c;+ȗD.]|u1*8j ߳gε˂ bcF G#wzIduዬAxKޜ1H E%ՎO%o`7!1~l^Q C#*l\J~GD3q`!."@I*"9E͵h˚xn|kR9f.aȫF\ᬡ(i .\L\R3?n}wpё{`t.'RMÒ(ZqQVڏv1;Rcfjܴs,MeFe,>6& ^= (^&' d]dZ0A,.W\YvXOAܹ\hO#Ztv!Lwc5ۃ!+7mYѹoUyZ>sF;4tQ_8]xkÊ4Ot;)lu=^;F:pz4?\!th8ग़ ΔOv':lI$w{uCk~,F.s(3X5پ] QQlqTauQ5EBڠ0 &GG8s#S]N `EP_^8%!Z_M7'3z|{Gcx!tԜJE+9m3)Qy L,wowφkq+蹁̙̎8S&5"x>esa(cߙypbv(ry>VDں\z[eL+ W f~D:s)SEKQ=@cL$C}l>2;tPěrk0jf~:E~fer<*Nl%U(EL6%*2wTVd3BFJ[f(31<{n)3GJ5`k.?Қ!RU4NGudcU/;Ƙpy˭xg|Pv&gRa]t=hn~;3BN ]j깙05#9ՓeH~e`̵!{ k ;4}]v'R7m2)0 2ʟsYĂSSf3nSb@@$2Xl!X:ߢ'_"Rf%tO€C\½c{GL TB" q1q7ЁbpS);ZGsʡzԊ^n$ǁ~6sX؝!Q~PA6¸Ee1EU`;q݀wbE+&d%e}#%hPCZ(r'ZNM=m$׫^+hukh#=Z)`umb B1 '~ he}֐x-Z-TE\8&ao5ƥ mѶw5ck*X!(t PB][~vT*N[\TxpN1U]Y#'] RPwȆۍQ%@/͗ aǏis&е\X-[n,]8\ bVWo4wv$kgE׈G<\gc> oD1A=w:;Yͨ"-55˪~qnD:XB `(x.A%|۟ cq a7QDK h#!7Ү4&/>͎䍄E6U4&dIYxjz2^G?I^`Bj&S}SAuVw OɸMR"F(аbU2%/gYz;3 6 pj%NJꮵ-ӁaܔK[q$!Y_S]#";i`q<7Z6e"&6@m>Ed#"ogxߙGd+9x%׫5Bh*.dY2V/6ʋGpfmp[n{w^~ˉBV*ODO2UR{G9}1Z~ Qlo rQHOmדk6A؀.O }p-]PkGwS o m@rr*uD[2JH-` xb ƉdnvgJ7ئ\?hHKIY$Voh74%MGW(Ԋ =EYN?d]σv4N_m%&N oCj720R ڮoOCMtZɵ]v3Nܧ89'Ko1A΁$ylAzo.MG`WݞQg& .O3Cih3S@(v5]6xTbp]URyQ\! t`?#NH팰K?3|gJj JPi¨n2?V&TYZՈkMss\6v0UItxgh aZMm4_BzFIRZQ[);5A+sӒCyqo¸ HЛ\}:!5Q-q"T(ddc OqDV 5oŽUqW f cy}5y"),{z6t5NOjʠI ̒ #*P2ڱWgsu2pAG02zW''mϵC`Dfs'yV͌5햣E6lNdFau^)Phy-SZ zjSf'܆4tҭygU-H(<%8ͯ2Pl̎ż.}03^k5aޜcyt5\r̳ZIbt奱,˻f^HRwx0Yovit0_SyzRruB]}No(Oa}PPO_Xn=ä5e[ed&zMu6L:p+Ö71|^c8f& omgm)D; ?#S*A8ey W߿K %;\J].xF_xan!!i_ FV]J=Rk̭6-GLbwQS և^o`BMc@ LئK;dMGᙗZx\`n8K@\Z>z7q1fWrҢl[=& NuԄ@{(⣿Bp~%Q3Setxg^GH1| |/3ֶeR)`n3L;C-<8'<0)C +EA>$eͣN, 7n:ۺ~4?@EZO+jr 2ҴMJF"WC@}CD?'"26BFu)g0z_?LVO(M :|#HRX ,3B΋/a.@L畮-ℊ_cm`Ij~6BV$Yve\lWKQobA$1jθWdL){ ;ئy= ؃V=ۅH[*pHq ˍHkWPJ4f"x qe}ī6VzF9zF콐F`f1^CG/eQb=E`MGZ~r1"C~wP`./Pi@t"i4$js3&2@F6khAmη`9>SJp %֑B< "s _[be;x̝xw 22JOMCQM1*6zyJ6`jqRz%DGbmB2MIo7/ kU7]Jx/dDP_mz~@&Vtz onoVC[kN鸯 b@u?M5Jhp7hgՒr jUvF:ֲ:u&EAvpt%tr?XG`> Nk7U|S}sĺ?*N_„lĘl oWMa 4Ev&D/9=k\糾R;{ql3 )fsJ$7cAfgK :^ߕ^K`k|?Q3=É?= x>@CO=A2(؊/I[k.@I <:a! Tu\naZun TI=#/wɨAEP>;&?,I~X mC^X%|R)45nfn7𽱓jhɲǵak:@+?R 4tY|B`m$gSb֛Ag3um&wkODj1dsb @1 [7J]jqgy#[LKC姷_ S!^YW@CYI@$| BErY٠egA B(C !p=$\߼0)LmȘMQhX,`:2,[Ieئ@ I}C˞( r}Cː(XK5_H# kҰjKP_uheaz^gJGd!ŨR)-n_pD]W,FT")I:2 ,T9yNF7bF$'[?r09?45 MEF @aǙJZk5[ ;*#QHSm`R $T+_dTR+ OPH[Ikʬ/ b2Rg\o8žASZ=?*%[֗/qfnT;UU>ECY<[Q5;.Z 2J EfMquPVH'ؿ$ M6!626Qi u &P/XDLAⲿC+N.%SPYbGx#dBJkPh/VΥ2%}B)ʱz2Y'"3^XZ)B"IF?Sh wZ$(8/4] -47N[܊у:QIhT>ƚD$V $rhGbbUO,jp.ƌ/?^KC([˞,PWvU]!ۺ* 3|Tҕzd3 I87//`nL4\8cDԟ?s?R0e"#HdIȸL]s`ܢ1 !bpbE_8QjpLݫ:R07x1`Z2YNp|i"i&e2?"y>MN$H+ }5D޿],L|樬zN'`'jd2->lY(4+4aW)31bIGE"7NnphKH MTX6a5ΣD2 "Uey"J67 9 τw2b'Uh+)p&ףv DDXLصZA?xlTM6[ZOAjⱔ[ ū姒CA@{ 2w0LO_-/)1o;ht!nnW'm=^řidyՑ"PrV)5>&b'2h{yW7:yZKM<щL8ّeV&BTbJѪˈӮZܢ76V|ww`|W`ZnìG_ "P:#S²$7⋌/FrHN]3T>zDSiTFr.r>D+M8 |#W8Jڃ*gs.vLw5A]۟ YX~>G'FwB>,b~IVǐ?M2 P.OM[y+ }ɐf"^["`qRdC:7dl W<ƗGKp9ZTxXUzCN9OjmG=AI<՗y]CT%9+^_sF^sAMTFA\::lGؖ: uGq0(L/ypIEnՒDwVOB pd"Hϲ..!K.:a{i7ZEkU*+s=6-ǫ:~++sF&jqol%5Fyj/P}dmR˕VQ*w?l8Kn.QQvS\a@[ 91ەEiiwSTq]twʦs#TXT=6lךzӈƂ&B@`j\ EjzV}u$W2 mvټ,Op+DM _mȕkDc@"CG?fl ݔed=Lihۻ V9Zdi\$]28;Zљ"a6 H>]_U3ta"m hcvfNĉ6#\xl撹B>VfjK?<8)CW.SL/,ѥg邸fמ/r5sbE2`gFT+jgQ^8| VG",.% p| 긍QoNn#lZL eAS'lG1bY}0$CI]ج]0H0Ao/ZMg+vPffz~.^-.<cGŁ]<ȣ&٭@.WZ&Ig?֡6,܁][(_#εbY/M~v<-TcTG:fb(9[ak=4PFk8*-;G43S3^3dhݙYF->RX-u*dXM1\~Ob[ lx y}) .|B4S<1ɻ3քg=2ˈsmz12&>}:Ȉڶ%/FMݴ0rm - zp׌ {k|SܙNQB|+uDt] x[7Z<Ph˯ TJp 4&ךQ_=ƻ")e>?sq4&Uƶy(sadF;w 9N4s=:PoU%s3׻yPvv4KdOpt):7-' n,9Y0=\f} ~uwWjF5%h &ӕ':_?σ~7ϥdy#md2 E+siv,ߜ*Gyɂ#; fLٴ^R1&.GxɂJ7vyU'_r}#/hvfw6_)ϣ[auDB>ЦՔ R<>-5:_).'{|΍kcү:р9Xw-׫ZֽWbL:uv` ZM&S'ZppRxmPkY>KQ{#@x5UkU+2sM%JbyqDq!!0tX=WKsP`5g/; ^z{9S2վiœQ٣\46 8jJ_vX*Y'MENUF#궁h;A7(="XI0<|4oۈ^#u{H_B6vF 7C\CE/R(JrJىd(mav Vz ֵ } $ŃI }FԈ;sf+omr\ю{b6{h``~\FR|Ŝ Z mFeggza[^4hʅRA`kſ'%t"Di-eD nڡH&-*'M5ڡ Wn1a6 Yy0<-$5>Ϳ AA h>ja,ڹѯ:4 VFM=ASOĦx&BTrja  ፕqJp6XEüiS=KK0(`6kPy]:zZuazVTrߖNwS6/Wy!|A)d !g ,cȎ +Dgv=},l*;p6}uaQ~[ׇhȁTwvm5NxY-%h޷eDϠ =:O.# Ble`ք^V'TD U$_꾑ǿ`աVw\5u`(~~W,TePQjI]"ctcXx+}t8@ #m[:xOW _6(iЃǭQV;_ {ہb\Fc);|L||g{s+W\*IyZ$؟]ndf3?|3C+lxZS@>I %C5wr-&5^#Sr s 9wEm޿xo?a ¬Y-lS\{~ǎDP5&B7ߔid"W IE!؇zs'Q-OqnP`PN*rzd=&HyZ8Z&>` fe.@/%k p~ 4$))Cв0CHdXq_JSOXܿE;Po,x|Lے0bX 1]~˜8|&0s`en!cJAh/G ڑl ] \]݃ں -ݲ_D+Q&~h||`sawV5SKkɺ%T% #%綪/Q8͘g<&lh_ S)(M3/m؈턁*סy/VZ\QkL(M'@g꼩G1;SzhU#l]?k}ANW:`O666eweJ;Ntmuj/ "%tCaZQG@h}VbS\.I;_Q xح$YhxuPV' mNw:5P9ra:Msw GM񱓃f(_9erisШtU077Q:'pmAp ^u6?Zs ?XāMvڬiE$F.Q2?~ ےMHûs:M&S)%qOM59c:dRnGl+c!KUG$䞶](V31719G&ʼTk NW@hx6m@I(?uLJR) yw{,C>A'h/*%>! o@x0ZYXuTgP7!'bgXC@.@[{70 ‹_} t8' H߬Bָ/~)0M1iOX8_#\|i)Z>m!WW8N2` :y `LVu+RibI"Ma[u>f@(V3d&yȻEiTAA,uyqSv؃- NhTb;=/ m,)^>|h34nT# A\DS)1mlј&?Ԭ=;gY@ֶVBF{ll1SS5ۉ& J#|cX$u:~&Ȳd ^r#ȸ$?-^<͈6M0C\q,t9%"ǝAn0}2UIr80k ašbrd}%!tOq=RHwP=u IP득1u;h>&X־V$CHC J+Cr.1 |0wŷ&|x_5%1ꓵr6r!Ywt3 8⧴@@W^݄ D l(@Jwj/7|ɴAW6&q"BM.ZuB9k^!Y>UG!R6'͘dBa qV g1sQW"9p9gc1!KEULfJ42x Tceu7v a-?򹯩HnOsutݹw/8L+*b%);oCLU#L `q7Ŵ|!os>A;V`cƉ%!XMC{=Q% 3JŞŦ;|op[U&"]4f'pyJPEtqCTP2Ui*j?',񺑷1Ʌ-*mUq(%t?FdH723/+s 哓!$#{ږB %uPZE@>u]K՚})ElP*>}*:d~׼hЪ{s7盗n]޶naKY,vef˒̓c1,IUpDȀ_&> @r)4ڟDJtY'9#>3Q#D):zNgĔ ,_dfke̷47Tը*GB,UF&BB3@P^c^(Z}xƒ"b1gefs9AL 2&P A&D U+ՙj'X(ikbZ̓:pdAm5 /13ȭC2Bu'3:f{ǣ @h}1Ud-!( Esomw?Mĩ`=^*RX18'H h0ō3l&\n3VAk&u4E&řLB3 {uƮXWy5wd'c;\CF·Ҟ[6~ ksu ^5ؖ[S+F3Ѧl F#"6oYе(HgoƗ@,y3^P SV0[gA=z@mPB;:GUƚܵbiU#2Mg)Z>oBpe zBՈqŸ@fOGѯ&^0N ;Z+W7'/EDSs`ˎ1k"Խ='=e+P^7rډߪQv$}{DfUGO#H$\a,`Ssn Ȟlf ی!vs R{AͻODeHkK{>An5}^˾ElVPR%A?FN]9﹝kDg: @ S.P~MYCD:R$8RC'l+6]"iާ9@h`{rd Q0n/ %.q^pbObߞh%O-:̵q$ ]e^d1D TQy:׃Sn~f4yE+84HĹn,ZFZQm<|Rduy-= &qZx*3Gzvk3'W3-],.&'ꐍ^#₫%[K?FK(lp-{E&e9alAy(ZKn5_nűpc!9b\]zwC]­6XM΍ r Y"\b<e m t KqHG`l=-DP="=։^hC1BGHhA6Bw֋H?@=TЄ!NI4ЮcoVYr +wGw)yЩr8OF/FAN L %I6o;ei,pkhڑ%j.;/7̔h3_"J[4XE)h(e- }2{СэEb\5\4@:WC9U&际^s4e>R-j˘ԪEv(_tՅ5*sr'9 _3!]n]6( B+42d)L&n}VlCuy`r 7/9Z!O\73Yf oREPbE3$$@Ѯ,NYa 3cnz5&O$Nm=tWڼRG//Ҙ C)3]*muy9>>$rӑ!/p~)[Б4֡WMwAMx01+l |ymG"‚(hYTda*=π_2h:. R6I1-0uXh`~JOA'A~(HA")¹ќo+3+o&f%%{cT 1B3y\]֐X1vv!~].h t{h,MТ_2X~A@6'^4V6B cvފuUs!y aF;!;|F#ORo ' v'`O“o!bo+2{Cwt7DO<|= iǕݍnjoͰd,w;PSB.!q&uJ=:<%- 9sA#jŪRزS=+[ !d+p9~wz ;OSA1I48(%^# \kɽjߊY+wLKJ[Ae- ^LvԌtѶZ}.:Щ-S#>Rf! [];;^?/|}a{=~v$X/OGQV=?`,ʠ2P3tD 3f4[)%G`cSYl(їy,c Gc|EX+^^5{]©{\v5?MHsU\<&ic Z8kZi䭀2^?/+X+Yo,^bQVWQ(Fba2v[^d/Y*SYYdޜ,."嬌ߗfd(?ZmBT.Sm0tgpGղI`.<.$|pyDɢNޙkX79*@qYzX83^mg'U$ Eߓy9 D? DCi$Ykυf~J -gހS,1cǰclsGs0I4ea '`Ħ_c(kPZEZֳzj~8-VWrы i3F=+&`WhWi]z娄6YL5E󊲬3nԉ"wT53vo\dy1eѢ'6T^A;s<z5+*1V7 V˅0"[Kx*K,"vv5uI+#lee*z?JKCJBaaEV+|NVϒu*~3ՊR!88}FPeA_q^p%zh)ʠ?i<:i%82-i)\XB7Zw&!!6$ ˖syTG}=d\4ԐBwq#C~(އ;a {E%>}G/pvķ/xBM'>!t`+ 44b ;kՅzQL|i ^z_&vzcs}pwt/|KSO0nxI<}>"5\x$ÍV*%*+%)Ȇ>rIK疄f2.tA4:,CRe!B{M+@ǖ܈ նYQ2zʅMTQٯ>"$Ms{*SmV޻ x?gmz87Q"SӤ6Yj:ҏjzt־]F_Q5F ꠡ,n i;@=n-H}j [daOpC tO% ^2lOJBa NL^-Y $UiI&X1Ʌy~e(SuF)* +ٻ.8ͬHm zAgv˸& "@akL2FeX?4>$Po@W8LˤMvTm^J 4HwχEJѹ+V}+MY_ȞfYPCcSO'1r!b^ۄ^x/s=ꡈ҂̈́s@|=-ڥi+Q9CCӑpGݳUʡXQ rQc[>K%Dlr,̦$tLGΛ=D׹ k/RܟSO9?cHuv\O?URQ2 G$ي|W$}g/[rKYۍn'`@WWhtm'O3۱s%oFTͼ+&?(߆g8EEzjȇ!oj Qf/$sV3Tݰ,0wM|?Oמ$s(ea*w2m%bXRxx'䞼d<$z dB&3<}3'^ОgvJٵ_M>_MXJ KgQSe\B4TQT,QkO [ RSnx縉W=F1u+*9|_z&rXZO."1r3(Q7'G *Q—*Oluv _;~;`|.TYjLWrWHz*p:AH?'A֩]i=+w=_QP*p@Fا헄I{ՁoY0nT=P|! W}БLw+yq i)F?Iq،v0j}Z ~ػtf  BI[?EIYm֓bفI_Goպ]biʔ\Tt"5wD9{2I6 $[69smܨsGHl˜'<_0AH]YZd!ƁW2&fdW,g,9Yx v=g4⣫ϒ~Ҹj9$E] l\F=f:ӼfQTOs|T\Y%|d 0gN ObD&4Ϭ` MwΐfCXrEA2%NY 0B%)''YYvd'@g0oFͷSϧe,boO=aKfD6Y_GQL7Q[tEPmT1>N-rhQ@M#{Ht? [p}󜍃jApio\:,3ƴHW K}YoI>%=5̲UYzC(ET/8OK=熆\g~igJM!VayS~pNóHy|h<] h ߅~f) o> } z B,Uט)u rOJD~3ԓ{ΆE CAI鞶'z u ~0nM08U:h(!{6ee 垴)[Ag5ʌrRR{Ȝ7TD5wVh]x4_hC5g!.l1*ȍ<Ҧm~ '*PnfRi=iE9Av B#<DŽX}J`!5\wz{闗77.0Ql"E8`z&5N$/oV#D!.4CaXyj>QZH" n%&4뾤͏>[F;;_t -|\&2rtPOʱ$E5& @ |>Ǘ!T6nu{yk.eҔj5xHXSjbZc8IB}t|L54viWz"*p cx 50Fl1TsǒLU,e`GksDF|ssb9{ [@A<4G)bGL3X_\$#,ͮQ ƕf 4ž]|2@Lp*O-v:BbyӛڳΡJB 7hKl>u{PP xⱤYC)? {bMb}$au }&t8S͎l~i&XR^;+{)תju/t^& ECXfAdzRߨm|B%eF//B; zaSO15\ o 3̤\=Z!d-}(ry1:vɲLSf ^& F 0/DƳAnFH alcP6:+2G`6Fǁ<!)@隈S=0-;9'!߸u;t˳/`A<5$ǾLu+a;"|Z|7nASd@ۀ?%y_jtDzATs4oF&VRi _} `tadSaS(a.,t y9ao cA8E^͚-I\Y.U(HؘBQa| Ozat_1sىi?3qFGz7^ Г kf=.˾RqͬIEPZtgnȻH+`G*$,l xPAd }q["cqR'k ;MuŭƳD:hsRJJfNNI6:A Xey0.dgGM~oD# Sy,"˾ktۘtƫ9zM $'㪐mkk=H{5:]`~&O;kmm?j0^̉۲H&L8ɂNmǙmGE!+KN9T,&ן(25E@W HէwȔ00EP8.{eܞU7X'w\tN]ailS29M;S¥`uWySё˭7}=M+5T NĦS]%ė1N;|/6\  |74<6 3;f>q y]L@.HYţww@X*v\dFKOrT4y{!=^3~ ;"ֵ8& q/EX䎆?_lmS~4pp8Ƕ Ȳ$˦1z䎗yΘ6N6vu'Ek\*ܸOl<l8>J>i<;%;vU1}&^Ȫb J1 WF%=fd@B,_@ 2.b贼NЁ<޹|&R< W^J˨Ѹs )7 x )!C@<tIE*lT`2OP-(O-tscW-y]M nngSXc:/ⶻsp<֏~ي:C"*I9i[73?T2Ù߹vQ$3 #' Lu[+oGQ޸H޾c|EUV;1ڱ64fj18  nc?!8,\abco0bi(i~ΏV s2HMNPbl]U*F܋WN軔XGJ;^ɼ~!*s0u%u4 pK!6CJi43JD…!1(XŽR7 c| ~Mk8ϊ4K"k_TD50dQW,5[Nun _h츮w'J|@wvTf32a~2Ş(ㅦ4)"vؓEoIL9 9_m=O|uRWODw^Lro'r5VZp_V}?_k?3X&K>n{w+V(a|LyVDK fCDp2e4ڟy͋dK[[n:{@?ְ`tD } 9}+I޻/;9;$Nݷ伾[)-DǴ8щqT8(+6@b\TvGTg ](I6z;8#we.:.Tw*%2G˭RMV"N$Cm7u!`0{$L-ͯ3HP&Բ̑xm L%Rl~<)2 ړ_t8)Zmx6#RQvN:lJ)HL %V8򱣺Db3扉Jq(zaB3Dч>?" 98R I8h^TT D$ĥ28'ET竘T '$LyOfS27.Gf\f9iI|М$t&k=ȾE-GГQylr.IZiy1@[ P.+B ]ʊH-ݭY\h723Ti$3[YD:Hc`jJu[tzls9<,k) cAԵDB rR>FYb,а%}Cpp(g|H+0Fˑ?k1c$1 F_%:eqUsLj@\BY9n_fo:NFL+#?:7gU$.KL?+*v:*#y+BǐuW[RP~@Cu~1iGt}1rT}`B~nqqx0ps *ʆ֨ĉº dIk9s1=k4GR:(mԦӫD5y?@y1| BLY֑E%K1J?p%۽'3T' hzꎁnL RfZwT5,-dHK4Vא QS^чe~R;}@v6 ?k.'q7>ce: ZɧmJu1qJͣ lQ)V2;T#sKe5aw|L11M-t\ ȹe!ANHǛr6䮞G)s[)k#Ȉ|=YU =R otй 㷃S'uۤ{bʀHe ?BgZ0YuFǚ%93T~T, ) ] D?by790Kjd sbQvںJ>ϻ %rZ*s(;?V}u.;D@b s)}S F*Fo}S2 [PFÙ"4k ۥrk:Cyy[d!iArŨ|'6rE%su*pО(PCs5$uL/FD#76?$e 1u&.cL4M8eunzh_r_==EM#<~fZ[;] TYgKFoƨ?NG:OZYsZTv 'cPA1:mE(!%/vgH/$`PF0R,l &TM9Yw ~V]xeEY}>F N\~ybQ@{'j*NY\΋n9p&nt9iG`=U*PEŸT=+T8 nocV ǡM c?gϕ=v[n+h֐ߟ9PSuk,t7&Ze$9 ,yϲ'I^ݥWUhna~3ZKdvdi9E表x\\WXXõxeW/k1璘;W5N& } z&FVR͘& ]Fmfq<)vbwx=h6 4TO+ܢVپБ'PW*,)6uYDsYh`XrǺY)?>aAlDŽ9W.@nI[[F$n{@ԔR)re4̒e^m$+x=R*q}e7~%/T)+J*q-ȖC͚UUf 5`=r$^:ܞgHD}upL,:)Z .PM>01YBBDTߝF=W__M*VCC޴xiq/*)'Őѣl}R,YTTSKon I׵ <šbϾPL([BqvM9A3o/|WZC鍒FC% b};C b [XP=*jd<(}i oT%]L{u=SO7L,Qpua6)ф57 0͆I]R3 ] [|zC>,=fqJKRbs G$zPܯdG zh'<0Hl |`ʕ?K̡G'">Q=°\y(FbCD+ EJA!'h 3ۈWFv\[[>=hQZ %a(L]Q.r7ݸ BWE$P-y9ʊ:+P%I:1 YfMᩩ@3R "e+ ma҂d=/L#JoĵV2*^jg&t78lV8M*/TW] v5aå F k?FzafQ|Hˋ,=?ǫTOptUYڲv^!4:lR8'·?ЏR\a#$tAo+A '7r9L75ᴯފASQ3->zl"2q)d6WqzfנP4rս6tP t0'TBՈ=G0+ ]1l|z >gJkڶ Rv;=KE p[z}`.Fi#6 ֣+w?|h,8(Y:a:OFVWs4ֆre RkBRRR HOݧ=jC)MϐemYՀGk#.)"ڰaZJ)c![l֚웭?6Bq,+|ZC{]áWW+A`r7~ zJ`> :I8FLg4X1ڏZk=2Y+pVD.W.,mF$ti1:}w;x3ye,NI& >ڈëc]Tb M/䰨#-N帳? #E^7aCIR!vwrMQhI_)BZ?mVC(qmXBhÂtWlo4g X&ԽrIžur#D2n}3`SoQI6HrNٱ!zo~Ff$urDdl BДzG 'g(̺$Шeii-F ]nJdaoa_;hz+ʹA6Xm`3iJ?ҁ̕L=vM=}cov3]Z ^sluE0VB)tN ]/)(~jPpU;P{;pW>eGhajx|XLEʑ8?~Fo³QFש\gNm8#< X;Fy7 4I:=++Tj|W0_= yoSl.78͔4bm"֒8ZYW#Dl +X(kğui3#+#{ ΁|` !gln"S EU``~vcz#fd1W&x\>cQ*>6SHYj"5q߫>I7q y>%x炨i,6A z @t {JF0.O,_Tm6"Qilnt桅!S)g@OgB5F$%WXFwBGxOIz[>EaO |Ey2H7*bm+@tPx%1 ,Ʋ+b & nOԀId> 9 sB\dK dwC5e>3Wk_T T#e᪛Ϯ3EwUuX&/\9*zIKUHvACij hߟ_ڛ K]þ&BŀG; ԭ{)FnAq;kMK5R\wfk / F(W3i C*"MPn?ۈEp,6CC7}x{/Ǫ.c*FʁSU"?uxS"I][-=7_fV"wt2 e*K]2 خ+u_#ݳ:Uqu{1pOu4O#~U]z ڣw?'}4;/u[}m5ibY'Ϙzn|-fBWsSKT,RW1|jj.ƐV'֗yLT*׌M] f/' eà lz_E]4]Q0Dz>cC|V;B9X-3e(Ɋ}RAwI*GwA|)Byw(C (OP%֬&*i" ]׾l\Hh_93(EvDȁNr`A3T)4vYHitc AT&<^pڑf&GìL{ϠK G+I0RT/,\!{QQt[Px_Xxa*@-`Tz<.zVC ΃fJ]{&W|;g+! ]]M@n佒-P%a4Q2fa,3 N)'yC iIyl: BCc!en1f ݬZLu0r߸Aa61to;*ڥz7la_FKMMGL_@|I(Ľ^R)-2bfS&!*횓Y9qL֤hD2wa_フ{1A޵Õͤ =Ub|ᄌ@L^ Qe=--yd.{Љ}bN{?nXڦ^*}3&ss^!śD,|JоIRQZjOwO%U,ʥV W'_KFOe+;a+/$k&񼕦DTz Y ; %ߛX<9 BM7DH' hL7$rJ÷t 6`*0tufLa[ʻ.zGx.zisQcriD]v/jrL C VaX}A9[om-#<܌i+ZEBhh$~a\E$.M:$/M賫^|E綽^ Y+m{2w3Vqbhf$D@u_! e?3 kL0frC(T%$>6UӼo?3*q"0pL~Qvcz1įntB8'o[K}OV.^{Hߔ+"\ː,Y5!rX^aL93>[Ee}/l6-ӠL{cz{֩brŝ$PD?-LM}œPexo.G]|Ώ=U,6]\n:{xebMo4*GjdyJ#!܄6臞K=Ʋw F+qy?t<gC~쀌T OTv,N'ӁHO3*+YjW "$QM$COq oUSڗg p2`sk%O0/S}5߶ T_'}%CP !;c[1-2f9 3m;AbXF/V q2ޙ/8o^A`_"@(0vqoN9zcc-.cmD#_@םPg|OapyF--dՇqy +v ajq %ڻ2^q_dR?O6Bfg^T@%ԗ)1FбuYOuvrͳǮa&v=zw#uAܲlzb+vX<ΆKR%[;]BSOTE; "Tqj\L 09^ < N $ $*&#cIoQl~ %垼+06<;=W,6MP؝fZuz_Ӱc3| h[ Gc֦},VH"47d Viȩb5ۍucbH<060ŤT+DC p?#@/q bWl|N} )|K6+eEگ"fs}ALRE-rO_TFk_4 Cti୫NW؅E9V"l{<9$Z"NKBHE>WJfϳ=,tyЏP3q qo$_`$+hR!M;(PɨmnWP>Fg?HV$TjI&@Xj 8]5v*C5j(XG| ً8?0& 93*$#s(?IVEIVŝf &wf.q:`YBL%r VyI17Kx.0ZALxFРs,xzW /V.}U&BdNTea;}'IXym2S'i;?8R? nIf1k1(vu̠E*r:yBU8C]L5MK&ہuhOC|^g~ % Sة~~tƁS.K8IZ=^; *gxcuLC.R"lpe[9V1xCεf%nA!A/phUcoV3&OI$=/g"謸\e"?ҳgk5zԮ`Z`Sk{ƚՐb9 ~0#ǁ=%*7S@[k*-|4sF?L*P=N9 pL=R |[f o\ \ӧP q#m%1':N߮P<%G3Z!` z!ΦF:)VҥfxJ@b3:6B}s=%#\^KU7 Qq xYxMiK Iɏ쌯dg81gIҝn;6O6tKe_ ՚l 3%;]ZcN߅myk<;> ,L/‡!gDLVhvd,ܘX>]?ϏS?:џ"\ s٠)+/(üϤb05b$qN?]_',6,t-aӵŷ|U`[';>jkB5'}O4qT꩎)斳Xer7fh)?<񓘡,RLOfYH>Z *esd\/CcAl1Óк+o,Wx+c Ke{@JkmmZ8]v(9E+k4.yrK8^"zzf_j !ͩP5ؐ˕Cgjj@ZC4P2U*\jIf[-2&$PѲM6tPȽ3i #D$2PPs wss6vdn7fwo"< )!_wh=( (^P>n4tPt:*+M_m37mIz4 363pVv}sm,Y]ͯDڐFl a0koo+0 `b}uDad|eU c}L69,!W% ` A V'+^+>_ <ǬҀ4!-)Om %ڒ{{@ 1SJ0 9(jFl<٬Z!jBsSB.ZzQJb-$gLj4,}qhP~>edLO.91șVb' ">9Fի˽h(|W;Ŏ]0 )J5*96c\6y 1~R"Utd+" ,j)8g$h %9uMXqUz,^ص؎eVw @;cݮ=/!LILDF^d jR4${q&UTfZ=RBPMi-"Veuka˲5rɡ"_`*qhƮ9Vƃg\a7Ϟl}܋5r8vn9JY 2&1ӧjdARíd_%Gm1=lH33q/צAk&3bQ i9іs)YX! kzdžF.y6@JC(&5IAfe7T !vR" ax :T!jņޢHv iKFarNw0ݤbkPL?$ \}E*_ywĂUhɵI(<ͅ[s.fz>'RなfۭZ'gh2EKkC4 > 0!j6lj z7X6/tTf5/ϽhV,kq~amioZt$;p0e,xmlCK(nTJM:gTYgԟG{E2*g1#T$LZ)yҏ4ʄgj9`YS|[?H(_CTGAB?XWn|[9W@hc=.j܄+x؞4#<VLjGx<:\mæ7pU]|fU x7_pŁ91CL)WJ=9Ռ׷sEM" U!&Y]R m#k=UCkrIfz`W$yЯzZvlFxAmh(e|  Ԉx,Hfi+hjRu!E2iC^1jjW)V-1e*Q\T}wsW==I7 eTtyPFS ar3Wjް\Jp Jn;~KwȀq;.V/)v=.TڔG-*c썃[C=ZA%`S,su9QYlM[nt|7Ka"qN,^D'RUAYq|j1GK`ӝ&vwg.䑇oۯҼ 0m?()S"\{/h7oE}buvɀçv[7)*?IQ(p^\V{P۩|W U4 ƽsCr<>Rv@;7#Z׋,,VYK`j2tz'Q#vY+ןB#4Є$h>$|lv|5]#1h&O949wwxȂ`@&!"Z\«KzTasq8la/ɹvTڇ."+p_b)Pc(gIt$#jCFN0=.7РҬ`XL ^f^=/6ZDNcU=D\+:JN1ސ%fd" {,`ˁ\-[+,-HIwR;c^#+&K)M>O/?Ѥozc{ý5y R$mKս|lۓ7+ ݛ7a3Ttȃ6Db*[sӧ3Vb]YOMHn-_gOhafh$x6| < ` gSn=8+Z;E0ھ&|?_%v Dt:~E?y lOv;ZrFHDM=3:RAѴ瘋N⁁xX ʥ#i ?R:qh,6^S`w'Ԭ]`[D{E]&߫{hlxSkPY.nv43:eo;Cʴ^Gⱴ)KBMXS"otHqa)3Am?+U tW~];vq.KZ6_Z7j/cЩ_j-z,KE|Rk 51o.NNX^FE}E9{ h?A9}bR5em|$b.<1wM,CS_=Iyu i<E;Ag =95w:0n7'#.a ;]TX% uz%8OBamd_بx7Wr^p,с])al< /8e.oW"ɞK{㱢tZ)ns)4 o+/{7dQ$E S+`g{9#l `V Ϡy\54)009\TI߱߉S,/VS (Ɠm gaZ {v3*qq]iڡV9ݱAqoy4< 9%hPZ>Qau,HY.]m 4[A9@8vCyP(mu" %4C!T~pXʚd55@;x 0Y.5EvxVj?FlIn D\'>'X%Dx̽BWunjJ$ /м!׺FdX~> i3 %{^ ,CNW 3}O\+O4(נD) Us .GHmXݡVCCl28lזO̧ Sg{\] H/+?/ I^շ֏k[xR||rۏ,._wѫbH4A+qɾoh)M[pZK,72QSdTKm\>mZ Us='ZFG٫*ݡ`*|$b'XM~{v۹qL\RF Bj*)Z]Ydִ@8&_!#}3Hݵ&1%ΠEAN# it"geȮւrv5D?fUqCXΒ`C'GbzȘ U Iv;¡ߥ]P41Ā=(E!+k=+LJ(eغ#N5DCZv@w}4ٚt~~C5+N¬7 D ' *Ni5"0D?8CbptdKi;2MQ2;jd!SfaĖChڛ[]}xeOWcĕ|"GZhbTe;;Nm}_ #Oc:܋KM _1!,Ea31]:Hk aVήns )GTz{f }IQWRP`Ň @gC8YQlfKqMz: \Y JPLr_kOlr5@vD! Wc5{p;nhcIzsNo$ .1~X_k\QoGTE Duߨ6βai ~Q!c9ff0BG93GA!QtnH4t/ᒣ8@ޥP=:c);5ԕ7"#S\n6hN0:IQ3)]|2@`Vc6 nc3&OG$rwڜg46)\R&͗3؁9b?ę &{c|G$-/?W"..eЕߏDC?;T*nH=C"JsH(|3U6Ta%̳XQF)dcdP.l' ,|JOy遠PRZv$h!f\}= /lM)hwB^asTh/N+@ޱy/r Y*d 2Q\ |-Bepo꼀u->4A}*-E]^/},$S0igzR r$8-U|\5ݾ7a2VKOz%[0%XH `vDow}'MLUL@݋G2̲e-W^(Xܭ-; 1XaJちtLlҐih9,()3u{S˜M@A;G>ӊa+^2[4[|aqDmtV267 ,:2D9I>(dsU4Ivi?] ފOΪgJDE֋MtU|wa1f睊j ?*F$LvX;O^#렏?Dh NAswƇYpH1Q#-&Z﷟s! ݠ:TKHE %9;Eَy/8_7{W)@(f=FF)be7 "L} ~E!h%Z?n0v齎5{,=KsO&'%V[r kz["n|xV :YCkAX1N5kДtj%0 oHvƑI 16 K*1lS۾[+h{w+3=ZtS1*6U?k8aׄOqcTuGI!U/4J^VwT=&U`boFCSFs_̻,Gh3T<ǯXnVyگg;AD7ܻS~?a޾z1\=nm@3/2#3d#;974 p+o'2 RT3n|Dza/x SĹ3EQC14.U2fƱMHWC/FŞWQ@/M(47E4FDeP 3Gؗg ^nEW=h R;+qP}AJwWF^d3D@2oebY4 7rc&Y U, *-~6 ( Ffd,7>ni9w$>\r$X$qd[J!6Hڔ`m`orRZ_KAyHPR2IK YY/((X.rwt.HYlncn$3@$2d[.n"d,$*7 .Ȳ">@P@9A5 d;dfi9C Oț\mO=!u?|xE&VLfougfFfbz%+G&:ؐ<=Fw?ܝ2@:*@KוQsAi3!)>#9ˎ?# 7ڃf40J:*V!g[?H0;sk{-75O\85{G:N#=7zǍ^.oBٳ_yN]/m4I$$́ r'g>La*7Wz<;ؔm΢o[udOs5b-mnD&oKǹ-;^u(<>㧂N}S&Nێ'vnu`{mULG~'6W1kة^h/BgGd%gSX<U &3 Ӻ>!9;n@.:h<3"6{6.d%74g Zu\5:&nPMi΍̣*!xV߹_R M Rz/8$fD:[:,Vow=4 & /ǃEP9g)k~e!BD#/'ᚚ/6Lh+Oax NGPuVwΰOP#0zBB} r_{UswӣxZ['`6WZ6Zn]J43î/_aՑjm{nT6[w#_,\?tV=n̩1V`OQpM6`r-ZUC/n+SplO3o* Sd)dDq&"C*r"G.P-3QB_Yxf.DJQIYLJuă1z(]D`a< 8OCU }A aoo${Rmt9bث: "#)Ve:IǖPھT~шry`T~KY"&C[4)6_ru+XK)@>Ի}k7YԂtvcA'n*(6UE{ RRMvf4[Y" Jwk\-QIO_KaEHAzff[~9[% i7@m&j5 \ q7a9 tvwF\q2쁘.%1 _J2[MO8Wh3n9pXаӃ)8zaEUݙIo& sn~CyfzgsEKNU2R 8iκDDvqp6TvpLṧhu][x8Q r+Ј$H@Z(8ćqMj噒K߄NL8nkn_9av0˅isErXwzFXz\bxo^7=>piMXO 6c n?bwܬf.eȨc4E8p,װˢ^¼;_z g;ڋ`W\}(LtÙeww+l0IM@Oc@_͚œO&"htɭp Ww$c}|t% kxp]oR\F|Oi+OԘcCJ!6 &_'tf-p1s.k%m(n]{F}|RTDQ%Pm||tI z$|Fg<l|׽M[sdz Z˟ ݲr#sZ uEJ%A~$^]] ӆn/R;io65TdyMr 8[d+K<۔xy]UHNvDU^ 4Ʋ}4b0-4X<0J&-Wx%ИYT^upMHĹߊ:ϻE2#utSH}&;_b {%24Џ3řqMԗj^0#ۋ MQKyyv r|,~gbcz+QY+ V DD D$!\}ACv%HF'(d2,Dۦ <ՍDh]r%MM\c%񜰺(yҋ[3EصU31/.u@;lNj(!fMX̺FW/Ƅ/yHѼ2-QԌMڂ ';z8tŏzN!ñEl%bf{  QvV)|xtB86]QS_U]s$̆uw{$@ 0P-oQ(`TNŵXLLDVpm&L ϹmO\r]S=.cцGf+\@ XW0Eʁ &NWf"KǻNJhb{%D_1wrd=$%u](zJ wQW[ 7!Pepk;q"pZA.lCW )ljW,l4?\Y,fvvFLb0⓪xWB0ۈjҲʅڣ;$'Va` üvFHs`Sb6irυə`u5l,;L5܌paıhnKR: j$B*hx%*JږZUB'g9 c?ϨSobvr-QO~c0c~"\a(Ek'y?Ƙǟލ*DcAx<x,]#uԫoDł#8jKsW׉ PE $kpdNe)73y|ê΅iVG/"lٿ;J0)K"axb6i&'I g>oIx`kިb> NA8?g.O1dLcE EzGvPΤwh[hb1ςʢ&0Cc`9jO8P HxTZV2 +HPk@YFbb}҄/,b0ɯ2M@鐙Lo7m1MjcH~JCuA RZAv1tA@eΣs'`k[]GNl YJJu5j }_+ĵL ML#Q/{3% kĄll |yf|yמ_%TpU_jgbY 0G7Ղ%A~:"gy)nJʲA WXҬ]>((?ì܂ Je$!w}7"rS5f; 2Po-ZbMb _WE$:QEi[C+^^\5\Ǒ 7 f}LT8HC_K'J+@W/ֱ4NZgsx@HRrآ5b'DԈxOjP1g| +Pjڪ8xSR`F tu @|96ʻJWF*H E(S82Q>k5cH 0vSm,v C"T<=4?iJR״$GU;gc &ٝX<&T9跿[6֬{(gS?E6(]F:Wħ!=tR:łz1z |3jΕη?G!;Q0]Cx eE=O3:t& PfIˉ6oϜOύ!I*OG\^9jFQ#asq v*h*7'73O!JT+vZ7F4pY5Ws(N7`tWţ/ck=q~tI]ۀ̈́-F @mcO"8tf*q^v~igeF1ksD< |9NYCE$2FVchze3E@2U*YZYq$i(S0(,,fmU ft`FfkF6w##KG%r$P u PO] hڭ)v !*< A2%,@eɗGξd}_ 33V5pp~y޹ryu3]w[l5鴍$ @& 2<'m˺#x ?^!b '*Qb"J}PeRH*JEc]Vl SwUar̭ƥDLH5)KnJ$H#eT ^һp l<8P@$DXtnH=.28SC N6/f c+iXU][pͨ>{FM̡Φ5,GyJW|3'QWƍ3@B~z: w. .dr4x]{/AT9K֚RN0XQFyqb#9IiDF3Tj'),%1M5ױ0~.0d/HBb,?@A(W )ްv U7 {y-xTZe8} Rk7Iy.@ǁ;#-@x3'>֎t]5}*w >8Lfq< ^ _  *g ])x6Mu9 =*k6U*4>6d1fG?u]K0sW357` Fcڶ34p/c* QȞ,Y*o:tP b1QGqbmXy1f S5!`lSaA`eĜ.0?.hژܱq<0JkEj2s1?w8. $ pfK InyrJKp)zsMQ3t0+(BNEP>'.[p&&>猎q1Jx6ḜDV9z/(UϻsCHA?pwH9}2q5ϤOJgSzk>e,`~~+%ıآ fGM@M`f켻>+]/K-COHetu^ 4P1HN7{,n ,b̒`^xM`+Y}>}Vo9mK|J.55oGu>Rvo$$cP$yP2t \?~W^1a4yن\04OGw`>Q_@COAY*=VY<훫 x]BZgB_..]xt s-$z 唕FV*ӨW]CMJg)qn#j^D["̀w!$j7 WRiQO>ʋ/7g3hKw{^<5ty/$(g GԒ̎J\{ 켒ҳVZ2gJxFxB^̝\ D|-rX`3^y6HycoF< UsEadEfL> $p?2wXe Ϋ[ /%`]/M(U$X|Jԫ- 4poTАəl ]>$`92Ks0F%;f𓺺,pR+ix?oGi\Ǽߐ⥑˳h:-29鶠4",>s_qm~LjXFG&ODJ T~TPZ_@tSSG_ =ՠ=v]o:k論Z{2 hd7&g`t,Dxq99ý8{@*(Z F7rheZl UKQ^Ɓk'O*}.٠ȺY8>S3ՖgUًU!CẌq:FHvv.wlTrA*gY~4z@Xy29o.G4hOLWklV/{|"}Ingj"/GпgGL%B lz!ku3kͷ#WID f) 4 aR&bu-qZnR~e+]$JlovOl!_uR [H_Oe2 8vU]ǧGэveym(VJ/;9T S{3v2hn\Lfxƌ6eSΰ&(nΟ=V<#XrdyZ+ oۉ)rТ$G$:;n *Zt)(okB\ ,/]k#)|s=Ë0؞A(*gM7j澡Q|wv ]֑j]t3Q&00_͌v~a_Uθ eh͢RFplpD܂bQez5iNMO퓐_L̴>(pPY&pSSMpnO$ŖET?0;㽊vs٥\ӹ$f/NwKqP/3tgY m3J/J.jn8= RP[WP+״oL,G(m`!D/{ѣ!(E,K_袵{TchQ.?,Q\p̸k[ՙ?PH)eÙIoI9F*^H!; 咷A'Vx }MFWotT񇥉CUO1;Zoy\z'g՟@&q `,rG%/up_b=|CK/xUoYj#Xe ܂]t](j13lEfum ,gWH }LMBM"8npPRMNƔ\:RY*IRs5 ~NUMGڳ=qtWB%SZ](ꐃ"k$:XNGMwA3boNe^N5 ! ,xy{[ybZQ>pEU~x6af1>ܦ;@z`c>%K^b?3<Ss9k]#aO?7+=>]K3$'ߕ@UJFl Gdwqc;P{{:čڶy[{>~'@*=}A@臨j{a VxƖV;v8bm>+X6l jmha1 yDyĀd$W ^u]&$ROp6ɏl`;%$px>c_ <Ƃto^{:k ;4sme^1G [\ 04}?`09g.$ Uj>"#󽊡YqDgzPnEaT4o0~Ez׍Ώd+}FP$E!trFdwb;ZjJm!g#1,-PSo*W:xdxЃ΃ `H(6rIgcvY~$zYK,=b/+P$ ! ɒ<7U]!2^rch%Tvs@ʶ?aFIs5Iw&kyӬHt?D6A>H҄?li8Jv_#5u⍄2tY#{kv]&RɮJDnEfE MAzUS)cf7kTC܅׮Wh/,-̾dHY $UҜ*:qPdiAI"lfn̬B~)ƢXR*fEEӟ9iIKI#ne'a/u#$ AOt:V8:`^$NXnpn}"VnA8nh5L`A0 n}ף\y{$}l~4:<也5({iG$yA>vT,-vIpN.ޱ0BH;/('Q>nSMQX4|LOGgWINp]E}zL݋1\Pg~+h? yFx3}UQ@m `'pШ7pmkrkϥ_ebtU+ΟPugOmFs(pΠW 9GOs Sg6#;QE$g]F=%t:7JF;? Fa)QgY.vBL>VJj,ћdHCXHSho@@[>cO_ooԌ<|h}jdi_1Q[+g@AFq3?8k/ۮ\wC ƵKAB7 ~-~g[h1|w B?NϲN W#eҕ)L*CPҩRѫ>9[<~++joYKsSVT x;e?Re0B"x ^:OYKEQ9,4XW I6YqFdi O$Snr$ˬ!>+́5ig W7a UVLQ!jZ7.]$TynJHgt8 [ƃ ثxM!%D<\PQ)FV xNӰ7 8P' ]YĬ{+I!@H_;=/Ot*#'G57L]0b- Ĭ&L< )X 1 P;[>Ic.zimS%䥤>;ʲ#v95&3kanfmق"&k>;+?:AeO]߇WpAhf.~7FKP ,|*Om 4B-Zռc7XV 5{} ޽. sex̑/0O%tIi&_VTdw|]3Z[@ҋ]XOZ.t&i戒^;cqma0k*Iv G>9:j\hLqEKh$@,]8Df(-=Oԃum"@N x3F;'@)gq-H.h@;:9?5kTB $QgA-brR@f~E97Twe. w?6z<%lNUHZm\g!^ݎô0 U Sߚ ͫ $~Eh枫sGĥUL=ۗWvM5h-dѼRG]&y*m w3»9>ܙ@ږ`e1-;O 嗣Ƒ")uQ.ٌ#_!6/Rȼ ~ '0,~Juɜmt,X쐒|r OpWX|r}Nu+~"}4&f4wv+[cЩ*;mVB.rVbѢCWfZ5_Uu#hy':`2YB"y"C*KRRYy/ֵq3ʜLE'ڂ:7巖Zw )*P Fx)Q䄉~qHfYO?^`sP ʓBVRx)._>"hc:%.MmJA!$=\ު(Nve >iEf*DDP{!~mpigjȔشIq?E.uR/ iO#)8fJkҝ)VD Yy'<W'"a,7%{+)?]*=@g67fV_6SdbU-61&+ A>万`~qH&SBt)L'@ QKoU+3k7m\{ɬfFZYX]zvVn1{i5 QKMn4u#_ _Ku80_+W(Œ pCr+^8_;/-Z^^gS %e6b^6҈ .ڟMU9UYi7zP(wuK OƇɮ'.}.n)} ?2#PIVPaCEEHs8 }*GRڌdgvGP760}Z}&jj bܥ]/cL}&tm(>zk߯Pg5)~sCūU#2Y_ +WVqJ/vr$VQƪ j1< &mw/k25b skXNΫ.1}~P%=? /"W9VUT9?:\LyU W8 aO}u< =&ZĂg3*R3W6[}_Z2 xn\~tу#9}_&|Tp*JbH!MwJO;5PV[lcy3I|zEW rNT38Rmsl">3DMƽ"ÙB\@=n>(ح[=p7t#[\uŇq /{kZ2|lqFlgSQer>d0BFBYgXJiURA1@?hx-x1+!MnW]\/rxyhi}V!QDL[K/z!ؖ+ϳ!qSV{KB3# &1 VI<4c=00I~7!*Ks?gYUF}zvO oOKHܾt٨A.Po(҈3{ѫ]O4VODz)kmnL>bRTx@twJf;hE;Cvz7xS(ᴾl'(/-$Ei3)lYuWƉIRϾhu@nTb  Uxu!<&=G,LЙnQ 8gDYMY| ʂ`9kxvio[Wl9:}sxACY!LFWUl̑3Gv7e7 ӊd{=b[+N4p3w#_D^P.;fcuSH#>4(*Iy5zMC͞7jFo)9H]3V(2f)1_nj5)*BMT<@(zɪZ@]TU5+k_r,D7TҘbDkiq1mIJnԈ;!PBE7KxR*FAё#:rR 1y8l5mW՟NIi}XFPET{ml_8K]TYfj'ba{jP5}Tul8+^)Dzd2&W}s?6Ȍ(475 E斆MVľk 6@7׌y͌@qq9 n`{"t+}1D,#SXN_X) 8J}F q |X͌8)E+[o0|eZu>:mhKբ\>/ )=wp3wA{{5b~[ShWnW@z^F;c!#vk$=t9~[Y RʜJ:㫚$U2HGM XfӃ1"_U@`㩥^#2{xW dϓHB @ 8Q?I&JO{c.'26ֺplcN~\ 3wky?3?.tMm@ˊlZ0Bȿ}O$a w/#-|sV/8xwC?IsҞWsr'͍'}f{FlW 6tc ׽{A"L e[Ig@W':-mlhse4LBeٷKuZ׈;f57w;iRox>+Z^ҹV]8-O?Aű-N{?V58$g_M;ޮ(wY1ze46yow9,ipyk'~eh$g9r|BY='.[Q-et#v~E>}[T7RYOB A~+}T@&7q#9@l(!;"ؙ=  'kWs՛W$֣G\HAx?^n~-LJ`GXXчB$ R,JJ[Dn\4}[#9٨Dt |c-x<gӏ_OOȖcŮ%#3Lƙ3%LJb00r5+\IeZyZ+hEyt7< _}X|W+-|ɞڹNy4+z6.fof+o?8L?2xB [SMt#w=D$q#(尭|>=)}r0Gceu*e~J!xܸ7NU2 bwA9Gت%y]q:th 7"p0Eh>J;dą!>} Uw$+ޭIe Xy 5w2`˔w]ܙ4 |Ԣ@/f|gkny)IBգ9cώ dnSg#Mz?tKȂ"|(tf^%xնZ7:n'qf~$c"MK ~{c}U4% y<( =fXW `wv-R`?SN׺@$Q(xso=F{*`P tdx5!Ż ^5AyG KesR >ۂ Ltz59 B; @zlŻF<ҺhaMb^JX:Tp QDPs'* X@OݸQQ>Er̀K*YutJ@EsH!Lb@9](pWMZ&ͼ)<-)RQYGZEpj">Im N-hwWGClfٓZ塞Aq1ccP"}4F *#+\i%/&XŁI'1npwkeq,ޫii {k8O0dfDFXN ۞M?hUa.is%&eɝ^,yh/|쐴5'ߨevBMaI!}4]rnoNmBqZ<^,y&ؼbX;će2j¢J#EWœNPJ_TC){IaQp~K|_Z&'q"Q KM+$+Yk ?gf^ksgMȎ?8y!{:]^OHI39(GB{EY/Y&uEa2r'r 4 kd'DȆsqÕ\i8u3Hj,=>rwr?u4Au≇Ŋ:t\]%QC|Fh_:G\,X~ &YNA{j}Rmaȣ穻'%WQw1?"ҝ/~D"C'X̺B ۗ-A #i+r9kRZH՜.F %7B /Џ0#O,&"nIܓ84wSo jeTVXao>or&p49oX+{^]]VtKl9 s{K0J!y?mwuHc#AB-f5&ygk%\I kAu[JŧC,0![RTaLKȭ,7rWB1~r2> \)>_ܗIgZ`,Y;7hmؠUS r=&K߃^|H-ɳ#=_ʾW xqL,[ k@#4S[?1.~ LDM_Ir0eh`|c-"]@HmʂA߲x;zEqk ;O.GWE,=yIJ #+W! ^X$BK+ \~1 YE„\,qF<3[y+WH: pVWPa)m; HT*ﭣu2Br}mw&\n@IJ/7 `Dl+d"kfv q-e~KX'н[=:'C(mg$3s nHc'd2C@//yG%Xp3\8Zl2 dC?zuG8ЙSoReNNrdMZa'$]/,zyl7т s+4"" Tuu:&z=7?-Lև "wG15/P}5y;&ӏx{- u*mikVs"hv!=)YJlR T+)PUj6ŘHzyUg;R&iX@]T z .Vk.^qaV#K`ȥʗ(S\sp Qşr!/3W>L@=4-Lձ,HLI{Z0a?!3(X(l2}uRIgzu?%&?ka얹㾆b),m$C5z[-`fzpx$?*W%8_;,;ʶ;IPo 6Pï_M[1ϴW0 )N?:C15B Uho!Q%G*M6PpO-/y[3:|:[ e_yకT -'NC#Q(_ƃlS6msUEib;C|w,N gL3-x{aתEBvB.ɪ`/$J3,ad; \I*Biyg(#M{Fu(TvqrJgM7|Xøb&+ k.j|,Az3B!"LoYDsOaG86FL4:/ͮF8rǐ_#UŴR#) x(v?dVSWIɣ:uא?w_ ATM^!z))v>󴅪7q_p. ܌/2<, d\sNHN=*%2-ŌvlWMqr~QwLi1zm󚃿X^)|E ]K]0!}?YHeeU9,F0G [?o"5TxRa-gr|Mcw`Js٬G͌0& d2+*րN|MmK#|גد_P *hP) i [^!a{dB֤}qKIigU yA+{} +C0ɗj$dI@s=[k{XV;A\\[??/\)f0 +wepJ3D@2oebYSjɸy̖ h4m#]CI_H fLf!>0i]0Vl[=뾾jUVVի$+>dˏ] gڪ6]hLf4HU@;@wyn机yͲbi[vs[:pkKFHlKV !jd) UD?#~0$)Q?ѧebW/!k DA*j*)Yr qYMSrEp[Z1fUw5J iee32IPV 9L/ZjuIϿj;ji{'L@ e Kș&LYLMMўm侚 $Ǭ gwZɡ@;}˦M+qY(|92i}v2E[T~,6(CNH*ЋЧ[vDjE6U#S ͸ږ˴&5 -a#Sx,x(\*Y0M tLiR *kf|u/OE.FtHwY/HiL],+:Dk47u'w ,ܢLFн_ RY"Mim}Ug1jG$5~8DmJ[;"2,m[m̉ fke$r9꾉x 4UDiu  ,d^gu\]9AN&UH?ODȔAL V[xd!Z\>Rm:Y[%opKH|&hvE:`!a+8sGڦZ󠟖AWUOWI]%,`rN%Xt+ڀVwD9. 3AI#-zTMYTZ'L%(C^Kj<3[WlAgCCI>fn*8ݽpk%̹Wa( UY7)++dV"'b,=#Piۃ Op+"Tb,S$NzmS{g= %2)3R&J{."dx710Z^S*Piy) r祖XXp0KYy&)TљJwc%:3 %)u..dsSU|Y/mǺС± UbHV%)!p: 'VDx3MqCг倹7ăa4zdނOeQHاP :APtQ-yҠ-h-Lk>r Y9D[uQ̅ FfǛ0s7%QkSuN/g'!+D%Sę/OۧLG533:jA^9:x)xr\!'N좹iᬭt$m{sb.1Πy6?vq7 *5m)H1hC4(BRٛbq6z'3rQv#UF:vQv9J:>}H}C¯R)vUR 8g# \rW/^'~t1e1pxstV}w⃙l2߻ǁpLi#~efnK[TX)>4zZ1L7h;_Aop:E~bݞeR_V93_$<6:pbjI6842x^ŗChxaMֻ,bۘ>W7zkæѓXc@;8j   w Y0 @-EQx7YU-S3l*Ūʠ@o! A@ČlX ?\ 6{!Qx2z,?f#' 3Mm@D  BB LnƱ(=?rFf;Y>.ȁ'~ą׻\Qn7ɹɨ2In*``jy7 W wg,jĄ)tN(@R+XȗT כI8%^*hf6 Mv*MsrR" 6 9t ڑ_̴czZ2X+KqVo04 ' 4r(Eݧ(Zb 5҄:GM s\Қs su &)XߑX BC`6yPTQ|}U=7)~c QPolj?v)ܚ7o)״݄|ZO|̮+WVp%JOK+Pd7L}Rz7J&mb 㷤dz8UtrF'l@Ќb43x*A^ѵas9KKOaq'ddLl%GNkSÊ·B:=bVM=l ,Rz[m^3/rB_1Ωa>9Ϩ/*Z& R_"J7T0 $_&MO`fMO \#BmA{R`Nn!_lXNQNjcWMoc槗!P [D7:;c<٤axc6/D pӷWFnx^o, rsR}Z˛(;\tsHVt9Kbi ţ#ZZտ =hD]Ƙ`;c}oSmto{d&mMܢl,1ks΁|L/qjs%`V1~Ʀ4ψ좐M[Vd[[Cv|;CR׸4)F]OʤDJu(Ux'xQA DY(-Ro$Vwn-^hhMJ,*briS!gG18'0 Nr+[g P: yT^nˢl-L_#!ot2Trg$n ŋ*(.^.7Ig qSvr6ya7tl9;̔7٥I`>WFL׮iYX=⼛9RzlE6l[~` [8jς*Ф~Jb'YuL/p3K|-]_L$YkTjk /UȊqHw )W}ʤ)?& )ixo w0@RFN?Ÿoj&x4t|G>8f]C-ŹbSK l_,E|Pkﮆͱp PpK3(?l V ,RUm>! . CfCIuT|TRу@ @$ L9Y?N܎č?:.ԏt?dmRc C?'GHx+>8y&l-+ebuՕO& f6ܢ~r̟X(ʹa}X?B8t?:> 3F`-嫎(9@U9YIėؾtZ\b^. 6И_2O뽖yb] 닭v(N ]xcf^+.R]=EBOz8C;k簌uHciQoVupG.zQInCz_H"~{iqɂ_ d GvMpC:4ZwkU DgtA.у> XiZ*.kKXuiͻ`4o"SoKSϜmM/|?6֞ .H" cnyɃo8,1V zI^r8fd$t2ҍZ(ui|$SxwT֯P*iu*p4y("ݿvB~ " Sa ̚plXx[b馵6;#3:%6Ov2NJu ֩'|FC]8;heL@ٍE hJ?`xEzy= {%ָ"#x6o e& kdXo[%4 $\fفJ? %dLmRIu!ցo#3W/DiDGV/pHw 2ر裇Uӟ>bϫd.NGikd{0N=kߘؗBJ -`Y5 5u4΄I۷LjPc ɚaqYCY dF03/&,$VH qtӇʱp& AGR:/eGv*{ G#u+eP+~ab,ؾnUȤQltمb>a[/>V>ت{8kEx ˃Ѵ,4]^%tb#wVM`I[4^I[oA!`4^K @M! Sp! ݶ]DpMu&gpFxНtTxa\JlEۙ!GØՌ]yNױ2x<ህsJZhL%d8{[XW^R ?LFɡ~d;\^jRܣ.c:~7ohx  '?f cI{yO5HR{Mkf`(33\E-8ι3s2Լ9NÚ9FM[Y'q؍;uqw.Psz/PrE.{Shu$Q|#&!Crg@Zu{?H LB75,VbB9Et`sF *R~_Mʄvq4X{ ZqXV77>/=;uzJiWCo#'o8;E/:)9jP IX,*2hd$ണ0' !E3:5K WdzAIU~<~=kR yi@t@?|rƖ/aȫUFJIm:$(n%<0α*yȳ*h+h̸`ZܒgRDYo B An5CVt?) D!qV`CrrOMM t3^;2DE{a}u:"^ewr1t¼?2B~J@Ƭn.1 =~J}-"d#w66剿yvӑ0:Sa9' ˆ߆: jgv?%0do%} 3н'~IuYq%}v!h+3,}~EVR hTkߚ6sg|blN0 +[ϺC~;>W~.(p<ܟNXnB^'mކyz@4*6iixMF$/OK=9J`y_̌pNJ@[iVn}`LE0b*RմTPzC kӒψ7k9hIbr\o XmtJ|2J(p2Mv9sٖ =F_/[A_iovc.9@ܞq\߫uuN׼ g?Uc, y`pM:䰁UON &M_ X@6+b 6GiWbp_-{Z7Z'HW7zc430 )`y/sؙW= ? WRC: ~H=8ҝ6\Co}f8g=4ťsd#s S }%: ($m#B1!_ Vڐ4iA"?cf_te6f+L%d V[T28{v,KN-栎`J W~BG{ȚǼl]4jNxσ㪲Vgjrm LJČg\N.{+[+l9Y101nD-oi\dtPCCP#nU/=֢&HXM۴(,-UcBm?Z-H "nfkd#3$܋7nm 4;Qݑ*(WBCJS=# M>ZݒI/p7di+}߻yιenYyesVڮck,Dۑ@I!]5֮d $$ $@ '׫9'88IU0r$Q$qz-OL)Zq6ɭ.J(ڙ$^}$}HR晓[.^4ӪVl|2 ?bZMY3ncUE҉lWd9aP)hB֢`?)$D!?9;k9Î(J d} ϠBzHcDI9 cXT7{.QNLj; sƙ2n%͇֤e}%Wg 8ȫզj&3[A'WY#cYnm?k 40V<:H_f{eC#Z?>8ں@+t2y\gkOKx+)P^\?&85qyllUͲjks$ҭh[elhdg7;^$b+O4@-sBiSMzpz- PT/vTa8S= 9挪wb"d}rM$V߬\Eě έ޴^d'Mܽ[*^Fu_dMoUR`S{>.Ra$9ȜOm;x*l_9rL͇UyzK=ѤغOZR.e n [k%A6DUyvIp BFQIeS.9w?yA>݇8>6{,fb{HuƛyP/CO =[0ҞmaN)Ɏ EZ%4WAg¯ްzc'rK&~ߒ3mS` I-mA7-È1X.3jrz7S;9 (V'6g*kX@uydt\RSU>?LǬl AH-ʆh~4Z\OAy&e2x nQjkEϐF(=ӃT=blG—r5"~<,b}k8ӓXQ^簶s[d\D;F+'bhaBL^ M eՉ u1y 404Kד4qO?neVa-fjÍ$n k8Z7/W\MµE;P$Pq=iD/ =wsL.XVOHn?{Bܑ\lNڨctZ>k!3eks{efdHp@2r6b7F{-~{5v]IG1 TGu> rO8TT}rk _`'V[@a>掱BC/"h) Phўy蔌0ghM-㨔{jGr,Vq Wz$$ǰX%GUK4A]?L?TiKB_*4@VW^ڵɳGGA쁾۷NuX2g*;ń;|%'j|=,,ޡS4|4\ r12w+4Co;?C <=1G5tʮ"Fۆn9ݵ+)y[w^]XJ﮶37 wQ{~ެ^Wv-&hJE 3.V9? ~V*λ>/Hǰ|6%prK;T(A}O@iCكq9"ss: ZFr`Fgi~R2r\"vɫ0RIHqgvǜX1U΂Ma9m{8H?%'@ĮbFxO%LRt>[pg*r9mmT C3Qw<9bH2SȌIvY^]v#Q觹F}4;|H=0݈ ͵C4;4)dDͦd+C^b DjQ>y/xq zߢJe=s+x I^0h(xSϢBBC$Cl|'a~k0Հ520248?4S^h]u⫣i8`^r]Ck00wn qlzH\YL` WS,wcnx< l.*]}wj*=Ycb 56q,sՔ^EdS:7Y 3SƇKzkʘL?&ΤjuXE.p.(ٺ0Qv3DìvQQ2Fx(v.-;=ph_W{>݇(!ӽ:g|waHݶ4AL[~-_}@q$Hk0$YŚ zCp{YXȢWT%Ē1k$yǜ^ђo܁#+u2*#Id13ՓԀzx];^ь5n3hJs#7#&R#_Q2?1AFz_`خ.Lˣ#v~ dno Z/G(4C!nH6eX@Q R0'~ 'tB \?D;:ҏk9 Ԩ%@|e낮*vV!>B5E* :@Y<b[ĭpe9VjX&%^35+_bOWBY> WM9af^<hs1 |ʵ:!v4, o8u$6?[Mr vIѮԆ֛O$vnGUfw 1E 8rq`$N龴xjW$[Q.]!e_A+A1jڙm..G1ouqqSDbAp2;@=+ i~s)nGR u1ȶK @N  [zm|m$5[m %0TIU';Iez@jقmwr {be(O@|9ϷpI `/^b<'< #<+)ڑ2Ei1s: |@h&bXq+ \)/8景V0 VӸn؟#3CAnv2ۛf9HX+;:T]@ =Z 4p~H  RrGZd D=ݺNLTC v'-XI` 3ٵE$lD;'1[ぶMspYQ@zqHb&d?8-{[$'&J*RRkh2-*yjEOэ,lgmMۓnt1- c.ϷgmwI~A+ a\#:a-[L,̆}GyF۴ds{("P\>WZl8nns1*O$V3"F|Y:#E: ?okrUq] ē#!<4&4Ȼ"QӇ,A=Z=CZ2sփ= !GQ^~埱`sSP2eq'TN[r$WڂI?[7mPp:]t)*!#l_z277I(og'w$=nݥ"<N(*w6r:+U}tTRAQTє~zQՔKH@]9nsnn([Y֋%dnmYi%a"Dj@υ,UY_( '>|Q"IfhŸN%"@PH&:Φ/F Fu&4 =s;މoFLH( ~m|O'׫*ˉ?M6|D;"y?:J&12MAҜsh~Tc.E4ol CJ F'$- 0:`hʙ$4||lYU $l'#Ao7aj"yXK#Z hrRi5dCuϭ:GH1o %b'uZ5G"ǗwY*9" ldhS8.ZA-؉)8-3)f( Cf4S IS3TyJ&4l\vHBÖhĀKϟGL[{TCi:&Fa ٥Zc'}אX1M4}ٓPD:!΁ci=^@$5Q9(MXS5sVZ4l&WMkqj7"2ߜM0աQ?I09W<U~_aYԜaCɝM^Ԋ?;ٌxl:T5QCS.jFi6Afdq/ 5?p5 F4؟q#t)ĥ1iZ835[3SeOP2r.T%חɷ K7橘OvN7`v6 MaC!hA~nP7L f:es"6ΞSlhI>m*i{ ܣSS{~uC _J Qu5~hyt;8H_ \T E֪9fFa[{*6(%{ŢpG@D~oHnCB4HP&fPg A#0a&64>l"`)u~&mLJPJ8R[bזshQ=0mxFv.#?q`u:'בdLArCq$k@]`܆9"nK}684ĒNF&JQP0"(ar2T ο$1yOw?FDTHUʑd{sy|M 1MJY^eB3&o/.Cu>㒊$T=4$i%Q~rNq&p.-m@)D{AGS/.x8:Rl'nyfp&g}05mC2>=wQ|>wݡ&+٪CQwrzJYj\! V+u @ǂ~ĽHЩveG؛Pln^'?)%GC?$E%G*NWCk+ΗwHG2>Pk&˒n.`;M1B-:vaSQqhQ}dr{+վHROCJ|T5`Gke(O&C>ѨM7zoʧUs+rp Z0 )[ 7MiGm3ȁߊg :A9W F`SɊj HB}u~]kes5o5ӟTb4^*jݒl 8-@Uoρ$pk嫉_,Տ(;Lŗ{}眭]SuI@m70#_a)n6ȣjJA/(kէX"3J(je~`os$.jmŔvcTQK\dH^[lƚ*FEڜ]_Zȣ&aƖAhlle1;631 N0gnD?:*ͧ'mGJ6Z'$x~әwqQ2e\6VGd=y$Iǎ X ! }*l&FEƛy)JLwGRiIo:X\;>Wf|}⮐ kpoC:Kc2T`=8uC~PAS&LR];.I^pWrZɖc3^.]L l(/%9NZ8?sh5Z;j;δH|C^AsL #> ^F)SƩpk6נ`O C)j# {Pˉ;iŹP^4E.Nvn1'C:g-b@3(&{ecuS DQ7|M~RQ\jtCgTdDMndKA laFsO}5¦TV`j>^c-2=S V, S- 7Lb*,[۫QN̶iS 0ے7'1\b# jȲdp]a ]*Ge+H1o/9^ "M; ]nph;fy/) |&blx3!C$cYaYB| w촪Tj9o;w7Zb".]CZ-H6_*Ы(AR.TZ.\WƒiT7UᐮLtMDR׮%du >ftuq}͗س1 }%%^6 KȬa u#}n4kõ=fNpK+jx@lQIV!^~8 ؂~>=7[/甗<&7E[^̸vFsS~ѾJH"=*]MW^$|uevo!`$tۥ4^qg"OBcg,QXtG~8 :$/y>Dd{#L' jk#  /ԽᇤQFXGc70"XCWp|+ec'#a,m)ldmr>id .4q u/_kqO(~$=5D(sGZVrbC,8X=>վQc%~`޶v1uʱI߇E8T5g]WCl&x۔aΑ-bdOBU%d"b;&̀ >@ guQڲ 䘐ճVHL Hܡ !'-G:o9} >n7,D4XBCsYUOԼ͜8L;_ ~? >w AED VY{Cۣl b8*¿~Zᕰ 1hb /o5f7 W% |VΙϵs\N{( 8,J}6ԇ3wT85mb@cD!csiĎC{X?kƢ< et<Ӊ`A8wmy0[MιZ]ux 5r unF1_mکsTֈ< 7~%PFYu[plfou8>m|AӇTÒi$dvpo^ݽE|p`c"f&uU(W=a~ؒ9YFO@ޜ].sfQ%v:s"HʆZahWe1%YL0u"pqO#J:6Rmws"1>:nj&ǖ(SY!KZ'(˯XU-E)4:ż\P?o"ԥKT_ߝc9<$ ߳k暯ɹE^BЅԈ mQ~y2zRb0 džX#sL6vbL()D3qoy(j DUќKES??(ڔG8e=]A<wx c%H޸pTM,6Gk:Tc,r~<(~rjޝbB*dQ%UO*j+9w r(Q8jIz[93Sߓ;&5H OEǷi`iKjs?T6˛`mi-wc-M\y%(iG .w\!i]~0j0 %%B4_SDˌ%uKٲ8?Ej,A Jy#3lGtl~Mm_z$3QN7[*@'Sl5F7xFMi3Ŀ__ܑZY sHaSLov6LW~(0eOyoprde۞Ae-fTק)*R5+0? AU62apxPN6UK՞q^I.,*\d/kD YοR!tLʎ:KiFIrrtBnbEHGO/!2)󕐖Zk ?37|}Lb;*u&O20!DWP{$Glc%8F/:s% ?$ʜBlȈ%J]f%;,-q{Zd~2 zMs"OD P0xM( ] [#Zؒ.[#˨/hn&K^]E֓}A\ͳ@9 ™zv?:5ݣ %CSW13GQʌ(2aD-U6v勥Mr[y. ܱ5ODJlFHPBKXBHm$ɾ:/H~QIT%jC~w4N#+%/t|k l0]<۳cWx|5ABP v9[h%1T1ŖQs#[l:ȂP»_@WN+@Ѕ\@e 2,P2="6<+@{2 v$>VygM?M (݄YBe}aZJ,-َ|5ΝO3%g_7[DD<= y)FxýCcF<P*قϷz ׺"ʐH [)[o6%Zb::߽/)leQ5ju׏UYL&`';yO -,Gk [:aH :J[uo!%nE9kR{ӗ p{CD̖וɶFCzS?/pC=nlt:fKz"i6U< AA̬2q 镯XNkcfk0Řk0Ufe,xNx{lK*dן::ңХYD enȞUo;>ad"5Տ<=~q> `Y7%)Cax߭oQ[!o}IyT r@Mޡ8<3[T,^Dc"Ѯx'jҬbo:7Z{&ڃC`#>/F}~偆-»ɚ\n+Kvd`9A;NQh돊ů`R]q`(l i MCέeEI))%F?"q Z6Ҥ hY Rt95yMS|^ W$SĩBw{ˣYS$,TKpIJW$ XSBN>B )ka="Wi$ 踏Qӈ0|gO{_FX{ B_' _)>LЧ/*O ލ(6 XQ|h.یn#(YP7rI@ˠ4:r~NdSqyŲybb[Z4n:CP)^29":m*S] d]L5"%qh S[d t["vlw@(= x3NZq(*Nw=:lU/.znLӘAYUWRWצ= 3ء)Ξ]~~(zRʣ/.q S+hF?u -{[0D}M|Rؿ1I [:=,ANec;jc,/q6$3J&_}<,HDɐٟ0]ʭ𽌓汘ԀeIZqײ>R3羇 R5?cek#.މ"Q;>R ~Y}b8[g{ ߮b%A0lOF nQAY.?.o~jx*q&guq nU3⧁1C*.Dx\g͠>NkFBwd[2,!\m dF =\cxd(\r2?6'8gkqpLC7޺pX chͩ7.BQOK❉*Ukڻ;ѩNfL>` Kϣ为x0L 0NG>Pm][k|?Rk %vwA/:\JQP>/3HS!}VG"~3!]VMvKB@U]}w)}]SoR$[6Ll^P:`T-{q4ot$K 1|&0΀PmJ;|16QU:h%~!ʺ]LOܝf AJBX%Vrp=)C^m)=TG!*M 5!ZĆT](z.nJ ?c*DdҐ\poԲ.9irKP41D\!;ĕaaCEe;s'o,IR.I~{[a^dp@1X+aYq K/%e-ct#Urz,g0Oh w>'h(z3/aPn c~;ЏCKq1kkɰ>Cd{#RT-'A!x;I yiScQRVM<m:hLIu=Y;BSbUB}&CXy4l5;ݍ@jDe LL$ʭ/JXnR$sVq8*Z\שX1,pL@X vڞ~ (-HR U'50_ S&hFIW_d 3×r&NhAX uAQ)s( ! +8N!#MTSedRwJfkCn`Su[kdG#P: pb[|s $ZsgsDM,WOXz"u\DFGF+KCM')H!o*mf7ӬIxz=ҝI}œdwTSͨThǗS!OA4H{w=ގtу~Z()pL< {>$|Q<Y4X0ObJ!e1UE!rƀKUELgÜqId]=ˠŸhp%i,*7 !R`9e-"O_/jB˰t睻pTYkޱw'J™f2DX$mp7m#̒m,c$I!2m(j %W( QtK/ZE_zҁ>LnLVH@U;w{syyvumɎVAZ]׶ۨ2*RP n€ ȶVIȘ1$OȘOO/ez)ċOtY>TU*M"Ւ*wuʡ#D\_jFIT/bdlz,ú^IG SauÁw8}=2h38YF}tRm@?6GKiQ) Z}eŹ4ك*bvOͦ@R+,۪REElO\ߛ@-էXfgzQg7X.Dӄu#W6O6KHU6*9p7-k$YRUC*(-uwh:ijʗ^mNǦdA-ĊQLfST'ug(d6AuaER^jSe{.՞:G%hyF2VEîX7ѧ B9lKEɒ^5[Za$ߵV'pO&Ym+ҁN[ hg3$F\xX8Fmib({2j4e]ZOE.}n>詪V RJ^7UAy/ZwK<~yGcP(>h,1MS٫ydЏ[mSñB\c5\ٌ,%l̐E-,3JJe<2i`D*rjd]EELOtNj< l[e5Seh+6A\y ws3X6j49TvYmvleW/Sۍ!@3悜3٫M/]"kM#_YEK,½uLfreX? 1tGo[S?i l O$$=m sجܨ- )UƦS\?C 4pCK|8,Xߪa v԰[>kyg03j,Qܨ 3)\);{r'wwC[/D[+~T܍ɾ5IZfWgOjm^o}m۞W쭣ZGGLY츴{#1|^E"Qπpc&7,!TIc@%M03=)bRWXw 8) Ƒ̾TJd "}#Baj:#._E&i?,![2}_W;-j9sc:?~0=%m[=(KHP*w|{KuAA,1<:U0\ ʀ?|ln~uc8Ml­*ݙh-  ot[?3`n۲ Nu#+cw/f$v*@$fsEM f8P'J7+P:d7m Zᔳ3퇯`r,nT6ф+9.c1dLt-{:o^rWΌeeZ3 9oݯ[P_xS~ ݸdT4wmG"fl|_{qnݫޓRxȌK:ӏ7A9UEps[u읺7:-6g&Uu%d(iM d|0$OaWxogLl:X-^f?yw5u4ѪjN5;OyO'qY 2RPapzjms3S^ܬYE{ReY3{KD}&d`!NbBvp{ Ew> mnRkVo`3MH2v8]cjb煇$ӈ/6Պw6YMלH5_OԱ5r찾? dW#7͗R!8)5u17=;:XH5P56MhnvZ{Ktvuf- ҳ _x]@{M5=EFzS.1&Մ(0_:)Г` 7iJU$399L8])],3/JR dULz& j* RYwL .'s73dɿُ/iSu=̥MNJNkWYIb<r1A#ho"-<,`{#*ag=aUqĒ3jir1p߲L5ޤz"|_RqLWtEHK9d`H[f.@.ɎejjţW_5y_qdxbLݜc/BCo ~/bJ$|It# Aߌ^W"]{x:~@)\O ofZPXfpC6шX1 rWr*Loco6{@ #z,Ofҝ1~kǞըD#j6`% 8灥TRp"sғ^蜙G;05c7>li'>a#˴sLGMr[Mί .Wm?cADp|*,he?|usWi;t-߭  RI\O@O)" -yHJ8 q׸V5g\Ccu;YGͯ9(":y?g;LܟSHgH\$P[fj-T<ΡZD'XIJd;L"ʨ3\zxm _s$xX:^ϷJ }1W6\'oyPުbDǯ:l/_po}݄jjCipbq hu^ ܋ŨPIV*Zuz Ӊm!<_|jyJ^1+K:u 1 а-3A>ɝ[mag'"1zwSZZfpwndtΣ0<_pl&?Q7lដ 5bL%^;'u_Cn5~SVƏ8kEU)"cv$פ/[] Se$?q|67X+~/? ֐-j6͵xT.bq G?iI{"P.axXΟy 2"QBl1΁5P?~٣W.msįWmzD6SfN;u>t1wf/}<Q 4|t : ] 8R]gL6uif[^Z6hopx7<nSaOP[ki {| W8V&ݮ`A=.yj\i 7Uv#Ν?,> c٫ئ#"jP#fܲqK?-uL%?Fx3d5&ֈH5#xyxe|%#1j(wI4.$҇7UcS>e嗀?_a;8hZfƞHSJYWx|;MM}C=`m@*`=uVpn_\a3)-7$a2ȒFB.<#Ӊ)9e+ l_;ދF8ΉBz#:L颒'?/Vp9dͨ΀DuK;+jF(Zuo >abcii{'?^Pb@0E\ƨpe 4p̏]閴Uz&*Z$^UÔI2v!oI)"Hİ]lVP]ZS~qiPqB<%:K815an#xO.dN#`WͿҳj_͊1^m|!' I5Ƭﻏ'DUPࣕe-bd RdDF|pvdٍ52 n`v\dmj޹\t!F@|}1F^`4alyL*6JZlǾR"ZhIq25 /3D8 g,Eef9({ٶth:.r6V*e[GNTy)$Dh}>SNqhXSEP? GQ:H6DTN)"VRn빢<C!kqL?ہ d.1/ Qy=I}Y{:z\&lq_pOw59uO0z9/IAJC5Wi6Mrgk %O.`Ze0ሔ9⢐aX2e#t.gm4_+\ H''MGlGtH1xOWt)T#JWq1m^keB B (VTB^A}B'#&RFqHx5uo ŝ)W p~${ ,/!JO< Ğ)OoyIj̀9 6@;KF"e̼F: 3G.xơA >oD݆9YB˗C؊__곴uBfzJ5YGܖQ$x ^AI`Q!2l`.t SSFnop% JviPUʭ[0ퟩJ"v@aԷR:.|& C7 OY~.dpF9J{"m 7CnJaƒkl0Vͷ l|4X5?SZ)eAUeEF&BHS?'' i}[) D6 vp<.A>">+erBj6dhn$F'Lޑ>y# +֥7 &wzG˨&K?is)X*^BXh T4-‰"݀rZ)GlQ rL毖zUg+5(U#ݭ8)+t ?%,2Xyۈ_vM0L.6-Uo}4A ؂\a25 ƒ;PEuS$v :7;&g& IC @F/5)7~Fv'5x5[QjS8(yy)۳ӑ?VUnlآoλUUm#O7F[i8tI[q%y~6֩ID5#hsCfm{hbbd#BZY—)ؒg3LNMc'@{ĎYg+2G1vq&OEHk>@.aj,d8SECd[e13Б5 E:w>#՜GڟXSks3]\ǻ2G < 6b27%È:ih)XQFZbB+j(pe#("`\FfeR'O^ G dDJl&Rnyr |QԿa{D')B-0L~w/?QUw0Î?~P`VǰzߌM a)Ý](@\"Z!~}Yi8ڈh 0 fAg~g/ B$wwdHOEVxߚCZUkypf4W=tȩ\ 9{8yr0l~ J8I5. ( 0 L}U<*|qcmqg,0KȍXdف缧:/J:)]q$mC`!>F ^EfvD]}~#? w$W m|jxjqj'S:^KSr 48-~ńEaP cK#w,|5+k-9F8K۲XE7@40OI{dZtCj"zwZ=oھČ }8(H>hsD6Üg%xH +8`6JXɻ 2{Q#4 ݭ&x'i!JDe,*֚ d:uR:ؑk7.JlOMr`ڮB^ vjQǂo j,EBty, ۿ>+y:E[л y9'np _b",/zE21ez%t R CwDxq%,BSX a>\O[kҗDjwR\aGAr^|;pnDߠ5 Om%[lob `N(8sƽwaD՟GUqiu$e F}Gb 4`1* Su/Qc!w#EB˛"kـuix ije c?w|ēb>gz>cMf>|qw2bqKN,h^ퟵMd?7ZIsDTŸ} <7n!c` ^8: Sg4Qsh|('4U:F90~a i' D-6`89W뻚[nMQM,2,4gNͳ8A> Y8pe*J"eqi:~;?Ṟ-~}i:~;VHNܹ]f/'J@vc(>@HtЩC~Cߌ)OBO9!V\A U]ȅtAq\ /Ǵ^H=Z,H)S`:'}~[;LMgP ,d9{#Np% >I$ A1á|,mIO |XJpC4@2oe4ڟjM͋d(ABLBm~28 %0B"CEv7Iwo $dwkd3ݔ@) (-w+B(zZ@i@Dmһ2mL2!"}wϹͻ]sumͶv+m#d[% )B [?23a3@_x0 U@3,+ 009_Eìb&4D4 F,8g!<Էɹ`KpM>ؚS^ YR4Ʉ|r?ʷ\&#_sGT(@F9YNnjJS/~LfFH4 T@%z~iYxIT&>o*R E(Ξc1J \ʳLa&S1E!MՖۋL)jq!#[䍢kѡJI,2 DMnϴE\+؃$m@c<곃*؟-/f @)6͐#J&_²Ai'- EPb:]pM7M!12@;SMԟGѓvDV+hS 8#?.<_Q+GCjzcӾݬ8ȳ8+ފNydTd/ (8A C Vpm+&B5^Ţ3nHID3E('Q5ASIIÔ{ 7]ϲβ6KH$l΋QJ v/-8ݫG+]:zl]97ũi`躻<鵼YvxV!-(fV!̬niݥ4OQIf.=KFb(y#K?!SVlqbE9ʠ(p@UzZYa˖>r j/jBt (còc|BrJ%=\l7Δof [Դ%=| f8AaIQFP2fZd>ѵK)R+{OEjA BrJxA9™g.{YJ5i:X*Cd Bp*Sr)رun_- 0ؐe (U;0#L皪i?c7a6 Yqo>YC ѷAECt#=$;,S|-14@d]yLR䖦 Efgg ,?g,8J>StA#š9Xcz׌ǡ8].AJ]WS+ PEPyps~!c;E [mmbPyF :"B*Ӡ|$##EDڝ;6HǭuTj.*UX~k(STw -.k{BC6VʎP"Eȫ7!CN 2 (b Cm`5eęAeM`P-sAϧ'P0(A͟ۓKKJXygGt'wReZ791"֠QJKT8:쎆"З!-gKO#hAi2x\FoţB%LX&hwdcGr!z}r]xDcܗ6/G2͘>jx/5,Mn ~^A\Шcg+$g.+dx6|E.0Ht-⻜6,vܠJqc  S GjX3ܣb# ebwʛ(+:gzAd@f8P mNpˏ-cpjt@g?%p8=TF!tPF\`;`(MJFrþ!"M{kW*p1.[e5DqXԽs (X&o?Gt<s%)7N[QRyM 1z6.bFR a)F)h隷Qh*Db֤>3' 1ckr`[b[z\Ԫ4T TJ}F%"GEct7 Yз0 .} oyj8M6+ͣ#-)襠RW!%Vt\^mPJt3JS)e@`lkcIZɄ l{'F@u% M>{ XDC:%+@mPV8{ cÒ{@NKgec5Y{ Tݖn|& V_C&_LK- 4k}^^2i/ޕҿ{\cO}bɎOQSu uf:"'g@8:.%nVV ;q$Kr[,;z+/8nM7~f`fMrd 3ps# {&]+&j܂)@!) r} 1KG%>\ظk=~`TSs]=~82A\(4Ni8kO2K@pVbg0bm/:SˎY<‡xAM8qn2=\aq \TH2܃HF-:\@"+mh?#) PIEwa0Q&/ !|HTK; u;s|\}[l3r7W$X"\y[ `0!)=ӆSr%qFTPg[[mݵvA-u%iuum(k`E/`tTf9U eUd1?|)3YO֊seSZH)Šm>u7 1[vBI(a"zM+^ xBSͽY˄#B\ r+;א„(`"e ,joi t SI'@V8%%Rh~I,@D='$'U!39C:!vQBkb`ŸɷMo)͈}YqipQ^7'LQE9dlTX5+}`d]fŊ_rZZJjKr9KifR@>_&/_=!FM,pZ2SAqN۫' i@MY6U+fIJcRY \S85LqܫPK85:U\YK Vx}^ oQɈF⾤?r !-\BuQWs+PEt]rf~0~|Yޣ͞V9|', h<)—Izx;ڴS\\~1sQCO1z4[OoEH||o,J GD39s}_xW&[KΙ0ڦ!H\ݛOTih_öUSۚ\F%;G[HZE/Z:{1U<&>86cZ~QqY"IelWZj1zҁ ?\\pk#ȯ62}؃2me!z笁]z4:C茇*'?Ӱ?2ЬL[mA`Cj t-;8r7.Z}QH~ NUU3MsTm[/# $Bͻ m_%VF0Oe);>4S>;9kA6E3М}QRazH]1!Z]6`9hИ]3&SjPdY _ECQj&yT$|}Inj/i~Hr;O; \Rg^eZV`hҗÕSSL׆4\^]R"psw2\,> qPOr$}iibU׽MU(%9>pYd _ΝU d=;V_^x^S^qBbA,JEYk4*hz._@L54#UXcyg9-TC d߲R-7^-t%؜׍x 1/0 3t4z-zM(b` j6A**܁?,N:b3? rX'R ʨ;05#.&6i)ŔX) Q3aô%`gj opp1:Tu`؞(A?Zyeh&^L<|k*4L}U7 >6TNN'Kp7)9 q.m4JMm% CLSTײzQ7C CU_uբL}{2: 7@(Y-Yk d~8`qh1%WdcxwfA$u3V,zD1{`&'bKaL]ŭ}f2SD؋h#Bj,x~ E 5&~L[B/L "2 $"W~Xy^OʮG"­}!;xa/7ѮR l8HK>>p#+iwꓶh.3\-6bu+X(kln祽{,]U5egU\kvi||-^hlw*ֻs@ ь z`n:a|8td ϮRf?npg|'ַ[Qjy^٩#A F81&U-G*-/jWAtՑa^[ߩ@W+aH<פ[r=6pf|'r 9ltg.5*ՅXd}ԇOc,1-*B8VYg\Ay{) }{kqU W΅4q ͎,\U&GK0q8:o|<:j ^1 cf"b]rv %`Av7W.J7#XTDϻNV*JtA]֌>}~ h?6# @1r{LpO]݅}[b,)vuudU!`+9' .x7R})M2V Ciω51)~ПpŸ=rޭ.k18wo,D{a%7;'&uB6 rtn&2601a;z #QWOBS[t@S% 2k艿X;6ݥy Z $NȐAV{$88ڢ|2^.81==w/wwYG\ǂ*-`ӡylkŪ57jй-P s(z.2TxnkIERO$6a X̜4ce-Wf&R)>cS R,J=!"%sϙ`E>tu2~uemzlcˬ3 (LoJtLI?N/u8MR"4gzT ?W(L9~ )se{JՑdVg?t_O Izp"d-RN'FQFՋ>U,Ɗ oߓkaK$E7Ol{Df+*5p!kWDoIwIpP5lE&9;[ 1v\90P5\,p#1ڹnErGݜqfy[cӜ:Ys3P'pLQ+ r3C&܉|0C/(d"^Nxv.!3R?ŬpETՆ`b>F1)'j'jtީ3g̓WOFNKF9NVa9kk5P1_:DmQ77L*4VG8n~諢V|.QU:JDw潥V1綉)F! > ԣ%IYW.*T 0$ytls9}7:zNa6_T jƊ@K%`Ӳ1ݑu6hXn8dtf^ Ν´n#qpbQwcTK@%zRÞp~#9iQ4V?OZ8ƍ14 ,BUN]&;'p.؎1=JJ.1˪}ͼ&OgOåAuMl^7!6v*>ODlXHTs*E${ 3r -\ 8n.p>xq^ʣqb[>O8-^ws<G^EZ_Be8aQy&͉\sH$Ϟ9*[Y/ɒu*XptJsd(xapq BG8 t`rh`1]֪5}_7Π*(IxēUy0s 6R`YSMZMղMęOHy `9M@>̖ Tߓ3^>0rֵV֡c_RQgiZ!Lq\ƚ&K|^~9?غXE!TiAA%W:<9iZNn6T+nucK'E撨R?ˁ޹Tb{[) fqgDJn'{t(uR]:Phgn6ü!9Hs8w, ؕ'!hfkkn+g]צp2TI"} $ s7ћ3,TH@* /`3|]1~qzX.F=eC}{^> 1& fvNͥ(s 3롨μ&ل]Sr(b/*Ch Oapr\`hB+qmSh7&ˀv~BLoh#AIXrF/tH,'(YX~S_#l5e*=>l<,pD-y`͈!I_|Kel\0*>AtDo1P}CoyQ-7@m0Lvf { IG0Lj: sm!t ,9%q('u:qSz##^vcz.k818o sdodSk $a0fYIpFT^ AnU)>8_vA9@8U+KYOI @*^l69r z\LbslYBɖ{iqjsx3@pE?U>>ROn&Wx-F0J(a_# (Dn>ǙW'%^k PՂ([!]0ϳdRV‘Ckf E';'"B@N$$bB}@qΐL$Aq ]Ogy:,v5|ZPJ`$I mtt<8# @P_I۝6P O0H&v w'X/oӆi8{a5 jQCljmN!CЖ o M玈04hq5Ud]إL̜@3].=)7E ,ԅcNKR4x9\3Va u'?:!c^p pNj\'SZt@a*CG`Ҕ.,p4 >|T^CLD<gNr}Ŭ\5-0X =;X6V3;(ɐɌb;v\O ^ &S_14lh|jwk^3>,(&= s:*ka=UO=O|`wo6qEԂq6FiToAx;;g"cXCkS[{. Kʐr4 ]x-7`j8Imk@VR{OĨtMU>*d,#"0ǐ4DTxgjFuXJN*Vv-59 0)3nAs(<(ڰX:(! m}Z5ʝ!>Nu;˿ulB@4Pyhnτ"IV(AjU(J$5l;? 6-[A"̚+ a6vqmVفr/:-~%VC|VSdv\?T6%jSDSא7DT3qiU-└qSM0%Xb+r&Ow9~bWczXlq>䫬Q]: ,oj@oE\CXO=S,wqҕ!J*y;xt4:>Q.FWLAA:INk)u IlPUז8Tr)TN10Q.<(my:%b7ϛgB(d8y2i O,?6!pZA`pdd}]ڊb߿Ƹ#Q}vu(} 4^|2H9A(PWBM%r7-J݋:FImo{( |+ڒmGENݑQՒR \ɠt@1l>Wm͇U8bv$7>Svul}DpɪI%At4__4m7l*Ҫowv1Y7:-j\[IQn!ypsK%ǧ)0iu2HRaEO^Z /׮UARS(&/|7F8"Β&^{h z%`HՕ#ْy֌@iel4Ķ N<ʫa { {1`xtĜj1)6JGzuUDMTܐ'$*D1[ ]t_yO$~۠բIΤ6(̔km8<\9qBEHCJ'aX]nm0@6v%wZ6ٷTSQb/h~a`zfߵިpBཁ5LI#Y2Q5G7ѹ۔*J v,K Q-݋bg}ԾÅK&mlLXo xiHo/S-Oӆ ] ^Q{*{xܔ*4*Jc*XFXav60P>W. Fq\.F\ y_wFK%kX4RE-畟Gw WE9j#i=r}N7r+ GԘ?:.JsTgVJ1\EĘb@_t7sStJeoW {b# !<9 ]c%|FP$CԲ^?EkD?R1{UZ7MW>8 ?Da#]k~2LBbpzE` ВY*8ٓ ,>)ՎKQN /N/O@o9'bb@=?nN',Ƈ8G#Ƥ @H $oPkԞM-8 lM p!@{OҚgnRȋ|Y؊&)ȷ#N ~ ӪUC:=n̕ψn>Eh8_icm@m\ʆץ=$an'dp I)b]"R1WdAqoЌZMK-yG+ 98⳯s%!\!A1м)POwo'upj|ɞ6U֜8ƄQ~ U<%/6 K-#W $!\$+?ǑG~'."~>lÐTeEMP}Fݟp jIJTZ?`7B[m aËoYhO4 b|-<7*ͫ,洎#PYG`v7 @LP=㞅SA1)3EAagpJBI=j5m#"u串ɒ<⪢DA#LvM#򍣄 jVXW#M:'iLuN@??d;!u;ŘvKw}eȭ8t'pVlf2į͐ܝT47v)kē&QeZ=(CkdR8.5>4ĤD٩`d6S ԧ') ;J2:a_L`>dl'ɶ>Kg}(#D!OxRAcV6J=m}RnBv2MJV_"u0hBoFN]Ԟ`o4gHyfo;= }VE)EIҲw-N=Պŵb:]QN߭8ABs,a7_g=h1( <Qr3م@?Vh8.VW:wxw8/5$7d2vO'7lυ)섎ju}w@Bc4Rf¦_{(3=SQ-;79hG:Ou]ǃ}戥 Hx˶\F.w<;s.w?q;_ݽh,9Bs}&p{ШAPMy3uTs>:NU%4"^ΏsL{ y3#z7U]F4 > mcH|G"uU!)G2{PX36vyf(cv `M)m5#6rڧFk2ZePbٞ6efkL</Sz]:1x98e˞'6gC?U͢P|4 2+zBԂ8N3:h ̸j-5n"ReP'!w,A!X֪[Ť߬<הlH]萆jsiA_%g#r1$%)1D5Ƞ*)x@3TD b#JJk(]{~9&PLM(\ YI nisK&:sqNB~wɍH^saJp@E{eM_W|\Pt=29pZabV78V5qXD Ņ)y.%pxUJYpږoLQ HOX'DL L!" dOyc.IԵIG퉁,$p )| &w¢IN+$ukc ׽Xo&Q-ʞ\쎗u1+zn^9lRH`{,?L~ÍgMHeBrڭXW4aBvi}, %/}C,R  4XpA?˼'#hw-_ROAT3Dr. fI:~XCy%qTpE K9TmIFsC@]-LcRʵ=l]]nRDhF5ڗsPH m0t]Q_tZE2>\Q:%A-3< V4`21Nît8(Y>3O%\xXCj} Ɲ}3}< hEϱr$2oP?ψ3a'Ο⻘dk)JKrg[!rn 8dwYWJp+:ǿϋevױαsX9# r"_]9tlal뜬yOH߹+{g;fl?B;+Gٸ 0'SsǔM]k;:7!BF:5a{ >#;+W W-f4ga~~ #xZأ;[འU}>Rf2t\w.[gE{aY@ $ˍ5x fn_t 2|DM,84HGֱ5'/d2Q'n$!"ټ_˾nfma\U'N`lbiY VK sڱCGlǼ(+F =>6ݯJ,% `=S) h52*(4i} Mj!>+xזj!LHdE'MCp^ FwB[jsD#T= |s;aN%ywi"HqnvS0Xrm:X@^* rZ3OzIGg[,zAgSr($ϦZTTjCH;RP[DT(FYN|M/#=^m) G 7sg>[Qs8VFeV\UGHqX% d-:QT7dAHENZnt ymqi5+co:oVAjV2AaJ@n]5MR] @%W͐HE 3lYq^t{$Їҕi *u, sfOCnzJDSz/6\Mq Lؖ8[@E0V/jTj⢬z ZpGaH7^ < PކlpK@OIPz6dAA&*5oW%UNi~-?fiP練+2'RPr̄ r}%%=QS KB *8w@3'whXҜTFp=M4^dj.ή;tud//$×pp$=;(Q!3}sҼxOfG%d SD3;k͸,BzNwHn͂Ӹ~dU+lK3@[BO3nߴmN//=Wl|WI TaO8O]E7/BģX|ѕIF25Ke(Oٛ"kXՐ5 c{sw9Y?)cnR'MPUd'$m:mI~ DDBRqhm,Lޫl E苇ArSDbvyhʾnKK,HaR5qkK%3Z9=q@7$|(WkB&>\+nwCmb"kO&',G}O! ٺ+ "Z4KI%xC0*`'DeD}Fvj/@ 94J'Uꐩbn:eJŀ#bL84h3KXYv \xgq=ѷbq1A''WZockM5eHӿÇ@2QKr(]l[jq:o$΁Sc[ .4-@.Jl>3]c(:5Ia_{*m޺-rwZރ;G Y:عQHKww+[91Et r!döW>BL+?n€  j?!CTwۊ*{띟8ͯtTw=]񱫱}8%{:T~>}NlUh½ݷ݅PR=e2vMxWcNrڞ/!f4SuOfs_zyU'YJ]J3ק(Y#zv_ToSIp2iPoE@aˢ9tRUbUO~ }xKuϱ>px 0t#4ANKe,aA-7UKB'M[r=;I if `PoD c6JOckɕ%nd'2QʀBi$n=:?ENk9F>Y5ͺMQcQ ^iSx/{W(doCfudi  l];*DZF/^wc}a`H @ $qPq\ +{^ h{)MBM?+JkppumY~r7 r4"(.>s0.̏Lfs==k>7l2|}A9GޑjxDJ:F3gB܃CD@#oeRUJcwQiYv>_$}.$ݍڴPyNERrWž[JFхP @PtED>*ZtSn& e#SUDww}1-SSeUUCC H IV)(|>s9$zs[-qQCX^^NjVp׿6Y0cBI?@ W'L"jݤf!,T%DI.\-r`< T?P~H@#WX7L,~:ר*'G=$x7c!`A0l䁘T?(jތ<K7R =e32xVp],~goNFU(PD6Fj+8cKZ**E]? W3Q#ڥG=A5GeZb f`a_XK*t6߆N0XX1UĊ%Q-=Z"- 7HʥJWDK[#O׋j@=jGsl=^ E~)?֫f ̵`U.h/Kkp"#&hDv#Xb>Cl^-NU~Gp8$AaE7 }p!t *7QT *Eoϩ,VZV)%N+ *HG4z' BK4WR& 7a kp='YiM7q9̏m<#*:Iz T5vr@}huO>È~(#DÐ2!M:lZ0$qnr%#)Ҧ)7nl"NUDA͒O,|yō$(~-!XlF3Ft#ߒ)&8.]0yR`z.3$gw{ 7 * J-hȮ|*KcS5)\:ϕ2}9. h"rFF6w 4eB)MRx(l:0~}GfyMg~}Ѹ`zrɿ -jXiLɠywwRƒuA[kVhem`_wXg4q̅- +jA}{>jI=Ug0#u3Ӏ*Ko )*N-\'̅+Ȧ`tPBOKAfJ|t je٦"05ztZx AyPTK`.eϖށ#> $ynG?Qg}V #)5Hh)HHM߱*гMmiE.fS$2,`7JDٖ26b0_[ۉ֑ap/=~3azC J7R K[J(X#R*r*KЭJ눭Z& T-ZH}7WȆK¿fe A$iyA$ID}:H}ݧG\WetGq֜ zJ0#8!UqWDfjqGg_BC:Pɵ q- p v͊#EwB+U*i\~Xs!FiR*&)i|!jғ.SiOM_"pɉ\؆oS/\;r;z?A.@pǦa&|&.j|Ycb?g<gИf 0c t! ȉ>,C[]vKgi} w!*""*gX<[νb5B?v(tzp[Q7&7ſq8J)ۭlR\Tg~;=xMh01p=E(WW~'K*C# [*(noB@HB@Bir V fZ*m@Ѕzx)g\ʂ>0BIɫM`?YȬSf$Ks׃~ /L;g#KtR3*{ ;dVzEIԞGi탠iL]Xg畫zG 3U@1+HL:ZxNJ{=?Ȩe+bq bP~Xh)NI%Ȥ5MկHnDhIJ7f/KGֶiYU]vEj}^.7!1VBTU:A̹E#sҮw-qq`l_YS1Vޫ+$3o5ZQioYP:px;l(!t$o>l+}Uuq 0~wGK;6B~$*옟_bEVFZ >:{D+[6a%8>y9z2`W [۵@ֱQc 0/2OAEcEO` *Oz@KtI u# HH&0C[>s7M H&$̜/ d1I4q//P՚*=|4N@jkIVg@d}Cpz(R*kU;~˰z,"/L{wbqNJh-*h3~T}1Gt"4UUaQo/YP/4 H‚hdQVG,}սڄQ *?]NKQ vSJ€5)Q4N XgzTM_{CiI]ȭhy/׬8z"w?3Q[="q{'~U/Zoԡi I吁6as,_DaP1{g"/rGUasb[M)Xa?A@WӴ=Gs)]ż*4D;-LrxޞQhi]v-hՂg-DY(8Fr}%`Y2 \ENBPg(6%ձh>)UygǠa0]aVsqԧk$ͳ_,Up]LhKa"!_fνUPɮC,̂ĹپNpW=vJ=HFbWmی%wDċ!Qd?# rvSPA#r^b0[̓iV\FrvUk?Yi7APLTukG+֒;<Ä@pz(go6}. ݛ=WCU^eL`\MgT 00QIcMq1mUKƭ#؃yA^*^ܦ8TRѮP&,ǠbORFq-qd@{fHl;P^1ުސ|GwmJ@p \ x˾/Z9u +x3?l(1c㔑lPڜtY=eUo|:8 X|;캯AMb`?z)yBОk((W3cve"$g6S mZ1&"Ae哻V+s Z1hqRI>7T-&3 mЕim{k|#frWuP?@QYJLθX.W 2g>vrNgE$$6 kX!(BR^2ċhVɭC:Eib ]>:a!?nw)`tp>wt.^$I_\o3x|@=R\E lCFaXMQ>qѩ#2)Za!lW@6kdކ喧tE2P "ǿj<.w+`Z|6k\ͮ 6e6{&eQ:B?1u߀R,{TB`"GUMQI.UJ탾CɈn~]jSDQȖ0sEt $'ٽ {'GNی ƫTFlP,R}ÐG%ݣoO#MF*t",ؙgxϊx%2'LdŚ{-aYӗg~ $oCC5`,b4bU]XOEX{RGZ9JU9"`QriyT6bYj(1*ZGL ٌغusq(j)B!榿t. ?F@y+[4 p.|8Xpr(Rx@#8xMRӆ,VcXREO/1W 1>=~Ũ="tLJv1>n`/۰+sCt L$!{ezF hgT\*#WJVNE4H'!A|{O1ixzHj==A,Yt&Jj!#)!bHFxvMV48&[TXOKQ8BlPMw@.jǻ%J1eO5.κXJ,֡{B%- Qkȃ{&zT:Mjx)ޡ6X낪ñK1`uc{b/(S ȵξ Z"V%֤^_wNb[ VM-QDo =DzMr|X5z16[Fy!"'G|[Hȓ'鋾ojM]ײS틔3x񢾵]3P -1Mq%ݥL꿫[:Mj!W?p nBᥖg̐ ً{.I Lfã D3G8So Q|I+vpZsSne}j7wKbFn2!۝V.pHLV ^px\(a00MR)vO*@13 9u烊2,uXUStڱܧ3*zNQiN~igRE!rHv,N[VF=fB@oN.d zх =0"i/kJOEa vTGdJ*uc˫ۿlH_CT>8F Ѻlhf Cx}48&p%ZVgUÉ`Xn+脆sCq{ }@'D*MGaIM4[pah[0lBi]]tWqe(ej1̙n46#mB OE0röaC9N;Or *`%1ָ[Dx+Ã;^y9;?eg0m Ōa7M\^7e:O~[HvېƁH39r&lͦㅦJq$]CX TA$0Fk.F`bͪ9Q"Ot5Zs.^.>s_ztx@S .s gL& }DA1;ױ*:!T"QJ)w*cH\7c<0QaܶW:-#y;MLJν9"-'F 3INRW i<6D0|uJ+:] aK=NNj)TPc-81(7%ݫOU~cFK\S/cJ:μꈦ&c3eu\ *GVJdN~  ߢ2Zs-xTZ*\ *!/0% f:JtM$jG-lee_; "( Dic :P 1;ANUl'9N_CU 0"#HX5,%# LqS [y5vP#^NSJl^f֞TtHkt=氃U )4 Zk=,FK$ No>vBc,Z;H'kj /xd*Yfkif4e'_#ٮANN[iF5ވBDzMh8Cc@Q`猞fD?0vr]h,tQYWEJ"[稞/كs)S IGS~)7/$ͦn|o 2w-**:~ i1%  /_YS*|SP۲^lbTtVpMʙP`zID#Mi@z]0ck捶C ΌW!!F,\XǭAx 9 >sYǘ}z'l(EC[+( \NoF`z>,,h+ib~n- Un^Y?Qp FS-IJǺ"#R(?XZ:mBBNj­ח굋!pC9$ɳ_Oo۔ҝzO ~^@sh&ma[Y,:Џ=$&(O??Y0u ì$]{ xjD/|K< z{x4\W0k^cI""k*4Ba ٽȽ\z|+){K,]wvoOWPvӨʸ=fdy?7k뭝An2Wd?8n߈HFp|h{{}7nt\o|K732u<#VHC|%r i|$9 0s\=T%.5RfDW/` 7WD*5'a&UmS+Cgeb-R=%s#T{ml埱mN7o>OT0ZSN>OG`*2޹vi(|lR_Sv-Jm?u.48<R ( V񾚼fP=_+֬{0`pW 7Wu+ SEs' cl~Zult^Kn@?Oъ,6~Q)}V]UIWn$ ł_Z QWr)žc2[u-TߨVGSr\xh]<;Z8S;/= - ,nB;#m웓.%]nTB/ssO9O>>鏍-k~IF+g>NA>B2\f@{$4#ZŸF"˒.Vf8lJc>7gD&72@N(dWxa/)jFSXCbxFVM-r6JQ~TVhW~I,A8[_@P[ގ]#Ӡfv`|-8nlKdy1vXʵUAOBC*CU^  ;!yo $EXo&2'Y8_jusK_ ʦ*ud\CmP`y5@6܍G-Z)EOiutCޯX㹤-N=?Rf8,.TR@ 3B #ך٩-}sI$3'"0U!AygWW\Sd^qk$urWL,͈^n wŗ9*8e"M4f]ᄾ"0 !OK]( 7g$͙{&C&|D.rDD$uV]Jw}WCC%IO4 T*HgZT7vVJ!_͂?SMiF!5'>&175K6yo1k\qxN_LiMM)jB|9R̍JKXxUCZ9HA9q=&l}n%d)~,88&xSlآUn˂GWZ㈛_| βr;pHxo/jfLaN8MZQ?14; Hu"^d&Vn[L)|#0ϟu6f&@3CP#f7~3.&($)̙k@Ԥ8qi-[JzA{-D#2`:iin$ᄑ={7dn:cv$ H5Tjj U7aq7Bn"U( V8t=sfܽeu9\NBA5rAuT*P6?p4PQ5 4 CF">> (1s;)(' A"8EmCF|x."G/'l QpG"1PPh(. (<zIp($V*7m^  v,~oA x j\`DG@ lM%E7i98–b*OcDaACC->L8:{A?S&r'<꜄7RvwG]^ހxr{wtyS,`.;BA*~Z*A8n}?SQE'%]m닢!}u!:k$" 5H{.xWȑFRom 26&pr!Th#D~>˘S "~*/Rs|;H4saG,E%hlR0Dwy6I)x ;1T<7C|A O*nW}@,"DgH|IJNj= &jF9jj:]ܾ3nR-C~X:a휩 +04|1$^~r nM$֨A {X[;$'zvއ&`,PHcPBl<-Ӈ,/Vf2NM>d9DUFP`2i$EtdIV f?RLvw巰Ǖj.i僱Zd ӗi:s $h ěٝإc X)v4i?zP \ޅ\.O@z~*(Ƣd!6#˵!!{xv$Jd?N-(#Fvy !dMAJ~{%ܪ㋰ē7syUj%CJm2؎d@֒8BBz3D6] ƨJ}DYE7 핼s oMѩ}2 /}`k 4d$ ^Zq:dсH"AC 輗aċf` ~B/25m~ bES=Bh5DD0zgbF bu|LJAuJf58;h87j!i xVFP+>auO;t̉=)k tWUGEJl<H`V87J8, !- ד[(nU7 [+mX:=Q Unώ/z\kZu- ǞR!ٰusB ڮ`bNjKe \O6J98fû,c/W@>:GElVMIj.PX1C lwZyʱuq=[0lSg;56x#J'RDˋ?sx1;$RN'IAG(93S%#wrN(g!~¨2*@ZR#dO/%osKLM'S+%sn"Y9|S<ߗMO E~aqdv `- N;]Mk$gcjkzj!b{|`g8Cڶ^4 b̼6A Cӏ 9;]<nޗgk@ƀ=ܺ 8 jvN9?&g<@tТ޾G6E@;2E XYBҰڑ-U) >f')b_ٹM{mV00: gP[)ϒ CҐzŞZ}#(=Qb^  Kх,"#yGҺm;c 3 ҿx%PWN%7烼cI"ehtrW/5@i0 ~S!$IJ޺Ҧ.߷~%xR_ 3aUI"ƞ}&zq Hw(ްN=CX行q $uY9 LzɟBw]sŔoq]}hPC7(@ܷh ׯB4:L" [` t{ݨ1^QٰWLҤp|!y\OP'K/p'/%\qq:0XA]د~'2qu<`]+1{|fw6DBC )P@N'?iGj ^jF&UF*>fOf$XM7?r< ],qvT9HKq2vr]>ꊷ77OIXp]?Qz;7MCGRZKٷe[;9TUw:jsk6&]E$Q7:o8(60 8`AoG뗖S.MJZØsⰣ2rcܕ Ρgžd}*n3г !tQz% 0b6N:'zE\acȧ [|ϽPK|*US7#:qAvYX`'f5QE"2Fιko[ KpKx HRj~ C 4*[KxL;izze)J:[GDG=.OWΣG6΁QC#JTOk=yk"`=k`d5j+m7Y+VWWktho -|-}C]1T-q-M@/[O_|wIUJ'f `h5Ⱥ,@p""~>Qޔ}{~,?Ho9:LJOr'*_CèVJtE.+3TW\(41$WnzQc/nzO+|;7ǁyg_Xг@qD 9Qכ% e&X {ˆT,uU: W0}BXqoXW0ntԣ0`"r" p?Owߥ/喵jw|yK19Dp؉Ŷpb.NY6Cm챏?n]4ȹ:*ꮳCQG=\?wDֆHjrT_VDƊ>F(&:|λ8Ϭ U"V:onn/+jW ݢnΏ>%cpVo"Y~'|gWm&xSb*Qs0ғ{Pr{g}g?0oɜ]s pirĺ;bܒ?I{{:U0#\P|%vhz{u-U:yj:dv$ *7D8 HMN@{ `W5gcg=p-B7 /',Ä#2gȞtx f /2q~k<j돗dt()kA]/(_%^p}T k(fL@ 9 \`i;kkoo۱ tHә%Ry"˲m{ &T[Gd{C󏥂'cAzeTrgrpv&ELڟz\b/5h` R0ϨgwEit._&@l-eɍT=6'Zwlu&mi @͏% 2lp~f$NV `˵Aڐu1s\ڀ+ێw:GLµgОBZ~~) x;1QHS[‡s脊YDp:lG;%`.3QjX(I C1LM9D>k=nAU_>V\سu'H ^v8_n}\EXeǻJ㍌?s~;_=XOPiX=M)QIʴ)tmH#6Jex=DO[Mj`QHˏ>Dv̳@l7U[a-!dn9AhK,S1E d,i7Sx.Y!X*2lryGfɇmPm!QۻFʰ o$TqW{5Rtft'wC6Yb.;Pf:U?6e-̱Gc`:S؛Xl1:\(EG3)|'͗[{ij TV*/ fmfve-RPVaq"hK8J9YJCflBx; e?ݿ|'CpU͂Q[9f 8;Z&戧O"Dtz3i\ǖ񬋗TneE|&t,h|aiyhbe sC1ielفU|" CN]3E2VEɂMhTUp#GDlU ~e%Έn2Uy$xT*>v{!W \LAcȽ 2PF{QoVԾn\=)j*#+!Ob,8>eK m}\A%C{wvӄVK6V1S͎ޤWmJ40T-SYأ<(I֥?MfThg̮C[Cd`_IyM~hlk㍌nTVev`:M':/*=BoN p{]yׁsACZV!I,8b1"aƪdγ]K>6*lpx>1̵+ qudSHCĄ*V/^Z G*ᕧQ tcXn$?dNXtsiZFZN̓\f솰$GXlSZkޟ\73@`*)'GמIc}\\&=IÆ?tl%B\+1LA}'K(6=v+ܽt{HlTV 5 9eCVg hGUVڟ8eNU6OsUtֈFICEJr2} ,5 #x5[70N\U2c8)*%1o @1Kޣxy=~砫ܬ1ɠY0rdú'mۛ7w7lYP;%~{I ~#M[4m;ڲ Dܠ]=U4C)=Iwm,koJePoRouZǫKXҭU3$:^IzmI;,Uiag,h&xj\dbt?;ߟ?vtUL;S<Otf\憎$MZDg3i11KJ$OnnRS@e Ј[Lii束zYۈcf߰~4b1p|L-Xۋz'՝+*kS@{#L 㒹o!ug`n^MqD1vV) +8zdLR7xNԑ' 7IN\ ^"=0h]i ߞʜoY Iw^]pBחgxXjObUW gAvf/ytSqJ6O?!x+&|80k[YG%ҫD U}~ |tm_5]C,6"'4n8KXX*ЋΞ-żyϯTX G UE+"Ǹq|~K\G>]TAS IA+ qxNl]-d pBjr⁺ @cBȏV~M'NBrIZJA9V>ϸ൦M0|QXA> ŧr0h1kܵi@+j2y=Re촚]|ENҝf$jG+I 371[[BDY6͓p}ȎKf>ͦE~`mZf0~"!Ȗ1;+[U°a'ޢ։YR}(w[tbb?8ڼ/+.leD6?-1XzKZ{,aMlTޡ/aH`jOY`*5:@8ECl5MIO|Tzvɽ=^;B6fwwA4̧dFIN@"ݵLLfpF#x'>sb<{o~7 a@8|m9s|w%C}ݟẘW#Ꭱh\>]gMOr$CbAisQGBCxTh>Xs9Jݝ {GxlY<0ZnBG:餵l.̆uMɳ-e(.x c$M*KCyi߽œJ%ñ3 k7J}Q@0!>ah7c=n wq96d8!i C #"VnTjh@wL˫u7"c./:h+Z$nH4GfPzM {=mW+Mсgr606'zZCߥ+Dha&<&3k΂bANѐTH|\}1 ʹd#\{e}1VKϕQx\16.< XQ@ H^}HJb 4;>;s0p1MXZ޳&=͊7 s(4#'eHb`Ə4~"v,p{?X(&a~TZ[/GԉGހý֥:PyHϵhۋb~pzyrzBm/k9"pog?C^qܷp@ↄ= SHzH5ڛao Mհ= Mk0R+ZSLI115]?ЏIT3q!aKE#!~jShĉpNf@,H=,֚J`RZs˙"puv tk&jln{έӻkmo7h kW'&{O0_ȀZևSRqpxњ)^!&Y 3$^X(@KqѨRuW{4{)!%1qawo hCYktLSwWhȾh&F04/MÌ.biVy=Bn()I.9~DcIb沤P N2mݰ^J."Lb qBZOu \NAHȧ"FذG#ݦ ËG m_\ MLlj㔅GȳJX2[\ćɉ 5椽.H 'xpO2O'?0NU=6ėd^$\( s9OL@X#> 8bѰ&g,eEFI4i82Ȉxbi`Rn)&Ҕ^˜g"u=qBlX%i~D pH z~ A=3] "D@dlj:ǟFr-D09O;B MY6ݓNo4BP(ْتNR6 HCmaZS)(ʰ˃ LLa/0.,(}HZt̩b=T~ʋph=0 2̃j`c]{7:ɑB1 F)d%۬\>&Y*D'j׸yVD~p(s.".eG,7d/D9NlF16Ck1k, Z,cGР70!'x#J)vPE!оʙ;K%σ$eSU:sjsZݛҌP8<8-cLNnl2LjGL{Th/]6xb>TC-`dbw Nyc/VuYyjd")?X>bR["rd_l0F԰D@$U*/8 p筭Pګr!0`h-Mj -3Aw \!+@~h 7 |3FZ101iLaOB!gjC)ڋ|'q OB^vWYL hV5ޫvuy9(On-AGpJeRCEH8xR)w Qwٻm4ZxRAS~1-u@~[;pFh1Cx؛ _"w oL.mVIa"Sg@r[mjU4pg?Fg:F&LxM8s^'iQ@H3[m/g}/ny`g{MLI e(0C&rn۔!ct "Y)iM?vH\*sVt$.via |/&cV{M[pѐ CUx:d ?Μo`K&~ |C?eSc]MR !rYNiEcRJI*Xډg,$O <;L[6qUJ:z[jaƩ٣xHnz %1᦬;*^bZ!f`,"\⌹^x^+[-2hqs15Rx6e:QΎerd{n X&qaw z'2 h&;neBo_P& }%m @Y\l-t iC"ژ._00>|MY1b3@Ւ;p;xXVb ?Q LЎn_(A@,^2!LZLPv:p K$Ok߆v]u < AEDv(V|RpAd}OK@O5`W#B񟽋ñGo=GEFI=ĞfbXk胐 'j |=l{Jp[U-ЩXdT.s[h'>G4? .^+ V ]Nͩ00[Y3&#J=`6޼ӎ 0ͯ'2WZ?2heS豝)HXoYxo);K74FȕɐV&(NV6uuWӾ>T/F"u'MLvhq5]Y! hsX>:q9X?`0%Ӥ2WLm8^E(ƈ(N[;БDhI4yK( g=^?loʧ72dG8N[ Plوd2clI'm 3ّ: yd#T=k(D3PYFÌ?Եe (!ٻq6 "\) ׸jSv/=Vp&ojڴd.zj=6%: hWxr/^Rp-֓f\`wUv4JTT?>B ʤnmzӾ-kexʤ*@ow@0$T3쒤PS/]  Rh~EOE%|Ĩ70¯i'ԺY߼:UYxt@%!{i`y77`DEAvW>ޑs/GQùJSkc~%{=۹Ӈz1@]u/}@LB#6U #n⎾}zCr*9?B]M$@&B|%h!BZ'5Ee6ϣ9;٦[2#Z` ~`+)c1//܁eZ̀@ A޾W=R+iE0AF^W=ZeDQRxHeK!*}.ŠyY , ^nW4m ծJ&ǡK4&I.^qslg߂#ͶL僆JloiM+ êʐeۋyr:<6lORHz62uD04:?#"&IZ^F@%V?Rʗ%$@C4sG R)a0gG7d**1[ѐ8Nnލ+9 /H3dXl:8D_3W2T %8+=osEahWى?=$ps~ 2GQjIp5mR,l {Rc2Kg\@b{ oCV釗]]8E%ϡ,QvLv$l=WEj?Ix'~~o]`Ub[UE.}}e_paCq{3Ql*ɷxXkP;vFa7Ȁex•0_Q0nn*; \Z[ː# 6tusةZfIΚ>{9rb=`A,Ӿ{3ZJw`S 7vry{*\oNg=m.GUg/W-}DHM||.%Wx@cUǟ3吿+Ku4 n&MXT\ax]듃=t9zAf`w냢g9c>!mmЦ)K)Υ#w?T8 o.ڻV~ﱩZC@;nI orf1;̊mvBMONTP{^CzE˝yl \հ0 K\r״D MIǀZ4ӶrmZk-{=mxYi\1z4krO.䫘GHS/Љ,*v wI]QV E.͋j2J4-EODf-KRb]va ZhH%S䐷OC:Q8?&ֱQyp%`6'QN$P(pú+b9WavEm5B?j;lEehuG4 98Yto.EȨBS]\G}{#oU×hB6Qܙ<=o4Ch$ r?\*yWD>bg~]p>qSWiz syt]P~ ZļȆ)v|+bnRpb>)U@؊ kL YNeH^&C3'j!mEG2rr6(3^R B>g~LFgP]!)q( ߛlmн섆h4#go,{8_3{ M%'lu!x/y֢Э M׊)]^dLS>9z0?wՙ~@RL|Ȏ(>ɗ"j0:` ηЦ^Fj 1I T4}`I! :L)FV@V?FcAØr<0]P:h+N ȫ8[4.zJ--?ޟ$ҕoߎ@tz~ cLVqL vO\,IoCUMetma%]g0 =WȞ`G), WKHSLQ簝1}/AZU 3}_1>xf~m{K9*4 [Jy)n3d@dG66t_hCZWcK[!-8:NA BҞ ,WzbLRIbgn %K6| N0;\*8 8]pG>vLRV ft]K%N3{ G6 ŹsfB^6GA}ڽ?H+j2@>(v Gh(sfFhhMGc[ڥG&f0]kWz4;=CPē=6a3ǒ^, s% ʇ:ZݲD-B1K?A$ܞAt9tLP qwqm:]~i#[ T s7w`se+Mם.l ^=udso$wj,<825T$iæFox~( *$P)ST5*ƶ6注НuQ҄rg^yDuPD2}rWRonq&2؃\Os蛔⚥Y7m4VæC\dc uch1p}σ ˮ5!A)~M68ۂb=yI>{U.Tj&ȏ|n"A7! _}s,)<6l?4`N-a܂ߝ2 Acz;{r0y^ O p1?}@?TGHLX{Fm|^IbL`Ci8hW:uΑ=P@'êa\׍BD6m6__z7ўj $7J8FG"=2W>.Rw[\Qc OxPvPk aq֕Arueb!G@8Vop*\}?E`;t*bgwGڛ\QKUm߳F -WG2ȍϡbJzHC ۹@YgU^"Xڱ"+|AZ@8}ЙdQeP~MjlÑhi@9CƱE/&&lԻpn\ɇak2ݶ͵YОsнK wQ##Lx"].yGIy-26tw#eo c#K"@CދI@Kv9{ M+C[ NYW<5j/J'opg\th$@d5>>AkzJfڸ&MOVu^C k~x\i]D^Ak]`%ZL3L: yvALQY*Zr4~,Vq>l[P#qYY@x[g@2+)ⰖP)T_B7PF pZWQf"3HZy>)7>YO |OX{R7o7CY.M<5-Lǚg;|Wx-աL}pD ݑ:XO%Tii>\Qoi n;adjEi7h1Bq}uþzd u}pPˇX1iQWjbe34`2oeT,}L`Ra5gO.=rc'֛&,8~OƤ PIcd?Lwe!LVI)I*nI1WGwjH]h:^p+^C'?KۂÙzupbJiR4J2$K~)_zdm6`aP#lL{ط]b%?ÔUwv&(FXASer yT,# S~~i9[>>-(4+ ECЙYmBυAG8..װ䭐 ,aPuÛC s gf@":=" N;B2mI 'Q*cZt-uISq&Yp+LIrBb(؈r ؔ>+ͿOseG*Oi8M#?\i#oDݗ5Ri&ו-+x!\G6|՘F6'ܷH&'iyT9u.>ЅLr)$ j4%%FQb|ɊKO=W=D )4te%?88툖=NK[)LJЫT%N*Nt] L SZ( ײbRYxUݜR먤 [rjJ9nYe \3LoqA߼=;|q$e.Ux`Mv|"t37U6zuna7. (irFlWoͺJJJALҤ/u.r\*XJrQdJ2Gm°K G3UhfZt= [ 6y1JL8Jݻū&apXxe謍jLMO*LIt^0%R M8^؂Tkq'$j.3rފ)=!'?|tf=3]N[۰Y |;+rw n:ʕ K7PC1hE*x|cwk}o[Re?{6tUBP1gs 4f6el+KAp/2Kr&q{N^L"'[6fR^{y=[;lWl"pdW6^{uP9>Q}[D 7Y6G{8Tk$ Gg_cMwBl^W5Eah( I!u9JnUEg~,)l}%{Y ,d砗١ Y8R{>)ȭNK_Qk~|rKy4}_s΀&쿕O9m'~"zˠ~ZR ף7)˛#[.uQ;KI㫸v'q, 7(Fa1ȃu=Q"<),4jw߷q#I=/ }gL q!s$Nn!-OS(iĽ" ͸$(Mh\p1_1s^ zsO^ܬKqpLWgw-Vap;>G9鶔*`/5?$Tƒw?[qt[9dZO!//aaT{kf#-ym7=7 suRc+vk_oշ}]ZUpҹ4Rr 4"YZڕ>8I釠Lz ,~~RS7jB@V4mCzg/M[og^LAȔ;cẌ́Zb5b_Δa )V-=\hO?Vr:8^T_5dG{UfI_:Ne$KfvC_z;D5a?bT@I^Y7d˨!<~%m+gfyٛ9Dۉ hsg L#ШDŕSEE27^؁$h}#|'Z[0dˌ=/Ӻw_[A:'>\`  I-f/s "'~2$%Z:&&gn㦥Cxd*J9ߎ4m߁BAVDK x>iжwq߹2Ђ~ q?F[?.ǔtB{ՙI4/wtYӅӡwaș%ͺa]~g>I"_Ә2r$~{C2\80'ŦbuKՋh- d O8Iqawbϝ/p 7ެ3f&#$Mڭ'o[*}VXwJWbޗLSJuSP!%/D0 \T<[̸U:[PWxl\ :G((F]X͟ e!q< +)YIIwMjb‰ I/sXHZ& h'-_T ]lPM}eM(ՆI7l}FFyTT&{@<zkt 0ă&*.I C>IX prUq+ wΐ74P3]1u h$f x y~~̘D5Ww]ƣ<-*9\{?xu]`%mQn柸m aR(M}L6\sɓUxd,z`>b J埛D|oTqӱVR.Uhd"6Jc-bu|!UIeȸk2N1k #P$?kP]VCB˃_UB\ N[Xmъ-BbI}ɑ\-b*J)1B[jK|ޚNX-::603[\).R2Y4Dj]o)l^q(u.կ^{uخC\f)iT>uOʄL  #(vVJ?ԂDvdYvM[1!'AJ!ft 0ܹc=& skgԣn6ue\++8T<_QEA۰}FpŔSDa)]+N6&UUGazi?V"\ 8L~o\&v{鑰᳷ 8&\\2Je92te! ]-:ײ/ B}]HoLtb2-+5Zl^K`vZ(Loɞi24-3M3>͡i+͉NiBXkL[CV;{7% l: R.1Վw?cE,'(7y u&|ֽv˹NI?g2cƸYkH`UVV/g1R ѪxY*@bD~tTdOGu;Oڿ7붵je4+kgֹ52fW5S?jrG 3nLs+^L˿.kꫝoq@!—)) ~dxv_ni^u{N%5qϬ7HmIu^(!Kt Ӫ<[QqJf=(oU:f!3jodN߿s8(sde }tSA#@PtʪMsLPϲòX7NMU}3&&p[{;p#Ρ;3Y1dhHVQ 6.yp Ѣ$ #T-sؘ9K eJE,f$Zr(Bλ%):h,r[A=F}ۊ갖=]8|eޟ;6ŁYؠwv(ü62 Ŵ\ 1phFbLs0p@c/zy;EsE.g%ceZ-^96#>;}N%9;r4.rBFSFۙLHտҰ%=A0K"I?^hΕ,''?ߔO 8W(s`̀0kjևt-jh-P}a/d-3>i{t)\.m%]iYu^g?go+*q;Ӓ)Z@l/0+pHY1J1%). ʖ.-h]H٤[ nX`).jȺ7VHhrvnP~c:-GQ(8O@͢T[I̲6;gB˱pFJwehVS3gӺ?cx#509n9o%qpOCKt&,7xMd|ʻ Rq _ $$Ͽ CSvl")ru+-w% $}/Id/_-EɼB?_k7Rb7eQxː8*o0}&\-[zcEw`9A a~AԯK 54L^(yp^Wc}wN.v\6bU!;[׵bm W92(8@ЮH׈S2“o\G }]S_΄==wy!F,"XŔH.4//TE~QwA왗/r=Nb0N!t2HZΨtТU9)G{U|"UyȀ,5WV7V{L0&4 9kuK~uE*Rpӭzt@5߆rdf66Wf:2 mUcĪ\"{q_d,dg7x K v+#zyZ;1{T JjDTQcץ"l!w_Dގ2sa L6pSTY^D wug"Cg[ĺCa{!7 єwc_گ& ܻGI}t_MYϙg&vrfd᥍嵠6̖ !61xq6a+!LFn%Uw^u$0V_ 幄gظ'r pvrK#+djK UOS~YkHpKa!{ @VAMUYKfɲˀ֓|(<¨y ² ;֛. ?aQUˢXDc6g% `ʞ=\h3͜iQ&sq:ž+(}[͓~=PtfabL$Q&Է}/⪖-=_ګx_>mwjFe+ڝI';μ\!m+jjY :"!KT%CUp֪d]Bk>7.$hRE#/0"mÒd^. ~|xJkag=B2ϧ:)z~#^z4,goӇ,,`s˄%{UvS3U(Hx0/׻\+m\3[#,zt)#aopw-41?6BM8mw}ӛ[^xCuq?h;O 6_<c<>Ex|Q9Mѵ&'̍$6x|ŘٲJҌqz?+rkbo6*m߁䤆hYb:}߄2vw=0ތvkRcZ.}hk} .V>'U #q8^* DS);y)4H?OV7&{)SH?cFhqqQ6jryp6O}+Q' WAND)H~ ~|8ge?d6J`k\pR2HRKPrq,p== M[x:ZVlb{ynw'kh+k<ñ9ymx06!U!JxtzOBlTۂd4 +='h&8??$ <0flcCкWO/Bβ0z},RQoft1 Fs0W3!_+ylsY_Q|xJ9JB`٪zHTlmEo,ߙ=sTd L)^%i>JF6g>nEKБgwV)u Z8Y9z&eЋ)`թ e˰c"C{?w> ڝހL7|gD k}_U1{ψ>1prQZ6$sjʼ G-~( 85b5'CI'o3XK'}0oc/`ݵ?}}4J or%GUq"95Q-7MmT9lM^Q); !Bx qyOHڇهn, |*$zN^l] Xq J屮~P$xw5 xʓ<Zەc9N(MXH&7%.t~f!>MfI$Bjeu 1Eε 9[m- <}eKrdަe-wSh:pR\WʼWIuj_GFL"Zr>@N ը8d峞ޏu5Ʒ3֔a|{)? sНE"@3]]}Ɂ6Źg=Q:Ӡgf,x𞌃}uv{sOvy3 Q˅ct |㮚8JM3iu8wN{lZh ˙ZQ K N1ׇ#2v|+H $-b~WI"[©Vhktg⸫LГ:,؂$Dq@)@z_nJ"gMNb"4;wyj4\ VR5-cu6̥;( y;$.)/Ze]KahdcS=XO`{[ #deogޕAƸ]" PQשm9Vx.~P#>nJt~*02ֳ-,vŕ*'BF\&dزq?M>򫮠b"{fQ^dZzA_Ҡ44 bXe@h -xL=ߤlpivL*0+VuUc$Ydmed0[zwsۘ#4ց'ɉril)[eK*|-dȴ;&! jWg!slIIEe M:*&%&{5rhL=$*_" 'w+*C<ս0E0I }&NY7NQ{"B9*λ㕃Uvd>!R>qߜtFP(|j(úM~ |t,Tfv0,{Vpvin#Gp 9fحE "SL6jDB_&VMC*~j4cv^Da.-ݏh$opF11H@j^mµ2>y{b~3~I^ 2 CĴTMpKGU *=FT<$]ڕW=< Ca)9c3 ]-z~r2l0taD |d_rI v.h{ 븼0`=VilawxGE;|x&k3Ĉ[^{obPETT4""PcqE}O%vŽڞ8);O0e7Ŋ܏C̦a]$eH x51+BeTD32}>y!eӘ4u`^_xJfYyoMvx5kO=˺jW k+}kQi 7\򌋆9#qꎲ#UKC~ϑ 3 L>|ː`*Wv{ڛR͗h-[3I }bА,rIߵE3$홒G˞ﰏeUA0j KI15h"4H=MR1&6rJ|U[n ۩ T=`N@^ג-LA>VTOӏ*Ğ-U=UJ?ejJ(DUɱNQ'(׸b"4--{XbPbCX刉9,jSIIL؉[11Om)09rS(%N n`hcRb6ytvҖÃ[Lgώ*4dBU}ECE 9k=yFV@?dΗl=u\H'[oHp[;g5L=WXhPwN]3Eclp;0FNOq zzsGUhkEӌTBdGa=`IK/CcXDd?)Aմ˺CoT^όq{vw!b֮g5-}oD} SUаn4Ý$Ctf}dX @Ӵ`J;N_Z |/;6@baN{7AQr69nw?e#PS6Edc+&kfqXNkz9pr #.e;Ig<EZ'*Fc$w^G2nopQ9c_-)Ǥb ַlmjNfbu ?cSj/oXB$qf뉔/M;h΢ut3x;A~V{?) *yϦEǧ~]RJL%^ b8_{tZ:Mw&V$2O;2{riC?"WRٔp9斶l+:Ukړ*HLYx1!nv(X&"ޖO1CYDN[K.r9j)nV66*Ʊ̏܄?0.tb+TD '[O޾^Ň0Kͪ)gj4OB18xg <"=>!bT/Wϗ;x[>?<hmfwJɚ8>5zZ_X~ViN&%:ko1>Ji}0jT@lN,eX}bee0OsO]DK3mjNspK"^Y;V DX,z3ivʼnf=c% Bb K٩BDy?B+w3>[OsE2eImyvp^"|W!K-|A }(ƒ&SJ~"ap>- G L0Ol]ϟ&}bft(*CꈦzC<Дdq-e,tų'mG[ z@|~8~;ܵdrbb qMrx v3V3\(-OwJFpzQñLYTpћA'z1\xyW/ޛqjkN&dXn`:1#ҟ3;`l4P}io? B(ɢb{qJ|*Dm<.Ui4ſ o8m3=k&m YGϹ\`(*s+rara:H&s.s@'Р/)%#afgm+O>#B=B1c>`{I)j3=ɟPΒ6x{Uk|Z89lL٫&8#-&\Bw?5*8{j<0]{䋇o?&| {[8,Wѯ}v$蓰/tJafZy FJHeu׽b?H` F!~r4v'gԿq6֭@ H0!X_0b%{ P\(~FbΌ <: ,%8x&woA&D1AdA+َ\f!=DjP۔qĬ!2l 1%c,ۯJc\<韍 _"jG!$$y!XDcN/x u@ [?uJKV,jMO/O}U#6; ²pf>'!w5uygܯo2c[a/n/ -5& =53ڛT;烠U$2Wpnɽ;wt2do$$3f? EP ?JޒuCj6PAPfiTA]|4U̦8L2!33yO;z[[$t$$!A! 96O10$~~e:BLp,LTe",H-^B5nc[KR*48~XI"kӑ*8:=GLA:kdhf&(Dl >g9")HP BIݽsRc*l j}b HFDBzq*BBdy4d^03#n59%:"*F?o2@Pcww"ya"O1Uf~n*#K9SΗUƠ9*b?REjUyAN|;͈y j G"/^"CPzJw^θ[PEEg^b\\}1 v"֩4AtZEȤ}S4 c`!B`v0p3V" _"k<^IjR*3ZSb-퟈ VYe2RϺAf-a܍jf>ʏ1n(c/($fɑ-վּF4ƶ]?$͌&aGX0~u YXQQsM+ kyWHVg'/02kvLĀf)Z=wftKͻ>+Jp%>/NTETO] 5_U_0()j9 qqE}V=ƟSS%0${˖ehF[)NdqW_M뉟&uce?M+o~pEPXbErmɅ%{UihF8 qG"uk]ԕe\-+.yt$ Va*Ch`NCg'3GCaQ(PWQ=ܽ?_q[b P̝u>?c¶0@&iv륨36!V.Uzb=S^g&aСy,oXGR0Sro,dfz۾g7/&NSUJ •7BzE$lsEy``WsSWz^ÖT2.21FO?1hPN ZvM3Թ-W23MiYHG|۱Ⱥ1o7ש0~?57Opd$Y"5/ߚ)!JRpvuKV%¥:HFgu8449wJ@9{4gvm۸ͷ~32td9sDvxuGt$|Uk,bAd{Įub06Cq4 Vj&ip0ޤ Uj+"L~H;k75<4|B[<(@68=>Ϸf!S$KM8UW' Wdu#08jp㜹&C \ͯCSuNJUɯH+[` QjB.j'QΜk4oґε, <4Z@Y!x¾H/wROiMUo)o)vZ?@8ǚ(kovoC-lԣa\Q w:eʕ9z_S2e}l=kҚӤ5Zu,i98kCY 2e^GS2hPUmZb⬺wMؐ z0GY1vVǔn˧ ٪-jC`i1xu2HM-m;[UTA3$XH/:KZPJI%x~ Mb",e7oc\19lG,'ܠAz_waO D JF70fwѭb I_H̜(ih iS>OpNhbb#^6(]|khnqcn`FXaj!iR=Pga`*RpMo=p-UD7P~D<:WX)ׂ-Z=ESi'aۭHK[tY/ uzR4NWP瑞~W Fп4TLJnæmuWѾEG`%EHU_Th^m$q՝4 xmtc j{"MP[MAhX*}AT+:+o7[߾doT 7ΦjCz#kY,ELHHD5\PynȦRk$Q = {2 ÿf/ kxK%5qF 6)CV㩝\o|kJ@ԎSfqWd Ʃ 渿bOHmPj tS 7+LR ZYYTG;/nAqjsSB7[:aWFŠJ_PѭvۏK~8j0XC- h+Vo?w{As h,kh[m3=eC*% M6* gR0i:褧]OJh֟V^ƪtsZ'$vF*FĤA< wC4ʭd}@>UhGz Y"kmE殎<=uϑ2b$"y##hÖǬ3~@>Րʿ>oV5JRAAREiNSno94:6RN"V9Lu\O|fjBF+'͞:xRl .2q; _j]S U ~WB 8F~^0:YKpϱĢo"zWZrVՇ(fPPIUqڀϔi]-Z>6=N*S\/q8 J'%ޯZ>g~ej[T:rwzsZ2&p\FuwWGP,;K#4 Q)"cZ8n.2Co&Z;վ/hO=%_5s;7>rG*WN^c:cqa|35ba%&ӴIo>M\lwt0W8U#5Q ؤNLClSլ}\T pl8_'Q{X:+ң<}yF+UMܕve̶'8裳>)dO`LM+S>85r~S(A8u'79 Zq@${z&cfęyԛ]۸`mONnu_c S4Dϑ؜q=)+fjd76gJ^G&e`6ωFIg`'Ac8AZ)hU<{c˲AWy+{QF9,G|/_ 2aS ?Vu[8Q?|ͼiե<-<(s*Z$k#YRh5Et1o3~(kGi&QIB "ץ+v;BߞvP|hv9x[5=j$.wH(tQoت?x@n[q]!aM%7DG,s V(eܐبР eyEdM0/A:"qdQ_Aw6Z~ȥ`-LkW XO6Z_oERCSn'ʯ-$T|,3M3{&CkMY@U9Z8 {Ui6i$Z4aHx:4EK99t;\!P+@#xO=of m衵V1߂ZuLN{ةc^12|49-A񞔸[um8q*W.QGkD5 (Ӯaj31.GyWK]ruP(-V2mB^t8܎SR 2.V}ԃ7XOz'T?QTnQ0'Nuź aN QOiVɸ8ۀrݨPܭwhQvŷ&͢ y! TZ¶j}>VBFѬC\Roי0#b;sT†ݾt~Z[~|u SI VC!ǫRY ',Bܭ~jav%-#*+YA11WM3yPP!tERW/2]ohv2Jɕߩgқ)]tkmasMҬ+|]EwT/%명i|oIHl˟_T<ǝ(8o$>zdWAto?ǩ/w&q^oO5k YmKZ#(K=8z@z=cm]Ͱ᯵ݡS)R|rFb܀뾻IҶɅho Anj pola=6 ;vu ̶p\!}Cuq9g@ì@;JȈ]hj-'I?Nqى!cFnHwiXbFы̙ɀzzH^-8l"b_0^s`7ah{'`ZaD^pv];qfֿ1kG݆Gjvn2&{8G{0wO`avZލr\j ÜIf1c?׋z ̓+qaY龉F0.d6#n -뎄iKJe=혬ɳbцCt߿bB]9 tb1;v%?QlO1A 9%oݬ"C{2?ͫYb4qWPt-m&6d^cA͸;>\U]Z;J T}T7ywOWbb+GMіsՁ[qwI׊G~2\)r<+CbS%{ك%8;ЏG}$p)Fri?nGUޞ uo>ԁ[R%38#o?E_^H6HqK&?8%0Ƙ{_L~ic@cvt6݀1?ןR7q sҒ>Z>PՉ:ZmqغXBSuGBC2>&(4bTv3z3 /S;7CaUيD , X:Y:Psӻe,Pwb_::ȶ1 ]:v6~=y/@<~]d!NǧY)'٣yv\FX،6RI@"гR zx`O=མP f߂4LPFil衇 "8H~K ӛPMA9bf6ʣ`FuGeJSu`tWONB0d9IST)0I:P% CMJ-EAF%M0 rh_7}RW@_yu3oug6.!z6/W^'+CGI} ⣋Ց R'~Ǵd݀ Z>d}Ѐ74jxg݌yJ',w#BQ& 8Z!*?=d%xW)v{藽 M}R+NyM0*uSℐJS+g&hf3X%OT)!6,ImytjvdϥB _\%?q6]Bt$Vg6"wuƮ J4Lqd/`_0AMP{ϳddfG9̀gƭb\H:`Ot d4St1gU8ښQiQ4w2L r*\"GT>`|0ViT~< Lű?Й_4;>ap9.ww]RSN 0O Ta^<  hc[=ב%"jDz&gLHUlpk 5@eDXQz -PfVbN 9@pDnz3?V$).s. :h,xJ+i6KiJ21*gsvRI7.>ݓI PgT ,'xgt 43sczvt@j*/i\oeWa wdQH,Ȑ+R%-΄LMKȕ19lExTc Z;`Kuhhi㰡$R,\_MEyrq90轙 L^n5el41'*o|FLҫ`Suʫe tڡ}rq_180@$MBPpҒRAgڄ ,Y,WDvB7SR+qC;)PR0 anAJ&27Knl^ZdȚ.6]&G!]EGG΄nDПI0k:JdKt,xC Ӻe棰>O:I< d(2: %v6iPuaEPU)q󭑔$t umSBo^m'oPSAInf˄ vH\vXDo?ـUBt+n{ -كhzjiDQWky]xZb†A:}:;rݾ5R)C+֞k.J |zmLk9/t![;E(9r˱kU玣 3 \zQPmX#Ys4y_q΀irwÿ{$†zPq"K['ҴEByB A?@t%;@6:m!X}BY#Lyd pr#[Xτ~?́.k-P ]tھF?f+Lsy~8?*'{l,KMkR!mr#u2WӀ`=[l`qhmJMRVU0Y;4Brȉ WBp %%Jh@bϰ\h 2]&âޡ)#D狇*F\tH J I~MSw"= pwE;' |։g]' m2䟒{v߯[ˁB%s>L~Di'=NT;hjE&=cЋ ᴠ/"DualS}"8Sz s?kk`,و}t x eERS؟H$(I4s7(4fdY.؏Q}״nUwVo^NZIdm~<9 p ʎ|w$Qvu$Xl`3D@3oeG(i#![NnJ7&[i$zu\} dHg98mH2vwH>3f;w"  TBWD7T Uy(KTl lZjzgT6P24Еl039H QYwwmeۼn,[Y,IC H47D@ K% .DJ*T^BoߙwyHyl!B*F/4(jVDhSA#$W*b(ߢ(YDl~pKG^T:3%&U+9gtHeˏN&*Hbt-&X3e٘VND_pS!Ii'vMo2>)Xe־KV!uךWk$EMrJNNKZn!NMOS˳҆LiUe,>5QϷyYͽR v3ȔʳZjQCN l0A6"V&Ihl$peumPY@d,4{6ef7fzk)qA)^!4JO0:2g6{Vv!8+FWR@FYS7%F\2Q*\A=%_we C/8"YԲXctYVX/'ʠLee ?']LH;iLn b@)jN|B' >bjTY~ޚ^\o礄לkpd _޳Pl6Rmr;C s$JJeTY (a =ϪcGCN=:Ϩ˗ {V,NIP8ث2&rfw9EAXE룛e7LaLG?,a}2m" =\j%Ja!͆`o7TX9*u:ǜ kN:oQsCs!3 ̴Z1 R'_bgH7-C YZH__`"*\QX }|D;r ǭh]jZnq kkŮrUwNqI";Ο<_r0aQ:P:x;C)hWaM6 JǏlq_\ M)YIC+t!xsJ̖CWؔ>ʳlxR~ѳEIE5M8v1{200NP.˵tuRz:uږ%A $k7bT++ M/a$Dz@ZH%^%=${ꓔ.1]GoUtIv6rڏ)ZӲluuγܝi*|LWr =I0ss =jua5.hW{dtb;5r^zno Nz|蔌rNү1.D0<0AϜ쐈a=) k=ͪ~.EdM<-<K4h LA.M&%uy{PI)J)F3ws6tdܩ,#+칸,F' Ek%zXTD*1D#GPyv2~nֻ *u'Zkn&Qbi(Dkі@!Kv9+;\+ٶSlM:8?U2ki1|e|>^OA0lRw;[jc*))U +M_=/rJ˱s.:=ZVacٽȂ۷D' %ȫzf^Vtd`&[Pt#y@өXMyR.9 S8/Iv rn-2]+n!s7&F] ؕ'f]΄i^=lvY9M:O!=0u+ϵ,Jr_R%Y΄I{!QdPKzknc%L`4Eu|_'<`S5_a\.6y7AcpeA&1i^5lj=lj[|=I2ctZdA}a-$99ur ']Κ >?i㱒3E͋[)+f~mdq߉͑q_oGϪ~G[.ڊm@⼋Nypdl }ǐ0,I̍[8=鍇ڭwR?@s6o `iCdx2cZR66CKa.1TzCN^TXp$I(4!K ̓fLDh0*|T'TNܮ/Sh8p`ᢤbY6W?~h5^Krs*;\iQXxPCydf* ٤r_{ML^jV OW{cNsJ2 `F4L_p5cnGK $0*32:NcmIW\دژΒ,$jR| {rI1-N,96O#E~hZ_%ז9̧RcG,K 2ˀ]:zlhc7cT͛.=e;HSFLGZyV'.Gd5N|o eϼ2-+n:{M6j/#gƤpoO՗zuN.fW"H?>9.6|u rZNg|*re.Tʡn!83y;3dDna2mA=k I=IHBX {2 5E0&>1UO?Nk(ǁGô |?))}Uf-A-W$F nF$v*Bi_ޒN,Q[Rb ۖR׀6Xtb"/.u* %^#/hH]B 6PUû U;B 6o<$[ ДPFBJ&E!JU4"#2zdP4𧿖}+e\YllH S"p*GjC{jKآ- ϱj1{ s˦+.Ogƴg,K^"7`S[Pkr!Fd{/}z'^'k|0.f րoJCCFf3";nK"(Y6O| 1P3L!78^M#I\VUcCޫ=o{뵯ztE !8X]odCy|NH"Ou4{o3Lr·&ШsiiΆ\cux#Fh#Gxk=cG`{-=`U]@6zv3ZzCzUER "M!Eݟ m0;,JiJ%(%"sn]B5_Zɺ[CIPl223LvQM {a e#aFq11 ^lF0Y󏣎wy'>3^R1(c:e.Yn㨃NAaXPw)|z ,%!~.YP!{?&x``wM}zZ (S|<,W\Bݓqq'pTrt=DHֱql M36M"?&AU1ߪ(Up4bʥ!%ZxM ձ`up-|:qtd oqnC{9$2JpWN.LY#k=hYuo0~ן"t&B9.i |!H0!7U\Ko<h˦(w_;ẇozI `7Vh]-'Ir pK qBN4QVq뗨K=NNiD&PeONI._3!5;i9"g q?OiI O+- O;5'5NOrX:p9WA aWԗ9@δ>gVS*%uGdҙAF<@w` qrzB7靓Z۹f^V=xm=#a@Wsv} kZ_j#g,qwakx3[j_{ BV[K +OASEpz'|lkklpUc`I.8Feyut:$!C!95԰MNb+-״!zMo)DIQ6#4w/%=5Q8g3ٿ zk􆇪6l{ bױJW;k4). jb5xw y EQhKEv\|a.h': @QI#]cjܐ3ы,3-~C'aoG)aԵRC|xqF1a\49LۢޡZ=dieSRh,/KKQ!d (9䔘1A1KA0uǺEm2+EN"(PVSFIh]0>)Rɉ hG!5 1%¡G#GnX eKI/2?U?y޲q3e Jx90xq#(纣&Q29}$wLyy.=1k8\6M *QBDZ?^pl]'&$uuCHR|o*r*IŜ=,Z-=:&Ư -r yCrW Y w=(j٥]Lh 3ݙ׍nb0kLPL]y~Mh~J- ;=XGjΘP:oɎ%T$V;󑨠Z!9BPoN<"¸OB.b|5k @. nji9lˮZL (u4qW=PBTtݓZV zťsUY݌~TfGUʗAlysd9p U>TYa,˒K/mUe(]sW.Sg}ëg--';t%fq]!רK2xr_>ʅ!P-j,5[=CaApsp1_X#îʥV8~ KJS~nИ;H|Q?TaBː7- wYo9 ׊K~t`E!(|We\V" .ERL'9<`͝!ipx/s9ܜFIGL&xhkgt7wZ*& f``*cLf5#D<Z-g*jvW~,= ~u(O,9#?~ NV9/7ZG#ofzvDܠufzQo)ڲ/pK7SKoOx-p18K@ ̈́?XD#GH[LJ*0oxv-3o~fBQ 0u<~-}“'ʄ 4Խ$d_q@)ЅWEM)ɊNu{yt> |^d(709ȆkM@(ڰ%UYN܁ܘ S\!]%E0-𩱲#QTt|LllrD>8m mLqhAzzPYRu*e(Sw@C#Q$(d-RV2nJ ͵PI/{~ וs~0 Ԝ4a~kzc<~`CD6*r]+o3^;l|'}G(e ?} >QC dU3DŸnkA'\1r^dtR @HAp~ڙ  $Mݯԥ A!>'׃ⓟ{>TX?c_ഇ1}6tKg!+S]Fp[U*5g֝SJW͔*9 !F&m_\CؓQ?qZJK96QYn`:τ\hZG-ʰee'Y|ra;Tnx rG*\֪u7 s:Z-q>s< d ;cI .193"&l43|pGū:РzU8Kf]K7/nJ !` G vӲR#Y_s,5h*^Ol v1Zh[WX -z[h1 WX&~@2#4ٛκCy=ܲߣ4P ,#r! X_S䲤9$ƉTݦ=ԞY~/>Vh[b\c.\%N9/MQCc)K}}è`|?)4u.!@9ҨVaPɨ/_ڎ,v_^(}"!buT|@e!e:!QcBϿN"_Nyr<ϋ\Ϋ-`~jOstPV^¢ejra2\)(9x #ie[U⥦ΥV|\MxuwI0[ʚ6˜xH uz'l cGirm}S ^bǁޯu7DuDd軨ϖ,4_,4lŘxG'sWtn /oBlh/OL:V0\YSyB>'}w+£._ r9Un;E/ p@DW#,e}ʧӽsܓ`Bн}&\4-BӤ_#G.$_dmߘ⾺岆\.˪wHXߨ_T;8*'_l:tm|[|;$n`zz=L Fٚf8kbk۱ AuˋD5d` 7ˋ&rm'h ,_~G8 S|9HVdꨍ&߲b<)2en05"nRp0"DvV!m>̢A#`4aߚ#@Lbm1TVPlY>Lړ#J m_KD ЈBԀ wqiPP [;dNT8o>L5ptÂb>}{`رv˻9![Zh%=^"DGTj`2ND eUo1PvZ'fPɁR &[J'97VklQdՑAn{j$RvkN'7yG/yf yK[l` }9ĉv pK[ 7_! EjRȰ5@ɧofBueGiM [!zR>'o2Z V~u&z*#LnPKZ{;X ]Y*t|3o%}s7Kr"І$n3ƤrH|8veT!:?&د3Z"V @d"ЇY;Y*' 9:^>p/">7)U6` Y"jTBQQx!'J/ԏ}~%#^_*xCn>NB0YRz>7_ɿ}ɬ3DP#fbY\K o,X(8fhe׷!*#Dg]͙٦)}a$}7!wsh$# C-U .*ч~PTtЯNK):QQ5h2e7L XsY7mf-%dnK$"KbH:&8z0N )ۢF"Ҹ}V>1+DM hPsTjxfLFa4@ Hl)qω|q9NA(852N%\Mߜ4([. i"{I8RE8%BE:?M&j+/A4C3"iuA҄쁺8] K]@DVGڙ()hKbh֣h{ຈ xy:"-ģ2Ұ5ȳ z!ٚuV !ua Ç ZNdTT%%R`fdM@ Q fdq×j L]iØcهvQlpDvиl[c k+ٯJI v-y8GrɔOx6yL?gܽiOlD6.I@(a?[(ZK) Ds$~j53Gozƥ|rŒj?PL4 $Xfo,> A@fC]N+-|ׯ4 tE]-r(Yʿѵۡ6=D`E:KCii(kAq44-A?gQ}3Y%ŭ׎Nc{&ҕP&@P;\VT_l!VMZ yH2w9ˍihZ|h={?cA)GPUI3~;+mTQmݖ[_^"p5hM]q raYPR:AkNXJT[L[+Ƅt|n-ND R[epu飩"A[b+!;_e)]Dk4l&ڄ锚 bhJ&H Ƥ}Aly=dԞǤRÕnl-'B8\ɸ$La8Iu#r~ZX~(8t/5J6ArtBU@/[+;_F$698`M7F Z?i.n}PWuPp wc\D%5Nts})}խ^a5q>Y_R#W#޷D7,G@Alp+M1. ,HM D*-(#}L :}/VxM=k@.Oqjڅj@ KK)'iF2-IpN)CtF OQ&m]`:w"(h!py] v+6m⇦(>nBh9'9U [+շ*NX Rbd|֑.lU l!֕u=tEk>4UkҪVS,!$J9*xf=-mk=:Fv/qZ2\:&+ pqxcC7|%/l{PB)w+Dq"F0ĩ6HDT.v ܠ^W}#o_G.V4Ae x%.H~ZiI9itj=1T b#M|{#}S^>sqEW:6tܶy~g2/l2A)Z&_苈_9雕kH^&uauUp{X 8pn]$wS&tgM{'^CVZHgJ+D}L\X/Ʊqشcx禅]\/MH7ؚ"~<5ޙ OLЅŘ9Fh\GiE2ys+6õ^_{%f|m>u=7{?3z7Q =UScҲkhGnv%xh{!*å,yp_Oݘcœ: dP5BnP%5und J78H1>5\#JC6#Bχ.~m.[(o ̊@f= iճYڒŤv"GiMxޑ?0آyP*Qb2%[mþdq%,sbW+#WTxP)+Qc7Q?miOL{V}bln&ᆥِ/Qs<>k:~ <3'0a*LBz\dJW'  cj(#ϫT׏_{#c`"J=*q__~y&^nA-[ߣcr%Kn >[|qjoBFf2'";9PEC$ &AR"QI *{L&氆=򓷺͗PUMUVI ~@1I7&~|UL[#ՅW;Uz$9M> U(~3Xfu<;9i`(~ 5uQ^V[6qY4㦹u9>e= l"גmRfo9lHX˟xfeƊDN8MEȚKXQ#c!޷0wu4MMCS_NR-b$"sin/˫i$*o|],I6!\QPxZ(vq+j(U)D9 vάqV~3.4>@ V糷n2ٟoKBF&8 Ȉr*LkSB陀iRF_|QCdzF*]9}:_C0CӰ'œ3֟;PGS3II.a"xjN؂:Jp;({sx߰~`{BDfh! l m"8A#rA9ʴYOT.aWgVHj Nc].81QtIbpPbgTYsòg{viz3ȈNޜؿ3QNb8Y++{Hd= &){c6:&m6v+JbՎ, `e|S-c:T̍3T-/yͦ)[|iNՅ|1Lg;pҎy>`8h~[lV'X$Qn H9?8<!]0!Aj +6@x/1Q@mKtz_;>a&I[TR:zHᠬ˹X_˖V~xcjW0(Њ$o1[w7looOYe>a(! ECЇ):ޝ#::^iB0#g;t(.2\迚6x &46`EG pD?Qd~X ^k*b9b ;"@΍\{Y-IEfms]?x!KĔn69GzdkI4nf|mY;uG~y۱ypLTuX-7G 1&h9aS@=n?(hHΔ5(lL n`Ch⡛7BJ+mU>{ܷE{jRږx-J&)7i2UiXd!;q OLRj7bdqc^YԜ{jρQ ~"Z1)܏ M0v1@A7J%Nb,;ޠ*eɃieRh2]n7kqo[NzΌ~f1$?H1#80MlB=1Œdċ\Rf97^xѵ7aA#UW>VtuV-8,$"s-0,B˕8>]a@yUo|0G˺9Zl{%xf4@o]caMoep9#Z=W;``'7y%++XQ ΃{l^{wI{X*ӳfsS˖oqw 5 Ta)T.4=T<~eמ{~ĈOWAN)YϏCe69F`) TSS 7Hoq!.o;ivneYwX}s Vʺ+),P% qf&¶MnڔRщh[>kY<@ :/Eo 2:,\LGPA}! 8=CQt2ʼ .ypc8!6m 8 |jE%B97F}$Q4yK_)y"Qu<73;#p &5L`L9fߣT:0f ¡t6;.K#W V^H5Oа3sُ2dh,Pbqa8.zῃI< U^x>Qy3w} Vw3;թ VΜ[:O`%nV)ⲓCz\W*$uceb#ADD./M 􌆋3|z`" @[ȲL$w3h߸x?B3Kx@cwX;^-kƞw4O~O~/w`1z*Œzcy$|fwAUmnhꇛ~хqQ9e'f@ʀg(T2Hμ5*[("Ta5Aj$AhJ}+2d:=EC$y,hqZNN+oɏAȕ=GP 8+e(|w<,}{%u q)uw/bjqu: T-Me D*Q#y }A .͘HM%J_b"-w9 2HE=gqkTn`=]/Dw?IcH= )h=(~#hjv.cP1IRǜaKYD);ie5Mt| -K!d ֱ%z0:ШƩ %?rȂ~!jv„rr.P5NY\8L{6vr8A\`&Ag8-'RPJ5llr2_2=?cP5^Rl&ѶxR16$¶{ίcR}Gp zߑspԒ{t߭m4!LÒY^߁ T<6M. Q"@E<0iN(sw.=r xwvpoW,B1T$KLq({9)D|5,*%@3|+ǽ (T+MP@WkBfA{ج 5W|EQBǻ9eEoc!*3F xaf?,Xipc#ӏՁ>2i,0Uݒhlc0w3myA 3V{ȟٵAb=}X|-&faJm!%zֺ^^4N,$]5ܠ^ _~&7;(#JDi3bZy'!YOf!N>jm5R׭\ƙ;_d {{[墝(;kXaWm>9b_OxPbxN!B)-0Da6튻=Ea A!3۬ŕ ms''HsGGV}FM \J@6KF4TP58J:< %&dw 9v -u+S'bb8ntnѻ۶.$鿧{*wUt\h  LMǜ @ٓQBU>8d( I>P5]ŕLJq|"LVCIGȢgc*}0-! 0Qq;W,޻|gXUy;:PS[8Rז5S;663%,hbklWJ (6+}0RLCtNI?Ƚ(UWV¢a? ϻ+7KNt7 o?]fwn$-DeF?(wW[T. d5B~HtMnRcxq>m1mGv W<..iUi9xFF:0-b3 ao+whE_̏F|w[j(MB9 r4bSs ҍwqFAx.<ʬi){\b|_ei`[D"#ŃUH=OݹCCo`cj_އ'i> Qu6YQ[BPWB5=o"Z~\PB@j t8FER)[. Fڂmfj#(&Zp#AAy} k,w͌pt3TP2e~KgHn]-s-dbqm;2NӶ;0d_M{wH8|O}#&3w7N( * UBTпC-;%iPEv(r؊=kؔr.h9\=ɐ&#83λwwws77733v%ڲ쥶8HlM"I m4lHL/^/D3Tt挊1 sE/ODd9BŰ",H\&w_I_:h[pFC?ܝ|APXɀ]WDHy ՟BLгhffS@?O#?TwYB M@V3> 2Šc^f/(0|4q: 8*jr00f5yEa2~*B@Iy-GrڎQ|aPKeK&x5 Biru#Ihßb昪VQMDڟ)'k Je&adً@dYNh;"ªӠ /)dk>-3ZD?|q'jdF[[h4zGsh %\_sDQ@q/U|@KXh5$<-%0wя\F܇ 4IoV &M)UQw -5iP!qHQ| #SoAg g+ڧy{0#[f90t0X ǂ$e5[PEdKcbvFI`!b v-KI|UG^U[Ts8˓ vZ1dvpF))@IѢgt|ENuK>Sn oydBik5p( R%Fu<8nM-2I0%%؃{&'"OߣϞ #8TM<%?mF/'^(Wٍ::yim;Q ϣB;>Js.;ۮHR5Ԡ`kUk }hehpJz ob )ɤD7S/>wT|!!N@ g nG6MWtMmڂ<76$/9KZP3i1Vwj*iXJ]UaV޿oq[!ߝ:+HჂj6ff^YI-Mt.~43(B/VNx}}D^$H&VЗkz,^>$H4h6p(̆C>I蠗4x`EJ)g5jX tu4_V[Kgt4/]0+t*nZ%Q^j~^WiH8,XZ7urImfj[5ӗ`ضCoSY<{^txmn!c7ټYosԲЇ\Q7*Al`Mq#[Q?YY36'#oU(*q(e85J%dR9BrLVC[~^SF+K{BV R/vĶT?1Cg7K45Đ0VҜ1^̉w%JlzK$>p׭!5qBɣ gV>-CHR FL+Ղr;uqY NT#͐-R)d:} ]}%Tzv>(.;\z=ſuNйeS qO54d5Ѻk(SQ}90mh P" 4 34GwH:A YwAol3؛FsM@к=K9M~@0v=1f!1r[/wٓٲ_%j\*ݰ56 DpcTj&Wh{d'/:0ˆZ:rJiD%mLSqh/f*uw5GvQ^LH=Ҵk&[i:ʟoޛOʚnPmΖ%3*ܜmIdR #㽆pk hc7& {0R5:c8kٺkc{g`d:g yVS1@%l m1j@Aȶ.Ҋ$LHx!u=tbe*LpvXzXlb o5I$\=J^Ko"MVڈP%˜K`kgʱЭD&f\8nnפR,lM9 vԢ?εy[#ԛбN:8h,T&n>I7|eP Kyo)+ US"8#QudZ{78'^V]mF B$O0mA+;َ*5:!)i|lWGhn7Z4}R8,SěC;9 Px+8RmO]Q-+J\획('̥%ڟT߼e!W9i0{tMxQ0Y8gdʶ 48DgJgM7{{lXu/Q#)l77[d?zˏ?JyMIiٌ 2L/TM6lS动acn'ń|^'e2 0q StzV"sc5&#,A\EMjpHh97I˄%5%N v"(ԯ+49ଗl&ztjW$p(k+ݶ\3#2w0u(x]S !)pV>]WzNatWB~3@͗_%( H`VY0Qy*yrVd`<5Xn|,lXH'%&A #(݅_W!aVJ/pȋaFpyG7,olR".Sxbn=[qy#[iNy^x }ETdŚf` g2ו lT'F2QP`qH<0s _M,UgWV5Wx9ƻRP>p.F$jb޴:v:"۹)ĎWE:Fv;$[ЌUϠIÅQ:⬆_0;8;?KV2l= y0WK"v?&<ߡGfɮH2t fPCV1VA-+߁/4 |Ig?~pzxgb{VczZ?b4毝)D= i _®VpȌnrfPZ}mW'۸^HU _*1ˇ(ѻ<#9?x晓йԓMinғ\Eo ;4RL!s6pv w{g*S`~N^&ǽ,ǓeL#v$nP P! N`V`6BWqIw*1#v∫ڵ#kߡ T|Բ$%jĒ3T8kg﫳7\Ȟ.<ae25MD@@f)8*dHQeO}|#" 1$/g`xYy$xCZkӁ"? ҃ d\ C]i*5F('A(Z]|B_C]ƹ5*rXCG !kH8HimF&1X ߺ Hsaɭ# i  ,̱Ӳ 송Q"dPf> m{zIhEd{FbBSYh_CN;'1F֍=-lFE:2h:#r̐uruG -c EUc6\ EA"PӨ'X4X2NY_iF&3҇,ȊO""I5)RеqCW-m§Gˮ Yen[Lʸ W[L6wX`Iƾɕ zOV׼ oz4lPeٽD \^drcʴ4Qӆo89o&#x a H LhEv]xXO|PgZwYٗ؞&]ЃYfPa>e_"H/_ MOx4Vܸ8OflE, Y02ci'ՒIT'w әKꊢsPsFTɢDj{trM*|:3w ɓO? Po_i}4{5~;Z<@8nPx7ަiƋJje g vBQJ& 8N|]N՟jXXVGHA1DžRL.}J#P=KzFl ɆsM xUGF9Xg5Qh7f!G9V+9:uGhޞGnJG8O  ޥQ BW":CbZ:/[b7W>TUkU7`-G}H ހlF>(&rdEDVlȬM\pHfJ]#& $]0"R@Iw5c4&q;h5@}7J6ЦBM\&w&-(^e-#BlVP5ڢl+i_yO8$L^p:xK1>R8I\|$x쪖`%#""60MGJQD&jm':5?|94P屼y;+DDV2\%,XSfw-)`_\[P<]hT\,`G2ygi-CnQ衠!Ԗ&H+0R Rwac{_,Dq7m\l{su+Gp#"D8p#G8"pD\7?͘peQ(M>?\?IKgܤp>`wW˝̦>0T/$TgDְzBܛ HLhēL~Kɒ`f969 n#+ڔꕛmU9k q00R3scB2"nHA?Q3*hOCiV1"[ _ׅZeVx;%:UV4hУ+<{>Q݁#Iy搯AG?]X$BӓD\/ܺ76P̏E97Okt͑Sm]R.7D`{Sgn*cuMw@[dR̡wgSF|f]"f`o(hQ?Ͼ>:'eF5%~](I'T wqkw$Y@NEM=jtQmP=U{[M/YʖxSYt&zmtrgv 7ysyC·.?W^摻W+cԄ W"1m]4<5 ~ 9vޕ>9Z)-[ E'@ONƼǔ[h)R,DQO69J<]A4B|V6'AT5/{1rn)׃qSzd!-&v*'6zoP*MDsK6:c8aR~MXR4̏ʀkI@3Ov4Mvm%DKp| o:bi&My?oт?%Pg a7g( .άq4v.6u;Y̗IS^* c7 T(_|l30 3l=hfj8qw%vtLÍqu Ҋxrۻ)M0F5c,'k؊G{6H6QVs I߭0(Չ` Q:N3FXt96 >mJNIqꯡѮ{gO;͆f59Qp|Ks˚Jrw ́]Cxn!QZٔGힾ'OaY2G옍ݍhi5!=c5ǩp6,l2;16#@Q l\}xqa T[]|dG\e_^kݏ7ž͍/ǀqؐwr)#1Xٕ8D'}nh_9221!Nk$7.Bi37[)(RR055NPn-WK{Wc[SamE|~›^;_:TDakIv#td^cQd\ jN#~ƊQaFhDcfr8].ef)&yWuSfclK[ӛӻ(6lL!D /eVM&LdUey~;]0gxF/Y CJ@r7gRy4'Mt6Glא#{9f~rHÿ^]~qQo`+&ޯ!qZ ,@->•c?y9#Adǹ/ ܇F_( <[PLkҺ/#0tA~\->fMo_qOy\ќVS,9gJD˦;HWo^p@is% HU0g..ck. b6;jό Qxae6B"lJ %Cd)*H8_P!=.QƮM7%.zB[&vkko+AW*E{γ gp/{g}og˄+Jrc161[G}s zi8w}h yzeje` ȯpi~_m8O^7 +47X? K A=Z(p?SUnaɓRch}GV)q%Y4G#*oeZ}GDɽ:vWPAnSEցXw: (VKy d_ڽ~.n혯PrJ|s&`T(}%5(F@1O_#"F7n5!D<K 0bGhJ^(@#_)al+tSU+l+MJ)_ ͖w" 'c7yƼtWgV8Q'TA= yXOP&0$/8cb{_=TFŢw=2Dr$[dg-xN.|mmɧBm_Mdi@%$I7UDzrͼޢ{`%LP@nՙ6xxjf,^8/' C/0r]K9Eh۷-6Uo|v\͘?BEJۯ_x\Ybǜ!0|,a "Op|qTnVFX$n8|W?1틷~39@XIgK `ΔHlG-V=Jaq#L)m3TP2oebYjY&$zr%9(Cdjh~%t.\8q7&  Ak( r/|StT_S*:@/ "d$0+s{F~?x'a~Qh}GP4288Oh3/3]EOslzjnUjV $Y6 f:U:]2i잪{=:ΥD  %zl&Ǜ5||9e?Z4)@2&вSD@]MQQTٙwf'lgD3zϤܡM%f7qlP*p\ں( ,esd?r~78u[;zQ_kF'{ϔFygD6Z\R&"mI9?Р=,@G2;O=PLKԎp\! pj WrԵ^4]i7̨sfJ؜~T>QS?Sq8JBkclEl E)l%z RF)|⬸ҼɯhRH?sFRd2&)9wOA+R:?G`99$FwP*8ܘMpP ~NB!)8>!7ҲS*4́/HPg4汿Lض[Uӌ/+¥/Kyi_E֌#[e_o„ARI9{RyZ<~ϡ F=*!114CY} I0‹(wIKZ]h59ޢe1;vPKGe. gnϴB=gveuɴȖrq,j@PCqeL׺jJATu,8H%)Gs=Ojv;"џA[Ģnʜeۢ?)z PYPH*Iŕi*%D.v4VP;LgLZdͱ b+Ɖ s*qiziVb*TZٙ?",\AFHhr%Tqp.o+سbqߊjV1#Y0ؐ־0ݹOh)vN8%__XժJ‚~\ϊ![Ǽ'|շ|SLzS}9 ڭ.Y5]<|kE}Ry\;rKT M75yq[?g P>//_ M IS08Y9%PBq*ԕ| r#}0Ѣ9J18Zik7]JT15,U;Uevǚ˽ɸPimi:&秾 ]*HRNTfZmkWR2{=>Vr \q0RR.iSJXBPF.rf^v }t&+[/ /KSQ! 騘\c1oaᔿK(KYĆࢨWz7SQHVү%_KpTSؕ'DTRPALG ľ_g-^,q*U]ŽJj2rc^ܥ o5OL/Jd* ~/빕L G xGNU%/B,LN{:֓,^%;p&c1`qrHMH" O0\H6{b,J >obG0:ZžZ;UE(`~QA[Y rQ~A8}ˣ"qyYHS)uE=,WwUdPVjǎ/9E]8~&<$6}{Җ\Iln.M'v:-ֱ I5{vu@:ןArg ^TS[2nR =D) "] ]`-Q'7υ&.ŁZj\L*ȴlP\mA-CwHYT}|f CCZq},A^eˆWa{u-O؝,mmY~-DJ|ultr}%{3qD\rG8ݙPؚd#Z}xm] R+zX:>kmeWՑUղX#{4̞i";漱Z?P_OF;F}1QO4 YHHT6"YfQ#ڍqh n Ki*"쳭NV/~|hk3 )8Wo>s}iGZtidzH0;O55_g/W=} $ʌ.Eha4x7hV?B(Rt#)^gL(Q߳DlڪP-VvߙJ :?z{s#/{S>r5څzCrcx5po.J Ϳ/%B[2U<3dڔc5<O׳ұmBfL4_`(YS9f"֤P>Sg%<,jf;Efyҕr:GmzZ*820)dZ櫜S"FRݤKV]6̶f~ M5o f5C>Sϼ`"_M2a!ZR42$`:|N&g&1χu!Yƭa3?yM\2c ."dQ~l^10!SVϤQEGFZ'#YK^#{Ql3Z.b=Gm?=f>Bt/' L`Qy~FHUI7fF[bءӫk;+i̇:+uZ2iUnP+zD9By%ʾ|/2OHO\C)!ׄzC8)?.`NZIl}H<72"L2/Qm<3=+"K$hL&<(YP7ѳ7c죗<e,r{d/t¶>Z%H-y=>("ᤈ:w*˞v:`ϜDw;c1@4h[+*WY+B^ui'1~5x[WǮ?# x]I0JBՒGa:_jVDQkö!u#3<{g$W34>֌ y95c5iu1N;M_Y:v N ӓΩKp#ΐ]k;eT"$jDCb}ÚFڛN!@/bl7:p8AcE\ȭgvǗ~k1wEE|e߶;rm6#B!؏J3FH*"x3`ύ`;>DYy<\h7'e~h{WN M,>pL^O{YH]ll\1󨽯Mz\c^~˫#ۈևZ zjUR$^+5>^0wCLp^YtI$/{%`6,NmxO/"Ds?s;ϬGz?\=񊺺Xnh/?BO؂ v~[c WzLps!Q Cټ7膔ѧrG)X+0=U c$ĕRϲ5lI}p ̍V%7Mؽ}?$0h¢yXhi!rZ<"o P=XTp<TÍd͓xUi\?ZY@h6n3a T) L(1u#\vv.oŧqLXf/\|5Zo|\d>xj'yb#Fj%Jw:RshԿ dA6_=*?Z$ptRI ݖK!$HYJpmopǻ0L+16f!Z]{/n8k5 ]376ep2ENL]@MëvkƸuaZk ( Byk6{ -nĔQ^f^eWf\kPۛeta_7"hlUt}zCM3E2C.Ij Vip=ѝz PDO{? S?}>IǶbE~2E} 3)é87H+{2]@D)lpP.u41]Kbi^įoJ+ū䃃Po84IϞ2M8oPDKurM,R`Ϣ77lѾjy&a"C-gDQ)$I8HC1!o݅8j?v5wfX 5qo*(~ԯrJúb!^s`99в>8B=P6v)^~iuǬK5kN*LHy ?Nz D" <r )"X_Nw=4 {Ƃy Rbi5(pj}q7Yq xgxt6o^.. Ű s#_?̳~aU16}TTI mkHfzrdLЎaMYY|*pdh1]T΃ doqi)khy=O4|mӟt&r9oW5֔3yytF~"Ř@DvA&ݮ37H\ɼN$/l#_ͷZ40K8?⭋V}%$'̅^ZjmUʲ/.Ms'on@y0$=DeB_v1}s?\"˼^j/: vD)][,FR!󾡨m7r#; ##5Eä|<%YxnK.zc U_6!#C ~E FӡˎtQeq>ʄ)WX𡶔?~6oZrzᵮnkjTAH&Gq #|dqMAYΨKxEI8<GuTH`pGG']~z ?7DŽ7P̏R = < GwH@4/ M[{jiGl͹$qnP1Vf }ܳZϡ&߯8ac_%2<0m>8ww g;/柴mw .?uRO%!B!3ՂGy!2ff!zrݨco ǝ|7NKWI6_rZu?p%IgL}L#>C0t<?Go}1s>"\%`9c3h;\[:N‚sREuS&̹[1R,w^W_UE4+FSz@/8] <l9#q0A,'fi]m:ȹ% CGv@ %:r&W jk,u E/ۊulדxp J,C8Lڻu@i@V˻Fms굖UT>_wH1R 3[":o*`\}j MFt"LĊȚUx⷗ }nmA'ˬ-.#IH^4!ײnψy{f>FecsthZ$XO5L#q9aoWy;zzFI8GeXjP ,.__XjT<h>bTg/ݽKuė4̧|9Xkҵ(H.ifR{;ݞ7^:x'K{ҭ DT2iH8<_gŻCI:j71;h~O eYe-mcGD  F3baNDs\=ǭ|; pt>ϲiV EL* K*h}aaL`b~`/ $u&/4PfBhl'qsKH ]6NZgV\g*~8CH2\:Li$ C/' T/1ɶz3"?OqkE0GE3LڵRpi;(N!s@'aܞ^|A44\_YӇ reX5?jaoq5h|^N- 9\sjJ2JrHz*`]yr'C֬ԍ$e ؋gU _D"$i7ʰЖ(/zwyB(P h!|9fpw8{\'y1Ҭ偟/zhFw CYfhYXP{Tq-φfG^K+`;f@l@x ӹe0lj9ze1|l {-)8@/zSF 3#`Z6V'$溝3/e×ղ-"8&2@c@! 4ٲ>3<-"ăJ#lfAjiPPi4~Hg.4s}_xn-Bdk: Hybj&G-yi& U 5Ğq"gHה0,G~QVw;ͪx'9h^_}'.r:'N|wz'}RD7>7ʹhm f]L{_ܟңRoKƴ!>8al歷fSzl欁f3vD)͈ծʛek <`P\m%bmBiX<C"1j_^CGU-XA/Y㓮⁺N8vo(icw !"Z#U׆&}6ggFݹ=?G,v|(T@ HFfۏ6/nD<JOq$0|ۇ9q1q!A[sogoxs}fl0,!'8)_y"+)9$#iW6B@M0uO,O'@u4|yw'Lًիw}{L:9:YδyHVE1j.Sv-m4K^\/Xv5@ijbHkB0]10WbOfjYkh6aBQo(tOgm3٧-tP216ݝCRrY%:%7J`(M-֠%W˪x/oBW$n GRON "Rzjr["AoNKkIV󥾘>TxVѾfXrkmPo@p9zE^BOkK^Cbhj{SI BTj`@rNf$9%PoSל{p\[m/6JK/WfT0Yx' % #v*zVp,p_F-h8@n[x(tMT9ôw,,cl-e3lDKy eH5Y׏E<5>?|Ds̡Ǩ[!M_ @mE˿Ζ* NSBM\GӮjh`\[lS pZtH.Kvެ&dӯ < rSN5b\ vUKeVe`,+n&I;Zy^Z%ޥRb5I56s&*FXD"9)"heMޅ8W({I"=Vl2zs96ĴuП)x>Cdx9(r)z-Rag ݙ{XM{'Rz8oG^zQ+\`L/Z<F~QƳב]s]cgo7d& k_N.&eJ.OO5.7.r&?];.z&?]~f?]A.C.&>]b3$ʳ9}~ZvvmlE7w@WW8O+]XNٮ|Ifh6nƢKVAq:ҋDg@UDkW (SVUҺ&Rv+!g璐0Pu.ϔFצh1 $n2f9L6kEҴrxI^K]!.oE7P(n˼Wo:+Zi>hmIJM!3[k(tccU~OE`'ݜ0y^N>ڞ![? FW=mU w zrkjg1h}zx~ʖH&3bXђaeU!6oH'B;ls/xWtab,Nob'D_gBQZca8f { ;Y! 7Wՙ8js^]UaIuA;NWUoc_|)謻؄[c^ ml+uZbgg{Z94a*h? A„4<*acb tcL”FsB#D=X0bB#}>Yq_x+Zo6qj㿉=oR!EO7,dP|\WO5`ڽH :STVѣAtuD{LįAZv,0ۦ f\70 a/GOu;⹩$vv0ۢ0t|$1A AU -fEa8"$2p #5^{^3>U=!=&ףIa7-{)E.>DĚl=ȧݩD\eN)|c .P%F46BQOd00Dj=t\α~/8ma hZp $˼}=?@|9uZg U1x 0U[Mѐ^U9<]r֧ڛB)_j|oudo3@](WS:/oQf"1Si鵼[t5ޫz٣񾲩^b,R]J%AvZ"!G|Z(4nϴЕCPP2OR3 D99iUc-е`>J>v#DsXG‹X.WaSI4TqU" jB'] 9KZYs؜X>ZO#P~1xp&7! aT9Dŭwrή h=P+#FBw#u.ފzF j^ӝ ZU9_ܳrN*Lq=P =Q.;77uɎo!rH)q>M9UŔ9篞:ז趵.4ksWM䣯8TzTݨ\`69NճPMxLw MD%k]Dʬ"A s]ց{{Gs{ !=b`q^7@Qٞ<ORL=ڼFNO[QVJ?'@ #O'@28,d k^]=I4PA Ҍi|Z b-n|[g81_ =`X1,6IҎcfm{"!;O&Lu^I%ӧ>.2hރ8g!z[zUidIzrIc]}Ȫ+Yh$ux_'sN0qcBBtҚ%("h>/ {Y78nJz l6]FF2@sT/uRDlYCikC2;LyT5 @^!n`v V+/ /E];1'Lk~jTjڪ8* gVg=Mn51c$zdzd+|U ؂uA3A&ڇ*I5 VbB|lCg} n~^srJȄMPlYh Ŕ y*S?!tp 2yp &I"ڵ5--](AЙOP1ڌL!Sma-lU[9؟{zGZTdT/;u `'vB~kϒ3閴m޳n Pzs/56_++_˪ A:iv`z= W@vFtk2?6,׿P&AwpR-7oVһ>q/)t*#D6Isgm ֨J7JqvtRK)Y>ZUH0IrkD1%!Kbx Β|Ax7M%2)19L!?̆w@[]u8R(v#QH~,UC?b NΝ (vݪ%pU? Mjh l:=ӿ $@ A T_ƒ-f<>)m,d@a5Xr)>˸|lMSaD* 5GmmDftSE+ۋx~ 2eM6(}zjI ʲAfZ7ۉ) B>ܢ;r]=x| nR)1-8/I.T/wl1R!<)4d6)bw9تd(jw5 (,@#iȠy^I0']_?v,7AYc}ڼVS) u^_yHr=x)v_Go'H*$6RlJgV*ɻ`ePxT~T6T *47NcJV0% a}e!]WxOQ2 D*4ơ+Y$!/Ui]VX+]{b c)N.x=W4hqE|Z!P*xj2gJNr)cG.ιfba w"H3!re#v43t)a]Vu]3cnDjCx=AW2T)Vϐ9Hq[(?Dǚȓ*͜kYxU&hpƹkF2cz i9m.̷B1#oÛ/sh>f(p1! Oy %ίLa`;g|LT~s_ /2{bR"Bfqs@Zݨ<Ѯ[C0t-`+y/2e'FFjY^kKtkf`="U~ULt>-a}o==C:W\'+v@Ha&4@^QH d'r"oAv1.0LKO{d]:THJ guDj5xs:h1|mot4IM H(pLJ(.ktePy'Xɿ;ޚmW~84R8eeV'W A6L]8}5q_[,t$; w*rxr])ZcmgŸ٩$w‚= q빙ċշc~ y|]A,F* g{+u\lWzx)m>219y"nDt[r:7aԿtJz] =K|*4uUНk Ko@~]g~4[tBn,W&:l%b_Lj|ed8o =I^= E3CL &~SRu׊Jx*mIO0cv'P3S Uubh4%ٽkR`Ayl -r^o(MfnƪKNW(T5g(lz lj) O 5|^5Un|xRP$ɯRb [%k+ v#Wt%/cD~'$2:@'OeijtM6bəz !r2v0%Ykɵ>ɋ ̤*`t(fI)O`:F 409{2s(3!~E&" ^퉄dAΘ)o|rPҨKĊ'D.<)wSB. "6ID'Sy$1APQHcRت~.nY4fbGAQ2rtHP0Ԕ܌4`hX\'HbrdeD3@3oe@Ҿ=LMjkeM~fKl--'mwkB0"3F*[_/{B{Fe[Q|7sGWrD?>6Et( !@o oC@\:nzI3U3P~v}rnI5snkꍌHH+Ivq`bڍ0 C`` |ZR4hҕW,:KQ!^TCf*B#c먭VMU~ȼ?;Na}Izٚ z 8XIvQwLK#JM#\&24zRc$c*b|%IZ#ǹ^Wҧ"F`Ή'U+vq}|jDRD:u7G'Xwn!28]wB&cW͓YMK7NJ9 ԤUJgk?TJmnVmc6i4|rD~Sb"TPWy9˴J̽N#pt ,DìzS>J 3ۑ@qi <`R˝%fRxuZ|oB TjˣE5Br23Q6x1A,aur.+v(˩Rʡ&.iU@;X\FIsH T, -zR[瘲Wl.oJ7G>)B梬ŹSb]*8\{ sv󾽅ʑp]>hS/ux lhBgέ/Bsw/?[;pΰXA @;b4Ymk vW Ńרl޿J9ji:l￀'/vK&4\UQEfP6 WD*ZЋ/yiit#s+M`BZQIVjl^«bX t!LIR4NQj`8 ^4AN_xbXսly 4dij-Wbi.ͯE6Hr4^dںF7S>bn3/: |iiEP^sr㔷VHIji2`ώ텳{uD%7ğ6LwAkE`5_?\bmR_cf M+g(uòzTîŸ 5DX JIT0KalKk²+AȑڡezyyڌNgt-܅ҿA $jR{K](,{_#ğ.Tl}:I17 @܄Y|!Ҧ?YRQȧ睲jL|hc%~"„4.t&7X62̰> V^i.]ƅwąDnɗb ШLlY)1R]Q#QUn  J3a^*WU7s»?#egOV47_L1Vl`(, `|Y fJwS^%aܥ>HV$A`.@o3Pxpe4+ָ`ݔtbʍ0 < š0WitOj(a:|9TJnuܵqeQqT]l3Z4k' *K`WXxq&AXB6n譗(+ Wr mϒ뤱q7G5׹SrŞ:B41qb2cڞP9 ='@/3Y$\r{{Ju?&ڳaWmX=p/.;N4~gT|EX;: PTjrbȩQn3VTqHk`ߪYӑW L:J\DD"˺Ar1#m˰n.t-U:Z\orc=c1kA;ʳtO/rg 2 3-rܻY"ζC$aYUzg<"5zu :zIR\F1zuk46\8>K~Vaޑ[GP~"bų($opR0=$=K8v@p1&Y1~_O9kˎ&7r ׎ Py@0q\Q?vb¸IIkLjte 3V1mg:1O7Us2|)5чWdÍwZX+)VE Rt7r Zǥ5y4m>(f.[3H3?q2ȰArxsEGN7¸tvu/}6P%Ԉ'O.%#h6hfRAc+*5=#PMK*>e\1%tD;&sN|u{S&#=)zN , 2&Т'׳1?+Ou$K?F-\ɫ-ᕣmndxUs ] oƌtzlJ*}v,p[21ٔd`Z%un;y&&c[_SFy.Գܨn֬m@llv bOKٵ]"[q=6eqApQfKKzamױ `9E\ bɒcH#b`'pO+/YQ:|'* 9hn<\l\f2GIU sȁ՗ `1 J"ܳ 9~2t*) =K77\Ғ^JRĆn(ܽI$̈́؃7% >v8B0nÆh6myѺ"S+. A6Uh8ԏE^7xd_;2F3i# *MamD?niz )* rB>biC' O  M܉~BPeuG ڿj iIt5 ɞQZ:^OB>'iǴ~oP)_z$eˆ lSmSpUAn -ғȥ*~=;ڹ#[wWkf}4" U ƿ2ǂLŘ09gQu ҽZIA8UFS qp[{ŵnq%Tͳ{wqSt뵜տ ,o>dNu]\V nRCe~*րz{^%A6TfaRe,E8#%4RS<=&X?Ү$Ex linihZ#aX#.8kD@^#"8#jСPK"\ʂιV8/SeBl^ȉh63gF9̮iٻu@+ٔW]wZCբ({ +!2nXwcS98G'Á5*.ǯsd(:6}Jy-`B^ 0YSkGV9XV4m.Amր:>Bçl8}!uJ6_z TQON]b`*j:h.!a7<Ԁd>n7ä ||W69C__t.'6.7qXD1K $%v1Nz鞀zi"_J6v,|lK# :ДsSnf #.d{LVq8p,٧2*'C E9xR#7|ň $*A[lNvdBE2LriSCqZ ;?Ř.qxMSƝaI7$c=` *c`H`U5(y*tc v@1*1 ۱!SK3iqƜX@w߽DEQ) $v q}PyJ;gؒv.w2S%6epɿE,Q92-b^Rj*=Z5iVgQȥP[yP| ×}ԍ`ܮFo娙/|O |C']ދޘؚ݃=ϣ#|Nl 6W "qM:ƚ"qй]pW @V2 c).gW8P6#/ ?!(4r A.9m:TF;  lێZҥF/V41C&dw@YE{IV3@\0ѕט&n'u*m.Z V.Kwv>hH׈dcb|!H_+eG+MDس.E:̳Y v͹ \t?Tq1:h2Tջ.-ku'}5FF"}+G0yI4S"^$K]c~!$-G.lAq;#m2VO,&[t ='6pr;z>-c9E"}5@c#o1;0_ᚽs' aG3WZ,|wy T ~ugIJYe x~#cAoO1M0 f;~kRV <r֚*PL4y<[!)<$`Z ]EOhu oQPzP9.&~ݦ+],)ALcME0I(>IYxdڀvL~XuRh8y R_« Wb' ycЁ`TkC3&t\YYaVL1'ZT4QD0AJ,I!& _TZRa@3b0Y]3tXl3{.|)׻.]< yǟCGun2aw>|0qn|jYQ lT2|fl>Cp6U? *^aeQUa nTr6aq"K+9pzsMK4 Z.eigUv0OlmJy!NW@]&QQhj}g|~Pp3DB9;g@ L%.^O9|& ^0 211 )3*T?I(S&lϯJ.~p ϕ|!0)(Jw~'9L>=wEj.њrY,."IV0t{#3U,B (oM({1.^Q> ;o B{.=OP{ENyOxֹ!Sdx4B@B,X30n =XŜo|6 T We^bRazIWHE k$Et'ׄ㏧BrO`2o\N WT-.H% #5oNOH*}C#eSjDW!8v[/wtCK!t[;aAx CA#!0H_?K Tav.UxEi5S=nj?eJc$2j?#ȍ]t+Py,+\_y9fU@ɩڀ{`U*ZmwNQĹ_hA|rM3h%y,n̮ ěiQ@s3¦TTHOǰ5ZJ3'7#vuW+uMكހ:&FkB3F 0N쐲 ,~|}&p ;%,fb!V˿n?# uj^G)ۀ1l?NzVGTW|4$靝* )mH$>  ֙^ sq0W3k/ґNk{2*!XU戫8Nr0U1:߇C_8Qx}*V b9#SIɯyMU4C{._ȅ@ BqXA\& [pY{Ya'eHL8f++0zPP&ġQ2@Aۻ??aEНpG?S|C (qI{%KCv7k;&l7jH|OWY:&/sJɸP(&Zoy$ň'/Z%S9M$ĴA^D?ؔK(<>.ArXj[J8|e38_sC;34D*_XKoXq} <5E;>veZF= >sbZZRBqkdmiIo+JOZ{5h8Xq~(mlԄ߅_b\]Ȝ$KvqSpJA2ːQVCQ֗͞Z 7!Ɨ wok}&d-o5Hbh ?GѮW8dYڰɍ:JEeJm%1k˶ 5\]s6o'jk]9Q_M&X ]3(,G%D˂&MG=p?sH0Fhy [t;u*=B/1xh+.E@% n`O ^,x|\s@Y0`9E+>OY>wG/I&ct5`sSsI6jdi3\Tp4CmDVIH3u*53J (xsz'"t1D+{ƘG˜`C.M^(PWnf΀}-5"+p.e'|6w: oYS{jhu; MYwңUgn)lvu*K4W`J%k">eGL fך-H[CxX/[<:A^wH1!!'V˹@+2"9đP1x/Enrf;5g87%*J`D%f͟PҦn/*ڔb {u>B,1Ō78|z/dmqG"v![DRk^T; l y~tdԣA<yh֟YB60qM}Ln4Dp33P3EP=DR"(Cl˶r0M6Oۃ[orco"+027mI;2 (~f()IQikAhV1>ж)TFzh[jJ#L_=S:EL03$E4`wvwml-f,ݶHQoscxl9B20$`$$?BMjJQ.B* Kgcj iLSe%IZRJpU̠\\V;,HRgo<{9&D+B'IK]=W-W`HJ+R)/R8aˀGZQ~7覅`7RH>RbEf\tJ0_Sq?[{5ys 5'SD@jq[^)0@:5LiW_FMx,(LVrY->3^CE#ob۸je]NYW0.•;Sd -mVe^Wa.6P% eK]e@)D"pk1Gs\NS7*dPoY-jpX54Fd L/ҷ,O5B:Cԉ<,~w Yp;ޭ`g[y͆(7Z~SUOU҅<£HTaONCH]eL葉!KNfp nn s61,P)P4XwElQK3oXOmÄlD8l?᪩?we"{(Ft0!"*o?3p#ih*-DQpCbH@(EDfgҕĿA>/Pru?o,{J͟?+ԛ-bc.`rߠ ?*&z(P'P--hPufRV$ij1Ud jƆ0 %fXKX3 FLS21 ɀߑ:C(z(ŝr1qG2t͖#(j:w9iY3b魰]KocJ1 \ZnYy "WXBuխCH> K{g%ϮH/xA(:(͐BXO~yX@XZ=S=#2(RC$[*:8kA:G) Rrȷy뮨xgl2T}%_1 yvB7b&_8vzAȢjj35>2 n _뺾{i(e.TDI я)3k7R?B@)؂`ʍ̨Ͳ"uj@ߨ4 ІICJ\U&7=5$Ҟ;2[<(6yjKqFжdWOEܚ45[ p ]V "4uۥ{DaIKOwƐͪBǞx~,Y%X,7x#ЎW֌"#=rRe,!vUV<`ЧضnysCM#$ }1_d[!]<n}K@\ .vodD4PpΚ>ܬbAŭkq_e Wn 7_z[ :E`uޙ|]]*+LJ$q"5 0aDj5pAbH3[| HtpBА~TWCkჄ&7o'p^PV Z(&qm.55P* 0KF'ߎé6 dgVTa2KƮkL89|;oۭdCIy*,nZ\B ͯ{g0 nU$Ds%Ezd!eg@5O6y[Aٽ)TGZ:Q3/4?6<]\PJxC{|5ֆ;~gyeki{_kDż'w pZzt㇂p5ن֤-X0W;2zW__^9P '}{ sەހ@P'6d#\!\D %(`v,8ku`D ð01 Lh1֝6ʏ0xϷeܩ6 ڼL .{潺Q+(&N7^ vCರ)IS,Ko(6K0FGZ5֍WJѡ:<ql+Kl $$6 T.iQ] D(T|o'~?j;dBg[vXSMpQ镽lvÌƦkhh0˂ąsܴ̰KK]68V8 'E1JڱĠ/v{!E:iʠ`6W .T`/e.d G1*a ɰԡξD`>x5/s139tA|壹61r`irYGd<͸R9ylHõ|w7%깞aԙzpsȷ<(ܫrg0as屫P ;aJ ! rCa}ipyRJ< 42L;V^oR5-"i1ު'UȔ9cy{,tdi7~1-mqӓ.'A6% mvhNHh4A{- 'Y2-zEP8[݆! WW=~8CرN!ym~~2$5wިCƗcGmѠt?g"6W!ir`!=rk;~pѳk!*tXP7-[Nbtv8ÿ{N"(#5$9j Ȼ.U] Dؑ;(?]{'4ۻ#浥Fk`6caojV7:=ni?&cD)?JjpzniKBiA\iuRlni`bzֆ(x 4i9;Pl$M0tʉoB3OŐ3C~BB\]&-4HV5cv%θt0.ea]qxDXX]Rl+v8b9osPgUI޿\{ș{0gt0OT/oеlhi)nB_`:̮/ s qd;I*!E2)Z^k܈m0N |7RI!Li $.*nf˸D />xde'YWKqO "P9q" d5 4m2#nDsx9KVTIBCwag)ݵ*m<5 vJ c<֌aNe/<\ԇCv2!ʾiaPXU"\W-?SG@ƜCs2uD>(/jO2l~ Hh˻BEf(*5WĪ* RE3{ua;P8Rʫw @b+K>͵LQ cH?" 7hlo6 W#4^32"q>H"|DBuzŰļe@]^׹,>rJ$GH֫\STjS7Sq_#f1.L%ߐ帱'ܲ>p+ J-3 =~|(尬Z/Of`[૳e yc9K]`||+R!Iy ܔb s-qNeӾx>$~+̑H젊%ySiYn^uA[udm &1#f?R]"@TY`}ੋ#=/MDD)B|XP}piUWt\n/"9{u]n+Jr ˍ?hw.K%|6ɓbi<k1σf49b=Ƨ^ݲy~#&Kg`{>jr{f$kxJ1 cB+m4/ l5Jp g!cbѰ0@Fh7iHyG.XܺQ݉.!vB߾y!&Ok{>%?dC*ua+djqsLQ8!pRҋYgi.z 6=Zݶ'"p<*8zSv<|ŐP&s'o1/`!ӢƔH\BT]?6G֥~'Dy$&vGoKjI}@nb'T4/0e2`L<7l¨ g18naJEeBFe=6W)ޙRO&ٴ=x@Jm=9GM$sX-ii+ܜ~*,MVxqg!S|mֵ02ivB:j37^ғHXI̤TxJɪx#i\ڄc̋Cr8[\q,pPv |;3q&+*9B~,u5ю~Z;}~Pa PQ#jf.%.Jp ε6b(E2 VfxD͙<ѵn?Qɭ`S;Ya[csU(< m2b \'Hj /E d(FH(}ƽ C5~0F$e6`nyKuDM-Mٷґa JT)G!b@3(h\Ggv`ީD5=EoZ2g:V+ *~v(nvqX)-wm@h2$5LE,(z=Gg\6)%}Vђbw9%!2ъc2Niw< D)"Xt@OGD+R81Y]uO,(D;֭,4ݢvH/{ce,I؛xgiW#ozF"(XƙvuŦ93gznqar` 'N@I͝.?vr`h#Rȇ ܈F)+%V|\{c&ҡvHN (W>w7Ye|qfs_nsWa} FkXc%*tZ`2o?e=Si=u;q%g2>BHCXɁDpnytCBvp9_2i7Yר 'bP)-P3A/= }U3?_"NPs v -fu^q=+WZ_{ze-{~k?C}ph` wWLvⰞŏP.gl` 75QT赓K4FAc1oKmxyEapZ\a~/F7wDƣtN G_er2gnLW@Kxӎi%ascAqLjY3:0WEǗƫS?O^nbuN3Bǯ6hok5J l qw5fK<ʗ]Q[(?˅ryOO.O:`ج+)(BJ|Z2%XL&EYOu],?e(`~lˈ/LLQ>z'FBbd9];j]Xh0+:x?!O*"ұ7IX$01V˲xT>na{n}NXΥ &o 3+BJ[vmy AgyIX@7xHH2UW҅ cGA*hXV#5BuʟZg[J"WaߕH(vΨ-_$hM'ְf`1exlqU8r斷Bƭ`αHR](jg05e3āwl$?8Q&c>sڙI3@3AKh1SPЎ3# Rco8OH@GoM1/ά3X12 G :Cpѣ2 3 C# ! xtxRA!e\o/IP4^U[(L4CB]Dcψ'RQiFt }&@dEwqduHr(oWXpo#n(U=)'SM|QjpB=*sA}ط+ jNhqQW ;g._I?潓( .Vt Y!;S%)x#a1WۨX|J Zk&9_#@dĢ>~2F "A3 @CfVnaĈ4jJ`UVõVZHP;E3s7DXRfRDuAz-sE^$|.coE]:у: `|9v }ФǣOy_qº2|<\ q?#[ӽmolb.~e<.7:0仕0X l T_{7{ZܑsVj.l1_*fkmLJqzbtdOO do턗YQ`'ɣ 9T8 ;I`z ) O?>ZT"Z2|1_yx4D@#oeRUƪ k׊ro=H]Mp[ts4=FHd33]&Rg.1o@yF {6iE?obPt>Tbz~Tzɀ}=@hfj ޽{nsm^^rɶ'\AQɱ[j8 bD_~90)T1%G H:{ d#y$9' ˘A34tazR24s"+>z>*5 *Q!\@Tx5A7P}P+3W2+3 {jڀ`릔:\ &hJxKfbYD .YgVhpRGt  E|UD=f* 0Ce1,fKȨ=F}_B+(* LSx}=A;)SK)?k81랙$T)&kV*yT>e,HG0l 4H+Mi$;4 oECRobɟ'$|k'vIv xMghtOd9 H B11nEXΪhp:tdWػ70>+)q]Fkn+ZW 7=ltH}fFjfLXg2&7::Ġ|ڨ7oIe~>۔Y Tp]Q;Y+fA/UQcroeMVZ>F|rH( X6oڟ :WYə2 |vƦAUH UO.!ԙtc[.)44Yj|ZA%R""z̈tTӀ6(qz 0$L3@F qX47wgqPW9RQj)7}&'f6HzWJ7n( @?!ru 7R7iGc?Q5DD|nZ=1A4 -Oِ F:"Mo99`Lhesͣ Z9Ъ珎˛]..PFL\يt wG|;i@'X<ĒDLy@"ԑ!0 lU~,@Frd# ϺJ\ WVP:/\'% +9=pG]E3M4TRvXMw٧.r ӻ>jw7&; wnzs)ẕ>=. 3^cAA񻨧׊nXim 7'{{`r1̴$SnwT'MX/XK&ߝ08 t3@=B.bMΓqX 5'/\س@_ EtDVo{Umhh4*S=[s5A ` 0<~9F@dZ6\Zr4yBkBVǷі)i*6$vzO  P! iA&T*$) JAX u@?K%4M7M8D[ƥ6j鄑]S_R0KN|㬀C!(p13hpC)O%R G]^'6 VWnלObŪUX2kFhz qg]-2M#`2: !X^U}H`8m㬜n"V 2ņ0Husw@nK1%b],Pbe؆M1*6җ{edݘ5CۙVoMʩb^ۂ}[5Zkj4oSgnI6>)UW2 EI5Sgv}i ^u&QS s-}t Oؘ>=camEN x{CV;"ioiO֚ֈ3Wsi+c g:E;|Ӌ#hʗ0nqRU#{UlH }Z RYVa#MdK4m n ~\<g`-JsIRŖ}/{IT~iw4-3'HQEA2oM[`ݒ:Ř?f"nM䋛MD4ˍٛQ״,6 i:{|nk`2I˔&CiύGVX2.Vdyƾ!Wp6# +Eg@$h-[e!v\2jCnTNsEk]/?—}Nw :7.f1|dGTCɉ\(hC 9ɛ(ooҮ?{:ͻڲĭwӪl~Br|hpzK0 ^s'fLR(X:@4s~dG|e\T~oY.-fCwo-l&6Q|;KZ+& k$=}`"ӵXyzr^V=D)Q{"h`GZxp>rpvQʅa1R7G}F?Nc:m-cIgtXÝdMcDζb CG۹Xġjr˜퍮QYco*$ZY0#Ʊ3vz?l+yᝇl0Z.&WЭ$rjj܎<:۫K ,*RN@J%SkJqvtz۴D:Gn˳۝b4_WE}1GI0FGcqllnХ3x{K:06 (b~Qh%`u2AR0JCD-XYH;o W$L `,6-C ;{di"pޜtf1wfW-SV;:*۽)-|>X$1M/Oظ?6$2P;r=yn3- -*۰XJrcqc IWrWÒ]do%q I0"|e45q}cj^O_u{v<]s B ͩv,Y{hVV)%2gW(B|7'V,y[3m Y2(Vq +5۳=-?/@MJ2R8YI[c~WLpwtw43HUճBˢɑ})5+P2h.O_F9Xמ=}8O-<ޏv}p7nnG0I.;p4íMrƗ] Iy{ 38 g5Dt-Κ [Rڭv~Nl~nVgr&@5loQC@U,iϋ ƣ5AZ]b6J~`43PFgSӟw#m J2@tzGLp!~@4G u{exdҹԖYݻ8|L "30z^vNIo!,1'@Nb8_S&09.ᄊݿ^mdC+`jHwbJa};YE,zK?{G`#BڝԃϷvβA;~u=s8SJ#Y3Ex$0 6?蔃\:":[]rZ̍&GǠB]9ҵ ,۸P r骍"aA3 KpG.L]З vCaeIx) niW17v蟮7"! +zu}M<12'o]4ʂ[}(eYwxK9C>Wţ:BCQ1_j[>I(nh'淋Z˶H[B: 4ˬ?u1&]|>[y̙d4?M^mJf %X$Z滽^'q:ּP߈Ii]lSaΦMs-1+>z66JDjO@lA۱jԶBBiFwuV)2=b9'ڑ/G<ɸHnݫn"'z-x揋6Ck^^ߺ-dŢeL-gEOʰZ =hUlۃZYK[AJ rlUj2K+?"Do8VMXgje,&(ʡkS~d0Bɔ,[jv DUoQy`>wp:g[z-|ϯOdk,9 =R@^)={50&wn#4&f.TCh!|Z=ݯkap31;%v4qnw&2i7$OHMuUM4%4i=θ{Ǖ[ 0sI7"i,;Ms'F[ | 2p6A^-W6lNi8$+hZ!&js規_Xl?낣e\^oǖX:t2S՟ހ ?5}ؾ/96CX#,¯6_sU6#2oneI|rhZܷ~OFYF JdgV ŵNHki|R0tK7Ay|W,K%*uYr@>Y۲0Z3Udk'$s|aՇu!3v G*t*-sQ#Eᐐ^uhU]V6)|ӿ,YW4>wH>>? 3C374{A7*|[w!PtC6dl:iTd̺usI+7$=ioy ) nO#o}y>W&^ԡ$x G"붟H~B޳BH?QZ[en9pv%4V{G~ WW5r'N:r\˜WgS8GDž rxCYi iWz\7HM Wom[, _^jͱD}uZ3(l%~)zDUMZf+Q=DZ!PP++ޥL$YqVfbI!Oڽ^8դ4z,19nPءLX˒?<#O KZ;PA<+W]=ʪ5.P!v[\xO/,_Оy 'oIWbye$2,e֤kF/΢E98F^hU 5(5ڄ.O' T|,}Ε29AQxbUÏj0_qןX|%3q<շRclC~ =0tGjBJ]oVC@~/8Ay L(}91{mbxAFq%@͌m"O1+a- !]ٴ"FBZx?9Pt^KiTRTHsLf0J2Zbt>;oHI?+eOqmrz6E"r. jη)4OAoQ%tN;mO@%+Iq>*f#3< rig 4;khD z4RΟ'I #oH)9aL;K[;QƷ*lNT{C9]J̠VE=)pRy{n`̼٫|qyk\M+^氌WÂӋA*e#!*jGqzqH=C|K<_q]}~WIc@c5j0\NF(r X-+T>| Y;WHuWquig̕t'tLjO ^̂ȢI~' b{A%Ã,eK#WTLN[ǺuzFGzmDQPM<ĀДCDbLMv$\,D*^UD}ae9k~~~'W&'A':J ( {-^LFO'CfBAv-gA; , c,l9aLf+ͬ8N=*j,;G쯿c0֠d]NWT B9 8}ykzQc۶ەv^φ]}PZ].-{a]BԮ[u1p\5!MS |#>q;ۮ*=$qb#Ŋ(*|Y.uWq |VoF#_l+k\%_| ;9pg4Q {[% .K6k:f.)jm6=lGOE7W< Dma)ľmD/0L\# p']p~0+ZTv >1=xQeO#|_J{isS kʻW&3# F"\9?Tj)\Ņ$._|U:K-{*22y}v#iLW޾;_UQc1kf{NW*aX^[T)ɼ;4 )fyWJ_20 w iE#o%iY%D,'?>=%k<8w7Yk uD* 'HZĩď !VT 1XGꐮbLGL1җ6XW6O#L$⤭<tgGGh[&D׵b^<8պhȠ-Ae{&]$Lu^EL_7cSHCп@^\yًA, H20@_]QjNJDkʄ'7/jxeE/f-=EskF,0In溊 gٰn} z*뭳OUB2Rrhpfmh25F2"|I%vz9C2qP8 z"ckmb`;4}`U ;zfR=~yjs&SKKԾv= )Px%{JkHbߊ3vlP/B;.3fJj)|nWM$o>14 !&LbO e'+=Fb@qv qk+gg#}^GmOR?z\ /R:GyEfDJ3ri.ZlrB$,gW ~c^p"wXhsծpWa~|8;} Ėީ\wW'uز3g+ 9H{aJpShsE@>ჇK#j%mY'fKՏ`KO2JSg֯G7`:b=vj^FveR^V*lgF*C/hUm wDz<~/9𼊺צ|Z^0$N`X6ӛd#7SoP)K<.^m5vucP%F2`=qA ^S#̓ 16?@- g=8tSa/ W-ݾHB9~^7dgcYalF_5=xcylBR t!A{P y7:<iX%q`^jOxh<{wDV׉M*O,EaIbt++>R|x*;e]1xD={hF^e#FiԌt$c+na75w9NabǦ 9CtDO ^)%mO0po&H'D%yo0ޥ_ye.w%&jk}B>~rgcd¯Bm^]Ф/ չh ߹k2h wuR5NjbCpV&UL xoW?p}8zL$@}w_WC[r?6\}4!t1lɝv>g[ڗ^2X??] P:m@ ،}E_q; %g=2"Dd vKІO_PazaxSYX=CD@#oeZU[JPCmn,$XEa$ҝ3ߤ`D ';ܰ8?/ltrLK дhS>{ )T Mb 6CJP 6 W `T6Kh&3ff{ͷf.[2[c;\0HQ2"()SRIDs ypA yAP:W|h[V¯"0t 1(KmПjTq4*|nv9IC*pS|ʼMeo45I6@)An'+3p],d;B%r `Å-g:UplNѪum 8#m*R>on;T3*LWUo:FNd۰M˹_Ƒ+"Òw[`y tbUM`JsуfskKM5mW};\ɴu]ܣ b3 [$IvFx@f!aO9.G':  L9<)qNRIqm$w Ǎ;M|JKoRfmSbZ(v=pTiެ.)z= #4uLLjK<ڿl$^h&S4͗eYt `jg.ϗGP]psx5tkďoy:\!A@VmπAڗTNz%yJ> VÐjocwHan7ޡW;C9\Yټ \2wx6|j X L7R;;b2-*}#2gW!I( x;@N8>p2OCY0Zڔ_9j}*YE?jz\PJM:G~{}/ZKY~-7SS Tm>yOfC9j3}*B 9[&VvhХ Y.;5GCɞHw5P8ֱ?E*!]D@V䇣EX"De!zJ5f,RdKN2FVFުj*:~2+*\[V/RJTr0Vn*X̴%^(X:ò}OVÛC{b e$'J|#09sS4t򝊷#(7z89':vH{MQUgu&Ek n#p>N:z<u(GY.7'FVnM,XJ{5͉ٳ; 6m69",UUCL~d6*ߺ7n&oW ܵ;35 jԽ3UCcPp1$,Ð{5\uwMTG] 6pU`q|*Xޚ&[ɢhK v7n6՚g0J>yX:#nq܈F?}xb],Ms d#"^GDn`wqȱQP; 5fX5s8ڶn"TW1LyaKMP7]iyiaa15lzt (-KV/\?ȹב#[7AT rMЌmuHuuS}ta nay޳{K^FNR㼰 vwrYeՖjqV|:l;Z&;.C՗LS "ղPxsrj[=vC6kn0Ȼ z(J<I{p:>ܞn|BGς%ΕYJi3W,p=DJsj{CMg~8c1E9D R&^%/Hғ?rꃢ9+c0zу.~@wXH[K:v*sM{52{21ů8]Wt%n:r}SqEns\]~}Wyk:9>rySǺw*KyEs缝0rnn$p(Mh H7޵s>U`xPd?|40Hxή Aߨd4/tvz~*[]b`sj ޽AXOAz%%s El.ѰsZdˀm$lx/T f[q? dεҩ;|A}>ˇ*PePNVm zJv$Nru*C'i'ciMBʇ@)>"(.>x}i!Ҏ ]r'hɺ~RkWqHvsA!X*u%AJ@y5n`ػʆ?y'UL /vL䑪km0 E97P-?2rU1DVoHDrWe[r_N*Q&&lhf-n?l,LB`!/#WlʫΎeyW >sLo\UG0lh]P)?;si@1OX%Jl}җc kfDhxɊ-\; Wx}z"4Z9W&R㿇Æh S_H'U-jN}S qTݚƦq~ kdȵrS7SMJ=r Jl i!8XX:-%gSϩrVRD=!^[{N# 74_ZS5Ψ,GQ(@&хiHPP|m&Q/Vӷl<)st#&'ךd8rHcr2d(:go9e26&LKl"`[c2ג њ6W'̺ w퓭z &Oo .H5NƘ/!tYO1)ډمluQvtr)3ƤkuFY6z|+R&NJT~cz?b3::/39yK5&mA$iA[upo L'vmg{*Zb}N{Q%._|e3!x*B3҄ǶجeM1q E H~I\<Ya}gq `UwWEvM;Me$4&ԽA:yY+}edGa վH1oA7\p묯QPPR{;ɄvtDT:XCi }zPd+(,w-\Pz`Ekx9eȩ:@ 3sĽLWDB|M- j,Qps4։<ZkVB4aq.N\umGz2Ob3{Z3]d[̜-Y߽p9zK #(r.rq'-$Yi+pT ލ3'τ`}LPLW,譕޼/|+eX3i`_AfI.%{TDvd f7ȝ̖2$#{96۫24o F z%ƣbD~!!5D T6۴Ἀ-Twk:?Z~r7e.@lKU1U2{i|f,m'O?T ]o(TߕYT 4I*l]Ġ7%r'}`w% Ɔγ5@6ؔ_gT#5RZf2G6Ih3#*l?frf]:%~gy}0/%ntq # /eY1qӊ`ᶽ<{+C jf RFR%JqNV[ө}ӿV}c8NLȏ.؜ѪLܣE]c.-OcYCF O;2nԊXU*X U Qaեdr)#cVAvn;eRL*vFriu?9D> y@(v"SW‹ݩ, FNR{A)b @qI{kqra`KՍEϸ[5 @63UQ.K^_) G0~bܧ\>s5*V1\YUz" vUG-_+ z3&?ߨ"{Rs:c'd 8N5p_g (D3YCE]A I%+APѽˣkwEA7{d G~5GL+EAGY.c%m|vhv3RG턐  gzS@OGDv,{'NɌKQFN` ):M>z9`&5 8%zju_b͚3z>2T ǥ\ 菤ծ$L& b㊕ovrzN0!*P@j|co%"Z}u|&v``xӕ⬧ }YґMsWҌT(s7Ҡ䮥fpyJr XD1,S7;3k?#rINSdϓ=I@/O%\ Mjm9[N3.biު5 uHnlS ,m*0a֬p-/iVLlg"X2sPXvtMI7Ua(GP mcȤ$39{(bMMMT&I guXeuLQze!Rbg=TKดÒG^%Ln6qj1M1]j5w۴Yv%GΘQsE"q @ΚU#5HЛEm u&kw;Kli?.RQ嘫KGfq%7k[w_Iy/ڵZLSsͣ乡 9x"xc" Es|NLT$*" J1e)s9 k <|:w(LDFq59͋a=?Θ2 K+חbi[/C>ĚhUq&<: 6~ H=KTI 򌤭qtPo90уT0jx Kz}&?d>%p6 I_-j T;T cCLj_y8|!Uժ9**[mpLP-DӠht:7{Y٠9KswYŞE)5i׻S:ʏ .R9]`u=w{TgܢՐ(Z͚aKuЃg׎u^3.90035bm q'Fm5 #}ʻ:,ӄ޶+Ba 3WNgGu%' 峥}AZP>'0Խ z!x\9H\ (G佋P,".@V~xDټdi[D3SKH/8 Z/'"#,@ʺ%ŇY^y@l{A@: ~@<lrWYD熋P(N-EX8qBrianܘwU)ޜE@p:T6nYcSa1UE ^bo0"=ubo~Y"^/Ʈn}0 %dhV F;WmaAu4\)Ac %䲝Yzۏl^,@TxMLy)R$d:x}Wnɿqy6?G{o *igv k~W6vp+gq`{T;JFp/*l,ZWjc S7>M@OD̃տ?k:Tb?c5jKé* =ЎUkǐ.BY+ 'SU:z?Jp+-t`';\l&Ub9]cM;|cnFlÇi' TJn )19,PNJbE6<>h jje/ Ǭ?SzDzY=$jc{f@n/BV GoQޱ@}➏3{?I(o8 W2UD{P Uu{+u d]nGp<ݿe[./NΦ^ [)xf.1:L2/0tYg$3Շ4)j{lu`?2WpmڰҒI铧GŔʒXϊE٦:m1Jif}[#nN=%ߜIQZX@?'6դ$_H\dB73!CaUo]T/M'eBuA^OXS[tݳ`CEm ܬ_dbfa4B!6gD#9ڬ x?ܕl(ׅP* ԎQitSNyщ7{%`U_a( 8w^}So$z(im32;EѸKugb֏ޘ6s e/Uaj{ (]'K_ J sV ,˰o*S@O9oE1Jj {]'AF^["bVÚegW4}0Vo}F+"sBt`D+5Bfj *lPt, BAxvx1LλЂ6 +.{y[(UTQ︑2bڎyh/J[^BJ̃o4v֏זك󩋰nkN}-13P5i- MJP:-ryCj kHF1eqM3<CUm Z~*,#79ؾПo)P"Lx{/DgޱB6?4qs[Du9eThE.FT-;rvT&{k BuFL*% +p_o TCdGbtM$  {tgБ;qaHW( ]F*!D]><2k]6.y >~qW= &E"WB9R }FV{mpMB۩~ SnAgҴ)Tm\t /NFG oڴ %a. 8Urla⃰%q#I%xSۻ۹%YK{Ӵ8fEwk6"j(ds:H522s px)(E5{RJI"zT"Mn1zj"˧X5?=E9-OO2멪t:T"}Os{W +%1jS^ {J2{ļKU~:_x d^Kf-CD@2U*ګcVvqH IkW݅v:I;jU0:E"CF܋Ofvfz3C3DH߻7At-U{;GFmOi-r:GCD zh:U`mϓ$$hfnv6ݶ%lc*dIa0%Hy W@HPoj9:@/:O+9$WDb r r531LuR3ߘ{YD 3BlO2F)D2%0g;nA5yAd1hǐrt GB uq>l(ʜA i!DM!9f?ȐʟsBQg)H5$f ڎ¢,5r-#HJ MΦ) !XVTV*34 &|_4F&s(j#MZCeLTٝi$Z:g35,qh`t.鲡Dˢ̩UQqb9qt=܄jP=m#%k8 Gu0ER贑:F+.xM4O6[i+#ƌG Gjӊ‘_a/9Q V$щh# |ζMyUFd^]Kh&p6oxKL|(*u*QRm&BU@M(pҠ [jVFnXi%iDv+UzRi*:p)jik#><]~vb~_]x_g| ש?g{~+뿴5dH s7,ϲ);o^7z ?0q{3EEX|>j\%AhFj ]酡J?uĻ#jf3udfbzX%r 䣚MA޿).xi PTE6/ULs? PZⶩFoEL+%?cvF֢BP|Ө sCBQϏ4X;>x 8eO@J[B۩)B#^gv 0T+%yB(ҫZ JR,9(JAa2B_JrMp^GF}q' v7λ$MrW: `@U[Q@8{Lsu2c&I?儵̒ʯTTOc 'Q +vП)`}b}*Ԟ۫rvi&BdZM*H@8/ĊP&u),VT業;0p%uR6|$LaF0#6\?nV3L4fN9+vR3+՜'/,*? ßJ\7\&6\Y)3uqJ&'JTS{ШޠI  ӻ* ]҄%QShbD0tnݡ2屯:wZŽL2iy}omql3oq|+r Rˏũfğ (M$l1dik#jdِ4Št+*p7~X@r5ЁRX_͉XvFl$BpMILǪpl}->R͵REDL*ЂS5'"Cx"g4}m}2!e*3zT}RĴU3>]aO!Me62՚{vD?sVУ"q&$.d6;kPkT $g$#CvS ̈́$KalbZ5Q~&xvPcAIEDՇ'¹fT$H"EIDD¹(B=wQ+7iʑ @Uqt/)JD|B%^m Z yP:hO0 iZH(zX-O)O"s]OBt=]Ѯ.)K?ZX~$.TZ® b t-驣63XgmgQaw+QeX OJQU\$vqFj᫕sBw?W>M\xG;HI0eeHCFnℝ|mWxu>#h?}\Fǝ†{;@adZ"&̫ Z~鱣9]),ڳ䅗-pMAnS WnNM^7{׿I6,GB:j7,= :㎑S{%V-L-_&VY;)iT[2TZ#DO hqt_;ŕdT7"qUDnƕ9?%Jj9ʼ1D<>gf0˻r W1*7c *03zKAf9U\\6/ ]cm* # _[nL\?cW^֢%.BkxqcNRC\? Aء}bFɿ])wާ+׽㛵}ys*RB(۸$}p-= mBzT-s~,4nl};^ ךEMs.?=1N"];|6{^Zo4w̡ϧ[QZ&  Tp5yp [U,]-3%1tNJ](7Y~%Pq`.ޖ+]7OEd3kE6|dszoV&z3 4HZh2.]"tg9/͹"&eKL#/dֽ8i{) X /d»8y1I: e~dxvELgabX8?@Uw*ZxMdȦut RSa9e]yK~Im`T}%D'zpVQ9u8XT]# | bfWBJ"NKUV| a̔ѺhT;b`az!?Q:.1FΘdrX׎_k]HeIelbcT32Un\alg˅(V/`lyb VUw1dJnn{yY"gbZs;.e5 8zA'xqNޙaJ(r&dԇoevY mƂeD>e9$N!ƖZ"[)Y@;­u|^w9eSG; mB>|*N="w* pu@Do}⧳P9`Oy D)Ih[sqoq Y Mn$D5?c}:4kpuk0:ŏZ"V,4w8@#]gPdf=M@lq]QATk ;2{ջkn'xz[ϻcyW;AƝk J7pUQ\@uX||͟?1JX{o>4HY34@KHϝ`'kJtc/ Ԍ2pXJ [@xMI(e^LrV\LXY_Z}  Pn 82Ҟz=t -NCŽYR)jJުXuJx-=,9;:^ōpCϸrnm)e?d5R5-UXJ-ѭz`][mam&_]4g %DO;bG2lsծR9{ͯPP\ L6Gf7~ʽŁ=u) NsugR9Q[nV/o|I dcb^hcYdp:e{}I,+4w^]=B6t'NhcJ`׆#1 ܽ*c墊+K#9K `:ΐ:;@z&~6Ӝ)-Tw{F1fS99§̉:|9}^|G%+mtQ1hmЂDKs2*2E2-1d5};!cTh\(ZQ.1fJKlK`֛&fjʒnZBDdN~Ű\,mb"yII,[WtC{,\l؜'xIM8_5]<ڢp%0nH x ảdOA_Py;#@KߣX}hzyD='gmzeQuo>v #OkP{|2Zp02I%јCɸG6:z5 ͙_=tʌC$Sjr~`wShwCۢl@~H8CVO3 cQ#ƍ- 6.R.9h݆z!j]nJo[qg6oT2`H=419z&bAH`2P4<cB>ia}oLPiQHrP]FqPѢ ƫ;綯 -RQQ/06ĴdPCwB-E&?.ir]n uj eʍ%w_,->?3C#bQ8J'Za0c'e?q4l+wɨFZ*<i1d9HoߧȌ:RC9|\r \.Ujc H\I&b-Y&_` b>U!d?#Zq$J.+"`O$G"njՉ=9ɒ<Օ-I.,ْ}@ ܡg†@M)u6bȤHz]>ٙˊ@"ZqO|x}|;12"fY- )VXYd,!U>?k*A S <ٝJ)DN PtIr[00/G,=ٓH!.1 딶H宂nkT'OuT/SFx*`/Z2<4Gh萣҆S8I-P {]_֎2uV3 崞<{AtG+PQ)0#fUK.YxOg8l(ݠ0>ߟdޚ77 n*F|A`L-&{`G x&H梽ω B?84#1̞풼®")/2.S,X7X~Y†Wz.j1Fk ɻg:N5&R#LTQe^.(a!-%JcKhcDwܜi=N$B u^v}VƖk$C{g2'uX%}·{ $@Nx7|I)h)bزG(&,X72&D95v)%,D}pft9Ё ltW>rZl."Ɖ%1l}$j^tMɶ:9~:V5a Iىe ͜ݰ&_ %M+%nط ؒݦic?Jr'&lg11D0Ńq JҼިD=/|5ՁZ6O1ˬ9[1?w6gu)vKw<4?B:NH( _8vdKפ}f>NOr=5,,drF CVoK1 X/0n`S ,IP6 x}JfF,?/Ćb蒗bdIe`vL{0 3 sòp~ `\9083%KJ@40=Ɍ!l>5[`Ƶۚ0Ry e[ؗyǚP &孷TY6~#u Š l#7r)F5\Yʾ3c%9h!zY-2kQF]:35me^$jEH g(kDQɈqL g/=l\aZs9"`A>NL dh!]7eY3|idvJW2xbkXA,(ur>XFC#*<35r_'H? }ݛ8W*K7dz]Q4wzc9mm6G%܀%mO9f஢1_9L=Jd$j:IH(.u@ 26:8׻vٹ"v6ky Wk-;"Aǒp*LPԽ­Hk]%^4Df4 )0'W&["XQ A2UZtО 3o{B*0"]=@ׂ `Hئ#Ik. &A(2bQáokU|Q::PzKw+t+.Z"F}ewXS?c`%8t =LA I@l@ptS0wbX(%>-Hr0N)I|kG80%A[z\7v%{X9zUL4xg lCh<[(`sQx XG,)9eX ,Xb;n&y Hlx~ׄ[w#5'tNTޯ;b.|;nGՌQ[ 8Q >8L v79{X&/}Hh]E I}xdSH͠mҮ<7@=+6416h\|%)+ d`߼~y_A喣X'm &'I0z8T 9/Z X(+W0qھn <ПeC(BF 봫/ %e+-[* [<-Go?VeLB Uu؆>a-R>*? m4 #}vrOYjC[  Of5 Cb VZiRrQ`IOB:ꚵq* +MSuGH\=ȨDInJI4'x$v[tPo2mpAwI'AM8K]He%|$oHlJ7jmPz&N2]*07O9(5eq5nkUPrK\_#d{VRek' wE`'>J ȀŐ- &Ejy_PyezepfarQBlFeĞfR|*ʨL21F:f`=ߝ:^tf<5ecfQusEdoM8^0*m@ms߰+\2G7K :U*yy#+`ɣ4u;Mvm5KhvfRf7F6ht@ ^וݯPR0VD;>wLK 39sA9F?z,g&,>ޜ#Cp*:lZԱCzD56XX `{3,:yXk Tہ"dB H$C`J_}lv_R_۸D"rA M78x>è-d>P^:vV`3nsP݇7UXx pr] T) $G˨a:X O~B1J_ 5ׄKfA1#j,gęD_9c_"Lb~$ӣř p'rR}=Gbxf*9jyEL(?`]|p`Kb Rʒy]cD ؽdQcG!G:C(vqu+6!/sy]~: `7^NרBX[ `C !"rm Rj5Ȝ5]6ZNƫ0wgc_myWm]UδE!-VY0*@Uv@W$bV9Q9$k8kh1@ u<~ϥeFm8p9| 8)Ύpq;ߞ e0x$W2.>\CIFPS#'K!sx%zI5<WPKoumy%<,k[iÎ|6KXnjoVVU eü0&'wtAd_4x!gA.?P=I-?ȪwVR*SQOm텍.X+5ۙj3Qo jhMP ou)". F27LAmΘ]ך>C#q` m e>XYv#{6Q2)*e%6xߊdM2iH+-bStCrLe)y_˲}MVwSz*eOm*PQA%~d˵ۡ8o`d3S@3nUblE"\ %Jۓ֒9 xMd{u PA,$;699?y)';s$̹_T @]KUyk Ev *UlDB*;k̓2g3[;wfsd'K&Kj:Ձt$X$B*BV)H 7Og_D,r&k} ft5rdzd^(2: { |ZCB%5ad5,-"s1JqF ;> %p5WIBfs?2ƵPjGHQEKbsW"C5ByB F׼8'H9 RTwq(JLѭw[콟U0-(Txa\+_MfQo{Q8e7Ջճ~i&?Ӫ[\0TÎ걉0ڦ&:4%&Wq( dKsa/g,߂ީY:2懔M\Jm&9H1Gk׎dʼv= T3-y瑨%äDzt+}2'u-O]0ӿӧ,R3l@Oҭ z"$mH"ita(DX4\yzQ/~f?f7EɗҾQ_6*Uf𑤷^FB8+Dջ뭨Wr꓿·;IQYhsCK&}BE.#/,Bo zPSOnV .9m\S$z)VkB D+,ò UQ7kҶ\Q[t,uwp^:UjhK0Ҭ4,]]>[TХ 5H/bTJ%3߄""0C_( u7\ƱR5)i'V}n+Z0EUȯq66_-ߔXXS)15ZcT?|'G&ϓHX?,D-nm E!S1 gdήMeVWy9$o?϶R W.,3l b.@Z [ 1'"EL2Y[ivsbYW}7$TYh6 5AmM%42]4n\%k#pYVcI\d,EuֹnY_~@e<ٖW/ &rH{ a-ɔ|HnMlhۦ(H:e8 $i`YiEQҊMl]tK( DZ=:QťnҰVl8}6SW6UaUz8lc>,u $}I[Ռw0 O-Kc֠g<5"$,kU4ƓTztE,~Nq-H kR}nf> 4Tb_7)SM_}6Q{Hە)F $^Mj %n4A'iɨaf,|[R &t0ƍx;,8__M~=$8Ө^~I.cIQmXdrU Qݠ{0FNEOv5)iϥu`k1\X,|w`ܞ1t1,;sr=Q 1TP!nߏusn4x,?`YCM6-nGʗ.p &]nN hq-4VbR@cj&ţ@lTBjVzmରnXv;1q~U_gad~)EJ 15"B৳fTPg˟S˲NkJ=J$kZkr-6?W"b _ֈ~c]y$\d @vq98t܄5ng3B؇\nh1;Q<#=\jU:PwdFE70^qU!ϞNYk&Y^p?On&&#=.S|j`Qm7],y<09C8 ϗlwv-Z`FMZ`s>S g ?e2p*xfWY 7SR~w ߧQwFGF-\wjQ}[ 2[SB\}:j*3O}(xos;]/H$R|^n\))d6mTJ^?Խa8'd4Akn萩b a!}3z;:SֲOBxW. 6]t mrq0T#U;<*&l:>'Nv)<I P#88(eV=Cеbks_ۮUŵ!^NU z sr'- 9{vr~ q2я,Jnق,4L`kUW3=F<[v}1~ 2ݏ1Kx_ؙhcO ҭ>|)gfC@HHM@,*Ԟn⾸{*cNޣZ{IrqPQ;vj\p 0[<:S08N iV Djlذ+4 jA{&D? s{.>SJE!ď )j~0#k!|+7ra *BR$WNd IP\.voc]>uC~8B&wut++>|g&ߵ\@cfPc#vGy9gPMY=6fD;cz9Q6.|w,KY.{؁S02k$oTY4~Qc_j>6PyQk-W8AbJ^&jg~5Ȇb 4dɴHQWlBb Uj>" is\D ]nmz|m4MWe\Cdb{Tj-t4>4i2}'@ʒFti4UȂ=qₐ->(0r MNk5.;_D<(9+ ql"H*.p;`l/|Wb)XJ\T\ĴvDZ /j<]I\Fjg</=lc-Ɨ嬑ibg#|B _d0`$sck{ԕlK3*p@ $y Ȯ7`!`rAw 8"wjuۗټ f)R&P" ?èNx .i=) z[ LYi\'du< '1td ^6Tဩt .x 6;{!@IB,~{h۵Os3wtvďI% n3Tש x_bޑPie5}çs$D'?!zq[̟2N^Dg@lT)=^?pY<PЈZؑ㖲>GONT?AQ\)ZenaȕrNɮ޸SY7  F`v>tIGČDHLg"CfUbu_T8 ̓b$s?{=`ۜfw? ҇b׿]/Jb 1nk`Qa獬nUF־hlϡli.X+&oؒ*#)*3g" Yȗ{Y/n9S]GM'|q1^GEJfIة` G[TD>ktIQwvox`^X-A|i8sT+Q[hY/`X\eqBo$K6fsGՠ:1-1F; @dGpٌ mz}oEo}QREʦԩ9no_r]c>, Ave܊n/2a#=0"lAV$>98E ezXr\/hEs/Ahii͸ܫ06@1A+MTQSbp^W8m)sK`,!JWap_kUA]$6ŷ_b{Ĝ3{#fYTx=R,EwA;Ho7oI"ZG~ s 3xFˆΧzN>\v$:  r&2s< DN}^`&<{\|f+-"~\~h(|:le/wC{J.wf@nQv,kCMc!jlZ'AT=fl=P0A`з\r5"IçQ/7P6Vn`7 4!uHwH'0T94Ce+7ci-p+-9C~#N,uxBP ;']>h_`pZ{(y \l'%D8ג.mC !֬]ת{݇"1ljx{-?1ػk/Zu$rtR`^?؀]\ /}H$;/taɬ4X?l`yE\z|t[^@m٨P4V^3'R@ᾥ۪wGy.+1M!D{w;׳"/L9'Ol9ܭ'D[ϤяEZM!,|9Ȗۆ["ȽNkʉqcģaX= |5*x x\_{I.ދ\/4bA˴șl qOIKwe3VvUB5|T./ONFށ=$<}-Kb=.]+EXԸnpw՘TY/"gBFVxuj ,S_屖7WpĎGn0N@}Iw 3ۧxADdSGt3LŰT5=OK?ĚM I( #ljZ2j6=*N\y"XmLRs<3jҤ6I$ix$wP'k2W`Oªcw +*b9вȟhoGuq+&/wmI+tg4f$3|Q<498_\({M:#/^Te5&)*Ek<Iqәw1ؗxlc]Hmrԑ\yI)ۛ,hMȆ2oGYKHv싴ph ‘f8Idwoh@ZZ^³,Nx.p$ h*rrF Ȅ Md'O4z eĊ& زɈ3,keKŎ$c>ys.H T9QI5:ͤ 6u΋cGe !oW\c{1>Bl<Is"^1 Xcmb:enu0a^6#lL^9\6ޠ}6)0m/:nbX9;J7S$ـ,@E'aL˩FUR+Vq ! 4+Yy`0m@;C˕MPJ<co}D#q?afs :g,fe ɡ´¯7X˔d.cGxGٌ~Ip8OrOc kPisX8C aw|rTW@.@oU3)#t1TlxE`x -̼H'Nf}%fY1;IA|R%q3#?(:k)&j>ɦuۑ45fx+yb#ӜLooKh~)%)4DEK>fָr0GaMMѩ o)0XU.+ĝH"v%>x"OcN?Uf>7* 'E 9}q~񢌨Pf}ܜ'*k V5myAx|aSrmg IțNHo)ʘN9)>=T~7R< (pf6|}d$uv;o<X驣hֳ_>8Ej]Q< _j8j'Z[6fq% g>Fo3]I3ѝI!jz(hpع^nHN_A&s^2;)M5r(+dWu].9y,&h+Gn; X&OwI?Y}>vj__( D29Be @[pNvĔ#jCk6pX)CFaR[_/Pn l~eO[&IXSztT_Z<U8,Bf}.EQs>Im<#QduD3QR9:f?Wd:Ǿi3#.-8E> "R0Saɒ$9%ԂZ] =U¹Uc|{7J? th+V]<-P67-mJ>G'ߪԏ(=p9أ0VsiμzG2wPyQ4MAUk ^AuraT?z!˛$4\s=n$!HQt)lQpM=^BO] \@DD@#oe4ڟ͓6.t?hQh 4$:#N@:ٿ#2DW%}`%o23a0|rgHÒnG@-=|@ tNPե) R;촷TP=Uh*z; >Ҝmdi""" 6+vwonefbIXaE P@|A(@ұxUbE}^oA/I\((U]EOB7y^wy0v>H"LeLe_YB|bԋhIY|ZalJ!a.u YL,sнh2tH6)–X-<@QqEc f'7a *"B6F?ס1 84oٍ4Lc^Z 9Ur,wtІQ*G_mWB'dKFmV|喙nA(p" p X"(VF0ԕ(TI@bTVpM*B8_VWȫ]9M'FX XXBFAJ^iv oڨ;(0*<t Mu9ab+Wmř")NY]ಊs`e*6\sm+7%\iuyG[ngߘ\&0uQ/^bQƍ'}JN \zgҦ4+@վ b T pez %&qTqzGn:DFU UbkWgB[l"hG}TV9!Q.8U58æv҂;K<\6 .e.. :c] , .тEE?E}8-_FU?Cs/XjS$m^R^*}/PkyYUCso-v񎅰-l4mL/RbjKP0S :u ipqsk_T9>z GF:JmIV83r <$ƌZl4D\#nʶ骪@W j hQVj}F<>Jqןl"tHqZވ!+%}@q$z4FAqJYؗ7y9,`ԣKhwRmqS"UU3Fz7S?U.Pb1F4ۗmIM-TÑ}^shލRTm(uU(T Æ@g板N H?tyH^kU Op:hrk` h++9 ܖfv0'v?4. t0z#M}fktq?klKS}D̆4(hEWg> 6!!b.xFtO \fB92Pkڹ]k8W XoG(g 72҂+E4my ̂5k~Y]Dd@MPxPkl K42uΕ}fW[y{K NQ 8---])z.#7?1ڋ?h'f sKphʡzԑ*ġȖs^4{GfIZGJ+P^Vc4ݔ&:/*S6@ZX)(KrZ)*ZlWP+ԉ-ӡ b,>`|ga]ΆLQBu@f@ƣrN6JpCYMOw\ހjFL8 9GutId.ܺ➓f(7tV[qbh_S$&֤Ǵ0 p⦜mZlRRjd]#vR7vA7-r}0C}"n. BxuVe]kJf aI:Q\ѐ渘O .)3ah&,\Ky%Q3wT>6o#fera/'h8s6We: 9U@JU-^T RU +W{pzful:9ݛM^܍">n[?̛P8%M"=]N_e4 ɷ6A+?ECZN U}x"ޘ.s[܁`{7!T^H'SPT|u2+-5tMvpIyVu~5oo:g:J8YvRf7EEmAГtDpkXۻw oATIDO7EMLnј$;9Jy_ߚ爰yN9=239ACED?@q8At*nR!Ԭ*]Fɤc %2C]<y܍ WBtxW*d)><| 䞿I)?i`dR5ƤB#( W]`'hw~ 75R hL˼҂݂f<:hX&-".t88wjF#)Υ/yNS8?{2'QE}:b J9j?}k;A HٗgM=3T]7ŸWi::(/%vmFˣҎc?*o&;d'4f*Z]ʾ CojH9& Ѕx45^.L C(qڱ)8 6Vm>pL)xh! R}Yxi4#H#98P\M%@^|EXrp4C5[ےrvF`Jekpĺh,MT B>V[>]<.z6jud)7*Jx7.ԝpDS0t'X:,yNQz>esl5ݵS6%vΞZW$>ڼ`#S9=_>{ؿ|ƙqx-#YI\*jM6Jzc kFB3\~|&DQZzCu(]/(c6` Tp&.. =?ӵF{f7~c:9G8U&HsV2WrGRʳD3ff^L B.wT'!je)C܏n!(x97 K[4zUI}J?=M=Z4':KdJCl1ĠXqױ) Rɟbi٦;jItzH)8:~2ImRe~ea*V0p z{y3k` "rP91%m|3*M!T"GI?d Ns/;38=+1y$_Z6h,ODLK80@6i޿#iὀM| ːtl)I&=m4YǶdx$wM !\v/ipҴVrB9i|B1|^pZg0VND3̿"_>^M7YIlo]Uh XO8Xz%z{PG;|Jg+6${}چ wV-.ζNXJt/y8|z-ZDm؈- Oymć bp.u 8O4U'B6/":2 tIM %-o4‡r|Ю(O$ G y{rGpxu&8:%̋H47"&F;qq kcAYF7'$ V'urB J1\ ߣù4ȯ59Ї:.G}:`gGXUZ/%>yIoŞB'%`KzJ+W 3ݜK=$67$U[xZsa/e/cYu4ÃOb,u돛M5a}eN0C>6}aEڞ~[9EM맭Og:-D :IO)o/ye[ ) }j[2Gy]^F˜aήy/ul *6tFK&߇2jȥwqQ`1v`a *uz>YީXI:3nB'^5JɡvAӱe%1]%q?ʷG6B䌌;#O8د{C/Cx w$;Қ6+C<_Nݗ( 鉐><O%Su{;xKM =g|S?3{q[EGg.Rm7Wі>+~p ΣGbTeu&?{$Pfn)&NtA/*SU`QyouUs5mM%۳uAmv*٤Ȼ$sSA S!P*Jۍcr1puA53$ڼ*4n&W3auHjQzbb).IcFO<,c0Lfc0#Q=vbff^ !a@YDHү̄f"!zOZpIنpcϪ=.tb}dSP}!mU1s'>2K2{Jl ASRRvw8\[h)Ͽ; x m̩SҠx3?,Ɩa.Y-}vX͎_z".R9W + ✩*1X<)H *laM;_Il.0’ܜہsƜ=DiSf $D5z.kJU剉-dXbbv.+-5 *WfǬ q&.AN7llCQLU)(⍧ 3}& ?ʒrM\Ij1j&ͷԟWQN|;?#g#V 9;\SqqcQkcr-e5E?.2tthո#;ɬgD53޷U.KƫGqy퓲|@5,*,(n_'ƄLI6ToaмU~(3Lr)gHaFֳFA1Gqz;I0?pf 9/Τ Po>ixS'7oɉXF}&&ݐ[o>p-c#|H{;sU0;ڀ7{ȐYK%t 5'BgP)kyc~N3/{ K P3m< -4ߍ,3078W NDf6tP.U/Y5.M$^!d- l_Oi4R~dhD)Xh2\tS 7BBS({c׳e0΋1luC&'Ot~{-^ExÎZBa4'FE?6M|q[кigg Rh t2L qU$zgʞ6RqQi4$-i&=xY#Ko[=`A<m0A 8`!.@wQК?!>%922w^PcbcEt:{A">J;Fmai00V1(jFSZur8^S0YU6%C" aETjp/$7I:u[CON[vYPYQo.)yɜu?БdIs99hD GܟwX !d X' N5E7^pTYLmj^;ެd;hsp<>jY fܓֽ/o yho^-[>P  FTiփ:7zbxi}fZvL£EP&:ugW"0A)V½ >))|\/&~ͬ2O_<8?C'T*hq4k!9̜κݜyy.IwkiUE_V u |!;|TU7"!^9 `6.<@5︽DQO`mL[y vïՑ+f7W?; /n=k.zGE \׹E^**҇Wsl/:q=b)= ,c@ G* \n>sn?ڄI-)9X|9rRpEr t%π mHr@6*I6veh>I6 j-gq4;Bp8cN?H&et "qq@IbQO|>y-s݇X0nO4P}Da;R(R2"E~z7~^8T9q ` (Qu9Q9?$@Z˃,CNP(|LJb: y<&_0Ѯj'-"Pe۬oֻ-5(V J3ovF%$_2\ xݿ`c E9`B">#kϔrƩPˣyPJBt|R\ZrSHONݟ$&wSP sNkIXJJBaҪ }2ɵ}&&&}o|]*g9'w GA Q(.> *z  #'KYeۇ;T mٿ#!eɠ8gEz}s8wݏ;'ͤy]!BI|s !EȗJB|6h,f MNv#9y@%:n] xsN%j3Czfp]o։,dS tybtc/Dm2@m>Toק-?#M;|A,$P3 ptʑ7B $u OB fl؍4w/ mykv$E}^Xac1)zHRd"-jG諙.+HJNw]}>D.GQLt<_6Da#Vy T1}0FL9#z8q߲>xtOPK6qUƣu;0-A DB}rxk*At%iJ\)-3%8oz""~^YɶZbOx;*o)W^E۲Z0O\6 Isă_{聖(" 0laqcnB1V2ošYJSW)42V"HYU3#ѝ,p^pKH`Pi3*P_Y|Zx*m1}j#L@Me2j(%F:e$\ZE?z?/9 ilPH!L+vs;TH6tlWosgpY#NץL7&`b,B_j3AΩ뷻=sU;-'6C3Rz:j&|o˶c*3H^Q\d͌nn(?rǥӦGg~ڱ Gb_6Nu(+/xs-֔ƀDR"a;N>4QA2jCAsT) RYpk%>I!i!-ɪu/M_ V쐝6mo[ArT=ZW]h9r E ɘ`(Qi?+x;SOeM;V=aU<.(0qԹBVK,YQM:%eQZR@g2"Hزv9Y+-P*V%"eʎ+<( ܣ(OjH_x|ެ %vXlUcpfkM:G mNdP@@7H0_wqd+^Oh(d<5Q@.ْ W@j6$;T驻@&Z콢Id3%2'/e!sXwWMwuK+d4A|KV0Y7} Iٰ!UAr^{0A(I? #=z%)O%$yZY:8)Iգ5]asEQ " eG-SV(or?Qnmrya0į(fd%qe7ѱ4 r>sHnⰼH34᪣IPmnHjTٖ]@/S6;7KD"Urm},׈ WL ^, E'K'dZF?"{2gÂ@{7q&r%):zZVn_r8ᐸ?;4Ysf&yay *Ҏd& ;`ȂmyeҔASegBrd|JN5hai g~6Z?hHHZ87)].*$)'sɫ-zAHQN}=gP7=dpNP Qjp69_>L@<_˚) |wW8B\~LWAցsa|>PQKܭr0} /ny#(f>.U)u u͟?.nS-hRO>La+hGk ~Dv?ji xxHN[(<>g89vHMJ&p |An} *dqW-.B?QT3`q3D@3U (hH8jDHrYzKTIz֫ B>j]ܚg$![HH;m[.>EJSPy(TFD_zK<*ң^n$H @{fwdLWwuWSmۦ.mT @E/.y!?6??VL1Ut/0T0W}`ox3ӅAϠ< iLȊ`t&~%@L .OT0Yc :ȊPҷSb~IMʣ.dp{l@Jl DZOV.z iedYW$`}h">n:[0TE,Hx ۦ(aW$r3X_Fa쾻5[ּ".RE0D)'Q-c6),(V48M" ". `LV\%Z$(:7GF9Lʽc*LB@pXtLԆVR HCuP+/s&ĸ0WZ},%Gܺ]|#v4%x]ZD+RJZT"9#mo`U[bnW:Y"^O˔PL1^'X {:Da%`2&BH h$VMV P|kX4 u^fkTӲȞuS= yLUMG aSh~V3, ֡W~7*AR!xcKLm!1EՀK`;X`י˳?:]?<2uå#xcS45Ӂ1)N y=t@\ 5:ؓwoH21L%s?}s"nG}q9m/' /ػ[$[w#0|0,(O?}oO Nx,W{iw%I6'B tS&>Cspdw.&jh$Xĥ&eSLںxbjڈpfEv5v灋X|O=>2\ASZb&ġqZ/e6n};b>@3Ac]bB ) WLg18X^7NŊ%>߶F+wH5i<,d) $X+-/u eSn$I@Sk+aʿeR_ 5ۯMhN{?@TnVeuh/!ZңFHyPڧ^ QSc&jk#ltoSECR<ה @NU|7Y$H/'w ԍ΋?\N1UPj82flo#)dO]` qŊsQE"],`i@q&O6S IiR{ }1L^d>d"|8 O7@A )$Z@46v,*DġMLGP*8wMOmo6|p;sqRu@0xD7^FL[ m4 D ظM8 O_qH")ЂT#j TfM(ЌoE۬ZbŃzk>Ec_]*Ł`1EulmSܶܿ-ԼPuV_#4WE:SP-DE+%Y$7irzy#5? ֨v>S UyH(m 1*p `ڭe^S;OE.aG^YϿ͵Z1rG4ec-w uM S4=CmgԌ8?('QVjXMe۽ENsOSLC/4C{$Jg%3A!1!]hEazPӈ~hh(8&lJ]F2P@_a!gM4ϑG-Q:Ϊ*?YKnxN$C[OLܗ DL=96Mx>7o*Lc{/\fpޚG|4ԷMdnղ uVtW:elO zfLyC^gigXAQ@4ቖӒ?l JPZxۼ@|{h!`KkNxL_N~PYЎ Tfd^~4F 0oҀueME3K؀Rv#Z 盯yİ4*b?FOYvPeɑqwBƚ"AzKuynкЃUcm&J 4!(#ZT\M(-b+3ӵ믕Hf5=URQMb]8 }6J[?cY~=bs=T|H"H& Th=S ?}V{[ ,zc)"TSU/YrT$DZh]Pکy g@J) X0Ŝ?ʺݟ0Y)sp|Nl}Da|ZD^=˟=L_IU Nn. ]8WA[}eFd,*|pkcӁ@6l7m=I_Ѷc"rV:[7Ĭ)ߩ:;XrQڵryUů;3Ԗcs]eV ;.X:3YDZb{9OS&P2iǸ}4}tv$@U]JYJU\LYBo鍓-$Rˮ)0/HP?z&E&5g/jIQ?eՎgO"l8nca?KT*" Ỉ}Ȫ[ؐ_ YIJLMj|TRY m7d=j'pv !=$iQ+G_/x KíH.VR%C}Z%A,VPi-?JbX16@}_}GFoE<t'OK=zHWdH>3/,i.a)JeQOb@3+, B=D/ж;SQa$odV= .AҖYit\2P8D#dQ"n ZkweBv%dCyatucEdX/pT6#X,s{Sk;w \4(/en)]"[MI)QdwtbJ`$pC{ǯ F|2aƻ4>q5D#QtDY1(9>2AaGm酢v˼ Аض$#-q}*UɋRXGTPwCl3M)ӝnjt=Z`x| ~+zq'bNMD"!BN_-LCD$~bÌ\>"+1]v4U؛;$9rbZ}:"rZGuv- ^lݦ?I{TTYR!rJxZ 49bDGFB#% l :oT$n̍P(Zޢ1b!aL>2}Zx!O\G[`ᘬx_K1"ǎ'MWxr PF?S3,}MWV8G +-qؤv#|*sQdNNb?mKh)Q@ǘ]S9L5'';~ 9͆xG;v.dK)uLxTOo>ޟP}L޾Yͺ[+ R<ɚ U.@o+=W; ' p8$qqz'϶Js!{Wks'੓jYs`иiz)XLQ<^~C8VW V, )SӿTix7)̀"W9EJ(|TAvC5T}2vD4Iӣl@ }@W©=7v/oD*Ý`ŌrΦj#BnR4裧"S?rK ڲoP qameAQJf"+irP"ׄEޘ T̉f.g|@vUA=u;.P[mݳA"-y7jM.t_}WaEo4p}/4Ȗ QѓB|iMP)4 bߺQg?=S\K@%S'c Ϣ 7 Q4*nbhOfԾ8>2A-7w:QiTUsvf< > UmGQ|҇8wB3e5,*_-. Apt-@WR.o`,GίQht%t}unWR*1n[!c$)S K_gf0=k ]y~mn5ܚ鐎[}± ꉊ-p$?jGۻ-u7A,cv&q5kʈ{ qsGx7{yӻ$ᗓS"^u~zz|0gdJbrpCR#0NϘN,lPZVm(N)$C8Ѹ9F[‡QS+w\0LˡPʠCze"-AF s$|c2-|IJuNe]'B&ۛMuf. yv;Я\rS9ǂjlm2'1p]U21+gF"|q D}poU$9".5`xpSt!UfS*.}WbAMr_.c2b}#,a0/Hw%6[ny q%J$mSneX([H?i8<崒|"(6f\QCE%V[܆0ϱҊ\H:hWC72@}Ĉc?lTUl/WtoT+kڈ4UQaQSB5u QCg"z"Ŝx\nτ.o8vSL;*˯.PBNF[@ZMpi؊xu]b}=hҭ<¸? @ϒZA4!:9{s~ p)*jsaîdRwnn ۈgqY`~ֈvwodJ,GCY[9^l:~ԍ! ,CS\QJ1 #9fHzh̟ۀ!ÔА&>U4f"NN% `0RnBuXP%Qn! 0䣒 !zX6)'dm>ǀ.c`-ϯ`Z8ƅRږv}Z9AvfآYCx/cLKK\"+-q;xZ7p:ϢClO*ADp1b%Up,jwkf$\Bҵ:JZjmB!&I|朗Z!vM4Cg dniAƥ4qbEצ߄4,~C-a&X9dhO CU.5uf~ZpKNb,Yk; ["d x/ qx6D.0h6g8$Q:b5|[ nJb083>&~f7uӞ85u{[Zi. ?"@2bf~Iopv^5{ RcJ6@{A1wpv D 4*A_;Qk8q6k,&I* 樖**(d;p7g/h;tMy3#͜l.dn!2f{%%bw"n7) Vlu1JBz,پWgkv=HN PQ6MN<-C4_+A-PZ < BY qZ`:5a2<OuRRbD憓&QL[ Dܞ;=w\4Q%½3CEEZ^EQDRj Ό1˴j;`WQm~ul&ߓo\g0j)7(xDH)?R UXSt|€$&c3DI(^|.E\,nwI#d-j~5 . Ǭ|ϼRQd8iQb L$V0HEMo%̅Fc M֢6)u#pzOn "ʰXGqUU6R؜/rp,B܍0ve}b.0@ut25Jk O\ĒAdzUJ9I/yNJXזŭIE^s(_+bSW2r,Q|otYI7CisJ_n15PDͺrlzU"TF(61 2BnPa1&56+"{isBo*Z1'pa)F6s"w)md2!I1(;6{p%`J|,*;Vgd y:-iAi*V*X9ˊq1a;LdN2<,sV"0 FeDlAF} -s_Z@E%2w4U]~@AhM)YTv36Є;ΖKZm?sNyCL0 W'%55u18XgU`i72TAIIL+f"}Ss2eM4ZΩO&`@M $L|Wmh8Z@y # Pvw6C`A{;_Eɩ%Xy;"L:8\xHw 6XoagvRrS 3E(E-}i΀_!T^ FP4_ߧӸ!߇$9n1~4"wF/9ROqDK pOm7/[ P$)}o z] q.UPۀ\<2ufCQ~y9Ət HmSL^r]1SqgF»N18,*"z~SSn#{4rdwۢxugԾ#4%;,̜z3p~CDhC~Pu4J`{뷢 gInvFvk*eׯ$;zؾ"1~&*x?ERqԅA+erz qq=0g'u%-1H+Eu$30ko`'.Z⍗ EUxl?;-ϾƎ#69 2WNWsuWv(9Y Y Xg<u]KͿf<ɥჿ"TxyHv9 e7p VcehVawSNpJ Ha;'ב/:ۢ?<[D)bGajrK `9D :ҥl<{QO4DciΏWGGCuya,4^ H4D s,a`2RzgrzbfU`6&j +)l/ =;Zf1N1g :\_q͂8M%5ٛOViGbp C_eu vS \Q)LU# ?3k[8"D-vSM)cFY"8"dWk {W9!{Kvxx2-y%JRn!,WCf==\ sÓy1P&izP& ~Ty!`7Ɓw{>!$qE(A`fʳu[(WUdy7/ 7bGQ1%9B 272JDU W#EO$0'3?bO wVN 9motvjZ!o7d%p} CR(x.⍋x %k2O8*N3CJ.OD,XDrxv9`܁Ŷ𛫵Is?'$;ZC=TUeҜ(ƒ[BKZsd`R0/;Hp`JI3TP#oebY㮬 $m$ہMm@o?[,!#"n&f77>nM[d.LfKm++ROKDEPEV(Q" WmdА{leYHMu67bƆn0 @t>$$~?IXT `LVGLkB"6DXr>,QKJ(ֈJE#ڑ7(q]R$,X7~9d #Bx|FǘfP0;')-0 4@Y`)U_# ZI.5*IwQd9.Ljj9/UοB_yiV1/i+x8ά:PicS$A+xIBJѡ%CLP!ȥC{(0Rb^S"e4򸰵Ud9J xXiHh<qYOHH=fl=_YC'u$KHfY*& J 4Z4(eTY 0У3h"pqZj6 ^"ć? ^E",ZH=,Q ̝>֢] >>-Rb \$3e.M FFrQ`acW#[oID/$u#R m42 4b֏Z{/?KfT#UcnZƛv1V:xY:k2깐g[ äK/ Ѕ٨PTeJkյ]њCQSO'AKxr쓦p&\SfBA @;B]|5Rd\7 =3RL5Yߴ .Ro5@luaZ2Xm)paLo?$~*BZP;$O=l΍ y, x7I===+"F ]TSNoaRO;VLֲ@51=g"(B#w)fF"d||';:5f|Μr %HuCSdJSr[iiY>+ȿBE:w~$D]@@f=#>/`+VE|WEW ԓ@5,hȕ$vS]vg47 <`@FI}t 2䶈hFul&%HQP]GBcUGzPj:qcZӤmћ:ЉK\P?s| w0Yx/&ZOahG$rߤ,wj=Z > ]rL߃vAL2x%ku1 GGYyLh{t&Yz e?_W*Ra~$P);!%ViPrzS%e#M hqZzKb3zp\pmi4u Ab<[-v?)Wh@`=`yぺ1D\M(:Й-ٴI.T#q,:LPX (ÌG)؛u@W,\ \`M00,0`h. &n7v]BIKk6m~2A:4YU$l`MTEow40 - =~\hĀ!hkJ~IY; EyA .?@aD $3n0V#m(xfs^&ld~:22Fyv©qYZ>>}BM)nZuX͒F֏REȖ,O'r[f^!ƍ3sP MkYK4VKL5UQ?0: *u5%jGk}Uыf+gT[WqMqɞMmN)K(m /o&9B.` B2[1#7@8k{Vc~ITeyh _!wЬ4՗6i>n6B@scBDu4(SdB*Y Dbn yk\R B:?a4e # RM[ A񠫎,_|ڋjZĝҏJ_7OrA%z1,識#Z.zd j4H3qpVX/V\"I}cEޠ:[QA:S:{*l[Ů:<Uۨ=/?(T̶<[c::{DD?;0ƐqN,e"\p|o]7H.];Y 4"&-&eQ؁m)Zʗ&-2]@ g뇎Dg2Y*-FFf6U hZ^JȳY7P9 sȌ?CEJ=Ff\Zk<0"`eʔ턪NC%Qm"?m*)\5xV%AJs(6ݽy:W9?qgfgKh:rug,7~½=w·_u!.O)[%dQ; ݇\Yvs<낏ۍ[[j+dU\gcT{q Ti2JHLځ]MxM YL H$r.ٚSeUAE:OG4?cڒbƆ\$yq%7D@D300/$l }wb/FALUgr w+c@SWX*MzWQOX7Ɓ?/0TDYAV0>a$ڝHDZ-FA>Cr$c kM;qH3Ƞ@'t ur|߶-tƏ0H~s$H{"^B$J R';L_Ke,١eńȯcfo5&UנAZ]y5l7 #nڞ3 XBI$^mjrϾРUj RiqB>5@+"z [Av'{^n{*>!"-S=᭩ٔ8) [S\tjQ'WgoFME^%OXbZ,Uvyj#,3ݙU;FW8=yZ"^MS Q%p/wFFtKh}sK4R3P1eu?%5ht_Mp3_0s>qhPIP.o !]}n [ 1=2d3b*G_}yq'@qo{X8%nP󾖪`=fͤThoSUKo|u<|ǁ <*/vŴn08*UZD]~ tf"f7cSb/lkӮzk+mTEo^nw4p ,.5*r~Yβ:H^skzԧRd%r=+4$# I1x.=FjV&7`h7C8+L1tjd_Ob_"1L7؏$AM,͖\Ӊ4{62,s{_CՋD8V8I4}$$WYWTyw; 'n% rJ[ܭz삷w-8vjf& 8E쭧<i3Φ+\Of o]~ iܲٷE4Zxyi8tg_٣h6bK̍ _x[#pE$둮"p7˜HlKKbt:y~?,sEa {wkMr-٣vDڭYC6 %[w: 6n[痀]5ճs 8%]5nCc>>oVq[љCA?]=\/$wl3 [ 䧠Y:_QR98gXSe|FJWiJtbx$Ҳ y-gN@Z)?-iv*1¿45'G!(Ku2 j2烀A؝g#2\ SX>L1,6n%%oS@oE#gZyw(0rYih ɑ ˓h qԎ3ҸLƵCZ=ϼ9E_:b/%@hGޞX}NP q9T=qߦazFF8k@cZOd=p>:͇r  V+ho>lʚ ;<-9ivˣܷeT`2"^,d>rkpl"#I Ўu2}Vi7+!IgNzތ(ᎣKc+*( CyNNo@wZhDoZ('O9UUDbm[=<о뺷*AN. b5LBt0>2NՉ(lO;|AY=uvL@;Teߓx( /Clg>P_A䪔Z\锌饖u^wL @`;T#Cc亇8~ѥjeB wKL2.oOIݥ6Yl9$rA!y_EڧsjCW9.ʋdׅ2GT5wfzeR!Y5s#ZfNoBi8ʥC P R,{QfE]Ah"ĠuG4[vZc0M (XdH\FuHA=YL<4#YɡJI;8e8)UM @2Ciׄ‰U #Kl Q*.n [b> tJ\ Edn;Xi>AvHi A2ĭ3fثϛ7eneNf)ӵ˯F3LN{ՠ8Wf)لuo&8}qPt) XP}kƯg௬a.ձ[@"*K6$Jy]:m|9]x. 33w{I%yʪCB%=B~醹iP,60 7J{ JXa[ +RS'i):R5aC叡w|q2 ,*v:FuS,_zS[G! nu8@^A}S(*c 2jLoahJvXp|apWƞ1|.\s/$zHv3ZA!`@/I%@%iePlfTLO*M'RЦWo\e ))22E[wB9Sd_I=dCJ8D fns$@2?r! JIKV6A+zu Z/qV`bsH9p pkmcrdO:8$NIOOَw[;NԪ&|6>AssYàU< +MH* V7tjAdJI`g%oVq MX:\-*V 0L㖕`|@g߷mJpC+.qeLC%ebBMe0[dvR[op(4p&B-JGh΁Jbȕ缯d^_ n35fɯ2 E#* )K4L9ވd#7aʮ|qQŌr2^o|Gn$[d;ۃ]8r7 {i S4y&*4PѣYLYW̚KP1ΒXF}bd*gؔ$qw35vd;Qș:O( 2yTik(' ȭ0i>=_8-&%cPL4٦U@{/(3ewpnܜG`6I_h P3w?ăvBF]x"^( ۑIKjړkBt]~MN xN; Ruǰ|@ܲL㮱JYu6.(e*ČQĔCMa u\a5X24EvB+Pfr+87* ^`/gJ%NFΡ3niSrtg5#1fo-ҳbqj13ޠ:v,Jw̢f'S' Fy-c|x5 J),8nMy+ŗ E3WדUǥa48K&tVv.8T+!;϶:Q]= F0!w24|r\wHɾj",čk(;K w?랪zog|tթ}Grbf: N@.L@X KT<[bfSRB \h>=o0}!^cx^FU0 + ZFhtr]"ݻKm_W۳!Q\m$<29Hm!o|i6դpGhqkpۀKhrU 6^u18w"/qA(K?ݵuʵ;@R`V%x1(7Ea~~aCL S%zdp6 @B]Qn؃(Ic6i&lha;TӢܾ8 @{t⹩sjH;&#ua@*%d,>+KdSE;7 ί/f%@GP{&xӚmaQjdcyVB+,8SL  S fŽ&K-9-v)Ŕȭy˔=W{ ~H떂 lzX) d^.Wa}r7\#6m/ќ@JxXBC@ HP2>D{ÛѷGUL|BA?5˟ w5Ae`GpD#4xqX$]'@ $l Le\VB]@'"FOB,t ?GN[ѼqO;OvA$mBkR@B  uBᗞh_NQڿ'lB8μQS{5"YbMbMLٕsW :AZ1kc١/Y(J{)kEsNdoʼXl!8wp.矏dtVчS9;uM焙̆kU e\%I^zlX:}HLM%|I[H?'GenN@h/D1DlƒȢVRc$[߅?C/N3480๐ T±<,2O:>ŝni;$Ri~bi>ymGɨ`%1uI373gA[R~ВԿ75)78@r" 3kv1e`R #Wi]K"d~Nʾ zWw >{)a+D{<{Q˰ d$D ,@q1b6 Mp]<ԘL,!7ٴş@byKN>hMr1B񄕻DDe"ȲOeClTP1Ae3(7m6]Lw#2A3VZ &3OC:SĥDOH+9 PΞ<)DnPKL?mKzTՄPx*4C@2e~I9iMq"o2m -8[yal߯`F ndfrL|QH2)%n&d7禶BqoEV ӋNw@u:3#ZZѣP(/F=hQ-^zШf3Y$ {{{ڭqM@pHIZqa!ɍ G5 6AISԙ ?3(R#R?udD)G*d5,ӠE "Pٖ5Zч&;hu9(vEt*]_4c^K!niFm#L\jjT}).=V iT7QFETS=$;`%[U~}@`H(1RJabٮM1[fC-Rr$Oftց׸12L2[DkAyoOCd@cn5PzRxUV;qW*OllqCm2h橎Db*cU5LJSTLtLy@l"p fJvq 9]3%yg':$7W!Olor]D1!&Z5CH<("sH0ZKT74WQӋucl4@<};szZs ˠN{wތ"-/ii!,+W'7WV!0'[Y=q*=לV8FuPhK%.]3JSѰ~RE)2y>Srn>.2’1V4hySt=E#cAf;!"]qQG;U:t4;uG6t=uT뭚"RݎƚG'WwFTtQwP4Cu^HDZ>J4kћ:N8!A҉4 r9:LfTa CWiat1L\/ 1FJE}a*a9thi8b& G^p]&8f,oǕ6]7|RB&_n] *[`O^KuZn)=QERb4!KuӾD%E2 @7x1t(. 9~Gu0$PdvjR5^MY[tEP L$K<\=i-@yUL7Qύ8` Cx'U XD->*߃GhDBԧ}| 2W d6cܪR4`-PpVvސ2]Na65=f>j,pp',[X#m͚qd"Sޯ*fk&P[ܕ5Щkf/WxIzpXG4}pdIy3'[14zt~ELfte= bO_\19PɢuepH14#܀1ȕ0}=ŕh_e2QV;]*JfE@L0K|@5&jS eHY@PNC@eb)z($¦0Cp"p!f`.OSe~IP\?),:r>j?45 SD-3iKt׵I~i2W\ ok6'S4S W D,M EJcȸP;*À:&{r#r$2DƬ56B+߮PAPrAmȿM\$B a҅:"qX?LMW )A%<i6@N?ρ$3]Y"{0/CY3xs=&5Ҍ8,A/NkZ,Kc:IQSi 岣0ۓVӁ_hw-nK^ #ۜ?EG:SӰrs$F R/lkW@J`kmz[:=쉝]ey*Z۩Q%xTP6y0&QXXf@ NAI,ҏAH ,{S [gir{ vP-q>(]}:xqn8U]utj< qH\M }~F$4ZZU @)$~@ϻJS4Sk ϖ܌%PUit:m,(6T!lV3pZNGtY+9>Þ )8$s=үQ ~TH.N zVi&qؤ_fp`c4f{K$}*m"ۀߵa6XC;bW-frGDg G<]bygZjȃ+T- ^SZ^yݮqwur*Ys_~끋Hm87=XɤNL-:.ڧE!Uݎ*Nҗ vWӻ sy/-V_53 /{Q ‹Z@Uו>̈́67ŝ<ѡv}m[CET9Gd:p Uܑx.M-k #iJ[|[miN=K2<.<)cSnۻ|(ӥ3pKkH_GOAv\ i}_1kN:|_j%-Rh.}bk"Mh0Tm@;U}0^*>VYEbw $`]a')zͰ D X񻒈>U4J;{u4[(0WUx`0+ S Q)D,ui6Ɲ3O=zɡ18X6#*?8 3SGCP- 2ލJؽPUh'CC`,M[Qyr~rfӭ9ۧq+ @#X6Ynz0|zv]E vY|G0E)gyQm**tAǷu]K~-!-LQ4ujWK.#mE6l1Otb8<%xpA`?rz]‚j[jǸ9+tAxX xRL$EC83dSꝀAy)B1y,:0'&C6"rW 8(; k8I7ʩy k:xwbt(FQRAoA} =IlO#bZZc}V);M΍&4ȇov,lr%9{Ym,3NH2NZ=(gR|u`7^;{3`8q7(b}eIbbC\-=ب-_kqukE?Yxq}nI&YפjUz*o䵮9L[_?so0B|2״Kr B+\W__j/^+{uR,2l'@C|FMCgݻv93? $4nx9c妼)m-8dEuȲpp'Cw;46?;as*qy%>99O櫬-ۗHlO zR1{)i5Qh]@a)}s̜)1A6[m m0yfH/s.܊p VI̵,愨ȬiwQ-6Gɉs8AZ7qĴ)9?NpNIɺόo!} dsd, rCuụy`N |wOD&N jXV803Rx#btf9.|v<:4)Y@+; ֐>wJBw}-fIROhAxE29/Y6ʩJ9D]? Uaz&(P,M6!!3{_t_|8צ!l~!T1CLԋ퀛f߼("2?/Yz/.[31'!,:,I}\gQF4\sYeZ<` >Ro7"$ʋSU̍R=OVRTgd׮!.DY4(0,Tf:9d$C!XOҀ?'u|֢3ڲ`P j.=EOq~EZ ]pEYvHBv+ {^ISXgbf j4X3sAO\XX$<]G3~1{9( Tu7&,X q'blZ2!uGӝR-ScЯXS$$XBX/'l rpE>}:^ϛg3[5Xtc 'j묠}nOlDw"#bOe6ؕҩ(Ќj/kkwLgNۂn75#‚|Fkg,RۦR`˄Z*/ңb<Z1ʏ ki`cWV:sX9ݷwhcC!Rҩd\|`ZH@tX~QoG|Ќ7~g01WVBCT.+Њ 롢hYI6HK ]}P~:1-#;BS:+LRlbŸsD.t➍ل3ҩ^&)k&dj2.?bpl_4>x/P )MydzWD Z1dǩIlɈɌ#A@h`\5n~(@"W Uu GHjٹRQ?B]a3 "m /4>ˠyHȇӣ>?)ɧ^T\ --;1^FJ`!5ODDٹXux \m^k]n6 UZ3I*0M!Wj+)Ol|۳FXTF 3!~|`d۾>MsӔ PX[{ك.X, >,~8A-V__ؼ-{~kzp`Qqs1w2#bp[$WaK5 BߋrNîk1UNS<uAmn:zyAu2@rZ?*)WC"xW&]'%-Sb^%M0Էg/9vϲn|=7=p(7w/invUܩٷ> .Ny#u' qZEbE1äFH pCmV]aU$bUm<ikL`i77wqLE&0y:I>&a R>[:y[xYWO6AfcKyq;wWc)+*'ą_X5ɪĥN{{3ֹѰ?"p]@unlu\╲#ohIޔ v햇+ ]POn+$ gu#d'y?.(ah>6[܈-ͯ>.Rݤ7rv0YBwJ;T# 1C؊X(0l0_v$b#b,V O]*~(Aznv1Pbd=/8. h FPrUH7(pA>2#u3G wB~/.c}Oиֆ2=ܫ|D[EG_'@Xq2 Fi=٤2w:o;?ZhM| !pr_X^=q„U\mm~>Рc*ByAUhVY=vr~-_1rQmЊ9fVsOF+¤vEOfh]C*V'tى=&G_ 10$ON`(ım9JY`#{c$$T9?[Qf3{˽%oNo]$!n鉘~@1WjۑwEs.֠+󍼽| ,[ep?@ש젢ѹMϼ}o7{C4@2oe4BsRz>8 $Uu6~~"33W4p` 0~2|@jXĐJ0|[jZdЪ I&\&'}w[pjA;rᯆ<ۿk_W ɌwΖpgwr:/ ?$]YdIPI/.F5DA;¶3S @Q/`ZA]{4'/F#E;dMxPxpO?3XḎL\I2dgdE h>Q1-My>w2 VkNϖȂD8 (pjK;u^O\C"5ۻ+a%Swo۶svl *:D.x]Q VT$8]ӽ`5WZ`]!S#aA(j{&6B32rUSC SZ)'Q47x$À 2إ3jj)39Y8U ;2r輝5;@$Z[nC  ٜ!5pCN[ﲝ#Q0 YZϔ5׶ͶALpwn좬V3-wln?L}~~3_ǯ(@o2[2[ՍۧfҬW\TtONyyц|[<h,#V_ta?@>"߆r]CEbd",Ѽ1ϱ<Ado[(B]PW |^z؜$0Ha7Vj mz3Nx_貝K1h!lZS\9n>?i̽׀O͵]|*͓5ÞqsOҡq!j? 9҄2+Le~aBp)҅=&?/A?RYvy,cR:p#C(H/aEBt" VVq ]y`(8耨^h|Ȃ~o_%:sl"]Dzl5?w_9h][P)~UeGkRf) wv=m&_:m;*쭤EMGҚ]UC߁Pld[Q[Uw p}Kl,Aj4`5!r] P%؛G-D<^LQBsNG"k0a2᳒;V@K*;nY{?o˂%Y51kgE,Ԃjh.t\ꞷ.:3ŏ9VsYh`1wy\q*S׶1I%=|Ru8#)"&b Q)'Dwѝ?g`jz6?mf9__<޶޾yA/ :)#%1p-:-ﭩŝ'O{EyړzdM,kzCR q5oj7GR1a;ӛ4g&(]!ᑕ3cħ>3*|ݤASI\w5];5Kvm$FX%faŇxl"w-5wJ;^.AlfS+g/6WA"#UW؏TnGCnj,kr4Wo5mջ+Mu0]96}qǸԜ_c֣w>!D%ɐWO]n+~<w95 BS#Z^,x; ViYuQjaW9$ pح%X)`VyFbE!kujc f63y啒&e9M|cGP@0RRF`t׉4T `h uϨp'L\f;0!IIeKq8 oAAOz' HEXo\QLt4wROH* H?ۉquV;D_~D%Pi4\7Ӭ$v >ㆀ<߿!7(v u/ݐ8a}!p$WY 8>_O (v?eW*+sbV *@aׄukеλʫH0P 5 `KGDUӴX A1}m_tPa79N7 \kqۃGcExDx/?UxaA>"b ||>*oL7b.tJ'ܰu[Kz0<H X'1֊z8Ƿ ɵ͋>^- s%"?]PfyjC]M%j r)Q2DL,#q"t]HQ7:n_M2/\tс  0o1ZaySKͮM'?ȼepn(zj9sͷNs" &-@'y[a@8ɰ%>0rIX<@[r5c/-Y)@H T1Sk H^Vk,L|8TË,!x*+9-]7պVl*(Yb:H`;'N""LQT~DQˇe1 @/]Prfĩs>WU!T9 #1KBm}6?p[y!p%D8‰6,;}p 6GtB֯"_QEZ6qvX!!ᏯDYfRyX#k g"+6_l;q_A'@E%X{VʍB.2c HN$=zc҄NlWH"+[̮C>!\V>L&$-%YP! 85?X+h ?!e/[p"%I8Ȳ8P}75g7_Dn+ȅԈ gRʼntQ` X6!#vbp!NQ_IAXry+~"dpYdoQ"Fy--ċ. aW||^8& -Od>ǭEo/GzYWF肿-yZZ}ݶ+7gSҼN%usΓlsSYyX{޾zUZD׏Ur슰_ʖSfGQϋ QPɃر(;k9+|ƭ"#WeOM{Vo;3۹}ޗ/@COA-t DkONK43Tecϐ 0ͮK\Qxܢwg0^4UͿosm1#jxtBv=CCP2_e|ߗv[7X{ id.$Ps`Dff88#r,gĞ"ٶ.W4{ñ,ϑ-ݬXx1mdR$R#IRRhڮuYz@ȆS XDmmG(@wmظн@n;U*ԊEf쯮knK-6NwWL6LX> ,h mG"w6ku&{kVHLJHIJ\'-Z$(XJNJUa*"*JʅHD՗\}[!`P$BGO6\=Eq8H.<KJZ>|cUB%-5Er&9RXN|:2x+GX'jbRy 6Avei{Fz\X_"):SIs$#@ pn+54.=)OIS|ptfܨl;NI+: fw8>@&50S_x|Q. JX0HKɏ3ͪ$"9sY#p@>ڎvd?. $yzRr-F}ݗ*Z2!)2_uدSY xF}PI&h@>"ZC`|Яw%tR;~ ?]'#Xs7"bpï_a4x%[r׈u$|6QVG28>GB~ k= x̏R^+ӗHSB)pkvuߑhIzMGтq7#(Ndts޿JٺAnS~Wb M1k@9ӇU'>gc8p>~#!J]5| ?tkN r9=PpSŢejU'me4*j,eˈF^Ւ >`%gE$E=bkJxbV xa5xuF2YHC{$:?Lf7oI/HF H',ιw̡$l2ٵ-$6nQv!ZEw *-'uYcij5HKb9NpHWr},uTk]et<5‘u.[% NҚH3}tݲ90No* pfa^={퍼EܬZLU'P[e7W@n{τTr|w7`b}?I\1{5$bˢ5qC<gOl3P45ܝ*㎻³~ň%Wg-e+x~GԂiS𬔹UvZ)}Fe*[hi:]kxm>*“Y2X)RLfW3Cb7td>oq-ce>.OIyJ|rˊr<~ o4' p$2}M^l;L;2NUg]TP6q׶=0qB?-SVpgL(yYsҩ=]{yɎy'$A,T*v{Wb|Ȯq!bѾlH8\(jzfx<"aHGX~-y Xh<r 9<:đ2|?Zk<_Z,77qE현7YIWU.D4hQyI?:s"xɫ"wԬ39.b/{9!i2cwBé:ܙ<M'{im<d>rϰL;/]x݁( eB5 b(A_K'.%sf=i?~s;w)?|䲭ɶ/vim]Zkc8Fg."lxeY 13m1/޶;GLn,3@sW^5~]hÔMIuO]1p?NamHևNzOql߂IY0r\veւfՊήѸF݌̫6+Ĺ]A9d<6[(9CVԞK\7dߗ.p-`Cp:]@h ;Ng>t#` J+}k/~UIz%Bd, 7΋+;:K;f+ ;dWcё\WǵP2 E"ehIس-Li; ЖƟ6D(c&ܣCbeQ։K":[3fej:ms쀽VVTM#b g=m2H񀪶 C:DpgL*]6i-67pL}s?Noh$auq5AU!p! 5V&bx;9GԼC/}t6>l7.lp@ ۳u%:-d"y>9N6Bu-`&=Pn07 FnQځt!+!qïz n,hM^G 5z' %w5Et^̓n-phKv)!>eL0BWThЕJp6]쑕 4:]GcA7ر9_#Q |#0~A4D1O}JChL,jŃDPX,ؖyNvt_ װa{zfegP_˳7nB[ߩ6HmwyF3|Ys|ѹG-W_Z=Ywr{/^r&(DЬD (&[66=F'y+37]|>x7uUHvͣϗT(vWKo[yIUe wsWL=ulB+Lv!&y҆Æ|8.Z'1GsVkȽ=baiPŠ[:_?s#W\d$i( rYFұGwNE)tPw1Ĝ+qmM Dtpgَmk6P$׸W{ʘ{tJNetߝϱZu c9Eʶc)'XF(˦<.!f A>=liZN:xsaCpKDs]k&ܡV{&YF , ,#Ջg572gϻv%Ox_Դ*qdNcr0+4XE:\ä7U.u,}4SU]S]hf$JN ! '꧘%ԝ ’|Oq@H~n!Z@b ò^7`Ƙz۵3Β*̩W KTbC?$0΁kh* ^Y@xC6dMA  }ЖPi=hUʑjte Lng.#Խ6EeʼnA9:`$_m6(;uѕ7LpqG@,ReI^%F}AH%~1lW3Tf2s-7!XɍZD[#x#Lg][ &nHT@ .K *,0^#&~_8n\J ;Cv331Zӛ@D؛Y8bKGδt (H@ԡ3EUws7[mbC94mYӹ@NJغF?'x_B@ٹcRl|ݫGkѬixHT2 i%H~|)-kA \l!ٸ{=NfUPiʨ < վ~%bL?QEf5:P0^@p \ƀl/ u_Q-=}P?S NBqZr. i -[Eʒ䇺&NBd# Ͻ|.4z)HUUsK*vݑӹ}n*$W{44~#,TT5a.+ tH_bODg34M,> hfJov|OwA0=j l~ K< @(|E#j$G19qP  .eTLBɞ?԰#um,_IG;UZpI+>#k~kj0:W an:o349)GװZ`uڀP#kʧC]-bF GRy, ۶"覥x;~c:׷}as_G;/݇T\$#qO( P"L{Z9'Gװ>Bh]\MlՒB]u!BNh-8-ݗlTi(+D1[[q UCFJ($$ێyuDf+8HB:|\Ml8 ٳR$Ɠ̈9;YBf52kƚLkQ5kSd}@k>@YgM䵖"te ,$w=C(iQgCex`#Vgɲ9g'=yϕkBg' +LFTaAcn2Z?\ >u Ҥ-qTRky *F!Rq$ӷugP˘%kk`r5~L,zB#,j RT;pB\K% ؞d`jr(tB0O{%'aad 脰!$X0S";$2B'8Aۻšb:bh$ B$!hvݺB$!hPB  @ z" U= X66.0n `ABw\&(@HJB N|# I NB{l ABv7CU@2oew8Iۖ-.&*Yu[$( 3E3xܬ?!5|JF!B K^ri7KmoMbTw~ks-gLTZeX\8Y\[j5\"kY|q` `Fő̀>6qzŐ˶(J]r584ikc4jhؗp2f;;?6dͅ~hy#wa[El77G]\ r'zX}543:Pw}_Pn>vGx>k#%{uphY ?||2l#dXg1)5Y/‘Yz? Ŕ9~2nf7Ӗ=c~d5Lѷ` @pzum^vٲM&amte6l0r}45mXGLt:& @{waw3Ih{mnq1O@)'yெxd2C gWs8:/󯓌tF\ 4ƨ{ ;moÀ Ţ0槂0ʣ{[YސOch&702h6S#3\ 6Jӹ8PJ&4/tp:@&':7 m惠ctęC6ĺ N:*Hb.Ƈdمzv!߻.{W` u/([/9u0gr]$:7[7:͇ 6yșD<{qw֦?Z@"Z2zk!/z@v?:˦c왡Z wL:tIcnsy$Cfb6HU7]N{@CwSUQP~"еk@ !< 4X8c@up":@&Ӹ|s[F|6C{4=4Z)ӱZaj<N3Š\YC@29m}tG(mȾk׏1`c  `\q}xp3ju2.H,=R0`  CtE#>3>v;ǟ~b=>Gv;#EfݬZSHe@Sﶝ B.s)3"zB}}GpxD8`IJw&}V>::95 `}йqg~6 q{qlXZ6LNj&7\0 ²s`|G59v= 2#| 6ڻu<@1qti0fڤh3@"07.%v>6&dq?z)l9` /$tZj&*@?r} jhi`eo+7"jYlZr3xQ&*(G%RdL}iqXA~Au ikeD>֔)e_郾F"֦;hPwW1,:uL1TLO~w4D SD  r53Pź*| 7~zFBkk}PZ/$=J@Q_F|arO9WŒ%:jKD$1,xyƒ"ruhN{[zFУ'ue)qU~J*!e C*8$2ș!tXc]X{ GI:&P\Q9דf̥p?k,BQV2P'ٟײdr Uhc,ZCV7B T]_l͹ gYlSL]Q"AٝOkuڊ6Q jMp]j {BVau; E<|i ]DTMAZpļ}}wosM;+Ukmo)@-9o,HiqY*"6rZN$HdʬNsZX">$f$"w涤qvL:릝4t|%SEp1$$$mZ?J@}Ry 3-ǽ҈2Z?j7SٳwV:&!.GA:jKѷ:3`C>ej}R/r/ALXS ]!dM+zBc3J q%*tSSxD 04&ǔ-J24T5i1[F:LLRc9.ΩtZ6?G7OGeUGA A`tjA,*)Ad6ĀFEmpAy_l{iRT©{$( ٬@4f O LcT3rm>ZSDdJ&4xb| TSf8Xb<-#9Jq[jswS[DbCS[ČbCS[DbBV9A7㢒ӋB ¢ț554cNcDLc^ԄcJ*#Hbú99qN?;ݽX F46611XK*c%5 "*x`[1㚊E;Sz{-gNrY:f]H%|FQdsZ|o"3&V3PKaE5uN=6'1"wq}xLp!YqqPcM1Uch2BYwZJl (FMKw*eٱ%8zWŕ"eY]Yf'=)ȁeFCn^Oc;\'AJ;nc`T-s. EV1w1? uMQ'vGRf5h7P:L%%fv :lOYMeWjsq(-0Hj5;i)2P9!z䃪ďt~Ť Q? HنяUBTjeeFǴeGVBP:K`KQA:%Ĺ.3ՍHT/qF.OMDR'E#& u2ir\.8 &tI{xXcб;PwqS k%9b{@K=A a+ Ya .OKvt_7$2da(Ԑ! !ڠe희yƨ ╃D]- . 9^mp"g0e_1zEczϵ:̯SqPVk _XRa+YBvh--aqY jBʙR&9ЊR ?0vmDY BrR&t&'#+"8.7D#y1AQF8:Tr╚kIϰ5jKI-UQUe:4x19^u+c!䧮R@7,$6qՀJ儠`lYEgǪRËS[m%,NJo$J88+"h\!$V@dQ' Heh,_v99Mm jE e`lLJ;@DTMSaD0I(6ɦNdic wiqN#:s=\;Lb<ԳʞRΧk blW"c<™oCtS6BOlb~63sM9M7Scf:PbpE\HXCD8/b=k-[2,Ҷ@#BhYrwwrn5z@OЛ NXSRgCrڽ󜄹wKv]?F`r*[X@t}C>KAP`ifSΠ Xқurw, ~Y,A ꂘMIB 3ҿ)YtB}V` ʁ(#> 0M[*##@`C`Hm~"`pn\BsmuaoGz1&Fw* g wPU=b;((sBȿ\Y@MuWOӴ1v@Q>:>o]+5:Eg_ E˲t:YYËuY*.$Lhx%vq3ӭ d\1HWߝɤ}R81- J"hPCvM鬮2 ćkȖ}55i}6i{djvFX:; \PQiz+hG7 9Wpj-Stܚ}bv?F}O=Ĺ=Ps2Hs QVdbb(5<ߌ#96Rq\Mcj?_#Y@IIigg4C@2Ui*j?6˖$G83-qnٺӅ6"343pgP$@eNx;ts qu߂umv_(mǥd[4Yc!U IU9ʼno4x`fdwkŭۘ r-.@! nM˷I$I)M|򗋻Cy1ʹj}ex]ζ\0H~y=O8~ypj7, KȭUgd"R[3*;2 Mq;MXָyPqM`t`/bܜޏ@]Ͳް02n$k=]N96̒Ŝ0^L\|I 1eHb#oˮ׽E\ k. šWx=>S;#ɲYF#ُ^bLљpLy ,]R2-F`N k(m~-*C"Θn+bJ 1'n5R&C(~tדNwʊ#'ww-*c&fҖnGHkG;S6ʢ Q>oj-*W$[2[FS`Бq;w|m%FxfQἊP-R+4.ԓcOX Eka"&v$9 Sp3Ffw~=IO;J2A$cUp6d0j$/QwOF{'?S%.ErK(UvIEM..4V{Űug!ݣ2 v=*lzۮl``jfDL .Il=]r| S2w=b"ug(dkِ& +dҟUHPRF$l*+{QccsԏU#u!EI2y#ɉm ipq#[O/7{x"h;c.5R׏>΂Y=;3XXp)4Nd;F? XN&$/Z/i2iA5$#~t9#88 X@ֿO $y M־ۚc (Q`L ƍ6M\a?Zoдc1.TvmfE妔XIl]gĈ-Ӕ)Ew1MTjT;*2J @=ὼv ^.5zfګ+lxfbVF8,FH?ւy2Mx/) ;sRM)nHKiQUfVk PrRmUol7Sͱ$*”–g`9ZKoU(.! N.YSGSSܶ=˫>Zf]W3HjJQ7ni,U T>HNAהgؾJK kҭdS&OK&)jC$Sϝ Y5zɶlÈ1*:أvEʓSzx}mݝ4uQ  ;}a9WK3Kܐ feiFz?~vDW-Z6nJdT lsj&퀖)4X|}ۉ-IpqOo\nӊ>07 8(E@s{̏G^ %t\ܻ; jX:<~y(OQӬCHKף$q(c~,͠3H4!Ʀg+~cCBmp׹F SF[zb٧M%S3ѼdIO&Ͷ,秚J Ƥ: u"e}A/?yёYMPƉ>${U^Čf,PJ*ϑu<2b%Fu؞꠸lli.gBӘg:t 3_p<̋'_;!ԼZjL.|e(:99f >Oݥı+M/pB{BVme[ĖêQj#ҙU}[QʢN%5aP^'9 el6?v&̖yz2dhe$5^#Ϥg${#\rllm o8iYdtrVW}u-Am;m2 ӓkv`@ L(@'Nbw[ g f b`#K7 b΂D\}ފ% dIxޏ:Gb浀0ǢpOf,77r ?U? C#$Nc1,H8Ez;ФPxs% Yubco#=Wa 4<Q,75p毙FmƖB,|a]s7EYµ( NLQ$jGa>8(N?ѳԩ8G˜If!mNۺiw6tS.Y xy:@w?j/ڬz7mGy1WE:plp~ :9P̿べ[ E,r^tfp#H7q|2d0{ox&oc,nr9Ta0;֓sĻzƌ2wʽM0)J-A=Oa5?OTOޔaqװL݂-|OFy25FF9BeiN} P U)1叄;Z?vͣK]sg6QihyܬM; p2-(ـ{2/=]^uQK YY~P)$q2cSߡ)w(XX}9q]%E1"pwq"4C!7[nWqg<ѼK)uNѾ5)ƕ_iUz_h]KI~QUy$YoߕI(5h8qK̿>LqI}?Ov|ןBL֫1@X-qg[ER1EG>\rJy}w7R_<ʍ/`o. sȹG+f%5ȗjPu,/ؿiC|=By|l l>ҽ hgV ONu(yH>G|."˼=I'$&U6+]V^XnּIΡ Zl <+BM`49V ܩn1= }J)q.䖅" `}nl=M lbbY1001h܂/al%CNq P)c#{DO9$NXHR+S: x12DGM99kNUIN |8?]^' D̜(i H8nݺDus}7~M C뙿$U=7wX 9!FKoҨVĀy5:[:U6#Nr[Gրi HCб(xoVf*t$Hi杭E2>lL[m}=8F1V(G9(SSaUٳvGƆ+}l2~1X'adAf0Ow$.%FXXvhq9JPԈ DN/bs'CUt 2M0Աs: \{ Rr5C*%^ү;Edr6ֶIb25؅1:CkNؤaJN%+ɧ\>T:Uw1ȟMIJklYFR'lO1C/RVR=ufMq霝 y } M>\^O[~aM将`ʰޱְ 7f~ZNKiÓDeV#_)4 >(u>`ehzM_A.}łxk^yրm0>etkԇU ]oN$H/|m 8hˬPM',1 ݁f0z:1F|vSQ:4O=vmJ]1^>2/Ч[s3Vcc ¿ƿj4>I6BXc9P&P;d R2[^.Jr`T1@1YTN_CZQp/f63۹nyF=N2<y0qb\ve#e1n\Ȳ}d~Z92Bh+xȭyY3G,3kbURV$4bb,:^W87\9,b o>DK뿣W饿5 wR0Ck,>Mq.nS@A`7||-%;=ܟwԍBHrPm|6VNen,_UҘHxe44P2^Ui>i,+m<8@7oAˡ'i߳@F akLiLw n&MUu[^[~o&Z?#[7Xجֱmd׶+|Y-1^X6c PL7|v!8'Ҝ˺C`-k"6[uk ib*G>Es D Q|{Z1X|W撟ܟQ詮lR-`̊HQA$B*4VZ1%"'?%Vw@%*ydQzz}gnη=RGfx֫:V+cm;>F#0:#< %yj>+*R!0JgBIhHeˍ N߽'(cWPX{=n|W5"BZՐX~HVikWB%+)?*-T&Se;D8Ȕ" wc6󫕍PaUtkSzA*Vc5">\ 8VF8QH]_;I1wTEnREU r[@kcJgCoe{$doe/jBݐ)0OgB 3ƴ hl#uI|qxFr{~p6rk d1ĉ= #E_ &0mD@?#~"Cu 'V}Yw X RkF?iX9׸|(/lF#M=[*G?gG6^< '}^zdUϝiBQ 7f7k^:/>+x+ Aŧ\2,?/bnڳևgⒷ\輍oqC3"-16z擓Tm(bQWs5)k.l[:Sؽ;mqp-NS7Gd$!reTTT ]*![xPAUE@sHG;u ZVP*͔ ӡҲ7mr5s+Qw) dt!ێ'(a D]O 0`9s:Ŵ"›{/lS(vH%,p6:8 :nFg կ0{H 0@vhYltPo" C5x831 Hc Lt]q]=_90\60LRJ?/pK0jQз2cR_V? ?؅g'$tWÁFS3y^g]?,=JzQp]Utc=4hŬCNjt6XM°Uک 2$!{/JBKFY8-킧ESNQhך n3C:{hTPHǐ5xm~[M8S|nAbF˧.TŜcZ]9 3<^3ۉ)X!]˽ĥ:[qtuEX2.&b0C9reB?R1Z}ڽKCwn/~8ۤ,D1$M3!."@7ӱV[:7[-@7O˜]qs Up1I =hKpVM|VYԋUw ԒMr|w TVuTu5oGw|#_,ЇwB&qM*ր-*>v@bDpA#S`z0lX Fk؉\G m[cB cYxF&ne/ċ9-'^bF[j쉟D#t5Q6󏠾^k5Y75\L<W&/ >oG9kw`x. _&}/E% $nah7&z{s:oKKguv~o\!ӏ,4渾Ĥ?~F4~\Y!R&v u=u[M}BB%bDΖJgc!ZU( ;B&SdIyc=ͬ[H&Jp"y22ۺ~ zAY^?ZՇ`C9 YtFKdLzm\.b;3N[wo?3{ݒ?FL-$V`'P}p;bJ72] rAT\ԦI=ӬO~fgWƴC9p+*F`*+y)qS3o[A`J* yuq"+ww'. O__@?o%xn'6lOpY4kZ@-JMk᭭'G?=Sgn\9Y7Ԣ: P:uƁBgfW!ļvS;'gU )sџ?!S*UkfG"eQ2 _.eHCȝ̏%sjiuvL. Gwճ!x_VoZV4dX|#]6h*SN"?Gk4*M Uf%*8,)r?k] ̛-↥M$ȟ0m!!¥L+d ZpJ$-F  K@ 4DHrl5ͭѼF3,`J^>'NMM4:^iE璽N+_!r_FevT[ l;Q|ي)P]O/MiLw7īc,'󋯦,HpgVҁH\}Y!v.yn.A?7\K`cePoW4֞n=‰nӿ!~V|;~`'LWtfWBuR8?+NO=#VhB= 8<ב|$$7UJG^\s}UnGȏ;lu g2Oi-Va> |g.Ş(c9W lQk.I $.~ҡxYE_T&Y$_A7 :Y7`j1mˈNg>fh:s֪Y%넶[K:|JAܭ/muIikG'XR}ɾ:7p("!uk9 'mkO~4D_rjFM[w$<#"ڈ,8ByDUY./8Ǜͽ|:cfWL;uC7EEoL-]X!O/V)I/ĝ|T:p:X2d{7}Oяb^8Z]Q8mlɲ5"Ka`DžiW Gu%iz6dR ܕXd {#㿺С'/qM#Ɨ!][3Fހڊf]ا|UIN`XmHc,=k*d#-tc_$+Ƈ UvDV$*5HOqY.v A^R2V_ 8dU"ݜξ=$Z+1ƽgեơIW*&{1`6y'a TՔTx E2Xѩ΀)uP[4 Tԡ$2\1}]v/b=d,o[U)b:D`} T6b^2T"ti^e\ :_'1kGб[>8jEXb6# -kbu٬jD;|5: \XGmۮGlCTg0:i bX yrОK]8OAyiku6i fRh=- '.:ܰY4 52V2aqBT2Ьȃ2ٍ\SPs+HN2dtwߙOH6ecpYa%γ3C/[l>$̅sLHRMvM @8g eU:In"-% ʘa6@95 ZDҬ ;na⪧ާ\n j-cFy??WO՗i*sx#E\w`x09An(^cmCh'ہ?\ݥ JӔLhwଥ 1Yv3!T`XW`Sh&{Hހh3Sg}mFExuOk#hRa]D:kf^'G0Q99^-pK/%AJχ$\_NdJ{u5w(5A{yNf?U2CpǼ=yW#1SlL[ڦ-ڥP8B]RAQ%7ӝlA=4;_:$p,<77Eꬄ29*,`rfgfζ[\+K0|:JetG='/җ.{6"q$,D<"ن%qPQxY˲/ᅲ!Fnf*9pbZx4&&ct׾mp/&6$B~M_)3|/XJ| W ڋZ6|# j sN.⥃r|w֓9L 5;ȬIPrqsV5jp9\2}gSw~o'!esi9{qBG iÍ:* {G,>ZNGUM8˟dzR΢Y-EwqN. g6#&6 쭚Cm 5]1=ӣV 0$[,ґ@Aztp]D2-Z@ >\*ṣQhiWIJ1q&t C4z4BcK܅YNoMdq!dib1n#:gn0XtCY7(Wyga4Q^3! ̸DضL*qxc8B8tID}zl̈L)ZI2/PK_CzcnĆV@70o=-xByMCU)͔&K8Ӻ{e5^쪪ˬ}xa =QǠ,`jmx3k;i z[Ίn*Kj/e-f[bA*7K@XI݁>Ϝ9_(־;;.#跮Me U)C=ysÖA`Aадsn9uf4|;rf>-*_vȁ by,Mt`TqZUBNjͼc%SoƖGIs4& ,$'KRC|)*d#7MOߩgNbR`'tP*IE) >X ݆ǡ(X_t V]J`K*f[JBv$؅^ r}&S@G7au FaU}VWyn= TȀ1 uofXBBp9sTRW,@ʸ>S0؝ezLR|8!3`mJşUF=mê2`,i]2vWJe[jc:Faje0H|%˔E%*CigRFL̾73g$2=i %E[GvuGdنHE_{ BV%_C >0f@ՙZ"̍,' ‡/7=>} &6ozmۮKTv?y4 .fkb7CK/Gqlp<,(WԣD{e`y$d@]?b2?6rj(P(DH`MMw\iܻ"RUɪN`JGv(!gV*a~d:jCE@2f&d,0winUZ,:UM ]*IDih|4I (DƄŰSbq_ pSKmbym 6i&8ԅ/a@j 8 \j[\YROQ :Lrw di(TxZ$:o0)6ݴHYJ4"IQkٴgE5x͆[VaasXHrLa:G̓!|dR f .(ęj2mՖsiQQDo@M<=tVtlPfmcuj5<I.{2[ާE%w{ xUoMᠬ9> LWi+B0,GӰy#7q0Nyǃ4#pwMY Q²TF٢ˡ*X Ky.4eɦ~&@ ]AVrjZ:9w.)M2)xP JGE0(֗ 9¯)2 , Zi1롗y ]Ӝ1TZ)֌ru$NK꺆<^vzŮ&n?+] 7D&_p>i6u(ӇcSfI`>1:35sݻW/~+;j8+sX׼ۥj뭯`o3_i] 5"9D$kՙӍ Ƒ^d {J2nFmo̤-U-,z둴[Xk3` +,~29 ~{w7fh.؎8a{|q~-9pWW2O< UEu*}H°-kꂅߨ3ޟWi;ӏ2N7W-;DMKE/dFʭ'WLB1,sj\2]ڵ^ݽ1*l 1/~karD-֋r/}͎>_P`lI9FB\ÒEe=HmKRQkìy;HY`h\<%?Tg!Ӗf# (ЄޕA6%r[cZm~8_" 7͙&l.)[%QGVyX'٥{_ ”=TShcw܉+F؆z.# )F)#ݍ1ͿbeOqZ՘k)$˾b! ZL|r==ʇK{ymVS*LuPJdIx}VWL MCU*r&:Ad Q3,/Wu!z/ i9Myf})Mo܁"qQml+At]MM<#Mhi&W<+[7}ih}IXt}s6Jhu{Ν[*5?> j|ww5U?8`3g#JMYT0T!<*P9>A;_E("J P^XY7P3fy;gbbZx:?Ûѽ}slx<4Gض mpudXq+ ߫G.PYn9kkT*)S]V.ǫ+p&[tSW-U"Y@ 4u&|S}Y:9{Oybpˍ2Dʱ?DKLe'#RjgKU$q1Ñ MMH9o!=1TV*~= VmT&r@/ 3}*SEjEi{£t9.I 7[t&$ ^R{gA26PEᩋg!9 Ms"E @lqȇhlbh@!&»b6nDzqވY!Sm(, l9pF$X*DB6 JR3(N[Qp 'MGC4$(fhIJ3 "MNm.&wP[:xDŏ=:p9<]I Fcٲ"5O Ȓ@ى^bFU [Á1J=pe܁`òYȞyCǠyB 3\D oM7o!}M<(C\a"i-T)?s r,1 j疈OU)PV9r`'@)q8a S@ g2'.!/B,QdN5t7zVuM=~OioN@'NcB0bsٞPR PtDtt`W9"8%_ᑇa'%&iX_u+0gtN/ˀJOm3AAג6䡄H%f \, O]t$s\9p< P#gwJW"oB@C ]$LM8r,3p^$!erj#E$[gAr'. aw 3=z郹ęjzUf&`[ù2D0 pw&1oBgj~gH:0 k XNs.i=Фv@Xv:BQsE%BF8m?>DD?TDcMEmnez/9N@nıBZ#)R/ޛj$czfS |k&x9Fnz7k=p:܁FּrK| MlUf%&9.Z)qJzZU:]Lq,qsN|KntMHđx9 L@GD#?7u9ߛyL7 ֵ/U(E98&VD!>#…E-(!Z@Ɯ+ּG.ZEV7bDַi[:=)P2;' :^R~qѢfw_r>?].Ml;mo-3:r5ϝ<5Q9j]aY)Z+r*~uj9%V:4ul.MGs@QQA#.Yc=+f.!ۇ3DNgcHǨ*8ߤ{J>RT'qQZ"/]T^.[ؔɒC |DȎf ?wwXoV" $ YyffN$FPC7o ]-&tVT,cRR/ǟߪkx5~kֶ~v\ KUU+!0+kco"JU 쐥{ no{Zuj"bͲݤ=Ǖ)&s=Z`{!L BmJ/A-**lj1^nկk J7Q L4l6:ZL\P8cU*P)|<6;;΂g^b]w/\+'ōqi\[DCb7)mΈp=]wRUѕJ_Քf4X%$W^n[K=o6P'ֱ&:)q`. @f/3<89J|4/^ۭ_k십#W썇~ȸr:emXDi;楃1bKGgFb6'I?+K7H$w (|QQ3ݨNCYjݿ#Oh5"5 + ^kSbz!7 OÒʽ@ц ptzT~&]p[_Ÿ1*F,&Vwkuo&{(߫v@x݈֊-U|u!u0y>B?뫏nظjo _p;InAGnlr1tAsH=V낂^nj .˺AO[H[RcxFƁbB== {yxaU抾^5A2)MZ2iZ.8e3ktmJH9낽aӾRx;h!>/dz 3L#6_i`p$y_ĥJ&YJMy)A1qB(Ju o0x;d^ʺ<3WW0r9a;70®Y ?;F@]]_GKJ;TRQ< <0prb:jZ&]+% 謆qtc#u|]]ԤզV:DGP .7{7OO6N24N(z?>T#tTzeh_,;t?m|z^l@m5g?}"Ud~\1 *03xy%>/0C( 8_p"zE`F6 /Wo ESvfI"h?b'^3 QsӘ0ru7r*pOb`GED`L-x\z 椝T,ɪ" t= +鬣:]^Jy.f@p }!PrsrR6fԒ6:R%(ynwvf+1b}}ʊ,LY;uu̿WSi6/> ql*ZMq*;2AN6RbD*2-ym5N&xi)ۅSntD 1pB h~DEkoXg!>&D(8}EpjzZmYL|2Vd^58-溮 0V^( juךG43/q^?M7ZgY;GἹv OUcz[~'2T7=yۘhC}7*qvmw*YҝFJ찁(+D1sjjMJivH.TRˢU,u&6A)95*<|%!U]!w]`N~'8sK *른V6/`9N"[AcއiNէG;WH=&j9 cYJR=-=/^d#V%c'}(\ ڿ6 @?'vx9 $_?yO@,%ߦ?6[/>ZߑMds%T&{ĺ=; K捉Y9t]hD##G)Z>&5yE6Z׺Sr4ՠ}o%_ƑO+?/A Ν>YjI#NĊi3;_ fɐG(q5%, ^,Q/nFr|/ESN"*P cTxVЄơ[&/ 6WFʰEC9$EFMӈȧP8 9Ɇ"]Xe6C8j{M_<Lo!5S9:FMfTfhEf 3܈?f~hjEWulaIkL福t?l[bX]; 9㥿E}Ue8TO^)m@QKL}@'Pb4fBƊ0DžS< \&h~SD@)!S997~?K$ٴLmug"[[Z b; ys4R+;ceJǒl֝D ;'$q|KKBpe}Jٲ+}(oDN36B2.Z#ݙ` \ST/FC e/#CFd1zkє%ebD~+F/(%,oJ7_+%zuڿ<ʗ&.t2u8eTǀ9JLκ3[s?[E.g;餉77}oVQ#{pJq!Ɇ_i8s8+V+Az?1A٢$qvoi"nK# ]) rpzUǐcq'L<Ht}Q85h1l.{J)Hiw @qH$\aH"Wsͥ:a qzYq?D쥨gYn|- -/%ɺ`kYy]"pbG(N xNX◁O7!nYK|go*>G[[-o\>WYX擿b7bק)g_m98m\n[yRE;< =\liզ->GqQN,N}NωΜFTrL$dgBгrM#iQ{Uz!eH.MA<ɵXC4@-9$ >: NT'8K?dfE{4"}1U59y9MfEDcիCob9x=e}poDnSZvV{ UoDт`յ2̃V$H$uJ0ʥ"H/G`hoRu p)vl.3'XjЗ W5JFNFCŁUQPqsFnӖ>b !3~؜ cCqO~%|.O1h4%vq$ԙ+;vzVJſԄ3\ b+4P7BY1G$!$ZvU~}ΆXv{^Km ,5]o,KN'RF.SsqM?W$(u:@19ydŮ^%Z@]qDlG%Y) (l6V͕QOЁbלYXT":%g979j"2 @2DLl p("띯Vٸ3Ul7|k颷o2AP6,55=(&- i _W6"0AI%=bL4~sS2E~߸(iQ3xM`_-!*'r䥩8-Q ;5Ez%HU2U f?Z ´ed!fYMPDېF>ZJҵi*D{ ̃c(IUq*2T W!)K{d_BR=ea8p$BXuMz,0YorТ2] JmtcA㕊K۫\f u%tfWnemn)v{87X^7ܳq\n,Qd[?/c4w-<98̋[Q ǜTwC%%U~oL 涗_Kp8ݏxk#&)[s=Q\ѹtO?? V orUy{Hά!8rYyJ.c.KxJi]]OC|<HGEW~F'D.g`HbK %gD圌)Bçlǫ`¬<rmk0AZa_Z #`șJE Ã~&I_QG֍%9(*(C99zD 2ܫkٓ&Lѓ(*!~>\0I |B8CלS۵Z܇o??gj1CܶNvfZ0ߘ%VS3k3{j[,mMcxy7--p ^\kDvH{!QϹ_zښD |K'z o5mqhDE1&.RA[Zk?f]MB'pꪝWFkd m[uH7VykT"IJCճAuRmlHɠUW^c k/u:߸/pkeh{,2sz&}vrKXDQRƕ$Zg}ف?O;k ,9[aC`;EqG@RFKlɴcof:wL> 6=/R6,"@]+ҿI&JIב%VAh. ɽ R$\%X7PFjV ܂Grsr.s93((YF. 'C~e SS嗸5/.Ha#h> LB?1nfz F8j𝹕Mfphкϱ͠fmJ/9O5{%(XgZ$d= ;5Q鮾TdcSgOx\"e+ƦIi+")cvnp+$IgGjf[fF+SBQnr!9Vϳe$",9 syp2o%`LF3AM40곇1D80Fiq_}rPHtE}z)x׀_?1ԤcPQM>Owg[X]m`4Q)NI#K) P!j!;yx;i@4uLRK;^R$& F%ؔuRxhYUVjMA `p1yccfo-'VعR 'G "^%Ri)FCde$9bִG]JI;jRgI:u7ծ ]5 H C8ɹ积Kёit@֔Eivzs.bH 4@ ,4`3L{C`FH츐q  dJ_#+{F41M1n tѭP &߱\,01nBzD4D=[{/uIJhkҨRuzssb> -͹ أD,RI?~vAiFenjjNH66 g onocnpa֌ 䍴.5Uvfԩv7?}m#OD3ߤ2#ZYLQuk43?y_0 +ܦTEYk߼ 6tù.Wݏ6NO|Z^A=IOiky~X v%UBeYJw+HeDY~tRRo4`i]$LF@#ɐD BsXpD}1%yR\YFbS o㚣?w/5HWDt=VX Etp663ڲ!v:c /?2 8mm3D6ِyn5{EFK LC9&fdaIvDv,2UuS*NI(#՞g풘PI6"fWofl'!`ăWJ;FGP*3tϛlzJTSMAZ9ڝ !:hg2Z>2Yq͇'OLp j?ً!SqaҴ^k3;sgY5#lVvُD}Dsky{d?+ՆoSZ 6DҖɹE$Fy%W<172߆C0\\sI9}!7P+TÎIM3C%#h| XWX(1yӓs;.v6mǔ"O¥Ō4=x2Aݔ I5 uf-}FɔFŞA#v-д(jK){|wu/JnM}X?^_tCg-wTj؜\~BEbDkBu[:PQdr%ժaDzO71_G(JmtI9/U-UiB'd e:$RMLnO &x@; j˽|CJϠCӢǠa(?H /kkRPOVkZWT]UB&KT L.A+F[p6@v0VYR M6{VA?:nnlmg܈f@a L阙ް:׫q+,GE?K1E^9LO FG~@[4a Z\9EiQP\Og#[iOZ0Wa{zv<@v6#G8EH^\1uPf{=AMFb7g̜5V̺֮Em-Se#ʤ-'n{!$͸ 8j'epӋ/SZQAWv5J-K?>tlf= &]_7bq2n}Fđu/num&'S#gȺ@ZleNaqMXŰP% =%d;xə|t!.&/='iIZDގzYIg7~leZ;˿z'ajsf 9giċHw󤕊 ȝ&.5x::($g-Lqܗ=Ab*,mkLSks=C X:%N[߰` x='B vhZy|O(bSM. `؆%ֈD7r=2F[}Zh1UW;/q:6m>ЦT{'KFlϟvC3mdß+_2WCϑ޴)S*,ݶ))T|֤ߺ;N`0U nw(3xKWx\5zV-L^m\QN61 L~3Q.cf 8 vse@&T,Q\[־QUu mDX~yT]ˊxu_col SnNivreoiY[9htOu.݋{ Ɉd\^Fz;`RphFe g]AB©vn-Fn3nxiC4Tiucݧ2šI*ʹ/*b*9S_'P:5ױ3\'s$]Ǘjm6]vr铪ll ?8D`'8ݺ2nv÷\͉n3 m hPLS~}J_hb 'a ?^bE#: F{8>Ӆ9O.WA,crSErh^LޤE.ZWqmjsy2ʤC7;MPē@a:PkhTG6Sydpo_ JlnK;;YWO!5멟Q7u7?. /ATj_a&R=/7KPavu ٝ"Lؙ@(|:p%֜xĤ|[zI 8: 26;`jJTu=7P|@zr^+օ lu#[~\w ֨MIuC:aQ4,# oxpn,t~w9SIIUͻKx.M|$VJ'D,F K㤣ONMsmhd2꟣;IGKo|m`}OC9b t:aL.! 5 u[68bu_ -[KbLZs&kwM#j"K'myo6C_ery^^Wփ;[-UpZj<Əb#֕@!j yEK+[ݗz"xfi*QDDL·-ˣE;]$H1,wK^. ͥMO'韛 y =uț4SJ0gK-V6W/O{vOTk}Sj;TnGol>#eъ;R$miP RĻT#E_ tI?8>-~ oԫ3Sp?ncTacS`k !~KɮoU|<)Vü!S/I K1rQg{N1i0+>|b9k/a"x :`Ybn w1+nbl"tKtWI{fɧBvq$*5hi }c }3%;œ~K lx1"d3_ K[sM0i-#:x$|d X?9"2A.h}b+D҇mccgjy65s&HJ4iD({1*a)Sq>=uZ,𪅚ZW p!!BŮ֋\rlK̚tBRŊ+Sg! /m-|ZCDAHXk@mh aޟ$$7B\ ,Q¦ԛnu- Y %qʘg2v{al8E|C3J`[|a)4*AK{vhba>Q2Qq,EAS[}P3X̀M_Wytvpm:TW^AMzKi׷p7 ;XP>=9n917I ߏlog k h*ԫ,#(.P<@9~){ͨ~ٍ!z ?L)[u,-;mKC!]N>OrLWA2~Y)#LPUcBE2KAϣax︸|h, D7&Oylb=Fk p 9*Y nxh3XIwW L+2x2:!q%OޗQ.74И59 1cy^7ݍܸ;KA5Reb]~KܴhpN(>Fٰi{Pݧ=O?V&ol 6M)NB߅za.{0yYByGʵ!p|'G+W0˙kxr=c[FC s-\XIluȥsPWٝa]RKphveo{qo7;JpБ_>O#u-59doK8x @W;hT"*t<ݨrtM}Q};Zo. ŏ-?~:+0up A W$T]z߾bzfY,unT^ؿ@YFH*o)],B'L+d!V]1 a/H)6wmM{HB 7w#ǺkZ.wW CbfoDwJځH$B -_JԹ~bDk *=ܭ:)c!lX~'p)u|2}U]̕}u۪"&FV3# T`Β|,͍{f~>YSFokj}D~y?MteSX [rȸa<\I9a}]+Xʿ= ;GW*/q*=[\X+Pu޺9}j~$^_R;Uwfr汋IH k}éDXc-9K8^MNf;/:x#*4~\S#;+[k7իynbyS9m'݁bͮnx  b|X 3{wg'= oYs?'ɉL)b%yjJ1qBMrqCmR#9v^Vω%*pfⳐ""4ӹ+/5ݓ ,H_6 4YoyvM7L;D/u1.-}Oudm{F&H{G/~B"osnpBC(mL%4"s@6^/M]s[SAP$C: ꄳ1E-f)͆4N6OOqo3`Ga|5Xq0P֩Hĺ* ״0d#9L1E:"ք=ra gg8bKh 9 Y.np%)" k(-,gaԢA*h̫ali]dO=XkX׉ uo.EFt>2iVh22zˠwIEP5X*C&M{&GY=M;Oع2yڧ~72*6rp1FΒ޲FCn#xyLZT7SqbecJ!,cj2z< 5?[ll Ǹ)0 2T^` )pWBS2achUʏyTxGXג1py/8VmRU;.-`+avQ5u)~}vl<?Kd=oྞH}{^σJʾR'T|869 SO|,KjU/[%nיL't9kP% A$~e|n o$6 feVl,f]N9µf>q-9k89Dh1ue#GqZ.KF`cI|w(b$%泔9E}AI:^}}Q̚ WL52WQH, !eL}fEf7펎 9IDoQgnSR Co+R6RۘEX&">FJ;axHmjTi "1ҽX=d4MV+Z:u"2Pw]8>!Xid>q(hpU]zdXjnrSs>A%O@X_y4ڞՂ U_=ĺ9*)z95xyRo j|{wȔ\~p'Hܣb*lhNlMamHh-p1s~@ibI *8qx=f8y j08ETN) (_uK=ˢY? ΈrATNҗ͡>JvƂ{ {RSTw)w]K)Ws̍GLTQ\20"maV9g#OU$H|R)-5Z"%qf+:cJr<$eAH7B\%pir]KZ6L)Z>8tuo }r5>i&x4[a$Z?lg$5W&s|djR|pWAǦ_!؝Th d?-o%dZWoSI(m6O-N?UK Pۮyʅ_*8݅FKoR,f?2:UT.̲aUEO~-4kvtWR 6 *m1c٥LZrng ȖB "M9 V![~es ZtGꊬT:JۡEc ;v@P-$ ]< EM To7Y(n嚁+ #q gLñI[% q!O( Aw/KEv|* Q7E.& ZlK3+W\3 ejW\dMA;|Ƿ8;B D՞:V͑բEgz8YH*?*0MՃD+xZ p͑4df]S;M0,5.9{Z3XL%|.sA_m vu9S%+Mh\]v=ڨN~oM&_d^T˞: fiPƠ9x-4iɫ=+y JIۥQe.+Y,*@vht9_9K iF`K׿/`pW6bʙ4뵵]USu>׭:N_[*."i'jSOt|:ާuPƱbB=G{v׉(`'"ٟpT&X:a "WDiKŢ>o2x@؇mIi7et|~SxzX] 31z K[L"l oEԉIz?yq xj/u,;vc Eܤ:=:eV ^a[af}Ѓ- mًJu-׺Ć_G!R'Xm?ݮ]t':E8BǔChVv /נsx`=899M78rgRz9vjsmoy*BI𯎻%b:cT2uHPXNش54Y_gMJ.ח< iVX2 aN@e`,_{,o4|9-uYM>%? DWIMvr=n\VX-4ApZ;yl0^x |ALkDZ|)(cAVFxV1é QCNՄvU 7 k5,8`Ȟmv{.U+I;lٚ|t/OS0Im_TB0)pA.9((i(B[By\S>(AUg'sDFPt07 io,!zKYyBq0S>j:0|%>ЮUʪ0ܶ GfvO c[{iYv Y]}Q*R,dWJ *^&L=-F6vëx-|p$sJR:ePo2&vfe;o,b/O5eA]J qGxK.߹쇡*{Ϡ^Yi#'ȕ!_mH~Pc,%!ҕvӰ_Dp!+,\9c&%]CZst_Ijv1$+O0<OB}W >5.2XyQsƺn\umB7^54M`xVn<;baG#hҩٸms= [pg r'&X]gx(6a4_jP4lh/Vq0 *t5i~"UvA;|-\V̵{q/>-0i'׽X]LKܴ&uwu^.]b:1u0?g&?쏝IOBw*) q灧bWGb!.)x ʆ!#V>|z?r1T:Mh K6cbf(9ۚAK2]vk1`nLHtv;x^\a4{`TׇdU}l3F}CfrvиK?sW L_: hs$DkҼ7zyl[kd~),|1;!݊$64` FF &f>s^f̖)du7w!wm:.@6Ì%yi [o-;itsa{։c\|%5 [o"QHbc3{1xgX&/3>'%ק iۏn8j=h**ƍZpbk?clc7~'0{*֐,r5(@1i5[}z|>-4 g٘ $6?PbSPHT C?fbiTO|GDV!m6%X?~o1HOc`g=8yACmG r@fxkP߬`I7 GV8۬8r馻cc0McͷVbh_c;;Զ}8dԛ0)B8hAp[~}Z/M .&PZCGFRX1W͟=<ӛO{We = iA ~|cL2\w_]A޴#G,,+zy`#E,aȂ|*Ůj[vS9g ) (&<@a|H/UAAL /b.RZ%u٬ڵgA.3"s|ŹYKtqDqd@<91jEl9"3an},b~ L? ~;q" s*(l2 IF^ߥ.C$rp{#Mޓޠ[o=#K& KI^3AY_f: 5%S-h_ y_H:&#ͼodh\k.IEv`Sx}A4sCND ~+t$9'+^cIcZ$Yb /ӁΔpVMxjCv$YȜ~9م=s n$Iy`n!O1JU)YTPJb~ s%eɑ&#!†ޞOŻ= s*J@z.CwWdIS!+uϱx)޷ x`x ?C InFGaZ닁~W";]'Gg*Xe 𳛏y{y]2`.i&"v[/S$TПD,x0chN*Y+_!Wd?LNBNa^wW/ԅߜt2z}|+G{; /C1 9] [v+:%Z|&CWz Ezzlvi;/_RApal*/#Vt~;B׷UcWkQE+4 _ +0N+E9)'e1bX#w2S}L2>0 P .p Cgݻ³Hybbd;7aU1͠)VLBH|4DwdB8w e{\>Fnq~e >x7>軛H7!b.0*'y xV /f8#P%%yQhY|TH$^SG&QOPܻWF5W,1r7u6i934%!!$-rXD:4T~ep+XPʵh:&-!(g~^mbuUub$߰lM[~YP!%߯~-eo ZBv:t3x qpOqLaт| X)GlL;u/PnwUYَB*e$9T@D\yYAlnEDq,%X.TvBpGvXUxVPaׂ9.1-QʏFӮ~LY?͂$e! ^hDه\hUy Ώ Y"bLBd,bSfGi,?h<(}Ms~THQ(&CrMbK, qe0_?w3%ӿlK[;PdmohW,!37Nn*H vT:ɑnM+>~9š$*kZ5kZVslQXZ ]Gw[zǫBbCQ!#o$.'hwn#X7Sy'~NxO!0"ߥ`w_}/~EI}iy[vf_ϑG+ 9}بس1DeѹO+oR0o14lxHVS,O8vp&,pZB]j٬ɷ \3Ma=O O—72%%(`Vq[qۛpL9r-OiEKg񟅄.?:qP}b2z<רǴ+;}`xBմ%HdI9sE){TӏUղxg4+Ə+ >CH L/=D<s ̨0y]toHSv„E+oZiwϲ%^NjXenjR{vdgmN5સ'jA_ZjKqt{ {!+lH7CJ E6ZׇZ~XP5TceФr2ڞx u 1)vۙ{*Ѱ׌C}lVD,[*k)_Q Sfd1~\NcĢgr1>AYSF <%=J/5@2wnN odccFm*$-v迫oŊ+0+e_Lp`$c*-d-m;4JB%Q48. VҊ+;>98EQO7/ގQwo"hV2./(jVŃ@{1p1쉥 PpႠv/mlqhs+ypqQAxRZVWl 9Q3vi`LN%پovi\%J!7N7k%=͝dI<ՒytHLnB 0+'J TVXOTEFR #F0@1jS_\ZjDխðNP $ }(_ G!Zdwŝ@2xn[H^]c*M ӃR2k[W0E)Ç 6S :rC O5F C{P3vBe;X;;ru7@-}~7@jFzZ85'Z=lyUbLK]pz[5lE%ht6` =_aEEqYR;$2""T륺?cGF}) &;uFMb|3=t?^'{N_!(ack *eӉ]=.oAr({cg6 y04zt.G5+.,'i)Z1)JўJ%r7N Μ@{ىH+*j<Zض=$>B-†NmmVI2>=ŧÔnK*|wgqM<\O`?<1kedk-p(z&0˲>Ph[__8PKu 2D`3e_RH˾0B5H[4m}%+KſGZ37%?ߖ{HP7+&w\Q(IXyqw#s+b P0mZh(`-`l0Xd[)`ٕl J@e7PR.fK 3UUfPw9{m%V$!\! h>@" ! ,fT\RyvȠBI s!߷CGOa 8P|X(b+OՏNyX戤N oy.o{Rt< ]$!m1#oc`hD^r^\0soSq؊^Q@J/FK| TEBp(KՌpF!A}^EJ=m661*(G}_HT{1%)Jn]EJ'@LTrbjFęTFs2˓䎸O- J*@eBfyjx8Bx^+ 'Gu{u=r~.z"QzA}. ճ7t5 ` h<dz!C{PCJ` 9 U0Eb8ccɩC.4Lǡua@>e4L; ݢYu:1KT\$,({P@fܫPjR;_^IbqžN.9Py66VCB?M57;{wŤ(r:+K>?FT84HדBKD@`t XL(]:|Xuia%F?P]=Z<Xۜ;ͱ ٴN$ʠ 'kXrS N h>xj1Q !DhSPJeЂs#1t dm Gn[xUl6Q@nӶtAIo_cO4#Dک }Qm{t2+T~imz:fЏ9IxH*ϼ\}3.3x( Yf2"?fYmt'Ԓ@)K5} H-e? E\RRcx B[zZ(D-`CVKYMZD'j-6Wl q.9Yإ5=;”k+O"=ʡ ̉KIx`*_טٝx ,XE[(3Jk wߨ֩ݵ̔\A~pO^6x< lkQ޾6TL,0w8nN{iwnD*#PIU/RRB l}2 ܌`̺}0Ⱥ)}7d+'z]^7V\@,j_5퐊.? F]8oFѳt8ȰYŃpĶuCvP&f@N x:8K:Sy~?yw sS)u.b=Ūq% VJv5aH Hw=`G5D)Eh?_mZ?vOkO}~ m\v^ I [ zΰ-oDv8t6oӒ(S h=[q73Hyi.fE4nKu8;?QʾAaG^Ky} [sfr3V{!~ykڽgC{yo(rۘţgY'XveE寅++o=յ[/j#9cowWp~pJѮaJL⧱sW؟mk>FJevH\HQX7+ߍ=k֜a2Cѹc , NEWMw]Mxii=poa؉BV1{lh HTwobp-F'Itf th'Jk 7f?n7]:PCHAqմ݄"ԧP_/@}̞dBXRJ5vzP_}{ ˪E]`61TjQK]n%o|Z&p ї\O e@Iq]}"}ak~m1Op =B_#BjK9z?gD޻W/B2K_܌䨢WN}~?ҟ@:XHxHe8cODAXq4 (j=I@X|ߡ'Itf"?y{53-oNQА|Cy"1jZK&,C۳qZLT :AML`;˗R=>d7"igXDiUЪE|i)qQ)t[kx7]7zXboNФ|޾ !w=MDbN5#zJ>c<$Y_Y~&ڋ30-Aо aVx#[D1ڜ\8jCC:yzNR#J]^=_c=LFc.=Jl 1\?\K߳cNr[Vkeu>rQhK{`i]V_H*50]dhd_zdU|_O(G Q! &[紘6-"@#c{;*<1%4;.2uZ̔3[8w_rا* ]̀ꑽT$qi{K7cE=5pRSq1e$5l1CnţJim'+ I,kaPtE1#zWi$rW5%'1wCrIdgd@MsfxIrH~kŧXä} ݾxPҗm7ݔR1VsݽwDhzRE+{r@{WIES'CG^λqI: qdISX!1l ViQ2qtPuUjA??7#Aې!7($oӝsj%OjS}`}sKo'0f\5{'~J6^"n u ˗j1tkr/`vq,[L`K'+㊽-J@TbMS=,an+JudV ?Cbe<dZya>тnWُ>uPa{Nf 82cDSb;+61^Ջ1WPR] {]X k\)+K|] 1E|6Ęo` fij8 \pSJv5q #4B.q˝@I+FA-"lnDA2C=8=O!䶳kOe`3 {r_ H^Ӓwhy {o۷PM=pgYlL80ytc @3▊I1! w?"!(} DE-%Zqf>. תbM 7dm݋,Joռ-cfNhYb\ xnPf2}z^/Xތ.sF; E5gTFc(.aWבP87$&c2}oa>UxF{q {z5H[N#[;t4[ߺɁ; ʇGCexܵ[MqˊrQNj=i4 kv2f;?e_ ]ƥ:;ଉKFaA?  {4ʢQjvCo/_,*Tw{wlC7!G,K9y|A[+rGj5qįX4'4}Zǧ>==_xͱC طy=$)Eb1!l)-{$~! Ccٱ+B\M@:UV,>yWB W'5f ؕ;XED|ʖkrnCVΒj(QI30Abk߫! vj:Cw([,H>/cو2h>:q&Ј7"kc-Mڟ][]4wnpCJR@JL1xi5!2#>ओ\59d1@7Bzn߷ |3e,4P˨T%?ntN%(C]Lxv;vMO/(3fHdKLrsugq)h诪J+e5}+';C72/7z&S\9G{cI^>@!qqoO;ا+Oz^=,AJ; MC&(祳TJlxLgXԁ3U$X%6 2uء 'ɹ:3ga7B['IFoJwoĺ@Bʡ1h(n?iHK'݌T 0S ?,߲Gt1ČE>\UuK_Qq42U6RipTnKq)WppCFdXo(pzk7T@̬s><u(& lv ҿ1 :| sI;#ϊH s?ˑ奻`VTLqO2g2o`2FpfP2 CB9Rwb n͕5Խs x`)L(?XRXw-JS\ZgP.VP59'P@IUM]- Wt #\OZLm/[+I Wbj[i|/';T=Փ'#"k+{ڝյz9x?"o|\h[R>avd sz7꣪ 6{US\s 4}QVZzDA ZEۥzEM|tҥ^q uhAD?fFW.hɹ1AwUX&P4"'`WY5%Ig]w @XAsQ:]Y6+ۼY 3ǗK. ImHdZ67)V@>842J(v+Yp݊ c9BgbYϗ@sPˬ A[JBL \hFD}_=0pOw r_藠 lpv'8C d;yz}z@xw(ZϜ}5p*ʩ5K\#.#Df|5DFux% l!_wCcdP-7" )v|.M"i%&ڜ eգ.1ZrZ:S[*yΊ̺9p\U ?Xȫ bז6 X,᱗D# )feVAv/># pQ"ӑ€;lY,[Qy1a > վh>UH0\WqflQ%]nbJb薘rV_'2Ǎh@(ޕo2WKGf(u wTYOpF92ΎݵeEVJ,DOulz,Ht./BQݬ`@t⅝5Č^ˉ_;[2xUpJ !6C \&w|NltTRIJ!_sƤkv\ VY nuxDx%.>6ɦA舷ht:3$Au=5S TeT.OJua˹{%R~C*y8Y.yEڡ=ƭ ""mr1,?D\[ć6cĹ)%SayyJT^˗B `2O`*Iۈr26u:tP>9a%,j,bQQF ';ߪN>toY0şYsz9s,w<{rC#Jw (B1CQ7Կg !K֩!5 Ϳ6LmӹigWg(+&Lq&_q+嬐% )Wu5\9RJe&.{/+646a3.nOo F=ovԁx)or?.q{~eUvZ!^(-S)gaxNv GGN cc9eXnZ9 } ׮w#:? 䴋;֞Zcla 47C=AAv5Fڍ_81Ŏ@R28?תSj,xRR`ߏ`#x(B"E=@b+yr<'ᅧ :VA.Сǖ|$:d+ei|8X#=.GHqS- / u X2p \xT`j[L &- X2#97'7 fRuQFmݩVmUMZ YfhiU=i f#Şݫާc(2&<1dWL Nuʪou k rE0#  e@RiM:!%%7d81KuW7GCg@,J#5n>H>6x2$M;4T@>"ӡTfj {ҏVB1QM(;K"K=o<&Xts 9_;(evlo>Nw՟e 7Q\ +ARC=ӄj l`KS|eWk|A4"$9KM2㑳޸ u:S;g}]Ε!c(!¥4J k R.Γ4L/fU\n8p٦k;^:M >Y)0ZdXtҪ95f+x^u 7zgfUvjrQ#!?_teM iWh``k>m,^9/^(~HOFA' 3jM>: b6VS#Y!\?HO'~;vRk$1{JHDtƒ,ZR|d $ ӱ& I;w/W᝭ZVD@5)[gȅL4CiYG5q,*K,d?1DV†N~[^x^k^(4$۷>0 q11@=clcYݎ B*ܮ\pnXjf}?&`Wϙ?zA?%;I;1*.g??n:J-@TD?l3Wi9|MovF67_M-)_"sh\`"\{()pY,'¨| )'9Z ;ruYbveL#OYh~ىĨ/4RЯªY  b<ӘT+X~ȧENWs}nut>Ѷ+?t4WyI2N3?$߮k&`}q_5^&E;p7s- 6o4 >U ]a0QeS] hR_u!νmĚ&.WMnCʕ2KBD6?6N g\+ D^UFps 3z ad~=3i4(xgZeQeax- ZcC4QHOX>cV>Xk#>#bxF灥/bЫ !ɶ< i\BTwq,\BaGJR4(㻛 <30=֪_RڛF^[<*jd|C@"~F/P5|7wP=j@lSuO -)P{2l4!PxÌ };m@BPPwd:,:xEֳ͊8>ߥ3lSv`#r?7'&riXat^&g+%f%+3mަΙF#WFcF99EbwI<9b$}M2"BWOAT7;ꫠ`kX#u]'(O ǿO[kN{׻Oa.On5ӹ4wщHR5]6%r,@o-7' Ac§=mA};;m?AkHfH=Ms5z䝨{kow;6; YuȈ"̷=ozǖH߫?QͿt/.m,(LYD< z੽ssR_m<@szANϟi!o6{ru6YRtEH[RXxcFK4uj?{A\[.6oSV4lbK5'op[j$Z cE裾NM%0u8 >R[z7W.FVllΞ"Ym[x.Pqbyr13Lq/хҶuqes۷9ۭ_Fhy)ٌ wp!!"Fo{vƟl(38LV[}|] A;&1z5R"z@-߃j13 6vw?T;QHⱷ>S!W4&EޯŇS$8L:ƭE\{57^6 wpn6=6{$M)A}jV_)e:|:8 &~- \ {!4JM}y/O$RT&XJZ;ں ~GyL*u B„,;лQM(Jo^ ,M1JL+tiFG,e͑91!u+CYQkf̢M1>+ '=h-=-g \7%;CNqHvdLz~5,Ir_uݶ:sB6x@Dž~h ‡j C+6 :B*J@w2B)-7 zFdio | q6[ Z6 "- 4ʉyR)@oٹ?P^AWЛe xG]ֹG0sg A[ !pj !i,@r8(0uG9[jFӗ b@Tr8L(a0ټdg>9j҉Q]Ӓf b {=OH]<ɑhDUՀ{| R.Uz6`vrX=8JtU}1,g)eC6Wanrn73WEJ&`_E[ Ҏݔ&}E >%γKK5h^nݓ*گNKE0SXc iGlI0@H|Y l4t26J(!-|r o6<.jfst M}ʾ!wȖ!Α%mG :GA8VKX`<[)jζ,7G0D0s}V}h AR'Q}.pf6s;9nfbWF1g9ff*ڸH%y>p#PdjitsIi-p;_$ScqCi/r±ѱ pΐxf~Vjdޚ7jn!IGG.Wbzr⥭+QRpRsKkz"+MOP4N愶nEKǕL=TʝA0uOhO␰f.7Mkna^)xK;:Շ2qE^e$fd^:!nĊ3@D|.T8Q;=]*,??>˗?'$Uofׇ;y795Ϝў8b26v .X@~c?.g~]xoJvA{|@TQpw'dI&aEGQ*޹\\pSԗĪ ~gHK>3!ZΫGvYҍ.k&RLU.Ry(-NPt.=;GD.mFBCHl:CʼLL8@$9ɶoS`g8Rs뤷zfRǥAMDcpŸuKNԁl kfLC~Z_\0^z\ũ=y8g6Tb4\ ;, (X6dCg qGP`OP<\5M\rk^|.,.>ڵ́J{}J_PlAP|pp85YgבA º#ZK /g]R ̤ř&TӁXZf x(s' &8@0JL;UuGZHr2/2 >- ^Ґ6Tm)RP/%&4Bo0Ё\ҲCӋ4W:@di馳uآ~.og7rva5 DM +&;g%_F07WNWORS̅ μx{u3xq7%v::84fh\ovKG3I Zi02p)jiEɥFHC,+ ɹǨR:9AѺc:u={gY4{Oٍ&O<юt|d%ޔ\­eu1Z'-(es.z,va?Gκֲ/Mkjzo[:h [ -d_=/,]UWFwv`a3R]j6w s~c~<W l5ekUcWrut|L Rc_}穮hek@5$;"2ȯ6C$kj8+#J( -S}c#GŊJD q`^g]|@m3~H1Itv86|u<"I+nv\=k],DC9 W|emў̟7o6Ozy@f 2g簮|Su=%;YHyJ꿰$Z{oҢ,)iN3Oe@_{Z̤7j~}NCq~(ozxMW|\TԦQn+"PdHJi1g\ h_҃6=k\ּMNs+$Iz^'ۘ[{ LE͘@e꺬UgM#;jnaP-R]_Bg̴ktyz[("uЕr;+x\s6-22#`6HՑ47?ְ2SډQz:X~EGm@{~`;Ĺ̾@jm2}IB&sF@VOpDٷC}3 MH?^؀_{\;)3̝DD,O-i7|eS3!\@Lj]CWc#0q+xWA>*AN7 qSvĤ18UnTc]2 Ο]|R\ȓ %zWdCN&ݪ/gS Ur|"_, 6tFIQkbPouU>JLwf8 #Ɖ:WɱuvW$yjGb1(&\"^;VIWIzl9ϕZO˟Af?vJћ5.D4Qa@GU&[&{Q?_L҈gE2(=K\&E-L=9;ǵūfߊS:继:cnRRkͷqɡTxi Ԣ!fJAҦsSB&2~[w-f`sDTu2@3Nݮe)Ao,(a ζI˯!/Kݱu$c$$h u65leOxfLEd50ۙj>NrT>u=l}ӣ}y*+D_sF*"1ꌻJF iIJbcq8)PWD5M&hBAUbwh/(D.nl µ0V.tMͪ4eIγ\=',y6ɺ<ۥ5*+,P0?*YL6O %` @Ht{羖AK))-UXΑ@H9(t0$4 ē5$Ǵ0K[W -?' $Z@X3 xCzٶ.m=Z4yrgRRS C^]7%b1JVIa_mEJS؎ߴ CgC<5_Y !xDTmJJ9Hԝ9̍g2N?<H%VYvT6}܄9 35o{+yو`Dn#8mއ<:pt v p]D .bפ$! \x# JAt;ÃșQqin4wR* %ݨLIN"S ɀR-$8B\R4? nꇦB7ԭ9=f#9ت6J˰~,Jcp܉Ύ# @'ُ7 أnKʪo؝۠y7oO[6ہN80HpO㾀0+.P@]w-0:U14Td|ZO7{+rx\|rq>s)$-K6G@~\ҼXi}yڻ*Wh[)̅AN@/-i֭6|Ռ+_yk؂ѽ)+s(д9Ƚsсi1EJ:BYŜH͵ET*:̮Gh2t^x)d}̽jD^">h14^7;-%VH^ H*t6ǨʃH` O`P #\Ǎd[\D&g9[Q@to;cNPSAa!C΂/#䭹蟢~Ԓ9W⸣5y0@% X+c场SQg>%`~5\U#/_km0}ǘp gkO3JGۚ3iǝMl긿l3tzUf7$]<ߺ8iPFyylK_'©ڨm&?Uk-͵~*f}᥽>\}O';@@S}jpTSG'Ӯ`|.v2%zUr{\0$ȢZB -hK[̶CszL5RBToq{l'eQaZj|5@ BMRL(LCZ ՗q! ?ɻ+`7=Y;P$]$;|%d/^L%O2UjɇűnTVh]5˯ "@hVu Y2vΨ*F$bme$+vC]@xԒG${[E)v>dm=MNf'O&u3)}"YYBz8 Pmpwn!tt+kQ/G] 9WM w{"m0&>7#ޡ "^Ҥ[A!Y_#kM U!oT) .;p|l! `3b|-7_"ū=QPKclStˏtQb Oࣴ@Fp?P YVe;3F"~۶G%_o?"24GqU_@ 0OnVz'r&q9u%~EGqj1TOvK]~dqBh$ G$K4IŠ{3Yc.xHz/ is2!ܚ"+"ⴓ#&~E[wB$iYW1u?$:\߯H\t\ڀgD_㒻'*W5t]j Z_Mn ,Gr98α\j7A Fp0KZ@ ? I{'G:3gp 4+)ҌWagϴ⯟}]W֋ "*.DI8n<?F^kгV@í^;zٝC@{bU'4>]gφnRa64Yf> oewpya1Wz |ŗ_#{G5-|dz\ oI}jD7%}"M}$~^{&0L P e>6Oz`.җQ s.x/Ã|Z&u(YKGGVصeZ=c2D$(!c" vIC?O576>!+icLIq4d7֘BOXy;xb|͎[+'K [/7_d[ ND%T? /xp];j=qnOIcF{*buEv4PwbXClīmR6Bݷ/96 4|]- a*Tr{]p8u=I~X'Q|)]"Y*{|^aĈ3w*GףGX|ڭ͌'6>iǡ-ED^꿘 :${|7Jw,s"n|WS% l&dIǡ1.W'1g01Zp Dwđ5J>p7O3i^&̀n"f!YYۍ|[ޗo>u!3Q_^u2 /xJ&k!|FMq{b]! "p3 FںǥwΒ~p|+qQ >%TC''abL]@Ħ~9.zbTr4C( nHN~tdGgqy_{BI731wi>qH@#g+}0d!7#ЇEI{v{W^ư5ꕓeK,$#6ؼPys.| z2nA \(ǗhӠ#<d>75}Mfɠ@&~~%-ë)Jh,huzqCXX][Y\P]>r©&A5x}>*v@1JZ*2t"{xNUcO<{/?7a=4'!u]H޴~-27׸}QK-1;_پː@)%IrS+1qvJPJ/~7L,Vs $6r6dҥϡU$4$7I'^]O*fsB)Ͽ ҟѓ۾=V/sB{/j`&ͣ2Vƙ;$+z˕M}b% 2@'y3FԪ?vd] ѻ0Tan3 k%3ooW=l߮a={ʗ/{NFcR> Y>K^ &ԩkXvAsvaG}'Ӵ! +UK\/J"2{ͪL-0vCzac\? YbId Ȓل侗F5in_=5]u TboΨLĮcF^ `<\ _ËcEc8'QTѠkA n$%l׮Ys:ݰs Vj-,__.״_xr4g=WI$ơx u04Kh2w i;tyi}E^XZb\q=Q0]Uw铦CjK 1reqű*.{4u'pkA\Kk|pGkG))qYiXr+U}àj|" xFu1!)nk&uHںl6"5#ZU핐&MXܓVwd|C?U/5bsyy&AXzV^ 1 ; ;Ѡw.i罎Zժpn7WxqDW}:f;m]Rn,+,kIA?#_Hm- 6UfFB˶_[pq"/{x2ToIy`M:-HE:~1AzQu{Gt2e4q Eq'Jܦ0M|:ǿV&,prv=[zc%x.qiP3 CT1"_Yt6Ẁ!h_%/&սpҗ$lCPeؠDT‘qÆŪy_P+9j-2uo[hCr TdzL=/?AčIXMyQ|)Ej4 >-(`o>A#*opn=νg_:eSxJ4F(.7N1)[G HGݚ"YQ|V\ V8 ;'5Au,`pM"*Mig~DSUPǫ[A}{Jd!Y,`8FGXX1c"8*4Ӎ\&4fp<(_~sIjPBA7,Ѐu(ƧpmaQŁ]- lmKMrFŏP?C$pZ{Du6<;(˕zkfa .cg|,(r܀飩x E )sTDPyB cUkb)bQ:EPNC FYՕ6[ß?<\qr`' +k'9! ŭ$&tRֱ~Dp2T-],L@MeiS9:VYd%9H<>j AΏ%H q%S E6]bN bO%ɗ!GOK6r>=:TjrSG*nXך}7 cIXg-GbX7Gtd j`Ń% ]AZX'#^>sl?{@[Xf0[0?P@tg-uy=jlSVv(QE R|t-`K PD8q\e425v7 SxIoqLJ]AӖ*7w K7K ѧМ_tHVZ"ЗlDx2A,W,Ox`t`,αC J쭱:Oj'u> e)Kpv5Et M8?;f#Ag9܌)1vi_X4Vd+)fAK̂b|Q$Q1Uק1/^C"fRd~7y ytA"T_<~ + }굹[ET%5۽l(NhI[ 8֎0{hI_9[3<*+{3 n1" \3Ҟ γ -OT6M!%>Kgqc(ʌc:~Y`-o/|# 8C"JKS^t7:p=9p䜾SVTzVz$3TDL6'Ld2 _M[C'n&J d-4xw:Xmcݵ7Lኊa4|I"Z,it-ҚCj}eJ`h eDjAU^hR , qҾ¿dL 3#!/]4)]#٧)v cxi&[xvh݈<5*k35\KG-e5罚ʵE;ހ:0g-( ИtϿTrq͋4ElijhZ,N3,&g;G??{^h_ߦ̗$\}kۘwe1#,Ի~mfNQgP#YbՋϟ?꬧ct_JrLE0(ު9KY=X I*ܗY$+,7U`0b!Z'kel|l^Z~_GAǫ7FZDɤ2s kE]t9V%8?uZ׾ > +9> _+}+M?LV`lX7'6Y }MXl;]tD39X-6{0}y!gTjͻh]7®;^h&d~KLք׍Wedf;ݷڟbsmZv\Iv^L#ҠK9ӡ?s $"*~uHL@W4$cqGw~!`<~UKiE)X/;^Hkk)x T5ExLv:V:,csp;]#zj[4:ZBګBsaS4cqg¬Տ2|J#3䪄,+ҭYuꝝIZ[1<é1<W; {7ۃZ7$m\SɁLM!B>Bh9<^Bx̬PM4$6u{x2;.{ WZfb* ށy/Qe(1}DBeđ24~lqO}ΰ[2WJP))!?A!AbBH"'9r^\v^An2$] ?@5րfñwtV}֎M:.r)plP`eqÝ8B{OaH,(޻_[a;._JARPOlF7pp6Rt$$m麺t** mK% J9TTBQ@43a C2a#F  ;"XaM=!ƈbẍ' WZzt1#jDgbqn-gbG0g-;Mx:{ݶB/"Ig.8- ^-+oGwT4qM#.YwMݧY \HzkHssԈ6U!kCKѿwBh|OqAyglHx :qYOfxGȂmmc^KqFeZKI9MM ; gQZ B'9ߥ\Zj)'ZOsj#uF'XX2Dw--v`ٝNB{ GgRjg--~qv_! dNZQ 'XeQHÎ?Rt C]Ӝwyyl5{ⶫW116H}ls(!$ƴɤ_JCJA}Cvs߄V[arJ#N֡zQMQ[BP/pעp遧ڹ?JYݷ1C>Ң>B36<nM2OL8v hĬlfJa!XZwj6YX \l-eD'#Bt b`_2i-Hvvɐl+/.Nl픒h?v tՊ( œpvyi}IϙߡO @jQ/Ӭm]W$^t{,n a{szOG]iZBT9c@:5{,_LsǞuk\қM<4܁?t9tΐҴD@KLytfw%4΃O4,{dskE N9J**~ ^+!HO1;Ң^`=8FLcdg fkȊ3_6#*|fwv`OHQ_9XEYI| e|s5KHhbVB~{wH*t~S +y-9KۥOGI>s,(?U~w)ŢtYx]֢wq~9uׂF-.[d hZ/PDa)orO88PQN;:6:u]uT}Xճmj\[ hw kԴA kcwQ D/ re1soaQϱψ w"W'I&!9HAUE RTfKI/bK7|>EM-&@ joJQúV6[U]#髖p]wZ+q) ޘ(v#̄=#rhy789ڗ~yŻؗle:(NC;+E>$IhScנS?-lłnD!eUcK!dW:Q•r 97vJ()8V ϴ2TmJVaQmdUWPn\(<9JܑvDϞclts ƒ2yeȇ~]$ :$PYa]_]P9̉Sѯ$x}y$_Ư.: wKSd-R"GuL[jr#' *M|oSo߳Xuq3h,f5ʆ.(Q67jetL-5z;-ŸeuoH:hG>1׃ƈ67hB[YCLb;k/67`Pˆ/CTLYn}h&o\ZG fnt!s g4e>6#+5do& c.6뎯^kÁWQܯ yitS}'fMCX>ⰾS172eoC;Stg!Pc*<ϫS5~p>!6+sL8êm[3k_.y7WUw[ڪH:o pg$O߸̢{D)ȱ1{a| [ڟu޸yS2Cu%:e(=we0G"fhIڥ.ȑsXѥxcC!.g7uIzE#$NfE$|<"6i7NV'f`~?o׻ }Neij@fD?ΟrDz-`USo7N*ƘB)ivaR6^g:*E jUd|uCW&yéP19xvKzlt́'Y! UiZh11jLGk <qgD҃3Fz9*)H{`TUB.T HjX,N4ԘsE^9N v5w2A'(ZujcSg5mVEx\7-A&MS)J@*gl4H|bKMX>)w"q!j]PJqz/#R7<}_ رgfI1SB)TX]sW7*Lq`vk"4]EF3I#8Aalh>}g㤄O$I&欔e TMQ-T,e:L|`J<JcҥF3({;&gq˦O$v)=[)<>5Àz^\oΠj1ؒ7א(_hO+T1e)by*rH_Ғ`险]T|*aX~ZlL}5瓜MtRc)sDNEsijWbNr qa!m~6r*) e!S} s/{"(ϼ&k{FC5k;֩{4D~.a0Q]-| @! "$/dbwb|;1I;xH$Y!΅?4/Mz,@=.W!Z? l7IS}NᵘvNjI~>l4] P D C v0PZ B1Bo1U:U~CA!`Қzp7sh}'hd9h뙷/~ۛ//߻0KGIir@ 0/rP^hlB@LZg;8AWc<~j'sEKMW#=(AnLu ReL5 h6'olƮ3yJT<٩;?U/wHpgN$dMEm򩈞焖 mvMnmMA еV~jq;+_Ʀa,E2dkFڸH\x:nփa++?U ׳?Lt6m&GB -0GŚ{^UG 1Nռ$*ovW|*aoۙxyOg zS.$-/ۈp&n!D@lWQ0c(s橋u|筃XTfH9v~u>Ӌ5jr[X!5h]FO.Wս%\,bҪU](nlO>nPB,B/I.*e^3b3&_\Lt҄NlM٧/vA Op)©&~PG]bl_R}q>-@"_~;]4,i%V(ׇQ?M([^%+҃,J뛆165Gଙ(++DŴ/@Gf*FQ%PS}1t_"'B\Jr|kXbבd\\arUYۢ?ctL+zb wĭM5*l1+BǹP~nr\GIr`TۭL{EO ?10$ TGdZpXT3ت<.'6u3:V 7xjU;Ãr'<> "`'8aW}D;)Uڗ+QmZ3 `2y9}z֨-̖.rs~Eg,{H2ljK:YcN_jBtc>| /4}nrSNN?з}!~=MbCOElAXEI1Yߞ^Y OOyuь4ۻ;)/gL _LNWՊ?n 9.4x擊]N"GNs~wA6k*W GK7r0zŝ8ЀvHš*"鮫c:Ԫd[[MLXuRw$!e2XBzTSl-` `l9nC*To HS~zi>*NB+jr8}kfjk4ٜ2 y YB(Paf>[_nTe!?f 3R¹uy >k˂k|i G?&X\$*|S M<~CFg;,evq[Y7Q:r.|<=Č%i9WVFl&zMY:懞]XR1olc>BTf?l=- m'M7[S@,XU;dÖ&"'ޕh>qCW{6Cw&3耈95_[6ҹ-sf4u]t{l*?) 7 Ci5 h~R/iE^`es&EP߇~ :76xX ;k37Tm8rD,p9;Ԟn cWxam/`dWR`u.eݟ r>8ʶow91hS7JsV[l-2]r/qZ,6~=Cyni4 =1j\H<,ORkRg;#A=wkfŏș܌H{n)i1ltW.x?B* f]nv gؓongTo<8oMҭ孫7{L/Dl*,ER8o& *4dQQoWIȋcӓөkB!vzqwE V7MKxUžI`}ȥAݹ$Qjּ5rZܭj rz\{[MDOO?;h4cYhoC<*Sj{EVczfwP'kP@"scTkI~0Q6ǯ0TDqK@&q$=J/V_J5>V@nJA iԱ^$KbIE/eLW  ૝|)'{T*l_vu >h4!˪Uj|"#ؤ\v X$wOmripcyH|=^JM;>㭠oP SqP>(R405 ذo0wCW&A Pq^ƎQ[7tP#VP#lãi 1j qdg^xnΏk[lY{RS&ߋ+C"iP%K(1(S^Bo[C:7,5#ל ve[@ȿ{Co_~0?_ɿ_oE~l6''v??B?a i,@zR՘LSe.{m/! XnYradG_c|pX,JG-,م\ S 6sxcF 9:9fՑSKPZF#k>!Ff:%@$Dm#o( 1*yԻ{c t`%E# 8Lo(@\{fiFpݒ' pi L;d 4M&-;҉S!GFǷ 0CTȱlQ* Bc@tpxg*N0^Gov$-M -8g{dB!t tIG=LI8/#,&^ tcf} =ղS݋P~Zr4{ڌKc ?Ά [ XI"'8 à?Fb[q z1(}ڙUy ,6rF "l0;IK: 3H+%LC;b~=zF Jvg8@L6sTH61e:a ~K֏?O;䐼 )`&(}}K^ 0)xOk>U)e9sG`,)[i 3w%:L>[Ȏtᕐ ҏnD0oDP|}BO09djsЛku."]cy[z! /2_CQ0|>0|X#5^^Rz_^%jc S"τ%o֑ ANQ™?}*m7D'ugU3YZI jHF*ZD]v&`e+pJzNb$Ne)ʐ=|ih+[}W!Q KJ(>l$ z ]lyʅGd`PLJLJI.Jˬ'ѻ*3'}}frk3&?iсy1W5Cpd9[${j[E˞-{/uT#GeCN?(q6m|DU&r#`̳(xdp&!Pd0gWC|-,okEe- w+V['n/J\{N9&]llSiEmZ|wmqۨI.GfH[Л Ƭ毁 \uzK|$LY>"ǫײ$TKMV.9 wDx.H,>!^U|#CTo\sUq&9 巴EE ,x{ hW$8 s-jj0SpC2J) g az*={vTyQ|XO/!; xeGG|׿X .-P9qY;):zE۳&8yJlX&XfWY@2ԚXFE?ۦonohLqLE_CQc& );δ\DMފ+g+qn@(ς?^M(̶eWOO)!#=B P9!WПlhs$xU?iCcG9A6D@h8Nۨ:W!ȩuG$W QC{ YyTSs0k&ۛ0T,s٤/lU >&nV$MrR+B)G'{ o%jbVEv?ͽ䉨VOD#?B<+"ӳBe!δsƾΌKʢrfAݒhwwpg194 l &.wtsBddz &6Yo98zG\@†C>- Jӥ"!6|X,g&usNftqOaLt3aKk鬱 R)$LL[32겜:*{ rt"@&nNCYM̴8@A[2 cQPIli[W#Vr۬Ҫ* nݢhйQ}'/G7P\*f^p`dѹs?`^7k#`EE'C6SkZ2h>)3>zhdT: zy p.<Ǻ ._lJtT4O a7/DOFJ;o>E&\I>8zayk1T>RQZFCMx7ա>%4+bɅoѵ/$o WC'x@ЂpW"8s4T 홦Ra<t&Pl1U@T`zZN Y W EzCjM疀35 {9r`6%!Ѓqx2OB A1bi]>EH8<;,.OU8]b6J 5M૜oC,'~Vt~xfԠztņS>_WW=~*MR %Fj }"3*b~ߐtTjwe&_ +רx> uw[sjB,R-k]Dp²ZlN.Ɲy[cݽꍏDK:VkKƚYe7lH DGʝ54LG^1kFO:o(<d9 UHiMQ>AhK5*y/st~\mH;*ؔrV\Q"~Pgeh\yP\='S>U W[6ԳF}N?3*s(T"J <Oq}GFx.^zQ.koMYwB#B"۱SAeD&ȱ@Jꭞ/6'Vr7:0_Lv44Y0 &!)dzʭ#z4Wc-:q|!bB;v2q")<gٛA-oF*\ Յ׼Ҝ\SzVI1'Bc;x'Yf 4Z[;üs쾛Ɓq]u|omM{TB4%oټ`2$g޻ݓ. ir2;:&~A=tQ`.k.ϿkTO{<Ң|qmkP_40 .O42V5Umu]nRZdI 2M"41I nןO)-MDwmb'#`}'H' @"/64u@{Fl*wuy~w?=@Coo8 aa 7 ᆋuؽ($q0"p儦 ]o!s8.lӀeFL4Ȧlt$yCa6P0,[X*,uh60&1VhSHxQ'i[9/<7'@K1jjCP zJLzzvy}+f3m۳@Pss1@ y$OvɋlIOts?'#$H` c"zdҎ {R軀THZ>${pDEg-ӏn,t',楴@h"!`%#Oo46rmJ5!"ny…(:Lg!8ʹMJҠr+51,g6xhK3ԫUQfWF).z> HҭƊB,B^&%wbE'4l, 1*< '/$PJGQN<gDL+OZ|\]x /z~x|1HH'q60*#RE l+?Q.bfiF =j =! w6!R9@`.5Pt>$[i0Ux |<3Hm8@ҞFـ6sp KsSl7DF.1*2|(dX]Ty&sC7 0"FZ2fBAίP?dD" u [ޏZJ @UhԩǺ߇""Ea'E2+*KiE|j. Xfv %gZ>$3#R!Ttjhz<L9]kk7HG3VI:E|S1\^4nF_Ϋ5uҭo3?KTWeQ]3eJw$N%R:)J.Z6YcX` Q4P=$2 dl\BN>"r8▕RY@u},\jHJ&GBh"hȲZڸa?gUK^5};ϊx"TOá`1{eD!! ,xAD6XBvZRĉ\l?w%5+V* l | ^_/N& "BBUֱn,,:eP?8S A(t͇mo".C[(>.$e0hfTloI4'Y k"v>Rԣ>I 7E,G:Г^Ou"ξׄ2fY|n\e'@rRf`jzY3,t~:b64v 0FE%M[nåi}9rLPq3^3!Q 6Uy'uX t %CMCN!xjEFY$Tubx2+˻GΨD$-t9,pVbңw'UIhhQ*s\~mOe0jjY;xdѭRT!ݛ' ,M+D]zLUj/3|oP8kA0sT|/I\[nY.>g/f"4ٍݪIv6P?\]_<ØLw[Kg1\QS/׀\P+dG *oqF /G0O9=t4t"4ynMb▒@o=Uږ k[V) K #6AD6 輈-kӻj܏>WuzHsףEt["!MܯVOD{u@a>ԟӳhMTd)h#/@R 'BI\&A4=\ I|]VQ4A:Fqe? ?Tl:u}h  6eָZq>?8G߫7}[1IN8|G_)g_JM{<E2EU5rRr$_.:N=UAG\z#na ˩/ =4Ym)yGK~#vCWA#/e,?h|n$"dbǁAsC^(H)Y' >wqCHMN&C|ys¦.)冁3RObUBs51vGe,(TIIJe(E88Ӭ' kևY2|jך/JJU6cA*gBg߀RSlmk ϦkIWb̆=vDNL&<t8XPDZ M^[Fْ0Űm?{[բQ6k CֲG)D후r%]/~e, 80aRlˍ a,NVc]V%gSXh  q7'*FsB" q޺koR0ᳮ&+ ;/^W`A6Z9 d_Kê"ƞ`+b ON =]7,pI?VvCAASu"z+WJsܾZڄv>]ޱWFd4rFxI?n 1BxT I :~wt^QӳP l|UOf݀BI&P\rGiSM FDnSbN%U: !E_pV%(%^a|Rk)\l7ÑTwS Űl21$zHyVq6-̙y8Y<Ռ1r拉ElȀG.{wW.7#` ÚH J)200# cߵ4_V k1sa j?j@nÉ?(zbPB GeSw΃ n{6C 9!gp%/reǂ}SkjY'>B j@oJUWo"~gz4z1E QVM![8@> hqgphQfU;{)_Mԭ:vNTcx'6`Km\ (7ol)IKLZ)+O|@G aM|6xd,-o}U *i)r4U۴Fi$.р'"؀KH033e=[~hj!呇fkхn@ ipa4Zv{ЊRs31,v7Ͻ_W-Mz0on0)jbl>n|OMl> 5Oqo;s%kձd.T4<*;.IK.,Bޛ=CXz!uբVD f"1Te:6bjSs71Uz5!j@)UoYuzu[ϟf/j̓Y4fdvCQ70uEtV.#l.8zF2qO .uA{~>bJE[u]ȅ9]7q^o]{* ?q/z~oRCb\[|Rџ /UetLp!1:I-sj]/eBjz՗OOO6p&&*p^螧^⮏vJ'ۼ[jHuܶ>OhMʀSV 5\1^pͭ@?a!)I_s8W Nu)N>1F5#Agv 63Cb ?g66&J K/sZp6=j5YfF 7vw.OԿF!I֧);\Q'{'l"\ FBII/,ƊWFY_"E∊u7gQ^$X/ɬDIdu+a f0~MqզtG8tѐ0>?H2D˒G]h<>p)HP:nJJb- r^8+]\E%H]F9XY%?T1;)%*.d/W4s '\e X@ !5\.|zmDkeWׄ(BK tS5WsY^G45:Vy"vaO]Fg\, .f, L[vHN}C$#Elu&Zp8+u+&9<@&&hg5'O<{{(K&K(jtAڣ}"a]H$ݱi,("7=_ȓ%z.獭Qs^wS`dd9΁"g܊Eo(*X ]S1 Mj-ES"V;*VvV/cn;-Z%%>Oe]f~%t߈Gw'̊3}edfE`dg֯wA,ճ t]:OoO[V>ouvkшYϞO<-_AUcɬN])aӰp]yL3Ԑ͊}l9(E$ c=EIY2wq..w}vO_:0$ŗRۆ8Xz$8Ѳ{Wۓ Aw(Q\t>6_?5!u=50yѤC:m l{3ES❗:P"Q8B̢3_J͘C!q bwpgCG$b rwv`"s%ppd*ԕzLa{gx=5,# 6.:iIfQ+vڛaQ'ãs[6G5%qg+̋xE7΄5s34n.w,Y.B%p~ٸzJ F?bɂW%ViN?ɱo2f@]$zc"LEDJ Z,;"`uv D?$25~̙ O$OdɚCWU5y;ZՁĬTB %"K\px I+jTX 9#(gt B? S(C{%;rZ9#hنrldJeHi;$p٭҉wlL3 uy\U3^5S."| ň.}=d|skK`Etΐsh.7"4 i Z(ᡪ/tB5/!90%̧wNa+uKNO6Rncq!%WDznT,X<l0$U&v?@w8}۳A\N e9G 3pү"eFur5o!F$Rz>fĘŦyY,v yM(ws# _|إK9 d|_۾0QqŻ8LS(%ImkrcW T Rڢ,P_ش8:(S?`j^oV1)"u36%SO +EywSuB~x̚!/9w@%\N/bl+o}-B.tg-m Ǭ~ȍ=HR3X*| Vam !qFf3nh9}tn=Cp,[AִU-gc_D>y=*xdVnpKZu˺V *\=0<JRTH7SjVk<Vg\SsGX)cBX;Ou ?] ~*:",W_oS&S)$nO)>eq~ϸ*).Z,krqJ)Ic5r^e'^V=fe 4UPv<:._xIiVZ74k:& Iy ZB' JbWYMLhp\PbS㦚BZ=Zw3붓faxqp3 #LbS ENtץ ^MnhG:ol9, >H%LTn!Lμ٠v<R"|4ZiEK^F8B .k+x" Q5DR& #]{8 %/f8Q6[bj aLuNڳlٟP(lxj0 _(Jf>4-&X+|_Ziak(g$ (lYOe_ vQX=|&xrq9(id +J=%.)-5ug'_ILaB?RujQR0SƤX"0&Rn#m'NURߙ3&S߶OުoОƅov ?mz.Y4B0Fce,MV# 7ڀKCLy4% "<ČgFWb[wG'*İldLk\{,:@+afiP>}So< *}Th_Xu.z9sTWԤ/ܭy|V©01y2M`(ӧuu$d8}#eEu \oeS3qzl*?~ bW nUмZȆg3gI!"t>Սվ>4DW K)s2FxqΑw{pл<|:$B`T"ө3]OA_Ɓ_~uoA2>*TR$2Y-ͤq'*+ؘ OF/Q$w#"{ć߽8hFpeE !:uI\4}K6qwYWr+uv7Φ:^T!Ed^0vHiUn^߬ 5-8V>@r7r[ViaP7Wxmf_F t&/܉R5eYh>O? W*8;&aKBųOY`͕Z=e?f`qT7fGVO^nA(ieƛa)N˘]*giLJÿF+u :B$?ہY V$oګ>34j9.R%Ǎ6$.yP=j!YqJ\Sgp8e{k}-XMqXJ!;Θ-!dsӨr+a]oE/lNmJb.≜ КwblX(oݚ C1"ps'8]vZ8\9Zt$ndoָZrQajLpMDY3}ʹ?)8|ʩ!ñ~i;W0$)S{Woֵ:|>)K`7SOa}:Kz3z7 8jRf080CSi+ ip_&H.tr50;^LMBEb ݪ],Bw_dS7z#I»[律ip07VoJ9kG4;*hnӂkڝ/.m /Dl׻N>5Rb]H Eοh !U}gbW#^xqUݬ5KDOuH!>HJ͂&1ݷ@^ΘfUmJ.iH:+=ASMnpwh~'EjE} CU=O8jK8;ߩsKd m{ܖO5˳kL@s^V p"Ӏs'AAЧvkPKE]JV`jH[dP(2 ~AB0tgxm]]è~MVګN 6ӌ Lgm%iG,k9Nԭ(zZ ,iw<~޻ka#(6oG?}[u!hZJ9Sßzbjy"R_ū*U=L:[v܁_8w0[8뮕+Y$v>dG \e 09e"<1ϚHo7 6e1}1? 4VhvuQԿBAlU\{Y Ugk]QRyjKƝݣ"sjCw6yauc`+ū>t1ݮos@\uIkź)ōz2hl)6QdMmrV@%Nbɯ!WRDKsT4̼[Tu;ҤYʎ0 " rg)pıgW.a%$=ߤU>U6y#c*?P(ȳ#w<Y\HQ%5%)ܳt|ͱڮ̺W} nw/C<޾ Rrp0m ׬oZ,0R6N-q8օc@~WM ڃfx-M*SVMwkYu$9^~廻C~;+qvK:Sa `w8 c鹷KJPϣ,?M|.'V\/&[29総r*p 0C@1*xNa̿ז}$#J)џ<\_psGb@#yz`u3r92E%On2-NQ,g]ƅe<.sGI18I+ӹᦳ0GR_Ni>r<3khf4Db`\66 f Ii=c Qm\w{)Aq=0ncՙmo!TY㯀OV]C+o;{C.' nkUR["sE黩SE`ɁL[5q/qi Hh >GB Vrf|b\ƍ|v 6+$ <$}?.mWo_}+<57K>uNka_$LMu\Jyo#IRjE b_rXk+7A[@bLe5醻>6[ b²\9l @=D_~1{,^IHs/NC5| (fKrk/[ek`tj=6)z}Q?ap1'P}{IUf&Oeb X:-|$d@,{]؁ңs] t˞<ϩVlW?h&>SkG*ZǿRX7 h[0(E 'dwkƣl՝9?h-βAEM~$mC% I M{Lo9p >q3H+y\%1cհM#ʜ-Ϣt[$I/ђF9:NštuX$ޟ\MIt#2˜`,'T˯M2@rɨKɤ֤:4?vKS[I b}a!F;*5BX{в ptрQ_cz. ^ͩýU^ŘSRꈱV=fk.}&4CfӜ:La9tw졽SϵsNo5˵6C Cc<;{%q8-U[}҅ƭk5WcO-ЪoN7EQ1_᝿wMeDV+KL3 1+H߳ k&CХx Z5)3:4ˇ6o:Vqd87c9OZɦSۍ엄3R{.vRA,;TҧtGO:<jćKN irN՜ͻa;(-{)qEmgfl .Y)4C+q#eغSjL„^:Rl6}ϻHO1>~Q{$a3)l!N*x$֎#vZ@^)dyb"Kh]{E-߈ ExG).jKU|" RCFD&GpCI_{3U-j-;ũb^Ƀ"%Ku|T'e'焞њߓ#d̞C>?U5=ŻH[AKjy[N?-ٹn&qDQ7y_?Pz2"[йQ?dj/ZH7։Ʀ6syX펝cfĥRKdha&OW\ǹFZM-6A:ʸRTѲ7wDrEd(xPa)sbݝBx  D\1'$yךOoi|]Hҋyf3E4[1׼$?}KG Er]-HDpÙz=C\xu +&rkT]ƠPkz paczb/ѡߤ_֗ppuZTpdg& I% =١-E}c^^#F yeoGc> Y$'SCr[tox:|\#$>ؒ,UmGm'h8䮕%JϒdFN6h@byAVq[8IcĴ`kx n]܂,;-[O2#^,/ 9R#&y}nّwFKtaM@CO]I4:YGZ)i v OU[rO= |%A96N>eA] d/b}! +V@` *֋,̎ܢnʒJMGe?y?[M d ⽆L1j;lC"LfDdq+GefdL` _,C\< @&nA7Q}6ȣ{jу;>4&yteI[onX kۋ]E u%J!(RrnV>߻. XP/8^bE4 |ͺ]-Iƚ}Rz۪/a(#cUv{|A] '5o(S ^.(y%ÊXmEGN2 [/ߡP ( ;ITȦp sd3C )RC!ӣCXLcAĕ&r~PBCl4=;Iޞ 9ķ>Z"xwb\TP>BC=}9r&YGiχ-.+EPFݠa|Ed,CZ`0_2G <wruqD1wdMYN$=)+;EF8 T$@;tMpV_veR/lxy.rtr|;V;{,;W@2iPܟ:?_E6WpߗMH.6m7}שw$jGO7쪵:1"Eh`AqDΑ/P-TH NLaKАX轓g= 4^4^f'ysgWAY8sqe3'h1Gҭ((M13AGD4zOc1)rB4),Lh )q/!IBnGt :uBIj*NgiBIgZoj?[钰"d|MP g?l8:Q!<Ÿ:DŽϿXi;0ELDi3B,yDE3ѝW φ3 s5i͛F_ћiTz_l|8Ә15(X3Nß\b'Lo459@Ett 펥˦\S'&b;ڛy~P={V{t n_zZC?pI]l~##Vc!&%@/ /֏Rja*.lz=I"]ߗ |nNƻ7 RZ}"Doݎ[qf:%5us"l4!8]0R+&\M2W\>">*}6'@ $&/# x/AWؖr%wZyӇt*F, <<Z'ymB24OZgڤ-|Zj:2|0F>]-c&}iht 8GGV%&EeOP\IJ&P03Y56 F!].{v%50!ڌ u>Ǎ[8g9J1|S~̣H倦2펗;KS9Fs GFHX#;c8܀8ŭ4Ny,A_ZC0ghQ5arZ95ljS,niTG>|5VƎ,X  $bK&hnܕmz-l(SfBIEa0;x(569*ukմQP!!f#y*z]A~% !4n@[)#$]Oj㖵>((*-,hm ,4X 􈀇8n?C @GUCc2ID,2665yH9 I$o :a߿eNW`369.*heTE{t~wp2+i8<+T#P~}IQxUY~ |bFhBo,Zv]$Y6;vi/ PSAA4hجl-F ->*g6 h<M6GtpJgZHiDm": ZZNV21׽iEeVfPS)Q Z,%~8/<Ko&f&AƊsaf;  /Nc+p؟CҪEtϩ8 a;zԠ"FAa\Hav94#|8_!/k53" VR޹prϥV#@@@=|Ln&h9oM-5D;k ڌKf&<5/ ԺvILzxSr6zZ)S:q䤝sFkuۀP$gd&޿I4-b3}Al~آ9P^_}A ^@STaYe>%VCm*@1אy%Gء9#Cf.z8iao5-,a]F8 x~[^UR`?9g;߷C{|΂JQN. П&E1>s=(zi )z2(2fchsCxjF$kt$%ϐɮv^푛5hDw-+.]M? +n{nd渘yO8ӴYz͆qwsO$DP(LK=Yu\9O69MA}@0p H2Diԧ$ J2h6lׄKLqiҬA{L6%ΖŤY~û ۿ|q#h :j{^ZzAF -u.CT3?0*@!ppC6+[+2 +!jKA ` 7`1R $#,,2 $pFNYfJiInJkᥕ1VYEۮ;4sp;p·<fa䓾SEX3KEĬ-Ϊɦ"L C`BeqF 8jia$ D6 EʴA1؍mXX:@Y:X@(n noaayƙi=haξKct -dq(6T;7oکh prIb(i؇7Z$} ]9Elv1D׊U84GݣW8ZJt X=-THaR;g!"!Uw0Cp R^=,YQЮhNHlC^+lU"/K66pp ~t G@m;T֣[ śfq&"W `VjK^Z\;kGjF/@~P*^~mFWf"#*~2t+~lo?c`ChID\~B,> 0S'pxlPF4a +G)G6, uM6G:#cWNt7AO,[eX8i|TYC=t@Ȑ#]Cņ'azGА)LO[Fu' ~;;hPY# fŌ@dQ!xG;ȅ,.'u+X2B@aYC! HFrcdFK`7щ ~B'ϭi%K~q~)% H-#-4#+(5H-)%HbWSC QM,rG>Ibe-֖gIje, Y-# U ]$!Р53^B/,AUX9/$E/gДl590pËÕ   J@T*&hY(G?2Pxx6 nTF&ĒMōPYٝTP۱(1} RՊO|"CK-rbrJ\RE"&HgIL$'2 W5X3߳gm0>brQS73DCxqu3 o8Dcπu.k`H*~CCg@6 $(BÑ h D }Cq,"JX@ T J䐉lX+K cFj?4y ~2u~:6J/q^D,U'H@TM--Hx Q(%@:$mK?E7J[d6}y.^k, &1c!Bk_. qQ L3kP9 ;>:;cxglTt%Lj) ip񒗌mvЌAc4p(@0`cs2}(1Y@J>T,`^0g9f9 M'w öcD(J ,j,6Dڪb@ @BSvJJlt?&P< !ϒS6aI+QID+ZEff vmg.kw@C0Y5zʞ9 ,! [>*fV%C6kHa=]pYb&s0 0A[k9\šYRU2Z(/, Pб4F7N,&~fz,hj' ༕vSl2:d,ɵ $p,iDmX1L`BP&P0S+ !gmQga'[ H5A@`} [ cqM*>v>I.QTr0O]g@ E>R2 $@ %. s^&)XA aJwaIQ,"_/nF+p\ vhF AAP4J(Y0\ȃ@R;8`s?A j[Zt)q%dpt]\(G8} R!Oh"ɚ~{*; 3h+Zk!C`RBqBoOB= fڈM庄Žpx<|~xU 5Q(()[=P^@TxGT Cq7Lf 2`%}ũ!PT]A\`(]DEXȅQ sO`C0\?h(J4Ђ+:03hT>p* l"ÙHa#s"0 ,,=#| 3@FԦ.î W?9p=0Ɍ/} J sBJ /?H2`D x[V#m]ȮzȇxxzPX&,  4viY􌭅+ Ͱjڧh5d*ԙ.-"%=m(۳ R i@= :\_Ї, b&ODC@^饝I I^`ZmW( W~8@5݉}xn؆"UHGwqP}s!(\5atz2 Rh{x{x||,_F 9!ڏP2VX%4H`u Yا()#F"Q5TL7ۃY_0B@MK/:m+0cVhxKExA_u Ѱ~}@q@sbxHnxl OܭA -QD:?h PQfU"&nwȆzw?GW ᘼr^" 5Xu * I7ވʈ5<&T(1;~#ȏ jCH/ ?؄xGWcCRh7bdJi L09P@ S{ Ht8SohTʩ6Q@N\N RgӄhfUjfSw{F@T_|aad;9T櫽i^ ]:ߺz+ };@N#޾mɪ*䨊h<J0VbVT%SīIl0j&#5SmV Ynbd~N~hnn{.ވ~ܭ[ML䛴n>o§n~oVKɍ0LP0Q`o?p+[PNpV p ߆fmxiA|p0/D oX*ii.BC?Mppq߄e#нr8`k@rl la -Gg~<Ñfl0mBA?(m s:s;]Іos@u*1rf8tfkhA|d:TMDh/* ȁ$@ESq^sXqp CV5m-B7 H#7ri]e=%s&/LsNnNrЍ0KHVs  $R^!<2P h($w$kHi%s8v_j_h߄WȄM O:{Ё s< {3HWywlfM%0yFn,k`p!lt*cK _>:/wz&(,@:p Eo@k=/ L_iPHӄ*' ؁" PHyqښu@ѦDu=g5(L<m|qKn^ZR;HH 310X(@WJ*rpD9{Oj9MӰ W$p!lN|cwv?.?]_G+CC6 }:0:1Q(BzRoἽ/BoI FNx)ԉȐ"G W^,ҁ~y#w\rlWp2(>r4Ǎ9hXA$֬ZrVakj6*Ubײm6R״n֪.Hu ,H}z;WĊJRťȒԚrd2UĶH|lᵄͦkcb6JebO p 'gDoذ!v.NʢE f:-[q LhִM"wCey8R{@2 $v$ Gpf]n%["IY"IRK[m%\v%Ik %hn! "G\608Ì3pH-D!guW$YRbX!2%)v%E0Ezp`ACg 9' Y LKWN)/4/C:PC 3ADjjIzXd}`&"oi NaXvUj_^WXj*0 qD/@.&XXj[r!H" vqelk骻-̠  A .C2.#M@I(&eOysMx;pBO?QkE$ &+' ʬM:[.WJȤk*!jb_:\lV B,I DgaU8=*q Ғ}Vvp{w@nXI[aUx_e-D490hn/t 3BcV8!yN3 >8 9hg? QE` |U}a_ -ЂJLb'(fz =xd;|Zb=ve$獫Os1N!;X#!f#[Vϐ*Z Ip j?p%  .Ą&uXC^Ri#ز6Qikx` w9A@"P"40 1$5G\iBB-fE9]BA%UTbU R[ Ɋ 3|/+CVqRBhi6/msGXUp0iKP 2x1`!è?4L؊H_toĠZ"p(OS>2Zo;%X4}Ỡ8GN-o3M2iDem%٧2JHC p?lm? >L4;Ҭ)@0rYNr-8ȓGʇ5c Th@t-xG¡@?zT`$2p$!JtP:Y(q%VMPNOyU}ܧ" Y|2-4X :HB{P!p#P-2.XQjG_"1PdbUz8]-V)m jaOXlB( sC6,![P|vH+ali @POhWehA * P~1 @+v RSn !*vG¬-D:O!e TVD>M)D-/w\#XB`~2Aap;Br^ZAҭ<%} 4W8@ A^Z:`c[ЌfT>0>|e9'6 V,8as@9z5 3PbA<pr(V+0I -c+c&*VD b(>F{ -<4 PG-^*GLtHWps ` aCh8C7IuMW=:p$1qLi{A J z z & tƹ/!.@*[@o<=@ GQ[U~qi!4agH%♾РajO? ̵  e$Ɉ0aDB#(qcwG]/qŽg=mDe@ቐ6dGCzFK: /ϟsV .z˾ @V(Π5P^pys^JȂ(*gVuw PȲȆ(f^0HKÁ#a(2p;~~3@qU0 14ĄwWr`zwB6)8r1SBDHچv;/A%l X{_H$`g@,XZL^uaTYڱ< e(Ԁ,АȩM% @ ('-Bq ݭ(A$ %pf!7H nŗIlmL$_8<.G@ױpi@n(4aQ=R!kIH0B%$ledC& ̈]ߥdRའHx1?D4xxAiU-jZ`9޼y =ⱚI102622a($4Nc/![4B(dz#B0|#8C34B"!6 cLC[d D= '_ T0NP/^aE1(B% $lB% K&x'|+dc,%Hn!^b^a`@u`,V,AH$-V\ jEi`eWqF$^p @<  (W M%8A &P1@ߎqa I-H2CD?|1̮QB[A}Frz?柪Eb+)hf,6%lBn(?>Y>‰//B<^T"nޑ*%T%hp 'dC?JVbA<\b橁HvZdd,~g,e[{xA[L%Un Ŗ#~@a[B6 h_h&d @耆Q#M"c R8R%jC E!tE6&V45EE#J&dCʁ%hKA&#hܠԂI'eHv""}7(h^$U*VOAE$*)呧y(d*) S?'zΧ )8P(0@ jD@o?`@D*Ȁ?@U؂x@x  O>u 8K 0Y(\2A$J?dfj)[F `L|^J8`O.0D$pd ݎB*#<,Pc}(aw%Ri&XB%|_&\.&A++b'(W-x饉AyEBtԋB!1Jc}Qd(BĤr`46o1f1+/>7,[Ae!AlH@ trL@jz L њH(#4^%'@n!hJ0++)P: HŖVj##7샶%L98p_8B)%@6r,(lB dBq5^Xv+q\bĂ! ƴ ./">bB.80Cg--LrX7(rvZ JUil@?dqi]q8vʧycO _ܪOx3$78kPDa!"%_2; EAu7Q,D/Lx)p@!|)+?F,nTB AW&/ܶ/p!x 40„B)52܂),"` 9Uw*4Br.*́͢p@1lxBIx#?;G;`Xp%tzhw+OP/&%)$*$'๴(J3*%x[əcy?,tO0`r!\b&(/$ $4L7Wbu<P8b|51lM|K pJܻ=}I\9$rW+|,,T{(-$B,|(9ǻoXdBTlE.xPm DԘp0t:.d0.YD-B"B"xD(t/|B'fbTO5;B(⁍<,7oA8gG(̼d)d΃D؆mH0 d tJ׾߾ p!t 3 +¹"Ȃ,"t5,*.D @4V!CpGO'<'jn&.w~/t" DIXd* W4xP$IjD9eM5^\ƝF"%`W-iִyAxs?E E4UHVZ"9JCVv!Wcɖ-kٶ%ʒMb:po+P ?pD )e*#Cb4kV.TPt[Fb t pVFt]ñ.\xsBINÉwJSO!T6 !B`5pD۹a3-Nx~ *UoTb6oR~T):!iaR>V Cs -"D44 " RHdKpl< gA*%D)DBdL9nM\Y.H#p #:JU䐋H(pЊV:0죨C$ %>UQ*eOD tMA_l2*/J`EL1ESNO4G3ClU 2 d , ̻lFA ~ ^4ɤiY@a =|B)2Btϛ+jioN$G9b*>I4ڐtO"I6y㫟180~y N^0DO=&[Zd֊횬oHlR(iMpЧ(LyQHPy$M IJ.DF* ƕiKe`dOl缴aL.+>879W萼Xz)0F|F6&V N8>Q$4,ږ.,*o6C7Rp?C(6(/Q4@6,qK'a@e Bp8:"íe,78pL(X1M0, U G"WE+ $^"{kYŷp8"/qsцw=OEDn#B*´H"*}d$ F\D"! E*NWɨTxPVT%7 (-J-TCzR$kAR+O$)['.%1ce.jz`%Jp8pb[KxbYEZ$U$Iɚ4d406q1 Y7`"-Tq4!igPDU=K^mdGATDg ×o eQ~\5P] e3͆G h66PbPC  [8Y$^hF9JGRw68<{#6_bOX&:W@0ZX!KGP 7Dul2dȲ[]ˊ@ҕ#zZ>7oƞ9}jbE#j8\+5W?`(TjaQ_͖,|tW~ .4!#qhk҈21e Db x8!!CG< Xm%AhXtcF61{эy;O+r?9n1+F^5[ o6ӓ,PZlKbS7^k"nۭZ ?d1(` ASw,!lpQ,bQBcwCKl>cQ0!*gyhZ- l@<~iU 1Jn١Od+*}Є&\A b`΀XiߓaưRq0Garp<wĴ M  |y锎(e򘮱:$0Ћ>fM'-D&o>'dF ծЪkڌ"k -b(+za9>o$,4po% B%fȸ<*RgҼ/ƬAAc&/.ۆpDD`fxHXʤah`A0.(O0ZA&4%~*hM >R>OٴnɊhc,K몕Bc+f ?P@AlN(6?8>aZ^oie"p>բ (4K#/ԡZAlqO|e8>a}|a `"'  hbjC$ &fF'\&  CѕZ%Ũ J'֞Jת֢&)7E02 7+'b`8h]4E*cDbNl.^2@DkZ,:d+N)%K2(#Ot!\*B/,kAp!ԤKZPe"R#@Rs4҆8R(M.A:`K+Q+kDL, P N-ͱq-`)7Ϗpq&+,"L eKC*!.2(-7pP(CXER,+L.l؜/PA<P<"< CklDMJD߁ cbqNx~x`J!G#.2@X5LAtSўIaa+Jf+BJBR01*J;*&̏TPJ<?Q3Tպ"nBNui*ِj:-,dҫ.P'+% A`ȚN+2!FDk#FO>rTGx"G"/r5AkH!ʆA8@o!XI3'QBdːpB=J+*g N&4 A3CknnuR4ҿu2ļꓲ/TM+0dU,b_ER0EK0q48$UVKS4a.a* GD wU 86!G^׳I!vvQ{, hgGi/iNN!bRiU!D!*WW\ސc5pi &!56eSN@mvCfooKi'Rl@۪̎,qCh!gVr'rA会r3WsIED^!0C An!XWDax6Wvgoє&J^ÎvwwA<^-!@EzylMyzi"zW{77;F"|7;ws; hDR0'A=cuc͹ږn.ffˮn^Gw~ݵdh"$HEk QHxBgE` cka#'BLNMN{~7i۟$knY/)[lM[iXlS/L2P Wd]AeHd%h -tKwQwssܹqR04!@ #DcA>XX: :88e^pu<&[`#% Gc"$@$e/B"AFY$ `lBqHD@C"Gɭ:x,rX" .qXD-ٺeB5/̈́w/tо yn'<Y/bǑ# "yo )()*/r(,=%2Ĵi4lsH4g RuL`FBi]$@ܡE GE^&j, QB2wĨLTf% YF51}!aˆzRƀM)C 3&V6,/,I,qW^J` ԆQin33ME΀;aV(r#`!ؗ "l%FPE}X|A0s7U0ʇ ̶!p=!@I=r?@qRt€$;}n^Ӱh5'&~6lwF|0izW2B|0P <Fn܅f! pOeLQMi8ۉ -vf؁nVy5+Iov&'b|{|PvrmM4aO,NJziI{N<}1ɟ^O̕ObimtBPt.h8AJP&A]2mjpsY$>@?6UpHsyr/5,ג:CGѿ`h,Uf9EȊqxzH;ȣ⠠7d^Rs6F dM&3$AQ%I Q51"RW#xO߹DO4F<"Aljrt,$_P{[.a>5yNIl[AU䙥ĮaO~j"z'vTU-dl^R)Q>(SϜcm.T)VE&5ppC6IaBFDhP:B#]uY\~46Jt `/Hװ萂9Ǻr׭&5@G8 Lҥ|6 1HhdȚ wyYhwe"Aϐa^ZX5;*J[FTmf~ѻ1 +-#8\Qp02R? z95mœk,n:!EVk ٳ*\Қ⠵eջj6 \d ҵR `żCkT /e׳7bidZom+`q2B!V' Ju&,BJܑ00H,MwaDļzEO(NFUe#zp5(ja [Qϯi Hj1<Z6zT;z ]ObnzkcJ9dOX"4 ;+)wlpQnigwsϴ2\3>#@0Ni;48:b+(a79 [)l Z ½LD*vfޙЈWmC7e\[w:76\f|aȗoG%4D?(HNU/Um T d 'qK^F2l}d$L9AqE)K72۵&>:},}P^Wu G{!g~:8DUHԨ,Wǜ5_S.G"9w3 ^)v.sN\'.kHYue=_8<,o ExSSQ /f1=lUAzx,Ǝ)e64,;< XuYlեȬq -fʧ'k1V}O*o(hh #>iO9J{zQ)Vb jx1Џ'=]:"V24XM!8!2toG*0!vXd]S1t*F^~|eL0E >4ZCLV5)*.A{yX'Ġ7㗧z\]`O\@;$C}6c1B3xl C;*;A=qj8`5`l-K! 4R~ɎΊ~q )"K22HJkGԧr5@gUaG9H 8P|&1# - %d8^8]='C`耼˨MLX{bd7E1v:#ͽzꠈ`#y)R]}ehU8wk de,k>'a4v~¡֩qp` GTsbn%Z sQrHr@2*]A,61uqN7U_5{MzT@C{3hG}]!q;l9C&(N3(! (곞}hX Y)5}gnZ9~A@Zw-\XZQ7хp!&˪+{<A.j)i$JtnoXTnD(qSoP&Uj[}Ҋ:܅{PީUUmq[='fd x  մeuDĦyǤVraI  <67\VnՌQ^J p¥ 5sCRD֐D _|BtrU'׉*{IC%Q7.qFQF `׋bX1 6!^D+&bULsI*F [rկX\!;) 6^͔lFعLEa{;%G =V֩! vd[]Q}vK  QOo%&7 @MZWԘЮqH]kAs mǷHeG_BG9ljNXel6h>%>J- D]p~#glrvvHXAd@EK=4RZ}VKWD` c)cJ&V'#>[E%3o%edgr ǾV:6(ƣ>#4iA;\1 z_rEJn ɿ tg2I A",dIjE~+U5En9D1a%8>ˍ3E3:ЭPX#QBQ'^OFvNɿI~'|<<D?U+#U6/a5n&6֭óCU E.urw/tp!=!+3о͹|g2s`ckryZd*nբ-"սٮ HN24oKmӍI~ =O,M'C@ppq4g]!-/_eb zVevN$[ʫŇ%k $5 RjJ ^gl/yc<"m>!Uaxc@IKz +`eVnRq}RBmFiUVc6n{\V9»-kSӾ0F6i Ia^, ȝ^CR bsۥ>ÿ nPZM%7X0Qlݛ/`l !ň{Ϳ*45h:6q}yok_Sm٩ TQZힴv9NJYf[#К'm"ΨVR\pk|zVfa+:n_0aU=ТӁ3_"6r"Jh83Y"5!XEG qڊS`^&05ض$rԫxl/uh'AAfo_X9YG<&oTKs\0%A-)p #zŀhsAٳM3J99F2HT脹 q2orm@gePU^@]ޠ7:W {3c̈*ﵵF. VhpxηȸLIٲ![q5i'ES(M#r6%l0JuDY.4 mB;\ S"K&hѝmx4sE+MȠu<<%{|w=z[,)WݛJjLKw%5kTPNG3J8j8O u~7I_'*h!1P.Z{sseyyKCMocC ĖݺIӲt4:u]iߌ{] 0",4 /nQ+g'EbM^_øqP|hn˅u'47ŽWO&E7Z@L6R*+W*i@MI(^&]VqLI55uh=ҧ,6zMRJ[[A/Cfg4W8{}995 Y8jh[A+ e. kΊs*t$Ðf.JT5n7(Xqo*<3緺MR k6urJV 4dդk"3ct Ҍ'Eie*7J?mf-7cpU=9brV/:키X fEI%6LG@"ViƵ"u9SU)8l-(52p7ra\,r̤&o"g%h*-%QƟFf& 3R5iߎLAdgUJޒ +|W!5h`ʼn=G¤zmfk{vKxd#Cx[y"@}t%e5#|-m22'/ ׭KF/ sD[+h!7}؊qryvt<̅H`aN9SzkfvXjI⤶"W%j*Mo֩].O,c|8Q3&o\Ɏ {!u-"<{:YuR, f8Z`r|ҊnMOB/׀x.$"i-,[sz7chj/T!Xt0$]*ZeS(LGLd k|Ez}lK]i&1(sh+|EAsc`9 *L9\7 Sz`jAD7[i(jwA. CqR{[xͪE3k2[.:f:!%Ǒ/qh $1Ic6ߜRx&Ay'bwtWUY 7}[ zK`d%6&ݨhaT&s-W8&%ޔA`*;jDZNĥI:hXWҦ^4%{p keŞr}'0.Lf5ORjR.D iE"ra#3ŁU>1 S@;uXEPe_`t,WZFn]^EV% 2!r[>X}Y21ژ)m$ۿe[>Ȩ$yvPb`5w6t`((4$#4J{طm)R͖+=jSJl׿lY[{4d9ڄsWҰ̳X?g^'f:b}̃ݽ/{鷖Q(Bׁ}0%Q]^"!HUoe$ pϥ8529r-WDӥY1h.rZǐSHx.z2Rm*q2@<40G*|(2hbJNG26\j2y8(TtXJ"L@,j9V:eqn/ Au]z÷qM0 ͉4ߡSkvA+xf*Iǒlc:t3vNUümM9m&QmnKHan{Ř^fѣZ:rHXM/\v1˜*FtoL 8M 1bxM%PsY,1&o(g]>;χn3ǚ0ϔ+A&ZGNݰ}uGUB/qsZX$^lT-eCdf`g#hv'!E~"( n)?NPj[bj48J}[E7k ЂR= P[::BܴjPN 1T'Tl+Eˇ`ې#K!E%S]o9ݦEʥ]ʡś ʒpY$jH,vo:TOdMDSm>e^{FWY텴@-y$*9G֩-.gG L-\ٸDęN* C*+`PA 4H# 2Ӈw8< iJڛ+kNѨ X^+{kOjXHN 'ZG Z&^򠭠ƚ{S@<⃗r66#p„h {X:82.4l'@ʭb`Cy !yLu8c0InՂ,|SຽزfIE p98{'ʐzA M>c>eW>w GTT5Nʉ5_35$WBvxD[_ :*O-TzЊמiϪsV[kjU7e* 6 ӴC]˪,ڜ__9|ѣD4ht7Jb,&6mO s9r2Dzjd0`FYhrkx ,UR8gC^4 SIWhֺSe5 -YnCțYvݼ~쯌@=ڞQ }G-HVFSSWJǯ1fPAW`Su`>1X".{M,9LqVg\#m%xV^62e¤KYW"V/_vclQtn7$&Q\9:l^9])xa1EXݥu%Ձڡf%v"ږ"/-d} r=HRsb;H".f֤.:*Fi;v5A R!4^Ж3ԭe"RǑ+VԺ^SkZ~\\ P]Zu.J>z7U ힷpl*\OׇG'Ipro ְnq*'<[e2x9Cyr[]L9e)ũoJViQuEp|Aߴ_Ɲ~hav|fvhMԉX9 lpcxS)읆 wsɻBL?KVvs4ze]>0L졥bQe5{?ӣgh$]s"0ôjr①NXbfcvAko|tܖU^TĒ4 &F ,/_p& <*F3n{]jLLjuR iĄ L0'L⩡^1/E1:px<1wĄ\tDil ˉ\Eck=ILkr*)4/4;@8$ΓLI@KF'F^y-FsluYA|~!(%8~[}!~s ' yսzf݅fso%phMBi Cel W풷l]#Mըǫ̦48XX32ʂjDY^r󩸒PHF#iBg+ @ ]դi4}]B|Ң[CieI7<(KO3~  牻t}͵!>-}8woDbH#(k݀;3'(y= nSk".nBk7d\.Qr{]nXj[]vXs ^F)SR憚wnvHCڽЫ #[RWu)'KĚOba(*6Ӽfn ? DZߐ1^!ith.%g_[9^bֺKKpEXLde !ڕpf P:+GUܓnrjrU]7@֪lnISjH=Cm nb^IcbEppVYB%iDf!VReoq]S!6Hx2rj8>$ aK_p0gNۣ3Qxn/`twl(MYi.T-8C6 }Y]ܩÙSmR̂x#,}r_$ŋh߿3~ϲzW6]r?{gE7uNKt,O_@wPwb|;_:;)_ߠǏw'z3Kǿf_ǜ^:ʋzw~ww%أ~=ŋDOCݟ-q8^餿Wݛg1}@>Ϲﺋ^Ƙ~۟w/KkEoWgzݍ7̧^r~͟{>Οy=_%3}x)+g|>=7z;ƒ<>A OGO˯~/y>8S˕!]?|K^|x^1?x_}>xРaO yI8@9WoxO7/i~}g5s#݌O|/3w>[t7W%t~qS~{C ֏\//Oo"̶򅃿t_y]~"͏{~ ~mw;~^2w]~G#"}>x\CDu~Od]p! es*`D d֫M%@LX/x=Bо\(~ u,t~ SFlLԃ؜F*ݍ\aZLEmЉ".1QUl7+ԔXz/t[~y;tZ\,;[UNY; \鿅ĝ;cK-k#Ec ڦK`ݺBp͉A {s5~+` iK4.&&&oL7Mj*{+-*3ɓw.%WHWLRy?_FxTC7D urX È'M+(όٰd)I.Dt$-Q)r:%ı"L |n?w"'awh=E4;I4 ;t%/@~šAdsoMbj)RC h?$O>&6b[F$b(|7 $R6JJ[)p<p޶T "Ӟ̍JjIwVeN "u8 F!+9EPRp gh;yyV4 ?a7 qqzWx,װ1F,BT KN"ͬ'\UjQaBѲ]]Icuc? Y+54>!ZAŦFU3Egr7lME%MރZL-v C>#5|fBt=InMẌ́(CWFę, S7}.>[OkUÐh2AdHjG߃AQَ 8ϲ+S\\G]֪siDmU+ř_S7_c~~3=BwW3mXaa/k"\2`C+đBRO3Y/?aygUSUD+PՠU.^;Yr+gsMZLXQHUH y-.YУ"Dw;XKGVۚ:RͨQ⫿Lnc j"J'%_*d]jqwv'<ξ2Xzʳ1J% ZP|3ƶhE1Ncf (&-]tcQ}q0m{^El"Xݮ=X^sKwL|c  %`j $h|TTS.!:o| 1ڶFԚW` c42o!D/H5vU .Rh *.C_fk3nۯwzsR>K) tXNs{og|^4#>9~ D=G? v3d_@l;9ӏ˘tPsϊ@"$#H=>&ցT]0z=g`OsaWWS#1φ03 2.{!1b:uٰ )!şPA1:fb犖=ָA1:2jCcޏCion?g~jQjl#0=JWP c?~Ey9~+U1Q`>]oxٯ ޳}piѠmbozHԫ"ҏvQ&WLw['!yLÖ 6@ Q@@L^`$7$f1S^2nqLe᫓?g6tswmvΆv;tޕkexβ>X PP@њ5^"or'G98 tNXw>xDnܘqpō)!mڄb5j4nhG~pp!1 FBv?TC`0CMLq9x߇\%^M?]3{ޞ{-${Uy^VRyS -,]73h KX6ܚCU'q=!(5^4jgh<;ZW) :ԃ22vr{ H7#z'rdIsAT;d.b)bqfY]F׊ԡѦFJNy+QW8&nA3MnGd%U -K+zc͎JY_0;K]Tu&)%)u2oM;Ifx ɤ=@;0=̖ēQ>4_Ɔ*'&6ftK;*2~AΫNbXQ1Oca>rR+a`)J¾m)qfl#uݬWP]sj'r<gIwEnj[ 55ZC Wɩs6GNl&RoLP Ep i6|u {. nT*MRoc[" V&Qt!n`f9pF$Ўu=%~+҅ q# \!3 91ND5VР4g_f8eGp7[씳K7):ADmάd BXezk(z1KzCu#$mhFo8](c*)[ֺ*y{j;pD{o78CaI ӎv!%dVۡCl{AܜSnTHcoeqLtNb*HbP6 ki22 04՘-ƌG |h I#4mZvu6.Ifָ‹9&W>Pٸ+NkAlnvBC=>T~g ƠaAK oMuhvפ| Ơ^Eտ"ꋺT!)U_.V* Į:<"]%r=Uˋ>ܭ'G\pXoĨjUtWHW&cP\KP}5\)9?ttH.غmJnrkNabӢjbl3x +4u>)T*a[l*,v D+b uo!3qt*9a`4.նlݔ+ſ`ZhP _&j,=>Z7 OsJ:O\3--'ϸI3%ٻ["?Q^^;ȵӗOt ] a9@jVe^_.jBiе'胩4\beDk! ёiΝ`֫R5k}6\[qzmfȊFEŇhu`ŋ!|p7Ymqgz6 Dz5+RjAns+6b`5rbf9vY-g8V.WYҔS@!>O0Bz :c<"<|0\!heTntر dm3"@ӵܟ$rDrU(rVT}un@c.$fxH]qpjY@Z &>z&zI A޾O=AHpHl@HX#Q#!.fkDf68<!t|Ogb'FQ_[|>W>3}}Hkއrڃ egoLp@c~~ރ^|~cf_ƍ?ݠkX0 @i>J={,"D. `% L`*s /6MdzMV enG<縫Fs NJCidNAA_!\>B6AxFi(|Wq9v>g#4Ios+.ՋϢso"MRbENjq#ی9:|C_F|[U7?23y,>Td> Ro"g e+ϒ I>?ye~9}>^8pe{hU4}{W? ӂsOFt As"2||:_f[؈EG;~s\|V}I(k`+7y(`_#/;bz"_,^)oKM}ΡXoatiq2,*'c˗mleQYH*_gV3>@]ԀQ?Fru/:YL'H~)??qUH`<0U|ծv?kZ^ )Tг?2EQ 5'(J~~CH(7બ>:'+1ەvB[o՗粕oZܞ=m}dA~WYԢ(;.;?{z咡++8oc茲\&XV׬W̰P.}WVYsYg+W_9-f>=3y.C)xu+֕O v/ooOtoY?z'hϸ߻<}<8oxry}} DhPT(Ӣd$kr:=8%3@&\%@qz!|ɳ#%!3 mx:mMbD:`LR@ek.'8Nm΂gəO,:$tB:kV\(=<f3-gi ,y8N]5wJ^mJI+ {]lλ%HVG ^T!rBԢ2azI# >5صٕ#~^"ЕURV ?%[P9IFےwqg;-76JMp@33*Q1h`07W0-m~&KES͚@\pM4(Tq1,j>r9Ms1vY6:k5u}." jh g=SesW%*S=1DyӄjOhΕͷL۴!zj<-EJ^UHOhyo n;1Тg Qĸk52ܭCî jqgj le$DQlO;dq#(OIVS:lRlD|b UW;$@0qįDJn3YVh!qh\7gil2'B =;[$t5Gsӟa*D ԤtPpVő 7g- =?5ĠHoj( gOjfG%R4_tXi CmD `R we.똑bOJ -Pڷa : I]ޖϯE_ĄYAl\95ai㽰1b5Er#3 1+$.5gP,Rd913:+ 7Ts IxVZSM yJVlNcf8\VtDkT\= 1xG+Z2IY4$hB QV==<H)QGKc&G6۽[ VRc/GQRL36(b~L^sB܎!V|pL18Oj^#b`%LQyZjki[=\y쮟WWY.ݕUqDu(u"Q:)` Dh z{[^NI 9wޅ1-Lhh\ uC0CLCjbXT,WugcXtn*Agd7=;'{jh{ryKΑ6|EǁP<I][Bwҿ֗+ ‡_8/k ~Pa8 lq_8/K_ZڵX,/ݵ:M˿.kwk]K/[ڊ҅o۴> k4!;6sM_6}]}})|EB^˿_d/Wy_^twܓynC^|]x}VP|Rdž9MHxhcR}ͿڣomQ9G @n64'±}q7Ԏ'eڞɥ;Z;kGZlUþt ]iqzV1[\O골Cl,"OֵsJ#Ku#|ƃaϤ\Wo,>Zs欏I^-G*_v*Ӟ#Ӵw3<G#څVSun7^3n_;zο9/鵞56諍uL_/gZϤ˃E_^QmPwlg?(-we7u(ݗګmUi+B4_emVҀ>km_m" jJZzf戤w/NͺY@E3d~CwP;y:_=ڹ>wzV}]߯yt̎;cZ{ 4ilV./O sܴVtfvi}s7+Tu.Jv36~G=cevN;Y,Fo g#;t}mͯ{nv|7㕺4^Օ>wPKpۯtN3u]Wl/RD\5UMk'wdyGf;I=zUߪYuk Ӌֽaǽsd,_>}fh5?Y>%+nH:g~EVO}qȯ}!Elm:EߠkϿZ˻7S̾wrK|}ե :Y݁>GX^w +}^X~CicfSݿ-5BB6|'^݁z_h_{h;iۘX٦~my=ᦆwuk ;&?S^dÇ {Ԃmц=iw[gWIjʤ*:흰F6>ͽGT=[7 Uoc|n_|!hDzS?_H ѡjϺk*-֜znS"؞5`[>[=:UEl_oW{[Iv~>ۡe.r+;}r`6.|O(o?l\{Ps*%lGCM͹OIn엻;}ϑt$PjO/joOr^=辁`_~]W˹AO{k_pZ;>p:UrZZvf?ԃܡ=l Pd־zz+F}n umk ?[IJOڮ,!=4Yk k /?'{T:6G;ֈa+oJ|Gz حNzRYsԳ}.'kia9ڭ:#s#'mu`owP<-#r%<*q4t"[sA: k Bnm׈Rs =K-LN5sV5\V%kq;^;;UKV*8S9+@˿[at}_Ĥ2k£[B}m7귿=`\ꑟȿ^6{pڿ_]aIrgV:3~sp>NvTKq{_/z֟{z# rF.ʧh勤y}n4%M}{@܂9W+wNS#-hc?Mm7 ]M:잸`|Vw>gB֞M+U^:j[5POzuϵfwCUuuKjG^+ثZvtoV͵埸Sw:֍|rnQl,cZdܟ]wt] {=ݕyW$ENtGzn9.BP{c[@[}R9/Px* Ǡ:?tsUa~kgݭVWmZ~ȿb\ҡԧ?T{r ֽ5Nk硫cV=&W}+-W9ﱟTN9N!׹Cq6MVȕڏܮqy 5օ{ʠOi }F uЕi^|ޫvu._?i|ywq_qpf/4tZǛUhW>L]?g\_,;i@,WrͿn(ٯ? .ZC^ouʺ-=Gʍ9=g+Cm oGr6_8Mie{=N(ܨR;Ry;~F]Sh'y{ғޕ:>t]{]-kT_trϱ{*ғ|lb͡th+^/=͎HG[5ZOuo>L6;4tuAE޽їl{V;L~iw}W6YoWحT0"խ6]"}ZkqvOJkmnVK)}K_ة΄ZC;5j&܄RBgVbE8j5%*Yɻma5^]C6r5~Phv{`;/po%fU?ͅ<1|:ئr7! #pMm}ppcLXۦ_m4:.͖mV& wJ׃? vsnMwbi7#t.r7m!v[n~u?Sېj:PxuBVvNqn5{S7ѮvF-V^*7ݦh־{ًm[X7}ݯ&m_ȹg:ܛmw,}F᭺:aʛ}޾yz򼏈u}G zW뷪܄joUC>C{}.;Up[7ߺO6TcvZ0~ԣ16zr||zoğ[qbF}D0FjK3}߿wyn|ZsRmQW>%7uo%GMt>4QY#x[WiNwlR^;r ul=>VoWz=QzqΙ4RmVm[C?'`4ϩv:χ0]+vm5@5ڄovcnKy /ͫp7{ Α 7\U .gd.#CҼs5h}φek&֏eW=WvYezT'X:jo}Kn˲vJoٰ76KvQ9g]8a.awEYWf5+Jv~h?ky8" G{}P{YtU?yzQJď^[]/<uXo.ZhK:P>hi.Ň]uKtiֹRj^e4>SQMFwxFrz籡ko}GԨGsT9lڗ;HflQ׾_4.\*؃[}->yA~ _^]F ǚ:c(z{jpx/Et;X QfU] ]@JAOAJTˏ%Pep,6Ȩ_=G蒲u#CV KNjŷfDTHL 7/ AYXAwnP!옯 .3#F-)8g'au],915#`ꑬj1eMH72)K rV!7 bxL` HL5 wbH! Kn(894¡0Q%b1+UGGjZU#`)z9\G(@ `VX} 3amdI8jpSAkFrӷ _!b3/NMs9Cع53Mzh:w>p==J#pdd HwzBq0sV⅟D H.* P`nt.c ])nʼn G/9{"\|*GS$\g!m_ws˖>j:bEx5*T&nEoo,m'qoG%NQF6͏ a@cpW@F^/X\;9 0`] 9:qI3΍@r솆iccPh[\oˤl%;sx oǣ+J{@epyx8.w?&U[2YH*+"P|W2Í,4XM~Ss"^- qA56lJ!Jb*@C=|u a+iXu$Y9B"vL5lҘc m zo0䧇ƀym{&:b]\b1cC>^8Г@t|1HN6E4A`#1FW78ȈH9wH.|3^2 Bd?evbۄw;oX(Zb^KJP#R"l_ ȹ)4 *͡[X›ŋD~ "@Gs^<o~*0u^xWP㭫)kƥT\  k}Yi./3FC8"<"`G/fUa!Ξ`jV8ImŃ‹h6&h2g1hquvH.K76@F#YJ)lYp9H~ +%b|)~g@Gx xzd "z7&WORj %.~Cb; $l;H,$BDcX0&mU'|Xˈ*Y5.ോ)$Wz8g< gBr0x.H]"y GH P-JiBcQ: .19ia`KqD6r0h UHkn @OY]'Øӧ˷R" IC)vyVí6,d1Rp뀣]Ve)ݷ}| .. ~cwi1xg2/DINR"jKg2 Ṕ'}Kh~i~/4e5X~km=zm`J}D'bJ.pg~z,~ڙ )v<ߠA\K9Ut˒%9s&~G#df ~=&CEꓗn=q%`S+: mC|='8-Ĩ(DcJ=)MistR6V@^A$#ebJG>N,$GxD_W ?XGP򧀪?E6nJ:WcTcb7e F*4 ',u+`+fsf}D q"XfIT{lrIpȐjEz@cdEBOHJ'%*So!ix5ȝ rOy,$:2iD|x|v֨+%xV0eg`-6،5֧UE lPf:RR+IV @G:MD)o(?&i>RvܝWSA~_J_ݫJU%P8*qtc}ɯVFQl:ҝ^ $>'ذC$rE Nz W~0@ub/F2`'Eoj:4BS+#ӫASQSrRoI ŶٚBj36IuۜF= x[`'VQhHqyu}K:!sP(!Jl@`t;0AJOc\XEdZSn1V5Y$2!cٙ].cçaGE kl/FU C ,sƼn@OsPi"[Ӱ1&] 'dH4dRcۂML:mz! "ƨag%|3x8BV`okYpOğ֞HD_/YJDV`:{/53TéTTuƉ-b!mK <cp‡qkB!PhTsUq=;)X!Ilcz[L0+X\c+7(lN<&)H^o!c\Y}< iy8ѨcVg1<#UhN_"!JCh; Ȩ!fѕzA($.Lg5xH`ЗQ"ъ!8Lv ࡤPxUG??(ĂLwuY ) 4UXX.=,DEja,x-lRmޒ4`vf.38^Ru%9>DSI(rQ&^( m Q}GwߩnN*O]6rއUà֌5'O;1ǂ yXFQ 2Cd~@5z9qu4euyy7@!*&p$jxz_-t$?tRDHK&rR;d*'G~SaɔɑIj F(kP#LpL,5wo/ $, k#gʷy6-{OduQČ.C G/@;k(gټ|=aJ|^t.{x,U x4hp(I(6)"6$Wh.L^(u#8f&->-K*U8|=Tƪ5i4Q"i!YzAnFЫ]xp,@GuH"59J` 5@֒2O?OYNEpS'6 a`ReС:Q3Bwe {x?+6SJH@@GP>S݂SbV Wy7"sp9OZs9ݤhICh:3 )sٳ7BS8^`' tp3s^K&cM~MgĚ.>"H5 ;ЎZŬ$c튜"p6j+e3>?Lv2F" (Y)3$c7Ȕa"!ʃR:zm$gd@PTe ;x9= 'wD OJi! x\} xZ(RQx;N[MP iTw-L+ԯHgH%*'cQc2!6YшvjC+h&\B`Nyh>Ro'j$MV!$P-7<\ FZq@ҖW  r^oŘ{ocsXF@FZ "2OܥVݜʄ^6֧`k / &;_ܚ+jrg T{M2,o^dzDK AbL+X{<[ŏmu2MG1o2`SFL8],s"@PQsF+>BcR&44v?HD&v_TFɜhɉ(Hh#Kd$p/$SEeEvف6R\ J69f>R!q\</󮍽%jKBe4 ?pS[Qy1fsC:q&dHvXTyRw\WjKLdx/?K$ z1D˴+9Epc ѡ0~5RiTdNJʾ,.w $γw$ w yUm?ŪXjwSu zhj2(|umVНhg&R 76bsY=LΙ铚/K*:O z"?&_k?7jv 3x~+>&@g Olͩ%誻d qB$I-"7_ځGuW[fdq˼ܔZ (b7Bt) 8]op)|A'b%EoRڷ2'' bzŹG`nC* \ibUA$ve*yUk p%h5,So7F,ܨS9 މV?cDt h;S8BE~jڊiU EZ"uv-C!onM_O4JLo$|X8 Ów\7-&Zh(O z% m-oOȊ*jKDqEr]Rtߐ6Jf:8"Qun; l$7~+=G=tae1?*~dADŽvQWߠܿrW!IfMf{8bh\FQP=.Ѣw(<B='?"pjxzH:^nHc0, `KKS{`'%,’Lb<` :akg||f&0ETrFR=]OW 0p|ecAyއY وdJ4&sFSPf⃂E;t qyАʖ{α|By?r%sG`q#ImQ=H ~&3Ɉv#)}r~撀AWn^פ  U+gF yYQ3p )rou{1JowDY;]3][o7 K>z8SHbb(G"1Q2r+k@TuCCeSV@UE& HP\E+Hyu)ęeUѐ 8!jKI_T>;@Ԟ5y7iN$*q:m91ܛhǂ~Q ZinU$r4 D=XM_6%S^#+u Q"b$akY 3dگ02: qnJ,1E d/>xaTASEuetpn^L8OTēvݥ-fA,*aQOz9_SGh"TVf0P]н0H3k&I9 ޑħ6p,M% 6EܔgΣxcsMI(ILur jLʅ .%sD\n\&^-JT.0}ډ2j2)}>+FP_ \%Di托&;9a~ʶ"I~} QZLz0̈cت.3;}j(*n*;ɔZ+jUK^"o*=?Xcg6prNsX lȧr|oB_t*lG|/~tlA7#YaX4oX˃|)lRg82DTo-,?JaZضexҺH2pt0i*3_EL{^9G|u6kj{aƌs%}L:7US/G)1ufYE{"Crr ZKS1Eh\~mQ4SI# L RZ,mr- e v),h-.M<6ʶfa>4imˎ0Rgi3<q$' ]y͐־A?S|c{Xǧ>R!yD E9^+y(&P\e*(L@"&|KzS'@\-YxЂ҇Ju'ݬ;ƀɅu2 qc2M,ϟTn/bIackm;?`{ƼI|ŏ61jJyWq?OZ%yjJ08/C#T.9zZ 6K@bPixy2z{#G`*3n2@{-\ ЙfЇͰrF+Ys4sa (qMOPٕ _JuWce!?ʄI*b~ĥ:0-ji&i435Ѹ@':&3{ 66Jt`V=4~5K;Źx;a^s8>ή pb[\nk)R>꽓TgaȠ f;Bt́|0YZCڎ:_a}~u:AJ-)GCt~Gt`9O7 ߟGШz=vUĤ8fKJF/9eiSJ2Ph1M xBXZas5Rʲ~0熷hp1T$]u $Fj=`pI֓Q8P\b%ecVǁS *ȪMxNd_f|q0SP!yvgPêƫtpOo xx{dL' ؇HFp,5wYcn ,]~׀[ fȷf\G}uߜFy; 7AS}'I ʙE4@R9)Ip&bɘ@οG\~?|iQAIS\#ȅ]aU"NrD%cG6 & 89!0)2Vc2[SxVX6&Wf$ ˝3LDSEh٫>KA] 4R sK<&Q'ݑQqDֱؗP+ KphkznR;_howG~:~i 'Ș"Xn2ۍEsW|0g -?(3"+8Lt6% Jps-bfDA2S.^[rx}0D]VgܴoHlء܄k9fr't ۤՅe{*϶P]LHrKMY.Xܱf d5kZܤk 9TJHN^[CV4<$@\{xku0<)1 r𷴙IgK:dۯ6U1 Y~f X]!jpr,'%P?昧qDІ8 "T0=ݯ/n._,i&T=C sp0"5eKeJ6NHOKv:4NQAec䲑ԇ:ce `fCUTB!I4K0M3{B:Lnj : hUCX~xUw>tP(5=$=<&MjX*k=0FOuKsT6Eg?`jYޱ R:,,&HI8dR u97`3 'ikKH]jϔ9$xs"MFhGs@=޻x`ȁmJ_ m\?Fɧi.$e0R.$K(a$Cvh'_tRϒRѲQ!7HzA[ţلʔÚDH_3y5D }"0CDpK1#"Q Kݭ".}[o8d剖Eg}PaNčqټڕv9Ovz])z/R3;>rUDA9׆b K*_fd !ׯTƲ([K3!@uByQX8mZT="gБrl\nJ6$# `Y}#1 )`Z ?H<yQ+p- !bL2H,p^:_7IQx3!3$dTmD!_蹎gPLF"9r*X= en 40 J\UiNGuBP,A*u#QDpB7*7@}/-1J.q䓰*rFF&::Z΁SLNN{]ǝA'7?5JFPmߌh2P|\!qfsIÅ [pm'#0y]&HJPwTShvKsu1"mn4 \X]΋- ReS=;_n!Fe@$H|ZD3)r$Re"{R n.JuҍErftCked̛:HIּ16Wd+*Y&"6LwR2mѼ9?M*(܋,KLeX>{4ڝ_1ZYpHqmu(}WʆWY%z.M.5%cllfaAE:nKq6qx܍?(0T T$.Sߕ1n+Tr CWI#ȁ՝-|YyOW]QPˤA'Br+++XtPq3[Վmaz& bE:_ d, |flY _{Liʌ.78«(ڠv]rQA;Q'>yh(ɿ`cV%tjMMȵi3obu 4[>e[,zޯd1;DE{߁X 쇰]7mPX7JMmeetX銞4GxܢϠq$)g@#=& k|yv>LsPs.~0Qq'&zTɂ1H[ geH(۵ '4C ʖ)J$.(=#-Ή"po٦-Kgs|LY̫bJOy %4a#;drD7"Ƒ@@g"4\,{,Z: = a1d;>0 "Eb&+Y;L/Y^X,lMdأCk@v50iW0H9X;}+`+!aN$<*c|'|PMPt/? *bHanX[F⛍'kP,-Wp/Bʊ)8aa1W\#̳krqTL TFS`>]foUJ?rg38(׍GdATؕ0|N ƶl%\sNZpNu$g'Ғ OT C2x9ԫL6xKSP&hzT Na dc)wVVynܑ~Rw*ۧ}ڂjˊ퍀V .z#y@8.7ɿ &F]Bynbl-jVVh91EuJXhR( f Hun.>œ[l"M2<qDebYdFSd+ѰJhs"uc6;V\E͟(4 wŔV|~Q!Es &(5Ѽ28(x~`P*mL 㻊mP pUQE*AZͷlL[Rx:XUR7C5`8@P#8\(qgd?4ee)DpS>yZ\ 02iÆSv#-t:`AZ.62NQhh@l~+( 1='"5(i\ "t]c+@nE*'+)*rK.FfM[#|h=K,#E=E-ةs[fh8:HF#$'zJ`j%f&PTq;n82N< ChS؂C.C$ϸM6OI" ɳSm6wtu?_l VCSKLG?QT D80TAn.IdA#CFr'ZxOC?g#CEE fМZk~.&]No3_/k颔A%e!A-Aɥ**[{qK~~h5T@{Q?3~&@F8 ՉqVF/)ujp4Є(0/ojն0;zҊ,󒫹5H )&!p\HpNJzwg(%UsW=1ȹCc lita՜pN!=0, N+p 1{Jqx撬&qHN1MCUkInD3qW#滖K '^"Y};!\a,\"Ǔ f]3`Fʂ66/8),qa`I+QC>@ f1 @ Ño|P5yk< `[/"%PoW3s!!kEu"iv3׃E%p*G9mlë>ߥϲva^Y>0s=4q-.Ud.?so r]~=bܩ=@HN/ ܊|AЗcE K^;+9[ҙl7"H(K;3iN.ly N)E (IGJ;XΑНS6WzE6mlòSPӒ+h)yٱi#DBTۭD*9fy٣#ӴZy(%2F?R =rU&--e>MDTLwh о]ws;3lx7\. d`+,8/ (y895o'?,?G} dK+@)DL&^4_TK i$ "!WEu+|C^0Y842##~QgK# '%Ơ`X{7R*z]4Y?50R/QZe]uT;dźŚ!*åDF3MR ل1GcqIK+Fӡi‘rw,RӰ>3=cZ|… 14ԭlN Ya.~R EyShyIVEF0eDx\B ,@ %{㋀>Lc֗ miMu X@p)8'CӲ/.Ŵe͞Io;k &KUa:Q5 K&2YOal,  E?UD{ۧI!3Y]D9S$Q%P|uҰ$U]C$h i A.ADžL@_;x-b,Ijz6z-cf!jow+& o3d q: <= 1 K(2Dc "kWQoAxNZyӄ<;WsdpICƽP%+\%w=UA0ES-|Aۨy5tXro48f!=~aK 3I7WgfqԮSX_iͨ`}bC@Tzt缚fY埘I"3jr5Eԅ^JpNKːQ!o:d oxJ!?"TI3&Esj?5#Y:2Z\9'eFoԘ@2~kNӽn )^ۙHYoYH%ƒV_uMhy"eqK8&)'_MЎ4NP dNehȥ}"bdj9XgF(d1/,rB゙ Y敻t.),y;PIX)T?)9 -<0(|AA-*%GPٷ@q!kL%Lg, Dlv#%|EA^]Id1soϐDmz8omI2֝'Kqtb ¦rc8)??16i_,)~,%M(b= LA/{t=WBVk@uSN۱W?^dB?+~+ +3sEj4YFh/4pꇄƸgCr d\b^Zېq;%??,W+[`'63?ĻVWR(nZA'} OZq/4->Ľ|0d fv#ۏ3=:9fPwFa"E ӛ(MyQ?W}sď1$XHAo;O2pJ>祮sUbA,Pl@F3%r-mЋmyIB9'ךT@ epBP9w'A7vDލ 8q1 (JZrPzQhvϐֶKqAfPVťPẼ>'4ḿ74p(8A`HupL7>)Qj"}CXD   Ǿ:*eͫDR),VՏq朜9(41%Z?i+kgs$#n#Q/jK\n慖]Ũ) \Xz*NMsuRLM;K`tֆq\)uZ)8 P¶]]?:>ĶRsjD|eZVҀ~J5\$]0FaشP uĎ>~\npnӟOYF3LY|3(:d@ÿ ?QN.!&Σb\,a@z,lo+63 ݶ6ڳYLOR@uX~6ʠD^lnŗku*3 RD@yJ(˚+*j8HW%Dpd?xf^f?7Z磖Q~yZ"eQWNT:3=FHw+f-H`] "R]$l0\D𔈾feT|AD!8._* L# +y'NaiųK\v RfuA:o0, Sړ(%&9PZHǫ {<ܹ]lCjI3%KtDFW~崇`I`!:JtI-!2#I^U?椉\zO@ $_Y O?m{ԁZ)dUM;D0߼l屑`*\ø&=Ϛ;իo+`NþSȷa_a]7J1HP﷿P4S,@#zҕm8jrIXn$G3z'#㗖{o.dt=Jk@Tտ?l@{e0G:WeN L>uGt䣖C>1"6p>ܷ/ C]Vr, b]2Rvǃ|_7UvDAH/1?3Y~^e~VX,lg$ J 3'/,*s\} e?ÿ/˿]Y`} +1<Z.Vng"`bU/cO wHޗby'o7 ?eHz,~y/<.e`>qԁ GE 7Ҧdʕ'[4Ўͯ.^iH2HRM$ }vkS_yE~$E33h?@&xn)8r!ϲ/!f?ef0Ozi^%q-: ATLWCg}}XgPmQuruv.O3MӁ)XF"ᴽO+!'DDQzNwBz2?? ڵm~gOF#jr:PB:D'la^6c:!$q+WO&\$(70Lu}jcD[6YCÝfvLhOJBP nNLEp L n?cʷ k!B^8 :a~BV1bu5A5 !"=gD'u?;+_'ǃ(Ŧ$b2?Vb?#e~!H"}Zn˙V0gY9)i= =o !վʧ[8}?/ OKWi4fWv,>-vF($~y͈mJ {l婠hjqY*SдSZjaU3gjˁ M]ȸ0R˸'6"B5\A `{y L e b7]<ԧTt{ފEwm O83?~iW\3I)6oBgI)9m9HA UPWIn 12i6z} KZ^edݑ@f6j?wEt(!^"{UEn 'A\goBkh^lFwCU}8"q5g\Ոd#?9=߾ІMJQt얓{*kaQ7c֛TT߅Ru$(~ovVm6z~?H 4nI շښ n+V}۩X8-OHL,"rl 1LNMH7uO4'TVGq ؙ )WUٖ}Ѯ,oޱv&%S!5gIja*RjZg \n* 7P1!V7(Ƶ_ $5(B.]ԕFZ +Tؙ>i| pHkf,TDh7ͰB-XVZwrYzT,/h31LFC|i̭ӢќgpgfTQ_h=48/j^$; Gc6vzMZ=6Z߱d{n]٬;1\lu6-+љՃb˶)0Es-7KhaESj2IIN63 Ya RV~igÖN봨aYo̓ n@OZ;HJ;Y="hSU}6 T\/P)nW/s6 rumfyr:7yPcsm/OC*3,Erg2YRqKۀEE\ DasDqPp2%U`z%U!]\˖B vV7S{.ZD%̡Ol*oܻ޻z sǮ@@iq x1F5{3f5hߏeʖT`a {K(<}:ƿ8 sv'8v1:*Yk:{$coGg.s*yq,!"=2'})?( ez<۵(̱' Y<޺v\?K.%ғDZlUw>-<ƖEX#̬C -9]N9&~@q&M^y4 rTof6hm^tyiDc`|5^,~-60:%c: c4OIآfj:jۋL)6KMp=]ƫΞYMSy%:2g2e"׫t!MwݵMgl{߽+A.%\pX 41Ez (W9jY=Ns][؍v EIQroJaӉ6&u@M(d-l:wv[Ir]£"Z$eȡ ŮPyQ9ٱs?z{$PO:O(u-¹fwX7<}Z;)Q/gün5b>GV öV IS$dUhqzglQA*93>nС-Z>7""(6+R$N"2:=8?CG1sl6OD`#㊛b `)k%/B2}↦B>:VيWL0aӷ͋M-TY^ gYV8RĂjQT#Em:3Tq9s3q, m/8M?!Ald4 J_P|FZD퀾|f{Vw`k6-%m?'+nuo+*"RŕaɌ[Lc ^~@q>'-C؃cW. pN湁,) br4 փL . .}1J?RTum@ 8~»d%D8(F\yrV ,} kMLLdN <6#CV1VP]i!҈'!VN5mҦB+4Amg .U`[ Aanv" Gz[p֏lQwG"T5Sdzo@8'>9qQ<G 뵀LpgiOٟWWM?ƭv!>qZt( :<d-j:V:s~K/b XPݚ 'c';L#X e$KZ:pp_F9Bzi QF'~sp- Ya;gw5+]j@zCI]}70 ~qIg U%܁|^>Z9!E橊d_3žXUD o927K!|҂~v8j+d)^W fr_ <6r5H@c+߶eWc0[z6mtU>YJƪ{l#Y\v1B> g{nW.\;կ%10ވdmou,J c}cO_ر6#…ˣX)C0Tse(AcK k![%d(F}=o02mpy`߁mCo׍%WՎ":H‡'Q}x<97yN >Wgutr  c)U9v^3d8g-^.F;:Ę!QxXGrhMWEGV}mZdiB02+  t-FMEq{:<0EGLwdf6:C :pd`Fu#[-%";VkB,4/>*|Cld/7‡nG"LȸJ.ƛ=k;=hRYKY`PdhJ }M{W:zxOhU0^E- 4J 35I" V 3eK ?Ӥl<1$go0AW|UnQH*R{^,&|ېl q]) |7R{x]ԪӽHƎ;tt-SepRJ0`7}  1!YL a3Lo7B>æ_5C~qd1JW~=NLmD<|K|=MYxURK:DCM6gSK4fGhOE45,O ߴ`: R(Y!kk{Y)Z p@^[F s $CBifENT)Cm~˜Xmp"[^R  $# (HDi,Q(􀴚„HsZEqETT0ؑ?WJJx --Х77EN[Qڨ`Ŏ- mLZW&?byr$ߖ~; J༇l#8b1I޾$RO&k`P4S>` l6,f6re=i+Dr@Pf%bO Y@"123x!AHI^T6I|ԉ *IUs ĨfYmC/øv. ͡5YC)5GH qf@hsHノ|}Db+9 ="bX jM0I>4kh8Je)^hF1T#0ͬm /hJDpx%s!퀙NUEZ N83:$:#(LpB(]P826ZnC~qESj`ǒN8f@w <>&:5F `J`d!1)~s>0k`=ߐ !:*V^iR Z(`XEPlY4WWNo4W9Gd5AwfxU!@ԂX0`$`8' p)R(HR0-Bb+EE@#BK2^@4`gĈ# ) +uJ@ `¦AQ !3 B"*thx0hСQx0p"0L Qx "U;Ex&硦" Hz +ϕAɌlB~; =tMrO,!'+Viz !OAH7ul=(i gʲ g B~Yώ  6}W+!CSrM 3,= ;ux ɮuE0ȰO8ϳҺ=) d5W&('Y|&FkoN{ I],:]UߔO&I5EN;0>.PZbU9Hu{Lrv}[D!xaJ_$#`5[P旁pV YbylNzמ-QUW}} owN#hЋv\d-уlap@eRpxC@0:FK/ӌ!+H1=يyJcc Icpxo>a]B |~ wcVgvZ"Sz v*2]X/TQl GG[.%Z;GVlf2> Lw^Ev㖚 朲`c'N.kM42p;Z 0^M%A {Ҵ!kxٓhQ.-hz3YBpsJ@ =^ <( SNYg$H_eB-Z?VڡֹnyMzb,ty L1Eb+"I&N 'cO`19"Kq^#Hg'YnSk1MF/srpt vf"(%wҘ>sXIr؏>G;I?4<>z/"3vR~qRy%>R,omGCZG5nJ kZ3Y. fDjg"E%4)܃u;Kϐܟc>$ ijW9K{F$+ DCQHFVv w׀@fX~׶ y< q;=[MYPX&sݳ?\obmN_Xuihx,)yغF1Z>o۟0Je5CT0Hԇp"M#k02\iZ(|3~B A% X2='d 2-]64 3B0 V T!0ܷqABL0'Fi@b?u3d.Ziā",N63=<icE+~M1mV5jz8 %zqݵkRi?.i34QUKG1B$ދ^H|B 6h]L>ydh믽n;L 71!9]#`[ a#K:8E M%tbȆ#۬^B)n :P5BpDYQN +V3 EIŸ|9y5PF8ȶ9uJU `@\qhxD{WG?W/Cc|_Rc(]z{(ea10JǴ(IlDD03UA)^vVQv-$7$זK1OMw̘Z4 !2Ed ]$4z{wZT6hDډEFkkpp3k`bk5K /Sl WűՃր; Qdqm}"i6QOwoX(vwGGtwNWAՊ ]kvI:G6|tf'dzExi#SP&H,q_`b_@Hv_p9?8% Ɖ8<ʎyŷ (ȹTx ~'kݭIpї0E${rZ\ͅ7Kt]s,>JݾNXP(ߧZu6U`C.r\GuК,h3 CuAuaYwarvРH,q 6r .O*Ȕ\ fIjF bs3%}V{ؔOItAQK[lo҈X#J?V^`{gN{opf>{0eZy{U$Uz JW?7ˈR㫪Q %šԣ:Tct~{$lfy#2[N x8Z$9m4 $6Ig# Ύ# *>(XNW-,;0_8FYx`|s z:I-ǐ-DA~ޮ]QvepRsE3 *̤"h~'WDkKÃt# ૃ8(`?+uZpWLpg=*s:'r"v1#龑iY+3,EPYCIS0~OC7,iq,XG'qϚu2zbvE0*mn^bf C4V¾١aw/\T %21FY,{2P6Al]y e~th|<|GxQ>f'?udK ޡ2$K_6?57,;[0X_V[ʩk#!>0Nr?%Ri j3-]T ٴȆCuCi~Q~8 o}NqEʰhZ%}Z<ܿP9 *>;Qpq6 ܎Wp5,wT)q ɟ'_YZBowݪIyo:i!%N@ώ"oZ* ?d~joVT t :ѓcnJ+{3 `Y!~Uf!V4ɍ/6˾鱞E&[sZ^0>k4qwz؀QCFRqnEUd=Ī؈~zht)j!Wg>;KΎ!}f/XNRoև TGz=y;v}6 )XDw(`m=e5C,t. =Й4ÃKʠT"]71Hf/OQJd9cR+ڐhtHq~yhCc=9) wpQ(5D 0] 8k%S"V$jScd9pe(ҁo ';@\a Jܟ[n\^nϭ8ݶ:-"p87;֜6UrPШs+tUG;EE,'og0 ,]LXgKm0]HhNS&Z Hi{=!]ɮw.O5 W,r#ͣ{T+GOe|8x%kRRUNDzɪx𣚼=!t6) ;47O6:{y ::!'*]&M mNZHqtNw6zBhp@'f$>L:|t#9N hFU~B6)5ݪxc Y\F~x^4kvфAHm+)ZK<<a~s2\x@yd]*3jbT/UPG~tk6 槦ж40Y'_4K0Ҏ?VMg,CizG?燒 N K !^>< {zG`߼'|2u4w n|U?6x"|]ĵ _q+l7wDfayܘg~h\ ðjDB_'*}8ix۔s@# Eň}QQl`Axc)Qv!LByXXDu`=NЈEG >M6T4<Ţ ߢ>r)̈́ZOcJ>9; _nRX yUGClâmfd[3ut)#+.Zfz.׸8%i>VJ?_2Ӎ:_ >lYfCYB~$aIp3{hq}Bfk§۶DШEN ӨnSѿړʡVWfݎ=]z4aYӕ69S'cf>^D k;es'{CJFceSKW!z ԃiXkr:B3iN$K"zX:ωx!㊴7JxLC\C a!n{<2M8l9n}!γ[6 iZ^MGwu<9Z[p\yӆ{`v-=@ڴ۸ޯȺCپ]Yۿ|uSq ˒Y._)k]Ip֞Ni:Vh}.nÂmB{ޤ'= >~>݉l>¦8}a=cZ϶y~==V{R v,̲>+e\['WX~Dٷ %Y#'VտG|qőm/YChqUG>{l˾rU/QP(C~UӠX_/;l;Quog_6~j?-->uU?EC ͙gѦ2+:o],Q뷤Vr$OC 4}_ɏ76"UVnx GZʅ譒` b e?`w#Px¾c¤ AZxk {T_PDU.7xEw\tlG޾rZhfG=Yy01XZ:e2#]4tK, 7FPWʥvq8@ty^o93p1($׈qh/ۡv_1Ԅd{kM[Px@DdXFm=vJC 8=gM߈ٺع "%.jN?I:0.'3d+iktdGe~;iU\|N>4uwEU݂>@gzDb~j}^} 0B8pC qe.Q8 Kyyla(`a<,^HKmB6!V.ИxۀD;H`xY㡻:-SbAn٠5H_Y4&Stx 3D!<{_\m|@ Mpjaihc Āh+ 8F$qW`Z"'(Bqqkmiqw? d,g 5h1WC5"ġyI@,Cnx},BH [&6{g$b&CD NN9DXdtN+g+8 %Q D++{kdl>H C77S(dPl"qWqIw 4r!%k.R^ɓ#v!ZQX c~C*MavR9#kư" 9@MWK6Pz&@s"#׆6n-XD@;q X-ጄQ^5-7W114զ10|.׺5:k^I.5fq>˷w_L(/O@3B.ÿșo6`,*|I2Y& dPa\PelLSC͍`% fPu*wYVߨaJM^{#)%4" ˅iX`W6ɀ0\a-CֲPq4'5KM1iT&wj=!y JƺSxEj"5Z 94O[~ d9`1v$^>>͗q")@2=d 26t>B`a$ Z E 6CɕL e&tښUZ&h1TeT~D :*`;q",:qD( Pb#4oء8 6뢜-7VXpPn1B[Z0ou&@bpb(!A' &\gw*-rQnQS iF0""Pdi5>m&!" V>4GnQ8H2iLR3aUEҎlcve ob|XMxNQŁ,3.c1Xw[%-+DdLӈpf}á}"w~@pGK`^"FVrF_SYT  qiy4*ZE/LWUTxcD'i@Dg#FXA9VF.jh7~t2oveM#U{GUIdͦdMlh5hlr6aʰdGJ lX@l"@xP6ɯ Mm81 9bĠlh$|Am @ 3tD11⋪}2vg$e:xSJƿ+ x  40wkށW QfuQ74G#ٳ`6B6Bh$EٵR6tuzTU@2]xt;}$ޡ i)\fDA" ``<ȳ/10GΙ߄LO t;RF55HO)@O IMM\Ьh`AŃB'-s`NkIޑ0NiѨzDž9PW$"4+_jFz@A$iAUdEeLBLjɷ3M)ߖ] V1nk1pIڞM F9 c Gu>E^WXYyH@Ơc@wW1g^+gs`}c)yVQ ?(Ad%777^+hog|+үBlw4Iܿ~h׭x U#d4hb(-)UHAivr5jE'QĢl9:+'lDk)$wU{]-e50eHFK4[v{ZZ&eUDk J_e@nR~î&`#NRyAyqyN5I4&EĨ ڮRhsFUnyEF(-1&Y &$QV?^l}a(hqu'ӳN})\ VZWj(8ѩ`Hϡ2Z&g{9eǫ鰖?h!X0-m'G+Wbom<6]c3G7Y:(sj-?EN`{+&:Qt5-dc*_O\\_sцC`?-$-ו5R y2 Lز] LIқ1Be kwwpCڸQ*`dGӋU8AH=WiLn都e=ZC MQA܏ώA+pu4t|8}I3Ki^c&4fmj &PTB|:L@s帷OC:gl 8x ޣ%ukZ]ajetpDvqEDaW;ʼCvǻY`JR>;D!R5xq@Ra``"NsC#[菫B\:A~JE @1툱Atg֔}|yUVT;UeeF׵y([tp-{ZrKݩ _ԅ:P&eZmf*}2?Z~UP{,tXBUF@-w6 YX\VWatg=atDcT^OV3ax9$#*m9]m,1?k(jp1Z='w\3€mPsI—ÔqhyA ]MtP >h(3:u<ȪkvFpKDD5OֈSi@ J'έ Ua䅍-czx/E x*A¤U3vPM5r[}Yo4O$q _7lp󊠓`I^8ag"X^Vb)}?Wr1.gZ+t^L%Zn>.]k&>4ƨz]wՂ.:`j[݁u$eqT6 /mN-<ϵ=(aIfdu 1UT;̈,Z+(@4؈Tu¹5o{N79#9 i\C$Se״qsٰ; eTqJ8k0ez.FE\ƹ*X͎6i( C+]|\bغ>RKa;}k(=:a.ߢCC4@3e>K1V[IzrW+r [l{3^H#n&oCUΊ% #Køwν+ͥy{r򒥠r [Xei$3궔$Dfh ݻw[.P8CA6j^YbWj,:8Fu_vbб˅1shsV696S3dv$)W  f*Vs@Pf4d(jf(rz$5kB^&(9Lĥm i㻵/ O R%Rޫ@#fQXS(0՜Wz =#&kWIYqz eZrriֳc(V!VIbnowJQA-%p9b`xBaVb +k\O HT1R-.V,۴Asv {-P=B@ LD8ZkU|-3,NxȆo\ǥ&{aCiY=XtŤY6gC 46hFn`o"#9綼o0ކ<[2:ۡkpjiA۸_Mч `堂ɠZ48 !τ}a͗^ԷSXYė @Ĕaay,bY6OpXP6CQ ֯@csZN-!1 ’.L.' p\ W)]H"zVVZ%r4Y_54pK,򃉍 ,p>Ltt N3t1֤>ELk]NXnCɴdĈY_ 75ց0u9!$6Cӥ'SP񔔌(6"w egqj)q]Tiv87:ߔi \<GJ ʡT! C<^E<]G2 pM @ Ce4զÜgaP镭@\8I h42> ސ_J 1"D.8C#+I4PAZy̗#8v7%/4f2@ZʫtcލDBbeF_wo Ea<#S dy|GJ<ctS*" u^ONssGВI~l (<'9 '&nq*sFgu]q(!t)k]uq)F d7ӈ3^vnM iؘΉ\I,1D2eR".ϴ@^|4e㇣ 8 @DcxW % f`4*y1"<ʽ 7@ԟ=2ɼ\a2A3WH!8М:tO:>h.biy8P#ggp* G~l8^٪qXrSË cmAd.(DTZUOqEi7mzh)/}] eo^7۬gDv s}rz'.+2_z=mrq&\ĥ.흫6"*Xů=A ?xXY]Tѹ!-<=QWv%k yt@vں}NDtlEk/SM:;w졂b0 NgŶOaV. u7߰|_৸/lO8q~kה֏JOO JYg@J 3%[KΜCPkmo#珶2!$]f[Bê F.QS{LIn(9Lf]-UeVd^CWJUSCĭGJx&UnF*X½!WUGpb2+1Cd#¸k@MAg;4VU+ .OD=FJڣd!b{Nhr#6:P~] E߄Nl#Hvwh(.]F\d=T )C7$s1 #„|2 ANjv4!&XLl9D,deοNQU't0HYTRetUQ$hJn=HvsuRpU96d|Ql-DWBU{vY];zS'6E  U{wزM㇤8C#DGnĆY"t #aMM2-%R AvK2S/ 0w8MDz;I > 2PqwT)r$Tt>P)>FQ2!]lɿa|)d*,+ #7˔5xD(7꣠&fC`d i;tрt,W ƀvXYqDy9ܐR oș0:3;x1<ܩAĩa3u'kPBzcyN`M9`Ubn͚?RNi/ă&Ol t8js[底-P>Ö=`f%r<2[Z5"4e ][4(nh jjՑTV bp!}4Bajj$bs IQҶۍ \>7 f~{!)܌k5KیÛJFQRˈFH~1HB&{$<[?,DFBA8Í8 !'q1+MCZZjCd;i"3V$6QVh;ވ4%y,D5,37U҈2QB;QF X{>8.!sUj;pmf#:$q2CX JMBaH$kQD9t݂m&-b"]h#I6~h6b 70DJPL!4LMr(PP^s m#q%0' 5GDy=>tZqAiԤ[ANu tp Y' 1-!䩀GIKiȅ"(`nvI'1R$}kAD 1)fBDQ':7kgE ?܋ozolJ(J׏J6w1iA.E&U#$ɲA )$$u"<_F`F'TP y(xnLD^J}lJQj&{<NP>A]2mqKh-rfac%5XGȆfJw Mv FgAhӐlXCHV WChqpEFOOSqyDE?RxoD.~/.q+ ,|.!C,!hq ^rkB>Arf 5lWaN*ԑO;ce cYB`XtF=́_ .\#j`2wJD69xNִxLRSRRCi%~w 9A>ӯs=LI4>>1ʯOM2  MMnz^CGzka#*n1?9ovt̙s$4u$AM"VsiǮ ;BϠ3Bt'(s)bf,FɱBpM GDxvaZ>Gߠkyz֭ G8o6VHLf> Eyd֚0O-Jď Z-=#U|LB=:|ǘЈ9%~мU#p=%kpW:GCЀCm~=sDŽ%4)Mk55|5s+܌ih3)7̒T̄4Q#CIBDiG*$S8+MarG S,;`9'Vf3oF07:Or<9epYP։WmD"030gǀ !@Cɵ+6!ˡ3ʄS|s=Bl@<K<uhD庪FM=cE= gii1pY4{SOXECLB :pC_u@] KL8~!Yb5X!ƀTf:^1x?TzV#U4K'0g=R)J,T.Gu p婭M$ZJF*MYdp%eC~W6f0Au.]=`i\Aǭ\UAu3B#Mñc QbCUo:Ҭ;N}P]QC}HvEm[_8~u0Vh ifR,\5}x>"SԘ.k؛UCVJ'(Xy4H%˯kHс@xw1V ٨UUOq bjTӤ'ˮA-N9 Vja 6qID'LkyJ1.X>CGU㜟1/Qj}̺ EN|2ha}Jwj5*L? 7$n{NU9`{ͪ"E+a:`69_~=c:?M [GoOk }%?.S/e;ܳ76> @oTr*t;Z{//o -vj;kCP?'[ oǎ+2Nak7u`!h=v4 _=U\'I{5r"Q^ !ި͘G^>+kKyOWu/M p,]򰝚U?z ;:*ogFid {C{I;]} SRoP^Aw]a>\m)$с?򿈽C웚/8[}TFd+-7[jK [ݖy}>_[jev7e7i] {ͨFUJ|eSnq! L^4+;ZLPΰXЂȗ sŁ 3]B !c\/ (yE3Z `1!?/fw \SYxR^a${3wZ,~aZl 8av%ȈilE%gtFcDz)z)Y ߫}{!A%9̒ʐyu85+T|OQU5h2D^UO xЅH-47851>E%ZrFLS# Ʃe̢]- ƙވ;qF~0qL/z sA=.-ބ '2`Of^aN?h}&o*^ Rxb,ȴ]l!*IFDfcÙ&158T 4IZb5Zmapxlj:ܑ{l-l$kw"h,?y@CۤzYyҩIbI(<1Y$AHchCf _|vq|4*dv kN%ʜFN50sx^T&©`R/FڿF`J15J:G`>`JJ"JbEŞ lM#%EoG% ގL -J:6&Mr G VIê숓 A A8elU'@(EJjj%INЉKN'nmx\ JjR}H4V׎ĨK>f&Nj\lDF1 Ru9VѭRGV}S0{F7&.`͌ ǬZo-E=:Z<$]$%LH,{hMVϹxOֱ \B.Sl8!/P' PțnPtLt DK-P+Xb = A蘑kЇ sP2 w>%= (<${0 (j\]*` 2"Pvܩǟۜ]YHD&/ Xe&C 4P4}KF>$jpc1Ci B`=;b(ȷ"t4Iz+(9Q޻b2&fśRd]dzkMW_է@FL\<:翛K嫯:=C02Ui*j?yEQTe@7% kSwnm' !xWb@@Ġ<7  j3YقڂQ KS4kK%C$L$tBW0DC*AFhmk OHX '2?ݷv۪ hm-6F;2?.?U#Bn[ƪ~fm/~Ⱦ5ICJQ_OY^is?I`2O~{D?#o~iͬiٵaᘑ4trPj Ӓ ؊Gz@L$4\>qFTcV&ϙ]x&]֞kυr s=rU.s3t£,,M8f/ my[|rQn ~gB`/hI8C,zȠH8idQ41-fP ~ =쇑$GiܡD`qFfȉ7(RTV_k}&-ibPCt'Ԋ5Mkj QNCRp<Vx,_2"0݅NKZ$G7iЧ>D[6t-Hr&MY,N>_k_$虪Tˎ")c}!V`bm<^~J%w`ݢ82IMp|(q#ɖsuf8#vSoedj6Eh(6KU3Fl|{Ӣ*ۑU87엒P%F6w0sQ}AB"}[KRg{@k Զe!n^r]JC0 Fćeiʻ{*Ԥ>-졖`*@ͣCU݀(%ڪ<$V}dS8^bC_mHv,(=lu!N;4mO5bJ4BQFA#V$7wm<<p_ظSFOދhQ2lt@i A!w wq ɑ@=1$H-٧Y( K=9)fݿQb,Dr@!"~G"yewfrϚu@:R0&!3xAauAQ]{T;a5 ?J4W@F'4q N!|⪁h@8n%&/8 /@p3\@i],9U.<srbp߿F ;Sd *E$!%U3YXL5_J[!9v<.<113vY[XJY'$X%D PDēg]9@Pjʅ<ƮC)gSJG?qy?.$-᎑}֤r~9: Yzi $Erϖ6ޑ2'wEW'lypԔEu9+Dg@BE?:A FNwORy #1:(l_8~Ք /dB't䀅JyyK՟ EՑ$GKKLwF93OcP%xԟR' x,fYDLO\I6ZjB2MO$H)z?n7R.vaT>.7m &ESAos6/T4jElSFFv@ԧ}Lrt1B}}}~t(>!Df.Z~pixMѱfH#u6HC7ƸlEN aeG~:#$Qm1Lxq_'/J{ L(U^_=5Q[gqFj_(KԴbboK{ATТ;Oa#F6QazA;M&BnҖ\LM"BxSʭfk|4ꗭvRZ֨9e-W-nvT f2ob= +O~jB#d2S?KpX>_)EVUGb TF 08RIm[>\\Mumu7)tw2n-lFl0fGkw8 b0?0 H"c S:Dn!* %5kr*hX#X,*_Urg:m2яCY3^/ގ̌ݔRHC/Z8V c"hg-|P/y5 茩NB<Aq+`$:,(`LíLRY *QR1kaqyK7-| gEW l{L?P؃nfi!D,7'URp1:GڍU0ct;Y/\z]=tE~=ʹDL!J۴-|zx`>4 v2*=S!5a`"2 * ClD63nEQ4c4 4#ɉ+Cv*_ֶ,D4fT,g+$p*# , YdHaR<RCpW|YC>tK-7%![(dq\qyCoMgMGC?^K֯Z?:tSڢ훚WѨ{L‹ 9K;dR)cܯ]S`YJ[3GsH}-ηv땑w:1_D[|۝R=ԇ´/?1Eq`z .=;ʗ®[ܽP|~fG%{ikR.6rgq||$C$Q<Y_ĸ\޴ww]^5 p>F<fɥ~H%,`ثlѾ]$df#/.Z dٳ\adjPJǿtz%DۋI/+X)^y#֞(C`.Y<ق\+^޾yWb$9߻¨^M%g848{l}y]e;0y*s{`gKq5R^ДCrp_J':qw#p~cLyGOc-(m+'bi72,0;5΄Go} "GG g{.%ֲl2 pD 6GUz{2rLc'ՁG~wxTd*翰~On=ovՍ0gd{wT(nKH'JK>LK\OWUOZVRؚkPg|x{l0Gy $tT|Րټ5z@*BLg}SytRI_\JnMFvpkjOT}ՏGSͩ0͵O%>*7dg|,ƭJ6R03J,Sʻn$9ZIʊ" 4| NJ2Uػ=J&H220$/S  Guխ*C; 02?8={%nc# WV*l'x;2C B<.^œ-N}_GbHs/ѲQ=i,4ѩKr Vk1yFO&L &LM9iCT؎J60_0$ E\\suXw]KdÈr'x1MFSA/s&;{ʒwAzop;?ȓ;Ĕ8#˴a:"t*t67S5T8[>q1*-!^^<`9`^ &;c,,6"~{9B0EJ«?zh2/ub<5Fac4{.IF*4Y2\pN^Z;#"s< 8H(a$ql3~!ٖ]9}JX= G+[Y?cD%y<@1J` ]Ml//_P%j$#K׾2,٦>&jk? &{<*|Na`12/hhB@aWVZ{$UFbP"C`x'Rn|~cD<`BxtFBcGͨIӖ`(XZ3<1\N9&p_-HQW2Y]ع kdf.I ~L!J#^ơ#*HOS}Q BHOㅪ HO(ޡdw$hih+ouegǪ]m^F2 $3CSȲ4M : Qi#Ej o)eR6c CE~s*ù16Kӱ@" @jY[(.6_0{75,gP 4 ⪢f\PYI@ŭX" U@tV'QYVT)/)EʷD^SH!uPr$:})h߹Q/S z9o[:TͩH̪&X_ziLFO< *> JNߙBJP1n|_IۛŨ)Љ)"Y* yb49pS:6̩]>O4 ==s: ҟ'.ۮc%J'2jGXB]'ٍ@-GC{AVV#t]|xN#\w3x)4 q3)kN;r }CcWbl\m5z F >T2VuaH6Dzz2&Mө@gx fg 9=aNP6i//zgS;bqp+y#>ʢ T(wK1 #E0)"S% FB%SA% dutR"5=̇GD;8ކDTk}>OF4A>@։0hr2XmDLF竚E%$ռR@An$G75HcdDq2 ip|0&J-Ica !`#{Mq) ô؇1-k9wY f6;ㄍ$"pI}!2@m,negr5C]*X926- Ǭ4*>\]eRީJ4 [[Bi xv@T7MaO cȏgWYn٭[{m`:8[O#1vu铷"imt6@"25lvqHպztLOP-X"4ܣj 8p: ޏ+8cs4c^GT]3DY\vSÂ?/C+5rQᦧ!QT1Tڲm2WTt==¶va xtXHp"`jR :!}aABNr1N=?`vH+CEd@=-?:-T$VSN=BC[O\5Bnt?މҎMA:G"95>2vڒ[}:10Uw$!$۠b-ܳS̿"^ $Nms"86P{Ʈ l+_?#ķ{Lǯqq^}+tpIA楌 EU,>b;*WadE_*s)DRָrjuWa5_:_ìࠔb)9 $##\wZ!3u[`@~Q:qh܇Rc۫CI_H9}^m") v(b].KJsW(@Ze/t<] !)~3_F8gm3\F"Qʑ*(M% &PY81Vw@(*b`WM9˄8GKu~eԍ=>]6Tl[})&!S~9"s/;zxcsAL}furl\5R>D2^ܨM98iNź ("#q=cAIj@C5#EUjgZֶ$y!7&3IE|ml*0( bkQ%dH\IUո4ttSDc$#`fW) )̖$KPmy>-e 3{Ty1$[?2mЕvaR=M"xˎY;m -6]f^n|7<_Z%i vˮܢGf֗/lj}5cb?rocZ-5䯼>oR~F1ۭ_^4\{Tvx߸His_^KûȎyY&yޚ2&K=B fbp42 I7nQb݆+}ME?(Hl0~3+n@^OpcT֭jn19'Gf.S|gc}hc|i}jt ;ht̉tM<0!ylsCj]i|Fzfcd<6cpjdƁ䎒OV9N"yS̒9IVy:n:P'{tk\',Mwͬ_XOb%lSi āTejI$b/AG<&e0J=3:θsk/L-1IˇGeGifng&PF2Ok$ݳ$#n`?Ôԋ‡?CFo}]SB#G:ԢUUmFoA&šJ2t$}H)/*l4Ԑ2`%0OZtd`'[̞S*rsVhijV|&@W)0d{)f?䷿kv*jNF c!0gX%A NHGV1իI:qr&-a5&I3$Ĥ'+PuZn/& y\_%\r90S1C"'~c[7Ȥ#hXǁ(>c58LM &E߳eDFeqNE1) CB̩G+qpxcӲؒPVBpz;v.5sQS܍Rig>SNb8/0D6%E͒Թ$lEgíX@|x:9W{鄯}6u!^$Y"+VP+=}?Emh8@^qH T9iDU(=^\vHd}+YIfL!x\'wRGTB 3 ͨn!6kÏ]䫝d5M $썂ɼGd 4;pcEoXyL,CTT3S<"pI9*G."}i9iG4&cIJ6:fFy|N5iij lc>ԉ'?fwɧdiF{$q[ `qv 62鍅Τ'"0˾wՈB$N@=I__tIWU {yrtpQcDXxydm.Px腒@&r~VꜦkbx5 uCA'5L6f0+Eb ol^R5=qDF*;V( eL{tEWAjʇ|pWMX oGe8,-y6kibrEew?7G"/mf**)PC<2[D[D+SL$b{9Qh}"fb]znm ,2CcV_E8<2%&E"t3#t2]YŁuVgL}E{}z>WO>yg)NcbbW_Z<]AȬ89A#_##qLCa @aTm5{/rBE<%Ps$FXٓUk2.->_\LվiILU6>X/:25ͳ;n\qvz$UΌ^-zAHg挺THV@ݨ5An_U*b=f)e{5ecgQ: *M#zXFXLjfnK4o]X94[|cfT6*1e$*Jz 8+~l{];fހ&{k½.:ZHmGr)p: <g.HJpAe Aᶌ\e1{2 ^TLD|%X+ހ$E# A_{hdWQNmvAeh)]u=eC˨z>2ufBCd&3EUv_kMX͖BK\,?xHR(dTݑ)3^-\{KWʄxЂx=7w3)j^ >l*MͰ Pvb,ipWB۔YlTDflw>w$+a%wnC$ Z`0^V_ j\;K"x;pz {Gj1V(*"Xt TUSI=޶تvͿ Ds(G]i>;B$Ir4tI]oF}U!籨Xt8:UP4TTm1VWĹf.-7 c8ɳ^7v8#*R޺ź v֞ sN٩DL?5x:bxKAҿ2[U?eޱ ,Z0%olN{𘪯{+ްH$F5 x緊 MȎ~)u樬et +&1XP?A<50s kcz 1"_X+QBߙIu Xی6u&({UW;sq%|$\g@n]:pѮǙNH`jQAȝ$amLv@:k/Z&XPn 휁 q^lsh-$R'R!GKԱ1!lIsf_C6yMIHQfD HfJzz"Ι5*9Q7,K=Y,$texjv2,2KwЄemq HI6TTy6d!dɌ?(n aGOn ׼ ƛwT+{Ob9$\vŽ9@#g5"[{h^u$Oմ!xs0|yn 9xV;u R%2wLdKL{6ks1ֲ$¦H!I~<=o6?E5jGtpHR I'ݘ+ne%.:.jL}1*#NA_ SzHp賕Az(E=dgt!uXx&w3*7,x}Z˫NGKЕZ>tCl,kx xy'^Z]EᝋQY47rtlw](rCi0A R8W"MtT*"Wl:B: W#w9+IcPj HWtAVԮ 2^;#?h ! HLpۚ*f q#Iĕ6$.$}]x-l㯉,NP`w1b&3INW47 ՖU\e5TTEm#y* $!uJbj Ӈ /`GmMm-d_ &.M&+,j~$~[&Z8P<e7N1F[IBG 6,z4xV) *+ɢ5InBB\7݃Bqi>@C8 ;h;Q"rwts(hrgd^(B| *aկtӟ %N@f9ziٌ~> S)ui}A1!Q"thfz_~"b GJl[Dfg*6^N =(Zā!iH $lF]e:ވZ:! oXoRg.VJ=O|tS53oe@Ѿ ۻm]8̒ZilOd4pW@'>L>Yɜ' L"B8}bYNx^C恉dAiX i()2k׵lR(?!FP;޺y{sryt>чYtQkTVO#GϩQlU=irt9_RiȶҕiZ)vUS0o,tl[9rlQUA%*WmYirޭEpDmqݷO!}0ňlSd2u=y n&!7s/ hxE.2-J; j;(ഠ`ؚ%% ),)j_l|0ҏ5 sOb،~Wi2aG {J2>)(dV HQnF-rԃ{)GΌ@"Lx_ˋZ^Tе v.CHC^,᭹wWvXm,W^AG:8򔮊X٠ŧ>$CR9aU{=R)i0 `TԸD/)`. YM (]1%.y-~o ,26@ @6<(([c {18b0?k8PLWcEb-ƢK!x1D0@, ~ibuc%{iGyg-.iGj{L;Q+1'1'tOX&L>EG|QbtYiwt:aMӍ(4 {)Ƈ)Ye.*4CdUo&H|kLp }\s+L$QYH.DuYdŔD$Vly qhbLx~cC)G‰~QyOo ZtU3a^xq`Pu,QmG)>#w2Z)Y2?RTZT@aB"uQ1HpSE0Ѩ-R { Ug:l6;lط/3V1)Z E5! @pWv'; '"R) }JaLFL{lb* ^=4 0}H+$\;p bAb@bO?55P357${y갚en냈2x]_ 57ZB%V%[UBUN%BڃTj}| k;2Ȑo9{(-G䈃ᴩ*c|<3`{F(b?H:!&Y| xS៉ |Ov#@\oxqYg˚6N{fH"tCo~$aH`&f_c2=ߞ@<\`1ۿ]59};mg|-֚8܉w,)J7؃RCv&5cPbIVlFEJPIN4FI8ɼ'$bJ\q0Ewb;Q߉N,weN4CU:tJ1{xFTڛL"5k9p:mC͋iM<]/-ʷc? QD}Bυ(PecKx/oooo~o}o{|0 o7#j#Mk!&iѺ2KkR׸K+(+"8Qu\"]dATLfCK\DW܌|| jQXj:Q# μ8P)I~Hڇ4OF34%lOчH:r&;xOq9S0_;L쿢'Vmב;kKd.vYϔ|& gWpVGV8jVrTvx! ^#8p; : H{V{jX>~cKpЃo|+q}u{ 5&0rrA`}\$J\Bsn1Tgxh o*zzx WN+"O['=q`HVXnOmQS괩0Oh++)upҿT+27 h=jKjLDG:ubDPKW0D; CM93%,2D(A$5: 8ۙO.7wHH;ԮFOXUYQmerޢLle6b{G<1=d/0_&iLaޟh !>fقC.;deIAaFL/CNO7G3T}xaͤ[7& Ϧ݈f.Y[Od0gE Ny5'#՚xRK9_crRSlq$]vc=X/?L~י !5܁i'9_j1҂i]r;qV+E4͸bep~D㧛?-c 3nET})·otx۴ّ, UY@2&5cgx9 *H"nxo_y5VIuDc2q.͆:CYqu#GJxc-ii#E$j{mcҀ1H~I,4щ~va^BnkУ *js3|"_ƟO1w\9Q3 [6kjI/_:(V^Bu(j;y=c߮J[8^pi1l-0 3.0*둦h™jP9] z$+p U*zZ ZPy)pJL?@ǚTxXC VXqQ(8)*fì 0m e%5M*ThHUb_3Aŝ%&PC7D1rKi!̶0lmIQRP'8Rf:L8i) B &(3Ԛz>Q"7`7ˁo]73}S4ZZB綫UKt@i[#5Jjq {;% xU!.늶 q(5k%&=iKفN6(w rIfz0sKf5psԩ&f Ҁ{{F_J5Itn:B0^̀*WiGO'au Riɞ$TLMJT0㞤Srenq@մaWS)-HL̏$S!i%sHFFFzp(2Fd꩘rȉT3f l)X\D)- HIWnrz!n XEzK{Ϳ+T:JLc Enx VR7243JGeD=Eq_ Ν!]5\ ijZOÀH 4όTK7PW•;1l,pp^SSt(}Ȟ[ƁG)!(IMp-/򁕵8>Cq!caDsE;&s3w]Ām&4ek#Oqd<3Ic K1.@u?QqNL|=To2gӘC@(߻Oy*@^N~9dW~ 7ԽG=T"C{VDH0ZesDEkG;Q븯5\b/ȑ8ޛ0#c­- 归+bw-^dzH&#ڬ}XvoBfʅ4kefJWm?DsT?Byێ%P: -*_YƊK֧M*6ǹ5=cUZ bOKJAi(-ǎ]CH|pJ/CBmIתdo:W*xQKXEj ;(#lvpX '5 \Yb#ۄ9\Gm~aGAkA}d"]@/-` *(ޕ6*Fp5G4D /8^lA79ͣ nTi>_`f쓀`eRxyB@P,hZS咟[v; yM~L3jlBb#j CLo&XzCIJ~IB ][|,U@%UkJp ?řͽ!@fE⻮l-NDm3s! 3f}LYesTq4^ eh2}{u`FJpUkz_O&$(38KN ն/l8"O+dFyzW痟$&3O[O w}HCBU܈=c_ #Vlmz w]U`ײQi*uJLYv8i'2A9dBM*d<$of5:MdI\\'P/:4 ^,WnoSJb+> 7mD#>9 ur@Sa0`Rgc-wP Ont)0t52*5Y8ήu}0Ơɸ"sMuêIϴ( Ш6I9?FضZ}H 4?5BC_V-bfBG!TїLcS;ΝƄGzsBds֝Ɩv2 pN^w#9D/Y9qw^͋3D3oeh_Ǐ ~IΈzm$HdK'డ.xmsoی/g+^r9x|uNKw`uld9_H|()S 6߀]וb>]u?͡~Qk\]gNz>M7o~w{vݜd un{Jԛɥ滍[t-#.k o}g/>\brz%yDm""nL!A&9o<DW׷t2p$:¯HnEhiGin inIl]+*J׆d Usw~aKF2>"D{f(FCZ93,aTGVJfNsڼ`x `0Ԅ)XS G#)|JsOIc6P)ƚ];λ\u;aȽXi!tĀyf=^Ҟ|]I§۰kGރ YsJ03V&Yb>c;|}ų>']H}v+'k\FmўI|}+[7/Jwf@fT|{$mN7+ǾgPd[+et`:8XcE{AA!{`]nG1LqјSOMEnQrѾ5w}FMܾˌ}2L} oq 6. C ;58U"@9RJ?15 &9>mg9*A-Gyz#$fK JKu8Q$ H (\+H&3C.wmK!MTdjl tY f>vi,ʲ/9ۛy:; X<`) ߨJd1MsT*Հ  Wi5z-{n.D/ݍS_$Z󦵇aT5<=x>"{i4IZ7c;_ '7r{̱*ɨF\#\l8#Gm?ЭbZ3n*z+5dTϧ&ti s{qǢz\ ,^Y]j'kur՗m>u*.jFń'$% Aôrkk3p^gaBsR&-ӕQ< nhZ^>JBZZ85k(f׶f,^ƅ))`2"QztdiL kB Ɯ34j! 챔Qep\T% w_fHDƵk֧xtU˥d|~1͗װ]R|E-^C`@Nbe@ i)\hw5.|bV-4yl]TN9 2΅pIk xDf&3$o&ɏB1cN-@|[t;*ܳ)rb V)m43S1A9GQ;ɷabD-p[i#50t3 hG(pMW&D!hP&KeeٱC;ɟc3P" ETS lOey#;Ê_*a[(&]X¹2s>'؛F.*V;b9[:XD$Et2!(s'tN9 CImlw)J󡲀d"x/5êMK Ke1{3K]ކ4e`,,1V91T >/IP!R*ŧݻw˞)Ԑuu`Vj:ՄeSNKj]`8hD E]-{Rޥk򀢙Ld#_ ƲkfԷcƳ˟9x7ozJ4>;;S~d/5˼(<5~KVOa7ѷt/G/K;0aJ gll U/UE/XGZXBZUv2!@ b)dݚ\,.!\¶7WMֱ 1 /8lbf)qݰc:cV 9S.5 %.zl61m(!TXՀ9qlOl^/D]9X죥Ԏ"TB>`!"E7J}q[*^XXK3GIr I?r]`'@k=,/|>6I4qYy<'WtL$5OmD%Hx/W+iπ!#GǻYn;wU Fs+ C 7>7QrHWKfY@XO-- jCHr ^є yQÅV0ؒR]9B(Y㨋 ,fgܡ71Ƣ/.j2ǾN- ^WĪrk #W3N+,J, /WaŅJjT5(f6:UqHiXy'%[qQsT,;LnY`,/5*ƭ7nHZ)WJ(@K]Z|n^0s[-9v\ł"4F4tvp`!ZCk͋h0XI"̷}Fzy'ƪY\](%rqN޲ B6N9 L2)D5 uTgsbuoXx("׌eQc pb{2.*~BksCA8"Re-zB7*r*b߄x& ?$"$k|W{t9IJڷ׆ eex,jG']lu4u,]b,'c),+Fqu.C.8ajʕ}h|[O΍я;?VqrO'˹b e,b;/BpV>E#dٓKIrz34_?Wb8"]a@|Wm`6 >עZ>b#{G ]l jr"|qA\L:C5 ()f&5ߥ3ocfcjξ%=ȜgrT8tWE4)h^vo{ܑ{q'8Y\΍r_q x~ #4w?4d4ܐ8RG%`>Faful׮2`+Rj {lCB*ekc4~U{H9x=H9w |:h[:W@7tJX֊T+jPUԙ6hE8ͪ3 gg_40#8IݔJ~kR#&Ԟ{S";CGSoC7=- gC7W#(q~W3a43:͟GhestpރI;7[/POx75lZ:ߘnpDr.\9Z|5u a8ؗV6d/g3\jof]B%(ONWgK,] YqLs0$9u̵Oe,ĥjM,="y(1P1*ڬ{)ϑAIlT%V 9ǛH[`ei 8"šZ 7PBDeJUvE !hI2DQH(aeJfFFPB઻v4tschK4lKPABح>CkFj2$Us *H̴13K3DOJ3CϵxEj 2BJEק#54^B^ݢvz<:ZGr] )M5Ċg 3q~ƃ嗴Ak? 0&v Zb~9ͧI(rimt/X[QZ ",<œP:ͫo URNKv6-"D2ĸTjbD\:qLTm>҆VuW;KD974JW1%٫"SZp?N/m~2ණZExG=Y[8od:Q\ҲJ)8CN-#ԕ|֣i4d{6_uѡLPP5,R8x9q>vN&|m65Eb,y:ZGZ3𾚶6jʪ4J&5Յ"T XT5 )2аk!p Wt%~=5ppP42lI}Gux#FDb(?/yE:=ieIX|tk A96-#VEmZTB%8 U=qHˡb6 .œOtډ@:# wZЂQBc MĪqR]g,B?T 2WЪj>/@TNϯZrˈyzmg,c4/8U$0C{#|g@O1J)ORBCۗ~!"%] Na$f3i5yLXxH<"U6 rWϺ85 +!TYukPe,R-q3 f-ꮶ$b¥ *zl'7 eMe\|lC^A>`+K"32|8H#wOܹ# !L$ ?cv8(dT&ʐ tD3ޅ!*gk_+wm&.40-B2Bag|[^zFC BEJH^6ZMTy+_If|}_56 o3S#(zhe,kB"[@mIVe)bq@`(B~X?E}/}fQ=YjSR{;C43U)ў jYHo՝~ڑVE9ik64D+l/DρKLxS{%e41k'\.O'-gKC咤|M QvY\iio"忈O`c -lY(rOο\~/=SEs·[i>SOeca[_ FmYS3%DxXG= ǧWs?gfN@O?KTnV5X+JO+O=s{Zzl\uzfpd?͙!QyAvR(o3TOY䔵wUP!ʹ)[NIa*jP~gcΟH:Z`Y#%*#Mp);N׬WJ]lX뵶!rl]kZ`lD'L-^`=g^Kwjx ~l]!_=]Z9g;5SkYtPx5Pkupj]^zFG:E٩VW 諈5n'.z4Od<հȯN^LO;%i?aiԶ\?Q:Ebι|*&Zv@Np`7~W2ɘ{o[0}z4}.8!NQ.V[݂"Ts6 8X׽˅ Ut E x9Ԗr]g`݅Fo.F¦fʘ5s JH:Is+.1#XSi EvŸiBjqh4h21-"yiXHu8Ba>{V\ȃ>).JEat%7`iBf2 ^κZbma5MfzJU'1}INzڠ:>U}׻i3LYWH,k~󑋸@)a IYn&;,i cN"27"t+ScJ̓_C'w41 cVoJbuU]V`:7ӭM xҎ9oJRbK: ^p6)3+uj8Ը X{,B(9E%ڕ^vxy \r.%-dZO&3痣Y_zle3zyhTx\/70z%⡰NH"IvR(CK wxq:F[aN]>y0ZFS&DU](jJj$yBEtDIi]̇:8ߠ0CҘRi$|KחuZi&@/ >J{mb-;@ 8ulb ; i&Ыz2K9iS/L2ˀ\(i)Mj>JJ t9;mVFy-C2}R)H!B7ԟ@h\^Fx` ׄ񱪴^z%a5¯:/sӰw3m:6H@pK߻5OF'XBEGdahMTtesC6_#U!&bLk֔BǤɴ2硉p&?Cx;q4IY)I,)^^M665˟9Λ11ۥ%uV޻asN?Nskz 1?yv șhLC5F3O}; Ց3_ZI 2U\rFÇ\+J&<;CCeeq U*Nϫeܓ_aTnv k U)ptȝGڈ<=nfkELڿd My9 Tj\> щG=Q̳n4)E2_bO?6!D%=k(Ϙw4FԈ>AË @q$CҎO!D@Mn;sE-ĚK_ Tpˣ{Ij'zSbGE̎g˜V}Ie}p/rD@P޶"DS53U)/Y Ydo}ems#dz$_wa(*06(H0ǀ@sdOPq^H x8Nw-<*)`Ct !0Piδ=TF|c4#p~fmג% >`!B2H{nn]umbc!=0:K:Ҝ"M>MJs+kqd^a_m|[k &_uWh*ﻞJg0F. tRU 0u*+9r9uǵZW:}qWnF57H"W̤6eL:T,Ecc"˟#C_"4r(S r$ <[RitX"kJ,EiJł -TJQ>j8xe 'BSͳǛ更 >2/vrFJ/-Ԓ&e`oD-_': ڏΗ~,E.ظR8u+-U[?#5p!~ܖ{?EEР3T9"̎Šj1N=;\7/JʅMH쉚u ƭ)(-̉:v. 47[8%7䪙oc1^B./UWGqOYeΛa_cTeŚ躨S2'Vaն>MRs7*|[oT؅31<>MXpAd砳b.iʊ*̠Tx{"JgaQy꾺pSnRbaeňV`"S@M@ctAm͔v~e:``ݳ7$H)mgPnGm/9 LZr٪O=Q$ϜӘu1II~{/ĮZu+Y9 $F7MW jEKSD\l2s{=:݅EL:1~R!TWn=;g\BBg!iF5k[+ll8Jh5JOm{q-J_E֙Hȫ[ N3b,$eL<1PZH J")Ӗe5Y'TcuL#Ax̰ c({inK& J}n;of`cix`ŖL9A<$@4_n~LiH~6;cM/DyRbn ]sMigkҘӹY^1\ cĩP'gu? ζkUXPQ3D%{?i6;wL8K~E GfH1`0o,~`T9M'8=STNV,"*S%⥶#0Ҽc;9^)H}DݍHEZ۠%|w PM?mhVvqoVD gJ=rb:$Y&I L]7b!y}= -7`#(}JaĔuFn;}t=TwC1եb!auty=5:RN3*!S Cb .y/4(O[?/nZDM'g)E7ȁH&_A9J A/>|ؽlLa3UO$]3q=tc7lËpd,7K1þ(;/Pg=?5ણYR<+ì,_wX_R !X+jteXuI9qll$UknjƓyegu8@;ձzԥ"[Qa٭H N9H#uQ~ՕmEG- TAu&})a"2Tn2I"G D _Ph%rihr!)lV`B".?a{[_ z`KDA1%Wxli@ha! Q [7*OAMA6Df|pEȰgMۙR$8S @יEe/x68@[3I"eI{n% b $F`HZVkA&"edB-B" c;bS U/˅"?7"RԳ)+MSw0~e?}xf೮uzʪD{'ÃAmmqH%>\?aֵc-}B)^ se?<7DZd?@?02r慲6À'ʼWkhC3(wNChD$HbQݸ0Brb[ɧWj /5\q˜:m?hV+ɷVi,/OQ:GvZжB8>U/JIcM:ƍONn\wt.3FqD`w_GnUY\^uZG-`#z{[?hb%])u3e2xs$ŅΏӛySZh'^yja6 x2S!͚%AicT&r".Ne:a:{Sqdr$zCq&2zD2Pe͈L S iTSn9CZs.BfƸ XZm O:غ#]j+󁩯dzl9 Z4}PjX[ƥWã bzz?0 v]}c}:#bAC&8bQ_a2Hy=.`f #HhѤVk0(dRGfm"⍯L70~ VQ*wL$-/5}e^'S-0)@~p9&gV nR,$?VpHG[R!=J؏;У7'ie}\{8Cu8§PBS-o,`A, 9/ 2 yQ91K֤ 5cJPĮ8z(Ra'Ƹg,$ht5-j0UE,6rb]- P tZAtbu}쀤-v0 A!V7ELxFxpF'/{@&)fɖT ACMQ0ҐM-4xVضe!: kw߶d-lVAD>x;mv $D}bf/>qrXCML"+թ™܊ >dz3?fL6#::쨬6V̭bM"{w8FҗZ̉o: ˢe#w}Mq Ԥy25zu(hrv[cjb+WkXV!7i2))ύg~Rk ڍS15W~*6PYuc\RX҆Ӊ'*֮iH;yu&Ǻfc{W?HdJo H-/C;!FhݩPG \0R7r";1b;HJ GJ1儭Tl~$RbQAlX'8{S5e(P8Y9$I]!ɎJpFTTsPK׀tlSOAS>&F7:mɨpq;Tw-߲5`%RFd(<Xu'150mqI?6DңlfXA&JZ$/Y؞@rH^5mϲL,@)|@Mk,RJϹőRY^\( pBi?!%5x+v!y'G"]h2SJ4@gjh?>'TDfaл1 rRE qnrQpM)jL1: A8)ݤa9ߘnh g 0OPurcZ൘?y#Hh08<_6,?rxaf9 mz29+cKVJs ZNd#3;oLσ>p}(NOk.8h ( dTq2Db$ptCR8 ;eU&>'-P z]PMvDQG^>;ɾ"zFC эEdѶAٌmyIG[ 2t!4:Ť3 @d][ 8qQ%&|tv}3䩱"$@gJi68fVהz];T."QdY %-#OP1""}[ch4Sנ]B=F :U \u^xAN\PM,U$YADS03ES̛f,vXJHu[-;= @82gPcN<""% -  >™Dx?(8/€Pi*6X4]#]hh %4a"d[M ؅ g38wvȀ|jOlC՜-ٻ~q6;y9|MRO<ScFu.nWY\ZKUaof?My¹4AiH}v]Zeznc}oT@Ah Ï`Ј2vi) d虥U[ŁROTSjOX¤ER>OH;04+Pf9 Y$y$Rv ViΧ|Ǥ >X)tB) 4HJ5Rg QʨǵJ3^0B̈́:~;PsOfxC3X":RNpYuM@X15ᔤ\5ڤ<5HQDgGG#UczåLJM .Cԩ!g3>FV$ͧ)[ΧXC@AqO|ЯpNnD~齺nO'EbFh4֤V .u#vEk[$7d`tʒo y̷9=&!B:q{D r2g Иqe*8DUVuDcGQ4qwXhAmpP?H2*nqU]7\nh.ɎQ1<sEMZԹnMzW~Y͹O (SB`b@z ~ekAh ʺF\ltBu$KaVUs-6{Ҝ[`I8rwm^ÃHD;p'5!à8CR-j^gQ()4A0e$DiTζ${sȞ2:?-6<|Ӓ&ۙ}1_7F2 ˘@'AW%D? iT$p"5}MgIJ'Luhpby8 -Y!Vr+Ө !\ |u M"dANZ)9)9a2 fȷ+eUXQxA@Ga4 ;EfQfmF.&dlbMD@1LC#HƑ"䕬Ppo NuUhE"Lv~$g?^̳;n}#bQSfEAIpr'W h_8&@cBwd-)Kҍ+ Tϒy>C`5*Folufo 9ݐ?XrvYWqrGua.0;4Jc=:Nhmte>ZŖC *s(!WFt2;5S>#,2& f2ΌX$JY_@߁9>0s&fmnyupKʪe3=^yŧT"o$މ<`9:W,JDKQyQڊ-$JGCݘ*-L3{CzE*z~=;eUo懬%H>s(xxx0 I9,vkXF=!a uE[ ߉amV9;dW2w o_+1#|st"T51%3.7dC?ypj^4DpR3HtW%Re2LE/ΝQ$CQe *'+9#3<p0)>`΀)ӓ)Wk[W_Ғ|gȣh۽{S=Zx+䀷;ubУ`GOW\w #99,t n[db:2@F0Og 0<xPq^7vAU`֭JkdO:w*w {3 ?M443U)ў̋%$X4Io;К#FnGZ ]3>ެ$&,!8!d/!m g)}{'L"!IRyuW3;߭u`}h,+NkG::o:/=`4!%N0ĠAʧvZ˭8P4vjKFg妧M&FA \`睟:t {}+qlܮH@^ː 6/Tw0-Z=5Ks 2eM)$:z;.o]kl^ޫdZ2m̹o٥=-{o3c!Vf>_ۺ=HtHZ8 M IG%ҋ:PLhA@Xe֋RǹchlJIt^!mOnZyi9I$rK?oYIr a+n}fe4%wIg7"`G (RCsw-9!cG|2w H8h-w;"e^T>@T{yi\"(PX\{F#dsG\]6٪jSgED4+h.ϑ FFQڏN~%zc8% %]oBLM~Hu#R(y$V*Êͺå@D$e&;&ݟl2 g诏d&2 M`Lw<K'%RCa;uq|%496(xd(0E, VL`D AyϚ R$DXQzTš9Z(ؠ>\RU87WDG&ԁL,>"Hu:FD ،#QA"!AFpbM6=Y0~M G Ck_ncwQQ**H;CtOyHi3).J@;ދ+Q$6ͳ[m22QzCD WaHAvЌc@@ hA2P ?E F/Eq3"V6*u'/$x:7̣d yHt$d `Ҥ3,11R!Ub. ӳY+I&pW"Ls4 vN{DAMiq=E\lgg+ɍ>n 2ulBusׂ$60lP V_0s'x?5$Wh\tJ>"qrR _N; Ӄb"GԨ,@%箶Dq`kH ]6[DhJ-njuv]H\Ơ۲ sJES\qa 'hÇs1+Fp$H@Pۜ;|Ȏdp wI8k#=hZ94CE n'#bI@tB"n=) U ?4Z'/1FV(d gUe!M,!"kTp܂0ݔ'oe,Z*3'yWxQu˔EAVR$br19GT8m4~ׂYu/YqV& NDDA~DJ,_07|}M񶘵sޥGh& 1wĘa6 kJX "& = r_Xoډs +V0'`/b!r3'̖\+ˈ6 dԎI)\$R[5"' {xI0tMË٢w˵5; 2zڤ^-F&(gv0UäbP ar1{p"7'GTDGjxl"bsցo@˺Ct=JÊً;J jN\6KMC O9`<\-L}jj11nZ+엕~i|Z+Nj0ΙeQrȑ~E.pm0`R\7)T^@RwTRouV ft"j=w*0B5WdJ|+^4x'<3yLVp:& p$wޙQ–G;\#"<+Sc:ZQFS#AQBJ{[&vk&)߾ j"ZgyD"q;&3c&q`0kys8ToWw%ಏ'aEr ڞv,WX34DU(H0OI޶oYvu "$Q̀ l𼌸Gx%Gx 'nL9[ A4OB@(K:J{e}0la *ݭd='<*r@J@ r56y??.r3ߛW5m 3¼ZOvDJٺ^K\YfY/3]N{̏uonݯXHŸd˱Zqn9k__Kŋu򼶵~oWx޾.x[3M' kg`(]2; 3eR .M%KNZ -yo҆ 5Mԯo}Z0?w`p;[ҦuHO6A9c<dҐ&gɂ$ #ޝJ{w&<$&%\*TgߨfXB&1SH4v5StڭyDHzu:`[v'hL~~1\&P8c#vc<:҇\j?/{ˌXE2[EX7mq7pw"ɇ X& dfT֎*HxВM>Їt{Zkld!ӄ*X U:%8-ѰE>l YV!#7N~CA'd%eT RKj?G_TyN4vSC;61 =ҴTUN(}%+_6aW(Z6;!4,K>1'AoS}aOny-%{^ ޙYŲgOUTFr_[H2: ,Cse<Í U]e7l uMhp) T)yjM|1ҘboJ#}o%T pctMI44Mx"_lx.S3;!QĈH݋-~~U{hB|5h+D0ey;VRV6kOHwj]V%ZBnϯv"%XN5l_YV8V )pUqIxD-J66P"F_QkFn0'aW*!A&vR>09'< Y l>q] 058?vѠ舝"$BM (&ǗQ;Syf$tL+ժ@zag M a%Q,ak"!5`%(Gr mG6\ˌ WXƩ: #+PVHO-c/『&D?`T@ iD8,&2h%7J$[|%GO^#I.5Ɂ{ͽ1S IسYl"!k_[Na*A(4Ҙe})tD*:|gCXJsuMMЛB5O~xE2;w˛]*lzb qFW AǘhϡJzg85gዤ!2+dRV+:0>a򽰩|;dڰҲ%EI?+ j]Tq'Y\2LHD/^?qNXGQL_8Gѩ[%2a>tl pb_~c+˛Z Q!ȝIHQF9)P-Y^=Řz+"K,c0D{l k9yeEsy=&2p"Gag8="QI(}\(RIo_pɺspl&Xsy8_Muor bVU 2[Q"@@t5{߂hjlRMC)^^䊗 hߣtyӾ@4>Sg`|P=W<4J(l>+pۆ47ՠ-iQmtmu!՛j~"C *&je06Zk> mެJ%oϝY ?oANV-D4^Bg#NO Qi_ Ni Ś ~]}œ9+iy T8̳i0(@%%$V K ʐ+1JdK4M‘vdL.[Do]2ߎE(`El5TT?%xʫڏy`/žk[h.Jn$ԛ.£J 'М}np7Q »4l1-1ݣI6gM29 GoeP;9 GC47D02DT}-YἱZd6WQMxD@M D3FP\XPF<>$J$4rPG *}d#3E!*PŪ9()Xڦ [Qq-]ihC E@fF ٺcQR>6%[E#bv}붵ݶ#p˜m.Δ7 ٴa_J _૥XflJz>̔R=RgT^b*)| ?琢2Z(Of|_[_đADbJܙ׫}/[Ĭf̺nxUkUyf g<"&_^T|zF&gxBP_ %WJDQ9$ԭn](2ʍҡ&n0|R:|q 5]sOb;,[,F8WcOȋ6Wo%ӚQ:|E؜|vї7 FszV^u-h iڤDA91 WFOLk= 1%peS=%OR¼h IeP  6ޟ-Q'ZΑ+r!U-΋"יpd560δ &}3r_ou)dp>Ϋ{0=vS֝;h9=Kn# ATVwJtFPpu@1]<>.?RB9!;jоo>Ds̴ȭ+u_0I6?5AϷjgɭIz%49-l`N' \Pᓺ"&~ZVirSA_Vn?dTHH{ ZK̤&I84:Fs~F 4i~2 uM13 yPa:CW,䕙Jɿr=)nzIҡ8ۛT6" gOb毕kܮ0R w`z2ʕ,wZ$Nէy's}9jSuOHka:zLɹ~ݜ1!NJZ_vHYMo&Ԛzm\.|0Y¿PN,KZ7b{&xH@ȸ A*lI${5ORl+ ָGtx=Gyyj޹ Q^d3I }fUk膛*6< ӆ+˶^8nk9Z iFcIJnhu7)A|P2WA:a@*nݸQ&C\ZvF?c'ְ͌ j[I6tc7aA٨d)F h&D.aQtoJ 8U0JO&xmqk6Y?y#n"hi{e.`W-ZG M,tC:aAUl"nt^ ,JB.l0QF+sa]6hAȋEn]Y _)X-r+3onJi5ŝo/f݆k$yVqXT@J#uSb{`#6yQ[6Dڶ1ҘZf$dO'wkwmiN]c`eTZ<89#Fȿh{LKj0"® csAZr=6E!m#?9Aa.D+)gzXL@׉}އ :A+ Ha%]#(^2s~V-si`{8M_4@N^g!՞zcȍ0A g֏8Qy?H88 z)QP4VSWqW5! 'V(Y+20Wc5 i.;$^ݱ7dudmF|@&a_ƷK&6X 'Uy Jl_lhu1KF0 JI?B{#U[ Gҿ} Ǚ%A9WB8mte#[ ecGOt[¦{ŏa{[M!7? `RΖd'oq`ȡ"FIo1qX= -(: KzK''v.bq:P'z\LI)EҼ!HJ8QqHx!a`(H| a"B RR@ ʊj BbbRbIG>@&$$4JXԜ:g,xΗ&@(S*2b1ꠂH7Аrz1]c"A#5ֶ*Ô(JOlft>p_Ó@Wۏhy, #iGn)}d?8% Â\DL+l>c&^*S?S\A./>a-n5LDItȧ3M($ '㔆N;τ- lU`## (Gy 4ƨUq\PD]/hL?]NBssF/ /}F$LBh 2; :K2^#3+ ;ؔpdBJ :oC53ESD;c.Q͌3I+.ooM bnPq@"3=qO@- 8L/Hp25kD$ - eC\DYY1YcH4@Cennd@2(}-mݽwwfL¯/q_۸̯jo:CƏclm y>0uKe.Ͻվƾ[?̓Uէ|W?(Ͳv˿wO.:/ȗsy8.UTwxv~k>Y"^el,P #ML& gB0_Yb=xlp!%f(KN lc5el|v2C aZO.XLk؉(!,6bi{q( db"BϏu%3D!>M0B~xf<κηSpE &c"DbTx&d&{VL<5o 1V~-ŏ@ |MeGtͯc_LbYbN%lreZF}ݗls _6xg!+dx30L1?X7 a\r9zz.iқU{yԀ=W,f:}|q֓Sh\?qSˈe?ySx'PVj4z{LG0=]vY)a_nCt﷍e[?(.<]MtG8\j_x_d=ϖݷnaXg|f`T~G Խ-}?<:i"ǜw3J PDL ʖ#ءTi0r~Nv3햿 LZ.<'eV]Z +J6K#e "aR5`=siLUD3"(zC_5R榦y;w+ܸ)NUao%<[,VHlpX1 cKχOr=*"n"tH)I)B1UZgvӬr{lJMq"g%)tQ;65E)! s`eď?{ Z*D`7E Şǣ&9H:-[Ξvt7i`x*H gD`xH;(*:w㒶]Ċf8B3#3Ev7߭D0Ukp~M%:E$$Y.QIi8Ѿ"a";-$0RKg5 +U$C?yu/" |:\7q'I9 !.T%i7ݨ2?'1зe *VQ3$({UEB H UOqv7(Fe'͢:^`q7S,_~)\v|:K9ڊ֌y%m+JZtJG3M tP"Y)iFHi KہISzhԀ<0FҊؗDf2 I0N$h8Ԑ*$Q3$j&S\dOB㢭ф@3Cס0o1 ^"֋kFmm/T! H#NDIPL0eF-I:28hL.ϋ ѣ2\F.j6/gpQ|MMJ0BLJaR@0sf'}JAz%͠pѲ"h YFiΫg%NZ B`@q 3Ȭ|čq$Su誗27#yQJ_@z ԃĆ@h0z)2ff]gjBg&+#E*88Ը?"v)D93@$x%wa'3yµ}#;Ckt!>dߡdt!|&AWx>h+ɐPd2\W]u B #SɆV`$!< o#5X-Ϩ Q>Xt" !6U'\HE#4+@qD c"X"dt\) bf ?4YL(I;Ne5zg+3vp (#G6OA6@0kzaDE]^8Ŵ&X-͑#2B1hiPk3Q0&9.'u>s[EGKFS2BRDxC*U(t.7fNIXV6d顤ibUHu>\T(o>Jf /41_wH.R\oI/MUkedW͊mۚ&MW3!1-5(brH"y5cOpCD5BEIUjW9+kVMe xnJ^$C f` !+0V` ~_#l@BP:m}c7*[;'0x$,x`Ǫbm%>cl.X 2%D@o{m®/|N/$uҒ|?SKr%gUÀ N'De6b\]tSYyv7+$gKkڲ K)7o[?{{ ]<~]ZY]V0u6g1 gr-~'ngM%j%7TS]N,0ޘʊ#|h ߧPhe(&QY;>8̧35`JN6IdN~g~O),C#@[S|'P$5i4ԧBYe8u,MMtxtzƻ_OL[fWw 5sd^#, Rf.R,o'WL'oE*#Pyd&F=< zU2(Eɚu.<gZoYW UC%,{ABu&?+O 8M>ߴRӒ}Kګ[-[`,?ɥ! ycxmQWm]7| p~5'VOUĤkS4u66b+=6L htt?%_zK(eτ۠2t KeBFgB L^I k@>ǨGSҾ`;Ӌ+䐹- 0zBbnO&2"< 6y1Ng0f>K?CzANv=5QBLJ[+-&ppgQ|y glO.|U>$wUDElHD;v!6D=̄]v^U7%PkO^{Vj'DH$`Q<Lj?0&Sg޺/hc[jZgm]3Pܽ?}g] ) Oh(`-mS4Ia>}Gv]/iJYh2!4 @ =vNfmL l҆&,*ON*g o'ʑP 3;u[rdQ1OISq3PMd~ЅƊFԦdIӭ@"T+߇P0]oUt◑7ys}-7} sOCHl 0P[^i4*xc |,0(WY-%N-m@7zY e8%bOa}F52nOc6BOcbX^V=Jii$t68E/@2y8no X\OiPtZapމU%'đ):(Ëڬ Fceiوc=b,eC/R7tK:4&M%`4H Dޟaۜog_{zAfܰnފxrT^M$bۮzPus9|d:*mM m5*beJW00yr9ze)08P\!Sg3 V ᘜ>"R ;%BX]MUrb?!m+ :I_ i( kd.}J8\}?K t(zI7F؟?Qw"[#j"b78Z/qw%Q7z{tp<}Hs3w!跟R_8>l|Ue +stZq?i_O_n֚ﮛsQ|+Kh]Y B]6IHS(%LH&uZ+͵Ugⵂ`ei% nV%"fB0j YwvmMFaz><=BѲWvVczhgE>@O  O?<[JSwq6a|+ ٰ%xJ{FU{%ݾ~sIq`Pph¦TdH1%@zT'Rɦ*$" eؔ_&#JX("⤠=E2tumP[q@Q0Rƒ- (v$WA|PEMBt 'wۻe˒KpE0&|`qBC,N0 E<ţa&LUՕ@[@7JUZIs [@sf3g}T~_tUj|qN9?Qٜ:.oq*snuaRyeviQKy:׷VyB;=.QJQnu6jEخz"lWQ>-;Z~4QUc I#ٛe?iܑAJ(QhdmI4}Dwk`U|8t#*s,~/\8KyZzeU_U/t/NÚ=F/De:@'~sDIKR٬9E##uNC`;BpYQ'}fmj_5ttǃ"^WIN.v>w]׎ nmC/_"V)_bq/^Tqdl܋UDz@&[ۚF\(v \Q(!ܵ'JFQ*q(JqS/Ni>Np^|ߠ>7NrP޺b/V<j jTqS2# &q1 /FJ*>b !iys>&lZ7MÓ`#iOyI~7޶.aϽWz~^lm'ބ|uv{l.BMsy.(؋5IǾבO&7's/IqWOщ&IxqtaGZLkD8`~A{y[>)}A -9dv}*"8,.B(9br%bYXT).,=|X R&e>Il{ݏ1J) N?BTQƥbM$()A@z­5k-[Kà rzvƗ ¹͸7sQ6Uy &!cq*'SXh <ΏHHɂET't!ۭZVћ (0xcpH__w8;&Pe'8",n OiRR#4" !8yݤPmbdEM}?mCZό Jvlf|"}W8 $&Î4Hhm/*"lqxe;LLl%`!iؾj>%AY`2 KU |P+0Ax[_L|-q#>(B&ĴW*'jDyA !A2Ǖwב"[/[-W/[ݯ"0ܵ6FOQS4M'%C* ? !{tOɃJ"?z([@ג'4}IQpA=N hR؋/(pbKaAz'^>Y}%ޑNsI6*! q_R/wXn>ҔӪ$O63/^lA/|9B}vDK0Z L((~"8[fF_~9Q3š*xһA=KqcU6,{qY[Ĥ# ([2Q6EUEͥa2" F mXb{n1_QZ#8-<`^]$Z蒜xq|UV+ԕjhgVOU U#VIGO;Ѓ6~/W口~RP%Ը!7hLk @&g+mLLs7,Xbr|ap\iCoO(i TE*t8=4xZ`P%Md;18'2lOK8DS z] -$dJF">LNtWYNkVhak"  ɛWgy3mA{;a?~m~jzjܛ59p&w9VibX90h.E z5pcM>\x}Cz㖦,]%w7t%uZ=%)9ݴS+9+6`WW 4T\*նJw? '!aqL0G_tkL~ m[( .$<M}~Ė6K" 0ɻVe[rrdpv5sfl;lXqlt[sq֝ _͢ k@Lx/9U2LO5-p# MJກ4&d* ̥UJ'Gx+R?@(*]Ј |\`h4(r ?Ma(MQ[޶7N8@أ})^qeۊ[D/'%f1kQu{H€oLZ +(?0`%=!A9 7Cr2$GbɢІO6 !qd 1)3`'Bq־t7  #a=yy |!$N%Aۣ4]k_6'D)xı~}AqrFh%s2@'XQ/)`Eii}}h[EGN 槦_$S#Q  :.9bDPdő+SOaqB6Th,ɿT+BX4D4Gt lC~q6 L WߦzPT&:q hy 7F)"+ڬƤ7u)a-3,k /t,g s B"WwL;.Q0h ooQ~-)MG!Z!$)^E)G} WHe:z V#ӋЁXwm<:79;zwB5šp0}U,񴛄\*4[8m+ЂXe,"_י;gt 4D54ERL0aUO6nɩE$qǪcx + 3F3p` VA+L $ݦ{ߑuO c@QAB"8 6m6#Z~H%/ s.C2Dp$vVnJ[P{ݹly&{N^.#/}7H[ʊgD~V6JL/{+d_ xwl+ĩ:͐̌|Бp'K0TzbL9O@W߉GDoTnmӜd($rPZ]RSb*I%ѨQw5 ^O`Lzd<+NMu)F(_87H .Xm۪L{0tKmaƟpΌ\U @K5d(^1b:2[ jg#}`Y>}+<@d',#+WEyH긅 ai_h& Տ!Aǡ5F=ij[ŸqLHp'XV%Mxr僽W\js]p|kaWmuY|Ha"]5ϙ<,i7p<-׷eKQ.Ӷ۾Mnn;/E'=< $t Oߊ).qDž>Y/ziBV<ǟl}UXYVsG0ԯz6B*u3_{Ov--^#z5g%* ˌG>Jl5t^Wa&3b}HS `Xrz4; n'@BLe; ?{"9/+`}Y-- q.$8k{~'V&V87DA: ?H=h&c/bd֢v-}e;\T68 yS `aYzI' ܇q=` TE`NJòY}U)#2yjJW L0UL;i -d֭?M}18ES_xYbBUz9Hz,ڔѷLAkҋS`N ˓sؐebez/E'E~B8\2zCeu;w`]jgh,TV8U7Tiط sRa 9`2bz<$kx fо꣞`}`|ie|M5C4lU$Ƿe/t9x߅QoʓbD,tIZKUq",c.*$)+{E5f NhI*pq/{b`q_DGn]o<cHzr z)NjO-ГQ6tzSpYz#h {ka:ü 9":|rH Ѝ[xE$|o#f&p_=)x w^l)mC–Ȗ=+(4\jdJ?qG?y=')(rGܖz8K\8e3s~g48Cxpo/;l q"EeґAVn?{kN BM]oVK-οr;oc&^-`n7Ľ%?g||=^Lw`vS`E}l>>;Ep0~VWY>IKv!v-ͻIVQ<Ծ@*R+5Y +m謎}vw=`.n%9>3f ,6/׮ 8YHO28|̗]8ƓM1^UTF,S{_,*n +> "j6 h;39Kz=2L|=Mo9z',bm=Bta8D!hvlךoo"(<6v;*;H{9mRc' fNy9a*%Ә>T怀Sh<9"5ZG.t@Ɉj2=hY<'Hkc噦=CX[f$9App3*GlJ]kYjJLlASbREaI~7Xؓ bqgAMm Pe=*Bd92p%Hs2ȢYԊmbZ>URlٳ&In뙩 .1vam|J,6fz֪ M- 6bz"l:Ŵ{Rv\!$zڋB=hP,Jh<\A6Z~ .Y\2M ‹RXgq2ҏT 5}P Fm$`{o# V]b˱\9 aVv8'cN ,2oSA,Rz znJ,wͼwiÞ$SrU4Kߎ{{25Yi0kd@z[@C&tZL)db֚G'ZP*xMupu 8hz8`툞n n?)'{lJ_JLjBU[v6p+ Y% Vs|HgMr5xw{ᝑWCxNT{/{0x 1!YQfCZͭ,e)9#]4%^_vz b<1]DFQl+n'zzjh35,J; /ո6qBîn8c&_#{I/+8:-  9GO]e!j6cث/&)9к< 2Xܜ{,aHm80Lʟ]cLψnճKQj %.vz".튋A h.'kԍ"ֱ5\5x:蹯0hq\]4=a_<˄ru nHC]O*JSz24&$/[Յ!nyGm ulj0@!6zwKW[ui~5rWq ypC[$jz!<"Ru#M1ѽ_kNTƤ#RGDD53ERD0g®̸V)ۣn=$McqgA+ `<Ԑx#^*+lUHpavv-Z @hMx%00#ixIeJ(i"`@1^ BJ6#m픶m]h)wir^rI.%'g3?Rv.eYӤ:șۨ2V]H"Ψ̔j-fV{Fc/_%<̩u}Jqkד[NtBB*e|yT1 4ƛf[^l f ilJ +.!% Ya-J5 =&Z | 9`6 ղhM j?"ߦ}ɣe9Tyq}wnrdX'JjZI+fN~p[Rf9bfM/1{hp&W-o@1x`3t0R* 2nO#+#1gjlaX[\չ! aKI1)PnM@5U{E6rr`RL*ua0$/$ %a:ul-Kp\Q8&lFRǎbmñ")q} V0# {JA(2Q&7-N2J>,^LoW;M)WWgCE F⬥T;حDuTǘwTdťW@q1%vL,8U|8f2];1u='fq5!^+)FqLmz9,l _<7'TcܠK6vǴ5 IJi}cOI~ࡷK3*p}'g5ڀE~jcoipc/}cqFnqj{QU}X6ל*;;˖2#^!*f?${ƣju[Y\< OF}<81Q#-5*j$ ݼI5̞WRRFj"dLi+`ï2fc+Ա[zok<&.~e3KNA؞>/ňF $yh(?0e?TBs^i  #4;v%Yf{Ҕf3R'Ρفc;s}ϲ`-8=_D-3xg™ ^W8t6xv0#4 vYRd"$qZ)P 'gLYUi!f/a3j8Wtv@<@q-mz:HhJ7 iG,;o5 LbljZzQ5HDYSt1hQkF*1%[nw*tz;ȳT,FuzU;gSobPAy+> n봏;FhHm(M.G 5T.,TM]Xqd.oTKyR? )6)DK}Hz b]?D<1rUVPɧFDu!Ïz*]3Rdpz;vU$3>3"'EF;ƷG+ze?ZIY>T2ʹ0D*}+$_4vKvٱjT"%(?jF>_Kh< s 9T8<l4|s2K^cܤ mE vX)(XD<6?`Z Z$~W )v ӎ`98,Aَ@ܾӃYg t5ӚjUn)#CSC}jzc7;DQ^MXs# rNZLAqr%}M4Ol㑝xS}͉ԦD'M<Ӟ}'Mx I;)V'ވp>SV:~̝R'ˑp~`FsZߊǐ(q^ᗕᗐ!aJ;PAwnDJ:㒛,/;\0[7 AhD\6|-z=|'l1 I v;}ʝxഴ)fS'BaS^bVY;бʐгܛElbe&u 屷x,7J,'"'r~mN;]!Qlyd,4v`pb+ ZcHDa!A.K BpX$W/x'Т>l}]@QLOIh6"XAN+YgTAy5ysDa##$$qrr9 tza\6$R bsG|Oրɲ6UJT ݟ ]]w#.fP _Qw X.f5VO@T9]Z8Jr p0ˢl'xW5u(9&cyUP(꧍N'fsIy\Rɲ#Ω= D\3uЋ0:t,f{7?Vbr[*>:rM }0hm=T9svPnsDp,x*\|'' d{NKDÝH# OH#3贠}2kĥ5 JG"hjH;9ǧ aAtP<0>t,uM5 !]_&n&_>[-uMşl &1 ڕjyKک0Kjxuɫ2FvзzwQ19Hʑ5GsDY#dr9s#9&>Lc:U'؝Hn!\9)2tJE) ǔ#sr aEԵ>7Lm4O8"#nYmC s~Tg@;Q}~aJ8c%v9R NRm}Gw l5?p_"/d2 ѓ[QY+;oGJժ|)tr A㶥k7}7Z䄗p9D0ѸS0T!מ#s$ß#-c-#m)wTTZWcvt0>múGCLt\{qҌ,}`Vܢxܺb6q5-hU #օDT݉ /@l FDΠJ- f r-#^d bы+¢[ cFb/y lR#܅)\ylײML9fN"朧 9$`Ar׻[kcph A/=NPLξ GѭR@5sz{Eu6JoqUNB ,+sm80 4[KۓE Y+QY>a0* 6/{kilҮEva$pN6d #kݪe ߾bA"&F:읷k";bsݗ`n=x6oe{eSF$3x`vj%`S+Wm&sbE7@6[UN\Gܴ T QgضX]{L;h?LI6N3P3T@3ES Yśi[pݮnr=6m@PhFъ@bc^N"/jwsw~ffL_eg*3D0C& xO餁*U腆ta8:|O8H݊_ݽ!֓ZvwȪ $_0@cXN*lbeyn1!ǿwnrΙOw觌gŚJnKĔͬ9󱋼3p+;ÙU#>:$&<ytVL (EWW ;?N (6}PلKG4AQ ⢪Of*~8)ljM2;'0cQprR~R{L "P,z!vLiyQ=řFEAhVO|L|`'f%E/?tϓ W9NO7 %`: P^)\p5xCc3 ύ^^>V?韵=HFiY9޴(o1'YlyVMFG48eT#籬wy("R>Yn$3-,oh dBBڛ#irN | {ZSozaa)SQ ~ٽo gl"qVmT ~M++  5Hf ^y9Sr.x y܌k9KKMq~@<è3{x*ujuJv8Dt4AoЈ:=8{d2=mU^bY5tMs㧷~nehS!R I`]ڼЀk:7+ofJYE *HXe"bcY "Cd@Y5L88COg]DkY~AbR s>6::b؀% ^ @l`: `fvVt!Q,פ RŨra}yK.N!CxDz͜鐅ӈFHok:e6&Rp?A;A[+NO6ڗs )9b$Nx+ʴhVt, igEm.IirX#hEp /m?b>R"c lz qGp6lm27^UebcP!Y ̂ ._}ɐƯG+́즵'OB VsV", >Ro/h[BӖi|H(o%/JRf%hW𐆴e=Eڹ:+î/p~GCŽ/O͌Y|>Dlwy݉-O;ǿ?رOb6 H4|'}Λ*沲F)t! ڒSJ)%?a|m`w+(Uhݷ}|Rl.POսoTsBOx 1|F Lbj[ͷdz4&yghh4R#ZY^)ehBaWG_w_g*`ilSS4JƝwqŠxli Zʴ 9mN 4ѨؚyQMf)jpധFwnM:juL4g*ed~=cSbJIBOSvƼ> Za|-Nkq,H}AT1 rNTlm+r_C26[= _j]gHtN,tiZ\A#_bp11 C)",LK~"$21|3}*XtYҷ7qb1(9"OI8E&ldB]F09r?8 084g؋,:3@SG]S9evG|G7;]!}]測+V ؑzbi xꈜo/v$6o%+)+X}Eۇs^k\ 0G쟢*Y֛ɩ?Mɰ>NʠLn2wrߥZ%;6KJі[NfPaKsdcaS4?0aiv_Lܢ<(tHޅbF"\L=ؚ)RoJKn_+,}4AMGhHcH/5-v|iǧ~Ͷjanu{g0Q> %c##-~)^ Dl% Zo)M‘?XV]g#WjSt#a\ t[kiMğzI~,5mh5kݫ(E;Fؾ߰EQaa9bU9clj\sKx,ѰeY؟AW'&7/ýV4M}uv]o7Gq{P PNEfIV%!_S~7oDۇKRh(X3 DN&'S ɼT=56H}ʴj<𳝛&lB O6ZDei}0W!$`OɔI>)y%r?S}JOjS=O) ^MI_p(؆ >O.U>@c &aˆ(R[&'< Z0HHe,=]kX~V? e^bW~oUѢppn Lx~lj2{"Y6- s)7Q=4̺ffߔwZvL !:g$s?GM!!e?D9?:)n'HQH)>:303PE@P=̅*"ٹ3-(ݲ$j@F A8'E|#@ (.;mm-Gq3 |Nd<dB"~E @PBh( @f s, Eero-Y*7c>Liɖ!2 "@ ɶ>x~14fޙOs%G>tiRfMOOgNY^z#7AJrqfRR]K͛ |< pF7O,ʁbj 1Og3YqMJՋ [ij"TJ[Y[ լZ*kJx=R_TM_}oͤ@LN׫jj5|kZ- .7%AU=4B묅 P5yssGH lf^H:MD F|))+ZiU>XȶVKotǻ[W+_Ԕ' ;҅M~7[ A,{tކ)p3E^D% zu xYvb-! `A4 md` 4`mf` rLhP6lz  806_( ZFl>iR5hټP:=^i HZ1+Ygi5 "<_t5Tߜrho/1vDVrsR: Qb>er:1"b !Sߌ_?5Ag$8s ߮`/\o~DÓqFs(T0w|4TxwQNfNvPN?" ¶ ~gr*i'I\&! T;aM;;j ^U_kn;gw+߀͓QXv]^ܯW (}>E n\7"l=Nh [[WI9L)ȕD>11ԯ\3j%(`cTN/R1+HLp)T*M5n ˑS|s.k!0@??E1pV\w7t^,"vv?6"K/J6}nHT2M5W_B̓4cHUw&b -ɃQ[Μc驧d;#i>ox ^)뷜%"Ȇ!l"'{r3y ' ǓW\]sÓ^ϓ^ۿJ%1 Q.I&8|<ڜd@;c qdY?=9f ۄ;yڈw'[銮$L-ܣ[;ވ.qnQBySӌγ^3L+x>w^$2V, Lo>N>wƙ`jǁ4X;0J&j,v<%ǂ}L5OxمW^39? -Y)J# {AE#vgЮc 91ؚDdYT35T81̃I?zQGDW_ݾ !tƑ&2Kz>S;`6M$i{5՝C=QCBjAfH}\}K.a#70/~QdGeodNX N!:t+;~/i6{zP ܢ p$Qi#n~.bl]x"{#s5F`4/ˆhTUGay4rT7b(i:ҳF.QF>7%2ɣF trE9{ z2f^smv5tD˺oߘ I+BR4s*rfɲյUtY,bSTj5w $@vBƳ%f_o=#`owD~-ֹ7+t e2HG~&0WSS硧 84|ҍx+QyR3e$_Yu k3 5wAz Kr6q[AҚ_aM5V]l8X.ɷؾM лfc3ywx6h=#!ݫ=g4HP;{C7 ̄؉B3! #ZSm"q+w}ۖRMfNԇ&ޯRO/z)b1wq1uH/OE3+ى EkD֭cslr̕䙰"\X6|΅G KVa~Vw``ZKC%2h,XsI |$['")b|~ߏ{ܔR/DT uqYsTـmFx {7p/~^@\7p(Pk@P5e 4l,X @i x !wLX ~8V8X/d-+@`n7 l3 4mQ}&]']kńon(F|>\=D$$@ܻ3+TJ[X)l0U@߇`_p- $<22$e>_{XsYMM?w S1{#3pȶ<-"ۊr|@"KFGcG?9uOp^Nλ <t v%:H %1d>/ v3u^݁nCn92?Eϣ@:Hu?8ǣ-pď7 5~?Fdg~Ii9Rt 7ڛН{7x=KD[DZp1J :X] ~.gy!5TH~c >gJ%v#Ѩ8ekѥTN4X@X'J Oϴ}򗒟~Hb$$pC``_첤) 6tjyX\t n[zY(%F-YYS0PQ,⠪N<)%"{n\z[^a 2>.ZTЮ d3H d{mu^QU} Y>Y:Qn֑1 Cӽ} w&NB*Y|pYX+&taNo[eRKe$) yIDSV&.LW~|\vߛP`b4y$<=eφ䥶OÙ Y>,DP"U2rC+\5CS%)ĪXA (6ST\ЎB+z?B:I[?he}}w<>U CF3`EQĜKŌ%IIV/%jwߠ')ҋ_ _Y@-JLݻݻ߻-ɳR%G% q(N$lq#4PWe- 8a 8(0335E[rc0D`9w]$AkYDZ$S^q=KkS72՟q84?% "*T* ^cj;1윛o${ݸu~\ܙ}lvܹ{p 3OKZ*O5f&;X&[nR-솖Yj"]&YԪ {Ƕv5qtJ"2DRi>q4zS`!%!S(A.!r%?4yl!zZeYAxVum Ǒ~x !e~?@ $,2ӒG%3Z6Jy}%PW%ǥQ#g6bWFs 7Z~@P_B]qIU9y }?r ~nSfF} E.AϺ-|Vz yG'4EKVGd.nz- !r$Tg'ۑ{|"S-3~F؇KJlwP0l?('ĖJ;1 Phl,/U/c\ѽ\W7$/klۯ`%zmS2C~tA|/ߜ#M:Jf(2 ~7FEDZ]x۾ }_m*&ݱp< g^A|SPb-r9>e~A Uei+&v~1W~wDWXP~)򲻿e3wEs(_v߫.̏ǎKSLF.3HJ8;աWL !\[M[*Pd[a~'X(|/+ģ?(U$ d ՛͟Ӟ j6_ovc r$ +G~ˇ ?_kyي@A9ԟXlD=Mu/%3C[>܁!iK3д O`tej.ǰ`bNOqjJZZqU^yO/+q9ߟJr!c>`DHA!a kyŁWsVѵ #uh:ew=7u: ʾd3 :m'xT&_Yn2ބj gqIh7B{n('#`%^i{&Ah>)g{ hmz{`@xz>?|W:!}cU̓-"{'Q W)vԘ]0Uu~:kKPЄnz@>[_%`ް-:sNIыKS2tr]JZK(ȣe~!K\z<ئzyd!zLG  S4ʁUD>2(9ȖY8mP$- b `2%z _>h֖h= JnIuƝz}B6MaCA?AxiVCX!,5'!tE!+ 8.`_x3 *LH!ZݸI3*eiʹrUUN!X'׬\+_qm޸rs3+Ac2 zk\u =Wӝ*EAl $dH+zpsYǬ]o7"(wbФ &}@۪7]h?^84 d $'uwQUvPƌ>a`w8;a#l9Iq4@Tև*J,Бh=p<|24shH4#!^|^M⋙M Q[3d70;@IݝT'y'BRaWel)%5تUln-Ď\&!)aO}V#enxg,3e>KTD*kc2Mjg茻ۃ+*(.f_54x7Sq5N*tT3#fc$o8`Ƃ:pfNlx`:¤6GXnIzqā6#'ok]H S8 `c쓭5%բx;%*#0>%eL|gK9b ~l`ݦ/_:ٛt^3')3 !K3ryp9_NuB+ĺ[[yu9Z Y9|y4R`FVͺ`C$7E@!?E-]?ᕲ;PqA- ي3 M1(&zs_N cఅ0XqxT~Ax,,s֚T8k"1&y p^. :^YtmYV.V2mq K5 sT*6!$/!Gx̫@ b|X30D4>t;ځo K`|C} \} " }d .2VU,)IiAQJ ޠ[4cF3ES#|$Lɶ;em W ofv{"000׈mėY/Px2L033f.,T؟:> w"@C8Ed,tH& J0H`  ZݶGD22/^wn\sEzݶD$ 0AރʑL/?" [J>x8ẉsS?~9InsdMJuB*JD4L4/J!T8GfzNn.4|[K7l5GG|rb*~66`R;,3jB)zS1< $10} ; mH.?3VZxC*/&(C~2ǡc*-鴬5 {޴IFW}z>gAgogoOIl#u\䖕x9c0nܬo99ϜAœoh~l%1/wQ`$IKwL@1]X@=%k۩8qۭ=0OzA<ʻ̶ɹ`uI)ccTNoڵEM9'NNxŹӊ6LoCejy{fm>;4Jpb;ryvO*a?cY9}G]j/|a>}H0EHVEjyH[,Սl?s@TBU5 hShy3ظ YZÅemDb1(v&v<l[YN6ğ^sp~z?2C 斃|^L_x4:}0dSqJ\6B>S)6no6Ϙ'a<6A~46Dd,sSaogA,*ir o6~kF%DX$yH&&IÝ/8ݺ(nuqitN6e3G2kV&]B6\**{ХY|Bp6q47ьD>uү14ۋnjMݵ6Y+rq>%ȚU@^/HrLF*}6">)uōMSR͡pX 4>< =Lut //$<^x@{MKv?tih2&?q _w>`Zow51*Rx` .)݇eyU܁s3B5+fPssj葎0,[Xs='*eZt8>\ wD@GNP~-_Ajq:q&gՄ|}.좕 ]μwBz+ h3oN(qh8M˜P׻.i J !X%gP&g۹-鶃<}vBA{{C/T6W%+v͝E .,j9CS cqn 1D[!n9TʁsDvi-yEy05<޾h+m$-q{>`}V;\4>;墂_yQ_J5`lI S=1u`ꂆy7:#%%]^w郼yo]cS sDWVV l}thlAzڴ4GL>7QM@t܅æfLpQus;ݿX 4 aj%7m|df Y˽ f7.W-|}q?zh i >L|ߺӮEfe{[Fۡb }.je\] d9PҀS: m>32Tm.:tBɧL=8'޻*nlN;>sg?3 40L"Z}a:|uXPXY^ {DwY*9057 z@W<)xD [WK#@N펿c,? >YN#3_> "ilV[ݫJ+Wq^2rhUQOX=\bnي1>Ƹ[Lԥ6t qt1y 98D1@,8q# %?~ضY\g]R$`NAYE7̓X`5k4Sd#KRѤUZakLcck$Tit #[4*^!N"|?,)N,_k|kSZ^E>y8-(aU_S2Q:.ݾXBΪܢuRNx(H)$%"*BUBr_ԾTئ?NB*BZ\w ɂCWBm̰ug?k (]UmVx5zZ"l +Kps01'p1_i8RU^R-/8 @4/ G'NЕt'Wđ.&-wsxRXڽuj*dּT-WO ׉p.KSN@DIrRq#zCcL 6oyߘUkm` KYP,4F.yZĻr4V6ȟ0bX R{k8@@h9A0OPX =RŘgfسZO@1J}jO{֩2ik8 Sf`h!nQH6-|u/58ET,¸ ]%8qcd8E'Y_zǁ+3yL./# MFU=*߈\Hқmd#{yFK"NHa'gL,M=>g1NO_w\q&,P x ܱF|XV&di1e;G\CBTafQA)HdQx_-u7e56|NԄTUKg8VlmӛEGc>f[`Q_gpc]=(=KE(18(\z3slb 8'Z,9q65MzAӞg}:aoy[wPP쎨}Gw{َPzP#TuwPu厷tH}o8Z9o TZ#^u{kZp] Y$Dx ,uAɬ9\}7ar0gOE }Thm<6"$(fn y4"NSÏ6BbcZMƹϱXhSn]c,Xn] |&4T0#EUڽ>eOi<$M42]Up-ݰH C~H '_ Hz&{[kV ,K E8!X-NpV!TVP S#43VmۺbIBe ]nl}ܿIj ɥ7~S}SJU-г%aTƚ}zuok'cd[~ȟmGvn[ͱ{ig8߷OGGTu;m leuEEo49sJXumA ~KsQsW!eNp6 ;v] ,2525R)7BJ*)4RPe)rhjRRp{% \Z`N"?aWG4.Xl!|lܛQƑ~͕W\` UM73\䇗bޔwO8*jυk<wK=%CxDI#6g5vV4/q8?HFovzzdb`6+p4;qd3r>RbǥChhfd,й %rD霛?mƼ#2T|>.AH688&=>s1֔=V&L7$duƤ2dcw߭xK>V\c7 e\5Xpd6ꆜ#r4>|7&e}w~|{#> f=02x(C"a݈A׎b-[rMvl"DKpj =>G(+KV=$tEVֿDZ3$f,kZFDKC g62FuTY82>/EM8 jWfMQ Ϡ 0\ǃ y}$oI{4$摻@KD-4)ZTlyN9R7L *(;hMը7yz3jOhePKdPzΑ2Kzj?.Tǀ;bf% ՃCE(Q 1)Qè:otӧtt)a?O9e$F(+skPGV`2+ozSM83mI|R)V/ ܞ \x͎ a=+ٚ'wH79~5Ņ Y m'iyc飽Vh/pzjFT\Gn($&P - j˅a⡘1G6EbxֻupkFoVf'3D, Ntb7aE5"R؜!^}xqs#kӴBifϽ(V8=/{ 8=aԍ5LXR#e@V?RKWcPhpY&xW\]4kZ5>. AElӀm/?_f ߺb}( Q,.UҪAMSdq`y:p_=fT68c+kq p,7@c]cʘI{ifq/J42 s=K(!&m&S-*dƠ̹!Gո- }2 JݓZChr4jsxz/͕'njj- ΙͬӦbNgܐш{-2 <noXJp`G(Lzx'\E$H+rPqT*8Pd#I:ۇ{OލjJ^?2UGĎ?IB!T[NK#kIzi~_/#3Ɍ: |шC6WYC4a-H^RvL;_@Gt;ϒҥH1.K4(b - ލ6 NK&jʄf$\(|' ",#+A#cF€4 к1bG@_~KYn?h $}pL@X7*jj舌PĄ]P`~졇 -WL*Tx~b(6Ws#y_sv. k9+?+l ϓjB}x|eHE d当"[gl\ k.RqGMc 74 6zCUC6a-4ьSzMc 736o#C=mt՛h!laC64 t~X꺣^NZ?[Tosg.v5%|A($-) DZn \xͲ=|~!$1CB_} T` ^_d?blV :QNDU "ML)TT D0G.2OD0wOt@ TTlĊ-=|UlVYm ʁV^K*|CA"ôGD_X[,ۨI>a.k1T&+jAiC+@I0"@ն\ߤk`QwQ[+;g`OtOsSCi0cVtoD]G !ξ5ry4H>O6|.&%1a2zCLfSf?)f4^FbBt xҗ'=XNoAݬe^%Q93!v "H i9st^C]ѱW9M"A:"O'鈚,Vt]:!s7'ǖ'Ϭ{4Lk ^$OO oǖ#p^5AΊe)t{rZˬ%~#C%FoO#<;f4ܓ^<$SD]`^Uzoq5YhK G~|@̈e@`r-nE-+/b2vh9MN$"] Q SX*, t]WZq O80P9TQ^-_TM _n-#q֢eډ_TKRrK [\' ) %o\<{Z኱}TG35Ĉ"0 vo8V :ߊM\S^|"7 O5w7bwbh1:vt!Mڙ&1i„(a8b]xtgNҮzwO%. 6qgpXD)'R7@SNK ?ABX817$dTEQw}UfMbF4]4*]fYz*\ ]Q<#զo1!JZ8~yt;3XaiyS[C0V@ppXDpZT)/q ʛlbqݯߨu82gCQ+}!.f瓢jL~ސj}jr\5rLj!{\h-@_!^Ơ頬]*6NX&\pz^}gR.s(E8S i{YNE e3У>}x2VӹqtW): ` \lV j,nYi6 D`e.APnRTyinZ{Dմ 3rT% kP?uZڳ-Mb.Ȕg+QEy]TέH_?3@}eW8aDmr@T0&A*g2F0PpF\%&bw} 2E*zj.Lǹxr4`Ab@O',"cRވX7|hd vD9m)$Apw+tU kXxiPPY1Af*jNEE Q2bL֝bi*e!c P4O@8t.5 n"vqɵm\YoE:۸nm?"hZarRa(掌$Yjׄ쒖 ~}4f99w$ᜲ@.xk:;,ӣ s-}Ͽoݞ MyhSž_-cžs1 fls}z݇E7~eC~aCC>°C45#EUjg| Hnzlס'B7Hь>jj %_D Y&|A-۹ݹ%2}f\@8΢2lqOl,SH6p0 `f` l[-۵o}I#ȵAG B Ix$>BcWo>}#|p8 '//NJz[~&yo#+I)z͙tXdX95gli#4YXGFʊРr$s-90 -)V b'%L,' u3kݳK9C#jLq.>/2|JPƚYN)T691i[nq,xĆG7fo!y**zoK>}M鬀}!Yt>⚍ri2iH[r!e'@n6S#~ 33#1BF.KG+p A6;1L@J:G3?WeϮ};Pv:?;tn#Go!9CN`?z@&D#/Y&#PT`6|:OTQoOOi5\euh/gH&Q-c&߸y+ 6yEfQċ{7S_./2~7? GQ|XKIsu;lD`+mdU[PU ؿ";&5#o]Z9Pw0flW[ H @bg%? @$!==@At-B>׺ا*mjp6-!6/d8wӛ]7qFw zZZ͎#R\Qtd)擁(v tbyv0!tD CQ*lv0X.]s}YE[+S}SX.' }EwcZU]piLPJF恑 ȐB܀%O@uv(cmVVLrbj0c|lQ=3\Krԍe#p&/i-xYQ P׮!]z0ܫ&\rx5S2>(>-z-aB`Vx;`RCvQSDg{#(3(6GbQSQ%Z#nP2cn&t)UV'ȆRC)ˊj*t&:Ʈ{1`aN6,Bh|I>L9T&[>Yze[ @b!z[+N4X0rHM3w^9XShpDS׬* E_R(:n=<CA m~wI =Qdߨ.Clj6*3ySɲ(j@2*ӺE44Y-Zn+6X:zYmB2PWuaZv0.} z\^m&y}&FyV ֛CP6>7x 4םr1qA_٘F #H  'Ҙb_yGSNI]0=*syfo~8؋Oc ~)!`8 N}VgOFƪAS-MܿEeReTOAB([:aq6WB{|S DBxjQ(t%Z6ivA *q"Q2ai7[=@> QRg8. | Y ߾l߃`}i_˃Eyv86]: Z̐}J_~?x&gpz[G eGaՑRTH`#`hj)70@).Rmw& vsme XR*<WPv;!m5 T4!:pZL@wֻb=.;PtѬ'YyN>1+e?ڞ> H[*ABwǺ>TTdљ[5žKg4Yi;>mE-:#.j]h{[7c'lvGsn6y>}? R٩ٵ.JP՞(32!J*P~9-OP(*+wc<5ƭZ@3NUp 'R` ٚ9l(u{KV,\RܩOb&AH!ʍc㒅)^NI|sЃumTM-Ӎ7 `l3ƙ$,p%VAP{gX c+ vId\!JƙR suT(O84X{}O( &GqK9/0J(1b5avJgs p<-E>`x;evCḨR}" XN@ 'd]b2$eV`O|zrϒ)\-]1Ӄla%O"p1i#ONQ aWUI.u'nsO$| TJJ0tiJ*-%BJ)P&i<'7vjKzn;׉X<ȦzTXyZ_E_}6[]u?BSG& {',ep0>(av7X[Ob?7"fO)b 7A) 1JΈǣ9?PC#5@Hulzu x }߳o亀~natW8* uFu}?_>+,3ɽxXj>Fo,zCI7/tRx@>,dnH;jv?(bQ51!;l05R*R.ΰi,I]?z.Q:ĤAKpPqSvyaBPWwzœ@sB6@ N,Cc74~ESc7#Ts2 RN%uv[Lߠ@e :J_ o¶" o޳olL2N)GXCCːeƂG'TQD"2ږtT9ghHDRnk]ndFK,}cYmt7_H-dH<6k)D˥/g?O?#ss8l_8ՑV=Ʌ>?"bDN4a-jŚE"n$ 5.;,>ya#٘pS W%)uf[$dCmcT3S'P:G+0 س9'VXSljGp(=ѩS{jk?k?#`Q'qd}e%Z3a2{~ERqa;) YD;Y La`buf8h@00, $XYf&. ro,,uy3yNڞ3viujxzɞGi@/ O $^( H2<E|a8 px @ 虴=7@!}$\ 5G9=? pQc*z)Ởy_WH*@ץ8JYuj]=s!@bS 7 #|p3x%fFS$Q$i BMS<+Cʵx&[w wFri!!ly^HUe>)uITᓥǏ?/f2񨣿QݨӘQɨQֵғU=#w%u: gC/ bqů6U^`Vue:x3f3tҴk~ 3h^Kn{ņW)6O3'%I#4Zg=IN9voR Nv308p̳߬j9cm =+ӝK\?!2R}PN*{(-?x\΁8Gw`]p N"V4_%Vmn|\+C:ܪ8Dv*l>ư6$j°⽺,?16w]Dj\]4I%ۈ0)G$m͏̤X~6F ? CT>hqV,L94c$7 kBJAN:5~V%LY)̻aI#_dT/d=a -+_E hxZɔg;d;"{U "YAUte,aD/S45Ai%͸!KYbO'Xƃ6,d89&CIAH)0Ň35}18U±AU]lM4|~ɋSi#4nfV} oPn"LB !VGUCeCh #,%ܘ1ȓ2 4qi\1q|IheK\‹ls-w]+`AA>`_Gc$mzmY+g[p0ruٷµH[r:'j6RB q-*x7po&(wfᯣ3}WӁGUv'a>`9$ٚd9}}G=BjUH]щ|n2&#/w7}ݺɓ |bnXPk" $ _ srں( !#N+(%7,l"GV6q3ˉ2դ B ;O㞴>zgΨ"s7爪FcVUGeY3ǎCR.98SxrM_f:Ezf;"0ޯ+y9Ũx喤V) 4S;:BB!UF.˖cr2r4sN=vaCk7-O u5{)9GwZAWﴊΈXPBä'/|ҕ@UԻiMSH\_(7%ou?uӹIDg_W6ib+SMm PAe+1,aKl%2z4R"hf 0)t5se5pI0 (0;!(,Cy(YO)Q-.4ZyWZbB"^Id,"oBߔH`@T#ן)Mg@@E> _~gVCfS`aqW+4}œZ QcI]!M'sӛJ\:4;2;r3TVSOCMtFF%O`}lP'̕+bCFT\6KUĥG7hɛΪǝW>P;qTӦם/.oδ쒘qq%$LH+Po(7$"hN&O,As^EЕI;(Df ޖDMYl]uA :=.uPɆ@lAimTF 7c{Nk Bh`՛k-M' 1~_~|eD@gGb+lVlk>x4!uhֵէZ24wGQQFFI1,+/:5j .U?#nh-55΍mqaSiWFSr}Xijh_gaY_- i@V\3x\@?ϩ_$Yhyh/`򐢈+ִ3aJUTr%)?zEg m݄7A-WB𰂨=^햿jkӧyd\A ^! qM#C@\Y]5mw_Pcz\#z?M0m7[myk}ԅtd~0'Byvkt OE/8hs/:O6ޖ( (!AWN\L 1dB|u)ʖ6ʙ::C<@;X$lT{ZfsGfO@O1bhXpKDS++re\i͍.m))QeEJKt*j:`16YXP|~=?TLQ"c&evp\wB)q]ofbrjN+/Nz1(͍Y̛b;­b] ֕< >ar> oz3a<$R"j^-Jsh]_EaFƎB_4p5튰qlf߁JwgO_Փþ8R) rϷ)R&l0f[<)l "r"BWAW77qO8 #;ez}tl6W먟*tJ4x43[+EǐnxfAX *ڱei͜qD> ]pMvfZ3qS/!_Ij:u!ݽ܏݋ uH;y8'T?6Z%G5z)*WsJSɞrituc¼wU;\2r5M"MR s8}]8*&,Ԋyijz-g (KPi.23;]pk^P*WKfY])i+?ܒUYJ%uK]wkѠc<$ay3|i3.'%9[/m/I*B `wm<zL|7 8 u-g~+*Fzi0=Z3(%2MnҴosPj,nn{d/½U$8Q-5GҤ1ij:ʖ!䛡!E6 f%r3@&QJ(ݭH At^Gt;CJ!lt9yv!NH/B|\d<0RIm\ޝ w+-5j܍H0 Ɗ4(bӊݝ2Mn1igQfV|%ĚzVM͛?TOSgRqqaGS65lF2ݨ#GR?3,* MV| Q#Rvޮx:j 4^ "L4+ 5I΍BA'iŕk噝]}}. v]ҬV}lV["!ؤ {(6y4V$4< NxO]PݻGeGD?$:~w18==!zMIp"]ڭ,#Z@o5oGЖж1gTеPHe&Gڵ8Й_1`wL$=u (Gn~R`@u7Wǽc76-e9Xy4Fqmd!,T=7^̀1E2vLKʹ.fP&ZB`A9oj?E27Un.ւZ*-?m@f8i@! )E\%lƒk\e%pV4T" EI^ @U$9LXGMup[g/IiwG[K# '! Cj ${㒠>-֐D29Q0}' X { Yb ,l$0+L=p?H%@ ̓_U.Lh]@pdq/EJ:&iPy`AB r]hx9HP(/.J[h7J]qdR H'[1|PT0n˭[%WmM4Leq:څ {!TC)A4.ROU!E2‰f@C) Om`C6noqw2X^Qt8$@< A+dyBo[ \/ 6|-mMc"7NO8k^2O 1+ D SӲw$3SR%L6)zFW}y A@lP|zN["/%O yM9;,(!N#2ugW@ @f`^A}, *|gYX6HVm 5o?rGb){#Q=$]=M?63V3BQ&`.꾮o}BP{BI/]釻PoG+fc {#7wt1ܹ^iVV:KtI]1ވ t"<mɃLM',N.4{]xi#$RVYnʲͱ`n nO r>0Ւ/ڙ/Qɡa{C%2#D@'ZP*7&6 es!fu=S>}Cs>n#=p`K?~Fgd# nC]ܶi+۞=&vֿ ҰtC E-]1sr!n gY;c;;7YDNmB@CT03ES]n5hOcfz:E\*-)4"3"О8z|,BXR _recxY̶Ϻ`X`+Ce)8 i @2* S3$3U.*][rI+&&8`p5ɶ'Y[Nk07Im7SR*x?PC=]s*n8>H?1!cON|Zd>wnj͖]![U;<&פ XT.q6NY.{ٗ4ϨmC宽H\G\hK-9XWm!&[-g|#_<( q6)!? `x%"ìV!`N>p4 /ȄVe=NeUCFx(& ^Y]Ri=ωz).\lWC};%8.^{a]Mw_i7fCe`d``_ -#^WBj -0&WsALrFmP4v+} ]N2Z.P)OMN{ԔZU(!:!1`$p߃^.pZ.fǿtc.B)ssag4ԩct '+ǡ&@Ȧ{nٓ{LZ!T1gJE#څ8U i>ԴUҧ1<:LviRsY*`J["5+-9b:qWIl|iy8*nLKg6>B.5QX: :d'CnV]ǯ_Weΐl( PȜC$$#Y47 s tl5?PE$R~cɤR!s'Y: 4(|/ Q_5A'T[Jj.9$7ݪ! R}()v[k G+L*Ԭ2_n:YGm+>!ʣU H$6nUZ6V V6%iS\iuqNpuBSi^R[P)vXJEiW  c>*-OT W;N 4N(F"kD>M_$p4 וAv4Cnw #)f+ƾDm{0Dv#i?sVQHN v !dpLhDX 7 G6fGKJ/O!dyRS5^̔Oʊv]!t+=>WeW1;gOtg{Cuջ3ɝ\S 4yEtUR65U'Ey_=, w&؅Ob[WyuV;waH'no]!mw )%hіQM֦Q ֎L;k$]hOC#cs֟rz hr 7A)H>K[@wIQަP*R(_+wVC+j%R&$\~>@\/yELRBdgd1{֒jo+Ō K""fZ^ŦE8Ν12J8DhS1dL_j .ҷV%:v;D Ԗ,؎H#fY~%$cZ=\q\I4?e>sR [VbC^J:nS' ]?Eeb/̊ۓTʋx;7ߔ5x7_O?g )7 VƬ-lJ/َ|{Sq\+/i{PzD3Օqh<Oĵu!:AbϖX2<=5c||jpugr"{\68~te/ND棉eAҜZ]\7=0RD98Lƫ1j _] :͛JE:WK'FlxEkrqp[b͞V;FRvcPO&>*1@OgB|Z{R8wm3 z«}8ߕ |wM#Uk=@*aw&6nT.^^Xw_!Qrbu&z0^.)A#jB4Cn|҃œU?#5mݪXe2W^3cڹn^&^ 6$sFZ:MzC8ࡆ>-VKŰ>&@z,ρ|mC؜MapJ]Y'ɊӮ rzD&<W"+DǛ͔UP[|4 L>K!Aא鮽ArvDkmXo,rtCH"لq1Q9xWCe2#>`sYY-Cz.H7`}Pd2 s_1!4mrRPLʈ`;wi*LCAJP;k f=;3g{^t$<(:`xys_zտ}YI3696QDίYi1ghefrg~s"Wa8dH GihWS;R4cX0H )w<:O֙QfgK/MP~ew~Yseߠz.ܩ7X\ KgI`ØKܻ;<[Ԋ((Y%xU5O{cl/J-څŜ1h"ui5X=]}Ǣޱknl)6!9aOI &x7@'۲X =dݍ" z$^ͳ9`qgakYl=\l-dDז7=x-7hztxhXM)6tHP{pN0%n3Zt2Y=++;:=K?3 zm[QZI"Ww'&k/.53;!)8u%;ڷqP%Z2JXLY \/ d N öֈ1>N1'ǡh4TOD3%Jͤ`vxN rYAʀ'2 4;N(T쟍1i(8.w;WCOCR0 !H9^tAV%c]X1hc-)ʉ\2fz/`AcZ%PcA4$n>H>*ܭԻ!eWRJRF@1m-4l.8\F*Mw隲U\r(Yψ 94 5O\3vҎ ґ u_f9Ha>ʒ"xuGimɷ[yweiݔM{:?R2^4\^zBھ 74xa%, ԢQ{ X)n)@R@̋g:/Mm՟G-f-l@+nșF0B*acDvlawK( aAalG' ~Hɻ!߽=FONVʼnWK!6n/|ɕkJ4'%eZ(uo*4Yt >] \'>NDq1c8|Ca>z.h[cnAUR'Q#SORR*XǤ<̱[Mɣ5S[uıFɛ-"1y9-@rUnҭJ,k|*lz"yflvzo-Y`uh؃3pnVYlfeI 5-ܕ&E@C-:]# H cA|+X-|k.:Lͱ sf-ꎯ*ƙ47ߣSm*VӿB|C6\1q?1=\CF~}^7/>>\`džTwYz7nVP.Уl"x- dd̈AҍRBde~>A;79L^&hsļ[!oA?: njk\U:^6J]K:kbZiB@\<5@o<ps CϾ_w D @ 69 e6IBgWOI♞uZkJEHhKj C]ѣ #>maN_MOSc Uhcf4q Ö89W؞p2jFE Pk1I^;A.mҧ(L g7!RuG;`X %.%ب`"dJކ" iJ UаJEle/y[M}k$[uW_\Z DCC;wbĪvJоWL3F: -Ed9?In4>~Jj2 lmvm=< Jn~fgf4"3әY33-4 &ͣf3ɸxW|:u{ |lYJf"?R嵲"gkKKfyG)HbUNӬo <_*B?i&X=/ hp^ekJ_(C8ԧecT~M#pQ  wԽ6,`˨:3̙3f3L g3#Qfڌ| #g223pB؏؝7- [fR3h<3>3ʕdSmˡC3nC@wvUS@;m"Qۭ_=-Uޢ2 )"B*x0duv[X{lkx{nyؙkf832U=Ee[ v*.MKLl]C=" *ĻrNwG[/  W,f\ۯG`+o|sRp}.\5[Kܗڠ#buB[n+ߜU9G ˓74#P[/4_> ̽_3=E"pqv0XH,sߪ%ny-.ödzt.O"Ppf:o+MOMe Yd)ݛ`e:)V!l8~Iѹ{`:_a0<}'mi0hPLœ̧"S6_V,ua "犺UCmؑ< 9iNS=i'ě!Ɇ$qJ7H40~ƥ[=\Է_㔮<2w*EzHCADF̪~VC6Z!P9uuލa\Z- }#(0υ^0`BrR\zeC|qHmeԄ~E3`𭳧7*^TvPwQK1f5?h8'D%"!u,gJɄ($cpsLC':?c-TN)ؕ3 ͋]-?n}=w6un:Ë}n[Vr8-xch53̴̬223TfXf|f-|tobߖFi&ssFc^ @=!(#YU$c;;ۻxu'o/TE(oU╌(ryTzw3Pfa$ )._AW7 u̧9?u`Ȏt0uDd"Of04B~zۦ8ŖxQ4lIi4=qtO #EN="1q,-\ƭ>9TV 3 c՝lh$R[y_N__d,k:BV7afdh ++>\KψwJ3ܕ}v%iG*ru񍶥q,J7f% gή"E ÁscaK+za'^g4F:{=I#KxAhHC!GHŧNk#pf/lh V^"JsJ<%p&:M2ACH(x= Eu]?ɃJSHu5ażvd<%'8ݷX82`YO# 57ԕ53 5nyZ}bmQA% mЄ&ɸDGGonlYe,6¹3rq :j<&:z0FSH>ae1h mG:j8yHY2`iDn4d03oT)}^4#60,AǕsHjrVǶzMf `t,/ AńLx!F| @w;w.ٻ̒RC?ACiN, X)FZl, ]Є6 S352`_V0v^;єB0scInN'8F۹1KI\JO/bdR|ď'#ߝ,wypg>f<#ឡ; lǴT I@DTT -x)غ.o\Y_)?2RObaJ#H%#_~0$1?I:Y4wVzRѲSM;#=5%_%$}X%f #L9]HZ;HZB-5ְ###-c] ܰ_ zp̸mzTeymDM>GSU1E :y3j5$38,8MJ@ap=~AC{[Qj%'9@5" *I{{ow d$8 ^ p00 pC>.TBl5rȍiȑiO*$zQ087 A yBQa54ٻ&1>~Z2v 5l|Eށ_l6tMz.Q)V0[>m,Vk ` 6-Ljx 6ǏQesT>5`8 XM07 g노U$ :G$"QͥYaQC%]SPQ%8/i -\P ~DteeAE!iJyT]]. 5f#ucd2Xd N&BPX~JNZ7,? ׻]9UO|) Rc;D2d5,i&5n$"ҡ`#[]ռ_~IgR`yvZJ6JmG4iN2kX_е }oo/|?䭗zi:?P2)Feu-3x`x'#4ci<> -6B:Aˤ<}5iS+?c@~M>l()k51@qML_ W_8ꛭ cCFeNlIK;A үNڪKU2E}Z cc_/,[~oO8u7' Zbv_d䱈o]isi>]j2;Z>~HC)F\ԭ ZKvp5s@p>LFIw Z̵pԱ7Nrq2'Q{3'W*)N4yR6КmtVAT%I K&#ޭ,۟SmݓN4>vOim1;ֻAj5-M6%/#14HI UЀ"!WHRj(̫H4/Hl&[#f% < &d!mq]0k!eXqՅ"di!_91 nEn/G`^3bg YZԫ/|Ec^ l.%BW\wn ^쎆+ٮa6a2~\K.w Y ;i"ȝ7 X}A 9 %΍ a²vC\q1"E'Wp;nOwa ]9nw#.fq{43ڲdIgqi1H`he8ͯfV%dž.8Xt=jlK4eۈۄޫ` ܯxEA#2cӱx1x){ dv8U%6lk5ᐃʞuRr|wĺo.?oB}H^2!0) ځgs%좛&H ]X |dW7nۻHûI Dkڃs*Fr/a#k38<V›?DQ̀u9uo>.PfN"S6"50 ȑ_%)"y\jYZ!hdN2< VI;=2 } *!BDi8Jvn_FfdlIARE"f<3~le䉖5DPm_"j@ۮx&1yB؄1!K5Zljp.JZGԏFY "? [' cJ[zNȖB+GtC Odh +eAZ[dž+xC $I|QdAM, d@/%2KD@c>clvK2)+. tcMqY:i(a'l"pFm ?X Wq5\5S(nTRwK/qpmp&ɢHOGVG%)uMaeA|vDŽ%k_eT'4A 6C  %cɟ.Jkemk܅)lHɊvйtKsjx/o pNPT4)ĭނVdy5d=;x2h4vΒ7B1}xJL}z۸U) 0O2 KJ'1jM,FrЩNH߯y;XА4IrdxY;sshTMRtㄑ;RG%aZ "^BvD;xvl;>&Jy`T CnR'C0%K^AsxXp ہl\<9N+;rzed; ja|hNS*/ޮq+0='._-Ff'#CNLJ:_qDK|β^o~]^?w/xo_= vx* QxZr[3,E#!I\&!at|PUF3կO]`Zv.w/t^,$ T/3#ڻɭ"yh 3`QN~]$ŠBT4}5:J00bij"ZENG}~Fє+]* !6܊}+i6mmyC5X-Ԙ%~Px;{rP%r3L5~ K|Fw0+EeLY wB@e_> ]|`@pfb_CD03U)ў0wvpWhm%Q2Z@K\)7Iu-l Dzȩ zC~# `8^mwudW_H 0^ cak3ov`H$8@3F#evJIۓXNJrZ~wI#Xw BpJ&OyUܑ^fg&Qݱs6'2b#}oޏ?ytޗUJO_8y|O*3 IN66~ўwK#)SXAwSI)[Iڮ-cI1kIZ5hOߤ |_Ѐ5ACLwl`މ|3޶ߴ<5.5W^ _55Ț{|%(qDZu;qijݒAf' ċu3'fǵtj!h1ƒAG@SlőB:W3ѽD:A1os0gEg:BH`n05)t ADƬ!=ĠoI ZLႋ!Ib888 5q<гCN#U"sPDXV!lhEhmY[/c fsj8ʶvFf J뗌U uڌ՗'Pxj۸dq a܂%y"@'i k|A6}k~AwM6IoN5~wP)fq!$e@,8<K[Zxo@fy֒yOXO9vY':`?~+_o4{U !Ώpm퇋̦95JWq,گsz@}7LbzpqaҺCd(x}!9)j Jøq5/S^ NIYKMyMR߯_lb -EAEB׌W 09uW8]%}|R1#$jOL&zH~B5k %i݂5IӐmC`ƸԶ5_HHrH37ړ^Oՙl^E ̩?^d,Pn!,Of*]^eOd!\7ZznS:,[՘W |Jا[a !y1A!#FzFk=~f %%tacsT %sKkJE fbPucOFF-& ye}8s%6@:/U&毘kǀMGaπHl-͍VMZOb9P."Č/D|;D28t؃mc }v.JZRIH|0DBZHYu3L))h0i_˖PbgJh CXAkn5!8&[HކHH*9xbJp!7tm̟"<В)pIY*mL~Gլ5ݸZ&)U+GU*n"fNM^;U33{&DznfSO҄( 0=թ^R<,h~.ĴLՌWj*{tqU/0_4_xY= .@)J3Xٖl܈3[}+Ē ffX]@P$6#L?/P~5B7gݝ0rcʈACĀDkǝ.GX4Gnn(`L ϙ6GEdyoZ+c c%ާ<龠РK+*R ZC0 MdP,#?,׷O_7o5:;TgOI=="HHz=֞ߩF8B[ AN9@M&1=ک@WUNەgi(=8vz %FK:r HQ@ZxPF7O zno!{CAr#=f|]܌58]lw߄ Zmp!p((@I P{d-|T `ek?mkd"9pZOxBO=6 8 v&rBiVYº$u.vA8MQ.$:. GGwtvl3LKHd{ayPfOa5#5(]i9ϽYk/I ZEb؃Z<]=Bjdn#bEnޝ'Fvr#~z)=dNKժ(Zӂ>-ݛjGOOTߦ9ؽrQEȴxFrDqn bzpn+1:nA:ڐ!ȉ9ӛȹ/}[o+[Ȏ<ʳ!퍨.H@[1m2Z*Z? Ojުx+ǤzpM6w&t.jMRCwڙeRAoVaKbv8'+bo"y^OW6F#*Geb'o! mBGv G$"*rL ќ2?2c0zZr!ֈ×N.p0,>r'Q_j.K^g4'5a1߿g! ԋ ,x%Pa\ƛ//>m bhı6Y\0!wO7P+bU4|1Ѽ!8p`M47_K1CPXQˢs<ZzY556.wQ;7n6vmgKə`z1]Yo/<=#ոܟ+Ўb N.Tb,{pCZ1RxF~[ zo(` #KL-;| T5>]PR%(uDR_7ir~%%2(b_Qn`Ot:n>Ͱ6U{ei9'\g!bB rٞ6FGNiVaq zSw.Ht^n "%Xǰyƿ :*6֙z3c̑5vs֪y>pm߲K=RsL͜ >ZijmsUCO ͂IϘWLַbkGS&Sq C 7W.ƀ ʋt`zm@27=NuD2J~:]u`_vbqyaVڲh բK%%~1k`u^L; $@oȘv4;ƴZvYD4gnt`<,q B0APG٠v7Xmeȱk _ 7/Ka8qAp*qYzn "od<di$4X5ő]?^d`\ה[J[:΃2 2S-نu`"5dF"UO D8DiI]*"?*+1|&|QMse2⶿@@M!8`X`Iq&4e'`" "ڤ@đww9I9KkPhE|>p}HhB$(>Z椓&nw<3,#?8LH2|ZD_v_L4WgSL&mmGh^@,9sJ$M C@ @ Ec\x\*?ɸYu#uR]q!HώINѝ=NM9HR9[pɬ r2 Wa ..&\' G.w\-5:YM'E 4&[1?5-ѩ{\Ifm =F)h[Q-U5tdYWүMuUJժ%T'ԢZ@c@8\24l/DNS fa`V\+ң}RAǵ&`a8'F45+&J]VH %/f$Ddt\Gw6J>+:*VNT>ĸcj.[y:(ҡX%#.X\\2zHe.kbjɲNxfGp#wMiO\2Xjy+x pE~ rfvfXtl Ey:KH<7B^`oF;F:0'S{¨7 k]-ԛ G=uŘgfkSUUVOz\Uhw`b߄-{,CEt`C;ZxCC tJ jg2RJfdAdt`@T-TlUSԻ}A729X `J@a dY>$Gn5~fg/JFKHt;@Sɢ?hb@s:K=0h/[!4ןTmz+wejrgjuҿ2hE3we'٦֓<+.{<2%C(h0pv%dZ wGDoɻE2zr]7p.3% xjRĈsCj: ذ9v@2%LNC:37swyf>&i_`ؽ`5L6w:<ُd0"x,e@m/B ɇJOKHd! nIJ}ƍƷ v{d<;+"< PATdWB9T۠xb9caVŦ@zdYa {"F_S06@Q3^gؾ* @-kC(TwgX:dhː3 V ?e3v KcWߏqMI10!8q 6S7 qc1[Y_Ȕ"2о{%  h4@ Ł{; "[l)ԇ:Αh_[ oƿr4z֩b-1‚vcDj;s5m,ތq5}Ι=K br2M/A&C1rX,!Lmt,ETדzI4Pd(UOF4;K>=lmLzy}qo0zzL92M(cxe8VE YQYCheĮnucx{@7~,iP݋Ŗ#I3@R,T9oׄN45\gt;m4u=Mvg9f=9k3E:Sb1$ rOϢ.w]X8dH2fCgkaёI=ٱo㟍KyyN *){0Y16R /rA=߻<ň@$OT,DB(7ai+~S l{j+^O΅a Jq<ͻq{:ܯy*vjBE""/GGGnT#~~ջވ?d[$v"lDw\)@ b*m@?uR'PZQx:jA=L3Wšw~lAuꮌȊW$)X}P54G%$igr D&Y([EJН;4jEK2rgO~3<&&$+k yz)gI !l 5z'_ūH Ȭw,P5r*}{OGjQ0ݷ\uS<3)&w xk'S#[l]'%KP|t.WK$΍ESAn=SrH7jXbX-M` [yV! xo4:֧citrSdX.s4ϹCd~nymO;`uZ=pîudMWTjC1vPu_B00N wEcDTf*7EmB>6Е <08P=1 'AG1fbh0'>V=X3&ILpZ-E1JyP';=)N@.<lc㩋? p=",gs\;\JU.It 3±.8f}Bd%WϠCkz*hG׉b|ڸEs2kسǹj*&S'[qp"2nt]G}| X;J1L8k;8r>;S68 #s: -Xs[tS5Y` 뽢yһ.t4@)( _Lc %DjL~gcX5S CS@2EUڽ΢emgDžxRHhnSE"0|,Q,_ⲉ |I0|&MfHAHʴ[~se'$yjId$E<Mj!+U7ZRzvU[2&Kffo(Y,*i~K…>^wFhhI+,͍)+</ 5>xs\\5@^,Fi||R-5T*9#Q4 yE'EE|ЪJt}}Q"aΞU\o#SP&Z۪-4$RW'O]K?;N~%j 1PtOk*]P"`[8DDv7XK]AEt\8 =bNsS2^K)L/-YZ`"`h0z5wk-kP7A n~Ʃ.lɣ?4SH"T1ޤ?]s怢ި!1Tp#*d6擜ߒkhTglEIŶ#I՗49(( A +6>但|a"-Fؘ00Mk8ktA9JEj˹P|gYLDi?lk464x`Afl@+bLjze֓K/fT&?jl #$D\8#>dSBCK Ϻ(z)p< ćl8Ζ๧Ƕ<8ps#8#*A (0HGTԈcu&RAK{.)0lf!6£ 5Fd)]8X#u襠`~؜FRB1ø+w,0M#29Al-LNx AahptN)Cn!mrc@M6;u(<[FqUՉ/"b$^w$;92SQxlj;Uɟ8lI5ss,s;ďtp`׻VDi_X{#W./)ЭtbiUag.*M:\Ѩ RO޹;u~Y8z砺LA;IiWhta 0} � "*2jgPM n֭5nMM&=%;Vtgqimp0:wB>ZF ñbo1|@B?Aٓr!a&FP0c{f D<dEKDMa?ŖIC EБM,(O=?>tN< Xb\եٿ4'NDu wTN`L̻3{-P/]_*Zykկ^!JhlM&k[D1MʁȒMLVVĉ\&zW2%[޵z:Bd]ME2w8PF)gmhP 8 4W}ox։rj2rK?Ga~oLHDÌPǨQ!p>b~x=9hL2Pc[a#.]*^gي #^za/ھ^d%/,bSo`@N8MU^ `~AM^x7h! ioy,ݝ)؝tXwF+^{.ne`kX~L ^xVc\bewGy%؟ރsB\9\y~/9`=/E Sj_m]KsaVkEh;~}3S{"E2Hv䬲6;`ֵmbt؜tg:m6w)ֺ mܿ#Xf)Wz4ʏnqRA>>:M叫n1+OLP[N[ВcnTIUO0pBȖlq]8K[;A93GxxbQI(ehLC &n O(,S4XMSj .,[RlE55"$:\lRޔ߶xZh'͸#"OI17"mB:`Ѕ=Ǫ%Ғv(.+{-4VP鲱|ha )7K*'l`ߩi=B N6PV3ҀQY\Z,TU$؉$åXTMv/ ׯTjDDc+JetJX]LMCm/,tѴJ;zmR.Nx٤µEE#]b K A̼|,X@*b V Zřϫhk?(@)vyQA=e'lz] )l>$7 ]t緸 >t}q;K"o%%%fLuj)<,{ |r{ėLZ}V r $e w{$zL8<52*&+a&9J rCZ#Yp3 }_8!. =oًDhO}%gM[xZ, 8K~,^W[L.0wB [zݛM=s&^fش5[~=kbg U㜢WSt93w͸6g emʟyYISOsh$0s8hA uqj4NL*VN1ƹLj28Ѝ"..Z" D[i~ bIϼL׳Ad|k{˕QH2R 3}}]ԛ/*2Ip:DjIXhG*JM:E T("[%q&|[vsƫKvBsLp5d |D5T,#, Xd/Cx:ZJpv;pC+c'#9=4jk-+#4⨟2NY3!4IUhޒ tRrF= A :MRlV?'#`e]p>X}#.E&[ 0@7%C"jﱥ1ri[2HflJ%*t(񸛨:VͼhY<Ųy=ƻDN_ϧ,GZI$X&^&l ۰7V,Ǻke# !a:e::;ӃOקҫķ?|!dNZEn$ $E;EDE N)JI I2l"&юϒJ4p`2yAnDD!²V]S[`PN؀^c4sCL͐oP szkMF{3S>hlyJ?@CPx44!#5Jg`&Ja'`Y`W%4 '2ğv=<:Lƅl.(e^Lzp6ʴGp`n;3 hZs[Ң&{ eS2py ')z/MI奓gU?% =Gkjh'p8r|/&e 8 9$~";V*Q@pѠhMerG[i/kupk//d.WbBxASՕ۞~G8W{xZ?`2Lݱ3a:UF|%k_2]ZeڢI G#6i˴~"{( 2O31nb#ڸt*?mtJpNnAMn*uƸ]uɬS0[L=fAt^:PJqMdw80grS,6dO0 ;XbI?4}6W\Q'p[H,Cl4گ;+KhДA>XYrs*}OmBrj ΆZ~dtk}V4Z}cDqUԒC2bew^p}Uv1۾Z 1i \սB u%C@7gp v#O%x.N@5 Ԟ,e.Aΐ30t=.$ʣ$ }`v%G(ܻ%#9moS`bf)l9v@5.߂Og6dCHpobD bUp}Dj`?'Q#8`d~~< d'Jt6 +;ჾhOk?hwuQBk}#Ξe-$bRyNJUl;N<y_{պR/-RT`nM?':'H~wy1dѷkOS*PRZ29ƭ3l? 6d֛Jbev[2ezl[ݠM}t89O~s;CI /{ G\mBH'tgz`,k֞312Oxy:gB[ vfzw$:C&r I^PnR)$0Ho!Bdi$ %(4/B{eQ5I%ka ;ä'yd_~9stɥB[w(0t _[OE#kCg] -XwKVRG\݆v{Rn[Z"*}F7|0&-&4ϭ9` SuRZwuyyKtE+zﴶ+"oK.,лQY­Uޑ[O_.G#az0!$%p,EkOA|e_fCd"ڟ? PB#䑂b- w@j5rͨOH5dE*`Ȓca`#_u~r|vHj [YT@©hW5R ?**ak?^0h6<4+p4!SLATijQ φ -^S7d\J^!UY Fk?XkTc +ɔ#"GLM8 C*1]6Dg;e05Wtry${lXt0zEj^iHs^ex(w嬠&ˊ@fyC%|JIﭢ)uw_>TCZ)) ÝY Olb[8t ]ST`o4T@$ ilfKGci 4E&{9^ d{16vj06i@ihu֪5/Ri< cbܯ4UV‘%?*CE\&rJf2_Yac}| FV+ DkA{ 8ՊT,ܩA +-02Gx^+K|"h,s \ jE͎p@a :QpA`4Cˏ?Լ7A4iCۤ.<fKF5k0E)0!vIÂ{1ڀZ.EQpI}hSQUaM:{jM֏RzH=#~eSĭtQ]#~"Q`1&P#5G6vG8<:S c0ыsW'0^ʮ_U'#(x䡾C 8k{Wэ6. {ꋽYn[鐿1ZHAƮ ϸ;T'ﲁGG9lȘ'vHű[v!T\ni<*(Ow#1 dq=0 hڒ޼HegPvAԅtQn_ zilsN# :B^0 u2;ds| {B6s4c߆W]$`zkX$({!(r|]'5dx<赫. FaM m>9}zaT a ڬKFR2ghje,wR~$]++pKHϐ2Րs7c@l7\_oGB|fI \0txy(MÞk%@wX0`qC<~rrSr-Fj0 fx${8BŰɃyG}*I @ӌ6DZ@#ޔH4fzlily-O f%ݜs\ vI0 3:QI('c]21 I< sY3\twi6Z]ӹW_=zy8#p~sf(NħRb]`L٩L=og]3X oԀȥ^Tc^ΗF&vupBA^@ qWz"X=r8;M=U>.v" wYb,JG8|ǂ?5RJKMd ҆h҅jG:QC( ڑ/h֠ ͌ॱQսryB0*Xm_nLBtHҭAdK疹:d WlU聿x/b8JA=oR~fΑ#ü%qR6a DJ!w1c)G,[ "eD-x+9%2Ѧx#:+`^}EDxk`2{-,s:yF-5|]jkG9}Tsr*Cna -@vw2Ա*6]*k^REҗʾ:/Y^KK^K!Q}v# ŒwزEϲ sI: kUmؽXĴ))#G$s*܁̔9Q)`f (ل*m6H7el@Dh'd HS BɝGmUY%{?2H#[x,:G _4}#x6cd R>5^H) NFsO1eժ:ʇNThDyY?jl0XJ+A}IRh$/k_GxqUۇm)"+Wj\AJӫR|z$g=` 9YڛyZin9=KnRx+xԣ8{ET#m샍 =~s$ΐ'LmK6^7aΎ| )ϔT9z9j' Ҧ< !|T\b, J[5J(% =>:ݨD}tQiNs&5^jL ^>.6=*>'TVw6fK!y#\*ԑÚNFY6`[0I3~׸Rۢ,^5+b@]PQ>5!(ZmwFMͷ O$^6d7a[Nhwgt'y‡J$'ZS_w?U}Ҡ@1f.8Zp۶bkDhkil'*4uw1Y!Wfn=S&j+)N ̪F} y`k6y $Nűue" T_H^c+2Y17xoJn*άV ubc<dzWou .(Ҏf!X  W㛁Ad%Ce'mkV-'bv*"b(\Ն%5s;.ES'~:zf}Z :R(]g{`׫DKZAN_2D)7ƍAC_vŜ|u;_}dva[RPzmKlVzk+$CV8U{ "t{OB{#o/V)g|b1urq.2q|Jl+fl& aڶݲĭ vK;׷Wl-"]|oAwm3H|#JxCDp<|#ejqУ4.C4|7I,rY ?8SCnkdYۍS$ IDDXȩFvٲ2Ośٕ^V܁OW$Zv\u%/\I=n#„Z!X3RkۭaPA -cJWx&h km)nM-۩c\'B5$-_ɺQNf#*gmWhүKsRx؄WeQ]vF‡~~0>x0ﷅJ: %5hSFiӨt וlqJ¥,$"K>+~b;N>ZF?3gs/3`EBg+B t)DحhYK҉ᷰ٣YrY[kI1 -%KfV޺Cde$d{2L>c23bg0`&8Î%DXJL)d)8A7vX/}{c!VRY!%{^'QbGUen/Yg&F(Nr7܀؎iƸW7GÃ4Mj#'|rb+YC`tK_^&J]hoQ{*)#k%<`&CD8ei\QJGw=$T鏱cm^SEå<~F=z 4Ik3}ىĸpO2 c\8{Yn%8\:DWWR (Sac&Ntzpc!PsNc Y ?(e0$*|2kk[)xD_.%r+%qV6g sAA Wȁukb'>5QtksײUg(ۿ$c/Ru֠]؞Hp TX&9O,wG#"HneV=Y7슮 =,q( >H>؁owzW9uג~]<χ_&^eT lH@bBݞEWz=aDɈP0OP/"a/j>5 -Q b_:?jlVղӐ< [C6ZͼhW>cº\;iaLY-̥sّrzt֥d$^ȭnUoUB=صB̀Ġh DQO:P' u ѩDg*e_\r1#:g&],EֶS|o-Z22dR0aZ *R:5) %CISZO~8yA3(;枃٫a#c}|eN'޳Vg8 _a<qtWLk:G34|ݴ .N^׸jp֣w0o'/h ݙڌ}޿|wwY7G:xpqxuӣo8\B'Q)E,/k%ZAA5@~G4'A2fApg!ߏ\w(s?"CԋeEBv*b2{`7!dP?0l}6f">LttҠ|fV(: 1w=!ŷˌ}K~̆c?őLIX ':1wZ=!88*gW%UmZMu!ֶuɆS MB{G„B-9Pa0M?z|+%ŘpY{V>IۇN)}wߵg1PRvlXCЀWRg1&e5-w1/%#J}]k7<QňLh<ّ*68j8CJ`tcZG@7vwB{|ax#,\wbڜOsX@XBxùBzwl'BRtݽ.kk^j5mu5O҇P5b(dCcYS«y1 `|0Xi5cYm3?DS;%ԲtrE˱|rXH9LW,!Y#+nO4F }`PTj?gXl[J?nhTp'`O__sȂ=]?c_!iH3d03eA3aMAlֶG+9:/6`1*+(}K9By>k:"N,:,2UH|K "o ny,vJCޡ$b+@!hi%|w}FyM܉jSq9z ~<~6:_gNO{:4_C_坿x?q#RG-?MK~IvUk:tu+ΒBlhfVw[D?D;o? 05YU^# 5ƱltuDVEzYΨc-F le۹/&0f>U[zg~;J= 0j9s֌;C:GCv|qtKpOFzeW{ .pzS`yV|_^WR34$VoS$t-f|/==QQ>ÛN7KNaX:ԎO 4 Nl:޹JeX6c _B|zLldGP$6RkN4 ψ#&N%c]s~N윫[lcke{^+}t 3gMO.=<6En0TD+(\!ovǡ{8˺Rw]b \E}{+>R[\K9HeJhвY -tYXC وuY|W^`Ԉ6'۴UKYTEnɳw.sne;o˲ZQ_ Y$2ۯ,Xw,xB!zK]n?D7Z[iө*"5 0=TNP*%;Y#EesQ-,M_Z鲩 BpPlfC?Ls8nint m hH] ^q ,ލxy{5C'5.J}Ff14֍ l4z94 "dzG_> ]^F.{3c^cG: 6=ZYi5X@ѱ@0#yбW<>AQ{bswbh8@^>3;1g]>Hg0?Fΐz CxTG;!!w^Ƈ#.Gcw%]7x}< Ƿ5VrZ%X>!D.b"FǬ5 t53J֯1CS.ҏKWJS1`~+RB/tkLÐ3{y<.$ﭿ2vS|q/ϒۡ1OOw;xqJ|K?; `L# ^8Vߞ29x|htA abO^Yi@՝=[;KuV'>]j=+ Wt.f5ADhw@2هt&Ud^{!^8Z6?6|瞮R̃+%*T|-cITM~ ; )* vCN)^cUTuI pLe_VDrq5QXY*)=&owiYI=/uv=܍FJZn_s0Mlq/]!Yi[ +~%dYKI:k/V gp =TC}]=J^yIM=3uuRYGnbj=D|\< Bd 8oW`R!)4#)vP.wh@ۜeA5Ȼ([qM7V4nQ/Z\zCˊ?!]4H@dbk ɄFdc皂:u\jJwPnAw֠JJh^.hVcbCeE$*X>5 ͓oB^0g6;.j7'YՄRv5l QZmsD]e(۞h )yHTtoUz.`(k79lT϶)SJػw\fA/%Wڢ8훏045TB*>ANS˵/ct+(y/lC7' ~pDB[vČcT5jDuG'c<-v Y/ji>x 2u[P( &'d:g܊ύ^pq 9^M f^ &x:[zk}GJEN OY.IԬ{3ί`30jڊ$L܄k{U;+((棴m!P a s*CءQVeGy j1ˍ^+e+(q%Qkdy'Mb=n.=1\ ^P)`Iͺ(Yh\-mB{ئJa&I-Pk_SĽ-1HCX̂W*ts57hH͎l䂝CzոGoЈ 6/XKvشK4JydTr͜jY-Â)Y6̮/o<0#)ɼ<7'3+%ۍr>GΜ {^a ȳo>:U x0I^sUE>1E:]$ 0p\d,꿌Bf5v Uc|G(?؍L ǣ[~MwezZ1F=Kmkg+lݷMR ww _^XUjZ)9Q \ļq3t?&[vi)zI%ʎs% ϛAҳ\R柙';Qdc'"`j(cd !YL|Ex_yYgSA==껁!6 V", w |!]8>^/\G*E!|#56)K<]C¡#p @k&zv&XqPr% 5Z:{ACE.L9C#: {"=x48of1pQ-C N%^יZ4 | ! ,:}r#5`; FJ[_(Jѽ>v)pIZ\!Lؗ#dkGT)(mUdA|'ςUN[&kIy G_bΣ^E-&QK\Yv_wݓ%->TC[YC@ };#йEL-;DܡN:Nsn%ֿs1fl፯ L1Dђ(n ?4WOBt%UQn{Y 5.`.h<303^Utb ҿ[vQ$b3reĶ^h&K 7m[2.Yownnofm˗Cr$P<̤`9EdNhH mJnP:*@nmoIBE$t'߳߷c'oOcofrLx)fgR \ӫЧ޷lš5IJRa袬'GI㠊:d%ks4צ`& Eƒu:Z"MhYnQ! ֭SqSCu}je EUEY#(!TO e8*+*4Ut&'-ɜ%p9 mXy36@>.5ĉ2MW;/IÞz'[Ej]D8 @Ga%pŔ " 8# b[I|Po͞f(3>(O3ʆ6(͙3O*P8 D}]O,~=dF<خl'nO%dnLb $I&.rdx:ɧH* $A]UnXI:IɦӴlwGnGiN-c7N\ͯYn/ET e n ܽ{[qv׼Z6lD̯kյV'1e\S:Kb#: a+o^XsBI&OVpOeG)XQÚؕ+5X+WkX686}!@^  F(`yD9Fm܇OSfXoYm&5 + $,6E#6 C7Y .x%P%PpJ;ہ5j;=5byP0#a;%X[x=h7?]I+R@ I ] eZ2C,(+<"ԮUP[ IzGL"z/z52{`p84 Q -WZlNޣѧ_ 8`neޯWoaz&t-r@])`8Y  FB(0epJ:]8eHcZI"3#.5)B,#KJQ{aˠ$R&"e٪6#>ayd7멇1PᏪa0D, @>~\B ˙/4t+ߴ9R=.a$4{aVP4zjЗQA1WQHlg!v+i:&&gB+Po$GBd1:q35?ѐ& k qvTyGhҵMD #$KN XH&'DE% #PXe,%e\FVD!%!QjlR⦋:+؋KM\;nI~\V?֏I^ZKie]G=]Cd~VK%ZҗىO 5/̠v @oTf"8ec@N٣ЛH , &z710ŔЮ*I$ 7@dѧL It I41f[7- Ve( (3L`o-ͬ$K{lB]"+ߴEת=8g*0̜Lk:.K=}¨#Ȃx<كa{r_YC)kG!ςN!(~lUc֐ZkS8'󑴤3^-Ī㇨N1ރ J!݇l, HqRD@>`+?S JoUyb̛m34 5qFw1^LXZjkPz'SĶ߿2/j, o  7~>?Cs0{?ڍ)۴plW`]n%ku m|̹6JFv}3`Y-.} [h0@ /ŎӂF5vng7odLj7\w\7׻S';vDPTĚ$}хdj B1./.b9KX3FBnUt  -溟l~Zws"yYP@Fh  :~F |?ȹrnn̶frTLC8 m>>jC?}O2Wonalf37sIGBQaclGƜJRsZY+mm d" 8oLH*.O`6A兄Q5ո.m=3SASN~j'hS6=YCy!2s45,n`뺕jجo=(PBBd):r:&( W+}jat:5TMV*m!:@3Q2z<)# 1 vj.B뽧@ŻYI7_x6>Fd*~  c4!\Wӑ:'o.]:B6<.Qi`dlΆnHw3qƯ\\:ybЃFWIExQNtNsx_gG}e:u*p oI=Xc2e~Hp>W*|e\0c;B4iS#~ecLwEZ[掵m3U% \'lX-Fֺӽ`ak1&w7 S? k뿲йjfʹflS|eD9FNB$"pR: tQ"QϾ6[+^R0d%n<" 5%Kipֵv_MVb;s6R|v9o͠7nR:܀\هlϙB(n*,Nrh=gQMCE @&l0 ;֖SSUp ?۫*FkvS܄Z:;*{8EcA aH-D]ZgV^,*+ Rv3EPslejawf;te_+C1ʜVf+#ʬʔʜeePeRv={ Xj6l5dXc=ܭd$fE5M2k&Keue~(!B"B%hG[݀.j*uT)YM6&22+OQ {*`oP% qm̲ `_0}" + hb00DZU*zM)d) =p<%u2!W*%”J8gIG40 ⮼ IX?hX!J8W6qMքJɠ7<9Ģ&Y<`Ay isA<)ύ Q)*K([ZHH}a5k:Rrx/,1%@)S8 @`oKz;"j޽O=)1J:씸.?0b àu"]&83%,QcU#p'np Y~-t4S‚7E GL[tz,!Rw4CfkXƎ7d7+Am 0gp/iC“7#\  BG盒2?1 qa+X"dyFd@qB* HXÒ,P5۰$t=ɻRD#ܙYF@<0;3TFpxO1xMb@y̾UdG~(q^.R4EhcYb=WzR{rd(a 2Dhs|x| BRi$# #7pJ֖[4Jsx lSTQPzbѤU8RUN|ma0<2p2!I;lgH$>{ssop4>/yq܁/8ȶx " U R|5 7`2d(r ͩ BB3<'/ƅi# dG$d CUk 6iLo)?rWgwtmfZ#xWfypͭv"ɐ3!U'? !) + ~/2";2~C> ܸn"mDXkY R B=BseKE-oo[?m5Шl.(bZPSP]a􈚿56}~AЪaf0e*La { 'r1 L&?53$i*A9ϣSP_v/rlU";NC5/"Ǽ+lq~ 㜱KP%dՠK`Tu<-U/g[D^8lRA0U:7%!^lpս#/L pTAo7\Dت?M&J2ENώQ|ɀzU a'M> &fC[ΊL-"(N:Ry9e*ފ"3i #ӫ5{A% %0x[_| YPM.PD2F6_fz yп%vjFRYA3DuRq׹p (Vͷ{?B g짒W8|WAӯqp<~ !Je6ͥX*.DVFK5I8rm US֑9zI5t8Ӭ8T V{,@4F.`2G׮iڎ`)()7~0u[+['͓ݛ pëv NLBַɩ.fe\m&}.IWuT WmQQOLf>$;2\NoL/ į7IOMcޛLm6. 5O_%?TɅ"w< _b'ђu ?lWӝ͂.ma0f9Q(Z\7G&jg k~\r lnҩ*UzA%j^aW7!t _ڵHA}3= j&QAv˅J3mDn7vp''vX9_T8`Rdd3^&(P]_ R BӪw:ZbBVSQsÝLsy&k.o yS ҋ} {(k2 Bf "7,O` Gw ct  BC_>o|SURijrJf;@=Btv'G5bO*|?I҈w]up~ƼR ,nَIT|ؽq7iN\`иb1mڵ=Iע^4yےTKwbek j^t0S;T*  id/}WỎFlθtQ33nRsɃR:.\ *N%Il,( ((L(uGS@i sIygY9+JYVJ||Y;+];m-kCV$rЅh}n2iDu{MP@B*)uDp.vBd mGL.np]4\Τ#wyuwERETI%41h[S` ;c:@3$Orv0 T<}'P )YkXpꨋeF4MPcZ۷CSE\`i T7N=j/Y896!`gz"y&5lC— [Q` Fi 5H]]8Ed` km_"V@eU ZXj!E&\_T>|Xqeܡ#ߜXX,F&q]&$Y!|LS-(xD,ظDeBzcT􊘹ѱ^@AQ$J r5Mf'|>e_ex9lvDMgk n [D B n*@>q\_4"[Hv 4,Zm2t:ֽST +l*ء>2Ύ뽵`$F+(#>(#x* .ӊm| ED| L uDuaBoC]տ)rٔTr >l|*~}.f~8ǓX['MnN6ku.pdr>  ~ 2E\{4=!Gk X( (2X0kmz?3Q};OVQ-R쓪\&2D"jOOo8[xYT )!|qPʰe*W֭iV3Z&_; ȧ}hP@JB7ݳL)~ҵ?R}C݌(_UF vxoQI'%L8LV* P4m%JnYLj—-z/A:H  6@gϿlfN )vq}0zbG QU%j1"QPv@ԹXKB?+*L)_1f2/bCnw5TGNK7Ui5|#!fGQ LUk̆!"OS˃+*2{&X U+Q(.vAj}lť\G!k5ZDcv(  ߡ@@Jt;$q]NnC< DHEz g/j"hp.bOG;Oh Bz7lbEfNbR}zl1ɔ a[Oz-fMMbXQ#er1_XtruA`#}Q'V{XG?V՛MAE+#Z]'֏/-P#~րq@<C03U(F{w.3^iN]m+Iv* [mm@PhF g 3d1' 7{wwmw\r{(8$E"2i (Vq"Ԓt M,2߲mKmwjg >r.ޥ O@?24<~qйN_xNfȢs'/\;E+?}L",u(3##gЎFnDԧ"W|X&>l <1|$b3|xd<%QJbf{[wbG.*P[9$B5#E:c.SQb73'tٶRrGCtGheD,sYDrAˎ/&Ib4a&#EQ -Jk,(XݒcHlL.euKVPftӝOKL>oLD /Eɔ}1ɧےͨ Nji68($o,ILbl^-,NLZB R DP;N"J+%I݊;</͵x76Do6rXW o.%ˑܨ`1MC[VEd(q&&mǀH;Ya#"BrZuM ;5]w/ހEb*t *Q{Ct7dfp)2|3n WHH$$BJ}8`#'!CO9p\)tR5.-mnm.ٮB^k'U 3j ʟ+) KHY merk\I89n32"L5Bm1+tm3r!<R HuK Z-aF &\H#_l@C htIQg ݤ\\n1xKI Ay\*S:@_8$Q5+yضBSaƈOAy!M %j6zrɉ@ɊKE$\p ;)`dLL @yHn& Rn"|UJ xЌǶeH#H)uG{{}n+Zo ; s6刹8ʔ$b~)> ҳ TփZ7L/'©F†(=hZ.D֗0&ۄar ft9 6q$bDt$r4WpKxI2]~0\M7sZ(#lM_Vh@J 6P!z^Ak4Sc󉏰!_PQ//, *-)qg)G8v2*<BdP8-\_,؉j63AB;d滣{ȣoV]3C٨)Bb5-^ی+aڅ%WAkXG|Ex &Y/}cQb8A"+?9'ˤKטOv8d6t|s,LY.??{R| 8=qa*9]NGTEP[·it&bɑpۤuYc[.D 7tpXaUbꊜ֗p[ hunAg=v *wRD^@50{^((l"mٺh(``ov|7Z܈{AHr;S. +XgQ@ϗC8Hcs~=di~6WO|{`)  αj* x_jж_=ϳB"D8cп9ꐞ |nUkAϛ{WzK.v9K4.eZ2vgpjXCETIsmwWTx ,чI|B-qHWDH-ʺ*R85j]ᓓ,J' |#D0{JO>=-#p`uiBb<)e
    |ɸ[|U d1 jYpAsgl'B41y ;8$!`v]ܤ],AG袷߲f{œ]J+\Ro78o-ˏ55iI`%/$âL\gHjOz>GO^2۪,{qA$2 j/q OoM#?nG^^\ IXus&&k qox*^464E8`Y7MK%1y1򩆣̘- Y/`ƫm;smRŦb[0d!BTAVP,)0|hɣՍXyR_LQQCl^ E$ ,  ۔m!Z{S&Ox (qח{uxữ]|7Ml.SGcR?-w.Ae;3'Nx+`?0G/Ȇ\Kם6 !D~wGПJω7Zϝ#b+BBHC ~y&4ɨ^J}AH5pBІZv쌹 \(pUa0{Nh@ 3w\,_b^Iji:>ШM5vIDLvqи0kD+ҿ2_D3\B鑀 TqT^{xED\̋2OO+hL'wS:,i^kks\:bu鹞1)Tur9"@=:=Yh쾯߿7GYx-Lm4/듓~!H^‚*g/†BPGd3KH EektxuP%ӑGcN~lBc^o Pk:ywuf7xx303U)̋)$Ii&خW@̬u6a#(=z 1>LxXE| / _ۻٟvB~tC(i8XiFCprEh Dh f֌  |Ţ1X S{ 17ۤM}-tB!@ƃDsYȧxhG^ˊxJKHc_|$=,| e>?~B/X*?Vo;΄*, ɁLDU2<{?)H;?F_ǣE5N 6A瓥< 9ԭ6XAU퇷dY]f^|j^ ZU)eQOݬݠJ%ޥ@:umyu9g]0e'hIh's v2L dn23f j* WZ"o_BVb輾ZZ~S~h6Gim?BC%Bh3t:$sj\ȬE1) /1%*&r筢=2 ݊5VjV?ȏK"%ٙhce9T2Kk!oO.=yWXb}_ג?-VW+ AU }Wp Oє d#l}~%9}^ _RׯRQlAt7Ͽߒp kį!mkvs5dѶ-_CV᢬ѝQ/ &4ЈtN(UUp\:{4޴6cf4Е$X[C?1'tnv@;99]%BKRډr͡Pg].uCD7B:|4uF "y㩺q^@v-E 2)t <* 9%5٠1isz,7'圾C/oL5 X` Is$cv9fq3 U* ԭNZ-]P/X91@zɳǟ]f{WM^E'~^=V1=h)1cүuMbti9H%xfr:Ot*Re@"4>@UUi >gz(h5`LPXVN::Qkr"SV|B]yq9s+G<{_Q_R֎gw)d gö gn#PQZtlpmcZvIqZޭ;*輓+Bbj]tКѧK(I*_ +6HGRClO8Irq :4W4jl`!)nORSE1 )&!`JCdG:mjgy  6ݗ+ u˚:3 }xJ]MN!wǨ.h)QMId)?O3d3z"AI:kNn67%Hfb:YfHZʀhUm7KʐZэQxW4C3v/'HbxJ y=Ԝzwv{i;ǝAf"wDq%ow)(WB. &D@!2kTS/$[A%kKz-gmY)1>RJ7 5C4ՑjmCTC;Ư 4<4R3\+ȑD*Xv!9uk%do,r+VdIc'q~"LMN Gh9h-Qcj:NLHe6E6M}=5H@σMnشS$8VV\GH.W~ȯ7IS+{qvIYQjhgT j cRLsexD]iЈi3E s:-Z6'5`E9xs7P"21FA"4A-H.mR:d>)Z"a$ $ĩm}tbŭ{#QGJ*;A3fEu`ףzۇH(:q3mfI[q|!lS+^$Ωl'*2P0]_3U^}Lȱ wb1}IҪW{rB?;ի8N @w(_6(&ՓJmhbrh7C( ϐvQǻs |AXduMFښA:GrY$GY , %kCDIHt`fXŲOw B y   NF4Fn33-̩ 6,~\L8L `@Vfa;]"4Fœ%A<8L_@vI-gd94\42C&IĔ?R8y'rJRp/?7S'y~=\U ll-.oܤ (^iN@% ts(jK4כʫQ&s!k m77`xq7Z5O bxX^- I6D$&6qQ57O Ӽj:RbV]%+1@pgPʻ匩28<43Ds^kH9MUcle|RQXBGRQXBw(,swxZcQFGҝmn!d4+}ݭ^]Kb6`8=icPO/Cl0%4c?:AR7" ܝP1k.10חTKn372~%-nL)#QrW//'&Ƀr}F9ŵT W.SOKvu=/_XzW2#Ue B9vDHsz=N4/9m(m#sF`2UI ycoLd$ǠˎBNж\3s"5mp$^e!ļїn(Ĕ3 Gd2+,-|Ii7ll A[m%[sSVV i'rV| yH+ M YGMY^H6XY|EFaZlgܔLRS}oicE=TƯLb~+{@X4Y"2{L4+ bR1PB@6>V`p 'l ><[|GyݗYLI Xޑ|c|XX%1^_ o08=hoӮZrbF*gtu_Y\R&Ea@~:rbwR7শ+ziF NhUÍ&'r,R@F /m+&6}&<Ӄz&N Gv[/-kz^ms*5vܺ[5֮|"}(VvDMT2[ip UUB3#PZ$EY>j+#mٵNեfeWdm^S>yEP@/K 0bI̠Xk*ď7pFNSJP: ma.Y 6R(g̒]XIeA? MZ$={#C@D^;w{i2$ӀAlVJ6@w:iiEvhR  h).h{ çEe;~'CW:|Fqivx9y"f .;w{8> ׂ2ݝݶOIz"NstSX྿H%YxߓE]>,:bΉ!Eܞ&=G14: _CX2sRwp|!1Ȑ+Fh+$=15(y-f"^A%AˈYegOFnlٔ[ߓJ-A-x˜ҋn?a/dXX䎏2o͓s1>!,8pIO|{*ra9'q*hјF<1>k>+>>%ONE  -!!LIJ GB0z;OO诘6T"  =F ?u"TCE>u8}[w+%Mx&n!zut2W-"PQ1 17GtA} >`Q*㏭_2LmzƆegf`f&`Gڰ\2=͋"<1{'K= H( H<1™'zfu؄_bb#&+y芟|דJv~?ɢxw#_}/]'#fV*A~KjOP=&õ%LJzr> RPx45+G0ȑ_ۃ+e>e/G ^|ҘJo)iuZ!J'x$Mרa.cAbLɊH<`+`tt>" 7=yCEU椥 uR2ĽzlϓT?|j`_W#3#q8z|#8=cʦ&e+Ѷ亶js4_C<2IfUOe`=[K3 /aJrɬpdP_I$[WHgի:T? ? ??ߴLq>-fe0#E}ό #ZL aIg'@pqG8DW-o C׫^O?pѓ_ƬpU{N=<x dY@hL>%^GxǪh+ *ăpguh*:Au + `8]i}D<3V;PX`|˟36>Xduy'>4I'>||||>>չ{{"_Xҭ~h>Ht,juba'pnd˴-ѳ/KaK^Xkb?pߵ"ZGĒ_Ct_yZZkW }Fd 0|Kxߝwk7:_"O(h60)ow']CE|.6:2VHvK~#ʊx=bd*Pʀ]᭩m0Nx`َ'u!~|֩D|{=TvVϹ]c4[M5V5UWV|F9մ>5Tj{jZt;G..Ǯ!cԗ툲 t 23ٌf?յ~ׯF4ѶB.]U/3LxmcUt+hi[ՍiB@NiR"/2*9D%t[&74Fv>7 k\^z7E4ԊiA'SDSmA'} aMtP tƒWSXڊù+bd݁7vn%4E[4= AUaJ851NQt'TN+S\&T^e7|EmȼJ( |1@5 Nj;Mυ274+ckm%Ah";Utyqʚ/Z`(]Z-JMG"+KHA`㍅HF-O+gJY%m{:(2@pn )" p{XE  f~1Xm#y:Dϝ&*ҁ~gA(6~2޽\A ñï^V0:K=K|5NN!⭀MTl,~svMr}4tO>飰U_qj>M[S;>4Pgr_FDM'yCŋ*ՋTx ұFUy;kku̎hSJwz&;Y%YѤje  znH|=cL9x "gj^G~o *w,jCue:>/*IuPs\0]'ZhC4pxG$1/ecSx slCM,/7 B!g6ֱb\a>^pWm/"͐͵=ashh]iSੲf%k3VX 3vc5\i>g7Õgum#y_gܾ{.Ev6B| ظȎAڅ4}ϊA7N p6{neI L+م0,D4rd.2p&'Z{'r:2\LP녾(rbsNC2740y ˿pү! Ͼ=zƠ]/S?ozybm@l%h)ScID &sͰmh_nԹ0Mp*G7 L8;4E4A=J#B5+gNY0ɾy5X=ͽ } Ѵ,Oњ XJ͔ 9/?Tcsm/HKOlړ3Zuh4Zw~7!n'W <7kf3B}#˦,>⢐Y}L~>WFRKgMgIgXLr)[؁Neg UYb0(zXRyCpG!'^.i&^3D)Jܩ$" h>f8I9Cu6~lWW&.l^Uuzp"5uc"[a6ʌK,1ڸ/\`BOZ̧qOQEaBYxLFeyJGe א :ԁ"1iJ=Z?WBZŞZqg1LjtIJ"X]x"GJ@ j(*Ԃ6𲭵Ph(26XddjW#p8 CʠU (~?$dNL78;ƻQY3?6<\&8)%7`&^7=\țEW,3"޿"V-c|0%_qsD^0Xc!g㺾=ϱXsT =f,@vSPV--*CkGk"вpX\n*9J2N'ލfK$ 3/st7_#lbBF{i7 gfv]V#3j2A䏡 B4$^>'b9~iAހLtק|]Yf 3:̉$[KS5Pm`G}U䬲cD`_X[0sWTw4SsmAZ $UMñU ALr6A '<.#pR"6zH> m]&Ն)/nOx(W_x/UT ̤Î3GuJV-Ց::] αILckkoW]0RHڙ;x֎U9ۈfcP/޶f{c=5x"/蜰<<*!% C Fy$>uDP͘oVedܼIŏ/ªT6VFIm k14wNړ:v$-f=jDыBf߻6[|YdCѷYg?~*煔h-q\MZ ҫ y;mI5@{G:ss$O-Ns|U;$m#|G哯AQaG Ng"}!/>j::]mf˙ljny&Xٲ=wMmV9-jТWΐ)q7I88~.۸=ArVtu)>ԭhfQZAL>?F\b̄GWq١Jj|7Q4@ԀPni51q QPס}dpJO"3 `͑cMX'Idd8V6Ԅ`"{@l %M6aCm2$Z Β"f$rm Pnpb1tϹ=)q`A,F17m4Ea# 8䡠n5iVY5m\lrp|*74A(^'+V 5ȕܢE΀iV#mL "iרax PAjYAL=$yڡIctWZh 2nZ)ٙ"%B̒C)N7 clw iˌ t%Jӥvsҩ= )[Pkm=jo\5Ɓ axwBq?KKELcB]?zv C k.x49Lya6"P^#òVB3fI WͬU`:1ZnRPݍy2d1nQ0[[13\M"&1bJkQS\P%8i֬ /wz#e2gql0t,`S(2r?dz7͡:ܥ@znbwxGj7|enժ ? x 4\rؙ5·e#ۻٛ d$|2-`I`:[v ;Ǭv44XEBZk C+>E. -" 0Zx3:(ZVP`jMoiwn<rH$VA- C-].2M[Rtk:N/hkcRGd3dHÉgccsOnxĕl#ɘ7ኈ@㩼?pioS6[Hȯ8zpp 6h\BT M`p&Lyro1J{>JkΗK D<94fJ́Rbch0oe;lb,w=2 %h˕*,'WyծV 58:+p^u ̣)m-bE.BXu Fb;ˇT|rNkQCDY`oýUvdK 3K#4vF^ᔇ/^]4h 7 zlJ;< T،nAd*F+F8*ĕyO }L\'7qH2 1NޫogW_@9pF,W N6iR4m@ ᬤ(a}K5Q82Y*v l.zFtEAԐ>06 n$c13(Is2 cIS~JɈlCuqgC+ "5j>uT8؍-PAgoQn;w@x.^J(t9gmފ@9MpEVn>KgV#>$Gk13k< mH&Rw_W+,{g?q: A~ r* b*D"xYYdh57:t]0FPEuzgOK8B i㉻Jȿ4$10ϾnC};Flt^xev"if2֜qzǮ\oٶj0=f61)9{Ch 1q[Z}ȨHr7T OW벳FYT/פzhw4]6P6 +H Xq@hv+lYĉn>"gϞ&y~M )bˣ gY3-o_5 V3ڢ'g.PLڟ>(HZ2n Ku4wv!b8 m$E9SyHk] @3WJ4Aͧ'Ϲj:g&⫓BV +i!E8 (0c5cBVT,߂o0Vr޵-]51t.L&?$;TSǛ8odTm'kapQS)Ob1Ht|I/ِ܇N歵A<;8gA%H$$D  >}-,7$%~3HR,321Nt"|xxsF8nnt4niJґ} ,zMpEBқPJV*$L&[ߚ͎i~<E ƿ&:ͭi4iΧ~4 9̕OZ vo'vO~Vi F fDBd>jЫf½Mtw~9٧)385b*֙w:B7g{VJ瑚g {?}Sho.9HK[Bjr7yph;$,$^ nh4q t\!̤\<> g9[Xks }ƫר.i͌ͪc$͚{.Ü;BNrr~]vߝE%v&cDu,!*qA3cAu8vj.'ˆ_:Y)Djj@EY1cVT,pؖ'!;}ph_!Ts4 ^ㇶx,qnj(;Q+v |_NXY1 -eҤ &.X,h4芉_'ŠrsZCΓҒQ6EUӣ6A{!NGHN/J,?4·0Z!Ǎr $< 4PɕâCC,RثtXrKNDU8vv!ۏ ?3Io4j~0g RvP!XX*{<~%uTVQ?n(R7$nYL~H#O4D4*29 l A3Zޗqo2oX*jQ?D;c0ءHI]p:3v'\ 5>-$]gBAYan3+H6~Ȇ5/ ~(60GpB$q%O(>kQOD tl9M*!8@z"_y>qxcI̊dˆ!f!p(QF>.47݁k9h*ӕr2pҤudKkJ1Wsk|Zb? yϣ Y\flfXg(np-8\If7m쐸*wwwq3B5>@efI;2Mj̅6)[[4к$d2 P>B6h|nxI 8LP: F9v#d$I!>0!%xd35#Uytz|3 NA/b>b6gDZ3{V}4H9Qzm~Գdʏj=11Urv4FgcPZlvEu.v%eԦ=ޭW`WO ^7X} Ӻ0Wlz[1 uӘ!;0t{<|mVnGqryp[ ?U  u)6 zр:dXkRw8hwH:Ytm.<sXSD@XN_^ 0OE(V%tɢ9[ޢ{ MOfr-"Lkrb)8"bdߠ$i(Q`ȣ0JZzeExXťvn,#32uՔs!*6s+2L ; kX4AQJħ5rA4>ok,خj1m fG%&N{*t7 ᄽH:P;UZvB5kUr~29Yڼ{j=bJW}!.9ӥ(qq2IFBvNDn[LEbZBD0-ΠCKROე*=V/:#_: O C6qxޫbA%HLe;"Z*Fir^Jn\0'`5VVKh,{1R Ei<. 1S#'I?O6-fgB~.W,dPNm Vd O$F}DSIu We6fKQzNUz5zW6p>1 L\u8K&oF⭜`YJs xȝ2R=&j>#I6AO!.i/ s8>V_l`1|q؟d R4蝐/)Y]*ra,`iӹ/'k;`#(KA;Eԇ ~1b՝[t'#luG۟2!<0>gP#ġ2;Ϭkzi#Ng q3LE}XuZ6:BMHW>T.EX)tŸ+Χ}}EXkn k6P';H%5?h4IU1Biݏ,mχtUf\44]w W< ;uG QCvWN F;RދۢT|2d w @u Xnݑ(7e.-30?"&Mͻ"79MMfjCGw}1T҉QayF@9tg!-v Oxf>7eg5(Q|*#/fY {b:r2)egHfvQ|S49T?+A#ҩZ\>Aa14r2d|耍Pr1MI}kPΉgipح]kwʂ)/)1XQ Z8ʘ|J ݰY jd8cX6R7pu]R4IH$%8pEr;It%W;6#ݎjd _Jօhjf0êtұetmpX86RmDyJs13@g`Cf*ζ" jXp^cC=XÛ8yt yɧF[h8c4n؁Bˆb SA^ԾQFaw-ݳy109gS!ܒJV[2 :z7.2 fs۽L3ϳUC->G1أl$n0(aAre Oe#1<zØ*cz5mG k<x6i!㚹e-NB9˪d #We 3U;OO`Y5Dip3 I Fr,=[Z{U&k$NGED`FZآP:ܛmc:,xiImA fdl7]C^Kq[*o:Dըcb{& D|܄ZǛ&Q8h,aT1w3QwD'dY[)O{ GLT92 wHcZZ5l. [ MۂbHc%*&xTw&e$.+( J8]@=C~MSL۲w.@NZs{U M5]V!ՕAϣ+s|rW}Dn:algh$ٸ5ʳ [ˍWhË._f ]yP5 0 yTV=Y"i>Ď#VyE ;m?0~coÂjp5md[9wqV;&(, bkC F]O5%wC_26É?5i<@TXsEYspm ş?/oN3:&ɳ܉ ̭)!ֆv +8#w'#ɎK<3jp7 BlIg~(E1ѼH,#cLqkU*Иcyg_;EnCB}ϔ]i ʈdUI+gy eC YYvCM$[kר]Vmx.I+c'mlغ=Y5p{޳{F3@df*$ֻmB˟& X.]Hf~8\bH[6tO.;9U\fȾz@WZ^G`Jl*ٖuʷ`Fl{;sp|F (5c}/~v›Lx1[ˈ;Ec}+Ss*'*"&!*:J2>nvZ5+sXyNIc>Pd4h8T"o=2\ʲ]W>hhUCg_a"2őU13߅Y!{aQ.{8'1FKD0ڑ7X S0 U!(^J<3 >D0KH6y^w3 VS~V59wdt8fSc^ETKvm~;̞3Mb5ʢeGl9XJcMbsqA#7$,芚]'Xf2,$VR yup|j`CC|+dª%?W6Ab˪JL\ЏN54>[|-=ſbi*'\&ѭFBKVSt_\-I*` >Ku >9*htj}p>I ̲4U<|Lj8W>͚"UU4؉tџuo jRq%`O>E~tѵqRFAcs xx:HޘMJQ`V&l 5}x].̜<2J^4`a)#Y! \6Tf=~$ ,$&7Ċ)77wB@7/x-,e,' yEw_^lnu5E JIۍ'] @y("S뇅L'Yfo=M'k/_#cCkܚs*>o(>JrI 4pqiKhZ8qU$N\1c*EͯH;Bjs5k]AfIz%r pY5 B$mq78DVJK2l=0qa$\PчnU _Bɞƭh|2vYc݂Jqtz8g8elW6!VFH߄p2O v9M!H(o=k& b"DUhu0D|ԼюPǦ#1ahV\I˗Cj|QaF#@-%vڮٗb.lۉ 5e4N.(:}aLhUm 0]vϕ1dMRS:bt*Q,Eܧ)v_x Oޅ"McT8L\Zl +T^A6Z*GYw\O|CNTlL_[goPD\ek;ZÏ+Ol=1ڡ4`иVF@xt8~$Ո ?3&#N`ЮaX&?hBB/֑WqaMC8g- /ĉ(Oļ gF {1?sE^Nņ[旒؂f3#jO='ycF %m2K(jnKld/ dt60߁8!+0RiYeYVk4H^~ ;)Ϸ {EQB=F 3Ӌ*wtw0"x Ϝjy 'I}x{7Iь6)=CU@Rl%:o+)"'bXEw7L1ےjR"A~dr-Q&k Uq`y?Zbc(T䚍VnycM`"VmMTWXl`[eoa=PF(c74{3CV\l~F-mG[<ہ_nF1 h lQn&7lg%Z|H4mGS`fLDlěmτ~h3ÚЏKd8A h;Hz#c'ܰjشiUT!)wH]H'{!?8V2Q5IGSτk;` J\c`_(.E,M^$>@鏡Q(ZWʅ3%u+W!]@Lq ftbteWLYN,A*fS ́UQIf7FA(Yqq-(T]2ٓOdS$}AδNÊ LOD^F97(Ct^Fβ$l&b,5YAYX̓]yXw_HZWΕ<_J][e Erz6gPWBDVePL%l|dtXAw{fHB(0D4IpZj+r9Fq@uOIÌd]u\)qD\'s&:-%eZpAzU,pςUH9@:*sF#$ kUlJQFa$EErFOTLL.trI[:&|gL=4l+uxKM w^{qyb5$r%*ŏ*C =p. i"8m{aaRifO [Vn ղ~Oݓc ^r8/B)ʗjCo ,`s3EВDp:/BF7 v$Bmv!p9:s'q3DAu;jX٪w8}+ZKfodЃs.-id'^q㩁3@4S'KT-Gr'20nbY!|m+IP"y{Ҹy\*c,:5J7q9!; mΙ$2Eo1B!D Wq2BBl;7L<lV62(36)hyX-7SbHbu;J͎F"TGh)8%j 7gOM3H1RuX(xU'3 rAYG1Sk IbHq#־qC;(^ev-T5F֫6BTQʍOݐN}dT1Aw%شΖ#[g*%ʝ58.кKiM STX$Zb}&w 1+_R)9TI"\ɸ@~3@M$*V8~C̣P*fU-ݭ f 4vH.\ 84|+\lDY)hQ\5fQ_ңA l$3x.:9W x7Ȍ3 #rpMm"/A(pp)8Rd5 JdSZiD1<ܵ&l5L"*ĝ\8KMSo Fb'P(< G h@,HƍEOG::xqքF'`i`;ZLg\XDGdY%Ç"8,c3q_@5AJBFyZqՁh'y<ܪ7,'|Ѧ]a"j=͂ Da/|1ZChJNLْҁ:8IZFFllrP{br{K~_p.KED7 L@꼺f 9T# `DQsPl.ܽ4dH"I+_ 袗U_ksoK9+"g,,zAMдjV PP25Qdz̃hP>`5-,xD#IFؐ 5/x>L(nq 5|LfcLKܱMQU"n_&8K"5Rs82Ibhvx}PԢPp$:oDxD(]H -k`SdJ$v H fCTk[.Y./Z3v3*s[4_\a^ZnRh]*?D=,l&%q{EdT z3& (_={}s˯x~fCn/|Y}Lv,-;0do@鉢c[]XBHMrg'j1oP۲_:;؄?S jfDqyF^!l!*M0aWMifdZdb2[TBv "bЍ5(F ]*?KpWe)0Y]R`&Udeg1Iv'TERa0d47,EMoSgY+YMRp|g&]8- e)vL2P Ą#1%si-qT+A="YJ%w5s 1喍D剠1e+&;,O8 7'aIwc>d)%a  uUP4"n/+PV*s͊)96r6:ǁPRꡔuJq)PJC43Vp~JԈ``20ճPi.t{HUU \9vt9):|F5Nn ZT3} Nt =1l ɶ۷_]QDR 0 =8<`zz?=I;'+-%dIV.2O R;^+G>Tka?w/`4V:S.-jvtЋ͂j=wI :EHPx7F19sZQ9(BmkMs0`#S9(:ŔopR l=(k_|"XI9m"Gfk6;Sc c%_NqwX8 QIuG"יHj:!m*jwh?4ۥK8J}~c.B5 ]jA{UnlJ/6$QWsL s(ô <RYDX_i$iA0 P@jAmK =zpbm7ؖio튡ͥ(wh=5 JH_w1rQbw@kv-.Ŭ=yNt&zl z[2XOPPQ[h,ϊ (4 Vs h31* vݏڠk!lORXz?5fU լjfeu{Avux\ݮ] 0 {T\r|b^ʗjqFUZ8?xf)W 1 6Ux~rx1+[K=a);ϣǮAr}u 'e3 &b<^K<.8 ۜxlՒs։^cNa*L/+A}52{Hs۝rNl;Qe<+Ɛ_#ثp3劺N.Wꎎ0]|90$BOwAUjͦ Y"s;pyx&ICOG{ %0qdPdn#tL|1a^/ AK{sH$}ͧlgGH$/xR."Ʉ iwc+#tJbdLpt,Jcl/e ;V o5fPMpoT2|c?z3^0ЕGؾ^xRWz=/*8+Jdٜk/ʓGA\RO*Y$%94 W; 4e3<Yb,aQZ@_ aePtv둖ԍ|SJU)ҭ [K:ؓY.8#qā'NlTǺ[uQ3;.B?|B1aU}9Ηsb)KS?IO TIA\0Ṡ=25t)[#\Ȯ_˵v;GFT9gs!C%:'Pшk6 |2kaŁ gQ  A4*0% DmVvx`\$r\aweKː^X70cSJ N=ŊɑOHt%'#erEa~h$2+'0E{Tͮ6 AJ}m8J:Xl1(Q.7i81-Mkj1CƆ',xIj-weϞ=dꑏY7풖n,zY>+Ql6Y~No$yL+H'U`m#Y: ruT%fȤ ҸR ل,hnxaT[#Is:5 HG;)ZvrЋ (_dӾнZ^xE+ӃU!p/>g?=fK7zkK7I{bҋYϜ3'NLDԫ0t~2>Pj ONJN6dFa)eCB}M9 *NKržcj9t2c^ ¤ տM7o9Le9PУ$6g;,Aݾy (3jT[Ə4EVH*=Ne" >,'Mnb|ך yҺv`03q`J゛ )J=e!i SiCˣhb)r/ke=rT5J+}x%6g cEDخ*4[J;+U εJP0Pfڈ!am~?` 05zs&_`j*Q09DaKb/::5_=d56v%#&h^I\-W˓ClWR{SmH_԰ g;޲ %3WKY1QVH^5K0Rlաj~-kυ<ј }feeosN}a:e{(<aܤ_wH1&ӵ@RddTV9ېZhH@S0{EfF+vO4{͠6;&c{LAtcĖbkRVlMgu=|B-a礭reז Q|~-=Z"lfBݾA$D jV,;f,6d]cbhWjwN+dC=%5 )0f ؇%V8SoGVXL$1vUz&eV"n"0sZeWm6܁+:HH*w}v@hk!,TI$YK:IQ Mr1|4](E~Q}'iNcC&ӫR3W䞏L;A32h@X%sm+dJѭYV5GJE)(E6p=5s3-J;<`i+IF9剘K7Ix9ǚAPs3H&c4a eQ h esG+fWЗHf:?!{1btDfCr>}6k-cnm:Epcځ b T1S>r\:+aNV2^işem Q WTΤcSd3+uNqRv%*6Pf4(Y ozE,hۤ1}1E ozapnjW=p@&Is;4":T21l'Je/l DAfyۛ,rg>>rIsN`^ɛamC'7hƶGW7{b5Qu߶&AiP'igh^ 鑪(seԟ|V)ܠqP9Dv;ij.+:&( !(հ 0|:S_?=%Ii2:!̏tNHuZ.:!-X:5NjGa+%S  Z 1LmʎMN]'yHjTTq(]$͕Z*NaE9d2egv*U߯5t/ њS60ߡ2 bHGzxSEٶJ'fL\jN,'C&{ ;f3HV[?`⨶i7,Xto+O9k`w[fu% HŮ'P;>[ PȞf_-5Ēctmd#>Jrϲ\0P>4s0_솠3y5\6(*Bi[`/@DiTrTᎆxC1?'_ū8Jv]W=WERlZPl);E}6f)zQ5Mpr@kMrђȍb Ի ao+eB703lEKtO_ o*bֹ'0*6ǐ~dH"=j!VP=U!OYּYnz@~9ږ߃M$} ׍P&q;bc|+ai*0 U Qx5bE0|Eү=Ю&K~ u9'2E 9^kz aSB(!kH'fbQ2gWgi*ZL4XWm!e4Hm*@W4d>Y(wKZgQ(~ a4+LO8~ҳ|ybmZ OEt~Gqfm+F m~S{0SڂaB`g׆Tt&WNHJ]";4i8퍂i\2SJ4VtKT2ZڼwA}R5K⒮(t$ šZ>]ELX=7nѡNo:ΜVDs@_A/ۃ`2 1,#8Nl(\-voI>bswj@VI]ިKPfZ86 l#Zvni*=0[eTN CGl& 2W͸pZ=sS{q<:O+>.M˞0O]n<:(V @㾀%11yU4Fr: NYh|p+wvqKRum| ](6C\.U36(Gm'5C~(.hJ1eTxZ!QsvƉ hy藍"IiNݱ3<0N+wvj< D.!3GZr58g-kO UU9W&ϭ FZ&];$SQc۷JO((L zpkRv&)YJO,vN AtGVh&1j$+s|G,2ت"YKT!ڱ<+.Y9MFq35YV_,Os4rTHtԘI$اP ^J\.8%_gOW)g pܜgDCJIb[YQL"5Ac}o,@PGS R"F6TSf!yvVN*kZ)esN{56*l@3:Y Hz4l 9}=qΉM;!)G.ρ yT SʁU;;bEkNC1W͸?Z}z3=n4ErV+9'>eo \R9JLX*`dEfsqRU5}ũaW3e-JIAdO?]d'P+ 7H+m۽zǘCfr"׾sl𞝠Ԇer /Ј"C]0s~m&{-*<[;䥜{f۬ kIV&iv;j鐁2&薷FS0Iʆw+e].F!}j/5lp좍PTy.|Kqݡ2>_fsIAu86v.ϯFJ&Yli3Ru1SC:M8MFfÛp% ]5^'ņn*iю0u]{OiJ6p @FKi~$\ *oߍ314梀?tڋr{I 'pJZ+2a2 5qd7x]EOq@BkMRAP=p6$R{QIѥ~f[%|:kn1 WV>$CRSƊ继(&( 8D1'pufJ [Z޶n" 4dJ&v1Ǯ"* {Q>e @"=Ar$F?7 P9@1! EPPn*OoCHmzIHb'!U=0n4\ZqOu D ZH!61 vp[ʛyG)(MPR5 Gx90YY+;*f!i m:dϙor.b%i{ bf9A ƺ2rMKNI5 se)ucf c="u0lPrzu`' -EJ!~K^ >`np6/[`famCDuDGͷ^!֑$ ݄sdH'lJzZٍA: cL%D3 ۽c*kW q).$-64Usx7rMfU(4RBA |KG `7ͳ# il9ѷsY5}5xeS-bwQuSd=-A?E3=rR~TfK3rOYr!DN;I DDEi3{,"w&r]nT* d|SƢ+<*^e"ƣ9&ECcJ5cz엂 (GZX}9[7dRB`-(DžL0!AdˁC'H,L[F;MP' 0id¾=?[\ `Q$V YUmU@D\WJ!ةkC3|8By;W0%4M[X<)`R6Vl#:I@_&Qh" P3Gf$Md$X*scU;KRvȈu7" ~AۉoP#}P3Q˜,u9/5,ZnmB#WY[O{0YhHcZ,jeE?8֍{0H thM;2ٍ9޿A3%+&VB$ZX߂Bϒ Rى1I1 J0= >!~8ŕEɏ 5Eò8}gh_MϬ 7{_itN7*˺xK[}E] lYٲд" $z㲶h7jJ7qvZDo8SBİ˒5%%Rbl"T(,vk /6j(.(R=bg8Od5(ӭ83ӍJl}IbikBH.?'Y>A޶)JszT fJ}U1S&HӋoEr|@׿ɚXU͜fiR[6q/61"izJL\p'N4\/ͣ|FlIC̀ &Ag@o4dVjyp!37fpgEsڿu( 򸘵zSd=&BGг QP4"W/EU ZVF.elr@\gml(H) @)RJR)~K|V! _ޠDIski ٠MzkxNt|[ђbv s ', ˻SZˡFko{k~f@R5YXv^ތ1w@ ع͗nMf߉~x5+vݡ8k+iSp*КZ <[q ;E~p]3ga3+LVL1YfsEO_fπXzmjMVA'9~,mnf`R (Vg*mó>uV%ImT b\($5lps~5qz`/6cB›N'NCq O)`>; xݮ̪F_u}~Js'}7 +2?tދmY=Mn=jÀ4JE*n?3 mFEN2{M/AWb5fn3#fbL}WA6nP$Ɨys=C3H_bAp?nO5?Z}2\tvCtƼ;h μ]@iHܒ U`ȹ]Bڛ6#$FL{LqB+djB؝Q?.(͒gGe9NQ7ċiā'YԌ`XE=o(#q"Z31%pməoeE4AFfT T@ Jnխmn sI`M]]ɓVᮇKhF'Xz:nj:M\U6_ \1 2Pm f5TlT g.r#(Q8y<ը&0!hOWUv*foOA[4e6q>&1v^| I6\oXCWuY8qכFgk1S8oe2G(ӓ^S)C[C־MJeڰ! ?oy[ŤCsk,h /o}r[zw%3m>1%)2=JoDz1'$:r 31Zԃhm1j(!%fk]wI &[DnҬ. 02گ]$/zihR` N+P muI!>r<6s9 PkȢbvǀ1%]SWt |53@oEc9} )"`Y/6dµ=5L^V$e('dE@a|,k'i[uˇk)j&sy4Ĩ)DE(Ynr)9kLgi΂!bY@lkxoCiS b{auvR#ɱ <8(k@v`ΗAls+eƵ w gV7'C[BMH:lb=>p1ĠEqcv6?ԯ3v L6 YA@h[6Ꝏg( >&R6lֲ_? p }6{uY=hFinaRaTTt ?̓T +OItmv8D?aUY'7y$ďFB^,Gf!j&b2k?Y&{3'wևHe A~ZN!*,5X0׳* =y49k4u8 ˨`7`u)'l;,HRˈ #H 6=C 1DN8ʺf3@+Fȅ @gOLB%PK>lCd4XTGdlnq5!J`)n`*#y,3j=o?t8\(܌rge?w9`:"Ss~5D:3 FGAs|VNs]sٲL1,q=uQZ`RcxؠP^YBY9G0` .nꠡia{ r4@Mٌ as$TUk$&%HX2l-"VS.3탭òyC?,L,(iHp11bHgw'3bR{}XCIT>@S\8;NQ7,L"3A&ǎ+C>2;xc`U$sU< Yrp22u ;Y'p|uJ5L;|[\VV!lѴlJke##90:pSDg1Ց! PDAs," &:+x^[:8m;KҖd0TN ^2O9+e[ЇP<^4Sd//DKv^^՞YGKUm9 (!\[ӗ巖Zt(,A{n?sV`6iT{ua"f}#S/`4mwLPwuOnL\~ES^B)cOc/ n7-4cſWʋ,/cta:T&/0}u)o!kK'$흴қ7sLRU*}hD+5CrCOtFB6%~/j.mw ZumOiWN-m嬆c&'&G =>t:YRfT׻t mÎqӍidRz= m%ce쉬] 56)+Me%xP\ovd^534VؕN==<-~wmx;"[/93)Yog٘@eOnI cj4NLfkc_-haӓ;0BqYL @szܿUgw #Q+2*{ߗؿ kF~|QIJs0rX_f| slR%C ~5Q}lk`F̳b/PD{;\K13\ rOY$W.G ~ASJ䎲l~P- ItBe{'iZ,~;1ي5>ǜ6\,CkIxƴH "#H\{{/^2_~G[煀Ih`kJjfcbt{BQf9U*3O-xʠ,;uȱ"92wj;uH5eWmg{Z(7E+7̓Qw())0c( [[qq .E a`5VV 0Rra[R.&oΈ*HF2,|#=0 f%sr035vܩ\Yxm W)d=ŕpAcLv}"]x+S̊1H'Χ u ,)q|>j-%y{l@ ǒ-"Og s9($~؝&-̋biه3G$bf ] 2$NvYbyۀۉͧש:Xl\Ue9H+KpP:/9O,E "1[Vɮ(A/>KI{'Xy%:qV|N,"VsdxZeQ薢_O,]א=j,τQ33rQo Dl6s}j\6X1Uj|4Pk?C =*3Bi6, ! 94sYSjDkHW <6 ra~*D1}Ң_.!q(TFy1~q;>t_)`"A zWHS5,LH^0yY^\͐1$xXhcbdJV֣(͠dIH]R~VtJ,^/l;af1wd}WꣃJGR*ϛxW7CսIvE'<vm4aR! FT,GjeB>GF EtՆrmꋵEFG1Pu>JnX_>zO%nSqhdǵiZ*98e6&.6STB*?Q TKFڕ8zZ}S.ףL94sORZSi{SqM3`UUkd`ޚ]iGyFSPj!E1ԙc٣iOByf#LXN^cg6.ҒPVߣ[Nc!yCo:_dMC.cх[令8GrKejũ'Fꉝ*qTa#(6iy]IeVX`RUR2,2܁BaVaQ*9ɡ9Ba!=Uǰ HJ=`㿡4.ט2=ʒ\]x-9]*(-s߯/Qg6NiˣUddMTi<̛N3e+b7qv*&ퟵᅢoA OhunWS,4K؛y;tx^%ꐙr Z Dã;f.wsyOMpdlZvFpxd *~ΟPM"mU X+}I3DGʁ~5QGk$ ѤL֜L ™{vBpˎ$u/bleU>,ffQ+ j,EMaK:ۗ@Zy!8$z[J ؁m'?Yf^5W] Bty1_ͤ}P+ĕ'DG .lETqf2±G dwgi0YdQT+1+Q4Rtgć@8LL3E iԩRT b@#r ť9 kȁ ~Oam4 !rRJVVe͌B9<6\{<ͩ <:381|A,_8LDoY$aJ3W+e'NnXEPv]! seQB6kl[Yōj&XdkY\]2PӖxg!Geܕu0BmBojGS3 8NV 4͂at.%S)Xy+3)`>VbF KqI%)GW ˉXvCATp!Avu[\T#_`rP9&\1֯[k,a=3aB% S=\h# bE-`vZ|dk'kU!69[qsS?Vk= ƭsW21YFPKG)m݆As96`߷F$TFkz\}=4-Pо^E|Қ2h &RĪD QC~|97/ 5 0 A82# ӡ~! 9HBB@g)C?:"5ߕ59:n #&c蔣5ll م͝j16p,~.͡Om%I"epvD]G 6p|a6œagH'I8ҞSf5|agrZC;#摶#Vs=!E'f=%ByosN̒ҁSն^掹y[HF:׊(_ȕIy7໊K7kgaY3\i(ȼ &+˰ڦ롵\?zvJVj;R l#Z*E:`kJ%LY0kUb01BJ"[- HmSFB:tQ+V_֗ 5j1 n7jC`QZQ%ؓX4z@lQv!`IPo:X\LFیڳ/#hm }lngK1m P )>$19s`ry}jUF!n w# eGV%x3`B-Y77@m*-b,+n5Սmݎ,\IYxC t^/[qfx bLU^d3< Tn荅THO[Bh b@WmO 7R}d%lY'ky#~-˙ϕ@B8ʻC' .4Uc~7h98Fd_X  $ݠ/U_[m;Xp1fmdښiɰDZ #pq|V|\ɶMN3$[2p6\4+XRKq Í&|cBfYe;ƅlɤ6kXrq^04%K@.25f럌%x&..DmheHLr7r&Dp\c2gr–q nP:{`"7,`R;aU>L\IȧBE4']VZp&^xRHpn2 NEУt!s9lY꙲Az6Tڄ؁灤gTn 8P bEBjkFU7=diڸ ,^"DZV:B5d.` ON,1.i*L^5rV3fIBXeKK'F5X$wmck"ΈRH nY1`bz+u)'30QvOzFA안&. V%#wlf!E}fW_3) ( ,ͥH@@KxZ}xVpla bsr|3X%(T2Rw! 'xyFcI`%;r-GQ!oG֖'%`ЦO_Zps+L&r*)9oVY9闝߻1D3޲6ዝFTm9-)7pE8P *2аeE:X]> j{iR7ˎ۫]+K6"yNlV\(ݢ%86B#B8<"LC>4UEMgȍ.CmN0mbTnaLcZSQlSv;& kr mW14@iF"gI 6I8x^ZjvԴ4[,g"i>+[]ɚiZ^V#TjyU)2o4̏XAjڼ!1=)ua| %ʎ(˧$h2㹨ԢU: 'b>01V laʜVqؽ ufbj˞T uY1 Y>7@5\䮒OZمf&ǃ_Ѐdc#FU 0 4ָmp`Wİ]#S,ԃ"FraڑVm*NB*Wj}r֐@oZǧ3jC; $s"%X˕$P/7I=qk:[<+sXLVt>l&0x p* ͲI H;cy=,#dS+0S-+02+{F௹ ga=Z bs_l9_5pG']]Wmߚ_[\;&մ ;Ի l/d q (u{Q|/D$JWmVb;Tt@Zbf0ֲ=;v4W.^@ώ-w'.~L#1's:MS-E \016QN$" Gu#6Bߏlc 6 a|P:͠"U+MS%.dX];nJ"gp*>5:Ue^nG( CpM[20#!*#D;F5wЍ2Dv<,k|5p@\'\B{m6w$!]anQäd0uN(H!;axΓHЦz̒UB1Y'Amdm8a`cgXAO=Az L4.&q"̷z ( qs (0m5؍5LtS DVPvz 3j]Lp 䑹Es51CBSVZGR7s 6'Ao2+a?sT#& Y;BWXʂ!|aޠqwf c~l9%(rꉏ-(! IDpxLA3Ա^vAD1VCUo$:+-)c@&Q=Sgpsa@({=tϺgsY{f=IJ{3շVpj{7hDbj9D99rEt"ڤ3n VY$Yhx[WRuX6[\ s!j^[-C S66CCԝ൪ vԧpgCRr[nxKaOYx102HMZ24uLCC'O(8ò{U9G(&ud> {N@eʦ-1hA" heˌX%Rj}#q2"H+F#Bp4$DrJ5s? VrWMAUYZjzCSfd8C~r@8ZI^<53ujÛL!K=F6ـ]s@x<MDϮ2g*)S[ۄѶժIRC8;e'SJ!+rD aerJ\X-I`68 &׌ ǝ(at&Gf7Y,vHNpXS*|II1A%$شYl}X@@[4 @|N[]2 m%>ȼHYjSu;66|Zp > -yڱA om:S :X;qoM7=ϫ$ h~r:}GÅ G[F{Phg;;ba U-bʇm}-¹He)Q̢SPeBo2"QIZp#P&6nIjuO*n7y&7^ wT1R8ǖ2?5*'_7$ɆɝdOՁtڐJW%]OM,ػ̀.%1U8O=15?`Zr6kk?VbfHa0z͡Q)jClr Ա-g%D1;UYI ւ~j3a9NI"u?jhLhi`#𮕓N 8[#AB2ʀSO] KLqcة&1N0QBp6a [:iY8Cl9uk{#%Hld7>۱:Iď wU%.P͊긶2V~2pʹ+!7#, u@E/l FP{Pin9f`H >f9]O>(l$1H%U&J%vh灦9 ֶ9 "l:LR ґ>:+R =h%= ÐUC3F em˹f5zy 4!P4${$HI=IVӆP%M5qZ+*JG6A ϫծ>H84Y]3kEO]ռqTE$ߪFU9XiOpvӧ*;A*HdzNJFSv}ȼ$ȹHRRli~ 3J0?)bӴ+zz-| }jȆ|/?i`lW)fHKaIRTB5R0n<]'GH%+Bk(/P}V<8\[Gwv 6){ %> (ӋzR=EEqWSl=!tD`l>SJ[D+YdE -ؗx+[S8P a'I x%$f*=")Pu^qNugEV S[1Z/> Ҫ4ED'bbm%ԄY/gg$NWJ|lTk6C373&7hf~<Y$tBM k9{~SkWqBd~{kttȿkV)BLz,v״1KXSVO\N ֏h*'Z 9ʤC .78)x:('3$ݥ5:i ^ܪylu)1h~'aWU{mTyW/PzTf(`u*VVs_˩-F@Cu/i= D#\(v&ၫFO*^fR2kDM)&P|֏Z UqU;-KKkIcS{YD v}A23'^ Y42z/–L!Y!$%,nRxA rn+CGpB$V)$dlɐkw$--N%=PC(Dī,O%2e;;R[a:\mLy^&s;tyN-U%Q&Vq<5sv)j$3[}(}LZb;hSCTk3Q~XJ MߨYOfKoIۥ+7o՚dYʢC%CcZG̬'dJ'Xm[AN\~tzm^m;Ͷ5T}Wc$$C&eV$JU#QohD1Em ?{TmfDɸ DVډf ԴkWXܿQ)^6Sd$zxp'v ۾vgCw0cԚ <|ZPRtBMVa\IԸk9I|~"ӮܙZB>/ -{6#1FQEu8o6-=rm K8N J HÝaT/võ2\J -3wL9fxfg{^efB!o+ NV(dfo8O*`Dlf;\ϱ03x>\q$SfVK5{VNnl/G5̜:*үlEohX(P-r.,"w :<5:Ne¯tddQ .<ː ž:Wzvhh#.}Ȳ. ֲ(tH{бz_m٥y[XKˡb\?n3%L?#۴?#z.aew/#O}Q1hd? _>,ftg%_퐟bvPX+v/;0qӦ\WfTGjV_ڙ73/E4]i'j-v@` nV:a%{E/0_ ,sBt01SshҀT:P/D5{;/Mո|͠Bt ^; [|a^7\T.˃u@jvFEV^@w=P^*?HA9unk{CA?0Hš6ތy8=Q+L]}1iN =oSֵ}@ƹuhҕDXJMVpCet~^ګU`FeC;5GːYdzx>Z V߭󎆺51J \RD/i2-G=rܯӎ=˨@|nmBy߅5җ}@λӠ=(x@yU} ] }QeK d>3|?=2^;lqMM0a$9W+6?-#Q= lr>%CQ1'(~7h|^xä=#l7$85F_U@Fk݆XC=+.pC=bPm);mUns zilz""mqfk`yTM]6(806rg/QD"C7w0/ A8%o&c5r\^Be`E1zr`vT@ԕkO+׃f'uCb9\&9`,ER;r#%a㻽?"S(|]B\Yz2ԫ,q(G\f^˦3_:J7Qtܳ; ЕԴ(Ffu7j!hm{[ ɺ,-0^9z/t}yěnÒs_;C& [[.xCxu^uUN9msůI.x~w9MT(R @Q,+Ѿ _|O,TuUKA+-~F):uuQj֥+{euo`tkDq=>QW+ed N!P ]܂[N!o9mEq\l-᣽2^Vf] XS"OS:v3[}kcĻ_7] }f⛻ ~D!}h+V3I˘}RQ0{! N"!>$iBU:3g1fQAj3`NIycACƾ-暅Fdi Bh5)AP™R \Sّئf)']5ٗmc D vF܈ST+KUp'iS= 49ՃqQL9gkiX3 D 9'O 2gݎBAE ;BJ?hIɷSF׈}E3?23ih[ly{ b$.gX !b ܪ$N y abrQdj$5CB#,; 3d(."ĸ$ jCƮ(WƂ MDUȄބJ>a&BdDM%&@M˙BJ@a8"*dL?#hv DNkk{7񎯛C.ow!~ҲʊDv)[#pudGԁ#Ċ$i,=p.PjkZ@C?L&cHA5 WuXzxLcWW>W7Mꭔ(v}&N'08n Zz]agrڟAk_o/\v/ oǢ0[dX9PouYK3w9]*:,Q¨5M.FD uF"^RMEQ҂ %&=Z?Z0f,t$}}𚘑N MYH25n}o^}v]vW%l ([|8jByreE!ΊTͶyu\4QVn_%QW+X0r COs˙O' )O|7ә;=20[o :iB]1pIuZK ;Cahv^wr {KL֑Za֧OڕB9EgMލȟHh ?)0fߙ֗ o 5} h^A NtrbQ" eٵpT&zY&pCxP TfZ2DRǨÂ4ƿMn@\hvG&)1רnp|1`FKIȘ$ boiۏU#U~#f[=MF?s^ڤw\rC%لeP.) ٻe6SBgjUNmkm!*7rw_ sncuo P16Y4-X R2ta@mG!.K58ѽ#wdzko*&Ae(|FlF7҄s,6='iuT8gõܓ9%:U@/X[rGکLx=ciWXDp>ivsSao S׽gCi7Q(pgLiM~P[l7D' AKVcAҘCo'8{i.vb` -Lۚ7`enըϹ\1M¿U0:0oWAf`{h 瓀A;dhD#}Xw;:RAq?ˀk@"3Oim6v0NK ] as( }F[jy\$:dkݯ{mQP-EQz(&Ǘ{D P&(|l0簥.[Y41Nq4-%F)G p/["8鈀eɩj&{dFXQh,{Q<4 fQqިdYnljlYHl-kb>TsAiÙ+րޫZt_k(8y閻\ /TFŕ@'طZ_D[)5 }KDWIF^<(ޱOwr>8^G +L'ubt=t j@E@N~v| :py'Þ=mP܅ؖd_YX)Te_ZgүC(% 9Ҩn:__*Iq^j QJ(˵H%B~}. !QdB t D('[-ܫެX!wR S:|U5J $\k9:[/v5xpV4ԯ_1PjP@JXIblO@5>ڪT7с˒VR:R&U(RP=,O\u^O6r_K'Knc@BXL(s˗o,n@'7-,3zp f[8@FP6"Y4֑hxP40իשR.Soeoˮ'li뉏{= A+-~w#pS;uyq4Qɮ{Bl̫ߍ;TqJ>$HI}ҚVİfJ1*X.mxrZۖWlVhcp.6I A4Vf(f eF82TR< e&%u[p-CW厴x6FRd:}+љg5 MDjuj̱ZkF!QplC :S%4:CJ%rO ^o,TD3t0 do g i(AⲜ5A.uUݦ*:,0$qH^,좑l*v^)@5| @PGP;  <_:avk/2A? Zl27lp[KY8kzQ0>t貆-b,@y_rzcY"ңwZo*"r0.̲gK/p2{ä?#JIu g!HEڋ;q,yh^3>Eu] ~t\eCm<* T . vϴH2382Q1<y E#*#\^=oA@jHF*[M0(q˥.GAX^KE]R3/m]}K1R2; "Z,zHfyWXip,dqP3H : 6aDs2M?(|Cpa~CeҰ΄>6 $YǙ; άL8@l:6zW,?VBOmb;>A+"aC{0CP1g(%[!蕑X)9C UM+6esA7zh"ö=Dl 9\^>;C_C 4#Ӄ7K)]I` 䠀KfDG:PYaQK>aQpZ-#>J ]@q=BԟVfR# ~50ӰZj4NfjVШwmZjG} Rup %ɡusw!sM uNydZ[.dgKCᣯ^"H,4g<&o eg:>Ҽkam ߦB5צkki](|8Ǎ= .FG{(7LJu rx-JA>8d=@.9u]s"O]Efa3noxbZƏV9\m8 NY>mg'S) HlkeF:/ \+A̔K5!AsX94_mMoC^6Zn7rSEխ$Nق`ݥsMuա1IpAyuD1 0#&|EĐ8B8KntN#:Hhù%"Q`ɿnZ$;[Հ! P&(R԰1ܠ MJ};n1#,4LM8M9] rrO,ˀNO3jM^=Qg>VKSt98! /LA`b&00 }ԼWؼ^V,q⢝1 { C8T =#4(Ԟaa%F[:ۚlVYn,^fEJ9.rCdYx\T8Mo+E(.!AOYc_` 402 dPigfqBu96jL޵nwDQ{S&i̜0@M-$)yؑڌ{_VO4VF#%73e% |ȡ2fFTv jU-Hf3:; 8\2\-imuO끗TgB_xEy5u)ᜰyqAߛ*l $kh4%ЇRRU JI@ߜHnd*KP5cU4[ _B$b+i9h.ٞbNbX'+76Skr M QD`f[c":J)kuۧɃP({p͖'/Ğ,8mR)>۞ઈs/"1TM&Ҥ:c;|EભCLfp`wLrh켽XhhiMa̼H&pX^-|Ep PLXߘTn}zBO9` ފ9e;#̓hXɼ㺊[(slGCU,6o{_)Tםd*CȜo-!3)0Vg ڜ.љ Hǻ_S҉_yd:JA F@](a҅>%|^KR`' ~3i65 1E#a!k';"pLk~wΛE۲w$̾I `g" P+-}\tn&!yBa" ], f#~,$10VBe`CfCM i9u8Df%KFB HE6bÉ E/3+ % .E%uԧE\gУդ̘3."M!L%e"y㳵o$s5 , J W^kxe۝)bW^sܞhowh:7,/ :Y2shd23f~89F1E(Fx+X 51[l@1(OQog$SefCk\GV edOfsGa-_^՘XLʊt ƭ`}[Z_ty\X#72QAI#)SRn7mtDe2jS4TlBpQc( #3 6&3r(R̎ dΠ&$Uk 3itwˢLڷ=5D̤Z*72c Żv)lt0t`%FchEEOsA:mIzWC !i5KFP#gFB-5"'SK Nmp|6#SjöH UU4?r$Im۶Ll[DRIj$qGpLJv֚agvZ;v Й;{½Ґ?\a"($$z$k ߄I ̻J.#)en R'''!%rDPrr A nI|g$|' `hf 6dxvX`W,$P 1-M.곭."ޝH)2ukρۍhP]~H(*@*^tNO$Dq R4U6,=  Щ!+(B,{pY6 _5=D^4#ٚK15K"P^>iv24kMΐw> :({,</Uh?AĩZ.R0: CX%WC*ӱ<*4i&'lwVΒQyy!!F-ª"]`5 iғd'acT g\(K= BJLaV@ PE]hB>0./| @bGΊ!gj2`'xyb֯Yji-cbqGÜUqKpx3Wwկ#1s#hgv2N7#R³QCF㾮mKUrLuvwSV?.;t:5w/KB~v[r 5Uձ㰋]sQuopݸS? &ڛ3d8յj#WK>con5Ft6Q |o<`Я&$3^3r@_K3lkd>g^;\r4A2Ϧ94ߣυh1Ի_gnpgьnH( ڡ"Y[D>M-wlwc{@q<і,QPH7XU3%E$cȥMVzia^w'Ԃu,NM $O-TlISī?uwO&H#0anBZ+Y5 *0 1ʐ1]ћa碘DBe+GXx{,Ws/SfTf}z:UDTr%Z%Sj z4Rs2Fm\qC6YDE\ps(A3ɋŰC%36og}uiN ;O=BDBeuqO /1Ny̸A 1Ջ'G `$AZ"q(6)}mt1u6c6;$;l3q3u3x3{3ÙęƙșʙљҙԘǾEz Sk.Xy߫}Q&0I4*9<nαv*̧oV2p4.)m9!3@5p[΁m>\ Z~aT|RQvlPg4 ~+\嬼زe§mexcٳWyCNHc_,3MZ׬_ސn9S ,M+H~gr1>/*=UFr˧<im͵ZJ>7R8Nmکդ)QK.9j}_!6Fi5 6VU×6ō]gwurp4uPA,iVLjɝW [R#})5JR'QRoΠξc,+h,#>j!m7ږ0&/i굑æ]_2>ՑO4]i2?kƬ|is7٠0lg]*&KޥT ؊鋠.Γx}t=H)=F|wܲdԶ,z 0x1JhUA&b CrDrIW4|3`^PCm鐥;q+Eq@FF.v*:EHN՝\1V2{w 3E4 \`:p0!C *`| հ:n Ksa)Doӡ<+rՔ\m,+^kMfz2#(ylhysDϦu&Ja nsoTda㍖ڪ؃ԔO3G(6}>ců囋)HUrM:k㪪_&X[o,vM]6 ƕiEkXrzq4RE_+}/|X^jcuosum=3D7szyv9cy5-1x1/G R&ee>nW/9nr7@T(s~1>$(oܱ3+ܲڝ"adLs5>cyD.%e(d}PL睍ۏQwN/ĎSհ ?3^bS>}QuλAv=d[ \ u["&fظy=ŷW\hɞN\Z D!3 (eW4۔/Ùd ~lo_kF-P˓e8, :f߅ܙ(FO]vV.0&C\ vr; 'suNeefO=)gg9ݔzT5-֐TvkVz"G=)GC2][ WJPв׹4s:Nx|u]̀Ϳ36Qc;(;o}%JISnmQK7qJf 0ovIV[8+̃%{17f?a1[mYEG)8KO EFk5n6!gs΃$ո2oLDzeҸqHnU%R"yJ<`JEAC/U]BjV@p<yUF,"n q4 淢[&!.e Rx5]F+ ФNYA )./a] 1D?\9LU\ãRQW -aԪp~Ql !H gM؏F뙓>3l bǮo{ofN!ZҞ#6S/AY@JCgcܗ"O?m9EZE{i-?=9s}/MيڭIDg ,y1@YΕc;KgTN5tljL|<]7~s fWj#?JQ+ @jn3X.\O,8i5RB3 7&6X}6j\yAfWCOу_tkn [ XJomӉcOn R25'o@9B-[6n%л\x{˩]K^?ҟq=YgOa<ʗ>+.hS IR^ rUv}wܣ TMaܳTPIF=}8eM(-KD kNX uCȊ)34 KA7L^E;ơ1Pt2ڵު[w}Хupe`b:Vi Y,thI晼n%A`"Z%1"T龰%ms*kqGIKe=+a cra:q%3a^)D@bV9Xx4۶D͏¥˒e6{M?Pj:4^ѵm,B[jGC!;)+n_Ia ?C2R~(lɣ%Y5VnlH J1b*A@e{?R{ymMTNẙb7k3Y$5X~ OҬIb{K] F}b|q0 ra"H|e )9}ߜ`>JJl@GAn\ {1ye4Hm&y8j=8BA\i"ʸ=Ԥ]؆_Bi?~ iN 𰴒uvb->./ ~Tnո^B5Ƀay'nP' Nw_PdvFԞaw Wr_+`́QT*dػ8y\SW T^w UGSmߜ~wkǰZel]]h"ǂ ϻU[ہY8c]VDzx_sGI+6D?U;V \hdwcbd_Wbqy<Ȧt>8ET׆`׶ L?آ QO}Z"Z YW L _;hQAA XL]VێkL6@6Pv!pfey[gzAmK5vk5,2yuPF`VX1D[6ڢWG mP)fSA6?DP\F4Y'mXdG+pS !BCz]]IX@ԗTsq'^T셳Tfʆ#f>yաؐ U3?6%N0D:Owr[0{Vj6q1Sy[wXWOPJ;VϖC}W3eT} ٗcҽ >_YޕDwG}_ srN(d'ɓ'%}:U/E*IR$07!\ pW<e%ˌyHdYsD'vVA'~ q1J/B_q[k /dܲP8k ħQsSNW.Д_B3+;싂 ɋO$B-2){[6 2O2ީ?&#ERU<>_Y~}cped'5~S3ܐM'eO?C?1h.H2> I+Vbr'G^$DHqK䙍Koԙ9LS({blvm<6̝Gp{ݯoHzϕQuwHsTt/l6tt.҄jZVQah[YȨ3Q.a4K~[Y(.l!rȉNm|uMfnCzϗX17l{A2kŭ`R01k2; N6-Q&HTqeGԿ 6Q?,R=N+ `ȵ}.>͋|4A!kPI34aqv~r)NbvuS@n(yunRe5h؛VŘSy>FLۀ<Й}agYO/esHlĩV>4#Ÿ],#˂2#',᱕JO~0e'AuӅX`56碩a[ؔl6wUjfL4vb{ "m g&Y_xkRe[\k־h_V]>˖a.dQvH94َQ&:G\ ?{ĭZ:{F/2势YNgb/m | ~iї#(_2܊&s]Tѝilj-mg`c8ԊCo4 4DڙPPw b_u _ ppRv􄾘w:3b U65ˌlY礤l[~&@&^6,lDIC+RH%iM)(i-ugiM7k_<>sdq6LjKYDsrhQX[aNT/&"l>L(*n}Q nDS_+SaRNrlOa@ vKZHb%RZ8a࿀4T5~'9 R,vqfkQHֿIO lFKVԍ*\ZdȨ$\z^!U:ܵN'a[K^LM1QYùYo8X/]ia"6ʑa# C0,lLY|~)Y4j:NzS( +u9.VQ?X*=/4 1" *r~=<vTj)`GGvE,.9PJca5ӝ%[  UX Тlsts5*6:1F{"q1yHk[FayL/+G3A LWe;/1uJ^JxLЫ2 P-Q8$-* A`1C4,jQgPU݄wMx丫Guå/ )!O3M=m5ݺM%5Fvn9l=*,dw@a,_ xRi$VLlq~2`]Ip%7kcWPƆҗDT~syn< MfGM,)ucw >y ihܟD{d|uX]&솑<ǥNfØ/!=,JdW#N??ۖB414Uc~W;f1V+a,$[$|AC uĬ׺w7;MKk4v$rL2ӺIVyarnH^l@XQ{$1^nD@qBw5w x? F<8M?6r'̺,jP͚9%Ƥjy-ߦ<dkDzmVl \Qn3 _ʎ\V7Zf_;"Ɋ_CyA &ON%/?6P9idcḇv"31R9aQ$ϴ1E+䴫s% 3pOuU3pZȚ1;l}0^\gەAψ_>3Gqeת(Lv^.G3CcF^;|HR{AL^Iǔ+$%rX`]VjWpcWEWh "뢙Dž! !sa?tϙ ϱr5Cʣ Pt2:!amKf>T0 \ljp]L&n"F#z/\ HX*laRSR'neyeg.(.ot1 V"J6H9'IRAY/D[tiklowq .6hkebyV)226w-_MvM%dhW)PCidrMCł,krSgGd jhHэe[}AiJeuK@3A㼮zQkN]|6jF͠I# 2}[9Fˆ5E/LYnD0ZA&372iz󪛒oeDh^8e7/+H42#9DePFr+6¦@ӹ+Y@>&^Ǿ5XEf$BL!gmߤ! Zˆh` a|ߔa{D쓆y(^˺+(Y { :\8ɀܱ8H|.r)E)\6mAۛ\ M%2ڂ*B2R#횺q-F] B]$5 `ȡ♃S$=D]'dNedɩPDwd5eUPI-CV$qQ57…*¦yJa{8睁CM1 ,56ezJUTOHƸw)WP|OD%6f~Xk{TK|7)b{쥇K{+f9oOѴA |)W1dnd1L'OJ&⃼r$ǼWZ* 0 (U)UmY;ZP"c]Nl.pK&{/h.sYȾnKg~lٙԮyߤ<O8lV{""]ɐ k1`stK4n:.0~5$-ˢ:íǁκ]R_x \fFXɽ0cy9h<8a:ʟ_rH%$,Rޔ@ڰlNk74^QEBRKG[}W)}$(lӫ5jꙏHCWG~}zT^*5\+1 ~JbH~FHxK_ܰk؊g)yejs,ٝ+ % W9*g3i3b1e0/ <ϣħ+'G#X!9Qqѕ>ٝ1QȤ10VxXU$u)\k߆b \VH]pc ԂE\K&[6aW ط`-0 $v7D>6%.p%k"eή/RP 3w¯%F9:m-qGq [7\E.: EA,4f ]Y`]N ޘKwCEA\{)4C?Ҍǹ%geo]"xm9[uOW( $9ڜ|;\^5?ᷓ q4Z IbL[ukx]fnaex]l[H7؁X?ž /_ $rAmI4/NҼ%mf5>‚n@s5Ұa eB=~8/cꥈKUëᒅLcmTu=lfhbeJM Cc瑷wZ )bƧ*1/p| QZN4KdCP`>D(Z؆bjn3UFn<wƐsCd2ۡEY?C:$uϕ.c&VtM\^a_%*ɐye3`8 ehɝ:'@A0D:J9) fN1aXx﷬ BlXJE#r=35S00Sg?TG=VҐv<(06].;{!lX`ipW. #0/8|Qjp벫?m 6c=Hftm!2|Ǵ` 0!6ؘfK >*.|a\%(-&f @P,s TtH-wҌѢŔ~iQ4,AfEt .60 9"N )TcgZybhD.3]~HZR'$aEāZ5P~U>G T53$ 6b7S}+Hɔ4W6Hn)R(N(hg1l%ɅtlGcD$7>Pdg~eݜKYEƇIb9Qy]K#7eSΗ%w2ȡmENOjYVxd0JFoO b[߲1oxMZMuꖸkI(HpYS+ʃI2%|1"tܾanVw(M{["T? ޒt*rA, EߋԾC)b_dŌLC0Dlƅ{ 8x4b 0Zmy0sBM+G5#o;Wf%9rK)a g!cА{)ǁ TTbn$P%`ˇI.55v QT,km-:apx޶.8nUؒ\Y ,*VpyibqKv.K]icΐ}r8 =𢌙eRF/Do%a6ipD<{z,H|E#U3p 6c\T[Eo36Gִ (gzpFP7 _!7dCxsՑF;XCt5Mr*E h)`?d1eWv`iHr4%scduL L ʄia\4Jq VV4n>o?H6el{=icgգfNpSJ>S0=E{wB#|Rw2dq.P ~>RM&fXSg2:91my-{q!= ۧ"="F+#(^?Θ5]C]uUȷY<{idK]3*Lz࿴_:f6 fMa~̀Иx,pUI٣d5=>?A>AFP˽WfuJ^9Ԝq@ڳ ZXx jP 5GȆЖ3PiZ6r,c;dx:J7E V󰆖 yT`B4#d?jjjETrɶm1k%iYe[XŬ 5UQPCӻAABS52X`{=͓_彄G[K8@6m$^)_\4kSVMco̘_rmNفEz|kӼH׿@@Xh3;&N)!BBZZO~ϫsE4ip1LӘM'LcC\:ny49x_g43EHdk+o呎!`|Z.qL-ʍ(7ǰfC׻F=7lh j>iӸD4viC=IpTw +:kEzqOwy͠0wZ_qjt|-ԲTMV%[ƾ}E{Xo#jλGgwy~u}!QA ]t!),IZ*&?RY&zI1ԧz 8dEj{7g \5s7 ^c ո%}kTyeO. nOt ]!( { P[sуaN ]$fZN%eW6Q(r]v,Y5>DLuEr/`ٶkGrnW\o YE@=Fz`ldf8o5=/HOB-?FbV^``k|qiAYeBKmOED]=Zݥ烋%8SAbvqgp wttlM3v  U -ʬU"fI`-]:D&,ws{d!ӄf" ziɶ$OB*sFvº6 JV߃Τ2!\֌Զf@!AӋȽI0D L3ٰkHq[j07GwiZ)6(&[X62k:ե@1issr!: &-eFl ՃH"ktP2b;nuOn"QgH$wܬ|.Tt&\ eo?=%ݜ*>(yu42Kk.;M'D̍n۪4i3$276aY;jM !w>-~U;(2ckH.?`=!۝* kr |w kP~ n <_[I"$`pQZ.I\Jmz]?=AjnQEF;t- 2޷p46O1|%K_h=6_C8DR.Xg=+w+6 :R|Tj#hna ;NE#/ f34W:ЃƁNY%e檠hmwdw3]$7XLJ^d,#{7i ꬴ׀hEIǐϤP`?{k:/>Zdb2L8 [T*˷^9/cOKGb1GX'{e*P+.6rDXqLh*GMK I.oEx%oTt!izQŹ @ XWhD [X#*)|̦Oyփ$;E׬Ƚ- _1W|a4B:bdUjL;)+j.h C#'9U(LhճFy_zoq;Wngm$F(rz,瓳l%$CDվB֏U;?ד61ru5V<6&]^ ;W 3mnbǯ1$pb&pʔsF*ѮVK=f@q띋9 mjً.O8_;ˆiY1ێn*m/M_8SjgjT :mF8xX#"+֭2`97ݪuW[詾9p$ ;VLL ub~XFg{Y]b!rcℴg,vgMǽu;0aVb .he/%nL<4{P AphJ1LIKI:qe.u;~G*"m LtplFQcy|)y}mF!QTy9"΄dդxÜyT<;]ɭQ|9l&krׇJ0xo&aS:X xyv)K4-q>bjB\1~&Q1t?]:tP#ғ!շH3$e<DޣheEJ3`4Q cPlJ}v|z0Q<ɞfc5,D]y ,+߀%iyQf/0溭Rg>-IU$!\@WY&LIhyCo(㋎7opp ЌLP+VQ7ja坰=D`!2GʰyN{7MI[a jKV+zDJoنŴ~hŘHQ\A&´iJH5mұ6_l6Fq޷je\y iX=iK<\P-P$rJi)w;Jw}98_/vc*ߘXs, ĩ]ukB֠)%]!5lXq ӠUejKr" 6b:O)J -4K}!#ANfԁE7zDIVGYe(cj90ݼ}HU]ZfLʄTP)rTނ;wy 657FD[YhPݥ4R)ĭ9KJVw3Sc#K,TXB$D-YJM/Gon166'7 :61U:՗m捧FV/#1~+!ʥхrujN9ېlX<?7VTv?$ӷar1FU{ߋ1.gnh6iSz%}8l{%V1i~!av;YR /D)exeOn`!9RD䯦!0OrXf{6DZ-\n@*H56])7':SHh'pZnoҔ8n=^W 8c/?RʑǼ*ùKL8/e v8ŊR= ,xXG ?qkbz3qTc檀YW,1;~նJ4x9&yI}Sd+t^\?׮{cފ{7; 0OSqӹjpP"ue6f( .xd1^ɎSMJ/k2e*#lh^fis"oleWMT? ߏ%IWPn} @  @@  @@  @@  @@  @@  @@  @@  @h-1`$_P]fqƮ=Fm1QT^,f/;bE!k3&1 fXf^*2F3ghwwo{ m KkR_.g]:h]kּNcm^..]& X3Ai#Q%i?{/ˮ ,`EeZwF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA      /1,t DAp`0 m8v>n$kF%` ;LMAl^1MY '@ o*5@t] ́Do49 @~ 2U >` uxp`xM)mj(  `(*`^dUqFx ];,3 0X/=5Q a p.  ('= V7L.`p)1!8ώGik>cػ$^$ïyLx5QGBb>}DunDګd,X&&KGV?/v"N"9.{wظv,8s-Ǎ4鎑-f/CvȦ%#+*|6}%<+ѣeƺ_Ajs}c<Qԙ~ o F <75gȚΘ1Ό.xҳW ~&3zB|?? zrgCi.Bh#b_Ft~M4mrXn nD n n nDn n nD nao6z n n nD%MÆ;>9C MC |lF$ψg0 capt0suVhFO k_?Mw7Oo#0DE$C&Bs_ϢZO$Jn:&(?<_8> iJȩ17npMAU7 w++WWj[oT9wצtNңUC:} O(W@anFNj9p&ZGP[}A@5w#L鍂jmŮISUo7OZ*bEW+An RCby&g*U%)Ǩ9 J-Rr Zp{IZb;\9I";S_ctBU6'稷bG:؍QU(V֢Vg~g:2 P i:S$)x_O&|"3=!Q|J(;mF'3y ]+kff ՙW}@j lý9$d̮ Tr0}^ab IQ0N3yP"WʖoO{>A/vRsIZl+ Qi.Rid; 59I2R%h+p̟?"6o7nG"ufΚPSưΔ0Zo%(g4!S&pH"^*-.UvyTx+=n;Q4e*ɤx-CzaY 6)\xZ+K%N@w~*5{f78vc04`Fi Fi;ժnjR[.i83S%巶2hF)n}v/o6Vה{_*Ydթ._,'ю3z:"%ka0Ete\(SU:^v~T@k&:?͊o:VNBG:^՞oeN>h&jӷ]X i Qs.;]]7:H.X&^)ZQsK#Rj_901%ͽxc N< JXt_-8A~pRh0Ҝ+Dr󠑵۳c "2o&M> n6i!kofxdsEzu=ͣ*K"ѫ˪u0ho" 3ى%%"!ẬƩ|/L`9Z+`&Wи'xkBv1Ca3"xdYA_bpD1E.j_cwg<@ݶ)8n?F>;r45 'Ab|Pgph@dAjݍ$$wq'nUplh\3 H䐺o|iVO{)NqT[qBZ_aޗʳ~q 9L7  ;pgMqgtk@75d!yjy\1u#,qsJwLA(`& TCI ĩ ? m2&\GuTJ43ѯT!^/[sM^SMS>ΦjorY̕"D<^q&siLj>>I4j}Y' _3U2 tNu* Gx$4LLEm S6FZ PT(/)<4GchZSj] KIe6_T[K`eN*W%,Ѻ-eC3n 4a5]3R#,8͝09 _)vK\<9ssu_nq)*Wfm1St^Q'_G4cB28X$JȝJJ5S P/?|2i C'ʯ+dXC_cmi:`߱aCmEqa)7Cж=(Hs+C)``[?4N*(2b;uWtŲR*'vѢ lKɶ@bnC5{ٌm)Ҿ;9qE=gakC-BA]VJVeS|!o@\jra#e\ތ`R}π뮴9 W5 Ͽsl[դ V5G8E$|7 1Jx'zSmYruW-Cktas!+ JEuB[%>!Zy(b/=}6W[vE'j(wɨdM룆cRͺ~dc_N_&Sj jlTa_ Nh|5qT.:veon9b_+^-;𙪯ޯnHpNdyQ&az^Us\.5g& vexT1V⇓0RmߦП[kmOd^0^ϲ,e<6Eˬ:"{& QҾy!4.FC\hqI '6?چ>;Alg'|r32aZ0(_1}WE 9})#>uIF݋d - 7޹nWq3ϳutY jڝW%˪oc߃%=ʃU@[=3z֢C]œqwJGIgT'#u6vFVhpmr\x<JưTƠΙ97ߜ´Γ θ+Y3YB|lHˬ[.jG±/=6j YbZNZ6@,5Ȱ)Gow!Ji_svj&_Bbk &C4!5ZZ5(꽏㷵aw{DVtf,㖓q'zJԫVw-ee{O[:bPOR=[q9w_aNovz#㕐ILݵ9_3pA0TgjQs*ƴd]0B". }L&},ruMa r nZ ذi7[.?M2ܼ*%HLF2 iar_':Ae*:VӅ[ףp.H{I=vsEnw\9旳ho0v,j1j3a2OfZnԡ.LhXo7: +q;!z#w۩M꺜e5jꢒbykK/'x:KVM"'(Z`PIr.e,%h\q"Ҩ 8tQDQhbjJrMŒH_Hʒ.hFFUDXX:J"+j􈖨iye`Ŷ#*֪ݣ,4[Q"dCW47ʼn#(`"Q*/qJРYI1|bg6"9{˞%[$H^af|/4Wkgh1.I2TqZhfرl"`&DvL;6|qI$I>=~ɴ1$ږg׳ifu&zbj9)n勱h^/U[N} r󵇊"Ѥ3xUT\}Q*̻pSxx>Ѥ׷?ɒ9 \lHQ²21_E bяxSS~eLh6Wy j+~X{{>/OH޺>S*#Dw9fv%-]Yfa$['IllًEEVyc \>⭛10#{R5Pm')FYuZb΋B=#(ɔt SEd SCWk,k\ګ}M00fd#ƭq&y&oF͠po>Iz~ ًƍ,7pvw z5~!O$xh=S&?Ug$gߵ6ݎWv3J߮<"̹=*kOZٜ졅UdDGc`OQDJA;t"ۑ+TL}+G3)#גE~9&zĶ'\"pv5oͻ0/7xH&h&2^eaV3=ڿ֮\gR-c`hl;Ѳghcװ߫r`Sa_ֳY'lΚUrM{r,Yr=dBWޤtIϢ0FEo9e)zUt/J1Y'R9ޜ4Tʓ:,lZor *cE#/MWǦקlU6zѥU-I"_Fi&[FX_p5Dgo8*}qzɩEO_7_ ɻ3GNuj.Wt7My,%흑ZTN,RWX'+}JH5en8XQpb=e38%*,Wذ|cA05ρd{uTa}Ƭ<Ȯ$?ޯc$oSޮTEHcn*鋐$BOϫL %7QSgU,d}'kߠE75ӡyŎ!q}W}J{jz_, JʛvZqzN S?m$usEu|~#$VWY1v0[O?-E牁Ũ?8JWM7_{(p>VBCN\_6(4pJµI#AY_Z (B"g֟9PO {I-_c!{)Xuk%}4 xX5i?7S+DߤJCT h]~ 9LJq%ۉK%yh_:k5D@0!mloQؽΑ#6\9tvbH(*u)3!{Ī.:ZN]HP >ϔ߷~aКCu1;~hdw=5 a26ҵbEv-zǀxOYMfdc-ީjk%=C-KNEswH>%6%eFmLA|i2<K71vŪ2rasŔ۬='˽fF+| NßM8rti9ЁXCR<_U 8\)m%;(i^2~ő|huZ@E-kg^ɢw(s/x>ɑ^m . y=>lо- &]σvƌAP\q?1M-cjX2+8đCd3ߐU7jK)ā ԯףj@c^&OZ~ (D:oRT%^cLP@_b!zZX]3i, fS/Eeފb gസn(մ%tx0NU:§FoE͟J"þ}{`>ZsH3x(o(_w) :%[ )oA*O$͙""lC;fۅ-,[c6-/"?bLGyXR,Xtn]eUKi{!Ȩ$w2\F+#}D**d}jEkޑNkx HljXW,_3f>M]u^SU'B MCzUG< Gb)!nT| Ҫm%t\b`isѪ\^l㮘ti؊,$a?166x*.&[[ = aC<8Ε[n͆0şWt,M&jӓ=q1iލ̜=~$4n *%>_%Jv^b94dKOu+Tl ww}PtUb<~YoBa/ ChGU]EEZc6C@( *Cw8 W 0{u:="[~Yb7 Co}Z( ; ɘs67 hL#mcVbHؒuFt{p9 sgAQqoo\8w{W?upCȟxs[`2[ #,ȼk@IT!dOncBoݵ4'Q:`Aս%Q'|CmY_M.%$]s C[;L2kiͦXKi FW[LXc36( mkb2.8i\Ȓb3aB.' 4[`/ [`m&X3\ X ]At yڰtFUxr:Fu =(*I@Y<UG_%Y _ÖDhʗ_(blG }IK`5Gk?Rq_Ӕyis %c^P'?v o€2pݨE^j@JͶJV_;BV/WdEZi 5LU=Fy(M~H2]|:!8Ikvς2YO<6t\ bqȬҺncrhI㩴 qfoN}sfs.pә C̈#O=C0zH"ca0f vd84+;J;Y?o: J "mp|%NM`[niJ s#{0._E 9:gwɹEbEu.,6X(0E*/CPFT$UYy1Լȇ[v'R-QsCq8ӂcKs_#PG`DdŐ#-Lޤp,9/"μL*9|譄7̄Ӣ֌ӫ H}Zi"~R@j?q;xRumm&!OviR+Z~B*JTf_CʕDϣc嬯 4H^hK B3 ~aӡl÷OHB- =1י=X E'3S $d~/1+MF0E%{Sl AB1ٟeR4@#Uk]qa <'(u 78;`*m\b^~HR=Lb/#4-83#|&ejAٝ:ca^Je2jBpQ*}4MR9mOb) !\Hʙѷs\*y#qޖpn;.ɴxZ@ T?벚kw0_xL&I+ߩJu̎'*:vZ҆7$,MQkWFfTvU\ Zvr+=ϓ4xOVP:$$ T9Bxq (VCTNO QɥaP%8#*ݧ*3"FD5wտ &9T/8Z#^K}E&Un'OKD;Z<}gD5+4 a KM=;Y$cªJTUO\p`!dϻ`U SU!kF="OvQRy~b=0Tl83M#WRlr.3!ŤBF >XRW(?JUsN.7--Mb(ވir@ݎZSf<.7='8{P!-8֋W S#:^|bx;{ve=%>kQrp7&P=Ԭ+f{. KCFw0ɱXݩy1m <'< .bONHd}xo҇.6sO3W" g; A"3*Y`0xRv0=:sGSɱC L@G -L#RsiV0a Mz饋疡MH})yO^X}~dL:ށJC8DUo~J CT~UzXEO޶3ph]sػn Bەc^RmU't/@W&Fe‹m D3|94 ]J'2,&!סeL[i:Yvv5Ķ.})4L H8%ӕªq \3>>1 ?4DtɮKyӑ{R N`4-ښ,Zm?Z`JT"u;9K(EqcKpL+Y;quzbJm Tc⯺SS lc݋{\?W);M8k+΄9y1Գʂc*\|WwH?{\~2ku6ߴ&`-ٟDfo8nKă=*Arxַ̺@-(AntrϧO~Ñ 6R2]XS0Y;W5S7@()<#R,G+յ=z>* ֶ PdžqVWQ0a H:v*k#?>ěp|q~gqqۍ7/C Zc״1Im{"U0"Hލ\He*Tbѡ%T}pȵ/ȇjr&V1s?fR n*sm\+1?شR)RN},hf'^.A&@ټ`UyKP_q0KSv [ܤo٭&4,^Ns/f 8w&\^Kcw5qZ^JU{DJ"ep F$j^&=DC4]L*dBZ DF{L}"?[mۡ/rp-ÎJ] 2UOAP#_VaHWUB!jqqPwDR1BT.W($yK:UȐX=u5/ߗ;a|:.kYVRۏ\FdmxdyYm/R]X.Y/#lXbm{4f؀`1+*"}՜9H\5CA඲^Z)K%cg߁߭ҧm5G pK]'ӫ j3'TExo?z=2sc3um >\}tJ.YïFӶ-CJ(4W?~( o1^gRiF N5,MC5G%Ԡ6#Tn =͂~]8VXDž#L7[LT%@?FQX ͺ'D4–[rZaJ^Zp'e&|*SeK7n6B۵3. 3j+v{ĤG>7q[L84p#ySц2YN=3GaA=k]0>݁tJR}{T-}٭o IQU_@Rh/iF`AAR1A .^uO(A tyurʡӎxZQN$]\ȏ:f|-Hu1=N2K |I4;$f#P/*O,w>r !9vcE'q{ӁJGARp[&GWGͯAĩ%ZzOzD xnn$apqЉe7L>a+᷇4*Y77> ;4WTM 1J՘@k7/3۝ϼCӛG>0CSdž .wdu ؊:/чvYB檁a!ڗܝ:X%8] zkvP})R0:4²h,wMu;ּ"Hkz' ,껦"4=1E0g0Q+Zwإ{$k/;ii],1g~T y -CeFWpRh{(TKɋVH(J{xٴzVR|҈]4Cf.D혁t$Sܚ쭞eVk h'ub-v7.q"@7U<"+Lh᷼_}Jǭ5eV5~ro<,1 9㶶T#4 %L}(HˮJfM"&S'9X֯+</ Z:2B衩\^B5BYrJ7]:KnEuT5(|:z~c@a#Jao$ Zzնlrgca@,3R=:ah1 bWE_z%6VҞsxU]d3_ ao*,с5.>v`ϮC/YWWxûms ؝Vk ;iqU#9Z|V9Pѷ蜚ةW9ɉlg嬩]~mGwU^kȯ=nQW-c>ȪoGZ˾et󞬷ԖN?#Kx=uZW@PD]OQR̽QPs-VݐK@g/g%!m;wiK$M+wlRj?sq4W^ ӑr5@BoѪ0@M۝a/϶]%>VF2w`6L(ZiƶX^DE}d'U+C.!ն[j1Ę=e5cE{iIkFަwcj?l=#K " :&s%| |ծxA>EW'|t!ጜ,nz_(p+=ٿ>|\ݿӦ$׻FХY{u埭s7_E^]8 ?yw}ɃLH*tdp"սye#IS,ю\a4aɓoױ"Pc\EoGXT\Yo|Fys2sjv buj׵ɘb<]bG=_owzIӅ0<WEOWQs{Wܣ1c1>Zʎ_pjĨ8~*;%T|waxmsEڦ܌j.3ͿXYН)I+z\_}x3݇V5*ۊa6Ly }pTꚴ= .iatDZ _Һt:t w>5_'uPQW<_`o.a^%A0?a:SoM};NjTS- s.6Vrh`{SBVQZ]XVYnG\ H\+rٽ- ћi+tCl@&4Ҟ=pCcȾ^_?ù ,L'u::Uvh"AÜW]Dpz vJT٬ED2Ų qskQ8Żk3/ޅfL6ɕ:V5{m^Wϊ~%j,?{-Fz%WtU0"h@I [X@ EZ;rsk5ݍ[q+w Cƚ~y-uMUE%J.(av #xJ]\)lԒqLw}QoYnjft Bix%y,"OvդV6=&ڨbOQg^юX}I>i7EW{+ oBt ɫ$jlD,I6*`7[!2 Y[ nj'ȘT>z*5n'F]v8؇ޜ;Rm34n㷚.*e[I&UDFvn' W+!m&)R)tLڼPG (wӅu?κ.3$QÇI{@^nCV9֫ūRê-bI~Z\.>)E%bpu&t-$aPh[Dw eЉ[8aSq;s7+6˲L=aBsUV9 WMgXv<5ZQa[nii]cx8P9̬3pטZ }qcpS@ R:U3e˓h%*dUxw3_6'+˜rVe_GOƻ rV]\t̾zxV^M$5^rWS܉SɞKU*d#xWa <^^_cJ"zwT%ׁv/"Y$_iW˽>,4؅t!;6$k[hs]55fV9< jܤR΃YeoK52[1,YI|/_ Dam;dw$$!!~&s:z,.x1rx3`A{}ھmӞ`k0DOK2m? qOb=&fLil7sB5OpywAjs g>$ӕ?v30XCcIad83r,MqK^ =/$sbi0.ib0Mlj^kbu͠Lh=mG.UȚՅ f1`B#$ 4gT0vQd/:j Vѻ-щݻj~ԋ{Iَ?6,zl\S`lR,xT";/ɉ6oJ||9OD Z g ݱ,W͹8ַ'VPi0..|+z9^5P!7/Zpcʥ<<bJ)bbB7IC*~Bnӽֵ>6 "DU01%N{_JiE-~;T=_X 9XHFQU [BEB sKR(#u % &cV5ۭx8˩=Ynq@Jpsf2oTƜ'^Uެ*@ SN .-rYMל)Le܌q!y}!: Y/y&DC-;qV$,gܰ:xdaPzjT~`8e/i{$d*vEW4 51N/32o0Ҙq5J$ ,T^dzP!5Oz,ta);ύP.2rJporo!cdR;nB``IJ:ȭؓh2:Zf>^$T.!LГZ" _gz{"Gފ&4y?26p52JƼ/6X2LnFL6Hhc,֏5!'@Y#3 9^Uz]3NDn$,TٙC% M~+` lp@ ,XR>Mgvư.AѦX@i^C{)u7H1D\`AB(_#\~*;Ptc뎎{7$˕\*S5hFC֞Sa߰>JOжIE;".s\EZ1prK߆wg"ܴfy w T&-54¢tq3oλ !H*=Gu(v}v}w?V==;R v7Q9̠& b5m ʀ!t0ڢ5y0H ;k?:: aF!x%O,_W>Y>2\VB9WF:s,jC:Eנt-`siE$*ebzccV|&w rBajpC Z.2rffTٱ=~?d Ϲ{sBǯ}BZ6ZV3LɦtZ1[Tޟh3ddXz5EVO((5V(h=ks˔.aT `#OO_5XۭP>Hx볔U ي!ͭf\Eos{c~qmjPDE_eifbVt%ŽԱݲ"*3H7;ʓu!:s+n#?ҩ>۠<~QٙFjB(7Ixw,4,3 ݼ`Mmk _Zۗnᶛ?G/su߲m "'=V1 ui19Wa,DByDzwDϣbnS^#^5rE'~[Dh$ ڬW>7[:orپ&'پ)# ~~Af5eկS"P%~"\ :#~ڵH%_6 5tU1_.]Twy{p=_7u"l=U喝̿XQ|\b?쯐TЬkkVlQ=+5on4|J]ZBG_i=,l_YcZo|.T.I/v>#z*jg~6n:qK 'U:z 67;1F~r99R|y@٨EXm>cexXS_S?Y{th˦ '3_(XT}>ҧי+Q>t4as=?KarՑR_cѯ?1t"=+mg|(.Z425 ) 6ج &manjiެj$hR=#^xJ#ks6wܗ@>= ;3Cim{aTl}i4RcWC@uAc}=RHg-h>T p+@=Vv m/<9'_!TxU:ѵmleZ6'x 4+;nP[MP"h4& q`?Tq~Η_Q)NDjR"_d:ɟTP(;p;]sYuC !CI0򩎦TuAvGl"=u  ;T"PQEi'V|@[ nQ+J+-|C+mK^+-CP#"4mPE:ġʏ }]2(LZea֥tl#I:zof!>;w@PB0;Y֡>גvr,%QH)Dg4 :Z(S&CqW|0ɎS'?؟kΤn~7~,gb/1Fo7GW4/⾋;./|:e1~9PkZS=a[@q~-gZܩ ߨ "Gsg4"/_h+Æ}bk [uW#L* bg}[c$0aJeu{2KЬ!&362SO~L_,~RQ8hg7o3fsB>!#Je ,^u[/qAi9_Ь*F?p&7C]fۋP K1͡XR_%eqE մvj%$-ytA/hav]!) )oDZ:mw;]Mn/>Tb{O] 3HԘB~sAyLPv`T$0}w#Xb"Z: *ُs59|DL7|;Ј)_]T5د&Oә -G$|" a'B!JGn wΊ@ IOXX,Z6$" ^Dh?r6UEQ|1\ ˗f6kez=/3\w(;jSC%İ呴:ۉ&hZ z 1)]p#5Zu,dݯ.q}a(ߤ;ң..`HT qFYpc(5I.]Iijfz5#P՚OHu?o&4L+@5s`?q/B]J~z6b"; CbhP,%ͩ?)I%9zkTSyc(?|ŀu~>LC/64 nH}DhWK%;|(GZ5BqcEq ͭ[gy-B8d ;$SN[^MG i/ n`M,1MЍfb$ Y 9°2"2 IB ܊0z񢂭`g60jtsϽO/0y/Pulֹy9r#(>6R2TFڭe~NRI&"/ⷌ{W5-:Ǟlz$,p4L Sv^;}>[آWi_:odJg&lؿ^V􅧹 : clJAO@2Y>P$ ]nYs4~ޡ=Uu Xݥ@/h"wɱbekVV~rt܉_v#ki |a5էN+H\꼶eeucf_1S, U*Cn cm-_U8Q{@pISAah?L>gCI| M"aɗp/I.h~U ^tdg$ȡbEate0J d*$EE6.Tp!8F]|98UƼX- D5'ˏpt FWrBx*4IFɫo\OSsD0&`u2]p8lhf]p. (TWyۉvSK.(8I43ޱUh8}3%[$=k'Nu]<@Fk&xg}\ ᦬1U nc./+r!/M8U5T&| Y8MB$[DEjyā1/ ٯ0h%8͒csU^ $]ebY 7w^򈚊8JUi+N5{6 3^"4i~R`#36qχQcX| !ԣКz2N}:b5;̴;K/A<ZɚCe@J_`7uUܤ0g=y(|arCbe%ռك%e_DAI(v7g˰/$Kh 8Y%Wإ9rwNlSFBt8MqHS9aߏFԟQ`WAznFh M\ee'M'<{T ٙgvn46>.'N2fCfzNz93tZFq/Hp\:A!yBgp‘s I{XKdm5J9a(6BG$RVy co{n7G͡>+B㎸$EC UX[Yj`}?bSKCޚ+NƎ,P8'8F;zM=~IX~ = 3VTQ&_uo-l(Vy:Bnu+`}v_k< @/y?ҙ..PDGը[ U|%8lw *"Fx_3߈\7:L1ulܕɲ]z>}UĈ*rĀakZH`0[@UȆ5`UVCk>3*U(,9NV/ 5yRU2uWBQeF[K9OX'ɟQ5ơ)Ԭ +h>ɋťN 5b 2h2X毵3CIO|S,x lG7a"f :ƨ! eA%pzgQ|59LR(K$Z G8b7MWg2FW-«X6<Ě5^)@+vڍ;}ke\&Yc4Dc?BYI7dA0J.Z#I?D}r2C԰_dz*R!:_%*G-$ &=(\; ã5; ?uņ3U+?AR3?vϲCRP?@/BTvThrG,iÅhs{e':Q(I껨E @~O*DhЏof~EHWZ|.@krtHH?~ ?EU*pE *TT#/Qj$?EnxO:p~Xy'@u :K) v@NZ$4QJ  CBY͙_ش{zEHpF(^ZԋFl O75!BG|@?} zOur7+BM;l*HZcRQ~>ɆDzkgꄽ`6קr`p>d7lJ*>ԡ;\)?ț y4W/z рҚ!RS#V&Y3#R,u<>o>)ٮϚȢ%uBC!oByHH{ AD):aYhV4O.MAY=Hz [)vf *ݱmnو 1Jؼ(e+kDH_xŽWe~OQ.[K;!CSK/\7kxM꾕g|j k5ZI?i"Ql~(m PL!]ڼ3[? '(|5-='2~Tj=/U{?]B GU\؍TotojMŝd#"u->ByDVzBUpDsuű:4lupz@ptD"p=`zNVu:[ր(ْ#O^fIgu֣M ct0Gj ( kTY%j>s3W;lt^2WJ !Z&ԑ_m)\bH#zIBxOT.fl.Q.xi|姩vɩ[-#:!LYK!m:.!2jpk΄3W46uM3v^ @A>J<сL_hQwNI?s%|(&nyt#pK@k⑀pz\z%Ƈ輈wDED37RڇPnxHnuYTq^CQ\H@0V@%,JUa! NoL)qq!"@\9y(fdv;.V(Er mFzI-e@r"y@$@1l@l7Ϗ 0 0LBd@yǎNgV$LMPWiKg>ƊZ >lw@;B'0p " 6=MРm2 90+pk.[Q=È*uu0Us5BDuitR7 ۠cf!'kY`b |ȕleUCҭ1hTI]$wB?|$mٖyM4z1 b{B`(=@&I5{."dER Kd\_a*2ZPQnUK3}B Yl";.ΏHuA }L M.zp~*6NY\C[%Ѷ`$ՑkY[8jj`W, ,U޿+1`uۗrU=fegFB> 9p9 <@C| pp'|-{S%HQ/Ȕ(wݼ[BAytٻ yxO? Pe|uZn^a\p`Jk<&;=4ĀiPfuE9­Uq+q%k|;ГLViVOTVG3.cG!~ t2JMaIB$ʎMA߄'D'*W@ FRw6ŞIJF^ygڐ{COZIrn7x" O3vSqh>y| )5TQu \z R>>]8Yؖӕ{ve"fP&~KvY4BD"@K=vv=.F%S^Og.wjgW kJ yz҈++a?P̀unV'+ g-=텇_F,๙JrW( [%M@Ф_]E9NE4wZKG Sj٩)L\#ܕ!KB /z5$gQU$N9KSbžbË4{fҒY RJs$%rT-##ѿ: gg'~u&& "BMG;7qN/E H˨G8~XrTTw4&bt=lCrFvEo?h1Vb!1 -\Xp9Hz41%<!_iZ;iTM)V> 5'[ι7"rju̅F KQ9A%IX nUrס߆o&%½rǁ V=Zۦgc{,s ~^^tLM670veڄZ*ܼ"*,bS0fV҄l/[I #&9Ciޢ3.A0j@9ЖQc+b9P-ibQ4Z ]y,2IH;P(m@e8 朒l0*zN3Cewgx n ({UA&͕M#QG8!ojU IQǹ1=BR<,s2Zwl`w\%D,;;)8){2>ò;QW(1@񷜆Hz7]NDuWdpQrhq̃osllU@rTh{b&YrG8PV!,Ș"@|(! 9 ʀ!̓)jcæ dk(p`5#ϿEGCV5c5cL#)圀$^n2PuRZmB@\INLՌ lh&i40R{@S@QHaN|2TVpZnHU,9=QyYb >?6BvHh{b088305Xr`s+e-axe4;FzeA\d]Ž]>tAx }jyu$gTo$ZSQn\p' |I0ίe ^bUy6VMHL5t9̪L`GF:plclQ..1 Oal` ĥ|(sEY;TsnC=nLǗFX( UJIsL>YI _}hw>ZGx"NBE'} aڋhߊf.Mt)s+tTj#TW.& T l~Z<®I2n9Kd9|EYόf q5t"0mO}~-*՜"&ݙobT .WntPiXhzϝO- ճQT=;sW-X'zO @9z{A RAHeR4hT?cV@Wz]m{3XV\ RB)}_+ 4_WhՇzN.y`7pQ/&)a f۵&QptL ?2ZTn)Vvz2 .㎽vUoƭȆXCi@0p{QƇ.4 գ n̸v8u"&sa`M f;W 7Ẑ<ZY#BrNL@Qyuub`nd7Gr}EdO,&RYP+t;QTp 'UxC?O@CoGJ۔c54#1h Oh^(@bgG!Pk`q;T tv 'ocU,7,5 ucZ>ʎz 38󁑣TC'i[C&Rė)UbZ:,qgY&P, &^)Ko0eҗڀ1Szd ^]0ސ2Č3p w Ŋ kC:AkC ƹsb{% o DT'3,-:RWkؠ4]g ?udV/?j6Xab`/*C:_W3NHy+Ȳn}ysys UOǁ v,iB46m \u-Cɫw M4*pDW+cw s^c@d{ JҝTL+;R[ְ R'iM$2sdq2'(ǍIfPYut9Ȟ<$ 9'" r*zL=*)axzb *Q諪H.Yc4x[?z[ LJ@CЧSv#W.#J2֕5Aa"N99uLq[rOx/%ܖ{YO0_i^s^ Q!,ak|A,sAtF5\ջj&QK)+x],Zw]G=`*,ը@Ϩp޾9 `vq߿a;fz^2 Z\z8`1J6ÍKT֜(C T6+kvU`+ ln6*6;fTQ ݡ)~0ne%r|,2uLWɻoԫD|r H͗+"|xAְύT ?p7R3v |<Ҥ_rTz &3۵:szrvc`sR/P Ľm-Z6īJ}?M#iPsÅ^ P1%ƫƬ # `5s@6ʅ%vkti։UΖt; Q1sxUSHj$ w9 x 4 A-]N^<ϧ 4"GraׇTgm.( *|\HfvcYE3@oNCF Ѻ2QCڟA"Qо*I$@0`t8KO_@kGVZ70^mB`}6dΛ`R74ejF3W`qj|R53ђbGI9ֽ"˸.C}޶.V+y6tkRЎf7 Κ>Nkn8cMGˑh)ߒV]L}UgOLBEke3_cU5 ^ cO>GXf ixyL( cSck\;bi &a.]+z6ie@C(`;"ugn;fƫ ]ތՁ낟/? @I iJMMŸ,(O]qF%Bd 5RR֬U #`Sw:[7⏭l=I'ý~ǣ#Z>^/.߅)L:.ds!^Hyy~=(^ #'U#cg=zKp2}[vFݝC勉H]'Li$b8>Z`!tԲBM[.-r/җƥĒؖO(ec@ m袇.퉂ٰ^t(¦ý8)4'@^QAشz_}ƹWJuq,KndZEd*C{]`a$T%jt&V+lb`*Z>@gPQ7B ׸V'2w~}p󫩣lgKxʪ﯋55 Km 5iJS3ltCήR[$X/g4ZoȣeKo6~!,N >c'nYJ r#106@KhzQvLIx4eaz ns0dcb1{h.dqQK')';8-~of}.`A-3v_v_RBBPΞg[Vmy~O }W$\jd>xD@UPZu:fv$sՎ&&#KC ViVb"͓zp8PK2(̾?w4sOY*G 3=a~K3ٿ.Jr9 cwJ2ޱse&Xs/-ح<=m@A0gv@Lt6#Gki'vHA۳ C-JC|G >v-T! Xm $\~X JpF xI]Ͼ.p4@AAq箉łS!ՂQO&*RvU8"cm]%9,>nG¼LC99m  3> bdJ"5A~60X >i-գA- q1>(u#i <%^l16=H!$?$`V{ W`KÉŰ #RY5ƴB u[;yd“ZCNUP&X\}Qj\99 ʹ{t[L{ۅw堊T}wyNwQ棬]RvN{yPKh`9Zƕ"Ap@mX 8.?,9 ג6fh+VœXgh.12!Pv%'\^Ț wELnWBk9`͑Yq Ϥ'2.hםn!J̖~JH\Pǭ-e`W^S/%:>}Ǫ _. oN[A@EȗWŒܥ)%,Dll]3CAN%20>v1(*T)P>B9Jݰjܖ 6rp(̈́1d n0cU짗'&t\0Ckx3@ptv[{kdIח0hA_`Y-BBUXzLh4d ) VRJl3`<#|񌲀ћf96釔ǠЦ#S՘bqX/r&lQqډ&.ձa{𨔏0ˀPp\"t=Ȋ 5Po* 'wxm ]D t8lkk| U $0^XL/A`ߡ\$9mqnGܒ$hT.KqGU| YX_7N0aլj꼲~"X^ m1Hi*=GVj 2΀;jj5 3 }_YJͿTǐBqP-Y+Wx s._ܲ'X%; ޟ֮*h.(MVک+ M𐡖Xu4C, j Hbn24BSsO$D9YDqұ;2nLz;̳ͦ࿖W#ڋ|/Q8kXBX5q"56UsKpg'V׫+e8]/# jpp>x:NQ=Βq3EF- \;*?Ĵ08{hR_Xla67dc~qvFߺ#(ea&L5U>aIֈKJe냹T{x+[%Pa)lЁcadsjĝ6$ ,AYS{DpQYȾKbXrls#Ǫ(# S}9Kd:hqv!kY# Վ/[ 7sgb]L_憦0zR BEoH3^ΐ ҆,5v'ȫXF vÜ*%0k@9$+x\e< ?b,_mk^ְܵeLv!*^Bo˼dkeSaZ >"xp3+T?@,s]|u7QAzSxw}^Y% ~rmfo #vS|W~bZ {{#x9Ò"16 $D8cDJgJ0VrHe-;wۊ mdzP* l$?K.vl͜<4mvC]!^!&: JB?d#%7ީS9..{t\wH &8@5/٢#{Id%H \:Mോh=_ D_AGE2##J3Ηԕ?~m;F$#rlޚh4ĄaP_YиHVh(5}m\ƠI6n=>~r.~k5S7څuQAK]:ֺ j;lJ2$:xyЖ_Ɲkzzr9]Ac52,r(\MZTPҊ0KENIYXi,F\Jc&]aqmg~bPkD[4o)2tb oTsBSV 6d 8{2&;>|">%bּ*A=uUi}lJVU PV׳Ao e -;t AQ@7}lx<&MNO>B|LQ3}d6cVqf7`i# ~>(/0()S`p|ei>RGRyNJ@8oCc$u{ ~;C`QԎ!Vx#6vީ^vWdT0cCvY'z? 4sڡ`x(S.V^`z [Dx.r ON ӎD+j Yh1/w0;htXOJx[Shpe.$^>&NW9$u>[MOp>K?G pVKqovis s'9C?%xً4ey'XӻdY@GmbpPm|prCNw&ߪrCh@SCkNp$~/Cs1} ɹVYj|L2W:Ϭ._zʈM pNR'?=̿ܕ^ZхBuQ;~ڛiqwQvV~+|+x;˨KCNCFH!0\ߨ$596PͳZ[;m;2{[j?qXaoha,#|zk^D;l<'P|O@!]0' ; M=o >INBު ؞Tܳ 0$]xb +.r/z[O`"~|eY67&7CU+'} K8;ͨ!~kIsV"d>.XI}4l)q(|1f fWm;#waMa ؂ ܪ|Fy|r۪P'Egf]f, Z8R_Z tIEњ^Wvm[ "!7Y3ǝ](C6A5'OK-F.iVW^(Q h% ҟϹKWIKGNTmBq!$'ItClS \!X…&0ǤeXgm$;eq+@8W8}S_OhH$؜ 8d*ʔZk D*L=,7 vkJB^~_& LI+뵺Ll)&Sj(O@ZE-.ω;:q+DC Sx+WKN`P8?q%->W:kX<$-9n94Izֺ@re.$ϖqw\yeGBUFtS}}we%9yJT|䶳V Ķz{)%Z&,'|xNOB1>v1؟yxmZA%p֕dQ6ݷ(ʹ텧F<WUBYjy,%Wno퀍coy=o8A< YlY*}̅DY]wUu|O#q k% Ntxm":1؏n}d֜a"`qxKri5xtjh杜Abylv 496YnK.ɸNwQ9bˀטNpyN̶ C])ZILb }<Ŋ\ɘ⳷ia]9jz^wٝ` <, gZC)&3J{]f1o Qr}zWa$}ʔLtcYBfwۻ'cZGE>(Dy,ʹ놬Д@Ԑ/yif" uԋo,ڬqt9AP3l3E'fZণnl|CҴ3̳YsE#?}6P͹a,~X۸0+/ߗ%uGv*/qԘ`([-KRW%SP $8anjm<8BMs˹~0¬aY`po]@š|pA9c 吃 2:9Pr}u˃WWcREim~RP ):&TTr11`.RQ)Kke5f"6ͩQ9 ֶWm:MCb8 21?iRe`6ؓR54m<mKP()Z~Z<ARAHb!6`Wv!&%k)n__ݽ-Dه1*~QUw$szt6yQB.)Up ]kvmI ijVo;^@J M{4o'1uVWH!բu% wmŠdrR$@m> LC{="YLXƂBNT\M Aućr;i: B8v(Psz-̗d%o@Cǯn-K,M]3ն%A8_ɑRƟzhQob97<pQcߍʍcs7 )l+0*;9Ζ Z-gό81t)c"B~j@j/o#uuXZPmF?蔖2tVj@O/k 7ӶWS,P4}xh"þP:]ߺ0EF,Sm%]'w,as~>]C9wnPJ^ ːI]gі9P*<VWmvȄ$;d4ҋﮢP8'CuwTQػ6[A5DޅBI$P4x׆$v\ԙ$۲Z~ b;}Lj\X -!Q }/}?}a㪥D`ChZ4\nޞ8^r ЭOcNe1t[EPmńñ]6%0/lqqp7UjǏPp;7Z]n%d:cf. m`7| J?ìӼQZW6X]9pQ>.tI WXi0e"iI ]zS1-٦οJZeVT䅖X=r8+rykG!8.ϑU>ߊ䷣Q/br(^5.5C+v7}vaE0v,f ЯqW&!n^5ųCDY{Ǝ7>>j`-Ni30g]R#Ȇbճ Gd5%(אɈYKz(#M|V| +{SrVa`r@sfm#x=`Rm+ PNO, }Bɯ08V2{lWph%M8ܠU@;1]lz)^hu?9݈v IG0N9\0 imW2 Mg1-C0T4؋ +JtO/V+7@1 .m|rP ׳8f%a!^\`4ɱrIlM nrV>gr]b $+Zʩt?`LBbA7j;eg)b{OV 6ae#X2 _aeltz2sqOee nq~ò}CG^a_e݂C t{~:G!}\o`7>6B+ )0[^? $ru^La-U nwGI;{x3Q$ $36xܼk"A+M= Ydc!.d{ǿ1Ξ3/;vbQH -w-$L'gd$A,v#}8y =m55Wxҳp\ i{“ȹzW8 9t8Dk{OB527yR_ףР%?ށw7(CLJݼ>۰28( .[.9pp Ѣ1M .qsxr [q1*! ;#vL Q?_ի&^P!XAקT؉K<`iB0<#Ŏe`H!x({P7cqbY.9DW! +2J|ZY4Jxl{.nU!#݈ @6-^wJ`AKA::6 H( Kz%uj0]ä<##Ěm9%V 7  ݻ$ :2Km[@ ;=s @=7%ݮȠD*;u"c9.YI`lۨ k+_gF0i1*0i#}.$!'.7:_{# -O-ǟ98 uL ٹ~xo ZFl s*ѯH`=Տo~|ʥ.p" ^O0rxSTSGV0Eص?L GZ|M^#n.VZj.!e r[:@=jQ01gxuDaa)r.w'wȵ qޜH6Λ8x" ޛHME8,w0n;%)w, oѱ·}v.K6`s@tt7Pm"/[1oFj!{5yg_vS bC1jP 5f,809vdAl#)E~Eze;$g{]Ka[ZƁ0Vy@ҷ|=ͷO*Hs}4= L UN""X6 X$]âSY _L# BT0){s9QvY9Ī>FsM)ώrVbX*qX7ZddPZ@kue.g#Rq(FRGr`eGPϜ\}p|NJt-|PX:+ؤ.9I :A ]: S[F2mho5TVk9k-fcr(F(Ж?bcYV)H,u_-k@gs\ 14JHf^,&xfYQ&ŷ 5AOY+N[%ǁA L׽+a€^6M`{5nO/BFrRܭ 9I/c9#!"{XY5ɗDqMÝ,?lHЕ!a2ػ6 fgu50GXλo4ࡀ$]wɦ| 3;T<64~'"N5 gc^P SԖ)t:vnCYf aOgOd !ZsՌA찱GCp(&c.owW8ć >zG!wߝNAdf  cߞ=wg`s;=N ܨ`1s{=:z;0#ܬyR#ڬ8$H7Ovg 4Z !Pk/&䵉r!\1a<Xr+`C(5W'Q$1%EV1 N ySEg5a"'2]|c䫧;t6:B՝sʓii#je7'mpR#|{KTYFZr1ܴYм$ פォX2`[cpc\5DhǍKiyczfh5ؚl?\T8e3"CsMO̘Ƿ2n'~fp 1V %4|c+̓ z3Zݿ"@=nRG.4i/rʻm16ׁVԞS vб7\'#ďBJGbzdBF9[~/s^H8hAV Cﯗ/- :Í|ri_{kpQ9eb$uÝȰ0a-@ f54 4N0XTWn0?, lr;c)ޅ KT_OOϿ|EG˴Nv7-TPq?\ %4F*t@K^Sqhj(En䍿hӁͥ r;h(sBI㣯JB(NrVG>CM )nOAN%3h !9ǹA?@!@ٍD%ڣ^F]H 8(sȠJ3 b rvBO7;o$dlCDF<ƋVvlMw=FQ|XZMLR~ & :5rb+J䝛 Zk{\,~~|)DWmxg7P٤u`e؞5!Bu0e#av˓#\y'A)ŦHcy/}:"3 }n`Xe\ }Ɋ_;,rf+Oq?ߜm\tIo(ckl@' ęմ.j/,}öOCތf9%߰,D.5[9m$ǧ=k߃ݨޟ`QOڟy|PƧOC:N`3)׊6RެVuz/ K@:` 9=D؝4\aFݧ7#ݓ7}Xs8ļWFQb0zw_r 9a@C8d.DE>Û* 5>B8O 38O'4 iɟ@ !=9[:Y =m`&:7fbe*Њ0-w?:$G'TŜbqIʤysL^vG\eJa'Nt[~PQJa~h!ƻ,pe 3BI]ۣ:{,I=_mhlaWN)i^e#lp 5&݋ܑh8)pzWxzprlrF ^y@~#5PbU2=Wf<8&$8 6#-gWh,[ߎǾ px.I;/TH\]Ql8"nˢV4 N=zUlEi`m@ ?G._ 5/N 6QSݙ Yf]P4 M]z.`ՙn $R퀻v5)d$`xQSHP0湄R&YDpr6?KIJR8g@n xBإ`&Ds\viD?c2\Mw9gɥԒ7k)n o̖ 0ʼ6+@1ZFT:1=T~<*]}4N?@`1LqA$[1!$5N&r.4'Meسf̵Y O4egwټ|Yˎ;NGd T ϊ뤴[f-A}е&@/>Z)௶C v ܼ|T)~nGqњ?٠Pt Ɉ\?95RGNPV4VRl|_]-,DR}woUsDlDbR /}ldTosu\M_u|JK*^Tۈe}$v/R5Lgƿˊ(- NG DHgÄ@ss9=Z"g PITDjh]+%UU ݸj-D?*(k:ᴏk+Ddg|q [#Z#z:ZJ6 EOulſr(ߜG|鏳G)r'C3 Y(K?G/R> J=]V  |AET)I Ipbi[3mrv XFH")Gڤw ]Nd *RTk3[OqD5 g^=*DfQ~$jhV/M))|mWVjG42;dK(ߠꃉg|noc%Q0=wZh6A)GO_I"_*hv߾> #&Oߡ7Rm7> @XrDe *}؋Uu>ӸD-Y:R+ŭtMT?%_ǟnnZmp'LP>Nwv7SXu>A??hP!qh8ԛc;aC;@LĹϝtKH/uQ|R| '7<);4=U$A&^ W,>^pUI(HHYK䎧+0eX:>3*4R{C$}sꧾ2.ツYS؇OeВ}("(:S#8ٚa nnCv}!Ҩo4Fۚ=V+Gx>K}]M-*jnlr9:'P:ZƽT:4J_LZ%{WD1Zٕ$_iWJoT3?O{Q)}9ߞ߭%եBR?!WmFQ Ҿp R! yjYH_-bIQL~ұ= k3oe2]t}FKD;dI ܺnU:1KY҇U>[뱞=#h[|jOEKc~eҾRO]R5~ة-)%"j'EVC@I=ެ+n~m;BQ/QZсb ~ecC<"Pe/=NBw-(*[l*DੴY_EN;[D#:П[w=5dd 7<|jy A'_X۪+[l Yّ-'DJRu.~KTH*wM/WΈپ </O'ӻ%kj|Zƽ^3ӂU˛5p6jt3Hm]aG7EU(NK.{Eyi?j73$`̼Mle '}DS?_6}M=dO<Ԗ^TbRusd[G}FTDRQhp37*D )?#>iI}kq-7:q ;nٮL>N|)k*͐D;鉅^rhS_ d?y5_6܇3^y?[n~Ƈ~AunHja'f^D!=6yPSI_@Õ:bUA5lyZcJ5tܔPAft1ȷ[FVS`C^UgɆeN52c oϓ氬F>$]h6cGeJ@-+EjO۔]\UOf̎ 6 3JYsf{d  |T^۳'`H򬧸9z۲f7mH3]nda)1ć\!ep3,Jja@şcJ<Ê [М`FMŠɜ;< )廬! t§Ŏ=^Ih*#p^y)=CZfrs;?/6Nr`GcfYE)7^>.5Zam:0*uSN%guu^?<ޮXb(:V@yXcS(˹`TŚ@z 7B6˭`=mǖ;p|[TnI@I7[&ap"[H 9M1|k/gb[wAn؝$\[q)/!%pfh' XUGn#JjN5Gٷ ]rs,lߴdrN%ra@/ Cd4rLw̮ؑhsIO&Jd2T| K`o&A0ڨBwg"*O?h d%N  IH bsSKD'6L2wԖ,d)'0^ a WX-&"f:mc4RilO2fX*C3 } Z{W~gS ud]LyPҽ,,m5P}mքKvO5ؖ!quOqx1oH;&dG_VųG eCrnv)}ac3= QQؒ8Cƕ-0xP_($LôISu8$|s @fdK,8܍"(D|FX<ı L|oHA#<طSZ cw%<;_; _nb@v $yp$G!<53vERb+R;9L72R˃-PH۩ht:ޠ*;D:;eSҮ{ eɘ;Y=s?jtCgucORt*ITC1=x^Ƅ=(ڃp.$/?r8Ƚ"sUؾy-ܶ 0DxӼCS)X^'m{FoCqgO޾8-KxDmym_Gyli9y.gF3﷕1 u >.8<֡;An#62mrQݢWW=J`2ji]j7b=&0 ^4F,V؉On)raD+r}-֦UaG VƊ+o<z;gY w%) v@]!L|:nu;dVǫ7KlH$.> -BwaVKGJ&-]MD(s98{mC`Xy}xC[&yѮa/6]]n9\ dRñqCS[D!7cA䲙[Xzk0\~<DpVU%!BYtL{Jxx;TA[1bWHZm2Eׇaxv)N-:/&E2pXW'Y*{k<&yq~xE8NВl>i ՆB]/Ɋq1E V:_VYƣZmA>番,!).?H"=R{ngDN`;犩Fc0OXs4g<1ysSWNOra$͔-aOĮѡ-% <)9Hks{}$njHy}T@p"d *~ӬKnp\}קӓ*NWDHpNmBC&v0%|8Lb~&b o;\#$nqʺ6VSR,ZyR":q)kbj kk2WވtUV6knک#4=rTLZZu[1*`oþ @P1=F7,S Ub{ٱ}AX'>ުБLF35A^7V#%'X(vyn]@W";˽bVJ̓jBدl8 ?.)21yGG^%:y$I&Wt~Ljn 6++Xl ;j}]ݹ읏rڬNĂELpR9'C{#p<WP6Roױ{"v XcSq)"w.RDBΊoWޡ|T/OUѤ䯸N O]OùWJBz;O1^#MGHijt c*f q*1>oC"q.]Boa+"QJRQΎ xLP(hTlAwC*1xfm2Dxm&[K,XT" xz+ Pt<։n@dFUG墺4/[aF#:1Ƭ:rax+=Mk A"X(S6FgBEO~g~ Hzݒ=S ,ҥ_,*q&U"ۡnZevi<ԛrY=# K0zOᨬ@p*xy-̏k)efNy ח0]4x}ӴfGdXQ$,g lg`ή (ž?=&oeH^aC#чqU 65CtuޖJz Է8yRb$d<; t|%a1^uGIxFAaOP#!}h %SM켕c=IOTQUqjga{orl6.&53ϬuHА"axYĀ:\K4sT!og8&nlhQ1'Ib"z8`ȓLx-LN)rAkrcU jgW2]] < pV\T؝W>Q 5142=nS耘&zy\8Zƾ@(EMD$X]5)]_c2%"o';O&"l]fd|79FR uy v`'hs1I/-Ygo7kۛH:Ch}Śf\x Vo2DQIWGP1Kf0h(e03}p11vQfk4i, ֞/Olgڐ09ddh`ifgmcNh\]:|q&!Qp=<8qʝ;G[qy$ 0an PW 597!qI<˗]EÒ.qH<XvГaͳ+AUp HB&Ǔ)\%v*4mpW-8Yq%vX, m:"Pvh: !8Ѓ!orcxUen'BҜjǐ ANopLɇlu9D_D'x 3&ix?( '9dYm5i h,pt|7 dA$G&ֽ,o Հy`wΛeӴpBa倒V8/=;1\Q4Yy٦fy<4ZnE9S =aj=)x 4|ĺ_f` ݊<)D`y.v=r(P0:=\5hNyD+H35xa/5agc1<ĬGA1=x#Va1yd Z'g]B0" J"L K0GRWnڬи\r޼3Mu ŋQlda0dj .){LE W SU(It( xGqtIH `YuV{IasvD`^M-,o-/-1nL< 繄&ī̓?HGws;[(āiz`p.;puxTH3nog/2^]S~bז)b[˻F 5 :^y ԖFRdYkYd-},͢?TK  e&D> kT^ xV* ONX}5V3;5"`̋ =1DQ( y#g\ 9WWF2<G; ֶ§/]7JA"dL~/Qe*ʢdvZ)#A3lsaS߱p۲<[ Jh Ph䌢l1rD1߄+I|Ӷ/t*mW [ ^K'L֪4R/x2`CuD/AU&p=H6:r;Prw2 9 24]T\*PSqq~ƾ$l2F¯5EƁ'GŸ*]?*3!ObM[8܁!y, ~9=XHtʦ +FC>q,RuLQf "pA_il-: bЇ6!vɒe8 jߟm>|2)#|-uW{)r >1y dlst$f԰'^6}"//z ECLPJ>ɟ~ZJoگF/̴uPWNMH>F٧Z_f#}>no=uPH @y`_'uU=h{DoS~!ɉ} 쥫w?++ba͕|Ј<߄|JS5?`Qx#SA)EkHfC>\jR1İU?"aMB WAWP,G5(٣왓xkXzEHh~Wiu5OJ1\/YﺤWP:٣qB*b,]=*ػ+0q|j{bG\؊ RAg4!0UQvhwCvt7y< Eoi5lf! Pͨ 2#"Qd$V_fEh م~;X[MO4gbF$ _.]E3P&:SfP(M-VJT|BУ|LJCNJzvE-ECs>g.;7y< үpwEv}MDE=7{ J/~+CD mhHբ$-I-;eկiy)=|-{(?HmN<{g8?bӛ;=֙A9?==Ŭ:% &RET#7jV!03! ?@BRr:zQȆ~엫UI{}!pܯPJ/LMÇOT+܇z}F|77q[}4[&bPjS;?71 ~|ҫB8^9n74u%B b *GiH=FٿcyICϾOG*dK7ɽ %k$qNv{.1Jij:OE Qav U/ >:9PkYgCu®E~t>CO:|':Z*?woS`ą3(J} rQ^(٬*GԄ:MU}߶$"vLEt5y7^jEgMԗ#we^/]CϛE"v7棈ϩ:i91FV]?zSu/PL{G ֑ᄨ \}V*d}+?C½_LJR}m,Ǣ 9Jx1}OŚ0бSٕRAm@ԴF6 /OQZn%^鈅P!yR,s_!EhD%SGQS鈷~.;|Ŕp˘!S>)^J 1RMCAQSO< q}|t'-Qw#}̪_Kl&Od&VFdY}.J̀ I")[y袑ݍ E̽餉uG#Q[g+G0Dt46k0(Zhz#Ҩ(T%z bWTᏠz礧[+quJG^*y_u?_DINW?n~&oޕO}w\WAhz߬ |W ۡpW{_Nsz/;KFJsQp ^;>ۺ1FdQٿbl~ĞWE#@VQnf]E:!D$ q&1&e U=m:C^YX,fOŭ8ɲ1P$_uWT]U8(vC{,W1]*]m̬eff֦[,XI-cw!u]Ffhwv #Iz'Ƣii·.K{۽Эžִ>=Qָ0@݇]]$`]z %۠]Ȓ6Ԗ5Di" H [13)0$~(!uu\$ %`"uǨʈy i.:a(܋[R 8xJ%P-KaL0vnv^I J^*Tl94bYieC*X;X[h;u<1Aee=nHJ3O"fp حڮ&%haÛIp-!J މ)ߎ3LV$fTˀwUy gwUiI=0W"m&%m Ʈ\!i((xFwUg%@B!)@p&9.@ u~^\ m"9Io灻X,z<iI7~4YA/䇝?bß\j3H^/ }SvqYkEB[3 639>0+ZgBD[iƗؐg&0 &ƿ4'E%ϙG Uf `P$+^;0 AE/ےMd1}M@[>| Ăa1"`4SaLM)+{a`,W@R [`$8̵%s{]A8&ҭHI#.g=Xzrf^P{zk,G B"'ڲNlcmr߂md֘0x.Y­kN:}0HU>4F)Npf: 0~Q]NF8k^V|\rHɩCWnK?˫9TTNU[(%r+ǔ:u~ br8MLk;.rPhUq(fgR"::rb=In,ByP'{#yV` 1"'(+a5 XӋİ/;">Wb*9PfֺM6*TV q+>bo}s W,q+{UYwfX`Y?u`jMC4v n*0]ى^L$AN*菸rnQQM7W[3="̋bP{iλC STK 0\~Ư|1`fᠳZv( /\wv|Rldߜj/(+3Z&VWht;?*6CTL \Eg %(\7ZDw.oNaH>n@A DrXӖ S1+VCRC9-$<8D6k`;ZT mĄibT@nʴ:TT)e| YK:趱 Klkz,ykuX wkE+D=,P.kDm1&Uw27s;% Է_+N@'c9 H&N ~mᷩ 15RN`A lދ&EmSBy v )LiedM!+ sLh}q%'@Y&kN3 U"JK:}"IV?c=Ḅ!djLBY1x s\~!]DsLd`MV%[PT֩+r 9V+É_xYGci[1q̘MZ/+B2P#EBζм0gOp-m\n/#A7ԼV[{ϊ)*{$B[1کi.E'"ei/A;] h΀qób5 I2NtQㆽZ;h=2Sxzx71Jj- L *KkX7'\=WJ> FLUz@qwdWgs7?/K 37栢@gn-I3~B# yZ LYCOLͥG&J$9uR1qh{JpYe0FD=2LK)$>R^F("~"L fuUwK-d_]}TQ#$EAڌ<SI^t (SyunזhP\=w0xm){̐[,:=ĈnXkn}W]4i;.K2IP1w a6j~,UüRU- .UYѾ)H4L9z#1 6S80W=wD7OE3W5Dhv)`[LQ֨o:V%Pkni{8 !d5 bLVJhUd4 s/X՛'M³ew&Rk\ .78t)Lи.&6Mw>^NzXq½G>׽=,u<%9RҍW9Q:ҕ#Ćftd6Ku};;)SCQ9A\@`wi]t(uݸe]0\U1ȡH&)q^P֭XGQ >-cL;^an_’[J610  kShJ0;>WjW;\M܎UZ{hg"Y?6eˤd]Vt?^EiB!^{;0Ĝv3oJҲk+& 4n\JD [3jf9^~Tz8HF8x .)꿀OUR1[DŽx,ȁ9̻4s* eBF6R|m RN?ظӾH'賘-fݬ)xJ/>eHvB&Pv:}|:0I Fs*K8a|6V0 Inۘ^Ց/IkkX9Zv=`tiWu8A'LH赂o n9S ,ʻOړt~y-*Q$UUQRI8(ɭ`i*wg[/xd A M/1pTL%8РX.N2CD:Y{YdEb/Kt{Ec-"BqWK.:^/Il*zZEK&Y頲 {CU l!KqLvt ȿli5u-M[vcvp{u(Cra LNzY}Thke]h*H@k)U԰uHqju-}+l2+Ul nH9Rg[U^~,iXJiR75w yzB-51Y5~ob>m Qi>7O1 ?])K'雁C/b(}A h6ADbI)bZ[̠TEJ'AKؕC>W ,RljZ@DGKD)8ؾD"9HQ ^ F/U nHD II"^teYӒ@ޫٱ]Rt/F*q,,&~Zq|eyylJ}a!޵pT\tnka@!o7a: sdNzm&gͫͻhKB AÔ{ qNb/"ZսIc3) }2+N0=E,wq]n'D'5z\O1;2z.3\m͗c -ғ?a'U+y0cH̔?ye5W6tvsN<{)۩h GUfCPlw wiH_#9G2EceI?b|DRNvJZ0cVZb/b:,*PL՚u~e}+v;,+rI{$BŎ*}G]Űk5u:`IO1AB{7\wdZΕWd+1 ΃8B6ͼG| ηL@OQSeO} uLN;KgJ@ Gluǥ Fjo,L׏N9Ի͆N7\2:[$yڝL"y)#wa.C _ Kމsr1Dpk;ڏ̡L"L&%%!-MCځA0;mw/> 0~OgѴ_f銥_\4chN1Er 0+(ԡhQbş@~ K`U!Qiqc=BaRA쬥;T:OEc+n`6'_mx1!i#ކ@J6mnx K a̚d@ߌV+h_~,[\k%# 5ƠˈJ*{D-<r{8A C d4"Y/f8UG۩ }`gfs:zh;s˨ d'̟d%*B+$Ze8dɫ\%Q1 1gPm;Umjn]h_.+kkDY h(̟D CX . 6+!ʱDK"Kn2ih^5*A~8 jzЙhku;"dJ{W)Ћ[)YU]/{JlRPe}{ xVA̐F,yGPq <|vc=G:5jm=.mTva;dA|fK&`-{-xb/VN٥ia<>V `'Hc DjHIwoabC~HbVPҥ]%rNrYpMSjPi0X@\A8Y{\Byim0^쪏a։`@to9o¨1b:TKcB˻&aݧu6ږ؉Cp?zn G=R͘|#` rȃ&?@ںҚ5^2ki0%VVJ1\T[Q2`nvC:t, M'[]P }U_< @1jcABj9I/#M\ : u5%y>3LܭqH:NUNݭpR荈K0nƵwKS޹c")|^+S+yc 3/'Kc?j z`HPq8sUT/i`SN%p(UnN19u@(Kłm(Y$/ JSU/nv+ɹW}>Q@}yq*2;G|qxftzALURp Sej!P90O>R%Bש\{!?5Bd?1B zC-$0:(j  N&%xR`p[ J!kkёHV%N{ZҤeƽ^busPRC4ay?wu,#> ַgDv۞fS۲ƇԢ`9Dg͕:{ZOK'UB{@~,[g4ZQ;~J0Bސ?ȏ=RL֜xL?zkUbBs~lੀz DWgU8V u\d?.[̑, jq[vlX=O\_ޕK A}; w9M^yOꩫT3Y%ݻ\r] @t;}6Y&, k*zVp']n=HxdY9|64XVIg7tl JyTUɭUXI SvH̱(m-@Sl NdذJ.+ *ԟl+aO o_ST=&.^86׆A evm'ܢMB k"H:b+{nZ.)jR1׾wG,S\?]-rf(T"0ůu3i'osM9n.ZW)T&)ѻ[6'ex30S^( =!N)T0K(djoۋuVv3f_ U,]_3*^|L90~n4>9d]x>k{# s1zq~[(g-Y['`m.aɒf|_߷wۺ %Uea'(ll03xkxsbș܊'A vȎbUf鬡e vP٠cU} 3MvAXʠ[X0>&[-,`%pY&=C);ٖ5"BplnV/1v8@ekRd j4T;p/v,m!tEJ͚:CD4zAx?7ށjk_o$CC)}Eh=gjkڢߧ"z\)j-N"G11ŠpZڼJ!cidx4$nX7I`k s%6${yv45R3L1TST,JMʹP\TW5z;{Iif85pSڡO hc7>F, 뇤qJyPmB&*9~QtEip2A%FaM}GgO5w-n$DU D ћS%?!v9ʕmKRG7:BEwú>E6ta]D)$!pN#I%q!Pnohmz %7J`"r"֦¸uC6Q(ﰛ 4MD<2Z mGqҦS2~ +LkP#HF+O{vjn*䥡"~hFsxOKd'qBmC NŅvR{qBgf]Ս fΣ"WQ 搃| >FmOno QoHކ=ێC s /ztRn Ι)gݒBڑ0]AgspbQL)R"r6\DNݘT)d%'{zE*;'q勹qi[j4>*L^lKEFb|1=gB9?|WU,Lh,<.ZGCxt?xCAҼHi}Pn~1#4m5_&tL,'cLsQXzjd#*h;+7xVh x]c)#緎zjDNECKEDgfYS9 _}6Xt*h녔vXcfvYU O4szkK?0mc7q47C`Ch(EMn71u)lV9տ!g|JGE} U^s +2GKS_ ɴ,?V"Ivu7/nѦ~tOOJIP^U_YU&咖ӂEs\ENEl`/6I4_ ANTCV!fOmb ݳOɳveHi{i/7A_vIwEx o7i=\wN {DYv:rD6m$#l|2-0x"gD郌E 0Vh~cؑNcShC86su0^OB\5gc }Q? .$(:`&Kg ~dG@߽ 8z'?>nH,7}JYcj}e %~wO_&HԴvOJ{ A\NTpc!Ir$JjRe-D?ij;h7s?LQM0O,IVT緬jRͬ&I^[*IeplpJ߬,yVH nܔ~j3H迮SiB[=![YuRY7i:2^'#h#"|NBW@AAhBgv!)Y=ȝn z4~G ɮkϧfiO> O367L^; kE;ENl~+m֩`zXWv&/g&}$U\ ({PwSN⥵ s*Z@tĵڽÁ#ct eǡPd:G>#f\x+\[Dhٙ-x1ƪY;b ͒e}Xs yY{pAtp:ich3AiSsڮ<(ݬ0}-2 g,gT8 fdz=ۋi-^^R ZyevR+/Xm)3@c:MCc1eNWc_NȖ5r4כTG.v~ =P5,Y HmN`ZC+0*܈3 ()~4Ӷo E up t2:2DUک+aIK.|,HD7+ P^lBWkKp0O<g"%C?Z8K?Onr!*V)W9Cm97kÑ2SGNWv`XJ< 6ۈk`t{r06ݶ¡BO/-#ۦ x7:=Obwcu%ȿfZn{ b֕}q%P~sgzUR:e|0 & \I'#3ݴCD{ T6N}Eg)B" ':XoS鱵>x5W M!R6W ;WzDպ-.ND ЯElϸ0@cΠZ7f@p?i3ϹȴQx5R'Z Օ@mg|hYG=6셟~wpP6vJA>q :bS+:;ηNP`R&m~BG tC%4!\G'W[I@CX('u9!@|U)(9at%`ARR\C@e,Rj:6tL( zݷKΨm[$> pQ ߪ\~'RE a\c I76OԨ: 1C)Ry6,m  䘂>:w7vRޔ(8|,dn'1R dr=?V ~?IPcg@M (S̬s햁M}bF,)FNH)p_zx u;E) ؠzߦA=/wJؓy>$& dXFâd^ފU* fi'g1h!Wei[hik2Av16GEŘZ Lkv1mgwT3xYy 3r W,l)³odD lۨ{**LQr?ctoLWMb:_ dv+me&AjbM˚{‘cNu](a\;2TlCl&f'Mz!>K#/<]XLpdǰ1aNC1!Ig kel0j6E9|8 nf1 w{$ 6ؓcLs<}vI:ؠbX\AAbaX.7ETb%XR6UևY 4X$ g6VcṝNqpQs!re&ȏbJ,px]4ym H0Lw|6\!\I^k<\0(O#K B^+5L56WAA'}` [zKS"OGi#xδ/ F 9(kZ@C_.K G*#dcy@ bw1BcØިOiTDF<(2-# QTob Hv/cbµ 8k&4uVnZ<\\s\43l%ΰΣ`~(Rpvdn {6,EQ o=JpvP>nֺs `e{rp  ^ Z;1 Yԝ0T\Ul(#'Nq;A{ ȝB)}v`nCa[ ':<(vFdKjXb%['r;z(]rGiq\Xa n4:Bo9t }^Bi  ~vB>A|U_z2b8Y~YK_k1B)inx!cx/dN({|c; 'mk =<`M6co]zMw:Ďx3!UI (?#dګ̈&GiK=@GYIFO95CB-9pt[` w:yP`IN5S d: m'aq=2IY S?B 8nE#4ޏbwY`@+yP Ϗ02u]={/e =)]R~rwi$!A0A޾x!*Y# :sVtD + % 5{$_8e|B P2FBLk6X ,9CƧ}NNeU08-RνcV9@}Tgtt8`Cx#'= vӤ^NP̳1E"]>}E>WXP!#۠QNϺW1O(y1 dѬ{L&no |ڧ/֭ Jg4m @ /dy'q.*Hc%q*FY2q;r1h_aXvD*[ Ʌ40Oϓν.]WA_J?xpGcPUc,?aW89B> &-53:- p6|(_e ,I !. 6CI('$q`to0p[/Ude\0iqlc] }=12`K+-P-XX Tٞrҹh+t鎎`k[izi<e| ږguɐ w-D[~% C~N{0!% CaPVjYpqe8fq'ːI۶gEͰY3Yz288Fθ"!aTֺ<Ȟc2RsH(݇ysid>oD!D[@ޚT l҅ ׋ܲ6#E2T̟._1+, I*(p2f-Ѳo]P+ҁZ5usZ`2 dʼ?Q0ud딟j\ۍ7P!t a4fD"ΗHFytnl6'eb[G9LGP~5 ~#޻ŝ` }I xl{s0-[1!!m/O4 2 ՊuK!jAY􊘑͂\; .z ;x&R2pljgp C3GǤZw9qG]%HCq{F3| 8 C;Ø1Q. <ΛvhNgQϒҮoʆnǦ#XY!'O".; 58XQB:kJ82&UQ:z B6<ƅ"9]fĊX@QR  l$)^Z@.ng5eRSTUO^i=HItODKƛTzHX-n=ZicX9Rhx>;O9P- 3 _聵k@ ʼnݵ6ZO%Li=p=_0୓@.SY^ jf֡ ƺ7 &\){ -Q[ݭVV]gC"Z{** "Ksi* a# ~:KAEd'1*q,a|hVL;mw0uX0DED|`nXX1hvRgs.y<6TI{u 8JkGL"TbS uBWC#eeb9[$мk΂sMɷmNowd1 ̲gv鄲7=e.Kb;R(Iyw <0c-ME\nunVdQWq;5C r~oZ2BCl=-%GPdAĪv*6b҈#RIM\Bs @Hͭ1:m%93>=,a8XHqUr&0x ǘ J  $\ u34uRt:PJ66ۏ@ױ!XGHgRa7Y || ""oh3E:d 퇃AhNr+U; d f7l 5 \j ˱I&iN b6ɥ$˸wM8Kg\ۊ v \A13-a:J@rz-0Y,ṫJϯZ1,ڊ,& o+?wF=]5adtitD:7EP2BӖ}"aɇ/lhdCbb13nAETCeNaHNϧhOJ떯#͕OruHvN=Kk2 'F SF" 3UEϰȆ3DflmAkmyŇs&bun6Ú? 3+~|\qO U/3t\M B0)" H kjRa ΀bDũ>EM!6}adtmFT|@'.逻'jjyfT\һ{8jW~([[z޼[E +;EAafx9.ܙ Zr0{0,cSISc`{iJdYCi$[4 V֩ $ 31ZQQv! -@FSNuWMbXaP{A|4n]`yrDtykIQXo/Itݦ;}{ݥ^L;'_ݰ(!7+뮺M(釕\tsU$BP{{CbJԩi pMf^|M= :Y !}ox\rA J 1.W>q&>:tUA.,F p<,]V>Ryq:VJt^!w\ɂT;ٹCa 0txC}AFEjr{e.Y6C&~tKVU >DjĆjDkIj E[qQsK~DDEAwq5 Cbpq[XTWs+;>7O# 49z*QVv};kmz O+aٰ~Mh=CDjD8I!->82(cOқJ:beGCX>T@Q|6H\I6YÏ0u{c|5>)H6*B"~b"֛A|ڌ(^"ߝU يZJ=XuuB3螁inp?)ٓ;CȜbYG?5DQ%-|U$ZMlAƾ{FUpݡQ⊀ ֨SjFo (5X]w9j##{u띢{t> EI84ntO~hdb<\dP\gl4sA ni=gp]Rz>H0u#!yTaB87PI%H1n BxjFmCE#"4rv{O} =jzBzϺ#C[6D-T> ag@QC,'-\#~q@PI҄ͼs,Eyk&7? xZ`ꁷDb1g,G~hay+C<9%ʅ('hHڬTN6hmyv ~p"@t."inJ&++uH.d/fW!|9G[o0Qp]kW!OF8]pM4FOVԻ'?qVqAhϾJO]ߝTk?o7DY߸\ܾ!ݩx(IZ(~Mx:m~;5=oz?1TN埬0K^>@dpPAKOgpr~v\$ &3U4~17:@w3KT?Ih?.V=M)PMԪHUBcH ~_]k kxx"qׂõ~Ua_1+ը6/#j8Πb=6-nosDQOK%SVG9(D(d@II h!UN7Cn@PBkk>6/;ݟ^!=c) kBMQMth꼣jCIt|!ũIZ|9ClK61)9,''E[]jμGY~?B[>Q#7F肣kDsj ^fċC"gs\uqi1z'IpӠjjOlPdkDS~UL;HŷhH uDo_:;[ 2;zzdf_M4iOLݒ{sd̄lLuåIc͜QbFpX&z2m@_2CJ e"f L6IQީrvspO ]W·#W1t (B|˺a^i(ʚCo3  q9gNlRT#689e2[a"`o7~!af4^,O=,黈:?@YJܼ4ǽR*M&gm h|:gƗ0̆*'t64d//j^1oY’-zW<0/)KWFBͤvd{И~;@Ae 8@/bt_ޢД274Z[!~Q1OuɺwETf1RNͶT@>q"rl LnqN!c2$Ӄv;eeY"aPS =aq+vm6 m &1zl~4,lQ1<GE-zt_$5峨;p0= o@{FAY$U _c"IRRjҵs ?QY&{ыߠh =U *icFmr r*k83`6Ͻ"$}cquW_xq,{Ɓ6×K$4A ,h\Xs#TD 4fwDB2/dSޭlT~n]Ԑթa))s-^5yyd$tv+>#^0 _ɄKkxr.G6ڀj{2CA,0CskŝCh"?U;DZZ(pEn%O$6޼ɱ=YX/_2kN_ +P_2)x6x& Q: 1 l0%-|׃8>Lp5ˢ^RW^74CEɎmab5}̀{޹BCF8S `gs7 dr{Hd%P`恟R ߒwe]\7- u/ɿA?m! kRaVS,j=P>뒅mr5O{Sc 3BŔJ8ְ^8bHt(w*#n Le{G.@@,;C35-CDB]ѝ6Nט>!RBbZia$_d2ҁDb.ˋ&4:Fr}T`GB.2eiï *͔S|xX}KV5|UZ.g݂fS#f˽YҞ{ъW%gȳVI Lz^-Fej~t%fZpk{m#j;Cs7K,:[YZ,T/hbYuڇy{ET؜ؿ&zV\H?mWG>wާt_UkImF|]VRlo=FuLj⸕u?Q8$(8|>qLom~S:h7]/qfjh,.6vSp>"ynK~3o3EBSQAiG{†EZr7Q_Б<.d_iуRb[?(}SN%]g ]Z!JMɐX ]pU#&it?y^%\0h)'gutB~D!z8tj:b|ߢ[GE[NAѯUn9۟W:7W3OmJS"OAtZKrI^OC>p^hщ0>\|uEIId>['c=_w//(Θx74jdQ-pK.tF$-|bYIGgru9˫pQע~>rhQ@Wx:W}R׺~NJ^ H?-f+yyXp?'Udf?Jn[n<̤5#=%*1Mꯉ=kMUY0>Z :6&z$} 2&H˧;9#S訏̓b}7j^Qc>CcizY3}HI˜pՖNf"I~was "#~}L3UgDou9?yOkM CU7~TjIX]Q_0g ϧ|̣7\{aԬzU~h"wպv5_n&:^Kun3<'@ I7x h; ;dxVƺB}we7,^z.3' iEE3V^:̰|L*R'y0. H;l%?koƼɴ<w<2<~c~QGM/HΪhZiC|>߾2rZG5FՑn?EP\W_3}pt\hm%՝)}|0b6ĜitJ D!;!9`- q=uX.pqzk'' iGb <@6J#چKI-GLJC/-?SڤS-W,nE~9LAz3w5(WrC[bLۜs}N+(3.ufE_E ]Vl~*m _k(I rp^LN7, "(՟X)MTazhpNx3΅,R]vK?8[o}ܨPϵ9ڴ-Be.&@@8LBD"͗xL.IdBΓ@2V I/ Pu)Ȁ$*E'/"tt{f ^q ?N^l2[Z/M20Ţ2 ]( 0ksDְG0ީb&"+Tẍ'ןb^E3YVZεISc >G/ţ (nJsܽ&u?qyS\EQXC(w Yv ׀'l- Q,Dpepi Gr*Q5v>w%F˫Yݜ9'R|io"bR{苊OX>b=nD_#U'n,vھ.%Doo޳NREgl@z׽DS`V 8x-O« ̔G{)F 6mAE9=eIøa'k@&V4tHo.Qe.X6$Z_UlD~M}9URjKYg\n5mFIJm9 噅WIb%3K{iv-*&y (TCGpM`.Kv,=tvZ m^sidvhty}nĘD=|W'/#j=雤[/kaw^xRe+魑T>[thb^x2^s˴2lFı(0z8r\"Bf.Xilb@*+qcv(%Q,YRcKNo+^f{?W2.+&D#q hc+YsBy[y0  貑LS$w^ Gw1g!ɧckƼk0]1OvSLL{?ĊYEO%#_=Yx*70܀p"R3B~4ԥhgӵ+V6.E2HOw6o 6Fݷn' cZ:%1W4k(+}ެOdE $$Jc:R?i`2Q@A袉-Zb!J~$~A$;в9t+}&'^-h`AX.e%1% =0Zqra5/ H4Sp T)BޓWF2T hŬ $~6z/ n_*">j 1ƍ)i MKNh֞z*S< ,W(>_HA$pODoxDŽho(镕zȂ(]g稾^FvˆQ9$+Լrb^̹S!(pv򩅽2szv Q44 $o/F(qv|pVA F)z{ӛg`yİw29 S6E9TDi)JuGh)W#DY5Dwԩλn1 6pym\V#-3!5SA !kD:j͌N52wz]K 9f݃Hk`orH4-Q#Tsemy"Pz~@PJ_ge4[P92-NEiJZӚ4S6^l^ 3Asj5'1(6er_7>gN&fC(|c,.h'6yّg$V=_>(L^UX r`kM݌ȩo#0:S(;`#Րh <ԜK8+>pC_3wwK5`6tAL^*  t8Mâ-fȸP:' F,e A֏y,#s13 oh~iSiڦ;:4YCϏ-<=m^,+B'8.m͕LfYT4aFGi*q<ğg7mfhk}gB. s# ބ઼JCZLRڊYOغ;_TQ+UXZcZ0:s:6֭/ŠF".e\Q AJ8b4׹:ͬ'0UqaO6B+wyF`b_ǖHƐTJK lJfb Xzl&,xUzxGϜOۈBi܂3(^M:wcA-ƜNT|-'^MuhIHfh 7f\SσěsרgmJSFArmRATx-MTsgcN4dkykwf?pefhyˀ<ӌyc,;%2o0mI@~Xc2vb V3K&TL@:$wN@ n caJ /zQLIys^E yE$Ϋ\c\}C;4q'k{-6;0+8~exlQ8* _kG#)6Ñ='y8&Hb)b*}Šq75 (^|*}lo\wj1^O9ꇈ_U_A!*ʻÞXTw b9Gx (G\YYD఺ Jw"g0s"!QoUKI :^[kZw.sR<YFoƿuj#+}dBQ6&NjS!pq`P"ڐ ^ U'۾s lxQ:|bM 67:6.4&˹M՗-hW{@/kk `JwBTҳr@8bf#iU!,N  vYƬ4֊-45OKߛll^z_K,*,̥1K%؄3Rꖕ1Gw6pK"4!=7&S{|*r! %Xlgbټ!zلp`]7v]+X X\;;p_7I Ci׀'+[=zˉַi!/\z}Jfo&ePՃ յ.X6Z%d\UoL/s]!;vS%F4 n-K%,pA1}ƼjޞixE^w`)⊅e4@cмdsL7cߗ#e}m0-1Nۮ) a8l45 ވIft ڃ (]ӟG='1p| K){"QNr'tBUig-Уzh7#8MQ]I\>X6ȝ滨0&cU`t$T )+O3#Zς\#%&!KE~+ ~ҝQ=.|)Sǒ^5:IK+*NLTay%^9$z2ꡯ{R^lҗ hж좮I*ZO)SժIV#%)3S^ߥWFb-5~1a30u%?Sf)8ޮPTv MZJ#Gu]-e&8н6GE\{ͣRmڇժ)^d?H t$x r-<EtERYTb\g()_5\ 2]kKY4ҤF^ w${]/-E{U}!>RTtR^,>9N]CTCȣ<@i9)+5VbI~q{hW πI)8߲׵DL;W/󿋦MZ0O4zj/l\t),ڪgۄ/g"qk9=x(8zQUV߉ x9*I+ P0Su]4'uzݣ~ߞ3F3=O{Z F,`B)'5.ׯڎi9<рՆ;ݟ WErMԡqSj M{r L#W~B$UD M4HiN ٤EzМ[LR䴵༷B֣3 5όzW5 pt|9*b.'EP"[r518$g)I+;woF /^"i7վ~'L.sU=k&{L {oZЅR.篣Z$</9LSCSۡjB7HZū|G}kq݅~B=$]w{҃jJRS4e Ky>샀su(A-KkhF-oaADeX-H/CeEGjșʕ}˟gë\z/r,/z:߀XRN{ߍp$T} @wO;FSIE/=B)y^`4?'f)kG_guЭy))/X?s <u _E jJ1S6.OBL&UQJđIս:^2Iwm61O̵|=zq+BڤQ`/9 cu%|e a0RzXtҋrg=Gã¢0GTE_ kA-+^/F약ĂoaJOڄ"wSa~&3zޏehR>Aqz_Wxy'ㅣSY*9.QQ7áxfΠ#Tso Lx,OoG(ya$'F5N)_K_;?BrC0x2vH2}9 Y') t'yEGgI{>)'^{D?J?IzEH?Bo@#@߇Lj ZA杭 &#Uѯ I3ٯH_j03`/KȰ40|tO|V|7 ΰ^k"%GZIuoWb]!p8>}^` t 6Ц|= ^oNh>0eYBh63ڄpեnPbZ,lLwӝ$jatw?:{۠qM5Qݕ`1K4'bct{P7b =~'W |^ /v<ƄmVF(a37c )4tκg--q0+>j$0zHS貈(v  aa= I1,K9?mut5`ig4(IV"J9`Yw_݌\g"׬^#N:z0?}*1fDM0>gzaњEKivWWWb$Du|ݠiyzv/_ 6wMZ]#z+ueIxS'5cs}rwDE|[ JXȜíleMią!!ZUG (C $ f g؎vW2q; ;cOpaky/֘v0b#ץ2~1/Ի`[O5^3v;ѭ-, rD` ϱ!x[G`ncKf&L|S$o7W[([ͮc/_kT*dηJ %[8G$n І@+DZAvϛ-1c[-& `~_0M=#TenLfSsvk_T%T6k]7sV԰UɜgAT-"^gkS_ʤm)F-|FL^X U#۟x(oaN e#A1|$c$rxJ! NbK5EoW,()e O(ـŒz ;6{.fEE51Փ}y_n`|@<`AiXCRՋy0W8b0 tW% `7emk a2tP}I}I]yc^D*%XRDڡ1]9uBn⡫-*5/DOoɨA-: MMeᶂ[&[d_9/wlj$E:Fk4NQ육~?DƋ7oy-X(,L XԒ(7(Q)/d*TB_̰oBԖ7TNB^WownkfoH֫Wugm(+E,an|ȁzB'P)b-^X%a^fX {@M ;w[n~waQo]֘=bS&oG*ko)hp^otMUn_[gN@6ep,A6bQAn{s:Ӊ|f~(EpC 嵷&-'ҽSO?^g6F'&V p'IydPcTIm̧ܿA[)JԆ (0D *r*J*cbtPT,)%,ôQ2J|CpoE40"a2/Je! VLAmm_d[9˱Ea8@ xr%B34; ݃'M,V߀`  ~Dm$έ6^\"D>,LDdd`v&|k2,(of$sv>jĩs \8W5;:'(F.^tMpoZr&AKWu^g  KJB!$g}6A4u fHԑZi桜M7 xa@j8bsoUTahˁ^gc^1}ʒV\MI *,}WnF&d!dAǯ(>rks6EM c[sD_׷ӱ~?TFb$OBmޛ07XsnNJjg6IAWauC2gBiH;2=Z1wJxÃOGٻ{%A͑aOb$ʌ}~ f=4wUa53lFky07Ęm?a9`+<#Zo66sL.&g@&PPƶc%+Oz^,oNmg;Fi5(?yvY: ʷ ֜iE:y pAlԖS|!AyX.H" C cE8N~a'.6 mdz5ٍ+} -3 Bs<@0* @=ljAQt,Z4{nU vXD*M"{p|Y $y=NUA R`ff;,-8{/D٘NR8rۄ$wQ<1fu`|@'+},Zܪjy߂|Ee4Er5n"]Lj&)^%@. |% xlŅǪ"vr,DYySݴ>ccǶZ3a #Y֗eNUԹv$ n آeNF<ĸsΥ0ݴ >}.{YcJ ql,-“Ɔ—7-W3BꙬJbcJa&5ٔH@1 f[`I 8 *ؾΫA !T&~ZӏUji Z$u.c"E2+:|"%W7ċ|a@ww\l@#]7蠕мKN"-<1@DčCn}uC67&QHr&i{W(fN˗^yg%j᳗*> 5UNۓ],bxvA7f7aJB,ۡSf؊a29V|wda|]A/m3*B,/=3n]OyDݑD$s!=hfaIp=098pH_VӤved6X8v Xhf5dO"6Ưe`wQ*款܁蝾0A)VffMxSvpZe_XQ6EA}a;;Bu5|3҆Inx>G9d.2hY _tߵa?p=ao5lMJ@!8X^$ \p^78w?@*?@W8VY*C.o *PeO_59%1 %Я>@ɓx hK>K+YbnАe/iU8Z 46ߡq!;χ|e~(L1b⨗ Ԕ\b w̮+N/,dYaR{̜V\.3@j4LJ2bk2]&PBF!2AʅxAL/p)it^b/.V|m܄× ؇@H1{L~zl}9ߖ1$28 XfCFћ_C{8ANB5\ė2գV Jqqf6h"e!NFaЍ ;}@ClJh)•noH.@ж^ 3@hZ[tbP¤ITE''͕ 6kھv+Y2ϸDciܒpM2XD &VmDbjp~+d"?ǹ C$9 txwhGmTNE06 {S ͋uoif3Tsv-, ߪbNR#Zi`O * Жn#.ϼ[ˏa"Irol ' 0_p9]:<Aҭ6.FW Gnwa<:7ɖ~ UX#y$7~-W)D7u^ЁNd:+{OaXs>L/DQ>+z8WiJ\?/nWwwkq&}YY*[?Bj^6@ Lu.K]cŞ*QfDyC $5j׋p&}o)\y3QmCsrAߔUbI7d(G3r5B,6J'&Jsb\x3rL}To+eI8iψ+J^\F$͠yMWˆ6O %IcEESr{"0=\5WX4?߉ϫNYfqmGvxvfZ2Zv6PP;I1 N|\vV9שkJJc׌ŃXO2݇&BOhI]Zwg#KRx4cڌǺwٷ/w,'l䛥G_vkyꭥ3sӥovsLąT§~0'9IB/pkf)7XMbF5ܱ̀8a=52`5w-p})?˶5jpp!.bq%{ |MSb֭ũU c &A=6ʙUSFAͥ$N ߰/jUt.IYIr0;K}»:;m@EkmԼ^Kc IZktM;j/514wxw :ek^L@j>p&?~+U1"G.%UlWӐ i >g9aӱ9`01ZnΚݢCA#ڄ+e\_b@^Pqd#-;Q&d{14d YA(jfpV,.]=X6w+SeKF =~ D e؈kK}=CQʷ;sqA=RD,P(A1Z']n$ pZ}gY9 J' Jٸy3&EiZa`8=R(}ja1#L[- ]dS@2Dqt5wΎVXw|?ǓxbQ kӹ9JM* Bj|l!j ܢ?w.ggn b523.a U9Z֢O+ƒ8=\R_:tSնk[ s*wJp@[A@{Z־c :Mbf:tp-Q̀yPќPM\d=!;u|ne. BYSErJ%]hP.DzFwwh?ogA2J<ý3qSjN`v7,km+/plw+fcmQ"u'3T?)(=͋dK/Ff/ DC r ,soF޾9r(63X&[|[3p:.jQkWgeF"8PÕh ']\/Xa}qM`Z:ǹHxkQ(`Vp/s u',hs' ζnTNs&Uիf~! *rLA8ʜAS((ٲ":ێ$@#E ʱO$kL5ZŰu|ASC+"[RFdO]u黦&O}7&s(]IkcJgh0?gVer۱Rk5AdCZS4vd 1<nzf;$ ay+PqFs>,be..By_/>7ȟ9s!^9{GSQrxcWR8;]X;ِͅۃnKU4)7u%HyRekg 3ZclFo ul -FM&yR;[h UWтռB]V $&]v,Ko׬8+Xl7՛1u[m'Gm{98ڛZY3uܶ7 nYN]K![YHEȂf7Gɖ[\?9ظ?6Fyꀵ׈) òXH9qU@O\ T Ef{]䒀y !`U$gy6?p;4c^Ar+Xn7^N}OeQc^,2|-v~ 9e.܃,bynbCfd:2%n tV2gSZ苹T7 MQ N?NGΕuq\|&}ݩXz2gtd:&#rjn="9\*,XXc%V&*cVx 0p<)/Ky^R/y)KW^ݨI^U݀i ~V$|Eܨ~>ɢ*zQ3/#1BR02 i$[YAwb] E')'M~1U@彚eqt344.&M |D_.SMJƙA /,0Ұ0F؜,]KfGE1bޘ&v欠fg^^Zq$s`w6w^ !պH"pwbR.aģBְR$1= |;n&p)Cr1 `*bmiݼ[ϼӑJKēbck 2*j:l&GrCi_515AZvh-e1{mٻX ׂvFؓBQ;;v،PvwiIPJ ܘ W ^Bčg^쉼 $KYo{jb-Ҵj?K@V !D ]IN/O-48ZCp<ͭXDQXWqwYƲ"RLF˥8Y3o*O3qͦzRX8y 5LJObh6+94>IM'WIQ| OWҳ_8<j9TJww#S=gk[ ˿J_O$0t&{$tSU]''%9&{IC1Kx^(c;~X%J~q“n=#(&द v$vZR@UJT :yuJazu~KKuH%a%OgjߤY .!LQi)[uނ iߦ CƗѧ}oXM{!<]r?!%i|)zRL!ACSgUB1?wt]~#:L䢙&$NSR;E~TTzsGbqaЉ[Pq*ʴ3%z?櫽(iOkL[WR4U }C:MR?=y ;zOv[{ONrP=aڑ#:za=RDzZ]:I*ݩbxD7UKUJ:w10旋Vi#!z[Rg1mry*/) 8ԙ(^y$>,Vo=o: Se9ߓ~엇k_1kRMLke{+IJҒJ:tG}|ӑ/O} ׀$Ý5Ok'iEѾCctnTz_+R5%T$#V&ɺGfNݏO/~V;&$3*.ryQ4U̴95 (W[Ǣ~%LUC\KbVu):)? 4=O[_JoH_j\Dc] D󓑗NARGmǦf{)PWWCUSɪPIpST'z]HUщN|'i?ЫS bQ?jj|E jD7Rf^ 5ȕ|)t t%T$gr3єPh^UJLڡ]QGZ[3ȡE(|ߐB`W`dB&Gl7FhwsP {"'ɨc2T :Tu/]aJVi`_6:H_jPVGwU7M##>*F?0PGtIhUN~o!U,LkJz֏YZkGKXyF4ِ+UZu }$&ErrQ*_B鸮 C"`wF~&&"*}u _ ;EJET5>P=&㢟BLFG89k'Zjk`Pjل@`EDf ܿaNAf|r2w1n~zCv bS%;6Ʋى yOfp-^H$+{!9{/$!Ӌ&w!9ʭI3?{5fx2A$WFJXiyF}qB@kjK 㚀^ =6'7֮+E6^_fi/x Gp%O(ȷP#Q 9L#]`^,&lҁufAļ/U`5yB Zӎ'-aLw | ~y"*(Z2Jh"K# V蕞O|L%$+Ȃb_$ʐƣ0QFiJyD$o]C!AmvI0>Q(>oh@Vߕ |F !OocBx耿3]ġlR7j* ãf6Ss[ wО?_Zӎ: S:{n`dQĪCMŕW7+t.4ˤrL4ߝJ\M2lpυ-6սc ȝ.ߋT)v\51WӮN?&Y-ySH6l;-ҧTG{#.`vmNaT@_*矠ԛSuQOv5lz 0vm!aaH-+o-:Nz-Cl+s}4X|n0F2є ٨kX$8+<_{Q 3n W=e8pwr4b V)De.zph }y.uT!LNeF>5,vbRIA;yCYx WȝDŽ7RI|#36 VmcU.gOcg:Im"O1O T an{Iq+)S!fKv ϰ1\kpнKIe8<%s wU D1@y)LWneL<}8*A,CI #bZ{ U1AnCkcE-\*Q|@Յ@q]ɊWA-WNG.[K,WʴE!4n 8'\ 2//{#I JӄA=kz=-,bx#(+6?f` {(5OWqGzg]c_O! 2ulߧHFሂnsc!h2ڣazmČȈM 6iDNΣ&-+ZyjpsItiE[6x- 9 ;1 ]_n$<~y֓̌BaW֭ˆ8^j [x?_L'SndA Mt)~I Ocs@](2a(z`-GbY T`ÆcGPr'?ϕ:kU;嵁壦S{1;r*`r-הcBE"b}J)c3)'rx,i](E,Q=hJ:7[ V&Ü# PWIS`n6mwBSv]=u \]1Meꃵ$1nF%GlJW Z&$X-JgCl@ZMDIJ|ު(hx- 7tK`^J|}h~ZiOIH3=οhcZgFYd0pFXOGՓ& 6msFL-n{I:M,dn/ fIZQ4ʵrƻYpJHEӤ66e8ֆᐦ{1VI6Nԭv vzU1eul+!N,[eU *߱YP֪a!3]"Q^8 &F Zxfy@42ﮮخS*vIkr0 ) -9h(8J}tutBɿcK*xS-透 l72nVY}x鵘⎎iC_ҝڜ '0dI-ET iOcIڱ+& 2M|FP@oqV0P0fKzZŊ9cn~l'Ӏ )IpN99ڜY%Lcj]cSLys~mIL4$g$xvY:'J$WAѩήc-O"+yKr}Y[w|G?+puCSщc" ?Zs^9u rn]-*)fHXhA/gT/j(HZ %KQuF cŋ)e_iH[ Ϫ׃we"褭x ފĵ@/<7*ٍ\Ɋ7N jVݢOViIeU`:aۈ2hk$dmbI# ,{jC藏| QNE AޥmN%d+1 >";6nfb[ükIbf\*@j`0tF&Ǥ^vK EW0 q*X $[FS 0q`U}@f{'m^ϴDe@( {w(޵34)OpWG' &7>ARlV3+l-@n+$- , 0?#pvXY_ (M; LM҉ϻW' Q=+Dvْms=;St&!Ѣ4pO0eύT.Oc6i)RfDK!!30D>fu!3Cwy^1HM7: <lzw{|+/$0HŔeFuKw5ᴹ1;Eѕٴs20S qdzUh '6[oc a^JFssJm~8 JS櫥1 Z9yf*'47M.0_`kYK'R%MScwJ3Z;Yo)u#D$ p:U[%l.EKc? fJgr> {Q0%Y" Ff(+{%4eb9i͘rE:2qlkÒ9׹G+VZqkzE0,\ZVIi`*&Qdl%>HmL.o=K2!`5plD@Գ;ʅ}CByMZ2q6Ԑ·XG*pܵsΉ}IKlɥj$X]K,|=QHpYs5%pW2<\og!ޠm1'HqBV2mQ`#k1^]ڗc{i$!5 9R˯AQoإ685&uf B;o/ru<͈[c+M2sGMF1tVS!~kSyd\ wdk!B)> pW4K {Ym}6RBT蔔0)͘5FAƎcxå5zLuLyt|`T 1Ύ@U@GH+Tj \UÉ  6|~A͝z)*L$*^ѽfߧK^q"d;F(a6Uhn^__u;2% 1`j2gO|l܌.ף- f#R1 Ռ P}-EI`F+C+}F*($'ьQV߽Q(ha`Z%A((ӓBrQ^(|L4,n ܆&S/]lL@ޗlyXeUJMXh) )ڤ\w otl,ܹ\ZǦ/K#aSu)hK;˹ec_3ڦ 94)C?5SaekKqg̣(Qt& +* a8wZZ&]CBe"o6‰77hMu˖7)L3,-0~ O<f4Pqr[sr(9)c3]bj<_ݎqzy8`"+H8lﳢ;Y#$)׸KQ4#E/]FA\N_oRN}DxKIP:M564U>%2RD-$/SʹO ]ܯc L5El{vx|1?7,RƥK%r0--~/+彂TY,Rl\ =SUݒCOjN*mx~u0wte(o{,QSD*>Ï$;iY2Ӣ&+ĩf~yO[K? "`޲mpELo)n?$R@k1 ,>zFKF ݁ψNMx5Á|c&9RC0h.&$|#ݽ^oLv ݺ..Bmn#op]v($7qIi7sMzvގ!_~hތ^ w̭l .33sRgl6771o~ }!=r<PpDN;C7h/2t9w8Rh}&rAEğvbv[H/7gڳb|AA%ͩdTt +6oF1[C}D./]/}i/)1"藚m9^І1Zt5Lv@A5򅞬[Sh}R9Cy'osѤ.a{.`{3N]7mڎ7tZ;`mӃ{ ^ ;Ũq숲{Sm"fa _|QY34)0hyϳơXɑ~_+:Ql#E`3&1]HW,_vȣnWǣ~^$ O'lMxl):RK~/LP_2%b˜WȈK.:"^=?o%ezB<_" 1'pM쭻߿rЅY$ 𓼮@fk Xh8N9#P2AƌΈH98*?{F9&SvMEKUw'CE|Š'u.609e,Wd ﳇ`I"gt;G+N~!"OS6vGF Idv}rт= 5 IMgNj:'by~l~%Q YMGFc2mqn֌!g;0ʏo# ;mn5Pўh \^,:y]6 ɯALԖ~83SVƁ.fc`.e"2G|2Pɹnzcu5f\+y k&2 Up9ۤ/K~7w"fWNc9Jg6y6%ЮۓbWmKF^b(1 2K+ W$dAفfkO!0Svrg/ MV&<"g8l)X &e* . Jg3\[&HWղ"n$xfJLq%y$?M~sbF"0 xfaHdDZ%3KJ̾ظ%?Cf>Z6m~m何 6e@iX:؄j.zoA YWV.j<uC>c?Vg7\\FbL X3+.#]-PL=6jI' v@W7zoeò lWk_Y1;zU/1XΥx8:oFHJ'֩\9 8*|=.[ǻ{Q{S*RU-y/1KcۖO^Va'g o3||GPs?VGVR X̼DK6yĸ{[Y} qpDkvJegxl3ĕb dKPF1։KtFg١,yvh/-*[YJ J7ȥ[[7S.dp4y"P0v?6vNX#6SJYg7jZ*9װoJOusj|a,VgxG#RnfN3?FۻYw ?/'žZvX\%s]4frn_3 Ŭ $yGGB 0tdQw>:Ǩ@fN^ uh/”l6Rz@nPb Mi33`A+9]oJB&3B/XER{nrfnۢ]rO:>l8uhÓp| S c:0+Cx}apIXϯ4d\^!Nų` W3O/u>0Mbꌗ9[ 얺mk?=KZ2Ӌ/sx\y+ 4g2{yW'XaX ܩ޼v2y!|܂ 'ȵPV­N/q0 s5/:= փtuܓӴ[dDGrڽL'jً)ے(W) l!P]\^D XhX@_f`B&ݧu.]k>l+#W5q6:ZݎNA>~kagggI8 "iUI)٧j.嵾qcf ̞ßtb#:et>c1X2$Lb OY+*:Y44wۮ^Oxm  AҎHˣť3AzJ*KudlHTs;kxREϛp+]wY !ҩ\-&n:Q`-E wMjO~^j1P ĵ H=`L3:4[?وM2Boj(?2-`Fe($~ٙcOPup.. d@Q2?s eWLo(M.0,{2o4 w8rbSujs Dk[bo^t))hMI#mGU<~! QLX=˜u_/x ro!x/wr8ދ<foJ&yf)ce,|;,CAҤN+l p70, W ccڲ2@3Y~&}&pF{,|l[:QN>Y\ULzwc@srrIE*Sw*L:1l9j_Srs~(&dFcӽ"1aEƗ$|ӹ79Wbn ;yc) Sg[[+$!Mr0ڍjVp*8^R2&I^⧛k*N naEۄGLCwiW6 'p+k$qR6 E[E*Oف@~arQc_qiѰ?-KbP+PK7=eqSzVW :gf RRG%=\kPztLkjE}txd$g\j/ePzGC^-d'URȱdV#K A=KoVF.t3`y ^j3,&a[:(:4v HTRa\(G H8I7udAZocMgPA,?h)f,_Ѱg&]jxr/PUqgÐk3D)GP!2xO\8:ݵNV4!ӼJ[꬈y^xE=+s (n{9yk e0TR1) o)҉W ;Ke&j0pCsɫɮ ^ b縨&%ZLM|_gpyJ92A.[ Ki$o$ޜQ^c\/zDS[WO +{7x|w@k,!0m+mxJmwΓ{&?.1uz\I=m^Lvs?/f-uM D!['ޢ4|T)'xkU5gɽA܆p,8&<7̳J#܇z3aeI3#AǂKs#>xT^Say 6_ѠQnD>+q"=kG RuZϹ!|%!:o0 S>tXgJAZ?F.zQiQL/(-69t3_۴Ȋ~@Y%bWVʞvAmRthH~~I:Fw3RC8foZ?Y*E,7}u2Qm7?3,BiuqTݿAvMʍ1(Efͺ o13coc6ߋ#ChgD{,84ZY :_Mjy'&wok }H(;!XC}1I%h#"RvUT!2 X?${ o^|Hx"Ub H 41\ Mʝ!jWAU~=uB)>V]c - KB6ijg"iz xx,U}^߯Ԉ. 6/ cF<C}a(FEn ѓLϢ#Ib Y$t*Tg98Ǻ=0ػp~z.Xc_oy7|07l`eFlw[&1#I})ږ 3J2~l}|;xFG{#jV~"ejMhGDi4Ѕw~JJGلĚ0,Gtt_Txc(oI%|Ffg~~2Ӝ o={]ryRj]:k-HRt& KRq9Ke>99+4;n0jν, Gfo'bJ o(u4t;ﵶѾ/O+Ղ >(Q?T+_"gbl:D15q~(p$gh~, 6/0/ɡ򝢢~2ƃlCKk5zPUhK2 _8I֢K۝>DLX14z\ԡGT'Z)rQ0E~ 7<=a6\uT]{?۩,W&ʅLJu7iC7rrêV=3'w]KWtFUnqg 3:46gSttء{>0c p ߹c ͸cHә7K]ՁC8+ |\b7~IK׻Z?4z{лxMҐ0 \Vv+%8czft:cd=-;7gzG2NS8Lw{^㈖vfo(va rJ@J2vɲdn9=Vg4 g@lR ћW/x\toga@d:S9&fRl<q-7kZ{JaD\e(;@L)(HYCmn BW|?m|L'(43le <]R!pwM)@ g!{OZmE<&Ag>,tnr IGZ Nچ5T=Ȋb] ] Y:dOܵJuɓ:&ϱ)6)РagLy!X%l0MhxOy O] ]F}s{ԛ[ynyAOze500D,9eS+OVy/Keθ2T ˨|L?p' +¿Bͫ]ҸW(}VYqd!x1eX cJVf8b䈾0X5RvENkR' <Z[agٜ3a'NEb`wӢxX&G-̔qYUx%YrNc-R*W,a]:OoΩZy"]N v+kDUyu؉᜖R-O<96滗e؀F'LRtj{}SznA쒷:DfvrZE+'qIʹ{P [P ,}}Rs:lBv^ 0-.-U h@R Zp+j&e]&V2@}xnhGHG/\ϕJ8cb.v= ~{33Vye2qړ5kؠ-tꗮ:}G@Ds@PVVۂ\p bi} ,Xщ'ߐ*U"8rMu`{YUae8vCZmdO_5qC(r2?uj Y6N Р@aX-!jΌQ4ckI1^lJzNVб}6mb_!GWNg'JF;YN}5VndM5uѩjQf܄$*)apueMйg6XGLN f j+) bb  ŭ\mylf#1{f}3/mEDCGMs"X{ZuS֍0C+"QfI0:P w#/X ^`:>uk[RLm' a>]aDzZ*~ <+s5. :o4z?+9"ow._!uIR_9;k/hyBMJoOx._M|Ob_]*bvv~/0Zw<!{3b'P (_XTkp;]tr,Pe#|]/"1_BE9}~Ax!$ɛMBDR|^|׌?GS_Utop03 \Z?!> /r]S[%@L ˈ_&fa ؃@}?QYeof2󹐝ehXۣVI'g{cMnnּf{!A 4f5(n 16 %n9RQUis7 hTԇ)2.FL!|$H2|iC)Ax -׼MeLG/CqB~E99sO@_9K،̷!|3CHN_SjSyDh,X0[/̺?"ފ#]xg( ,=ElB--~P}{x' (Т!OJ|nj!#uqyJ5G ~׸y.E)}Qv}rMzga^T[`DT 7[3rh!B>3^ 330A ow!'νԛon?c|:2')viYb)s=+oȻQ?TH \6HC}]so0+.Ȩ"'L Al"zɊC~VaZ"x7&@& ?)RF&$zkW0b{hN?P6'4[R (/*Pga=wVj!#|!e 2 Ie= /Sx}Lá# y$t#l,{Z;!43v0/0[_0\ Q~BdBy{O?޽|{;o9G$52bu dQ׿FfVCE}te !5MEyD_4&ϒ5w g (O$ӆ_yX,yuh!BiX}ȯBQ ~3Pshᥞr~P_{t"#y*z |~eCJ`gD{y|4YҜ!u,PbC Aɖ.cR˟\_[uQqƂFZ"⸑8q ޴98)TAkOg\nM H]WՃ$AW/5{7Txa%mOѐ&Oj>EPY)y!~0iqW˽y oi>V_mѥ ԜEt4j)*آ?R3f-J l7c{+Lc bu2-f4n{a2A%о ė/~dPt9%3`F/%ߡ[w9& a{U?T^.䛄z۬L ϔa!)Bxa她]; fO 7)oHnO4Y9k8Zs.2ւ)Y_jȤX X 9QC{=LVt v4jǮQ!/H{ qs^g:)(Z˃Q:% i7)%HV 1E*SA@WJh}=1ӭvވӒCi)KௐeUfT*+*umuxk Yrwq$U-M[q)T4=]"7P8ǮX]/c$ɫQLdcC_ZP)G)v7l={KJ#^hkH>:OD~UnfWW=]Weヨ;}w$ܥ=f2vAɔ3p+ؙfZ& T^T;liI9&RwPŌZKJ3--T*阰dJ%Lf[F.PT9le&%J2$42ũ?{DR3"F72n+fbxP'; ˢTUHeGKSLqQe"[.P*$b*LYZ3Ty4jf#CG5IAA€&UN8{Z~HbU(t8wC P-29@#Pm,\$C$=kx#3o7el xNdti4_N<>jY~l&w#4S}qtqm>Gt08Iqj1గdEz13=[tVmdftJFVAV>~ȀWlW͊Z䪬UFVNcʝS0]fh(H,D:^)C>F sl 2( ,Je##y` 6&g'Rz,n>Bvb~49˥]}@!Gg 0)_W+ɟ8nmɂv6@ 喵V#ilƒƗ1VK*:ש~Dg<L0y|q%$1 *# ZˡWfM Ow򉀮e8Wm貅5 iv]N* vMv^T%Q CdC/r٩@!XQ\^"U950r( BEplG\ږe{|@Ng3ۖXFm4D[+ =e+,(#KiZJUM*wƊ 1SQF^,IW-L\ѝ]6,u]o[. x`ݰSS 5P?!啘9ثx+)3VX pr֧^ox6;t1CǍF#DRփ].C86W;zdųjB }k/@e fAY%p' 7x|H` tVFyvK+eGRC?Q uV<ъs4[S&"ɛEe%0J!BH@Ǒ{S.)o:HX)![vh]ND˺ #Bsb{f~Usiݍ86"78O{Я3H6Šdžc.O1>{"߾"![:"#Jkh+q&%Q@F@mx(F ]Jy c\ 5eZT ;5#np#^l7W*63Vμ"Ыg1+(U0*)#GmH,<y )*G0COy5vȲ\g C-av WRZ'Hf[~y.gO398_n13!e#Y6=y҂WYq͏[!֦I۰JP+E%@fӶ r¯VeR-P $l'SZt QAlCnQsb ͬ1"y%cnzp5֞vm: $!yѻy rE g@pu"\UFL/&~иP\9@Kc+WsX~p)v3WW2֌"zI`_-TǙl v6:ȚNs(rO>g`B;W|9(v+}Iac[tg;(6 a엪4iyP2!YLaB o/|Hu(w1L=ϯ݈_tА2lRMpf 2t#˅H{B N2?\S0b7;6i'V-'@Z*a%'ˀwE8` ͮ2l)@0U=jӚhBﮑ`Ab%3Ajors"@ _I( ]؋t"_061@s+G]&w^ p2%$eWҔGm{%jŮ/ aNM={Cyk5n!-QDibPF@>4g,1i)߉سڈxB>*NUn@/&1uJ9\G2fy{/u,O?Y O?84žd'H٣I 6 uԈ9TztؑIjgB;eڀ֝JGD1l@ (^n5+R1Iz78-;Ɓ_QZˌC֒*&NG)+XQ5)C @vQv=lѝ~q[PlSE JȖ2e sH宻cS=8<,s=&hJ/cm]) bv`ʹusK1Uؘe ԯ۷C,d<:oIħ9uL01[42C,à/J5LXu 9B2u BP&kc{jn.yTG5^}>oJoV7aRb鈡hD9YMnA6 p_ @oyj-BP R_'CŒp"aܙhNbX@zCJӐh?SYTuQ XGtx pۇ|/1za&J1)ϳ^wct3cRB/<.3AXކN]: lF?%:+qwQҌs/v6&#JK%R30+f>*5|l!1NǛ`~\8R;i1wCeD;ʌIKkC8ק_sKНG/o[~!Ս' <W"4vqBޑŀRVH`z1DMc]LtV8CV%gڌpJ.%:}%f6| _^7^`s@V$Y=&0pQ+Vde7?OSw=o$ vcBM ` qI[@NKK͙8s-$yͯS8qDa͜7iU*ZaOςm<[#l(PBuU=A1wfs]1]m?'?Yb.NG6C5n'ՑA=GQE^OȾ#;ga&1,Y.9AR9ءcJ]fXWol<ƾVlItxa68#s?dB扼ba yZ@0`KDUƩi<1|FԾtkŨMShƩpʱbNL]ϹY6|KZC&Zf[&Klnxڂ#%ǛSs'i7y$z3q|?s4&N5[DDv4 ; zy¨R18 H3 sjcSe+׳h{qjf ;Oof<.MS2+t&]-m ~)rByqzP3d8!Ju !Xó}n]'gtýPe22u`?uL + 8leGOZ%j+NK#PA~ P1=2 /DaBiP]E#=ܠ˜1I c,;,zLjly "x)]_<)w`]ICzΔ )i!`ݲ}8EK4 RPƥM'HyƋcC2;Of໘3n0uUtyB: ,~w;m1 5z|,17ܠ}s61M9 :]r7O_,⷗f|7 3lIPX\f M~TG_orӿDC:+0?Jns#2 g_')3r^%eed ¼-}B? ߓQn&xTf7h'L"ݫתU]IB6ӄi4'?9.c=/k_НH<V}_xgf$ z#|5xx.D.Bɣ%ok``\RQ;x訟D{b /C|70sK;9|EyB`2(<m߁騢6G&IR 08UCF{4G3E+FC~W^xo~V2|#H"L&,0QMIͅ%t,'15󿶟懮5"{r7]S1SW|ǿ7£M?czmNOvB q$MSyqIM.AB_O\|Dzmhȩ^}EzMgDm>,h#z0*m}Jt ʍ͹PȷY,>_滁tT֡k] F_Wۻ7xKV}V  ҈@4Ezu0d|]COq4/$X>?UPb4hh^HNޯzΟ ۡ&3alȊ#J9z R824|I}l1)K I6ߑ}1D Zwb$,nCD,QgGg>؞{a?g" $:O\9T^6ro<5q#KG(*$,J(K!b~4abtݐM1}6׋8Y)Pb/_&Yi:Tt^%`8VDHĞ1~О ( OFHaLSEӪF ^~ˌ[|a{H +! sxt髞z![tMF}V~/}!k M1f_,PYd퀒H>㴻=YMTt1 ! |>a3ePur#XPϱ:gy0˧x96eGogwFEAfDgtdi_]&?hIswgΝS~9'뎫ipG85"Q_Tٺ[:]j~ƏE4i ##5p(4%n58L{F)aկbo@i}+B&Ϊw_ D_{oLLtS}o.T*\v^9&Z=jrSank[hء$sL2L0V$KIR&AAIDVDm!A{gyp3$c&4н1_cO)ScFSUMׄ[@J㚻iۗQfQH20hS]|Rץr~%Si[I;77دo.K{?eb iQQ/OϚ!f޵ho<k%xQ͐*02D|^Mr?{n;Ex_Ӯ}_R>їC}5zBIHzCС|!Q/VVXwؔo7=b`ˢ5Bq(VQ9 //-z@|985+GD[5 PQ1jHG-=D^}yjkh7 4CתfR@iUGX_W4GڙRa@=}e1/l`t11,Ռ%GT}|KP͈9pF$Ka Ao[8w~5)-,|Aؖ 7p 5cͥ-ӗ~SLR1 teK *)*E&(3!z i'G~eAϩo57_7!m+<>m%°E 3x'xu6aWhWIU5hVڋ/d \ah?Usڣ1u.9KMR\+1xakV㮔j14֛ԆY2r_Q3q"%K#" lǭ@*#P2F8.L%>)NE'p-}ROKhMvPR^_Y qW Q`<0%PMR^l8ۋUe DLP Q GZ@ |OB^8ҁ7^)U}Ӊe:DjA岷~o vjk331 e G [Wrh zqバͻ2x\f6?ho4Sܺk6-CuzAOpDvR=rU45aK[c)@EPif00.#(B#v9 N0fxOطCNkm}wJpjH R17"LuU0jMa(C_)pV+2qXͨgRc*gFJi_S= bиs ٱI᚟w ;c=L$pZtK[нZ˴N>r1+crz HHvrIbW[Z6-lbo=*??W|ސ9xUJTPT/i5-wjLPYg\:.L.\CM ?]!(RN~":,k{l"Oj5`3'z"r:ky(Տ?fur[2mkk="ˆOVS$L!i!^ "_7nH){n6({>?V#^]Ո7=?|Ow-?}N/O lNq\m3(Bor<{PRc'O)367`~rc)?_Y5̶7O?;B~dǕTu(ЁǗ> ~nS|>1%Bm|5y{.y|GSVawR}WGX}O,%o3[㶷bj]ߕ w~vDt]Ό~?L/l}i\d\Kv> k˶rG[Z>M>VDfJ}Dϭ[leb hh)-suM@4TN`s6*• L܀Ts{4&<?*~L)W再J*(X=<:䫹RTوuPҕߜy?zϘj~-_He76Y8:~:/)7_BCb'{^k>+z| mՂqH=)e\$,Xk9OS;6`:{7hSh~*4hz.#-EPDx6%5F~/4ٌm(\KUU` $[Cj &;R-t c6:p%C|*ia 6EeL2kū61x)tW 49C>L(#!UHO%p`}X8uVJH@8Q4~WUՐUJvbD`( yVU׫8rńd-b"6cXDXbZoF8w$9ԘVTpm9B@gP,qa+o#iU#tZOn^V%\u!eHƲRCn 0Ci\^F)׃a~K NWB7@](_E_^}S"#HcBrU$ ғ&P;Tzf(b۱x0Ll|j^ +> l :NbtKvmNV}J:Bߥu298v `<,B^! g} V7B'21zI&`_iscT1mZnuY:ZK+; =ܐ;zФZ6eRl.*YHYMXz4AGJ wb*Gy[*ԺZt tpLZ+0Ah]Ybܺqxw[S1,Ja  mA?0xv)r G1Ow hs X仕Lg-B/p r&U^7e)w]:Y &d^ha ::E:'ҌN^UjP_ P?"dr*+H~]KlD,GϣB"~g۫_i00fJDĢ8gaj5bk7zj1`LMx~s3!J >!&YE\0}4@ۂ@"TƯt1z8ؗ)sGc6 +Cz;g*2eƆ.)4s#FjPv{{K]¡2e2el}Ct:, !)،Fkk YB7S!xir-b(r11;7}\#X05"3 Z&2:YJbfp]܌{,KO8>[;3:4Աgv.Gfyۃ׽2{v4RU:k2&U"><3*m|`upy@p{%ʙ"D K/PCJFkmK>/-5%6oՂ"2{T0 V2'%bC M_ַxoZvjX m;57mҫ9=*G>7D+${EӮ?yt,tp54cc c'vF:mY\-w}KiG:plڜFd2N%'cUo'bi%_3Chj# _*[Hڨ`v2-n8&|WE/depyU,ۂ0yRJ9^,:cӀ^BMoWaERs֒1ST~Hmɥj_ElQ%3p3"B?=` m|l? kLsDۈ0-g΁EJΙW)~ y֦ JJ؎Dk)5? ʘ]V,[@]ҙ $A"JїanV,4=}G2'K'c{ Ξ@p4*V=MΌ)$A:](Tqop Wat)ˑN݆ EQ\Aꭞ;꛱@ NG9 Z>NXJvYj+AFөjH=HrW  f[18%-iica[ٶ ĝЮ7mM}c}:*vaFn~**L] c7A0 x2{6/nQV[TC3/a&O\LEOP 9Șn9Brlhƕ@ɹHf#!3/5i*oNa~|y b·i]@S ] rrqDnpVfʔg FLIy!PR'B˳,mnwS]g^%Tj0#/Lfn*J[]E0yfMgepio ҹ^c$pr"ͣ"p֒3Xk@,)ll7l`xPEz;Ѻpnޥ,wr]rgUbhꯝT;veTw !77Ic*0].C;JNR?X'ptOFOaq$+eIf{+lHĕc7tqs1OPrRo.,e]p/IF?> 剜ukCzIf(LNk#?[QXy{ i|$(Y12}裔xJ%.~XR=!gB!G*eν0kR7ުS)9ªF,%#W6 f ЈVlە׾D@(Q#0/dj.ͫ&7+^ ݦ= } a<?ODpbHV`}|up3g ;xW< 6եq Ĝ`P yGU U) )"c {P9E\i L(6@,ĽkDMQL@W*V_ 92QB@zNё ڦE*kOhkAmuf4%i$!'˰YLQ͡MףCvGKzCleyzvjæOFōHVOSí),PУ'g/1Dt&-9ddV98/^t@SiuB2^MAq3= `\q1t+xq/z Y18 NkŖ(rc6xmf2Y >$anFD.S*8@m!;EO?3$|mj(,eĎLx5f<\, 0+3n5[4GYRc4L_ְ?9Bs\,UXkMK*/ ; ·9ZB\.#/C6Ӝ)χ W`K%vFG,|ۿ L^ЭY8LW`o>+An-wKy?>R|JrO6yqý'EXmµaNa'ѱXF˵a۸z+Q7_ӥ9'{V-;te2t}!߯1X̛ѢЮ"Nutm?aD%<}tNKS*[.gS/|T RGH+j1:ҡ@"zHaۄ YSLeu[q(<|QHmv#2U1BBcm:֣h%tUx@Axz:ڗR3GR?#xOf/^+u&Cv:˸7lj_ktas ǟʛL&*i2vb6!N dbR 1iBhyra~TURӒ"BJ#Va=pN;)iKrV3'R_AҞlF]\g&Z$)t.̤BeA +!Dq**U6҂c>i%̆\'=h璅C<> )36h6Y9!g(3geZp_vnpj e|8 ح[esg .(i/%&rsӂ3+nZH|VuSdp}jZ qE;Boe=gՔwϑc6=-Zи&;ox(4K?)CuJ-ҔtFVP(%'&X)֍@Ky",i%[ߩ~{-w| g=@X*O=Yhv@8hv\W #Rxi.WN4Ά&Âo EoB\f?G4*\'"xKȠq[ިN@NԌRi0J^!p+ 6KLLQ@7rJ%/L֜hcw67*1x$1l7$Mm\FVч+QzL3@ooqT`^&rxfhj끾~.Ap EXMJ@.(RGb^~ yFr24rdd[e؁ֺl'h'f2.#`n[%| [90ES|aGi3 ?ҝ堶IorRX\eΡTaYOBVʝP3!#B;A},tL"RlP? =SVAj0A +򫒬wz&CoJZ/ (]7)Yڂe#@E+kITj\{*^wV;Ue7?|Q~$ dM:lUCmD7L1g-UX?b='ʰjx'mvpHB57H2UY.öt')}}aw܀ՓH䅕TD*Ri % y+kXE|{ ʃ٭q, /IT(1pmёT$I9C&/U#RiĤKiH-|5J/_'%!'3`cC1(/DdeƊAɐ`E6G"C#f~:;ns̅GmuoWE7JP;W5@Z>gCuɻtZ&pnhz}x6 9@X}.v(eyַInܥ|msMʁQ}\*qnXOʅTu$ Le gڂvӋj_Zӌ ",!NI ÓW4\Ϫpݦ kP]d.Xyٚ@*٫<}ٶkkc"0e/Hh7f+~X9>8ìcA,9: >]+٘NKJW-I@-wT8O RceR8?0wp9M  ]뭇FL[ vV$isű:u 8zh@.!z>l!GHԑG$!b&,L @prX|؞(E}HBݚ?UP K5ŏOʲ 5i+؈=;$0DnRuZJ(s*ZUYH9/{x#8n^QmNKӴ':Y kDig*Q=qkvc^mUb0F>ϡ_Ԯ -3,9?I}7 P8:o3,F?o l틡o딋4`11]p؁Ћ=vfDZ|_ݚb)"]֝դ@M@B@Wߠ}@h~)6N{7Vny.̉/<:l)%)s=E:i.-s?Jpbh=c_2A֯bL7i5{v oY5* bn%իdW߾5m8 ߟ^Z4,Hiڥ쑑q;lׁe/շ4yc34=e(ěFw85)Ydٝrz~ I#/֝!4zvZ0k~P.zZCz Z?CMfz+h}^4q'YtxF19(䪉dDA!5c4Hr #Ԇev{"'SF7hQu×[PXD û LOlsʽ"9Dϩb["GU ;Z;0,ӕ؆;Ś[9k,4|c?Zͱ11hn8 9HZj'Bo!kDTlۇm"!}՚)~ǒ1E"j2"̻|h- ( +5,t&犐àhȧMEQ?C*G$#||P+T@GnIv"ʻfY%PB~_`^K Di{ѱKҞTZnUS!Prϰ d~5j ʢ Qeu ^sWHW rYgh]0O?tډ"|ƅf6%rmak}ք—O&^ M'hL:[PE."2U*5%}nS~«KA]@)?iVz CFDKVEj iߝ(߯hjsPRy@#-m&0)+2S6zc~JCky' f4N%LٲbK()l(V6*}JU~MM>6v5W$? N~ 9v%[3>c33~DRLO7"1%jGO%؟$~TLCƌyuwmV/mJpl)^]Ce} D4f ,6KGyӔ=Lcy=_|ls9E4ЌɋqW?qiۇ7g3Ƽy{(k-;d/˜]NkZ),U׋~2$Q3،o]"O U3}SlT8 Y'GAŅђ|)х+,R~ئz7 FUC-\T8h):F9N9។_>a-0=D@GTQH,?bl:tEaEFO+!4 IBIGFˌBbjONXݙ>ʟk>?Sm-ۃ9@ǖ+&4?/7Iɭs?ARWDI]Qg&Y[GN/:ؔ~ KT7 E7y?zPF)[x LA + :~ӻ0dcyxE>oY8%_ q&(>ݣ&T6tiZ),u_yg,I&glTT_ffj.fKL+۸ H*/B<9( r!NZťj9J8t^ 8ˮP+h1"h2l{t ɢUPŖt6y;j()6?:U9b\1|3Ǩ:3*(te0 cH+6\uO"#Q|U662˲GgqHf J S@5.2"RB:xr{@˹F=C$h6fLwlܺCjoo!"mFZNbFτPU4mhZ%4b!e^[9Nԡ=:d _MgPڸ՛_'U%iu;o#yW7Ϟ5J-Bk= *oe/LM9v&!wzɷ̍eK,6m:9qܨ%n֔ŷ)(XF*#OGu[;mY)5?xܡ{h /r=HMУ%H^G?XJpPUD| L{n/p]!ਲ਼b 9MȇCI ڤA3ѧD42Y3А3JH< ^!b P<4cȡ ϰ@ \2 xpPf#QɃپ ][JNLvByBGDnAm sb"%+FaWr̶맓2] b(Zu*}ӲZWަ3Xӝi51ج/YAy*"_| FfS\QCf{P#hg%L "VR{g8!w-Pj6-%FB_ʊj T1{S}j+{d[^}'+ 1S_ᤣ$4u&)ai =Ӯ`\Z5i)QʤEyfI<]j%YXBtv/Ęiӎa,XIju-M}q0) h{S_`5[ p](r,2Կx)f+Šv|'Y%V{mY %Hˮ)f pˌxΈ1%E':W(nՐUBvy{ό7RnOZL$G!^9Q lU|~PҀRu'ge`ԌBٷ@Mr:.kX bK@SJWJdQ -=SPctħjRl*I8 zYxj/ՀZ M=Kn%H"ڹ %wCάG8.H^xԵ kuyM,#YO!+f 2 tz`Nrm#d 61jPiˆd-_xL-eJQOG̓XmS;48EDq9sNl~uD6NDcR]Y_weI-=B)JS$CF})%$ (V"\ax;cޮ&J_Zf1ĤKc:z,Hw%9(WUReÅͅ]G0B!m6(=kTC)0Bh]/ɚLhK.uWRX.*o &!L7Вpؤ ɓuHeZf*s 9)?Ry̍ 06xM "y*}e[Tuऊbi+?9)26߻Yvd}RYbkka}Z,H5RVk^q}1̄(X(}\?ϴ[Mؽ.IР X-,lzJb {E~_W*2bE9crDGQ^|ys*4̃k%XGƭR@꽓ƌFHӃiN’UNYb))VAnIE!$U L"rhje/}dǷtު8˟pi QhIG+kv|q^,WC$dK[YI"53$ܗ ?"9Cn-rƔt.W;eq0T 1*\䕨AXHgh$Y)/L&ZKZ'on*b3 ǖeā\gh."e?#X*[6VS2}"]!$+S5@­yKRJ%"(ˡ5ECRO J&DMrq3aH@D{A:n۞nXM|)t`v4^9l[4UJ$xpZ,o_'}Ie޸7,4u`6Ob AWk\M}zY(6\~Rw{ vZP_7m:EkA. CvD)%@6{6-o-11]b"t3ėV ؒekVSnޣl!4{6,toͽ썛SI;P 3 Gj*ss_Ot Z!]xX[~Gȸ{s:{*ǟ-qb3o\ YϚP*ʩti6j |QWS]h0sMPD2H \i8;'݈,Q84UQLZJ6Veř^<|s-m-T+Bm'7=RȠEkC!!';z;25 %i(4% `NLLEh^iJXJh>bKeRcc-麵;x=uK  kpKYQB3R0*Ζlvq>q(6٧]yg{:alP&AObJz`M!9D eSH|)6loL0Rͤ2L"aija09W\!|t;'AW &f;}3T6kf|7Ck Un&2URydy&[V*D0[Gξ%'Q*Y[ vPʒGPM RT@|Brf@A%$I=IacFGd5TQȱk `ߑ3Z-][?3* *BjBc>=xY6LPBYӅ*>4WQpPÊ 2-]'5j+A40}AAٲh'y*MN5ڎftW+ԳA,fvf$j=yk3ih~IOcj(LY~a~hȸ3W\Q:>*|gzA;khRaDgLY Ú Fx?BtcCBENoiSZ|GEʆ^ aWb/ ٣`1ÚEb$ Rm)ODl_Ngbo4#y_p%A'fŵRC3({BݷYO/d4t4vqXP?rM'›yw^14FYVVIVqtUhu^[09tQ8] |&}4duҕIM:O'kfo~8zM ):t]2 db`/TW|?4zs))\OE9%߸oZ۾rѽ{{>5~R\n%U!\bqƐr]3h3O UF%XLnh_N(~?L I/62kQNuhA^*ւ!jԈ_AW,Úf́L!CMK y0bxBd2Z[ )R1~eup#"ݙt=zKs?Y}kPADYDf1Ep FID;*\]L%a2gD_._WəlBHI37,7e'",`~cZpkY'y38("/)4H /4[^rS?O h"~tu${i9t?b,Aˡ8 Z5_V|331wV &?z5pwSgh@NP$oPדpN/Dji Nͣ'Lyf`3h߾?~J Oߠ~LC*DW, Mc>|ٵIq7c{6)+ %TkR(@gOBESq~hXhKCѕκ*]]~Z~c"s"SwJ= o@1eJϖˊ.'"?z[qfmL叒~q? $\,-ﬤ'ިjܩq4t+V(Ru? aWfC':;9x1zr 4rL)oa/_AZF58Uѩ~J˨XaN.>T|߉^r otG$k2ԙSigFie)^?u8^Xݭ4Ylo/ak@fA5VQpSP5wjZƇ@! jɄC daf x/TM* h&=]Q~[cI}&eD$L!/|1`$_;IKuo7 x+W̶AloOg*jfDbfUl͌ 2Q9fuP2CT4pp ePOF%,ѻXwGr-vdG]Ri;vDvд 6h8cZTd zqvEM$8FXQ A7̾I 8E*!1n&n`wsMH ؼXt[QzT+,.xGk+;|I~ƨ2Nc[&Ɨ}M<]ߦW1>79Fv#&WLu N,wS("h((FQ  q.TxcYK)-77L&f'';ttȓUwluBt28meiQO0fT5% %, ma_S,2Lܝ-.3IU yxB:gaUӤ]J֮}@n_-^U^ 's2ߞ+l;xT-,uee]e|`ӫ{m^|h 2~D,(\i㒀c Lw{C"iUj} Tf\/XL\%Y.lUgZPvIaSF;HHqkqZvqH;ʕҁX y((An2Թ׮XΕu;CY'HJ ie5_:%9:3 gf/vlZo&̀.OqxT!'f:V.`]P(ΪP2;,y4r2xgʸSM:Uh-N."E1fȣȐY9X)gmWхٮhOwFQt zj pš5YXt{$BwOZ: [t/:XtsWd:Jg(̝؉GH t扖3hbHaknaB>pC.oW2%f7ApҤH=-j#)n >'"/p@!{Y.=:LYô߃ӂ|Q|G!Q3b;*b Bi0jBrR"izoO" OgiT76 `8#:;aZ3;GFXtTR7cq53k2ԵDrTd+ΖyrfS R'Vm44e:䡋5ƫ}X^!z G53Pofe a͊CУ9'Uz9mcL| bdmbWZE2@!^3OuԀ3ꩠk.NSdAAN%O7=Rޱ6MǞ(h4]HuɘqSÅuv*/ҮsbMk\d|~fe r _f"Tϝ#`Le1j'"l݉'Lq+Z1էATi)`W$zt$gH{?HXsX2/*H P0hTMq-gumS(jX|GJsZ&@ar9l~ :WA SG+sٵ;緟neț,I W2DTL1tȋGs*x{x(,P\v]X'm 1.6$0d n\򥖐pc;_j''bAk0RNsT',ڦŸ6|>= ?b{cɔp0…voXH'Kke@<9Q_m7S[X(P0#[)*z3wmf0PJvڼc’^`N hC$x+8M$rk]zzzFQ{\ q #>w͕⢿b8tfp-INrdlP@$\~i9 RA FA:Bw49+-i2aNVŒ b̃V"k"F!TD$ N`_f1gzN3n.Yyn:"+^N1щ/E/dtΖV3Q2~j[RـD.Zmo\0owqNG+{7aR@wJF&HR9(@$ԕ5.5cSIa ^hZ8`[MFDuʴ`;lY^J\!sGG$z>M#ZǦ.Vӣ̋9 ǷwL5߽.HK k] x̶g=W=5\nxϸ6;/}[hmÛϛ;`h{d&wk}q!5/`VX'ta2Ih:Z;/Ykcu\.~rMV$ӫ}'u[m,0'lGi9wffz ,Y;_Ĵ7igmI ~U͎ 2.n-c 薲;W_=ØC븆;uwP>f#K),UH%zB*RŠS6!.'ܶ%7A wWonmxH;(MQϪ"3V7\|4W΋'],K 6GCHW~^aJNX h[qDߒđ}iHfыwMѨ߻ճ@/xb;y0VOEuT%T)Zaʺ۲3^N,>S'v_qdbEDT쫧 rOa[Gnp!b@ܘ;Fa鷹4BZË B7cx4Q|-ߌ~+77!Ƀxƻ a|6x<[-%d$6y %,nZzh2۽9+* 2Le!@ez&\R (z9:{=-ۈ-4IrVzO s~"dOlCOLb!0Ոj77y<]"V7LuщMyFŕnrfЉ*nxH)2&4'7a(B'7]/bStNyF7݋%I>*⢑;~= 1ǿC yy[HxиC TPG44Ȕٰཧ\V^޺Qunzn[&>(a4yՇDur^(o +ۈRow~g[^c7/Kf!9n%WxZx4C= Z#0a^ M0ĵaTCq'kj2WQ}+ ("MY=0J_ؗ#㈫1ލ u lup+D?)m%VCT!}ÝqmQuWﵕW= jp&rx& ck]V&Wف_mwҏJqrg@4$ouuȌ{o<PRͰ?;TYyFTWD'9Sb]yOsxVMnkar<|]}bv~VGoyу`_spm"}ٜlm!O*բ)ۅd s-|e(:St&dsÙpvIʮNvuc>*I&[ >vn7mS#s.|1^tv_gB7uk2$*T7F|F{(H@p?Bd}{!$zC;%Оj_GmA NQi=RNrAN=Rx/ĆU)$@(Q\^/; KףO-%g=#Mž7mLap C,J-Ί OL#K؅WMi_]tD5 6͓G3aE6V &;FFR^(Qk_ nr9h @ˑhCa/01Wsx 8;׮2};K }Tg2S(s&t)s~F r UJt"zoTbp8HCE bUőѐև@e2 Pv[$SmP!5խ?MvAqOkȠmLy ˹!|ەNgӫ`&}'[uh$_jV bI>A5 >} ^ǦY x t.|>k(VUeu!/gjd-z"fuMҷiup t= %ŅVvNk1+gR !gY/sz\=/QO^AbcX6*Ɂ XC~A f9{tFy s^>>.G3NWJE\TG2w1ci}=LâeBoGIFLd[UK*wT`gQ|Mki`8gd#Nj%eIw mtC N2銰"kZ&6>TgN@RuA05q Yĭ~sLؘco+GN[$Wi31cɸ7#aGf?F~T8*f?TѸrfVQusr4솤5ĭĐ1$& hJF>jdD9;VCtUrXtYAJO0nu6D=ꋃc&O T҅| `f,~QkO)T`[I \g3MTgw^&_-Z$/bap2rZcd0O|92ظMm3!Wq9$X-Rld3ӽϮ2%zb)Ӏ|IgbE,r&VC-4DF<"Pl.:5JYxy#Yե ? 6q2F7CGHMߓS4F%:}RЊ j|r5rHm"8uy*R0 =@k^g.AN$^c9c+hW+t3 j4Ȝ .B^~mXƸ PE\Ny+GbIܳF-MtөPPMҴWY.aWF_KoqJ! ʙ?]َ͇SF4`9dQc!cn }#x8dFԡrx['">_e!)k8cͻ.cC.:Lm@~>KDtٵ"d4`O'!ghH4hE1kLh*\kP7U/ұ1ˮ[W$Jt һ͛3#Uz=;F /ZwgX"*dIING9lH.-~˘,ѵ0U$ǯ3+jiZKt^!{Iy/v5idѸi,`dt[$Z p5GK_fřṗ^>9'idtK3|ŁWF!"->4$cb̧SXAҪwșlIPdCyZlVՅZHm|svr42M3Wل}I3% |S >Atu`c/eږ2ђK/t4haI~(Et}1,*VRμ?'u2V7.&6?]5yXP ZqFOa&-  1$3,>?2ҨIFil iZQxs(&qp s!90DB3|ԌN.C$a@/zF_(7o.hU:oyLP \y1\TYσ4HK@NNt1hn?'@Ί׈Z҈{lv9Ҥ9ҪKJ-bK(8hW)\1| 7$O \p@ kC2R`f:B~曋Tp0qY?^ʼ*[O> }5*j@Њa{|*t94M!|hmЖ 8v -kǟUN~/;\m_fϰ #`j%ٿxEZ\YQ+/ε0m-YZC{`Fmpp-'vOJc+UAB}) ®!i 9!Ѵ9!9"B͟AW8Ip [ N}lE\y8J5J L,_m[Go,!tb[IysY_2F0Aaܔh6тqdw|LKƭgmCo-(9}^P e?dd#MQ׉[iZ|(*,>_̸N+qB 3/~c6- i th uVS=\\OKB`wtMxۿ6g*{pЌc5JT;^3!]J1^rcBkZVy?C0}7 #>mbe4AgRA"}ULt$nDd5DihV;3ԋ+#/>3yQ yR%~c}gZ7Jȍ4sKZT? L$Q2*ǿަ@H:wNwTEY[˒UTEg"8!b}sFE=–܃~8MO!:jac9O􅉘sS3 F_i2ɤZ[ͣkff}4F=FۆY3ptq2T>g GBA3jkݹh4HEҼO![!8hWk!SqŽ-8%”sM^9FW SR5+ fyg xv QCJ3LzԙC'u{ z㚪;,WȮ@_ w?Z|r^?8uPx[矿v%>H.ߊ( E9ԙS5E{!Ϙ"zfry^5}5BZvdMNJ-/;Hetەw{YFb^^){mZU=]5?'("rd|NcI+wgT'm(Q9{(tD1t38ꯦ0Ɇon=QJU">r웲} p8#g<=RPTz]9ϻ`1˷Oe{TQ"a)Fp7AxCRLEfR7R> jbID '../T;/wt{@<+&f|PT$tJ Jsߦe;)reOoIX'}&^iniR4n"fhVP~}Rѽ%LYqb,H8/E^& qGOv'[4H 0u_)5u$T\e;Jmy^Z&Z?<ۨayˏI"ZX1][y"Tn+{Jj;Uǩ63LұRT͗ :a*YtwBt .E3h3fk{JCLE/>QzZQbA=1ʲX\ #̊XϚTn"%bO>板}]9x[M G6Z?f]v|^|v&i}]@^oMɉSXD%^q̤{حE74ԘԼhY˟"OxzXO]Sh lSf\/uJԬ)U&I*Zl773pw)߾%{ךGU=\8Ajduɹз~lߋt3wx {^~ Ry1UzeO5B!iqE>ܲvN,[l=7UgG B,)'-hm[`bMo}?ٶ֖x,-xi>S*|Tm?^%;|aqra'tATB`ԤՐ Kʫw\9]5qnJA3l۝\hɔIUQwWȋl;~LJm3Ѷej k!Xwzm%j<))tݣac5 vq1*Z= B=Twуpo(|\TUckrx=h'vK@OY'&wzP*[|'jQ<˧)d'ܴهg  ĝ~3Wj^!T|8$Icv?eUӸ/[rbO%) x0.h8hRjf𽞫MbUBF?80iSAIB+{U?L[k>**1"Ns7Wf_E8E^T>W zl{#WE[U3QA,%??DWWȧer~ω*+֠()Jcl`}E0r_&şZ>hҠ4iA"-IvX}`lRD <#mWbԄ/.?2"WBo9SFC/B2j C b߻\S9_^*tȚ2}>x3m7F RZ]?˭lo? {h-GSBܭ$-s9q+a7h >il ;1Eʼa!wts \W@ˇJp\K0,SɼJNP7Yˌ9`dx:]\P9\;j >g3`aǸ3*pI$ȄR`f0)G>`GcH+hp߸6 aВѤZF(s-{}T+j]#`p&df[`7&sފ>޴RVH!*Gȼf d"1k>G[dE^'}`#إ"qjRg|[)u~j.9n.:f"~jis0 0vVpY >@z  !AhbgoQJM6932f!'M"ӂR9uZxTI p"ˠ0OcyJ=ŴYɕn@O:hW039L73`mN{IW-.}>_^Z-7Ǟ >_#20ƱA*SI^0%gSL,7M[<sXC+#$U>gs'ѝ'H=1ur"NN\uV!7_Q]llIwq vxr%'BNM4# .F!`rY x@ 3 ^QU)K%PXþ4ॎl^gU fh`ekㆯȣƔaTf&UXux-k@VoN1G50cxA+ k3Hu;9vD rI=a1%}'*gik"+ @{cY{ bO F 66j+m7-O0=7ޖNݤM;*ʔҮo짤[y>R[HmǺ%. & O+XnFƞ_p4xH_DJ@`)e"Z[_bCosC# XX{So09AK7sD:` US]_d2tC˺|HSN ˺[x tڨ*-#jxneeQϕFc~}ؔn;F*erJ_lmi5Hѕ5]l5k 1qyRGG=JɎFY"`Z.ʞʟ#9{#yZ,4VaQ,4Mv)AR ]77l,K'ϟI:Ԧtl&Me|7J!w~*Oj{z#ofʡUc+SrG5D&AVŲz[bεOyN(;YּCE,)qGT J@:Bm 4eB3ٿ,J]/޲)~CYNʼn&1|'镙ʹp,- kŊ/ `nY52%c{Iaً;w\CQiC-#=rP%G4aA]DgB+_[ s-ݶe\%QIb,0*BXz1 . T@[+Mf2[R78*S)*Ll!?Au@ 0ʳ[NHؔ f$&ꞔ`T;=|3wҢ:u, tn昬;nO& >*TZ؉暋V3m S, Cym8CYxBmS V_($sHs&h}U)=].t~:/#Ğؼe4H +{;VIxӞC\lXe˦"|<ą ?YRCbj9n7И*X-OODA5tu4&q*tbH}::c(\@}ʛm$6Nr.{kmM-I5˘ &-'SxrZ۰\ѬM-C/۟"M6;+opi^4zW|x-.LHJgd=N3و{[=) qDN,Y>ڭR j7W#Tnj8*I_7RrKN l~#9F*hREQ ~ t#ISffXh.cfWpI8f(}5U'u3ZcK?x_cKa*)"oQM0skc5Bڳ̟i:_hNhhc|m<-:t9z֧)d+dB4SFj@bcXAdI1 gѶHa̬3+2F|p GDˇ> @PĎbon_xaMIg-j.X o9ތ3ЁсAxܵv#랪hn5iuy:BBk#,ѕK`Vwb%קy/YD?ٜΕ>7P{-UkAk}1hu~l Àc CPq_KfŸ@cĠFc!gIcY+deg?of2Rj㊁sY'n泬eFD3L71tJKB="g _P!lYi}1]v~~o><qړ!h,$tj H ]sVHu .o Ød*MG jc0-!I^ϦX6e4J{5k Kiun&A[& ,J6ak(M둍6F,%lM@Lp}v,eШZ2U 㕐0nM?9.j1>5G&r.fN](N62(̔!SUK0k?έW^@)ŴX\d: u~$cf褷Z̆m `L8%#%1XF%Ɂ P82%yatҹOŤ_4,byښvg9Nڇ[F;=l* ^F+ $- =(71󀉧Oy>۪hОeRie G}S4W59EEpZTB@.8{xFFVK"m')͖"1fҟ׌2fO||0 YpP1&QY3ĨmBZ<@6u42Y$b파7C6m|l}0&(%F#yFpyQbbx٥$"8߱ P ,uL]z"8,5ܽsD$@o.#ıd=G|eђwqEE@4մJ6&I ZL4O);TlNV4B{M4(E\Ph2;@_R|I3{cQ`>-k\ 8.3d鷴"  =}yޥ=:CgOMţqUDŽ` 4l|oq}#&S=KQ9k /+1T`QT :(N 6oC!iVNaC]<;x3uC/>ig{UJ(W| јcDݾԲYþn-fO 4zm \Afy/X*ee8y@]B'$z{( 7fyP%MH+}FJEMb5C!X+3bpArR;~39^3" *R қ9,X0' -D8ɵc Yxԍ̀5='rlZv2YA˴lb:Yw*4b :@1Pg {ʚ.?s9Ԫx2[XCڒKjJ'ЃV v9vlcMoƧo ۅ*$"5D@x=ޡ'9j;=z3ֿcMPMFgT;B͢R -lۖjFzq"" E!)ًM1AR[acvw|s_yZZuٺ<ϲ~W-~hY(gUKcs)a->pS]`;xWEUyl4gJr'o}ӄ͒>|, sUs%NF?=py>+Y>5L4?gTUKNi\U`Jd*w,>RG=v &T˘}?Y¿# 2(R-{NXDxtsHgwŀ #pYߵ<'$%"\K)YaB|mwqv$ՑaY: c#U7L$OTyY b=N7Z C` ߿_9$m)#?ݬЃ^ՋE$x`y0R zf ,y gSxY*y*VMҨ1v]OD4;^1TA܂- wPl_N.W憻'"|Êb'2%>ǩ@Fl=?J(<ս"lòO4цJp;7p"uS>g3._H쏾u⏚A9 \JTBDm53ʱSb"4Q7 e@zn HEל&% aNï+Y`<*~Jt6 7xV¥݃2v\ݫ9N!9#\b$ b ޱu :I| MΉaѻr>5@R`5rE>>)@M[q֕Sp缳?N GȀ.`.MU( j%Խ/ARBTo!_PPnAbC#/޶UN_2Nso~ .) %.`J,zpsX_spOc-?'+)N/ʍa%rFԴUgHW9%VDo(ܔ=6%7!E\XaݩlPx^_VL u<$ش-O~}-RWWl*lPd!8 I bx9=V^P5"XV$} VWoxoJ4͍OU!SFUU1R.im[ o$(/1U?l+W~ PF6I_Ddf]2eoW Qx)4}Wae8.,RN V]p3^U/^Q@Aު +qΡ.ς>$v>p>` E[;UrF͝cñȚR8d&=OhZ"#)qQmls*w'Z0 Мy4ԫY(0y[kx yGԎE$_g$ -_)Ev>`G#qڧ\ƒ :HnFY( }T_ޖg= q-h!`Ưд{zaE?H18&wkO!N=լdq9gTlyrqs顮Adki:6ȳw \` JZ1ծ c#;Yd0m vnwmJ=<>*07C ?:рwe<xo?C^.~CצpX'uAF0hW "e)[9W_N33FVw'"qNĎɔmhrrDth+kS3 l4Bz93`Z2k3$=`?xj61)2_v: x*nz'ց^;5緬-`'tFz#PW:3A@:> 'f<M4jtSx#!.Ͼ`\`_;k;Mꯪ٫HZV<  ׏?:&2pfmL5OlfDxCm(n9Z:`6ȴlfmiΪL YeyrĆ;H"uS6ю= tϓNKN<C5::DiX\ZC\4X_~:")RcM>Lf] yGtf0&*샳uTuWTqNIFk0[7Dw VR2al{{" /)ɕ^+qw6k{|Gu ?ߢ]Khkv[E~|%vW`w"cޛgX> 9P,>o+~7%whw Jqo?ݸr"_vz+|=8ӛhD Tf+WqBO-|A#3#Φ@^{4c$V+ކxJ?Rt^YZ61?MXd|9AFŶ D_}[3qsb+΋ȄfL<c@`V/.hn.oi=Dd-GխnLwg})2~ ŎsnsuJq2a^f/Vv~O^g6Z9OCtdfa@'/?g!L>&rW$Tv5qh QI>*UʁDsWHQRs(tP9%?,B6kOWJe"UmD"w]\4dT >lLOw*[<]bյ[!}B0 X  "nW$T Vd)ZmVnBkBϋcqWR,OR%1~Cj$q]bмfʩϜ/v*Kt?I٤|.w.ǾڲZ٭b]Bׇ}W;+}; ?=*/7CW#xU{v z<419؜&6SP—[?tsiD]ռJ)]5ۉ~ɪ+3 g+SȿgoNףu~PuZjT޼?'B kT*W?;n W|y_/'5g{_L.m{Xom `d0ɐJ@0(wӉ YNBhٔBVfEAoY'q .ꆎƑVG>5PF3a̱C g QvG%_e6P ћx@SƠ~Ijg%WRWx=.o*"#)_2<;v{2` ѧ4S7ܱ1p; tɍW*a4ă@~ 芙QزtUJ\gȓKi۸p6TB@~9j)$'\H}#sT 4hكg4=M@gɅB@ ,y[)(rY.g6]$ 4e- 1 g{q꼑+ `;sϿٵ<Pr6S_W[ /oZa9W^){an8P2!`IbYe( [B<p-}ȪxXr b9qMBJXpufs :zv dn6F(j..%phƚ.5W59 H7ֲz7{g'ިQNɱ-)*wa+m#wACqv$ںQ~1Oy U\z:a h)iQAhy@4xNcap-90.튉 aқqroֶs.9OQ BN^ҜsO[nt@+[FXAy$4sуY jdeHʻ sm%pɢ6Eacܐx'M RgHAWkg\ +o&[C3ie)/se# ~[>,.?3' C[ 51P1"dsֆ8өID@љ)O_{jY[w( /6wbl&mWWuDM@Bħ pz C]G{U"^)GߖŽ e^@3ޒyThN>H72(7[1_[ߓۉwWj'p3Wr/g`EBs5w6ZfW }}giK F4ZX=3!Wa(X?&u>´Iy"8N @_R:5#ŠN Ҵfߝ_J%iH65f}=y"Pzjb %U% ɜU3KTl#*픭 MT|9n#[dAl[Bc}3n4ixeNֽzc^=@"YHHP4[~ڡˌln!>c' oPyC+-d^-紼4\Ɩ̈́}t\Z[a,v/¼%Jצeܳ Ht=A?`@w,8@˓脥a(vo@2"x.LwC=e"qhx>#=R݈)氀-c}qH_]2$O~8; (}g+ 0h`C`I# rW˘SkBzg!ؙf>lmQM;XF._nR7PTJ*9`6(dmčh }=`Xah] ҄{v?{o k(F$ PY[.!]9uo1(/zd2AKխ߽"c\AW+?;Oь`T"BU<VH͒4|$[Yf ;[X9GNWGP!@E_5J kƉD@mOР{߇[6ǡ)!,sܒb\tN6;PM1۔*j_LL3r TYƱZg/iaZY@=jrŔ%Z@Bkib <&a7-9!}uYϛns Eޜ&7sg^xzѓ aq 1hW_b˶?Bl̝` 3#nBƼl>em:X|͈P:z%;RL\|o\t%rAFX=؝Moۈi+M /'1՟⣷>I ܫI0Am&#m{>1< 3 9u?И<.9p&uZÝ Lڝq s~Ή6͕@qTҫ{9鈤IIkT>R] #~aA~N+bmѤVkX/ZbQ)%_5K⽃b}Q C(_oNa9/]B`H='{Ӈ %1s>k>*Rh$~ΤyQMj1}bнxi7!%&o~9פĎT;@T)Wt(MtoRJ-Ӑx^n p4"'Fonl\O@VǶ>EZ6FQjɚw(e3+}Jpc V?"J"IJDt$͹Ѓܴ5T)[+PKHʝI;ŋoh]*<=Q"G4 9J \D[W%;(zcFIYœL)Y+u]4_FDYHBNjpɠ= 8׻~Oʡh8|~$*׉Mfļ&4 [{7G8AGM$h ($-ʋ+ *O%Nɜ4GYAɥWG*6ۂ"q"B?B8U15dJNQ*xH},U3 ⺶ έz ?f$OiSH?$g.ן O,vQ2?(*ep|pER}%tAN i\wrr%yIG ~vkM @P}ݓ>MK/]wלHiIWJIB|lZnG}{zsL~;:jO&߉2߇kb_MhmiFB37*rRp{)ߴnK|dj57%>Pץs4'?an&޽8\[zH_O\(-ܿ<+(^Ec$Ҡdyc]L?s,Tϴ{[o$n.9++IӊW= &O5D[Iɼ4f&"II.{ {CD&_Q@{3mBRb[7=osHRV4}?H=Mپ-ݿ4iH';ԸPHJM&ևNo2,q⮶OnFԒsMΛs/7\H~Q/Ģ, 3޴e41pJ뢪f̭IyXgpZRZ#(8|L$38D}У.P/Gnwme? ]#izaSP50uFHS?d7 {(HJLLԴfLⴺ#oBvf}ǸeNE34$ĥ$Q){}P~y[&8[~b+~l}% fj_Z/ؓ&oix|yg#+1^"o^^&qIUr wj7 ᦩ8~Roz 7HIfcE㖿\,ߴ>q_N-3ڼU}دoC0㙟\M7h1P85io8I\\s#0xLlMoCEbM&'QL >KH&fn5w\c/GX]_ԅ Wsw^BLЭR+Fc|}EVn+kS~ݐ"ʿKhjJ JJ(h}|$lx4yNI'i9 MIL+#[#Eϻ34(wM%ݑy洳yCKLxi)_:66 N6Kr "<|7П$ipL̐6 ߓAlDz ݢ֯z"Vt}y/-m| <&w{A)OQ=ꖢ,އmM*v@Ȋ|26YE B#sv`QW:7} {LlP ncL5U߱`0A3|G2wʙoi(w7lp\*w22w1ULwy:n3qr;ș̸KfmYs+/Sr'*sGDwF'~-K3xn$dوiI'$e7,jS;ڏ˿茫kӉid(/],GU&K۵e ] _:7Sѯqjso# 㣜TGob1Y =Lf s&H{Ɨk9,5Z EWck_u,k'G: (!Ko.xeBxmc@);~(z;GoP0}>Vx7V^\/",%:~mUBE:oN v 3.n$5NE<ɋ&/BV suX9j7Xq6 BHIJQ=+muB CS0Yf׬L' N(!-pv+`|Jn`3[t ;`Z>5F& JYeѫ5 _Qw(je ゴAjQwL]rqfHH$Ǻ;3gǧ׼QR +9wUVA'yL.6a|# &)SF8Rեjv=D{u~!˜(jR;B*UA*^XDZy K|`u82S"E,sUVpvh?qjm X+vEHvo@෭uA/dWO\u#Q B=> +٘ MZ֖[`>S\w!7`@ "06T^uvQ 6o%ރTvsu'U^E_WxPLtT&Ywubk<?0K&[w:` Fe ,4LD)3^5.\YVb}zf(WzbK6K\E,AY<,u1}9s[mŤx݃-l*ĀJdH2'졮֍ 1)fܙ%М,NP#1kwPO0H ދ3b~.=8V)%$ژgj1NPC}sa~t}j P%W7HujˍV>Qv2 }H_FNv0<= s! X׵شzyͭ8>hHe_2Ĩ{eZk"PʝREM*b 扐+-fN~?, SZ ϓS<ZGŤCet7f,^] x;=4n1HM߯L5 E IUM,*"EU<}k3rR7{D7XiβhjB1^O3O͘Nh{xB[{`h`I::{E$NEݬ:œ/nzj*4xs KY^Gt_8Kn>kX*X6㋲y,5єv@kZQV#(fȺ5D'epIJ((^1ܾ?;z6yLOܬY ϊIًQIgwή>9tYIɻ \U'%1!Ma7ߌK>a_˃}[xSWW3y/wm[D,#ނu6v Kg<$MhWCZe933(頕M Xeq8e8 >9E_:δu.R7›ƛ([#H[/v'U؉a%MJ8Pǩdar1&$zм(5JX <;HWhN"󥠲)eV-A"o8%w~iu+C *FjvF7TT`$'dk; [ twN؎=W#.!@ii8ĴgߩRjb4+*xg!}E؀ϣhwG<ʴ\T*o^HK#笝S^~}HIVPWR G sbKJYxة9A4;70JOJW5ByD%K?っ4>/(O♿Ta ((˫&y)R%:A%QO^F4? \7 '>A#ѓGu^GW:LoGrzR;R<0ǗJO0Ʉ~.0#tDaJxZ( )>j媇jd#oL|3z3 5;MLK?nT7+t^Q0­D 6WPE|hCIK''ؿ%()G3ܡ+?iD|!^LO[? b_;s3^JjQ+/"o߾Om>3E7N~7ᯣ:߶?b-y~m7;G)򦿺?ApRS_ϒvzIhel'%'^Sir_PRU7p74?ߊdlML~Ԫ :|zb?LS{WSR\0j?,& Rw?W@3QckYϺht9I*HCi'Gu/(#&YWULoR'J: j)jr*B`Jhl+-,%K zEB*[*yu8M1>- +^O34E~7=%/^SoMK>MK@G>qU(S>蹋"&jGá;U"}ThRoDILLA_Ryl|+O8W4PHxU-1}wKPDK5ixjkHFW6~d?ҁFH.MyB1<r^Nf-I(iMXxYa9>>MsԩR&/Y덺H$| %->wEy=1/OJδp2_ (䂇SђBJßKp?n6%'#+9QP~rwЙ$5gKG'^4N̿u/$M7s'SJ*pT:祇Ӽz! ;P; W%U/oJ37/X)G~PS__ҦSI5UæΧZEO9 n()=Cś/w鄟In K'//iUgs*">HI=]U1|M'*2sGOi%K_%(I<EeP/ th>Mo?21lhK{4CM#R uqsc]1 =_cdqx`: ]ͤImӕ1 RŠ:*睑9}H~1"Qzic;/#B daeDaoNsLO+D%0 zH|VQA Ʀ$7ӡSA<pb(Аh =a=q|ytpŔ(ϚC3'QD ˑI^,Ax%d݂iK|D)`@}c:w.G1gxoXz/ٝ VW|5}y@JpYL|_РN:w(xAp׭!~ CrNY'8:1 8}O\>_;/NQUtЫ. 5ug"vCCßy1:ߖ'nbapG.Ձ5cYaL]g[skҸ&B >};(nB.6op5*{@tr4oq\uh·":0K9 E69 dG36+̒0'j?/΅rx$͑N寮ǥ:!Hځ|r;39A)N(7u ?@}VDrl{蓗/YPL9wPg؝oc%qE  vTr njC)okBq_25$Y!C!x{醪 {WY,"b! mY/\\,ksL};p9au&*.-CI!Fb]#ݖIb T2h7Ry- /SQ9 49.^ <{xnF%ciЏH\kaiޞ(,1{ v=J5qSd]kőwawobR'f>>>0 a|tt-[,/FOuNjOFĪ ޭ_ާ̟邬Ag[Z,w|v,$/$omS7xjB8d*5Aw!{k/P7%b:bಀbَ ^i 8ٕ"Z,x~F%@T7_A` /E!s!y x$W +@\\YU⥄r{D=o7^kHKIA-Qbʻ(U5<ǤvǢYN)v[ZCx RH A푑@eF[Og$P?Xl;r(G 6.x(mKAU$,؃nO{=Q\ĖĩR3ϪmTvMBo;(ЄmjE!jtz,@Xp>H*"DǽBxFY 'Wm0x56EAanA,k,/8Hb".&gG,?h*Q yS'O.]-!`]`}ہAK#3ʬ]ިnG p/l |`þɅ T`C=h+oQjd 0ju=8KOc?YCK'-/2g#HsqC*[Xކ\eG.@4Z9U[/@܄?[k@@eg>vA1E(DbF%#vr ܓ8-:_%@Grďh"W$UZF|z}65΂`.z(-f Cp(\Ila|Z = "1;-A*W^rpcyv=5 ÑJYRrI @JM;VO[%gpb8-l{L196Q[qÃ,0U l,,j[@,e&ڨ 24bm*ŪĊlc%'YOsTœMT_H1᭺m".FΑou.0 c\e N4:Z‹bqjhPѪ4YFO=Ym)@,{)_y\[zt"q;AWJgG6Y> Am_ d"u̬ZY{ (#eЛZeah=2κ\tD8E\"rŷ $ەFi@0ZK?r}L5BC 4 8A1ý|irňơF ,#?qx 5ܾZ/JI_W敃-x̙ۺU†S@!dyk\Bs [;QV| {:ʻHaB,xşm1a ^c Y/+3" B=+%!F4^Y0ȑXV]GouZD6[!N.({c|ag&b^ЊwFcSF\c8Ub!Qž1B\b6y0knw5wAr ѭto,+3u_ժΘH^2O PH瑑O|k&Ƙ [owNEK=?є:UbN/äFUd tfyոG3S;X\hMWx夐lX,V0CiDtF^?8>;1lꪡe1F{&sYX堾6VK7ۖ%xM`k8Lgr {ԡQ@MJN ^^ ]-ag:vgZ).;אBtW[DU7(93Nw:͌Yl.}9\ګ bv2a:Ce$h>t@-8+8dz`oM)nmv:E48&fψ~M%\=RzO>\P@(JgѥJl/"׍Q,<|N'fʁ(W߅Y11R.28_%ێ%s U~};c5ЬlHu*fNe̫3ق1O;șa-05L̇aԎW!ĘWP)1B:b VG`fbLՎt&6̪̋ac̮Lr߱vI/pgg%3wi7S\ۖUv3c@H!)={orCIˮ |lRa\8`v}M! :Z"_ܜռw!`*?6ถsOTAC$vnO]ԡ9wAQlF]~pZU#v2ٹ0v2١롂G,hJ\ތ@-GLLly qc4ћg9r'/qzGl9J&>1LjjjF*O.ZT^4 ;@EQNI1*'ou?:FGQ%Sw](@o_,}(2=8i3Z'*#5 ^8 ?X9ufGn.ɶ@,$S9`^pcTFM[dk9zG}P&|Tka)1Hݖq[XS@s< {{/qp Ʒ k!<"G2ˠGx$w,D4iљ2)M^j$WFvU|,eU{AqH"1O +N02tL Z.*9g`3A 4ՎpTJ]*1Ƶs̔"]m#-*Pِhn `nZ^aB.WtRwg,t,lO[3F71jiaň18;.bwSUH `ʤZʼZL?C6OW)^Y`ȀkHs"dz@dꋓn6AjξҥBG=j`"n "%CK^!>٠d}2;}JCl{DgI%WkT>^Wh== p"ބA5ϐr<'@PC4Kue[N1H7"<9+]WiX 銆,H]6;V|*fh »nA|ZeIkS,uh) [`[ ^i!ѵXHߏՏq~>2 ԨAB_s!*WVMT3u?smM$1脅E*'SgJR媵'O%bt"-&I~Ѧ.˘(MÇ.bY&BAթGqd, ;H// "< \j3tZSQ g3]6+Xk;YݞV GVf=5yY}CKQT=FB/jwxHX' ukrօ|=#_ ?&3ȋ^Mtfc `'5su <$x7O# _ykmh[G?Ǯ@Ce+E8+Rq[NȻr)iS"ʍ`ycX&5Ll-h|E \`MEMt?;n0WwX]Utc vU 'cqYԁ /CQm|ݔV2~>+=1a2Რ $096B#U(t8;UL/k lے/Nepl]RY^<%pXBx! W7q^w>BJtp}5^Nf_akvv#)W Al5qxئwXy$<#vh,R@knPن/j>:œs)7oH(|; ʕeEI++E)T^3_۠ wb>UˡceOGOj`v{ M ,`-U]m+bzPe\wGYrSh;Ά$KwH qpjO=UAu:?ގǨGשmwFFNKVl*P340vŘZ,O <}֖{\ DdQܩ5A <#pO>NNlǚa5Hyj=`ީ^ WZ3F B2G_$Q{rMdfityS)\ LW`Ľ^oTTELkmg ^gtYʒ#gO4" ZV+c@F*`kO9Daơ $0'vkl`9q+%!F`;avZzuwUVY#ʋQnߩaBY-9(G wy X ëZXB UuO&!eTA/cNa,GFsxm@Odw D~ Ysmq0K=,s៮XƠccvU `Y~8{'#h|z-5Nt.;›vhC{0"U*p0.Sv⭣~^#tȊUy?qh#؊>.GX E^nq?Eý|^ӟuw>ִbҕվ Y- ԕ- {f> zK1+T4 oඎ)1qӢ'YA  Sa1쭄X RBǝx}RnBmrV0 oF]ǒ@toJAi˟)S ݍg`j)@4Tt%=f|SPBJ yOڝpޓ8CӞP^;;j٤'ҴN(`O&R{׳.S 39=jy#ݰ๪RKەŲe  VZT!;Y4a٪*XZKL\іE%[-dqMsVlqFa;ze(XN: p?P&)>4@HmƽլWq}jF3(e NBJ`L\^'N(fnG$Cd#Dل=1,k:o4vz'Jpdk͟JnQ-NV뽔(D iw|v A:z_QuA2lJwluԾ4=[ehr*Y:cVuSLzGv\ F=&$ܳx{*z> R~4;y'֊"lp8[w 1re/0fP1>8 :72ߥਹxpߵJX8ioǒcRJᎎٰxOYtZ@^u_2-Ӊ<~H4I0y!ЗhHC?iK㠃+Ê͵qe[)#g:v:S8Ŷ[ZH%>U};'*Y>ՌE*A=a.t ̭Ccum'P5LxAږ-}OTh;mGcZmM!I-KP}ZehzԿgه =R?Q9wugjeRŪɑү;ҝ dM3G{n֕GD6W&k4 B5jHűiFA4iP h8YP?h rZw/Osx.ysOLNz5Cj2 (UU"^&jpnBw{1 "wrJeQhy-%m[Q%B̨{^Z/Tx .ںnӧbuVde_Y|T4gKA[ OI׶pȠ: aGw{{ 1U-dⵚ&2X“vBKx 5zXk+ n ״JT_I[B.05. X  jQ+c"]@[)@Zkۊz z!M{y__Bܵǰ`6.S9AlN &|\˴ƋЦOzzqtӦv6nzBtm2Ú]ݲu+=GfH1l&n@5)o]x ]fкT#v%qK`}ַf:Nh]]nWQ>fLڰFvh0x g&_‶L ўX=CqQ/xS.Z.%-T_W` p.D+ wPelv T8yu+\8hښm6؄-™,豸}vvB5_W,ƴZTb(b~4w;A!\~QGv`:>@Xvko$u"I), 6;~|fFsҠ̦ 꺶B8=*T JRLv ö;ܴoh¿+ͮHAg qNeS%yHG=;?CQpS;&:[frW×G6)-so,٬W.& r>ޕPJQj)OzngG&3!9XP#\KITbl gT7VI>LJ Ԯs* 1/eE[%g(&_*F0QS@~Я/Iˑұr|@H+*f.1Mg,K)iedmq|c>̔r|FDVFW̦&K(!ry&ђ%ښǵaDbSwIx |G<#tr𩓆jp^y!uSBT+7VIg`mc1<&%G`F  󱡮x.dbZLF*OL'NL[6[+; ?i&[W ==Lbr8y!+b`˦—j*cI1 ͫ/m9HJ<*!=FǚQ9\p`݆ȺwwFrk/z鸡l o2Ѥv$bX*lZ|8Ӡ?М\$ER?҈d}|EHNb:k@::|D&-E t$꧜ZEnJeV`E 1r;Bl&蟦Ml=k|]PeeS?^668#8%B)>o1!ˆ?;3Bݴr#¿ob K_&}Žhtb!7ӈ+fq\T$"\oJ@JHNKӍ M@[zzt \_a9:E M$ӓv['8qTma75 +"R:?D11rl ~kRQ% eS8#(Fd3o@O6zh~(8D6:Lug7'/z'&בJGQmkMo[5"яi:Ke/=hKCp%ms ;W؉>BbnQxqܨRXZøI(. C荌&Q4X~Y4/mz[U췑4[kR$`N9t\,-,:@ar%(1r2i &d Ӎ? $\Jt(є˄[W_wQu0*VĻS?b%&{ 6*h8"sL0T xXG#-sE(3!FfQ'x[~&tIݡK܋B sLL|AO8M>p,isNuS$/+ \'QdS^&Z )o$/Ȱ+|Xot EWITĿ _v[?\۹Z،%mgba e9qfAnJ 8MP@bd}&͝RZObF-Ped)*£mW?nncp3nĹ7䕞Q}E4̤q4u?Z4sˌ*_~7 E#_K{%8VMl|# MAE|mCzSGD:ͨZMW#${!-B|G%ꧣP[7vT!>_ HL߭nV"K,B mj^P7k-5g}jP=9 ]v6B޿0Y'}U;ge ~ӦLpA^?w5hT`{Bq ^ N> k eӐuO^$eԂJdh#[F/M=G s<>&_ !GKQ] sː_m3@Vq(Mi zUS00bFtqSyqT,s£ǨjG( -w<`@:p W_\e|vlgPz8(KK1va)r J Xx=A*c=M܂` ]4k UxU~CթxV=])֚"<(P,3۞F[N,geڤfp#fЈ`@ջ՞45u'Oh[܀@eV-Uj $+k&rjf؝5FLf u%6W?á-b-^5X֍vwd C:_gP ?/5UelrOҷ_APu=e_9.(wOXхw`OGpN >U(f#=JAH'8_Tj<$ת)o0thtZA:Ct4H[ ap;~;`{Q|RrTIQ#@W,HoE‰3D @0~_|=] ;eSʶBqDzCI=\ԛ4' *1@a[ir[rQW 5*1>6Ii):AA{v}o) ` df߶C݅pq )%Xy6fyHt[=D6W3¹sȽVbe drM vk5Ũr;;/v١\˱/k,KHһn ͋ZȤ\*bOˬFts|  =к`5xĦrUxX@4y6Ó%ȉ3`# HU0RVCX^/|3Pb\ރm3beqQ-IZKG4!V>u9"D/MjNXy:ԜUwEk-;PV| Ɓ&{ ; U-h熘%C#=[Su@#|y<z"F"#>#%HkL?hꩽ5@]a/ê-G ٘a^'ˁnǓiɻq|_V{KR* Q`Qv'pMbt9 N3>Ɍ| ݝ;''(|]_ _3 GԳ+S>Tl wę] vJx8/*W \:ZVi[Tu_YB^GV`U h9_x ؞W'{<֜G>5VJfvޔVHcZ'HIB3hW`v`^UV|!Y>gr"5SHPWː+";%OvA]MԐ0Y^P.x}bnvCOQq責w i_ |j(=5jG59+@.g=2.6M. ]kG!J q_x*EAP/z<ȬWht+߹g/;4Rl(Tkl KݩH_/z;(Z8 (!SBy|4~F0TT=JkޫvgP;U?ݭk, =h^t ^Wu8BH![f(5XAxs\pؐKh]VPt\Uk&%3 sV0;#J:INMC;N2HHg:0ԣ W, Zڽӏ09aCB7껞a`^kü]bzG)/g_ Z@7}LWtRJ#ЅV:D`y(o40Hr򭔣 Lp[βdWu͋kssޫZjvhRkV{gIR{G\ ҕ@x'aT`B+{J} _>/#kƑUYMf&7bJHu]4Uq{v6z܌.*ufmT_[i>GJwiώ4y l! uF[ V}3W]ʔ18 !ĻTw W$`;~>x-kkCUyobkn=15UTU`4)CûG̺Ih0TN@M5wwgZ,g4}ϳ&5ScJiϵM KJS;i|:?c^(pNXy-+Ru<|~wHNZwL#؂ P8[A 00~s+NEW{W~v-/\ U}El [NU\C*il0@ݓVA4@E\قݬS]al b퐖G9KDfCx#jBHE2fanGAАYkڇʹ?sf[g+=qMiSI_~8G %;17Hݽ#MU[Rae gOJ_}CN?v\W.߅\VWxo -X.ƶ v-I8j=1Hz~yW62G?JI,[=%x9IQFfY`m0:J?|RRp(?nno,IyKA7źwm7VpX:M i/0{-F?AM)M^S{UiBWT@IuPyv.[T%QOhpRw:e3;buL3,*NtR\\Jn\5^.Ze%*:2?:C NˡqUa' Ӵoחɍ5JK^n}pw J]f+L릂oOW/Vք8 jݗl~΂IZnM8P 5%/\wO{Bz=9LV3-k(aRiv*V˯m;Fda |9/kBhf!KKcjWX3S^Xn|:"(Ke&n`CI)RWIcQ3Nj1֯Dž-r׉v{m-c[A,Bi*Gw7C1 ]N3Z!ntmjikXJȰWx5zS]Ҿ+a`+NG0v [ruw3^ᇖoe_9kKge/ZhR( M)-]Q+" /a+ᗱ!.D4P;k$(>hF65awuv~uAbND-++> ?̄Ou>Tϼ. ,qՒabY-xa#"Jg Pf7vt[FI42[T#mH`ϖ׎:p-z:HqUM%*sX"vjhT?w6xUjt$^Ћ@bbLT1:BNȮIuK,j {ŵOea> (U7K!|3/cE[')>m>E>aԌoi ⅼϽ5}N/L#-m;jQxl)9 o^mE.ai5G=̟ ~X|λT5N&rmYy}2v\VkmxaR55ǨBRŲ~51).&"#sBV,@1q>'[ /%?>xVH݌x?w;qۋv ,q{߯ 8~vdVfZ_#׭^n"Ÿ:g%5J օߖx ۤ9e'RQea0(u$@R5=z 3VVk8 HĽD 4қG z QO03k;Vcҥ+֮ڨҙj5=r#y.}eqphQmq"Qy[kwlLyY|4ЌF T&@6ڤCVWmeaMU31Jތd~cګԆ8 [Q$u~|NzD8|(pHD[܎~Pw%ujz6p­m$qFB)rHS*;R jIiw0u07Kj-@@ `0ce.R@뇰=o*g61̑"[$_+|]{To7GYU0l[LF{QּViו]xs0Erylң^ {o!W[ ^&H:H*fiUM/l7Q@RXIRr YӤ$z;)8IR?_QH䁣- +nqj HM_dseO9(:cVqo!~2޸ !;fǚ2͠]a 9&h^K `}{# p?8!*~In̚ [?(yF1z;Jy3Ը4kγF6ri$ڮ g*ys[n#&G(DT)p.57wn:0cb!2Uz:23_@Ta%D|fL?dNx9`:B&P9NeUkvњ/ĮKNY;,r (̅=$$b|%y=s3pZLh*]*`Qǭaȓrm;ռ#j݃~G(F̜{4sY~D;Qʪlgr\c3{?v+(-qYSqf=ġ@n$vʯɦVDbLFt YơyNSqko]n>/ ~%_R8=8'9JMq3IpȽM,b(􉂒ߌ(A<WLmJn\2.yͳrˋ_rљpQ Ui&/ŗ0'yUtiienukv[S1G su?2.]g-!6q3>?ulgI?hA?\_OcX<–a. W/q(bH E$4'qŁFeaQWGK/AV>"it՜n {FzsXѓ2x5*t~źs6_w //KjoI <0\v!ڕZeq板 )wUWoW[~o4uۭh!)"0Sqz$K/Bi@NY\n9jj>?P,Ì/r#>^}ScD9N_g&]w"GѕTta9&mT~n.na>!%rn5{!=뜒IĖafo%f}P"=#:0/eo8RGFti]ٓv;Z1lb%t|Ȉtsqj{ĄPivB[OUMZ۷?Nq/,W tEy΅ItK%!1{N . scFUZv#r05'"h%鑴SuH\?1Ib)4DEٯjN0fVS't*̯&Z$??%){G1iUMd'D283{2((f۳ᾔ=_ۿ7(1geKhG~>ſL?D%C-O=i|KesL%׾=IP}ӒҁypD9feM/ٻhA\DO31,(EH&wffEɚJ~Nta*/ i?'HpAt8XJG48 "pHw/Ҙ|($IM_I*yJǓKŅ-uGY_׆>~}Կ Bqo9Y>W C>^(_`,EOyG亟o<n&ˋߘx[Я%MDID!_жriCųqu^ geG%/9ߒi_{7gZ$b17\q}HGEgsj4odfvh!ȡbx!zUs. DK8'>gRYꐜ d_h.h`!+Q#0ES AY3Ls|D,-V3H!"|N8q]2g}e71'dov!A'-_PŽe/;H_$+ .uIx`md~OU`9J]L.OR#3 Fàe"̋O&Tv+D<~` vn.!Azw"Pzr$]R.j &Y80x pLSd}tgb_%A Ƀ5@_e` :-0tz5L.1zyԓ^!4>M OdؑL WB(2o;()Y(G*QBfC$P>ORGMVknG{[D2/ZіAΓ4c67G}-@/j3iqM]~,S;Q -=D( ,&pMi) /\[0Axq=GdR8f^ns:Üպ*vo@b H(k I{!"ɥXfɛ$L,}?+KiXެaI &䃷o*l8PP$5`Gԉy4^4 3!B^.#u([}<);S$lJe]fa/m1+tp9ܘGiGX#P}ua&) 00_sR[U ::A[UUE>PUc6N`Xb}7n$Otw{w`x\i2Ŏr)%,r|v:Кx!Al{7Uid|]өёt@C7̪J CNX Oi`FΉ "2&D jԀQbf+ڣMt!0+,d^ zNΜMNwF!$+6^6gNoy"f66a|t}#dV|2׾{Cy+ܛ0X6 rGVp}/3!F[Caz3nx @ E%W7w}a>a0wAm9!*^jטWc.XkOF[^~!K% D.y{cLS(5r?=x#smSB +y'329hJ 3"Hns<XSb4UW#Rb)v՝1>#ճJ)yv;,~BčDPPeH,4r3+ێK#f,O-`z4L#Nz,]oOvbU~cA|ܒGc=ԫu2|Zgs ,1'RY3>bE8x*hO[6;Se+|V sP5SJ3oi_Bд{)CP'$p+6v!ϞaCsyhTFZ=26GIevysÁxPPU+L. {0ބD?"_߬;sieׂlt3(r17BVeXe+}yԛRj|ػ3Pf2r&26N>κFR 72#IVl˽v+*HF/5SN|7I~̱hҴMB6=5,$V7ujat6P%/U :H[$Yo/fI֌2f9~ V?٩BCÉBRt2f,x `v/>E\S 8dhCMa{aZl~l~ z I_5v3|4IdxdEPn;Z/i̾?=dt\+V,M䛧C($GDZO0NtK$oko ܅Ԟ^8kǙ[M'^1.HQcP@O%?$#÷k;6 ^f`ټF349Jr%ژ}̢X5yjx}# _2}^{O6f,{ãuЬ# A,#JInqVoIK 'yB?K/^Nb¦҇YP~љB ~'7 =)J>kfɈ?nО(ėʿvi3Iפ?6(( R ?0KDI;s{#E_PHLKm aj##ˢobA%#vjrYΙD0\no{~CSyPWt7hc K& H.A5}/$<oIwɘ=\ȴA?+w=+pf i!q#7 G%Dnͷ(t}D(l9DԖF fQDU%ҪO44a|r ̵ @i WQLt^{7KT,m (O!v~Ϟ3$|4?;Qi?)[ Th3aP-OqǓ@>~Ј©4`a),bpeO~~_Q35J{|gYGUrۜemq'%aH\c/ST, 꿭1Gm'G֕htQYߡHLQj=sz_@bG1ih~t'K>?v6FeQE7ub^~-G|$פ\OIW|Ӷ^K%+_GjTӹyG>/Q}!OیJ8/Υ6_dIk Kcp}/ө[S}nv͆P_YW4;? $]yh(%Ldtu2ۉ7=i1^rlzKGO6>>IA}BolK\vzSTW3,}iAd8}hH'--?'B5x]zKER_ dZ⺿pnccA6z%TϠ[8GF#*#$>\D I,t2;n|G* pg;g[ATD4$ysC~}mCcR.@p8.3- Ԍ-vœo D^~xNÈ| WӪ:D~RH{}ip8>_TC] ?ϹG Ö_[{ >7r2}s,}g1ЌOx0 Dte3 {K`N/݊d,ٙ ?\]3ܤ CWπ@6p5u1b񅒅Pq[C6Ma9d=L/tƕ|CYqxLm(6/t751<妣4曷* }M<`N@K|3Q+t)><&_2w8}wv/4=N p7, o׻@a17~ E)^|,^cMCw"\M>}4klkY`M  41e̾vv~p ] E-;]#RadzP5ZҚqO>*MXG0f&pf0>A#/&M漢S-]dp_ i)qTAIm>ȈfBj!4i35 `Lffφu("ÛPAИK|!'|{㴆2oo+n~=]=j a7i~eɏ]g~õ4Q>F%?#^3F\ 944 7 ^XD?kJi=z|x|a\Vhi 2r(k"0SgYyWkƜ@g4dKpwehr! ,^iؖPɛp}wNApVb$)ܜ)TPq콉&)6P+^܇`e7Zw ^#&\UT ӌd+aIɲ *m(D]YEZF%rc \ }0S$Cnn9Q[^+2fuDzhdFD *oYzf6anTؘ^d@WlM3JxfK.١c0 @ ^HqZlxR c*2 (t{FLs@-Y['@;(ͺ!C(ɺ\f^4B< gȠr8|U٪Vb>xSW>Es,*_iԍe9f8=˻{`ԡFq} "KIUD ƏuĄF,|f٨xm2/o۲fLꭧt8Jso" b4 2{oy:ץbXS46uJ. "_g8]9%f|gmAFkf&V.cw6H*JC?1)kG&O(P_[3."68筊% C?>cV|3֢Zܗ"|aD/Z ώ/z_*,EG(yЗϸ>n[G;4c\CAYfa휁ɵUl`%x- dHx}Bu!A8^Bbp|ugt0N0aL*2lmTR *ꍤcHebbbmt^ucMB%xO@ӠҮq-GO@`Vڀ<-u I sVVgFKыE՘mb3JWtmm pߖsCHv4xp(aD}JXñ7#ȷX 7aw_ڝvQ.3235:7is.+-gVPB_}7 Ϗ*JVsN9l_*y|Je7'0zֺ,x49BT@9JKkՌ* ɬw5{[<<tayb6}ɕ{cxPCm#r(Z7zI2AHl3!8`M4ݻ+kS4'*cƳҒt3RoX(@riVRkJO<ߗ%t}jbͳ7 Ǯyz$ b=k@a"x`_-prh/VՄ x9T =E`a6D+N8KvGHJ:%ɰblVz:AG†G(yKb_gkk)lijȶd!;~ ҂~A_Sz!p1a{o'@GPg57EqzmnAα V=o[N)o w[#hOE P;$m`hNr5E$7sՃ>o3!v&8Ј$szs@2I,=& \op,X(I0 U{%óf 3a4tJl01C śHO^3-fI=l^Fٽ1 s4}ΝiF&es,'_ge7I{Q=M_i'_V y+}AZeb54@Jꋵ9=~獷_)C+Bz%-gy9 fC{ In^MtrѦIhOj7f{PMi6u~ W cbOѱ.lr!qK=S^}dJPr ,u~*y jf~ƅ'([9}   F! )AJII,a!A0( '@4UU`pD e"s9IXLL"yTdʻLfa .co$R#mUJ*i}y5o 2h(7JcPˀ8t-վ4Y=< SyNe/rIT'MP p9{ߦR#ھ}Á.RNԆPmGWĵAKTFᶰ#E_M֛ oـp)4 mc`ĿIt%[?EJãs"1I`u\+!5a r {Lc! #A:3abp?a`>FT}]fӉ#0W!a*z 7&'"4)iG⟅wEO_$< RrH$E)F'8J1:?H>"Y/ 8'} Px;v~#(Jj.>x!%gTZ=Q* Cz(:T~_2V?uOʺ m*X8#vTBeO=ե JI:(pZܮhO-]7q].X,;G/4 %7LT<9ǃ'׌ +T:|  %~cu&0f=ݿT ў9F%Dhݯ:}Yh r 6RwxbK >6Q鿥vVv4NB$uJ7:$ :@Wb>PQ#0ݠ"CrJUaJjw1}gO.]jHߡ" p+R-t͋FDѢ&=LoGeWajomx'W?oRvx!Sގbŏ |(X:IMG Fm7 AyY#^Ó4$SNb<}ItvXUC"I]iϓ>u̇ PƼr*}('?Hot(A-o Ea xg "|I*"TWq ^DR6@8c}x |~,F-XK"y- r1L*"ŮvK1Y! T@qƦ%|j]E`=LOrbYDk[>0 }I{\7-I& ' g*}+Q %H \C6b!%K+F&7y%ʰdgps ˃T] @& ] R}t2S"DPxiW.Rd4;7V)C>݌ޒztqއ,_%>iɫ|~V 5wȰtoܰpd>̜/7c~nRЕ_BR wN` զ(gJaQ ▛=U6.@jb9QdJ;c+M$ ;qKnJey7P u>Jj^顲գr΍ӱ`JKv":̒*Hw$Iӹ{xf\=D^rcƶԏVbyFǼf˭aْgP7qnkH^tљwT)MXȍF%Savvt:m|T xs:Kl W|%m`my\7oeSQ58ڲڑo0K%b5E/o+Is*KJA*1#@3^Zvݷ9Nd,>^PӁVwD{a@73Ǯl8^ZZ2`{|l8ԎK [ D (Qx)oS3%Y0`JS&I [@[o+:o^MEsgeLW1_ohђΰ{Ĩtϣׁt536t;}.x€l;sP-$RP/{mvs'c2=D] ' )9K@&n:/l8*A:*GeYP'D|J 3n\d Ҕ!VԍۥxqI%9Buz[5~lnqRzqx*Gm,7p]CtξC8%}l#fip;CX*XD_O@W;Lqh(LϧebI O ,|[bIOP !o.x R%]E;pmL:;h¾Ocgx ̳r@M e*}ƴ-90Uj~1RDq(:1=%+r ;( qB}p-" 9ܧu ~XY(+;6e|?xQ!&r:_h&]իfG)v֟A.v3FCjv8Mq.lʎ7SnlhV2 e^|r\oua3RrV6C[) 6ށDrjVPhZ.Vô9nut7L#"L;d]W7]Xi9>DJ=!̢UK8w*Mi:&P@6s,:\#t_:yvqAJن=j#~<4tEKa/? OZ8FƨQ]lh7,fŸ!#ac]1u6DXg r!S:swrY/+xE?ebԏ>CyCV]T\.Hz/׽FJM޼},hdj=96\UF`d/kl=D"gWHn3@-L=lq)M[K,h1i ӔffP , t&Ke%a21/_ \Q[_ԹA-K5m'\:_@s 1Z  Y{, q g2Yα@ө׈[ \p!˸/,kgAG3P.XIuh&o~Α/'K 4 V. id/@_ĊD^lOy(ϖՒ׬Rwb'/ GS*id hκ~_v6H{Z`N{01j9e1Y};}1{02O/vp@1EK8 xFmP)LV$8~r_3LzGDwa!ՆV<#*[0MaN`Л;J &ia(V i `@/$ ax+}Փ#Ի":r(fzZn܉]8YCX@݂<7gpqC}{1.q9$]ûTE(pccq3_7-YxrS9N0T>T0Xq7'AO cF2n$Wuݎq9Ŀk=3=u )eȏ5լ7HY&,m楠 MIP;|kD^=syxjL dÈ c~ 'լsOl}r1y?D웍 ̷v@)'n 0pWsb\5jG]v!m @rǩgF&Vh<Et'6_d#-^~J?C"{՗-0g9]x]1u:Z%Mm a}Uı)cupn[g@}2;(,>|?XrݥZ9K|ޝY&$ڗs3p1iFxxm_.Gn"[W[K-wןʇ c킗8Jvl[uus\ǜsإFIdlLCD|kak̀enܷD7l-0˴DxN jn tҺLL@>J% qDW`DIS ~Lng(CZ<>P%'폒WBc@Ǽ$TKBZ辨jl@gካ<ĩ?KRP9~Rꫢݺ!a|~i<$Т(;aJJvK)^`2vXm~bp_kTGpzGY N>K$*)V ,nG鲸=)O1 wJ 4IUbE!@eOuׯ }(Hdi FƊk5[9"$'FGڍM,X5*xqNaocv}{+'+ *^m쥿ۢ??TՉӐ([Coe2IpwVqn>bϠW2_X[ȵ 챁c`]U(Z"5`e~in;łe rQl5jmc&c;{w˄ yҰ'"jW{>L?$Ɗ+?RQiy{L3𕏯\POZx/wr *a>CIvaҊW(?޸vv/gd"P/I)G~UŵH"}J4CTy|V,)ZV\}EHpOP3ShTGZioEh.#a[|?TnUwP=ծV?!yrH(xTƼ]#06!-樯)#,N߰vүT{.\Ѩ驊yI0FM О'xT TYRf[X i/e@Jz i@н~+{ ͒:`B࿄tn5:8`Zy U *Pη)%5cu}l 7H'ʺri!j 猕_@ip};/) >_ l?=ڍxtFN~QO}TX7΢rjF;ϹAD+ž+rG ,do 'bB P! Q>=YHtQcW %~Z>Ȩ;W>gT7d}+S-f NK9Y%/qje+ה4ffa('Z#S|\_\R*!$x a0[ Ii[D@/3/RX5hd`[F)+R%ԠRS8|z"*}p56fX%ڟAQ%<-<rhmGAw<=VD'ltοwjЅ7:mzMY?%dB̓Nj J[pJg]Ws?; FLo ^(3ƖɟY`;OؾG9rݸ"Ɔ{h?3Ln:^4\ e vM7d]ϵ?$CvcSe="PmٵERwWƽ~\a![@X=DA`;?=S?@| H:‘!J;gU3vv&йɴǬCWE5Ӈ''TX)e8/t_(, h[ Ɋ>Pm TF@m+7e7tSk f[Y!m.Z769go?8FIf:0{cH͕0HD`iIMJL&B>Iey#<@~-! ƻGIL> Q9"<э 2y =gy'L8)y( @wg1 z];8*|fk=|z<ՙE^!eѠb4E:(*8>^v3 ],{`r8<{o!u.Gl]7A[d(HNP mHfao_roO^4s~(9Sڔ"{OV.Ooz4){_"|?Id@rld*uԡ@ pqH[NZA}SnҳدO?M7Z;$z p|!'}%f jl U]9l4\=3yٳ%_EǔyCu+1=+dn7;"ݛPW `/q])5IqkIizGjkOY^m)ra/:?";O!M;}5L ~V#\Yq?_?0N(؍UXJg3"p-nC(a1HP,% ϮoNgXWnF$ &LU[:Da-[^aja35OZQk q|T>S&T@(z:0Ϋ^)6s|p.T ,yi&No rOeBfu~0ÁvA9͏l͊>1\5C(?Env+|z,2gѯ5E쎤z5w5hѠo2p<1wJ՜4 5'VkRBZo`MY9D2p}0[@h%F2 1SJΌ D \}O<=\6ip݉2sB5GN/s$5%Ȧxk:\GgCpdWe+DHnv׻4jRUH<}QMv؎ڰ"&IdS:GX?{5kKI  a{7԰2n>/gEII wE*B3jDK(aQq_CAχ;r_L,K# m9Fߤo>'{27!VzinJ0>*Z߸ҭoH+Դ,{wZ!\S>t?ky}r}v-xx[?,||EoĀ J=3 {#uN%Nw/\ ]Et/Qqufsh]HЕZ=/c-#Y.Zv@A?$[-&xr"Cx ]WT˔֜"떷22lSGՈ Q%cŹƜ /8'njBg]y.G,D#HAsDhan(%r2{Ws5qyE4GQ^ iIU [b А9mi;@c@_prMмi +MOG<:]{uȴ gКkt-]!l>P7E >Mv[}9ub{y߻ bi[,iD&I_A*76Y70L6X閛W!֞T֒9\L$%l 2w+,D\[b6ℎ~ӕ娥8oJVW)+ |g Mal8y RXWgK,(C@Zڕ|Ht f\]+tIfaz :,zaҩ ^_ٖ ?״KA B_׿EYӺ 13@J(!0n(auu o"tC"aqI Ppl) lT (Ln{$ݷ],b>K; HgђБ2bVwWb43#g\]G <} Ż󩡪5W'-ۑF$;_.+=";Nz,t *UC$8_`AB4~G #]X5*>!korKGpĜr3&*9Qcћ#Nrw#A]}9%&*Zr)Sbo|Z  qr~TxT'CL7.g N fHWUH Ď }⧜EKGxKeq%пԯ9 +(W*ϠUHE㿧*&CZվ쇂p M..3JːfTY%a&hE5.íp'eQb3_"*3ܩj+_>^0+p2Șdw3^A'ϗ=3a&%"%rꮊ!zL-bpzG2}{?Ž7qS?+p'R' _,nd+#kȱ0oa "zx98[S!eoE 548܉14>~ok2X6;zW@nU,kNnsw#1> 7w] #nCGBL*A_WowȖ!%[0&P(톊WX+~#O+t{k;ttE>\ Σa16E?r?ηX=! nb/GIV1S3WI>S jNQ5a=T{$Do+Sbl;o: nHbs%RśNx6~7b1!%RRT7oFċTYE'F߿f@-ἁb9}Jj\Q7b0[GJpDqev:UWVkZ ]Ioͣv,΁JQ8f Ը(o7O1 M'<#JIqD1;%^Ij4NG~9RyX3@SxXO))JOP);_َlO" K'{(]+ӆM-+yV8~p ^ 821r4E}T! .6%Q( ݓ>NDEGiQ"﫧8! ?X~rpYW\{4H>݆ĮPb:#;G~/mkɞԽ{t3ARWņ\i0cgI~ t+h xY:MN-#6CxV y7 I; ¯R|~|dkׁa*^KAcm k8zhA~α`37S_Air5k hʃbC=#`HaSE†ԈʹB{oU ;k ϟA/Dj ByE PL$V'6_03|!T}oZĐjonC?8g}HmqH<ܙ.s46$֪cd+',`(=K\ tˑw;yl!W) L"gxDShBVjE: BEi-!@iPY=Mv'GE(62/MF'Ye? AK%Mm8H=ɲ=bW~@._*+'kKڬ݁: lYM#2,R֖b/" WuneBރijõ I"K@ȰuS1 kFKk8 _'c;QD Y8/iO~80VS0oCgd`tx^sքO!+ѹ. MUy۴(u8B` dV52OЧ耖zJ^/AғL3A_c. F-Ub2'M @@YbR 5:?>$1bl- m߃Hݱ:JkO")L3cN#>/\0KI9|ȴC{@vYxW_a| s= @IZ6k̉Һ2gdZ&}.&v<(U[ xaù|uc€K{G1H`nKkDjl}pS+dwV&}cciF.<Ι+!bhX C5m'.hX( Sk/XM -LD(,yRBőrs<|Ze1}#؜+50OeofO H (pM5&}zb:&d27`'eBWXi\Vc[ 2Ǣ4%9͋yFėeS%H?oc PyšmZ_zׇI(ufkvSҍ9Pt*D \-@iaeŽ3$^^ ~`rP3,Zěe'1Q$, Q2hhn X.{\$֚?װpBDє* }XRS,]G*`L)E`U|L/0x VU Y'"1!>0nG&V1Tb2sN~cefQ&Oz^+r "Gwvx+9}"؃4MmMLIفKQA. W+ĵzk_W#V ? @D+l[Di̇YdB!ӽFwe2[&߉$S|蓠;T }R":!{+(ys/4yv7$ uΘ=VN'#` oTK q``w uߦ4A@bʡFXF\W`&AV{Tm=_Wn\I)5[Q<5XW PxjJ@0vN& ,Du b;y=v(})Z|;7!6[ǂ%ExR[^bkysx qKLPTl:W&j F Z w]ޢk KldL'WzfNOsNK +wD6V.>Zr@Eۢ5 R8»DF?#71Zjjj Md&`{+_EZʡMLBeٗ|,.<=~TM {/HJ^̩Q#[Z5Y,T$t"-VTfIB +/M nQ2𼜢i/39y%rȻZjT+}vXiWeS˳/~>7=)B=|h''5݁Ԑ`PY0IX 5/%o6=@q@K`@sܜުrm͚h3N]*-nk7T `n@顑,oVL)ͅ%EIlוGkexa33ߗI.)^*Cʲ^C[^*sVv-E秢{dL/ىqHӨ cPTdy :|=DžY-ѽS-_\0ڋm+-Tl,jQܮ𵜖,]}aj컬%1zM cgk%lY5 fK:6ϊ~_\u 6#9K.MϺb;6N㶞c6v;_q۶8GY w}W K-"zX939ƥQ߹ǭ>9`-yv fnj5d񪲬0C[FW qZjCw=t2mjZVޅ0@㑄SڂK}=.NWO\E3Nlf eh yHp4cpt /d--iMq S7\8}4$?nsmWjBZ7er^zCZW&gWK_ZȒfy%mpv8{B|w}+]QPUƫ*2/4áCJ7ls`)VscMRvбۀ,zmlͪ.%OHFį @` 0Ȟo .nA2P&.]YQ4S߭vZMTi1ΔYV"k<$fS]I&[&ꩇ}%zU11 ⧑$t=9}h0Fk7\v&KHn\s>|.(y]90uC5QsqSh2of1-Q5ZK!,{fqڮFW9>ZĦz<+# }8g9ξc8α/8sx[Jy7jh%d9o-)xPsگ89]B;|W:sryiQ=]C=LL*MӰVLxr3uBƉ T4_0}]51bj/Љ)=:3P%VcQV?sg[1g`24\Qabye4;gb·anagOMǠWtkWGC4XΪA}|g)H Vٖe-,/@Z{nA:ᐧLXBciW.MKŜSKǕlQ#v5 coY^ ͭ<|Gr3|=@mdG\JUpВiY>7QtjT5rKzfJirLuUܟrmɃ N;Si)OH=pJ(>ϊHHU~Ü-aX@aj^a)8Y,zs7- u4u@s|}Ιmm9@/ђZZ+4/{fՀԷun̼xyρLYtA-cN^h$ZοWjE /T¥Ḽ! :61{YߥeE|ŗ +d[Up6\]IfBsry]hx01K8Gh  ML#6X!tpI+ZW*(JМ&1Rm!+Zv en)em˙P|`-jIz{sL!ilRϫK<+?ShGqPvoбAK'Wa\w TN x_x5$8M3S4d?U<&m,qS% qjU&0MfM `2N߿I+/npveȪ @ԧld8Kam8z LtNNc;\&2jVBw lSS\Oc5ٳ|aJ"+,:˧߾i3? ]٥wTczW3i:T~UE ϸmJN\ ,u2}F!ҁ5b@ynca+7M\ .}OЌ9i'Lꖕplj[X oV,8c /1Ǜz vUǬ89z95X=L溜s.f`%\`͝O}k59DRݎq*+|@B->fi6W,rJJzz? ԙpA S, |Cצm_N$+ET64tVrl~Z2YwrWЫv<6Ozzg4\4&vΧIxK`PumJ73*`B}L̷ 9LгJ36 R8L2(Ԑ>zAФ>wvې8ht2J妿N1gPA>sp3x 'ukS7,?9rL3[[2)t9ODa82Ֆ.ۅ":jacjzrbACv Ŋ& (E;#NPK'Xk`Bbfrd̳ulG|Q7YqwQ E <m^x7ZR"z˱,-U&}C͟`MPjju6%Tk~e"pk/9z-˃;`w߃ܑu\\n.&X^u\. 4ƜuΎ3cjC/\CeYq!wut>`Pi^I|ܯoVwQs8Ι3y4xU9= `2TlneNayB2Xl[玗;By2\k?㳆@iG9-N,}BY{no4S9 }s_I?- u;qyZOHN[F*_1c5/Y#app,թuA`?Hh֯YJU20액~zҼ2lY6-XX!8!$S8?LHF[\uw`O 5f #pcU2 ^=E=$=H]+;UCBZ+*-RQz.7yWiNo'.ly 1` Kss9".=ȁ ^uPY:]E$TAJvL_ lِsfBAoDRkO x{jeWzw@بLy|wItz6r qF#FW7C/Nj԰puӏdL'"xc~3ѭ5!v#&Aw5}$?3B&ԥ Z6Wr iwr/7/XR)c^6) &kµԊЖD(廉duވ{1qѸ/ZsFUyS%հ'}NDI+cUU0vdC216[TյHqlsZ⦍eǷ:$BwA*uD Q=Kn]^z|<'ZvH&r>fҕIMV"|q+d":MU GHm]SjC?jHDH4iQ'Ts54XAɯ¹IRZDPvpڭ3w"t`#_kZYxyi)UQ屯4 r, Yl/K&Semu}0"+iqH$B b;#(Uva*e}k6S_ x  (-Q~5eH|wQ D?9?Q{G*\ܾ:/"LFA UIrY'9] _z;:qX{4PR0(Eɼ; j`K{zM2AI*$!*zK눬?WQT~ysu曟;T7FYRl4yy=`.ԩPAuRӫ:}T*Ug_<FT$JjTzDw+U15(.n~C$o5YGuDoXh"A'Ϗ.>,zLtcԎG(`)G:*eTbM(uA}T3tagj}p|xqUJkATewty)]y{9M0qu/Y*([#wfGWh=_} Xs]$aC0KMeo?h}idK= Ӯ:TOּߪUUS:U5Q.lJT`*_ysr|{o#`YUzgtc]ΡcU_l*]*aq+#* ػ M?AyHӓ;=ճ2[0P/&usTLuGq/Z9'=B84Wss+~rxsY[hFCR2N2Þx7\7]pm,9Zg5`GBqRҼy$SS]4yR_YR^Lq+V_.מx:8&9n7VR-RWT߆vF_(RO-JY@e'~|V!K~k߿.h>{r lzwUkvELupP1 ~/)) S)-aZ=A0ķSTN?_PzM]_"~O9Z<?Q;c׿yT9~cUXR7U(g$Gy_YMüV#9)jJ,uƌiD`~I{$/Ҿ5J/wD7WJ8¨P72EUHI =cVL)C:T]7JzW `ųU o=K04C5|x\xU%xWm>dV}4eq㮡7&][K_9lz~`a/ r鯾;̿_囗Ct%ƀ(Y*EMYF6LIvlPڽ)q8_WYx+1 ~wnP#ܔY1h l:h5ήJ`&R60fre(۸d{x9iHm,$葴|40( NuFe=w@0t+JFP(JV*-ǒ*9' Zdh}$ (+=!ǕN̄ MtF.) KBV,+=rXrjWur2¶d,b!%{)qD_+$t^\W,ˬ%Œ.9@Kri2\\ b% m̘En-L ҉.0O IuaC,E\AF&b)q3B݊,2HLudfXj:E ?Ks" .2K4" Xg@.F[ł|YHVKgLNjXsy3"Yeꍈ.gY:LE ,ZhpZ3YvVus{Ej"Ef,ҷX.oZE43/#ӭB)Vczf]htHNYh;c!&Xu@\g.LڭN +{9>w8.Lcm=g@D\7#/ň3άh 7 콨"7& n l|q6`#wU#:-~`gYo(!Q+㧃b.hX7׃Hm^ _GU冰h sR݊ņ&5"{ɹ u+w`|hCY2qXQx)^ n/л;H^ВD]YML!wSw͠ӕ?Ѡе?8Ż'vr~I#f_c$?+KA40A62ta>vohEvޫ&Evl3!^puHw;Xn]|SXD) l~Wm<4[׳fS.dW[.=uCHp,ILԣ@v2x6݊YKpZ{;hb͵0vuvn􄪯smVdKۓN^c5'y 74P|R5'Hj9vқO94g`cޢ@/aչ)Vv2ޝn-o;}AyA  &:D?#}9`1@y3Y ]yE738;J|8il.ܶ f]'Q9Mgd@i&n,_ }ܽ߀Z0F0YWWM{T1V]eg޷J%*eθI]T_6˻rY1IX* vlT(隫D@{' "᭬U 'IN$i9^➀ĝeWeA1fdo$3Icܰ_D]kN|bC]z~SR$2e1r¸fլƛt:V]xP /Im~ U?o[5,* <4G }&V2|/g1Y]&x7tP:r= l6lx+tLabmp[,b?|Ef,~'G8>G:{ 2ǮAދaF{q>‹" kCU߉-H߮^`s(/%]GǰD'ձH>(C ǾVMʴy<2V T2%4A$efDLm#U/i6xoڧSkQAJe^8}{ d>W>\vIl[@@lx`^6{v8Z+wjw0xl:]YEϛNN kDX6D#Q(C7ٮmCiS΀}\:ˆ^IE"ɨ\;wςsH }GM}6y|^'4 Vx'P,AkB?ѽZ SLm}u^qb4 UӠO{6uwV! 50-%aƂX wWa+~@O(a3Wc/ F^ːVP cf x |,bjLpwp3:2 h婳zTzi)ro.7MT vHQ68~I۴N5;ɗh2iz4ؒ$ifo'7A٬[ʡǐYS;u cftcIP:x݌-'eH{O0r|)oE! j[줓`i>+3N{&$s<ܙ_t>1{ _`o2;⤳%-c_=ll]+m욓|6DVx v9v;PipNZ|n3pF<{ پ}jw7Kʀ: I{:飦7Ƒ5᳢xz~ iOӑ˦ R8\"kP1ng + #,1\E %[9gGrW YIRrK]*j1t{:ĉ>+} .EL?~#VHw Rp;n޶).MOOy!;zH\%C7{DP/:%v *)]zc<>7IY*}C!//c6ЉlbتaIJ{F6\y7'J>NVR !:@6%ʝaPO-;DPX5;·3e=u~b1hѴ%` L34A`bDS4z066a Tl$mJ>Lln[hz-I61 nTme":;JIB\ǿjQr`2@rE E}( z6AF4 =^TP$Uw 1 {cĘyH XxlEBѢ !<'w~жAϼv` ?s"R[dz׿gGɢiZmQŷ= B/s^jR=BCljehɸ*t? A2m} %>ͫ}5Z2=83i7Q!̶e6n5g_dda%aLeS͍EI"''!\홣ĺk@ݟT%OWZ+qF?'\%{l>njxljbe GY+JwS"~.r*gZɦ u#kuី=1R|;xɚ%Mxyg`p۱8e#&lgqIY$}0٠HW(>~/lS*zG$~w|gT2ٴDɹ!6V!;\yggYq}LH蠬|ϸiunjڎO=O:=wUe 7W/9W˿\d$~v>ەM_=KVw7O N_dzƄ\F:}ɧãuw=[2 :dz;#Ό _^ REcѤ&ST4l{K?5XuxzI@hCF,˿u!Gaqyk8y7ڒm=7%\~:܂i#3ţ4lE듛|aPw4@+XOi"C[:./ Aq)hv DkZPָPu9aɺx4-Bp:=|z 㑲,/Y1Q6ֻ':{Jk=yG4wyS#YOwyrïv}`h)1Bf*gc˸WG 7%) =.6^JC:ba\|'fR҄0g/<ϫr E r֥k87+\>4k?Pp_*Ti?v8Tķ$90qdքd03bw=Ϳ5oj?q34:46!|K53oD!X)f}&6G.?F@qĩ«jZ70jIAms~& H#JzyPl!ΠPk=B|Z '<*ML#F<=o6 ?Jvq[VwԣlrdO;Comu9(:ˌPd B|7vHr.>5[StZ$if7( &k0 ic!c~-  LCFeFf`*+x<(svUPv.E7>79x=TV ]YNeHÛ+Fî:uK4V8z^GԺgt1&uL8gk?@,LS,-fYbv[3c3oBdſ:|ZG ՗7dĭJK LK(jGĘr%g3N,4V9Ҁyuqrըs1eC旒P Q#?E939[{/\e&Xjg \,#TS=j.idms4gŎ3\rSb msxKuTs:3&u^.ht靑݆P;4f9V1 3ꔤPyK `uͽ,4ec_b;ɆV 8WL@#8{SAvyvOn1iƊJ2F:p:༽?!ر<@f@T8`$/‰Phk2t9q7`kil6gA X"9KP +64G|Mx+xq`ZW+3/9 [FO#*?l9g62SkI-{89u"n T.]HXZQϼa hrfDOWv#Bt2l ODz2`_Y`]K;h( c.$ZB'bPƲ3"D*:Tgߵxo2 bIMxnvP#oq1֞N}4i^pԕF_8u ?~kG1(DfwH\]0T131(#c.ÞS׹j h.0WIJ:`'73st/ը *x$Мb"ipT4\Ì;: \0!ݶ(m0$X^Ky!>J*R 4jA401:Xb.J\Ƅ6v*7;-[Sr-ư7y?ި-?A*C(avRjz=X/LW}ۿL p=17Xޑi0_7>HDjTB"(@ħnl*]'N@j}VJsJe2[@шM}r\;:.;:jx*v1 C]j֛&j/ϳp;Ỳn9]gD60r:椌D Ԣ,0N_6Z3l=)u?!8a;*e;{7H$k8r_(i >vjED_YVCayu I|췗%ՠV}24 #"v~{ _6l>#%[R|O^}Dg<ѥΡe4amrA2߿-av|{G {Ӝ~!xKIiK=i(Ҟh\,u~Β{:rܯ=R<%FgNLܾ'c]#qQM^#\}=Q\~KCڧZ=[nΟCcG+α~GGГMXˎ+72J[ވۄ/1@O7-vmOD_nezpoSHɞ2'.5~T!\Fduo5!hO<0CÐVIoy _&G} 9)oчG|QOP%9qHW~I|c^_GV#&ID8\#>fg{b&] BPIrM0}o"@| ^6*2'H#,YQޒwu 7BV?x ŋ^~܇B0D{248 H"3+؏>ep_Gz} +'ʫB,Gچ=)NH?ZԖAxן&3|藦-NBO<*5~gPB4glA#c(R~5[/!e_pFSGHNZG_CA?Za˃Oѥ}3_//ckѷp\_ِT'fw;V"qL0qcOp(\Mk; oy=V-]6={7me8?V"q6s4w_.W1}5ל0D%܏{("&LZ?HHF?o2žL5 D=30ɮnW+s04YrDə ?.LxǷr]C=~k[Iā';ثnƋnc= Άmw84^{ ?`4GC6|9 ?~Tm1̎{/G97I8oK %P=2Ln?Ruv')P˘?h郄̬/hfqdS;W[]A=F#C,Mg'*J CziJA-d"}G=+ISƛіRl34?Ywu9 ~tu#%JZitS5J%<,@Y;H7$3_m ] j4BN!O$}e00$ ʿJ@|AMYJAc6?m˥LbOI"  7Ҟ1ӷe+P24^o%0tbyc\k?(.N͟gW F"7?/1'k īoYi@B ~ntY*`(V|2UOeMlxbAE DCr 4'1Δuѱ9 :$-Tulg%rM} RN8C}JWm^/nnڼjXY^ Ӻ=<畏Sbab􈘓Ƕg y~u]LGZljX[P3|#佪KɈ+h+j:baĕ-DXHT+b _`.o:ņXĬX8򀉇1Pk&ƈ. r.Uf⌒Z{vQܹo8JIlzW\^mi0}<8U1F>(g@?'j^{5ܒ>0Ὅk6@Z0bGW^HӁldwl?E NgM(\"$KJ3 `蘞\.̹ĦRO9uk:Nަx6ƂS\L,}tѫdn,NLrΩ'Դ@, /Q$Tš%1nussZQ VThJR fvS'` ]ԅav74/1j%jU(o8Er)XZ7d<>H}T}uDsb-@K/,y8 QB#m``xRԥ@S+Dʡd^$&lՙיGxlc`b7-X-n*@&X 0`-<+++:keZKa7/YI(B,E`@u,޿ځ O'~*loGo*at:O7ۆ[\.Byy^sHi uJ lƷ> {ez9走kEip}ڄ\KsSWfOilfE\ۡ_F`"͇p'?Jxxw*LXܧ\`PTI L {ժϑ=r,upeK .Nl8'qDOlT ,Zf> ; Ȩsi۴ǺIHs05:(o:`d-.!^{cI\3lzi[B^lN]Ub*D&Hc.Ok痃!x&j.[fKyru^gA/(Cm:sq= gM`(HqDUkHhmTfj2f6jdjX]ꌤ= `1n׈e86ZH4,Ukpʔm/T$= c=;f ;5i,-_aSXidlҦʼ WO#x:!mH=.(T*YHRǜi0 ;rٵH"i[0´D/a{$J\I7_i.{uA-PVj 56 48iAGnkH|:hgW>tx&aE1IS18EC8ݵtŐn嵜!(hf+y׸RA4u[C ntlp*^1~ orsqhT[N|>WV"W E&B[6S<z%S[i8N" n[H(<7Hir@G'8Dju$T$e71^ڸTtnkUab Wilihg¹E@gU<\Z,;V@~fҌS%)2\z8X ,4ELN7C:lq I1|}vAXw =e*=,*^M#h@! +N@dEXD\/y)/:tR0f{|z,UId7RRӦI:&KTpM $+G| QPG$or [)~9'6? `gFPj5F{inT`{5hVMyyꝞJx_CMC@ }5m֯i?kU\}CPYXshY;G@r=ol9wC:: ؀6 e >"n4VmrIO 1's?W^哗ˎ :<]'TeC/$ -'ȹbL=CGC/:ۡI8=5F,Ӈa4x\䌼)-}kv6bB oߴÃ$9ˢ!'J:{Km ٱ|G;4Ǟ%!=mobHkG<:7P F6g-=  Z$T AؑVAvdBK/WיԜd}U٠ ΟmdLGY R=EA07i 0zfɦ-) 7طc5(?8p RylIɦiGy!GL>-z]:ҍkN%-ٟL, ӑ"Gh o=CWUU?6lHoa4Gd<8m5YPpG3Hp.wIAzrѺQJC;?MNvM{A麥nȭkDk<ܛe;}'qx2OQv&(yGn8zM> >D9FA߱AAږ*/;$7dQ(>N~gj@ Wto蹨'd후dcBG9}ù`6W/=v8qFB7m;g ϟ3pJ-AY_(l؛Tw |à>QfMnqɓ':fa(K[瀄Fcq!<qp'zN BfƦ{pʐ{ySza X.NEoi$S[B<#gtGB\S1}G ڂ}+}D}G4Nf1Ĕ&M?[&zGk98AayAw عAIWM y$EkUzX A~>&dlA˿@fl'B'~߆{G>O5 y.Կcǭ$ߤ{JՒ?!oS)E=gM&!6WYN;o\##z_߲T8NN_|#QvoF_ƕ:Y1@탆*x̠ svHCBKS} 7SΐۧCoj8Of/%l~ޓ?'|&%3PlyG/;a~kWpȀ#aLwf;/us)83sG~C߸4=ңj 95zAq/ c.~C$y4ur^؍NID? kv)}=}%7>mbF%K!y{ǿ#ýG_)1)6īF1_-{|C}"ac/-4-(O?iR ʆY#@Of҂ke1S%㈠ ? ['j#)CCuQyEɢ ۏ yI'AID$637}]D L r!t$tr 7"?5bAC"= !Rm Uhᘓ(hﬡfzl]89{\1~}$HpԎY0*$JLPr> dl(0i5;X(@|y<BB9m%ANzȰǠ!&9%GѺCF|sHCpB%|}*$Ttܰz=ea_p|9o1ٸ}[FB!Q½R ?fI\3Kkʼn' cBu V6˄ˁ. t#cB,zo*H@ϭݒP4#Ev aӄ(PA=t{zJr׮ȯ20S+ *{J8dzj/ |cAs݌]čF$7{iB{B'jqhF*:eeYmIm o##tW Z*-Ӳ GoetŹR#$S'uw%aH*33>"{;4R qدׅ[XDR'Z#+81DVhVԿ:]GBpf%rTUo.$dKA Ju& H9@/~vPW$R*BEOpN-S*iw3$UnRJ`^r9.8@eP,,3A |gVJ y]9cqCq 4j%)E@YKYCw;iQ8͙JʙݕrL8fOoIi#[GK8p,(mbqB\uk⇜ <_;9]wc&ɲ,u;b8M%ZL U0URgD`J <ZTVPm89]3aX1X 6rxv B bn'SŻ%U5ÀrSy;}Jhir>EpXbp. w^o緪X\bmqT[bb+`]xʮ`$HtR8UoWcʏx%I}4Hտ7I=ƗЎ}<0vJNl/+G;m!2`ϵSJ {U8X4E;G."}VXYW_h]=\~=fyǓe9VeߎWdhj6c8hBP dĘ!7]DzvcieHBMR>8 u=þ`g$M\n*/㸤|qLDhݝtf\%ѫӄr*>f]>z.3+!KO֯qp9T@[o>i݀-q3mtkx :6):[5I#iNyVZ}(YBu/{9~̢UI_Ӯ˙ NΖ*`OAdPSC[B:Z1\P՜`iLg n+On)滁5'Ҋ Lo;P]Ϧq^qB/+KAX΋gvkx*!'kD/#B4v=*4 7ES=2TcaX Aֺ`:\H-(kD:<ޣZR  GĦƛ؈(W䢀Jv†m4CSYr ִ ݲJG5z:{oKW)@P^6p bZqr 9c^zvV(5Z)ND@(iEUq69h #%n/ f3@t=KUbAYx{Kvtbڡ$fOiTtw.N6fnOA?WJLJuG9;x~mS ռwZPjÌ 株*ei%?MB~D.ݪ~%^#Igg#])%EP7BI0I"-AS5*EKL5JDNhG/+ Є\CE`zNK#2kJpcRjibSzL* C1}[lL=||n B̍:{3-5X X  a?T,yS ^;I"l-bQpR,bgk|2LU_zl> RLmtϹeۣ飴׫m_,[ocu;:*68B0Xg@E3sh!v#:bMV3,lK2;n.l;>467I\lzdFQ 73- Z?v֖(΋d=սVsw罅??xgRm cnA-m7/<2_D7) f}mYpNY{1b34[p]JqNm-" >ER`|~ٗ MO) x ܛA!N*98B&( R|5:a:3َWKKj &\Eߛ,!yůh!l5c8vPwvZ?ljj,6)(bt8VH*#y&oa:SChV|Al]23$"]?5~O 6D"&E{#E(L}*BaU*-Swל VnX.Ӑ' b;D+&LBQ`UwKV)yfrm$(`#NTהhaۚфQ9 kc-6d@4AAmD>2 la_L8`1riqgr?hS[O kBuՓA~qe1\E>HN`ø_/ \g x\9zQ HTr` as;t7f7wV\Yh#C.~&Z1wa cU.Km$mϴD]0t%ه l0SdI'3ƭKcr&.S+,룣 6*Kz{$)Oh;9RZIX@D0C'Le͋s='$5L0;E*W%-Dx\~*aZ iyFWԛnK=letR3{M 53t5Nj"fw:f jg;eke (fiu)_.ԍ`۲<:&L-NNkby}tsoЮ-m%m^υ|^Z+XdT.B]ӈժk*VESi՝n 5%"Z#f: eTrv{W ,˸3 o~X-QL@㢛tϳ jޑ3ybO.׮au@bֽղ)*iH+An>;تv8nJw<ҦNY< 9d o͉ظM;fESъ"\vkOby1M;KDRN2oU'DRYpU]I&aK1ׂFfjײ#\JFdk#JikĀ2#87oFe#հe#Pn`{n`34ZPo&[!b%ؼ.jgc7Q'd }ޤ;l[![h[hβ1E5kkʑ\M3l:'MD>qT 6gKq)sg+@,n]i8nJ2 dѧ'-3^!PZX9Aj iLT̻Ɗrj#"9ZQ5h sa^^ ;1WqJk!~%b 3oW^"\YLۮ0tK'@$xmJd}=MzOf(nx#ﵦp^}PgPxv1N< vxz2d,d:F*hܩB!X합Zs|@K .T'NIS"@&Deqgu\XpEp:D*]٢Ӹ7ފT1툅l} cbG w$͏-% G#cP"m|(dX0@iE[ , ]ja_`ޮai V_R<(N #2$?P¹)"&G^ U2,E֗1b^qb pÕ/֢|+g;F63FLb]4k.f=+F?"28CY9\ZCjrϼA qs##r0M塝 1A̒Cȋpt":rO-!x1$D|PT3Gh^M !dJx\qxk+2 !H3}S[T#ꔊ?)Y)Rb'.g=i"B ]1YS6 U{mtb2:h:$]9[F:lFPxpUfV˕S@jT̻CYZ^8ne+!|0XxDCuc#؂.F ⠪Ok)7{AH+Y~-G믧 "݋)wNdEC VzƺR ,Tr!Tg?X; E|FPwޮ(PH9 B}̪&WVơjq:94Ps&YLLE#Cs|@u/5 aFbRWx<2&a!@&]-K[5=aVn`BXp10*   f1M#0 f. Q]@ ZM/=+#qD7S8J^XYd)"nkԤȩ(Gva[ݷ1mѲ4@KR^Tb]dk 墽XrM L̥hFً6g^.EZ. NlovqwHu"%E4 XrU)W`dլvы(@NaBN8vfer4bS g'6Dȝ*mEC7qZsm̞hlQʚ,Z6t@ 8Y U;xl~߭k"Wiȏ#9,Fm؜3b￰RC9pPSVG~',՘M[^ k@7x`5D(`o^YX لsz:80vEڦ!0 Uo밁քy),LDI9ۉ_&P"Sp$<Ӑ:x4ۉ,7Yɿ;r;dp.Dܲ|l֫tZ._ŧydK̶DcbJ̫>'PZπ#Q`pwO_VN/rTqWn^)Z&g+)T'$UP(}UXA5Wn8Aʕ 8FD@zJY%$ ff S[8g?7os#\:u3sllpEonm"bGf4 \` AKrt>4 /0yX鬎ޯut4uQ/w-j@JJH7=#(Xy=a q,ukl6eg}$  ΉhK}h󵸧 7zDC le4W @pV IJB^bΘ*3|Oq\ pol减M ;9<`t|!g@ 2FlT AĚMkH F&af+@h*{A 3>>x!XxKYvl_>&UtW"yL/iK*%hͳ p -z?Ś 4U,_U _3tEr|h5A{<Jޕ'4q56J{}~5.`Pf]YW .8} duVN5[>[N9::Df 825 wgTRf+"+.e`њ {k` ]98w5EV˭ ܲy"fؚ9Z,ʔe[3TN &6wHU\ 1 G}tRo i\w Y2bzZk[X=r5z`o|~̄S:^f{ `E.l,yWw*!qKS~ a׫Ft`wcDQa9F> (h]0ͯr2a 7k_-aӦ^RGsY}6ô3C8' 1uC |,^s|ܿSA9A8W랳 )šK  B|܍t_tnI-BOl\tzWb1#q+QUsuv&__=- aQ:jG cVī)峚jՊJ)'@]n Kj'P}xjIs`hH)=}3]~aʹ):ZFą1s[BT:?AMZdadUul{ZJS; .ԷcT좲,XVVڌbp3:WDObV&Mz)(찧mݞPkvݜswQZ-W5YǨg=n#\jTܶkoU{L 7+4r%ԭa/ zIasXU+WE[ T3HC=o`y)~BY,Q8uˋ`90\-+SFl^kG["WdtN~Q%4 Pydf6ŝWStx8ep1΁N{sB?|z`O֪c?}2T}UpUͥ0ql~D# uabVdZ1=짐ykfJ7p@H8 Wf|6q*NEu= iUv i?Nj<1HTʈ pe*,O%(['&aip&U18A(N-SŦ>0%p/afCIwNN! T_ MF;T%&(]e81xܮL㎈Wz4ȿw  s-[5 Rubqv77& bF|u^> z乾؞[^vT[. vT-ձ$YmYҠGMq׵n}EKLRMv=hn5t:j_gwλJ݋Km=seWf s0O6k_x’z8Bu |x@tВ ڸ؇(i(mn+"7363ODSȹ|t ɇϵMOOAojXP:.[hF&Юz|fX^i:P|,׬UohbshNV륷3N*ð;$w:ӅPkNousv]9ܱrP[5CuKgמ9ah#!EzZ &X<}j'jiJ3}[ǫ :wmkOAwPFήAF;'qې eُ4*q<<ڡGFLJ}=ǎzz6!{:s.!5BCe6m9Mc~S2ېۼm_U_iP@P߃@LUA\|~Q٤'o݇ kraF ; ?c-(fg轟vp{/q<¿U==" 9'T=~g>I~;ځבO_ߐA7K+⯓Ntɀx#'MS7n#6"J]_k iy}Iy[g|KϮ]l7_м6{bC=R#2_qisMNvƅoS+pUnΔ3^tpUa0kK6o-e"Ʌ'+<iԪcnF|^߹oNF?$-si>w<Y&K!_YøIL8A22'J L YHxohB֢Q'>P*r:M4a9:ygU%hVg_\(Eq2+&@M?~?sG?f؂H^ =hv;dg㯞W~{uyTt/@x3όxppX8oeqb$I!=%Bg/r17R &gI.@78Kn{%{HGiz (H_`”47Lƾ({=_J+'%lT'#K#W H(G?jht6CSE0JUCя _Q| dE~5@8+lmmV\ɱÞtb ~iUktDr1A8 O{~!=^P@H} 369ѮG%fy A5 9EcU۳|Foe}kKqEq M٥uɁ(jdHi>Z=*ȘwPG:;yslE~Ms?@P?=̤z|!ptcddaIh"=5bUots[ƅ=+o#>7FJ?-\.#rTc ݣ)|t>)\oe IIBvр6W#6P2#.zQ$>9gn>VܔH?hY :C`,҇ǵ]YWN[|҃|zؙb80oJ!R? KJA2;=~/s?$afidڱ{{ܧwkJ8GZ U)h,-'t~o?6\+.V-v!5YVmm M_=ƿ} ?r)irm׶KcQP伯t=M긐r d_H9#%K2o<>Hy?2a-8=#xL̏HPp: G/?` u"22fMB#kf||gsfR et)H8DYcc1qȈ[_d[;.xưN㌠ʘ$xx:/JՆJBvAbeeSL=ĂiלEZ­MJ@`21КX'ӹ GoWvbǁ+6=a^E!%(À¹1Fz!Pҋ*?1}3"eԑ% ֳd/Uf\b:W G㚨bAӰ!q&'pnSsb/ɽPTxtWP_bAد 'VY]wH~x`՝x9?!PG`T ^+(1~E)/:;K^XfcnPť}R@3FMyR18=1$&FN'zr"M ga*sgQ:ÉЦvڅk_ݺMMrU$YMq2[密W"߽[MxM>["JS`sO3>,CfKAtF:sOv8B롨SMѥbg%Sv =so0ئ`AKbMTݴ1pS֜_ }9t~ tS "_pQuI*Bou'! \7OAH_5'S,KF^SGz#NUORA9kew~&'˱'oN-uZHTe*VOgnrl F6PN^_9c7L=YD[ ld=*QW-$:KFr1Ts'ϫr9VD^ҩv y,Mq:y5d8=LᝤW%:G(zw3UMY/.: ˜=DG ,yY=@`s4O Z*鄻c9"HHl n$UesO<_e`I O5dkW*NT EF+Q>tOwGX'_i~(`6 4A]<*=ՑdK䬦gvTM8*/u8/j=Eφq:F*(h; 79beovcgX.QLM5?lfRWrqݵ;\hq eo%X(N|  <)@/:hh`uFBknbٗnPf)>dbk-N9U Tx~`/ĝqr.g7؅ntT Pp98x$Zë=iR10K;Pu4)3=zEM:!U{;Bmov.g=tH|Yȷz~ͮfx ߶T%(-6s]"5yK˖ 1;>f,Q+юOl!=Szy]`5 c|bF T6 McҼ#OaxXg!t9ZO~|#p͂ *(d5FC[Nl`iϖ"Pp}(G)Tf fy|]ń?Sk@VN ԕ^6z$ ?ZΤ[VtA]TN{kN_[귆 0녖Sqb/u˵.Ǟ@D~/zq|1^2: L1,x=61]Ks.cgo1ƴ:Ӎ-bFhX̲h `x YjR V"=ю MHym&?^s|s~ܡƙlĤ)Ku =)W+VNz-2%ɠB21}Me24N&Dp#o Hr/xs@y > m`ڧ&!̺7s␝8::Bqsz"wLQ8aP+ux 1^?l µOգJ |]h.L)HS U:T@#*G/jTǰ@_kgX{qg$ O3NO0uIս|i.dP8C#B[NzR %܍7^m2 H%)= V_`VǺHM{L%7ďD1I1D٥p^&v+X6j,R'@d`@5`kmm:S]8RU-`c60T K3i ]fd5bҼ[M?abZSؖcv+=m\NT1mU>(_ /~P8XpډA.S#)$rb)t,˼b YD<FwT0‹B ΃rGJ.w04ceR#Ka;QEΰvzk8_h3 k(^(pRMrbې?N4t,inq QS4~W92b[uJhg.u5̄LM0a,,os+X2m: 14X;5ߝWbK7-d84-W%ui//"P,-,]@nl]:bUж_h@#=e} Ml)"TfY'Nx]0|BD]+R_|5qi@Ƒ^:kb~9d,!Puy/S(+Sa;4 ݼH*c5bfl:h ^U=@w'Mf\—sbʡsnk<W.|A~-q8l4m?/٘:+/m9~}'t'kxz"]s`c){P b13j85)+lfIx{bLq? *i '/QJ#>,$nLu8 A0 SfZ' ܜ@3.u]MD]+b;bR%7+;Η[+ ]BISD.\΍6#+PFD탘#VJJ W`⿭t1@u25D_feC[֡f4%(!T+ׇkm(=+D(ڠjz8DZ~}E1?_hĺq9hwJXŻ!Ds#'_`,́Zt٣(oMUɆlXᔈч'hNJWw_X/:"{ lx(1Bu1dNȘaSG"s<罠qXs?ENϞcGtŌtoE;!Ɩ^0Wm#p =KsTOxޗt @/.Ծ %' j*;fN 7NS VاWT ]{aCI%pB u7`Y\j>N"aLf@fx)$xi"zB-V NuǰLtJilS$qOmi$=Klɔj߀FL30O<7 Hm՘L]C![}@OTն' [[bo$^lH]g"g4ԭ \SQ|h^Vh زU,X|]D2ɞ#*D( /\Rd;kj'"[0:KOOP񥊄`&cC9cm=_] WwB{xaڜҧ5k pK00ͺdcԑr ^3JX%[[*u2 Fs]'^;V[ g M]V*H23d4B.QX72{S3ghlK]ؑ$C>mpjՀah 88ںH1f%bXze hW QbgjWLcgV֕=Įwvt:73K˥Pi.Ǽ}%-.v%oB/IYZ fN&V ~LO"W J68vb)P ." |υuw,E܂׳l-` s)^y:FQ U:e@tH>]Dw)Q +iMU#y^1 ֻ]=*0(s~cX i>@ a U=BV>a_i.V% \?a\)چE|t'@<+L`]"愭bʌ>oXZWysP_q0}9)1SƢlDBAg;laz͋" 9 Z0@[Lc-,n:{klwy_G$.YC,Cל[_[`? Y/o+bu }mư%@+m4?L73\!&[juMcqH"ٹ }A 3PLqC%_t86UEUG8EYltQϬzjx \a.1pigʅk>1X0"iŜ/.czfA//E![4MrttO^NcE^,=.;S 6Nl?>-@ղ+\3^B=YAWop+1k  w:esf`#g DC M(W|~Nj1uaT{_z OpO1CkT$/ -w'[BTJnUFD_ّ̉&{w ~S! m.4f* G.&<"j]("++ C¾rι%V"L倍Ju ) z CSzG% -idQN`0`7rJLl=5rP%Pߥ -* ]Mm"tZZ WߣHmݽ{bU&9)恊=T\k}!-e'(#'>[/Q$$EȠus/x>|~籩2%Sa:)UJk@ ^n_$nvWP3Z>`Ī'x.& _ehcN Z^|Rgūo?"HB͎B6:w@2TT+Cxu!H`B6p?\D?xWOwOU +߽hYs,M%lT"pH)$5;PieF<]~BK?% [ٷVKc^|osJYYh Z+FBI.[+C1֗o2;>Z=;QEمDP`kU|N)6ђ-$~OYU94a8 뛪xջ57nj@ G8M',詣F$.4x+ WY`&C@NU79ǜ`ĝt-9\sq>BEɫ8;!1iVRYM.`9fZ$gb&ÁRRzϟF &:@fRL*yOkUeɱNd0JȔOovRա32|,*-KX 792<zE*VRaL=sC%Ɂ<ފde]y54z pʷ; '4Ƀi17?Q *;9VW㬵+^73g**LD%PzC]U:LUEZlT6S2aTتl' -SZ{4Ie[TDcڹ ^vYBiЬv5^u}l ܳ=B2]!V&ң*-DQE$V]pC{"Ff L!ʔ͐'S¬89d*qYT>n?jtM-re3.M%TPwŽ 8( y7Dt\xx,/wdrpӀ6  y hDcP*h܇gǤR1$0??7k=ŠR42'=}biDw*)q2"-İ*b@+@ĊxF:2*=YZ zѨ4<7ϝۊz9{ASLC;cIM)DLᙊ 9q%L1XE*1b]_w4>IvE%,iM./6iK.Zl/)h"Rˊ^ \1%a"Pwj23`F^lZ^! Q^jmUr 6]YVf7fE}Ϊ (>X*)VA=_XUsGy?U`X:K!uՀ eΫ!m=\4V.YohIIRa`[~BuzقWu2 aXXD4yױ%bˏ)JzP X W +P68/ce1Cő(*Kߚ. 2}EUB{ԘU<^Іf /1/μA]4-i2C JX84yz'pV&ֱJնڽ 2<9 A@Hewfb9TF鴟$o`."8'b4l;0PgPhYhlMM70d R?RW%QAejOIk8$TH5*ğOޯY:ݷmHX1eG8BQ@ULPw;Tϣ"U;ȳ@ط)(_X-qs Kw-Srfr V:9M/{b-g@ xW4(UӕH];~5hkA%P}t[clTkԫ.8aIZJZKW |N+#P pg$z+9>oZjVYZjnE}&~~yrȚ==Q Gz Xy`bjJ{Lj_cpy\'YU+^LdVFkes'p|DՎa$S""4zs6/9j8&)#v˟Ohz-HE .;c 8n"R,;N%1S1 H Â?blKG,8_oriהcڵMP"sxՈ Ua@h"젘 "3z>](@KeTDc糍53TXr>}4,bYy++PC*rúf] tX:*(W~uv:r/"rUN}?kg|}a,ڢ 9’j|o4\+ 8X\]:ruZei<#Ueu6nW eL3kܔƕaOXݜZ]OgFD\Es끆5xI({>5cɂC)$!v8M}(p2[ X1%NDeÉFwSvk:eN-4s<>^F_q3E e@g/"W4"'l ~isuPLB]Y\U61_CJ:ԇ‚e-2eHtT'fAhPAa1J;\8< 3NM~3m^"g.a O U8BJ' *maR;<#\θmҪڐRBE:?e^eb]/X(z.Hyw9x4nRhYZ.DԠp@皉\ SAǍ:_X1YXP=0OڦtJn=%-l^Xwfl\vߡ%{Go(gr2܇jܽ% [QV@o2yIE#1D rQzM&$Jz)@AFgdX8OTEtdSxiҤY}9Z4AUi1_oo7I9CȲ¦Ñ[J_tvܒS=`t;p?4EI5A?CcK;A{aQg![ j=9'Ât;aGKoGGv^? 6cb6)8'dJ{+aʶ~ 9_v'َ:GE^J|fQԐ aXזeـ#y^oDNGP*TjLqZuFғ exA|T4qQ[-H{iq(e9icʔLj<٥?CaWބc/IH[IYxDzA ,;ڍj\r}ChdiI3P'lC5ZeЊV9=LzQ/"GN擈k2ң1_#&1(Nd:3S4y$4ssH7Hc: DyDZ*٬|IM!H.4r Jr첑.zCc)xrb0ęHHۿx:/ORj} ətGkoI ˔]G$D<+ʛ4%%jceO*EpIIBBGfik9([(Ϳ/>LcPĐ!xU0YD4$JOh#E8w< z Ɍ!1 #k\$BR ,RH((H/uX|2{ůIH'0JȺ 'ϥ!2t÷޳gr&#<ϲ Q"6gkx2FkYr_@+)C'O蓃 z4\6Lj͒8V766Fi4Cg Gjj:O Iؐ>RjϾK#4?!2TY!hЁwia V9ߍyi j/C%_ dؾO.b^f'K| ,qΚ)ki>0'A ڧ}&{#,H2Q±C2m'״t)zL3[my -r(Hv]3L8<4zt?YA-xe!r(gf] ~hm*)&ˏdT/~.POe[w&A XG̢?k<dPv;\ǍHIN$ ޘhP:4:!rG=b*$P9-3,P2m?mRԱq|/qLO<2"삙FP^>KF3o$ik_MAߖk|8K6}fHɚSpy>|Mzܷ,j.jMc XI@Fgve '&=vpJ^>z8(Mmk+h;%d6HCш(V5DM:͈} 2SIyзZg}Džs_M ?"U''&uelwBMNuIjn= K<}tQ< nZ4DpBh_ܲ7z .fcZ/9H29SVģf؛hdQ3ipLG"c|-Np9`>򜿍0x7,ѓM{mǟ?g7YR =;}x6[k01M|']I{NGHiO }'*$K|w? 1P$_W]DwU]JD^1(o6Q)1PB + `_HQu`df5,6iXS%4z_cu~ֲ[g+ #G>> IW3AY Ġkj%Y VlF#Y'ki1Df#wZrD"b^x_=_]=]{怫2Kٸ՚Ǔ/c؛]2~aeo| ]z}58D3ٺӸ7*Iz8vk":||ewV_[  ǵt2[_A7:G{fS7{ ]-w ]Z&$jK/ߗiC'‡`lQQT#Oi|[ 'x̦d2HIʌ?mT7)4ڕWڲ2jq|/ ’_ʘU7CGx:N%=?PJ֜srO1LŊi \yիӹWq[[x,{"[ Ub)8HP&0`hbUWZÚuSgW:C2J4,|BV"OZ&|K,ܓa { -宋b{0Q׼7P5,BR؇@c)eĮllyk׳PJ$FpAj)Ŗ%T"ŵ Wx=DWJР UhOO 3P22PnB xEyX0:h"Yxp7":xz3Q0q0oH9'sYoS٤`K8)vmYN:8 ˌk@N?z**jBX. &TW=z|]"ymtzY*R>4. Z@Q٥j鞉~ "eRف:KɫcI5n`dhEtR֡f_!} qW0 Lpd6`(°򾮗<;YC`FnPW}{oZz/۫~+N0\'^IZ$gX 2`iذaTIF}v|q"Op7 7>nRw',^xe"&RAyPzx^hcѭ yHD"%h {x-΅g? <Vg_n.⮄"uhձŀ7׼ZݩN, 6RRZ\Jn2o KrWq@3f_lm/w-g0~UkY܊$0 n/ =R+u! /HTwX Y)7nكbHT"bnݬT-w 7̥ Zsq{KjMf|A$W<mˣks_rd*]$𞻥mx{k- g }xH&vY( JӼZ!."CӋedوd 2r"k޺_-Rqs=z!9,pXZr/5PUKn_d,Ȥ!3+Gj<)vC.N/yvG;SeI\tx rle X;)ox|k+>^ID Md?ń&H\I, *5sӼwȑ{KG nLR!'2U,1([Q7=m[?ɽ:M=9,ZjL|5}X2c.\~ )[_bq* o}`mї.4#06͇ka@kAIhU.jg+dUTk]+Bh}Y6\!KRx.zPo>חY+}_ idmoG]Y,|D} *dr2Wrz!t0gUݼ@}H^ڎȞcvfbK!/G.,>ԓ7>ŇnimOtJuA^4؃Z=VaTFs-6!8LV 6;Xd+ T\~ob % 76k7 1r*AB.} xuď 'ʒRW%m_RV[aH],8|pxU>z*p.{c4$C@MyrgAAIouF-ghWh#OtI⠉''2[ m>؅"5]qv 7x!<,#1=TA9jVudg< AVz hPognpfD9@x]yar#xzPZ ~2P:gt`/U]: P/<x@R@p؍_G bdE>XUwz{#)8I /0+ŽY$X(ل 0ߝZ@GRxh.4P}y%W~`Z*pcDj#yC?sscz/.>ȶ#XDURl%";e<-f0"^|mIZG[^Vb0E+ Qoc #.aY7P)<J&;$W ~Przо-&[1XPUQW?ሀhމ/`l5G^L2DyÂ6.4ǭ{/:m5;kص5 6HPsW YW*(;juĎx8vX*K@5ϡu1A& ֽ- B 5Uֹ޺8ugwsvIM8Lpv>A}z8MEY,w#$ؗ(Qj4v÷Uf;.LyepB"#Xn}%&e5[0`6AL3%6rq5}UrS[SDTR;kdOr+*`NA'{VkVx>-b/ 505~x2^)/h:emw6pAT3yfr.B F!.) C\ ;v z_Dh +@_+7#ƲZ!Dae >A`w@Nb M7ؒ9pVGR@Na7-1t9Ⱥ+ ׎}ճ ü,`Y^3NjNnh3$p[7RysO@Շel&!"TDzQPCH%6;KRf-EXǖԱW]a./t3FRUEa5 VA&V˰0eRl dJw^B:P D?qWP9MJ\P!X᪝gb1{}NʚQ힨u{ v S ,Fݔ2bPEu4!n"T rW[A+a/ͪCS&N8 `Q!6֘#fl+ uR{}ߚ3bWknGu֒'z!+nWPFvޥU4{>}Й2nigƁĨUґv Ψr:x|BѲj}xՓ"eE7Ta\k%.9B@Ԡ|'؛+%V> 6䚫Ӗ&,ȷ t:߳hh<WH0#|F)M{]rS|ma҆Ѹփb2#F-d:`/ˀg +D šo=ev@p8~eE.צCŞꯑl+I#_Ļ^K.IU I*-{"y"%jG-[)egT@,ҞW VϤXZUh{6r"5Ċ4qSfގ~b;VE9FdbƳvVJIY5@nZ8Th,KO}COaݹnsB 0BpD# %'Q^>:iPrJg paʜY`$jJvxܕ]eM^㞟-\d!٬Z 51f ]wBISc"J{niMXͿ4btλ &[DxUf877IMل X"riPL}Z,,RnACZCT͎ iXV*G@ڍE 5jxQ6S~Ƞf0jۿi]# #Fl۟tv<}@z;PS"Zb:)9ۡ:V/&T,f1E\ّEԘ-q{L؝VXHxzEE6R%E5fŹCZw[;Fklל,fdD ;NJu~W_^oty R{& R#b[us&/ীS6%}Ivc+^S-=|:Ώ v6|y ./1dMh6_77u{Kg]7qb_uS a",t:,M=RO-r*:~t{n q.^8vW}z@#*U0'm\U-lߣSMB{:uSbBis{eoh!ImD fleɨ>(\]un$W@=)X nY|k!J.d$Z:OSW%04٬谌Ѓt9j]Zx qEoq?$c/JŶ/.Q/(@q$6Tj B"c5s;!"\68$}"J5›F5`Iaճ7hvcFhq[ވɲRwr۠sc):FE c_Du[j !"IGRw /3ށtcSM:^\:L)ѽlo1-vd/yݎ\xgH-蟬~5-{=">!˥̅Qhxj!>}Fe;G*,ݰB+dΏl(޽|4^7^LVv=lvm`z7/SDS[zh{ჾ'&D^H34tla߸e ko1 .7z{|&"S'-^s\]%tdL5g3[3Azsc===hv>M[iTORqS:l{z:/m{54z'[>LERi td_w 6T'gp:$h|[jp!kRՐv4{>9~^b3Up4.jgB3_W:x5D_, ¾Ly΃/:?lڶ_Mcd i ;#"|;d?2 nHG'u..Gp܆6QԚ>F&KI>)y*oϞk|DlMiZ$_>6TP }efq 8njlf藐Ԙj t֗(6dkI)?.$7b)c(y9b]D.O3 5}J~JE-i7txDKJm匶t䟄2M=;e$ѡDh.4;#< grtELJG|./|D[gkĜ8KwKOks(9_J~h=MB3?QQͭH7IDv ֞ϐ93z1ܕynIfBF#TtHw4fEI CPIzn5\CA|H^OD!w Wd!9-uBr: zD!%>D>Jm*S:FYFphs.X'$!!%;!(T9㸸)Irθ!y^!THEMUhL+zW\G!|vZR"=vէ 7F0*yo4O)|HD* t~4&:~M~yC"rNģ[D RU#oݛw?hԱIF'#t վ>H86iBlc ?:@.ɒuÄ44/[ NySƅI^?wg__Pko |*GliatT_jX!ok ߟ(()= Cɟs9!;u7Q|ч[^QUshlILr>"%~Uyۋi-t~>3 *y z/I~|͇$! d~%=} iMWpG>A𸒒sqvsHC~ɹSߟž~NH> uBRNMԟO4Rg"Ԝ-*mc{ętD y%)נ.1X&m\_~[Gߚܦi7vғhIR#=hiַ~1h_-U!>smҮ_ ޗԤ/Dϖ% DVޤKKAG*(79JOĸ!?]k>IW{ ګ 1)QbvGD_Н;TKok>OK>ϫ]t=:'B]Bm؛/ݽmf+rhmuIady@x uYC=JJ2/yޫwD?>;įb8׉]Q=vH׈D5#Z ~9wN5[D?P]]tiRFc`K]K|+-p Fvp. 12V1.N"|[E}U⊶cK!3 e ;-7L2S/UvGm8v)b&VoZيP0R<aRxN;+[dǾ]/,)3g.WYSIa *4n|;~ ub=두fLϰ[B-M̐[H_]hLG1dӗ97l) ^ȾĜ)b[v&6Sn*Y o(VVvx}2&Nwx].|NNgh" RLlՀ-*^%.jL]:蔘y,Kb^/kjhYfa4H b*M礷wuEn⠹Y7o%L;VIO3zuqy}2t@Zf7wW<~=Kq+#8s/q2}k"쫟[+ފf1AReE2huN5;/󴶚Xd'kk EfJy#>!zȎX)AP-SF('uPKxe'3% s\Gù'"N3myGJ33{[bngk"/擺2|cꕩcjdhp L?{>񬆗)(^LܽMCSEM/| 4fl/~NE@Ik*rQ>f:'g[iyOHyw@ ?x?~2&^@)4W2UOD9E@w;osm8^zg=ҞD\KQ8Yֆd,Eą mC A?<奐$׶rpyPvE$#b. C,N< \ x@ Ş ~]MX|t^u [{4w'&`"Њn\EջG`o#/m^Juu +yxtQ6:NP4O#cҾ@dZ(:V'|Y>XH;R{ۀvIn{# o\:}w*F :rאes,򮿿bubj")Ol+tVKPnkxC˷%N{OAU8=CRCV8/1ݤ[,4Yt'ԓ$|1 H|c(:9hULj[[ 1?(ʖ;YWNͷSX+IqpX[G%pN5̚"oHw>9Y.cNV͈7o*x%y)1W C̞, Wu5N΃ӻrN tVRBiGo:3X{C-B2v\΍ߠL@ ΧJ)cI/vBOZPE-iv=v lG8,(S(?o3݁/2?S=v;&_L 9 kh`wc(5PIFcwy-0bnkc*C+R -UwI Nۡ=S~v;"I:m.r-Y6avz`Snz^؞i )GnI1d)bjmuJ^IKO_lՂ) fgm|r! /V >pD{ E?#$ت~{ z*J99_@lԏW^p8h-%V[,.aL/jCR٘,0Rb/k,Y' x_dsr dGKŨ+GA( *շS2՜2LKf^h$(!٭'I;z\K1a{`g^@WnH&dZ+$2-=;Prϭ2GVA-2&o@T31}* {XZn"H~Bv NbBYl*!ql-L9C?VW/@C)Uk.fޱzR J"pw.7Qo۱ KwM̌lUYn^+K:.Z?Bg=IIl7Rl R8e4jjWhFp&?>bKfakr`uHAb{NyC9=‰vmWq/ָZ3A1[b_hEY {2) _wX"xG%Q ^v#h6]5lb2ZC,1[+IA6ҒVz%yQ- 'T6B( >bIZx* *r NFvodJdIz@D Yhy@*(Z’m5[ .0O8&Qq*F8AN3DwNT52P$;mdu_ %+ *(oTйtNUYmg;IWOc:7CJA\On:~ Ht;-t!P tІwG܉Tݷ}<[IP JRHnĝWЕ;܎nw \#eW9wu( dNK~Hk;>h`-Mw(( _OHI:z<7p(IϞZp%ق&& rNV:mqhLq2KoY/ˆ0F @"5Ql#+Ps#(<O>2xޕ BȨsm)eCFƖBN,Tr^,|:)YWT =kGxX%3 oDnVY<+>wH?=簠_Å-/T.;O_G9ǽi[mMN!BEً.U A-_x8*j֑*\-p?r,QN.u,YL@ ,b.ʇ| Fb,G_:*Pavrk/p,N+yY@5 UTעq p,I`꼪`eCuL͂Y&:vemn2d9 1^؅<5L,оB?$YwGLo5Ɍr?<9Csȏx.lCJocID.%cB7 Ld\A~c_oPTp=rA1SYsM4fy{Ǒik5?җ<Ǒ45Q^pqF{ـ?q?M55 :x?|q ?&BSPpOl b &0V.]\qw^gLcWq9ܳkafI;Iن"ƿk+~B]7ї?HIۙ)Ñx s6b6ґFG͌ 5I0<| P6@u7E{g]4oGg6 DDͿ#4|Aڳ"R7RjH#JUk~SPa~D϶^Tteٟ$(% rb|[HDF>nh)žzSGuU':NBCI6޳xDbQӖ8~5׏:o첷+k;IVۉ#%#W G"鐔1x86u#!$sœ}F^"}jR*pzL)ԗS|y|0eoUؘ9,裿.9C6}Y_hq &ʸ8V#F}t=xecpgŷ> ODOjľ"yEF-$n!> z2p̳7Α'T)_m )3`oz|^׫RJq p)(ϤE'Q<_º3AS,0Śr·Et\r邟H4/7cQיI=V2.}#N>Nc~RYLj"si ohk2,LRGr?&ٵ>,%{@;>p`_"M񗜥"ZN,!`/l%}^Nz-` r*_BAoC?"B@={V Olp?.G, Paҽ)ftm :I=Ty|±'d?~m|?:w/%xoF}ˏo(3BX=O`h7Mο;i'џxv9OzUr~P= cD:6ʤNͮ[i)7YML^%&*b _jd)`?ȻKY\?/\Eʑ+)E1 dOmlZ n~%a@#gԩRNy_!M͈Y16NzSF{ @Sg)y3mbt3c -r lçP'ۮk_8#}"y6{"F#o%ISKO?)ޘ/cg)g>$?(䴃/3!i]oR$COxg]叔]k:iIqg >iӁh?|#w'v K~ONI= ?`IRѦ^g)27 [L?E=zWp5$Y?P-F7q*`2A8lJj̢Y\:IlT%WU?QwVc),7JܨT CJku~,`)Lp4W]/RLvhUQ[ &+z_,f QR5؀ga+zi&O^ (˿:VKf{^j^?qΝG`K.-=rԼh *<0 Uu[sћ[xAm(.lH4l)MD˃cTB2:Fi&pe򙧛3"#E 0B/ dD}cycBc5dMYVZhl-!ߪ1 cb0 ^wP9L)y&l#K@VIo+[dԌ?ߚ-pmElOjE)m]v!ap vrm =Sj .sD<-x'$sOb)%vW ;-2c Z3#V[@ՋHd{ { %zMz1f=D IhZx*,ZSߩ0=Q[S}dD;-_1Ʊู0H:E#Vht]ΎH iHJ|U%ֹ[ cGbgx`e-+-*|. Sn!+L]$[?~׋֗/׼1{ͿjCx?@G+moK1֚3cYywPpN /Ck*+v(d j,([p-K$#gZ*a]$8E$ DC-~3B ^ׅо)4 zs^:E'dO+o(R$ ) Oc R; TuSG%ȵp6{_^b9-lےHcҶeDKhY|]eޭ]_5\f:rqe}Ck:犩\/hs$Rq!YC$jHୟ'z1}q/!c╱EASJ̍vQ뷟ʵ6+ZsɢnI^eXt֣'](yZDyYTzU,ZĵW6ima .Y>8<-1xZuKQ42G}f^y`;q-/wׯ< wwb5(VqgZ<"߬1aadnȡk\qcI/mNyI2zkn<h)ј^ ΝL]{Y^jkϽEe";p1 <]Mj:˅bM|G6t4-̨'>'262'c+Eg*^?sh6B9#*tE%S<_SԬ\̠*[LSw) ҐF-W.7-喒<\Zdc4Zp6S{Ds+CDDHZ6& IQؼȿve[I|1r#AǓG#wˢٌP˵ܙ3)c/}/vPfK׷2 e@ML Y/ XOT "2wS:Hf,.<[ݍU-2yOމlڿ p!ѺoW XA٘^tqyqKeuW@ض{ mx% zD֭ۑ I.=rgem[7?vYmSn؍;!AI7\<&** ?^k8Iz)O\tpzkp;}M|j]El]@d2p~쀯ɥ8=S_r-Ȟ'O3^@Xg9 O`uH;Ed2OtbXNL^ƯjXAdg-(aIjTѵ %ѪELG3+)dK`:„vY.\8]EP&x'3qʏvjYLBKgIid e+U 5l(qCB qթAd E7NϑQ 8خJ:º͏G8pW%7G 3y\^.'= Q|! ZKgOe!BB! '5.sh^AT$HW\FJ +lf݋\5PˆԁPq'9}A#X>HT#vj0œmw֢^+˻ŀ/~rFֲcaQq3L+>'7MS{8nƵ30$ڇQ@ח5R#r帙ɩ&efUn[ZBD,זio˱L1+2JRo^Q> -4I/`tUDJH!`C{M>_9WFK\\٣˩$oin\f/7:PMReXFaR 1O:vf]*8r\hǷ՛Fz3 $D1;}1Pl;K_CXSgX{^U([<쮃hKe$5@90'5cJ+xbZ(Cx'?bzZҽ0&X,xN>IK֡kzj]`q ׹vAMq<"@=r(u9reZ pxf)c+s? uS4>o:.X.Mzx{.6c%vaiM&C'Z9H6%Eyz4㶊kܧL]6'3ҩ³}mdGs-yHd[D!Fɗ@6AfL:]qꚣe+ "@&#YJP*p?|YI"ގ_#2i:x `[7(-~"NrL,(ؖj,1 ?2MH` ya'^u ڐr%蠬"N)# /0H8-JaKo!vʿ5WjA@YKoI2)w "{EsY˞uJ!Zȯ$ J=Wv˽1JhffC/܍o4PeU Y1p:~ka&s"p_f.eH\&\BE|!F[AK,._ү/,E@>Se-*0kJm=`,V~X_.]e",re@13VM %OhKav昭V#.8Qb|IFW!_Q>^Oᐿ:>|~O;!o&=!еW:r̳ $MɺZ^hNf ^IOog5>!( aM@ ~ \XZuѻf}^f!<^fg]t- )&my笙ٓFKթOh _z%T,7BTb /tį-ZZ-]-z;ϡ'g$ ]W7d&Ū7H@%+L=1ov4V0OAGs R4qư衅= "̰y5YWZSB93m##Y*gJ(VY VYen1YjˎCgN&gj|CηOJ+>@NEtҲ}qʛЁ>T4`}^- Wo]%N~_Đ.z֜O|EHaQ)'^qĿJmu}YhͰP3\_0) (DD5 `T5G/?aL1T **! 2Q:V] a`ƺJOTG|LL~~r\])^Z?wޝN8=QsN"@GEQ֘͞6'(z47N G1Y]۞3nfv?Bp':+!z=qiO:<i0Ơ^vvI᛻cKov'fPut8.$ޑtNMO{": EӴOVFIWm9!MupM'9@!E ,mKlk?A "Y.G{+'`^ꢂlzsX 0X_ɔw+##58C6օSzBI='0G ݷ|)N'K؉͖^{3SYwO~i(et6h=tAyFH=u2zD5ϋ󨚥ANQR|Ӣ/Mdz Di|sR'hSo:=+J޿j%`ێ Gz ?MMΐug_o+ߞΔ>oҫEI;foŽ!=ƝAT !B~84z3ٿOKuCj7Sd!۠'_%]{T߿~Wtd񅏂CtOT:OQ0ں<^#m%Ρ]lmn(+u!l u:tL}^nW5ghD![| o /Zo _-ğ'*.ؙ'1|V c=/#YЛ }PV{w^w)`{ϖ/-ig(tH?j3?uM=E,qֆilS7BJCd%` y2u}[ijE67'qiLOpRqFuZ|_MuZqE5~Ju" `fO>Bl)wٓ<;GNt?' S5C}zB/#~]sut9jP0{' vk| `!$<^"L{o9hPI74Mx/IXTڃzoPE˔̎ #*z }#e=iTxB{6uݬv?ist0ϊT̋> /P'+>_Ȼc/i7-Eyd.v*o`뤶b,zIV./.H敻Iąº-`grˆW vQT $m 7l%%c W`^(?@gܥ/r˶P yb^bm(S0uugo|jqZx=N/fUr +*3R0i<{P0.BZoӯLyw{q`wƳ(x{g,}۫d3XfXn"q:bĩha.⮅8Zw0|ùDz*d._#fcD 풐Vˉg]\q8J@譥3x=FkhC`*$!A^7ƭU C.d^..(ʆ+@{݅>DcA>[`Ozmآɔj 4WN0"2'i^+@6ju-A/νXs& k cޞB*2 |jjۆ:AGUDSJ ya6q~'Px mc/W9!Gw >o Z[+Gs)]@IXM Տ60=r7[0H&D9;Sk-gY#k`X&෢9y`7O~ RT ;iS7`54AlA88~ʖ"7Ihj`gy[J>"2J~]4`;#4[p7Nj/ ` |/I5 q)eݻCx`b[;9kRVnpn֟Zb*ט{Otd0e:q&;?rx;C оj]Lb稳d(qց3 L4}wP-dIz]W?|ڬ2arE3`:6LNЂ÷.{vN-]a;.PwUЊ߻4 ,O^t$qv51C"@_pDL)\]VvA#a붜u SRg v=3z|.ɈzJ\s4*0j0lh&\zIRivьvg_a[|T*{d&.h(#PB31@>F]P \L\ON[= Ēz؊UV)e0kFe:]{M&/+gtԽJ.1Pɒ*ͺ8hk:\\K a}we8fVcYIhcG/{[H*޽[_0 EB3c.1A:2܎Gk#,ZTL&@o@reO(SDSt+ >``$|i>,9of>FGWI ״qC r;X>>L4!$V>Z 6ec"'<˥-wE0lJ6Z혴 ELARl,&:١-ⷎa";rR 6XP_6U70;XX*'ZOo2tRPX$uIgߕAZHqk<{h<$$ ^)Lw@B󌞴{'6@}wGؖ3{pJ> 9vJĎdR _o(wy]ڜA wr {mG / b8{aoLtdÊ"N?6GJ)jVI LPlY%{r\/HoҚ)_6^M DLZ{n_kIYy{taE@S29ˢNhz5Cg颡X42ǝ×u1Ɵd03b%u`B6UQG^\"Uo{>W^ 8DøA>7I,u ܶpK"uR]VcdDeX]*-e(3+y1B?R0w-L.60j68ÜEk^[vq_0yh}HԅN5y^F፨G.^-؃]yG Aw% ![AbT+cUԹ0lRZe钘"K4nk-KVĎ,(aA9 4]L-K0acLnVYKQ/w\Dw1#LS[R~۔wY@IÁPo 6^_?S[@ Lf+†KIi">d vM]%*ebETBmq5bgm}_s*]~fm8-eBK/FC~ > v:E}wәnKԉk,EZv.I޲}(岁P,3dRNgc'x&h31-- T1}”*w"8$R<WKDmk JF%P&NlR%%SFj,8:tF+L{eHsD+tq-3Ov)(. ߊna} HMm ", o}5h @G5?Ufד9@k%L̅̽ű&;CWȯ4>V4( >RT/66}u3pr.kK.ԣ'/uǖAE%E@zL[b|<ΜZ_"})H2=FL%70dp?V{3@$Rkvz`7KGh}ݪ@zZqN 54FCHH9x.hFS@k+0 !qjZYb,ن+(գ`D߆OBy\"o-Qus+x~Cx2o+)$F,QRXVU@OcĒ*WV(QwjM$ZP(5.-ھg1XP5s%0Z}wGڰ*@*^]{{ҌEE 7쥪_/m&U@MZv#<65`RzPM:[`w0O06bl7%YTkX0 ֍n)FCCw+ Y"FfvG=K 6;2C֗'mɕV\YJLHg/!uMʓ+]Atez!rƮSԷ0114y(uJ Rh1ߘ x2̓kf 䌰M"i]9Rq &a܋LP>SB3O!>*4?`|)9:**rRR]#NfhPoy9L|Aj6d+Q mBKo,?͋5܏}_ 1<[2ckvn歲jջuX ̯itKF&2,^ /+&`Z "Ƽ.yS'ChWIu i]n[U#<r)5Կ'Xӄ.a$IЊa[}amhc{Վ9nSX`іƃQ/y!T'^㔂1f)oNG/NiqSƒ&[@[J8b΄ `(:s%/ =FQnT,#w}/lCxC{ xQ;"6몀Pj|<&v H2MZ.{qI-E{K"t-.suYUsТ0vr{xp-^≖sVWo2W%ЁO$WksC7GC] a Q@(Z*>R/iZ ?Եsbt7fR-Zh/;Z\s,xV .c 3BEI'Ք5>)[JwҐA'~EfAgLCo7,iun+ZCa&x"I/xY-w |L[ͽZ) _bפQdsk;{4lG0 /C"7KaU)*&faV{9Eum2^`82UOfpB>l1I;%zA%*5BMXyc|70rdEsGh3 Hl-c-8 Y Li\w:E_RJ\-e<!axd(&]r0a̙AdA#}.% .o=/U/̓VmF%- ,RV)b9@8e4 \:P8lIbUUP4 {jh闳qP14g𮯽)>I{&lԒ+ԇNho ])cz˝\cTJ8k˗u~JP 󻉜汚Fe] kV "nY(M AS% 'HUci^uI,ڂTkS  ]*EtTrm7 tc+|Lvvٚf=[KX7^!jΣpqNb_Q/Cxh^O;s-~%@$ lʙ8^ץ+:s}Ѡ,Çk%gY%{X0 9 z,8:Gpg9֫֕.}qeuZ\LAC3A ̃oWkCRUK(>,{Fe&^0p֬]\oDY-?Ό`#[Dӝlr.-iQm_(Ŋ[u)?,w7ȣ vYhs!QCPF=ar >Etsll4fmP]i7t~=hH5`Qx^HԺ=mp4>)Q"ŵ?>Sa݃Wu 5} o)>I6 FzBI_iy;9Y(V1q!eua_MK"Tibs\BgY_CIg^$R?kўx oe/q~vt͞")'Z1:,>ѓsE!8ݧLyPO8/MCp3c>4稑T/Qӷ]}Q!Ky dK45A젾ֶ{ѿVӧLڊt7@IN~RfM' CuZ8\)>"%E?FֿQf/>[~ MR5yh)v~F'!!qSN$އmT+Q'ߞ[ydIi>i?2?`ĝRztug9-OD~%: {[RgQBٳꈉwhT=CR @Aas6%D[kÙyG(VݟଷIyj["23CK1jidw"Tfy%a1}{sI0Zt*3BfV/%""~$=uXj IzFDm_ӞtD.I.]_ ?oɤRP1"C;FG}#~Ѝ>GpMҽa89s~9侑O7f3)RܧW =1QҠgIVh#A DJ2= kz=!ػ*ol ߞ T Yϭ(gF'jWc֦f5Bܟ_H._{6ׅIOt6&+D;#Uk6'v) =}ERɔ?ʏKaUCJ1sY|Zϥt3~V쒝-q eSWc&|tNFkݪaQ/Ps_zV?՞p%}t7ea2HPd*9{}pRR7'ˎ#)ȥ&twr; 3tp?viqC_{^Ů' KD>xFừ~-!u ʎt՜{M&o&Gpw?tɁwOw}z!!7'>k<SZpCJٔ3Y3l!)DLo~5@q?J8Ӊ}_%NRrS!;Z%r*^G1zN+kq"s{e#{I3L9FF77FHPI@DS懐2l}aH֣H4~%ofr/N?8FB3r}?g-wq6G{ZQ~ݾ,gND"!{aP߇<0OEɾY ey`#I@3yq. V-_BMd嗘bUdj?j1j2cw2 Zc+ }i.y ДSdmXApb%ixHb_vC**"zR7~x aƤt>3]hҘ!z?uW?q𣠀"Z˒E~'vB#2v>i獵?Ug^^+_{"pxTݺ  y}*e 4 Xl6NUoVpH,P酭r/%(w̕SdY n3ZZSfa{J!TOG`m-P {n螡Ԃ&LKǑ5#N50)$Ҕ՜kBzbT9YBM4#'- ,V֩  -Ʉ}-,lEsl}dVi4xyz I3cM^b }Pb*=]aʱ0j,ݐ8=wy #@`]M9 ǏQAn^rb 4̠G4P{eer;9ņCxwc"K^"^W0 X??5К[Bt kQ[ CA9:=kDKLWV_ZJ>UM£",4X }ƛ5% 殼 *,5rle sP.񯙍]f'qg^- ų}jw;\;_IVyF~ qKiM$ɲ| 94vU1+h1E5Sa QPB]͏v x<9SXPovBGVb(Wڣpe4Gn*a6'4I\{;@GĭIlגm\!1cB5Ξ>uQUڹHv7 ۏq1aR{YR*Y)woaEx0d][Y4罀]':j{*+%J02ТP5".~K2py9ȊOO -Xnr#J& 6p.rh}t5\F/qkbj:~+Z`"q_s4@L'϶xuˁ EXZ0Q$[FS*:OGXu4} ѻIɶZOyuɁQ- ǀӳ w3\>I(S]xwA%u6MZӧ/XG7Aq+ΉV**̼F[k9(tΣ]N^"hyAS0 [v%npI\PUgx*:[-";?Q^/zk`Mm=?vdžy|a/KCpQgJ!Z&0L +J׬'2ɉ'Sb2̾₻2eg\ ^AfDtVAB]ظ%PTxO{œ̈8̈́wGK$Lp)-8;q޵Ee0W]`{,:}7\cV" Ld\9)A/Ҕ~DS4NEEfvF] ӦeRYˣXjY=ֆ8n|5Vb2yv pU1)l 30=aAɉ0ؒlEGw8^Js ƩܡpEF1/j~n*d!0f&X\%/Pfb$]k_Z VL!.`=n|n̻XTt<'hcxŃr ˸Y/bCzg4)dʪܚ>Z lrM]?PFHؾs+'WאLgU}}vDV+9'+/v$X! ῃ%wVU$|U_"葫qp.CPxi6Sp5$}vTp˵1ț'Z8;לii@#%p{#0u 29)IH~u,}"v#a  <|>tw4eĔH_0+tU+zo#6P)'zd+ԗfG}&B}xV+l:!=ǰCZburytp9 ,?J=.r9Cta;Y|NL 9Sq.}_m+tC~Ͻk!_:?t,H^CF#ӫ4)%Qai MUG%l~KUQ7и&Dt?RQ|YՋAXæVKB=Ժtx2 $ 2-]*MUG~T-+:HV|է-5 6l)%՘ꊈm >Søg+JnnM.ӭo1i^+%C|csRaB|WoݓJ3Yp%ܒ)* 6};<sXdv$[j!_t߿6yW"zH AJO\R3d)L7Gu3֑f݊g7?Ψ:!0~__2I MvmYsC+wzCRLGء &`kQ{pϸJ'KaUKG6c{D-:#݁eҮJ?9Ym92[F,ҕ(ŵjE"mML[F| |;䏉#C&ғ j%pF uA%ǖ?oc+ZlX>G{%Uղަ?ͻyKU阬Ut^Hn1Hyv:H %K'yD|zu :$niQ.\G]{7W;m_{N-0kV$;rB,qN}1w,ĄA+$`i?U[Tsp?SFӘ#ɀ4BsR)2hd1ǺQ#&mUEMK\G $~tlnӈbi)a)%?zAeGJӴkItB{)W5 f@NoJB!'$ۀR3j3u`dk.Tys$\yAQV怋XFcJw岷xg`G^HDAzMۄ<-$:?RY(0fnt1Xu@-K+豌 h?g8WM1gfkԢl1ybʱg.r4+;oj=64r~ jY& 2Gv%@e-0:QrH{-|b ˋ d09GOX̯U(#"&#QN&Zn=`ԣMsÉ>^%EV=hv.U"w/g<>S[QK2ގZ_MXjq :f1DRbIߩ6CűQL礼ڎ E\<=q[ 9 7T^TdbCҟ$n"CGv7P0eƒ[S!Q|jx QOV6*9R oTR?!E4.IWh`tgҞ ŧ́^d@\ @%h_*2.^ʀ 2 ́ŒP*29/`VF2*f.oX{4|4t_$0\8h\H2"xIJ2AY)(l@TF 7`*#2P+S9/X8302:g hQ39@0޸"~W$#AFg<+ܧ-r@WF2:3H:^΋N]KSq@,!j*oX(4M@9S/ S-" 8`To9H xY!A8Xy@iCnx~x4n1!:-d jP,** |Yk%VdD#B"yX"cYin4ed,&F7YF1-e/6xh0 yj<*dicx,Y=YF1Oeic"|jfs7%iRNF: :ԽPQ)6]RQbe-XW\̍xذ>zV@[4n"\1(bO_0Wtp:15ZA>J*d/@ G33 T̳%Xhq=0\N]Dnj!S^ kEn"o&"׵\/%ۃ2qRW^ߞ6wDJ֯A%~p8sz3H0䬖Rj>JbP2luOdi偭ʆ;qXsMdڏ:_H/ZXA UKt,QDK,K2z"11o#c2X;;B2 R$3Q]QG]IA ȶ΃zm|Yy* Đl66 qI8HEcmr)JN9'o.]\;Hsz!Z D1.GPhߞ~w&%쟵Bwe͌N ~߮CKB8=V~}["%9Md۵ye7k~FGOQh{hJK3LBfφ(Zg*A,ZEwЩ]dJg2wL 'ԊGَ h?602Y.q^ ZY(f .D#s hHb f fDTGDY@sxfvAu֍XIE`ֈb ˎ}w%}]@}6!t%=N?:GRe Lm'$@v5ٚ+!Vzv]8 v1IU͏f6Up@Psg5/t"ctB3yBs2t ,/Wލtz?@(i"xi ^XiN!Ho$3X$vf|*|C}ck_ޑT)ӆ}G f]x~Oǣ?vOI X'ZOy/"6{6!3}@a=zϽ> ޗF]SLN?Jp}F]oC+TNmtOA)ݻ2b!ܻXߛ'g\(ۏJyKZd'xANϱ;1 7~6#OǼ7GIMxa}{bzN %te+'mA$==(VOgx^74k>r3D)ٷ<N:䞛ntЖtdBy=z6TgqO>~u9_'"nvA}N#3xFFMCs(_]3RFNԩKL-oUAZnE WoCh^hi%RgD}\&/ 2(*eѤ(>Kn5 ~.=pww`F\@PP<6Aۨ͊锞۔/ٛ/,3-~dgxFUuFGndv/~/PH>nz?|oDL~̽4#ol p?޷̖l?AǛl"?4 "(*w/gDMuJ-ơ4JKPQ:wJK/[ynX1џRgi|vXXX5t=@u G|`Fk9C4\ɋedxBC?F=pEdz{ԏ`7(yYh z.1#K/)ɳbh(vgiagiR7caMg2T3U3OX8*ȉf"kÄ_{?٤T2i= 5.9\5DgQ;mTZ#/(L3=% GP:GԈ?>5"RMGgHқO*XJ\YfNw&r|7RW7 Dd\BJ  z'ϱ~m'Su̶ o>f,1`[ޤ >"OZGs"NG>vd`OPPXBE\rIYjEY7 NL%6SAseF.4#L֮_/ X^@Q0$Ğ=("ݡY`T3%Q8W,F-|}L F9d b"I@@|: Z }(V(̱0 xtކlI1\b ưʁWph IՆC6"M+$8 9c0CVRSAԩAZɗrI,3  vKr}%Q=R=J؁)UP䅖JY*2 R& e<)f6jG$+MEq 1 P!3hkivB3\?`3蓆ep+ =\]uhjlƁ*s,rcL886qrqvq&:,1}m|+'5 _dYAr=V,#7_*̫ MSsNQȤ4Tm6sIRp( DNա4Y!5-kW.Ϣb6JT]w@n L9߫WUZUwՕG0h a? 6 lIt5ߋI|b/O?53aVzܴՂk,r41јfen kX7}A>KM>]@UDWʼ?sjCAq"qBٴ%Zoteoi{8ACl&cCsMAl7HSY3 Ta=pX=&^^} \PԵe+aBV;"9DCiQb e1"Xo=sfL)na6"]̇S("ɏp^0\㝼FwE|ٴ VK&nBEc]Tʯ@K =8L dc3/.n[mϩ LС/)C[@s755ElnC5FZ$*@Pg7b5&)=\<9K9 \;K&+s@eDiP3-$4 -` ,ʬ6VV\Byz.SU#\aœ;F*NHV+B6ff3V5lCB~VnrDXuߟea< #sh%'"e8 ^&[:5+ [yTmkz !tR9t QxNñT!Ƿ]c=Y!UhOsmW-[ |B9X k) bWy݁\ #HmzphW,FB͸̬(i|r/^s O~H6ůoFuȫ0]hIg? -ߵiBYڍqp*eYwM>D!PX 0c 6λ O d={Fb|6xI$&1:M)·;:I ~jY+' q^rͩ]gd*Y5yITb;7ÙL*ez71o(]9W/PSChΎeY jH!;`.Fb(O1jhQDns:z6mx$؈(ߦSeo K髕mriI߷șȊހ C+ H G__# J8)1..g*2wq$*8YqK}m_Ȕ[* V៪f{#q>\/j0|Ĩ>DT =QJ90{)wCoTO_p ID}Kg?XT&}Gݱ{ob{*3DJ doC } \tԿa@2G؇DլiIr*71tUiʞ7O)mo~_[N5UA4f={"C)AC8ٲlaq{{OR`*>Gd`7h !M%FjT$p*&eO>h>Z\'K X[gIAľ ^Wq-gFYR-=|cHSB^`3 (jI 惈ÏvP(q_%qYt!+Q KR @E7 3^9t)F,u67_jlQҴ Yڋ.9rKN5F8\S\ҿqw$W4[tqI]*$ZEy(C <;_[./1˱}d_x1&?,^!A q^nU0A~Ԉ>e:))U߬N+6)95\qTr$PXjvI\zhof@ѸGW.T{OGHty-^Ι!TUg|[Ce'OG d/?^R-+D'lz@sGK#U M^aIR>&/yyU)Ϯz^F7lw='!*fV{V܁rXW8t~}{esЂrZſ VJȜ>H+ҰS. ;͟Z2s H|lC0fc ,Mq<ͽӖ5]14lM`7N#W,FU jG \3#;Yj4!BJu|nYS:Xxq9M9O&m&,Mxo߾ p^uYIdA5>`^tZ?;81_cZ 2>ف[ }CLj*JG.[OG`֤ET @?u^4#{xHI7]`HuNC&7Zǫ ߽nS{%b5;IUېN1`b"uvH6 T6rMv8d[hڻ% ,Wu2SGVQ!*KGeġQ#bT_g<'۹`%cvo(rt4?iIh,R^bt8 @ʠLeGϛhhxYcܴ&\g0y.SSPKX4:4k]TFQԦC",G8Nj$u~rߞqo!4M;x bgt3Tn|Kta]r-YSX hm=݋cݤu="ʖD/-d^ѺM>9ԋOd?\Jy'FHҐxd_{췕⽯BϩfFf~1\~3257(6Vdy@JьK>6Wۻ61ԏ̺NoiC{L2|d%NJ9u /o'ѻ*W ͍"F,%`86 oA] Z e&8jJ.{קFڋxP#&ιquEF=*W6vʱ MyO6HZ1u}5vdJAOnY^ڡAToEwJv7tbpZmvKڲAdeK6o3[+?+x#]ی)&z3ܷK/EʵzWC)<, erg  j J1%_vG} ЋOU4 >jrf"b&íkwEPI4)SNjWm?m#fA g8_ Z$Se0~smoS`¶YdKfQIoGÑ.}%0XI\UbRԯ$T=CAii#)$6)tOJ;AՄ3DEesHi28P>YA9vh hG3#p,>}uv:(Ѯ 3i<~W3r[{Zk2A?K@\[0vm!<(:.|V<%SGт`\$|ɔ; *('izCQ{,^`a"JCt, 4]"qa|&4ura;Tav,!K'Oֱ'\[ f}Gٲ#> -I2̟h4}AkΉuIvd nI1#HpI9\`y9f ͤro00}fYJ > vȶu$U By*SFr/}!Aa z3@1Zuƪ+6 {>4C])Mj$6nU6Oȏ?ssS]gF[}1W *~W9__ Ϻ,qB? "2qBQS(LSFvکQsWՌ,q^Iԝ_>LCFJz[%nDǥ'!VQ g~m߉TP.Lџ@#f:r$'2Pp)2޴NOD ʿ“.؆:*AO!!h-:&ay>&?]GĔ֓٨A>xg{onHcUJ-uO{.~8y`)7YwUԲ :'ldJu̴3i- **ZדciVpz1|^^r]\KmlR S0Qr)4 Vy6\IhQ- :!uZuE>|&XҐuHwx\McE7;hX7hmxk+q8"0h4Nxy CD^K]$b%#ђOJhU9vjt˘xdQ5#%IEO6P8Cltx: .rjOkM+zk? # ?wE{coJ҇zA[ΌSmV{px?oA݅q;+Wc8,^8J]MV-`9o0fLf<wV'eUyE5X(w Etnxtud0x&Kg%| {v/F0]7X9 DI/.|[(:*F)PdHiLPH6xo:E6ɲݹ& %fk0hD4RI 7`znv?lw bHl]IkoV5Qk01 NT;@(i{[$1ט  am')lrN]2a„y[T$lդ$BpHmg:@ pKxeرLﲼh/f[Ln%ъ00(*[*նB^8+DBu9P\,KS-wÍ3 5]?tMqkwgxgfBZؘvk޷{34404y]U#GjKMcٗ?fcӛR|TiXjq9ݢ|Ny.~t7f s hb^o@8, U Ќ![hkcߊc?y v)`hnX O5oqht |Z^_DF'j:[5ڄds P׹C4J.|uq6roȻp WP<YuAC]zhqGK9 ? (.uL:3t6>Vgdya*sM~O K7&gbҭ^v5 z5 Ky =u^-7,OIQbϐSWgXtk|]3~+Ŗ!"61/O\#?tuQ<)x풆.م57ģA;~{cfRh3:phgd :YjΪɜSuiAs2Zf*rpF#wO<̯D9Mf\P5f8 KЙx&6s+y.d|CT\*g'7׿}~Et>2xE$s#vRY]#u?)ݼ4賗}Ry[E2H ߵc=+7[ҥ{8L0ݙ/[1Cϊc_1S aG-*;|;ScaKs٢&TFhh3;y4Wjъ*1OO^Pӵ*ޞx_n|o\3,Ad`} 5,Y[7e&7rtALo5kC/K]3|u,1եav)h_')] 1H߫Wz -IQKR{nE2n> 4D2Gh:1 {~-Y/ ȟ^Y]N\<->KmhD\'w8+@~.yTG9qtWe[3WϏw5():T΄ 4{n0Bނ& }[dKJdluBEl| qƼaOc5R4njo1ٝ=tzL͔eh{ -S,n,'\\,S<[3}Wpg%{Nռ|کQjavnwloj$UT Zu+j:sOn^n*.l}\΍kBM-P>ײchi< 1elȃӘ=B$NbrDsܰ3LsT]Yyvڿ69{d%4nNDÜFɝ6Bc@A8GA5yG}l̤bH.Сd^ s_O2w I~ۓ:)9Erl6QF*@ 7{mE{ }/1VKAfCrxEO$yR5ʖr1a !E搿- d)hqsn$[ ykߤݳu'Y~Pw(1 SWALx}K;™g}xSzJ=CoUC:^!Wwj?koJ<Ģ|Ƴ;}/!]~2MЋvо0j31t3h1j8skMi@ #j.g\s< Co@04嚞Y:[,uF$o:}ysPNumqeV ]b4W?N1ӛW:tr9l鱦݊@,$+1;ywv}<+ d3S?wtK-,Rx黮|ʰ;D7*aWMy"1B>xaq|~w#%~!H=%mE_{U|zAH130NF_=ZU =Ƈy'KyOظRn]|얓l,d]b UP .m3=Ѷs'?۠جA?!A@9֎V7>p׳:ag~0d]ƢMPt~Hu'P]1dHbyP O>骔{OߠY`K^eW^L{nk i% BrΗ* tڍ쥎 ji|+WYyvhTd#%γIBQκuw_P8sfpV`S6e @7Sr3,Ray |^Ur/AZCk:oJm ʘB@ᒀz蜾}H"1`36Q:1T\V&uW6&"crt2o~Q{o@wErd D]7pOMH}\w0x9 zfƬ^L3z,nI0D"4Iƶ+:uEPl6<3`:h7lтw\;`LJ諑à"GgʼnQ˒qpdK1:3Sz,tѸva_r+uڇ*݇yO8]JltywHAj Mw[RGQȀvE|22x׀vk ܽMGY:>TǂiC }2y:{F83?&`OGp.ZQ)-a~W+85H(:^^vvb& {Lbpa=h{C_=7m7Y/^$ Umjc./`%[ l.kCXVf>H ap(Yq_яw1$hv<{?mJm};Hmߠ-xxR<.M@10Rvk5z1pt.'uƒйYt`U#4NǮǍlX =TMeYmp9zՄaacpf,6rJP=!e3*-xV3ӹtU%'*xr\CQ]U}kwҧ:Tޅo&#!/O'f"0hσz6asd6C\$@+ +i 7f2 HM-em}@KM+ t9_'i4lb96oNQ:1e_ ׂ]a#fB-\,^6^@f)ϟ# -d] =D\{ թ̵8mrr/NYʪv_p%Ҿ:eF.h}&UR6H8 "iqb(P,Pvlm)d-LSMˆ&ќxX,bҍy 4WoUaaek9_1 W7'Ӎ*2' fޜ;o g.>\W>BmL|9YzvVGCiO ھB5. xQxߤ%Hep+JrWsӔ!TX%zKP/FxRHbXu1F5Jvm|rBnNIF<^Y)W8p{G2RF̻ÛwqXxqTj78-PG #V;WniImGZ;@)eӯq^H%Ÿ. P{wIV)bJ:hU]d܈t^4y9 rJ8젔X`\/gSDqh{'HWvlx p2ej5C9=4~4/kxiAnz (be呴g=4󪈠$ce+jZqgV0 4؁^H-ݣMPvMBaep`EY-1%ɋeA`Ͳ"Ԅt{ CC Gc pЂ.g&|FLsc|4h S&řM I?$hlFcz{Am: ЧeKp(ltκ.WƜ,D;t L0FB:@J`h[Ÿ\@LM4% ?K: &:,g_4A:5&s|;chf蠡TNژI A.M%j^I<> x3J Qe!tX>$mcY/+$(ުy +Șk-RkO=uKċNbvWFePi sru5}PQ׎(%'T]|y|\D8Z`=O,Ådw,4C0yXraTA%9<Ϸ6yj#]lۃͬE@uJf2u!3gNt;Q Λ2gCjdF\q -4g875E ժPAdP Ű yF+ ui0k];1<$ft_< (sa4*yca %;h[E?w[;5  o1J7Q[ ]q]EKjM**;Ahm46h-NrOg*qGh-F8p^֬+~ ThR|$;ClR; &J9wQ2_1IKP_&`T-ݥ2d;怆fbLs|@{O)Fe&ٲqQY\V !Ceq.!4f5/h]7|qo wb<1RnX4ײ-3w&5.P(~_+0ɜջ_> k;y$5[gn%8硨f% kRY?7>h痾MMe"^z_a7ʻWMaݪ3zVᝌ?섕$ջ<aWgj$y9)%ݻ?n'̳$3J9efzYx/I$- E2 nD z|UlZIȓ-&v椕Rjq3X*xCX򲢅'cHjo{RY$%]A)p?ɓG%B^T 4h(. 2X ً /uӿ(mI:>l g9=|YT1tEkk%PTƩcm<5^Tܽd.MH2k$lEH:¸ E5މ<"k.;X&Puhj"M5Dv0qh5-xand|Yj9Dyc3~ 8-tDEխ8\-pݐ;•o ykST"𴱺.d(Ռ/*%p-0{d$a7ĊsF7t.v$6*_<׉޵ +XnTW>8{=,*iu hv/гc{.v-)KůP'Vfwc eЎ vp+y(89Ā$cīXPvy/SOq5{imFMg|M%7ih}8l;hX-ȑbGe&;e'VCX !2}(~rRNfw[ҙb̪vU&w>]Q\2_꽕,;kBFjp,Z3&:V{,ɂ a(RJ!ՋKl ,LFw|h|3&^&m7%7fet(O=~Whvle90abi¾o25v;&JЎ'r;['!Z(y: k2bd4UpAɕ(UöO+S&AI6f| P0$Tj8Ʉ&„/<6nCiҬdC,@V/–wI)ׅYn`})&Ǥn;w(`eQeZ1pC`vI8mճ7% ɖ߽j;bVM{5.A RbzGJ:(I 9~2]3JYp[YimC!( /zX1e٧c3;$'R-JuwCG1cA*  U|FM{9qDZ߬Ȩjb945X9ǁ$ymjEW+,RԲv^K$2a6p;(*y ^U2rʰp6YFl/C XF$1([S n]A]b!u8G5t#k]혲 W1Rʌ]ְU( XJrq ՛.e1⺶%/#ɍ [E L]01#@R60f˶>f7!85bh,alXP3ؿ ԇJGsq1֤AKCκN@kv>dDnͪiM5X0#є)V#]DjnC%G FP:wu!@!\`֢v iC:k*v ok䰽 :Z p,.3uz̈Z56У( %K)$QmqJznu]װic-T,/P=A"isv8ܠxl<ԔDVn*2)a$TuQ x+1/(tz߰c{jNoס "< >;[3D(Ѥ$~_h=,Y geʴi{W@a[hj[D'D8鎧xP7C)py(9nqY\G N`룷>4;T(54%-nhhNe.@1jJΣr,-E|QStԊXȨZ9r>čh$g[ۓaGٌ&#R71 [w Mi+æ(3[fD+hx8|];esL>{J߆RFbx6ţ*}4Y4u08S`u7>ŦONZ®Hed!#@=?n^_RA<|OVr_x؈2U^ׇ/TN- w*JΦr0)To:Au-Mi0uLZUG9S(1:IiQDbg|elB}W иR#>ұ%w4V[x¥(᷹j=t^~S_Rz 0$~\(+X6aQo^BdY+Uxd:@K_?I_"6Fᡂ|`u*9n5p;${w]wiƳ"c3Y>JLe\Udr;R0NW-U}\nƸH>]vQv1sm1 ہ+zo[#k %CZJ $E'#MQk2 -$X)CJ za7XmdЬrg}nN#ݴY.vȂIBaCșGBa+ y P]~nOs]uuHFիGض!.J)6`1wX0([ z1F<+@ Jl~=X:THH۫v* 2=bWox F򖴛Ku{6 5,- AS%I&Qn`OT 5Â߱ m1 :;P:hK8@]`nf1j7 y%ޒC/5L "·%Z1bQ&5԰h:atEhlG#GH\V . Ƹs-Ftwd5 ZfQ-urw=|H 'WfKb`\V7 [0Հ.J*^k}|cKY:JR,V $(hW2䲳bdģ,7:[K|C$ mmއ}?_vZ;88BE#Ci UQw4&ͰR7;fK;:MIFRe@'6XIc7'AsU|_H-.D]” fu&Jk]l\ΒbLwUkF %T̝,{n&&LђMm"RȓC祝H~4$dM `JRңHӉHtʂ,𦤊{Xn8;DT-BI>9RΎ4xnhKYnU=08r@\3/y|O:b*"xwp MyqyƁ`l=ɨ8k;,۝vB|%^t vTåM\캢GψګCbC*#f\{c`E7`&,Vb$Io^clL ٙ rʁW7*^!zu}jzNJnuK+T+ŸѲOޟ"*.θQN jw T] >UNY.Gt-UIZyCZUN OچdePx06#$]>Rӓxyדh2ߍ?K. !L9!j>r^ayonjTZxW fu!::ht&d+_p>7zSc"leO^[Y;l+!g%k:)XɿDMYFDa2,+h&73]5Yǫ ã6M(XIPw $3_:c~hE yvԔT1}[We-~rǫryp:m }2`+-=%pJ)qz8decw3 . (X@XVN.왓yZ9|؝= g .2,8ju {Z @צY{Z≪w|̃ -.>Q\:~mXV* ʍ{/-`rhQc㩿|xr!t<_5e:Q1[@ͯc&{zZ2YFFPV>kQ"z;|fZY; IcH%c I1MMF!rJc5(u+yC>br9oQzGaGJ*$M< #8ѱM&|i t1]>C5įLjR&'b:Τ~ك`A҇o,2>R1SDyt?Pw읟ȌIiGGM\ѾZ3{9(w'=㞳2|Ӛ[ǚjE=ܓroӗi42Ay2?Ah{xPY#(RL&_6Bfw/QOdE8O̳$HoMTErcǨ>'#W'v;EqB/ ˬ*y=k)㿹סo^"@{ԣ`/2shL#@Z]>L D&F!̷o#PQ2}%uVό?p}x"Q㒟y4:K3}KR}F٧$,Աdb$0؇>A j2}iأusҟ:|r).uo1 >r@yXMY˹: y>aB'KF`QwB4j J8-n92Н%T.ɐzs99I=-9fOF=ExEϾ椋W]n\UOw2Ȳ''* ǧC#:>K27G%rG`@FfHxaCEO)?]0TGӌґ-!dAD؝n=\_`>sNehhrql,:\юOyYPωA:Gc ^b>M2c#Z8.|o}3ϰ"!XܙXz: ȄH!aBhztOxZJh3V=3ّ蓉NE_$OXuY|g$ h^n'}Ӯ+a3- =R*ޓ<i}܇~|]bۖAFaɑB>E? 7eV!Rk'>kZX]?.{>DžևL}}SԲ,]-My(<8Y~|. -f'JOHQC}5@}} F%,6![? rv*q4F r BG)Hɾ6[yiY4嫌3<BB;;"»ҋă+/_2yxɻH|4\P[KOFOsF,.2$(,'UV !_&aR%+|j>XPB֫+#{9V p@o_7oCjys{&{~cES9$8\ηQa9ю0SF[<޳M[^k.́ڧZm ʾrpŞ#Q`=Q , DWtĦ)C ux ٮMQc:J)̫%ѧbxoO\k1+kQENMXzvmO lC}Mm2} ]2 Q6Y,] L7A`jVΑdwiYCռr02^94zAjM 05HpBrv;6?fs?=̜$<8$.*q] P~Rut%M[:PQvP-6pW>dLNss7ЀwVnZvJz9=EqmEk5V̄;خ7CJ%Lh2|+D::deȊyoDW-Ԕ SMHGUf܀Փ]#:ۊ*J 5xk0N0M[yf$`4gf/mT5 Bpe$}t@@H#R޴^XDq%E-ܢ,N)/~'5\5|Ɋ]4⠽ .vB߅I' k Yz@y4 ]MK f co/zv1v~QzQnD;KT!O8h)"?S7`/?qN!ݵ+G=Tocvuh!fןF',hx?B/7VZ5 SQݢOܦ&F4ȋ㜻&Bb8JîCJPzt|Ţ-'{cdʶД6((|{1Uì X]cECۖ/ !iR;eu*l vDjs׈6x(}PQ,xl `{x}J//3wCbŭb脠G;ysHg52%Wݴדnmu p=;CŅCq]M,^G>ND]v0 .qCmiY,tYlؖaGpz_es>@|Пepb5 |!ڴG؂ɹz*Odpͼn &G{y @k> l58iDuovjF26 3F0pa,)D.hNJODރW&lCa0s($B-ʻɹ͵\`pM:!5QS^|'I}ʉ;^:hFRP(gʎdmTA!{Ou$")ˬQB9U3xxCz·tKaZvlCj#Q&^_0 T FSڀ1XrGE (5CZ:W@`;x5Dt^ʑBu~ڒ|TA)}P?2Aλ#Qd`_fӳ_Rgg߳O yӓ5cHs@=7 )ziK:=`iA[wW٫$mr/m?E٧Ĺ+k=XuOWEv\ʏ?ykLUO& K&z cX軯PЙye@^UxU2PFQ O䱮{0;PD6(|'CA\lEXn2QS}0Zc&udGO )ҰQsP:Ì17 M8^ *Nm-n $93l=s7 W_D*|XS`1r"RHыA>VUTjԾP"**F**UUUTV-Q[QyM W[{0D.3b:} 'SuR;<v/T`6.sZl8FR^+Ox3KsSs ڻ9 xU' {v\5!!_s'Rڄln1vA멤!rnhth4aHW2Cf1IЄ4-y^pQ 8*ٙu8XZ#-WJP 8L$Ow3A aWch_J8WESw1Uajxk8}(ekۆTv큸+mv҅ |(g`QZr*dNM. VT!"h؋7h1p#7ǂ 4Oe~DveZ@ģ;$ v-. >` $0p/(p^ ;xfJ*h_J'Mr\Rh-vI/"l@,r߸ !X%_Tp~&ˉKG ;w:P3VCH 8 1h;{|ߌt -wO wcGv݊ *s~T*\4D B4pİl)ՍVѐI@pw. $Ei9X Kg Ub7(|;X%}9X 5>/V,"6:ҿ?&coHa&i%DZr%@\.Zr#Sv., lM7ʶ.7&BMMZ,k{+45;(qHtuӻHpAaٍ܀b,ߪ/iY5clDrY [otzāP[+ȉ"o D;¼V$Z( _$or LTTMD3XmPAgpnԯ0Cxe5B ,«M$lxnUIdAUtD.r\>-md'`$ ,0ckfbwnkѻ%shLeQNuVm]|(-d0\2NqF$vɈ05(T !DѮ&`3@ޑwz} DDJ]-ՙB<5HUX,q:$6(9(8ͫG GgsC<ۦm/[GHQ*nXe1GX7 ,@~оP)DuLW%5suA8ٚ/ &19帡G h0YoѬb5v c-DS@B(Ƹ͂nj]XP_b;B3su;Z v3+Hb3tab(ImEF@LI$= |H/v[} ;Uˋ@hbunĸǧ2SFiD/Xf{$١B(29U)..~ā9OuY+uikB܀i7:2ؿMx=0( IpT`hb`H C@z%kRu*hCaQ:*R!M$ޭMhnC6쭳 v4FE۪ JQFgա\.Wѯ$L*zeFN Yl_b~с 5So%+Vba?Hamis4lܲpzn:e&lvz0[BERz6A:  tփ]@ojva ˸885Z(Ņg*S J5޲]℆Lcg!b,qZtG+F {ۜ`A|27癩HH` J* 3h9]>|2%9pRS v+q|bUt]rW$mu"JQwxrݡET@='xip8s&@ X.i6'- qt"Dw]a]7 9&_R-"sSEL̯Ckn)ra!`s]a,PJј *vWTq.WVүH\=AuBR9fNϭZĎ&75X"ݴ^؉'uŧ2K-~T..pmSҐ!&ZQYWV֟Aq^ b#H ǀ3]wq0)fy'ɰqH#o Vn14BLΌNэ{^{6V2ubW,byf6&9/}^{Ob3Vgۑ+ŝ3 fb}f'l3`0 i5z 74zI,.0ս7g:T=v Eӯ<|Q q`ɺCݯ\3j% `)7Dl:;CO+b "gX0EK? 4bL(zvlSV/aI$_aHkݙ՞i[Qn5%wXp7ϖISGme[5j%hQ"wN9@!8`woy?CުkA= p)*9iIJVgRt)ܛqU} n!FpTC؝.nH5Pq{.=JWutY1*E y58߳dʈnrWFUeW2tkWܩCF[l;pP5HR G@RnK,ރ9YKK9YPv7LT XH@T(I# 6mqh arp!wwCPqxS⤑ !弣0ZBH<0BBi &{qε.EoDrh)޴BIJEPABGtpcy&#U2)TDJ܂Ҫ?sri0(tT& ɓqw0W JNF: ]䄋=c<  cr7X(imMYCFVZe jYۄcp޴NV9ANi>06 IBB'2AFcxQRr8( H$u%$ }UuMw8VA9vo<&UG/; @oc$J0ac1搭qq몁D rwpza 1}J /k*bl&5Pf\0p.~T$]~5Ll?C3\-%F~:.>#l$c}rG֦(b ӓ܏3e2r1YzMS +2,Ey1.1:!qw317 ほMZ^1exCUY,Mv[>y+ImţUHc#OC'fF?踎 M,. 2VۆtIJw$.̐bS(SU4q$Zʠq-l@o$Wvמc-> ?5^ 5DQ-aX"D{ >M`FӰ53ȭ*!8BA5_ 4@pR}f:b_ia=ͅ^15t) >MMayW)^D]j@Mp:V&Zzbv%/_dQsL~*|wu*T@|)T=FT*𱘆*X2h?lpQ$?D+͇E2e\ C!=fe\eC?n>$?Z'QBZ/AjiLk 4L5s2%sʚO `͏gNr;!˷wԿu~"]C3 E[Hay&CxQYؘpɫ-, ,_)_ 5!W;zɤ ]<e^&\EtY/  2_}[+C$h sg,eҟz{䙪4tUɷqQA6=wIt1 3w*0ac\u+𿑣U;aY\d㧘~؎ּr4FC2 3hvG7lmuǦᏅ&fG$sd?qJ퇁gsjqn~5UXbV 43ʸy~;7/te_EP9V_7,ZiRٽ 2(3w0ĝ;KmrL>}BVMVxGde~->>r %bichɛs'ѢI+ßY'K˘a'Љɳ eAwT>f]y AvR@% 6|P~%}Ԑh!w -PtiBZWD z">1gN͘˩B2Oƾ!sD > |-2RNֱ&]hGt/ Д&Fs> 62'i~ΰ 2l.XR'>mΉe?kPUc|iG._6Lݿ]][@>,#KAC?pkVQ^(+@&ko2Q7;/?FoF]NfGSZ^Etg{^ur'?k0;CQ<>b?]3*Տ{ȉ~9>קG9KAQmv>C]US&,~D#xXocK+ޚ Ǭ?@d!RhjMاT|HE`G-9DA>'S6U,W*ާ}=X%tNz;X2M>ZXGYK93f } [98/vdxRE%h8Ei˽~}?HUzur%`PqO^с 5&oh H V'-(I|I^2'V=瓱Xp>r~ןH!}EQΏ2lY1wi+zt=\տ{yd#{, Y!&DOfZREuAw!'AU|~"~"axoYe@s]z =P2tM.YgRiSMM%A HNZH7i߭K?hzѻ,M]ui$Ɉ96}З3qfRO&A~-vueT[>?V?9,yIoYi7: tmT}tu=F߮Fý~~U.oih"cw\'DbBEC3V7c>2E.tS@kXӱoEUlf6*?H螼\JAW+ZFܻ\>ܯG꩖?֟}Ss1ZLpwAf\ZA:MG.)J0ruI Eu"E)(#V 8_{8ȽVnmܠE(!R]F s ~N_PUXe(Fp#`z. w#$?D,6R#QTHɣwc=Pm+{ŵgLH):YkvaRSWlɊl!,²o*_z w+dh$[3-oRԦ<zŢ1u&FQLvi ke ݜuS%[VnA4zFl`vRbꨑ8 ۋE^#He윥zTAB}j@' ) heb4V)Ґ1c R3NB|ZL %zz3"yX\.FE9 (W*$V$^vi.ie恪y @ kX=8|߷?,;F (nA%^CnAO(DUGM:v]]H=B6Gc3P0 `( xFl0U!#j; .+Yr:=/sAUtw+Kc0kt)!m )*b7KBVՆe{Dc/0S .陼Vzd8XmS){u]D&f V:cpv!t"D?6 CHG"DU2 B,\%# a۞pe V~/(k^DAOg|"-3c v˕QVQ[.EiU:3 ؈Qp1WA@%[u@1Ut*FS:$%uDEE1;J#5Zt\oA>M?l4XۢYc@ mɏsuRkMƹ=[QaqΣz@K3T9tn[lLi*P'@{vVvAQOR=z ugR%EKQЁ=QQ!tN`:,NjNZ4 nMy9 !&(`@$ tlצFH!__U`hr\{.5G5\g_HۋJ!xȯ6~ۖ1Aq_ku7Dͳ aH"[c]!MH0RΌ9Ӝ_E9=n5L%Tج OE;g50{ fX`(V]Q_dG|ƌh^v7T<3M͑bDJ9@HZ`!0Ba @3dLpĎc7=-0Sye,^I.}Hvv~Xī73vn(d(4Uik$Zamuޣqf_W7KQuUuШܧ=Ţw22!t]аkńT-vr>&R$}=O쁔{rPKN9ϙ uȭ)`%W:Mo'|5PѬA Gțjqt*_;P5?/JHhJ wAl/ⵘ*6uc*y({<(*v||nCuET,0Uk)5gXl 47X3̳c^IOZ$ lY5X:9s ]^n= Y#?`5OىC ~B@Q%4-~Y*(=¨ 1m!%IjjCAy>YK Ү PTP?FǥG`wGrPvֆX99kѾDzs\&RU-7Fp(|CJb؜N5ef6E@!k]m9z'Fu& @oq4=l8p8N[Жy`Eo <L{GS ?FYÿp>ʲ50Hkw#20;.Uut o/a [QyI%qMvț%( aۘ4ek[í3o=dsH ҈ A2feFG&Vj=An_:t+p3?Hy5d0+E߲bM,|r԰t9W^}Tr`x;w!"|EE=5FmXj2~GSJF@3 8h(2_ Sfh1PBttѹiĝ}QK4n+:b7~?Y;k=oAUF :kv֚|$_ w`:.7S ?~&} d_OŸޘ|zxm]ivTYΫ<32æw3ZnOIBZQn6_=@75u '|mdw :]7KAf!vnp]=GߝA˯{7gߓvSՇW'`9g5W 2lȱ8t$@MH튿X1΁!2i1-~ Y]vͽLu!`$| ^#İHU:]ީNIђUjPrv{dP[w^s rI>NRzPB2Ite4&5,@3*6EeiE>}N\0ť&ŧX6ɤsb&v4 l])knHGK/; BSpcpz?l){G~99/$(|-|g >0* (<`Nbe"MHCeW^٪]q~KT6&;v]A`¼ɇP κjFl]Pmd+]ΎuuU[&N[Q5x_Gx6(ǵJյ6i2 $:ŏ騻a'k%Ňk_iߏ.c(VB$B_Izϱb(PJO$(olXk3R _:-vr$C̀>tJ{uV%ʜl^"ɠc8m JTSoRTu>U^I"UC&]/ؐw..I oVV4DgEdFKHRDip`93ZAvXeL .O:$@jmk1 P2V~nYU}Yq,KXN|pf Ɗ܂,%ْ +}%NRUu@xIJh$ [.X%05kROy!]G{*n,H[CbrVȁvE@qJMoRK~$\ߦ8 ,9Mghνry=G}UHh5ӎ ֎G2f'{wL]"bc ..۽V~(1Ȝ']-Rȴ$LQ>i֑ſ&5[0#t#ch;y @6] Aw;UQ đHZ,۽t;.mGB6S3aqc!Pv|/nwhP[-/X/JÒ{f&%7,Q$O1[qra"J!Ui¡K2h +fJxVqOI]ŶNCX]a*2اe!O7z-/M'foeӜ'`z!|HW #oRӋ?M8[RL i;qN DzI17'&;Yo;7iûX嗒'-OU=k&9O~z?0fqV[]ڄLq/ p$9m?~ARBN^ je+dJpR|<6FtWE$2*E hgM&=ا)9Qz`8_gK] ("*PG5;K+3d8w@Y N07+FՑ#ݪ] IZTʊUQSY{V@\͐EvX0W\ !\q#j Fu~E:2OE9@7~s|DcBII@8S9z3L52`a0H՞CϯiGH(8l. }TkXD3jݜv2cZz5 ítf H977?jYyoX=^PX Mh&$]g$EڥuYR8Ult9-U tr\ ,yс.m! |ݬud9=[Ɉ&nCL!&m$}SO g} jXvݨG#0K@=Gq)[Hx6uCm*QšK% eqB4{퍬uz},! &>'8~/TNDJj7L#yRۛKs̅s"GFsCR:R iS&D눝5^X$gŐI`̂$q >ȼoUoU{R5RkEx7SzX-*=B9h~c~N&cEcwM?+SsLա2 Y)ԭꪡY%QS6b p7]y']$ (s#X XԫWle9?X0r93";ڠz6JSvT;JmS2э}hbc۹$,jG;SVuGS|(>jO#Hgܚ8y;1ԭ.tgJ \ro8|icwHZ;&=۪^yk DϿ1$ oaq,H>K1NFjn5>Sϐ36{3^[ԺRZ :Gi]q ٙvJ 摆;4UwG<>h y`=d Puȩ< 2|N@P@Յ\e5|r`Uwg^mo"sq~XlI2f'S 툆7-~9g7?CmQM:Ei[69E2b'=Dz #5>lUm>NH>"JrW;e?p?bV{' cW5 K=햬K83"FNeQqz- Hߝu?y-¥(o~?uL@ f0ay0YI"^&^hiMQȟ_|9>`S-i,/Ky485,Vqfyk ĕ5`bvߏ(븸Cp^:,/V}{|/d=h=@k"dHW!(_bz'Ãߡl- ink؟)d| _?6?1?|xu@Ad:G\~՞4XDĴ]1^KO?$'?="rsft5xקzj'z|hIf;DmD}fe<8n>8Q?R#E8iDRU+ۡ#SowGRM)Z^2GWY繶r=QL=> 7{A" dKujAbgqw}%z?d.&OHHyxuk6LBX$ćO1 @-} X)~h1Ǒ驹huIk&B9(Y,x]-/M&HD߲6t+>,֟KU{^|c^*)4p;O"4<=2YT }8g]Ay+l8AMЉ CFV6]?qjkn#UWY]TSC9f??;牣ySmĭOYDs}_Ȱs!);Q%%K՜gλ;vxY/,H)>Snȫ4DZCBoek/*BWYdG;x1G(~JFS09~ts\@|HTOVmZC!Nci1j e 3oL q3n{hMϿ[PXZ!Ӗn۪h:=1bj W6PDamP8R ˩0ʭu[Fwr$񳬡-65}bȦ-p #N]MZ,)_ 4sթl (6PV4ӨV 8C'@@&jn+eE"x$k c+ze140!}Z~ Oj} xg7|b zuSA>t>r'ibCKC NHItu<]*FSO+Xy4W-aա TH<5X{V*$F'aCUUJ"X.TѥZ/\G sH\8"'jE۾Vp,[_`ԺaQ fДuDJT7 A64ĈG&Mn^gR#.e7hu"48E`]HQ[Veg ج?qvըOo҄ R_Y5՞bAќ6[3׮92OMΎmoZH..A>yܭ3}1#~4ʆiO e#lGRVÚ}_k v0ϴoiuGtA+D 9% S@;rsB BvT7^^yD5<>a_!s]=!poxcV](=I +=x BޤB,{T#+:Q$J%EGueuΰ|4*AM+{|cڃڬbC2bCpFnEI;(Kɀܥ@:d~sQzCҚ=ٸ]Aiƻpt"I{BycRqq zK\ZM ׵6trdq $t eQWWpS;2׌6=Gԍ`rsCAH`vO|'C`IGeGs$RR4`u0,}\VMpC TX4$EA58 ɜLT+)23֨:ݕ'-ft5sr Ͷ)k ՎY:9-wz=QZuOS2J},z whn* :vc.d-ݍ)fJo:" mP# ǑFx=UiWHԤ*íOfyv 2TȄ`{0k`+dnꋱtG1tz71'S螣>G geA ч6Wڸ x9DYu V H;ZɫJIk&O"/u18.r Y}gM(."M9"u+AGk8xy8;@yrKIyU7TL kz+BFt4죜~:&G_Y6 M\HuK[]]3ɐvlP .q]/Gp!zsrT'\fpu?N;:їѿ AdqՑaނ[ 75d5a5G%c||26P?kI" b޲Sϊ8b+F;]a3GI*9Q_H}Yn=Vؽu0Z]*V^$}`u&0/QS]LVrMhXlXC7vN=T66z\ #~,PA`TG 9HCڵz\XП@t}BB E 7(蓭 FnU4wzz%mD5H^d7}J`uōcۓ' lv|BcݫUb2%D>朏ړv`2{m?NGz E~R6a_Kǹ]BV+kJ Wݞ`*2ye QLyU.:uţ㠭5$UO[*鸫|aKD;t%h<9 ky9e)+ƖNQgA2ZXmsd=^R\ؼ%N:E3 kLQ#S_GP 4r_3 6F;pt.ull>굷J{fª4 5) E$u6OǷ ld ʾ$uCg i_fVՏz7Q-YHDIxG-b1 'qO42xIE-6Ԅ GRvhveuoLc' 06!J6VΥUTj6We5]\Ql\`!D7BO#S,Y b]p`Ѝv)+e~q4UI*?v\$c#T\mJwLHְ8-*vˉ 4ѲՐ%॔2 Q6KI :]c)@_GFG6Qv#S%uMH\zz{jJvԹ=S^PoNݸmTVY厱)"! #ޛœBZm#=vY ݅A.v.HCYcz1EC۴~w^)QU;1ʎTxO߻VUYZUX(F)Rg?Vu. zs OWbt,0)\_k՗᫶SOSxU"Ȑ3.{ {Y_z5oeN>u/IGjԪ=BTIಐM_u<+"ړUeȍȉJ & 6~?;tZ]'?u B5g{TUWUiCAcu2)8c=͠IV0 鉥}Cb\dTSTņCx׃״iݦ TN5b$ Y6jP5.#DHP=?W")pmO5WIJ߾^hup>O-wY\,Pӽ ,!gG8}MJKM N4XȒLN~I#lLZO[CAVR6 F[emHຎ pf8E}sC{w"?0{3IpLMM~>P$$JT-U6 ($NXDBb$)uqg9] ]X**)w륃B:,,wءp(Q]4ęn?R%SLnQwqIzC26[8{&<9g,$-5œ&"K{B:[;FtQ 2¢g&噥4C9 ǐ O9qCt%'< ]D8%l kIY 3ޢx`vJW8 'u]̯W$El%XֹA4 c,a:~߬1dGu9҅CF2("vv%ͫw*Q¢Pget;fMӅ@ԯ:EJIZHM _AxHP>PKpuQ4] ΰ ||?$L;ߟ{ok|MQZ)(j8 [DLPގKڹ=]'ςd@v6'csK 8^݌ju?\0B*]kIk0l3>ǐܳmCE~הt}ߑ s"RU{30)7^-#u^znQf]ڔ@&efr\jאz{T$F;~X]#yuc$pI4yL26MN.>E]Xͼ)wKቱo@-f){;3FI/$լ!oEbzyIǦwwƠ2z5.v_Rw1aZi֡fo&5HoDN{1,t${d~mhRSUiуrk^HҤ;u܍|P JJTNc,@Mmoc3ټ6ur&cm =Vb⎤:M \[rv_1i =K&7 0$fݶ#aOA[ԟl9g!lrf~Db[M;an[Zfmǥ6fKF'/AsԻU+U'>bqp̑Kڸe(SD4+++m:DpƋsis_~z?GFga[jࡺH$8n(uvPR;2]h+kL͞ Wt_T9/ -T3X JvD ܥ Lƌו9k_Z?QVMBeX)'u,~o7uM@z{Ʋ ga}dRA{:笮^x0ڕrW>܇Jߞ3|;Lv<+=GVɼ"K['LhSNUa{t1gٯlJQ-]iFAZΠ\J&VF)v/(*I,t\7w/WyrAޖupO|305< Oxu| O7O}^O4ЫC*tg55`q<VUz! s+M pEduK F67[?;&nx6z-<^@`w.=} @[jWaa)GƾR>~* >FiS)?K !˚Fi)XM\#{2LGfR-`/w*8tWkcش,?ʂ4˾D >~ o",(R,rGJqi9s%rި :UhNPQQ1 AC̸Љ۬TsQuAY?*ߩ>PU|ڙ9v)cYօd ds׿+F^ڔ[.{Zxks4P˥,žq_jӟ|<ς)^=HGv7/VEc7~}T$ ['j<[.I|@Tţ [)o@v7*5+r]?[c/F.E2Q'U̫io*0j= w'f&aQ]uCIwY4o @88w.q~~"ן|Ky'_v̬Wƞ)@c`9ZsFnfbL!Q <..\L|8rd~o>ڇSH21uJ*O5օ4bWc8wfBɛ9Q]̸qGʬL36'X+9ȄͨXNJ_~~xw9 Z9VT _6!>< 5asύ^FsMvKʱћ\$Ř/cOLMZ)En~.eՉF;GJ_ J"ݏ |D3R1o5)P&Y&ys롿 g}Hyu*cN>DDyrkG>Hh2P|QB|zŻA~cf\4,vc~XstȯߌcWMwqv_Mj_lʓGRũ~H7n@}Ah RJ˜j |K@/R/t.lNJhܐS}gvɛj9Qnѩ 4BƏ & 19JXOHm\`Z?:榲KCwgQO=F]RƐo3NQ L|f{7DR9mI׿fF)=f!R;,Zzu*A Iw]cI'zezZ_ riU̓g>l%,Uqc_n`1x1gr<{ET#aOؿBm,s<+؋8Y`@4喗'; E%{^i0u׶7K[}j&ŋ"le r 6A|#+;N[r A7tXfy[> `VW6ց(? eXjcBvy/v~M3iMJwuw#F )tM93LmMdYKт:C++|d",0dv SKԾ;iR-k4zU)@]2{~A'=F )H.YXҥ6G)FUFSa׷0%9 oI'(6W +:R lΏ!Fږ:ǺKGuU;aS;{y3' EIAQ<8p^Eo:ݡZTl9:=,]DF+5l+kLt"C`l1N[1&TH: ̰(JYDwtq.Vw/W0h_ aﯘZGґŌ7 uO<2O8ѵ >7]U.j3vTAfU㷎O_s [I) *i{;pG$ &$qqY)Hù ZшxK.<ˎ ힾ7Y$8{+ts<֥+uj6l+֯$,-È/36A)5nuw9e;Yʼo.֧%+=mė `: :QѫH4(a[ } O?"lVS3RbӔo݂T+h- 1,sS5kg`E /jcjl7BgIIt٣(▰ =ky8Q[qʋ% =AL"EEcf)[B64vD ZezQI :e!7-TRK18-K0Wdz0Zγ)vXi@%H Zκv2` 0 1Jx#60\"ztQ ]0` ^`J0yVEhVXw"zYb`]n*a&8D92[voѢ0/ܛ*]!GpRDd WTOף)i7r5eLeܺ$ vI ,/'l.$c-DJ6 Ih}ԬKEi[)lGdB; !tؑ"O(L?FksP`d1P$_U!u]Q,DJ1(meWbY `bŏ$[Z3u3_RS@32gD'o=IygF^~뾭}c>k,ȶ%`K1ȶ3Ze `mK#,6k @6^ iжxD<I++930a੐D - .<$&4J (D`9&tS/Ff1(0۫, btE+"vUB|S0je<|nV427{Pc.}~k`Ԭ\-i0Mk:0SV#lv4d[NZ.y;I<}dZ'9wciVye5]>ތWWtUooήf두FȖJK)M]<9 K*[& Di [ y7_҇6ξƉފQLynS6'ct>]%(L͠m]}k![pƕZ#<0 Fp ] [ZTS1, @ѡ1-nQc*NM)ݖ-\nvk&U5F+ =a"ne+Spa3>N3zB:@ EaXcf|n9QH9N-׈E:BO5J)AMaQj,Y&د^8Ϗ76 U:ܑ#5153&7L?6C¿ ok.ņYRkvaS—CYTK#J[X<z?0z YA a16?_WJgg{(<;`~hĕ2)/dXڢU# 63{}"\ Ollt]rCh&wh&lKKQ$j!mOol=<ƋO_o&tarwAa=wʗҪa8R(~8-q&~c8}͞:o/mCɸK 9.rŷ&rE‹s:֓.h,`=Be$.̒C-視ǁɔfBU,P{ ur; Oȣ\F2Ooi7C.^wv4v[ w UZKC)cvݴu{4X‹6 cE3ץ22Qgo7JgO0am&`7\F_65T0=ƆŠ"c8j¨Ivjȝ|B e3bT$]nh c'6~XLbKMjy]}g!-s˭̉3g)U0[pՠEQd麦2x -M:ڦL7g$H'Nw fI,0,&W+ )90 5[D5Yu;^K:Z~OLM!|SAG;: im[}>A@Q×=`X9'G&@{" HckթR;=p;|qy  zư"8_ykAăC/4Ě'zPvؔm.蘳hc1*,50'Or*aC8)a| !(TE=+ $/ljy Ȃ:o*;,~}@'"p؈!Ws96JOڥⓊ>%>^*.IqПcH"^/ɔӂ䣟Se W>2+n|Y%n{RN_6 oP=VKf<) u 0DL@ܼOvS"bO=e[]^mh'F<*kl{b6j?bYnDk[!R&QV3EڵR' I=hP6׺y$B'bM`]S,vlB*~Fh7l@K 2J][d1zk:.{ƛV1P6 \9RazvZ%zz7wm̀4Civ 2ys(;լQΉ1/_!#wcUe6_ TAk`ca=qx[c8:@ .d>9J7Ig]z456MNՏܫ j_a)Zf*ܑ]} 8=2z-t+:< R=S R2ʹo'Н,G}ۃWh榒k"oH\+=UUY񀞆Q~an)ǩ @޺FmIyfLpPi2(T:/PRl#x@"B`+d4%VOAcX`λǂZf{ ׾Z]WZf lTtM,pgڭ,Z>n }~7 d8Ef9 e;:huq@lg[F,s}b o=i`7l{gGWO!wLE\hw1z!jgO2O15y = fmMih>+,em B$}p[b͝DK .,%.h(-[8MZ}op)ܦڼk3T&M1j-d%H4YŔ;8 +6P'f1 T`R [Z֞ / um (g\[:س$!jʋ4ߍf譺AEl!.[ >'Rs5#r2TB|Щ#@~+f-Ay@VK8(U0J m8=8Hn浍TL JoR ?BZ K2y(WYХ}BW=vW |=J*?`(iba)tjݛŒ)W GJKZ"OK; UТGF؇p,/,\t!Ҁa\((@֐6X,$01GQ8;5Nh 4QG!;LZfWJ,)ҒFGwe]aAn`,e&ChH"ah%CfU腗_*S 3<С@]~.=yJNnr2.q .hpAU\P0ڿ}kdtBoĦ rWdk5 GCG"~ndm R6<:e08-B ̥c{@A|S.3$uqQE ӗ8g(XLȒ# Tw vL`R$+'*r> NrCzF,⫟Bpoսׯud\6c^<#z""c zr}nʳt^,z x(DwvUjԚKI?$ K`1-O4tP^5ͳ16:9wOPX*U޴ރׂ‹7E (:m">twa8RwKlIX/Wಛ|/|@))Rtnt87쭱`+h7'5sO..aЃ7wWJna?~ 32{ю uc :i5:DV n>Q):j&L"eVhƇl1 $n҅C3)0 siv¡J´K^$}S} (ԝn| V @poT:se[L/b!ݮBLePN/BL*^JE#X l*Ҩw5.ۊhnɍq 9riŎ~ N R^,ډ^]#?--%ʌݗ)6AվvHݔ]fT2o Ɩ8 6?2› ϻh:'i#K:z䪁\Ճ):tEiˣψRoxic͊,5kz_4-_sAv;T MxZUa1KDKjVc"Ro@dyַu "7xmd=v8ԮnC8ɍ}K]A.0U9޴R(+'<Н2;l?Ӳ\2KˁwS'$]Ȓ.kr||gEJF7s[2Ym6Sקkl;Ee9wuА<:>C jdޡ;ۨRXJǠpj&lR{HxlqMqZHu)wzTyթKm*=%::f*)8ApXԎpAQ /U:`5B (9PU&x#0rpP*[jyإ}|u$X;2mK?"*j2fdڷ\)u9aE(ofn {뢫sXlH3!X#ՔL:Ndm 7zJpIa ` @44,$gLAq"oXf@u$ zr8pJyoKcEӾ323zw# 7ww ZfEƨD;qbQkZlי?4SDilYЕ4'iGGADF5)kAޏ7ג#Btߎev-=Y[ }RB c']-xэ\-GJphJD`} ƗMxsZxY3vg:"PF#;f7mfiW2Xۘlx55[[x]GH&4߳*"'b_Z~\ESzm/)hHrV)$U JTg$A< 5u4Ik8/<iY NG 2"G_-R"GK*uYO< |- }|E*F8,&LjIAꁊ$i cDt2iи&R#L Di6\- YͅLk=)GxO3s"5-/&DnI1,d(F6>1$4~c%QS TCYGBhn?zGa&ZwYGdrHxuC7hয়hr)\("$vf%FfA%@݆ -I#!..7 ?lR[2Tmp8q / <: 5rϧmH7e"s}݋ZʷEnar_#:K3gE~ɏ}whЗHHNbjASj2]ve%NSvjeyԻbsG$)O`W1!7,%DsޒN})RzNw7C? ':⢨Yb/F=Rׇ;VuQpל%Td8!DoB<=zav3R\(EQEIRDG(jKŸ[ w<,ts#)>Ӭt˅yB\.2<0v"u$*ƍDR4&$=p7>Dť\X151u]WiY:0){U@G.&X)hț_R5wf)gxO4Qޭѓzn>?ZuI}>.YnYvmRnl(Vd?4- ]y3/n+GhGDEG}H迋նc%wZF;sbfJ:v=GІגnKeKaҙZ:HOҶgswFE'pfxr5//G(c(l'\xxgo)>!':S< :zs"/nMNsJty4MRJő.^trB#J  RrjBG.L(y)h\^.$8eJD:f'I߄{2Svq_Ӹ/Mpeb螳! !ۮ?dF#:]m~s,L?:]rp+JD|ҦeR`'DI{ٍ f .YE/W@8^azz-g SB5.K9V# *\\r>tV1/W)e ЮO z|ltNj|{^J;5cv]S XCO.0JnM!mDg]yڼ@ۧXa,p \c/`)*@_sDG`TlBgn'!/FT`rHǁGɴϿŶBFB71X˰[`]zpE)FYbBN+`d/bG UfVh=/|p~lY!SVktt mY2۫Z9xL87 AY&O\ $y,!Lm+pzmgI!nIQJAAjghEa[G>C[B0/NO!2_E8f ( Z# ٖk!uTρZ|Scb"蕑Ѩ-t'Ju`ϗt4sSɌo,I܃JsRiwuhL5{l1!*YO!nBӼ&.rp1mBj.c5/ׇHkDGAiZv{K xI@Yq F.4+OIcJ|{֡VXD|/Ł,gP|AhӢvDM}r\zRH׭Ⱥ'E rvPDžiaJ'/T>5ĒL΃qUS۪yMp_bEtf\ki+nBxjN1aH']Rrd: ՛Mٍd)|vg;#|}̀H*!=^d 2b䐲+ЕSS}n,ʕz#\ZѼ|8 yDDj4h ]URȗ*M[ o*S |]7yz;Ur3ӝӽя$fxt<侹܏&v\Gv_UMkrs>H-1ߡIQc0ϧkPu?XSP 1F8ZKiEQ)yR#+h8U-&MB BTw+@| “zl(z9&É5:)45C@+j^M5v%,[-7p֡)*Q}+b4ɩ ʰ8P)Vn cآ*WA׺Z#hƞMPGx?H~~(joB7I LaZՖXI'f慙s^47`9,WurW#v JzlJInp-_3\Kz_+خj;rīVt\k$@(ꨩ/K j'j$yT!޳QeϠ=MjTPL7KͲ.DS`|, 83T8W.)8W=`샥7]0fO\1!}~tsP/GCu>pP_z%]p-PZӺju ~Tt5 jD n|~愆Ѿ1֔;%mo힩զH!ˍlW(m*7FP]ѩ {"Uv^j"Ae [bt!k.bhѯ),A "G] bO?RN?!z.EI,?~;qZEWjy|y V̧1/:CUذ{h]F->[ߪX'$e P] 9t ut e,7X1e(` >STW`N0VٵP]-蝭H-zۂ^ZVbf#bm%l·1&̃=#),K3C(O3 Xl [$GҹɱzKj1 e{fs-Mw#KK\صcȷ01 z@Crh#%Uw jsа#0(CSQ3wSO.4r]A˘jTze9hlŦ,j^T87m.T_NuU蚱G%d+C KXA\#4B'|~GV,V,:i؅V`s?<֛7DH7lzYj Ò϶O?lSeMZ#*D5H @Z/%U~@mqfu8l Ne ,̔m}eD0Ĕ؂pt *ܦgռٳ"mMTVH7)2Zg?$?D"C-xkfB\ ^zX[6GńSО +}hkAyƩ؝Rt.0-F) =YU*[k;+wKma0C%6qr*f%p3K݄ůHtW2nV2Z  :9Њ-=ɶ~V.jbƢ(i&"·eg9z^\,H( fN13GܴQC#xorn[:mb[^Vɐw[ w`' C|6ƙ<\ʟ8=SWKE=z=`/>K,ftq2 *u q'iưB@*D~{ˆe̫/.EF .k喀wg&1Y%*ru@m0(C'D뺺Bm ^-;9߬rjDŹ/e[4H"13zoW6my%മK4*._eߏKb/L]b_P!\KG*Ŗ^9ǼTR@,FңBي#FW{jX1\s?|Ƴ^yhjfoI[6R29FalnQ㜟ݵL_aK1 ZBZIG`fͪb5H SYd}\Ƌ~C;7tJF*U}9yxILv{tq4B(WPzU050U /l%T7^ykL{یq42;o%?/0X|(vfLg;  je(8 D%)<>߬ö@U-E6mx!³Hx%̕;I֞@ym/,_, 2;y?[wNvHڔo>ky֭Gh*.4aU{:S$l, \pDf_};m g̬ % gnHvT kx⠚<@)T#U^YPk*5$vq†Ď rI|լHPIl~2A-$bd IJ%Ⱦj3<Ъד*ullA=.RlQf F Y]3p&/3fϘ4l%0aB e3/bRLa2M@)(cJ`(ڔ|HƲ1F{BvCV2ui 8KK^}7hKgȫIVE0"kN~*}#i'TJ ;"Fpv!lwN-kN_(ߍSka פQvR .C묣t:@qw "|G ';.ȸ{/R/\0 BJ4:o hG?) zxB3Nǖ^tUayY(\02~v+s6pm;SPKj)k@AȪG0vj^ks(ڱj"NwNH|H$v5hw^4y4.(3q8nX]Aힳot(~qPdr, 0O[[Q1Uu2}.T}h+c8ue8UŻ+: ̎tdX8B0X }F\j uGǀ%q'5cxU2gNn īF FpF- ,Wx=@*xӾ9%C6.V'o8:G7 ~'SiN*F01aޗ\6u8#xƻٟkܨ1a\m~xQ"Ti6MV, 23 |QC;ɓmu.5|'"$R3}^JI-OfTD{-7e؈u-q؞ uȳp& zKǃuvˀpjU[8怫2xui'ydor_^scL0MzOE'ԩo ~=&N#켠 3oh- 'GX=;Æy.!ӽUdYr:~"~ݟo/bEjvO+6e`aX.G9L >'a|3%p npIܺUWtHYJqUЀ#M;;2a$&XD yr-[aFN֕ENgƴ,^֭dpZ73ğLUߗoH=R*K?Md]V=!_ cou+hz?1D}a~Pa]8Ɇk֤ˆ_OLYB&0ME+Ou*; xE 2OabErÙ:mBtqVXqn`uf4O(5ִ++CͭbQn4(}V*yJƨDЛt&7z<ۢ dNu{-h*(ө*S}{^E+gςzy"h7QStA` "b)m9`n]&*v+-1ñTN͛dUD$G{/\'v,0r0I{W50X\ji=}ꃾo4+8I˽^Knt>Rێ`"L/SʆrM#&%{%mv|K>MH&E!7| "SKziZNWI%yś) /<wzX#Oɚ?\o1+IG%U[p l^ziYL~o^rQV5Շ ; T |I!LDsTxԦ'yj]M<]2O՟3; R&xT79 t$,1 xvL~Ub_R@3#n ښt'm_3>p<@n/8x%^3:St (g~˪Y8̸ 0&_4/{݋xG߸`g2J8GyFpNy ~?kD]V@I(N0nԯxX%~z93.~vN)S|q{\1|23#^ȪpcIG7׸Opn [vpA(ص~n_0YYVN犯;>u)I.jJQ`.`܎?\t61o4C/5>O:y0Kn^01_ P'}xY!,:pge(g%9w+MCME)uDp;>ݒ߾(H~b@%ۿ`ɸAó$,e}/k"?2)I#gF-3ʧ詥/RyS -i*MxQ0]Q^+ǴjtQuDa9axJi/ _ o]"O%Ym~/o;<0P H#~dk-bsΫe~0]m|[OP|N}~/S~C4~'*48V!^m,·p&dLmZ>'q=±W?zyU+K Cw;j Xlz#䩺y?bnސPDւon )y7F!3]O&G. X*9"tˏyؠj=,ȈOA=(I47.@W/?KqB{^\W.{k^и2<|HꇽLA-Pk+:t2ZBȁBc۔?%Yo7 $|M=׌<+$9xxWRR~2-!R2ME6%M=uKTJ%yj>8i=G)9o/+lo_l8T_d=,b4ӷ|\N {3/v6#عWc57ATwrxhIf܃TFo/%%xMɼ+qpW4{*oV#&m_Nd8_䉇g?`?Q9 IG 3 Y%coTlwq=2QE>ȿ>.`د{J\aF" t<.Brh0ECCD=M/G_)؊uGb לX`*Q_⟃OH.0&md< K/5CoB}T{~x7s# 1,X=% ؼڪc(sX^RiZۡG6Yq9Iqx-|z ' /&ɣH? ռGAyfCU^Mxkx֯~PG]|38|#~$Jۭ vݏ[З "}7|yU?ڄJ$GW`I=z'Q0>;)˻U</c^<ؿM6|_mv޿P*`S5.Xo:^wS̏V_Q:}!⛞}`1~DB?'ֽ ODrpg&'^wj7(3Di3Ƕr7aOˌ/od!R)H/w奜%#=!A8$_qv' C }D#w+:UNVSp }_F0/˩oʨPOx@D!YW.r"_o5(rL  OyiDQL{[{߹@A~/n8k&KwvhO\V8_`>_+"wQ^L_;V%0KNJ4Q)moP<$eqrN~;TT,A)RǬL Fҵ'Ѷ&f+X0ߺƃ&͵)j@ͅrX0wFm9okZVYBE٭6ʴM"Uu,LR’' }M3*S7Mpf&c#WC\ڔ}6 vFr SoHoWLryָKi DR؄@w7Mrs]SO/4RM M>8^epP';Ū촕,mMr@گWJ48dZVPY6֐I=uU  dzqUT[PUp(H ]Kk=MSzCtK 6{)c*2̶ o@_߉ϙYtcipˢ]R5trvk7/zc\z[kgԘ39qRZ}ցhUod:9c63fM"B7A]`kK^+^5ӒGp' |4 fM a-I]VV9$>3 Id ,=&tp㮋 er^%pPI3t2jbml "H5v\t F`#ר\ 07 UmT BUa/Z+Y]TX[J2wyB82~Ko _齯Aq>35q A:]!ŗNa}?Phu|lFdwyr.ljfk+ZCTq "(7plGpѧla2@Yjs@ɹziؽ\g*@FOT*E#r EF\^Z"a؜p/HkgF5@k@|OhT†4gY h տRND6z/Z1: Ԕavp؂ *x 7y tuU]`BFbȓF ot(@?4b$3EIUAz'sQ?1?>e aD:v%p3fD.W^y"pEf4ރ#]ǗKN-Bet^g5Ƭ]ea!T\O7ǻfK7n _?k>'4,x=[hpyUZ `⧬av1@[ #AJD':b- 1#~?Ե"EDۡsm,$HjkR@޾"xqp+ך ;K6Z],jih(ܴ0qJ J ]q6"Bf.ǫ<޶ ZYl 1=@8L/Q1,g(wX42!~w?8Z[5,s4[*'/n^FS4NeTN úCXc٫8 QΓ %<]F`c*M..jAbZ6 @XM N80φBD!Zc\2PbJ%A R-ЫLct:Rmf\n];."d:lEN+$r<3P(5u|ىyB4f\y> JPhocV]"T)Oϱa26 }&kOt+l]W@T Fd| v <%oT񍞿mSiMu[6S* B4a8E)_iȟbEsHmEq}P(5vJfTvbжL#TʨZ#}99>ڧ HȲKQ46mfI:Ix'힪^8"L6j\WjaVGauTν0+:2C{#Xk/h}[rRt(7@(:JLlNސZmH%<+8ԯS̆TgJW Ff,%ڳFn?oͭeSm~i]㯐͖nߥ3I>D,#e˿]dk\?#9-yج:%hQC_j;Q4a vK@s gC}BhkJ+}oEh ѓ2hZ4;+P\ޡ'Xod쉑 xobiR@]rҞņ15Z?z$VD$9~.uBG!y#A&^I42GFp|1_ o=:8s6[#MӇ"{VFkyDۀ7P>ey_& -Ғ vͺJ׎LS7TZI8 IWB$md*=K{R$B KThm,7\Mh*BbmiۅK,3z4}\ |'J+) 5!{|TI.6/Nԝ$G*%Ijv#nNd[Po221@PJܳ;xEۂ1nKѕ (4:}xF79_΢c+_0MT=d''u72,tj@k]rZ7*tpHV1@IPtEk//|k/P+7# ܇( 쁅'ٛr)ID7.&eSEt4 '%G9JXez!h)Y3>~pjEUky(S=XC2ՃşLw'l@g/(ZJ&$/>PiIʽ46/MNPuY[Fbʎ2D_ r7KF%I,&&%p)ȠRbZ-vm[G')>*-s,[h`&cfgݽ؎֮*[nxF"N (O 9܃Q϶L"Iݼ0֙'Y$q*$h"И"lT =Im43>yG哸H>dx@*?`B;N[9nh~o4||÷V}Gx) S1B?p5肻i 1;GTJ*Z4L {RAE_٫J|h̕a4@gұv"< L I9g3/Q=.z zu8/m,:hzÍ3\jEHPH;FȜT/R:/T=t JB ͡V~|C *"kq9JqdΑHssnwR:^MCakB۹+t7qR 0o8Ac{3 ; ۼLwo lT%m }@W'aσ:a78ث(EIL#CDO;EMiE_49i55 E"=oqLio6Q{HrqpS8>.~}[K]L}VwP$صe;T&o]X9LG{e?Fzpm_BP d3a+Ny<,ѝD\|9g"JT9Ă6{9Woƻjy qk'mR¸'n{䉽-RhHx/QB?ܜtq[1xӿD1/8Rf-EOq<RΕsi8Ja zTsL>j,kI8 Gs \Mzt 酴43sKjbշwhA-2ثw$Y<|'2%%bro8NRMIL mPU}^!);Cm 2H5t?0 rH{*Y䲼seEtCL4çl9M btY\ |)%Wh[lm |bplAio1dṲq r\-t "ę9 ͩUMcݱ]p|"1f8Id_`-u)t} G)ko1m\Mxl(v makk!cO4g`X7X})5{h/|~yZVia<ӾV{)8X)!']^1vދBt"?fW4f%TB0L0ci7 gzs݌߁ɼP{;Пm<󌧦|$m-~A8yXS8v\/GzϩC۰l3UuoOÂq/Y݇AU@ e;qe3s7&w lQ[.?~-Srp6q2U{qNgyrgcx GV2E6҈ͬZKM/%Fo4Rz3=jF<+yLSPJeBwV0'!q>K]c1?C-3-v7v7xȇdԖˏ[ci4>țoǰX p/me۬DP(;gp`BM7NK0L"E1IXpZO͌8 KC 3s>olt;K6@)8 0gC3U=co|QN﹒C4$1'1KHm+7JMA0TF.N vL@vius\cs|zk-3+)ưF 6d9,W UHj=9rrµN~#J Ri/2"Wb=`za%/0K z` @|HxѻO?jü }:%`mSvep&U1vyuͤT꺉]|^ီ`CL4A"I ~35s~:~b{"ot=;16*DzJQ]xe%?ka$7~`3z@K3^K'`-7fgnh% ]J+P c{ bx)߲5pw_/,4[\M*G| Cf 눓˸nj_@ZR:n_j] h&2fhêV&/Bifj޹Sߜ3os ]gakA}BcypBMTKޭ\2)F5u6pAMO*E}ej+ruP18lyfL6~.[%u3fZ:cpkgAŸSf 70"wOc"[c00*ކ*Jͼ\ MטN` naٝ3x/mqxد3zC{J>MdŦoaMY,je*T_xcT*u.nzzF45NY!TQx{bp#>6,H8KPhg6}(2lu 1d I)=FsQ( 0Gn+gh.GɅzJFc,o33%iuhdoVb80Gf5º 6؀-B(pj 'z /«Ѭp6 zIǛb"y[yy31+ٓ]`KoP n6ЍnŀT0=?iڼ x*zif  z䡀J2JLCm"] 6m6%r2kMץA櫈VB"( 3.*љh~t'7,`= \&RQ()A˾eީ^°瘀5.Q+Ƿ5cdNV`ZG+VB-RfR"[>[RH*? oD ťj K ;PQR`>׋rVV\JѦ7go>o(u] UTԥ|d`Y\@$0B :q@ tf7#z)ҚXM;k3%X?\]Pob[&i(d&b"_P Ioj&& ]/qXANl+}+3" !oY w:95(q\58;ʐt=Gm)"bqAbT8&e>bw74e@IY}hF:^b|ᙽ-U )K)'njn*/&I 5q{&/2e TZ_X^(d?";F~ EIVjH_ҔkH_#ix34f3ʭvt^6~W]t|%-d:l[O0O融Wy1GhiC"2=CO"#%50aX<3K".a\&ʪݱSZ\7|pЦX,} * V~԰kS.w;"J&-\Vt<.TJ3ZFR9U /hfrUZg(2(o}V' [9ǿo*=n?`/&@ 1x\s=,"퉿)g!MŌR!7 Eӯ$5\ "k[']ÿg T"Z.j[|}; Z8d'JDF+ US,:rpiA y6k۟c}^" 7F4v*IIF E !;ڸSw*t"\DEb9>ܝ4}I鑡I&匩{S`>#wm(:q~ 吧+?wWDЉ@tӣ|{Uw/R+mߗOž:r﹑ GVF:QE4jYL[/{"߲6Dea_;5qB'~%ҷ`$"ꍄC`l\+rZ@ D<%Z$5Kt H@_N" Zv;" E@$M 5'JP\M# R*Fߞ([Gߠ뽺4g| #U:i'|v"’O/An~`8 e?ΥE7 9E"N^z"T?SEpۆ3R x-*6.,ܮGl ][i©نu3Su8Bp/%# 8kPZelb)Tt6FoA-ZJZz%,ωZ62D;PthI4%;e)Y.BEe3J u˻ikOgj_Ȏ/~R'8L' H3&xMtEE>/:3i*=8?^$کz ~oTyq(p~w=I}RňFqQ蟑ziI㻳@ AÙB/4]O|ɹK&SFwu=[$}1AMݟ#T+iWH~?*w\pJ{"&>FNHFqXm(On,3JoXC6:hw2s!=iY^E0C" 9Jm1T kG y o$Xw*!TBnQe͈s"o?noi:uwNaۼ|jfS?)v>'.~&«,mOo~/?(. J?3\~(J/ :<'vRf6 +Ww=OO8s"ݵ W9@i#P_U;׷YämP-n +\:qNS݉͛EgiE/^bovV)%}n9!d'>kV0QRgv 41\?{og-!t.% W g:`?hAaQ1ee߅:%!{"5]-gr#p94RCj FXd`902u' `F8L:5N[%Mɜy8`8zńsm(È`lS0ٻv^uDŽ_@];eY}wSؾF p ͏6q؅bTU{@{tT-&]b&aݘa 8{Bί[W+]F '&ј (Eys D7gՄq!aT7` ^шA8x,Ԭm&&S ;W]f.I |z2ud6@hVqUMCr/w|`/BOUW[1T_$b{*ez|[(o Cu>O"Wa@`'"(46:1MI0SN3<6;7>KT%4?2)c}:.X ,)艢T Y pTHaceKRAc۪, A/B1񥫁Ms1<ϡ*\$ ]dCy#T[Lڐ.K  8 dBm X;T_CԦ HL)hj6\6Zx::и*c ='}ǕRalK P+փ PZ,@iCF6$]XU`ON1X E@-yC4i %Sᦰ+C.bu_MQW#QOt5-bpsmxZ_4qY1FVR'3$}]ln81Ψ{ P*q $]0B O?j<{!Fѭ{ GGh1*a9.%?#" c ~6ʃcԞྺQކӺ'R9dkz19=@RأzMcs0!KC;O5']2~+Z)Gy pCQ'w}*%~s'UY;ܪ 3 wOfJIiuʭ$țT25>rIpr] HH.8 S}[8k$1 `>uǐKy{6m}m%ꮈB .;ײ' ߬CNlԌ܆9IuI#T4QV[WSV{< 9BA2o;2)xd }† 9p i#;ܪ;=2-fD;I!Hgs x5 mɽS\1% 9{w+x3lHNk,z9ކV:ɴ=S3j{Gk[.nDr!5|rw#r=!8kd7k}oFILAD[[ *++%VCX _M6OQªY) ŢR ߞ l:oшfwmFK~Qw7vgNʼF s( # 6B1bɅ47jYiMfr $蠂eOw"{HX6XISlH]o@a(4hI3I3Gz7[U~ MHolCYn#\.,5JZ;dvPX ; " 5#Ծ[>^ҧ6ڳ-f &n ɞj0VGnؔLv,`{P؍*SGHPAn>x(z{n>HMR+d6M#[.{K vx}cP):`RJ1`*VT$yFw=TT,$$~?apVA-B*V~}~0WWiw[ uK~vAnzD]ZX1%+;\%= BXLa 62]*5,%W"2] L=tGvC_hh SAp6p=C!y)UUKcP#0'~V+< fyb{شL P@A7Ȣ ፋ5ѳ5x,QtWf - C>7]0'4"<ݠW45v]"XT+3_gAՅEƽu#lf9Na氏+6p-.`-uaЗ]|uQ]oFa\v@q`zevk/BkوBf; Ċ=}Y>@~Єǹ9Mhy@KN|Y?lK޹^5Lys췮W xn~wx AyHcIk\n> 9ndV>*Gb:B){?ƤgDKYv[*%dTj9JI><1zËžqw[R՘Qy?nP*Լº#2Wj0gҬh[vi&^pBϤbkEa6 S(>NKkL尷D0i[$^X7 YLjڮ,K)s;B5Bܹ5T1P6PFn>rcۋc× BQFpY%nNy٬C΢ j}UmKCf*XñL@ r <ܗ Å$Ǿ5jWp\vS7w(՛ԯEטT O+`o0%q  *d$[>+nJӂhx l8bmߊ#Y ^CbGxYM'%x&~Xe0?UCGp0C͎#TѫRf^J2nV~=M}J P,V~}&f,k"/de4S}, 0Pըz? 蝟gV>r-W aD =[bۓkyf?t+X8j`͔k$9v9gS*-S- _L[6 ,۽}k* 4b``gwOzc +zB\gk ^ݲwj_l򢄩 >S[& DҌ`0u~`W=0Zf/uIp7G9}S3ks c!Gл"ٱy-cP/oZŮfU{AS U?/#,c7y96=ȓL&>̟s{jƮh[!rsŽR_(!s*8n )L坯 +YJ9ՌnQűSOv3mɑqwzx'.ko 5!:C`? D4? ~Ȟ*mdt:JOi?Wm5 m~{N@j e"5M +)g5I}v]K0/ FndQvhv\YrȾ٤xI]Ɵ/R >h}yku [q](zS;ױFW߯a/i(n#%3JTܶ-P^Gr Y!bdP45jL"ˊ=a`Wnn!|VYg2I[JmݿF)쿦[! a}Q 9t?2OלdbZ?1ϫyK]C#1t@uKOF,]4%fճGFm:cOV;g7NDb|49oD0o#hAe""~1j^?V~tgpEK˄>* ?7^ilQʝ7*16'/;~;pwmS2"3]UW׵#gCqF(0RżXE&B;WouW*~EF%9/+${DNkIi?f[v3mP\_EAWi#T(RH Ot_2/ #8^sz0$RZˬ'y#+yCIELܪI3Y͟/' # VJ/ `} <`RQ>%axgѰuQO!2-6W,t}JY5瞑 =d_U=s1hk>t :vI  -2Kt&{JJ߈In< EED#)|:X')^ȕuvOtk_;`Xm._7ʯT_n}>NiJ&F i=C|/?uv)">BQѴF*namn^ԠhݩeK4d\i4v#3f$NPQøz^ '|[*C2^ᢡ$OدhlOZiP8?3g8cLtNzLn’yJ~'r/x̉oOB8>"+@N.|>%hzACN qEV^KdG+Ꚋ4P)S>lQrB#jl#a!P+HŤ#$ {џeJsCi$.)~:Qh仭!I? ut"zJThH<\I]> $5{jG"YF/{'M?$P`1Q-O|/O9~J=<=TID>H2Huh1F,v@ߟ xD$+ʢhc*/L\;/9m]VpЁ)2PIV?hg8Z߄+%k~?M k*[g("q K[Q ~(ؖ#Z#ܧ̢6ګqVvWϹΌcndY D xw/;Vs>yQ5 *r cFfnǷ(.%.Ta5"Y8ým0$Oyv:.gudo9t;PNMG߅NJ`E^%#ض'jf`o/1᎕ 0s J(U , [Ɗ4:ÿ*ö:!Y|Bٖ0eJT0ւHRkz> c)Ρ셺ѫ d,H}*=骙+S2B{RĆ(6(N)?a \[g 75jՈ mu@S a0.X _ ᥞ4ls ؒD.n&X9GE-aStn]+[Kc-KbCȓh4W>Ke-L`+&Vƶ#al$VQpI]WpB $\ŀ[I1&yYl+0@jb̜jaBmルAeaU!s`# uUfeM$cS Z /VK%?儮@*\%k4y\5r10gv ,!ibǜdF2ѡ~nS|,ܵ-VX]85țr6UL7s&kMS-x]HLfpZ̈́<,F^c$3 U`HH쀖g0Òc/W_.R5ۧ^4~ W6+KB7#-ږ/+ D` Mvrb.epqZhЂu=ŏ̐sݴI|KZP/7l͓EoP\zdlж>H@z:~ꛊܐ_yfc˙&`M`LG-Mk 2a o(yL]`EJA%FҔVnfQ6wzڨQ: n$97Q r}4_~lIp3ԳtM]U{9=&Q]Z惎5VLFWkruC JΠ g>GPaVOh-,`nriƑڢodK6MpVid+2L @ݹ39`.r* cهh108o?iex> gďB% \kr𝎮v㕌K,hYl@p/բs@UX)l:0' bv!Cmt~o[t%0zLH_wqn% 4wrCv2Vi& OL"LPUAYvSiT6<ɢ(%W&nx~wU=v?ҽ q@߇mP p_)< #\YR}vƀdnTnj!Ü[:p4]FV[QERRvlq)RJQǸū3E12/Xћd̐OAZ8ְE^^8^KPn&Zo%jN]!x|&G-&(rQy؇w̪?XH;U)YC7{/&>PFΪݑJ/yR'FK9Fs݄=,8  DoS3ꋷ-?ͩD]#W>H|k@Z]Ø*9?R,?h#V`c_D긽rn|u ˖?FURld9 Z\>skcRvOA_EÄKL79~|>Pah=рt늷y` b9w*N$7EEcrElk WH!uW$_K6>s( .F |)1&m@wE/] ._XQ+}t(1œZ%}TN!R@Qd%-Zٛӧ]aƓUgOI Jy1[4u,*Lä%M_K/RZ0ˇk0h]k}0xU9-{V WaS'H~e?V&}]d,yiUR)`i=V5,kD`f|M-AW5VkWjԲBYn [mzv1))W(Cok\ Sqw3TP)N^%J֍I[ 1Sש_E`q|1HX_(Jc ?JI_$ÎлTpIReU+ l21ϫQՋ(3Vnb>WU Uiy-s .*3pT,y5޼76*<-vf(FmfuTf@KLЋvz hB1)CQ(<%hXy~h\*#73z3H#`(Lݕa\96m^&56:g^LZjAbD.ŊP.g޺KӢ)vϮ]hle T{}-mj>+v0|i}T*6o6i.3rw 5:EC1+zPw.0kFy8^>> i0kOu1i@#^zP/ǃߘU7'q̎`/La'>ԅaG!b4Xe=je54Q4PE9]lМ͊ة#˺huX#A.Sʫ[L6ƪ0lP>bpDիiгQrK" @xm#umzYf*=gG\ /uZ8fҿq[©rZ{20wA T!&sXgפVk&[9P}XtYa?4F2a[C+K1-,ƆEPF- ơ>1P0=TrNOyY׌[[x1F$iIۀ`A x=tRN_;ˍ0Nl/m}`JBġWNvpJһ@D=`2y"Spxo/[}Zj ( ؐ/|N5jyM`:#^ɫdej&k}8 l%bKy5ٶrêIb)z`ҁ[ժwY>s.'` E udF7p& UL@Y,?HWA*s{,:l/!Wsn }+@-0TXKPP ]5$)u|<'.K&<9'Ď{bՇsW2/g@@J5dXP5Q)q[f/Zጠ2ܵ~DH=T!]۲ABKxHBi7߮,LQ XWE{%faVZN[\&9l/_68qew;hM-Q*e:ۺbޥ)rvs{mO\?%HE`ব=dmxnY/R Yֺ\9\ 9"qcMW@.=7Ə1X= vN Ǔ 9ba0:5w"MYiO=)EQb2BΦ3{(2 ́OtAo@2dB9&_kl@\~De}!Gn"k|{ͦZV'__-t@_5+kjaku=b0ynҪbAa0ݷ r\ ;'R+Nρ?$\}S`c*Ui $МOFqTcV6iWⷊ=+Ql:`6ezeW"fR' 3O7uD}7/{lU,5K9(Ѳް52Tj frf9x;UE%8}ڌ2sޤRuNcyfՀxg)TTO:a^e? Sn]i3e+6#^sRgQ/&? SY* 1n6S>8=u ɉ05ԘgL1q_)wPVZf+`2,]ٯUɅ(x8YjX nO烲]0L[]a U[":g}Yj&ZXj#7)f hiSW'tQR%UCia_ YfRT'4Us>o>A~oRP9Y+BUXMN,[.G*ؚoCF}*LXwF+ 2蹈 O8IC;ʦ_~^Qn*m(|xN kUc{ N8rnj DƵ*Q=ApqzxF.ZsT ~,lI*: 8%,@4*Eꍁ4| ٰ[B }+LRk\z1z5]d\oku$iLR9'G(X.U*_ >5>e0Ix"K_J1\f!ijb wk֟3~KXL ?P]9jHͽY["PaWj+b%5"$~A1ljb현h?::QeQ"@<+cy6]1 AwSd*s)L4hZ͍(]wf%LGc7`ExD1`&P3`ӸBC;fЩZ[`=lMf*(Z XщN%Sww/g1Jl}{@ZKhk"#T،/d"xrͯ–UrdӞ2CAb@0&z& 8dXQ~O@W4=;0y;p&yJH^u5\~h|VO"LG3r{-G"EbbDeɵ4^uR _Aq:gPd+`F@*)0 n`p+H 7^1jU)*\u3= vҠ`u`-#F(ǠGj$ c 7P:2dmw~#jEjF}G7T&[$*_^ :#( {2e ',9͸P-yQ \b (6!P RҎB7H$!U.7X.e]:TY0 v֍P 'iDeC4e#(,K}RQgm^h or9"E(*MsxC'7L6SfNjѲ2Ł7ѷTջKk& e9j¤n˝E)nL78 :~Ic%z#{oqނPXn7޲I`{CxS0" )V.˻!ﵠRBWm/הMB@U/FgNO1P?Ǫ5>.౴IaN<{oXt]b'9VWht{2,L=*e}`~N+ RTb&^ǰaŅ`?!C\ꊡn|E"*yJ1Rlqt}>~P_t(Ou G5 2w+4t%\suϢC"=QWdRvל.'rAnjʓz|O?0K-b}¿no"~:A4:e?*uw!/_{aZ(t#SlO (=JٷR$x!9FVJLf\OHs.nu=aδZ4\_ھJiųlij/hH_KDML -jn:?U)$ػeu)tdG`*yD+!T#Yd(R$V׊vY*37FwUwHibb_$DnR5#%q$b|@?@|_W}䭖#)dMRơ|D(F];M2]|ؿ>.FIEi{#Dx>ɤLέҤX."OA#5#'%yUH%AV|J&S'i]Btjtt#P;[%$y.X~ѧ:U0# D}F6݈:b]uZ}uwDwJ=oXy(oV}ݹe^H+Ͻd=**{$4_\))2t\59%l{osw:eʾ%Eh7Jg[WCQ>tDR#YH]D:Y}u0MW(*'k=Fsv}ℳORx?wOѣs6GJ=x3CȦў}:){ZnfQ^4.Qgou9?ߔIrS"RsQYИgㆅhHXC:h𧃣S9cSE~EoX!|&J;A;B/!~@%$hΝi`ɎTfU>s;EBek%ȠVPoM6cn0|H@Qeާ}8wI"mQt8,X?˿DH&N??OE~%)gdܐ}:)a?Zl"uG-_gKq?bEcδ~tfzbgO"i8S߭˜7gYFAB"Ɣ=l;kl|ؔ8͖b뷽ERt_ﻔA*i'Oԍ*Ro#z 4qBzNΩGHf2_ "=7OA!Ծɷ~[6#І0)# ~jEϒZʈy#+'|k_FM $) [޿έzcd3|ݺ64źw(lOYFz5 H1`$_j䨺vE(1Yzl8+>  fX3bbmdž50,7/(TG]wfd{5uY3zv Td/K#ݣ%mFjBmbTH*$ԂzFaJBXEU.T=wݜ9mmʲF"0F(P(x"e& SU-@/v (LmSd [[ZTUZۖ6V(5 ?]KBTjC_mX,/kߤj TsETR0bʋ@ots߶- [Oguk_Tyumbm4H_&;5gOJk Yiizd6GWjvZAz`4Fa]ePcNv=3Tx9Q"pOm<Ѓod7vhB|0A\:K ;mV:掗jc:0aڈ,"gh(vk>YV^.Bɳ fl&ÍL|qJq}<~t2q}BJa} !f:<rMf`GAîEgI /< {ʄ*ՐL\%ssVW_I9H_`totYC-fpϔE$V𷩶hil붝|#z:V3Atr"?"4BkY!)* a IwRZ_YdR҄ɢ(#ZB4MDMo@!H_o9 ]1s'mԜiz|J=zמd 26CPɞkuίU]RXA\M[r Z^X_/; ׆wǶ+F0DH>쏘ό&rs(w5Oؠ {"w w]aSюtǾ{ms\\"/RU׎"-U繦!!j^aDy7)yPJqdK$L2/ I=)W",& P{6* ,!,VS_Ck3,t lr3^6OQPiLe焆D3[D3l4M{*6BkB+4`@ @@\턳U՘ 5g>Z}#Ye7A`; g`ٵLjlNAG%ae%uELQ$D1 CСE9;P 6]l!~d t|>MI[LZV Za`@=y| !R_`Y&fp7=o= i`^6yy, JTUBu[)7W A w'u w]1tnv]jȔ!^>K](qpXeB@zވ<1'wоX )Ӗy%49`">!E}ޙP`6E;dc6zNϔ#תYvS5跶 `ᄋ\B s- Њ໵% =/K,V*:|3Gu59U1a[ Nb(w&F^oPj] 9r0vWJl##鼹!.U\NQO}HV*3@G 'JBʨo˵a%G:R?v1GEE$ 3>d"eVU{,N_ ӎ؅uA/4+GUbc6bRξᡟUP +2i;[>e'Fu#m2/BW[IUT]RQ򧰪~ޞs[\X;!~UFz *i z{J$l%<@yEsEt 'hGwё|{EUbOף>*5ޭxmbn !9g$k6cݞBD[ߐQ>@u{ZN6ժM7>[N%I˾-cQ#7-pYω~evQ-I2AޝTV}m7~V%phUuY,"q|GBrh~?Q@ 8PI?l{uw<nmU Sү߭Y6f~ #47#B}p{5'rR jO?kxjM"2wsZu[=R[Qw%ѓ=1zR^vo,i*_(I%<HI~4aIj+e"y]?XvTePuZAMutRD~-J8SU -!3`| (x:ݪ%NhNf>t|&He]>m$ZJ(rZaz._GOW @]X=qZa<qd3eɅncYCj/KdGcDxOuFIGO uZ:?)jGP/NHShѭTaDگI֪Lo}m/[jNX{>7%gת )eAgJK)66/U({8:^!vj#+svƎ%z{mH_Wx N`E"RE!H3Qؐ5|՚hGH?WQTR: }OS/9F(DkuBMt5l=Aƫ%ᓴ~L isׂr٥Ty?4D;WQ GkhʥrHn֏ @ `1nV՚mOO4]f]kjseٿ !5yQa,XotNr5o+7s;/@mx}ZArl_k)Cϖ"u?"`S\d Bf<ۭV7S`ѣ!> VG)'wtUݝs[r=A'߫XH%oaL?N$,Px Zn(Jv;&7f=to)g*!bS-Xⵔ| t_m"eO%]3Gܤr1I׹hឱ.r yI~K){2.M?#Q / L/O6 }uM&Vķqw(j3U|:'xsL8d&/g{ܕ7])Xk%'  SZs#Znޔ܀R/CX=) YIQn8 Itkz ǼL =xW(`/?%lۨ1K5~2/ yC+@ʹnRMhwYa,N8]8;a.`R+5Kf̓ӌ)98fɥd s t=rIS=FS_U08- o r?/r7||"&8%_8S5p5wc?ԞQJد^Oؿmۗܒ،IEJ :cjXځ;JAe+x~ ލ@ӡͽ\/K<{b1Q: d"6,7տճ\jˈuq lÒisr˜ҭVQn Y|[v;Ŋ+g:t@&O0Hȿoﯫw(&͌2XmܦpGAޕhU&2o>/;D^+^7#:tu7%/v\h1bwq8?ɠvFzIwSo,x.h>P쇮Fp.<-\0g[5'A;0&5'lvۃ[͋l-.&kJzܫA=oY"s,ŀ"Gr^Jpw;/ e^1߻Ѳ1@x%#.o-,G{[v  ddcMQd W;(@oe9]+}~mVFH s@3/){ aE&R @ђZ{Ѽ٘L(Oy2Sb|w;A\(wYv)Xv4S}+Y|<&TaB/{^AT2|7\xN iĈT{'wJr?QOvvctH濢ŕʶFǏ@?sÏ[%K ߹1 ɴ>ׅ$c&f% 3hs6LGGT|)H0uU4Vi,20ݦ6a/]f-/8]=V|ڂhG#\mw}`wD9v 2w\Hzf_U/_7<;UO8StQ{L7Rcјqv *Ħubn59V+Ĥݘl@R%XL&NLߞi2;>V q\%ϲ'v_\;3sS (]{<<cм`j(D¯*FR 1l Dnijc~'ls icWncTWOH+L,KdZ8 zWr ~*pT'N ]R*c MD0Y,)Zk(oFM0ʢmc, UR3 k[0ѽ(^EKy!Oc}Pix2U~f , V xm uE&C]h7 mUzoPEb|H{%K񃃋Z<p:Q^WI{J jr}d&)aMk^$QQ܄ uqLu٢>PR]$Hsf3* ]ilg`%iuU"gOLF۾_ߨa Ϙ i(>D5M؊2bkK` $Kr~GD /a9Jㆯ[l|$im-׸ E1HWoAppal&[y'pxFtโ!|R*6eEZ=ަF|zzt޺k  `/3rVCRPz;FM bot[67ksȚxkU,r6} u-! 1l3SO%jiLlGGB:q&V^al%dP dZ6C ؖC}#] Izx}Fj x LgNB؟1Cqg 3 aBZ@%@3Wv045- 9ՋQح=<bL8oǬ~ưVcA_dkق;ci ryezUiܚuo*]mF|ECK(H\ 3$^ ƱS!/HL-[8D2: _'2eN.5!: 15Qvĝ"8YW ͟]qr~a挝Rx ȏnP܊,'VҭI?h+;5XP4rKjЬz7=cWſ$[d g[f<1[c~bĺMϓtSJ;y,50A:z( *S}(2x@]sa>![qiEN C89Np^ChQ`ha3'i C.bE,2u\w#"5D[X+SȳE:RRfs6a{d5J_[ɯ]KLJ#kfntgî9|a튊qtXc{8;G:nS 33>🈶-r KŎ1՚j,mZJ,b]KgH{eEare;j b4unHD峤qa_f=P2(HFOJ4k},XJZ!h&yX-I[ijPd{ҵzH'MoHb!,=$Ex"Ub]ZsVECά1F66ёݽwY8IIj[h hR[0l9KܸosoRa<3FS/c!yPD>a5[$v[jbU^j YAJNO>w,+ؤ;:r7=0&Q9{s W_DPLx\1H3[KLTlQz*ְ) MhMuZ6esH5p7h{r9 X +nx%uq3#C`ieɂ&(7o$#90MKp3K% i&_GB+L}&v<3.lDd[ҷhwFX;U *ާn&HS9n@Iۢ]Ŕ`q}"#@uQQC%:-҉;\7B}+͵0ҡGiBW^%R*S|~6ăB49F۵d()ʼnܺO͎dXJc)n?;y`AXg8v-(0BI*g_DȦcٛ$»R9HG+O_ɩ߻5 5rOdwJ9!60}eȡܦǥHƽ/J*j[~A7nǷcn`ם!S zpU;_Tx(;k88D(>ZKs4h>"brab%IK,V&[dZ48Vơ)}Z }) } e2~۸5qѕ)C>&ͭ 7Vv67}ha?UjVеǰV['G|xȺYS_YZU}P\µ*P;Sm#6cxFp|<6˔r11pX}Xq-De.vQ)EjU_0 &+"]D,b0[t6j[Mq_B88rLX-DכkSwՁjzf/PQǪFE?։(@u3:3#h ZZxrJѨlUދPsϕS!Gm#s~ʿt:y[tMr7jBk<[h{)ik=uT~F"$֒8glV=5}GW{ՙq'^yG:ͨdVz5v᳐G%:9|hKy^w"X}z^HnG=jiE&?_n38&d~s(pOrībݻ_]F#j8@A0A.Y )B~ )7?SoZ`QowӖjAJq}`|TOR R%yln\X!Ȕ!*c*kwO*P7:+O% w<ꉑȬN>k%Ǜ {`xۭ&W\ˆl {J^@!gFb[M7SQɭoJJ[?M 5V7OcDc|5%od =qg$u/$- Z&ZZ^: ":Kگ^?, 3i[Y}1p^S#O'olia?k.a>Op&IE_BNpb6[M6"wQ qqSI|1\S:RO2͐r0֪ū͢kkF۴]l@uv<ҵ?I?֖) 4}blmWHp~J^Ȱ#4WQO 4uT\ysp_*3~zv8 5. JçDf7 D >ϋH{"^-)ċ _߀,?>uxh"JMS^ qc|EdlW5ld?#m*kh5ٳFH ˣC+캀?/%{v~+dYq#ݐ?vyE6 d-O|>$JcnRC+8:,isXhը>9y}"* G,~Z/ѽ+y>u#fdG᝽#Qc/6tSwM!1Dx`Np ?7-8'q:SʕhtzZ}%T@Hv35I ߊϵ49QmOL(4~[OёN-yc?m-n^AφF=uHqI5.oU6YE6 Աz'٧sRB9j~c|\_{T}\/:ׇl ^3 /!"*E F ay#CG Prr!Y*=0g[; hOO\Ԝ៾Cudn'}vȸzE]ǯp2%#=-$N#C$MŲ;$;=úg?铰dpy3Kꠋsf ŗq32`TA+ P_} !Zv淚 >#1@<{uҫi:qPm({{j,Bp)*yCdd<=J؊[ţ,|RYFle\iUa>nڂZx]+5 S[ *ic \4:4.rM@|j%2^9g`?9EYz^iLN0@.;dCm=/u$H07:Pn3ad)+$RuьX}8וrl^F"oe"?h 5brnp'a݄:rJ#3r.6%h22P]S'aW~FNԂвb=' >˅ASaϽ&^3KX'/_2K@_GwCm;ñhyNvk4@:$# 0uRONZ59D KYua%'0lbW~B7•5:r$h'aX#JƔX*'` 'C\dՑk0nQcwd1:r'`p,&tf2cN#`|5%h#.;\DšNp0/Lj:OAx|8CEC?_G '֘ u*<@(Jb]"`D2S׼Sg6yI4zr8f"3ϥ5W |/Uy?wsܾ+;ƙ8' +|]8r=h9N92o&u~}^z&g;c9| ̱I $epPL, ;:NҧBUр^#H1dϣ@Y5֗ p)L']؀> ӬF"U*cPpet rsj (KڌKY#n3X ]¬vA14t<#x=t^Z<H\P LX6i-$օ2qc0向-m -^x{hi ZILH4&"ԙZ<\zNiH ^d+}TFim6+H(sg!9-P3漆|x5)ITRBt9Ssvǀ^R1Qy 2;}N'} sa@V{pHൌ#SwXӵ:}+L1h,2Zn0q =f~9 }SR1'գ<}~*q+y뗗 $;-XobNRbQ竼Z=/2zIIu(0}8>NQE[X5HfJf(InsM !%U&*Kц9D\SVOf];H'?{fZÉU4%򠬰;l;֭/ۈ!<|Uu$JyH9 (0YѩH.q gʼnťvʔK=+KWȨḴ'SSC#'t6-\VZy7oy:•>HJ*.w6M:&Q','7h>;ܢRf2New 쟮ER dioₚ)DHl\N2sh[= G;w׍hڙRY+C+>!wzs5y&+zs F>t-$H %1 /k^Nۃg }fo^SN>>Wps+2K ; cq/8"Y0PO)-p<9Ȁ[AuykfDU X Gv"e}Js,⹔H5tF^8( 71=L/2 >'?c 6V` u2y~=B|l>ȾOCuȇQ'?.LB|Q:J%FC ֞U0\C5m_`쪬ifZDecy0䩤炢inrtY$}K /D^ IcՅ(ijoSp)OFlһctR"9hœcc>tI8 +8z8td )$peqݟ%T:Eg .(zp4_4A'yN9^9t+k^/<2m/'QPxQS"]!$u:|b$VR ["a9-]bM@3P"^wJr!pls.##(}Ubsdӻ~3rų46r\i6EWtMTl:߃ȶH+~)^_9cG{q EAi8Q-#>nBSw]M Xn Z}^{m{8+`;/{`V^`D\ Dm3d& !=/D +os]LA,Zb!-B){'N@']@RGhtaʦ rVYH ܍H*e9pq :_@0!W|wg\/Ej(vӔYOB8^0v'Iw/Q_eu˹HӦʋg_Fxw@/~.dUhZbBoZ^U.YnJ* ‰I[J,{-`aEt#TzX',Nְmf/t$I#)Φ2 9MPU?I_ɚ}xMtF$VExP,gp-\cGM/rֿ r.F?O"*kb`3&[݉G&'詆BrD9߿0:[+ Cm-yJCCi$/Tt_r%~F&c}r!%ۿx]TM&^^SNb"*dr΄) 4YIW̲%+3L8p| H"L׭Vfd?̇0.s6%' n_~_r$B[~;Lyuh208M.Y?/7+RkK$.- @BZZH"9vQ')Y^Ӌ?@DGvLQ#VRT<$9n 1S_׺=뫨{A'C8ۤ &uZlȭK~n|(-,G=T, A (:U| jڞ\ƩBꯆ w6~~HcyQ Xt<ҙŻˈdtQZPf7=X]UwO)lr"<PtbV/ X>YFSg }zkӊ,bjjT8x9OI$ٍKY*GYڏTսg&ŪjsaUqFz=l,}O-JW-o9 6aw.|{[w'9&խ27~ۋ TYQL`O~e)Uz=tM2\ͬrLu;kO>A4X4 ?#mk|:J2/Jn qn(DN4v$mm)n]N)2ȟ:9˖}[:65'}$! pTb[B\D SNGԏG\(TK:e.8&jwFFb*?5%:>6u$.A9?(&;Q>6b`H7}*.Gx->R),xu7HV!!^ b+gg<^8{:ׅZnHt<`OizZSû4p( ~"+ZGKZmW݆y$(I qZbp)Kp:_rb$ K'9r ?s Ed[H WwXI&ogy(-o[ju|]*Y#]׿ǰź/l7~8MZ⭂}'*]N n!E"*)-:/uR\oW@c0_j "뭈 5mm 47~jbl$L^MpUqcTVΓd!YTn}߂gIs%ţbԹ O7L@ȭp|b\`K6Q7]8N_Op}maMկ3EXC9|48)4W-M""3ud^-BU9`?*s;?v)/OF5 %J͒ WݎkE\$To|sWvJh;q͖%y{wJ=|,&Bi<@QUd?StR>NWuT^q۹Q7 1gB~+^uԺ~.˻|Aj`&`Fw"~Gq LO*_e Zʥ5t r"Cg\b/8jCsc !QTWuﭴ'{C:U.n'J֢r}ݠ:7!DbN}|lUAS7RT9`,VTѾ7q﵈U 棤X3CPR>h=\2OH٩B, ٺh?jt8ݔB/}+|VEI3?cߨ%Ls#sХbIG`֌3j- -W?Jr0:+ dfY8]!GBȘ4b!*OCHy򪗹|!MӌH4p+ٶo*_c]5_THKcꞤ<:Vu1Q~qbaƼO0'j Æ|z*JO ZuZ>?2mU&r>O7@Zt|cԓ暥GtRY9O^}Q>Nۂ?ڨ-J/+hB,wɕƉSPX̨O3#OD|0~s&= 8`/!^\ߺwE)d)?aiWNvL#9fdS{dԁGo* c+Y 7ēY,iMa0tkX6{,:<;eݱo7'{C~8)\YVY&ѿu!4//+ⱋv⇔v9y*5 /:P2D^dxgܾ;'PNbNtqpËh ,t@cm5 crA<:G rY cԻQ5q H >zDkMള4LPų+V䝁Lfb(6ˢ6^VǕAFz+hi(H-ٗ44m* gBa,?Kmdά*Y LWdI Krp ҩ#o9Pcpv414,%'ʆθln`Xs,yqb|T y`87Էi]I&~Qu7㔒/Ch@T4p:XJyf l;:kS+*#mR굧^MDI.3f`nX$,9ZyK(%XI Xd]BbXZFX¦PxYccJEps||:ZΝ =vAH7($Ǫ]S/J^CL½JV.AN>L4_l8|y1f)4. &fN Uo[.+9r)髡$3sr@hʳKLBz~bQn2̕3=2PQJ!l)Ƶ"0?%jg" $ZM =::AZCL,t/(*Yo4I?81AW|Yܟ%HŻφ_gBk[* S05n@̶;ؚ^$^Jx#˄**|[j5' p}WwtxX.VSI'$O C9"o%';!X1):D ULOPtIZ)1wACǚzS2:mͶY_ P:' g%1E$e'Ly4i"wga?zi(X ?IvHl*kDJzg)blW%.& %ed X4 lI6PhnQ|ؙlCX/~WO(z!G89g/t3^H9BI$t6/ʨ=Y>ͩ씔 He% E |Xq`HpM-Qq$ VL7:1!YC8JLPKrc7"x( c\q<d[Á>gL>W@x<.r:3W!=о׫Rۮ4G"0"Qc˶Q$HIJjbPiG:Ydr &ne^"uFEäV,\Oa,ݽtYA 1>9XhQ>Wk'²E37Y\輸anoK`2Ln@ ęC1̻~Օ ͥBLڍڑ~1hn2^I0رmVЛP>0>||*+S)/.ZQvlnBu,Gt odǁi`{) +1%B'i-a>cfEJuhx !ҝlBx!jIw/Mn) ) c1氏33v`Fspw 4 6MB.2>N.;W`F݆FGƝ9O\HڵGgfu&m·DLO@@g$蟳$P`]L`x@!?6/( &ٜBn;D[iVŹ=\~ÙU02 o 9pdhb {a{քdK138Yi-%2Rvy\2':4_x><<+A~ g[4c0y2m掋уKL/:yކ Ne֝|)]@ hi bW4R%/YA| &xNe6tnsGg Mjcoyzdgꘋ[X:oͬ3l|*˩'P /%,kg@Q\lTBM6s6]"O,9<:2iWYX6iXKEA;7cu`Rގ7Xt-yq)<_-*6V ( [Ģ[yF-3& |tҪވz˫&PVOKõ2lt娜*i:6J@\ fjTr F()[*e%_V573!.0t'p~v;הoKyHY r() sT^-JU+q ~ryJ(d:o/ Rdp\=J[9}-3eA?9P\647o'2 R$3)Uʔ 1>8]AooKXK NxeAo}<ͨk=9iZL :~3&)jZΓݾ1w>@1oK%́ZXo _ ttc-=3CyeF@= BNrΣsMk|"S7NU%4$$#(:{zXlK7d=yirx98@ )aoJGՖde3MD'da-tĪc9 z2:Lߘkm Emz.>U(Ař-|GdXV MqЅ-93-e¢i^)^_nO],K v&t/ABcqy@:{ۜMEŴƘf}",,(}<֖EIpf"]?i3@,𥳐ɘe1Q52I ))0aH}!pv:$*BhǸD)34 (kA,u{ xm.VZ aK$[E\bޢyHG-/J[3l ]v..G$Ȯk- wmh~݈S}uZF"|2o^@$EŤvgt"Υ0>(u%)/þ^0!2LjKJJ8ZrHm ۻZ41$0 'db` +Kn1つ1;uSMqilxJRdK6]nT4R7tn2@,$ |wJ*LJ>1rKڎ2AUΦIh'jn?)AޓV8"ײ@[ ݂.KR$=fQ muHfM̘^siw,-@${T#6=ʑ:mi9;(]@sDy) aNLno;met:~ YP>juE ~_0ݭy;}$^i\aXH {6ۇ1Xz*-G/LD`#,kEy֯!MqbSؐy6`i',3s|A׫UcSĊ͵m\j:E)+JfetVKho<>L-%#6/q.#6V-D #mN`c.H%Gh;; mK8(b7G7, r뺺U )E6"1LTTb1DLW lvc7}sŮ߸|k{O@tNX^ Da]C f6kj3YS{|56E. h"3p!4F~wLو{gWN6!< q~`tyf^8ߎ?oi&[{ĕ <hbf{,H]QrC[<`n &*sGb"|h0լ8/Mm$n4z^)3QC3v3Wo8A#mGg.Sq;)72m֣yXދj{P@H_7N'E TfS w>`<9ʆwGh3-谆:dĆ XT1LDxXG!vb""<l=0W#N'&2$ ULGԝx NhNN1\HsB_M%hGMM a}L\*D;:ZøPw0|Oc pC&-mQ}o~޶j0Vǥy/[GUTxx;ld-liHiR.t?"7ٶ6?U[mLzS6\!N:'c ?zmG7 =_MN" ~T=C!0bqARY`:MVa\t}KG DF}= #V-i]?b x8@a}J%;7Q$&(]> D:Dm͍ԩRY󊇟|Pj.T>-A|J !YĒ6]D?i'/ Hǀ qXxeL[G4#%sy` me|9+Z\l& 9YbwFC#Qx^oJS}ݟO4= HRㆢ8+Nu "b:vi/D"c/C%>;ix߀486!ɇօ&i[Vzs`E?m{$SSW0ZQAO?%|Â1R75yÓyO#FʧЪ O]?sڡN"Ei8EMO,X8?Nx~㐷!5$77] 88W+!\ZOzRTw3ᲆV #?Μ)7UJگ*L~Oޗ@\3VETXm?7Ec?̷In;:)cr4.#~sΟ N)/T#D~*jABg;ԣ7=$#:;3Ee@J_Q02Pr->Gt^ OKȖ?(OT&7%CSddÊuq-ȿ#SqLuh<\ՑM*n?N-6Kl+ֿe['|-zm+~$DC7G)%Y4Pi28Ahw>@gvX6V I:nm?G?BpD9I` i GUy~0uzw{,I_bZ B*0~J~Ɩ]#STjaRS;s׻ywc1Uj FmGKn8̥$-[懖:3R7.-~I_1p'O'*R?u8^S=(_2Q|r>B利ߛ:6[Si~u3~\3998Ae1Q$y1qZOll;$~~ iV>$|Y5}c5nrcl+'VjisOhx$gU=?WtuŷP})ȹuj_""儥]3zB>bbPVM_U[nQr)9e:;@1NqqWWsu-kO+ΑR~)S!~U c>OO ggUO*onb#RC,gJd~S*Όok-oJ岭A~l΅} t:h, ڪ/Wy>];}NwMa$TPCzb{ l={hƞhG\B +3W'?y\^`>;/}'Ƭ;iEtr93# DKNY7sI~Y?\;-j$#ڛEX RaMmMKз Ā㤤Zd_R/WY)'7~=8Q8^&7 n N. |g&5 h,ΚaI7taO/aD^^ᑦ eW((IKcYn7*f6&b(#s9jpEr昂 /A;W\ *3_fh]ļ;9rt`|qM{9U X3ZuU1Ѣ!5 Z@,o,]QL^8P`&q,L|X7ͳ"/ߊF5 U'`Oyc%m/Nz=p!*x]cn*`V-7ezݜ)?e&#ae׀? e!o9AdD9ʆnB{v\'#wH4kvͼpmh<aM@[s~6O#|i@CD%dy]Q1Tl53V%ѻ8Ym0WkXxm3_}cj]̾[Ek^`:>8%k(O8 /ɪLT X<["xA:[ROZisS҂NqEd)tH*/VkNq$cV/clP::HϤ^^s#`H>`&;ׯrQHeRkzeJ92)g OgajnVs`RNS g"u%,0Ris/4+5ȝ$}C#Swz+k3 k&/OBg-jBE3d9Hg7"ȿA _5Ux9c+M_pӭ_.L(*Vi\fJ3+;PFnħ=&\% jtƒQ2?cP&О0CLvsK%,AVEZ> T\L4 Ϙ3rDښ\q\!֪O+ywT^COߝajJ]W6 &YmBV\5@ɷ^tTL +p1 7fZOda7V8N8R$fYJ`f @:`jGz)sƛJ>"(YaY+}&zԿ7Su`䥎͘5M3foK6Sq':mO 28V w-d(6OBlGá#3}3Q-A%5uBWLD De!ߡH-IâfT2$ZB  pd^2_r~]VNt&\'jgl O\v'$.G#D fA+de\"xa#鰘---!|W|CYK6m+h#ԩ э.B"jh%_Ut+3:tEin8sy2EFsI}u%> - vO.?H} LtԔ3J!}ÀD:]"79#v0,]~Ɇ@1T ~d},Ycu-RnG_l+?~Gh |^y8 @k+yC&j7(uS 9AF#k*<*4L[p|Z7v DK'څDd 7Zl%CRz\?,h:ύLzuWn3W}5HiV*3W#\(4Yz8,w8 n+]f0u+ϸU(F_fA(0G^=X@su}2ރ̢nΧbܚB[1L1-J3i0$ @|0^nf F.;FzR79 i i tXij96no r fsґ&33&0hWXA65,2TCCK:&Sm.LZRob鯙_7B=foJ)p \d?<//'+w qޱưjXs.`Y,`fS27[uZ~Y3U2) gxiϡt3 VW9c.nNХ%@T㒇)gӯ3{t^9 AtԄC =6//ݒ _P[k~@9% 'Yߔ &iX㬽@F`T5ߴ:`\zSp,.7-g6zM]nBf箫b2O0W2_fo~g&hAsNr@iN6=Pwy<# %}Pjk)'PMpqM#Nnbb#P*EkC>9:Բ~_qF|@ ȜCf"{\Z܍Vr,,0K}gɅp!Fv,flە4-.+]>A]M zthֳ*T.H mJ՞n\3Rs$ iC&!\v @|/F4A mI@d/ H=Y3T8#-IW&R2<3l sJ%OƓ(cI,O@6' ]a$dWo*礀+G׺u$ QfAj&&D-5>.leyPCf š'c*D/Pɐstɠ7@pdOHxOy .\]|3| Fc]a#väHGW@^q&%(72ЍCEqRnc9ihj}k{zvf[)lG|^C_?&`? H9 p+f|Qu= n< VW8V̢?;T(WJ)x'0?3հE- v 2D⍣y|Ӎ4L}d R^9nn]ҏJg7c1ڽ^v0uk@}q@-)@4txb[z65 up=OnShMihԺÂ)sZW]u;QNOUH7퇥 ;1>D)Ȋl1 H>lQVw,R2PbdB䅂THRU'Fք_.sS 'f04gnTU}e~рzHd{~D,'^a.Xzna+wP&-j?~'2vO3Ld~˴gQS\]v1@P훜:?DeX!w4LB3vDTzʝˎH3?oe#OKz;N7CEN[jcYp;sg# >7H9W[{ w4@ŋB9Wm~Jу[:ğ?}{*WDthyNL z3W[>d7E6|8zk錺xUô]tXo:ȁ: +SujӅ+N31"2+2MlŇ\"eGLٜޱ[ߖT~EmHZ<#!D)#b !+= 1[쿿on7%O,kKx'O!trhh}*|>ԓT Q?!ZW?)5GlH$!`7["g|,#(m~k7 5q\WTytUT'^X{;?|٠Aޯ BX|vp>Xon֑6z-X 屟J i##T$9[xi=l1lU:JF \g͟_ql1H3zkrҚa)*?4}r|Gx~<>; }f'㲥Z<3D:"dD mjZ$/ZƬdk"hɔZ?bifQnO!J2yl=&7{1?'0{`j-ofBfs㷪wؾAcJqѽOkoLF轧{V ~= QcUy먲~?D:K$ueҺfO~5>޸-ӆfIGV䧇?o{#rAW^u_CŧO1 7oуOM嬐{|URg_ﮠ`~D(p$Mze{9R>n &%]%`;`ٛB="N` X,>ƴéucdO5zB]6lCAf006=ۗVٰpن2ex*i HdgˍT.LyyW$ feWJmc7WN`Cq{ ob%o /vP ~ehAfU b4adN(MhbH mcW4¼i*17-˕?_bS){1g 9 / [h`uee;-ǐ]˶xcL*O_,\(F?f(N4oM-00sRnj:20xo I ;+cD}şvw3)(.k6aì&W7< 4FQyd闝a1 ;>*VixZP2wv64ZV&Mmkʢ^fT6 a>Pz@&`j %'+1Gy`^JsY8) MKg =f3`2íUPw74#b;T}Ɖa5Ϝ WNXEhady(O>78r{cy'Lu[o>\^eZ.Z? Piir͚T. <2]KmH4*ٓQYMxʺ#x7vƧs`!,@ EI &BgG;7Ycȷ@!8fs!8)Q`RAwN*!Ks 6]hjtKZ$$mݨZm`I Vb#;_Θ ݋!m;p{ 0?2<͇pq%-_zTKHvv߈15N=g"Ҩ t$iօ Я-A—]VI_JB?Z-#Tsn"+z.pU eo2:h UN Kn=XK|` pu0 بfO态~GLl63BkDݚm ㇾkۛRlAC]fQmh] lSܫʟZG蓠Vh0ږf3(p).3shj@~&u5R""k+Owџ˼Qn}9-0a5\zY2CDY6"7R'F ,QSb"zD1[LJ`GhZ877/@SLb IF] X BPE<3Oh-R00S2c= KD ^2&1XZ{ыe%o Ho(Bt"^ȁ ;o#2.Da mˌ6#N4s̖" @;C2VANjO)DeQǬ6Q{x*N/"'Z~e}اp#lժ@g cF8Oi=@|X%/u0fcP#̸j¢bݾzR""%YyJ^,EѢRګKI <ӹ67ry<1dY@6i|> ',W=")kQX^L=Gl@c_̩Tڕ+"?xWWCKLIB>A`1(tj9USFyxJm+H1UTYHSn̶/5x#T@ ZA`m 18a!l7bi|wЕԺȻl Y1f]{$^pS^${ERM+T"R^[9ZM@B|-8Rh9пs1iDR|2rrGn1J--[RJN>"azc= X\"u+gYq[`y"x DYB^-e]ٲ a >3K K_302k8/E(6H Ò 8.i[‹IVIIW-m+O"8dyE5ۡ(s $֢BQ ףb-BNd%)"Igډ6B3UEddOuOсYܑzzf/Cwđ<ЀFL:)Q3 -k 6plZQ1=#,.t/ {|&W,!<hמϣɨvs +'F,W,+ᛦϸ ax;;?BCHsk씪6cՠ%7LGa~!`pV|k\cf;[GM0d>{ó}o,>/x` r->K{ @6c}?׳-~{!NZLKB5J/ &J`pƛC̖̍=NC Ut{:nh]Nt e?>cLݱ qީp<۰1s^w Ѕ|&1[LˡsIHg!FLV'x;Jeu""lW3tZX̾ 8>JyY{_<{8ܳf\ykw, ܆IqSkk3͔(*߶5i^T (+c5m}=qJo4Y+ڹ&et÷Wd(\7{SCv"Ln5OR f]`pYVzzHN"(ǤnH׹f=8.:%=czmޠy;ݕ+N|'am E.kRN SU]7Yy#zR3gZ~xRQ-p_l+fz콽rÉkv_G>pxa%\%d&VePظ{ڥV9 P<03π æ/Ɂ@]FAT7fUDY;C9P&d/zwa}p3~]xЛE$|^#X8'EN{O`@wr(?<ӥB8`3i4oJpw p`&q%.TB2[SNp֥{5ak9kBfPfu]-`Lp,i#, %6T"0Bӝi1V[ 2'ױ}])8yIv~q&)Vȇf\TJ{6 2Γuf]Sg3̀"V%F5 nG:єN K+-- A˻cj鑹%׏( 1[^ik& Ł_g}Ce<o BBt셶gMФ>zRNa K&C0$"smudd4`'KlM>DqrdLatKFT,`@PN @zЍm00vp;s*8`D7zNs> 63fRlP.hƽs?452(qA,+w<<17t`%5(IiUԖgzaAk,)k]TJ8]m)ͰΫ@RaTobA`/x13oސ75pW]uUT=3;Vb)MfRk_[WEfOPR9 ,-2 zB ކ"KǓDPO35Df]D&Rx=fYHe~g-׽uP iWe?2B#/ ׈6z?9Y b-a̓TTxRktCv0jT$+i"AA). &IfqU4bo9|fjvXMʚ䢷{9z "9p:2ӑaa& XJwͽ$ 6tsy$s$֧.,,ʙtAϏ+HgY7|>|9X$ RviIxFp]J0~ּS#h%45ԉiŬŚ FйwWف'fذwK3lA-)0 K7K_8appS3li꿴踿iO{MisS:5 olyBᆕ0bm.-=*2y[PaeOR}m, z~OxPUՐ ;_t4΍2ђ -IjsP7^~ḡAeoUmN" ZT;琺]s'&t1&=Q#N89<xduKtҷ6 [cn 0mQ|({';V]7;=&_I+kG坸οbV!u!xpv6` X{[4VySPRu$گ1/ z?',hiC?^xl|8 Z >}U@!^{ɽ&D|%? M;+Xd[UI5jEFv;TY,vʰ/4h r#dUq6lqU|Oj-4^xi~WԖS5ݚgN!N*}SWHTʮæ\8۫@b0۫%0:ˏnM}RF𥌫w]#ߊ8"jaz>]&&C[* H} x_/_ݪWU:ro!cٸd\5SoϥךV^!~y75Չ0Pyφ@]+z]4=>UU")rL|If7w^'n^wA#I׾g@E뤰 fdd^NfW.8;ݢ ź\'h!w!jIVV=)(NXbL- d;z׺F#`|Z;G'|ihqMτS+~M(xZEȣIwWg00-~ "m΅BVՉdsDByKhCQS)'i&-ҵ}K&>9/JMT|Dݽ.woR-FLZmҬԉz.$k2%ۧ]h`;w,$GaTx6zdٸh.6J8H1qYR-iV$^C\;R_I`h.n̿j?3Dh7U`2D29 d?%y2>mQ;\KD;{0])1z?4zMVLV #UAgAjSPR 7@MvEQFIQm3(TEgxD9C]D9Dz oJ!O,b{䳎64zr[i NM+,8rwq.Ւ ^@#PGb0:ui QΝ!((^NpFJ=%x<_<VK'Қ"-y **;K~x`j!a@*i޿4ڼ+Y -M7mM{NoJ$78V)q9"zr!u6kW]dVmGS=wi!i'@ ;u;R^oO tS kWzVJ4NBJBAm(Jx`v)aZU@E%SuPYM0QǦI[6uq ⤫#KJtÿ;3^Ev<})e%{S/Z+QIy,UnUR)]eX#M={>Vx`!0?xz9X:O}kVWuX}7+Vgys~ۧ_páOr Iq)( m,}ʵVy$SzfOY` ρYeM >tjXc Fe" bh-27G%pJpp'D@:D^ eF1`*Ӕة:`6i<)#M{cL#7"w XN\"l!͕|IE|gT1J(ܛI1Sɺ%KVv1n@#%#Q G?NEd>MwE`q6ŚK0X-obb%8,i,%& yB ǧuӻca2]l-,wRT;imib .ORݜט <{lm:gw.]rQߘ[qXƜ宫*5rDIr7/nNkV_R"$J9TO/F\ f$ϥzGVNpoNC>xJ,Z! U9ʵGā MLi?B^u&k)P39y s}CFY.F+qAI˦D菷|;ieu—ff(Ol&žFFw4~tPG@jYM={f7G 3 se\0<=ѡ t9YzD0{ N'vRY*9f>jk[55. : 1YӆRP?L3Ny'!k-=BžÍX/w3?t[n/2<8on(}},w"5A ˰Nwvcޖlj6ʬb=b,&BFBJR+ɵO?j7a.^aJ5G0_A\^M":/ +F}ћޚ CHoэ-/GD1be%"%Io!G]HGqMi ~pGL꒮<ɈRej:?$%Zi5/+R vjߒ)ѻ^>{?I$XY˜ԪXmt޻{-ӭcQI|-Kd5v&NF>=ܧgcճnۧN'7rsٺ !wl݃OKgU%kFWB]CK=bRU@kM"%F>Y`N .V#%#hM6S9cٌ CfcKmwJsGU;p'$=$eNB'h)&H3 ܢ .6QRŹJӶV0X]+LR@q)`vocvf7qK~w{ ";%X#I/-~O⑴2o0)l[$|:~: Ux}}Am>{:Qx@"C?X%[2D6׺?m:5D42-Ț>ekWp_K(Q_m1m*J.r疎ut:erI9ƈ=tA"wH8TJnʊX$U_]"FB1|K/`+&0EֲG{S뵛LҨ?zjIw׆ ;;ĤԖH[4/>_FB6oU([9z%:/F}w <ġRl'C{z=]IU ՖH2Mv76voזJiͬ$\=?TPg ;r>,Cd gV7+zR4xd9TegKظ~s\B^8sr ("|FeeCF赼iq v9Y]CF_/MSt8wrSYG|紿?D[f2kg yX'bK!iS9ubyj*Ăi,FLhVZ)fPclu$b|}tTѺȩ)ٷ`ÊUfPQ~XU3q:Qdt+( a]tT!Jgգm5\a# Ē(YI#p]wm' ̢.GYiߥRΗK#:I—%y_/O~7/SVG_+yM"uYH׸Ҹ4PZ,۷ˋ<?AM]%OY.,G %9q1v/Z8=/*&j I~Do(2?|hWxnu>ɨ{q}WT0r4r] RglO5KffKHXk߰Iw T.-o^fop&/ߛ ܷH;ӊytù:䴒$٧my/j@& ghapu.>깍K8S/*,+=rRmE$ĦP'qCM!,k@@ER n?CDnW,S Ym`TuJ  aNco;T&xY ]Bӥ}JҞ[L/rz NCf" fOq {; ){F剚Z(G8vK̼[HsJnvz5/;hn E;rkpaem9r"N`, ^2)9K :q,PR[ZgJHS}Xb7?Ch*X;c'ބEQj>؁+ARwT{(SܙrS)jHG8(3H Q{~nU Pi:AM:퍩2xR&vE׍JPԸHQBt8I*Mĺ 8HHyka`E\;gG}5ӷ/_h)B_ tMXBPķj0W 7v/OQ7 oOc+N~4c8irW9͏TY>>ߐx#D+Hw t$k>'J] 7^RkT@m:<5<(_CnmT[skSh{953 ="’~CpjCe8L_ux^n9%pC:g}h^ "? ^ί{`_ɣ^s-LPtL+Aڈ{5?:UH-ɨVMp ߨ:v[d"A!eд<QĿ(Qtgd5uqqDdADgTymP0ң"-ͱm6,Z4]Lbh5&n>ZCٮUGQv\(&Cztm{)I!ؐ%r1D!=I0:f5с|v.mw9r.:zFܦ=l`<㌇#p~_y G#{'ޡwZ: "lvoh쭨\yBBQ7qݹbAO/ 6sˢ@w[/n)(EofrwTnw,-Cb@-/2*97ݩddt, V9qso`;p0p6u+YғXVΑ6 %ᶱRWѡ .*nIˬb黐D9@S'0䤦T Ά~(\SL^$eTe6X8x,' mv (=y/>6%:r}v1#WojJzc rBD?gWZkP'^(,cTB>~q7# _\ ȧjBm"a)xRO!g&ѹ%DOu<v3(BK |YXXl_L %uAQ/ym-)gV2JO\N&tv|ҎU$ԁu:VH`:3=g(6VWO? Uos Q2~C"7c"c0}s>L@,Je,g<ɗ{>JOxXS܀ E(!G-[QvA֨< rQ-IgmЅ.e/ꔤFEfT4Q e+.|HP G62-MeQO.Z31K kؘ?;. b&aR;*TVP+voWRY_Ķ,PsAKV07h= F2q_I=$[`I_uo aROQTn4N鎋3xf?EI(u0qs,,eTW'N0ay¦{Wbz,l#ht(spEiB2߫<^cf,N9C}"K5ڤ0ŋϋĘQ]67}S*Pj-%*F}h["2W3 ʢ0'Du^-=X?\M[ Dӟ6\ǾM:q+cc|U" ]=9rfR@pG(ѸQ d 1%upA~&އ.u:H iL&*tŵ< }=鿂A.NZȃx0!|8(AV,x5K2:8J{bG*-Z9eHepWo(\[ dv4( F`MyX17'nN[3 x?y>XVE`ac4THqCO(-oD)sPNϛQo4Te5aZJr|Ğ2gO۬G3sP4xw#g ͙ƙOfse3^䒂{5!{X>dY&c)U/kip wlkt<1>;ãvQtԜa?̙A2>Cybcg5&YXH3@Ǻвa ak[nCa:$j-L8(G;#%_/V@V}-:_瓐P8l%O[ę›t~~gÎjTʲZ@5-/rCwQ7 ;s_pBReyFM(rQ46bFaGVz dܫQi~( Ѱۅ5{,ͧz`۹a Twm59qZZV85Q} `:7}0x]x P~qhD|%1 > 2#sY)r?.w *9Vĩ=&`A9Z>mbNjE=:hl~EF)譆J]I9цCw 6}5~HNj{dsnV7eG>X~ȊKC!( >jY|B)w@'ػmpV@1ahi:!JaF,zln@2ۉLU{q#ݩ܇<dۺ%;?+ȇO:ˌaܢ7yEN8sc>D}|e& ?j %Ҙ2XaFm8Iets< +Z^%tyqf (v]4}˃- +kf 5|U0` 4 da6 6z)>ès\= yͽeg4cqap4m-f('ɖ-Yh{Nu_!e1o&'%9m!@}~ 7L0a"⮞2Qy;.ǒhEQ/F\d|%1,4)v($Wpeya==Doh􁐀\W& HzӿS>QF78gT %Ꝏ<^8ީCF<]IV=qNu(Υp5Fq/{v,-ǫ!X$u[BT/Ԯ^& @vYCIUZ6x lv64j=%$&E@L0Dx?(bF 2^'uNy>ਧ]ߏU c`kJS̗}:PYb@1[+2w3i,|h?* ?`b?/̗9jďGrlϚzόjpi%tjnu_ ,骒T)xHBq "eOA.Cƣ9[;ZМ)kzW"͔*ۣ{FTe8T4!;C;R$]tFRRRpȷ,.g݈X3ܩ@=ˉ!US.^{R gty?j0 $&3gnh9#J[- _ )mβ3x.'MC{^94u#fSQG50i+6)(UKQh@$:!:Dl@)Y#7!۲+;N@yN껛T[[P =У9lD՛DWEY==Vlƣ Аah4ӃX Q"ng1nSL"-f[7ϼOISaIO'w%FT;g0:`ټ|"WKwFgsVrftbr1 fp6@k@se۔f-6eS),ó)\%.fr]ڝx7z{7z//GK婆rl֟5(nȡ:,S{Єs7;Ÿ@_R32Ӟm`> ( M%ٷ~B< `Z|3cYRQʗ,-oj $|A,ڋ9?M=Qg{Ug(#A$ƍhn_iԙv\τa%x)jj,F5;Llu*Ѡ1]>猂vG^}VRF΢\h@:N@bֱc x%n O[oJ֤9}l~f+O5\B&4[zHPS;K{_L:sJSg=P|dAz) OZ3qf$1ϊnptL=u/q;֌:q4 ''8nRPHMCjFFÑr( HVFەd끢}/!筤 iOxMaJFDD p.4 1|o}wQ@"/NO] B~lW\orca dp I9/tfsliꇁV¥1t x*N;*] y4a 34,_{@s謉L=e~g̥S#Do՟}Ő0 )O@W/d*ۂ߼x"R=䦧͈= G1u5"ߘMEOy<߸o nח=[<ѷ9MvPDӏˡߊ>2S^+nk(W a> TND[v[~@~;{XgM>& ML%!¦C 1dIy‰!O#Nɹ6ОN4y[[‰jѸ3cbN^Vޘ9@GJzKC,uc噅Vr g+_x׿t4,#hyez7:0T;83}@f}pETKUNb\GhʭD+=V\YЈc$;AVgc@rh_1r;J)^uӜ%ԓoROn vaq>7=K*//-_Nr@G~kR*08Ƚ3kU1TdUg[ ӽ6z'cpNWfJİ5&z(}#›zuQs:6ݢmU/QuO_zV9!qP:~o̯B!_dc;dce7™~ēLԔW[ ] ?z7q5NS"V}]Ji&F_Pi ԗo:t25@:WN...YO'9=)7haҞ*0sRK J+~ JVÙq+Ao=}J v;tx _ ~!xS}UY_On|3ZzILj $W ":NZ=AX/ λa xB!V2`5|Hx7Ƀ*L\|d5OoUS ~Q˳P V 6m%^D.tqW-AX]mUHD@gVMR$? S{um)h]p~8sq #! _B0jd?@2p͞fĶe|8|f>pIBRYdzG4>ŢM9\U7kZYR/c"A:|Az~u2 9*gסmMO.u>M`-c,y c`ɱu쥣\n X Ka[pZ1~O,B!o`.FS[}Uܞhj{`6P&uX,']ԅ\jVA@a- L\rw>%E|IrM7uJ pῲ2:b;9RYG((-F훎j Dtde_Kqa$/.AF34g,m ?#ɥ`\p_g&_`uV=ԦgߋI kL@}YYK]W>*b;\Fp-)b-_0"Wu;wIӆVxqVvpo |['-FoM#.b9˒ Ԗ`.H F3{#pH(&7ZG@M r9SN"fHً J(6ȑX:U(4Ff\"Khi0@}JaI/vv li/)J&$qMv_c[ğnx\Ԑ>1 j: >! vtsHPkc^z %,\6 ~U Os ݆1!bgei1"ޠc%,ڵ ͧTSQāmEwRkгXRk#C誸ȸCZŧ4G7H8. @7V9daI0X?o]LE,ZpR}ioo$٪eU)sih H]bšb W=@-w@`J#IUkk11J&H_ZtIA<+RE#ߣ)ԉ]eHqx@{&YALf, i> =i NIͧAtKS ,3lܒcY4Q0t&zE]F -uAK:AaJbnZ ;\` >z d&, Q@/gDIřn~I,W]Nc 1>XUT[;n϶2| ]}J]QOIU2XXk(q엜]gE@v @{\ #k!@ۍyw={?|?-G`L`ב8_vX 46+0yX&0P g&DZ_3XB"Bq%Qf\l4T6llWgfy$VA4||"Yf"ʒKO W"%):j}:  "*qd]h~|w@e'd֕2@RϞH, hU A- NL:%e=N}%oD мK%{)!'tYE6Yq]iP1AͩJ3&ġU'vP;݅L 𔇀,ѵl}9;M$9uxٲb*~c\/A<8r\[);(v}~a[-_BGޘkC!2T+v4@<4l ,т)GrkT "CadLsD,6uCXC]x`Eyy't5Xv.kU^i XBo y*~WR2toFi/6LU09!,_n%P2pu22Zxtۀh0j58H-SnDWzߒf WQT:KS#m10mA_,A5Ri kTЪ,cDŤ},֭k3sdQD-WkxACnGRf^~.ͷL^7|\Wq3jZ dd´v&UX'Ȣh.&,X 4:(XކeI8&\ -H4g@U>3.z@~΃Zz`w1 = Z,fwh.Wvg)zK%(Lo%#TN gl\ncK_mCx5[)Kn Ivg1% HoQ3wRS.g]2[{7@K{:A#99]缺voW'wwRa{B|;1N][Qg ܗvZi *-N.@趆7uM 'M*^($Kwm3)r7K~5xœtGLDiq+G;Wx95T,& 7 ࡼ̍ 2yϦ?.poF.V,WT%^0HbwΤ8(m0!JXk8mE>Έߢ ھ!6W(JOAtlvtV܇1hGj nXxC@Q%T'9A.Mzn#`"ՐIBNJ.y#4Ϟ!e”T4o N-dhq2utfϕvɡ'v/ ;&8zz"[KB.# pix~x1F @M27ָ{dMyt {\ہ (>/BջT;izM9aaN;wNNVfe8dV[ Bib@v̊=~-zFu*HR m_t%QezaU+i%}H܇ҝ㠨F ˾Cןmzt1Xj9D)vûx9%w;xC=5iRxZpL3omST=gLY`?B>nu0ﺥ6 Op^M\@BNR8lU=s'r-F"~ST3fA =Ǭ?LviF_y%i3a|^~ [B[W>NR5nMpiK&o_ 9oYpOwȞ@Or4Rsze>i(F"RUjl ~SP|U(}ʷ/t2GzFowݑtɶ\ !ΧٛbsA!5qh٘zqqK *eXDR~qvSuxhbF}İNG_?pQ*9F GzJnO'dMgqK9}9]2$}YT=q"vE9("$s,O5-𮒒KWjup9pd}4W F(Yq r8:,_^  \t6u~t?:rxR? 3-[!& 9_MROrFx \xsTs6"ٵf7qOREj&^PIX8C+;='o# )eT Oyg@LٲtFZk} yp\,gnyq=B'L%z<13KXh))%ӃKA]? `sC:R¢!lqP52-I2H5t\tcj89͎!;5Ӄx7G<`Ḣ~L HRx+/h;>Fg"Ne$9xݕobn\kb%G'sL0+d987oOvx}VV˽^uzPT;}gyv.3 @g~@_aZMCK-xf<}8@5F u5` Xߖh ۼz>&>z 켥p6hck4i u+]kLjMV $du0ĉz $L32Ӳ\3~=ڿ,ջ ' {֊ HӾ\_ xwr*u]|>zd  r)EǬS:0mA5=S @NР/i4+~1ݮ{B5LT#Cݩi>\>xϒdA_ə>%,\ZhLo_]]o*G}Yi#@1C:6:g}9qC?Yxddk0_A'5ExYC'*`Ok|4|NmnXsn}Ƕ;v!ش#U=.۷rfXcwߵw%=V/d5'kL彜ӜK+9xVD\,4n7ᰰYnHsΑV0d4'l!ϊq>~][rj| ?rKKJ7&3W)%үH& ɪFeo*QU3dLpʺXiRqrfU-]؉IQ| S Tm=Z,P-;VT$[@4(~zk=Cǧ}VH.Zuur~-D.T-|5fZ;p3؜,'{aؤj3lΪ_ז8_/eH2tOrHHT Fw/ ;L!DfiHWW[:FhqV6 ,D] ]&%Yt} -rک%me)ܭ?{QdZH JJ$I;bbBQ+[Ph+yZTw#bqJVC4>m[%Tb.U3\, Xvk~ K!81%|f8%XtuSDSa"7+`Pެ5yi-L /KAL`)ld'$påy8w97%$ 6ʵȐiէ⬸A᧣K6M~cv`^y< ig}#S'%Nǰ~.#iY$N-gš^`bi *?cW %. q/cfØTfb|tKM\+RU[Bɵ dK T ҿ ͧY46|t0|zo ٯ p=Mz/*Z{):V)sUr+Ouu#/G mİ;Yf1Θ g_$`8,,Qt!",vEFz}EUFgx!d в|trNFQԑAz -ʾK)%EsD=ߺ"kvCMϏAy5ΐïiW v7DXm79cz>h;Lm{JU_GHGנ&MM3dw#3G H #Z'x<b늛÷0i&P;ݻ̹XYx07m(XpIeeQ^H j.hML".Cr)NY_i-ѯJ&]vK$I> _dk&&MZªLKv\/id.@ᅡu3"km5[v}8sBl mqԋ yổuL8aDKǭiVQYX6&tGG^c+ v[(^j\ޭ6|UDEo.b,uX`Ցv=adl]l*b)f, "D8wTW~J6e|r*xԟ`ԯ *һ O L{b%,٪^i]lrtzdP@}, 7FXy 3D=64u,P)*Zx| M/:ߎO⭵,IUagn3,Vե;zNI\ ʩ>4.݂:j<}GS.Nμfv72!: ΑǾA7st. wgCլa<('.V_z1ڌX/z(99pU`P|O99w>9śD#0j]sdF\<\LkØ feޱdBLSrɦ!žF :kq,!9>A=Dss .8^N~4sW;dUjk2IB\uvv;;u矠*H!~(*HJ'0 ClF-1,̚V00[% \TR ͈M xy~}P[,(NB @Z *" d;vȲf=IUDb~I \hmk6IwUe@F4̹.3J-5K50]ZgnUQ2Ǯ}c$|~^^7P1=v$?02%cHɆNNOBc"*: ig(G9ml+4oY|ܳTzaC^٭ C{J ZV] 'I3p Ҳ ϑVb08ЮHB#`sWҙ@ ovMWbM!Fd3rzWZͬV_`BD/gN3EoMaI v {>of? /@3fxfT_l Dk 7#% FJV2؉=Iɭ]fb8=ҚRFmR]{gÂ_%Ԧ&>m/+8q#d싯t!)ck}{- e<~S͙Bdtq.M&yȀ(#n3ֻ${ Ήuɻ%+Np*KkKilZw5Gζ 3)Y/s|)QW^6؈OfSrBnNMD||CY|~2hl5: . mq-K9c'Tp/䛾"$u<2gsUKJw i'R^,qoqy đASLLNM#@a ;!tʋZÐ"B b5Ԇ$Υsn7r۶x]eLw*~ٮt'Iߣ?sq(M4G_HFiCeIz=W–ɣ_yJ91}0r^C#Ile݃U_E:%%hyeDK> Qs (JL*+Ѷejk4ϲy` PzBeK`F>LI@J*jff(?gJߊB=Nm|$wBohPJ>c,̌_~TI[ˤv6])~ip:tgIn[E{u8_@;)i(US]D릗iH{* =3͚|ˋD=f}pK*7m9BIS oEγЎ~v6V?hԉ܇ݏoSS/;t/ڙd|t Q)oà{;5o_HR,*nXp\ek4C3ΤFh$zH 0>D1Uo A{(gb'"%U߃CDW\IGojUկ,@?[ܘ0O6 ciOjO5s{R\xZQN1ճ}ow22Vݘ|;">ϣ'䟔}8&hXD VtqhQuMϩq!^پ,Ϗ|Fw?)x;5i2ϣ-8?b OHJHOM:χO8\`d k=1?+L$85zn &S.C0SHlv9!gInNG>؛ +{17/Mf&nBӝԿ{'LT?S7Y_8#:lf__+)p. a U;_TOH[W"|~Տ8 wM:8\G3{\ʼnAD/] -0h%n+tҚƠc$d$]Xõ!S!-dq cS2G&\ؽAzh|KŇ< rN9wj)ɛ_ aӽʻVE `mHA,POU= S)ϒ࢖@.~AvUgw+iu2fEāu`EZ!D@DБ"nCKx*|!"[=AC,ؐ]HT]c]f]gJ>XR 2 9$2РfM7^N|Fbم܄X ;`K(uqeD -ɜ&6^V7_lS{C5FXn[6xCh ߗp=cX.?YUU 5|/ 7~1+ oIJB,**QVa{st*IFB*Wؖ*"RO}SɈn.z`sen c(f Xi: SS^UCd0p&z|=бB(}E2ΆʡpG]XKdE.ϼ%HKnQi.)0 G=׉0 qy؋RshTpITONZ(bGXZuv<SK^\+<]v0 l񸈲׍2@]cZe427Glφ5F)92m gGOZMl,93bZJ. ,d*Q 4{jWɚ@*`dY) |!@UDd,$}``*b,ջ?8}sXPŇx,Θ]\5 X#qGOU5K>6rݵ Z/*:@&T7MoɆ:' c [X/L4IN+%aB2A=x(g4c ?*}<[sӋ T0V+~ EHI*$q}0v}xk@A[V 2O%S`g)!x@4} Zܹ c?g[W,TGW)q-To Ψn"a'sVёfҙ{AwS s?wĆ1c q ),Tl>f۪"Igl/wW? 5U]I$EC^Mr2 JGJ)dm5܋%X2zI89&n1WJc]-Vq44V\-RNvȒr4 *BM=eK6]'ZzFGOLIǷ2VJ12XZZD9:qT)#9dU連L9Zlo">\c-**?6!:7l9R,Yk50Hu6)0IH KDdUd wiXE t~O[Q2ܝgA:Yw1 y,f}W Y 1ֈ9SWA #L9F,]NAj- a}>ȉˎ+IΥbk)qѤ8pgtH2g?2XЕF [-6u`#/|1{uHn,"=,|Jf S=x}gQw9zy3YoRr1!@:sH EsvbKsuKϿt)PZk|vPŠ2$뢌u"`cXIy+/`Hc,q1:p)Z3 dI-"4wCNB$/,A@Ѕ] Y'.Ub97XXW+UjX=sl0}(y~@vc!bźjjd7o @;N.>I#_=]zڝt. e>=srxup8=O _' f>0jv -YGoTlAqAB*XᑏLUZ c^hVYUo5݁~B= κ^̯kWkq%ː5u'Wk|+u%NKo)sHp?6Niʻh*NL:߽/Av\/?8 |*?h.+ uq*g^pIV-+haH>F1og=qShuc+]_+lG֣(.Rz>CXZT2@qƦaU]2cnp. QǪURbiP`Wɓs0- u%1\U$Ǝi(a r_|3qMO-k8y fb[ڱnzP,09Fy(>w_UF0Pe3Hl,$qdgwXU͒px\5FYSĮ])) 6g/s= nзc9)I_rnǺt2F  Mo躸ޫ$m oj-@@IZx>YAe~2K#!t[oLSgbcGq4:٩UUrG.mZb`ӻ7tZ"6F)xOJjQTa97Y>HCa2/tt8zMQ8v] CfIrt:3ԩ97B@veJTJ/ײЫxᨘP t4о̓{ǃm_!$3뭮`H^ r9d\Lan,^.7tkbC[\{K΀2z5vEҳAU+6OWfjw+J)פ/R8VLP^ {RcC? 8YO3NQ8—fΝyqdp.>@㓕ߛ lӠ6 4\2Ӛtur4l&1N5K-Kƚ'%Cػ(JX̧eLSi:fXZWs9 RáhFY5tf=f;Nn9\=(촬i&%QfeP ^[6A  x7&ƭe蹝84D&,,֘D1ڨ6S;e߃4L<ߞCl\ʐseeᎶc Ivˀ*ƠGMY e51,i .4Vp9e F2m{XXf2E4)`6j ؘfH&2ƫ%͕́eza$&\\ت![Ha4+cG-ď3nVWxf=zY6y%gghP_5XU *l?,Ɯpq:=v3B.Nr{31YJT5O5 lBm~5 R ߨmΚa2 4L{F)N ]+ K sS pؖp3W.vS Ta43c$߫$[ab\InYhIjɂ$jH;&+?2,!{1"G1CC(/hˎ٣Ta:ӛL VA;v2UU/ڨ:{S0IZtdeإV-~ҦN35m'5bS4hv2? gQ=+XUMVR3q,elf66: be3g(akd\2>4O+fsxXZ %lRjԽ@BN8o񄌢+ԯo+_< Z`@"" kBWEOdZU-,,}/eucJJe?qOX>0|xpr)1}P[tQI^":&a6T0 E?A_HofhWyF]=f[0 tt1qn]W8h*yCLi+ƥe?%vVAެ`iJ }j?ݘ.ZxR̚.zizz le\t3lv<2tbx6|HT(n1v s$x'#"c⎋Ϗ`!`"Vni |!RHւBa ɍRާA1SmOEog*)]b>5{%ު8ϊSIb7OBKJ?[++FfU?o jAԞɈuAIջg$!ֺUn q:d@q6hhm4Rl^ٜra hAz* oAI R@ !Aiv_:Ih/__ovb Ol9/^>+,-ؔofo\ 1XCЭq BEf<׺K<#3Z~_jV2h+di[6^hA³]:PǪY~2JRV= "23EvYb`Ѧ)kXT^RTߛ]ZTu}u? ˇ}M0~ C bL˪1 F5[urj hpPkGEz%sOTK6UxZmS21W3BkEXvZ|jDӛD E͟rrTC{{(ٙZտbcǀ/d`!Ř[qd5O1A8~+ #䇪◠k?:-42'v7ݶnHܞ 4N@0`z~}z%L}kN^EOY8 >;LU1RN&AF7 ќsIb@9N*H8@V`9&u:xG#6(h. &Ռ1eSI\%^]厓;Q5̽ %sB ?.VXG]ctul/\'4O7XPXȅ$O[w w>`/1XJI G[? 'U[ȽWh^nGI.1ՓeJ,APxn p(%t]v!ya\*/ΓDsrdslZ,!,U{pqX|kRt7"i{lbǮqck,Ųu0F4f@V6"ԋ$iBpRyyp^UnN J@IڕʦC=*Ck׿.taݪwϫ]yqKSfё^bMc>"TFHލ9Ф 䀜 V=ą'lF_Bz(_[``fYC<&HD1rv3?dE |8HBa.+9gBְن.&Z%&XONYRhoQ1[8f&onlPI]̽ϾD { _NEbL%#v8n@2ݡ)47%fh1"4|=vS#9O> W^8|T : ly8Ry!y FmĚh  6c $7gr!a rx -W l#s=uhriGsm\'gl$ɐZdpuX RG"rdPѾ2S12^rз~R_TDUm{M;lPйX{fh R`4IIB"o@(4K󴶲kQ-jiV2pS}VVq5 Jvy5juoi韚 ?t'iFU,,MWӢ8'PQ4621ZGң:.:XV;Z>ow('wu>uDc )덱V 1Nދ\+Kpkh +uk+{Y?cߠG!xoo6TՂc<ԩQ8O?F)?;ɧń5nF}p왻3n 8mc99Ȧ379]̪^p߯w˟f!(YJh cwTS|$-t V~]SD;.&yDU%1mj܇_9gy~..=q76C[^ٽQ1].lAE={NyDmEQ3P\Xƶ\opc=}&*lIDvj>p=("{Q Wοɉ~[G &_<+P<_Vm ĸ. 6Iȗq@oa"_8I($Vw&4m7EY>q|B\mfԡ]|鞒m. 1Nvq-G$i۽nm[m]r·R0& 铦ә[ IQtnk8!^4"p&lJ\߇psi}1nZa%k*QʉzqJn65SckzT?g< 995P u0u(H4AVKwvl*% 5Vis`O%JpDΪȪl.9IqN8g2sJ5Q[)ֻԬ56Eи94*}t~$Et"NTPh2`6Ab|/o+$Rg_pts?zhsiE畝2O 4Յ#dH`?3/I ɊλfP!7U i9u\5 ^iWDcP Lt[K1S?jxʷZlZߓopY1]hvg^ȺT&+3igM4Ά~fW2o^#;(؃ ˹ Fm.F3f*O31YJ;U] r&o<ɭhӚULbi^T65&UרXqf-`.cQ+Ύyz, h:233ha kpH>iN?S:1R' 鴮J.>Ƌ~2V{?|hFgpeX?Y'a*jR.-{вX4jRŀ, -hpY bD,]T~3x<. ?S(70FvH0#o3dNJ.pwM`n_ʔ;^ pvىJq7Bf|0'[P'~Y4䍡!vY,{bܨ3*n2-7@.=׶sŧkyJX>Qphٳ[I:+)vO,,F< Pex@ +xo+no:zZ_Ƿ\8@"]iP(eKEx⼮hB+_083zwvKpO\e'nD& 4V2?AeoAߣѓaѿd%pU4EjlIu0p& iERt5Iq2 eƬ1f>ήnm`YV̪(K!bQr/fw=XSSx;)H3UMV'%2f9M{ "ҦԭQS]~=L2k\j\MԘ'J#Rl*R".o;u֝vm=b9qwUL+D_Di@ĥFNL#mcq:4>fs{9`J(bu6nf[(T ꆛ!FMI$3!1p' }366AI<*&\& 'Wt9<`wX 1P5' :s\ip _-g۹uE I6Pt"G_&1^\FDwoWK ._]>:!}I|MZA 5?q(S.v(~bojإ'SS'Rc1?kLD*8ϓ[|u%B} 4͹.f,ms@d()>0Pm8_!ヽ-  bb44)U#SeVۤ|?? @i21zI>& ip$NuٱE4J5=8@ D.+e慐ǽu(C^X^iNP`v4Kqa"!N)2ԩgjT#fyݻy;£dwb{dНw-h0}>t|H'|ԗ_,z)Xp&vM~+ے)h$@pn~.*on^AI0d6mD7a)^n$y$"X㚮+@ 8O ߉+ϔ2TZ_N*Hzܑ!DI`""Ěv+3Lͺ-nnbޞZP\o4eRhI^F틿RlPrq@!lHNZӪHq+0vS_P60 vdxWǯ_! cWȫ`{Z9:'V ب4>G5δ"[ڐ) Gսky|j&J>C#)&}:?{ZuI$#Kl] p;LHG#NJdHF|u_Tlݖ{LwFCki-}73Ywud; _HwF_j)gD7kB] s\Pty[/3uzԬDԡK}*B~{V*`Q#מKj[2MR&±z,\7dB%%1)݉OH"+a/ފ\TmN;JxT K%~%OT VwIǥ%<%B}OٜB8OWs[ޗ ?T+hE%#֑)uO!Iz[ *dwu>ԡ” 06G>.Ԏn i_]2''ȈN_mI1`\"^~AG)K= ٭:HNED-7GrtcV2!Ll?7ĩrx^ BY*)/ǃsm쮚(WpPˇXF$X m!KZJU>SgI:BObҼZ9ӝy9>< 0U*'I1%)}[bL 9K_0ߊxcbM\kXϽ$([HF:L4xjȍ)/%c"3|c ulM7hrqR NTäI鐘:"fcOƈy`IM?fUx6b4{tdi6G[kfFSoD 2<ͨFDؤ"w%Z+0{(`U Ok©JGDgV-w#C" ?;R2CTpOg}/FQGlZtcBz}nl2L$3Gܺ'n[^9 PNE0#7v}^G9ٔNx7s/X"h1#I GNwg:R [C&ebM"OFQ!NL}%:Omt@$|':ܧ}mR)#//ǼQo꣇GJ=kBp$OfzS=9 Nֿv8ti!hDحGcDֱ"S}5L.iZ^O#>/㢊8H+XgQ=@NuaU?H2DU߅THt"l3,^=)>a3(2]=Q$~]yZ^͡kzaB1$1`H˷ ~A09v\ cEy#<w1 ?nz`BU.Yѣ\!i6?'Df2W2-3`Ӥ'[_]!r0R uҼnI ;u=.l@BP ݁Eˊ2;&W&NmFe1[1 8d iD'i%sB.skp-٠'ػqf6 / E @7/;/ )fl8[ڀɏipt `)e!ZD>KʀOɹ7ƞy5ǔL׵=@\ t@uIxpyqŚ89wiǰ|ym$S=f5LyAViN!&94:Vg̖I^L=5OP{{m8Kk _LD1~欫#{]ux@)~ScgHH~kbqq*?Y_kTi~chU]M6)/:)iwI)Od!i|mlhC; C`оVKmΖ>/͉0do*ى脜b6W#I3L]7mH;n):3\HY>J\J7;2_9 ֔MʹeŹ̺[bG֙aSn#ZqUK65jxJles+wmœZ=+z~fK kؽ^GWI[˶"3Ԗ'G<}FWPn0kcbFgͯ ϫ{ ʬI.mhq]jJ;A%FPoNZ{r`5Գ3墍d`CЎz|K#CtڎWs'U5 ;sfNOq̴u*&# RPu,Ũ JʜsxI,&B~#k3?ߊ'ҽW _-RS+{@||ؿOдsШ*R2W40Wћn拻U4dA u@5;Y`5aUYbfp{ũMQ;K` .sw4Lwn57ݵjߵgb/@0gQP\#G#Xkh1Ԏu40e}4ݷygv86G EIYN=w8"ycIZo"-RaeaQe@wȞ PA 5L4A& n/Rdd |Otiun8ChE0-cv)`̯pv%g=ѩE.Xh,+2djvA8 [mUv{n* S xgi̞ l,)$X@F@,>c?g*MMvb @]2DpKY(Jr*]w1FN g2HB4`V3,ۂB.`~x36tN{>xؠs,,8` 4+6B!4eC>qt썙Oid-6-hL\p^7S7rCQ[Cf xvju =P S-|:TCkpHX dg":ޚ,m >\.6÷%Tzb-~l0֨oQulZ=ll*uCmf/Ŕ*wIݜU˲|j,qs;I0p\5~MçiM:`(es,[_^@T@TSmУ^O`].R8QQP'&OG|$7/ݭ!“1P HDZؔocqõ]J3't_ÙfaT#mcE DaP*;Ƴ>شY$2S"_1OmK 589w֓@40nө,Nrz&C ݼ.)!CjA7*jKy00'_cEaw:x'@ke)wsyCPD;E#4t' i桂 SS;7=.8i>{lΓKU?ii|JGxxjfgTJ?$qSK$jX-A#i[m7I!/xD鱗ڙ0Pؘ旳4dt"*q;!_ \LRjV넇BM[6%%yųj4:zKN>檡#EHRKR[󑙃Cz¯8UvW ԏ]֍Yr%7W@e1`$_RupK"?/jOv%,Vh&^T?IT023`E`< ]rDhf݃OMRIScmqwnHkWWg4vElu]qxuM6xKu?O@$EP a fp+qH__Τr (~:x_1gTUvVOjaxJ1+R/fa9bFÀD ^;KׄZY_}y6@3C$!2آaH1||E!#TsFb Ǥ36/q[E)=ͩ'%4I`p7zQBk3]#k;adL7:k/f>&#"Т6?DTEƽ6IY/Yl,|_߆&8Cpov]{إ˩$56:R*j!$_w4O:;z|r-g52}/&qga:[%P<^-Hz7,{2  DIOGf 1ԦP6])ϧ u.-[M'ja=ciYI}/dy-l}\:8^o$% &>dcVSn?$=o甬uE>ώyʟi{։)#{ȴDy8Jw;/Hnu@Ĩ~+J-MG(OB"1:| S\F^#p Ǽj&?uށA {3~ CNG:4T$;^0eוl˜ixhı>|#ICD|$+u!|lJƊHuL5i&VV\/&#U?IƊ[Rγ1$xP{woHĒ247g=yMsBEy6@s 5${d]S&-\/O:8M'Ҍ|>47L #ktnD>̓<EjK4|3ngF~NT@63"~T1unH)nJEmksmNPDmO^5dolҼ:_Pׂa4ͧQ]O-<_TLKÝ1)c]lhq D=}ѧ;Kv|'dWVS#?,2>ȋ؏e=[ԐL BDQZ8N!آx4J#-'(ꌈo= \F < È^?bKMo('.Tz60sND-J-@ U}F^ *~bÆSC;=3 PwYo!Zsr=Ih=y]7xҶ a_|ډ1Ogi>QӜ^ϳtޣ{N9CNgP@)l=O1zˠXO޹z=kO4Vܹԟ%pX8wV,q ynqdCna4년Sm=hT*U]٫PA8V0:9R$?2Gs6@ʯf#BQSJ䣺˧' [!m~I1K,L CgN0 k*Y8`b !z7VGsq.#Q| ⻈꙯@TXPB2=%jI ˩U`2}mkx,N`28u\(kQ[X.jNny V`^ujyqkj.W _#9:A U"|wpQȲ,6 4Ҙ7qj`R3FΆYO*BMmcT!sNItx! u3$,*iqR||}\D*pz3٢?E@%'ZLa-=Y&ya)־ד2- OG_/f0 t}u$"AMtQB|([8r&1F3bA1Tyi Fk?7^G!yVIX Qb}_9n۾Cl{BiԳH4NdM19_$_wX7<6)W]`#\gmxӏB=kgpƬARt,+':t4J]32d'*>/8=U_=+99Rήs}EzIY_-8=X&cc_7>{)Ff?1ͧyj޽&emf^퇫 re*E=UN}fȦd>BL6(Npf C Lۑ0 '~wb7p//|+2fNa$4 =45ZЍ,r 5-UYɼgPX"c/#xyhCꒆYp@um>v9^ߪ_ǵhi#q3]~Z7%V%k:|mッMھպs@ar'!:9a_'b|_f͟h WΜ; k̖_x桺as#Nf-/ [&A 4/rn&F^$߯Z {*Op?GMyf9nK ؖ?1L/iH!~6qrYӜmPBj_[K7oeMZO+[t`PU?D1ʒy<Ĺgc 3hi^ iI\~zuҶX3"iMoⵊ#-XG)FےRSBΙE|Z>[(Ke;H~+ S%Wx::A*;Ӏo[ y>9ӜJ>#}|wS(o G\}5caiw"uA"[_(VU_9Z4J"'?)F;/&\MƏϖVPj*ժ`\تy0*KÔ0msXJItd7{LLo@T'.8HlV)&BjSG+봽3Մ㮳̐WT f) LH_)@c~%F!7edP£Țz/{2lPLi8+;z$%22rM5]\݂(Z/ٱ2#5Cե%U'l~̴5*5V:M`<l<-Jm!q:5h̝X|[~Fk(ҖMf?J/ oJ ^`dgazm JE8ɛI_>1)1м G~uI,F7E݄SeDBQFe<`gue6JoZ}tDM5006MwbHa͵>.B(S+'CӫG2gҧOQYy-T.j~>;콈nj@O$?&ý%@#̡ҽ)yO, O֠W~Y6{Oɻ{GT. T-%%7 ?Ek8PIn2cpQS(%QDw+=JtVT8n*F5#nI:D^R7N~5ќ{ECxE]|Ppk5b27ƸEtZb^O@u',ByIJo~˷oDz4uA#zyERnX#=)HRK%bB439U(t۫Be/N6N7Ԃ^; ySM?3fH?8?PS=ZZ?#: r}=45o&Gjjb#6N^^nD#뼜J, J&(3׋j_؟%qBK>9革XbPh#E{G >;1 *ޑS$"|!}oђێ ho13yԋ>7GFR9,pL7_JQ-. SBE#:QF0$n}xJ.J555 $Kq4Tw_sK3@G %{G)[˴ePBko7'*^^ҮȂo%>s>DR;YWS^Iw׉qP  ~~j?8vN޿#y+ӑ}KDs.X4"kD ѭ lG~#'2e\5*;u"&нl Y!&[ƈ$cRhhGiM)?8҅R_9'M}SF k=CO(Ip7{k4>6Ayxh֞+m|1fJZplGs6)br[*M'_18ᑸ,+s{8)̏[x4|_ !+/FQFS#IqqA6jro8HO~X DQ]o@WU~Fn#JG}DoyL~uTy ,OJ=ki?sXw_BrEL`n@8뗟,#PpE=;yϨpKZ:5UeY΋ql<M4B0O"~ܟ %ק#~X O6z8ԣ:=wz?֩b~) /!*˿ /+9D*,Ͽx@uAEi#Չ$H_nPjoع~j7fpZ9 |%)ܑ xMHIu7(rE k=qlv;ߝ;ػ9)Yݹ$j_tウ0-*B-M+!ԠRu.cUBWK$b (m\7FF)Pi0xF6i@eWBKe,ӭ*/YVLtUT :V?hn{3qtdoV4W&c-nJ}ze2pՆ?eyUSAn}]( @I[nÞ/U[;BeMyԓӤsj'o00=LA ˘&yFٟ9k6PgJ^wke"t-gc/ND $P"MmӖz` Ɣc&ðs5l@'Ԣz=kZ:$CsARrCQ#%D^ Gh7&1_1˻k5U >_)]v,Z.~#ݛ.ر2wbgi#āؔ}X\7 _KY/{:7&fv}I ߲ {yXr1/bo3W䑔6>6t )3˸7PrJȊ>QPq*cZ2@Cm(dcVg1i/$)ڄ` rB[@zY+KB^RVϷx G@W}VSֻq`=],4mL,Y8`YyW2 u'ǵ4u(!\Vp<>\;\hUCh0 a-Y[ߊ9νW^@vĸͶ)R ֑ȳBarOL[/%05o]ZYt5?J)]IL? xŷ!7U5Z#¬n#Ufːhd6w $?+,0K-Ŝ,$oZ;ȊP+w$i̊ gQoOPKukAC:"qf[@0^/.8/k(p#d̀Ks?gl{qq,y <uvfP:uk NCs1UҚsvpjx{c 5"\Aɡ,]u(vo\:+uP`ݱeu ,^ :#| `48mo6$mTu^%&AHZ@519x8n"E:ZH~@5\Az t"~yVEZ ȔO!qʙ0lo੝7U[ s/PBFkx0Dj@F2`nʛ֦ DaٍzPRi򏠖&I&x)])n>-EC&$xI`^x |M1)_20.]Oj-[n^`eaΧY [K-0"%E@*fC3ZUKXNhW6L6O"LSn8<~SL{3 #eѽAYVqI"ysqe2kP.{1V+=Ʋv5 vo(ȶ>Mxv53cФ(XU/`h:- (&V ZL%(7T^&=լwbRl{6_ @Ssy;&Aڄdì臿K`1SF.O=7L(VmiRQaajt+ʳ1҉5AVD.B%M.(fSɢp._͋@G4'+˼ οw ݂PWɢ56Mʼ-0D޴bT^b[2|}S4 ~wK@Abd@Ǵ W.fVZcBfhQluX\E \;al%Kmy#B06', sJu3+f ]>j>W=ܐ`E0aY6Zv0eD%®3. qQ?Fʳƛ 3vJ7 傪*5bәm:*b&Fko;Ŋ? >ga,8jwI XY*.;Vc3.q'H-ԉZ|8 .*we"@$K><B3]5ۣ|M9+ 1m<vz!?i+jx\[^N PXgGi@D=Ӿ(r;#B5XѹA5ZyGw&~Iڽ 7l1ʹy=YUa& l)?8$ ¿]漮iEs֙]q!;L9ns5;4#ބU~2\#$FA5K7F_eApM@ ݕ G[zQ،W$!P{fLoWgm5cQp!-KNC+ }ц Hʻ5Q[)CԊ?Fw n7rt2-w;USɚ۩۵q{˹ζSu)^ٽ%z v.Q &tA3˭_m]M ]qZC*b栁2Ja) $kG,)qbQyMǼ.cՔG?*x8=S5cv+]d9-/4y4\c~VvкnRyŗ56nmYnPT&K ׬ծ,n˪ ?(OC?'$(7uǯ(?\ZiuXzDYr$DNKkO 1FCMʩ+܉%Hm%sTb`7ٰLF QlaQ-I1;>6YZI <^K r<ؙc|%T|{PLai6bJi=[jLrm|."!, ,! +|^*'A6K;P EWݵsm,e7D ȫjtֽ,#bE,"^<+P(#GZv`BluϚT6LS,LW16\ 3 B8;JD_淮B ŞBt$!j!n0Im&0VIgGzI'="C5d[j x* 76@ ^0I)kKRud.*|:Wÿ1[[Y}CIԝ|7\&RrrJ^}f^ZڥY  ԑ;GcΘ1׶*E'AU{0^ bĢY!Ao8NU@?#U]k@=CM#fK:hz*L5φˁ00wqpU)9?RĢ t^ъpð3溺J$䥁NCi մܭh4opҾZzCӓ)[ȮҴJ)/D*:֍ V{TRh\sY炪zkqBPW;qL$[0[(ՂFBpJ" o^NDXX7RpȔMݏY`CC '}[˜Ȇp [s@ƃE>4 GWC7;M(J.NAڕ$Gf[ pxmZ{dzC ѣ_QMRYT;oU @MRv+hd6ܘ}Z z1NeÁ*uJ4;̈́ 9tU4>neG.ڇ qt"qTӚQ"[X$J*@";)BS~P+WZf߬P2@c'0}]fJ™AԤk=sU"g7!qKrr;АݏZ/v3KQ{E790_A@ΌV ֨tTעxkJ4sYQt-ʽ -.n͝vb.ஜ&tzg]'xu1B(D&3VAD24[S^B- 3)ĉ1k:7 ƶBȰ8bBꙐa>wZ1.5="Wn.)uiN,ff4NQ $=<}c'CGo2xk[86EG.-Y\8_} L| NWyZ,r R#A'Rld5VtQ̈́̒K`u;@t'iNf[Vn[SkboTr]˄^kvFNp5{5_ XA 5lf|u,q3a>LbdsKϘ|՞{9~?4M`m#l`cmB Q"7&[0I)DfTffC ?/_.]62J+զ?R&X i>Kgײ9l$宕s|u=~y\wٳT*]EBE s  O1nl`N*$VQ-{ӇOHqMR4ص [VZ MS oF9gkOی{:zh iP3j%:@L܆&%́f-gB'a%AAoOW{'Ѝʺ5"uX!]x"$wjHB94preTo[DyIJTtSDYR~BL%cr^MӬ>_o8{"Ǘ16J{pUw!eVʾi];4*SrAw7qs)@!_HZ [+d|Vz-AD\S@EkM9X~!-CEG ec<Oz'/Qo)e89o#u0ѓ2"Za?\n1;C G6"XOt(?1}J´^eI"z1E O$FVM)ffɵϏ\c/I}N"LK@L{-X \wЦ7{FS7>_$ZnL`3d^6 ~-[o fs /j0}3̚-*OOy{~0VmF,Ib%%  zLFtC- v.kjIFEe6cv=F9M/Jz+%3n)6KOTR1M^~oYv l"ϋ>I^f޷Pˈ<"0ScnZhmaВ\}4=Y&NqN|h֮Cr8+-O8N_OnB$З &%!S.ZĨeTy$׵ Y+W`U{'rJRCE'marp;z KP9]#ܼoJK3z~m|-1w䟄!$̕_Oۉsa+ȳgHɴ| tGz=p,f&}2Jr-g-wX5weZ-Տ `vbe4׷')Iq~Բ! iӭ`Ǜ//EcJeJw]vs7b۪g-Q?N).7̱7YW#leHx^0Roo ,!Z;8՗@Z1҈ &5 Ο<'iD"B*!>j=*oc:УxJ/xC;4խ)/۴IIENpq/G[1YBwy=Hf/|(UŖ8ZI ~1D($硸"?CRt)%X*/)eOhO3D nKo'e4 at[AЧZs%Z27~jϕɷ9+&%K82ɾPg#-ϳ4hͬ|9o,ؤ³)vm6Ev{"4ү&hlk5b  h}&MUk~vG 3U!>-,gu6͎8,|=:?c?}>d^>+4M(gn.d(BrBx7#OL%_{렎q0H TQu$H C ~i t$/Q:Rw@TY/yvPzΉ_}8!mu3{i)MFz)5m{C҆vvUFA/H#/aHS.1X]fD'}_Ų̑#vBv$-;fD.H|Yуoti1rϩtiTvηf0[|y2ۅb JOO!aK$}fHxYe09KDV߄v<^ 2Z`4* &^s̀_#3WpL#䫦uYox*Wu^:&L7cNlTj0]5#&LnTuK$ 8vWJ$@RZS<ElU~88s>J$ ;o%sǻVL4g&UpQN~{(nVH1:Y=2[Z sA" Qg@#{dLF`p4M_jWcsϓn{`^,-Y | ,@b-6Z< D_|لJ’cӷp q'b8oO~-{ c!1]ui<׀Hp6xuVy=/sKЀ!&y[XWF]<鶦knKʤB eH70&j< j^| Pݳ{q>Dyx3|nGToYa*VL(7W`yOq5Ǘy^*@&~ñ5PsH]zfӂF\"ek ; \?4B&l>O ~8ZŶ*V6{]$_;5EcIHKkm~:go.o8dݾj06y=Ǣ\3G;D"_I'{&/?d7>#K%G^xuo\Épʿ[!Ix&,[7{{DWNҤg} "B 9q9Y'T""sO,DmGj F]|_?ZWdlQwEs*(O^b$ʽ=~-g$*_qMz'%w91b5!_hJԙf}8h I%F&:I΢bc) *iS v3&vZ~]8) #'զ2~ӀR'F9 x \03iۆ x~R1hEsȨ{u_ʩ=rm4i\qzM3s6n%{W ecɫ@O˷,DJ4>Q]_&򗊸H:Fo_|=a?s?gim[~a~V!'E#=%n>37I\J3dLg+P;~Rt.6b[mLi{ ܭ*wLᖥxyFzF ,%H}F_풓~s/1͏Ѧ*O g/q~?[XI@\Or~:#~7}>mw ڈ7 mgܶ'SOֵF9{'t}g<gsT_U~4RO}Tm^T$ܹ'4{Et~{+{+h{M{y {O+\]wx-]]Śm}=6_p=]+#շ kDǭ#V_ⶉ x!k~k<\ܵ_k7~]^ZZ~Q/щ-=M.-P_>T S14<='e<)eؔ=5wJiȃgYV}"͖]#HoI3b/`i%jٔŦ`}},|DżlS*?Dt6<--ΑBEHHP*/pNK(*C"ǐ邖rE7(yMi=SZby\ }% /Xtc3gz$!ihyJ=,&[W\ܜܖ2[JFkj= @0faf9C_ӻ,&m#t?v>4-d?_M\ 6y<Ng#7DxቧJS豉m\⸶" 2>~%$Ʉͨ<</wBŐ(H9u8X۰ Ƃd8i#J&ˣ](<+٭gqn%fq!̞}aZEG ~z:F)%8uHO&pln^bt7w-Z9J8 d8|q8 DJBa0nk R+]F PnֲsT35at@2 ~Ka nMr؋;E(:G,R\wc{#`[*GXV;5u @'؝? i,9:C9rېq/źAU%ZJV/evހ#3ǫF$@2Wlـ֥Ólr>ֻ,Q2<8U8X97y`K5 Pd3*"'Učb@G@uĽEmqo@/ ,\-o`w{5qEjJ]w+N-8x~nмyu̩j(SD⅊B*Jd4CrBT1$d{|éf3Ui]yUuÚp:,Ő XiZ$2LUt3Ksw֒@\M[&)S)ޡ1dmkO$xVPe| 8Z-g A(p"@Al/3{b^~z6VȎcUXQ׀!ak^عcrR,:3vuH9l7#ǑcǮa#|H'5C_skXP@IQޯ.8MSQ@eT/dPĭș"PRJ4 UZXo1v|"ш>66}[s#n)<%3t$wX7H4c] j;2j0ZL/ƣm r ,1-w2e ?\Շ?\WCVƌi+64FŠl3Un8(=S8fE X#qǩE_]3499)2HXQ0KiHV_z`D4BAzrW-Q\>J3!:u)N!zi}2p cXɞwE$$av"6 ~M潲6i0oZ ,uPna.i::[a:+p7e†hS sp#5o|zb/FW.:Ӥ:LYnk9jG6ZԴ^R؊\j7C) jUiSYre3ET,U$Sb -r||N#\1KTbfrEx*}fYH M12"Uà dJ.٪q%#ɚċ}f{Q X]}F2H 㖛 `jjUz Pѐ XCm6'U[Y LdNyT gɲ0~3 vu"!''-?g6bZ(s .阥wz!ﳷ&oNh2k .Cݳ\*²EurT!;GՄ~ As?Q^2IU) (<6%2|͆t|{]ͥ|xi-QTf݈X⢌!k{e6l*xc%"j+|!",.=Fpa"kY@αt!Cl>L;e)1"`.b:줐{LH r""RX8ޔ!EzY93u@7>vDD a[Rĝfk&EՄ#% zT%M2bԷۇnxl#eI4W9* ū{%>fFlYNWXʪ++FGqH33 jq`8/| B?ydLsJ9d{&L:EMdt5J8,񌀻9Id=?] ASRHTJkIn$pw1N x qҴd6^ tFm/9 5fy/5(26Рd{8z kX5k'0u^rN@j;ɺX=3~Mmܲ0/k^J/ЬV(dqSE=3JV`zјI,hCaV#D5TvN7'&\ [(\A)Iz:qXz]IRI7 A03` vP,oИkR!)*HM{kPT|fkFxER#69sA3u6ydv&V;^z+t(F= j;j" 75hC5Z7PSqS>iAL%L;Lz|O u@:(% 6چ77Z6eB<>34s5'Z뤈diTWn|V'T"IRW㎟yBֽ+π5, Ǐ,TpW:1۱jޤ 0i<\e JRRZ^a>"EEOt9WΎr:2cE Odou؀ћQsl\LM:f5C+1F+%eQl bb@+1PNAU]T4 U h`a a*cƗ:T> {9u@l ZU|ʦ^,P'@y"L G߻EקIm(4 'Meq _7/܎FQb*BKWŘAJw0Dzn9KYg? B )"8/,`wG0Lx%|p\4 Uұf@tmBUʂ&ˊFtRt hZ7 O73MXWߝrpƹZ!P ]:F]4kacׁb+u* jyTst{7{TSTijzbbX`VAi5FV! צ  H\c`:ٰx&ZΩR.aOd/-?,=Q-Z6;vd*+vs露PGkEX] !5klsUֲuQ,:zig+/}q)~Dԕfy{.H;&C-y 3ڣik{v ,E[%U3&^aptiΩ[w1 ZAw 2.bCJONH o' 4q^]jep!qҹ)\+n cT)yK9!K `iA$qs98+?dQH4ْ'K 徍 U] e;: QUOīkljE4 sF҆- Oif] R73]=иBW3s!3xb7PH"%|\s52T]%)7p13'|(Ogs&쳔ÿA~t95OMNE9`Vf3ɎvLSL!Ifa(?2#ʧi\s'>1j_%^F?k pqNwiï*و&5P>W]lBaz  ^ N_syuWVKtC;;GP`M.Κa97 j5',ʅqчUnxaNdÑmʺͼ[vpytΦȫu/4ԖpG:̷+Q4VgK vZf;t$Û,N=tʂ ]9@^M\ZuGGZLݫnkO%E5bVBS2U:NCZJ9+]#!ޕGV^uHJGhWmm^+ѣYt`Eϑo-&H`_N$I/K|D(] >kc2]CbsχbM:5e'hXdMjY +sVb_҉(S-FNB+nc A] )t-l,36ԤM&ҫS$:~ܰ8NJM * | :T0$hxCS^t na9dqjN v t^?ӋAv+9qA;_v{ft[Cx \xJA /kcj&xb]hg>%Ml3bz԰Ѡ(8//OKЀ>Xg S<ޅ`L*ة3KK+O6-y8S& ;'?guRWU*H\J*sF뎌.g]2R+=V`(b5PvtuL rX :>/GANTu`ekǾTy98;0Vtp()a҈xPqޓ<{&_?C'd~BYX8}=p*8>D:6(#[#MU6de L7ct7$/D*̶y Lr)/ʧ4kqtlmda׳:wPṂmS ŃL%Aep BY]bu;VSoᄫMc':w:䔙],xL> >)U%PoNq˵e@L'D{evY-(I2Sdɗ૥8XHGJ s|G(D^m|%2QXepJՆFf  ]w be9;(k'J{9f7f~Z;  2"s? JqWC{i`Eǫ&Up*c$5֐3Ԏ(@bKř(xKuns'?BQU>Z@Gwbt_~#:_/][*UƆ,܌^dꞪVNŠܶJDEg0ev%_|heu>mU x8n ׵ {wV؂ؐAAG,#)]pXؗ'h7|{bGYF5z()Os[kf~mGRJRU'Cj6ҧ7p:~nm̼ >7 @5:X[}peAẰoҹjct 2io5b V"SnƑ7&PesG2yo峭XCֲsscKVS&ꉔn@Zot3P2;^b1il#׷CiUʲaH'N@qA|1djZk@ z;VV{s:, x0 ~Ai/^kcK]~+L㹐uG bЍ aҺs fz==J2FL8"Ƨ!jv6Na0KX%ٸuW!e9uWUNdSOT@^]/N~T43.)^d֫Z&=w/}H\)ki[`{~ɒ2s@ifH2LtE\Q&MX"i' eTg4l^^{UPӏ0>{ w|3 ţ6h"y<]Y[)f*ƪ?aQ5 2rEsәz/Ma;7),Ox5CKh\L^<#kE?i 0nbZ |V#FTeM'^q3oR/׋f.۵$1K+w|nW*>d-;}?xe,-7nRQX-ha+幧]S\vJЁt1n4G(df$uv$LS%h LI\w7caj+{n7Ţu9_ iC،?ب׳"eV\kTe#e 5y_YO>Vt4XcFg+Ӡq0¹ɍ6|"JIrMW!y +STeů`,(h yXF+ p|thжD]SpPY/4kQ%jzN?liUUw HXv5[s ̟&+ V7ucMU) Lcܿ*}Υ{D0^̵fhJ.@T;g90wViqmuρ)yirރ] ߻ܥ2:Yz<?@I>^cgz(ۈip)?ā隭E~/Y{KˀĨy8 boiDw$sKcP`" ]+9&q/zc fEO{óiZ6ezO[G%򁏓<6}6{`(=yi<]TӺ{Pum5bZ.Rϻ/)V-6,M]bSnOjKS)i"d ^~=VĚf6>8q૦I4ó,@Å*@N=91WB')R1}R)Xq ##:f+|,TN',4IYRT+(b5e2Az^Zm'p]4MjckVwNNҀt-OVn6Z_OւAJ`Vb>y/.{ Mc!wk={E3Է4WՂW(Vn__ !TӂQ d-9&)t ժ+zvS>h:i:miϥb_J}^J:A#׀*XbN\;3lG 2óԈ\^4e gy.lEyc? 3N&-Agڑ6$u;q 2"ͬ?3zV5 khFA7sݺϛtp5rQ$G)m~Hghx)0=4t~E@2A ,iJXVTs)}|V) !aӦ﯍X\#dGA#52(uI Բˬø]8=Jȩs^*ϧ*{\:Ws OҰ:ÈA4FLT-V(6lFo>? v 1l<#%5%pPZ}:v< oCI7!nS-֖~,ܖP W|(hԊ+Z%<Uj|!*kyR9tކXhohXYy]/TԲL_Q?%pJψcZIYЙ%RZ^ 'Ea甅›+|%.Cuɋ|ѿL0$o3V?,l_Z܍Ĩ,޶kOu~, >:SyK$9<(ٲB, WM1|mh& νR$A3>`&lRh>gᄧ$_ ,cY8"!UQ-<%vss ,?C~ȴ_5L2)I=vn+sn`;I0k\0kʔj-'.EIM_T A܋L#<$䤐oψ,P?ddm9 I Ko>i ?*DD ml/y/)#Hy<`OCg̵dU4&['+oIĽNfh T'=0\2?!xJQ-D($:&Mh{3P]`|vSA۞,Q% (FSo5o_9^OֳsQG&vϙ.`)j'u`L9*7c9uDFE_)z$i#p$VsoTQwW)e=BKӸ~tU#%&爇,}ɮK VeoȨ5سNՎ/yQe݋q`JAk{3b WhinۏӏLɛ=\?QNZ#[;,_}`AF;e ĜV'ΖH<9ɽG3M5$OhS'[x譾"j0o=Ư*25Fzjf?#_^~i_"n}h/y% uúoG,UhnKi:^D̿f=;S_8bvD{뎥1EP 'e[Lu]fI$kzZKVȤT&0Q:?uk\4 U`$bhwTf!G&PV$!:?L_yZdL|sJKtMCٰ|WzP8$=95.6'X?3)X6x[`H7N FC8ct܅x'?,M?-ߪdBS5wpr.Ւ3GWs'n!(x_4 Q1XwAnJKd:6v?|aXo)kPi#f۹xy,87H ӨW)Xj1d]!i*ܶfN}_CZQnekfx1PX)ίM0|,Ի[~J*7>x"C'k{#HpJH`5[fe_OJ ;i{-!Zj(^>3* 2iᠩHK*kA)SYM2V8a_h캧U:K5?=,.%#YsFPzPbC@=k]Χt)|CH]{ff1Bq57s8x5kp2<[B1CŽ t?AڥdC"S({+haKvz`5rRT]70{pByF^tYupcjR٨^R3ēk=dق/:lq9CL<*ƪ2ԪV-rꘁFaAeעbNf*qjUIIŒ[ EO=켛_Gs* o^RzQ0~V_73ĜXWl_ՄъҒ \_aX5,(w@zBiZVHMG0Uā1zz.z=.$9Hyjf#'Q`Y#Ӈ}Ugfꔮ7jҟ|4 e*,eK=+?-({9[Ҋ4K_ad `(cMʰQQ57圇z|8_㓪-%KgGx8lF%*@zӋ9t9 fy%T`ͧt:W@<(oomC?+u@k5)#Հ{yqzv؛S:eSYs3FמӃl3'+4SCB7DMt]a+FI2CTLHСwJ$s/1q 2Z!vF,-\X#6[`B)=Ci|Why}YJ~ʣd جwO=/(.X|R{ZGXtńG+3lZ։~TPƳ E AFzIfxpc& \k]UԻr^Vzuv9),s5Ӆӊh2LN+z!{v/4V#-H &*.xĜ{e2f0NqxBZs~4RiRXh8" 3dV*q  d+aŚQ6mj{pr_S)=cGDV͵/G)O,%Oh>*9 .K h(Hn\T\ɔ2PҲhxA,L$JE }$^)u =A@džㄷլuU r&+=i /HY)Z+W }Ő6Г3xN#¡;KgF !/esB q"nvNB| ]TBZh,qhV gt6Xg?YH5j|XCvY`W@tvLv'_3'T̺_k>g[@Ү4`k@/+0#]yKa$V-j4?G;E]be4ԟqYӆel n18q FgkN6!; dMr8{v)VD]%tH&v7N>[i:ñcjd{[u0G]ŏ:\`$˜0W;5+.4_L鎙qHnA-3c@ {,[Iqo-1vƏnp8#Aё'xG6iu. ×Wf0r2_w*`͟>(%ОHd!{4R- Zky3ZåU҄Gb1B6 -` 0@L31ΐ1UdkBgJVtr%gQ:T,aʜq^)%`d~lUY0m}ҭ,^(ļ:j[r!`~QC'j9Vуcԣa?IOQE1%&5%s4 K$7N*^#zEbNř <&Y@T\g2">f;qz,!R+D4NvAtUǫx[1VPS;/g\aYG]d=ɗ + Qh^mPEړZx"{#HФχg"teS*wHIQ16el'iDХ}I[d H1$/l ߌ?LmoFMΑ-h14޿PUY['['x^-Ԕ[Do^$'Uj/$%Ddo|CG9xJ8&dK՛ӷADIX )@x8iECTinZ%D$쯔h*HFj6JG=H*|˟ HY2RM\FbeHG: )1 ~D e!i;<4ڿ$D3[>+}$d`Ѧ>IgfIs)&ç>=>B$ڷHIʢ'I #礗}{o#}.!LȰa|!3)f݋>@Sy.6(+ jiSw>JgQI t~R#-nrmeBT-2SnptQIg6 /f)Іo1z>?F+z+񆣠ȿB-ી˹5quD7&t{?xo!?]"}*mu!D BhI5y*E{ORteaI%Kv~) sEym4R MUǢ/iߨ*ҨS yv!?~~Ƕ12ie TK"a%ޝ2:XiO*$9R{5tNyB SdKkWcٜmNZ!)$[ X#3E:eXl̑،|%Dy_C5h5ȸdh峗,=V8$9 w1^0!܅:]f޲Hnf>Z}EϚt[\֓:?&vð&12kV?#zb9GXyk/Zޱ _2뺳u'Nr)C&6AYɗo>p薈h]( JA#4+i3f"/FDezOz[SWw):Y@Ֆ'f:hWe{ty""JB}ZO/O*.?oE@F!IO[҈K%7"|zGYRշ J7y?iC7k)"HJmVu [qXI%URʘg_{y2/eN[OvGgBZOcoDN e{ 3?odd ~PġODj_pf_3-:|IK}atǹ%(!=*OKIp}'s3,'QȟYT̉YS=9"twE9)4s;y'q/$bхES) Μ%llɶۚ3#yp$nͯ@tr?ii[3Na~r?feJ-ƐP+I|eH0RY:H667yQD"٨?Q` Ex6b)-~>ةKwJJv!f_B‰ b$S7_dd(? F[E;H'b$58>t E5u,g|G!H+auVQܻH'Ŀgw#쮐%Lŝ>Z/( 3o,E@@B>bҙt.9Jhv![7Mtqd<>v#}|H*J{?s*$3aWoƲ%f%|y~benO>JVF->u]U}/#Cɖh߾{=EFA?/:D4_Bʸyg(o ^cMG"h^}&MC6~@·yKмyiHmVIw*=!0?=1_z0C{%nEJ)~Z&sVM9&08CCa= ^Z] 3ԩT/^DS6s"n]U픦vCyDW9~c^O f[&/8Vf)mh*5H%V_gdF4:C@ a(gF襲!hP^w@0qrsp'rpmg(- 7taL0lƤ ,H}+ >_!HEbAF \&8 5 L;gZuOjNd)*cM%b_Pfz6Twl[ cz8Ԋ+GOϳc\r$:be9o]Ey: Ybl3 if U1^#_̈́6ߊ<7cgSӆn56P‘Hd2xZtTB0eesK3b?OY') "w3D`2pC2MdK&Ά1xb n? NS P3jaInFO*<5#|F"_1\fu⻀K U Cf6{1~QGmG5xsPDZ M.pʑnA SsٺJ0-U5{Xr)LHpXrǜg@M\@Il3 >:M]yxǸ"&-<)׺R]>E܉Xh݌ȴ::# 1'*6tVOXJfD5?hυԳ k"fM4 C B^V2A߬u͠ȳY/,fF`4+eU%vy:eTGi2YeI=uWyьQ*B\o";rFԠA/K,>~FY+ݽaTZσM@E"zZV NI`)bY&E^PbaFv^uJv[7~U(lM~lâdCm&VV/bhpA@uAthd62E,e-Q \U+:&d4bzKKY1qˆ5(3`Q&p*H?uԭڥ/s)_~}GqYT_袪eJ-BBsmPr2 >cլ)١EhX1 X :OfSΠ̞RRr47:hH#]J͘EǦF#JN5\4۷UdY }6YC-IЕJ,>(xƔ"Qj7AQyjyQi{sP^i!φN9fsP^iOPcgr[ UL*`f5%jw ߻g4mə@Py &d(- I!\ą'^b{[1UtJ7w]g_jRaj!t관X>. ۭ) U$WIgkLEgYtx9Ґ)WU%QlR`p  3\C 6(`J_i\N* lX~ \mdh'RW֖\^WNFȨ K0R^8 j xM}iI \^`pRڣ*suÞL`-UU5 TUSvI1$J, O08X8 ,8琴7Xz4R Va*` Tsnᛳlы}2a-E55qt3+_OT1`mrOE9IZ\eSC^^I1a@z+$ IQcڂMQwQ yXØqK7 c.̒wV)I|WI%Bzr |'t@_wdU}<;L8 <+L _b;=(96fXca2׺@MןUl*)1H%hWMCEKetj<QnfH>9$z+g ZC<_yX|쾙R`ncSVkB?ALC bP +T=hcuUO!TfG9 $T=18'Qc93 v~*yec4I6&T= 6'gzWt70ؼuXRqjo{ _54Ҋ nC2|SDkRWv {C@9>mq%V"ż(Ois-J#sF 4; UJO_Ala96-rsŮɖ}`]=+uo\Mgub a/rU`W0=<[QI3o*v znK2E\t߼>Z<U;XhPjxܥ+hMLx)~. Qe\|uf*-['N6]^V ڙX(F:tՁmh\1ԒYZ8E/uv`RiAoIN=dsuYiVw9`KS;=ѻ^S~,uz/8UЀϋǝa,}|@,+_a%@8pld+Nc‘"hU`}v=(Mn#`̩5:w AN˖71nN^*Ezۮ4 %Hg;*O%(vX۶#hQ%e*6^S2 byxk:-4gnQu4 ̑% XeȄ7Ǔ qcY (J 5prepe*3bL Vvl,c.d#3QV#='}cҕx+*5ʚ[fcPW߸*I=E=}WOL=  RiOg)MޓH?BaaX( sUo-Ma+4SOcr@B%[ZY= VH P ܾNӘ.8Vo`t> >I WZC%K{'$Ow'"%tk fvH-*߀AUQ_ D[A)V*OGFwnv(FΓ\"A6׃6>QѭP3WfYڊ@p@QeopaV-D^8Nf0焰? (;x_4@S{ro Zg!qm5.?]=]ZPvoukL|52!}CAWvl.(5H0>N,%^lMQ4"v@>d!qIfNc0O* vLXYhI^rl! Ӻ0u?0aYQ \Y8Q|PʺoYJJjְA-4kOx@]蝠i|;i b˂'"04 o]^U, 'el\rl{ʐ:~=ϱ"hQnCٽ2q4c)EQk3"`ojN4vnG601i%̺85˂wV_%zn 9 G@ l lc630v-ARG\p Q ;+t t)]G1Z}~?ݸV =ϳ!w^AcIBQ\@0 o(ѱ( TC]uOdBi=B;Ӌgg Dk&6S} T`i*.4ʌg*7ۚ/S2;h^VH{$R@kȚdM{7lcRc̱^8`>q7(t ]׊ 7AeEhv3j Xu(CH Xn(Ei7A1dq%hלnټdIjKb㧂&Ȼ^Nv*h7Ɓ&NVb5D@0-Ao6N^?ݺݦhv BQU U+tFTXM荗/#]9 ):-z :o-ܺO|&M !]J )׬n$zDs(abYҠ,c%L@)nMm&[?-EIC*gq-- Tp2eGtm|_w6iC u_ AZŌGZ($@;<>+LSiU\$97hGONBШŜHl)y- ]zP\1kVBcn}#FFbjLE9zi^*Έ]zv+A\g'7BRնehpFtG5G[Z*rY!A(+kOɩ}H2{dؘA>[X3UΨI)Ir@?"aA3qNB?LH?IQo+”Y!Pxya6cgnȐuZgC(^{ϫلihGm;9X)N ^E0*Y[$i]]k$ؙ)O@Q}[J:S#R¶91zQd<9\԰ 54,@L6eTₕHut =5R{"t籣kjѽ kLŠi,N'*4A*QLAM t7 NSҦ8^&$gzn\Ijޠ.o1&Ucg?ʩiu;Ӓ D**׹TTZ\GOء&5PpЇe nйP{Qڒ\C7h=Y#g5pM4t<1ɖ3R*>Y}&MrG ޭyw@2t>ߴ9SiԆ_(TX]>iU#Iٔ' P~6>vevQSSpR?@@|/6{@0oEM?NgtBf4G&*QlFP&@7% g‘ ;Po7 YhJ=dGN/:{fxM棞"`C,(]l+Pz Z5  ]gP#ԜύCbk?HN j;)g R3AZ ⴠ9& T" 5:|g>5@nS5E|'"PYꮣ]]Q=w^R].g*f"A~RP)XL5iO'aqd8rƭ.i]2T3j$EݛRw˒'ᛮ%oyT7T^gD}Cx/eOh rG!Lppi *`X|*⧎EsC񎪏YNwnKg8 VKLSOq hzL84^|w&LmoRGij{e3,ʗGM<u{0]W]dpi %$k$uA⏇!sx΋[Ǒz L ~ R*+SKb=240vfA!.JdӛE5ԯY >AiemX>Hk:7rPT>73m>E >oXV~Ab |0(l}\ٮ]XrBۅK}UJ,=? V^NpY7Dpyi'yG1$f:%?zhBELPPRH { ũC՞ 3mrphF [幒$ Kͽ(Jr D3`Fpf_ -YjeYlP 6byXg0"b'`czWN:d";  3@0(RRBEDrwȒz@u@['fg Q`-{80Z ㄶ x"j- B"ܤ#b+QThSƩsb'L L:zc;8nkMMll2*U>"kTJHZB9p'ᇵ?PB}ݣ'^{{tnu/}M Ƀg"(X Ҿ5iY[t+VnPYhXf~ /LQDQ0CdưDx2CXXw_m MuƁ:u?;De*u3Ah_p 1U&\j;" {auO% K><|d#.sm FZ)0?~j/M(& "I6ǫ]@F-~ƄH!ۈ1|60(J!dQAEb)E?6!s 4ɾimvףiyv}pcKK#(*vgO煈~ qg?.bv&kHNTFM%Ck&Zm̘muPa:#DTN=G $k>B;8T> 8Hb=LqųȈYh ?{,8d~vhJnsڱ}TNR–4uA>3}HBRcMR&d5!v&a piǎc"E `'J[OfÎ9B͊?;fB c9މhukvbp\ط #.L nO`; : .oxi"JS%aR*;.L}j^]ҍEe'c2TǏf: ZeOb0G=*LECOu"]wOպ;W/Ld̄Td C+?C򈟚@u.NM`Nsh]WSmWE NVkK5ꯦi:!=7{B)}̧6 ^8IXYn96={TS~Bi+NmBDyN֗mAj#?4ȭJ800!]ηS'm&#YM<:?;wPbl=5HgK;Sj v]QZݝ/AAʦ,4Hý_X?_EKt5_E&: -ճ{IecGo &0y=#Jl evi0!m`*E''YK.lâh,P&3<[H׫ᖛKD"Z`*SW+&oc +_m5v/˿IUXGiZ*I/OW'Z+OPd1|SPC FV>C=4* ilv8 jv?}v @n\),C6D IK[A BQʖKA[Ŵp!0!>;>ި:=XY- QsJ{ `⥘j J@<2O+nqĐ 漎L }u#zT"e8F}#">2hC1 jϡW(ڮc|!,~Z?Jj}6~T /u/gZTe3!$gI~]!m< w^F;+Ɓ# _ag>X<}LlH0gpҷ1a¤ rMBE|aG!R~v'Vҟxb>uhrr;EW0%6 OBrvܽe70PΖ"LPw{}yM_?Z kmJi=+#L kK1Jc( -A0 d;7kVBQ*4x.J$ HҊzH ='Nyߒ`@ht3;}weLa_ߔr/"5|%Ftbg.4=aDqBu!l@킿=#I.qqIJ§@> 0%з yRET4PEi B}b2!dnn.ݿuJ[g]!2n ^GѠ辆DP>:'YW\;P Rb @#8.4&h:࢈2lE +>Su߭Ŵ?zAVgb -%o_-[=eZ!OKHElSuj є |*GMŸ[x[3hlRl*ܑ竂hb?e6̚?،,ܠbNCz{o߬Hu$:=t7(`C—Hm׮fQ B:N$* b1ν*mk[Q|Z2J,kBƅ('0TkJ_Xp(|,(Q,h7*su~{"vFSeJ(k'%M9iei܊=%Bt4B#jF!a],hZ"Wjϔ-#sڍлD-2β=ɋ╫+%Z\9u'&OϒtE ,ﭰ}hN`jP,Ú,Ph;ؔޢ+0;}'}2hiO3-#N%S˴6 <l  V\jWd] Hʊb t('8vl1C0ri&/ݩ#<>U*fT4@͏]Rw¼A&u#r!sgk+(r (oF1958_!ZIi\g@-FRLYGx)R% dʈ\b5 ݎѿI!~mn 6F&TsJ;L[; ͳ0a0g *)^UΩKݣ{kh/ڞ<\-K7L2t$[mƱH(#{oוoʤKl8c\1r"BaPEl Qyȕh,ʜT-J,E͎ЮRs`f}R#-7!ckk'y!"1ta;( rp 5J?n'̯EEU;|dN.k6X1&=b|L9=$c$=J*Ij,b>(̮ {Z֭=͓h rfV_$]tYe0>L/jǒ wYɚgT-(+vbH}8cҳHaN/DҵI|hrЎ4_A+)#"RR }b=O@߂J=5mH 3Qذҩ/SA%g=-_ѵ%}$i+z^zl隸6z֞HC" 1n2C+E(5䥿2%-29}W$E]`jKKڢn ѰkF)/8tv-E̅ BFwa"Ԑdc,ceZWmo!>]W?ҫ3A7ٳ/TsȎ|'AAALqfWW@xȆM!W[piQP3uR&uGt;3.q̝1 )[OFn2fK!(6x`bzqk%@ qY A 6?`FPKDQ3U ==q?]+!Z=AЙH޼}Xst(:6ƛu]EDks.~q=kRsP BDތ1|C^x絾9>UN5Jy]:wRgp):bƾP U Ka*a#1_{^~eL~V5#_1c7XS*0]=U7c"k2MeW5 RN{68R/!)Zd5!JjKBD-ѸgTk4j4ةOf'4?Bغ0b0' 0-yXO9BݢOielYj5Ho23qlF[Xԍ -NN[݅G-sNr3v+3-fZb *b1k~bU~D1 sՒaY tg+ҿ@iiÈ]]XTu"q️wv~:`>p* %Nͽ2=M3ꏿ'W> ̜rpnvZ;VήTLNh+}$Gk)iOީ}3=P>322-mJ5w>A,#X0(fГzFHY|Dy~ rp /w<Kȷz/}P"꧊. a?ЖBSA6FL UY숙o_p g# !hAZgvBu([`z;̥Mtof|eQer*4@P#I3&ZfMY'@pGZ^,q\f c}#?hQ됗 wq美8e_p?w)?uo#/>ªF>~ԝqt) %_+4nfz/*L'P;$CV.B]o1V~ \NSz=rMꑫQ%G*Q¯̮I"n>mn#CgAe׌ yIh4!a0Q%xəEjl/f9s|IKV)IFEғk ?9F=UjFV)zED/&n6?uD%2| /~(sw`cTw>Ě@yE4:~HV(}d{F$q/nE# 2Kr #Nޗ7c'0{C|K*X3vԂȋb :B,~Q4}G'H0s#-.B ~=:/Cvi;;>ۻ"t^N%B|*p$va ^ֽDV|i0AlZ񽧐pi} Q:Ew hm9]ló8F \:96]BjՋ`[Vc%|ӱ1l%̟C> v%=K>Tv MX>fk Xqb1a›:+N/C cQ\ޅ []a,ne/NwlW?(sE0?kD^5:`;ߢY?JH7%sXE.[?{dkKOO Ԣay#:L9#)a gcE@@}nڋqZ_ͼ qPZ—:~q>NپƜ A(\XcI\ޡխL-ͮӸ}H>TԞE;"rg(+a+raQG ).]Y:Xˈ.WTWTQJ/·&z54Μj+_go2.WK<|]rC~!+#^?(s6=״ vfw)-M'M{JN[hV\[onx^3DPp 1"NwagU_o3qkd)/{6[:Wغ,3%H %6>8Zz>Re6z}-1$*6.ɥ j$T֧ a*6#\דƱ*ЉG֋nl4y%s-U3S3dmJyʸ)B:A!H9%LoB$#gI3  F c|a@(T½*<+l<.vBS, \/]-L0:p;c \co25g%+sXuا $ٟxt4>!`#<`2Fg,ӅEKu_x@#&yFljXKߺ$Dc晻zvw&ܡӺEIyGK:b-`ҡ1h >= M+t|b b̓R3QBEUpZf+Qbwwnxs,CCg3wDi5!q(dqz]ۅIt=}₺GP2Z~mNWv }YQEmɖIFtxB~vadn65*ͮvze&x wGblNBoLvs"Ά?k ݞ,6NtBj6.~f!e_tg%TrtUԃ =Tb+.E}'ܠ^E+b > -!H)ʍHt &^91)ZUǴw<0%u36jlAWKJ/ j [_/&JB>InS|ŚMeEť`82=hW^[AuOO<=}Eq?H>KFye[W9?N.k *4Uf".qjqq[6T7ʉ5pʺ0̘-Z@<|RC$;sxu8k%~&Fgt9n5O_dds7kv5]Z+(hꨈ^gDjɋ "܋{IEKgK.,x,rvgVBc}:̚T 1j>B6fBjKWhR"/] (~IvsX8 5O~ Bry7e1[iZ BW}krpLZUrG@v*vY"/Xy{ *Fq,R9m):Rj oinrvjEV nU񒿃L0j4LtN ®P kg0j`1M8uVdbdeHb(Wn!wƷCY`뀿cA*~so8eJ|A=]ae^>iBE5M߫\?iʩN"㋼Ee@{Dncq6qhܟzvJQ PP1Bw z86:5 u?:$ܝu)PEEDD+qڭ. o>|GP ͧkm; DԄXaEZA@HwKK*I~0;eD1XkѮIr q}ٽrem >i?r!c_7 Cc3ޡF56w~?U-Dc>ۨ#:c2ɩ{lvt'CzTpʑ&qۯh 8 |&T#sZ Iy>: .{v+%Hե[I욓M[d 0o9 +#'cnwAVo@|] n zCbP#awΎְ|m5*MK3./ϫ/ְi8nF6dW mWmu?zo{~)v,OkM+~kV]&@GcJ> s9fْ<$So\0Z++jL|aZtb8VŤ}6T, nPă~?v!¼/.y}žph }d1LY|IۻgY.Rӛ#ŨkSNp cKDQU]ʋfv JdC3߼<]:UFfu`vD\f-&Vv.o5fb/]0ƋW+[hZt;a#3 ͎Ґ@~Nry ˭ǝԫ2i'.dl7~iWuRݣl -jpw}덣]5m`c*vjJHuj293(YaU1A;y*Ҩ7,!g(䜘ڗTn(ꪘxT,X޴<*P.S!O_Q8O~)=x~ MglRźD535S~eNd-jZP_bqz+V3Bnm7߉S)R%e݌*%<&SmI_#Hba,BWE/}mK\1@YHww6Rw=}SAR${~ϡM̳aJiVػ0(~Vu}9[RˏDJb7nFo!}j'n۞yB;%4>Q_7"xe1׮ i%*VkR @e%c .0Vw,#Q5i6Xg{f窂vBWgACRv:&r¹kN ,kw^tſL#-:~V{.l~J?&!s'ILj!eޜj?/3)+9` 2cHBp1VmxZGW?{h9z}l9wOܣxsI/Qb#y*y߿tƠdl GMK8*.?}r'LН+;ooɯ"&|ȩ=AMi-rȰti2 ʷlvгN[ =c5ߞ魳0DFݜ m.;iS#pyW\kV|\+ x}}Ks@$^hs*>dA !SRp2[2l|S X)|S] ~f3.ok]Wq.\Rw7>c_ҩ=CgkfRqVčh_'GX~ ZJE8IRƓސ:9|PJHrbmSXlewԙpKN^Mu+m8&pI,1 gr*xSRy]';K?[aH-=HW<>GӅF;8hi8y2Dvʗ'27)[L>ꉡX>cynb[n%d;w~m cdAWY L=?ՁAn)TJ LHZJP:['NӱBxL2'֤3Cŕ[bh1j[q̧L:7!!hQdUG gX¢$3+s0&jҿ4kF-H8_cF_Єmig(|::8|?˩7,#KĄ60DnDuY 0HUYgyN0ެ9ވvBK{1/i|P"^M1w8mz٪\-F K$\5vIP0>Ӎun!]Aȇۅ% /ƞsNvmblpO=4s^,<^T`Bi"6߹eo_#F0nw=МT]hf]#ƊizpKf`0݃Hr6:T2Qy&j|G=*ǍT-*(ƨ؁RztĴNR)0^1[m?4s\?sl/?[G~ l: `c%%ؖ|-TnBX3c5غ9"*:خ>*:&kaQ杉KSac#\{Dl5'y:^Kh]N]'# :5I5O͒stNDc=UC\zJaGz`^jJͺر hyf{@5 |N$ $ zD;qOζ\3#Qp\J?.LU(. Z^SiT=M <ǺAc^U٤ X_sظ@߰];YKHqs|/[;?uG\δ9r~qУW7!9ck~9mVX%gu"I8u3'FS{O'i}|#2`Z{` r$&.:Q@eH*Lx(THU')®;m 5 N\:5B@)ظJ*ߤ'72U#KuF=ڇ5KtY9TGG_ͤ{dsBm}Ջ_;ٚqyw^|WZV0>FJO у~4ĕqh,YŷXԯ'B{3LMof \WΆN4 %f>wjƭOAWjjMi6*)54U['C-7{~ &km ~YKuzKHKQM]첣,{p::;—},E$6# *y*څPs::Տ\/@P՛3)1?۬!Bwah\_>Gt<Trc4;BzV:]eiƚȈ9 (|UL$oIףX(l,mמAlL-w]ƯV8pމJucQzؒ;Bxo{Kޯ.)ލŬ7n z\/Zs%N#!efÓ' \k%:͢&lGrS+k!]$xvǮq, h{YW=dz:JJMC.::;@q)wZ::<|'u@ڵN!ǜ:e)0e$*Ux:_^6^ *v+mD$k8K-o.- ]f̴'=~z'.w|f_Z١XMf{ߛ\.N5juv͠t{ }AkmTX 4=]}7ּ Pgp FG&kTx&wQP̗dya0i:u<{^Mry +"p芑LItj ;[:?; :Z7%ImMD)j[7[\t13R8*Rm s&?R?o3gz,)@nQbE˓@2OK×WrKOhDFbqrC-%45@QPvb02a`7|h"/gBemb7t{H;#p>k\pַ@Q%94hF]GG5IԉmEWVgGemGy&PnFB:5H(zX[LB-qs2fY1wWeŎZwߧН9 v3x`6䟸8s䔆.ZЌK*4:);>U1'^m]; _ f <D?__$Qمdޓr| c˳_2 G`zZA"$_\P ϒp"ɥ^#u}p/ϋ ],]sK  rk)͘l d)6ylj Cu,*^Lںl| )^RXE Pږё]y'z^1Rk/mL|̣Fzކ}RjhC@oՉ?V8'g9ɐ촾G;F6ݜnۡKl9w uHŵGq2zɭ6 d4oA r;:ԍlxyiV(}E^̵MXDž(Qr-mzbpDZ.@mPXQqC[ͭ]=H-ieyLGA6tXP9Kfj\IX$tMʻߜ6FMkWo1a|{x=q$3CxI?[!s3@ B2n>~]\%7'/IhVIpZRINM>-'L쿵"K/\͇bPXKGn9i&IP-j0{GiW5Ҙ5HctJz4#9* q5>nna\.s?n[=o=xV7N("65gR^ Ee3{~C\讼NזHج:tr ߥHA4Q?,cilеnÝX (D+;ߛol3 w&}t!%;.UI ڹA޹ 0ppc M[L=>% 6-."Vf vͫbQoYٖ-MZw@  tW?7r.ߺx&Gw' EYM<[CyMu~G?ݮH@Wi߱]qЃkp*! j2t_2:r1j IKG2ѣf+04}ҿthf}'JcGw`q>b)q#oC{٠Wp1B+\}tly@R}oסe.`!Dg7Fi89aDu*IJw :$$ff\WB8z_7"c6ЙƏsYAo집4^Lyyp k!vDb<K*f`7?/lO_e_^'٦l/ %~ݸ% (쿾`*K8>_'{wP6|?xc _,+Ow'~^\ MT MWi}aY +v,[E_ $ew{bG׆e'}-LzoFUv;o+kyaGSN*ņfZ vcY9FKԎ`YmAwE7;|w43ۚ9l!8 _j&ጿ?߼Sg'u˽/7ao|/Bc "Xh Iezo;Z+daX8jt|䈐K&W!t`JtTyg=tPO* Cg;_;6]Kyβ6 m~6UOr=5zVm^ iACS)Xm,'?,uՔۻ;jp̴(" xjO&~Xl߁sM{B-}N%RHԿ$>v+S:pcJk闇`̽tRI wlfO6LNj-N(~ 7KYO9v̶oj@%7P/ڧx2f~&,ŬG{Q{Ώ9gU:@`Q%!F͜YkWH1| l6p"sNC4'25{{V2wrN^1Qú<_ \¡7m]€[:I iac:i^K';-MѾ`A;=Va n<3qW+db䡀ψ 6ۀ_{)K!sWC~ ߃gK] T\x'`}Q|U&vXʻar6)r^:Cd (w5.Zf{OgzrKns"xrL f* eitxJ1jtd'swZ>tvM/Mzݰ_1,^ړ 6_9['W%#G о*!Y :;C>?P7ֶډȣ>2S;8ew2'v3nv/'IcA}({fK<"Tر`,;)v"N>}uvQa\STSگ,l6hOBGQ+@Yj쒀5vjˬ "Ric;*< rpLgj\gϝz 1kћyc ُV˺(ް8'ɀXp <bțR~eBsG( u\TuLJs G7 {@s+kst{':; q#Rˬ9ʺ  ( U""ɪc:0M4*"o҂$oj*lIv X~݋v_ӯ'98]:c D2N״~ϯcHњ9wc߲zlU@r}.Ri&~f>@VMJ 5ZicSKoM!0+L݆故 :iQ_ CUIkQ"7=A*7Z۶)^cQﶢ9cPԻ{:L#MoztkO=QcO&IԈyHxoES_b6وxXvZt"@q[n֐.+rDިIMy_ Bz :m asD7>ȩeGt6\9QQث{TMk):]Wr NzZ!JvTS"⴬'Ι,}*HHMٛW(hb4؍kIbk֜.mT^6~MtCNIsZ(=U347%9ʒ=b o&2a!ULd76]}DZ0\C5nUyjpipٛ6Ǽ?WxjmA'꜠ՅC3OW$dVŬJrR7N$z!fNn+{=3VGglid_:0;#X9GD{1q]sY[?O}#67BI;spQ{ 8eɧLYТoA }9D Kui˱"MS[dmyQt 4bO/z-^螝k5>Hkf6+Q MRԥmczaF"n2(sm9Yef# E"\UI9$o3;zQ闓o|9bdnpo)-4$ Ɏ6I+JsmH{T7f4qm_ Q+[73z+* u(ůjLI%7o<q=yߪtPPԷխᲀdnL_>B>CvԷt?}bB~8i3R<527u _wu|*u[Nޏzl'os8< L'yGnqrz` t.Ou4^i$_S!BfŵQcMta vxU4io(I4D nu } oO WHJCo`bl v>O-2Cu-P{[@5X^rQ:wTmRǞV;  [mlߵG9IQ5,&Dz,}u']+ +D^nA!m/j T Wa:ҕΉШۋfȓoqSC~hU@RMK[mn5p$LXBۄ d)B7IY 1P*`{2Rq~y&gW&&e#,Pr,=h?Nkktӻɉ ۯtp>]L"g aUה>?;HD6_ܤEDHTDWZ/b6)rɈFX xs3vNtBG"P#A$7\;d(H=.QN>ȅ% ^YI]M(wq g d3KnLC:+u FFt I;aZBLAs,!݇IHQˤSz@:BV`mpW;1K[\*MR l萚_<ڣopv0|r,v=ѮCHW=vu~@wtt}='i:-]$=6 #&{f[Lh5VAL ϜTo֥͇RhoH9L`5`y놮^;N"Cg&)!VLQ EۡP|`n4%J#`7"u<|o:z7k+ ^AKPa )+eOp{p yӞ#(I8"@!]K:w5H.5Ұ(mj80 9_rET4$t1o4Ab5 ΔDՁ .Cg!#Eus ʖe^` <.*jeU~3r3%s s0]hΖ3jH~t/@LijLh!{$`7CU`p 1}Fڡ*ޑRWGjwt~MvGmp' 8ODkӨe4gmd$% RնZXz "9JDY8Apw]T0p& *b#8 Yvi%tM; +gD\F?S13F[a DAT>N}8R?aGo@@%}DR]yHHܺqH(pU}!,= )?J{8#YuL"xRy=9|4-Dv#r@4I[^^kQ_-;>8ݱ\;v ^!_LUP@K({C0k G>wSa=eARX+h@DŽꕥ3]5uqP*RG_޺` ˗ PQgJ;_C󳂝8R#Z)|2֥t7 9MCΝAH0zrmJyf_:u#Rp3T_Pt ]x#1u3ҩoi ;lF2d7faꩧDCJ(tScTpo  [tzm/WEDEH.njjvdE9{; eOj yHs-(Ͼq}̮HK"^$_ 9 }ȬjKD3֎oIw롈H$QFt ,u m Uc_u(4=3>MLoULuesS|D5 HP&ˮ2ޘԹzO_oIܔ*pgcr]정>6=xSEO7t"?{5QJEtCH+4xSCHLQX<GuB#"KⶹEz`W+NLJSE/]!"F% 3u̩ݻtCrOb bQnZ ;j8ecmlYC7+lnQ!n_}֜-Az g]ˆō}9`EUҡ/ kįG!_VȷJTCU&+#;3.='11 d*zv J'@ L^\sEO=Pѡ:&*Y(U&і bc`@B:g{$<*#G.GNJW{ i m 7T(JJIMOwa8R v^ӄ{U/ӒД.cWuQB,B)Xi[LCtXbGRAeU. Oz& weVIP_8嬭}m}a;BVk;@ɐ!Zچ@6s EAQ +{4c[Z _KJC;DP׬bl<'2+%ިyXhX04J#)qؚ,h>d&HRhD>'HgY R7۠d(mg2: "J+tRDj3S鈴qޘ=}mk߰ Λ~ >]jC ”nʼnin 2Ww>~Ϝ|.sT2 m 0S鞽#i}cO3&kBي&6z{U[$ѬoD>Ӈ#c|>V٥tj{CL dƣ )u'QW_L+׽C|W9d$)Drmd~+s$Xt JpJ8|rg]IAKz>ܫuX&%)/1^d%xz8R6 ]v^p,|뮽zYT` Hy'^;_cjUV"+Q;$NI46i(Z+U6DRw$J{@b>=8EXr|@M"m }iƮX,1'*Et5v_U'i?j XMT¨(E+(-['R6Od dcTLEqt!6D(yBX ᵔRa}2*FRӅZkpjj줃v"j+РlUd.>ISr&,\պs9]Qryʜf;:n @>9}}3$Tv^z{~i>U{֙u̿Q|-3PtXfpSiW%4Gb4m gNk bxО [4_@QňÍΡ>,1N~ޓ ,>/-q `imTЂZlp:aDcUZtznF.ʗ,Jw JFm*"V8r&^jR!W,^cC>Ҍe5~sFHG_|/"S!Ö@]^^#֌wF(i䑥uhR2Uhi1M*FDS< -嶩,5c^ආ<.j5؝]or'y!!@nSee'Sz^MRN:ВerglT;Qۘαe}ztXV/qg:}]Wait@W?WLn׳UIoK7JEE]~@G Q6(ݢp>ױU]mZOqL~f*uuCáV(hVt-rSFk8_Ou *cg52JQ%և^ߥ6sۂ-c׷>^:Wb[FJ5s*.ܔI'֘x+vP6, 1mi]N[].ǘx =$ 0#+aj חQÜFgSmWVCn{TYt >|O/9 N[J̕xRO$uLnH q q$ HpRa6n1Ii \0+/zw=A1cOdѡ^_.>MO?wQgaVOCy F{C{(@$A>CС% qus]ϴ&Bƨ+Aw^5 8١Dcrw"䤀ylLye<}8.g~TRŽDt]kk\8ѶwT~LSEgn᠎ޑ$ﰜ5:+A׬]L!RkCj&o,LubvE,_^`\(Wi Uľi.Ն:=R nvV:p_ ~p@NWr& e{٢TI<@hto.ߞQ﭂>k),DlΤKwNMpq|U| xq`9!B@`^ZSDv; 6(tW'W|32qGbO < dJL#W/idspƳ馵oxIxΎƵR_6UOyeG}p&5,S:\ inO מzY\k:@<1#BYB+[e@b:ʨ"*f7y#ݭ^bAEh/v Ko$Ʊ0m(EodLb"Q+xQ7p3ćع3 b 7uT +s19*`-R(0m&]Sw?l@jlޖ a= XQsf.ac|~ w}0"7Y ׾JW=ʼ^< c7qyOgYuqDoO[O1+YOe}A:W^ћNBn|!a Ljim"gxޖs& CC+;: 4>(7Z>L#n]>oƌe.d ܶ dda]܈8Wu5Vm%0+OFĬRS-2ll7uqnGE[/ {{fFlJpXтl֮J= Z_ ǽ] ##ei%_%IVT\'X.kj5Z Gɝ?d㿦ԋaGT|T.*x1]٪{w#oI de!V5P:^dfk6: #sۂY81U4glMV(2w+jCda+4܅ x}<82u`<,1J(&~([}i͸~.]\,p;+Y0H(fDnʬN,|]KU6탿rVx`{Fw,d҅SГ 7әΦ]!1{61[&`:O7lr.lG:dY3/dv_PFl p P;½\q /o\hz}arlg+z 'WQTn.]Xps R#(\^v qǁww!oԯF" @̗y~p|_j3RLA\Sq"e@XНS_>+U=~ }Yv%~>&;<rܠ؎g`$gJL rM䤶,QVp{ w^[hs:3'{K0:gA pbGSvevnxؑ\ sfyL)E9|Ҏ(Ԟ%~>x8ɦ2eY#eY Lۍcq/w?$Kfxc_ŃM-'y&zYcBSa W@sL4p  0(xH. sXK$ 蚼}{ 5ǖ?Q7A'W,ݹq+KAxq s™$K^B!o.{-0qX1'ܹnCrqh@>ir)#X~\%Ux $*K ۑa2nB܌PiMv 8c+t]wcv _fgroC2D67ρDrc%EM0\<0i`IԷ4xF Kyh;KK%{jum$\`@׺&cz'obؼV3w&dieBEN!6ݝi%bWk>]ˁ +ӟ{Dz]n4_.r /KsD$9:mN=^QzhW`/fs6Vjyk0܉:,|H ab(n,T%,Hr nˇyk9daӕD9zdot  5LHҿ+[%1LLkY;M6yQ.z1g3.~3׺ә"(Ӝuaɜ,za|o LL&Nav8t!XE"3GOM #^Ҁwưc̸& |Ԇޖ:?\i-'MHxCN%<^{ @['Io$idvKPrw8k"@|r'_2h\EY8</sUωn8֬ul)͠ysW&0b놲1BlC0%[d&-kK6Ygqb58UKٖ k=El3Q0\7]rgOS ZŪGrF=qA1{vu)$l-XaKSmLrYS-nbHjϥ?#UzF,Ú.z Ӛ~M^# ŪF>Kr^LZdIȩ XZ :e~yKԅrgJюx t*O,ki8`6!Bwx2̍7P 8iWv?ŐVAgė>C^肇:+?':]81p.Kwx3é''K4s歆ŧ*vd e!Xjb*,kiTduˉ|[ Z O^3˪z8G7'H}Y+QI=f5uv/g7T+2;blV|Xruyf7գp#U;lZt+3q;2 whVݭ͸O+`EwM5EL ^]11^5/R3Ua[AO ] , QPBR[vRX}RK9,vVaF8hI l{HK t+<`e4c$HiH^͑mj^e$ts"k0s8ՠ2+V`؊>^O@ #;X%)[p[@^EV\)>Y0,#a0PZ{fЬ| hn;f D9֌e2:b+"dc> .g_+oXz5؋ɝ}Dq 1py|z+TK|^Cᱴ}O`=zfB<)“]%_zg<Ŭ_(߸a.8ӈ@IJҕH?d ((6)=plM9`_'v-1O_,pXgTƶ'5ֳ-߅q w aDӉۘKU H4}1$-j-rKώ> TW؝xL6eТyo1"PJ{[bt1p8NZKьi·iMĂQx5r<~~{㗝'7bXP1>` j >ۣbVJD2`g[(#ǂ`m 'h-(n{z8tC\ "`UY%9萤u6cZ#*ы@Mw&4?OCo4 C6Ax`XkgL$ϥHwiRHv6 XYFyY2 29:r6p Ee^ril?#c/J-w&_Hh q_%[gJ|C(!li$1|^ϑ-nLؗK9/Jc$&vُyli?Zi"{~ xEhn\ Z[gh>)R_o率w,6OoG?J0Uz DzbSSCV{(ޜ?s3g94i#I} ˸Q;>uTgiTfr5~ja c :pߚ"ABq喨ϰ-E)3D'Svi(/MmU}╹[/\<PQ}eOqG P(B-LMG J9z^oH;u{~L"?L6I~u}.s0{Pu^`PR@x2rB؆!.t3K*wWϲ P'YnzmJi0 (:͊S6_oq?syHmmlkP/IdaOySpOBӫ-L>0 PyBG6ln~mfT1uF$KT:6~Ns OϢ (ԏWXZ#3wPؾr~BF~ڄzh#n[h7I_#{!b(qYT)aߊP BHA &n'M'3vKʌT<:w?$!Tk}jQ۳~͝g HԨ3w48,4=;3Ӝ(:Of3g\,wF2R?^A󍦸~!?hhGB(2|ꃞ93u]g Q99z5зHzGjߟ**+$7{LCADjpBnTMȠڜRfv׋2hgP}CI3i ]A_Cm?tL!!|">dNrZ!z+f"9'~q 74Gl({&TO >S!ٹ<PI>Χ'P@:2Th""-Tl{iwœc6t"QʛW\}z>21+&' bGpSt`_ϙm.xYVDUE7'[qݭ o'tAJ7)tTQ_sb!xO~~uЌ܏:O-޷wwgp.up覨/'Ҵ'KMMQ$u'4;(<Q >/tlCooQ7ot8luZmQ v)kR*:_"A'3@pm/^l*ڵBfvt)M fOЌs# S;n*O_ԺtDSm]ԟ 8)5ݛze8OA%p ~F?dzT3vVNΎ|J|fԐflA:O$5dmVin)FSQub\ $d2~oKmMHI*%9!ϰTQ9S/є z'ózq3E?KnOM*w,~:{9ڷPH- - p~bwZh!0zF&}}/i 0D)'2}L @SQN=c|O:pu}+%. 9A%}Sx|ä *"=Gmп1/gG_}"? I:|K: rZOwk@gYD᩿bn(f&&}?)@Ґ=}ڳY7 OTLH=p*C>NSz:sx/(YSqș`:&ӏςG$d KO)^9}l/yzP˯jR=k1#O B?i5 nY?2㔭sh绚qʨf؆JP"ziG/}"{ŋ||o4ٟH%7#S/{֠ 4вOr8;r#P[[ m_4 #H -__l,ĻHx|^a{|va}mf8f\r4s> bRC]y'~/y, 1gho+E!IPm{Ӹf}7L.2o(s5og37CXpf:7/knL̹o{LJ23ۼ>3sg{U7ni8_͛[WDǙF[u~")7u/4=Nű$90U;2rR~f$#N6hk, ٳ?>ANЎ5 |?FAzI6Zrq+iˊvPb3U|bIkr@xLcXIH07½K- eLx0Ѳ(B|U 51 E6+JU Sm':j3ny+$ݣ;ZʉP8+ۼ)]޵Il^U9E0ba\@@<&}a!qN6z&y#u2 slngIRB&m.lG\wǡA PNn`%<-1 rɨ7،Cjltr!rn|wvX;;Cm+CQpX+,{$K~۵0v F#ƣ0.dA봞MqǓ ±  B,͉y SõSCXw& aA<'&DI,?^gWd˂H EP8B(U/w6]b9䳆841zD6O;h %/R# u1dDͮ`kɉʪp7UweHРX9aN)AT%\Y'&eGI&9[эz5:N2"3q<ø$tKCS+\(o\OvܝҰuxk 15˕H-X4Y&d@#JTCrW[R/ZHXQ>4M?׼?ݙkF*ciCVҊjK|4 oYu1ǔGJ#5rc&(9fbѡyu{Tdߔ WJ 2l<F|ҙ"t<\ >Uбq uy>XXBv}Ol DSS4#J A23 R9dJʬJ*7Qfo=3ưar Ǔ>b|@_"dcnN(kiHLe7 40@ g\W O1`%B!qpJNkLBܚPd$~ 0&-z1RtkFg)h08ZmshwED-} $.aWWȨwqq̘ I zx˻@2Z{#"N&T%JpkÇEjLȲqF@v_1g֜/.&W]B{5_LI rQΣ,ݙy'nF<֦"9Utn.F<½젝8cC3ZiO)][A&'p8*xM|{p1x\ ap_,k0N9'|R4; hf ma QGՍS1ja44ndC,TtVǃ9EL0j@Z UۭUZ. [ziB5o߈y/YzU9hljij'Ut9gTqXmYKDAɱ J8W pJ1WJ @W5YV/0h`ѣJJ;1 vcA206Yvީ7MZ ^S`pˆ| kksW^|]˜3dG !KjuŋaTUS'g^+E4̴SW ǽ񋕚q@DҒ_X5z /r:?flM|.z `hbR3Ҍg4hC 7*vWO0]$QYqEI -T&k}?PK9e4Erkua B_$vM!{TkH\ɷRR1I̟0{0=ձdATJ{ yp]XUj[y<ʦAz2T[$s&q3̭<vͯj]%PyJpk5a1TF&.6HjP9{k_ņzWBBw*ĉJVqBjZ {^fݳU "wI0+'p!YkV\Pw&ba7NՊ||>=Ռ8%1F̎1Yhb5קKbh='%}$LZɥl:MhK3k|-PLS_t/j>toVJSsvX~h T %1 Sp 'n'c@tzjAF3a -\88Ey@ָ)>1(:-ď[b%)e6 lTTZV$40Ap sT9 6ߏ+#iicJ2]-;zկmieѵPA L o<ga{.vC܇i#va8)]@5\'AdyJ8]AM8ZS\jzڌ͜AojX;"mĹ{_nP;bVgPBa:*4FΖ4iX oi~oa37ګR͚Al-,|H&8j ٻy.rV<))U@m.F[\Ԅ8y ox [TiBMggA'ճU>_ʞ3 %vj%ȧ7Wwb)Q(AP0KҀ[q JzӴJ{(2YPI'x/{YlH){'Q߹}5,wXhtciH.cj$ _{9/1e3P=fDn#Q$RM)7qth?l9AyRHmẘD> `-)G,svW̓PqKȿ1[K"Ƈ#]ȁ'W٪s1zQLN6]X}$52X+)FXvL5̳b9Xm9٣{W]$hO`VE eITbWJnR_W=,)hvW9Ӏⳃ/Pxx+ r% VmK`,UeaWꇣjѭAF,,?L{8Q#aE%S%,?E˪tKSՌl=԰3My~EkefvI(w`-4DU/oQhP\hOޑ_,~Q*@+7HFW,$/kMԎd0}ː4J%W/0<|1b~#p8W=4#V!đM;!mT_ah3:XiyKWē5yTnOd6*Fr`SNUEB3obL3uÒ? -j yE}|EnCYq$~k#^\Sǜ.vCŖYN=3֗YgɀJ U =G6.!A3x(v만l|) %)S_96u#V)Npmn91-._ ?yW!D6;}k)c?h!E[4B7MoMʡG[ WX%v9˿<^0+!led@E7}2r,9&2 Z3E40ߡx Kzo2?@:_-߭W_M>*qJ~\mڄ x|PN@oB4'}|ᏤLr?C3N:ϵ:KmSqE1oʔF ,K?FfJv)|=BF!BKc[ ,ho=tGTMڈEڧhw 5>^)ͷc^n1c=v~!ǾmDo>y $?\<ئNy4M?&0ę/)u "v @jwzn%ðTCa7nyr6{{J~F sHmB7yyv@HtMiB} fm a/nM}יP%NVs{#4P 9#i}tջLù>X$Yklyi5#Yxtr9l*-E33)&6%~S8'Q  Z״MIr Bul2e+7R0ԟ6 o"aj9Hbqf-N^|u99NIe$,Or$M ]ivZA?o8󜡞s1l487J%)?"r\>]kLdz#jhr=Nw^"7SА}|y ~0g-ͷ':XWaiCQdDm{_/(\^uͲCCuzzBdU<'r]DEu%Q{]ǪseXxr E?k+KI=d=n4m"_!DN{4bhfM|?ȱB<<h'd$zo[lGbUfBXI Щ_5v8Z}s g=.S ^kh)$Ti`\d{I{lu}^?uV 3ʂ7xfP/-C2m656kL{ej@Nմ I:k.$SUV _oYӡ-Zp/G+wpL`LDfy'4),:֬[hTz_2^_ *3S0TAzO xUH(4"e>\wQ K essO! Eg^$țnad>x@И"n"N(7}e8y8d8эy" b^0vٰ lfS 2n yn<$s3;FWܔ׍I0e q- ?f]A8rdfnF!n `4LlB7/Acy5Cα>8b8AἜBF;)73#ɬg28+t162t@5w^t6@/YD35a<[ fOh7_^z-t/Wm=7yߤaBPu"%-1w^J,Z4bh lu4I'} ğ Љ!0h Zt8%s_3HT֍'OT8pTA&&iIِؠx @rrXʰ[f0\n5^y9#ܿB[R]!d W?'ZLŨ605 ~:-Q~=z69ҋeM @`b4t)[F0ig5ҠȼSNOɅAOr'8n^㋠uBlfOMk1rVBjNpuıSn-.4}2Y j¥VrΪ| 40VT?MhN ') 8i ȹi*cxK)⏐S$=uk2!!j}. b['Y_hrd6' ִ*xl}`7RimP`x&p#̐+8*jbw[91^pxkOkg3ɐ9o :n_Qc1ÿ́j뒱ycmH3ҁL^*.]G\=,5d=5c]#}D*~vxzxt{0 odY; \Zu\A+%S6$ggh2n3<4+jN!D. =MGA@%Y[SuaX !]te0zn(7Rp4߄a5$~t?؉ C_ CJk:]5My5^&:TN[n A{Ux<8oiw%z OKʰAHe.vEؚ%db(K]4A1Kp▐MZwYx="&yt^ykUz lW+(ҸpM96Mٺ֢ ak&]^2hO:!\6MϰG x%p29t/zאnENeCcq=agN'  y2E7DJP 0h0xyk4c^8܂VMM^ag1)PI<5=O4ie‡,fz!=9n=f}̃t|>"ܯB*;c8 w=3` \,cJZxwz3$1%HcsVI,/$u$)Ih+]aޝH';X2=鎦A} 1)dx29nnk^WJ8Gu P\08x2$B0^mS ᵜ&{W d": .Z`" xCY\ p+͞ ށ=YcxBZI5e9kdΎE oZ +:/&*,-?\J^Y&-<4]IFyZo ;MMfO`r=]Tۏx+| P1;Dz'*e_CűH\Jwq|B5?vCZWÆ((e+֜Sx_OIە+bKΏ gxpu\z7*y2;mk_y-fB4ڡ{ ˹*ll!Dy[v~ O+=$ [NfX̴\ɂmplE51bҟb9Aw[`M ۱$!쉄>rU(@=ր 4nlJXbsŐ_ymYa#l4קG D܄UJI(Az "J z 0]԰D>D<< HSc\8Q3ZZM^w>n:l.F*>kiw=bgF33'2+db(QrW!LEGH)/#?Ɠ}=5w0 8QxzlLJ[MaiJֽWڱ'PeKG|jnG}!p("%[N9! \v r:"i6j7Eۃ]:G ![ DWf\`(3lK\;q Rp2z2^{#K": Hل<{,ϵ+c K4^88[3'!MFc']Ē>d91Y4T?bsSBM2k] / (ȧnAI jgz4kOj5 M!&bwIA&: sx}keXx1طU7EuKCLKKW(+) $\Ť\w$v a4r#= qfMh; "G VS"HSA1 "k `KKc2*ötNj%L55=z_}Eڊ,4Ҋ_T4 U68rBR1V$H*C{WvuU8CԲkTamFEsQTb>fTce+hVYTJQU 42`Wpw/67ʖ.F'!s#-r;W$cR۞=&={-$r OP  )aH}B&ee h^VF@w R ΙHZ(3_čs"a%ZIiq|p)vvyLE.u]s:xK#l,n#_H.ś(dIPuzCǍ%XY'C3ȇyO v/t|ԡE%*7Pñ{ وOhҳـ 7P@M4Qus=́`wX3:c4ہ 7 M;K3N cjt :f04Ɍpy\1lӜE1:sؓ%븜^-hU3r"'mwB<m|_wiħ%{QǰٖfٝvPEK|?*(OGTT$kI:s~/`!}Ivy Տ'%kp1w gHA{4Fsl^=pXËԞ״߲" ?Gm'}=֩NnV(+ O$λGa+w!GNLiiK 7A|S YVJaFQڣ|z\CPkL~A'K:Kk [S[b,S[p7K/*&3G 4t3 ZgK`@P*YR9ZC Z[ErBGFkz0iC2l_Z0ň|RM(v4EM^H9MN$sP-~7WsmYHBŁg8lF.9] J 1'MF[*B\DO-zTet.3 40փDY*FWAe>g@';xGUFL-0pF+J_[b}k[+=ngd.ZaɗJDi"OX--)wAmXGgx@LXGY}p[J *_;LCKA`&S"m+e)ԢEt,)^PN$ lMpT~Oo`Rkٻ)? oQ!r(Fؐΰ:A¥OzZMeN8) z&ftHxq 4osL4Ɠ) Z=`޳r2dAZ?F@2ha5k&C)iJQ!rT >ȹ"!WJE9aDeP^6lJkndqk 4t!$<_?ݰw~ /s"ڦ$DF&סaCK`1%P …ywr{5eۣlŠh_05I??CH9U!œ'z2"Ob-WX9 pw.aUE '[?KFa8 =OȉWVӮs5q2uih`ZHj!#1~rarK~ržGrTѥ) VesÆwpC - N ` 8uD Fs{\\nCˣk9hYy)fYι,Vٷ.z 6Hԑa&ϞV# +.RmP0]v}Ex ,^pT4ɂX G+k*\++I!qzPRSipi0!e_2f<}*%UD`x KJF߫3[}ȤGMBܶ8g0Tqb*sDwT稈VOx\,fBȟqUr$YQ{wm$J/5%{qəKde{èejn&8&;{(9xgA`kUXC,6V%,}3|pVPhʔIfX\bGG9T' 94XhRGpE":*m3Txtk'pm7X Xꐟ-ʬmJRKdw3kb%@x=F C+5&-F,0,jEّ@S06kTa|&חBK^/bWbe-1~ɔ-f{%I*B.08t%0dX%.n⥸3i i%"qk)aSIâ!wBGڌ5lZtCjѪ`SM#lଧZv|K1|w&bCDBHWHP_x3kWI*˛w'힜9bga82#h ƂI𦗢#f7\W^ҩ 55 ȵ,4򤒁qbG!B[u: Po>R>|8˺Qdu3YphvI0OJs`D{"Yd]'v;ց֙YiFzTCm3e.wX׵C*a;NeZ~WoeMףgVc/oVhNy1 .L49NTq VO嬄^;sǜ_˭‡߿S= 8MDQ HưqF۷7D\ ?iup|7LZ~ ʝ ؍K7e/!(A'3KzG\|Z)#Pݱl6%:i 5kq l"`'s4QS JR&+rN|̮)bzH Pͻvm0ZÕ Wpֺ!A_l,<0f`f $U(FzT9u]ؼ}d.('|;6>fJȦMRdo*M31oyX<랶٤@ n&opFLRٌt͇3 ie=2X,N1~ [RnHTKtԈFnA2 UX9*]tkc뿙~ʵtc:I,)P )4~ VfP/j28ip;,(%P`|as?o] -%߬3BpkOX&pnV"hυmY ר~dݖ /]WZ48- =`g{G~8S6XUi?_(𙵄~(tFgwcϜK_;.wԤ+xhIlvHʀUmNty%Jw!c*aQ7u"e7ξk][ZwYpݴK'';"O]Zz ᖩ6@<*!1 :yU[|q8S#%,>T%sc!g ־ONz ^Vpъ(pW{QWYe/ 0${Nqa;Hk ]w0CrBaHa غuKkaxT6uqXtmψޟ>A!zb]LIbĹ8|VbW_ e~ޠ:te6SF+nl֖+K\Gq\hg"kq/,&#N5{ܨ֡o|9ٔ *^]ܓۿ @<ãd1w?DcBI!;JG掫sG?,$Tw>U ߢ\O 2ıGdFwf2\WLI6KGӜ|X(+[wTZ >b>ʀ$&6M->FN'j|qGX*\~o$`i>?g19?|F%,q4Ŏ)qĿ_**Is/VBqbmDsL?xQgO;giL/dX3%]CUOzZqp.Jf~FS\XkHxu1YΐqZ-rRaG(6XMW]9_Sq!,K'.oqgr?wy9?>I ;걼u:ivok9e-ռ$:ÿYS1Ķo\y䟿(X)ק BI6I[8TȊ c܏^W>[?'c\c/댦KWNÿw)0}| _=@/w[_}Gƣ4;?*S/zr~Na^hoV[}Rߕ(BKCZf{3{iO$.mmJ|My>xާOpPzR~6t[LZKo>8Di>듖 K؏zZrXj _O0qP8Ǹz7};=w&xp`E?qΛYS*$uBF7`UdNP MNd6!}aO0iğNw,Ftz. n^/?"Nr?e+wBdaqH%nu{::v߽@r{,~cO+]ZV|oVutbo$Qً-%?;>t9nrk2,YbKJf?3ӝ3Tl? A0B/n׀6;Y)ll_| ?}@&:|^ȇYZSw_r7]ix$r?aߴ~J|]!!}ğBBMńEL1"՗?RW`uc.|"|KhX%5LzNWSiV 9W eܩ}ius]¥AkCk&u[PC .٬UPZ>n|}NMi#uA.,՛qSf)δkWp3ێi -[.8zv-b&0e3 F87 ڥZl^k]V,HL] m* mʓۦdIJD,zzV80wz Xf^F-$Y FL/Q ]+bQn'\-]2-c]}s/m4-o/w2NF%{PjxF aW?mjA`8JHӏ봪\.'d³F?ze%BlocєIJTYrJb{^(~ $gd7@OϡjtcBo`BR߃C8/l /i F st¦$70@4åݿuېZAl e,8(8 KF1V@D$Jb!6, I Q;]JCt|d#&'%Ў8f#[*)ؐ((Nۜn/_-(WNoG늨.!Ɇ[|ɠ??[c5ϸpGiY70 濖d5.3S-5u1ID>A `N]ov#-Y\t&LDrjLC`'hWpMpcc &DlbiY$R*KBRŞ6Jʪ* 7Gh8.@ӳᎬEG3-379!|5&l|W3p՛85gYcV<_*y7㕰AuIK`v5‹v(J $Gl{pWyܑbYJhi+O;N @E^4N@"˛M;EU5U̪L(۵[Lk* $ν3C%o̓)Lb/Na? z2G:iHPp\ɍSɋGH6UOwM 8FsЎnJ?xh% f ^>SOBw36X Y;S.}؛JAܛe🛜ez-eOJbpX$(x3׼%;r )QXx9@Z샲ѷhv8+# ͱ.%^ew;}a'{m|.>謳RCqt=sYsIs)!;"͕כ6{?*C ;<|w?~"s5+";L+ ހ) b1!О`}Ao4i&v\7 mmpo0-ͳ(":"PF%)+{E1<䡇U~K\P #o+5g`JngKKVOuOUˁSk ?߿ô~)@p`-q+c2ѯ ?}@v)@ WTj,~^dA1}慦c^O/b%N  5A-fՂmvU!G9VQnĊeKԄ枧O)4>+mVk;@T S)CtP8{89FYА> w7iv B )Ú۲yԎJ(%hEb!&RFLxT}yNf' N޶B&7x)9{Y<"Q .l5Ѐua3E ;7@UoNpo1J+Au(Pc4-k7o~߿+G.q~.VM/a&K`6u>}wМHM l٪dR`3Sid38=pEp jh]d7T{Eؗ2\zF5lVD9^agA=.%nl2i$%*/Fe]q$.[E7Wmo4Wi3?)V8狃3!7cYŇfzGZjxI0!A)_oxbؘ.޶+'L*jP@1}0;H:~I;ōafՁ ]ȣGvUpqh՟z<'1HD2$W7;3$x' ]=i( ǏǬQ%G]$w昽@Ceg{$ҶӢ~nZ/($j+{P!w<yև!3Ncc>7 嗟̪q,JOA~.d_yށu~#7OREwrƒ>JAETKTt46 I\mi:>=|N0tļk^+ZUs.yT&@ynWB \^Hvb&:mk?(2?}a?{kZYXdlQ ٮp+;(9ErzWPLT`."D֬, sjX>pf9"ccD6a9qp1'́>iĶV-qx'!3!~X^8hދ/Ĕ1ζ\yڮ4bT\7#Р=~k~\[O@q@p 8׼ xs0gBxb78h S+8G kBR^lwAC Ƌ8tTRvpf%,9q=h=#wR)A>9s' < V Y~=-[oyu|Gwx?+wPAiW"fKŠrfGCc-W:| + y6 qd$:S]o^`58+*9{j&D9ʚ=뮨;LVOuNKD~4,vw&8ػsiDDrhU٢Fq;ڨK|Zj<5E$'u/U=)1\݀&y:(`K`pU2?ܚ#:k+]5pMH`ܶߞW|ymgbVP]sU^=HKxvFMmrϲ 7`P"E&St0 0 ׊^[X%Rumo X"(j[81$3+h!lƮN5MC)Ϋ5wA T!zjCd06] 7!%obdΥ;8*ź kmrP4JиNAQ>'s\݅+QU݃ϺU|s/EHIO'8f /tIT/)M$< AgG KB|͹4Xl $bO9m|F<5WveT(B_o:)A҂ϖAek)!3/zIW x1dɺA1*׻n6o9M~hOs> q*n*LDR^ d1U uuAx`VАV|F{ {HO)0Eh7F'bYOb+~A,b,,GRD&L擨BlAy,c=S5]2y9\@= Nl4TgHR\H>6X+ԟc7 AD݊T`C..YGһnnϱ[=W1; I(`pf&s٪GsftuOpCk"|G;+p+$U܎ B[$!43Z㹵*wڀx@Enhkg%IVF.|#K g][`BJsJO .%P'6@H+^ʂSNA 2օP5ҙrwp r*_+dwrw+ 30xLqɌ^V LL{p=d^.,zp@DT}q@K Ӧj`֖:Cۨ jJ8`/9J1_er6=c" |rNZԫ}R2ڸjV Eo?1]n;P Xi}+w6 c"&+"nOOfRxk v3*Lڷt)1xA%C聒er Ltf3lJ/͛Y-geFZ!bj.^,Ш^zu9+Pž:ra切mL#yJTqQɶOW|ѩ;cGS3kWxTj䭵c֒\nd *57Xޏxo7Sdcq[ERibLg`ڢ ]P OghZEa%O:-̮,z=Dؖ[JSp'RYgzbCm&[zK%hH%̎Ĥo sc5Z^3 1A-H#^t |-A&M%LEkB^Š wPs6.'ƅ 1U h;y+p#[P U}F7!e, O:nc`MW{6F?b"c`KgM]L<rEqu=\1'SGcä́ϛT9v.k/[D07aqv@6" )A7))ђw3ڈ0o݄_Q46W{SI(yԿ5jJ)8N++3Qтܗ:G'`n|nptOK4&{zӮbdEO4oPÊ fbW8=NK׃_\CFc+n6fQo-#Þ`~wn| FV߂ Enۂ܄[btŃ ` [\ \I>3($c$ݺZxO07CzєfqTg5oRftr -^b"XT5-`ͪu*S#C d]*DDԤ $Ӓ^@ϴ'\u˨,cYLdFlzQ1k0K_ܖv-b%%Ύ~mH;& gBJAGMW #Qwai/kD*nFdy[JﳭojaԈLDt b"eMrؔu"܂Y\w@qPr#Cmy }HqgkGlo7&y/SL(/MyDF+L{Ȋ"mQMVcuz"0 jD$߆io Y%T`jءաI163R\oL@mђIh_Л j. 'ƥވn$RReKoaa!N8` e nbo[.Pkǻ5õȼ]/p>e͕kSkL}cG97@4E׿>Ie~@79 `X 287gG eo5ڢbkV`IwG-^(l;k qo5솢4LcyVFWN c29LPbL ì%A^ha_-?%UF H s}.ƴ {c!'Tv۽EFDU3^4`D%1V D'Ol-twCid bK>D#wvh|+cׂF;X@Flu0V X`,Sm3Jb^;Pz;;K=0D)U")O} cծVrRxRֆN)1=3ew 7iEbHªUKb8$}8Nl7>7Ca0ruqUfDzfݣF.{ 3Pe]N!yefGc(U&ԳW$Kt̄9hӅ((189^ pWGU'^zJIpJ椭-^o ;Gmz&Yyؕj{JJ239kdR[FKMY.3sG^q@ x5*}X-(QW"%N y{/6 xz3Yu-—*lI47,mKoKV'Ri=#bJ/OZR|v+> i:U8 :{}[#2Ul'>X;Fؚ*$ Aī_UEmf*A&EVcJv[tR'Giüa*c} Xd%忢Y??yޠ$n*lYUg)'DÚ` XϣZ){+{Sxu:5w2zG ,MMc֭uU/7$HX.=f%W~bYIhGm}9&x 0[*R]BA~Zz͆gڦ~E'{w|Ŕ 2âQk ڞzT}lkf;%u8t/(nn$IfJx(m j55nm=>d2R~ %# rdwR_oK%qq?Bm, >7"q"^׻{]_)nÁ\ܷS-mMK*cp{{ʿ~Jy6|5pȩ(uyH]*weѬ{H:T̢~&AaNQN mvҌn޿6pi{u6Z2upżǾߺ%~M Zc@m+^ok=l*/JϩPumjnr H:Wv֍Rj4uA4,CAK k^5&M.cws<\$B&|OdK UqNރLEoU+chwLB1[ mfSFrV2Lb*2Z$ШjÌRh&CǺ><SZ--\bkdSKLi_&([krc gė8b~ΚπGT rLw@ w_$\WgF%S]b(>Aqݗk+1#[O 3/i5cUd1}oE!?*D)e|#o^Jd 9BFBhW|da-^ʃq־ ey(prD5C_ۖ֟4iFr6>sQP^VEd"u^j5,f5ߒ3wtgyc<Φ&&RrofaKo}?Hiİd.mp ~݁*I Ʃm\IJceRer2'|j!⌟X~,E $A.(P|[PZΠEpEΠ|}yv"J'7@O񔶖ğ󤌛61/$C?;Ύ~K;Hːv[7l'8\7Km9Sp'\t ZyxoINxۧ]줠T|p`v1[#%;;sBa>lxT~[^KφY-r}@((LYo_?ϖSd(ն Zh8W?m$!QAIMbZ>N2oY0B`ᾲ#@~o^[Mr <,'9)WA:Y' 7| ^K0ɉ: m%}6j;V# pSp_I=8}L3ȸ,״z<;x"~S'tzi _Ofu,FDgk~sTbDd#4)ZV5}wH:\1 ` " `M r=^u ޳#uPV|,Qt{\un')sϟzi7$)2 yGA:d>Fns_[}QhH !Rum30z P:.U#^=`vU*ԟ1!{wRԀA> ??ͫ+]NZ~?htsE4:{K|WCҽ?N3 +b^ZN % ɫ1ef:#C&mxrZGo[/[?=ͥ !<5t=hS=w!C}t&w8B7~В¼ ӭjS V %kX3t~:~ЍջvzU8<!>F yzOڹ3wNfyV }qtJXػ_33?ЗU~wBg ډu.6[OqD6:ndzB:&Ԋ:P~&3Gg>!G)V7"ݟ>nN͌_UGڿq;q|7䡛t};ь=|]HANd:s0#);S.XI[u9+<<DOc7<ٔH@Oܪ;^֎W6sHK*Ksdo4Kf5NǑᚒji[7zVw/"vh,o~u&T)˓iX\^%k$Zn3 j)ĺH2gj;F{ ;z땴;#R) 9 =^K`S.uZO ~G"=Lh=xيťt:V;=(Ë}smb-_U㯭!:,n]H |j:u7~],+Zm8JzIe6w?SQC3=N( ۲ׅO7q OM:ϰf8t{Ң;tޝD.;ޡ@ӲxѢ7 H?9Y$~YUGz_J|Q`)Bs39x O\?g<Ol!5f-A5$+!F!464V^ ,uxէuloުXzR]=&{)f%By揈f>uɉ}4{vu~4{ҫQхBJ]]<O z"-~151~n (FdF_ EX#=U;]?t}avİYE&4P{;Q+ cqfp^}}~e96hihNkى,.0VaczLD^v)^ &* ;fLJsa7,O,n#zt(-t!zcBSQV";W8?xːgxB[ mf2vF]DCn%+)p`U3n(U뭊^#?V߾d:@=zke |$u5)@o? ݈Uչ7'V?7X`Ms?íIE~w7Sk]^Jn Yׁ6vznn٪+»oMMxg\:F;2'V!on@ûyTm]O;^-nj)"yQfUe>"4Cy?BLT4PDYn3%&Q_jg2DeƤch®lb*%I>Up:I9Dd"k]lcNjŊ3 عN@HP?4ӃO%h+8)EZoz-a3@4q,]ꌭUcjL\. nɒB y4(|*Y_dtQT_J#aLjU)c<9RhIÃ)2y _ǬT""Ƽ-!3 VA`g8#mk3P > [*Zȳt2l {.<{]J P ey[S$׬k~ª-j˪Mu(G\U'UXkd SZ®UfA;+IJ!q>!5V*FY:^ '7srD=k:S/ǂ"tU!kMdOĵ2+9` 9$Dk.`˔JV]VԢDW"&N%2Z5D(L#;S(U$a^s[ gZkf0KHTBL1i,U`^K,&ĈIYZ#MYyЌ^w YYԅ&ȄRjeuͲn TRVI:w*mZ ֽdu&L\ڶd̑ްŶ<T)* 5>*hIVk* 0Q"`sox8ci\ Wq*LM9[I5Lˍ.obWD2Ik#x0ڽ鞅>zYf;Yva;V"@$)A4]Eq4Zкik2S^(I6l:*^z19j2iHR,?2ΝNb@armeA:@.Hu"aaUۅP=:j ~ Pctvؼ &90b%(`Q0..?nuU}6k=2YI|wA@lUjSG̶8b'+Iˣ2{ kuYTPbʈ cY}mm;޲٭ c"-g#yw5"\lGWDnKjjJYxUZF!Q gIq K&)]oK3Zvt-bXS"zvt@(m0s0 &vNUk+>=}O Θ=;R `V K}}8:p%Rg "E)JWktDi0*H!`^|;ME.$+SD ]z峭 OoX.ϛa-|p 3})qMrfO讱-hήYJzɰ08X+uzY]U 6"ht'-cNOMjf][ "5%a2Dт1˂ޠ,F9»{5YP!`3Hkq "̘ X$-N ES;]1V!L˻D~H fX².`B#bU8Fe|a6C8bWlU ƺ,L*F_LaE sF9SilB4潞\w$'l]ӂy͙`TH8Mlvt'-@FW݁o}Sn]Mx⤬RIKUrI.w/sKuXX3xE*XSiK/:sd]@d܄CXa`gork< x7緡&/SƗ'I Cǝ9j|PgOUOx ?-Dl >eү͇0mGJ%ƈM˻9XPf7JcAOwx Nkf~SN^S M^mV<hoi)ͭW0QzjHG0M#ż&sJPb^̶)kE&3cYx.>æ7Uqs^@ ~|Cׇ8,-S43/" ),a !3z2g _}sr"QYUB_50wKVuqEm$ez5CTȰ܂DS)IYkɤiBǬanP`Ԫ *~vIC2e3Z3@!@*zw(؛5^zcT`boU9x=;(13=nGZ(5" M;n?κ+F+dyqRRy$m)E@Lƫ0\FKpuF{NҮI*Wk]ץ sp)=Ȗ(6;Bw"0 uSQ QVC#/iU2`87F*]cWjv?@9NSbؑZ?g ^=)3"!N]1Skv8yޟgb{C@ugbGhV:jty, eԜ)UJh53Fmb,Ẕ؅ήhL7&{"9|cO:Ð$rZ֌e܁VWRߎx5׻0eƇ'ۍhԒ(j:6-nc?[4Ǚ<,燼X3o== 6'F)ȴ"q 龍UۀE֎ٙ勔jaw̢tfP# :v0ޥ~v ̺,`^3ݕEp T, ڍHק\BqyW]QsƷx3GO"ܘfޢX5]Lj*fuk.Y"U/gq}֖@[Yg9cF}7&fE1V5(xKb1?^? ԄnF!@Qͨs|:D,3v5T P)͓zi I' ]Đmc@T=3ʯ8Q ǻ`H{0?G XZN| `W5TkFNRbh%̄ǸWGf]ӟKS52t:"F{p/`1`\''@z''{ &X_Ы?WT)>DzhN۲x+~eUH ?jh]aH;)?ڂļ3B2p!K#fLL򵙜6یgBgEomf۠4Nqs,R?Z 21bt$UKgdg L/qni{ck_/dɾ~f5%GLxéeOʾaua3n#|a^^>Z"N2Qը[pxvN̏6kzn2Oe%4M.&#x.}rP ΌQSSee?P* I9}8П]J'*{Nӿ<2U*2hQNAe{9Ic)6Mx4j&TIQé,%-9J\@r> *ugpN4MWG#Qp2薬V-/)a1/.͉&T%e.S7sƲJ1Ne.R?C#7ˊ/'a|ʳǧ[$:r4ңAN M?A|9Gt[v?J*y/<"o S-a?=v+ra(t@uN9ӑHfpP_t6>unMi _݈ qޚ!Z+*X+Hl>M{Io١ʹ6&"ۻI(%Igh;#N `gc&/ߋ8-1+H"ܪh;OlJFO[;wjpYc3~%g+ͭ#k5qK o=oܲʼ~K/G+ή[DHPUuo$a~™i9zRr:M}Ioj@e?3ҔN{"n`xq )> rs>%=S.e)La2ŇCB=o ClS((cj4_^<m?QR4F-,7A-SOpe ՜Pu澿ZNjll𶺴-~CA7s]pCWDx@1w!R/K!%Gܪi Gˮ[cKEJOB@x橥"&<2^e)WG,eA.HػfJnFYc)ZNbs­1g2{ or+&ٻa}3Ru#UɷwyTʞ!q\ D|ԧњEh*[K@kzgKkECwA .6 '>GQb f^VDjrD-x 8#EIU|ޘIs`|<w:@cŧ>y MZqiY5̊bGn[5C5;ptf&-%MFW1)Do_Nf=vNQGj/Pu6{W۞MZXH=PcHMޣ{sﱼ9 d9d硨%ː*5iF —Ie2 qydOLY|+SG=$׭tkM1` 5R$`.eO ,=$8d&&<fV]sSb=O7(Ҏ1KÛHBAM m|xjٻ |oZ|V8G<4쪊M_3Tp@CwxP3Bַ wbRo7%`m~wV^ruR`9GD׈*OĪaJkn@&HqMZ(G01T";s>Y i mȊJm:.U7C1px{bםU5clA(w@sG:k7F9 dzҥo#`MزXہ@ʌc$F7fRf&'Svڸu^VOr&.nn1kr9);SA7Al4Xf򐍙QЦq8Sʁ={Gģ5m WqJi~sՌThaW!H_4{z(Vl/Cs]lb)hYTfơn fL{{H%JHBk[L-w6<Ɉc|ԃBMo!Hf͊=~$ogF3N%iQ?U|>"1N:۾SYe]nvޗCڟi{Mi$/%}f6]Ww<})u^ld}J|Qv۽s'~?|x?+Tۜ$Yt.DJ cwj~jMI Ǟȹ~i6fDgwj&Ip M3O((m=_,8aaHfw%Zkj+J7,jɛ>"I 3뎦!;@iT{xS3M>xS"Wnɔ?' `Is{;qE;`3 =T]N5Kkg?\% ˍJ|fMlc&tC 6fcKL@TԈ9uy/I)'X/{?]1xyD:)I<+;3=Y;3[ ;bҴ.xn0MF,&>KκqB %.v2~[2!tIfmt3ږg%(ӭYk0.[R SZJKj*&_hs i7!aC^W5&EZѥBVh}]7 :J CDx ,J׳3JwpEWj\Եjs+(xH *>LoF!%9ZɈDRҊ;J%gG?F ʨ,:A(:=~ϏٔrS3=0YW5([&&?i]lNo+ ;.HeJ<LԯA̧1z+;c&&J5hܷ2 BZ!lGHi1h# p>uXp|H[,Q2yue}ڱݙH{|d&#Q|`4| zD2M$֛!phXMdQN⟯EoqZMPXV㤷lGJvaB0&g9RydǷߐyg,o9$!X- ,dݠwth+oKWӷ7RU(݇χ f9r N 9~7 BH-)ϒ:r:IFD0(;OG<>:wun"('~ eR=2@@֥dhn~e/T;6"Lԍ0d5ϩngػ$0VV#ŖG$꙳C f[Ͽ"F1IGKPu|yv:G3CNJ%t3 kJ וD#,XN]D"bu, Zi:}ePzOtGBjaJc۽и[nF@Amn$Wgt,w9(z1F.6٢6B:Э(d?U9'jwL{67u,= ;́{bq_K/W,#6IK,\ jPVmaL[FdsX_eF>#m"}1zNVG)ciR\qm!K; L0G"uXBmI=6&D.Y!a rj 65%j#7XGXnRXTwa&KcN A{Q5cd<a)q RQg-w)?b'(?\q_ρ*Go+c`GaM^R/Y d!lFlo<U" ދ J8;KC b3- <=f].C^2(@AQ2~ăCe9ǽͯ}atͪW90ލ!oumEŏRݍG5gc Qh"\ (4Ų g$G2%7$.easSxŬMcnWn)'1O`1 Gߦ/(z Wo@(r\B!*&LiB! 鐥 ->>xj`p@«AH= t=b\%/SӅpYlx9x:s |)ց2Ado;Gi(didq͚j-#ircPcKvmK/wؽA:Ʌ|=:@:AˁY~T<<̬}mV4&XDUh =@ Ac1k0f"Skyֲ/~!9}a6n{wF1Z#pyxak(1yK k {q6$z}7cU[؜t -ZLzK^fՖF閷:7}D6SK0»J\"Šl,Wl2M LrOj2'ZӁiP@(%H\ Ud'ǀS|tWq[Anw(ɕ- &j+[v倪 D$}q]-(PuE s{EWgoρ4jw8W@tj x-߉qS,'-;W=3 w]JE^M78Jˤp'puqlSi?kNTr 84: 5U9"ea|gSQ(]*bNx{z:<9\$z3/fP.xZ֌: @eSC˨v xZR5x~IX`~C± hP'3ɪ)vM[NI::0m5:Tkcɲ9qÀ9R"m&b) C?*53çXT:: j{˄L1N=O k`c`  Uiױ#(Y{i} kw f߯>E!@ԃj毿m`.A0caХ7iݦ[S=U\*k!7fYBo7>^43.:mmj3V At)d1OQ3RUK4U܆RAUG23βP qޚc< jܚ.QRd򶈂aY_N>:HaR.0N,Pԅ,` ("o˃@j(TT0HDF>qB)Ǹdyha^,y?H'4cqQ ϭ3Z)ɏU H݈B=ojlRf.0؏aUZϴ/s=rǭmy%Ww5E6a F pk]}=֜!I鈠:C" G!pktxe2S!&mT )=IHܔ+# 5lAe),Q\mRΕXGQ7׳\U\!'C(d|na\A# 8;oZG󺊌Г.@ǧE75;e,,>鶲[P(B )-)e_̄ɛg"j '+~+8/n/`gtp |NJg9yr7inAn 6m#cĜ7aYogiy{k8kY * 2 ."..ҳ쐹B=oP;hr.j;;V{LӶ=wOGնHKbpr&'ѝFH&i'PT·@54-~G[ˀ4 `-2 c_p%A>Y{FbY8h!ӎV_ւԡC-$^Κd %?~Po~>gHohpt4>qFX8Y$mq#ԘI%.,@?3dA71&<]Y槷9b^نLq;FK?lE@vx;X 8Sm!n?*}"#G$+,+b2=jz:iBnԞ櫻P̤m Na1 (Uio9Gєp4{đ5/D5YçZ?85WDL^j'^0kk􇨷WY\׌<{^͐;"|p7D,ahsP&MVby%W#;R#-"y~&Q6/~ ~ډ&~o8(6tV2}Dl4_=/{>o8XLX2azj@aYuؓ2MH (sz6*2fA_'/3,oaL}9}x:oNC{}n{ȷ%g)LFO){]JR߯:Be΋P=CHnP~Ѯ8 $ɽKBp.\ …ܥWihX*v @ 0BB&!B!B!B!B!B!B!cP4ffw @>~zm^,@\Fbʦ Y[ A‰dY )t#AJhBCIA@ UH. ߏ1ȏ<xxל0oC?d_/7EW8uSU5l뿊*6+?*:W #vZf/Ăgt3ߨ= Of|ʿ".rTQ.Q+~W*+˪tU,[.W/Tÿ8"2+6ō\ !/"l $3jX)G`.F`Ggѿ1Y>}?*Z7;z@rv(OO^~%nގFoɈ܁WX  naP-N0'CRjGv/XgoDHΎz?Ǜ"ŎYǦvtpqv.H'ßZOkbZM#2^elpl "![V)[j -_1p Eg BDNbmXSlp[-`-FFgCܹR %nEniq[n!*[zŢ DooI\fQ*\z .Dfq S"Dpl@qTTH\.Z(@._,0Q2 L8BUL\.XLX.]P*/X"r@⁹\(*\:l.S+8 X-:eϯݺp*!Vd<1 ].T.YN-dK0]X1+],`.O)\ T+^eص~,w??}7VjGvG˴n[Ҵpcwrŋ$岉]R ExQB1WhbA^|(/hE2LW8^LX0/X4/]/˅"~z@(^,:^/SP +X-e Lj ۆK&2bA |Xx! oϡ(E!DʒqłepBQxYЉErfـbf)QY^(Yr,a"r&2 ;K}s,Eg1gZt'h!.BD,)0!YZ: -S-X-He0&I ̰JR ixRFZZD-[H-`TK$.UK բ7H=Z-Wd,\`K/\E8"Z$-MЄ-R*c-6d %N#l<&H[ɜ-P)le,BSR[-Yؔ-^˖_~}0o̶uZh6uhhm6Zx[Չ>M#pErP n)QT^"a[r-aՈcoT&pb[B-U -Z.1J z 1 \*0a(\.Q)VK,Ų RLfhܪpDqd<\*P\.YH&-^(K0aUDq\,d.Ohh.T+6e.\  "Nj].KD&PFK)EӅ u VnG$T2օ Eu1u]tQ+]7$f &l  "9Ŋ[‰"wvW]֌ J|K&2 ҊxbŮxQ$xK D^BIbyfWzp^/D<" DzlBzbA^T,^h\/_0LEٛ 2Lİ{ᄂѽ^LA,^`/]/b"b|@)A:<etDPY(XXY,[Z.`(\K1/ERDfxB1QFAYZ,[h,`"p6"g4BgXhQ>YR,Y,^k0}1 hF+hIh4ZeGE҄8bZ$P,-M0-R*N-*O % FK-ILe2'.U % b^7`=Z-]d/b`"k3@ѵS(`"Z:-SЄ-X-ce06d l¥ڒ"mAEBmd`[)xh[-_<ޖJ#H|%qE nq̢Enq[M#DyE rĊQ)o^Tr\.a(يp&TpBQ0\.U8.Z .P 1sqPDqt\D*\XH.[.&`1(K9` VRsxFUZ\.[pp.`t<6"s4ītX]4+]H.W,J\/LKEԤBֺ8$P].M.RZ*h -% FZvZƅ(#q.e<ǩyc-#q8Elǽ8"y2#qnf<hF\y5"ǸlyvFqg<8$y#q@.h8y"#qdy##qEI8g4F㎁ۇ$yK#qJintw(]ٌ5vvho7&Irg?W}ͥɓ &VK2A VґsxUYl.F$8JK&:ϯB% EBtctAbŋ$岉YR EuQBVhb]|h.JG^$w;V8!]L.ߋja]._n 1Ew.w`Bwb]N+]b.]0 b#8Ax©ĉ]xPaWdq@^/%$֌^%҈_b Dy|WH\zG KzF #h]h%Z٥=ۣ0ZhqVyY|1G|GkdDF^Pe.TFDW6ˌص( v2`v/3 `-(]̌(Lj`v4l";nFgFrG;Qv3 `=(#,O)Y@kS*h}ZkSCdT*R}DkSq\IjO)>uڧSi}*)OQӒi ~珛TJGW‰%b jYťjaZ~ĸ7 ]}LpF+kFM;}藈 (dpB dp(B (dpBȇP1lPl1P1lj-&b &-¡b -&b &4oGpE+*--G˴ pGJ1FUK%P%'e;8Z"Unx\.`@SʿDriDB1U,hbA\>Y.V$ sUz ή"sQtZ.DJ_0FwdQVL"g~# Բ(Z._Z 1uؑ ~Z%;;ZG35]EQ;7 skS v;`v; `(؝(`wxJNnEQ;+Q;GyG^SQ7 EQsQGz.G;`Q;kM GzGa;Q;ۆQ{G{#Fy{|dGbQ#R=e} O)TZY柖1TQ}JO>ZkS1f}JͬOl8D֛5)TY8kS*g}>tڧ)ȳ>zkw< 73ZZ@4šB4Z5"H%>h)>%ڧZBMjO>ڧSi}5O)x-O=)>RkSjj}OQ.ڧTZWkS|d-J&` N(\0h}ԗu摱kFlF-N:-J:Km l#'Zh۽h7ZZq%7hƂn'6#I%we oybŨoѷ[MH%#e;yQ*\B .U E227h%⅊8ZZV*9hhAZ9fɑGk(r,GV-Ѻ-ZsK #Z+uhh}Z::Z%h葎)}\Xd2BduG+TkuE-j.ȘhVUZ5;-ZhՖݎhL_n- vGwGz\t+xc#.ZhVh^jQ}Oř)5>bdY6kSF>upڧTQ}鬵OSg}j>xYAjO>ڧOq)5>OE"ڧ;-F$hh|HbR\PZ-\,-a0z"i8]< nFnN>fuYO)>uڧWPo *~Ry{\ ϯ|;^ D(v5zw]zYwǝ}zwzܥwǝz}w] {wmPsI;︻MRS:h2eL5̑1]LS&&32Lq eʘ1ej,cZS~3dLf_$)JS:2eL:ʖ1c*-]ƌS23i)S22Lyeʘ1,cƔ[S"2٩FS,i2dLEʕ1c*+~_?=m|Ȃۗ?!dXkq}*iO0ZkS]L>JS}O[mjO)>UڧSl}ꡭOTR[kSkƶHmkSm}O>ڧ[rkS)P>5ڧTݹXn}ݭO)[kSzo}j5>T[˿ph"DpB1\R a*\f(.^0D&q"qH.Ul@`\.U4H.Z8K.T0w鹤!\*~#ʅV1 eh9Z]d-W-^ tBGtEKт"ѻ5:2eZ:ɢhVh5:Z_kxdLu`GvE+Ѫ-ٚ-G˴jvnG[q7h;ZZV.hhZ<†G]"2xxG봐+yE-ZyȘZ<Σ"ZW4;KQ; ѹ|ˌص( v2`v/3 `-_sOjK=IfgɥEg))~m?hv?'BhX1YRb"B~E 8=GM%-O$(K(K+LErJშDK;jhB1Z>q)ZRX-Y. XKEBk8bk\6Z)JZ-W| -\h–/be"bS<~G6r~W#f8K(gŲ ENRmbS/6$n wi-S+ X-teϸ۷p*BTd<[-T-Y-~HK0\Q*\, .O) T? 1/?,N2Y%fOrDe^F%ʫ͉g  _GU+J dEjgR^V>a w+H^x G85Xd+Њ쁝M%9L{VXlE+VTt^VbxH+ VY~{5AJZ(_)VQ:EG|ŝBjZ1X_9 eߚAKY.* HTVŬF^eEUR*U j˵fu_fi"!Yn(*(_ٖo-8M't );%+Q\R0.Y8 .^0>qbqH.h\*@p\.U< +Z"K.2^A\X.d V1s`Ut\.bpp:7 $υХ" Et9BtbA]v(+]0Ө &dK 2AŊYґuxVإŢ vvIa]fq+]z.Dq \#]..P)zJU+|˅ ຒ2V 1bWLA/N(JS*RE !Ƃy/ WP0p^/Q</@~E >zbA^Ũ,֛%K%'ًe iŋa"{X%҈},/ED!GYR@,Y.T$ ^"V0,EkJ$O))>`S*f}YȌbG_#mŒ"OhѸY,Kr&P8tK)* ; 0 0f BC!! !B!!L !B-dL,!@ Bܝ!~ϟg|^tgR/A>-,ltye> >k 5DѨꅉzW( ]/Kj"ZZm/kܺ.l D뼗l]9{_2OYʨ. յ|nMW_xB(VL(f6H,M6X,˅ԵgI\MYY< kZlʢ?Al hZ.M 3PԄQhP^h+Z\yhGr gH4$Rj&`8[ZPԘeյij{Z]a[3 jZF$J:t6Q-ʩ1U kյػv(f$-iҴktڨ. kbkV$4Z9Ҵcx*fk,VRE5Su mnhi"4u]4O{KR`%jZ&.㵍vUm] birl.jBk״W934dL*/Kjbj-&Y/ Z F/KiƲBQlx^:QCf光5my^l]cgFDy4Zi,LleAMz^ZY[ר.o¢Yኋi"X+i/ j̸y/K*ڮ,/iri|J-_gpĂ>BkZMXp69y_vjֳ, Kh?I8H3 }}@}igtSZ6aDCAa01- )EiZDS{[V֠%MjNv~fx;,TJ1婴jZ2OkQհiMkQdnZ^и1ֵ(y-i_bh|-Kjc2kٶV-lYmyCk\P4 s\@R4EՙCsZsA5Qɷ~s?\g~B~OfHGI#LH҅ tTLV;]X1K1$6aԏ}F U W/_@_m}}i}6 /__Կ@߹ݵ_kBh8*. ӵW!I x^\g@?5d~?T{AlxV.6M;^PԐQYyyhM[^\И_޿,8k^HҜjeӴe >y_nE67lѪa44\z(^biٹ"jq/J݋k W63@ł>9leTd_>`>)]MDFҨ%~xbka/jٹrjbƽºhs?~VYhAJL;5hP QZZYC5D.lg6?wP,GQ< ! "yyC`18Ze<-=!qzTzع.=c ˗|c.`pƃ09ƃg=!14qhi IPa0 Ei4OcPԈP FjTWãXp55H Clcd#(lhHP1mp7(!17 J؍nxy߸710#pC#(Є868N04qLrr|4GG(96!t|#tRt ԍaH8X:1PxǀĎUvȴcc`;rZ;Wd+~< a< `#g:g>?D0A44Q Di J##4 i8,jQp:՘`F5q5Ghl k]^؀F166"Aa6δ! m6 I#nrЍnnTw%7с (#p G& 8ű,qqpx,FOrHc92B9Qtxsc Ja::Jq@ѨSu:7^1`CXG;lXq;V쎃wBxdHFbxxŃ08, `#g:g>?D0A44Q Di J##4 i8,jQp5:1jX4kY#5 bllDe0miCjX mnxF%A7Q ooXz#F&o$pdbp08&DZ8 8qrt9AH$ ar3(z33  ChDcE0@40K`h"5S#F5pkk<_ƆF$6ȬX 8Ƒ66$b6ڷ1 nPBcnt%7q ob`F8G&8Q q l"Cq`h' G9Ø,Gq99@́hPslCG:DH1A:Rc)P4#u`b01xUcvc`r;;ZޱWd~+< !xxȳHP-LyϣA aHbzzՃG.= exE2e>z!1>BiPI$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$NK$ I$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II(I$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$jI$I$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$B$II$$II$$II$$II$$II$$II$$II$$II$$II$$II$!77(1 Jnxyиb!8‘pphHP'8щbDć9&>AQ9P\`#s#E>::FRta H8:XP1xUcvc`r;;ZޱWd~+< !xxȳHP-LyϣA aHbzzՃG.= exE2e>z!1>B_j$PI$$II$$II$$II$$II$$II$$II$$II$$II$$II$'I AЍnnTw%7с (#p G& 8ű,qqpx,FOrHc92B9Qtxsc Ja::Jq@ѨSu:ᑊ xPE;fVAQ;V#wEp@wx G,<1y,Ђd>z1jBP$II$$IKZ!4a i$$Ba44 E<@#jRF5AQ5 F\`#kZ[Dx66  HlfqmH"Cmk` mopcܠQ77*a Ko{C|p8L pC@D888<Nr@#'?$!KjdNL"{nTz$Ы0DaƸ[ //Au{s A8L_j"3z=5ԯת{A+UNNb9/\̰IMai=)P^?ZqX^L"`QR#A)XT١vN*v> G(nL_RO [RGtF"rvG^?5Q)R\;4Z2!2C ߯*hJŭ^ BWG K!SS')S a$?\!Y@y k((y .J-yl@2)_kvߕ2m;{J訙 AW`m J8MFe ils^&dĂqUDT Xxߜq ęRzUzӽ#zHhb>ˍ~邏=Qos^fŻY[B薐ή`0|oE66"3bmE HUMc tmb~mHPXs SQ`FfVقAi i0n8 ?ij(+v95M'z'm^zF5mf4b1\9w>J~mQ6s!dŔ DQk^=Za-C4_$ 9#pY zh5υl h.f*/6$΃o?07-$E/!<)(#,uJ,|lW"~Dܙ̑~9Ej BׄwA Vα|]]iE[hkh &!3K1S|*`Cf%}AgıST  VG:Z;&m딮ˣ6OmHx N,^?X6ƟDbO7}q;_4Ř{qj>bYFo[AB aܿx4M&iy5T7$ܷX3M 2n.g0wEfֵt_mp^D9; 6YG71AgrhVmj[oC !c$f( ШOFm~&&id=[lJK(sqN׉~zh85h @ԣP䆍hG;=/J}P@M0h@aj:²Z6tgخ H nbЧM׉ʒ(Х_]?Ql+ģON`z^~+vUO돡U]&1'/,=kA H (8X5=:qHXWCp>]$LgmTțqD&nTFEBxd?{xa9/Ly z `KJM܈}*ԁ## A3qa6 f,Ώ` 9NVtxK@O<7W]aCUV EuF9S 7m{C?:pZZܙs6"üK73nJ?Ucj#_-KQKk9_fװmVDiB4~ڢٍMъ=YKA/{~[,35BjU[~z7c(46<,M bn$Ef1N $QҢy6(VژiEzh6?'*Ḳ |Q!`6Ala[ۛ \N)"  Dln5?q̟Aȉsi_{PֿS~>m<47w`Ao1] kH79&_X8n'G@o6wk}+8-(X7|@8$t[fuKlul@bdwDȍ}{~uTn4 ~6Pyʹq@B5פ?S4d@^ )hxzp-!knazkw$6WfnPNnQk  -n1|ܵ )fv[7)>_oTIk6BW~e}%Ӎ' EКQR?gֹ{( H?1q=?IGX*k P!ݟ 6@Mi NC.n^ROFrء`2h _z=XUXHcJ{kԺmǠ݈~\/8oP8Gc.gM7 =?ŏkEM1jpA7!N~ 0|'eWOzs@5ȅ&0pRv K`Pjo Szo~zl*6/yH"P87x/uj߈pd"H.8sl~M$xh3j\$.M WdQ] oKXEi?Xmr4o6Ł}ܑy O a/וj/S2B]h[[OwiW~GX`¨uHѰ }aZA/ݓlPC9x&2Ϊw0zZצLz JPo8ܺ19Z{nrG!(VCX?񒂍rƓz4p /m|w`~bs# 9/9̛1"b^z@"6UETl>jM.A6m*Hl޹_^(Fj 5{/6H{'5Un!_l`nUܯk, IsLYֲk7e0 s63mĥꁬ_acz~[z}zn LT&8#7$΋@?!Tp!  ,pADƩtcbU~>7'ͿpC(r $,GmxKi&/͎.h_1KIMM͆="?QD/ EnT]L}BǟA=]= !ޚS~ܩ4*6S_IW:ʍM}O an/y&nX#{BѪ@6*d؀mTnӯD7-ѻMțE"^@{hOzYc _ץؤ;fMݯ5X PpI4Ƽs#6!mHyH ֙zbʼn1C>&u昳 o#~9奜ɾ!!'4I~FѺ#oQ$<K q }z6B8gsޟщiΠ'ft6BUgf;"z#6F@z06Ld~*c~ƃ8qywwO[XQhtĚ&]+]:E!kÅzG+HܩVmuq|s)r37P-J>vSZOoӳC/1RgrCzbSDnE4r{n6L8l{ףwb|@W6xHզsmI lfuq  `9)_N?[=J~7)0z36vQzDЋ~]k nGPhXy׋!3Ȩ6A60+lSR? fI#~ss6:mE|?HD3ڡ/HFokDkq6wۋ8~m~BXz(5XM"70az!Y _|9NnJ(tE6xlې g!k1~|mD̜kMfwi\QQ!8zOi!d m$¸i&1iqaS`W89s?"])qݼ^X듲6Ї4k;}lH_>ζ6= /` *yj<>W1}֙eeagAq\Ze Dgn)m~zXQߐ4ύHlT+T4SoH.2np6(h{z6'*X7#,O zײ~`J]ӳ1ݟW k؍nU3bq`<7~%Q ##=|B6{vyE^M۔'P6D@0g;}yC{"L.ǴdJ?C0מ676#uCc7#o=(z7b.jjB~и(5,W= SJn5nD-!t``Ҥa7y ` ߡG>6zȂ{"b ?c4c ߒq>%7.b0@qMTߏ<<3p.p~_Cr؂s^CR7$w#{"oE$W)s{`DZF3ͥѬ]zWXl k̍QMczi2 QfyFB~E)D1SIֆ6I<^ү poNjH&8լڍ. qz©"gz7!1Ĭn6&Ġb+T R"䮰Dhu {A0v-'իyӠDq%䨀~vӻpd*lll㛢 yyO#c7z"naE_K=n F܆}Zz j1(Q8W@% = {?Jz)O=]Ȇk]^zA?n Okz4ެ^REz6rI<Kf pA1jKl̋( 6*Z hŅZ1Ѝ #Yzo59~itL $ 0#1Lbi4ɖkh!b2ĚB ٲe&4!4q, 6,#"8y_ؿ3idҪI/:1():[Kyɰ/&s7,A57NBjplᇅ  @:AI_s]F!rXj%/]OL.x)[ 7Q= %rIkH!XR`a%r !w'}O!IlDX!r4SbTI9M?6+ |Q0#9m"< :اFCqp>Kp'6F{y xC kg=iP4V.;yٜӰp tlj\%D i!6u[{! \B\swA (ۮY6d|]0T!,g5A9Yhc(6!S7r( @ȳ={ iT~CMM1>NA,hyу5tz`+^Cqq=;د7c]X)o"ćRNկV]$Y ;j5lIIX2ә&{ hyd͸y6Jسe~XL JeY4nI)[UGmp@!wtlQd0LP[k gJ^G(* z!J7KM ~(ZиI{KKţ:Ֆq|CSYy\+(eE^gl8J T6)/Kui>#nBd5@Δ 1R,D\kMi84k{#u Aa]&{g'{)/Q\@Um DeDWRS,٨pQhnȅ-` Xbr`tCq0LqUXN~(H2=i7sNsZWc&JÖtC(9m Dcq쎼`([m*5lX z|9~`>ǬmvP pvE%H: Y_ I¡}>n'+ [( 68H0 ;<!nҿMp.`l~7q48&泳C5r7PL8Vv;r(ck;2Rî7ſCMg(q?:xͶa'-nCp :Y 9˿!)߼ӍX(݌ًzyhyC5hMG?bx'NaA2+3A I KJKŤN0>iA^Ym.==À{KA2P2,ay&g}%y'rɄϛxHTX'67CpKdL%BK[WoNu4FF3jrDd:F?݁r~8Y9i" 6j)KH~&ŭ&SR3G1[-+ 7 T+vJŰQilՕFa h~] `CoT@?:3/2:Jt34sCCRz.p(2hH:C6i HM?ǩ\IR@,=iP8\< BEؐ8(\Cz]/AlxRQ~IRamJ{Ms)Һ )' :Lst_ Klه}!l8M.v"sbT oКk NKLln-ŊJd{{IVnr(Mr݈O">xN3ܤ~*{#E WNGf5CoTB Cm)mlNǫ߮ºn C ܨ lI&ECGn9.`U7xL0GC :s M@B9 B(|UCYn@jBk(JN62H-M7Ѐvl5 ('fvY07|@VB:v<:7S{n Bd .  0"2CK!$HlJo'Crjm5 viGND0 8he !]hDKECK1R2R7t?$1@܄ ^E`Q&UTr}N ͈4ي9Ű*I[WjEv bͭs&Z"ktCn'=wXnΊTzV _`Co^*=_t`8i Q7T'm\|a"^Ȓ(64$>o FBҵԭ/D! =Ҧ8\D;M~+([TZ֫f!.3\O7HiWwJkg*,6\I`v,;J LRTWb-mP]K£a`{UN4xXDRQClX5RVXgԁ`ݓ4) 9 &[W RX .CkqRz!h:_~0J/t)%%(9\E!%fH/+EBL&Yp{oG0Tt ?bn2zڄ9I!܉-X'C!m]Nԏ!eНk!57p<^^CKuxJsfY[-&l!=TtKp;pu+Vz4,ੲTrV7zsIf',(A.b@[Ay^`: uT)r!O.0ئT6e"dClP40_7/(5ʮ?a͗q~j;MaA/׼ԓwXhnyYng_E2Vammu|'Z&[s(@:1qO'>vFa1(AE %KRxE9+BLb6yz6kda`tXN9Hf}9ޤQ Kxb²c`*7D-n!5@d DBhjcq(椀iNHOMcіmJg4Nĉc}o9/YI KݵBzL} ;HoMD0?T*46fKJ H 1b7TXN) B;oƐi3KX } _}-] yEX%ըzk`67Z(e\iYn؅ܱEjXjn7xAdW{vp(z\`a'Rۛ~2PBemߠR .Gb͘@xf%4.~}a%XnS==$gbmІ1句\?c >tCN\.ޛ0.>s]Ÿn,.w vK؁ޠ>tCP^7 s|)S`#f=' oԓbr^æQǽ^P|?oW(}B gyC&}ynP6jC~|`XRr}EK]rݬ &|`}+C7QrTn1p vfTsmȉvCuRjguPK򆚥? U5RR"AJ#zB⠓x'Rv5VGHLcB_ 5*ͭ=\l"Ey –5R W ]J9бMn8t=ňpA h5ne'07pގhzO m \*rvr!qܵ=2Rx?=bsy7؞\[ʵ4B=3/!i{795 9&X%4 lMpb!L( 1 AE un/ vR ;]<+ jD;gKdκq_ޤ wCj6ݴj%Cm2ϰ ?q;$o!l8=!_)7\.aB`+Ηz&yṊ6OTp>Չ(SI7qxo^:jZl5_17 tM0~C,.$6G]OptJW%U&;doއ'iS&bTIĕ|G(rA8Zkl:J4CIvCFM !Bm ')89Ծrb(%gV ̸Pn߶J n9 C9Qe66 ݷKNfLZDH ]"Gᆆ kg27 ;#jPI7X `R~3UjY8. emB q?v'$gBkU@),[Ґ \pp&&4LaK``&4W%=-lX$^Mg C(' m1h{|+Cp;xBOzá fN}8 F[(Vy9m/+8yyc97&I"z8;L?w.b!X[?r'~JX='92\p~m&vEA0?T+XpðA_&w?B,t|9%8`l糣.ǂ ,A[PBNϳ6q +rp|K70kt?nثp,55/)] |Ơ$̺JH!8B]å)2 2jGp pc3˘hBja/238\ [|Ԥ5dWK)RmyԡTNydW݆؟ <NQSM4 gB4ljFB iGK "fAk!l)ርUrف:,UcQڼ-)g20n8kh{ TR6R (k9bliTL7o-ِ%9(d'po_f=f Ɇ0ԅ3O/Fil(q}:1/=d{Kp%wJ.K;`bl/&E2+8Cx:*hQڏm(8V3A( }"N7X{ ^rR,FV@؞rnmjCmSHc Qڬ/8F,?y/B~ NO4XݦPdžRM MXw7"oUhQ#\*CMm /i.8Hp _+ǤSP3 T7kTgf.Ռqd]T'J> ? W^*w?v`n^نÛ 4I=VZ(%岼AMN+ P~Z9^LohCD-&i-r%N9GmPxpym/[IWJŔ05wؖ!'=_Lrʒyoh"v\c:,VBOQvS DrWTmP5 8G-k *BفSrvP&? EFlYH&|y/~;,XM I\R3ǒI m6Pb,po·&q$\[Ui&X"S {Q >INF|YўCpCd3XėjIEn=R]=˃)jÑ9nN$\?ڙ+m~uʭDg4NG{46+糨7|uPn@(0pE^CsHZ^s uПF_pNn/KiPb2'#;n _݌$*9C5R2t`=GZO%}wl :x D4C9np6g'?=1-s>ڊblx&{Hφ6UpK Xܝ_nL9^ 3J bQMFCrWȹ@[PtS$.D=nisL^ ob'qd5&[Z Bo4r07hZ~n>.A{W[UTB|m\ȹ{+K> ח3Wé̃ p5I4x⡎)" kIb@' 6Zbא C8X%|/Ę_h2IWڎ;n$Ic78Jh 5y~Crpv :'`u qT{pqy@)@NJKyV>'.aHyAI7+D0> Zue.C1Cdp2 ,E6.<0hS⪈2*Dc΍v3 0 Šs͊?]92+4d`uM*D6COMԸ!aT'2 VhBSaQt'?.}6EP&ȸ̆o{rlN;sBr,eCK0‰UD󜞡L'Elam3|{dTiX .{Mal~)#d!n 8ldq4D>*BVA9Ȇ0dRW:(MkCdqpM%lMuő¡6zƕ,RVл@Io1z>!Y%;G`N.X,D b6 1 fF& 'qr" PጓZy/H%dALg&2Ku[hTuL``zAiA.lQ0d !}D5|%֓m%RȸDJݽ,:ȗ#E4j&mZ%"[~odߵrO(0< rՐl&_rP|]^o ҈rŨ܃Oռp!<(m 7|$5nLlU"" qڠHhxMex:%3!CRv;c֖iBP]0@{n_!U- >!z(:j8%) :=qGJJʈ7'bt 978A,O+dBQ`(o`vL7,ْzֿePN9>qIMWS(]=tP{ o>aү,,e &v <1 !d⊜F~RkORԼ\޽P '}yE((7 #%Ka)r 100Q@y8 De"La?Vڋ2 ٺM6ddž2K5Ļ& 5*ը oUH r~X 1䔁)hXF vq%Q f1oc!(-즥1"bM@|&mP*b~qՌR!ŢUhQEF|CO2x&0?f~>۷D,6Tj樾-qyL}4ɷ!-6K0`+GBBK]Q]uR~Djbv(tpPeU4D "lDjw E{p% 5KN (=Lpo >4ϼ{Aw'4CåޣD7I$TWt5 ,/>fh2P^I I? HB)j =mNcHW9l'u XBTrݔ(K nzp[Pب:nϤkJaC)4$Bm,V(GÃ\ A!I e˻P/}0;G:B@)3re^+ݠjL_{XOt6`ӍK')b[Sra2f^Hz,. 4!B68ol(CVdXm 7Mg R-0'b9Bx>!6j@l$ynz$ŌlJҒ`~_RԚ _>mPv6${nW?7 URS[I žYSRRl;RV!8l>}@IWHT6D02st9JO G-Om; 27B{zy 9O@@!\9&W탷 ) :oJ ИpB=aBeP>Bpi+(a6ąm`MÐ!p{*5蓩VFTvIgp T lH{2%: iCkr s>SVy_b$yxL|2bz;N*a[}G+{%cr,& %|$\+ ^ ^~ < 7HO6/>⟸LVpl%p(Nc&s=ZM` XQ\jnv3ހu9'E @xgxrɒw' b8琖+p5;rs0I,&I1F2[QcTzb%'\f Q]TI7ײk7N撹"}U.& p>Huj[N *?;[ jJy0QV$r>o0`(i_J?C 1RN&X8(*ܪ&bz7Db]RqwI2S&brX(yf{|cWTKQĆHnqOBR^7Ԃun_ͤx7C6(%%rn\Y\rSM^'zSPByǛ*=?zod4!r Vϼ V  `R &H$7$BɟVA\aEu`Rfw |AA' OE*deF7p5 ,:Nf)rz?)4 |(m(Jy9p'HrpA(0`rVqM8I BjO|"4YqZz[΅'L/& AȩqyZE&b7bS(C#ڕ *7$B9l(nnK4ѳWjVLp4+MlZ_^>iٍ(CjlRyI @e t 4'苘mON`iBrJvfrP&w rz 5E/"NDFG^E4C xɄmW_#i8< { /AZRB~mnʗ qJYN[~AxL(\.!&s*$FPC˾IDxh3!8,ypY P\WF7PŠ%9Lۄ _S{Cp$5q z{A*);͓19SQ2xJh2R,3abL|޳w)l  I\Aꊣ8UPE<.KWNwbHydxe(T7Ҭs؊(7D\m8ZQ 5mK~78b&An3<KQz,7JKu쟌.TIM *Yhȗvn(!N@( Qr1P6)Uli!9g aa TR$)i|o(bTupﻊjPcz߁ҹ( .b͆ r3F\1&v6t) 6hkUi*+gP7RؤxBq~a0Bk 'g7w')j>ÛNUYrBQ[Iȗ!7bt970~׍p'|$ @|䀣Jt:[iT'S7a Z8:h3e!9DFS=JPِߓ l|!*ūe7xFpR΅D*a5$i!8R} Zq)im6 Z(CoV AwN.'o55 aTP3ytDN)6B,g E("}(t3 heB8lkSR橫CL͗ vه! (vSLHe8s1:wlw/ J/z Q3-4Ai0PH(on6J2!7ΤXz;W*-^'5z.l CN~2TߦOC`%èC6-0(!(v' HCGݟ< ѻ O4ǸaK:| a6FwRP*%ᰌkS@ bVTDa&Y' U|x';o|_ /|NTS=wMF7`u(L 8\l荢M&Ù{H[IIpO..tAjA~b[8PA :=%Ũ!6h8A|L}(f 4+ T63-Q/(~IbTg`3z57kvCm&)8 Ҽ/BR,dM0asq4 5L@Y&B=P8,u),dtGUt+p.ExM3vϱyˌaj(?P@8?3@ņTwlxKp>Tr4Kɡ@ 7,Lm:&yH$ <gS9<0CmLA&7**$BXٍ7$h,R19O=F ݲBp#59p,6]\|.N2vn tZ^9À1'QҜXAu-NpIkEvC~n\Z&Ȁ&)r\+5tiRk6xē >. bGD;˲3JPzMuכLޅ \cWA DDQo(k'p- dm|pAK& Ee L=[9u\{;B(IU}}*j|)y8!7H=URBLy6 lZ&f2R7VVJi md'%((j{s(mSH՚ħhزF17+RX g`6!%@fiavi+I4?rIhA&rx>9e+ .6J(xclj8.Rgx I@PChÜk1Jm.C fQ"OH}BxW-uy}6|X+Amsan{Å)d.!n??bTCSC-y6.NF ,(TJ/}6pBJjs D^W# ]BdH0Cn)88D r m[&Up'Aq 1KECtr*DV=l n "5FU[`Bk#goH">~M{Ӥ HQ&%WJ`UAa^ll4枴å&Ȳ5UbCKv~6=tbCCllDD=tF1@,w)喝n(y(qqOgr>G %Djxfx5 MHgw4C8r@&T0MJs Ɖzp0(nLGdV E;KQ lLBL)A[+<Eb7lhRX[8+Re*c)X6騇.q Q a&P։'1J%}8Ӛ^# mIKPDq f~nS d<@9ؠMHq aq 6M%R[8ajQ"} s2Ke& _kRD t8JF93 o.!{m*ҭگ(]݃rm|_R$8dk@F˔Ӓ5[$AwM堯%뚹1*eoP8yp =!lJ-=$: 8()8ш% {WfQ^)D/) @$@64&FBfBLlڄXh2!b2,4YhօYXF$ CDgVp`3> #=/!=4!.ǵ\HhB!AX0!pڦ6k^xP+B(*{NjIߢmn{ɨ۟}F'lop~Pu -Q~'.w7h 8?I.XČ싲)1>"U!rC|j#u,pC! ޏ :(:E*}yB? i\S1&i|BYw+&c#Z G L4!+K8" e/k}#օhB`J1~!! Ip5]˚4{!R4 wBLP]Cj~LrlAH[$ 8fDWq+:"hnlό2WGg4y8rh]ŋ˲ِ@5 =p@8 ̂Z; 2ϊ̲/ w=a 5F#hS-IB(Ku!pD3s1P\kidiFwKrazɃBh& V.{XZzeTt#e&Gr^?hʄ8 !Иۨyod@-L(𵴆0ey(se]éS)Chz|ncCҝP՜/t<5D IPۈy5_ikò$=:2b [õޠm٩ʬ4JrpB!&<4;Q8E5< S7ZCjİV3pv*Ç"a{TC}ö4!c[/^" DH xTB=tكCs>/D~B{MQmh2EU_]b !a! Yxw,/Ty<#Hm/`1iD&ڶ;![۲*~$}҅qߘI. 鄈 tzDmi(jg;6Oaf9|eA/;iN шFt 8rJ~*IS Qxl߻x8t=<5^3HK څB2â;kY>  `}Yc&(1šg7YFVZt)>ep>n "VH+`d-j@@mzi_1vq\Cbπ(rbuwe5cK_:{+vW[CG8>]]֦`H[MaTmB7_;4c8գf+E'/㞳ʧ&;|Yߎ5[ h?U v BlOa(ǒSfBYMHmg{NR|o,WCʕ 4p0EF0$8*!y!/Q:a˞\yp(WxIniZPbUʆs$^AB"E gk5f&Z'G G%jw;be><JɏjH?e/Qef>M=E$pj(58;Zw҉㌒128ժ ȓZ؅RPWE.|)?D݆sNQ ~4 y Y롯Ptlt\d*NBU,w=ze-ߏ(|mf(d"Hg/s(;eZ/Ԍ¯D ʾ""i.8!.ײLfeFjp^si MX4r#pC?8}md;9#8R =45!qJ чȐCɘ\!F!2N2kN3Å$GxU(ӈP<|f*i2r C ({Bjbj;PE.5D5/_}_|Of4Hs~R|3jFv@Co_Ne"yY?مi~| [OE2+jP3TIsJ|\ۡe۱p V 1!Ǚ/'ڄ56k9J/ĉ3ڦcd?j@*УDg⋹qٕڽM ‡**uA9D16Nr(iy!EFL='!y֕ Ѹjm{D(!$CWAp{c`i!*&j mzh;HOSr'W&9Vէ"?\7v$(,>NժT08'dȳr:y'&DGݍd>𗰐>ԯЮC#ha ˚0mH2^} =alez`(9CWkUb=2>*F~}aR<ăӡ/vhJ N08Vc/ڮWOxHC[%qb}aC!uL\F;\RC~1 [7]CXgt3,).%~QU9|Pʊ ISS7R  Q7 'EvOAYJg D4֠YVϩsR CK̆~#ua8C9X>f`qcI!~ .uKҕZ/1{;}!,- M+^HZGȚɌt(QBJW CT`>ӖBFF8E|~!&4DD64S\,CB蓞jڮ&'}-3۹|ZtG1It0qD{C^hwC~5Yj)O -Q7?JD=C$ѧ9'NrUV[xtop%TKPz߸vҴ,sG]k(sKC8*!f:}?|ܺX43!iFU"wpsh? >X-TqN -F,iL_k$ Pa(6ćђJ ؍:29Ř zC햡,i: ?}h@lNG!Djr9t8}J墟I_QJ#>eq=nkkVObÆVC~uHEl]vp&147=$?.*seCu&n! . lLw ˰P>Xv8/0[(Z~)5T;cKIנujd| UwQ=|_*a:hT]eh dH!B^DEP86W-@BȪ8Mc/`Ꝋ MjovL eIHTڗF"ڲ=s+sS Gʲa)qB*>\:EgN!vU֗4\CtlH6?VoCg}L LB:Y5}uKME` w KI5`65Ctq^ҳV/޹Ô0L]S!̒cګ NXNIyB,nz}> yآϦ-v.ވ H(nWC'1e0;?y7AѠvC3lpϯWqEY]S} uu]5ҥ } mЃBY`h|PImy9M2np!?nu h(em9\ɱLCԣ@|UaeW _˶C#= rA]~Qg Lm) 8Ue"'6z]+k; - nD~nwpqT#991ezJ`$#fe|jDp:-nT$rs|0(S(5}j-9k\D%rWȄf*?ZhU #O)dQ6!"Cu0dȬԫ(e5#C.{UHވu?Hb9l-b}%o1[ACBM{;Z?xCBG7Zama[7Qe}s,.% ,tyү5r{(y D샒 0$zQiKY }L٬jPMN-Ԗԉ_k[k|*/#fCV"rf;EP]Dqh xZ3>= m` ކ2 rTHI^qWk!SuFn v0u(ǂC#0ZWO^1<0O1Z86mchݜOE qׅ#8{ SUu=wO;8[ƣB rE_T(]m%3V %= z%Cm kNDYd6[Č#*Lv spIP(lwiJ>\;2ؼd 7$Q|Ī-؞'Rf2 \'F)+FQl 5X kAC!#5X@:O&(*UNkM[(W 孄m.ahރD/4atxx21;aԮCt Gbo%2KْF6k/WC% N!.ÑTiUN!2h|,oEI"b\sm >ՙ(|<\R3džh7[Y-:7I5\a>DqYӅ2ر91dB>uh(j~pF}ʧtYpm?fnwC/JeoAɓ'j! az&mck pU=hZ ךe3{S,|=7UΖhpKp.QLL~E:D4tR|s(3q8LT۽3*%{.]uCW.m]=!"Q RHO˸f9_ם2p/e(O!~8_{(a1GfMbn Jz\V7tXCr$"hpv`[5CSe'RIѹˣfCU؀p:ɰ]™U;f1M=yՄ.nz0}yeb-4RlD1VVEz i]b/sS1L̊Zy]!ՅX`?=4=j;\4 6Ĩ+r]L paOк Fb]FQ / N i@`r9֍y^ñג~]XەN^ H3APh6d*^j!1_hCNP9fkY+&B+8ڈא\9p!taso<} ̢_) \* d WO;5?'%'Gcd%|[p? Ǫ`4 M#489鯒z*8_lA:~gC͓r>Ֆ0\C#aK^ iy p_mb El0kx*?ݿL }w6RW>d<֯ߊf]pq?9IIfJ]F&؞O[E $Ib yxSY\&qC n=zmN\9 \TcXƙ3Us߉'b%/f+~*)fR!yQ$bIR=̛hC F?Kx>6XZ}0q,4ie6=7b C*8)A4`$Ķq}g;,)ՁˉscDb3ԧNm+h'bQ./_>r=DO=&Ur1) x0려ԳI=)Yۃ ]hZnNV$)a샺wcttP;okBh.Dfa uI1ٝeg<_BLdi*Y!4DuvƶG["S|)Q$AphDbNr?ͮ:Mkct |Nv+yQ|w|䀢lp,FHe =IxZf#=#$<ޗ>_ŗDx@ ˶@)po=6ǍvvsR(_lŚ;166|H'bW[?'M١cI&8=ɈO|tF-9ݘ9 i++nMs. 8+~yuf/03^4zcu~_CaTV/O'Pԏ'-<A>Ģe7<:Q2Aq_e&YXU0_ ɖpb.qzs²b<){A&VOq?iގ[As뉴Mt'^ gJ> &u@\\r?ƍ#9"Ίq;Q<*QPIU.f1Flٮ0׬};ޅgE~BXH9#\o d>a%F(cx!( z:OD'Mm:ǻc[sf}ozgw p|,(K'F<-$\L 'GD`PumV@(\X|[=VTzmar8B{tL#qu`&B=6bTCWF/:aVŨՉo<;U}JlH;twR5QX@<zP#Lc&pp<0 fy*';"Ӭ=FI3S0Kt ?W<6:svb+o>ȉ QHCZ2ρb󤯢.pDk?N󗃇"H&zO+~ijxe:vqS|6Dܠ_tFS XgvTRap 됟 ìB1cs矇৑z]4PN# 7%@xmBEdJuLoVH%v.٦ׂE^hCr?^s8udLDl~\uXsO^$0p}vI32f. S JHs"o;c܈slF'2w=h,zkdNK0 s@gѣN@l]DJ6;`a.'ē,G&(Z&z0'Q$Ƣ$؁jnDU>w@|!Ć Mӻ&&1ߡ\gI\!ۓ N6|E*]^Ӈ~!nH~@7! &XB02)c>ǜORZ+{0'Q2rr,&|.fyp ͅtu0)O.uSsBYµ'wzNzR8 a$eRUYjtĝ1; 3Bx:!^[Z'ZluoI=_(`LެNBIrl6Ou 7HVQ=rҮ5<\j uR-u{==?}^gPw>ND=,SF(:4``4|ng.'"$ oA9Z9Zs3 ؜j0A}0)`>@;7DtFMLɜM:亂I@&p.z)깚31J",q٬f?ҍP*Vb}٘[؀;ӅZъT*!$'%~IM8R|} *SՉl4]Ef'}6":LAph7Irtz>toA;IP${N*؎R"p <}($ʡhPMs&,1=(\gYr{tN?>{VcݪZq v(ж*|vK!8)!aLrua'm(r=uYf%I}ޚLOw*0n9.* "hT鼝gX0=Ž9xS!0@sA8 @cOu784`.lh M]4M |`Rsu@'&TF_r*oR!: #x u=6@avIC"$RV`]ƨ Xȣp&|Z̲S< pV`/|i=6sғ D鏆4h#H6 =h:A⹹'^޿u@sTAT$&LtssA)p<ي`Ù a`B"4z_0]Y+(F +"UGnge̓uc X ΜO ӇP7q0nV܁F.{8NM1qƛ}O!LyX?Lis=ؙiD\U'\\Ҥ;u}`@;0wA̅o0ht8IkF$9į$/'x\nn&7"nݡK }Lsa$ =өڬ̓.z)$ +Iʒ%BsxIF)u!6&kbMI?յe<0av-$L $&s"{5ga3džlhDXkF[#|gsc]7 C)#01xY*$Ҥz#\V   {0_bBx@ݣ}X68wDN T`I02IB".Deғ O%j5jͥ;Z-bq#7Igf!`MLR\BokIo:b ˉDqd@Vf`CO!I/dppBD>vzkc%梩%X;7Mam&!cb71!h;C޼! ؿsj ggSabHD9$%0ɨ<3~9`42bkm;7Dcb(NjN2OIՅDMIa5R`rbѮu^N('`D}LjH4`N'9A  LOer.hr00kGj '/>B%@<չ}ߥ.=Qs ]^ÉxиD( vp"CлBKl^l= 9` MF w1Y5h 6h|L ,=DN Hkv155 g@,aH)BTt6M[=4IOj]JúşV[ݤZV6C qŨ(@k4I><.\Wah|k[2gaD1(A`a ME']È D=@t` ⍀ͭɆW.I Y n~Fx֓tk}gx ؑ7S n~C3KW(C98?!* ~3{lXM@"Kf̊kK _yÞ [>X:Wmϫ=8OIXiLF+BT;@q`#Bs* U@2b(GHɰ`ӇL675O`^CQTmw+N)Z_?}<^@8e%*G%5?uh:.mh3a2,"D@O DQ*&@*<''<(HP߉RwTX+|gVj: Yr¡/ +@84iB3wh \3" y_[Hy>V`Fs5! \Nu$Iׄpz++`fSsZָKYw#t7ѤߊqA='8@xI{Ob%bv߸KJ&NN<,Up>}ؤɈ4Z?haCN46Lj;x$ų[O$VwS\nz0!ܸ| fw&zNY-%=eNYmmz^_uZ͈yţ&R(6) S!vsO%s: D]nk'0cq9BKB`h>FKQ߈>F3*'bV\A6sy"pZL  }y&C, 6]ջZmqR/)&"v8Ɯ,D+A 5MѦ|  0#2C Y6W{"$Pִ/*mlPͳn_b[77<| f]- ݘ(f&Hx?0ycIoh%B)n=B"xN?sh|wk[FvZ1u#I(z%߮*uY<Ý$Ix;\/“ߡ8'd3񅱫5* N^Jfpm#Y g48I%IjLB$D8 GDk5sa vnYuM 8 eG)Ņ߹a=&V4P*y&.[hBm]'%8;v 'oX;\.a>6$4=0ysfU s''Aˈ\:4SUr+0ZnIN|u/ P0κB$}O Haw zsO(D{H?0K}/$v[O)H; :$ӈU'OJ0޲`\f'58ڣ}07nԃE.HvxxDHG8 @a85(_Pq{B5h&909{*E{\e'Or+_ j<IU~Rb^ǓM '!xS0{rhD&ܓW dGfeh>zhE+ukT%`4M<` *ij}DB0)p76+#*c.fu Y>:H=$n.,mί[sΉ.X"ohD: v<84`bhRw!vԢ}j3[V">HTc`8Obɐw *p4F?YD$gVe!0@>" L^ PGx tA "6F*(P}8$>Gխ&\ͅu5O"n`)YpHJKP(rMa=@5J0b;H[=PSnuBn諜n,X-\\xj̽Y"ͮ*F`el?XTW7(pAwfI[m|KW7'ŝv۰u+AkqۭnL^5NP$X3juqbnlt@0]oQ)nAj [juú9ZoO[bpWV#fξ~ '%*⵿dTW<]݌ë3"UnqpV%b3[{?͢Qvo5TRU1nAY7U[ὫP($EȾa,Z\&INj'1˵2Azste[Tm<-ab"'v|L#bH^EڂTp `sLX5ҰXlAG!GTI8$3 vL>X &tMUXoқBY +~P"xWY |c.^<[I'L[IblfO%Q9٭"[խṍ~ ⳈfYrֺ97ѐ3!$lXQυ+HE=påjf"se6'@<\Z%;;鰀"I*$&?Iυ!Thob MrR>h͘Z\.ź4<|Ksava0? `[In(6'55Xz.;HN@X>`sͅI`K2Eh[d<Ru_Jp5bXg\ݍؠxL\NNT`IΕ&nXeZQحf:KV6wgkccѠ˃\X~{.qV9nEIt0 KuΧus"Gs w3`4 `/拓 $,U$E 6y. ;̅b:+@9`4b46k.Dzs[ˈ \'ie5I] fa /#8 $͢UZff '+]05X&"pbIC?̚5s!\]W&7 x`YН?U`bS `|ICT({/ ` |h^̩XI:v'1 $IY{S[jZ;{"pOOJ잖I-/0+g\X55khg6άt;MxOsa*RxGc w͓+&ՀX94iv! #Ӿ")( Ҹ=|q,2i켷gVUdFEi>'NSt}0_þMp'D' I1a3fEh{Z΅uOkׯ#yĹ8[[wx"p9G4` u"6?IFwҷWSIAf& s U@p2Jb'=p\ FPQ.)+X]'X5(K <@sA| ty `4B:Γcoh0+wI^l!3s{C} 0 1{]υra(k^.mW3:_KH5 _,㹹g5\ɱMX&mMs̞?sț\&Srs ҆θu.w @͍u8pfU fay!h=H`B.3qXͷ$_œo3,QF`CI''3H<\6Dlz.[ab[h&瀡/ mN9I,?ڗ$b: 0<ͦhXDrNIP-r=Ans Jx[ Z9]TT*6;uBpnTw[!";ܠ<_kuI'KjUoT͢Oe?jU;99V69,X0\{75M(Y,$&65*^hh^ずOVdۥxW7q vz~8basފ&ENx!t6xCa`4qfJpnjLЬY8V$&< -~z=s̊< œ> ;Է‸1- =hrLNzAe6YH1W*j궅oVݻX1A\p/5hs-UrAWӀ1't{qIC Ĉ{t c<AT`4w㝅FI:K$d$,`zI΅?,)=0DgHr.w fRBZBJZhm$vL0boeIn0qxL-ъYf,B{w2XEe5uw&^ݟPީדߧnGZԚlְOm}M F 0=Y'O:#vAsgkyhm.%Narx ]HL!ThY Ԭ{{%I}~|N^Eºݾ]8[nNQ7nH|E`5 cc3fhPs!{ųVjx HgVV<{t&乷hz. 1 &'9i5 %5:%Q#@V` x{\DfOx_bqOfLR`{yIuE.s.{{v0YݭQ7&%;x0Sqm碤X(Imo e0nKiu;"]x4Eш fDj!TNr:X$BxW I$i9A,XMX̒E_LW;}`=\"S #NCu`OhfS>əPR}~I{0kAv/IC+9I2ôYS<PŃρxhZasۊtN1}Iœ)JPNdT͵m.TA|IC9 {X&U "o):`I '5O*D'⎭RAT6`0VJ6dWv* N; =<zyua.',Żrucj< Tee^, >Ay5"n8H Ziȶr fB"6Isapd= XG΅B@`bIoēoU[%m 3b,@Wm•;Tuh K@$aP`?ݽ۶mIL*6kE !h!ZkZGk]@C}>9_/k{te{!5pbÜI̽Gӯ^)fIFDY+2T)@`COk$)0?=HZN8!B3$&gzA#pFHn%Dv'/&ʎ)~9k=j%!2|dU\yH%{0t XReREh H t2"Ƅ)ˢEx>1Q C_+jkK֒H1rd'4 bAH[%7OL 3/),H-<WW.k*ey!Kt!"xW/(I</RHnM%Ǧ*;Ulj5eeI+"9$-S N]Dpi`]IH )x\0HW:? $%Z$/M#%č[hBg8O& _/$q洬DBJ Jk!؆$Xs\IiK#:BH`_x_>% K!>^BH0VIoi$D.ѐ I'gG.i u "KpYK#!A{aP**"i` [+$9Dւ$!uDk?ͥ"~n!Ĥ. x.60;ߊcķi_yI~|x bx7Zz/%/+%\lZi #./9L(#r*Á]/#&.N;%rBb* 6F"rCآ>Ӵ86•Pvy,iɑ %0ļ.XH:j@gD'l\;hbCf^$6Ү \۞L%#_"H$BBMc-3D2K!/8&T~9#]ɗm HW,.'NJ#^#iR"vd9'wx1ؿ+z%\7tHP+r˦$(A%ܤzI{uyֈkSyv ^E,X3R̴“ӊ$ |/ц 8FEM_L$%d$NevߚN*9$Y?IndPd1Ľ:G)WGei󒰚2nDR>o.NI!,d}=ORP;LF IB""d0M!1doޖ50 ]HA]7X4 i_i{oڳTH?hd+$$iI EBA@lcK#!nW&Lj8Œf2Ht]HK&$ D$rRb2[tvD} 'PIm!$-L,/ep\ҀI%]H8YN]#i} k&aVȒZ'4V:YiI_ia[H$$.ydݼNѦtbfP dW-|I,vЅÔKJ'E@ iDx/@imG݆U[UT7cE># H-ɎH4ҴJ-`m GHԑD, ;Is4- (_KL tK#KJn0ҞaZĿ2-]8&1^8 SL/ݒ49=N!NuJ&NzBNSa&8č{OBa=H)[RHr]BMwNCq~ T/AӪ~`q&".)&vL<1$5oBɒ/KRpK'vS ;LK!Bb H/"W%GXab(Oҟ^Gq/ \!EIU*$ ֲҮ_G)%&v/L%.kk$D(:eSט1/G̱t㾄==;>Z=K&'ˠ+zXҫDB쮕൴4qIa}EDž4C? ~³]=x %_N&" ݥJK%+i7L2g d%[KfXno6/O(S0]]t.zIǿ^A^A^*"ruB /N# XSg}'G|90>3/#%CjM4D(f 65Esٮ*jxk[ҺKe1hKO/(OėELhJ+$ug0a?M**ѦRNDGK&==i .)deg}93.H}C $̌31{d^&/RIGIx ~"_O`!?_,d}YфhaojKHOv&ؕkʤ6Κk&.Nxdq9'6NS Jt],s;6e N :;{kADliq茕%Ű0Lr%d"H$/Nn$ybIB1CޅwF=+WIe&C3#|$LB:؛[Hq NrTԭHR/$xQs_L j=9ruy#~4ʴUHRVcCL]!HiZU3Um!_a ¥.4diJKI ]H⏳ EB򞋗HSPhJPEi$ !+1ZK/ NRsB nl&Us%,O|A[>fITӰFa"\/ icIw^ g'L!IczS%'KY%!xofk+٨񪹜@eImiㄘ1oiqDqi{hK/l@rp.T[)/`&46T9* #Vni#+.HPK&N6[BrqgMDcp~ &Ka~S) +d*2A_*nL2'Zc+MW4ɬh %pEbqO'rw`_5MSvZފXdtǕ.$YڗJpx!_[KF$ÀKT$qE*$j alc`JHBIa8 s-c y&BK$Av!$M%O0ĢKy>"?)t&ؓ>EO6O/I#Lk!R H\H$uciψHͩ\8$[L\jIhHz^"Y`_l`Lő贔5M%˓uK#i&-ێ2I%M֌ \ B1$OTUu 5"m,t~0VI$(.͑isO.}=soA=Y Lɑ>d;r#iJ+O8ZSو0l0Rҋa ^HG/T04r2) HJFs4ImL4HT\0"J~* NDSq7O5Jx4!V=H8.Z# f &!yoϏ$q.$ݕ]"!q4eIH4×:37ړ%m4wH ݵ4H2 h72 dĒ!bbK$. dd'av##/z9ARҵ}"g .DhU_}%I%fj-T?BXwvi $niouRH TuͅNaҥ+aBե5K2d/4:BR\4E4תz+"a^iIKGM=HZ/"mX5-4^3X}LbZbBIr-GP4,K|D8 ?j $IW_0JcI_.h{Զ-&9 2hqy,5!~S/bxqdp;b _ B$AJMDޕ2)H]1MU{Im4:`L |-&$jSa#!I/]yR#dc}"~څy!M=gM&%N"rHx^1t񴲕gHBK&NyKdn2HҌ\)K iIi$}*$ q *"# mII%p 0GҨ -t$Ɔr.VGґL r z&B4`4Uqidh[40tJa ~4?~{ZJݚa^abI^fNJIXFd2W-iPsEsL_:L54ߗwKd+[J!{!fV9 *=8!M_KFBǑD,$YI3,=Gt!dknH *|!ㄒu; )؄.20K"OR& ~ \H̚wxxIk$_I+e&rۮJ^:22HԷnI tﺂ)]+I3vx,iNm%Ϝ'T\`Zq!&bXg&[",6q|tɄIݥbSHġېd#uj{BRlnmg.?Ts_YHnɷ Ha^3dy=|!LW)U^bC4բ^!xϹͮ"yZ+5L6Mj$Gfd L.!ʉKE(4,#p38)YHZnu -2H6PLu)w0~9^*9REe2/FL oI\I˲'Cf/% ` LKaD’JÜK%LK&&czKM$JdBHHD^) )e&LX mB]&]\|\dd$L- [< 'qK#$~K#zBDȬ/aP9g4Lɖ\) \OK#i.,4I_4H"4F0z aHOLUwnd b5sꌗ.KF }ٻd3֊V.wxrR6(ŏ8`3Y%.g)8Ѣc-3͗=xm<إM0%-i>D.NҔ] 5Iw02 I\7_^4Zud%"$2W)ʄaZIskK'l,tD0Q0VR `K'tGI #/mO?!+ZzYӲ%ϖ2 L&tLT^HL*B »>J / wK&>SdT?M-֑t#o Wq3=j!$R]SNfG @. 0q])4c~SHiv?t&WF$9+"x$XBIဥ"!j̏O$$Y,# iɇd:B^i`t9֥eK#?tG_Ʊ?{ш?Ml4Ф>i_'@ IH[i`b  PL@&.MB*p;4kb%XgH҃* P;]i YqZH%!UʉpD{HcK`!&LM]ec! H֩\4"n@~{e ܃34ld;8tm¾1YL'u+nBHBr\H+υPaeL9\z&!Q:a?i2=d鳪 E4&^"$; "tK"!yS/$|4{枪}j,᳕PWLr-L䗯P϶*EI:q!X. &+#pYB'Ha=P!ХU4W_}$h?]! Hb 8Flф˶"r2_Hq= \aM.[gvn5rA;/5O $*'VHi_dh`ZH+D&BYwWQ 'h ¹lv "w!?L\/4E'h(ba[2d+$(zmăT$ "r+IK&!q!˥1iœ. .h2߻ę/圅YH{~i{Lv+3#RBGS bdL[he:4 ris@O1B6o&K/$!-xσ/$4KB]/lhh_#a%$4V[HKF K$W%_. vp[dHf\"4 wJd/u4P~e$6*ikBUtJGtSK)/]zldK䒷I:t~6WKĽ%YRple&_MQn֗H8A‡%<>;ϱ|]R&dicRmB'Ppx7Ȗ%(F[, py~dzY4Ly6o%EYi!${J;ZsU%ͤ9,! 'z4GpL1&z˼O64K]O.nbe 0xcݒ[7^N(g"6T+IJOO&tRS5t1O{DT~8N %Zb ^vK*\!?cYsf+\`y .4&KYq2T6%_}ٮV:4I*$zvKxE$^%[!tJ& @+e!RL-Ek!d-Sc.kOf##zOIQ^1 IՎƽhJ3?AU2K2k4Y+,N\ɒI}ύ g$W$ Rdɝ0!& -9T$Yo!$ u4'RH?N# e]1AiH!}v};5'wA&pZ2HwY\be xIJOBI*$~ү$ހ-.Bғ˵IYc I AoyLJL/G4 ox N8LfԕBJTzXHDBҟa$aĥE X`.lb:SK&Ë#K^#!{[_H=Q2TnX%#Bj%ZH I GBBNG!K#c\O B0j҄Ɂĥ}ơ\=; . "YH2\qĒtV%oWDτkhZ9fq?"4Ji8-d [T*"BC2NɸG"E5/a˥I|e~4ՆH,^{2—5F&R4cp$dʄbWEʄXHVK8#2GL@-'7({4H_q\m Li8dup4%^H"YEB24 Uk:佡0 'Uk a%1$w"r]҄I\=!?e$(3L]H$6T+ /49Id;wTf[O욒F'esu'^~Ss 1$jӒ(k!kmidNI\vi$s~K& ky!. 4.i4`J4 ½0jSĖP*ZiH"WVDT-4@2D[H*q PoikD0ݖ;O>Υ۸oa%8K#B *gq\i |&s i"lѺɆaYD$U4䤩.4t &åa _aL{4WZH*@ǼƚC97*pd~- ܣv- V. $:.BӞKU$ p. .[4 A[74@jJ4L^ i'䦕R? ~e+S+$qryDҍ V >$ !,5NsFXKҒxBHtNH%K'q=R\K1T^e"!mhi@ҖFtwE!Dma4LB8F'[ͥ(R:Ld4K!$BIabޣ&J:IXV|L߇XSτ)o{PiR[=JA_q# ،-?fitjJ- x$$f4/qc!dK4M@. (^: RG O g&RuJ'Sժe3.?{:1xk/Ed=ҵ}pD'^bɷ$2ب8uv#<1#JdL'@]2 9[˶Y j*|}79/voMؼ2Bnf+!$|WEIin:ioF.4\RpYN ?k]vyB {^(ͱqN^# n^8wE#:/ ytP%o+inϣLp &-p;*q;f AP!C} /]CPthCu-Bk#W{ gK{bqcgm޴Ay:V_0''Ύ7n %Oj2-OtwL%S\lj1p2eL1JwAg@eyNo$5Y[Xfx6`<gb;iy($*^(fO\5XRc.:UJa LlD&ڹDkGcjF=Z:Le+ȥG1hA"Osy8KeON e~@|v9W@3Av7 q'vYY/|Ο+J4rΈ_'92Vlgi XSIem4[󧘏ȏ/3Ԁ2յ 3 sD2(oFd !u0ܾܤc1tq OZS0xu^;(;!ߜp,%Q&>tds:lvVsbuBaԲYrkDI-1L$szwG9$m_WqϟKsjrNVge[@]pNUsR_s(FLzdMz Ã>9 X&ocO Ȏqw%6bm۾87 MH_o;C94B.#C>N.xIOv\Mr.9B25?@1&>x=|Hu+t>7{X]O9*c5>DpE sa7;J3F@ y"1C`8Z˿x=#=nN(x LeHSP "qemÌë ȧZyYP~~;tʝ6iz;C48j):/Nίq `Fuygp>^OK(OMȘ% &k۶g+S h~a{?Eq;޿Gw,;swx 1rGGc:x@S5fjֻ1a{/,W?G%Q鱲jCb?l;TѧhbXgqf! @naml[Vj\~q]Gaa5bg̰{9);Yb65;~s!P墌1}R殡%uv Y7j' wusއZ꫷,wBNuO?w:?_W16 YI~OITbBmRthjM}Oc\Uxgf n7Riٽ?.bcdyyNceK\_y/ޡzv2w܅<ۧoԼAsFyAQpvS=NhVeC ʡ# 0E{4#8f]p{:=gαpcQfNDG5Qԟۥ+:n ~yqcHi0:Ţ.6'ݼc?`q/~TDixekN`$vRc>V I0~2L8P:'7't]M@h -JIto{/'Ml^13KwChџwtz!;qxf&ݾߊ-W[_W #r]WJcćYGЫoO8MT,PoVgcŋOME>1o[tmg6Gql_#2xGc5~8]ȉ2g d`Sp2~3Cp/kϨkgRʿ =nP.#y<[<Ŭ5ŌG}\qT L~b}]!UEwXzSUSYCMAGrqQ8:"GNlC=Pv }}> 9!wλԒ`ha/3#>p}=W4)U3ǟ\BX’ > QryRA ; ?sCj DW"NT; :j4`.V:Y 1c ƶ 6b(9;9:+>7@M ^<ȍ|>P'XAIg5q*w7zΡj1Hg[/)e/g>{$I*nCj8›CGsp[U7>T=+pg4)}kv]H(^eB-K֟M]f4qꎆ*)Ds9D"@ܗ9+ pφI9voePb ѩGb|3u=mE #$ZŕEV󱇞; Rux!ۍ§Cܦ0nsh3j>OFM`C$x 1Ȭ*8 7Z Q[=u{ȺWYB}rtV Cs>s7VGGD+q (4яcCW!a~!8:{Sȭ5g0aq.(uº$o~Mv'̋}(sƫ[!E"BrٟE`Eux[\4$r -yt]jaYPa}`?w[+աFь'u<YX/xYE`i7*4)^3 [JsS{lߢϣzmND=u|P}W,bУ$crQL˧5$iS]rA^+ϖt=bDCYrP4)\ɳԢlS%3Y@LL"saR_'~N`>QĩLP7 0}9ԅ5+ U2Vaӝ^5 *י,¤^`T tS6œSHżnҙPӘCW&GKD 1Whɼܪ5³}vLTcߵ63ݾB9c\'Y ukOk~kφ4Oj f~l$nHLNML `"݉r(Sﳱjcj0o!bJ>NtkSN<d Tٔ).l(%<'b R34d]݂iѧ'Ϩoq )cq1&egߞ60SqoRpqC&х਴YIGE<.kSuRus_gcP-M cO9 ^cM=AG cMΫk\dϏf`hTI-ȦXf؟+αi:W ںxXeMb8>3UiqӞφ8R nSLNN$웠Ux7pxmG+P#IY(/֠D"noSR+M} (Dgp#˹&M'd`awkE?՝vk,h;!᝛$G /S*,)r(,yJ2vW(|w@5}r}[GҜtwtӮxŃ(S}UxG;m8|YǻH^OZ{jbs= pUUh!vY~8'{FJ84?5X'm:s~¯0Oz}Y)Pz)YxsORO-ZUcֆfO qSܔaOuO$]>L>֮b(fk~<%)([=E :XR8nB(OLvvc1hߘO}U }GmceF0|<a7mBo]}V,CfSچp 7OS!C1QYء(ToQS<ԉ;jġߍJnD\XAR31 4`P)sjj ΃Getb(3*p ͢0V8r{UPu} ۸ѬJ_iJE2qRwԻ*fZ/;[0~:'4DF=p/hv~Cqj9FHg=KȚk %9QjyfGu?BC=e''ӴXvcjOPo[)9NZiyP-V2Jeqdm"BzGGP䳨|q{@UZX#ՀВSO|m Ҽbl ]A+> r\eO-mF9|lmitQ-]C05t `%EH5;jZQGpi> zJ8tTkYq0 y gV§}WjKg QRe ۏsLݶWN )xM^Q&.:]Gu&ߢ(bgb#05۩x|'T~g=`(B7^7}G=fkQD!30mbQؐ({$, @wAQNkpW$@\9Eo蔷zGwniй\-JQP &n_l#[ey5jDB|~,vĪ9${Xƕ:J7Bh7[`-W٪R1Y<]Z}*<+&rշ.]q/yXhPelVf˳[⣏RRPiP4TA:R>|qݭDG뭶TS˅5RSN@|׉8ׇݯHR& `3 t8.5jeՓP-)Re&G Þ׏ 3xLAdO=z'bk;U5FQO=Eu-{ВS]jP7*갍w|&8-MŰ O6=~+mr_Fv Klvjᶁ LSLU;*'}!yS5E^xgjpzqF]G#0pj+u:]{O9|>-3 SOq,wdb8mx {ONԳ(}Q V\UWxjy#0+Rո'0CST ۪sx۱"D3bbz4`|juxR1݂%e\O6:zt鈑3jJ)V\,t1FbЅb4T|T!P׸e=P\ّw +D~JռxQ]:3і q&S=Ί;WT3վ-ܘ3Us=}QzlS4MksTNb6 Ϫ%1B[(V:Bmpa l>7b )kW/U Phؒ*ރ)+Tc0G*Ɍ8Z2|'dTkVטcA!U'[I6 E9<~y𣭧~,8&dr!^ yD4c'ϩ \iJ/m94t"5Tr$^v)tT'TRPRM2sT%WT*m\FqU` WS;us-`!_DVg{HU¢ ƥ##0c>8wU9RICWfe+rTx UV'mNkUOɀ-8ܖZbyͭeEѸ0je cJUK -NʽdX2XZ0U, ]:*;V0 mU'pw:BЯ/-VZFR(o|iY8_K V%?=UwbsGl=Ud_D|y`э_ U9Tߺq@[mLG BAU{`Ѱ4^#ԄGjSڍBn~W,5 S "+wԷ 7n>cWƘ2íiCî_U>[*?TO1>iO_3tx`U ;lB<ȭ(﫫O.= x1*45D9ZNVuxjX+,2j`& J+wínVn~@jop jT[CAQߴUGjuiV;-kxH":ZKBԵVIa qjoرAFZ'mʙ0JJ*effaB ՠG9Zy8{cWգ*T)lErZŚF\zh)P @ j8VPZњ;(敭6EM["~9oJUi[<۷ꨅn@rVɟ 4+ LbǷլ3jy =vJ!돕.vtj3ЂG_VXVFle?cJu?^n2Z8窡ZʑdoNZIxrq9_f[tvs/$oEUJVZ4Z8`n)t܏nu667Zu||j#QX+S-ziqٻOCliI|Jʦq#߯R/Q +0ryR2ب?;_>jfvzUU^jtW|S< Ź`ѦC^<x#Լ܈ SW-ׇպ}WRaWL[%}X#B>^ֺ+ATUZ*8:L)[nÉXW\dcz~zށ4 =SBWо?Ą *fsRD,Tͯ&SB3J2u7R_i¶4IӪ"B xzh4sv`wf~ (rnzWX~weU {={k^,#}>Zz6ON^/dJ1B ig`9 cIȸI:#XZ. -xke?/` [MaѶ/ '\G},G_б5^-I)Xe3C  SFLXESLcYznߩa#ݧ-w){`,>;M߽R,Cg%7;H(=Bjw{o:|b)u2b!cW@I 9V/9#@wAoX#&54=&EgXVc[2wс[IZd;^adh-ޅuTisˬkÌgk%5iE}Z:\ iqxs}JtFEָ-eijYR'ەxs?YeLey! 腝Ex:#?Ys\bStcY/jۖʲ9( n2[x3ai:ӯܖjv"p\,vi#kFc+r7Ie g.ǣAY)d:R8yt -iͼΞgJԧZ[b>{_:O?X?a.0ϚD-j3/Žh :Qkw)ǘ7O;tVgU)U׬#>Ggztq_yO"aҢ9|PPLZbm>STz[Z7>-Eik/شAk-gxd)t- bMȴ+4z'y:cm𰨾ӝL_ c- ih1Imf 7>L0kQaRkM~gNfnGf1s۵ւEѫZ."xVd<Ʒw)w19Y mn4 SS[k;@`[srў)ETR1%GްFp[u-s_4ڛުO- I?)-Xn8 ́ݾW 5nY8NXnMOLO:ef:]v^A?KiLo}`]7low.a1|υp[־&8l.fG=+x(e5B9s \l>[.~l6Ygs,8].}ȬqP7[e\WT56ay*J?W-׬|NEE*hNk\; -Vڏ ۹ 5Er;#fw`x6UTs1ҩV="D=̂.ˀ'f 6+bIvk(/G0m˴t,BM-10}jH)0E٧>g i?\Pt6b/=F=u'\αa=湶Yuq.-t^0ӏ^s۞m`*_7XhG<,B'b>dyT j'هAED`LW:Ehث."^ 7-<i?]^< |=izpIU^v㫤bW/WUdibڨ.Ep@]< %|`#;|2w>¹ vꮆp4וЌV]AOk/D튈gTAɡ.JfB ]h~nrhW]t 6%)ؽn Q:u Rx3shq` lhݎ[pLx]XWֶ+u޸No]Սl8j kA4u466p^c8`6ɉz{Cm}d]p#qB^i(#8j+RM8y/{{ EyaFU{bGl^l$mnݤxyTgT۷F|ymL}\Fz/enJw0z<.95zͶ7=WD0nC.!6K Gm՘ )]?M{:2:cv @bpSo^G/cr6BG\QOFl|6PCڴ6}G{08vD^CxZ3qHcnP:hLj7ʍ8M}w£~l* NxRa.0曲:K$ &8Ӂ{n+e'ӽ^!![{ͽ^N9XV/FX@6E=hkGT(0\_{|>z)lĤu}}4WK+X^LOBF<؞ylޠSU_{:ټz;%3/?߱_>#Kbu:bO܂ɶÍힿAЏ9^U^(ESOi_s P{RȢfy PnG\_;_b/{Hnu ϙ1qd{?Dc~v$ka7l|mpe7Sx=w bt 7~y-_*BO G /幘:ӕ_`q"/oy5'/}$2xCŃjMcn5g.J #SJW:eZ2r눶 &Њ3 iUg]]؞kC\0>6{`zϪaQ{M t1Ҩ-(kNl`ld`sV s6ܣup` )i40Q/Ft6`19`:!MA0(/VLTs5۴Bd+<c-Zb6>mQ0Sb:^9> Y W{Ql>Krk`‹Ōc`4^} Y58?E:˜@]3.{t0=s DC=rpEk Ѱ'0^KU=8ZF-)Mqz7Cza -59n0QJv`:,'B8[1l`2/t!r19Yi<0S}[sآLs7#0fH%ax0엍|A9aWUwȹ֓3Br T>a9,!'(=wAd-~ڴ+_aqWȧ0zx eU*f%{8y61QPG7pq6_fF05wB׺AY[:҉&o5ԕDe[O"b!-"Z3YHsDŽ$f_(rZsPuPS%W~!z0Gdz>v XSNc mޚrmԇIŲMZ E_̋O_bsbZlxGVқ_co`[]15Lzؖ&8ߏɚu:c9 3kq[L̨zx>Iu!D]LT c#S^y >kL/1nB^Fa׆b1 /o`cdX B\kPNL0 |)|?:$vrl"@S*X"Ϫ? _9z-kmMuXnl>BOFnñP7p7jLB >͏7=Qq T5QkƠ=^Ǿ;ts6fdm7gʎ7A]@t7,*'<2JѠZ@Qtm9${8ЍU\|QZY6 qFH[^@270wEֿoXN)Gfʚ#`QԶLawFhjLpLZ,,%!L0kO6 hP̭߽nI62RB t\;Y]/ @9"k+cp=6FߓM%mhe|eu,n =zȚ6/Ԥt }Bv\qpn^'M j#q3YC*KTyU,Cd_/kYs+kּ)%Su279k WkKwK ȼxOȧɮ{VTGx0fW)V%q\0Ve Nɺ%fVqT®`Tel =:t\yzReH+t2'ZL_Or!vSAn :&nh<'Ne-:ڋ*Ur:ȝm$ZىWp r}픅 8.#\~Ҷ { ф]5+]<|h'wE:QH'hBg` , T~fd2&i}^!CUf7; GGYrf1ev?)C'f*`b̴+2ԓ ֑y?SfأzY#>1qSfNn߼YYW4YBYZeflORj686kmTj!$fҠfKf[+E|fڡ;+}N0M5BqZF^3E[ 1e`~um!g EY<Ӽsϲ>I/zϸ<\YCOP-xy$yfFgM56Z*4n FY9AmVqȔxRJʟ)Qݧl&qPUł.imفoLU8|s9=Yt3kpCLhV@>DT04lJ!tdcl)jMzB'0,wQ >Ǖt$ݸ*cyEEl8)#g?r&m* Ds mp>>*Zab |P~бyc끁>3<`dg:-AdEcPiCႧFhM_rEރ}Q+w4bFb6&Ѵkom qmRf:l=u)BM61𴾙i>$=Bˮ]#2O!7˚V-=.Whg륊4F[h(V`buP n}й2&YfEf}TڋՠgC#hmyBŨ"{BssaLiX`S}d`ml6{˃qIl4G}t׆hjEȫC,xb^v).8hfCˡVyV?㶴{6o9ԔҠ?;mE@9idi kir\>rһCi ȵZNk-C]ӒTTvӥ׻xPW F,+Q:nߪ; 3o b(6VZ5$A!Ŀ">GO+pS 45Y4y0kT"5 qƣ>M!u|\vC^FFx W9ͣΏ>u#j8&2̢ަtU=m!mWi( 7P%$xbFN}bn=mq`PӪQDXԚ|C@nY8̷{i;X G>Ҿ!/0~ŴGM|U;qZ4[nW­*_@S'iTP{)jcjTJ 񗒹Zble@nV=r&Ņ};aoWDCQ0Y)f;W uՔ9Jp;j}Krj&\t~b@k2>Ƞ,M R} h \R3jm00YqSLnX-Up=8By˽űk5V[$Y[⃝T+Hd۵c  W;`i6ٚH e mgp]n`)XvUz-aE\Q6wm%lq/ÞAᵎ.zt*/8[([#kw4 # d- w,uxi߅7/qg6XY8w:L-u8 C eSxw"nqlN5wil,|/5twuŦAfۦْR~4jZ-PZfp!nXG6p|Q:(xX#Xf3Ublݴl zCIR>*,:Cfvl&ؙKO$Hbֈ6u CCf65@͋W' n=gH3,gZq d8"wo:[)Ooe|0;aioFafͦJnr({Il۝| _E[?4PwZ!xLwK_ev@gl}莗G0W{*Vޖ"¹km-6$xm*:%mnնk -A6s6L(rlHs =o[YT`F8[kYmn<[mv@QYiWxJ['bnmvﳏc s#DLx3|sj PۧMm3 _m4XԛlIa5 /0SYTo6>MQ  wH%pnYZ\qD7/g`h} ;>Y9oͺ=v8uä]t!p'J[z;4uzTm0NjWnemu_[n*Zt-&/uW4|Rwdutx 7&3FpB+<өr݂'ԷoV(N|#B5qKvde}}( QAS}TԂ @~J[FGJ^=6Y#Wk66B|#t oIr^c4fAgQmy#n, >N3C{:Oo x!.S4LAmF 2f%u(+9|b{o@8h7FX5a8K}s}4^oso8V2ÍQELJkAMqH:Ƽo ."'969Q QcC~o5w>JDzguZL|ilWH^+H/ CZB=Q>Mc"ahjNGPl6Յ>Bk^&]Ѧ1B {xuN+ ~BY7DJP@^uzar`-"=&,c@qh- yx7Pa[ftҶA].h7{87 hjs>ڄ-֤VAQG/6Yi/9ˑ\t$"m](ś*>Uc" ¶>mJ`w@,}JtCn 7B 4nZv)\'U !mt"U(zig7jo*Q8XvOG>: lG_aE?ق U!AV*#kz @n/Ϛˮei`rd8NC#"%WMme 9Z֟v<̞9O]?W z4*͘;*+k41JC6J"lJ-ؚ0з-w(}eW;P& ކ:09E=Nq=N<Ժ] (kBMnV9 <X:OࡋPۂP8ա#]͘|/ĺh$z?ӽPmc֣PE'zMҪ68z 5|>w&r&nÝǕ6:!ql- >K8Et+#=AQ߸ENenOp7n#hf8XlIpq}LhScqhUM_3HP,yWX!&:BZ m\c NYZG&=8 0W!qǖnV]u5-f{j =Es8' JYp6C~ҋAq#3 !fܾ*8`]P6 gPkq&W`jl(ˋ# DD)IqD5&n(*D`]D|uf\_ͬCDv 9ֺ;:G9'u'I9^Mن u-×Ol:-&ykZ1s`%q;`7r1YVt%wѶ,+8jXr̋D`IJQm|S97|WrN8 w{xɽzee@F7j$laU7iNr8>nմ';&k*wW&zOFNA˳r N.7b^u\{ xdK)`=RNid=ט>;XE "5):ǐ:!͝@몹<^1jtC4(n:71Niuŝ )%Znév B9øzs 4al|#|=|lZ~N ﶦ\-Qn._yq]Wʘ]>l|W7c{s|Б{97EpX~;Y!6u7천\EjCml<5b(=; <7`xu{9*tAAs* p\GQ *zҦM;Y[~a}]BY,3~D&oaTu^&;:oZpys6>?ࡹ1wt"U <C:y_G> n 7V( ,7 }1|hXQt6>^=afnCRtqD ;;tE++}·!v= U]-8g55l$ ˊ=_<9nVMt Db_Nleh d#t cf!Xoqwlt78OX. 2nn qor~6zLE[HN0 Ø+ABxDhq^CFSt(KpT1yJਇiC&psNe|Q@|g:t[exyMN2oƮSt &qIr:GAG ,f3fE /)#bt b:LNPBW_a0Sy+.]-'D|ѭDv{TtGEW7t5+^ZX}M-d服>%-[j/pdOH]K}l`ӚTO]ڎKE5t]_Mkѣ~_/ @ T.=&B'jAV-ۢ;p5+hc{ӀȬKnһ7`WE( yE +Q Ьf]t8oC5E+ t;6 tV:|:"UּA;C<d:tz\ i>E9AF}n,mc>hpvxMnȲ~<Zp^%[X_\ǔ*4*ǃ[5V~cpr|':4:ɭy c@pG^`r5\ҐC:hM z8.iն́NyY?yszuS0|W9-m;u5 r-]N!6+ Κ<_%[uw3E}:T>YbWf#!:4SА0W\g>@7H4@&Y^+tMcBG~N[mx],@v^{pA4#.Ί$j^\X" `i\uwgJlGtҺ`^4o;Qm]D 6! f Rac=@5Of2e Qxx=3(2lVScyT"ju[+Gzzѿ@)[prm4!m4-9 6UčKN?@ѽjg8]]`TѢ ?4S|ǃ7ZmGps:|7 @e9i#ǩ5ۙ{.{g! m3i]ͪ곢W\vRzsc1/;k ;^΃ kƶ8+y>GNډO\y൝ ܙ!D>Ob_Qz_"z j~xGmug߁wX3iѱp"8ϳmjwcj 0pw,C-qTuuwhCL^@_;a=NS⬡?;ֆV`W݅'xbaNc3,玅ʦ-4? "Վ<:=q:*CӌTr<i1%Xx /CsxO'YJ_`u탗ƧѓVW?٩b1dCx~)YUEгym(#!l>r0Ð KOųp0zM8(ޜ.G8x%ixoSբq T7m<)^vMU;F WtD}74H9Bh7x S^?v|P&{ P(уI<ڀ_* ''`xђ'<,/|ԡKb̦qO:DO[p9Wq3yWny]%z7GjpUO<ۚsy|lyoMOcUyphuC<Wm e ԉ 3xHKQ SyL@r8Qs5/q5b}mK`*wgwյ7N;(.=!'x|yQeny{yk=1ߗ{.QRDp%=q8wZGwc ZFV3t5΋V 3ˣzS4q^#lگNp8VSggyq|0ņ^o,qc6-UQ vϼ'谢R6QOu<x-:֬?w7O^yYYf&?Xbj:zzFYӱrpTH^<;!B_L]*xb {FQ"/~ETFuttrdwH" "et-G+t`2wT”TExE!8ƷFu|U ASGWŎXl OF:VhZ GY:箣[c*MyvxcoB-Z D^5Z;!$3GzDxI%| 1*~=^tgǃQ㬽}#jQdeTZ~ŀ 5TI|R1 ʞ;H߫thE8)V~d7 J`kiC޺ѣxSc6ҝ/iTa! H| 745 #n|JntV7*8 9;DRGn^N]Z;Ep \vɊ#RDY9`#p46nj "䑪CQR(GmB )CgԼ#~q*g{*)tv{R5`^cH *<#tZqj=DjB/ Hcdi;HTr N %Z^(Ïv WGM<Ȣ-o0_&BlGD&9,{ Ƶh%b&zTfr " O`i>:@4)2pd%Zۄ/>xwaéi8C~`gyԓ{Y0[}shdn߯Q^I[cu՘Y9?Eᘨ|2|t`0v[ov/A`PNi +!tFNs˱=0Z|)ʥx4gY{Y5<Ɣc+bxٯfrhfpiu&Oh7O}+G!ռQ!Y/f~1Z"?jX#X!b3o0%vQNS!^E(b;ޞ9~Xwcaj39a%܍dSY>MN-g+=/O{n:&?]=>6jSO>M8Q*=K2FHq0:Kl>Q ^u!*ux[ڎr*: Ww/>M*hUclJ l;}B|e ϔF`ujNN[/SQiU-LØ 6Uz 8ZVnT#k/1j4!+8 ,^JLiۅToW0(%MVxdoJ3FÞRJz62s,:Y9N6>okWAnR*=f>bTP7W:x`BNBQmɑԫRsIqH_Y.C<`/ ;d; 3.[Ւ=)S9_0#Yo]>K[L{0BS4cGZ]3bF8ϱc ݪvtn58k`rː|e-64Jpz`kϱQ'(a)U]>>'}xԝIEZhO<MA*qT}+Gc96| G\Ú* m NWF<|EP K.d}P`L׭}V) BCe}}]mtv=`OaNm\ͼZ8+7U_C>>>,-} AOk7C[׋d1b yؠ>B:[5{p Ā8}ɇ!U\Chʾ11* ,Ij~ONR'^b/->ch4래L]W7@,o! ΕuTI*؈~$WJƂ1˸>!XJ _MIf@so/֮1C> 0lF~MZכaGb犿f>eveq0޿=@12(62W(׺?3) m~Dcу?l~ e~E3l,BKV)OkU 6QS?@`"AU853qsi_ؤGa=~^*_l~a1 /.۳akt-~0?)|Oa uss>sq ~bزc˦ c]B:AdY sXM,` G&ub6]kd]\?JerU: 7C:Fcԟa7wpDfO`)׏RrL*HъA_&BR@~2.@(JVbךd?RBkIXXG_)C=ȠQ<#x@,R؀G@Vlxn /BC}nZJ7gPWB _8ur.0" ސErt@@S`8*LUB~z&loj'@ nv{@RiG:מ'ssٶAܯ 8u r@Uk:Exiلl[uDߜ>= ][/u0ه[>Ѽ;0 5X(T I|QB7=v;TCKISl]c|Aݨp>ڣLav3ipW;ufT]ûpuWpSsS[ȶ@[Ǵ U,P0 z97?m\9]ƺ:aJ=@0D!20sYGm`Q8Ye05wQ-  0+{Ī\$TDQ$AK$O(RD{QUm I)#ʉ/333b@dʹg"K3䗾Le ?$II@MZpvB?|1J5mZNp1Y ȗ-՞a5\zbȝ5-a&ҶY$\E5;TM  D{ IONq'yTo+e ˕>y[5o)|Mhwp%\ L+%͌A΢^͑ ؾmYAw(~^VSNťf;u,1%ìӬY{7Řrf|>;#/꺺q-fPU`-y:Yt0r!K2>cBkͲҦ$ǎ*2<sUAgmP,dr3@[0iZ 967 # "0FWtZssHơLcJT/V!*Ds9 ?6%Vdj[iϝ,JU #::'geoRo<3,NU3a;+Efh׀YC޸81vy4.N@%p+w .=>ѭs,%i)rΩHꮦ͵hYlX=k*+҄#LNgTHL_:YtрpkS wb*WnQjp/E_- c߳jF!֐V)*Htv=+.BVU(Er.hңa`CZ0M@qpyV(;wNZ^};.O5*+]aAipЈۘJ(+^RPh-Wm_֣r"V[x9ZɭZJYM-gѯPKR[ zH3ؚs*۹fjdEUVzi'UtbmD֡a9\5w9o |S֑~ %*GjAC}ղpn O`S6<ʭ%i=^\o 8k 8ZwR{Gux ٵUmՏZBO':uKHx+{ZҿvZwַ%(3qZ AQQݏ\ÓeW"7O$#Jܬ/U#EEɼP+Cݚu]kۭM;%j;('ڒBɟ-)<-l1] F`H/\l_il.q;C-f͈On5Mz4=?bE4;v- ׬)bEZv.㹖*qioڠkۢ34$hedʏ-K5w!Ps]n+ş&-ZqoZ֮sH>BI/CBwN[~mYGYbnRHLfd}MNEeT%Ϫn>cݕ#(2܌T ѪTͷ܉-Pц}|,y I_?Xm(8U9LqZo;Lw6lphTm[%Yjjl+=} p0V{V%BaV<)Ȋ?J,? Dص=\6*H!mem|t186%Pk:P4L\;B6q~sUh|Jlq^EqUsI[*!\o0!W-ʝ-ca\oǝ%V)ٞF8C5硺l\JYQhQ2ѤsN*ٸPe. >!`#WҼK9g*sW@>Kƅo#3".Ij Uskr7 &bsj|m{ @YfK̠@#,-PyqDEM@7U/c sƅʣ/-c㷹wjF# s۵K"Ŵ~’1[8ҲI9j)D*UBַ+7'’|E}±\Ӈ?¹رpD/.atN-[H@a)q~, ZW8ilSj.پ`նa}bNjv: VaF~~b"@S s1ccCU/!tɿrĴ:D).ǫ\/4HWŴ)ԯk "p`9lY5۹$b)ũ3e1{C,a6J-/<ELnS]W+}%yJ ǹ85*+r/3~#C^iDYKK} l!H>c ̘Cդm׫NN{kZJX|gϫm!((}[yJ_^?kZ]sXp9jKyA~]{o^7$y14.ǭ_%kQUP:5tSѥwylF.bGuL/^蘒NZX aW ݨ_`bG8Lful/T"ޯ>Qgop߼/%BYnm,G:J %LSr(K-VWzei G7Z~ʣq.4l/ܶz 3ZMmkXkMmj9 [?̀9 Tk0%Gx9RYOqǟZs:% n/ZcaX6raū~C7_r*D~m{+?u@<_5i{y\+k&_&PmW_,JGW_l ]EFZ:!W}wwj,[qCoqeirwCczB/`.`J1d0;n&Jm`9>GQ>ӏ`]|C^m1%l$@쫃[Jo 5BT'DSxz>0*fcʁp%JElX%YlqP`+`L נ;Yl"~x`)^JIM5Ν[€ͷ`Y\´C\`ޚT^3`>M4xP+Dh8"}Ө Qʖm0:kuD_U0It7F1ySkp 2"'N\5W*ڣq`Ps`dsC?S)Kg9/.36 *o,cm[8%1' Nr\CȆ4 c -^s.ml{aY+Ne2mV_62q ؛߆Ay' vT3~}rE$]̰8!l5Ϫzeۮ?|#B 1nxAZ+#B+)fzRe)fM5{s;:+e8bkSjDҰ:dL.ބO-BDdfV/$'$KkX>9ỵ齇'B{ \eaftwdҲJwMTX[khfu%VAWз0לs;A>#T5Iic(IZ^uΌ7ʗ;,B-8%\gh>s܃}ߏ67.g=ɺM}/]dߥtYhT=,D; 7V7f1zX=DEZg4_|"T}P|S9i}y:ctj3m%yx!MQ> `ޟ&8uև]tJ[O+. ɘa=bf\~|/%nmE~LȋC\X%kY-Oy!?pÐ`kD7J@HMsbܾbפk)>_u2k3-k[u,&8lX]tG֊/Tc|bE1˾]<@]dմS6`\pb4,29nٵ6[2豋f2-{h'm¸.w13ӊUR{cZZ+6mzٿy߶i^(hޘr+ZԸ/Pʃcu}?{5hI)E&6V"y1ϐ8n&K@L6 }F*ݩ4▅Z:,SW(KՃa 8A%ZbXjZpb#H.'x*alPj.׷޷Õ&c ;ƩE);K2yj}x&(ԃ꛲y5E([1?c 6k$سO|K4K6<:Ed= vʱp`wM"~,{RRb+&l%+1ӠBi;GWFĺi-J+[y"L9L`!GW 4(v串u;0斕ڪeİ.0E\/*V||Bo$Q8dW]0#jXrDIoJ(u#kjs"cO286Ea#q*9_S)A@ȧ8'{jC({ԒRPcP|DzHXk5Y?Am`d__5ij,;9'SX?`K'#P9=S%:wLFC!2rCv}d(669/J!Rys8`,/ӚvB㴃<9$GBd.Nr=JHwczg]Pz~dASnh_% D֬Td,Y)Nom "bw@J&!~vXuf (]h!5b0Kqj&A{9eߺy1DLU~VOD>ޕ'}FLg2/_Dϧ$y-[o>h"˭2oQT1iSR_)kbytCDlЎb/m-|Yu_gsVfR*K^uYē i)d_ +Nm_G+J)G~5'^Ps̞92ץlۣ/<=/٢q^Vx9wRh)+F2 P}١u[ nV %ْTIT+Yޒ&˵(2J z(ZV*?il<|-Rh(-˵v|RvNvܖZ>nuo v-r xp'ei5R[Fș-d)wO6so@{/2DIVwKD#7 *}:^SamN\)y̕cJ!D.-r3~TKJ&P13}ќ16o *ݪ)fJ-Zvy`['/Afj:ilVDͅHP_:& H q˙JZX^ZE}L*WZyn^7"fk~q1틍fr-53vCۏfwGh^M|ykm7b{Ŷo3⊐֙:֘keJs̬ 5pvƧCFJj;ݲ=E&pv|6vg >|%RiQKN{7l8:+RX,dbά+1SZ鰠7g4Hˡl]mz VJgƠ 3lZJ<:DYBL:_(HH{d3;'3h #-{kOUҔڧvp#,Q"VɵgN. [n%uK f7}>B v9|,C2ܳA\^i t,vϢ-LYjQyl2*8ig{(s7ϐ&}g ]!A\g&D$egqq3jus߄Fj<Лguy;Q™39i*霿J4lHϦ'ɳRO?lB;.JNvQrzxvR ^X<{Mٻm&mZg'W^"wL𕶔3n3|BPZ wia驴.gT:[R=jn,c?LRHxls:u{8*2=Ls~G66@Hu<;hbG'`+NW Ri'p3ӌ+qcJ2o4ꚛe!l%+NtSӰۜ{y=MB[,?d()+ejW,7~j0C=Ej?NDj6ԹVBԐ E[4-8_"VD<-H!xZۊ4Fn"UC5he51 0HMIΦW-jV>rhw6M,^f##Q ѳ$WC|dtk:kGUF]:55|jphv{?j#&Qww5b+|ŬZPU_5AHRY~Mٱ0Mhٚ6qykhV!,U(6=jE`#cVK&̩ߢ9\/L'}4PIW3C,3\NIz?yxLT$mh['Ĥ#2ǜx%r=φJvV!U26w.o,^q*Zϖ3$gǼɝK)ij3h, qyEw q}%^?=䖋=[U}~P)%1(OI=b 42{1՜I-펾^{%¸QkkD{L<>wI26B9ɚJ[*zࠋ:SډĔ\~Gb ż 'ZqӢ7u!#bo} -+h^ۺ%$?czO 8SVߵ H5˖VY=תw׆@X~ֶ1 MO}W$Va-3P0=˱budž|")L0U>]q*&^ *,Ů+^k9ؕ0bܿp@n0NWgF`HT{1rULTRwʗ37_*2~*cHs.k\fEԾv'F[a##bApm1k=D6O_^҂$!7}mP])ir<ݤ!{,f(yzj|u_h~V5O;wY;< \Yy]r7;xtC̋Vv8@^H"-||{}y\v NCL?nTkC|֑/rΒQqC2őAxǸ)V^D_{zYHe:z0FYWʚ,-ʑ!VfxbC@1MrAX\1 qY6gFŒ n,fpYVS#^3_w&Am`X*)$*fſlȄY)Oî,>J*/IcTh3beYǒwM$,.r[NR4%d -"׌TJE!{J&[,h [)w`W iblq> AmeihSIl"eY|;6KL^Էi'k܎ks(^ZLey]uw}5V)/?%5wMk`\h $' fh7IG-I^2LwHB 1Du4f"ᔽ{kT M ZF dpV~u52cjXЏ(O.j&;W"[ʤş!㫈9gCyfܵf{$2wmڪJn7}c'<!Xm F!s/`l_Jk4gc 󆀏;~o鶧U8gH!JOk5gؼ~:X@e1VZhόƥ.3 쭱Yfc8)=G3d?A/?XCGa"׬8c W0}:1`pqn_D4g䴌69Pn(4qcKd&{_}wɒgbsīYWe CnՅ(n7=9Ql"<ݦBhv ;{7!=5TWwaw gJ4%>FRݞk *-aȩMvV%]Bszxbw1iOW\o&.oZg1{1=ىܿY_0¡XVnTpvb?)amjaxI水/!.ZQs1,+]i[ÅG !~'͏b|0\">3eYЯu];&&qeD"LKķjo%c~ub&Y# {3OJP;I/ouڧ(Tn4J -1ɡ[AoIDA0?ZC$El9 Fo5&jm8`2`]Ra%Q8ޫkA+*'e>_nM6KEQqOcZ8IcR7I bGo㧆s%㊈]mx0n!Sښ8lp({)KΞ9G7: u`AJԸ#4*[%ljTShtE Ag-QGhDG W=_ ǰO8JM@/Z5xx>+*3Z2$$n?5fwﷰ (7ԪVKQzy<;cfn +%=$n/ט8%m! 1!brfO7Ӹ!īFTv\c /n,I8* JtL3[hu츣:l1Kz1NeziƠ3imZdq`묟 Bm^&!o2{~rj[}OwR [ǟ猵Ƌ6+%ݥuŃTNXҕJ4q XquJ.c iaZnvmgBik@&xl8M^J:\]Ot;r^/C{sqm=JX{d=.eyMPɈ]6%zܽp" 齝,[)f>/]kPEh&26g+X55:86װjL !8RLVdVd1ѣ_;\]0oT7 {nԍWF-i2+2, ՘rr8/G<~<?^ۚ)uNG*;kP YQi̐~Gۘ\oF=z87G!f ._7mZvoeצ:2LRtƣFإ{waᒵ. }Hq鲱ǢAYcTUvDiF֍6S;% J]s*3ǍǣYp% tn*Pa9G]C Rr 21"'i'*5ʽZ-:hrMh܇Q$r'T ?F\hCqIwfP5@.7䔚@Oõ-sӧY0 KQU=K@;%yyJ5cNHA[Nq*Yۼ``VgTZbw5m; ")-+_ ▓ʥMd"2^Z ?`r84K ;.%XUP'4l0 Z;sҦtSSEcǎ`R"w.jij ޏ;U hOqS<^y6+'Fr]ꆢ_'1u*m^F6㢇0=(\t2}^Gh42tU!m=Ϻ*R 0;:oj9g$Ƃ<$7Ŏ:0ztG5]RUEܠtKn&7鵋EmoIݷBL(zXKٗFz' 4Sp]JqǥtzC :o- 4F!=y},fWqm%ƌBML>;GĆu:2C:AǶ֛(F.41Z:E(sq"Z] Q?M$8M491V2)Pg]+LwGAM8˞AȽf:Cel+Ц[n-OOצhU7&=udOwFqtUe hw9W8OEAZ宸N[pDTۛCt%7t1m6]0RzDŽw/FA{xnQwrqfJWm PLݿ+LC@䝍Wì]>ZCˎd'j4&P(Cz +q$Vu$. yY S?C%@b&s%!M=b^HaaG ad3O_  jC׻A@d5 Bd yA _n2;D!4bYSBMNݻ!+nZoQ,f &%oE2`5|Cw|?!H&޸sE{/8nOAA d>`>8үȕe/Yd."$GyTsO=zۋi|kKY#WaJ+Q獢,rʅgnwĶSҩ|du;#L,j8'ȁϹv|ϦF6U9X=2REܝ"s T2x2>#酪3P9n~&S)O"̲'#@d}?!*pD;3Aygu&@TYMuBUq6pVIhj ;5_ "j=/ȕqt`Xnu}rp:]C藝`LZ< Av˂ȲCd&aIoAHSĠѲg۾&^?a7(u-͒OT9ueʆwGB_(5o.cʀ킜Ro'u'GW69+qdNgu]*p)uZ :6:;ISjy\mPu%탍 70u;`ݵz] חgcї= TLFN (WܓSK8Gb)5F*4jS)a!%3GNqŒ_yZu)\aOHmݣ*XΔGϑg &.\dzڨgbBŌjAI5 MA<$;e6+ 0׹Ql ,*2CtɧhmvMSjA]s]gI4g5ݩrzXԥ@a@ux3y&5yY6.cWR3N 5_& 3dAstI٠5 9wSx.Ot#ym8QWv^@pFM^8gZIp]<8_$ᢸrX%Z2{!^*Vֵr\"n.K< %rH,ϨK&d8泍?wkea#5lh-4[pl:71GN_pPϻw](PoyU c]'߁_\Hc8 ԑ^.ƚ.K`}2w~A48;.0̤l6ݕlxj U/pvz ,3d+PO U.xbmrrA{<ɼ9aQ<ybF馞ONQL2v铣o"/S{]4/oˮqSb*b}A4ʔ)|B]c`^dPGʍ:3)ો!'e Y.QCldT"n&8,Ԅg2E C"Eɸ9I\>S(M )@wY) =f2( h:)A͒&eS%R7eƑ9U_O)ЪHʔ>RݠK+z]]SQiFCuBʔ$lLVfy^P"Hr9zcCsp%($2v*y^ )3+0֨SfQNQЖ~aSv\N&="p`nO=; M뇊z!L([ RTedm< wY) T&3f}#)NBs5ȋ,\=M9ǎ W5ǸCKjyu8Ui7dlݭW HO34pR==K;E?tů*.[e`:u:D*:ߖ*),߄\r!GICb;WTK_6*I2Ҹ2]ij%S!EglpF7FlUq%_K@dQJCn`~z2;MA2=P$Ze8WDBֽ͑m)М$ADe*|jpzUA B:,,^xJM5d߷69ڸ,@װ+ALZ_۝|DS笭E(iKsSGHC3+Of;уwKTnL}e,d60SzV$X5ǻf+( SixGZxy}J(l^0X뼼^˟c"M1TuMzY)uecXE#V1dza>\;F1n8[OoE.9> sQ ˖(`z+$ljlZV͹NBiٳ(ay};?a( bSL{Vy;~$ Uj]O޴^^QԮƞA٭uPB/L'jL V[EiRb=52\>{lSCX}"Κ}],5ӂazLb{y=g\m˿<(¿=IHkYPf{VrٰN/y u w5DTm _WHIk(=i\d#${[|Z'7έQh/3j>3J4rw)G[> ƌ6L}dOc>#^G$g<NŊ&k}r%UxwhˮM sXꏟM$lnyČv^§YRz1}l> ?0i& j/bFk S|ٷ n\{2>6 UO% HR~!s@|%VuηHB`kH MW oWz$>na>RzNv bdBQ~{}Li#LXށEf} l/fy>& U7RtL_Xl:%Ԋ: .AKg]{}5덉'7}OIؗmo\cq6?sq{=l)5X:l|} mʴ/Þ`lߖgeŪi@hs J, ?4~ }~pi}”NF>ν9D߅S'XI>'g^IX+^+gU]nprH復m> <Đd+Py }"ƴ";υ^Tviڌ>N(‘e}c=p;Q *1OTtn#=>6ɳ%#qJZ>nH9>UUӊ}˪|S =çΏY1[Zx~NZ@*K5ؑP2e,'YO@Je#г)2Yzd!2*"!孆-go k7m]ԌVmRˉgvlsxdnG!ӌ/e E=A-J:[,x5\3ZD'1ɦ dD9Y{Bly#+Ca -?M˙1;y-B=ʲuy &x[4dao,Zr~;c!P㗠~oVys\A;3-e]t?nD@~y?Zm=|~%=2~˶W_FZRM3|*] ;|'&|~~)r4IkM~$ϦBɐ~Tʼni!s7~'hx_艘VmzJ>M9~iԠ#h~MFT~W+^~PutNK9y~GR ҿ+vRATe>O3i VO{(7qæ/") 7$<~! D2^J!p򟵉 CBFOktcǠu6}#*߿BϑQe |GHs0'mO'"O~Qw?Gbc+U# ZVUE9<0/h[Gb7'bg]7#[;+?ŎbEŭ{V%a6pʐF[g僕VSY#AݿMXfa}*pee ekBCxD p'e!5KίA|$5wtwv V[[T[F>yw 6'f"3E|yIiHշڿ‹zXS1FYcѫLӪK|;SD[<ROke(.8x^#HC][v]9Gyn.QwGL&XKF[b^(ȸf pYGf:CGs~Y ^؍#b6rU6t JXLT_.{8Ekf.Mc6 ˆGOkteIS|_][q1ޗ] g{yXjԾq/5t\"|x<1$4ũ'OFߜQiX׬.0wtw/9|6 s'B51% ٴaUkw@?Lsd9(?nfJ. @+*g .OR%wƵ).ovQPf&X씒ILhUbdn' c-3ë% &@I(.n cԡ##Ʌp@ rbz<C2JxAl#O;бePJxŠ_4|eK]-VvGSSϊ]1 J&o_}j /d-yor!TVÀCWD%YB _׀ܚ xл`st͆[Y_^7x`EϘ&1pC(VF:߁}d:X'] p5g P4@nuXcxH)crSrm`"Į.I2L;_=`?yŏʷ'P'm-Ut+KI\`D, $zE1)mV BYKH`&neC+ݽ7~_U&wpb6%%$uhsYHH_`O#S/0*.*Oɴ =sfSHggZ'i=A:|Rq]90زӸI2$n .ZK߉T r"[]>>{Ai97o@!U ``u5*qZb.@͝Lxx > lPPYakLHs.=Ðykl2uڶwLr.|5i6pF7=bR {f$N2s,'3 j2fY A'J}/>MI\QCr%pHX7{:ưߒCUo/E̽EM}tg "魗OuzNC#XFAk hG%+B. i4 E \F/5sHٝ)e(up g2$ӫƜ ~8;;5k=g9蠸 b sciR Mf}]3qލ -˶ L0zcJ (^yUMӟ2_ ?8%6Hs{Uk> L HQi*1~D4iGNHz "'+Li0(ގ` 2o]{0S|(Jd0 ,Ja3֖! a B[G/aTԏϘʗ3l)ϸG~%\|9P|D}nF008]ؿs'F=ovG 8ГRm];fyr6܇0Aޓ`BNw>!AѪ̐ ]1|=a'ϲrU~PTΚ:3x4v'k0#JzS68Aer,; HX?̓P%| QOsBj dqloϹFDXC|#ŞTpZqaV(j#ۡL^(arhfJ#oy0 цGni +K' sSev0;`a89FɄ.B*0WF+t1#wQ7r&Pɀ$Ĕy\Dy^DY/7‡GƼ;50%@ AO9lbƂ=LՄ+==^Wt@?Li3YEu~ܔc2_ R_op!U-%\PI9Նa+wz1*7oir%\B9dq-右p{"Ij7v|ìx 67IM1Q̌=1)\[/ͤW8[ [݂֡''܄;ƅ*]aS rdB/3Hkڕ :hsp)GÁCj7´L`E>"=aʂ:!} XR&(4|Jh4+ tF)*uF Jh3w LBh>o!@5 4 0 5 6Fs~ 6qC0˜مYCAχ+L&dI8W"l {Z =MVv~ٷslB8-%dTL$<ФviK5*4O {ʖE(_e%0<^k焥RA_ }G;;MlE_|~m:gU/^OGZe_[ )Yg`ʄIٵ-& Le."zsSj3§ªP)=N3_Ck%ev쇍} pҖ9awdCiqVl351a rfik&Aâ\%ţ͕))K BA@L7)QM z3v,Ȁwf]+N.2[1}>\(g,-x03ēFv35:)"3xjbseƬYkFr`%{L{mL:4A%uXQ"zrØX||4`0Ljf0ZB,75K1 niW!\3@a%+%<i_iBvL|%*5EbxT2:aDN&f P ?"e7nT;nm̆za݊#!i}\!Gΐ.bìW'Ś18`԰ V&=a炆F"\#i6f f?d5YwCȔ_iL02en`7 'n.i9an@Ԋ36\) d6fb CA&匟TUr"Խo lD;ϔ\ÃKuY^c_i!JT#Ϝn%G6|`B+@nvYDzXRfU)xam>U/HhCFpL69 7?yckIט %`ޅ5>~Tи_ʻ8'Sl3;R' r.s(r/&+20tÆ ̪<>x~73o0+ ʝ~a CqÏQ2 ,IUx.y(sÁ΅ɿCLln%P0Ĝ Øٕ@<|L FWZ'aM /O i:4x-VC* :G'Jdh#=<ژ_4o-ba/2u7)tXlx?A<ˇPYhv`?KG8-\uKR!u2 @gE$\&/_Ǹ¾!AaVIG3Pغ'W2,RNmtC'qS2\gj|m2zoaFxkp`t`F!sEߡQXjg#C ;E[aCߊWh_K _H?dS4n3tgYMܒa*Ƿ^QɠaCʰ73Ź:'Ϲ)7kPtOf_`k3HfS&v2spn~" WdPMj>AAx%oզdrGzU1t\o=77'&ZiP"՜Y=9b=و²T_\5X.PBeOD\E1\&A>sȳYd\i/Hy]D<Z9C,iYDRns7[ ݦ428i= !^qF6W&W­`DHJpDK|q8 G܉+lD3yD)ϘU8FR#ޱlXET/x4z,3CF\Dі4`I"WsKGd,lσm7eNF22zG^\i%S"fi)u~ "_5CqbɋwGx:wlBp}ΧRHB=Y+>{W_gHx;5C F%AL /TOH>qWTy#/wRK>RGCj<!`"^\c$v*s5 t^rs#jDOU*9h%EĎbʐ5o-bg):S}/rRgA4Y!h l90Dfr,z u8瘞vUvyĮ%gv9Cq2'sᓖ Sšrv.2s 9NUYo_J9M uCN@:L&gǕEKY_y}nlqf]q.'Þm^ƏTCiǐSoAE}IinUF<uO:UDőg4-9Ld+NUrד3&bqpG熋*9nr*~d{sκ֑0Q>>O̠X*ިo9 0: %%AP7'vvƿs8#YrqN(9?\n$:%ŤF [ Oޥ`<9D"#i'vV5]IU*j,TRN](?sJ$S sZhjp̄=ĴM?o>kBŐLIĺzV8 i] /&Nlfi˦=5i*ljاMf 2;x#DRGL jGjKb"?R 19NH,Fu0W=l6/q+" nz.$BTxp6ڶ׿F<=AdP\Ӳ>ӛhB>ytAm_vyV%k=Em3t3XcXr^Q@UQ2m<9&$)O~]:S`32U2)N^LUs6Wop^SL]=)VӐcdkU8lfܔkR:7ƩX1s"KiSQYI*㵔K=JWA,ʷSvTğBf\[zS"0:L(kIk, Lm Չɉb<)N]se+Y `Hgw4E uĐ͒*'||RTh7#׈'ɚn"V~ 7抃$%4hlt6ObOݛF7p(uP_[{738i{(2-{̠ S&J(rnȑ3{QQ`1g+׮ΰ_Ҧk1LjbR j˝V8X K3ksѢ qr !hMLjE cf!+!ՠ;AC,^0PUpbۋi uu0EaX7_B9?q>S̥$NmƹFEth+]Ob3#_0MA=6 Kc8"I$>cFO<RWuͺQ7xbT{xeS] WZ΅T.F0ؿkP3X8Pˣ}4gzH8ZYh5j~S\g8lhg؞F;"R3Nj!;Du+3CTrC 3 ) ٳx;0X>ն: IZ^-Ĩm"-qX[d396qtI+g [*X.htM2PMwe.wn}Fmz=\*@VI3p[qF+j-W{S|Q1OuKaF&r1xyy)F 9|ctM`4}OI'-;/Zh_ D}r 7rΕ8m:6ة!P;Pє7-(رB7ά4w#oݓ6jB6nDoӹ11 +HC%F WxrJ#X3&|LEFLD$7*Wɏne9uX)#tæ}``b\ \gͯJ{v* 7>vgިFI&7x\<~iLY8Ԙáj42O)Dd}BB4{U3 ݾoŚ2h4㑳=kq#mWJK;?OۚD l$NF28ISC{7[;7K9uSj1^)f+Yԕ82EݞZer {ܨaV9%aĝogˆ/ۖGWZt@9Lr*t(xQX7yk8j&1z*0\lW+K!rp?*16Dj 9=v$^?GTny3!X*[mZ#3r I+w3(H!dd1,yc%l ;ڌ.q݄GA6Kwdw5n3͛kDžՊaE2&(9jP=덖玍>:Z<2֤rĈѵXu3eOM͵x=xwLTA&[9kwŮ~y $'hאT9*?+|eZ;"~Cڙ#u#eFE+/Xϡ RG N^Ůx>:0Xs}CTԹb)R[ ?tJ#\B-F0#.GD1d3xG2kjЏ ݷǍ|9"?֤_5msk~Јyb֜:d:ԏzļoAw~.㖿`/#^ ND#cO[ G Jqo ?#%u҆R@k9Aǚ Cz',Y >;e?W'?t6 (54(ßsÌiC6+7MAdž8m}P(-~q8Kw[W8{yv:q1iZ>c}Xٵ]^0?b\&WR|q~J'7o|?k?p"X$_I;~\Ai50{d"92_j J )Vc!yr;x*>-ߙJ4^[ҴڹspB'9J[V%.yܙjF)<+io7lbȦ`&ڭ4u b]aYI<82`EP=W5";Uu;p>Wj`# *;N? 5KG*=qu6O h|j(,kVw`rV[qzy@+^Ïw\vWW;k_%:o)))FWeHG-SӀtYQ~11ew.b7`ؙ"F͝οqҚ>=Ҿ@ uk-ӷ}yyج0gQ+ 6ٝ8G& R;x㶟0SzI_s^TW0 cz"KAw;XskZqr҅ {a?HQy5$*9jJn Y!J'Ҥ B!SO}t)D.3X*Yޛ]цy8JF zv^-z] C#=J! !T_%$1NsBmڐKJRՎΐ$PC\P9Wr^!NTazduhH[.T7~ R қENj5!i/p !˫!ܔVVw,7+񃾵J?ߗAD̽WwlHՐOG:H=Bu֐ e\HJHM=.\Ġ\lO*q9:h݉4ZߨD4rHpXd2E& <;dGv*8|JCT2-"EkE "b6V%,l;k >2/+>S%40oNf$RY:S;!pbmAbRH^ۍhf!Rr:3g"ܛ 5# ;@H>AQiY6yyDX϶O+2gCNnsLwAN {5c#3EAFg=+-79HLQx<<:u䙏PjM4g77gAO9ry*vljR!UFIG#v5˳ZHX/Kz!?׳pš7cfgxT+Y|j'`(sxL BU;kϠ B, Y%*)O;\C!#G\.ψ,w'uŋ kB=QyבT՗UDz=%1G{kax] ḩxdy)3\d۳a/jFPCbIe]yy}i{ZOǒ=5vc?z>_Cu%bgf X׉Ga!B%1Q$Ni OI*-w۞h.NQ)/0k뛼wx H\0EKYFB)cQ]A^D.c_8ʯOi"eI2A79N)S HT'llZL{vT&)!|- )&Ns<:$JK3?.oJȁe2wCxɶ#^ac! )lL,8XZ9FBeg%HŎo)]fCJlK9:9;BJx1D|I1b$ub8gNߡl/V[{+2|%y*4X<,_ dϬ.)4pxVb U}iF ?#]X =9I/=#67ʾ}l]?QgfU%Qgr/Cr~ ~[P iRk#yegb]w?L3.!tF]1{+vf5u5('Ixs9w Id͙B'霟>qWl>"D0xVըg˫yqiV?M={ OQ[33CfaؤYAhlLXjpuPIB݃!hgCJϩ~ ;Cb`]Ďwͧ m3fYpەUT(m ayY`xk+T{>8x?%էmW WF<⭪lI$ ret+Z_%K6U7Q]naekMʿpTt _k'DͥOf?Z_Ok4$\#Zpc竣!lݭ\$,Z#s˯|s7eǗJUs6%;gLrN㽔q#;٦ʼ*:}WI5.v+3uK'}*}T(qZWZN'h?r%޵ 4i m+M>[gZ:X}Z\ɰY}S}'ۛ MJ43h9EA]%?V1x#a:6!v2K}< Iw* BwW4|r<{ptM,ۛMh<$16/4 Jc8frRܲYC|캙IMxnj g'B-&~1jjN 9RYDА{'_@s4c'ȶ ˇ݄c }ha:-4Ñ2 ^ZƷOphDie݌COѿqKr;# < /aYp@ 8U VJTf1h8iCĒf8*P4Ƚte rܺYzz~2"/OE_E:4t&agTD|׋z nl>&`'E_в|hԡ#޻N|>h(x02 ms)q,?f(M_b^= J(+們k1'5GS 2r1 ag$v#K"T'X.FB'`Mh҈p"N g@aяЃ ]Y`h0 B4.L{$RF7"~LO[ѩtv6"eV(E?j\ éGd]S4JQލAPc֠\(ٶ`z:al%E2ze z<ϖJ?~޳W|{!H 㾢 9A[!<gak\w!tM@lJt>O$1o.뉦4l#eNxy/]^WGẃ4ڨ1$(>VS*[O֢]9?{aC\:[ d^!]ç뮢c=w{ ~D hp-W:X4wG1+`xW[N/'/w;a#D (ϙ8gɲ?:9Mu!M*hoJdd Iw }kҩGRtD|G3+` vD%dl4&`[4Zq|[#t4ê)8McfKx͓}ݢhPvO ǣ~V@up zp>7Iк4Z|#p%ϭLE?#~4rY<ݶ6 -h_BŞш),Q5tEɠMmtfvgU*MwtC0" ,o&5)|d3 +Jᰖ 2͸1Vɸ|LK f{/o MJ59;z|dYBTcH GyT kx%5g7(nr96-XrVZ̘^N% z%,-Zny>ܚp=X-4kI#[1 ߳7?.hђO85+D U@9xLJP4Ӊ!yH6]LYms^ٴ˵LeL}ŤGNN]M5v˾@>;HНwD\%eЊFMO>K яƦAQzZthFƙM {ӤAd~EMg)H׀龓9=ӞQaĵӣ Jk4\ZbK',M3(_gښoNehPfXa"sqߡt˹O8kǦ3ynYf Cힵ6@j] RZ][m*D7WZ+ޤl@VEc5\&y$T!XbIeZ+M|?\kl?~^ D3x7չ@gG"jSL)v~oMnl_M/TV* YYZ6D 70RZ.)DAMͲ! /{TX:J̝ɦ)V.& oQnWk-DNƳJ\kVx;ρ|3bB~=/fVMmTw+fLӋaZ./o7Ai77MmҒ}zYkNOMU4YersԸ^i(0dF&$r0jRz.iι^G(4TmɅ!ɑZqZIXyÊENdv6˟ ~HNO '%/'ZDi uN3,PׅR6e=̰{%bN&1i9N Lɝ=6cj:?LDxQuʧ '8Tz|jA7O3F~M wLOCDxQիG Z+HHHr)+YL|LZiY#@z|I^M1Ag-w`Jr*t>"ΐ*?xNA Ȓ[UQGH~"dSohW`s0җ$͆_Dq~ص7bLAGK&Z!'9 5szsUf=eqT*L3,(ۋALWC sX:}Q0m~vOvK̑dzr4b@Eu9QbJ9PjF2I 뽵V^q>8f}Kiѡ)k 9IW o E$"q 5-~eB#-a0 K#{xꦽ[Jw)ߌzEBqQ_^Rϋ7u`Ԃ›_50cֻc[g#juEbVC+5pA5AkQ&Po$N JhUr b&QOK8l.(AM@ ȇ.ceVY!fZe ڌگԧ.$~F.iho fqR `#ٙ[GHchy[I-Y_G$a,j S뀣Ҵ˯ξաA,k6wԆN8fl=ҋ>HE`Fui4:N-Ͳ]6Qz)mÅrS1Ĉ2(iӵ\+Wl У ^k5,llaiSO"4KnSPzʜq_dUe^dSNu=PBԋ*.3iLבC. P?Zr?A:C SvH6Kѩ$ܭæT"}LXo1?mS9ۮSQ bVRf~ 0x.֪Qƥ9UΪ;P 3짱:G/m4Z`b95nJVbVȖp?:R+Uxh0 dF#fI9upmT׏!lߪ$rj u8?\XYA⮏uE 'cQ0Yj ؟dkNKyɯހ(9;+_NjѦ)j 5*ob1WIGJ (S#ꆒќhm~DMM_\Z-aQސzuaSߑ83j(b7Xl*-6#T|.?8?"|z^3e˥2rGZ yb򲰺Z 9[^dhs.ʕ}J[,5|(A6ٮP2rdt?앜Lun}jӱې^d Uղ_M(6B%ʖGuW'Mb3WU+eEZgH5޾z@s}]Y]pcE YxQ 0;d\I>[`bXZVqr V\aQE!:, [C+b7Kf]ci%Zm-z俥+de/}0YfͨBqd|9fʢɟ̛6np% Cʺ* r캲E,poFoEp_\Uz1U֍Z;N>u9M[F9:v}XA;[DI6$ӧLJ5Mٜ}^3 [Kq UK4GGu)d@omn!4ޭ⹲omQw0$% g֠U V d |[oJ7Z,UpkJQw"G5j\}Ilحq0n932RdWzģy_d-3jpwPk>XߵvFBgܩw޺ 5Y]&p.g]E[;]fKz4.)5,܍."̸vS3sqwJZtY.!05[ `G(6XBsJ#O\KJA_dbkOGjk1Hf5:|3TpIrg0Jׄ"u( Pٵz:M$宱cv ɼ\mV*4>oE)XݶteBxFu眄.G+WoVב[+0J yEza݁iIr=DBb zv\?r  7X!dX0uM8v 8g|v3>puC\H.\mr1 A_\7vn {@ E8׉'~885@_2:.9ǛBN aTj\s$X9?lou0KƏ!v:d_RtcUy Ӌо@vLz׸2kՈ Pu |NS-R[%7Fp3#' wDvXf#C!ˑ ]|3q4+rYXyܘjSYJ.@Fj[;.(|@ bnk; >cj(o:k9h SiJ+NBe{ؚ`+RdC1| ,e.Fp9]"?< yxߡB|C )w3KAk<;C "3&FzwP_H+ﮄF3CG>CI lf=)qI='U,IlMO ՠo|0;N_;߆6 7=LڬB`rآ\1Ujڈoze3Q_PMJdѮr+tJy` 5CA;+|N6e(nEGO,PufGx:c z ae_9"3ׁ X~=[Z9[z Яǧ_ E$,_߀߇ζdgtu?m!;O_Ǭߜ-碯;af$ёٚsU!hC5%j_SN&+2׵4stxHkN mtm'J=Tޚ_RsÁ2T:=q fr55XͬS=/ =G!{bCؑo?mpU&=6J 4  ypOL*?s1.Svll3$w}fd>7` L$JEo`S6Og2+~ƕ ?M ?p*1+;ضɳL4b56M(?V>92EOMdhiv)Q"(?1|_5꟒Ǜ #y"wW35#@aO>C>6|JW LȀ%g%5rܦmɅZ0|'|aρPQ~7x2 XڧN-:܋/pgcia;s? oJ;!?;tn_9_7v;~cIVN>˸ b* !=gpow1SFwԥ³XOdwU(yޠ8,MϾj((:Oa2̢ǝAAGkfA>q.wN A L952\l9؞0hy=Z:Pfh"166B+eRfk"+P2Xi=$G @gCVOajlHܵ]gb_eFJ!2(e=_3A,4K!ZZOb/hSW'5.̸5SMvJ-ڙR Y=L?Td!ߌ@SI3"㺩?S0Aj=OWN4!GUP4658(o:@Uzާ {d;  !([lTx*4!I^tA Ajdt_KڈMn?@lMG@5~ s85i%tP`CyJjCG7ʦ*ouL38tӹ,U;% a64?]PXrA2˫S!p~Nȟ-]|(x=rthBƌiŶZtmSejVB,-Oip%0"nVtƔ+eʺԿK@uCF0bꉊҦ87`Rs(^YGBQNF^ mjBdUdiC'CC~ R  1Y:T#0!HǿNnzxR; ?iL6UɘCNZGsm"^ FE[B=Z-8gZ71JX] n/;ڡ(n}"C#JBU$lmso2DYn|ݡi4{:A!s>PBzR-* `g|z"ƶa?L?Cg+*Y<+Zaӳ'I\=y4[PMŷ4(K}c_[J5;x&2%]v| 7ާ\.Tw!T[v L4<],i  (HLTj$-8\qԫ #{j.Xias. uʋ֜۳Z %6+RtR[A8E {td#gDf-tGedaCy7CPl^qU$swŢx9. q3ERtty cD_뉦65ۊdftKgDqQ҉%UeRg L+W(,4,6,o0w[>sᇋ;뢎E3x4XˁBΕl%R=h>5%qo[#\e8vV\\d+@KA"݉Y'e즧"r-1ѝbƒH"ld;md'El ( ނ3pBT!l:1^D)p_^ MHcJP_B#H tkӢDgl݄B=ń&51IJ-~'Fu')3(qUp[q/m |ɰČ )dBg-4->4sh,˧9l c^e)RvE8l![Ts삕2 eKcC軐rƳ_zt8%# :EM-sZ4A5;"dE`e,.6^ه-z],{ok!?)HXK~/|wI8YZ>({c=~nF%)f>(\ cUtk!X* ϣo;MR6[Kj[-lr(\4~RX:֤8߀#Յj%BUMN{hZKͨ]eQOWO!o$DKG/ftH,:*FPw,uAinq%kh`ɑd}Z!M-#:G:zJG^?ri( 6Dv0Tnz2cYЩQ؜&{ƕ:x|n#ͣ3LΙ]wSy]g x<,!΅2؆XDM_/:eȴ{{tD (۽;vs`D^cOp+J>\6E բМJJ`zHĻ .}p:V$iHl)ߌ 褃Qnں%{&u"X0Y TҳxIZoEҵ4-ȓ- EMɶIPeqBj=aSy"UoIFq%忻s%n>W+'c<~%tMIsrtA)(]e kHa9 ˪m¼Pp4㧾 :“*bFl. #$t2i)vtMsMvNg4{NJ!;l5<` 6] uu4{gt73.aKU# wgXku<{gLk"O̧ي)>(p'>C-b7RqSB6~pb5ѳ3 %G[I'MEGH?B%gU2ve}iʼnjَD`Kp+gLؗв 6-z6i)eg Ksdg6HoйMO=[_g>$6g9gyl(v? }I7ΕPu:FN:Ѩ?a`ٵ>>S%1Kl:lZ%l*u͜(uxiJq]1 GlA~(>RndpI0Ժy,8kh=҈u"ௗ^̦N.CZ!iφv#]}k;Y^6y:'B1,\Rze/3PRc酻Ҷ,ѿ{9ᱱRQW xs;t\XL *?Y\ KD?E KNruKc#:fKA+K#.$tDTZ껬首4ieq)/6iK8j}٣^2%}3KlpЖ/IfBL^r)^G| 7p}szg\a贳̤V-txU;:XzSVoY~*gGY]GK2+Y/\X$'gޚ+P w\w?w>/ҥ;?wV((J~6tV "m_㗢:$R͔kp)oj?ULiT=Pqg/E[IВAbGv%0,v*.8mCόoAlڃl.!H;nwm-[ċߴA9WB DEgi3k&<Ճ?5i ߸RŅh;pJQ$Л8ֶc 0 z/Q.*Bz{Dhjg<+T~I$tM*w!rCܽȼ7ΙSC%89 Yݺ;[ZȎn 9P3C036IieݺlkFڈ< >8""%"'ڰe1N!y= .N .m{|ȑL؈U,>3\ a07'n#w=ad79!g DŽi߅c r+cs+lh'hA-,"M$i4{ Jʼ& `C-] yBůlR%?!HI0sMC3`%Tn,ސ.7LC rʲШdqDr4>U  2omhyвiv6ko#\a1k3 `!؅6AgajW{ӣz}I9Wp\*x؁#@+RGajRSxaRvD%Q۪`yp=ŅMƫ!nonL"զxCN +IY -a 8Ww7QӜ7uVp Ȉ+a{ 32{u\f+_d )LՓ gkwHtEeVC=K’gBa9xnc0{kv†ϬǎiX:,,,CFi;seXaaЫ[N&c=AfA)z()j?&we &̓bXa~ϰ]`33\#lUan0,6(SyA&[\=i>0kfLZw4"(Aqb,B0a#xb.xV"GL RXμB;Cz\J^Cӆ&A K[l1^6_ "v6]+#a''macX3n#a~vr$Tdrsﺷ ?b3Fm&bF%Lw-F~#nX r[0.ҘNQhPh .BbUZ'N&l= 1J v0XE+üSxHXwHI-M:ubƙ뎴fÑbn i9z lz]Jؙ(F9) 8Vܸڄ[6%߻}>#U3(u"Geݫc7R2W.4a;`g nD$Ǘ1@kx1Plq|J1@ :ܤi/zucUHf7~`iľݨ=فs| 0n#ю!>73OڗkcLPN,s|@ xi y4:]Vv4|tң&7xVpiz_1 ЎDFp 0Ǝeͻc&P6<FXvt &#[ƈB:҈ɭ1ac[;l`ؖ(L/f 4@'cw bS_&12֤#nʎ 'd$S IW.Ya/Yh8-({V!#|?99ݐrY'(mG &dqBWɆyE; qVJ"%BK+dbWUL|,ךla8vL$=v,L&#ZCWFuu 9"in`8wdRfBk,q)4{Nd'14+l&V/2)co K'{`T6ƀ+L2WFp«sN|8"xBdN.S52W btfO,tT!tڥzk? V4c=p%^a2EuJ}눛8Df)d >Z-m#x3 3X#1BQ2dUdv pJ2KҚALdEFaS!ō;Yf'NCtfD̸ zYILw9ȒI^v`i7 R >s1 d[Y7DSN8Aj9 0Mj  H"T0`?v2]& !&mXU᥽ײlnM$aԕId!0gX,/VF9]nqҽVMeWrg u>m;Te22H فŬOLZx>3 pώ;G12sN)S }Չ0LHWx\nuСh<2@$2 ׈̘Tn `DFf һev6H^&{5EatQqmû2|1!d:ct,eգ8՝TYNu:jv t9YA R.k )$+3ej;k¢̈́}ݛul<'o#n4y񪹍o@f7q 3'=, fbM#~Q޵*$5Z3RUF>P"w uL0Ē3R(t t .4<>G/l(*3 N4Sٰf4|,V9WlffAqC-fϭT$6_x`wf&| P5Z,3FN8go lٯ T7x g5Fg!K7͖܅/0u3 159?s6;v Zi6ZfU0 ݙe{LQfW(F0 < WY:;3 rnw+M? <% @ 棖YfcETK|xsI@2g!Ti0,D.d<"VC@|5顊Dqg;" ѳO<Hc'g@дM"ܶ}4"K> ,ϙ rK$;|yWL2Gq8(R3‡ᅛ|&PċQj9hoQ!(3,X>p,}`RvϦ+<4=+K f..<U}Mpyaktg' h ؞ Voc[trVQfυ$8=~*% zQ)̄(oϤ@vDIN=4`YY*D$>m 90w0^V㙇 &~eg7R50HL0A Gz?52xIbng9H h0p~&<ȍC@LMD>eD$"l\ )zF`kk[IixMCڡE cd؄}X !:|N4^K O׆t9ˆ!>Ҳ9\}넶)N ʡluXVhbE) qn 9u(a4/1  FKh0 wh(jCbm nCszyye: бrkf0DyU0RZAliMd=`bo0iCqM#uO`3q4Н'2U}c3`i?&Ѝ @x ڽڭ|j.2D=4C#שUȦ; 7tVӤ;?.I*6|8;Ig [AM$bwkiPO Z8B2eclIC-&u\Fq 52ޱi $[Jzq(6iRjqvClzi[v%mSJ4R6P n,-mijpi5,GD_(ƆuDuK_(ORЇ*a"Ц X4(=VR=rtB7-MZ֎$\:v&ʔB8{+],gj w)ZmB6РFyJBuk곮 ?H*9ԭ 5֬;0[5#2195Fg:^cЌk4+TJn5գA#f-8#*okn=w;qX]Tk}K IVnL?*>I ˆGk5'hP m0Z@{$IE߮|gq ņs6B ۤ\R[3CRhݕ]vH{o[qƽ1e&ֵ@Z\V' Ɨ -Z8&60tݚF~_LP|7iJN5:Â<"C3mD" I=ʾ7)07bs$_#ć\t4h}=8%e}`@ *W3dDzr6!..%bs쌨=}w:J6roIYy^a>Yr\_ܑdՂ{:Yo^ o2lsQObJr3`hQ ,l3`kA#µlq8ACNj 8^ZooO _DGGɵ[\k K_ո :2>bw ]q~.x=s{AmQ3B ~~d&@tl'W㍌@w!4}sc2pke%K lf!i$92>aZCMEӝD*pAvwA&j abBݒ;cAbGy|V{t BC/x E+IڽVhʃpYs\wcxNPBESe_lt yv^廥 Q$ 3k=1cSR^DV;(=ЈG(oycHQ*{iBPQSk6QpEԾC VstO^ByB{F$loܗcߺ)o/5kՄxF@l:U`>̦^ݽpL4lջ=4[~h3lfܿ;V- &MݽƂ3װOrvjԋ]GXlθsm˅@t%x֢qXqX6IG< Z>tlY-xf gphiAp M)h0í f ߇5uz\94ts.3l$*̉h5# rXzH"A/1) e3"V}0b[zrƌz+a XGz@6حl}4-`t#=M>ddKIxpNmu ">4^| &p 7ݏ{~ĖD9 P6b|6ACd$u&3 ^nV YCdۀ;/@;oˋ> u@AxUmx)mZm7@>,0~AҢ5vrfr &mm䰆r̀zV]2mv*}B2 E ύp0!O65 ,-ڢ<ڇm-*J1^D mpF46'.ϩ X Vov,_۷F!mw3@}~_|=i~@9*,j0 茸=0ކt=ڈ 8 ͤ_v~'6' %VBcm+~Iơm#CNyn#y.8SQX<ɕca[=)n%P8ķki##m6g_~xV [³gWF\[ņ6 n-nנN`fIuL|Y'SsTCnM cg$5ԯz -69I[ 6c-t1ّC(n1i[X_RmyarDZ["s)DxܞkK tXi[$8&@=I@֖7uMVɂ k[# fVns5l !03 n9:7@Q;XJHXҮL9reE.A7{ VN/-{yOd%ƺ!0F'ą:H@ڞCK fx+/li8 4"~i@_[⭧sġ ezʌH817C;`5]38|ez/e 6^AϢo ѝz2k eبޙ.|)*a70$sr뛙les7)y5{omlm?6. [ T)dUȩ[T[bsS i;P^ HoMKw!fi5R\O8 bZdv3k1oj6r >MD[jU oI%{3M]GMb$ʋ !WA /ap;]PJe3p?uMmjӂvXeG B];R.1 KI{ 5p'pIPGR,>l 7  Ӡ醺ŽKFȳ+Z"X3imzм qƧ? u#I4&k ;b}qlqB q£ \eMJ`Y8<@VM$)uF3nQK63}Pq8 6 Ju&Xf☩Ќ/!Pa'W Wf㨭VRtĮ<ߤTܘ>cBh*tW\XY}w9/Ӽr*62p{ #SYq F UPD44: p DXqD&n%(rJz8dbeR,at,,W%xD2D57؟FI+#cr*ܓc!]VqG{ Еj^]nZ.1va&5+FDKTн(r9}]͜Ů҃Uō˺\ŷM"["l ۛ2Q¨ r=gN!Һi|g Fǫ]0srδ[榰9Fw`;˱}ڷBۢ$9!ۘ1"WZ7mXnOm)E934?޵_T~=s~ip,;M};NiCp l޽c$G@( 9c3lDBr!(%$i&0b.I~gNzv aU5bڃ0pdzA: w>`#vx> EXs]KRVk#F3Mw B:8ԄNY\8~\*ޙ;#l ùb|v'3Ǘ< շQsK _\vػ\<#l 93܍yH cn?9ѻbo;Ѡ5Ua9O7MfuPߚ9PZ Dp~ExWFMGsV},mw<19I:E+ȇ㲖9apV2BAȁ0w3s"زӽq#mM*pWt]Cj3'E 8Fv6Q\)۾g{9+[!6 " Z5zuKktmx]`wm 2MO5̜/0ުpĭ=nynɝﺇ7ԆUp20u `Jm] "Ç:۪}ed17Hn4?|uCOm:zОjFp# Emߠװ@TqSN( `C »+o.7sn̈@уoÈ%$:ꎪw&At *_-T̥q5}%\mNQL}=mo"٧M1^uط]bʅv;R& O"s3AgТɁ{sh5eXTOa2(XȊ-M8 '/bf<]igbCjI9:[]ÏeQ/nwC[JFTT:Ϳ3AP˩{rGʺhE?,DҤg3yw5Y6ԦHP{ƬXad[?/tjU puqܰcHl3D !^] _2Έm.2b7 ̂[;ʇ׿Hމ4u ڰ~N=.l]M 6vIom(mjh@@:FwN4ļtifh" /d/x*W+X7nٝhezPظgM `JQ?̄$Z݀#*ɮ]8u7u5E;xf"zX#_kt)!Kܻ0Fv '2lIcdȵYܞIŗ9$|JexO0=0+V5g}B7ylYFȴG"v ŗK='nR7S6ͧ<gfr> ";$%SG͑?AA}$G8C$M,y7\h&ͪ/>T(9/ f(CZRt 4?6B}Iʻ!X3ay7Za0y6|?Ѹf#5m^(t8aa(yT؛< g<Np0['o:q5)P7uu5ȤmR:u(b3M^B ?[6Z8OA/3>͢( =g6oqr9>a/4<*y⡰cFzMUH,;nS:w;3iZIgCPhKɻJROeeL*dFn^B/z_?YKNyu@z*)/nӁzS M9^Czƀ[ss@<zhƻףG- PLDcQSz CLHީfU~:^']5JFB8v^ O%$rcMٽ|V5g _@i%mih{.ྦC3em{%?=bF0 n3XMG$~ BXYkm[i#ÙTgM-+22+ t[Rc記4itװRPpb;Vee@qgly ­eS;aH1^6voeC* or`ؘ`/xg#Vל!ʼ` 44ݼNCף݄P(-d-X 3ix/@ƊVTKjaN EҬ T<-rJ| E:6B) oCHy F;`Z r וr¸D͛:ն.C XaTj5XNlDH&w@ؽ)Kl/F芍o/"[Y%(|on-2el9 ʾT88Ti2;֪+{Rۍ>*o1=Yo1YLb.egi+hjM0if;8k5&(|ΣZ1q]LÇC4 ݣ Je0& v0oڶ/ # 5(xȧb/7FA8_FCE h ӗ|hь.3 !{Zw5<?C}w8k>%L9io[@{C>ͣݸo3*l[Av:Ok }/tԐT)z ػ%X}| 2$'0#Tk Tog'0zrZ雘{OѾ΢^ݷAvdF}VTpDݘ2gQV?F=]% Ro,/@Q'΃HjAvANU7usnPHQ`O7U 2uN&!N#H/ۯ0r]׷¯fF?fQL7=jlfw~pHص?6{"{L+GԮ85wt㏝E5ٰ} $"*v~"1̏ăCZM~ F48avS ۆ*yD~d4ݕc<4Bl:y=&V dd/ϸD8wCn &~4Y4懌_#t_ Szo$t]4w깲Ņ e1L ˂th ˡG C~}@^[pq)() .آaL1iģp]xׯ_ ߡ!Y;P]?Pb)5 ʜZ_B=l &:B|!ˁh[|-&%zw[(eQ__ Isڴwǿ+WZz-%Up 1aiKQHƀ\ լ9ߓ"U]$0-d^#^"CBHsO J #֬? Yh토F>XL\X]Z l#mGQ1cV&+r@5y0 flQ髅4T솖[~pd6P8SR=¸>ꀖ*7e=bLj њtsg}zTo@8oPe-kRrI5 KXnq2ˆT Xr 1(Un39]]zZzNTgNaxk #X;0OfjM 2!(@BR6wv%"DJ7FH !A ra,쫂yDVB NKn`w(NI&`2z听W%`e@էG]i 1 /k7PPynD8]q5 ` .uI>#\5KőN+ : s8>8p̏hpЪ&'Ǡ%ћ5Q Ig6 3hj~=eEgO d@dt4o/p#7A@z`V@Ƀv1 X9~u#lVby|cJqgЖI`qUm6phrǷG H@6rG>,?'-9<RGTf} V_ Fo6 :^g9z}݃w v}@c0y&pt̡@n+a1!+t/q³.0G0W0<[E,X8 4'P0J|p胬-2&R6АW`%V zh9LE:۾68WmCP0Luƈ %itsͳK<%!ϱI0MAR`ph[Pcu;/?Nxx$-\⹰ ^7 C3".^ 5c / q8ל2V @;zO ^pP afCT L6g kYLoJ)V Q^; RW`! \.|1#ލ0\ܼ3Ab2Fkʃ:ɸ⠖h]N2yu6lg̬+@qM+bx)^ 0589az07X0&f| M-4| A`0 }4_o 1q SR_[typ ;/fB/Nq XGnMDjlN%wl@ʕʠvrM(kneAN "!Xi#hrn^\C?v>pw !.2 ik΄˞!8IBHb!8„`*+B=;4::BjMB8{kpz؃;zۮ0߻Yp%5|ӍI<5CP#b(b^ NiؠSM :䖒@kgrY8Ve8dviXScSje +AGQgڛ7,wΎtYg>m, l06ܣy56X J&YҢxn-Ye"0̫Pl !# ?_5'Fѳ ʆx{T3#B Af4G!c١iq_x0$"4S:4b U+d0ylm CGqF Zaů(Tښ9PaCIVYD M IL=L54PLd ̪[T thTqg|˜zgVhLPP?kz=3K]ao=ƅvp-Rhj q4cBE}ɷ\n\+;#a ΤA .wvո/CQUm{hd,iQc LV\~'֡*sŵD*0C+SR5OjW`$O'CCX(,/;٭"A'͜&4SB?\an\VsCo'yz U%0aCPU|w ;Wh^m!޷P^4l Rٺ2q8g&*8 b4Ϛ,6j:ckFdР>w"Ŏ%ط 6c9*;}c" 1"*;]_0^EۈA,D| =^7/@|g+@F<zK%CO9DPp C`O|:۟5_ 9QG'E):iS!i;+ED1`d _5ax!=y!x(r11#:reX+Gku4mNB8n0!4ГJ>o|e, pa"5l!DbJ V#FE;Ɩ0KJDǖG92x™YN 'jn&\ؙ ƶD"+5^0%fB̻ĵj.Ķߎr8Ho1BI>d`{ή-] *b /Q LQ/V3Qc' &F8)ydIJ(Ɍn.0& تH=JNs;|Iҍ3ƭ5N,W8 CRXGq3Mdb `76K X38X 1 ~J0l PH'<,˷a^&^i#noNnzo=: &I(LZ6:иΕD@K "((w%2f-bLtXM7v4C#Ԟ,6qr7=XyѝU55fގ'|faLDxŘo WN1NJZ}獚I:UL*eo1H+i<}39T蓺Ӳ_1ūp+ +StOWog%W%JQCw*3^3ԛS.{Q!j-a%*Ql GIfNj:q4 LgWdpZeY,g- x6 `C&~c"CU}u71 /+]5 -Hn@ #Š96cWqB (VĠ7NԌ7ЌќD7Αae5ǫ=ކE3`HO t2=Ə ? /]l^TP V47l59=: m gJ08ZL̬bSi »4ENƅbq1i1)>uHYhO^u49ȗBn@~ jz}AdO5-(9sp Ul*pťX1%,M8; QUhIM!VW3_(ubù߇]ho5Ȅ8/[GܞF1.\nGna{=YR1L߹|Knw! k1(XdžPGq)vtaU9ORd0G?0"sh ^UliOZj`T|dv j ?;98 64ExaǷ.@|GM`CG#WBbAQ';\!ȦX;@޲#Uui,1Y/+9ޛUe-BYJ3&AE,Gňj#wN& R:6\ֿ`Z^^1kQI@:uXhHܧ!#zrqN5g&X:`+ay|@+m??֭V`jcALl+G ٧G $1軹xn >l[=C`Q0"gai@7G'\#]}m=;mqT=Tg϶6!o9F,N,NO+:[3#IJ GqC&ݐZ\8~Zd 3Ġ+ \ v extj*:gziqꆜ؞:fCހ6D&v h^m#G34E g2 a)쐃HrltTQC[!gWր,:$`uSgd'V׆8 \YA:3u , yL: :MA`A됡U10=Eu 4Kbe!d 9ƑX4a MKud\E7@ d],CD!9µ ByȿHn6VvB]]>A3EA-v19Vct7Qh !MTWUmE%R1ca| F^ϻFJò"Ddukޠ߼icz("g˼S;Z+,^bȼddP!*rcdMG\qm9rCH}*uaЬ` ?72GTf$Yk"[sUYԧ~/O#%g6Gf@))zoL&>  PZ(HCr26JTG;r(os7H7-<+Ѡ_TOtOT?YEV[ZK؊ot#ĀھfK$ oq+g\BLމ rև39x0<$ "=5&5Gˤ"fXyB-F3L2Hug0>I 2"dVaRqd+)5Z) %VS$ڄ8A."%@-Io2YjK"0V `$Y_*ЁZI&cL_*>'dfFv2N֚:Ҷ Zhؾ3H e8K %$aIWr=ҒҐ4IW"AL;DI`{nz]%J^Tں T SQ-@me%/ɾvdk!OJt:Szy-gi_]E>kcF9 Q]R-0)- NMK3ޅнM,I?v2nE$9 =7NI&kҸd3UN3da}('opIPXUDNTdQ> lfsO;^]GleRe#li4+ka='ݮ֣ C1ZU )746p ZÞah+pղYME:e1(߆LHsd|!W{e>-.es1\h Ll9LSNj(}VNOheͳhO$`YZyNᔆ(OJ| a @ VfCԶ:D) zJ@ԫL*J' ;7Z <+6pTJ 0\LpjD@+> +s)F<+J/+a͍P~iT *fb 9쥭d!LWvZbIJU3Uub:cmtl ,oA]%FD@.Ա ;]$˅|&VU;FدOP@5kRu{k?fPCl,DKUd̮C|Lp#JmEi}#H$Z:Q,vm@ AQ֭R&vmcnK |K!_'@q=f :Ac"Z@ g:&w(-}hY Zf-΢l &&Zrg 6XKtUyy#?} 2f!q`[NA;.-S= @ږ*S} Da2ױ@)ТiZ8e)r/1)-:f~"JYvX.!VJtn`e]f#Tkq%R/Gǵ釙lfDY_F0^5"/[NnRJC- 12 bK@'ۼ xdEk`zRHeLM-39v9პyz|yAU2PsF}KxQ CfL. Z.h8qK+a\J3YKLM;{途)K̋4N{)֗uydɲܐxw)tYtz)!4ؗG& 1]fW3:] ;. ; rrgv1`1:BVG-Dӻ .Ybu(ՙ݆vvB.U8T@_/(5``.s}n`=U(/6xtcN}c/"aJR ؗWeտeqV"RN2j_ zkG"A@g_b\I_GJc71 $ń`[Jd%YuCͯ^˴),1;b#]Kެ \򜴇 KE;Cv/^ NcY]f.H1%EX'y,$率婘!+r@.KƱX#S|.|:MK,a%ȩS&3pA%L؄_Co8FAR!{f1&~b`s j~0|x)캤!E60npOS q57Dں&sT橂ni e&F`&88B\Ԩ[9!_Wfh;j76JE19z < b^dh?Y!I?0 [Zιv^aҽ%0[FЄmAL=曪УF&pT(&ƅ!Q1h,"u7f u!'@hfr0 bE FI3aN1 >i &G7Ew47D{zk ;Og ixs[ gZh0jnSi{kTL2T fo5ћM,K lp NT ) ϴrBB5H&`{ L[FLfjUcyp_,6шn@&T&AYS)z细J Hkj! }"n3 9=Ժ!Ja >#ŚHδrFG1/2<·i3G073Q忆}6' y]ʮP9&Z8L/A[! K`]:UkSߨN-/ *ۡӨ?cZ|YN(\Vz&zE9FPY/o ƨ.pE}od!.(?`|8?9%R-!-3+ʾNEUhjC* .{1Nzߺ=ӟUErJ.1W)R r).*4}HXU<]j1=yvzZw..]:)]o(NW@/B}&T\) cUg~F-*3y?-+\\ ]6՜E\ RՖ)b otUT雗~?ϿHU:p~-RA/J3ei|>W{gFM%)/Y }0xx v_.q֬Q Cz(?=>R-"k'~'xn/,<"IjIv/hrՔ־_~1NRFQ|?^/}^pimewuZWsgT\ͧZ)z^l}wYsy* 7ܷ*j9=:Kgv=@b@}]Uu\aꪚPAj7s~'ע~> p|_ؿK#C w_Se]|*y,6MEHY[rr»T۶$g=,W{ZE ūWK-STf6x R^į B/џ}LYK RFӇ53\JrR,J zY~W~۷ej,H?Wa,_nl8j)^}A735|l^"۟(<豨~ (<@_GMy־WHu]LTr W>Jڰ*)_>}@aSj>3;۔ԭ >ngP+y9.ԩ)QV>bVWSi7"ɵ/O 0_ r O9_\39)/䗯eIsbvPrpₕԜjjJ2Eb\eQIV75;la~_^&)zUͿoY,Jj{ p.RFF WܯvTu->8!VvwRUXpm!{z>W!U:{׻ſR6!@?HLJ*~R)9EL P>څԿ*y,.}rFeCM׋SW1&e,ޢk:==JjV₏hD\_,Ef5DCZ)RyRbC/.^b#§Nr̗WW#H(=QJ~bԢ1%LԬϯ94ϕo0mXNMUEE\E' ^"QtDm>T#ھ=JyT]/(P?0~+QNYUR%)b6X]-ETϞF?{L]f=S(MAVU őGBP&Rg{oHE|zoRq7BI!nR*G6Ry4N|o%;gdŋϟ .>ϟ19k ugR}O wbrJ>/wVWrY즑|a5/m oEǫi/fL`Ot*bN}Tl*R_3"-4_ק &G|ލ:4~EgFuSx {%tSJeYk c~5o-VYrZJʯXq~M((" x![@#*+. ),z((]D$~7MJ^VpEnƙot*/WloaTI?PEԺBEj}=xm*wRR%>Q>Q>P<NQnIԯx>n2tQ'U)KRs >zD.$S}+)~O㬠J kj2N>|j~RPleK5QP;QTkX>,0N맡Gz?Q݂`1h ~K|}ߔ,* \yhIT1߸Lr1gFLnq>{&eg)P3\Oʒ쒁>Ue&P09BJ-,8Kќ}{-LY5\QCQQz?+Dr?|Q>?En>ՑOei4 JN=}As ?+T(z򋳃Ⱦ7G{hՎQKHW6>|uKS*$xJqm!K~vﵙjD9:_$ '؞{f?t'E~u3to"Iy _'a$S]F?׿ 輓(Z߭PC'%?j1t)/_I,( 둊uF>XJKQH/|~<~ovIOrCZl@\.϶'ijkkC fygi01.3o>}^~c,/}X *+LpfO+'/U4rlPj PL%1SpRL^w?ɟ7[8Z_9Uygl?/|e*>kGY_N߶|Uߞ oXGPόNP5zO?.sϟ5Zq!q^`/:')~gFmS2ߗv#};Ygu뾷=΍ZExo~Fl̮}~ShW k Su/,Y̝;ީڦh=x|Wy}tsIs|-MR]A JaNE.$TOEpOoCSQ&&3<ii>;(=#si>|zRH{>_=L`sSz_G'p_Ԟ]0RmN^}M~ ɳAVIadDrH~W#& @IQ|K*Tf{Tu&?:k-~X9wx+s=-̝.LZYG(>'@"ۚ}6o8?-C/SK+>|SM_gK߇ɷȔ*I濥U#~c2rv͇/L!~4?Dϵ3.gL33ggtţhK <}hws<>^_ *eLs|aT {Z 4PY>}wC+|,ս[)ϩuJ B>}p{|&TaK 6U&YsmSw?Eо% juΪnE?.cIYK^ZZG{ߨOtuf'n_IuR&_vٲE VݿM.#~&Yfefl.2P<.*L. r tǟ)?u7~]"?)"E]h۟GjTnjsVϯg^_|mro|17 x*.{E3}x!ss| /+R(\bolȗkm~fgynSg.U]*Wo=ۼ~#@/F?O~.-XwCbGhY1*>*?qp m5|7s('4W1̵hJ+^1e{MQϔ[] +O|*y*WEoG( ܞ"߹aMV 'ion-7h΃d'.;?UV-P?gwԗN,^ߜubh+B̧SR)w;KY@35W}ӷ>E>Tˉ>3L3⎏> ?Vem~!CE0#Tv%h&0$Tqld7#C%2y`L{^KM)~)u$Xmlwj_kq-p]P+5уP(\ a:O\l"l*02VKA$ɲlπ&iVcnN%0NuJJҰ]1#̬")S7{\˃'2#i71B!٦zR(\=x*8I=[_wL1J{BdJѧDlٞmSqHwi3Sh/fW>Y赿U#X~.2veO/Hy'=hRuwsHǩ/|qWU-$ي0 Ҫ4c<~6uN.E^9nzJϘJkڑ9 XPO gIbTP7.F5iRڗZJNՠ7 e't(yj,Rn1(zf>ٚc,䊠NѮRJ ~8(1 2&seRfb֦^HGE2M83E#;r}ImJ ^M΋& MXS T3%74.%jūNzɵGO9 k!\qvqVJmǩhbF("{na`iQa9jNmZTgQ*k~D`JupBNIeF'J{GQwK R$xkMnQֿ:?2LJ&KJJ/bHw AR7e-W.ۧmBoZ|n!vA_0sB[`y['}w"%%R)Hcpdz@ VzIPet7Z*&ݵOdR:TPrS v|6uUWNF3HT]ي&%Ss/Dz MQ˒>Bosv߈QIɒDBЏh{gaܫPRف-*ĸ Vwz]w䭵듉j7j_2|3ubƈ?&QܻQ9V<>=vJxvl β`()6ƋY=&!S/e#H2h! M3'|Mm5Ӟ,dFoFY4(5 O"| Jڞ9#CJ2g"d[, Nmmr\eȫbys*G'l[^/{5v<6׎%.IV[tO粽buihK+ɷHm|1VĽל 뙇OJAf8r|T|րL^t:ΧS:oө @n&E'e%q6Dp[C◨n/z=SD* rݜ3W`wVS֑'ZNAPɝr'Ty&/_3F&@-z…'㮠__7߁@Wr > 59Y;跀#bLX~BY)I_$oV'Iy%*_ي]N]*7t6QK]&q:pp6RT ;ݦ#+cyؔ[)$D(g%3g tD+i7tg̷O\Pk҆V8_~Q,-+%hS9=QۮN>SО es)bch˽ˮ\748@V|ZYm-OS&ǫG4enov+ɾ~%|VGם koc?)M4$9rqF)d2nQnBdj 9^M@)2ئ5 0 /z6%OVjz!.(!']Myj[xWB%(QL=HJ@.Sn+&%`2Du"нl+)NZxXn${0H2{MVzKUm WqBU d`W]Z-N֓$ M1]#B*B >""ttjU#A]cE1xRx$ށ7qlRoxZe8Q ɳ a艿/ABm{Od424-D|!Rt@".t{r%DȱS,jURRt;T(dz(9a!,,Aot^ө&Vq7z{ۨCe~OJhr^IO{[?5~ PF8Z $q㣛 FbTٝk^tE'2p۬]_NcPJs^k{i{[-@Aױ`-x WϿv P촦CkP[J9b㶚G`'czG9˘b3'>c d1~/*X׍%yYiFHӯ4Yצ$S.Ի)!ͶƒssZ /ujV+Dnb@Ī;\YS* b03m >-quø bvkopyjZ;nО=aZ6$( j$Y䬷5t~d^(yX- š" (V°DZD;675 RF YfxIo9IU pH졒 sUC\\bG"̬l'O UYo RYZ7x40Zwb`EftBfΗcAqn~a= nR:govrIfo6[*\޼ЯYoB]zL7(9kC޴_I+˼s˫[hP)Uhv&4 GI*#]a>\?ŶDCJ,{?-'"9˧) շ?5aBܺ"1 /H@=){933+@!| [Oܯ"#Og_i _["h91dP&!pC[ćLØU D l=єuC;Zhx6-t8,gz[B_H\G?_|3_%ԇyqP\5Tu?=oۖV^\Aڏ q]7kĞzf/!7>1B~--L%Ђ|{,uVٶl G|/ԉh%^" pARa drz|DX %`]59m@@&}B&ѥ'); Ô |SY=E58M/iʧ mu.m :|2" ǩB/BХ|b ]HYULBeD\'>6skDm':|`i sy4'nMěay8EjlJ tH),Ҽ0/rzȜqn~6r_ݮVkM %z/py<e!VRnq}+NxA!˝nr9ºȪ̈c^Lbd?2@e>r_*sÃ&>E0~`` <)F`O3j_] J[LvBΚC :qpLL~!+ Z[: }/&(8ϓ&A[p[ sMM*7 CL{M[^ u„yԖ"- 6T),6Zl_|Ez`%xhZ,P*]:NkO xķo̒]|@oMAхDZbA1%歉W{q ͯ^̨Ҝfu%}Z#Xo {Wq" ] r dѣ\QCDc5I-A0t 3ɜ﹝YWǥUXZ}ޤM3dW)fY_K~gMLu#ٶX?0[ږ?N@`F(R;ks6oXrj"E(«*{3,څW}>uG/eK+wHIxi;,,:;FR[6.UhHyՋsv_7ˬA1I*_Fݯ0J{P) |8]S7{+{H] *?7RLկ+íʉ61k/,OG@߰-֌`-w22wiyciX2I[-Zzɥ򲵿IF;Z uX[D&KM8CxjiQ0WB ]LU>H=DDPNc B\x l$`+> ³Fl,B9<*yaK?O]Bg3aiPzW`rpUZ}&dr$BQ[bUǼw:C:vwhTmuyӚgPzQY Q5 `_qRWL|[gJ:h,ʽN@#"7"OAm_>M:(8J+)4@R, ag㟵r&W.bIڟ7%;OPem?,pt*ހ** (o"kZ2f?ٶOCϠ c ᡆ ` A Gþx@CCG.҄POj7z[i8ڀm@<o~y9 PC5=[$)"cLkˡ::l6 xZy-\< %EN N>4C+2ε[eL9sIn/$iƟ t6`W.uk7WnYMa_=V6pmJAyEOc DLQ NœzQ|5<^O1Nr" `f27N>׵("ƼfA$9i٭@pIԠ3xDaѺh+NkI˝`⟳މ Z2nHe23Ah3(~yA=ދsR85o i_B;U Z12)6kP?7XWFsR^I5Iΰ]t-XMO/c9ʋ!e/yTSwʝ0MEʜh 7| 6grYƱZQjE"b&b0' 8h-ʂ h#m fi0}YT# -jpi6 Vl2UTK! .bjܱp$h؛t^ m'B @ ee߱G z-&%<D&CL]lROAVRwAx~ 1js{=pVnme7k+ "F AQ +B mˤ~qn(-SEϼjP}{@l^gbҐ]f'kx4}UaE5dC ;:꩐ [9' [ ^ۤJCfUD+60t_ʌ b;'v6MPg!Dm)AfX7ځJqvWu/)ڻEnk@ ςjM#P=t`)~gj6[f.nHVx׊~J_ XPnF3-0K aoY6QGgXtaz0OZehL =/㗮_r`ʨ ]hI]TJupaw G!m3bxp9t]hh`f;E`,WoCfYlGD65+yo~Fx`X.{7zpP7^tTwdi2Ihah#n+2Tqkq.7s#nvG^'wnпb#{ZA VkQ/֯AϒJ t4]RI?fS6w4^Lv"[U*8=sP8r>K$c H2I&1h'21H>;ڧ]ʿ38yʢiS¬}իPJٚ1R? C> &0p;=fT1ǺDܣ @V>#Nl'IΗ㊝g6 U5DsͩL P-o}]8-Lo\I=}4ѡp&rF Zh߀{bH î0Ua^H=p -\EAuc9PH ٮ̎)d;FYQSXAe0I.jH哊7PoyŜy6G:a{zڳSEl6ݸ>qky\58C+<ٙ)k1տє)>1b_&U!/\ا 'jp˿kV{\EFb_4Z_濞 UJ̞h(s#'Y֌H!O{rk|Yߏ S&e(N A[fɓJ Cj9m&z6~7QxyPzsc?TLÂf1r$6Ji $,T=C9 ht{Mލi<( 2y3G\ɾ1d?pɐ*Nc=s$# QSezT-SK|F%}P`y[3׃ЦJI[Z}m*9⍾iV"ТY4%VȲ~F_.zT0'ttn|'jm\,LQFAwS+FOZS8yae9[Ɔ1f$g=t{>6>񥇠bK!Ulm[4 ͡y?o.o1: uf_QGtUqbZl:HQZ2 ̇~8K?T-":x*J0˷H$plMМBT+,:Ub9% |'/%|U؀+`PydѬBxDiF^2fwreDC8R:q[<ېHͪ)q{U|_eysR\-3IŸf,&0PWa}WQؑUo%yfJꡔ*#9}v9 ﱨZS*wLj 'OG}A)9餶>d"ȑO(q =- G>Wqf#fvݑ)!{qW>UB ,wpr5w"<|B3oi"khBR,ąB|/2Cp;Յg {t0~I\:3)b ܮ_/v<n`R(6Y ca@^o&5Ɣ nfor6R"BQjV$ޡO|3PZ[..s<Ӎ=?`dpw'A:Nx&x56Bf*`6'=A$ @~!*h8v4R}Kυo[&A˽&0X5CGkn~z"L#zJPjR|*ubK;*`.2o-jp yKoA~,|ōcVeQceѿ"Q#A;{LUѿWzE$ؔk>ޫ qўHDU$-'XO'}&u?{v?hE OA\hPcvkw/y[e?C*f:)hV!`Zm36\.nq@!]zӥu>Ƹ~Mj})=-=O(8̎gaL^%Guj{唅A#Uw$ZzL@ԅӬ4H'u^u;Pe  5Xڜ_hcC*!,4mp^(?5O]80e ?^qH)׭|:cǃ}M/ ?'}r]$1=Q2Ya9xe RirϘ^/Q bfO;ԋd ~@"2@Y/C~3+}YU`m=x8&qQU$#q/J=@/}*Q%GA+ gPZ^B|L,٭}AnԴy&q"lTqy-#MO8j[ ;1gLD}A_;O˂ts<=i͢"WDEgSm/*~aiی+" I5쥏@Ўi N(C$CG.UGyRڷif2jQfm®4c++:</ 7 (~1RM5|fQAAdg!8Cv͋(uXQvGvZ-(`,WՓbu.,JE]wF ⪭=xrBHQ#FbOe}ĀUi- $D\ɜcCr'@!|CkŋbA;,O-@`dř|,( ,jYޒ*A. #({s=B_H$>OYP)$w۷bef%z,ମ(H3%Rt@ġ V~0an ̓Y9(=^1µ5 eAOC@vlW%F)8Ԛ=S(-tL},zO v]CB8.WO @uP( K|GikhZVܱ0 hUȁcQ{kRĈkw-J׉m, *+9%c7-}h̡n1k0 a@5z<@eKbF:*[fgBLئ0YcyӟH < ԦpFKx,_ l`Ҷ0_gUb)w19$_̼i^a FS / zKD6l"xb9:Xe5KVYDyX0HfbV]dwNDx~@P_GZ.Jh \+&t ESQA!7mXqSTɾ&bwֱD\P7gA8Q:j9M7ϼf>ef/ȴ'%Y!9Kc>tBv:2~*( s&BI«˒e#I$#/5֜ElܪE`z㒉Ǯ<. dqK/pb. -|J@, .E m0?zO:RP=%DIy/5&j(ʶuny .řx !5,Vo[݈M*;8Arr U)dz,B?(3 %e}'rFB(@ U"󔆿 OdZa 8x#!TKXYZJwN-xd#oH6<0y_Vg­,{m(݌b11LuIz:T׍+]xz'uy@,뀑AQxD[v /h1 y 9XX.` i'pJDCִz3;tᜎ_p-dEm%)x;QNIBz S5@4OLApr(+{ l@?bo@-k'b*NL?]FGʢ}iWnIPFK޵=:6qI''P7׀a[K}c蘖 WR<2eZ 2X&7rxbyMߋԾ? PU ́μ{CЀ"${Ȉ/tVU4ݏ)MkFKn/)-z@&S/+0] z%kF8*'hQ8jqasAMUr ^>@.h| t>&'}@K JβG$L6]8 ೵cF8aKY t:8t|fPUd,-{>8}1 .W(zlw/mvPWYu st zτpZXDж[ }r? h =tO}WNY) *0 ƅo]Bh" /*[ .(AWwj;\دzX.֔4`p]M^Cl7܍L~bI^U.ŝƖɵ@dy2QNu1tBj0(Pc ap)GPN}?`>e.S21À|4d72ot ;^$d7a=$i+.)@ߑ80E@i}Ӛ<^M$+JHibɖ|{][Iy)a%.-닰˖S meJڵ-(MߖFk`x`6hh8#qfIJ+"W߿\{Zэ79%vOxcge=r ;(و<1g8t> zL+B 1 Rl-:X^~`VHG˴=ɗ,ji/ZR{È&VSmIemJŸN? ;16:EJ'H6!Ukڝ-Ͼإj~zU< oTދ33z5Ch@mYEs5TR =˹q%PrMf1BB opUd[u=!WilYI6Bsf5'!tpC4 +$k$F>C%]vi+Pp B%KzO*plF g7u !bb*Hr]ϔd U cR)pAbeEcB P4$98ate;}\dIz@D2t_ldT`V 3/a:.[x8 5xge@Ң&(q,%x$~U+p]@|4}r])@HL"䷚L&Tftu/_D,2|DR-lQ`mZ\Xi`:zsGSzb8`]=%DzR-z&/}q&0K %y5W.gJB-Cs? 8w[Obs ⺂aZff Uk3 .EVC0Ng`v_u _@Z-sM 3yc}\((4z6=9FN4.fظ׃YҒmH-2aKxT8^tz #‘5K$,5%n䧢 No= i J`àNY1Ɠټ40 ?-q$66%I?o%} ~d\8KGpnttTJ Wӌ-pݗmOmUarakT٧&d#>30"GHGگ?R|FjL%r)sgw RBV_ É8wѩU\ [XпFQLXɌ&ΖkX 01c1GTd! 555Sl5> "aᬭd!ieU ([CYRchpC-JGOD': vFetiCGk=l|^r߾dD.=Jڱtn4ƛzU1d~ocQ4tbU$*u8$ t|hiu1aVndAmG}믋FV~TepoK/?ԋ]A{bZ?&oqSn2 ۚ(|~%nH%)L'Ԡ{sH:HpެO [J7_z\OOkJ~GMC!ƇM\M@|%7K*׫%L8q5F<@`K;%(|q03M$'Ij]{Q6;bRktoB2Xv.|Z#:=Xu[C6d]󃆬t*=E+u $oe,|i6gצ<7E9VgcyOyCvbOetV+ۧ /#Vdjf BlO<$sIIkt*ZH#R{$!3q0ZSBGǰ}as،s6@ɇ-ԎhS ۋD7_D Lnޛ-38޼ PЂ G64EL~qTU׶mZ;H[l}k9K6bPלm!pk?p*EE~ΛY{LDCe`o:IA_i ۢ*p>WFyso S`\(fi\[#(c*r'quVҸsXtc]{D~A4H|5)4o*{Vq >,{vk:[I@)b{p_t,@l4:%e_ozRm:5/|N-Ÿ ~wXX,! %D7Rp6&'ƈٳ6D;e̡[λ# xZ!TryKN3xtK*0Ku=p 5>jg3j!7w=}ۢS_gYxydژ7>Ouˆ!˒|d?BO(f[0.=ᇷE# )TaBwRq"k9{w&FT82ƪC>MMZQu.$pD:c:)v3:\!8]V"H>aС~%v>S|Wگp:D3M:q瑳 RL:n q.y(nU#ףo(;.lPؖ.@iެkjwzsC+a)h|MY o^|Ue(d}lz5gO+6慏űJ?O0v4e=j>ǜ(?!H/m6VvƛKZUS(k4C/~[{bZFPgxm̀)v#=Zv#kC0[wqB,wd~u,^p}߶~xz[e~(&:}QH&Y^=2q^846-P?h>a߸ϸ+a*V)Bj7bqy躧 * Jp >b vC7 /|O!|7+pL5c ::Y8FO̶HdyS u k, ˱ڈbIR䟈us'n^?j:W[ʋ9',e5cn$7͍f 0Vbynj'h-=O:zg{dħyOeSL$734 hu#xsymEIEA-hu4h CRFY G*Iæ ~z{d0'=gsm?TEݶ @e# * Sk9־,@c_.5j4"ۍ2?CyMଟc!zּ+DxvcHz4]\h[TNl8qɮʎw*^?,+dK\ CiF*֍_(:$8qqMwvK)-NE e,tY U-N?z^ S3XLiwj1dn(ȐHw+o0a*=hy=|^cȋ6![J ah1eHI\ Ȋť/$KSk"]MɊ۪hqkhRdk.  f/uU},)7a!llfmk1PWk׹ZhY0ZSPH8zPe hkheH4jPOZl tUKbŠ38Si 8Tt-!l̟HA̔bkkYpG/TWdN]rVtݯx53!{Es.9/LsnͶ5?6ip:q1cp(4366RfS s!n{(=Zw,?t2p%],z\i)vj_ųӀ!чV,& UI:$,&Z{׭b%vatM2fS8^9Vo&AШδ,3`!Ӽ7`[|֫ [{&iY{\x*+f]d0#93P&45fT``yJMS K5 Z-D gg7W WhXl!,gU`Ȟ0kłp̲`b8ȓ{EC Zfb"\-\$Z> /ѝ>7[2kO4*lᶜ+g6+|1}\F&nX ^l-_q$QY?fI_rxCݙgi38eƔ-'Փ@c2/΋-AoN) -Ȓuƨsw' `%̮YW<ګv vo^Qe|i2*B'#XcD5MUn5m~З؇5/. 3ѻϖ2.$uϹ~6.%LM+ >5&/ZoihCQYT4mWqy[7 j d5~"^TwLb㺥g4&L8*:{;e-pܼl#K%̳HZeX?TP~ ˀfe VuS&"ҒxzE,^Enj8[kPc@@ȳaËxdnҳ2hCewww.Hfdј%i7Q2G8&>ԡԿY퀁}NgUo66&n C'ժPȿoaj #ҝ-R 4"f'wLvi}:.4k0 LlM1 3xR/(ܾrX:Gh &8`Q\ퟟ D !n7MJx4Բ$ړn:Ju+z0E@t9 δGq džry٨|jNO &u(д5*EH>[; |/KAYLL6uqH^ 4pq&JY3}h9d~eI~Ydojc09g̝O'={pkU>DIGApi\HA3vk3OFu< māGG8Ptvw0Ҳn!ڢβ<, vǢ*wy: emUqR׺Z7 Q5(]YJ^Kg;n]eܶwp\iC^nb_Kq[lI,рȗmp#'+}4Q-4kj3{ze ]ʸmܱ 20-s riEM@t \hKC;q@q! Vww30`܃+ud!Tj,:xp@"Vvn}G row^^U߱!]CHA<HBXyfz' E-LNGiZ={pBB#ߚ#&]ŹBajWA;T5Te1Q!ۚ! i&CerE]mw܋r7ֆ#(ZzЀJ/a`ƓuKzSU%Uv$h+_RýgJO]jnk0 jZEx$7`@90X@[c50sMYN5+G r#'!8b޿P ], 5Ĵ`І )Y(S3)?ؾa6 I ?c7`\G;esdx3O`7P5Uftݬcg^zxs8`ˁo< e1${O'6uEB5VN2%ཽsI\oL0j ~ >2袗 ݻn$«YyYz}+}._CѴzGЅV&jtMΉѲ:ܸ)M{I3RR p ?Y Kyx෬?h=`"6[ 35*̗o$m|~쵳©g[˪yDf׫9&LUGǨdڣPD3HjV C[g]Gw,!s|՜.pL,)[KAiPK2lxWfP4Ug* zۢZ.4D.%GC!ѓhCiu;ݮCfʶ 4!h#7o:\j鉹Wb)IV_]F~5Tԉ~5;u"?nOҳ vs<*vxS.œ]-Ye&72%Aޗ<e7TI!*3DT c*xe+WqE_A D7-0Ebպ] Sj߫3d?{MWĝM6.PV\fh.ms&%f-I׶x@۾ GYT^</Ç>!l yhv`b I@(Ј )RU2ESqXp]Zc a*z׺X5rZL~'<ÿ#T-dKTK Tk$*cc鍐\ [[=%<]؜ckB$a~ fIu xH=Uh2"efkrsg$AJx=j]?e iZ70/ hRI>kQOŘ{x1 jq!^:TGq2JG#bu4& (E9 Mi~I:3P>[lhiwŠ+]MnXNqкN+&Љ_V)4ݧ \xf5K _ξ"u\ţϿ>߁$[(GY<Þ/T6]5Lym5Qc!N]oXiP%ax+-ȄUE_ +UYͷV6R41Lڣ֗a:"'.GR;16}j̺-C37`clS:CzǗ$}{hOtbu}a9BJrpkhSQ?WuPMhOvv~AZ!1Ug9J-fqgC`|)j>iX*V[i afY/f}ykzpsNKmSpnc>QTUC !%~R*l&U 䌬bXbmjyzLc4#h&~D Zw1K1MO`@Я*a06rµUp봳1bӯbIcbilZuv lG_?IPzV~yD%Q5hlrjXWy-ɶ.* BXl!nr(^WنA&q t?NWuQ2+Y6>*,`9i~sjj祕Kϸn/E_>G1K%읂3γ( +ToXl| 䛒ϥ4b14n\1%.gȌ8 V,~#\=j)M K(o{mB-ϱQ&.{_϶2 ?X;>W)EɁrPC9:.CV7# t,m^ܽ?[YmI (w-E}B3q3ֲY cbiXlY 95{*D{]6GlǫR<U+9IΒ$#r$~ v:v z>^ˡu:pki{zVUbPI1%?FH,5XE:6s'*3Y5ԩ ?>RQjj4L:GOD1h;bmTT> ui.]Lx4|-EY!럚"թ״ZK&. VV/zli!#]~v(k?9ݐu ʴ+=l$Q+?S-)Ӳ" []@-5-mﲕZAbC55'~ sq/md?-񰥤csۡ4#Y.oS<%0ZFd[j $gS2ðN=Ľ 1i+bK +vYR0^DئjEDeTĭ'3V_iW" =KfgqF葄M cL'|G{ədI6G h.5{R=JDY۪]Fg\p8,je(U33)sT[;, zOz6f7i8Kw\e"}nB}iidnbAQa, -,UK6DJgHj$`T`Hntpup-VЖvQ)iqWj w Ke6;2nTtk)nj*j/lihŅo SWKfR~fL%ߠSOMmKol;zmK/PE40vo^IOyhg9 )e>_ -S\B<$'Ͻk3H&,6q6{S SH׻~1toza*hDhk{\F qn9ma3<:t5%S{uV "* Tc#E%JAX[u,οkOг3ˎ3W8rׄeK eOǜ|mC4Gv<-g,xagNpvfK~9Fn)rhXy]z0u(7Z,(L'寬h b ˴<˾#"\SkgYBj@'ݒ\ 5#c p?L7be"4B%Sʂ^0H2f3ig '0V*dũ Dz%X{̮ I剪pH[W I&Qm,=+͵VzџqDI]HЦW`cS])g v6B~_] {zyĊe=wsU`oye5ah7 SfޫTAMMaAR,"I_jxrZ S!P ok#NDGŕ^G8l5~qgO#&an -[Ђ_%]wkF= z*3#>+s9#ճv|[6,F~_5{h<I;Ú{p$4R85ڛy/G/MD͗5ӧP Ejg۽<)Oޚ Pҙv%m0m1TO\jRp'-ӥ'Tbᘟ\9aNh0(G5ຳR!&sAAɛqIZ!fӌkĈJuc$e2]?j2A.\ܭfX!s˽R, 2=Zv'C6m4;ARomctkɚaŌ )M&{)$owKfv+4tAT|tu _Z4,n20p!c@ 7e(, i-dL2[D#ⰰwAq_=šϔ Ubȭs>8aEWM+ ]b4&ܵL/O~^<#o>ҐD(}?2JJhsu ]`cQ8t EΓNELvmhBv I]5ƒu?֛ 湎(S>/HҪ,xCn~o GgmX =Ş;ԯ \:wP=m7Wzx.B7\氵 VNq sA ɾ܊}(Z7n'rN|v}Fs"?hЩOM_7XyED xyr?݄ JfLoq{9ֿ1( [̰AۆQ*wwUoPRmq΀eOZ46/`Uf/zdK'=jk_̬FXZ=Z5F_e".A'ͭ:X0cJU+7d7z'*&2rпAK@hd6 [ |?"q$ #kYLa]}džvvsjX㒓dY|$"/䙱-L+pɜv/sYl\$\E8[W-[ȒaN gd,&ySEJss.H%/y-cǶDWh^'`'"qh GF97lTNwTa+3"JVLl/%-y# ="x mEFڭ9+$ȓx=T+{(p8Ш2Li["ܘ\k!rcQ @<1XufT"&zi5J̽'p{AKCvkx'2SU!#fŖ;x̟i.ErM&> }K!:4PLZ PP4nj#aFzCQ=;LCCr^@<~=f;NC%.b< Y.Hʅ}:_fL! γ%uubtqkcc !* Vф&0&F\uy{v^ު]0Zi&Ųt;M y??=ߥmLV)F- 2vJw? ҈S˚Y &ۮWKMsa4Mc/ʫ./mgt DXɦOFOv?f~FD8/]2Of WzȖ̂huE}آ]Ǻ7v@N_صprmupe)/ 8"0VZ?LY^yE}-!(Mcvǝ8۹&J1%,6(T׻1}e}"=K؇jTL?tb3 cd9{0fZn!sW5>m^s e!qmå{+5װ []#E9w@k-1D#뎝g~ ZZ4^ Q;-xZX4^!@`z5j_K-hv·f䝁\IJ6ϪFefK$ċ{G<ρrLпcb@J%9$ldbKћaMߣ3SS" sNy'?[08 Q UU, f)B1_rw"rA6Z/:%c~' t,tGdx4-xNdQ_l#Gy<z->_uc)"<=`C%) h1T.>4}wtlPДIpi"3B  U/%ڮك x>E>kpֺ5gt&fFqNN=G- $lX 5ͮ@% %keVƇVn!uYiwG7(~eOa*0ʺn@HP-(9ۜ+`*Ÿ}zAzC4-=T#`E%ckON2%u?exp/x]vb Ї]T_@0gE;?0M`;Ϡ.5DS- = $٫<ӔE~P)Pi|,@22; ɷe;w,*gv_eącHمL+Ow+)6l!r?&z,ߥ%#Rݺ)x9-"~H#7C=c@@<`qܘD1  W<ύ+sWeEUtyF%όjQDM4KTEDGO!8T&woK]gjw jͦ:^[kGݚa9 3χСxHu{S;T 0r/73$@O!=T_ KѺZZ.r}Uz?%ˮ,^3F@u:^um]B5gDuM(mF K?v0?~+K"܁4eo"3gJ-Ŕ;şєK_gWl\tDzM& &>ԑSvZF/ 9Dg ;wKA> Be+'O* ݄?pxią#vc.I>yx ;cbOfj=݇+Wy%`~=GqloGF x{*f5 |ۂ|>BqN8 ˛NU[fe_サS|eX60"==KB- pőwЪSqI6:I ;HS8,IcVEBVXk>+K^kT lv=g#!^;--FR!|T+*+󰫆&)s+tsxX тu쾔(NՂZ*J78&HEߨ~ȋ6n&|8w._&+7v sራ ofmeϘ9x`Z L@Qmn@0IBo}mI 4s93߿xCxa|As3A|ϒ"}=#xNd;|#%M(rbJ5}uoGf"o/eC4|ъ8>rv'I:c&5dIԏpB962pypOZcdQL,D9 zԍ H%HӰ:9GC ] 2]aoB` 7;0޼R34q\Yz)h2Gcg;KZE F"DO/lx#Ȓ b@S?w(ɑw6wtn{gKHϠGrLK p,ey@ZjAC-@O)g,GhӸчcG{3z"Go-5fF040R;E֢?Fsx>4?CzNƁfw_at+Z}BD*!SՈ80 zIWҸ7 3ΥH3HR.?$ K 7 y\]Hk\P#C&nbҽN^$'Z#'}7$]#\|[~ W{Sxj6|beBo|~VMNd?x}-IG^:y<| iZI:'b;ϑmí~T=ՎdmKد/',LLD, j"b5zD?3f;*Gsfs1.9zẅ\3ځZ+3˜њӶΒ3]zsd\]/a4'x vfJN4kb~FC9j2:/GT:#ΒP"7OOfœ)e4AJ0pW~ÜwĒ芹>tWǶX$r8A-ėK0=n;Ry;T/MF@]F7=Kw]9Y(/rJ&n$pj#N|C=ǂi[r ٰwM =o@@6|'N/V_A kf*B J{"ISbSZq%~'i"CHi>K>,'C_.d^?!B` 4$#'ySJ4GZCMvy~ࡁ.ʟƉ~lV |D7 L C,={3n8ʁ7j{1r<)b*qd1C%\~l3Z >fep1#h] $\ qJ{ߞD𴜒!VT*IO4}/a_Ioig&1&#WZR07 J88޻nnkJSƍCr,XhԘpgߗV.%%C|fMCg";@85)g Xv6HGH,^D,)!KHQ.'KZ8==jB_Z2NT7sQBW@9Э^L4.s`v<&}ۏS(bEH&,ޥҫ*CCß,v7QbK=fɚ$СO+&GG}D_Vԕ\fs`q2ڱaa;9dhޮ= xÅ4f+c5ǿ4@.1P1 qxX`xkL4F9_/ p0 x-rD`ArL۸C$ꤠi*BKVoMkcki@݊ {ؚ+4iN+@>"&Bh`=\T5 $Մ<؜c02:!Zlo,g`*"cv{iaoxBR0MD6@- P _ǂRGۥH~ bgGU3 ;VY*тHS,P.plH{T52M$uτܧ߬B ^$.7GMSiޗMGtXTZxP8=؋5Ty-O -AdٔC^RxhR0Bt;X-[-v*j<ց&Vϰ4CC"a/ty Y{h TH*i{#UàU.U nʣNz i*䒄<_I3fkb5ۍ<`>+As+膀qha}YI.Z:># Q,UQ&_ 4VLx+TL@V]2Г$n:r͔QsLދn'_UjFh2RᝦtTw<@5võȂג B5@]y4I9CtՅJ*2 қeW%Nn+mj-# Խvm֯7ZILU QyUF /+sϊmWTaФ{EA@}xπ8bŒh:mVmLiWeQBQ20R.no@+Ht4r3Tt zΨץ, ͹0` f CϪTWu};(nBsŐ4<fK *P8) xLaݙKӊa! ;5D̳U\u!hlY,.3HU/tL#h|}29HB tǤҕU $ﳕۇ|ГY ]QG/%? AK#TY(GNC*Ur֙W1/ŽGmL«RоΗ j=g䶨ߠK@b|եZ`)haqZ1cFG}FbWӏ[ b3ЇkÞf|Y(C^Yf5k 6AG5~{_"]rk*.gp(@- 4OFk]X-Ѵ9$\Gf?wDA$2BKZjCN:!`J5P ݪW-<"_HX/XJy+/+]G?{E$G=e $ѱ OeAXfJnj( a=3yT3j!yxP%xt>Ȋ,҇a ^-4q?CMיY}:Lɵ3'i_gw"pҠ' AZi+ BB6;MI;lA1Ͳ؁dxIL@˻V%$ms,l h¸l8 qO[o%{od׀]Ԕ  z^XFt䡄@QO6R^bMqn 4)~UJ۩_60ܙ@x+0;u@61NDı ue$絎>qж!;sf|+zPȯE1y@ckfAAgu30Tz??Ѧ5VJV;Ԯ\>9b4?EWpLH_M~v,by5Q#E' ڄ%Hһf;v.*9RL*e7cӯw#bp&|?mjt[p+oڲ|$Pv͠.F SRLM2Ig{EA_+jD>H4!K˃GY\C)@؄O%F4)"}X-+rr ز(NS֎)G> =G*vۇK[o:ѷ2/oҫbgS'@g`$tR[C/ de_ iZg.2p x $0ԮI6]1ZBN$ә!q95=ʬc3gz[svd֓$Q=Goªlo"GW$FYEz` %$HȎ8OJ JL:k˓Z7eD/a%-FJ1bKE"Lafpvth v1r¶v:9}Qr5'S`E -#E V,0or,sgT|BX]fBHw4fWpQn!Njɏ棴Uو 6L02T ZEa:5xE~*gMqamK).#!BN@U;q5I*NK! Ѓ!yyKB "l%u%Qߨ!s !.Agh-Jp԰DQNLmӌ_ teTs>mr3"r>:qKle Ke E V!QOͧP[8!C^&iZu%j9VNФN@,ITxDFuWiuJ)zѼM0%EP&~ʾľ }4!P`YوA).~J`;{&@b'ũ^F5qCvYI U#^ 4T62 d,{B)(W_&ILX!I\Ot7})QZ1ؐJ4, M$͟-jmmpAq#z[:cˏ\e<ٲuwLZmf$ 8!JIM[>iIJPfBkIQo|`#v$/mXq~;uC|b1H4'$/(L'y" ')&H/41&p(DB8nHc%)#$ zz\v, K: M?v Vo!aæ KB|dAҌ? = N$7 Ji@2 oQqnfޫ((g=FwVd&Rll|u?:,HEB{:L+Byšd.*2@3гpǠǙZ .q("5;?PI_RN/f- |HC¬\sO'Dp3:PLU5Ful\v<`" ^VB QxR]y]ZO|":o,5VU+O% DZ 0M0O0ƫ.PI7ܯgʬ^IXM1"uD e8I8QV}=V8=^VM=6=rj(2lHwQg pO%gx!eČ AYl9:g '!0-9 >).=1>i1j} II3[şxjaei8j#N0t5ZE4=F:`Wp$\KQDKEd1{-%f=Y|yʎ_nnEA :iW}" .)P{"cqͻ%~x8vh/z' {܁^ax0.5~DQ1qėz_3o4|/#Wˍ*-(%뽓|EkiEs@1rClU\W7٩ٍtTJG *:UYId*;Ou\F)ק9Fi63CrbZ92So JWzȃ4'Q-phK2zxG]3C / IL2u-qF{=s QZFq՞/!X #c@f cMdڂ/Iw[p+A7}%K ,Ndb,>h>@tW$RiA>#qȴe7N#ݚQusu[M2 g>)U|#Fu#ћ]?ll [5]~_Cm7(C 'Z=nHE(?3i]RN܆y>ÐI e7u6LZ40ϫt]NF]PuK;8W0E^?'c=uml?^@*3JkQbjMHGSt7,=zZ\|!y_K#^t㊂ hVPl'dC+3VVάpZ x9 hV%=RW*obXi͞&"GuCsOÞ3jZkΟe5NrI @_IQ8(cV.ɕgLjM^.Pa*˱;;4K"ՑұT)wveQ'VE(?l:lnf4gV: sM2TPa4͠UOq^WF<}oUXԊV=m"}_iӔ =_3> ATM8ΤrՅr; a~pGi^hYWێUi MSp{~j[(Q/-Un>Fg\mu0}&% -m,x25ٜu# }_V`qq,#&I(0UAT]MVN= ww *8Qd]un OxNLt"ҧ`-r;+ e 8mDp^sdfKDC!YoH#SʴKeE%ZuRe hnI Vp;h4fJRO N:*[%꘱iءz-~ ,0fcP (kj3a#rndtJ-lj+C$*L,v ʛ C1; |]@cKkK|߀go$8k(wd'?˾hE(­Bi&-)nz66EQNE7>}+4Ecޭ,|KfZ=\fw⟒0 a~"=+FnA>FٰlUk*s'{niPKݫ㣢Vah FYzjq/f'%M[AZN]@_}RŚ(>0φF?8!؎QgK&m~,xtJI^¬ȯ&pHPFM*ȉ, _ e-~[s2^Ғf ׬p:@a$:hꎚvW#Ntt\FID]ck{qJKմ]$vCBg:`j[!P=,'TV%,o}_.4T3C6)2oϟ/l:%%ЫЊ4N ;"Ko$l&ʾz,ؤ0#àٱ P\KJ5F x"ϥ 4NxiE80&6ZbZ]." /(.W̥Rmtb_K^l*\ qBܟehKx!~Qߵ=˗b4|]ub& 74l9HJEl!/xp93rAڟ{}bXl@qX"SR } $0!YPm zXDY?^A?!~V_g-` [FN15,QP/l2e4]Bw@ Rz]AFL:ZEξȬT^ë6DObr+\g`Ii|ueaށ! ݨP檞½ynj KNL Sp:%sƝ7XG_nlg<)@|Y5E7JV4pMU-cx"xأ$%6ns}0c(Yy?\TTs$n9ިڶ(Ϲ~󐊔T͜ >@RbK'}s ) R)lX+c=WS1qt@k/) l ݤ_5|G`efɫd\]-RqumBH0c'O2|82Q=(t(=;;{rS<(:so]EjߟhCmE0O5RTiI>,aF\zw_6 Hb ؁΍.?5+@jiTYrRw. y`ylt!5aAe "1 _AQE[d/W^)pCMڱy`c\KVWnQZDv1/}$6 fIc{|SDAҼ.<~H:0}y*DǠZ>^gK;뵉@9 #1ډ nY BňN@n䒃׭ ezO'͙ \1ҍc;>osih^w^XkOv'ef3!,F`;9@ķKdU?v{<X}MIQv$:_yzc' G9:9>1ZO$?G?kK3sL0hE{fx{OA!WVJ]f0hegd)޶:x_CxspE{-uɿI1vxxwwm-ڛmlj7Qm=ȿ6om){-4-s${zl,Ę;aaubִ]=3is4D62 em?ne- /li$#$dɆ gH kbI @ؐt[ VmNf'qIk\jï7^vTteH@ AA9Iwk֍$QGAoa`?uH0vc/NӞO8p&Bpdn "AH rD Qh,>엇*rk(xMF.2wdA$,D" CQ )VXGgB+z~蛟Qx cHpy]tϋ8]Ep˒Kp Ơ $_W9(A)[1$#977 ڡ&eyl&DttA#pfI%JxH4LL$;tEGZQkh}L7҃pLAP&F n=# -ʼWi+MI~'3T(=ȕUlVVHLJO/…~TK 9n~t̩6m⪈c=CQ kT6,7eO^O=VqfÅd{rք*Y0:#N<%lex;^3Q(r_t^97ݗg* a+{^)˽:g댯wK/u.v.GiLc͋q73G٣lͱΘˏ M?ׁ zz/+',sZ[Y[.K,`?3LZH+ƒ~2OC}e~{*js)!;9u(_ FpW?} 5Z8Jz^\ :5% f}# "xLW~rӝh¥7$Ż YX8_ږ.V!S˞]G :g=G؋]%Z0r*Kݪ{b  <|*'Ը1F$Q )'K QKYi11 6fVJ`ԧyyv^abR6w4H[L+uhͪWa/t(# ZЀ:6ֈ@SGu:0Fi竧ԌIt`nڋר(%iW^fJRӆSzN#Q5"FD{'*@hz NByhPp[7% ?{--%< 儧~=Wa9g|vp7+dg?o(#zg&SSƕI̎ϭbqkI %,>8'dCti8 vW'EQ2HV㛱̅7W)Wr:jnDZC @ltGK:ɚWII[h3vww7I^7te@*wng,|1!O-` { =@@ =r'Yws&=j+=aC[ |-L[gpގN s/bOX<ޮ` eDG!v?u)m! iLA~y<@?5jx#~N+Y=zvJjx=gezK0E9R۱:fC  Ss'MKaiBnhs>̂؄ή\E+zeK[V"HcmXjr]y#źu/g:#Um ,6i١8U3*I;`-ۢwݙԉAH]"ts?ptuzt9RÎ&Õ.hv-n"H[ |)۞R#a5ÝlƤOPƦ~c%2VZRW_] hsrC#oPvG|'`CIɊATt4">iu%aQZIxk 589h9*Y.MseGL) ~ORfiWȅ䄗bTgv%*Ո^걶ӓP^+ $qI,H֘Ή PZ 3h-*C@VX$JFDCi"@'HC "h5'DA^lX)=*a=m#5Nl(-y9^=: ZaLW~e(_wR7+~2ĬZ 7]=ě#:Dn&J"O^[S{}lv Hh7u0pP@ۚyնTk 2+9C|+#'F`Wd?ICj `^Nu.aqd>/Tל$_Fh[:o!sp:JpQ0@`:K,`KOJzpMØhFA1]z1v̘ ӰV= VQTOl!QER|`?r&(a "j3qs!D[7A [4Ka7O3+`F=צӫ'pz_sHLFL t,}rK-1 Q A{!o_ݺ:贬C QwaVRmA)ItFpp#Zp ՍT!)UР'GFֶR4P${sÉ/]e~2'֔` c A ,%6vSA~KOqUEmZ[MjYyҡRDU wXɵo@ dpٜ=ki)nLk3XgRT$~ɠ0){`rFy8O ^-ƻ @Q3ީlP8OU`uVDQWFcjT+.v)g#@Α13Z|e|\ .W]bD~k5ҶR=\YmC֍7e}g#vLX)9h{l-mBsPɮҬ1CwycKIP"xoC1B[{F#f+ pl=^/g=<[΅*Wh'i]߈Owd^S"~8|mc±<4:f7Tǧps z<=agBo=#a=mrc-@s3&9fڬ36rfM' Yc5mD딮z h"ׯ X5a۶nq֓xi7"G f>MOs1O]H MW+WJznNDgVۖG ӎVf `C[:ڃӉda+,;}̼5u h |hI-VԐG3UV"˹T{F1Aw[Iɦ?w>>L ~u>r{rI6Po^jۍV8{0C|(.CkaTT'2els3&NrMFu  T33FZ1@𪂎di1DGYK"X;mK\kkoiqNqW۵1qq-c !"*q--į39G@D<{Um.̿0VtP"T9()A-|hP\`XCLK fH#`p){GKÜjϢ49@ 4=H@hH iq6tSҙ.cَ4F2!; >zrf>,gItTVhu>xfux[W^ D!N"h(˨$E2--C = E tRSxWBP6π6tRɣ$kc'ӻH6(и-6+w=7 -eEYвdU(I-Le4qyRp%#5"Vd2YYB)6` vh z1P&fȕfNUL씛pA;g}g>L֋ 9 ];k$w .D!ޜvUb Zz) \v~aSUq:>''b;eVSF w[YG$ LS7N0 R‰2|4"":I/i 1 69 60A0-4iͲEuljvg*5AJN6D_#'gxRQϙU*pam:X k| 4 皹އ# ~tȥ?iP/0pKn3f !3󨘈y> T.8F@܂"nK?~/Իu_] OQ 8_ۡ-%_}ExO}$ zͽEVĦbo?ۛPK6ウ, 6L; @;߲!|O .@E^z}#,H8T_1xr*blu&b>0i7_UMä=NgJ""!&_ڷܦ.E8 QAT%Ø)z*{Eue+z+JlA+H`RæD꛼#AAOŨ[(HSZLL Ւ+&MI_>_4ǽCTIi@EᓋF7=x=)|US-9ʿE:I@$XY f`#ae>ն{ %~C/܊mG)-TԸr (tc.jnM[/:dNG ovЋy`?(^;\*)ʺPXYV7tZuVencZBn'E΁Z@<}a%8l}VB_1`zτvuu5QÞq/O"=.A׿y_P>k>J[5g: Zo.5L#t*=kV3ͽR פd>:iq%$(` 뺭ܴ"i$o_8.x}{-`>>:Ul[#n`+7?B4葞-@u&<`|!lӁ>}%URfNq+1KĠ b a(9q8-kpl%}s-A3)W\d\N8+qǨxMY" pyUmhEu%!+#cI?["7*?L`(NIhl}  Jmiƌv|\{oTD1\nb8u, c_MyKL<[2)dn\4O /+"su ߟ8ܽ:ؾuKCLl'0lhR7E5V.I}^x8 oh4}QPsg %YT0;Hon)%WWD KLE8+" ;{#=(LJY7Fڄ9lxu&}ޭΉ'5+MA>VxzQcJH3 75hR(0Wo N+o1h̫AY-۫y s[sqV>**]+z``|P<^(Z$hZѠ_<7[obyT8N*!MvJSi_K'tRߥ1tN?96a cU%\Wux\@O'v[ 3ڳ#* TRkz0|k5$UascGV Y]㐕L<w~)C16T3)XY"|F;u7?_#$٠?\hDD 8+!R#^|\ri"y/isp.%L}1=5%ܠ+6$(MMҹ`"WqD[8t˄bsARBY@]u}:'z!WB G4` d#l9  َL 6pwf`v3{V 慂5`Z(Iq y>=g`k 0UTKF_Vl \^+?A;]3 >r)4`r]ԆwpvC,Fm\*6,GK3?kL=[6О(2cEII8[«%@1ޜ=gI?ViHx|@딈OLt 6 X.]a>F40NTx֏S7ѮrڪoAqyp0z :x$@+ӵYQekw -?ATK q\Pnn#tMDLU_%,FC#\]vI͔}0oD00W(ƠˠOv = # 7ښ\HGLF;`KSi,.|3Cp>AJBiɀ原E7r[r^C!I[ 1ledT~RȈu,;wUK,ٍ mEljOIa|Bp{hA5vs3CMDMz&x-";sR5Ib>`,b<x?;l\ *-ӓ}-g1\>^a "vAA](ΙK_,*jyv`Kʕs˽yq> 7P k]5zA:c_qvœɵjÞQ H<4ପn{'F3 QV@6m3s MpGPfF8F%{kqZ=u;zZ'Z/<46=ms/>21_<ٌ)my; 7oeq邶xVȲ$O ,@A 1#$e%> +O oeY - Vt8x o oqOB0ЦdC@ ҃qf, Z8$208"͠q6yPM [:Y +dK=qa\Ow^SD{y3]3*7Y؋Ի}ʉL^N:7HQrq!²! q9M!s0ʼnI;N5;YC<5 DJKb 7PxMv5D#q4#Z3B@y $?7{ϙ ؇_y}G#fK],'=iw)ΪO1x|l%A!a?*sM ("f3D}b3)pG7иat(γP5 26I_;[4HxYB88$(da[4νD$yMkt/&[lDAg@9L4|PHs$"ۿ˝=c*#w&b}=.TZ酐8!iOa睒 #BNK)rhRT# qxB(F2S%`oxm9c$1r҈mFw+,ݪ/MijS%RlO$D[.(/p)VRhޘ]! ' n:/$2x Mi23+KI{[2 L^<9NagM>LO ) bm$~rhTB?ZцL<}B"QWk7S;y )θJ|FN&#Ƒ'f^CW~fV]My0nSO&[4#7уk~p{)$SRfq^ 7!M/{*K_*C51E-?MI s0MAO%zԌn>[ kG _Rr9+Wv>##ܨ-33TW6PD79;iq\r i՚ñy99>(EAnaұ gD\oQNQIs#LD9iqпfvP=IN#dQ+ D]o9<-3|&M-l' IT7Q$/7i/MB8 (8rD7̻;R|wL6LyW.){ ͽE:W|=ό)#/]6gsM[#gu|lRN#Nu(ː&N4,x/IcxY!]ܰ ;#4 n&F`5,A4}#;- 7y~ EiE2E]+gkE3)6Ƹ |'1J{ T|.̕ 7Z|xC,NIuaAqa!Eҗow9Sb'A"!ĉm6ny4$3D03eeI7Iw[dzL[7SSrTB߀0M?O6U*HrKP׿&BM [e|>{6[=#d72RfZ[e t+eG"pȺ+d$ m։S I%mmlH@~{Ȝet_ b$[]=z )iw~X)1S@e#.T~* C(R8 Q.-KF!h^!qɣn;K@BBE%N+a90xC)A SuZAk ŐBM"Tn2H,K0p@Sb' 4؅z *-%62`%\?X)hr" Ud]J$Nb~!"Jye]T.6pCv#XkSQTɁffm23hX |+>9R{q}ݧāO$*p yyr}ݍSSҩ`? `H*C*H:J'Pd {$T]ΰ< b9&h9懪 ճ\"Rc˥x+Dt)-!;* ekN(Q !@R,;;VT0ܒʹksaIf2@~B[dܯ1S 8`R0MDET1(Bq,> @TH"_[THJ< |KϐFb:0bP3 U#h EyKl0[w{`g FBdW Nd2=կʀcNz QbƋMª n0v.6h@mR:xSQ(3K J 6P/GB!09@w. 7/QЈ_HOntĎJI >G1>{&#fM<'Yv*w7"[ў-儸;_e E[áVp[RW`KVAY8>V/;_އb<]Q9o) qǭ2e&:d.1́_k$㖴Ax2auȓ)XN6P0f+=Vh-h,ky&KGY:\AI(>0Ziv7EP HUwٷz1I `I,0q8U&64I1A=`1XWm@`G:M.ǚg}ܶvyZvh6bB]ipӅEԨv (Y+EѨ 6*ظ6HĸTxZZ`ن8xªܦa('SS$MUr :gsFD'h4,z#O]7a + iYBhec Um(6~vZ GU..uQiuNuGJ$؍ڭqT3)qanz֦RAeш2[b?mpPE1+-Cheh[X.:ݳss,,FJ*h@ֹv\O@̠|i'/mȾ5dSUFE'{D%2r=c{~ H`#{Z8J3:0p1kPP*t(zXFJ IgQ2<ɔqّւܲŕ7=쬵r͚qhMdҼ}r д>㺶 _|SZխc=+P;Bl p *ZyH'k Vj'j-"RK (9BU9.,KAW m>H) .exa a"y)D< :82Ki⁩juv/c8ռq1 𓡧=&C]c2poG3W⯇İW2؎%C-+ e1LH'q/&=9q8g>ϗe&hv1Q` BwĜ8/Q 2JDI1nRpШ-Mi,1[4&ߍI+.c\4+M;/P,M 3,蛡VC"+D_`Coc0osݜ,~YCy,ˀ(pok@4(OȡCz I `"< ^qRzA6nc>q Ă/ B1/;TGnK.s-3dA0"9Dyz儶dtP< $e _@)D-(B`KR`$/CO[= y@^eٍ#L , #Y1l/h@`f  奾xi_|d Cve jɻe}~ b?.3LS!B}x͔/X!Y@T6L lC, Q\ЇㄟBN$.  }4 2^_e, 3Q|$pf`j$3.$K{^E$8snBvqETY)"Pv),etSsq j.3R< rbۋ8>7SZ8}2,Ht,UHR HD`*R{l^\ ,My7uyFyuh9*ft3X ^x89|~fҾ<2::_ ضplB |2 yWbJs* 4͏2F [ %DwIMqFK$EBtl`6PɨR"A&vs"ak+0d ˋ&ġ?0E eqW·?DhL eiҤz>OA>U,iu"IuQ0o|COB-2T;a;ÜΝPf r*9(i5j8|Q̓yP=~sZI,tU͌h3(?*t6|3qȶT:L#ԁN2"=5SmSee$s?bal_I7V bP~-@)kx)InIVSq9RmhdFjW|C-q6\r> >%[yB*'P/yVjr)e m;m``?ƛ7MjBҡR<#u0apep\FIm0\K1:Y'jd[謃d@ dtwM,qM耮wK:+p{pAvzƚS6]VPbi C.^䖢˅/H ^ TFfy /is-hb8OS0P~\M_։r`ai,~Qw_{ZEɍtsQ7 ZUlV}AV"S,BЂs5&sX"Y Ah^6Q;*),Fy]O}O,?S':H䯘A޿S&9j2tG .D`OD)yUhh}k\(jrѷ{bk衆ZL1Iي3:E]7V/2+?B;'ІpWked3yzZQ 0P?y4=;6;L gd"d4P_?n%'>4/w[AZ8];MʨhET3` (]zʗd㔳^&(n{Hs6>9oR&sj1>2:=%>Acϻ tF@7 `+P)qg1ḐcL+)Dtg V[*Ox?[J^MKTz稢6uelQiQ\3gwFL3|vܹ>ggF1;l2z95dcq.#>$#yIFk; &5 @i c.`jl!B'^TmvsYdOu_**-kbi~3N ]V8iQ| |+THƮ/;ОŚ'*IUH?&h;,%w3U+w*9S;[멋.hOM)ݭ5~ tmڬIsG~+F}b&4F6vDh]׶v<:~R,7IT^ hmvfzԮO4v?F]*t<[XnQ:޴58Sp;]q &co(^9$yV&OKi1Y EeU/CY =+DIh^5˥W(5쳀CSw;QtG,He/hpiw 4 Man._$CDloeE]sVŮFY,V0𰡘ա(U .jWK=g/m[l65v6JL0uФyEz:f46P^-Tl mO]n굡   Z7N1>,Ϣ^/ A̷>GU#U\wNe+Ԧ0jtUݥl0Ch8}!4dO~U\eO>KA,W0WVkBCyQǏWлՔY^=-B;g3Z*f}^jn6kĎM$Kwu]f˜Gb= eePJ[=?QIya  yKyWZj-Z%@ؘ1vݒ(vzpN)_8\WY`{e g#5Q.ZmcF^S/FwbZD&) M|p6!qş=1Ķ*Yp!eFLc uB82Bqyd/ܡ4TI,VyΛe6u$jw\G$XE*- AD>Bt#c4ARIOdpf4[lݧ,AN `Ӽ WȮx)T w[6 !mP)ä!QQ${$ ?#J"B-Knцѹ x8ބDZgݼTɇӥ뒿օ;mZ8[{>YjyA4NL-XavdS^?:ӻ>Y_eogo}ַ/|זϐ"vf;]TpE}5H' z(vD!Į {#֠I{}}_doX3`2'X xE!G[Y=#/8RĊDzALtqP(/A+‡jj oB8 މ6{Ӟ[XUV}8T{_y# EuqKO.XAPWEa+ZV𷇪/~" 8 Q)MDԭg= Vp6?tN蒡 }헾6>&yw_Ի`e ]ʆo㡓\xaCa?z[5]_C ,`֡±.}1Uc˛Ss Yȕ܆ j@ɟGk[e5939 0Vbk;PMg/U2y;Vm)FC#=<5sre\{r(iQF1W'gzEymD%Mo4 [ '{:{ x7xL~L S>c'cݯ}ЎfDZ{MJhbT5BI>yS|GjtR@ THt5I&}%ޥO+Ռ&M4v\4FЍ6hL+U[zbH/lQx˃yUW#~[dIѬ3ϟ YNk}Ƽ# e;&/Љ7 b'6Xڶhc}Iy䶰+oAo?$`Xsqj2a6ϻްTAV~c+M=0ŭm%Kbp ?obӦ&m oNF۴]1~ǖvلF&:t)Y$-YuO(;h%F.h_+%2x{z,X[iv@ñU2\핵m}^a~~uh>A C*=~^恂OdUd*fs)@o x%_Ѵ[8U'J~ %>0^G50:Fq nVi0FͭEfhAI4k{JҒ]itIhĴIȿ⾺DMR:miHDltl IRlRawQcJGFS="\e1\떗:Eg_kXj&Z]3)6WB =^N2sZTF !<[JI=  ͷcayT_>;qKLҞg(hiȜ6>G=*D^J=iLoЉ,=׳ 7<|Sx(L'+Kj$doM"_>e Zg>1'' z/^v79cA\Tݟ4(X9gJn+=yKv!Ogt>0pndŏgw]OЖ!`Jr7t m.n k*{p3PIW(<}a'aqTvKy(_0W> ) 8ëyו;@c|5\;ƺ Ɖ6 օ:Y?_i^8 3QP3\$23S)gPQ Rhfip{XeVE3Nh _;#P'),r#r#5< ICD`2iTOʪʫY$^ @ Oǁ$5@6`nD y}S|甗C4<-\Emh)J9ZJ+hPMX AfXTrErг$ҡ-%'O06CD@Ed̓˯Cm$~9ձy +wtxwY&撍Zϟ$s4qD@msrf/Y*zR=_.lȇ0/A/J ;T٭-P@<.LNV6QnSݻwE)f9&^UnE+ռq{#7yO&SBlL961ح!Q/Qw-#VK`u/ E"wP`Jdg{(i^tG缼4MCn0d1'5Q";)$瀐"߿N͖yBIWU0Y䱑9O2\M+XrpXOmjvE՚4%U8i1 F 5[6蒻O'C6.u|x=0t9-2(n!:j/X(c:ˢ@DKurƗlc%̬m.:⯳.#؍ J)E%#adp6s g"TvWj g\X6WCɱ3gA0V' ^Ѩ,Zvzz\9Z ,ڵ1AYs*!ь(j9(tƍs啼Vˑ CV[Qt!&KF&=iRq3o#Kurh4^=: 04*bj0S={C{5} &|o7BcwkkW>O%_I( m{0*z !ڥk%[5Xpv[*mϓ9"e)MDFyii.7!KgV\ɷaX̝(ذ|Ellٳ Nѻ$fȫ(2[d' T0mQNoaY4+ⵓ. E`CHqr遘4ZN/6y`u=粰8 ~Cɚ;B] 0Ѯd:]ԙ~j Oz'٣Ʋ_-'>{!U/(g\8g϶s=drPDYGZp'D"fҏ =VmYY:dP+?)Ƥ-19M`6 5HXI?kA]0L}[ԩ>y BpB  :SzOmQ~Rn;9!p {3ED)e6:Jhd|f(=b}fQ #g(F# w=N賓icACUsLrv7>Mr(_fç`^OƁ ,`y܍GTlK{,`oC=<-m* 9j[2pd>|)P{Z+PS01M" ;}0 :.tycNt|^QuՇKl r:ؿ<IOm,fV1N:a}v&};KCXڍb5Q}\֌Vl@@d&=[ .u-;$۾@5H@2*N;J)-,ҫlZ ݕV֚˚ejPkū  ,!M<_l;,ӼMF?bŽ^Jvʸ@rgO}sBf%AOwOnV+Md 6-Rٲb v E4<܌$p+O[-dP! (}^İ.ѭrӐl!-ܜ= JG&&3։L;݁ }bдƄpA& >uXb}Apm̗I1jeve XVW7t)uqsxqp n9 <7UciXph6Ro\Y%zUybF.lKXЩZP9jU tT ;:KSd^S ۺuTCªs?BœH8IeS\.soN}[\~S@YaSA5G, -{˅EZc-`>ĝrY,Urc`tVb WACkTI٫kt.1н5N}u2֎:1|cmv]=S__ՇQ4 vxp'E0,+Uf-V.|5 a{`5fCruz/=pP68p{͏xܜUAVhSKͻމ+:7dĖZ{%$/D H; nuPW[J}:,is+ RnίP㢍fYAr0߭Uɥa MlT,k\D~c (0Rj'&~`yyTIՐZBf#^NG/Rl}VY:zvH4@n_6HTs NULzɆb\JEd: ^״ݼ[xú#U9P?A!,Fиݾq7i۸!KH|=Ǯ<qME8%/=U]C(&Jp3A_^QxOLal}-*Gv,ebzT-QhV-YX@+jR@cs֙ϷI#R,<+*?ήKdEJT x =m/r, @24*t Sa$O8RD3ڧ&C:T#\i^ g6k qo<*0ڟ>=4!15<v#3?Ƞ:W/Ѣ#WwCF{$P$99quom]"q^WQpz yT@[cT}Ck\#T BX tz\ #&zH l|Nds}MI:5Wf lD$oAۦ&< xz^pp3> g@AhVb2NS;+Rj#}QVIw"NNƓ5eZ;A&OdvEErKd\bJJ(^፟j[~#@F~C¬4 t+%΃yHNU^>۽a"_3ΞQ|民lʄZz` Pv,p7ΙJ;JڬD`T'y#x:'Am-<~hQP0%њ9.^$hдхϟsv7CpP =Cl  w'{t4N8-k6 6%L5^%\N@"H = Ѣ+5rķ vo턖X,|/ Yp⋌^^T`'F烹 Q&&?wkB[ӧqYك:[z 8Ac4sY]4(a^;b#6[YZJxNZ1I Rۊ$X0*(S4EQaLWkq7Fݏ"v8e44(lNf= +K Q>E_6 &=^GsbOh@(`xYD}t -g!xq{Dc\źJi:Wϰ  6RB0&F̦1֮ ̯ͨ$_bdHNm:US$1 T2Wи'^#y}y 1:&J9C\V4IŢX$tHAYF s0YgSKMr5y~ -,DC,!TndB p:}\ cL{ I>jԬSV=nP +G$gƳoqzu tK(ʹ 52te-z,k[c*h\S ΁ <%Zk{+{TIhW/rDnF¶]/fK'\hf6C [ѣ#{4aP.$J BXu%(F}nQZf3ٶ|@㹮޶{)!Ӥd 3RuԀͻ#jSv YKCR#a M;MMYEYsyX|>p HúJ P,,K8'8CxSq(=vq+וwnݽýqĎ&,N mhrkPvwjYuKm6 *'sl^QG 1u\:8nw&o}:u2 T|g蛡*ҿ]iJޭw&rZn@o0^w(&XG /Bd8~8^w("yCUc9X!ʆA,VWЯ\>=|+9y>yoɺ:ȇQ%͊9P(ܐ2Q t!L?jmHp\1kS[)Xw s܏ Er! eN``]IOESLa[‰Úk3eMhgwu5BBy@SV,; 4P%`-۩f?2r)Cf('a+z$5 iVee=Ckwmip6!MUᘦ3¾.*Yȣ8"}S{B<&( b2:K(U{m&p0AMɬFU71\nդBMKY8iNfං\{" cѨf 2?O=|v?g&dРA|4Jo`v%(34Kv3sݏsݒfX?Dڷ#ロsIػ/o1oQc֫`3j3~Ma'Jl{$<<+?VrZ5ГC^ @b&lI1M'ϩ'3p ˒C;ᶋxXon*#M3ƴ,V!gHs&XɘxU%lm:dd@TUm8_wf hz Buxdzrud˱^ *0R|KS:?uMF qZ:pUĀɍq6 ,<`֊>$u%hyV5R)6aa ~>3GݹFG*7Hz'T }1:<2G7  䦄2ޔ=l#.!=ەAU]Ls: w'Ǻ'"5< Ӫwok*DFÕ<d(ʻ`"ƙvvl.\S98V_nݯ00H{u>ckb0NnS#$SlmXx M+UO+^z*tBɛ5מ>N様mLe8j@%b;| YkqX_9Qy¬NpeɃh$v)5~ԡ7:2KJq .Ѧ%\WΚc_++Fȷ]D9$4PGCEڇdG{L+;E-նP9bʘ*= w\/N0yW-&=92M񩰘}<Əs*sh+<܆ׇgmQ9Je,#LwT,?,G WnJ#sZ{8sع'*evi>2}o>sE'=fDӶrFۏ~E/4BѴ|9Q[yJ3s%H{k)a:,uB)3t6aص2$ dA߀{pA,;x-;URqhf~͛#%9& я}EJrȽ {bǹ&O0q~M=fkފd,݊ j@n3Rlyc؁Dj1Q1#dq=NZڥRn8ks3Kҏ9m9/H<J K)nRn!6 hUN`  a'd$)qO%B4;~Bǎi)}DZ!dP= eP ʎe84ɛOtqS*xF_HDu|!(JD_Cl@*x`[H@B`{\$% Z=BŖ0hSeG^ {s+D <mp (kC!֒;HߙL dǶce <7LO亾(/$NƝi; \ڑg lIj*3o߱jTԦS/H8o-g+}i&Sh c RG؋HVR[29l1y.g U"!'CX((.q2?Z; P4a0pC1?:۬ d_)rF r\WL<WǪ}"G+FՉґBl &QGH\r[90$Rsffr)k Nɽ[1Ro5C%)9vZdm#8=͖ox8! G`=b8hgN#&Y;Eޔ|<ۓUΜ{4y~ӎK"Ň #zJGduC!1 a .N6@T!N.+>U/==X]1;8QA!NKy 8SIs9e'3t:J5[n.B߭@  BW}~{E(򈬥 Wĕb_xޑ$4;s@.⚌Zw=Caltfgg+1^/ :}\&ѷLl͔kJr(&6WΔC'5O)-vozd=UrFQrnUF9?݁ qL)<?'!ZDZՙ[+K}b ~4r$LŴ'UhC'ٵ\@7иXcAzEMӟ:EK iPNI 9_+ֆ+.~%bWJ@^ 9 ! b YX8YiP$Ҟ.HAEÿrbr3Hl?@N@S}l(Oy[mL."P )bL`ñ f:FʂQWTU*ǔfJ'PՙQ=tQR\~zLˑuB%.t5%auglFUf { .1&6.L܎OvvĬ_o=@Oqa R40*5[}WuSbf=ՙp7 A7wF*U3ՔuqXkҡes 'XxtZIX}e8jtԪR@ʽuni3g1?{J{ZXv3zH=FK&Zwo m#)!YR OiݬO_VԖ;ədCR˼U0^,~ssBl1[ztC zQ]B) Cqj# :񤑂Dn,ZU M;`N% .?u*6Ա4JZoϒ":.=?ۈb`W=? Obwl˫28 sؠN* nuDhܘ.ZxA[h1΂݇o oLmK˥}2p{$ء4:-=}TGH(soFSވ5Km|ƺI. wWyo0Y4uki]ΩbJEcIX!1I-۰p$7~+I ,#P̈́+xޜVi;^bT*]+,! vg<א:|4$l%lM!Ltd+#%CԧUV@v{`;u՝,& K{!^8. [A 6I0@-f]d(YC෈]#-bg|Xum8ozoFQH4)4'08k,ǡߩ~[v 7Wd$w;긐e%㣊 \dꬥvy쟳AgqN%.'%ZSCKK }bi߻PpSeyW&.KS\GW=y~&<*hZ)DC]72Bi{3ѥwWUƵdߏ&܏cA^T >m^uW/:$Icѥ*$@#n]v$Jp0H+RR7Ğ!)n:cd `x`3ts"uD!)YJf.@J_>XyeAh_lr(,e瓸{;:&2qУR^Zm eƿ?bhǚr=+N),nUO9zP]켏ѭ!zHqqA4/QWeQձZXo̢5x.~\?k0ݎ~NO1J|96An:&Es AB,3Ft/q){ kvxV hHRvX <xe>K9Y6#DLhcZ$IK l$ ;cZ \"8H~ $i x *=m%~{5|~ޯ_?uYq+J^Q $_V JR#@UW|6PSDүIÆ;du5r0u(6`S:"&#/&Ip~:sޞ{41Nh02sn:;*\n61#>WK B5۟=i\oOWraq cym%9[#Tvj:`0d~tMtк.TGQ&ve:gX_W7Oߜc!y nDb h {q/TkxH94t /dZ] 2n+e,\ JFJ*O⾸iL,Dњ6U{*T KFO=.3q_C^f_O&Y4iܱMI~};&6j"Ez<Oe`)MV'&rBb& $q𻱚z؄jvF98B*<7 wpϠ!@bA&Q%s0TM,3L|QHfkt="I{Rd"Xl[.cENN$õbv>̖?}s-S'.y<i2BAfA7&L98 ^DR,H$FD !X3JgڎRz Ǜ|ÈJNUɚH`i\"3Nw"= I"_._g )?D(>IN tlxrɝ= 2=|Czy6x`ܱ밧VI}LַX'9P F~\?B5 =qgXאַX BmQȢD&+L&zhtZڵ)zGT7fd!y=|l26}P@/~>'© G1>< 2%2R5ːPfs@?yh4>HA 1 A >haմB7Qnpgu-9(PT&y"[uMN0Qq3(3GVGZ"65v H\_(],_%O;E! #UW;)[ ƕ'Vߎ}owlGRcNaֺ囘8ऎ _??^/V ^H|(^ Olwlb^-lodP~q3]MPP@nO}Il4ήZUzfNljw(ɨȔo`(N2Uk0ƻ kx>p|ctb{YXV T-9JhQk(A $Po/f 0IGUx45Mל8=8FS<_sܭAz#J8d.mlft{֝oGx^Pp諭nJ2Fg mdTW2-_Q ~`<)ܘsfG1F#ߍα3;5vbw*2SBᚩ7lٸ3rh3$AB7)ԗJ  0nʁx?u1~{hk`OBtjjOjЫJ#XCD"?Od(/}*n"@WAPPp>S+HI Kp(PYU-`K0&;(Gq`d[.p#I$KfbPkJ25ՏG`~/ݘ}r'u(K*E_9JWo\jɆGA16Ot_ϣ66W͖c-,=o "kK C8;gAꋟ93N'ULAw_jAR0Tϸ7׏Zc3CmƓWvq#7ցY|u ;,Άpa xnaZ&mpˁrߑ-3KL^Dτ2Q #o {jAV;L0C1^+|LRWM )wF<^w^'n.AMi%$#ø8f0%N6J U uIby?1rw:Pyۨl,WZ aPyyf=m/g!dk9z e7a&WCҷL")+ikY< ؀A=U;-gsv$Okl:i1`V 2/Qh R.H Uo{8Ua%'U2'uwcw]UaYY%wIwcXh-L%59s'˩rn h=9odS(.UΑ))/_Y4TgfIJ4EDF3d-_t}էZ|o,_EWvizyj(^N.27U'8}RDDZY}MBaN/Wt7iZ`uLQkaF`dlT 5 ^uhj!WLuvsI y/tdV}clH-OBF3P6ebch&^wD[*pBGYSVT@_4%RA͛a9A%Kf [L/cOz: ~>|h 稇~8zzgt5u[&ru6:s$A NA: i|5G5u Y_eף#io`V< EhM3R'ͱ40V%$vhv8n \3U3VQ.#JRGLEbc. fzq||b[ ge^"̸eVW9ml$S&|j GkLd-PJ'xJ1C dhn#Zh{@^> [-l5<'ryr$yYe"P"YLʪ9?WtҌZ <,%-l(r'͏>*Ds`zQ?GBͩb?rE@dBi:n )O Q;ÔsGL|Ǚbk&{3Dɔfr_K>QJ v] P5N>t4ypY~.!^1SfRZɨBDF/O|-AA-ڼ=T6Ի 4@9} HC6S=fZî6]&hA"}c5Hz[m>O3m s {TS0X~~EUIݤqmnZMKu2[;422crZѽMK?G3NΈ2uȤGC69;vbY?`x.?(bJnTLd骺<PC2 *7BT#"ZyDUo/U sPW祁UJ nCD@# T/~ʒ 2 {:I&&)l6H s$8P>]&Bߣ%M6Ӡy]ȝZFſņ T@?PHlrEER-H]2E!ϭKh  )8Of XD/EzN%1a,Ћq) I*MφΣKhxu(i6f&8*%~Ifukf2@CAP'ɧsdI-Vvb,3lIq)LEi7Q6"i}a`6>FP%F:8C?=*4LdDf{G|@;IB-gľyj0Rcc8R TI9|% lkEB_K~dFn6*ZKO*te>pӏ!dp ET U(!,?6GTp QN>7SɎH6ԣ/):@Q`f)i[)AOM3Pj՝ͫK$gиVI_ixwX&5zTnjktvOploYjԸjTxL7+U1OڹҞ<,98G FYd➮y]5YYqEW-KSGjMM9 S{ISm7 1RωȚj=NJp '2zp{i_6gbZZߐE~" +y@(a](JƞU`,LGU<)W}t6 knVm$tpshWd#@jdcwg  *Q$w}~diB;>2d/ub@IԑpۃT?EeBVd<׭J'nd޵Kz^bMS^x6ƥyiыJ^K,'ٞV[RbL6)bV4Zڍ6Dt'u}bjY{AJ,tvyҸpW0}U5B.Mt5wx*I:],pns3- NGx*i6 9h,+ǂ.=`.b0{o4ңJbꝘƣE'|+KS7T)lJJ{$Tkd1A:KBꋘ9 lƧcl!a,d`ǂCT?rVNep*B[UIdjYb@.*`i*%&A(Uʇp7åFi6Gg͆[u_/y$߀˻n4@z!x.KVxTo"SK`5 beQ7%_,h}$:'>vT&hÚkmСIUi%)7:UY`婟dl# i0j@6 $t]jR;9FHOW5pzq;IiԮuNS)'VueN]"VzK@CEkw(E+~c]0Kg |BzBT)`!GӦu^ ryT=m$I&ȵ,)P#EE,ijoje?(}>JQkD^;+?i xXk Z k\[Z`@mŸFX0eh3J2C hRzX(uZ6f-(7 YO :77x>m@%f `1D6*9QZg@@:٫&/ 5]+ sp䶑@݋o_mR]AJ_u;k/:0>m3nj) j"VKooYPB+夫98z)/TRMԛocج9DG*yVg ̤U9OCOIdeL:[!zc,Ie[~rl)%hoHj{-Vjx%XOsbI{ FZ 6cyhgfa:7QH--`z+\㌧]7\҅ F:sw#LH36X4$0%Qh_}FӀ8VS c V\<^b,Ym T}մ L(ys#k@MzȮ(pAfrV PmUx#)譪x4sK؂69\ +ě/Sn9 pύggrAZ?!AAR JE/&.h눼"P[Պd_xx_Í?$ ZeR_6}D:;l@Te7#7PЊo kiukEx, ;T nmqU c!oamjm_8HWCT,y7Sdh(Zm=yQFZk\oMיO͂v 2ζ"X//#IcᬁcI~y ̼g>}2Nrs8RoIEa#1(%ZH^E&B7tZ\8 wotKupund =T7JnU`@X^lv-+`+i0nԦY6ڣ=k\ޫt2ѝ-۾/Z^A\w2Z.VIȱa=LiŲ`nM g?KDT BdczA p`@wk9@!F*9 9^nφX#}h,TVD[UbEW_,4@kbyPrăfVus!g5`e+}v߶X`y깵€{FK[@' Euz/Ccl+3DZ C\$B/*k%{GӀ}>CioBuX%%[*[!Bo"RFKϮiU@.P y5~Jv>` 6u @80iRXvX{%q#tm>uh{'nJibbp2+gO@9F?TXַ^Ƅ5Xqa1>(}g5 YaV&@|#jz7"~nRPSDJ!^R/ܗ)JsxiGnrd8'`ϖ3~p양 C4@ g{~y神hJHe_oCaPzYP~뾤fUU>NKyYsc8Ot>go$'x'd+pEՔV0s0!(=XK/M㓻nx%ip먍0v̀9~*N@-w4վdj<6[mLʯ_V EhB ]˶ˤ3MԊc񇧋Oª"# QДX>c$ cNCFp3k+Py-)<὾nL?8 {Ά2w,R0zx,$x mzL@j N= 8%]"~6ߨ+49hя6Z떹x8iꬠͮʝ$qp>"YSiމ ]3&>c:*1`dJ:"0A{F1h4aU6;AV 6b|dOK,UK~4zKAbt}Ÿn>a$B)Ƣd15HBޝ#n+1 %t #U|}QNI?N:@{`dkj}ZIN}$a%!pƝJh5d;lLU~u1ݚHļ7V9"3S-3L >ðvzWY;x3>dOI02nH*ӑ-޼#r7Hw:.*2X}} sJ wgPѬ"arV$|yg8ΑB2T?1[SΕU(T1\JT&r2(/Ŷ{"5 xzcF?[Gh>!S~z (/MC{K>d/'2IJhR7⯅vZmzA^'/=݄Ew˪j+2Լ"F0[[R`B󆢢HFIs Gb`byf֜…Lָ93L}o`eam?$dM1ʽj]vư%ur~޻?_ ~ V+k¯VzIiFR|\Ro*o279׾0^T'_)}n2L/= L!q#u0\kb9Aۃ)DuL_5 Ii8%YR2*|:%W$6bz]r"(}hcVM8ldo7+6EG4yt{q:"ޗ@Kd4vl󤘷fY7U/!bYH,cT!--RDkzI(E+$ጯ(݉P}>SM"V=hM)~)/EMư $hTHBvs%Ao <臟xGDNKN2=(  Xf=u“uth;.~h((ThkADQۅ6х۾; 4UA6"vpԮ|oUtЈfXrgj7f^d1i\p6{߽\W~\1 )㥰žeN^?rGV v7#G7:fA}&Tēܬ۔$>k($i -2Lј6`RD->VF~k-xi0@NP0P0<Ɋ#ƦHA92 sh:t/X>U:MԬxz:LGW^0x Vl)ӞYɱQ׃AFyKbȚ]HO-~6xu{,!볩Vwٟ 7@u 5YXd_M|QAZ"4+Kf5hE#۞mn̲vZ+jq]\Ow]1hdR`l8{hhK Xk:~7; ./oW[_aRm_۟16P}F(8Bp(UxAvSpхL¸XQ9Fn@/) A4֚갹XrTE $%~E9& i8K776QR)ɡ+%"H`7<ڏMET_]O)j.)T]qg|@/fu/ ޡ` Lu޻,a),MbR`V8͐3.:iuF͊? M5Iq,1y?^_7MˌB$3ǥkW෿:ޤޖiySb"υ< [Nj|WޝriL0R D=T,}s, \ѫBB] f^;ynyREcS#OcVf%=|ؘ@Q;-]ZG,3!W~Caǣ?^<d$aJqw-|E.Hi޷lg*:WXK5`cB ) 3f}ɉ#grwwzkSY#80T.vyܝV>=ԟKM&&tSCpG{EQ:~j&VWRfs)4d^X ,NmqH0_B' sK:Ҝ9*2AㆥE~_pi,:Tk<5hpTS'` 0 ؄ #2"q}@||E|)Cf!Z3r ,`Ef"aNӁ83an3##`a3 nDzkF7Gȟ2fY }4A!xHȸXY 3Nхd'ŒK $Q aΐB7Mls<9[Rrf q{#(lS`_i[\1$UdΔ8԰dx jG%s0 z+87MZqǚ$?B @7YA5&*PHkk6^ Eh"BŲRLƠ@Ah4)bPg2? 0ij@]"i#\.kezU ~^7?i ZX0%Apf07z?'ᏼoB+{n3tj΄TC(7ٲAܤ{hjM~MǖR>6s7dvBLrJ+-®.4W;$+;xa90{)L-86 9w /uuC|CwɅ),VlGg MtJ n͞ &ۜ`. U{})";wPǤCbm[ǎ@z*o *V5$"p(uvS cY^ԋ+ +6_9uxܽ]:<(-koQݾ0E,x9:RWֽq`ݾ6Hcїbx/sO=gC=- 4zሣX]#? A??N~$O|T^ }N) Ȼ?l9c2tLe5Ef" eKMfޒ]5T(rwDH}q8o^꿀0:{__0|L#M+]+_[6m9;ݩ[ˣym@B(F"rcT,*f=')""ɵr>$Gm{[* H$#h)}Q$b"E8b1)Z1X'(BS\>U Zc"f~yN+t4#)LW.N \5~.' Aq&?MSW/FJ.-RWs6jͶ)Gv)>$Pz$6gВj!o$,NvM4fdq޲G;HӖe'VJ-h'x;Se:Mh')qP&pfdJEf'K8*y}>4ϴlrw&pU#z~H{u&(//FZY%+k3X(ю0KNACAi^\ɔfd6TF(,韢{K1jn>Z&o4 BRǜJXb*qlyy2V/F".<1rG"Wg]T^b_X&A*& &|A6iҖI.VtTVQ}t '49韙RRkS&&Ʃ=pZ~jCmӿPkkԌQyI2'"Mh{ 0nt|A[3VLifoK52zT*_=>|$*UC:R >(lA|bk4CjγDV ZC@5NǭcR#Q)BR&O@}N;ƐO& Z^Zsw,P$H; F,q=HnA||pQ"i9o,C.<}"kPܫYxZI2go #GD]r.>X:XUe[-B _Z \ru|1#<3'<綾pC}V}f[{|S2@t#wɌd\%l5rTF/ =b@׬h&/>z+.Q.R؜Om;Ɉ0vF'tY5,zSaJhJU8 C,KTt"m`&llE!,Vȸ˔.V>p0$BMS%t1ҔpΥ9'ˇ GV]r& \4DzEbI-mʛRTM*]ZJ\.#jbgAj8;>{ehgp'DAPأfZ!򦛘K4ۅtdfw9oK;1J[Io>xVy8(( $9<(#b cmw`)]@x"8'\nkZϪp ^Y:Jm#r|*=ZbFS8݈,ǺV:dmYc64ᡚz>ώfmMZN:$&|&ǚucu79߉篸=H:I1NCRL ؏bܸ-*K/ewvxe7JR1؁H>8g(ML9 We[ͤMbCX]>ހz ʸ P=)48T9})Lf_7c:@eeg-#w LsGp:hrES~W̗߬E.RwaH(z56ZOɨ4ʝr$\UޗΛZU>k(Tgk8PFv4f85;ͬk}#KT#Ъ5Q)mBɼTئ4*,b@QSr+KMzSM_Cž,DKZ)+:",x t"P~-O/o{"R%%p4HxDG[Q c.xC,+}678Ǐ{DȆpєD0ǣbsi䩍b??ESW9v@ Ľ\<.{g\zG02#Ќz 8UfyɄ/B鳆P;AI^aV"w]ۂO{_S<VpVyZy3/.} ib<SD5vjVuÍ{m;Z?͓ZG$HKpo7@KǶHne6JB[wu>i3!Ț> %$jaqyy3{nK:߭Eڱ1 3gCL "\OMi_v8rdN:t0>*=pkdrFycJbI$D0E3}x ·*|obp 5v)F `5>1>w݊@pZ)WdR̗, 'iThhiX7maz8v!owu>+CKA ZWkȩs7_Cu%dZ:x63[j,KM~0TJ`<1%M  u1%W :Qѕ8B*V3gXYK$8*쁁H1:֏y)Q VU18KEBb`0g\)YL)g*4S'9zDD4GF<$}1,t>A@@ĺ7Tn+DIqsBVq_L{Kg!/Dgn|HEK[,f4[@mqh۬E` D['䣣ЗBċ>嚭TXh:jڊg L o8}@ZO˘{]h[!T8:xk_rl`}M>5It["QDȅ?Ik%*/o[ @_6Wm9r0 {hY` 6;U&vN4sThnC|{bVn1 v3o'^Q&nYr yVE}BaNj R1ts^p!? xS(W^ܤ)t~Xv)[1Vo zrq `(TXz)} p#g*r7o_ќ2/_| JPe,*H)1#"baϯwuWWlw$p>xh8Ve @ #64p~f1lNa1?k̆Jn^Zu/Ϻv\ލO 䖥jPxܑHLpFukx\Q -θZp#@, 3lLFnD2++A@'@l4X1iIH߲ 2<[V 'MfXsN<Ǜbz_?zAsF^4^PKÖ;k ʑ4H_{Xӽ7|နǮs^xӪUhuiR)Ai4+1jW;5:..PQ2@is&Hޱ0ϥ;ES]GғS+H𣐂rê#|O<.0T\(*c ],Y ?h5 F$ YjsAhSbǽ+vFU#Ԣ8:[`uXre`kZ:tԱ9CAPxOJ$'W1Pղ!PO/ej[ҬzVfSLl~< "E6я֡ Sd ~dÉZb+Y*A6o%Rh;޶Io| -W9C ζjso ;yCށ5 5f_.Q Ű&dmkru!f r + @r\C$of 5v:>w~Fw.M.Qx}@|_t.x-oa4xKqY$q; 8\2>I;bں(;Z1 j 1ٗ +˻YgA qy,O2v<{E'ˋY mAÍmm%pL3&/LUɳA .T-+$+?蹻hLS#$@[czRzw9D f+dp%7P[<0A"ǜuJ 5 Ed{4Y9mtۈL}{;i.? 5=ֻBv48Xit,'ܽϳBр9S⑔<6[ySmP#=0b{SC}И^5łˡV|~+!pHŔsAO:.3ջLatcm󈊀d*4kku7E9s\ |'e"ա~x>VA]Z׮}P@.n fnBE[_ Q饭mϙ#|knЃ7F~9_I^%#O D*4G4$ l%<-3p\- ķ)=KaBh }3rؿ":.O0جKbyzEG!'"wݪكH9ҚV69z]VrѬ$h 7KFwǤT:GcQw!mʥ9mOѳ=vxr)Opț3f5`LBz{ "` GH*. <{Fp\ռAP簔K䑼4`uP. nޟ UFu@n?}!i [2b_mG5]TQz4NXv6vΗ[ <⚿-=(> ug HFY/b%^g˄9\b'bCˉuxfL>¸a~w?j\Y~6bD0Z\w;C:a,82ni~ܞ&. 6>FbkD_Q9K}e<Wur<};\[`žTc&ӻZ&Q͐J۳n 쨝B8[̝/nR;Ўll'9n= fB3VXU3ptoiAqR(rA\:d'!|+VB/~  3ëiHf9 B:e/\RcDB9rA$$qJN)csy‘Œ螗u<1ۼb-҄|LI(ƪv)I/9OH R1C瓹@}9`WK5n885vַ c|QRD81(ZAn|G&;X=Bcv柝Ol43t?(fkJ\Cd"ՆrMظP~d`mM4~iU1ݡ/Au`=_wV@)h*v[i wq^ Kщ9Mog+j?Lic3Y,ox@ȺWY^N=F0o_Df3UgvxW8w:=`^I@ݪAsU"#wٖ@+,lJ[lXa#Gl_ݸȉ)w-2mgK'Uޙ-?3{y=!q+>Sd29Wp;6C:iaդA-r|9QK7sªYsޯ-[GSΝ`ϰgܝZ)}U\FUl , <)M5СM8].4mPng{}#Ts{5z:5oUe=(%4r$/>']G@hN (h;)dݹ}+z2_[֕|D3<㱸!;sϠUdȈBk~ L}ҭ?jHL%U4I"B$%%G?l?K;aj.yZ3~̧⹘Ù-8(+뼽Ir"G5:$e83;K}9lFMF_3Ko6ȵ!KHY=b1Rt;U)E@e+M|[? ew < ti-D\I!ɻ\ǯ x@SUw@*G b!xj3k*̱梄&y[Qo>^]oiV}ʷ̷Q/I,w}?6mQR2_aWYYA-vGc;P5u7C;ı*%!SL`zTeD:P6h5ǻ*@2ΥXbZAtAS@ӭڪҮ[ Bn T\_Z%̱X;a]QnGpȼkR#) 'U˰ae{Jlfͫ lȫB4 ==j(5sDKd#C,Hwh\Ƙk*0`"5&@07ao T҄7u\sעz7S2ێ(bj_Vi[0xK znkʀђ 1d!Tv׵< l':݂9x:5{ݠqT9 sA ") OQ,G:G{%pHpҕ*ʅ ʸl"l610Z(h :."- z 4٭Zh@";ܜ()G>`! j 䁀j3c/(1^\Xĕ/;4tTo@kS*!%rpB$qe ?MkݳEAET.9DŽgdkHAv4C=nLQs:k"#whKPј1DwL *(VS!9_Vm˴ӡN/)иu6!(Ro;1…S)wtW޷d`w".8`-0^8yG*Z'4@yi"iDZ [dSvENp`| fHe񅝐1I>[fX5_y: _\v,&>@$Y|l|`` ed7pqƲL6.F |;H!gy4Zһ8H$|ݙ%6lˣ@Z'Ά6Oۓނ.!¹ryQ@\rSXOZw7HƂfln֖l 7I 6\6ak(jo3ܰoobG8-|VO˛C7ZKN֟Rv$s_\SH c@r/^Dhh <ྯ[cs}8t`xV%bv}6:+[h8"= )gSPe}rL!?"5)j!ߡ0oK@tq}DsEG]2W6' D kGT3W|PV`l2nz9zD= 2c9ؚݞMLztF< M m [ߖ[x0S6dn{Yf٢N1QDFw{k s6aGRrw2e-/e뉹k_Sc%qHa"=e{J45R&tC~@B 6̄wY}xTvhh]t"YoBo.Y5 jd|vo]\nLӊDAjQ޾V7s@Byrߑ=v@pz#"#Z[cߩv"wv;3nt]I3GOwv5M鑛#]^* uózz **ɹpAj~d1;5g69U8QsF(@9+8b+EZiL["ˁ/y?\9sT*yGD\ NXQIBIե?(+Vv@2]%,vܖ(qι>GYۻ|hC\Ig$9(.Qd!'`h# v=@Q-W:wnڿN[`bnrs?#UxV, ;`u$2X)>m]%C6{? !7trJu ÃA@ d3{,]/0 1?cc ~2F<:Od4` q?IG/5usPF"  !yp7 @ d#5YjwO'_w-bBШ&-W{9ߤqhwd$MX?N&ϛ}7f,{IIM1ӮkaLڨXFG_{z)mi GZ90k;hP3p8-WpꝥE`Ꞔ)/Lsp+ef˻ZGFІZh^MXɅ8NlRB{ OIJ]s(F4[G.׬Qe_l7jyCmS?RD'zjOGS]Fx?TGOÕC/;2ʼnf#8=N"DFD}C5E6/j3~i"Zߑ31pt]?kh/-},Gt4[B(In$yyk|Duģq$ =emm$Egq _ʛ)<63!R4$u4տ x80:B mgXֶDÇ!dK=*[L,ԚMj.ඔSŦhn#vdE ϽBQCHC0} ,0ӝB˧x~hhaǹRډxZ=JJ:OKI}#4TbN|JSd7IԳ-5:@DP}? Z *_򆢇pЈ8J/|C ~Iw]ܭ?@+[ HaީJV/馤izڹْ;4ȳ}!X,ؗz7ߛj)ON;d1'G#}4zXJK:^Q| J~od֨!/ηc-vMiO4(f]x)!jF HY>Jc . YF1cBCJk:!tBOH}}$2[8zgW*lg֥.px^}RqúFVg:ÍLqW]h"=]V W˹R;U^(tLfs`ϴʔ<'y÷VBnP)>u5Mp]m#i83$nrК)f"+Q~^$4hȲ8A5k83{ϻ%9#^;֡~yT]tQfdT0'T[.TYXM- < }^8?,(ilNYlnf2DtD+}<3;_v"?u"2uV&Bm  ;rWhP{+P0N#`ج:ޝjmο=8Zn͙2l91 lxl({ {ꩬv*EisPڟZMSR3;r. [آ .셀Y]6sEi\8s'N2‰AxJFuHyM¬f\En9KZPeķv:EB0=P(`E|w(?A өL ­"3pXEΓׄ׵Ӗ)QZ`/| K郦h(k.Zc*t 0vRw/KKvs]y7RF* 'ܺVC1N;uQ[2oiaR{dz|eh ]>yj*z[}fYyd r*ݷ˒!qd[͢K࣌x7Ov0) 9K8JŠ8!dyծX4Dv$GI mUp}#>z CW%1p5!KH۽|r..3fIP,"hF+--##6q13TuI Ϙ[vb'"^T( o"<&wC,^!KM1䑬sr _U^;6\yſd ROl{;NSrPN5H4@6|* bQשm†BNz<#Pڝ;λa~2ݼ| Sf\WwGc^Y=-3)bɰ|ʛdsŠ47>לeE@ݕB2 D{합3D㳳?^]fǛoxe=]H*s׉]6962-jͳVDsL~7!%tvoLsBj׼`ln؞S !j&횲Fy6` F#_lˬ戫iFDeܰ'!-€<O( 1%cMI."*h%/1[(e-*趺sCq$jyU 4y'Ό-je<1-M抇߼R5n7*N嫁|r7|o `!.FN#(}3|sJf:[sg7Y NXuslŚ֋RT~/r$Ie kڻA~(Cby}xJp`%l(Ls5/Kw,3K `NV_9A)/b* hp 5f?؈ 3 ~fDP[o=ۈV)YNК>ZBUP2keCo5S 7?彮W=Iib$Zsߨ`D ș-oSrC=g($9 nU|w;--u uPG u5Tj&$K]QUFϠJ|X~RdsN**" !y]RMDUk P&Z<#0"(|>ej@@_<${.YpQ)hz8 +<"|8+,^ $D`aƕ QJ{f41*R%PQBd%:Z3@v5 "=yYfʼ !2TsY`{A6 Yb%xZ?k/tԋy/xW Ǘ 6mD{`q 50,Є@.YÖNm^Đ0!u&:h!DH)'udy8o(t}&ܿPT $1+NS.loW<}2 g;B ]2J:H+>5FMs)Z3<`Q%)~ML @!W̭r%[3p.mP#?8jbBSΊ FUDҗ%,,'db@r8jQ&7pȠ롄 p]`L9B_"e;`.4e]J"|Z|/:l@^+11oY^|ח{'?1{k3Ed)i@GW6B!!V3gNx&1޺<9֌ʍt s&Z9@RxA!h q6*,=GZzLB:msw쓮HIfhG2 +[1 N'h5(kɹ鏶h`bV5D,6o柜D3FABtQ=ߊ~AGP7Iv#LhSΉ>>u:4<%C׃Sˊ]Dm~P"z:w@ZCF'P\<ϵUxh iIrj`kAg⸜T & t&EV $2 b> t U*$ -1#费$E-/+t#YO -Gd~b u'p~_=2-i/R`rH|5k&ЅNHoh!Uз[SuuoD㎼`jt3(l25;@Lcjj@jNFʠ@!g FExf!jK$/~wK%yempP#(Йx}K_$uʿD~I݈j "S_!O͌%X{ aŨNL~@ +B)>qW,`0≮s  ձ nc5[{d8w=h]G"P6_5lb5!5ؼ+ f>MW)bMGtdK+VZ+LP(>P/AM{yJ6Ú T`$7[DT }e;BjjU$ /6w`aB.CӰG328"O۟P< Rx9Uei]|F\ 23H詞?.J_(n' L*Ҧm eKzf6aj|IL= &Pl*f^]m#,ᗭV5pG 3P#^/jCien+aNWr $ ~2Yg} l( PFJIӜ|'$j/J.a*qe 680JcJe>[&W=>ݮ \*~5IF1h TgY .ۄu zSAcg"CWDBȦxDklkmu s$gVleG[z>e IY ga&X]1B9Ib[3h`ys`/ {ܒOxf)ӱ&|yZeA)0laȨ]@E\et%<!H ?@Iۓ!UC ,ІUXI < J2ZVbGn@0=X[u]4d1DDiLBtty"$ѱ= w eYaԥ##Ȫ>/7^@;G@3qZ⎏H0N ?]2adNKlNQq6bnd.i0m.uGF2A`Hd 4$U!d ML ~KÈP*<@|N69P9)Ztm+j(L4K/- m*P҈yd6)BN9.5D?)3TU*4bBAh=Y&9!{GWI\gN銣Nv+g'8Q)9U= ^APJRX siG=&RHIj'JW17vL`92侶JdS(pԓ[/Bp VۀܼUG4L)W8?\ԍ׽: (+tm{$%Z(IRʄV&&&r|ݗ@}1m"! 'hX:_f!w ylEh{n!Af+2W)[~4q0Rh?YN'0"? u$cc|SP1<[!X.:BF ,քT@8sBv\9kuxW)Q;V& <ێ;Х8;!Y4ˊN ";&IBw%;/Zj؟8 O3QmJ}x Id$g*16prX-֓|+w=$~4IPg?(t# *u:xIIl_i0W@Hja$DlH}x i J{(̾ VN{Wi&pa=] v[kS)CP&{qE^vu9u^dŌY^-pT`|Z(OJ_Yp*\@ʘ'SM3M:D27/'>Lp;V$_M̸w&pg͸< ܀$:[)CBc@6# n1#wŀOJsN*GZb}Nh+ߝteg=3E϶&e.ŨQ~ҮtA.QWZ%]"洬ٕW,@†&7bR2;3 A&n\ (^Rx+W+g2@#CS*&09n(+:H_}~km7`Ld蔮̓ w+mx/,re J5g S˅3k &m@1r~|1g}ejp &>9) *1Iqz{YӴ'q][V\Nni|UMR9S"9M/~> UUCKh=q[:<FmjIU0զBէ] ; AkNbdՀc> TKEF7pX^6*57I&~iqz$L'1c?\7nYDD W\,DES #{t"-z/LbBz̭<%%XPHۛKw TSBQH/{/L ęai;At cl-cT8_jh֮jߡ=>u"f?D~YJb=:8ǫ#g]!L}6.am^W2h~SH.Fst4Pqo>xiX.[`p1:b'Įwuh?:ħ?6Sm!N]gUh[nC^:ǀ ū9/$YV;~ojmh!IWGJvd\#sD5:'ڪЯؑ6, ZIuH{*̮d}[!C&--[@Nk=ҹ-_XR uYDxG8k20a;%eO?rTcm!:"+'zG~꣕#8o.C8<߁ 71LJСKORi/}K{“0=f:`Bᢄè._5R;!" ^&Ӑ!HP)Tyg * Ø(FDy œ?4QeZ* xWGJ|T("Uq':}$r_bO4` b?龒/JcŤӋ *,"gNahf.d6|t=^nW1Ob44pX]+@/ ю =aĞ ?q{.l3lyr2Q%A`f 1f5>s=-k,rQ\ԁa>͚`LޥgVEvrRlf>LRcUt,MPz{Ѱة,7QVܓ[I>g Buw>6_.,q9)œ"4V9tY;俔.a qmql﹏$ޢ/ Z'Qr-_> e|x Kk A=Jۚ̄of녽(h4l^-q5j Ykú-XWoe*VYެ[ވ1WnmB}ʶKcuGF@}> ,OOnt J1 S+Y.BHPdx-> a>+R^yOOj P^~mKq#\*?'CD/@_KI'(Ƙ<.#)lnȝ]zkIZ~a&hb%d7>6:A\G2߱T`? ?džG]{{:?qрel!3i{ Rp(oc6:n3mr~] ܰ:5aL"@-NNNrݸ;sQLw>a xlFq 'LŋT|Y,z iFwMېJ$͵mNR%[jO}@%0;CN4{_I?Tys\Uy]-Ӆ.5`20"nKN\1o@<$mrm+E'7m@|s jywhH?aw+Nj#yg=۲LQnkkcu*baw4puۀJ] Ip%"Usm|P;wpp-Psc3) |o8|Vh-A s6B!|V \+\Tv / +y/W҉G~tM6pQvso|JMh{g|'[]\2/otu3&M.w;ŅM].I\9ϻaok3[ d%gJwD.oo6b_c{n?,n| _:B}mmkG@KyRG a[TD;F>Ϊjo<]Z3,mz<+.J:TC.?d闓YN8짾9]> w}\HɋYM`v.)B=;`<; zgU}Bs)2Ə?X+{ʲb8_&;S֣`+ )fNg1ϸqL?; @Jq֯ JY @o>Ň 6A.PoZP$UŌ1i>0yi7p\,Wyud>E2(.raP |ڐ Ѹ ~QN[0Uǫ_Iv`!nz6b8A{Lb4o3&7`iD!и$Mi8' ,;`5$ OTE&L &}{>_??hxS%&>,7P`+WѡW=I_LVl|]]DbƭzAQ&|M>ok0n pi59XHL}ZѰzޯ?k8~ucv9ξ̀t]5]@cUF*KrO,2zyboys g|#WO_B%o`EzKmų¿ԣ8)޲ݪ&o],(iI ( fOpM,^ #vRK+KnDB}A# ߽OтwH`({muS_:U ܇` (8>dϫ(VUpc8p4]R,5IŹ`g* ǼeQl M w*%ޏ< 2Ds)iU@B,нngdّhi0{`o=!ek#Q hpOK2?pt(BMQKw i+ʖTmI͍aJe+zCKF%C+"=.]Cb]!BZЦϢOLX*`/ؼ h[68פ'׆HeU"HK4̍ըzCYCHsFb"]^MDwstQa]cri=Yx@_稊|!wYVHB2 '^ .=*=3~I4ؑyeݱd4o>䵑NLnJv]_DmO_›\+gpK4Wf^Wl@nϕXCl.!o$ Q dCZɗ i9k]ɸC Gc4fX:33c`pi@$ 7/74~eaJIYGԻpE&8qZЄ@K:ch?4lw?RX@U_Ō24B j<+Áե-2~ixmFPߗp+KvwUY4P`"db$΍>yu|DBY- 22ɉ,|}U4>,j- XVa`AiLW6--T:.=4WÛ0S0;JÍ h _Lϗ{*Cvhg\FĬ #^l P4S >N* U o }4;BP QQnQ;OprzC+,A]GIEe+bwg?cno1B݉=+3Mxx0LJ${FiZ=`xF}џ=1-CV/=U4ֲ;L4>7n&Kmu>?J(/A=DireI43bդSY9#oGS)|]c?$QKz;S?ry5ODwdBepNsDz|ᯕYw!pR}.P1.9[/zlC||hȌ|B|)m܍[؝Q= '3': #python 3.x _BaseException = Exception def _failUnless(self, expr, msg=None): self.assertTrue(expr, msg) else: #python 2.x from exceptions import Exception as _BaseException def _failUnless(self, expr, msg=None): self.failUnless(expr, msg) ## deprecated since Python 2.6 # set this to "True" to follow API 2.0 to the letter TEST_FOR_NON_IDEMPOTENT_CLOSE = False # Revision 1.15 2019/11/22 00:50:00 kf7xm # Make Turn off IDEMPOTENT_CLOSE a proper skipTest # Revision 1.14 2013/05/20 11:02:05 kf7xm # Add a literal string to the format insertion test to catch trivial re-format algorithms # Revision 1.13 2013/05/08 14:31:50 kf7xm # Quick switch to Turn off IDEMPOTENT_CLOSE test. Also: Silence teardown failure # Revision 1.12 2009/02/06 03:35:11 kf7xm # Tested okay with Python 3.0, includes last minute patches from Mark H. # # Revision 1.1.1.1.2.1 2008/09/20 19:54:59 rupole # Include latest changes from main branch # Updates for py3k # # Revision 1.11 2005/01/02 02:41:01 zenzen # Update author email address # # Revision 1.10 2003/10/09 03:14:14 zenzen # Add test for DB API 2.0 optional extension, where database exceptions # are exposed as attributes on the Connection object. # # Revision 1.9 2003/08/13 01:16:36 zenzen # Minor tweak from Stefan Fleiter # # Revision 1.8 2003/04/10 00:13:25 zenzen # Changes, as per suggestions by M.-A. Lemburg # - Add a table prefix, to ensure namespace collisions can always be avoided # # Revision 1.7 2003/02/26 23:33:37 zenzen # Break out DDL into helper functions, as per request by David Rushby # # Revision 1.6 2003/02/21 03:04:33 zenzen # Stuff from Henrik Ekelund: # added test_None # added test_nextset & hooks # # Revision 1.5 2003/02/17 22:08:43 zenzen # Implement suggestions and code from Henrik Eklund - test that cursor.arraysize # defaults to 1 & generic cursor.callproc test added # # Revision 1.4 2003/02/15 00:16:33 zenzen # Changes, as per suggestions and bug reports by M.-A. Lemburg, # Matthew T. Kromer, Federico Di Gregorio and Daniel Dittmar # - Class renamed # - Now a subclass of TestCase, to avoid requiring the driver stub # to use multiple inheritance # - Reversed the polarity of buggy test in test_description # - Test exception heirarchy correctly # - self.populate is now self._populate(), so if a driver stub # overrides self.ddl1 this change propogates # - VARCHAR columns now have a width, which will hopefully make the # DDL even more portible (this will be reversed if it causes more problems) # - cursor.rowcount being checked after various execute and fetchXXX methods # - Check for fetchall and fetchmany returning empty lists after results # are exhausted (already checking for empty lists if select retrieved # nothing # - Fix bugs in test_setoutputsize_basic and test_setinputsizes # def str2bytes(sval): if sys.version_info < (3,0) and isinstance(sval, str): sval = sval.decode("latin1") return sval.encode("latin1") #python 3 make unicode into bytes class DatabaseAPI20Test(unittest.TestCase): ''' Test a database self.driver for DB API 2.0 compatibility. This implementation tests Gadfly, but the TestCase is structured so that other self.drivers can subclass this test case to ensure compiliance with the DB-API. It is expected that this TestCase may be expanded in the future if ambiguities or edge conditions are discovered. The 'Optional Extensions' are not yet being tested. self.drivers should subclass this test, overriding setUp, tearDown, self.driver, connect_args and connect_kw_args. Class specification should be as follows: import dbapi20 class mytest(dbapi20.DatabaseAPI20Test): [...] Don't 'import DatabaseAPI20Test from dbapi20', or you will confuse the unit tester - just 'import dbapi20'. ''' # The self.driver module. This should be the module where the 'connect' # method is to be found driver = None connect_args = () # List of arguments to pass to connect connect_kw_args = {} # Keyword arguments for connect table_prefix = 'dbapi20test_' # If you need to specify a prefix for tables ddl1 = 'create table %sbooze (name varchar(20))' % table_prefix ddl2 = 'create table %sbarflys (name varchar(20), drink varchar(30))' % table_prefix xddl1 = 'drop table %sbooze' % table_prefix xddl2 = 'drop table %sbarflys' % table_prefix lowerfunc = 'lower' # Name of stored procedure to convert string->lowercase # Some drivers may need to override these helpers, for example adding # a 'commit' after the execute. def executeDDL1(self,cursor): cursor.execute(self.ddl1) def executeDDL2(self,cursor): cursor.execute(self.ddl2) def setUp(self): ''' self.drivers should override this method to perform required setup if any is necessary, such as creating the database. ''' pass def tearDown(self): ''' self.drivers should override this method to perform required cleanup if any is necessary, such as deleting the test database. The default drops the tables that may be created. ''' try: con = self._connect() try: cur = con.cursor() for ddl in (self.xddl1,self.xddl2): try: cur.execute(ddl) con.commit() except self.driver.Error: # Assume table didn't exist. Other tests will check if # execute is busted. pass finally: con.close() except _BaseException: pass def _connect(self): try: r = self.driver.connect( *self.connect_args,**self.connect_kw_args ) except AttributeError: self.fail("No connect method found in self.driver module") return r def test_connect(self): con = self._connect() con.close() def test_apilevel(self): try: # Must exist apilevel = self.driver.apilevel # Must equal 2.0 self.assertEqual(apilevel,'2.0') except AttributeError: self.fail("Driver doesn't define apilevel") def test_threadsafety(self): try: # Must exist threadsafety = self.driver.threadsafety # Must be a valid value _failUnless(self, threadsafety in (0,1,2,3)) except AttributeError: self.fail("Driver doesn't define threadsafety") def test_paramstyle(self): try: # Must exist paramstyle = self.driver.paramstyle # Must be a valid value _failUnless(self, paramstyle in ( 'qmark','numeric','named','format','pyformat' )) except AttributeError: self.fail("Driver doesn't define paramstyle") def test_Exceptions(self): # Make sure required exceptions exist, and are in the # defined heirarchy. if sys.version[0] == '3': #under Python 3 StardardError no longer exists self.assertTrue(issubclass(self.driver.Warning,Exception)) self.assertTrue(issubclass(self.driver.Error,Exception)) else: self.failUnless(issubclass(self.driver.Warning,Exception)) self.failUnless(issubclass(self.driver.Error,Exception)) _failUnless(self, issubclass(self.driver.InterfaceError,self.driver.Error) ) _failUnless(self, issubclass(self.driver.DatabaseError,self.driver.Error) ) _failUnless(self, issubclass(self.driver.OperationalError,self.driver.Error) ) _failUnless(self, issubclass(self.driver.IntegrityError,self.driver.Error) ) _failUnless(self, issubclass(self.driver.InternalError,self.driver.Error) ) _failUnless(self, issubclass(self.driver.ProgrammingError,self.driver.Error) ) _failUnless(self, issubclass(self.driver.NotSupportedError,self.driver.Error) ) def test_ExceptionsAsConnectionAttributes(self): # OPTIONAL EXTENSION # Test for the optional DB API 2.0 extension, where the exceptions # are exposed as attributes on the Connection object # I figure this optional extension will be implemented by any # driver author who is using this test suite, so it is enabled # by default. con = self._connect() drv = self.driver _failUnless(self,con.Warning is drv.Warning) _failUnless(self,con.Error is drv.Error) _failUnless(self,con.InterfaceError is drv.InterfaceError) _failUnless(self,con.DatabaseError is drv.DatabaseError) _failUnless(self,con.OperationalError is drv.OperationalError) _failUnless(self,con.IntegrityError is drv.IntegrityError) _failUnless(self,con.InternalError is drv.InternalError) _failUnless(self,con.ProgrammingError is drv.ProgrammingError) _failUnless(self,con.NotSupportedError is drv.NotSupportedError) def test_commit(self): con = self._connect() try: # Commit must work, even if it doesn't do anything con.commit() finally: con.close() def test_rollback(self): con = self._connect() # If rollback is defined, it should either work or throw # the documented exception if hasattr(con,'rollback'): try: con.rollback() except self.driver.NotSupportedError: pass def test_cursor(self): con = self._connect() try: cur = con.cursor() finally: con.close() def test_cursor_isolation(self): con = self._connect() try: # Make sure cursors created from the same connection have # the documented transaction isolation level cur1 = con.cursor() cur2 = con.cursor() self.executeDDL1(cur1) cur1.execute("insert into %sbooze values ('Victoria Bitter')" % ( self.table_prefix )) cur2.execute("select name from %sbooze" % self.table_prefix) booze = cur2.fetchall() self.assertEqual(len(booze),1) self.assertEqual(len(booze[0]),1) self.assertEqual(booze[0][0],'Victoria Bitter') finally: con.close() def test_description(self): con = self._connect() try: cur = con.cursor() self.executeDDL1(cur) self.assertEqual(cur.description,None, 'cursor.description should be none after executing a ' 'statement that can return no rows (such as DDL)' ) cur.execute('select name from %sbooze' % self.table_prefix) self.assertEqual(len(cur.description),1, 'cursor.description describes too many columns' ) self.assertEqual(len(cur.description[0]),7, 'cursor.description[x] tuples must have 7 elements' ) self.assertEqual(cur.description[0][0].lower(),'name', 'cursor.description[x][0] must return column name' ) self.assertEqual(cur.description[0][1],self.driver.STRING, 'cursor.description[x][1] must return column type. Got %r' % cur.description[0][1] ) # Make sure self.description gets reset self.executeDDL2(cur) self.assertEqual(cur.description,None, 'cursor.description not being set to None when executing ' 'no-result statements (eg. DDL)' ) finally: con.close() def test_rowcount(self): con = self._connect() try: cur = con.cursor() self.executeDDL1(cur) _failUnless(self,cur.rowcount in (-1,0), # Bug #543885 'cursor.rowcount should be -1 or 0 after executing no-result ' 'statements' ) cur.execute("insert into %sbooze values ('Victoria Bitter')" % ( self.table_prefix )) _failUnless(self,cur.rowcount in (-1,1), 'cursor.rowcount should == number or rows inserted, or ' 'set to -1 after executing an insert statement' ) cur.execute("select name from %sbooze" % self.table_prefix) _failUnless(self,cur.rowcount in (-1,1), 'cursor.rowcount should == number of rows returned, or ' 'set to -1 after executing a select statement' ) self.executeDDL2(cur) self.assertEqual(cur.rowcount,-1, 'cursor.rowcount not being reset to -1 after executing ' 'no-result statements' ) finally: con.close() lower_func = 'lower' def test_callproc(self): con = self._connect() try: cur = con.cursor() if self.lower_func and hasattr(cur,'callproc'): r = cur.callproc(self.lower_func,('FOO',)) self.assertEqual(len(r),1) self.assertEqual(r[0],'FOO') r = cur.fetchall() self.assertEqual(len(r),1,'callproc produced no result set') self.assertEqual(len(r[0]),1, 'callproc produced invalid result set' ) self.assertEqual(r[0][0],'foo', 'callproc produced invalid results' ) finally: con.close() def test_close(self): con = self._connect() try: cur = con.cursor() finally: con.close() # cursor.execute should raise an Error if called after connection # closed self.assertRaises(self.driver.Error,self.executeDDL1,cur) # connection.commit should raise an Error if called after connection' # closed.' self.assertRaises(self.driver.Error,con.commit) # connection.close should raise an Error if called more than once #!!! reasonable persons differ about the usefulness of this test and this feature !!! if TEST_FOR_NON_IDEMPOTENT_CLOSE: self.assertRaises(self.driver.Error, con.close) else: self.skipTest("Non-idempotent close is considered a bad thing by some people.") def test_execute(self): con = self._connect() try: cur = con.cursor() self._paraminsert(cur) finally: con.close() def _paraminsert(self,cur): self.executeDDL2(cur) cur.execute("insert into %sbarflys values ('Victoria Bitter', 'thi%%s :may ca%%(u)se? troub:1e')" % ( self.table_prefix )) _failUnless(self,cur.rowcount in (-1,1)) if self.driver.paramstyle == 'qmark': cur.execute( "insert into %sbarflys values (?, 'thi%%s :may ca%%(u)se? troub:1e')" % self.table_prefix, ("Cooper's",) ) elif self.driver.paramstyle == 'numeric': cur.execute( "insert into %sbarflys values (:1, 'thi%%s :may ca%%(u)se? troub:1e')" % self.table_prefix, ("Cooper's",) ) elif self.driver.paramstyle == 'named': cur.execute( "insert into %sbarflys values (:beer, 'thi%%s :may ca%%(u)se? troub:1e')" % self.table_prefix, {'beer':"Cooper's"} ) elif self.driver.paramstyle == 'format': cur.execute( "insert into %sbarflys values (%%s, 'thi%%s :may ca%%(u)se? troub:1e')" % self.table_prefix, ("Cooper's",) ) elif self.driver.paramstyle == 'pyformat': cur.execute( "insert into %sbarflys values (%%(beer)s, 'thi%%s :may ca%%(u)se? troub:1e')" % self.table_prefix, {'beer':"Cooper's"} ) else: self.fail('Invalid paramstyle') _failUnless(self,cur.rowcount in (-1,1)) cur.execute('select name, drink from %sbarflys' % self.table_prefix) res = cur.fetchall() self.assertEqual(len(res),2,'cursor.fetchall returned too few rows') beers = [res[0][0],res[1][0]] beers.sort() self.assertEqual(beers[0],"Cooper's", 'cursor.fetchall retrieved incorrect data, or data inserted ' 'incorrectly' ) self.assertEqual(beers[1],"Victoria Bitter", 'cursor.fetchall retrieved incorrect data, or data inserted ' 'incorrectly' ) trouble = "thi%s :may ca%(u)se? troub:1e" self.assertEqual(res[0][1], trouble, 'cursor.fetchall retrieved incorrect data, or data inserted ' 'incorrectly. Got=%s, Expected=%s' % (repr(res[0][1]), repr(trouble))) self.assertEqual(res[1][1], trouble, 'cursor.fetchall retrieved incorrect data, or data inserted ' 'incorrectly. Got=%s, Expected=%s' % (repr(res[1][1]), repr(trouble) )) def test_executemany(self): con = self._connect() try: cur = con.cursor() self.executeDDL1(cur) largs = [ ("Cooper's",) , ("Boag's",) ] margs = [ {'beer': "Cooper's"}, {'beer': "Boag's"} ] if self.driver.paramstyle == 'qmark': cur.executemany( 'insert into %sbooze values (?)' % self.table_prefix, largs ) elif self.driver.paramstyle == 'numeric': cur.executemany( 'insert into %sbooze values (:1)' % self.table_prefix, largs ) elif self.driver.paramstyle == 'named': cur.executemany( 'insert into %sbooze values (:beer)' % self.table_prefix, margs ) elif self.driver.paramstyle == 'format': cur.executemany( 'insert into %sbooze values (%%s)' % self.table_prefix, largs ) elif self.driver.paramstyle == 'pyformat': cur.executemany( 'insert into %sbooze values (%%(beer)s)' % ( self.table_prefix ), margs ) else: self.fail('Unknown paramstyle') _failUnless(self,cur.rowcount in (-1,2), 'insert using cursor.executemany set cursor.rowcount to ' 'incorrect value %r' % cur.rowcount ) cur.execute('select name from %sbooze' % self.table_prefix) res = cur.fetchall() self.assertEqual(len(res),2, 'cursor.fetchall retrieved incorrect number of rows' ) beers = [res[0][0],res[1][0]] beers.sort() self.assertEqual(beers[0],"Boag's",'incorrect data "%s" retrieved' % beers[0]) self.assertEqual(beers[1],"Cooper's",'incorrect data retrieved') finally: con.close() def test_fetchone(self): con = self._connect() try: cur = con.cursor() # cursor.fetchone should raise an Error if called before # executing a select-type query self.assertRaises(self.driver.Error,cur.fetchone) # cursor.fetchone should raise an Error if called after # executing a query that cannnot return rows self.executeDDL1(cur) self.assertRaises(self.driver.Error,cur.fetchone) cur.execute('select name from %sbooze' % self.table_prefix) self.assertEqual(cur.fetchone(),None, 'cursor.fetchone should return None if a query retrieves ' 'no rows' ) _failUnless(self,cur.rowcount in (-1,0)) # cursor.fetchone should raise an Error if called after # executing a query that cannnot return rows cur.execute("insert into %sbooze values ('Victoria Bitter')" % ( self.table_prefix )) self.assertRaises(self.driver.Error,cur.fetchone) cur.execute('select name from %sbooze' % self.table_prefix) r = cur.fetchone() self.assertEqual(len(r),1, 'cursor.fetchone should have retrieved a single row' ) self.assertEqual(r[0],'Victoria Bitter', 'cursor.fetchone retrieved incorrect data' ) self.assertEqual(cur.fetchone(),None, 'cursor.fetchone should return None if no more rows available' ) _failUnless(self,cur.rowcount in (-1,1)) finally: con.close() samples = [ 'Carlton Cold', 'Carlton Draft', 'Mountain Goat', 'Redback', 'Victoria Bitter', 'XXXX' ] def _populate(self): ''' Return a list of sql commands to setup the DB for the fetch tests. ''' populate = [ "insert into %sbooze values ('%s')" % (self.table_prefix,s) for s in self.samples ] return populate def test_fetchmany(self): con = self._connect() try: cur = con.cursor() # cursor.fetchmany should raise an Error if called without #issuing a query self.assertRaises(self.driver.Error,cur.fetchmany,4) self.executeDDL1(cur) for sql in self._populate(): cur.execute(sql) cur.execute('select name from %sbooze' % self.table_prefix) r = cur.fetchmany() self.assertEqual(len(r),1, 'cursor.fetchmany retrieved incorrect number of rows, ' 'default of arraysize is one.' ) cur.arraysize=10 r = cur.fetchmany(3) # Should get 3 rows self.assertEqual(len(r),3, 'cursor.fetchmany retrieved incorrect number of rows' ) r = cur.fetchmany(4) # Should get 2 more self.assertEqual(len(r),2, 'cursor.fetchmany retrieved incorrect number of rows' ) r = cur.fetchmany(4) # Should be an empty sequence self.assertEqual(len(r),0, 'cursor.fetchmany should return an empty sequence after ' 'results are exhausted' ) _failUnless(self,cur.rowcount in (-1,6)) # Same as above, using cursor.arraysize cur.arraysize=4 cur.execute('select name from %sbooze' % self.table_prefix) r = cur.fetchmany() # Should get 4 rows self.assertEqual(len(r),4, 'cursor.arraysize not being honoured by fetchmany' ) r = cur.fetchmany() # Should get 2 more self.assertEqual(len(r),2) r = cur.fetchmany() # Should be an empty sequence self.assertEqual(len(r),0) _failUnless(self,cur.rowcount in (-1,6)) cur.arraysize=6 cur.execute('select name from %sbooze' % self.table_prefix) rows = cur.fetchmany() # Should get all rows _failUnless(self,cur.rowcount in (-1,6)) self.assertEqual(len(rows),6) self.assertEqual(len(rows),6) rows = [r[0] for r in rows] rows.sort() # Make sure we get the right data back out for i in range(0,6): self.assertEqual(rows[i],self.samples[i], 'incorrect data retrieved by cursor.fetchmany' ) rows = cur.fetchmany() # Should return an empty list self.assertEqual(len(rows),0, 'cursor.fetchmany should return an empty sequence if ' 'called after the whole result set has been fetched' ) _failUnless(self,cur.rowcount in (-1,6)) self.executeDDL2(cur) cur.execute('select name from %sbarflys' % self.table_prefix) r = cur.fetchmany() # Should get empty sequence self.assertEqual(len(r),0, 'cursor.fetchmany should return an empty sequence if ' 'query retrieved no rows' ) _failUnless(self,cur.rowcount in (-1,0)) finally: con.close() def test_fetchall(self): con = self._connect() try: cur = con.cursor() # cursor.fetchall should raise an Error if called # without executing a query that may return rows (such # as a select) self.assertRaises(self.driver.Error, cur.fetchall) self.executeDDL1(cur) for sql in self._populate(): cur.execute(sql) # cursor.fetchall should raise an Error if called # after executing a a statement that cannot return rows self.assertRaises(self.driver.Error,cur.fetchall) cur.execute('select name from %sbooze' % self.table_prefix) rows = cur.fetchall() _failUnless(self,cur.rowcount in (-1,len(self.samples))) self.assertEqual(len(rows),len(self.samples), 'cursor.fetchall did not retrieve all rows' ) rows = [r[0] for r in rows] rows.sort() for i in range(0,len(self.samples)): self.assertEqual(rows[i],self.samples[i], 'cursor.fetchall retrieved incorrect rows' ) rows = cur.fetchall() self.assertEqual( len(rows),0, 'cursor.fetchall should return an empty list if called ' 'after the whole result set has been fetched' ) _failUnless(self,cur.rowcount in (-1,len(self.samples))) self.executeDDL2(cur) cur.execute('select name from %sbarflys' % self.table_prefix) rows = cur.fetchall() _failUnless(self,cur.rowcount in (-1,0)) self.assertEqual(len(rows),0, 'cursor.fetchall should return an empty list if ' 'a select query returns no rows' ) finally: con.close() def test_mixedfetch(self): con = self._connect() try: cur = con.cursor() self.executeDDL1(cur) for sql in self._populate(): cur.execute(sql) cur.execute('select name from %sbooze' % self.table_prefix) rows1 = cur.fetchone() rows23 = cur.fetchmany(2) rows4 = cur.fetchone() rows56 = cur.fetchall() _failUnless(self,cur.rowcount in (-1,6)) self.assertEqual(len(rows23),2, 'fetchmany returned incorrect number of rows' ) self.assertEqual(len(rows56),2, 'fetchall returned incorrect number of rows' ) rows = [rows1[0]] rows.extend([rows23[0][0],rows23[1][0]]) rows.append(rows4[0]) rows.extend([rows56[0][0],rows56[1][0]]) rows.sort() for i in range(0,len(self.samples)): self.assertEqual(rows[i],self.samples[i], 'incorrect data retrieved or inserted' ) finally: con.close() def help_nextset_setUp(self,cur): ''' Should create a procedure called deleteme that returns two result sets, first the number of rows in booze then "name from booze" ''' raise NotImplementedError('Helper not implemented') #sql=""" # create procedure deleteme as # begin # select count(*) from booze # select name from booze # end #""" #cur.execute(sql) def help_nextset_tearDown(self,cur): 'If cleaning up is needed after nextSetTest' raise NotImplementedError('Helper not implemented') #cur.execute("drop procedure deleteme") def test_nextset(self): con = self._connect() try: cur = con.cursor() if not hasattr(cur,'nextset'): return try: self.executeDDL1(cur) sql=self._populate() for sql in self._populate(): cur.execute(sql) self.help_nextset_setUp(cur) cur.callproc('deleteme') numberofrows=cur.fetchone() assert numberofrows[0]== len(self.samples) assert cur.nextset() names=cur.fetchall() assert len(names) == len(self.samples) s=cur.nextset() assert s == None,'No more return sets, should return None' finally: self.help_nextset_tearDown(cur) finally: con.close() def test_nextset(self): raise NotImplementedError('Drivers need to override this test') def test_arraysize(self): # Not much here - rest of the tests for this are in test_fetchmany con = self._connect() try: cur = con.cursor() _failUnless(self,hasattr(cur,'arraysize'), 'cursor.arraysize must be defined' ) finally: con.close() def test_setinputsizes(self): con = self._connect() try: cur = con.cursor() cur.setinputsizes( (25,) ) self._paraminsert(cur) # Make sure cursor still works finally: con.close() def test_setoutputsize_basic(self): # Basic test is to make sure setoutputsize doesn't blow up con = self._connect() try: cur = con.cursor() cur.setoutputsize(1000) cur.setoutputsize(2000,0) self._paraminsert(cur) # Make sure the cursor still works finally: con.close() def test_setoutputsize(self): # Real test for setoutputsize is driver dependant raise NotImplementedError('Driver needed to override this test') def test_None(self): con = self._connect() try: cur = con.cursor() self.executeDDL1(cur) cur.execute('insert into %sbooze values (NULL)' % self.table_prefix) cur.execute('select name from %sbooze' % self.table_prefix) r = cur.fetchall() self.assertEqual(len(r),1) self.assertEqual(len(r[0]),1) self.assertEqual(r[0][0],None,'NULL value not returned as None') finally: con.close() def test_Date(self): d1 = self.driver.Date(2002,12,25) d2 = self.driver.DateFromTicks(time.mktime((2002,12,25,0,0,0,0,0,0))) # Can we assume this? API doesn't specify, but it seems implied # self.assertEqual(str(d1),str(d2)) def test_Time(self): t1 = self.driver.Time(13,45,30) t2 = self.driver.TimeFromTicks(time.mktime((2001,1,1,13,45,30,0,0,0))) # Can we assume this? API doesn't specify, but it seems implied # self.assertEqual(str(t1),str(t2)) def test_Timestamp(self): t1 = self.driver.Timestamp(2002,12,25,13,45,30) t2 = self.driver.TimestampFromTicks( time.mktime((2002,12,25,13,45,30,0,0,0)) ) # Can we assume this? API doesn't specify, but it seems implied # self.assertEqual(str(t1),str(t2)) def test_Binary(self): b = self.driver.Binary(str2bytes('Something')) b = self.driver.Binary(str2bytes('')) def test_STRING(self): _failUnless(self, hasattr(self.driver,'STRING'), 'module.STRING must be defined' ) def test_BINARY(self): _failUnless(self, hasattr(self.driver,'BINARY'), 'module.BINARY must be defined.' ) def test_NUMBER(self): _failUnless(self, hasattr(self.driver,'NUMBER'), 'module.NUMBER must be defined.' ) def test_DATETIME(self): _failUnless(self, hasattr(self.driver,'DATETIME'), 'module.DATETIME must be defined.' ) def test_ROWID(self): _failUnless(self, hasattr(self.driver,'ROWID'), 'module.ROWID must be defined.' ) PK ѳPo??#adodbapi/test/setuptestframework.pyUT l_Zx`ux #!/usr/bin/python2 # Configure this in order to run the testcases. "setuptestframework.py v 2.6.0.8" import os import sys import tempfile import shutil try: OSErrors = (WindowsError, OSError) except NameError: # not running on Windows OSErrors = OSError def maketemp(): temphome = tempfile.gettempdir() tempdir = os.path.join(temphome, 'adodbapi_test') try: os.mkdir(tempdir) except: pass return tempdir def _cleanup_function(testfolder, mdb_name): try: os.unlink(os.path.join(testfolder, mdb_name)) except: pass # mdb database not present try: shutil.rmtree(testfolder) print(' cleaned up folder', testfolder) except: pass # test package not present def getcleanupfunction(): return _cleanup_function def find_ado_path(): adoName = os.path.normpath(os.getcwd() + '/../../adodbapi.py') adoPackage = os.path.dirname(adoName) return adoPackage # make a new package directory for the test copy of ado def makeadopackage(testfolder): adoName = os.path.normpath(os.getcwd() + '/../adodbapi.py') adoPath = os.path.dirname(adoName) if os.path.exists(adoName): newpackage = os.path.join(testfolder,'adodbapi') try: os.mkdir(newpackage) except OSErrors: print('*Note: temporary adodbapi package already exists: may be two versions running?') for f in os.listdir(adoPath): if f.endswith('.py'): shutil.copy(os.path.join(adoPath, f), newpackage) if sys.version_info >= (3,0): # only when running Py3.n save = sys.stdout sys.stdout = None from lib2to3.main import main # use 2to3 to make test package main("lib2to3.fixes",args=['-n','-w', newpackage]) sys.stdout = save return testfolder else: raise EnvironmentError('Connot find source of adodbapi to test.') def makemdb(testfolder, mdb_name): # following setup code borrowed from pywin32 odbc test suite # kindly contributed by Frank Millman. import os _accessdatasource = os.path.join(testfolder, mdb_name) if os.path.isfile(_accessdatasource): print('using JET database=', _accessdatasource) else: try: from win32com.client.gencache import EnsureDispatch from win32com.client import constants win32 = True except ImportError: #perhaps we are running IronPython win32 = False #iron Python try: from System import Activator, Type except: pass # Create a brand-new database - what is the story with these? dbe = None for suffix in (".36", ".35", ".30"): try: if win32: dbe = EnsureDispatch("DAO.DBEngine" + suffix) else: type= Type.GetTypeFromProgID("DAO.DBEngine" + suffix) dbe = Activator.CreateInstance(type) break except: pass if dbe: print(' ...Creating ACCESS db at '+_accessdatasource) if win32: workspace = dbe.Workspaces(0) newdb = workspace.CreateDatabase(_accessdatasource, constants.dbLangGeneral, constants.dbVersion40) else: newdb = dbe.CreateDatabase(_accessdatasource,';LANGID=0x0409;CP=1252;COUNTRY=0') newdb.Close() else: print(' ...copying test ACCESS db to '+_accessdatasource) mdbName = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'examples', 'test.mdb')) import shutil shutil.copy(mdbName, _accessdatasource) return _accessdatasource if __name__ == "__main__": print('Setting up a Jet database for server to use for remote testing...') temp = maketemp() makemdb(temp, 'server_test.mdb') PK ѳP5#adodbapi/test/adodbapitestconfig.pyUT l_Zx`ux # Configure this to _YOUR_ environment in order to run the testcases. "testADOdbapiConfig.py v 2.6.2.B00" # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # TESTERS: # # # # You will need to make numerous modifications to this file # # to adapt it to your own testing environment. # # # # Skip down to the next "# #" line -- # # -- the things you need to change are below it. # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # import platform import sys import random import is64bit import setuptestframework import tryconnection print("\nPython", sys.version) node = platform.node() try: print('node=%s, is64bit.os()= %s, is64bit.Python()= %s' % (node, is64bit.os(), is64bit.Python())) except: pass if '--help' in sys.argv: print("""Valid command-line switches are: --package - create a temporary test package, run 2to3 if needed. --all - run all possible tests --time - loop over time format tests (including mxdatetime if present) --nojet - do not test against an ACCESS database file --mssql - test against Microsoft SQL server --pg - test against PostgreSQL --mysql - test against MariaDB --remote= - test unsing remote server at= (experimental) """) exit() try: onWindows = bool(sys.getwindowsversion()) # seems to work on all versions of Python except: onWindows = False # create a random name for temporary table names _alphabet = "PYFGCRLAOEUIDHTNSQJKXBMWVZ" # why, yes, I do happen to use a dvorak keyboard tmp = ''.join([random.choice(_alphabet) for x in range(9)]) mdb_name = 'xx_' + tmp + '.mdb' # generate a non-colliding name for the temporary .mdb testfolder = setuptestframework.maketemp() if '--package' in sys.argv: # create a new adodbapi module -- running 2to3 if needed. pth = setuptestframework.makeadopackage(testfolder) else: # use the adodbapi module in which this file appears pth = setuptestframework.find_ado_path() if pth not in sys.path: # look here _first_ to find modules sys.path.insert(1,pth) proxy_host = None for arg in sys.argv: if arg.startswith('--remote='): proxy_host = arg.split("=")[1] import adodbapi.remote as remote break # function to clean up the temporary folder -- calling program must run this function before exit. cleanup = setuptestframework.getcleanupfunction() try: import adodbapi # will (hopefully) be imported using the "pth" discovered above except SyntaxError: print('\n* * * Are you trying to run Python2 code using Python3? Re-run this test using the "--package" switch.') sys.exit(11) try: print(adodbapi.version) # show version except: print('"adodbapi.version" not present or not working.') print(__doc__) verbose = False for a in sys.argv: if a.startswith('--verbose'): arg = True try: arg = int(a.split("=")[1]) except IndexError: pass adodbapi.adodbapi.verbose = arg verbose = arg doAllTests = '--all' in sys.argv doAccessTest = not ('--nojet' in sys.argv) doSqlServerTest = '--mssql' in sys.argv or doAllTests doMySqlTest = '--mysql' in sys.argv or doAllTests doPostgresTest = '--pg' in sys.argv or doAllTests iterateOverTimeTests = ('--time' in sys.argv or doAllTests) and onWindows # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # start your environment setup here v v v SQL_HOST_NODE = 'testsql.2txt.us,1430' try: #If mx extensions are installed, use mxDateTime import mx.DateTime doMxDateTimeTest=True except: doMxDateTimeTest=False #Requires eGenixMXExtensions doTimeTest = True # obsolete python time format if doAccessTest: if proxy_host: # determine the (probably remote) database file folder c = {'macro_find_temp_test_path': ['mdb', mdb_name], 'proxy_host': proxy_host } else: c = {'mdb': setuptestframework.makemdb(testfolder, mdb_name)} # macro definition for keyword "provider" using macro "is64bit" -- see documentation # is64bit will return true for 64 bit versions of Python, so the macro will select the ACE provider # (If running a remote ADO service, this will test the 64-bitedness of the ADO server.) c['macro_is64bit'] = ['provider', "Microsoft.ACE.OLEDB.12.0", # 64 bit provider "Microsoft.Jet.OLEDB.4.0"] # 32 bit provider connStrAccess = "Provider=%(provider)s;Data Source=%(mdb)s" # ;Mode=ReadWrite;Persist Security Info=False;Jet OLEDB:Bypass UserInfo Validation=True" print(' ...Testing ACCESS connection to {} file...'.format(c.get('mdb', 'remote .mdb'))) doAccessTest, connStrAccess, dbAccessconnect = tryconnection.try_connection(verbose, connStrAccess, 10, **c) if doSqlServerTest: c = {'host': SQL_HOST_NODE, # name of computer with SQL Server 'database': "adotest", 'user' : 'adotestuser', # None implies Windows security 'password' : "Sq1234567", # macro definition for keyword "security" using macro "auto_security" 'macro_auto_security' : 'security', 'provider' : 'MSOLEDBSQL; MARS Connection=True' } if proxy_host: c['proxy_host'] = proxy_host connStr = "Provider=%(provider)s; Initial Catalog=%(database)s; Data Source=%(host)s; %(security)s;" print(' ...Testing MS-SQL login to {}...'.format(c['host'])) doSqlServerTest, connStrSQLServer, dbSqlServerconnect = tryconnection.try_connection(verbose, connStr, 30, **c) if doMySqlTest: c = {'host' : "testmysql.2txt.us", 'database' : 'adodbapitest', 'user' : 'adotest', 'password' : '12345678', 'port' : '3330', # note the nonstandard port for obfuscation 'driver' : "MySQL ODBC 5.1 Driver"} # or _driver="MySQL ODBC 3.51 Driver if proxy_host: c['proxy_host'] = proxy_host c['macro_is64bit'] = ['provider', 'Provider=MSDASQL;'] # turn on the 64 bit ODBC adapter only if needed cs = '%(provider)sDriver={%(driver)s};Server=%(host)s;Port=3330;' + \ 'Database=%(database)s;user=%(user)s;password=%(password)s;Option=3;' print(' ...Testing MySql login to {}...'.format(c['host'])) doMySqlTest, connStrMySql, dbMySqlconnect = tryconnection.try_connection(verbose, cs, 5, **c) if doPostgresTest: _computername = "testpg.2txt.us" _databasename='adotest' _username = 'adotestuser' _password = '12345678' kws = {'timeout': 4} kws['macro_is64bit'] = ['prov_drv', 'Provider=MSDASQL;Driver={PostgreSQL Unicode(x64)}', 'Driver=PostgreSQL Unicode'] # get driver from http://www.postgresql.org/ftp/odbc/versions/ # test using positional and keyword arguments (bad example for real code) if proxy_host: kws['proxy_host'] = proxy_host print(' ...Testing PostgreSQL login to {}...'.format(_computername)) doPostgresTest, connStrPostgres, dbPostgresConnect = tryconnection.try_connection(verbose, '%(prov_drv)s;Server=%(host)s;Database=%(database)s;uid=%(user)s;pwd=%(password)s;port=5430;', # note nonstandard port _username, _password, _computername, _databasename, **kws) assert doAccessTest or doSqlServerTest or doMySqlTest or doPostgresTest, 'No database engine found for testing' PK 4PK\D77adodbapi/test/tryconnection.pyUT T*^Zx`ux remote = False # automatic testing of remote access has been removed here def try_connection(verbose, *args, **kwargs): import adodbapi dbconnect = adodbapi.connect try: s = dbconnect(*args, **kwargs) # connect to server if verbose: print('Connected to:', s.connection_string) print('which has tables:', s.get_table_names()) s.close() # thanks, it worked, goodbye except adodbapi.DatabaseError as inst: print(inst.args[0]) # should be the error message print('***Failed getting connection using=',repr(args),repr(kwargs)) return False, (args, kwargs), None print(" (successful)") return True, (args, kwargs, remote), dbconnect def try_operation_with_expected_exception(expected_exception_list, some_function, *args, **kwargs): try: some_function(*args, **kwargs) except expected_exception_list as e: return True, e except: raise # an exception other than the expected occurred return False, 'The expected exception did not occur' PK ѳPgeadodbapi/test/is64bit.pyUT l_Zx`ux """is64bit.Python() --> boolean value of detected Python word size. is64bit.os() --> os build version""" import sys def Python(): if sys.platform == 'cli': #IronPython import System return System.IntPtr.Size == 8 else: try: return sys.maxsize > 2147483647 except AttributeError: return sys.maxint > 2147483647 def os(): import platform pm = platform.machine() if pm != '..' and pm.endswith('64'): # recent Python (not Iron) return True else: import os if 'PROCESSOR_ARCHITEW6432' in os.environ: return True # 32 bit program running on 64 bit Windows try: return os.environ['PROCESSOR_ARCHITECTURE'].endswith('64') # 64 bit Windows 64 bit program except IndexError: pass # not Windows try: return '64' in platform.architecture()[0] # this often works in Linux except: return False # is an older version of Python, assume also an older os (best we can guess) if __name__ == "__main__": print("is64bit.Python() =", Python(), "is64bit.os() =", os()) PK ѳPc=,adodbapi/test/adodbapitest.pyUT l_Zx`ux """ Unit tests version 2.6.1.0 for adodbapi""" """ adodbapi - A python DB API 2.0 interface to Microsoft ADO Copyright (C) 2002 Henrik Ekelund This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Updates by Vernon Cole """ import unittest import sys import datetime import decimal import copy import random import string try: import win32com.client win32 = True except ImportError: win32 = False # run the configuration module. import adodbapitestconfig as config # will set sys.path to find correct version of adodbapi # in our code below, all our switches are from config.whatever import tryconnection import adodbapi import adodbapi.apibase as api try: import adodbapi.ado_consts as ado_consts except ImportError: #we are doing a shortcut import as a module -- so try: import ado_consts except ImportError: from adodbapi import ado_consts def str2bytes(sval): return sval.encode("latin1") long = int def randomstring(length): return ''.join([random.choice(string.ascii_letters) for n in range(32)]) class CommonDBTests(unittest.TestCase): "Self contained super-simple tests in easy syntax, should work on everything between mySQL and Oracle" def setUp(self): self.engine = 'unknown' def getEngine(self): return self.engine def getConnection(self): raise NotImplementedError #"This method must be overriden by a subclass" def getCursor(self): return self.getConnection().cursor() def testConnection(self): crsr=self.getCursor() assert crsr.__class__.__name__ == 'Cursor' def testErrorHandlerInherits(self): if not self.remote: conn=self.getConnection() mycallable=lambda connection,cursor,errorclass,errorvalue: 1 conn.errorhandler=mycallable crsr=conn.cursor() assert crsr.errorhandler==mycallable,"Error handler on crsr should be same as on connection" def testDefaultErrorHandlerConnection(self): if not self.remote: conn=self.getConnection() del conn.messages[:] try: conn.close() conn.commit() #Should not be able to use connection after it is closed except: assert len(conn.messages)==1 assert len(conn.messages[0])==2 assert conn.messages[0][0]==api.ProgrammingError def testOwnErrorHandlerConnection(self): if self.remote: # ToDo: use "skip" return mycallable=lambda connection,cursor,errorclass,errorvalue: 1 #does not raise anything conn=self.getConnection() conn.errorhandler=mycallable conn.close() conn.commit() #Should not be able to use connection after it is closed assert len(conn.messages)==0 conn.errorhandler=None #This should bring back the standard error handler try: conn.close() conn.commit() #Should not be able to use connection after it is closed except: pass #The Standard errorhandler appends error to messages attribute assert len(conn.messages)>0,"Setting errorhandler to none should bring back the standard error handler" def testDefaultErrorHandlerCursor(self): crsr=self.getConnection().cursor() if not self.remote: del crsr.messages[:] try: crsr.execute("SELECT abbtytddrf FROM dasdasd") except: assert len(crsr.messages)==1 assert len(crsr.messages[0])==2 assert crsr.messages[0][0]==api.DatabaseError def testOwnErrorHandlerCursor(self): if self.remote: # ToDo: should be a "skip" return mycallable=lambda connection,cursor,errorclass,errorvalue: 1 #does not raise anything crsr=self.getConnection().cursor() crsr.errorhandler=mycallable crsr.execute("SELECT abbtytddrf FROM dasdasd") assert len(crsr.messages)==0 crsr.errorhandler=None #This should bring back the standard error handler try: crsr.execute("SELECT abbtytddrf FROM dasdasd") except: pass #The Standard errorhandler appends error to messages attribute assert len(crsr.messages)>0,"Setting errorhandler to none should bring back the standard error handler" def testUserDefinedConversions(self): if self.remote: ## Todo: should be a "skip" return try: duplicatingConverter=lambda aStringField: aStringField*2 assert duplicatingConverter('gabba') == 'gabbagabba' self.helpForceDropOnTblTemp() conn=self.getConnection() # the variantConversions attribute should not exist on a normal connection object self.assertRaises(AttributeError, lambda x:conn.variantConversions[x],[2]) if not self.remote: # create a variantConversions attribute on the connection conn.variantConversions = copy.copy(api.variantConversions) crsr=conn.cursor() tabdef = "CREATE TABLE xx_%s (fldData VARCHAR(100) NOT NULL, fld2 VARCHAR(20))" % config.tmp crsr.execute(tabdef) crsr.execute("INSERT INTO xx_%s(fldData,fld2) VALUES('gabba','booga')" % config.tmp) crsr.execute("INSERT INTO xx_%s(fldData,fld2) VALUES('hey','yo')" % config.tmp) # change converter for ALL adoStringTypes columns conn.variantConversions[api.adoStringTypes]=duplicatingConverter crsr.execute("SELECT fldData,fld2 FROM xx_%s ORDER BY fldData" % config.tmp) rows=crsr.fetchall() row = rows[0] self.assertEqual(row[0],'gabbagabba') row = rows[1] self.assertEqual(row[0],'heyhey') self.assertEqual(row[1],'yoyo') upcaseConverter=lambda aStringField: aStringField.upper() assert upcaseConverter('upThis') == 'UPTHIS' # now use a single column converter rows.converters[1] = upcaseConverter # convert second column self.assertEqual(row[0],'heyhey') # first will be unchanged self.assertEqual(row[1],'YO') # second will convert to upper case finally: try: del conn.variantConversions #Restore the default except: pass self.helpRollbackTblTemp() def testUserDefinedConversionForExactNumericTypes(self): # variantConversions is a dictionary of conversion functions # held internally in adodbapi.apibase # # !!! this test intentionally alters the value of what should be constant in the module # !!! no new code should use this example, to is only a test to see that the # !!! deprecated way of doing this still works. (use connection.variantConversions) # if not self.remote and sys.version_info < (3,0): ### Py3 need different test oldconverter = adodbapi.variantConversions[ado_consts.adNumeric] #keep old function to restore later # By default decimal and "numbers" are returned as decimals. # Instead, make numbers return as floats try: adodbapi.variantConversions[ado_consts.adNumeric] = adodbapi.cvtFloat self.helpTestDataType("decimal(18,2)",'NUMBER',3.45,compareAlmostEqual=1) self.helpTestDataType("numeric(18,2)",'NUMBER',3.45,compareAlmostEqual=1) # now return strings adodbapi.variantConversions[ado_consts.adNumeric] = adodbapi.cvtString self.helpTestDataType("numeric(18,2)",'NUMBER','3.45') # now a completly weird user defined convertion adodbapi.variantConversions[ado_consts.adNumeric] = lambda x: '!!This function returns a funny unicode string %s!!'%x self.helpTestDataType("numeric(18,2)",'NUMBER','3.45', allowedReturnValues=['!!This function returns a funny unicode string 3.45!!']) finally: # now reset the converter to its original function adodbapi.variantConversions[ado_consts.adNumeric]=oldconverter #Restore the original convertion function def helpTestDataType(self,sqlDataTypeString, DBAPIDataTypeString, pyData, pyDataInputAlternatives=None, compareAlmostEqual=None, allowedReturnValues=None): self.helpForceDropOnTblTemp() conn=self.getConnection() crsr=conn.cursor() tabdef= """ CREATE TABLE xx_%s ( fldId integer NOT NULL, fldData """ % config.tmp + sqlDataTypeString + ")\n" crsr.execute(tabdef) #Test Null values mapped to None crsr.execute("INSERT INTO xx_%s (fldId) VALUES (1)" % config.tmp) crsr.execute("SELECT fldId,fldData FROM xx_%s" % config.tmp) rs=crsr.fetchone() self.assertEqual(rs[1],None) #Null should be mapped to None assert rs[0]==1 #Test description related descTuple=crsr.description[1] assert descTuple[0] in ['fldData','flddata'], 'was "%s" expected "%s"'%(descTuple[0],'fldData') if DBAPIDataTypeString=='STRING': assert descTuple[1] == api.STRING, 'was "%s" expected "%s"'%(descTuple[1],api.STRING.values) elif DBAPIDataTypeString == 'NUMBER': assert descTuple[1] == api.NUMBER, 'was "%s" expected "%s"'%(descTuple[1],api.NUMBER.values) elif DBAPIDataTypeString == 'BINARY': assert descTuple[1] == api.BINARY, 'was "%s" expected "%s"'%(descTuple[1],api.BINARY.values) elif DBAPIDataTypeString == 'DATETIME': assert descTuple[1] == api.DATETIME, 'was "%s" expected "%s"'%(descTuple[1],api.DATETIME.values) elif DBAPIDataTypeString == 'ROWID': assert descTuple[1] == api.ROWID, 'was "%s" expected "%s"'%(descTuple[1],api.ROWID.values) elif DBAPIDataTypeString == 'UUID': assert descTuple[1] == api.OTHER, 'was "%s" expected "%s"'%(descTuple[1],api.OTHER.values) else: raise NotImplementedError #"DBAPIDataTypeString not provided" #Test data binding inputs=[pyData] if pyDataInputAlternatives: inputs.extend(pyDataInputAlternatives) inputs = set(inputs) # removes redundant string==unicode tests fldId=1 for inParam in inputs: fldId+=1 try: crsr.execute("INSERT INTO xx_%s (fldId,fldData) VALUES (?,?)" % config.tmp, (fldId, inParam)) except: if self.remote: for message in crsr.messages: print(message) else: conn.printADOerrors() raise crsr.execute("SELECT fldData FROM xx_%s WHERE ?=fldID" % config.tmp, [fldId]) rs=crsr.fetchone() if allowedReturnValues: allowedTypes = tuple([type(aRV) for aRV in allowedReturnValues]) assert isinstance(rs[0],allowedTypes), \ 'result type "%s" must be one of %s'%(type(rs[0]),allowedTypes) else: assert isinstance(rs[0] ,type(pyData)), \ 'result type "%s" must be instance of %s'%(type(rs[0]),type(pyData)) if compareAlmostEqual and DBAPIDataTypeString == 'DATETIME': iso1=adodbapi.dateconverter.DateObjectToIsoFormatString(rs[0]) iso2=adodbapi.dateconverter.DateObjectToIsoFormatString(pyData) self.assertEqual(iso1, iso2) elif compareAlmostEqual: s = float(pyData) v = float(rs[0]) assert abs(v-s)/s < 0.00001, \ "Values not almost equal recvd=%s, expected=%f" %(rs[0],s) else: if allowedReturnValues: ok=False self.assertTrue(rs[0] in allowedReturnValues, 'Value "%s" not in %s' % (repr(rs[0]), allowedReturnValues)) else: self.assertEqual(rs[0], pyData, 'Values are not equal recvd="%s", expected="%s"' %(rs[0],pyData)) def testDataTypeFloat(self): self.helpTestDataType("real",'NUMBER',3.45,compareAlmostEqual=True) self.helpTestDataType("float",'NUMBER',1.79e37,compareAlmostEqual=True) def testDataTypeDecmal(self): self.helpTestDataType("decimal(18,2)",'NUMBER',3.45, allowedReturnValues=['3.45','3,45',decimal.Decimal('3.45')]) self.helpTestDataType("numeric(18,2)",'NUMBER',3.45, allowedReturnValues=['3.45','3,45',decimal.Decimal('3.45')]) self.helpTestDataType("decimal(20,2)",'NUMBER',444444444444444444, allowedReturnValues=['444444444444444444.00', '444444444444444444,00', decimal.Decimal('444444444444444444')]) if self.getEngine() == 'MSSQL': self.helpTestDataType("uniqueidentifier",'UUID','{71A4F49E-39F3-42B1-A41E-48FF154996E6}', allowedReturnValues=['{71A4F49E-39F3-42B1-A41E-48FF154996E6}']) def testDataTypeMoney(self): #v2.1 Cole -- use decimal for money if self.getEngine() == 'MySQL': self.helpTestDataType("DECIMAL(20,4)",'NUMBER',decimal.Decimal('-922337203685477.5808')) elif self.getEngine() == 'PostgreSQL': self.helpTestDataType("money",'NUMBER',decimal.Decimal('-922337203685477.5808'), compareAlmostEqual=True, allowedReturnValues=[-922337203685477.5808, decimal.Decimal('-922337203685477.5808')]) else: self.helpTestDataType("smallmoney",'NUMBER',decimal.Decimal('214748.02')) self.helpTestDataType("money",'NUMBER',decimal.Decimal('-922337203685477.5808')) def testDataTypeInt(self): if self.getEngine() != 'PostgreSQL': self.helpTestDataType("tinyint",'NUMBER',115) self.helpTestDataType("smallint",'NUMBER',-32768) if self.getEngine() not in ['ACCESS','PostgreSQL']: self.helpTestDataType("bit",'NUMBER',1) #Does not work correctly with access if self.getEngine() in ['MSSQL','PostgreSQL']: self.helpTestDataType("bigint",'NUMBER',3000000000, allowedReturnValues=[3000000000, int(3000000000)]) self.helpTestDataType("int",'NUMBER',2147483647) def testDataTypeChar(self): for sqlDataType in ("char(6)","nchar(6)"): self.helpTestDataType(sqlDataType,'STRING','spam ',allowedReturnValues=['spam','spam','spam ','spam ']) def testDataTypeVarChar(self): if self.getEngine() == 'MySQL': stringKinds = ["varchar(10)","text"] elif self.getEngine() == 'PostgreSQL': stringKinds = ["varchar(10)","text","character varying"] else: stringKinds = ["varchar(10)","nvarchar(10)","text","ntext"] #,"varchar(max)"] for sqlDataType in stringKinds: self.helpTestDataType(sqlDataType,'STRING','spam',['spam']) def testDataTypeDate(self): if self.getEngine() == 'PostgreSQL': dt = "timestamp" else: dt = "datetime" self.helpTestDataType(dt,'DATETIME',adodbapi.Date(2002,10,28), compareAlmostEqual=True) if self.getEngine() not in ['MySQL','PostgreSQL']: self.helpTestDataType("smalldatetime",'DATETIME',adodbapi.Date(2002,10,28), compareAlmostEqual=True) if tag != 'pythontime' and self.getEngine() not in ['MySQL','PostgreSQL']: # fails when using pythonTime self.helpTestDataType(dt,'DATETIME', adodbapi.Timestamp(2002,10,28,12,15,1), compareAlmostEqual=True) def testDataTypeBinary(self): binfld = str2bytes('\x07\x00\xE2\x40*') arv = [binfld, adodbapi.Binary(binfld), bytes(binfld)] if self.getEngine() == 'PostgreSQL': self.helpTestDataType("bytea",'BINARY',adodbapi.Binary(binfld), allowedReturnValues=arv) else: self.helpTestDataType("binary(5)",'BINARY',adodbapi.Binary(binfld), allowedReturnValues=arv) self.helpTestDataType("varbinary(100)",'BINARY',adodbapi.Binary(binfld), allowedReturnValues=arv) if self.getEngine() != 'MySQL': self.helpTestDataType("image",'BINARY',adodbapi.Binary(binfld), allowedReturnValues=arv) def helpRollbackTblTemp(self): self.helpForceDropOnTblTemp() def helpForceDropOnTblTemp(self): conn=self.getConnection() with conn.cursor() as crsr: try: crsr.execute("DROP TABLE xx_%s" % config.tmp) if not conn.autocommit: conn.commit() except: pass def helpCreateAndPopulateTableTemp(self,crsr): tabdef= """ CREATE TABLE xx_%s ( fldData INTEGER ) """ % config.tmp try: #EAFP crsr.execute(tabdef) except api.DatabaseError: # was not dropped before self.helpForceDropOnTblTemp() # so drop it now crsr.execute(tabdef) for i in range(9): # note: this poor SQL code, but a valid test crsr.execute("INSERT INTO xx_%s (fldData) VALUES (%i)" % (config.tmp, i)) # NOTE: building the test table without using parameter substitution def testFetchAll(self): crsr=self.getCursor() self.helpCreateAndPopulateTableTemp(crsr) crsr.execute("SELECT fldData FROM xx_%s" % config.tmp) rs=crsr.fetchall() assert len(rs)==9 #test slice of rows i = 3 for row in rs[3:-2]: #should have rowid 3..6 assert row[0]==i i+=1 self.helpRollbackTblTemp() def testPreparedStatement(self): crsr=self.getCursor() self.helpCreateAndPopulateTableTemp(crsr) crsr.prepare("SELECT fldData FROM xx_%s" % config.tmp) crsr.execute(crsr.command) # remembes the one that was prepared rs=crsr.fetchall() assert len(rs)==9 assert rs[2][0]==2 self.helpRollbackTblTemp() def testWrongPreparedStatement(self): crsr=self.getCursor() self.helpCreateAndPopulateTableTemp(crsr) crsr.prepare("SELECT * FROM nowhere") crsr.execute("SELECT fldData FROM xx_%s" % config.tmp) # should execute this one, not the prepared one rs=crsr.fetchall() assert len(rs)==9 assert rs[2][0]==2 self.helpRollbackTblTemp() def testIterator(self): crsr=self.getCursor() self.helpCreateAndPopulateTableTemp(crsr) crsr.execute("SELECT fldData FROM xx_%s" % config.tmp) for i,row in enumerate(crsr): # using cursor as an iterator, rather than fetchxxx assert row[0]==i self.helpRollbackTblTemp() def testExecuteMany(self): crsr=self.getCursor() self.helpCreateAndPopulateTableTemp(crsr) seq_of_values = [ (111,) , (222,) ] crsr.executemany("INSERT INTO xx_%s (fldData) VALUES (?)" % config.tmp, seq_of_values) if crsr.rowcount==-1: print(self.getEngine()+" Provider does not support rowcount (on .executemany())") else: self.assertEqual( crsr.rowcount,2) crsr.execute("SELECT fldData FROM xx_%s" % config.tmp) rs=crsr.fetchall() assert len(rs)==11 self.helpRollbackTblTemp() def testRowCount(self): crsr=self.getCursor() self.helpCreateAndPopulateTableTemp(crsr) crsr.execute("SELECT fldData FROM xx_%s" % config.tmp) if crsr.rowcount == -1: #print("provider does not support rowcount on select") pass else: self.assertEqual( crsr.rowcount,9) self.helpRollbackTblTemp() def testRowCountNoRecordset(self): crsr=self.getCursor() self.helpCreateAndPopulateTableTemp(crsr) crsr.execute("DELETE FROM xx_%s WHERE fldData >= 5" % config.tmp) if crsr.rowcount==-1: print(self.getEngine()+" Provider does not support rowcount (on DELETE)") else: self.assertEqual( crsr.rowcount,4) self.helpRollbackTblTemp() def testFetchMany(self): crsr=self.getCursor() self.helpCreateAndPopulateTableTemp(crsr) crsr.execute("SELECT fldData FROM xx_%s" % config.tmp) rs=crsr.fetchmany(3) assert len(rs)==3 rs=crsr.fetchmany(5) assert len(rs)==5 rs=crsr.fetchmany(5) assert len(rs)==1 #Asked for five, but there is only one left self.helpRollbackTblTemp() def testFetchManyWithArraySize(self): crsr=self.getCursor() self.helpCreateAndPopulateTableTemp(crsr) crsr.execute("SELECT fldData FROM xx_%s" % config.tmp) rs=crsr.fetchmany() assert len(rs)==1 #arraysize Defaults to one crsr.arraysize=4 rs=crsr.fetchmany() assert len(rs)==4 rs=crsr.fetchmany() assert len(rs)==4 rs=crsr.fetchmany() assert len(rs)==0 self.helpRollbackTblTemp() def testErrorConnect(self): conn = self.getConnection() kw = {} if 'proxy_host' in conn.kwargs: kw['proxy_host'] = conn.kwargs['proxy_host'] conn.close() self.assertRaises(api.DatabaseError, self.db, 'not a valid connect string', kw) def testRowIterator(self): self.helpForceDropOnTblTemp() conn=self.getConnection() crsr=conn.cursor() tabdef= """ CREATE TABLE xx_%s ( fldId integer NOT NULL, fldTwo integer, fldThree integer, fldFour integer) """ % config.tmp crsr.execute(tabdef) inputs = [(2,3,4),(102,103,104)] fldId=1 for inParam in inputs: fldId+=1 try: crsr.execute("INSERT INTO xx_%s (fldId,fldTwo,fldThree,fldFour) VALUES (?,?,?,?)" % config.tmp, (fldId,inParam[0],inParam[1],inParam[2])) except: if self.remote: for message in crsr.messages: print(message) else: conn.printADOerrors() raise crsr.execute("SELECT fldTwo,fldThree,fldFour FROM xx_%s WHERE ?=fldID" % config.tmp, [fldId]) rec = crsr.fetchone() # check that stepping through an emulated row works for j in range(len(inParam)): assert rec[j] == inParam[j], 'returned value:"%s" != test value:"%s"'%(rec[j],inParam[j]) # check that we can get a complete tuple from a row assert tuple(rec) == inParam, 'returned value:"%s" != test value:"%s"'%(repr(rec),repr(inParam)) # test that slices of rows work slice1 = tuple(rec[:-1]) slice2 = tuple(inParam[0:2]) assert slice1 == slice2, 'returned value:"%s" != test value:"%s"'%(repr(slice1),repr(slice2)) # now test named column retrieval assert rec['fldTwo'] == inParam[0] assert rec.fldThree == inParam[1] assert rec.fldFour == inParam[2] # test array operation # note that the fields vv vv vv are out of order crsr.execute("select fldThree,fldFour,fldTwo from xx_%s" % config.tmp) recs = crsr.fetchall() assert recs[1][0] == 103 assert recs[0][1] == 4 assert recs[1]['fldFour'] == 104 assert recs[0,0] == 3 assert recs[0,'fldTwo'] == 2 assert recs[1,2] == 102 for i in range(1): for j in range(2): assert recs[i][j] == recs[i,j] def testFormatParamstyle(self): self.helpForceDropOnTblTemp() conn=self.getConnection() conn.paramstyle = 'format' #test nonstandard use of paramstyle crsr=conn.cursor() tabdef= """ CREATE TABLE xx_%s ( fldId integer NOT NULL, fldData varchar(10), fldConst varchar(30)) """ % config.tmp crsr.execute(tabdef) inputs = ['one','two','three'] fldId=2 for inParam in inputs: fldId+=1 sql = "INSERT INTO xx_" + \ config.tmp + \ " (fldId,fldConst,fldData) VALUES (%s,'thi%s :may cause? trouble', %s)" try: crsr.execute(sql, (fldId,inParam)) except: if self.remote: for message in crsr.messages: print(message) else: conn.printADOerrors() raise crsr.execute("SELECT fldData, fldConst FROM xx_" + config.tmp + " WHERE %s=fldID", [fldId]) rec = crsr.fetchone() self.assertEqual(rec[0], inParam, 'returned value:"%s" != test value:"%s"' % (rec[0],inParam)) self.assertEqual(rec[1], "thi%s :may cause? trouble") # now try an operation with a "%s" as part of a literal sel = "insert into xx_" + config.tmp + " (fldId,fldData) VALUES (%s,'four%sfive')" params = (20,) crsr.execute(sel,params) #test the .query implementation assert '(?,' in crsr.query, 'expected:"%s" in "%s"'%('(?,',crsr.query) #test the .command attribute assert crsr.command == sel, 'expected:"%s" but found "%s"' % (sel, crsr.command) #test the .parameters attribute if not self.remote: # parameter list will be altered in transit self.assertEqual(crsr.parameters, params) #now make sure the data made it crsr.execute("SELECT fldData FROM xx_%s WHERE fldID=20" % config.tmp) rec = crsr.fetchone() self.assertEqual(rec[0], 'four%sfive') def testNamedParamstyle(self): self.helpForceDropOnTblTemp() conn=self.getConnection() crsr=conn.cursor() crsr.paramstyle = 'named' #test nonstandard use of paramstyle tabdef= """ CREATE TABLE xx_%s ( fldId integer NOT NULL, fldData varchar(10)) """ % config.tmp crsr.execute(tabdef) inputs = ['four','five','six'] fldId=10 for inParam in inputs: fldId+=1 try: crsr.execute("INSERT INTO xx_%s (fldId,fldData) VALUES (:Id,:f_Val)" % config.tmp, {"f_Val":inParam,'Id':fldId}) except: if self.remote: for message in crsr.messages: print(message) else: conn.printADOerrors() raise crsr.execute("SELECT fldData FROM xx_%s WHERE fldID=:Id" % config.tmp, {'Id':fldId}) rec = crsr.fetchone() self.assertEqual(rec[0], inParam, 'returned value:"%s" != test value:"%s"'%(rec[0],inParam)) # now a test with a ":" as part of a literal crsr.execute("insert into xx_%s (fldId,fldData) VALUES (:xyz,'six:five')" % config.tmp,{'xyz':30}) crsr.execute("SELECT fldData FROM xx_%s WHERE fldID=30" % config.tmp) rec = crsr.fetchone() self.assertEqual(rec[0], 'six:five') def testPyformatParamstyle(self): self.helpForceDropOnTblTemp() conn=self.getConnection() crsr=conn.cursor() crsr.paramstyle = 'pyformat' #test nonstandard use of paramstyle tabdef= """ CREATE TABLE xx_%s ( fldId integer NOT NULL, fldData varchar(10)) """ % config.tmp crsr.execute(tabdef) inputs = ['four', 'five', 'six'] fldId=10 for inParam in inputs: fldId+=1 try: crsr.execute("INSERT INTO xx_%s (fldId,fldData) VALUES (%%(Id)s,%%(f_Val)s)" % config.tmp, {"f_Val": inParam, 'Id': fldId}) except: if self.remote: for message in crsr.messages: print(message) else: conn.printADOerrors() raise crsr.execute("SELECT fldData FROM xx_%s WHERE fldID=%%(Id)s" % config.tmp, {'Id':fldId}) rec = crsr.fetchone() self.assertEqual(rec[0], inParam, 'returned value:"%s" != test value:"%s"'%(rec[0],inParam)) # now a test with a "%" as part of a literal crsr.execute("insert into xx_%s (fldId,fldData) VALUES (%%(xyz)s,'six%%five')" % config.tmp,{'xyz': 30}) crsr.execute("SELECT fldData FROM xx_%s WHERE fldID=30" % config.tmp) rec = crsr.fetchone() self.assertEqual(rec[0], 'six%five') def testAutomaticParamstyle(self): self.helpForceDropOnTblTemp() conn=self.getConnection() conn.paramstyle = 'dynamic' #test nonstandard use of paramstyle crsr=conn.cursor() tabdef= """ CREATE TABLE xx_%s ( fldId integer NOT NULL, fldData varchar(10), fldConst varchar(30)) """ % config.tmp crsr.execute(tabdef) inputs = ['one', 'two', 'three'] fldId=2 for inParam in inputs: fldId+=1 try: crsr.execute("INSERT INTO xx_" + config.tmp + \ " (fldId,fldConst,fldData) VALUES (?,'thi%s :may cause? troub:1e', ?)", (fldId,inParam)) except: if self.remote: for message in crsr.messages: print(message) else: conn.printADOerrors() raise trouble = 'thi%s :may cause? troub:1e' crsr.execute("SELECT fldData, fldConst FROM xx_" + config.tmp + " WHERE ?=fldID", [fldId]) rec = crsr.fetchone() self.assertEqual(rec[0], inParam, 'returned value:"%s" != test value:"%s"'%(rec[0],inParam)) self.assertEqual(rec[1], trouble) # inputs = [u'four',u'five',u'six'] fldId=10 for inParam in inputs: fldId+=1 try: crsr.execute("INSERT INTO xx_%s (fldId,fldData) VALUES (:Id,:f_Val)" % config.tmp, {"f_Val":inParam,'Id':fldId}) except: if self.remote: for message in crsr.messages: print(message) else: conn.printADOerrors() raise crsr.execute("SELECT fldData FROM xx_%s WHERE :Id=fldID" % config.tmp, {'Id':fldId}) rec = crsr.fetchone() self.assertEqual(rec[0], inParam, 'returned value:"%s" != test value:"%s"'%(rec[0],inParam)) # now a test with a ":" as part of a literal -- and use a prepared query ppdcmd = "insert into xx_%s (fldId,fldData) VALUES (:xyz,'six:five')" % config.tmp crsr.prepare(ppdcmd) crsr.execute(ppdcmd, {'xyz':30}) crsr.execute("SELECT fldData FROM xx_%s WHERE fldID=30" % config.tmp) rec = crsr.fetchone() self.assertEqual(rec[0], 'six:five') def testRollBack(self): conn = self.getConnection() crsr = conn.cursor() assert not crsr.connection.autocommit, 'Unexpected beginning condition' self.helpCreateAndPopulateTableTemp(crsr) crsr.connection.commit() # commit the first bunch crsr.execute("INSERT INTO xx_%s (fldData) VALUES(100)" % config.tmp) selectSql = "SELECT fldData FROM xx_%s WHERE fldData=100" % config.tmp crsr.execute(selectSql) rs = crsr.fetchall() assert len(rs) == 1 self.conn.rollback() crsr.execute(selectSql) assert crsr.fetchone() == None, 'cursor.fetchone should return None if a query retrieves no rows' crsr.execute('SELECT fldData from xx_%s' % config.tmp) rs = crsr.fetchall() assert len(rs) == 9, 'the original records should still be present' self.helpRollbackTblTemp() def testCommit(self): try: con2 = self.getAnotherConnection() except NotImplementedError: return # should be "SKIP" for ACCESS assert not con2.autocommit, 'default should be manual commit' crsr = con2.cursor() self.helpCreateAndPopulateTableTemp(crsr) crsr.execute("INSERT INTO xx_%s (fldData) VALUES(100)" % config.tmp) con2.commit() selectSql = "SELECT fldData FROM xx_%s WHERE fldData=100" % config.tmp crsr.execute(selectSql) rs = crsr.fetchall() assert len(rs) == 1 crsr.close() con2.close() conn = self.getConnection() crsr = self.getCursor() with conn.cursor() as crsr: crsr.execute(selectSql) rs = crsr.fetchall() assert len(rs) == 1 assert rs[0][0] == 100 self.helpRollbackTblTemp() def testAutoRollback(self): try: con2 = self.getAnotherConnection() except NotImplementedError: return # should be "SKIP" for ACCESS assert not con2.autocommit, 'unexpected beginning condition' crsr = con2.cursor() self.helpCreateAndPopulateTableTemp(crsr) crsr.execute("INSERT INTO xx_%s (fldData) VALUES(100)" % config.tmp) selectSql = "SELECT fldData FROM xx_%s WHERE fldData=100" % config.tmp crsr.execute(selectSql) rs = crsr.fetchall() assert len(rs) == 1 crsr.close() con2.close() crsr = self.getCursor() try: crsr.execute(selectSql) # closing the connection should have forced rollback row = crsr.fetchone() except api.DatabaseError: row = None # if the entire table disappeared the rollback was perfect and the test passed assert row == None, 'cursor.fetchone should return None if a query retrieves no rows. Got %s' % repr(row) self.helpRollbackTblTemp() def testAutoCommit(self): try: ac_conn = self.getAnotherConnection({'autocommit': True}) except NotImplementedError: return # should be "SKIP" for ACCESS crsr = ac_conn.cursor() self.helpCreateAndPopulateTableTemp(crsr) crsr.execute("INSERT INTO xx_%s (fldData) VALUES(100)" % config.tmp) crsr.close() with self.getCursor() as crsr: selectSql = 'SELECT fldData from xx_%s' % config.tmp crsr.execute(selectSql) # closing the connection should _not_ have forced rollback rs = crsr.fetchall() assert len(rs) == 10, 'all records should still be present' ac_conn.close() self.helpRollbackTblTemp() def testSwitchedAutoCommit(self): try: ac_conn = self.getAnotherConnection() except NotImplementedError: return # should be "SKIP" for ACCESS ac_conn.autocommit = True crsr = ac_conn.cursor() self.helpCreateAndPopulateTableTemp(crsr) crsr.execute("INSERT INTO xx_%s (fldData) VALUES(100)" % config.tmp) crsr.close() conn = self.getConnection() ac_conn.close() with self.getCursor() as crsr: selectSql = 'SELECT fldData from xx_%s' % config.tmp crsr.execute(selectSql) # closing the connection should _not_ have forced rollback rs = crsr.fetchall() assert len(rs) == 10, 'all records should still be present' self.helpRollbackTblTemp() def testExtendedTypeHandling(self): class XtendString(str): pass class XtendInt(int): pass class XtendFloat(float): pass xs = XtendString(randomstring(30)) xi = XtendInt(random.randint(-100, 500)) xf = XtendFloat(random.random()) self.helpForceDropOnTblTemp() conn = self.getConnection() crsr = conn.cursor() tabdef = """ CREATE TABLE xx_%s ( s VARCHAR(40) NOT NULL, i INTEGER NOT NULL, f REAL NOT NULL)""" % config.tmp crsr.execute(tabdef) crsr.execute("INSERT INTO xx_%s (s, i, f) VALUES (?, ?, ?)" % config.tmp, (xs, xi, xf)) crsr.close() conn = self.getConnection() with self.getCursor() as crsr: selectSql = 'SELECT s, i, f from xx_%s' % config.tmp crsr.execute(selectSql) # closing the connection should _not_ have forced rollback row = crsr.fetchone() self.assertEqual(row.s, xs) self.assertEqual(row.i, xi) self.assertAlmostEqual(row.f, xf) self.helpRollbackTblTemp() class TestADOwithSQLServer(CommonDBTests): def setUp(self): self.conn = config.dbSqlServerconnect(*config.connStrSQLServer[0], **config.connStrSQLServer[1]) self.conn.timeout = 30 # turn timeout back up self.engine = 'MSSQL' self.db = config.dbSqlServerconnect self.remote = config.connStrSQLServer[2] def tearDown(self): try: self.conn.rollback() except: pass try: self.conn.close() except: pass self.conn=None def getConnection(self): return self.conn def getAnotherConnection(self, addkeys=None): keys = dict(config.connStrSQLServer[1]) if addkeys: keys.update(addkeys) return config.dbSqlServerconnect(*config.connStrSQLServer[0], **keys) def testVariableReturningStoredProcedure(self): crsr=self.conn.cursor() spdef= """ CREATE PROCEDURE sp_DeleteMeOnlyForTesting @theInput varchar(50), @theOtherInput varchar(50), @theOutput varchar(100) OUTPUT AS SET @theOutput=@theInput+@theOtherInput """ try: crsr.execute("DROP PROCEDURE sp_DeleteMeOnlyForTesting") self.conn.commit() except: #Make sure it is empty pass crsr.execute(spdef) retvalues=crsr.callproc('sp_DeleteMeOnlyForTesting',('Dodsworth','Anne',' ')) assert retvalues[0]=='Dodsworth', '%s is not "Dodsworth"'%repr(retvalues[0]) assert retvalues[1]=='Anne','%s is not "Anne"'%repr(retvalues[1]) assert retvalues[2]=='DodsworthAnne','%s is not "DodsworthAnne"'%repr(retvalues[2]) self.conn.rollback() def testMultipleSetReturn(self): crsr=self.getCursor() self.helpCreateAndPopulateTableTemp(crsr) spdef= """ CREATE PROCEDURE sp_DeleteMe_OnlyForTesting AS SELECT fldData FROM xx_%s ORDER BY fldData ASC SELECT fldData From xx_%s where fldData = -9999 SELECT fldData FROM xx_%s ORDER BY fldData DESC """ % (config.tmp, config.tmp, config.tmp) try: crsr.execute("DROP PROCEDURE sp_DeleteMe_OnlyForTesting") self.conn.commit() except: #Make sure it is empty pass crsr.execute(spdef) retvalues=crsr.callproc('sp_DeleteMe_OnlyForTesting') row=crsr.fetchone() self.assertEqual(row[0], 0) assert crsr.nextset() == True, 'Operation should succeed' assert not crsr.fetchall(), 'Should be an empty second set' assert crsr.nextset() == True, 'third set should be present' rowdesc=crsr.fetchall() self.assertEqual(rowdesc[0][0],8) assert crsr.nextset() == None,'No more return sets, should return None' self.helpRollbackTblTemp() def testDatetimeProcedureParameter(self): crsr=self.conn.cursor() spdef= """ CREATE PROCEDURE sp_DeleteMeOnlyForTesting @theInput DATETIME, @theOtherInput varchar(50), @theOutput varchar(100) OUTPUT AS SET @theOutput = CONVERT(CHARACTER(20), @theInput, 0) + @theOtherInput """ try: crsr.execute("DROP PROCEDURE sp_DeleteMeOnlyForTesting") self.conn.commit() except: #Make sure it is empty pass crsr.execute(spdef) result = crsr.callproc('sp_DeleteMeOnlyForTesting', [adodbapi.Timestamp(2014,12,25,0,1,0), 'Beep', ' ' * 30]) assert result[2] == 'Dec 25 2014 12:01AM Beep', 'value was="%s"' % result[2] self.conn.rollback() def testIncorrectStoredProcedureParameter(self): crsr=self.conn.cursor() spdef= """ CREATE PROCEDURE sp_DeleteMeOnlyForTesting @theInput DATETIME, @theOtherInput varchar(50), @theOutput varchar(100) OUTPUT AS SET @theOutput = CONVERT(CHARACTER(20), @theInput) + @theOtherInput """ try: crsr.execute("DROP PROCEDURE sp_DeleteMeOnlyForTesting") self.conn.commit() except: #Make sure it is empty pass crsr.execute(spdef) # calling the sproc with a string for the first parameter where a DateTime is expected result = tryconnection.try_operation_with_expected_exception( (api.DataError,api.DatabaseError), crsr.callproc, ['sp_DeleteMeOnlyForTesting'], {'parameters': ['this is wrong', 'Anne', 'not Alice']} ) if result[0]: # the expected exception was raised assert '@theInput' in str(result[1]) or 'DatabaseError' in str(result), \ 'Identifies the wrong erroneous parameter' else: assert result[0], result[1] # incorrect or no exception self.conn.rollback() class TestADOwithAccessDB(CommonDBTests): def setUp(self): self.conn = config.dbAccessconnect(*config.connStrAccess[0], **config.connStrAccess[1]) self.conn.timeout = 30 # turn timeout back up self.engine = 'ACCESS' self.db = config.dbAccessconnect self.remote = config.connStrAccess[2] def tearDown(self): try: self.conn.rollback() except: pass try: self.conn.close() except: pass self.conn=None def getConnection(self): return self.conn def getAnotherConnection(self, addkeys=None): raise NotImplementedError('Jet cannot use a second connection to the database') def testOkConnect(self): c = self.db(*config.connStrAccess[0], **config.connStrAccess[1]) assert c != None c.close() class TestADOwithMySql(CommonDBTests): def setUp(self): self.conn = config.dbMySqlconnect(*config.connStrMySql[0], **config.connStrMySql[1]) self.conn.timeout = 30 # turn timeout back up self.engine = 'MySQL' self.db = config.dbMySqlconnect self.remote = config.connStrMySql[2] def tearDown(self): try: self.conn.rollback() except: pass try: self.conn.close() except: pass self.conn=None def getConnection(self): return self.conn def getAnotherConnection(self, addkeys=None): keys = dict(config.connStrMySql[1]) if addkeys: keys.update(addkeys) return config.dbMySqlconnect(*config.connStrMySql[0], **keys) def testOkConnect(self): c = self.db(*config.connStrMySql[0], **config.connStrMySql[1]) assert c != None # def testStoredProcedure(self): # crsr=self.conn.cursor() # try: # crsr.execute("DROP PROCEDURE DeleteMeOnlyForTesting") # self.conn.commit() # except: #Make sure it is empty # pass # spdef= """ # DELIMITER $$ # CREATE PROCEDURE DeleteMeOnlyForTesting (onein CHAR(10), twoin CHAR(10), OUT theout CHAR(20)) # DETERMINISTIC # BEGIN # SET theout = onein //|| twoin; # /* (SELECT 'a small string' as result; */ # END $$ # """ # # crsr.execute(spdef) # # retvalues=crsr.callproc('DeleteMeOnlyForTesting',('Dodsworth','Anne',' ')) # print 'return value (mysql)=',repr(crsr.returnValue) ### # assert retvalues[0]=='Dodsworth', '%s is not "Dodsworth"'%repr(retvalues[0]) # assert retvalues[1]=='Anne','%s is not "Anne"'%repr(retvalues[1]) # assert retvalues[2]=='DodsworthAnne','%s is not "DodsworthAnne"'%repr(retvalues[2]) # # try: # crsr.execute("DROP PROCEDURE, DeleteMeOnlyForTesting") # self.conn.commit() # except: #Make sure it is empty # pass class TestADOwithPostgres(CommonDBTests): def setUp(self): self.conn = config.dbPostgresConnect(*config.connStrPostgres[0], **config.connStrPostgres[1]) self.conn.timeout = 30 # turn timeout back up self.engine = 'PostgreSQL' self.db = config.dbPostgresConnect self.remote = config.connStrPostgres[2] def tearDown(self): try: self.conn.rollback() except: pass try: self.conn.close() except: pass self.conn=None def getConnection(self): return self.conn def getAnotherConnection(self, addkeys=None): keys = dict(config.connStrPostgres[1]) if addkeys: keys.update(addkeys) return config.dbPostgresConnect(*config.connStrPostgres[0], **keys) def testOkConnect(self): c = self.db(*config.connStrPostgres[0], **config.connStrPostgres[1]) assert c != None # def testStoredProcedure(self): # crsr=self.conn.cursor() # spdef= """ # CREATE OR REPLACE FUNCTION DeleteMeOnlyForTesting (text, text) # RETURNS text AS $funk$ # BEGIN # RETURN $1 || $2; # END; # $funk$ # LANGUAGE SQL; # """ # # crsr.execute(spdef) # retvalues = crsr.callproc('DeleteMeOnlyForTesting',('Dodsworth','Anne',' ')) # ### print 'return value (pg)=',repr(crsr.returnValue) ### # assert retvalues[0]=='Dodsworth', '%s is not "Dodsworth"'%repr(retvalues[0]) # assert retvalues[1]=='Anne','%s is not "Anne"'%repr(retvalues[1]) # assert retvalues[2]=='Dodsworth Anne','%s is not "Dodsworth Anne"'%repr(retvalues[2]) # self.conn.rollback() # try: # crsr.execute("DROP PROCEDURE, DeleteMeOnlyForTesting") # self.conn.commit() # except: #Make sure it is empty # pass class TimeConverterInterfaceTest(unittest.TestCase): def testIDate(self): assert self.tc.Date(1990,2,2) def testITime(self): assert self.tc.Time(13,2,2) def testITimestamp(self): assert self.tc.Timestamp(1990,2,2,13,2,1) def testIDateObjectFromCOMDate(self): assert self.tc.DateObjectFromCOMDate(37435.7604282) def testICOMDate(self): assert hasattr(self.tc,'COMDate') def testExactDate(self): d=self.tc.Date(1994,11,15) comDate=self.tc.COMDate(d) correct=34653.0 assert comDate == correct,comDate def testExactTimestamp(self): d=self.tc.Timestamp(1994,11,15,12,0,0) comDate=self.tc.COMDate(d) correct=34653.5 self.assertEqual( comDate ,correct) d=self.tc.Timestamp(2003,5,6,14,15,17) comDate=self.tc.COMDate(d) correct=37747.593946759262 self.assertEqual( comDate ,correct) def testIsoFormat(self): d=self.tc.Timestamp(1994,11,15,12,3,10) iso=self.tc.DateObjectToIsoFormatString(d) self.assertEqual(str(iso[:19]) , '1994-11-15 12:03:10') dt=self.tc.Date(2003,5,2) iso=self.tc.DateObjectToIsoFormatString(dt) self.assertEqual(str(iso[:10]), '2003-05-02') if config.doMxDateTimeTest: import mx.DateTime class TestMXDateTimeConverter(TimeConverterInterfaceTest): def setUp(self): self.tc = api.mxDateTimeConverter() def testCOMDate(self): t=mx.DateTime.DateTime(2002,6,28,18,15,2) cmd=self.tc.COMDate(t) assert cmd == t.COMDate() def testDateObjectFromCOMDate(self): cmd=self.tc.DateObjectFromCOMDate(37435.7604282) t=mx.DateTime.DateTime(2002,6,28,18,15,0) t2=mx.DateTime.DateTime(2002,6,28,18,15,2) assert t2>cmd>t def testDate(self): assert mx.DateTime.Date(1980,11,4)==self.tc.Date(1980,11,4) def testTime(self): assert mx.DateTime.Time(13,11,4)==self.tc.Time(13,11,4) def testTimestamp(self): t=mx.DateTime.DateTime(2002,6,28,18,15,1) obj=self.tc.Timestamp(2002,6,28,18,15,1) assert t == obj import time class TestPythonTimeConverter(TimeConverterInterfaceTest): def setUp(self): self.tc=api.pythonTimeConverter() def testCOMDate(self): mk = time.mktime((2002,6,28,18,15,1, 4,31+28+31+30+31+28,-1)) t=time.localtime(mk) # Fri, 28 Jun 2002 18:15:01 +0000 cmd=self.tc.COMDate(t) assert abs(cmd - 37435.7604282) < 1.0/24,"%f more than an hour wrong" % cmd def testDateObjectFromCOMDate(self): cmd=self.tc.DateObjectFromCOMDate(37435.7604282) t1=time.gmtime(time.mktime((2002,6,28,0,14,1, 4,31+28+31+30+31+28,-1))) #there are errors in the implementation of gmtime which we ignore t2=time.gmtime(time.mktime((2002,6,29,12,14,2, 4,31+28+31+30+31+28,-1))) assert t1 https://pypi.python.org/pypi/Pyro4/ try: import Pyro4 except ImportError: print('* * * Sorry, server operation requires Pyro4. Please "pip import" it.') exit(11) import adodbapi import adodbapi.apibase as api import adodbapi.process_connect_string from adodbapi.apibase import ProgrammingError _BaseException = api._BaseException sys.excepthook = Pyro4.util.excepthook Pyro4.config.PREFER_IP_VERSION = 0 # allow system to prefer IPv6 Pyro4.config.COMMTIMEOUT = 40.0 # a bit longer than the default SQL server Gtimeout Pyro4.config.SERIALIZER = 'pickle' try: verbose = int(os.environ['ADODBAPI_VERBOSE']) except: verbose = False if verbose: print(version) # --- define objects to smooth out Python3 <-> Python 2.x differences unicodeType = str #this line will be altered by 2to3.py to '= str' longType = int #this line will be altered by 2to3.py to '= int' StringTypes = str makeByteBuffer = bytes memoryViewType = memoryview # ----------------------------------------------------------- # conversion functions mandated by PEP 249 Binary = makeByteBuffer # override the function from apibase.py def Date(year,month,day): return datetime.date(year,month,day) #dateconverter.Date(year,month,day) def Time(hour,minute,second): return datetime.time(hour, minute, second) # dateconverter.Time(hour,minute,second) def Timestamp(year,month,day,hour,minute,second): return datetime.datetime(year,month,day,hour,minute,second) def DateFromTicks(ticks): return Date(*time.gmtime(ticks)[:3]) def TimeFromTicks(ticks): return Time(*time.gmtime(ticks)[3:6]) def TimestampFromTicks(ticks): return Timestamp(*time.gmtime(ticks)[:6]) def connect(*args, **kwargs): # --> a remote db-api connection object """Create and open a remote db-api database connection object""" # process the argument list the programmer gave us kwargs = adodbapi.process_connect_string.process(args, kwargs) # the "proxy_xxx" keys tell us where to find the PyRO proxy server kwargs.setdefault('pyro_connection', 'PYRO:ado.connection@%(proxy_host)s:%(proxy_port)s') if not 'proxy_port' in kwargs: try: pport = os.environ['PROXY_PORT'] except KeyError: pport = 9099 kwargs['proxy_port'] = pport if not 'proxy_host' in kwargs or not kwargs['proxy_host']: try: phost = os.environ['PROXY_HOST'] except KeyError: phost = '[::1]' # '127.0.0.1' kwargs['proxy_host'] = phost ado_uri = kwargs['pyro_connection'] % kwargs # ask PyRO make us a remote connection object auto_retry = 3 while auto_retry: try: dispatcher = Pyro4.Proxy(ado_uri) if 'comm_timeout' in kwargs: dispatcher._pyroTimeout = float(kwargs['comm_timeout']) uri = dispatcher.make_connection() break except Pyro4.core.errors.PyroError: auto_retry -= 1 if auto_retry: time.sleep(1) else: raise api.DatabaseError ('Cannot create connection to=%s' % ado_uri) conn_uri = fix_uri(uri, kwargs) # get a host connection from the proxy server while auto_retry: try: host_conn = Pyro4.Proxy(conn_uri) # bring up an exclusive Pyro connection for my ADO connection break except Pyro4.core.errors.PyroError: auto_retry -= 1 if auto_retry: time.sleep(1) else: raise api.DatabaseError ('Cannot create ADO connection object using=%s' % conn_uri) if 'comm_timeout' in kwargs: host_conn._pyroTimeout = float(kwargs['comm_timeout']) # make a local clone myConn = Connection() while auto_retry: try: myConn.connect(kwargs, host_conn) # call my connect method -- hand him the host connection break except Pyro4.core.errors.PyroError: auto_retry -= 1 if auto_retry: time.sleep(1) else: raise api.DatabaseError ('Pyro error creating connection to/thru=%s' % repr(kwargs)) except _BaseException as e: raise api.DatabaseError('Error creating remote connection to=%s, e=%s, %s' % (repr(kwargs), repr(e),sys.exc_info()[2])) return myConn def fix_uri(uri, kwargs): """convert a generic pyro uri with '0.0.0.0' into the address we actually called""" u = uri.asString() s = u.split('[::0]') # IPv6 generic address if len(s) == 1: # did not find one s = u.split('0.0.0.0') # IPv4 generic address if len(s) > 1: # found a generic return kwargs['proxy_host'].join(s) # fill in our address for the host return uri # # # # # ----- the Class that defines a connection ----- # # # # # class Connection(object): # include connection attributes required by api definition. Warning = api.Warning Error = api.Error InterfaceError = api.InterfaceError DataError = api.DataError DatabaseError = api.DatabaseError OperationalError = api.OperationalError IntegrityError = api.IntegrityError InternalError = api.InternalError NotSupportedError = api.NotSupportedError ProgrammingError = api.ProgrammingError # set up some class attributes paramstyle = api.paramstyle @property def dbapi(self): # a proposed db-api version 3 extension. "Return a reference to the DBAPI module for this Connection." return api def __init__(self): self.proxy = None self.kwargs = {} self.errorhandler = None self.supportsTransactions = False self.paramstyle = api.paramstyle self.timeout = 30 self.cursors = {} def connect(self, kwargs, connection_maker): self.kwargs = kwargs if verbose: print('%s attempting: "%s"' % (version, repr(kwargs))) self.proxy = connection_maker ##try: ret = self.proxy.connect(kwargs) # ask the server to hook us up ##except ImportError, e: # Pyro is trying to import pywinTypes.comerrer ## self._raiseConnectionError(api.DatabaseError, 'Proxy cannot connect using=%s' % repr(kwargs)) if ret is not True: self._raiseConnectionError(api.OperationalError, 'Proxy returns error message=%s'%repr(ret)) self.supportsTransactions = self.getIndexedValue('supportsTransactions') self.paramstyle = self.getIndexedValue('paramstyle') self.timeout = self.getIndexedValue('timeout') if verbose: print('adodbapi.remote New connection at %X' % id(self)) def _raiseConnectionError(self, errorclass, errorvalue): eh = self.errorhandler if eh is None: eh = api.standardErrorHandler eh(self, None, errorclass, errorvalue) def close(self): """Close the connection now (rather than whenever __del__ is called). The connection will be unusable from this point forward; an Error (or subclass) exception will be raised if any operation is attempted with the connection. The same applies to all cursor objects trying to use the connection. """ for crsr in list(self.cursors.values())[:]: # copy the list, then close each one crsr.close() try: """close the underlying remote Connection object""" self.proxy.close() if verbose: print('adodbapi.remote Closed connection at %X' % id(self)) object.__delattr__(self, 'proxy') # future attempts to use closed cursor will be caught by __getattr__ except Exception: pass def __del__(self): try: self.proxy.close() except: pass def commit(self): """Commit any pending transaction to the database. Note that if the database supports an auto-commit feature, this must be initially off. An interface method may be provided to turn it back on. Database modules that do not support transactions should implement this method with void functionality. """ if not self.supportsTransactions: return result = self.proxy.commit() if result: self._raiseConnectionError(api.OperationalError, 'Error during commit: %s' % result) def _rollback(self): """In case a database does provide transactions this method causes the the database to roll back to the start of any pending transaction. Closing a connection without committing the changes first will cause an implicit rollback to be performed. """ result = self.proxy.rollback() if result: self._raiseConnectionError(api.OperationalError, 'Error during rollback: %s' % result) def __setattr__(self, name, value): if name in ('paramstyle', 'timeout', 'autocommit'): if self.proxy: self.proxy.send_attribute_to_host(name, value) object.__setattr__(self, name, value) # store attribute locally (too) def __getattr__(self, item): if item == 'rollback': # the rollback method only appears if the database supports transactions if self.supportsTransactions: return self._rollback # return the rollback method so the caller can execute it. else: raise self.ProgrammingError ('this data provider does not support Rollback') elif item in ('dbms_name', 'dbms_version', 'connection_string', 'autocommit'): # 'messages' ): return self.getIndexedValue(item) elif item == 'proxy': raise self.ProgrammingError('Attempting to use closed connection') else: raise self.ProgrammingError('No remote access for attribute="%s"' % item) def getIndexedValue(self, index): r = self.proxy.get_attribute_for_remote(index) return r def cursor(self): "Return a new Cursor Object using the connection." myCursor = Cursor(self) return myCursor def _i_am_here(self, crsr): "message from a new cursor proclaiming its existence" self.cursors[crsr.id] = crsr def _i_am_closing(self, crsr): "message from a cursor giving connection a chance to clean up" try: del self.cursors[crsr.id] except: pass def __enter__(self): # Connections are context managers return(self) def __exit__(self, exc_type, exc_val, exc_tb): if exc_type: self._rollback() #automatic rollback on errors else: self.commit() def get_table_names(self): return self.proxy.get_table_names() def fixpickle(x): """pickle barfs on buffer(x) so we pass as array.array(x) then restore to original form for .execute()""" if x is None: return None if isinstance(x, dict): # for 'named' paramstyle user will pass a mapping newargs = {} for arg,val in list(x.items()): if isinstance(val, memoryViewType): newval = array.array('B') newval.fromstring(val) newargs[arg] = newval else: newargs[arg] = val return newargs # if not a mapping, then a sequence newargs = [] for arg in x: if isinstance(arg, memoryViewType): newarg = array.array('B') newarg.fromstring(arg) newargs.append(newarg) else: newargs.append(arg) return newargs class Cursor(object): def __init__(self, connection): self.command = None self.errorhandler = None ## was: connection.errorhandler self.connection = connection self.proxy = self.connection.proxy self.rs = None # the fetchable data for this cursor self.converters = NotImplemented self.id = connection.proxy.build_cursor() connection._i_am_here(self) self.recordset_format = api.RS_REMOTE if verbose: print('%s New cursor at %X on conn %X' % (version, id(self), id(self.connection))) def prepare(self, operation): self.command = operation try: del self.description except AttributeError: pass self.proxy.crsr_prepare(self.id, operation) def __iter__(self): # [2.1 Zamarev] return iter(self.fetchone, None) # [2.1 Zamarev] def __next__(self): r = self.fetchone() if r: return r raise StopIteration def __enter__(self): "Allow database cursors to be used with context managers." return self def __exit__(self, exc_type, exc_val, exc_tb): "Allow database cursors to be used with context managers." self.close() def __getattr__(self, key): if key == 'numberOfColumns': try: return len(self.rs[0]) except: return 0 if key == 'description': try: self.description = self.proxy.crsr_get_description(self.id)[:] return self.description except TypeError: return None if key == 'columnNames': try: r = dict(self.proxy.crsr_get_columnNames(self.id)) # copy the remote columns except TypeError: r = {} self.columnNames = r return r if key == 'remote_cursor': raise api.OperationalError try: return self.proxy.crsr_get_attribute_for_remote(self.id, key) except AttributeError: raise api.InternalError ('Failure getting attribute "%s" from proxy cursor.' % key) def __setattr__(self, key, value): if key == 'arraysize': self.proxy.crsr_set_arraysize(self.id, value) if key == 'paramstyle': if value in api.accepted_paramstyles: self.proxy.crsr_set_paramstyle(self.id, value) else: self._raiseCursorError(api.ProgrammingError, 'invalid paramstyle ="%s"' % value) object.__setattr__(self, key, value) def _raiseCursorError(self, errorclass, errorvalue): eh = self.errorhandler if eh is None: eh = api.standardErrorHandler eh(self.connection, self, errorclass, errorvalue) def execute(self, operation, parameters=None): if self.connection is None: self._raiseCursorError(ProgrammingError, 'Attempted operation on closed cursor') self.command = operation try: del self.description except AttributeError: pass try: del self.columnNames except AttributeError: pass fp = fixpickle(parameters) if verbose > 2: print(('%s executing "%s" with params=%s' % (version, operation, repr(parameters)))) result = self.proxy.crsr_execute(self.id, operation, fp) if result: # an exception was triggered self._raiseCursorError(result[0], result[1]) def executemany(self, operation, seq_of_parameters): if self.connection is None: self._raiseCursorError(ProgrammingError, 'Attempted operation on closed cursor') self.command = operation try: del self.description except AttributeError: pass try: del self.columnNames except AttributeError: pass sq = [fixpickle(x) for x in seq_of_parameters] if verbose > 2: print(('%s executemany "%s" with params=%s' % (version, operation, repr(seq_of_parameters)))) self.proxy.crsr_executemany(self.id, operation, sq) def nextset(self): try: del self.description except AttributeError: pass try: del self.columnNames except AttributeError: pass if verbose > 2: print(('%s nextset' % version)) return self.proxy.crsr_nextset(self.id) def callproc(self, procname, parameters=None): if self.connection is None: self._raiseCursorError(ProgrammingError, 'Attempted operation on closed cursor') self.command = procname try: del self.description except AttributeError: pass try: del self.columnNames except AttributeError: pass fp = fixpickle(parameters) if verbose > 2: print(('%s callproc "%s" with params=%s' % (version, procname, repr(parameters)))) return self.proxy.crsr_callproc(self.id, procname, fp) def fetchone(self): try: f1 = self.proxy.crsr_fetchone(self.id) except _BaseException as e: self._raiseCursorError(api.DatabaseError, e) else: if f1 is None: return None self.rs = [f1] return api.SQLrows(self.rs, 1, self)[0] # new object to hold the results of the fetch def fetchmany(self, size=None): try: self.rs = self.proxy.crsr_fetchmany(self.id, size) if not self.rs: return [] r = api.SQLrows(self.rs, len(self.rs), self) return r except Exception as e: self._raiseCursorError(api.DatabaseError, e) def fetchall(self): try: self.rs = self.proxy.crsr_fetchall(self.id) if not self.rs: return [] return api.SQLrows(self.rs, len(self.rs), self) except Exception as e: self._raiseCursorError(api.DatabaseError, e) def close(self): if self.connection is None: return self.connection._i_am_closing(self) # take me off the connection's cursors list try: self.proxy.crsr_close(self.id) except: pass try: del self.description except: pass try: del self.rs # let go of the recordset except: pass self.connection = None #this will make all future method calls on me throw an exception self.proxy = None if verbose: print('adodbapi.remote Closed cursor at %X' % id(self)) def __del__(self): try: self.close() except: pass def setinputsizes(self,sizes): pass def setoutputsize(self, size, column=None): pass PK ѳPt11adodbapi/__init__.pyUT l_Zx`ux """adodbapi - A python DB API 2.0 (PEP 249) interface to Microsoft ADO Copyright (C) 2002 Henrik Ekelund, version 2.1 by Vernon Cole * http://sourceforge.net/projects/adodbapi """ import sys import time from .apibase import apilevel, threadsafety, paramstyle from .apibase import Warning, Error, InterfaceError, DatabaseError, DataError, OperationalError, IntegrityError from .apibase import InternalError, ProgrammingError, NotSupportedError, FetchFailedError from .apibase import NUMBER, STRING, BINARY, DATETIME, ROWID from .adodbapi import connect, Connection, __version__, dateconverter, Cursor def Binary(aString): """This function constructs an object capable of holding a binary (long) string value. """ return bytes(aString) def Date(year,month,day): "This function constructs an object holding a date value. " return dateconverter.Date(year,month,day) def Time(hour,minute,second): "This function constructs an object holding a time value. " return dateconverter.Time(hour,minute,second) def Timestamp(year,month,day,hour,minute,second): "This function constructs an object holding a time stamp value. " return dateconverter.Timestamp(year,month,day,hour,minute,second) def DateFromTicks(ticks): """This function constructs an object holding a date value from the given ticks value (number of seconds since the epoch; see the documentation of the standard Python time module for details). """ return Date(*time.gmtime(ticks)[:3]) def TimeFromTicks(ticks): """This function constructs an object holding a time value from the given ticks value (number of seconds since the epoch; see the documentation of the standard Python time module for details). """ return Time(*time.gmtime(ticks)[3:6]) def TimestampFromTicks(ticks): """This function constructs an object holding a time stamp value from the given ticks value (number of seconds since the epoch; see the documentation of the standard Python time module for details). """ return Timestamp(*time.gmtime(ticks)[:6]) version = 'adodbapi v' + __version__ PK ѳPSadodbapi/schema_table.pyUT l_Zx`ux """call using an open ADO connection --> list of table names""" from . import adodbapi def names(connection_object): ado = connection_object.adoConn schema = ado.OpenSchema(20) # constant = adSchemaTables tables = [] while not schema.EOF: name = adodbapi.getIndexedValue(schema.Fields,'TABLE_NAME').Value tables.append(name) schema.MoveNext() del schema return tables PK }!_QzEe]]adodbapi/adodbapi.pyUT _Zx`ux """adodbapi - A python DB API 2.0 (PEP 249) interface to Microsoft ADO Copyright (C) 2002 Henrik Ekelund, versions 2.1 and later by Vernon Cole * http://sourceforge.net/projects/pywin32 * https://github.com/mhammond/pywin32 * http://sourceforge.net/projects/adodbapi This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA django adaptations and refactoring by Adam Vandenberg DB-API 2.0 specification: http://www.python.org/dev/peps/pep-0249/ This module source should run correctly in CPython versions 2.7 and later, or IronPython version 2.7 and later, or, after running through 2to3.py, CPython 3.4 or later. """ __version__ = '2.6.2.0' version = 'adodbapi v' + __version__ import sys import copy import decimal import os import weakref from . import process_connect_string from . import ado_consts as adc from . import apibase as api try: verbose = int(os.environ['ADODBAPI_VERBOSE']) except: verbose = False if verbose: print(version) # --- define objects to smooth out IronPython <-> CPython differences onWin32 = False # assume the worst if api.onIronPython: from System import Activator, Type, DBNull, DateTime, Array, Byte from System import Decimal as SystemDecimal from clr import Reference def Dispatch(dispatch): type = Type.GetTypeFromProgID(dispatch) return Activator.CreateInstance(type) def getIndexedValue(obj,index): return obj.Item[index] else: # try pywin32 try: import win32com.client import pythoncom import pywintypes onWin32 = True def Dispatch(dispatch): return win32com.client.Dispatch(dispatch) except ImportError: import warnings warnings.warn("pywin32 package (or IronPython) required for adodbapi.",ImportWarning) def getIndexedValue(obj,index): return obj(index) from collections.abc import Mapping # --- define objects to smooth out Python3000 <-> Python 2.x differences unicodeType = str longType = int StringTypes = str maxint = sys.maxsize # ----------------- The .connect method ----------------- def make_COM_connecter(): try: if onWin32: pythoncom.CoInitialize() #v2.1 Paj c = Dispatch('ADODB.Connection') #connect _after_ CoIninialize v2.1.1 adamvan except: raise api.InterfaceError ("Windows COM Error: Dispatch('ADODB.Connection') failed.") return c def connect(*args, **kwargs): # --> a db-api connection object """Connect to a database. call using: :connection_string -- An ADODB formatted connection string, see: * http://www.connectionstrings.com * http://www.asp101.com/articles/john/connstring/default.asp :timeout -- A command timeout value, in seconds (default 30 seconds) """ co = Connection() # make an empty connection object kwargs = process_connect_string.process(args, kwargs, True) try: # connect to the database, using the connection information in kwargs co.connect(kwargs) return co except (Exception) as e: message = 'Error opening connection to "%s"' % co.connection_string raise api.OperationalError(e, message) # so you could use something like: # myConnection.paramstyle = 'named' # The programmer may also change the default. # For example, if I were using django, I would say: # import adodbapi as Database # Database.adodbapi.paramstyle = 'format' # ------- other module level defaults -------- defaultIsolationLevel = adc.adXactReadCommitted # Set defaultIsolationLevel on module level before creating the connection. # For example: # import adodbapi, ado_consts # adodbapi.adodbapi.defaultIsolationLevel=ado_consts.adXactBrowse" # # Set defaultCursorLocation on module level before creating the connection. # It may be one of the "adUse..." consts. defaultCursorLocation = adc.adUseClient # changed from adUseServer as of v 2.3.0 dateconverter = api.pythonDateTimeConverter() # default def format_parameters(ADOparameters, show_value=False): """Format a collection of ADO Command Parameters. Used by error reporting in _execute_command. """ try: if show_value: desc = [ "Name: %s, Dir.: %s, Type: %s, Size: %s, Value: \"%s\", Precision: %s, NumericScale: %s" %\ (p.Name, adc.directions[p.Direction], adc.adTypeNames.get(p.Type, str(p.Type)+' (unknown type)'), p.Size, p.Value, p.Precision, p.NumericScale) for p in ADOparameters ] else: desc = [ "Name: %s, Dir.: %s, Type: %s, Size: %s, Precision: %s, NumericScale: %s" %\ (p.Name, adc.directions[p.Direction], adc.adTypeNames.get(p.Type, str(p.Type)+' (unknown type)'), p.Size, p.Precision, p.NumericScale) for p in ADOparameters ] return '[' + '\n'.join(desc) + ']' except: return '[]' def _configure_parameter(p, value, adotype, settings_known): """Configure the given ADO Parameter 'p' with the Python 'value'.""" if adotype in api.adoBinaryTypes: p.Size = len(value) p.AppendChunk(value) elif isinstance(value,StringTypes): #v2.1 Jevon L = len(value) if adotype in api.adoStringTypes: #v2.2.1 Cole if settings_known: L = min(L,p.Size) #v2.1 Cole limit data to defined size p.Value = value[:L] #v2.1 Jevon & v2.1 Cole else: p.Value = value # dont limit if db column is numeric if L>0: #v2.1 Cole something does not like p.Size as Zero p.Size = L #v2.1 Jevon elif isinstance(value, decimal.Decimal): if api.onIronPython: s = str(value) p.Value = s p.Size = len(s) else: p.Value = value exponent = value.as_tuple()[2] digit_count = len(value.as_tuple()[1]) p.Precision = digit_count if exponent == 0: p.NumericScale = 0 elif exponent < 0: p.NumericScale = -exponent if p.Precision < p.NumericScale: p.Precision = p.NumericScale else: # exponent > 0: p.NumericScale = 0 p.Precision = digit_count + exponent elif type(value) in dateconverter.types: if settings_known and adotype in api.adoDateTimeTypes: p.Value = dateconverter.COMDate(value) else: #probably a string # provide the date as a string in the format 'YYYY-MM-dd' s = dateconverter.DateObjectToIsoFormatString(value) p.Value = s p.Size = len(s) elif api.onIronPython and isinstance(value, longType): # Iron Python Long s = str(value) # feature workaround for IPy 2.0 p.Value = s elif adotype == adc.adEmpty: # ADO will not let you specify a null column p.Type = adc.adInteger # so we will fake it to be an integer (just to have something) p.Value = None # and pass in a Null *value* # For any other type, set the value and let pythoncom do the right thing. else: p.Value = value # # # # # ----- the Class that defines a connection ----- # # # # # class Connection(object): # include connection attributes as class attributes required by api definition. Warning = api.Warning Error = api.Error InterfaceError = api.InterfaceError DataError = api.DataError DatabaseError = api.DatabaseError OperationalError = api.OperationalError IntegrityError = api.IntegrityError InternalError = api.InternalError NotSupportedError = api.NotSupportedError ProgrammingError = api.ProgrammingError FetchFailedError = api.FetchFailedError # (special for django) # ...class attributes... (can be overridden by instance attributes) verbose = api.verbose @property def dbapi(self): # a proposed db-api version 3 extension. "Return a reference to the DBAPI module for this Connection." return api def __init__(self): # now define the instance attributes self.connector = None self.paramstyle = api.paramstyle self.supportsTransactions = False self.connection_string = '' self.cursors = weakref.WeakValueDictionary() self.dbms_name = '' self.dbms_version = '' self.errorhandler = None # use the standard error handler for this instance self.transaction_level = 0 # 0 == Not in a transaction, at the top level self._autocommit = False def connect(self, kwargs, connection_maker=make_COM_connecter): if verbose > 9: print('kwargs=', repr(kwargs)) try: self.connection_string = kwargs['connection_string'] % kwargs # insert keyword arguments except (Exception) as e: self._raiseConnectionError(KeyError,'Python string format error in connection string->') self.timeout = kwargs.get('timeout', 30) self.mode = kwargs.get("mode", adc.adModeUnknown) self.kwargs = kwargs if verbose: print('%s attempting: "%s"' % (version, self.connection_string)) self.connector = connection_maker() self.connector.ConnectionTimeout = self.timeout self.connector.ConnectionString = self.connection_string self.connector.Mode = self.mode try: self.connector.Open() # Open the ADO connection except api.Error: self._raiseConnectionError(api.DatabaseError, 'ADO error trying to Open=%s' % self.connection_string) try: # Stefan Fuchs; support WINCCOLEDBProvider if getIndexedValue(self.connector.Properties,'Transaction DDL').Value != 0: self.supportsTransactions=True except pywintypes.com_error: pass # Stefan Fuchs self.dbms_name = getIndexedValue(self.connector.Properties,'DBMS Name').Value try: # Stefan Fuchs self.dbms_version = getIndexedValue(self.connector.Properties,'DBMS Version').Value except pywintypes.com_error: pass # Stefan Fuchs self.connector.CursorLocation = defaultCursorLocation #v2.1 Rose if self.supportsTransactions: self.connector.IsolationLevel=defaultIsolationLevel self._autocommit = bool(kwargs.get('autocommit', False)) if not self._autocommit: self.transaction_level = self.connector.BeginTrans() #Disables autocommit & inits transaction_level else: self._autocommit = True if 'paramstyle' in kwargs: self.paramstyle = kwargs['paramstyle'] # let setattr do the error checking self.messages=[] if verbose: print('adodbapi New connection at %X' % id(self)) def _raiseConnectionError(self, errorclass, errorvalue): eh = self.errorhandler if eh is None: eh = api.standardErrorHandler eh(self, None, errorclass, errorvalue) def _closeAdoConnection(self): #all v2.1 Rose """close the underlying ADO Connection object, rolling it back first if it supports transactions.""" if self.connector is None: return if not self._autocommit: if self.transaction_level: try: self.connector.RollbackTrans() except: pass self.connector.Close() if verbose: print('adodbapi Closed connection at %X' % id(self)) def close(self): """Close the connection now (rather than whenever __del__ is called). The connection will be unusable from this point forward; an Error (or subclass) exception will be raised if any operation is attempted with the connection. The same applies to all cursor objects trying to use the connection. """ for crsr in list(self.cursors.values())[:]: # copy the list, then close each one crsr.close(dont_tell_me=True) # close without back-link clearing self.messages = [] try: self._closeAdoConnection() #v2.1 Rose except (Exception) as e: self._raiseConnectionError(sys.exc_info()[0], sys.exc_info()[1]) self.connector = None #v2.4.2.2 fix subtle timeout bug # per M.Hammond: "I expect the benefits of uninitializing are probably fairly small, # so never uninitializing will probably not cause any problems." def commit(self): """Commit any pending transaction to the database. Note that if the database supports an auto-commit feature, this must be initially off. An interface method may be provided to turn it back on. Database modules that do not support transactions should implement this method with void functionality. """ self.messages = [] if not self.supportsTransactions: return try: self.transaction_level = self.connector.CommitTrans() if verbose > 1: print('commit done on connection at %X' % id(self)) if not (self._autocommit or (self.connector.Attributes & adc.adXactAbortRetaining)): #If attributes has adXactCommitRetaining it performs retaining commits that is, #calling CommitTrans automatically starts a new transaction. Not all providers support this. #If not, we will have to start a new transaction by this command: self.transaction_level = self.connector.BeginTrans() except Exception as e: self._raiseConnectionError(api.ProgrammingError, e) def _rollback(self): """In case a database does provide transactions this method causes the the database to roll back to the start of any pending transaction. Closing a connection without committing the changes first will cause an implicit rollback to be performed. If the database does not support the functionality required by the method, the interface should throw an exception in case the method is used. The preferred approach is to not implement the method and thus have Python generate an AttributeError in case the method is requested. This allows the programmer to check for database capabilities using the standard hasattr() function. For some dynamically configured interfaces it may not be appropriate to require dynamically making the method available. These interfaces should then raise a NotSupportedError to indicate the non-ability to perform the roll back when the method is invoked. """ self.messages=[] if self.transaction_level: # trying to roll back with no open transaction causes an error try: self.transaction_level = self.connector.RollbackTrans() if verbose > 1: print('rollback done on connection at %X' % id(self)) if not self._autocommit and not(self.connector.Attributes & adc.adXactAbortRetaining): #If attributes has adXactAbortRetaining it performs retaining aborts that is, #calling RollbackTrans automatically starts a new transaction. Not all providers support this. #If not, we will have to start a new transaction by this command: if not self.transaction_level: # if self.transaction_level == 0 or self.transaction_level is None: self.transaction_level = self.connector.BeginTrans() except Exception as e: self._raiseConnectionError(api.ProgrammingError, e) def __setattr__(self, name, value): if name == 'autocommit': # extension: allow user to turn autocommit on or off if self.supportsTransactions: object.__setattr__(self, '_autocommit', bool(value)) try: self._rollback() # must clear any outstanding transactions except: pass return elif name == 'paramstyle': if value not in api.accepted_paramstyles: self._raiseConnectionError(api.NotSupportedError, 'paramstyle="%s" not in:%s' % (value, repr(api.accepted_paramstyles))) elif name == 'variantConversions': value = copy.copy(value) # make a new copy -- no changes in the default, please object.__setattr__(self, name, value) def __getattr__(self, item): if item == 'rollback': # the rollback method only appears if the database supports transactions if self.supportsTransactions: return self._rollback # return the rollback method so the caller can execute it. else: raise AttributeError ('this data provider does not support Rollback') elif item == 'autocommit': return self._autocommit else: raise AttributeError('no such attribute in ADO connection object as="%s"' % item) def cursor(self): "Return a new Cursor Object using the connection." self.messages = [] c = Cursor(self) return c def _i_am_here(self, crsr): "message from a new cursor proclaiming its existence" oid = id(crsr) self.cursors[oid] = crsr def _i_am_closing(self,crsr): "message from a cursor giving connection a chance to clean up" try: del self.cursors[id(crsr)] except: pass def printADOerrors(self): j=self.connector.Errors.Count if j: print('ADO Errors:(%i)' % j) for e in self.connector.Errors: print('Description: %s' % e.Description) print('Error: %s %s ' % (e.Number, adc.adoErrors.get(e.Number, "unknown"))) if e.Number == adc.ado_error_TIMEOUT: print('Timeout Error: Try using adodbpi.connect(constr,timeout=Nseconds)') print('Source: %s' % e.Source) print('NativeError: %s' % e.NativeError) print('SQL State: %s' % e.SQLState) def _suggest_error_class(self): """Introspect the current ADO Errors and determine an appropriate error class. Error.SQLState is a SQL-defined error condition, per the SQL specification: http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt The 23000 class of errors are integrity errors. Error 40002 is a transactional integrity error. """ if self.connector is not None: for e in self.connector.Errors: state = str(e.SQLState) if state.startswith('23') or state=='40002': return api.IntegrityError return api.DatabaseError def __del__(self): try: self._closeAdoConnection() #v2.1 Rose except: pass self.connector = None def __enter__(self): # Connections are context managers return(self) def __exit__(self, exc_type, exc_val, exc_tb): if exc_type: self._rollback() #automatic rollback on errors else: self.commit() def get_table_names(self): schema = self.connector.OpenSchema(20) # constant = adSchemaTables tables = [] while not schema.EOF: name = getIndexedValue(schema.Fields,'TABLE_NAME').Value tables.append(name) schema.MoveNext() del schema return tables # # # # # ----- the Class that defines a cursor ----- # # # # # class Cursor(object): ## ** api required attributes: ## description... ## This read-only attribute is a sequence of 7-item sequences. ## Each of these sequences contains information describing one result column: ## (name, type_code, display_size, internal_size, precision, scale, null_ok). ## This attribute will be None for operations that do not return rows or if the ## cursor has not had an operation invoked via the executeXXX() method yet. ## The type_code can be interpreted by comparing it to the Type Objects specified in the section below. ## rowcount... ## This read-only attribute specifies the number of rows that the last executeXXX() produced ## (for DQL statements like select) or affected (for DML statements like update or insert). ## The attribute is -1 in case no executeXXX() has been performed on the cursor or ## the rowcount of the last operation is not determinable by the interface.[7] ## arraysize... ## This read/write attribute specifies the number of rows to fetch at a time with fetchmany(). ## It defaults to 1 meaning to fetch a single row at a time. ## Implementations must observe this value with respect to the fetchmany() method, ## but are free to interact with the database a single row at a time. ## It may also be used in the implementation of executemany(). ## ** extension attributes: ## paramstyle... ## allows the programmer to override the connection's default paramstyle ## errorhandler... ## allows the programmer to override the connection's default error handler def __init__(self,connection): self.command = None self._ado_prepared = False self.messages=[] self.connection = connection self.paramstyle = connection.paramstyle # used for overriding the paramstyle self._parameter_names = [] self.recordset_is_remote = False self.rs = None # the ADO recordset for this cursor self.converters = [] # conversion function for each column self.columnNames = {} # names of columns {lowercase name : number,...} self.numberOfColumns = 0 self._description = None self.rowcount = -1 self.errorhandler = connection.errorhandler self.arraysize = 1 connection._i_am_here(self) if verbose: print('%s New cursor at %X on conn %X' % (version, id(self), id(self.connection))) def __iter__(self): # [2.1 Zamarev] return iter(self.fetchone, None) # [2.1 Zamarev] def prepare(self, operation): self.command = operation self._description = None self._ado_prepared = 'setup' def __next__(self): r = self.fetchone() if r: return r raise StopIteration def __enter__(self): "Allow database cursors to be used with context managers." return self def __exit__(self, exc_type, exc_val, exc_tb): "Allow database cursors to be used with context managers." self.close() def _raiseCursorError(self, errorclass, errorvalue): eh = self.errorhandler if eh is None: eh = api.standardErrorHandler eh(self.connection, self, errorclass, errorvalue) def build_column_info(self, recordset): self.converters = [] # convertion function for each column self.columnNames = {} # names of columns {lowercase name : number,...} self._description = None # if EOF and BOF are true at the same time, there are no records in the recordset if (recordset is None) or (recordset.State == adc.adStateClosed): self.rs = None self.numberOfColumns = 0 return self.rs = recordset #v2.1.1 bkline self.recordset_format = api.RS_ARRAY if api.onIronPython else api.RS_WIN_32 self.numberOfColumns = recordset.Fields.Count try: varCon = self.connection.variantConversions except AttributeError: varCon = api.variantConversions for i in range(self.numberOfColumns): f = getIndexedValue(self.rs.Fields, i) try: self.converters.append(varCon[f.Type]) # conversion function for this column except KeyError: self._raiseCursorError(api.InternalError, 'Data column of Unknown ADO type=%s' % f.Type) self.columnNames[f.Name.lower()] = i # columnNames lookup def _makeDescriptionFromRS(self): # Abort if closed or no recordset. if self.rs is None: self._description = None return desc = [] for i in range(self.numberOfColumns): f = getIndexedValue(self.rs.Fields, i) if self.rs.EOF or self.rs.BOF: display_size=None else: display_size=f.ActualSize #TODO: Is this the correct defintion according to the DB API 2 Spec ? null_ok= bool(f.Attributes & adc.adFldMayBeNull) #v2.1 Cole desc.append((f.Name, f.Type, display_size, f.DefinedSize, f.Precision, f.NumericScale, null_ok)) self._description = desc def get_description(self): if not self._description: self._makeDescriptionFromRS() return self._description def __getattr__(self, item): if item == 'description': return self.get_description() object.__getattribute__(self, item) # may get here on Remote attribute calls for existing attributes def format_description(self,d): """Format db_api description tuple for printing.""" if self.description is None: self._makeDescriptionFromRS() if isinstance(d,int): d = self.description[d] desc = "Name= %s, Type= %s, DispSize= %s, IntSize= %s, Precision= %s, Scale= %s NullOK=%s" % \ (d[0], adc.adTypeNames.get(d[1], str(d[1])+' (unknown type)'), d[2], d[3], d[4], d[5], d[6]) return desc def close(self, dont_tell_me=False): """Close the cursor now (rather than whenever __del__ is called). The cursor will be unusable from this point forward; an Error (or subclass) exception will be raised if any operation is attempted with the cursor. """ if self.connection is None: return self.messages = [] if self.rs and self.rs.State != adc.adStateClosed: # rs exists and is open #v2.1 Rose self.rs.Close() #v2.1 Rose self.rs = None # let go of the recordset so ADO will let it be disposed #v2.1 Rose if not dont_tell_me: self.connection._i_am_closing(self) # take me off the connection's cursors list self.connection = None #this will make all future method calls on me throw an exception if verbose: print('adodbapi Closed cursor at %X' % id(self)) def __del__(self): try: self.close() except: pass def _new_command(self, command_type=adc.adCmdText): self.cmd = None self.messages = [] if self.connection is None: self._raiseCursorError(api.InterfaceError, None) return try: self.cmd = Dispatch("ADODB.Command") self.cmd.ActiveConnection = self.connection.connector self.cmd.CommandTimeout = self.connection.timeout self.cmd.CommandType = command_type self.cmd.CommandText = self.commandText self.cmd.Prepared = bool(self._ado_prepared) except: self._raiseCursorError(api.DatabaseError, 'Error creating new ADODB.Command object for "%s"' % repr(self.commandText)) def _execute_command(self): # Stored procedures may have an integer return value self.return_value = None recordset = None count = -1 #default value if verbose: print('Executing command="%s"'%self.commandText) try: # ----- the actual SQL is executed here --- if api.onIronPython: ra = Reference[int]() recordset = self.cmd.Execute(ra) count = ra.Value else: #pywin32 recordset, count = self.cmd.Execute() # ----- ------------------------------- --- except (Exception) as e: _message = "" if hasattr(e, 'args'): _message += str(e.args)+"\n" _message += "Command:\n%s\nParameters:\n%s" % (self.commandText, format_parameters(self.cmd.Parameters, True)) klass = self.connection._suggest_error_class() self._raiseCursorError(klass, _message) try: self.rowcount = recordset.RecordCount except: self.rowcount = count self.build_column_info(recordset) # The ADO documentation hints that obtaining the recordcount may be timeconsuming # "If the Recordset object does not support approximate positioning, this property # may be a significant drain on resources # [ekelund] # Therefore, COM will not return rowcount for server-side cursors. [Cole] # Client-side cursors (the default since v2.8) will force a static # cursor, and rowcount will then be set accurately [Cole] def get_rowcount(self): return self.rowcount def get_returned_parameters(self): """with some providers, returned parameters and the .return_value are not available until after the last recordset has been read. In that case, you must coll nextset() until it returns None, then call this method to get your returned information.""" retLst=[] # store procedures may return altered parameters, including an added "return value" item for p in tuple(self.cmd.Parameters): if verbose > 2: print('Returned=Name: %s, Dir.: %s, Type: %s, Size: %s, Value: "%s",' \ " Precision: %s, NumericScale: %s" % \ (p.Name, adc.directions[p.Direction], adc.adTypeNames.get(p.Type, str(p.Type)+' (unknown type)'), p.Size, p.Value, p.Precision, p.NumericScale)) pyObject = api.convert_to_python(p.Value, api.variantConversions[p.Type]) if p.Direction == adc.adParamReturnValue: self.returnValue = pyObject # also load the undocumented attribute (Vernon's Error!) self.return_value = pyObject else: retLst.append(pyObject) return retLst # return the parameter list to the caller def callproc(self, procname, parameters=None): """Call a stored database procedure with the given name. The sequence of parameters must contain one entry for each argument that the sproc expects. The result of the call is returned as modified copy of the input sequence. Input parameters are left untouched, output and input/output parameters replaced with possibly new values. The sproc may also provide a result set as output, which is available through the standard .fetch*() methods. Extension: A "return_value" property may be set on the cursor if the sproc defines an integer return value. """ self._parameter_names = [] self.commandText = procname self._new_command(command_type=adc.adCmdStoredProc) self._buildADOparameterList(parameters, sproc=True) if verbose > 2: print('Calling Stored Proc with Params=', format_parameters(self.cmd.Parameters, True)) self._execute_command() return self.get_returned_parameters() def _reformat_operation(self, operation, parameters): if self.paramstyle in ('format', 'pyformat'): # convert %s to ? operation, self._parameter_names = api.changeFormatToQmark(operation) elif self.paramstyle == 'named' or (self.paramstyle == 'dynamic' and isinstance(parameters, Mapping)): operation, self._parameter_names = api.changeNamedToQmark(operation) # convert :name to ? return operation def _buildADOparameterList(self, parameters, sproc=False): self.parameters = parameters if parameters is None: parameters = [] # Note: ADO does not preserve the parameter list, even if "Prepared" is True, so we must build every time. parameters_known = False if sproc: # needed only if we are calling a stored procedure try: # attempt to use ADO's parameter list self.cmd.Parameters.Refresh() if verbose > 2: print('ADO detected Params=', format_parameters(self.cmd.Parameters, True)) print('Program Parameters=', repr(parameters)) parameters_known = True except api.Error: if verbose: print('ADO Parameter Refresh failed') pass else: if len(parameters) != self.cmd.Parameters.Count - 1: raise api.ProgrammingError('You must supply %d parameters for this stored procedure' % \ (self.cmd.Parameters.Count - 1)) if sproc or parameters != []: i = 0 if parameters_known: # use ado parameter list if self._parameter_names: # named parameters for i, pm_name in enumerate(self._parameter_names): p = getIndexedValue(self.cmd.Parameters, i) try: _configure_parameter(p, parameters[pm_name], p.Type, parameters_known) except (Exception) as e: _message = 'Error Converting Parameter %s: %s, %s <- %s\n' % \ (p.Name, adc.ado_type_name(p.Type), p.Value, repr(parameters[pm_name])) self._raiseCursorError(api.DataError, _message+'->'+repr(e.args)) else: # regular sequence of parameters for value in parameters: p = getIndexedValue(self.cmd.Parameters,i) if p.Direction == adc.adParamReturnValue: # this is an extra parameter added by ADO i += 1 # skip the extra p=getIndexedValue(self.cmd.Parameters,i) try: _configure_parameter(p, value, p.Type, parameters_known) except Exception as e: _message = 'Error Converting Parameter %s: %s, %s <- %s\n' % \ (p.Name, adc.ado_type_name(p.Type), p.Value, repr(value)) self._raiseCursorError(api.DataError, _message+'->'+repr(e.args)) i += 1 else: #-- build own parameter list if self._parameter_names: # we expect a dictionary of parameters, this is the list of expected names for parm_name in self._parameter_names: elem = parameters[parm_name] adotype = api.pyTypeToADOType(elem) p = self.cmd.CreateParameter(parm_name, adotype, adc.adParamInput) _configure_parameter(p, elem, adotype, parameters_known) try: self.cmd.Parameters.Append(p) except Exception as e: _message = 'Error Building Parameter %s: %s, %s <- %s\n' % \ (p.Name, adc.ado_type_name(p.Type), p.Value, repr(elem)) self._raiseCursorError(api.DataError, _message+'->'+repr(e.args)) else : # expecting the usual sequence of parameters if sproc: p = self.cmd.CreateParameter('@RETURN_VALUE', adc.adInteger, adc.adParamReturnValue) self.cmd.Parameters.Append(p) for elem in parameters: name='p%i' % i adotype = api.pyTypeToADOType(elem) p=self.cmd.CreateParameter(name, adotype, adc.adParamInput) # Name, Type, Direction, Size, Value _configure_parameter(p, elem, adotype, parameters_known) try: self.cmd.Parameters.Append(p) except Exception as e: _message = 'Error Building Parameter %s: %s, %s <- %s\n' % \ (p.Name, adc.ado_type_name(p.Type), p.Value, repr(elem)) self._raiseCursorError(api.DataError, _message+'->'+repr(e.args)) i += 1 if self._ado_prepared == 'setup': self._ado_prepared = True # parameters will be "known" by ADO next loop def execute(self, operation, parameters=None): """Prepare and execute a database operation (query or command). Parameters may be provided as sequence or mapping and will be bound to variables in the operation. Variables are specified in a database-specific notation (see the module's paramstyle attribute for details). [5] A reference to the operation will be retained by the cursor. If the same operation object is passed in again, then the cursor can optimize its behavior. This is most effective for algorithms where the same operation is used, but different parameters are bound to it (many times). For maximum efficiency when reusing an operation, it is best to use the setinputsizes() method to specify the parameter types and sizes ahead of time. It is legal for a parameter to not match the predefined information; the implementation should compensate, possibly with a loss of efficiency. The parameters may also be specified as list of tuples to e.g. insert multiple rows in a single operation, but this kind of usage is depreciated: executemany() should be used instead. Return value is not defined. [5] The module will use the __getitem__ method of the parameters object to map either positions (integers) or names (strings) to parameter values. This allows for both sequences and mappings to be used as input. The term "bound" refers to the process of binding an input value to a database execution buffer. In practical terms, this means that the input value is directly used as a value in the operation. The client should not be required to "escape" the value so that it can be used -- the value should be equal to the actual database value. """ if self.command is not operation or self._ado_prepared == 'setup' or not hasattr(self, 'commandText'): if self.command is not operation: self._ado_prepared = False self.command = operation self._parameter_names = [] self.commandText = operation if (self.paramstyle == 'qmark' or not parameters) \ else self._reformat_operation(operation, parameters) self._new_command() self._buildADOparameterList(parameters) if verbose > 3: print('Params=', format_parameters(self.cmd.Parameters, True)) self._execute_command() def executemany(self, operation, seq_of_parameters): """Prepare a database operation (query or command) and then execute it against all parameter sequences or mappings found in the sequence seq_of_parameters. Return values are not defined. """ self.messages = list() total_recordcount = 0 self.prepare(operation) for params in seq_of_parameters: self.execute(self.command, params) if self.rowcount == -1: total_recordcount = -1 if total_recordcount != -1: total_recordcount += self.rowcount self.rowcount = total_recordcount def _fetch(self, limit=None): """Fetch rows from the current recordset. limit -- Number of rows to fetch, or None (default) to fetch all rows. """ if self.connection is None or self.rs is None: self._raiseCursorError(api.FetchFailedError, 'fetch() on closed connection or empty query set') return if self.rs.State == adc.adStateClosed or self.rs.BOF or self.rs.EOF: return list() if limit: # limit number of rows retrieved ado_results = self.rs.GetRows(limit) else: # get all rows ado_results = self.rs.GetRows() if self.recordset_format == api.RS_ARRAY: # result of GetRows is a two-dimension array length = len(ado_results) // self.numberOfColumns # length of first dimension else: #pywin32 length = len(ado_results[0]) #result of GetRows is tuples in a tuple fetchObject = api.SQLrows(ado_results, length, self) # new object to hold the results of the fetch return fetchObject def fetchone(self): """ Fetch the next row of a query result set, returning a single sequence, or None when no more data is available. An Error (or subclass) exception is raised if the previous call to executeXXX() did not produce any result set or no call was issued yet. """ self.messages = [] result = self._fetch(1) if result: # return record (not list of records) return result[0] return None def fetchmany(self, size=None): """Fetch the next set of rows of a query result, returning a list of tuples. An empty sequence is returned when no more rows are available. The number of rows to fetch per call is specified by the parameter. If it is not given, the cursor's arraysize determines the number of rows to be fetched. The method should try to fetch as many rows as indicated by the size parameter. If this is not possible due to the specified number of rows not being available, fewer rows may be returned. An Error (or subclass) exception is raised if the previous call to executeXXX() did not produce any result set or no call was issued yet. Note there are performance considerations involved with the size parameter. For optimal performance, it is usually best to use the arraysize attribute. If the size parameter is used, then it is best for it to retain the same value from one fetchmany() call to the next. """ self.messages=[] if size is None: size = self.arraysize return self._fetch(size) def fetchall(self): """Fetch all (remaining) rows of a query result, returning them as a sequence of sequences (e.g. a list of tuples). Note that the cursor's arraysize attribute can affect the performance of this operation. An Error (or subclass) exception is raised if the previous call to executeXXX() did not produce any result set or no call was issued yet. """ self.messages=[] return self._fetch() def nextset(self): """Skip to the next available recordset, discarding any remaining rows from the current recordset. If there are no more sets, the method returns None. Otherwise, it returns a true value and subsequent calls to the fetch methods will return rows from the next result set. An Error (or subclass) exception is raised if the previous call to executeXXX() did not produce any result set or no call was issued yet. """ self.messages=[] if self.connection is None or self.rs is None: self._raiseCursorError(api.OperationalError, ('nextset() on closed connection or empty query set')) return None if api.onIronPython: try: recordset = self.rs.NextRecordset() except TypeError: recordset = None except api.Error as exc: self._raiseCursorError(api.NotSupportedError, exc.args) else: #pywin32 try: #[begin 2.1 ekelund] rsTuple=self.rs.NextRecordset() # except pywintypes.com_error as exc: # return appropriate error self._raiseCursorError(api.NotSupportedError, exc.args)#[end 2.1 ekelund] recordset = rsTuple[0] if recordset is None: return None self.build_column_info(recordset) return True def setinputsizes(self,sizes): pass def setoutputsize(self, size, column=None): pass def _last_query(self): # let the programmer see what query we actually used try: if self.parameters == None: ret = self.commandText else: ret = "%s,parameters=%s" % (self.commandText,repr(self.parameters)) except: ret = None return ret query = property(_last_query, None, None, "returns the last query executed") if __name__ == '__main__': raise api.ProgrammingError(version + ' cannot be run as a main program.') PK ѳP\,~ adodbapi/setup.pyUT l_Zx`ux """adodbapi -- a pure Python PEP 249 DB-API package using Microsoft ADO Adodbapi can be run on CPython version 2.7, or IronPython version 2.6 and later, or Python 3.5 and later (after filtering through 2to3.py) """ CLASSIFIERS = """\ Development Status :: 5 - Production/Stable Intended Audience :: Developers License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL) Operating System :: Microsoft :: Windows Operating System :: POSIX :: Linux Programming Language :: Python Programming Language :: Python :: 3 Programming Language :: SQL Topic :: Software Development Topic :: Software Development :: Libraries :: Python Modules Topic :: Database """ NAME = 'adodbapi' MAINTAINER = "Vernon Cole" MAINTAINER_EMAIL = "vernondcole@gmail.com" DESCRIPTION = """A pure Python package implementing PEP 249 DB-API using Microsoft ADO.""" URL = "http://sourceforge.net/projects/adodbapi" LICENSE = 'LGPL' CLASSIFIERS = filter(None, CLASSIFIERS.split('\n')) AUTHOR = "Henrik Ekelund, Vernon Cole, et.al." AUTHOR_EMAIL = "vernondcole@gmail.com" PLATFORMS = ["Windows","Linux"] VERSION = None # in case searching for version fails a = open('adodbapi.py') # find the version string in the source code for line in a: if '__version__' in line: VERSION = line.split("'")[1] print('adodbapi version="%s"' % VERSION) break a.close() ##DOWNLOAD_URL = "http://sourceforge.net/projects/adodbapi/files/adodbapi/" + VERSION.rsplit('.', 1)[0] + '/adodbapi-' + VERSION + '.zip' import sys def setup_package(): from distutils.core import setup if sys.version_info >= (3, 0): try: from distutils.command.build_py import build_py_2to3 as build_py ## # exclude fixers that break already compatible code ## from lib2to3.refactor import get_fixers_from_package ## fixers = get_fixers_from_package('lib2to3.fixes') ## for skip_fixer in ['import']: ## fixers.remove('lib2to3.fixes.fix_' + skip_fixer) ## build_py.fixer_names = fixers except ImportError: raise ImportError("build_py_2to3 not found in distutils - it is required for Python 3.x") else: from distutils.command.build_py import build_py setup( cmdclass = {'build_py': build_py}, name=NAME, maintainer=MAINTAINER, maintainer_email=MAINTAINER_EMAIL, description=DESCRIPTION, url=URL, keywords='database ado odbc dbapi db-api Microsoft SQL', ## download_url=DOWNLOAD_URL, long_description=open('README.txt').read(), license=LICENSE, classifiers=CLASSIFIERS, author=AUTHOR, author_email=AUTHOR_EMAIL, platforms=PLATFORMS, version=VERSION, package_dir = {'adodbapi':''}, packages=['adodbapi'] ) return if __name__ == '__main__': setup_package() PK {Radodbapi/examples/UT Zx`Zx`ux PK P۹Anffadodbapi/examples/xls_read.pyUT 4)^Zx`ux import sys import adodbapi try: import adodbapi.is64bit as is64bit is64 = is64bit.Python() except ImportError: is64 = False if is64: driver = "Microsoft.ACE.OLEDB.12.0" else: driver = "Microsoft.Jet.OLEDB.4.0" extended = 'Extended Properties="Excel 8.0;HDR=Yes;IMEX=1;"' try: # first command line argument will be xls file name -- default to the one written by xls_write.py filename = sys.argv[1] except IndexError: filename = 'xx.xls' constr = "Provider=%s;Data Source=%s;%s" % (driver, filename, extended) conn = adodbapi.connect(constr) try: # second command line argument will be worksheet name -- default to first worksheet sheet = sys.argv[2] except IndexError: # use ADO feature to get the name of the first worksheet sheet = conn.get_table_names()[0] print('Shreadsheet=%s Worksheet=%s' % (filename, sheet)) print('------------------------------------------------------------') crsr = conn.cursor() sql = "SELECT * from [%s]" % sheet crsr.execute(sql) for row in crsr.fetchmany(10): print(repr(row)) crsr.close() conn.close() PK ѳPVeeadodbapi/examples/xls_write.pyUT l_Zx`ux import adodbapi import datetime try: import adodbapi.is64bit as is64bit is64 = is64bit.Python() except ImportError: is64 = False # in case the user has an old version of adodbapi if is64: driver = "Microsoft.ACE.OLEDB.12.0" else: driver = "Microsoft.Jet.OLEDB.4.0" filename = 'xx.xls' # file will be created if it does not exist extended = 'Extended Properties="Excel 8.0;Readonly=False;"' constr = "Provider=%s;Data Source=%s;%s" % (driver, filename, extended) conn = adodbapi.connect(constr) with conn: # will auto commit if no errors with conn.cursor() as crsr: try: crsr.execute('drop table SheetOne') except: pass # just is case there is one already there # create the sheet and the header row and set the types for the columns crsr.execute('create table SheetOne (Name varchar, Rank varchar, SrvcNum integer, Weight float, Birth date)') sql = "INSERT INTO SheetOne (name, rank , srvcnum, weight, birth) values (?,?,?,?,?)" data = ('Mike Murphy', 'SSG', 123456789, 167.8, datetime.date(1922,12,27)) crsr.execute(sql, data) # write the first row of data crsr.execute(sql, ['John Jones', 'Pvt', 987654321, 140.0, datetime.date(1921,7,4)]) # another row of data conn.close() print('Created spreadsheet=%s worksheet=%s' % (filename, 'SheetOne')) PK P?  #adodbapi/examples/db_table_names.pyUT 4)^Zx`ux """ db_table_names.py -- a simple demo for ADO database table listing.""" import sys import adodbapi try: databasename = sys.argv[1] except IndexError: databasename = "test.mdb" provider = ['prv', "Microsoft.ACE.OLEDB.12.0", "Microsoft.Jet.OLEDB.4.0"] constr = "Provider=%(prv)s;Data Source=%(db)s" #create the connection con = adodbapi.connect(constr, db=databasename, macro_is64bit=provider) print('Table names in= %s' % databasename) for table in con.get_table_names(): print(table) PK ѳP'adodbapi/examples/db_print.pyUT l_Zx`ux """ db_print.py -- a simple demo for ADO database reads.""" import sys import adodbapi.ado_consts as adc cmd_args = ('filename', 'table_name') if 'help' in sys.argv: print('possible settings keywords are:',cmd_args) sys.exit() kw_args = {} # pick up filename and proxy address from command line (optionally) for arg in sys.argv: s = arg.split("=") if len(s) > 1: if s[0] in cmd_args: kw_args[s[0]] = s[1] kw_args.setdefault('filename', "test.mdb") # assumes server is running from examples folder kw_args.setdefault('table_name', 'Products') # the name of the demo table # the server needs to select the provider based on his Python installation provider_switch = ['provider', 'Microsoft.ACE.OLEDB.12.0', "Microsoft.Jet.OLEDB.4.0"] # ------------------------ START HERE ------------------------------------- #create the connection constr = "Provider=%(provider)s;Data Source=%(filename)s" import adodbapi as db con = db.connect(constr, kw_args, macro_is64bit=provider_switch) if kw_args['table_name'] == '?': print('The tables in your database are:') for name in con.get_table_names(): print(name) else: #make a cursor on the connection with con.cursor() as c: #run an SQL statement on the cursor sql = 'select * from %s' % kw_args['table_name'] print('performing query="%s"' % sql) c.execute(sql) #check the results print('result rowcount shows as= %d. (Note: -1 means "not known")' \ % (c.rowcount,)) print('') print('result data description is:') print(' NAME Type DispSize IntrnlSz Prec Scale Null?') for d in c.description: print(('%16s %-12s %8s %8d %4d %5d %s') % \ (d[0], adc.adTypeNames[d[1]], d[2], d[3], d[4],d[5], bool(d[6]))) print('') print('str() of first five records are...') #get the results db = c.fetchmany(5) #print them for rec in db: print(rec) print('') print('repr() of next row is...') print(repr(c.fetchone())) print('') con.close() PK ѳPaB\adodbapi/is64bit.pyUT l_Zx`ux """is64bit.Python() --> boolean value of detected Python word size. is64bit.os() --> os build version""" import sys def Python(): if sys.platform == 'cli': #IronPython import System return System.IntPtr.Size == 8 else: try: return sys.maxsize > 2147483647 except AttributeError: return sys.maxint > 2147483647 def os(): import platform pm = platform.machine() if pm != '..' and pm.endswith('64'): # recent Python (not Iron) return True else: import os if 'PROCESSOR_ARCHITEW6432' in os.environ: return True # 32 bit program running on 64 bit Windows try: return os.environ['PROCESSOR_ARCHITECTURE'].endswith('64') # 64 bit Windows 64 bit program except (IndexError, KeyError): pass # not Windows try: return '64' in platform.architecture()[0] # this often works in Linux except: return False # is an older version of Python, assume also an older os (best we can guess) if __name__ == "__main__": print("is64bit.Python() =", Python(), "is64bit.os() =", os()) PK 'P8w)w)adodbapi/ado_consts.pyUT Z(^Zx`ux # ADO enumerated constants documented on MSDN: # http://msdn.microsoft.com/en-us/library/ms678353(VS.85).aspx # IsolationLevelEnum adXactUnspecified = -1 adXactBrowse = 0x100 adXactChaos = 0x10 adXactCursorStability = 0x1000 adXactIsolated = 0x100000 adXactReadCommitted = 0x1000 adXactReadUncommitted = 0x100 adXactRepeatableRead = 0x10000 adXactSerializable = 0x100000 # CursorLocationEnum adUseClient = 3 adUseServer = 2 # CursorTypeEnum adOpenDynamic = 2 adOpenForwardOnly = 0 adOpenKeyset = 1 adOpenStatic = 3 adOpenUnspecified = -1 # CommandTypeEnum adCmdText = 1 adCmdStoredProc = 4 adSchemaTables = 20 # ParameterDirectionEnum adParamInput = 1 adParamInputOutput = 3 adParamOutput = 2 adParamReturnValue = 4 adParamUnknown = 0 directions = { 0: 'Unknown', 1: 'Input', 2: 'Output', 3: 'InputOutput', 4: 'Return', } def ado_direction_name(ado_dir): try: return 'adParam' + directions[ado_dir] except: return 'unknown direction ('+str(ado_dir)+')' # ObjectStateEnum adStateClosed = 0 adStateOpen = 1 adStateConnecting = 2 adStateExecuting = 4 adStateFetching = 8 # FieldAttributeEnum adFldMayBeNull = 0x40 # ConnectModeEnum adModeUnknown = 0 adModeRead = 1 adModeWrite = 2 adModeReadWrite = 3 adModeShareDenyRead = 4 adModeShareDenyWrite = 8 adModeShareExclusive = 12 adModeShareDenyNone = 16 adModeRecursive = 0x400000 # XactAttributeEnum adXactCommitRetaining = 131072 adXactAbortRetaining = 262144 ado_error_TIMEOUT = -2147217871 # DataTypeEnum - ADO Data types documented at: # http://msdn2.microsoft.com/en-us/library/ms675318.aspx adArray = 0x2000 adEmpty = 0x0 adBSTR = 0x8 adBigInt = 0x14 adBinary = 0x80 adBoolean = 0xb adChapter = 0x88 adChar = 0x81 adCurrency = 0x6 adDBDate = 0x85 adDBTime = 0x86 adDBTimeStamp = 0x87 adDate = 0x7 adDecimal = 0xe adDouble = 0x5 adError = 0xa adFileTime = 0x40 adGUID = 0x48 adIDispatch = 0x9 adIUnknown = 0xd adInteger = 0x3 adLongVarBinary = 0xcd adLongVarChar = 0xc9 adLongVarWChar = 0xcb adNumeric = 0x83 adPropVariant = 0x8a adSingle = 0x4 adSmallInt = 0x2 adTinyInt = 0x10 adUnsignedBigInt = 0x15 adUnsignedInt = 0x13 adUnsignedSmallInt = 0x12 adUnsignedTinyInt = 0x11 adUserDefined = 0x84 adVarBinary = 0xCC adVarChar = 0xC8 adVarNumeric = 0x8B adVarWChar = 0xCA adVariant = 0xC adWChar = 0x82 # Additional constants used by introspection but not ADO itself AUTO_FIELD_MARKER = -1000 adTypeNames = { adBSTR: 'adBSTR', adBigInt: 'adBigInt', adBinary: 'adBinary', adBoolean: 'adBoolean', adChapter: 'adChapter', adChar: 'adChar', adCurrency: 'adCurrency', adDBDate: 'adDBDate', adDBTime: 'adDBTime', adDBTimeStamp: 'adDBTimeStamp', adDate: 'adDate', adDecimal: 'adDecimal', adDouble: 'adDouble', adEmpty: 'adEmpty', adError: 'adError', adFileTime: 'adFileTime', adGUID: 'adGUID', adIDispatch: 'adIDispatch', adIUnknown: 'adIUnknown', adInteger: 'adInteger', adLongVarBinary: 'adLongVarBinary', adLongVarChar: 'adLongVarChar', adLongVarWChar: 'adLongVarWChar', adNumeric: 'adNumeric', adPropVariant: 'adPropVariant', adSingle: 'adSingle', adSmallInt: 'adSmallInt', adTinyInt: 'adTinyInt', adUnsignedBigInt: 'adUnsignedBigInt', adUnsignedInt: 'adUnsignedInt', adUnsignedSmallInt: 'adUnsignedSmallInt', adUnsignedTinyInt: 'adUnsignedTinyInt', adUserDefined: 'adUserDefined', adVarBinary: 'adVarBinary', adVarChar: 'adVarChar', adVarNumeric: 'adVarNumeric', adVarWChar: 'adVarWChar', adVariant: 'adVariant', adWChar: 'adWChar', } def ado_type_name(ado_type): return adTypeNames.get(ado_type, 'unknown type ('+str(ado_type)+')') # here in decimal, sorted by value #adEmpty 0 Specifies no value (DBTYPE_EMPTY). #adSmallInt 2 Indicates a two-byte signed integer (DBTYPE_I2). #adInteger 3 Indicates a four-byte signed integer (DBTYPE_I4). #adSingle 4 Indicates a single-precision floating-point value (DBTYPE_R4). #adDouble 5 Indicates a double-precision floating-point value (DBTYPE_R8). #adCurrency 6 Indicates a currency value (DBTYPE_CY). Currency is a fixed-point number # with four digits to the right of the decimal point. It is stored in an eight-byte signed integer scaled by 10,000. #adDate 7 Indicates a date value (DBTYPE_DATE). A date is stored as a double, the whole part of which is # the number of days since December 30, 1899, and the fractional part of which is the fraction of a day. #adBSTR 8 Indicates a null-terminated character string (Unicode) (DBTYPE_BSTR). #adIDispatch 9 Indicates a pointer to an IDispatch interface on a COM object (DBTYPE_IDISPATCH). #adError 10 Indicates a 32-bit error code (DBTYPE_ERROR). #adBoolean 11 Indicates a boolean value (DBTYPE_BOOL). #adVariant 12 Indicates an Automation Variant (DBTYPE_VARIANT). #adIUnknown 13 Indicates a pointer to an IUnknown interface on a COM object (DBTYPE_IUNKNOWN). #adDecimal 14 Indicates an exact numeric value with a fixed precision and scale (DBTYPE_DECIMAL). #adTinyInt 16 Indicates a one-byte signed integer (DBTYPE_I1). #adUnsignedTinyInt 17 Indicates a one-byte unsigned integer (DBTYPE_UI1). #adUnsignedSmallInt 18 Indicates a two-byte unsigned integer (DBTYPE_UI2). #adUnsignedInt 19 Indicates a four-byte unsigned integer (DBTYPE_UI4). #adBigInt 20 Indicates an eight-byte signed integer (DBTYPE_I8). #adUnsignedBigInt 21 Indicates an eight-byte unsigned integer (DBTYPE_UI8). #adFileTime 64 Indicates a 64-bit value representing the number of 100-nanosecond intervals since # January 1, 1601 (DBTYPE_FILETIME). #adGUID 72 Indicates a globally unique identifier (GUID) (DBTYPE_GUID). #adBinary 128 Indicates a binary value (DBTYPE_BYTES). #adChar 129 Indicates a string value (DBTYPE_STR). #adWChar 130 Indicates a null-terminated Unicode character string (DBTYPE_WSTR). #adNumeric 131 Indicates an exact numeric value with a fixed precision and scale (DBTYPE_NUMERIC). # adUserDefined 132 Indicates a user-defined variable (DBTYPE_UDT). #adUserDefined 132 Indicates a user-defined variable (DBTYPE_UDT). #adDBDate 133 Indicates a date value (yyyymmdd) (DBTYPE_DBDATE). #adDBTime 134 Indicates a time value (hhmmss) (DBTYPE_DBTIME). #adDBTimeStamp 135 Indicates a date/time stamp (yyyymmddhhmmss plus a fraction in billionths) (DBTYPE_DBTIMESTAMP). #adChapter 136 Indicates a four-byte chapter value that identifies rows in a child rowset (DBTYPE_HCHAPTER). #adPropVariant 138 Indicates an Automation PROPVARIANT (DBTYPE_PROP_VARIANT). #adVarNumeric 139 Indicates a numeric value (Parameter object only). #adVarChar 200 Indicates a string value (Parameter object only). #adLongVarChar 201 Indicates a long string value (Parameter object only). #adVarWChar 202 Indicates a null-terminated Unicode character string (Parameter object only). #adLongVarWChar 203 Indicates a long null-terminated Unicode string value (Parameter object only). #adVarBinary 204 Indicates a binary value (Parameter object only). #adLongVarBinary 205 Indicates a long binary value (Parameter object only). #adArray (Does not apply to ADOX.) 0x2000 A flag value, always combined with another data type constant, # that indicates an array of that other data type. # Error codes to names adoErrors= { 0xe7b :'adErrBoundToCommand', 0xe94 :'adErrCannotComplete', 0xea4 :'adErrCantChangeConnection', 0xc94 :'adErrCantChangeProvider', 0xe8c :'adErrCantConvertvalue', 0xe8d :'adErrCantCreate', 0xea3 :'adErrCatalogNotSet', 0xe8e :'adErrColumnNotOnThisRow', 0xd5d :'adErrDataConversion', 0xe89 :'adErrDataOverflow', 0xe9a :'adErrDelResOutOfScope', 0xea6 :'adErrDenyNotSupported', 0xea7 :'adErrDenyTypeNotSupported', 0xcb3 :'adErrFeatureNotAvailable', 0xea5 :'adErrFieldsUpdateFailed', 0xc93 :'adErrIllegalOperation', 0xcae :'adErrInTransaction', 0xe87 :'adErrIntegrityViolation', 0xbb9 :'adErrInvalidArgument', 0xe7d :'adErrInvalidConnection', 0xe7c :'adErrInvalidParamInfo', 0xe82 :'adErrInvalidTransaction', 0xe91 :'adErrInvalidURL', 0xcc1 :'adErrItemNotFound', 0xbcd :'adErrNoCurrentRecord', 0xe83 :'adErrNotExecuting', 0xe7e :'adErrNotReentrant', 0xe78 :'adErrObjectClosed', 0xd27 :'adErrObjectInCollection', 0xd5c :'adErrObjectNotSet', 0xe79 :'adErrObjectOpen', 0xbba :'adErrOpeningFile', 0xe80 :'adErrOperationCancelled', 0xe96 :'adErrOutOfSpace', 0xe88 :'adErrPermissionDenied', 0xe9e :'adErrPropConflicting', 0xe9b :'adErrPropInvalidColumn', 0xe9c :'adErrPropInvalidOption', 0xe9d :'adErrPropInvalidValue', 0xe9f :'adErrPropNotAllSettable', 0xea0 :'adErrPropNotSet', 0xea1 :'adErrPropNotSettable', 0xea2 :'adErrPropNotSupported', 0xbb8 :'adErrProviderFailed', 0xe7a :'adErrProviderNotFound', 0xbbb :'adErrReadFile', 0xe93 :'adErrResourceExists', 0xe92 :'adErrResourceLocked', 0xe97 :'adErrResourceOutOfScope', 0xe8a :'adErrSchemaViolation', 0xe8b :'adErrSignMismatch', 0xe81 :'adErrStillConnecting', 0xe7f :'adErrStillExecuting', 0xe90 :'adErrTreePermissionDenied', 0xe8f :'adErrURLDoesNotExist', 0xe99 :'adErrURLNamedRowDoesNotExist', 0xe98 :'adErrUnavailable', 0xe84 :'adErrUnsafeOperation', 0xe95 :'adErrVolumeNotFound', 0xbbc :'adErrWriteFile' } PK x9P/Vadodbapi/readme.txtUT 44^Zx`ux Project ------- adodbapi A Python DB-API 2.0 (PEP-249) module that makes it easy to use Microsoft ADO for connecting with databases and other data sources using either CPython or IronPython. Home page: Features: * 100% DB-API 2.0 (PEP-249) compliant (including most extensions and recommendations). * Includes pyunit testcases that describe how to use the module. * Fully implemented in Python. -- runs in Python 2.5+ Python 3.0+ and IronPython 2.6+ * Licensed under the LGPL license, which means that it can be used freely even in commercial programs subject to certain restrictions. * The user can choose between paramstyles: 'qmark' 'named' 'format' 'pyformat' 'dynamic' * Supports data retrieval by column name e.g.: for row in myCurser.execute("select name,age from students"): print("Student", row.name, "is", row.age, "years old.") * Supports user-definable system-to-Python data conversion functions (selected by ADO data type, or by column) Prerequisites: * C Python 2.7 or 3.5 or higher and pywin32 (Mark Hammond's python for windows extensions.) or Iron Python 2.7 or higher. (works in IPy2.0 for all data types except BUFFER) Installation: * (C-Python on Windows): Install pywin32 ("pip install pywin32") which includes adodbapi. * (IronPython on Windows): Download adodbapi from http://sf.net/projects/adodbapi. Unpack the zip. Open a command window as an administrator. CD to the folder containing the unzipped files. Run "setup.py install" using the IronPython of your choice. NOTE: ........... If you do not like the new default operation of returning Numeric columns as decimal.Decimal, you can select other options by the user defined conversion feature. Try: adodbapi.apibase.variantConversions[adodbapi.ado_consts.adNumeric] = adodbapi.apibase.cvtString or: adodbapi.apibase.variantConversions[adodbapi.ado_consts.adNumeric] = adodbapi.apibase.cvtFloat or: adodbapi.apibase.variantConversions[adodbapi.ado_consts.adNumeric] = write_your_own_convertion_function ............ notes for 2.6.2: The definitive source has been moved to https://github.com/mhammond/pywin32/tree/master/adodbapi. Remote has proven too hard to configure and test with Pyro4. I am moving it to unsupported status until I can change to a different connection method. whats new in version 2.6 A cursor.prepare() method and support for prepared SQL statements. Lots of refactoring, especially of the Remote and Server modules (still to be treated as Beta code). The quick start document 'quick_reference.odt' will export as a nice-looking pdf. Added paramstyles 'pyformat' and 'dynamic'. If your 'paramstyle' is 'named' you _must_ pass a dictionary of parameters to your .execute() method. If your 'paramstyle' is 'format' 'pyformat' or 'dynamic', you _may_ pass a dictionary of parameters -- provided your SQL operation string is formatted correctly. whats new in version 2.5 Remote module: (works on Linux!) allows a Windows computer to serve ADO databases via PyRO Server module: PyRO server for ADO. Run using a command like= C:>python -m adodbapi.server (server has simple connection string macros: is64bit, getuser, sql_provider, auto_security) Brief documentation included. See adodbapi/examples folder adodbapi.rtf New connection method conn.get_table_names() --> list of names of tables in database Vastly refactored. Data conversion things have been moved to the new adodbapi.apibase module. Many former module-level attributes are now class attributes. (Should be more thread-safe) Connection objects are now context managers for transactions and will commit or rollback. Cursor objects are context managers and will automatically close themselves. Autocommit can be switched on and off. Keyword and positional arguments on the connect() method work as documented in PEP 249. Keyword arguments from the connect call can be formatted into the connection string. New keyword arguments defined, such as: autocommit, paramstyle, remote_proxy, remote_port. *** Breaking change: variantConversion lookups are simplified: the following will raise KeyError: oldconverter=adodbapi.variantConversions[adodbapi.adoStringTypes] Refactor as: oldconverter=adodbapi.variantConversions[adodbapi.adoStringTypes[0]] License ------- LGPL, see http://www.opensource.org/licenses/lgpl-license.php Documentation ------------- Look at adodbapi/quick_reference.md http://www.python.org/topics/database/DatabaseAPI-2.0.html read the examples in adodbapi/examples and look at the test cases in adodbapi/test directory. Mailing lists ------------- The adodbapi mailing lists have been deactivated. Submit comments to the pywin32 or IronPython mailing lists. -- the bug tracker on sourceforge.net/projects/adodbapi may be checked, (infrequently). -- please use: https://github.com/mhammond/pywin32/issues PK Y03Kʐ7g7gadodbapi/license.txtUT  YZx`ux  GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! PK ѳP|;ppadodbapi/apibase.pyUT l_Zx`ux """adodbapi.apibase - A python DB API 2.0 (PEP 249) interface to Microsoft ADO Copyright (C) 2002 Henrik Ekelund, version 2.1 by Vernon Cole * http://sourceforge.net/projects/pywin32 * http://sourceforge.net/projects/adodbapi """ import sys import time import datetime import decimal import numbers # noinspection PyUnresolvedReferences from . import ado_consts as adc verbose = False # debugging flag onIronPython = sys.platform == 'cli' if onIronPython: # we need type definitions for odd data we may need to convert # noinspection PyUnresolvedReferences from System import DBNull, DateTime NullTypes = (type(None), DBNull) else: DateTime = type(NotImplemented) # should never be seen on win32 NullTypes = type(None) # --- define objects to smooth out Python3 <-> Python 2.x differences unicodeType = str longType = int StringTypes = str makeByteBuffer = bytes memoryViewType = memoryview _BaseException = Exception try: #jdhardy -- handle bytes under IronPython & Py3 bytes except NameError: bytes = str # define it for old Pythons # ------- Error handlers ------ def standardErrorHandler(connection, cursor, errorclass, errorvalue): err = (errorclass, errorvalue) try: connection.messages.append(err) except: pass if cursor is not None: try: cursor.messages.append(err) except: pass raise errorclass(errorvalue) # Note: _BaseException is defined differently between Python 2.x and 3.x class Error(_BaseException): pass #Exception that is the base class of all other error #exceptions. You can use this to catch all errors with one #single 'except' statement. Warnings are not considered #errors and thus should not use this class as base. It must #be a subclass of the Python StandardError (defined in the #module exceptions). class Warning(_BaseException): pass class InterfaceError(Error): pass class DatabaseError(Error): pass class InternalError(DatabaseError): pass class OperationalError(DatabaseError): pass class ProgrammingError(DatabaseError): pass class IntegrityError(DatabaseError): pass class DataError(DatabaseError): pass class NotSupportedError(DatabaseError): pass class FetchFailedError(OperationalError): """ Error is used by RawStoredProcedureQuerySet to determine when a fetch failed due to a connection being closed or there is no record set returned. (Non-standard, added especially for django) """ pass # # # # # ----- Type Objects and Constructors ----- # # # # # #Many databases need to have the input in a particular format for binding to an operation's input parameters. #For example, if an input is destined for a DATE column, then it must be bound to the database in a particular #string format. Similar problems exist for "Row ID" columns or large binary items (e.g. blobs or RAW columns). #This presents problems for Python since the parameters to the executeXXX() method are untyped. #When the database module sees a Python string object, it doesn't know if it should be bound as a simple CHAR #column, as a raw BINARY item, or as a DATE. # #To overcome this problem, a module must provide the constructors defined below to create objects that can #hold special values. When passed to the cursor methods, the module can then detect the proper type of #the input parameter and bind it accordingly. #A Cursor Object's description attribute returns information about each of the result columns of a query. #The type_code must compare equal to one of Type Objects defined below. Type Objects may be equal to more than #one type code (e.g. DATETIME could be equal to the type codes for date, time and timestamp columns; #see the Implementation Hints below for details). #SQL NULL values are represented by the Python None singleton on input and output. #Note: Usage of Unix ticks for database interfacing can cause troubles because of the limited date range they cover. # def Date(year,month,day): # "This function constructs an object holding a date value. " # return dateconverter.date(year,month,day) #dateconverter.Date(year,month,day) # # def Time(hour,minute,second): # "This function constructs an object holding a time value. " # return dateconverter.time(hour, minute, second) # dateconverter.Time(hour,minute,second) # # def Timestamp(year,month,day,hour,minute,second): # "This function constructs an object holding a time stamp value. " # return dateconverter.datetime(year,month,day,hour,minute,second) # # def DateFromTicks(ticks): # """This function constructs an object holding a date value from the given ticks value # (number of seconds since the epoch; see the documentation of the standard Python time module for details). """ # return Date(*time.gmtime(ticks)[:3]) # # def TimeFromTicks(ticks): # """This function constructs an object holding a time value from the given ticks value # (number of seconds since the epoch; see the documentation of the standard Python time module for details). """ # return Time(*time.gmtime(ticks)[3:6]) # # def TimestampFromTicks(ticks): # """This function constructs an object holding a time stamp value from the given # ticks value (number of seconds since the epoch; # see the documentation of the standard Python time module for details). """ # return Timestamp(*time.gmtime(ticks)[:6]) # # def Binary(aString): # """This function constructs an object capable of holding a binary (long) string value. """ # b = makeByteBuffer(aString) # return b # ----- Time converters ---------------------------------------------- class TimeConverter(object): # this is a generic time converter skeleton def __init__(self): # the details will be filled in by instances self._ordinal_1899_12_31=datetime.date(1899,12,31).toordinal()-1 # Use cls.types to compare if an input parameter is a datetime self.types = {type(self.Date(2000,1,1)), type(self.Time(12,1,1)), type(self.Timestamp(2000,1,1,12,1,1)), datetime.datetime, datetime.time, datetime.date} def COMDate(self,obj): '''Returns a ComDate from a date-time''' try: # most likely a datetime tt=obj.timetuple() try: ms=obj.microsecond except: ms=0 return self.ComDateFromTuple(tt, ms) except: # might be a tuple try: return self.ComDateFromTuple(obj) except: # try an mxdate try: return obj.COMDate() except: raise ValueError('Cannot convert "%s" to COMdate.' % repr(obj)) def ComDateFromTuple(self, t, microseconds=0): d = datetime.date(t[0],t[1],t[2]) integerPart = d.toordinal() - self._ordinal_1899_12_31 ms = (t[3]*3600 + t[4]*60 + t[5]) * 1000000 + microseconds fractPart = float(ms) / 86400000000.0 return integerPart + fractPart def DateObjectFromCOMDate(self,comDate): 'Returns an object of the wanted type from a ComDate' raise NotImplementedError #"Abstract class" def Date(self,year,month,day): "This function constructs an object holding a date value. " raise NotImplementedError #"Abstract class" def Time(self,hour,minute,second): "This function constructs an object holding a time value. " raise NotImplementedError #"Abstract class" def Timestamp(self,year,month,day,hour,minute,second): "This function constructs an object holding a time stamp value. " raise NotImplementedError #"Abstract class" # all purpose date to ISO format converter def DateObjectToIsoFormatString(self, obj): "This function should return a string in the format 'YYYY-MM-dd HH:MM:SS:ms' (ms optional) " try: # most likely, a datetime.datetime s = obj.isoformat(' ') except (TypeError, AttributeError): if isinstance(obj, datetime.date): s = obj.isoformat() + ' 00:00:00' # return exact midnight else: try: # maybe it has a strftime method, like mx s = obj.strftime('%Y-%m-%d %H:%M:%S') except AttributeError: try: #but may be time.struct_time s = time.strftime('%Y-%m-%d %H:%M:%S', obj) except: raise ValueError('Cannot convert "%s" to isoformat' % repr(obj)) return s # -- Optional: if mx extensions are installed you may use mxDateTime ---- try: import mx.DateTime mxDateTime = True except: mxDateTime = False if mxDateTime: class mxDateTimeConverter(TimeConverter): # used optionally if installed def __init__(self): TimeConverter.__init__(self) self.types.add(type(mx.DateTime)) def DateObjectFromCOMDate(self,comDate): return mx.DateTime.DateTimeFromCOMDate(comDate) def Date(self,year,month,day): return mx.DateTime.Date(year,month,day) def Time(self,hour,minute,second): return mx.DateTime.Time(hour,minute,second) def Timestamp(self,year,month,day,hour,minute,second): return mx.DateTime.Timestamp(year,month,day,hour,minute,second) else: class mxDateTimeConverter(TimeConverter): pass # if no mx is installed class pythonDateTimeConverter(TimeConverter): # standard since Python 2.3 def __init__(self): TimeConverter.__init__(self) def DateObjectFromCOMDate(self, comDate): if isinstance(comDate, datetime.datetime): odn = comDate.toordinal() tim = comDate.time() new = datetime.datetime.combine(datetime.datetime.fromordinal(odn), tim) return new # return comDate.replace(tzinfo=None) # make non aware elif isinstance(comDate, DateTime): fComDate = comDate.ToOADate() # ironPython clr Date/Time else: fComDate=float(comDate) #ComDate is number of days since 1899-12-31 integerPart = int(fComDate) floatpart=fComDate-integerPart ##if floatpart == 0.0: ## return datetime.date.fromordinal(integerPart + self._ordinal_1899_12_31) dte=datetime.datetime.fromordinal(integerPart + self._ordinal_1899_12_31) \ + datetime.timedelta(milliseconds=floatpart*86400000) # millisecondsperday=86400000 # 24*60*60*1000 return dte def Date(self,year,month,day): return datetime.date(year,month,day) def Time(self,hour,minute,second): return datetime.time(hour,minute,second) def Timestamp(self,year,month,day,hour,minute,second): return datetime.datetime(year,month,day,hour,minute,second) class pythonTimeConverter(TimeConverter): # the old, ?nix type date and time def __init__(self): #caution: this Class gets confised by timezones and DST TimeConverter.__init__(self) self.types.add(time.struct_time) def DateObjectFromCOMDate(self,comDate): 'Returns ticks since 1970' if isinstance(comDate,datetime.datetime): return comDate.timetuple() elif isinstance(comDate, DateTime): # ironPython clr date/time fcomDate = comDate.ToOADate() else: fcomDate = float(comDate) secondsperday=86400 # 24*60*60 #ComDate is number of days since 1899-12-31, gmtime epoch is 1970-1-1 = 25569 days t=time.gmtime(secondsperday*(fcomDate-25569.0)) return t #year,month,day,hour,minute,second,weekday,julianday,daylightsaving=t def Date(self,year,month,day): return self.Timestamp(year,month,day,0,0,0) def Time(self,hour,minute,second): return time.gmtime((hour*60+minute)*60 + second) def Timestamp(self,year,month,day,hour,minute,second): return time.localtime(time.mktime((year,month,day,hour,minute,second,0,0,-1))) base_dateconverter = pythonDateTimeConverter() # ------ DB API required module attributes --------------------- threadsafety=1 # TODO -- find out whether this module is actually BETTER than 1. apilevel='2.0' #String constant stating the supported DB API level. paramstyle='qmark' # the default parameter style # ------ control for an extension which may become part of DB API 3.0 --- accepted_paramstyles = ('qmark', 'named', 'format', 'pyformat', 'dynamic') #------------------------------------------------------------------------------------------ # define similar types for generic conversion routines adoIntegerTypes=(adc.adInteger,adc.adSmallInt,adc.adTinyInt,adc.adUnsignedInt, adc.adUnsignedSmallInt,adc.adUnsignedTinyInt, adc.adBoolean,adc.adError) #max 32 bits adoRowIdTypes=(adc.adChapter,) #v2.1 Rose adoLongTypes=(adc.adBigInt,adc.adFileTime,adc.adUnsignedBigInt) adoExactNumericTypes=(adc.adDecimal,adc.adNumeric,adc.adVarNumeric,adc.adCurrency) #v2.3 Cole adoApproximateNumericTypes=(adc.adDouble,adc.adSingle) #v2.1 Cole adoStringTypes=(adc.adBSTR,adc.adChar,adc.adLongVarChar,adc.adLongVarWChar, adc.adVarChar,adc.adVarWChar,adc.adWChar) adoBinaryTypes=(adc.adBinary,adc.adLongVarBinary,adc.adVarBinary) adoDateTimeTypes=(adc.adDBTime, adc.adDBTimeStamp, adc.adDate, adc.adDBDate) adoRemainingTypes=(adc.adEmpty,adc.adIDispatch,adc.adIUnknown, adc.adPropVariant,adc.adArray,adc.adUserDefined, adc.adVariant,adc.adGUID) # this class is a trick to determine whether a type is a member of a related group of types. see PEP notes class DBAPITypeObject(object): def __init__(self,valuesTuple): self.values = frozenset(valuesTuple) def __eq__(self,other): return other in self.values def __ne__(self, other): return other not in self.values """This type object is used to describe columns in a database that are string-based (e.g. CHAR). """ STRING = DBAPITypeObject(adoStringTypes) """This type object is used to describe (long) binary columns in a database (e.g. LONG, RAW, BLOBs). """ BINARY = DBAPITypeObject(adoBinaryTypes) """This type object is used to describe numeric columns in a database. """ NUMBER = DBAPITypeObject(adoIntegerTypes + adoLongTypes + \ adoExactNumericTypes + adoApproximateNumericTypes) """This type object is used to describe date/time columns in a database. """ DATETIME = DBAPITypeObject(adoDateTimeTypes) """This type object is used to describe the "Row ID" column in a database. """ ROWID = DBAPITypeObject(adoRowIdTypes) OTHER = DBAPITypeObject(adoRemainingTypes) # ------- utilities for translating python data types to ADO data types --------------------------------- typeMap = { memoryViewType : adc.adVarBinary, float : adc.adDouble, type(None) : adc.adEmpty, str : adc.adBSTR, bool :adc.adBoolean, #v2.1 Cole decimal.Decimal : adc.adDecimal, int: adc.adBigInt, bytes: adc.adVarBinary } def pyTypeToADOType(d): tp=type(d) try: return typeMap[tp] except KeyError: # The type was not defined in the pre-computed Type table from . import dateconverter if tp in dateconverter.types: # maybe it is one of our supported Date/Time types return adc.adDate # otherwise, attempt to discern the type by probing the data object itself -- to handle duck typing if isinstance(d, StringTypes): return adc.adBSTR if isinstance(d, numbers.Integral): return adc.adBigInt if isinstance(d, numbers.Real): return adc.adDouble raise DataError('cannot convert "%s" (type=%s) to ADO'%(repr(d),tp)) # # # # # # # # # # # # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # functions to convert database values to Python objects #------------------------------------------------------------------------ # variant type : function converting variant to Python value def variantConvertDate(v): from . import dateconverter # this function only called when adodbapi is running return dateconverter.DateObjectFromCOMDate(v) def cvtString(variant): # use to get old action of adodbapi v1 if desired if onIronPython: try: return variant.ToString() except: pass return str(variant) def cvtDecimal(variant): #better name return _convertNumberWithCulture(variant, decimal.Decimal) def cvtNumeric(variant): #older name - don't break old code return cvtDecimal(variant) def cvtFloat(variant): return _convertNumberWithCulture(variant, float) def _convertNumberWithCulture(variant, f): try: return f(variant) except (ValueError,TypeError,decimal.InvalidOperation): try: europeVsUS = str(variant).replace(",",".") return f(europeVsUS) except (ValueError,TypeError,decimal.InvalidOperation): pass def cvtInt(variant): return int(variant) def cvtLong(variant): # only important in old versions where long and int differ return int(variant) def cvtBuffer(variant): return bytes(variant) def cvtUnicode(variant): return str(variant) def identity(x): return x def cvtUnusual(variant): if verbose > 1: sys.stderr.write('Conversion called for Unusual data=%s\n' % repr(variant)) if isinstance(variant, DateTime): # COMdate or System.Date from .adodbapi import dateconverter # this will only be called when adodbapi is in use, and very rarely return dateconverter.DateObjectFromCOMDate(variant) return variant # cannot find conversion function -- just give the data to the user def convert_to_python(variant, func): # convert DB value into Python value if isinstance(variant, NullTypes): # IronPython Null or None return None return func(variant) # call the appropriate conversion function class MultiMap(dict): #builds a dictionary from {(sequence,of,keys) : function} """A dictionary of ado.type : function -- but you can set multiple items by passing a sequence of keys""" #useful for defining conversion functions for groups of similar data types. def __init__(self, aDict): for k, v in list(aDict.items()): self[k] = v # we must call __setitem__ def __setitem__(self, adoType, cvtFn): "set a single item, or a whole sequence of items" try: # user passed us a sequence, set them individually for type in adoType: dict.__setitem__(self, type, cvtFn) except TypeError: # a single value fails attempt to iterate dict.__setitem__(self, adoType, cvtFn) #initialize variantConversions dictionary used to convert SQL to Python # this is the dictionary of default conversion functions, built by the class above. # this becomes a class attribute for the Connection, and that attribute is used # to build the list of column conversion functions for the Cursor variantConversions = MultiMap( { adoDateTimeTypes : variantConvertDate, adoApproximateNumericTypes: cvtFloat, adoExactNumericTypes: cvtDecimal, # use to force decimal rather than unicode adoLongTypes : cvtLong, adoIntegerTypes: cvtInt, adoRowIdTypes: cvtInt, adoStringTypes: identity, adoBinaryTypes: cvtBuffer, adoRemainingTypes: cvtUnusual }) # # # # # classes to emulate the result of cursor.fetchxxx() as a sequence of sequences # # # # # # "an ENUM of how my low level records are laid out" RS_WIN_32, RS_ARRAY, RS_REMOTE = list(range(1,4)) class SQLrow(object): # a single database row # class to emulate a sequence, so that a column may be retrieved by either number or name def __init__(self, rows, index): # "rows" is an _SQLrows object, index is which row self.rows = rows # parent 'fetch' container object self.index = index # my row number within parent def __getattr__(self, name): # used for row.columnName type of value access try: return self._getValue(self.rows.columnNames[name.lower()]) except KeyError: raise AttributeError('Unknown column name "{}"'.format(name)) def _getValue(self,key): # key must be an integer if self.rows.recordset_format == RS_ARRAY: # retrieve from two-dimensional array v = self.rows.ado_results[key,self.index] elif self.rows.recordset_format == RS_REMOTE: v = self.rows.ado_results[self.index][key] else:# pywin32 - retrieve from tuple of tuples v = self.rows.ado_results[key][self.index] if self.rows.converters is NotImplemented: return v return convert_to_python(v, self.rows.converters[key]) def __len__(self): return self.rows.numberOfColumns def __getitem__(self,key): # used for row[key] type of value access if isinstance(key,int): # normal row[1] designation try: return self._getValue(key) except IndexError: raise if isinstance(key, slice): indices = key.indices(self.rows.numberOfColumns) vl = [self._getValue(i) for i in range(*indices)] return tuple(vl) try: return self._getValue(self.rows.columnNames[key.lower()]) # extension row[columnName] designation except (KeyError, TypeError): er, st, tr = sys.exc_info() raise er('No such key as "%s" in %s'%(repr(key),self.__repr__())).with_traceback(tr) def __iter__(self): return iter(self.__next__()) def __next__(self): for n in range(self.rows.numberOfColumns): yield self._getValue(n) def __repr__(self): # create a human readable representation taglist = sorted(list(self.rows.columnNames.items()), key=lambda x: x[1]) s = "' def __str__(self): # create a pretty human readable representation return str(tuple(str(self._getValue(i)) for i in range(self.rows.numberOfColumns))) # TO-DO implement pickling an SQLrow directly #def __getstate__(self): return self.__dict__ #def __setstate__(self, d): self.__dict__.update(d) # which basically tell pickle to treat your class just like a normal one, # taking self.__dict__ as representing the whole of the instance state, # despite the existence of the __getattr__. # # # # class SQLrows(object): # class to emulate a sequence for multiple rows using a container object def __init__(self, ado_results, numberOfRows, cursor): self.ado_results = ado_results # raw result of SQL get try: self.recordset_format = cursor.recordset_format self.numberOfColumns = cursor.numberOfColumns self.converters = cursor.converters self.columnNames = cursor.columnNames except AttributeError: self.recordset_format = RS_ARRAY self.numberOfColumns = 0 self.converters = [] self.columnNames = {} self.numberOfRows = numberOfRows def __len__(self): return self.numberOfRows def __getitem__(self, item): # used for row or row,column access if not self.ado_results: return [] if isinstance(item, slice): # will return a list of row objects indices = item.indices(self.numberOfRows) return [SQLrow(self, k) for k in range(*indices)] elif isinstance(item, tuple) and len(item)==2: # d = some_rowsObject[i,j] will return a datum from a two-dimension address i, j = item if not isinstance(j, int): try: j = self.columnNames[j.lower()] # convert named column to numeric except KeyError: raise KeyError('adodbapi: no such column name as "%s"'%repr(j)) if self.recordset_format == RS_ARRAY: # retrieve from two-dimensional array v = self.ado_results[j,i] elif self.recordset_format == RS_REMOTE: v = self.ado_results[i][j] else: # pywin32 - retrieve from tuple of tuples v = self.ado_results[j][i] if self.converters is NotImplemented: return v return convert_to_python(v, self.converters[j]) else: row = SQLrow(self, item) # new row descriptor return row def __iter__(self): return iter(self.__next__()) def __next__(self): for n in range(self.numberOfRows): row = SQLrow(self, n) yield row # # # # # # # # # # functions to re-format SQL requests to other paramstyle requirements # # # # # # # # # # def changeNamedToQmark(op): #convert from 'named' paramstyle to ADO required '?'mark parameters outOp = '' outparms=[] chunks = op.split("'") #quote all literals -- odd numbered list results are literals. inQuotes = False for chunk in chunks: if inQuotes: # this is inside a quote if chunk == '': # double apostrophe to quote one apostrophe outOp = outOp[:-1] # so take one away else: outOp += "'"+chunk+"'" # else pass the quoted string as is. else: # is SQL code -- look for a :namedParameter while chunk: # some SQL string remains sp = chunk.split(':',1) outOp += sp[0] # concat the part up to the : s = '' try: chunk = sp[1] except IndexError: chunk = None if chunk: # there was a parameter - parse it out i = 0 c = chunk[0] while c.isalnum() or c == '_': i += 1 try: c = chunk[i] except IndexError: break s = chunk[:i] chunk = chunk[i:] if s: outparms.append(s) # list the parameters in order outOp += '?' # put in the Qmark inQuotes = not inQuotes return outOp, outparms def changeFormatToQmark(op): #convert from 'format' paramstyle to ADO required '?'mark parameters outOp = '' outparams = [] chunks = op.split("'") #quote all literals -- odd numbered list results are literals. inQuotes = False for chunk in chunks: if inQuotes: if outOp != '' and chunk=='': # he used a double apostrophe to quote one apostrophe outOp = outOp[:-1] # so take one away else: outOp += "'"+chunk+"'" # else pass the quoted string as is. else: # is SQL code -- look for a %s parameter if '%(' in chunk: # ugh! pyformat! while chunk: # some SQL string remains sp = chunk.split('%(', 1) outOp += sp[0] # concat the part up to the % if len(sp) > 1: try: s, chunk = sp[1].split(')s', 1) # find the ')s' except ValueError: raise ProgrammingError('Pyformat SQL has incorrect format near "%s"' % chunk) outparams.append(s) outOp += '?' # put in the Qmark else: chunk = None else: # proper '%s' format sp = chunk.split('%s') # make each %s outOp += "?".join(sp) # into ? inQuotes = not inQuotes # every other chunk is a quoted string return outOp, outparams PK ѳP1vv"adodbapi/process_connect_string.pyUT l_Zx`ux """ a clumsy attempt at a macro language to let the programmer execute code on the server (ex: determine 64bit)""" from . import is64bit as is64bit def macro_call(macro_name, args, kwargs): """ allow the programmer to perform limited processing on the server by passing macro names and args :new_key - the key name the macro will create :args[0] - macro name :args[1:] - any arguments :code - the value of the keyword item :kwargs - the connection keyword dictionary. ??key has been removed --> the value to put in for kwargs['name'] = value """ if isinstance(args, (str, str)): args = [args] # the user forgot to pass a sequence, so make a string into args[0] new_key = args[0] try: if macro_name == "is64bit": if is64bit.Python(): # if on 64 bit Python return new_key, args[1] # return first argument else: try: return new_key, args[2] # else return second argument (if defined) except IndexError: return new_key, '' # else return blank elif macro_name == "getuser": # get the name of the user the server is logged in under if not new_key in kwargs: import getpass return new_key, getpass.getuser() elif macro_name == "getnode": # get the name of the computer running the server import platform try: return new_key, args[1] % platform.node() except IndexError: return new_key, platform.node() elif macro_name == "getenv": # expand the server's environment variable args[1] try: dflt = args[2] # if not found, default from args[2] except IndexError: # or blank dflt = '' return new_key, os.environ.get(args[1], dflt) elif macro_name == "auto_security": if not 'user' in kwargs or not kwargs['user']: # missing, blank, or Null username return new_key, 'Integrated Security=SSPI' return new_key, 'User ID=%(user)s; Password=%(password)s' % kwargs elif macro_name == "find_temp_test_path": # helper function for testing ado operation -- undocumented import tempfile, os return new_key, os.path.join(tempfile.gettempdir(), 'adodbapi_test', args[1]) raise ValueError ('Unknown connect string macro=%s' % macro_name) except: raise ValueError ('Error in macro processing %s %s' % (macro_name, repr(args))) def process(args, kwargs, expand_macros=False): # --> connection string with keyword arguments processed. """ attempts to inject arguments into a connection string using Python "%" operator for strings co: adodbapi connection object args: positional parameters from the .connect() call kvargs: keyword arguments from the .connect() call """ try: dsn = args[0] except IndexError: dsn = None if isinstance(dsn, dict): # as a convenience the first argument may be django settings kwargs.update(dsn) elif dsn: # the connection string is passed to the connection as part of the keyword dictionary kwargs['connection_string'] = dsn try: a1 = args[1] except IndexError: a1 = None # historically, the second positional argument might be a timeout value if isinstance(a1, int): kwargs['timeout'] = a1 # if the second positional argument is a string, then it is user elif isinstance(a1, str): kwargs['user'] = a1 # if the second positional argument is a dictionary, use it as keyword arguments, too elif isinstance(a1, dict): kwargs.update(a1) try: kwargs['password'] = args[2] # the third positional argument is password kwargs['host'] = args[3] # the fourth positional argument is host name kwargs['database'] = args[4] # the fifth positional argument is database name except IndexError: pass # make sure connection string is defined somehow if not 'connection_string' in kwargs: try: # perhaps 'dsn' was defined kwargs['connection_string'] = kwargs['dsn'] except KeyError: try: # as a last effort, use the "host" keyword kwargs['connection_string'] = kwargs['host'] except KeyError: raise TypeError ("Must define 'connection_string' for ado connections") if expand_macros: for kwarg in list(kwargs.keys()): if kwarg.startswith('macro_'): # If a key defines a macro macro_name = kwarg[6:] # name without the "macro_" macro_code = kwargs.pop(kwarg) # we remove the macro_key and get the code to execute new_key, rslt = macro_call(macro_name, macro_code, kwargs) # run the code in the local context kwargs[new_key] = rslt # put the result back in the keywords dict # special processing for PyRO IPv6 host address try: s = kwargs['proxy_host'] if ':' in s: # it is an IPv6 address if s[0] != '[': # is not surrounded by brackets kwargs['proxy_host'] = s.join(('[',']')) # put it in brackets except KeyError: pass return kwargs PK {Risapi/UT Zx`Zx`ux PK Y03K%Neeisapi/isapicon.pyUT  YZx`ux """Constants needed by ISAPI filters and extensions.""" # ====================================================================== # Copyright 2002-2003 by Blackdog Software Pty Ltd. # # All Rights Reserved # # Permission to use, copy, modify, and distribute this software and # its documentation for any purpose and without fee is hereby # granted, provided that the above copyright notice appear in all # copies and that both that copyright notice and this permission # notice appear in supporting documentation, and that the name of # Blackdog Software not be used in advertising or publicity pertaining to # distribution of the software without specific, written prior # permission. # # BLACKDOG SOFTWARE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, # INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN # NO EVENT SHALL BLACKDOG SOFTWARE BE LIABLE FOR ANY SPECIAL, INDIRECT OR # CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS # OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, # NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # ====================================================================== # HTTP reply codes HTTP_CONTINUE = 100 HTTP_SWITCHING_PROTOCOLS = 101 HTTP_PROCESSING = 102 HTTP_OK = 200 HTTP_CREATED = 201 HTTP_ACCEPTED = 202 HTTP_NON_AUTHORITATIVE = 203 HTTP_NO_CONTENT = 204 HTTP_RESET_CONTENT = 205 HTTP_PARTIAL_CONTENT = 206 HTTP_MULTI_STATUS = 207 HTTP_MULTIPLE_CHOICES = 300 HTTP_MOVED_PERMANENTLY = 301 HTTP_MOVED_TEMPORARILY = 302 HTTP_SEE_OTHER = 303 HTTP_NOT_MODIFIED = 304 HTTP_USE_PROXY = 305 HTTP_TEMPORARY_REDIRECT = 307 HTTP_BAD_REQUEST = 400 HTTP_UNAUTHORIZED = 401 HTTP_PAYMENT_REQUIRED = 402 HTTP_FORBIDDEN = 403 HTTP_NOT_FOUND = 404 HTTP_METHOD_NOT_ALLOWED = 405 HTTP_NOT_ACCEPTABLE = 406 HTTP_PROXY_AUTHENTICATION_REQUIRED= 407 HTTP_REQUEST_TIME_OUT = 408 HTTP_CONFLICT = 409 HTTP_GONE = 410 HTTP_LENGTH_REQUIRED = 411 HTTP_PRECONDITION_FAILED = 412 HTTP_REQUEST_ENTITY_TOO_LARGE = 413 HTTP_REQUEST_URI_TOO_LARGE = 414 HTTP_UNSUPPORTED_MEDIA_TYPE = 415 HTTP_RANGE_NOT_SATISFIABLE = 416 HTTP_EXPECTATION_FAILED = 417 HTTP_UNPROCESSABLE_ENTITY = 422 HTTP_INTERNAL_SERVER_ERROR = 500 HTTP_NOT_IMPLEMENTED = 501 HTTP_BAD_GATEWAY = 502 HTTP_SERVICE_UNAVAILABLE = 503 HTTP_GATEWAY_TIME_OUT = 504 HTTP_VERSION_NOT_SUPPORTED = 505 HTTP_VARIANT_ALSO_VARIES = 506 HSE_STATUS_SUCCESS = 1 HSE_STATUS_SUCCESS_AND_KEEP_CONN = 2 HSE_STATUS_PENDING = 3 HSE_STATUS_ERROR = 4 SF_NOTIFY_SECURE_PORT = 0x00000001 SF_NOTIFY_NONSECURE_PORT = 0x00000002 SF_NOTIFY_READ_RAW_DATA = 0x00008000 SF_NOTIFY_PREPROC_HEADERS = 0x00004000 SF_NOTIFY_AUTHENTICATION = 0x00002000 SF_NOTIFY_URL_MAP = 0x00001000 SF_NOTIFY_ACCESS_DENIED = 0x00000800 SF_NOTIFY_SEND_RESPONSE = 0x00000040 SF_NOTIFY_SEND_RAW_DATA = 0x00000400 SF_NOTIFY_LOG = 0x00000200 SF_NOTIFY_END_OF_REQUEST = 0x00000080 SF_NOTIFY_END_OF_NET_SESSION = 0x00000100 SF_NOTIFY_ORDER_HIGH = 0x00080000 SF_NOTIFY_ORDER_MEDIUM = 0x00040000 SF_NOTIFY_ORDER_LOW = 0x00020000 SF_NOTIFY_ORDER_DEFAULT = SF_NOTIFY_ORDER_LOW SF_NOTIFY_ORDER_MASK = (SF_NOTIFY_ORDER_HIGH | \ SF_NOTIFY_ORDER_MEDIUM | \ SF_NOTIFY_ORDER_LOW) SF_STATUS_REQ_FINISHED = 134217728 # 0x8000000 SF_STATUS_REQ_FINISHED_KEEP_CONN = 134217728 + 1 SF_STATUS_REQ_NEXT_NOTIFICATION = 134217728 + 2 SF_STATUS_REQ_HANDLED_NOTIFICATION = 134217728 + 3 SF_STATUS_REQ_ERROR = 134217728 + 4 SF_STATUS_REQ_READ_NEXT = 134217728 + 5 HSE_IO_SYNC = 0x00000001 # for WriteClient HSE_IO_ASYNC = 0x00000002 # for WriteClient/TF/EU HSE_IO_DISCONNECT_AFTER_SEND = 0x00000004 # for TF HSE_IO_SEND_HEADERS = 0x00000008 # for TF HSE_IO_NODELAY = 0x00001000 # turn off nagling # These two are only used by VectorSend HSE_IO_FINAL_SEND = 0x00000010 HSE_IO_CACHE_RESPONSE = 0x00000020 HSE_EXEC_URL_NO_HEADERS = 0x02 HSE_EXEC_URL_IGNORE_CURRENT_INTERCEPTOR = 0x04 HSE_EXEC_URL_IGNORE_VALIDATION_AND_RANGE = 0x10 HSE_EXEC_URL_DISABLE_CUSTOM_ERROR = 0x20 HSE_EXEC_URL_SSI_CMD = 0x40 HSE_EXEC_URL_HTTP_CACHE_ELIGIBLE = 0x80 PK #XQ ..isapi/threaded_extension.pyUT ԭ_Zx`ux """An ISAPI extension base class implemented using a thread-pool.""" # $Id$ import sys import time from isapi import isapicon, ExtensionError import isapi.simple from win32file import GetQueuedCompletionStatus, CreateIoCompletionPort, \ PostQueuedCompletionStatus, CloseHandle from win32security import SetThreadToken from win32event import INFINITE from pywintypes import OVERLAPPED import threading import traceback ISAPI_REQUEST = 1 ISAPI_SHUTDOWN = 2 class WorkerThread(threading.Thread): def __init__(self, extension, io_req_port): self.running = False self.io_req_port = io_req_port self.extension = extension threading.Thread.__init__(self) # We wait 15 seconds for a thread to terminate, but if it fails to, # we don't want the process to hang at exit waiting for it... self.setDaemon(True) def run(self): self.running = True while self.running: errCode, bytes, key, overlapped = \ GetQueuedCompletionStatus(self.io_req_port, INFINITE) if key == ISAPI_SHUTDOWN and overlapped is None: break # Let the parent extension handle the command. dispatcher = self.extension.dispatch_map.get(key) if dispatcher is None: raise RuntimeError("Bad request '%s'" % (key,)) dispatcher(errCode, bytes, key, overlapped) def call_handler(self, cblock): self.extension.Dispatch(cblock) # A generic thread-pool based extension, using IO Completion Ports. # Sub-classes can override one method to implement a simple extension, or # may leverage the CompletionPort to queue their own requests, and implement a # fully asynch extension. class ThreadPoolExtension(isapi.simple.SimpleExtension): "Base class for an ISAPI extension based around a thread-pool" max_workers = 20 worker_shutdown_wait = 15000 # 15 seconds for workers to quit... def __init__(self): self.workers = [] # extensible dispatch map, for sub-classes that need to post their # own requests to the completion port. # Each of these functions is called with the result of # GetQueuedCompletionStatus for our port. self.dispatch_map = { ISAPI_REQUEST: self.DispatchConnection, } def GetExtensionVersion(self, vi): isapi.simple.SimpleExtension.GetExtensionVersion(self, vi) # As per Q192800, the CompletionPort should be created with the number # of processors, even if the number of worker threads is much larger. # Passing 0 means the system picks the number. self.io_req_port = CreateIoCompletionPort(-1, None, 0, 0) # start up the workers self.workers = [] for i in range(self.max_workers): worker = WorkerThread(self, self.io_req_port) worker.start() self.workers.append(worker) def HttpExtensionProc(self, control_block): overlapped = OVERLAPPED() overlapped.object = control_block PostQueuedCompletionStatus(self.io_req_port, 0, ISAPI_REQUEST, overlapped) return isapicon.HSE_STATUS_PENDING def TerminateExtension(self, status): for worker in self.workers: worker.running = False for worker in self.workers: PostQueuedCompletionStatus(self.io_req_port, 0, ISAPI_SHUTDOWN, None) # wait for them to terminate - pity we aren't using 'native' threads # as then we could do a smart wait - but now we need to poll.... end_time = time.time() + self.worker_shutdown_wait/1000 alive = self.workers while alive: if time.time() > end_time: # xxx - might be nice to log something here. break time.sleep(0.2) alive = [w for w in alive if w.is_alive()] self.dispatch_map = {} # break circles CloseHandle(self.io_req_port) # This is the one operation the base class supports - a simple # Connection request. We setup the thread-token, and dispatch to the # sub-class's 'Dispatch' method. def DispatchConnection(self, errCode, bytes, key, overlapped): control_block = overlapped.object # setup the correct user for this request hRequestToken = control_block.GetImpersonationToken() SetThreadToken(None, hRequestToken) try: try: self.Dispatch(control_block) except: self.HandleDispatchError(control_block) finally: # reset the security context SetThreadToken(None, None) def Dispatch(self, ecb): """Overridden by the sub-class to handle connection requests. This class creates a thread-pool using a Windows completion port, and dispatches requests via this port. Sub-classes can generally implement each connection request using blocking reads and writes, and the thread-pool will still provide decent response to the end user. The sub-class can set a max_workers attribute (default is 20). Note that this generally does *not* mean 20 threads will all be concurrently running, via the magic of Windows completion ports. There is no default implementation - sub-classes must implement this. """ raise NotImplementedError("sub-classes should override Dispatch") def HandleDispatchError(self, ecb): """Handles errors in the Dispatch method. When a Dispatch method call fails, this method is called to handle the exception. The default implementation formats the traceback in the browser. """ ecb.HttpStatusCode = isapicon.HSE_STATUS_ERROR #control_block.LogData = "we failed!" exc_typ, exc_val, exc_tb = sys.exc_info() limit = None try: try: import cgi ecb.SendResponseHeaders("200 OK", "Content-type: text/html\r\n\r\n", False) print(file=ecb) print("

    Traceback (most recent call last):

    ", file=ecb) list = traceback.format_tb(exc_tb, limit) + \ traceback.format_exception_only(exc_typ, exc_val) print("
    %s%s
    " % ( cgi.escape("".join(list[:-1])), cgi.escape(list[-1]),), file=ecb) except ExtensionError: # The client disconnected without reading the error body - # its probably not a real browser at the other end, ignore it. pass except: print("FAILED to render the error message!") traceback.print_exc() print("ORIGINAL extension error:") traceback.print_exception(exc_typ, exc_val, exc_tb) finally: # holding tracebacks in a local of a frame that may itself be # part of a traceback used to be evil and cause leaks! exc_tb = None ecb.DoneWithSession() PK {R isapi/test/UT Zx`Zx`ux PK ѳP֓[~isapi/test/extension_simple.pyUT l_Zx`ux # This is an ISAPI extension purely for testing purposes. It is NOT # a 'demo' (even though it may be useful!) # # Install this extension, then point your browser to: # "http://localhost/pyisapi_test/test1" # This will execute the method 'test1' below. See below for the list of # test methods that are acceptable. from isapi import isapicon, threaded_extension, ExtensionError from isapi.simple import SimpleFilter import traceback import urllib.request, urllib.parse, urllib.error import winerror # If we have no console (eg, am running from inside IIS), redirect output # somewhere useful - in this case, the standard win32 trace collector. import win32api try: win32api.GetConsoleTitle() except win32api.error: # No console - redirect import win32traceutil # The ISAPI extension - handles requests in our virtual dir, and sends the # response to the client. class Extension(threaded_extension.ThreadPoolExtension): "Python ISAPI Tester" def Dispatch(self, ecb): print('Tester dispatching "%s"' % (ecb.GetServerVariable("URL"),)) url = ecb.GetServerVariable("URL") test_name = url.split("/")[-1] meth = getattr(self, test_name, None) if meth is None: raise AttributeError("No test named '%s'" % (test_name,)) result = meth(ecb) if result is None: # This means the test finalized everything return ecb.SendResponseHeaders("200 OK", "Content-type: text/html\r\n\r\n", False) print("Finished running test ", test_name, "", file=ecb) print("
    ", file=ecb)
            print(result, file=ecb)
            print("
    ", file=ecb) print("", file=ecb) ecb.DoneWithSession() def test1(self, ecb): try: ecb.GetServerVariable("foo bar") raise RuntimeError("should have failed!") except ExtensionError as err: assert err.errno == winerror.ERROR_INVALID_INDEX, err return "worked!" def test_long_vars(self, ecb): qs = ecb.GetServerVariable("QUERY_STRING") # Our implementation has a default buffer size of 8k - so we test # the code that handles an overflow by ensuring there are more # than 8k worth of chars in the URL. expected_query = ('x' * 8500) if len(qs)==0: # Just the URL with no query part - redirect to myself, but with # a huge query portion. me = ecb.GetServerVariable("URL") headers = "Location: " + me + "?" + expected_query + "\r\n\r\n" ecb.SendResponseHeaders("301 Moved", headers) ecb.DoneWithSession() return None if qs == expected_query: return "Total length of variable is %d - test worked!" % (len(qs),) else: return "Unexpected query portion! Got %d chars, expected %d" % \ (len(qs), len(expected_query)) def test_unicode_vars(self, ecb): # We need to check that we are running IIS6! This seems the only # effective way from an extension. ver = float(ecb.GetServerVariable("SERVER_SOFTWARE").split('/')[1]) if ver < 6.0: return "This is IIS version %g - unicode only works in IIS6 and later" % ver us = ecb.GetServerVariable("UNICODE_SERVER_NAME") if not isinstance(us, str): raise RuntimeError("unexpected type!") if us != str(ecb.GetServerVariable("SERVER_NAME")): raise RuntimeError("Unicode and non-unicode values were not the same") return "worked!" # The entry points for the ISAPI extension. def __ExtensionFactory__(): return Extension() if __name__=='__main__': # If run from the command-line, install ourselves. from isapi.install import * params = ISAPIParameters() # Setup the virtual directories - this is a list of directories our # extension uses - in this case only 1. # Each extension has a "script map" - this is the mapping of ISAPI # extensions. sm = [ ScriptMapParams(Extension="*", Flags=0) ] vd = VirtualDirParameters(Name="pyisapi_test", Description = Extension.__doc__, ScriptMaps = sm, ScriptMapUpdate = "replace" ) params.VirtualDirs = [vd] HandleCommandLine(params) PK Y03KQ/ooisapi/test/README.txtUT  YZx`ux This is a directory for tests of the PyISAPI framework. For demos, please see the pyisapi 'samples' directory.PK Y03K%isapi/__init__.pyUT  YZx`ux # The Python ISAPI package. # Exceptions thrown by the DLL framework. class ISAPIError(Exception): def __init__(self, errno, strerror = None, funcname = None): # named attributes match IOError etc. self.errno = errno self.strerror = strerror self.funcname = funcname Exception.__init__(self, errno, strerror, funcname) def __str__(self): if self.strerror is None: try: import win32api self.strerror = win32api.FormatMessage(self.errno).strip() except: self.strerror = "no error message is available" # str() looks like a win32api error. return str( (self.errno, self.strerror, self.funcname) ) class FilterError(ISAPIError): pass class ExtensionError(ISAPIError): pass # A little development aid - a filter or extension callback function can # raise one of these exceptions, and the handler module will be reloaded. # This means you can change your code without restarting IIS. # After a reload, your filter/extension will have the GetFilterVersion/ # GetExtensionVersion function called, but with None as the first arg. class InternalReloadException(Exception): pass PK {Risapi/samples/UT Zx`Zx`ux PK ѳP'Wisapi/samples/advanced.pyUT l_Zx`ux # This extension demonstrates some advanced features of the Python ISAPI # framework. # We demonstrate: # * Reloading your Python module without shutting down IIS (eg, when your # .py implementation file changes.) # * Custom command-line handling - both additional options and commands. # * Using a query string - any part of the URL after a '?' is assumed to # be "variable names" separated by '&' - we will print the values of # these server variables. # * If the tail portion of the URL is "ReportUnhealthy", IIS will be # notified we are unhealthy via a HSE_REQ_REPORT_UNHEALTHY request. # Whether this is acted upon depends on if the IIS health-checking # tools are installed, but you should always see the reason written # to the Windows event log - see the IIS documentation for more. from isapi import isapicon from isapi.simple import SimpleExtension import sys, os, stat if hasattr(sys, "isapidllhandle"): import win32traceutil # Notes on reloading # If your HttpFilterProc or HttpExtensionProc functions raises # 'isapi.InternalReloadException', the framework will not treat it # as an error but instead will terminate your extension, reload your # extension module, re-initialize the instance, and re-issue the request. # The Initialize functions are called with None as their param. The # return code from the terminate function is ignored. # # This is all the framework does to help you. It is up to your code # when you raise this exception. This sample uses a Win32 "find # notification". Whenever windows tells us one of the files in the # directory has changed, we check if the time of our source-file has # changed, and set a flag. Next imcoming request, we check the flag and # raise the special exception if set. # # The end result is that the module is automatically reloaded whenever # the source-file changes - you need take no further action to see your # changes reflected in the running server. # The framework only reloads your module - if you have libraries you # depend on and also want reloaded, you must arrange for this yourself. # One way of doing this would be to special case the import of these # modules. Eg: # -- # try: # my_module = reload(my_module) # module already imported - reload it # except NameError: # import my_module # first time around - import it. # -- # When your module is imported for the first time, the NameError will # be raised, and the module imported. When the ISAPI framework reloads # your module, the existing module will avoid the NameError, and allow # you to reload that module. from isapi import InternalReloadException import win32event, win32file, winerror, win32con, threading try: reload_counter += 1 except NameError: reload_counter = 0 # A watcher thread that checks for __file__ changing. # When it detects it, it simply sets "change_detected" to true. class ReloadWatcherThread(threading.Thread): def __init__(self): self.change_detected = False self.filename = __file__ if self.filename.endswith("c") or self.filename.endswith("o"): self.filename = self.filename[:-1] self.handle = win32file.FindFirstChangeNotification( os.path.dirname(self.filename), False, # watch tree? win32con.FILE_NOTIFY_CHANGE_LAST_WRITE) threading.Thread.__init__(self) def run(self): last_time = os.stat(self.filename)[stat.ST_MTIME] while 1: try: rc = win32event.WaitForSingleObject(self.handle, win32event.INFINITE) win32file.FindNextChangeNotification(self.handle) except win32event.error as details: # handle closed - thread should terminate. if details.winerror != winerror.ERROR_INVALID_HANDLE: raise break this_time = os.stat(self.filename)[stat.ST_MTIME] if this_time != last_time: print("Detected file change - flagging for reload.") self.change_detected = True last_time = this_time def stop(self): win32file.FindCloseChangeNotification(self.handle) # The ISAPI extension - handles requests in our virtual dir, and sends the # response to the client. class Extension(SimpleExtension): "Python advanced sample Extension" def __init__(self): self.reload_watcher = ReloadWatcherThread() self.reload_watcher.start() def HttpExtensionProc(self, ecb): # NOTE: If you use a ThreadPoolExtension, you must still perform # this check in HttpExtensionProc - raising the exception from # The "Dispatch" method will just cause the exception to be # rendered to the browser. if self.reload_watcher.change_detected: print("Doing reload") raise InternalReloadException url = ecb.GetServerVariable("UNICODE_URL") if url.endswith("ReportUnhealthy"): ecb.ReportUnhealthy("I'm a little sick") ecb.SendResponseHeaders("200 OK", "Content-Type: text/html\r\n\r\n", 0) print("", file=ecb) qs = ecb.GetServerVariable("QUERY_STRING") if qs: queries = qs.split("&") print("
    ", file=ecb)
                for q in queries:
                    val = ecb.GetServerVariable(q, '<no such variable>')
                    print("%s=%r" % (q, val), file=ecb)
                print("

    ", file=ecb) print("This module has been imported", file=ecb) print("%d times" % (reload_counter,), file=ecb) print("", file=ecb) ecb.close() return isapicon.HSE_STATUS_SUCCESS def TerminateExtension(self, status): self.reload_watcher.stop() # The entry points for the ISAPI extension. def __ExtensionFactory__(): return Extension() # Our special command line customization. # Pre-install hook for our virtual directory. def PreInstallDirectory(params, options): # If the user used our special '--description' option, # then we override our default. if options.description: params.Description = options.description # Post install hook for our entire script def PostInstall(params, options): print() print("The sample has been installed.") print("Point your browser to /AdvancedPythonSample") print("If you modify the source file and reload the page,") print("you should see the reload counter increment") # Handler for our custom 'status' argument. def status_handler(options, log, arg): "Query the status of something" print("Everything seems to be fine!") custom_arg_handlers = {"status": status_handler} if __name__=='__main__': # If run from the command-line, install ourselves. from isapi.install import * params = ISAPIParameters(PostInstall = PostInstall) # Setup the virtual directories - this is a list of directories our # extension uses - in this case only 1. # Each extension has a "script map" - this is the mapping of ISAPI # extensions. sm = [ ScriptMapParams(Extension="*", Flags=0) ] vd = VirtualDirParameters(Name="AdvancedPythonSample", Description = Extension.__doc__, ScriptMaps = sm, ScriptMapUpdate = "replace", # specify the pre-install hook. PreInstall = PreInstallDirectory ) params.VirtualDirs = [vd] # Setup our custom option parser. from optparse import OptionParser parser = OptionParser('') # blank usage, so isapi sets it. parser.add_option("", "--description", action="store", help="custom description to use for the virtual directory") HandleCommandLine(params, opt_parser=parser, custom_arg_handlers = custom_arg_handlers) PK ѳP}Kooisapi/samples/redirector.pyUT l_Zx`ux # This is a sample ISAPI extension written in Python. # # Please see README.txt in this directory, and specifically the # information about the "loader" DLL - installing this sample will create # "_redirector.dll" in the current directory. The readme explains this. # Executing this script (or any server config script) will install the extension # into your web server. As the server executes, the PyISAPI framework will load # this module and create your Extension and Filter objects. # This is the simplest possible redirector (or proxy) we can write. The # extension installs with a mask of '*' in the root of the site. # As an added bonus though, we optionally show how, on IIS6 and later, we # can use HSE_ERQ_EXEC_URL to ignore certain requests - in IIS5 and earlier # we can only do this with an ISAPI filter - see redirector_with_filter for # an example. If this sample is run on IIS5 or earlier it simply ignores # any excludes. from isapi import isapicon, threaded_extension import sys import traceback try: from urllib.request import urlopen except ImportError: # py3k spelling... from urllib.request import urlopen import win32api # sys.isapidllhandle will exist when we are loaded by the IIS framework. # In this case we redirect our output to the win32traceutil collector. if hasattr(sys, "isapidllhandle"): import win32traceutil # The site we are proxying. proxy = "http://www.python.org" # Urls we exclude (ie, allow IIS to handle itself) - all are lowered, # and these entries exist by default on Vista... excludes = ["/iisstart.htm", "/welcome.png"] # An "io completion" function, called when ecb.ExecURL completes... def io_callback(ecb, url, cbIO, errcode): # Get the status of our ExecURL httpstatus, substatus, win32 = ecb.GetExecURLStatus() print("ExecURL of %r finished with http status %d.%d, win32 status %d (%s)" % ( url, httpstatus, substatus, win32, win32api.FormatMessage(win32).strip())) # nothing more to do! ecb.DoneWithSession() # The ISAPI extension - handles all requests in the site. class Extension(threaded_extension.ThreadPoolExtension): "Python sample Extension" def Dispatch(self, ecb): # Note that our ThreadPoolExtension base class will catch exceptions # in our Dispatch method, and write the traceback to the client. # That is perfect for this sample, so we don't catch our own. #print 'IIS dispatching "%s"' % (ecb.GetServerVariable("URL"),) url = ecb.GetServerVariable("URL").decode("ascii") for exclude in excludes: if url.lower().startswith(exclude): print("excluding %s" % url) if ecb.Version < 0x60000: print("(but this is IIS5 or earlier - can't do 'excludes')") else: ecb.IOCompletion(io_callback, url) ecb.ExecURL(None, None, None, None, None, isapicon.HSE_EXEC_URL_IGNORE_CURRENT_INTERCEPTOR) return isapicon.HSE_STATUS_PENDING new_url = proxy + url print("Opening %s" % new_url) fp = urlopen(new_url) headers = fp.info() # subtle py3k breakage: in py3k, str(headers) has normalized \r\n # back to \n and also stuck an extra \n term. py2k leaves the # \r\n from the server in tact and finishes with a single term. if sys.version_info < (3,0): header_text = str(headers) + "\r\n" else: # take *all* trailing \n off, replace remaining with # \r\n, then add the 2 trailing \r\n. header_text = str(headers).rstrip('\n').replace('\n', '\r\n') + '\r\n\r\n' ecb.SendResponseHeaders("200 OK", header_text, False) ecb.WriteClient(fp.read()) ecb.DoneWithSession() print("Returned data from '%s'" % (new_url,)) return isapicon.HSE_STATUS_SUCCESS # The entry points for the ISAPI extension. def __ExtensionFactory__(): return Extension() if __name__=='__main__': # If run from the command-line, install ourselves. from isapi.install import * params = ISAPIParameters() # Setup the virtual directories - this is a list of directories our # extension uses - in this case only 1. # Each extension has a "script map" - this is the mapping of ISAPI # extensions. sm = [ ScriptMapParams(Extension="*", Flags=0) ] vd = VirtualDirParameters(Name="/", Description = Extension.__doc__, ScriptMaps = sm, ScriptMapUpdate = "replace" ) params.VirtualDirs = [vd] HandleCommandLine(params) PK ѳPiu  "isapi/samples/redirector_asynch.pyUT l_Zx`ux # This is a sample ISAPI extension written in Python. # This is like the other 'redirector' samples, but uses asnch IO when writing # back to the client (it does *not* use asynch io talking to the remote # server!) from isapi import isapicon, threaded_extension import sys import traceback import urllib.request, urllib.parse, urllib.error # sys.isapidllhandle will exist when we are loaded by the IIS framework. # In this case we redirect our output to the win32traceutil collector. if hasattr(sys, "isapidllhandle"): import win32traceutil # The site we are proxying. proxy = "http://www.python.org" # We synchronously read chunks of this size then asynchronously write them. CHUNK_SIZE=8192 # The callback made when IIS completes the asynch write. def io_callback(ecb, fp, cbIO, errcode): print("IO callback", ecb, fp, cbIO, errcode) chunk = fp.read(CHUNK_SIZE) if chunk: ecb.WriteClient(chunk, isapicon.HSE_IO_ASYNC) # and wait for the next callback to say this chunk is done. else: # eof - say we are complete. fp.close() ecb.DoneWithSession() # The ISAPI extension - handles all requests in the site. class Extension(threaded_extension.ThreadPoolExtension): "Python sample proxy server - asynch version." def Dispatch(self, ecb): print('IIS dispatching "%s"' % (ecb.GetServerVariable("URL"),)) url = ecb.GetServerVariable("URL") new_url = proxy + url print("Opening %s" % new_url) fp = urllib.request.urlopen(new_url) headers = fp.info() ecb.SendResponseHeaders("200 OK", str(headers) + "\r\n", False) # now send the first chunk asynchronously ecb.ReqIOCompletion(io_callback, fp) chunk = fp.read(CHUNK_SIZE) if chunk: ecb.WriteClient(chunk, isapicon.HSE_IO_ASYNC) return isapicon.HSE_STATUS_PENDING # no data - just close things now. ecb.DoneWithSession() return isapicon.HSE_STATUS_SUCCESS # The entry points for the ISAPI extension. def __ExtensionFactory__(): return Extension() if __name__=='__main__': # If run from the command-line, install ourselves. from isapi.install import * params = ISAPIParameters() # Setup the virtual directories - this is a list of directories our # extension uses - in this case only 1. # Each extension has a "script map" - this is the mapping of ISAPI # extensions. sm = [ ScriptMapParams(Extension="*", Flags=0) ] vd = VirtualDirParameters(Name="/", Description = Extension.__doc__, ScriptMaps = sm, ScriptMapUpdate = "replace" ) params.VirtualDirs = [vd] HandleCommandLine(params) PK ѳP'isapi/samples/redirector_with_filter.pyUT l_Zx`ux # This is a sample configuration file for an ISAPI filter and extension # written in Python. # # Please see README.txt in this directory, and specifically the # information about the "loader" DLL - installing this sample will create # "_redirector_with_filter.dll" in the current directory. The readme explains # this. # Executing this script (or any server config script) will install the extension # into your web server. As the server executes, the PyISAPI framework will load # this module and create your Extension and Filter objects. # This sample provides sample redirector: # It is implemented by a filter and an extension, so that some requests can # be ignored. Compare with 'redirector_simple' which avoids the filter, but # is unable to selectively ignore certain requests. # The process is sample uses is: # * The filter is installed globally, as all filters are. # * A Virtual Directory named "python" is setup. This dir has our ISAPI # extension as the only application, mapped to file-extension '*'. Thus, our # extension handles *all* requests in this directory. # The basic process is that the filter does URL rewriting, redirecting every # URL to our Virtual Directory. Our extension then handles this request, # forwarding the data from the proxied site. # For example: # * URL of "index.html" comes in. # * Filter rewrites this to "/python/index.html" # * Our extension sees the full "/python/index.html", removes the leading # portion, and opens and forwards the remote URL. # This sample is very small - it avoid most error handling, etc. It is for # demonstration purposes only. from isapi import isapicon, threaded_extension from isapi.simple import SimpleFilter import sys import traceback import urllib.request, urllib.parse, urllib.error # sys.isapidllhandle will exist when we are loaded by the IIS framework. # In this case we redirect our output to the win32traceutil collector. if hasattr(sys, "isapidllhandle"): import win32traceutil # The site we are proxying. proxy = "http://www.python.org" # The name of the virtual directory we install in, and redirect from. virtualdir = "/python" # The key feature of this redirector over the simple redirector is that it # can choose to ignore certain responses by having the filter not rewrite them # to our virtual dir. For this sample, we just exclude the IIS help directory. # The ISAPI extension - handles requests in our virtual dir, and sends the # response to the client. class Extension(threaded_extension.ThreadPoolExtension): "Python sample Extension" def Dispatch(self, ecb): # Note that our ThreadPoolExtension base class will catch exceptions # in our Dispatch method, and write the traceback to the client. # That is perfect for this sample, so we don't catch our own. #print 'IIS dispatching "%s"' % (ecb.GetServerVariable("URL"),) url = ecb.GetServerVariable("URL") if url.startswith(virtualdir): new_url = proxy + url[len(virtualdir):] print("Opening", new_url) fp = urllib.request.urlopen(new_url) headers = fp.info() ecb.SendResponseHeaders("200 OK", str(headers) + "\r\n", False) ecb.WriteClient(fp.read()) ecb.DoneWithSession() print("Returned data from '%s'!" % (new_url,)) else: # this should never happen - we should only see requests that # start with our virtual directory name. print("Not proxying '%s'" % (url,)) # The ISAPI filter. class Filter(SimpleFilter): "Sample Python Redirector" filter_flags = isapicon.SF_NOTIFY_PREPROC_HEADERS | \ isapicon.SF_NOTIFY_ORDER_DEFAULT def HttpFilterProc(self, fc): #print "Filter Dispatch" nt = fc.NotificationType if nt != isapicon.SF_NOTIFY_PREPROC_HEADERS: return isapicon.SF_STATUS_REQ_NEXT_NOTIFICATION pp = fc.GetData() url = pp.GetHeader("url") #print "URL is '%s'" % (url,) prefix = virtualdir if not url.startswith(prefix): new_url = prefix + url print("New proxied URL is '%s'" % (new_url,)) pp.SetHeader("url", new_url) # For the sake of demonstration, show how the FilterContext # attribute is used. It always starts out life as None, and # any assignments made are automatically decref'd by the # framework during a SF_NOTIFY_END_OF_NET_SESSION notification. if fc.FilterContext is None: fc.FilterContext = 0 fc.FilterContext += 1 print("This is request number %d on this connection" % fc.FilterContext) return isapicon.SF_STATUS_REQ_HANDLED_NOTIFICATION else: print("Filter ignoring URL '%s'" % (url,)) # Some older code that handled SF_NOTIFY_URL_MAP. #~ print "Have URL_MAP notify" #~ urlmap = fc.GetData() #~ print "URI is", urlmap.URL #~ print "Path is", urlmap.PhysicalPath #~ if urlmap.URL.startswith("/UC/"): #~ # Find the /UC/ in the physical path, and nuke it (except #~ # as the path is physical, it is \) #~ p = urlmap.PhysicalPath #~ pos = p.index("\\UC\\") #~ p = p[:pos] + p[pos+3:] #~ p = r"E:\src\pyisapi\webroot\PyTest\formTest.htm" #~ print "New path is", p #~ urlmap.PhysicalPath = p # The entry points for the ISAPI extension. def __FilterFactory__(): return Filter() def __ExtensionFactory__(): return Extension() if __name__=='__main__': # If run from the command-line, install ourselves. from isapi.install import * params = ISAPIParameters() # Setup all filters - these are global to the site. params.Filters = [ FilterParameters(Name="PythonRedirector", Description=Filter.__doc__), ] # Setup the virtual directories - this is a list of directories our # extension uses - in this case only 1. # Each extension has a "script map" - this is the mapping of ISAPI # extensions. sm = [ ScriptMapParams(Extension="*", Flags=0) ] vd = VirtualDirParameters(Name=virtualdir[1:], Description = Extension.__doc__, ScriptMaps = sm, ScriptMapUpdate = "replace" ) params.VirtualDirs = [vd] HandleCommandLine(params) PK ѳPY~ isapi/samples/test.pyUT l_Zx`ux # This extension is used mainly for testing purposes - it is not # designed to be a simple sample, but instead is a hotch-potch of things # that attempts to exercise the framework. from isapi import isapicon from isapi.simple import SimpleExtension import sys, os, stat if hasattr(sys, "isapidllhandle"): import win32traceutil # We use the same reload support as 'advanced.py' demonstrates. from isapi import InternalReloadException import win32event, win32file, winerror, win32con, threading # A watcher thread that checks for __file__ changing. # When it detects it, it simply sets "change_detected" to true. class ReloadWatcherThread(threading.Thread): def __init__(self): self.change_detected = False self.filename = __file__ if self.filename.endswith("c") or self.filename.endswith("o"): self.filename = self.filename[:-1] self.handle = win32file.FindFirstChangeNotification( os.path.dirname(self.filename), False, # watch tree? win32con.FILE_NOTIFY_CHANGE_LAST_WRITE) threading.Thread.__init__(self) def run(self): last_time = os.stat(self.filename)[stat.ST_MTIME] while 1: try: rc = win32event.WaitForSingleObject(self.handle, win32event.INFINITE) win32file.FindNextChangeNotification(self.handle) except win32event.error as details: # handle closed - thread should terminate. if details.winerror != winerror.ERROR_INVALID_HANDLE: raise break this_time = os.stat(self.filename)[stat.ST_MTIME] if this_time != last_time: print("Detected file change - flagging for reload.") self.change_detected = True last_time = this_time def stop(self): win32file.FindCloseChangeNotification(self.handle) def TransmitFileCallback(ecb, hFile, cbIO, errCode): print("Transmit complete!") ecb.close() # The ISAPI extension - handles requests in our virtual dir, and sends the # response to the client. class Extension(SimpleExtension): "Python test Extension" def __init__(self): self.reload_watcher = ReloadWatcherThread() self.reload_watcher.start() def HttpExtensionProc(self, ecb): # NOTE: If you use a ThreadPoolExtension, you must still perform # this check in HttpExtensionProc - raising the exception from # The "Dispatch" method will just cause the exception to be # rendered to the browser. if self.reload_watcher.change_detected: print("Doing reload") raise InternalReloadException if ecb.GetServerVariable("UNICODE_URL").endswith("test.py"): file_flags = win32con.FILE_FLAG_SEQUENTIAL_SCAN | win32con.FILE_FLAG_OVERLAPPED hfile = win32file.CreateFile(__file__, win32con.GENERIC_READ, 0, None, win32con.OPEN_EXISTING, file_flags, None) flags = isapicon.HSE_IO_ASYNC | isapicon.HSE_IO_DISCONNECT_AFTER_SEND | \ isapicon.HSE_IO_SEND_HEADERS # We pass hFile to the callback simply as a way of keeping it alive # for the duration of the transmission try: ecb.TransmitFile(TransmitFileCallback, hfile, int(hfile), "200 OK", 0, 0, None, None, flags) except: # Errors keep this source file open! hfile.Close() raise else: # default response ecb.SendResponseHeaders("200 OK", "Content-Type: text/html\r\n\r\n", 0) print("", file=ecb) print("The root of this site is at", ecb.MapURLToPath("/"), file=ecb) print("", file=ecb) ecb.close() return isapicon.HSE_STATUS_SUCCESS def TerminateExtension(self, status): self.reload_watcher.stop() # The entry points for the ISAPI extension. def __ExtensionFactory__(): return Extension() # Our special command line customization. # Pre-install hook for our virtual directory. def PreInstallDirectory(params, options): # If the user used our special '--description' option, # then we override our default. if options.description: params.Description = options.description # Post install hook for our entire script def PostInstall(params, options): print() print("The sample has been installed.") print("Point your browser to /PyISAPITest") # Handler for our custom 'status' argument. def status_handler(options, log, arg): "Query the status of something" print("Everything seems to be fine!") custom_arg_handlers = {"status": status_handler} if __name__=='__main__': # If run from the command-line, install ourselves. from isapi.install import * params = ISAPIParameters(PostInstall = PostInstall) # Setup the virtual directories - this is a list of directories our # extension uses - in this case only 1. # Each extension has a "script map" - this is the mapping of ISAPI # extensions. sm = [ ScriptMapParams(Extension="*", Flags=0) ] vd = VirtualDirParameters(Name="PyISAPITest", Description = Extension.__doc__, ScriptMaps = sm, ScriptMapUpdate = "replace", # specify the pre-install hook. PreInstall = PreInstallDirectory ) params.VirtualDirs = [vd] # Setup our custom option parser. from optparse import OptionParser parser = OptionParser('') # blank usage, so isapi sets it. parser.add_option("", "--description", action="store", help="custom description to use for the virtual directory") HandleCommandLine(params, opt_parser=parser, custom_arg_handlers = custom_arg_handlers) PK Y03K!8isapi/samples/README.txtUT  YZx`ux In this directory you will find examples of ISAPI filters and extensions. The filter loading mechanism works like this: * IIS loads the special Python "loader" DLL. This DLL will generally have a leading underscore as part of its name. * This loader DLL looks for a Python module, by removing the first letter of the DLL base name. This means that an ISAPI extension module consists of 2 key files - the loader DLL (eg, "_MyIISModule.dll", and a Python module (which for this example would be "MyIISModule.py") When you install an ISAPI extension, the installation code checks to see if there is a loader DLL for your implementation file - if one does not exist, or the standard loader is different, it is copied and renamed accordingly. We use this mechanism to provide the maximum separation between different Python extensions installed on the same server - otherwise filter order and other tricky IIS semantics would need to be replicated. Also, each filter gets its own thread-pool, etc. PK {R isapi/doc/UT Zx`Zx`ux PK Y03KY@@isapi/doc/isapi.htmlUT  Yux  Introduction to Python ISAPI support

    Introduction to Python ISAPI support

    See also

    Note: if you are viewing this documentation directly from disk, most links in this document will fail - you can also find this document in the CHM file that comes with pywin32, where the links will work

    Introduction

    This documents Python support for hosting ISAPI exensions and filters inside Microsoft Internet Information Server (IIS). It assumes a basic understanding of the ISAPI filter and extension mechanism.

    In summary, to implement a filter or extension, you provide a Python module which defines a Filter and/or Extension class. Once your class has been loaded, IIS/ISAPI will, via an extension DLL, call methods on your class.

    A filter and a class instance need only provide 3 methods - for filters they are called GetFilterVersion, HttpFilterProc and TerminateFilter. For extensions they are named GetExtensionVersion, HttpExtensionProc and TerminateExtension. If you are familiar with writing ISAPI extensions in C/C++, these names and their purpose will be familiar.

    Most of the work is done in the HttpFilterProc and HttpExtensionProc methods. These both take a single parameter - an HTTP_FILTER_CONTEXT and EXTENSION_CONTROL_BLOCK object respectively.

    In addition to these components, there is an 'isapi' package, containing support facilities (base-classes, exceptions, etc) which can be leveraged by the extension.

    Base classes

    There are a number of base classes provided to make writing extensions a little simpler. Of particular note is isapi.threaded_extension.ThreadPoolExtension. This implements a thread-pool and informs IIS that the request is progressing in the background. Your sub-class need only provide a Dispatch method, which is called on one of the worker threads rather than the thread that the request came in on.

    There is base-class for a filter in isapi.simple, but there is no equivilent threaded filter - filters work under a different model, where background processing is not possible.

    Samples

    Please see the isapi/samples directory for some sample filters and extensions.

    Implementation

    A Python ISAPI filter extension consists of 2 main components:
    • A DLL used by ISAPI to interface with Python.
    • A Python script used by that DLL to implement the filter or extension functionality

    Extension DLL

    The DLL is usually managed automatically by the isapi.install module. As the Python script for the extension is installed, a generic DLL provided with the isapi package is installed next to the script, and IIS configured to use this DLL.

    The name of the DLL always has the same base name as the Python script, but with a leading underscore (_), and an extension of .dll. For example, the sample "redirector.py" will, when installed, have "_redirector.dll" created in the same directory.

    The Python script may provide 2 entry points - methods named __FilterFactory__ and __ExtensionFactory__, both taking no arguments and returning a filter or extension object.

    Using py2exe and the isapi package

    You can instruct py2exe to create a 'frozen' Python ISAPI filter/extension. In this case, py2exe will create a package with everything you need in one directory, and the Python source file embedded in the .zip file.

    In general, you will want to build a seperate installation executable along with the ISAPI extension. This executable will be built from the same script. See the ISAPI sample in the py2exe distribution. PK Y03KpCCisapi/README.txtUT  YZx`ux A Python ISAPI extension. Contributed by Phillip Frantz, and is Copyright 2002-2003 by Blackdog Software Pty Ltd. See the 'samples' directory, and particularly samples\README.txt You can find documentation in the PyWin32.chm file that comes with pywin32 - you can open this from Pythonwin->Help, or from the start menu.PK ѳPzixkkisapi/install.pyUT l_Zx`ux """Installation utilities for Python ISAPI filters and extensions.""" # this code adapted from "Tomcat JK2 ISAPI redirector", part of Apache # Created July 2004, Mark Hammond. import sys, os, imp, shutil, stat import operator from win32com.client import GetObject, Dispatch from win32com.client.gencache import EnsureModule, EnsureDispatch import win32api import pythoncom import winerror import traceback _APP_INPROC = 0 _APP_OUTPROC = 1 _APP_POOLED = 2 _IIS_OBJECT = "IIS://LocalHost/W3SVC" _IIS_SERVER = "IIsWebServer" _IIS_WEBDIR = "IIsWebDirectory" _IIS_WEBVIRTUALDIR = "IIsWebVirtualDir" _IIS_FILTERS = "IIsFilters" _IIS_FILTER = "IIsFilter" _DEFAULT_SERVER_NAME = "Default Web Site" _DEFAULT_HEADERS = "X-Powered-By: Python" _DEFAULT_PROTECTION = _APP_POOLED # Default is for 'execute' only access - ie, only the extension # can be used. This can be overridden via your install script. _DEFAULT_ACCESS_EXECUTE = True _DEFAULT_ACCESS_READ = False _DEFAULT_ACCESS_WRITE = False _DEFAULT_ACCESS_SCRIPT = False _DEFAULT_CONTENT_INDEXED = False _DEFAULT_ENABLE_DIR_BROWSING = False _DEFAULT_ENABLE_DEFAULT_DOC = False _extensions = [ext for ext, _, _ in imp.get_suffixes()] is_debug_build = '_d.pyd' in _extensions this_dir = os.path.abspath(os.path.dirname(__file__)) class FilterParameters: Name = None Description = None Path = None Server = None # Params that control if/how AddExtensionFile is called. AddExtensionFile = True AddExtensionFile_Enabled = True AddExtensionFile_GroupID = None # defaults to Name AddExtensionFile_CanDelete = True AddExtensionFile_Description = None # defaults to Description. def __init__(self, **kw): self.__dict__.update(kw) class VirtualDirParameters: Name = None # Must be provided. Description = None # defaults to Name AppProtection = _DEFAULT_PROTECTION Headers = _DEFAULT_HEADERS Path = None # defaults to WWW root. Type = _IIS_WEBVIRTUALDIR AccessExecute = _DEFAULT_ACCESS_EXECUTE AccessRead = _DEFAULT_ACCESS_READ AccessWrite = _DEFAULT_ACCESS_WRITE AccessScript = _DEFAULT_ACCESS_SCRIPT ContentIndexed = _DEFAULT_CONTENT_INDEXED EnableDirBrowsing = _DEFAULT_ENABLE_DIR_BROWSING EnableDefaultDoc = _DEFAULT_ENABLE_DEFAULT_DOC DefaultDoc = None # Only set in IIS if not None ScriptMaps = [] ScriptMapUpdate = "end" # can be 'start', 'end', 'replace' Server = None def __init__(self, **kw): self.__dict__.update(kw) def is_root(self): "This virtual directory is a root directory if parent and name are blank" parent, name = self.split_path() return not parent and not name def split_path(self): return split_path(self.Name) class ScriptMapParams: Extension = None Module = None Flags = 5 Verbs = "" # Params that control if/how AddExtensionFile is called. AddExtensionFile = True AddExtensionFile_Enabled = True AddExtensionFile_GroupID = None # defaults to Name AddExtensionFile_CanDelete = True AddExtensionFile_Description = None # defaults to Description. def __init__(self, **kw): self.__dict__.update(kw) def __str__(self): "Format this parameter suitable for IIS" items = [self.Extension, self.Module, self.Flags] # IIS gets upset if there is a trailing verb comma, but no verbs if self.Verbs: items.append(self.Verbs) items = [str(item) for item in items] return ','.join(items) class ISAPIParameters: ServerName = _DEFAULT_SERVER_NAME # Description = None Filters = [] VirtualDirs = [] def __init__(self, **kw): self.__dict__.update(kw) verbose = 1 # The level - 0 is quiet. def log(level, what): if verbose >= level: print(what) # Convert an ADSI COM exception to the Win32 error code embedded in it. def _GetWin32ErrorCode(com_exc): hr = com_exc.hresult # If we have more details in the 'excepinfo' struct, use it. if com_exc.excepinfo: hr = com_exc.excepinfo[-1] if winerror.HRESULT_FACILITY(hr) != winerror.FACILITY_WIN32: raise return winerror.SCODE_CODE(hr) class InstallationError(Exception): pass class ItemNotFound(InstallationError): pass class ConfigurationError(InstallationError): pass def FindPath(options, server, name): if name.lower().startswith("iis://"): return name else: if name and name[0] != "/": name = "/"+name return FindWebServer(options, server)+"/ROOT"+name def LocateWebServerPath(description): """ Find an IIS web server whose name or comment matches the provided description (case-insensitive). >>> LocateWebServerPath('Default Web Site') # doctest: +SKIP or >>> LocateWebServerPath('1') #doctest: +SKIP """ assert len(description) >= 1, "Server name or comment is required" iis = GetObject(_IIS_OBJECT) description = description.lower().strip() for site in iis: # Name is generally a number, but no need to assume that. site_attributes = [getattr(site, attr, "").lower().strip() for attr in ("Name", "ServerComment")] if description in site_attributes: return site.AdsPath msg = "No web sites match the description '%s'" % description raise ItemNotFound(msg) def GetWebServer(description = None): """ Load the web server instance (COM object) for a given instance or description. If None is specified, the default website is retrieved (indicated by the identifier 1. """ description = description or "1" path = LocateWebServerPath(description) server = LoadWebServer(path) return server def LoadWebServer(path): try: server = GetObject(path) except pythoncom.com_error as details: msg = details.strerror if exc.excepinfo and exc.excepinfo[2]: msg = exc.excepinfo[2] msg = "WebServer %s: %s" % (path, msg) raise ItemNotFound(msg) return server def FindWebServer(options, server_desc): """ Legacy function to allow options to define a .server property to override the other parameter. Use GetWebServer instead. """ # options takes precedence server_desc = options.server or server_desc # make sure server_desc is unicode (could be mbcs if passed in # sys.argv). if server_desc and not isinstance(server_desc, str): server_desc = server_desc.decode('mbcs') # get the server (if server_desc is None, the default site is acquired) server = GetWebServer(server_desc) return server.adsPath def split_path(path): """ Get the parent path and basename. >>> split_path('/') ['', ''] >>> split_path('') ['', ''] >>> split_path('foo') ['', 'foo'] >>> split_path('/foo') ['', 'foo'] >>> split_path('/foo/bar') ['/foo', 'bar'] >>> split_path('foo/bar') ['/foo', 'bar'] """ if not path.startswith('/'): path = '/' + path return path.rsplit('/', 1) def _CreateDirectory(iis_dir, name, params): # We used to go to lengths to keep an existing virtual directory # in place. However, in some cases the existing directories got # into a bad state, and an update failed to get them working. # So we nuke it first. If this is a problem, we could consider adding # a --keep-existing option. try: # Also seen the Class change to a generic IISObject - so nuke # *any* existing object, regardless of Class assert name.strip("/"), "mustn't delete the root!" iis_dir.Delete('', name) log(2, "Deleted old directory '%s'" % (name,)) except pythoncom.com_error: pass newDir = iis_dir.Create(params.Type, name) log(2, "Creating new directory '%s' in %s..." % (name,iis_dir.Name)) friendly = params.Description or params.Name newDir.AppFriendlyName = friendly # Note that the new directory won't be visible in the IIS UI # unless the directory exists on the filesystem. try: path = params.Path or iis_dir.Path newDir.Path = path except AttributeError: # If params.Type is IIS_WEBDIRECTORY, an exception is thrown pass newDir.AppCreate2(params.AppProtection) # XXX - note that these Headers only work in IIS6 and earlier. IIS7 # only supports them on the w3svc node - not even on individial sites, # let alone individual extensions in the site! if params.Headers: newDir.HttpCustomHeaders = params.Headers log(2, "Setting directory options...") newDir.AccessExecute = params.AccessExecute newDir.AccessRead = params.AccessRead newDir.AccessWrite = params.AccessWrite newDir.AccessScript = params.AccessScript newDir.ContentIndexed = params.ContentIndexed newDir.EnableDirBrowsing = params.EnableDirBrowsing newDir.EnableDefaultDoc = params.EnableDefaultDoc if params.DefaultDoc is not None: newDir.DefaultDoc = params.DefaultDoc newDir.SetInfo() return newDir def CreateDirectory(params, options): _CallHook(params, "PreInstall", options) if not params.Name: raise ConfigurationError("No Name param") parent, name = params.split_path() target_dir = GetObject(FindPath(options, params.Server, parent)) if not params.is_root(): target_dir = _CreateDirectory(target_dir, name, params) AssignScriptMaps(params.ScriptMaps, target_dir, params.ScriptMapUpdate) _CallHook(params, "PostInstall", options, target_dir) log(1, "Configured Virtual Directory: %s" % (params.Name,)) return target_dir def AssignScriptMaps(script_maps, target, update='replace'): """Updates IIS with the supplied script map information. script_maps is a list of ScriptMapParameter objects target is an IIS Virtual Directory to assign the script maps to update is a string indicating how to update the maps, one of ('start', 'end', or 'replace') """ # determine which function to use to assign script maps script_map_func = '_AssignScriptMaps' + update.capitalize() try: script_map_func = eval(script_map_func) except NameError: msg = "Unknown ScriptMapUpdate option '%s'" % update raise ConfigurationError(msg) # use the str method to format the script maps for IIS script_maps = [str(s) for s in script_maps] # call the correct function script_map_func(target, script_maps) target.SetInfo() def get_unique_items(sequence, reference): "Return items in sequence that can't be found in reference." return tuple([item for item in sequence if item not in reference]) def _AssignScriptMapsReplace(target, script_maps): target.ScriptMaps = script_maps def _AssignScriptMapsEnd(target, script_maps): unique_new_maps = get_unique_items(script_maps, target.ScriptMaps) target.ScriptMaps = target.ScriptMaps + unique_new_maps def _AssignScriptMapsStart(target, script_maps): unique_new_maps = get_unique_items(script_maps, target.ScriptMaps) target.ScriptMaps = unique_new_maps + target.ScriptMaps def CreateISAPIFilter(filterParams, options): server = FindWebServer(options, filterParams.Server) _CallHook(filterParams, "PreInstall", options) try: filters = GetObject(server+"/Filters") except pythoncom.com_error as exc: # Brand new sites don't have the '/Filters' collection - create it. # Any errors other than 'not found' we shouldn't ignore. if winerror.HRESULT_FACILITY(exc.hresult) != winerror.FACILITY_WIN32 or \ winerror.HRESULT_CODE(exc.hresult) != winerror.ERROR_PATH_NOT_FOUND: raise server_ob = GetObject(server) filters = server_ob.Create(_IIS_FILTERS, "Filters") filters.FilterLoadOrder = "" filters.SetInfo() # As for VirtualDir, delete an existing one. assert filterParams.Name.strip("/"), "mustn't delete the root!" try: filters.Delete(_IIS_FILTER, filterParams.Name) log(2, "Deleted old filter '%s'" % (filterParams.Name,)) except pythoncom.com_error: pass newFilter = filters.Create(_IIS_FILTER, filterParams.Name) log(2, "Created new ISAPI filter...") assert os.path.isfile(filterParams.Path) newFilter.FilterPath = filterParams.Path newFilter.FilterDescription = filterParams.Description newFilter.SetInfo() load_order = [b.strip() for b in filters.FilterLoadOrder.split(",") if b] if filterParams.Name not in load_order: load_order.append(filterParams.Name) filters.FilterLoadOrder = ",".join(load_order) filters.SetInfo() _CallHook(filterParams, "PostInstall", options, newFilter) log (1, "Configured Filter: %s" % (filterParams.Name,)) return newFilter def DeleteISAPIFilter(filterParams, options): _CallHook(filterParams, "PreRemove", options) server = FindWebServer(options, filterParams.Server) ob_path = server+"/Filters" try: filters = GetObject(ob_path) except pythoncom.com_error as details: # failure to open the filters just means a totally clean IIS install # (IIS5 at least has no 'Filters' key when freshly installed). log(2, "ISAPI filter path '%s' did not exist." % (ob_path,)) return try: assert filterParams.Name.strip("/"), "mustn't delete the root!" filters.Delete(_IIS_FILTER, filterParams.Name) log(2, "Deleted ISAPI filter '%s'" % (filterParams.Name,)) except pythoncom.com_error as details: rc = _GetWin32ErrorCode(details) if rc != winerror.ERROR_PATH_NOT_FOUND: raise log(2, "ISAPI filter '%s' did not exist." % (filterParams.Name,)) # Remove from the load order load_order = [b.strip() for b in filters.FilterLoadOrder.split(",") if b] if filterParams.Name in load_order: load_order.remove(filterParams.Name) filters.FilterLoadOrder = ",".join(load_order) filters.SetInfo() _CallHook(filterParams, "PostRemove", options) log (1, "Deleted Filter: %s" % (filterParams.Name,)) def _AddExtensionFile(module, def_groupid, def_desc, params, options): group_id = params.AddExtensionFile_GroupID or def_groupid desc = params.AddExtensionFile_Description or def_desc try: ob = GetObject(_IIS_OBJECT) ob.AddExtensionFile(module, params.AddExtensionFile_Enabled, group_id, params.AddExtensionFile_CanDelete, desc) log(2, "Added extension file '%s' (%s)" % (module, desc)) except (pythoncom.com_error, AttributeError) as details: # IIS5 always fails. Probably should upgrade this to # complain more loudly if IIS6 fails. log(2, "Failed to add extension file '%s': %s" % (module, details)) def AddExtensionFiles(params, options): """Register the modules used by the filters/extensions as a trusted 'extension module' - required by the default IIS6 security settings.""" # Add each module only once. added = {} for vd in params.VirtualDirs: for smp in vd.ScriptMaps: if smp.Module not in added and smp.AddExtensionFile: _AddExtensionFile(smp.Module, vd.Name, vd.Description, smp, options) added[smp.Module] = True for fd in params.Filters: if fd.Path not in added and fd.AddExtensionFile: _AddExtensionFile(fd.Path, fd.Name, fd.Description, fd, options) added[fd.Path] = True def _DeleteExtensionFileRecord(module, options): try: ob = GetObject(_IIS_OBJECT) ob.DeleteExtensionFileRecord(module) log(2, "Deleted extension file record for '%s'" % module) except (pythoncom.com_error, AttributeError) as details: log(2, "Failed to remove extension file '%s': %s" % (module, details)) def DeleteExtensionFileRecords(params, options): deleted = {} # only remove each .dll once. for vd in params.VirtualDirs: for smp in vd.ScriptMaps: if smp.Module not in deleted and smp.AddExtensionFile: _DeleteExtensionFileRecord(smp.Module, options) deleted[smp.Module] = True for filter_def in params.Filters: if filter_def.Path not in deleted and filter_def.AddExtensionFile: _DeleteExtensionFileRecord(filter_def.Path, options) deleted[filter_def.Path] = True def CheckLoaderModule(dll_name): suffix = "" if is_debug_build: suffix = "_d" template = os.path.join(this_dir, "PyISAPI_loader" + suffix + ".dll") if not os.path.isfile(template): raise ConfigurationError( "Template loader '%s' does not exist" % (template,)) # We can't do a simple "is newer" check, as the DLL is specific to the # Python version. So we check the date-time and size are identical, # and skip the copy in that case. src_stat = os.stat(template) try: dest_stat = os.stat(dll_name) except os.error: same = 0 else: same = src_stat[stat.ST_SIZE]==dest_stat[stat.ST_SIZE] and \ src_stat[stat.ST_MTIME]==dest_stat[stat.ST_MTIME] if not same: log(2, "Updating %s->%s" % (template, dll_name)) shutil.copyfile(template, dll_name) shutil.copystat(template, dll_name) else: log(2, "%s is up to date." % (dll_name,)) def _CallHook(ob, hook_name, options, *extra_args): func = getattr(ob, hook_name, None) if func is not None: args = (ob,options) + extra_args func(*args) def Install(params, options): _CallHook(params, "PreInstall", options) for vd in params.VirtualDirs: CreateDirectory(vd, options) for filter_def in params.Filters: CreateISAPIFilter(filter_def, options) AddExtensionFiles(params, options) _CallHook(params, "PostInstall", options) def RemoveDirectory(params, options): if params.is_root(): return try: directory = GetObject(FindPath(options, params.Server, params.Name)) except pythoncom.com_error as details: rc = _GetWin32ErrorCode(details) if rc != winerror.ERROR_PATH_NOT_FOUND: raise log(2, "VirtualDirectory '%s' did not exist" % params.Name) directory = None if directory is not None: # Be robust should IIS get upset about unloading. try: directory.AppUnLoad() except: exc_val = sys.exc_info()[1] log(2, "AppUnLoad() for %s failed: %s" % (params.Name, exc_val)) # Continue trying to delete it. try: parent = GetObject(directory.Parent) parent.Delete(directory.Class, directory.Name) log (1, "Deleted Virtual Directory: %s" % (params.Name,)) except: exc_val = sys.exc_info()[1] log(1, "Failed to remove directory %s: %s" % (params.Name, exc_val)) def RemoveScriptMaps(vd_params, options): "Remove script maps from the already installed virtual directory" parent, name = vd_params.split_path() target_dir = GetObject(FindPath(options, vd_params.Server, parent)) installed_maps = list(target_dir.ScriptMaps) for _map in map(str, vd_params.ScriptMaps): if _map in installed_maps: installed_maps.remove(_map) target_dir.ScriptMaps = installed_maps target_dir.SetInfo() def Uninstall(params, options): _CallHook(params, "PreRemove", options) DeleteExtensionFileRecords(params, options) for vd in params.VirtualDirs: _CallHook(vd, "PreRemove", options) RemoveDirectory(vd, options) if vd.is_root(): # if this is installed to the root virtual directory, we can't delete it # so remove the script maps. RemoveScriptMaps(vd, options) _CallHook(vd, "PostRemove", options) for filter_def in params.Filters: DeleteISAPIFilter(filter_def, options) _CallHook(params, "PostRemove", options) # Patch up any missing module names in the params, replacing them with # the DLL name that hosts this extension/filter. def _PatchParamsModule(params, dll_name, file_must_exist = True): if file_must_exist: if not os.path.isfile(dll_name): raise ConfigurationError("%s does not exist" % (dll_name,)) # Patch up all references to the DLL. for f in params.Filters: if f.Path is None: f.Path = dll_name for d in params.VirtualDirs: for sm in d.ScriptMaps: if sm.Module is None: sm.Module = dll_name def GetLoaderModuleName(mod_name, check_module = None): # find the name of the DLL hosting us. # By default, this is "_{module_base_name}.dll" if hasattr(sys, "frozen"): # What to do? The .dll knows its name, but this is likely to be # executed via a .exe, which does not know. base, ext = os.path.splitext(mod_name) path, base = os.path.split(base) # handle the common case of 'foo.exe'/'foow.exe' if base.endswith('w'): base = base[:-1] # For py2exe, we have '_foo.dll' as the standard pyisapi loader - but # 'foo.dll' is what we use (it just delegates). # So no leading '_' on the installed name. dll_name = os.path.abspath(os.path.join(path, base + ".dll")) else: base, ext = os.path.splitext(mod_name) path, base = os.path.split(base) dll_name = os.path.abspath(os.path.join(path, "_" + base + ".dll")) # Check we actually have it. if check_module is None: check_module = not hasattr(sys, "frozen") if check_module: CheckLoaderModule(dll_name) return dll_name # Note the 'log' params to these 'builtin' args - old versions of pywin32 # didn't log at all in this function (by intent; anyone calling this was # responsible). So existing code that calls this function with the old # signature (ie, without a 'log' param) still gets the same behaviour as # before... def InstallModule(conf_module_name, params, options, log=lambda *args:None): "Install the extension" if not hasattr(sys, "frozen"): conf_module_name = os.path.abspath(conf_module_name) if not os.path.isfile(conf_module_name): raise ConfigurationError("%s does not exist" % (conf_module_name,)) loader_dll = GetLoaderModuleName(conf_module_name) _PatchParamsModule(params, loader_dll) Install(params, options) log(1, "Installation complete.") def UninstallModule(conf_module_name, params, options, log=lambda *args:None): "Remove the extension" loader_dll = GetLoaderModuleName(conf_module_name, False) _PatchParamsModule(params, loader_dll, False) Uninstall(params, options) log(1, "Uninstallation complete.") standard_arguments = { "install" : InstallModule, "remove" : UninstallModule, } def build_usage(handler_map): docstrings = [handler.__doc__ for handler in handler_map.values()] all_args = dict(zip(iter(handler_map.keys()), docstrings)) arg_names = "|".join(iter(all_args.keys())) usage_string = "%prog [options] [" + arg_names + "]\n" usage_string += "commands:\n" for arg, desc in all_args.items(): usage_string += " %-10s: %s" % (arg, desc) + "\n" return usage_string[:-1] def MergeStandardOptions(options, params): """ Take an options object generated by the command line and merge the values into the IISParameters object. """ pass # We support 2 ways of extending our command-line/install support. # * Many of the installation items allow you to specify "PreInstall", # "PostInstall", "PreRemove" and "PostRemove" hooks # All hooks are called with the 'params' object being operated on, and # the 'optparser' options for this session (ie, the command-line options) # PostInstall for VirtualDirectories and Filters both have an additional # param - the ADSI object just created. # * You can pass your own option parser for us to use, and/or define a map # with your own custom arg handlers. It is a map of 'arg'->function. # The function is called with (options, log_fn, arg). The function's # docstring is used in the usage output. def HandleCommandLine(params, argv=None, conf_module_name = None, default_arg = "install", opt_parser = None, custom_arg_handlers = {}): """Perform installation or removal of an ISAPI filter or extension. This module handles standard command-line options and configuration information, and installs, removes or updates the configuration of an ISAPI filter or extension. You must pass your configuration information in params - all other arguments are optional, and allow you to configure the installation process. """ global verbose from optparse import OptionParser argv = argv or sys.argv if not conf_module_name: conf_module_name = sys.argv[0] # convert to a long name so that if we were somehow registered with # the "short" version but unregistered with the "long" version we # still work (that will depend on exactly how the installer was # started) try: conf_module_name = win32api.GetLongPathName(conf_module_name) except win32api.error as exc: log(2, "Couldn't determine the long name for %r: %s" % (conf_module_name, exc)) if opt_parser is None: # Build our own parser. parser = OptionParser(usage='') else: # The caller is providing their own filter, presumably with their # own options all setup. parser = opt_parser # build a usage string if we don't have one. if not parser.get_usage(): all_handlers = standard_arguments.copy() all_handlers.update(custom_arg_handlers) parser.set_usage(build_usage(all_handlers)) # allow the user to use uninstall as a synonym for remove if it wasn't # defined by the custom arg handlers. all_handlers.setdefault('uninstall', all_handlers['remove']) parser.add_option("-q", "--quiet", action="store_false", dest="verbose", default=True, help="don't print status messages to stdout") parser.add_option("-v", "--verbosity", action="count", dest="verbose", default=1, help="increase the verbosity of status messages") parser.add_option("", "--server", action="store", help="Specifies the IIS server to install/uninstall on." \ " Default is '%s/1'" % (_IIS_OBJECT,)) (options, args) = parser.parse_args(argv[1:]) MergeStandardOptions(options, params) verbose = options.verbose if not args: args = [default_arg] try: for arg in args: handler = all_handlers[arg] handler(conf_module_name, params, options, log) except (ItemNotFound, InstallationError) as details: if options.verbose > 1: traceback.print_exc() print("%s: %s" % (details.__class__.__name__, details)) except KeyError: parser.error("Invalid arg '%s'" % arg) PK Y03Kz isapi/simple.pyUT  YZx`ux """Simple base-classes for extensions and filters. None of the filter and extension functions are considered 'optional' by the framework. These base-classes provide simple implementations for the Initialize and Terminate functions, allowing you to omit them, It is not necessary to use these base-classes - but if you don't, you must ensure each of the required methods are implemented. """ class SimpleExtension: "Base class for a simple ISAPI extension" def __init__(self): pass def GetExtensionVersion(self, vi): """Called by the ISAPI framework to get the extension version The default implementation uses the classes docstring to set the extension description.""" # nod to our reload capability - vi is None when we are reloaded. if vi is not None: vi.ExtensionDesc = self.__doc__ def HttpExtensionProc(self, control_block): """Called by the ISAPI framework for each extension request. sub-classes must provide an implementation for this method. """ raise NotImplementedError("sub-classes should override HttpExtensionProc") def TerminateExtension(self, status): """Called by the ISAPI framework as the extension terminates. """ pass class SimpleFilter: "Base class for a a simple ISAPI filter" filter_flags = None def __init__(self): pass def GetFilterVersion(self, fv): """Called by the ISAPI framework to get the extension version The default implementation uses the classes docstring to set the extension description, and uses the classes filter_flags attribute to set the ISAPI filter flags - you must specify filter_flags in your class. """ if self.filter_flags is None: raise RuntimeError("You must specify the filter flags") # nod to our reload capability - fv is None when we are reloaded. if fv is not None: fv.Flags = self.filter_flags fv.FilterDesc = self.__doc__ def HttpFilterProc(self, fc): """Called by the ISAPI framework for each filter request. sub-classes must provide an implementation for this method. """ raise NotImplementedError("sub-classes should override HttpExtensionProc") def TerminateFilter(self, status): """Called by the ISAPI framework as the filter terminates. """ pass PK $nQisapi/PyISAPI_loader.dllUT ^_ux MZ@ !L!This program cannot be run in DOS mode. $L⟰-̰-̰-̹U̺-̋sͲ-.Ḵ-̋sͲ-̋s͠-̋sͻ-̤KͲ-O͵-̰--sͶ-sͱ-ss̱-sͱ-Rich-PEL^_! nVp8@Х TH@.textln `.rdata34r@@.data @.gfidsL@@.rsrc@@.reloc  @B8j0jh88k ̹H8C̹$8C̹H8Ah|8]Y̡P8xtVt$Vԁ8^ËD$̋D$̋D$ uPЁ8Y̋D$tu D$%Ё8VFh8P8xt Vԁ8D$F^̋D$t j PWVt$~uD8hX80l8^t$ 88ff;uftfPf;Qufu3uFPȁ8^t$ V8^Wt$ 8|$ uD8h80l8_Vt$uH8hĉ80x8^_ù8Dff;uftfPf;Qufu3uWD$ PVFLЃt$|$ v <8hh80l8 ^_ËORIu^3_Vt$W܁8 ^_VF FFFFx8P8xt Vԁ8D$FAF A FApFAtF^̋At jPUVt$tFt jPUjVU^VWt$88f1f;2uftfAf;Bufu3uj8_^S\$8C0ff;uftfPf;Qufu3uv`ȁ8[_^ù8@ff;uftfPf;Qufu3uvdȁ8[_^ùԋ8ff;uftfPf;Qufu3uvhȁ8[_^ù8@ff;uftfPf;Qufu3uvlȁ8[_^ù8ff;uftfPf;Qufu3uvtvx́8[_^ù$8ǐff;uftfPf;Qufu3uv|ȁ8[_^ù<8ff;uftfPf;Qufu3uH8hL80l8[_^øp8ff;uftfOf;Hufu3uv8[_^t$S8[_^W|$u h8t$ 8Ⱥ8Vf0f;2uftfpf;rufu3^u!W8L$ AIt A 3_ø8fff;uftfQf;Pufu3u%PWGЃt*D$HtRP3_h8H80x8_̃D$D$ PD$D$PD$D$Pȟ8t$(D$8uËD$Vt$D$~tOW`8Nt$L$ Qt$pW\8_ujh88N^ËD$P8^̸ FQD$D$PD$D$ Ph08$ 8u SUVWh D$ jPUc$, t$( D$ @L$QQt$pЋȅuD$D$~ |uHD$3ۅÅ-p8Ճzud3 3PVD$8t3D$P$$ Vt$H؄u$ՃzuG}D$p8_^][ ÅuED$;t V8D$tD$_^][ jhH8 _^][ jt$h\88 uD$PVā8 t$V́8D$;t V8_^][ ̃ Ul$KE+8"E+ED$D$Phh8t$ 8 SVW`8t$VD$t$$NMT$$D$ RPqы\$ ;sJ+tFEt$ D$ PD$PqD$ ߃r+ut)t$t$\8ut$kNWhx8L _^[] ËD$tPt$jhG8́8t$+N_^[] áD8h`80x83] ̃Vt$$D$F8D$PD$ PD$PD$0PD$Ph8t$@8D$$D$D$D$39D$~D$tLW`8NjjL$QhpW\8_ujh8 ^áL8^L8áD8h`80x83^QVt$ D$Ftm8thD$Ph8t$8 tb~t8W`8t$NW\8_ujh$8k ^YáL8^L8YáD8h`80x83^YSW|$ 2ۅtoGtS8tNh8t$8tMtV`8OV\8^3ɄQ8_[áD8h`80x8_3[QW|$ D$G8t~D$Ph8t$8 txGV0 `8L$L$OjjL$QjpV\8GGL8^_L8YáD8h`80x83_YQh\8t$8uYVt$ t}Fta8t\W`8NjjL$QhpW\8_ujht8|^Yt$8^YáD8h`80x83^YQD$Wx?D$ Ph8t$8 D$ VHATt`8L$jD$ PQh1th`8L$Au Q8jL$ QPhwV\8uWh8w^_Yt$8^_Yq @8hă80l8 ^_YáD8h`80x83_Ỹ@D$j,jP[D$HPD$HPD$HPD$HPD$HPD$HPD$HPD$HPD$8PD$4PD$4PhH8$8@u@ËD$ 4$D$ ؁8u@8hd80l8@SjLH؃\$ L$T$ L$Vt$LSD$+8\$ ta@ tVW`8ND$ PW\8_u= jh8^[@áL8^[L8@^3[@p8[@̸GV$F8D$Ph8$8 Wht$ D$P8 Ƅ$D$ `8NjL$QL$QhpW\8_ujhІ8^ÍD$ Pȁ8^áD8h`80x83^Qh,8t$8uYVt$ t{Ft_8tZW`8NjjL$QhpW\8_ujh88^^Yt$8^YáD8h`80x83^YVt$Ft|8twD$Ph؂8t$8 tq~tHW`8Njjt$hpW\8_ujh8^áL8^L8áD8h`80x83^̃ D$WPD$fD$PD$PD$PD$PD$Phd8t$DD$(8 u áL89$9D$L$$VD$D$A0tXW`8jjD$PhvW\8_ujh8^ áL8^L8 3^ á<8ht80l8 ̃h8t$8uËD$ V@0tntjW`8jjD$PhvW\8_ujhԄ8^t$D$ PD$ Ph8d8^áD8h`80x83^QD$Vp6W|$D$PD$ D$Ph 8W8t8t$؁8u@8h 80l8_^YWVu_3^Y`8jjh(8hvW\8uVh@8_^YáL8_^L8YáD8h`80x83^YQ$$Php8t$8 uYËD$V@0tWtSW`8jjt$hvW\8_ujh8<^YáL8^L8YáD8h`80x83^YVW|$up8=8uEh8X8t%h8V88uVЁ8 D88t$ jWh,8d8tV58|8u VЁ8_3^̃=8u88uËD$Vp8t't$ V588 tu VЁ83^Ãu VЁ8^̃=8tAD$Vp8t)V588tt8u VЁ8^QSUVW8=8=8-Ё8uh8j0\$s׃uh8P/iP588uh<8P/=8:j?t]3j?Uw؅OAT-8WՃtWՃG WD$ՃuGL8t$$t$$PShĈ8d8uḧ8WjUt$T8 EuU-Ё8Ճ-Ё8uh8 uWՃh83hh8j.3-Ё8t uSՃuz=8\$=8t3s׋t%W588tt8uWՃjjjhsjjD$ D$ PjsV8_^][YUjh|8dPd%SVW8ujE=}tM3j=Ё8EWq؅uE upSh8d8Et]jPE 0T8 t=Ё8uP׃h8W-=Ё8EuP׃uSЁ8ӃЁ8} uPӃGuPӃjW=V8M d _^[]hh88hx88̋D$V8^̋D$D$A18YD$Vt jV[<^VFt jP;<D$t jV)<^D$Vt j V <^̋At 8táD8h`80x83Vu PЁ8Fu PЁ8jV;^̋L$jjQjp̋̋jjt$ hpЅ̋Vt$W|$VWt$pЋȅu ɉ_^ ~ |8uH_^ ́ $SQL$ D$QhD8p2Ѕt3D$~ 8\uHD$D$hT8P8[Ê[̋jjt$ hp̋jt$ t$ hpt$t$pЅ̋T$VWx@uj+ǍL$D$QRjp_^̋jPt$P8 ̋ D$A ̋jjt$ hpЅt$ t$ t$ p ̡P8xtVt$Vԁ8^ËD$̋D$̋D$ uPЁ8Y̋D$tu D$%Ё8VFH8P8xt Vԁ8D$F^̋D$t j P]8W|$uD8h80l8_St$8غ48VfDf1f;2uftfAf;Bufu3^uG08[_ù\8ff;uftfPf;Qufu3uGp8[_ùx8ff;uftfPf;Qufu3uG 8[_ù8Dff;uftfPf;Qufu3uGPȁ8[_áH8Sh80l8 [_S\${uD8hĒ80l8[W|$uH8h80x8_[Vt$88ff;uftfAf;Bufu3u/G@Tu p h48W8K^_A3[ù\8ff;uftfPf;Qufu3u/G@Tu p hh8uW8K^_ 3[ø8ff;uftfNf;Hufu3u]D$PW*Ѓt$|$v!hh8<80l8 ^_[ËK@RIu^_3[Wt$S܁8 ^_[VF8P8xt Vԁ8D$N Ft@BFBF^̋At j P4Vt$tFt j Pu4jVj4^t$88ff;uftfPf;Qufu3uD$@@DL8%8VW|$W8t$uH8hĕ80x8_^ù8ff;uftfPf;Qufu3u=D$ @8Gtu PЁ8;5L8u G3_^Éw3_^VWt$܁8 _^Vt$F = wotQ=t.==ubj 2D$tfV,^j 2D$tJV ^j 2D$t.VD ^=@t==tP<8hȓ80l8 3^j ]2D$tV^j A2D$tV^̃ D$D$PD$D$PD$D$ Ph8t$$8u ËD$VptK6W`8t$ L$ D$L$Pt$F VW\8_ujh8^ áL8^L8 ̃$D$PD$D$Ph 8t$8uVt$~tAW`8Nt$t$ QIW\8_ujh$8^áL8^L8̸ &1D$D$PD$D$ Ph88$ 8u SUVWh D$ jP5C$, t$( D$ @(L$QQt$P@ЋȅuD$D$~ |uHD$3ۅÅ-p8Ճz3 3PVD$8tZ$ HL$QVt$P@ЋȅuD$D$~ |uHD$3ۅÅumՃzuG}D$p8_^][ ÅuED$;t V8D$tD$_^][ jhP8_^][ jt$hd88 uD$PVā8 t$V́8D$;t V8_^][ ̃$PD$Php8t$8uVt$~uD8h80l8^W`8Njt$ t$jP@(W\8_ujh8^áL8^L8Q$Ph8t$8 uYVt$ ~uD8hȔ80l8^YW`8Njt$ jjQI(W\8_ujhܔ85^YáL8^L8YVFh8P8xt Vԁ8D$F^̋At uPЁ8Y̋A@@Vt$t!Ftu PЁ8j V6-^S\$WC@xu_3[t$8ȺL8Vf0f;2uftfpf;rufu3^u7ȁ8_[øT8ff;uftfQf;Pufu3uwȁ8_[t$S8_[Vt$WF@xt$8p8ff;uftfPf;Qufu3utt$F@Tu@8h80l8_^V88O;rIQP<8h80l8_^ËWNIRu_3^t$t$V܁8 _^VF88P8xt Vԁ8D$F^̋At uPЁ8Y̋A@̋A@@Vt$t!Ftu PЁ8j V*^VF8P8xt Vԁ8D$F^̋At uPЁ8Y̋A@̋A@@Vt$t!Ftu PЁ8j V*^VW|$ G@pu_3^t$8 8fDff;uftfPf;Qufu3u%uL8_^L8vṔ8_^t$W8_^UVW|$G@p(S\$S808ff;uftfPf;Qufu3uiL$A@Tu p @8h@80l8 [_^]Q88M$j_SUхt^[~_3^]p8[_^]t$SW܁8 [_^]_^3]VFX8P8xt Vԁ8D$F^̋At uPЁ8Y̋A@̋A@@Vt$t!Ftu PЁ8j V'^S\$WC@xu_3[t$8Ⱥx8Vf0f;2uftfpf;rufu3^u"uL8_[L8Pȁ8_[ø8ff;uftfQf;Pufu3uGt$S8_[S\$WC@xy8pt$8Ⱥ8Vf0f;2uftfpf;rufu3udt$F@Tup @8h80l8 ^_[V88O;r QhĎ8NIRu^_3[ø8ff;uftfQf;Pufu3wt$F@Tup @8h80l8 ^_[V88O ;rQh$8<80l8 ^_[ËWNIRu^_3[t$t$S܁8 ^_[_3[VF(8P8xt Vԁ8D$F^̋At uPЁ8Y̋A@@Vt$t!Ftu PЁ8j V$^SUl$ E@Xu]3[Wt$8\8Vf1f;2uftfAf;Bufu3^u3ȁ8_][ù|8ff;uftfPf;Qufu3usȁ8_][ù8@ff;uftfPf;Qufu3usȁ8_][ù8ff;uftfPf;Qufu3us ȁ8_][ùȏ8@ff;uftfPf;Qufu3usȁ8_][ù؏8ff;uftfPf;Qufu3usȁ8_][ù8@ff;uftfPf;Qufu3us8_][ø8ff;uftfOf;Hufu3us8_][t$U8_][̋D$SU@@hc[Wt$8 8Vf1f;2uftfAf;Bufu3uSt$F@Tu h@8V88K$xjWSы؅WFPS8 ]3^_][ù`8ff;uftfPf;Qufu3uSt$F@Tu h8-V88K$xjWSы؅<WFPS8 ]3^_][ù8ff;uftfPf;Qufu3uSt$F@Tu h8V88K$xjWSы؅WFPS8 ]3^_][ùԐ8ff;uftfPf;Qufu3uSt$F@Tu h8 V88K$xjWSы؅WFPS8 ] 3^_][ù8ff;uftfPf;Qufu3uSt$F@Tu h8}V88K$xjWSы؅WFPS8 ]3^_][ù,8ff;uftfPf;Qufu3u]t$F@Tu hD8V88K$xjWSы؅up8^_][WFPS8 ]3^_][ù`8ff;uftfPf;Qufu3u+L$A@Tuhx8]Q8E3^_][ø8ff;uftfOf;Hufu3uAL$A@Tuh8@80l8^_][Q8E3^_][^_][%܁8]3[VW|$up8=8uEh8X8t%h8V88uVЁ8 D88t$ jWh8d8tV58|8u VЁ8_3^̸ &$D$ PD$ D$Ph8$ 8u Ë$ SV@@X0t|W`8 D$PD$Pt$VW\8_t!D$ tHPD$Ṕ8^[ ËD$uPh8^[ D$^[ ^3[ QD$SV@@X0totkD$PD$ Ph8t$ 8tKW`8t$Kt$VW\8_ujh8^[YáL8^[L8Y^3[YQD$SV@@X0totkD$PD$ Ph8t$ 8tKW`8t$Kt$VW\8_ujh8r^[YáL8^[L8Y^3[YV58hH8h8hh8h88h8hX8h(8փ^D$Vt j V^VFtu PЁ8D$t j Ve^VFtu PЁ8D$t j V%^D$Vt j V^VFt j PD$t jV^VFtu PЁ8D$t j V^VFtu PЁ8D$t j VU^VFtu PЁ8D$t j V^t$t$P@̋A̋T$tT$tAT$ tA ̋Vt$W|$VWt$P@Ћȅu ɉ_^ ~ |8uH_^ t$t$t$t$P@(̋D$ uPЁ8Y̋D$tu D$%Ё8Vh88^h8(8Ujh|8dPd%QSh8E8 8=8EVW 8t 8 88=8u VV8t8588Vh88 tu VЁ8h8X8t#h8V88u VЁ8W8_8^h8$8M[d ]Sh88؃u2[VW|$Nffu+vjh$8W8 uVWā8u_^2[U-,83SՃ~(VS(8jPW48;8tSFՃ;|WjS$8 ]u WЁ8_^[́= 8Vt 89h$P58,8jD$Pj$jP8D$hPV8 ^AAA AAAAVW|$ 1u_^D$ΉFD$FD$F D$j~ q_^V5Ё8WGt uPփGt uPփGt uPփ_^QD$S08V3Wt8tL$ QP8jӃu_^[YËG@TujӃCx \$Wt$D$8P8U-t8Vh̗8d8D$sVs u3jt$6T8 t$muhЗ8V VPjs4sC%sCjh8Cd8VjSVD$t$uh8VVWt$ ]u WЁ8_^[YËD$tt AA AV4 VP[u3^jt$6T8 ^Ujh|8dPd%SVW8us EX8t+}t!W}8Eu PЁ8u.s h8hP5PjWtcCtu PЁ8j3W8 Cu)3h@8hPPju WЁ8{V8Md _^[]Udjh|8Pd%SVW} ك?tMd _^[]8u CEuD8hx80x82'uP8uh8P6?V8Md _^[]̃SUV5p8WօtPu38l$48UhH8Ӄt Whh8Ӄ 8t 8t8V8t$4UnjPUA Q8L$(D$8D$ D$8D$$jjQD$4hpЋˍQAu+ʉL$4L$4jQSpЅtU8ʍYAu+ˉL$0L$0jQRpЋύQAu+ʉL$4L$4jQWpЅl$8EljD$D$Pjhjt W8_^][ÃV5p8WօtP3S8\$Sh88 8t 8t8\$ Ę8EljD$D$ Pjhj7[t W8V8_^̋D$VP 8^1$8̋D$t$ D$ L$ Qt$ pЋD$ ̸8̍D$Pjt$t$t$pQ8Ht$jt$t$t$pQ8Ht$t$t$t$t$WpQ8HVh8u^jhVht$jh88~|0 uD0|0 uD0^̋D$P@u+VP8tt$h8V ^́$hP5848jjD$PD$ P$P8L$Qffu+tf|L\u3fDL $QDffu+ʍT$SVrffu+EP8؃tSL$Ӌ+IfD fuT$ffuW+֍{fGfuʃ_^[V5 8j8t-jt$jt$jt$ jt$$V8V8^3^̋D$ uPЁ8Y̋D$tu D$%Ё8Vt$W3F@TtV8t$F@Tup <8h80l8 _3^S\$t V88Vh8[tu WЁ8_^́D$hjPW =8hD$ P5848f|$uhT808Ë 8VW8$ffu$+փDfGfuʍD$jPjhjjjʍ$4Ph 8u`L$Q@ffu58+ PD$Pjjh8t$jD$D$Pjjh 8t$t$8_8^t$t$t$jt$pQ8H̍D$ Pjt$jt$pQ8HW58|$ H8585858hH8uhd8083_SV8j t WY3Ph8jhH8Cu#h8P/2V8^[_;=L8u.G@TtW8hț8j2ۃu WЁ8V8^[_UVW8jtL$3jWqESUh8jhH8I؃uh8C@TtS8h8WEЁ8u UСЁ8t uSЃ[V8_^]V8_^]SVW8t$h\8jhH8؃uh`8P|3O;L8u1C@TtS8h8j:3u SЁ8H8V8_^[̃ SVW8D$D$ D$ D$D$$jD$L$ Q؅Sh8jh$8uD$ h8P(D$,/;=L8t*G@Tt W8D$ h,8PU-Ё8CuSՃt uWՃ|$$uD$ @t uPՃ|$(]D$ h8PV8_^[ U5,8l$ $85(85$8E 5 8hH8u3]SVW8j t U3Ph8jh$8\؃u#h8P3V8_^[];L8u =C@Tt S8t hԜ8j3u SЁ8V8_^[]SVW8t$hl8jh$8؃uhp8P3O;L8u1C@TtS8h8j3u SЁ8$8V8_^[̋D$̋D$ uPЁ8Y̋D$tu D$%Ё8ht$h 88 |$8̡8|$DD$8 ̋D$D$AD$ A A%8%8%8%8% 8%8%8%8%8%܁8%؁8%ԁ8%Ё8%́8%ȁ8%ā8%8%8%8%8%8%8%8%8%8%8%8%8%|8%x8%t8%p8%l8%8%d8%`8%\8%X8%T8%88%48%08%,8%(8%$8% 8%8%8%8%8% 8%8%8%8%8%8%8%h8%8UuYu}u# uYt]Uu, Y]U] QL$+#ȋ%;r Y$-UD83E]UD8j Y+ȋE3D8]UEM ]C PTYUEVH<AQAk(;tM ;J r BB ;r (;u3^]ËUEu2]ùMZf9uH<ȁ9PEu f9A]d u2dVp8P;t3u2^ð^ ts PYt2}jYu2uU u} uuMPu UuuYY]t ht8 Y>j+Y%U}u8u2]u jY]U Vutu|st*u&ht8Yt2Wh8mYDD8uWt8j Y+ȃ3D8EEE8EEuE_^]jjh8 eMZf98u]<88PEuL f98u>E8+PQgYYt'x$|!EE3Ɂ8ËeE2 Ubt}u 3p8]U=8t} uuuYY]UD83t8uȃu4 ht8YY#E]UD838ȃu]uh8YY]UuYH]UE t3t tt3@0L&uuY}PY] jh8NjzYu3lE]e=l8tjl8te] hw86 $Vw8% $8h8YYu)1t h8h8 YYl82ۈ]EDL>tVYtu ju6S83@Ê]uYj h8<83OH8ZEe=l8tj %l8EjuYY3Ʉ!uZYj h 8} u9=83et t]1]SWuuSWuuSWuuu"uSPuSVuSVu`tuHSWuout5SWu:$MQ0hm8uu uËe3uEUV5|8u3@uu u^] U]U} u uu u ] UaaEA8]UVuX8^]aaA88UVu%8^]aaAȞ88UVF8 `PEPw YY^]UE8aaA]A8PH YÍA8P7 YÍA8P& YUVF8P EYt j VsYY^]UVF8P EYt j VFYY^]UVF8P EYt j VYY^]U Mh<8EP U Mh8EPj ̋Au8u U%8(S3C 48j me3 483VW8}S[wOW E؋MEineIE5ntel ȋEj5Genu XjYS[wOW uCE%?=t#=`t=pt=Pt=`t=pu=8=8=8}EEEEE|2jX3S[]؉sKS EܩEEt =8_^tm 488tUtN3ЉEUEM3Ƀu3u/488E 48t 8483[]3@39H8U$SVj5tM)3hVP58f |xffftfpflfhEEDž@jPEVPE E@EE@8VXۍEEۉEH8EPD8u !8^[]UDjDEjPm EPL8EtEj X]3jP8ȅu2øMZf9uA<8PEu f9HuۃxtvՃhu8H8UE8csmu%xu@= t=!t="t =@t3]b̃%8%8hv8d5D$l$l$+SVWD81E3PeuEEEEdËMd Y__^[]QUuuu uhx8hD8=]UeeD8VWN@;t t У@8fEP`8E3EE\81EX81EEPT8ME3M3M3;uO@u G ȉ D8щ @8_^]h8d8h8Yø8CHHHHø8SV88;sW>t t׃;r_^[SV88;sW>t I׃;r_^[8UEV8t j VKYY^]Ë 83 x8; D8u(UjH8uD8h h8Pl8]U$jtjY)8 88858=8f8f 8f8f8f%8f-88E8E8E88888 88jXkǀ8jXk D8LjX @8Lh8]Uj]Uj tM)8 88858=8f8f 8f8f8f%8f-88E8E8E8888 88jXkM8h8]U j<tM)8 88858=8f8f 8f8f8f%8f-88E8E8E8888 8} v }ue } vE HE E @8jXkM8eE@EE;E sEMU 8h8]%p8%8% 8%$8%(8%,8%08%48%88%<8%@8%D8%H8%L8%P8%T8%X8%\8%`8%d8%h8%l8%8%8%8%|8%x8%8%8%8%8%8%8%8%8%8%8%8%8%8%܀8%8%8%8%8%8%Ā8%Ȁ8%̀8%Ѐ8%Ԁ8%؀8ðððð3̍M88&̍M8Mx8M T8̹H8ȩ.F^vʯ4FZtаX>&n *αֱnȲ(BT6ıڮ ʭzbR>,Ҭ¬~fƮ<* Ϋ0~jzhXRB0ΪtZL@0F x88@808 8s|O:GetServerVariableGetServerVariableUNICODE_|l:ReadClientReadClients#s#|i:SendResponseHeadersServerSupportFunction(HSE_REQ_SEND_RESPONSE_HEADER_EX)i:SetFlushFlagServerSupportFunction(HSE_REQ_SET_FLUSH_FLAG)s:RedirectServerSupportFunction(HSE_REQ_SEND_URL_REDIRECT_RESP):GetImpersonationTokenServerSupportFunction(HSE_REQ_GET_IMPERSONATION_TOKEN)O:GetImpersonationTokenmust pass a string or unicode object (got %s)ServerSupportFunction(HSE_REQ_GET_IMPERSONATION_TOKEN):IsKeepConnServerSupportFunction(HSE_REQ_IS_KEEP_CONN)zzzOOi:ExecURLinfo and entity params must be NoneServerSupportFunction(HSE_REQ_EXEC_URL):GetExecURLStatusServerSupportFunction(HSE_REQ_GET_EXEC_URL_STATUS)HHkO|O:IOCompletionfirst param must be callableServerSupportFunction(HSE_REQ_IO_COMPLETION)|z:ReportUnhealthyServerSupportFunction(HSE_REQ_REPORT_UNHEALTHY)NOiiisapi\src\PyExtensionObjects.cppTransmitFile callback failedisapi\src\PyExtensionObjects.cppisapi\src\PyExtensionObjects.cppOOKsiiz#z#i:TransmitFileCallback is not callableServerSupportFunction(HSE_REQ_TRANSMIT_FILE):IsKeepAlives:MapURLToPathServerSupportFunction(HSE_REQ_MAP_URL_TO_PATH)|i:DoneWithSessionisapiExtensionError(izs)isapi\src\PyExtensionObjects.cppc:\src\python-3.8\include\object.hisapi\src\PyExtensionObjects.cppisapi\src\PyExtensionObjects.cppisapi\src\PyExtensionObjects.cppCallback when no callback map existsFailed to create map key from connection IDFailed to locate map entry for this commIDFailed to create Python oject for ECBObject in callback map not a tuple of correct size?(OOkk)Failed to build callback argsisapi\src\PyExtensionObjects.cppCallback failedisapi\src\PyExtensionObjects.cppHSE_VERSION_INFOVERSION_INFO structure no longer existsExtensionDescVERSION_INFO structure no longer existscan't delete VERSION_INFO attributesExtensionDescString is too long - max of %d charsVersionTotalBytesAvailableBytesHttpStatusCodewriteWriteClientGetServerVariableReadClientSendResponseHeadersSetFlushFlagTransmitFileMapURLToPathDoneWithSessioncloseRedirectIsKeepAliveGetAnonymousTokenGetImpersonationTokenIsKeepConnExecURLGetExecURLStatusIOCompletionReportUnhealthyEXTENSION_CONTROL_BLOCKsoftspaceMethodQueryStringPathInfoPathTranslatedAvailableDataContentTypeLogDataLogData attribute can only be setConnIDcan't delete ECB attributesHttpStatusCodeLogDatas#|l:WriteClientcan't modify read only ECB attributes only HTTPStatusCode and LogData can be changed.WriteClientHTTP_CONNECTIONkeep-aliveInvalid ECB (DoneWithSession has been called)ss:SetHeaderSetHeaderss:AddHeaderAddHeaderGetHeaderSetHeaderAddHeaderHTTP_FILTER_PREPROC_HEADERSHTTP_FILTER_RAW_DATAInDataInDataInData must be a string (got %s)HTTP_FILTER_AUTHENTUserPasswordUserUser must be a string (got %s)The value is too long - max size is %dPasswordPassword must be a string (got %s)The value is too long - max size is %dHTTP_FILTER_LOGClientHostNameClientUserNameServerNameOperationTargetParametersHttpStatusWin32StatusClientHostNameClientHostName must be a stringClientUserNameClientUserName must be a stringServerNameServerName must be a stringOperationOperation must be a stringTargetTarget must be a stringParametersParameters must be a stringHttpStatusHttpStatus must be an integerWin32StatusWin32Status must be an integerc:\src\python-3.8\include\object.hHTTP_FILTER_VERSIONFILTER_VERSION structure no longer existsServerFilterVersionFilterVersionFlagsFilterDescPyFILTER_VERSION has no attribute '%s'FILTER_VERSION structure no longer existscan't delete FILTER_VERSION attributesFilterVersionFilterVersion must be an int (got %s)FlagsFlags must be an int (got %s)FilterDescString is too long - max of %d charsDon't understand data of type 0x%xs#|l:WriteClientWriteClients|l:AddResponseHeadersAddResponseHeaderss|O:GetServerVariableGetServerVariableUNICODE_zz:SendResponseHeaderNo filtercontext!SendResponseHeaderl:DisableNotificationsNo filtercontext!DisableNotificationsGetDataGetServerVariableWriteClientAddResponseHeaderswriteSendResponseHeaderDisableNotificationsRevisionfIsSecurePortNotificationTypeHTTP_FILTER_CONTEXTFilterContextcan't delete ECB attributesFilterContextisapiFilterError(izs)isapi\src\PyFilterObjects.cppHTTP_FILTER_URL_MAPURLPhysicalPathPhysicalPathPhysicalPath must be a stringThe string is too long - got %d chars, but max is %ds|O:GetHeaderGetHeaderisapi\src\PythonEng.cppFailed to import callback module '%s'Factory function '%s' failedisapi\src\PythonEng.cppThe handler failed to loadFailed to locate the callbackisapi\src\PythonEng.cpp(i)Terminating for reload failed(z)Reinitializing after import failedisapi\src\PythonEng.cpp
    Last Windows error:Internal Extension Error: %s Last Windows error: %s 200 OKContent-type: text/html n/aInternal Filter Error: %s n/ac:\src\python-3.8\include\object.hisapidllhandleisapiInternalReloadExceptionpath\\?\c:\src\python-3.8\include\object.hISAPI Filter or ExtensionExpected a string object (got %s)Python ISAPI Error

    An Error occured while processing your request

    %s GetModuleFileNameW failed!EventMessageFileSYSTEM\CurrentControlSet\Services\EventLog\Application\TypesSupportedc:\src\python-3.8\include\object.hUnable to load Python handler(N)Extension version function failed!Filter init should return an int, or None(N)HttpExtensionProc function failed!HttpExtensionProc should return an intisapi\src\pyISAPI.cpp(i)Extension term function failed!Extension term should return an int, or None(N)Filter version function failed!Filter init should return an int, or NoneOut of memory!(O)Filter function failed!Filter should return an int, or Noneisapi\src\pyISAPI.cpp(i)Filter version function failed!Filter term should return an int, or Nonec:\src\python-3.8\include\object.h__ExtensionFactory__GetExtensionVersionHttpExtensionProcTerminateExtension__FilterFactory__GetFilterVersionHttpFilterProcTerminateFilter8r8wr8Unknown exception8q8wr8bad allocation88q8wr8bad array new length8w888^_W^_ <<^_ PP\D8Р88h88ȟ8П8h8@8L8888П8L8@88L8\8l88П88@L888888@8v||||RSDS {"0ֵH|wC:\src\pywin32\build\temp.win32-3.8\Release\PyISAPI_loader.pdb!`.text$di`0l.text$mn|`.text$x| .text$yd.idata$5.00cfg.CRT$XCA.CRT$XCU.CRT$XCZ.CRT$XIA.CRT$XIZ .CRT$XPA$.CRT$XPZ(.CRT$XTA,.CRT$XTZ0t.rdata,.rdata$rР.rdata$sxdata.rdata$zzzdbg.rtc$IAA.rtc$IZZ.rtc$TAA.rtc$TZZ.xdata$xХ.edata.idata$2.idata$3.idata$4. .idata$6L .dataL|.data$r.bssL.gfids$y`.rsrc$01``.rsrc$02|8"8|8|8|8"<8"D8"L8l8l8n8Vo8+p8Jp8q8L8X8t8L8 p8h8 :q8q888X8t88 q8^_H80a e@bc@g@c@f@^[oƦ֦PyISAPI_loader.dllGetExtensionVersionGetFilterVersionHttpExtensionProcHttpFilterProcPyISAPISetOptionsTerminateExtensionTerminateFilterWriteEventLogMessage"Ч,x4XVLvlȩ.F^vʯ4FZtаX>&n *αֱnȲ(BT6ıڮ ʭzbR>,Ҭ¬~fƮ<* Ϋ0~jzhXRB0ΪtZL@0FDeregisterEventSourceRegisterEventSourceWReportEventA[RegCloseKeydRegCreateKeyExWRegSetValueExWADVAPI32.dllKPyType_ReadyoPyObject_GetAttrStringiPyObject_GenericGetAttrkPyObject_GenericSetAttr;PyCallable_Checkz_PyTraceMalloc_NewReference_Py_Dealloc.PyBytes_FromStringAndSize-PyBytes_FromStringPyUnicode_FromWideChar{PyUnicode_AsUnicodePyLong_FromLongPyLong_AsLongPyLong_FromVoidPtrPyBool_FromLong@PyTuple_SizePyDict_NewPyDict_GetItemPyDict_SetItemPyDict_DelItemrPyGILState_EnsuretPyGILState_ReleasePyErr_SetObjectPyErr_SetStringPyErr_ClearPyErr_NoMemoryPyErr_FormatC_PyArg_ParseTuple_SizeT_Py_BuildValue_SizeTPyEval_SaveThreadPyEval_RestoreThreadPyImport_ImportModuleUPyObject_CallE_Py_tracemalloc_config_Py_NoneStructPyExc_AttributeError'PyExc_RuntimeError1PyExc_TypeError9PyExc_ValueError0PyBytes_SizePyObject_RichCompare=PyTuple_NewPyList_SizePyList_GetItemPyList_InsertPyErr_OccurredPyErr_ExceptionMatches _Py_VaBuildValue_SizeTPyErr_PrintPy_Initialize Py_IsInitializedPyEval_InitThreadsPySys_GetObject PySys_SetObject PySys_WriteStderrPyImport_ReloadModule"_PyObject_CallMethod_SizeT_Py_TrueStruct%PyBytes_AsStringzPyUnicode_AsUTF8Stringpython38.dll]GetLastErrorYInitializeCriticalSection/EnterCriticalSectionLeaveCriticalSectionDeleteCriticalSectionoGetModuleFileNameAOutputDebugStringWpGetModuleFileNameWFormatMessageAIsProcessorFeaturePresentzIsDebuggerPresentUnhandledExceptionFiltereSetUnhandledExceptionFilterGetStartupInfoWtGetModuleHandleWFQueryPerformanceCounterGetCurrentProcessIdGetCurrentThreadIdGetSystemTimeAsFileTime^InitializeSListHeadGetCurrentProcessTerminateProcessKERNEL32.dll__CxxFrameHandler3Hmemset!__std_exception_copy"__std_exception_destroy_CxxThrowException5_except_handler4_common%__std_type_info_destroy_listVCRUNTIME140.dllstrncmpstrncpyfreereallocwcsncmp_splitpath __stdio_common_vsprintf8_wsplitpathmalloc_callnewh*_stricmpA_seh_filter_dll_configure_narrow_argv5_initialize_narrow_environment6_initialize_onexit_table>_register_onexit_function$_execute_onexit_table_crt_atexit_crt_at_quick_exit_cexit8_initterm9_initterm_ejterminateapi-ms-win-crt-string-l1-1-0.dllapi-ms-win-crt-heap-l1-1-0.dllapi-ms-win-crt-filesystem-l1-1-0.dllapi-ms-win-crt-stdio-l1-1-0.dllapi-ms-win-crt-runtime-l1-1-0.dll08 88D8T8D8 @8`88d8`8l8`8x8 8888p880#880 8̊8!8܊88888p88 8 88 8`888"8D8#8L8$8`8%8p8&8888p8888ȍ8@L8ԍ80M88M88 ?8@?8?8d8 PA8A8PB8L8 `D8D8G8d8p88 8 0818288688@88868878086888@:8L8:884848P588888 ;8 <8<88 `>8H808X888 8 848H8\8l8DN@8.?AVbad_alloc@std@@8.?AVexception@std@@8.?AVbad_array_new_length@std@@8.?AVtype_info@@6GJNPNWN]TULZ[4   8Ph `4DT%1 %1 The pyISAPI filter encountered an error. %n%1 %nThe last windows error was: %2 The pyISAPI extension encountered an error. %n%1 %nThe last windows error was: %2 The pyISAPI extension failed to initialize. %n%1 %nThe last windows error was: %2 4VS_VERSION_INFO,,?tStringFileInfoP040904E4`$Commentshttps://github.com/mhammond/pywin32"CompanyName*FileDescription4 FileVersion3.8.300.0FInternalNamePyISAPI_loader.dll&LegalCopyright*LegalTrademarksNOriginalFilenamePyISAPI_loader.dll0ProductNamePyWin328 ProductVersion3.8.300.0DVarFileInfo$Translation PADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPAD40 00!010A0K0q0000001l1q1y111111 222,21292G2222233$3333 4J4V44444$505m5y5555566G6Y6z66666E7J7R7777778E8R889D9b99999994:>:R:::!;';G;L;T;;;;<-5>>>E>J>R>b>l>>>>>>>>9?C?f???????? h0000y0000000101F1Y1b1t11111&252P2`2e2m2222222 333O3Y3m33333333 44*4g4444444444565E5g5m5z55555556 6-6>6Q6^6o6x66666666 77#7*7/777\7d7l7r7777777777777788'8-8@8S8r8888888888899"909<999999::$:-:F:O:a:z::::::;0;e;;;;;;;<>>?0$0#0\00000 111)131w1111 22X2c2i2q2222222223+3?3333344<4V4[4h444B5K5Y5i5n5v555556667%7E7k7z77777788#8+8e8r88!999999::%:M:W:r:w::::::::;;;&;3;S;b;r;z;;;;;<>x>>>>>(?^?f?????@$ 00Y0^0f0x0000001h1111112B2v22222223g3l3t333333334?4x44445:5F555556 6Z6f6666687B77777 8,8Q8c88888@9L9q9999::`:l::::::;R;W;_;q;;;;;;;;;;;;<<<$<3%>6>?>S>X>_>f>m>t>{>>>???P("0,1S1b1j111111111111122#2)21272J2R2X2f2m2u22222222 33)3A3U3_3h333333333445g5v555555-6:6c6667%7:7S7g7|77777 8<8l888888889"9(979B9L9R9Y99999Y::::::::::;;\;t;;;"P>u>|>>>>? ??+?7?M?|???????`-0M0c00000131<1B1H1T1Y1g1m1{111111122%2E22222222 3$3E3P3W3j3}3333333@4G4^4t44444 5#5,52585E5J5b555555566(6E6P6W6j6}666666 737J7P7_7q7777777777777788888 8&8,82888>8D8J8P8V8\8b8h8n8t8z888888888888888888888889 999999z:=;n;;;;;;<6>/>@>Q>V>o>t>>>>>??*?h?z?p40g000011/151E1n1111112L2i222222J3S3[333333444+4_4 5)535D5j55556616N66666666 787@7K7Q7W7c7777777788 868?8J8Q8q8w8}8888888888888888889 99,9<9E9x9~9999999999999999999 ::!:H:N:T:Z:`:f:m:t:{:::::::::::::;0;7;F;L;R;X;^;d;j;p;v;|;;;;;;;;;;;;;;;;;;;;;;<< <<<<$<*<0<6<<>>>>>>>>>>>>???????????h 000040D0H0X0\0`0d0l000000004 4@4H4P4\44444454585@5H5P5T5\5p5x55555555500(0<0t000081<1H1L1X1\1h1l1x1|111111111111111112 222(2,282<2H2L2X2\2222222H3L3X3\3h3l33333d4p44445@5p5t55 6 6T6`66677(7,787<7H7L7X7\7h7l7x7|77777 88t8888D9P99: ::::: :$:(:,:L:h:::PK Y03K pythoncom.pyUT  YZx`ux # Magic utility that "redirects" to pythoncomxx.dll import pywintypes pywintypes.__import_pywin32_system_module__("pythoncom", globals()) PK {R pythonwin/UT Zx`Zx`ux PK $nQ!@@pythonwin/scintilla.dllUT ^_ux MZ@ !L!This program cannot be run in DOS mode. $GS_&_&_&:@P&:@&:@J&dxL&dxC&dxP&:@T&_&&x?&x^&x^&x^&Rich_&PEL^_! 4?,P@\ xPx` 3@`@P4.text24 `.rdataP8@@.data-@.gfids@@@.rsrcxP@@.reloc 3`4 @Bh?kYjhdah9h0bh4jT&cSh?=Yjh8bjhLbhQ@j&8Sh'?YjhXbh]LhbhHj=& Sh2?Yjhbjh8chOj" 'Rh=?Yjh'Qh?Yjhfh&hhhjB'Qh?}Yjh gh@hhhjK,(uQh?OYjhfhZhhhjC (GQh?!YjhhjhihjL(Qh?YjhpihhihjAl(Ph?YjhjhPhlhֲj-(Ph?YjhjhPhlhj.(Ph?lYjhlh4h mhjP(dPh?>Yjh(mjh4mh+j(9Ph?YjhJhZA Yjh{h?h{hjY.JheA Yjh{hUh|h@j+/IhpA Yjh|jh }hcjM8/Ih{A Yjh(}jh,hj /IhAf Yjh4}hh4hj<0^IhA8 Yjh4}jhTh7j \/3IhA Yjh4}jh`hwj/IhA Yjh4}jhHhwj /HhA Yjjjhhhj/HhA Yjh4}jh<hQjZ0HhAd Yjh4}hh@hGj |/\HhA6 Yjhphhh j\0.HhA Yjhhhhkj3|0HhA Yjhh:hhjj0GhA Yjh hFh(hCjR0GhA~ Yjh0hNhhHj'0vGh BP Yjh hSh@hQjX0HGhB" YjhLhC[hdhUj*1Gh BYjhphqfhhG]j*<1Fh+BYjhhohhhj\1Fh6BYjhh yhhjujV|1FhABjYjhhhh!{jG1bFhLB<Yjhh3hh7j14FhWBYjjhhhDj!1 FhbBYjhĄjhh7jH1EhmBYjhhhhhj;2EhxBYjhpjhhjN<2EhB_Yjhhhhj\2WEhB1YjhhhDhjF|2)EhBYjhLjhh+j2DhBYjhhrhhj12DhBYjhhEhhj2DhB|YjhhEhhj2tDhBNYjhh hhj83FDhB YjhhhЋh j@<3DhBYjh؋hhhj0\3ChBYSV3ۈdž ? fdžtu$u uuu uPP EE ^] USVWK N3ҍ{uWTWWW ÉS$S(S,S0KDSLKPSTSXShSpSxSHES\S`SC4SS@PEYYuD$ppp YSt$0P@D$DYYR؉\$t<t<tP$T$t~|XC>‰DXCG;|T$(3LXC|$'DXD$,;2D$D$<<PD$ t0MLXU +΋t$Qt$ D$L$,RP\L$$D$}$$$tExEp$Pt$(L$ E t$$$PRTD$#$D$ L$$A$uh$$$+D$8D$,ȥR8$t$0up@D$4$@D$H$D$L$HD$PD$,t$,P8T$uh|$(|$uhT$XBD$HBjD$TuOGOGL$PL$XL$LD$`QP,$|$$E8}t}$|$L$ t$,T$(G|$;$_^][3|039A<~|$ u@Vt$ t$ Nt džt$ N$t$ t dž^I~ NWj _^SUVWV ;V}N\$ l$|]k~uK>D$;D9uH;VtCuD9D9;u3D$|9t(u);tu+;D9t;l9t |uBF ;V D$$jSt$$kN Ut$$F 3jQQQkN jwF _F^][VW|$ ~tvNGP@PZF>@H;|f_^VW|$ FtNP@PGP >_^QQUl$WS\$u;ou OL$ VOLS QPOLpN CPSψD$|$ D$D$u< uSVOLFD$3D$~<@P\D$ D$< umD$ < t VD$ D$D$@D$;|Ā|$ u%+P< uNVcCPVOL5^USSUSOI[_]YY< u|$tD$QSUl$مVt$WU3Wt$$VWUVK KLV UPKLp- D$HP~D$ D$ (QkL$ D$ u< ut$VL$ F ~LD$D$ < t!< u2 uD$@PFPCLKD$@PVvFD$ G;||$ u< u FP8_^][Y 4SV39^u4N k<tjASkSSjF N Nk\F^[Vjv F^A<;A@Ã439A ~9A~@<Lq,$jË:uL$!tL$9t @u2UVv E FEEFEF EYF^]D$x ;A}jP]VWNytj{W _^VW3GT@H~Sjt$OLVGTF@H;|[_^QVW30u`1S\$tHSkY~'Ul$\$+ލ+PCl$u\$]t$O4SVt$ jSt$[_^Y T$xAT@H;}jt$ LRU39iVW|$q W9(txSW|$tFt$` |$ttWt$B Wu)Wt/jSUYYWi([_^] LSVt$ xU V:t$  V'u,WV8tjWYYV_ ^[VL$xJW|$9;FS\$x4;^/W2S{D$D$WPF P>~ ~ )~[_^Vj Yu2D$D$ BB^Vt$ t$ NL-t t$jt$ ^VWt$|$WP~t jWN ~,t4~F@H;}GPN$MQjWN$F_^VW|$ 9>}Wt$NW_^SV3{0uT{1W|$t8WY~T$U+֋ Au]t$K4WVt$jRWt$t$_^[SVW~tH|$;| WFUj ]XÙ]+;|WD$FCP>D$D$F_^[VW|$~=S\$x3;^.WSh3Ʌ~T$F A;|~~ )~[_^ VW|$~?S\$x5;^0WS^3҅~\$N B;|~~ )~[_^ A1ÊA0ËAH;A@ËAË 3I@uÃLySVWt9A3xO~,Y VU8tVHt$uF;|׃_^[ T$y3AT@H;|A RLAT@HÃyVt't$q 8tt$3^3 JȋRuS\$UWy kU8tsVS8ujYt&3Se0U[SϋQ6U@0tjV YYU!^ _][VWFx3IS_S9D$|G33UNGÙ+‹U;.~F9D$}];|Ӌ][_^VkF@F48up pp8u p pJF@^VkF@F48u p p+8up pp9N@^Vt$WxO;q}V;7~G3_^T$SUl$3Vt$Wy ++;N~ ߋ,BuQ;}+,Ru_^][ VW|$ ;~~@SvW~Yt>tv6S6lj+FF~[_^VW|$ ;~~TSv3ɋjZ QG~Yt>tNQ6Sa6,lj+FF~[_^9t#D$9t J9uBj RYYVW|$ WNL9~ W_^Vt$WVt~ FPVO ,t.S$VVϋ v~ FPk [_^V2>t(W|$ 9yuAj Q"YYq>u_^V9D$~ t$zHt$N^T$9Q#VqkWy;}6AAP_^T$9Q#VqkWy;}6AAP&_^LS\$VW3x:FHA;}-9~,uQUSN$il$8;t SN$V(]_^[SVW|$ˍGPW+Wˋ0!L$_^[Vt$WFPcxO;q t$V_^D$A0A@AHS|$ \$Vt$ q"s":tӋ" Pt$k2^[ SVt$2ۅt?|$UW|$iWN)L$":t" PWGu_]^[D$aDA1T$;P }xD$ ;P} HD$Vt$;q }x D$ ;q}Q ֋D$ ^4VJ 2k<0u ;J}AB J k^ ;J} A8u+J Ã4Q kVW9<8u ~BA q k~ I:u+_^ÃT$;Q }y2 ;Q}AT$;P }y3;P}HʋVj(^ËT$ttS\$ Bu[S\$VW3 t: t5 |*t(t}V#Yu_u>> >>F|_^[3UAAA AAU%VUD$t jVYY^SVW~tijWYY~3ۉ^thjWYY~ ^thjWYY~^ tj WYY_^F^[V~uNOW|$ WtN WylNPWNW2NjWhNjWhN jWh_^Vt$ W~t$ u_^yuD$IT$A@H;ORV~uD$,|$3!9D$~ Pt$N^V~uzjYt Ig3jFYt /g3jFYt g3Wj F sYt j3vΉ~j_^Ãyut$IkH@yu3@I jVNuoi9D$}t$NjH@^WOuG`SVt$3CSVhOSVjOSVhOSVjO SVhO SViVYOPV3OSV^[_SV39t$~W|$>PqF;t$|_^[V~uF^ NP^ÃyuAËA@@S\$ V~uu61t$ NiH@;tN3Pt$*i2^[UV~u } u2fW~}u3@ N W|i;E tAWqt%~u3A N WWiȋE +NPWu N Wh2_^]S\$UW39out2sVZt$;t$`x\9D$}OV:t5O Vhu؋OD$3PV5ht$OV l$F;t$~2^_][ VWϋnw_^V&N&dD$F ^3AAA AASW{tV7OFdjWYYu^cc_[VqW3t$ N htF Nj6u_^S\$UVWj]3Yt SJt$NWeMt9X }ut7u_^][AtL$9H tu3VW3WtNL$ 9J u G"92t8ut 9H uЃ:utN2cjVgYY_^VVB@xu r u^S\$ VW)^ ~St$O1c?u_^[t$#tt$Hc3SV~u6Fuv 6Ft$Nt$t$YcN؋IIyu 6^[ VqW|$y Wt$Nd6u_^D$VPxFF^3@|$ED$At$Ntt$He3t$.tt$He3Vt$NHUe^T$D$BAB AD$ A BA3AAA VN,U:3džjXƉNdžfdž^VjHUgYYNdU^SV3W,U9~ tVRG;|.Ytj_N^[VYD$t hVYY^D$V4Ut jVYY^V?D$t h VYY^D$V4Ut j VbYY^D$VUt jVBYY^ SUVWt$8|$8WMWMD$ D$43|$DD$8t$0D$")]]ttH{}VO"ȊD$L$<(t <[t<{t<;auԋDžLd$4 t$<W|$@t$8D$DjYD$8ˉD$|$@Mt$<؍D$D$PWVۉD$@]tt j";| tFPVD3ɉt$8L$t$ |$ E+D$ D$DD$`L$8D$H3jYD$LD$PD$TB3Ʉ_^][(U SVWu }WKWKE E3}EuEjYEEE_^[]U SVWuK(`UuM 3EEjYEE8_^[]VW39u:S\$;~, ;}S tVRG;[_^SUVt$WyVr|$}9~2\$VX;utV P YuNFD;}9\$V;u&tVP Yu F;|_^][ |$SUVt$Wj]}L|$uFPOP/~yG^ScP;u\GQ|$u"O3;}VO-P_VP;u F;|jt$V_^][ QSUl$VWUXD$13x^J;}S9|$~Ml$;}>V< uǙ+F< t< tjjFPG;|$|_^][Y0SUl$;rNV*N;C΋QSUVt$WXD$VˈD$l$L$U unD$=UYUYnU褸PYV胸L$PtF;|VeD$l$VS=F;|V3PYF;|VPYt"F;|VPYtF;|V׷PYtA~W辷PYt($UYu:UYuLUu^F_^][YVvPYtF;|VYPYYtF;|V<PtF;|UVW|$ ;|;|WR+D7_^D$VUt hVBYY^VW|$ lA;;d+S@Uǽ;rP$dl+@;rt$+@P(@iT$;tƆhh ;w+Ad0du][Gl_^SVWuID$ ;~`;}# ;O‰+PQGP+;D_^[Vddž~&PQdpd^Ë?%QQSUVW\$P t$D$3RUL$3ɊDž~D$IQȋR3҉T$ t umL$;}it!L$RD$< t< t2:t uF"ϋƅy4ǃ$DL$EUHT$뉋L$D$ 8 t) t$ t t|$$t+QUt$T$0 t_^][YY UVu񋎴oE +EPuu^]=u2 t$P YYVuI藽^ËHSVt$W>t|$+j 7P8uF>u_^[2Vt$W;|;|VP;|;}+D>D$_^2T$Vt$WRVtp_^D$lVt$񋎴Ћt#^SUl$ ك#}tL tAVWuR3͋>=P3͋>P_^][SUl$ك#}tPtEVWut$R3͋>=P3͋>P_^][SUVWUNff FT苞^D d t<3džf$(,0<@fDHL33BNf  PTj2XX\`džd hdžlp|dž $(,-.20'48<@3Ɔ h dž# dž8螙Yt &3ȉjV3Ɔj(h.)_^][V3L$FF$F(D$ FF ޞv F!vFF \X F\XF~tFF F^VWjVUz903GtW4tW8tW<tW@tWu<Ht+dDTN.Nq_U^D$VUt jV7YY^VD$t hVYY^ jXu4u 9 UQQEUjEjREP@]UQSVW7 Etl;uhAPQ襓uRI;}:R< t'< t#E@cu ]StE P}t0t=WMutdPV8tjjjj8`.u蓟} t C ZrR} tLsS$>;~HPt$Ήt$[P[jgWdžt$t$蓇tt$(t$(SWqfu4t$t$趆t;t džjt?jӘuW38D$(@P$D$Ή襛]_^[SUV3L$ EW9u D$(9tUn2D$(L$$PQU+QP`؋9uWt$(t$(X3WSW<Ph %D$$D$(|3dž9| Syvu S譙b;uA;tTW~ jPPWU UPzPWjSjP讙t$(t$($YP6YS%\L$QP$D$(;D$~XPt$(XP"yHPj[+EU赑}3E/;D$})Pt$(XPĶUHP聑IUWW0Sv}39~t$(t$(otj#t$(t$(蝃t;tj5t$(t$(#΋tjD$$PUWP_^][UVt$t$dj+QP"^3탾uPΉ賕t$t$蛂΋t jjUƕD$ ΉD$SWUt$t$ńj+QP]UUUWUbj΋M;@ty|$ tQ3;}QS@;~?QS@+P<WDt@PWȖW肔<<9uWU荕PD$L$D$_[u2jjUΉA.^]D$ tè`u2VIcu诐u3@^3^ƁTÃ,SUW誟Pu.Vאϋt$@VPUS襕^:jWL$t$<t$8t$8L$ AuS,a_][,UV+gt?MQP$E+@E+M9thjD]Y^]U SVW uj4ua}t[} tUu EuPEP:Eu;ELEEE;EOEEu-_^[]D$WtDjDt.Vt$t$jYYHQVd\^_ V;uAPQޅus9蜑^VW艝I 3tIPWCIϧu GqWΉ踓P0_^>SV3ۋt@Wx 8}0p I[PSS萾Džu_jSI*SP ^[U,V=SW谍3ۋC9Pu8舍+t}*SWQRjVM6E}+t PWľM>u݋PW貏_[^]Ët3ËD$;| D$ ;AD$;A|D$;A 3@3U3ʼnEEDž|VEVEVEVEVEVEVEVEVEVEVEVEVEVEVEVEVEVEVEVEVEWEWEWE WEWEWEWEWE WE$WE(W< s |,WM3F]UVW6\} WJYYt3҉~~S] B;|[fEF EFEFE_F ^]QQS\$Vt$W3L$ ;}O+t$FP݄|$Yt5~-U+ߋ|$+P9EEut$ |$]>_^[YYUVWuu 3PPEEfEEEG$ +@PQV.PM舊MQP|MF5_^]|$SًL$;L$UVWkVeVPWt UY3V蜃Yt VUW tVh@UW tVhH;SD$HP l$@t$0UR8t$|$\L$`D$lD$dD$D$PD$$-%H;SD$tP茀Ut$0R8{D$`|$pl$@tt$tEt$ ͋P8-N|$xt`L$t$|$,tT$‰T$,D$4D$P+@D$4+D$,t$|t$0jU_^][,@UUE #ESBVWEEjEB[ÉE}(E$Et@<MuRSjPH_^[]$SUVWt$8|$t$Tl$T͉t$5MHЋ\$XT$L$\D$TD$X3FD$4D$8u@;y;} ED8Eυxe;} ED8uVEH+D$TD$<+T$TT$9#I; tt8\'Pj#++GWw P0bP0%U_^[]UVt$ Wj69.]S\$tj66=6q t%t6tjjV9.~[_^]Vj^`pUVW} wE E YMPQ$P$P$PPww7!t M ȉG O_^]3ĉ$SUV$l$Dt$0Wu3iU6L$,訸|$$u3LUvL$8茸t$0u3(dȉD$LEPL$tS$3ۉL$Ӄxu 9~T$B|勅˺$ $$$$$$DŽ$8$H$=$L$ 9L$|uP$4D$@P $ $tD$DP $LL$ ,u $$t u w $TAPL$ ;L$|g3ۋ$L$pVX w\\$ \$x?hLW諗YP$hPW| PR\ۉD$ VL$tܰ,\jSL$x]jSL$x]\$4s(͝ȋC+C $s,HL$;LD$,蟝L$(;OȉL$(IurD$腝L$(;}APfD$P諌C$d$K D$P:/jjjjjj jjjjjjRP;QΐPʐjjjj>RP_;Q茐P舐jjyjjQP2;9|jjV8jjQP;9|jjjjjjjjjdjjjjjA%jjjjjjjjjjjjjjjڀ  uPu$rPphj.uNjjj?jj j$j 舭jjDjjjj"jjˋQPPr;j;O`jjˋPP0;j;O`_@d#G8H׋j貐+QPE{j腐+PQ{jS褍P蠍腍P0IPfˋIPQ@PLPV?P;HPˋHPWNQPWwM迌V蹌NQ訌+PW* jjjjjjj-Njjjjj/jjjjjjjjjjjjjjMPP]^K_^3[6gy$JVp MVZdpASM-IHRX^| #)B#)sPvB  !"#$%&'()*+,-./01VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV2345V67VVVVVVV8VVVVVVVV9:;?@ABCDEFGHIJKLMVVVVVVVNOPQRSVVVVVVVVVVVVVTVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU3USVj38] j38EYE 38EjYEt SuKЅtMtjjREtSuPx^[]3ĉ$$S$D$4$D$\$TUl$VW$W݈OQt$ȈK;O3҃{D$4T$,~L$$+8u8p;t$~+|$\$VjS< t< uNM;\$`3ҋt$;k&L$D$T$D$VSD$D$V3d|$D$t'K'P^]S\$ VWt$St$[yOL7U~lFP(U#kPG$x)t3x('VT#kPG$x)tx(uhFIM;|SyQVT#kPG$x)t3x(u1+^ST#kPG$x)tx(u]_^[ SUVWt$=cjt$PSx荷UWtZU\V΋=X|$Pj~S P`VPw CP P>VP5w_^][Vt$Wt$ +bjVP&D$t8PV7~8|$t jjjV _3^ TuV}5VwPjt$; 9~jD輵D$ 9}vPj t;t j^VWu Dwe0$O +z    - v ;wBtsV Y v_Z \ vKd tCl vrp 몁z rb v# vR v t *w7jPEjPEE DE܋Eu؍ujYEEPd_^[] UP3SVW3P9U~ 9ELG|XtsjPEjP E E38M38EjZE 38EjZu Eu ȉMċPpPEuujYPd2_^[]PSUVW ƃuT$lD$pPRED$ht= u-D$|@P}pt$|lpVPR$T$h@tht j39 u1#pL$l;} $D$pPQD$hjD軮 D$htUL$lT$p;~‰;~‰ ;~‰ ;~‰D$ht|L$lt$p;~ ;~+щ;~ ;~+щ ;~ ;~+щ ;~ ;~+щFOϋ[O3;}&D$htUD$htt$pt$p9l$tt+t$lnT$tυ~ RPN RPL $jY觚9l$ttrD$l;}DD$hP謘u3PPD$xUPq ;tP"/P09 uCD$hP`u2!)9 u@D$pt8D$h u.L$lPQ|$ttD$hPuz-D$ht)9 t uD$htjt$|!"T$h` ""€t-M!T$h8@uPXjPD$UP@D$xt$D$(D$D$x$D$|$$$$$$$$$jY$D$hPd_^][P(UPSVWjPEjPW@uDEjYPd_^[]UPSVWjPEjP@EuDEEjYPd_^[]UPSVWjPEjP?EuDEE EЋjYEPd_^[]UPSVWjPEjP?uDEjYPd_^[]UPSVWjPEjPQ?3u8EDEjYPd_^[]t$ t$ Ph UPSVWjPEjP>EuDEEjYPd_^[]UPSVWjPEjP>uDEjYPd_^[]UPSVWjPEjPx>uDEjYPd_^[]QQSUVWdjpl$pL$P PjL$+H|$$t@y;~w~#;}+pQQD$PPjQ| ϋD$PU;t$S\*jt$$VJP0 jt$$V_^][YY SUVW0\$TP $(U'$QP$E3AQWP|0PWR|$0D$$A$8@D$ It=ȉ$HL$ ;}APFPRh+D$(38D$,D$$u ȉL$,VL$P_W D$ tm$pE$3FVQP|ƃAUEVWP|0PWR|$qFjYHPjkTt訅 Um$,PUm $$+@$$,$$t!C$$U R8 u;s |$ h h%EPoE $4;2 l$t 0|$7DP7PD$$D$0IȉL$`Qf$|$4D$|EL$Dt$D@)L$Lͥj$3D$|Sl$LKEL$0;|$D$L;$8xQDVt$LCL$0+ȉL$$;t$xtLUDpV$E!V荋Djl$HHKUQWVt$x3@9Pu ˉE( $E($ ;t$|E,E0 t M(M,E0$EP|$4ETD$,ȉL$\t$HD$8L$@FPhdVZdt$T |$DD$ QQSUPƨt$$FL$XWt$Lt$@t$L|$hWPt$v6$t$xˍCt$pRt$@t$@UPt$<蒖=L$+ωL$hL$t$l$P8tk0$$T$P$jQ$$‹$D$ʋPH|$u|$D$,D$,D$LMD$0D$LEH4(RYY(c>L$0;wUD"$|$4D$4'>+ȉL$8;L$@}eC$t$4$( UR83@9u5t$4D$It$X|$x$PRUYP$PC$| PR\$+ȍ$PL$|QYK$t$xU\ T P$P$P| PRLL$t73s(t.tC$| PD$\PUWTL$GL$ |΋|$(D$GΉ|$(D$7T$,3D$0GL$ L$ T$,Yt$HU|$XͥD$Xt$XC$ R8t 4L$Ht$LjjPH$_^][3k SUV|$~a[[jt$P>V|$~&+9|S$6tS6t|$ujjUSVP^][ VI/+wD$SUPZFD$ V2Z |$$53@W|$$+ljD$D$(D$< t-< t!jWP2< tuEU;|Jtp*j PXPtK*j P3P\$SUPΉjE;}\D$;D$(}P3KEL$+ȅ~7|$j OCE+;|ы|$$? Gl$|$$_N#t$][^ UV񃾜~*MQP$u M+<uE2^]4UVWt$Ht$H"WPSu΋*jVL$ pWSPL$\$Yt 'Ëȉ*LJPΉ FBHPSW"DhSSW *_^[VW|$ xjjW9t'jƆ説Ή蝬_^t$ǁPt$ƁTD$VPR\t PpP^D$UVWtqp09QjV09QjV0;u;tTtPVU!tPQë_^]2UQQVEPE^]VPu$0ΉX{0\^SVW/ϋPHPR8؄t j-9~.PjS PP0t^u _^[_^[VWt$ *9tjWѪPT_^SVWt$`*t$O*9u9tjWSvPT_^[D$VP|P>^Vtjfdž fdž^险U} VWt$ju Mu uu ujP@_^]ÃSUVWt$$O>؍L$U\$VDSD$ t$t$ >MD$WQVt$$軴D$$+D$;Gd39o\~]U-};|@EP};1|$(tU G\H;EPu |\$ |\$KE;o\|t$u\$$L$Wztj_^][|$u0WÃ|$@UPjjXttLJ LJ$P>;>L>b>t>>>A@R@@@@@@@+ATELA88::::;;;);4;8844^5!9 939955588W8u8667468N8444X4h4t44338FHF_EET7_7j7u777777CCD(D>>>> ??0?=???????@5@@@@9==7??UFkFaN  !"#$%&'()*+,-./01111111211134567891:;<=>?@ABCDEFGHIJKLM1NOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~̨̘̰̺́̋̕ːFJJJ KKKKKJKUK`KkKvKKI$I3IrIL&K?KKKKK MM+M6MAMQM]MtMMMJaI;GTG_4M?IPIGGHMMMG1GFFN%LLLL_GnGG LHHeHHGGGGH"HH4NDN IIHI~IIIHMM N'NJJ+JBJSJkJvJJJJIIII-H>HIHYHFQNMMaNn nn !"#$$$$%$$&'(n)*+$n,-n./01$$$$23456789:$$$$$$$$$$$$$$$$$;n$$$$$$?@ABCDEFGHIJK$LMnnnnNOPQRSSSSSSSSSSSSSTUVWnnXYZ[\]^_`abcdefghi$jknnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnlmQSUVٍL$ WS+t$ˍDt$t tCWPVt$(_\3CW2Ptj_^][Y$SWZ3APdT$tZ;}Q\$0T$jXD\$0\$ u*L$4x" ;|;~2MD$0D$ UD$ i9Vua9tC33~%3CSVF;|3@D$|9|=PˉD$ +ȍD$$L$ PR$D$,+@L$$D$,+IJPWL$<)t$8|$D$8u=D$tFH N^VWwt!S^tjjVYYu[gg_^ËD$A D$A$D$ A( SUVW|$03ۋ\$9t F9ut$3ɍFjZ Ql$Y+t$l$0jhWL$$\$$\$(\$,D$0@lx~8L$jj4>l@H;tjjhWL$("lC;X|ȋD$$@P1|$ W/EL$ QP_t$(3ۉ\$4\$\$ Rt$l$_\^][ÃS\$UVWˉ|$w Pl$,E M+‹?u;QuP$uj_VR(jX+NjEˋP;u|u?VuP$};}}FGD$0VWP(Vt$4P$NQt$4P(GD$0VWP$D$0;}|VuP(;}@VWP$FPWn?uLu;u~EˋPVR$MI;}~ U+EȋQRP(;u|?u$APuR$EPuR(??uA~WuP$WuP(t$0ˋF@PuR(Fˋ@PuR(Wu`?uLD$0|$L$jj2@q @jq ˥jD$@t$u=L$uAv|$v+t$(D$(Nj+‰D$<*D$@:D$DPD>uFT$͋|$0+L$4+ljD$HL$DL$L+|$4D$P|$TvT$\L$Hvj]U>u-L$+L$4+‰D$D*+T$4T$L$HD$LL$Pl$T뷃>D$ut$L+|$8U|$DHt$T+D$8D$XD$`D$8ʼnL$HD$lD$tD$L$PL$hL$pHT$\D$8L$x$$$L$uE|$ՋD$8+vʼnT$HvOD$TD$\GL$PL$XL$LD$`T$dD$hjJj_9>uCv@vD$Lt$LD$,D$`D$@HD$dD$DD$hP0J>A>8> u!vPt$ˋvUP$v > u6vPL$qUP$t$0t$$VUP(D$(> u7vPt$ˋvUP$v UP(t$0t$$VUP$븃>u/vPL$qUP$t$0t$$FPUR(=>uWvPt$ˋvUP$v UP(t$0t$$FPUR$EVPR(D$(HVPR( > u7vPv|$vt$ WUSvt$4WUS,> u5vPv|$vt$ WUSvt$4VWUS>uKvPv|$vt$ WUSvt$4VWUS,>PUR$L$q R>u8vPv|$vt$ WUS;vt$4VWUS,>u7v|$vQWUSYvPvt$WUS>u2v|$vQWUSvPvt$VWUSr>u8v|$vQWUSvPvt$VWUS>umv|$vQWUSvPvt$VWUS>PUR$L$q UP(L$qUP$+WUP(>'|jˋ,l$@D$D$jPUR\|$ ȋD$(v+v+Ǎt$(+‹j|$,9ˉD$4D$+PD$uWT$,MjL$<]BD$HBD$PvL$HAD$`t$X˥P8L$8t$<L$8u>uHvPul$EPFPR$UVP(EPFPR(Eu>L$0|$vl$Hv)T$PD$T+|$XD$`+L$<+D$u$t$|$DL$jX;3@6EPVRVRjPRtW&EPVR3M_3^謠]UE h uupE+E PE+EPu uqP]UVPuuuu uvF^]UE USVWjCXEEGEC ESTCDrVRSPjVjPhjdjdhhWh[hSjWjVCR_^[]VsR^ËD$Pt$Q3ɅAjXød]jXU<3ʼnEEVPEPv,PME3^U]V>t6R&^V~t vSf^ËjHPPt$ Q% RhNä3ĉ$dNS$pNU{ t { VWs$TN$TNC$TNjtOs$HN$HNPs5R$XNj$XNPs֋5Rj Ps+;jOL$PωD$Q$dNP$N$NUsPD$Pt$D$PshP|$l$;sjP赗Ytt$$t$$t$$t$$t$$tx&F5x&^h&Q_^][3AAA ËD$T$ʉHVt$ x;q}Q D$ LHD$HW^UEPEM+MM+MH]U3ʼnEyWVuEt EPqRMƉMNMNMN M3^I]xN3ĉ$tNSUVW$NWP(؅t;^H~^H3ҋGjG FPYv@FPk D$$RvD$PDPd$d$~dD$t vdY3FDt8jPUvdL$4D$P$LN$LNt$dPL$$D$PUvdt$hP$LNPt$,Pt$$hNt$FhDPt$v@RE$`Nl$ 9D$OD$;L H͉O΋P(;~ jRGW$N_^][3谔xND$3ɉHHH U3ʼnEVuEPqRMƉMNMNMN M3^N]jjhq@RUQQVWuE(P&}u WuVE D>_^] AHU3 8EE38ME3M 3M 33E]U<3ʼnEEVPEPv,PME3^萓]VPD$jPF0P^VPjPjPFF 0P^VWPt$vPt$Gt$G vPPwG(DPjwG,0P_^yU<3ʼnEEVP EPv,PME3^轒]jjqRU$3ʼnEEE܋E VEu܋EWE}EEEjPqRM_3^Z]t$t$Qt$Sàj&ÃyËQ  V4B H;M^ËAMx+D$9D$(t$ LD$(+;T$$OȉL$(M|+D$9D$,LD$,+;OȋEpL$, 09L$0t$(LL$0D$;OD$0Et 9L$4LL$4D$;OD$Dͥ_^][(ðؗ—ȗΗԗUVuPuEjjuHPu E@PvHP^]UVuhY9Fu@}E9F u*}8F$uF';E uuF,PYYu@3^]Vjt$jt$ hv@Rj^D$APt$t$t$t$qXPD$V$Ih{hthmhfh_hXl&u.5Qh\֣l&uh\֣l&uP֣l&5RhPօuhP hjRPR^f//ǙΙܙՙ=j&D$VF3L$~v֋j]9t@;|A_^][DUQQVuEPjE PvhPE^]U4Nr3ʼnEES] VW}PF3ɉ̱бu.8 j&u 9Nvt$08VO< :D u BF;FG(;G,t+F HP΋@,+F HP΋@4HPFHP~t^l$$n@8D$;}&+ߍL$$GQKSPW u&D$;|xGPWx믃3_9n vF^(^][3Vt$N N]FFFFFF F$F(F,F0F4F8F3jZF QwY9~ vFA;N rvvY^\$;^|V tF;t|G;rFF _^[NDJ;wFF 39Qt08Qu+Vt$9Q~At9p~pB;Q|^uAD$Vy3t~j WnYY&Ntjf_^V6n&D$ Yt jVnYY^S\$ Ul$ VWU΍+P;u SWEU΍+PSW蜌;}+WuWW_^][V1t$@P贏^QS\$UVL$+W)Ul$NW賔;D$u#WxL$l$9)|2+U9L$1NSh;D$uCS,L$+ȋD$ SL$;} 1G;}Bt$NS7C;}k+Uul$UXP S_^][Y USVWu.V薎;Eu>u辍OP諓؅u@t3OVV貒VjzOSjj讋u V_^[]u ju tFP܋ A@HPVt$,Njt$ 蹄^SUW|$+E@H;}(~#VGPҍW͋ȍ;^uW_][SW|$ م~2@@H;}%KGVP輒KW豒;^uW^_[SVt$ 蚌~W~WQ9D$u_^[UQEEPu EPr]SWt$ W;D$ }1 Vt$*KPt$ GWKVjW*^_[V1t$P豌^Vt$֋NPÑ^D$V ^hD$Ѓ] |$Vt t$2S\$ SC<w C<w ËP[^VWj qP_6Ej&vNNYu_^Ãu?; 0~ 9D|9D$( Fn|$\u[(u)L$( BT$ L|NAL$(9)u(;D|FJT$ D$0PWT$T$0|$0T$xFT$ j FZFAuڋD$3F@\$GD$?^u @D$D$G\$?-uj-[@\$S͉D$2D$G?]uj][@\$S͉D$G<]<-G<]D$CGD$,j\Y|$4/;uMG?\$$D$@PW|$@D$@|$4D$@D$x UD$,\$yl$$j-[\$ );!\$,|$$t$XSdC;~|$4\$l$$D$G?\$j Z2ÈFAuaj-[\$S<\u>t8D$DGPWT$|$DBT$D\$T$xS\$st$X؋P\$$[;|$Po\$< <R<~< F+u"3+3;ދ\$GȅtFCB;r\$FV N;w T$ V|$\t<(uL$( ^)u;^j\XDЀ|$XT$Hu<ʀ<u-jt$LFj ZFAuV\$u FF]D^=(^6@^/p^(T^!]]] ^]L$8"Dž9t3]_^][<QSUVt$W\$sx Et1tt|$ S}uxt$ aUt$$Vt$$N|$ E;}Rl$؋EV;tF;|\$;}'UWVt$$u F;|t C(33@3_^][Y T$SUVW|$3ۃD$uj\XLnt/DStnWtE`bvdtft$Y_^][j0_WxG9~䋆ʀ<tRWC| t | ~W3G|ʀ<uRC|w0|9~SC|Wȃr?tN1I'tt#BPBP.YYx jx]>L$A< wɃ0A<wɃ7 A<w;ɃWT$B< wƒB<wƒ B<w ƒÃQQSUVWj qP]D$l$~tR~؃tJ+~GPaYt13ۅtl$F͋UP C;rl$D$2D$l$u_^][YYW3j YjzPbxY_QSUl$VW|$E\$zt$EH w$LΊ]WEG:DNG;D$ }2;|$ }WG(]tà ;{xu;|$ |E~F @YYt PY~Ɖ~_^D$D$Vt$+t$ WVP'gG @YY3ɉEΉOO_^ F9u |$u|$tt$1YY@2 3ĉ$U$3VW$j 3҉l$^;T@;|D$!D$8$$u D$4D$8t|u|4tBAuSB3jZ Q\YtL3!t$W趠3Yt) | u |$u F @L$;r׍/D$0e$[_^]38\ ]SUVW3\t/ss #5\sc)\cjS\ޅuуdG|_^][SV39tv[6[YY^^^ ^[Vt$W|$$t$:tB<w A<w :uFGu_+^US] VuW}) t)t):tB<w A<w :uFCOuхu 3 +_^[]Ã(S\$4UVWjh^Y |$DMEFPh^3 +F ;}Ph^ ;;FUWE PQL$4|$(WL$<ED$(PD$P|$(WL$HED$(POtD$td$ x4|$(WED$(D$D$HD$D$PWD$ Pt$H+EUV|$Wt$ ED$PV|jh^6t$d$$Yt$,3D$ D$$D$8Yd$0d$4YY_^][(SUVt$觝Pt$ 3ҋjY4;.ut$v輼YYt v u㋋tt$t$vhWL$$D$^][UQQVu WVuoeEPjduuWE_^]UVuEP}EttP_EY3u ePXY^]T$3tVt$3Fu^V>u2~ Wu;hZjvF 6-~N LySUl$]ËLxE>8u @t'+:u@u8tA8^t2][_^QQV>u2~ Wu;hZjvF 6>~N LySUl$ETT$x;us|$ 3Y:߈\$@M:uCMيl$ 8l$ńt$T$ : u@8u@Cu8T$tt;tV|$ BT$;tx,> @t)+:u@u8tA8^t2][_^YY|$ t|$ r|$ v33@S\$V;W|$u S?YUl$ u t$)YWShYYD$3҉L$t$0D$);u"vY;uWSvs t(L$v ujUYt)3FFF vUUt$ m F13t+D$WSRUt$$FEL$,FF 1]_^[Vjt$ V NRQPFF ^|$u3SVt$u t$ YNQUYtVt$Sm 3^[QQSUVW3D$3ۋ,t'uΘupm YYxu݋D$C|3@DWTYtbL$3D$,t@uV踚up=FuV衚uY Fm uȋD$L$@D$|D;_^][YYÃ|$VttUW|$u t$ YF3t 3A|$E;Fr Pt2tNT$FFWt$Pl ~N_]^ S\$VWu3|$u S腗Y~v";~w>tt WS6El 6USWS t~~ff_^[V>tt$6XYYtNtt$t3@3^S\$VWN k;s k;rN F @PRYt+>tv6Wk6RF>F ÉF3_^[|$UVtil$ ;nw`SW|$u t$aY^;^r SYt1V+Ճt͊AD9uWt$Pj ^_[^] T$VN;s;W|$r':;s +A;sB9F+@;r)~ V_^VL$ ;Nst$PYYt+^D$0D$0ŴYYÃUǁVD$D$ D$3dfhlp^džt^ SVW軴<_0P T3dž @ sj 4 Ɔ[hPY3ɅtHHfH u_X ^[SUVWj ]<_4 t hSPYYuލ _ ˌ TO_^][阷V(D$t hxVOYY^VhD$t h\ VOYY^SUVWOt$tPOtt$2t$VwOtP~tt$t$VM_^][ PSUVWROt;jP3D$VPXmED$$t$`D$hjYPd_^][POVWt$ %Ot Vt$ 5O΄te_^ + V;}^: t;~^L3ĉ$HSUVW P0D$pp t$phVPR83퍋UdQjD$t P8jPD$$UP0l ɉl$T L$XPL$pO+ >D$4WED$t$p$jYPdMM  tjjV;a;t+VUЄ UD$pPL$t$WEPUD$PUVLYe}$X_^][3fLLËL$43ĉ$SVW + ;})U3}VaFD,E;|]h+VTYY=s-D D$ PM$_^[3KjM̃PSUVW P  \$hLPS]YYKPSo]YYt+ S]Y tR+L$dQ%Tt$dTWS蓐P4St$dNj+PP]+WSD$Ps͍]QWt$lv6jSNEL$PQP$+D$dPD$P!t$D$4t$PtD$<+D$4u t$P|$0L$XT$jd^A;|:+PHD$PL$@D$ PL$\$+ȉL$L$@L$cPt>4Et> uu uPLMQP$U;U~E􋋨+++щEUuˋ ũTCaA8 Dj8 G_^[] VV uK^郻|K3ĉ$xV񀾠 SUWIƆ e$L$v$D P+3ۅ~EPL$质ȋ#ً $tb~^l$U$4 RSWUPL$胥$jh,`yt# T$R4 RSWUPL$IL$Ɔ 蜣_][$|^3 E|D$ t^tNt>t.ttuQPPh@jjh5jjh*jjhjjhjjh jjhV{SUWjjh\؍ۋ腤tYt2ɋQj h_tYt2ɋQj h_WjjUt;t2ɋQj h`;Pj h`tjjh}t2ɋQjh`t;t2ɋQjh`jjUjjh `FPt$t$_][^V^锣lSUVW Ct$ ;wbtB-t)Ht tt Hukjj hjjPC33FVLVVV{ۋ- HH P ta( t3 t+ t# t t;t;t F;t;u;T  FVx_^][j.3F2hxGVW39 t?WWhWPhvWPhwt$ P t$ _^Vt$ t$ @t$ t$ N^D$hD$iD$VP ׄ YujńY ^Vt$񃦤 Ä Yuj蕄Y t @ ^UEVW;{S$fu u Ysn@c[@x m9u C&E@;uCu@}   ugB}   }   uE j}  [ wu EP up0c-;g %$ u P P E   CP T u u KO$E X \ aO$E ` d ԋE h l u wK볃}  ;e ;wut]ȁtGt2tU9M u @=  uu P<}ȁh t7%t"|u V" L P0d P@, I],$ u0u OMuI\ȋQPh uu ;jju u u EP }ut}WVEEPW U >ue<Y~u EP u u Wu s'4 u4 f u3$ tbjXuu PN_^] f!4NGYexl|Sa0C){*N8L$A@AVW|$jht$'yZt$ u7jht$\Z u7?u@F3_^ L$IA jQX:YY3Vt$u@OT$3ɋB;B}0W3G;L$s%BfDB fN f~~BAB;B|_D$t3^L$D$A3D$`3j :YtT$rJ Qr)3t$hP3@|$tD$ jXD t$ D$t$ pq t$ D$t$ p @ D$SVt$XW>W t~uFt~ u Ft38U3Ef;t u'vt~uFt~ u Ft3]_^[L$IA3BD$ tj Yff`H PP3 @UV3F9u t E @]MItj XjfE fu8Yt'jM jfu o8YtVM Qj3uhPH^] @@UuEuuuu p ]UuEuuu p ]D$p UuEuuuu p] ]D$3҉AD$ QA~VW|$q fWBfv;Q|_^ SWS3L`LJx 4| LJ H LJ x h af\ ` d h l hRh afn hRfp ϋD$ LJt @G | _[VL`@D$t h V]6YY^U SW؅t}E3V3MFVtEE EEPMjE EEPMVEPQSQEVP4؍ESPEVP(3sRMDjEVQP@^/EtEME jEjQEP@ u 蝞_[]7̋L$9uhWjh|$ Qt$ tjjPHR Vt$jBQt PQF^L3ĉD$HSUVt$\3W|$lUVR؅u+|$du7UVREWt$lt$lVR2D$d=uUUVRWt$lhԃuzD$PVR輌tRVt$R ϋP W >PjD$PVR=tS=tL=uD$WPYYp0V uhURPRN=ujXDWt$lPljD$ljD$D$PVRt$t$ =3L$X_^][3t3LV肨t+j`Rt^Ëtj `R^2^U 3ʼnEV3EEWMEEEEQuE} 9}tjMjQuΉ}M_3^2]U83ʼnEE3VM܉MMMMMMMMjQPPu EuVQuEPVQ#M3^I2]St$t$ tPt$t$tP+ۍC[UV;t/3PEEfEEEEP.MQP|M%^]U3VEEfEEEEjPMQP|M^]ÃSsxRqUVWdRd$˃d$=pRt$$t=v6n.YYD$$ QL$ l$t$$Uv6]-=v vUYYNɉD$$QL$l$twvUv6jt$8Q褞uGvd$L$d$ |$t*jjvt$(jUjjQt$Qt$jt$Qt$j >vd$L$d$ 4|$t#v6t$$RI t$Qt$j׀~t n jP׀~ t p jPtR_^][W< uMVwWjVRPjVjhjdjdhh0ah@`jS< H @ L ^_SU3EVDʼn  WV/VjWMWUU  PW a/Y s8Rs,R_^][t$ t$ t$ qR VWv0R4R tQxP _^ËL$t$t$t$U(Vu u @eMMSWj XfE3ۋCQV]]P}Èl u(M؃eMQVf]؉]]Pl l uE u^M_3[^]DtfD$f;n u3@3L$j63UQQVul tQIGMu?u MEEEEEPvRuu&P06E 3^]D$+D$ SVPyL$+L$QyYYjDR;jER;33@^[PS\$XVt$dOL$pt$`u @/UWj5L$03j XfD$$L$3L$@L$ L$lL$(L$QD$0L$(D$8QVP 9|$t$Qˋ!tHt$Q+PUD$p*D$lHQu, t$dWt$pU)kC$ eYY3ɉD$hQQQQjUQPQPD$h,Yt2t$djWmJ 3PPt$lWjUP$Q3AL$lQd$<L$L$D3@QfD$5PX^][__UVuWjhu &;} u jh(u z; ux jh8u \; u jhu >; u 3@9_D^] UQSVWewRjlPPSDPWSM~ut#uPR|~PSwRtj_^[]U0ESVW&{j0_3E@E&Wj[EEЉu܉uE}Љ]PtEA:Bu6A;Bu.A;Bu&AJ;uttQPhYY@2D$SUVWjYG;NG4tg0O,P\$w4P t$tVeuu3@3GtF0G0)tt$ GO,PGPUwwRg0w,VPdG<ˋVPhG@ˋVPpGDˋVPtG8ˋVPxGHˋj VP`GL_^][QQSUVqʋNWT$P@\$+3FD$t,D$ H+D$;sL$4.PbGD$;|$r_^][YYQQSUVqʋNWT$P@\$+3FD$t6D$ H+D$;s'L$4.PibPfGD$ Y;|$r_^][YYU3V9U S]W};UFFp(=wIC#Ѓ@ L]#ʋ > $? D>?$? D>ɀ ># >$? D>?ʀ>CF;\$L]D$_^[3ҋ9L$vCVt$Nft4=s3@=sj(=wAjjXA;L$ r^V3jXjZF QufY^3AA AQQQQSUVWj ]su񍋔ՍA !I@` ` @u8j Y@PPPul$ˉu _39} v03EKPEt0 KGD1P;} rҋs+j |$]7Pul$j X49|$u늅8  $$%%ƃ((,j,Z4u0044_^][YSUVWj _^u񍎔3ҍA IPP@u뉖8j Y@PPPu퉖Ήj@_^][V6m&Y^Vqt7 h$V6YY^SVWNtjmfj _u_^[SVW3_7wwG GGth$SYYw_^[D$Vt=SUW~kPtPvuD$tkPQWYY_][OD$t jPVWYY^QQSUl$VW3ɋjPZ 3 P/3Yt*(D$t!Pul$D$lj|$9{ v=l$ωL$C4)PL$GCDPFL$;{ rՋl$D${ v&;s"kP tC PoGP;rKtjD$_^k ]C[YYVW39~~4]GY;~|f_^QVW39w v#Sރ tO PFP;w r[D$PWYOX Gǀ G_^ǀ YËA 9D$r;D$rPoSUVWt$3ۉ_ _UB<3҉BhLJjYD$fPLJZVD$PYVGP D$P,VO X 3LJLJ3A(Љ$%, 8<j]@HLLJPX\`(4j0[1u yu3B09~ A!43̓uɉfLJ_^][UQSVEWPTEPTYYN PjuaN3ۋ< @ Ɔ9^ vk3 tFP PuND<9sD@9s|)t|(uƆCP;^ rN(H L <42jƆ0[9u yu33B09~ A!4u_^[]QS\$UV3W|$t$9n v:͉l$FSPtL$FSPtL$EPL$;n rj ^SUjtul$j ^SWmFut$SP4tSP%tSPtSPtSPsSPsSPsSPsSPsSPsSPsSPsSPsSPqs_^][YVW3VjjVVVVVjTPPTOPhV _^Ul$Vu3SW39~~U4IWYYC;^|F9F|A3jZD$ QY9~~ G;~|6D$YFU7@PVUN49FND_[^]Vt$ 2kT$PN^D Vt$3FFFF u^I 3IAASUl$ VW3߃N N9^~ʋ9(t)jXC;^|h$Yt't$wt$  ]߅tWˉ+F9Fu;@3jZF QwY9~~ LG;~|6bY.NF_^][VWvAv3~4v~)v ~~ _^UV3W9n~%Sth$SYYG;~|[6N NY_.nn^]V39Vt$9Vt9Vt9V t9V ~NщDB;V |^QQV~~~~ L$SU3ۋA +F+A+AD$ A+F++‹)9^W333L$ 9N~LN F ˋD8D$;t*/PD$PD$(PRt$,BT$ωL$ L$ G;~|FPD$P)PRt$,C;^|_][^YYUAVu W;t5EU;t+EEE@ED$uMUpR8_^]SVq3W~9ϋ\$9tB;|3_^[Vq y39Q~W9;p}pq B;Q|_39A ^OA Vqy39Q~W9;p}pqB;Q|_39A^OAVWqt$ jhPaVe u2j hXaVQ uV YtVVwYV_^ SUW\$ D$33|$E{kkk C {{{ V0VZVCCVZVC2VZVC !PqZ;Xs s 3ɉCj] QYYtȅt9y̓uNjK sAC3ɉt$jZ QtC Y~'ދD$ ϋ4<"tA1uEB;|ߋ\$U;3ҋsY9T$~8C 4D$ <"tGuWQV3҃ FE;l$|3{$9S ~`l$ uK >#uKVcT$CCCCKBT$L$;S |^_][ SUV33W3E3L$tq<"uauFAPVXVsPX3jZ Qt'L$Ù+;}uAω C mG;|D$<t Ù+;~ VY3_^][ËD$t, u@ut t@u u@uVW39wt.9wt)9wt$9w t9w ~Gt$L$PakF;w |_^D$SUV8#WxEGP]OQNOQ?OQ0GP Q މ]_^][L$A< w0ÍA<w7ÍA<wW3UE USVu3WƋMRVG#EwfG G___P8VPDwj VMGPtFgj VxM GV_^[] SVj ^jt$@L$jt$CL$9t$,uj^t$ PRHD$ t$ 3PRHD$ ,'B"9+555A6 77F888 9SUl$,Vt$ WEVPUND$4͋D$(PRd$$D$ D$4\$(~NUV؉\$,YYu\$(EVPD$4L$(t$UPAYYȉL$u y$D$4D$4tuyI߃UH|$8y |$(tV Pt$0D$0N L$D։T$(;}UVS C;|t$D$$L$EΉL$u3Ht$ UVW GD$4;|L$ ߉D$(L$$D$4@D$4L$;yy?uV HPVt$FD$4;#UVYYu F;t$4~ D$@Dt$Uy |$(tV Pt$0L$0F D։T$4;}URST$@ C;|L$$F\$EƃpE UVW G;~_^][ËыJ;Js:B AVB BBJ;|ABB3;ƉBJQ^j XfB BBBVW|$ j GPEFPtGfj PE F~ u~ u~ t F;Fs33@_F ^|$} t$~-Yu|$_t|$ u3@3Vt$}VQ-Yu_t .t-u3@^3^ËD$=}t3@3S39t t$tC[D$=}t3@3Á3ĉ$S$U$VWUP3ˋV HPV;u P EPRp;j W>DȍAQ vQctG;|;n*t3@dF;ujUj oUCȍAw *uj.3D$*G;}_}Kj UCȍAQ vQu QtQtT<GE;|D$D<haPTDYYD$haP;DYYD$haP"DYYtqD$haP DYYt\D$haPCYYtCD$hbPCYYt.D$hbPCYYtD$h bPCYYtj jjjX$_^][3,U}|'} |!S]uP;E t u uPL[]VFvHPRHD$F^tD$;As2Vt$~ u*W|$9~t ~ t~ _u j ^ËD$F^à D$0 $SUVW|$DjWt$Dt$Dt$Dt$4PUR(L$$t$D$@;L$|$t2L$\D$@EPUR,t$t$ D$HPRHd$ |$(-uD|$,-t$ D$΋HPRH|$D$ ]L$|$tD|$("u=t$ D$΋HPD$HRHL$D$ jj"D$P |$('u=|$@uVt$ D$΋HPD$HRHL$D$ oL$fjj'몃|$(j _u~>u~EP1Yt9]WM EEPt~FvHPRHu^]sY_^[]UE VuW3}Fv}H}E@PRHFv~Yt ~.u$~.tFMWE E jPهɃ~et~Eu5~+t~-u)FMWE E jP裇v}~Yt׍EPYuF FvHPRHu~}Y_^]USVuW}FvHPRH3F]]]E@/v}Yu'v>YSEMjEP68^ t̍EPYu F 39]WM EEPKthPbMF4}uFvHPRHu^]Y_^[]VFvHPRHD$F^QVt$ WD$ ~u2zS3ۅt 9^vPnYtWUtOSBUSYuEЃ w1S$<_u|$uS<_CD$;r<t2][_^YSUl$ VWjhTb}23t[2ۃu[tPV<_ut@2/V<.ut,u(2VЃ wF;r2_^][!t$tV`ȃ_ut2AЃ wkD$ D$F;r #ut|$|;tF2eV P;Yȃ_u {2?.ujb2$AЃ wA AwA;D$:F;r#( ;F;V~t<,t<|t<~t<$t <:t<%t2ðËD$=}t3@3ËD$=}t3@3Á3ĉ$$$SUXh WxT$,P@D$43$ jE$QP$L$T$@$D$;D$rV|$tB|$ uL$D$jHPRHD$  |$ uL$D$j HPRHD$ t$(D$,\u9 tj Y;u0L$|$( |$, L$j Y|$ u,VYkt$ L$D$HPRHd$ N|$ uV˃|$ VY%jdD$@PL$L$0D$t,t|t~t %t:u^Á3ĉ$$$SUVXh@ jQ$L$T$<$\$<$D$H>t$L$;j ZW|$ ǃx(?HT$({;BЃ w/\$$SYtCЃ wL$FWPRHD$ +RYL$WFPt RHD$ RHd$ |$(}+L$5t$;t$T$(|$ oBЃ wK;L$BЃ FWPTRHL$D$ t$;t$T$(|$ 뽃:= 8D$(;j|$("zjL$|$ t$T$(-9T$, L$FWPRHD$ 5t$(Y#jdD$@PL$HL$4D$)J9;D$8} τt .YhD$TPL$L$0D$PPmtj^L$4D$PPmt$ j YED$t$ HVL$PRHd$ L$,D$(t$jFـ|$t D$ \u"t't \L$g'Q|$u\t˃";D$8}DŽ|j도pj냃*c/ZL$yjL$L$,D$(t$|$ /;D$D}(T$H@/uF*uL$FjPRHD$ $/L$FjPRHD$ "uL$FjPRHD$ 'uL$FjPRHD$ #u>L$|$( D$t|$( u;D$r߀|$tUL$Ht$ PRHd$ ?P!Yt4L$D$t$ HPRHD$ L$FjPRHD$ L$t$;t$[L$ Ft$PRHWUYY$4_^]3,ÃSUVW|$@jh0dP0ϋjhbD$P0ϋjh@dD$P0\$0D$4D$Ãd$D$SPD$ ~MQRD$ SωD$!SD$DRD$(D$;K+ÉL$$D$D$@j QψD$<$%\$8t$$D$DD$,D$<PL$4ЉT$( u|$@ u t2|$D$0t |$8ut u(t, t'u+N|$8u{uL$;OΉL$F}uNWUYYtTWujYYtB]SYYuEWPYYtFWSYYtEWPYYuN|$0t[|$ƋL$ EL$ |$u |$t ؁ ;UM؋ϋP;t SUPLEt$ 3ۉt$\$\$D$4PkYuC\$L$$Al$L$$l_^][Ãx3ĉD$tSU$V$WEVl$PUF|$PRjdjXD$(\$$Pg ;t$ +WOj W͈D$3#\$ |$a|z~wd} .CEj U"jD$$D$hdP!|$ tLjD$$h dP t4jD$$h(dP t|$ uGN|$;|$} l$D2$_^][3xS\$=sP} Yt2[À%ts^tn&ti*td(t_)tZ-tU+tP=tK|tF{tA}t<[t7]t2:t-;t(t,t/t?t!t .t~u[Áx3ĉ$t$$SUT$4PT$8PT$

    ujL$2g|$t@t$2PVPYYu"t$ L$D$HPRHL$(3D$ 5L$({t+t!t^t #L$D$t$ HPRH|$ QYL$(-u.D$Xh8eP, YYt~D$XhDeP YYtiL$($tdD$XhPePYYD$XhTePYYfL$C5D,E#F.uT$0AЃ D$ 3ɀ DD$ P|$t[D$X2h$eP.YYtD$Xh(ePYYL$D$t$ H|$!PRRHD$ x|$$;uL$D$jHPRHL$(D$ u4PYut$(BY%L$D$t$ HPQ'Y|$(-uD$Xh8ePXYYD$Xh$eP?YYtD$Xh(eP*YYtL$D$t$ HPRHD$ |$j=|$$..QYL$D$t$ HPRHD$ D$ 7Ht`Hu'Q9Yut$ L$D$HPRHd$ L$(|$ n3;L$PD$HPRHD$ F;L$D$j HPRHD$ f|$$}u\}tW$ PD$\P YYtj^0$ PYuL$T$ P^j^Et$ V3T$XFt/<{uu j^u<+tYL$03҄EʉL$0|$D$Lh|ePaYYuk|$@Wu?D$]D$\D$^D$]D$_D$^D$_D$\$eP!YYu+D$0$YL$@3҈D XAD$\L$@DˆD$\D$<< u|$ u< t |$D;L$ |$(5|$_*W^t |$$ D$LD Lh|eP\$YYu 8D$0tC\$D$LheP]YYtiD$LhePHYYtTD$LheP3YYt?D$LhePYYt*D$LheP YYtD$LhePYYuC\$D$LhePYYtD$LhePYYu\$D$LhePYYtiD$LhePYYtTD$LhePYYt?D$LhePjYYt*D$LhePUYYtD$LheP@YYu|$KO\$|$|$D$LhePYYt*D$LhePYYtD$LhfPYYuO|$D$LhfPYYtD$LhfPYYu\$|$D$Lh fP|$0YYuK\$FUPD$4|$-؋T$@YYL$tj X;u;;uAL$|$&t3Wt&;S;AL$T$ ƒ|$4u |$'t  ;VM͋EP;t EWVPLD$(L$t$,|$DD$83|$_\$(؉L$\$4tvD$ D$@D$D$D$0`;;I1R0^tu ;uIFB9T$0IJL$%\$4t$<Yu D$t(t)t[t ]t,u[Vt$})VYu_t@t#t $t.u3@^3^SUVt$W|$VPNQϋRp+UR<tj Vy ؈\$t$,Yt N;|2_^][À_3@9D$t |$t3ÊD$< t < r< v33@Á3ĉ$$SUWXh$L$,H L$0H@D$83$jE$WP$L$DL$$ļD$;D$VL$tt$PjPR,L$|$D$ t uL$PD$HPRHL$jXD$ uPL$D$HPRHd$ u.t$(}VXYX.OD$ Pu t$(}V%Y%_˃ t$(} VYu .t_u |$(.jdD$DPL$ L$0D$@PNtj^nD$@PNtj D$@PNtj ՋL$4D$@PyNtj뿋L$8D$@PcNtj멋L$uHPu&|$("t.D$ jL$D$ L$(AЃ .uD$,Ѓ t$(9Yt L$D$t$ HPRHD$ |$("u L$D$t$ HPRHD$ |$('uL$D$t$ HPRHD$ Mt$(cYtL$D$t$ HPRHD$ F|$(#u?L$D$t$ HPRHD$ L$L$D$jHPRHD$ L$D$;D$^L$ D$t$HPRH$_][3ĘÃ83ĉD$4D$@d$SUVt$XW|$LljD$0WPSΉ\$R%WD$$4QYjhbΈD$R0΋WD$PD$(;|$0D$8+ljD$D$PbY؋΍G\$4j PD$4QAD$,Yt$,D$(΋|$PD$( u u D$ uD$D$$ttftwt e33@+ljD$$WPPYt4W:PYL$9D$$ǃ FCD9GrD$8hePYYt*D$8hePYYtD$8hePYYuED$8h0fPYYtD$8hfPYYuM u{t(t }t)E|$tRL$D$ u 8L$t;~ ~ ΋\$SP;t WSPLCl$ 3\$|$\$|$t$4YuG|$|$,L$;|$0SP% D$ PSRLL$D_^][3Q8S\$PYt2[À*tK/tF-tA+t<(t7)t2=t-{t(}t#[t]t;tt ,t.u[S\$=sPaYu .t_u3@[3[Á3ĉ$$SUV$΋(@WD$0jh8fP0L$j33$ VE$P$$賵D$;D$0j ^D$ uPL$D$HPRHd$ Qut$(Y.t$ [upt$(YjdD$8PL$虜D$4PHHtj^L$0D$4P1Ht$ j XEt$ VL$D$HPRH3D$ u/tt$(JY+j3|$"|$,^u|$ P u-hTfL$+tRL$VujL$7u6|$("t|$|$,^jL$D$$ M3D$ L$(AЃ ^.uD$,Ѓ Ih`fL$t>L$D$t$ HPRHD$ L$覻|$(D$;D$rt$(}VYu._t)t$(|u@L$D$t$ HPRHD$ L$D$t$ HPRHD$ "u L$D$t$ HPRHD$ #uBu>L$D$t$ HPRHD$ L$պt$(.HYtMD$;D$rAVuYt6L$D$t$ HPRHD$ L$D$jHPRHD$ |$t3t$(GYuGL$YD$j ^;D$L$D$t$ HPRH$_^][3۝ČÃSUVt$8Wjh0dP0΋jhbD$P0\$,D$\$0d$,SPUR%SD$SD$@RL$0D$;C+ˋ\$4D$L$0L$uٰ[_^23ĉ$$$S$UVWjD$hVhdjjVh|fj_WL$hjVhfj$jVhfj$3퍌$UVhfWUVhfj$UVhfW$zUVhfjL$xh3hD$@D$TD$D$D$8譚$$Y3ɉD$T3L$@L$DL$HL$8l$L$@ u=;v3EWP< tO;wl$L3WVPVOQR3@jYt ttt ;tu$;v3EGPR;uO;wl$L3jSV+L$ UW5l$`|$TD$;D$D$$ w$gt$$D$ HL$PRHd$$\$,3B9T$X jAXj?_YDL$8But#u^j $PL$l$33҉L$8t.k ÃȊB؄uL$8@~jAYL$8At84CЃ , CujSu YY&Au 3@D$$A$$|; jAYL$8\$,\u=t$0 t u/L$i\$, |$0 L$H||$!u`D$<D$03ۉD$PˈËt$0L$D$4'"8D$u-u @D$jt$0;$} $0$t3B\$,T$<|$0YtA|$!uL$ t$,Fc>Yu~L$D$t$$HPRH\$$ڰ|$!L$th$P$PWYYD$~ \$,;$} $$L$P@t$+3@;it$$FZ\$,\u 9\$D;\$Hul$@I4;\$D:D$@1CЃ w]L$D$jHPRH|$,0jBYD$$L$8zD$0xtXtЃ `jCYL$8TjCYL$8;$} $$tL$D$jHPRHD$$ #uL$D$jHPRHD$$"uL$D$jHPRHD$$>'uL$D$jHPRHD$$`uL$D$jHPRHD$$ t$,v$uL$D$jHPRHL$D$$ 裮L$,{u D$$ ;'u D$$,"u D$$(t `|$0(j XDƉD$$QL$D)9L$D$t$$HPRHWt$t$$ߐ$Ӑ$ǐ$軐U赐$詐$$_^][3lĤfoІ38߈Š$SUVt$DWjh0dP0΋jhbD$P0L$8D$<D$d$D$ QPURt$8΁|$Gt$8D$LRL$8T$ D$(;ZE+щD$AD$$T$ L$Hj L$@Pt$$D$L΋D$,D$4PD$(D$<< u|$H u< t2|$L$8t>t:VU YYt)D$VPD$4YYu#Vt$YYtCD$<|$0u3<{u*C,Vt$0YYtVt$YD$@YuK<}uK|$8tML$D$u8L$t;~ ~ UP;t WUPLED$d$|$t$}6F3W`u&WtGG v3D$(F3E uTuu|$tL$ˋl$UPL$;t QUPLL$D$El$3%!t$3D$$0G$0;|$ $(_^][3豅Yh(t$t$t$ht$t$t$ht$t$t$ËD$=}t3@3ËD$=}t3@3ËD$=}t3@3ËD$=}t3@3à D$0SUVt$@΋W|$4D$,jWP8jh,`P0΋WD$8PUΉl$ R%D$D WΉD$$D$΃d$D$@D$8WD$(RD33ۃ|$< D$8E\$.u WYu_etEuWYuJ.tE+t-u et6Et13D$xL$T$|$\QRϋPHl$l$0|$tL$ 蹔l$0\$8l$T$LD$(;D$$s |$@L$ HUPRHL$x_^][33xlyU}u} u}uE8u M]` ]t$Yu|$_t3@t$Yu|$_t3@t$Yu|$_t3@UVu WPY>.htkVYYhkVYYhkVYYhkVYYhkVYYnhkVYYYhkVmYYDhkVXYY/kWVBYYhkV-YYhkVYYhkVYYhkVYYhkVYYhkVYYhkVYYhkVYYqhlVYY\hlVpYYGhlV[YY2hlVFYYWV5YY h lV YYh(lV YYh0lVYYh4lVYYhL$D$t$ HPRH3@rh$ PL$3nu$ PN Y$ P$p-tt j XL$<$ P t tj^zL$@$ PtHtD$P$Pt$ t$Pt$P$ut$ !L$4$ Pt$ j XEt$ Vq|$(:uPL$h$ PL$*mu$ PEY$ P)}jX"t$(fYch$ PL$lu$ PYL$H$ PtjXL$4$ Ptj L$L$ Ptj ȋL$P$ Ptj 믋L$T$ Pftj 떋L$X$ PMtj z$ P3tj`$ PL$`D$ PL$D$HPRH3D$ Q|$('u"L$PD$HPRHd$ L$}D$ |$,'ujL$襕L$^D$ |$t$(3/YL$ED$t$ HPRHD$ Uu*|$((uD$0뮃|$()uL$0uj0IL$0둃ut$(/Yvt$ ht$(褺YRSt$,YY>|$(.3St$,DYYD$PX3ۄD$YL$ÃH\$ SPRH$3D$ t$(VYu'!J*A?u,j XL$D$ L$D$t$ HPRH!l$ +L$D$t$ HPRHD$  |$tL$PD$HPRHd$ t$($Yt L$D$t$ HPRHD$ t$([Yt L$D$t$ HPRHD$ D$(!tb|t]'uL$9D$,ujja\@uWt$,uh\khlkYYt8L$D$t$ HPRHD$ L$D$t$ HPRHD$ L$載D$$;D$!L$D$t$ HPRHL$\g$l[$|O$_^][3mUjuuuu uM]Ujuuuu u/]ËD$S\$+Ul$W3D$t8D$ H+݉D$V;s'L$4/3P!PGD$Y;|$r^/_][Á3ĉ$$SU$V$ΉD$(WUPSR΁U|$UD$Rd$d$$D$ )D$D$Ej PD$0Mt$(D$ΈD$8$D$4D$$$PD$ D$< u|$ u D$< uD$D$0u$t uUl$$t uGt$Yt9t$4Yu+jdD$+YCjPRHD$,0j_< D$< t< t < t< jStt |$$tp<$<\u*ntrttt"t `t'u j UPHut$*Yu,Vt$4SP@Pu j SPHD$$|$4t}uj UPH2D$4|$$u)CWPRH|${u D$4D$$ D$$D$4݋l$;%EWPRH_^][ÃVt$0jh,`P0UWjh@dP0Ht$(؋D$ D$$RURL$D$8T$~EPRT$D$(D$,D$S; j W[l$<ȈL$twT$uA|Z~,a<w|$VA|Z~L,a<vD~?t$$GVSPR;u|$ tVt$ W< tK؊L$2l$< uft|$ tVt$ W tKË D$Ё 9\$UMЋT$@PL$<;t QUPLD$<ET$L$T$G;|$Ë ‹ ;UMP[;t WUPL_]^Ã(3ĉD$$D$0L$8W|$0+ljL$v D$8eSU3ۃVt$DD$tJD$ +Ǎl$!D$+3@+ljD$s,WL$9D$ǃ,L$C/G;\$rύD$ hkPyYYD$ h|lP`YYD$ hlPGYYD$ hlP.YYlD$ WPYYD$ hlPYYD$ hlPYYtmD$ hmPYYtXD$ hmPYYtC|$Lt'D$ WPYYtD$ hlPYYuF^][L$(_3&a(Nb́3ĉ$$SUV$WjdD$3D$$WPfjd$WPV$$+D$FvD$t$t:D$ +؃cs+L$t$ 3P P<GY;rЋt$D$ hlPYYD$ hmPYY}D$ hkPvYY`D$ hlP]YYGD$ hlPDYY.D$ hlP+YYD$ h|lPYYD$ hlPYYD$ hlPYYD$ hmPYYL$$PtjL$D$ PtjD$ PtjnD$ PCYv#D$ {uD$ P*YL$ |}uj;D$ ,0< w3A;vcsD ,0< w A;rj3j j j j X$_^][3^Ã$$SUVt$0W|$$W L$(QD$(,l$ ^؃d$,YL$0jW\$<D$AΉD$ R8WPD;?D$$j ؍oUΈ\$8t$0ΈD$({tj GPfD$3+,t6H"uj GP<\u t ud$jP'Yu0_t+-t&$t!/t.t*t!D$WOPj=UYu|_tw-tr/tm$th.tc*t^!D$\$4D$(L$Stj 3L$Stj!j/SoYYuj.SoYYuPjGWUǿ\$8YL$(AL$(_PاYu?.t:!D$\$4D$(j.SnYY΍GtjjPRHWO]L$(D$4AL$(؊D$$E t tj'L$) t t t t #u23AL$QWPHD$$\$4G;|$S\Y_^][À.ujYǀ"ujU藧YtjU荦YUt!躾\$8YD$(D$IƦYtD$4D$(D$"jX3ĉ$$SU$3ۋL$HHVL$PH@ WD$XESL$`h8fP0S$VhmSD$C赒SVhmS$衒SVhmjL$|菒jVhdjL$p|jVhdjL$TiEjhmP0tD$h@$D$L@$$ $j XD$@\$<\$4\$8u]EVP~P3ۍFSP貼SFP裼j!X u uSFP臼 t u\Åt>tEWPP uEWP< uj W5D$@jU$L$$V#nD$;D$$j/^L$|$ t)uL$D$WHPRHL$|$ 3҉T$<}D$<hNbF|$< T$D\$u{u ;OF\$ }uË\$P>T$$YuBT$ |$8uL$D$IH;uY|$E Ņu 8T$t ؋ρ ;l$,M؋UP;t SUPLEt$l$,3D$ l$(L$AL$A;D$_^][ ËD$~t tt33@ËD$3A;tt tt3ɊVt$W9Gt29Fu.9GuSj[Gj P8uFC>u[_^2$$SUVt$8W|$,WҫL$0QD$0,l$(UM؃d$YL$8jW\$8D$ AD$$AD$DD$(R8WPD;D$,j ؍oUΈ\$@At$8ΈD$0Ojtj GP!ND$3+sPYT_K-B/9$0.'<>@ !D$\$0D$L$StjWPHL$SntjL$ SYtjj%u(8L$tj Ud$j W%uGjPD$ D$DRH"uj GP蕭<\u t ud$jPCYtL$D$0AL$؊D$,\$0D$d$jGPRHWQOa t tjEL$? t tj+     #u*j Uˬ<(u j]l$U3AL$Q\u#j U蜬< tj U莬< uV3A΀)uj Ut<#ut,t|t~t %t:u[Á3ĉ$$$SUWT$jX;3L$CVPRHD$ ǃ,H t`t\tW tRtMtHtCt>t9tttjX;t L$CVPRHjXD$ L$CVPRHD$ zt!tt ttt TL$CVPRHD$ 9 jX; {ǃ>Httt.HL$CVPRHD$ t!tt ttt L$CVPRHD$ L$CVPRHD$ itQtL tGtBt=6 t3uAL$CVPRHD$ )ǃ|t tTuuL$CVPRHd$ t$(FYtH|$ L$D$jHPRHD$ xtjX;t ttt땃|$(*u|$ tt$$t$$Yj[t1t,t';t#ttttt t uajdD$dPL$&8|$`|$`tPxYuG8ut$ Fw'_$OL$@Wj^t$ j_D$(.tR:tM#tHt( t#(t9)t4ttt tuL$D$VHPRHD$(3Ft$ /i|$,*^L$D$VHt$8PRHL$D$ W|$0L$W\$D$4j"Z;\$G^L$ Ct$PRH$_][3&;ĸËL$DWtjL$HWtjL$LWyj^Et$0\$8:u;tL$PWQtj:uL$TW7tj:t (uu:tL$XWtjn:uL$\WtjTjMhoW话t$(YYj_Et$ 3;u."t'u$L$3ۃ"D$WË HPRH\$ P^Yt$ D$(u ]p;u;t&}t!!Y u;t{FtL$D$VHPRH|$(D$$D$ |$0D$8fvSUVt$4Wjh0dP0΋jhbD$P0\$(D$,D$Ãd$,D$SPUR%SD$rKQΈD$t,+t'=t"~t|t[t]t(t )t2^ð^Ujuuuu u]Á3ĉ$|$SUW$3jW$L$8H$L$@H@ $L$LL$ D$HK$P~ HPR(3ۋD$;D$VL$t8|$ uL$D$j HPRHD$ t$PSPR,L$t$(\u;D$, t u-L$TR|$( h|$, ]L$5ROD$ H"$wL$D$t$ HPRHd$ t$(Vt$,Y.VqY$$hL$Pt041L$0$Ptj^6L$4$PtjL$8$Pt$ j XEt$ V7*F|$,/;L$2QjL$eZ*t׃@t \t$$hYu |$$*t$,OYjL$D$]t$ HPRHD$ @t \t$$Yu|$$/t |$$!t$,Yyj듃u*u|$,/u D$ VTYD$D$@jdL$PtT//t$(YtL$t{t}t[t ]t2^ð^ËD$3A;tt tt3ɊÁ3ĉ$$$SjQ$L$$$nAD$ ;D$oUVW3t$ u1|$( <|$( 1VL$D$HPRHt$ uVރuUt$(vYjdD$4PL$P(D$0Pt$ jYDt$ VL$D$HPRHut$(Yugt$ уu|$( t |$( jMu|$(%t.|$("fL$;H뺃uUD$( t4 t/%uL$Ht$ 3'+L$Ht$ L$D$jHPRHj^t$ |$(-u#9|$,unL$D$UHPRHD$ "uL$D$UHPRHD$ 'uL$D$UHPRHD$ GЃ vi.tdsWuYu4_t/|$(t$ W'tOL$D$VHPRHD$ 5L$D$t$ HPRHD$ L$D$UHPRHD$ L$FD$;D$_^]L$D$ t$HPRH$[3Z*ĈÃD$SUVt$ W|$4ωD$VP؅t~ KSRD$d$hPSRPVϋ胈;t$\$4FL$$j PωD$$9ȊD$$L$(< u u< t D$;D$hPCPRPD$$uG݋##;r.t/L$d$hQt$t+,t&.t!^t%t:t!t @t?t33@SVt$ 3W|$heWP uahHpWP t|$uIh|eWP u8hLpWP u'hTpWP uh0fWP t3C_^[Á3ĉ$$SUV$΋(Wj$P8jV$L$$$8D$3ɋً;D$@j\Z$t$ L$D$HPRHd$ |$(@ujt$(nYm|$(_bjdD$4PL$FD$0PZt#jXD$ PL$D$HPRHd$ 3*|$(/u jXD$ j|$(@uj|$('9T$$D$ QL$Ht$(unYjXD$ P|$(@u t$ \|$('9T$$D$ 룃|$(@tt$(mY^|$(_Sj 랃|$('uj lt$(mY?t$(DnY-j A|$(' 9T$$D$ t$(?mY|$(_j |$('ujt$( mYjt$(lY|$(_D$ j |$('r9T$$hD$ t$( mYtk \$(<|$(#uC9jP|$(.ut$,lYt3D$(et'Et"L$3jXD$ PD$HPRH!\$ 3j^t$(S\YYt$(3kt$$YL$jXDD$t$ HVPRH!\$ D$(etEtP+lYij"D$(-t!+tPlYuD$ jYOj\t$(G%t$(kYt|$(. j0t$(kYujt$ L$D$HPRHd$ 3|$ uB|$$.u7D$(*/;^'jj |$ u/t$(jYus|$(_tlt$ L$D$HPRHd$ R|$ u|$("9T$$*|$ u|$j{|$ u9T$$t 9T$(hQL$ E|$ S|$(%uL$D$jHPRHD$ .|$("uL$D$jHPRHD$  |$(#u j ^j|$(?uj|$($uL$D$jHPRHD$ |$('ujt$(jYt \$(j ^V|$(.uj^Jt$(iYt+t$(jYtL$D$t$ HPRHD$ ^t$(KiYt 3Ft$ L$D$HPRHD$ 0t$(W^Yu|$(\uL$D$t$ HPRHD$ L$g:D$jYj\Z;D$L$D$t$ HPRH$_^][3ĈÐEtP.u?TD$ SUl$$VW|$<ωD$ UPSω\$@R%j UD$UD$0Rd$D$\$,Ej PD$$t$ϋD$8D$(D$D$8|$0PD$ u u D$0 uD$0|$$t#|$4ul$l$4u/%uQ{tK}Al$4ttt$PWT ̃u"{t(t[t}t )t]uNF|$0t>D$t$<؁ ;N؋P;tS\$@SPL\$L$CWPRHD$ |$ \$L$CWPRHD$ |$,/L$CWPRHD$ "uL$CWPRHD$ +tY-tT*tO/tJ=tEt;&t6|t1!t,?t':t"{t}uGL$CWPRHD$ /L$CWPRHD$ L$CjPRHD$ L$)4\$;\$_L$ Ct$PRH$^][3ĔÃt3ĉD$pS$UVWjhbP0$$D$ƃd$D$8VPPD$0R%ˋD$0Vl$uVD$Rd$4|$aD$ 3jD$dYf D$ˈD$$Fj PD$0Syt$(|$$ˈD$D$@$D$ $PL$$l$D$ u u t2WT$t,t$uEt$ u uMl$u(/u#:uD$(j @Px<{uE<}uMl$|$u t$4 t$$5tYt$<#tYu{+t$4L$@l$43+FD$;s't$@.PUtPxGD$ YrՋl$ D$`D<@PD$DPD$HPD$ll$ P[|$tcL$D$0u 8L$t;~ ~ ˋ|$,WP;t VWPLD$`l$0G3hWP|$4t$ [YYt$t$$/lYuFt$t$(;t$8ˋt$,VP% D$0PVRL$_^][3tk3@9D$t|$t |$t3Wh0ft$3wYYu_SVhet$wt$|eYYu SVwYYthfVwYYu heVwYYhpVwYYhpVowYYhgVZwYYheVEwYYheV0wYYSVwYYt|hpVwYYtfhpVvYYtUhpVvYYtDhpVvYYt3hqVvYYt"h qVvYYtheVvYYu3G^[_Á3ĉ$$SUV$hWx@ D$8j$L$<Ή|$8P8jV$L$3$$3'D$;D$j Xt$ uVL$D$HPRH3t$ t$(3YjdD$@PL$1L$4D$_t9|$([t2t$(NOYu|$(\uSL$t$ D$HPRHD$ 6t$ L$D$VHPRHD$ VL$D$HPRHD$ |$038D$Et$({YuCL$ +D$;D$j XL$D$t$ HPRH$_^][3ĔÃD$SUVt$ W|$4ωD$VP؅t~ KSRD$d$hPSRPVϋl;t$\$4FL$$j PωD$$kpȊD$$L$(< u u< t D$;D$hPCPRPD$$uG݋##;r.t/L$d$hQt$|$0!u}hrL$euKh4rL$eu9hLrL$eu'|$,$t L$D$t$ HPRHD$ L$D$t$ HPRHD$ $u+FЃ w#uL$D$jHPRHD$ FЃ ^.uD$,Ѓ IVcYbt$t$(cYott$(cYztL$,L$,"'D$(.u/QMKYt L$D$t$ HPRHD$ D$(=}/PJYt L$D$t$ HPRHD$ D$("u L$D$t$ HPRHD$ 'uL$D$t$ HPRHD$ gP?Yt\L$D$t$ HPRHD$ ?L$D$t$ HPRHL$D$ L$D$jHPRHD$ L$D$;D$"L$Ht$ PRH$_^][3:ĠUjuuuu u>]Ujuuuu u ]Á3ĉ$S$UVWjhb\$TP0$$D$Ńd$0D$$UPVˉt$ R%UD$t((t#)t;t[t]t{t }t:u[Á(3ĉ$$SU$@V$8W$LjVl$@P8σd$0VPVω\$8RDjW$LL$$LVt$ jYD$<;t!ShD$DPD$PWUt$8jYl$;l$[\$(*à t|t++;u";\$0VUPHd$ d$0EVPRHD$ \$0lD$4@D$4uVK;PPhD$DPD$PWt$L7%;u|$,/uL$?t$ t$VUPH;tx+++;|$,/Vu(L$EPRHD$ L$t$ t$돃|$0*uL$EPRHD$ ;totjteEVPRHj UPHd$ L$ot$4>~ \tM|u);t%t tEVPRHj UPHd$ L$%l$t$ ;l$s9jY;t݃t؋EVPRHL$j t$PHt$ 밋L$EVPRH$4_^][3v(ÃSUVW|$4jhbP0t$$D$t$(V3PVϋHVD$(RD$D$(D$4;N+ƉL$D$(D$$QψD$ yHt$t$ψD$(PD$D$< u|$$ u< t2tuT$4T$4tI3ȅu |$t SDP;t VSPLCD$43t$z@YuEL$Al$(L$7SP73%8T$4 RSVL_^][Q$$UVt$WF t t t u&F;Frڋl$͋FvHUPRH~EWG3Yu.t_t \'FS\$$;FsO|$l$(N t7 t2 t- t(E;}!QYuFΈGF;Frl$|$D$;t P3Yt PIKYG?uD$SHxL$H L$ HL$$ttjDSdtj4L$SRtj"L$ S@tjL$S.tjXF͋UPFHPRHff͋FUHjPRH[_^]YVt$V1Yt2^Ã*tF/tA-t<+t7(t2)t-=t(%t#[t]tt,t ;t:u^Á3ĉ$$$SUW3jQ$L$$$/D$;D$TV|$ uj L$D$HPRHl$ |$ u&|$("uU{|$(\L$k|$ u|$('у|$ uD$(Ѓ j뒃|$ u5t$(Yt |$(."L$D$t$ HPRHl$ |$ mt$(YjdD$4PL$73FtmD$0hsPIYYtXD$0hsPIYYtCD$0Ptj1uj (ujujD$0P1Ytjj ^L$D$t$ HVPRHl$ D$0hhPHYYu3G#D$0hsPjHYYuj_D$0hsPMHYYujD$0hsP4HYYujȍD$0h|rPHYYt ttt |$ u|$( t |$( j |$ |ghsL$荖t"D$ }LL$pPD$HPRHt$ 3hsL$Yt!L$PD$ HPL$v 9l$ vL$(AЃ 0.uD$,Ѓ hsL$t L$D$t$ HPRHD$ hsL$ŕt L$D$t$ HPRHD$ t$("u L$D$t$ HPRHD$ 'u L$D$t$ HPRHD$ s2V #YtL$D$t$ HPRHD$ ot$(}cVg-Yu_uSL$D$t$ HPRHD$ 6L$D$UHPRH|$(0D$ u|$,Xt|$,xu L$L$D$;D$^L$ D$t$HPRH$_][34ĈVt$}V,Yu.t _t'u3@^3^U Mjuuu uVuEP#YYME;ErMHuPRH]SVt$ Wj[~t7|C~P|W~G w,~%u&~>u FWHPRHΉ^jFP|W t$Vx t$VYYFtuc~D$PtD$huPCYYu%n8F tjXjVXFPPSuvcYuMv9Uu#~"t~ t~ u1FWS| ;u~ t~ uUFHPRH^9^NAЃ vk.u FЃ v[QYtFvHPRHFTL~'uFvHPRHn2~"u,FvHPRHFUFSHPRHFSL$t_^][32hUjuuuu u{]Ãh3ĉD$dD$pSUVt$x3W8jF[ u(hu U umF;t#=P2)YF.-_:jXFPFHPRHn}v;Yc~/u ~<S~[IjdD$P|$/D$tD$P肅tF~>~/u\~>uVFvHPRHF u>v~:YjdD$PgD$PuFv;u`~>uFSHPRHF~/u~>uFSHPRHFa~=uWFSHPRHFAu~" u~'u+Sy!uFЃ vjFHPRH^~ue~uFWHPRHUFV!Q8YtFvHPRHFL$t_^][3hÁ3ĉ$$SU$$HL$tHW$L$tH L$pH@$jL$pUP8$Ƅ$Ƅ$C vCw CɃ w $VS.$Yt3݅t$CPRP.Yt KF$3ۉ$S5$t^JS5u"AP 9P5$uI$FQP$؅u3D؉$jQP8ϋ$UPȋL$\~QP(jh$uP0D$2jZ#ʉL$,L$LL$DL$` SL$hD$\/|$0YjD$,Yu DD$(jhht7j[UPȍA;wu鋜$2uj UK:D$h$UPD$,0l$T;$t$D$ VD$pt$$LYuj*X;t+tD$hj,Y;EƉD$hU6ωD$Ej PD$<9$σj VD$ t$P9t$ωl$@tl$4t$j XD$t$轀D$#Yt|$Su |$0tD$@t$,SN5|$8YYȉL$tD$(HttD$T$ u u uyl$$|$0$‹t$@ E‹;~ ~ t$\QVPLd$@$D$\tT$:u~ t u uD$$|$,</K10j*Z~;t j,X;l$,L$(  u;l$$ l$4j U7< u< uNEl$$ƙl$$yNFt$HML$l$$l$R5U,^w|xC +t$u3 u EutGD$H$.Ft0j PE5ȍAw $@$;tL$$HQPRHd$,d$(l$Hj[\$@D$dD$D8S-'||$<? Sn'$jPVWo/ȃL$(tSV-t$$ϋHPRHD$@\$X\$4P@jdH$PCPQW-%j^V$htPdl$H3Ƀ Dًω$uj jSPHU'؋D$0HYƀ|$1D$,t tD$$j $3$aj*X;|)j,X;(H\C D$<%S,$QύFPRHD$,H\$XjYD$,@u j[j^VZN-u+j V3<-u&jVPHj[D$(=uj^VZ33FBt$`&Y؋$j$QD$0PHj $2L$,t$@D$L$,L$$|$1ADD$$D$|$(t |$(|$ <! t}Q$up\$X$QύCPRH|$-u-uj [SVPH$_WCPt$<++ tjjYQSPHD$(j[*l$,tjX;uHL$(tDSo*t3Ht\t kt|u2D$t%t?u>t%L$(D$>$ut$`FPP@PW+D$`σ.tmJtN`t$Fytt$wWt$tPP@P&gU$PW$FPP@Px'BUW$FPP@P(UW$FPP@P% jFPRHD$(tL$4D$@$$t$%ujuj ujZRjQPH\$X3jY;|$1D$,t |$(tL$$d$(9"auQ$P@PW*D$(jϋ$UPHj;$} $0$$u3QCPP@PWG*D$d;D$(t$t 3ɅDl$,W$CPP@P">uFjSPHut$(C"Y3ۀ|$2D$Lu|$DtL$$D$$D$D]j=3SPHj$;$} $0$/u |$ <$$D$6$N$PW$VP@PN"ȃ t u(|$DujD$0XDD$dD$(d$(3AD$>u{$QUPH|$,ut$(/!Y3ۀ|$2D$Lu|$DtL$$D$$D$Dt$P@;G|"7;jK[X/uGl$>u>ujt$VPHj t$8PHD$4$3ۉt$\$L$t$rj[jX;Db|$/t$D$H$HD$PPRH|$!$&j1&`$ϋHjPRHj (>u$t$CPRH"ut$$ϋHPRHj'ut$$ϋHPRHj=ut$ϋ$UPHj/u7l$>urt$$ϋHPRHϋ\$4j SPH$?u?l$>u6t$$ϋHPRHϋ\$4j SPH$t$3H;$} $0$$t$$ϋHPRHjXà KH;$} $0$"u |$ =u'u |$ =WP@P$YYύCtjt$PRH>j=|$l]Q|$ ]F$>t$UPH3L$$$;ut$UPH3ۃ#sVY.-_:wjUPH3f|$l-|$ -FC $(nt$"ut$$ϋHPRHj<'ut$$ϋHPRHj-u19t$ u3P@$K;Ct$PRHjs1VD$$Yt&%u!t$$ϋPRHjD$ #ut$$ϋHPRHj[u#t$$ϋHPRHD$(ja]uH|$(t$u$UPHD$(<$CPRHjSPH|$((!u2<$t$CPRHjYQSPHj>t$$ϋHPRH$jYQUPHrt$-u9t$ u$V"Y$ϋNW$VP@P!tt$VPHj[$jt$-u,9t$ u&ujjXP$PRHjV8"Y|$(ϋ$ujjXPFPRH$3Cj 3PL';$}($tCt$CƋPRHL$@FIˉ$j L$DP&|$(j[jXE7t$-u*9t$ U$ϋl$UPRHj[t$l$"(U$UPHjXt$'$t$֋t$-9t$ ڋt$-$9t$ {jUPHj|t$sVYt$$ϋHPRHV1YjXmt$;u t$4sV YD-;$.jGFCփ $Pnt$V#Ytt$$ϋHPRHj. /ukD$*u%t$$ϋHPRHj,Xj*X9D$<^ /D$h(t=t j,Y;t$$ϋHPRHj4F "ut$$ϋHPRHj0& 'ut$$ϋHPRHj1 u't$$ϋHPRHD$Hj+[$ VYt0$t$CPRH7Uj2YYPSVHj) t ] (T t$$ϋHPRHj) t$V脹Y& $ϋNUW$VP@PD$$j)[/u(D$j*Y;u9L$ut$VPHD$Hj+$,t$VYu Uj27YYP$t$/O $9T$ t$UPHj)[j ^t$t$ t  7Uj+YYP$HPVHj)[j ^t$ t$\u D$"t't \ D$4 "uUj0?u-u9t$u |$<>V t$$ϋHPRHj3K t$\t'uUj1t$Vvt$b$t$UPHj) t$ tL tG/tG\ L$;t / D$4j $@t$PE!D$ /uC\$;s6ST Yt#D$4ω$@j PD$<!;r҉\$t$$Dt$VYtt$$ϋHPRHjJ 'tK"ut$$ϋHPRHjKu$FWHPRHFj~|~ t$V[YYFj}_yuFP6Yusv_;u~ t~ u^WL|u~*uP~/uJg`ǃwu~" xu~'u$S~{tuPFHPRH^~t~u[hvbtKFvHPRHFFvHPRH^9^FPbYtFvHPRHFy~#thutau F/uB9FuFvHPRH~/u!~*uFvHPRHF|"uFvHPRHFwn'uFvHPRHFxQ$u'FPYtFvHPRHF{%FPYtFvHPRHF_^[Uu}ujvXEEPu u]Ujuuuu u{]QQS\$ UVt$ WD$nl$Vs < t Vg < uF;t$(|j V0j ~D$(WD$D$$PYu4|$$'uD$PYtL$0D$L$D$$l$FE;t$(}[W PauCW PYt[D$ +΃L$$;}W L$$D)FG;|$(|L$D$0ttP3Ʉ++D(G_^][YYËD$08t+WK <'uj GWPt뢋D$ES\$Ul$VW|$3+t8D$$H+D$;s)L$P ȍAw D$ F;r_^][ËD$3A;t*t%t tttt tt3ɊUuM ~ Ѓ v1uM h <.t"uM Y <-tuM J <#t3]3@]Vt$sV=Yt2^Ã%ts^tn&ti*td(t_)tZ-tU+tP=tK|tF{tA}t<[t7]t2:t-;t(t,t/t?t!t .t~u^ËL$AЃ vQ Yu33@Á|$st$Yu|$_t |$}33@ËD$*t+t9t:t HtRt33@ËL$A wjXjAZ;wjXÍA؃ w3@ÍA;wjXÍA wjX3DËD$jY+t,t#tt t +tj(j j jvjZjFYUh3ʼnESVuW}VuYYt5jdEPu uVLEPcQt jYDPu RHM_^3[襩]Ã,3ĉD$(D$8S\$DUl$DVW|$@3D$\$;|$Dw=\$Ts0W<uYY;sQlKYt F;rjXE^M3_褡]ËT$(|AB wD$HBwD$H 4L$IɃыÃ$SUl$03Vt$D2WUΉD$L$d$YL$DjU|$DD$(AD$,AD$0A D$$AD$4AΉD$8\$PP8UPD;l$L$8j }ًW\$Lt$DΈD$< tj EPȋt$ t u u|$Ht t t2l$H t t2 t t2|$E ǃ^GuVuRWY#t t ud$W|$@YL$9AL$L$8=P]|$@YtڋL$3D$D$W8F΍Etj$j]u3|$<3L$ D$D$W8F΋tjjUPHqsWY@_73D$jUPHL$8|$t=t33@ÃD$ S\$(U@l$VWD$jL$UP8t$,Uˉ|$0*|$(ˋUD$4|$ RD;/D$0D$$ˍEj PD$ȊD$$L$0L$(< u u D$4< uD$4|$$W轴tj EPl$|$$#uEVPRHL$,j^WYtEjPRHj ހ|$$;uEjPRH3FZW%Yu!D$$<'t<"?EjPRHjjEPRHj UPH|$$' t$( YjX njX;c|$$WbYD$$WzYu-E˃ uSt$t$ PP@PVPRH3W Yu|$$'u/EVPRHj UPH|$$'ut$(YjXED$0|$E;GVPRH_^][ÃL$D$$$SUVt$4D$WQPSRt$(΁|$t$(D$0RL$D$8D$(;P+ȉT$(L$D$,j RD$$t$(D$0΋D$t#?t[t]t^t`t |t~u3@3Á3ĉ$$S$UL$0HL$4HVL$<H WL$DHjL$LHVL$TH@hdL$\$jD$d jVhdjL$t3L$|UVhwjUVhwU$UVhwUL$hˋ$WP$l$4tuHPR(L$4 t t u3jSV$L$ WL$(u##uL$D$t$ HPRHL$(j^t$ D$T$hj^T$3;D$T$t5t$PL$ jVR,L$(T$|$4|$t(|$ u(L$D$jHPRHL$(T$D$ |$ t|$ uR\uMD$, t u?L$|$( |$, |$4ˋ PVR,L$(T$q|$ uj L$D$HPRHd$ L$(|$ uG;L$|} $$uj뻃-t +v|$$Ek|$$e`փ|$ ;L$d} D$lD$3t.39L$,)jd$PL$BL$8$PQ.tj^L$<$P4.tj L$@$P.tjȋL$D$P.tj믋L$H$P-tj떋L$L$P-tjzL$P$P-tj^L$T$P-t$ jXEt$ VmD$  uP\u-D$,;D$X} L$`D$\L$"D$ |$ u \t'ԋD$ tu|[uD$P,Yuc;u_G|$4땃]uWD$P Yu;u=OL$|$4iu+~';u#~L$PutjL$xL$(|$ %AЃ .uD$,Ѓ ;$} $$tL$D$jHPRHD$ "uL$D$jHPRHD$ 'uL$D$jHPRHD$ [ufD$PYt$ uT$L$IQ2VHD$3AHL$8L$PRHD$ *L$%u-u9L$,uyL$D$jHPRHj^hwL$t$$5L$ٟuD$PSY3@D$4D$ L$衟u|$t $uL$D$jHPRHD$ j;L$p} D$xD$ttSL$D$jHPRHD$ 8L$D$jHPRH|$(0D$ ut$,YXu L$L$D$;D$s L$(BT$3j^D$$\$l;D$d}jd$PL$}L$8$P)t D$ L$<$P)t D$ L$@$P)t D$ L$D$P)t D$ {L$H$Pg)t D$ \L$L$PH)t D$ =L$P$P))t D$ L$T$P )L$ EΉL$ L$D$t$ HPRHt$`{t$|r$fS`$T$ _^][3Ã83ĉD$4D$@d$SUl$TVW|$LljD$0EWPUS͉\$R%WD$$CUjhbD$R0͋EWD$PD$(;|$0$D$8+ljD$\$Gj P͈\$<.,+-/*t~tz$tu=tp(tQ)tL{t-}t([t ]EjPRHD$ EjPRHD$ EjPRHD$ EjPRHD$ tP tK tF tAuVsYaS] ttt CVFY4S0P3ĉD$LSUVt$lW|$tjhbP0\$dFωD$ D$D$hÉD$SPVRVρR%D$SPj SψD$D$CHD$QRSR؉\$$;}%D$ϋ %PSRLSP%D$L$t D$<_j2D$,jP贕\$$ 3j 3P}PQD$YYtD$D4(F2|ɋt$ D$(PV \$,YY~7SV PSVLE!D$(PVYYy7SVPSVLML$D$|$tN t t u?<{t&<[t"<(t<}t<]t<)u'7SVPSVLM7SV PSVLE\$;\$sL$\_^][3#vPÃ|$0~|$9|t$ Yu33@t$Yu |$_t33@t$Yu|$!t|$?t3@Vt$ VڹYv'>eu"~nu~duL$FPt^ËL$V t3@^3^UhBuuuu u]Á3ĉ$$SUV$΋(W$j$P8jV$L$2$$bh|$ uv|$$.uVD$(*t=/t8\t3^t.'ujL$8L$FjPRHd$ jL$L$FjPRHd$ p|$ uft$(YW|$(_LjdD$4PL$ pD$0PL$tD$t$ HPRHd$ 2jXD$ P`|$ upt$(!YD$(.eE+t-u|$$e|$$EL$t$ D$HPRHd$ |$ u2|$(\u$|$,"t|$,'t |$,\L$蟏Z|$('|$ u|$(\tǃ|$("jL$谘-|$ t|$ u|$tL$Ft$ PRHd$ 2ۃ|$ gt$(Yt L$D$t$ HPRHD$ <D$(!u'|$,=trL$D$t$ HPRHD$  'u(L$D$t$ HPRHD$ "u L$D$t$ HPRHD$ PpYD$(.ut$,UYuyD$(PYtL$D$t$ HPRHD$ ht$(D$,Yu@t \t2H)t ]t2L$D$t$ HPRHD$ L$D$t$ HPRHD$ L$ȍt$;t$L$Ft$ PRH$_^][3OqĈUhtuuuu u]Uh#uuuu u]ÃD$SUVt$ W|$4ωD$VP؅t~ KSRt$8D$d$PSRPVϋ7;t$\$4FL$$j PωD$$ȊD$$L$(< u u< t D$;t$8D$PCPRPD$$uF݋##;r-t.t$8L$d$Qt$t{t}t 't"t33@ËD$.t?-t:+t5/t0*t+,t&|t!`t!t?t^t &t%t33@Á3ĉ$$$SUVXhW8jQ$L$|$<$$zQ|$tI|$(@u%|$,iuL$Ft$ PRHD$ L$Ft$ PRHt$3D$ D$ u[t$(YuEt$(Y/L$D$t$ H|$ PtRHD$ RHjXD$ D$ t$uL$PFPRHD$  uTt$(zYt$(YjdD$8PL$`L$D$j ^t$ HVPRHt$ u,t$(OY,L$D$t$ HPRHj uqt$(YjdD$8PL$`|$4:ujdYt$5|$4|$0D$4P tj ^D$4P t$ jYEt$ V(u,t$(AYL$D$t$ HPRHjuOt$(wYuXjdD$8PL$o_D$4P L$D$ PD$HPRHj uw|$("ucjL$?D$ t t$(華Y|$L$D$t$ HPRHD$ |$v됃 u|$('낃 u1t$(mYxt$ L$D$HPRHjXD$ ]Tt$(\t$((Yt L$D$t$ HPRHD$ t$((YD$(@"u L$D$t$ HPRHD$ 'u L$D$t$ HPRHD$ $uL$D$t$ HPRHD$ e#uL$D$t$ HPRHD$ CPYt8L$D$t$ HPRHD$ L$D$t$ HPRHD$ L$~t$;t$L$Ft$ PRH$_^][3aČÁ|$} t$&Yu|$:t|$_u3@3S\$PYt2[À+tP-tK|tF^tA*tt(&t#~t$t,t(t)t [t]u[ÃSUl$,W|$ jEWP8EWPDj W;hWL$D$$D$D$ ;Vwj V͊j\$8jD$'u8\$@uD$D$@Ej PD$$뛋\$jSPHD$xu/"l8\$@u뷋\$jSPHD$j_F=]4΋\$WSPH|$Ӏ/u"D$@<*jUPH|$3G-uD$@:u`jUPH|$j돀'ujUPH|$ju"ujUPH|$j[[ujUPH|$jAt$4CYtjUPH\$j\@ajUPHD$@j|$:_j YDC<3ĉD$8SUVt$\Wjh0dP0΋jhbD$P0|$PD$TD$ǃd$D$,WPSΉ\$ R%WD$(VOQΈD$RD$;|$,D$<+ljD$ \$Gj PΈ\$P, |$t$XD$t/t!t~t(t )t,u[Á(3ĉ$$$8$<SUXhWx jQ$HT$@L$P$HT$@P$HT$LPT$PP@ |$@T$TD$XgD$;D$Vt$ WƃtoH|$(}>W2YyW&YEi.`-W+Nt$ VL$D$HPRH3t$ 3t$(蹃YhD$PPL$ZNL$4D$NPjt$(Yt$ 딀|$j|$(*o|$,/dL$qn|$(\uL$\n|$('6|$,'L$tD$ hƃ 0Ht%P|$(`|$,`L$+t$(躂YhD$PPL$[ML$8D$LPtj^D$LPtjD$LPtj ҍD$LPtj뾋L$~0~u&WD$UP-t$ D$WUPv;j t$J-ut`  ~D t? t:"t'~n)iD$WPYYWD$UP O_^][WD$UPjWD$UPҋƃ/th,tHttHtVxYtWD$UP"VĄYuVLYuWD$UPrt$ D$WUPzjWD$UPGyWD$UP !jWD$UPjWD$UPj [e|$S\$ Vt$ W|$t;ϋj ;r HPRH2{P֚<*tϋHj PRH6PDW2ɋL$3AU;s83Ej P虚L$ t ;s:;P葄YuG;r\$;s\$;PqYtG;r\$l$,}ujUD$0P$tjAj=t(T 0%tRuRuA;r+jˋ$HPRH7+ŋˋ$D$jEPRHD$0<=uT:;$s!\$;P蚃Yt G;$r\$$ˋ@t$jPRH<|u@t$F;$s!\$;PEYt G;$r\$jUPHqL$ <>jXDȉL$ jUPHt$FJL$T 0%RgR}A;r$Ƌ+ID$$jPRH3@;v(T 0%tR uR'uA;r؋T$0,0< v*u$| 0%t$ˋ@l$$jPRHuz3@;v ~%|$2~vQ%uL8t$2tFt$2yu6t$2u&$ˋl$$jPRHu;ENj;$s.\$3P蛁Yt F;$r\$;$j$PH$_^][32*ĄÀ%A| 0%6A;|$$u++j&3AQ+́3ĉ$S$UVW$jWP8WPD$3;s[W+WD4FScYYursJSD$D4WP? 3G;rtSEPD$P" $_^][3?)*UVujh}Vm tjh}Vm uMju PH[Wj_Wh}Vm uB~ uFPvYtj/V:YYtF< t< tWjMu PHSj[Sh}V>m u(FP#Ytj/V:YYuSWSh}Vm Wh}Vl u3~ uFP˓Ytj/V9:YYt~*MuSaW^jh}Vl t<@y<0|<9m<-t)<t DD$ t7PfzYtG;r7T$<#u L$PwYtF;r;<>#u0h}WB YYth}WWYYtjj?"u 5X/h}W YYtjX/PvYuF;r|$$t$UFPRHjVPH5X/jL$(t$$PH_^][Á3ĉ$S$ U$VWjUP8UPD$ 3ŋD$;sdW}WD4FSYYur#sSSWUD$ D4 VPFo3D$G;rtSHPUD$ VP"$_^][3h SUVW|$3\$PuYtF;r;<#t|t<ujX<l$ +7P7aYts7C.F;$,r؁sl$D$ D h~PtYYtqD$ h~P_YYt\D$ h~PJYYtGD$ h~P5YYt2D$ h~P YYtD$ hP YYtjYj^zjjjX;u ) tZt$j X0:vPj4 u2j [8\/u/u|/^tt,0:vl/u!|/^t$uj Y u $u|//tt$El$;$,Lt$j Yu jXE!tj [;t t u jX3^][$_3{̃3ĉD$ D$3SUV3ۍl$W|$$A+t!Ws/FGW s3<{rj[sFD$\4h{PwYYtD$h0fPwYYu3CL$_^][3.t$AXPt$t$X@U}Ut ttt t ujRMu PH]ÃSUVt$,W|$@jVP83D$ |$8VEl$<#rψD$@D$4VD$,R؉\$~'7KQV(PSV,SP(t$0H jSP,2D$$D$ ϋD$VPDD$(3El$9D$0L$@CL$j PωD$D$@<*unCj P7t<$t]j CP&t<&tLUjCPWj.th{VnYYtkhVnYYtZheVnYYtIhhVnYYt8hVnYYt'hVnYYth0fVtnYYu3G_^Ãh3ĉD$dD$tSU$XV0D$ WjdPU$3$D$$PUD$<.<$<#ujbD$P tUD$hhPmYYu3GD$h8cPmYYuj_D$h0fPmYYjYDj^)$j ^tD$P藱t j׃$t;t2PV$U$_^][3 hËD$S\$+Ul$W3D$t8D$ H+݉D$V;s'L$4/3PhP|lGD$Y;|$r^/_][Ul$3ʼnE`ExVu|W8julP8jVutMupulE;ES3ۋE:tAtqtTHtJt,28]jM܋EHPRHu]uYuj˃}"[SM.uYu%t"&t@t!t#t$t ?t3@jdEPM EP蹯tSEhuPkYYuE8]j%Eh8cPTkYYu EujXEP 8]jM܋EHPRH]u9]g'uM܋ESHPRHEH"uM܋ESHPRHE)&uIu_jYhu&u/uEjYbu&uu+jYouFЃ .uEЃ }VQYu0_t+u%t$uM܋EuHPRHE }#uM܋EuHPRHE_!uM܋EuHPRHEAVFYu}\u0M܋EuHPRHEM܋EuHPRHEM}"E;E[M܋EuHPRHM`_3^ ed]ÃVt$(jh,`P0KD$SUW|$$ljD$WPؽ~KQRWΉl$0d2D$L$4L$D$΍Gj PD$$g|$ȈL$}D$D$D$S t tC8FMD$΋ PSRLD$L$t$4T$ & <'<=338L$EȈL$4cfmtlsuTtEtt;hWWV ih SPLD$RhWV uh빀AtauRhlWVL$ D$t$4 UtuuhqAtau h]D$D$/ t* t2h L$8SPLD$D$C|$D$;|$ _][^Vt$W>t%|$+L$ 7j Pe<`~8u F>u_^23ĉ$$$$SU$3ۋVWh l$p$$8$<$@f$D3$@dPxWVj:3L$D@PWVjXP:SWh$S$$t:SWh@S$`:SWhXS$ L:SWhWj$7:SWh`S$#:3$@PWhhj :3@PWhpj$93$@PWhxj9SWhj$9SWVj$9SWhS$9SWhj$9È\$?hD$dD$x$(\$t$($YjD$|$YljL$dj)D$8XjY\$|D$P;tt t*uE*j[D3FEWP;tO;wuWVPVUOQR3j X;(tu~EWP~PuOWVPVtuEWP(uOUGPRU͍GPRUGPR;uOw\$8|$htNGD$@D$@PUR"EYYL$@L$hQP< u 3@D$8Et$hP<jXD؉\$8D$hjUVt$@L$ +PWD$;D$_j\_D$$( :$:L$D$t$$HPRH3D$$@D$8D$D$h\$, \$,;\$D} D$LD$Hu'u.u9\$0t |$(> D$HL$t$$PRH3D$$ \$,;\$D} D$LD$Hq jd$TPL$)$PhPbYYtr$PhPaYYtZ$PhPaYYL$t$$D$ uHPRH3D$$)D$` HPRH3D$$jXD$8D$D$hD$$\$,:u9\$0uL$T;$} $$L$P@t$+3@;u L$ t$F\$,.L$d9\$0td L$D$t$$HPRHD$$ 0D$|@D$|u!D$0Ѓ wejYL$dD$0Ѓ jX;u03@_L$du?EtetCЃ jD$0jYL$d+-qjX;ujSnYYS뼃t=jX;t6CЃ [0u7 3@;u 1jCЃ ;\$D} D$LD$H |$|j XD$$jXD$$PL$D$ HPRH3ۉ\$$|$!L$D$t$$HPRH3|$$t$`3@\$03ɉD$`D$xW\$x$(L$CL$t2Yt7D$p;t$4s%\$4WYtj FV];r\$t+t$N'tx"ts`tnu&D$0;$} $$u~,3D$$ SL$ 3\$`@D$8D$D$h\F~L$(uljD$t$$3@D$?a;Y3҉T$88T$?\$,;\$tuARL$ \$,3|$p%L$D$t$$HPRH3|$`@D$$8T$!u;u$$9D$0uL$\$,3҃ tL$pD$xC\$p놋L$,;$} $$t D$x\$p ŋL$D$t$$HPRH\$,3|$$9L$D$t$$HPRH|$!L$th$P$Pt$|YYL$D$t$$HPRH3D$$D$8D$`L$EL$@QP|$ tehL$mtSL$D$t$$HPRHj[j\$(^L$GuL$D$t$$HPRH3͉D$$ESWP,qVD$DPUU ؋SWR,u}|$$|$@;w`ut$lt$@PWUuD$$j YED$$j(^;u8L$t0APU YYL$t$$D$ nHPRHt$$;$} $$ tCL$3PD$ HPRH|$,.D$$ |$0.L$S|$0.\ttL$3PD$ HPRHL$3PD$ HPRHD$$tL$3PD$ HPRH3D$$|$,0jYD$8L$dD$|u3D$0xu jXD$d?bu3@Ѓ wjYL$d!|$,vjXDȉL$dt$4L$D$j\_;D$L$D$t$$HPRHt$x>$2$&$$$$$$$$,$<$L$$<$4胉$_^][3MĨf#y&" 0)Z  ! ((#&~)*i*    0SUVt$PWjh0dP0΋D$3CShbP0΋ShD$P0΋Sh̀D$P0l$DD$HD$Ńd$0D$<UPD$,L$ ~HQR|$ U΋Bj MD$HQFUD$XRD$42D$$D$H;l$<D$,@D$(D$DΈD$Ej PD$@?Ft$8D$H΋D$8D$PT$D$4 u|$D u t23@ȊD$TL$< t< t tD$T3@D$T|$tAt=Vt$0YYt)D$(VxWrYYu*Vt$,bYYtC|$ T$L$ u6{u+C.VW;YYtVt$,+|$(T$$YYuKǀ}uK|$D$TtEPRL$3uH;t tChUP tKhUP L$3@D$Hyut|$=uD$DP.-Yt;uXKhUP t ;hUP t 3@D$HhUP E؋L$D$T|$t+t'u"hUP T$$jXEЉT$$T$$|$|$HL$ ty 2D$Ht2$D$$ D$0u 8D$t;~ ~ ΋l$,UP;t WUPLED$(l$,3|$ l$0l$0t$L8YuEl$0D$l$8D$T;l$<΋\$,SP% NjPSRL_^][0US] VuWVPFPRp1W:?WERȊE<#utPYtG;|2_^[]ðD$AA(uj)Xj]{uj}j>t F;t$r3_^[ËFhPR u+Vt$ V"Y|0 u V"YD0Vt$ BYY@^Ãl3ĉD$hD$xS\$tU$VW$+D$jY;G3tSv W|$ 6Ptu.u_^UVu W3Gu3hSt_]VP< u$j V?;t}uG {utu˅t#uE NPSu mYYu P3[_^]Vt$ W|$ j VF?<>u3@`StXVP< uutCVPt/t* u4^hSP uhSP u u3[_^jjXUVuWP$E PV} YYt\WP< uPtWP< uu} E PV|} YYr$WP<uGhthPR t2_^]Á3ĉ$ $ S$U$$V$0W$$߉D$jW\$ P8WPDj W=؋΍Gj PD$=/u<*u+GUPRHE'uGjPRHjPD$[&YtGjPRHjpt$%YtGjPRHjQ+t=-t8*t3/t.=t)t:t$LGjPRHjGjPRHj]&u#*t%OUu t uGjPRH3\$G;CUPRH$_^][3KÁ(3ĉ$$SUV$HWjh0dP0΋jhbD$P0$<$@D$ǃd$D$0WPUR%WD$ D7WD$Rd$$D$ wD$D$(Gj PD$4:t$,D$΋$HD$D$$$HPЊD$(T$ < u|$ u D$< uD$L$$Dt u||$$us;tohD$8PVWt$4ND$HhhP`;t8D$4hePJ;YYt#D$4h0fP5;YYL$$DuK $DCL$|$ttu CtK|$tJL$D$u 8L$t;~ ~ UP;t WUPLE\$3|$|$t$(^.YuG|$|$,;|$0}UP% D$PURL$4_^][3(Á3ĉ$$S$UL$HHL$,HL$0H L$4HL$8HL$dD$?PIYu|$?-uBD$<ruu|$?wun|$@aug|$Aru`|$BduYD$CPYuj>D$su+|$?etT$>YuG_tBt$(\$ @t9/uP|$,*L$D$SHPRH L$|$ qJ\$ L$D$SHPRH|$ *"uL$D$SHPRHD$ 'uL$D$SHPRHD$ &uKunuiL$D$SHPRHD$ L$t$( t D$;D$r.t :t}uD$, tK tF tA ttjt$4YYt$0DL$CVPRHt$(Ejt$$PH>cD$0~u|$4>u%L$e!| uozfPUL$CjPRHD$(V |$0W_W|$0W4uWdjdD$lPL$ \$D|L$HD$hPeuX|L$LD$hPduA|L$PD$hPdu*L$TD$hPduL$XD$hPduD$(jXD$(PD$$H |$%tVCL$PRH3t$(\$ |$0,\$\[]{}|/u9CL$jP9|$u-9|$4tL$CjPRHE̓d$(jt$$PHm)tԃ(u"L$CjPRHj 3^At$(L$%uh9|$4uK|$$tDL$CjPRHL$D$(|$4+L$jL$L$CjPRH3FJ+t -t.uRj t$8YYtAL$CjPRH3|$0.j^D$t$(|$0+D$8D$ti|$0-tbD$+t-ue|$4.u^L$Cj j PDPYYt2L$D$ t$(HPRHj3^t$(D$8D$D$D$|$0t$(\$ j WYYt(L$CVPRHj3^t$(D$8D$D$RWu;L$CVPRHj$L$CjPRHj L$CjPRHj ^t$(L$|$?tXtTtOtJtEEP$E͋\$\jSP8EhSPHEP$EjSP8ESPDL$|$%t EQt$DP,L$\$ jY;\$+L$Ct$(PRH$_^][3`ÃSUVt$8WjhbP0΋jh@dD$P0l$,D$l$0d$,UPD$~HQRUΉ\$$kUD$@RD$D$0;M+ʼnL$D$0D$t(t )t%t33@ËD$ t t t t tt33@Á3ĉ$S$U$V$W$V|$LPȉL$8t+~'IL$8QPu3FPR$ED$PEl$H͉D$Tjh@EP0U͉D$L3!D$t2=t-&t(|t#$t(t)t}t{t [t]u^Á3ĉ$$S$UL$LHL$HHL$DH L$@HL$:ut$,LYu?D$ @u D$ $uj ^t$ jX;W*YuuD$ D$ t$0jFXt$0;D$ j^t$ u>{hL${D$j^FjPPWD$YuL$j P<[uVL$D$t$ HPRHd$ }u"{u2E/^u|$,"u#L$+"ujL$Wt$ |$(t( t# t t ttt tu*(t[t )t]uL$D$VHPRH3t$ iD$L$j PPt$0t$0@L$ D$tt$ HPRHD$ j PyL$D$j PcVPt$4t$4t L$D$t$ HPRHD$ t$,t$,QYYt L$D$t$ HPRHD$ L$(AЃ `+W-N.E,<"u L$D$t$ HPRHD$ 8{u+L$D$t$ HPRH|$4jXjYEED$ ;u L$D$t$ HPRHD$ $u L$D$t$ HPRHD$ %u L$D$t$ HPRHD$ L$D$t$ HPRHD$ !L$3t$ D$4D$HPRHD$ L$@#L$D$VHPRH$_^][3ќİÃL$D$$$SUVt$4D$WQPSRt$(΁|$ t$(D$0RL$D$8D$(;P+ȉT$(L$D$,j RD$$t$(D$0΋D$t =t?uY3@^t$GRYtJD$*u;t/u;tj=Ytƃ>u;t;u ;t?t?u;t3^2^UUM #u{t/BЃ w #u}{tBЃ wAЃ w}#u }{u3@]3]ËT$;tBABA3ĉ$$SU$V$D$$+FW$C3ۉ|$t2D$+L$PDC;r|$hhWD YYujh|rWYYujjhuWYYuj UL$D$P@tA$UFPYYu*D$PKYtUD$VP tjjj E^V$PHuD$PW!YY$_^][3蠘H́3ĉ$$3SUV$WQD$X$VP$L$xP$$P$$L$8fL$|$FCt$4Y1D$<#uCjPRHj]l$z<=L$< t uf|$bu_j t$D, t VWYYu d$lj]l$D$D$T$|$5#<:CjPRH|$:u$΋\$,j SPHT$ :3D$l$t$HPYtj>D$Ph\WYYT$!*uD$H\$@D$=N\$,D$j SPHL$$xOD$8$|$Ll$PZPhl"YYL$9CjPRHj]l$ .tt$4Y1L$=t$<YtPD$<(tPht襡YYt4$huPYYVP@PHYYP@K$PVt$\QW$ ?t!u$t$<Ytt$HY\L$ t u|$ChPWV_ijSPHj]l$D$D$T$h|W|$WV D$u < t< t2$P Y|$D$3K3Ѐ|$G.EȈL$j_;|$3\tWSPH3D$l$yD$PhT$YYCt.Mt)\$,cu~WSPH3D$l$a|$ -\$@j D$-CPt$4y D$Y<_<.uL$PAL$PCWPRHD$Ku t CjPRHj_;xD$lD$t-uL$\$,T$ Ƅ$xL$ T$$x t? t:L$p't#"t`tD$qL$xD$yD$tD$qD$xD$  |$qtV:L$puWSPHT$3~\uD$< t< t\$,ȊD$ L$D$D$tT$LxD$t@D$tDxHt$4 YL$uҀ_t͋CWPRHK3CWPRH3KT$T$l$D$|$t,CUPRH3El$D$$xuwL$< t |$D$xPSWV CjPRHD$tj PXЈT$ t tjSPH3!l$l`T$ t |$D$xP+D$xW@PV 4+D$tjHPRH룃 ult$4 Y|$<$u/|$-uD$\$,D$D$ D$j SPHD$T$Cj PRHD$K3D$l$ukPht@YYCP< t< q|$ChPWV 9CjPRH3 MDt"ttttt |$)u t$4Yut$4L$(D$<\u8D$(t\$,D$T$ :D$)ul$$USPH3:D$(u D$$bT$<#Z{Q|$LD;2CUPRH΋\$,j SPHD$$D$\D$(D$`D$)D$aD$8D$\|$3 !l$8Pl$ZGD$|$L{%\u 8L$( :L$)uWl$$t$HeYl$,D$j ΈD$kUD$Ht$HD$0YuӋl$:L$(u D$$<#3|${uO|$L}FCUPRH΋\$,j SPHD$$D$dD$(D$hD$)D$iD$8D$dCUPRH\$,|$D$6j SD$<\uD$< t.< t*|$tD$:D$)tC;|KSD$ CjPRHj CPrD$j CPaD$T$Kt$4Y-CUPRHD$K3D$Љl$GUPRH$_^][3螆ČÁ3ĉ$SUVW$jhbP0ϋjh0dD$P0$jWP$D$#P$P $ $σd$ÉD$4SPȉL$u3QP SϋiSD$RD$ wd$$CPRD$$D$;\$4D$ψD$(Cj PD$8L$ t$0D$L$0PT$D$ D$(< u u D$< uD$L$,u)|$9L$${}2 u;Sh-YYdShYYPHNB99L$ /QWD$@D$@PSD$Hh0fP uFNƋD$8h|ePYYD$8huPYYD$8hhPYYD$8h|rPYYD$8h{PYYt~D$8hePnYYtiD$8hePYYYtTD$8hePDYYt?D$8h,P/YYt*D$8hePYYtD$8hePYYuF|$tND$ͅu 8D$t;~ ~ Qt$PLT$Bd$T$D$t$(aT$YuD$D$\$0L$,L$$;\$4ou+T$L$Bƅu 8L$t ;~ ~ VRPL$_^][3ÊD$A<(u)<[u]<{u} Vj>^<<D^QVt$hVYY h{VYYhVYYheVYYheVYYheVsYYhV^YYh|eVIYYt{heV8YYtjh$V'YYtYh{VYYtHh,VYYt7heVYYt&h4VYYth8VYYt2^ð^S\$V32CNW~2|$j V< t"< tP$VP$?<tNԅu23_^[VW|$ϋP$t$ VP?uVf< t< uNs2_^à uVF3<.S\$UVWP$l$uVP?;D$ uNF8;Mt$ WFG;~_^][Vt$WVt|$Y;D$|2L$ WG8uF>u_^S\$wPYu _t3[3@[S\$wPYu_t[3@[S\$wPYu _t3[3@[Á3ĉ$SUV$W$VPPR؋ω\$R$VP?u/V< t< 2$_^][36Ãub\$3#VP$?<uE} VCN;t$}׍D$hPMYYt'D$hP8YYt\$N;TpkVt$h|eV YYtHheVYYt7heVYYt&h,VYYtheVYYt2^ð^Á3ĉ$S$U$}du }ou}uS$[YYVW$WPPRˉt$R$O;WP?u#WH< t < t< tv< trD$O;}D$;|_ wPsUtQv{vGuqh|eUYYu`VSD$PWD$$heP t u/2_^$][3+}W<)t<]t<}uѰUVuu Vuuu2^]ËMVh< t< t< t< uN۰UVuMV;< t< u F;u |E ^]ËSVW|$t$PPRϋR$Wt$V؃ ;\$|SPt tuUl$SP;uSEEC;\$|ދt$h<VElYY]t&huVZYYthDVIYYv2_^[ÃSUVW|$,ϋP \$(Sl$RPD$RϋR$WSV ;mVP< ]j FXD$,;j;fVPl$, uF;~l$D$,;}A uL$D$WHPRHd$ {L$D$t$ HPRHD$ </uN9t$,hmL$L$D$t$ tHPRHD$ HPRHD$ -u9t$,hd뫃"uL$D$WHPRHD$ 'uL$D$WHPRHD$ #u[uWL$D$WHPRHj _|$ L$t$(D$ t;u;D$r|$tUL$Ht$ PRHD$ /V蚣Yu t$(@uL$D$t$ HPRHD$ t$(38D$E\$0V YuEL$D$;D$_^L$D$t$HPRH$][3cĘUjuuuu u1]à SUVW|$@jh0dP0ϋjhbD$P0ϋjh@dD$P0\$4D$8D$Ãd$D$SPD$(~HQRSωl$<SD$DRL$D$$;JC+ˉD$L$\$@j P\$4t$ϋD$(D$$|$DPD$$ u u D$4 uD$4|$D$ t6u1/u:t -uC:u?D$j @P<{uF)<}u%D$ N u{u\$8;OF\$8 }uN\$8|$4t[|$E Ń|$u |$t ؋ρ ;l$(M؋UP;t SUPLEt$83ۉl$(\$\$t$,7YuC\$D$@l$D$_^][ t$t$t$t$Ã,D$~|u2t$Yut$u33@Á3ĉ$$SUV$hWL$0HjL$8H V$L$DH$L$LH$L$TH@L$XL$$D$\pjhЅP0΋jhP03D$ [)<tNHtt|$(\t|$('|$(\uL$|$("a|$,"L$uxxPt$(}:VY5VYE%.-+ t$ |$(*u$|$,/L$wL$jހ|$(@t |$(\t$$Yu |$$*t$,YL$D$j_HWPRHD$ y|$(*joD$ FHHHt0|$(`!|$,`u|$(*u|$,/u D$  t$(YjdD$PPL$)Vt$(GYtD$MPtD$ jXD$ L$PD$HPRH|$ |${t$(}V萤Yu_u3@3`h$3PL$UL$0$PBt D$ L$4$P t D$ L$8$j~P$t@jhuPD$, uj j$hP u|j ^wL$t#t{t}t [t]t^3@^Vt$FvHPRHF%vvu9~*u~/tLnF;Fr^Wj_7nut$q_^Ã(L$<3SUVt$83W|$@3ۉD$Vl$>D$DPD$<~L$LHPR(l$jt$PL$ t$LWVeET$4L$0RQt=L$L\$uc;u_j^L$jluL$D$ t$(HPRHD$D$( tL$D$ j HPRHD$D$(D$Qxt-|$(u(uG )u ~O|$D$PC^QšYt$,谚Yut$0.ut$4虚Yt$0V!Yun_tih@L$tHL$D$ t$(HPRHjD$,^L$XkuL$D$ t$(HPRH!t$(L$.kCt$@D$t$LP D$P D$( tjtTHt:t!L$Ft$(PRHd$(L$jJD$PD$PyD$PD$PND$PD$PD$PD$PYYt$ ;t$L$Ft$(PRH_^][(UVt$ Wj"Y~L$j'] tQ~u ~'ukD$t j _L$SIV9FYHvPRHL$F&VFYHvPRHF͉l$j"]F;FSv^S/u~>tu>;Qj\utrit$V(~YY&;u t$V Y =u VHY4iF;FsVL$iFvHPRHjF[iuWlFvHPRHWFr[_^]Vt$WFvHPRHFh~/uh~WYu-t_t.t_^Á 3ĉ$$SUV$Hh WxFL$PD$FHP|$RHFF;Fs&~WnYu_u hF;Frދ|$hD$ PGD$h<PYYt|D$h4PYYtgD$PD$Pt FL$D$Pt FD$Pt}FtF3j G@[ FSP`;t uFG;$(r׋FSP7t#F;Fs9nuWi~_^][eWo_^][SVW|$j"[w tF ~% D$tj ^>eGVHPRHG HGVHPRHG Qej'[/O}t/;t+wQZ u/\u$eeG;GrɋV9_uh?n_^[SUVt$3D$~.FnËHUPRHFF;Fsd~0uvqYxu D$dF;FW|$vt3CWhYYuaat\btWctRdtMetHfuVA=Yu7u'vYeuǃ~+t~-u$d u~.uËdF;Fo_Ug^][Vt$W~{~t ~}tjjXPgWm_^S\$ UVt$3WE~NL$;~4 t t unj"YL$cj"YL$3X;j'YL$#IFH"u#uWPRHF WPRHF #WPRHF +)cL$F;FvnU0;~ u t|t@t &t~t33@ËD$:t,t (t)t33@ËD$tt tt33@Ã|$ u|$ u |$ t33@t$jYu|$t|$t|$t3@ËL$D$;t*3B t t u;t t t tu3ҊSUVt$W;t$s0|$VPVxUQlYYtF;t$r԰ _^][UtaPt:j*Xj{Y:DɁ3ĉ$SU$3V$WESh0dl$XP0\$DE͈\$LD$?\$T\$\$4\$8\$$SP~OEWPL$P+؋$WP؋D$XFD$\FD$`F D$dFD$hFD$lFD$pFD$tF D$x~Tw|$PVϋP(3҃BD$T"D$8"ʋL$LVPVD$8R%D$D|$Ph$jPLt$4L$jWjUSD$Tt$\Pl$TD$| jYjZ|$, u |$0 ~ D$;D$DžL$Ht$$PRH33@t$$;uL$D$VHPRHjNuL$D$jHPRHjX2jY;u2|$,#tj X;u&|$0#uL$D$jHPRHj^jYt$$|$,j3Zt$$|$LtRL$D$HVP}u D$TRHjL$D$(`RH|$!j Xt$$|$,ǃ$W+t{tZ+t0WYL$D$t$$HPRH32t$$D$땋L$D$jHPRH|$D$$|$0t$(Yu #t33@ D$8jY3@w8|$!3\$P3t$ˋP|$?t.L$$3@;t#t tu|$4u+D$4D$D|$@t|$Dt L$4L$HD$D|$438D$@E;|$H OȋD$DxL$HPVRLD$$j_;uj]*|$t3A;tt tu jXD38L$8jXE38D$LED$| QVR,jX;uj uWjL$f\D$4D$D$H|$t)D$#t$0KYjXPF\D$;|$ tND$@;tEL$D$VHPRHt$,d$(M|$0YuW]Yu 2ۋt$$\$8 3@\$8ƃt|Ht"jL$D$ HPRH3t$$i"ujL$a[3@D$@[t]t $L$D$j[HSPRH|$,[SD$u:|$@iu3|$Afu,h|e tL$D$t$ HPRHj_|$ 7L$D$j^t$ HVPRHL$D$t$ HPRHj_|$ 2ۋL$(t$%u-L$FWPRHjL$D$$R|$<^u.9L$,L$FWPRHjXPL$D$$FR[]=#()<>"{tk}tf$taQVWtL$FPRHD$ 2\uL$FPRHD$ k tQ|$!FL$PtJL$FWPRHD$ 몋L$FWPRHD$ 뒃|$ tt$ L$FPRHD$ L$GL$3t$t D$yL$jXD$ PFPRH$_^][3e+Ę -́3ĉ$SUVW$jhbP0$$D$ƃd$D$(VPUR%VD$(mjdD$D$0jPZI ;t$(Ft$ L$j L$ VȊD$L$< u u D$< uD$<\u9D$,PFWPD$8PD$5t96t47t/8t*9t%_t .td}M >Fj 3P莉>_u3F E@3@^[]Vt$W3P%rY6>.-h{V;YYhTV&YYh`VYYtohlVYYt^hxVYYtMjh}V,k t9jhVk t%hV趉YYtjh|eVj u3Gh0fV莉YYtlhV}YYt[hVlYYtJhV[YYt9jhVj t%jhVj thsV"YYu_^Vt$W3PpY>.hȈVYYohЈVшYYZh؈V輈YYEhV览YY0hV蒈YYhV}YYhVhYYhVSYYhV>YYh$V)YYh,VYYhuVYYh8VYYtwh@VهYYtfhHVȇYYtUhPV跇YYtDhXV覇YYt3h`V蕇YYt"hlV脇YYthxVsYYu3G_^ËD$~t5^t0_t+&t&-t!+t"t`t/t |t%t33@Á3ĉ$$SUV$L$,HL$0H@ WD$<j$L$@P8$33 t tu3jVP$L$ $7D$;D$$|$ jYuL$D$jHPRHd$ |$ t$(}VxmYu .t_u3@2ۄu-t$(%t&t@t!t #t$u L$>|$(]u L$>jdD$DPL$DtD$@PfHYdD@D$@huP誅YY2L$0D$@Ptj^FL$4D$@Ptj L$8D$@Ptj ыL$VlYVYEu.l-c+Zt$(V聄Ya|t$(rYf7t$ L$D$HPRHd$ |$ uW|$("u6|$,"uL$o=t$,YcL$N=|$b3D$ |$ u|$A3|$ t|$ dunD$(Ѓ wE L$ Nt$( t t,tL$ #u2jL$FL$D$D$ HjPRHd$ |$ dt+3'9L$ u!|$K|$(#jL$E|$ |$('uL$D$jHPRHD$ ^|$("uL$D$jHPRHD$ 9|$(#u/L$D$jHPRHu D$ D$ d|$(&uNt$,薂Yht|$(&u8t$,耂You)L$D$t$ HPRHL$D$ ;t$(FЃ .u D$,Ѓ vrt$(}IViYu>_t9|$([t2t$(_Yu|$(\uUL$D$t$ HPRHD$ 8L$D$t$ HPRHD$ L$D$t$ HPRHD$ 38D$Et$(5YuGL$:D$;D$NL$D$t$ HPRH$_^][3IĘUjuuuu uf]Ujuuuu uH]Á3ĉ$$$SUXh@ D$,3$ jE$QP$L$T$8$2D$;D$ VWL$|$ tuL$D$WHPRHL$|$ t$(\u;D$, t u-L$9|$( Y|$, NL$l9@ uL$D$WHPRHt$(3|$ guV:Yt$ ) V:Ytt$(.t |$ jdD$h<WP )hDWP h|rWP t |$h{WP h qWP hpWP hPWP hXWP h`WP u{hlWP ujhxWP uYhWP uHhrWP t|$u0h0fWP t#D$j PwP_3YuKC|$<tUL$$ |$u |$t l$, ;UM΋P;t WUPLE\$$l$,3l$l$t$AlYuEl$|$|$8;|$(/_^][$t$t$t$t$EÁ3ĉ$$$SUXh VpWxjQ$T$t:t$,SVYYt%NSVYYu2D$,@SPYYt El$D$uE|$ tP<(u1El$uSVYYt؋D$,@SPYD$YuMl$<)uMl$h_<;u,$h0fPopYYu$hPWSYYD$P!Yu"D$P=l$D$(EYl$@ $$l$@t$jYt$HjY+$`3+FD$L;s*$`.PjP_oGD$PYr҃ a$`Ƅ<`PL$T踳b$`VPuoYY$`hePYoYY$`hP=oYY$`hP!oYY$`h0PoYY$`h{PnYYt$`hPnYYX$`hȋPnYY<$`hPnYY $`hePynYYh$`WP\nYY.$`hgP@nYY$`h0fP$nYYt$`hP nYYu L$$`hePmYYu*$h{PmYYL$IL$$~{$`UPmYYu$VPmYYt\$`UPmYYu$hgPhmYYt0$`UPTmYY $WP t+D$ |$4t$t>HPR(Ⱥ;tu;v Qt$$P,jϋt$ jVP,jh}UJ uhVP,jD$$t <+ uC;r + ujc#uhVP,jM;sGT$ +'t1"t,:u,u(t$(ϋjFPRHj VPHt$$-C;rjt$0PH_^][YY+P[YtC;rF;r#~/P[YtO;s|$|$4D$D(+<|<><#uD$(HjPRH+ht$$P,+&tk*tfL$0P覫tjJ\$ ;<+t-=s POYu+<-t <.t<, C;r;\$ jjC+<+t<-u+PZYtC;r+uL$Qt$$P,<#uL$Qt$$P,j8D$@S\$PHUVWˋ|$LPR3ˉD$8V HPV3UhˉD$R0l$WD$`PUD$PVRPD$L*L$UQNVPP|$Lu SVsYYtҋ%D$||$\tFSPHYYt3E3T$;';t$8~D$L|$P~|$4D$0;L$jQWPPD$0|$\SVYYD$uz;|$tSWYYL$Ltg~_T$D$(d$,%҉D$DED$ЋD$0T$%DT$0|$(T$0t2 l$P4d$L$Ld$(T$ttD$,뗃|$,tiʋl$PD$;}Au;1SW YYt L$jQGWPPЋD$T$0;|T$0|$4Rt$ T$,oYWD$DT$@YL$$L$ ;~MD$jPWRPT$ ȁ;͋GT$@%T$ D$ PWRLO;Ë|$4l$PL$$|$uD$Lu9L$Ds l$P|$(u |$,u33EL$PQVPLD$0T$;D$L_^][8Vt$ t$PP^<#^%P%P%P%P%P%P; uUu| Y]U](k UEVt j VYY^]UukYu}u  ukYt]UuY]UjPQuTQh LQPHQ]U$jQtjY)4 |4x4t45p4=l4f4f 4fh4fd4f%`4f-\44E4E4E43433 33jXkǀ3jXk LjX Lh]Uj]UjJtM)4 |4x4t45p4=l4f4f 4fh4fd4f%`4f-\44E4E4E4433 33jXkM3h]UEVH<AQAk(;tM ;J r BB ;r (;u3^]Ëy u2dV6P;t3u2^ð^D t 0 P`pYt2HrjY6u2vu6v6U u} uuMPu UuuhYY] t h6tYlljsvYV6U}u6 5u2]uu j6Y]U Vutu|0 t*u&h6WtYt2Wh6DtYDuW6j Y+ȃ3EEE6EEuE_^]j jhX eMZf9u]<PEuL f9u>E+PQYYt'x$|!EE3Ɂ8ËeE2 U t}u 36]U=6t} uutu4YY]U졼36uȃur h6sYY#E]UuYH]QL$+#ȋ%;r Y$-̹-H-P -Hf~%=LZuhf/v =f/!5@f/fofsfst:`f/w,fWf/t"P<$f$fXu3fWf/ %(fn-fofofffs4foffoffoffoffffbfffffffff~~#fff~fsf~ t  f~fsf~ú3à <$$tou(-$D$D$D$D$r؃ ù-H-P -Hfofsf~%=bfofsfsXf/v/t@6* `f/s'fWf/0fo؃uHf/rf\fofs#fs#f~ t f/@f/W*XtW*X Y XÍ$W*W*Y XXUE t3t tt3@0uuY}PY] jhxjYu3E]e=6tj_6%teh1f$c1xs$ThT'wYYu)t hTh8SvYY62ۈ]EDL7>tVYtu ju663@Ê]u[Yj h63OH6Ee=6tjR%6EjuYY3ɄuYj h;} u9=63et t]1]SWuuSWuuSWuuu"uSPuSVuSVu`tuHSWuout5SWu:$MQ0h7)uu u>Ëe3uEUV5u3@uu u^] U} unuu u ] uUVuX^]aaAČUVu%،^]aaA،UVF `PEP.YY^]AP/YUVFP.EYt j VYY^]U M=hEP.U MSh(EP.̋AuU%6(S3C j H me3 3VW6}S[wOW E؋MEineIE5ntel ȋEj5Genu XjYS[wOW uCE%?=t#=`t=pt=Pt=`t=pu=6=6=6}EEEEE|2jX3S[]؉sKS EܩEEt =6_^tm 6tUtN3ЉEUEM3Ƀu3u/6E t 63[]3@39=U$SVj tM)3hVP56 |xffftfpflfhEEDž@jPEVPiE E@EE@QVXۍEEۉEPQEPTQu !6^[]Ã%6%4Sh@Zd5D$l$l$+SVW1E3PeuEEEEdËMd Y__^[]QUeeVWN@;t t УfEP,QE3EE0Q1E4Q1EEPQME3M3M3;uO@u G ȉ щ _^]h6(Qh6)+Yø6`)HHHHø=SVHH;sW>t ׃;r_^[SVPP;sW>t k׃;r_^[̃=6r_D$ fnpۋT$#+o fftftff#uf~3:E3D$ST$t :tYtQu WV ؋ ~333ƃu!%t%uu^_[3ÍB[ËB:t6t:t't:tt:tt^_B[ÍB^_[ÍB^_[ÍB^_[WVt$L$|$ ;v; s%%6s D$ ^_Ë3Ʃu%%6s vs~vftefoNvfo^0foF fon0v00fof: ffof: fGfof: fo 0}v foNvIfo^0foF fon0v00fof:ffof:fGfof:fo 0}vVfoNvfo^0foF fon0v00fof:ffof:fGfof:fo 0}v|ovfs vs~vf5tIuу $5$55555D$ ^_ÐD$ ^_ÐFGD$ ^_ÍIFGFGD$ ^_Ð41<9 Q%t׃+ʊFGNOu $06@6H6X6l6D$ ^_ÐFGD$ ^_ÍIFGFGD$ ^_ÐFGFGFGD$ ^_tINOurhooNoV o^0of@onPov`o~pOW _0g@oPw`pu r# ooNO ututuD$ ^_̋ƃуtf$fofoNfoV fo^0ffOfW f_0fof@fonPfov`fo~pfg@foPfw`fpJut_t!ooNOv  Jut0tuȃtFGIu$ID$ ^_Í$++Q‹ȃt FGIut vHuY3ɺ63 3Vt JWVt$L$|$ ;v; s%%6s D$ ^_Ë3Ʃu%%6s vs~vftefoNvfo^0foF fon0v00fof: ffof: fGfof: fo 0}v foNvIfo^0foF fon0v00fof:ffof:fGfof:fo 0}vVfoNvfo^0foF fon0v00fof:ffof:fGfof:fo 0}v|ovfs vs~vf4;tIuу $4;$D;D;L;X;l;D$ ^_ÐD$ ^_ÐFGD$ ^_ÍIFGFGD$ ^_Ð41<9 Q%t׃+ʊFGNOu $;;;<<D$ ^_ÐFGD$ ^_ÍIFGFGD$ ^_ÐFGFGFGD$ ^_tINOurhooNoV o^0of@onPov`o~pOW _0g@oPw`pu r# ooNO ututuD$ ^_̋ƃуtf$fofoNfoV fo^0ffOfW f_0fof@fonPfov`fo~pfg@foPfw`fpJut_t!ooNOv  Jut0tuȃtFGIu$ID$ ^_Í$++Q‹ȃt FGIut vHuY̋L$ D$׋|$<i %6s D$%fnfp+ρ~L$$ffGfG fG0fG@fGPfG`fGpu%s>fnfp rG stb|9GD$tGutt $GuD$US]V@U uW ;+t3Ʌ M~B+t3Ʌ My~B+t3Ʌ MWNB+t3 E3Ʌ1F;BtB+t M ~B+t3Ʌ M~B+t3Ʌ MNB+t3 E3ɅF;BtB+t My~ B +t3Ʌ MW~ B +t3Ʌ M5N B +t3 E3ɅF ;B tB +t M~ B +t3Ʌ M~B+t3Ʌ MNB+t3 E3Ʌ~F;BB~+t MR~B+t3Ʌ M0~B+t3Ʌ MNB+t3 E3ɅF;BtB+t M~B+t3Ʌ M~B+t3Ʌ M}NB+t3 E3ɅWF;BtB+t M0~B+t3Ʌ M~B+t3Ʌ MNB+t3 E3ɅF;BtB+t M~B+t3Ʌ M}~B+t3Ʌ M[NB+t3 E3Ʌ5j Y+;_Ӄ$VF;BB+t3Ʌ M~B+t3Ʌ M~B+t3Ʌ MNB+t3 E3ɅyF;BB+t3Ʌ ML~B+t3Ʌ M*~B+t3Ʌ MNB+t3 E3ɅF;BB+t3Ʌ M~B+t3Ʌ M~B+t3Ʌ MqNB+t3 E3ɅKF;BB+t3Ʌ M~B+t3Ʌ M~B+t3Ʌ MNB+t3 E3ɅF;BB~+t3Ʌ M~B+t3Ʌ Md~B+t3Ʌ MBNB+t3 E3ɅF;BB+t3Ʌ M~B+t3Ʌ M~B+t3Ʌ MNB+t3 E3ɅF;BtuB+t3Ʌ Mu`~B+t3Ʌ MuB~B+t3Ʌ Mu$NB+t3 E3Ʌu3ɋ_ F;BtuB+t3Ʌ Mu~B+t3Ʌ Mu~B+t3Ʌ MuNB+t3 E3ɅqF;BB+t3Ʌ MD~B+t3Ʌ M"~B+t3Ʌ MNB+t3 E3ɅF;BB+t3Ʌ M~B+t3Ʌ M~B+t3Ʌ MiNB+t3 E3ɅCF;BB+t3Ʌ M~B+t3Ʌ M~B+t3Ʌ MNB+t3 E3ɅF;BB+t3Ʌ M~B+t3Ʌ M]~B+t3Ʌ M;NB+t3 E3ɅF;BB~+t3Ʌ M~B+t3Ʌ M~B+t3Ʌ MNB+t3 E3Ʌ}F;BB+t3Ʌ MP~B+t3Ʌ M.~B+t3Ʌ M NB+t3 E3ɅBN+3 EF;BB+t3Ʌ M~B+t3Ʌ Mt~B+t3Ʌ MRNB+t3 E3Ʌ,F;BB+t3Ʌ M~B+t3Ʌ M~B+t3Ʌ MNB+t3 E3ɅF;BB+t3Ʌ Mh~B+t3Ʌ MF~B+t3Ʌ M$NB+t3 E3ɅF;BB+t3Ʌ M~B+t3Ʌ M~B+t3Ʌ MNB+t3 E3ɅgF;BB+t3Ʌ M:~B+t3Ʌ M~B+t3Ʌ MNB+t3 E3ɅF;BB~+t3Ʌ MB~+t3Ʌ MB~+t3Ʌ M^BN+t3 E3Ʌ8F;BB+t3Ʌ M ~B+t3Ʌ M~B+t3Ʌ MNB+t3 E3ɅfFf;BEF;BB~+t3Ʌ M`~B+t3Ʌ M>~B+t3Ʌ MNB+t3 E3ɅF;BB+t3Ʌ M~B+t3Ʌ M~B+t3Ʌ MNB+t3 E3Ʌ_F;BB+t3Ʌ M2~B+t3Ʌ M~B+t3Ʌ MNB+t3 E3ɅF;BB+t3Ʌ M~B+t3Ʌ My~B+t3Ʌ MWNB+t3 E3Ʌ1F;BB~+t3Ʌ M~B+t3Ʌ M~B+t3Ʌ MNB+t3 E3ɅF;BB+t3Ʌ Ml~B+t3Ʌ MJ~B+t3Ʌ M(NB+t3 E3ɅF;BB+t3Ʌ M~B+t3Ʌ M~B+t3Ʌ MNB+t3 E3Ʌk~B+t3Ʌ MIB~+S3Ʌ M8M1+t3EqB+t3EqB+t3EIB+t3 EUu  +t3EujJF+t3EuLJF띋Uu  +t3Eu JFnEE ]3^[]ËHLQKU1H9L~PTGKOTG KOOSkFsJNREI!NWR=EEIMQDHL(Q̋L$D$WSV=6 fnpftufoftfڅuf~ڻ#؁w'offtftffكtۃtj:uЍNu9#ځw/o foftftftffڅut:bH^[_3^[_À9t#فwo"1f: fsKt tf~»#؁vt:tf:c@ ws׋#ށw)#ځwo f:cN qyLA:x뭊toqtUL$:tt :t u^[_3Ê:u~at(:uAtf:t3^[_G^[_Ë^[_!Efu2 ugj$YU}u _j0Y]UVuW} t N3 8FN 3 8_^]USVu WEE^F3PSE]}W%E @fEE}~ FGGLEteVMxf~UE8csmu7==t.h=Xt5=juK֋u EЋi9~ tlXMt]s]E$t,]~ t!hFP9uSE_^[]hFP^ ^SukMӋIUW}tHtBQAu+SVYSX0Yt7SVEE ΃ 3@VrEY^[ M A_]UVu~t6KEY&F^]U S]VWjYH}} tt Qp ΋x։]}t tE@EPuuu$Q_^[]Uu QtV0PlEYu^]áj Y+336UEt=6tP.EY]Ut'VuuPYjPBYYV^]Ã=u3SWQ5YtuYj5YYu3BVj(j-EYYtV5YYu3S5YY3VoDY^WQ_[h\Yu2h6PYYuátP YVW 73jhW~ t$7r۰2_^V5$7t kW6WQ $7u_^U졼j Y+ȋE3]UE3SVW873 ʋ3;titcu;ut6YYu/;uu3t)u PQtVmY빋ًj Y+3;3_^[]US]3W3<(7ȅt A#UhVhjSQu'QWu VVSQ3u 3ƇtVQ^_[]UVh hh jtun^]^]%QUVh4h,h4jut 4Q^]UVhDh<hDjQut  Q^]UVhXhPhXju ut Q^]UVhlhdhljtuu u} u uQ^]á\7V3j Y+ȸ87335;҃ A0@;u^U}u'V(7>t>t6Q&87u^]SVWT$D$L$URPQQhad53ĉD$d%D$0XL$,3p t;T$4t;v.4v\ H {uhCCd_^[ËL$At3D$H3ʽUhp pp> ]D$T$Ut$L$)qqq( ]UVWS33333[_^]ËjS33333USVWjRhbQX_^[]Ul$RQt$ ]USVWUjjhbu"]_^[]ËL$At2D$H3ڼUhP(RP$R]D$T$SVWD$UPjhbd53PD$dD$(Xp t:|$,t;t$,v-4v L$ H |uhDID_뷋L$d _^[3d ybuQ R 9QuSQ SQL$ KCk UQPXY]Y[̋L$t$tNu$$~Ѓ3ƒtAt2t$tt͍AL$+ÍAL$+ÍAL$+ÍAL$+SVL$ T$\$tP+t:uHt:Bv4u%=wڋ;uӃv#Ʃt3^[^[̋L$ WVSًt$|$u 't+t/uuatt7uD$[^_tuutu[^D$_Ét~Ѓ3‹t܄t,tt uĉ3҉3t 3uwD$[^_W|$n$L$Wtt=u~Ѓ3ƒtAt#ttt͍y yyyL$ ttfu~Ѓ3‹tt4t'ttljD$_fD$G_fD$_ÈD$_ËUSWMG _t A=8uCAV?wSPHL HHBV7:BP^u PG _[]UM A=w EH#E]3]ËUu Eut0;P ]ËUu M EPhuR }t MP]ËUu MEPhu }t MP]ËUMtx~Qu u: Qu u4 ]ËUu MwEPj u }t MP]ËUu M?EPjut }t MP]ËUu MEPhu9 }t MP]ËUu MEPju }t MP]ËUu MEPju }t MP]ËUu M\EPju }t MP]ËUu M$EPjuY }t MP]ËUu MEPhu }t MP]ËU=8tjuyYY]hu5 ]ËU=8tjuYY]hu5 ]ËU=8tjuYY]j u5 ]ËU=8tjuYY]ju5 ]ËU=8tjuYY]hu5N ]ËU=8tjuYY]ju5 ]ËU=8tjuYY]ju5 ]ËU=8tjuYY]ju5 ]ËU=8tjuYY]ju5 ]ËU=8tjuYY]hu5V ]ËUE3+]̋L$ W|$VStt9u~Ѓ3ƒtGt!tt uσ t$u u\"t=t)uu8˃ttu[^D$_ÈD$[^_ÉtȺ~Ѓ3‹t܄t΄t*tuĉD$[^_f3ҋD$W[^_fD$[^_ËU3ʼnE}ES]u?V>ttVWu|+M33ҫ ‰u uƅu Puu QP etKE3Ƀ tuuo;u*x);v%[ tMty ;tM t |P_^M3[Ű]ÅuË;uj^L밃uËËUQVuWv= 2SS39uv;w1V2EYtEP8EPk2Y[_^]UEHtt t} tEut_^[]SVH t39^_98^[É^8^F9^vF1PFtw$`tEN(^$^0^ ^,^<8'^(!RojFF1kFPPJF?ssst ttt#tA1 t-t"tHt uI I I  I I u%8]72ðËVju^ÍFPF1HP^ ^ËSVh^1PFF<0 t4FPSH! F@N1Fu762^[y1*Q(tR}ÃAA@y ÊA1]sMEPSeYYt$}E苀 t E䃠P}E䃠P3fEEEx~.ÍMEQP?YYtEE3j]EYi,3*3]AEfEUEEjpjRQMQu EPA$u8Et M䃡P:u}Et+M䃡PUE Ѐ}t M䃡P[]ËUMSu]sMEPS:YYt$}E苀 t E䃠P}E䃠P3fEEEx~.ÍMEQP>YYtEE3j]EY"+3*3]AEfEUEEjpjRQMQu EPk@$u8Et M䃡P:u}Et+M䃡PUE Ѐ}t M䃡P[]ËUu ju ]ËUu ju ]ËUu hul ]ËUu hu ]ËU=8tjuYYMAw ]ËU=8tjuYYMAw]ËT$L$u@:u2t&:au)t:Aut:auuҋ3Ët:uttf:u΄t:auńt?tj)@Yt"jDQtjY)jh@j& j2 ̋UEPQt3EPQt%MU tE7E 7777773]̋UE W};t&Vut+@TLPu^_]̋U3ʼnEM S]VuW}u%t!'5'M_^3[迚]ÅtۅtDžrIΉ3+x;7IƋ;w1PV4SӃ~ Ɖ;vы;t4+߉ RBDƈJu㋝+ϋ;kIt ˋWP4SӃ~VW 4SӃ~V W4SӃ~VW ؋d$;v7;s%WV4S~;w=;wWV4SӋ~ۋ+ډ;vWS4Sփً;rY;t4+ӋIRLDJu답;;s5+‰;v#WP4SӋt;r;+Ɖ;vWP4SӃt׋ʋ++;|A;s| A;I{;st @;8UEuEtEt } v ]Á} w2]ËU(M SVt!ut0|$~&#"3ۋUtM ^[]WuME 3}EE @E EPjP] uEE-uE+u} G]} } tux,0< wÃ#,a<wÃ,A<wÃt u=j ^8GE} 9t/9t 9t9ubXQJC<9t/9t 9t9u FPj4SY^qY4S׋EYF3_^[]jh觢E0Z8YeM EŢ E0w8Yjhd=73@73ۉ]u,=σ7;t3SSSϋ4Sh8 u h8 YE9uhThTyYYhThThYYF9u 7FËE0 Ëe̋U3}csm]ËU}ut uYE EEMEEEjEXEEEPEPEP}t]űU97t d0@huuLQPHQuNYudQj8Qt4MZf9u*H<ȁ9PEu f9Auytv t2ËUQeEPhjPt#Vh uQt u4S^}t uQ]ËUE7]jjj ËUjju ]á7ËUS]u3Vtt{j^0WEh73VWN?< 5<Et8uƉuM}QM}QWWPjuu u j _82EPEPEPVuxuEH<Ƌ<JE}PV=YYtE&Uϋ9:t@A98ulj <E߉<PY}VY_^[]ËUQES]VuW#}E t0E 2ɈM?"u ɰ"GM5tFGEPFYt tFGEtMu< t< utFOE< t< uGM t1M E3B3G@\t"u1uMtO9"u M3҄E Ht\Fut=}u< t3< t/t%tFP FYt GtFGstF1M _^[t!E]ËUVu?s9M 3u;s*M;vjPjj 3^]ËU]=8t3VW4BFu$V*Yu 838j|YVuY_^ËUQQS]3VW<=tB΍yAu+FuBjPYYtn}RˍqAu+΍AE=t7jPYYt1SuV uBEj0E EY؊uW)j YY3j Y_^[]3PPPPP̋UVutW P YuVs Y_^]ËUVW~MV4SUY;u_^]UE;8tPY]ËUE;8tPuY]h֔8h858I58>YYj h eE00YeM uE  uE00Yj h軚eE0j0YeM IuE Κ uE0}0YËU졼j Y+ȋE3]ËU ESVW0ȋ~3؋v33;+;wƍ<0uj _;rjWSoDjE Mu$j~WSODjE MىE4}ωE+ǃ;#t}3@9I;u}E@0Sv] GPd V AW  A3_^[]ËUSW]8uV733υU}u;rT;Et3‹UȋȉE4SUʃ@33;]]]u;EtuE뢃t V/ YPP3^_[]ËUuh8\YY]ËUjEEMXEEEPEPEP]ËUMu]Ë;Au AA3]ËUEEMjE EXEEEPEPEP]8h8$8Y-ðËV5VVV*VFGV^jYËUQh|<MV]ËV595 93595<5 95<5<5<^ËUVuuW9>t 6qY>_^]hh EYY@ ËU}t=9tI]hh EYY]ËUudY]ËUE tjt3@]ètjtjX]]ËSQQUkl$3ʼnEVs CWVPs u&ePCPCPs C sPEP~s s^YpEt)t%CV\$\$C$s We$W+$VICYYM_3^资][ËUS]VtEtjxIY#Etj_IYEjt4Sׅu ;u u3_^]ËUQuEEY]jhώp te4S3@ËeE̋UUVtM t uu j^0E ^]W+>Gtu_u j"3ӋU}t-uj5=PuV QP( Y^]ËUVuw0uFBt V0YtVj5=Pt X 3^]ËUVut j3X;E r4u uFYBt VYtVj5=Pt 3^]ËUQ6HLMMQPxEYY]ËU$3ʼnESu]M| EXzÍMEQPYYtE܈E3j]EY 3]3ɈEAEfEEjpEPQEPEjPqAu8Et EP3E#E }t MPM3[{]jh(YE0 "YeE @HEr E0$"YjhhE0!YeE HHtutQYE E0!Yjh谋E0c!YejE 0YYEƋ E0x!YjhHeE0!YeM A00YYEv E0(!YËUE3AjCHEXEPEYj@HEfHlEfrMELEEXEEEPEPEPNEEMjE EXEEEPEPEP]ËU}tuu&YY]UEXt QEYpt WVK?YYEd E0Y38@ËU jXEMEEPEPEPl]ËU(3ʼnE}Wt u蛅YjPjP薓h0jP胓0ffffffEEDž0@E EE@QjPQPTQuu}t u蔄YM3_t]ËUE8]ËUVt)\tuuuu u4Sփ^]u5u358uu uu3PPPPPjDQtjY)VjVj! VLQPHQ^ËUM3; t'@-rAwj X]ÍDjY;#]Ë]ËUVMQY0^]uÃuÃËUEMU Ht]ËUQjuQQu uP j]ËUSW} ]?uE 3fVuM蘹Exu!h8SWu?uMtf3FEPPfYYtBu~~);^|'39EPuvWj v*uu ;^r0t*v339E3PuEFVWj p*u*}t MP^%8%83_[]ËUjuu u]ËUW} u9}vEt!83S]t }Vv j^0BuM'E3Hu,EuPEPWu> t~?069u^fEf;v9t9uv uVW j*^0}t M胡P^[_]Åt9uv\tЍEuPVuEWjPVQ) t 9uutQzut9uv uVWb j"^03nUjuuu u]ËU6VW|zu֋} j X+#;s׍ 2;t 8t@;u+;+ȃ;ttu ;uE 9tA;u+w|ru֋} jX+#;s׍ 2;t 8t@;u+;uU+ȃW;tftfu;uE 9tA;u+UʋE ;t 9tA;u+_^]ËU6VWMt!E A;t3f9t;u+jуj X+#ЋE ;sЋuY3ۈ]]SoIYuh]E pÊ]jEYËV39tPH9Yrݰ^ËUu MǦEhu08 }t MP]ËUQQ3ʼnESVuW~VuJY;Yp|}$u Ex}$39E(jjVuPWЃUXH;#t5=w{܅tP.Yt U3ۅRSVujW}3PPPPPWSuu Ut8E ;3QQQPuWSuu 6H;#t/;wzt`PhYtK3t:jjjVWuSuu ut3PP9E uB}u[7VYYuv؍x2ɈM}܃et j|YMeEe?t 3=ϊM}؃Euo;t tu&EHMԃ`;u>EE;u"k  k M;ta M܉E)}ud;u.pS4SY#j[u}؀}tjYV4SY;t tuEMԉH;u MЉH3jÄtjYjV̋VW(;3jhWRtx<Pr۰ jY2_^ËUkE(;PQ]ËV5x<t kW;WQ x<u_^ËUkE(;PQ]ËUQd0V3u@9p|EPI}t3F^]ËUE ;Ev]]ËUVuWuu 3~~ ~3>uu 9~ u jujF3fWWjVj uuQPY4} ;G v Pu w wjVj utHG3_^]ËUSVuuu 3ۉ^^ ^33f9u u 9^ ujFSSSSjVSu uQPYMW} ;G v Pu7SSw wjVSuW uQPYHG3_^[]ËUQuEPu ug]ËUE (Vutj^0uS3Wˉ}؉M܉]taMfE*?QP]VCYYuEPSSQuURPQ( Euuu}؋M܋]+NjЉuB;ΉU#t/NjӋAEAu+MCEكBE;u݋U]3juR uu}E}ȉEljM;Et[+׉UЉEBEBu+UBPuEE+EPQ/ButEUM MME;EuE ]0SYE܋+‰U9U#ȉMt7CY;u}؋uWY_[^]SSSSS̋UQMQAuW}+ʋAЉM;vj X_]SV_jSYYtWu SVZAuPu+ߍ>uSPAAu7]3Et V;uY C0CW$Y^[3WWWWW9̋U3ʼnEM USW};t#u&jj*j tFF+>vj X5Sj?S6+ uj ^ NF3jBY[_^ËU]|UVuuM 3S3f9u%u 9^ ujF3^zSSSSjVSu3 uQPcYMW} ;G v P@u7SSw wjVSu uQPYMHG3_[^]ËV~tF*j"Yf F^38AtAAA AËU,3ʼnEEhQPPuQPY3UM EƅPPPPrM3>O]jhH_E0wYeM E_ E0YËVQ@HPQ5<Q@HPQ5<F uF8t0YFBH@H^ËUE-t(t tt3]ḁ́]áȥ]áĥ]á]ËUMj肕%<Eu<P,u<QuE<@}t MP]ËUS]VWh3sWV-l{3{ { +7Fu9Au_^[]ËU3ʼnESVuW~ PvQ3ۿÈ@;rƅ Q ;s Ƅ @;vuSvPWPjSSvWPWPWSA@SvWPWPhS$EtLtL ˈ@;r>3ۿˍQB w LA w F AÈA;rˋM_^3[K]ËUuuuM EIH;Au3SSVWh )Yt.uvHWu'YY;uWY_^[]À} uE@HKuExHt pHyYϋE3HHEPu!uEEMjEEXEEEPEPEP} kE\j h(J[3u}!Pt9wLt wHtcYjYuwHu] ;3t'tutVY3wHuE뭋ujYË [̀=<u<|<<<2h|<Pjj<h|<OPYYËU 3ʼnESVu WuyY3ϋljM9 A0M=rPQ;u&F~f~~3~ VFEPSQtuhFWPg ^}u}Et!HtLA;v8uߍF@uvM3Gf9=<hFWPg kE0E E8t5At+s DBA;v9u΋EGErS^FEN j _fRfIuV+3YM_^3[G]ËUVuu3mEuj^0SW}t9u rVWP` 36u jPf u j 9u sj"^0jX_^]ËUVuM裎u EML0u39UtEp#E…t3B}^t MP‹]ËUjjuj]P<P<ËUE5;w(te*t`=+v=.vR=1tK=3tDM )=t=v=v*=t#=u؋M uuuuQPQ]3UM3SVW~;t;u5;w'tN*tI+v8.v91t13t!vv;t ;t U #E$P#E PuuuuRQQ_^[]ËUUW3f9:t!Vʍqff;u+Jf9:u^B_]ËUQSVWP3tYVWWWW+SVWW$Et6PYt3PPuWSVPP t33WSY߅tVP_^[]ËUVu tj3X;Es 3BS]Wt S1Y3uVS2YYt;s+;VjP c _[^]h|hxh|jhhhjhԪh̪hԪjËUQSVW}<0Et }hjSQuPQWu5jhXSH t!jhhS4 t VVSQ3u MMƇtVQu;} U3_^[]ËUESW<3Ѓ;u3QtIVuuYYtu PQt V谁Yj Y+3=;3^_[]ËUVhhhjatuj4S%^]Vt 4S^3@^ËUVhhh jtu4SQ^]UVhhh4jtu4S^]^]%QUVhhhDjtu4S^]^]% QUVhhhXjEtu u4S^]^]%QUVhhhljtuu u4S u uQ^] UVt'u(u$u uuuuu u4S uuuuu ju PP^]$UVtu u4S ut>t6Q&<u^]XQ=Ã%=ËUSVW};} tQt4Sӄt;u u;u t.;t&~tt j4SYF;u2_^[]ËUVu 9utW~t j4SY;uu_^]á3=ȅËUE=]ËUV535=΅u3u4SY^]jhhOE0Yeu v0IYYt2F8u@ t0YtFF EO E0*Yj,hEOE0Ye598} u;tOE7PYYt7WO}}ĉEȉM̉UЋEE܉E؍EPEPEPM} EO E0YËU eEeMEEEEjEXEEEPEPEP}EuE]ËUEtH tQu E 2]ð]ËUE$<uEu Et]2]ËUMVWq $<uGtB9A+a~1WPQZYP4 ;t jX tjX!3_^]ËUVuu VY/VYu!F tVP$,YYu3^]jYËUEVDz 3Wf}ǩM UutpپS3AuCEu'ɋM y M Ntf}Uf#f}[t fEEjQQ$1 #jQQ$ _E0^]ËUQQMEE%] fME]ËU} Euu@]Á} u ujX]fMf#f;ujf;uE utj3]ËUQ}E]ËUQQ}M Ef#M#E f fMmE]ËUM t -0]t-0]t -<]t ؛ t]]ËUQ}E]á=ËU3ʼnESVWuM܁]uEX339E WWuuPSEJU;#t5=w,WtP蝼Yt Ut1RWVuXuVuujS$tuPVu \QVY}t E䃠PǍe_^[M39]ËUE@ H|ttttVjH(^yt tyt QtuNY^]ËUQSVuWtl=!teF|t^8uYt8uP/YYt8uP YYv|YYtE8u@-P˺+P踺+P誺蟺YjXE~(tt8uPg3`YYEtGt 8uPCYEEuV+Y_^[]ËUMtPt3@@]ø]ËUVut!PtuVVιYY^]ËUMtPtH]ø]ËUEtsH H|t t t t VjH(^yt t yt Qt uZY^]j hXGe0xL !Pt7u=jYe58W3YYuE t ujYË:GJ̋UVu WtCE_A^ [];ы+;|$u A4 >;u H;}sBE ]̋4LƉuЉMt + }+ljEԅt'Me uЃvu MԋD E3EU0]EȍK MčK M;EwA3Q EEEMtI‹M3UMKM Ƌu}EurEEMԋD EuSjuPRH][3‰]E]Eu܅uv*juЃPS J3u܉]]EEwWr wP$PS3ɋ MjuMI;r)w;Ev"E]}ЉEUEu vE]uM33tVE ]ăE܉M쐋EEeȋEe3;s+E܃mEu]M3;w@r9}s9t.u 3ۋUă v3RNˉJ؃u]UEHEu3UËM]mJ}EEHUEȉMM]A;sSd$R@;r t <u uE_^[]_^33[]ËUd 3ʼnEEElPR'lY<u ƅtlP'YƅtS]Vu Wj _ |sj-XNj3Q΁ u&΋Á uhdeu`RzEPYt Ad>.E|@u ]EݕΉ%u33C 33ۋ&QQ$'YYGȉj _tu33ۋ0É4\C,3DžDž3ɋ ; 0u䍂ϋ3҃+ȉ3@F,HɉЉtA33+su 9v2Ƀsrr jrZʉ+0;rg;s3F;sB3##苍㋍ É0INt,땋t΍03󫋽9v B,3,+3P,P0SP3jXA\PP`SPϋ3҃+ȉ3@D,HɉЉtA33+su 9v2Ƀsrr jrZʉ+0;rg;s3F;sB3##苍㋍ É0INt,땋t΍03󫋽9v B,3,+3P,P0SPC3@Dž\j!5DžDž3ɋ ; 0u䃥t@3+,΍;s0A;s3ҋ Љ0It,볋s F,,5+VjPtC3@5,t@3+,΍;s0A;s3ҋ Љ0It,봋s F,,4+VjPB3@5G\PP`SP3j YZ񉅐ʉ|h&vj&X V4WW1jPAPTPPPG<wru3\\\33؋``F;u`\_\`PP`\SPu3\P\\3ɋ3؋``F;u\s43\P;\r``ut ω \t\33<u;F3ҋ!stj;u@Ɖ$@A;ljut4s;uA3AȃsF;\PP`SPtr+||u]3\P:3\PP`SP2늃\jP`\33`lj`|F;u]\sQ`\<񉅠ʉG&vj&X V4WW1jP=PTPPP7u3,Ps{,n,33؋00F;u9,s0,,0P|P0,SP06,,3ɋ|3؋00F;uE;,r00ut ω ,t,33<u;F3ҋ!stj;u@Ɖ$@A;lj|ut4s;uA3AȃsF;,PP0SPT+,330lj0F;ut,ssN0,e3P,P0SP27,j3P,P0SPQ,t|j 33[0Ɖ0G;u䉵tB,ss‰0,&3P,P0SP\P,P7YY w\1j 33[`lj`A;u䋵tV\ss`\<3P\P`SP u H 0wAx wȋEH;r;,33ɋ0ʚ;lj0A;u߻t@,ss0,&3P,P0SP6\P,PYYj_+30;r7Ou vj Y;4t_^[t lPYM3]h, h$huQj u h3PPPPPФjh(ej蒾Yej^u;58tY9tJ@ t94YtE9 PQ941Y9$FE E(jRYËUVuW~  t%tvݙY!3FF_^]ËUMu 艤 8x$; ;s?k89D(@]T 茣3]ËUQQSVj8j@3ۉuYYuK;tAW~ ShGPYO8_̍GG G g_ֈ_;uɋu_SY^[]ËUVut%SW;tWQ8;uVĘY_[^]jh&} ryj ^0貢'3uj舼Yu;}9E|949u19uj ^uE묡;@;G뻋ujvYËUEȃ?k89PQ]ËUEȃ?k89PQ]ËUSVuWxg;5;s_Ƌ?k89D(tD|t=u#3+tt uPjPjPjhQ9L3> _^[]ËUMu  Cx'; ;s?k89D(tD]á Ρ ]ËUM38t ;E t@<u]ËUMS]Vuuu9u t'耡j^0蹠^[]ÅtE tu3u+ًWuBt'u ΊBt tuɋMu_uu E jPDXj"qU]BUV3PPPPPPPPU I t $u t $sF ^ËUju u ]ËU}uv讟3iVu uZ蒟9ur3EuMqZMVytJ9Uw Du+‹փ+J}t MP^]3ɄËU}u۟]uj5=P]ËUW}u u Y$Vu u W轔Yv%腟 3^_]tV#~YtVWj5=lQtҋUSV3۸W]EEU+‹Mj[4XM+1Bf;wB >Gf;wG ǃmt ftf;tƋM]+t"yAE EY];w\_^[]ËU}tu9Yx=s 8]3]j h!3uE0UYuE 8ǃ?k89D(t!WYPpQuQ uE ! uM1YËUVuu YxE;5;s=Ƌփ?k89D(t"EuEMEuPEPEPk 補^]ËU3ʼnEE ȋU?SVk8WUM9uDuEuxQ3ۉESM4WM}3IM}};uEՋE]E9EЁ-U.‹ˉE8tA|}E+M؅ED."@E+E; Ӆ~uDB;|EЋ}܅~uЍEWP(M؃ ~!U؋uE >G9\.;|}܍E|E|3]}Q@EPE?"AM;}3ttx}@QEPEPEPEHMT-tD.EEEjT-EPCEaMf9H},GE;E5jEWPʜ I}jWEP譜 ,SSjEGPu؍E}PSun E̅SMQPEPutQu+uEu9E} u4j XSfEԍEPjEPutQ}EFu;}M~&u܋Eы 93CD .M؋U;|u}uS~u܋EӋ 93CD .U;|΋UM]9\.9L-FQE8]t EPEuM3ͥ_^[ ]ËUQSVu3W} EljE;s?S Yf;u(F uj [S Yf;uFF;}rQ_^[]ËUQVuWVYtU?k89|0(}<_@Lu9|0)tEP9t0|Qt2_^]ËU `3ʼnEM U?k8S]9VWDMщ3;ss;sA< uC FFE;r䍅M+jPVPWtQtC;rM;rQM_^3[ ]ËU3ʼnEM U?k8S]9VWDMщ3u;s% u Cj _f>fE;r׋+MjPVPWtQtC;rM;rQM_^3[ ]ËU3ʼnEM U?k8SV9uWDM3;P;s! u j ZffM;rjjhU QP+PPjhu tQ3ۅt5j+QPPtQt&;rˋ+EF;FQM_^3[]jh(7uu觕 貕 ;5;ƃ?k8M9D(tiVpY}e9MD(uN 0 uu VG }E )u}V2Y 7ËU(ME EMSVuWu 譔 踔Ƌ?k8U9}\:)tuШtD:( tjjjV}3}VYt?t%ˀ]uESP u]ESVPMU9|(}EË]t*tuluESVPuESVPuESVP뢋L}؋]3jEPuSQtQu QE؍u؍}䥥MUEu\Et*j^;u^ @0PY9D(@t;t( h+E3_^[]ËU(3ʼnEMS] Vu]Wu=3Bu WE߉E#ujXOFEfud CMxt3$$YeV6YuE Ëuu"Yá=ËUQtEPEjP tfE]ËUSV@3W}#Jf;u f@u f;tދǹ`#t%= t=@t ;u 3ɋA#ы# Ћ # Ћ # ƒ Ƀ _ ^ []ËUQS]VWËU#j^t ;t uE #t"=t=t ;u 3ɋA## Ћ# Ћ# ƒ _ E^[]ËUMSV? W#3tt;t j@[@ƹ#t%=t=t ;u` @ 3ɋA#ы# Ћ# Ћ# ƒ  _^[]ËUQMSV% W#Ej_0t;t ڋ#t%=t=t ;u 3ɋA## Ћ# Ћ#  E _^[]ËU VWjY3}ueE%?P=6Y}3 ]MQYЋȃ? ы? ы  _ ^]ËUQQV3WfE}M3?G## # # # 9=6}3 ]U?ʋ## ȋ# ȋ# ȋ# ʋ  _ ^]ËU WuYjЍ}Y3uE3Ё?3‰Eeu=6Y_|]E%? EU]ËU SVW]?3F## Ћ# Ћ# Ћ# #ƍ}j 3YuM3ƒ?3ȉMe?Ë## ȋ# ȋ# ȋ# #_ 956^[|]E? EU]ËU V}3F956fE3ɋW?t)#ttt t ֨t ]EEUE?t(#ttt t Ψt ʋ_YYt4t VQYu6 hYM_3^][ËUQQE]E]ËUfMff#f;u3EQQ$赫YYttt3@]jjX]ø]ɁfuE u}tɃᐍ]EDz ɃA@]Ɂ]%DQ%QUE3SVWH<AYt} p ;r H;r B(;r3_^[]Ujhh@ZdPSVW1E3PEdeEh|tTE-PhRt:@$ЃEMd Y_^[]ËE3Ɂ8ËeE3Md Y_^[]UEMZf9t3]ËH<39PEu f9Q]VD$ u(L$D$ 3؋D$d$ȋd$Gȋ\$T$ D$ ud$ȋD$r;T$ wr;D$v N+D$T$3+D$T$ ؃ʋӋًȋ^WVS3D$ }GT$ڃD$T$D$ }GT$ڃD$T$ uL$D$3؋D$A؋L$T$D$ ud$ȋD$r;T$wr;D$vN3ҋOu؃[^_WVU33D$ }GET$ڃD$T$D$ }GT$ڃD$T$ u(L$D$3؋D$d$ȋd$G؋L$T$D$ ud$ȋD$r;T$wr;D$v N+D$T$3+D$T$My؃ʋӋًȋOu؃]^_̋D$L$ ȋL$ u D$S؋D$d$؋D$[̀@s sË3Ҁ33QL$+ȃ YQL$+ȃ Ỳ@s sË333̃=6t7U$,$Ã=6t<$XfftӍ$IU T$|$l$T$D$t"  ,<N^lpdR<. pbR:" z~n^N@."zhXH>*r`PD.p^PB2$p`3 :eHs(V 9dGu-[Ai@n N|1_?jAo'U ;iFt)W &\5׽$HBad GetCharRange %d for %d of %d GQ88L?Q8Q $P\up5UaQ88~~888888888888888888888888L,888#388838888K8D8١38)88C 03883NULSOHSTXETXEOTENQACKBELBSHTLFVTFFCRSOSIDLEDC1DC2DC3DC4NAKSYNETBCANEMSUBESCFSGSRSUSBAD %d%c%c %03X %03X%2X 99999 %d \dЍg͆Zx^$!|>֌^|0mmScintillaSciLexer zuwwˋ|}{̍A·ŕ ~_listbox\uԇVerdanaMsimg32AlphaBlend @No previous regular expressionPattern too longMissing ]Empty closureIllegal closureNull pattern inside \<\>Cyclical referenceUndetermined referenceToo many \(\) pairsNull pattern inside \(\)Unmatched \)Too many () pairsNull pattern inside ()Unmatched )Unmatched (Unmatched \($()8[‚-߁8}~rF`<,8888#38883^8888K8fq8١38)88C 038r88UndoRedoCutCopyPasteDeleteSelect AllfoldScintillaCallTip^,8F58  s3^\c3Mfq8e  S   d DMSDEVColumnSelectMSDEVLineSelectACallTipScintilla/* X/* XPM */aaaaaaprocessorscommandsslashommandsstarcommandsargumentsfunctions*step*part*instance*assembly*endstep*endpart*endinstance*endassemblyabaqus@bKeywordsadaall#aaaaaa*if*do*dowhile*endif*enddofold.compactapdlbbbc c cCPU instructionsFPU instructionsRegistersDirectivesDirective operandsExtended instructionsasm@bPc\chcAttributesDescriptorsTypesasn1ccPrimary keywords and identifiersSecondary keywords and identifiersabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_._drawpairlabelfold.commentfold.at.elseasyxdddddddd#autoit keywords#autoit functions#autoit macros#autoit Sent keys#autoit Pre-processors#autoit Special#autoit Expand#autoit UDFdownuponofftoggle#ce#comments-end#comments#include#cs#comments-start0fold.preprocessorifthendoforfuncwhilewith#regionselectswitchendfuncendifnextuntilendwithwendcaseelseelseifendselectendswitch#endregionau3endavestyling.within.preprocessorenddllusagedllusagebaan@b._+-^&\%()-+=|{}[]:;>,*/@^|&+-*/$%()[]{};,:.#)]};,'"`#!$%&*+-./:<=>?@^|~)]};,caml(j#{}[]lexer.cpp.allow.dollarsuuid/**/*!/////////!regioncppcppnocasen@nTnSection keywords and Forth wordsnnCrontab keywordsModifiersnncrontab|nnnOpcodesHeader StatementsUser keywordsinstrendincsoundnnoo$o4oTotoCSS1 PropertiesPseudo-classesCSS2 PropertiesCSS3 PropertiesPseudo-elementsBrowser-Specific CSS PropertiesBrowser-Specific Pseudo-classesBrowser-Specific Pseudo-elementsimportantcssccTmoType definitions and aliaseslexer.d.fold.at.elsed@bcheckdeferredfrominspectonceeiffeleiffelkw@bfunqueryreceiveerlangctppIntrinsic functionsExtended and user defined functionsescript.case.sensitiveforeachprogramendforendforeachendprogramendfunctionendwhileendcaseescript@ba Computer Name PhysicalDisk --> Object Name _Total --> The particular Instance (in this case, all instances, i.e. all drives) Avg. Disk Bytes/Read --> The piece of data being monitored. EXAMPLE: Collecting Data with a Query As an example, the following code implements a logger which allows the user to choose what counters they would like to log, and logs those counters for 30 seconds, at two-second intervals. query = Query() query.addcounterbybrowsing() query.collectdatafor(30,2) The data is now stored in a list of lists as: query.curresults The counters(paths) which were used to collect the data are: query.curpaths You can use the win32pdh.ParseCounterPath(path) utility function to turn the paths into more easily read values for your task, or write the data to a file, or do whatever you want with it. OTHER NOTABLE METHODS: query.collectdatawhile(period) # start a logging thread for collecting data query.collectdatawhile_stop() # signal the logging thread to stop logging query.collectdata() # run the query only once query.addperfcounter(object, counter, machine=None) # add a standard performance counter query.addinstcounter(object, counter,machine=None,objtype = 'Process',volatile=1,format = win32pdh.PDH_FMT_LONG) # add a possibly volatile counter ### Known bugs and limitations ### Due to a problem with threading under the PythonWin interpreter, there will be no data logged if the PythonWin window is not the foreground application. Workaround: scripts using threading should be run in the python.exe interpreter. The volatile-counter handlers are possibly buggy, they haven't been tested to any extent. The wrapper Query makes it safe to pass invalid paths (a -1 will be returned, or the Query will be totally ignored, depending on the missing element), so you should be able to work around the error by including all possible paths and filtering out the -1's. There is no way I know of to stop a thread which is currently sleeping, so you have to wait until the thread in collectdatawhile is activated again. This might become a problem in situations where the collection period is multiple minutes (or hours, or whatever). Should make the win32pdh.ParseCounter function available to the Query classes as a method or something similar, so that it can be accessed by programmes that have just picked up an instance from somewhere. Should explicitly mention where QueryErrors can be raised, and create a full test set to see if there are any uncaught win32api.error's still hanging around. When using the python.exe interpreter, the addcounterbybrowsing- generated browser window is often hidden behind other windows. No known workaround other than Alt-tabing to reach the browser window. ### Other References ### The win32pdhutil module (which should be in the %pythonroot%/win32/lib directory) provides quick-and-dirty utilities for one-off access to variables from the PDH. Almost everything in that module can be done with a Query object, but it provides task-oriented functions for a number of common one-off tasks. If you can access the MS Developers Network Library, you can find information about the PDH API as MS describes it. For a background article, try: http://msdn.microsoft.com/library/en-us/dnperfmo/html/msdn_pdhlib.asp The reference guide for the PDH API was last spotted at: http://msdn.microsoft.com/library/en-us/perfmon/base/using_the_pdh_interface.asp In general the Python version of the API is just a wrapper around the Query-based version of this API (as far as I can see), so you can learn what you need to from there. From what I understand, the MSDN Online resources are available for the price of signing up for them. I can't guarantee how long that's supposed to last. (Or anything for that matter). http://premium.microsoft.com/isapi/devonly/prodinfo/msdnprod/msdnlib.idc?theURL=/msdn/library/sdkdoc/perfdata_4982.htm The eventual plan is for my (Mike Fletcher's) Starship account to include a section on NT Administration, and the Query is the first project in this plan. There should be an article describing the creation of a simple logger there, but the example above is 90% of the work of that project, so don't sweat it if you don't find anything there. (currently the account hasn't been set up). http://starship.skyport.net/crew/mcfletch/ If you need to contact me immediately, (why I can't imagine), you can email me at mcfletch@golden.net, or just post your question to the Python newsgroup with a catchy subject line. news:comp.lang.python ### Other Stuff ### The Query classes are by Mike Fletcher, with the working code being corruptions of Mark Hammonds win32pdhutil module. Use at your own risk, no warranties, no guarantees, no assurances, if you use it, you accept the risk of using it, etceteras. ''' # Feb 12, 98 - MH added "rawaddcounter" so caller can get exception details. import win32pdh, win32api,time, _thread,copy class BaseQuery: ''' Provides wrapped access to the Performance Data Helper query objects, generally you should use the child class Query unless you have need of doing weird things :) This class supports two major working paradigms. In the first, you open the query, and run it as many times as you need, closing the query when you're done with it. This is suitable for static queries (ones where processes being monitored don't disappear). In the second, you allow the query to be opened each time and closed afterward. This causes the base query object to be destroyed after each call. Suitable for dynamic queries (ones which watch processes which might be closed while watching.) ''' def __init__(self,paths=None): ''' The PDH Query object is initialised with a single, optional list argument, that must be properly formatted PDH Counter paths. Generally this list will only be provided by the class when it is being unpickled (removed from storage). Normal use is to call the class with no arguments and use the various addcounter functions (particularly, for end user's, the use of addcounterbybrowsing is the most common approach) You might want to provide the list directly if you want to hard-code the elements with which your query deals (and thereby avoid the overhead of unpickling the class). ''' self.counters = [] if paths: self.paths = paths else: self.paths = [] self._base = None self.active = 0 self.curpaths = [] def addcounterbybrowsing(self, flags = win32pdh.PERF_DETAIL_WIZARD, windowtitle="Python Browser"): ''' Adds possibly multiple paths to the paths attribute of the query, does this by calling the standard counter browsing dialogue. Within this dialogue, find the counter you want to log, and click: Add, repeat for every path you want to log, then click on close. The paths are appended to the non-volatile paths list for this class, subclasses may create a function which parses the paths and decides (via heuristics) whether to add the path to the volatile or non-volatile path list. e.g.: query.addcounter() ''' win32pdh.BrowseCounters(None,0, self.paths.append, flags, windowtitle) def rawaddcounter(self,object, counter, instance = None, inum=-1, machine=None): ''' Adds a single counter path, without catching any exceptions. See addcounter for details. ''' path = win32pdh.MakeCounterPath( (machine,object,instance, None, inum,counter) ) self.paths.append(path) def addcounter(self,object, counter, instance = None, inum=-1, machine=None): ''' Adds a single counter path to the paths attribute. Normally this will be called by a child class' speciality functions, rather than being called directly by the user. (Though it isn't hard to call manually, since almost everything is given a default) This method is only functional when the query is closed (or hasn't yet been opened). This is to prevent conflict in multi-threaded query applications). e.g.: query.addcounter('Memory','Available Bytes') ''' if not self.active: try: self.rawaddcounter(object, counter, instance, inum, machine) return 0 except win32api.error: return -1 else: return -1 def open(self): ''' Build the base query object for this wrapper, then add all of the counters required for the query. Raise a QueryError if we can't complete the functions. If we are already open, then do nothing. ''' if not self.active: # to prevent having multiple open queries # curpaths are made accessible here because of the possibility of volatile paths # which may be dynamically altered by subclasses. self.curpaths = copy.copy(self.paths) try: base = win32pdh.OpenQuery() for path in self.paths: try: self.counters.append(win32pdh.AddCounter(base, path)) except win32api.error: # we passed a bad path self.counters.append(0) pass self._base = base self.active = 1 return 0 # open succeeded except: # if we encounter any errors, kill the Query try: self.killbase(base) except NameError: # failed in creating query pass self.active = 0 self.curpaths = [] raise QueryError(self) return 1 # already open def killbase(self,base=None): ''' ### This is not a public method Mission critical function to kill the win32pdh objects held by this object. User's should generally use the close method instead of this method, in case a sub-class has overridden close to provide some special functionality. ''' # Kill Pythonic references to the objects in this object's namespace self._base = None counters = self.counters self.counters = [] # we don't kill the curpaths for convenience, this allows the # user to close a query and still access the last paths self.active = 0 # Now call the delete functions on all of the objects try: map(win32pdh.RemoveCounter,counters) except: pass try: win32pdh.CloseQuery(base) except: pass del(counters) del(base) def close(self): ''' Makes certain that the underlying query object has been closed, and that all counters have been removed from it. This is important for reference counting. You should only need to call close if you have previously called open. The collectdata methods all can handle opening and closing the query. Calling close multiple times is acceptable. ''' try: self.killbase(self._base) except AttributeError: self.killbase() __del__ = close def collectdata(self,format = win32pdh.PDH_FMT_LONG): ''' Returns the formatted current values for the Query ''' if self._base: # we are currently open, don't change this return self.collectdataslave(format) else: # need to open and then close the _base, should be used by one-offs and elements tracking application instances self.open() # will raise QueryError if couldn't open the query temp = self.collectdataslave(format) self.close() # will always close return temp def collectdataslave(self,format = win32pdh.PDH_FMT_LONG): ''' ### Not a public method Called only when the Query is known to be open, runs over the whole set of counters, appending results to the temp, returns the values as a list. ''' try: win32pdh.CollectQueryData(self._base) temp = [] for counter in self.counters: ok = 0 try: if counter: temp.append(win32pdh.GetFormattedCounterValue(counter, format)[1]) ok = 1 except win32api.error: pass if not ok: temp.append(-1) # a better way to signal failure??? return temp except win32api.error: # will happen if, for instance, no counters are part of the query and we attempt to collect data for it. return [-1] * len(self.counters) # pickle functions def __getinitargs__(self): ''' ### Not a public method ''' return (self.paths,) class Query(BaseQuery): ''' Performance Data Helper(PDH) Query object: Provides a wrapper around the native PDH query object which allows for query reuse, query storage, and general maintenance functions (adding counter paths in various ways being the most obvious ones). ''' def __init__(self,*args,**namedargs): ''' The PDH Query object is initialised with a single, optional list argument, that must be properly formatted PDH Counter paths. Generally this list will only be provided by the class when it is being unpickled (removed from storage). Normal use is to call the class with no arguments and use the various addcounter functions (particularly, for end user's, the use of addcounterbybrowsing is the most common approach) You might want to provide the list directly if you want to hard-code the elements with which your query deals (and thereby avoid the overhead of unpickling the class). ''' self.volatilecounters = [] BaseQuery.__init__(*(self,)+args, **namedargs) def addperfcounter(self, object, counter, machine=None): ''' A "Performance Counter" is a stable, known, common counter, such as Memory, or Processor. The use of addperfcounter by end-users is deprecated, since the use of addcounterbybrowsing is considerably more flexible and general. It is provided here to allow the easy development of scripts which need to access variables so common we know them by name (such as Memory|Available Bytes), and to provide symmetry with the add inst counter method. usage: query.addperfcounter('Memory', 'Available Bytes') It is just as easy to access addcounter directly, the following has an identicle effect. query.addcounter('Memory', 'Available Bytes') ''' BaseQuery.addcounter(self, object=object, counter=counter, machine=machine) def addinstcounter(self, object, counter,machine=None,objtype = 'Process',volatile=1,format = win32pdh.PDH_FMT_LONG): ''' The purpose of using an instcounter is to track particular instances of a counter object (e.g. a single processor, a single running copy of a process). For instance, to track all python.exe instances, you would need merely to ask: query.addinstcounter('python','Virtual Bytes') You can find the names of the objects and their available counters by doing an addcounterbybrowsing() call on a query object (or by looking in performance monitor's add dialog.) Beyond merely rearranging the call arguments to make more sense, if the volatile flag is true, the instcounters also recalculate the paths of the available instances on every call to open the query. ''' if volatile: self.volatilecounters.append((object,counter,machine,objtype,format)) else: self.paths[len(self.paths):] = self.getinstpaths(object,counter,machine,objtype,format) def getinstpaths(self,object,counter,machine=None,objtype='Process',format = win32pdh.PDH_FMT_LONG): ''' ### Not an end-user function Calculate the paths for an instance object. Should alter to allow processing for lists of object-counter pairs. ''' items, instances = win32pdh.EnumObjectItems(None,None,objtype, -1) # find out how many instances of this element we have... instances.sort() try: cur = instances.index(object) except ValueError: return [] # no instances of this object temp = [object] try: while instances[cur+1] == object: temp.append(object) cur = cur+1 except IndexError: # if we went over the end pass paths = [] for ind in range(len(temp)): # can this raise an error? paths.append(win32pdh.MakeCounterPath( (machine,'Process',object,None,ind,counter) ) ) return paths # should also return the number of elements for naming purposes def open(self,*args,**namedargs): ''' Explicitly open a query: When you are needing to make multiple calls to the same query, it is most efficient to open the query, run all of the calls, then close the query, instead of having the collectdata method automatically open and close the query each time it runs. There are currently no arguments to open. ''' # do all the normal opening stuff, self._base is now the query object BaseQuery.open(*(self,)+args, **namedargs) # should rewrite getinstpaths to take a single tuple paths = [] for tup in self.volatilecounters: paths[len(paths):] = self.getinstpaths(*tup) for path in paths: try: self.counters.append(win32pdh.AddCounter(self._base, path)) self.curpaths.append(path) # if we fail on the line above, this path won't be in the table or the counters except win32api.error: pass # again, what to do with a malformed path??? def collectdatafor(self, totalperiod, period=1): ''' Non-threaded collection of performance data: This method allows you to specify the total period for which you would like to run the Query, and the time interval between individual runs. The collected data is stored in query.curresults at the _end_ of the run. The pathnames for the query are stored in query.curpaths. e.g.: query.collectdatafor(30,2) Will collect data for 30seconds at 2 second intervals ''' tempresults = [] try: self.open() for ind in range(totalperiod/period): tempresults.append(self.collectdata()) time.sleep(period) self.curresults = tempresults finally: self.close() def collectdatawhile(self, period=1): ''' Threaded collection of performance data: This method sets up a simple semaphor system for signalling when you would like to start and stop a threaded data collection method. The collection runs every period seconds until the semaphor attribute is set to a non-true value (which normally should be done by calling query.collectdatawhile_stop() .) e.g.: query.collectdatawhile(2) # starts the query running, returns control to the caller immediately # is collecting data every two seconds. # do whatever you want to do while the thread runs, then call: query.collectdatawhile_stop() # when you want to deal with the data. It is generally a good idea # to sleep for period seconds yourself, since the query will not copy # the required data until the next iteration: time.sleep(2) # now you can access the data from the attributes of the query query.curresults query.curpaths ''' self.collectdatawhile_active = 1 _thread.start_new_thread(self.collectdatawhile_slave,(period,)) def collectdatawhile_stop(self): ''' Signals the collectdatawhile slave thread to stop collecting data on the next logging iteration. ''' self.collectdatawhile_active = 0 def collectdatawhile_slave(self, period): ''' ### Not a public function Does the threaded work of collecting the data and storing it in an attribute of the class. ''' tempresults = [] try: self.open() # also sets active, so can't be changed. while self.collectdatawhile_active: tempresults.append(self.collectdata()) time.sleep(period) self.curresults = tempresults finally: self.close() # pickle functions def __getinitargs__(self): return (self.paths,) def __getstate__(self): return self.volatilecounters def __setstate__(self, volatilecounters): self.volatilecounters = volatilecounters class QueryError: def __init__(self, query): self.query = query def __repr__(self): return ''%repr(self.query) __str__ = __repr__ PK ѳP eewin32/lib/win32verstamp.pyUT l_Zx`ux """ Stamp a Win32 binary with version information. """ from win32api import BeginUpdateResource, UpdateResource, EndUpdateResource import os import struct import glob import sys import optparse VS_FFI_SIGNATURE = -17890115 # 0xFEEF04BD VS_FFI_STRUCVERSION = 0x00010000 VS_FFI_FILEFLAGSMASK = 0x0000003f VOS_NT_WINDOWS32 = 0x00040004 null_byte = "\0".encode("ascii") # str in py2k, bytes in py3k # # Set VS_FF_PRERELEASE and DEBUG if Debug # def file_flags(debug): if debug: return 3 # VS_FF_DEBUG | VS_FF_PRERELEASE return 0 def file_type(is_dll): if is_dll: return 2 # VFT_DLL return 1 # VFT_APP def VS_FIXEDFILEINFO(maj, min, sub, build, debug=0, is_dll=1): return struct.pack('lllllllllllll', VS_FFI_SIGNATURE, # dwSignature VS_FFI_STRUCVERSION, # dwStrucVersion (maj << 16) | min, # dwFileVersionMS (sub << 16) | build,# dwFileVersionLS (maj << 16) | min, # dwProductVersionMS (sub << 16) | build, # dwProductVersionLS VS_FFI_FILEFLAGSMASK, # dwFileFlagsMask file_flags(debug), # dwFileFlags VOS_NT_WINDOWS32, # dwFileOS file_type(is_dll), # dwFileType 0x00000000, # dwFileSubtype 0x00000000, # dwFileDateMS 0x00000000, # dwFileDateLS ) def nullterm(s): # get raw bytes for a NULL terminated unicode string. if sys.version_info[:2] < (3, 7): return (str(s) + '\0').encode('unicode-internal') else: return (str(s) + '\0').encode('utf-16le') def pad32(s, extra=2): # extra is normally 2 to deal with wLength l = 4 - ((len(s) + extra) & 3) if l < 4: return s + (null_byte * l) return s def addlen(s): return struct.pack('h', len(s) + 2) + s def String(key, value): key = nullterm(key) value = nullterm(value) result = struct.pack('hh', len(value)//2, 1) # wValueLength, wType result = result + key result = pad32(result) + value return addlen(result) def StringTable(key, data): key = nullterm(key) result = struct.pack('hh', 0, 1) # wValueLength, wType result = result + key for k, v in data.items(): result = result + String(k, v) result = pad32(result) return addlen(result) def StringFileInfo(data): result = struct.pack('hh', 0, 1) # wValueLength, wType result = result + nullterm('StringFileInfo') # result = pad32(result) + StringTable('040904b0', data) result = pad32(result) + StringTable('040904E4', data) return addlen(result) def Var(key, value): result = struct.pack('hh', len(value), 0) # wValueLength, wType result = result + nullterm(key) result = pad32(result) + value return addlen(result) def VarFileInfo(data): result = struct.pack('hh', 0, 1) # wValueLength, wType result = result + nullterm('VarFileInfo') result = pad32(result) for k, v in data.items(): result = result + Var(k, v) return addlen(result) def VS_VERSION_INFO(maj, min, sub, build, sdata, vdata, debug=0, is_dll=1): ffi = VS_FIXEDFILEINFO(maj, min, sub, build, debug, is_dll) result = struct.pack('hh', len(ffi), 0) # wValueLength, wType result = result + nullterm('VS_VERSION_INFO') result = pad32(result) + ffi result = pad32(result) + StringFileInfo(sdata) + VarFileInfo(vdata) return addlen(result) def stamp(pathname, options): # For some reason, the API functions report success if the file is open # but doesnt work! Try and open the file for writing, just to see if it is # likely the stamp will work! try: f = open(pathname, "a+b") f.close() except IOError as why: print("WARNING: File %s could not be opened - %s" % (pathname, why)) ver = options.version try: bits = [int(i) for i in ver.split(".")] vmaj, vmin, vsub, vbuild = bits except (IndexError, TypeError, ValueError): raise ValueError("--version must be a.b.c.d (all integers) - got %r" % ver) ifn = options.internal_name if not ifn: ifn = os.path.basename(pathname) ofn = options.original_filename if ofn is None: ofn = os.path.basename(pathname) sdata = { 'Comments' : options.comments, 'CompanyName' : options.company, 'FileDescription' : options.description, 'FileVersion' : ver, 'InternalName' : ifn, 'LegalCopyright' : options.copyright, 'LegalTrademarks' : options.trademarks, 'OriginalFilename' : ofn, 'ProductName' : options.product, 'ProductVersion' : ver, } vdata = { 'Translation' : struct.pack('hh', 0x409,1252), } is_dll = options.dll if is_dll is None: is_dll = os.path.splitext(pathname)[1].lower() in '.dll .pyd'.split() is_debug = options.debug if is_debug is None: is_debug = os.path.splitext(pathname)[0].lower().endswith("_d") # convert None to blank strings for k, v in list(sdata.items()): if v is None: sdata[k] = "" vs = VS_VERSION_INFO(vmaj, vmin, vsub, vbuild, sdata, vdata, is_debug, is_dll) h = BeginUpdateResource(pathname, 0) UpdateResource(h, 16, 1, vs) EndUpdateResource(h, 0) if options.verbose: print("Stamped:", pathname) if __name__ == '__main__': parser = optparse.OptionParser("%prog [options] filespec ...", description=__doc__) parser.add_option("-q", "--quiet", action="store_false", dest="verbose", default=True, help="don't print status messages to stdout") parser.add_option("", "--version", default="0.0.0.0", help="The version number as m.n.s.b") parser.add_option("", "--dll", help="""Stamp the file as a DLL. Default is to look at the file extension for .dll or .pyd.""") parser.add_option("", "--debug", help="""Stamp the file as a debug binary.""") parser.add_option("", "--product", help="""The product name to embed.""") parser.add_option("", "--company", help="""The company name to embed.""") parser.add_option("", "--trademarks", help="The trademark string to embed.") parser.add_option("", "--comments", help="The comments string to embed.") parser.add_option("", "--copyright", help="""The copyright message string to embed.""") parser.add_option("", "--description", metavar="DESC", help="The description to embed.") parser.add_option("", "--internal-name", metavar="NAME", help="""The internal filename to embed. If not specified the base filename is used.""") parser.add_option("", "--original-filename", help="""The original filename to embed. If not specified the base filename is used.""") options, args = parser.parse_args() if not args: parser.error("You must supply a file to stamp. Use --help for details.") for g in args: for f in glob.glob(g): stamp(f, options) PK ѳPًwin32/lib/netbios.pyUT l_Zx`ux import sys import win32wnet import struct # Constants generated by h2py from nb30.h NCBNAMSZ = 16 MAX_LANA = 254 NAME_FLAGS_MASK = 0x87 GROUP_NAME = 0x80 UNIQUE_NAME = 0x00 REGISTERING = 0x00 REGISTERED = 0x04 DEREGISTERED = 0x05 DUPLICATE = 0x06 DUPLICATE_DEREG = 0x07 LISTEN_OUTSTANDING = 0x01 CALL_PENDING = 0x02 SESSION_ESTABLISHED = 0x03 HANGUP_PENDING = 0x04 HANGUP_COMPLETE = 0x05 SESSION_ABORTED = 0x06 ALL_TRANSPORTS = "M\0\0\0" MS_NBF = "MNBF" NCBCALL = 0x10 NCBLISTEN = 0x11 NCBHANGUP = 0x12 NCBSEND = 0x14 NCBRECV = 0x15 NCBRECVANY = 0x16 NCBCHAINSEND = 0x17 NCBDGSEND = 0x20 NCBDGRECV = 0x21 NCBDGSENDBC = 0x22 NCBDGRECVBC = 0x23 NCBADDNAME = 0x30 NCBDELNAME = 0x31 NCBRESET = 0x32 NCBASTAT = 0x33 NCBSSTAT = 0x34 NCBCANCEL = 0x35 NCBADDGRNAME = 0x36 NCBENUM = 0x37 NCBUNLINK = 0x70 NCBSENDNA = 0x71 NCBCHAINSENDNA = 0x72 NCBLANSTALERT = 0x73 NCBACTION = 0x77 NCBFINDNAME = 0x78 NCBTRACE = 0x79 ASYNCH = 0x80 NRC_GOODRET = 0x00 NRC_BUFLEN = 0x01 NRC_ILLCMD = 0x03 NRC_CMDTMO = 0x05 NRC_INCOMP = 0x06 NRC_BADDR = 0x07 NRC_SNUMOUT = 0x08 NRC_NORES = 0x09 NRC_SCLOSED = 0x0a NRC_CMDCAN = 0x0b NRC_DUPNAME = 0x0d NRC_NAMTFUL = 0x0e NRC_ACTSES = 0x0f NRC_LOCTFUL = 0x11 NRC_REMTFUL = 0x12 NRC_ILLNN = 0x13 NRC_NOCALL = 0x14 NRC_NOWILD = 0x15 NRC_INUSE = 0x16 NRC_NAMERR = 0x17 NRC_SABORT = 0x18 NRC_NAMCONF = 0x19 NRC_IFBUSY = 0x21 NRC_TOOMANY = 0x22 NRC_BRIDGE = 0x23 NRC_CANOCCR = 0x24 NRC_CANCEL = 0x26 NRC_DUPENV = 0x30 NRC_ENVNOTDEF = 0x34 NRC_OSRESNOTAV = 0x35 NRC_MAXAPPS = 0x36 NRC_NOSAPS = 0x37 NRC_NORESOURCES = 0x38 NRC_INVADDRESS = 0x39 NRC_INVDDID = 0x3B NRC_LOCKFAIL = 0x3C NRC_OPENERR = 0x3f NRC_SYSTEM = 0x40 NRC_PENDING = 0xff UCHAR = "B" WORD = "H" DWORD = "I" USHORT = "H" ULONG = "I" ADAPTER_STATUS_ITEMS = [ ("6s", "adapter_address"), (UCHAR, "rev_major"), (UCHAR, "reserved0"), (UCHAR, "adapter_type"), (UCHAR, "rev_minor"), (WORD, "duration"), (WORD, "frmr_recv"), (WORD, "frmr_xmit"), (WORD, "iframe_recv_err"), (WORD, "xmit_aborts"), (DWORD, "xmit_success"), (DWORD, "recv_success"), (WORD, "iframe_xmit_err"), (WORD, "recv_buff_unavail"), (WORD, "t1_timeouts"), (WORD, "ti_timeouts"), (DWORD, "reserved1"), (WORD, "free_ncbs"), (WORD, "max_cfg_ncbs"), (WORD, "max_ncbs"), (WORD, "xmit_buf_unavail"), (WORD, "max_dgram_size"), (WORD, "pending_sess"), (WORD, "max_cfg_sess"), (WORD, "max_sess"), (WORD, "max_sess_pkt_size"), (WORD, "name_count"), ] NAME_BUFFER_ITEMS = [ (str(NCBNAMSZ) + "s", "name"), (UCHAR, "name_num"), (UCHAR, "name_flags"), ] SESSION_HEADER_ITEMS = [ (UCHAR, "sess_name"), (UCHAR, "num_sess"), (UCHAR, "rcv_dg_outstanding"), (UCHAR, "rcv_any_outstanding"), ] SESSION_BUFFER_ITEMS = [ (UCHAR, "lsn"), (UCHAR, "state"), (str(NCBNAMSZ)+"s", "local_name"), (str(NCBNAMSZ)+"s", "remote_name"), (UCHAR, "rcvs_outstanding"), (UCHAR, "sends_outstanding"), ] LANA_ENUM_ITEMS = [ ("B", "length"), # Number of valid entries in lana[] (str(MAX_LANA+1) + "s", "lana"), ] FIND_NAME_HEADER_ITEMS = [ (WORD, "node_count"), (UCHAR, "reserved"), (UCHAR, "unique_group"), ] FIND_NAME_BUFFER_ITEMS = [ (UCHAR, "length"), (UCHAR, "access_control"), (UCHAR, "frame_control"), ("6s", "destination_addr"), ("6s", "source_addr"), ("18s", "routing_info"), ] ACTION_HEADER_ITEMS = [ (ULONG, "transport_id"), (USHORT, "action_code"), (USHORT, "reserved"), ] del UCHAR, WORD, DWORD, USHORT, ULONG NCB = win32wnet.NCB def Netbios(ncb): ob = ncb.Buffer is_ours = hasattr(ob, "_pack") if is_ours: ob._pack() try: return win32wnet.Netbios(ncb) finally: if is_ours: ob._unpack() class NCBStruct: def __init__(self, items): self._format = "".join([item[0] for item in items]) self._items = items self._buffer_ = win32wnet.NCBBuffer(struct.calcsize(self._format)) for format, name in self._items: if len(format)==1: if format == 'c': val = '\0' else: val = 0 else: l = int(format[:-1]) val = '\0' * l self.__dict__[name] = val def _pack(self): vals = [] for format, name in self._items: try: vals.append(self.__dict__[name]) except KeyError: vals.append(None) self._buffer_[:] = struct.pack(*(self._format,) + tuple(vals)) def _unpack(self): items = struct.unpack(self._format, self._buffer_) assert len(items)==len(self._items), "unexpected number of items to unpack!" for (format, name), val in zip(self._items, items): self.__dict__[name] = val def __setattr__(self, attr, val): if attr not in self.__dict__ and attr[0]!='_': for format, attr_name in self._items: if attr==attr_name: break else: raise AttributeError(attr) self.__dict__[attr] = val def ADAPTER_STATUS(): return NCBStruct(ADAPTER_STATUS_ITEMS) def NAME_BUFFER(): return NCBStruct(NAME_BUFFER_ITEMS) def SESSION_HEADER(): return NCBStruct(SESSION_HEADER_ITEMS) def SESSION_BUFFER(): return NCBStruct(SESSION_BUFFER_ITEMS) def LANA_ENUM(): return NCBStruct(LANA_ENUM_ITEMS) def FIND_NAME_HEADER(): return NCBStruct(FIND_NAME_HEADER_ITEMS) def FIND_NAME_BUFFER(): return NCBStruct(FIND_NAME_BUFFER_ITEMS) def ACTION_HEADER(): return NCBStruct(ACTION_HEADER_ITEMS) def byte_to_int(b): """Given an element in a binary buffer, return its integer value""" if sys.version_info >= (3,0): # a byte is already an int in py3k return b return ord(b) # its a char from a string in py2k. if __name__=='__main__': # code ported from "HOWTO: Get the MAC Address for an Ethernet Adapter" # MS KB ID: Q118623 ncb = NCB() ncb.Command = NCBENUM la_enum = LANA_ENUM() ncb.Buffer = la_enum rc = Netbios(ncb) if rc != 0: raise RuntimeError("Unexpected result %d" % (rc,)) for i in range(la_enum.length): ncb.Reset() ncb.Command = NCBRESET ncb.Lana_num = byte_to_int(la_enum.lana[i]) rc = Netbios(ncb) if rc != 0: raise RuntimeError("Unexpected result %d" % (rc,)) ncb.Reset() ncb.Command = NCBASTAT ncb.Lana_num = byte_to_int(la_enum.lana[i]) ncb.Callname = "* ".encode("ascii") # ensure bytes on py2x and 3k adapter = ADAPTER_STATUS() ncb.Buffer = adapter Netbios(ncb) print("Adapter address:", end=' ') for ch in adapter.adapter_address: print("%02x" % (byte_to_int(ch),), end=' ') print() PK Y03KTwin32/lib/commctrl.pyUT  YZx`ux # Generated by h2py from COMMCTRL.H WM_USER = 1024 ICC_LISTVIEW_CLASSES = 1 # listview, header ICC_TREEVIEW_CLASSES = 2 # treeview, tooltips ICC_BAR_CLASSES = 4 # toolbar, statusbar, trackbar, tooltips ICC_TAB_CLASSES = 8 # tab, tooltips ICC_UPDOWN_CLASS = 16 # updown ICC_PROGRESS_CLASS = 32 # progress ICC_HOTKEY_CLASS = 64 # hotkey ICC_ANIMATE_CLASS = 128 # animate ICC_WIN95_CLASSES = 255 ICC_DATE_CLASSES = 256 # month picker, date picker, time picker, updown ICC_USEREX_CLASSES = 512 # comboex ICC_COOL_CLASSES = 1024 # rebar (coolbar) control ICC_INTERNET_CLASSES = 2048 ICC_PAGESCROLLER_CLASS = 4096 # page scroller ICC_NATIVEFNTCTL_CLASS = 8192 # native font control ODT_HEADER = 100 ODT_TAB = 101 ODT_LISTVIEW = 102 PY_0U = 0 NM_FIRST = (PY_0U) # generic to all controls NM_LAST = (PY_0U- 99) LVN_FIRST = (PY_0U-100) # listview LVN_LAST = (PY_0U-199) HDN_FIRST = (PY_0U-300) # header HDN_LAST = (PY_0U-399) TVN_FIRST = (PY_0U-400) # treeview TVN_LAST = (PY_0U-499) TTN_FIRST = (PY_0U-520) # tooltips TTN_LAST = (PY_0U-549) TCN_FIRST = (PY_0U-550) # tab control TCN_LAST = (PY_0U-580) CDN_FIRST = (PY_0U-601) # common dialog (new) CDN_LAST = (PY_0U-699) TBN_FIRST = (PY_0U-700) # toolbar TBN_LAST = (PY_0U-720) UDN_FIRST = (PY_0U-721) # updown UDN_LAST = (PY_0U-740) MCN_FIRST = (PY_0U-750) # monthcal MCN_LAST = (PY_0U-759) DTN_FIRST = (PY_0U-760) # datetimepick DTN_LAST = (PY_0U-799) CBEN_FIRST = (PY_0U-800) # combo box ex CBEN_LAST = (PY_0U-830) RBN_FIRST = (PY_0U-831) # rebar RBN_LAST = (PY_0U-859) IPN_FIRST = (PY_0U-860) # internet address IPN_LAST = (PY_0U-879) # internet address SBN_FIRST = (PY_0U-880) # status bar SBN_LAST = (PY_0U-899) PGN_FIRST = (PY_0U-900) # Pager Control PGN_LAST = (PY_0U-950) LVM_FIRST = 4096 # ListView messages TV_FIRST = 4352 # TreeView messages HDM_FIRST = 4608 # Header messages TCM_FIRST = 4864 # Tab control messages PGM_FIRST = 5120 # Pager control messages CCM_FIRST = 8192 # Common control shared messages CCM_SETBKCOLOR = (CCM_FIRST + 1) # lParam is bkColor CCM_SETCOLORSCHEME = (CCM_FIRST + 2) # lParam is color scheme CCM_GETCOLORSCHEME = (CCM_FIRST + 3) # fills in COLORSCHEME pointed to by lParam CCM_GETDROPTARGET = (CCM_FIRST + 4) CCM_SETUNICODEFORMAT = (CCM_FIRST + 5) CCM_GETUNICODEFORMAT = (CCM_FIRST + 6) INFOTIPSIZE = 1024 NM_OUTOFMEMORY = (NM_FIRST-1) NM_CLICK = (NM_FIRST-2) # uses NMCLICK struct NM_DBLCLK = (NM_FIRST-3) NM_RETURN = (NM_FIRST-4) NM_RCLICK = (NM_FIRST-5) # uses NMCLICK struct NM_RDBLCLK = (NM_FIRST-6) NM_SETFOCUS = (NM_FIRST-7) NM_KILLFOCUS = (NM_FIRST-8) NM_CUSTOMDRAW = (NM_FIRST-12) NM_HOVER = (NM_FIRST-13) NM_NCHITTEST = (NM_FIRST-14) # uses NMMOUSE struct NM_KEYDOWN = (NM_FIRST-15) # uses NMKEY struct NM_RELEASEDCAPTURE = (NM_FIRST-16) NM_SETCURSOR = (NM_FIRST-17) # uses NMMOUSE struct NM_CHAR = (NM_FIRST-18) # uses NMCHAR struct MSGF_COMMCTRL_BEGINDRAG = 16896 MSGF_COMMCTRL_SIZEHEADER = 16897 MSGF_COMMCTRL_DRAGSELECT = 16898 MSGF_COMMCTRL_TOOLBARCUST = 16899 CDRF_DODEFAULT = 0 CDRF_NEWFONT = 2 CDRF_SKIPDEFAULT = 4 CDRF_NOTIFYPOSTPAINT = 16 CDRF_NOTIFYITEMDRAW = 32 CDRF_NOTIFYSUBITEMDRAW = 32 # flags are the same, we can distinguish by context CDRF_NOTIFYPOSTERASE = 64 CDDS_PREPAINT = 1 CDDS_POSTPAINT = 2 CDDS_PREERASE = 3 CDDS_POSTERASE = 4 CDDS_ITEM = 65536 CDDS_ITEMPREPAINT = (CDDS_ITEM | CDDS_PREPAINT) CDDS_ITEMPOSTPAINT = (CDDS_ITEM | CDDS_POSTPAINT) CDDS_ITEMPREERASE = (CDDS_ITEM | CDDS_PREERASE) CDDS_ITEMPOSTERASE = (CDDS_ITEM | CDDS_POSTERASE) CDDS_SUBITEM = 131072 CDIS_SELECTED = 1 CDIS_GRAYED = 2 CDIS_DISABLED = 4 CDIS_CHECKED = 8 CDIS_FOCUS = 16 CDIS_DEFAULT = 32 CDIS_HOT = 64 CDIS_MARKED = 128 CDIS_INDETERMINATE = 256 CLR_NONE = -1 # 0xFFFFFFFFL CLR_DEFAULT = -16777216 # 0xFF000000L ILC_MASK = 1 ILC_COLOR = 0 ILC_COLORDDB = 254 ILC_COLOR4 = 4 ILC_COLOR8 = 8 ILC_COLOR16 = 16 ILC_COLOR24 = 24 ILC_COLOR32 = 32 ILC_PALETTE = 2048 # (not implemented) ILD_NORMAL = 0 ILD_TRANSPARENT = 1 ILD_MASK = 16 ILD_IMAGE = 32 ILD_ROP = 64 ILD_BLEND25 = 2 ILD_BLEND50 = 4 ILD_OVERLAYMASK = 3840 ILD_SELECTED = ILD_BLEND50 ILD_FOCUS = ILD_BLEND25 ILD_BLEND = ILD_BLEND50 CLR_HILIGHT = CLR_DEFAULT ILCF_MOVE = (0) ILCF_SWAP = (1) WC_HEADERA = "SysHeader32" WC_HEADER = WC_HEADERA HDS_HORZ = 0 HDS_BUTTONS = 2 HDS_HOTTRACK = 4 HDS_HIDDEN = 8 HDS_DRAGDROP = 64 HDS_FULLDRAG = 128 HDI_WIDTH = 1 HDI_HEIGHT = HDI_WIDTH HDI_TEXT = 2 HDI_FORMAT = 4 HDI_LPARAM = 8 HDI_BITMAP = 16 HDI_IMAGE = 32 HDI_DI_SETITEM = 64 HDI_ORDER = 128 HDF_LEFT = 0 HDF_RIGHT = 1 HDF_CENTER = 2 HDF_JUSTIFYMASK = 3 HDF_RTLREADING = 4 HDF_OWNERDRAW = 32768 HDF_STRING = 16384 HDF_BITMAP = 8192 HDF_BITMAP_ON_RIGHT = 4096 HDF_IMAGE = 2048 HDM_GETITEMCOUNT = (HDM_FIRST + 0) HDM_INSERTITEMA = (HDM_FIRST + 1) HDM_INSERTITEMW = (HDM_FIRST + 10) HDM_INSERTITEM = HDM_INSERTITEMA HDM_DELETEITEM = (HDM_FIRST + 2) HDM_GETITEMA = (HDM_FIRST + 3) HDM_GETITEMW = (HDM_FIRST + 11) HDM_GETITEM = HDM_GETITEMA HDM_SETITEMA = (HDM_FIRST + 4) HDM_SETITEMW = (HDM_FIRST + 12) HDM_SETITEM = HDM_SETITEMA HDM_LAYOUT = (HDM_FIRST + 5) HHT_NOWHERE = 1 HHT_ONHEADER = 2 HHT_ONDIVIDER = 4 HHT_ONDIVOPEN = 8 HHT_ABOVE = 256 HHT_BELOW = 512 HHT_TORIGHT = 1024 HHT_TOLEFT = 2048 HDM_HITTEST = (HDM_FIRST + 6) HDM_GETITEMRECT = (HDM_FIRST + 7) HDM_SETIMAGELIST = (HDM_FIRST + 8) HDM_GETIMAGELIST = (HDM_FIRST + 9) HDM_ORDERTOINDEX = (HDM_FIRST + 15) HDM_CREATEDRAGIMAGE = (HDM_FIRST + 16) # wparam = which item (by index) HDM_GETORDERARRAY = (HDM_FIRST + 17) HDM_SETORDERARRAY = (HDM_FIRST + 18) HDM_SETHOTDIVIDER = (HDM_FIRST + 19) HDM_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT HDM_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT HDN_ITEMCHANGINGA = (HDN_FIRST-0) HDN_ITEMCHANGINGW = (HDN_FIRST-20) HDN_ITEMCHANGEDA = (HDN_FIRST-1) HDN_ITEMCHANGEDW = (HDN_FIRST-21) HDN_ITEMCLICKA = (HDN_FIRST-2) HDN_ITEMCLICKW = (HDN_FIRST-22) HDN_ITEMDBLCLICKA = (HDN_FIRST-3) HDN_ITEMDBLCLICKW = (HDN_FIRST-23) HDN_DIVIDERDBLCLICKA = (HDN_FIRST-5) HDN_DIVIDERDBLCLICKW = (HDN_FIRST-25) HDN_BEGINTRACKA = (HDN_FIRST-6) HDN_BEGINTRACKW = (HDN_FIRST-26) HDN_ENDTRACKA = (HDN_FIRST-7) HDN_ENDTRACKW = (HDN_FIRST-27) HDN_TRACKA = (HDN_FIRST-8) HDN_TRACKW = (HDN_FIRST-28) HDN_GETDISPINFOA = (HDN_FIRST-9) HDN_GETDISPINFOW = (HDN_FIRST-29) HDN_BEGINDRAG = (HDN_FIRST-10) HDN_ENDDRAG = (HDN_FIRST-11) HDN_ITEMCHANGING = HDN_ITEMCHANGINGA HDN_ITEMCHANGED = HDN_ITEMCHANGEDA HDN_ITEMCLICK = HDN_ITEMCLICKA HDN_ITEMDBLCLICK = HDN_ITEMDBLCLICKA HDN_DIVIDERDBLCLICK = HDN_DIVIDERDBLCLICKA HDN_BEGINTRACK = HDN_BEGINTRACKA HDN_ENDTRACK = HDN_ENDTRACKA HDN_TRACK = HDN_TRACKA HDN_GETDISPINFO = HDN_GETDISPINFOA TOOLBARCLASSNAMEA = "ToolbarWindow32" TOOLBARCLASSNAME = TOOLBARCLASSNAMEA CMB_MASKED = 2 TBSTATE_CHECKED = 1 TBSTATE_PRESSED = 2 TBSTATE_ENABLED = 4 TBSTATE_HIDDEN = 8 TBSTATE_INDETERMINATE = 16 TBSTATE_WRAP = 32 TBSTATE_ELLIPSES = 64 TBSTATE_MARKED = 128 TBSTYLE_BUTTON = 0 TBSTYLE_SEP = 1 TBSTYLE_CHECK = 2 TBSTYLE_GROUP = 4 TBSTYLE_CHECKGROUP = (TBSTYLE_GROUP | TBSTYLE_CHECK) TBSTYLE_DROPDOWN = 8 TBSTYLE_AUTOSIZE = 16 # automatically calculate the cx of the button TBSTYLE_NOPREFIX = 32 # if this button should not have accel prefix TBSTYLE_TOOLTIPS = 256 TBSTYLE_WRAPABLE = 512 TBSTYLE_ALTDRAG = 1024 TBSTYLE_FLAT = 2048 TBSTYLE_LIST = 4096 TBSTYLE_CUSTOMERASE = 8192 TBSTYLE_REGISTERDROP = 16384 TBSTYLE_TRANSPARENT = 32768 TBSTYLE_EX_DRAWDDARROWS = 1 BTNS_BUTTON = TBSTYLE_BUTTON BTNS_SEP = TBSTYLE_SEP # 0x0001 BTNS_CHECK = TBSTYLE_CHECK # 0x0002 BTNS_GROUP = TBSTYLE_GROUP # 0x0004 BTNS_CHECKGROUP = TBSTYLE_CHECKGROUP # (TBSTYLE_GROUP | TBSTYLE_CHECK) BTNS_DROPDOWN = TBSTYLE_DROPDOWN # 0x0008 BTNS_AUTOSIZE = TBSTYLE_AUTOSIZE # 0x0010; automatically calculate the cx of the button BTNS_NOPREFIX = TBSTYLE_NOPREFIX # 0x0020; this button should not have accel prefix BTNS_SHOWTEXT = 64 # 0x0040 // ignored unless TBSTYLE_EX_MIXEDBUTTONS is set BTNS_WHOLEDROPDOWN = 128 # 0x0080 // draw drop-down arrow, but without split arrow section TBCDRF_NOEDGES = 65536 # Don't draw button edges TBCDRF_HILITEHOTTRACK = 131072 # Use color of the button bk when hottracked TBCDRF_NOOFFSET = 262144 # Don't offset button if pressed TBCDRF_NOMARK = 524288 # Don't draw default highlight of image/text for TBSTATE_MARKED TBCDRF_NOETCHEDEFFECT = 1048576 # Don't draw etched effect for disabled items TB_ENABLEBUTTON = (WM_USER + 1) TB_CHECKBUTTON = (WM_USER + 2) TB_PRESSBUTTON = (WM_USER + 3) TB_HIDEBUTTON = (WM_USER + 4) TB_INDETERMINATE = (WM_USER + 5) TB_MARKBUTTON = (WM_USER + 6) TB_ISBUTTONENABLED = (WM_USER + 9) TB_ISBUTTONCHECKED = (WM_USER + 10) TB_ISBUTTONPRESSED = (WM_USER + 11) TB_ISBUTTONHIDDEN = (WM_USER + 12) TB_ISBUTTONINDETERMINATE = (WM_USER + 13) TB_ISBUTTONHIGHLIGHTED = (WM_USER + 14) TB_SETSTATE = (WM_USER + 17) TB_GETSTATE = (WM_USER + 18) TB_ADDBITMAP = (WM_USER + 19) HINST_COMMCTRL = -1 IDB_STD_SMALL_COLOR = 0 IDB_STD_LARGE_COLOR = 1 IDB_VIEW_SMALL_COLOR = 4 IDB_VIEW_LARGE_COLOR = 5 IDB_HIST_SMALL_COLOR = 8 IDB_HIST_LARGE_COLOR = 9 STD_CUT = 0 STD_COPY = 1 STD_PASTE = 2 STD_UNDO = 3 STD_REDOW = 4 STD_DELETE = 5 STD_FILENEW = 6 STD_FILEOPEN = 7 STD_FILESAVE = 8 STD_PRINTPRE = 9 STD_PROPERTIES = 10 STD_HELP = 11 STD_FIND = 12 STD_REPLACE = 13 STD_PRINT = 14 VIEW_LARGEICONS = 0 VIEW_SMALLICONS = 1 VIEW_LIST = 2 VIEW_DETAILS = 3 VIEW_SORTNAME = 4 VIEW_SORTSIZE = 5 VIEW_SORTDATE = 6 VIEW_SORTTYPE = 7 VIEW_PARENTFOLDER = 8 VIEW_NETCONNECT = 9 VIEW_NETDISCONNECT = 10 VIEW_NEWFOLDER = 11 VIEW_VIEWMENU = 12 HIST_BACK = 0 HIST_FORWARD = 1 HIST_FAVORITES = 2 HIST_ADDTOFAVORITES = 3 HIST_VIEWTREE = 4 TB_ADDBUTTONSA = (WM_USER + 20) TB_INSERTBUTTONA = (WM_USER + 21) TB_ADDBUTTONS = (WM_USER + 20) TB_INSERTBUTTON = (WM_USER + 21) TB_DELETEBUTTON = (WM_USER + 22) TB_GETBUTTON = (WM_USER + 23) TB_BUTTONCOUNT = (WM_USER + 24) TB_COMMANDTOINDEX = (WM_USER + 25) TB_SAVERESTOREA = (WM_USER + 26) TB_SAVERESTOREW = (WM_USER + 76) TB_CUSTOMIZE = (WM_USER + 27) TB_ADDSTRINGA = (WM_USER + 28) TB_ADDSTRINGW = (WM_USER + 77) TB_GETITEMRECT = (WM_USER + 29) TB_BUTTONSTRUCTSIZE = (WM_USER + 30) TB_SETBUTTONSIZE = (WM_USER + 31) TB_SETBITMAPSIZE = (WM_USER + 32) TB_AUTOSIZE = (WM_USER + 33) TB_GETTOOLTIPS = (WM_USER + 35) TB_SETTOOLTIPS = (WM_USER + 36) TB_SETPARENT = (WM_USER + 37) TB_SETROWS = (WM_USER + 39) TB_GETROWS = (WM_USER + 40) TB_SETCMDID = (WM_USER + 42) TB_CHANGEBITMAP = (WM_USER + 43) TB_GETBITMAP = (WM_USER + 44) TB_GETBUTTONTEXTA = (WM_USER + 45) TB_GETBUTTONTEXTW = (WM_USER + 75) TB_REPLACEBITMAP = (WM_USER + 46) TB_SETINDENT = (WM_USER + 47) TB_SETIMAGELIST = (WM_USER + 48) TB_GETIMAGELIST = (WM_USER + 49) TB_LOADIMAGES = (WM_USER + 50) TB_GETRECT = (WM_USER + 51) # wParam is the Cmd instead of index TB_SETHOTIMAGELIST = (WM_USER + 52) TB_GETHOTIMAGELIST = (WM_USER + 53) TB_SETDISABLEDIMAGELIST = (WM_USER + 54) TB_GETDISABLEDIMAGELIST = (WM_USER + 55) TB_SETSTYLE = (WM_USER + 56) TB_GETSTYLE = (WM_USER + 57) TB_GETBUTTONSIZE = (WM_USER + 58) TB_SETBUTTONWIDTH = (WM_USER + 59) TB_SETMAXTEXTROWS = (WM_USER + 60) TB_GETTEXTROWS = (WM_USER + 61) TB_GETBUTTONTEXT = TB_GETBUTTONTEXTW TB_SAVERESTORE = TB_SAVERESTOREW TB_ADDSTRING = TB_ADDSTRINGW TB_GETBUTTONTEXT = TB_GETBUTTONTEXTA TB_SAVERESTORE = TB_SAVERESTOREA TB_ADDSTRING = TB_ADDSTRINGA TB_GETOBJECT = (WM_USER + 62) # wParam == IID, lParam void **ppv TB_GETHOTITEM = (WM_USER + 71) TB_SETHOTITEM = (WM_USER + 72) # wParam == iHotItem TB_SETANCHORHIGHLIGHT = (WM_USER + 73) # wParam == TRUE/FALSE TB_GETANCHORHIGHLIGHT = (WM_USER + 74) TB_MAPACCELERATORA = (WM_USER + 78) # wParam == ch, lParam int * pidBtn TBIMHT_AFTER = 1 # TRUE = insert After iButton, otherwise before TBIMHT_BACKGROUND = 2 # TRUE iff missed buttons completely TB_GETINSERTMARK = (WM_USER + 79) # lParam == LPTBINSERTMARK TB_SETINSERTMARK = (WM_USER + 80) # lParam == LPTBINSERTMARK TB_INSERTMARKHITTEST = (WM_USER + 81) # wParam == LPPOINT lParam == LPTBINSERTMARK TB_MOVEBUTTON = (WM_USER + 82) TB_GETMAXSIZE = (WM_USER + 83) # lParam == LPSIZE TB_SETEXTENDEDSTYLE = (WM_USER + 84) # For TBSTYLE_EX_* TB_GETEXTENDEDSTYLE = (WM_USER + 85) # For TBSTYLE_EX_* TB_GETPADDING = (WM_USER + 86) TB_SETPADDING = (WM_USER + 87) TB_SETINSERTMARKCOLOR = (WM_USER + 88) TB_GETINSERTMARKCOLOR = (WM_USER + 89) TB_SETCOLORSCHEME = CCM_SETCOLORSCHEME # lParam is color scheme TB_GETCOLORSCHEME = CCM_GETCOLORSCHEME # fills in COLORSCHEME pointed to by lParam TB_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT TB_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT TB_MAPACCELERATORW = (WM_USER + 90) # wParam == ch, lParam int * pidBtn TB_MAPACCELERATOR = TB_MAPACCELERATORW TB_MAPACCELERATOR = TB_MAPACCELERATORA TBBF_LARGE = 1 TB_GETBITMAPFLAGS = (WM_USER + 41) TBIF_IMAGE = 1 TBIF_TEXT = 2 TBIF_STATE = 4 TBIF_STYLE = 8 TBIF_LPARAM = 16 TBIF_COMMAND = 32 TBIF_SIZE = 64 TB_GETBUTTONINFOW = (WM_USER + 63) TB_SETBUTTONINFOW = (WM_USER + 64) TB_GETBUTTONINFOA = (WM_USER + 65) TB_SETBUTTONINFOA = (WM_USER + 66) TB_INSERTBUTTONW = (WM_USER + 67) TB_ADDBUTTONSW = (WM_USER + 68) TB_HITTEST = (WM_USER + 69) TB_SETDRAWTEXTFLAGS = (WM_USER + 70) # wParam == mask lParam == bit values TBN_GETBUTTONINFOA = (TBN_FIRST-0) TBN_GETBUTTONINFOW = (TBN_FIRST-20) TBN_BEGINDRAG = (TBN_FIRST-1) TBN_ENDDRAG = (TBN_FIRST-2) TBN_BEGINADJUST = (TBN_FIRST-3) TBN_ENDADJUST = (TBN_FIRST-4) TBN_RESET = (TBN_FIRST-5) TBN_QUERYINSERT = (TBN_FIRST-6) TBN_QUERYDELETE = (TBN_FIRST-7) TBN_TOOLBARCHANGE = (TBN_FIRST-8) TBN_CUSTHELP = (TBN_FIRST-9) TBN_DROPDOWN = (TBN_FIRST - 10) TBN_GETOBJECT = (TBN_FIRST - 12) HICF_OTHER = 0 HICF_MOUSE = 1 # Triggered by mouse HICF_ARROWKEYS = 2 # Triggered by arrow keys HICF_ACCELERATOR = 4 # Triggered by accelerator HICF_DUPACCEL = 8 # This accelerator is not unique HICF_ENTERING = 16 # idOld is invalid HICF_LEAVING = 32 # idNew is invalid HICF_RESELECT = 64 # hot item reselected TBN_HOTITEMCHANGE = (TBN_FIRST - 13) TBN_DRAGOUT = (TBN_FIRST - 14) # this is sent when the user clicks down on a button then drags off the button TBN_DELETINGBUTTON = (TBN_FIRST - 15) # uses TBNOTIFY TBN_GETDISPINFOA = (TBN_FIRST - 16) # This is sent when the toolbar needs some display information TBN_GETDISPINFOW = (TBN_FIRST - 17) # This is sent when the toolbar needs some display information TBN_GETINFOTIPA = (TBN_FIRST - 18) TBN_GETINFOTIPW = (TBN_FIRST - 19) TBN_GETINFOTIP = TBN_GETINFOTIPA TBNF_IMAGE = 1 TBNF_TEXT = 2 TBNF_DI_SETITEM = 268435456 TBN_GETDISPINFO = TBN_GETDISPINFOA TBDDRET_DEFAULT = 0 TBDDRET_NODEFAULT = 1 TBDDRET_TREATPRESSED = 2 # Treat as a standard press button TBN_GETBUTTONINFO = TBN_GETBUTTONINFOA REBARCLASSNAMEA = "ReBarWindow32" REBARCLASSNAME = REBARCLASSNAMEA RBIM_IMAGELIST = 1 RBS_TOOLTIPS = 256 RBS_VARHEIGHT = 512 RBS_BANDBORDERS = 1024 RBS_FIXEDORDER = 2048 RBS_REGISTERDROP = 4096 RBS_AUTOSIZE = 8192 RBS_VERTICALGRIPPER = 16384 # this always has the vertical gripper (default for horizontal mode) RBS_DBLCLKTOGGLE = 32768 RBS_TOOLTIPS = 256 RBS_VARHEIGHT = 512 RBS_BANDBORDERS = 1024 RBS_FIXEDORDER = 2048 RBBS_BREAK = 1 # break to new line RBBS_FIXEDSIZE = 2 # band can't be sized RBBS_CHILDEDGE = 4 # edge around top & bottom of child window RBBS_HIDDEN = 8 # don't show RBBS_NOVERT = 16 # don't show when vertical RBBS_FIXEDBMP = 32 # bitmap doesn't move during band resize RBBS_VARIABLEHEIGHT = 64 # allow autosizing of this child vertically RBBS_GRIPPERALWAYS = 128 # always show the gripper RBBS_NOGRIPPER = 256 # never show the gripper RBBIM_STYLE = 1 RBBIM_COLORS = 2 RBBIM_TEXT = 4 RBBIM_IMAGE = 8 RBBIM_CHILD = 16 RBBIM_CHILDSIZE = 32 RBBIM_SIZE = 64 RBBIM_BACKGROUND = 128 RBBIM_ID = 256 RBBIM_IDEALSIZE = 512 RBBIM_LPARAM = 1024 RB_INSERTBANDA = (WM_USER + 1) RB_DELETEBAND = (WM_USER + 2) RB_GETBARINFO = (WM_USER + 3) RB_SETBARINFO = (WM_USER + 4) RB_GETBANDINFO = (WM_USER + 5) RB_SETBANDINFOA = (WM_USER + 6) RB_SETPARENT = (WM_USER + 7) RB_HITTEST = (WM_USER + 8) RB_GETRECT = (WM_USER + 9) RB_INSERTBANDW = (WM_USER + 10) RB_SETBANDINFOW = (WM_USER + 11) RB_GETBANDCOUNT = (WM_USER + 12) RB_GETROWCOUNT = (WM_USER + 13) RB_GETROWHEIGHT = (WM_USER + 14) RB_IDTOINDEX = (WM_USER + 16) # wParam == id RB_GETTOOLTIPS = (WM_USER + 17) RB_SETTOOLTIPS = (WM_USER + 18) RB_SETBKCOLOR = (WM_USER + 19) # sets the default BK color RB_GETBKCOLOR = (WM_USER + 20) # defaults to CLR_NONE RB_SETTEXTCOLOR = (WM_USER + 21) RB_GETTEXTCOLOR = (WM_USER + 22) # defaults to 0x00000000 RB_SIZETORECT = (WM_USER + 23) # resize the rebar/break bands and such to this rect (lparam) RB_SETCOLORSCHEME = CCM_SETCOLORSCHEME # lParam is color scheme RB_GETCOLORSCHEME = CCM_GETCOLORSCHEME # fills in COLORSCHEME pointed to by lParam RB_INSERTBAND = RB_INSERTBANDA RB_SETBANDINFO = RB_SETBANDINFOA RB_BEGINDRAG = (WM_USER + 24) RB_ENDDRAG = (WM_USER + 25) RB_DRAGMOVE = (WM_USER + 26) RB_GETBARHEIGHT = (WM_USER + 27) RB_GETBANDINFOW = (WM_USER + 28) RB_GETBANDINFOA = (WM_USER + 29) RB_GETBANDINFO = RB_GETBANDINFOA RB_MINIMIZEBAND = (WM_USER + 30) RB_MAXIMIZEBAND = (WM_USER + 31) RB_GETDROPTARGET = (CCM_GETDROPTARGET) RB_GETBANDBORDERS = (WM_USER + 34) # returns in lparam = lprc the amount of edges added to band wparam RB_SHOWBAND = (WM_USER + 35) # show/hide band RB_SETPALETTE = (WM_USER + 37) RB_GETPALETTE = (WM_USER + 38) RB_MOVEBAND = (WM_USER + 39) RB_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT RB_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT RBN_HEIGHTCHANGE = (RBN_FIRST - 0) RBN_GETOBJECT = (RBN_FIRST - 1) RBN_LAYOUTCHANGED = (RBN_FIRST - 2) RBN_AUTOSIZE = (RBN_FIRST - 3) RBN_BEGINDRAG = (RBN_FIRST - 4) RBN_ENDDRAG = (RBN_FIRST - 5) RBN_DELETINGBAND = (RBN_FIRST - 6) # Uses NMREBAR RBN_DELETEDBAND = (RBN_FIRST - 7) # Uses NMREBAR RBN_CHILDSIZE = (RBN_FIRST - 8) RBNM_ID = 1 RBNM_STYLE = 2 RBNM_LPARAM = 4 RBHT_NOWHERE = 1 RBHT_CAPTION = 2 RBHT_CLIENT = 3 RBHT_GRABBER = 4 TOOLTIPS_CLASSA = "tooltips_class32" TOOLTIPS_CLASS = TOOLTIPS_CLASSA TTS_ALWAYSTIP = 1 TTS_NOPREFIX = 2 TTF_IDISHWND = 1 TTF_CENTERTIP = 2 TTF_RTLREADING = 4 TTF_SUBCLASS = 16 TTF_TRACK = 32 TTF_ABSOLUTE = 128 TTF_TRANSPARENT = 256 TTF_DI_SETITEM = 32768 # valid only on the TTN_NEEDTEXT callback TTDT_AUTOMATIC = 0 TTDT_RESHOW = 1 TTDT_AUTOPOP = 2 TTDT_INITIAL = 3 TTM_ACTIVATE = (WM_USER + 1) TTM_SETDELAYTIME = (WM_USER + 3) TTM_ADDTOOLA = (WM_USER + 4) TTM_ADDTOOLW = (WM_USER + 50) TTM_DELTOOLA = (WM_USER + 5) TTM_DELTOOLW = (WM_USER + 51) TTM_NEWTOOLRECTA = (WM_USER + 6) TTM_NEWTOOLRECTW = (WM_USER + 52) TTM_RELAYEVENT = (WM_USER + 7) TTM_GETTOOLINFOA = (WM_USER + 8) TTM_GETTOOLINFOW = (WM_USER + 53) TTM_SETTOOLINFOA = (WM_USER + 9) TTM_SETTOOLINFOW = (WM_USER + 54) TTM_HITTESTA = (WM_USER +10) TTM_HITTESTW = (WM_USER +55) TTM_GETTEXTA = (WM_USER +11) TTM_GETTEXTW = (WM_USER +56) TTM_UPDATETIPTEXTA = (WM_USER +12) TTM_UPDATETIPTEXTW = (WM_USER +57) TTM_GETTOOLCOUNT = (WM_USER +13) TTM_ENUMTOOLSA = (WM_USER +14) TTM_ENUMTOOLSW = (WM_USER +58) TTM_GETCURRENTTOOLA = (WM_USER + 15) TTM_GETCURRENTTOOLW = (WM_USER + 59) TTM_WINDOWFROMPOINT = (WM_USER + 16) TTM_TRACKACTIVATE = (WM_USER + 17) # wParam = TRUE/FALSE start end lparam = LPTOOLINFO TTM_TRACKPOSITION = (WM_USER + 18) # lParam = dwPos TTM_SETTIPBKCOLOR = (WM_USER + 19) TTM_SETTIPTEXTCOLOR = (WM_USER + 20) TTM_GETDELAYTIME = (WM_USER + 21) TTM_GETTIPBKCOLOR = (WM_USER + 22) TTM_GETTIPTEXTCOLOR = (WM_USER + 23) TTM_SETMAXTIPWIDTH = (WM_USER + 24) TTM_GETMAXTIPWIDTH = (WM_USER + 25) TTM_SETMARGIN = (WM_USER + 26) # lParam = lprc TTM_GETMARGIN = (WM_USER + 27) # lParam = lprc TTM_POP = (WM_USER + 28) TTM_UPDATE = (WM_USER + 29) TTM_ADDTOOL = TTM_ADDTOOLA TTM_DELTOOL = TTM_DELTOOLA TTM_NEWTOOLRECT = TTM_NEWTOOLRECTA TTM_GETTOOLINFO = TTM_GETTOOLINFOA TTM_SETTOOLINFO = TTM_SETTOOLINFOA TTM_HITTEST = TTM_HITTESTA TTM_GETTEXT = TTM_GETTEXTA TTM_UPDATETIPTEXT = TTM_UPDATETIPTEXTA TTM_ENUMTOOLS = TTM_ENUMTOOLSA TTM_GETCURRENTTOOL = TTM_GETCURRENTTOOLA TTN_GETDISPINFOA = (TTN_FIRST - 0) TTN_GETDISPINFOW = (TTN_FIRST - 10) TTN_SHOW = (TTN_FIRST - 1) TTN_POP = (TTN_FIRST - 2) TTN_GETDISPINFO = TTN_GETDISPINFOA TTN_NEEDTEXT = TTN_GETDISPINFO TTN_NEEDTEXTA = TTN_GETDISPINFOA TTN_NEEDTEXTW = TTN_GETDISPINFOW SBARS_SIZEGRIP = 256 SBARS_TOOLTIPS = 2048 STATUSCLASSNAMEA = "msctls_statusbar32" STATUSCLASSNAME = STATUSCLASSNAMEA SB_SETTEXTA = (WM_USER+1) SB_SETTEXTW = (WM_USER+11) SB_GETTEXTA = (WM_USER+2) SB_GETTEXTW = (WM_USER+13) SB_GETTEXTLENGTHA = (WM_USER+3) SB_GETTEXTLENGTHW = (WM_USER+12) SB_GETTEXT = SB_GETTEXTA SB_SETTEXT = SB_SETTEXTA SB_GETTEXTLENGTH = SB_GETTEXTLENGTHA SB_SETPARTS = (WM_USER+4) SB_GETPARTS = (WM_USER+6) SB_GETBORDERS = (WM_USER+7) SB_SETMINHEIGHT = (WM_USER+8) SB_SIMPLE = (WM_USER+9) SB_GETRECT = (WM_USER+10) SB_ISSIMPLE = (WM_USER+14) SB_SETICON = (WM_USER+15) SB_SETTIPTEXTA = (WM_USER+16) SB_SETTIPTEXTW = (WM_USER+17) SB_GETTIPTEXTA = (WM_USER+18) SB_GETTIPTEXTW = (WM_USER+19) SB_GETICON = (WM_USER+20) SB_SETTIPTEXT = SB_SETTIPTEXTA SB_GETTIPTEXT = SB_GETTIPTEXTA SB_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT SB_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT SBT_OWNERDRAW = 4096 SBT_NOBORDERS = 256 SBT_POPOUT = 512 SBT_RTLREADING = 1024 SBT_NOTABPARSING = 2048 SBT_TOOLTIPS = 2048 SB_SETBKCOLOR = CCM_SETBKCOLOR # lParam = bkColor SBN_SIMPLEMODECHANGE = (SBN_FIRST - 0) TRACKBAR_CLASSA = "msctls_trackbar32" TRACKBAR_CLASS = TRACKBAR_CLASSA TBS_AUTOTICKS = 1 TBS_VERT = 2 TBS_HORZ = 0 TBS_TOP = 4 TBS_BOTTOM = 0 TBS_LEFT = 4 TBS_RIGHT = 0 TBS_BOTH = 8 TBS_NOTICKS = 16 TBS_ENABLESELRANGE = 32 TBS_FIXEDLENGTH = 64 TBS_NOTHUMB = 128 TBS_TOOLTIPS = 256 TBM_GETPOS = (WM_USER) TBM_GETRANGEMIN = (WM_USER+1) TBM_GETRANGEMAX = (WM_USER+2) TBM_GETTIC = (WM_USER+3) TBM_SETTIC = (WM_USER+4) TBM_SETPOS = (WM_USER+5) TBM_SETRANGE = (WM_USER+6) TBM_SETRANGEMIN = (WM_USER+7) TBM_SETRANGEMAX = (WM_USER+8) TBM_CLEARTICS = (WM_USER+9) TBM_SETSEL = (WM_USER+10) TBM_SETSELSTART = (WM_USER+11) TBM_SETSELEND = (WM_USER+12) TBM_GETPTICS = (WM_USER+14) TBM_GETTICPOS = (WM_USER+15) TBM_GETNUMTICS = (WM_USER+16) TBM_GETSELSTART = (WM_USER+17) TBM_GETSELEND = (WM_USER+18) TBM_CLEARSEL = (WM_USER+19) TBM_SETTICFREQ = (WM_USER+20) TBM_SETPAGESIZE = (WM_USER+21) TBM_GETPAGESIZE = (WM_USER+22) TBM_SETLINESIZE = (WM_USER+23) TBM_GETLINESIZE = (WM_USER+24) TBM_GETTHUMBRECT = (WM_USER+25) TBM_GETCHANNELRECT = (WM_USER+26) TBM_SETTHUMBLENGTH = (WM_USER+27) TBM_GETTHUMBLENGTH = (WM_USER+28) TBM_SETTOOLTIPS = (WM_USER+29) TBM_GETTOOLTIPS = (WM_USER+30) TBM_SETTIPSIDE = (WM_USER+31) TBTS_TOP = 0 TBTS_LEFT = 1 TBTS_BOTTOM = 2 TBTS_RIGHT = 3 TBM_SETBUDDY = (WM_USER+32) # wparam = BOOL fLeft; (or right) TBM_GETBUDDY = (WM_USER+33) # wparam = BOOL fLeft; (or right) TBM_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT TBM_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT TB_LINEUP = 0 TB_LINEDOWN = 1 TB_PAGEUP = 2 TB_PAGEDOWN = 3 TB_THUMBPOSITION = 4 TB_THUMBTRACK = 5 TB_TOP = 6 TB_BOTTOM = 7 TB_ENDTRACK = 8 TBCD_TICS = 1 TBCD_THUMB = 2 TBCD_CHANNEL = 3 DL_BEGINDRAG = (WM_USER+133) DL_DRAGGING = (WM_USER+134) DL_DROPPED = (WM_USER+135) DL_CANCELDRAG = (WM_USER+136) DL_CURSORSET = 0 DL_STOPCURSOR = 1 DL_COPYCURSOR = 2 DL_MOVECURSOR = 3 DRAGLISTMSGSTRING = "commctrl_DragListMsg" UPDOWN_CLASSA = "msctls_updown32" UPDOWN_CLASS = UPDOWN_CLASSA UD_MAXVAL = 32767 UD_MINVAL = (-UD_MAXVAL) UDS_WRAP = 1 UDS_SETBUDDYINT = 2 UDS_ALIGNRIGHT = 4 UDS_ALIGNLEFT = 8 UDS_AUTOBUDDY = 16 UDS_ARROWKEYS = 32 UDS_HORZ = 64 UDS_NOTHOUSANDS = 128 UDS_HOTTRACK = 256 UDM_SETRANGE = (WM_USER+101) UDM_GETRANGE = (WM_USER+102) UDM_SETPOS = (WM_USER+103) UDM_GETPOS = (WM_USER+104) UDM_SETBUDDY = (WM_USER+105) UDM_GETBUDDY = (WM_USER+106) UDM_SETACCEL = (WM_USER+107) UDM_GETACCEL = (WM_USER+108) UDM_SETBASE = (WM_USER+109) UDM_GETBASE = (WM_USER+110) UDM_SETRANGE32 = (WM_USER+111) UDM_GETRANGE32 = (WM_USER+112) # wParam & lParam are LPINT UDM_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT UDM_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT UDN_DELTAPOS = (UDN_FIRST - 1) PROGRESS_CLASSA = "msctls_progress32" PROGRESS_CLASS = PROGRESS_CLASSA PBS_SMOOTH = 1 PBS_VERTICAL = 4 PBM_SETRANGE = (WM_USER+1) PBM_SETPOS = (WM_USER+2) PBM_DELTAPOS = (WM_USER+3) PBM_SETSTEP = (WM_USER+4) PBM_STEPIT = (WM_USER+5) PBM_SETRANGE32 = (WM_USER+6) # lParam = high, wParam = low PBM_GETRANGE = (WM_USER+7) # wParam = return (TRUE ? low : high). lParam = PPBRANGE or NULL PBM_GETPOS = (WM_USER+8) PBM_SETBARCOLOR = (WM_USER+9) # lParam = bar color PBM_SETBKCOLOR = CCM_SETBKCOLOR # lParam = bkColor HOTKEYF_SHIFT = 1 HOTKEYF_CONTROL = 2 HOTKEYF_ALT = 4 HOTKEYF_EXT = 128 HOTKEYF_EXT = 8 HKCOMB_NONE = 1 HKCOMB_S = 2 HKCOMB_C = 4 HKCOMB_A = 8 HKCOMB_SC = 16 HKCOMB_SA = 32 HKCOMB_CA = 64 HKCOMB_SCA = 128 HKM_SETHOTKEY = (WM_USER+1) HKM_GETHOTKEY = (WM_USER+2) HKM_SETRULES = (WM_USER+3) HOTKEY_CLASSA = "msctls_hotkey32" HOTKEY_CLASS = HOTKEY_CLASSA CCS_TOP = 0x00000001 CCS_NOMOVEY = 0x00000002 CCS_BOTTOM = 0x00000003 CCS_NORESIZE = 0x00000004 CCS_NOPARENTALIGN = 0x00000008 CCS_ADJUSTABLE = 0x00000020 CCS_NODIVIDER = 0x00000040 CCS_VERT = 0x00000080 CCS_LEFT = (CCS_VERT | CCS_TOP) CCS_RIGHT = (CCS_VERT | CCS_BOTTOM) CCS_NOMOVEX = (CCS_VERT | CCS_NOMOVEY) WC_LISTVIEWA = "SysListView32" WC_LISTVIEW = WC_LISTVIEWA LVS_ICON = 0 LVS_REPORT = 1 LVS_SMALLICON = 2 LVS_LIST = 3 LVS_TYPEMASK = 3 LVS_SINGLESEL = 4 LVS_SHOWSELALWAYS = 8 LVS_SORTASCENDING = 16 LVS_SORTDESCENDING = 32 LVS_SHAREIMAGELISTS = 64 LVS_NOLABELWRAP = 128 LVS_AUTOARRANGE = 256 LVS_EDITLABELS = 512 LVS_OWNERDATA = 4096 LVS_NOSCROLL = 8192 LVS_TYPESTYLEMASK = 64512 LVS_ALIGNTOP = 0 LVS_ALIGNLEFT = 2048 LVS_ALIGNMASK = 3072 LVS_OWNERDRAWFIXED = 1024 LVS_NOCOLUMNHEADER = 16384 LVS_NOSORTHEADER = 32768 LVM_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT LVM_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT LVM_GETBKCOLOR = (LVM_FIRST + 0) LVM_SETBKCOLOR = (LVM_FIRST + 1) LVM_GETIMAGELIST = (LVM_FIRST + 2) LVSIL_NORMAL = 0 LVSIL_SMALL = 1 LVSIL_STATE = 2 LVM_SETIMAGELIST = (LVM_FIRST + 3) LVM_GETITEMCOUNT = (LVM_FIRST + 4) LVIF_TEXT = 1 LVIF_IMAGE = 2 LVIF_PARAM = 4 LVIF_STATE = 8 LVIF_INDENT = 16 LVIF_NORECOMPUTE = 2048 LVIS_FOCUSED = 1 LVIS_SELECTED = 2 LVIS_CUT = 4 LVIS_DROPHILITED = 8 LVIS_ACTIVATING = 32 LVIS_OVERLAYMASK = 3840 LVIS_STATEIMAGEMASK = 61440 I_INDENTCALLBACK = (-1) LPSTR_TEXTCALLBACKA = -1 LPSTR_TEXTCALLBACK = LPSTR_TEXTCALLBACKA I_IMAGECALLBACK = (-1) LVM_GETITEMA = (LVM_FIRST + 5) LVM_GETITEMW = (LVM_FIRST + 75) LVM_GETITEM = LVM_GETITEMW LVM_GETITEM = LVM_GETITEMA LVM_SETITEMA = (LVM_FIRST + 6) LVM_SETITEMW = (LVM_FIRST + 76) LVM_SETITEM = LVM_SETITEMW LVM_SETITEM = LVM_SETITEMA LVM_INSERTITEMA = (LVM_FIRST + 7) LVM_INSERTITEMW = (LVM_FIRST + 77) LVM_INSERTITEM = LVM_INSERTITEMA LVM_DELETEITEM = (LVM_FIRST + 8) LVM_DELETEALLITEMS = (LVM_FIRST + 9) LVM_GETCALLBACKMASK = (LVM_FIRST + 10) LVM_SETCALLBACKMASK = (LVM_FIRST + 11) LVNI_ALL = 0 LVNI_FOCUSED = 1 LVNI_SELECTED = 2 LVNI_CUT = 4 LVNI_DROPHILITED = 8 LVNI_ABOVE = 256 LVNI_BELOW = 512 LVNI_TOLEFT = 1024 LVNI_TORIGHT = 2048 LVM_GETNEXTITEM = (LVM_FIRST + 12) LVFI_PARAM = 1 LVFI_STRING = 2 LVFI_PARTIAL = 8 LVFI_WRAP = 32 LVFI_NEARESTXY = 64 LVM_FINDITEMA = (LVM_FIRST + 13) LVM_FINDITEMW = (LVM_FIRST + 83) LVM_FINDITEM = LVM_FINDITEMA LVIR_BOUNDS = 0 LVIR_ICON = 1 LVIR_LABEL = 2 LVIR_SELECTBOUNDS = 3 LVM_GETITEMRECT = (LVM_FIRST + 14) LVM_SETITEMPOSITION = (LVM_FIRST + 15) LVM_GETITEMPOSITION = (LVM_FIRST + 16) LVM_GETSTRINGWIDTHA = (LVM_FIRST + 17) LVM_GETSTRINGWIDTHW = (LVM_FIRST + 87) LVM_GETSTRINGWIDTH = LVM_GETSTRINGWIDTHA LVHT_NOWHERE = 1 LVHT_ONITEMICON = 2 LVHT_ONITEMLABEL = 4 LVHT_ONITEMSTATEICON = 8 LVHT_ONITEM = (LVHT_ONITEMICON | LVHT_ONITEMLABEL | LVHT_ONITEMSTATEICON) LVHT_ABOVE = 8 LVHT_BELOW = 16 LVHT_TORIGHT = 32 LVHT_TOLEFT = 64 LVM_HITTEST = (LVM_FIRST + 18) LVM_ENSUREVISIBLE = (LVM_FIRST + 19) LVM_SCROLL = (LVM_FIRST + 20) LVM_REDRAWITEMS = (LVM_FIRST + 21) LVA_DEFAULT = 0 LVA_ALIGNLEFT = 1 LVA_ALIGNTOP = 2 LVA_SNAPTOGRID = 5 LVM_ARRANGE = (LVM_FIRST + 22) LVM_EDITLABELA = (LVM_FIRST + 23) LVM_EDITLABELW = (LVM_FIRST + 118) LVM_EDITLABEL = LVM_EDITLABELW LVM_EDITLABEL = LVM_EDITLABELA LVM_GETEDITCONTROL = (LVM_FIRST + 24) LVCF_FMT = 1 LVCF_WIDTH = 2 LVCF_TEXT = 4 LVCF_SUBITEM = 8 LVCF_IMAGE = 16 LVCF_ORDER = 32 LVCFMT_LEFT = 0 LVCFMT_RIGHT = 1 LVCFMT_CENTER = 2 LVCFMT_JUSTIFYMASK = 3 LVCFMT_IMAGE = 2048 LVCFMT_BITMAP_ON_RIGHT = 4096 LVCFMT_COL_HAS_IMAGES = 32768 LVM_GETCOLUMNA = (LVM_FIRST + 25) LVM_GETCOLUMNW = (LVM_FIRST + 95) LVM_GETCOLUMN = LVM_GETCOLUMNA LVM_SETCOLUMNA = (LVM_FIRST + 26) LVM_SETCOLUMNW = (LVM_FIRST + 96) LVM_SETCOLUMN = LVM_SETCOLUMNA LVM_INSERTCOLUMNA = (LVM_FIRST + 27) LVM_INSERTCOLUMNW = (LVM_FIRST + 97) LVM_INSERTCOLUMN = LVM_INSERTCOLUMNA LVM_DELETECOLUMN = (LVM_FIRST + 28) LVM_GETCOLUMNWIDTH = (LVM_FIRST + 29) LVSCW_AUTOSIZE = -1 LVSCW_AUTOSIZE_USEHEADER = -2 LVM_SETCOLUMNWIDTH = (LVM_FIRST + 30) LVM_GETHEADER = (LVM_FIRST + 31) LVM_CREATEDRAGIMAGE = (LVM_FIRST + 33) LVM_GETVIEWRECT = (LVM_FIRST + 34) LVM_GETTEXTCOLOR = (LVM_FIRST + 35) LVM_SETTEXTCOLOR = (LVM_FIRST + 36) LVM_GETTEXTBKCOLOR = (LVM_FIRST + 37) LVM_SETTEXTBKCOLOR = (LVM_FIRST + 38) LVM_GETTOPINDEX = (LVM_FIRST + 39) LVM_GETCOUNTPERPAGE = (LVM_FIRST + 40) LVM_GETORIGIN = (LVM_FIRST + 41) LVM_UPDATE = (LVM_FIRST + 42) LVM_SETITEMSTATE = (LVM_FIRST + 43) LVM_GETITEMSTATE = (LVM_FIRST + 44) LVM_GETITEMTEXTA = (LVM_FIRST + 45) LVM_GETITEMTEXTW = (LVM_FIRST + 115) LVM_GETITEMTEXT = LVM_GETITEMTEXTW LVM_GETITEMTEXT = LVM_GETITEMTEXTA LVM_SETITEMTEXTA = (LVM_FIRST + 46) LVM_SETITEMTEXTW = (LVM_FIRST + 116) LVM_SETITEMTEXT = LVM_SETITEMTEXTW LVM_SETITEMTEXT = LVM_SETITEMTEXTA LVSICF_NOINVALIDATEALL = 1 LVSICF_NOSCROLL = 2 LVM_SETITEMCOUNT = (LVM_FIRST + 47) LVM_SORTITEMS = (LVM_FIRST + 48) LVM_SETITEMPOSITION32 = (LVM_FIRST + 49) LVM_GETSELECTEDCOUNT = (LVM_FIRST + 50) LVM_GETITEMSPACING = (LVM_FIRST + 51) LVM_GETISEARCHSTRINGA = (LVM_FIRST + 52) LVM_GETISEARCHSTRINGW = (LVM_FIRST + 117) LVM_GETISEARCHSTRING = LVM_GETISEARCHSTRINGA LVM_SETICONSPACING = (LVM_FIRST + 53) LVM_SETEXTENDEDLISTVIEWSTYLE = (LVM_FIRST + 54) # optional wParam == mask LVM_GETEXTENDEDLISTVIEWSTYLE = (LVM_FIRST + 55) LVS_EX_GRIDLINES = 1 LVS_EX_SUBITEMIMAGES = 2 LVS_EX_CHECKBOXES = 4 LVS_EX_TRACKSELECT = 8 LVS_EX_HEADERDRAGDROP = 16 LVS_EX_FULLROWSELECT = 32 # applies to report mode only LVS_EX_ONECLICKACTIVATE = 64 LVS_EX_TWOCLICKACTIVATE = 128 LVS_EX_FLATSB = 256 LVS_EX_REGIONAL = 512 LVS_EX_INFOTIP = 1024 # listview does InfoTips for you LVS_EX_UNDERLINEHOT = 2048 LVS_EX_UNDERLINECOLD = 4096 LVS_EX_MULTIWORKAREAS = 8192 LVM_GETSUBITEMRECT = (LVM_FIRST + 56) LVM_SUBITEMHITTEST = (LVM_FIRST + 57) LVM_SETCOLUMNORDERARRAY = (LVM_FIRST + 58) LVM_GETCOLUMNORDERARRAY = (LVM_FIRST + 59) LVM_SETHOTITEM = (LVM_FIRST + 60) LVM_GETHOTITEM = (LVM_FIRST + 61) LVM_SETHOTCURSOR = (LVM_FIRST + 62) LVM_GETHOTCURSOR = (LVM_FIRST + 63) LVM_APPROXIMATEVIEWRECT = (LVM_FIRST + 64) LV_MAX_WORKAREAS = 16 LVM_SETWORKAREAS = (LVM_FIRST + 65) LVM_GETWORKAREAS = (LVM_FIRST + 70) LVM_GETNUMBEROFWORKAREAS = (LVM_FIRST + 73) LVM_GETSELECTIONMARK = (LVM_FIRST + 66) LVM_SETSELECTIONMARK = (LVM_FIRST + 67) LVM_SETHOVERTIME = (LVM_FIRST + 71) LVM_GETHOVERTIME = (LVM_FIRST + 72) LVM_SETTOOLTIPS = (LVM_FIRST + 74) LVM_GETTOOLTIPS = (LVM_FIRST + 78) LVBKIF_SOURCE_NONE = 0 LVBKIF_SOURCE_HBITMAP = 1 LVBKIF_SOURCE_URL = 2 LVBKIF_SOURCE_MASK = 3 LVBKIF_STYLE_NORMAL = 0 LVBKIF_STYLE_TILE = 16 LVBKIF_STYLE_MASK = 16 LVM_SETBKIMAGEA = (LVM_FIRST + 68) LVM_SETBKIMAGEW = (LVM_FIRST + 138) LVM_GETBKIMAGEA = (LVM_FIRST + 69) LVM_GETBKIMAGEW = (LVM_FIRST + 139) LVKF_ALT = 1 LVKF_CONTROL = 2 LVKF_SHIFT = 4 LVN_ITEMCHANGING = (LVN_FIRST-0) LVN_ITEMCHANGED = (LVN_FIRST-1) LVN_INSERTITEM = (LVN_FIRST-2) LVN_DELETEITEM = (LVN_FIRST-3) LVN_DELETEALLITEMS = (LVN_FIRST-4) LVN_BEGINLABELEDITA = (LVN_FIRST-5) LVN_BEGINLABELEDITW = (LVN_FIRST-75) LVN_ENDLABELEDITA = (LVN_FIRST-6) LVN_ENDLABELEDITW = (LVN_FIRST-76) LVN_COLUMNCLICK = (LVN_FIRST-8) LVN_BEGINDRAG = (LVN_FIRST-9) LVN_BEGINRDRAG = (LVN_FIRST-11) LVN_ODCACHEHINT = (LVN_FIRST-13) LVN_ODFINDITEMA = (LVN_FIRST-52) LVN_ODFINDITEMW = (LVN_FIRST-79) LVN_ITEMACTIVATE = (LVN_FIRST-14) LVN_ODSTATECHANGED = (LVN_FIRST-15) LVN_ODFINDITEM = LVN_ODFINDITEMA LVN_HOTTRACK = (LVN_FIRST-21) LVN_GETDISPINFOA = (LVN_FIRST-50) LVN_GETDISPINFOW = (LVN_FIRST-77) LVN_SETDISPINFOA = (LVN_FIRST-51) LVN_SETDISPINFOW = (LVN_FIRST-78) LVN_BEGINLABELEDIT = LVN_BEGINLABELEDITA LVN_ENDLABELEDIT = LVN_ENDLABELEDITA LVN_GETDISPINFO = LVN_GETDISPINFOA LVN_SETDISPINFO = LVN_SETDISPINFOA LVIF_DI_SETITEM = 4096 LVN_KEYDOWN = (LVN_FIRST-55) LVN_MARQUEEBEGIN = (LVN_FIRST-56) LVGIT_UNFOLDED = 1 LVN_GETINFOTIPA = (LVN_FIRST-57) LVN_GETINFOTIPW = (LVN_FIRST-58) LVN_GETINFOTIP = LVN_GETINFOTIPA WC_TREEVIEWA = "SysTreeView32" WC_TREEVIEW = WC_TREEVIEWA TVS_HASBUTTONS = 1 TVS_HASLINES = 2 TVS_LINESATROOT = 4 TVS_EDITLABELS = 8 TVS_DISABLEDRAGDROP = 16 TVS_SHOWSELALWAYS = 32 TVS_RTLREADING = 64 TVS_NOTOOLTIPS = 128 TVS_CHECKBOXES = 256 TVS_TRACKSELECT = 512 TVS_SINGLEEXPAND = 1024 TVS_INFOTIP = 2048 TVS_FULLROWSELECT = 4096 TVS_NOSCROLL = 8192 TVS_NONEVENHEIGHT = 16384 TVIF_TEXT = 1 TVIF_IMAGE = 2 TVIF_PARAM = 4 TVIF_STATE = 8 TVIF_HANDLE = 16 TVIF_SELECTEDIMAGE = 32 TVIF_CHILDREN = 64 TVIF_INTEGRAL = 128 TVIS_SELECTED = 2 TVIS_CUT = 4 TVIS_DROPHILITED = 8 TVIS_BOLD = 16 TVIS_EXPANDED = 32 TVIS_EXPANDEDONCE = 64 TVIS_EXPANDPARTIAL = 128 TVIS_OVERLAYMASK = 3840 TVIS_STATEIMAGEMASK = 61440 TVIS_USERMASK = 61440 I_CHILDRENCALLBACK = (-1) TVI_ROOT = -65536 TVI_FIRST = -65535 TVI_LAST = -65534 TVI_SORT = -65533 TVM_INSERTITEMA = (TV_FIRST + 0) TVM_INSERTITEMW = (TV_FIRST + 50) TVM_INSERTITEM = TVM_INSERTITEMW TVM_INSERTITEM = TVM_INSERTITEMA TVM_DELETEITEM = (TV_FIRST + 1) TVM_EXPAND = (TV_FIRST + 2) TVE_COLLAPSE = 1 TVE_EXPAND = 2 TVE_TOGGLE = 3 TVE_EXPANDPARTIAL = 16384 TVE_COLLAPSERESET = 32768 TVM_GETITEMRECT = (TV_FIRST + 4) TVM_GETCOUNT = (TV_FIRST + 5) TVM_GETINDENT = (TV_FIRST + 6) TVM_SETINDENT = (TV_FIRST + 7) TVM_GETIMAGELIST = (TV_FIRST + 8) TVSIL_NORMAL = 0 TVSIL_STATE = 2 TVM_SETIMAGELIST = (TV_FIRST + 9) TVM_GETNEXTITEM = (TV_FIRST + 10) TVGN_ROOT = 0 TVGN_NEXT = 1 TVGN_PREVIOUS = 2 TVGN_PARENT = 3 TVGN_CHILD = 4 TVGN_FIRSTVISIBLE = 5 TVGN_NEXTVISIBLE = 6 TVGN_PREVIOUSVISIBLE = 7 TVGN_DROPHILITE = 8 TVGN_CARET = 9 TVGN_LASTVISIBLE = 10 TVM_SELECTITEM = (TV_FIRST + 11) TVM_GETITEMA = (TV_FIRST + 12) TVM_GETITEMW = (TV_FIRST + 62) TVM_GETITEM = TVM_GETITEMW TVM_GETITEM = TVM_GETITEMA TVM_SETITEMA = (TV_FIRST + 13) TVM_SETITEMW = (TV_FIRST + 63) TVM_SETITEM = TVM_SETITEMW TVM_SETITEM = TVM_SETITEMA TVM_EDITLABELA = (TV_FIRST + 14) TVM_EDITLABELW = (TV_FIRST + 65) TVM_EDITLABEL = TVM_EDITLABELW TVM_EDITLABEL = TVM_EDITLABELA TVM_GETEDITCONTROL = (TV_FIRST + 15) TVM_GETVISIBLECOUNT = (TV_FIRST + 16) TVM_HITTEST = (TV_FIRST + 17) TVHT_NOWHERE = 1 TVHT_ONITEMICON = 2 TVHT_ONITEMLABEL = 4 TVHT_ONITEMINDENT = 8 TVHT_ONITEMBUTTON = 16 TVHT_ONITEMRIGHT = 32 TVHT_ONITEMSTATEICON = 64 TVHT_ABOVE = 256 TVHT_BELOW = 512 TVHT_TORIGHT = 1024 TVHT_TOLEFT = 2048 TVHT_ONITEM = (TVHT_ONITEMICON | TVHT_ONITEMLABEL | TVHT_ONITEMSTATEICON) TVM_CREATEDRAGIMAGE = (TV_FIRST + 18) TVM_SORTCHILDREN = (TV_FIRST + 19) TVM_ENSUREVISIBLE = (TV_FIRST + 20) TVM_SORTCHILDRENCB = (TV_FIRST + 21) TVM_ENDEDITLABELNOW = (TV_FIRST + 22) TVM_GETISEARCHSTRINGA = (TV_FIRST + 23) TVM_GETISEARCHSTRINGW = (TV_FIRST + 64) TVM_GETISEARCHSTRING = TVM_GETISEARCHSTRINGA TVM_SETTOOLTIPS = (TV_FIRST + 24) TVM_GETTOOLTIPS = (TV_FIRST + 25) TVM_SETINSERTMARK = (TV_FIRST + 26) TVM_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT TVM_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT TVM_SETITEMHEIGHT = (TV_FIRST + 27) TVM_GETITEMHEIGHT = (TV_FIRST + 28) TVM_SETBKCOLOR = (TV_FIRST + 29) TVM_SETTEXTCOLOR = (TV_FIRST + 30) TVM_GETBKCOLOR = (TV_FIRST + 31) TVM_GETTEXTCOLOR = (TV_FIRST + 32) TVM_SETSCROLLTIME = (TV_FIRST + 33) TVM_GETSCROLLTIME = (TV_FIRST + 34) TVM_SETINSERTMARKCOLOR = (TV_FIRST + 37) TVM_GETINSERTMARKCOLOR = (TV_FIRST + 38) TVN_SELCHANGINGA = (TVN_FIRST-1) TVN_SELCHANGINGW = (TVN_FIRST-50) TVN_SELCHANGEDA = (TVN_FIRST-2) TVN_SELCHANGEDW = (TVN_FIRST-51) TVC_UNKNOWN = 0 TVC_BYMOUSE = 1 TVC_BYKEYBOARD = 2 TVN_GETDISPINFOA = (TVN_FIRST-3) TVN_GETDISPINFOW = (TVN_FIRST-52) TVN_SETDISPINFOA = (TVN_FIRST-4) TVN_SETDISPINFOW = (TVN_FIRST-53) TVIF_DI_SETITEM = 4096 TVN_ITEMEXPANDINGA = (TVN_FIRST-5) TVN_ITEMEXPANDINGW = (TVN_FIRST-54) TVN_ITEMEXPANDEDA = (TVN_FIRST-6) TVN_ITEMEXPANDEDW = (TVN_FIRST-55) TVN_BEGINDRAGA = (TVN_FIRST-7) TVN_BEGINDRAGW = (TVN_FIRST-56) TVN_BEGINRDRAGA = (TVN_FIRST-8) TVN_BEGINRDRAGW = (TVN_FIRST-57) TVN_DELETEITEMA = (TVN_FIRST-9) TVN_DELETEITEMW = (TVN_FIRST-58) TVN_BEGINLABELEDITA = (TVN_FIRST-10) TVN_BEGINLABELEDITW = (TVN_FIRST-59) TVN_ENDLABELEDITA = (TVN_FIRST-11) TVN_ENDLABELEDITW = (TVN_FIRST-60) TVN_KEYDOWN = (TVN_FIRST-12) TVN_GETINFOTIPA = (TVN_FIRST-13) TVN_GETINFOTIPW = (TVN_FIRST-14) TVN_SINGLEEXPAND = (TVN_FIRST-15) TVN_SELCHANGING = TVN_SELCHANGINGA TVN_SELCHANGED = TVN_SELCHANGEDA TVN_GETDISPINFO = TVN_GETDISPINFOA TVN_SETDISPINFO = TVN_SETDISPINFOA TVN_ITEMEXPANDING = TVN_ITEMEXPANDINGA TVN_ITEMEXPANDED = TVN_ITEMEXPANDEDA TVN_BEGINDRAG = TVN_BEGINDRAGA TVN_BEGINRDRAG = TVN_BEGINRDRAGA TVN_DELETEITEM = TVN_DELETEITEMA TVN_BEGINLABELEDIT = TVN_BEGINLABELEDITA TVN_ENDLABELEDIT = TVN_ENDLABELEDITA TVN_GETINFOTIP = TVN_GETINFOTIPA TVCDRF_NOIMAGES = 65536 WC_COMBOBOXEXA = "ComboBoxEx32" WC_COMBOBOXEX = WC_COMBOBOXEXA CBEIF_TEXT = 1 CBEIF_IMAGE = 2 CBEIF_SELECTEDIMAGE = 4 CBEIF_OVERLAY = 8 CBEIF_INDENT = 16 CBEIF_LPARAM = 32 CBEIF_DI_SETITEM = 268435456 CBEM_INSERTITEMA = (WM_USER + 1) CBEM_SETIMAGELIST = (WM_USER + 2) CBEM_GETIMAGELIST = (WM_USER + 3) CBEM_GETITEMA = (WM_USER + 4) CBEM_SETITEMA = (WM_USER + 5) #CBEM_DELETEITEM = CB_DELETESTRING CBEM_GETCOMBOCONTROL = (WM_USER + 6) CBEM_GETEDITCONTROL = (WM_USER + 7) CBEM_SETEXSTYLE = (WM_USER + 8) # use SETEXTENDEDSTYLE instead CBEM_SETEXTENDEDSTYLE = (WM_USER + 14) # lparam == new style, wParam (optional) == mask CBEM_GETEXSTYLE = (WM_USER + 9) # use GETEXTENDEDSTYLE instead CBEM_GETEXTENDEDSTYLE = (WM_USER + 9) CBEM_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT CBEM_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT CBEM_SETEXSTYLE = (WM_USER + 8) CBEM_GETEXSTYLE = (WM_USER + 9) CBEM_HASEDITCHANGED = (WM_USER + 10) CBEM_INSERTITEMW = (WM_USER + 11) CBEM_SETITEMW = (WM_USER + 12) CBEM_GETITEMW = (WM_USER + 13) CBEM_INSERTITEM = CBEM_INSERTITEMA CBEM_SETITEM = CBEM_SETITEMA CBEM_GETITEM = CBEM_GETITEMA CBES_EX_NOEDITIMAGE = 1 CBES_EX_NOEDITIMAGEINDENT = 2 CBES_EX_PATHWORDBREAKPROC = 4 CBES_EX_NOSIZELIMIT = 8 CBES_EX_CASESENSITIVE = 16 CBEN_GETDISPINFO = (CBEN_FIRST - 0) CBEN_GETDISPINFOA = (CBEN_FIRST - 0) CBEN_INSERTITEM = (CBEN_FIRST - 1) CBEN_DELETEITEM = (CBEN_FIRST - 2) CBEN_BEGINEDIT = (CBEN_FIRST - 4) CBEN_ENDEDITA = (CBEN_FIRST - 5) CBEN_ENDEDITW = (CBEN_FIRST - 6) CBEN_GETDISPINFOW = (CBEN_FIRST - 7) CBEN_DRAGBEGINA = (CBEN_FIRST - 8) CBEN_DRAGBEGINW = (CBEN_FIRST - 9) CBEN_DRAGBEGIN = CBEN_DRAGBEGINA CBEN_ENDEDIT = CBEN_ENDEDITA CBENF_KILLFOCUS = 1 CBENF_RETURN = 2 CBENF_ESCAPE = 3 CBENF_DROPDOWN = 4 CBEMAXSTRLEN = 260 WC_TABCONTROLA = "SysTabControl32" WC_TABCONTROL = WC_TABCONTROLA TCS_SCROLLOPPOSITE = 1 # assumes multiline tab TCS_BOTTOM = 2 TCS_RIGHT = 2 TCS_MULTISELECT = 4 # allow multi-select in button mode TCS_FLATBUTTONS = 8 TCS_FORCEICONLEFT = 16 TCS_FORCELABELLEFT = 32 TCS_HOTTRACK = 64 TCS_VERTICAL = 128 TCS_TABS = 0 TCS_BUTTONS = 256 TCS_SINGLELINE = 0 TCS_MULTILINE = 512 TCS_RIGHTJUSTIFY = 0 TCS_FIXEDWIDTH = 1024 TCS_RAGGEDRIGHT = 2048 TCS_FOCUSONBUTTONDOWN = 4096 TCS_OWNERDRAWFIXED = 8192 TCS_TOOLTIPS = 16384 TCS_FOCUSNEVER = 32768 TCS_EX_FLATSEPARATORS = 1 TCS_EX_REGISTERDROP = 2 TCM_GETIMAGELIST = (TCM_FIRST + 2) TCM_SETIMAGELIST = (TCM_FIRST + 3) TCM_GETITEMCOUNT = (TCM_FIRST + 4) TCIF_TEXT = 1 TCIF_IMAGE = 2 TCIF_RTLREADING = 4 TCIF_PARAM = 8 TCIF_STATE = 16 TCIS_BUTTONPRESSED = 1 TCIS_HIGHLIGHTED = 2 TCM_GETITEMA = (TCM_FIRST + 5) TCM_GETITEMW = (TCM_FIRST + 60) TCM_GETITEM = TCM_GETITEMA TCM_SETITEMA = (TCM_FIRST + 6) TCM_SETITEMW = (TCM_FIRST + 61) TCM_SETITEM = TCM_SETITEMA TCM_INSERTITEMA = (TCM_FIRST + 7) TCM_INSERTITEMW = (TCM_FIRST + 62) TCM_INSERTITEM = TCM_INSERTITEMA TCM_DELETEITEM = (TCM_FIRST + 8) TCM_DELETEALLITEMS = (TCM_FIRST + 9) TCM_GETITEMRECT = (TCM_FIRST + 10) TCM_GETCURSEL = (TCM_FIRST + 11) TCM_SETCURSEL = (TCM_FIRST + 12) TCHT_NOWHERE = 1 TCHT_ONITEMICON = 2 TCHT_ONITEMLABEL = 4 TCHT_ONITEM = (TCHT_ONITEMICON | TCHT_ONITEMLABEL) TCM_HITTEST = (TCM_FIRST + 13) TCM_SETITEMEXTRA = (TCM_FIRST + 14) TCM_ADJUSTRECT = (TCM_FIRST + 40) TCM_SETITEMSIZE = (TCM_FIRST + 41) TCM_REMOVEIMAGE = (TCM_FIRST + 42) TCM_SETPADDING = (TCM_FIRST + 43) TCM_GETROWCOUNT = (TCM_FIRST + 44) TCM_GETTOOLTIPS = (TCM_FIRST + 45) TCM_SETTOOLTIPS = (TCM_FIRST + 46) TCM_GETCURFOCUS = (TCM_FIRST + 47) TCM_SETCURFOCUS = (TCM_FIRST + 48) TCM_SETMINTABWIDTH = (TCM_FIRST + 49) TCM_DESELECTALL = (TCM_FIRST + 50) TCM_HIGHLIGHTITEM = (TCM_FIRST + 51) TCM_SETEXTENDEDSTYLE = (TCM_FIRST + 52) # optional wParam == mask TCM_GETEXTENDEDSTYLE = (TCM_FIRST + 53) TCM_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT TCM_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT TCN_KEYDOWN = (TCN_FIRST - 0) ANIMATE_CLASSA = "SysAnimate32" ANIMATE_CLASS = ANIMATE_CLASSA ACS_CENTER = 1 ACS_TRANSPARENT = 2 ACS_AUTOPLAY = 4 ACS_TIMER = 8 # don't use threads... use timers ACM_OPENA = (WM_USER+100) ACM_OPENW = (WM_USER+103) ACM_OPEN = ACM_OPENW ACM_OPEN = ACM_OPENA ACM_PLAY = (WM_USER+101) ACM_STOP = (WM_USER+102) ACN_START = 1 ACN_STOP = 2 MONTHCAL_CLASSA = "SysMonthCal32" MONTHCAL_CLASS = MONTHCAL_CLASSA MCM_FIRST = 4096 MCM_GETCURSEL = (MCM_FIRST + 1) MCM_SETCURSEL = (MCM_FIRST + 2) MCM_GETMAXSELCOUNT = (MCM_FIRST + 3) MCM_SETMAXSELCOUNT = (MCM_FIRST + 4) MCM_GETSELRANGE = (MCM_FIRST + 5) MCM_SETSELRANGE = (MCM_FIRST + 6) MCM_GETMONTHRANGE = (MCM_FIRST + 7) MCM_SETDAYSTATE = (MCM_FIRST + 8) MCM_GETMINREQRECT = (MCM_FIRST + 9) MCM_SETCOLOR = (MCM_FIRST + 10) MCM_GETCOLOR = (MCM_FIRST + 11) MCSC_BACKGROUND = 0 # the background color (between months) MCSC_TEXT = 1 # the dates MCSC_TITLEBK = 2 # background of the title MCSC_TITLETEXT = 3 MCSC_MONTHBK = 4 # background within the month cal MCSC_TRAILINGTEXT = 5 # the text color of header & trailing days MCM_SETTODAY = (MCM_FIRST + 12) MCM_GETTODAY = (MCM_FIRST + 13) MCM_HITTEST = (MCM_FIRST + 14) MCHT_TITLE = 65536 MCHT_CALENDAR = 131072 MCHT_TODAYLINK = 196608 MCHT_NEXT = 16777216 # these indicate that hitting MCHT_PREV = 33554432 # here will go to the next/prev month MCHT_NOWHERE = 0 MCHT_TITLEBK = (MCHT_TITLE) MCHT_TITLEMONTH = (MCHT_TITLE | 1) MCHT_TITLEYEAR = (MCHT_TITLE | 2) MCHT_TITLEBTNNEXT = (MCHT_TITLE | MCHT_NEXT | 3) MCHT_TITLEBTNPREV = (MCHT_TITLE | MCHT_PREV | 3) MCHT_CALENDARBK = (MCHT_CALENDAR) MCHT_CALENDARDATE = (MCHT_CALENDAR | 1) MCHT_CALENDARDATENEXT = (MCHT_CALENDARDATE | MCHT_NEXT) MCHT_CALENDARDATEPREV = (MCHT_CALENDARDATE | MCHT_PREV) MCHT_CALENDARDAY = (MCHT_CALENDAR | 2) MCHT_CALENDARWEEKNUM = (MCHT_CALENDAR | 3) MCM_SETFIRSTDAYOFWEEK = (MCM_FIRST + 15) MCM_GETFIRSTDAYOFWEEK = (MCM_FIRST + 16) MCM_GETRANGE = (MCM_FIRST + 17) MCM_SETRANGE = (MCM_FIRST + 18) MCM_GETMONTHDELTA = (MCM_FIRST + 19) MCM_SETMONTHDELTA = (MCM_FIRST + 20) MCM_GETMAXTODAYWIDTH = (MCM_FIRST + 21) MCM_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT MCM_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT MCN_SELCHANGE = (MCN_FIRST + 1) MCN_GETDAYSTATE = (MCN_FIRST + 3) MCN_SELECT = (MCN_FIRST + 4) MCS_DAYSTATE = 1 MCS_MULTISELECT = 2 MCS_WEEKNUMBERS = 4 MCS_NOTODAYCIRCLE = 8 MCS_NOTODAY = 16 MCS_NOTODAY = 8 GMR_VISIBLE = 0 # visible portion of display GMR_DAYSTATE = 1 # above plus the grayed out parts of DATETIMEPICK_CLASSA = "SysDateTimePick32" DATETIMEPICK_CLASS = DATETIMEPICK_CLASSA DTM_FIRST = 4096 DTM_GETSYSTEMTIME = (DTM_FIRST + 1) DTM_SETSYSTEMTIME = (DTM_FIRST + 2) DTM_GETRANGE = (DTM_FIRST + 3) DTM_SETRANGE = (DTM_FIRST + 4) DTM_SETFORMATA = (DTM_FIRST + 5) DTM_SETFORMATW = (DTM_FIRST + 50) DTM_SETFORMAT = DTM_SETFORMATW DTM_SETFORMAT = DTM_SETFORMATA DTM_SETMCCOLOR = (DTM_FIRST + 6) DTM_GETMCCOLOR = (DTM_FIRST + 7) DTM_GETMONTHCAL = (DTM_FIRST + 8) DTM_SETMCFONT = (DTM_FIRST + 9) DTM_GETMCFONT = (DTM_FIRST + 10) DTS_UPDOWN = 1 # use UPDOWN instead of MONTHCAL DTS_SHOWNONE = 2 # allow a NONE selection DTS_SHORTDATEFORMAT = 0 # use the short date format (app must forward WM_WININICHANGE messages) DTS_LONGDATEFORMAT = 4 # use the long date format (app must forward WM_WININICHANGE messages) DTS_TIMEFORMAT = 9 # use the time format (app must forward WM_WININICHANGE messages) DTS_APPCANPARSE = 16 # allow user entered strings (app MUST respond to DTN_USERSTRING) DTS_RIGHTALIGN = 32 # right-align popup instead of left-align it DTN_DATETIMECHANGE = (DTN_FIRST + 1) # the systemtime has changed DTN_USERSTRINGA = (DTN_FIRST + 2) # the user has entered a string DTN_USERSTRINGW = (DTN_FIRST + 15) DTN_USERSTRING = DTN_USERSTRINGW DTN_WMKEYDOWNA = (DTN_FIRST + 3) # modify keydown on app format field (X) DTN_WMKEYDOWNW = (DTN_FIRST + 16) DTN_WMKEYDOWN = DTN_WMKEYDOWNA DTN_FORMATA = (DTN_FIRST + 4) # query display for app format field (X) DTN_FORMATW = (DTN_FIRST + 17) DTN_FORMAT = DTN_FORMATA DTN_FORMATQUERYA = (DTN_FIRST + 5) # query formatting info for app format field (X) DTN_FORMATQUERYW = (DTN_FIRST + 18) DTN_FORMATQUERY = DTN_FORMATQUERYA DTN_DROPDOWN = (DTN_FIRST + 6) # MonthCal has dropped down DTN_CLOSEUP = (DTN_FIRST + 7) # MonthCal is popping up GDTR_MIN = 1 GDTR_MAX = 2 GDT_ERROR = -1 GDT_VALID = 0 GDT_NONE = 1 IPM_CLEARADDRESS = (WM_USER+100) # no parameters IPM_SETADDRESS = (WM_USER+101) # lparam = TCP/IP address IPM_GETADDRESS = (WM_USER+102) # lresult = # of non black fields. lparam = LPDWORD for TCP/IP address IPM_SETRANGE = (WM_USER+103) # wparam = field, lparam = range IPM_SETFOCUS = (WM_USER+104) # wparam = field IPM_ISBLANK = (WM_USER+105) # no parameters WC_IPADDRESSA = "SysIPAddress32" WC_IPADDRESS = WC_IPADDRESSA IPN_FIELDCHANGED = (IPN_FIRST - 0) WC_PAGESCROLLERA = "SysPager" WC_PAGESCROLLER = WC_PAGESCROLLERA PGS_VERT = 0 PGS_HORZ = 1 PGS_AUTOSCROLL = 2 PGS_DRAGNDROP = 4 PGF_INVISIBLE = 0 # Scroll button is not visible PGF_NORMAL = 1 # Scroll button is in normal state PGF_GRAYED = 2 # Scroll button is in grayed state PGF_DEPRESSED = 4 # Scroll button is in depressed state PGF_HOT = 8 # Scroll button is in hot state PGB_TOPORLEFT = 0 PGB_BOTTOMORRIGHT = 1 PGM_SETCHILD = (PGM_FIRST + 1) # lParam == hwnd PGM_RECALCSIZE = (PGM_FIRST + 2) PGM_FORWARDMOUSE = (PGM_FIRST + 3) PGM_SETBKCOLOR = (PGM_FIRST + 4) PGM_GETBKCOLOR = (PGM_FIRST + 5) PGM_SETBORDER = (PGM_FIRST + 6) PGM_GETBORDER = (PGM_FIRST + 7) PGM_SETPOS = (PGM_FIRST + 8) PGM_GETPOS = (PGM_FIRST + 9) PGM_SETBUTTONSIZE = (PGM_FIRST + 10) PGM_GETBUTTONSIZE = (PGM_FIRST + 11) PGM_GETBUTTONSTATE = (PGM_FIRST + 12) PGM_GETDROPTARGET = CCM_GETDROPTARGET PGN_SCROLL = (PGN_FIRST-1) PGF_SCROLLUP = 1 PGF_SCROLLDOWN = 2 PGF_SCROLLLEFT = 4 PGF_SCROLLRIGHT = 8 PGK_SHIFT = 1 PGK_CONTROL = 2 PGK_MENU = 4 PGN_CALCSIZE = (PGN_FIRST-2) PGF_CALCWIDTH = 1 PGF_CALCHEIGHT = 2 WC_NATIVEFONTCTLA = "NativeFontCtl" WC_NATIVEFONTCTL = WC_NATIVEFONTCTLA NFS_EDIT = 1 NFS_STATIC = 2 NFS_LISTCOMBO = 4 NFS_BUTTON = 8 NFS_ALL = 16 WM_MOUSEHOVER = 673 WM_MOUSELEAVE = 675 TME_HOVER = 1 TME_LEAVE = 2 TME_QUERY = 1073741824 TME_CANCEL = -2147483648 HOVER_DEFAULT = -1 WSB_PROP_CYVSCROLL = 0x00000001 WSB_PROP_CXHSCROLL = 0x00000002 WSB_PROP_CYHSCROLL = 0x00000004 WSB_PROP_CXVSCROLL = 0x00000008 WSB_PROP_CXHTHUMB = 0x00000010 WSB_PROP_CYVTHUMB = 0x00000020 WSB_PROP_VBKGCOLOR = 0x00000040 WSB_PROP_HBKGCOLOR = 0x00000080 WSB_PROP_VSTYLE = 0x00000100 WSB_PROP_HSTYLE = 0x00000200 WSB_PROP_WINSTYLE = 0x00000400 WSB_PROP_PALETTE = 0x00000800 WSB_PROP_MASK = 0x00000FFF FSB_FLAT_MODE = 2 FSB_ENCARTA_MODE = 1 FSB_REGULAR_MODE = 0 def INDEXTOOVERLAYMASK(i): return i << 8 def INDEXTOSTATEIMAGEMASK(i): return i << 12 PK ѳPy y win32/lib/regcheck.pyUT l_Zx`ux # This module is very old and useless in this day and age! It will be # removed in a few years (ie, 2009 or so...) import warnings warnings.warn("The regcheck module has been pending deprecation since build 210", category=PendingDeprecationWarning) import win32con import regutil import win32api import os import sys def CheckRegisteredExe(exename): try: os.stat(win32api.RegQueryValue(regutil.GetRootKey() , regutil.GetAppPathsKey() + "\\" + exename)) # except SystemError: except (os.error,win32api.error): print("Registration of %s - Not registered correctly" % exename) def CheckPathString(pathString): for path in pathString.split(";"): if not os.path.isdir(path): return "'%s' is not a valid directory!" % path return None def CheckPythonPaths(verbose): if verbose: print("Python Paths:") # Check the core path if verbose: print("\tCore Path:", end=' ') try: appPath = win32api.RegQueryValue(regutil.GetRootKey(), regutil.BuildDefaultPythonKey() + "\\PythonPath") except win32api.error as exc: print("** does not exist - ", exc.strerror) problem = CheckPathString(appPath) if problem: print(problem) else: if verbose: print(appPath) key = win32api.RegOpenKey(regutil.GetRootKey(), regutil.BuildDefaultPythonKey() + "\\PythonPath", 0, win32con.KEY_READ) try: keyNo = 0 while 1: try: appName = win32api.RegEnumKey(key, keyNo) appPath = win32api.RegQueryValue(key, appName) if verbose: print("\t"+appName+":", end=' ') if appPath: problem = CheckPathString(appPath) if problem: print(problem) else: if verbose: print(appPath) else: if verbose: print("(empty)") keyNo = keyNo + 1 except win32api.error: break finally: win32api.RegCloseKey(key) def CheckHelpFiles(verbose): if verbose: print("Help Files:") try: key = win32api.RegOpenKey(regutil.GetRootKey(), regutil.BuildDefaultPythonKey() + "\\Help", 0, win32con.KEY_READ) except win32api.error as exc: import winerror if exc.winerror!=winerror.ERROR_FILE_NOT_FOUND: raise return try: keyNo = 0 while 1: try: helpDesc = win32api.RegEnumKey(key, keyNo) helpFile = win32api.RegQueryValue(key, helpDesc) if verbose: print("\t"+helpDesc+":", end=' ') # query the os section. try: os.stat(helpFile ) if verbose: print(helpFile) except os.error: print("** Help file %s does not exist" % helpFile) keyNo = keyNo + 1 except win32api.error as exc: import winerror if exc.winerror!=winerror.ERROR_NO_MORE_ITEMS: raise break finally: win32api.RegCloseKey(key) def CheckRegisteredModules(verbose): # Check out all registered modules. k=regutil.BuildDefaultPythonKey() + "\\Modules" try: keyhandle = win32api.RegOpenKey(regutil.GetRootKey(), k) print("WARNING: 'Modules' registry entry is deprectated and evil!") except win32api.error as exc: import winerror if exc.winerror!=winerror.ERROR_FILE_NOT_FOUND: raise return def CheckRegistry(verbose=0): # check the registered modules if verbose and 'pythonpath' in os.environ: print("Warning - PythonPath in environment - please check it!") # Check out all paths on sys.path CheckPythonPaths(verbose) CheckHelpFiles(verbose) CheckRegisteredModules(verbose) CheckRegisteredExe("Python.exe") if __name__=='__main__': if len(sys.argv)>1 and sys.argv[1]=='-q': verbose = 0 else: verbose = 1 CheckRegistry(verbose) PK P5ggwin32/lib/pywin32_bootstrap.pyUT ^Zx`ux # Imported by pywin32.pth to bootstrap the pywin32 environment in "portable" # environments or any other case where the post-install script isn't run. # # In short, there's a directory installed by pywin32 named 'pywin32_system32' # with some important DLLs which need to be found by Python when some pywin32 # modules are imported. # If Python has `os.add_dll_directory()`, we need to call it with this path. # Otherwise, we add this path to PATH. import os import site # The directory should be installed under site-packages. dirname = os.path.dirname # This is to get the "...\Lib\site-packages" directory # out of this file name: "...\Lib\site-packages\win32\Lib\pywin32_bootstrap.py". # It needs to be searched when installed in virtual environments. level3_up_dir = dirname(dirname(dirname(__file__))) site_packages_dirs = getattr(site, "getsitepackages", lambda: [])() if level3_up_dir not in site_packages_dirs: site_packages_dirs.insert(0, level3_up_dir) for site_packages_dir in site_packages_dirs: pywin32_system32 = os.path.join(site_packages_dir, "pywin32_system32") if os.path.isdir(pywin32_system32): if hasattr(os, "add_dll_directory"): os.add_dll_directory(pywin32_system32) # This is to ensure the pywin32 path is in the beginning to find the # pywin32 DLLs first and prevent other PATH entries to shadow them elif not os.environ["PATH"].startswith(pywin32_system32): os.environ["PATH"] = os.environ["PATH"].replace(os.pathsep + pywin32_system32, "") os.environ["PATH"] = pywin32_system32 + os.pathsep + os.environ["PATH"] break PK ѳPaG#win32/lib/rasutil.pyUT l_Zx`ux import win32ras stateStrings = { win32ras.RASCS_OpenPort : "OpenPort", win32ras.RASCS_PortOpened : "PortOpened", win32ras.RASCS_ConnectDevice : "ConnectDevice", win32ras.RASCS_DeviceConnected : "DeviceConnected", win32ras.RASCS_AllDevicesConnected : "AllDevicesConnected", win32ras.RASCS_Authenticate : "Authenticate", win32ras.RASCS_AuthNotify : "AuthNotify", win32ras.RASCS_AuthRetry : "AuthRetry", win32ras.RASCS_AuthCallback : "AuthCallback", win32ras.RASCS_AuthChangePassword : "AuthChangePassword", win32ras.RASCS_AuthProject : "AuthProject", win32ras.RASCS_AuthLinkSpeed : "AuthLinkSpeed", win32ras.RASCS_AuthAck : "AuthAck", win32ras.RASCS_ReAuthenticate : "ReAuthenticate", win32ras.RASCS_Authenticated : "Authenticated", win32ras.RASCS_PrepareForCallback : "PrepareForCallback", win32ras.RASCS_WaitForModemReset : "WaitForModemReset", win32ras.RASCS_WaitForCallback : "WaitForCallback", win32ras.RASCS_Projected : "Projected", win32ras.RASCS_StartAuthentication : "StartAuthentication", win32ras.RASCS_CallbackComplete : "CallbackComplete", win32ras.RASCS_LogonNetwork : "LogonNetwork", win32ras.RASCS_Interactive : "Interactive", win32ras.RASCS_RetryAuthentication : "RetryAuthentication", win32ras.RASCS_CallbackSetByCaller : "CallbackSetByCaller", win32ras.RASCS_PasswordExpired : "PasswordExpired", win32ras.RASCS_Connected : "Connected", win32ras.RASCS_Disconnected : "Disconnected" } def TestCallback( hras, msg, state, error, exterror): print("Callback called with ", hras, msg, stateStrings[state], error, exterror) def test(rasName = "_ Divert Off"): return win32ras.Dial(None, None, (rasName,),TestCallback)PK $$nQ66win32/timer.pydUT ^_ux MZ@ !L!This program cannot be run in DOS mode. $C5[[[[tVYtu ju6 @3@_ Ê]uYj h6@3OH@tEe=@tj%%@EjuYY3ɄutYj h7} u9=@3et t]1]SWuuSWuuSWuduu"uSPuLSVuSVu`tuHSWuout5SWu:$MQ0huu uËe3uEUV5$3u3@uu u^^] U]U} uuu u ] Ux@3E]Ux@j Y+ȋE3x@]UEM ] P YUEVH<AQAk(;tM ;J r BB ;r (;u3^]ËUEu2]ùMZf9uH<ȁ9PEu f9A]du2dV@P;t3u2^ð^UtAP Yt2 jY u2 u  Uu} uuMPuUuu YY]t h@ Y  j Y U}u@r u2]e u jc Y]U Vutu|At*u&h@ Yt2Wh@ YDx@uW@j Y+ȃ3x@EEE@EEuE_^]jVjh 7eMZf9u]<PEuL f9u>E+PQgYYt'x$|!EE3Ɂ8ËeE2cU0t}u 3@]U=@t} uu u YY]Ux@3@uȃu h@ YY#E]Ux@3@ȃu] uh@a YY]UuYH]Ueex@VWN@;t t Уt@fEP0E3EE01E401EEP0ME3M3M3;uO@u G ȉ x@щ t@_^]U} u=$3u u003@] h@,0h@>Yø@ø@HHHHøCU$SVjtM)3hVP5@ |xffftfpflfhEEDž@jPEVPUE E@EE(0VXۍEEۉE 0EP$0u !@^[]UDjDEjP EP0EtEj X]3j0ȅu2øMZf9uA<8PEu f9HuۃxtvՃh 0UE8csmu%xu@= t=!t="t =@t3]̃%@SV66;sW>t 8׃;r_^[SV66;sW>t ׃;r_^[%1hd5D$l$l$+SVWx@1E3PeuEEEEdËMd Y__^[]QUuuu uhk!hx@O]U%@(S3C p@j me3 p@3VW@}S[wOW E؋MEineIE5ntel ȋEj5Genu XjYS[wOW uCE%?=t#=`t=pt=Pt=`t=pu=@=@=@}EEEEE|2jX3S[]؉sKS EܩEEt =@_^tm p@@tUtN3ЉEUEM3Ƀu3u/p@@E p@t @p@3[]3@39|@Ë 13X!; x@u(Uj 0u$0h 0P 0]U$jtjY)A AAA5A=AfAf AfAfAf%Af-AAEAEAEA(AA@@ @@jXkǀ@jXk x@LjX t@Lh(3]Uj]UjtM)A AAA5A=AfAf AfAfAf%Af-AAEAEAEAA@@ @@jXkM@h(3]U jCtM)A AAA5A=AfAf AfAfAf%Af-AAEAEAEAA@@ @} v }ue } vE HE E @@jXkM@eE@EE;E sEMU @h(3]%0%40%0%0%00%,0%(0%$0% 0%0%0%0%0% 0%P0%L0%H0%T0%\0%`0%d0%h0%0%0%0%|0%x0%t0%p0%l0ðððð3̍MX6t;$<:<*===<<<<<p<T<<,9 9=b=L======>>~>p>X><>= >:9(:99999|9f9X9D98:J:::::::n:9^:;p;@;;;X!Unrecognized timer idwin32/src/timermodule.cpp(Ok)win32/src/timermodule.cppwin32/src/timermodule.cppkO:set_timerargument must be a callable objectSetTimerwin32/src/timermodule.cppO:kill_timerset_timerkill_timerint = set_timer(milliseconds, callback} Creates a timer that executes a callback functionboolean = kill_timer(timer_id) Stops a timertimerExtension that wraps Win32 Timer functionserror0.2__version__c:\src\python-3.8\include\object.h@(A^_N3^_ H4H^_ $\4\\x@31h%RSDS>lA*nrC:\src\pywin32\build\temp.win32-3.8\Release\timer.pdb`.text$mn`%.text$x0.idata$51.00cfg 1.CRT$XCA1.CRT$XCZ1.CRT$XIA1.CRT$XIZ1.CRT$XPA 1.CRT$XPZ$1.CRT$XTA(1.CRT$XTZ01.rdata3.rdata$sxdata3.rdata$zzzdbg6.rtc$IAA6.rtc$IZZ6.rtc$TAA6.rtc$TZZ6.xdata$x@7L.edata7x.idata$28.idata$38.idata$4 9.idata$6@.data@x.bssP.gfids$y`%"6h^_r7h7l7p7|7timer.pydPyInit_timerT889<08;09;08>=0`8=H0t8>\0;$<:<*===<<<<<p<T<<,9 9=b=L======>>~>p>X><>= >:9(:99999|9f9X9D98:J:::::::n:9^:;p;@;;;YSetTimer<KillTimerUSER32.dll;PyCallable_Check_Py_Dealloc-PyBytes_FromStringPyBool_FromLongPyDict_NewPyDict_GetItemPyDict_SetItemPyDict_DelItemPyDict_SetItemStringPyModule_GetDictrPyGILState_EnsuretPyGILState_ReleasePyErr_WarnExPyErr_SetString PyArg_ParseTuplePy_BuildValuePyModule_Create2PyErr_PrintPyEval_CallObjectWithKeywordsPyEval_SaveThreadPyEval_RestoreThread1PyExc_TypeError(PyExc_RuntimeWarningpython38.dll?PyWin_SetAPIError@@YAPAU_object@@PADJ@Z?PyWinLong_AsVoidPtr@@YAHPAU_object@@PAPAX@Z?PyWinLong_FromVoidPtr@@YAPAU_object@@PBX@Z?PyWinGlobals_Ensure@@YAHXZ?PyWinExc_ApiError@@3PAU_object@@Apywintypes38.dllFQueryPerformanceCounterGetCurrentProcessIdGetCurrentThreadIdGetSystemTimeAsFileTimeDisableThreadLibraryCalls^InitializeSListHeadzIsDebuggerPresentUnhandledExceptionFiltereSetUnhandledExceptionFilterGetStartupInfoWIsProcessorFeaturePresenttGetModuleHandleWGetCurrentProcessTerminateProcessKERNEL32.dll__CxxFrameHandler3%__std_type_info_destroy_listHmemset5_except_handler4_commonVCRUNTIME140.dll8_initterm9_initterm_eA_seh_filter_dll_configure_narrow_argv5_initialize_narrow_environment6_initialize_onexit_table>_register_onexit_function$_execute_onexit_table_crt_atexit_crt_at_quick_exit_cexitjterminateapi-ms-win-crt-runtime-l1-1-0.dll2(22p222@DN@6GJ4 0HX`4VS_VERSION_INFO,,?LStringFileInfo(040904E4`$Commentshttps://github.com/mhammond/pywin32"CompanyName*FileDescription4 FileVersion3.8.300.04 InternalNametimer.pyd&LegalCopyright*LegalTrademarks< OriginalFilenametimer.pyd0ProductNamePyWin328 ProductVersion3.8.300.0DVarFileInfo$Translation PADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADl0C0V0o000000000000111#1>1b11111111111122#262<2M2Y2x222222222333.3=3B3K3R3Y3k3q3w3~3333 4 4&4,42484>4D4J4P4V4\4b4h4n4t4z4444444444445E5U5l5}555555 6(626@6R6g666q777 88899:':::F:V:g:::::::);6;];e;~;;;;;<<<(<54>u>{>>>>>>!?1?N??????? o0x0000011)141=1P1[1c1m11111111111111112 222%212:2?2E2O2Y2i2y22222222222223 333$3,373<3B3L3V3i3n333333333333333334 444F4U4}4444444444444444444455 5555$5*50565<5B5i50$1(3,33336666774787@00 0000D0H0P0PK 1$nQ1L?win32/win32gui.pydUT ^_ux MZ@ !L!This program cannot be run in DOS mode. $rrѳrѳrѺ ѵrш,бrш,бrш,Тrш,иr,бrѧбrоrѳrs,бr,вr,вrRichrPEL^_! @3h3T:*TH+@.textN `.rdataj@@.dataX `P@.gfidsLn@@.rsrcTp@@.reloc:<t@BadDae@a,el`0l4l8l @lDlHl Ll=PlTlXl \l;`ldlhl4 ll:pltlxlD |llllP lllll l0:lll l@9lll l8lll l7lll l 7lllDl6lllTl6mmmp m5mmmm 4 m$m(m,m30m4m8mPD$@PD$BPD$DPD$PPD$@PD$@PhV|0jD$Pt$$ tpjjD$Pt$,tVjD$PD$Pt$t9D$ L$$ut$QL$DPJt$t$t$QL$LPt$ t$  u V_^0QWt$ tu_YUol$uhh亥03]_YVw Xu^]_YS;~ouVDtcC;\$|-PSFFF Ջt P6HjVEDu W[^]_YËtPP6HjVDu W[^]3_YVtPP6HD$t jVC^xtVt$VL^ËD$̋D$̋D$ uPY̋D$t̋D$tu D$%̃=|S\$UVWD$D$PD$D$PD$ D$P൥t$t$$t$,hDإxtWhtإV -t uWՃShإxhإ5|`D$3ۅt%ttVWP؃ D$uPՃt uVՃt uWՃ_tuSՃ^][Ë\$ 5ShX٥փ^][%ȵ̋T$B@Tuhڥ03ËL$APAPAPQhۥR|̋T$B@Tuhۥ03ËL$APQh(ܥR|UjhdPd%QVj@uEtu*3F#uuܵM^d ]UjhتdPd%QVj}@uEtu<*3F#uu败ܵM^d ]̡||$DD$| S\$UVt2C-@T t>t$uh^]3[VS؃uVՃtދ5ඥWt$$t$$փWPt$$t$$PhlxuhW3_^][WSuWՃD$t*D$PVԶu h uV hPL$(D$_^][UjhꪥdPd%S]VWjS೥EE}EEPuuu SVpWu,쵥uuu SԴ_^[Md ]쵥EMd _^[]UjhdPd%S]VWjS೥EE}EEPuuu SVWu,쵥uuu S_^[Md ]쵥EMd _^[]UjhdPd%SVWE]uEV5| u V3Etw EPw䶥} EPuEuWuVu+9Et&S쵥uuWuu̴}3} uHuE]V5| t䵥uVu S쵥M_^[d ]Ujh dPd%SVW3E}E ]5}=uXEx E@;ptMQPԶS֋WV5|u V5u3ɋ9MD|S֋V5| Etu VEu 䵥u u MQuuVSPE}u9S|tVPt䵥u Vu쵥Md _^[]VFp`xt VLWFFfF(FF XF8F4F0^V5WG0t uPփG4t uPփG8t uPփ_^Vt$tIF0W=t uP׃F4t uP׃F8t uP׃j}D$u P_^][39uv3 @P3tL$F;urݿQS\$UVt$WSt$춥|$t1D$;v1ul$$4@+Phht0ص _^]3[YË3D$$VLL$$uVh00ص 3933 fDB@TtZ|$$t ͍APAPQhR| APQh(R|t-F ;3sL$ 럽/h0t$ 3tPH.+D$u P_^][Ỹ$=|ulhh 0ص $SWD$D$ PD$ 3PD$ \$PD$ 3Ph\t$H|tD$(Pt$Ķu_3[$UVD$,PD$Pt$(l$ txD$(PD$Pt$ t$0tVt$\$t$,St$8Ut$D|W̵uVh3p=p\$5HtUփtSփ^]_[$Ã=|ulhh 0ص ÍD$PD$Ph4t$(|u3ÍD$Pt$ĶtD$PD$Pt$  uɋD$tPjhp0صVWt$t$|W̵_^ujhápp̃=|ulh<hP0ص ÍD$PD$Pht$(|u3ÍD$Pt$ĶtD$PD$Pt$  uɋD$tPjh0صVWt$t$|W̵_^ujhápp̃=|ulh|h0ص ÍD$PD$ PD$PD$PD$$PD$Ph t$@| u3ÍD$Pt$ĶtD$D$D$$t$t$t$$t$,|uPhápp̃D$PD$ PD$PD$ Pht$0|u3ÍD$Pt$Ķtt$t$ t$t$ujhP̃D$PD$ PD$Phht$(|u3ÍD$ Pt$Ķtt$t$ t$ujhP̃$Pht$| u3ÍD$Pt$Ķtt$duPhP̃ D$PD$Pht$ |u3 ÍD$Pt$Ķtt$t$ uPh P QS\$Ul$WSt$ED$춥|$u_][YV3VLEuYVh$0ص ED$tPHED$^u PD$ _][Y393v݃ EP7ܶtF;3r̃WD$ D$PD$ 3Ph@t$,|u3_ÍD$Pt$ ĶtD$PD$Pt$ tVt$t$ Vt$ |uPh p=pt VH^_̃WD$ D$PD$ 3Pht$,|u3_ÍD$Pt$ ĶtD$PD$Pt$ tVt$t$ Vt$ uPh p=pt VH^_̃WD$ D$PD$ 3Pht$,|u3_ÍD$Pt$ ĶtD$PD$Pt$B tVt$t$ Vt$ uPh` p=pt VH^_̃WD$ D$PD$ 3Pht$,|u3_ÍD$Pt$ ĶtD$PD$Pt$ tVt$t$ Vt$ uPh\ p=pt VH^_̃WD$ D$PD$ 3Pht$,|u3_ÍD$Pt$ ĶtD$PD$Pt$ tVt$t$ Vt$ uPh p=pt VH^_̃<=|ulh h< 0ص <ápWD$3D$ D$PD$D$PD$ D$PD$4PD$D$rXʤ$HʤD$,D$ mt$TD$ Qt$T؃=D$ʤ$ʤD$$D$ D$ Pt$t$(t$St$$DuPhD$=IdHrʤ$ʤt$ t$ jdD$tt$ :b3[D$ pp0hx:D$ p#p9D$t$$t$ jdD$tQ譝3jdD$t<Q臝D$|$UjdD$4tQ\3jdD$4tN|Q93jdjD$4t NQ3Sht$(hUhhhWh vxh,vthLPhlvhvhv hvh<vh|hxt]D$ php h$ph0phHhxx$= w+tANU-<h$ƥՋ584u hDƥӋt[hƥWhƥW|hHǥW|h\ǥW|hǥW|hǥW|hȥW|֣|hȥՋu hLȥӋtuh`ȥWhlȥW|htȥW|hȥW|hȥW|hȥW|hȥW|h4ɥW|hɥW|֣|hɥՋu hɥӋt'hʥWhʥW|hʥW|֣|5j֋\$-Ph˥SjPh4˥SjPht˥SjPh˥SՃ@h Ph˥Sj@Ph˥SjPh˥ShPh˥SՃ@j Ph̥SjPhD̥ShPhh̥ShPh̥SՃ@jPh̥SjPh̥SjPh̥SjPh̥SՃ@jPh̥Sj Ph̥ShPh̥SjPhͥSՃ@jPh(ͥSjPhHͥSjPhTͥSjPhtͥSՃ@jPhͥSjPhͥSjPhͥSjPhΥSՃ@jPhΥSjPhHΥSjPhxΥSjPhΥSՃ@jPhΥSjPhϥSjPh ϥSjPh8ϥSՃ@jPhLϥSjPhdϥSjPhϥSjPhϥSՃ@jPhϥSjPhϥSjPhХSjPhХSՃ@jPh0ХSjPh@ХSjPhPХSj PhХSՃ@jPhХSjPhХShPhХShPhХSՃ@jPhѥSjPhѥSՋD$4 ]^[_^[3_VF^QVt$ t$*^YQVt$ t$<*^YV~u6쵥F^%%D$Vt j V/ ^VD$t jV ^VD$t jV ^D$Vt jdV ^VW=F0t uP׃F4t uP׃F8t uP׃D$ t jtVkYtu ju6 |3@ Ê]uYj h2 |3OH|FEe=|tj/%|EjuYY3Ʉ uFYj h2+ } u9=|3et t]1]SWuuSWuuSWuuu"uSPuϼSVuSVu`tuHSWuout5SWu:$MQ0huu uËe3uE UV5*u3@uu u ^] U]U} uuu u ] UaaEA*]UVuX*^]aaA**UVu%*^]aaA**UVF* `PEPIYY^]UE*aaA]A*PYÍA*P YÍA*P YUVF*P EYt j V3YY^]UVF*P EYt j VYY^]UVF*P EYt j VYY^]U Mh2EPY U Mh 3EP< ̋Au*G U졘{3E]U졘{j Y+ȋE3{]UEM ]P" YUEVH<AQAk(;tM ;J r BB ;r (;u3^]ËUEu2]ùMZf9uH<ȁ9PEu f9A]dau2dV|P;t3u2^ð^,tPR Yt2K jYh u2\ uV L G Uu} uuMPuUuu YY]t h| Y  j Y U}u } u2] u j Y]U Vutu|t*u&h|N Yt2Wh}; YD{uW|j Y+ȃ3{EEE}EEuE_^]j4jh`3qeMZf9u]<PEuL f9u>E+PQgYYt'x$|!EE3Ɂ8ËeE2:Ut}u 3|]U= }t} uuS uK YY]U졘{3|uȃu h| YY#E]U졘{3}ȃu] uh} YY]UuYH]Uee{VWN@;t t У{fEPE3EE1E 1EEP$ME3M3M3;uO@u G ȉ {щ {_^]h}h}Yø}ø }HHHHøTU$SVjtM)3hVP5(} |xffftfpflfhEEDž@jPEVPE E@EEVXۍEEۉEEP u !(}^[]UDjDEjP  EPXEtEj X]3j<ȅu2øMZf9uA<8PEu f9HuۃxtvՃhgUE8csmu%xu@= t=!t="t =@t3]̃%(}SV11;sW>t 8׃;r_^[SV11;sW>t ׃;r_^[%hkd5D$l$l$+SVW{1E3PeuEEEEdËMd Y__^[]QUuuu uhKh{]U%,}(S3C {j Jme3 {3VW,}}S[wOW E؋MEineIE5ntel ȋEj5Genu XjYS[wOW uCE%?=t#=`t=pt=Pt=`t=pu=0}=0}=0}}EEEEE|2jX3S[]؉sKS EܩEEt =0}_^tm {,}tUtN3ЉEUEM3Ƀu3u/{,}E {t ,}{3[]3@39{Ë 38; {u(Uju h P]U$jbtjY)8~ 4~0~,~5(~=$~fP~f D~f ~f~f%~f-~H~E<~E@~EL~}@~D}8} <}H}jXkǀL}jXk {LjX {Lh*]Uj]Uj[tM)8~ 4~0~,~5(~=$~fP~f D~f ~f~f%~f-~H~E<~E@~EL~@~D}8} <}H}jXkML}h*]U jtM)8~ 4~0~,~5(~=$~fP~f D~f ~f~f%~f-~H~E<~E@~EL~@~D}8} <}} v }ue } vE HE E @H}jXkML}eE@EE;E sEMU P}h*]%\%T%P%L%H%D%@%<%8%4%0%,%(%$% %%%%% %%X%%%% %$%(%,%0%4%8%<%%D%H%L%P%%X%\%`%d%h%l%p%t%x%|%ðððð3jEPøL2EjEPø(2,M2M1M1M1Mt1MP1 ONNNNNNvN^NFN6NNNMMMMMt==========>>&>2>D>P>b>v>>>>>>>???(?4?>?D?P?^?n?z????????`=??@@,@6@J@b@r@@@@@@@@@@@AA"A6ADAPA`ApAAAAAAAAAABB(B:BLBV=F=:=&==<<<<<<<n<T<><.< <<<?<[[\[[r[\[B[,[[ZZZZZZZZtZfZXZHZ8Z[*ZPO@O.ObOF F.FKLK`KpK|KKKKKKKKKLL&L4LDLRLfLvLLLLLLLLL MM&M:MJMZMrMEEzEjE\EPE6E$EEDDDDDDD|DnD`DPDFDEEExJE:D(DDDCCCCCCClC\C>&>2>D>P>b>v>>>>>>>???(?4?>?D?P?^?n?z????????`=??@@,@6@J@b@r@@@@@@@@@@@AA"A6ADAPA`ApAAAAAAAAAABB(B:BLBV=F=:=&==<<<<<<<n<T<><.< <<<?<[[\[[r[\[B[,[[ZZZZZZZZtZfZXZHZ8Z[*ZPO@O.ObOF F.FKLK`KpK|KKKKKKKKKLL&L4LDLRLfLvLLLLLLLLL MM&M:MJMZMrMEEzEjE\EPE6E$EEDDDDDDD|DnD`DPDFDEEExJE:D(DDDCCCCCCClC\CGetBkMode\GetCurrentObject]GetCurrentPositionExGetGraphicsModeGetMapModeGetObjectTypeGetPixelGetPolyFillModeGetRgnBoxGetStockObjectGetStretchBltModeGetTextCharacterExtraGetTextAlignGetTextColorGetTextExtentPoint32WGetViewportExtExGetViewportOrgExGetWindowExtExGetWindowOrgExInvertRgnLineToOffsetRgnPatBltPiePaintRgnPtInRegionRectInRegionRectangleRestoreDCRoundRectSaveDCJSelectObjectQSetBkColorRSetBkModeaSetGraphicsModehSetMapModeoSetPixelqSetPixelVrSetPolyFillModeStretchBlttSetRectRgnsSetROP2vSetStretchBltModeySetTextCharacterExtrazSetTextColorxSetTextAlignGetTextMetricsWAbortPath ArcToBeginPathCloseFigure|EndPathFillPathFlattenPathGetPathPathToRegionMSetArcDirectionlSetMiterLimitStrokeAndFillPathStrokePathWidenPathExtCreatePenGetMiterLimit7GetArcDirectionGetObjectWMoveToExExtTextOutWRCreatePolygonRgnPolygonPolylinePolyBezierPolyBezierToPolylineTo|SetViewportExtEx}SetViewportOrgExSetWindowExtExSetWindowOrgExGetTextFaceWGDI32.dllRegisterWindowMessageWDrawEdgeDrawAnimatedRectsGetMessageWTranslateMessageDispatchMessageWPeekMessageWRegisterHotKey SendMessageW SendMessageTimeoutWRegisterDeviceNotificationWUnregisterDeviceNotificationPostMessageWPostThreadMessageWReplyMessageWaitMessageDefWindowProcWPostQuitMessage CallWindowProcWMGetDoubleClickTime(SetDoubleClickTimeRegisterClassWUnregisterClassWsCreateWindowExW3IsWindowIsChildDestroyWindowxShowWindowFlashWindowQCloseWindowMoveWindowgSetWindowPosGetWindowPlacementfSetWindowPlacement9IsWindowVisible#IsIconicBringWindowToTopfCreateDialogIndirectParamWDialogBoxParamWDialogBoxIndirectParamWEndDialogIGetDlgItem%SetDlgItemIntJGetDlgItemInt'SetDlgItemTextWLGetDlgItemTextWGetNextDlgGroupItemGetNextDlgTabItemHGetDlgCtrlIDDefDlgProcW*SetFocusGetActiveWindowQGetFocus$GetCaptureSetCaptureReleaseCaptureEnableWindow5IsWindowEnabled\CreateAcceleratorTableWDestroyAcceleratorTableTranslateAcceleratorWPLoadMenuWqGetMenu5SetMenu|GetMenuStateDrawMenuBarGetSystemMenuoCreateMenupCreatePopupMenuDestroyMenuACheckMenuItemEnableMenuItemGetSubMenuxGetMenuItemIDwGetMenuItemCount InsertMenuW AppendMenuWModifyMenuWRemoveMenuDeleteMenu9SetMenuItemBitmapsTrackPopupMenu InsertMenuItemWzGetMenuItemInfoW;SetMenuItemInfoWuGetMenuDefaultItem7SetMenuDefaultItem{GetMenuItemRectDragDetectDrawIconDrawTextWUpdateWindowSetActiveWindowRGetForegroundWindowPaintDesktop+SetForegroundWindowWindowFromDC?GetDCGetWindowDCReleaseDCBeginPaintEndPaintGetUpdateRgnhSetWindowRgnGetWindowRgnInvalidateRectValidateRectInvalidateRgnValidateRgnRedrawWindowScrollWindowExEnumPropsExWlSetWindowTextWGetWindowTextWGetWindowTextLengthW0GetClientRectGetWindowRectMessageBoxW}MessageBeepSetCursor>GetCursorPos;GetCursor]CreateCaretDestroyCaretHideCaretrShowCaretSetCaretPos&GetCaretPosKClientToScreenScreenToClientWindowFromPointGChildWindowFromPointHChildWindowFromPointExGetSysColorGetSysColorBrushDrawFocusRectFillRectFrameRectInvertRectPtInRectGetWindowLongWeSetWindowLongW,GetClassLongWSetClassLongWBGetDesktopWindowGetParent?SetParentEnumChildWindowsFindWindowWFindWindowExW EnumWindowsEnumThreadWindows.GetClassNameWGetWindowBCheckMenuRadioItemDLoadCursorWFLoadIconWDestroyIconjCreateIconFromResourceHLoadImageWDrawIconExlCreateIconIndirectWCopyIconXGetIconInfoIsDialogMessageWLSetScrollInfoGetScrollInfoSystemParametersInfoW=GetCursorInfoUSER32.dll GetOpenFileNameWGetSaveFileNameWCommDlgExtendedErrorCOMDLG32.dll{InitCommonControlsExSImageList_CreateTImageList_DestroydImageList_GetImageCountMImageList_AddoImageList_ReplaceIconqImageList_SetBkColorwImageList_SetOverlayImageZImageList_DrawnImageList_Replace[ImageList_DrawExmImageList_RemovebImageList_GetIconiImageList_LoadImageW_TrackMouseEventCOMCTL32.dll#DragAcceptFiles4ExtractIconW3ExtractIconExWShell_NotifyIconWSHELL32.dll_Py_Dealloc.PyBytes_FromStringAndSizePyLong_FromLongPyLong_FromUnsignedLongPyLong_AsUnsignedLongPyList_NewPyList_AppendPyErr_SetStringPyErr_Occurred PyArg_ParseTuplePy_BuildValuePySequence_Tuple_Py_NoneStructPyExc_NotImplementedError9PyExc_ValueErrorKPyType_ReadyoPyObject_GetAttrStringiPyObject_GenericGetAttrkPyObject_GenericSetAttr{PyObject_IsTrue;PyCallable_Checkz_PyTraceMalloc_NewReference-PyBytes_FromString&PyBytes_AsStringAndSize{PyUnicode_AsUnicodexPyUnicode_AsUTF8PyLong_FromSsize_tPyLong_AsLongPyLong_AsUnsignedLongMaskPyLong_FromVoidPtrPyLong_AsLongLongPyBool_FromLongOPyFloat_FromDouble=PyTuple_New@PyTuple_Size;PyTuple_GetItemPyDict_NewPyDict_GetItemPyDict_SetItemPyDict_DelItemPyDict_SetItemStringPyModule_GetDictrPyGILState_EnsuretPyGILState_ReleasePyErr_WarnExPyErr_ClearPyErr_FetchPyErr_NoMemoryPyErr_Format PyArg_ParseTupleAndKeywordsPyModule_Create2PyErr_PrintPyEval_CallObjectWithKeywordsPyEval_SaveThreadPyEval_RestoreThreadPyEval_InitThreads PySys_WriteStderrUPyObject_Call\PyObject_CallObjectRPyObject_AsReadBufferSPyObject_AsWriteBufferE_Py_tracemalloc_config_Py_FalseStruct_Py_TrueStructPyExc_AttributeErrorPyExc_MemoryError1PyExc_TypeError!PyExc_PendingDeprecationWarningpython38.dll?PyWinObject_AsWCHAR@@YAHPAU_object@@PAPA_WHPAK@Z?PyWinObject_FreeWCHAR@@YAXPA_W@Z?PyWinObject_AsReadBuffer@@YAHPAU_object@@PAPAXPAKH@Z?PyWinObject_FromOLECHAR@@YAPAU_object@@PB_W@Z?PyWinObject_AsResourceIdW@@YAHPAU_object@@PAPA_WH@Z?PyWinObject_FreeResourceId@@YAXPA_W@Zs?PyBuffer_New@@YAPAU_object@@H@Zr?PyBuffer_FromMemory@@YAPAU_object@@PAXH@Z?PyWin_SetAPIError@@YAPAU_object@@PADJ@Z?PyWinSequence_Tuple@@YAPAU_object@@PAU1@PAK@Z?PyWinObject_FromOLECHAR@@YAPAU_object@@PB_WH@Z?PyWinLong_AsVoidPtr@@YAHPAU_object@@PAPAX@Z?PyWinLong_FromVoidPtr@@YAPAU_object@@PBX@Z?PyWinObject_AsPOINT@@YAHPAU_object@@PAUtagPOINT@@@Z?PyWinObject_AsDWORDArray@@YAHPAU_object@@PAPAKPAKH@Z?PyWinObject_AsPARAM@@YAHPAU_object@@PAI@Z?PyWinObject_AsRECT@@YAHPAU_object@@PAUtagRECT@@@Z?PyWinObject_FromRECT@@YAPAU_object@@PAUtagRECT@@@Z?PyWinObject_AsDEVMODE@@YAHPAU_object@@PAPAU_devicemodeW@@H@Z?PyWinObject_AsHANDLE@@YAHPAU_object@@PAPAX@Z?PyWinLong_FromHANDLE@@YAPAU_object@@PAX@Z?PyWinObject_AsMSG@@YAHPAU_object@@PAUtagMSG@@@Z?PyWinObject_FromMSG@@YAPAU_object@@PBUtagMSG@@@Z?PyWinGlobals_Ensure@@YAHXZ ??0PyHANDLE@@QAE@PAX@Z??1PyHANDLE@@UAE@XZ?PyWinExc_ApiError@@3PAU_object@@Ay?PyHANDLEType@@3U_typeobject@@Apywintypes38.dll)GlobalAlloc7GlobalReAlloc;GlobalUnlock4GlobalLock0GlobalFree]GetLastError*SetLastErrortGetModuleHandleWGetProcAddressLoadLibraryWqIsBadReadPtrtIsBadWritePtrsIsBadStringPtrWFQueryPerformanceCounterGetCurrentProcessIdGetCurrentThreadIdGetSystemTimeAsFileTime^InitializeSListHeadzIsDebuggerPresentUnhandledExceptionFiltereSetUnhandledExceptionFilterGetStartupInfoWIsProcessorFeaturePresentGetCurrentProcessTerminateProcessKERNEL32.dllFmemcpy__CxxFrameHandler3Hmemset!__std_exception_copy"__std_exception_destroy_CxxThrowException%__std_type_info_destroy_list5_except_handler4_commonVCRUNTIME140.dllwcsncpycallocfreemalloc_callnewh8_initterm9_initterm_eA_seh_filter_dll_configure_narrow_argv5_initialize_narrow_environment6_initialize_onexit_table>_register_onexit_function$_execute_onexit_table_crt_atexit_crt_at_quick_exit_cexitjterminateapi-ms-win-crt-string-l1-1-0.dllapi-ms-win-crt-heap-l1-1-0.dllapi-ms-win-crt-runtime-l1-1-0.dll 8Pb@̤ͤ,<p]]_H` `ͤϤ  0 H Ҥ cc0dHa<  <\ !"#08d`eeebpդ0Ԥl| ¥XĥХХХХХѥtߥxߥߥߥߥLlΥΥΥΥϥ0ϥDϥXϥpϥϥϥϥեե ֥H֥֥֥֥֥֥4ץ@ץpץ|ץץ٥ڥdڥpڥxܥܥܥT ,08\`L`xjduDN@|*.?AVPyGdiHANDLE@@|*.?AVPyHANDLE@@|*.?AU_object@@|*.?AVPyHDEVNOTIFY@@|*.?AVtype_info@@|*.?AVbad_alloc@std@@|*.?AVexception@std@@|*.?AVbad_array_new_length@std@@6GJNPNWN]TULZ[4 0HX4VS_VERSION_INFO,,?\StringFileInfo8040904E4`$Commentshttps://github.com/mhammond/pywin32"CompanyName*FileDescription4 FileVersion3.8.300.0: InternalNamewin32gui.pyd&LegalCopyright*LegalTrademarksB OriginalFilenamewin32gui.pyd0ProductNamePyWin328 ProductVersion3.8.300.0DVarFileInfo$Translation PADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPAD00 00000$0)0.03080=0B0G0M0W0[0a0e0k0u000000000000000000011 111#1)131=1A1G1Q1[1_1d1j1t1~1111111111111111111122 222"2(2,222<2F2J2P2T2Z2d2n2r2x2|2222222222222222222233333"3,363:3@3D3J3T3^3b3h3l3r3|3333333333333333333344 444&4*40444:4D4N4R4X4\4b4l4v4z4444444444444444444445 555 5$5*545>5B5H5L5R5\5f5j5p5t5z555555555555555555556 6666$6.62686<6B6L6V6Z6`6d6j6t6~6666666666666666666677 777"7(7,727<7F7J7P7T7Z7d7n7r7x7|7777777777777777777788888"8,868:8@8D8J8T8^8b8h8l8r8|8888888888888888888899 999&9*90949:9D9N9R9X9\9b9l9v9z999999999999999999999: ::: :$:*:4:>:B:H:L:R:\:f:j:p:t:z::::::::::::::::::::; ;;;;$;.;2;8;<;B;L;V;Z;`;d;j;t;~;;;;;;;;;;;;;;;;;;;;<< <<<"<(<,<2<<> >>>&>*>0>4>:>D>N>R>X>\>b>l>v>z>>>>>>>>>>>>>>>>>>>>>? ??? ?$?*?4?>?B?H?L?R?\?f?j?p?t?z???????????????????? 0 0000$0.02080<0B0L0V0Z0`0d0j0t0~0000000000000000000011 111"1(1,121<1F1J1P1T1Z1d1n1r1x1|1111111111111111111122222"2,262:2@2D2J2T2^2b2h2l2r2|2222222222222222222233 333&3*30343:3D3N3R3X3\3b3l3v3z3333333333333333333334 444 4$4*444>4B4H4L4R4\4f4j4p4t4z444444444444444444445 5555$5.52585<5B5L5V5Z5`5d5j5t5~5555555555555555555566 666"6(6,626<6F6J6P6T6Z6d6n6r6x6|6666666666666666666677777"7,767:7@7D7J7T7^7b7h7l7r7|7777777777777777777788 888&8*80848:8D8N8R8X8\8b8l8v8z8888888888888888888889 999 9$9*949>9B9H9L9R9\9f9j9p9t9z99999999999999999999: ::::$:.:2:8:<:B:L:V:Z:`:d:j:t:~::::::::::::::::::::;; ;;;";(;,;2;<;F;J;P;T;Z;d;n;r;x;|;;;;;;;;;;;;;;;;;;;;<<<<<"<,<6<:<@ >>> >$>*>4>>>B>H>L>R>\>f>j>p>t>z>>>>>>>>>>>>>>>>>>>>? ????$?.?2?8?3B3H3L3R3\3f3j3p3t3z333333333333333333334 4444$4.42484<4B4L4V4Z4`4d4j4t4~4444444444444444444455 555"5(5,525<5F5J5P5T5Z5d5n5r5x5|5555555555555555555566666"6,666:6@6D6J6T6^6b6h6l6r6|6666666666666666666677 777&7*70747:7D7N7R7X7\7b7l7v7z7777777777777777777778 888 8$8*848>8B8H8L8R8\8f8j8p8t8z888888888888888888889 9999$9.92989<9B9L9V9Z9`9d9j9t9~99999999999999999999:: :::":(:,:2:<:F:J:P:T:Z:d:n:r:x:|::::::::::::::::::::;;;;;";,;6;:;@;D;J;T;^;b;h;l;r;|;;;;;;;;;;;;;;;;;;;;<< <<<&<*<0<4<:=B=H=L=R=\=f=j=p=t=z====================> >>>>$>.>2>8><>B>L>V>Z>`>d>j>t>~>>>>>>>>>>>>>>>>>>>>?? ???"?(?,?2?2B2H2L2U2_2i2m2s2w2}22222222222222222222 3 3333'31353;3?3E3O3Y3]3c3g3m3w33333333333333333333344 44!4%4+4/454?4I4S4_444455 77)7778889999:X::::;(;f;s;;;;;<>!>1>k>}>>>*?=????PP0!050@0R0_0{00000 141m11111 2W2a2p22222303G3_3g3~33333 4C4U44444444444445n5v55555555556666k6q666666 7717@7`7s777777778/8;8R8888889F9f9u9999: :<:E:K:\:|:::::;;; ;0;V;r;;;;;;;;;< <"<21>i>v>>>>?9?E????????` 00f00001 121n111272Q2[2n2s2z22222222&3+383f3k3x3334#4:4?4G4Y4e44444455*55555555 66X6m6r6z6666666777H7O7T7\77777778 8828Q88888888899!9,9:9L9Y9`9q9999999999999 ::.:::@:b:h:p:::::::1;;;A;T;];f;k;q;;;;;;;;;;<<%<=>>J>S>X>`>z>>>>>>>>? ??1?;?^?h????????p 00)02080p0z0000000000001"1,1B1_1x111111111111 22(2/2]2g22222223$3D3N3j3x333334 4(464h4444444444555>5D5X5i5v555555556 6616=6C6L6[6e6k6w6~666666667 77%7+777>7c7m777777777777#8-8?8t888888888889$9D9N9`999999999::#:):::C:J:Q:a:q:w:::::2;8;C;L;R;a;j;q;x;;;;;;;;<#<)<='>1>7>C>J>d>v>>>>>>>>>?7?=O=y=========>#>6>G>V>o>}>>>>>?'?-?>?C?W?o?????00090C0S0Y0m0s0000000000111+1=1O1a1j1v11111111111122.2?2M2S2a2~2222222233/3;3A3O3n3x33333333424<4B4Y4x4444444445)53595G5h5r5555555566#6)676U6]6b6g6o6666666666777%7/7K7`7l7r7777777778848I8S8Y8g888888889:9O9d9y999999999999::%:+:U:]:b:g:o:::::::::;;";';/;J;T;p;;;;;;;;;;;<<[>>(>.>S>]>y>>>>>>>>>>)?.?6?G????????e00000000#1*1>1E1i1n1v111111112212222222223 333353?3[3v333333333334 444454?4[4v444444444445 5555I5S5o555555566;6G6M6[66666666677/797?7M7n7x7777778'868<8D8]8~8888959?9E9O9W9b999999:::":Y:c::::::::;#;@;u;;;;;;;;<5 >9>C>>>>>>>?&?8?S?????0.090>0F0W0|000000000110161F1a1g1o111111112 2?2L2a2t22223 3,323:3M3V3\3b3y3~33334C4I4Q4e4w44444445 5N5X5t5555556676L6U6e6k66666667-7>7D7V7\7p77777777788&8@8T8i8n8v8888888888 9909D9Y9^9f9999999999:#:1:g:::::::::;4;;;;;;#<3<8<@<<<>>">Q>i>o>>>>>>>G?T?]?l?r?x??????M0R0Z0k0000000000:1?1G1X1z11111111%2,2D2\2a2|22222222%393>3X3p3u3}33333334%4*4Y4w444444445I5_5d5z555555 66H6R6X666666677178 888%8+838;8A8I8Q8Y8a8i8n8t888888888889 99 9+90989O9V9e9z9999999999999999999H:L:P:T::::::::::::::T;X;;;;;;EX>l>>>>>?3?^???????????? 00090H0\0e0u0{00000000001.1H1R11111112>2O2\2b2222222222 3#3F3R3_3e3x333333334424;4P4k44444444 55"5+5:5D5J5X5_55555555566&6,6]6g6}66666666677+7:7J7S7Y7_77777777780868<8888899!90969C9999999 ::!:':5:V:`:q:}::::::::;;;;#;/;o;y;;;;;;;<%>5>D>P>Y>_>e>>>>>>??(?.?4?C?O????????0 00"0R0\0n000000000101L1f1u11111111112$20292?2E2a2k2y2~222222 333?3I3e3v3}33333333444)4/4;4n44444444455 55)5O5Y5u555555555 6;6K6T6c6i6v666666666777N7`7|77777777777 8/898U8d8n8x88888888959M9V9e9k9x99998:d:m:|:::::: ;;;;-;\;f;q;z;;;;;;; <<0L>^>>>>>>>> ?Q?[?w?????????00;0J0Z0c0i0o000000000*141F11111111122&232=2C2S2o2y22222222!3+3=3o3333334414c4444444455)5;5D5Q5[5a5q555555555?6I6e6}66666666667U7_7{777777777788E8O8k8z88888888 9O9g9p9v9|9999:::#:):U:_:{::::::::;;,;2;>;;;;;<<$<9 >%>->>>H>w>>>>>>>>>>>>??(?O?Y?u????????? 00*03090?0n000000000 111#131?1I111112(222H2Q2^2n2x2~22222222333M3W3s33333333333444&414;4K4S4\4b4h44444444445'5:5J5S5c5i5u555555555555 616;6L6_666666666677;7J7Z7c7i7o7777777778858D8P8Y8_8e888888888889!9+9;9E9K9T9a9s9y9999999999 :/:9:U:d:p:y:::::::::;;;(;.;>;Q;[;k;u;{;;;;;;;;;<<<)$>.>8>A>N>X>^>n>>>>>>>>>??;?J?Z?c?s?y?????????? 0/090U0d0n0x00000000111+141A1K1Q11111111111 222]2g2222222233A3S3s33333333444!404H4N4\4l444444445 52575>5Q5[5k5s5|555555646X6a6p6v666666777$717?7O7s7}77777888"8(8.8R8[888888888 9A9N9]9f9l9r99999:!:':-:::H:X:|::::::;(;R;`;i;x;~;;;;;;;< <<"<(<8<_=^=g=w=}======== >>>J>T>p>>>>>>>>>??3?9K9Q9`9p9v999999 ::0:?:X:a:n:t:::::::::;);E;T;e;n;{;;;;;;;;;<:>->H>^>e>m>|>>>>>>>??8?N?U?]?l????????0 0(0>0E0M0\0t0}000000001 111R1\1n111111112,262G2z22222222 3303?3S3\3l3r3~333333344P4Z4v4444444444E5O5k55555555556$6@6O6c6l6r6x66666667757?7[7j7t777777788+8E8T8p8y888888888 99#9)9/9t9~99999:::T:^:z:::::::::(;X;g;l;u;;;;;;;;;;;$=H=Y=l=}========> >>">.>d>n>>>>>>>>(?2?N?]???????@00-0Y0b0r0x000000)121B1H1T111111222$2T2^2z22222222 3%343L3U3e3k3w333333444#43494G4W4{4444444555!505@5F5T5d55555556666%6U6_6{6666666667 7757?7[7j7z77777777777858?8[8j8z88888888888959?9[9j9z9999999&:5:::?:G:V:o:x:::::::::;;,;1;F;j;;;;;<<<$<*<8<=>>P>>>>>>> ??)?[?k?t???????P0+040:0@0j0t000000000B1Q1V1g1u111111111112H2W2\2e2v2222222222 3353>3N3T3`333334 4-434B4H4f44444545C5H5Q5k5t55555555555555666O6Y6u666666666 77 7&7b7l777777777778 818=8F8S8Y888889 999.999F9O9^9d9q9}999999:-:2:7:?:S:^:o:x:::::::::;Z;i;n;;;;;;;;;;;<$>->:>@>O>U>>>>>>>????R?\?n???????` 00)0[0k0t0000000 141=1L1R1_111111111112 202T2^2o2222222 333$3d3n333333334(4D4S4w4444444444 55#5-535B5U5555555556-6N6666667*7;7D7Q7W7e7r7w7|77777777 888?8I8e8t888888888999)9/9;9_9i9999999999:$:0:9:I:O:[::::::::::;;5;D;P;Y;i;o;{;;;;;;;;; '>0>=>C>R>l>z>>>>>>>?$?0?9?F?L????????p0 0g0v0{000000000001G1V1[1`1h1w1111111`2m22222233:3?3G3Y3c33333333334 44.484B4o4y44444444445'595k5u55555555555666)696?6M6]66666666666777 7E7O7k7z77777777778$8.888A8N8X8^8n8888888889959D9P9Y9_9e999999: ::!:+:;:C:L:e:k:p:::::::::::: ;%;4;>;H;Q;^;h;n;~;;;;;<<<,<5 >>#>,>E>K>P>f>>> ?? ?(?4?g?v?{????????` 00,0<0L0p0z00000000111,151B1L1R1b111111111 222*2b2l222222222233)3E3T3`3i3y3333333 44%4+474T4^4c4i444444444444444455/565=5E5J5O5Z5`5s5556N6666%7*727:7C7P7X7^7e7k7r7x777777777777777777788888!8(8.858:8G8T8\8b8i8o8v8|888888888899!919A9N9[9h9x9999999999:: :-:::G:W:d:q:~:::::::::: ;;#;3;@;P;`;p;};;;;;; <"<2>%>M>`>f>l>r>x>~>>>>>>>>>>>>>>>>>>>>>>????? ?&?,?2?8?>?D?J?P?V?\?b?h?n?t?z??????????????????????00 0000$0*00060<0B0H0N0T0Z0`0f0l0r0x0~000000000000000000000011111 1&1,12181>1D1J1P1V1\1b1h1n1t1z111111111111111111111112 2222"2(2.242:2@2F2L2R2X2^2d2j2p2v2|222222222222222222222233 3333$3*30363<3B3H3N3T3Z3`3f3l3r3x3~333333333333333333333344444 4&4,42484>4D4J4P4V4\4b4h4n4t4z444444444444444444444445 5555"5(5.545:5@5F5L5R5X5^5d5j5p5v5|555555555555555555555566 6666$6*60666<6B6H6N6T6Z6`6f6l6r6x6~666666666666666666666677777 7&7,72787>7D7J777M8|888888888B9_9i9w99999::@;X;p;v;;;;;;; <<5>?0?C?O?_?p???????20?0f0n000000 11(111>1m1u11111111222223\3b33333344.4{444444O5X5`555555 66606;6C6M6c6l6w6~66666666666666667777%7/797I7Y7i7r7777777777777778 888"8,868I8N8u8{8888888888888888888&959]9d9t9z99999999999999999999999: ::::":(:.:4:::@:F:L:R:X:^:d:j:p:v:|::::::::::;!;3;E; 7$7  ::::8:<:@:D:x:|::::::::::::;;;;;;;;;;;; << <$<,|$L$hhzq0q3%h<{h|{hz3ɍC9L$AQpЃT$(u\qh{0q33ډ|$$9|$0Wt$Wt$$qЃ|$jjD$$PVqCL$@IfRfuT$ʍqfDffu+R4Mq=jfjD$,PWqL$ DIfRfuT$ ʍyfDffu+R,Nq3fEhV0qЋ+IDuJBu+W=C0qЋ+IDuJBu+ڈC|$$G|$$;|$0}5q}t$(p3(T$(L$t3fED$8D$45$q\$uSփ|$t uWփ_[^]̃|$u"|$ uqh|0q3Í$PD$Pt$< t<$Vt$4tSWq|$؍D$Pt$Lt$LWVt$Lt$Lt$Lt$Lt$L0pSqWpuVh\|q_[^jqt$5r։G t$ ֋5D$Pt$ rt(D$Pt$upPhq38ÍD$Pr8̃=uTqh0hH0q hpt$ quPr̃=uTqhh0q ÍD$D$PhВt$ D$ q tBD$ Pt$  rt,$PD$Pt$upPh쒿q3jt$qPjt$ qPhq ̃=uTqhprhr0q Í$D$PD$D$PD$P5Դt$(qu3ÍD$ Pt$  rt4$t$t$uPhrqádqdq̃=uTqhrhr0q hst$D$ D$qt($PD$PupPh8sq34$t$hXsq ̃=uTqh\sh|s0q Í$D$PD$D$Phst$qt&4$t$upPhsq3ádqdq̃ =uTqhshs0q ÍD$PD$Phtt$ qu3 ÍD$Pt$ rtVt$t$uptVh0tq^ V@q^ ̃ =еujq ádq$$Ph@tt$q u3 Ë$;dqu pD$L$QP rtЋD$L$QPеuPhTtq t$q ̃$PD$PD$Phdtt$0qu3ÍD$Pt$  rtD$Pt$qtVt$pu\qh|t0q3^WD$ D$ Pt$ 3Vt$$t$,Lptt$ V(q jhtqVp_^̃D$ PD$PD$PD$Phtt$8qu3ÍD$Pt$ rtD$Pt$ qt΍$$Pt$t$t$ t$(PpuPhuq4$Dq̃8D$(D$ PD$(D$PD$(D$PD$(D$$PD$tVkYtu ju6 3@* Ê]uYj h 3OHFEe= tjK% EjuYY3Ʉ uFYj h M } u9=3et t]1]SWuuSWuuSWu6uu"uSPuSVuSVu`tuHSWuout5SWu:$MQ0hPuu uËe3uE UV5 u3@uu u* ^] U]U} uuu u ] UaaEA4]UVuX4^]aaA<4UVu%P^]aaAXPUVF `PEPYY^]UEaaA]APYÍAPYÍAPzYUVFPcEYt j VYY^]UVFP6EYt j VnYY^]UVFP EYt j VAYY^]U Mh<EP U MhEP ̋Au U3E]Uj Y+ȋE3]UEM ]4 P YUEVH<AQAk(;tM ;J r BB ;r (;u3^]ËUEu2]ùMZf9uH<ȁ9PEu f9A]du2dVP;t3u2^ð^xtdP Yt2 jY u2 u  Uu} uuMPuUuu[ YY]t hb Y e ju Yo U}u,I u2]< u j: Y]U Vutu|dt*u&h Yt2Wh  YDuWj Y+ȃ3EEE EEuE_^]jPjhЙeMZf9u]<PEuL f9u>E+PQgYYt'x$|!EE3Ɂ8ËeE2\USt}u 3]U=,t} uu u YY]U3uȃu hr YY#E]U3 ȃu]W uh 8 YY]UuYH]UeeVWN@;t t УfEPppE3EElp1E p1EEPhpME3M3M3;uO@u G ȉ щ _^]U} u= u utp3@] h0xph0Yø8HHHHølU$SVjtM)3hVP5@ |xffftfpflfhEEDž@jPEVPE E@EEpVXۍEEۉEpEPpu !@^[]UDjDEjP EP8pEtEj X]3jTpȅu2øMZf9uA<8PEu f9HuۃxtvՃh1\pUE8csmu%xu@= t=!t="t =@t3]]̃%@SV,,;sW>t 8׃;r_^[SV44;sW>t ׃;r_^[%,rh;]d5D$l$l$+SVW1E3PeuEEEEdËMd Y__^[]QUuuu uhE_h ]tUEVtt j VYY^]U%D(S3C j me3 3VWD}S[wOW E؋MEineIE5ntel ȋEj5Genu XjYS[wOW uCE%?=t#=`t=pt=Pt=`t=pu=H=H=H}EEEEE|2jX3S[]؉sKS EܩEEt =H_^tm DtUtN3ЉEUEM3Ƀu3u/DE t D3[]3@39Ë ,r32_; u)Ujpuph pPp]U$jtjY)P LHD5@=<fhf \f8f4f%0f-,`ETEXEdX\P T`jXkǀdjXk LjX Lhx]Uj]UjtM)P LHD5@=<fhf \f8f4f%0f-,`ETEXEdX\P T`jXkMdhx]U jtM)P LHD5@=<fhf \f8f4f%0f-,`ETEXEdX\P T} v }ue } vE HE E @`jXkMdeE@EE;E sEMU hhx]%p%p% p%p%p%p%p% p%$p%(p%,p%0p%4p%8p%Rh|ĥ֥$6FZpئ">hTvb0fާF̧4VrʩԩШȝ">NbxΞzdP8& Ԡ `R>. ПzjXJ8*ޞ:lZ¤~ P2_Onn:SetProcessWorkingSetSizeSetProcessWorkingSetSize%s is not available on this platformSetProcessWorkingSetSizeGetProcessShutdownParameters%s is not available on this platform:GetProcessShutdownParametersGetProcessShutdownParametersllSetProcessShutdownParameters%s is not available on this platformll:SetProcessShutdownParametersSetProcessShutdownParametersGetGuiResources%s is not available on this platformOk:GetGuiResourcesGetGuiResources|O:IsWow64ProcessIsWow64ProcessOOn:ReadProcessMemoryCan't allocate bufferReadProcessMemoryPySTARTUPINFOA Python object, representing a STARTUPINFO structureOOs#:WriteProcessMemoryWriteProcessMemorydwXdwYdwXSizedwYSizedwXCountCharsdwYCountCharsdwFillAttributedwFlagswShowWindowOOOOiOOOO:CreateProcesshStdInputhStdOutputhStdErrorOOOOOiOOOO:CreateProcessAsUserlpDesktoplpTitleO:GetProcessVersionlcan't delete STARTUPINFO attributeshStdInput:GetCurrentProcessIdhStdOutputlhStdErrorlpDesktoplpTitle:GetStartupInfowin32/src/win32process_swig.cppThe object is not a PySTARTUPINFO objectO:GetPriorityClasslPySTARTUPINFO:STARTUPINFOO:GetExitCodeThreadGetExitCodeThreadwin32/src/win32process_swig.cppO:GetExitCodeProcessGetExitCodeProcessUnhandled exception in beginthreadex created thread: win32/src/win32process_swig.cppO:GetWindowThreadProcessIdlOIOOk:beginthreadexfunction must be callablewin32/src/win32process_swig.cppargs must be a tupleNiOOnOOk:CreateRemoteThreadOi:SetThreadPrioritySetThreadPriorityO:GetThreadPriorityCreateRemoteThreadl%s is not available on this platformCreateRemoteThreadNiOO:SetPriorityClassSetPriorityClassOOi:AttachThreadInputAttachThreadInputOO:SetThreadIdealProcessorO:SuspendThreadSuspendThreadO:ResumeThreadResumeThreadenvironment parameter must be a dictionary object of strings or unicode objects.OO:TerminateProcessTerminateProcessc:\src\python-3.8\include\object.hdictionary must have keys and values as strings or unicode objects.All dictionary items must be strings, or all must be unicodeAll dictionary items must be strings, or all must be unicodeO:ExitProcessAll dictionary items must be strings, or all must be unicodeAll dictionary items must be strings, or all must be unicodeallocating environment bufferOOOOO:VirtualAllocExVirtualAllocExOOOO:VirtualFreeExThe command line and application parameters can not both be NoneCreateProcessVirtualFreeExWriteProcessMemoryReadProcessMemoryVirtualFreeExVirtualAllocExIsWow64ProcessGetGuiResourcesSetProcessShutdownParametersGetProcessShutdownParametersSetProcessWorkingSetSizeGetProcessWorkingSetSizeGetProcessWindowStationGetProcessIoCountersGetProcessTimesGetProcessMemoryInfoGetModuleFileNameExEnumProcessModulesExEnumProcessModulesEnumProcessesExitProcessTerminateProcessResumeThreadSuspendThreadSetThreadAffinityMaskSetProcessAffinityMaskGetProcessAffinityMaskSetThreadIdealProcessorAttachThreadInputThe command line and application parameters can not both be NoneSetPriorityClassGetProcessIdCreateProcessAsUserGetThreadTimesGetThreadIOPendingFlagSetThreadPriorityBoostGetThreadPriorityBoostSetProcessPriorityBoostGetProcessPriorityBoost:GetCurrentProcessGetThreadPrioritySetThreadPriorityGetWindowThreadProcessIdGetExitCodeProcessGetExitCodeThreadGetPriorityClassGetStartupInfoGetCurrentProcessIdGetProcessVersionGetProcessPriorityBoostGetCurrentProcess%s is not available on this platformCreateProcessAsUserCreateProcessO:GetProcessPriorityBoostCreateRemoteThreadbeginthreadexSTARTUPINFOGetProcessPriorityBoostwin32processSetProcessPriorityBoost%s is not available on this platformOl:SetProcessPriorityBoostSetProcessPriorityBoostGetThreadPriorityBoost%s is not available on this platformO:GetThreadPriorityBoostGetThreadPriorityBoostSetThreadPriorityBoost%s is not available on this platformOl:SetThreadPriorityBoostSetThreadPriorityBoostGetThreadIOPendingFlag%s is not available on this platformO:GetThreadIOPendingFlagGetThreadIOPendingFlagGetThreadTimes%s is not available on this platformO:GetThreadTimesGetThreadTimesUserTimeUNICODEKernelTimeerrorExitTimeCreationTimePsapi.dll{s:N, s:N, s:N, s:N}Psapi.dllEnumProcessesEnumProcessModulesEnumProcessModulesExGetModuleFileNameExWGetProcessMemoryInfoKernel32.dllGetProcessId%s is not available on this platformKernel32.dllO:GetProcessIdGetProcessTimesGetProcessIoCountersGetProcessShutdownParametersGetProcessIdSetProcessShutdownParametersGetProcessWorkingSetSizeSetProcessWorkingSetSizeGetProcessPriorityBoostSetProcessPriorityBoostGetThreadPriorityBoostSetThreadPriorityBoostSetThreadIdealProcessorGetThreadIOPendingFlag%s is not available on this platformGetThreadTimesCreateRemoteThreadSetThreadIdealProcessorSetThreadIdealProcessorSetProcessAffinityMaskGetProcessIdIsWow64ProcessUser32.dllUser32.dllGetProcessWindowStationGetGuiResourcesO:GetProcessAffinityMaskCREATE_SUSPENDEDMAXIMUM_PROCESSORSTHREAD_PRIORITY_ABOVE_NORMALGetProcessAffinityMaskTHREAD_PRIORITY_BELOW_NORMALNNTHREAD_PRIORITY_HIGHESTTHREAD_PRIORITY_IDLETHREAD_PRIORITY_LOWESTTHREAD_PRIORITY_NORMALTHREAD_PRIORITY_TIME_CRITICALTHREAD_MODE_BACKGROUND_BEGINTHREAD_MODE_BACKGROUND_ENDCREATE_DEFAULT_ERROR_MODECREATE_NEW_CONSOLECREATE_NEW_PROCESS_GROUPOk:SetProcessAffinityMaskCREATE_SEPARATE_WOW_VDMCREATE_SHARED_WOW_VDMCREATE_UNICODE_ENVIRONMENTSetProcessAffinityMaskCREATE_BREAKAWAY_FROM_JOB%s is not available on this platformCREATE_PRESERVE_CODE_AUTHZ_LEVELCREATE_NO_WINDOWDEBUG_PROCESSDEBUG_ONLY_THIS_PROCESSSetProcessAffinityMaskDETACHED_PROCESSABOVE_NORMAL_PRIORITY_CLASSBELOW_NORMAL_PRIORITY_CLASSHIGH_PRIORITY_CLASSIDLE_PRIORITY_CLASSNORMAL_PRIORITY_CLASSREALTIME_PRIORITY_CLASSLIST_MODULES_32BITLIST_MODULES_64BITLIST_MODULES_ALLLIST_MODULES_DEFAULTOk:SetThreadAffinityMaskSTARTF_FORCEONFEEDBACKSTARTF_FORCEOFFFEEDBACKSTARTF_RUNFULLSCREENSTARTF_USECOUNTCHARSSetThreadAffinityMaskSTARTF_USEFILLATTRIBUTESTARTF_USEPOSITIONSTARTF_USESHOWWINDOWSTARTF_USESIZESTARTF_USESTDHANDLESEnumProcesses%s is not available on this platform:EnumProcessesEnumProcesses: unable to allocate Pid listEnumProcessesEnumProcesses: unable to allocate return tuplelwin32/src/win32process_swig.cppEnumProcessModules%s is not available on this platformO:EnumProcessModulesEnumProcessModules: unable to allocate HMODULE listEnumProcessModulesEnumProcessModules: unable to allocate return tuplewin32/src/win32process_swig.cppEnumProcessModulesEx%s is not available on this platformO|k:EnumProcessModulesExEnumProcessModulesEx: unable to allocate HMODULE listEnumProcessModulesExwin32/src/win32process_swig.cppGetModuleFileNameEx%s is not available on this platformOO:GetModuleFileNameExGetModuleFileNameEx: unable to allocate WCHAR bufferGetModuleFileNameExGetProcessMemoryInfo%s is not available on this platformO:GetProcessMemoryInfoGetProcessMemoryInfoPeakPagefileUsagePagefileUsageQuotaNonPagedPoolUsageQuotaPeakNonPagedPoolUsageQuotaPagedPoolUsageQuotaPeakPagedPoolUsageWorkingSetSizePeakWorkingSetSizePageFaultCount{s:k,s:N,s:N,s:N,s:N,s:N,s:N,s:N,s:N}GetProcessTimes%s is not available on this platformO:GetProcessTimeswin32/src/win32process_swig.cppwin32/src/win32process_swig.cppGetProcessTimeswin32/src/win32process_swig.cppUserTimeKernelTimeExitTimeCreationTime{s:N,s:N,s:N,s:N}GetProcessIoCounters%s is not available on this platformO:GetProcessIoCountersGetProcessIoCountersGetProcessWindowStation%s is not available on this platform:GetProcessWindowStationGetProcessWorkingSetSize%s is not available on this platformO:GetProcessWorkingSetSizeGetProcessWorkingSetSizeNN42UUUnknown exception|TUbad allocationȔUUbad array new lengthe]P^_Utt^_ ̕^_ H\`,r<HX`<@H ` @Xܔ씿`X@ܔ,<D@,;]cdd6dRSDS MI]vO?vC:\src\pywin32\build\temp.win32-3.8\Release\win32process.pdbS.text$mncP.text$xp,.idata$5,r.00cfg0r.CRT$XCA4r.CRT$XCZ8r.CRT$XIARh|ĥ֥$6FZpئ">hTvb0fާF̧4VrʩԩШȝ">NbxΞzdP8& Ԡ `R>. ПzjXJ8*ޞ:lZ¤~ PCreateProcessAsUserWADVAPI32.dllAttachThreadInputGetWindowThreadProcessIdUSER32.dllKPyType_ReadyiPyObject_GenericGetAttrkPyObject_GenericSetAttr;PyCallable_Checkz_PyTraceMalloc_NewReference_Py_Dealloc.PyBytes_FromStringAndSize0PyBytes_Size%PyBytes_AsString{PyUnicode_AsUnicodexPyUnicode_AsUTF8PyLong_FromLongPyLong_FromUnsignedLongPyLong_FromSsize_tPyLong_AsLongPyLong_AsUnsignedLongMaskPyLong_FromUnsignedLongLongPyBool_FromLong=PyTuple_New?PyTuple_SetItemPyList_NewPyList_GetItemPyList_AppendPyDict_SetItemStringPyModule_GetDictrPyGILState_EnsuretPyGILState_ReleasePyErr_SetStringPyErr_OccurredPyErr_SetFromErrnoPyErr_Format PyArg_ParseTuplePy_BuildValuePyModule_Create2PyErr_PrintPyEval_CallObjectWithKeywordsPyEval_SaveThreadPyEval_RestoreThreadPyEval_InitThreadsPyMapping_CheckPyMapping_SizePyMapping_KeysPyMapping_ValuesE_Py_tracemalloc_config_Py_NoneStructPyExc_AttributeErrorPyExc_MemoryError'PyExc_RuntimeErrorPyExc_NotImplementedError1PyExc_TypeErrorpython38.dll?PyWin_SetAPIError@@YAPAU_object@@PADJ@Z?PyWinObject_AsWCHAR@@YAHPAU_object@@PAPA_WHPAK@Z?PyWinObject_FreeWCHAR@@YAXPA_W@Z?PyWinObject_FromOLECHAR@@YAPAU_object@@PB_W@Z?PyWinObject_FromOLECHAR@@YAPAU_object@@PB_WH@Z?PyWin_CopyString@@YAPA_WPB_W@Z?PyWinLong_AsVoidPtr@@YAHPAU_object@@PAPAX@Z?PyWinLong_FromVoidPtr@@YAPAU_object@@PBX@Z?PyWinObject_FromFILETIME@@YAPAU_object@@ABU_FILETIME@@@Z?PyWinObject_FromIO_COUNTERS@@YAPAU_object@@PAU_IO_COUNTERS@@@Z?PyWinObject_AsSECURITY_ATTRIBUTES@@YAHPAU_object@@PAPAU_SECURITY_ATTRIBUTES@@H@Z?PyWinObject_AsHANDLE@@YAHPAU_object@@PAPAX@Z?PyWinObject_FromHANDLE@@YAPAU_object@@PAX@Z?PyWinLong_FromHANDLE@@YAPAU_object@@PAX@Z?PyWinGlobals_Ensure@@YAHXZ?PyWinExc_ApiError@@3PAU_object@@Ay?PyHANDLEType@@3U_typeobject@@Apywintypes38.dll]GetLastErrorGetCurrentProcessGetCurrentProcessId\ExitProcessTerminateProcess8GetExitCodeProcessVSetThreadPriorityGetThreadPriority9GetExitCodeThread}SuspendThreadResumeThreadCreateProcessWGetProcessVersionGetStartupInfoW4SetPriorityClassGetPriorityClassVirtualAllocExVirtualFreeExoReadProcessMemoryWriteProcessMemorytGetModuleHandleWGetProcAddressLoadLibraryWGetProcessAffinityMaskKSetThreadAffinityMaskFQueryPerformanceCounterGetCurrentThreadIdGetSystemTimeAsFileTimeDisableThreadLibraryCalls^InitializeSListHeadzIsDebuggerPresentUnhandledExceptionFiltereSetUnhandledExceptionFilterIsProcessorFeaturePresentKERNEL32.dll#__std_terminate__CxxFrameHandler3Hmemset!__std_exception_copy"__std_exception_destroy_CxxThrowException%__std_type_info_destroy_list5_except_handler4_commonVCRUNTIME140.dllfreemalloc__acrt_iob_func__stdio_common_vfprintf_beginthreadex_callnewh8_initterm9_initterm_eA_seh_filter_dll_configure_narrow_argv5_initialize_narrow_environment6_initialize_onexit_table>_register_onexit_function$_execute_onexit_table_crt_atexit_crt_at_quick_exit_cexitjterminateapi-ms-win-crt-heap-l1-1-0.dllapi-ms-win-crt-stdio-l1-1-0.dllapi-ms-win-crt-runtime-l1-1-0.dllu u$u ,u$4u(Du,Tu0du4lu 8t` 0t||07|@6|F|E|5|4|@4}3$}2@}2\}1t} 1}0}.}-}+}0*}(~`E~D$~D4~CD~(\~P't~&~B~B~PA%4$D$\p#t"0"!@`@p?p>(p=<=P@<`<t;`!܀970@dx8PrdmrDN@t.?AVbad_alloc@std@@t.?AVexception@std@@t.?AVbad_array_new_length@std@@t.?AVtype_info@@6GJNPNWN]TULZ[4  0HX  4VS_VERSION_INFO,,?lStringFileInfoH040904E4`$Commentshttps://github.com/mhammond/pywin32"CompanyName*FileDescription4 FileVersion3.8.300.0BInternalNamewin32process.pyd&LegalCopyright*LegalTrademarksJOriginalFilenamewin32process.pyd0ProductNamePyWin328 ProductVersion3.8.300.0DVarFileInfo$Translation PADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPAD40#0\000001 11n11111,2F22223T333334$4:4?4G4Y4i444D5|55555616N6|666666671787v7{777777738;8M8W8x888888889!9/9g9u9999999999:::::D:`:v::::::::; ;1;O;[;`;h;~;;;;;;Z>>>>?b?g?o??????? 00+0b0g0o000000111/1a1k1y111111111112 2252=2B2G2O2e2o2222222222222 3%3;3E3K3\3u3}33333333333444"4'4/4?4I4e4{444444444445*545:5M5e5o5|5555555555556&60666D6Q6Z6_6d6l666666667 77+747:7X7`7e7j7s7777777778858J8U8[8i8888888888 9$93989@9J9s9y999999999: ::5:=:B:G:O:d:x::::::; ;;#;G;w;;;;;;;;;;;;;;<1*>W>g>>>>>>>>>>>>??'???I?O?U?e?v??????????0000"0'0/0?0I0_0000000000001%1-12171?1O1Y1o11111111111111222"2'2/2H2Z2p22222222222222*343P3h3r3x333333333334 44&4,4E4M4R4W4_4444444444444455;5Q5]5g5m5|555555555 666*6R6\6x66666666777H7R7n777777Y8s8888939:9?9G996:P:l:z::::(;/;4;<;;;;;;;;;<<)<5<;>?>I>Z>>>>>>>>>>> ????I?Z??????????@80!030F0u0000000000 1%161<1B1m1w111111111122<2T2\2222222 3333E3U33333333334)4E4T4`4i4x4~44444455$5-5<5B5O5m5w5555556(6_6g6666666'717M7[7777777778 888+8@8F8L8U8Z8a8i8o8888888888888888888999!9(9.959;9B9H9O9U9\9b9i9o9v9|99999999999999999999:::: :':-:7:D:Q:^:n:{:::::::::;;(;8;H;X;h;u;;;;;;;;;; <<&<6B>U>}>>>>>>????? ?&?,?2?8?>?D?J?P?V?\?b?h?n?t?z??????????????????????P@00 0000$0*00060<0B0H0N0T0Z0`00*1:1Q1b1s1x11111 22%272L222V33344$494Q4W4g4444445=5n5555556K7|77777 88D8Y8`8f8x88889959O9W9o9999999:#:8:D:P:V:\:h:::g;;;;;;&<,R>Z>>>>>>???*?5?=?G?]?f?q?x????????????????`0 000 0*040D0T0d0m00000000000000001111'111D1I1p1v1|111111111111111111!202X2_2n2t2z222222222222222222222223 3333"3(3.343:3@3F3L3R3X3^3d3j3p3v3|33333333333333334474p ,2333034383L3P3T3p3t3x3|344 4@4D4T4X4`4x4444444444444445$5(585<5D5\5<8D8P8t888894989@9H9P9T9\9p9x9999999999900(0<0P0d0x0000011 1@1111111111111112 222(2,282<2H2L2X2\2h2l2x2|222222222222222223 333(3,383<3H3L3X3\3h3l3x3|333333333333333334 444(4,484<4H4L4X4\4h4l4x4|44444444444444 5<5X55PK Y03Ka9win32/license.txtUT  YZx`ux Unless stated in the specfic source file, this work is Copyright (c) 1994-2008, Mark Hammond All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. Neither name of Mark Hammond nor the name of contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. PK *$nQ&VVwin32/win32pipe.pydUT ^_ux MZ@ !L!This program cannot be run in DOS mode. $;PSZSZSZZ"FUZhQZ 8QZhRZhYZhXZQZG<PZSZZQZRZRZRichSZPEL^_! (*(@@`PTPTLTL@@p.text&( `.rdata@,@@.data8`H@.gfidspJ@@.rsrcTL@@.relocP@BD$̋D$ uPAY̋D$tu D$%A̡AhA0@3̡AhA0@3̡AhA0@3̡AhA0@3́ $$PD$PhB$4 Au 3 ÍD$Pt$\At<$t D$ L$33hT$$RQPD$$PD$,Pt$ $@uPhBtVYtu ju6 a3@W Ê]uYj hPa3OHatEe=atj%%aEjuYY3ɄutYj h Pz} u9=a3et t]1]SWuuSWuuSWuduu"uSPuLSVuSVu`tuHSWuout5SWu:$MQ0h%uu uËe3uEUV5xLu3@uu u_^] U]U} uuu u ] U졨a3E]U졨aj Y+ȋE3a]UEM ] P1 YUEVH<AQAk(;tM ;J r BB ;r (;u3^]ËUEu2]ùMZf9uH<ȁ9PEu f9A]du2dVaP;t3u2^ð^Mt9Pa Yt2Z jYw u2k ue [ V Uu} uuMPuUuu YY]t ha Y  j Y U}ua u2] u j Y]U Vutu|9t*u&ha] Yt2WhaJ YDauWaj Y+ȃ3aEEEaEEuE_^]jVjh@PeMZf9u]<PEuL f9u>E+PQgYYt'x$|!EE3Ɂ8ËeE2[U(t}u 3a]U=at} uub uZ YY]U졨a3auȃu ha YY#E]U졨a3aȃu] uha YY]UuYH]UeeaVWN@;t t УafEPH@E3EED@1E@@1EEP<@ME3M3M3;uO@u G ȉ aщ a_^]U} u=xLu uL@3@] hal@haYøaøbHHHHø4eU$SVj5tM)3hVP5b* |xffftfpflfhEEDž@jPEVPE E@EEh@VXۍEEۉE`@EPd@u !b^[]UDjDEjP1 EP\@EtEj X]3j0@ȅu2øMZf9uA<8PEu f9HuۃxtvՃh/`@UE8csmu%xu@= t=!t="t =@t3]̃%bSVOO;sW>t 9׃;r_^[SVOO;sW>t ׃;r_^[%pAh0d5D$l$l$+SVWa1E3PeuEEEEdËMd Y__^[]QUuuu uhk2ha]U% b(S3C aj bme3 a3VW b}S[wOW E؋MEineIE5ntel ȋEj5Genu XjYS[wOW uCE%?=t#=`t=pt=Pt=`t=pu=b=b=b}EEEEE|2jX3S[]؉sKS EܩEEt =b_^tm a btUtN3ЉEUEM3Ƀu3u/a bE at  ba3[]3@39aË pA3X2; au(Uj`@ud@h T@PP@]U$jztjY)c cc c5c=cf0cf $cfcfbf%bf-b(cEcE cE,chb c$bb b(bjXkǀ,bjXk aLjX aLh|L]Uj]UjstM)c cc c5c=cf0cf $cfcfbf%bf-b(cEcE cE,c c$bb b(bjXkM,bh|L]U jtM)c cc c5c=cf0cf $cfcfbf%bf-b(cEcE cE,c c$bb b} v }ue } vE HE E @(bjXkM,beE@EE;E sEMU 0bh|L]% @%@%@%@%@% @%@%@%@%p@%$@%(@%,@%0@%4@%8@%<@%@@%D@%H@%L@%l@%h@%d@%`@%\@%X@%T@%P@%@%x@%|@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@ðððð3WWWWWWrWdWTWX0XBXXXlX~XXXXXXYYYnYPY4Y Y YXYYY0Z(ZfZxZXZZLZZ[[([2[ZZ:ZRRSS,S[@R^[@Q~[@WWWWWWrWdWTWX0XBXXXlX~XXXXXXYYYnYPY4Y Y YXYYY0Z(ZfZxZXZZLZZ[[([2[ZZ:ZRRSS,S_register_onexit_function$_execute_onexit_table_crt_atexit_crt_at_quick_exit_cexitjterminateapi-ms-win-crt-heap-l1-1-0.dllapi-ms-win-crt-stdio-l1-1-0.dllapi-ms-win-crt-runtime-l1-1-0.dllHHHPHI I!4IP DIXIlI`|II0II0I`IIJJJpJP JA`DN@6GJ4 0HX4VS_VERSION_INFO,,?\StringFileInfo8040904E4`$Commentshttps://github.com/mhammond/pywin32"CompanyName*FileDescription4 FileVersion3.8.300.0<InternalNamewin32pipe.pyd&LegalCopyright*LegalTrademarksDOriginalFilenamewin32pipe.pyd0ProductNamePyWin328 ProductVersion3.8.300.0DVarFileInfo$Translation PADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPAD0C0Q0V0^0q0v0~0000000001N1X1^1w111111112;2Z2j2q222222223(3.3>3H3t3~333333344444Y4c4444444455!5)5W555555 6626R6k6q6666667 7"7D7M7^7e7k7q77777777788$8W8\8d888888888899$9L9c9l9r9~99999999999::%:+:<:U:]:b:g:o::::::::::;;;;);E;[;e;k;|;;;;;;;;;;< <&>9>E>Z>a>g>>>>>>>>>>2?VӃu_[^E ]W|$GtS`kV0PӃƅu^[G_S`kUl$ VWEt0PӃƅu} Etw7WӃu_^E ][áakakVj `ku |ak3^ËD$Ul$FD$W|$FD$fFnG uw 8t8u0D$UF `kȃNu |ak_]3^Ã~F(u@PUQt$$t$0w%ft%fthdkww5ki3_]^_]^̋D$D$%bk%ak̋D$0akÃVt$D$ D$ $6\$f.D$^$Dz akak̋L$Mba A RPAPAPAPAPPhdk5kak$̃Vt$bkt)jD$ PD$ PVbkuu VLak3^t$t$t$ 5 ^̋L$3fAD$ASUVt$WNF f;u3fF_ffF^][fu't܃"t׃?uFF@FF Ã:uFP aku>3ۋ-akPՃtK HPՃunFCF0>_fF?F ^][VW|$GP`ktT$ F Jr~_^|ak_^Wt$akj`kЃtpVt$ BPjB N JQjjjjjt$0V9v$"ft$fthekvv5kB3^_^_|ak3_̃ SUVW|$(Wak؃ue5akօtYWakD$#‰T$;u օ|$ D$k!UW~D$NfGjD$`k|$$tF Gwn|aktJNݍFPUQjUt$$Sjt$Dw ft)ft#hekww5k_^]3[ _^][ Vt$hkjjjjjjjt$,kv ft#fth8ekvv5k3^ø^UdjhPkPd%j+`kUW@ VWJxHBjGhTekufGM}Gak EBV8akȃMu VLakMuEPEPEPG PGPGPGPGPWh`ekQpak,h|eku@ak}Eu akM,WakMA u akuIMiA A uEjQjjj j ju pftfthekuEEtu WLak}tu VLak_^Md ]3|akM3d ]̃$jPD$ Pt$  bkuSW|$GP`k؃Ul$C VsM ]>{C t$t$W/ +CD$VPWjPjjjt$@uft)ft#hekuu5k3^]_[^]_[|ak_3[̃t$akj\$`kЃt|Vt$B~D$PjB N JQjjjjjt$4Vfvft&ft hekvv5k&3^ø^|ak3VWt$akFFu+FP`kЃS\$B UjK ͉S+ωrD9u vB +B BB hkVUjVQjjt$8Bsft&ft hekss5k13][_^][_^|ak_3^̃SUVt$ VakVD$akX,MQ`k W|$FUt$F OwPnD$ ,- ~F +F FF hkUt$FjSQjjt$@wft)ft#hekww5k93_^][_^][|ak^]3[ÃfT$3S\$$UVWL$3f;u03D$fЋL$,fL$,L$fu_^][fuу'tȃ"tÃ?uE뿃:uP akuCsP3aktO )k*)kc(k(k(k)k(kM)k̃ UV\akl$D$D$PufcSWuL$F;t 6u~Ǚ \$ yOG3ɉ|$uuSFPu!3t&^fuhSuGȁ;|$ r݋D$tfuP FPuD$Pufc-_[t$Xakf^] ̃S\$$3SD$ D$D$D$t3[ÍD$PD$Phfkt$4paktًL$U-LakVW=aktyA@TQ׃t$ak~Jjt$lakV׃tF@TuD$D$D$uVՃjjD$Pt$,bkt:SZC t uPՃjakC u=t$bk_^]3[ËL$Ap hfk5ȗkxak _^][ËL$C(Qffu+MP`kt$0u0C uPՃt$C bk|ak_^][jst$Vl$$\akjVsWXakV6tKhXgkSdl$0C u PLakC 3t$bkU`k_^][Ët$X=ak3V׃fUVlakPD$ak  t$׋L$(Q;t$S V\akjt$4sVXakfcu SW<u|\akD$(PsrVXakD$,D$SD$u PLakt$E=akVD$׃;l$0D$RPakhgkhgk5ȗkxak uhdgk5ȗkak\Ut$S I\akl$0jUsVXakfcu SW.thgkS\S{(~ ak!D$D$Ps.̃ VW|$w(w akD$u_^ SUHX \$~ \ak3ۍn]}t:FD$GFvv`kWFXak ~ \akыNF+UQNQPFPD$4pS WD$XakT$ft fMxF+;E$F^fuKfu˸+؋|$ \akf%\$Nu ak!~u G;LPQvF Ѓt66\$D$][_^ |akD$ @)FD$FD$u PLak][_3^ ËD$u PLakD$ h,hkpp5k3][_^ SVW\ak|$w VXakfduak_^[akft%fthXhkww5k%3_^[W_^[SUVWjak39l$\akD$pN VXakfduakakftfuPt$%aktV;VWaktTu VLakE;l$u_^][ËD$hXhkpp5k4u-WLak3_^][ÃLakuWӃuVӃ_^]3[ÃuVLak_^][t$WQ$$Phhkt$pak uY4$t$ YD$̡akak̋D$Phhkt$pak uáakaḱSV5`kW$j=Wj/WփtRt;rJύQffu+MP`k$Af@fu_^[Ë5ak$hWP֋ak$jh8ikPӃtVhP$PjhtVYtu ju6 k3@[ Ê]uYj hrkk3OHktEe=ktj%%kEjuYY3ɄutYj hrk~} u9=k3et t]1]SWuuSWuuSWuduu"uSPuLSVuSVu`tuHSWuout5SWu:$MQ0h?kuu uËe3uEUV5nku3@uu u^^] U]U} uuu u ] U졨k3E]U졨kj Y+ȋE3k]UEM ] P YUEVH<AQAk(;tM ;J r BB ;r (;u3^]ËUEu2]ùMZf9uH<ȁ9PEu f9A]du2dV kP;t3u2^ð^Qt=PO Yt2H jYe u2Y uS I D Uu} uuMPuUuu YY]t hk Y  j Y U}u(k u2] u j Y]U Vutu|=t*u&hkK Yt2Whk8 YDkuWkj Y+ȃ3kEEEkEEuE_^]jVjhskeMZf9ku]<kkPEuL f9ku>Ek+PQgYYt'x$|!EE3Ɂ8ËeE2_U,t}u 3 k]U=(kt} uuP uH YY]U졨k3kuȃu hk YY#E]U졨k3kȃu] uhk YY]UuYH]UeekVWN@;t t УkfEP,`kE3EE0`k1E4`k1EEP8`kME3M3M3;uO@u G ȉ kщ k_^]U} u=nku u(`k3@] h0k$`kh0kXYø8kø@kHHHHøtkU$SVjtM)3hVP5Hk |xffftfpflfhEEDž@jPEVPcE E@EE `kVXۍEEۉE`kEP`ku !Hk^[]UDjDEjP EP`kEtEj X]3j `kȅu2øMZf9uA<8PEu f9HuۃxtvՃhdIk`kUE8csmu%xu@= t=!t="t =@t3]̃%HkSV\rk\rk;sW>t 8׃;r_^[SVdrkdrk;sW>t ׃;r_^[% bkhkJkd5D$l$l$+SVWk1E3PeuEEEEdËMd Y__^[]QUuuu uhKLkhkg]U%Lk(S3C kj me3 k3VWLk}S[wOW E؋MEineIE5ntel ȋEj5Genu XjYS[wOW uCE%?=t#=`t=pt=Pt=`t=pu=Pk=Pk=Pk}EEEEE|2jX3S[]؉sKS EܩEEt =Pk_^tm kLktUtN3ЉEUEM3Ƀu3u/kLkE kt Lkk3[]3@39kË bk38Lk; ku(Uj`ku`kh `kP`k]U$j&tjY)Xk TkPkLk5Hk=Dkfpkf dkf@kfzvzvvvvvwy~yjyVyzvzvvvvvwy~yjyVy_register_onexit_function$_execute_onexit_table_crt_atexit_crt_at_quick_exit_cexitjterminateapi-ms-win-crt-string-l1-1-0.dllapi-ms-win-crt-heap-l1-1-0.dllapi-ms-win-crt-utility-l1-1-0.dllapi-ms-win-crt-math-l1-1-0.dllapi-ms-win-crt-runtime-l1-1-0.dlldk kdkkdk kdkkdkPkdkik 7kik@8k$ik 0ik$kkkkkkkklklklk(lk4lk@lkLlkXlkdlkplk|lklklklklklklklklklklkmk mkmk$mk0mkG>b>v>>>>>>>?G?r????? j0v0000%111P1h1112&2E2]2h2x2233C333384R4]444445%5*535555555%6,6|777777X8_8k88888888 9$989G9W9n9999999 ::::: :$:(:W:[;;;;;<=i=======>>K>e>>>>>>????+?1?7?X?s???00-0_0i0|00 1(1r1111111 22&222h222222223#373J3p333333444*4o444445555=6M6U666607:7Z7g7m7{777777 88*8L8Y8888888 9/959R9e9k9~999999999999:: :%:*:0:?:F:Z:c:l:s:x::::::::: ;;";:;D;R;j;t;;;;;;;;;<<&<,<1<6<;<@>>>> >&>,>2>8>>>D>J>P>V>\>b>h>n>t>z>>>>>>>>>>>>>>>>>>>>>>>? ????"?(?.?4?:?@?F?L?R?X?^?d?j?p?v?|????????@)090P0a0r0w00000 11$161K111U222233x444 55*5:5K5q555555 66A6I6b6|6666667 77H7P7e7q7}7777777888889Y9_999999::.:{::::::O;X;`;;;;;; <<<0<; >>>">,>6>I>N>u>{>>>>>>>>>>>>>>>>>>>&?5?]?d?t?z??????????????????????P400 0000$0*00060<0B0H0N0T0Z0`0f0l0r00` 2(2,2>>t?x??pl2t222222330000 0$00040@0D0`00000000111(141@1L1X1d1p1|111111111112 22$202<2H2T2`2l2x22222222222233 3,383D3P3\3h3t333333333333444(444@4L4X4d4p4|444444444445 55$505@5D5P5T5`5d5p5t55555555546866677t7x77PK *$nQ@A1rrwin32/win32pdh.pydUT ^_ux MZ@ !L!This program cannot be run in DOS mode. $-DCCCCBCBC@CFCGCABCBCBCAFCACCAACRichCPEL^_! 86%8P@jPkTDcTd@Ph.text68 `.rdatax%P&<@@.datab@.gfidsd@@.rsrcTf@@.relocDj@BD$̋D$ uP$QY̋D$tu D$%$QWhWtVYtu ju6 83@[ Ê]uYj hHj83OH8tEe=<tj%%<EjuYY3ɄutYj hhj~} u9=83et t]1]SWuuSWuuSWuduu"uSPuLSVuSVu`tuHSWuout5SWu:$MQ0h5uu uËe3uEUV5cu3@uu u^^] U]U} uuu u ] U؁3E]U؁j Y+ȋE3؁]UEM ] P YUEVH<AQAk(;tM ;J r BB ;r (;u3^]ËUEu2]ùMZf9uH<ȁ9PEu f9A]du2dV@P;t3u2^ð^Qt=P# Yt2 jY9 u2- u'   Uu} uuMPuUuu YY]t hD Y  j Y U}u\ u2] u j Y]U Vutu|=t*u&hD Yt2WhP YD؁uWDj Y+ȃ3؁EEEPEEuE_^]jVjhjeMZf9u]<PEuL f9u>E+PQgYYt'x$|!EE3Ɂ8ËeE2_U,t}u 3@]U=\t} uu$ u YY]U؁3Duȃu hD YY#E]U؁3Pȃu] uhP YY]UuYH]Uee؁VWN@;t t УԁfEPPE3EEP1E P1EEPPME3M3M3;uO@u G ȉ ؁щ ԁ_^]U} u=cu uP3@] h`Ph`RYøhøpHHHHøU$SVjtM)3hVP5x |xffftfpflfhEEDž@jPEVP]E E@EEPVXۍEEۉE$PEP Pu !x^[]UDjDEjP EP8PEtEj X]3j0Pȅu2øMZf9uA<8PEu f9HuۃxtvՃh>$PUE8csmu%xu@= t=!t="t =@t3]̃%xSV$g$g;sW>t 8׃;r_^[SV,g,g;sW>t ׃;r_^[%hQh?d5D$l$l$+SVW؁1E3PeuEEEEdËMd Y__^[]QUuuu uhAh؁a]U%|(S3C Ёj me3 Ё3VW|}S[wOW E؋MEineIE5ntel ȋEj5Genu XjYS[wOW uCE%?=t#=`t=pt=Pt=`t=pu===}EEEEE|2jX3S[]؉sKS EܩEEt =_^tm Ё|tUtN3ЉEUEM3Ƀu3u/Ё|E Ёt |Ё3[]3@39܁Ë hQ3A; ؁u(Uj$Pu Ph ,PP(P]U$j&tjY) |5x=tff fpflf%hf-dEEE؂ jXkǀjXk ؁LjX ԁLhc]Uj]UjtM) |5x=tff fpflf%hf-dEEE jXkMhc]U jOtM) |5x=tff fpflf%hf-dEEE } v }ue } vE HE E @jXkMeE@EE;E sEMU hc]%P%s"ss rssssstt"ts"ss rssssstt"t_register_onexit_function$_execute_onexit_table_crt_atexit_crt_at_quick_exit_cexitjterminateapi-ms-win-crt-string-l1-1-0.dllapi-ms-win-crt-heap-l1-1-0.dllapi-ms-win-crt-runtime-l1-1-0.dlltTTTTTTTTPTTU` 0Up"DU #TU#hU %|U&U(U`*UP.U/U@0QQQQQQQQ RUVuDN@6GJ4 0HX4VS_VERSION_INFO,,?\StringFileInfo8040904E4`$Commentshttps://github.com/mhammond/pywin32"CompanyName*FileDescription4 FileVersion3.8.300.0: InternalNamewin32pdh.pyd&LegalCopyright*LegalTrademarksB OriginalFilenamewin32pdh.pyd0ProductNamePyWin328 ProductVersion3.8.300.0DVarFileInfo$Translation PADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPAD0C0R0X0g0l0t0z0000000000000000000001 1111#1*10171=1D1J1Q1W1^1d1k1q1y1111111.272^2e2j2o2w222 3*3A3G3[3s3~33333333344*404<4b444455 555G5}55555555656?6O6U6e6y6666666666 77)7C7R7k7t7~7777777777 88+8;8I8c8r888888888999"9'9/9@9L9U9b9h9v99999999999 :':6:K:T:^:k:q::::::::::; ;;";(;6;?;U;];b;g;o;;;;f(>5>;>[>q>>>>> ??-?:?B?G?L?T?e???????  000&050;0w0000000000011)1S1\1j1p1v11111112#272<2D2Y2x222222222222233)333@3H3M3R3Z3v33333333 4444:4G4a4j4z44444444445&5K5T5555555556 666-6;6@6H6e6n6{66666666 7#70787=7B7J7n7777777778(8>8K8S8X8]8e8v888888889.9L9r9z999999999999 :: :;:d:}::::::::; ;,;1;9;O;a;x;<<=H=[======= >>%>2>Y>c>}>>>>>>>>>>>>>?4?=?o????????0|000$040L0]0e0j0o0w000000 11&1O1U1a1m1y1111111111 2222(222<2F2S2`2m2z2222222222233M3l3|3333 4 4&4,42484>4D4J4P4V4\4b4h4n4t4z444444444444444444444445 55j5555555666_6|666666 777L8`8s8%99:h:{::::::::;;;};;;;;;; <=)>3>D>j>>>>? ?%?K?P?u?????@ 00,0700001&1-1c1l1y11111111111222 2&2,232:2A2H2O2V2]2e2m2u2222222222233!3'3-333:3A3H3O3V3]3d3l3t3|33333333333334 4444&4-444<4D4L4W4\4b4l444444444455555 5&5,52585>5D5J5P5V5\5b5h5n5t5z555555555555!696Q6c6666P h1`X33D4H4P4X7`7x77777888\8|888888,949<9D999999::$:@:`:|::::t0000 0$00040@0D0P0T0`0d0p0t000000000000000001111 1$10141@1D1`1d1h1l1p1t1x1|11111PK #$nQkL' <<win32/perfmondata.dllUT ^_ux MZ@ !L!This program cannot be run in DOS mode. ${|{|{|{|%}{|%{|%y{|%x{|}{|{}{|g%y{|g%|{|g%{|g%~{|Rich{|PEL^_! 0q@@66x`$ p@2T2@0.text" `.rdata 0 @@.data@*@.gfidsP,@@.rsrc$ ` .@@.relocp8@B=X@qVW 2q1q$2q|$4D$0D$~2qf_fD$$^un$PhjD$8Ph 0qD$u=D$PD$ PD$PjD$ Pt$0q4$DL$ X@q0q X@qd@quC$P0qd@qt2=X@qrjjjjjhl@jjP0qd@qtT@qĘ̡d@qt8-T@qu/=X@qrjjjjjh@jjP0qd@qP0q̋L$uf9tW@q+V4ftf;uf:u^_ÿ@q+D4ftf;uf:u^_þ @q+ftf;uf9u^_^_W|$ u3_S3Ul$V3YD uB%fu0s f9f;@t,t u=3븅t;t63ft93ɻ띅۸E3ۅt I Hz^][_^][3_́Hh$0jP DŽ$$P$0q$v0q$,VBqWffu$4+փffGfu\@qʃ$4Pjj(0qh@qt@quFhBqZd@q=X@qrjjjjjhjjP0q 0q_^HjjjjP,0qp@qu,hBqd@q=X@qrjjjjjh렃8ptDhBqd@q=X@qrjjjjjhjjP0qD$_^H>P1qp@qd@q H1qD$D$X1qfL1qfD$\D$((1qD$881qD$Hffu|$+փfGfuʃ|$fGfuD$P1qPh?jD$$fPh 0qD$t>=X@qD$Pjjjjhjj5d@q0qD$_^H50qD$ PhDqD$D$Pjhl1qt$$։D$t!=X@qD$Pjjjjh뎍D$ D$ PhDqD$Pjh1qt$$։D$t =X@qr8D$PjjjjhBt$0q\@q`@q@\@q3_^H̃=`@qV5p@q~S\$ SuD$[^D$3Ul$W~pmu4G DqSPSuD$_][D$^3\$vp93sD$ _][^VWU|0qDq3E DqE9W vMLDqI(ABDqA;W rD$_]0D$33[^D$^D$3̃-\@quW5h@q0qd@qt@qt8-T@qu/=X@qrjjjjjh@jjP0qd@qP0q3̃l$u_D$VWhhx@qPl@q00q5l0qj\hx@qֹx@qj.QxD֋+VWhBq0q3fuBq_^ %l0q%0q%0q%0q%0q% 0q%0qUE t3t tt3@0f@uuY}PY] jh5q jYu3E]e=DqtjkDqte= h"qP$M q?$0qh0qhYYu)Kt h0qh0qDYYDq2ۈ]EDL>tVYtu ju6Dq3@5 Ê]uYj h5qDq3OHDqtEe=Dqtj^%%DqEjuYY3ɄutYj h5qX} u9=Dq3et t]1]SWuuSWuuSWuuu"uSPuSVuSVu`tuHSWuout5SWu:$MQ0hquu uËe3uEUV5(2qu3@uu u=^] U]U} uuu u ] UH@q3E]UH@qj Y+ȋE3H@q]UEM ]P YUEVH<AQAk(;tM ;J r BB ;r (;u3^]ËUEu2]ùMZf9uH<ȁ9PEu f9A]d`u2dVDqP;t3u2^ð^+tP Yt2 jY u2 u  Uu} uuMPuUuu YY]t hDq Y  j Y U}uDqr u2]e u jc Y]U Vutu|t*u&hDq Yt2WhDq YDH@quWDqj Y+ȃ3H@qEEEDqEEuE_^]j5jh6qpeMZf9qu]<qqPEuL f9qu>Eq+PQgYYt'x$|!EE3Ɂ8ËeE29Ut}u 3Dq]U=Dqt} uu u YY]UH@q3Dquȃu hDq YY#E]UH@q3Dqȃu] uhDqa YY]UuYH]UeeH@qVWN@;t t УD@qfEP@0qE3EE<0q1E80q1EEP40qME3M3M3;uO@u G ȉ H@qщ D@q_^]hDqD0qhDq_YøDqøDqHHHHøHqU$SVjtM)3hVP5Dq |xffftfpflfhEEDž@jPEVPjE E@EEH0qVXۍEEۉEP0qEPL0qu !Dq^[]UDjDEjP EPT0qEtEj X]3j\0qȅu2øMZf9uA<8PEu f9HuۃxtvՃh)"qP0qUE8csmu%xu@= t=!t="t =@t3]̃%DqSV5q5q;sW>t 8׃;r_^[SV5q5q;sW>t ׃;r_^[%0qh+#qd5D$l$l$+SVWH@q1E3PeuEEEEdËMd Y__^[]QUuuu uh %qhH@qs]U%Dq(S3C @@qj me3 @@q3VWDq}S[wOW E؋MEineIE5ntel ȋEj5Genu XjYS[wOW uCE%?=t#=`t=pt=Pt=`t=pu=Dq=Dq=Dq}EEEEE|2jX3S[]؉sKS EܩEEt =Dq_^tm @@qDqtUtN3ЉEUEM3Ƀu3u/@@qDqE @@qt Dq@@q3[]3@39L@qË 0q3$q; H@qu(UjP0quL0qh `0qPd0q]U$j8tjY)Eq EqEqEq5Eq=EqfFqf EqfEqfEqf%Eqf-EqEqEEqEEqEEq8EqEqDqDq DqDqjXkǀDqjXk H@qLjX D@qLh,2q]Uj]Uj1tM)Eq EqEqEq5Eq=EqfFqf EqfEqfEqf%Eqf-EqEqEEqEEqEEqEqDqDq DqDqjXkMDqh,2q]U jatM)Eq EqEqEq5Eq=EqfFqf EqfEqfEqf%Eqf-EqEqEEqEEqEEqEqDqDq Dq} v }ue } vE HE E @DqjXkMDqeE@EE;E sEMU Eqh,2q]%0q% 0q%$0q%(0q%,0q%00q%40q%80q%<0q%@0q%D0q%H0q%L0q%P0q%T0q%X0q%\0q%`0q%d0q%|0q%l0q%p0q%t0q%x0q%0q%0q%0q%0q%0q%0q%0q%0q%0q%0q%0q%0q%0qðððð3(8@8P8^8n8888888889(9>9X9n9999999:>:H:R:r:4:;:::::;,;H;`;n;;:$qGlobal\SYSTEM\CurrentControlSet\Services\\PerformanceFirst CounterFirst HelpSOFTWARE\Microsoft\WindowsNT\CurrentVersion\PerflibEventLogLevelDq8Eq^_T3!^_ X3X!^_ <l3l!\H@q3q0q+#RSDSnF5GK$@C:\src\pywin32\build\temp.win32-3.8\Release\perfmondata.pdb".text$mn0.idata$50.00cfg0.CRT$XCA0.CRT$XCZ0.CRT$XIA0.CRT$XIZ0.CRT$XPA0.CRT$XPZ0.CRT$XTA0.CRT$XTZ0.rdata3.rdata$sxdata3.rdata$zzzdbg5.rtc$IAA5.rtc$IZZ5.rtc$TAA5.rtc$TZZ5.xdata$x@6.edata6d.idata$2<7.idata$3P7.idata$48.idata$6@P.dataP@.bssP.gfids$y``.rsrc$01``.rsrc$02q]q2qQqqq^_6h6t66P666perfmondata.dllClosePerformanceDataCollectPerformanceDataOpenPerformanceDataP780l7&:07:l08;07;0(8@8P8^8n8888888889(9>9X9n9999999:>:H:R:r:4:;:::::;,;H;`;n;;:DeregisterEventSourceRegisterEventSourceWReportEventW[RegCloseKeyRegOpenKeyExWRegQueryValueExWADVAPI32.dllCloseHandle]GetLastErrorGetVersionExWOpenFileMappingWMapViewOfFilepGetModuleFileNameWFQueryPerformanceCounterGetCurrentProcessIdGetCurrentThreadIdGetSystemTimeAsFileTime^InitializeSListHeadzIsDebuggerPresentUnhandledExceptionFiltereSetUnhandledExceptionFilterGetStartupInfoWIsProcessorFeaturePresenttGetModuleHandleWGetCurrentProcessTerminateProcessKERNEL32.dllGmemmoveOwcsrchrHmemset%__std_type_info_destroy_list5_except_handler4_commonVCRUNTIME140.dllwcsncpy8_initterm9_initterm_eA_seh_filter_dll_configure_narrow_argv5_initialize_narrow_environment6_initialize_onexit_table>_register_onexit_function$_execute_onexit_table_crt_atexit_crt_at_quick_exit_cexitjterminateapi-ms-win-crt-string-l1-1-0.dllapi-ms-win-crt-runtime-l1-1-0.dllGlobalForeignCostlyDN@6GJ4  8Ph ` fl@l@(@@hAn extensible counter has opened the Event Log. hAn extensible counter has closed the Event Log. Unable to open mapped file containing the performance data. Unable to map to shared memory file containing the performance data. Unable open "Performance" key of application in registry. Status code is returned in data. Unable to read the "First Counter" value under the {application}\Performance Key. Status codes returned in data. Unable to read the "First Help" value under the {application}\Performance Key. Status codes returned in data. The collection DLL and application have mismatched structure sizes. The versions are probably not in synch. 4VS_VERSION_INFO,,?dStringFileInfo@040904E4`$Commentshttps://github.com/mhammond/pywin32"CompanyName*FileDescription4 FileVersion3.8.300.0@InternalNameperfmondata.dll&LegalCopyright*LegalTrademarksHOriginalFilenameperfmondata.dll0ProductNamePyWin328 ProductVersion3.8.300.0DVarFileInfo$Translation PADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPAD@000!080_00000000000111$1A1F1M1v11133!3]33333333333344,494?4\4{44444444575E5h5n55555556&6+616;6R6`6677"727>777777777778 8888#8=8C8P8b8h8n8t8z88889969G9X9]9v9{99999 ::1:o::;;n;;;;<^====>> >1>W>l>s>y>>>>?'?/?H?b?j??????? L0/070B0H0N0Z0`000_1~111112$2l2u2z222222;3@3S3a3|3344 4g4v4}444444445 5#5,575>5^5d5j5p5v5|55555555555555555 66)626e6k6q6w6}66666666666666666 7757;7A7G7M7S7Z7a7h7o7v7}777777777778$848:8@8F8L8R8X8^8d8j8p8v8|888888888888888888888899 90 0,20222255 66,606PK {R win32/Demos/UT Zx`Zx`ux PK ѳPg77win32/Demos/desktopmanager.pyUT l_Zx`ux # Demonstrates using a taskbar icon to create and navigate between desktops import win32api, win32con, win32gui, win32service, win32process import pywintypes import traceback, _thread, time import io ## "Shell_TrayWnd" is class of system tray window, broadcasts "TaskbarCreated" when initialized def desktop_name_dlgproc(hwnd,msg,wparam,lparam): """ Handles messages from the desktop name dialog box """ if msg in (win32con.WM_CLOSE,win32con.WM_DESTROY): win32gui.DestroyWindow(hwnd) elif msg == win32con.WM_COMMAND: if wparam == win32con.IDOK: desktop_name=win32gui.GetDlgItemText(hwnd, 72) print('new desktop name: ',desktop_name) win32gui.DestroyWindow(hwnd) create_desktop(desktop_name) elif wparam == win32con.IDCANCEL: win32gui.DestroyWindow(hwnd) def get_new_desktop_name(parent_hwnd): """ Create a dialog box to ask the user for name of desktop to be created """ msgs={win32con.WM_COMMAND:desktop_name_dlgproc, win32con.WM_CLOSE:desktop_name_dlgproc, win32con.WM_DESTROY:desktop_name_dlgproc} # dlg item [type, caption, id, (x,y,cx,cy), style, ex style style=win32con.WS_BORDER|win32con.WS_VISIBLE|win32con.WS_CAPTION|win32con.WS_SYSMENU ## |win32con.DS_SYSMODAL h=win32gui.CreateDialogIndirect( win32api.GetModuleHandle(None), [['One ugly dialog box !',(100,100,200,100),style,0], ['Button','Create', win32con.IDOK, (10,10,30,20),win32con.WS_VISIBLE|win32con.WS_TABSTOP|win32con.BS_HOLLOW|win32con.BS_DEFPUSHBUTTON], ['Button','Never mind', win32con.IDCANCEL, (45,10,50,20),win32con.WS_VISIBLE|win32con.WS_TABSTOP|win32con.BS_HOLLOW], ['Static','Desktop name:',71,(10,40,70,10),win32con.WS_VISIBLE], ['Edit','',72,(75,40,90,10),win32con.WS_VISIBLE]], parent_hwnd, msgs) ## parent_hwnd, msgs) win32gui.EnableWindow(h,True) hcontrol=win32gui.GetDlgItem(h,72) win32gui.EnableWindow(hcontrol,True) win32gui.SetFocus(hcontrol) def new_icon(hdesk,desktop_name): """ Runs as a thread on each desktop to create a new tray icon and handle its messages """ global id id=id+1 hdesk.SetThreadDesktop() ## apparently the threads can't use same hinst, so each needs its own window class windowclassname='PythonDesktopManager'+desktop_name wc = win32gui.WNDCLASS() wc.hInstance = win32api.GetModuleHandle(None) wc.lpszClassName = windowclassname wc.style = win32con.CS_VREDRAW | win32con.CS_HREDRAW | win32con.CS_GLOBALCLASS wc.hCursor = win32gui.LoadCursor( 0, win32con.IDC_ARROW ) wc.hbrBackground = win32con.COLOR_WINDOW wc.lpfnWndProc = icon_wndproc windowclass = win32gui.RegisterClass(wc) style = win32con.WS_OVERLAPPED | win32con.WS_SYSMENU hwnd = win32gui.CreateWindow(windowclass, 'dm_'+desktop_name, win32con.WS_SYSMENU, 0, 0, win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT, 0, 0, wc.hInstance, None) win32gui.UpdateWindow(hwnd) flags = win32gui.NIF_ICON | win32gui.NIF_MESSAGE | win32gui.NIF_TIP notify_info = (hwnd, id, flags, win32con.WM_USER+20, hicon, 'Desktop Manager (%s)' %desktop_name) window_info[hwnd]=notify_info ## wait for explorer to initialize system tray for new desktop tray_found=0 while not tray_found: try: tray_found=win32gui.FindWindow("Shell_TrayWnd",None) except win32gui.error: traceback.print_exc time.sleep(.5) win32gui.Shell_NotifyIcon(win32gui.NIM_ADD, notify_info) win32gui.PumpMessages() def create_desktop(desktop_name, start_explorer=1): """ Creates a new desktop and spawns a thread running on it Will also start a new icon thread on an existing desktop """ sa=pywintypes.SECURITY_ATTRIBUTES() sa.bInheritHandle=1 try: hdesk=win32service.CreateDesktop(desktop_name, 0, win32con.MAXIMUM_ALLOWED, sa) except win32service.error: traceback.print_exc() errbuf=io.StringIO() traceback.print_exc(None,errbuf) win32api.MessageBox(0, errbuf.getvalue(), 'Desktop creation failed') return if start_explorer: s=win32process.STARTUPINFO() s.lpDesktop=desktop_name prc_info=win32process.CreateProcess(None, "Explorer.exe",None,None,True,win32con.CREATE_NEW_CONSOLE,None,'c:\\',s) th=_thread.start_new_thread(new_icon,(hdesk,desktop_name)) hdesk.SwitchDesktop() def icon_wndproc(hwnd, msg, wp, lp): """ Window proc for the tray icons """ if lp==win32con.WM_LBUTTONDOWN: ## popup menu won't disappear if you don't do this win32gui.SetForegroundWindow(hwnd) curr_desktop=win32service.OpenInputDesktop(0,True,win32con.MAXIMUM_ALLOWED) curr_desktop_name=win32service.GetUserObjectInformation(curr_desktop,win32con.UOI_NAME) winsta=win32service.GetProcessWindowStation() desktops=winsta.EnumDesktops() m=win32gui.CreatePopupMenu() desktop_cnt=len(desktops) ## *don't* create an item 0 for d in range(1, desktop_cnt+1): mf_flags=win32con.MF_STRING ## if you switch to winlogon yourself, there's nothing there and you're stuck if desktops[d-1].lower() in ('winlogon','disconnect'): mf_flags=mf_flags|win32con.MF_GRAYED|win32con.MF_DISABLED if desktops[d-1]==curr_desktop_name: mf_flags=mf_flags|win32con.MF_CHECKED win32gui.AppendMenu(m, mf_flags, d, desktops[d-1]) win32gui.AppendMenu(m, win32con.MF_STRING, desktop_cnt+1, 'Create new ...') win32gui.AppendMenu(m, win32con.MF_STRING, desktop_cnt+2, 'Exit') x,y=win32gui.GetCursorPos() d=win32gui.TrackPopupMenu(m,win32con.TPM_LEFTBUTTON|win32con.TPM_RETURNCMD|win32con.TPM_NONOTIFY, x,y, 0, hwnd, None) win32gui.PumpWaitingMessages() win32gui.DestroyMenu(m) if d==desktop_cnt+1: ## Create new get_new_desktop_name(hwnd) elif d==desktop_cnt+2: ## Exit win32gui.PostQuitMessage(0) win32gui.Shell_NotifyIcon(win32gui.NIM_DELETE, window_info[hwnd]) del window_info[hwnd] origin_desktop.SwitchDesktop() elif d>0: hdesk=win32service.OpenDesktop(desktops[d-1],0,0,win32con.MAXIMUM_ALLOWED) hdesk.SwitchDesktop() return 0 else: return win32gui.DefWindowProc(hwnd, msg, wp, lp) window_info={} origin_desktop=win32service.OpenInputDesktop(0, True, win32con.MAXIMUM_ALLOWED) origin_desktop_name=win32service.GetUserObjectInformation(origin_desktop, win32service.UOI_NAME) hinst=win32api.GetModuleHandle(None) try: hicon=win32gui.LoadIcon(hinst, 1) ## python.exe and pythonw.exe except win32gui.error: hicon=win32gui.LoadIcon(hinst, 135) ## pythonwin's icon id=0 create_desktop(str(origin_desktop_name),0) ## wait for first thread to initialize its icon while not window_info: time.sleep(1) ## exit when last tray icon goes away while window_info: win32gui.PumpWaitingMessages() time.sleep(3) PK ѳPm TTwin32/Demos/win32gui_taskbar.pyUT l_Zx`ux # Creates a task-bar icon. Run from Python.exe to see the # messages printed. import win32api, win32gui import win32con, winerror import sys, os class MainWindow: def __init__(self): msg_TaskbarRestart = win32gui.RegisterWindowMessage("TaskbarCreated"); message_map = { msg_TaskbarRestart: self.OnRestart, win32con.WM_DESTROY: self.OnDestroy, win32con.WM_COMMAND: self.OnCommand, win32con.WM_USER+20 : self.OnTaskbarNotify, } # Register the Window class. wc = win32gui.WNDCLASS() hinst = wc.hInstance = win32api.GetModuleHandle(None) wc.lpszClassName = "PythonTaskbarDemo" wc.style = win32con.CS_VREDRAW | win32con.CS_HREDRAW; wc.hCursor = win32api.LoadCursor( 0, win32con.IDC_ARROW ) wc.hbrBackground = win32con.COLOR_WINDOW wc.lpfnWndProc = message_map # could also specify a wndproc. # Don't blow up if class already registered to make testing easier try: classAtom = win32gui.RegisterClass(wc) except win32gui.error as err_info: if err_info.winerror!=winerror.ERROR_CLASS_ALREADY_EXISTS: raise # Create the Window. style = win32con.WS_OVERLAPPED | win32con.WS_SYSMENU self.hwnd = win32gui.CreateWindow( wc.lpszClassName, "Taskbar Demo", style, \ 0, 0, win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT, \ 0, 0, hinst, None) win32gui.UpdateWindow(self.hwnd) self._DoCreateIcons() def _DoCreateIcons(self): # Try and find a custom icon hinst = win32api.GetModuleHandle(None) iconPathName = os.path.abspath(os.path.join( os.path.split(sys.executable)[0], "pyc.ico" )) if not os.path.isfile(iconPathName): # Look in DLLs dir, a-la py 2.5 iconPathName = os.path.abspath(os.path.join( os.path.split(sys.executable)[0], "DLLs", "pyc.ico" )) if not os.path.isfile(iconPathName): # Look in the source tree. iconPathName = os.path.abspath(os.path.join( os.path.split(sys.executable)[0], "..\\PC\\pyc.ico" )) if os.path.isfile(iconPathName): icon_flags = win32con.LR_LOADFROMFILE | win32con.LR_DEFAULTSIZE hicon = win32gui.LoadImage(hinst, iconPathName, win32con.IMAGE_ICON, 0, 0, icon_flags) else: print("Can't find a Python icon file - using default") hicon = win32gui.LoadIcon(0, win32con.IDI_APPLICATION) flags = win32gui.NIF_ICON | win32gui.NIF_MESSAGE | win32gui.NIF_TIP nid = (self.hwnd, 0, flags, win32con.WM_USER+20, hicon, "Python Demo") try: win32gui.Shell_NotifyIcon(win32gui.NIM_ADD, nid) except win32gui.error: # This is common when windows is starting, and this code is hit # before the taskbar has been created. print("Failed to add the taskbar icon - is explorer running?") # but keep running anyway - when explorer starts, we get the # TaskbarCreated message. def OnRestart(self, hwnd, msg, wparam, lparam): self._DoCreateIcons() def OnDestroy(self, hwnd, msg, wparam, lparam): nid = (self.hwnd, 0) win32gui.Shell_NotifyIcon(win32gui.NIM_DELETE, nid) win32gui.PostQuitMessage(0) # Terminate the app. def OnTaskbarNotify(self, hwnd, msg, wparam, lparam): if lparam==win32con.WM_LBUTTONUP: print("You clicked me.") elif lparam==win32con.WM_LBUTTONDBLCLK: print("You double-clicked me - goodbye") win32gui.DestroyWindow(self.hwnd) elif lparam==win32con.WM_RBUTTONUP: print("You right clicked me.") menu = win32gui.CreatePopupMenu() win32gui.AppendMenu( menu, win32con.MF_STRING, 1023, "Display Dialog") win32gui.AppendMenu( menu, win32con.MF_STRING, 1024, "Say Hello") win32gui.AppendMenu( menu, win32con.MF_STRING, 1025, "Exit program" ) pos = win32gui.GetCursorPos() # See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/menus_0hdi.asp win32gui.SetForegroundWindow(self.hwnd) win32gui.TrackPopupMenu(menu, win32con.TPM_LEFTALIGN, pos[0], pos[1], 0, self.hwnd, None) win32gui.PostMessage(self.hwnd, win32con.WM_NULL, 0, 0) return 1 def OnCommand(self, hwnd, msg, wparam, lparam): id = win32api.LOWORD(wparam) if id == 1023: import win32gui_dialog win32gui_dialog.DemoModal() elif id == 1024: print("Hello") elif id == 1025: print("Goodbye") win32gui.DestroyWindow(self.hwnd) else: print("Unknown command -", id) def main(): w=MainWindow() win32gui.PumpMessages() if __name__=='__main__': main() PK ѳP>0!win32/Demos/win32clipboardDemo.pyUT l_Zx`ux # win32clipboardDemo.py # # Demo/test of the win32clipboard module. from win32clipboard import * from pywin32_testutil import str2bytes # py3k-friendly helper import win32con import types if not __debug__: print("WARNING: The test code in this module uses assert") print("This instance of Python has asserts disabled, so many tests will be skipped") cf_names = {} # Build map of CF_* constants to names. for name, val in list(win32con.__dict__.items()): if name[:3]=="CF_" and name != "CF_SCREENFONTS": # CF_SCREEN_FONTS==CF_TEXT!?!? cf_names[val] = name def TestEmptyClipboard(): OpenClipboard() try: EmptyClipboard() assert EnumClipboardFormats(0)==0, "Clipboard formats were available after emptying it!" finally: CloseClipboard() def TestText(): OpenClipboard() try: text = "Hello from Python" text_bytes = str2bytes(text) SetClipboardText(text) got = GetClipboardData(win32con.CF_TEXT) # CF_TEXT always gives us 'bytes' back . assert got == text_bytes, "Didnt get the correct result back - '%r'." % (got,) finally: CloseClipboard() OpenClipboard() try: # CF_UNICODE text always gives unicode objects back. got = GetClipboardData(win32con.CF_UNICODETEXT) assert got == text, "Didnt get the correct result back - '%r'." % (got,) assert type(got)==str, "Didnt get the correct result back - '%r'." % (got,) # CF_OEMTEXT is a bytes-based format. got = GetClipboardData(win32con.CF_OEMTEXT) assert got == text_bytes, "Didnt get the correct result back - '%r'." % (got,) # Unicode tests EmptyClipboard() text = "Hello from Python unicode" text_bytes = str2bytes(text) # Now set the Unicode value SetClipboardData(win32con.CF_UNICODETEXT, text) # Get it in Unicode. got = GetClipboardData(win32con.CF_UNICODETEXT) assert got == text, "Didnt get the correct result back - '%r'." % (got,) assert type(got)==str, "Didnt get the correct result back - '%r'." % (got,) # Close and open the clipboard to ensure auto-conversions take place. finally: CloseClipboard() OpenClipboard() try: # Make sure I can still get the text as bytes got = GetClipboardData(win32con.CF_TEXT) assert got == text_bytes, "Didnt get the correct result back - '%r'." % (got,) # Make sure we get back the correct types. got = GetClipboardData(win32con.CF_UNICODETEXT) assert type(got)==str, "Didnt get the correct result back - '%r'." % (got,) got = GetClipboardData(win32con.CF_OEMTEXT) assert got == text_bytes, "Didnt get the correct result back - '%r'." % (got,) print("Clipboard text tests worked correctly") finally: CloseClipboard() def TestClipboardEnum(): OpenClipboard() try: # Enumerate over the clipboard types enum = 0 while 1: enum = EnumClipboardFormats(enum) if enum==0: break assert IsClipboardFormatAvailable(enum), "Have format, but clipboard says it is not available!" n = cf_names.get(enum,"") if not n: try: n = GetClipboardFormatName(enum) except error: n = "unknown (%s)" % (enum,) print("Have format", n) print("Clipboard enumerator tests worked correctly") finally: CloseClipboard() class Foo: def __init__(self, **kw): self.__dict__.update(kw) def __cmp__(self, other): return cmp(self.__dict__, other.__dict__) def __eq__(self, other): return self.__dict__==other.__dict__ def TestCustomFormat(): OpenClipboard() try: # Just for the fun of it pickle Python objects through the clipboard fmt = RegisterClipboardFormat("Python Pickle Format") import pickle pickled_object = Foo(a=1, b=2, Hi=3) SetClipboardData(fmt, pickle.dumps( pickled_object ) ) # Now read it back. data = GetClipboardData(fmt) loaded_object = pickle.loads(data) assert pickle.loads(data) == pickled_object, "Didnt get the correct data!" print("Clipboard custom format tests worked correctly") finally: CloseClipboard() if __name__=='__main__': TestEmptyClipboard() TestText() TestCustomFormat() TestClipboardEnum() # And leave it empty at the end! TestEmptyClipboard() PK ѳPeo win32/Demos/win32comport_demo.pyUT l_Zx`ux # This is a simple serial port terminal demo. # # Its primary purpose is to demonstrate the native serial port access offered via # win32file. # It uses 3 threads: # - The main thread, which cranks up the other 2 threads, then simply waits for them to exit. # - The user-input thread - blocks waiting for a keyboard character, and when found sends it # out the COM port. If the character is Ctrl+C, it stops, signalling the COM port thread to stop. # - The COM port thread is simply listening for input on the COM port, and prints it to the screen. # This demo uses userlapped IO, so that none of the read or write operations actually block (however, # in this sample, the very next thing we do _is_ block - so it shows off the concepts even though it # doesnt exploit them. from win32file import * # The base COM port and file IO functions. from win32event import * # We use events and the WaitFor[Multiple]Objects functions. import win32con # constants. import msvcrt # For the getch() function. import threading import sys def FindModem(): # Snoop over the comports, seeing if it is likely we have a modem. for i in range(1,5): port = "COM%d" % (i,) try: handle = CreateFile(port, win32con.GENERIC_READ | win32con.GENERIC_WRITE, 0, # exclusive access None, # no security win32con.OPEN_EXISTING, win32con.FILE_ATTRIBUTE_NORMAL, None) # It appears that an available COM port will always success here, # just return 0 for the status flags. We only care that it has _any_ status # flags (and therefore probably a real modem) if GetCommModemStatus(handle) != 0: return port except error: pass # No port, or modem status failed. return None # A basic synchronous COM port file-like object class SerialTTY: def __init__(self, port): if type(port)==type(0): port = "COM%d" % (port,) self.handle = CreateFile(port, win32con.GENERIC_READ | win32con.GENERIC_WRITE, 0, # exclusive access None, # no security win32con.OPEN_EXISTING, win32con.FILE_ATTRIBUTE_NORMAL | win32con.FILE_FLAG_OVERLAPPED, None) # Tell the port we want a notification on each char. SetCommMask(self.handle, EV_RXCHAR) # Setup a 4k buffer SetupComm(self.handle, 4096, 4096) # Remove anything that was there PurgeComm(self.handle, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR ) # Setup for overlapped IO. timeouts = 0xFFFFFFFF, 0, 1000, 0, 1000 SetCommTimeouts(self.handle, timeouts) # Setup the connection info. dcb = GetCommState( self.handle ) dcb.BaudRate = CBR_115200 dcb.ByteSize = 8 dcb.Parity = NOPARITY dcb.StopBits = ONESTOPBIT SetCommState(self.handle, dcb) print("Connected to %s at %s baud" % (port, dcb.BaudRate)) def _UserInputReaderThread(self): overlapped = OVERLAPPED() overlapped.hEvent = CreateEvent(None, 1, 0, None) try: while 1: ch = msvcrt.getch() if ord(ch)==3: break WriteFile(self.handle, ch, overlapped) # Wait for the write to complete. WaitForSingleObject(overlapped.hEvent, INFINITE) finally: SetEvent(self.eventStop) def _ComPortThread(self): overlapped = OVERLAPPED() overlapped.hEvent = CreateEvent(None, 1, 0, None) while 1: # XXX - note we could _probably_ just use overlapped IO on the win32file.ReadFile() statement # XXX but this tests the COM stuff! rc, mask = WaitCommEvent(self.handle, overlapped) if rc == 0: # Character already ready! SetEvent(overlapped.hEvent) rc = WaitForMultipleObjects([overlapped.hEvent, self.eventStop], 0, INFINITE) if rc == WAIT_OBJECT_0: # Some input - read and print it flags, comstat = ClearCommError( self.handle ) rc, data = ReadFile(self.handle, comstat.cbInQue, overlapped) WaitForSingleObject(overlapped.hEvent, INFINITE) sys.stdout.write(data) else: # Stop the thread! # Just incase the user input thread uis still going, close it sys.stdout.close() break def Run(self): self.eventStop = CreateEvent(None, 0, 0, None) # Start the reader and writer threads. user_thread = threading.Thread(target = self._UserInputReaderThread) user_thread.start() com_thread = threading.Thread(target = self._ComPortThread) com_thread.start() user_thread.join() com_thread.join() if __name__=='__main__': print("Serial port terminal demo - press Ctrl+C to exit") if len(sys.argv)<=1: port = FindModem() if port is None: print("No COM port specified, and no modem could be found") print("Please re-run this script with the name of a COM port (eg COM3)") sys.exit(1) else: port = sys.argv[1] tty = SerialTTY(port) tty.Run() PK Y03K8IM M (win32/Demos/win32clipboard_bitmapdemo.pyUT  YZx`ux import win32gui import win32api import win32clipboard import win32con import time class ViewerWindow: def __init__(self): self.hwndNextViewer = None def OnPaint(self, hwnd, msg, wp, lp): dc, ps=win32gui.BeginPaint(hwnd) wndrect = win32gui.GetClientRect(hwnd) wndwidth = wndrect[2]-wndrect[0] wndheight = wndrect[3]-wndrect[1] win32clipboard.OpenClipboard() try: try: hbitmap = win32clipboard.GetClipboardData(win32clipboard.CF_BITMAP) except TypeError: font=win32gui.LOGFONT() font.lfHeight=15 #int(wndheight/20) font.lfWidth=15 #font.lfHeight # font.lfWeight=150 hf=win32gui.CreateFontIndirect(font) win32gui.SelectObject(dc,hf) win32gui.SetBkMode(dc, win32con.TRANSPARENT) win32gui.SetTextColor(dc,win32api.RGB(0,0,0)) win32gui.DrawText(dc,'No bitmaps are in the clipboard\n(try pressing the PrtScn button)', -1, (0,0, wndwidth, wndheight), win32con.DT_CENTER) else: bminfo = win32gui.GetObject(hbitmap) dcDC = win32gui.CreateCompatibleDC(None) win32gui.SelectObject(dcDC, hbitmap) win32gui.StretchBlt(dc, 0, 0, wndwidth, wndheight, dcDC, 0, 0, bminfo.bmWidth, bminfo.bmHeight, win32con.SRCCOPY) win32gui.DeleteDC(dcDC) win32gui.EndPaint(hwnd, ps) finally: win32clipboard.CloseClipboard() return 0 def OnDrawClipboard(self, hwnd, msg, wp, lp): win32gui.InvalidateRect(hwnd,None,True) def OnChangeCBChain(self, hwnd, msg, wp, lp): # If the next window is closing, repair the chain. if wp == self.hwndNextViewer: self.hwndNextViewer = lp # Otherwise, pass the message to the next link. elif self.hwndNextViewer: win32gui.SendMessage(self.hwndNextViewer, msg, wp, lp) def OnCreate(self, hwnd, msg, wp, lp): self.hwndNextViewer = win32gui.SetClipboardViewer(hwnd); def OnClose(self, hwnd, msg, wp, lp): win32clipboard.ChangeClipboardChain(hwnd, self.hwndNextViewer) win32gui.DestroyWindow(hwnd) win32gui.PostQuitMessage(0) def go(self): wndproc={win32con.WM_PAINT: self.OnPaint, win32con.WM_CLOSE: self.OnClose, win32con.WM_CREATE: self.OnCreate, win32con.WM_DRAWCLIPBOARD: self.OnDrawClipboard, win32con.WM_CHANGECBCHAIN: self.OnChangeCBChain, } wc = win32gui.WNDCLASS() wc.lpszClassName = 'test_win32clipboard_bmp' wc.style = win32con.CS_GLOBALCLASS|win32con.CS_VREDRAW | win32con.CS_HREDRAW wc.hbrBackground = win32con.COLOR_WINDOW+1 wc.lpfnWndProc=wndproc class_atom=win32gui.RegisterClass(wc) hwnd = win32gui.CreateWindowEx(0, class_atom,'ClipboardViewer', win32con.WS_CAPTION|win32con.WS_VISIBLE|win32con.WS_THICKFRAME|win32con.WS_SYSMENU, 100,100,900,900, 0, 0, 0, None) win32clipboard.SetClipboardViewer(hwnd) win32gui.PumpMessages() win32gui.UnregisterClass(class_atom,None) if __name__=='__main__': w = ViewerWindow() w.go() PK ѳP>e))win32/Demos/RegRestoreKey.pyUT l_Zx`ux import win32api, win32security import win32con, ntsecuritycon, winnt import os temp_dir=win32api.GetTempPath() fname=win32api.GetTempFileName(temp_dir,'rsk')[0] print(fname) ## file can't exist os.remove(fname) ## enable backup and restore privs required_privs = ((win32security.LookupPrivilegeValue('',ntsecuritycon.SE_BACKUP_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',ntsecuritycon.SE_RESTORE_NAME),win32con.SE_PRIVILEGE_ENABLED) ) ph = win32api.GetCurrentProcess() th = win32security.OpenProcessToken(ph, win32con.TOKEN_READ|win32con.TOKEN_ADJUST_PRIVILEGES) adjusted_privs=win32security.AdjustTokenPrivileges(th,0,required_privs) try: sa=win32security.SECURITY_ATTRIBUTES() my_sid = win32security.GetTokenInformation(th,ntsecuritycon.TokenUser)[0] sa.SECURITY_DESCRIPTOR.SetSecurityDescriptorOwner(my_sid,0) k, disp=win32api.RegCreateKeyEx(win32con.HKEY_CURRENT_USER, 'Python test key', SecurityAttributes=sa, samDesired=win32con.KEY_ALL_ACCESS, Class='some class', Options=0) win32api.RegSetValue(k, None, win32con.REG_SZ, 'Default value for python test key') subk, disp=win32api.RegCreateKeyEx(k, 'python test subkey', SecurityAttributes=sa, samDesired=win32con.KEY_ALL_ACCESS, Class='some other class', Options=0) win32api.RegSetValue(subk, None, win32con.REG_SZ, 'Default value for subkey') win32api.RegSaveKeyEx(k, fname, Flags=winnt.REG_STANDARD_FORMAT, SecurityAttributes=sa) restored_key, disp=win32api.RegCreateKeyEx(win32con.HKEY_CURRENT_USER, 'Python test key(restored)', SecurityAttributes=sa, samDesired=win32con.KEY_ALL_ACCESS, Class='restored class', Options=0) win32api.RegRestoreKey(restored_key, fname) finally: win32security.AdjustTokenPrivileges(th, 0, adjusted_privs)PK ѳP]c 'win32/Demos/BackupSeek_streamheaders.pyUT l_Zx`ux ## demonstrates using BackupSeek to enumerate data streams for a file import win32file, win32api, win32con from win32com import storagecon import pythoncom, pywintypes import struct, traceback stream_types={ win32con.BACKUP_DATA:"Standard data", win32con.BACKUP_EA_DATA:"Extended attribute data", win32con.BACKUP_SECURITY_DATA:"Security descriptor data", win32con.BACKUP_ALTERNATE_DATA:"Alternative data streams", win32con.BACKUP_LINK:"Hard link information", win32con.BACKUP_PROPERTY_DATA:"Property data", win32con.BACKUP_OBJECT_ID:"Objects identifiers", win32con.BACKUP_REPARSE_DATA:"Reparse points", win32con.BACKUP_SPARSE_BLOCK:"Sparse file" } tempdir=win32api.GetTempPath() tempfile=win32api.GetTempFileName(tempdir,'bkr')[0] print('Filename:',tempfile) f=open(tempfile,'w') f.write('some random junk'+'x'*100) f.close() f=open(tempfile+':streamdata','w') f.write('data written to alternate stream'+'y'*100) f.close() f=open(tempfile+':anotherstream','w') f.write('z'*200) f.close() ## add Summary Information, which is stored as a separate stream m=storagecon.STGM_READWRITE | storagecon.STGM_SHARE_EXCLUSIVE |storagecon.STGM_DIRECT pss=pythoncom.StgOpenStorageEx(tempfile, m, storagecon.STGFMT_FILE, 0 , pythoncom.IID_IPropertySetStorage,None) ps=pss.Create(pythoncom.FMTID_SummaryInformation,pythoncom.IID_IPropertyStorage,0,storagecon.STGM_READWRITE|storagecon.STGM_SHARE_EXCLUSIVE) ps.WriteMultiple((storagecon.PIDSI_KEYWORDS,storagecon.PIDSI_COMMENTS),('keywords','comments')) ps=None pss=None sa=pywintypes.SECURITY_ATTRIBUTES() sa.bInheritHandle=False h=win32file.CreateFile(tempfile, win32con.GENERIC_ALL ,win32con.FILE_SHARE_READ, sa, win32con.OPEN_EXISTING, win32file.FILE_FLAG_BACKUP_SEMANTICS , None) """ stream header: typedef struct _WIN32_STREAM_ID { DWORD dwStreamId; DWORD dwStreamAttributes; LARGE_INTEGER Size; DWORD dwStreamNameSize; WCHAR cStreamName[ANYSIZE_ARRAY]; } """ win32_stream_id_format="LLQL" win32_stream_id_size=struct.calcsize(win32_stream_id_format) def parse_stream_header(h,ctxt,data): stream_type, stream_attributes, stream_size, stream_name_size=struct.unpack(win32_stream_id_format,data) print('\nType:',stream_type,stream_types[stream_type], 'Attributes:', stream_attributes, 'Size:', stream_size, 'Name len:',stream_name_size) if stream_name_size>0: ## ??? sdk says this size is in characters, but it appears to be number of bytes ??? bytes_read, stream_name_buf, ctxt=win32file.BackupRead(h, stream_name_size, None, False, True, ctxt) stream_name=pywintypes.UnicodeFromRaw(stream_name_buf[:]) else: stream_name='Unnamed' print('Name:'+stream_name) return ctxt, stream_type, stream_attributes, stream_size, stream_name_size, stream_name ctxt=0 win32_stream_id_buf=None ## gets rebound to a writable buffer on first call and reused while 1: bytes_read, win32_stream_id_buf, ctxt=win32file.BackupRead(h, win32_stream_id_size, win32_stream_id_buf, False, True, ctxt) if bytes_read==0: break ctxt, stream_type, stream_attributes, stream_size, stream_name_size, stream_name=\ parse_stream_header(h, ctxt, win32_stream_id_buf[:]) if stream_size>0: bytes_moved=win32file.BackupSeek(h, stream_size, ctxt) print('Moved: ',bytes_moved) win32file.BackupRead(h, win32_stream_id_size, win32_stream_id_buf, True, True, ctxt) win32file.CloseHandle(h) PK ѳP %win32/Demos/BackupRead_BackupWrite.pyUT l_Zx`ux ## demonstrates using BackupRead and BackupWrite to copy all of a file's data streams import win32file, win32api, win32con, win32security, ntsecuritycon from win32com import storagecon import pythoncom, pywintypes import struct, traceback from pywin32_testutil import str2bytes, ob2memory all_sd_info=win32security.DACL_SECURITY_INFORMATION|win32security.DACL_SECURITY_INFORMATION| \ win32security.OWNER_SECURITY_INFORMATION|win32security.GROUP_SECURITY_INFORMATION tempdir=win32api.GetTempPath() tempfile=win32api.GetTempFileName(tempdir,'bkr')[0] outfile=win32api.GetTempFileName(tempdir,'out')[0] print('Filename:',tempfile,'Output file:',outfile) f=open(tempfile,'w') f.write('some random junk'+'x'*100) f.close() ## add a couple of alternate data streams f=open(tempfile+':streamdata','w') f.write('data written to alternate stream'+'y'*100) f.close() f=open(tempfile+':anotherstream','w') f.write('z'*100) f.close() ## add Summary Information, which is stored as a separate stream m=storagecon.STGM_READWRITE | storagecon.STGM_SHARE_EXCLUSIVE |storagecon.STGM_DIRECT pss=pythoncom.StgOpenStorageEx(tempfile, m, storagecon.STGFMT_FILE, 0 , pythoncom.IID_IPropertySetStorage,None) ps=pss.Create(pythoncom.FMTID_SummaryInformation,pythoncom.IID_IPropertyStorage,0,storagecon.STGM_READWRITE|storagecon.STGM_SHARE_EXCLUSIVE) ps.WriteMultiple((storagecon.PIDSI_KEYWORDS,storagecon.PIDSI_COMMENTS),('keywords','comments')) ps=None pss=None ## add a custom security descriptor to make sure we don't ## get a default that would always be the same for both files in temp dir new_sd=pywintypes.SECURITY_DESCRIPTOR() sid=win32security.LookupAccountName('','EveryOne')[0] acl=pywintypes.ACL() acl.AddAccessAllowedAce(1, win32con.GENERIC_READ, sid) acl.AddAccessAllowedAce(1, ntsecuritycon.FILE_APPEND_DATA, sid) acl.AddAccessAllowedAce(1, win32con.GENERIC_WRITE, sid) acl.AddAccessAllowedAce(1, ntsecuritycon.FILE_ALL_ACCESS, sid) new_sd.SetSecurityDescriptorDacl(True, acl, False) win32security.SetFileSecurity(tempfile,win32security.DACL_SECURITY_INFORMATION,new_sd) sa=pywintypes.SECURITY_ATTRIBUTES() sa.bInheritHandle=True h=win32file.CreateFile(tempfile, win32con.GENERIC_ALL ,win32con.FILE_SHARE_READ, sa, win32con.OPEN_EXISTING, win32file.FILE_FLAG_BACKUP_SEMANTICS , None) outh=win32file.CreateFile(outfile, win32con.GENERIC_ALL ,win32con.FILE_SHARE_READ|win32con.FILE_SHARE_WRITE, sa, win32con.OPEN_EXISTING, win32file.FILE_FLAG_BACKUP_SEMANTICS , None) ctxt=0 outctxt=0 buf=None readsize=100 while 1: bytes_read, buf, ctxt=win32file.BackupRead(h, readsize, buf, False, True, ctxt) if bytes_read==0: break bytes_written, outctxt=win32file.BackupWrite(outh, bytes_read, buf, False, True, outctxt) print('Written:',bytes_written,'Context:',outctxt) win32file.BackupRead(h, 0, buf, True, True, ctxt) win32file.BackupWrite(outh, 0, str2bytes(''), True, True, outctxt) win32file.CloseHandle(h) win32file.CloseHandle(outh) assert open(tempfile).read()==open(outfile).read(),"File contents differ !" assert open(tempfile+':streamdata').read()==open(outfile+':streamdata').read(),"streamdata contents differ !" assert open(tempfile+':anotherstream').read()==open(outfile+':anotherstream').read(),"anotherstream contents differ !" assert ob2memory(win32security.GetFileSecurity(tempfile,all_sd_info))[:]== \ ob2memory(win32security.GetFileSecurity(outfile, all_sd_info))[:], "Security descriptors are different !" ## also should check Summary Info programatically PK {Rwin32/Demos/security/UT Zx`Zx`ux PK Y03K_}"win32/Demos/security/regsave_sa.pyUT  YZx`ux fname='h:\\tmp.reg' import win32api, win32con, win32security, ntsecuritycon, pywintypes,os ## regsave will not overwrite a file if os.path.isfile(fname): os.remove(fname) new_privs = ((win32security.LookupPrivilegeValue('',ntsecuritycon.SE_SECURITY_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',ntsecuritycon.SE_TCB_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',ntsecuritycon.SE_BACKUP_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',ntsecuritycon.SE_RESTORE_NAME),win32con.SE_PRIVILEGE_ENABLED) ) ph = win32api.GetCurrentProcess() th = win32security.OpenProcessToken(ph,win32security.TOKEN_ALL_ACCESS|win32con.TOKEN_ADJUST_PRIVILEGES) win32security.AdjustTokenPrivileges(th,0,new_privs) my_sid = win32security.GetTokenInformation(th,ntsecuritycon.TokenUser)[0] hklm=win32api.RegOpenKey(win32con.HKEY_LOCAL_MACHINE,None,0,win32con.KEY_ALL_ACCESS) skey=win32api.RegOpenKey(hklm,'SYSTEM',0,win32con.KEY_ALL_ACCESS) sa=pywintypes.SECURITY_ATTRIBUTES() sd=pywintypes.SECURITY_DESCRIPTOR() sa.SECURITY_DESCRIPTOR=sd acl=pywintypes.ACL() pwr_sid = win32security.LookupAccountName('','Power Users')[0] acl.AddAccessAllowedAce(win32con.ACL_REVISION,win32con.GENERIC_READ|win32con.ACCESS_SYSTEM_SECURITY,my_sid) sd.SetSecurityDescriptorDacl(1,acl,0) sd.SetSecurityDescriptorOwner(pwr_sid,0) sa.bInheritHandle=1 assert sa.SECURITY_DESCRIPTOR is sd win32api.RegSaveKey(skey,fname,sa) PK ѳP#J( ( &win32/Demos/security/set_file_audit.pyUT l_Zx`ux import win32security,win32file,win32api,ntsecuritycon,win32con, os from win32security import ACL_REVISION_DS, CONTAINER_INHERIT_ACE, OBJECT_INHERIT_ACE, \ PROTECTED_DACL_SECURITY_INFORMATION, DACL_SECURITY_INFORMATION, SACL_SECURITY_INFORMATION, \ OWNER_SECURITY_INFORMATION, GROUP_SECURITY_INFORMATION, SE_FILE_OBJECT ## SE_SECURITY_NAME needed to access SACL, SE_RESTORE_NAME needed to change owner to someone other than yourself new_privs = ((win32security.LookupPrivilegeValue('',ntsecuritycon.SE_SECURITY_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',ntsecuritycon.SE_RESTORE_NAME),win32con.SE_PRIVILEGE_ENABLED), ) ph = win32api.GetCurrentProcess() th = win32security.OpenProcessToken(ph,win32security.TOKEN_ALL_ACCESS|win32con.TOKEN_ADJUST_PRIVILEGES) modified_privs=win32security.AdjustTokenPrivileges(th,0,new_privs) ## look up a few sids that should be available on most systems my_sid = win32security.GetTokenInformation(th,ntsecuritycon.TokenUser)[0] pwr_sid = win32security.LookupAccountName('','Power Users')[0] admin_sid = win32security.LookupAccountName('','Administrators')[0] everyone_sid=win32security.LookupAccountName('','EveryOne')[0] ## create a dir and set security so Everyone has read permissions, and all files and subdirs inherit its ACLs temp_dir=win32api.GetTempPath() dir_name=win32api.GetTempFileName(temp_dir,'sfa')[0] os.remove(dir_name) os.mkdir(dir_name) dir_dacl=win32security.ACL() dir_dacl.AddAccessAllowedAceEx(ACL_REVISION_DS, CONTAINER_INHERIT_ACE|OBJECT_INHERIT_ACE, win32con.GENERIC_READ, everyone_sid) ## make sure current user has permissions on dir dir_dacl.AddAccessAllowedAceEx(ACL_REVISION_DS, CONTAINER_INHERIT_ACE|OBJECT_INHERIT_ACE, win32con.GENERIC_ALL, my_sid) ## keep dir from inheriting any permissions so it only has ACEs explicitely set here win32security.SetNamedSecurityInfo(dir_name, SE_FILE_OBJECT, OWNER_SECURITY_INFORMATION|GROUP_SECURITY_INFORMATION|DACL_SECURITY_INFORMATION|PROTECTED_DACL_SECURITY_INFORMATION, pwr_sid, pwr_sid, dir_dacl, None) ## Create a file in the dir and add some specific permissions to it fname=win32api.GetTempFileName(dir_name,'sfa')[0] print(fname) file_sd=win32security.GetNamedSecurityInfo(fname, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION|SACL_SECURITY_INFORMATION) file_dacl=file_sd.GetSecurityDescriptorDacl() file_sacl=file_sd.GetSecurityDescriptorSacl() if file_dacl is None: file_dacl=win32security.ACL() if file_sacl is None: file_sacl=win32security.ACL() file_dacl.AddAccessDeniedAce(file_dacl.GetAclRevision(),win32con.DELETE,admin_sid) file_dacl.AddAccessDeniedAce(file_dacl.GetAclRevision(),win32con.DELETE,my_sid) file_dacl.AddAccessAllowedAce(file_dacl.GetAclRevision(),win32con.GENERIC_ALL,pwr_sid) file_sacl.AddAuditAccessAce(file_dacl.GetAclRevision(),win32con.GENERIC_ALL,my_sid,True,True) win32security.SetNamedSecurityInfo(fname, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION|SACL_SECURITY_INFORMATION, None, None, file_dacl, file_sacl) win32security.AdjustTokenPrivileges(th, 0, modified_privs) PK ѳP*#win32/Demos/security/list_rights.pyUT l_Zx`ux import win32security,win32file,win32api,ntsecuritycon,win32con from security_enums import TRUSTEE_TYPE,TRUSTEE_FORM,ACE_FLAGS,ACCESS_MODE new_privs = ((win32security.LookupPrivilegeValue('',ntsecuritycon.SE_SECURITY_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',ntsecuritycon.SE_CREATE_PERMANENT_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('','SeEnableDelegationPrivilege'),win32con.SE_PRIVILEGE_ENABLED) ##doesn't seem to be in ntsecuritycon.py ? ) ph = win32api.GetCurrentProcess() th = win32security.OpenProcessToken(ph,win32security.TOKEN_ALL_ACCESS) ##win32con.TOKEN_ADJUST_PRIVILEGES) win32security.AdjustTokenPrivileges(th,0,new_privs) policy_handle = win32security.GetPolicyHandle('',win32security.POLICY_ALL_ACCESS) sidlist=win32security.LsaEnumerateAccountsWithUserRight(policy_handle,ntsecuritycon.SE_RESTORE_NAME) for sid in sidlist: print(win32security.LookupAccountSid('',sid)) win32security.LsaClose(policy_handle) PK ѳP{og g +win32/Demos/security/GetTokenInformation.pyUT l_Zx`ux """ Lists various types of information about current user's access token, including UAC status on Vista """ import pywintypes, win32api, win32security import win32con, winerror from security_enums import TOKEN_GROUP_ATTRIBUTES, TOKEN_PRIVILEGE_ATTRIBUTES, \ SECURITY_IMPERSONATION_LEVEL, TOKEN_TYPE, TOKEN_ELEVATION_TYPE def dump_token(th): token_type=win32security.GetTokenInformation(th, win32security.TokenType) print('TokenType:', token_type, TOKEN_TYPE.lookup_name(token_type)) if token_type==win32security.TokenImpersonation: imp_lvl=win32security.GetTokenInformation(th, win32security.TokenImpersonationLevel) print('TokenImpersonationLevel:', imp_lvl, SECURITY_IMPERSONATION_LEVEL.lookup_name(imp_lvl)) print('TokenSessionId:', win32security.GetTokenInformation(th, win32security.TokenSessionId)) privs=win32security.GetTokenInformation(th,win32security.TokenPrivileges) print('TokenPrivileges:') for priv_luid, priv_flags in privs: flag_names, unk=TOKEN_PRIVILEGE_ATTRIBUTES.lookup_flags(priv_flags) flag_desc = ' '.join(flag_names) if (unk): flag_desc += '(' + str(unk) + ')' priv_name=win32security.LookupPrivilegeName('',priv_luid) priv_desc=win32security.LookupPrivilegeDisplayName('',priv_name) print('\t', priv_name, priv_desc, priv_flags, flag_desc) print('TokenGroups:') groups=win32security.GetTokenInformation(th,win32security.TokenGroups) for group_sid, group_attr in groups: flag_names, unk=TOKEN_GROUP_ATTRIBUTES.lookup_flags(group_attr) flag_desc = ' '.join(flag_names) if (unk): flag_desc += '(' + str(unk) + ')' if group_attr & TOKEN_GROUP_ATTRIBUTES.SE_GROUP_LOGON_ID: sid_desc = 'Logon sid' else: sid_desc=win32security.LookupAccountSid('',group_sid) print('\t',group_sid, sid_desc, group_attr, flag_desc) ## Vista token information types, will throw (87, 'GetTokenInformation', 'The parameter is incorrect.') on earier OS try: is_elevated=win32security.GetTokenInformation(th, win32security.TokenElevation) print('TokenElevation:', is_elevated) except pywintypes.error as details: if details.winerror != winerror.ERROR_INVALID_PARAMETER: raise return None print('TokenHasRestrictions:', win32security.GetTokenInformation(th, win32security.TokenHasRestrictions)) print('TokenMandatoryPolicy', win32security.GetTokenInformation(th, win32security.TokenMandatoryPolicy)) print('TokenVirtualizationAllowed:', win32security.GetTokenInformation(th, win32security.TokenVirtualizationAllowed)) print('TokenVirtualizationEnabled:', win32security.GetTokenInformation(th, win32security.TokenVirtualizationEnabled)) elevation_type = win32security.GetTokenInformation(th, win32security.TokenElevationType) print('TokenElevationType:', elevation_type, TOKEN_ELEVATION_TYPE.lookup_name(elevation_type)) if elevation_type!=win32security.TokenElevationTypeDefault: lt=win32security.GetTokenInformation(th, win32security.TokenLinkedToken) print('TokenLinkedToken:', lt) else: lt=None return lt ph = win32api.GetCurrentProcess() th = win32security.OpenProcessToken(ph,win32con.MAXIMUM_ALLOWED) lt = dump_token(th) if lt: print('\n\nlinked token info:') dump_token(lt) PK ѳP'{!!(win32/Demos/security/explicit_entries.pyUT l_Zx`ux import os import win32security,win32file,win32api,ntsecuritycon,win32con from security_enums import TRUSTEE_TYPE,TRUSTEE_FORM,ACE_FLAGS,ACCESS_MODE fname = os.path.join(win32api.GetTempPath(), "win32security_test.txt") f=open(fname, "w") f.write("Hello from Python\n"); f.close() print("Testing on file", fname) new_privs = ((win32security.LookupPrivilegeValue('',ntsecuritycon.SE_SECURITY_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',ntsecuritycon.SE_SHUTDOWN_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',ntsecuritycon.SE_RESTORE_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',ntsecuritycon.SE_TAKE_OWNERSHIP_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',ntsecuritycon.SE_CREATE_PERMANENT_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('','SeEnableDelegationPrivilege'),win32con.SE_PRIVILEGE_ENABLED) ##doesn't seem to be in ntsecuritycon.py ? ) ph = win32api.GetCurrentProcess() th = win32security.OpenProcessToken(ph,win32security.TOKEN_ALL_ACCESS) ##win32con.TOKEN_ADJUST_PRIVILEGES) win32security.AdjustTokenPrivileges(th,0,new_privs) all_security_info = \ win32security.OWNER_SECURITY_INFORMATION|win32security.GROUP_SECURITY_INFORMATION| \ win32security.DACL_SECURITY_INFORMATION|win32security.SACL_SECURITY_INFORMATION sd=win32security.GetFileSecurity(fname,all_security_info) old_sacl=sd.GetSecurityDescriptorSacl() if old_sacl==None: old_sacl=win32security.ACL() old_dacl=sd.GetSecurityDescriptorDacl() if old_dacl==None: old_dacl=win32security.ACL() my_sid = win32security.GetTokenInformation(th,ntsecuritycon.TokenUser)[0] tmp_sid = win32security.LookupAccountName('','tmp')[0] pwr_sid = win32security.LookupAccountName('','Power Users')[0] ## MultipleTrustee,MultipleTrusteeOperation,TrusteeForm,TrusteeType,Identifier ## first two are ignored my_trustee = {} my_trustee['MultipleTrustee']=None my_trustee['MultipleTrusteeOperation']=0 my_trustee['TrusteeForm']=TRUSTEE_FORM.TRUSTEE_IS_SID my_trustee['TrusteeType']=TRUSTEE_TYPE.TRUSTEE_IS_USER my_trustee['Identifier']=my_sid tmp_trustee = {} tmp_trustee['MultipleTrustee']=None tmp_trustee['MultipleTrusteeOperation']=0 tmp_trustee['TrusteeForm']=TRUSTEE_FORM.TRUSTEE_IS_NAME tmp_trustee['TrusteeType']=TRUSTEE_TYPE.TRUSTEE_IS_USER tmp_trustee['Identifier']='rupole\\tmp' pwr_trustee = {} pwr_trustee['MultipleTrustee']=None pwr_trustee['MultipleTrusteeOperation']=0 pwr_trustee['TrusteeForm']=TRUSTEE_FORM.TRUSTEE_IS_SID pwr_trustee['TrusteeType']=TRUSTEE_TYPE.TRUSTEE_IS_USER pwr_trustee['Identifier']=pwr_sid expl_list=[] expl_list.append( { 'Trustee':my_trustee, 'Inheritance':ACE_FLAGS.NO_INHERITANCE, 'AccessMode':ACCESS_MODE.SET_AUDIT_SUCCESS, ##|ACCESS_MODE.SET_AUDIT_FAILURE, 'AccessPermissions':win32con.GENERIC_ALL } ) expl_list.append( { 'Trustee':my_trustee, 'Inheritance':ACE_FLAGS.NO_INHERITANCE, 'AccessMode':ACCESS_MODE.SET_AUDIT_FAILURE, 'AccessPermissions':win32con.GENERIC_ALL } ) expl_list.append( { 'Trustee':tmp_trustee, 'Inheritance':ACE_FLAGS.NO_INHERITANCE, 'AccessMode':ACCESS_MODE.SET_AUDIT_SUCCESS, 'AccessPermissions':win32con.GENERIC_ALL } ) expl_list.append( { 'Trustee':tmp_trustee, 'Inheritance':ACE_FLAGS.NO_INHERITANCE, 'AccessMode':ACCESS_MODE.SET_AUDIT_FAILURE, 'AccessPermissions':win32con.GENERIC_ALL } ) old_sacl.SetEntriesInAcl(expl_list) expl_list=[] expl_list.append( { 'Trustee':tmp_trustee, 'Inheritance':ACE_FLAGS.NO_INHERITANCE, 'AccessMode':ACCESS_MODE.DENY_ACCESS, 'AccessPermissions':win32con.DELETE } ) expl_list.append( { 'Trustee':tmp_trustee, 'Inheritance':ACE_FLAGS.NO_INHERITANCE, 'AccessMode':ACCESS_MODE.GRANT_ACCESS, 'AccessPermissions':win32con.WRITE_OWNER } ) expl_list.append( { 'Trustee':pwr_trustee, 'Inheritance':ACE_FLAGS.NO_INHERITANCE, 'AccessMode':ACCESS_MODE.GRANT_ACCESS, 'AccessPermissions':win32con.GENERIC_READ } ) expl_list.append( { 'Trustee':my_trustee, 'Inheritance':ACE_FLAGS.NO_INHERITANCE, 'AccessMode':ACCESS_MODE.GRANT_ACCESS, 'AccessPermissions':win32con.GENERIC_ALL } ) old_dacl.SetEntriesInAcl(expl_list) sd.SetSecurityDescriptorSacl(1,old_sacl,1) sd.SetSecurityDescriptorDacl(1,old_dacl,1) sd.SetSecurityDescriptorOwner(pwr_sid,1) win32security.SetFileSecurity(fname, all_security_info, sd) PK ѳP*&win32/Demos/security/set_file_owner.pyUT l_Zx`ux fname=r'h:\tmp.txt' import win32security,win32file,win32api,ntsecuritycon,win32con new_privs = ((win32security.LookupPrivilegeValue('',ntsecuritycon.SE_SECURITY_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',ntsecuritycon.SE_SHUTDOWN_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',ntsecuritycon.SE_TCB_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',ntsecuritycon.SE_RESTORE_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',ntsecuritycon.SE_TAKE_OWNERSHIP_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',ntsecuritycon.SE_CREATE_PERMANENT_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('','SeEnableDelegationPrivilege'),win32con.SE_PRIVILEGE_ENABLED) ##doesn't seem to be in ntsecuritycon.py ? ) ph = win32api.GetCurrentProcess() th = win32security.OpenProcessToken(ph,win32security.TOKEN_ALL_ACCESS|win32con.TOKEN_ADJUST_PRIVILEGES) win32security.AdjustTokenPrivileges(th,0,new_privs) all_security_info = \ win32security.OWNER_SECURITY_INFORMATION|win32security.GROUP_SECURITY_INFORMATION| \ win32security.DACL_SECURITY_INFORMATION|win32security.SACL_SECURITY_INFORMATION sd=win32security.GetFileSecurity(fname,all_security_info) old_dacl=sd.GetSecurityDescriptorDacl() old_sacl=sd.GetSecurityDescriptorSacl() old_group=sd.GetSecurityDescriptorGroup() new_sd=win32security.SECURITY_DESCRIPTOR() print("relative, valid, size: ",new_sd.IsSelfRelative(), new_sd.IsValid(), new_sd.GetLength()) my_sid = win32security.GetTokenInformation(th,ntsecuritycon.TokenUser)[0] tmp_sid = win32security.LookupAccountName('','tmp')[0] new_sd.SetSecurityDescriptorSacl(1,old_sacl,1) new_sd.SetSecurityDescriptorDacl(1,old_dacl,1) new_sd.SetSecurityDescriptorOwner(tmp_sid,0) new_sd.SetSecurityDescriptorGroup(old_group,0) win32security.SetFileSecurity(fname,all_security_info,new_sd) PK Y03K$gȂ -win32/Demos/security/setuserobjectsecurity.pyUT  YZx`ux import win32security,win32api,win32con, win32process new_privs = ((win32security.LookupPrivilegeValue('',win32security.SE_SECURITY_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',win32security.SE_TCB_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',win32security.SE_SHUTDOWN_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',win32security.SE_RESTORE_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',win32security.SE_TAKE_OWNERSHIP_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',win32security.SE_CREATE_PERMANENT_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',win32security.SE_ENABLE_DELEGATION_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',win32security.SE_CHANGE_NOTIFY_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',win32security.SE_DEBUG_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',win32security.SE_PROF_SINGLE_PROCESS_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',win32security.SE_SYSTEM_PROFILE_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',win32security.SE_LOCK_MEMORY_NAME),win32con.SE_PRIVILEGE_ENABLED) ) all_info=win32security.OWNER_SECURITY_INFORMATION|win32security.GROUP_SECURITY_INFORMATION| \ win32security.DACL_SECURITY_INFORMATION|win32security.SACL_SECURITY_INFORMATION info=win32security.OWNER_SECURITY_INFORMATION|win32security.GROUP_SECURITY_INFORMATION|win32security.DACL_SECURITY_INFORMATION ph=win32process.GetCurrentProcess() th = win32security.OpenProcessToken(ph,win32security.TOKEN_ALL_ACCESS) ##win32con.TOKEN_ADJUST_PRIVILEGES) win32security.AdjustTokenPrivileges(th,0,new_privs) my_sid = win32security.GetTokenInformation(th,win32security.TokenUser)[0] pwr_sid=win32security.LookupAccountName('','Power Users')[0] h=win32process.GetProcessWindowStation() sd=win32security.GetUserObjectSecurity(h,info) dacl=sd.GetSecurityDescriptorDacl() ace_cnt=dacl.GetAceCount() dacl.AddAccessAllowedAce(dacl.GetAclRevision(),win32con.ACCESS_SYSTEM_SECURITY|win32con.WRITE_DAC,my_sid) sd.SetSecurityDescriptorDacl(1,dacl,0) sd.SetSecurityDescriptorGroup(pwr_sid,0) sd.SetSecurityDescriptorOwner(pwr_sid,0) win32security.SetUserObjectSecurity(h,info,sd) new_sd=win32security.GetUserObjectSecurity(h,info) assert new_sd.GetSecurityDescriptorDacl().GetAceCount()==ace_cnt+1,'Did not add an ace to the Dacl !!!!!!' assert win32security.LookupAccountSid('',new_sd.GetSecurityDescriptorOwner())[0]=='Power Users','Owner not successfully set to Power Users !!!!!' assert win32security.LookupAccountSid('',new_sd.GetSecurityDescriptorGroup())[0]=='Power Users','Group not successfully set to Power Users !!!!!' PK ѳPZ  "win32/Demos/security/sa_inherit.pyUT l_Zx`ux import pywintypes, win32security sa=pywintypes.SECURITY_ATTRIBUTES() tmp_sid=win32security.LookupAccountName('','tmp')[0] sa.SetSecurityDescriptorOwner(tmp_sid,0) sid=sa.SECURITY_DESCRIPTOR.GetSecurityDescriptorOwner() print(win32security.LookupAccountSid('',sid)) PK ѳPV~$$&win32/Demos/security/security_enums.pyUT l_Zx`ux import win32security, ntsecuritycon, winnt class Enum: def __init__(self, *const_names): """Accepts variable number of constant names that can be found in either win32security, ntsecuritycon, or winnt.""" for const_name in const_names: try: const_val=getattr(win32security,const_name) except AttributeError: try: const_val=getattr(ntsecuritycon, const_name) except AttributeError: try: const_val=getattr(winnt, const_name) except AttributeError: raise AttributeError('Constant "%s" not found in win32security, ntsecuritycon, or winnt.' %const_name) setattr(self, const_name, const_val) def lookup_name(self, const_val): """Looks up the name of a particular value.""" for k,v in self.__dict__.items(): if v==const_val: return k raise AttributeError('Value %s not found in enum' %const_val) def lookup_flags(self, flags): """Returns the names of all recognized flags in input, and any flags not found in the enum.""" flag_names=[] unknown_flags=flags for k,v in self.__dict__.items(): if flags & v == v: flag_names.append(k) unknown_flags = unknown_flags & ~v return flag_names, unknown_flags TOKEN_INFORMATION_CLASS = Enum( 'TokenUser', 'TokenGroups', 'TokenPrivileges', 'TokenOwner', 'TokenPrimaryGroup', 'TokenDefaultDacl', 'TokenSource', 'TokenType', 'TokenImpersonationLevel', 'TokenStatistics', 'TokenRestrictedSids', 'TokenSessionId', 'TokenGroupsAndPrivileges', 'TokenSessionReference', 'TokenSandBoxInert', 'TokenAuditPolicy', 'TokenOrigin', 'TokenElevationType', 'TokenLinkedToken', 'TokenElevation', 'TokenHasRestrictions', 'TokenAccessInformation', 'TokenVirtualizationAllowed', 'TokenVirtualizationEnabled', 'TokenIntegrityLevel', 'TokenUIAccess', 'TokenMandatoryPolicy', 'TokenLogonSid') TOKEN_TYPE = Enum( 'TokenPrimary', 'TokenImpersonation') TOKEN_ELEVATION_TYPE = Enum( 'TokenElevationTypeDefault', 'TokenElevationTypeFull', 'TokenElevationTypeLimited') POLICY_AUDIT_EVENT_TYPE = Enum( 'AuditCategorySystem', 'AuditCategoryLogon', 'AuditCategoryObjectAccess', 'AuditCategoryPrivilegeUse', 'AuditCategoryDetailedTracking', 'AuditCategoryPolicyChange', 'AuditCategoryAccountManagement', 'AuditCategoryDirectoryServiceAccess', 'AuditCategoryAccountLogon') POLICY_INFORMATION_CLASS = Enum( 'PolicyAuditLogInformation', 'PolicyAuditEventsInformation', 'PolicyPrimaryDomainInformation', 'PolicyPdAccountInformation', 'PolicyAccountDomainInformation', 'PolicyLsaServerRoleInformation', 'PolicyReplicaSourceInformation', 'PolicyDefaultQuotaInformation', 'PolicyModificationInformation', 'PolicyAuditFullSetInformation', 'PolicyAuditFullQueryInformation', 'PolicyDnsDomainInformation') POLICY_LSA_SERVER_ROLE = Enum( 'PolicyServerRoleBackup', 'PolicyServerRolePrimary') ## access modes for opening a policy handle - this is not a real enum POLICY_ACCESS_MODES = Enum( 'POLICY_VIEW_LOCAL_INFORMATION', 'POLICY_VIEW_AUDIT_INFORMATION', 'POLICY_GET_PRIVATE_INFORMATION', 'POLICY_TRUST_ADMIN', 'POLICY_CREATE_ACCOUNT', 'POLICY_CREATE_SECRET', 'POLICY_CREATE_PRIVILEGE', 'POLICY_SET_DEFAULT_QUOTA_LIMITS', 'POLICY_SET_AUDIT_REQUIREMENTS', 'POLICY_AUDIT_LOG_ADMIN', 'POLICY_SERVER_ADMIN', 'POLICY_LOOKUP_NAMES', 'POLICY_NOTIFICATION', 'POLICY_ALL_ACCESS', 'POLICY_READ', 'POLICY_WRITE', 'POLICY_EXECUTE') ## EventAuditingOptions flags - not a real enum POLICY_AUDIT_EVENT_OPTIONS_FLAGS = Enum( 'POLICY_AUDIT_EVENT_UNCHANGED', 'POLICY_AUDIT_EVENT_SUCCESS', 'POLICY_AUDIT_EVENT_FAILURE', 'POLICY_AUDIT_EVENT_NONE') # AceType in ACE_HEADER - not a real enum ACE_TYPE = Enum( 'ACCESS_MIN_MS_ACE_TYPE', 'ACCESS_ALLOWED_ACE_TYPE', 'ACCESS_DENIED_ACE_TYPE', 'SYSTEM_AUDIT_ACE_TYPE', 'SYSTEM_ALARM_ACE_TYPE', 'ACCESS_MAX_MS_V2_ACE_TYPE', 'ACCESS_ALLOWED_COMPOUND_ACE_TYPE', 'ACCESS_MAX_MS_V3_ACE_TYPE', 'ACCESS_MIN_MS_OBJECT_ACE_TYPE', 'ACCESS_ALLOWED_OBJECT_ACE_TYPE', 'ACCESS_DENIED_OBJECT_ACE_TYPE', 'SYSTEM_AUDIT_OBJECT_ACE_TYPE', 'SYSTEM_ALARM_OBJECT_ACE_TYPE', 'ACCESS_MAX_MS_OBJECT_ACE_TYPE', 'ACCESS_MAX_MS_V4_ACE_TYPE', 'ACCESS_MAX_MS_ACE_TYPE', 'ACCESS_ALLOWED_CALLBACK_ACE_TYPE', 'ACCESS_DENIED_CALLBACK_ACE_TYPE', 'ACCESS_ALLOWED_CALLBACK_OBJECT_ACE_TYPE', 'ACCESS_DENIED_CALLBACK_OBJECT_ACE_TYPE', 'SYSTEM_AUDIT_CALLBACK_ACE_TYPE', 'SYSTEM_ALARM_CALLBACK_ACE_TYPE', 'SYSTEM_AUDIT_CALLBACK_OBJECT_ACE_TYPE', 'SYSTEM_ALARM_CALLBACK_OBJECT_ACE_TYPE', 'SYSTEM_MANDATORY_LABEL_ACE_TYPE', 'ACCESS_MAX_MS_V5_ACE_TYPE') #bit flags for AceFlags - not a real enum ACE_FLAGS = Enum( 'CONTAINER_INHERIT_ACE', 'FAILED_ACCESS_ACE_FLAG', 'INHERIT_ONLY_ACE', 'INHERITED_ACE', 'NO_PROPAGATE_INHERIT_ACE', 'OBJECT_INHERIT_ACE', 'SUCCESSFUL_ACCESS_ACE_FLAG', 'NO_INHERITANCE', 'SUB_CONTAINERS_AND_OBJECTS_INHERIT', 'SUB_CONTAINERS_ONLY_INHERIT', 'SUB_OBJECTS_ONLY_INHERIT') # used in SetEntriesInAcl - very similar to ACE_TYPE ACCESS_MODE = Enum( 'NOT_USED_ACCESS', 'GRANT_ACCESS', 'SET_ACCESS', 'DENY_ACCESS', 'REVOKE_ACCESS', 'SET_AUDIT_SUCCESS', 'SET_AUDIT_FAILURE') # Bit flags in PSECURITY_DESCRIPTOR->Control - not a real enum SECURITY_DESCRIPTOR_CONTROL_FLAGS = Enum( 'SE_DACL_AUTO_INHERITED', ## win2k and up 'SE_SACL_AUTO_INHERITED', ## win2k and up 'SE_DACL_PROTECTED', ## win2k and up 'SE_SACL_PROTECTED', ## win2k and up 'SE_DACL_DEFAULTED', 'SE_DACL_PRESENT', 'SE_GROUP_DEFAULTED', 'SE_OWNER_DEFAULTED', 'SE_SACL_PRESENT', 'SE_SELF_RELATIVE', 'SE_SACL_DEFAULTED') # types of SID SID_NAME_USE = Enum( 'SidTypeUser', 'SidTypeGroup', 'SidTypeDomain', 'SidTypeAlias', 'SidTypeWellKnownGroup', 'SidTypeDeletedAccount', 'SidTypeInvalid', 'SidTypeUnknown', 'SidTypeComputer', 'SidTypeLabel') ## bit flags, not a real enum TOKEN_ACCESS_PRIVILEGES = Enum( 'TOKEN_ADJUST_DEFAULT', 'TOKEN_ADJUST_GROUPS', 'TOKEN_ADJUST_PRIVILEGES', 'TOKEN_ALL_ACCESS', 'TOKEN_ASSIGN_PRIMARY', 'TOKEN_DUPLICATE', 'TOKEN_EXECUTE', 'TOKEN_IMPERSONATE', 'TOKEN_QUERY', 'TOKEN_QUERY_SOURCE', 'TOKEN_READ', 'TOKEN_WRITE') SECURITY_IMPERSONATION_LEVEL = Enum( 'SecurityAnonymous', 'SecurityIdentification', 'SecurityImpersonation', 'SecurityDelegation') POLICY_SERVER_ENABLE_STATE = Enum( 'PolicyServerEnabled', 'PolicyServerDisabled') POLICY_NOTIFICATION_INFORMATION_CLASS = Enum( 'PolicyNotifyAuditEventsInformation', 'PolicyNotifyAccountDomainInformation', 'PolicyNotifyServerRoleInformation', 'PolicyNotifyDnsDomainInformation', 'PolicyNotifyDomainEfsInformation', 'PolicyNotifyDomainKerberosTicketInformation', 'PolicyNotifyMachineAccountPasswordInformation') TRUSTED_INFORMATION_CLASS = Enum( 'TrustedDomainNameInformation', 'TrustedControllersInformation', 'TrustedPosixOffsetInformation', 'TrustedPasswordInformation', 'TrustedDomainInformationBasic', 'TrustedDomainInformationEx', 'TrustedDomainAuthInformation', 'TrustedDomainFullInformation', 'TrustedDomainAuthInformationInternal', 'TrustedDomainFullInformationInternal', 'TrustedDomainInformationEx2Internal', 'TrustedDomainFullInformation2Internal') TRUSTEE_FORM = Enum( 'TRUSTEE_IS_SID', 'TRUSTEE_IS_NAME', 'TRUSTEE_BAD_FORM', 'TRUSTEE_IS_OBJECTS_AND_SID', 'TRUSTEE_IS_OBJECTS_AND_NAME') TRUSTEE_TYPE = Enum( 'TRUSTEE_IS_UNKNOWN', 'TRUSTEE_IS_USER', 'TRUSTEE_IS_GROUP', 'TRUSTEE_IS_DOMAIN', 'TRUSTEE_IS_ALIAS', 'TRUSTEE_IS_WELL_KNOWN_GROUP', 'TRUSTEE_IS_DELETED', 'TRUSTEE_IS_INVALID', 'TRUSTEE_IS_COMPUTER') ## SE_OBJECT_TYPE - securable objects SE_OBJECT_TYPE = Enum( 'SE_UNKNOWN_OBJECT_TYPE', 'SE_FILE_OBJECT', 'SE_SERVICE', 'SE_PRINTER', 'SE_REGISTRY_KEY', 'SE_LMSHARE', 'SE_KERNEL_OBJECT', 'SE_WINDOW_OBJECT', 'SE_DS_OBJECT', 'SE_DS_OBJECT_ALL', 'SE_PROVIDER_DEFINED_OBJECT', 'SE_WMIGUID_OBJECT', 'SE_REGISTRY_WOW64_32KEY') PRIVILEGE_FLAGS = Enum( 'SE_PRIVILEGE_ENABLED_BY_DEFAULT', 'SE_PRIVILEGE_ENABLED', 'SE_PRIVILEGE_USED_FOR_ACCESS') # Group flags used with TokenGroups TOKEN_GROUP_ATTRIBUTES = Enum( 'SE_GROUP_MANDATORY', 'SE_GROUP_ENABLED_BY_DEFAULT', 'SE_GROUP_ENABLED', 'SE_GROUP_OWNER', 'SE_GROUP_USE_FOR_DENY_ONLY', 'SE_GROUP_INTEGRITY', 'SE_GROUP_INTEGRITY_ENABLED', 'SE_GROUP_LOGON_ID', 'SE_GROUP_RESOURCE') # Privilege flags returned by TokenPrivileges TOKEN_PRIVILEGE_ATTRIBUTES = Enum( 'SE_PRIVILEGE_ENABLED_BY_DEFAULT', 'SE_PRIVILEGE_ENABLED', 'SE_PRIVILEGE_REMOVED', 'SE_PRIVILEGE_USED_FOR_ACCESS') PK Y03KI#win32/Demos/security/regsecurity.pyUT  YZx`ux import win32api, win32con, win32security, ntsecuritycon new_privs = ((win32security.LookupPrivilegeValue('',ntsecuritycon.SE_SECURITY_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',ntsecuritycon.SE_TCB_NAME),win32con.SE_PRIVILEGE_ENABLED) ) ph = win32api.GetCurrentProcess() th = win32security.OpenProcessToken(ph,win32security.TOKEN_ALL_ACCESS|win32con.TOKEN_ADJUST_PRIVILEGES) win32security.AdjustTokenPrivileges(th,0,new_privs) hkey=win32api.RegOpenKey(win32con.HKEY_LOCAL_MACHINE,None,0,win32con.KEY_ALL_ACCESS) win32api.RegCreateKey(hkey,'SYSTEM\\NOTMP') notmpkey=win32api.RegOpenKey(hkey,'SYSTEM\\notmp',0,win32con.ACCESS_SYSTEM_SECURITY) tmp_sid = win32security.LookupAccountName('','tmp')[0] sacl=win32security.ACL() sacl.AddAuditAccessAce(win32security.ACL_REVISION,win32con.GENERIC_ALL,tmp_sid,1,1) sd=win32security.SECURITY_DESCRIPTOR() sd.SetSecurityDescriptorSacl(1,sacl,1) win32api.RegSetKeySecurity(notmpkey,win32con.SACL_SECURITY_INFORMATION,sd) PK ѳP='win32/Demos/security/set_policy_info.pyUT l_Zx`ux import win32security,win32file,win32api,ntsecuritycon,win32con policy_handle = win32security.GetPolicyHandle('rupole',win32security.POLICY_ALL_ACCESS) event_audit_info=win32security.LsaQueryInformationPolicy(policy_handle,win32security.PolicyAuditEventsInformation) print(event_audit_info) new_audit_info=list(event_audit_info[1]) new_audit_info[win32security.AuditCategoryPolicyChange]= \ win32security.POLICY_AUDIT_EVENT_SUCCESS|win32security.POLICY_AUDIT_EVENT_FAILURE new_audit_info[win32security.AuditCategoryAccountLogon]= \ win32security.POLICY_AUDIT_EVENT_SUCCESS|win32security.POLICY_AUDIT_EVENT_FAILURE new_audit_info[win32security.AuditCategoryLogon]= \ win32security.POLICY_AUDIT_EVENT_SUCCESS|win32security.POLICY_AUDIT_EVENT_FAILURE win32security.LsaSetInformationPolicy(policy_handle, win32security.PolicyAuditEventsInformation, (1,new_audit_info)) win32security.LsaClose(policy_handle) PK ѳPc 'win32/Demos/security/get_policy_info.pyUT l_Zx`ux import win32security,win32file,win32api,ntsecuritycon,win32con policy_handle = win32security.GetPolicyHandle('rupole',win32security.POLICY_ALL_ACCESS) ## mod_nbr, mod_time = win32security.LsaQueryInformationPolicy(policy_handle,win32security.PolicyModificationInformation) ## print mod_nbr, mod_time domain_name,dns_domain_name, dns_forest_name, domain_guid, domain_sid = \ win32security.LsaQueryInformationPolicy(policy_handle,win32security.PolicyDnsDomainInformation) print(domain_name, dns_domain_name, dns_forest_name, domain_guid, domain_sid) event_audit_info=win32security.LsaQueryInformationPolicy(policy_handle,win32security.PolicyAuditEventsInformation) print(event_audit_info) domain_name,sid =win32security.LsaQueryInformationPolicy(policy_handle,win32security.PolicyPrimaryDomainInformation) print(domain_name, sid) domain_name,sid =win32security.LsaQueryInformationPolicy(policy_handle,win32security.PolicyAccountDomainInformation) print(domain_name, sid) server_role = win32security.LsaQueryInformationPolicy(policy_handle,win32security.PolicyLsaServerRoleInformation) print('server role: ',server_role) win32security.LsaClose(policy_handle) PK ѳP莂,win32/Demos/security/setnamedsecurityinfo.pyUT l_Zx`ux import win32security,win32api,win32con, win32process fname, tmp = win32api.GetTempFileName(win32api.GetTempPath(),'tmp') print(fname) ## You need SE_RESTORE_NAME to be able to set the owner of a security descriptor to anybody ## other than yourself or your primary group. Most admin logins don't have it by default, so ## enabling it may fail new_privs = ((win32security.LookupPrivilegeValue('',win32security.SE_SECURITY_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',win32security.SE_TCB_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',win32security.SE_SHUTDOWN_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',win32security.SE_RESTORE_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',win32security.SE_TAKE_OWNERSHIP_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',win32security.SE_CREATE_PERMANENT_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',win32security.SE_ENABLE_DELEGATION_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',win32security.SE_CHANGE_NOTIFY_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',win32security.SE_DEBUG_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',win32security.SE_PROF_SINGLE_PROCESS_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',win32security.SE_SYSTEM_PROFILE_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',win32security.SE_LOCK_MEMORY_NAME),win32con.SE_PRIVILEGE_ENABLED) ) all_info=win32security.OWNER_SECURITY_INFORMATION|win32security.GROUP_SECURITY_INFORMATION| \ win32security.DACL_SECURITY_INFORMATION|win32security.SACL_SECURITY_INFORMATION ph=win32process.GetCurrentProcess() th = win32security.OpenProcessToken(ph,win32security.TOKEN_ALL_ACCESS) ##win32con.TOKEN_ADJUST_PRIVILEGES) win32security.AdjustTokenPrivileges(th,0,new_privs) my_sid = win32security.GetTokenInformation(th,win32security.TokenUser)[0] pwr_sid=win32security.LookupAccountName('','Power Users')[0] sd=win32security.GetNamedSecurityInfo(fname,win32security.SE_FILE_OBJECT,all_info) dacl=sd.GetSecurityDescriptorDacl() if dacl is None: dacl=win32security.ACL() sacl=sd.GetSecurityDescriptorSacl() if sacl is None: sacl=win32security.ACL() dacl_ace_cnt=dacl.GetAceCount() sacl_ace_cnt=sacl.GetAceCount() dacl.AddAccessAllowedAce(dacl.GetAclRevision(),win32con.ACCESS_SYSTEM_SECURITY|win32con.WRITE_DAC,my_sid) sacl.AddAuditAccessAce(sacl.GetAclRevision(),win32con.GENERIC_ALL,my_sid,1,1) win32security.SetNamedSecurityInfo(fname,win32security.SE_FILE_OBJECT,all_info,pwr_sid, pwr_sid, dacl, sacl) new_sd=win32security.GetNamedSecurityInfo(fname,win32security.SE_FILE_OBJECT,all_info) ## could do additional checking to make sure added ACE contains expected info if new_sd.GetSecurityDescriptorDacl().GetAceCount()!=dacl_ace_cnt+1: print('New dacl doesn''t contain extra ace ????') if new_sd.GetSecurityDescriptorSacl().GetAceCount()!=sacl_ace_cnt+1: print('New Sacl doesn''t contain extra ace ????') if win32security.LookupAccountSid('',new_sd.GetSecurityDescriptorOwner())[0]!='Power Users': print('Owner not successfully set to Power Users !!!!!') if win32security.LookupAccountSid('',new_sd.GetSecurityDescriptorGroup())[0]!='Power Users': print('Group not successfully set to Power Users !!!!!') win32security.SetNamedSecurityInfo(fname,win32security.SE_FILE_OBJECT,win32security.SACL_SECURITY_INFORMATION, None, None, None, None) new_sd_1=win32security.GetNamedSecurityInfo(fname,win32security.SE_FILE_OBJECT,win32security.SACL_SECURITY_INFORMATION) if new_sd_1.GetSecurityDescriptorSacl() is not None: print('Unable to set Sacl to NULL !!!!!!!!') PK ѳPkff)win32/Demos/security/query_information.pyUT l_Zx`ux from ntsecuritycon import * import win32api, win32security, winerror # This is a Python implementation of win32api.GetDomainName() def GetDomainName(): try: tok = win32security.OpenThreadToken(win32api.GetCurrentThread(), TOKEN_QUERY, 1) except win32api.error as details: if details[0] != winerror.ERROR_NO_TOKEN: raise # attempt to open the process token, since no thread token # exists tok = win32security.OpenProcessToken(win32api.GetCurrentProcess(), TOKEN_QUERY) sid, attr = win32security.GetTokenInformation(tok, TokenUser) win32api.CloseHandle(tok) name, dom, typ = win32security.LookupAccountSid(None, sid) return dom if __name__=='__main__': print("Domain name is", GetDomainName()) PK Y03Kf( win32/Demos/security/lsastore.pyUT  YZx`ux import win32security policy_handle = win32security.GetPolicyHandle('',win32security.POLICY_ALL_ACCESS) privatedata='some sensitive data' keyname='tmp' win32security.LsaStorePrivateData(policy_handle,keyname,privatedata) retrieveddata=win32security.LsaRetrievePrivateData(policy_handle,keyname) assert retrieveddata==privatedata ## passing None deletes key win32security.LsaStorePrivateData(policy_handle,keyname,None) win32security.LsaClose(policy_handle) PK ѳPX'win32/Demos/security/localized_names.pyUT l_Zx`ux # A Python port of the MS knowledge base article Q157234 # "How to deal with localized and renamed user and group names" # http://support.microsoft.com/default.aspx?kbid=157234 import sys from win32net import NetUserModalsGet from win32security import LookupAccountSid import pywintypes from ntsecuritycon import * def LookupAliasFromRid(TargetComputer, Rid): # Sid is the same regardless of machine, since the well-known # BUILTIN domain is referenced. sid = pywintypes.SID() sid.Initialize(SECURITY_NT_AUTHORITY, 2) for i, r in enumerate((SECURITY_BUILTIN_DOMAIN_RID, Rid)): sid.SetSubAuthority(i, r) name, domain, typ = LookupAccountSid(TargetComputer, sid) return name def LookupUserGroupFromRid(TargetComputer, Rid): # get the account domain Sid on the target machine # note: if you were looking up multiple sids based on the same # account domain, only need to call this once. umi2 = NetUserModalsGet(TargetComputer, 2) domain_sid = umi2['domain_id'] SubAuthorityCount = domain_sid.GetSubAuthorityCount() # create and init new sid with acct domain Sid + acct Rid sid = pywintypes.SID() sid.Initialize(domain_sid.GetSidIdentifierAuthority(), SubAuthorityCount+1) # copy existing subauthorities from account domain Sid into # new Sid for i in range(SubAuthorityCount): sid.SetSubAuthority(i, domain_sid.GetSubAuthority(i)) # append Rid to new Sid sid.SetSubAuthority(SubAuthorityCount, Rid) name, domain, typ = LookupAccountSid(TargetComputer, sid) return name def main(): if len(sys.argv) == 2: targetComputer = sys.argv[1] else: targetComputer = None name = LookupUserGroupFromRid(targetComputer, DOMAIN_USER_RID_ADMIN) print("'Administrator' user name = %s" % (name,)) name = LookupAliasFromRid(targetComputer, DOMAIN_ALIAS_RID_ADMINS) print("'Administrators' local group/alias name = %s" % (name,)) if __name__=='__main__': main() PK ѳPWLD'win32/Demos/security/setsecurityinfo.pyUT l_Zx`ux import win32security,win32api,win32con, win32process ## You need SE_RESTORE_NAME to be able to set the owner of a security descriptor to anybody ## other than yourself or your primary group. Most admin logins don't have it by default, so ## enabling it may fail new_privs = ((win32security.LookupPrivilegeValue('',win32security.SE_SECURITY_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',win32security.SE_TCB_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',win32security.SE_SHUTDOWN_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',win32security.SE_RESTORE_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',win32security.SE_TAKE_OWNERSHIP_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',win32security.SE_CREATE_PERMANENT_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',win32security.SE_ENABLE_DELEGATION_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',win32security.SE_CHANGE_NOTIFY_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',win32security.SE_DEBUG_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',win32security.SE_PROF_SINGLE_PROCESS_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',win32security.SE_SYSTEM_PROFILE_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',win32security.SE_LOCK_MEMORY_NAME),win32con.SE_PRIVILEGE_ENABLED) ) all_info=win32security.OWNER_SECURITY_INFORMATION|win32security.GROUP_SECURITY_INFORMATION| \ win32security.DACL_SECURITY_INFORMATION|win32security.SACL_SECURITY_INFORMATION pid=win32api.GetCurrentProcessId() ph=win32api.OpenProcess(win32con.PROCESS_ALL_ACCESS,0,pid) ## PROCESS_ALL_ACCESS does not contain ACCESS_SYSTEM_SECURITY (neccessy to do SACLs) th = win32security.OpenProcessToken(ph,win32security.TOKEN_ALL_ACCESS) ##win32con.TOKEN_ADJUST_PRIVILEGES) old_privs=win32security.AdjustTokenPrivileges(th,0,new_privs) my_sid = win32security.GetTokenInformation(th,win32security.TokenUser)[0] pwr_sid=win32security.LookupAccountName('','Power Users')[0] ## reopen process with ACCESS_SYSTEM_SECURITY now that sufficent privs are enabled ph=win32api.OpenProcess(win32con.PROCESS_ALL_ACCESS|win32con.ACCESS_SYSTEM_SECURITY,0,pid) sd=win32security.GetSecurityInfo(ph,win32security.SE_KERNEL_OBJECT,all_info) dacl=sd.GetSecurityDescriptorDacl() if dacl is None: dacl=win32security.ACL() sacl=sd.GetSecurityDescriptorSacl() if sacl is None: sacl=win32security.ACL() dacl_ace_cnt=dacl.GetAceCount() sacl_ace_cnt=sacl.GetAceCount() dacl.AddAccessAllowedAce(dacl.GetAclRevision(),win32con.ACCESS_SYSTEM_SECURITY|win32con.WRITE_DAC,my_sid) sacl.AddAuditAccessAce(sacl.GetAclRevision(),win32con.GENERIC_ALL,my_sid,1,1) win32security.SetSecurityInfo(ph,win32security.SE_KERNEL_OBJECT,all_info,pwr_sid, pwr_sid, dacl, sacl) new_sd=win32security.GetSecurityInfo(ph,win32security.SE_KERNEL_OBJECT,all_info) if new_sd.GetSecurityDescriptorDacl().GetAceCount()!=dacl_ace_cnt+1: print('New dacl doesn''t contain extra ace ????') if new_sd.GetSecurityDescriptorSacl().GetAceCount()!=sacl_ace_cnt+1: print('New Sacl doesn''t contain extra ace ????') if win32security.LookupAccountSid('',new_sd.GetSecurityDescriptorOwner())[0]!='Power Users': print('Owner not successfully set to Power Users !!!!!') if win32security.LookupAccountSid('',new_sd.GetSecurityDescriptorGroup())[0]!='Power Users': print('Group not successfully set to Power Users !!!!!') win32security.SetSecurityInfo(ph,win32security.SE_KERNEL_OBJECT,win32security.SACL_SECURITY_INFORMATION, None, None, None, None) new_sd_1=win32security.GetSecurityInfo(ph,win32security.SE_KERNEL_OBJECT,win32security.SACL_SECURITY_INFORMATION) if new_sd_1.GetSecurityDescriptorSacl() is not None: print('Unable to set Sacl to NULL !!!!!!!!') PK ѳPø&win32/Demos/security/account_rights.pyUT l_Zx`ux import win32security,win32file,win32api,ntsecuritycon,win32con from security_enums import TRUSTEE_TYPE,TRUSTEE_FORM,ACE_FLAGS,ACCESS_MODE new_privs = ((win32security.LookupPrivilegeValue('',ntsecuritycon.SE_SECURITY_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',ntsecuritycon.SE_CREATE_PERMANENT_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('','SeEnableDelegationPrivilege'),win32con.SE_PRIVILEGE_ENABLED) ##doesn't seem to be in ntsecuritycon.py ? ) ph = win32api.GetCurrentProcess() th = win32security.OpenProcessToken(ph,win32security.TOKEN_ALL_ACCESS) ##win32con.TOKEN_ADJUST_PRIVILEGES) win32security.AdjustTokenPrivileges(th,0,new_privs) policy_handle = win32security.GetPolicyHandle('',win32security.POLICY_ALL_ACCESS) tmp_sid = win32security.LookupAccountName('','tmp')[0] privs=[ntsecuritycon.SE_DEBUG_NAME,ntsecuritycon.SE_TCB_NAME,ntsecuritycon.SE_RESTORE_NAME,ntsecuritycon.SE_REMOTE_SHUTDOWN_NAME] win32security.LsaAddAccountRights(policy_handle,tmp_sid,privs) privlist=win32security.LsaEnumerateAccountRights(policy_handle,tmp_sid) for priv in privlist: print(priv) privs=[ntsecuritycon.SE_DEBUG_NAME,ntsecuritycon.SE_TCB_NAME] win32security.LsaRemoveAccountRights(policy_handle,tmp_sid,0,privs) privlist=win32security.LsaEnumerateAccountRights(policy_handle,tmp_sid) for priv in privlist: print(priv) win32security.LsaClose(policy_handle) PK ѳP}j#win32/Demos/security/lsaregevent.pyUT l_Zx`ux import win32security, win32event evt = win32event.CreateEvent(None,0,0,None) win32security.LsaRegisterPolicyChangeNotification(win32security.PolicyNotifyAuditEventsInformation, evt) print("Waiting for you change Audit policy in Management console ...") ret_code=win32event.WaitForSingleObject(evt,1000000000) ## should come back when you change Audit policy in Management console ... print(ret_code) win32security.LsaUnregisterPolicyChangeNotification(win32security.PolicyNotifyAuditEventsInformation, evt) PK ѳP9DD/win32/Demos/security/setkernelobjectsecurity.pyUT l_Zx`ux import win32security,win32api,win32con, win32process ## You need SE_RESTORE_NAME to be able to set the owner of a security descriptor to anybody ## other than yourself or your primary group. Most admin logins don't have it by default, so ## enabling it may fail new_privs = ((win32security.LookupPrivilegeValue('',win32security.SE_SECURITY_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',win32security.SE_TCB_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',win32security.SE_SHUTDOWN_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',win32security.SE_RESTORE_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',win32security.SE_TAKE_OWNERSHIP_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',win32security.SE_CREATE_PERMANENT_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',win32security.SE_ENABLE_DELEGATION_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',win32security.SE_CHANGE_NOTIFY_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',win32security.SE_DEBUG_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',win32security.SE_PROF_SINGLE_PROCESS_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',win32security.SE_SYSTEM_PROFILE_NAME),win32con.SE_PRIVILEGE_ENABLED), (win32security.LookupPrivilegeValue('',win32security.SE_LOCK_MEMORY_NAME),win32con.SE_PRIVILEGE_ENABLED) ) all_info=win32security.OWNER_SECURITY_INFORMATION|win32security.GROUP_SECURITY_INFORMATION| \ win32security.DACL_SECURITY_INFORMATION|win32security.SACL_SECURITY_INFORMATION pid=win32api.GetCurrentProcessId() ph=win32api.OpenProcess(win32con.PROCESS_ALL_ACCESS,0,pid) ## PROCESS_ALL_ACCESS does not contain ACCESS_SYSTEM_SECURITY (neccessy to do SACLs) th = win32security.OpenProcessToken(ph,win32security.TOKEN_ALL_ACCESS) ##win32con.TOKEN_ADJUST_PRIVILEGES) old_privs=win32security.AdjustTokenPrivileges(th,0,new_privs) my_sid = win32security.GetTokenInformation(th,win32security.TokenUser)[0] pwr_sid=win32security.LookupAccountName('','Power Users')[0] ## reopen process with ACCESS_SYSTEM_SECURITY now that sufficent privs are enabled ph=win32api.OpenProcess(win32con.PROCESS_ALL_ACCESS|win32con.ACCESS_SYSTEM_SECURITY,0,pid) sd=win32security.GetKernelObjectSecurity(ph,all_info) dacl=sd.GetSecurityDescriptorDacl() if dacl is None: dacl=win32security.ACL() sacl=sd.GetSecurityDescriptorSacl() if sacl is None: sacl=win32security.ACL() dacl_ace_cnt=dacl.GetAceCount() sacl_ace_cnt=sacl.GetAceCount() dacl.AddAccessAllowedAce(dacl.GetAclRevision(),win32con.ACCESS_SYSTEM_SECURITY|win32con.WRITE_DAC,my_sid) sacl.AddAuditAccessAce(sacl.GetAclRevision(),win32con.GENERIC_ALL,my_sid,1,1) sd.SetSecurityDescriptorDacl(1,dacl,0) sd.SetSecurityDescriptorSacl(1,sacl,0) sd.SetSecurityDescriptorGroup(pwr_sid,0) sd.SetSecurityDescriptorOwner(pwr_sid,0) win32security.SetKernelObjectSecurity(ph,all_info,sd) new_sd=win32security.GetKernelObjectSecurity(ph,all_info) if new_sd.GetSecurityDescriptorDacl().GetAceCount()!=dacl_ace_cnt+1: print('New dacl doesn''t contain extra ace ????') if new_sd.GetSecurityDescriptorSacl().GetAceCount()!=sacl_ace_cnt+1: print('New Sacl doesn''t contain extra ace ????') if win32security.LookupAccountSid('',new_sd.GetSecurityDescriptorOwner())[0]!='Power Users': print('Owner not successfully set to Power Users !!!!!') if win32security.LookupAccountSid('',new_sd.GetSecurityDescriptorGroup())[0]!='Power Users': print('Group not successfully set to Power Users !!!!!') sd.SetSecurityDescriptorSacl(0,None,0) win32security.SetKernelObjectSecurity(ph, win32security.SACL_SECURITY_INFORMATION, sd) new_sd_1=win32security.GetKernelObjectSecurity(ph,win32security.SACL_SECURITY_INFORMATION) if new_sd_1.GetSecurityDescriptorSacl() is not None: print('Unable to set Sacl to NULL !!!!!!!!') PK {Rwin32/Demos/security/sspi/UT Zx`Zx`ux PK ѳP355&win32/Demos/security/sspi/fetch_url.pyUT l_Zx`ux """ Fetches a URL from a web-server supporting NTLM authentication eg, IIS. If no arguments are specified, a default of http://localhost/localstart.asp is used. This script does follow simple 302 redirections, so pointing at the root of an IIS server is should work. """ import sys import urllib.request, urllib.parse, urllib.error import http.client import urllib.parse from base64 import encodestring, decodestring from sspi import ClientAuth import optparse # sorry, this demo needs 2.3+ options = None # set to optparse options object def open_url(host, url): h = http.client.HTTPConnection(host) # h.set_debuglevel(9) h.putrequest('GET', url) h.endheaders() resp = h.getresponse() print("Initial response is", resp.status, resp.reason) body = resp.read() if resp.status == 302: # object moved url = "/" + resp.msg["location"] resp.close() h.putrequest('GET', url) h.endheaders() resp = h.getresponse() print("After redirect response is", resp.status, resp.reason) if options.show_headers: print("Initial response headers:") for name, val in list(resp.msg.items()): print(" %s: %s" % (name, val)) if options.show_body: print(body) if resp.status == 401: # 401: Unauthorized - here is where the real work starts auth_info = None if options.user or options.domain or options.password: auth_info = options.user, options.domain, options.password ca = ClientAuth("NTLM", auth_info=auth_info) auth_scheme = ca.pkg_info['Name'] data = None while 1: err, out_buf = ca.authorize(data) data = out_buf[0].Buffer # Encode it as base64 as required by HTTP auth = encodestring(data).replace("\012", "") h.putrequest('GET', url) h.putheader('Authorization', auth_scheme + ' ' + auth) h.putheader('Content-Length', '0') h.endheaders() resp = h.getresponse() if options.show_headers: print("Token dance headers:") for name, val in list(resp.msg.items()): print(" %s: %s" % (name, val)) if err==0: break else: if resp.status != 401: print("Eeek - got response", resp.status) cl = resp.msg.get("content-length") if cl: print(repr(resp.read(int(cl)))) else: print("no content!") assert resp.status == 401, resp.status assert not resp.will_close, "NTLM is per-connection - must not close" schemes = [s.strip() for s in resp.msg.get("WWW-Authenticate", "").split(",")] for scheme in schemes: if scheme.startswith(auth_scheme): data = decodestring(scheme[len(auth_scheme)+1:]) break else: print("Could not find scheme '%s' in schemes %r" % (auth_scheme, schemes)) break resp.read() print("Final response status is", resp.status, resp.reason) if resp.status == 200: # Worked! # Check we can read it again without re-authenticating. if resp.will_close: print("EEEK - response will close, but NTLM is per connection - it must stay open") body = resp.read() if options.show_body: print("Final response body:") print(body) h.putrequest('GET', url) h.endheaders() resp = h.getresponse() print("Second fetch response is", resp.status, resp.reason) if options.show_headers: print("Second response headers:") for name, val in list(resp.msg.items()): print(" %s: %s" % (name, val)) resp.read(int(resp.msg.get("content-length", 0))) elif resp.status == 500: print("Error text") print(resp.read()) else: if options.show_body: cl = resp.msg.get("content-length") print(resp.read(int(cl))) if __name__=='__main__': parser = optparse.OptionParser(description=__doc__) parser.add_option("", "--show-body", action="store_true", help="print the body of each response as it is received") parser.add_option("", "--show-headers", action="store_true", help="print the headers of each response as it is received") parser.add_option("", "--user", action="store", help="The username to login with") parser.add_option("", "--password", action="store", help="The password to login with") parser.add_option("", "--domain", action="store", help="The domain to login to") options, args = parser.parse_args() if not args: print("Run with --help for usage details") args = ["http://localhost/localstart.asp"] for url in args: scheme, netloc, path, params, query, fragment = urllib.parse.urlparse(url) if (scheme != "http") or params or query or fragment: parser.error("Scheme must be http, URL must be simple") print("Opening '%s' from '%s'" % (path, netloc)) r = open_url(netloc, path) PK ѳPh'gg.win32/Demos/security/sspi/validate_password.pyUT l_Zx`ux # Demonstrates how to validate a password. # See also MSKB article Q180548 # # To use with Kerberos you need to jump through the 'targetspn' hoops. import win32security import sys from sspi import ClientAuth, ServerAuth def validate(username, password, domain = ""): auth_info = username, domain, password ca = ClientAuth("NTLM", auth_info = auth_info) sa = ServerAuth("NTLM") data = err = None while err != 0: err, data = ca.authorize(data) err, data = sa.authorize(data) # If we get here without exception, we worked! if __name__=='__main__': if len(sys.argv) not in [2,3,4]: print("Usage: %s username [password [domain]]" % (__file__,)) sys.exit(1) # password and domain are optional! password = None if len(sys.argv)>=3: password = sys.argv[2] domain = "" if len(sys.argv)>=4: domain = sys.argv[3] try: validate(sys.argv[1], password, domain) print("Validated OK") except win32security.error as details: hr, func, msg = details print("Validation failed: %s (%d)" % (msg, hr)) PK ѳP ~%*win32/Demos/security/sspi/socket_server.pyUT l_Zx`ux """A sample socket server and client using SSPI authentication and encryption. You must run with either 'client' or 'server' as arguments. A server must be running before a client can connect. To use with Kerberos you should include in the client options --target-spn=username, where 'username' is the user under which the server is being run. Running either the client or server as a different user can be informative. A command-line such as the following may be useful: `runas /user:{user} {fqp}\python.exe {fqp}\socket_server.py --wait client|server` {fqp} should specify the relevant fully-qualified path names. To use 'runas' with Kerberos, the client program will need to specify --target-spn with the username under which the *server* is running. See the SSPI documentation for more details. """ import sys import struct import socketserver import win32api import http.client import traceback import win32security import sspi, sspicon import optparse # sorry, this demo needs 2.3+ options = None # set to optparse object. def GetUserName(): try: return win32api.GetUserName() except win32api.error as details: # Seeing 'access denied' errors here for non-local users (presumably # without permission to login locally). Get the fully-qualified # username, although a side-effect of these permission-denied errors # is a lack of Python codecs - so printing the Unicode value fails. # So just return the repr(), and avoid codecs completely. return repr(win32api.GetUserNameEx(win32api.NameSamCompatible)) # Send a simple "message" over a socket - send the number of bytes first, # then the string. Ditto for receive. def _send_msg(s, m): s.send(struct.pack("i", len(m))) s.send(m) def _get_msg(s): size_data = s.recv(struct.calcsize("i")) if not size_data: return None cb = struct.unpack("i", size_data)[0] return s.recv(cb) class SSPISocketServer(socketserver.TCPServer): def __init__(self, *args, **kw): socketserver.TCPServer.__init__(self, *args, **kw) self.sa = sspi.ServerAuth(options.package) def verify_request(self, sock, ca): # Do the sspi auth dance self.sa.reset() while 1: data = _get_msg(sock) if data is None: return False try: err, sec_buffer = self.sa.authorize(data) except sspi.error as details: print("FAILED to authorize client:", details) return False if err==0: break _send_msg(sock, sec_buffer[0].Buffer) return True def process_request(self, request, client_address): # An example using the connection once it is established. print("The server is running as user", GetUserName()) self.sa.ctxt.ImpersonateSecurityContext() try: print("Having conversation with client as user", GetUserName()) while 1: # we need to grab 2 bits of data - the encrypted data, and the # 'key' data = _get_msg(request) key = _get_msg(request) if data is None or key is None: break data = self.sa.decrypt(data, key) print("Client sent:", repr(data)) finally: self.sa.ctxt.RevertSecurityContext() self.close_request(request) print("The server is back to user", GetUserName()) def serve(): s = SSPISocketServer(("localhost", options.port), None) print("Running test server...") s.serve_forever() def sspi_client(): c = http.client.HTTPConnection("localhost", options.port) c.connect() # Do the auth dance. ca = sspi.ClientAuth(options.package, targetspn=options.target_spn) data = None while 1: err, out_buf = ca.authorize(data) _send_msg(c.sock, out_buf[0].Buffer) if err==0: break data = _get_msg(c.sock) print("Auth dance complete - sending a few encryted messages") # Assume out data is sensitive - encrypt the message. for data in "Hello from the client".split(): blob, key = ca.encrypt(data) _send_msg(c.sock, blob) _send_msg(c.sock, key) c.sock.close() print("Client completed.") if __name__=='__main__': parser = optparse.OptionParser("%prog [options] client|server", description=__doc__) parser.add_option("", "--package", action="store", default="NTLM", help="The SSPI package to use (eg, Kerberos) - default is NTLM") parser.add_option("", "--target-spn", action="store", help="""The target security provider name to use. The string contents are security-package specific. For example, 'Kerberos' or 'Negotiate' require the server principal name (SPN) (ie, the username) of the remote process. For NTLM this must be blank.""") parser.add_option("", "--port", action="store", default="8181", help="The port number to use (default=8181)") parser.add_option("", "--wait", action="store_true", help="""Cause the program to wait for input just before terminating. Useful when using via runas to see any error messages before termination. """) options, args = parser.parse_args() try: options.port = int(options.port) except (ValueError, TypeError): parser.error("--port must be an integer") try: try: if not args: args = [''] if args[0]=="client": sspi_client() elif args[0]=="server": serve() else: parser.error("You must supply 'client' or 'server' - " \ "use --help for details") except KeyboardInterrupt: pass except SystemExit: pass except: traceback.print_exc() finally: if options.wait: input("Press enter to continue") PK ѳP& (win32/Demos/security/sspi/simple_auth.pyUT l_Zx`ux # A demo of basic SSPI authentication. # There is a 'client' context and a 'server' context - typically these will # be on different machines (here they are in the same process, but the same # concepts apply) import sspi import win32security, sspicon, win32api def lookup_ret_code(err): for k,v in list(sspicon.__dict__.items()): if k[0:6] in ('SEC_I_','SEC_E_') and v==err: return k """ pkg_name='Kerberos' sspiclient=SSPIClient(pkg_name, win32api.GetUserName(), ## target spn is ourself None, None, ## use none for client name and authentication information for current context ## u'username', (u'username',u'domain.com',u'passwd'), sspicon.ISC_REQ_INTEGRITY|sspicon.ISC_REQ_SEQUENCE_DETECT|sspicon.ISC_REQ_REPLAY_DETECT| \ sspicon.ISC_REQ_DELEGATE|sspicon.ISC_REQ_CONFIDENTIALITY|sspicon.ISC_REQ_USE_SESSION_KEY) sspiserver=SSPIServer(pkg_name, None, sspicon.ASC_REQ_INTEGRITY|sspicon.ASC_REQ_SEQUENCE_DETECT|sspicon.ASC_REQ_REPLAY_DETECT| \ sspicon.ASC_REQ_DELEGATE|sspicon.ASC_REQ_CONFIDENTIALITY|sspicon.ASC_REQ_STREAM|sspicon.ASC_REQ_USE_SESSION_KEY) """ pkg_name='NTLM' # Setup the 2 contexts. sspiclient=sspi.ClientAuth(pkg_name) sspiserver=sspi.ServerAuth(pkg_name) # Perform the authentication dance, each loop exchanging more information # on the way to completing authentication. sec_buffer=None while 1: err, sec_buffer = sspiclient.authorize(sec_buffer) err, sec_buffer = sspiserver.authorize(sec_buffer) if err==0: break # The server can now impersonate the client. In this demo the 2 users will # always be the same. sspiserver.ctxt.ImpersonateSecurityContext() print('Impersonated user: ',win32api.GetUserNameEx(win32api.NameSamCompatible)) sspiserver.ctxt.RevertSecurityContext() print('Reverted to self: ',win32api.GetUserName()) pkg_size_info=sspiclient.ctxt.QueryContextAttributes(sspicon.SECPKG_ATTR_SIZES) # Now sign some data msg='some data to be encrypted ......' sigsize=pkg_size_info['MaxSignature'] sigbuf=win32security.PySecBufferDescType() sigbuf.append(win32security.PySecBufferType(len(msg), sspicon.SECBUFFER_DATA)) sigbuf.append(win32security.PySecBufferType(sigsize, sspicon.SECBUFFER_TOKEN)) sigbuf[0].Buffer=msg sspiclient.ctxt.MakeSignature(0,sigbuf,1) sspiserver.ctxt.VerifySignature(sigbuf,1) # And finally encrypt some. trailersize=pkg_size_info['SecurityTrailer'] encbuf=win32security.PySecBufferDescType() encbuf.append(win32security.PySecBufferType(len(msg), sspicon.SECBUFFER_DATA)) encbuf.append(win32security.PySecBufferType(trailersize, sspicon.SECBUFFER_TOKEN)) encbuf[0].Buffer=msg sspiclient.ctxt.EncryptMessage(0,encbuf,1) print('Encrypted data:',repr(encbuf[0].Buffer)) sspiserver.ctxt.DecryptMessage(encbuf,1) print('Unencrypted data:',encbuf[0].Buffer) PK {Rwin32/Demos/images/UT Zx`Zx`ux PK Y03KkO6 6 win32/Demos/images/smiley.bmpUT  YZx`ux BM6 6(     # $# $# $# $ $ .$ ##7.$ ##  RI@7.$  [RI@7. d[RI.$ md[R7.$ vmd[RI@7.$ vmd[RI@7.$ vmd[RI@7.$ vmd[RI@7.$  vm@7.$!! vI@7.$!!00vmd[@7.$00vmdI@7.vmd[RI@7.$ **vmd[RI@7.$ **vmd[RI@7.$vmd[RI@7.$vmd[RIvmd[R77  77  PK Y03K 6 6 win32/Demos/images/frowny.bmpUT  YZx`ux BM6 6(   @@  @@"$& **"$ **# $# $ "$&)+# $# $ "$&)  "$&)+  $  "$&)  .$      , , "$&##7.$      , , "$##  RI@7    &&"$&  [RI@  $  &&"$ d[RI@7.$  "md[RI@7.  vmd[RI@7        !!vmd[RI@        !!vmd[RI  .$  vmd[R  7.$   55RI@7.$ ,,$$ !! 55[RI@7.$ ,,$$ !!00vmd[RI@7.$    00vmd[RI@7.$   vmd[RI@7.$ **vmd[RI@7.$ **RRvmd[RI@7.$RRvmd[RI@7.$vmd[RI  vmd[R  77  77  PK ѳP~pp win32/Demos/win32console_demo.pyUT l_Zx`ux import win32console, win32con import traceback, time virtual_keys={} for k,v in list(win32con.__dict__.items()): if k.startswith('VK_'): virtual_keys[v]=k free_console=True try: win32console.AllocConsole() except win32console.error as exc: if exc.winerror!=5: raise ## only free console if one was created successfully free_console=False stdout=win32console.GetStdHandle(win32console.STD_OUTPUT_HANDLE) stdin=win32console.GetStdHandle(win32console.STD_INPUT_HANDLE) newbuffer=win32console.CreateConsoleScreenBuffer() newbuffer.SetConsoleActiveScreenBuffer() newbuffer.SetConsoleTextAttribute(win32console.FOREGROUND_RED|win32console.FOREGROUND_INTENSITY |win32console.BACKGROUND_GREEN|win32console.BACKGROUND_INTENSITY) newbuffer.WriteConsole('This is a new screen buffer\n') ## test setting screen buffer and window size ## screen buffer size cannot be smaller than window size window_size=newbuffer.GetConsoleScreenBufferInfo()['Window'] coord=win32console.PyCOORDType(X=window_size.Right+20, Y=window_size.Bottom+20) newbuffer.SetConsoleScreenBufferSize(coord) window_size.Right+=10 window_size.Bottom+=10 newbuffer.SetConsoleWindowInfo(Absolute=True,ConsoleWindow=window_size) ## write some records to the input queue x=win32console.PyINPUT_RECORDType(win32console.KEY_EVENT) x.Char='X' x.KeyDown=True x.RepeatCount=1 x.VirtualKeyCode=0x58 x.ControlKeyState=win32con.SHIFT_PRESSED z=win32console.PyINPUT_RECORDType(win32console.KEY_EVENT) z.Char='Z' z.KeyDown=True z.RepeatCount=1 z.VirtualKeyCode=0x5a z.ControlKeyState=win32con.SHIFT_PRESSED stdin.WriteConsoleInput([x,z,x]) newbuffer.SetConsoleTextAttribute(win32console.FOREGROUND_RED|win32console.FOREGROUND_INTENSITY |win32console.BACKGROUND_GREEN|win32console.BACKGROUND_INTENSITY) newbuffer.WriteConsole('Press some keys, click some characters with the mouse\n') newbuffer.SetConsoleTextAttribute(win32console.FOREGROUND_BLUE|win32console.FOREGROUND_INTENSITY |win32console.BACKGROUND_RED|win32console.BACKGROUND_INTENSITY) newbuffer.WriteConsole('Hit "End" key to quit\n') breakout=False while not breakout: input_records=stdin.ReadConsoleInput(10) for input_record in input_records: if input_record.EventType==win32console.KEY_EVENT: if input_record.KeyDown: if input_record.Char=='\0': newbuffer.WriteConsole(virtual_keys.get(input_record.VirtualKeyCode, 'VirtualKeyCode: %s' %input_record.VirtualKeyCode)) else: newbuffer.WriteConsole(input_record.Char) if input_record.VirtualKeyCode==win32con.VK_END: breakout=True break elif input_record.EventType==win32console.MOUSE_EVENT: if input_record.EventFlags==0: ## 0 indicates a button event if input_record.ButtonState!=0: ## exclude button releases pos=input_record.MousePosition # switch the foreground and background colors of the character that was clicked attr=newbuffer.ReadConsoleOutputAttribute(Length=1, ReadCoord=pos)[0] new_attr=attr if attr&win32console.FOREGROUND_BLUE: new_attr=(new_attr&~win32console.FOREGROUND_BLUE)|win32console.BACKGROUND_BLUE if attr&win32console.FOREGROUND_RED: new_attr=(new_attr&~win32console.FOREGROUND_RED)|win32console.BACKGROUND_RED if attr&win32console.FOREGROUND_GREEN: new_attr=(new_attr&~win32console.FOREGROUND_GREEN)|win32console.BACKGROUND_GREEN if attr&win32console.BACKGROUND_BLUE: new_attr=(new_attr&~win32console.BACKGROUND_BLUE)|win32console.FOREGROUND_BLUE if attr&win32console.BACKGROUND_RED: new_attr=(new_attr&~win32console.BACKGROUND_RED)|win32console.FOREGROUND_RED if attr&win32console.BACKGROUND_GREEN: new_attr=(new_attr&~win32console.BACKGROUND_GREEN)|win32console.FOREGROUND_GREEN newbuffer.WriteConsoleOutputAttribute((new_attr,),pos) else: newbuffer.WriteConsole(str(input_record)) time.sleep(0.1) stdout.SetConsoleActiveScreenBuffer() newbuffer.Close() if free_console: win32console.FreeConsole() PK ѳPΜwin32/Demos/win32cred_demo.pyUT l_Zx`ux """ Demonstrates prompting for credentials, saving, and loggging on with marshalled credential. Also shows how to load user's profile """ import win32net, win32security, win32api, win32con import win32profile, win32cred ## Prompt for a username/pwd for local computer uiinfo={'MessageText':'Enter credentials for local machine','CaptionText':'win32cred_demo.py'} target, pwd, save=win32cred.CredUIPromptForCredentials(TargetName=win32api.GetComputerName(), AuthError=0, Flags=win32cred.CREDUI_FLAGS_DO_NOT_PERSIST|win32cred.CREDUI_FLAGS_SHOW_SAVE_CHECK_BOX, Save=False, UiInfo=uiinfo) attrs=[ {'Keyword':'attr1', 'Flags':0, 'Value':'unicode data'}, {'Keyword':'attr2', 'Flags':0, 'Value':'character data'} ] cred={'Comment':'Created by win32cred_demo.py', 'UserName':target, 'TargetAlias': None, 'TargetName':target,'CredentialBlob':pwd, 'Flags':win32cred.CRED_FLAGS_USERNAME_TARGET, 'Persist':win32cred.CRED_PERSIST_ENTERPRISE,'Type':win32cred.CRED_TYPE_DOMAIN_PASSWORD, 'Attributes':attrs} win32cred.CredWrite(cred) pwd=None print(win32cred.CredRead(target, win32cred.CRED_TYPE_DOMAIN_PASSWORD)) ## Marshal saved credential and use it to log on mc=win32cred.CredMarshalCredential(win32cred.UsernameTargetCredential, target) th=win32security.LogonUser(mc,None,'',win32con.LOGON32_LOGON_INTERACTIVE, win32con.LOGON32_PROVIDER_DEFAULT) win32security.ImpersonateLoggedOnUser(th) print('GetUserName:',win32api.GetUserName()) win32security.RevertToSelf() ## Load user's profile. (first check if user has a roaming profile) username, domain=win32cred.CredUIParseUserName(target) user_info_4=win32net.NetUserGetInfo(None, username, 4) profilepath=user_info_4['profile'] ## LoadUserProfile apparently doesn't like an empty string if not profilepath: profilepath=None ## leave Flags in since 2.3 still chokes on some types of optional keyword args hk=win32profile.LoadUserProfile(th, {'UserName':username, 'Flags':0, 'ProfilePath':profilepath}) ## Get user's environment variables in a form that can be passed to win32process.CreateProcessAsUser env=win32profile.CreateEnvironmentBlock(th,False) ## Cleanup should probably be in a finally block win32profile.UnloadUserProfile(th, hk) th.Close() PK ѳPmX((win32/Demos/getfilever.pyUT l_Zx`ux import os, win32api ver_strings=('Comments','InternalName','ProductName', 'CompanyName','LegalCopyright','ProductVersion', 'FileDescription','LegalTrademarks','PrivateBuild', 'FileVersion','OriginalFilename','SpecialBuild') fname = os.environ["comspec"] d=win32api.GetFileVersionInfo(fname, '\\') ## backslash as parm returns dictionary of numeric info corresponding to VS_FIXEDFILEINFO struc for n, v in d.items(): print(n, v) pairs=win32api.GetFileVersionInfo(fname, '\\VarFileInfo\\Translation') ## \VarFileInfo\Translation returns list of available (language, codepage) pairs that can be used to retreive string info ## any other must be of the form \StringfileInfo\%04X%04X\parm_name, middle two are language/codepage pair returned from above for lang, codepage in pairs: print('lang: ', lang, 'codepage:', codepage) for ver_string in ver_strings: str_info='\\StringFileInfo\\%04X%04X\\%s' %(lang,codepage,ver_string) ## print str_info print(ver_string, repr(win32api.GetFileVersionInfo(fname, str_info))) PK ѳP  win32/Demos/mmapfile_demo.pyUT l_Zx`ux import win32api, mmapfile import winerror import tempfile, os from pywin32_testutil import str2bytes system_info=win32api.GetSystemInfo() page_size=system_info[1] alloc_size=system_info[7] fname=tempfile.mktemp() mapping_name=os.path.split(fname)[1] fsize=8*page_size print(fname, fsize, mapping_name) m1=mmapfile.mmapfile(File=fname, Name=mapping_name, MaximumSize=fsize) m1.seek(100) m1.write_byte(str2bytes('?')) m1.seek(-1,1) assert m1.read_byte()==str2bytes('?') ## A reopened named mapping should have exact same size as original mapping m2=mmapfile.mmapfile(Name=mapping_name, File=None, MaximumSize=fsize*2) assert m2.size()==m1.size() m1.seek(0,0) m1.write(fsize*str2bytes('s')) assert m2.read(fsize)==fsize*str2bytes('s') move_src=100 move_dest=500 move_size=150 m2.seek(move_src,0) assert m2.tell()==move_src m2.write(str2bytes('m')*move_size) m2.move(move_dest, move_src, move_size) m2.seek(move_dest, 0) assert m2.read(move_size) == str2bytes('m') * move_size ## m2.write('x'* (fsize+1)) m2.close() m1.resize(fsize*2) assert m1.size()==fsize * 2 m1.seek(fsize) m1.write(str2bytes('w') * fsize) m1.flush() m1.close() os.remove(fname) ## Test a file with size larger than 32 bits ## need 10 GB free on drive where your temp folder lives fname_large=tempfile.mktemp() mapping_name='Pywin32_large_mmap' offsetdata=str2bytes('This is start of offset') ## Deliberately use odd numbers to test rounding logic fsize = (1024*1024*1024*10) + 333 offset = (1024*1024*32) + 42 view_size = (1024*1024*16) + 111 ## round mapping size and view size up to multiple of system page size if fsize%page_size: fsize += page_size - (fsize%page_size) if view_size%page_size: view_size += page_size - (view_size%page_size) ## round offset down to multiple of allocation granularity offset -= offset%alloc_size m1=None m2=None try: try: m1=mmapfile.mmapfile(fname_large, mapping_name, fsize, 0, offset*2) except mmapfile.error as exc: # if we don't have enough disk-space, that's OK. if exc.winerror!=winerror.ERROR_DISK_FULL: raise print("skipping large file test - need", fsize, "available bytes.") else: m1.seek(offset) m1.write(offsetdata) ## When reopening an existing mapping without passing a file handle, you have ## to specify a positive size even though it's ignored m2=mmapfile.mmapfile(File=None, Name=mapping_name, MaximumSize=1, FileOffset=offset, NumberOfBytesToMap=view_size) assert m2.read(len(offsetdata))==offsetdata finally: if m1 is not None: m1.close() if m2 is not None: m2.close() if os.path.exists(fname_large): os.remove(fname_large) PK {Rwin32/Demos/dde/UT Zx`Zx`ux PK ѳP[win32/Demos/dde/ddeserver.pyUT l_Zx`ux # 'Request' example added jjk 11/20/98 import win32ui from pywin.mfc import object import dde class MySystemTopic(object.Object): def __init__(self): object.Object.__init__(self, dde.CreateServerSystemTopic()) def Exec(self, cmd): print("System Topic asked to exec", cmd) class MyOtherTopic(object.Object): def __init__(self, topicName): object.Object.__init__(self, dde.CreateTopic(topicName)) def Exec(self, cmd): print("Other Topic asked to exec", cmd) class MyRequestTopic(object.Object): def __init__(self, topicName): topic = dde.CreateTopic(topicName) topic.AddItem(dde.CreateStringItem("")) object.Object.__init__(self, topic) def Request(self, aString): print("Request Topic asked to compute length of:", aString) return(str(len(aString))) server = dde.CreateServer() server.AddTopic(MySystemTopic()) server.AddTopic(MyOtherTopic("RunAnyCommand")) server.AddTopic(MyRequestTopic("ComputeStringLength")) server.Create('RunAny') while 1: win32ui.PumpWaitingMessages(0, -1) PK ѳP&}win32/Demos/dde/ddeclient.pyUT l_Zx`ux # 'Request' example added jjk 11/20/98 import win32ui import dde server = dde.CreateServer() server.Create("TestClient") conversation = dde.CreateConversation(server) conversation.ConnectTo("RunAny", "RunAnyCommand") conversation.Exec("DoSomething") conversation.Exec("DoSomethingElse") conversation.ConnectTo("RunAny", "ComputeStringLength") s = 'abcdefghi' sl = conversation.Request(s) print('length of "%s" is %s'%(s,sl)) PK ѳPVԃ win32/Demos/print_desktop.pyUT l_Zx`ux import win32print, pywintypes, win32con, win32gui, win32api pname=win32print.GetDefaultPrinter() print(pname) p=win32print.OpenPrinter(pname) print('Printer handle: ',p) print_processor=win32print.GetPrinter(p,2)['pPrintProcessor'] ## call with last parm set to 0 to get total size needed for printer's DEVMODE dmsize=win32print.DocumentProperties(0, p, pname, None, None, 0) ## dmDriverExtra should be total size - fixed size driverextra=dmsize - pywintypes.DEVMODEType().Size ## need a better way to get DEVMODE.dmSize dm=pywintypes.DEVMODEType(driverextra) dm.Fields=dm.Fields|win32con.DM_ORIENTATION|win32con.DM_COPIES dm.Orientation=win32con.DMORIENT_LANDSCAPE dm.Copies=2 win32print.DocumentProperties(0, p, pname, dm, dm, win32con.DM_IN_BUFFER|win32con.DM_OUT_BUFFER) pDC=win32gui.CreateDC(print_processor,pname,dm) printerwidth=win32print.GetDeviceCaps(pDC, win32con.PHYSICALWIDTH) printerheight=win32print.GetDeviceCaps(pDC, win32con.PHYSICALHEIGHT) hwnd=win32gui.GetDesktopWindow() l,t,r,b=win32gui.GetWindowRect(hwnd) desktopheight=b-t desktopwidth=r-l dDC = win32gui.GetWindowDC(hwnd) dcDC=win32gui.CreateCompatibleDC(dDC) dcBM = win32gui.CreateCompatibleBitmap(dDC, desktopwidth, desktopheight); win32gui.SelectObject(dcDC, dcBM) win32gui.StretchBlt(dcDC, 0, 0, desktopwidth, desktopheight, dDC, 0, 0, desktopwidth, desktopheight, win32con.SRCCOPY) pcDC=win32gui.CreateCompatibleDC(pDC) pcBM=win32gui.CreateCompatibleBitmap(pDC, printerwidth, printerheight) win32gui.SelectObject(pcDC, pcBM) win32gui.StretchBlt(pcDC, 0, 0, printerwidth, printerheight, dcDC, 0, 0, desktopwidth, desktopheight, win32con.SRCCOPY) win32print.StartDoc(pDC,('desktop.bmp',None,None,0)) win32print.StartPage(pDC) win32gui.StretchBlt(pDC, 0, 0, int(printerwidth*.9), int(printerheight*.9), pcDC, 0, 0, printerwidth, printerheight, win32con.SRCCOPY) font=win32gui.LOGFONT() font.lfHeight=int(printerheight/20) font.lfWidth=font.lfHeight font.lfWeight=150 font.lfItalic=1 font.lfUnderline=1 hf=win32gui.CreateFontIndirect(font) win32gui.SelectObject(pDC,hf) win32gui.SetBkMode(pDC, win32con.TRANSPARENT) win32gui.SetTextColor(pDC,win32api.RGB(0,255,0)) win32gui.DrawText(pDC,'Printed by Python!', -1, (0,0, int(printerwidth*.9), int(printerheight*.9)), win32con.DT_RIGHT|win32con.DT_BOTTOM|win32con.DT_SINGLELINE) win32print.EndPage(pDC) win32print.EndDoc(pDC) win32print.ClosePrinter(p) win32gui.DeleteObject(dcBM) win32gui.DeleteObject(pcBM) win32gui.DeleteObject(hf) win32gui.DeleteDC(dDC) win32gui.DeleteDC(dcDC) win32gui.DeleteDC(pDC) win32gui.DeleteDC(pcDC) PK ѳP˟d !!win32/Demos/win32netdemo.pyUT l_Zx`ux import sys import win32api import win32net import win32netcon import win32security import getopt import traceback verbose_level = 0 server = None # Run on local machine. def verbose(msg): if verbose_level: print(msg) def CreateUser(): "Creates a new test user, then deletes the user" testName = "PyNetTestUser" try: win32net.NetUserDel(server, testName) print("Warning - deleted user before creating it!") except win32net.error: pass d = {} d['name'] = testName d['password'] = 'deleteme' d['priv'] = win32netcon.USER_PRIV_USER d['comment'] = "Delete me - created by Python test code" d['flags'] = win32netcon.UF_NORMAL_ACCOUNT | win32netcon.UF_SCRIPT win32net.NetUserAdd(server, 1, d) try: try: win32net.NetUserChangePassword(server, testName, "wrong", "new") print("ERROR: NetUserChangePassword worked with a wrong password!") except win32net.error: pass win32net.NetUserChangePassword(server, testName, "deleteme", "new") finally: win32net.NetUserDel(server, testName) print("Created a user, changed their password, and deleted them!") def UserEnum(): "Enumerates all the local users" resume = 0 nuser = 0 while 1: data, total, resume = win32net.NetUserEnum(server, 3, win32netcon.FILTER_NORMAL_ACCOUNT, resume) verbose("Call to NetUserEnum obtained %d entries of %d total" % (len(data), total)) for user in data: verbose("Found user %s" % user['name']) nuser = nuser + 1 if not resume: break assert nuser, "Could not find any users!" print("Enumerated all the local users") def GroupEnum(): "Enumerates all the domain groups" nmembers = 0 resume = 0 while 1: data, total, resume = win32net.NetGroupEnum(server, 1, resume) # print "Call to NetGroupEnum obtained %d entries of %d total" % (len(data), total) for group in data: verbose("Found group %(name)s:%(comment)s " % group) memberresume = 0 while 1: memberdata, total, memberresume = win32net.NetGroupGetUsers(server, group['name'], 0, resume) for member in memberdata: verbose(" Member %(name)s" % member) nmembers = nmembers + 1 if memberresume==0: break if not resume: break assert nmembers, "Couldnt find a single member in a single group!" print("Enumerated all the groups") def LocalGroupEnum(): "Enumerates all the local groups" resume = 0 nmembers = 0 while 1: data, total, resume = win32net.NetLocalGroupEnum(server, 1, resume) for group in data: verbose("Found group %(name)s:%(comment)s " % group) memberresume = 0 while 1: memberdata, total, memberresume = win32net.NetLocalGroupGetMembers(server, group['name'], 2, resume) for member in memberdata: # Just for the sake of it, we convert the SID to a username username, domain, type = win32security.LookupAccountSid(server, member['sid']) nmembers = nmembers + 1 verbose(" Member %s (%s)" % (username, member['domainandname'])) if memberresume==0: break if not resume: break assert nmembers, "Couldnt find a single member in a single group!" print("Enumerated all the local groups") def ServerEnum(): "Enumerates all servers on the network" resume = 0 while 1: data, total, resume = win32net.NetServerEnum(server, 100, win32netcon.SV_TYPE_ALL, None, resume) for s in data: verbose("Found server %s" % s['name']) # Now loop over the shares. shareresume=0 while 1: sharedata, total, shareresume = win32net.NetShareEnum(server, 2, shareresume) for share in sharedata: verbose(" %(netname)s (%(path)s):%(remark)s - in use by %(current_uses)d users" % share) if not shareresume: break if not resume: break print("Enumerated all the servers on the network") def LocalGroup(uname=None): "Creates a local group, adds some members, deletes them, then removes the group" level = 3 if uname is None: uname=win32api.GetUserName() if uname.find("\\")<0: uname = win32api.GetDomainName() + "\\" + uname group = 'python_test_group' # delete the group if it already exists try: win32net.NetLocalGroupDel(server, group) print("WARNING: existing local group '%s' has been deleted.") except win32net.error: pass group_data = {'name': group} win32net.NetLocalGroupAdd(server, 1, group_data) try: u={'domainandname': uname} win32net.NetLocalGroupAddMembers(server, group, level, [u]) mem, tot, res = win32net.NetLocalGroupGetMembers(server, group, level) print("members are", mem) if mem[0]['domainandname'] != uname: print("ERROR: LocalGroup just added %s, but members are %r" % (uname, mem)) # Convert the list of dicts to a list of strings. win32net.NetLocalGroupDelMembers(server, group, [m['domainandname'] for m in mem]) finally: win32net.NetLocalGroupDel(server, group) print("Created a local group, added and removed members, then deleted the group") def GetInfo(userName=None): "Dumps level 3 information about the current user" if userName is None: userName=win32api.GetUserName() print("Dumping level 3 information about user") info = win32net.NetUserGetInfo(server, userName, 3) for key, val in list(info.items()): verbose("%s=%s" % (key,val)) def SetInfo(userName=None): "Attempts to change the current users comment, then set it back" if userName is None: userName=win32api.GetUserName() oldData = win32net.NetUserGetInfo(server, userName, 3) try: d = oldData.copy() d["usr_comment"] = "Test comment" win32net.NetUserSetInfo(server, userName, 3, d) new = win32net.NetUserGetInfo(server, userName, 3)['usr_comment'] if str(new) != "Test comment": raise RuntimeError("Could not read the same comment back - got %s" % new) print("Changed the data for the user") finally: win32net.NetUserSetInfo(server, userName, 3, oldData) def SetComputerInfo(): "Doesnt actually change anything, just make sure we could ;-)" info = win32net.NetWkstaGetInfo(None, 502) # *sob* - but we can't! Why not!!! # win32net.NetWkstaSetInfo(None, 502, info) def usage(tests): import os print("Usage: %s [-s server ] [-v] [Test ...]" % os.path.basename(sys.argv[0])) print(" -v : Verbose - print more information") print(" -s : server - execute the tests against the named server") print(" -c : include the CreateUser test by default") print("where Test is one of:") for t in tests: print(t.__name__,":", t.__doc__) print() print("If not tests are specified, all tests are run") sys.exit(1) def main(): tests = [] for ob in list(globals().values()): if type(ob)==type(main) and ob.__doc__: tests.append(ob) opts, args = getopt.getopt(sys.argv[1:], "s:hvc") create_user = False for opt, val in opts: if opt=="-s": global server server = val if opt=="-h": usage(tests) if opt=="-v": global verbose_level verbose_level = verbose_level + 1 if opt=="-c": create_user = True if len(args)==0: print("Running all tests - use '-h' to see command-line options...") dotests = tests if not create_user: dotests.remove(CreateUser) else: dotests = [] for arg in args: for t in tests: if t.__name__==arg: dotests.append(t) break else: print("Test '%s' unknown - skipping" % arg) if not len(dotests): print("Nothing to do!") usage(tests) for test in dotests: try: test() except: print("Test %s failed" % test.__name__) traceback.print_exc() if __name__=='__main__': main() PK ѳPyuuwin32/Demos/GetSaveFileName.pyUT l_Zx`ux import win32gui, win32con, os filter='Python Scripts\0*.py;*.pyw;*.pys\0Text files\0*.txt\0' customfilter='Other file types\0*.*\0' fname, customfilter, flags=win32gui.GetSaveFileNameW( InitialDir=os.environ['temp'], Flags=win32con.OFN_ALLOWMULTISELECT|win32con.OFN_EXPLORER, File='somefilename', DefExt='py', Title='GetSaveFileNameW', Filter=filter, CustomFilter=customfilter, FilterIndex=1) print('save file names:', repr(fname)) print('filter used:', repr(customfilter)) print('Flags:', flags) for k,v in list(win32con.__dict__.items()): if k.startswith('OFN_') and flags & v: print('\t'+k) fname, customfilter, flags=win32gui.GetOpenFileNameW( InitialDir=os.environ['temp'], Flags=win32con.OFN_ALLOWMULTISELECT|win32con.OFN_EXPLORER, File='somefilename', DefExt='py', Title='GetOpenFileNameW', Filter=filter, CustomFilter=customfilter, FilterIndex=0) print('open file names:', repr(fname)) print('filter used:', repr(customfilter)) print('Flags:', flags) for k,v in list(win32con.__dict__.items()): if k.startswith('OFN_') and flags & v: print('\t'+k) PK ѳP6Pwin32/Demos/FileSecurityTest.pyUT l_Zx`ux # Contributed by Kelly Kranabetter. import os, sys import win32security, ntsecuritycon, pywintypes, winerror # get security information #name=r"c:\autoexec.bat" #name= r"g:\!workgrp\lim" name=sys.argv[0] if not os.path.exists(name): print(name, "does not exist!") sys.exit() print("On file " , name, "\n") # get owner SID print("OWNER") try: sd= win32security.GetFileSecurity(name, win32security.OWNER_SECURITY_INFORMATION) sid= sd.GetSecurityDescriptorOwner() print(" ", win32security.LookupAccountSid(None, sid)) except pywintypes.error as exc: # in automation and network shares we see: # pywintypes.error: (1332, 'LookupAccountName', 'No mapping between account names and security IDs was done.') if exc.winerror != winerror.ERROR_NONE_MAPPED: raise print("No owner information is available") # get group SID try: print("GROUP") sd= win32security.GetFileSecurity(name, win32security.GROUP_SECURITY_INFORMATION) sid= sd.GetSecurityDescriptorGroup() print(" ", win32security.LookupAccountSid(None, sid)) except pywintypes.error as exc: if exc.winerror != winerror.ERROR_NONE_MAPPED: raise print("No group information is available") # get ACEs sd= win32security.GetFileSecurity(name, win32security.DACL_SECURITY_INFORMATION) dacl= sd.GetSecurityDescriptorDacl() if dacl == None: print("No Discretionary ACL") else: for ace_no in range(0, dacl.GetAceCount()): ace= dacl.GetAce(ace_no) print("ACE", ace_no) print(" -Type") for i in ("ACCESS_ALLOWED_ACE_TYPE", "ACCESS_DENIED_ACE_TYPE", "SYSTEM_AUDIT_ACE_TYPE", "SYSTEM_ALARM_ACE_TYPE"): if getattr(ntsecuritycon, i) == ace[0][0]: print(" ", i) print(" -Flags", hex(ace[0][1])) for i in ("OBJECT_INHERIT_ACE", "CONTAINER_INHERIT_ACE", "NO_PROPAGATE_INHERIT_ACE", "INHERIT_ONLY_ACE", "SUCCESSFUL_ACCESS_ACE_FLAG", "FAILED_ACCESS_ACE_FLAG"): if getattr(ntsecuritycon, i) & ace[0][1] == getattr(ntsecuritycon, i): print(" ", i) print(" -mask", hex(ace[1])) # files and directories do permissions differently permissions_file= ("DELETE", "READ_CONTROL", "WRITE_DAC", "WRITE_OWNER", "SYNCHRONIZE", "FILE_GENERIC_READ", "FILE_GENERIC_WRITE", "FILE_GENERIC_EXECUTE", "FILE_DELETE_CHILD") permissions_dir= ("DELETE", "READ_CONTROL", "WRITE_DAC", "WRITE_OWNER", "SYNCHRONIZE", "FILE_ADD_SUBDIRECTORY", "FILE_ADD_FILE", "FILE_DELETE_CHILD", "FILE_LIST_DIRECTORY", "FILE_TRAVERSE", "FILE_READ_ATTRIBUTES", "FILE_WRITE_ATTRIBUTES", "FILE_READ_EA", "FILE_WRITE_EA") permissions_dir_inherit= ("DELETE", "READ_CONTROL", "WRITE_DAC", "WRITE_OWNER", "SYNCHRONIZE", "GENERIC_READ", "GENERIC_WRITE", "GENERIC_EXECUTE", "GENERIC_ALL") if os.path.isfile(name): permissions= permissions_file else: permissions= permissions_dir # directories also contain an ACE that is inherited by children (files) within them if ace[0][1] & ntsecuritycon.OBJECT_INHERIT_ACE == ntsecuritycon.OBJECT_INHERIT_ACE and ace[0][1] & ntsecuritycon.INHERIT_ONLY_ACE == ntsecuritycon.INHERIT_ONLY_ACE: permissions= permissions_dir_inherit calc_mask= 0 # calculate the mask so we can see if we are printing all of the permissions for i in permissions: if getattr(ntsecuritycon, i) & ace[1] == getattr(ntsecuritycon, i): calc_mask= calc_mask | getattr(ntsecuritycon, i) print(" ", i) print(" ", "Calculated Check Mask=", hex(calc_mask)) print(" -SID\n ", win32security.LookupAccountSid(None, ace[2])) PK ѳPT win32/Demos/EvtSubscribe_pull.pyUT l_Zx`ux ## Demonstrates how to create a "pull" subscription import win32evtlog, win32event, win32con query_text='*[System[Provider[@Name="Microsoft-Windows-Winlogon"]]]' h=win32event.CreateEvent(None, 0, 0, None) s=win32evtlog.EvtSubscribe('System', win32evtlog.EvtSubscribeStartAtOldestRecord, SignalEvent=h, Query=query_text) while 1: while 1: events=win32evtlog.EvtNext(s, 10) if len(events)==0: break ##for event in events: ## print(win32evtlog.EvtRender(event, win32evtlog.EvtRenderEventXml)) print('retrieved %s events' %len(events)) while 1: print ('waiting...') w=win32event.WaitForSingleObjectEx(h, 2000, True) if w==win32con.WAIT_OBJECT_0: break PK {Rwin32/Demos/pipes/UT Zx`Zx`ux PK Y03K#3NNwin32/Demos/pipes/cat.pyUT  YZx`ux '''cat.py a version of unix cat, tweaked to show off runproc.py ''' import sys data = sys.stdin.read(1) sys.stdout.write(data) sys.stdout.flush() while data: data = sys.stdin.read(1) sys.stdout.write(data) sys.stdout.flush() # Just here to have something to read from stderr. sys.stderr.write("Blah...") # end of cat.py PK ѳP00win32/Demos/pipes/runproc.pyUT l_Zx`ux '''runproc.py start a process with three inherited pipes. Try to write to and read from those. ''' import win32api import win32pipe import win32file import win32process import win32security import win32con import msvcrt import os class Process: def run(self, cmdline): # security attributes for pipes sAttrs = win32security.SECURITY_ATTRIBUTES() sAttrs.bInheritHandle = 1 # create pipes hStdin_r, self.hStdin_w = win32pipe.CreatePipe(sAttrs, 0) self.hStdout_r, hStdout_w = win32pipe.CreatePipe(sAttrs, 0) self.hStderr_r, hStderr_w = win32pipe.CreatePipe(sAttrs, 0) # set the info structure for the new process. StartupInfo = win32process.STARTUPINFO() StartupInfo.hStdInput = hStdin_r StartupInfo.hStdOutput = hStdout_w StartupInfo.hStdError = hStderr_w StartupInfo.dwFlags = win32process.STARTF_USESTDHANDLES # Mark doesn't support wShowWindow yet. # StartupInfo.dwFlags = StartupInfo.dwFlags | win32process.STARTF_USESHOWWINDOW # StartupInfo.wShowWindow = win32con.SW_HIDE # Create new output read handles and the input write handle. Set # the inheritance properties to FALSE. Otherwise, the child inherits # the these handles; resulting in non-closeable handles to the pipes # being created. pid = win32api.GetCurrentProcess() tmp = win32api.DuplicateHandle( pid, self.hStdin_w, pid, 0, 0, # non-inheritable!! win32con.DUPLICATE_SAME_ACCESS) # Close the inhertible version of the handle win32file.CloseHandle(self.hStdin_w) self.hStdin_w = tmp tmp = win32api.DuplicateHandle( pid, self.hStdout_r, pid, 0, 0, # non-inheritable! win32con.DUPLICATE_SAME_ACCESS) # Close the inhertible version of the handle win32file.CloseHandle(self.hStdout_r) self.hStdout_r = tmp # start the process. hProcess, hThread, dwPid, dwTid = win32process.CreateProcess( None, # program cmdline,# command line None, # process security attributes None, # thread attributes 1, # inherit handles, or USESTDHANDLES won't work. # creation flags. Don't access the console. 0, # Don't need anything here. # If you're in a GUI app, you should use # CREATE_NEW_CONSOLE here, or any subprocesses # might fall victim to the problem described in: # KB article: Q156755, cmd.exe requires # an NT console in order to perform redirection.. None, # no new environment None, # current directory (stay where we are) StartupInfo) # normally, we would save the pid etc. here... # Child is launched. Close the parents copy of those pipe handles # that only the child should have open. # You need to make sure that no handles to the write end of the # output pipe are maintained in this process or else the pipe will # not close when the child process exits and the ReadFile will hang. win32file.CloseHandle(hStderr_w) win32file.CloseHandle(hStdout_w) win32file.CloseHandle(hStdin_r) self.stdin = os.fdopen(msvcrt.open_osfhandle(self.hStdin_w, 0), "wb") self.stdin.write('hmmmmm\r\n') self.stdin.flush() self.stdin.close() self.stdout = os.fdopen(msvcrt.open_osfhandle(self.hStdout_r, 0), "rb") print("Read on stdout: ", repr(self.stdout.read())) self.stderr = os.fdopen(msvcrt.open_osfhandle(self.hStderr_r, 0), "rb") print("Read on stderr: ", repr(self.stderr.read())) if __name__ == '__main__': p = Process() exe = win32api.GetModuleFileName(0) p.run(exe + ' cat.py') # end of runproc.py PK ѳP2k !win32/Demos/win32rcparser_demo.pyUT l_Zx`ux # A demo of the win32rcparser module and using win32gui import win32gui import win32api import win32con import win32rcparser import commctrl import sys, os this_dir = os.path.abspath(os.path.dirname(__file__)) g_rcname = os.path.abspath( os.path.join( this_dir, "..", "test", "win32rcparser", "test.rc")) if not os.path.isfile(g_rcname): raise RuntimeError("Can't locate test.rc (should be at '%s')" % (g_rcname,)) class DemoWindow: def __init__(self, dlg_template): self.dlg_template = dlg_template def CreateWindow(self): self._DoCreate(win32gui.CreateDialogIndirect) def DoModal(self): return self._DoCreate(win32gui.DialogBoxIndirect) def _DoCreate(self, fn): message_map = { win32con.WM_INITDIALOG: self.OnInitDialog, win32con.WM_CLOSE: self.OnClose, win32con.WM_DESTROY: self.OnDestroy, win32con.WM_COMMAND: self.OnCommand, } return fn(0, self.dlg_template, 0, message_map) def OnInitDialog(self, hwnd, msg, wparam, lparam): self.hwnd = hwnd # centre the dialog desktop = win32gui.GetDesktopWindow() l,t,r,b = win32gui.GetWindowRect(self.hwnd) dt_l, dt_t, dt_r, dt_b = win32gui.GetWindowRect(desktop) centre_x, centre_y = win32gui.ClientToScreen( desktop, ( (dt_r-dt_l)//2, (dt_b-dt_t)//2) ) win32gui.MoveWindow(hwnd, centre_x-(r//2), centre_y-(b//2), r-l, b-t, 0) def OnCommand(self, hwnd, msg, wparam, lparam): # Needed to make OK/Cancel work - no other controls are handled. id = win32api.LOWORD(wparam) if id in [win32con.IDOK, win32con.IDCANCEL]: win32gui.EndDialog(hwnd, id) def OnClose(self, hwnd, msg, wparam, lparam): win32gui.EndDialog(hwnd, 0) def OnDestroy(self, hwnd, msg, wparam, lparam): pass def DemoModal(): # Load the .rc file. resources = win32rcparser.Parse(g_rcname) for id, ddef in resources.dialogs.items(): print("Displaying dialog", id) w=DemoWindow(ddef) w.DoModal() if __name__=='__main__': flags = 0 for flag in """ICC_DATE_CLASSES ICC_ANIMATE_CLASS ICC_ANIMATE_CLASS ICC_BAR_CLASSES ICC_COOL_CLASSES ICC_DATE_CLASSES ICC_HOTKEY_CLASS ICC_INTERNET_CLASSES ICC_LISTVIEW_CLASSES ICC_PAGESCROLLER_CLASS ICC_PROGRESS_CLASS ICC_TAB_CLASSES ICC_TREEVIEW_CLASSES ICC_UPDOWN_CLASS ICC_USEREX_CLASSES ICC_WIN95_CLASSES """.split(): flags |= getattr(commctrl, flag) win32gui.InitCommonControlsEx(flags) # Need to do this go get rich-edit working. win32api.LoadLibrary("riched20.dll") DemoModal() PK ѳP**{CCwin32/Demos/win32servicedemo.pyUT l_Zx`ux import win32service import win32con def EnumServices(): resume = 0 accessSCM = win32con.GENERIC_READ accessSrv = win32service.SC_MANAGER_ALL_ACCESS #Open Service Control Manager hscm = win32service.OpenSCManager(None, None, accessSCM) #Enumerate Service Control Manager DB typeFilter = win32service.SERVICE_WIN32 stateFilter = win32service.SERVICE_STATE_ALL statuses = win32service.EnumServicesStatus(hscm, typeFilter, stateFilter) for (short_name, desc, status) in statuses: print(short_name, desc, status) EnumServices() PK ѳPy>bywin32/Demos/win32gui_demo.pyUT l_Zx`ux # The start of a win32gui generic demo. # Feel free to contribute more demos back ;-) import win32gui, win32con, win32api import time, math, random def _MyCallback( hwnd, extra ): hwnds, classes = extra hwnds.append(hwnd) classes[win32gui.GetClassName(hwnd)] = 1 def TestEnumWindows(): windows = [] classes = {} win32gui.EnumWindows(_MyCallback, (windows, classes)) print("Enumerated a total of %d windows with %d classes" % (len(windows),len(classes))) if "tooltips_class32" not in classes: print("Hrmmmm - I'm very surprised to not find a 'tooltips_class32' class.") def OnPaint_1(hwnd, msg, wp, lp): dc, ps=win32gui.BeginPaint(hwnd) win32gui.SetGraphicsMode(dc, win32con.GM_ADVANCED) br=win32gui.CreateSolidBrush(win32api.RGB(255,0,0)) win32gui.SelectObject(dc, br) angle=win32gui.GetWindowLong(hwnd, win32con.GWL_USERDATA) win32gui.SetWindowLong(hwnd, win32con.GWL_USERDATA, angle+2) r_angle=angle*(math.pi/180) win32gui.SetWorldTransform(dc, {'M11':math.cos(r_angle), 'M12':math.sin(r_angle), 'M21':math.sin(r_angle)*-1, 'M22':math.cos(r_angle),'Dx':250,'Dy':250}) win32gui.MoveToEx(dc,250,250) win32gui.BeginPath(dc) win32gui.Pie(dc, 10, 70, 200, 200, 350, 350, 75, 10) win32gui.Chord(dc, 200, 200, 850, 0, 350, 350, 75, 10) win32gui.LineTo(dc, 300,300) win32gui.LineTo(dc, 100, 20) win32gui.LineTo(dc, 20, 100) win32gui.LineTo(dc, 400, 0) win32gui.LineTo(dc, 0, 400) win32gui.EndPath(dc) win32gui.StrokeAndFillPath(dc) win32gui.EndPaint(hwnd, ps) return 0 wndproc_1={win32con.WM_PAINT:OnPaint_1} def OnPaint_2(hwnd, msg, wp, lp): dc, ps=win32gui.BeginPaint(hwnd) win32gui.SetGraphicsMode(dc, win32con.GM_ADVANCED) l,t,r,b=win32gui.GetClientRect(hwnd) for x in range(25): vertices=( {'x':int(random.random()*r), 'y':int(random.random()*b), 'Red':int(random.random()*0xff00), 'Green':0, 'Blue':0, 'Alpha':0}, {'x':int(random.random()*r), 'y':int(random.random()*b), 'Red':0, 'Green':int(random.random()*0xff00), 'Blue':0, 'Alpha':0}, {'x':int(random.random()*r), 'y':int(random.random()*b), 'Red':0, 'Green':0, 'Blue':int(random.random()*0xff00), 'Alpha':0}, ) mesh=((0,1,2),) win32gui.GradientFill(dc,vertices, mesh, win32con.GRADIENT_FILL_TRIANGLE) win32gui.EndPaint(hwnd, ps) return 0 wndproc_2={win32con.WM_PAINT:OnPaint_2} def TestSetWorldTransform(): wc = win32gui.WNDCLASS() wc.lpszClassName = 'test_win32gui_1' wc.style = win32con.CS_GLOBALCLASS|win32con.CS_VREDRAW | win32con.CS_HREDRAW wc.hbrBackground = win32con.COLOR_WINDOW+1 wc.lpfnWndProc=wndproc_1 class_atom=win32gui.RegisterClass(wc) hwnd = win32gui.CreateWindow(wc.lpszClassName, 'Spin the Lobster!', win32con.WS_CAPTION|win32con.WS_VISIBLE, 100,100,900,900, 0, 0, 0, None) for x in range(500): win32gui.InvalidateRect(hwnd,None,True) win32gui.PumpWaitingMessages() time.sleep(0.01) win32gui.DestroyWindow(hwnd) win32gui.UnregisterClass(wc.lpszClassName, None) def TestGradientFill(): wc = win32gui.WNDCLASS() wc.lpszClassName = 'test_win32gui_2' wc.style = win32con.CS_GLOBALCLASS|win32con.CS_VREDRAW | win32con.CS_HREDRAW wc.hbrBackground = win32con.COLOR_WINDOW+1 wc.lpfnWndProc=wndproc_2 class_atom=win32gui.RegisterClass(wc) hwnd = win32gui.CreateWindowEx(0, class_atom,'Kaleidoscope', win32con.WS_CAPTION|win32con.WS_VISIBLE|win32con.WS_THICKFRAME|win32con.WS_SYSMENU, 100,100,900,900, 0, 0, 0, None) s=win32gui.GetWindowLong(hwnd,win32con.GWL_EXSTYLE) win32gui.SetWindowLong(hwnd, win32con.GWL_EXSTYLE, s|win32con.WS_EX_LAYERED) win32gui.SetLayeredWindowAttributes(hwnd, 0, 175, win32con.LWA_ALPHA) for x in range(30): win32gui.InvalidateRect(hwnd,None,True) win32gui.PumpWaitingMessages() time.sleep(0.3) win32gui.DestroyWindow(hwnd) win32gui.UnregisterClass(class_atom,None) print("Enumerating all windows...") TestEnumWindows() print("Testing drawing functions ...") TestSetWorldTransform() TestGradientFill() print("All tests done!") PK ѳPwd oo win32/Demos/EvtSubscribe_push.pyUT l_Zx`ux ## Demonstrates a "push" subscription with a callback function import win32evtlog query_text='*[System[Provider[@Name="Microsoft-Windows-Winlogon"]]]' def c(reason, context, evt): if reason==win32evtlog.EvtSubscribeActionError: print('EvtSubscribeActionError') elif reason==win32evtlog.EvtSubscribeActionDeliver: print('EvtSubscribeActionDeliver') else: print('??? Unknown action ???', reason) context.append(win32evtlog.EvtRender(evt, win32evtlog.EvtRenderEventXml)) return 0 evttext=[] s=win32evtlog.EvtSubscribe('System', win32evtlog.EvtSubscribeStartAtOldestRecord, Query='*', Callback=c, Context=evttext) PK {Rwin32/Demos/c_extension/UT Zx`Zx`ux PK Y03K}## win32/Demos/c_extension/setup.pyUT  YZx`ux # A sample distutils script to show to build your own # extension module which extends pywintypes or pythoncom. # # Use 'python setup.py build' to build this extension. import os from distutils.core import setup, Extension from distutils.sysconfig import get_python_lib sources = ["win32_extension.cpp"] # Specify the directory where the PyWin32 .h and .lib files are installed. # If you are doing a win32com extension, you will also need to add # win32com\Include and win32com\Libs. ext = Extension("win32_extension", sources, include_dirs = [os.path.join(get_python_lib(), "win32", "Include")], library_dirs = [os.path.join(get_python_lib(), "win32", "Libs")], ) setup( name="win32 extension sample", version="0.1", ext_modules=[ext], ) PK Y03K浭%win32/Demos/RegCreateKeyTransacted.pyUT  YZx`ux import win32api, win32con, win32transaction keyname='Pywin32 test transacted registry functions' subkeyname='test transacted subkey' classname='Transacted Class' trans=win32transaction.CreateTransaction(Description='test RegCreateKeyTransacted') key, disp=win32api.RegCreateKeyEx(win32con.HKEY_CURRENT_USER, keyname, samDesired=win32con.KEY_ALL_ACCESS, Class=classname) ## clean up any existing keys for subk in win32api.RegEnumKeyExW(key): win32api.RegDeleteKey(key, subk[0]) ## reopen key in transacted mode transacted_key=win32api.RegOpenKeyTransacted(Key=win32con.HKEY_CURRENT_USER, SubKey=keyname, Transaction=trans, samDesired=win32con.KEY_ALL_ACCESS) subkey, disp=win32api.RegCreateKeyEx(transacted_key, subkeyname, Transaction=trans, samDesired=win32con.KEY_ALL_ACCESS, Class=classname) ## Newly created key should not be visible from non-transacted handle subkeys=[s[0] for s in win32api.RegEnumKeyExW(key)] assert subkeyname not in subkeys transacted_subkeys=[s[0] for s in win32api.RegEnumKeyExW(transacted_key)] assert subkeyname in transacted_subkeys ## Key should be visible to non-transacted handle after commit win32transaction.CommitTransaction(trans) subkeys=[s[0] for s in win32api.RegEnumKeyExW(key)] assert subkeyname in subkeys ## test transacted delete del_trans=win32transaction.CreateTransaction(Description='test RegDeleteKeyTransacted') win32api.RegDeleteKeyEx(key, subkeyname, Transaction=del_trans) ## subkey should still show up for non-transacted handle subkeys=[s[0] for s in win32api.RegEnumKeyExW(key)] assert subkeyname in subkeys ## ... and should be gone after commit win32transaction.CommitTransaction(del_trans) subkeys=[s[0] for s in win32api.RegEnumKeyExW(key)] assert subkeyname not in subkeys win32api.RegDeleteKey(win32con.HKEY_CURRENT_USER, keyname) PK ѳP40~#win32/Demos/OpenEncryptedFileRaw.pyUT l_Zx`ux import win32file, win32api, winerror import os def ReadCallback(input_buffer, data, buflen): fnamein, fnameout, f = data ## print fnamein, fnameout, buflen f.write(input_buffer) ## python 2.3 throws an error if return value is a plain int return winerror.ERROR_SUCCESS def WriteCallback(output_buffer, data, buflen): fnamebackup, fnameout, f = data file_data=f.read(buflen) ## returning 0 as len terminates WriteEncryptedFileRaw output_len=len(file_data) output_buffer[:output_len]=file_data return winerror.ERROR_SUCCESS, output_len tmp_dir=win32api.GetTempPath() dst_dir=win32api.GetTempFileName(tmp_dir,'oef')[0] os.remove(dst_dir) os.mkdir(dst_dir) print('Destination dir:', dst_dir) ## create an encrypted file fname=win32api.GetTempFileName(dst_dir,'ref')[0] print('orig file:',fname) f=open(fname,'w') f.write('xxxxxxxxxxxxxxxx\n'*32768) f.close() ## add a couple of extra data streams f=open(fname+':stream_y','w') f.write('yyyyyyyyyyyyyyyy\n'*32768) f.close() f=open(fname+':stream_z','w') f.write('zzzzzzzzzzzzzzzz\n'*32768) f.close() win32file.EncryptFile(fname) ## backup raw data of encrypted file bkup_fname=win32api.GetTempFileName(dst_dir,'bef')[0] print('backup file:', bkup_fname) f=open(bkup_fname,'wb') ctxt=win32file.OpenEncryptedFileRaw(fname,0) try: win32file.ReadEncryptedFileRaw(ReadCallback, (fname,bkup_fname,f), ctxt) finally: ## if context is not closed, file remains locked even if calling process is killed win32file.CloseEncryptedFileRaw(ctxt) f.close() ## restore data from backup to new encrypted file dst_fname=win32api.GetTempFileName(dst_dir,'wef')[0] print('restored file:', dst_fname) f=open(bkup_fname,'rb') ctxtout=win32file.OpenEncryptedFileRaw(dst_fname, win32file.CREATE_FOR_IMPORT) try: win32file.WriteEncryptedFileRaw(WriteCallback, (bkup_fname,dst_fname,f), ctxtout) finally: win32file.CloseEncryptedFileRaw(ctxtout) f.close() PK {Rwin32/Demos/win32wnet/UT Zx`Zx`ux PK ѳPi !win32/Demos/win32wnet/testwnet.pyUT l_Zx`ux import win32api import win32wnet import sys from winnetwk import * import os possible_shares = [] def _doDumpHandle(handle, level = 0): indent = " " * level while 1: items = win32wnet.WNetEnumResource(handle, 0) if len(items)==0: break for item in items: try: if item.dwDisplayType == RESOURCEDISPLAYTYPE_SHARE: print(indent + "Have share with name:", item.lpRemoteName) possible_shares.append(item) elif item.dwDisplayType == RESOURCEDISPLAYTYPE_GENERIC: print(indent + "Have generic resource with name:", item.lpRemoteName) else: # Try generic! print(indent + "Enumerating " + item.lpRemoteName, end=' ') k = win32wnet.WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY,0,item) print() _doDumpHandle(k, level + 1) win32wnet.WNetCloseEnum(k) # could do k.Close(), but this is a good test! except win32wnet.error as details: print(indent + "Couldn't enumerate this resource: " + details.strerror) def TestOpenEnum(): print("Enumerating all resources on the network - this may take some time...") handle = win32wnet.WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_ANY,0,None) try: _doDumpHandle(handle) finally: handle.Close() print("Finished dumping all resources.") def findUnusedDriveLetter(): existing = [x[0].lower() for x in win32api.GetLogicalDriveStrings().split('\0') if x] handle = win32wnet.WNetOpenEnum(RESOURCE_REMEMBERED,RESOURCETYPE_DISK,0,None) try: while 1: items = win32wnet.WNetEnumResource(handle, 0) if len(items)==0: break xtra = [i.lpLocalName[0].lower() for i in items if i.lpLocalName] existing.extend(xtra) finally: handle.Close() for maybe in 'defghijklmnopqrstuvwxyz': if maybe not in existing: return maybe raise RuntimeError("All drive mappings are taken?") def TestConnection(): if len(possible_shares)==0: print("Couldn't find any potential shares to connect to") return localName = findUnusedDriveLetter() + ':' for share in possible_shares: print("Attempting connection of", localName, "to", share.lpRemoteName) try: win32wnet.WNetAddConnection2(share.dwType, localName, share.lpRemoteName) except win32wnet.error as details: print("Couldn't connect: " + details.strerror) continue # Have a connection. try: fname = os.path.join(localName + "\\", os.listdir(localName + "\\")[0]) try: print("Universal name of '%s' is '%s'" % (fname, win32wnet.WNetGetUniversalName(fname))) except win32wnet.error as details: print("Couldn't get universal name of '%s': %s" % (fname, details.strerror)) print("User name for this connection is", win32wnet.WNetGetUser(localName)) finally: win32wnet.WNetCancelConnection2(localName, 0, 0) # and do it again, but this time by using the more modern # NETRESOURCE way. nr = win32wnet.NETRESOURCE() nr.dwType = share.dwType nr.lpLocalName = localName nr.lpRemoteName = share.lpRemoteName win32wnet.WNetAddConnection2(nr) win32wnet.WNetCancelConnection2(localName, 0, 0) # and one more time using WNetAddConnection3 win32wnet.WNetAddConnection3(0, nr) win32wnet.WNetCancelConnection2(localName, 0, 0) # Only do the first share that succeeds. break def TestGetUser(): u = win32wnet.WNetGetUser() print("Current global user is", repr(u)) if u != win32wnet.WNetGetUser(None): raise RuntimeError("Default value didnt seem to work!") TestGetUser() TestOpenEnum() TestConnection() PK Y03Kfs s !win32/Demos/win32wnet/winnetwk.pyUT  YZx`ux # Generated by h2py from d:\mssdk\include\winnetwk.h WNNC_NET_MSNET = 0x00010000 WNNC_NET_LANMAN = 0x00020000 WNNC_NET_NETWARE = 0x00030000 WNNC_NET_VINES = 0x00040000 WNNC_NET_10NET = 0x00050000 WNNC_NET_LOCUS = 0x00060000 WNNC_NET_SUN_PC_NFS = 0x00070000 WNNC_NET_LANSTEP = 0x00080000 WNNC_NET_9TILES = 0x00090000 WNNC_NET_LANTASTIC = 0x000A0000 WNNC_NET_AS400 = 0x000B0000 WNNC_NET_FTP_NFS = 0x000C0000 WNNC_NET_PATHWORKS = 0x000D0000 WNNC_NET_LIFENET = 0x000E0000 WNNC_NET_POWERLAN = 0x000F0000 WNNC_NET_BWNFS = 0x00100000 WNNC_NET_COGENT = 0x00110000 WNNC_NET_FARALLON = 0x00120000 WNNC_NET_APPLETALK = 0x00130000 WNNC_NET_INTERGRAPH = 0x00140000 WNNC_NET_SYMFONET = 0x00150000 WNNC_NET_CLEARCASE = 0x00160000 WNNC_NET_FRONTIER = 0x00170000 WNNC_NET_BMC = 0x00180000 WNNC_NET_DCE = 0x00190000 WNNC_NET_DECORB = 0x00200000 WNNC_NET_PROTSTOR = 0x00210000 WNNC_NET_FJ_REDIR = 0x00220000 WNNC_NET_DISTINCT = 0x00230000 WNNC_NET_TWINS = 0x00240000 WNNC_NET_RDR2SAMPLE = 0x00250000 RESOURCE_CONNECTED = 0x00000001 RESOURCE_GLOBALNET = 0x00000002 RESOURCE_REMEMBERED = 0x00000003 RESOURCE_RECENT = 0x00000004 RESOURCE_CONTEXT = 0x00000005 RESOURCETYPE_ANY = 0x00000000 RESOURCETYPE_DISK = 0x00000001 RESOURCETYPE_PRINT = 0x00000002 RESOURCETYPE_RESERVED = 0x00000008 RESOURCETYPE_UNKNOWN = 0xFFFFFFFF RESOURCEUSAGE_CONNECTABLE = 0x00000001 RESOURCEUSAGE_CONTAINER = 0x00000002 RESOURCEUSAGE_NOLOCALDEVICE = 0x00000004 RESOURCEUSAGE_SIBLING = 0x00000008 RESOURCEUSAGE_ATTACHED = 0x00000010 RESOURCEUSAGE_ALL = (RESOURCEUSAGE_CONNECTABLE | RESOURCEUSAGE_CONTAINER | RESOURCEUSAGE_ATTACHED) RESOURCEUSAGE_RESERVED = 0x80000000 RESOURCEDISPLAYTYPE_GENERIC = 0x00000000 RESOURCEDISPLAYTYPE_DOMAIN = 0x00000001 RESOURCEDISPLAYTYPE_SERVER = 0x00000002 RESOURCEDISPLAYTYPE_SHARE = 0x00000003 RESOURCEDISPLAYTYPE_FILE = 0x00000004 RESOURCEDISPLAYTYPE_GROUP = 0x00000005 RESOURCEDISPLAYTYPE_NETWORK = 0x00000006 RESOURCEDISPLAYTYPE_ROOT = 0x00000007 RESOURCEDISPLAYTYPE_SHAREADMIN = 0x00000008 RESOURCEDISPLAYTYPE_DIRECTORY = 0x00000009 RESOURCEDISPLAYTYPE_TREE = 0x0000000A RESOURCEDISPLAYTYPE_NDSCONTAINER = 0x0000000B NETPROPERTY_PERSISTENT = 1 CONNECT_UPDATE_PROFILE = 0x00000001 CONNECT_UPDATE_RECENT = 0x00000002 CONNECT_TEMPORARY = 0x00000004 CONNECT_INTERACTIVE = 0x00000008 CONNECT_PROMPT = 0x00000010 CONNECT_NEED_DRIVE = 0x00000020 CONNECT_REFCOUNT = 0x00000040 CONNECT_REDIRECT = 0x00000080 CONNECT_LOCALDRIVE = 0x00000100 CONNECT_CURRENT_MEDIA = 0x00000200 CONNECT_DEFERRED = 0x00000400 CONNECT_RESERVED = 0xFF000000 CONNDLG_RO_PATH = 0x00000001 CONNDLG_CONN_POINT = 0x00000002 CONNDLG_USE_MRU = 0x00000004 CONNDLG_HIDE_BOX = 0x00000008 CONNDLG_PERSIST = 0x00000010 CONNDLG_NOT_PERSIST = 0x00000020 DISC_UPDATE_PROFILE = 0x00000001 DISC_NO_FORCE = 0x00000040 UNIVERSAL_NAME_INFO_LEVEL = 0x00000001 REMOTE_NAME_INFO_LEVEL = 0x00000002 WNFMT_MULTILINE = 0x01 WNFMT_ABBREVIATED = 0x02 WNFMT_INENUM = 0x10 WNFMT_CONNECTION = 0x20 NETINFO_DLL16 = 0x00000001 NETINFO_DISKRED = 0x00000004 NETINFO_PRINTERRED = 0x00000008 RP_LOGON = 0x01 RP_INIFILE = 0x02 PP_DISPLAYERRORS = 0x01 WNCON_FORNETCARD = 0x00000001 WNCON_NOTROUTED = 0x00000002 WNCON_SLOWLINK = 0x00000004 WNCON_DYNAMIC = 0x00000008 PK ѳPc: /win32/Demos/CreateFileTransacted_MiniVersion.pyUT l_Zx`ux """ This demonstrates the creation of miniversions of a file during a transaction. The FSCTL_TXFS_CREATE_MINIVERSION control code saves any changes to a new miniversion (effectively a savepoint within a transaction). """ import win32file, win32api, win32transaction, winerror import win32con, winioctlcon import struct import os from pywin32_testutil import str2bytes # py3k-friendly helper def demo(): """ Definition of buffer used with FSCTL_TXFS_CREATE_MINIVERSION: typedef struct _TXFS_CREATE_MINIVERSION_INFO{ USHORT StructureVersion; USHORT StructureLength; ULONG BaseVersion; USHORT MiniVersion;} """ buf_fmt='HHLH0L' ## buffer size must include struct padding buf_size=struct.calcsize(buf_fmt) tempdir=win32api.GetTempPath() tempfile=win32api.GetTempFileName(tempdir,'cft')[0] print("Demonstrating transactions on tempfile", tempfile) f=open(tempfile,'w') f.write('This is original file.\n') f.close() trans=win32transaction.CreateTransaction(Description='Test creating miniversions of a file') hfile=win32file.CreateFileW(tempfile, win32con.GENERIC_READ|win32con.GENERIC_WRITE, win32con.FILE_SHARE_READ|win32con.FILE_SHARE_WRITE, None, win32con.OPEN_EXISTING, 0 , None, Transaction=trans) win32file.WriteFile(hfile, str2bytes('This is first miniversion.\n')) buf=win32file.DeviceIoControl(hfile, winioctlcon.FSCTL_TXFS_CREATE_MINIVERSION,None,buf_size,None) struct_ver, struct_len, base_ver, ver_1=struct.unpack(buf_fmt, buf) win32file.SetFilePointer(hfile, 0, win32con.FILE_BEGIN) win32file.WriteFile(hfile, str2bytes('This is second miniversion!\n')) buf=win32file.DeviceIoControl(hfile, winioctlcon.FSCTL_TXFS_CREATE_MINIVERSION,None,buf_size,None) struct_ver, struct_len, base_ver, ver_2=struct.unpack(buf_fmt, buf) hfile.Close() ## miniversions can't be opened with write access hfile_0=win32file.CreateFileW(tempfile, win32con.GENERIC_READ, win32con.FILE_SHARE_READ|win32con.FILE_SHARE_WRITE, None, win32con.OPEN_EXISTING, 0 , None, Transaction=trans, MiniVersion=base_ver) print('version:',base_ver,win32file.ReadFile(hfile_0, 100)) hfile_0.Close() hfile_1=win32file.CreateFileW(tempfile, win32con.GENERIC_READ, win32con.FILE_SHARE_READ|win32con.FILE_SHARE_WRITE, None, win32con.OPEN_EXISTING, 0 , None, Transaction=trans, MiniVersion=ver_1) print('version:',ver_1,win32file.ReadFile(hfile_1, 100)) hfile_1.Close() hfile_2=win32file.CreateFileW(tempfile, win32con.GENERIC_READ, win32con.FILE_SHARE_READ|win32con.FILE_SHARE_WRITE, None, win32con.OPEN_EXISTING, 0 , None, Transaction=trans, MiniVersion=ver_2) print('version:',ver_2,win32file.ReadFile(hfile_2, 100)) hfile_2.Close() ## MiniVersions are destroyed when transaction is committed or rolled back win32transaction.CommitTransaction(trans) os.unlink(tempfile) if __name__ == "__main__": # When run on CI, this fails with NOT_SUPPORTED, so don't have that cause "failure" try: demo() except win32file.error as e: if e.winerror == winerror.ERROR_NOT_SUPPORTED: print("These features are not supported by this filesystem.") else: raise PK ѳP/u(win32/Demos/NetValidatePasswordPolicy.pyUT l_Zx`ux """A demo of using win32net.NetValidatePasswordPolicy. Example usage: % NetValidatePasswordPolicy.py --password=foo change which might return: > Result of 'change' validation is 0: The operation completed successfully. or depending on the policy: > Result of 'change' validation is 2245: The password does not meet the > password policy requirements. Check the minimum password length, > password complexity and password history requirements. Adding --user doesn't seem to change the output (even the PasswordLastSet seen when '-f' is used doesn't depend on the username), but theoretically it will also check the password history for the specified user. % NetValidatePasswordPolicy.py auth which always (with and without '-m') seems to return: > Result of 'auth' validation is 2701: Password must change at next logon """ import sys import win32api import win32net, win32netcon import optparse from pprint import pprint def main(): parser = optparse.OptionParser("%prog [options] auth|change ...", description="A win32net.NetValidatePasswordPolicy demo.") parser.add_option("-u", "--username", action="store", help="The username to pass to the function (only for the " "change command") parser.add_option("-p", "--password", action="store", help="The clear-text password to pass to the function " "(only for the 'change' command)") parser.add_option("-m", "--password-matched", action="store_false", default=True, help="Used to specify the password does NOT match (ie, " "uses False for the PasswordMatch/PasswordMatched " "arg, both 'auth' and 'change' commands)") parser.add_option("-s", "--server", action="store", help="The name of the server to execute the command on") parser.add_option("-f", "--show_fields", action="store_true", default=False, help="Print the NET_VALIDATE_PERSISTED_FIELDS returned") options, args = parser.parse_args() if not args: args = ["auth"] for arg in args: if arg == "auth": input = {"PasswordMatched": options.password_matched, } val_type = win32netcon.NetValidateAuthentication elif arg == "change": input = {"ClearPassword": options.password, "PasswordMatch": options.password_matched, "UserAccountName": options.username, } val_type = win32netcon.NetValidatePasswordChange else: parser.error("Invalid arg - must be 'auth' or 'change'") try: fields, status = win32net.NetValidatePasswordPolicy(options.server, None, val_type, input) except NotImplementedError: print("NetValidatePasswordPolicy not implemented on this platform.") return 1 except win32net.error as exc: print("NetValidatePasswordPolicy failed: ", exc) return 1 if options.show_fields: print("NET_VALIDATE_PERSISTED_FIELDS fields:") pprint(fields) print("Result of %r validation is %d: %s" % \ (arg, status, win32api.FormatMessage(status).strip())) return 0 if __name__=='__main__': sys.exit(main()) PK ѳPX>>win32/Demos/win32gui_menu.pyUT l_Zx`ux # Demonstrates some advanced menu concepts using win32gui. # This creates a taskbar icon which has some fancy menus (but note that # selecting the menu items does nothing useful - see win32gui_taskbar.py # for examples of this. # NOTE: This is a work in progress. Todo: # * The "Checked" menu items don't work correctly - I'm not sure why. # * No support for GetMenuItemInfo. # Based on Andy McKay's demo code. from win32api import * # Try and use XP features, so we get alpha-blending etc. try: from winxpgui import * except ImportError: from win32gui import * from win32gui_struct import * import win32con import sys, os import struct import array this_dir = os.path.split(sys.argv[0])[0] class MainWindow: def __init__(self): message_map = { win32con.WM_DESTROY: self.OnDestroy, win32con.WM_COMMAND: self.OnCommand, win32con.WM_USER+20 : self.OnTaskbarNotify, # owner-draw related handlers. win32con.WM_MEASUREITEM: self.OnMeasureItem, win32con.WM_DRAWITEM: self.OnDrawItem, } # Register the Window class. wc = WNDCLASS() hinst = wc.hInstance = GetModuleHandle(None) wc.lpszClassName = "PythonTaskbarDemo" wc.lpfnWndProc = message_map # could also specify a wndproc. classAtom = RegisterClass(wc) # Create the Window. style = win32con.WS_OVERLAPPED | win32con.WS_SYSMENU self.hwnd = CreateWindow( classAtom, "Taskbar Demo", style, \ 0, 0, win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT, \ 0, 0, hinst, None) UpdateWindow(self.hwnd) iconPathName = os.path.abspath(os.path.join( sys.prefix, "pyc.ico" )) # py2.5 includes the .ico files in the DLLs dir for some reason. if not os.path.isfile(iconPathName): iconPathName = os.path.abspath(os.path.join( os.path.split(sys.executable)[0], "DLLs", "pyc.ico" )) if not os.path.isfile(iconPathName): # Look in the source tree. iconPathName = os.path.abspath(os.path.join( os.path.split(sys.executable)[0], "..\\PC\\pyc.ico" )) if os.path.isfile(iconPathName): icon_flags = win32con.LR_LOADFROMFILE | win32con.LR_DEFAULTSIZE hicon = LoadImage(hinst, iconPathName, win32con.IMAGE_ICON, 0, 0, icon_flags) else: iconPathName = None print("Can't find a Python icon file - using default") hicon = LoadIcon(0, win32con.IDI_APPLICATION) self.iconPathName = iconPathName # Load up some information about menus needed by our owner-draw code. # The font to use on the menu. ncm = SystemParametersInfo(win32con.SPI_GETNONCLIENTMETRICS) self.font_menu = CreateFontIndirect(ncm['lfMenuFont']) # spacing for our ownerdraw menus - not sure exactly what constants # should be used (and if you owner-draw all items on the menu, it # doesn't matter!) self.menu_icon_height = GetSystemMetrics(win32con.SM_CYMENU) - 4 self.menu_icon_width = self.menu_icon_height self.icon_x_pad = 8 # space from end of icon to start of text. # A map we use to stash away data we need for ownerdraw. Keyed # by integer ID - that ID will be set in dwTypeData of the menu item. self.menu_item_map = {} # Finally, create the menu self.createMenu() flags = NIF_ICON | NIF_MESSAGE | NIF_TIP nid = (self.hwnd, 0, flags, win32con.WM_USER+20, hicon, "Python Demo") Shell_NotifyIcon(NIM_ADD, nid) print("Please right-click on the Python icon in the taskbar") def createMenu(self): self.hmenu = menu = CreatePopupMenu() # Create our 'Exit' item with the standard, ugly 'close' icon. item, extras = PackMENUITEMINFO(text = "Exit", hbmpItem=win32con.HBMMENU_MBAR_CLOSE, wID=1000) InsertMenuItem(menu, 0, 1, item) # Create a 'text only' menu via InsertMenuItem rather then # AppendMenu, just to prove we can! item, extras = PackMENUITEMINFO(text = "Text only item", wID=1001) InsertMenuItem(menu, 0, 1, item) load_bmp_flags=win32con.LR_LOADFROMFILE | \ win32con.LR_LOADTRANSPARENT # These images are "over sized", so we load them scaled. hbmp = LoadImage(0, os.path.join(this_dir, "images/smiley.bmp"), win32con.IMAGE_BITMAP, 20, 20, load_bmp_flags) # Create a top-level menu with a bitmap item, extras = PackMENUITEMINFO(text="Menu with bitmap", hbmpItem=hbmp, wID=1002) InsertMenuItem(menu, 0, 1, item) # Owner-draw menus mainly from: # http://windowssdk.msdn.microsoft.com/en-us/library/ms647558.aspx # and: # http://www.codeguru.com/cpp/controls/menu/bitmappedmenus/article.php/c165 # Create one with an icon - this is *lots* more work - we do it # owner-draw! The primary reason is to handle transparency better - # converting to a bitmap causes the background to be incorrect when # the menu item is selected. I can't see a simpler way. # First, load the icon we want to use. ico_x = GetSystemMetrics(win32con.SM_CXSMICON) ico_y = GetSystemMetrics(win32con.SM_CYSMICON) if self.iconPathName: hicon = LoadImage(0, self.iconPathName, win32con.IMAGE_ICON, ico_x, ico_y, win32con.LR_LOADFROMFILE) else: shell_dll = os.path.join(GetSystemDirectory(), "shell32.dll") large, small = win32gui.ExtractIconEx(shell_dll, 4, 1) hicon = small[0] DestroyIcon(large[0]) # Stash away the text and hicon in our map, and add the owner-draw # item to the menu. index = 0 self.menu_item_map[index] = (hicon, "Menu with owner-draw icon") item, extras = PackMENUITEMINFO(fType=win32con.MFT_OWNERDRAW, dwItemData=index, wID=1009) InsertMenuItem(menu, 0, 1, item) # Add another icon-based icon - but this time using HBMMENU_CALLBACK # in the hbmpItem elt, so we only need to draw the icon (ie, not the # text or checkmark) index = 1 self.menu_item_map[index] = (hicon, None) item, extras = PackMENUITEMINFO(text="Menu with o-d icon 2", dwItemData=index, hbmpItem=win32con.HBMMENU_CALLBACK, wID=1010) InsertMenuItem(menu, 0, 1, item) # Add another icon-based icon - this time by converting # via bitmap. Note the icon background when selected is ugly :( hdcBitmap = CreateCompatibleDC(0) hdcScreen = GetDC(0) hbm = CreateCompatibleBitmap(hdcScreen, ico_x, ico_y) hbmOld = SelectObject(hdcBitmap, hbm) SetBkMode(hdcBitmap, win32con.TRANSPARENT) # Fill the background. brush = GetSysColorBrush(win32con.COLOR_MENU) FillRect(hdcBitmap, (0, 0, 16, 16), brush) # unclear if brush needs to be freed. Best clue I can find is: # "GetSysColorBrush returns a cached brush instead of allocating a new # one." - implies no DeleteObject. # draw the icon DrawIconEx(hdcBitmap, 0, 0, hicon, ico_x, ico_y, 0, 0, win32con.DI_NORMAL) SelectObject(hdcBitmap, hbmOld) DeleteDC(hdcBitmap) item, extras = PackMENUITEMINFO(text="Menu with icon", hbmpItem=hbm.Detach(), wID=1011) InsertMenuItem(menu, 0, 1, item) # Create a sub-menu, and put a few funky ones there. self.sub_menu = sub_menu = CreatePopupMenu() # A 'checkbox' menu. item, extras = PackMENUITEMINFO(fState=win32con.MFS_CHECKED, text="Checkbox menu", hbmpItem=hbmp, wID=1003) InsertMenuItem(sub_menu, 0, 1, item) # A 'radio' menu. InsertMenu(sub_menu, 0, win32con.MF_BYPOSITION, win32con.MF_SEPARATOR, None) item, extras = PackMENUITEMINFO(fType=win32con.MFT_RADIOCHECK, fState=win32con.MFS_CHECKED, text="Checkbox menu - bullet 1", hbmpItem=hbmp, wID=1004) InsertMenuItem(sub_menu, 0, 1, item) item, extras = PackMENUITEMINFO(fType=win32con.MFT_RADIOCHECK, fState=win32con.MFS_UNCHECKED, text="Checkbox menu - bullet 2", hbmpItem=hbmp, wID=1005) InsertMenuItem(sub_menu, 0, 1, item) # And add the sub-menu to the top-level menu. item, extras = PackMENUITEMINFO(text="Sub-Menu", hSubMenu=sub_menu) InsertMenuItem(menu, 0, 1, item) # Set 'Exit' as the default option. SetMenuDefaultItem(menu, 1000, 0) def OnDestroy(self, hwnd, msg, wparam, lparam): nid = (self.hwnd, 0) Shell_NotifyIcon(NIM_DELETE, nid) PostQuitMessage(0) # Terminate the app. def OnTaskbarNotify(self, hwnd, msg, wparam, lparam): if lparam==win32con.WM_RBUTTONUP: print("You right clicked me.") # display the menu at the cursor pos. pos = GetCursorPos() SetForegroundWindow(self.hwnd) TrackPopupMenu(self.hmenu, win32con.TPM_LEFTALIGN, pos[0], pos[1], 0, self.hwnd, None) PostMessage(self.hwnd, win32con.WM_NULL, 0, 0) elif lparam==win32con.WM_LBUTTONDBLCLK: print("You double-clicked me") # find the default menu item and fire it. cmd = GetMenuDefaultItem(self.hmenu, False, 0) if cmd == -1: print("Can't find a default!") # and just pretend it came from the menu self.OnCommand(hwnd, win32con.WM_COMMAND, cmd, 0) return 1 def OnCommand(self, hwnd, msg, wparam, lparam): id = LOWORD(wparam) if id == 1000: print("Goodbye") DestroyWindow(self.hwnd) elif id in (1003, 1004, 1005): # Our 'checkbox' and 'radio' items state = GetMenuState(self.sub_menu, id, win32con.MF_BYCOMMAND) if state==-1: raise RuntimeError("No item found") if state & win32con.MF_CHECKED: check_flags = win32con.MF_UNCHECKED print("Menu was checked - unchecking") else: check_flags = win32con.MF_CHECKED print("Menu was unchecked - checking") if id == 1003: # simple checkbox rc = CheckMenuItem(self.sub_menu, id, win32con.MF_BYCOMMAND | check_flags) else: # radio button - must pass the first and last IDs in the # "group", and the ID in the group that is to be selected. rc = CheckMenuRadioItem(self.sub_menu, 1004, 1005, id, win32con.MF_BYCOMMAND) # Get and check the new state - first the simple way... new_state = GetMenuState(self.sub_menu, id, win32con.MF_BYCOMMAND) if new_state & win32con.MF_CHECKED != check_flags: raise RuntimeError("The new item didn't get the new checked state!") # Now the long-winded way via GetMenuItemInfo... buf, extras = EmptyMENUITEMINFO() win32gui.GetMenuItemInfo(self.sub_menu, id, False, buf) fType, fState, wID, hSubMenu, hbmpChecked, hbmpUnchecked, \ dwItemData, text, hbmpItem = UnpackMENUITEMINFO(buf) if fState & win32con.MF_CHECKED != check_flags: raise RuntimeError("The new item didn't get the new checked state!") else: print("OnCommand for ID", id) # Owner-draw related functions. We only have 1 owner-draw item, but # we pretend we have more than that :) def OnMeasureItem(self, hwnd, msg, wparam, lparam): ## Last item of MEASUREITEMSTRUCT is a ULONG_PTR fmt = "5iP" buf = PyMakeBuffer(struct.calcsize(fmt), lparam) data = struct.unpack(fmt, buf) ctlType, ctlID, itemID, itemWidth, itemHeight, itemData = data hicon, text = self.menu_item_map[itemData] if text is None: # Only drawing icon due to HBMMENU_CALLBACK cx = self.menu_icon_width cy = self.menu_icon_height else: # drawing the lot! dc = GetDC(hwnd) oldFont = SelectObject(dc, self.font_menu) cx, cy = GetTextExtentPoint32(dc, text) SelectObject(dc, oldFont) ReleaseDC(hwnd, dc) cx += GetSystemMetrics(win32con.SM_CXMENUCHECK) cx += self.menu_icon_width + self.icon_x_pad cy = GetSystemMetrics(win32con.SM_CYMENU) new_data = struct.pack(fmt, ctlType, ctlID, itemID, cx, cy, itemData) PySetMemory(lparam, new_data) return True def OnDrawItem(self, hwnd, msg, wparam, lparam): ## lparam is a DRAWITEMSTRUCT fmt = "5i2P4iP" data = struct.unpack(fmt, PyGetMemory(lparam, struct.calcsize(fmt))) ctlType, ctlID, itemID, itemAction, itemState, hwndItem, \ hDC, left, top, right, bot, itemData = data rect = left, top, right, bot hicon, text = self.menu_item_map[itemData] if text is None: # This means the menu-item had HBMMENU_CALLBACK - so all we # draw is the icon. rect is the entire area we should use. DrawIconEx(hDC, left, top, hicon, right-left, bot-top, 0, 0, win32con.DI_NORMAL) else: # If the user has selected the item, use the selected # text and background colors to display the item. selected = itemState & win32con.ODS_SELECTED if selected: crText = SetTextColor(hDC, GetSysColor(win32con.COLOR_HIGHLIGHTTEXT)) crBkgnd = SetBkColor(hDC, GetSysColor(win32con.COLOR_HIGHLIGHT)) each_pad = self.icon_x_pad // 2 x_icon = left + GetSystemMetrics(win32con.SM_CXMENUCHECK) + each_pad x_text = x_icon + self.menu_icon_width + each_pad # Draw text first, specifying a complete rect to fill - this sets # up the background (but overwrites anything else already there!) # Select the font, draw it, and restore the previous font. hfontOld = SelectObject(hDC, self.font_menu) ExtTextOut(hDC, x_text, top+2, win32con.ETO_OPAQUE, rect, text) SelectObject(hDC, hfontOld) # Icon image next. Icons are transparent - no need to handle # selection specially. DrawIconEx(hDC, x_icon, top+2, hicon, self.menu_icon_width, self.menu_icon_height, 0, 0, win32con.DI_NORMAL) # Return the text and background colors to their # normal state (not selected). if selected: SetTextColor(hDC, crText) SetBkColor(hDC, crBkgnd) def main(): w=MainWindow() PumpMessages() if __name__=='__main__': main() PK ѳPMoJwin32/Demos/eventLogDemo.pyUT l_Zx`ux import win32evtlog import win32api import win32con import win32security # To translate NT Sids to account names. import win32evtlogutil def ReadLog(computer, logType="Application", dumpEachRecord = 0): # read the entire log back. h=win32evtlog.OpenEventLog(computer, logType) numRecords = win32evtlog.GetNumberOfEventLogRecords(h) # print "There are %d records" % numRecords num=0 while 1: objects = win32evtlog.ReadEventLog(h, win32evtlog.EVENTLOG_BACKWARDS_READ|win32evtlog.EVENTLOG_SEQUENTIAL_READ, 0) if not objects: break for object in objects: # get it for testing purposes, but dont print it. msg = win32evtlogutil.SafeFormatMessage(object, logType) if object.Sid is not None: try: domain, user, typ = win32security.LookupAccountSid(computer, object.Sid) sidDesc = "%s/%s" % (domain, user) except win32security.error: sidDesc = str(object.Sid) user_desc = "Event associated with user %s" % (sidDesc,) else: user_desc = None if dumpEachRecord: print("Event record from %r generated at %s" % (object.SourceName, object.TimeGenerated.Format())) if user_desc: print(user_desc) try: print(msg) except UnicodeError: print("(unicode error printing message: repr() follows...)") print(repr(msg)) num = num + len(objects) if numRecords == num: print("Successfully read all", numRecords, "records") else: print("Couldn't get all records - reported %d, but found %d" % (numRecords, num)) print("(Note that some other app may have written records while we were running!)") win32evtlog.CloseEventLog(h) def usage(): print("Writes an event to the event log.") print("-w : Dont write any test records.") print("-r : Dont read the event log") print("-c : computerName : Process the log on the specified computer") print("-v : Verbose") print("-t : LogType - Use the specified log - default = 'Application'") def test(): # check if running on Windows NT, if not, display notice and terminate if win32api.GetVersion() & 0x80000000: print("This sample only runs on NT") return import sys, getopt opts, args = getopt.getopt(sys.argv[1:], "rwh?c:t:v") computer = None do_read = do_write = 1 logType = "Application" verbose = 0 if len(args)>0: print("Invalid args") usage() return 1 for opt, val in opts: if opt == '-t': logType = val if opt == '-c': computer = val if opt in ['-h', '-?']: usage() return if opt=='-r': do_read = 0 if opt=='-w': do_write = 0 if opt=='-v': verbose = verbose + 1 if do_write: ph=win32api.GetCurrentProcess() th = win32security.OpenProcessToken(ph,win32con.TOKEN_READ) my_sid = win32security.GetTokenInformation(th,win32security.TokenUser)[0] win32evtlogutil.ReportEvent(logType, 2, strings=["The message text for event 2","Another insert"], data = "Raw\0Data".encode("ascii"), sid = my_sid) win32evtlogutil.ReportEvent(logType, 1, eventType=win32evtlog.EVENTLOG_WARNING_TYPE, strings=["A warning","An even more dire warning"], data = "Raw\0Data".encode("ascii"), sid = my_sid) win32evtlogutil.ReportEvent(logType, 1, eventType=win32evtlog.EVENTLOG_INFORMATION_TYPE, strings=["An info","Too much info"], data = "Raw\0Data".encode("ascii"), sid = my_sid) print("Successfully wrote 3 records to the log") if do_read: ReadLog(computer, logType, verbose > 0) if __name__=='__main__': test() PK ѳPq(#win32/Demos/SystemParametersInfo.pyUT l_Zx`ux import win32gui, win32con, win32api, time, os, glob ## some of these tests will fail for systems prior to XP for pname in( ## Set actions all take an unsigned int in pvParam "SPI_GETMOUSESPEED", "SPI_GETACTIVEWNDTRKTIMEOUT", "SPI_GETCARETWIDTH", "SPI_GETFOREGROUNDFLASHCOUNT", "SPI_GETFOREGROUNDLOCKTIMEOUT", ## Set actions all take an unsigned int in uiParam "SPI_GETWHEELSCROLLLINES", "SPI_GETKEYBOARDDELAY", "SPI_GETKEYBOARDSPEED", "SPI_GETMOUSEHOVERHEIGHT", "SPI_GETMOUSEHOVERWIDTH", "SPI_GETMOUSEHOVERTIME", "SPI_GETSCREENSAVETIMEOUT", "SPI_GETMENUSHOWDELAY", "SPI_GETLOWPOWERTIMEOUT", "SPI_GETPOWEROFFTIMEOUT", "SPI_GETBORDER", ## below are winxp only: "SPI_GETFONTSMOOTHINGCONTRAST", "SPI_GETFONTSMOOTHINGTYPE", "SPI_GETFOCUSBORDERHEIGHT", "SPI_GETFOCUSBORDERWIDTH", "SPI_GETMOUSECLICKLOCKTIME"): print(pname) cget=getattr(win32con,pname) cset=getattr(win32con,pname.replace('_GET','_SET')) orig_value=win32gui.SystemParametersInfo(cget) print('\toriginal setting:',orig_value) win32gui.SystemParametersInfo(cset, orig_value+1) new_value=win32gui.SystemParametersInfo(cget) print('\tnew value:',new_value) # On Vista, some of these values seem to be ignored. So only "fail" if # the new value isn't what we set or the original if new_value!=orig_value+1: assert new_value == orig_value print("Strange - setting %s seems to have been ignored" % (pname,)) win32gui.SystemParametersInfo(cset, orig_value) assert win32gui.SystemParametersInfo(cget)==orig_value # these take a boolean value in pvParam # change to opposite, check that it was changed and change back for pname in ("SPI_GETFLATMENU","SPI_GETDROPSHADOW","SPI_GETKEYBOARDCUES","SPI_GETMENUFADE", "SPI_GETCOMBOBOXANIMATION", "SPI_GETCURSORSHADOW", "SPI_GETGRADIENTCAPTIONS", "SPI_GETHOTTRACKING", "SPI_GETLISTBOXSMOOTHSCROLLING", "SPI_GETMENUANIMATION", "SPI_GETSELECTIONFADE", "SPI_GETTOOLTIPANIMATION", "SPI_GETTOOLTIPFADE", "SPI_GETUIEFFECTS", "SPI_GETACTIVEWINDOWTRACKING", "SPI_GETACTIVEWNDTRKZORDER"): print(pname) cget=getattr(win32con,pname) cset=getattr(win32con,pname.replace('_GET','_SET')) orig_value=win32gui.SystemParametersInfo(cget) print(orig_value) win32gui.SystemParametersInfo(cset, not orig_value) new_value=win32gui.SystemParametersInfo(cget) print(new_value) assert orig_value!=new_value win32gui.SystemParametersInfo(cset, orig_value) assert win32gui.SystemParametersInfo(cget)==orig_value # these take a boolean in uiParam # could combine with above section now that SystemParametersInfo only takes a single parameter for pname in ("SPI_GETFONTSMOOTHING","SPI_GETICONTITLEWRAP","SPI_GETBEEP","SPI_GETBLOCKSENDINPUTRESETS", "SPI_GETKEYBOARDPREF","SPI_GETSCREENSAVEACTIVE","SPI_GETMENUDROPALIGNMENT", "SPI_GETDRAGFULLWINDOWS", "SPI_GETSHOWIMEUI"): cget=getattr(win32con,pname) cset=getattr(win32con,pname.replace('_GET','_SET')) orig_value=win32gui.SystemParametersInfo(cget) win32gui.SystemParametersInfo(cset, not orig_value) new_value=win32gui.SystemParametersInfo(cget) # Some of these also can't be changed (eg, SPI_GETSCREENSAVEACTIVE) so # don't actually get upset. if orig_value!=new_value: print("successfully toggled", pname, "from", orig_value, "to", new_value) else: print("couldn't toggle", pname, "from", orig_value) win32gui.SystemParametersInfo(cset, orig_value) assert win32gui.SystemParametersInfo(cget)==orig_value print("SPI_GETICONTITLELOGFONT") lf=win32gui.SystemParametersInfo(win32con.SPI_GETICONTITLELOGFONT) orig_height=lf.lfHeight orig_italic=lf.lfItalic print('Height:', orig_height, 'Italic:',orig_italic) lf.lfHeight+=2 lf.lfItalic=not lf.lfItalic win32gui.SystemParametersInfo(win32con.SPI_SETICONTITLELOGFONT, lf) new_lf=win32gui.SystemParametersInfo(win32con.SPI_GETICONTITLELOGFONT) print('New Height:', new_lf.lfHeight, 'New Italic:',new_lf.lfItalic) assert new_lf.lfHeight==orig_height+2 assert new_lf.lfItalic!=orig_italic lf.lfHeight=orig_height lf.lfItalic=orig_italic win32gui.SystemParametersInfo(win32con.SPI_SETICONTITLELOGFONT, lf) new_lf=win32gui.SystemParametersInfo(win32con.SPI_GETICONTITLELOGFONT) assert new_lf.lfHeight==orig_height assert new_lf.lfItalic==orig_italic print("SPI_GETMOUSEHOVERWIDTH, SPI_GETMOUSEHOVERHEIGHT, SPI_GETMOUSEHOVERTIME") w=win32gui.SystemParametersInfo(win32con.SPI_GETMOUSEHOVERWIDTH) h=win32gui.SystemParametersInfo(win32con.SPI_GETMOUSEHOVERHEIGHT) t=win32gui.SystemParametersInfo(win32con.SPI_GETMOUSEHOVERTIME) print('w,h,t:', w,h,t) win32gui.SystemParametersInfo(win32con.SPI_SETMOUSEHOVERWIDTH,w+1) win32gui.SystemParametersInfo(win32con.SPI_SETMOUSEHOVERHEIGHT,h+2) win32gui.SystemParametersInfo(win32con.SPI_SETMOUSEHOVERTIME,t+3) new_w=win32gui.SystemParametersInfo(win32con.SPI_GETMOUSEHOVERWIDTH) new_h=win32gui.SystemParametersInfo(win32con.SPI_GETMOUSEHOVERHEIGHT) new_t=win32gui.SystemParametersInfo(win32con.SPI_GETMOUSEHOVERTIME) print('new w,h,t:', new_w, new_h, new_t) assert new_w==w+1 assert new_h==h+2 assert new_t==t+3 win32gui.SystemParametersInfo(win32con.SPI_SETMOUSEHOVERWIDTH,w) win32gui.SystemParametersInfo(win32con.SPI_SETMOUSEHOVERHEIGHT,h) win32gui.SystemParametersInfo(win32con.SPI_SETMOUSEHOVERTIME,t) new_w=win32gui.SystemParametersInfo(win32con.SPI_GETMOUSEHOVERWIDTH) new_h=win32gui.SystemParametersInfo(win32con.SPI_GETMOUSEHOVERHEIGHT) new_t=win32gui.SystemParametersInfo(win32con.SPI_GETMOUSEHOVERTIME) assert new_w==w assert new_h==h assert new_t==t print("SPI_SETDOUBLECLKWIDTH, SPI_SETDOUBLECLKHEIGHT") x=win32api.GetSystemMetrics(win32con.SM_CXDOUBLECLK) y=win32api.GetSystemMetrics(win32con.SM_CYDOUBLECLK) print('x,y:', x, y) win32gui.SystemParametersInfo(win32con.SPI_SETDOUBLECLKWIDTH, x+1) win32gui.SystemParametersInfo(win32con.SPI_SETDOUBLECLKHEIGHT, y+2) new_x=win32api.GetSystemMetrics(win32con.SM_CXDOUBLECLK) new_y=win32api.GetSystemMetrics(win32con.SM_CYDOUBLECLK) print('new x,y:', new_x, new_y) assert new_x==x+1 assert new_y==y+2 win32gui.SystemParametersInfo(win32con.SPI_SETDOUBLECLKWIDTH, x) win32gui.SystemParametersInfo(win32con.SPI_SETDOUBLECLKHEIGHT, y) new_x=win32api.GetSystemMetrics(win32con.SM_CXDOUBLECLK) new_y=win32api.GetSystemMetrics(win32con.SM_CYDOUBLECLK) assert new_x==x assert new_y==y print("SPI_SETDRAGWIDTH, SPI_SETDRAGHEIGHT") dw=win32api.GetSystemMetrics(win32con.SM_CXDRAG) dh=win32api.GetSystemMetrics(win32con.SM_CYDRAG) print('dw,dh:', dw, dh) win32gui.SystemParametersInfo(win32con.SPI_SETDRAGWIDTH,dw+1) win32gui.SystemParametersInfo(win32con.SPI_SETDRAGHEIGHT,dh+2) new_dw=win32api.GetSystemMetrics(win32con.SM_CXDRAG) new_dh=win32api.GetSystemMetrics(win32con.SM_CYDRAG) print('new dw,dh:', new_dw, new_dh) assert new_dw==dw+1 assert new_dh==dh+2 win32gui.SystemParametersInfo(win32con.SPI_SETDRAGWIDTH,dw) win32gui.SystemParametersInfo(win32con.SPI_SETDRAGHEIGHT,dh) new_dw=win32api.GetSystemMetrics(win32con.SM_CXDRAG) new_dh=win32api.GetSystemMetrics(win32con.SM_CYDRAG) assert new_dw==dw assert new_dh==dh orig_wallpaper=win32gui.SystemParametersInfo(Action=win32con.SPI_GETDESKWALLPAPER) print('Original: ',orig_wallpaper) for bmp in glob.glob(os.path.join(os.environ['windir'],'*.bmp')): print(bmp) win32gui.SystemParametersInfo(win32con.SPI_SETDESKWALLPAPER, Param=bmp) print(win32gui.SystemParametersInfo(Action=win32con.SPI_GETDESKWALLPAPER)) time.sleep(1) win32gui.SystemParametersInfo(win32con.SPI_SETDESKWALLPAPER, Param=orig_wallpaper) PK ѳP|win32/Demos/rastest.pyUT l_Zx`ux # rastest.py - test/demonstrate the win32ras module. # Much of the code here contributed by Jethro Wright. import sys import os import win32ras # Build a little dictionary of RAS states to decent strings. # eg win32ras.RASCS_OpenPort -> "OpenPort" stateMap = {} for name, val in list(win32ras.__dict__.items()): if name[:6]=="RASCS_": stateMap[val] = name[6:] # Use a lock so the callback can tell the main thread when it is finished. import win32event callbackEvent = win32event.CreateEvent(None, 0, 0, None) def Callback( hras, msg, state, error, exterror): # print "Callback called with ", hras, msg, state, error, exterror stateName = stateMap.get(state, "Unknown state?") print("Status is %s (%04lx), error code is %d" % (stateName, state, error)) finished = state in [win32ras.RASCS_Connected] if finished: win32event.SetEvent(callbackEvent) if error != 0 or int( state ) == win32ras.RASCS_Disconnected: # we know for sure this is a good place to hangup.... print("Detected call failure: %s" % win32ras.GetErrorString( error )) HangUp( hras ) win32event.SetEvent(callbackEvent) def ShowConnections(): print("All phone-book entries:") for (name,) in win32ras.EnumEntries(): print(" ", name) print("Current Connections:") for con in win32ras.EnumConnections(): print(" ", con) def EditEntry(entryName): try: win32ras.EditPhonebookEntry(0,None,entryName) except win32ras.error as xxx_todo_changeme: (rc, function, msg) = xxx_todo_changeme.args print("Can not edit/find the RAS entry -", msg) def HangUp( hras ): # trap potential, irrelevant errors from win32ras.... try: win32ras.HangUp( hras ) except: print("Tried to hang up gracefully on error, but didn't work....") return None def Connect(entryName, bUseCallback): if bUseCallback: theCallback = Callback win32event.ResetEvent(callbackEvent) else: theCallback = None # in order to *use* the username/password of a particular dun entry, one must # explicitly get those params under win95.... try: dp, b = win32ras.GetEntryDialParams( None, entryName ) except: print("Couldn't find DUN entry: %s" % entryName) else: hras, rc = win32ras.Dial(None, None, (entryName, "", "", dp[ 3 ], dp[ 4 ], ""),theCallback) # hras, rc = win32ras.Dial(None, None, (entryName, ),theCallback) # print hras, rc if not bUseCallback and rc != 0: print("Could not dial the RAS connection:", win32ras.GetErrorString(rc)) hras = HangUp( hras ) # don't wait here if there's no need to.... elif bUseCallback and win32event.WaitForSingleObject(callbackEvent, 60000)!=win32event.WAIT_OBJECT_0: print("Gave up waiting for the process to complete!") # sdk docs state one must explcitly hangup, even if there's an error.... try: cs = win32ras.GetConnectStatus( hras ) except: # on error, attempt a hang up anyway.... hras = HangUp( hras ) else: if int( cs[ 0 ] ) == win32ras.RASCS_Disconnected: hras = HangUp( hras ) return hras, rc def Disconnect( rasEntry ): # Need to find the entry name = rasEntry.lower() for hcon, entryName, devName, devType in win32ras.EnumConnections(): if entryName.lower() == name: win32ras.HangUp( hcon ) print("Disconnected from", rasEntry) break else: print("Could not find an open connection to", entryName) usage = """ Usage: %s [-s] [-l] [-c connection] [-d connection] -l : List phone-book entries and current connections. -s : Show status while connecting/disconnecting (uses callbacks) -c : Connect to the specified phonebook name. -d : Disconnect from the specified phonebook name. -e : Edit the specified phonebook entry. """ def main(): import getopt try: opts, args = getopt.getopt(sys.argv[1:], "slc:d:e:") except getopt.error as why: print(why) print(usage % (os.path.basename(sys.argv[0],))) return bCallback = 0 if args or not opts: print(usage % (os.path.basename(sys.argv[0],))) return for opt, val in opts: if opt=="-s": bCallback = 1 if opt=="-l": ShowConnections() if opt=="-c": hras, rc = Connect(val, bCallback) if hras != None: print("hras: 0x%8lx, rc: 0x%04x" % ( hras, rc )) if opt=="-d": Disconnect(val) if opt=="-e": EditEntry(val) if __name__=='__main__': main() PK ѳP1`win32/Demos/winprocess.pyUT l_Zx`ux """ Windows Process Control winprocess.run launches a child process and returns the exit code. Optionally, it can: redirect stdin, stdout & stderr to files run the command as another user limit the process's running time control the process window (location, size, window state, desktop) Works on Windows NT, 2000 & XP. Requires Mark Hammond's win32 extensions. This code is free for any purpose, with no warranty of any kind. -- John B. Dell'Aquila """ import win32api, win32process, win32security import win32event, win32con, msvcrt, win32gui import os def logonUser(loginString): """ Login as specified user and return handle. loginString: 'Domain\nUser\nPassword'; for local login use . or empty string as domain e.g. '.\nadministrator\nsecret_password' """ domain, user, passwd = loginString.split('\n') return win32security.LogonUser( user, domain, passwd, win32con.LOGON32_LOGON_INTERACTIVE, win32con.LOGON32_PROVIDER_DEFAULT ) class Process: """ A Windows process. """ def __init__(self, cmd, login=None, hStdin=None, hStdout=None, hStderr=None, show=1, xy=None, xySize=None, desktop=None): """ Create a Windows process. cmd: command to run login: run as user 'Domain\nUser\nPassword' hStdin, hStdout, hStderr: handles for process I/O; default is caller's stdin, stdout & stderr show: wShowWindow (0=SW_HIDE, 1=SW_NORMAL, ...) xy: window offset (x, y) of upper left corner in pixels xySize: window size (width, height) in pixels desktop: lpDesktop - name of desktop e.g. 'winsta0\\default' None = inherit current desktop '' = create new desktop if necessary User calling login requires additional privileges: Act as part of the operating system [not needed on Windows XP] Increase quotas Replace a process level token Login string must EITHER be an administrator's account (ordinary user can't access current desktop - see Microsoft Q165194) OR use desktop='' to run another desktop invisibly (may be very slow to startup & finalize). """ si = win32process.STARTUPINFO() si.dwFlags = (win32con.STARTF_USESTDHANDLES ^ win32con.STARTF_USESHOWWINDOW) if hStdin is None: si.hStdInput = win32api.GetStdHandle(win32api.STD_INPUT_HANDLE) else: si.hStdInput = hStdin if hStdout is None: si.hStdOutput = win32api.GetStdHandle(win32api.STD_OUTPUT_HANDLE) else: si.hStdOutput = hStdout if hStderr is None: si.hStdError = win32api.GetStdHandle(win32api.STD_ERROR_HANDLE) else: si.hStdError = hStderr si.wShowWindow = show if xy is not None: si.dwX, si.dwY = xy si.dwFlags ^= win32con.STARTF_USEPOSITION if xySize is not None: si.dwXSize, si.dwYSize = xySize si.dwFlags ^= win32con.STARTF_USESIZE if desktop is not None: si.lpDesktop = desktop procArgs = (None, # appName cmd, # commandLine None, # processAttributes None, # threadAttributes 1, # bInheritHandles win32process.CREATE_NEW_CONSOLE, # dwCreationFlags None, # newEnvironment None, # currentDirectory si) # startupinfo if login is not None: hUser = logonUser(login) win32security.ImpersonateLoggedOnUser(hUser) procHandles = win32process.CreateProcessAsUser(hUser, *procArgs) win32security.RevertToSelf() else: procHandles = win32process.CreateProcess(*procArgs) self.hProcess, self.hThread, self.PId, self.TId = procHandles def wait(self, mSec=None): """ Wait for process to finish or for specified number of milliseconds to elapse. """ if mSec is None: mSec = win32event.INFINITE return win32event.WaitForSingleObject(self.hProcess, mSec) def kill(self, gracePeriod=5000): """ Kill process. Try for an orderly shutdown via WM_CLOSE. If still running after gracePeriod (5 sec. default), terminate. """ win32gui.EnumWindows(self.__close__, 0) if self.wait(gracePeriod) != win32event.WAIT_OBJECT_0: win32process.TerminateProcess(self.hProcess, 0) win32api.Sleep(100) # wait for resources to be released def __close__(self, hwnd, dummy): """ EnumWindows callback - sends WM_CLOSE to any window owned by this process. """ TId, PId = win32process.GetWindowThreadProcessId(hwnd) if PId == self.PId: win32gui.PostMessage(hwnd, win32con.WM_CLOSE, 0, 0) def exitCode(self): """ Return process exit code. """ return win32process.GetExitCodeProcess(self.hProcess) def run(cmd, mSec=None, stdin=None, stdout=None, stderr=None, **kw): """ Run cmd as a child process and return exit code. mSec: terminate cmd after specified number of milliseconds stdin, stdout, stderr: file objects for child I/O (use hStdin etc. to attach handles instead of files); default is caller's stdin, stdout & stderr; kw: see Process.__init__ for more keyword options """ if stdin is not None: kw['hStdin'] = msvcrt.get_osfhandle(stdin.fileno()) if stdout is not None: kw['hStdout'] = msvcrt.get_osfhandle(stdout.fileno()) if stderr is not None: kw['hStderr'] = msvcrt.get_osfhandle(stderr.fileno()) child = Process(cmd, **kw) if child.wait(mSec) != win32event.WAIT_OBJECT_0: child.kill() raise WindowsError('process timeout exceeded') return child.exitCode() if __name__ == '__main__': # Pipe commands to a shell and display the output in notepad print('Testing winprocess.py...') import tempfile timeoutSeconds = 15 cmdString = """\ REM Test of winprocess.py piping commands to a shell.\r REM This 'notepad' process will terminate in %d seconds.\r vol\r net user\r _this_is_a_test_of_stderr_\r """ % timeoutSeconds cmd_name = tempfile.mktemp() out_name = cmd_name + '.txt' try: cmd = open(cmd_name, "w+b") out = open(out_name, "w+b") cmd.write(cmdString.encode('mbcs')) cmd.seek(0) print('CMD.EXE exit code:', run('cmd.exe', show=0, stdin=cmd, stdout=out, stderr=out)) cmd.close() print('NOTEPAD exit code:', run('notepad.exe %s' % out.name, show=win32con.SW_MAXIMIZE, mSec=timeoutSeconds*1000)) out.close() finally: for n in (cmd_name, out_name): try: os.unlink(cmd_name) except os.error: pass PK ѳPawin32/Demos/cerapi.pyUT l_Zx`ux # A demo of the Windows CE Remote API # # This connects to a CE device, and interacts with it. import wincerapi import win32event import win32api import win32con import os import sys import getopt def DumpPythonRegistry(): try: h = wincerapi.CeRegOpenKeyEx(win32con.HKEY_LOCAL_MACHINE, "Software\\Python\\PythonCore\\%s\\PythonPath" % sys.winver) except win32api.error: print("The remote device does not appear to have Python installed") return 0 path, typ = wincerapi.CeRegQueryValueEx(h, None) print("The remote PythonPath is '%s'" % (str(path), )) h.Close() return 1 def DumpRegistry(root, level=0): # A recursive dump of the remote registry to test most functions. h = wincerapi.CeRegOpenKeyEx(win32con.HKEY_LOCAL_MACHINE, None) level_prefix = " " * level index = 0 # Enumerate values. while 1: try: name, data, typ = wincerapi.CeRegEnumValue(root, index) except win32api.error: break print("%s%s=%s" % (level_prefix, name, repr(str(data)))) index = index+1 # Now enumerate all keys. index=0 while 1: try: name, klass = wincerapi.CeRegEnumKeyEx(root, index) except win32api.error: break print("%s%s\\" % (level_prefix, name)) subkey = wincerapi.CeRegOpenKeyEx(root, name) DumpRegistry(subkey, level+1) index = index+1 def DemoCopyFile(): # Create a file on the device, and write a string. cefile = wincerapi.CeCreateFile("TestPython", win32con.GENERIC_WRITE, 0, None, win32con.OPEN_ALWAYS, 0, None) wincerapi.CeWriteFile(cefile, "Hello from Python") cefile.Close() # reopen the file and check the data. cefile = wincerapi.CeCreateFile("TestPython", win32con.GENERIC_READ, 0, None, win32con.OPEN_EXISTING, 0, None) if wincerapi.CeReadFile(cefile, 100) != "Hello from Python": print("Couldnt read the data from the device!") cefile.Close() # Delete the test file wincerapi.CeDeleteFile("TestPython") print("Created, wrote to, read from and deleted a test file!") def DemoCreateProcess(): try: hp, ht, pid, tid = wincerapi.CeCreateProcess("Windows\\Python.exe", "", None, None, 0, 0, None, "", None) # Not necessary, except to see if handle closing raises an exception # (if auto-closed, the error is suppressed) hp.Close() ht.Close() print("Python is running on the remote device!") except win32api.error as xxx_todo_changeme1: (hr, fn, msg) = xxx_todo_changeme1.args print("Couldnt execute remote process -", msg) def DumpRemoteMachineStatus(): ACLineStatus, BatteryFlag, BatteryLifePercent, BatteryLifeTime, BatteryFullLifeTime, BackupBatteryFlag, BackupBatteryLifePercent, BackupBatteryLifeTime, BackupBatteryLifeTime = \ wincerapi.CeGetSystemPowerStatusEx() if ACLineStatus: power = "AC" else: power = "battery" if BatteryLifePercent==255: batPerc = "unknown" else: batPerc = BatteryLifePercent print("The batteries are at %s%%, and is currently being powered by %s" % (batPerc, power)) memLoad, totalPhys, availPhys, totalPage, availPage, totalVirt, availVirt = \ wincerapi.CeGlobalMemoryStatus() print("The memory is %d%% utilized." % (memLoad)) print("%-20s%-10s%-10s" % ("", "Total", "Avail")) print("%-20s%-10s%-10s" % ("Physical Memory", totalPhys, availPhys)) print("%-20s%-10s%-10s" % ("Virtual Memory", totalVirt, availVirt)) print("%-20s%-10s%-10s" % ("Paging file", totalPage, availPage)) storeSize, freeSize = wincerapi.CeGetStoreInformation() print("%-20s%-10s%-10s" % ("File store", storeSize, freeSize)) print("The CE temp path is", wincerapi.CeGetTempPath()) print("The system info for the device is", wincerapi.CeGetSystemInfo()) def DumpRemoteFolders(): # Dump all special folders possible. for name, val in list(wincerapi.__dict__.items()): if name[:6]=="CSIDL_": try: loc = str(wincerapi.CeGetSpecialFolderPath(val)) print("Folder %s is at %s" % (name, loc)) except win32api.error as details: pass # Get the shortcut targets for the "Start Menu" print("Dumping start menu shortcuts...") try: startMenu = str(wincerapi.CeGetSpecialFolderPath(wincerapi.CSIDL_STARTMENU)) except win32api.error as details: print("This device has no start menu!", details) startMenu = None if startMenu: for fileAttr in wincerapi.CeFindFiles(os.path.join(startMenu, "*")): fileName = fileAttr[8] fullPath = os.path.join(startMenu, str(fileName)) try: resolved = wincerapi.CeSHGetShortcutTarget(fullPath) except win32api.error as xxx_todo_changeme: (rc, fn, msg) = xxx_todo_changeme.args resolved = "#Error - %s" % msg print("%s->%s" % (fileName, resolved)) # print "The start menu is at", # print wincerapi.CeSHGetShortcutTarget("\\Windows\\Start Menu\\Shortcut to Python.exe.lnk") def usage(): print("Options:") print("-a - Execute all demos") print("-p - Execute Python process on remote device") print("-r - Dump the remote registry") print("-f - Dump all remote special folder locations") print("-s - Dont dump machine status") print("-y - Perform asynch init of CE connection") def main(): async_init = bStartPython = bDumpRegistry = bDumpFolders = 0 bDumpStatus = 1 try: opts, args = getopt.getopt(sys.argv[1:], "apr") except getopt.error as why: print("Invalid usage:", why) usage() return for o, v in opts: if o=="-a": bStartPython = bDumpRegistry = bDumpStatus = bDumpFolders = asynch_init = 1 if o=="-p": bStartPython=1 if o=="-r": bDumpRegistry=1 if o=="-s": bDumpStatus=0 if o=="-f": bDumpFolders = 1 if o=="-y": print("Doing asynch init of CE connection") async_init = 1 if async_init: event, rc = wincerapi.CeRapiInitEx() while 1: rc = win32event.WaitForSingleObject(event, 500) if rc==win32event.WAIT_OBJECT_0: # We connected. break else: print("Waiting for Initialize to complete (picture a Cancel button here :)") else: wincerapi.CeRapiInit() print("Connected to remote CE device.") try: verinfo = wincerapi.CeGetVersionEx() print("The device is running windows CE version %d.%d - %s" % (verinfo[0], verinfo[1], verinfo[4])) if bDumpStatus: print("Dumping remote machine status") DumpRemoteMachineStatus() if bDumpRegistry: print("Dumping remote registry...") DumpRegistry(win32con.HKEY_LOCAL_MACHINE) if bDumpFolders: print("Dumping remote folder information") DumpRemoteFolders() DemoCopyFile() if bStartPython: print("Starting remote Python process") if DumpPythonRegistry(): DemoCreateProcess() else: print("Not trying to start Python, as it's not installed") finally: wincerapi.CeRapiUninit() print("Disconnected") if __name__=='__main__': main() PK {Rwin32/Demos/service/UT Zx`Zx`ux PK ѳP;}&win32/Demos/service/pipeTestService.pyUT l_Zx`ux # A Demo of services and named pipes. # A multi-threaded service that simply echos back its input. # * Install as a service using "pipeTestService.py install" # * Use Control Panel to change the user name of the service # to a real user name (ie, NOT the SystemAccount) # * Start the service. # * Run the "pipeTestServiceClient.py" program as the client pipe side. import win32serviceutil, win32service import pywintypes, win32con, winerror # Use "import *" to keep this looking as much as a "normal" service # as possible. Real code shouldn't do this. from win32event import * from win32file import * from win32pipe import * from win32api import * from ntsecuritycon import * # Old versions of the service framework would not let you import this # module at the top-level. Now you can, and can check 'Debugging()' and # 'RunningAsService()' to check your context. import servicemanager import traceback import _thread def ApplyIgnoreError(fn, args): try: return fn(*args) except error: # Ignore win32api errors. return None class TestPipeService(win32serviceutil.ServiceFramework): _svc_name_ = "PyPipeTestService" _svc_display_name_ = "Python Pipe Test Service" _svc_description_ = "Tests Python service framework by receiving and echoing messages over a named pipe" def __init__(self, args): win32serviceutil.ServiceFramework.__init__(self, args) self.hWaitStop = CreateEvent(None, 0, 0, None) self.overlapped = pywintypes.OVERLAPPED() self.overlapped.hEvent = CreateEvent(None,0,0,None) self.thread_handles = [] def CreatePipeSecurityObject(self): # Create a security object giving World read/write access, # but only "Owner" modify access. sa = pywintypes.SECURITY_ATTRIBUTES() sidEveryone = pywintypes.SID() sidEveryone.Initialize(SECURITY_WORLD_SID_AUTHORITY,1) sidEveryone.SetSubAuthority(0, SECURITY_WORLD_RID) sidCreator = pywintypes.SID() sidCreator.Initialize(SECURITY_CREATOR_SID_AUTHORITY,1) sidCreator.SetSubAuthority(0, SECURITY_CREATOR_OWNER_RID) acl = pywintypes.ACL() acl.AddAccessAllowedAce(FILE_GENERIC_READ|FILE_GENERIC_WRITE, sidEveryone) acl.AddAccessAllowedAce(FILE_ALL_ACCESS, sidCreator) sa.SetSecurityDescriptorDacl(1, acl, 0) return sa # The functions executed in their own thread to process a client request. def DoProcessClient(self, pipeHandle, tid): try: try: # Create a loop, reading large data. If we knew the data stream was # was small, a simple ReadFile would do. d = ''.encode('ascii') # ensure bytes on py2k and py3k... hr = winerror.ERROR_MORE_DATA while hr==winerror.ERROR_MORE_DATA: hr, thisd = ReadFile(pipeHandle, 256) d = d + thisd print("Read", d) ok = 1 except error: # Client disconnection - do nothing ok = 0 # A secure service would handle (and ignore!) errors writing to the # pipe, but for the sake of this demo we dont (if only to see what errors # we can get when our clients break at strange times :-) if ok: msg = ("%s (on thread %d) sent me %s" % (GetNamedPipeHandleState(pipeHandle)[4],tid, d)).encode('ascii') WriteFile(pipeHandle, msg) finally: ApplyIgnoreError( DisconnectNamedPipe, (pipeHandle,) ) ApplyIgnoreError( CloseHandle, (pipeHandle,) ) def ProcessClient(self, pipeHandle): try: procHandle = GetCurrentProcess() th = DuplicateHandle(procHandle, GetCurrentThread(), procHandle, 0, 0, win32con.DUPLICATE_SAME_ACCESS) try: self.thread_handles.append(th) try: return self.DoProcessClient(pipeHandle, th) except: traceback.print_exc() finally: self.thread_handles.remove(th) except: traceback.print_exc() def SvcStop(self): self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) SetEvent(self.hWaitStop) def SvcDoRun(self): # Write an event log record - in debug mode we will also # see this message printed. servicemanager.LogMsg( servicemanager.EVENTLOG_INFORMATION_TYPE, servicemanager.PYS_SERVICE_STARTED, (self._svc_name_, '') ) num_connections = 0 while 1: pipeHandle = CreateNamedPipe("\\\\.\\pipe\\PyPipeTest", PIPE_ACCESS_DUPLEX| FILE_FLAG_OVERLAPPED, PIPE_TYPE_MESSAGE | PIPE_READMODE_BYTE, PIPE_UNLIMITED_INSTANCES, # max instances 0, 0, 6000, self.CreatePipeSecurityObject()) try: hr = ConnectNamedPipe(pipeHandle, self.overlapped) except error as details: print("Error connecting pipe!", details) CloseHandle(pipeHandle) break if hr==winerror.ERROR_PIPE_CONNECTED: # Client is already connected - signal event SetEvent(self.overlapped.hEvent) rc = WaitForMultipleObjects((self.hWaitStop, self.overlapped.hEvent), 0, INFINITE) if rc==WAIT_OBJECT_0: # Stop event break else: # Pipe event - spawn thread to deal with it. _thread.start_new_thread(self.ProcessClient, (pipeHandle,)) num_connections = num_connections + 1 # Sleep to ensure that any new threads are in the list, and then # wait for all current threads to finish. # What is a better way? Sleep(500) while self.thread_handles: self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING, 5000) print("Waiting for %d threads to finish..." % (len(self.thread_handles))) WaitForMultipleObjects(self.thread_handles, 1, 3000) # Write another event log record. servicemanager.LogMsg( servicemanager.EVENTLOG_INFORMATION_TYPE, servicemanager.PYS_SERVICE_STOPPED, (self._svc_name_, " after processing %d connections" % (num_connections,)) ) if __name__=='__main__': win32serviceutil.HandleCommandLine(TestPipeService) PK ѳP,qP((,win32/Demos/service/nativePipeTestService.pyUT l_Zx`ux # This is an example of a service hosted by python.exe rather than # pythonservice.exe. # Note that it is very rare that using python.exe is a better option # than the default pythonservice.exe - the latter has better error handling # so that if Python itself can't be initialized or there are very early # import errors, you will get error details written to the event log. When # using python.exe instead, you are forced to wait for the interpreter startup # and imports to succeed before you are able to effectively setup your own # error handling. # So in short, please make sure you *really* want to do this, otherwise just # stick with the default. import sys import os import win32serviceutil import servicemanager from pipeTestService import TestPipeService class NativeTestPipeService(TestPipeService): _svc_name_ = "PyNativePipeTestService" _svc_display_name_ = "Python Native Pipe Test Service" _svc_description_ = "Tests Python.exe hosted services" # tell win32serviceutil we have a custom executable and custom args # so registration does the right thing. _exe_name_ = sys.executable _exe_args_ = '"' + os.path.abspath(sys.argv[0]) + '"' def main(): if len(sys.argv)==1: # service must be starting... # for the sake of debugging etc, we use win32traceutil to see # any unhandled exceptions and print statements. import win32traceutil print("service is starting...") print("(execute this script with '--help' if that isn't what you want)") servicemanager.Initialize() servicemanager.PrepareToHostSingle(NativeTestPipeService) # Now ask the service manager to fire things up for us... servicemanager.StartServiceCtrlDispatcher() print("service done!") else: win32serviceutil.HandleCommandLine(NativeTestPipeService) if __name__=='__main__': try: main() except (SystemExit, KeyboardInterrupt): raise except: print("Something went bad!") import traceback traceback.print_exc() PK Y03KK$win32/Demos/service/serviceEvents.pyUT  YZx`ux # A Demo of a service that takes advantage of the additional notifications # available in later Windows versions. # Note that all output is written as event log entries - so you must install # and start the service, then look at the event log for messages as events # are generated. # Events are generated for USB device insertion and removal, power state # changes and hardware profile events - so try putting your computer to # sleep and waking it, inserting a memory stick, etc then check the event log import win32serviceutil, win32service import win32event import servicemanager # Most event notification support lives around win32gui import win32gui, win32gui_struct, win32con GUID_DEVINTERFACE_USB_DEVICE = "{A5DCBF10-6530-11D2-901F-00C04FB951ED}" class EventDemoService(win32serviceutil.ServiceFramework): _svc_name_ = "PyServiceEventDemo" _svc_display_name_ = "Python Service Event Demo" _svc_description_ = "Demonstrates a Python service which takes advantage of the extra notifications" def __init__(self, args): win32serviceutil.ServiceFramework.__init__(self, args) self.hWaitStop = win32event.CreateEvent(None, 0, 0, None) # register for a device notification - we pass our service handle # instead of a window handle. filter = win32gui_struct.PackDEV_BROADCAST_DEVICEINTERFACE( GUID_DEVINTERFACE_USB_DEVICE) self.hdn = win32gui.RegisterDeviceNotification(self.ssh, filter, win32con.DEVICE_NOTIFY_SERVICE_HANDLE) # Override the base class so we can accept additional events. def GetAcceptedControls(self): # say we accept them all. rc = win32serviceutil.ServiceFramework.GetAcceptedControls(self) rc |= win32service.SERVICE_ACCEPT_PARAMCHANGE \ | win32service.SERVICE_ACCEPT_NETBINDCHANGE \ | win32service.SERVICE_CONTROL_DEVICEEVENT \ | win32service.SERVICE_ACCEPT_HARDWAREPROFILECHANGE \ | win32service.SERVICE_ACCEPT_POWEREVENT \ | win32service.SERVICE_ACCEPT_SESSIONCHANGE return rc # All extra events are sent via SvcOtherEx (SvcOther remains as a # function taking only the first args for backwards compat) def SvcOtherEx(self, control, event_type, data): # This is only showing a few of the extra events - see the MSDN # docs for "HandlerEx callback" for more info. if control == win32service.SERVICE_CONTROL_DEVICEEVENT: info = win32gui_struct.UnpackDEV_BROADCAST(data) msg = "A device event occurred: %x - %s" % (event_type, info) elif control == win32service.SERVICE_CONTROL_HARDWAREPROFILECHANGE: msg = "A hardware profile changed: type=%s, data=%s" % (event_type, data) elif control == win32service.SERVICE_CONTROL_POWEREVENT: msg = "A power event: setting %s" % data elif control == win32service.SERVICE_CONTROL_SESSIONCHANGE: # data is a single elt tuple, but this could potentially grow # in the future if the win32 struct does msg = "Session event: type=%s, data=%s" % (event_type, data) else: msg = "Other event: code=%d, type=%s, data=%s" \ % (control, event_type, data) servicemanager.LogMsg( servicemanager.EVENTLOG_INFORMATION_TYPE, 0xF000, # generic message (msg, '') ) def SvcStop(self): self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) win32event.SetEvent(self.hWaitStop) def SvcDoRun(self): # do nothing at all - just wait to be stopped win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE) # Write a stop message. servicemanager.LogMsg( servicemanager.EVENTLOG_INFORMATION_TYPE, servicemanager.PYS_SERVICE_STOPPED, (self._svc_name_, '') ) if __name__=='__main__': win32serviceutil.HandleCommandLine(EventDemoService) PK ѳP_Y&&,win32/Demos/service/pipeTestServiceClient.pyUT l_Zx`ux # A Test Program for pipeTestService.py # # Install and start the Pipe Test service, then run this test # either from the same machine, or from another using the "-s" param. # # Eg: pipeTestServiceClient.py -s server_name Hi There # Should work. from win32pipe import * from win32file import * from win32event import * import pywintypes import win32api import winerror import sys, os, traceback verbose = 0 #def ReadFromPipe(pipeName): # Could (Should?) use CallNamedPipe, but this technique allows variable size # messages (whereas you must supply a buffer size for CallNamedPipe! # hPipe = CreateFile(pipeName, GENERIC_WRITE, 0, None, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0) # more = 1 # while more: # hr = ReadFile(hPipe, 256) # if hr==0: # more = 0 # except win32api.error (hr, fn, desc): # if hr==winerror.ERROR_MORE_DATA: # data = dat # def CallPipe(fn, args): ret = None retryCount = 0 while retryCount < 8: # Keep looping until user cancels. retryCount = retryCount + 1 try: return fn(*args) except win32api.error as exc: if exc.winerror==winerror.ERROR_PIPE_BUSY: win32api.Sleep(5000) continue else: raise raise RuntimeError("Could not make a connection to the server") def testClient(server,msg): if verbose: print("Sending", msg) data = CallPipe(CallNamedPipe, ("\\\\%s\\pipe\\PyPipeTest" % server, msg, 256, NMPWAIT_WAIT_FOREVER)) if verbose: print("Server sent back '%s'" % data) print("Sent and received a message!") def testLargeMessage(server, size = 4096): if verbose: print("Sending message of size %d" % (size)) msg = "*" * size data = CallPipe(CallNamedPipe, ("\\\\%s\\pipe\\PyPipeTest" % server, msg, 512, NMPWAIT_WAIT_FOREVER)) if len(data)-size: print("Sizes are all wrong - send %d, got back %d" % (size, len(data))) def stressThread(server, numMessages, wait): try: try: for i in range(numMessages): r = CallPipe(CallNamedPipe, ("\\\\%s\\pipe\\PyPipeTest" % server, "#" * 512, 1024, NMPWAIT_WAIT_FOREVER)) except: traceback.print_exc() print("Failed after %d messages" % i) finally: SetEvent(wait) def stressTestClient(server, numThreads, numMessages): import _thread thread_waits = [] for t_num in range(numThreads): # Note I could just wait on thread handles (after calling DuplicateHandle) # See the service itself for an example of waiting for the clients... wait = CreateEvent(None, 0, 0, None) thread_waits.append(wait) _thread.start_new_thread(stressThread, (server,numMessages, wait)) # Wait for all threads to finish. WaitForMultipleObjects(thread_waits, 1, INFINITE) def main(): import sys, getopt server = "." thread_count = 0 msg_count = 500 try: opts, args = getopt.getopt(sys.argv[1:], 's:t:m:vl') for o,a in opts: if o=='-s': server = a if o=='-m': msg_count = int(a) if o=='-t': thread_count = int(a) if o=='-v': global verbose verbose = 1 if o=='-l': testLargeMessage(server) msg = " ".join(args).encode("mbcs") except getopt.error as msg: print(msg) my_name = os.path.split(sys.argv[0])[1] print("Usage: %s [-v] [-s server] [-t thread_count=0] [-m msg_count=500] msg ..." % my_name) print(" -v = verbose") print(" Specifying a value for -t will stress test using that many threads.") return testClient(server, msg) if thread_count > 0: print("Spawning %d threads each sending %d messages..." % (thread_count, msg_count)) stressTestClient(server, thread_count, msg_count) if __name__=='__main__': main() PK ѳPӕ?*win32/Demos/win32ts_logoff_disconnected.pyUT l_Zx`ux """ Finds any disconnected terminal service sessions and logs them off""" import win32ts import pywintypes import winerror sessions=win32ts.WTSEnumerateSessions(win32ts.WTS_CURRENT_SERVER_HANDLE) for session in sessions: """ WTS_CONNECTSTATE_CLASS: WTSActive,WTSConnected,WTSConnectQuery,WTSShadow,WTSDisconnected, WTSIdle,WTSListen,WTSReset,WTSDown,WTSInit """ if session['State']==win32ts.WTSDisconnected: sessionid=session['SessionId'] username=win32ts.WTSQuerySessionInformation(win32ts.WTS_CURRENT_SERVER_HANDLE, sessionid, win32ts.WTSUserName) print('Logging off disconnected user:',username) try: win32ts.WTSLogoffSession(win32ts.WTS_CURRENT_SERVER_HANDLE, sessionid, True) except pywintypes.error as e: if e.winerror == winerror.ERROR_ACCESS_DENIED: print("Can't kill that session:", e.strerror) else: raise PK ѳP@+win32/Demos/timer_demo.pyUT l_Zx`ux # -*- Mode: Python; tab-width: 4 -*- # # This module, and the timer.pyd core timer support, were written by # Sam Rushing (rushing@nightmare.com) import timer import time # Timers are based on Windows messages. So we need # to do the event-loop thing! import win32event, win32gui # glork holds a simple counter for us. class glork: def __init__ (self, delay=1000, max=10): self.x = 0 self.max = max self.id = timer.set_timer (delay, self.increment) # Could use the threading module, but this is # a win32 extension test after all! :-) self.event = win32event.CreateEvent(None, 0, 0, None) def increment (self, id, time): print('x = %d' % self.x) self.x = self.x + 1 # if we've reached the max count, # kill off the timer. if self.x > self.max: # we could have used 'self.id' here, too timer.kill_timer (id) win32event.SetEvent(self.event) # create a counter that will count from '1' thru '10', incrementing # once a second, and then stop. def demo (delay=1000, stop=10): g = glork(delay, stop) # Timers are message based - so we need # To run a message loop while waiting for our timers # to expire. start_time = time.time() while 1: # We can't simply give a timeout of 30 seconds, as # we may continouusly be recieving other input messages, # and therefore never expire. rc = win32event.MsgWaitForMultipleObjects( (g.event,), # list of objects 0, # wait all 500, # timeout win32event.QS_ALLEVENTS, # type of input ) if rc == win32event.WAIT_OBJECT_0: # Event signalled. break elif rc == win32event.WAIT_OBJECT_0+1: # Message waiting. if win32gui.PumpWaitingMessages(): raise RuntimeError("We got an unexpected WM_QUIT message!") else: # This wait timed-out. if time.time()-start_time > 30: raise RuntimeError("We timed out waiting for the timers to expire!") if __name__=='__main__': demo() PK ѳP 99win32/Demos/win32gui_dialog.pyUT l_Zx`ux # A demo of a fairly complex dialog. # # Features: # * Uses a "dynamic dialog resource" to build the dialog. # * Uses a ListView control. # * Dynamically resizes content. # * Uses a second worker thread to fill the list. # * Demostrates support for windows XP themes. # If you are on Windows XP, and specify a '--noxp' argument, you will see: # * alpha-blend issues with icons # * The buttons are "old" style, rather than based on the XP theme. # Hence, using: # import winxpgui as win32gui # is recommened. # Please report any problems. import sys if "--noxp" in sys.argv: import win32gui else: import winxpgui as win32gui import win32gui_struct import win32api import win32con, winerror import struct, array import commctrl import queue import os IDC_SEARCHTEXT = 1024 IDC_BUTTON_SEARCH = 1025 IDC_BUTTON_DISPLAY = 1026 IDC_LISTBOX = 1027 WM_SEARCH_RESULT = win32con.WM_USER + 512 WM_SEARCH_FINISHED = win32con.WM_USER + 513 class _WIN32MASKEDSTRUCT: def __init__(self, **kw): full_fmt = "" for name, fmt, default, mask in self._struct_items_: self.__dict__[name] = None if fmt == "z": full_fmt += "pi" else: full_fmt += fmt for name, val in kw.items(): if name not in self.__dict__: raise ValueError("LVITEM structures do not have an item '%s'" % (name,)) self.__dict__[name] = val def __setattr__(self, attr, val): if not attr.startswith("_") and attr not in self.__dict__: raise AttributeError(attr) self.__dict__[attr] = val def toparam(self): self._buffs = [] full_fmt = "" vals = [] mask = 0 # calc the mask for name, fmt, default, this_mask in self._struct_items_: if this_mask is not None and self.__dict__.get(name) is not None: mask |= this_mask self.mask = mask for name, fmt, default, this_mask in self._struct_items_: val = self.__dict__[name] if fmt == "z": fmt = "Pi" if val is None: vals.append(0) vals.append(0) else: # Note this demo still works with byte strings. An # alternate strategy would be to use unicode natively # and use the 'W' version of the messages - eg, # LVM_SETITEMW etc. val = val + "\0" if isinstance(val, str): val = val.encode("mbcs") str_buf = array.array("b", val) vals.append(str_buf.buffer_info()[0]) vals.append(len(val)) self._buffs.append(str_buf) # keep alive during the call. else: if val is None: val = default vals.append(val) full_fmt += fmt return struct.pack(*(full_fmt,) + tuple(vals)) # NOTE: See the win32gui_struct module for an alternative way of dealing # with these structures class LVITEM(_WIN32MASKEDSTRUCT): _struct_items_ = [ ("mask", "I", 0, None), ("iItem", "i", 0, None), ("iSubItem", "i", 0, None), ("state", "I", 0, commctrl.LVIF_STATE), ("stateMask", "I", 0, None), ("text", "z", None, commctrl.LVIF_TEXT), ("iImage", "i", 0, commctrl.LVIF_IMAGE), ("lParam", "i", 0, commctrl.LVIF_PARAM), ("iIdent", "i", 0, None), ] class LVCOLUMN(_WIN32MASKEDSTRUCT): _struct_items_ = [ ("mask", "I", 0, None), ("fmt", "i", 0, commctrl.LVCF_FMT), ("cx", "i", 0, commctrl.LVCF_WIDTH), ("text", "z", None, commctrl.LVCF_TEXT), ("iSubItem", "i", 0, commctrl.LVCF_SUBITEM), ("iImage", "i", 0, commctrl.LVCF_IMAGE), ("iOrder", "i", 0, commctrl.LVCF_ORDER), ] class DemoWindowBase: def __init__(self): win32gui.InitCommonControls() self.hinst = win32gui.dllhandle self.list_data = {} def _RegisterWndClass(self): className = "PythonDocSearch" message_map = {} wc = win32gui.WNDCLASS() wc.SetDialogProc() # Make it a dialog class. wc.hInstance = self.hinst wc.lpszClassName = className wc.style = win32con.CS_VREDRAW | win32con.CS_HREDRAW wc.hCursor = win32gui.LoadCursor( 0, win32con.IDC_ARROW ) wc.hbrBackground = win32con.COLOR_WINDOW + 1 wc.lpfnWndProc = message_map # could also specify a wndproc. # C code: wc.cbWndExtra = DLGWINDOWEXTRA + sizeof(HBRUSH) + (sizeof(COLORREF)); wc.cbWndExtra = win32con.DLGWINDOWEXTRA + struct.calcsize("Pi") icon_flags = win32con.LR_LOADFROMFILE | win32con.LR_DEFAULTSIZE ## py.ico went away in python 2.5, load from executable instead this_app=win32api.GetModuleHandle(None) try: wc.hIcon=win32gui.LoadIcon(this_app, 1) ## python.exe and pythonw.exe except win32gui.error: wc.hIcon=win32gui.LoadIcon(this_app, 135) ## pythonwin's icon try: classAtom = win32gui.RegisterClass(wc) except win32gui.error as err_info: if err_info.winerror!=winerror.ERROR_CLASS_ALREADY_EXISTS: raise return className def _GetDialogTemplate(self, dlgClassName): style = win32con.WS_THICKFRAME | win32con.WS_POPUP | win32con.WS_VISIBLE | win32con.WS_CAPTION | win32con.WS_SYSMENU | win32con.DS_SETFONT | win32con.WS_MINIMIZEBOX cs = win32con.WS_CHILD | win32con.WS_VISIBLE title = "Dynamic Dialog Demo" # Window frame and title dlg = [ [title, (0, 0, 210, 250), style, None, (8, "MS Sans Serif"), None, dlgClassName], ] # ID label and text box dlg.append([130, "Enter something", -1, (5, 5, 200, 9), cs | win32con.SS_LEFT]) s = cs | win32con.WS_TABSTOP | win32con.WS_BORDER dlg.append(['EDIT', None, IDC_SEARCHTEXT, (5, 15, 200, 12), s]) # Search/Display Buttons # (x positions don't matter here) s = cs | win32con.WS_TABSTOP dlg.append([128, "Fill List", IDC_BUTTON_SEARCH, (5, 35, 50, 14), s | win32con.BS_DEFPUSHBUTTON]) s = win32con.BS_PUSHBUTTON | s dlg.append([128, "Display", IDC_BUTTON_DISPLAY, (100, 35, 50, 14), s]) # List control. # Can't make this work :( ## s = cs | win32con.WS_TABSTOP ## dlg.append(['SysListView32', "Title", IDC_LISTBOX, (5, 505, 200, 200), s]) return dlg def _DoCreate(self, fn): message_map = { win32con.WM_SIZE: self.OnSize, win32con.WM_COMMAND: self.OnCommand, win32con.WM_NOTIFY: self.OnNotify, win32con.WM_INITDIALOG: self.OnInitDialog, win32con.WM_CLOSE: self.OnClose, win32con.WM_DESTROY: self.OnDestroy, WM_SEARCH_RESULT: self.OnSearchResult, WM_SEARCH_FINISHED: self.OnSearchFinished, } dlgClassName = self._RegisterWndClass() template = self._GetDialogTemplate(dlgClassName) return fn(self.hinst, template, 0, message_map) def _SetupList(self): child_style = win32con.WS_CHILD | win32con.WS_VISIBLE | win32con.WS_BORDER | win32con.WS_HSCROLL | win32con.WS_VSCROLL child_style |= commctrl.LVS_SINGLESEL | commctrl.LVS_SHOWSELALWAYS | commctrl.LVS_REPORT self.hwndList = win32gui.CreateWindow("SysListView32", None, child_style, 0, 0, 100, 100, self.hwnd, IDC_LISTBOX, self.hinst, None) child_ex_style = win32gui.SendMessage(self.hwndList, commctrl.LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0) child_ex_style |= commctrl.LVS_EX_FULLROWSELECT win32gui.SendMessage(self.hwndList, commctrl.LVM_SETEXTENDEDLISTVIEWSTYLE, 0, child_ex_style) # Add an image list - use the builtin shell folder icon - this # demonstrates the problem with alpha-blending of icons on XP if # winxpgui is not used in place of win32gui. il = win32gui.ImageList_Create( win32api.GetSystemMetrics(win32con.SM_CXSMICON), win32api.GetSystemMetrics(win32con.SM_CYSMICON), commctrl.ILC_COLOR32 | commctrl.ILC_MASK, 1, # initial size 0) # cGrow shell_dll = os.path.join(win32api.GetSystemDirectory(), "shell32.dll") large, small = win32gui.ExtractIconEx(shell_dll, 4, 1) win32gui.ImageList_ReplaceIcon(il, -1, small[0]) win32gui.DestroyIcon(small[0]) win32gui.DestroyIcon(large[0]) win32gui.SendMessage(self.hwndList, commctrl.LVM_SETIMAGELIST, commctrl.LVSIL_SMALL, il) # Setup the list control columns. lvc = LVCOLUMN(mask = commctrl.LVCF_FMT | commctrl.LVCF_WIDTH | commctrl.LVCF_TEXT | commctrl.LVCF_SUBITEM) lvc.fmt = commctrl.LVCFMT_LEFT lvc.iSubItem = 1 lvc.text = "Title" lvc.cx = 200 win32gui.SendMessage(self.hwndList, commctrl.LVM_INSERTCOLUMN, 0, lvc.toparam()) lvc.iSubItem = 0 lvc.text = "Order" lvc.cx = 50 win32gui.SendMessage(self.hwndList, commctrl.LVM_INSERTCOLUMN, 0, lvc.toparam()) win32gui.UpdateWindow(self.hwnd) def ClearListItems(self): win32gui.SendMessage(self.hwndList, commctrl.LVM_DELETEALLITEMS) self.list_data = {} def AddListItem(self, data, *columns): num_items = win32gui.SendMessage(self.hwndList, commctrl.LVM_GETITEMCOUNT) item = LVITEM(text=columns[0], iItem = num_items) new_index = win32gui.SendMessage(self.hwndList, commctrl.LVM_INSERTITEM, 0, item.toparam()) col_no = 1 for col in columns[1:]: item = LVITEM(text=col, iItem = new_index, iSubItem = col_no) win32gui.SendMessage(self.hwndList, commctrl.LVM_SETITEM, 0, item.toparam()) col_no += 1 self.list_data[new_index] = data def OnInitDialog(self, hwnd, msg, wparam, lparam): self.hwnd = hwnd # centre the dialog desktop = win32gui.GetDesktopWindow() l,t,r,b = win32gui.GetWindowRect(self.hwnd) dt_l, dt_t, dt_r, dt_b = win32gui.GetWindowRect(desktop) centre_x, centre_y = win32gui.ClientToScreen( desktop, ( (dt_r-dt_l)//2, (dt_b-dt_t)//2) ) win32gui.MoveWindow(hwnd, centre_x-(r//2), centre_y-(b//2), r-l, b-t, 0) self._SetupList() l,t,r,b = win32gui.GetClientRect(self.hwnd) self._DoSize(r-l,b-t, 1) def _DoSize(self, cx, cy, repaint = 1): # right-justify the textbox. ctrl = win32gui.GetDlgItem(self.hwnd, IDC_SEARCHTEXT) l, t, r, b = win32gui.GetWindowRect(ctrl) l, t = win32gui.ScreenToClient(self.hwnd, (l,t) ) r, b = win32gui.ScreenToClient(self.hwnd, (r,b) ) win32gui.MoveWindow(ctrl, l, t, cx-l-5, b-t, repaint) # The button. ctrl = win32gui.GetDlgItem(self.hwnd, IDC_BUTTON_DISPLAY) l, t, r, b = win32gui.GetWindowRect(ctrl) l, t = win32gui.ScreenToClient(self.hwnd, (l,t) ) r, b = win32gui.ScreenToClient(self.hwnd, (r,b) ) list_y = b + 10 w = r - l win32gui.MoveWindow(ctrl, cx - 5 - w, t, w, b-t, repaint) # The list control win32gui.MoveWindow(self.hwndList, 0, list_y, cx, cy-list_y, repaint) # The last column of the list control. new_width = cx - win32gui.SendMessage(self.hwndList, commctrl.LVM_GETCOLUMNWIDTH, 0) win32gui.SendMessage(self.hwndList, commctrl.LVM_SETCOLUMNWIDTH, 1, new_width) def OnSize(self, hwnd, msg, wparam, lparam): x = win32api.LOWORD(lparam) y = win32api.HIWORD(lparam) self._DoSize(x,y) return 1 def OnSearchResult(self, hwnd, msg, wparam, lparam): try: while 1: params = self.result_queue.get(0) self.AddListItem(*params) except queue.Empty: pass def OnSearchFinished(self, hwnd, msg, wparam, lparam): print("OnSearchFinished") def OnNotify(self, hwnd, msg, wparam, lparam): info = win32gui_struct.UnpackNMITEMACTIVATE(lparam) if info.code == commctrl.NM_DBLCLK: print("Double click on item", info.iItem+1) return 1 def OnCommand(self, hwnd, msg, wparam, lparam): id = win32api.LOWORD(wparam) if id == IDC_BUTTON_SEARCH: self.ClearListItems() def fill_slowly(q, hwnd): import time for i in range(20): q.put(("whatever", str(i+1), "Search result " + str(i) )) win32gui.PostMessage(hwnd, WM_SEARCH_RESULT, 0, 0) time.sleep(.25) win32gui.PostMessage(hwnd, WM_SEARCH_FINISHED, 0, 0) import threading self.result_queue = queue.Queue() thread = threading.Thread(target = fill_slowly, args=(self.result_queue, self.hwnd) ) thread.start() elif id == IDC_BUTTON_DISPLAY: print("Display button selected") sel = win32gui.SendMessage(self.hwndList, commctrl.LVM_GETNEXTITEM, -1, commctrl.LVNI_SELECTED) print("The selected item is", sel+1) # These function differ based on how the window is used, so may be overridden def OnClose(self, hwnd, msg, wparam, lparam): raise NotImplementedError def OnDestroy(self, hwnd, msg, wparam, lparam): pass # An implementation suitable for use with the Win32 Window functions (ie, not # a true dialog) class DemoWindow(DemoWindowBase): def CreateWindow(self): # Create the window via CreateDialogBoxIndirect - it can then # work as a "normal" window, once a message loop is established. self._DoCreate(win32gui.CreateDialogIndirect) def OnClose(self, hwnd, msg, wparam, lparam): win32gui.DestroyWindow(hwnd) # We need to arrange to a WM_QUIT message to be sent to our # PumpMessages() loop. def OnDestroy(self, hwnd, msg, wparam, lparam): win32gui.PostQuitMessage(0) # Terminate the app. # An implementation suitable for use with the Win32 Dialog functions. class DemoDialog(DemoWindowBase): def DoModal(self): return self._DoCreate(win32gui.DialogBoxIndirect) def OnClose(self, hwnd, msg, wparam, lparam): win32gui.EndDialog(hwnd, 0) def DemoModal(): w=DemoDialog() w.DoModal() def DemoCreateWindow(): w=DemoWindow() w.CreateWindow() # PumpMessages runs until PostQuitMessage() is called by someone. win32gui.PumpMessages() if __name__=='__main__': DemoModal() DemoCreateWindow() PK ѳPbZvKwin32/Demos/win32fileDemo.pyUT l_Zx`ux # This is a "demo" of win32file - it used to be more a test case than a # demo, so has been moved to the test directory. # Please contribute your favourite simple little demo. import win32file, win32api, win32con import os # A very simple demo - note that this does no more than you can do with # builtin Python file objects, so for something as simple as this, you # generally *should* use builtin Python objects. Only use win32file etc # when you need win32 specific features not available in Python. def SimpleFileDemo(): testName = os.path.join( win32api.GetTempPath(), "win32file_demo_test_file") if os.path.exists(testName): os.unlink(testName) # Open the file for writing. handle = win32file.CreateFile(testName, win32file.GENERIC_WRITE, 0, None, win32con.CREATE_NEW, 0, None) test_data = "Hello\0there".encode("ascii") win32file.WriteFile(handle, test_data) handle.Close() # Open it for reading. handle = win32file.CreateFile(testName, win32file.GENERIC_READ, 0, None, win32con.OPEN_EXISTING, 0, None) rc, data = win32file.ReadFile(handle, 1024) handle.Close() if data == test_data: print("Successfully wrote and read a file") else: raise Exception("Got different data back???") os.unlink(testName) if __name__=='__main__': SimpleFileDemo() PK P/Q Q win32/Demos/EvtFormatMessage.pyUT ^Zx`ux import sys import win32evtlog def main(): path = 'System' num_events = 5 if len(sys.argv) > 2: path = sys.argv[1] num_events = int(sys.argv[2]) elif len(sys.argv) > 1: path = sys.argv[1] query = win32evtlog.EvtQuery(path, win32evtlog.EvtQueryForwardDirection) events = win32evtlog.EvtNext(query, num_events) context = win32evtlog.EvtCreateRenderContext(win32evtlog.EvtRenderContextSystem) for i, event in enumerate(events, 1): result = win32evtlog.EvtRender(event, win32evtlog.EvtRenderEventValues, Context=context) print('Event {}'.format(i)) level_value, level_variant = result[win32evtlog.EvtSystemLevel] if level_variant != win32evtlog.EvtVarTypeNull: if level_value == 1: print(' Level: CRITICAL') elif level_value == 2: print(' Level: ERROR') elif level_value == 3: print(' Level: WARNING') elif level_value == 4: print(' Level: INFO') elif level_value == 5: print(' Level: VERBOSE') else: print(' Level: UNKNOWN') time_created_value, time_created_variant = result[win32evtlog.EvtSystemTimeCreated] if time_created_variant != win32evtlog.EvtVarTypeNull: print(' Timestamp: {}'.format(time_created_value.isoformat())) computer_value, computer_variant = result[win32evtlog.EvtSystemComputer] if computer_variant != win32evtlog.EvtVarTypeNull: print(' FQDN: {}'.format(computer_value)) provider_name_value, provider_name_variant = result[win32evtlog.EvtSystemProviderName] if provider_name_variant != win32evtlog.EvtVarTypeNull: print(' Provider: {}'.format(provider_name_value)) try: metadata = win32evtlog.EvtOpenPublisherMetadata(provider_name_value) # pywintypes.error: (2, 'EvtOpenPublisherMetadata', 'The system cannot find the file specified.') except Exception: pass else: try: message = win32evtlog.EvtFormatMessage(metadata, event, win32evtlog.EvtFormatMessageEvent) # pywintypes.error: (15027, 'EvtFormatMessage: allocated 0, need buffer of size 0', 'The message resource is present but the message was not found in the message table.') except Exception: pass else: print(' Message: {}'.format(message)) if __name__=='__main__': main() PK ѳPJ2!22win32/Demos/CopyFileEx.pyUT l_Zx`ux import win32file, win32api import os def ProgressRoutine(TotalFileSize, TotalBytesTransferred, StreamSize, StreamBytesTransferred, StreamNumber, CallbackReason, SourceFile, DestinationFile, Data): print(Data) print(TotalFileSize, TotalBytesTransferred, StreamSize, StreamBytesTransferred, StreamNumber, CallbackReason, SourceFile, DestinationFile) ##if TotalBytesTransferred > 100000: ## return win32file.PROGRESS_STOP return win32file.PROGRESS_CONTINUE temp_dir=win32api.GetTempPath() fsrc=win32api.GetTempFileName(temp_dir,'cfe')[0] fdst=win32api.GetTempFileName(temp_dir,'cfe')[0] print(fsrc, fdst) f=open(fsrc,'w') f.write('xxxxxxxxxxxxxxxx\n'*32768) f.close() ## add a couple of extra data streams f=open(fsrc+':stream_y','w') f.write('yyyyyyyyyyyyyyyy\n'*32768) f.close() f=open(fsrc+':stream_z','w') f.write('zzzzzzzzzzzzzzzz\n'*32768) f.close() operation_desc='Copying '+fsrc+' to '+fdst win32file.CopyFileEx(fsrc, fdst, ProgressRoutine, Data=operation_desc, Cancel=False, CopyFlags=win32file.COPY_FILE_RESTARTABLE, Transaction=None) PK ѳPqEE$win32/Demos/win32gui_devicenotify.pyUT l_Zx`ux # Demo RegisterDeviceNotification etc. Creates a hidden window to receive # notifications. See serviceEvents.py for an example of a service doing # that. import sys, time import win32gui, win32con, win32api, win32file import win32gui_struct, winnt # These device GUIDs are from Ioevent.h in the Windows SDK. Ideally they # could be collected somewhere for pywin32... GUID_DEVINTERFACE_USB_DEVICE = "{A5DCBF10-6530-11D2-901F-00C04FB951ED}" # WM_DEVICECHANGE message handler. def OnDeviceChange(hwnd, msg, wp, lp): # Unpack the 'lp' into the appropriate DEV_BROADCAST_* structure, # using the self-identifying data inside the DEV_BROADCAST_HDR. info = win32gui_struct.UnpackDEV_BROADCAST(lp) print("Device change notification:", wp, str(info)) if wp==win32con.DBT_DEVICEQUERYREMOVE and info.devicetype==win32con.DBT_DEVTYP_HANDLE: # Our handle is stored away in the structure - just close it print("Device being removed - closing handle") win32file.CloseHandle(info.handle) # and cancel our notifications - if it gets plugged back in we get # the same notification and try and close the same handle... win32gui.UnregisterDeviceNotification(info.hdevnotify) return True def TestDeviceNotifications(dir_names): wc = win32gui.WNDCLASS() wc.lpszClassName = 'test_devicenotify' wc.style = win32con.CS_GLOBALCLASS|win32con.CS_VREDRAW | win32con.CS_HREDRAW wc.hbrBackground = win32con.COLOR_WINDOW+1 wc.lpfnWndProc={win32con.WM_DEVICECHANGE:OnDeviceChange} class_atom=win32gui.RegisterClass(wc) hwnd = win32gui.CreateWindow(wc.lpszClassName, 'Testing some devices', # no need for it to be visible. win32con.WS_CAPTION, 100,100,900,900, 0, 0, 0, None) hdevs = [] # Watch for all USB device notifications filter = win32gui_struct.PackDEV_BROADCAST_DEVICEINTERFACE( GUID_DEVINTERFACE_USB_DEVICE) hdev = win32gui.RegisterDeviceNotification(hwnd, filter, win32con.DEVICE_NOTIFY_WINDOW_HANDLE) hdevs.append(hdev) # and create handles for all specified directories for d in dir_names: hdir = win32file.CreateFile(d, winnt.FILE_LIST_DIRECTORY, winnt.FILE_SHARE_READ | winnt.FILE_SHARE_WRITE | winnt.FILE_SHARE_DELETE, None, # security attributes win32con.OPEN_EXISTING, win32con.FILE_FLAG_BACKUP_SEMANTICS | # required privileges: SE_BACKUP_NAME and SE_RESTORE_NAME. win32con.FILE_FLAG_OVERLAPPED, None) filter = win32gui_struct.PackDEV_BROADCAST_HANDLE(hdir) hdev = win32gui.RegisterDeviceNotification(hwnd, filter, win32con.DEVICE_NOTIFY_WINDOW_HANDLE) hdevs.append(hdev) # now start a message pump and wait for messages to be delivered. print("Watching", len(hdevs), "handles - press Ctrl+C to terminate, or") print("add and remove some USB devices...") if not dir_names: print("(Note you can also pass paths to watch on the command-line - eg,") print("pass the root of an inserted USB stick to see events specific to") print("that volume)") while 1: win32gui.PumpWaitingMessages() time.sleep(0.01) win32gui.DestroyWindow(hwnd) win32gui.UnregisterClass(wc.lpszClassName, None) if __name__=='__main__': # optionally pass device/directory names to watch for notifications. # Eg, plug in a USB device - assume it connects as E: - then execute: # % win32gui_devicenotify.py E: # Then remove and insert the device. TestDeviceNotifications(sys.argv[1:]) PK /$nQ{..win32/_win32sysloader.pydUT ^_ux MZ@ !L!This program cannot be run in DOS mode. $_aS===x= ^<=hb<= ^>= ^8= ^9=f<=<8=۱^8=۱^==۱^?=Rich=PEL^_! 0;@@5`5d`lp`1T1@0.text `.rdata 0 @@.data@"@.gfidsP$@@.rsrcl`&@@.relocp*@BD$́ $$P50@;$0; u 4$0;u0;0; hL$QP0;t؍L$Qfffu+ʍD$QP0; ́ $$P54@;$0; u 4$0;u0;0; hL$QP0;t؍L$Qfffu+ʍD$QP0; hh8@;0;%0;%0;%0;UE t3t tt3@0f@uuY}PY] jh4; jYu3E]e=@;tj@;te^ h;P$Z;?1$0;h0;hYYu)Kt h0;h0;DYY@;2ۈ]EDL>tVYtu ju6 @;3@Y Ê]uYj h4;@;3OH@;tEe=@;tj%%@;EjuYY3ɄutYj h4;|} u9=@;3et t]1]SWuuSWuuSWuduu"uSPuLSVuSVu`tuHSWuout5SWu:$MQ0hv;uu uËe3uEUV5H1;u3@uu u^^] U]U} uuu u ] Ux@;3E]Ux@;j Y+ȋE3x@;]UEM ] P YUEVH<AQAk(;tM ;J r BB ;r (;u3^]ËUEu2]ùMZf9uH<ȁ9PEu f9A]du2dV@;P;t3u2^ð^Ot;P Yt2 jY u2 u  Uu} uuMPuUuu YY]t h@; Y  j Y U}u@;r u2]e u jc Y]U Vutu|;t*u&h@; Yt2Wh@; YDx@;uW@;j Y+ȃ3x@;EEE@;EEuE_^]jVjh5;eMZf9;u]<;;PEuL f9;u>E;+PQgYYt'x$|!EE3Ɂ8ËeE2]U*t}u 3@;]U=@;t} uu u YY]Ux@;3@;uȃu h@; YY#E]Ux@;3@;ȃu] uh@;a YY]UuYH]Ueex@;VWN@;t t Уt@;fEP(0;E3EE$0;1E 0;1EEP0;ME3M3M3;uO@u G ȉ x@;щ t@;_^]U} u=H1;u u,0;3@] h@;00;h@;>Yø@;ø@;HHHHøC;U$SVjtM)3hVP5@; |xffftfpflfhEEDž@jPEVPUE E@EE40;VXۍEEۉE<0;EP80;u !@;^[]UDjDEjP EP 0;EtEj X]3j0;ȅu2øMZf9uA<8PEu f9HuۃxtvՃh6;<0;UE8csmu%xu@= t=!t="t =@t3]̃%@;SV4;4;;sW>t 8׃;r_^[SV4;4;;sW>t ׃;r_^[%0;h;;d5D$l$l$+SVWx@;1E3PeuEEEEdËMd Y__^[]QUuuu uh;hx@;U]U%@;(S3C p@;j me3 p@;3VW@;}S[wOW E؋MEineIE5ntel ȋEj5Genu XjYS[wOW uCE%?=t#=`t=pt=Pt=`t=pu=@;=@;=@;}EEEEE|2jX3S[]؉sKS EܩEEt =@;_^tm p@;@;tUtN3ЉEUEM3Ƀu3u/p@;@;E p@;t @;p@;3[]3@39|@;Ë 0;3;; x@;u(Uj<0;u80;h 0;P0;]U$j,tjY)A; A;A;A;5A;=A;fA;f A;fA;fA;f%A;f-A;A;EA;EA;EA; A;A;@;@; @;@;jXkǀ@;jXk x@;LjX t@;LhL1;]Uj]Uj%tM)A; A;A;A;5A;=A;fA;f A;fA;fA;f%A;f-A;A;EA;EA;EA;A;@;@; @;@;jXkM@;hL1;]U jUtM)A; A;A;A;5A;=A;fA;f A;fA;fA;f%A;f-A;A;EA;EA;EA;A;@;@; @;} v }ue } vE HE E @@;jXkM@;eE@EE;E sEMU @;hL1;]%0;%0;%0;%0;% 0;%$0;%(0;%,0;%00;%40;%80;%<0;% 0;%0;%0;%0;%L0;%H0;%D0;%d0;%h0;%l0;%p0;%t0;%x0;%|0;%0;%`0;%\0;%X0;%T0;ðððð3H8\8,8877*7:7T7j777777788~8999988899<9X9t96666;c:\src\python-3.8\include\object.huuGetModuleFilenameLoadModule_win32sysloaderExists only to load Pywin32 system modules@; A;^_X$2$^_ |2|^_ 2\x@; 2;0;;RSDSv4{A tC:\src\pywin32\build\temp.win32-3.8\Release\_win32sysloader.pdb.text$mn0.idata$50.00cfg0.CRT$XCA0.CRT$XCZ0.CRT$XIA0.CRT$XIZ0.CRT$XPA0.CRT$XPZ0.CRT$XTA0.CRT$XTZ0`.rdata 2.rdata$sxdata$2.rdata$zzzdbg4.rtc$IAA4.rtc$IZZ4.rtc$TAA4.rtc$TZZ4.xdata$x@5`.edata5P.idata$25.idata$36.idata$46H.idata$6@.data@p.bssP.gfids$y;I;;=;;;^_r5h5l5p5P5_win32sysloader.pydPyInit__win32sysloader6606p80H68D0X69T0H8\8,8877*7:7T7j777777788~8999988899<9X9t96666PyUnicode_FromUnicode PyArg_ParseTuplePyModule_Create2_Py_NoneStructpython38.dllpGetModuleFileNameWtGetModuleHandleWLoadLibraryWFQueryPerformanceCounterGetCurrentProcessIdGetCurrentThreadIdGetSystemTimeAsFileTimeDisableThreadLibraryCalls^InitializeSListHeadzIsDebuggerPresentUnhandledExceptionFiltereSetUnhandledExceptionFilterGetStartupInfoWIsProcessorFeaturePresentGetCurrentProcessTerminateProcessKERNEL32.dll%__std_type_info_destroy_listHmemset5_except_handler4_commonVCRUNTIME140.dll8_initterm9_initterm_eA_seh_filter_dll_configure_narrow_argv5_initialize_narrow_environment6_initialize_onexit_table>_register_onexit_function$_execute_onexit_table_crt_atexit_crt_at_quick_exit_cexitjterminateapi-ms-win-crt-runtime-l1-1-0.dll0;;1;;0;0; 1;1;@;DN@6GJ4 0HX`4VS_VERSION_INFO,,?tStringFileInfoP040904E4`$Commentshttps://github.com/mhammond/pywin32"CompanyName*FileDescription4 FileVersion3.8.300.0HInternalName_win32sysloader.pyd&LegalCopyright*LegalTrademarksPOriginalFilename_win32sysloader.pyd0ProductNamePyWin328 ProductVersion3.8.300.0DVarFileInfo$Translation PADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADD\#000G0P0W0o0000000171V1\1f1l1r111 2"232D2I2b2g2t2222233[3m3'4Z44445J6{66666 77C7X7_7e7w77778848N8V8n88888889"979C9O9U9[9g9m999l::::::+;1;y;;;;;;;;K >>>3><>G>N>n>t>z>>>>>>>>>>>>>>>>>>> ??)?9?B?u?{??????????????????? |000E0K0Q0W0]0c0j0q0x00000000000001-141D1J1P1V1\1b1h1n1t1z11111111111111111111110 0L1P111244 55,505@00000040L0P0X0PK 0$nQH{win32/win32evtlog.pydUT ^_ux MZ@ !L!This program cannot be run in DOS mode. $)@͏m!m!m!dY0i!Vo!Vl!Vf!o!yGo!V~!Ch!m!!l!l!\l!l!Richm!PEL^_! |t`x0@XH@Tp@,@.textz| `.rdataw7$jVdVAj7 7؅t/w Sh| ^[_PTh0 ^[3_ÐR!  " / < O b         !!!|!|!|!|!|!|!|!|!|!|!D!|!|!R!UjhdPd% EEPEEP5̑h hȫuu uMd ]VWpuuGVluWh૞_^Md ]jRuEtW̹F3F#u WEM_^d ]Sj4؃u[W|$ f?tMU-VWVS< t uVՃǍPffu+uEtW̹F3F#uW,23uEMd _^]̃$L$P̑PQPhh4t$,t$, uVWpt$t$d3Wl_^ujh|á\\U4SVuWF uPhx03_^[]v4N 3ۃD$,L$49^0= A3ɉD$0L$$"d:$:j4PoPaXPSXPE494-v6 t4$Z$,$,4(P䑞4ىD$8DD$0uEtW̹F3F#u W#M_^d ]Ujh~dPd% EEPEP5̑hhuu uMd ]VWpuu$Vlt]j]/uEtW̹F3F#u W#_^Md ]x=u\_^\Md ]jhШMd _^]̃D$D$PD$ PD$P5̑hh t$4t$4 uVW=p׋D$Pjjt$t$ t$(#VlxztPh0_^St$ ؃u t$ XhL0 [_^Ët$ ׋D$ PSVt$t$$t$,J#Wl3u"VhhS[_^S?S[_^̃ D$PD$ P5̑hht$,t$,u VW=p׋D$Pjjt$t$ !VlxztPh _^ St$ ؃u t$ Xh0 [_^ Ët$ ׋D$ PSVt$t$$?!Wl3u"Vh8S[_^ SS[_^ ̃ D$PD$ P5̑hht$,t$,u VW=p׋D$Pjjt$t$ !VlxztPh_^ St$ ؃u t$ Xh0 [_^ Ët$ ׋D$ PSVt$t$$?!Wl3u"VhܪS[_^ SS[_^ ̃$P5̑hht$$t$$uVWpD$ Pt$ Y Wl_^ujhDt$̃D$D$PD$ PD$PD$P5̑hht$t@A98uE;sVS;r}^_[]U803ʼnESVW(ME$MԋAYNjQ ߋq]yE܉}y}̋} }3}}}}}u$EЉE0EPjWhWm43E ;+Eȋ ЃEuX3EtEЋPVӋ\XtEЋPjӋua3SSuPuNx=\EtEЋPj׋u%EЉEXEPjSh~m4EMLJ;uWDX}tEЋPjӋE39Xt-9Xt(G<<8PEuM9L8u;|84u uȋE4u^uWLuNx5\EtEЋPj֋u%EЉEEPjShm4uE 0XteEPjˉ}uBƋM_^3[]%t%%%%% %%%%% %$%(%,%0%4%8%<%@%D%H%%%%%%%%%|%x%%p%l%h%d%%%%%%쑞%%%葞%䑞%%ܑ%ؑ%ԑ%Б%̑%ȑ%đ%%UuYu}uI%uYt]UuRY]dUEVdt j VYY^]UE t3t tt3@0\6uuY}PY] jh Ȟ jYu3|E]e=tj teT hyF $)5' $hYYu)At h hkYY2ۈ]EDL>tVYtu ju6 3@P Ê]uYj h@Ȟ 3OHjEe=tju%EjuYY3Ʉ ujYj h`Ȟs } u9=3et t]1]SWuuSWuuSWuZuu"uSPuBSVuSVu`tuHSWuout5SWu:$MQ0hOuuu uËe3uE UV5hu3@uu uT ^] U]U} uuu u ] ; 0u Ë 3xUaaEA]UVuX^]aaAUVu% ^]aaA UVFк `PEP7YY^]UEкaaA]AкPYÍAкP YÍAкP YUVFкP EYt j VMYY^]UVFкP EYt j V YY^]UVFкPu EYt j VYY^]U Mh|ȞEPG U MhȞEP* ̋Auغ) U03E]U0j Y+ȋE30]UEM ]! P YUEVH<AQAk(;tM ;J r BB ;r (;u3^]ËUEu2]ùMZf9uH<ȁ9PEu f9A]d u2dVP;t3u2^ð^e t Q P4 Yt2- jYJ u2> u8 . ) U u} uuMPuUuu YY] t h Y  j Y U}u u2] u j Y]U Vutu|Q t*u&h0 Yt2Wh YD0uWj Y+ȃ30EEEEEuE_^]jVjhɞeMZf9u]<PEuL f9u>E+PQgYYt'x$|!EE3Ɂ8ËeE2^U@ t}u 3]U=t} uu5 u- YY]U03uȃu h YY#E]U03ȃu] uh YY]UuYH]Uee0VWN@;t t У,fEP`E3EE\1EX1EEPTME3M3M3;uO@u G ȉ 0щ ,_^]U} u=hu ud3@] hhhcYøøHHHHøDU$SVjtM)3hVP5 |xffftfpflfhEEDž@jPEVP\E E@EElVXۍEEۉEtEPpu !^[]UDjDEjP EP|EtEj X]3jHȅu2øMZf9uA<8PEu f9HuۃxtvՃhtUE8csmu%xu@= t=!t="t =@t3]̃%SV;sW>t 8׃;r_^[SV;sW>t ׃;r_^[%h d5D$l$l$+SVW01E3PeuEEEEdËMd Y__^[]QUuuu uhxh0s]Ujtuph P]U$jtjY)  5= f8f ,fff%f-0E$E(E4p(,  $0jXkǀ4jXk 0LjX ,Lh,]Uj]UjtM)  5= f8f ,fff%f-0E$E(E4(,  $0jXkM4h,]U j#tM)  5= f8f ,fff%f-0E$E(E4(,  $} v }ue } vE HE E @0jXkM4eE@EE;E sEMU 8h,]U%<(S3C @j me3 @3VW<}S[wOW E؋MEineIE5ntel ȋEj5Genu XjYS[wOW uCE%?=t#=`t=pt=Pt=`t=pu=@=@=@}EEEEE|2jX3S[]؉sKS EܩEEt =@_^tm @<tUtN3ЉEUEM3Ƀu3u/@<E @t <@3[]3@39D%x%4%8%<%@%D%H%L%P%T%X%\%`%d%h%l%p%t%|%%%%%%%%%%%%%%%А%%Đ%Ȑ%̐%쐞%Ԑ%ؐ%ܐ%%䐞%萞ðððð3jEPø4ŞOjEPøŞ6jLhz$:HVhxB0dT6"d b6T Tx0EvtOpenPublisherEnumEvtNextPublisherIdBookmarkEvtOpenPublisherMetadataEventEvtGetPublisherMetadataPropertyEvtOpenEventMetadataEnumEvtNextEventMetadataEvtGetEventMetadataPropertyEvtGetLogInfoEvtGetEventInfoEvtGetObjectArraySizeO&O&:EvtUpdateBookmarkEvtGetObjectArrayPropertyEvtOpenChannelPathEvtUpdateBookmarkEvtOpenFilePathEvtExportLogChannelPathEvtExportLogFilePathEvtExportLogTolerateQueryErrorsEvtFormatMessageEventEvtFormatMessageLevelEvtFormatMessageTaskEvtFormatMessageOpcodeEvtFormatMessageKeywordEvtFormatMessageChannelEvtFormatMessageProviderEvtFormatMessageIdEvtFormatMessageXmlEvtSystemProviderNameEvtSystemProviderGuidEvtSystemEventIDEvtSystemQualifiersEvtSystemLevelEvtSystemTaskEvtSystemOpcodeEvtSystemKeywordsEvtSystemTimeCreatedTrying to create a list from an EVT_VARIANT that is not an arrayEvtSystemEventRecordIdEvtSystemActivityIDEvtSystemRelatedActivityIDEvtSystemProcessIDEvtSystemThreadIDEvtSystemChannelEvtSystemComputerEvtSystemUserIDEvtSystemVersionEvtSystemPropertyIdENDEvtQueryChannelPathEvtQueryFilePathEvtQueryForwardDirectionEvtQueryReverseDirectionEvtQueryTolerateQueryErrorsEvtSeekRelativeToFirstEvtSeekRelativeToLastEvtSeekRelativeToCurrentEvtSeekRelativeToBookmarkEvtSeekOriginMaskEvtSeekStrictEvtRenderEventValuesEvtRenderEventXmlEVT_VARIANT_TYPE %d not supported yetEvtRenderBookmarkEvtRenderContextValuesEvtRenderContextSystemEvtRenderContextUserEvtSubscribeToFutureEventsEvtSubscribeStartAtOldestRecordEvtSubscribeStartAfterBookmarkEvtSubscribeOriginMaskEvtSubscribeTolerateQueryErrorsEvtSubscribeStrictEvtSubscribeActionErrorEvtSubscribeActionDeliverEvtVarTypeNullEvtVarTypeStringEvtVarTypeAnsiStringEvtVarTypeSByteEvtVarTypeByteEvtVarTypeInt16EvtVarTypeUInt16EvtVarTypeInt32EvtVarTypeUInt32EvtVarTypeInt64EvtVarTypeUInt64EvtVarTypeSingleEvtVarTypeDoubleEvtVarTypeBooleanEvtVarTypeBinaryEvtVarTypeGuidEvtVarTypeSizeTEvtVarTypeFileTimeEvtVarTypeSysTimeEvtVarTypeSidEvtVarTypeHexInt32EvtVarTypeHexInt64EvtVarTypeEvtHandleEvtVarTypeEvtXmlEvtChannelConfigEnabledEvtChannelConfigIsolationEvtChannelConfigTypeEvtChannelConfigOwningPublisherEvtChannelConfigClassicEventlogEvtChannelConfigAccessEVT_VARIANT_TYPE %d not supported yetEvtChannelLoggingConfigRetentionEvtChannelLoggingConfigAutoBackupNkEvtChannelLoggingConfigMaxSizeEvtChannelLoggingConfigLogFilePathEvtChannelPublishingConfigLevelEvtChannelPublishingConfigKeywordsEvtChannelPublishingConfigControlGuidEvtChannelPublishingConfigBufferSizeEvtChannelPublishingConfigMinBuffersEvtChannelPublishingConfigMaxBuffersChannelConfigEvtChannelPublishingConfigLatencyPropertyIdEvtChannelPublishingConfigClockTypeFlagsEvtChannelPublishingConfigSidTypeEvtChannelPublisherListEvtChannelConfigPropertyIdENDEvtRpcLoginEvtRpcLoginAuthDefaultEvtRpcLoginAuthNegotiateEvtRpcLoginAuthKerberosEvtRpcLoginAuthNTLMEvtPublisherMetadataPublisherGuidEvtPublisherMetadataResourceFilePathEvtPublisherMetadataParameterFilePathEvtPublisherMetadataMessageFilePathEvtPublisherMetadataHelpLinkEvtPublisherMetadataPublisherMessageIDO&i|k:EvtGetChannelConfigPropertyEvtPublisherMetadataChannelReferencesEvtPublisherMetadataChannelReferencePathEvtGetChannelConfigPropertyEvtPublisherMetadataChannelReferenceIndexEvtPublisherMetadataChannelReferenceIDUnable to allocate %d bytesEvtPublisherMetadataChannelReferenceFlagsEvtPublisherMetadataChannelReferenceMessageIDEvtPublisherMetadataLevelsEvtGetChannelConfigPropertyEvtPublisherMetadataLevelNameEvtPublisherMetadataLevelValueEvtPublisherMetadataLevelMessageIDEvtPublisherMetadataTasksEvtPublisherMetadataTaskNameEvtPublisherMetadataTaskEventGuidEvtPublisherMetadataTaskValueEvtPublisherMetadataTaskMessageIDEvtPublisherMetadataOpcodesEvtPublisherMetadataOpcodeNameChannelPathEvtPublisherMetadataOpcodeValueSessionEvtPublisherMetadataOpcodeMessageIDFlagsEvtPublisherMetadataKeywordsEvtPublisherMetadataKeywordNameEvtPublisherMetadataKeywordValueEvtPublisherMetadataKeywordMessageIDEvtPublisherMetadataPropertyIdENDEventMetadataEventIDEventMetadataEventVersionEventMetadataEventChannelO|O&k:EvtOpenChannelConfigEventMetadataEventLevelEventMetadataEventOpcodeEventMetadataEventTaskEventMetadataEventKeywordEventMetadataEventMessageIDEventMetadataEventTemplateEvtOpenChannelConfigEvtEventMetadataPropertyIdENDEvtLogCreationTimeEvtLogLastAccessTimeEvtLogLastWriteTimeEvtLogFileSizeEvtLogAttributesEvtLogNumberOfLogRecordsEvtLogOldestRecordNumberEvtLogFullEvtEventQueryIDsEvtEventPathEvtEventPropertyIdENDPyEVT_RPC_LOGIN must be a tuple instead of %sO|OOOkLoginLoginClassTimeoutFlagsO|ikk:EvtOpenSessionEvtOpenSessionSessionFlags|O&k:EvtOpenPublisherEnumEvtOpenPublisherEnumPublisherEnumO&:EvtNextPublisherIdPyEventLogRecordEvtNextPublisherIdPublisherIdentitySessionLogFilePathLocaleFlagsO|O&Okk:EvtOpenPublisherMetadataEvtOpenPublisherMetadataPublisherMetadataPropertyIdFlagsO&i|k:EvtGetPublisherMetadataPropertyEvtGetPublisherMetadataPropertyUnable to allocate %d bytesEvtGetPublisherMetadataPropertyReservedRecordNumberTimeGeneratedTimeWrittenEventIDEventTypeEventCategoryReservedFlagsClosingRecordNumberPublisherMetadataSourceNameFlagsStringInsertsSidDataComputerNameO&|k:EvtOpenEventMetadataEnumEvtOpenEventMetadataEnumEventMetadataEnumFlagsO&|k:EvtNextEventMetadataEvtNextEventMetadataEventMetadataPropertyIdFlagsO&i|k:EvtGetEventMetadataPropertyEvtGetEventMetadataPropertyUnable to allocate %d bytesEvtGetEventMetadataPropertyLogPropertyIdwin32\src\win32evtlog_swig.cppAllocating EventLogRecord objectwin32\src\win32evtlog_swig.cppO&i:EvtGetLogInfoEvtGetLogInfoUnable to allocate %d bytesEvtGetLogInfoAllocating initial bufferReadEventLogEventPropertyIdO&kk|k:ReadEventLogO&i:EvtGetEventInfoEvtGetEventInfoUnable to allocate %d bytesEvtGetEventInfoObjectArrayO&:EvtGetObjectArraySizeString inserts can contain at most %d stringsEvtGetObjectArraySizeReportEventObjectArrayc:\src\python-3.8\include\object.hPropertyIdArrayIndexFlagsSessionFlags|O&k:EvtOpenChannelEnumEvtOpenChannelEnumO&kk|k:EvtGetObjectArrayPropertyEvtGetObjectArrayPropertyUnable to allocate %d bytesEvtGetObjectArrayPropertyOO:ClearEventLogEvtFormatMessageClearEventLogWEvtFormatMessageMetadataEventFlagsOO:BackupEventLogResourceIdBackupEventLogWO&O&k|k:EvtFormatMessageChannelEnumO:CloseEventLogCloseEventLogO&:EvtNextChannelPathO:DeregisterEventSourceDeregisterEventSourceEvtNextChannelPathPathFlagsOO:NotifyChangeEventLogSessionNotifyChangeEventLogOk|O&:EvtOpenLogEvtOpenLogChannelPathTargetFilePathSessionFlagsO:GetNumberOfEventLogRecordsGetNumberOfEventLogRecordswin32\src\win32evtlog_swig.cppO|OO&k:EvtClearLogEvtClearLogPathTargetFilePathFlagsO:GetOldestEventLogRecordQuerySessionGetOldestEventLogRecordwin32\src\win32evtlog_swig.cppOOk|OO&:EvtExportLogOO:OpenEventLogEvtExportLogOpenEventLogWLogFilePathLocaleSessionFlagsOO:RegisterEventSourceOl|O&k:EvtArchiveExportedLogRegisterEventSourceWEvtArchiveExportedLogOO:OpenBackupEventLogOpenBackupEventLogW:EvtGetExtendedStatusEvtGetExtendedStatusPathFlagsQuerySessionOhhOOOO:ReportEventEvtGetObjectArrayPropertyOl|OO&:EvtQueryEvtGetObjectArraySizeEvtGetEventInfoEvtGetLogInfoEvtGetEventMetadataPropertyEvtNextEventMetadataEvtOpenEventMetadataEnumEvtGetPublisherMetadataPropertyEvtQueryEvtOpenPublisherMetadataEvtNextPublisherIdEvtOpenPublisherEnumEvtOpenSessionEvtOpenChannelConfigEvtGetChannelConfigPropertyEvtUpdateBookmarkEvtCreateBookmarkEvtSubscribeEvtRenderEvtSeekResultSetEvtNextCountEvtQueryTimeoutEvtGetExtendedStatusFlagsEvtArchiveExportedLogEvtExportLogEvtClearLogEvtOpenLogEvtNextChannelPathEvtOpenChannelEnumEvtFormatMessageEvtCreateRenderContextReportEventReadEventLogOpenBackupEventLogRegisterEventSourceOpenEventLogGetOldestEventLogRecordGetNumberOfEventLogRecordsNotifyChangeEventLogDeregisterEventSourceCloseEventLogBackupEventLogClearEventLogO&k|kk:EvtNextEvtNextwin32evtlogwin32\src\win32evtlog_swig.cppResultSetPositionFlagsBookmarkTimeoutO&Lk|O&k:EvtSeekEvtSeekFlagsk:EvtCreateRenderContextEvtCreateRenderContextEvtRender - Invalid render context for EvtRenderEventValuesEvtRenderEvtRenderEventFlagsContextwin32\src\win32evtlog_swig.cppwin32\src\win32evtlog_swig.cppwin32\src\win32evtlog_swig.cppO&k|O&:EvtRenderEvtRenderkOOwin32\src\win32evtlog_swig.cppChannelPathFlagsSignalEventCallbackContextQuerySessionBookmarkOk|O&OOOO&O&:EvtSubscribeUNICODEOOerrorEVENTLOG_FORWARDS_READEVENTLOG_BACKWARDS_READEVENTLOG_SEEK_READEVENTLOG_SEQUENTIAL_READEvtSubscribeEVENTLOG_SUCCESSEVENTLOG_ERROR_TYPEEVENTLOG_WARNING_TYPEEVENTLOG_INFORMATION_TYPEEVENTLOG_AUDIT_SUCCESSEVENTLOG_AUDIT_FAILUREEVENTLOG_START_PAIRED_EVENTEVENTLOG_END_PAIRED_EVENTEVENTLOG_END_ALL_PAIRED_EVENTSEVENTLOG_PAIRED_EVENT_ACTIVEEVENTLOG_PAIRED_EVENT_INACTIVEBookmarkXMLEvtOpenChannelEnumEvtCreateRenderContextEvtFormatMessageEvtNextChannelPath|O:EvtCreateBookmarkEvtOpenLogEvtClearLogEvtOpenSessionEvtExportLogEvtArchiveExportedLogEvtQueryEvtCreateBookmarkEvtNextEvtSeekEvtRenderEvtSubscribeEvtCreateBookmarkEvtUpdateBookmarkEvtGetChannelConfigPropertyEvtOpenChannelConfigEvtOpenSessiongghCloseEventLogPyEVTLOG_HANDLEl0gg hEvtClosePyEVT_HANDLEwevtapi.dllKERNEL32.DLLAcquireSRWLockExclusiveReleaseSRWLockExclusive,u\0zgzUnknown exceptionLygzbad allocationygzbad array new length p^_TLL^_ ^_ HȻ仞H@h@仞@8HP@8仞@м༞輞@м(0@`p|0@`̽|0@ 8Qjˆ4Mfx͉ &Le~RSDSO𧾭@ 'C:\src\pywin32\build\temp.win32-3.8\Release\win32evtlog.pdb.text$di@q.text$mn.text$x.idata$5.00cfg.CRT$XCA.CRT$XCU .CRT$XCZ.CRT$XIA.CRT$XIZ.CRT$XPA.CRT$XPZ .CRT$XTA$ .CRT$XTZ0d).rdata\.rdata$r\.rdata$sxdataLx.rdata$zzzdbg.rtc$IAA.rtc$IZZ.rtc$TAA.rtc$TZZT.xdata$x, .didat$2L .didat$3l.didat$4.didat$6p.didat$7X.edataH.idata$2.idata$3.idata$4X .idata$6H.dataH.data$r,.didat$5.bssL.gfids$y`.rsrc$01`x.rsrc$02"oVpW>t[B)""ž" Ş" ž"ž"Ş"Ş"Ǟ"ž"$ž",ž" @ƞ"XŞ"xǞ" ƞ"4ž"<ž"Dž"Lž"Tž"\ž׉߉lj08@F (.̈Ԉ܈䈞ꈞv"wwxsyȞȞȞ x *yyȞȞȞȞ xt}},lp ".8BRlx $BZp4H\EvtOpenSessionEvtCloseEvtGetExtendedStatusEvtQueryEvtNextEvtSeekEvtSubscribeEvtCreateRenderContextEvtRenderEvtFormatMessageEvtOpenLogEvtGetLogInfoEvtClearLogEvtExportLogEvtArchiveExportedLogEvtOpenChannelEnumEvtNextChannelPathEvtOpenChannelConfigEvtGetChannelConfigPropertyEvtOpenPublisherEnumEvtNextPublisherIdEvtOpenPublisherMetadataEvtGetPublisherMetadataPropertyEvtOpenEventMetadataEnumEvtNextEventMetadataEvtGetEventMetadataPropertyEvtGetObjectArraySizeEvtGetObjectArrayPropertyEvtCreateBookmarkEvtUpdateBookmarkEvtGetEventInfo^_" U2win32evtlog.pydPyInit_win32evtlogV44xĐ0HfVhx&@\rF6$LVn"4Npx >Lhz$:HVhxB0dT6"d b6T TaClearEventLogW;BackupEventLogWdCloseEventLogDeregisterEventSourceNotifyChangeEventLogXGetNumberOfEventLogRecordsYGetOldestEventLogRecordOpenEventLogWRegisterEventSourceWOpenBackupEventLogWZReadEventLogWReportEventWADVAPI32.dlliPyObject_GenericGetAttrkPyObject_GenericSetAttrz_PyTraceMalloc_NewReference_Py_Dealloc.PyBytes_FromStringAndSizePyLong_FromLongPyLong_FromUnsignedLongPyLong_FromSsize_tPyLong_AsUnsignedLongPyLong_AsUnsignedLongMaskPyLong_FromLongLongPyLong_FromUnsignedLongLongPyBool_FromLongOPyFloat_FromDouble=PyTuple_NewPyList_NewPyList_SetItemPyList_AppendPyDict_SetItemStringPyModule_GetDictrPyGILState_EnsuretPyGILState_ReleasePyErr_SetStringPyErr_OccurredPyErr_ClearPyErr_NoMemoryPyErr_Format PyArg_ParseTuple PyArg_ParseTupleAndKeywordsPy_BuildValuePyModule_Create2PyErr_PrintPyEval_SaveThreadPyEval_RestoreThreadUPyObject_Call2PyNumber_ToBaseE_Py_tracemalloc_config_Py_NoneStructPyExc_MemoryErrorPyExc_NotImplementedError1PyExc_TypeError9PyExc_ValueErrorpython38.dll?PyWin_SetAPIError@@YAPAU_object@@PADJ@Z?PyWinObject_AsWCHAR@@YAHPAU_object@@PAPA_WHPAK@Z?PyWinObject_FreeWCHAR@@YAXPA_W@Z?PyWinObject_AsReadBuffer@@YAHPAU_object@@PAPAXPAKH@Z?PyWinCoreString_FromString@@YAPAU_object@@PBDH@Z?PyWinObject_FreeWCHARArray@@YAXPAPA_WK@Z?PyWinObject_AsWCHARArray@@YAHPAU_object@@PAPAPA_WPAKH@Z?PyWinObject_FromOLECHAR@@YAPAU_object@@PB_W@Z?PyWinObject_FromOLECHAR@@YAPAU_object@@PB_WH@Z?PyWinObject_FromIID@@YAPAU_object@@ABU_GUID@@@Z?PyWinObject_FromSYSTEMTIME@@YAPAU_object@@ABU_SYSTEMTIME@@@Z?PyWinObject_FromTimeStamp@@YAPAU_object@@ABT_LARGE_INTEGER@@@Z?PyWinTimeObject_Fromtime_t@@YAPAU_object@@_J@Z?PyWinObject_AsSID@@YAHPAU_object@@PAPAXH@Z?PyWinObject_FromSID@@YAPAU_object@@PAX@Z?PyWinObject_AsHANDLE@@YAHPAU_object@@PAPAX@Z?PyWinLong_FromHANDLE@@YAPAU_object@@PAX@Z?PyWinGlobals_Ensure@@YAHXZ ??0PyHANDLE@@QAE@PAX@Z??1PyHANDLE@@UAE@XZ?PyWinExc_ApiError@@3PAU_object@@Apywintypes38.dll]GetLastError[RaiseExceptionGetSystemInfoVirtualProtectVirtualQueryFreeLibrarytGetModuleHandleWGetProcAddressLoadLibraryExAFQueryPerformanceCounterGetCurrentProcessIdGetCurrentThreadIdGetSystemTimeAsFileTimeDisableThreadLibraryCalls^InitializeSListHeadzIsDebuggerPresentUnhandledExceptionFiltereSetUnhandledExceptionFilterGetStartupInfoWIsProcessorFeaturePresentGetCurrentProcessTerminateProcessKERNEL32.dll#__std_terminate__CxxFrameHandler3Hmemset!__std_exception_copy"__std_exception_destroy_CxxThrowException%__std_type_info_destroy_list5_except_handler4_commonVCRUNTIME140.dllfreemalloc_callnewh8_initterm9_initterm_eA_seh_filter_dll_configure_narrow_argv5_initialize_narrow_environment6_initialize_onexit_table>_register_onexit_function$_execute_onexit_table_crt_atexit_crt_at_quick_exit_cexitjterminateapi-ms-win-crt-heap-l1-1-0.dllapi-ms-win-crt-runtime-l1-1-0.dll6:;P>?@ ȧԧ(䧞*, 0$@0D4L8ABDE0FpGHI0"PJ$`%0&`'()+,./2045<<Ĭ̬謞 Э,4Юlt|XlhtHPX$08@H\$X@lХإdxܦ(訞t|쪞h<EpuDN@d.?AVPyEVTLOG_HANDLE@@d.?AVPyHANDLE@@d.?AU_object@@d.?AVPyEVT_HANDLE@@d.?AVtype_info@@d.?AVbad_alloc@std@@d.?AVexception@std@@d.?AVbad_array_new_length@std@@hhhhii'i7iGiWigiwiiiiiiiiijj'j7jGjWjgjwjjjj6GJ NPNWN]TULZ[4  8Ph t 4@ @ T %1 %1 %1 %1 %1 %1 %1 %1 %1 %1 %1 %1 %1 %1 %1 %1 %1 %1 %1 %1 %1 %1 %1 %1 %1 %1 %1 %1 %1 %1 %1 %1 %1 %1 %1 %1 4VS_VERSION_INFO,,?dStringFileInfo@040904E4`$Commentshttps://github.com/mhammond/pywin32"CompanyName*FileDescription4 FileVersion3.8.300.0@InternalNamewin32evtlog.pyd&LegalCopyright*LegalTrademarksHOriginalFilenamewin32evtlog.pyd0ProductNamePyWin328 ProductVersion3.8.300.0DVarFileInfo$Translation PADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGX00 0001060;0@0E0J0O0T0Y0^0c0h0m0r0w0|0000000000000000000000001 111!1'111;1?1E1O1Y1]1c1m1w1{1111111111111111112 222!2+2/252?2I2M2S2]2g2k2q2{22222222222222222222222233 33333%3/393=3C3M3W3[3a3k3u3y33333333333333333334 4444)43474=4G4Q4U4[4e4o4s4y444444444444444444455 555"5(5,525<5F5J5P5T5Z5g5q5u5{55555555555555555555566666%6/696=6C6G6M6W6a6e6k6o6u666666666667#7\7777778K8T8z8888O9Z9b9m9999::+:s:,;@;;;;;;;&->7>>>>>???A?J?Z?`?j?r????????  00&030C0V0s00000000011(131V1h1n1~1111111111111111111111111111222 22222 2$2(262c2h2m2y22222223E3b3j3t33344474F4T4|444444 55515j5t5y555555556 6666X6l6q6}66666667%7G7f77777778+878?8H8N8`8888899 9b999999992:?:D:P:h:v:::::::: ;+;=;L;c;x;~;;;;;;<\>b>>>>>??&?9?a?q?w????????0 000%0[0a00000011101?1O1u1111111112&2+2B2r22222222363P3x333333333333464y444444555$565Z5g5m5555566656B6U6b6h6666667 77*7B7R7X7d7k7777777788t88888889)969L9e9y9999999999::::: :$:(:,:0:4:8:<:@:D:H:L:P:T:X:\:`:::::::;;;*;<;A;I;|;;;;;;<V>>>>>>?&?,?b?h???????@00)0/0e0k000000001 1@1J1U1[1o1111111 2:2Y2g2m2222223,353@3F3Z3l3q3y3333334,41464B4_4u4444445,51565B5_5u5555555 66L6Q6V6d6w6666666667+717;7Y77777777777 888G8V8\8f88888888999)9;9@9H9w999999999::-:3:D:q:v:{::::::::; ;;I;X;^;h;;;;;<<%<.%>4>@>I>Y>_>k>>>>>>???&?O?Y?u??????????Pd00*0O0Y0u000000000011*1^1x1111112'2-2^2x22222223(3.3^3x33333334(4.44444455!5'5;5N5Z5`5i5n5u55555555555 66'646D6O6U6c6667>7r7778F8~8889R9999&:^::::2;f;;;<:>>,><>I>V>c>s>>>>>>>>>>??$?1?>?K?[?h?u??????????`00 0-0=0J0W0d0t00000000000 11&131@1P1]1j1w1111111111222,292F2S2c2p2}222222222233"3/3?3L3Y3f3v33333333333 44(454B4R4_4l4y4444444444555.5;5H5e5555556"6>6\6l667577777778!858]8p8v8|8888888888888888889999#9(93989C9H9S9X9c9h9s9x99999999999999999::::#:(:3:8:C:H:S:X:c:h:s:x:::::::::::: ;;-;R;b;h;r;;;;;;;;;;;<>!>,>>>>>>p\H0^0001,1V1111112*262<2Q2v222223 33D3W3s333333333333333333344444 4&4,42484>4D4J4P4V4\4b4h4n4t4z444444444444444444'5855555 66"6;6@6M666666647F7838888888899%959^9x99999 :<:Y:o:}:::V;>%>=>n>>>>>>>>???$?*?6?2I2P2p2v2|2222222222222222223 33+3;3D3w3}333333333333333333344 4G4M4S4Y4_4e4l4s4z44444444444445/565H5V5q5|56 66\6k6r666666666677777 7&7,72787>7D7J7P7V7\7b7h7n7t7z7777777777777777777777 898R8k88888959N9g9y9999:':M:f:::12299999999`:d::::::::::; ;;,;0;;;;;;;;;;; <<<<4tVkYtu ju6 ts3@4 Ê]uYj h\ ts3OHtsFEe=xstjQ%xsEjuYY3Ʉ uFYj h\W } u9=ts3et t]1]SWuuSWuuSWu6uu"uSPuSVuSVu`tuHSWuout5SWu:$MQ0h&uu uËe3uE UV5Vu3@uu u0 ^] U]U} uuu u ] UaaEAV]UVuXV^]aaAVVUVu%V^]aaAVVUVFV `PEP3YY^]UEVaaA]AVPYÍAVP YÍAVP YUVFVP EYt j VqYY^]UVFVP EYt j VDYY^]UVFVPq EYt j VYY^]U Mh]EPC U Mhh]EP& ̋AuVC U졈r3E]U졈rj Y+ȋE3r]UEM ] P YUEVH<AQAk(;tM ;J r BB ;r (;u3^]ËUEu2]ùMZf9uH<ȁ9PEu f9A]du2dV|sP;t3u2^ð^XtDP6 Yt2/ jYL u2@ u: 0 + Uu} uuMPuUuu YY]t hs Y  j Y U}us u2] u j Y]U Vutu|Dt*u&hs2 Yt2Whs YDruWsj Y+ȃ3rEEEsEEuE_^]jVjh]eMZf9u]<PEuL f9u>E+PQgYYt'x$|!EE3Ɂ8ËeE2fU3t}u 3|s]U=st} uu7 u/ YY]U졈r3suȃu hs YY#E]U졈r3sȃu] uhs YY]UuYH]UeerVWN@;t t УrfEP$@E3EE @1E@1EEP@ME3M3M3;uO@u G ȉ rщ r_^]U} u=Vu u(@3@] hs,@hs_YøsøsHHHHøvU$SVjtM)3hVP5s |xffftfpflfhEEDž@jPEVPvE E@EE0@VXۍEEۉE8@EP4@u !s^[]UDjDEjP EP<@EtEj X]3j @ȅu2øMZf9uA<8PEu f9HuۃxtvՃh}28@UE8csmu%xu@= t=!t="t =@t3]̃%sSVx\x\;sW>t 8׃;r_^[SV\\;sW>t ׃;r_^[%XAh3d5D$l$l$+SVWr1E3PeuEEEEdËMd Y__^[]QUuuu uhk5hrm]U%s(S3C rj me3 r3VWs}S[wOW E؋MEineIE5ntel ȋEj5Genu XjYS[wOW uCE%?=t#=`t=pt=Pt=`t=pu=s=s=s}EEEEE|2jX3S[]؉sKS EܩEEt =s_^tm rstUtN3ЉEUEM3Ƀu3u/rsE rt sr3[]3@39rË XA3X5; ru(Uj8@u4@h @P@]U$j,tjY)t ttt5t=tftf tftftf%tf-ttEtEtEtttss ssjXkǀsjXk rLjX rLhV]Uj]Uj%tM)t ttt5t=tftf tftftf%tf-ttEtEtEttss ssjXkMshV]U jUtM)t ttt5t=tftf tftftf%tf-ttEtEtEttss s} v }ue } vE HE E @sjXkMseE@EE;E sEMU shV]% @%@%@%@%@% @%$@%(@%,@%0@%4@%8@%<@%@%@%@%\@%D@%H@%L@%P@%T@%X@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@ðððð3jEPø\Ieeebdvddddddde*e>eZexee f$f:fZfdfe``l```B`0````a"a6aLaT`fffffff2gNgfgtggggfVbxaaaaaaabbbbpb0b@bjabb cDcvcccd d:dX5ServerSessionIdWaitOkl:WTSLogoffSessionWTSLogoffSessionServerSessionIdWaitOkl:WTSDisconnectSessionWTSDisconnectSessionServerSessionIdWTSInfoClassOkk:WTSQuerySessionInformationWTSQuerySessionInformationColorDepthVerticalResolutionHorizontalResolution{s:k, s:k, s:k}win32/src/win32tsmodule.cppAddressAddressFamily{s:k, s:N}InfoClass %d not yet supportedServerVersionReserved|Okk:WTSEnumerateProcessesWTSEnumerateProcesseskkNNwin32/src/win32tsmodule.cppSessionIdWTSQueryUserToken%s is not available on this platformk:WTSQueryUserTokenWTSQueryUserTokenServerShutdownFlagOk:WTSShutdownSystemWTSShutdownSystemServerProcessIdExitCodeOkk:WTSTerminateProcessWTSTerminateProcessProcessIdProcessIdToSessionId%s is not available on this platformk:ProcessIdToSessionIdProcessIdToSessionIdWTSGetActiveConsoleSessionId%s is not available on this platform:WTSGetActiveConsoleSessionIdWndFlagsWTSRegisterSessionNotification%s is not available on this platformOk:WTSRegisterSessionNotificationWTSRegisterSessionNotificationWndWTSUnRegisterSessionNotification%s is not available on this platformO:WTSUnRegisterSessionNotificationWTSUnRegisterSessionNotificationServerEventMask|Ok:WTSWaitSystemEventWTSWaitSystemEventServerSessionIdTitleMessageStyleTimeoutWaitOkOOkkl:WTSSendMessageWTSSendMessageWTSOpenServerOpens a handle to a terminal serverWTSCloseServerCloses a terminal server handleWTSQueryUserConfigReturns user configurationWTSSetUserConfigChanges user configurationWTSEnumerateServersLists terminal servers in a domainWTSEnumerateSessionsLists sessions on a serverWTSLogoffSessionLogs off a user logged in through Terminal ServicesWTSDisconnectSessionDisconnects a session without logging it offWTSQuerySessionInformationRetrieve information about a sessionWTSEnumerateProcessesLists processes on a terminal serverWTSQueryUserTokenRetrieves the access token for a sessionWTSShutdownSystemIssues a shutdown request to a terminal serverWTSTerminateProcessKills a process on a terminal serverProcessIdToSessionIdFinds the session under which a process is runningWTSGetActiveConsoleSessionIdReturns the id of the console sessionWTSRegisterSessionNotificationRegisters a window to receive terminal service notificationsWTSUnRegisterSessionNotificationDisables terminal service window messagesWTSWaitSystemEventWaits for an event to occurWTSSendMessageSends a popup message to a terminal services sessionwin32tsInterface to the Terminal Services Api.WTSActiveWTSConnectedWTSConnectQueryWTSShadowWTSDisconnectedWTSIdleWTSListenWTSResetWTSDownWTSInitWTSInitialProgramWTSApplicationNameWTSWorkingDirectoryWTSOEMIdWTSSessionIdWTSUserNameWTSWinStationNameWTSDomainNameWTSConnectStateWTSClientBuildNumberWTSClientNameWTSClientDirectoryWTSClientProductIdWTSClientHardwareIdWTSClientAddressWTSClientDisplayWTSClientProtocolTypeWTSUserConfigInitialProgramWTSUserConfigWorkingDirectoryWTSUserConfigfInheritInitialProgramWTSUserConfigfAllowLogonTerminalServerWTSUserConfigTimeoutSettingsConnectionsWTSUserConfigTimeoutSettingsDisconnectionsWTSUserConfigTimeoutSettingsIdleWTSUserConfigfDeviceClientDrivesWTSUserConfigfDeviceClientPrintersWTSUserConfigfDeviceClientDefaultPrinterWTSUserConfigBrokenTimeoutSettingsWTSUserConfigReconnectSettingsWTSUserConfigModemCallbackSettingsWTSUserConfigModemCallbackPhoneNumberWTSUserConfigShadowingSettingsWTSUserConfigTerminalServerProfilePathWTSUserConfigTerminalServerHomeDirWTSUserConfigTerminalServerHomeDirDriveWTSUserConfigfTerminalServerRemoteHomeDirWTS_EVENT_NONEWTS_EVENT_CREATEWTS_EVENT_DELETEWTS_EVENT_RENAMEWTS_EVENT_CONNECTWTS_EVENT_DISCONNECTWTS_EVENT_LOGONWTS_EVENT_LOGOFFWTS_EVENT_STATECHANGEWTS_EVENT_LICENSEWTS_EVENT_ALLWTS_EVENT_FLUSHWTSVirtualClientDataWTSVirtualFileHandleWTS_PROTOCOL_TYPE_CONSOLEWTS_PROTOCOL_TYPE_ICAWTS_PROTOCOL_TYPE_RDPWTS_WSD_LOGOFFWTS_WSD_SHUTDOWNWTS_WSD_REBOOTWTS_WSD_POWEROFFWTS_WSD_FASTREBOOTWTS_CURRENT_SERVERWTS_CURRENT_SERVER_HANDLEWTS_CURRENT_SESSIONWTS_CURRENT_SERVER_NAMENOTIFY_FOR_THIS_SESSIONNOTIFY_FOR_ALL_SESSIONSwtsapi32.dllwtsapi32.dllWTSQueryUserTokenc:\src\python-3.8\include\object.hWTSRegisterSessionNotificationWTSUnRegisterSessionNotificationkernel32.dllkernel32.dllProcessIdToSessionIdWTSGetActiveConsoleSessionIdServerNameO:WTSOpenServerWTSOpenServerServerO:WTSCloseServerServerNameUserNameWTSConfigClassOOk:WTSQueryUserConfigWTSQueryUserConfigConfig class not supported yetServerNameUserNameWTSConfigClassBufferOOkO:WTSSetUserConfigConfig class not supported yetWTSQueryUserConfigDomainNameVersionReserved|Okk:WTSEnumerateServersWTSEnumerateServerswin32/src/win32tsmodule.cppServerVersionReserved|Okk:WTSEnumerateServersWTSEnumerateSessionsStateWinStationNameSessionId{s:k,s:u,s:k}win32/src/win32tsmodule.cppW@%p%%PyTS_HANDLEX&Xx++Unknown exceptionY++bad allocationhYK++bad array new lengthst^_PYG^_ ZH^_ H,Z,H\rYXArWWWXeZexee f$f:fZfdfe``l```B`0````a"a6aLaT`fffffff2gNgfgtggggfVbxaaaaaaabbbbpb0b@bjabb cDcvcccd d:dWTSEnumerateServersW"WTSOpenServerWWTSCloseServerWTSEnumerateSessionsWWTSEnumerateProcessesW9WTSTerminateProcess&WTSQuerySessionInformationW(WTSQueryUserConfigW4WTSSetUserConfigW-WTSSendMessageW WTSDisconnectSessionWTSLogoffSession5WTSShutdownSystemDWTSWaitSystemEventWTSFreeMemoryWTSAPI32.dll_Py_DeallocPyLong_FromLongPyLong_FromUnsignedLongPyLong_AsUnsignedLong=PyTuple_NewPyModule_GetDictPyErr_SetStringPyErr_OccurredPyErr_Format PyArg_ParseTupleAndKeywordsPy_BuildValuePyModule_AddObjectPyModule_AddIntConstantPyModule_Create2_Py_NoneStructPyExc_NotImplementedErrorpython38.dll?PyWin_SetAPIError@@YAPAU_object@@PADJ@Z?PyWinObject_AsWCHAR@@YAHPAU_object@@PAPA_WHPAK@Z?PyWinObject_FreeWCHAR@@YAXPA_W@Z?PyWinObject_FromOLECHAR@@YAPAU_object@@PB_W@Z?PyWinObject_FromSID@@YAPAU_object@@PAX@Z?PyWinObject_AsHANDLE@@YAHPAU_object@@PAPAX@Z?PyWinObject_FromHANDLE@@YAPAU_object@@PAX@Z?PyWinGlobals_Ensure@@YAHXZ ??0PyHANDLE@@QAE@PAX@Z??1PyHANDLE@@UAE@XZpywintypes38.dlltGetModuleHandleWGetProcAddressLoadLibraryWFQueryPerformanceCounterGetCurrentProcessIdGetCurrentThreadIdGetSystemTimeAsFileTimeDisableThreadLibraryCalls^InitializeSListHeadzIsDebuggerPresentUnhandledExceptionFiltereSetUnhandledExceptionFilterGetStartupInfoWIsProcessorFeaturePresentGetCurrentProcessTerminateProcessKERNEL32.dll__CxxFrameHandler3!__std_exception_copy"__std_exception_destroy_CxxThrowException%__std_type_info_destroy_listHmemset5_except_handler4_commonVCRUNTIME140.dll_callnewhmalloc8_initterm9_initterm_efreeA_seh_filter_dll_configure_narrow_argv5_initialize_narrow_environment6_initialize_onexit_table>_register_onexit_function$_execute_onexit_table_crt_atexit_crt_at_quick_exit_cexitjterminateapi-ms-win-crt-heap-l1-1-0.dllapi-ms-win-crt-runtime-l1-1-0.dllLG0\GG GGGGGH`$HHH`H|HHH`H I(IPIhIIpIIIJ(JPJhJJJJKDKhKK@KKK$TPTlTxTTTTTU\UhUpUUUUAAAAAAB B,B C(C0CCD DHDPD\DDxE|EFFFFFFG GGG LLpDN@V.?AVPyTS_HANDLE@@V.?AVPyHANDLE@@V.?AU_object@@V.?AVtype_info@@V.?AVbad_alloc@std@@V.?AVexception@std@@V.?AVbad_array_new_length@std@@6GJNPNWN]TULZ[4 0HX4VS_VERSION_INFO,,?TStringFileInfo0040904E4`$Commentshttps://github.com/mhammond/pywin32"CompanyName*FileDescription4 FileVersion3.8.300.08 InternalNamewin32ts.pyd&LegalCopyright*LegalTrademarks@ OriginalFilenamewin32ts.pyd0ProductNamePyWin328 ProductVersion3.8.300.0DVarFileInfo$Translation PADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADD060W0\0h0000000(1-1;1W1l1s11111)2/2A2H2R2e2q2v2~2222233%3m3t33333334444<4@4d44444455)5U5f55555+616@6i6r6z6666666747:7F7M7s7x7777777 888:8i8o8888888889 99+939@9g999999999999999<:A:]::::::;;;D;u;};;;;;;;;;;;< >>>>5>:>H>d>y>>>>>>>>>>>>>>???'?.?]?b?x????? "0'050Q0b000001%1+1;1N1U1_1i1s1}1111111111111222&202:2D2Q2[2e2o2y2222222222222333"3,363@3M3W3a3k3u3333333333333 44 4*444>4F4N4S4Z4d4n4y44444444444444444445$525E555555555555555555556 6666"6(6.646:6@6F6L6R6X6^6d6j6p6v6|666A7p77777777768S8]8k8}8888994:L:d:j:::::::;;);V;;;;;; <<<==>$>7>C>S>d>>>>>>>&?3?Z?b?{?????0\0 00%020a0i0~0000000011111212r2x222222313N3333333o4x4444455)545=5P5[5c5m55555555555555556 666%616:6?6E6O6Y6i6y66666666666667 777$7,777<7B7L7V7i7n777777777777777778 888F8U8}8888888888888888888899 9999$9*90969<9B9H9N9T9Z9`9f9l9r99@ X1Ph6l6p6t666666666666667777777777888,80848<8T8d8h8p88888888888899(9,9<9@9D9L9d9t9x9999999<<<< === =(=,=4=H=P=d=l=t=|=======p00 0000 0$0,00040<0@0D0L0P0T0\0`0d0l0p0t0|000000000000000000000000011 1111 1$1,1@1H1P1T1X1`1d1h1l1t1x1|1111111111111111111111122 222 2$2(2,2024282T2X2`2222223,3PK +$nQ6xwin32/win32print.pydUT ^_ux MZ@ !L!This program cannot be run in DOS mode. $)tztztz ztz*{tz*{tz*{tz*{tz9*{tz{tz{tztztz9*{tz9*{tz9*{tzRichtzPEL^_! xpv0@@T\ pT@.textYvx `.rdataHPR|@@.data @.gfidsL@@.rsrc\@@.reloc @BD$̋D$ uPY̋D$tu D$%%葼UjhOdPd%QVjsbuEtuɼ3F#utM^d ]̋D$0YQL$WVt$WfFA=|$@T uhl0h_3^YÍD$PVFPh5Q5DtjFPt$ؑ tjjVWt_^ỸSVD$3D$D$PD$D$ Ph丼t$8D$03|u^3[ËD$;tL$QPtڍt$jjD$Pt$tIWD$VPt$,_W_tt$jht$5t$փ^[̃$Pht$| u3Ë $A;AVP`S:utA:Buu3[tVh0x ^ËL$t3ɋPt^3^ÍD$PQ葼At$_^uPh$á̋L$VWA$||$ 5đw փPhwփPh4wփPhL7hxh$_^Ë|$ wPhؾwLhwHhwDhw@h(w>D$u phXǼphlǼphǼphǼhǼp hǼphǼhǼphǼ0hȼh(ȼL̃ W3|$9=uhȼhȼ0x _ ÍD$ Phphɼt$$|u_ ÍD$PD$Pjjjt$ D$uPhɼ_ UPu!t$Dh0ɼ0x ]_ ÍD$ PD$ Pt$Ujt$$u!PhtɼU]_ t$ XtWSV39t$vISjt*PVW\F ;t$r^[U]_ Ãu W3^[U]_ ̋T$B;u;L$A PAPAPQhhВR5D tp50h3̋T$B;u3L$APQhhtR5Dtp50h3̋T$B;t50h3ËL$APhAAPh`BAPQhhԓR5D(̃$= uhdh̔0x $ÍD$PhBD$Phpht$@|u$ÍD$Pjt$ uPh,$á$Ã=uhlh0x Í$PD$Phpht$ |u4$t$uPh蕼á̃ W3D$9=uh8h@0x _ ÍD$PD$Phph|t$(|u_ ÍD$Pjjjt$t$ D$uPh_ VPut$Dh0x ^_ ÍD$Pt$ Vjt$t$$u!PhĖV^_ VV^_ Ã(=uhh0x (ÍD$PhBD$PD$Phph,t$H|u(ÍD$Pjt$t$uPh<(á(̃W39=uhh0x _ÍD$Phph̗t$ |u_Vhu hh HD$PhVjt$u|$vSVt$ ut$hTD0x ^_ÍD$Pt$ Vjt$u"jhxV^_v6h V^_̃= uhh0x Í$PD$Phpht$ |t 4$t$ uPh 3á̃0WD$3D$D$PD$D$ PD$0PD$0Ph<t$P|u_0V5D$jjPt$4փjjD$Pt$8փjD$Pt$$ؑ Ut$-jt$t$t$ՋȃujhXT$SF"f|M$\MQhlXPhPhh/4V؃uDVht$St$ t$ t$ ՉD$(PX39l$(G D$ FvNPhQhh8ȃt#D$ ED$ ;l$(rSpu WS3P4 V؃uDVhx"t$St$ t$ t$ Ջl$,UX3L$(o PhL$0L$(GEF;t$,rS4V؃uDVhit$St$ t$ t$ Ջl$, UX3L$( o 1PL$,L$(EF;t$,rSf u55fD5t$ VVuDhPjS : t$St$ t$ t$ ՉD$,LPXH39l$,:D$ O L$(JT$8L$<f<1u Vđ PVȑL$(Et$8D$ L$(L$<;l$,rS4V؃uDVh蜼t$St$ t$ t$ ՉD$(trPXtr39l$(vhG D$,vh(6h,h0ȃD$,ED$,;l$(rS2jhSVh`0x []t$5t$փ^_0ÐHIULHKK IJ&M̃ D$PD$Phԝt$ |u3 ÍD$Pt$葼tt$t$ Ph؝ ÃUV33t$t$ 95(u h(h80x ^]ÍD$PD$Ph`t$0|u^3]jjD$Pt$$tލD$PD$Pjjt$$t$$(D$ uPhQPut$ Dh0x #D$PD$Pt$Ut$$t$$(uPhԞt$XL$SWtwtQh0x 39|$]sh43h<shHhPtXPWV\G ;|$rQ39|$vGD3hh tPWV\G ;|$ru V3_[D$t Pt U^]̃UV33t$t$ 95$u hh0x ^]ÍD$PD$Ph<t$0|u^3]jjD$Pt$$tލD$PD$Pjjt$$t$$$D$ uPhLaPut$ DhX0x 3D$PD$Pt$Ut$$t$$$uPht$XL$SWtQh|0x 39\$} wh젼7hwhwhwhh$,tXPSV\C ;\$rQ39|$vGD3hh tPWV\G ;|$ru V3_[D$t Pt U^]̃S3ۉD$V3D$\$ \$\$9,u hĢh좼0x ^[ÍD$PD$Ph0t$0|u^[W=D$jjPt$$׃tjjD$Pt$(׃u _^3[ÍD$ Pjjjt$$t$$,D$ uPh|fPut$ Dh0x ;D$ Pt$Vjt$$t$$,uPh` Vđ؋L$=tQ׃D$tP׃t V_^[̃S3ۉD$V3D$\$ \$\$90u hPhl0x ^[ÍD$PD$Pht$0|u^[W=D$jjPt$$׃tjjD$Pt$(׃u _^3[ÍD$ Pjjjt$$t$$0D$ uPhfPut$ DhХ0x ;D$ Pt$Vjt$$t$$0uPh  Vđ؋L$=tQ׃D$tP׃t V_^[̃VD$D$PD$ D$PD$3Pht$0|t|$th̦0h3^ÍD$Pt$jr tKjjD$Pt$ t1t$t$ t$uPh즼 PUt$t$ Ct$ ^Q$Phph0t$|t4$uPhL3YáỸVWD$3PD$|$ PD$|$Pht$8|$$|tx5D$WjPt$ փt]WjD$Pt$$փtHWWD$Pt$(փt4t$t$t${t=jhৼD$5tPփD$ tPփD$tPփ_^̃ W3|$|$|$ 9=4uhh䨼0x _ VD$ PD$(PD$$PD$$PD$$Ph$t$H|5D$jjPt$ փtijjD$Pt$$փtSjjD$Pt$(փt=t$ t$(t$t$t$4t=jhdD$5tPփD$ tPփL$tQփ^_ ̃=8uh(h80x ÍD$$PD$PD$Phphpt$4|u3ÍD$ PD$Pt$ H tt$D$Pt$t$t$$8uPhx4$PVt$LVt$t$`tu V^̃쑼u3hhD$tWPdu_SLUVjӋ-`PhĮWD$ ՋD$ 5t uPփjPhԮWD$ ՋD$ t uPփjPh讼WD$ ՋD$ t uPփj PhWD$ ՋD$ t uPփjPhWD$ ՋD$ t uPփjPhDWD$ ՋD$ t uPփj@Ph`WD$ ՋD$ t uPփjPhxWD$ ՋD$ t uPփh@PhWD$ ՋD$ t uPփhPhWD$ ՋD$ t uPփhPh̯WD$ ՋD$ t uPփhPh௼WD$ ՋD$ t uPփhPhWD$ ՋD$ t uPփhPhWD$ ՋD$ t uPփhPhWD$ ՋD$ t uPփh Ph0WD$ ՋD$ t uPփh@PhDWD$ ՋD$ t uPփhPhXWD$ ՋD$ t uPփjPhlWD$ ՋD$ t uPփjPhWD$ ՋD$ t uPփj PhWD$ ՋD$ t uPփj@PhWD$ ՋD$ t uPփjPhWD$ ՋD$ t uPփhPhаWD$ ՋD$ t uPփjPh䰼WD$ ՋD$ t uPփjPhWD$ ՋD$ t uPփhPh WD$ ՋD$ t uPփhPh WD$ ՋD$ t uPփhPh8WD$ ՋD$ t uPփhPhXWD$ ՋD$ t uPփhPhlWD$ ՋD$ t uPփjPhWD$ ՋD$ t uPփjcPhWD$ ՋD$ t uPփjPhWD$ ՋD$ t uPփjPhWD$ ՋD$ t uPփjPhWD$ ՋD$ t uPփjPh豼WD$ ՋD$ t uPփjPhWD$ ՋD$ t uPփjPhWD$ ՋD$ t uPփjPh$WD$ ՋD$ t uPփjPh8WD$ ՋD$ t uPփjPhTWD$ ՋD$ t uPփjPhtWD$ ՋD$ t uPփjPhWD$ ՋD$ t uPփjPhWD$ ՋD$ t uPփjPhвWD$ ՋD$ t uPփjPhܲWD$ ՋD$ t uPփjPh(WD$ ՋD$ t uPփjPh8WD$ ՋD$ t uPփjPhTWD$ ՋD$ t uPփjPhlWD$ ՋD$ t uPփjPhWD$ ՋD$ t uPփjPhWD$ ՋD$ t uPփj PhȳWD$ ՋD$ t uPփhPhWD$ ՋD$ t uPփhPhWD$ ՋD$ t uPփhPhWD$ ՋD$ t uPփhPh,WD$ ՋD$ t uPփh Ph<WD$ ՋD$ t uPփhPhPWD$ ՋD$ t uPփhPh`WD$ ՋD$ t uPփhPhpWD$ ՋD$ t uPփh0PhWD$ ՋD$ t uPփh PhWD$ ՋD$ t uPփhPhWD$ ՋD$ t uPփhPhWD$ ՋD$ t uPփjPhWD$ ՋD$ t uPփjPh̴WD$ ՋD$ t uPփjPh䴼WD$ ՋD$ t uPփjPhWD$ ՋD$ t uPփjPh(WD$ ՋD$ t uPփjPhLWD$ ՋD$ t uPփjPhpWD$ ՋD$ t uPփjPhWD$ ՋD$ t uPփjPhWD$ ՋD$ t uPփj PhеWD$ ՋD$ t uPփj@Ph쵼WD$ ՋD$ t uPփhPh WD$ ՋD$ t uPփhPh$WD$ ՋD$ t uPփhPh@WD$ ՋD$ t uPփhPhTWD$ ՋD$ t uPփhPhWD$ ՋD$ t uPփhPhWD$ ՋD$ t uPփh PhWD$ ՋD$ t uPփh@Ph WD$ ՋD$ t uPփhPh(WD$ ՋD$ t uPփhPhDWD$ ՋD$ t uPփhPh`WD$ ՋD$ t uPփhPh|WD$ ՋD$ t uPփhPhWD$ ՋD$ t uPփhPh̷WD$ ՋD$ t uPփh PhWD$ ՋD$ t uPփh@PhTWD$ ՋD$ t uPփhPhpWD$ ՋD$ t uPփhPhWD$ ՋD$ t uPփjPhȸWD$ ՋD$ t uPփjPhWD$ ՋD$ t uPփjPhWD$ ՋD$ t uPփjPh,WD$ ՋD$ t uPփjPhHWD$ ՋD$ t uPփj PhWD$ ՋD$ t uPփj@PhWD$ ՋD$ t uPփhPhȹWD$ ՋD$ t uPփhPh蹼WD$ ՋD$ t uPփhPh WD$ ՋD$ t uPփhPh0WD$ ՋD$ t uPփhPhPWD$ ՋD$ t uPփhPhpWD$ ՋD$ t uPփh PhWD$ ՋD$ t uPփh@PhWD$ ՋD$ t uPփhPhWD$ ՋD$ t uPփjPhغWD$ ՋD$ t uPփjPh躼WD$ ՋD$ t uPփjPhWD$ ՋD$ t uPփhPh WD$ ՋD$ t uPփjPh,WD$ ՋD$ t uPփjPh@WD$ ՋD$ t uPփjPhPWD$ ՋD$ t uPփjPhpWD$ ՋD$ t uPփjPhWD$ ՋD$ t uPփjPhػWD$ ՋD$ t uPփjPhWD$ ՋD$ t uPփjPh WD$ ՋD$ t uPփjPh4WD$ ՋD$ t uPփjPhHWD$ ՋD$ t uPփjPh`WD$ ՋD$ t uPփjPhxWD$ ՋD$ t uPփjPhWD$ ՋD$ t uPփjPhWD$ ՋD$ t uPփjPhȼWD$ ՋD$ t uPփjPh༼WD$ ՋD$ t uPփj PhWD$ ՋD$ t uPփj PhWD$ ՋD$ t uPփj Ph4WD$ ՋD$ t uPփj PhLWD$ ՋD$ t uPփjPhdWD$ ՋD$ t uPփjPh|WD$ ՋD$ t uPփjӋShWՃt uSփhD5Hh̽WhؽWh佼W hWhWhWhWh(W h<W$h\W(hW,hW0hȾW4h侼W8hW<֣@jXDD$^][_QVt$ t$ɼ^Y%VD$t jV/^VWv uPhɼ_F ^̸ɼ%t%%%%쐼%%%%%%䐼%%%%%%Đ%Ȑ%̐%А%Ԑ%ؐ%ܐ%%萼%l%%%% %%%%H%L%P%T%X%\%`%d%h%l%p%t%x%|%%%%%%%%%%%đ%ȑ%̑%Б%ԑ%ؑ%ܑ%%䑼%葼%쑼%%UuYu}u%uYt]Uu.Y]ʼUEVʼt j VYY^]UE t3t tt3@08uuY}PY] jh(м jfYu3XE]e=Ltj^ Lte0 h"$5} $hYYu)t h hcYYL2ۈ]EDL>tVkYtu ju6 H3@0 Ê]uYj hHм H3OHHFEe=LtjQ%LEjuYY3Ʉ uFYj hhмS } u9=H3et t]1]SWuuSWuuSWu6uu"uSPuSVuSVu`tuHSWuout5SWu:$MQ0hsuu uËe3uE UV5ʼu3@uu u0 ^] U]U} uuu u ] UaaEA,ʼ]UVuX,ʼ^]aaA4ʼ,ʼUVu%Hʼ^]aaAPʼHʼUVF ʼ `PEPSYY^]UE ʼaaA]A ʼP$YÍA ʼPYÍA ʼPYUVF ʼP EYt j VqYY^]UVF ʼP EYt j VDYY^]UVF ʼP EYt j VYY^]U MhмEPc U MhмEPF ̋AuʼE U83E]U8j Y+ȋE38]UEM ] P YUEVH<AQAk(;tM ;J r BB ;r (;u3^]ËUEu2]ùMZf9uH<ȁ9PEu f9A]du2dVPP;t3u2^ð^Tt@PP Yt2I jYf u2Z uT J E Uu} uuMPuUuu YY]t hT Y  j Y U}ul u2] u j Y]U Vutu|@t*u&hTL Yt2Wh`9 YD8uWTj Y+ȃ38EEE`EEuE_^]jVjhѼeMZf9u]<PEuL f9u>E+PQgYYt'x$|!EE3Ɂ8ËeE2bU/t}u 3P]U=lt} uuQ uI YY]U83Tuȃu hT YY#E]U83`ȃu] uh` YY]UuYH]Uee8VWN@;t t У4fEP,E3EE01E`1EEP8ME3M3M3;uO@u G ȉ 8щ 4_^]U} u=ʼu u(3@] hp$hpYøxøHHHHøU$SVjtM)3hVP5 |xffftfpflfhEEDž@jPEVPxE E@EE VXۍEEۉE4EPu !^[]UDjDEjP EPLEtEj X]3jdȅu2øMZf9uA<8PEu f9HuۃxtvՃh4UE8csmu%xu@= t=!t="t =@t3]̃%SVϼϼ;sW>t 8׃;r_^[SVϼϼ;sW>t ׃;r_^[%hd5D$l$l$+SVW81E3PeuEEEEdËMd Y__^[]QUuuu uhh8]U%(S3C 0j me3 03VW}S[wOW E؋MEineIE5ntel ȋEj5Genu XjYS[wOW uCE%?=t#=`t=pt=Pt=`t=pu===}EEEEE|2jX3S[]؉sKS EܩEEt =_^tm 0tUtN3ЉEUEM3Ƀu3u/0E 0t 03[]3@39<Ë 3聼; 8u(Uj4uh \PX]U$j8tjY) 5=ff ff|f%xf-tEEE jXkǀjXk 8LjX 4Lhhʼ]Uj]Uj1tM) 5=ff ff|f%xf-tEEE jXkMhhʼ]U jatM) 5=ff ff|f%xf-tEEE } v }ue } vE HE E @jXkMeE@EE;E sEMU hhʼ]%P%H%D%@%<%8%`%0%,%(%$% %%4%L%T%d%\%X%t%%x%|%%%%%%%%%%%%% %$%<%(%,%0%4%8ðððð3jEPøмAZfp|J|hR6z (.NXbz86`Vj~v .@Z|B 8L^p~lV 4"@xTN0F聼OOk:PRINTER_INFO_4lefttoprightbottomRECTL must be a dictionary containing {left:int, top:int, right:int, bottom:int}pPrinterNamepPortNamellllAttributesDeviceNotSelectedTimeoutTransmissionRetryTimeoutOOkkk:PRINTER_INFO_5cxcySIZEL must be a dictionary containing {cx:int, cy:int}llObjectGUIDActionOk:PRINTER_INFO_7FlagsNameSizeImageableAreapDevModekuO&O&:FORM_INFO_1FORM_INFO_1 must be a dictionary containing {Flags:int, Name:unicode, Size:dict, ImageableArea:dict}O:PRINTER_INFO_8AddFormMalloc failed for %d bytesInfo must be None or a PRINTER_STATUS_* integer when level is 0.%s is not available on this platformPRINTER_INFO_%d must be a dictionaryO&O&:AddFormAddFormMalloc failed for %d bytesMalloc failed for %d bytesDeleteFormMalloc failed for %d bytes%s is not available on this platformO&u:DeleteFormMalloc failed for %d bytesDeleteFormMalloc failed for %d bytesInformation level %d is not supportedGetForm%s is not available on this platformO&kOk:SetPrinterO&u:GetFormGetFormSetPrinterGetForm: Unable to allocate %d bytesGetFormO:AddPrinterConnectionAddPrinterConnectionSetForm%s is not available on this platformO&uO&:SetFormSetFormO:DeletePrinterConnectionDeletePrinterConnectionMalloc failed.AddJob%s is not available on this platformDeviceO&:AddJobWindowsThe default printer was not found.AddJob: unable to allocate %d bytesThe returned printer is malformed.AddJob: unable to allocate %d bytesAddJobukScheduleJobGetDefaultPrinter%s is not available on this platform%s is not available on this platformO&k:ScheduleJobUnable to allocate %d bytesScheduleJobGetDefaultPrinterUnable to allocate %d bytesGetDefaultPrinterO:SetDefaultPrinterDevicesThe printer was not found.,deviceWindowsSetDefaultPrinter%s is not available on this platformO:SetDefaultPrinterSetDefaultPrinterOOh|O:DeviceCapabilitiesDeviceCapabilitieskk|Ok:EnumPrintersLengthWidthLevel %d is not supported{s:h,s:h}DeviceCapabilites: Unable to allocate %d bytesEnumPrintersydpixdpiEnumPrinters: unable to allocate %d bytes{s:l,s:l}win32/src/win32print/win32print.cppEnumPrintersDeviceCapabilites: Unable to allocate %d byteskNNNhwin32/src/win32print/win32print.cppwin32/src/win32print/win32print.cppDeviceCapabilites: Unable to allocate %d byteswin32/src/win32print/win32print.cppDeviceCapabilites: Unable to allocate %d bytesO&k(OOO):StartDocPrinterwin32/src/win32print/win32print.cppThis information level is not supportedDeviceCapabilites: Unable to allocate %d bytesStartDocPrinteryx{s:l,s:l}win32/src/win32print/win32print.cppType %d is not supportedO&:EndDocPrinterDeviceCapabilitiesEndDocPrinterO&:AbortPrinterAbortPrinterOkiO&:StartPagePrinterStartPagePrinterO&:EndPagePrinterEndPagePrinterEnumMonitors%s is not available on this platformOk:EnumMonitorsDOCINFO must be a tupleEnumMonitorsOOOkEnumMonitors: unable to allocate buffer of size %dEnumMonitorsO&O:StartDocName{s:u}StartDocwin32/src/win32print/win32print.cppDLLNameEnvironmentName{s:u,s:u,s:u}win32/src/win32print/win32print.cppO&:EndDocEnumMonitors: Level %d is not supportedEndDocO&:AbortDocAbortDocO&:StartPageStartPageO&:EndPageEnumPortsEndPage%s is not available on this platformOk:EnumPortsEnumPortsEnumPorts: unable to allocate buffer of size %dO&O:WritePrinterEnumPortsWritePrinterName{s:u}win32/src/win32print/win32print.cppReservedPortTypeDescriptionMonitorNameName{s:u,s:u,s:u,s:l,s:l}win32/src/win32print/win32print.cppSubmittedPagesPrintedEnumPorts: Level %d is not supportedTotalPagesPositionPriorityStatuspStatuspDatatypepDocumentpUserNamepMachineNamepPrinterNameJobIdSubmitted{s:k, s:N, s:N, s:N, s:N, s:N, s:N, s:k, s:k, s:k, s:k, s:k, s:N}PagesPrintedTimeSizeTotalPagesUntilTimeStartTimePositionGetPrintProcessorDirectoryPriority%s is not available on this platformStatuspSecurityDescriptor|OO:GetPrintProcessorDirectorypStatuspDevModepDriverNamepParametersGetPrintProcessorDirectorypPrintProcessorpDatatypepNotifyNameGetPrintProcessorDirectory: unable to allocate buffer of size %dpDocumentpUserNamepMachineNamepPrinterNamec:\src\python-3.8\include\object.hGetPrintProcessorDirectoryJobIdReserved{s:k, s:N, s:N, s:N, s:N, s:N, s:N, s:N, s:N, s:N, s:N, s:N, s:N, s:k, s:k, s:k, s:k, s:k, s:k, s:k, s:N, s:k, s:k}NextJobIdJobId{s:k, s:k, s:k}Job info level %d is not yet supportedGetPrinterDriverDirectory%s is not available on this platform|OO:GetPrinterDriverDirectoryGetPrinterDriverDirectoryGetPrinterDriverDirectory: unable to allocate buffer of size %dO&kk|k:EnumJobsGetPrinterDriverDirectoryInformation level %d is not supportedEnumJobsMalloc failed for %d bytesEnumJobswin32/src/win32print/win32print.cppOkO:AddPrinterAddPrinter only accepts level 2AddPrinterO&k|k:GetJobInformation level %d is not supportedO&:DeletePrinterGetJobDeletePrinterMalloc failed.GetJobJobIdpPrinterNamepMachineNamepUserNameOOO:DeletePrinterDriverpDocumentpDatatypepStatusDeletePrinterDriverStatusPriorityPositionTotalPagesPagesPrintedSubmittedkzzzzzzkkkkk|O:JOB_INFO_1JobIdpPrinterNamepMachineNamepUserNamepDocumentpNotifyNamepDatatypepPrintProcessorDeletePrinterDriverExpParameters%s is not available on this platformpDriverNamepDevModeOOOll:DeletePrinterDriverExpStatuspSecurityDescriptorStatusDeletePrinterDriverExPriorityPositionStartTimeUntilTimeTotalPagesSizeSubmittedTimePagesPrintedkzzzzzzzzzOzOkkkkkkkOkk:JOB_INFO_2JobIdNextJobIdReservedFlushPrinter%s is not available on this platformkk|k:JOB_INFO_3O&OkFlushPrinterOpenPrinterGetPrinterSetPrinterClosePrinterAddPrinterConnectionDeletePrinterConnectionEnumPrintersGetDefaultPrinterGetDefaultPrinterWSetDefaultPrinterSetDefaultPrinterWStartDocPrinterEndDocPrinterAbortPrinterStartPagePrinterEndPagePrinterStartDocEndDocAbortDocStartPageEndPageWritePrinterEnumJobsGetJobSetJobDocumentPropertiesInfo must be None when level is 0.EnumPrintProcessorsEnumPrintProcessorDatatypesEnumPrinterDriversJOB_INFO_1 must be a dictionaryEnumFormsAddFormMalloc failed for %d bytesDeleteFormGetFormSetFormAddJobScheduleJobJOB_INFO_2 must be a dictionaryDeviceCapabilitiesGetDeviceCapsMalloc failed for %d bytesEnumMonitorsEnumPortsGetPrintProcessorDirectoryGetPrinterDriverDirectoryAddPrinterJOB_INFO_3 must be a dictionaryDeletePrinterDeletePrinterDriverMalloc failed for %d bytesDeletePrinterDriverExFlushPrinterInformation level %d is not supportedwin32printO&kkOk:SetJobA module encapsulating the Windows printing API.SetJobPRINTER_INFO_1PRINTER_ENUM_LOCALPRINTER_ENUM_NAMEPRINTER_ENUM_SHAREDPRINTER_ENUM_DEFAULTOO&OOOk:DocumentPropertiesPRINTER_ENUM_CONNECTIONSPRINTER_ENUM_NETWORKPRINTER_ENUM_REMOTEPRINTER_ENUM_EXPANDDocumentPropertiesPRINTER_ENUM_CONTAINERPRINTER_ENUM_ICON1PRINTER_ENUM_ICON2PRINTER_ENUM_ICON3PRINTER_ENUM_ICON4PRINTER_ENUM_ICON5PRINTER_ENUM_ICON6PRINTER_ENUM_ICON7PRINTER_ENUM_ICON8JOB_STATUS_DELETINGJOB_STATUS_ERRORJOB_STATUS_OFFLINEJOB_STATUS_PAPEROUTJOB_STATUS_PAUSEDJOB_STATUS_PRINTEDJOB_STATUS_PRINTINGJOB_STATUS_SPOOLINGJOB_STATUS_DELETEDJOB_STATUS_BLOCKED_DEVQJOB_STATUS_USER_INTERVENTIONJOB_STATUS_RESTARTJOB_STATUS_COMPLETEMIN_PRIORITYMAX_PRIORITYDEF_PRIORITYJOB_INFO_1JOB_CONTROL_CANCEL|OO:EnumPrintProcessorsJOB_CONTROL_PAUSEJOB_CONTROL_RESTARTJOB_CONTROL_RESUMEJOB_CONTROL_DELETEJOB_CONTROL_SENT_TO_PRINTERJOB_CONTROL_LAST_PAGE_EJECTEDJOB_POSITION_UNSPECIFIEDDI_APPBANDINGEnumPrintProcessorsDI_ROPS_READ_DESTINATIONFORM_USERFORM_BUILTINEnumPrintProcessors: unable to allocate buffer of size %dFORM_PRINTERSERVER_ACCESS_ADMINISTERSERVER_ACCESS_ENUMERATEPRINTER_ACCESS_ADMINISTEREnumPrintProcessorsPRINTER_ACCESS_USEJOB_ACCESS_ADMINISTERJOB_ACCESS_READwin32/src/win32print/win32print.cppSERVER_ALL_ACCESSSERVER_READSERVER_WRITESERVER_EXECUTEPRINTER_ALL_ACCESSPRINTER_READPRINTER_WRITEPRINTER_EXECUTEJOB_ALL_ACCESSJOB_READJOB_WRITEJOB_EXECUTEPRINTER_CONTROL_PAUSEPRINTER_CONTROL_PURGEPRINTER_CONTROL_SET_STATUSPRINTER_CONTROL_RESUMEDesiredAccessPRINTER_STATUS_PAUSEDpDataTypePRINTER_STATUS_ERRORpDevModePRINTER_STATUS_PENDING_DELETIONPRINTER_STATUS_PAPER_JAMPRINTER_STATUS_PAPER_OUTk|OOPRINTER_STATUS_MANUAL_FEEDPRINTER_STATUS_PAPER_PROBLEMPRINTER_STATUS_OFFLINEPRINTER_STATUS_IO_ACTIVEPRINTER_STATUS_BUSYPRINTER_STATUS_PRINTINGPRINTER_DEFAULTS must be a dictionaryPRINTER_STATUS_OUTPUT_BIN_FULLPRINTER_STATUS_NOT_AVAILABLEOO:EnumPrintProcessorDatatypesPRINTER_STATUS_WAITINGPRINTER_STATUS_PROCESSINGPRINTER_STATUS_INITIALIZINGPRINTER_STATUS_WARMING_UPPRINTER_STATUS_TONER_LOWPRINTER_STATUS_NO_TONEREnumPrintProcessorDatatypesPRINTER_STATUS_PAGE_PUNTPRINTER_STATUS_USER_INTERVENTIONPRINTER_STATUS_OUT_OF_MEMORYEnumPrintProcessorDatatypes: unable to allocate buffer of size %dPRINTER_STATUS_DOOR_OPENPRINTER_STATUS_SERVER_UNKNOWNPRINTER_STATUS_POWER_SAVEEnumPrintProcessorDatatypesPRINTER_ATTRIBUTE_QUEUEDO|O:OpenPrinterPRINTER_ATTRIBUTE_DIRECTPRINTER_ATTRIBUTE_DEFAULTPRINTER_ATTRIBUTE_SHAREDPRINTER_ATTRIBUTE_NETWORKwin32/src/win32print/win32print.cppPRINTER_ATTRIBUTE_HIDDENPRINTER_ATTRIBUTE_LOCALOpenPrinterPRINTER_ATTRIBUTE_ENABLE_DEVQPRINTER_ATTRIBUTE_KEEPPRINTEDJOBSPRINTER_ATTRIBUTE_DO_COMPLETE_FIRSTPRINTER_ATTRIBUTE_WORK_OFFLINEPRINTER_ATTRIBUTE_ENABLE_BIDIPRINTER_ATTRIBUTE_RAW_ONLYPRINTER_ATTRIBUTE_PUBLISHEDPRINTER_ATTRIBUTE_FAXPRINTER_ATTRIBUTE_TSDSPRINT_PUBLISHDSPRINT_UNPUBLISHDSPRINT_UPDATEDSPRINT_PENDINGO:ClosePrinterDSPRINT_REPUBLISHPORT_TYPE_WRITEPORT_TYPE_READPyPrinterHANDLEPORT_TYPE_REDIRECTEDClosePrinter: Object must be a printer handle, not %sPORT_TYPE_NET_ATTACHEDDPD_DELETE_SPECIFIC_VERSIONDPD_DELETE_UNUSED_FILESDPD_DELETE_ALL_FILESClosePrinterPORT_STATUS_OFFLINEPORT_STATUS_PAPER_JAMPORT_STATUS_PAPER_OUTPORT_STATUS_OUTPUT_BIN_FULLPORT_STATUS_PAPER_PROBLEMPORT_STATUS_NO_TONERPORT_STATUS_DOOR_OPENPORT_STATUS_USER_INTERVENTIONPORT_STATUS_OUT_OF_MEMORYPORT_STATUS_TONER_LOWPORT_STATUS_WARMING_UPPORT_STATUS_POWER_SAVEPORT_STATUS_TYPE_ERRORPORT_STATUS_TYPE_WARNINGPORT_STATUS_TYPE_INFOwinspool.drvEnumFormsWAddFormWDeleteFormWGetFormWSetFormWAddJobWScheduleJobpCommentEnumPortsWpNameEnumMonitorsWpDescriptionGetPrintProcessorDirectoryWFlagsGetPrinterDriverDirectoryW{s:k,s:N,s:N,s:N}DeletePrinterDriverExWFlushPrinterAveragePPMGetDefaultPrinterWcJobsSetDefaultPrinterWStatusUntilTimeStartTimeDefaultPriorityPriorityAttributespSecurityDescriptor|OOk:EnumPrinterDriverspParameterspDatatypepPrintProcessorpSepFilepDevModepLocationpCommentpDriverNameEnumPrinterDriverspPortNamepShareNamepPrinterNameEnumPrinterDrivers: unable to allocate buffer of size %dpServerName{s:N,s:N,s:N,s:N,s:N,s:N,s:N,s:N,s:N,s:N,s:N,s:N,s:N,s:k,s:k,s:k,s:k,s:k,s:k,s:k,s:k}EnumPrinterDriverspSecurityDescriptor{s:N}AttributespServerNameNamepPrinterName{s:u}{s:N,s:N,s:k}win32/src/win32print/win32print.cppTransmissionRetryTimeoutDeviceNotSelectedTimeoutConfigFileAttributesDataFilepPortNameDriverPathpPrinterNameEnvironment{s:N,s:N,s:k,s:k,s:k}NameVersionAction{s:l,s:u,s:u,s:u,s:u,s:u}ObjectGUID{s:N,s:k}win32/src/win32print/win32print.cpppDevModeDefaultDataType{s:N}MonitorNameDependentFilespDevModeHelpFile{s:N}ConfigFileDataFileLevel %d is not supportedDriverPathEnvironmentNameVersion{s:l,s:u,s:u,s:u,s:u,s:u,s:u,s:N,s:u,s:u}win32/src/win32print/win32print.cppPreviousNamesDefaultDataTypeMonitorNameDependentFilesHelpFileConfigFileDataFileDriverPathO&:GetPrinterEnvironmentNameO&k:GetPrinterVersion{s:l,s:u,s:u,s:u,s:u,s:u,s:u,s:N,s:u,s:u,s:u}GetPrinterwin32/src/win32print/win32print.cppGetPrinter: Unable to allocate buffer of %d bytesConfigVersionGetPrinterDriverVersionDriverAttributesConfigFileNNNNNNNONNNNOkkkkkkkkDataFileDriverPathEnvironmentNameVersion{s:l,s:u,s:u,s:u,s:u,s:u,s:l,s:l,s:l}win32/src/win32print/win32print.cppProviderOEMUrlMfgNameDriverVersionDriverDatePreviousNamesDefaultDataTypeMonitorNameDependentFilesHelpFileConfigFileDataFileDriverPathEnvironmentNameVersion{s:l,s:u,s:u,s:u,s:u,s:u,s:u,s:N,s:u,s:u,s:u,s:N,s:L,s:u,s:u,s:u}win32/src/win32print/win32print.cppEnumPrinterDrivers: Level %d is not supportedwin32/src/win32print/win32print.cpppServerNamepPrinterNamepShareNamepPortNamebottompDriverNamerightpCommenttoppLocationleftpDevModeImageableAreapSepFilecypPrintProcessorcxpDatatypeSizepParametersNamepSecurityDescriptorFlagsAttributes{s:k,s:u,s:{s:l,s:l},s:{s:l,s:l,s:l,s:l}}PriorityDefaultPriorityStartTimeUntilTimeStatuscJobsAveragePPMOOOOOOOOOOOOOkkkkkkkk:PRINTER_INFO_2EnumForms%s is not available on this platformO&:EnumFormsEnumFormspSecurityDescriptorEnumForms: unable to allocate buffer of size %dO:PRINTER_INFO_3EnumFormswin32/src/win32print/win32print.cpppPrinterNamepServerNameAttributes$˼q0q`qClosePrinterPyPrinterHANDLE˼\sD̼ xsxUnknown exception̼wsxbad allocation̼wsxbad array new length^_S88^_ ^_ H\80ͼ@8˼H˼X˼t˼˼@@8˼`@˼˼t˼˼x@˼˼˼x@˼̼ ̼(̼@̼X̼h̼p̼@X̼̼̼̼p̼@̼̼̼ ͼ̼p̼@̼ORSDS 0F;@V)C:\src\pywin32\build\temp.win32-3.8\Release\win32print.pdb@v.text$mn@.text$x.idata$5.00cfg.CRT$XCA .CRT$XCZ.CRT$XIA.CRT$XIZ.CRT$XPA.CRT$XPZ .CRT$XTA$ .CRT$XTZ08.rdata$ .rdata$r0.rdata$sxdata8.rdata$zzzdbg.rtc$IAA.rtc$IZZ.rtc$TAA.rtc$TZZH.xdata$x@T.edata.idata$2H.idata$3\.idata$4` .idata$6@.data@.data$r.bssL.gfids$y@"ϼtRu'vFvwммм v 6wwмммм w{{^_rhlpYwin32print.pydPyInit_win32print>l\Dhx t\l&Zfp|J|hR6z (.NXbz86`Vj~v .@Z|B 8L^p~lV 4"@xTN0FJDeviceCapabilitiesWjEnumPrintersWOpenPrinterWSetJobW{GetJobWXEnumJobsWAddPrinterW6DeletePrinterSetPrinterWGetPrinterWfEnumPrinterDriversWBDeletePrinterDriverW`EnumPrintProcessorsW^EnumPrintProcessorDatatypesWStartDocPrinterWStartPagePrinterWritePrinterSEndPagePrinterAbortPrinterREndDocPrinterODocumentPropertiesWClosePrinterAddPrinterConnectionW8DeletePrinterConnectionWWINSPOOL.DRVSendNotifyMessageWUSER32.dlldGetDeviceCapsStartDocWxEndDocStartPage{EndPageAbortDocGDI32.dll_Py_Dealloc&PyBytes_AsStringAndSizePyLong_FromLongPyLong_FromUnsignedLongPyLong_AsLong=PyTuple_New?PyTuple_SetItemPyDict_SetItemStringPyModule_GetDictPyErr_SetStringPyErr_OccurredPyErr_ClearPyErr_NoMemoryPyErr_Format PyArg_ParseTuple PyArg_ParseTupleAndKeywordsPy_BuildValuePyModule_Create2PyEval_SaveThreadPyEval_RestoreThread_Py_NoneStructPyDict_TypePyExc_MemoryError'PyExc_RuntimeErrorPyExc_NotImplementedError1PyExc_TypeError9PyExc_ValueErrorpython38.dll?PyWin_SetAPIError@@YAPAU_object@@PADJ@Z?PyWinObject_AsWCHAR@@YAHPAU_object@@PAPA_WHPAK@Z?PyWinObject_FreeWCHAR@@YAXPA_W@Z?PyWinObject_AsReadBuffer@@YAHPAU_object@@PAPAXPAKH@Z?PyWinObject_FromMultipleString@@YAPAU_object@@PA_W@Z?PyWinObject_FromOLECHAR@@YAPAU_object@@PB_W@Z?PyWinObject_FromOLECHAR@@YAPAU_object@@PB_WH@Z?PyWinObject_FromSYSTEMTIME@@YAPAU_object@@ABU_SYSTEMTIME@@@Z?PyWinObject_FromFILETIME@@YAPAU_object@@ABU_FILETIME@@@Z?PyWinObject_AsSYSTEMTIME@@YAHPAU_object@@PAU_SYSTEMTIME@@@Z?PyWinObject_AsDEVMODE@@YAHPAU_object@@PAPAU_devicemodeW@@H@Z?PyWinObject_FromDEVMODE@@YAPAU_object@@PAU_devicemodeW@@@Z?PyWinObject_AsSECURITY_DESCRIPTOR@@YAHPAU_object@@PAPAXH@Z?PyWinObject_FromSECURITY_DESCRIPTOR@@YAPAU_object@@PAX@Z?PyWinObject_AsHANDLE@@YAHPAU_object@@PAPAX@Z?PyWinGlobals_Ensure@@YAHXZ ??0PyHANDLE@@QAE@PAX@Z??1PyHANDLE@@UAE@XZy?PyHANDLEType@@3U_typeobject@@Apywintypes38.dll]GetLastErrorGetProcAddressLoadLibraryWGetProfileStringWWriteProfileStringWFQueryPerformanceCounterGetCurrentProcessIdGetCurrentThreadIdGetSystemTimeAsFileTimeDisableThreadLibraryCalls^InitializeSListHeadzIsDebuggerPresentUnhandledExceptionFiltereSetUnhandledExceptionFilterGetStartupInfoWIsProcessorFeaturePresenttGetModuleHandleWGetCurrentProcessTerminateProcessKERNEL32.dllNwcschr__CxxFrameHandler3FmemcpyHmemset!__std_exception_copy"__std_exception_destroy_CxxThrowException%__std_type_info_destroy_list5_except_handler4_commonVCRUNTIME140.dllfreemalloc_callnewh8_initterm9_initterm_eA_seh_filter_dll_configure_narrow_argv5_initialize_narrow_environment6_initialize_onexit_table>_register_onexit_function$_execute_onexit_table_crt_atexit_crt_at_quick_exit_cexitjterminateapi-ms-win-crt-heap-l1-1-0.dllapi-ms-win-crt-runtime-l1-1-0.dllԪ 쪼$ 0!$P"8$L'\P(l(|(@)*@+++̫0,ԫ,䫼`/010558@7L9h:p@ C̬Cج@D଼`E謼F@GG0M\Nl0PxpRSpUܭ`V쭼VW4X@dȵ$Ǽ0Ǽ@ǼLǼ`ǼtǼǼǼǼǼǼǼȼȼTȼ`ȼpȼ|ȼȼȼȼȼɼ`ɼɼɼɼ0Ēؒ䒼xȓPT t|̧ا 0<X`pب @H\|̩ԩ䩼`DLPX`48<蓼@ lDN@ʼ.?AVPyPrinterHANDLE@@ʼ.?AVPyHANDLE@@ʼ.?AU_object@@ʼ.?AVtype_info@@ʼ.?AVbad_alloc@std@@ʼ.?AVexception@std@@ʼ.?AVbad_array_new_length@std@@6GJNPNWN]TULZ[4 0HX4VS_VERSION_INFO,,?dStringFileInfo@040904E4`$Commentshttps://github.com/mhammond/pywin32"CompanyName*FileDescription4 FileVersion3.8.300.0>InternalNamewin32print.pyd&LegalCopyright*LegalTrademarksFOriginalFilenamewin32print.pyd0ProductNamePyWin328 ProductVersion3.8.300.0DVarFileInfo$Translation PADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADD<0c0r00000010151=1U1[1b1h111111232A2[2z2222222+31393^3f3}333333333 4444-454=4E4M4U4]4e4n4t4}44444444444 55(5-535H5N5S5Y5i5q5555555555555556 66%6+60666H6N6S6Y6d6j6r6|6666666666666667)7/7B7T7Y7a7777777;8A8M8n88888 99"9,9094989<9@9k999999999999::J:O::::::;<9>>&>6><>C>I>a>k>q>y>>>>>>>>>>>>>@?F?P?X?????????  0030P0_0e0q0x00000000000000011131;1@1E1M1i1~11111111111222"222>2`2j22222222222=3C3s3333333334 444494E4^4v4444444445:5l5|555555555 6>6J6W6c6i6v6666666@7E7O7b7g7o777888!818V8[8e888888888888889 9&90979F9K9U9p9v9999999:#:0::::::;';-;F;K;U;g;p;w;;;;;;;;;;;;;;<<< <&<6<;>>->;>I>W>e>s>>>>>>>>>>>>>>> ??'?5?9>@>H>P>X>`>h>p>x>}>>>>>>>>>>? ???#?+?3?;?C?K?S?X?^?q?????????????@0 000!0)01060>0F0K0S0Z0_0e0|00000000000111!1G1Q1W1a1v111111222#262;2A2I2i2y2~22222222222223 333%3-32373?3P3Z3_3i33333333333333 444'4.4P4W4\4a4i444444444445$5*545Q5e5m5r5w555555555556666!63686B6Z6m6666666666677%7E7M7R7W7_7t7y7777777788!8f8|888888888889%9+9W999999999::4:e:k::::::;?;S;[;f;v;;;; <>>$>,>D>N>p>>>>>>>>>? ??@?F?N?t?{??????????Pt00C0J0O0T0\0t0~000000001*141:1L1t1z1111111111222292O2]2t22222222213?3E3Q3c3h3p3333333344 4%4-4E4O4c44444444555+5:5]555555566C6f6k6u66666666B7J7S7Y7f777777778k8t8|88888888899 9A9d9n9t99999999::$:*:>:W:~::::;A;k;;;;<=J>t>>>>?@?g????`0*0Q0x00001;1b11111%2L2s22223E3o33334A4k44445.5U5|55556B6l66667>7h77778:8d8888 939Z99999:G:q::::;C;m;;;; <6<]<<<<< =G=n==== >1>X>>>>>?B?i?????????p0 0000#0*00070=0D0J0Q0W0^0d0k0q0x0~00000000000001D1J1a1r1x1~111111111111111111111122222 2&2,22282>2D2J2P2V2\2b2h2n2t2z222222222222222222222223 33W3h3344+4<4M4R4k4p4}444445&5d5v506c666667+717A7j7777778H8e8{8888b9%:V:::::::;3;:;@;R;\;;;;;<)<1f>p>>>>? ?T?]?b??????$+000C0Q0l0w0011W1f1m111111111122'2.2N2T2Z2`2f2l2s2z2222222222222222 33"3U3[3a3g3m3s3z33333333333333333%4+41474=4C4J4Q4X4_4f4m4t4|444444444 55$5*50565<5B5H5N5T5Z5`5f5l5r5x5~555555555555555555555566666 6P6 299999:: ::(:,:0:D:H:L:h:l:;;;0;4;D;H;L;P;X;p;t;;;;;;;;;;;< << <(<@@.gfidspB@@.rsrc\D@@.relocH@B@jTjhaa! ̋D$̋D$ uP(AY̋D$t̃=buj\t$x@ËD$AA AAA̍APAPcVFtPH@FFtPp@F^̍APA PVFtPH@FF tPp@F ^̃ VD$xuGhDjjhDAt! 4AV1@u V(A3^ St$A\$D$DU-8AW=l@fffh'5b;B`@uPhxDՃD$@+6;s\5bd@u PhDՃ5bh@jd5b`@h'5b`@uPhxDՃvD$x+;sVt$$P7 5bd@=l@uPhDՃD$D$5bh@t$ +ޅt$D$_]P A[^ SV{uEhDjjhDAt! 4AV1@u V(A^3[ t$U-AWt@V5b`@W Aul@PhD8A3_]^[ 33h'5b`@ul@PhxD8As{_@P@t 7SV D$5bd@ul@PhD8A35bh@U Aut=V@_]^[ u AhE0@3_]^[ L$1_]^[ %@̃D$$PD$PhPChBt$ @u3ËL$ Vt$t$9t$@^tԡAÃhXCt$@u3ËL$ D$jPD$PtVh`Ct$ t$ @t$@^̃ $$PhhCt$@ u3 4$L$D$ PD$ P0tVhxCt$t$@t$@^ hCt$ @uáAAD$D$C%Ah`a@@@ @@@Vt$t$jhDAt! 4AV1@u V(A3^SVW|$?\$;5AUփ=b`uj\Px@PhjjhbjP@U- AՃ?ujhTD8A3]_^[hjjh7L@VՃ;ujhhD8A7p@]_^3[]_^[htVYtu ju6 b3@a Ê]uYj hXK b3OHbtEe=btj%%bEjuYY3ɄutYj hxK} u9=b3et t]1]SWuuSWuuSWuduu"uSPuLSVuSVu`tuHSWuout5SWu:$MQ0hn!uu uËe3uEUV5Gu3@uu u^^] U]U} uuu u ] Uxb3E]Uxbj Y+ȋE3xb]UEM ] P/ YUEVH<AQAk(;tM ;J r BB ;r (;u3^]ËUEu2]ùMZf9uH<ȁ9PEu f9A]du2dVbP;t3u2^ð^WtCP_ Yt2X jYu u2i uc Y T Uu} uuMPuUuu YY]t hb Y  j Y U}ub u2] u j Y]U Vutu|Ct*u&hb[ Yt2WhbH YDxbuWbj Y+ȃ3xbEEEbEEuE_^]jVjhKeMZf9u]<PEuL f9u>E+PQgYYt'x$|!EE3Ɂ8ËeE2eU2t}u 3b]U=bt} uu` uX YY]Uxb3buȃu hb YY#E]Uxb3bȃu] uhb YY]UuYH]UeexbVWN@;t t УtbfEP4@E3EE8@1E<@1EEP@@ME3M3M3;uO@u G ȉ xbщ tb_^]U} u=Gu u0@3@] hb,@hbYøbøbHHHHø fU$SVj'tM)3hVP5b( |xffftfpflfhEEDž@jPEVPE E@EE(@VXۍEEۉE @EP$@u !b^[]UDjDEjP/ EP@EtEj X]3j@ȅu2øMZf9uA<8PEu f9HuۃxtvՃh.+ @UE8csmu%xu@= t=!t="t =@t3]̃%bSV,K,K;sW>t 8׃;r_^[SV4K4K;sW>t ׃;r_^[%@Ah;,d5D$l$l$+SVWxb1E3PeuEEEEdËMd Y__^[]QUuuu uh.hxb]U%b(S3C pbj Jme3 pb3VWb}S[wOW E؋MEineIE5ntel ȋEj5Genu XjYS[wOW uCE%?=t#=`t=pt=Pt=`t=pu=b=b=b}EEEEE|2jX3S[]؉sKS EܩEEt =b_^tm pbbtUtN3ЉEUEM3Ƀu3u/pbbE pbt bpb3[]3@39|bË @A3.; xbu(Uj @u$@h @P @]U$jbtjY)c ccc5c=cfdf cfcfcf%cf-cdEcEcEd@ccbb bcjXkǀcjXk xbLjX tbLhG]Uj]Uj[tM)c ccc5c=cfdf cfcfcf%cf-cdEcEcEdcbb bcjXkMchG]U jtM)c ccc5c=cfdf cfcfcf%cf-cdEcEcEdcbb b} v }ue } vE HE E @cjXkMceE@EE;E sEMU chG]%p@%l@%h@%d@%`@%\@%X@%T@%P@%L@%H@%D@%@@%<@%8@%4@%0@%,@%(@%$@% @%@%@%@%@% @%x@%@%|@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@ðððð3NMRxRdRHR6RRQQQQQQpQVQHQ6Q&QQQPPPPPPPRRRRR SSVSS6SpSSSSTT*SDSSNNvN\NLN>NNNNOO(ONNNNOO(O_register_onexit_function$_execute_onexit_table_crt_atexit_crt_at_quick_exit_cexitjterminateapi-ms-win-crt-heap-l1-1-0.dllapi-ms-win-crt-runtime-l1-1-0.dllhB,BBB8CCCCC`CCC,G8GPDGpPG\GhG`tG|G0GGG@D`x`pAA`DN@6GJ4 0HX4VS_VERSION_INFO,,?dStringFileInfo@040904E4`$Commentshttps://github.com/mhammond/pywin32"CompanyName*FileDescription4 FileVersion3.8.300.0>InternalNamewin32trace.pyd&LegalCopyright*LegalTrademarksFOriginalFilenamewin32trace.pyd0ProductNamePyWin328 ProductVersion3.8.300.0DVarFileInfo$Translation PADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADD$0 00L0r0001]1r11111111 22,272D2i2o2{22222222223 3)3/3N3k3t3z33333333333 444%4+4@4o4u444444444445%5*545_5l5s5555555 666D6P6a6k6x6666666777)7_7h7p7{77777777788 8&858>8M8n88888888888899(9.9Z9`9t9z99999999::,:2:^:d:::::::::::: ;;.;<;A;K;c;i;w;~;;;;;;;;;;;<<%<,<2> >(>/>9>A>H>Q>[>g>p>u>}>>>>>>>>> ???-?5?;?G?M?R?W?b?l?~?????????? 000%0+000:0@0T0_0l0s0}00000000000001 1111"1(1.141:1@1F1L1R1X1^1d1j11122+2<2A2Z2_2l2222233S3e34R44445B6s6666677;7P7W7]7o7y777 88,8F8N8f888888899/9;9G9M9S9_9e999d::::::#;);q;z;;;;;;;K >>>3><>G>N>n>t>z>>>>>>>>>>>>>>>>>>> ??)?9?B?u?{???????????????????0000E0K0Q0W0]0c0j0q0x00000000000001-141D1J1P1V1\1b1h1n1t1z111111111111111111111112 2222"2(2.242:2@2F2L2@$@1H177T8X8`8P;p;;;;;`d000 0000(0,080<0H0L0X0\0x000000000000001111 1$10141@1D1l1x111D2H2P2PK {R win32com/UT Zx`Zx`ux PK Y03K $ win32com/storagecon.pyUT  YZx`ux """Constants related to IStorage and related interfaces This file was generated by h2py from d:\msdev\include\objbase.h then hand edited, a few extra constants added, etc. """ STGC_DEFAULT = 0 STGC_OVERWRITE = 1 STGC_ONLYIFCURRENT = 2 STGC_DANGEROUSLYCOMMITMERELYTODISKCACHE = 4 STGC_CONSOLIDATE = 8 STGTY_STORAGE = 1 STGTY_STREAM = 2 STGTY_LOCKBYTES = 3 STGTY_PROPERTY = 4 STREAM_SEEK_SET = 0 STREAM_SEEK_CUR = 1 STREAM_SEEK_END = 2 LOCK_WRITE = 1 LOCK_EXCLUSIVE = 2 LOCK_ONLYONCE = 4 # Generated as from here. CWCSTORAGENAME = 32 STGM_DIRECT = 0x00000000 STGM_TRANSACTED = 0x00010000 STGM_SIMPLE = 0x08000000 STGM_READ = 0x00000000 STGM_WRITE = 0x00000001 STGM_READWRITE = 0x00000002 STGM_SHARE_DENY_NONE = 0x00000040 STGM_SHARE_DENY_READ = 0x00000030 STGM_SHARE_DENY_WRITE = 0x00000020 STGM_SHARE_EXCLUSIVE = 0x00000010 STGM_PRIORITY = 0x00040000 STGM_DELETEONRELEASE = 0x04000000 STGM_NOSCRATCH = 0x00100000 STGM_CREATE = 0x00001000 STGM_CONVERT = 0x00020000 STGM_FAILIFTHERE = 0x00000000 STGM_NOSNAPSHOT = 0x00200000 ASYNC_MODE_COMPATIBILITY = 0x00000001 ASYNC_MODE_DEFAULT = 0x00000000 STGTY_REPEAT = 0x00000100 STG_TOEND = 0xFFFFFFFF STG_LAYOUT_SEQUENTIAL = 0x00000000 STG_LAYOUT_INTERLEAVED = 0x00000001 ## access rights used with COM server ACL's COM_RIGHTS_EXECUTE = 1 COM_RIGHTS_EXECUTE_LOCAL = 2 COM_RIGHTS_EXECUTE_REMOTE = 4 COM_RIGHTS_ACTIVATE_LOCAL = 8 COM_RIGHTS_ACTIVATE_REMOTE = 16 STGFMT_DOCUMENT = 0 STGFMT_STORAGE = 0 STGFMT_NATIVE = 1 STGFMT_FILE = 3 STGFMT_ANY = 4 STGFMT_DOCFILE = 5 PID_DICTIONARY = 0 PID_CODEPAGE = 1 PID_FIRST_USABLE = 2 PID_FIRST_NAME_DEFAULT = 4095 PID_LOCALE = -2147483648 PID_MODIFY_TIME = -2147483647 PID_SECURITY = -2147483646 PID_BEHAVIOR = -2147483645 PID_ILLEGAL = -1 PID_MIN_READONLY = -2147483648 PID_MAX_READONLY = -1073741825 ## DiscardableInformation PIDDI_THUMBNAIL = 0x00000002 ## SummaryInformation PIDSI_TITLE = 2 PIDSI_SUBJECT = 3 PIDSI_AUTHOR = 4 PIDSI_KEYWORDS = 5 PIDSI_COMMENTS = 6 PIDSI_TEMPLATE = 7 PIDSI_LASTAUTHOR = 8 PIDSI_REVNUMBER = 9 PIDSI_EDITTIME = 10 PIDSI_LASTPRINTED = 11 PIDSI_CREATE_DTM = 12 PIDSI_LASTSAVE_DTM = 13 PIDSI_PAGECOUNT = 14 PIDSI_WORDCOUNT = 15 PIDSI_CHARCOUNT = 16 PIDSI_THUMBNAIL = 17 PIDSI_APPNAME = 18 PIDSI_DOC_SECURITY = 19 ## DocSummaryInformation PIDDSI_CATEGORY = 2 PIDDSI_PRESFORMAT = 3 PIDDSI_BYTECOUNT = 4 PIDDSI_LINECOUNT = 5 PIDDSI_PARCOUNT = 6 PIDDSI_SLIDECOUNT = 7 PIDDSI_NOTECOUNT = 8 PIDDSI_HIDDENCOUNT = 9 PIDDSI_MMCLIPCOUNT = 10 PIDDSI_SCALE = 11 PIDDSI_HEADINGPAIR = 12 PIDDSI_DOCPARTS = 13 PIDDSI_MANAGER = 14 PIDDSI_COMPANY = 15 PIDDSI_LINKSDIRTY = 16 ## MediaFileSummaryInfo PIDMSI_EDITOR = 2 PIDMSI_SUPPLIER = 3 PIDMSI_SOURCE = 4 PIDMSI_SEQUENCE_NO = 5 PIDMSI_PROJECT = 6 PIDMSI_STATUS = 7 PIDMSI_OWNER = 8 PIDMSI_RATING = 9 PIDMSI_PRODUCTION = 10 PIDMSI_COPYRIGHT = 11 ## PROPSETFLAG enum PROPSETFLAG_DEFAULT = 0 PROPSETFLAG_NONSIMPLE = 1 PROPSETFLAG_ANSI = 2 PROPSETFLAG_UNBUFFERED = 4 PROPSETFLAG_CASE_SENSITIVE = 8 ## STGMOVE enum STGMOVE_MOVE = 0 STGMOVE_COPY = 1 STGMOVE_SHALLOWCOPY = 2 PK {Rwin32com/test/UT Zx`Zx`ux PK ѳPu u win32com/test/testADOEvents.pyUT l_Zx`ux from win32com.client import Dispatch, DispatchWithEvents, constants import pythoncom import os import time finished = 0 # Flag for the wait loop from (3) to test class ADOEvents: # event handler class def OnWillConnect(self, str, user, pw, opt, sts, cn): # Must have this event, as if it is not handled, ADO assumes the # operation is cancelled, and raises an error (Operation cancelled # by the user) pass def OnConnectComplete(self, error, status, connection): # Assume no errors, until we have the basic stuff # working. Now, "connection" should be an open # connection to my data source # Do the "something" from (2). For now, just # print the connection data source print("connection is", connection) print("Connected to", connection.Properties("Data Source")) # OK, our work is done. Let the main loop know global finished finished = 1 def OnCommitTransComplete(self, pError, adStatus, pConnection): pass def OnInfoMessage(self, pError, adStatus, pConnection): pass def OnDisconnect(self, adStatus, pConnection): pass def OnBeginTransComplete(self, TransactionLevel, pError, adStatus, pConnection): pass def OnRollbackTransComplete(self, pError, adStatus, pConnection): pass def OnExecuteComplete(self, RecordsAffected, pError, adStatus, pCommand, pRecordset, pConnection): pass def OnWillExecute(self, Source, CursorType, LockType, Options, adStatus, pCommand, pRecordset, pConnection): pass def TestConnection(dbname): # Create the ADO connection object, and link the event # handlers into it c = DispatchWithEvents("ADODB.Connection", ADOEvents) # Initiate the asynchronous open dsn = "Driver={Microsoft Access Driver (*.mdb)};Dbq=%s" % dbname user = "system" pw = "manager" c.Open(dsn, user, pw, constants.adAsyncConnect) # Sit in a loop, until our event handler (above) sets the # "finished" flag or we time out. end_time = time.clock() + 10 while time.clock() < end_time: # Pump messages so that COM gets a look in pythoncom.PumpWaitingMessages() if not finished: print("XXX - Failed to connect!") def Test(): from . import testAccess try: testAccess.GenerateSupport() except pythoncom.com_error: print("*** Can not import the MSAccess type libraries - tests skipped") return dbname = testAccess.CreateTestAccessDatabase() try: TestConnection(dbname) finally: os.unlink(dbname) if __name__=='__main__': Test() PK y=(Oe_UUwin32com/test/testServers.pyUT 6t]Zx`ux import pythoncom, win32com.client.dynamic, sys import winerror import win32com.test.util import unittest def TestConnections(): import win32com.demos.connect win32com.demos.connect.test() class InterpCase(win32com.test.util.TestCase): def setUp(self): # Ensure the correct version registered. from win32com.test.util import RegisterPythonServer from win32com.servers import interp RegisterPythonServer(interp.__file__, "Python.Interpreter") def _testInterp(self, interp): self.assertEquals(interp.Eval("1+1"), 2) win32com.test.util.assertRaisesCOM_HRESULT(self, winerror.DISP_E_TYPEMISMATCH, interp.Eval, 2) def testInproc(self): interp = win32com.client.dynamic.Dispatch("Python.Interpreter", clsctx = pythoncom.CLSCTX_INPROC) self._testInterp(interp) def testLocalServer(self): interp = win32com.client.dynamic.Dispatch("Python.Interpreter", clsctx = pythoncom.CLSCTX_LOCAL_SERVER) self._testInterp(interp) def testAny(self): interp = win32com.client.dynamic.Dispatch("Python.Interpreter") self._testInterp(interp) class ConnectionsTestCase(win32com.test.util.TestCase): def testConnections(self): TestConnections() if __name__=='__main__': unittest.main('testServers') PK ѳP-ppwin32com/test/testDates.pyUT l_Zx`ux from datetime import datetime import unittest import pywintypes import win32com.client import win32com.test.util import win32com.server.util from win32timezone import TimeZoneInfo # A COM object so we can pass dates to and from the COM boundary. class Tester: _public_methods_ = [ 'TestDate' ] def TestDate(self, d): assert isinstance(d, datetime) return d def test_ob(): return win32com.client.Dispatch(win32com.server.util.wrap(Tester())) class TestCase(win32com.test.util.TestCase): def check(self, d, expected = None): if not issubclass(pywintypes.TimeType, datetime): self.skipTest("this is testing pywintypes and datetime") got = test_ob().TestDate(d) self.assertEqual(got, expected or d) def testUTC(self): self.check(datetime(year=2000, month=12, day=25, microsecond=500000, tzinfo=TimeZoneInfo.utc())) def testLocal(self): self.check(datetime(year=2000, month=12, day=25, microsecond=500000, tzinfo=TimeZoneInfo.local())) def testMSTruncated(self): # milliseconds are kept but microseconds are lost after rounding. self.check(datetime(year=2000, month=12, day=25, microsecond=500500, tzinfo=TimeZoneInfo.utc()), datetime(year=2000, month=12, day=25, microsecond=500000, tzinfo=TimeZoneInfo.utc())) if __name__=='__main__': unittest.main() PK Y03KX84  win32com/test/testxslt.xslUT  YZx`ux  function worked() { return "The jscript test worked"; } def worked(): return "The Python test worked" . PK ѳP)W Z win32com/test/GenTestScripts.pyUT l_Zx`ux # # Generate scripts needed for serious testing! # import win32com, win32com.client.makepy import win32com.test import pythoncom import sys, os genList = [ ("msword8", "{00020905-0000-0000-C000-000000000046}",1033,8,0), ] genDir = "Generated4Test" def GetGenPath(): import win32api return os.path.join(win32api.GetFullPathName(win32com.test.__path__[0]), genDir) def GenerateFromRegistered(fname, *loadArgs): # tlb = apply(pythoncom.LoadRegTypeLib, loadArgs) genPath = GetGenPath() try: os.stat(genPath) except os.error: os.mkdir(genPath) # Ensure an __init__ exists. open(os.path.join(genPath, "__init__.py"), "w").close() print(fname, ": generating -", end=' ') f = open(os.path.join(genPath, fname + ".py"), "w") win32com.client.makepy.GenerateFromTypeLibSpec(loadArgs, f, bQuiet = 1, bGUIProgress = 1) f.close() print("compiling -", end=' ') fullModName = "win32com.test.%s.%s" % (genDir, fname) exec("import " + fullModName) # Inject the generated module as a top level module. sys.modules[fname] = sys.modules[fullModName] print("done") def GenerateAll(): for args in genList: try: GenerateFromRegistered(*args) except KeyboardInterrupt: print("** Interrupted ***") break except pythoncom.com_error: print("** Could not generate test code for ", args[0]) def CleanAll(): print("Cleaning generated test scripts...") try: # Clear exceptions! 1/0 except: pass genPath = GetGenPath() for args in genList: try: name = args[0]+".py" os.unlink(os.path.join(genPath, name)) except os.error as details: if type(details)==type(()) and details[0]!=2: print("Could not deleted generated", name, details) try: name = args[0]+".pyc" os.unlink(os.path.join(genPath, name)) except os.error as details: if type(details)==type(()) and details[0]!=2: print("Could not deleted generated", name, details) try: os.unlink(os.path.join(genPath, "__init__.py")) except: pass try: os.unlink(os.path.join(genPath, "__init__.pyc")) except: pass try: os.rmdir(genPath) except os.error as details: print("Could not delete test directory -", details) if __name__=='__main__': GenerateAll() CleanAll() PK ѳP'zC win32com/test/testCollections.pyUT l_Zx`ux # testCollections.py # # This code tests both the client and server side of collections # and enumerators. # # Also has the side effect of testing some of the PythonCOM error semantics. import sys import win32com.server.util import win32com.test.util import win32com.client import traceback import pythoncom import pywintypes import winerror L=pywintypes.Unicode import unittest error = "collection test error" def MakeEmptyEnum(): # create the Python enumerator object as a real COM object o = win32com.server.util.wrap( win32com.server.util.Collection() ) return win32com.client.Dispatch(o) def MakeTestEnum(): # create a sub-collection, just to make sure it works :-) sub = win32com.server.util.wrap( win32com.server.util.Collection( ['Sub1', 2, 'Sub3']) ) # create the Python enumerator object as a real COM object o = win32com.server.util.wrap( win32com.server.util.Collection( [1,'Two',3, sub])) return win32com.client.Dispatch(o) def TestEnumAgainst(o,check): for i in range(len(check)): if o(i) != check[i]: raise error("Using default method gave the incorrect value - %s/%s" % (repr(o(i)), repr(check[i]))) for i in range(len(check)): if o.Item(i) != check[i]: raise error("Using Item method gave the incorrect value - %s/%s" % (repr(o(i)), repr(check[i]))) # First try looping. cmp = [] for s in o: cmp.append(s) if cmp[:len(check)] != check: raise error("Result after looping isnt correct - %s/%s" % (repr(cmp[:len(check)]), repr(check))) for i in range(len(check)): if o[i] != check[i]: raise error("Using indexing gave the incorrect value") def TestEnum(quiet=None): if quiet is None: quiet = not "-v" in sys.argv if not quiet: print("Simple enum test") o = MakeTestEnum() check = [1,'Two',3] TestEnumAgainst(o, check) if not quiet: print("sub-collection test") sub = o[3] TestEnumAgainst(sub ,['Sub1', 2, 'Sub3']) # Remove the sublist for this test! o.Remove(o.Count()-1) if not quiet: print("Remove item test") del check[1] o.Remove(1) TestEnumAgainst(o, check) if not quiet: print("Add item test") o.Add('New Item') check.append('New Item') TestEnumAgainst(o, check) if not quiet: print("Insert item test") o.Insert(2, -1) check.insert(2, -1) TestEnumAgainst(o, check) ### This does not work! # if not quiet: print "Indexed replace item test" # o[2] = 'Replaced Item' # check[2] = 'Replaced Item' # TestEnumAgainst(o, check) try: o() raise error("default method with no args worked when it shouldnt have!") except pythoncom.com_error as exc: if exc.hresult != winerror.DISP_E_BADPARAMCOUNT: raise error("Expected DISP_E_BADPARAMCOUNT - got %s" % (exc,)) try: o.Insert("foo", 2) raise error("Insert worked when it shouldnt have!") except pythoncom.com_error as exc: if exc.hresult != winerror.DISP_E_TYPEMISMATCH: raise error("Expected DISP_E_TYPEMISMATCH - got %s" % (exc,)) # Remove the sublist for this test! try: o.Remove(o.Count()) raise error("Remove worked when it shouldnt have!") except pythoncom.com_error as exc: if exc.hresult != winerror.DISP_E_BADINDEX: raise error("Expected DISP_E_BADINDEX - got %s" % (exc,)) # Test an empty collection if not quiet: print("Empty collection test") o = MakeEmptyEnum() for item in o: raise error("Empty list performed an iteration") try: ob = o[1] raise error("Empty list could be indexed") except IndexError: pass try: ob = o[0] raise error("Empty list could be indexed") except IndexError: pass try: ob = o(0) raise error("Empty list could be indexed") except pythoncom.com_error as exc: if exc.hresult != winerror.DISP_E_BADINDEX: raise error("Expected DISP_E_BADINDEX - got %s" % (exc,)) class TestCase(win32com.test.util.TestCase): def testEnum(self): TestEnum() if __name__=='__main__': unittest.main() PK ѳPzzwin32com/test/testxslt.pyUT l_Zx`ux import os import tempfile import unittest import win32com.test.util expected_output = "The jscript test worked.\nThe Python test worked" class XSLT(win32com.test.util.TestCase): def testAll(self): output_name = tempfile.mktemp("-pycom-test") cmd = "cscript //nologo testxslt.js doesnt_matter.xml testxslt.xsl " + output_name win32com.test.util.ExecuteShellCommand(cmd, self) try: f=open(output_name) try: got = f.read() if got != expected_output: print("ERROR: XSLT expected output of %r" % (expected_output,)) print("but got %r" % (got,)) finally: f.close() finally: try: os.unlink(output_name) except os.error: pass if __name__=='__main__': unittest.main() PK ѳP[ win32com/test/testDictionary.pyUT l_Zx`ux # testDictionary.py # import sys import datetime import time import win32com.server.util import win32com.test.util import win32com.client import traceback import pythoncom import pywintypes import winerror import win32timezone import unittest def MakeTestDictionary(): return win32com.client.Dispatch("Python.Dictionary") def TestDictAgainst(dict,check): for key, value in list(check.items()): if dict(key) != value: raise Exception("Indexing for '%s' gave the incorrect value - %s/%s" % (repr(key), repr(dict[key]), repr(check[key]))) # Ensure we have the correct version registered. def Register(quiet): import win32com.servers.dictionary from win32com.test.util import RegisterPythonServer RegisterPythonServer(win32com.servers.dictionary.__file__, 'Python.Dictionary') def TestDict(quiet=None): if quiet is None: quiet = not "-v" in sys.argv Register(quiet) if not quiet: print("Simple enum test") dict = MakeTestDictionary() checkDict = {} TestDictAgainst(dict, checkDict) dict["NewKey"] = "NewValue" checkDict["NewKey"] = "NewValue" TestDictAgainst(dict, checkDict) dict["NewKey"] = None del checkDict["NewKey"] TestDictAgainst(dict, checkDict) if issubclass(pywintypes.TimeType, datetime.datetime): now = win32timezone.now() # We want to keep the milliseconds but discard microseconds as they # don't survive the conversion. now = now.replace(microsecond = round(now.microsecond / 1000) * 1000) else: now = pythoncom.MakeTime(time.gmtime(time.time())) dict["Now"] = now checkDict["Now"] = now TestDictAgainst(dict, checkDict) if not quiet: print("Failure tests") try: dict() raise Exception("default method with no args worked when it shouldnt have!") except pythoncom.com_error as xxx_todo_changeme: (hr, desc, exc, argErr) = xxx_todo_changeme.args if hr != winerror.DISP_E_BADPARAMCOUNT: raise Exception("Expected DISP_E_BADPARAMCOUNT - got %d (%s)" % (hr, desc)) try: dict("hi", "there") raise Exception("multiple args worked when it shouldnt have!") except pythoncom.com_error as xxx_todo_changeme1: (hr, desc, exc, argErr) = xxx_todo_changeme1.args if hr != winerror.DISP_E_BADPARAMCOUNT: raise Exception("Expected DISP_E_BADPARAMCOUNT - got %d (%s)" % (hr, desc)) try: dict(0) raise Exception("int key worked when it shouldnt have!") except pythoncom.com_error as xxx_todo_changeme2: (hr, desc, exc, argErr) = xxx_todo_changeme2.args if hr != winerror.DISP_E_TYPEMISMATCH: raise Exception("Expected DISP_E_TYPEMISMATCH - got %d (%s)" % (hr, desc)) if not quiet: print("Python.Dictionary tests complete.") class TestCase(win32com.test.util.TestCase): def testDict(self): TestDict() if __name__=='__main__': unittest.main() PK ѳPQwin32com/test/testPersist.pyUT l_Zx`ux import pythoncom import win32com.server.util import time import win32com, sys, string, win32api, traceback import win32com.client.dynamic import win32com.client import pythoncom from win32com.axcontrol import axcontrol from pywintypes import Unicode from win32com import storagecon from win32com.test.util import CheckClean import pywintypes import win32ui import win32api, os from pywin32_testutil import str2bytes S_OK = 0 import datetime if issubclass(pywintypes.TimeType, datetime.datetime): import win32timezone now = win32timezone.now() else: now = pywintypes.Time(time.time()) class LockBytes: _public_methods_ = [ 'ReadAt', 'WriteAt', 'Flush', 'SetSize', 'LockRegion', 'UnlockRegion', 'Stat' ] _com_interfaces_ = [ pythoncom.IID_ILockBytes ] def __init__(self, data = ""): self.data = str2bytes(data) self.ctime = now self.mtime = now self.atime = now def ReadAt(self, offset, cb): print("ReadAt") result = self.data[offset:offset + cb] return result def WriteAt(self, offset, data): print("WriteAt " +str(offset)) print("len " + str(len(data))) print("data:") #print data if len(self.data) >= offset: newdata = self.data[0:offset] + data print(len(newdata)) if len(self.data) >= offset + len(data): newdata = newdata + self.data[offset + len(data):] print(len(newdata)) self.data = newdata return len(data) def Flush(self, whatsthis=0): print("Flush" + str(whatsthis)) fname = os.path.join(win32api.GetTempPath(), "persist.doc") open(fname, "wb").write(self.data) return S_OK def SetSize(self, size): print("Set Size" + str(size)) if size > len(self.data): self.data = self.data + str2bytes("\000" * (size - len(self.data))) else: self.data = self.data[0:size] return S_OK def LockRegion(self, offset, size, locktype): print("LockRegion") pass def UnlockRegion(self, offset, size, locktype): print("UnlockRegion") pass def Stat(self, statflag): print("returning Stat " + str(statflag)) return ( "PyMemBytes", storagecon.STGTY_LOCKBYTES, len(self.data), self.mtime, self.ctime, self.atime, storagecon.STGM_DIRECT|storagecon.STGM_READWRITE|storagecon.STGM_CREATE , storagecon.STGM_SHARE_EXCLUSIVE, "{00020905-0000-0000-C000-000000000046}", 0, # statebits ? 0 ) class OleClientSite: _public_methods_ = [ 'SaveObject', 'GetMoniker', 'GetContainer', 'ShowObject', 'OnShowWindow', 'RequestNewObjectLayout' ] _com_interfaces_ = [ axcontrol.IID_IOleClientSite ] def __init__(self, data = ""): self.IPersistStorage = None self.IStorage = None def SetIPersistStorage(self, IPersistStorage): self.IPersistStorage = IPersistStorage def SetIStorage(self, IStorage): self.IStorage = IStorage def SaveObject(self): print("SaveObject") if self.IPersistStorage != None and self.IStorage != None: self.IPersistStorage.Save(self.IStorage,1) self.IStorage.Commit(0) return S_OK def GetMoniker(self, dwAssign, dwWhichMoniker): print("GetMoniker " + str(dwAssign) + " " + str(dwWhichMoniker)) def GetContainer(self): print("GetContainer") def ShowObject(self): print("ShowObject") def OnShowWindow(self, fShow): print("ShowObject" + str(fShow)) def RequestNewObjectLayout(self): print("RequestNewObjectLayout") def test(): # create a LockBytes object and #wrap it as a COM object # import win32com.server.dispatcher lbcom = win32com.server.util.wrap(LockBytes(), pythoncom.IID_ILockBytes) #, useDispatcher=win32com.server.dispatcher.DispatcherWin32trace) # create a structured storage on the ILockBytes object stcom = pythoncom.StgCreateDocfileOnILockBytes(lbcom, storagecon.STGM_DIRECT| storagecon.STGM_CREATE | storagecon.STGM_READWRITE | storagecon.STGM_SHARE_EXCLUSIVE, 0) # create our ClientSite ocs = OleClientSite() # wrap it as a COM object ocscom = win32com.server.util.wrap(ocs, axcontrol.IID_IOleClientSite) # create a Word OLE Document, connect it to our site and our storage oocom=axcontrol.OleCreate("{00020906-0000-0000-C000-000000000046}", axcontrol.IID_IOleObject, 0, (0,), ocscom, stcom, ) mf=win32ui.GetMainFrame() hwnd=mf.GetSafeHwnd() # Set the host and document name # for unknown reason document name becomes hostname, and document name # is not set, debugged it, but don't know where the problem is? oocom.SetHostNames("OTPython", "This is Cool") # activate the OLE document oocom.DoVerb( -1, ocscom, 0, hwnd, mf.GetWindowRect()) # set the hostnames again oocom.SetHostNames("OTPython2", "ThisisCool2") # get IDispatch of Word doc=win32com.client.Dispatch(oocom.QueryInterface(pythoncom.IID_IDispatch)) # get IPersistStorage of Word dpcom=oocom.QueryInterface(pythoncom.IID_IPersistStorage) # let our ClientSite know the interfaces ocs.SetIPersistStorage(dpcom) ocs.SetIStorage(stcom) # use IDispatch to do the Office Word test # pasted from TestOffice.py wrange = doc.Range() for i in range(10): wrange.InsertAfter("Hello from Python %d\n" % i) paras = doc.Paragraphs for i in range(len(paras)): paras[i]().Font.ColorIndex = i+1 paras[i]().Font.Size = 12 + (4 * i) # XXX - note that # for para in paras: # para().Font... # doesnt seem to work - no error, just doesnt work # Should check if it works for VB! dpcom.Save(stcom, 0) dpcom.HandsOffStorage() # oocom.Close(axcontrol.OLECLOSE_NOSAVE) # or OLECLOSE_SAVEIFDIRTY, but it fails??? #Save the ILockBytes data to "persist2.doc" lbcom.Flush() #exiting Winword will automatically update the ILockBytes data #and flush it to "%TEMP%\persist.doc" doc.Application.Quit() if __name__=='__main__': test() pythoncom.CoUninitialize() CheckClean() PK v,XQѵꝮ""win32com/test/testall.pyUT 0_Zx`ux import sys, os, string, re import pythoncom import win32com.client from win32com.test.util import CheckClean, TestCase, \ CapturingFunctionTestCase, ShellTestCase, \ TestLoader, TestRunner, RegisterPythonServer import traceback import getopt import unittest verbosity = 1 # default unittest verbosity. try: this_file = __file__ except NameError: this_file = sys.argv[0] def GenerateAndRunOldStyle(): from . import GenTestScripts GenTestScripts.GenerateAll() try: pass # finally: GenTestScripts.CleanAll() def CleanGenerated(): import win32com, shutil if os.path.isdir(win32com.__gen_path__): if verbosity > 1: print("Deleting files from %s" % (win32com.__gen_path__)) shutil.rmtree(win32com.__gen_path__) import win32com.client.gencache win32com.client.gencache.__init__() # Reset def RemoveRefCountOutput(data): while 1: last_line_pos = data.rfind("\n") if not re.match("\[\d+ refs\]", data[last_line_pos+1:]): break if last_line_pos < 0: # All the output return '' data = data[:last_line_pos] return data def ExecuteSilentlyIfOK(cmd, testcase): f = os.popen(cmd) data = f.read().strip() rc = f.close() if rc: print(data) testcase.fail("Executing '%s' failed (%d)" % (cmd, rc)) # for "_d" builds, strip the '[xxx refs]' line return RemoveRefCountOutput(data) class PyCOMTest(TestCase): no_leak_tests = True # done by the test itself def testit(self): # Check that the item is registered, so we get the correct # 'skipped' behaviour (and recorded as such) rather than either # error or silence due to non-registration. RegisterPythonServer(os.path.join(os.path.dirname(__file__), '..', "servers", "test_pycomtest.py"), "Python.Test.PyCOMTest") # Execute testPyComTest in its own process so it can play # with the Python thread state fname = os.path.join(os.path.dirname(this_file), "testPyComTest.py") cmd = '%s "%s" -q 2>&1' % (sys.executable, fname) data = ExecuteSilentlyIfOK(cmd, self) class PippoTest(TestCase): def testit(self): # Check we are registered before spawning the process. from win32com.test import pippo_server RegisterPythonServer(pippo_server.__file__, "Python.Test.Pippo") python = sys.executable fname = os.path.join(os.path.dirname(this_file), "testPippo.py") cmd = '%s "%s" 2>&1' % (python, fname) ExecuteSilentlyIfOK(cmd, self) # This is a list of "win32com.test.???" module names, optionally with a # function in that module if the module isn't unitest based... unittest_modules = [ # Level 1 tests. """testIterators testvbscript_regexp testStorage testStreams testWMI policySemantics testShell testROT testAXScript testxslt testDictionary testCollections testServers errorSemantics.test testvb testArrays testClipboard testMarshal testConversionsErrors """.split(), # Level 2 tests. """testMSOffice.TestAll testMSOfficeEvents.test testAccess.test testExplorer.TestAll testExchange.test """.split(), # Level 3 tests. """testmakepy.TestAll """.split() ] # A list of other unittest modules we use - these are fully qualified module # names and the module is assumed to be unittest based. unittest_other_modules = [ # Level 1 tests. """win32com.directsound.test.ds_test """.split(), # Level 2 tests. [], # Level 3 tests. [] ] output_checked_programs = [ # Level 1 tests. [ ("cscript.exe /nologo //E:vbscript testInterp.vbs", "VBScript test worked OK"), ("cscript.exe /nologo //E:vbscript testDictionary.vbs", "VBScript has successfully tested Python.Dictionary"), ], # Level 2 tests. [ ], # Level 3 tests [ ], ] custom_test_cases = [ # Level 1 tests. [ PyCOMTest, PippoTest, ], # Level 2 tests. [ ], # Level 3 tests [ ], ] def get_test_mod_and_func(test_name, import_failures): if test_name.find(".")>0: mod_name, func_name = test_name.split(".") else: mod_name = test_name func_name = None fq_mod_name = "win32com.test." + mod_name try: __import__(fq_mod_name) mod = sys.modules[fq_mod_name] except: import_failures.append((mod_name, sys.exc_info()[:2])) return None, None if func_name is None: func = None else: func = getattr(mod, func_name) return mod, func # Return a test suite all loaded with the tests we want to run def make_test_suite(test_level = 1): suite = unittest.TestSuite() import_failures = [] loader = TestLoader() for i in range(testLevel): for mod_name in unittest_modules[i]: mod, func = get_test_mod_and_func(mod_name, import_failures) if mod is None: continue if func is not None: test = CapturingFunctionTestCase(func, description=mod_name) else: if hasattr(mod, "suite"): test = mod.suite() else: test = loader.loadTestsFromModule(mod) assert test.countTestCases() > 0, "No tests loaded from %r" % mod suite.addTest(test) for cmd, output in output_checked_programs[i]: suite.addTest(ShellTestCase(cmd, output)) for test_class in custom_test_cases[i]: suite.addTest(unittest.defaultTestLoader.loadTestsFromTestCase(test_class)) # other "normal" unittest modules. for i in range(testLevel): for mod_name in unittest_other_modules[i]: try: __import__(mod_name) except: import_failures.append((mod_name, sys.exc_info()[:2])) continue mod = sys.modules[mod_name] if hasattr(mod, "suite"): test = mod.suite() else: test = loader.loadTestsFromModule(mod) assert test.countTestCases() > 0, "No tests loaded from %r" % mod suite.addTest(test) return suite, import_failures def usage(why): print(why) print() print("win32com test suite") print("usage: testall [-v] test_level") print(" where test_level is an integer 1-3. Level 1 tests are quick,") print(" level 2 tests invoke Word, IE etc, level 3 take ages!") sys.exit(1) if __name__=='__main__': try: opts, args = getopt.getopt(sys.argv[1:], "v") except getopt.error as why: usage(why) for opt, val in opts: if opt=='-v': verbosity += 1 testLevel = 1 # default to quick test test_names = [] for arg in args: try: testLevel = int(arg) if testLevel < 0 or testLevel > 3: raise ValueError("Only levels 1-3 are supported") except ValueError: test_names.append(arg) if test_names: usage("Test names are not supported yet") CleanGenerated() suite, import_failures = make_test_suite(testLevel) if verbosity: if hasattr(sys, "gettotalrefcount"): print("This is a debug build - memory leak tests will also be run.") print("These tests may take *many* minutes to run - be patient!") print("(running from python.exe will avoid these leak tests)") print("Executing level %d tests - %d test cases will be run" \ % (testLevel, suite.countTestCases())) if verbosity==1 and suite.countTestCases() < 70: # A little row of markers so the dots show how close to finished print('|' * suite.countTestCases()) testRunner = TestRunner(verbosity=verbosity) testResult = testRunner.run(suite) if import_failures: testResult.stream.writeln("*** The following test modules could not be imported ***") for mod_name, (exc_type, exc_val) in import_failures: desc = '\n'.join(traceback.format_exception_only(exc_type, exc_val)) testResult.stream.write("%s: %s" % (mod_name, desc)) testResult.stream.writeln("*** %d test(s) could not be run ***" % len(import_failures)) # re-print unit-test error here so it is noticed if not testResult.wasSuccessful(): print("*" * 20, "- unittest tests FAILED") CheckClean() pythoncom.CoUninitialize() CleanGenerated() PK ѳPN win32com/test/pippo_server.pyUT l_Zx`ux # A little test server, complete with typelib, we can use for testing. # Originally submitted with bug: # [ 753154 ] memory leak wrapping object having _typelib_guid_ attribute # but modified by mhammond for use as part of the test suite. import sys, os import pythoncom import win32com import winerror from win32com.server.util import wrap class CPippo: # # COM declarations # _reg_clsid_ = "{1F0F75D6-BD63-41B9-9F88-2D9D2E1AA5C3}" _reg_desc_ = "Pippo Python test object" _reg_progid_ = "Python.Test.Pippo" #_reg_clsctx_ = pythoncom.CLSCTX_LOCAL_SERVER ### ### Link to typelib _typelib_guid_ = '{7783054E-9A20-4584-8C62-6ED2A08F6AC6}' _typelib_version_ = 1, 0 _com_interfaces_ = ['IPippo'] def __init__(self): self.MyProp1 = 10 def Method1(self): return wrap(CPippo()) def Method2(self, in1, inout1): return in1, inout1 * 2 def Method3(self, in1): # in1 will be a tuple, not a list. # Yet, we are not allowed to return a tuple, but need to convert it to a list first. (Bug?) return list(in1) def BuildTypelib(): from distutils.dep_util import newer this_dir = os.path.dirname(__file__) idl = os.path.abspath(os.path.join(this_dir, "pippo.idl")) tlb=os.path.splitext(idl)[0] + '.tlb' if newer(idl, tlb): print("Compiling %s" % (idl,)) rc = os.system ('midl "%s"' % (idl,)) if rc: raise RuntimeError("Compiling MIDL failed!") # Can't work out how to prevent MIDL from generating the stubs. # just nuke them for fname in "dlldata.c pippo_i.c pippo_p.c pippo.h".split(): os.remove(os.path.join(this_dir, fname)) print("Registering %s" % (tlb,)) tli=pythoncom.LoadTypeLib(tlb) pythoncom.RegisterTypeLib(tli,tlb) def UnregisterTypelib(): k = CPippo try: pythoncom.UnRegisterTypeLib(k._typelib_guid_, k._typelib_version_[0], k._typelib_version_[1], 0, pythoncom.SYS_WIN32) print("Unregistered typelib") except pythoncom.error as details: if details[0]==winerror.TYPE_E_REGISTRYACCESS: pass else: raise def main(argv=None): if argv is None: argv = sys.argv[1:] if '--unregister' in argv: # Unregister the type-libraries. UnregisterTypelib() else: # Build and register the type-libraries. BuildTypelib() import win32com.server.register win32com.server.register.UseCommandLine(CPippo) if __name__=='__main__': main(sys.argv) PK R='O&z z win32com/test/testPippo.pyUT l_s]Zx`ux import sys import unittest import pythoncom from win32com.client import Dispatch from win32com.client.gencache import EnsureDispatch class PippoTester(unittest.TestCase): def setUp(self): from win32com.test.util import RegisterPythonServer from win32com.test import pippo_server RegisterPythonServer(pippo_server.__file__, "Python.Test.Pippo") # create it. self.object = Dispatch("Python.Test.Pippo") def testLeaks(self): try: gtrc = sys.gettotalrefcount except AttributeError: print("Please run this with python_d for leak tests") gtrc = lambda: 0 # note creating self.object() should have consumed our "one time" leaks self.object.Method1() start = gtrc() for i in range(1000): object = Dispatch("Python.Test.Pippo") object.Method1() object = None end = gtrc() if end-start > 5: self.fail("We lost %d references!" % (end-start,)) def testResults(self): rc, out1 = self.object.Method2(123, 111) self.assertEqual(rc, 123) self.assertEqual(out1, 222) def testPythonArrays(self): self._testArray([-3, -2, -1, 0, 1, 2, 3]) self._testArray([-3.14, -2, -.1, 0., 1.1, 2.5, 3]) def testNumpyArrays(self): try: import numpy except: print("Numpy test not possible because numpy module failed to import") return self._testArray(numpy.array([-3, -2, -1, 0, 1, 2, 3])) self._testArray(numpy.array([-3.14, -2, -.1, 0., 1.1, 2.5, 3])) def testByteArrays(self): if 'bytes' in dir(__builtins__): # Use eval to avoid compilation error in Python 2. self._testArray(eval("b'abcdef'")) self._testArray(eval("bytearray(b'abcdef')")) def _testArray(self, inArray): outArray = self.object.Method3(inArray) self.assertEqual(list(outArray), list(inArray)) def testLeaksGencache(self): try: gtrc = sys.gettotalrefcount except AttributeError: print("Please run this with python_d for leak tests") gtrc = lambda: 0 # note creating self.object() should have consumed our "one time" leaks object = EnsureDispatch("Python.Test.Pippo") start = gtrc() for i in range(1000): object = EnsureDispatch("Python.Test.Pippo") object.Method1() object = None end = gtrc() if end-start > 10: self.fail("We lost %d references!" % (end-start,)) if __name__=='__main__': unittest.main() PK #KQ{win32com/test/util.pyUT "_Zx`ux import sys, os import win32api import tempfile import unittest import gc import pywintypes import pythoncom import winerror from pythoncom import _GetInterfaceCount, _GetGatewayCount import win32com import logging import winreg import io as StringIO import pywin32_testutil from pywin32_testutil import TestLoader, TestResult, TestRunner, LeakTestCase def CheckClean(): # Ensure no lingering exceptions - Python should have zero outstanding # COM objects try: sys.exc_clear() except AttributeError: pass # py3k c = _GetInterfaceCount() if c: print("Warning - %d com interface objects still alive" % c) c = _GetGatewayCount() if c: print("Warning - %d com gateway objects still alive" % c) def RegisterPythonServer(filename, progids=None, verbose=0): if progids: if isinstance(progids, str): progids = [progids] # we know the CLSIDs we need, but we might not be an admin user # and otherwise unable to register them. So as long as the progids # exist and the DLL points at our version, assume it already is. why_not = None for progid in progids: try: clsid = pywintypes.IID(progid) except pythoncom.com_error: # not registered. break try: HKCR = winreg.HKEY_CLASSES_ROOT hk = winreg.OpenKey(HKCR, "CLSID\\%s" % clsid) dll = winreg.QueryValue(hk, "InprocServer32") except WindowsError: # no CLSID or InProcServer32 - not registered break ok_files = [os.path.basename(pythoncom.__file__), 'pythoncomloader%d%d.dll' % (sys.version_info[0], sys.version_info[1])] if os.path.basename(dll) not in ok_files: why_not = "%r is registered against a different Python version (%s)" % (progid, dll) break else: #print "Skipping registration of '%s' - already registered" % filename return # needs registration - see if its likely! try: from win32com.shell.shell import IsUserAnAdmin except ImportError: print("Can't import win32com.shell - no idea if you are an admin or not?") is_admin = False else: try: is_admin = IsUserAnAdmin() except pythoncom.com_error: # old, less-secure OS - assume *is* admin. is_admin = True if not is_admin: msg = "%r isn't registered, but I'm not an administrator who can register it." % progids[0] if why_not: msg += "\n(registration check failed as %s)" % why_not # throw a normal "class not registered" exception - we don't report # them the same way as "real" errors. raise pythoncom.com_error(winerror.CO_E_CLASSSTRING, msg, None, -1) # so theoretically we are able to register it. cmd = '%s "%s" --unattended > nul 2>&1' % (win32api.GetModuleFileName(0), filename) if verbose: print("Registering engine", filename) # print cmd rc = os.system(cmd) if rc: print("Registration command was:") print(cmd) raise RuntimeError("Registration of engine '%s' failed" % filename) def ExecuteShellCommand(cmd, testcase, expected_output = None, # Set to '' to check for nothing tracebacks_ok = 0, # OK if the output contains a t/b? ): output_name = tempfile.mktemp('win32com_test') cmd = cmd + ' > "%s" 2>&1' % output_name rc = os.system(cmd) output = open(output_name, "r").read().strip() os.remove(output_name) class Failed(Exception): pass try: if rc: raise Failed("exit code was " + str(rc)) if expected_output is not None and output != expected_output: raise Failed("Expected output %r (got %r)" % (expected_output, output)) if not tracebacks_ok and \ output.find("Traceback (most recent call last)")>=0: raise Failed("traceback in program output") return output except Failed as why: print("Failed to exec command '%r'" % cmd) print("Failed as", why) print("** start of program output **") print(output) print("** end of program output **") testcase.fail("Executing '%s' failed as %s" % (cmd, why)) def assertRaisesCOM_HRESULT(testcase, hresult, func, *args, **kw): try: func(*args, **kw) except pythoncom.com_error as details: if details.hresult==hresult: return testcase.fail("Excepected COM exception with HRESULT 0x%x" % hresult) class CaptureWriter: def __init__(self): self.old_err = self.old_out = None self.clear() def capture(self): self.clear() self.old_out = sys.stdout self.old_err = sys.stderr sys.stdout = sys.stderr = self def release(self): if self.old_out: sys.stdout = self.old_out self.old_out = None if self.old_err: sys.stderr = self.old_err self.old_err = None def clear(self): self.captured = [] def write(self, msg): self.captured.append(msg) def get_captured(self): return "".join(self.captured) def get_num_lines_captured(self): return len("".join(self.captured).split("\n")) # Utilities to set the win32com logger to something what just captures # records written and doesn't print them. class LogHandler(logging.Handler): def __init__(self): self.emitted = [] logging.Handler.__init__(self) def emit(self, record): self.emitted.append(record) _win32com_logger = None def setup_test_logger(): old_log = getattr(win32com, "logger", None) global _win32com_logger if _win32com_logger is None: _win32com_logger = logging.Logger('test') handler = LogHandler() _win32com_logger.addHandler(handler) win32com.logger = _win32com_logger handler = _win32com_logger.handlers[0] handler.emitted = [] return handler.emitted, old_log def restore_test_logger(prev_logger): assert prev_logger is None, "who needs this?" if prev_logger is None: del win32com.logger else: win32com.logger = prev_logger # We used to override some of this (and may later!) TestCase = unittest.TestCase def CapturingFunctionTestCase(*args, **kw): real_test = _CapturingFunctionTestCase(*args, **kw) return LeakTestCase(real_test) class _CapturingFunctionTestCase(unittest.FunctionTestCase):#, TestCaseMixin): def __call__(self, result=None): if result is None: result = self.defaultTestResult() writer = CaptureWriter() #self._preTest() writer.capture() try: unittest.FunctionTestCase.__call__(self, result) if getattr(self, "do_leak_tests", 0) and hasattr(sys, "gettotalrefcount"): self.run_leak_tests(result) finally: writer.release() #self._postTest(result) output = writer.get_captured() self.checkOutput(output, result) if result.showAll: print(output) def checkOutput(self, output, result): if output.find("Traceback")>=0: msg = "Test output contained a traceback\n---\n%s\n---" % output result.errors.append((self, msg)) class ShellTestCase(unittest.TestCase): def __init__(self, cmd, expected_output): self.__cmd = cmd self.__eo = expected_output unittest.TestCase.__init__(self) def runTest(self): ExecuteShellCommand(self.__cmd, self, self.__eo) def __str__(self): max = 30 if len(self.__cmd)>max: cmd_repr = self.__cmd[:max] + "..." else: cmd_repr = self.__cmd return "exec: " + cmd_repr def testmain(*args, **kw): pywin32_testutil.testmain(*args, **kw) CheckClean() PK <RQU:nnwin32com/test/testPyComTest.pyUT $_Zx`ux # NOTE - Still seems to be a leak here somewhere # gateway count doesnt hit zero. Hence the print statements! import sys; sys.coinit_flags=0 # Must be free-threaded! import win32api, pythoncom, time import pywintypes import os import winerror import win32com import win32com.client.connect from win32com.test.util import CheckClean from win32com.client import constants, DispatchBaseClass, CastTo, VARIANT from win32com.test.util import RegisterPythonServer from pywin32_testutil import str2memory import datetime import decimal import win32timezone importMsg = "**** PyCOMTest is not installed ***\n PyCOMTest is a Python test specific COM client and server.\n It is likely this server is not installed on this machine\n To install the server, you must get the win32com sources\n and build it using MS Visual C++" error = Exception # This test uses a Python implemented COM server - ensure correctly registered. RegisterPythonServer(os.path.join(os.path.dirname(__file__), '..', "servers", "test_pycomtest.py"), "Python.Test.PyCOMTest") from win32com.client import gencache try: gencache.EnsureModule('{6BCDCB60-5605-11D0-AE5F-CADD4C000000}', 0, 1, 1) except pythoncom.com_error: print("The PyCOMTest module can not be located or generated.") print(importMsg) raise RuntimeError(importMsg) # We had a bg where RegisterInterfaces would fail if gencache had # already been run - exercise that here from win32com import universal universal.RegisterInterfaces('{6BCDCB60-5605-11D0-AE5F-CADD4C000000}', 0, 1, 1) verbose = 0 # convert a normal int to a long int - used to avoid, eg, '1L' for py3k # friendliness def ensure_long(int_val): if sys.version_info > (3,): # py3k - no such thing as a 'long' return int_val # on py2x, we just use an expression that results in a long return 0x100000000-0x100000000+int_val def check_get_set(func, arg): got = func(arg) if got != arg: raise error("%s failed - expected %r, got %r" % (func, arg, got)) def check_get_set_raises(exc, func, arg): try: got = func(arg) except exc as e: pass # what we expect! else: raise error("%s with arg %r didn't raise %s - returned %r" % (func, arg, exc, got)) def progress(*args): if verbose: for arg in args: print(arg, end=' ') print() def TestApplyResult(fn, args, result): try: fnName = str(fn).split()[1] except: fnName = str(fn) progress("Testing ", fnName) pref = "function " + fnName rc = fn(*args) if rc != result: raise error("%s failed - result not %r but %r" % (pref, result, rc)) def TestConstant(constName, pyConst): try: comConst = getattr(constants, constName) except: raise error("Constant %s missing" % (constName,)) if comConst != pyConst: raise error("Constant value wrong for %s - got %s, wanted %s" % (constName, comConst, pyConst)) # Simple handler class. This demo only fires one event. class RandomEventHandler: def _Init(self): self.fireds = {} def OnFire(self, no): try: self.fireds[no] = self.fireds[no] + 1 except KeyError: self.fireds[no] = 0 def OnFireWithNamedParams(self, no, a_bool, out1, out2): # This test exists mainly to help with an old bug, where named # params would come in reverse. Missing = pythoncom.Missing if no is not Missing: # We know our impl called 'OnFire' with the same ID assert no in self.fireds assert no+1==out1, "expecting 'out1' param to be ID+1" assert no+2==out2, "expecting 'out2' param to be ID+2" # The middle must be a boolean. assert a_bool is Missing or type(a_bool)==bool, "middle param not a bool" return out1+2, out2+2 def _DumpFireds(self): if not self.fireds: print("ERROR: Nothing was received!") for firedId, no in self.fireds.items(): progress("ID %d fired %d times" % (firedId, no)) # A simple handler class that derives from object (ie, a "new style class") - # only relevant for Python 2.x (ie, the 2 classes should be identical in 3.x) class NewStyleRandomEventHandler(object): def _Init(self): self.fireds = {} def OnFire(self, no): try: self.fireds[no] = self.fireds[no] + 1 except KeyError: self.fireds[no] = 0 def OnFireWithNamedParams(self, no, a_bool, out1, out2): # This test exists mainly to help with an old bug, where named # params would come in reverse. Missing = pythoncom.Missing if no is not Missing: # We know our impl called 'OnFire' with the same ID assert no in self.fireds assert no+1==out1, "expecting 'out1' param to be ID+1" assert no+2==out2, "expecting 'out2' param to be ID+2" # The middle must be a boolean. assert a_bool is Missing or type(a_bool)==bool, "middle param not a bool" return out1+2, out2+2 def _DumpFireds(self): if not self.fireds: print("ERROR: Nothing was received!") for firedId, no in self.fireds.items(): progress("ID %d fired %d times" % (firedId, no)) # Test everything which can be tested using both the "dynamic" and "generated" # COM objects (or when there are very subtle differences) def TestCommon(o, is_generated): progress("Getting counter") counter = o.GetSimpleCounter() TestCounter(counter, is_generated) progress("Checking default args") rc = o.TestOptionals() if rc[:-1] != ("def", 0, 1) or abs(rc[-1]-3.14)>.01: print(rc) raise error("Did not get the optional values correctly") rc = o.TestOptionals("Hi", 2, 3, 1.1) if rc[:-1] != ("Hi", 2, 3) or abs(rc[-1]-1.1)>.01: print(rc) raise error("Did not get the specified optional values correctly") rc = o.TestOptionals2(0) if rc != (0, "", 1): print(rc) raise error("Did not get the optional2 values correctly") rc = o.TestOptionals2(1.1, "Hi", 2) if rc[1:] != ("Hi", 2) or abs(rc[0]-1.1)>.01: print(rc) raise error("Did not get the specified optional2 values correctly") progress("Checking getting/passing IUnknown") check_get_set(o.GetSetUnknown, o) progress("Checking getting/passing IDispatch") if not isinstance(o.GetSetDispatch(o), o.__class__): raise error("GetSetDispatch failed: %r" % (o.GetSetDispatch(o),)) progress("Checking getting/passing IDispatch of known type") if o.GetSetInterface(o).__class__ != o.__class__: raise error("GetSetDispatch failed") progress("Checking misc args") check_get_set(o.GetSetVariant, 4) check_get_set(o.GetSetVariant, "foo") check_get_set(o.GetSetVariant, o) # signed/unsigned. check_get_set(o.GetSetInt, 0) check_get_set(o.GetSetInt, -1) check_get_set(o.GetSetInt, 1) check_get_set(o.GetSetUnsignedInt, 0) check_get_set(o.GetSetUnsignedInt, 1) check_get_set(o.GetSetUnsignedInt, 0x80000000) if o.GetSetUnsignedInt(-1) != 0xFFFFFFFF: # -1 is a special case - we accept a negative int (silently converting to # unsigned) but when getting it back we convert it to a long. raise error("unsigned -1 failed") check_get_set(o.GetSetLong, 0) check_get_set(o.GetSetLong, -1) check_get_set(o.GetSetLong, 1) check_get_set(o.GetSetUnsignedLong, 0) check_get_set(o.GetSetUnsignedLong, 1) check_get_set(o.GetSetUnsignedLong, 0x80000000) # -1 is a special case - see above. if o.GetSetUnsignedLong(-1) != 0xFFFFFFFF: raise error("unsigned -1 failed") # We want to explicitly test > 32 bits. py3k has no 'maxint' and # 'maxsize+1' is no good on 64bit platforms as its 65 bits! big = 2147483647 # sys.maxint on py2k for l in big, big+1, 1 << 65: check_get_set(o.GetSetVariant, l) progress("Checking structs") r = o.GetStruct() assert r.int_value == 99 and str(r.str_value)=="Hello from C++" assert o.DoubleString("foo") == "foofoo" progress("Checking var args") o.SetVarArgs("Hi", "There", "From", "Python", 1) if o.GetLastVarArgs() != ("Hi", "There", "From", "Python", 1): raise error("VarArgs failed -" + str(o.GetLastVarArgs())) progress("Checking arrays") l=[] TestApplyResult(o.SetVariantSafeArray, (l,), len(l)) l=[1,2,3,4] TestApplyResult(o.SetVariantSafeArray, (l,), len(l)) TestApplyResult(o.CheckVariantSafeArray, ((1,2,3,4,),), 1) # and binary TestApplyResult(o.SetBinSafeArray, (str2memory('foo\0bar'),), 7) progress("Checking properties") o.LongProp = 3 if o.LongProp != 3 or o.IntProp != 3: raise error("Property value wrong - got %d/%d" % (o.LongProp,o.IntProp)) o.LongProp = o.IntProp = -3 if o.LongProp != -3 or o.IntProp != -3: raise error("Property value wrong - got %d/%d" % (o.LongProp,o.IntProp)) # This number fits in an unsigned long. Attempting to set it to a normal # long will involve overflow, which is to be expected. But we do # expect it to work in a property explicitly a VT_UI4. check = 3 *10 **9 o.ULongProp = check if o.ULongProp != check: raise error("Property value wrong - got %d (expected %d)" % (o.ULongProp, check)) TestApplyResult(o.Test, ("Unused", 99), 1) # A bool function TestApplyResult(o.Test, ("Unused", -1), 1) # A bool function TestApplyResult(o.Test, ("Unused", 1==1), 1) # A bool function TestApplyResult(o.Test, ("Unused", 0), 0) TestApplyResult(o.Test, ("Unused", 1==0), 0) assert o.DoubleString("foo") == "foofoo" TestConstant("ULongTest1", ensure_long(0xFFFFFFFF)) TestConstant("ULongTest2", ensure_long(0x7FFFFFFF)) TestConstant("LongTest1", ensure_long(-0x7FFFFFFF)) TestConstant("LongTest2", ensure_long(0x7FFFFFFF)) TestConstant("UCharTest", 255) TestConstant("CharTest", -1) # 'Hello World', but the 'r' is the "Registered" sign (\xae) TestConstant("StringTest", "Hello Wo\xaeld") progress("Checking dates and times") if issubclass(pywintypes.TimeType, datetime.datetime): # For now *all* times passed must be tz-aware. now = win32timezone.now() # but conversion to and from a VARIANT loses sub-second... now = now.replace(microsecond=0) later = now + datetime.timedelta(seconds=1) TestApplyResult(o.EarliestDate, (now, later), now) else: # old PyTime object now = pythoncom.MakeTime(time.gmtime(time.time())) later = pythoncom.MakeTime(time.gmtime(time.time()+1)) TestApplyResult(o.EarliestDate, (now, later), now) # But it can still *accept* tz-naive datetime objects... now = datetime.datetime.now() expect = pythoncom.MakeTime(now) TestApplyResult(o.EarliestDate, (now, now), expect) progress("Checking currency") # currency. pythoncom.__future_currency__ = 1 if o.CurrencyProp != 0: raise error("Expecting 0, got %r" % (o.CurrencyProp,)) for val in ("1234.5678", "1234.56", "1234"): o.CurrencyProp = decimal.Decimal(val) if o.CurrencyProp != decimal.Decimal(val): raise error("%s got %r" % (val, o.CurrencyProp)) v1 = decimal.Decimal("1234.5678") TestApplyResult(o.DoubleCurrency, (v1,), v1*2) v2 = decimal.Decimal("9012.3456") TestApplyResult(o.AddCurrencies, (v1, v2), v1+v2) TestTrickyTypesWithVariants(o, is_generated) progress("Checking win32com.client.VARIANT") TestPyVariant(o, is_generated) def TestTrickyTypesWithVariants(o, is_generated): # Test tricky stuff with type handling and generally only works with # "generated" support but can be worked around using VARIANT. if is_generated: got = o.TestByRefVariant(2) else: v = VARIANT(pythoncom.VT_BYREF | pythoncom.VT_VARIANT, 2) o.TestByRefVariant(v) got = v.value if got != 4: raise error("TestByRefVariant failed") if is_generated: got = o.TestByRefString("Foo") else: v = VARIANT(pythoncom.VT_BYREF | pythoncom.VT_BSTR, "Foo") o.TestByRefString(v) got = v.value if got != "FooFoo": raise error("TestByRefString failed") # check we can pass ints as a VT_UI1 vals=[1,2,3,4] if is_generated: arg = vals else: arg = VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_UI1, vals) TestApplyResult(o.SetBinSafeArray, (arg,), len(vals)) # safearrays of doubles and floats vals = [0, 1.1, 2.2, 3.3] if is_generated: arg = vals else: arg = VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, vals) TestApplyResult(o.SetDoubleSafeArray, (arg,), len(vals)) if is_generated: arg = vals else: arg = VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R4, vals) TestApplyResult(o.SetFloatSafeArray, (arg,), len(vals)) vals=[1.1, 2.2, 3.3, 4.4] expected = (1.1*2, 2.2*2, 3.3*2, 4.4*2) if is_generated: TestApplyResult(o.ChangeDoubleSafeArray, (vals,), expected) else: arg = VARIANT(pythoncom.VT_BYREF | pythoncom.VT_ARRAY | pythoncom.VT_R8, vals) o.ChangeDoubleSafeArray(arg) if arg.value != expected: raise error("ChangeDoubleSafeArray got the wrong value") if is_generated: got = o.DoubleInOutString("foo") else: v = VARIANT(pythoncom.VT_BYREF | pythoncom.VT_BSTR, "foo") o.DoubleInOutString(v) got = v.value assert got == "foofoo", got val = decimal.Decimal("1234.5678") if is_generated: got = o.DoubleCurrencyByVal(val) else: v = VARIANT(pythoncom.VT_BYREF | pythoncom.VT_CY, val) o.DoubleCurrencyByVal(v) got = v.value assert got == val * 2 def TestDynamic(): progress("Testing Dynamic") import win32com.client.dynamic o = win32com.client.dynamic.DumbDispatch("PyCOMTest.PyCOMTest") TestCommon(o, False) counter = win32com.client.dynamic.DumbDispatch("PyCOMTest.SimpleCounter") TestCounter(counter, False) # Dynamic doesn't know this should be an int, so we get a COM # TypeMismatch error. try: check_get_set_raises(ValueError, o.GetSetInt, "foo") raise error("no exception raised") except pythoncom.com_error as exc: if exc.hresult != winerror.DISP_E_TYPEMISMATCH: raise arg1 = VARIANT(pythoncom.VT_R4 | pythoncom.VT_BYREF, 2.0) arg2 = VARIANT(pythoncom.VT_BOOL | pythoncom.VT_BYREF, True) arg3 = VARIANT(pythoncom.VT_I4 | pythoncom.VT_BYREF, 4) o.TestInOut(arg1, arg2, arg3) assert arg1.value == 4.0, arg1 assert arg2.value == False assert arg3.value == 8 # damn - props with params don't work for dynamic objects :( # o.SetParamProp(0, 1) # if o.ParamProp(0) != 1: # raise RuntimeError, o.paramProp(0) def TestGenerated(): # Create an instance of the server. from win32com.client.gencache import EnsureDispatch o = EnsureDispatch("PyCOMTest.PyCOMTest") TestCommon(o, True) counter = EnsureDispatch("PyCOMTest.SimpleCounter") TestCounter(counter, True) # XXX - this is failing in dynamic tests, but should work fine. i1, i2 = o.GetMultipleInterfaces() if not isinstance(i1, DispatchBaseClass) or not isinstance(i2, DispatchBaseClass): # Yay - is now an instance returned! raise error("GetMultipleInterfaces did not return instances - got '%s', '%s'" % (i1, i2)) del i1 del i2 # Generated knows to only pass a 32bit int, so should fail. check_get_set_raises(OverflowError, o.GetSetInt, 0x80000000) check_get_set_raises(OverflowError, o.GetSetLong, 0x80000000) # Generated knows this should be an int, so raises ValueError check_get_set_raises(ValueError, o.GetSetInt, "foo") check_get_set_raises(ValueError, o.GetSetLong, "foo") # Pass some non-sequence objects to our array decoder, and watch it fail. try: o.SetVariantSafeArray("foo") raise error("Expected a type error") except TypeError: pass try: o.SetVariantSafeArray(666) raise error("Expected a type error") except TypeError: pass o.GetSimpleSafeArray(None) TestApplyResult(o.GetSimpleSafeArray, (None,), tuple(range(10))) resultCheck = tuple(range(5)), tuple(range(10)), tuple(range(20)) TestApplyResult(o.GetSafeArrays, (None, None, None), resultCheck) l=[] TestApplyResult(o.SetIntSafeArray, (l,), len(l)) l=[1,2,3,4] TestApplyResult(o.SetIntSafeArray, (l,), len(l)) ll=[1,2,3,0x100000000] TestApplyResult(o.SetLongLongSafeArray, (ll,), len(ll)) TestApplyResult(o.SetULongLongSafeArray, (ll,), len(ll)) # Tell the server to do what it does! TestApplyResult(o.Test2, (constants.Attr2,), constants.Attr2) TestApplyResult(o.Test3, (constants.Attr2,), constants.Attr2) TestApplyResult(o.Test4, (constants.Attr2,), constants.Attr2) TestApplyResult(o.Test5, (constants.Attr2,), constants.Attr2) TestApplyResult(o.Test6, (constants.WideAttr1,), constants.WideAttr1) TestApplyResult(o.Test6, (constants.WideAttr2,), constants.WideAttr2) TestApplyResult(o.Test6, (constants.WideAttr3,), constants.WideAttr3) TestApplyResult(o.Test6, (constants.WideAttr4,), constants.WideAttr4) TestApplyResult(o.Test6, (constants.WideAttr5,), constants.WideAttr5) TestApplyResult(o.TestInOut, (2.0, True, 4), (4.0, False, 8)) o.SetParamProp(0, 1) if o.ParamProp(0) != 1: raise RuntimeError(o.paramProp(0)) # Make sure CastTo works - even though it is only casting it to itself! o2 = CastTo(o, "IPyCOMTest") if o != o2: raise error("CastTo should have returned the same object") # Do the connection point thing... # Create a connection object. progress("Testing connection points") o2 = win32com.client.DispatchWithEvents(o, RandomEventHandler) TestEvents(o2, o2) o2 = win32com.client.DispatchWithEvents(o, NewStyleRandomEventHandler) TestEvents(o2, o2) # and a plain "WithEvents". handler = win32com.client.WithEvents(o, RandomEventHandler) TestEvents(o, handler) handler = win32com.client.WithEvents(o, NewStyleRandomEventHandler) TestEvents(o, handler) progress("Finished generated .py test.") def TestEvents(o, handler): sessions = [] handler._Init() try: for i in range(3): session = o.Start() sessions.append(session) time.sleep(.5) finally: # Stop the servers for session in sessions: o.Stop(session) handler._DumpFireds() handler.close() def _TestPyVariant(o, is_generated, val, checker = None): if is_generated: vt, got = o.GetVariantAndType(val) else: # Gotta supply all 3 args with the last 2 being explicit variants to # get the byref behaviour. var_vt = VARIANT(pythoncom.VT_UI2 | pythoncom.VT_BYREF, 0) var_result = VARIANT(pythoncom.VT_VARIANT | pythoncom.VT_BYREF, 0) o.GetVariantAndType(val, var_vt, var_result) vt = var_vt.value got = var_result.value if checker is not None: checker(got) return # default checking. assert vt == val.varianttype, (vt, val.varianttype) # Handle our safe-array test - if the passed value is a list of variants, # compare against the actual values. if type(val.value) in (tuple, list): check = [v.value if isinstance(v, VARIANT) else v for v in val.value] # pythoncom always returns arrays as tuples. got = list(got) else: check = val.value assert type(check) == type(got), (type(check), type(got)) assert check == got, (check, got) def _TestPyVariantFails(o, is_generated, val, exc): try: _TestPyVariant(o, is_generated, val) raise error("Setting %r didn't raise %s" % (val, exc)) except exc: pass def TestPyVariant(o, is_generated): _TestPyVariant(o, is_generated, VARIANT(pythoncom.VT_UI1, 1)) _TestPyVariant(o, is_generated, VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_UI4, [1,2,3])) _TestPyVariant(o, is_generated, VARIANT(pythoncom.VT_BSTR, "hello")) _TestPyVariant(o, is_generated, VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_BSTR, ["hello", "there"])) def check_dispatch(got): assert isinstance(got._oleobj_, pythoncom.TypeIIDs[pythoncom.IID_IDispatch]) _TestPyVariant(o, is_generated, VARIANT(pythoncom.VT_DISPATCH, o), check_dispatch) _TestPyVariant(o, is_generated, VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_DISPATCH, [o])) # an array of variants each with a specific type. v = VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_VARIANT, [VARIANT(pythoncom.VT_UI4, 1), VARIANT(pythoncom.VT_UI4, 2), VARIANT(pythoncom.VT_UI4, 3) ] ) _TestPyVariant(o, is_generated, v) # and failures _TestPyVariantFails(o, is_generated, VARIANT(pythoncom.VT_UI1, "foo"), ValueError) def TestCounter(counter, bIsGenerated): # Test random access into container progress("Testing counter", repr(counter)) import random for i in range(50): num = int(random.random() * len(counter)) try: # XXX - this appears broken by commit 08a14d4deb374eaa06378509cf44078ad467b9dc - # We shouldn't need to do generated differently than dynamic. if bIsGenerated: ret = counter.Item(num+1) else: ret = counter[num] if ret != num+1: raise error("Random access into element %d failed - return was %s" % (num,repr(ret))) except IndexError: raise error("** IndexError accessing collection element %d" % num) num = 0 if bIsGenerated: counter.SetTestProperty(1) counter.TestProperty = 1 # Note this has a second, default arg. counter.SetTestProperty(1,2) if counter.TestPropertyWithDef != 0: raise error("Unexpected property set value!") if counter.TestPropertyNoDef(1) != 1: raise error("Unexpected property set value!") else: pass # counter.TestProperty = 1 counter.LBound=1 counter.UBound=10 if counter.LBound != 1 or counter.UBound!=10: print("** Error - counter did not keep its properties") if bIsGenerated: bounds = counter.GetBounds() if bounds[0]!=1 or bounds[1]!=10: raise error("** Error - counter did not give the same properties back") counter.SetBounds(bounds[0], bounds[1]) for item in counter: num = num + 1 if num != len(counter): raise error("*** Length of counter and loop iterations dont match ***") if num != 10: raise error("*** Unexpected number of loop iterations ***") try: counter = iter(counter)._iter_.Clone() # Test Clone() and enum directly except AttributeError: # *sob* - sometimes this is a real iterator and sometimes not :/ progress("Finished testing counter (but skipped the iterator stuff") return counter.Reset() num = 0 for item in counter: num = num + 1 if num != 10: raise error("*** Unexpected number of loop iterations - got %d ***" % num) progress("Finished testing counter") def TestLocalVTable(ob): # Python doesn't fully implement this interface. if ob.DoubleString("foo") != "foofoo": raise error("couldn't foofoo") ############################### ## ## Some vtable tests of the interface ## def TestVTable(clsctx=pythoncom.CLSCTX_ALL): # Any vtable interfaces marked as dual *should* be able to be # correctly implemented as IDispatch. ob = win32com.client.Dispatch("Python.Test.PyCOMTest") TestLocalVTable(ob) # Now test it via vtable - use some C++ code to help here as Python can't do it directly yet. tester = win32com.client.Dispatch("PyCOMTest.PyCOMTest") testee = pythoncom.CoCreateInstance("Python.Test.PyCOMTest", None, clsctx, pythoncom.IID_IUnknown) # check we fail gracefully with None passed. try: tester.TestMyInterface(None) except pythoncom.com_error as details: pass # and a real object. tester.TestMyInterface(testee) def TestVTable2(): # We once crashed creating our object with the native interface as # the first IID specified. We must do it _after_ the tests, so that # Python has already had the gateway registered from last run. ob = win32com.client.Dispatch("Python.Test.PyCOMTest") iid = pythoncom.InterfaceNames["IPyCOMTest"] clsid = "Python.Test.PyCOMTest" clsctx = pythoncom.CLSCTX_SERVER try: testee = pythoncom.CoCreateInstance(clsid, None, clsctx, iid) except TypeError: # Python can't actually _use_ this interface yet, so this is # "expected". Any COM error is not. pass def TestVTableMI(): clsctx = pythoncom.CLSCTX_SERVER ob = pythoncom.CoCreateInstance("Python.Test.PyCOMTestMI", None, clsctx, pythoncom.IID_IUnknown) # This inherits from IStream. ob.QueryInterface(pythoncom.IID_IStream) # This implements IStorage, specifying the IID as a string ob.QueryInterface(pythoncom.IID_IStorage) # IDispatch should always work ob.QueryInterface(pythoncom.IID_IDispatch) iid = pythoncom.InterfaceNames["IPyCOMTest"] try: ob.QueryInterface(iid) except TypeError: # Python can't actually _use_ this interface yet, so this is # "expected". Any COM error is not. pass def TestQueryInterface(long_lived_server = 0, iterations=5): tester = win32com.client.Dispatch("PyCOMTest.PyCOMTest") if long_lived_server: # Create a local server t0 = win32com.client.Dispatch("Python.Test.PyCOMTest", clsctx=pythoncom.CLSCTX_LOCAL_SERVER) # Request custom interfaces a number of times prompt = [ "Testing QueryInterface without long-lived local-server #%d of %d...", "Testing QueryInterface with long-lived local-server #%d of %d..." ] for i in range(iterations): progress(prompt[long_lived_server!=0] % (i+1, iterations)) tester.TestQueryInterface() class Tester(win32com.test.util.TestCase): def testVTableInProc(self): # We used to crash running this the second time - do it a few times for i in range(3): progress("Testing VTables in-process #%d..." % (i+1)) TestVTable(pythoncom.CLSCTX_INPROC_SERVER) def testVTableLocalServer(self): for i in range(3): progress("Testing VTables out-of-process #%d..." % (i+1)) TestVTable(pythoncom.CLSCTX_LOCAL_SERVER) def testVTable2(self): for i in range(3): TestVTable2() def testVTableMI(self): for i in range(3): TestVTableMI() def testMultiQueryInterface(self): TestQueryInterface(0,6) # When we use the custom interface in the presence of a long-lived # local server, i.e. a local server that is already running when # we request an instance of our COM object, and remains afterwards, # then after repeated requests to create an instance of our object # the custom interface disappears -- i.e. QueryInterface fails with # E_NOINTERFACE. Set the upper range of the following test to 2 to # pass this test, i.e. TestQueryInterface(1,2) TestQueryInterface(1,6) def testDynamic(self): TestDynamic() def testGenerated(self): TestGenerated() if __name__=='__main__': # XXX - todo - Complete hack to crank threading support. # Should NOT be necessary def NullThreadFunc(): pass import _thread _thread.start_new( NullThreadFunc, () ) if "-v" in sys.argv: verbose = 1 win32com.test.util.testmain() PK ѳPO"KKwin32com/test/testMSOffice.pyUT l_Zx`ux # Test MSOffice # # Main purpose of test is to ensure that Dynamic COM objects # work as expected. # Assumes Word and Excel installed on your machine. import win32com, sys, string, win32api, traceback import win32com.client.dynamic from win32com.test.util import CheckClean import pythoncom from win32com.client import gencache from pywintypes import Unicode error = "MSOffice test error" # Test a few of the MSOffice components. def TestWord(): # Try and load the object exposed by Word 8 # Office 97 - _totally_ different object model! try: # NOTE - using "client.Dispatch" would return an msword8.py instance! print("Starting Word 8 for dynamic test") word = win32com.client.dynamic.Dispatch("Word.Application") TestWord8(word) word = None # Now we will test Dispatch without the new "lazy" capabilities print("Starting Word 8 for non-lazy dynamic test") dispatch = win32com.client.dynamic._GetGoodDispatch("Word.Application") typeinfo = dispatch.GetTypeInfo() attr = typeinfo.GetTypeAttr() olerepr = win32com.client.build.DispatchItem(typeinfo, attr, None, 0) word = win32com.client.dynamic.CDispatch(dispatch, olerepr) dispatch = typeinfo = attr = olerepr = None TestWord8(word) except pythoncom.com_error: print("Starting Word 7 for dynamic test") word = win32com.client.Dispatch("Word.Basic") TestWord7(word) print("Starting MSWord for generated test") from win32com.client import gencache word = gencache.EnsureDispatch("Word.Application.8") TestWord8(word) def TestWord7(word): word.FileNew() # If not shown, show the app. if not word.AppShow(): word._proc_("AppShow") for i in range(12): word.FormatFont(Color=i+1, Points=i+12) word.Insert("Hello from Python %d\n" % i) word.FileClose(2) def TestWord8(word): word.Visible = 1 doc = word.Documents.Add() wrange = doc.Range() for i in range(10): wrange.InsertAfter("Hello from Python %d\n" % i) paras = doc.Paragraphs for i in range(len(paras)): p = paras[i]() p.Font.ColorIndex = i+1 p.Font.Size = 12 + (4 * i) # XXX - note that # for para in paras: # para().Font... # doesnt seem to work - no error, just doesnt work # Should check if it works for VB! doc.Close(SaveChanges = 0) word.Quit() win32api.Sleep(1000) # Wait for word to close, else we # may get OA error. def TestWord8OldStyle(): try: import win32com.test.Generated4Test.msword8 except ImportError: print("Can not do old style test") def TextExcel(xl): xl.Visible = 0 if xl.Visible: raise error("Visible property is true.") xl.Visible = 1 if not xl.Visible: raise error("Visible property not true.") if int(xl.Version[0])>=8: xl.Workbooks.Add() else: xl.Workbooks().Add() xl.Range("A1:C1").Value = (1,2,3) xl.Range("A2:C2").Value = ('x','y','z') xl.Range("A3:C3").Value = ('3','2','1') for i in range(20): xl.Cells(i+1,i+1).Value = "Hi %d" % i if xl.Range("A1").Value != "Hi 0": raise error("Single cell range failed") if xl.Range("A1:B1").Value != ((Unicode("Hi 0"),2),): raise error("flat-horizontal cell range failed") if xl.Range("A1:A2").Value != ((Unicode("Hi 0"),),(Unicode("x"),)): raise error("flat-vertical cell range failed") if xl.Range("A1:C3").Value != ((Unicode("Hi 0"),2,3),(Unicode("x"),Unicode("Hi 1"),Unicode("z")),(3,2,Unicode("Hi 2"))): raise error("square cell range failed") xl.Range("A1:C3").Value =((3,2,1),("x","y","z"),(1,2,3)) if xl.Range("A1:C3").Value != ((3,2,1),(Unicode("x"),Unicode("y"),Unicode("z")),(1,2,3)): raise error("Range was not what I set it to!") # test dates out with Excel xl.Cells(5,1).Value = "Excel time" xl.Cells(5,2).Formula = "=Now()" import time xl.Cells(6,1).Value = "Python time" xl.Cells(6,2).Value = pythoncom.MakeTime(time.time()) xl.Cells(6,2).NumberFormat = "d/mm/yy h:mm" xl.Columns("A:B").EntireColumn.AutoFit() xl.Workbooks(1).Close(0) xl.Quit() def TestAll(): TestWord() print("Starting Excel for Dynamic test...") xl = win32com.client.dynamic.Dispatch("Excel.Application") TextExcel(xl) try: print("Starting Excel 8 for generated excel8.py test...") mod = gencache.EnsureModule("{00020813-0000-0000-C000-000000000046}", 0, 1, 2, bForDemand=1) xl = win32com.client.Dispatch("Excel.Application") TextExcel(xl) except ImportError: print("Could not import the generated Excel 97 wrapper") try: import xl5en32 mod = gencache.EnsureModule("{00020813-0000-0000-C000-000000000046}", 9, 1, 0) xl = win32com.client.Dispatch("Excel.Application.5") print("Starting Excel 95 for makepy test...") TextExcel(xl) except ImportError: print("Could not import the generated Excel 95 wrapper") if __name__=='__main__': TestAll() CheckClean() pythoncom.CoUninitialize() PK ѳPA'win32com/test/testGIT.pyUT l_Zx`ux """Testing pasing object between multiple COM threads Uses standard COM marshalling to pass objects between threads. Even though Python generally seems to work when you just pass COM objects between threads, it shouldnt. This shows the "correct" way to do it. It shows that although we create new threads to use the Python.Interpreter, COM marshalls back all calls to that object to the main Python thread, which must be running a message loop (as this sample does). When this test is run in "free threaded" mode (at this stage, you must manually mark the COM objects as "ThreadingModel=Free", or run from a service which has marked itself as free-threaded), then no marshalling is done, and the Python.Interpreter object start doing the "expected" thing - ie, it reports being on the same thread as its caller! Python.exe needs a good way to mark itself as FreeThreaded - at the moment this is a pain in the but! """ import _thread, traceback import win32com.client import win32event, win32api import pythoncom def TestInterp(interp): if interp.Eval("1+1") != 2: raise ValueError("The interpreter returned the wrong result.") try: interp.Eval(1+1) raise ValueError("The interpreter did not raise an exception") except pythoncom.com_error as details: import winerror if details[0]!=winerror.DISP_E_TYPEMISMATCH: raise ValueError("The interpreter exception was not winerror.DISP_E_TYPEMISMATCH.") def TestInterpInThread(stopEvent, cookie): try: DoTestInterpInThread(cookie) finally: win32event.SetEvent(stopEvent) def CreateGIT(): return pythoncom.CoCreateInstance(pythoncom.CLSID_StdGlobalInterfaceTable, None, pythoncom.CLSCTX_INPROC, pythoncom.IID_IGlobalInterfaceTable) def DoTestInterpInThread(cookie): try: pythoncom.CoInitialize() myThread = win32api.GetCurrentThreadId() GIT = CreateGIT() interp = GIT.GetInterfaceFromGlobal(cookie, pythoncom.IID_IDispatch) interp = win32com.client.Dispatch(interp) TestInterp(interp) interp.Exec("import win32api") print("The test thread id is %d, Python.Interpreter's thread ID is %d" % (myThread, interp.Eval("win32api.GetCurrentThreadId()"))) interp = None pythoncom.CoUninitialize() except: traceback.print_exc() def BeginThreadsSimpleMarshal(numThreads, cookie): """Creates multiple threads using simple (but slower) marshalling. Single interpreter object, but a new stream is created per thread. Returns the handles the threads will set when complete. """ ret = [] for i in range(numThreads): hEvent = win32event.CreateEvent(None, 0, 0, None) _thread.start_new(TestInterpInThread, (hEvent, cookie)) ret.append(hEvent) return ret def test(fn): print("The main thread is %d" % (win32api.GetCurrentThreadId())) GIT = CreateGIT() interp = win32com.client.Dispatch("Python.Interpreter") cookie = GIT.RegisterInterfaceInGlobal(interp._oleobj_, pythoncom.IID_IDispatch) events = fn(4, cookie) numFinished = 0 while 1: try: rc = win32event.MsgWaitForMultipleObjects(events, 0, 2000, win32event.QS_ALLINPUT) if rc >= win32event.WAIT_OBJECT_0 and rc < win32event.WAIT_OBJECT_0+len(events): numFinished = numFinished + 1 if numFinished >= len(events): break elif rc==win32event.WAIT_OBJECT_0 + len(events): # a message # This is critical - whole apartment model demo will hang. pythoncom.PumpWaitingMessages() else: # Timeout print("Waiting for thread to stop with interfaces=%d, gateways=%d" % (pythoncom._GetInterfaceCount(), pythoncom._GetGatewayCount())) except KeyboardInterrupt: break GIT.RevokeInterfaceFromGlobal(cookie) del interp del GIT if __name__=='__main__': test(BeginThreadsSimpleMarshal) win32api.Sleep(500) # Doing CoUninit here stop Pythoncom.dll hanging when DLLMain shuts-down the process pythoncom.CoUninitialize() if pythoncom._GetInterfaceCount()!=0 or pythoncom._GetGatewayCount()!=0: print("Done with interfaces=%d, gateways=%d" % (pythoncom._GetInterfaceCount(), pythoncom._GetGatewayCount())) else: print("Done.") PK ѳPOM win32com/test/testExchange.pyUT l_Zx`ux # TestExchange = Exchange Server Dump # Note that this code uses "CDO", which is unlikely to get the best choice. # You should use the Outlook object model, or # the win32com.mapi examples for a low-level interface. from win32com.client import gencache, constants import pythoncom import os ammodule = None # was the generated module! def GetDefaultProfileName(): import win32api, win32con try: key = win32api.RegOpenKey(win32con.HKEY_CURRENT_USER, "Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows Messaging Subsystem\\Profiles") try: return win32api.RegQueryValueEx(key, "DefaultProfile")[0] finally: key.Close() except win32api.error: return None # # Recursive dump of folders. # def DumpFolder(folder, indent = 0): print(" " * indent, folder.Name) folders = folder.Folders folder = folders.GetFirst() while folder: DumpFolder(folder, indent+1) folder = folders.GetNext() def DumpFolders(session): try: infostores = session.InfoStores except AttributeError: # later outlook? store = session.DefaultStore folder = store.GetRootFolder() DumpFolder(folder) return print(infostores) print("There are %d infostores" % infostores.Count) for i in range(infostores.Count): infostore = infostores[i+1] print("Infostore = ", infostore.Name) try: folder = infostore.RootFolder except pythoncom.com_error as details: hr, msg, exc, arg = details # -2147221219 == MAPI_E_FAILONEPROVIDER - a single provider temporarily not available. if exc and exc[-1]==-2147221219: print("This info store is currently not available") continue DumpFolder(folder) # Build a dictionary of property tags, so I can reverse look-up # PropTagsById={} if ammodule: for name, val in ammodule.constants.__dict__.items(): PropTagsById[val] = name def TestAddress(session): # entry = session.GetAddressEntry("Skip") # print entry pass def TestUser(session): ae = session.CurrentUser fields = getattr(ae, "Fields", []) print("User has %d fields" % len(fields)) for f in range(len(fields)): field = fields[f+1] try: id = PropTagsById[field.ID] except KeyError: id = field.ID print("%s/%s=%s" % (field.Name, id, field.Value)) def test(): import win32com.client oldcwd = os.getcwd() try: session = gencache.EnsureDispatch("MAPI.Session") try: session.Logon(GetDefaultProfileName()) except pythoncom.com_error as details: print("Could not log on to MAPI:", details) return except pythoncom.error: # no mapi.session - let's try outlook app = gencache.EnsureDispatch("Outlook.Application") session = app.Session try: TestUser(session) TestAddress(session) DumpFolders(session) finally: session.Logoff() # It appears Exchange will change the cwd on us :( os.chdir(oldcwd) if __name__=='__main__': from .util import CheckClean test() CheckClean() PK Y03K xI(?? win32com/test/testPyScriptlet.jsUT  YZx`ux function print(msg) { WScript.Echo(msg) ; } function check(condition, msg) { if (!condition) { print("***** testPyScriptlet.js failed *****"); print(msg); } } var thisScriptEngine = ScriptEngine() ; var majorVersion = ScriptEngineMajorVersion() ; var minorVersion = ScriptEngineMinorVersion() ; var buildVersion = ScriptEngineBuildVersion() ; WScript.Echo(thisScriptEngine + " Version " + majorVersion + "." + minorVersion + " Build " + buildVersion) ; var scriptlet = new ActiveXObject("TestPys.Scriptlet") ; check(scriptlet.PyProp1=="PyScript Property1", "PyProp1 wasn't correct initial value"); scriptlet.PyProp1 = "New Value"; check(scriptlet.PyProp1=="New Value", "PyProp1 wasn't correct new value"); check(scriptlet.PyProp2=="PyScript Property2", "PyProp2 wasn't correct initial value"); scriptlet.PyProp2 = "Another New Value"; check(scriptlet.PyProp2=="Another New Value", "PyProp2 wasn't correct new value"); check(scriptlet.PyMethod1()=="PyMethod1 called", "Method1 wrong value"); check(scriptlet.PyMethod2()=="PyMethod2 called", "Method2 wrong value"); PK 8PP=&&win32com/test/testStreams.pyUT *_Zx`ux import pythoncom import win32com.server.util import win32com.test.util import unittest from pywin32_testutil import str2bytes class Persists: _public_methods_ = [ 'GetClassID', 'IsDirty', 'Load', 'Save', 'GetSizeMax', 'InitNew' ] _com_interfaces_ = [ pythoncom.IID_IPersistStreamInit ] def __init__(self): self.data = str2bytes("abcdefg") self.dirty = 1 def GetClassID(self): return pythoncom.IID_NULL def IsDirty(self): return self.dirty def Load(self, stream): self.data = stream.Read(26) def Save(self, stream, clearDirty): stream.Write(self.data) if clearDirty: self.dirty = 0 def GetSizeMax(self): return 1024 def InitNew(self): pass class Stream: _public_methods_ = [ 'Read', 'Write', 'Seek' ] _com_interfaces_ = [ pythoncom.IID_IStream ] def __init__(self, data): self.data = data self.index = 0 def Read(self, amount): result = self.data[self.index : self.index + amount] self.index = self.index + amount return result def Write(self, data): self.data = data self.index = 0 return len(data) def Seek(self, dist, origin): if origin==pythoncom.STREAM_SEEK_SET: self.index = dist elif origin==pythoncom.STREAM_SEEK_CUR: self.index = self.index + dist elif origin==pythoncom.STREAM_SEEK_END: self.index = len(self.data)+dist else: raise ValueError('Unknown Seek type: ' +str(origin)) if self.index < 0: self.index = 0 else: self.index = min(self.index, len(self.data)) return self.index class BadStream(Stream): """ PyGStream::Read could formerly overflow buffer if the python implementation returned more data than requested. """ def Read(self, amount): return str2bytes('x')*(amount+1) class StreamTest(win32com.test.util.TestCase): def _readWrite(self, data, write_stream, read_stream = None): if read_stream is None: read_stream = write_stream write_stream.Write(data) read_stream.Seek(0, pythoncom.STREAM_SEEK_SET) got = read_stream.Read(len(data)) self.assertEqual(data, got) read_stream.Seek(1, pythoncom.STREAM_SEEK_SET) got = read_stream.Read(len(data)-2) self.assertEqual(data[1:-1], got) def testit(self): mydata = str2bytes('abcdefghijklmnopqrstuvwxyz') # First test the objects just as Python objects... s = Stream(mydata) p = Persists() p.Load(s) p.Save(s, 0) self.assertEqual(s.data, mydata) # Wrap the Python objects as COM objects, and make the calls as if # they were non-Python COM objects. s2 = win32com.server.util.wrap(s, pythoncom.IID_IStream) p2 = win32com.server.util.wrap(p, pythoncom.IID_IPersistStreamInit) self._readWrite(mydata, s, s) self._readWrite(mydata, s, s2) self._readWrite(mydata, s2, s) self._readWrite(mydata, s2, s2) self._readWrite(str2bytes("string with\0a NULL"), s2, s2) # reset the stream s.Write(mydata) p2.Load(s2) p2.Save(s2, 0) self.assertEqual(s.data, mydata) def testseek(self): s = Stream(str2bytes('yo')) s = win32com.server.util.wrap(s, pythoncom.IID_IStream) # we used to die in py3k passing a value > 32bits s.Seek(0x100000000, pythoncom.STREAM_SEEK_SET) def testerrors(self): # setup a test logger to capture tracebacks etc. records, old_log = win32com.test.util.setup_test_logger() ## check for buffer overflow in Read method badstream = BadStream('Check for buffer overflow') badstream2 = win32com.server.util.wrap(badstream, pythoncom.IID_IStream) self.assertRaises(pythoncom.com_error, badstream2.Read, 10) win32com.test.util.restore_test_logger(old_log) # expecting 2 pythoncom errors to have been raised by the gateways. self.assertEqual(len(records), 2) self.failUnless(records[0].msg.startswith('pythoncom error')) self.failUnless(records[1].msg.startswith('pythoncom error')) if __name__=='__main__': unittest.main() PK ѳP9jq%win32com/test/testGatewayAddresses.pyUT l_Zx`ux # The purpose of this test is to ensure that the gateways objects # do the right thing WRT COM rules about object identity etc. # Also includes a basic test that we support inheritance correctly in # gateway interfaces. # For our test, we create an object of type IID_IPersistStorage # This interface derives from IPersist. # Therefore, QI's for IID_IDispatch, IID_IUnknown, IID_IPersist and # IID_IPersistStorage should all return the same gateway object. # # In addition, the interface should only need to declare itself as # using the IPersistStorage interface, and as the gateway derives # from IPersist, it should automatically be available without declaration. # # We also create an object of type IID_I??, and perform a QI for it. # We then jump through a number of hoops, ensuring that the objects # returned by the QIs follow all the rules. # # Here is Gregs summary of the rules: # 1) the set of supported interfaces is static and unchanging # 2) symmetric: if you QI an interface for that interface, it succeeds # 3) reflexive: if you QI against A for B, the new pointer must succeed # for a QI for A # 4) transitive: if you QI for B, then QI that for C, then QI'ing A for C # must succeed # # # Note that 1) Requires cooperation of the Python programmer. The rule to keep is: # "whenever you return an _object_ from _query_interface_(), you must return the # same object each time for a given IID. Note that you must return the same # _wrapped_ object # you # The rest are tested here. from win32com.server.util import wrap import pythoncom from .util import CheckClean numErrors = 0 # Check that the 2 objects both have identical COM pointers. def CheckSameCOMObject(ob1, ob2): addr1 = repr(ob1).split()[6][:-1] addr2 = repr(ob2).split()[6][:-1] return addr1==addr2 # Check that the objects conform to COM identity rules. def CheckObjectIdentity(ob1, ob2): u1 = ob1.QueryInterface(pythoncom.IID_IUnknown) u2 = ob2.QueryInterface(pythoncom.IID_IUnknown) return CheckSameCOMObject(u1, u2) def FailObjectIdentity(ob1, ob2, when): if not CheckObjectIdentity(ob1, ob2): global numErrors numErrors = numErrors + 1 print(when, "are not identical (%s, %s)" % (repr(ob1), repr(ob2))) class Dummy: _public_methods_ = [] # We never attempt to make a call on this object. _com_interfaces_ = [pythoncom.IID_IPersistStorage] class Dummy2: _public_methods_ = [] # We never attempt to make a call on this object. _com_interfaces_ = [pythoncom.IID_IPersistStorage, pythoncom.IID_IExternalConnection] class DeletgatedDummy: _public_methods_ = [] class Dummy3: _public_methods_ = [] # We never attempt to make a call on this object. _com_interfaces_ = [pythoncom.IID_IPersistStorage] def _query_interface_(self, iid): if iid==pythoncom.IID_IExternalConnection: # This will NEVER work - can only wrap the object once! return wrap(DelegatedDummy()) def TestGatewayInheritance(): # By default, wrap() creates and discards a temporary object. # This is not necessary, but just the current implementation of wrap. # As the object is correctly discarded, it doesnt affect this test. o = wrap(Dummy(), pythoncom.IID_IPersistStorage) o2 = o.QueryInterface(pythoncom.IID_IUnknown) FailObjectIdentity(o, o2, "IID_IPersistStorage->IID_IUnknown") o3 = o2.QueryInterface(pythoncom.IID_IDispatch) FailObjectIdentity(o2, o3, "IID_IUnknown->IID_IDispatch") FailObjectIdentity(o, o3, "IID_IPersistStorage->IID_IDispatch") o4 = o3.QueryInterface(pythoncom.IID_IPersistStorage) FailObjectIdentity(o, o4, "IID_IPersistStorage->IID_IPersistStorage(2)") FailObjectIdentity(o2, o4, "IID_IUnknown->IID_IPersistStorage(2)") FailObjectIdentity(o3, o4, "IID_IDispatch->IID_IPersistStorage(2)") o5 = o4.QueryInterface(pythoncom.IID_IPersist) FailObjectIdentity(o, o5, "IID_IPersistStorage->IID_IPersist") FailObjectIdentity(o2, o5, "IID_IUnknown->IID_IPersist") FailObjectIdentity(o3, o5, "IID_IDispatch->IID_IPersist") FailObjectIdentity(o4, o5, "IID_IPersistStorage(2)->IID_IPersist") def TestMultiInterface(): o = wrap(Dummy2(), pythoncom.IID_IPersistStorage) o2 = o.QueryInterface(pythoncom.IID_IExternalConnection) FailObjectIdentity(o, o2, "IID_IPersistStorage->IID_IExternalConnection") # Make the same QI again, to make sure it is stable. o22 = o.QueryInterface(pythoncom.IID_IExternalConnection) FailObjectIdentity(o, o22, "IID_IPersistStorage->IID_IExternalConnection") FailObjectIdentity(o2, o22, "IID_IPersistStorage->IID_IExternalConnection (stability)") o3 = o2.QueryInterface(pythoncom.IID_IPersistStorage) FailObjectIdentity(o2, o3, "IID_IExternalConnection->IID_IPersistStorage") FailObjectIdentity(o, o3, "IID_IPersistStorage->IID_IExternalConnection->IID_IPersistStorage") def test(): TestGatewayInheritance() TestMultiInterface() if numErrors==0: print("Worked ok") else: print("There were", numErrors, "errors.") if __name__=='__main__': test() CheckClean() PK Y03K+SY3++win32com/test/__init__.pyUT  YZx`ux # Empty file to designate a Python package PK Y03K99win32com/test/testxslt.jsUT  YZx`ux //Args: input-file style-file output-file var xml = WScript.CreateObject("Microsoft.XMLDOM"); //input xml.validateOnParse=false; xml.load(WScript.Arguments(0)); var xsl = WScript.CreateObject("Microsoft.XMLDOM"); //style xsl.validateOnParse=false; xsl.load(WScript.Arguments(1)); var out = WScript.CreateObject("Scripting.FileSystemObject"); //output var replace = true; var unicode = false; //output file properties var hdl = out.CreateTextFile( WScript.Arguments(2), replace, unicode ) hdl.write( xml.transformNode( xsl.documentElement )); //eof PK #XQT]win32com/test/testMarshal.pyUT ԭ_Zx`ux """Testing pasing object between multiple COM threads Uses standard COM marshalling to pass objects between threads. Even though Python generally seems to work when you just pass COM objects between threads, it shouldnt. This shows the "correct" way to do it. It shows that although we create new threads to use the Python.Interpreter, COM marshalls back all calls to that object to the main Python thread, which must be running a message loop (as this sample does). When this test is run in "free threaded" mode (at this stage, you must manually mark the COM objects as "ThreadingModel=Free", or run from a service which has marked itself as free-threaded), then no marshalling is done, and the Python.Interpreter object start doing the "expected" thing - ie, it reports being on the same thread as its caller! Python.exe needs a good way to mark itself as FreeThreaded - at the moment this is a pain in the but! """ import threading, traceback import win32com.client import win32event, win32api import pythoncom import unittest from .testServers import InterpCase freeThreaded = 1 class ThreadInterpCase(InterpCase): def _testInterpInThread(self, stopEvent, interp): try: self._doTestInThread(interp) finally: win32event.SetEvent(stopEvent) def _doTestInThread(self, interp): pythoncom.CoInitialize() myThread = win32api.GetCurrentThreadId() if freeThreaded: interp = pythoncom.CoGetInterfaceAndReleaseStream(interp, pythoncom.IID_IDispatch) interp = win32com.client.Dispatch(interp) interp.Exec("import win32api") #print "The test thread id is %d, Python.Interpreter's thread ID is %d" % (myThread, interp.Eval("win32api.GetCurrentThreadId()")) pythoncom.CoUninitialize() def BeginThreadsSimpleMarshal(self, numThreads): """Creates multiple threads using simple (but slower) marshalling. Single interpreter object, but a new stream is created per thread. Returns the handles the threads will set when complete. """ interp = win32com.client.Dispatch("Python.Interpreter") events = [] threads = [] for i in range(numThreads): hEvent = win32event.CreateEvent(None, 0, 0, None) events.append(hEvent) interpStream = pythoncom.CoMarshalInterThreadInterfaceInStream(pythoncom.IID_IDispatch, interp._oleobj_) t = threading.Thread(target=self._testInterpInThread, args=(hEvent, interpStream)) t.setDaemon(1) # so errors dont cause shutdown hang t.start() threads.append(t) interp = None return threads, events # # NOTE - this doesnt quite work - Im not even sure it should, but Greg reckons # you should be able to avoid the marshal per thread! # I think that refers to CoMarshalInterface though... def BeginThreadsFastMarshal(self, numThreads): """Creates multiple threads using fast (but complex) marshalling. The marshal stream is created once, and each thread uses the same stream Returns the handles the threads will set when complete. """ interp = win32com.client.Dispatch("Python.Interpreter") if freeThreaded: interp = pythoncom.CoMarshalInterThreadInterfaceInStream(pythoncom.IID_IDispatch, interp._oleobj_) events = [] threads = [] for i in range(numThreads): hEvent = win32event.CreateEvent(None, 0, 0, None) t = threading.Thread(target=self._testInterpInThread, args=(hEvent, interp)) t.setDaemon(1) # so errors dont cause shutdown hang t.start() events.append(hEvent) threads.append(t) return threads, events def _DoTestMarshal(self, fn, bCoWait = 0): #print "The main thread is %d" % (win32api.GetCurrentThreadId()) threads, events = fn(2) numFinished = 0 while 1: try: if bCoWait: rc = pythoncom.CoWaitForMultipleHandles(0, 2000, events) else: # Specifying "bWaitAll" here will wait for messages *and* all events # (which is pretty useless) rc = win32event.MsgWaitForMultipleObjects(events, 0, 2000, win32event.QS_ALLINPUT) if rc >= win32event.WAIT_OBJECT_0 and rc < win32event.WAIT_OBJECT_0+len(events): numFinished = numFinished + 1 if numFinished >= len(events): break elif rc==win32event.WAIT_OBJECT_0 + len(events): # a message # This is critical - whole apartment model demo will hang. pythoncom.PumpWaitingMessages() else: # Timeout print("Waiting for thread to stop with interfaces=%d, gateways=%d" % (pythoncom._GetInterfaceCount(), pythoncom._GetGatewayCount())) except KeyboardInterrupt: break for t in threads: t.join(2) self.failIf(t.is_alive(), "thread failed to stop!?") threads = None # threads hold references to args # Seems to be a leak here I can't locate :( #self.failUnlessEqual(pythoncom._GetInterfaceCount(), 0) #self.failUnlessEqual(pythoncom._GetGatewayCount(), 0) def testSimpleMarshal(self): self._DoTestMarshal(self.BeginThreadsSimpleMarshal) def testSimpleMarshalCoWait(self): self._DoTestMarshal(self.BeginThreadsSimpleMarshal, 1) # def testFastMarshal(self): # self._DoTestMarshal(self.BeginThreadsFastMarshal) if __name__=='__main__': unittest.main('testMarshal') PK ѳPL)win32com/test/testROT.pyUT l_Zx`ux import pythoncom import unittest import win32com.test.util import winerror class TestROT(win32com.test.util.TestCase): def testit(self): ctx = pythoncom.CreateBindCtx() rot = pythoncom.GetRunningObjectTable() num = 0 for mk in rot: name = mk.GetDisplayName(ctx, None) num += 1 # Monikers themselves can iterate their contents (sometimes :) try: for sub in mk: num += 1 except pythoncom.com_error as exc: if exc.hresult != winerror.E_NOTIMPL: raise #if num < 2: # print "Only", num, "objects in the ROT - this is unusual" if __name__=='__main__': unittest.main() PK ѳPW88win32com/test/testAccess.pyUT l_Zx`ux # # This assumes that you have MSAccess and DAO installed. # You need to run makepy.py over "msaccess.tlb" and # "dao3032.dll", and ensure the generated files are on the # path. # You can run this with no args, and a test database will be generated. # You can optionally pass a dbname on the command line, in which case it will be dumped. import pythoncom from win32com.client import gencache, constants, Dispatch import win32api import os, sys def CreateTestAccessDatabase(dbname = None): # Creates a test access database - returns the filename. if dbname is None: dbname = os.path.join( win32api.GetTempPath(), "COMTestSuiteTempDatabase.mdb" ) access = Dispatch("Access.Application") dbEngine = access.DBEngine workspace = dbEngine.Workspaces(0) try: os.unlink(dbname) except os.error: print("WARNING - Unable to delete old test database - expect a COM exception RSN!") newdb = workspace.CreateDatabase( dbname, constants.dbLangGeneral, constants.dbEncrypt ) # Create one test table. table = newdb.CreateTableDef("Test Table 1") table.Fields.Append( table.CreateField("First Name", constants.dbText ) ) table.Fields.Append( table.CreateField("Last Name", constants.dbText ) ) index = table.CreateIndex("UniqueIndex") index.Fields.Append( index.CreateField("First Name") ) index.Fields.Append( index.CreateField("Last Name") ) index.Unique = -1 table.Indexes.Append(index) newdb.TableDefs.Append( table ) # Create a second test table. table = newdb.CreateTableDef("Test Table 2") table.Fields.Append( table.CreateField("First Name", constants.dbText ) ) table.Fields.Append( table.CreateField("Last Name", constants.dbText ) ) newdb.TableDefs.Append( table ) # Create a relationship between them relation = newdb.CreateRelation("TestRelationship") relation.Table = "Test Table 1" relation.ForeignTable = "Test Table 2" field = relation.CreateField("First Name") field.ForeignName = "First Name" relation.Fields.Append( field ) field = relation.CreateField("Last Name") field.ForeignName = "Last Name" relation.Fields.Append( field ) relation.Attributes = constants.dbRelationDeleteCascade + constants.dbRelationUpdateCascade newdb.Relations.Append(relation) # Finally we can add some data to the table. tab1 = newdb.OpenRecordset("Test Table 1") tab1.AddNew() tab1.Fields("First Name").Value = "Mark" tab1.Fields("Last Name").Value = "Hammond" tab1.Update() tab1.MoveFirst() # We do a simple bookmark test which tests our optimized VT_SAFEARRAY|VT_UI1 support. # The bookmark will be a buffer object - remember it for later. bk = tab1.Bookmark # Add a second record. tab1.AddNew() tab1.Fields("First Name").Value = "Second" tab1.Fields("Last Name").Value = "Person" tab1.Update() # Reset the bookmark to the one we saved. # But first check the test is actually doing something! tab1.MoveLast() if tab1.Fields("First Name").Value != "Second": raise RuntimeError("Unexpected record is last - makes bookmark test pointless!") tab1.Bookmark = bk if tab1.Bookmark != bk: raise RuntimeError("The bookmark data is not the same") if tab1.Fields("First Name").Value != "Mark": raise RuntimeError("The bookmark did not reset the record pointer correctly") return dbname def DoDumpAccessInfo(dbname): from . import daodump a = forms = None try: sys.stderr.write("Creating Access Application...\n") a=Dispatch("Access.Application") print("Opening database %s" % dbname) a.OpenCurrentDatabase(dbname) db = a.CurrentDb() daodump.DumpDB(db,1) forms = a.Forms print("There are %d forms open." % (len(forms))) # Uncommenting these lines means Access remains open. # for form in forms: # print " %s" % form.Name reports = a.Reports print("There are %d reports open" % (len(reports))) finally: if not a is None: sys.stderr.write("Closing database\n") try: a.CloseCurrentDatabase() except pythoncom.com_error: pass # Generate all the support we can. def GenerateSupport(): # dao gencache.EnsureModule("{00025E01-0000-0000-C000-000000000046}", 0, 4, 0) # Access # gencache.EnsureModule("{4AFFC9A0-5F99-101B-AF4E-00AA003F0F07}", 0, 8, 0) gencache.EnsureDispatch("Access.Application") def DumpAccessInfo(dbname): amod = gencache.GetModuleForProgID("Access.Application") dmod = gencache.GetModuleForProgID("DAO.DBEngine.35") if amod is None and dmod is None: DoDumpAccessInfo(dbname) # Now generate all the support we can. GenerateSupport() else: sys.stderr.write("testAccess not doing dynamic test, as generated code already exists\n") # Now a generated version. DoDumpAccessInfo(dbname) def test(dbname = None): if dbname is None: # We need makepy support to create a database (just for the constants!) try: GenerateSupport() except pythoncom.com_error: print("*** Can not import the MSAccess type libraries - tests skipped") return dbname = CreateTestAccessDatabase() print("A test database at '%s' was created" % dbname) DumpAccessInfo(dbname) if __name__=='__main__': import sys from .util import CheckClean dbname = None if len(sys.argv)>1: dbname = sys.argv[1] test(dbname) CheckClean() PK Y03Kwv22 win32com/test/testDictionary.vbsUT  YZx`ux ' Test Pyhon.Dictionary using VBScript - this uses ' IDispatchEx, so is an interesting test. set ob = CreateObject("Python.Dictionary") ob("hello") = "there" ' Our keys are case insensitive. ob.Item("hi") = ob("HELLO") dim ok ok = true if ob("hello") <> "there" then WScript.Echo "**** The dictionary value was wrong!!" ok = false end if if ob("hi") <> "there" then WScript.Echo "**** The other dictionary value was wrong!!" ok = false end if if ok then WScript.Echo "VBScript has successfully tested Python.Dictionary" end if PK ѳPԐGx%%win32com/test/testShell.pyUT l_Zx`ux import sys, os import struct import unittest import copy import datetime import win32timezone try: sys_maxsize = sys.maxsize # 2.6 and later - maxsize != maxint on 64bits except AttributeError: sys_maxsize = sys.maxint import win32con import pythoncom import pywintypes from win32com.shell import shell from win32com.shell.shellcon import * from win32com.storagecon import * import win32com.test.util from pywin32_testutil import str2bytes class ShellTester(win32com.test.util.TestCase): def testShellLink(self): desktop = str(shell.SHGetSpecialFolderPath(0, CSIDL_DESKTOP)) num = 0 shellLink = pythoncom.CoCreateInstance(shell.CLSID_ShellLink, None, pythoncom.CLSCTX_INPROC_SERVER, shell.IID_IShellLink) persistFile = shellLink.QueryInterface(pythoncom.IID_IPersistFile) names = [os.path.join(desktop, n) for n in os.listdir(desktop)] programs = str(shell.SHGetSpecialFolderPath(0, CSIDL_PROGRAMS)) names.extend([os.path.join(programs, n) for n in os.listdir(programs)]) for name in names: try: persistFile.Load(name,STGM_READ) except pythoncom.com_error: continue # Resolve is slow - avoid it for our tests. #shellLink.Resolve(0, shell.SLR_ANY_MATCH | shell.SLR_NO_UI) fname, findData = shellLink.GetPath(0) unc = shellLink.GetPath(shell.SLGP_UNCPRIORITY)[0] num += 1 if num == 0: # This isn't a fatal error, but is unlikely. print("Could not find any links on your desktop or programs dir, which is unusual") def testShellFolder(self): sf = shell.SHGetDesktopFolder() names_1 = [] for i in sf: # Magically calls EnumObjects name = sf.GetDisplayNameOf(i, SHGDN_NORMAL) names_1.append(name) # And get the enumerator manually enum = sf.EnumObjects(0, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS | SHCONTF_INCLUDEHIDDEN) names_2 = [] for i in enum: name = sf.GetDisplayNameOf(i, SHGDN_NORMAL) names_2.append(name) names_1.sort() names_2.sort() self.assertEqual(names_1, names_2) class PIDLTester(win32com.test.util.TestCase): def _rtPIDL(self, pidl): pidl_str = shell.PIDLAsString(pidl) pidl_rt = shell.StringAsPIDL(pidl_str) self.assertEqual(pidl_rt, pidl) pidl_str_rt = shell.PIDLAsString(pidl_rt) self.assertEqual(pidl_str_rt, pidl_str) def _rtCIDA(self, parent, kids): cida = parent, kids cida_str = shell.CIDAAsString(cida) cida_rt = shell.StringAsCIDA(cida_str) self.assertEqual(cida, cida_rt) cida_str_rt = shell.CIDAAsString(cida_rt) self.assertEqual(cida_str_rt, cida_str) def testPIDL(self): # A PIDL of "\1" is: cb pidl cb expect = str2bytes("\03\00" "\1" "\0\0") self.assertEqual(shell.PIDLAsString([str2bytes("\1")]), expect) self._rtPIDL([str2bytes("\0")]) self._rtPIDL([str2bytes("\1"), str2bytes("\2"), str2bytes("\3")]) self._rtPIDL([str2bytes("\0") * 2048] * 2048) # PIDL must be a list self.assertRaises(TypeError, shell.PIDLAsString, "foo") def testCIDA(self): self._rtCIDA([str2bytes("\0")], [ [str2bytes("\0")] ]) self._rtCIDA([str2bytes("\1")], [ [str2bytes("\2")] ]) self._rtCIDA([str2bytes("\0")], [ [str2bytes("\0")], [str2bytes("\1")], [str2bytes("\2")] ]) def testBadShortPIDL(self): # A too-short child element: cb pidl cb pidl = str2bytes("\01\00" "\1") self.assertRaises(ValueError, shell.StringAsPIDL, pidl) # ack - tried to test too long PIDLs, but a len of 0xFFFF may not # always fail. class FILEGROUPDESCRIPTORTester(win32com.test.util.TestCase): def _getTestTimes(self): if issubclass(pywintypes.TimeType, datetime.datetime): ctime = win32timezone.now() # FILETIME only has ms precision... ctime = ctime.replace(microsecond=ctime.microsecond // 1000 * 1000) atime = ctime + datetime.timedelta(seconds=1) wtime = atime + datetime.timedelta(seconds=1) else: ctime = pywintypes.Time(11) atime = pywintypes.Time(12) wtime = pywintypes.Time(13) return ctime, atime, wtime def _testRT(self, fd): fgd_string = shell.FILEGROUPDESCRIPTORAsString([fd]) fd2 = shell.StringAsFILEGROUPDESCRIPTOR(fgd_string)[0] fd = fd.copy() fd2 = fd2.copy() # The returned objects *always* have dwFlags and cFileName. if 'dwFlags' not in fd: del fd2['dwFlags'] if 'cFileName' not in fd: self.assertEqual(fd2['cFileName'], '') del fd2['cFileName'] self.assertEqual(fd, fd2) def _testSimple(self, make_unicode): fgd = shell.FILEGROUPDESCRIPTORAsString([], make_unicode) header = struct.pack("i", 0) self.assertEqual(header, fgd[:len(header)]) self._testRT(dict()) d = dict() fgd = shell.FILEGROUPDESCRIPTORAsString([d], make_unicode) header = struct.pack("i", 1) self.assertEqual(header, fgd[:len(header)]) self._testRT(d) def testSimpleBytes(self): self._testSimple(False) def testSimpleUnicode(self): self._testSimple(True) def testComplex(self): clsid = pythoncom.MakeIID("{CD637886-DB8B-4b04-98B5-25731E1495BE}") ctime, atime, wtime = self._getTestTimes() d = dict(cFileName="foo.txt", clsid=clsid, sizel=(1,2), pointl=(3,4), dwFileAttributes = win32con.FILE_ATTRIBUTE_NORMAL, ftCreationTime=ctime, ftLastAccessTime=atime, ftLastWriteTime=wtime, nFileSize=sys_maxsize + 1) self._testRT(d) def testUnicode(self): # exercise a bug fixed in build 210 - multiple unicode objects failed. ctime, atime, wtime = self._getTestTimes() d = [dict(cFileName="foo.txt", sizel=(1,2), pointl=(3,4), dwFileAttributes = win32con.FILE_ATTRIBUTE_NORMAL, ftCreationTime=ctime, ftLastAccessTime=atime, ftLastWriteTime=wtime, nFileSize=sys_maxsize + 1), dict(cFileName="foo2.txt", sizel=(1,2), pointl=(3,4), dwFileAttributes = win32con.FILE_ATTRIBUTE_NORMAL, ftCreationTime=ctime, ftLastAccessTime=atime, ftLastWriteTime=wtime, nFileSize=sys_maxsize + 1), dict(cFileName="foo\xa9.txt", sizel=(1,2), pointl=(3,4), dwFileAttributes = win32con.FILE_ATTRIBUTE_NORMAL, ftCreationTime=ctime, ftLastAccessTime=atime, ftLastWriteTime=wtime, nFileSize=sys_maxsize + 1), ] s = shell.FILEGROUPDESCRIPTORAsString(d, 1) d2 = shell.StringAsFILEGROUPDESCRIPTOR(s) # clobber 'dwFlags' - they are not expected to be identical for t in d2: del t['dwFlags'] self.assertEqual(d, d2) class FileOperationTester(win32com.test.util.TestCase): def setUp(self): import tempfile self.src_name = os.path.join(tempfile.gettempdir(), "pywin32_testshell") self.dest_name = os.path.join(tempfile.gettempdir(), "pywin32_testshell_dest") self.test_data = str2bytes("Hello from\0Python") f=open(self.src_name, "wb") f.write(self.test_data) f.close() try: os.unlink(self.dest_name) except os.error: pass def tearDown(self): for fname in (self.src_name, self.dest_name): if os.path.isfile(fname): os.unlink(fname) def testCopy(self): s = (0, # hwnd, FO_COPY, #operation self.src_name, self.dest_name) rc, aborted = shell.SHFileOperation(s) self.failUnless(not aborted) self.failUnlessEqual(0, rc) self.failUnless(os.path.isfile(self.src_name)) self.failUnless(os.path.isfile(self.dest_name)) def testRename(self): s = (0, # hwnd, FO_RENAME, #operation self.src_name, self.dest_name) rc, aborted = shell.SHFileOperation(s) self.failUnless(not aborted) self.failUnlessEqual(0, rc) self.failUnless(os.path.isfile(self.dest_name)) self.failUnless(not os.path.isfile(self.src_name)) def testMove(self): s = (0, # hwnd, FO_MOVE, #operation self.src_name, self.dest_name) rc, aborted = shell.SHFileOperation(s) self.failUnless(not aborted) self.failUnlessEqual(0, rc) self.failUnless(os.path.isfile(self.dest_name)) self.failUnless(not os.path.isfile(self.src_name)) def testDelete(self): s = (0, # hwnd, FO_DELETE, #operation self.src_name, None, FOF_NOCONFIRMATION) rc, aborted = shell.SHFileOperation(s) self.failUnless(not aborted) self.failUnlessEqual(0, rc) self.failUnless(not os.path.isfile(self.src_name)) if __name__=='__main__': win32com.test.util.testmain() PK ѳP%֏ win32com/test/policySemantics.pyUT l_Zx`ux import win32com.server.util import win32com.client import pythoncom import winerror import win32com.test.util import unittest class Error(Exception): pass # An object representing a list of numbers class PythonSemanticClass: _public_methods_ = ["In"] # DISPIDs are allocated. _dispid_to_func_ = { 10: 'Add', 11:'Remove'} # DISPIDs specified by the object. def __init__(self): self.list = [] def _NewEnum(self): return win32com.server.util.NewEnum(self.list) def _value_(self): # should return an array. return self.list def _Evaluate(self): # return the sum return sum(self.list) def In(self, value): return value in self.list def Add(self, value): self.list.append(value) def Remove(self, value): self.list.remove(value) def DispExTest(ob): if not __debug__: print("WARNING: Tests dressed up as assertions are being skipped!") assert ob.GetDispID("Add", 0)==10, "Policy did not honour the dispid" # Not impl # assert ob.GetMemberName(10, 0)=="add", "Policy did not give me the correct function for the dispid" assert ob.GetDispID("Remove", 0)==11, "Policy did not honour the dispid" assert ob.GetDispID("In", 0)==1000, "Allocated dispid unexpected value" assert ob.GetDispID("_NewEnum", 0)==pythoncom.DISPID_NEWENUM, "_NewEnum() got unexpected DISPID" dispids = [] dispid = -1 while 1: try: dispid = ob.GetNextDispID(0, dispid) dispids.append(dispid) except pythoncom.com_error as xxx_todo_changeme: (hr, desc, exc, arg) = xxx_todo_changeme.args assert hr==winerror.S_FALSE, "Bad result at end of enum" break dispids.sort() if dispids != [pythoncom.DISPID_EVALUATE, pythoncom.DISPID_NEWENUM, 10, 11, 1000]: raise Error("Got back the wrong dispids: %s" % dispids) def SemanticTest(ob): # First just check our object "generally" as expected. ob.Add(1) ob.Add(2) ob.Add(3) # invoke _value_ if ob() != (1,2,3): raise Error("Bad result - got %s" % (repr(ob()))) dispob = ob._oleobj_ rc = dispob.Invoke(pythoncom.DISPID_EVALUATE, 0, pythoncom.DISPATCH_METHOD|pythoncom.DISPATCH_PROPERTYGET, 1) if rc != 6: raise Error("Evaluate returned %d" % rc) class Tester(win32com.test.util.TestCase): def setUp(self): debug=0 import win32com.server.dispatcher if debug: dispatcher=win32com.server.dispatcher.DefaultDebugDispatcher else: dispatcher=None disp = win32com.server.util.wrap(PythonSemanticClass(), useDispatcher=dispatcher) self.ob = win32com.client.Dispatch(disp) def tearDown(self): self.ob = None def testSemantics(self): SemanticTest(self.ob) def testIDispatchEx(self): dispexob = self.ob._oleobj_.QueryInterface(pythoncom.IID_IDispatchEx) DispExTest(dispexob) if __name__=='__main__': unittest.main() PK ѳPb#win32com/test/testMSOfficeEvents.pyUT l_Zx`ux # OfficeEvents - test/demonstrate events with Word and Excel. from win32com.client import DispatchWithEvents, Dispatch import msvcrt, pythoncom import time, sys import types import threading stopEvent = threading.Event() def TestExcel(): class ExcelEvents: def OnNewWorkbook(self, wb): if type(wb) != types.InstanceType: raise RuntimeError("The transformer doesnt appear to have translated this for us!") self.seen_events["OnNewWorkbook"] = None def OnWindowActivate(self, wb, wn): if type(wb) != types.InstanceType or type(wn) != types.InstanceType: raise RuntimeError("The transformer doesnt appear to have translated this for us!") self.seen_events["OnWindowActivate"] = None def OnWindowDeactivate(self, wb, wn): self.seen_events["OnWindowDeactivate"] = None def OnSheetDeactivate(self, sh): self.seen_events["OnSheetDeactivate"] = None def OnSheetBeforeDoubleClick(self, Sh, Target, Cancel): if Target.Column % 2 == 0: print("You can double-click there...") else: print("You can not double-click there...") # This function is a void, so the result ends up in # the only ByRef - Cancel. return 1 class WorkbookEvents: def OnActivate(self): print("workbook OnActivate") def OnBeforeRightClick(self, Target, Cancel): print("It's a Worksheet Event") e = DispatchWithEvents("Excel.Application", ExcelEvents) e.seen_events = {} e.Visible=1 book = e.Workbooks.Add() book = DispatchWithEvents(book, WorkbookEvents) print("Have book", book) # sheet = e.Worksheets(1) # sheet = DispatchWithEvents(sheet, WorksheetEvents) print("Double-click in a few of the Excel cells...") print("Press any key when finished with Excel, or wait 10 seconds...") if not _WaitForFinish(e, 10): e.Quit() if not _CheckSeenEvents(e, ["OnNewWorkbook", "OnWindowActivate"]): sys.exit(1) def TestWord(): class WordEvents: def OnDocumentChange(self): self.seen_events["OnDocumentChange"] = None def OnWindowActivate(self, doc, wn): self.seen_events["OnWindowActivate"] = None def OnQuit(self): self.seen_events["OnQuit"] = None stopEvent.set() w = DispatchWithEvents("Word.Application", WordEvents) w.seen_events = {} w.Visible = 1 w.Documents.Add() print("Press any key when finished with Word, or wait 10 seconds...") if not _WaitForFinish(w, 10): w.Quit() if not _CheckSeenEvents(w, ["OnDocumentChange", "OnWindowActivate"]): sys.exit(1) def _WaitForFinish(ob, timeout): end = time.time() + timeout while 1: if msvcrt.kbhit(): msvcrt.getch() break pythoncom.PumpWaitingMessages() stopEvent.wait(.2) if stopEvent.isSet(): stopEvent.clear() break try: if not ob.Visible: # Gone invisible - we need to pretend we timed # out, so the app is quit. return 0 except pythoncom.com_error: # Excel is busy (eg, editing the cell) - ignore pass if time.time() > end: return 0 return 1 def _CheckSeenEvents(o, events): rc = 1 for e in events: if e not in o.seen_events: print("ERROR: Expected event did not trigger", e) rc = 0 return rc def test(): import sys if "noword" not in sys.argv[1:]: TestWord() if "noexcel" not in sys.argv[1:]: TestExcel() print("Word and Excel event tests passed.") if __name__=='__main__': test() PK Y03Kawin32com/test/testInterp.vbsUT  YZx`ux set o = CreateObject("Python.Interpreter") if o.Eval("1+1") <> 2 Then WScript.Echo "Eval('1+1') failed" bFailed = True end if if bFailed then WScript.Echo "*********** VBScript tests failed *********" else WScript.Echo "VBScript test worked OK" end if PK ѳP!W$$win32com/test/testClipboard.pyUT l_Zx`ux # testClipboard.py import unittest import pythoncom import win32con import winerror import win32clipboard from pywin32_testutil import str2bytes from win32com.server.util import NewEnum, wrap from win32com.server.exception import COMException IDataObject_Methods = """GetData GetDataHere QueryGetData GetCanonicalFormatEtc SetData EnumFormatEtc DAdvise DUnadvise EnumDAdvise""".split() # A COM object implementing IDataObject used for basic testing. num_do_objects = 0 def WrapCOMObject(ob, iid=None): return wrap(ob, iid=iid, useDispatcher = 0) class TestDataObject: _com_interfaces_ = [pythoncom.IID_IDataObject] _public_methods_ = IDataObject_Methods def __init__(self, strval): global num_do_objects num_do_objects += 1 self.strval = strval self.supported_fe = [] for cf in (win32con.CF_TEXT, win32con.CF_UNICODETEXT): fe = cf, None, pythoncom.DVASPECT_CONTENT, -1, pythoncom.TYMED_HGLOBAL self.supported_fe.append(fe) def __del__(self): global num_do_objects num_do_objects -= 1 def _query_interface_(self, iid): if iid==pythoncom.IID_IEnumFORMATETC: return NewEnum(self.supported_fe, iid=iid) def GetData(self, fe): ret_stg = None cf, target, aspect, index, tymed = fe if aspect & pythoncom.DVASPECT_CONTENT and \ tymed==pythoncom.TYMED_HGLOBAL: if cf == win32con.CF_TEXT: ret_stg = pythoncom.STGMEDIUM() # ensure always 'bytes' by encoding string. ret_stg.set(pythoncom.TYMED_HGLOBAL, str2bytes(self.strval)) elif cf == win32con.CF_UNICODETEXT: ret_stg = pythoncom.STGMEDIUM() ret_stg.set(pythoncom.TYMED_HGLOBAL, str(self.strval)) if ret_stg is None: raise COMException(hresult=winerror.E_NOTIMPL) return ret_stg def GetDataHere(self, fe): raise COMException(hresult=winerror.E_NOTIMPL) def QueryGetData(self, fe): cf, target, aspect, index, tymed = fe if aspect & pythoncom.DVASPECT_CONTENT == 0: raise COMException(hresult=winerror.DV_E_DVASPECT) if tymed!=pythoncom.TYMED_HGLOBAL: raise COMException(hresult=winerror.DV_E_TYMED) return None # should check better def GetCanonicalFormatEtc(self, fe): RaiseCOMException(winerror.DATA_S_SAMEFORMATETC) # return fe def SetData(self, fe, medium): raise COMException(hresult=winerror.E_NOTIMPL) def EnumFormatEtc(self, direction): if direction != pythoncom.DATADIR_GET: raise COMException(hresult=winerror.E_NOTIMPL) return NewEnum(self.supported_fe, iid=pythoncom.IID_IEnumFORMATETC) def DAdvise(self, fe, flags, sink): raise COMException(hresult=winerror.E_NOTIMPL) def DUnadvise(self, connection): raise COMException(hresult=winerror.E_NOTIMPL) def EnumDAdvise(self): raise COMException(hresult=winerror.E_NOTIMPL) class ClipboardTester(unittest.TestCase): def setUp(self): pythoncom.OleInitialize() def tearDown(self): try: pythoncom.OleFlushClipboard() except pythoncom.com_error: # We never set anything! pass def testIsCurrentClipboard(self): do = TestDataObject("Hello from Python") do = WrapCOMObject(do, iid=pythoncom.IID_IDataObject) pythoncom.OleSetClipboard(do) self.failUnless(pythoncom.OleIsCurrentClipboard(do)) def testComToWin32(self): # Set the data via our DataObject do = TestDataObject("Hello from Python") do = WrapCOMObject(do, iid=pythoncom.IID_IDataObject) pythoncom.OleSetClipboard(do) # Then get it back via the standard win32 clipboard functions. win32clipboard.OpenClipboard() got = win32clipboard.GetClipboardData(win32con.CF_TEXT) # CF_TEXT gives bytes on py3k - use str2bytes() to ensure that's true. expected = str2bytes("Hello from Python") self.assertEqual(got, expected) # Now check unicode got = win32clipboard.GetClipboardData(win32con.CF_UNICODETEXT) self.assertEqual(got, "Hello from Python") win32clipboard.CloseClipboard() def testWin32ToCom(self): # Set the data via the std win32 clipboard functions. val = str2bytes("Hello again!") # ensure always bytes, even in py3k win32clipboard.OpenClipboard() win32clipboard.SetClipboardData(win32con.CF_TEXT, val) win32clipboard.CloseClipboard() # and get it via an IDataObject provided by COM do = pythoncom.OleGetClipboard() cf = win32con.CF_TEXT, None, pythoncom.DVASPECT_CONTENT, -1, pythoncom.TYMED_HGLOBAL stg = do.GetData(cf) got = stg.data # The data we get back has the \0, as our STGMEDIUM has no way of # knowing if it meant to be a string, or a binary buffer, so # it must return it too. self.failUnlessEqual(got, str2bytes("Hello again!\0")) def testDataObjectFlush(self): do = TestDataObject("Hello from Python") do = WrapCOMObject(do, iid=pythoncom.IID_IDataObject) pythoncom.OleSetClipboard(do) self.assertEqual(num_do_objects, 1) do = None # clear my ref! pythoncom.OleFlushClipboard() self.assertEqual(num_do_objects, 0) def testDataObjectReset(self): do = TestDataObject("Hello from Python") do = WrapCOMObject(do) pythoncom.OleSetClipboard(do) do = None # clear my ref! self.assertEqual(num_do_objects, 1) pythoncom.OleSetClipboard(None) self.assertEqual(num_do_objects, 0) if __name__=='__main__': from win32com.test import util util.testmain() PK ѳP-/EOEOwin32com/test/testvb.pyUT l_Zx`ux # Test code for a VB Program. # # This requires the PythonCOM VB Test Harness. # import sys import winerror import pythoncom, win32com.client, win32com.client.dynamic, win32com.client.gencache from win32com.server.util import NewCollection, wrap from win32com.test import util from pywin32_testutil import str2memory import traceback # for debugging useDispatcher = None ## import win32com.server.dispatcher ## useDispatcher = win32com.server.dispatcher.DefaultDebugDispatcher error = RuntimeError # Set up a COM object that VB will do some callbacks on. This is used # to test byref params for gateway IDispatch. class TestObject: _public_methods_ = ["CallbackVoidOneByRef","CallbackResultOneByRef", "CallbackVoidTwoByRef", "CallbackString","CallbackResultOneByRefButReturnNone", "CallbackVoidOneByRefButReturnNone", "CallbackArrayResult", "CallbackArrayResultOneArrayByRef", "CallbackArrayResultWrongSize" ] def CallbackVoidOneByRef(self, intVal): return intVal + 1 def CallbackResultOneByRef(self, intVal): return intVal, intVal + 1 def CallbackVoidTwoByRef(self, int1, int2): return int1+int2, int1-int2 def CallbackString(self, strVal): return 0, strVal + " has visited Python" def CallbackArrayResult(self, arrayVal): ret = [] for i in arrayVal: ret.append(i+1) # returning as a list forces it be processed as a single result # (rather than a tuple, where it may be interpreted as # multiple results for byref unpacking) return ret def CallbackArrayResultWrongSize(self, arrayVal): return list(arrayVal[:-1]) def CallbackArrayResultOneArrayByRef(self, arrayVal): ret = [] for i in arrayVal: ret.append(i+1) # See above for list processing. return list(arrayVal), ret def CallbackResultOneByRefButReturnNone(self, intVal): return def CallbackVoidOneByRefButReturnNone(self, intVal): return def TestVB( vbtest, bUseGenerated ): vbtest.LongProperty = -1 if vbtest.LongProperty != -1: raise error("Could not set the long property correctly.") vbtest.IntProperty = 10 if vbtest.IntProperty != 10: raise error("Could not set the integer property correctly.") vbtest.VariantProperty = 10 if vbtest.VariantProperty != 10: raise error("Could not set the variant integer property correctly.") vbtest.VariantProperty = str2memory('raw\0data') if vbtest.VariantProperty != str2memory('raw\0data'): raise error("Could not set the variant buffer property correctly.") vbtest.StringProperty = "Hello from Python" if vbtest.StringProperty != "Hello from Python": raise error("Could not set the string property correctly.") vbtest.VariantProperty = "Hello from Python" if vbtest.VariantProperty != "Hello from Python": raise error("Could not set the variant string property correctly.") vbtest.VariantProperty = (1.0, 2.0, 3.0) if vbtest.VariantProperty != (1.0, 2.0, 3.0): raise error("Could not set the variant property to an array of floats correctly - '%s'." % (vbtest.VariantProperty,)) TestArrays(vbtest, bUseGenerated) TestStructs(vbtest) TestCollections(vbtest) assert vbtest.TakeByValObject(vbtest)==vbtest # Python doesnt support PUTREF properties without a typeref # (although we could) if bUseGenerated: ob = vbtest.TakeByRefObject(vbtest) assert ob[0]==vbtest and ob[1]==vbtest # A property that only has PUTREF defined. vbtest.VariantPutref = vbtest if vbtest.VariantPutref._oleobj_!= vbtest._oleobj_: raise error("Could not set the VariantPutref property correctly.") # Cant test further types for this VariantPutref, as only # COM objects can be stored ByRef. # A "set" type property - only works for generated. # VB recognizes a collection via a few "private" interfaces that we # could later build support in for. # vbtest.CollectionProperty = NewCollection((1,2,"3", "Four")) # if vbtest.CollectionProperty != (1,2,"3", "Four"): # raise error("Could not set the Collection property correctly - got back " + str(vbtest.CollectionProperty)) # These are sub's that have a single byref param # Result should be just the byref. if vbtest.IncrementIntegerParam(1) != 2: raise error("Could not pass an integer byref") # Sigh - we cant have *both* "ommited byref" and optional args # We really have to opt that args nominated as optional work as optional # rather than simply all byrefs working as optional. # if vbtest.IncrementIntegerParam() != 1: # raise error("Could not pass an omitted integer byref") if vbtest.IncrementVariantParam(1) != 2: raise error("Could not pass an int VARIANT byref:"+str(vbtest.IncrementVariantParam(1))) if vbtest.IncrementVariantParam(1.5) != 2.5: raise error("Could not pass a float VARIANT byref") # Can't test IncrementVariantParam with the param omitted as it # it not declared in the VB code as "Optional" callback_ob = wrap(TestObject(), useDispatcher = useDispatcher) vbtest.DoSomeCallbacks(callback_ob) ret = vbtest.PassIntByVal(1) if ret != 2: raise error("Could not increment the integer - "+str(ret)) TestVBInterface(vbtest) # Python doesnt support byrefs without some sort of generated support. if bUseGenerated: # This is a VB function that takes a single byref # Hence 2 return values - function and byref. ret = vbtest.PassIntByRef(1) if ret != (1,2): raise error("Could not increment the integer - "+str(ret)) # Check you can leave a byref arg blank. # see above # ret = vbtest.PassIntByRef() # if ret != (0,1): # raise error("Could not increment the integer with default arg- "+str(ret)) def _DoTestCollection(vbtest, col_name, expected): # It sucks that some objects allow "Count()", but others "Count" def _getcount(ob): r = getattr(ob, "Count") if type(r)!=type(0): return r() return r c = getattr(vbtest, col_name) check = [] for item in c: check.append(item) if check != list(expected): raise error("Collection %s didn't have %r (had %r)" % (col_name, expected, check)) # Just looping over the collection again works (ie, is restartable) check = [] for item in c: check.append(item) if check != list(expected): raise error("Collection 2nd time around %s didn't have %r (had %r)" % (col_name, expected, check)) # Check we can get it via iter() i = iter(getattr(vbtest, col_name)) check = [] for item in i: check.append(item) if check != list(expected): raise error("Collection iterator %s didn't have %r 2nd time around (had %r)" % (col_name, expected, check)) # but an iterator is not restartable check = [] for item in i: check.append(item) if check != []: raise error("2nd time around Collection iterator %s wasn't empty (had %r)" % (col_name, check)) # Check len()==Count() c = getattr(vbtest, col_name) if len(c) != _getcount(c): raise error("Collection %s __len__(%r) wasn't==Count(%r)" % (col_name, len(c), _getcount(c))) # Check we can do it with zero based indexing. c = getattr(vbtest, col_name) check = [] for i in range(_getcount(c)): check.append(c[i]) if check != list(expected): raise error("Collection %s didn't have %r (had %r)" % (col_name, expected, check)) # Check we can do it with our old "Skip/Next" methods. c = getattr(vbtest, col_name)._NewEnum() check = [] while 1: n = c.Next() if not n: break check.append(n[0]) if check != list(expected): raise error("Collection %s didn't have %r (had %r)" % (col_name, expected, check)) def TestCollections(vbtest): _DoTestCollection(vbtest, "CollectionProperty", [1,"Two", "3"]) # zero based indexing works for simple VB collections. if vbtest.CollectionProperty[0] != 1: raise error("The CollectionProperty[0] element was not the default value") _DoTestCollection(vbtest, "EnumerableCollectionProperty", []) vbtest.EnumerableCollectionProperty.Add(1) vbtest.EnumerableCollectionProperty.Add("Two") vbtest.EnumerableCollectionProperty.Add("3") _DoTestCollection(vbtest, "EnumerableCollectionProperty", [1,"Two", "3"]) def _DoTestArray(vbtest, data, expected_exception = None): try: vbtest.ArrayProperty = data if expected_exception is not None: raise error("Expected '%s'" % expected_exception) except expected_exception: return got = vbtest.ArrayProperty if got != data: raise error( "Could not set the array data correctly - got %r, expected %r" % (got, data)) def TestArrays(vbtest, bUseGenerated): # Try and use a safe array (note that the VB code has this declared as a VARIANT # and I cant work out how to force it to use native arrays! # (NOTE Python will convert incoming arrays to tuples, so we pass a tuple, even tho # a list works fine - just makes it easier for us to compare the result! # Empty array _DoTestArray(vbtest, ()) # Empty child array _DoTestArray(vbtest, ((), ())) # ints _DoTestArray(vbtest, tuple(range(1,100))) # Floats _DoTestArray(vbtest, (1.0, 2.0, 3.0)) # Strings. _DoTestArray(vbtest, tuple("Hello from Python".split())) # Date and Time? # COM objects. _DoTestArray(vbtest, (vbtest, vbtest)) # Mixed _DoTestArray(vbtest, (1, 2.0, "3")) # Array alements containing other arrays _DoTestArray(vbtest, (1,(vbtest, vbtest),("3","4"))) # Multi-dimensional _DoTestArray(vbtest, (( (1,2,3), (4,5,6) ))) _DoTestArray(vbtest, (( (vbtest,vbtest,vbtest), (vbtest,vbtest,vbtest) ))) # Another dimension! arrayData = ( ((1,2),(3,4),(5,6)), ((7,8),(9,10),(11,12)) ) arrayData = ( ((vbtest,vbtest),(vbtest,vbtest),(vbtest,vbtest)), ((vbtest,vbtest),(vbtest,vbtest),(vbtest,vbtest)) ) _DoTestArray(vbtest, arrayData) # Check that when a '__getitem__ that fails' object is the first item # in the structure, we don't mistake it for a sequence. _DoTestArray(vbtest, (vbtest, 2.0, "3")) _DoTestArray(vbtest, (1, 2.0, vbtest)) # Pass arbitrarily sized arrays - these used to fail, but thanks to # Stefan Schukat, they now work! expected_exception = None arrayData = ( ((1,2,1),(3,4),(5,6)), ((7,8),(9,10),(11,12)) ) _DoTestArray(vbtest, arrayData, expected_exception) arrayData = ( ((vbtest,vbtest),), ((vbtest,),)) _DoTestArray(vbtest, arrayData, expected_exception) # Pass bad data - last item wrong size arrayData = ( ((1,2),(3,4),(5,6,8)), ((7,8),(9,10),(11,12)) ) _DoTestArray(vbtest, arrayData, expected_exception) # byref safearray results with incorrect size. callback_ob = wrap(TestObject(), useDispatcher = useDispatcher) print("** Expecting a 'ValueError' exception to be printed next:") try: vbtest.DoCallbackSafeArraySizeFail(callback_ob) except pythoncom.com_error as exc: assert exc.excepinfo[1] == "Python COM Server Internal Error", "Didnt get the correct exception - '%s'" % (exc,) if bUseGenerated: # This one is a bit strange! The array param is "ByRef", as VB insists. # The function itself also _returns_ the arram param. # Therefore, Python sees _2_ result values - one for the result, # and one for the byref. testData = "Mark was here".split() resultData, byRefParam = vbtest.PassSAFEARRAY(testData) if testData != list(resultData): raise error("The safe array data was not what we expected - got " + str(resultData)) if testData != list(byRefParam): raise error("The safe array data was not what we expected - got " + str(byRefParam)) testData = [1.0, 2.0, 3.0] resultData, byRefParam = vbtest.PassSAFEARRAYVariant(testData) assert testData == list(byRefParam) assert testData == list(resultData) testData = ["hi", "from", "Python"] resultData, byRefParam = vbtest.PassSAFEARRAYVariant(testData) assert testData == list(byRefParam), "Expected '%s', got '%s'" % (testData, list(byRefParam)) assert testData == list(resultData), "Expected '%s', got '%s'" % (testData, list(resultData)) # This time, instead of an explicit str() for 1.5, we just # pass Unicode, so the result should compare equal testData = [1, 2.0, "3"] resultData, byRefParam = vbtest.PassSAFEARRAYVariant(testData) assert testData == list(byRefParam) assert testData == list(resultData) print("Array tests passed") def TestStructs(vbtest): try: vbtest.IntProperty = "One" raise error("Should have failed by now") except pythoncom.com_error as exc: if exc.hresult != winerror.DISP_E_TYPEMISMATCH: raise error("Expected DISP_E_TYPEMISMATCH") s = vbtest.StructProperty if s.int_val != 99 or str(s.str_val) != "hello": raise error("The struct value was not correct") s.str_val = "Hi from Python" s.int_val = 11 if s.int_val != 11 or str(s.str_val) != "Hi from Python": raise error("The struct value didnt persist!") if s.sub_val.int_val != 66 or str(s.sub_val.str_val) != "sub hello": raise error("The sub-struct value was not correct") sub = s.sub_val sub.int_val = 22 if sub.int_val != 22: print(sub.int_val) raise error("The sub-struct value didnt persist!") if s.sub_val.int_val != 22: print(s.sub_val.int_val) raise error("The sub-struct value (re-fetched) didnt persist!") if s.sub_val.array_val[0].int_val != 0 or str(s.sub_val.array_val[0].str_val) != "zero": print(s.sub_val.array_val[0].int_val) raise error("The array element wasnt correct") s.sub_val.array_val[0].int_val = 99 s.sub_val.array_val[1].int_val = 66 if s.sub_val.array_val[0].int_val != 99 or \ s.sub_val.array_val[1].int_val != 66: print(s.sub_val.array_val[0].int_val) raise error("The array element didnt persist.") # Now pass the struct back to VB vbtest.StructProperty = s # And get it back again s = vbtest.StructProperty if s.int_val != 11 or str(s.str_val) != "Hi from Python": raise error("After sending to VB, the struct value didnt persist!") if s.sub_val.array_val[0].int_val != 99: raise error("After sending to VB, the struct array value didnt persist!") # Now do some object equality tests. assert s==s assert s!=None if sys.version_info > (3,0): try: s < None raise error("Expected type error") except TypeError: pass try: None < s raise error("Expected type error") except TypeError: pass assert s != s.sub_val import copy s2 = copy.copy(s) assert s is not s2 assert s == s2 s2.int_val = 123 assert s != s2 # Make sure everything works with functions s2 = vbtest.GetStructFunc() assert s==s2 vbtest.SetStructSub(s2) # Create a new structure, and set its elements. s = win32com.client.Record("VBStruct", vbtest) assert s.int_val == 0, "new struct inst initialized correctly!" s.int_val = -1 vbtest.SetStructSub(s) assert vbtest.GetStructFunc().int_val == -1, "new struct didnt make the round trip!" # Finally, test stand-alone structure arrays. s_array = vbtest.StructArrayProperty assert s_array is None, "Expected None from the uninitialized VB array" vbtest.MakeStructArrayProperty(3) s_array = vbtest.StructArrayProperty assert len(s_array)==3 for i in range(len(s_array)): assert s_array[i].int_val == i assert s_array[i].sub_val.int_val == i assert s_array[i].sub_val.array_val[0].int_val == i assert s_array[i].sub_val.array_val[1].int_val == i+1 assert s_array[i].sub_val.array_val[2].int_val == i+2 # Some error type checks. try: s.bad_attribute raise RuntimeError("Could get a bad attribute") except AttributeError: pass m = s.__members__ assert m[0]=="int_val" and m[1]=="str_val" and m[2]=="ob_val" and m[3]=="sub_val", m # Test attribute errors. try: s.foo raise RuntimeError("Expected attribute error") except AttributeError as exc: assert "foo" in str(exc), exc # test repr - it uses repr() of the sub-objects, so check it matches. expected = "com_struct(int_val=%r, str_val=%r, ob_val=%r, sub_val=%r)" % (s.int_val, s.str_val, s.ob_val, s.sub_val) if repr(s) != expected: print("Expected repr:", expected) print("Actual repr :", repr(s)) raise RuntimeError("repr() of record object failed") print("Struct/Record tests passed") def TestVBInterface(ob): t = ob.GetInterfaceTester(2) if t.getn() != 2: raise error("Initial value wrong") t.setn(3) if t.getn() != 3: raise error("New value wrong") def TestObjectSemantics(ob): # a convenient place to test some of our equality semantics assert ob==ob._oleobj_ assert not ob!=ob._oleobj_ # same test again, but lhs and rhs reversed. assert ob._oleobj_==ob assert not ob._oleobj_!=ob # same tests but against different pointers. COM identity rules should # still ensure all works assert ob._oleobj_==ob._oleobj_.QueryInterface(pythoncom.IID_IUnknown) assert not ob._oleobj_!=ob._oleobj_.QueryInterface(pythoncom.IID_IUnknown) assert ob._oleobj_!=None assert None!=ob._oleobj_ assert ob!=None assert None!=ob if sys.version_info > (3,0): try: ob < None raise error("Expected type error") except TypeError: pass try: None < ob raise error("Expected type error") except TypeError: pass assert ob._oleobj_.QueryInterface(pythoncom.IID_IUnknown)==ob._oleobj_ assert not ob._oleobj_.QueryInterface(pythoncom.IID_IUnknown)!=ob._oleobj_ assert ob._oleobj_==ob._oleobj_.QueryInterface(pythoncom.IID_IDispatch) assert not ob._oleobj_!=ob._oleobj_.QueryInterface(pythoncom.IID_IDispatch) assert ob._oleobj_.QueryInterface(pythoncom.IID_IDispatch)==ob._oleobj_ assert not ob._oleobj_.QueryInterface(pythoncom.IID_IDispatch)!=ob._oleobj_ print("Object semantic tests passed") def DoTestAll(): o = win32com.client.Dispatch("PyCOMVBTest.Tester") TestObjectSemantics(o) TestVB(o,1) o = win32com.client.dynamic.DumbDispatch("PyCOMVBTest.Tester") TestObjectSemantics(o) TestVB(o,0) def TestAll(): # Import the type library for the test module. Let the 'invalid clsid' # exception filter up, where the test runner will treat it as 'skipped' win32com.client.gencache.EnsureDispatch("PyCOMVBTest.Tester") if not __debug__: raise RuntimeError("This must be run in debug mode - we use assert!") try: DoTestAll() print("All tests appear to have worked!") except: # ????? print("TestAll() failed!!") traceback.print_exc() raise # Make this test run under our test suite to leak tests etc work def suite(): import unittest test = util.CapturingFunctionTestCase(TestAll, description="VB tests") suite = unittest.TestSuite() suite.addTest(test) return suite if __name__=='__main__': util.testmain() PK ѳPzwin32com/test/testExplorer.pyUT l_Zx`ux # testExplorer - import sys import os import win32com.client.dynamic from win32com.client import Dispatch import win32api import win32gui import win32con import winerror import glob import pythoncom import time from win32com.test.util import CheckClean bVisibleEventFired = 0 # These are errors we might see when this is run in automation (eg, on github) # Not sure exactly what -2125463506 is, but google shows it's a common error # possibly related to how IE is configured WRT site permissions etc. HRESULTS_IN_AUTOMATION = [-2125463506, winerror.MK_E_UNAVAILABLE] class ExplorerEvents: def OnVisible(self, visible): global bVisibleEventFired bVisibleEventFired = 1 def TestExplorerEvents(): global bVisibleEventFired try: iexplore = win32com.client.DispatchWithEvents("InternetExplorer.Application", ExplorerEvents) except pythoncom.com_error as exc: # In automation we see this error trying to connect to events # It's a little surprising that the non-event tests seem to work, but # whatever... if exc.hresult not in HRESULTS_IN_AUTOMATION: raise print("IE events appear to not be available, so skipping this test") return iexplore.Visible = 1 if not bVisibleEventFired: raise RuntimeError("The IE event did not appear to fire!") iexplore.Quit() iexplore = None bVisibleEventFired = 0 ie = win32com.client.Dispatch("InternetExplorer.Application") ie_events = win32com.client.DispatchWithEvents(ie, ExplorerEvents) ie.Visible = 1 if not bVisibleEventFired: raise RuntimeError("The IE event did not appear to fire!") ie.Quit() ie = None print("IE Event tests worked.") def TestObjectFromWindow(): # Check we can use ObjectFromLresult to get the COM object from the # HWND - see KB Q249232 # Locating the HWND is different than the KB says... hwnd = win32gui.FindWindow('IEFrame', None) for child_class in ['TabWindowClass', 'Shell DocObject View', 'Internet Explorer_Server']: hwnd = win32gui.FindWindowEx(hwnd, 0, child_class, None) # ack - not working for markh on vista with IE8 (or maybe it is the # lack of the 'accessibility' components mentioned in Q249232) # either way - not working! return # But here is the point - once you have an 'Internet Explorer_Server', # you can send a message and use ObjectFromLresult to get it back. msg = win32gui.RegisterWindowMessage("WM_HTML_GETOBJECT") rc, result = win32gui.SendMessageTimeout(hwnd, msg, 0, 0, win32con.SMTO_ABORTIFHUNG, 1000) ob = pythoncom.ObjectFromLresult(result, pythoncom.IID_IDispatch, 0) doc = Dispatch(ob) # just to prove it works, set the background color of the document. for color in "red green blue orange white".split(): doc.bgColor = color time.sleep(0.2) def TestExplorer(iexplore): if not iexplore.Visible: iexplore.Visible = -1 filename = os.path.join(os.path.dirname(__file__), '..\\readme.htm') iexplore.Navigate(win32api.GetFullPathName(filename)) win32api.Sleep(1000) TestObjectFromWindow() win32api.Sleep(3000) try: iexplore.Quit() except (AttributeError, pythoncom.com_error): # User got sick of waiting :) pass def TestAll(): try: try: try: iexplore = win32com.client.dynamic.Dispatch("InternetExplorer.Application") except pythoncom.com_error as exc: if exc.hresult not in HRESULTS_IN_AUTOMATION: raise print("IE appears to not be available, so skipping this test") return TestExplorer(iexplore) win32api.Sleep(1000) iexplore = None # Test IE events. TestExplorerEvents() # Give IE a chance to shutdown, else it can get upset on fast machines. time.sleep(2) # Note that the TextExplorerEvents will force makepy - hence # this gencache is really no longer needed. from win32com.client import gencache gencache.EnsureModule("{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}", 0, 1, 1) iexplore = win32com.client.Dispatch("InternetExplorer.Application") TestExplorer(iexplore) except pythoncom.com_error as exc: if exc.hresult!=winerror.RPC_E_DISCONNECTED: # user closed the app! raise finally: iexplore = None if __name__=='__main__': TestAll() CheckClean() PK Y03Kɬwin32com/test/readme.txtUT  YZx`ux COM Test Suite Readme --------------------- Running the test suite: ----------------------- * Open a command prompt * Change to the "win32com\test" directory. * run "testall.py". This will perform level 1 testing. You may specify 1, 2, or 3 on the command line ("testutil 3") to execute more tests. In general, this should just run the best it can, utilizing what is available on the machine. It is likely some tests will refuse to run due to objects not being locally available - this is normal. The win32com source tree has source code to a C++ and VB component used purely for testing. You may like to build and register these, particularly if you are doing anything related to argument/result handling. PK ѳP{win32com/test/testDCOM.pyUT l_Zx`ux # testDCOM usage="""\ testDCOM.py - Simple DCOM test Usage: testDCOM.py serverName Attempts to start the Python.Interpreter object on the named machine, and checks that the object is indeed running remotely. Requires the named server be configured to run DCOM (using dcomcnfg.exe), and the Python.Interpreter object installed and registered on that machine. The Python.Interpreter object must be installed on the local machine, but no special DCOM configuration should be necessary. """ # NOTE: If you configured the object locally using dcomcnfg, you could # simple use Dispatch rather than DispatchEx. import pythoncom, win32com.client, win32api, string, sys def test(serverName): if string.lower(serverName)==string.lower(win32api.GetComputerName()): print("You must specify a remote server name, not the local machine!") return # Hack to overcome a DCOM limitation. As the Python.Interpreter object # is probably installed locally as an InProc object, DCOM seems to ignore # all settings, and use the local object. clsctx = pythoncom.CLSCTX_SERVER & ~pythoncom.CLSCTX_INPROC_SERVER ob = win32com.client.DispatchEx("Python.Interpreter", serverName, clsctx=clsctx) ob.Exec("import win32api") actualName = ob.Eval("win32api.GetComputerName()") if string.lower(serverName) != string.lower(actualName): print("Error: The object created on server '%s' reported its name as '%s'" % (serverName, actualName)) else: print("Object created and tested OK on server '%s'" % serverName) if __name__=='__main__': if len(sys.argv) == 2: test(sys.argv[1]) else: print(usage) PK ѳP~win32com/test/daodump.pyUT l_Zx`ux # import dao3032 # No longer imported here - callers responsibility to load # import win32com.client def DumpDB(db, bDeep = 1): # MUST be a DB object. DumpTables(db,bDeep) DumpRelations(db,bDeep) DumpAllContainers(db,bDeep) def DumpTables(db, bDeep = 1): for tab in db.TableDefs: tab = db.TableDefs(tab.Name) # Redundant lookup for testing purposes. print("Table %s - Fields: %d, Attributes:%d" % (tab.Name, len(tab.Fields), tab.Attributes)) if bDeep: DumpFields(tab.Fields) def DumpFields(fields): for field in fields: print(" %s, size=%d, reqd=%d, type=%d, defVal=%s" % (field.Name, field.Size, field.Required, field.Type, str(field.DefaultValue))) def DumpRelations(db, bDeep = 1): for relation in db.Relations: print("Relation %s - %s->%s" % (relation.Name, relation.Table, relation.ForeignTable)) #### This dont work. TLB says it is a Fields collection, but apparently not! #### if bDeep: DumpFields(relation.Fields) def DumpAllContainers(db, bDeep = 1): for cont in db.Containers: print("Container %s - %d documents" % (cont.Name, len(cont.Documents))) if bDeep: DumpContainerDocuments(cont) def DumpContainerDocuments(container): for doc in container.Documents: import time timeStr = time.ctime(int(doc.LastUpdated)) print(" %s - updated %s (" % (doc.Name, timeStr), end=' ') print(doc.LastUpdated,")") # test the _print_ method? def TestEngine(engine): import sys if len(sys.argv)>1: dbName = sys.argv[1] else: dbName = "e:\\temp\\TestPython.mdb" db = engine.OpenDatabase(dbName) DumpDB(db) def test(): for progid in ("DAO.DBEngine.36", "DAO.DBEngine.35", "DAO.DBEngine.30"): try: ob = win32com.client.gencache.EnsureDispatch(progid) except pythoncom.com_error: print(progid, "does not seem to be installed") else: TestEngine(ob) break if __name__=='__main__': test() PK R='OkS;<<win32com/test/pippo.idlUT l_s]Zx`ux // TestServer.idl : IDL source for TestServer.dll // // This file will be processed by the MIDL tool to // produce the type library (TestServer.tlb) and marshalling code. import "oaidl.idl"; import "ocidl.idl"; [ object, uuid(50086EE8-F535-464B-806E-365ADBB727CF), dual, helpstring("ITestServerApp Interface"), pointer_default(unique) ] interface ITestServerApp : IDispatch { [id(1), helpstring("method Test1")] HRESULT Test1([out, retval] ITestServerApp **pVal); [id(2), helpstring("method Test2")] HRESULT Test2([out, retval] VARIANT *pVar); [propget, id(3), helpstring("property MyProp1")] HRESULT MyProp1([out, retval] long *pVal); }; [ object, uuid(618DB2A3-D5BD-4850-B66A-828727EB37E5), dual, helpstring("IPippo Interface"), pointer_default(unique) ] interface IPippo : IDispatch { [id(1), helpstring("method Method1")] HRESULT Method1([out, retval] IPippo **val); [propget, id(2), helpstring("property MyProp1")] HRESULT MyProp1([out, retval] long *pVal); [id(3), helpstring("method Method2")] HRESULT Method2([in] long in1, [in, out] long *inout1, [out, retval] long *val); [id(4), helpstring("method Method3")] HRESULT Method3([in] VARIANT in1, [out, retval] VARIANT *val); }; [ uuid(7783054E-9A20-4584-8C62-6ED2A08F6AC6), version(1.0), helpstring("TestServer 1.0 Type Library") ] library TESTSERVERLib { importlib("stdole32.tlb"); importlib("stdole2.tlb"); importlib("msado15.dll"); [ uuid(49E44E89-5A72-4456-B1D5-68268A19E798), helpstring("TestServerApp Class") ] coclass TestServerApp { [default] interface ITestServerApp; }; [ uuid(1F0F75D6-BD63-41B9-9F88-2D9D2E1AA5C3), helpstring("Pippo Class") ] coclass Pippo { [default] interface IPippo; }; }; PK ѳPcwin32com/test/testAXScript.pyUT l_Zx`ux # Test AXScripting the best we can in an automated fashion... import win32api, os, sys import win32com.axscript import win32com.axscript.client import unittest import win32com.test.util verbose = "-v" in sys.argv class AXScript(win32com.test.util.TestCase): def setUp(self): file = win32api.GetFullPathName(os.path.join(win32com.axscript.client.__path__[0], "pyscript.py")) from win32com.test.util import RegisterPythonServer self.verbose = verbose RegisterPythonServer(file, 'python', verbose=self.verbose) def testHost(self): file = win32api.GetFullPathName(os.path.join(win32com.axscript.__path__[0], "test\\testHost.py")) cmd = '%s "%s"' % (win32api.GetModuleFileName(0), file) if verbose: print("Testing Python Scripting host") win32com.test.util.ExecuteShellCommand(cmd, self) def testCScript(self): file = win32api.GetFullPathName(os.path.join(win32com.axscript.__path__[0], "Demos\\Client\\wsh\\test.pys")) cmd = 'cscript.exe "%s"' % (file) if verbose: print("Testing Windows Scripting host with Python script") win32com.test.util.ExecuteShellCommand(cmd, self) if __name__=='__main__': win32com.test.util.testmain() PK y=(O>}TT$win32com/test/testvbscript_regexp.pyUT 6t]Zx`ux import unittest from win32com.client.gencache import EnsureDispatch from win32com.client.dynamic import DumbDispatch import win32com.test.util class RegexTest(win32com.test.util.TestCase): def _CheckMatches(self, match, expected): found = [] for imatch in match: found.append(imatch.FirstIndex) self.assertEquals(list(found), list(expected)) def _TestVBScriptRegex(self, re): StringToSearch = "Python python pYthon Python" re.Pattern = "Python" re.Global = True re.IgnoreCase = True match = re.Execute(StringToSearch) expected = 0, 7, 14, 21 self._CheckMatches(match, expected) re.IgnoreCase = False match = re.Execute(StringToSearch) expected = 0, 21 self._CheckMatches(match, expected) def testDynamic(self): re = DumbDispatch("VBScript.Regexp") self._TestVBScriptRegex(re) def testGenerated(self): re = EnsureDispatch("VBScript.Regexp") self._TestVBScriptRegex(re) if __name__=='__main__': unittest.main() PK ѳP|*win32com/test/testmakepy.pyUT l_Zx`ux # Test makepy - try and run it over every OCX in the windows system directory. import sys import win32api import traceback import glob import os import traceback import win32com.test.util from win32com.client import makepy, selecttlb, gencache import pythoncom import winerror def TestBuildAll(verbose = 1): num = 0 tlbInfos = selecttlb.EnumTlbs() for info in tlbInfos: if verbose: print("%s (%s)" % (info.desc, info.dll)) try: makepy.GenerateFromTypeLibSpec(info) # sys.stderr.write("Attr typeflags for coclass referenced object %s=%d (%d), typekind=%d\n" % (name, refAttr.wTypeFlags, refAttr.wTypeFlags & pythoncom.TYPEFLAG_FDUAL,refAttr.typekind)) num += 1 except pythoncom.com_error as details: # Ignore these 2 errors, as the are very common and can obscure # useful warnings. if details.hresult not in [winerror.TYPE_E_CANTLOADLIBRARY, winerror.TYPE_E_LIBNOTREGISTERED]: print("** COM error on", info.desc) print(details) except KeyboardInterrupt: print("Interrupted!") raise KeyboardInterrupt except: print("Failed:", info.desc) traceback.print_exc() if makepy.bForDemandDefault: # This only builds enums etc by default - build each # interface manually tinfo = (info.clsid, info.lcid, info.major, info.minor) mod = gencache.EnsureModule(info.clsid, info.lcid, info.major, info.minor) for name in mod.NamesToIIDMap.keys(): makepy.GenerateChildFromTypeLibSpec(name, tinfo) return num def TestAll(verbose = 0): num = TestBuildAll(verbose) print("Generated and imported", num, "modules") win32com.test.util.CheckClean() if __name__=='__main__': TestAll("-q" not in sys.argv) PK Y03KБ  win32com/test/testStorage.pyUT  YZx`ux from win32com import storagecon import pythoncom, os, win32api import win32com.test.util import unittest class TestEnum(win32com.test.util.TestCase): def testit(self): fname, tmp = win32api.GetTempFileName(win32api.GetTempPath(),'stg') m=storagecon.STGM_READWRITE | storagecon.STGM_SHARE_EXCLUSIVE ## file, mode, format, attrs (always 0), IID (IStorage or IPropertySetStorage, storage options(only used with STGFMT_DOCFILE) pss=pythoncom.StgOpenStorageEx(fname, m, storagecon.STGFMT_FILE, 0 , pythoncom.IID_IPropertySetStorage) ### {"Version":2,"reserved":0,"SectorSize":512,"TemplateFile":u'somefilename'}) ## FMTID_SummaryInformation FMTID_DocSummaryInformation FMTID_UserDefinedProperties psuser=pss.Create(pythoncom.FMTID_UserDefinedProperties, pythoncom.IID_IPropertySetStorage, storagecon.PROPSETFLAG_DEFAULT, storagecon.STGM_READWRITE|storagecon.STGM_CREATE|storagecon.STGM_SHARE_EXCLUSIVE) ## its very picky about flag combinations! psuser.WriteMultiple((3,4),('hey','bubba')) psuser.WritePropertyNames((3,4),('property3','property4')) expected_summaries = [] expected_summaries.append( ('property3', 3, pythoncom.VT_BSTR)) expected_summaries.append( ('property4', 4, pythoncom.VT_BSTR)) psuser=None pssum=pss.Create(pythoncom.FMTID_SummaryInformation, pythoncom.IID_IPropertySetStorage, storagecon.PROPSETFLAG_DEFAULT, storagecon.STGM_READWRITE|storagecon.STGM_CREATE|storagecon.STGM_SHARE_EXCLUSIVE) pssum.WriteMultiple((storagecon.PIDSI_AUTHOR,storagecon.PIDSI_COMMENTS),('me', 'comment')) pssum=None pss=None ## doesn't seem to be a close or release method, and you can't even reopen it from the same process until previous object is gone pssread=pythoncom.StgOpenStorageEx(fname, storagecon.STGM_READ|storagecon.STGM_SHARE_EXCLUSIVE, storagecon.STGFMT_FILE, 0 , pythoncom.IID_IPropertySetStorage) found_summaries = [] for psstat in pssread: ps=pssread.Open(psstat[0],storagecon.STGM_READ|storagecon.STGM_SHARE_EXCLUSIVE) for p in ps: p_val = ps.ReadMultiple((p[1],))[0] if (p[1]==storagecon.PIDSI_AUTHOR and p_val=='me') or \ (p[1]==storagecon.PIDSI_COMMENTS and p_val=='comment'): pass else: self.fail("Uxexpected property %s/%s" % (p, p_val)) ps=None ## FMTID_UserDefinedProperties can't exist without FMTID_DocSummaryInformation, and isn't returned independently from Enum ## also can't be open at same time if psstat[0]==pythoncom.FMTID_DocSummaryInformation: ps=pssread.Open(pythoncom.FMTID_UserDefinedProperties,storagecon.STGM_READ|storagecon.STGM_SHARE_EXCLUSIVE) for p in ps: found_summaries.append(p) ps=None psread=None expected_summaries.sort() found_summaries.sort() self.assertEqual(expected_summaries, found_summaries) if __name__=='__main__': unittest.main() PK ѳPwin32com/test/errorSemantics.pyUT l_Zx`ux # errorSemantics.py # Test the Python error handling semantics. Specifically: # # * When a Python COM object is called via IDispatch, the nominated # scode is placed in the exception tuple, and the HRESULT is # DISP_E_EXCEPTION # * When the same interface is called via IWhatever, the # nominated scode is returned directly (with the scode also # reflected in the exception tuple) # * In all cases, the description etc end up in the exception tuple # * "Normal" Python exceptions resolve to an E_FAIL "internal error" import pythoncom from win32com.server.exception import COMException from win32com.server.util import wrap from win32com.client import Dispatch import winerror from win32com.test.util import CaptureWriter class error(Exception): def __init__(self, msg, com_exception=None): Exception.__init__(self, msg, str(com_exception)) # Our COM server. class TestServer: _public_methods_ = [ 'Clone', 'Commit', 'LockRegion', 'Read'] _com_interfaces_ = [ pythoncom.IID_IStream ] def Clone(self): raise COMException("Not today", scode=winerror.E_UNEXPECTED) def Commit(self, flags): raise Exception("foo") def test(): # Call via a native interface. com_server = wrap(TestServer(), pythoncom.IID_IStream) try: com_server.Clone() raise error("Expecting this call to fail!") except pythoncom.com_error as com_exc: if com_exc.hresult != winerror.E_UNEXPECTED: raise error("Calling the object natively did not yield the correct scode", com_exc) exc = com_exc.excepinfo if not exc or exc[-1] != winerror.E_UNEXPECTED: raise error("The scode element of the exception tuple did not yield the correct scode", com_exc) if exc[2] != "Not today": raise error("The description in the exception tuple did not yield the correct string", com_exc) cap = CaptureWriter() try: cap.capture() try: com_server.Commit(0) finally: cap.release() raise error("Expecting this call to fail!") except pythoncom.com_error as com_exc: if com_exc.hresult != winerror.E_FAIL: raise error("The hresult was not E_FAIL for an internal error", com_exc) if com_exc.excepinfo[1] != "Python COM Server Internal Error": raise error("The description in the exception tuple did not yield the correct string", com_exc) # Check we saw a traceback in stderr if cap.get_captured().find("Traceback")<0: raise error("Could not find a traceback in stderr: %r" % (cap.get_captured(),)) # Now do it all again, but using IDispatch com_server = Dispatch(wrap(TestServer())) try: com_server.Clone() raise error("Expecting this call to fail!") except pythoncom.com_error as com_exc: if com_exc.hresult != winerror.DISP_E_EXCEPTION: raise error("Calling the object via IDispatch did not yield the correct scode", com_exc) exc = com_exc.excepinfo if not exc or exc[-1] != winerror.E_UNEXPECTED: raise error("The scode element of the exception tuple did not yield the correct scode", com_exc) if exc[2] != "Not today": raise error("The description in the exception tuple did not yield the correct string", com_exc) cap.clear() try: cap.capture() try: com_server.Commit(0) finally: cap.release() raise error("Expecting this call to fail!") except pythoncom.com_error as com_exc: if com_exc.hresult != winerror.DISP_E_EXCEPTION: raise error("Calling the object via IDispatch did not yield the correct scode", com_exc) exc = com_exc.excepinfo if not exc or exc[-1] != winerror.E_FAIL: raise error("The scode element of the exception tuple did not yield the correct scode", com_exc) if exc[1] != "Python COM Server Internal Error": raise error("The description in the exception tuple did not yield the correct string", com_exc) # Check we saw a traceback in stderr if cap.get_captured().find("Traceback")<0: raise error("Could not find a traceback in stderr: %r" % (cap.get_captured(),)) try: import logging except ImportError: logging = None if logging is not None: import win32com class TestLogHandler(logging.Handler): def __init__(self): self.num_emits = 0 logging.Handler.__init__(self) def emit(self, record): self.num_emits += 1 return print("--- record start") print(self.format(record)) print("--- record end") def testLogger(): assert not hasattr(win32com, "logger") handler = TestLogHandler() formatter = logging.Formatter('%(message)s') handler.setFormatter(formatter) log = logging.getLogger("win32com_test") log.addHandler(handler) win32com.logger = log # Now throw some exceptions! # Native interfaces com_server = wrap(TestServer(), pythoncom.IID_IStream) try: com_server.Commit(0) raise RuntimeError("should have failed") except pythoncom.error: pass assert handler.num_emits == 1, handler.num_emits handler.num_emits = 0 # reset com_server = Dispatch(wrap(TestServer())) try: com_server.Commit(0) raise RuntimeError("should have failed") except pythoncom.error: pass assert handler.num_emits == 1, handler.num_emits if __name__=='__main__': test() if logging is not None: testLogger() from .util import CheckClean CheckClean() print("error semantic tests worked") PK ѳPbj win32com/test/testIterators.pyUT l_Zx`ux # Some raw iter tests. Some "high-level" iterator tests can be found in # testvb.py and testOutlook.py import sys import unittest from win32com.client.gencache import EnsureDispatch from win32com.client import Dispatch import win32com.server.util import win32com.test.util import pythoncom def yield_iter(iter): while 1: yield next(iter) class _BaseTestCase(win32com.test.util.TestCase): def test_enumvariant_vb(self): ob, iter = self.iter_factory() got=[] for v in iter: got.append(v) self.assertEquals(got, self.expected_data) def test_yield(self): ob, i = self.iter_factory() got=[] for v in yield_iter(iter(i)): got.append(v) self.assertEquals(got, self.expected_data) def _do_test_nonenum(self, object): try: for i in object: pass self.fail("Could iterate over a non-iterable object") except TypeError: pass # this is expected. self.assertRaises(TypeError, iter, object) self.assertRaises(AttributeError, getattr, object, "next") def test_nonenum_wrapper(self): # Check our raw PyIDispatch ob = self.object._oleobj_ try: for i in ob: pass self.fail("Could iterate over a non-iterable object") except TypeError: pass # this is expected. self.assertRaises(TypeError, iter, ob) self.assertRaises(AttributeError, getattr, ob, "next") # And our Dispatch wrapper ob = self.object try: for i in ob: pass self.fail("Could iterate over a non-iterable object") except TypeError: pass # this is expected. # Note that as our object may be dynamic, we *do* have a __getitem__ # method, meaning we *can* call iter() on the object. In this case # actual iteration is what fails. # So either the 'iter(); will raise a type error, or an attempt to # fetch it try: next(iter(ob)) self.fail("Expected a TypeError fetching this iterator") except TypeError: pass # And it should never have a 'next' method self.assertRaises(AttributeError, getattr, ob, "next") class VBTestCase(_BaseTestCase): def setUp(self): def factory(): # Our VB test harness exposes a property with IEnumVariant. ob = self.object.EnumerableCollectionProperty for i in self.expected_data: ob.Add(i) # Get the raw IEnumVARIANT. invkind = pythoncom.DISPATCH_METHOD | pythoncom.DISPATCH_PROPERTYGET iter = ob._oleobj_.InvokeTypes(pythoncom.DISPID_NEWENUM,0,invkind,(13, 10),()) return ob, iter.QueryInterface(pythoncom.IID_IEnumVARIANT) # We *need* generated dispatch semantics, so dynamic __getitem__ etc # don't get in the way of our tests. self.object = EnsureDispatch("PyCOMVBTest.Tester") self.expected_data = [1, "Two", "3"] self.iter_factory = factory def tearDown(self): self.object = None # Test our client semantics, but using a wrapped Python list object. # This has the effect of re-using our client specific tests, but in this # case is exercising the server side. class SomeObject: _public_methods_ = ["GetCollection"] def __init__(self, data): self.data = data def GetCollection(self): return win32com.server.util.NewCollection(self.data) class WrappedPythonCOMServerTestCase(_BaseTestCase): def setUp(self): def factory(): ob = self.object.GetCollection() flags = pythoncom.DISPATCH_METHOD | pythoncom.DISPATCH_PROPERTYGET enum = ob._oleobj_.Invoke(pythoncom.DISPID_NEWENUM, 0, flags, 1) return ob, enum.QueryInterface(pythoncom.IID_IEnumVARIANT) self.expected_data = [1,'Two',3] sv = win32com.server.util.wrap(SomeObject(self.expected_data)) self.object = Dispatch(sv) self.iter_factory = factory def tearDown(self): self.object = None def suite(): # We dont want our base class run suite = unittest.TestSuite() for item in globals().values(): if type(item)==type(unittest.TestCase) and \ issubclass(item, unittest.TestCase) and \ item != _BaseTestCase: suite.addTest(unittest.makeSuite(item)) return suite if __name__=='__main__': unittest.main(argv=sys.argv + ['suite']) PK ѳP/0g~~win32com/test/testNetscape.pyUT l_Zx`ux ## AHH - I cant make this work!!! # But this is the general idea. import netscape import sys error = "Netscape Test Error" if __name__=='__main__': n=netscape.CNetworkCX() rc = n.Open("http://d|/temp/apyext.html", 0, None, 0, None) if not rc: raise error("Open method of Netscape failed") while 1: num, str = n.Read(None, 0) print("Got ", num, str) if num==0: break # used to be continue - no idea!! if num==-1: break # sys.stdout.write(str) n.Close() print("Done!") del n sys.last_type = sys.last_value = sys.last_traceback = None PK Y03K""win32com/test/Testpys.sctUT  YZx`ux  PK v,XQ&%win32com/test/testConversionErrors.pyUT 0_Zx`ux import unittest import win32com.client import win32com.test.util import win32com.server.util class Tester: _public_methods_ = [ 'TestValue' ] def TestValue(self, v): pass def test_ob(): return win32com.client.Dispatch(win32com.server.util.wrap(Tester())) class TestException(Exception): pass # The object we try and pass - pywin32 will call __float__ as a last resort. class BadConversions: def __float__(self): raise TestException() class TestCase(win32com.test.util.TestCase): def test_float(self): try: test_ob().TestValue(BadConversions()) raise Exception("Should not have worked") except Exception as e: assert isinstance(e, TestException) if __name__=='__main__': unittest.main() PK y=(Owin32com/test/testWMI.pyUT 6t]Zx`ux from win32com.client import GetObject import win32com.test.util import unittest class Simple(win32com.test.util.TestCase): def testit(self): cses = GetObject("WinMgMts:").InstancesOf("Win32_Process") vals = [] for cs in cses: val = cs.Properties_("Caption").Value vals.append(val) self.failIf(len(vals)<5, "We only found %d processes!" % len(vals)) if __name__=='__main__': unittest.main() PK ѳPzqs win32com/test/testArrays.pyUT l_Zx`ux # Originally contributed by Stefan Schukat as part of this arbitrary-sized # arrays patch. from win32com.client import gencache from win32com.test import util import unittest ZeroD = 0 OneDEmpty = [] OneD = [1,2,3] TwoD = [ [1,2,3], [1,2,3], [1,2,3] ] TwoD1 = [ [ [1,2,3,5], [1,2,3], [1,2,3] ], [ [1,2,3], [1,2,3], [1,2,3] ] ] OneD1 = [ [ [1,2,3], [1,2,3], [1,2,3] ], [ [1,2,3], [1,2,3] ] ] OneD2 = [ [1,2,3], [1,2,3,4,5], [ [1,2,3,4,5], [1,2,3,4,5], [1,2,3,4,5] ] ] ThreeD = [ [ [1,2,3], [1,2,3], [1,2,3] ], [ [1,2,3], [1,2,3], [1,2,3] ] ] FourD = [ [ [[1,2,3],[1,2,3],[1,2,3]], [[1,2,3],[1,2,3],[1,2,3]], [[1,2,3],[1,2,3],[1,2,3]] ], [ [[1,2,3],[1,2,3],[1,2,3]], [[1,2,3],[1,2,3],[1,2,3]], [[1,2,3],[1,2,3],[1,2,3]] ] ] LargeD = [ [ [list(range(10))] * 10], ] * 512 def _normalize_array(a): if type(a) != type(()): return a ret = [] for i in a: ret.append(_normalize_array(i)) return ret class ArrayTest(util.TestCase): def setUp(self): self.arr = gencache.EnsureDispatch("PyCOMTest.ArrayTest") def tearDown(self): self.arr = None def _doTest(self, array): self.arr.Array = array self.failUnlessEqual(_normalize_array(self.arr.Array), array) def testZeroD(self): self._doTest(ZeroD) def testOneDEmpty(self): self._doTest(OneDEmpty) def testOneD(self): self._doTest(OneD) def testTwoD(self): self._doTest(TwoD) def testThreeD(self): self._doTest(ThreeD) def testFourD(self): self._doTest(FourD) def testTwoD1(self): self._doTest(TwoD1) def testOneD1(self): self._doTest(OneD1) def testOneD2(self): self._doTest(OneD2) def testLargeD(self): self._doTest(LargeD) if __name__ == "__main__": try: util.testmain() except SystemExit as rc: if not rc: raise PK ѳP< < win32com/test/testDynamic.pyUT l_Zx`ux # Test dynamic policy, and running object table. import pythoncom import winerror from win32com.server.exception import Exception error = "testDynamic error" iid = pythoncom.MakeIID("{b48969a0-784b-11d0-ae71-d23f56000000}") class VeryPermissive: def _dynamic_(self, name, lcid, wFlags, args): if wFlags & pythoncom.DISPATCH_METHOD: return getattr(self,name)(*args) if wFlags & pythoncom.DISPATCH_PROPERTYGET: try: # to avoid problems with byref param handling, tuple results are converted to lists. ret = self.__dict__[name] if type(ret)==type(()): ret = list(ret) return ret except KeyError: # Probably a method request. raise Exception(scode=winerror.DISP_E_MEMBERNOTFOUND) if wFlags & (pythoncom.DISPATCH_PROPERTYPUT | pythoncom.DISPATCH_PROPERTYPUTREF): setattr(self, name, args[0]) return raise Exception(scode=winerror.E_INVALIDARG, desc="invalid wFlags") def write(self, *args): if len(args)==0: raise Exception(scode=winerror.DISP_E_BADPARAMCOUNT) # Probably call as PROPGET. for arg in args[:-1]: print(str(arg), end=' ') print(str(args[-1])) def Test(): import win32com.server.util, win32com.server.policy # import win32dbg;win32dbg.brk() ob = win32com.server.util.wrap(VeryPermissive(),usePolicy=win32com.server.policy.DynamicPolicy) try: handle = pythoncom.RegisterActiveObject(ob, iid, 0) except pythoncom.com_error as details: print("Warning - could not register the object in the ROT:", details) handle = None try: import win32com.client.dynamic client = win32com.client.dynamic.Dispatch(iid) client.ANewAttr = "Hello" if client.ANewAttr != "Hello": raise error("Could not set dynamic property") v = ["Hello","From","Python",1.4] client.TestSequence = v if v != list(client.TestSequence): raise error("Dynamic sequences not working! %r/%r" % (repr(v), repr(client.testSequence))) client.write("This","output","has","come","via","COM") # Check our new "_FlagAsMethod" works (kinda!) client._FlagAsMethod("NotReallyAMethod") if not callable(client.NotReallyAMethod): raise error("Method I flagged as callable isn't!") client = None finally: if handle is not None: pythoncom.RevokeActiveObject(handle) if __name__=='__main__': Test() PK Y03K;ttwin32com/util.pyUT  YZx`ux """General utility functions common to client and server. This module contains a collection of general purpose utility functions. """ import pythoncom import win32api, win32con def IIDToInterfaceName(iid): """Converts an IID to a string interface name. Used primarily for debugging purposes, this allows a cryptic IID to be converted to a useful string name. This will firstly look for interfaces known (ie, registered) by pythoncom. If not known, it will look in the registry for a registered interface. iid -- An IID object. Result -- Always a string - either an interface name, or '' """ try: return pythoncom.ServerInterfaces[iid] except KeyError: try: try: return win32api.RegQueryValue(win32con.HKEY_CLASSES_ROOT, "Interface\\%s" % iid) except win32api.error: pass except ImportError: pass return str(iid) PK {Rwin32com/include/UT Zx`Zx`ux PK (='O,R#R#"win32com/include/PythonCOMServer.hUT _s]Zx`ux #ifndef __PYTHONCOMSERVER_H__ #define __PYTHONCOMSERVER_H__ // PythonCOMServer.h :Server side COM support #include #define DLLAcquireGlobalLock PyWin_AcquireGlobalLock #define DLLReleaseGlobalLock PyWin_ReleaseGlobalLock void PYCOM_EXPORT PyCom_DLLAddRef(void); void PYCOM_EXPORT PyCom_DLLReleaseRef(void); // Use this macro at the start of all gateway methods. #define PY_GATEWAY_METHOD CEnterLeavePython _celp class PyGatewayBase; // Gateway constructors. // Each gateway must be able to be created from a "gateway constructor". This // is simply a function that takes a Python instance as as argument, and returns // a gateway object of the correct type. The MAKE_PYGATEWAY_CTOR is a helper that // will embed such a constructor in the class - however, this is not necessary - // _any_ function of the correct signature can be used. typedef HRESULT (*pfnPyGatewayConstructor)(PyObject *PythonInstance, PyGatewayBase *, void **ppResult, REFIID iid); HRESULT PyCom_MakeRegisteredGatewayObject(REFIID iid, PyObject *instance, PyGatewayBase *base, void **ppv); // A version of the above which support classes being derived from // other than IUnknown #define PYGATEWAY_MAKE_SUPPORT2(classname, IInterface, theIID, gatewaybaseclass) \ public: \ static HRESULT classname::PyGatewayConstruct(PyObject *pPyInstance, PyGatewayBase *unkBase, void **ppResult, \ REFIID iid) \ { \ if (ppResult == NULL) \ return E_INVALIDARG; \ classname *newob = new classname(pPyInstance); \ newob->m_pBaseObject = unkBase; \ if (unkBase) \ unkBase->AddRef(); \ *ppResult = newob->ThisAsIID(iid); \ return *ppResult ? S_OK : E_OUTOFMEMORY; \ } \ \ protected: \ virtual IID GetIID(void) { return theIID; } \ virtual void *ThisAsIID(IID iid) \ { \ if (this == NULL) \ return NULL; \ if (iid == theIID) \ return (IInterface *)this; \ else \ return gatewaybaseclass::ThisAsIID(iid); \ } \ STDMETHOD_(ULONG, AddRef)(void) { return gatewaybaseclass::AddRef(); } \ STDMETHOD_(ULONG, Release)(void) { return gatewaybaseclass::Release(); } \ STDMETHOD(QueryInterface)(REFIID iid, void **obj) { return gatewaybaseclass::QueryInterface(iid, obj); }; // This is the "old" version to use, or use it if you derive // directly from PyGatewayBase #define PYGATEWAY_MAKE_SUPPORT(classname, IInterface, theIID) \ PYGATEWAY_MAKE_SUPPORT2(classname, IInterface, theIID, PyGatewayBase) #define GET_PYGATEWAY_CTOR(classname) classname::PyGatewayConstruct #ifdef _MSC_VER // Disable an OK warning... #pragma warning(disable : 4275) // warning C4275: non dll-interface struct 'IDispatch' used as base for dll-interface class 'PyGatewayBase' #endif // _MSC_VER // Helper interface for fetching a Python object from a gateway extern const GUID IID_IInternalUnwrapPythonObject; interface IInternalUnwrapPythonObject : public IUnknown { public: STDMETHOD(Unwrap)(PyObject * *ppPyObject) = 0; }; ///////////////////////////////////////////////////////////////////////////// // PyGatewayBase // // Base class for all gateways. // class PYCOM_EXPORT PyGatewayBase : #ifndef NO_PYCOM_IDISPATCHEX public IDispatchEx, // IDispatch comes along for the ride! #else public IDispatch, // No IDispatchEx - must explicitely use IDispatch #endif public ISupportErrorInfo, public IInternalUnwrapPythonObject { protected: PyGatewayBase(PyObject *instance); virtual ~PyGatewayBase(); // Invoke the Python method (via the policy object) STDMETHOD(InvokeViaPolicy)(const char *szMethodName, PyObject **ppResult = NULL, const char *szFormat = NULL, ...); public: // IUnknown STDMETHOD_(ULONG, AddRef)(void); STDMETHOD_(ULONG, Release)(void); STDMETHOD(QueryInterface)(REFIID iid, void **obj); // IDispatch STDMETHOD(GetTypeInfoCount)(UINT FAR *pctInfo); STDMETHOD(GetTypeInfo)(UINT itinfo, LCID lcid, ITypeInfo FAR *FAR *pptInfo); STDMETHOD(GetIDsOfNames)(REFIID refiid, OLECHAR FAR *FAR *rgszNames, UINT cNames, LCID lcid, DISPID FAR *rgdispid); STDMETHOD(Invoke) (DISPID dispid, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS FAR *params, VARIANT FAR *pVarResult, EXCEPINFO FAR *pexcepinfo, UINT FAR *puArgErr); // IDispatchEx #ifndef NO_PYCOM_IDISPATCHEX STDMETHOD(GetDispID)(BSTR bstrName, DWORD grfdex, DISPID *pid); STDMETHOD(InvokeEx) (DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller); STDMETHOD(DeleteMemberByName)(BSTR bstr, DWORD grfdex); STDMETHOD(DeleteMemberByDispID)(DISPID id); STDMETHOD(GetMemberProperties)(DISPID id, DWORD grfdexFetch, DWORD *pgrfdex); STDMETHOD(GetMemberName)(DISPID id, BSTR *pbstrName); STDMETHOD(GetNextDispID)(DWORD grfdex, DISPID id, DISPID *pid); STDMETHOD(GetNameSpaceParent)(IUnknown **ppunk); #endif // NO_PYCOM_IDISPATCHEX // ISupportErrorInfo STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid); // IInternalUnwrapPythonObject STDMETHOD(Unwrap)(PyObject **ppPyObject); // Basically just PYGATEWAY_MAKE_SUPPORT(PyGatewayBase, IDispatch, IID_IDispatch); // but with special handling as its the base class. static HRESULT PyGatewayBase::PyGatewayConstruct(PyObject *pPyInstance, PyGatewayBase *gatewayBase, void **ppResult, REFIID iid) { if (ppResult == NULL) return E_INVALIDARG; PyGatewayBase *obNew = new PyGatewayBase(pPyInstance); obNew->m_pBaseObject = gatewayBase; if (gatewayBase) gatewayBase->AddRef(); *ppResult = (IDispatch *)obNew; return *ppResult ? S_OK : E_OUTOFMEMORY; } // Currently this is used only for ISupportErrorInfo, // so hopefully this will never be called in this base class. // (however, this is not a rule, so we wont assert or anything!) virtual IID GetIID(void) { return IID_IUnknown; } virtual void *ThisAsIID(IID iid); // End of PYGATEWAY_MAKE_SUPPORT PyObject *m_pPyObject; PyGatewayBase *m_pBaseObject; private: LONG m_cRef; }; #ifdef _MSC_VER #pragma warning(default : 4275) #endif // _MSC_VER // B/W compat hack for gateways. #define PyCom_HandlePythonFailureToCOM() \ PyCom_SetAndLogCOMErrorFromPyExceptionEx(this->m_pPyObject, "", GetIID()) // F/W compat hack for gateways! Must be careful about updating // PyGatewayBase vtable, so a slightly older pythoncomXX.dll will work // with slightly later extensions. So use a #define. #define MAKE_PYCOM_GATEWAY_FAILURE_CODE(method_name) \ PyCom_SetAndLogCOMErrorFromPyExceptionEx(this->m_pPyObject, method_name, GetIID()) #endif /* __PYTHONCOMSERVER_H__ */ PK (='Onۤuuwin32com/include/PythonCOM.hUT _s]Zx`ux /* PythonCOM.h Main header for Python COM support. This file is involved mainly with client side COM support for Python. Most COM work put together by Greg Stein and Mark Hammond, with a few others starting to come out of the closet. -------------------------------------------------------------------- Thread State Rules ------------------ These rules apply to PythonCOM in general, and not just to the client side. The rules are quite simple, but it is critical they be followed. In general, errors here will be picked up quite quickly, as Python will raise a Fatal Error. However, the Release() issue in particular may keep a number of problems well hidden. Interfaces: ----------- Before making ANY call out to COM, you MUST release the Python lock. This is true to ANY call whatsoever, including the COM call in question, but also any calls to "->Release();" This is normally achieved with the calls PY_INTERFACE_PRECALL and PY_INTERFACE_POSTCALL, which release and acquire the Python lock. Gateways: --------- Before doing anything related to Python, gateways MUST acquire the Python lock, and must release it before returning. This is normally achieved with PY_GATEWAY_METHOD at the top of a gateway method. This macro resolves to a class, which automatically does the right thing. Release: -------- As mentioned above for Interfaces, EVERY call to Release() must be done with the Python lock released. This is expanded here. This is very important, but an error may not be noticed. The problem will only be seen when the Release() is on a Python object and the Release() is the final one for the object. In this case, the Python object will attempt to acquire the Python lock before destroying itself, and Python will raise a fatal error. In many many cases, you will not notice this error, but someday, someone will implement the other side in Python, and suddenly FatalErrors will start appearing. Make sure you get this right. Eg, this code is correct: PY_INTERFACE_PRECALL; pSomeObj->SomeFunction(pSomeOtherObject); pSomeOtherObject->Release(); PY_INTERFACE_POSTCALL; However, this code is WRONG, but will RARELY FAIL. PY_INTERFACE_PRECALL; pSomeObj->SomeFunction(pSomeOtherObject); PY_INTERFACE_POSTCALL; pSomeOtherObject->Release(); -------------------------------------------------------------------- */ #ifndef __PYTHONCOM_H__ #define __PYTHONCOM_H__ // #define _DEBUG_LIFETIMES // Trace COM object lifetimes. #ifdef FREEZE_PYTHONCOM /* The pythoncom module is being included in a frozen .EXE/.DLL */ #define PYCOM_EXPORT #else #ifdef BUILD_PYTHONCOM /* We are building pythoncomxx.dll */ #define PYCOM_EXPORT __declspec(dllexport) #else /* This module uses pythoncomxx.dll */ #define PYCOM_EXPORT __declspec(dllimport) #ifndef _DEBUG #pragma comment(lib, "pythoncom.lib") #else #pragma comment(lib, "pythoncom_d.lib") #endif #endif #endif #ifdef MS_WINCE // List of interfaces not supported by CE. #define NO_PYCOM_IDISPATCHEX #define NO_PYCOM_IPROVIDECLASSINFO #define NO_PYCOM_IENUMGUID #define NO_PYCOM_IENUMCATEGORYINFO #define NO_PYCOM_ICATINFORMATION #define NO_PYCOM_ICATREGISTER #define NO_PYCOM_ISERVICEPROVIDER #define NO_PYCOM_IPROPERTYSTORAGE #define NO_PYCOM_IPROPERTYSETSTORAGE #define NO_PYCOM_ENUMSTATPROPSTG #include "ocidl.h" #include "oleauto.h" #endif // MS_WINCE #ifdef __MINGW32__ // Special Mingw32 considerations. #define NO_PYCOM_ENUMSTATPROPSTG #define __try try #define __except catch #include #endif // __MINGW32__ #include // Standard Win32 Types #ifndef NO_PYCOM_IDISPATCHEX #include // New header for IDispatchEx interface. #endif // NO_PYCOM_IDISPATCHEX #if defined(MAINWIN) // Mainwin seems to have 1/2 the VT_RECORD infrastructure in place #if !defined(VT_RECORD) #define VT_RECORD 36 #define V_RECORDINFO(X) ((X)->brecVal.pRecInfo) #define V_RECORD(X) ((X)->brecVal.pvRecord) #else #pragma message( \ "MAINWIN appears to have grown correct VT_RECORD " \ "support. Please update PythonCOM.h accordingly") #endif // VT_RECORD #endif // MAINWIN class PyIUnknown; // To make life interesting/complicated, I use C++ classes for // all Python objects. The main advantage is that I can derive // a PyIDispatch object from a PyIUnknown, etc. This provides a // clean C++ interface, and "automatically" provides all base // Python methods to "derived" Python types. // // Main disadvantage is that any extension DLLs will need to include // these headers, and link with this .lib // // Base class for (most of) the type objects. class PYCOM_EXPORT PyComTypeObject : public PyTypeObject { public: PyComTypeObject(const char *name, PyComTypeObject *pBaseType, int typeSize, struct PyMethodDef *methodList, PyIUnknown *(*thector)(IUnknown *)); ~PyComTypeObject(); // is the given object an interface type object? (e.g. PyIUnknown) static BOOL is_interface_type(PyObject *ob); public: PyIUnknown *(*ctor)(IUnknown *); }; // A type used for interfaces that can automatically provide enumerators // (ie, they themselves aren't enumerable, but do have a suitable default // method that returns a PyIEnum object class PYCOM_EXPORT PyComEnumProviderTypeObject : public PyComTypeObject { public: PyComEnumProviderTypeObject(const char *name, PyComTypeObject *pBaseType, int typeSize, struct PyMethodDef *methodList, PyIUnknown *(*thector)(IUnknown *), const char *enum_method_name); static PyObject *iter(PyObject *self); const char *enum_method_name; }; // A type used for PyIEnum interfaces class PYCOM_EXPORT PyComEnumTypeObject : public PyComTypeObject { public: static PyObject *iter(PyObject *self); static PyObject *iternext(PyObject *self); PyComEnumTypeObject(const char *name, PyComTypeObject *pBaseType, int typeSize, struct PyMethodDef *methodList, PyIUnknown *(*thector)(IUnknown *)); }; // Very very base class - not COM specific - Should exist in the // Python core somewhere, IMO. class PYCOM_EXPORT PyIBase : public PyObject { public: // virtuals for Python support virtual PyObject *getattr(char *name); virtual int setattr(char *name, PyObject *v); virtual PyObject *repr(); virtual int compare(PyObject *other) { if (this == other) return 0; if (this < other) return -1; return 1; } // These iter are a little special, in that returning NULL means // use the implementation in the type virtual PyObject *iter() { return NULL; } virtual PyObject *iternext() { return NULL; } protected: PyIBase(); virtual ~PyIBase(); public: static BOOL is_object(PyObject *, PyComTypeObject *which); BOOL is_object(PyComTypeObject *which); static void dealloc(PyObject *ob); static PyObject *repr(PyObject *ob); static PyObject *getattro(PyObject *self, PyObject *name); static int setattro(PyObject *op, PyObject *obname, PyObject *v); static int cmp(PyObject *ob1, PyObject *ob2); static PyObject *richcmp(PyObject *ob1, PyObject *ob2, int op); }; /* Special Type objects */ extern PYCOM_EXPORT PyTypeObject PyOleEmptyType; // equivalent to VT_EMPTY extern PYCOM_EXPORT PyTypeObject PyOleMissingType; // special Python handling. extern PYCOM_EXPORT PyTypeObject PyOleArgNotFoundType; // special VT_ERROR value extern PYCOM_EXPORT PyTypeObject PyOleNothingType; // special VT_ERROR value // ALL of these set an appropriate Python error on bad return. // Given a Python object that is a registered COM type, return a given // interface pointer on its underlying object, with a new reference added. PYCOM_EXPORT BOOL PyCom_InterfaceFromPyObject(PyObject *ob, REFIID iid, LPVOID *ppv, BOOL bNoneOK = TRUE); // As above, but allows instance with "_oleobj_" attribute. PYCOM_EXPORT BOOL PyCom_InterfaceFromPyInstanceOrObject(PyObject *ob, REFIID iid, LPVOID *ppv, BOOL bNoneOK = TRUE); // Release an arbitary COM pointer. // NOTE: the PRECALL/POSTCALL stuff is probably not strictly necessary // since the PyGILSTATE stuff has been in place (and even then, it only // mattered when it was the last Release() on a Python implemented object) #define PYCOM_RELEASE(pUnk) \ { \ if (pUnk) { \ PY_INTERFACE_PRECALL; \ (pUnk)->Release(); \ PY_INTERFACE_POSTCALL; \ } \ } // Given an IUnknown and an Interface ID, create and return an object // of the appropriate type. eg IID_Unknown->PyIUnknown, // IID_IDispatch->PyIDispatch, etc. // Uses a map that external extension DLLs can populate with their IID/type. // Under the principal of least surprise, this will return Py_None is punk is NULL. // Otherwise, a valid PyI*, but with NULL m_obj (and therefore totally useless) // object would be created. // BOOL bAddRef indicates if a COM reference count should be added to the IUnknown. // This depends purely on the context in which it is called. If the IUnknown is obtained // from a function that creates a new ref (eg, CoCreateInstance()) then you should use // FALSE. If you receive the pointer as (eg) a param to a gateway function, then // you normally need to pass TRUE, as this is truly a new reference. // *** ALWAYS take the time to get this right. *** PYCOM_EXPORT PyObject *PyCom_PyObjectFromIUnknown(IUnknown *punk, REFIID riid, BOOL bAddRef = FALSE); // VARIANT <-> PyObject conversion utilities. PYCOM_EXPORT BOOL PyCom_VariantFromPyObject(PyObject *obj, VARIANT *var); PYCOM_EXPORT PyObject *PyCom_PyObjectFromVariant(const VARIANT *var); // PROPVARIANT PYCOM_EXPORT PyObject *PyObject_FromPROPVARIANT(PROPVARIANT *pVar); PYCOM_EXPORT PyObject *PyObject_FromPROPVARIANTs(PROPVARIANT *pVars, ULONG cVars); PYCOM_EXPORT BOOL PyObject_AsPROPVARIANT(PyObject *ob, PROPVARIANT *pVar); // Other conversion helpers... PYCOM_EXPORT PyObject *PyCom_PyObjectFromSTATSTG(STATSTG *pStat); PYCOM_EXPORT BOOL PyCom_PyObjectAsSTATSTG(PyObject *ob, STATSTG *pStat, DWORD flags = 0); PYCOM_EXPORT BOOL PyCom_SAFEARRAYFromPyObject(PyObject *obj, SAFEARRAY **ppSA, VARENUM vt = VT_VARIANT); PYCOM_EXPORT PyObject *PyCom_PyObjectFromSAFEARRAY(SAFEARRAY *psa, VARENUM vt = VT_VARIANT); #ifndef NO_PYCOM_STGOPTIONS PYCOM_EXPORT BOOL PyCom_PyObjectAsSTGOPTIONS(PyObject *obstgoptions, STGOPTIONS **ppstgoptions); #endif PYCOM_EXPORT PyObject *PyCom_PyObjectFromSTATPROPSETSTG(STATPROPSETSTG *pStat); PYCOM_EXPORT BOOL PyCom_PyObjectAsSTATPROPSETSTG(PyObject *, STATPROPSETSTG *); // Currency support. PYCOM_EXPORT PyObject *PyObject_FromCurrency(CURRENCY &cy); PYCOM_EXPORT BOOL PyObject_AsCurrency(PyObject *ob, CURRENCY *pcy); // OLEMENUGROUPWIDTHS are used by axcontrol, shell, etc PYCOM_EXPORT BOOL PyObject_AsOLEMENUGROUPWIDTHS(PyObject *oblpMenuWidths, OLEMENUGROUPWIDTHS *pWidths); PYCOM_EXPORT PyObject *PyObject_FromOLEMENUGROUPWIDTHS(const OLEMENUGROUPWIDTHS *pWidths); /* Functions for Initializing COM, and also letting the core know about it! */ PYCOM_EXPORT HRESULT PyCom_CoInitializeEx(LPVOID reserved, DWORD dwInit); PYCOM_EXPORT HRESULT PyCom_CoInitialize(LPVOID reserved); PYCOM_EXPORT void PyCom_CoUninitialize(); /////////////////////////////////////////////////////////////////// // Error related functions // Client related functions - generally called by interfaces before // they return NULL back to Python to indicate the error. // All these functions return NULL so interfaces can generally // just "return PyCom_BuildPyException(hr, punk, IID_IWhatever)" // Uses the HRESULT, and IErrorInfo interfaces if available to // create and set a pythoncom.com_error. PYCOM_EXPORT PyObject *PyCom_BuildPyException(HRESULT hr, IUnknown *pUnk = NULL, REFIID iid = IID_NULL); // Uses the HRESULT and an EXCEPINFO structure to create and // set a pythoncom.com_error. PYCOM_EXPORT PyObject *PyCom_BuildPyExceptionFromEXCEPINFO(HRESULT hr, EXCEPINFO *pexcepInfo, UINT nArgErr = (UINT)-1); // Sets a pythoncom.internal_error - no one should ever see these! PYCOM_EXPORT PyObject *PyCom_BuildInternalPyException(char *msg); // Log an error to a Python logger object if one can be found, or // to stderr if no log available. // If logProvider is not NULL, we will call a "_GetLogger_()" method on it. // If logProvider is NULL, we attempt to fetch "win32com.logger". // If they do not exist, return None, or raise an error fetching them // (or even writing to them once fetched), the message still goes to stderr. // NOTE: By default, win32com does *not* provide a logger, so default is that // all errors are written to stdout. // This will *not* write a record if a COM Server error is current. PYCOM_EXPORT void PyCom_LoggerNonServerException(PyObject *logProvider, const char *fmt, ...); // Write an error record, including exception. This will write an error // record even if a COM server error is current. PYCOM_EXPORT void PyCom_LoggerException(PyObject *logProvider, const char *fmt, ...); // Write a warning record - in general this does *not* mean a call failed, but // still is something in the programmers control that they should change. // XXX - if an exception is pending when this is called, the traceback will // also be written. This is undesirable and will be changed should this // start being a problem. PYCOM_EXPORT void PyCom_LoggerWarning(PyObject *logProvider, const char *fmt, ...); // Server related error functions // These are supplied so that any Python errors we detect can be // converted into COM error information. The HRESULT returned should // be returned by the COM function, and these functions also set the // IErrorInfo interfaces, so the caller can extract more detailed // information about the Python exception. // Set a COM exception, logging the exception if not an explicitly raised 'server' exception PYCOM_EXPORT HRESULT PyCom_SetAndLogCOMErrorFromPyException(const char *methodName, REFIID riid /* = IID_NULL */); PYCOM_EXPORT HRESULT PyCom_SetAndLogCOMErrorFromPyExceptionEx(PyObject *provider, const char *methodName, REFIID riid /* = IID_NULL */); // Used in gateways to SetErrorInfo() with a simple HRESULT, then return it. // The description is generally only useful for debugging purposes, // and if you are debugging via a server that supports IErrorInfo (like Python :-) // NOTE: this function is usuable from outside the Python context PYCOM_EXPORT HRESULT PyCom_SetCOMErrorFromSimple(HRESULT hr, REFIID riid = IID_NULL, const char *description = NULL); // Used in gateways to SetErrorInfo() the current Python exception, and // (assuming not a server error explicitly raised) also logs an error // to stdout/win32com.logger. // NOTE: this function assumes GIL held PYCOM_EXPORT HRESULT PyCom_SetCOMErrorFromPyException(REFIID riid = IID_NULL); // A couple of EXCEPINFO helpers - could be private to IDispatch // if it wasnt for the AXScript support (and ITypeInfo if we get around to that :-) // These functions do not set any error states to either Python or // COM - they simply convert to/from PyObjects and EXCEPINFOs // Use the current Python exception to fill an EXCEPINFO structure. PYCOM_EXPORT void PyCom_ExcepInfoFromPyException(EXCEPINFO *pExcepInfo); // Fill in an EXCEPINFO structure from a Python instance or tuple object. // (ie, similar to the above, except the Python exception object is specified, // rather than using the "current" PYCOM_EXPORT BOOL PyCom_ExcepInfoFromPyObject(PyObject *obExcepInfo, EXCEPINFO *pexcepInfo, HRESULT *phresult = NULL); // Create a Python object holding the exception information. The exception // information is *not* freed by this function. Python exceptions are // raised and NULL is returned if an error occurs. PYCOM_EXPORT PyObject *PyCom_PyObjectFromExcepInfo(const EXCEPINFO *pexcepInfo); /////////////////////////////////////////////////////////////////// // // External C++ helpers - these helpers are for other DLLs which // may need similar functionality, but dont want to duplicate all // This helper is for an application that has an IDispatch, and COM arguments // and wants to call a Python function. It is assumed the caller can map the IDispatch // to a Python object, so the Python handler is passed. // Args: // handler : A Python callable object. // dispparms : the COM arguments. // pVarResult : The variant for the return value of the Python call. // pexcepinfo : Exception info the helper may fill out. // puArgErr : Argument error the helper may fill out on exception // addnArgs : Any additional arguments to the Python function. May be NULL. // If addnArgs is NULL, then it is assumed the Python call should be native - // ie, the COM args are packed as normal Python args to the call. // If addnArgs is NOT NULL, it is assumed the Python function itself is // a helper. This Python function will be called with 2 arguments - both // tuples - first one is the COM args, second is the addn args. PYCOM_EXPORT BOOL PyCom_MakeOlePythonCall(PyObject *handler, DISPPARAMS FAR *params, VARIANT FAR *pVarResult, EXCEPINFO FAR *pexcepinfo, UINT FAR *puArgErr, PyObject *addnlArgs); ///////////////////////////////////////////////////////////////////////////// // Various special purpose singletons class PYCOM_EXPORT PyOleEmpty : public PyObject { public: PyOleEmpty(); }; class PYCOM_EXPORT PyOleMissing : public PyObject { public: PyOleMissing(); }; class PYCOM_EXPORT PyOleArgNotFound : public PyObject { public: PyOleArgNotFound(); }; class PYCOM_EXPORT PyOleNothing : public PyObject { public: PyOleNothing(); }; // We need to dynamically create C++ Python objects // These helpers allow each type object to create it. #define MAKE_PYCOM_CTOR(classname) \ static PyIUnknown *classname::PyObConstruct(IUnknown *pInitObj) { return new classname(pInitObj); } #define MAKE_PYCOM_CTOR_ERRORINFO(classname, iid) \ static PyIUnknown *classname::PyObConstruct(IUnknown *pInitObj) { return new classname(pInitObj); } \ static PyObject *SetPythonCOMError(PyObject *self, HRESULT hr) \ { \ return PyCom_BuildPyException(hr, GetI(self), iid); \ } #define GET_PYCOM_CTOR(classname) classname::PyObConstruct // Macros that interfaces should use. PY_INTERFACE_METHOD at the top of the method // The other 2 wrap directly around the underlying method call. #define PY_INTERFACE_METHOD // Identical to Py_BEGIN_ALLOW_THREADS except no { !!! #define PY_INTERFACE_PRECALL PyThreadState *_save = PyEval_SaveThread(); #define PY_INTERFACE_POSTCALL PyEval_RestoreThread(_save); ///////////////////////////////////////////////////////////////////////////// // class PyIUnknown class PYCOM_EXPORT PyIUnknown : public PyIBase { public: MAKE_PYCOM_CTOR(PyIUnknown); virtual PyObject *repr(); virtual int compare(PyObject *other); static IUnknown *GetI(PyObject *self); IUnknown *m_obj; static char *szErrMsgObjectReleased; static void SafeRelease(PyIUnknown *ob); static PyComTypeObject type; // The Python methods static PyObject *QueryInterface(PyObject *self, PyObject *args); static PyObject *SafeRelease(PyObject *self, PyObject *args); protected: PyIUnknown(IUnknown *punk); ~PyIUnknown(); }; ///////////////////////////////////////////////////////////////////////////// // class PyIDispatch class PYCOM_EXPORT PyIDispatch : public PyIUnknown { public: MAKE_PYCOM_CTOR(PyIDispatch); static IDispatch *GetI(PyObject *self); static PyComTypeObject type; // The Python methods static PyObject *Invoke(PyObject *self, PyObject *args); static PyObject *InvokeTypes(PyObject *self, PyObject *args); static PyObject *GetIDsOfNames(PyObject *self, PyObject *args); static PyObject *GetTypeInfo(PyObject *self, PyObject *args); static PyObject *GetTypeInfoCount(PyObject *self, PyObject *args); protected: PyIDispatch(IUnknown *pdisp); ~PyIDispatch(); }; #ifndef NO_PYCOM_IDISPATCHEX ///////////////////////////////////////////////////////////////////////////// // class PyIDispatchEx class PYCOM_EXPORT PyIDispatchEx : public PyIDispatch { public: MAKE_PYCOM_CTOR_ERRORINFO(PyIDispatchEx, IID_IDispatchEx); static IDispatchEx *GetI(PyObject *self); static PyComTypeObject type; // The Python methods static PyObject *GetDispID(PyObject *self, PyObject *args); static PyObject *InvokeEx(PyObject *self, PyObject *args); static PyObject *DeleteMemberByName(PyObject *self, PyObject *args); static PyObject *DeleteMemberByDispID(PyObject *self, PyObject *args); static PyObject *GetMemberProperties(PyObject *self, PyObject *args); static PyObject *GetMemberName(PyObject *self, PyObject *args); static PyObject *GetNextDispID(PyObject *self, PyObject *args); protected: PyIDispatchEx(IUnknown *pdisp); ~PyIDispatchEx(); }; #endif // NO_PYCOM_IDISPATCHEX ///////////////////////////////////////////////////////////////////////////// // class PyIClassFactory class PYCOM_EXPORT PyIClassFactory : public PyIUnknown { public: MAKE_PYCOM_CTOR(PyIClassFactory); static IClassFactory *GetI(PyObject *self); static PyComTypeObject type; // The Python methods static PyObject *CreateInstance(PyObject *self, PyObject *args); static PyObject *LockServer(PyObject *self, PyObject *args); protected: PyIClassFactory(IUnknown *pdisp); ~PyIClassFactory(); }; #ifndef NO_PYCOM_IPROVIDECLASSINFO ///////////////////////////////////////////////////////////////////////////// // class PyIProvideTypeInfo class PYCOM_EXPORT PyIProvideClassInfo : public PyIUnknown { public: MAKE_PYCOM_CTOR(PyIProvideClassInfo); static IProvideClassInfo *GetI(PyObject *self); static PyComTypeObject type; // The Python methods static PyObject *GetClassInfo(PyObject *self, PyObject *args); protected: PyIProvideClassInfo(IUnknown *pdisp); ~PyIProvideClassInfo(); }; class PYCOM_EXPORT PyIProvideClassInfo2 : public PyIProvideClassInfo { public: MAKE_PYCOM_CTOR(PyIProvideClassInfo2); static IProvideClassInfo2 *GetI(PyObject *self); static PyComTypeObject type; // The Python methods static PyObject *GetGUID(PyObject *self, PyObject *args); protected: PyIProvideClassInfo2(IUnknown *pdisp); ~PyIProvideClassInfo2(); }; #endif // NO_PYCOM_IPROVIDECLASSINFO ///////////////////////////////////////////////////////////////////////////// // class PyITypeInfo class PYCOM_EXPORT PyITypeInfo : public PyIUnknown { public: MAKE_PYCOM_CTOR(PyITypeInfo); static PyComTypeObject type; static ITypeInfo *GetI(PyObject *self); PyObject *GetContainingTypeLib(); PyObject *GetDocumentation(MEMBERID); PyObject *GetRefTypeInfo(HREFTYPE href); PyObject *GetRefTypeOfImplType(int index); PyObject *GetFuncDesc(int pos); PyObject *GetIDsOfNames(OLECHAR FAR *FAR *, int); PyObject *GetNames(MEMBERID); PyObject *GetTypeAttr(); PyObject *GetVarDesc(int pos); PyObject *GetImplTypeFlags(int index); PyObject *GetTypeComp(); protected: PyITypeInfo(IUnknown *); ~PyITypeInfo(); }; ///////////////////////////////////////////////////////////////////////////// // class PyITypeComp class PYCOM_EXPORT PyITypeComp : public PyIUnknown { public: MAKE_PYCOM_CTOR(PyITypeComp); static PyComTypeObject type; static ITypeComp *GetI(PyObject *self); PyObject *Bind(OLECHAR *szName, unsigned short wflags); PyObject *BindType(OLECHAR *szName); protected: PyITypeComp(IUnknown *); ~PyITypeComp(); }; ///////////////////////////////////////////////////////////////////////////// // class CPyTypeLib class PYCOM_EXPORT PyITypeLib : public PyIUnknown { public: MAKE_PYCOM_CTOR(PyITypeLib); static PyComTypeObject type; static ITypeLib *GetI(PyObject *self); PyObject *GetLibAttr(); PyObject *GetDocumentation(int pos); PyObject *GetTypeInfo(int pos); PyObject *GetTypeInfoCount(); PyObject *GetTypeInfoOfGuid(REFGUID guid); PyObject *GetTypeInfoType(int pos); PyObject *GetTypeComp(); protected: PyITypeLib(IUnknown *); ~PyITypeLib(); }; ///////////////////////////////////////////////////////////////////////////// // class PyIConnectionPoint class PYCOM_EXPORT PyIConnectionPoint : public PyIUnknown { public: MAKE_PYCOM_CTOR_ERRORINFO(PyIConnectionPoint, IID_IConnectionPoint); static PyComTypeObject type; static IConnectionPoint *GetI(PyObject *self); static PyObject *GetConnectionInterface(PyObject *self, PyObject *args); static PyObject *GetConnectionPointContainer(PyObject *self, PyObject *args); static PyObject *Advise(PyObject *self, PyObject *args); static PyObject *Unadvise(PyObject *self, PyObject *args); static PyObject *EnumConnections(PyObject *self, PyObject *args); protected: PyIConnectionPoint(IUnknown *); ~PyIConnectionPoint(); }; class PYCOM_EXPORT PyIConnectionPointContainer : public PyIUnknown { public: MAKE_PYCOM_CTOR_ERRORINFO(PyIConnectionPointContainer, IID_IConnectionPointContainer); static PyComTypeObject type; static IConnectionPointContainer *GetI(PyObject *self); static PyObject *EnumConnectionPoints(PyObject *self, PyObject *args); static PyObject *FindConnectionPoint(PyObject *self, PyObject *args); protected: PyIConnectionPointContainer(IUnknown *); ~PyIConnectionPointContainer(); }; ///////////////////////////////////////////////////////////////////////////// // class PythonOleArgHelper // // A PythonOleArgHelper is used primarily to help out Python helpers // which need to convert from a Python object when the specific OLE // type is known - eg, when a TypeInfo is available. // // The type of conversion determines who owns what buffers etc. I wish BYREF didnt exist :-) typedef enum { // We dont know what sort of conversion it is yet. POAH_CONVERT_UNKNOWN, // A PyObject is given, we convert to a VARIANT, make the COM call, then BYREFs back to a PyObject // ie, this is typically a "normal" COM call, where Python initiates the call POAH_CONVERT_FROM_PYOBJECT, // A VARIANT is given, we convert to a PyObject, make the Python call, then BYREFs back to a VARIANT. // ie, this is typically handling a COM event, where COM itself initiates the call. POAH_CONVERT_FROM_VARIANT, } POAH_CONVERT_DIRECTION; class PYCOM_EXPORT PythonOleArgHelper { public: PythonOleArgHelper(); ~PythonOleArgHelper(); BOOL ParseTypeInformation(PyObject *reqdObjectTuple); // Using this call with reqdObject != NULL will check the existing // VT_ of the variant. If not VT_EMPTY, then the result will be coerced to // that type. This contrasts with PyCom_PyObjectToVariant which just // uses the Python type to determine the variant type. BOOL MakeObjToVariant(PyObject *obj, VARIANT *var, PyObject *reqdObjectTuple = NULL); PyObject *MakeVariantToObj(VARIANT *var); VARTYPE m_reqdType; BOOL m_bParsedTypeInfo; BOOL m_bIsOut; POAH_CONVERT_DIRECTION m_convertDirection; PyObject *m_pyVariant; // if non-null, a win32com.client.VARIANT union { void *m_pValueHolder; short m_sBuf; long m_lBuf; LONGLONG m_llBuf; VARIANT_BOOL m_boolBuf; double m_dBuf; float m_fBuf; IDispatch *m_dispBuf; IUnknown *m_unkBuf; SAFEARRAY *m_arrayBuf; VARIANT *m_varBuf; DATE m_dateBuf; CY m_cyBuf; }; }; ///////////////////////////////////////////////////////////////////////////// // global functions and variables PYCOM_EXPORT BOOL MakePythonArgumentTuples(PyObject **pArgs, PythonOleArgHelper **ppHelpers, PyObject **pNamedArgs, PythonOleArgHelper **ppNamedHelpers, DISPPARAMS FAR *params); // Convert a Python object to a BSTR - allow embedded NULLs, None, etc. PYCOM_EXPORT BOOL PyCom_BstrFromPyObject(PyObject *stringObject, BSTR *pResult, BOOL bNoneOK = FALSE); // MakeBstrToObj - convert a BSTR into a Python string. // // ONLY USE THIS FOR TRUE BSTR's - Use the fn below for OLECHAR *'s. // NOTE - does not use standard macros, so NULLs get through! PYCOM_EXPORT PyObject *MakeBstrToObj(const BSTR bstr); // Size info is available (eg, a fn returns a string and also fills in a size variable) PYCOM_EXPORT PyObject *MakeOLECHARToObj(const OLECHAR *str, int numChars); // No size info avail. PYCOM_EXPORT PyObject *MakeOLECHARToObj(const OLECHAR *str); PYCOM_EXPORT void PyCom_LogF(const char *fmt, ...); // Generic conversion from python sequence to VT_VECTOR array // Resulting array must be freed with CoTaskMemFree template BOOL SeqToVector(PyObject *ob, arraytype **pA, ULONG *pcount, BOOL (*converter)(PyObject *, arraytype *)) { TmpPyObject seq = PyWinSequence_Tuple(ob, pcount); if (seq == NULL) return FALSE; *pA = (arraytype *)CoTaskMemAlloc(*pcount * sizeof(arraytype)); if (*pA == NULL) { PyErr_NoMemory(); return FALSE; } for (ULONG i = 0; i < *pcount; i++) { PyObject *item = PyTuple_GET_ITEM((PyObject *)seq, i); if (!(*converter)(item, &(*pA)[i])) return FALSE; } return TRUE; } #endif // __PYTHONCOM_H__ PK (='Oy$win32com/include/PythonCOMRegister.hUT _s]Zx`ux // Support for PythonCOM and its extensions to register the interfaces, // gateways and IIDs it supports. // // The module can simply declare an array of type PyCom_InterfaceSupportInfo, then // use the macros to populate it. // // See Register.cpp and AXScript.cpp for examples on its use. #ifndef __PYTHONCOMREGISTER_H__ #define __PYTHONCOMREGISTER_H__ #include "PythonCOMServer.h" // Need defns in this file... typedef struct { const GUID *pGUID; // The supported IID - required const char *interfaceName; // Name of the interface - required const char *iidName; // Name of the IID that goes into the dict. - required PyTypeObject *pTypeOb; // the type object for client PyI* side - NULL for server only support. pfnPyGatewayConstructor ctor; // Gateway (PyG*) interface constructor - NULL for client only support } PyCom_InterfaceSupportInfo; #define PYCOM_INTERFACE_IID_ONLY(ifc) \ { \ &IID_I##ifc, "I" #ifc, "IID_I" #ifc, NULL, NULL \ } #define PYCOM_INTERFACE_CLSID_ONLY(ifc) \ { \ &CLSID_##ifc, "CLSID_" #ifc, "CLSID_" #ifc, NULL, NULL \ } #define PYCOM_INTERFACE_CATID_ONLY(ifc) \ { \ &CATID_##ifc, "CATID_" #ifc, "CATID_" #ifc, NULL, NULL \ } #define PYCOM_INTERFACE_CLIENT_ONLY(ifc) \ { \ &IID_I##ifc, "I" #ifc, "IID_I" #ifc, &PyI##ifc::type, NULL \ } #define PYCOM_INTERFACE_SERVER_ONLY(ifc) \ { \ &IID_I##ifc, "I" #ifc, "IID_I" #ifc, NULL, GET_PYGATEWAY_CTOR(PyG##ifc) \ } #define PYCOM_INTERFACE_FULL(ifc) \ { \ &IID_I##ifc, "I" #ifc, "IID_I" #ifc, &PyI##ifc::type, GET_PYGATEWAY_CTOR(PyG##ifc) \ } // Versions that use __uuidof() to get the IID, which seems to avoid the need // to link with a lib holding the IIDs. Note that almost all extensions // build with __uuidof() being the default; the build failed at 'shell' - so // we could consider making this the default and making the 'explicit' version // above the special case. #define PYCOM_INTERFACE_IID_ONLY_UUIDOF(ifc) \ { \ &__uuidof(I##ifc), "I" #ifc, "IID_I" #ifc, NULL, NULL \ } #define PYCOM_INTERFACE_CLIENT_ONLY_UUIDOF(ifc) \ { \ &__uuidof(I##ifc), "I" #ifc, "IID_I" #ifc, &PyI##ifc::type, NULL \ } #define PYCOM_INTERFACE_SERVER_ONLY_UUIDOF(ifc) \ { \ &__uuidof(I##ifc), "I" #ifc, "IID_I" #ifc, NULL, GET_PYGATEWAY_CTOR(PyG##ifc) \ } #define PYCOM_INTERFACE_FULL_UUIDOF(ifc) \ { \ &__uuidof(I##ifc), "I" #ifc, "IID_I" #ifc, &PyI##ifc::type, GET_PYGATEWAY_CTOR(PyG##ifc) \ } // Prototypes for the register functions // Register a PythonCOM extension module PYCOM_EXPORT int PyCom_RegisterExtensionSupport(PyObject *dict, const PyCom_InterfaceSupportInfo *pInterfaces, int numEntries); // THESE SHOULD NO LONGER BE USED. Instead, use the functions above passing an // array of PyCom_InterfaceSupportInfo objects. PYCOM_EXPORT int PyCom_RegisterClientType(PyTypeObject *typeOb, const GUID *guid); HRESULT PYCOM_EXPORT PyCom_RegisterGatewayObject(REFIID iid, pfnPyGatewayConstructor ctor, const char *interfaceName); PYCOM_EXPORT int PyCom_IsGatewayRegistered(REFIID iid); #endif /* __PYTHONCOMREGISTER_H__ */ PK v,XQѿd|win32com/__init__.pyUT 0_Zx`ux # # Initialization for the win32com package # import win32api, sys, os import pythoncom # flag if we are in a "frozen" build. _frozen = getattr(sys, "frozen", 1==0) # pythoncom dumbly defaults this to zero - we believe sys.frozen over it. if _frozen and not getattr(pythoncom, "frozen", 0): pythoncom.frozen = sys.frozen # Add support for an external "COM Extensions" path. # Concept is that you can register a seperate path to be used for # COM extensions, outside of the win32com directory. These modules, however, # look identical to win32com built-in modules. # This is the technique that we use for the "standard" COM extensions. # eg "win32com.mapi" or "win32com.axscript" both work, even though they do not # live under the main win32com directory. __gen_path__ = '' __build_path__ = None ### TODO - Load _all_ \\Extensions subkeys - for now, we only read the default ### Modules will work if loaded into "win32comext" path. def SetupEnvironment(): HKEY_LOCAL_MACHINE = -2147483646 # Avoid pulling in win32con for just these... KEY_QUERY_VALUE = 0x1 # Open the root key once, as this is quite slow on NT. try: keyName = "SOFTWARE\\Python\\PythonCore\\%s\\PythonPath\\win32com" % sys.winver key = win32api.RegOpenKey(HKEY_LOCAL_MACHINE , keyName, 0, KEY_QUERY_VALUE) except (win32api.error, AttributeError): key = None try: found = 0 if key is not None: try: __path__.append( win32api.RegQueryValue(key, "Extensions" )) found = 1 except win32api.error: # Nothing registered pass if not found: try: __path__.append( win32api.GetFullPathName( __path__[0] + "\\..\\win32comext") ) except win32api.error: # Give up in disgust! pass # For the sake of developers, we also look up a "BuildPath" key # If extension modules add support, we can load their .pyd's from a completely # different directory (see the comments below) try: if key is not None: global __build_path__ __build_path__ = win32api.RegQueryValue(key, "BuildPath") __path__.append(__build_path__) except win32api.error: # __build_path__ neednt be defined. pass global __gen_path__ if key is not None: try: __gen_path__ = win32api.RegQueryValue(key, "GenPath") except win32api.error: pass finally: if key is not None: key.Close() # A Helper for developers. A sub-package's __init__ can call this help function, # which allows the .pyd files for the extension to live in a special "Build" directory # (which the win32com developers do!) def __PackageSupportBuildPath__(package_path): # See if we have a special directory for the binaries (for developers) if not _frozen and __build_path__: package_path.append(__build_path__) if not _frozen: SetupEnvironment() # If we don't have a special __gen_path__, see if we have a gen_py as a # normal module and use that (ie, "win32com.gen_py" may already exist as # a package. if not __gen_path__: try: import win32com.gen_py # hrmph - 3.3 throws: TypeError: '_NamespacePath' object does not support indexing # attempting to get __path__[0] - but I can't quickly repro this stand-alone. # Work around it by using an iterator. __gen_path__ = next(iter(sys.modules["win32com.gen_py"].__path__)) except ImportError: # If a win32com\gen_py directory already exists, then we use it # (gencache doesn't insist it have an __init__, but our __import__ # above does! __gen_path__ = os.path.abspath(os.path.join(__path__[0], "gen_py")) if not os.path.isdir(__gen_path__): # We used to dynamically create a directory under win32com - # but this sucks. If the dir doesn't already exist, we we # create a version specific directory under the user temp # directory. __gen_path__ = os.path.join( win32api.GetTempPath(), "gen_py", "%d.%d" % (sys.version_info[0], sys.version_info[1])) # we must have a __gen_path__, but may not have a gen_py module - # set that up. if "win32com.gen_py" not in sys.modules: # Create a "win32com.gen_py", but with a custom __path__ import types gen_py = types.ModuleType("win32com.gen_py") gen_py.__path__ = [ __gen_path__ ] sys.modules[gen_py.__name__] = gen_py del types gen_py = sys.modules["win32com.gen_py"] # get rid of these for module users del os, sys, win32api, pythoncom PK {Rwin32com/server/UT Zx`Zx`ux PK ѳP!#!#win32com/server/dispatcher.pyUT l_Zx`ux """Dispatcher Please see policy.py for a discussion on dispatchers and policies """ import pythoncom, traceback, win32api from sys import exc_info # from win32com.server.exception import IsCOMServerException from win32com.util import IIDToInterfaceName import win32com class DispatcherBase: """ The base class for all Dispatchers. This dispatcher supports wrapping all operations in exception handlers, and all the necessary delegation to the policy. This base class supports the printing of "unexpected" exceptions. Note, however, that exactly where the output of print goes may not be useful! A derived class may provide additional semantics for this. """ def __init__(self, policyClass, object): self.policy = policyClass(object) # The logger we should dump to. If None, we should send to the # default location (typically 'print') self.logger = getattr(win32com, "logger", None) # Note the "return self._HandleException_()" is purely to stop pychecker # complaining - _HandleException_ will itself raise an exception for the # pythoncom framework, so the result will never be seen. def _CreateInstance_(self, clsid, reqIID): try: self.policy._CreateInstance_(clsid, reqIID) return pythoncom.WrapObject(self, reqIID) except: return self._HandleException_() def _QueryInterface_(self, iid): try: return self.policy._QueryInterface_(iid) except: return self._HandleException_() def _Invoke_(self, dispid, lcid, wFlags, args): try: return self.policy._Invoke_(dispid, lcid, wFlags, args) except: return self._HandleException_() def _GetIDsOfNames_(self, names, lcid): try: return self.policy._GetIDsOfNames_(names, lcid) except: return self._HandleException_() def _GetTypeInfo_(self, index, lcid): try: return self.policy._GetTypeInfo_(index, lcid) except: return self._HandleException_() def _GetTypeInfoCount_(self): try: return self.policy._GetTypeInfoCount_() except: return self._HandleException_() def _GetDispID_(self, name, fdex): try: return self.policy._GetDispID_(name, fdex) except: return self._HandleException_() def _InvokeEx_(self, dispid, lcid, wFlags, args, kwargs, serviceProvider): try: return self.policy._InvokeEx_(dispid, lcid, wFlags, args, kwargs, serviceProvider) except: return self._HandleException_() def _DeleteMemberByName_(self, name, fdex): try: return self.policy._DeleteMemberByName_(name, fdex) except: return self._HandleException_() def _DeleteMemberByDispID_(self, id): try: return self.policy._DeleteMemberByDispID_(id) except: return self._HandleException_() def _GetMemberProperties_(self, id, fdex): try: return self.policy._GetMemberProperties_(id, fdex) except: return self._HandleException_() def _GetMemberName_(self, dispid): try: return self.policy._GetMemberName_(dispid) except: return self._HandleException_() def _GetNextDispID_(self, fdex, flags): try: return self.policy._GetNextDispID_(fdex, flags) except: return self._HandleException_() def _GetNameSpaceParent_(self): try: return self.policy._GetNameSpaceParent_() except: return self._HandleException_() def _HandleException_(self): """Called whenever an exception is raised. Default behaviour is to print the exception. """ # If not a COM exception, print it for the developer. if not IsCOMServerException(): if self.logger is not None: self.logger.exception("pythoncom server error") else: traceback.print_exc() # But still raise it for the framework. raise def _trace_(self, *args): if self.logger is not None: record = " ".join(map(str, args)) self.logger.debug(record) else: for arg in args[:-1]: print(arg, end=' ') print(args[-1]) class DispatcherTrace(DispatcherBase): """A dispatcher, which causes a 'print' line for each COM function called. """ def _QueryInterface_(self, iid): rc = DispatcherBase._QueryInterface_(self, iid) if not rc: self._trace_("in %s._QueryInterface_ with unsupported IID %s (%s)" % (repr(self.policy._obj_), IIDToInterfaceName(iid),iid)) return rc def _GetIDsOfNames_(self, names, lcid): self._trace_("in _GetIDsOfNames_ with '%s' and '%d'\n" % (names, lcid)) return DispatcherBase._GetIDsOfNames_(self, names, lcid) def _GetTypeInfo_(self, index, lcid): self._trace_("in _GetTypeInfo_ with index=%d, lcid=%d\n" % (index, lcid)) return DispatcherBase._GetTypeInfo_(self, index, lcid) def _GetTypeInfoCount_(self): self._trace_("in _GetTypeInfoCount_\n") return DispatcherBase._GetTypeInfoCount_(self) def _Invoke_(self, dispid, lcid, wFlags, args): self._trace_("in _Invoke_ with", dispid, lcid, wFlags, args) return DispatcherBase._Invoke_(self, dispid, lcid, wFlags, args) def _GetDispID_(self, name, fdex): self._trace_("in _GetDispID_ with", name, fdex) return DispatcherBase._GetDispID_(self, name, fdex) def _InvokeEx_(self, dispid, lcid, wFlags, args, kwargs, serviceProvider): self._trace_("in %r._InvokeEx_-%s%r [%x,%s,%r]" % (self.policy._obj_, dispid, args, wFlags, lcid, serviceProvider)) return DispatcherBase._InvokeEx_(self, dispid, lcid, wFlags, args, kwargs, serviceProvider) def _DeleteMemberByName_(self, name, fdex): self._trace_("in _DeleteMemberByName_ with", name, fdex) return DispatcherBase._DeleteMemberByName_(self, name, fdex) def _DeleteMemberByDispID_(self, id): self._trace_("in _DeleteMemberByDispID_ with", id) return DispatcherBase._DeleteMemberByDispID_(self, id) def _GetMemberProperties_(self, id, fdex): self._trace_("in _GetMemberProperties_ with", id, fdex) return DispatcherBase._GetMemberProperties_(self, id, fdex) def _GetMemberName_(self, dispid): self._trace_("in _GetMemberName_ with", dispid) return DispatcherBase._GetMemberName_(self, dispid) def _GetNextDispID_(self, fdex, flags): self._trace_("in _GetNextDispID_ with", fdex, flags) return DispatcherBase._GetNextDispID_(self, fdex, flags) def _GetNameSpaceParent_(self): self._trace_("in _GetNameSpaceParent_") return DispatcherBase._GetNameSpaceParent_(self) class DispatcherWin32trace(DispatcherTrace): """A tracing dispatcher that sends its output to the win32trace remote collector. """ def __init__(self, policyClass, object): DispatcherTrace.__init__(self, policyClass, object) if self.logger is None: # If we have no logger, setup our output. import win32traceutil # Sets up everything. self._trace_("Object with win32trace dispatcher created (object=%s)" % repr(object)) class DispatcherOutputDebugString(DispatcherTrace): """A tracing dispatcher that sends its output to win32api.OutputDebugString """ def _trace_(self, *args): for arg in args[:-1]: win32api.OutputDebugString(str(arg)+" ") win32api.OutputDebugString(str(args[-1])+"\n") class DispatcherWin32dbg(DispatcherBase): """A source-level debugger dispatcher A dispatcher which invokes the debugger as an object is instantiated, or when an unexpected exception occurs. Requires Pythonwin. """ def __init__(self, policyClass, ob): # No one uses this, and it just causes py2exe to drag all of # pythonwin in. #import pywin.debugger pywin.debugger.brk() print("The DispatcherWin32dbg dispatcher is deprecated!") print("Please let me know if this is a problem.") print("Uncomment the relevant lines in dispatcher.py to re-enable") # DEBUGGER Note - You can either: # * Hit Run and wait for a (non Exception class) exception to occur! # * Set a breakpoint and hit run. # * Step into the object creation (a few steps away!) DispatcherBase.__init__(self, policyClass, ob) def _HandleException_(self): """ Invoke the debugger post mortem capability """ # Save details away. typ, val, tb = exc_info() #import pywin.debugger, pywin.debugger.dbgcon debug = 0 try: raise typ(val) except Exception: # AARG - What is this Exception??? # Use some inside knowledge to borrow a Debugger option which dictates if we # stop at "expected" exceptions. debug = pywin.debugger.GetDebugger().get_option(pywin.debugger.dbgcon.OPT_STOP_EXCEPTIONS) except: debug = 1 if debug: try: pywin.debugger.post_mortem(tb, typ, val) # The original exception except: traceback.print_exc() # But still raise it. del tb raise try: import win32trace DefaultDebugDispatcher = DispatcherWin32trace except ImportError: # no win32trace module - just use a print based one. DefaultDebugDispatcher = DispatcherTrace PK Y03KqGS S win32com/server/exception.pyUT  YZx`ux """Exception Handling Exceptions To better support COM exceptions, the framework allows for an instance to be raised. This instance may have a certain number of known attributes, which are translated into COM exception details. This means, for example, that Python could raise a COM exception that includes details on a Help file and location, and a description for the user. This module provides a class which provides the necessary attributes. """ import sys, pythoncom # Note that we derive from com_error, which derives from exceptions.Exception # Also note that we dont support "self.args", as we dont support tuple-unpacking class COMException(pythoncom.com_error): """An Exception object that is understood by the framework. If the framework is presented with an exception of type class, it looks for certain known attributes on this class to provide rich error information to the caller. It should be noted that the framework supports providing this error information via COM Exceptions, or via the ISupportErrorInfo interface. By using this class, you automatically provide rich error information to the server. """ def __init__(self, description = None, scode = None, source = None, helpfile = None, helpContext = None, desc = None, hresult = None): """Initialize an exception **Params** description -- A string description for the exception. scode -- An integer scode to be returned to the server, if necessary. The pythoncom framework defaults this to be DISP_E_EXCEPTION if not specified otherwise. source -- A string which identifies the source of the error. helpfile -- A string which points to a help file which contains details on the error. helpContext -- An integer context in the help file. desc -- A short-cut for description. hresult -- A short-cut for scode. """ # convert a WIN32 error into an HRESULT scode = scode or hresult if scode and scode != 1: # We dont want S_FALSE mapped! if scode >= -32768 and scode < 32768: # this is HRESULT_FROM_WIN32() scode = -2147024896 | (scode & 0x0000FFFF) self.scode = scode self.description = description or desc if scode==1 and not self.description: self.description = "S_FALSE" elif scode and not self.description: self.description = pythoncom.GetScodeString(scode) self.source = source self.helpfile = helpfile self.helpcontext = helpContext # todo - fill in the exception value pythoncom.com_error.__init__(self, scode, self.description, None, -1) def __repr__(self): return "" % (self.scode, self.description) # Old name for the COMException class. # Do NOT use the name Exception, as it is now a built-in # COMException is the new, official name. Exception = COMException def IsCOMException(t = None): if t is None: t = sys.exc_info()[0] try: return issubclass(t, pythoncom.com_error) except TypeError: # 1.5 in -X mode? return t is pythoncon.com_error def IsCOMServerException(t = None): if t is None: t = sys.exc_info()[0] try: return issubclass(t, COMException) except TypeError: # String exception return 0 PK Y03K?%win32com/server/localserver.pyUT  YZx`ux # LocalServer .EXE support for Python. # # This is designed to be used as a _script_ file by pythonw.exe # # In some cases, you could also use Python.exe, which will create # a console window useful for debugging. # # NOTE: When NOT running in any sort of debugging mode, # 'print' statements may fail, as sys.stdout is not valid!!! # # Usage: # wpython.exe LocalServer.py clsid [, clsid] import sys sys.coinit_flags = 2 import pythoncom import win32api from win32com.server import factory usage = """\ Invalid command line arguments This program provides LocalServer COM support for Python COM objects. It is typically run automatically by COM, passing as arguments The ProgID or CLSID of the Python Server(s) to be hosted """ def serve(clsids): infos = factory.RegisterClassFactories(clsids) pythoncom.EnableQuitMessage(win32api.GetCurrentThreadId()) pythoncom.CoResumeClassObjects() pythoncom.PumpMessages() factory.RevokeClassFactories( infos ) pythoncom.CoUninitialize() def main(): if len(sys.argv)==1: win32api.MessageBox(0, usage, "Python COM Server") sys.exit(1) serve(sys.argv[1:]) if __name__=='__main__': main() PK ѳP,Z,Zwin32com/server/register.pyUT l_Zx`ux """Utilities for registering objects. This module contains utility functions to register Python objects as valid COM Servers. The RegisterServer function provides all information necessary to allow the COM framework to respond to a request for a COM object, construct the necessary Python object, and dispatch COM events. """ import sys import win32api import win32con import pythoncom import winerror import os CATID_PythonCOMServer = "{B3EF80D0-68E2-11D0-A689-00C04FD658FF}" def _set_subkeys(keyName, valueDict, base=win32con.HKEY_CLASSES_ROOT): hkey = win32api.RegCreateKey(base, keyName) try: for key, value in valueDict.items(): win32api.RegSetValueEx(hkey, key, None, win32con.REG_SZ, value) finally: win32api.RegCloseKey(hkey) def _set_string(path, value, base=win32con.HKEY_CLASSES_ROOT): "Set a string value in the registry." win32api.RegSetValue(base, path, win32con.REG_SZ, value) def _get_string(path, base=win32con.HKEY_CLASSES_ROOT): "Get a string value from the registry." try: return win32api.RegQueryValue(base, path) except win32api.error: return None def _remove_key(path, base=win32con.HKEY_CLASSES_ROOT): "Remove a string from the registry." try: win32api.RegDeleteKey(base, path) except win32api.error as xxx_todo_changeme1: (code, fn, msg) = xxx_todo_changeme1.args if code != winerror.ERROR_FILE_NOT_FOUND: raise win32api.error(code, fn, msg) def recurse_delete_key(path, base=win32con.HKEY_CLASSES_ROOT): """Recursively delete registry keys. This is needed since you can't blast a key when subkeys exist. """ try: h = win32api.RegOpenKey(base, path) except win32api.error as xxx_todo_changeme2: (code, fn, msg) = xxx_todo_changeme2.args if code != winerror.ERROR_FILE_NOT_FOUND: raise win32api.error(code, fn, msg) else: # parent key found and opened successfully. do some work, making sure # to always close the thing (error or no). try: # remove all of the subkeys while 1: try: subkeyname = win32api.RegEnumKey(h, 0) except win32api.error as xxx_todo_changeme: (code, fn, msg) = xxx_todo_changeme.args if code != winerror.ERROR_NO_MORE_ITEMS: raise win32api.error(code, fn, msg) break recurse_delete_key(path + '\\' + subkeyname, base) # remove the parent key _remove_key(path, base) finally: win32api.RegCloseKey(h) def _cat_registrar(): return pythoncom.CoCreateInstance( pythoncom.CLSID_StdComponentCategoriesMgr, None, pythoncom.CLSCTX_INPROC_SERVER, pythoncom.IID_ICatRegister ) def _find_localserver_exe(mustfind): if not sys.platform.startswith("win32"): return sys.executable if pythoncom.__file__.find("_d") < 0: exeBaseName = "pythonw.exe" else: exeBaseName = "pythonw_d.exe" # First see if in the same directory as this .EXE exeName = os.path.join( os.path.split(sys.executable)[0], exeBaseName ) if not os.path.exists(exeName): # See if in our sys.prefix directory exeName = os.path.join( sys.prefix, exeBaseName ) if not os.path.exists(exeName): # See if in our sys.prefix/pcbuild directory (for developers) if "64 bit" in sys.version: exeName = os.path.join( sys.prefix, "PCbuild", "amd64", exeBaseName ) else: exeName = os.path.join( sys.prefix, "PCbuild", exeBaseName ) if not os.path.exists(exeName): # See if the registry has some info. try: key = "SOFTWARE\\Python\\PythonCore\\%s\\InstallPath" % sys.winver path = win32api.RegQueryValue( win32con.HKEY_LOCAL_MACHINE, key ) exeName = os.path.join( path, exeBaseName ) except (AttributeError,win32api.error): pass if not os.path.exists(exeName): if mustfind: raise RuntimeError("Can not locate the program '%s'" % exeBaseName) return None return exeName def _find_localserver_module(): import win32com.server path = win32com.server.__path__[0] baseName = "localserver" pyfile = os.path.join(path, baseName + ".py") try: os.stat(pyfile) except os.error: # See if we have a compiled extension if __debug__: ext = ".pyc" else: ext = ".pyo" pyfile = os.path.join(path, baseName + ext) try: os.stat(pyfile) except os.error: raise RuntimeError("Can not locate the Python module 'win32com.server.%s'" % baseName) return pyfile def RegisterServer(clsid, pythonInstString=None, desc=None, progID=None, verProgID=None, defIcon=None, threadingModel="both", policy=None, catids=[], other={}, addPyComCat=None, dispatcher = None, clsctx = None, addnPath = None, ): """Registers a Python object as a COM Server. This enters almost all necessary information in the system registry, allowing COM to use the object. clsid -- The (unique) CLSID of the server. pythonInstString -- A string holding the instance name that will be created whenever COM requests a new object. desc -- The description of the COM object. progID -- The user name of this object (eg, Word.Document) verProgId -- The user name of this version's implementation (eg Word.6.Document) defIcon -- The default icon for the object. threadingModel -- The threading model this object supports. policy -- The policy to use when creating this object. catids -- A list of category ID's this object belongs in. other -- A dictionary of extra items to be registered. addPyComCat -- A flag indicating if the object should be added to the list of Python servers installed on the machine. If None (the default) then it will be registered when running from python source, but not registered if running in a frozen environment. dispatcher -- The dispatcher to use when creating this object. clsctx -- One of the CLSCTX_* constants. addnPath -- An additional path the COM framework will add to sys.path before attempting to create the object. """ ### backwards-compat check ### Certain policies do not require a "class name", just the policy itself. if not pythonInstString and not policy: raise TypeError('You must specify either the Python Class or Python Policy which implement the COM object.') keyNameRoot = "CLSID\\%s" % str(clsid) _set_string(keyNameRoot, desc) # Also register as an "Application" so DCOM etc all see us. _set_string("AppID\\%s" % clsid, progID) # Depending on contexts requested, register the specified server type. # Set default clsctx. if not clsctx: clsctx = pythoncom.CLSCTX_INPROC_SERVER | pythoncom.CLSCTX_LOCAL_SERVER # And if we are frozen, ignore the ones that don't make sense in this # context. if pythoncom.frozen: assert sys.frozen, "pythoncom is frozen, but sys.frozen is not set - don't know the context!" if sys.frozen == "dll": clsctx = clsctx & pythoncom.CLSCTX_INPROC_SERVER else: clsctx = clsctx & pythoncom.CLSCTX_LOCAL_SERVER # Now setup based on the clsctx left over. if clsctx & pythoncom.CLSCTX_INPROC_SERVER: # get the module to use for registration. # nod to Gordon's installer - if sys.frozen and sys.frozendllhandle # exist, then we are being registered via a DLL - use this DLL as the # file name. if pythoncom.frozen: if hasattr(sys, "frozendllhandle"): dllName = win32api.GetModuleFileName(sys.frozendllhandle) else: raise RuntimeError("We appear to have a frozen DLL, but I don't know the DLL to use") else: # Normal case - running from .py file, so register pythoncom's DLL. # Although now we prefer a 'loader' DLL if it exists to avoid some # manifest issues (the 'loader' DLL has a manifest, but pythoncom does not) pythoncom_dir = os.path.dirname(pythoncom.__file__) if pythoncom.__file__.find("_d") < 0: suffix = "" else: suffix = "_d" loadername = "pythoncomloader%d%d%s.dll" % (sys.version_info[0], sys.version_info[1], suffix) if os.path.isfile(os.path.join(pythoncom_dir, loadername)): dllName = loadername else: # just use pythoncom. dllName = os.path.basename(pythoncom.__file__) _set_subkeys(keyNameRoot + "\\InprocServer32", { None : dllName, "ThreadingModel" : threadingModel, }) else: # Remove any old InProcServer32 registrations _remove_key(keyNameRoot + "\\InprocServer32") if clsctx & pythoncom.CLSCTX_LOCAL_SERVER: if pythoncom.frozen: # If we are frozen, we write "{exe} /Automate", just # like "normal" .EXEs do exeName = win32api.GetShortPathName(sys.executable) command = '%s /Automate' % (exeName,) else: # Running from .py sources - we need to write # 'python.exe win32com\server\localserver.py {clsid}" exeName = _find_localserver_exe(1) exeName = win32api.GetShortPathName(exeName) pyfile = _find_localserver_module() command = '%s "%s" %s' % (exeName, pyfile, str(clsid)) _set_string(keyNameRoot + '\\LocalServer32', command) else: # Remove any old LocalServer32 registrations _remove_key(keyNameRoot + "\\LocalServer32") if pythonInstString: _set_string(keyNameRoot + '\\PythonCOM', pythonInstString) else: _remove_key(keyNameRoot + '\\PythonCOM') if policy: _set_string(keyNameRoot + '\\PythonCOMPolicy', policy) else: _remove_key(keyNameRoot + '\\PythonCOMPolicy') if dispatcher: _set_string(keyNameRoot + '\\PythonCOMDispatcher', dispatcher) else: _remove_key(keyNameRoot + '\\PythonCOMDispatcher') if defIcon: _set_string(keyNameRoot + '\\DefaultIcon', defIcon) else: _remove_key(keyNameRoot + '\\DefaultIcon') if addnPath: _set_string(keyNameRoot + "\\PythonCOMPath", addnPath) else: _remove_key(keyNameRoot + "\\PythonCOMPath") if addPyComCat is None: addPyComCat = pythoncom.frozen == 0 if addPyComCat: catids = catids + [ CATID_PythonCOMServer ] # Set up the implemented categories if catids: regCat = _cat_registrar() regCat.RegisterClassImplCategories(clsid, catids) # set up any other reg values they might have if other: for key, value in other.items(): _set_string(keyNameRoot + '\\' + key, value) if progID: # set the progID as the most specific that was given to us if verProgID: _set_string(keyNameRoot + '\\ProgID', verProgID) else: _set_string(keyNameRoot + '\\ProgID', progID) # Set up the root entries - version independent. if desc: _set_string(progID, desc) _set_string(progID + '\\CLSID', str(clsid)) # Set up the root entries - version dependent. if verProgID: # point from independent to the current version _set_string(progID + '\\CurVer', verProgID) # point to the version-independent one _set_string(keyNameRoot + '\\VersionIndependentProgID', progID) # set up the versioned progID if desc: _set_string(verProgID, desc) _set_string(verProgID + '\\CLSID', str(clsid)) def GetUnregisterServerKeys(clsid, progID=None, verProgID=None, customKeys = None): """Given a server, return a list of of ("key", root), which are keys recursively and uncondtionally deleted at unregister or uninstall time. """ # remove the main CLSID registration ret = [("CLSID\\%s" % str(clsid), win32con.HKEY_CLASSES_ROOT)] # remove the versioned ProgID registration if verProgID: ret.append((verProgID, win32con.HKEY_CLASSES_ROOT)) # blow away the independent ProgID. we can't leave it since we just # torched the class. ### could potentially check the CLSID... ? if progID: ret.append((progID, win32con.HKEY_CLASSES_ROOT)) # The DCOM config tool may write settings to the AppID key for our CLSID ret.append( ("AppID\\%s" % str(clsid), win32con.HKEY_CLASSES_ROOT) ) # Any custom keys? if customKeys: ret = ret + customKeys return ret def UnregisterServer(clsid, progID=None, verProgID=None, customKeys = None): """Unregisters a Python COM server.""" for args in GetUnregisterServerKeys(clsid, progID, verProgID, customKeys ): recurse_delete_key(*args) ### it might be nice at some point to "roll back" the independent ProgID ### to an earlier version if one exists, and just blowing away the ### specified version of the ProgID (and its corresponding CLSID) ### another time, though... ### NOTE: ATL simply blows away the above three keys without the ### potential checks that I describe. Assuming that defines the ### "standard" then we have no additional changes necessary. def GetRegisteredServerOption(clsid, optionName): """Given a CLSID for a server and option name, return the option value """ keyNameRoot = "CLSID\\%s\\%s" % (str(clsid), str(optionName)) return _get_string(keyNameRoot) def _get(ob, attr, default=None): try: return getattr(ob, attr) except AttributeError: pass # look down sub-classes try: bases = ob.__bases__ except AttributeError: # ob is not a class - no probs. return default for base in bases: val = _get(base, attr, None) if val is not None: return val return default def RegisterClasses(*classes, **flags): quiet = 'quiet' in flags and flags['quiet'] debugging = 'debug' in flags and flags['debug'] for cls in classes: clsid = cls._reg_clsid_ progID = _get(cls, '_reg_progid_') desc = _get(cls, '_reg_desc_', progID) spec = _get(cls, '_reg_class_spec_') verProgID = _get(cls, '_reg_verprogid_') defIcon = _get(cls, '_reg_icon_') threadingModel = _get(cls, '_reg_threading_', 'both') catids = _get(cls, '_reg_catids_', []) options = _get(cls, '_reg_options_', {}) policySpec = _get(cls, '_reg_policy_spec_') clsctx = _get(cls, '_reg_clsctx_') tlb_filename = _get(cls, '_reg_typelib_filename_') # default to being a COM category only when not frozen. addPyComCat = not _get(cls, '_reg_disable_pycomcat_', pythoncom.frozen!=0) addnPath = None if debugging: # If the class has a debugging dispatcher specified, use it, otherwise # use our default dispatcher. dispatcherSpec = _get(cls, '_reg_debug_dispatcher_spec_') if dispatcherSpec is None: dispatcherSpec = "win32com.server.dispatcher.DefaultDebugDispatcher" # And remember the debugging flag as servers may wish to use it at runtime. debuggingDesc = "(for debugging)" options['Debugging'] = "1" else: dispatcherSpec = _get(cls, '_reg_dispatcher_spec_') debuggingDesc = "" options['Debugging'] = "0" if spec is None: moduleName = cls.__module__ if moduleName == '__main__': # Use argv[0] to determine the module name. try: # Use the win32api to find the case-sensitive name moduleName = os.path.splitext(win32api.FindFiles(sys.argv[0])[0][8])[0] except (IndexError, win32api.error): # Can't find the script file - the user must explicitely set the _reg_... attribute. raise TypeError("Can't locate the script hosting the COM object - please set _reg_class_spec_ in your object") spec = moduleName + "." + cls.__name__ # Frozen apps don't need their directory on sys.path if not pythoncom.frozen: scriptDir = os.path.split(sys.argv[0])[0] if not scriptDir: scriptDir = "." addnPath = win32api.GetFullPathName(scriptDir) RegisterServer(clsid, spec, desc, progID, verProgID, defIcon, threadingModel, policySpec, catids, options, addPyComCat, dispatcherSpec, clsctx, addnPath) if not quiet: print('Registered:', progID or spec, debuggingDesc) # Register the typelibrary if tlb_filename: tlb_filename = os.path.abspath(tlb_filename) typelib = pythoncom.LoadTypeLib(tlb_filename) pythoncom.RegisterTypeLib(typelib, tlb_filename) if not quiet: print('Registered type library:', tlb_filename) extra = flags.get('finalize_register') if extra: extra() def UnregisterClasses(*classes, **flags): quiet = 'quiet' in flags and flags['quiet'] for cls in classes: clsid = cls._reg_clsid_ progID = _get(cls, '_reg_progid_') verProgID = _get(cls, '_reg_verprogid_') customKeys = _get(cls, '_reg_remove_keys_') unregister_typelib = _get(cls, '_reg_typelib_filename_') is not None UnregisterServer(clsid, progID, verProgID, customKeys) if not quiet: print('Unregistered:', progID or str(clsid)) if unregister_typelib: tlb_guid = _get(cls, "_typelib_guid_") if tlb_guid is None: # I guess I could load the typelib, but they need the GUID anyway. print("Have typelib filename, but no GUID - can't unregister") else: major, minor = _get(cls, "_typelib_version_", (1,0)) lcid = _get(cls, "_typelib_lcid_", 0) try: pythoncom.UnRegisterTypeLib(tlb_guid, major, minor, lcid) if not quiet: print('Unregistered type library') except pythoncom.com_error: pass extra = flags.get('finalize_unregister') if extra: extra() # # Unregister info is for installers or external uninstallers. # The WISE installer, for example firstly registers the COM server, # then queries for the Unregister info, appending it to its # install log. Uninstalling the package will the uninstall the server def UnregisterInfoClasses(*classes, **flags): ret = [] for cls in classes: clsid = cls._reg_clsid_ progID = _get(cls, '_reg_progid_') verProgID = _get(cls, '_reg_verprogid_') customKeys = _get(cls, '_reg_remove_keys_') ret = ret + GetUnregisterServerKeys(clsid, progID, verProgID, customKeys) return ret # Attempt to 're-execute' our current process with elevation. def ReExecuteElevated(flags): from win32com.shell.shell import ShellExecuteEx from win32com.shell import shellcon import win32process, win32event import winxpgui # we've already checked we are running XP above import tempfile if not flags['quiet']: print("Requesting elevation and retrying...") new_params = " ".join(['"' + a + '"' for a in sys.argv]) # If we aren't already in unattended mode, we want our sub-process to # be. if not flags['unattended']: new_params += " --unattended" # specifying the parent means the dialog is centered over our window, # which is a good usability clue. # hwnd is unlikely on the command-line, but flags may come from elsewhere hwnd = flags.get('hwnd', None) if hwnd is None: try: hwnd = winxpgui.GetConsoleWindow() except winxpgui.error: hwnd = 0 # Redirect output so we give the user some clue what went wrong. This # also means we need to use COMSPEC. However, the "current directory" # appears to end up ignored - so we execute things via a temp batch file. tempbase = tempfile.mktemp("pycomserverreg") outfile = tempbase + ".out" batfile = tempbase + ".bat" # If registering from pythonwin, need to run python console instead since # pythonwin will just open script for editting current_exe = os.path.split(sys.executable)[1].lower() exe_to_run = None if current_exe == 'pythonwin.exe': exe_to_run = os.path.join(sys.prefix, 'python.exe') elif current_exe == 'pythonwin_d.exe': exe_to_run = os.path.join(sys.prefix, 'python_d.exe') if not exe_to_run or not os.path.exists(exe_to_run): exe_to_run = sys.executable try: batf = open(batfile, "w") try: cwd = os.getcwd() print("@echo off", file=batf) # nothing is 'inherited' by the elevated process, including the # environment. I wonder if we need to set more? print("set PYTHONPATH=%s" % os.environ.get('PYTHONPATH', ''), file=batf) # may be on a different drive - select that before attempting to CD. print(os.path.splitdrive(cwd)[0], file=batf) print('cd "%s"' % os.getcwd(), file=batf) print('%s %s > "%s" 2>&1' % (win32api.GetShortPathName(exe_to_run), new_params, outfile), file=batf) finally: batf.close() executable = os.environ.get('COMSPEC', 'cmd.exe') rc = ShellExecuteEx(hwnd=hwnd, fMask=shellcon.SEE_MASK_NOCLOSEPROCESS, lpVerb="runas", lpFile=executable, lpParameters='/C "%s"' % batfile, nShow=win32con.SW_SHOW) hproc = rc['hProcess'] win32event.WaitForSingleObject(hproc, win32event.INFINITE) exit_code = win32process.GetExitCodeProcess(hproc) outf = open(outfile) try: output = outf.read() finally: outf.close() if exit_code: # Even if quiet you get to see this message. print("Error: registration failed (exit code %s)." % exit_code) # if we are quiet then the output if likely to already be nearly # empty, so always print it. print(output, end=' ') finally: for f in (outfile, batfile): try: os.unlink(f) except os.error as exc: print("Failed to remove tempfile '%s': %s" % (f, exc)) def UseCommandLine(*classes, **flags): unregisterInfo = '--unregister_info' in sys.argv unregister = '--unregister' in sys.argv flags['quiet'] = flags.get('quiet',0) or '--quiet' in sys.argv flags['debug'] = flags.get('debug',0) or '--debug' in sys.argv flags['unattended'] = flags.get('unattended',0) or '--unattended' in sys.argv if unregisterInfo: return UnregisterInfoClasses(*classes, **flags) try: if unregister: UnregisterClasses(*classes, **flags) else: RegisterClasses(*classes, **flags) except win32api.error as exc: # If we are on xp+ and have "access denied", retry using # ShellExecuteEx with 'runas' verb to force elevation (vista) and/or # admin login dialog (vista/xp) if flags['unattended'] or exc.winerror != winerror.ERROR_ACCESS_DENIED \ or sys.getwindowsversion()[0] < 5: raise ReExecuteElevated(flags) def RegisterPyComCategory(): """ Register the Python COM Server component category. """ regCat = _cat_registrar() regCat.RegisterCategories( [ (CATID_PythonCOMServer, 0x0409, "Python COM Server") ] ) if not pythoncom.frozen: try: win32api.RegQueryValue(win32con.HKEY_CLASSES_ROOT, 'Component Categories\\%s' % CATID_PythonCOMServer) except win32api.error: try: RegisterPyComCategory() except pythoncom.error: # Error with the COM category manager - oh well. pass PK ѳP>6z z win32com/server/connect.pyUT l_Zx`ux """Utilities for Server Side connections. A collection of helpers for server side connection points. """ import pythoncom from .exception import Exception import winerror from win32com import olectl import win32com.server.util # Methods implemented by the interfaces. IConnectionPointContainer_methods = ["EnumConnectionPoints","FindConnectionPoint"] IConnectionPoint_methods = ["EnumConnections","Unadvise","Advise","GetConnectionPointContainer","GetConnectionInterface"] class ConnectableServer: _public_methods_ = IConnectionPointContainer_methods + IConnectionPoint_methods _com_interfaces_ = [pythoncom.IID_IConnectionPoint, pythoncom.IID_IConnectionPointContainer] # Clients must set _connect_interfaces_ = [...] def __init__(self): self.cookieNo = 0 self.connections = {} # IConnectionPoint interfaces def EnumConnections(self): raise Exception(winerror.E_NOTIMPL) def GetConnectionInterface(self): raise Exception(winerror.E_NOTIMPL) def GetConnectionPointContainer(self): return win32com.server.util.wrap(self) def Advise(self, pUnk): # Creates a connection to the client. Simply allocate a new cookie, # find the clients interface, and store it in a dictionary. try: interface = pUnk.QueryInterface(self._connect_interfaces_[0],pythoncom.IID_IDispatch) except pythoncom.com_error: raise Exception(scode=olectl.CONNECT_E_NOCONNECTION) self.cookieNo = self.cookieNo + 1 self.connections[self.cookieNo] = interface return self.cookieNo def Unadvise(self, cookie): # Destroy a connection - simply delete interface from the map. try: del self.connections[cookie] except KeyError: raise Exception(scode=winerror.E_UNEXPECTED) # IConnectionPointContainer interfaces def EnumConnectionPoints(self): raise Exception(winerror.E_NOTIMPL) def FindConnectionPoint(self, iid): # Find a connection we support. Only support the single event interface. if iid in self._connect_interfaces_: return win32com.server.util.wrap(self) def _BroadcastNotify(self, broadcaster, extraArgs): # Broadcasts a notification to all connections. # Ignores clients that fail. for interface in self.connections.values(): try: broadcaster(*(interface,)+extraArgs) except pythoncom.com_error as details: self._OnNotifyFail(interface, details) def _OnNotifyFail(self, interface, details): print("Ignoring COM error to connection - %s" % (repr(details))) PK ѳP+ݐwin32com/server/util.pyUT l_Zx`ux """ General Server side utilities """ import pythoncom from . import policy import winerror from .exception import COMException def wrap(ob, iid=None, usePolicy=None, useDispatcher=None): """Wraps an object in a PyGDispatch gateway. Returns a client side PyI{iid} interface. Interface and gateway support must exist for the specified IID, as the QueryInterface() method is used. """ if usePolicy is None: usePolicy = policy.DefaultPolicy if useDispatcher == 1: # True will also work here. import win32com.server.dispatcher useDispatcher = win32com.server.dispatcher.DefaultDebugDispatcher if useDispatcher is None or useDispatcher==0: ob = usePolicy(ob) else: ob = useDispatcher(usePolicy, ob) # get a PyIDispatch, which interfaces to PyGDispatch ob = pythoncom.WrapObject(ob) if iid is not None: ob = ob.QueryInterface(iid) # Ask the PyIDispatch if it supports it? return ob def unwrap(ob): """Unwraps an interface. Given an interface which wraps up a Gateway, return the object behind the gateway. """ ob = pythoncom.UnwrapObject(ob) # see if the object is a dispatcher if hasattr(ob, 'policy'): ob = ob.policy return ob._obj_ class ListEnumerator: """A class to expose a Python sequence as an EnumVARIANT. Create an instance of this class passing a sequence (list, tuple, or any sequence protocol supporting object) and it will automatically support the EnumVARIANT interface for the object. See also the @NewEnum@ function, which can be used to turn the instance into an actual COM server. """ _public_methods_ = [ 'Next', 'Skip', 'Reset', 'Clone' ] def __init__(self, data, index=0, iid = pythoncom.IID_IEnumVARIANT): self._list_ = data self.index = index self._iid_ = iid def _query_interface_(self, iid): if iid == self._iid_: return 1 def Next(self, count): result = self._list_[self.index:self.index+count] self.Skip(count) return result def Skip(self, count): end = self.index + count if end > len(self._list_): end = len(self._list_) self.index = end def Reset(self): self.index = 0 def Clone(self): return self._wrap(self.__class__(self._list_, self.index)) def _wrap(self, ob): return wrap(ob) class ListEnumeratorGateway(ListEnumerator): """A List Enumerator which wraps a sequence's items in gateways. If a sequence contains items (objects) that have not been wrapped for return through the COM layers, then a ListEnumeratorGateway can be used to wrap those items before returning them (from the Next() method). See also the @ListEnumerator@ class and the @NewEnum@ function. """ def Next(self, count): result = self._list_[self.index:self.index+count] self.Skip(count) return map(self._wrap, result) def NewEnum(seq, cls=ListEnumerator, iid=pythoncom.IID_IEnumVARIANT, usePolicy=None, useDispatcher=None): """Creates a new enumerator COM server. This function creates a new COM Server that implements the IID_IEnumVARIANT interface. A COM server that can enumerate the passed in sequence will be created, then wrapped up for return through the COM framework. Optionally, a custom COM server for enumeration can be passed (the default is @ListEnumerator@), and the specific IEnum interface can be specified. """ ob = cls(seq, iid=iid) return wrap(ob, iid, usePolicy=usePolicy, useDispatcher=useDispatcher) class Collection: "A collection of VARIANT values." _public_methods_ = [ 'Item', 'Count', 'Add', 'Remove', 'Insert' ] def __init__(self, data=None, readOnly=0): if data is None: data = [ ] self.data = data # disable Add/Remove if read-only. note that we adjust _public_methods_ # on this instance only. if readOnly: self._public_methods_ = [ 'Item', 'Count' ] # This method is also used as the "default" method. # Thus "print ob" will cause this to be called with zero # params. Handle this slightly more elegantly here. # Ideally the policy should handle this. def Item(self, *args): if len(args) != 1: raise COMException(scode=winerror.DISP_E_BADPARAMCOUNT) try: return self.data[args[0]] except IndexError as desc: raise COMException(scode=winerror.DISP_E_BADINDEX, desc=str(desc)) _value_ = Item def Count(self): return len(self.data) def Add(self, value): self.data.append(value) def Remove(self, index): try: del self.data[index] except IndexError as desc: raise COMException(scode=winerror.DISP_E_BADINDEX, desc=str(desc)) def Insert(self, index, value): try: index = int(index) except (ValueError, TypeError): raise COMException(scode=winerror.DISP_E_TYPEMISMATCH) self.data.insert(index, value) def _NewEnum(self): return NewEnum(self.data) def NewCollection(seq, cls=Collection): """Creates a new COM collection object This function creates a new COM Server that implements the common collection protocols, including enumeration. (_NewEnum) A COM server that can enumerate the passed in sequence will be created, then wrapped up for return through the COM framework. Optionally, a custom COM server for enumeration can be passed (the default is @Collection@). """ return pythoncom.WrapObject(policy.DefaultPolicy(cls(seq)), pythoncom.IID_IDispatch, pythoncom.IID_IDispatch) class FileStream: _public_methods_ = [ 'Read', 'Write', 'Clone', 'CopyTo', 'Seek' ] _com_interfaces_ = [ pythoncom.IID_IStream ] def __init__(self, file): self.file = file def Read(self, amount): return self.file.read(amount) def Write(self, data): self.file.write(data) return len(data) def Clone(self): return self._wrap(self.__class__(self.file)) def CopyTo(self, dest, cb): data=self.file.read(cb) cbread=len(data) dest.Write(data) ## ??? Write does not currently return the length ??? return cbread, cbread def Seek(self, offset, origin): # how convient that the 'origin' values are the same as the CRT :) self.file.seek(offset, origin) return self.file.tell() def _wrap(self, ob): return wrap(ob) PK ѳPOdwwwin32com/server/policy.pyUT l_Zx`ux """Policies Note that Dispatchers are now implemented in "dispatcher.py", but are still documented here. Policies A policy is an object which manages the interaction between a public Python object, and COM . In simple terms, the policy object is the object which is actually called by COM, and it invokes the requested method, fetches/sets the requested property, etc. See the @win32com.server.policy.CreateInstance@ method for a description of how a policy is specified or created. Exactly how a policy determines which underlying object method/property is obtained is up to the policy. A few policies are provided, but you can build your own. See each policy class for a description of how it implements its policy. There is a policy that allows the object to specify exactly which methods and properties will be exposed. There is also a policy that will dynamically expose all Python methods and properties - even those added after the object has been instantiated. Dispatchers A Dispatcher is a level in front of a Policy. A dispatcher is the thing which actually receives the COM calls, and passes them to the policy object (which in turn somehow does something with the wrapped object). It is important to note that a policy does not need to have a dispatcher. A dispatcher has the same interface as a policy, and simply steps in its place, delegating to the real policy. The primary use for a Dispatcher is to support debugging when necessary, but without imposing overheads when not (ie, by not using a dispatcher at all). There are a few dispatchers provided - "tracing" dispatchers which simply prints calls and args (including a variation which uses win32api.OutputDebugString), and a "debugger" dispatcher, which can invoke the debugger when necessary. Error Handling It is important to realise that the caller of these interfaces may not be Python. Therefore, general Python exceptions and tracebacks aren't much use. In general, there is an Exception class that should be raised, to allow the framework to extract rich COM type error information. The general rule is that the **only** exception returned from Python COM Server code should be an Exception instance. Any other Python exception should be considered an implementation bug in the server (if not, it should be handled, and an appropriate Exception instance raised). Any other exception is considered "unexpected", and a dispatcher may take special action (see Dispatchers above) Occasionally, the implementation will raise the policy.error error. This usually means there is a problem in the implementation that the Python programmer should fix. For example, if policy is asked to wrap an object which it can not support (because, eg, it does not provide _public_methods_ or _dynamic_) then policy.error will be raised, indicating it is a Python programmers problem, rather than a COM error. """ __author__ = "Greg Stein and Mark Hammond" import win32api import winerror import sys import types import pywintypes import win32con, pythoncom #Import a few important constants to speed lookups. from pythoncom import \ DISPATCH_METHOD, DISPATCH_PROPERTYGET, DISPATCH_PROPERTYPUT, DISPATCH_PROPERTYPUTREF, \ DISPID_UNKNOWN, DISPID_VALUE, DISPID_PROPERTYPUT, DISPID_NEWENUM, \ DISPID_EVALUATE, DISPID_CONSTRUCTOR, DISPID_DESTRUCTOR, DISPID_COLLECT,DISPID_STARTENUM S_OK = 0 # Few more globals to speed things. IDispatchType = pythoncom.TypeIIDs[pythoncom.IID_IDispatch] IUnknownType = pythoncom.TypeIIDs[pythoncom.IID_IUnknown] from .exception import COMException error = __name__ + " error" regSpec = 'CLSID\\%s\\PythonCOM' regPolicy = 'CLSID\\%s\\PythonCOMPolicy' regDispatcher = 'CLSID\\%s\\PythonCOMDispatcher' regAddnPath = 'CLSID\\%s\\PythonCOMPath' def CreateInstance(clsid, reqIID): """Create a new instance of the specified IID The COM framework **always** calls this function to create a new instance for the specified CLSID. This function looks up the registry for the name of a policy, creates the policy, and asks the policy to create the specified object by calling the _CreateInstance_ method. Exactly how the policy creates the instance is up to the policy. See the specific policy documentation for more details. """ # First see is sys.path should have something on it. try: addnPaths = win32api.RegQueryValue(win32con.HKEY_CLASSES_ROOT, regAddnPath % clsid).split(';') for newPath in addnPaths: if newPath not in sys.path: sys.path.insert(0, newPath) except win32api.error: pass try: policy = win32api.RegQueryValue(win32con.HKEY_CLASSES_ROOT, regPolicy % clsid) policy = resolve_func(policy) except win32api.error: policy = DefaultPolicy try: dispatcher = win32api.RegQueryValue(win32con.HKEY_CLASSES_ROOT, regDispatcher % clsid) if dispatcher: dispatcher = resolve_func(dispatcher) except win32api.error: dispatcher = None if dispatcher: retObj = dispatcher(policy, None) else: retObj = policy(None) return retObj._CreateInstance_(clsid, reqIID) class BasicWrapPolicy: """The base class of policies. Normally not used directly (use a child class, instead) This policy assumes we are wrapping another object as the COM server. This supports the delegation of the core COM entry points to either the wrapped object, or to a child class. This policy supports the following special attributes on the wrapped object _query_interface_ -- A handler which can respond to the COM 'QueryInterface' call. _com_interfaces_ -- An optional list of IIDs which the interface will assume are valid for the object. _invoke_ -- A handler which can respond to the COM 'Invoke' call. If this attribute is not provided, then the default policy implementation is used. If this attribute does exist, it is responsible for providing all required functionality - ie, the policy _invoke_ method is not invoked at all (and nor are you able to call it!) _getidsofnames_ -- A handler which can respond to the COM 'GetIDsOfNames' call. If this attribute is not provided, then the default policy implementation is used. If this attribute does exist, it is responsible for providing all required functionality - ie, the policy _getidsofnames_ method is not invoked at all (and nor are you able to call it!) IDispatchEx functionality: _invokeex_ -- Very similar to _invoke_, except slightly different arguments are used. And the result is just the _real_ result (rather than the (hresult, argErr, realResult) tuple that _invoke_ uses. This is the new, prefered handler (the default _invoke_ handler simply called _invokeex_) _getdispid_ -- Very similar to _getidsofnames_, except slightly different arguments are used, and only 1 property at a time can be fetched (which is all we support in getidsofnames anyway!) This is the new, prefered handler (the default _invoke_ handler simply called _invokeex_) _getnextdispid_- uses self._name_to_dispid_ to enumerate the DISPIDs """ def __init__(self, object): """Initialise the policy object Params: object -- The object to wrap. May be None *iff* @BasicWrapPolicy._CreateInstance_@ will be called immediately after this to setup a brand new object """ if object is not None: self._wrap_(object) def _CreateInstance_(self, clsid, reqIID): """Creates a new instance of a **wrapped** object This method looks up a "@win32com.server.policy.regSpec@" % clsid entry in the registry (using @DefaultPolicy@) """ try: classSpec = win32api.RegQueryValue(win32con.HKEY_CLASSES_ROOT, regSpec % clsid) except win32api.error: raise error("The object is not correctly registered - %s key can not be read" % (regSpec % clsid)) myob = call_func(classSpec) self._wrap_(myob) try: return pythoncom.WrapObject(self, reqIID) except pythoncom.com_error as xxx_todo_changeme: (hr, desc, exc, arg) = xxx_todo_changeme.args from win32com.util import IIDToInterfaceName desc = "The object '%r' was created, but does not support the " \ "interface '%s'(%s): %s" \ % (myob, IIDToInterfaceName(reqIID), reqIID, desc) raise pythoncom.com_error(hr, desc, exc, arg) def _wrap_(self, object): """Wraps up the specified object. This function keeps a reference to the passed object, and may interogate it to determine how to respond to COM requests, etc. """ # We "clobber" certain of our own methods with ones # provided by the wrapped object, iff they exist. self._name_to_dispid_ = { } ob = self._obj_ = object if hasattr(ob, '_query_interface_'): self._query_interface_ = ob._query_interface_ if hasattr(ob, '_invoke_'): self._invoke_ = ob._invoke_ if hasattr(ob, '_invokeex_'): self._invokeex_ = ob._invokeex_ if hasattr(ob, '_getidsofnames_'): self._getidsofnames_ = ob._getidsofnames_ if hasattr(ob, '_getdispid_'): self._getdispid_ = ob._getdispid_ # Allow for override of certain special attributes. if hasattr(ob, '_com_interfaces_'): self._com_interfaces_ = [] # Allow interfaces to be specified by name. for i in ob._com_interfaces_: if type(i) != pywintypes.IIDType: # Prolly a string! if i[0] != "{": i = pythoncom.InterfaceNames[i] else: i = pythoncom.MakeIID(i) self._com_interfaces_.append(i) else: self._com_interfaces_ = [ ] # "QueryInterface" handling. def _QueryInterface_(self, iid): """The main COM entry-point for QueryInterface. This checks the _com_interfaces_ attribute and if the interface is not specified there, it calls the derived helper _query_interface_ """ if iid in self._com_interfaces_: return 1 return self._query_interface_(iid) def _query_interface_(self, iid): """Called if the object does not provide the requested interface in _com_interfaces_, and does not provide a _query_interface_ handler. Returns a result to the COM framework indicating the interface is not supported. """ return 0 # "Invoke" handling. def _Invoke_(self, dispid, lcid, wFlags, args): """The main COM entry-point for Invoke. This calls the _invoke_ helper. """ #Translate a possible string dispid to real dispid. if type(dispid) == type(""): try: dispid = self._name_to_dispid_[dispid.lower()] except KeyError: raise COMException(scode = winerror.DISP_E_MEMBERNOTFOUND, desc="Member not found") return self._invoke_(dispid, lcid, wFlags, args) def _invoke_(self, dispid, lcid, wFlags, args): # Delegates to the _invokeex_ implementation. This allows # a custom policy to define _invokeex_, and automatically get _invoke_ too. return S_OK, -1, self._invokeex_(dispid, lcid, wFlags, args, None, None) # "GetIDsOfNames" handling. def _GetIDsOfNames_(self, names, lcid): """The main COM entry-point for GetIDsOfNames. This checks the validity of the arguments, and calls the _getidsofnames_ helper. """ if len(names) > 1: raise COMException(scode = winerror.DISP_E_INVALID, desc="Cannot support member argument names") return self._getidsofnames_(names, lcid) def _getidsofnames_(self, names, lcid): ### note: lcid is being ignored... return (self._getdispid_(names[0], 0), ) # IDispatchEx support for policies. Most of the IDispathEx functionality # by default will raise E_NOTIMPL. Thus it is not necessary for derived # policies to explicitely implement all this functionality just to not implement it! def _GetDispID_(self, name, fdex): return self._getdispid_(name, fdex) def _getdispid_(self, name, fdex): try: ### TODO - look at the fdex flags!!! return self._name_to_dispid_[name.lower()] except KeyError: raise COMException(scode = winerror.DISP_E_UNKNOWNNAME) # "InvokeEx" handling. def _InvokeEx_(self, dispid, lcid, wFlags, args, kwargs, serviceProvider): """The main COM entry-point for InvokeEx. This calls the _invokeex_ helper. """ #Translate a possible string dispid to real dispid. if type(dispid) == type(""): try: dispid = self._name_to_dispid_[dispid.lower()] except KeyError: raise COMException(scode = winerror.DISP_E_MEMBERNOTFOUND, desc="Member not found") return self._invokeex_(dispid, lcid, wFlags, args, kwargs, serviceProvider) def _invokeex_(self, dispid, lcid, wFlags, args, kwargs, serviceProvider): """A stub for _invokeex_ - should never be called. Simply raises an exception. """ # Base classes should override this method (and not call the base) raise error("This class does not provide _invokeex_ semantics") def _DeleteMemberByName_(self, name, fdex): return self._deletememberbyname_(name, fdex) def _deletememberbyname_(self, name, fdex): raise COMException(scode = winerror.E_NOTIMPL) def _DeleteMemberByDispID_(self, id): return self._deletememberbydispid(id) def _deletememberbydispid_(self, id): raise COMException(scode = winerror.E_NOTIMPL) def _GetMemberProperties_(self, id, fdex): return self._getmemberproperties_(id, fdex) def _getmemberproperties_(self, id, fdex): raise COMException(scode = winerror.E_NOTIMPL) def _GetMemberName_(self, dispid): return self._getmembername_(dispid) def _getmembername_(self, dispid): raise COMException(scode = winerror.E_NOTIMPL) def _GetNextDispID_(self, fdex, dispid): return self._getnextdispid_(fdex, dispid) def _getnextdispid_(self, fdex, dispid): ids = list(self._name_to_dispid_.values()) ids.sort() if DISPID_STARTENUM in ids: ids.remove(DISPID_STARTENUM) if dispid==DISPID_STARTENUM: return ids[0] else: try: return ids[ids.index(dispid)+1] except ValueError: # dispid not in list? raise COMException(scode = winerror.E_UNEXPECTED) except IndexError: # No more items raise COMException(scode = winerror.S_FALSE) def _GetNameSpaceParent_(self): return self._getnamespaceparent() def _getnamespaceparent_(self): raise COMException(scode = winerror.E_NOTIMPL) class MappedWrapPolicy(BasicWrapPolicy): """Wraps an object using maps to do its magic This policy wraps up a Python object, using a number of maps which translate from a Dispatch ID and flags, into an object to call/getattr, etc. It is the responsibility of derived classes to determine exactly how the maps are filled (ie, the derived classes determine the map filling policy. This policy supports the following special attributes on the wrapped object _dispid_to_func_/_dispid_to_get_/_dispid_to_put_ -- These are dictionaries (keyed by integer dispid, values are string attribute names) which the COM implementation uses when it is processing COM requests. Note that the implementation uses this dictionary for its own purposes - not a copy - which means the contents of these dictionaries will change as the object is used. """ def _wrap_(self, object): BasicWrapPolicy._wrap_(self, object) ob = self._obj_ if hasattr(ob, '_dispid_to_func_'): self._dispid_to_func_ = ob._dispid_to_func_ else: self._dispid_to_func_ = { } if hasattr(ob, '_dispid_to_get_'): self._dispid_to_get_ = ob._dispid_to_get_ else: self._dispid_to_get_ = { } if hasattr(ob, '_dispid_to_put_'): self._dispid_to_put_ = ob._dispid_to_put_ else: self._dispid_to_put_ = { } def _getmembername_(self, dispid): if dispid in self._dispid_to_func_: return self._dispid_to_func_[dispid] elif dispid in self._dispid_to_get_: return self._dispid_to_get_[dispid] elif dispid in self._dispid_to_put_: return self._dispid_to_put_[dispid] else: raise COMException(scode = winerror.DISP_E_MEMBERNOTFOUND) class DesignatedWrapPolicy(MappedWrapPolicy): """A policy which uses a mapping to link functions and dispid A MappedWrappedPolicy which allows the wrapped object to specify, via certain special named attributes, exactly which methods and properties are exposed. All a wrapped object need do is provide the special attributes, and the policy will handle everything else. Attributes: _public_methods_ -- Required, unless a typelib GUID is given -- A list of strings, which must be the names of methods the object provides. These methods will be exposed and callable from other COM hosts. _public_attrs_ A list of strings, which must be the names of attributes on the object. These attributes will be exposed and readable and possibly writeable from other COM hosts. _readonly_attrs_ -- A list of strings, which must also appear in _public_attrs. These attributes will be readable, but not writable, by other COM hosts. _value_ -- A method that will be called if the COM host requests the "default" method (ie, calls Invoke with dispid==DISPID_VALUE) _NewEnum -- A method that will be called if the COM host requests an enumerator on the object (ie, calls Invoke with dispid==DISPID_NEWENUM.) It is the responsibility of the method to ensure the returned object conforms to the required Enum interface. _typelib_guid_ -- The GUID of the typelibrary with interface definitions we use. _typelib_version_ -- A tuple of (major, minor) with a default of 1,1 _typelib_lcid_ -- The LCID of the typelib, default = LOCALE_USER_DEFAULT _Evaluate -- Dunno what this means, except the host has called Invoke with dispid==DISPID_EVALUATE! See the COM documentation for details. """ def _wrap_(self, ob): # If we have nominated universal interfaces to support, load them now tlb_guid = getattr(ob, '_typelib_guid_', None) if tlb_guid is not None: tlb_major, tlb_minor = getattr(ob, '_typelib_version_', (1,0)) tlb_lcid = getattr(ob, '_typelib_lcid_', 0) from win32com import universal # XXX - what if the user wants to implement interfaces from multiple # typelibs? # Filter out all 'normal' IIDs (ie, IID objects and strings starting with { interfaces = [i for i in getattr(ob, '_com_interfaces_', []) if type(i) != pywintypes.IIDType and not i.startswith("{")] universal_data = universal.RegisterInterfaces(tlb_guid, tlb_lcid, tlb_major, tlb_minor, interfaces) else: universal_data = [] MappedWrapPolicy._wrap_(self, ob) if not hasattr(ob, '_public_methods_') and not hasattr(ob, "_typelib_guid_"): raise error("Object does not support DesignatedWrapPolicy, as it does not have either _public_methods_ or _typelib_guid_ attributes.") # Copy existing _dispid_to_func_ entries to _name_to_dispid_ for dispid, name in self._dispid_to_func_.items(): self._name_to_dispid_[name.lower()]=dispid for dispid, name in self._dispid_to_get_.items(): self._name_to_dispid_[name.lower()]=dispid for dispid, name in self._dispid_to_put_.items(): self._name_to_dispid_[name.lower()]=dispid # Patch up the universal stuff. for dispid, invkind, name in universal_data: self._name_to_dispid_[name.lower()]=dispid if invkind == DISPATCH_METHOD: self._dispid_to_func_[dispid] = name elif invkind in (DISPATCH_PROPERTYPUT, DISPATCH_PROPERTYPUTREF): self._dispid_to_put_[dispid] = name elif invkind == DISPATCH_PROPERTYGET: self._dispid_to_get_[dispid] = name else: raise ValueError("unexpected invkind: %d (%s)" % (invkind,name)) # look for reserved methods if hasattr(ob, '_value_'): self._dispid_to_get_[DISPID_VALUE] = '_value_' self._dispid_to_put_[DISPID_PROPERTYPUT] = '_value_' if hasattr(ob, '_NewEnum'): self._name_to_dispid_['_newenum'] = DISPID_NEWENUM self._dispid_to_func_[DISPID_NEWENUM] = '_NewEnum' if hasattr(ob, '_Evaluate'): self._name_to_dispid_['_evaluate'] = DISPID_EVALUATE self._dispid_to_func_[DISPID_EVALUATE] = '_Evaluate' next_dispid = self._allocnextdispid(999) # note: funcs have precedence over attrs (install attrs first) if hasattr(ob, '_public_attrs_'): if hasattr(ob, '_readonly_attrs_'): readonly = ob._readonly_attrs_ else: readonly = [ ] for name in ob._public_attrs_: dispid = self._name_to_dispid_.get(name.lower()) if dispid is None: dispid = next_dispid self._name_to_dispid_[name.lower()] = dispid next_dispid = self._allocnextdispid(next_dispid) self._dispid_to_get_[dispid] = name if name not in readonly: self._dispid_to_put_[dispid] = name for name in getattr(ob, "_public_methods_", []): dispid = self._name_to_dispid_.get(name.lower()) if dispid is None: dispid = next_dispid self._name_to_dispid_[name.lower()] = dispid next_dispid = self._allocnextdispid(next_dispid) self._dispid_to_func_[dispid] = name self._typeinfos_ = None # load these on demand. def _build_typeinfos_(self): # Can only ever be one for now. tlb_guid = getattr(self._obj_, '_typelib_guid_', None) if tlb_guid is None: return [] tlb_major, tlb_minor = getattr(self._obj_, '_typelib_version_', (1,0)) tlb = pythoncom.LoadRegTypeLib(tlb_guid, tlb_major, tlb_minor) typecomp = tlb.GetTypeComp() # Not 100% sure what semantics we should use for the default interface. # Look for the first name in _com_interfaces_ that exists in the typelib. for iname in self._obj_._com_interfaces_: try: type_info, type_comp = typecomp.BindType(iname) if type_info is not None: return [type_info] except pythoncom.com_error: pass return [] def _GetTypeInfoCount_(self): if self._typeinfos_ is None: self._typeinfos_ = self._build_typeinfos_() return len(self._typeinfos_) def _GetTypeInfo_(self, index, lcid): if self._typeinfos_ is None: self._typeinfos_ = self._build_typeinfos_() if index < 0 or index >= len(self._typeinfos_): raise COMException(scode=winerror.DISP_E_BADINDEX) return 0, self._typeinfos_[index] def _allocnextdispid(self, last_dispid): while 1: last_dispid = last_dispid + 1 if last_dispid not in self._dispid_to_func_ and \ last_dispid not in self._dispid_to_get_ and \ last_dispid not in self._dispid_to_put_: return last_dispid def _invokeex_(self, dispid, lcid, wFlags, args, kwArgs, serviceProvider): ### note: lcid is being ignored... if wFlags & DISPATCH_METHOD: try: funcname = self._dispid_to_func_[dispid] except KeyError: if not wFlags & DISPATCH_PROPERTYGET: raise COMException(scode=winerror.DISP_E_MEMBERNOTFOUND) # not found else: try: func = getattr(self._obj_, funcname) except AttributeError: # May have a dispid, but that doesnt mean we have the function! raise COMException(scode=winerror.DISP_E_MEMBERNOTFOUND) # Should check callable here try: return func(*args) except TypeError as v: # Particularly nasty is "wrong number of args" type error # This helps you see what 'func' and 'args' actually is if str(v).find("arguments")>=0: print("** TypeError %s calling function %r(%r)" % (v, func, args)) raise if wFlags & DISPATCH_PROPERTYGET: try: name = self._dispid_to_get_[dispid] except KeyError: raise COMException(scode=winerror.DISP_E_MEMBERNOTFOUND) # not found retob = getattr(self._obj_, name) if type(retob)==types.MethodType: # a method as a property - call it. retob = retob(*args) return retob if wFlags & (DISPATCH_PROPERTYPUT | DISPATCH_PROPERTYPUTREF): ### correct? try: name = self._dispid_to_put_[dispid] except KeyError: raise COMException(scode=winerror.DISP_E_MEMBERNOTFOUND) # read-only # If we have a method of that name (ie, a property get function), and # we have an equiv. property set function, use that instead. if type(getattr(self._obj_, name, None)) == types.MethodType and \ type(getattr(self._obj_, "Set" + name, None)) == types.MethodType: fn = getattr(self._obj_, "Set" + name) fn( *args ) else: # just set the attribute setattr(self._obj_, name, args[0]) return raise COMException(scode=winerror.E_INVALIDARG, desc="invalid wFlags") class EventHandlerPolicy(DesignatedWrapPolicy): """The default policy used by event handlers in the win32com.client package. In addition to the base policy, this provides argument conversion semantics for params * dispatch params are converted to dispatch objects. * Unicode objects are converted to strings (1.5.2 and earlier) NOTE: Later, we may allow the object to override this process?? """ def _transform_args_(self, args, kwArgs, dispid, lcid, wFlags, serviceProvider): ret = [] for arg in args: arg_type = type(arg) if arg_type == IDispatchType: import win32com.client arg = win32com.client.Dispatch(arg) elif arg_type == IUnknownType: try: import win32com.client arg = win32com.client.Dispatch(arg.QueryInterface(pythoncom.IID_IDispatch)) except pythoncom.error: pass # Keep it as IUnknown ret.append(arg) return tuple(ret), kwArgs def _invokeex_(self, dispid, lcid, wFlags, args, kwArgs, serviceProvider): # transform the args. args, kwArgs = self._transform_args_(args, kwArgs, dispid, lcid, wFlags, serviceProvider) return DesignatedWrapPolicy._invokeex_( self, dispid, lcid, wFlags, args, kwArgs, serviceProvider) class DynamicPolicy(BasicWrapPolicy): """A policy which dynamically (ie, at run-time) determines public interfaces. A dynamic policy is used to dynamically dispatch methods and properties to the wrapped object. The list of objects and properties does not need to be known in advance, and methods or properties added to the wrapped object after construction are also handled. The wrapped object must provide the following attributes: _dynamic_ -- A method that will be called whenever an invoke on the object is called. The method is called with the name of the underlying method/property (ie, the mapping of dispid to/from name has been resolved.) This name property may also be '_value_' to indicate the default, and '_NewEnum' to indicate a new enumerator is requested. """ def _wrap_(self, object): BasicWrapPolicy._wrap_(self, object) if not hasattr(self._obj_, '_dynamic_'): raise error("Object does not support Dynamic COM Policy") self._next_dynamic_ = self._min_dynamic_ = 1000 self._dyn_dispid_to_name_ = {DISPID_VALUE:'_value_', DISPID_NEWENUM:'_NewEnum' } def _getdispid_(self, name, fdex): # TODO - Look at fdex flags. lname = name.lower() try: return self._name_to_dispid_[lname] except KeyError: dispid = self._next_dynamic_ = self._next_dynamic_ + 1 self._name_to_dispid_[lname] = dispid self._dyn_dispid_to_name_[dispid] = name # Keep case in this map... return dispid def _invoke_(self, dispid, lcid, wFlags, args): return S_OK, -1, self._invokeex_(dispid, lcid, wFlags, args, None, None) def _invokeex_(self, dispid, lcid, wFlags, args, kwargs, serviceProvider): ### note: lcid is being ignored... ### note: kwargs is being ignored... ### note: serviceProvider is being ignored... ### there might be assigned DISPID values to properties, too... try: name = self._dyn_dispid_to_name_[dispid] except KeyError: raise COMException(scode = winerror.DISP_E_MEMBERNOTFOUND, desc="Member not found") return self._obj_._dynamic_(name, lcid, wFlags, args) DefaultPolicy = DesignatedWrapPolicy def resolve_func(spec): """Resolve a function by name Given a function specified by 'module.function', return a callable object (ie, the function itself) """ try: idx = spec.rindex(".") mname = spec[:idx] fname = spec[idx+1:] # Dont attempt to optimize by looking in sys.modules, # as another thread may also be performing the import - this # way we take advantage of the built-in import lock. module = _import_module(mname) return getattr(module, fname) except ValueError: # No "." in name - assume in this module return globals()[spec] def call_func(spec, *args): """Call a function specified by name. Call a function specified by 'module.function' and return the result. """ return resolve_func(spec)(*args) def _import_module(mname): """Import a module just like the 'import' statement. Having this function is much nicer for importing arbitrary modules than using the 'exec' keyword. It is more efficient and obvious to the reader. """ __import__(mname) # Eeek - result of _import_ is "win32com" - not "win32com.a.b.c" # Get the full module from sys.modules return sys.modules[mname] ####### # # Temporary hacks until all old code moves. # # These have been moved to a new source file, but some code may # still reference them here. These will end up being removed. try: from .dispatcher import DispatcherTrace, DispatcherWin32trace except ImportError: # Quite likely a frozen executable that doesnt need dispatchers pass PK Y03K=11win32com/server/__init__.pyUT  YZx`ux # Empty __init__ file to designate a sub-package.PK Y03K"6Wwin32com/server/factory.pyUT  YZx`ux # Class factory utilities. import pythoncom def RegisterClassFactories(clsids, flags = None, clsctx = None): """Given a list of CLSID, create and register class factories. Returns a list, which should be passed to RevokeClassFactories """ if flags is None: flags = pythoncom.REGCLS_MULTIPLEUSE|pythoncom.REGCLS_SUSPENDED if clsctx is None: clsctx = pythoncom.CLSCTX_LOCAL_SERVER ret = [] for clsid in clsids: # Some server append '-Embedding' etc if clsid[0] not in ['-', '/']: factory = pythoncom.MakePyFactory(clsid) regId = pythoncom.CoRegisterClassObject(clsid, factory, clsctx, flags) ret.append((factory, regId)) return ret def RevokeClassFactories(infos): for factory, revokeId in infos: pythoncom.CoRevokeClassObject(revokeId) PK {Rwin32com/HTML/UT Zx`Zx`ux PK Y03Kb]]win32com/HTML/index.htmlUT  Yux  win32com

    Python and COM

    Introduction

    Python has an excellent interface to COM (also known variously as OLE2, ActiveX, etc).

    The Python COM package can be used to interface to almost any COM program (such as the MS-Office suite), write servers that can be hosted by any COM client (such as Visual Basic or C++), and has even been used to provide the core ActiveX Scripting Support.

    Documentation

    Preliminary Active Scripting and Debugging documentation is available.

    2 Quick-Start guides have been provided, which also contain other links. See the Quick Start for Client side COM and the Quick Start for Server side COM

    PK Y03K#>win32com/HTML/variant.htmlUT  Yux  win32com.client.VARIANT

    Introduction

    win32com attempts to provide a seamless COM interface and hide many COM implementation details, including the use of COM VARIANT structures. This means that in most cases, you just call a COM object using normal Python objects as parameters and get back normal Python objects as results.

    However, in some cases this doesn't work very well, particularly when using "dynamic" (aka late-bound) objects, or when using "makepy" (aka early-bound) objects which only declare a parameter is a VARIANT.

    The win32com.client.VARIANT object is designed to overcome these problems.

    Drawbacks

    The primary issue with this approach is that the programmer must learn more about COM VARIANTs than otherwise - they need to know concepts such as variants being byref, holding arrays, or that some may hold 32bit unsigned integers while others hold 64bit signed ints, and they need to understand this in the context of a single method call. In short, this is a relatively advanced feature. The good news though is that use of these objects should never cause your program to hard-crash - the worst you should expect are Python or COM exceptions being thrown.

    The VARIANT object

    The VARIANT object lives in win32com.client. The constructor takes 2 parameters - the 'variant type' and the value. The 'variant type' is an integer and can be one or more of the pythoncom.VT_* values, possibly or'd together.

    For example, to create a VARIANT object which defines a byref array of 32bit integers, you could use:

    >>> from win32com.client import VARIANT
    >>> import pythoncom
    >>> v = VARIANT(pythoncom.VT_BYREF | pythoncom.VT_ARRAY | pythoncom.VT_I4,
    ...             [1,2,3,4])
    >>> v
    win32com.client.VARIANT(24579, [1, 2, 3, 4])
    >>>
    
    This variable can then be used whereever a COM VARIANT is expected.

    Example usage with dynamic objects.

    For this example we will use the COM object used for win32com testing, PyCOMTest.PyCOMTest. This object defines a method which is defined in IDL as:
    HRESULT DoubleInOutString([in,out] BSTR *str);
    
    As you can see, it takes a single string parameter which is also used as an "out" parameter - the single parameter will be updated after the call. The implementation of the method simply "doubles" the string.

    If the object has a type-library, this method works fine with makepy generated support. For example:

    >>> from win32com.client.gencache import EnsureDispatch
    >>> ob = EnsureDispatch("PyCOMTest.PyCOMTest")
    >>> ob.DoubleInOutString("Hello")
    u'HelloHello'
    >>>
    
    However, if makepy support is not available the method does not work as expected. For the next example we will use DumbDispatch to simulate the object not having a type-library.
    >>> import win32com.client.dynamic
    >>> ob = win32com.client.dynamic.DumbDispatch("PyCOMTest.PyCOMTest")
    >>> ob.DoubleInOutString("Hello")
    >>>
    
    As you can see, no result came back from the function. This is because win32com has no type information available to use, so doesn't know the parameter should be passed as a byref parameter. To work around this, we can use the VARIANT object.

    The following example explicitly creates a VARIANT object with a variant type of a byref string and a value 'Hello'. After making the call with this VARIANT the value is updated.

    >>> import win32com.client.dynamic
    >>> from win32com.client import VARIANT
    >>> import pythoncom
    >>> ob = win32com.client.dynamic.DumbDispatch("PyCOMTest.PyCOMTest")
    >>> variant = VARIANT(pythoncom.VT_BYREF | pythoncom.VT_BSTR, "Hello")
    >>> variant.value # check the value before the call.
    'Hello'
    >>> ob.DoubleInOutString(variant)
    >>> variant.value
    u'HelloHello'
    >>>
    

    Usage with generated objects

    In most cases, objects with makepy support (ie, 'generated' objects) don't need to use the VARIANT object - the type information means win32com can guess the right thing to pass. However, in some cases the VARIANT object can still be useful. Imagine a poorly specified object with IDL like:
    HRESULT DoSomething([in] VARIANT value);
    
    But also imagine that the object has a limitation that if the parameter is an integer, it must be a 32bit unsigned value - any other integer representation will fail.

    If you just pass a regular Python integer to this function, it will generally be passed as a 32bit signed integer and given the limitation above, will fail. The VARIANT object allows you to work around the limitation - just create a variant object VARIANT(pythoncom.VT_UI4, int_value) and pass that - the function will then be called with the explicit type you specified and will succeed.

    Note that you can not use a VARIANT object to override the types described in a type library. If a makepy generated class specifies that a VT_UI2 is expected, attempting to pass a VARIANT object will fail. In this case you would need to hack around the problem. For example, imagine ob was a COM object which a method called foo and you wanted to override the type declaration for foo by passing a VARIANT. You could do something like:

    >>> import win32com.client.dynamic
    >>> from win32com.client import VARIANT
    >>> import pythoncom
    >>> dumbob = win32com.client.dynamic.DumbDispatch(ob)
    >>> variant = VARIANT(pythoncom.VT_BYREF | pythoncom.VT_BSTR, "Hello")
    >>> dumbob.foo(variant)
    
    The code above converts the makepy supported ob into a 'dumb' (ie, non-makepy supported) version of the object, which will then allow you to use VARIANT objects for the problematic methods. PK Y03K""win32com/HTML/PythonCOM.htmlUT  Yux  Untitled

    Python and COM - Blowing the others away

    Python and COM - Implementation Details

    Introduction

    This document describes the technical implementation of the COM support in Python. It is primarily concerned with the underlying C++ interface to COM, although general Python issues are touched.

    This document is targeted at people who wish to maintain/enhance the standard COM support (typically by writing extension modules). For information on using Python and COM from a Python programmers perspective, please see the documentation index.

    General COM Support.

    COM support in Python can be broken into 2 general areas - C++ support, and Python support. C++ support exists in the core PythonCOM module (plus any PythonCOM extension modules). Python support exists in the .py files that accompany the core module.

    Naming Conventions

    The naming conventions used by Python code will be:

    • The Python "New Import" (ni) module will be used, allowing packages, or nested modules.
    • The package name will be "win32com".
    • The core module name will be "pythoncom" (ie, "win32com.pythoncom")

    The rest of the naming conventions are yet to be worked out.

    Core COM support.

    This section is involved with the core C++ support in "pythoncom".

    The organisation of PythonCOM support falls into 3 discrete areas.

    COM Client Support

    This is the ability to manipulate other COM objects via their exposed interface. This includes use of IDispatch (eg using Python to start Microsoft Word, open a file, and print it.) but also all client side IUnknown derived objects fall into this category, including ITypeLib and IConnectionPoint support.

    COM Server Support

    This is ability for Python to create COM Servers, which can be manipulated by another COM client. This includes server side IDispatch (eg, Visual Basic starting a Python interpreter, and asking it to evaluate some code) but also all supported server side IUnknown derived classes.

    Python/COM type and value conversion

    This is internal code used by the above areas to managed the conversion to and from Python/COM types and values. This includes code to convert an arbitrary Python object into a COM variant, manages return types, and a few other helpers.

    COM Structures and Python Types

    OLE supports many C level structures for the COM API, which must be mapped to Python.

    VARIANT

    Variants are never exposed as such to Python programs. The internal framework always converts all variants to and from Python types. In some cases, type descriptions may be used, which force specific mappings, although in general the automatic conversion works fine.

    TYPEDESC

    A tuple, containing the elements of the C union. This union will be correctly decoded by the support code.

    ELEMDESC

    A tuple of TYPEDESC and PARAMDESC objects.

    FUNCDESC

    A funcdesc is a large and unwieldy tuple. Documentation to be supplied.

    IID/CLSID

    A native IID in Python is a special type, defined in pythoncom. Whenever a CLSID/IID is required, typically either an object, a tuple of type "iii(iiiiiiii)" or string can be used.

    Helper functions are available to convert to and from IID/CLSID and strings.

    COM Framework

    Both client and server side support have a specific framework in place to assist in supporting the widest possible set of interfaces. The framework allows external extension DLLs to be written, which extend the interfaces available to the Python user.

    This allows the core PythonCOM module to support a wide set of common interfaces, and other extensions to support anything obscure.

    Client Framework

    QueryInterface and Types

    When the only support required by Python is IDispatch, everything is simple - every object returned from QueryInterface is a PyIDispatch object. But this does not extend to other types, such as ITypeLib, IConnectionPoint etc., which are required for full COM support.

    For example, consider the following C++ psuedo-code:

    IConnectionPoint *conPt;
    someIDispatch->QueryInterface(IID_IConnectionPoint, (void **)&conPt);
    // Note the IID_ and type of the * could be anything!

    This cast, and knowledge of a specific IID_* to type must be simulated in Python.

    Python/COM will therefore maintain a map of UID's to Python type objects. Whenever QueryInterface is called, Python will lookup this map, to determine if the object type is supported. If the object is supported, then an object of that type will be returned. If the object is not supported, then a PyIUnknown object will be returned.

    Note that PyIDispatch will be supported by the core engine. Therefore:

    >>> disp=someobj.QueryInterface(win32com.IID_Dispatch)

    will return a PyIDispatch object, whereas

    >>> unk=someobj.QueryInterface(SomeUnknownIID) # returns PyIUnknown
    >>> disp=unk.QueryInterface(win32com.IID_Dispatch)
    >>> unk.Release() # Clean up now, rather than waiting for unk death.

    Is needed to convert to an IDispatch object.

    Core Support

    The core COM support module will support the IUnknown, IDispatch, ITypeInfo, ITypeLib and IConnectionPointContainer and IConnectionPoint interfaces. This implies the core COM module supports 6 different OLE client object types, mapped to the 6 IID_*'s representing the objects. (The IConnection* objects allow for Python to repsond to COM events)

    A psuedo-inheritance scheme is used. The Python types are all derived from the Python IUnknown type (PyIUnknown). Therefore all IUnknown methods are automatically available to all types, just as it should be. The PyIUnknown type manages all object reference counts and destruction.

    Extensibility

    To provide the above functionality, a Python map is provided, which maps from a GUID to a Python type object.

    The advantage of this scheme is an external extension modules can hook into the core support. For example, imagine the following code:

    >>> import myextracom # external .pyd supporting some interface.
    # myextracom.pyd will do the equivilent of

    # pythoncom.mapSupportedTypes(myextracom.IID_Extra, myextracom.ExtraType)
    >>> someobj.QueryInterface(myextracom.IID_Extra)

    Would correctly return an object defined in the extension module.

    Server Framework

    General Framework

    A server framework has been put in place which provides the following features:

    All Interfaces provide VTBL support - this means that the Servers exposed by Python are callable from C++ and other compiled languages.

    Supports full "inproc" servers. This means that no external .EXE is needed making Python COM servers available in almost all cases.

    An extensible model which allows for extension modules to provide server support for interfaces defined in that module. A map is provided which maps from a GUID to a function pointer which creates the interface.

    Python and Variant Types Conversion

    In general, Python and COM are both "type-less". COM is type-less via the VARIANT object, which supports many types, and Python is type-less due to its object model.

    There are a number of areas where Python and OLE clash.

    Parameters and conversions.

    For simple calls, there are 2 helpers available which will convert to and from PyObjects and VARIANTS. The call to convert a Python object to a VARIANT is simple in that it returns a VARIANT of the most appropriate type for the Python object - ie, the type of the Python object determines the resulting VARIANT type.

    There are also more complex conversion routines available, wrapped in a C++ helper class. Typically, these helpers are used whenever a specific variant type is known (eg, when an ITypeInfo is available for the object being used). In this case, all efforts are made to convert the Python type to the requested variant type - ie, in this situation, the VARIANT type determines how the Python object is coerced. In addition, this code supports the use of "ByRef" and pointer paramaters, providing and freeing any buffers necessary for the call.

    PK Y03KW win32com/HTML/package.htmlUT  Yux  The win32com package

    Python and COM - Blowing the others away

    The win32com package

    This document describes the win32com package in general terms.

    The COM support can be thought of as existing in 2 main portions - the C++ support code (the core PythonCOM module), and helper code, implemented in Python. The total package is known as "win32com".

    The win32com support is stand-alone. It does not require Pythonwin.

    The win32com package

    To facilitate an orderly framework, the Python "ni" module has been used, and the entire package is known as "win32com". As is normal for such packages, win32com itself does not provide any functionality. Some of the modules are described below:

    • win32com.pythoncom - core C++ support.
      This module is rarely used directly by programmers - instead the other "helper" module are used, which themselves draw on the core pythoncom services.
    • win32com.client package
      Support for COM clients used by Python. Some of the modules in this package allow for dynamic usage of COM clients, a module for generating .py files for certain COM servers, etc.
    • win32com.server package
      Support for COM servers written in Python. The modules in this package provide most of the underlying framework for magically turning Python classes into COM servers, exposing the correct public methods, registering your server in the registry, etc.
    • win32com.axscript
      ActiveX Scripting implementation for Python.
    • win32com.axdebug
      Active Debugging implementation for Python
    • win32com.mapi
      Utilities for working with MAPI and the Microsoft Exchange Server

     

    The pythoncom module

    The pythoncom module is the underlying C++ support for all COM related objects. In general, Python programmers will not use this module directly, but use win32com helper classes and functions.

    This module exposes a C++ like interface to COM - there are objects implemented in pythoncom that have methods "QueryInterface()", "Invoke()", just like the C++ API. If you are using COM in C++, you would not call a method directly, you would use pObject->Invoke( , MethodId, argArray). Similarly, if you are using pythoncom directly, you must also use the Invoke method to call an object's exposed method.

    There are some Python wrappers for hiding this raw interface, meaning you should almost never need to use the pythoncom module directly. These helpers translate a "natural" looking interface (eg, obj.SomeMethod()) into the underlying Invoke call.

    PK {Rwin32com/HTML/image/UT Zx`Zx`ux PK Y03K ܺ$win32com/HTML/image/BTN_PrevPage.gifUT  YZx`ux GIF89aGDDD!,G@0邵" 8vE~hrtmxdz-W^ TZ-lH rCE!\USm^\qhv~svubaerY)l^VzGi.og)1F[f(I 8?C`0 ;PK Y03K>r$win32com/HTML/image/BTN_HomePage.gifUT  YZx`ux GIF89aJDDD!,J@0 fڦuB^tmx|jG˜:dBf &YXVUir>A"TXNiRk떸~Q[xYtb{C"kV:ofJm]lk:Bs#]+nq>P ;PK Y03K $win32com/HTML/image/BTN_NextPage.gifUT  YZx`ux GIF89aGDDD!,G@0邽vwYaBۮtmxz;vR\!pJIWMeMjVw/YY]KO~sttc>abX:i%_p[!hnhlolgd%Z,PrT0x8 ;PK Y03Km7 win32com/HTML/image/www_icon.gifUT  YZx`ux GIF89a((!,((0I8ͻ_@(#he/0!5l4| Cq5ҳt>)RR -74NM_tXbyyb 4xt~*h owf  nqne~dB}iY7w}9*GQVXY QR/LI+׼5]9-% ;PK Y03KYQQ%win32com/HTML/image/pycom_blowing.gifUT  YZx`ux GIF89apqTTTrrrͯώHHvv𐐩OnjFA0- heiD1,ZNiXS1'E"K0/.qNfM'H0 FƤFq&ӲIHJslKTN,įkMGplh-65ddS̰mʎm+""lmmO0HIQpO4DBI/NjqpR"5 Kq/H#E +pgRG-+ -/xsE3skmKEed1/i0m2V&/6E+E.MjQ#m-4Q1A)Kj3fNY"'%K..&AFEߢ¿ub]Lmo4MLLK`^effcssTood7LLUAppmCN#JJ5$ttMttP-''qqL4op&j68-n..P`hiPpnŖ5bTrτnХ58<.Ms0jFMbgkPV邂PP磻rr㴴 ڶO2hȳʎ[ЌjdgOiaoLP) !,pq@Y H*\ȰÇ cy81&^ q!p )DrVT䪥PbɌ͂sR%M@)zbHT,h\ʴӧPJJի%ʵW$a q!ṼPpcD.10l4iEv ]$>p$Y:0LϿyö_8<| }eؑbȑ#.NHFeKlU_n+*Ij*7.֡ZkǪkɿ!j *T>:u2z @7xM8 6Dx .HL2UN$g1 9眃:N6 DCq 8pOAg-aTw`eV S[JP$u}->hX h\pqHRHVP*ҫ a%% 4 m1鄜N;$C-!wSRqM oe-i\KP\ :do6io )r\x5b8WK6D1D4H,Po 8l#7t-O $?p"tW 30Z E2xq I%:C5w/GetWo]2#hƱcIJ-O'pw!p;Sg{ufU^A " ~#a+. ?Yw3qI!au3AXL<'& pتV2p(>uNz ya/HB=(ЮMb{d]2!sIS240`+]r`'! z:.A `TCP/ K8<=UQxB]0u TV0 HW@;KA )) QaA]Ѕ.=N( (lT*5JV`fc] s1pHH(Xm8J&щb~0RG=J=yxhr0f6P pǸQjA0 b3B66Cya`Da"%BIa^?pW.z^4UІ98ig@C.jQ_L`gvLAGS5!`CDvT,  X@c\V [ $0 HNNBY{^3 R dɏ@yLd¬Jɐ W]8"!|q XAXUU-,jĀ$BWa)A?8tUBp*ϊFNjP8` / mp1d?M#iJjKZ !Z^:-WU"Z1} 8E*RG@B (r1T& #4QMlB VmVbp O@E.':\&-;84&]BGK! lb+Q2?̳H, 1 r@ P(0L@OA/vX[ R(-W$ુd|9w;=b6>E.r^>; Z4~'al@wu/7 @ƑD 8 &WPAD"z FHrE n)rB"q/"m%$_48G9ArFe6AIxeѕl~YrpI~Z$9S 9VzN U,y͊G&Oy0 r/kh9$aDPsȀr%֊W,}Xw0?y :\v<.UTeԤP@C#ƒ5L2LgfԜAV1b:é'itApu.&cD `A R KrTs+raH=||T26 bNd`EoߠP FF 2  k'$B8E<A,""B`ye *6`qG)/G1)|C~LCB% x}Y2$=zBr3`!X?3u{3(we(v(4ŧ13350~{-G3 @P HIH֔$o (^BR&CB:@C\_ bNᰁA2@ 44(4%LBwHXx1u P 4. CaFq긎؎8H_pb Џ )@QА0 wE6f."QlT"9$yxG5lPeI-pb(  @@ ZD:5_wB"آ_Om(t'ٯ*6zqGqe (0l(L^ |Lt@ Oi3&:'MQExKjppjRȪi0sE!exS{QeQjv :` GEiT"TE5IKT 0T@"!N,_EЭ|+V|KL{'UXN e01$%'q%2t_&.ngb0DYwVF3ǵS6q1 PP )60PPp)* ŰgK=0xxd )|h0gGRڮI^$VVxS&ʹVDX^Pb!Э+R 1Sq:w :D (Z%k}ۅ'YчNr8`Pkz `pNu`&w ` Vldg;@c81 UP Wpq pB X ` `  eZJs\˚xZ\[pm C}RhPʦX`o00 j E #Yrih}ɝ'j 0G\CI/b sE m  b 6 @ |b6w A W P vrW03g(cǖ2ƾ!vrEdK]fdK'w~9( j]TVNR`䠕h |-YW0 (C\Oq{wh=T] 18doAЦ X C*X*( ` RvF5Fw ܑ}Au'2P 1GЬوF+R(11<o @"@  2k7l 2AzgL%)3!$O2|L٪د1dX7}W$9ˆ0XZ-cK cC7Y(N PL% N Lt*3  mP`k,2w֬v`C "7K'Ҷ0aa{&bR1= 8㖀~V BpUsFXbR 2ax:Nˈ*ͭ,-ך h2y$}xT};( *V wuW0HL(0@R'jܾw] ;5GI@ @ ߰ {J`@ E+Yм1Ew`00 0S'pxlPF4a +G)G6, uM6G:#cWNt7AO,[eX8i|TYC=t@Ȑ#]Cņ'azGА)LO[Fu' ~;;hPY# fŌ@dQ!xG;ȅ,.'u+X2B@aYC! HFrcdFK`7щ ~B'ϭi%K~q~)% H-#-4#+(5H-)%HbWSC QM,rG>Ibe-֖gIje, Y-# U ]$!Р53^B/,AUX9/$E/gДl590pËÕ   J@T*&hY(G?2Pxx6 nTF&ĒMōPYٝTP۱(1} RՊO|"CK-rbrJ\RE"&HgIL$'2 W5X3߳gm0>brQS73DCxqu3 o8Dcπu.k`H*~CCg@6 $(BÑ h D }Cq,"JX@ T J䐉lX+K cFj?4y ~2u~:6J/q^D,U'H@TM--Hx Q(%@:$mK?E7J[d6}y.^k, &1c!Bk_. qQ L3kP9 ;>:;cxglTt%Lj) ip񒗌mvЌAc4p(@0`cs2}(1Y@J>T,`^0g9f9 M'w öcD(J ,j,6Dڪb@ @BSvJJlt?&P< !ϒS6aI+QID+ZEff vmg.kw@C0Y5zʞ9 ,! [>*fV%C6kHa=]pYb&s0 0A[k9\šYRU2Z(/, Pб4F7N,&~fz,hj' ༕vSl2:d,ɵ $p,iDmX1L`BP&P0S+ !gmQga'[ H5A@`} [ cqM*>v>I.QTr0O]g@ E>R2 $@ %. s^&)XA aJwaIQ,"_/nF+p\ vhF AAP4J(Y0\ȃ@R;8`s?A j[Zt)q%dpt]\(G8} R!Oh"ɚ~{*; 3h+Zk!C`RBqBoOB= fڈM庄Žpx<|~xU 5Q(()[=P^@TxGT Cq7Lf 2`%}ũ!PT]A\`(]DEXȅQ sO`C0\?h(J4Ђ+:03hT>p* l"ÙHa#s"0 ,,=#| 3@FԦ.î W?9p=0Ɍ/} J sBJ /?H2`D x[V#m]ȮzȇxxzPX&,  4viY􌭅+ Ͱjڧh5d*ԙ.-"%=m(۳ R i@= :\_Ї, b&ODC@^饝I I^`ZmW( W~8@5݉}xn؆"UHGwqP}s!(\5atz2 Rh{x{x||,_F 9!ڏP2VX%4H`u Yا()#F"Q5TL7ۃY_0B@MK/:m+0cVhxKExA_u Ѱ~}@q@sbxHnxl OܭA -QD:?h PQfU"&nwȆzw?GW ᘼr^" 5Xu * I7ވʈ5<&T(1;~#ȏ jCH/ ?؄xGWcCRh7bdJi L09P@ S{ Ht8SohTʩ6Q@N\N RgӄhfUjfSw{F@T_|aad;9T櫽i^ ]:ߺz+ };@N#޾mɪ*䨊h<J0VbVT%SīIl0j&#5SmV Ynbd~N~hnn{.ވ~ܭ[ML䛴n>o§n~oVKɍ0LP0Q`o?p+[PNpV p ߆fmxiA|p0/D oX*ii.BC?Mppq߄e#нr8`k@rl la -Gg~<Ñfl0mBA?(m s:s;]Іos@u*1rf8tfkhA|d:TMDh/* ȁ$@ESq^sXqp CV5m-B7 H#7ri]e=%s&/LsNnNrЍ0KHVs  $R^!<2P h($w$kHi%s8v_j_h߄WȄM O:{Ё s< {3HWywlfM%0yFn,k`p!lt*cK _>:/wz&(,@:p Eo@k=/ L_iPHӄ*' ؁" PHyqښu@ѦDu=g5(L<m|qKn^ZR;HH 310X(@WJ*rpD9{Oj9MӰ W$p!lN|cwv?.?]_G+CC6 }:0:1Q(BzRoἽ/BoI FNx)ԉȐ"G W^,ҁ~y#w\rlWp2(>r4Ǎ9hXA$֬ZrVakj6*Ubײm6R״n֪.Hu ,H}z;WĊJRťȒԚrd2UĶH|lᵄͦkcb6JebO p 'gDoذ!v.NʢE f:-[q LhִM"wCey8R{@2 $v$ Gpf]n%["IY"IRK[m%\v%Ik %hn! "G\608Ì3pH-D!guW$YRbX!2%)v%E0Ezp`ACg 9' Y LKWN)/4/C:PC 3ADjjIzXd}`&"oi NaXvUj_^WXj*0 qD/@.&XXj[r!H" vqelk骻-̠  A .C2.#M@I(&eOysMx;pBO?QkE$ &+' ʬM:[.WJȤk*!jb_:\lV B,I DgaU8=*q Ғ}Vvp{w@nXI[aUx_e-D490hn/t 3BcV8!yN3 >8 9hg? QE` |U}a_ -ЂJLb'(fz =xd;|Zb=ve$獫Os1N!;X#!f#[Vϐ*Z Ip j?p%  .Ą&uXC^Ri#ز6Qikx` w9A@"P"40 1$5G\iBB-fE9]BA%UTbU R[ Ɋ 3|/+CVqRBhi6/msGXUp0iKP 2x1`!è?4L؊H_toĠZ"p(OS>2Zo;%X4}Ỡ8GN-o3M2iDem%٧2JHC p?lm? >L4;Ҭ)@0rYNr-8ȓGʇ5c Th@t-xG¡@?zT`$2p$!JtP:Y(q%VMPNOyU}ܧ" Y|2-4X :HB{P!p#P-2.XQjG_"1PdbUz8]-V)m jaOXlB( sC6,![P|vH+ali @POhWehA * P~1 @+v RSn !*vG¬-D:O!e TVD>M)D-/w\#XB`~2Aap;Br^ZAҭ<%} 4W8@ A^Z:`c[ЌfT>0>|e9'6 V,8as@9z5 3PbA<pr(V+0I -c+c&*VD b(>F{ -<4 PG-^*GLtHWps ` aCh8C7IuMW=:p$1qLi{A J z z & tƹ/!.@*[@o<=@ GQ[U~qi!4agH%♾РajO? ̵  e$Ɉ0aDB#(qcwG]/qŽg=mDe@ቐ6dGCzFK: /ϟsV .z˾ @V(Π5P^pys^JȂ(*gVuw PȲȆ(f^0HKÁ#a(2p;~~3@qU0 14ĄwWr`zwB6)8r1SBDHچv;/A%l X{_H$`g@,XZL^uaTYڱ< e(Ԁ,АȩM% @ ('-Bq ݭ(A$ %pf!7H nŗIlmL$_8<.G@ױpi@n(4aQ=R!kIH0B%$ledC& ̈]ߥdRའHx1?D4xxAiU-jZ`9޼y =ⱚI102622a($4Nc/![4B(dz#B0|#8C34B"!6 cLC[d D= '_ T0NP/^aE1(B% $lB% K&x'|+dc,%Hn!^b^a`@u`,V,AH$-V\ jEi`eWqF$^p @<  (W M%8A &P1@ߎqa I-H2CD?|1̮QB[A}Frz?柪Eb+)hf,6%lBn(?>Y>‰//B<^T"nޑ*%T%hp 'dC?JVbA<\b橁HvZdd,~g,e[{xA[L%Un Ŗ#~@a[B6 h_h&d @耆Q#M"c R8R%jC E!tE6&V45EE#J&dCʁ%hKA&#hܠԂI'eHv""}7(h^$U*VOAE$*)呧y(d*) S?'zΧ )8P(0@ jD@o?`@D*Ȁ?@U؂x@x  O>u 8K 0Y(\2A$J?dfj)[F `L|^J8`O.0D$pd ݎB*#<,Pc}(aw%Ri&XB%|_&\.&A++b'(W-x饉AyEBtԋB!1Jc}Qd(BĤr`46o1f1+/>7,[Ae!AlH@ trL@jz L њH(#4^%'@n!hJ0++)P: HŖVj##7샶%L98p_8B)%@6r,(lB dBq5^Xv+q\bĂ! ƴ ./">bB.80Cg--LrX7(rvZ JUil@?dqi]q8vʧycO _ܪOx3$78kPDa!"%_2; EAu7Q,D/Lx)p@!|)+?F,nTB AW&/ܶ/p!x 40„B)52܂),"` 9Uw*4Br.*́͢p@1lxBIx#?;G;`Xp%tzhw+OP/&%)$*$'๴(J3*%x[əcy?,tO0`r!\b&(/$ $4L7Wbu<P8b|51lM|K pJܻ=}I\9$rW+|,,T{(-$B,|(9ǻoXdBTlE.xPm DԘp0t:.d0.YD-B"B"xD(t/|B'fbTO5;B(⁍<,7oA8gG(̼d)d΃D؆mH0 d tJ׾߾ p!t 3 +¹"Ȃ,"t5,*.D @4V!CpGO'<'jn&.w~/t" DIXd* W4xP$IjD9eM5^\ƝF"%`W-iִyAxs?E E4UHVZ"9JCVv!Wcɖ-kٶ%ʒMb:po+P ?pD )e*#Cb4kV.TPt[Fb t pVFt]ñ.\xsBINÉwJSO!T6 !B`5pD۹a3-Nx~ *UoTb6oR~T):!iaR>V Cs -"D44 " RHdKpl< gA*%D)DBdL9nM\Y.H#p #:JU䐋H(pЊV:0죨C$ %>UQ*eOD tMA_l2*/J`EL1ESNO4G3ClU 2 d , ̻lFA ~ ^4ɤiY@a =|B)2Btϛ+jioN$G9b*>I4ڐtO"I6y㫟180~y N^0DO=&[Zd֊횬oHlR(iMpЧ(LyQHPy$M IJ.DF* ƕiKe`dOl缴aL.+>879W萼Xz)0F|F6&V N8>Q$4,ږ.,*o6C7Rp?C(6(/Q4@6,qK'a@e Bp8:"íe,78pL(X1M0, U G"WE+ $^"{kYŷp8"/qsцw=OEDn#B*´H"*}d$ F\D"! E*NWɨTxPVT%7 (-J-TCzR$kAR+O$)['.%1ce.jz`%Jp8pb[KxbYEZ$U$Iɚ4d406q1 Y7`"-Tq4!igPDU=K^mdGATDg ×o eQ~\5P] e3͆G h66PbPC  [8Y$^hF9JGRw68<{#6_bOX&:W@0ZX!KGP 7Dul2dȲ[]ˊ@ҕ#zZ>7oƞ9}jbE#j8\+5W?`(TjaQ_͖,|tW~ .4!#qhk҈21e Db x8!!CG< Xm%AhXtcF61{эy;O+r?9n1+F^5[ o6ӓ,PZlKbS7^k"nۭZ ?d1(` ASw,!lpQ,bQBcwCKl>cQ0!*gyhZ- l@<~iU 1Jn١Od+*}Є&\A b`΀XiߓaưRq0Garp<wĴ M  |y锎(e򘮱:$0Ћ>fM'-D&o>'dF ծЪkڌ"k -b(+za9>o$,4po% B%fȸ<*RgҼ/ƬAAc&/.ۆpDD`fxHXʤah`A0.(O0ZA&4%~*hM >R>OٴnɊhc,K몕Bc+f ?P@AlN(6?8>aZ^oie"p>բ (4K#/ԡZAlqO|e8>a}|a `"'  hbjC$ &fF'\&  CѕZ%Ũ J'֞Jת֢&)7E02 7+'b`8h]4E*cDbNl.^2@DkZ,:d+N)%K2(#Ot!\*B/,kAp!ԤKZPe"R#@Rs4҆8R(M.A:`K+Q+kDL, P N-ͱq-`)7Ϗpq&+,"L eKC*!.2(-7pP(CXER,+L.l؜/PA<P<"< CklDMJD߁ cbqNx~x`J!G#.2@X5LAtSўIaa+Jf+BJBR01*J;*&̏TPJ<?Q3Tպ"nBNui*ِj:-,dҫ.P'+% A`ȚN+2!FDk#FO>rTGx"G"/r5AkH!ʆA8@o!XI3'QBdːpB=J+*g N&4 A3CknnuR4ҿu2ļꓲ/TM+0dU,b_ER0EK0q48$UVKS4a.a* GD wU 86!G^׳I!vvQ{, hgGi/iNN!bRiU!D!*WW\ސc5pi &!56eSN@mvCfooKi'Rl@۪̎,qCh!gVr'rA会r3WsIED^!0C An!XWDax6Wvgoє&J^ÎvwwA<^-!@EzylMyzi"zW{77;F"|7;ws;PK Y03KIK``win32com/HTML/image/blank.gifUT  YZx`ux GIF89aG!,G@=H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜy1 ;PK Y03K8!win32com/HTML/image/pythoncom.gifUT  YZx`ux GIF89ajP (((000888@@@HHHPPPXXX```hhhpppxxx! ,jP@CH*\ȰÇ#JHŋ3j@ C(`A(/R9`Cʗ0QvࠁM2 4 0@p1 |FP 䃊 D>k.T@!BՐ8|#H'zx2Aܵx@t$ Р/HfP#SЀHf( ì Hd v ‡o#Pp6@8 5!H5ݑXE @C rX`( +t@P:d[0~C,,@ " _Cf Fi@Q,A{<Ŕ@XPdMHa#b0@q& B6(# @-ua fP_~! GwF6 z(RX0gi0Tc>$FFbYd@t@` >TH c\y"e 9YR &,p"1Ly~DypH`"GqBn"yA8I!XnA] \"I5u1" H,!)@AfEt+4H [XTBBFITe{#De<GLdY >$P%MC!AG"dW:A@m@ @O@vA 9Y6@~$Q@o#YH000P/! ҄:@R?@Uz0HFTb d^KIDdA2T1Q &x $-N8ŃTƷw-O O )v  G4R" YwH8 *:_F&\2@Cޤ>uvJrKzοrdQcSX2D'LY"gE \v7Z>`60_P!be8Z f!p{#=E%IRc.#m !Z,pI ?@ 7.-IO-vWU@Uƕ[*W'5-u>[Ubh=ٹ49sv&oMH(KD\?y]{2i1i i$dfYeEQ5*uC,,ikImUZQ$A0t6ge'\aj۩"V{Us1619HHؖ!g-.#V6Kr 3#Gwa(dZj,J%/ Cq By43s6d443C@UetPO G ~Y4Rpb~ae,G5wcq8TVZ>3npOJi>Xr=G 55Og{pWiC5t#NC$6QGg1c%4rX 9TAe0aX"jutM z>DB$Ny"WT%RtdX%ۚ_0XgplA ;De8:JMBo*fD\EU[nyXlk+vDU4(֧#h43G(J2"i[囗nh.?sCO)U8GI*;k+-] &cFLj1?S`m#'AbD(?$Y`v\kmG}<(*wt*wQ~: ᝟uHW ^NJ2UX`[G]<IWcƂwىDs$ J2'r>X", `E*N+<$Tލa{$~`VȾV;PK Y03K%win32com/HTML/image/BTN_ManualTop.gifUT  YZx`ux GIF89aJDDD!,J@0 r^`G-tmx-y3JH5ZQIHNyWD?JeuOOhDiuhƖq|vxegYA/3Rd@``>tvlOp%hHDV0_Jy}uZ\ ;PK Y03K3win32com/HTML/docindex.htmlUT  Yux  win32com Documentation Index

    Python and COM - Blowing the others away

    PythonCOM Documentation Index

    The following documentation is available

    A Quick Start to Client Side COM (including makepy)

    A Quick Start to Server Side COM

    Information on generated Python files (ie, what makepy generates)

    An advanced VARIANT object which can give more control over parameter types

    A brief description of the win32com package structure

    Python COM Implementation documentation

    Misc stuff I dont know where to put anywhere else

    ActiveX Scripting

    ActiveX Scripting Demos

    PK Y03K13&b#win32com/HTML/GeneratedSupport.htmlUT  Yux  Generated Python COM Support

    Python and COM - Blowing the others away

    Generated Python COM Support

    This file describes how the Python COM extensions support "generated files". The information contained here is for expert Python users, and people who need to take advantage of the advanced features of the support. More general information is available in the Quick Start to Client Side COM documentation.

    Introduction

    Generated Python COM support means that a .py file exists behind a particular COM object. This .py file is created by a generation process from a COM type library.

    This documentation talks about the process of the creation of the .py files.

    Design Goals

    The main design goal is that the Python programmer need not know much about the type library they wish to work with. They need not know the name of a specific Python module to use a type library. COM uses an IID, version and LCID to identify a type library. Therefore, the Python programmer only need know this information to obtain a Python module.

    How to generate support files

    Support files can be generated either "off-line" by the makepy utility, or in custom Python code.

    Using makepy is in many ways far simpler - you simply pick the type library and you are ready to go! The Quick Start to Client Side COM documentation describes this process.

    Often however, you will want to use code to ensure the type library has been processed. This document describes that process.

    Usage

    The win32com.client.gencache module implements all functionality. As described above, if you wish to generate support from code, you need to know the IID, version and LCID of the type library.

    The following functions are defined. The best examples of their usage is probably in the Pythonwin OCX Demos, and the COM Test Suite (particularly testMSOffice.py)

    Note that the gencache.py file supports being run from the command line, and provides some utilities for managing the cache. Run the file to see usage options.

    Using makepy to help with the runtime generation

    makepy supports a "-i" option, to print information about a type library. When you select a type library, makepy will print out 2 lines of code that you cant paste into your application. This will then allow your module to generate the makepy .py file at runtime, but will only take you a few seconds!

    win32com.client.gencache functions

    def MakeModuleForTypelib(typelibCLSID, lcid, major, minor, progressInstance = None):

    Generate support for a type library.

    Given the IID, LCID and version information for a type library, generate and import the necessary support files.

    Returns

    The Python module. No exceptions are caught.

    Params

    typelibCLSID
    IID of the type library.

    major
    Integer major version.

    minor
    Integer minor version.

    lcid
    Integer LCID for the library.

    progressInstance
    A class instance to use as the progress indicator, or None to use the default GUI one. 

    def EnsureModule(typelibCLSID, lcid, major, minor, progressInstance = None):

    Ensure Python support is loaded for a type library, generating if necessary.

    Given the IID, LCID and version information for a type library, check and if necessary generate, then import the necessary support files.

    Returns:

    The Python module. No exceptions are caught during the generate process.

    Params

    typelibCLSID
    IID of the type library.

    major
    Integer major version.

    minor
    Integer minor version.

    lcid
    Integer LCID for the library.

    progressInstance
    A class instance to use as the progress indicator, or None to use the default GUI one. 

     

    def GetClassForProgID(progid):

    Get a Python class for a Program ID

    Given a Program ID, return a Python class which wraps the COM object

    Returns

    The Python class, or None if no module is available.

    Params

    progid
    A COM ProgramID or IID (eg, "Word.Application")

     

    def GetModuleForProgID(progid):

    Get a Python module for a Program ID

    Given a Program ID, return a Python module which contains the class which wraps the COM object.

    Returns

    The Python module, or None if no module is available.

    Params:

    progid
    A COM ProgramID or IID (eg, "Word.Application")

     

    def GetModuleForCLSID(clsid):

    Get a Python module for a CLSID

    Given a CLSID, return a Python module which contains the class which wraps the COM object.

    Returns

    The Python module, or None if no module is available.

    Params

    progid
    A COM CLSID (ie, not the description)

     

    def GetModuleForTypelib(typelibCLSID, lcid, major, minor):

    Get a Python module for a type library ID

    Returns

    An imported Python module, else None

    Params:

    typelibCLSID
    IID of the type library.

    major
    Integer major version.

    minor
    Integer minor version

    lcid
    Integer LCID for the library.

    PK Y03KVawin32com/HTML/misc.htmlUT  Yux  Misc win32com Stuff

    Misc stuff I dont know where to put anywhere else

    Client Side Dispatch

    Using win32com.client.Dispatch automatically invokes all the win32com client side "smarts", including automatic usage of generated .py files etc.

    If you wish to avoid that, and use truly "dynamic" objects (ie, there is generated .py support available, but you wish to avoid it), you can use win32com.client.dynamic.Dispatch

    _print_details_() method
    If win32com.client.dynamic.Dispatch is used, the objects have a _print_details_() method available, which prints all relevant knowledge about an object (for example, all methods and properties). For objects that do not expose runtime type information, _print_details_ may not list anything.

    PK Y03KQ&win32com/HTML/QuickStartClientCom.htmlUT  Yux  Quick Start to Client side COM and Python

    Quick Start to Client side COM and Python

    Introduction

    This documents how to quickly start using COM from Python. It is not a thorough discussion of the COM system, or of the concepts introduced by COM.

    Other good information on COM can be found in various conference tutorials - please see the collection of Mark's conference tutorials

    For information on implementing COM objects using Python, please see a Quick Start to Server side COM and Python

    In this document we discuss the following topics:

    Quick Start

    To use a COM object from Python

    import win32com.client
    o = win32com.client.Dispatch("Object.Name")
    o.Method()
    o.property = "New Value"
    print o.property

    Example

    o = win32com.client.Dispatch("Excel.Application")
    o.Visible = 1
    o.Workbooks.Add() # for office 97 95 a bit different!
    o.Cells(1,1).Value = "Hello"

    And we will see the word "Hello" appear in the top cell.

    How do I know which methods and properties are available?

    Good question. This is hard! You need to use the documentation with the products, or possibly a COM browser. Note however that COM browsers typically rely on these objects registering themselves in certain ways, and many objects to not do this. You are just expected to know.

    The Python COM browser

    PythonCOM comes with a basic COM browser that may show you the information you need. Note that this package requires Pythonwin (ie, the MFC GUI environment) to be installed for this to work.

    There are far better COM browsers available - I tend to use the one that comes with MSVC, or this one!

    To run the browser, simply select it from the Pythonwin Tools menu, or double-click on the file win32com\client\combrowse.py

    Static Dispatch (or Type Safe) objects

    In the above examples, if we printed the 'repr(o)' object above, it would have resulted in

    <COMObject Excel.Application>

    This reflects that the object is a generic COM object that Python has no special knowledge of (other than the name you used to create it!). This is known as a "dynamic dispatch" object, as all knowledge is built dynamically. The win32com package also has the concept of static dispatch objects, which gives Python up-front knowledge about the objects that it is working with (including arguments, argument types, etc)

    In a nutshell, Static Dispatch involves the generation of a .py file that contains support for the specific object. For more overview information, please see the documentation references above.

    The generation and management of the .py files is somewhat automatic, and involves one of 2 steps:

    • Using makepy.py to select a COM library. This process is very similar to Visual Basic, where you select from a list of all objects installed on your system, and once selected the objects are magically useable.

    or

    • Use explicit code to check for, and possibly generate, support at run-time. This is very powerful, as it allows the developer to avoid ensuring the user has selected the appropriate type library. This option is extremely powerful for OCX users, as it allows Python code to sub-class an OCX control, but the actual sub-class can be generated at run-time. Use makepy.py with a -i option to see how to include this support in your Python code.

    The win32com.client.gencache module manages these generated files. This module has some documentation of its own, but you probably don't need to know the gory details!

    How do I get at the generated module?

    You will notice that the generated file name is long and cryptic - obviously not designed for humans to work with! So how do you get at the module object for the generated code?

    Hopefully, the answer is you shouldn't need to. All generated file support is generally available directly via win32com.client.Dispatch and win32com.client.constants. But should you ever really need the Python module object, the win32com.client.gencache module has functions specifically for this. The functions GetModuleForCLSID and GetModuleForProgID both return Python module objects that you can use in your code. See the docstrings in the gencache code for more details.

    To generate Python Sources supporting a COM object

    Example using Microsoft Office 97.

    Either:

    • Run 'win32com\client\makepy.py' (eg, run it from the command window, or double-click on it) and a list will be presented. Select the Type Library 'Microsoft Word 8.0 Object Library'
    • From a command prompt, run the command 'makepy.py "Microsoft Word 8.0 Object Library"' (include the double quotes). This simply avoids the selection process.
    • If you desire, you can also use explicit code to generate it just before you need to use it at runtime. Run 'makepy.py -i "Microsoft Word 8.0 Object Library"' (include the double quotes) to see how to do this.

    And that is it! Nothing more needed. No special import statements needed! Now, you simply need say

    >>> import win32com.client

    >>> w=win32com.client.Dispatch("Word.Application")

    >>> w.Visible=1

    >>> w

    <win32com.gen_py.Microsoft Word 8.0 Object Library._Application>

    Note that now Python knows the explicit type of the object.

    Using COM Constants

    Makepy automatically installs all generated constants from a type library in an object called win32com.clients.constants. You do not need to do anything special to make these constants work, other than create the object itself (ie, in the example above, the constants relating to Word would automatically be available after the w=win32com.client.Dispatch("Word.Application") statement.

    For example, immediately after executing the code above, you could execute the following:

    >>> w.WindowState = win32com.client.constants.wdWindowStateMinimize

    and Word will Minimize.

    PK Y03Kr422&win32com/HTML/QuickStartServerCom.htmlUT  Yux  Quick Start to Server Side COM and Python

    Quick Start to Server side COM and Python

    Introduction

    This documents how to quickly start implementing COM objects in Python. It is not a thorough discussion of the COM system, or of the concepts introduced by COM.

    For more details information on Python and COM, please see the COM Tutorial given by Greg Stein and Mark Hammond at SPAM 6 (HTML format) or download the same tutorial in PowerPoint format.

    For information on using external COM objects from Python, please see a Quick Start to Client side COM and Python.

    In this document we discuss the core functionality, registering the server, testing the class, debugging the class, exception handling and server policies (phew!)

    Implement the core functionality

    Implement a stand-alone Python class with your functionality

    class HelloWorld:

    def __init__(self):

    self.softspace = 1

    self.noCalls = 0

    def Hello(self, who):

    self.noCalls = self.noCalls + 1

    # insert "softspace" number of spaces

    return "Hello" + " " * self.softspace + who

    This is obviously a very simple server. In particular, custom error handling would be needed for a production class server. In addition, there are some contrived properties just for demonstration purposes.

    Make Unicode concessions

    At this stage, Python and Unicode dont really work well together. All strings which come from COM will actually be Unicode objects rather than string objects.

    To make this code work in a COM environment, the last line of the "Hello" method must become:

    return "Hello" + " " * self.softspace + str(who)

    Note the conversion of the "who" to "str(who)". This forces the Unicode object into a native Python string object.

    For details on how to debug COM Servers to find this sort of error, please see debugging the class

    Annotate the class with win32com specific attributes

    This is not a complete list of names, simply a list of properties used by this sample.

    Property Name

    Description

    _public_methods_

    List of all method names exposed to remote COM clients

    _public_attrs_

    List of all attribute names exposed to remote COM clients

    _readonly_attrs_

    List of all attributes which can be accessed, but not set.

    We change the class header to become:

    class HelloWorld:

    _public_methods_ = ['Hello']

    _public_attrs_ = ['softspace', 'noCalls']

    _readonly_attrs_ = ['noCalls']

    def __init__(self):

    [Same from here]

    Registering and assigning a CLSID for the object

    COM requires that all objects use a unique CLSID and be registered under a "user friendly" name. This documents the process.

    Generating the CLSID

    Microsoft Visual C++ comes with various tools for generating CLSID's, which are quite suitable. Alternatively, the pythoncom module exports the function CreateGuid() to generate these identifiers.

    >>> import pythoncom
    >>> print pythoncom.CreateGuid()
    {7CC9F362-486D-11D1-BB48-0000E838A65F}

    Obviously the GUID that you get will be different than that displayed here.

    Preparing for registration of the Class

    The win32com package allows yet more annotations to be applied to a class, allowing registration to be effected with 2 lines in your source file. The registration annotations used by this sample are:

    Property Name

    Description

    _reg_clsid_

    The CLSID of the COM object

    _reg_progid_

    The "program ID", or Name, of the COM Server. This is the name the user usually uses to instantiate the object

    _reg_desc_

    Optional: The description of the COM Server. Used primarily for COM browsers. If not specified, the _reg_progid_ is used as the description.

    _reg_class_spec_

    Optional: A string which represents how Python can create the class instance. The string is of format
    [package.subpackage.]module.class

    The portion up to the class name must be valid for Python to "import", and the class portion must be a valid attribute in the specified class.

    This is optional from build 124 of Pythoncom., and has been removed from this sample.

    _reg_remove_keys_

    Optional: A list of tuples of extra registry keys to be removed when uninstalling the server. Each tuple is of format ("key", root), where key is a string, and root is one of the win32con.HKEY_* constants (this item is optional, defaulting to HKEY_CLASSES_ROOT)

    Note there are quite a few other keys available. Also note that these annotations are not required - they just make registration simple. Helper functions in the module win32com.server.register allow you to explicitly specify each of these attributes without attaching them to the class.

    The header of our class now becomes:

    class HelloWorld:

    _reg_clsid_ = "{7CC9F362-486D-11D1-BB48-0000E838A65F}"

    _reg_desc_ = "Python Test COM Server"

    _reg_progid_ = "Python.TestServer"

    _public_methods_ = ['Hello']

    [same from here]

    Registering the Class

    The idiom that most Python COM Servers use is that they register themselves when run as a script (ie, when executed from the command line.) Thus the standard "if __name__=='__main___':" technique works well.

    win32com.server.register contains a number of helper functions. The easiest to use is "UseCommandLine".

    Registration becomes as simple as:

    if __name__=='__main__':
    # ni only for 1.4!
    import ni, win32com.server.register
    win32com.server.register.UseCommandLine(HelloWorld)

    Running the script will register our test server.

    Testing our Class

    For the purposes of this demonstration, we will test the class using Visual Basic. This code should run under any version of Visual Basic, including VBA found in Microsoft Office. Any COM compliant package could be used alternatively. VB has been used just to prove there is no "smoke and mirrors. For information on how to test the server using Python, please see the Quick Start to Client side COM documentation.

    This is not a tutorial in VB. The code is just presented! Run it, and it will work!

    Debugging the COM Server

    When things go wrong in COM Servers, there is often nowhere useful for the Python traceback to go, even if such a traceback is generated.

    Rather than discuss how it works, I will just present the procedure to debug your server:

    To register a debug version of your class, run the script (as above) but pass in a "--debug" parameter. Eg, for the server above, use the command line "testcomserver.py --debug".

    To see the debug output generated (and any print statements you may choose to add!) you can simply select the "Remote Debug Trace Collector" from the Pythonwin Tools menu, or run the script "win32traceutil.py" from Windows Explorer or a Command Prompt.

    Exception Handling

    Servers need to be able to provide exception information to their client. In some cases, it may be a simple return code (such as E_NOTIMPLEMENTED), but often it can contain much richer information, describing the error on detail, and even a help file and topic where more information can be found.

    We use Python class based exceptions to provide this information. The COM framework will examine the exception, and look for certain known attributes. These attributes will be copied across to the COM exception, and passed back to the client.

    The following attributes are supported, and correspond to the equivalent entry in the COM Exception structure:
    scode, code, description, source, helpfile and helpcontext

    To make working with exceptions easier, there is a helper module "win32com.server.exception.py", which defines a single class. An example of its usage would be:

    raise COMException(desc="Must be a string",scode=winerror.E_INVALIDARG,helpfile="myhelp.hlp",...)

    (Note the COMException class supports (and translates) "desc" as a shortcut for "description", but the framework requires "description")

    Server Policies

    This is information about how it all hangs together. The casual COM author need not know this.

    Whenever a Python Server needs to be created, the C++ framework first instantiates a "policy" object. This "policy" object is the gatekeeper for the COM Server - it is responsible for creating the underlying Python object that is the server (ie, your object), and also for translating the underlying COM requests for the object.

    This policy object handles all of the underlying COM functionality. For example, COM requires all methods and properties to have unique numeric ID's associated with them. The policy object manages the creation of these ID's for the underlying Python methods and attributes. Similarly, when the client whishes to call a method with ID 123, the policy object translates this back to the actual method, and makes the call.

    It should be noted that the operation of the "policy" object could be dictated by the Python object - the policy object has many defaults, but the actual Python class can always dictate its operation.

    Default Policy attributes

    The default policy object has a few special attributes that define who the object is exposed to COM. The example above shows the _public_methods attribute, but this section describes all such attributes in detail.

    _public_methods_

    Required list of strings, containing the names of all methods to be exposed to COM. It is possible this will be enhanced in the future (eg, possibly '*' will be recognised to say all methods, or some other ideas)

    _public_attrs_

    Optional list of strings containing all attribute names to be exposed, both for reading and writing. The attribute names must be valid instance variables.

    _readonly_attrs_

    Optional list of strings defining the name of attributes exposed read-only.

    _com_interfaces_

    Optional list of IIDs exposed by this object. If this attribute is missing, IID_IDispatch is assumed (ie, if not supplied, the COM object will be created as a normal Automation object.

    and actual instance attributes:

    _dynamic_ : optional method

    _value_ : optional attribute

    _query_interface_ : optional method

    _NewEnum : optional method

    _Evaluate : optional method

    PK Y03Kwin32com/readme.htmUT  Yux  win32com Readme

    Python and COM - Blowing the others away

    Python COM Extensions Readme

    This is the readme for win32com. Please check out the win32com documentation index

    The win32com/test directory contains some interesting scripts (and a new readme.txt). Although these are used for testing, they do show a variety of COM techniques.

    VARIANT objects

    win32com.client now has explicit VARIANT objects which can be used in situations where you need more control over the argument types passed when calling COM methods. See the documentation on this object

    Important Currency changes

    In all builds prior to 204, a COM currency value was returned as a tuple of integers. Working with 2 integers to represent a currency object was a poor choice, but the alternative was never clear. Now Python ships with the decimal module, the alternative has arrived!

    Up until build 212, code could set pythoncom.__future_currency__ = True to force use of the decimal module, with a warning issued otherwise. In builds 213 and later, the decimal module is unconditionally used when pythoncon returns you a currency value.

    Recent Changes

    Lots of internal changes on the road to py3k

    win32com.axcontrol and win2con.internet

    Many more interfaces for hosting AX controls and the interfaces used by Internet Explorer.

    win32com.shell

    The shell interfaces have undergone a number of enhancements and changes. A couple of methods have changed signature between the first build with shell support (200) and later builds. SHGetFileInfo was broken in its result handling, so had to be changed - this is the only function used by the samples that changed, but others not used by the samples also have changed. These shell interfaces are now generally stable.

    New win32com.taskscheduler module

    Roger Upole has contributed an interface to the Windows task scheduler. This is actually very neat, and it allows Python to edit the task list as shown by Windows Control Panel. Property page suppport may even appear later, now that the win32 library has the new win32rcparser module.

    ActiveX Scripting

    Python only supports "trusted" execution hosts - thus, it will no longer work as an engine inside IE (Python itself no longer has a restricted execution environment). Python continues to work fine as an Active Scripting Engine in all other applications, including Windows Scripting Host, and ASP.

    There is also support for Python as an ActiveX Scripting Host.

    Active Debugging seems to be fully functional.

    Older stuff

    • Unexpected exceptions in Python COM objects will generally now dump the exception and traceback to stdout.  This is useful for debugging and testing - it means that in some cases there will be no need to register an object with --debug to see these tracebacks.  Note that COM objects used by server processes (such as ASP) generally have no valid stdout, so will still need to use --debug as usual.
    • universal gateway support has been improved - we can now work as an Outlook Addin
    • PK {Rwin32com/libs/UT Zx`Zx`ux PK L$nQ **win32com/libs/axscript.libUT P^_ux ! / 1605328465 0 20695 ` i~bb~~44ppZZ r rJJ88  шш22<< JJ҈҈((XX""PP bbbb00||00ZZ||DD66xx>>  hhӌӌHH""ll::>>  RR͌~VnǞȾ&"NLtƔtnt J J x x׊׊llNNؒؒ44nnvv nn..NNFFbb    zz $$00LLh۔۔<< ^^ԶԶjjJJ..XXRRFF&ޮޮ__IMPORT_DESCRIPTOR_axscript__NULL_IMPORT_DESCRIPTORaxscript_NULL_THUNK_DATA_PyInit_axscript__imp__PyInit_axscript?PyGatewayConstruct@PyGObjectSafety@@SAJPAU_object@@PAVPyGatewayBase@@PAPAXABU_GUID@@@Z__imp_?PyGatewayConstruct@PyGObjectSafety@@SAJPAU_object@@PAVPyGatewayBase@@PAPAXABU_GUID@@@Z?PyGatewayConstruct@PyGActiveScript@@SAJPAU_object@@PAVPyGatewayBase@@PAPAXABU_GUID@@@Z__imp_?PyGatewayConstruct@PyGActiveScript@@SAJPAU_object@@PAVPyGatewayBase@@PAPAXABU_GUID@@@Z?PyGatewayConstruct@PyGActiveScriptParse@@SAJPAU_object@@PAVPyGatewayBase@@PAPAXABU_GUID@@@Z__imp_?PyGatewayConstruct@PyGActiveScriptParse@@SAJPAU_object@@PAVPyGatewayBase@@PAPAXABU_GUID@@@Z?PyGatewayConstruct@PyGActiveScriptSite@@SAJPAU_object@@PAVPyGatewayBase@@PAPAXABU_GUID@@@Z__imp_?PyGatewayConstruct@PyGActiveScriptSite@@SAJPAU_object@@PAVPyGatewayBase@@PAPAXABU_GUID@@@Z?PyGatewayConstruct@PyGActiveScriptError@@SAJPAU_object@@PAVPyGatewayBase@@PAPAXABU_GUID@@@Z__imp_?PyGatewayConstruct@PyGActiveScriptError@@SAJPAU_object@@PAVPyGatewayBase@@PAPAXABU_GUID@@@Z?PyObConstruct@PyIActiveScript@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyIActiveScript@@SAPAVPyIUnknown@@PAUIUnknown@@@Z?SetPythonCOMError@PyIActiveScript@@SAPAU_object@@PAU2@J@Z__imp_?SetPythonCOMError@PyIActiveScript@@SAPAU_object@@PAU2@J@Z??0PyIActiveScript@@QAE@ABV0@@Z__imp_??0PyIActiveScript@@QAE@ABV0@@Z??4PyIActiveScript@@QAEAAV0@ABV0@@Z__imp_??4PyIActiveScript@@QAEAAV0@ABV0@@Z?PyObConstruct@PyIActiveScriptParse@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyIActiveScriptParse@@SAPAVPyIUnknown@@PAUIUnknown@@@Z?SetPythonCOMError@PyIActiveScriptParse@@SAPAU_object@@PAU2@J@Z__imp_?SetPythonCOMError@PyIActiveScriptParse@@SAPAU_object@@PAU2@J@Z??0PyIActiveScriptParse@@QAE@ABV0@@Z__imp_??0PyIActiveScriptParse@@QAE@ABV0@@Z??4PyIActiveScriptParse@@QAEAAV0@ABV0@@Z__imp_??4PyIActiveScriptParse@@QAEAAV0@ABV0@@Z?PyObConstruct@PyIActiveScriptSite@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyIActiveScriptSite@@SAPAVPyIUnknown@@PAUIUnknown@@@Z?SetPythonCOMError@PyIActiveScriptSite@@SAPAU_object@@PAU2@J@Z__imp_?SetPythonCOMError@PyIActiveScriptSite@@SAPAU_object@@PAU2@J@Z??0PyIActiveScriptSite@@QAE@ABV0@@Z__imp_??0PyIActiveScriptSite@@QAE@ABV0@@Z??4PyIActiveScriptSite@@QAEAAV0@ABV0@@Z__imp_??4PyIActiveScriptSite@@QAEAAV0@ABV0@@Z??0PyGActiveScript@@IAE@PAU_object@@@Z__imp_??0PyGActiveScript@@IAE@PAU_object@@@Z?GetIID@PyGActiveScript@@MAE?AU_GUID@@XZ__imp_?GetIID@PyGActiveScript@@MAE?AU_GUID@@XZ?ThisAsIID@PyGActiveScript@@MAEPAXU_GUID@@@Z__imp_?ThisAsIID@PyGActiveScript@@MAEPAXU_GUID@@@Z?AddRef@PyGActiveScript@@MAGKXZ__imp_?AddRef@PyGActiveScript@@MAGKXZ?Release@PyGActiveScript@@MAGKXZ__imp_?Release@PyGActiveScript@@MAGKXZ?QueryInterface@PyGActiveScript@@MAGJABU_GUID@@PAPAX@Z__imp_?QueryInterface@PyGActiveScript@@MAGJABU_GUID@@PAPAX@Z??1PyGActiveScript@@UAE@XZ__imp_??1PyGActiveScript@@UAE@XZ??0PyGActiveScript@@QAE@ABV0@@Z__imp_??0PyGActiveScript@@QAE@ABV0@@Z??0PyGActiveScript@@QAE@$$QAV0@@Z__imp_??0PyGActiveScript@@QAE@$$QAV0@@Z??4PyGActiveScript@@QAEAAV0@ABV0@@Z__imp_??4PyGActiveScript@@QAEAAV0@ABV0@@Z??4PyGActiveScript@@QAEAAV0@$$QAV0@@Z__imp_??4PyGActiveScript@@QAEAAV0@$$QAV0@@Z??0PyGActiveScriptParse@@AAE@PAU_object@@@Z__imp_??0PyGActiveScriptParse@@AAE@PAU_object@@@Z?GetIID@PyGActiveScriptParse@@MAE?AU_GUID@@XZ__imp_?GetIID@PyGActiveScriptParse@@MAE?AU_GUID@@XZ?ThisAsIID@PyGActiveScriptParse@@MAEPAXU_GUID@@@Z__imp_?ThisAsIID@PyGActiveScriptParse@@MAEPAXU_GUID@@@Z?AddRef@PyGActiveScriptParse@@MAGKXZ__imp_?AddRef@PyGActiveScriptParse@@MAGKXZ?Release@PyGActiveScriptParse@@MAGKXZ__imp_?Release@PyGActiveScriptParse@@MAGKXZ?QueryInterface@PyGActiveScriptParse@@MAGJABU_GUID@@PAPAX@Z__imp_?QueryInterface@PyGActiveScriptParse@@MAGJABU_GUID@@PAPAX@Z??1PyGActiveScriptParse@@UAE@XZ__imp_??1PyGActiveScriptParse@@UAE@XZ??0PyGActiveScriptParse@@QAE@ABV0@@Z__imp_??0PyGActiveScriptParse@@QAE@ABV0@@Z??0PyGActiveScriptParse@@QAE@$$QAV0@@Z__imp_??0PyGActiveScriptParse@@QAE@$$QAV0@@Z??4PyGActiveScriptParse@@QAEAAV0@ABV0@@Z__imp_??4PyGActiveScriptParse@@QAEAAV0@ABV0@@Z??4PyGActiveScriptParse@@QAEAAV0@$$QAV0@@Z__imp_??4PyGActiveScriptParse@@QAEAAV0@$$QAV0@@Z??0PyGActiveScriptSite@@IAE@PAU_object@@@Z__imp_??0PyGActiveScriptSite@@IAE@PAU_object@@@Z?GetIID@PyGActiveScriptSite@@MAE?AU_GUID@@XZ__imp_?GetIID@PyGActiveScriptSite@@MAE?AU_GUID@@XZ?ThisAsIID@PyGActiveScriptSite@@MAEPAXU_GUID@@@Z__imp_?ThisAsIID@PyGActiveScriptSite@@MAEPAXU_GUID@@@Z?AddRef@PyGActiveScriptSite@@MAGKXZ__imp_?AddRef@PyGActiveScriptSite@@MAGKXZ?Release@PyGActiveScriptSite@@MAGKXZ__imp_?Release@PyGActiveScriptSite@@MAGKXZ?QueryInterface@PyGActiveScriptSite@@MAGJABU_GUID@@PAPAX@Z__imp_?QueryInterface@PyGActiveScriptSite@@MAGJABU_GUID@@PAPAX@Z??1PyGActiveScriptSite@@UAE@XZ__imp_??1PyGActiveScriptSite@@UAE@XZ??0PyGActiveScriptSite@@QAE@ABV0@@Z__imp_??0PyGActiveScriptSite@@QAE@ABV0@@Z??0PyGActiveScriptSite@@QAE@$$QAV0@@Z__imp_??0PyGActiveScriptSite@@QAE@$$QAV0@@Z??4PyGActiveScriptSite@@QAEAAV0@ABV0@@Z__imp_??4PyGActiveScriptSite@@QAEAAV0@ABV0@@Z??4PyGActiveScriptSite@@QAEAAV0@$$QAV0@@Z__imp_??4PyGActiveScriptSite@@QAEAAV0@$$QAV0@@Z??0PyGActiveScriptError@@IAE@PAU_object@@@Z__imp_??0PyGActiveScriptError@@IAE@PAU_object@@@Z?GetIID@PyGActiveScriptError@@MAE?AU_GUID@@XZ__imp_?GetIID@PyGActiveScriptError@@MAE?AU_GUID@@XZ?ThisAsIID@PyGActiveScriptError@@MAEPAXU_GUID@@@Z__imp_?ThisAsIID@PyGActiveScriptError@@MAEPAXU_GUID@@@Z?AddRef@PyGActiveScriptError@@MAGKXZ__imp_?AddRef@PyGActiveScriptError@@MAGKXZ?Release@PyGActiveScriptError@@MAGKXZ__imp_?Release@PyGActiveScriptError@@MAGKXZ?QueryInterface@PyGActiveScriptError@@MAGJABU_GUID@@PAPAX@Z__imp_?QueryInterface@PyGActiveScriptError@@MAGJABU_GUID@@PAPAX@Z??1PyGActiveScriptError@@UAE@XZ__imp_??1PyGActiveScriptError@@UAE@XZ??0PyGActiveScriptError@@QAE@ABV0@@Z__imp_??0PyGActiveScriptError@@QAE@ABV0@@Z??0PyGActiveScriptError@@QAE@$$QAV0@@Z__imp_??0PyGActiveScriptError@@QAE@$$QAV0@@Z??4PyGActiveScriptError@@QAEAAV0@ABV0@@Z__imp_??4PyGActiveScriptError@@QAEAAV0@ABV0@@Z??4PyGActiveScriptError@@QAEAAV0@$$QAV0@@Z__imp_??4PyGActiveScriptError@@QAEAAV0@$$QAV0@@Z?PyObConstruct@PyIActiveScriptError@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyIActiveScriptError@@SAPAVPyIUnknown@@PAUIUnknown@@@Z?SetPythonCOMError@PyIActiveScriptError@@SAPAU_object@@PAU2@J@Z__imp_?SetPythonCOMError@PyIActiveScriptError@@SAPAU_object@@PAU2@J@Z??0PyIActiveScriptError@@QAE@ABV0@@Z__imp_??0PyIActiveScriptError@@QAE@ABV0@@Z??4PyIActiveScriptError@@QAEAAV0@ABV0@@Z__imp_??4PyIActiveScriptError@@QAEAAV0@ABV0@@Z?PyObConstruct@PyIObjectSafety@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyIObjectSafety@@SAPAVPyIUnknown@@PAUIUnknown@@@Z?SetPythonCOMError@PyIObjectSafety@@SAPAU_object@@PAU2@J@Z__imp_?SetPythonCOMError@PyIObjectSafety@@SAPAU_object@@PAU2@J@Z??0PyIObjectSafety@@QAE@ABV0@@Z__imp_??0PyIObjectSafety@@QAE@ABV0@@Z??4PyIObjectSafety@@QAEAAV0@ABV0@@Z__imp_??4PyIObjectSafety@@QAEAAV0@ABV0@@Z??0PyGObjectSafety@@AAE@PAU_object@@@Z__imp_??0PyGObjectSafety@@AAE@PAU_object@@@Z?GetIID@PyGObjectSafety@@MAE?AU_GUID@@XZ__imp_?GetIID@PyGObjectSafety@@MAE?AU_GUID@@XZ?ThisAsIID@PyGObjectSafety@@MAEPAXU_GUID@@@Z__imp_?ThisAsIID@PyGObjectSafety@@MAEPAXU_GUID@@@Z?AddRef@PyGObjectSafety@@MAGKXZ__imp_?AddRef@PyGObjectSafety@@MAGKXZ?Release@PyGObjectSafety@@MAGKXZ__imp_?Release@PyGObjectSafety@@MAGKXZ?QueryInterface@PyGObjectSafety@@MAGJABU_GUID@@PAPAX@Z__imp_?QueryInterface@PyGObjectSafety@@MAGJABU_GUID@@PAPAX@Z??1PyGObjectSafety@@UAE@XZ__imp_??1PyGObjectSafety@@UAE@XZ??0PyGObjectSafety@@QAE@ABV0@@Z__imp_??0PyGObjectSafety@@QAE@ABV0@@Z??0PyGObjectSafety@@QAE@$$QAV0@@Z__imp_??0PyGObjectSafety@@QAE@$$QAV0@@Z??4PyGObjectSafety@@QAEAAV0@ABV0@@Z__imp_??4PyGObjectSafety@@QAEAAV0@ABV0@@Z??4PyGObjectSafety@@QAEAAV0@$$QAV0@@Z__imp_??4PyGObjectSafety@@QAEAAV0@$$QAV0@@Z?PyObConstruct@PyIProvideMultipleClassInfo@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyIProvideMultipleClassInfo@@SAPAVPyIUnknown@@PAUIUnknown@@@Z?SetPythonCOMError@PyIProvideMultipleClassInfo@@SAPAU_object@@PAU2@J@Z__imp_?SetPythonCOMError@PyIProvideMultipleClassInfo@@SAPAU_object@@PAU2@J@Z??0PyIProvideMultipleClassInfo@@QAE@ABV0@@Z__imp_??0PyIProvideMultipleClassInfo@@QAE@ABV0@@Z??4PyIProvideMultipleClassInfo@@QAEAAV0@ABV0@@Z__imp_??4PyIProvideMultipleClassInfo@@QAEAAV0@ABV0@@Z__imp_??_7PyIActiveScript@@6B@__imp_??_7PyIActiveScriptParse@@6B@__imp_??_7PyIActiveScriptSite@@6B@__imp_??_7PyGActiveScript@@6BIDispatchEx@@@__imp_??_7PyGActiveScript@@6BISupportErrorInfo@@@__imp_??_7PyGActiveScript@@6BIInternalUnwrapPythonObject@@@__imp_??_7PyGActiveScript@@6B@__imp_??_7PyGActiveScriptParse@@6BIDispatchEx@@@__imp_??_7PyGActiveScriptParse@@6BISupportErrorInfo@@@__imp_??_7PyGActiveScriptParse@@6BIInternalUnwrapPythonObject@@@__imp_??_7PyGActiveScriptParse@@6B@__imp_??_7PyGActiveScriptSite@@6BIDispatchEx@@@__imp_??_7PyGActiveScriptSite@@6BISupportErrorInfo@@@__imp_??_7PyGActiveScriptSite@@6BIInternalUnwrapPythonObject@@@__imp_??_7PyGActiveScriptSite@@6B@__imp_??_7PyGActiveScriptError@@6BIDispatchEx@@@__imp_??_7PyGActiveScriptError@@6BISupportErrorInfo@@@__imp_??_7PyGActiveScriptError@@6BIInternalUnwrapPythonObject@@@__imp_??_7PyGActiveScriptError@@6B@__imp_??_7PyIActiveScriptError@@6B@__imp_??_7PyIObjectSafety@@6B@__imp_??_7PyGObjectSafety@@6BIDispatchEx@@@__imp_??_7PyGObjectSafety@@6BISupportErrorInfo@@@__imp_??_7PyGObjectSafety@@6BIInternalUnwrapPythonObject@@@__imp_??_7PyGObjectSafety@@6B@__imp_??_7PyIProvideMultipleClassInfo@@6B@?SetScriptSite@PyGActiveScript@@MAGJPAUIActiveScriptSite@@@Z__imp_?SetScriptSite@PyGActiveScript@@MAGJPAUIActiveScriptSite@@@Z?GetScriptSite@PyGActiveScript@@MAGJABU_GUID@@PAPAX@Z__imp_?GetScriptSite@PyGActiveScript@@MAGJABU_GUID@@PAPAX@Z?SetScriptState@PyGActiveScript@@MAGJW4tagSCRIPTSTATE@@@Z__imp_?SetScriptState@PyGActiveScript@@MAGJW4tagSCRIPTSTATE@@@Z?GetScriptState@PyGActiveScript@@MAGJPAW4tagSCRIPTSTATE@@@Z__imp_?GetScriptState@PyGActiveScript@@MAGJPAW4tagSCRIPTSTATE@@@Z?Close@PyGActiveScript@@MAGJXZ__imp_?Close@PyGActiveScript@@MAGJXZ?AddNamedItem@PyGActiveScript@@MAGJPB_WK@Z__imp_?AddNamedItem@PyGActiveScript@@MAGJPB_WK@Z?AddTypeLib@PyGActiveScript@@MAGJABU_GUID@@KKK@Z__imp_?AddTypeLib@PyGActiveScript@@MAGJABU_GUID@@KKK@Z?GetScriptDispatch@PyGActiveScript@@MAGJPB_WPAPAUIDispatch@@@Z__imp_?GetScriptDispatch@PyGActiveScript@@MAGJPB_WPAPAUIDispatch@@@Z?GetCurrentScriptThreadID@PyGActiveScript@@MAGJPAK@Z__imp_?GetCurrentScriptThreadID@PyGActiveScript@@MAGJPAK@Z?GetScriptThreadID@PyGActiveScript@@MAGJKPAK@Z__imp_?GetScriptThreadID@PyGActiveScript@@MAGJKPAK@Z?GetScriptThreadState@PyGActiveScript@@MAGJKPAW4tagSCRIPTTHREADSTATE@@@Z__imp_?GetScriptThreadState@PyGActiveScript@@MAGJKPAW4tagSCRIPTTHREADSTATE@@@Z?InterruptScriptThread@PyGActiveScript@@MAGJKPBUtagEXCEPINFO@@K@Z__imp_?InterruptScriptThread@PyGActiveScript@@MAGJKPBUtagEXCEPINFO@@K@Z?Clone@PyGActiveScript@@MAGJPAPAUIActiveScript@@@Z__imp_?Clone@PyGActiveScript@@MAGJPAPAUIActiveScript@@@Z?GetExceptionInfo@PyGActiveScriptError@@MAGJPAUtagEXCEPINFO@@@Z__imp_?GetExceptionInfo@PyGActiveScriptError@@MAGJPAUtagEXCEPINFO@@@Z?GetSourcePosition@PyGActiveScriptError@@MAGJPAK0PAJ@Z__imp_?GetSourcePosition@PyGActiveScriptError@@MAGJPAK0PAJ@Z?GetSourceLineText@PyGActiveScriptError@@MAGJPAPA_W@Z__imp_?GetSourceLineText@PyGActiveScriptError@@MAGJPAPA_W@Z?InitNew@PyGActiveScriptParse@@MAGJXZ__imp_?InitNew@PyGActiveScriptParse@@MAGJXZ?AddScriptlet@PyGActiveScriptParse@@MAGJPB_W00000KKKPAPA_WPAUtagEXCEPINFO@@@Z__imp_?AddScriptlet@PyGActiveScriptParse@@MAGJPB_W00000KKKPAPA_WPAUtagEXCEPINFO@@@Z?ParseScriptText@PyGActiveScriptParse@@MAGJPB_W0PAUIUnknown@@0KKKPAUtagVARIANT@@PAUtagEXCEPINFO@@@Z__imp_?ParseScriptText@PyGActiveScriptParse@@MAGJPB_W0PAUIUnknown@@0KKKPAUtagVARIANT@@PAUtagEXCEPINFO@@@Z?GetLCID@PyGActiveScriptSite@@MAGJPAK@Z__imp_?GetLCID@PyGActiveScriptSite@@MAGJPAK@Z?GetItemInfo@PyGActiveScriptSite@@MAGJPB_WKPAPAUIUnknown@@PAPAUITypeInfo@@@Z__imp_?GetItemInfo@PyGActiveScriptSite@@MAGJPB_WKPAPAUIUnknown@@PAPAUITypeInfo@@@Z?GetDocVersionString@PyGActiveScriptSite@@MAGJPAPA_W@Z__imp_?GetDocVersionString@PyGActiveScriptSite@@MAGJPAPA_W@Z?OnScriptTerminate@PyGActiveScriptSite@@MAGJPBUtagVARIANT@@PBUtagEXCEPINFO@@@Z__imp_?OnScriptTerminate@PyGActiveScriptSite@@MAGJPBUtagVARIANT@@PBUtagEXCEPINFO@@@Z?OnStateChange@PyGActiveScriptSite@@MAGJW4tagSCRIPTSTATE@@@Z__imp_?OnStateChange@PyGActiveScriptSite@@MAGJW4tagSCRIPTSTATE@@@Z?OnScriptError@PyGActiveScriptSite@@MAGJPAUIActiveScriptError@@@Z__imp_?OnScriptError@PyGActiveScriptSite@@MAGJPAUIActiveScriptError@@@Z?OnEnterScript@PyGActiveScriptSite@@MAGJXZ__imp_?OnEnterScript@PyGActiveScriptSite@@MAGJXZ?OnLeaveScript@PyGActiveScriptSite@@MAGJXZ__imp_?OnLeaveScript@PyGActiveScriptSite@@MAGJXZ?GetInterfaceSafetyOptions@PyGObjectSafety@@MAGJABU_GUID@@PAK1@Z__imp_?GetInterfaceSafetyOptions@PyGObjectSafety@@MAGJABU_GUID@@PAK1@Z?SetInterfaceSafetyOptions@PyGObjectSafety@@MAGJABU_GUID@@KK@Z__imp_?SetInterfaceSafetyOptions@PyGObjectSafety@@MAGJABU_GUID@@KK@Z?SetScriptSite@PyIActiveScript@@SAPAU_object@@PAU2@0@Z__imp_?SetScriptSite@PyIActiveScript@@SAPAU_object@@PAU2@0@Z?SetScriptState@PyIActiveScript@@SAPAU_object@@PAU2@0@Z__imp_?SetScriptState@PyIActiveScript@@SAPAU_object@@PAU2@0@Z?GetScriptState@PyIActiveScript@@SAPAU_object@@PAU2@0@Z__imp_?GetScriptState@PyIActiveScript@@SAPAU_object@@PAU2@0@Z?Close@PyIActiveScript@@SAPAU_object@@PAU2@0@Z__imp_?Close@PyIActiveScript@@SAPAU_object@@PAU2@0@Z?AddNamedItem@PyIActiveScript@@SAPAU_object@@PAU2@0@Z__imp_?AddNamedItem@PyIActiveScript@@SAPAU_object@@PAU2@0@Z?AddTypeLib@PyIActiveScript@@SAPAU_object@@PAU2@0@Z__imp_?AddTypeLib@PyIActiveScript@@SAPAU_object@@PAU2@0@Z?GetScriptDispatch@PyIActiveScript@@SAPAU_object@@PAU2@0@Z__imp_?GetScriptDispatch@PyIActiveScript@@SAPAU_object@@PAU2@0@Z?GetCurrentScriptThreadID@PyIActiveScript@@SAPAU_object@@PAU2@0@Z__imp_?GetCurrentScriptThreadID@PyIActiveScript@@SAPAU_object@@PAU2@0@Z?GetScriptThreadID@PyIActiveScript@@SAPAU_object@@PAU2@0@Z__imp_?GetScriptThreadID@PyIActiveScript@@SAPAU_object@@PAU2@0@Z?GetScriptThreadState@PyIActiveScript@@SAPAU_object@@PAU2@0@Z__imp_?GetScriptThreadState@PyIActiveScript@@SAPAU_object@@PAU2@0@Z?InterruptScriptThread@PyIActiveScript@@SAPAU_object@@PAU2@0@Z__imp_?InterruptScriptThread@PyIActiveScript@@SAPAU_object@@PAU2@0@Z?Clone@PyIActiveScript@@SAPAU_object@@PAU2@0@Z__imp_?Clone@PyIActiveScript@@SAPAU_object@@PAU2@0@Z?GetI@PyIActiveScript@@SAPAUIActiveScript@@PAU_object@@@Z__imp_?GetI@PyIActiveScript@@SAPAUIActiveScript@@PAU_object@@@Z?GetScriptSite@PyIActiveScript@@SAPAU_object@@PAU2@0@Z__imp_?GetScriptSite@PyIActiveScript@@SAPAU_object@@PAU2@0@Z??0PyIActiveScript@@IAE@PAUIUnknown@@@Z__imp_??0PyIActiveScript@@IAE@PAUIUnknown@@@Z??1PyIActiveScript@@MAE@XZ__imp_??1PyIActiveScript@@MAE@XZ__imp_?type@PyIActiveScript@@2VPyComTypeObject@@A?GetExceptionInfo@PyIActiveScriptError@@SAPAU_object@@PAU2@0@Z__imp_?GetExceptionInfo@PyIActiveScriptError@@SAPAU_object@@PAU2@0@Z?GetSourcePosition@PyIActiveScriptError@@SAPAU_object@@PAU2@0@Z__imp_?GetSourcePosition@PyIActiveScriptError@@SAPAU_object@@PAU2@0@Z?GetSourceLineText@PyIActiveScriptError@@SAPAU_object@@PAU2@0@Z__imp_?GetSourceLineText@PyIActiveScriptError@@SAPAU_object@@PAU2@0@Z?GetI@PyIActiveScriptError@@SAPAUIActiveScriptError@@PAU_object@@@Z__imp_?GetI@PyIActiveScriptError@@SAPAUIActiveScriptError@@PAU_object@@@Z??0PyIActiveScriptError@@IAE@PAUIUnknown@@@Z__imp_??0PyIActiveScriptError@@IAE@PAUIUnknown@@@Z??1PyIActiveScriptError@@MAE@XZ__imp_??1PyIActiveScriptError@@MAE@XZ__imp_?type@PyIActiveScriptError@@2VPyComTypeObject@@A?InitNew@PyIActiveScriptParse@@SAPAU_object@@PAU2@0@Z__imp_?InitNew@PyIActiveScriptParse@@SAPAU_object@@PAU2@0@Z?AddScriptlet@PyIActiveScriptParse@@SAPAU_object@@PAU2@0@Z__imp_?AddScriptlet@PyIActiveScriptParse@@SAPAU_object@@PAU2@0@Z?ParseScriptText@PyIActiveScriptParse@@SAPAU_object@@PAU2@0@Z__imp_?ParseScriptText@PyIActiveScriptParse@@SAPAU_object@@PAU2@0@Z?GetI@PyIActiveScriptParse@@SAPAUIActiveScriptParse32@@PAU_object@@@Z__imp_?GetI@PyIActiveScriptParse@@SAPAUIActiveScriptParse32@@PAU_object@@@Z??0PyIActiveScriptParse@@IAE@PAUIUnknown@@@Z__imp_??0PyIActiveScriptParse@@IAE@PAUIUnknown@@@Z??1PyIActiveScriptParse@@MAE@XZ__imp_??1PyIActiveScriptParse@@MAE@XZ__imp_?type@PyIActiveScriptParse@@2VPyComTypeObject@@A?GetLCID@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Z__imp_?GetLCID@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Z?GetItemInfo@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Z__imp_?GetItemInfo@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Z?GetDocVersionString@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Z__imp_?GetDocVersionString@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Z?OnStateChange@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Z__imp_?OnStateChange@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Z?OnEnterScript@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Z__imp_?OnEnterScript@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Z?OnLeaveScript@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Z__imp_?OnLeaveScript@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Z?OnScriptError@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Z__imp_?OnScriptError@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Z?OnScriptTerminate@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Z__imp_?OnScriptTerminate@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Z?GetI@PyIActiveScriptSite@@SAPAUIActiveScriptSite@@PAU_object@@@Z__imp_?GetI@PyIActiveScriptSite@@SAPAUIActiveScriptSite@@PAU_object@@@Z??0PyIActiveScriptSite@@IAE@PAUIUnknown@@@Z__imp_??0PyIActiveScriptSite@@IAE@PAUIUnknown@@@Z??1PyIActiveScriptSite@@MAE@XZ__imp_??1PyIActiveScriptSite@@MAE@XZ__imp_?type@PyIActiveScriptSite@@2VPyComTypeObject@@A?GetMultiTypeInfoCount@PyIProvideMultipleClassInfo@@SAPAU_object@@PAU2@0@Z__imp_?GetMultiTypeInfoCount@PyIProvideMultipleClassInfo@@SAPAU_object@@PAU2@0@Z?GetInfoOfIndex@PyIProvideMultipleClassInfo@@SAPAU_object@@PAU2@0@Z__imp_?GetInfoOfIndex@PyIProvideMultipleClassInfo@@SAPAU_object@@PAU2@0@Z?GetI@PyIProvideMultipleClassInfo@@SAPAUIProvideMultipleClassInfo@@PAU_object@@@Z__imp_?GetI@PyIProvideMultipleClassInfo@@SAPAUIProvideMultipleClassInfo@@PAU_object@@@Z??0PyIProvideMultipleClassInfo@@IAE@PAUIUnknown@@@Z__imp_??0PyIProvideMultipleClassInfo@@IAE@PAUIUnknown@@@Z??1PyIProvideMultipleClassInfo@@MAE@XZ__imp_??1PyIProvideMultipleClassInfo@@MAE@XZ__imp_?type@PyIProvideMultipleClassInfo@@2VPyComTypeObject@@A?GetInterfaceSafetyOptions@PyIObjectSafety@@SAPAU_object@@PAU2@0@Z__imp_?GetInterfaceSafetyOptions@PyIObjectSafety@@SAPAU_object@@PAU2@0@Z?SetInterfaceSafetyOptions@PyIObjectSafety@@SAPAU_object@@PAU2@0@Z__imp_?SetInterfaceSafetyOptions@PyIObjectSafety@@SAPAU_object@@PAU2@0@Z?GetI@PyIObjectSafety@@SAPAUIObjectSafety@@PAU_object@@@Z__imp_?GetI@PyIObjectSafety@@SAPAUIObjectSafety@@PAU_object@@@Z??0PyIObjectSafety@@IAE@PAUIUnknown@@@Z__imp_??0PyIObjectSafety@@IAE@PAUIUnknown@@@Z??1PyIObjectSafety@@MAE@XZ__imp_??1PyIObjectSafety@@MAE@XZ__imp_?type@PyIObjectSafety@@2VPyComTypeObject@@A / 1605328465 0 20773 ` ~b~4pZr J8 2< J(XԪ"ګP bb0|0Z|ȩD6x> hH"l:> R~Vn&"NLttntJ x lN4nv n.NFb  z $0Lh< ^jJ.XRF&i7?>!)(,43JRQ DHW='2P A@+*65TS EIXy:$/Mzx|8"-K{uw}~  BFU<&1O;%0N CGVtv9#.L7?>!)(,43JRQ DHW='2P A@+*65TS EIX`]_^likjdacbhegfroqpZm[\nsy:$/Mzx|8"-K{uw}~  BFU<&1O;%0N CGVtv9#.L??0PyGActiveScript@@IAE@PAU_object@@@Z??0PyGActiveScript@@QAE@$$QAV0@@Z??0PyGActiveScript@@QAE@ABV0@@Z??0PyGActiveScriptError@@IAE@PAU_object@@@Z??0PyGActiveScriptError@@QAE@$$QAV0@@Z??0PyGActiveScriptError@@QAE@ABV0@@Z??0PyGActiveScriptParse@@AAE@PAU_object@@@Z??0PyGActiveScriptParse@@QAE@$$QAV0@@Z??0PyGActiveScriptParse@@QAE@ABV0@@Z??0PyGActiveScriptSite@@IAE@PAU_object@@@Z??0PyGActiveScriptSite@@QAE@$$QAV0@@Z??0PyGActiveScriptSite@@QAE@ABV0@@Z??0PyGObjectSafety@@AAE@PAU_object@@@Z??0PyGObjectSafety@@QAE@$$QAV0@@Z??0PyGObjectSafety@@QAE@ABV0@@Z??0PyIActiveScript@@IAE@PAUIUnknown@@@Z??0PyIActiveScript@@QAE@ABV0@@Z??0PyIActiveScriptError@@IAE@PAUIUnknown@@@Z??0PyIActiveScriptError@@QAE@ABV0@@Z??0PyIActiveScriptParse@@IAE@PAUIUnknown@@@Z??0PyIActiveScriptParse@@QAE@ABV0@@Z??0PyIActiveScriptSite@@IAE@PAUIUnknown@@@Z??0PyIActiveScriptSite@@QAE@ABV0@@Z??0PyIObjectSafety@@IAE@PAUIUnknown@@@Z??0PyIObjectSafety@@QAE@ABV0@@Z??0PyIProvideMultipleClassInfo@@IAE@PAUIUnknown@@@Z??0PyIProvideMultipleClassInfo@@QAE@ABV0@@Z??1PyGActiveScript@@UAE@XZ??1PyGActiveScriptError@@UAE@XZ??1PyGActiveScriptParse@@UAE@XZ??1PyGActiveScriptSite@@UAE@XZ??1PyGObjectSafety@@UAE@XZ??1PyIActiveScript@@MAE@XZ??1PyIActiveScriptError@@MAE@XZ??1PyIActiveScriptParse@@MAE@XZ??1PyIActiveScriptSite@@MAE@XZ??1PyIObjectSafety@@MAE@XZ??1PyIProvideMultipleClassInfo@@MAE@XZ??4PyGActiveScript@@QAEAAV0@$$QAV0@@Z??4PyGActiveScript@@QAEAAV0@ABV0@@Z??4PyGActiveScriptError@@QAEAAV0@$$QAV0@@Z??4PyGActiveScriptError@@QAEAAV0@ABV0@@Z??4PyGActiveScriptParse@@QAEAAV0@$$QAV0@@Z??4PyGActiveScriptParse@@QAEAAV0@ABV0@@Z??4PyGActiveScriptSite@@QAEAAV0@$$QAV0@@Z??4PyGActiveScriptSite@@QAEAAV0@ABV0@@Z??4PyGObjectSafety@@QAEAAV0@$$QAV0@@Z??4PyGObjectSafety@@QAEAAV0@ABV0@@Z??4PyIActiveScript@@QAEAAV0@ABV0@@Z??4PyIActiveScriptError@@QAEAAV0@ABV0@@Z??4PyIActiveScriptParse@@QAEAAV0@ABV0@@Z??4PyIActiveScriptSite@@QAEAAV0@ABV0@@Z??4PyIObjectSafety@@QAEAAV0@ABV0@@Z??4PyIProvideMultipleClassInfo@@QAEAAV0@ABV0@@Z?AddNamedItem@PyGActiveScript@@MAGJPB_WK@Z?AddNamedItem@PyIActiveScript@@SAPAU_object@@PAU2@0@Z?AddRef@PyGActiveScript@@MAGKXZ?AddRef@PyGActiveScriptError@@MAGKXZ?AddRef@PyGActiveScriptParse@@MAGKXZ?AddRef@PyGActiveScriptSite@@MAGKXZ?AddRef@PyGObjectSafety@@MAGKXZ?AddScriptlet@PyGActiveScriptParse@@MAGJPB_W00000KKKPAPA_WPAUtagEXCEPINFO@@@Z?AddScriptlet@PyIActiveScriptParse@@SAPAU_object@@PAU2@0@Z?AddTypeLib@PyGActiveScript@@MAGJABU_GUID@@KKK@Z?AddTypeLib@PyIActiveScript@@SAPAU_object@@PAU2@0@Z?Clone@PyGActiveScript@@MAGJPAPAUIActiveScript@@@Z?Clone@PyIActiveScript@@SAPAU_object@@PAU2@0@Z?Close@PyGActiveScript@@MAGJXZ?Close@PyIActiveScript@@SAPAU_object@@PAU2@0@Z?GetCurrentScriptThreadID@PyGActiveScript@@MAGJPAK@Z?GetCurrentScriptThreadID@PyIActiveScript@@SAPAU_object@@PAU2@0@Z?GetDocVersionString@PyGActiveScriptSite@@MAGJPAPA_W@Z?GetDocVersionString@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Z?GetExceptionInfo@PyGActiveScriptError@@MAGJPAUtagEXCEPINFO@@@Z?GetExceptionInfo@PyIActiveScriptError@@SAPAU_object@@PAU2@0@Z?GetI@PyIActiveScript@@SAPAUIActiveScript@@PAU_object@@@Z?GetI@PyIActiveScriptError@@SAPAUIActiveScriptError@@PAU_object@@@Z?GetI@PyIActiveScriptParse@@SAPAUIActiveScriptParse32@@PAU_object@@@Z?GetI@PyIActiveScriptSite@@SAPAUIActiveScriptSite@@PAU_object@@@Z?GetI@PyIObjectSafety@@SAPAUIObjectSafety@@PAU_object@@@Z?GetI@PyIProvideMultipleClassInfo@@SAPAUIProvideMultipleClassInfo@@PAU_object@@@Z?GetIID@PyGActiveScript@@MAE?AU_GUID@@XZ?GetIID@PyGActiveScriptError@@MAE?AU_GUID@@XZ?GetIID@PyGActiveScriptParse@@MAE?AU_GUID@@XZ?GetIID@PyGActiveScriptSite@@MAE?AU_GUID@@XZ?GetIID@PyGObjectSafety@@MAE?AU_GUID@@XZ?GetInfoOfIndex@PyIProvideMultipleClassInfo@@SAPAU_object@@PAU2@0@Z?GetInterfaceSafetyOptions@PyGObjectSafety@@MAGJABU_GUID@@PAK1@Z?GetInterfaceSafetyOptions@PyIObjectSafety@@SAPAU_object@@PAU2@0@Z?GetItemInfo@PyGActiveScriptSite@@MAGJPB_WKPAPAUIUnknown@@PAPAUITypeInfo@@@Z?GetItemInfo@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Z?GetLCID@PyGActiveScriptSite@@MAGJPAK@Z?GetLCID@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Z?GetMultiTypeInfoCount@PyIProvideMultipleClassInfo@@SAPAU_object@@PAU2@0@Z?GetScriptDispatch@PyGActiveScript@@MAGJPB_WPAPAUIDispatch@@@Z?GetScriptDispatch@PyIActiveScript@@SAPAU_object@@PAU2@0@Z?GetScriptSite@PyGActiveScript@@MAGJABU_GUID@@PAPAX@Z?GetScriptSite@PyIActiveScript@@SAPAU_object@@PAU2@0@Z?GetScriptState@PyGActiveScript@@MAGJPAW4tagSCRIPTSTATE@@@Z?GetScriptState@PyIActiveScript@@SAPAU_object@@PAU2@0@Z?GetScriptThreadID@PyGActiveScript@@MAGJKPAK@Z?GetScriptThreadID@PyIActiveScript@@SAPAU_object@@PAU2@0@Z?GetScriptThreadState@PyGActiveScript@@MAGJKPAW4tagSCRIPTTHREADSTATE@@@Z?GetScriptThreadState@PyIActiveScript@@SAPAU_object@@PAU2@0@Z?GetSourceLineText@PyGActiveScriptError@@MAGJPAPA_W@Z?GetSourceLineText@PyIActiveScriptError@@SAPAU_object@@PAU2@0@Z?GetSourcePosition@PyGActiveScriptError@@MAGJPAK0PAJ@Z?GetSourcePosition@PyIActiveScriptError@@SAPAU_object@@PAU2@0@Z?InitNew@PyGActiveScriptParse@@MAGJXZ?InitNew@PyIActiveScriptParse@@SAPAU_object@@PAU2@0@Z?InterruptScriptThread@PyGActiveScript@@MAGJKPBUtagEXCEPINFO@@K@Z?InterruptScriptThread@PyIActiveScript@@SAPAU_object@@PAU2@0@Z?OnEnterScript@PyGActiveScriptSite@@MAGJXZ?OnEnterScript@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Z?OnLeaveScript@PyGActiveScriptSite@@MAGJXZ?OnLeaveScript@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Z?OnScriptError@PyGActiveScriptSite@@MAGJPAUIActiveScriptError@@@Z?OnScriptError@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Z?OnScriptTerminate@PyGActiveScriptSite@@MAGJPBUtagVARIANT@@PBUtagEXCEPINFO@@@Z?OnScriptTerminate@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Z?OnStateChange@PyGActiveScriptSite@@MAGJW4tagSCRIPTSTATE@@@Z?OnStateChange@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Z?ParseScriptText@PyGActiveScriptParse@@MAGJPB_W0PAUIUnknown@@0KKKPAUtagVARIANT@@PAUtagEXCEPINFO@@@Z?ParseScriptText@PyIActiveScriptParse@@SAPAU_object@@PAU2@0@Z?PyGatewayConstruct@PyGActiveScript@@SAJPAU_object@@PAVPyGatewayBase@@PAPAXABU_GUID@@@Z?PyGatewayConstruct@PyGActiveScriptError@@SAJPAU_object@@PAVPyGatewayBase@@PAPAXABU_GUID@@@Z?PyGatewayConstruct@PyGActiveScriptParse@@SAJPAU_object@@PAVPyGatewayBase@@PAPAXABU_GUID@@@Z?PyGatewayConstruct@PyGActiveScriptSite@@SAJPAU_object@@PAVPyGatewayBase@@PAPAXABU_GUID@@@Z?PyGatewayConstruct@PyGObjectSafety@@SAJPAU_object@@PAVPyGatewayBase@@PAPAXABU_GUID@@@Z?PyObConstruct@PyIActiveScript@@SAPAVPyIUnknown@@PAUIUnknown@@@Z?PyObConstruct@PyIActiveScriptError@@SAPAVPyIUnknown@@PAUIUnknown@@@Z?PyObConstruct@PyIActiveScriptParse@@SAPAVPyIUnknown@@PAUIUnknown@@@Z?PyObConstruct@PyIActiveScriptSite@@SAPAVPyIUnknown@@PAUIUnknown@@@Z?PyObConstruct@PyIObjectSafety@@SAPAVPyIUnknown@@PAUIUnknown@@@Z?PyObConstruct@PyIProvideMultipleClassInfo@@SAPAVPyIUnknown@@PAUIUnknown@@@Z?QueryInterface@PyGActiveScript@@MAGJABU_GUID@@PAPAX@Z?QueryInterface@PyGActiveScriptError@@MAGJABU_GUID@@PAPAX@Z?QueryInterface@PyGActiveScriptParse@@MAGJABU_GUID@@PAPAX@Z?QueryInterface@PyGActiveScriptSite@@MAGJABU_GUID@@PAPAX@Z?QueryInterface@PyGObjectSafety@@MAGJABU_GUID@@PAPAX@Z?Release@PyGActiveScript@@MAGKXZ?Release@PyGActiveScriptError@@MAGKXZ?Release@PyGActiveScriptParse@@MAGKXZ?Release@PyGActiveScriptSite@@MAGKXZ?Release@PyGObjectSafety@@MAGKXZ?SetInterfaceSafetyOptions@PyGObjectSafety@@MAGJABU_GUID@@KK@Z?SetInterfaceSafetyOptions@PyIObjectSafety@@SAPAU_object@@PAU2@0@Z?SetPythonCOMError@PyIActiveScript@@SAPAU_object@@PAU2@J@Z?SetPythonCOMError@PyIActiveScriptError@@SAPAU_object@@PAU2@J@Z?SetPythonCOMError@PyIActiveScriptParse@@SAPAU_object@@PAU2@J@Z?SetPythonCOMError@PyIActiveScriptSite@@SAPAU_object@@PAU2@J@Z?SetPythonCOMError@PyIObjectSafety@@SAPAU_object@@PAU2@J@Z?SetPythonCOMError@PyIProvideMultipleClassInfo@@SAPAU_object@@PAU2@J@Z?SetScriptSite@PyGActiveScript@@MAGJPAUIActiveScriptSite@@@Z?SetScriptSite@PyIActiveScript@@SAPAU_object@@PAU2@0@Z?SetScriptState@PyGActiveScript@@MAGJW4tagSCRIPTSTATE@@@Z?SetScriptState@PyIActiveScript@@SAPAU_object@@PAU2@0@Z?ThisAsIID@PyGActiveScript@@MAEPAXU_GUID@@@Z?ThisAsIID@PyGActiveScriptError@@MAEPAXU_GUID@@@Z?ThisAsIID@PyGActiveScriptParse@@MAEPAXU_GUID@@@Z?ThisAsIID@PyGActiveScriptSite@@MAEPAXU_GUID@@@Z?ThisAsIID@PyGObjectSafety@@MAEPAXU_GUID@@@Z_PyInit_axscript__IMPORT_DESCRIPTOR_axscript__NULL_IMPORT_DESCRIPTOR__imp_??0PyGActiveScript@@IAE@PAU_object@@@Z__imp_??0PyGActiveScript@@QAE@$$QAV0@@Z__imp_??0PyGActiveScript@@QAE@ABV0@@Z__imp_??0PyGActiveScriptError@@IAE@PAU_object@@@Z__imp_??0PyGActiveScriptError@@QAE@$$QAV0@@Z__imp_??0PyGActiveScriptError@@QAE@ABV0@@Z__imp_??0PyGActiveScriptParse@@AAE@PAU_object@@@Z__imp_??0PyGActiveScriptParse@@QAE@$$QAV0@@Z__imp_??0PyGActiveScriptParse@@QAE@ABV0@@Z__imp_??0PyGActiveScriptSite@@IAE@PAU_object@@@Z__imp_??0PyGActiveScriptSite@@QAE@$$QAV0@@Z__imp_??0PyGActiveScriptSite@@QAE@ABV0@@Z__imp_??0PyGObjectSafety@@AAE@PAU_object@@@Z__imp_??0PyGObjectSafety@@QAE@$$QAV0@@Z__imp_??0PyGObjectSafety@@QAE@ABV0@@Z__imp_??0PyIActiveScript@@IAE@PAUIUnknown@@@Z__imp_??0PyIActiveScript@@QAE@ABV0@@Z__imp_??0PyIActiveScriptError@@IAE@PAUIUnknown@@@Z__imp_??0PyIActiveScriptError@@QAE@ABV0@@Z__imp_??0PyIActiveScriptParse@@IAE@PAUIUnknown@@@Z__imp_??0PyIActiveScriptParse@@QAE@ABV0@@Z__imp_??0PyIActiveScriptSite@@IAE@PAUIUnknown@@@Z__imp_??0PyIActiveScriptSite@@QAE@ABV0@@Z__imp_??0PyIObjectSafety@@IAE@PAUIUnknown@@@Z__imp_??0PyIObjectSafety@@QAE@ABV0@@Z__imp_??0PyIProvideMultipleClassInfo@@IAE@PAUIUnknown@@@Z__imp_??0PyIProvideMultipleClassInfo@@QAE@ABV0@@Z__imp_??1PyGActiveScript@@UAE@XZ__imp_??1PyGActiveScriptError@@UAE@XZ__imp_??1PyGActiveScriptParse@@UAE@XZ__imp_??1PyGActiveScriptSite@@UAE@XZ__imp_??1PyGObjectSafety@@UAE@XZ__imp_??1PyIActiveScript@@MAE@XZ__imp_??1PyIActiveScriptError@@MAE@XZ__imp_??1PyIActiveScriptParse@@MAE@XZ__imp_??1PyIActiveScriptSite@@MAE@XZ__imp_??1PyIObjectSafety@@MAE@XZ__imp_??1PyIProvideMultipleClassInfo@@MAE@XZ__imp_??4PyGActiveScript@@QAEAAV0@$$QAV0@@Z__imp_??4PyGActiveScript@@QAEAAV0@ABV0@@Z__imp_??4PyGActiveScriptError@@QAEAAV0@$$QAV0@@Z__imp_??4PyGActiveScriptError@@QAEAAV0@ABV0@@Z__imp_??4PyGActiveScriptParse@@QAEAAV0@$$QAV0@@Z__imp_??4PyGActiveScriptParse@@QAEAAV0@ABV0@@Z__imp_??4PyGActiveScriptSite@@QAEAAV0@$$QAV0@@Z__imp_??4PyGActiveScriptSite@@QAEAAV0@ABV0@@Z__imp_??4PyGObjectSafety@@QAEAAV0@$$QAV0@@Z__imp_??4PyGObjectSafety@@QAEAAV0@ABV0@@Z__imp_??4PyIActiveScript@@QAEAAV0@ABV0@@Z__imp_??4PyIActiveScriptError@@QAEAAV0@ABV0@@Z__imp_??4PyIActiveScriptParse@@QAEAAV0@ABV0@@Z__imp_??4PyIActiveScriptSite@@QAEAAV0@ABV0@@Z__imp_??4PyIObjectSafety@@QAEAAV0@ABV0@@Z__imp_??4PyIProvideMultipleClassInfo@@QAEAAV0@ABV0@@Z__imp_??_7PyGActiveScript@@6B@__imp_??_7PyGActiveScript@@6BIDispatchEx@@@__imp_??_7PyGActiveScript@@6BIInternalUnwrapPythonObject@@@__imp_??_7PyGActiveScript@@6BISupportErrorInfo@@@__imp_??_7PyGActiveScriptError@@6B@__imp_??_7PyGActiveScriptError@@6BIDispatchEx@@@__imp_??_7PyGActiveScriptError@@6BIInternalUnwrapPythonObject@@@__imp_??_7PyGActiveScriptError@@6BISupportErrorInfo@@@__imp_??_7PyGActiveScriptParse@@6B@__imp_??_7PyGActiveScriptParse@@6BIDispatchEx@@@__imp_??_7PyGActiveScriptParse@@6BIInternalUnwrapPythonObject@@@__imp_??_7PyGActiveScriptParse@@6BISupportErrorInfo@@@__imp_??_7PyGActiveScriptSite@@6B@__imp_??_7PyGActiveScriptSite@@6BIDispatchEx@@@__imp_??_7PyGActiveScriptSite@@6BIInternalUnwrapPythonObject@@@__imp_??_7PyGActiveScriptSite@@6BISupportErrorInfo@@@__imp_??_7PyGObjectSafety@@6B@__imp_??_7PyGObjectSafety@@6BIDispatchEx@@@__imp_??_7PyGObjectSafety@@6BIInternalUnwrapPythonObject@@@__imp_??_7PyGObjectSafety@@6BISupportErrorInfo@@@__imp_??_7PyIActiveScript@@6B@__imp_??_7PyIActiveScriptError@@6B@__imp_??_7PyIActiveScriptParse@@6B@__imp_??_7PyIActiveScriptSite@@6B@__imp_??_7PyIObjectSafety@@6B@__imp_??_7PyIProvideMultipleClassInfo@@6B@__imp_?AddNamedItem@PyGActiveScript@@MAGJPB_WK@Z__imp_?AddNamedItem@PyIActiveScript@@SAPAU_object@@PAU2@0@Z__imp_?AddRef@PyGActiveScript@@MAGKXZ__imp_?AddRef@PyGActiveScriptError@@MAGKXZ__imp_?AddRef@PyGActiveScriptParse@@MAGKXZ__imp_?AddRef@PyGActiveScriptSite@@MAGKXZ__imp_?AddRef@PyGObjectSafety@@MAGKXZ__imp_?AddScriptlet@PyGActiveScriptParse@@MAGJPB_W00000KKKPAPA_WPAUtagEXCEPINFO@@@Z__imp_?AddScriptlet@PyIActiveScriptParse@@SAPAU_object@@PAU2@0@Z__imp_?AddTypeLib@PyGActiveScript@@MAGJABU_GUID@@KKK@Z__imp_?AddTypeLib@PyIActiveScript@@SAPAU_object@@PAU2@0@Z__imp_?Clone@PyGActiveScript@@MAGJPAPAUIActiveScript@@@Z__imp_?Clone@PyIActiveScript@@SAPAU_object@@PAU2@0@Z__imp_?Close@PyGActiveScript@@MAGJXZ__imp_?Close@PyIActiveScript@@SAPAU_object@@PAU2@0@Z__imp_?GetCurrentScriptThreadID@PyGActiveScript@@MAGJPAK@Z__imp_?GetCurrentScriptThreadID@PyIActiveScript@@SAPAU_object@@PAU2@0@Z__imp_?GetDocVersionString@PyGActiveScriptSite@@MAGJPAPA_W@Z__imp_?GetDocVersionString@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Z__imp_?GetExceptionInfo@PyGActiveScriptError@@MAGJPAUtagEXCEPINFO@@@Z__imp_?GetExceptionInfo@PyIActiveScriptError@@SAPAU_object@@PAU2@0@Z__imp_?GetI@PyIActiveScript@@SAPAUIActiveScript@@PAU_object@@@Z__imp_?GetI@PyIActiveScriptError@@SAPAUIActiveScriptError@@PAU_object@@@Z__imp_?GetI@PyIActiveScriptParse@@SAPAUIActiveScriptParse32@@PAU_object@@@Z__imp_?GetI@PyIActiveScriptSite@@SAPAUIActiveScriptSite@@PAU_object@@@Z__imp_?GetI@PyIObjectSafety@@SAPAUIObjectSafety@@PAU_object@@@Z__imp_?GetI@PyIProvideMultipleClassInfo@@SAPAUIProvideMultipleClassInfo@@PAU_object@@@Z__imp_?GetIID@PyGActiveScript@@MAE?AU_GUID@@XZ__imp_?GetIID@PyGActiveScriptError@@MAE?AU_GUID@@XZ__imp_?GetIID@PyGActiveScriptParse@@MAE?AU_GUID@@XZ__imp_?GetIID@PyGActiveScriptSite@@MAE?AU_GUID@@XZ__imp_?GetIID@PyGObjectSafety@@MAE?AU_GUID@@XZ__imp_?GetInfoOfIndex@PyIProvideMultipleClassInfo@@SAPAU_object@@PAU2@0@Z__imp_?GetInterfaceSafetyOptions@PyGObjectSafety@@MAGJABU_GUID@@PAK1@Z__imp_?GetInterfaceSafetyOptions@PyIObjectSafety@@SAPAU_object@@PAU2@0@Z__imp_?GetItemInfo@PyGActiveScriptSite@@MAGJPB_WKPAPAUIUnknown@@PAPAUITypeInfo@@@Z__imp_?GetItemInfo@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Z__imp_?GetLCID@PyGActiveScriptSite@@MAGJPAK@Z__imp_?GetLCID@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Z__imp_?GetMultiTypeInfoCount@PyIProvideMultipleClassInfo@@SAPAU_object@@PAU2@0@Z__imp_?GetScriptDispatch@PyGActiveScript@@MAGJPB_WPAPAUIDispatch@@@Z__imp_?GetScriptDispatch@PyIActiveScript@@SAPAU_object@@PAU2@0@Z__imp_?GetScriptSite@PyGActiveScript@@MAGJABU_GUID@@PAPAX@Z__imp_?GetScriptSite@PyIActiveScript@@SAPAU_object@@PAU2@0@Z__imp_?GetScriptState@PyGActiveScript@@MAGJPAW4tagSCRIPTSTATE@@@Z__imp_?GetScriptState@PyIActiveScript@@SAPAU_object@@PAU2@0@Z__imp_?GetScriptThreadID@PyGActiveScript@@MAGJKPAK@Z__imp_?GetScriptThreadID@PyIActiveScript@@SAPAU_object@@PAU2@0@Z__imp_?GetScriptThreadState@PyGActiveScript@@MAGJKPAW4tagSCRIPTTHREADSTATE@@@Z__imp_?GetScriptThreadState@PyIActiveScript@@SAPAU_object@@PAU2@0@Z__imp_?GetSourceLineText@PyGActiveScriptError@@MAGJPAPA_W@Z__imp_?GetSourceLineText@PyIActiveScriptError@@SAPAU_object@@PAU2@0@Z__imp_?GetSourcePosition@PyGActiveScriptError@@MAGJPAK0PAJ@Z__imp_?GetSourcePosition@PyIActiveScriptError@@SAPAU_object@@PAU2@0@Z__imp_?InitNew@PyGActiveScriptParse@@MAGJXZ__imp_?InitNew@PyIActiveScriptParse@@SAPAU_object@@PAU2@0@Z__imp_?InterruptScriptThread@PyGActiveScript@@MAGJKPBUtagEXCEPINFO@@K@Z__imp_?InterruptScriptThread@PyIActiveScript@@SAPAU_object@@PAU2@0@Z__imp_?OnEnterScript@PyGActiveScriptSite@@MAGJXZ__imp_?OnEnterScript@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Z__imp_?OnLeaveScript@PyGActiveScriptSite@@MAGJXZ__imp_?OnLeaveScript@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Z__imp_?OnScriptError@PyGActiveScriptSite@@MAGJPAUIActiveScriptError@@@Z__imp_?OnScriptError@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Z__imp_?OnScriptTerminate@PyGActiveScriptSite@@MAGJPBUtagVARIANT@@PBUtagEXCEPINFO@@@Z__imp_?OnScriptTerminate@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Z__imp_?OnStateChange@PyGActiveScriptSite@@MAGJW4tagSCRIPTSTATE@@@Z__imp_?OnStateChange@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Z__imp_?ParseScriptText@PyGActiveScriptParse@@MAGJPB_W0PAUIUnknown@@0KKKPAUtagVARIANT@@PAUtagEXCEPINFO@@@Z__imp_?ParseScriptText@PyIActiveScriptParse@@SAPAU_object@@PAU2@0@Z__imp_?PyGatewayConstruct@PyGActiveScript@@SAJPAU_object@@PAVPyGatewayBase@@PAPAXABU_GUID@@@Z__imp_?PyGatewayConstruct@PyGActiveScriptError@@SAJPAU_object@@PAVPyGatewayBase@@PAPAXABU_GUID@@@Z__imp_?PyGatewayConstruct@PyGActiveScriptParse@@SAJPAU_object@@PAVPyGatewayBase@@PAPAXABU_GUID@@@Z__imp_?PyGatewayConstruct@PyGActiveScriptSite@@SAJPAU_object@@PAVPyGatewayBase@@PAPAXABU_GUID@@@Z__imp_?PyGatewayConstruct@PyGObjectSafety@@SAJPAU_object@@PAVPyGatewayBase@@PAPAXABU_GUID@@@Z__imp_?PyObConstruct@PyIActiveScript@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyIActiveScriptError@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyIActiveScriptParse@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyIActiveScriptSite@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyIObjectSafety@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyIProvideMultipleClassInfo@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?QueryInterface@PyGActiveScript@@MAGJABU_GUID@@PAPAX@Z__imp_?QueryInterface@PyGActiveScriptError@@MAGJABU_GUID@@PAPAX@Z__imp_?QueryInterface@PyGActiveScriptParse@@MAGJABU_GUID@@PAPAX@Z__imp_?QueryInterface@PyGActiveScriptSite@@MAGJABU_GUID@@PAPAX@Z__imp_?QueryInterface@PyGObjectSafety@@MAGJABU_GUID@@PAPAX@Z__imp_?Release@PyGActiveScript@@MAGKXZ__imp_?Release@PyGActiveScriptError@@MAGKXZ__imp_?Release@PyGActiveScriptParse@@MAGKXZ__imp_?Release@PyGActiveScriptSite@@MAGKXZ__imp_?Release@PyGObjectSafety@@MAGKXZ__imp_?SetInterfaceSafetyOptions@PyGObjectSafety@@MAGJABU_GUID@@KK@Z__imp_?SetInterfaceSafetyOptions@PyIObjectSafety@@SAPAU_object@@PAU2@0@Z__imp_?SetPythonCOMError@PyIActiveScript@@SAPAU_object@@PAU2@J@Z__imp_?SetPythonCOMError@PyIActiveScriptError@@SAPAU_object@@PAU2@J@Z__imp_?SetPythonCOMError@PyIActiveScriptParse@@SAPAU_object@@PAU2@J@Z__imp_?SetPythonCOMError@PyIActiveScriptSite@@SAPAU_object@@PAU2@J@Z__imp_?SetPythonCOMError@PyIObjectSafety@@SAPAU_object@@PAU2@J@Z__imp_?SetPythonCOMError@PyIProvideMultipleClassInfo@@SAPAU_object@@PAU2@J@Z__imp_?SetScriptSite@PyGActiveScript@@MAGJPAUIActiveScriptSite@@@Z__imp_?SetScriptSite@PyIActiveScript@@SAPAU_object@@PAU2@0@Z__imp_?SetScriptState@PyGActiveScript@@MAGJW4tagSCRIPTSTATE@@@Z__imp_?SetScriptState@PyIActiveScript@@SAPAU_object@@PAU2@0@Z__imp_?ThisAsIID@PyGActiveScript@@MAEPAXU_GUID@@@Z__imp_?ThisAsIID@PyGActiveScriptError@@MAEPAXU_GUID@@@Z__imp_?ThisAsIID@PyGActiveScriptParse@@MAEPAXU_GUID@@@Z__imp_?ThisAsIID@PyGActiveScriptSite@@MAEPAXU_GUID@@@Z__imp_?ThisAsIID@PyGObjectSafety@@MAEPAXU_GUID@@@Z__imp_?type@PyIActiveScript@@2VPyComTypeObject@@A__imp_?type@PyIActiveScriptError@@2VPyComTypeObject@@A__imp_?type@PyIActiveScriptParse@@2VPyComTypeObject@@A__imp_?type@PyIActiveScriptSite@@2VPyComTypeObject@@A__imp_?type@PyIObjectSafety@@2VPyComTypeObject@@A__imp_?type@PyIProvideMultipleClassInfo@@2VPyComTypeObject@@A__imp__PyInit_axscriptaxscript_NULL_THUNK_DATA axscript.pyd/ 1605328465 0 498 ` LQ^_.debug$SB@B.idata$2@0.idata$6@  axscript.pyd'^Microsoft (R) LINK axscript.pyd@comp.id^.idata$2@h.idata$6.idata$4@h.idata$5@h!:T__IMPORT_DESCRIPTOR_axscript__NULL_IMPORT_DESCRIPTORaxscript_NULL_THUNK_DATAaxscript.pyd/ 1605328465 0 251 ` LQ^_.debug$SBd@B.idata$3@0 axscript.pyd'^Microsoft (R) LINK@comp.id^__NULL_IMPORT_DESCRIPTOR axscript.pyd/ 1605328465 0 280 ` LQ^_.debug$SB@B.idata$5@0.idata$4@0 axscript.pyd'^Microsoft (R) LINK@comp.id^axscript_NULL_THUNK_DATAaxscript.pyd/ 1605328465 0 72 ` LQ^_4??0PyGActiveScript@@IAE@PAU_object@@@Zaxscript.pydaxscript.pyd/ 1605328465 0 67 ` LQ^_/??0PyGActiveScript@@QAE@$$QAV0@@Zaxscript.pyd axscript.pyd/ 1605328465 0 65 ` LQ^_-??0PyGActiveScript@@QAE@ABV0@@Zaxscript.pyd axscript.pyd/ 1605328465 0 77 ` LQ^_9??0PyGActiveScriptError@@IAE@PAU_object@@@Zaxscript.pyd axscript.pyd/ 1605328465 0 72 ` LQ^_4??0PyGActiveScriptError@@QAE@$$QAV0@@Zaxscript.pydaxscript.pyd/ 1605328465 0 70 ` LQ^_2??0PyGActiveScriptError@@QAE@ABV0@@Zaxscript.pydaxscript.pyd/ 1605328465 0 77 ` LQ^_9??0PyGActiveScriptParse@@AAE@PAU_object@@@Zaxscript.pyd axscript.pyd/ 1605328465 0 72 ` LQ^_4??0PyGActiveScriptParse@@QAE@$$QAV0@@Zaxscript.pydaxscript.pyd/ 1605328465 0 70 ` LQ^_2??0PyGActiveScriptParse@@QAE@ABV0@@Zaxscript.pydaxscript.pyd/ 1605328465 0 76 ` LQ^_8 ??0PyGActiveScriptSite@@IAE@PAU_object@@@Zaxscript.pydaxscript.pyd/ 1605328465 0 71 ` LQ^_3 ??0PyGActiveScriptSite@@QAE@$$QAV0@@Zaxscript.pyd axscript.pyd/ 1605328465 0 69 ` LQ^_1 ??0PyGActiveScriptSite@@QAE@ABV0@@Zaxscript.pyd axscript.pyd/ 1605328465 0 72 ` LQ^_4 ??0PyGObjectSafety@@AAE@PAU_object@@@Zaxscript.pydaxscript.pyd/ 1605328465 0 67 ` LQ^_/ ??0PyGObjectSafety@@QAE@$$QAV0@@Zaxscript.pyd axscript.pyd/ 1605328465 0 65 ` LQ^_-??0PyGObjectSafety@@QAE@ABV0@@Zaxscript.pyd axscript.pyd/ 1605328465 0 73 ` LQ^_5??0PyIActiveScript@@IAE@PAUIUnknown@@@Zaxscript.pyd axscript.pyd/ 1605328465 0 65 ` LQ^_-??0PyIActiveScript@@QAE@ABV0@@Zaxscript.pyd axscript.pyd/ 1605328465 0 78 ` LQ^_:??0PyIActiveScriptError@@IAE@PAUIUnknown@@@Zaxscript.pydaxscript.pyd/ 1605328465 0 70 ` LQ^_2??0PyIActiveScriptError@@QAE@ABV0@@Zaxscript.pydaxscript.pyd/ 1605328465 0 78 ` LQ^_:??0PyIActiveScriptParse@@IAE@PAUIUnknown@@@Zaxscript.pydaxscript.pyd/ 1605328465 0 70 ` LQ^_2??0PyIActiveScriptParse@@QAE@ABV0@@Zaxscript.pydaxscript.pyd/ 1605328465 0 77 ` LQ^_9??0PyIActiveScriptSite@@IAE@PAUIUnknown@@@Zaxscript.pyd axscript.pyd/ 1605328465 0 69 ` LQ^_1??0PyIActiveScriptSite@@QAE@ABV0@@Zaxscript.pyd axscript.pyd/ 1605328465 0 73 ` LQ^_5??0PyIObjectSafety@@IAE@PAUIUnknown@@@Zaxscript.pyd axscript.pyd/ 1605328465 0 65 ` LQ^_-??0PyIObjectSafety@@QAE@ABV0@@Zaxscript.pyd axscript.pyd/ 1605328465 0 85 ` LQ^_A??0PyIProvideMultipleClassInfo@@IAE@PAUIUnknown@@@Zaxscript.pyd axscript.pyd/ 1605328465 0 77 ` LQ^_9??0PyIProvideMultipleClassInfo@@QAE@ABV0@@Zaxscript.pyd axscript.pyd/ 1605328465 0 60 ` LQ^_(??1PyGActiveScript@@UAE@XZaxscript.pydaxscript.pyd/ 1605328465 0 65 ` LQ^_-??1PyGActiveScriptError@@UAE@XZaxscript.pyd axscript.pyd/ 1605328465 0 65 ` LQ^_-??1PyGActiveScriptParse@@UAE@XZaxscript.pyd axscript.pyd/ 1605328465 0 64 ` LQ^_,??1PyGActiveScriptSite@@UAE@XZaxscript.pydaxscript.pyd/ 1605328465 0 60 ` LQ^_(??1PyGObjectSafety@@UAE@XZaxscript.pydaxscript.pyd/ 1605328465 0 60 ` LQ^_( ??1PyIActiveScript@@MAE@XZaxscript.pydaxscript.pyd/ 1605328465 0 65 ` LQ^_-!??1PyIActiveScriptError@@MAE@XZaxscript.pyd axscript.pyd/ 1605328465 0 65 ` LQ^_-"??1PyIActiveScriptParse@@MAE@XZaxscript.pyd axscript.pyd/ 1605328465 0 64 ` LQ^_,#??1PyIActiveScriptSite@@MAE@XZaxscript.pydaxscript.pyd/ 1605328465 0 60 ` LQ^_($??1PyIObjectSafety@@MAE@XZaxscript.pydaxscript.pyd/ 1605328465 0 72 ` LQ^_4%??1PyIProvideMultipleClassInfo@@MAE@XZaxscript.pydaxscript.pyd/ 1605328465 0 71 ` LQ^_3&??4PyGActiveScript@@QAEAAV0@$$QAV0@@Zaxscript.pyd axscript.pyd/ 1605328465 0 69 ` LQ^_1'??4PyGActiveScript@@QAEAAV0@ABV0@@Zaxscript.pyd axscript.pyd/ 1605328465 0 76 ` LQ^_8(??4PyGActiveScriptError@@QAEAAV0@$$QAV0@@Zaxscript.pydaxscript.pyd/ 1605328465 0 74 ` LQ^_6)??4PyGActiveScriptError@@QAEAAV0@ABV0@@Zaxscript.pydaxscript.pyd/ 1605328465 0 76 ` LQ^_8*??4PyGActiveScriptParse@@QAEAAV0@$$QAV0@@Zaxscript.pydaxscript.pyd/ 1605328465 0 74 ` LQ^_6+??4PyGActiveScriptParse@@QAEAAV0@ABV0@@Zaxscript.pydaxscript.pyd/ 1605328465 0 75 ` LQ^_7,??4PyGActiveScriptSite@@QAEAAV0@$$QAV0@@Zaxscript.pyd axscript.pyd/ 1605328465 0 73 ` LQ^_5-??4PyGActiveScriptSite@@QAEAAV0@ABV0@@Zaxscript.pyd axscript.pyd/ 1605328465 0 71 ` LQ^_3.??4PyGObjectSafety@@QAEAAV0@$$QAV0@@Zaxscript.pyd axscript.pyd/ 1605328465 0 69 ` LQ^_1/??4PyGObjectSafety@@QAEAAV0@ABV0@@Zaxscript.pyd axscript.pyd/ 1605328465 0 69 ` LQ^_10??4PyIActiveScript@@QAEAAV0@ABV0@@Zaxscript.pyd axscript.pyd/ 1605328465 0 74 ` LQ^_61??4PyIActiveScriptError@@QAEAAV0@ABV0@@Zaxscript.pydaxscript.pyd/ 1605328465 0 74 ` LQ^_62??4PyIActiveScriptParse@@QAEAAV0@ABV0@@Zaxscript.pydaxscript.pyd/ 1605328465 0 73 ` LQ^_53??4PyIActiveScriptSite@@QAEAAV0@ABV0@@Zaxscript.pyd axscript.pyd/ 1605328465 0 69 ` LQ^_14??4PyIObjectSafety@@QAEAAV0@ABV0@@Zaxscript.pyd axscript.pyd/ 1605328465 0 81 ` LQ^_=5??4PyIProvideMultipleClassInfo@@QAEAAV0@ABV0@@Zaxscript.pyd axscript.pyd/ 1605328465 0 58 ` LQ^_&6??_7PyGActiveScript@@6B@axscript.pydaxscript.pyd/ 1605328465 0 71 ` LQ^_37??_7PyGActiveScript@@6BIDispatchEx@@@axscript.pyd axscript.pyd/ 1605328465 0 87 ` LQ^_C8??_7PyGActiveScript@@6BIInternalUnwrapPythonObject@@@axscript.pyd axscript.pyd/ 1605328465 0 77 ` LQ^_99??_7PyGActiveScript@@6BISupportErrorInfo@@@axscript.pyd axscript.pyd/ 1605328465 0 63 ` LQ^_+:??_7PyGActiveScriptError@@6B@axscript.pyd axscript.pyd/ 1605328465 0 76 ` LQ^_8;??_7PyGActiveScriptError@@6BIDispatchEx@@@axscript.pydaxscript.pyd/ 1605328465 0 92 ` LQ^_H<??_7PyGActiveScriptError@@6BIInternalUnwrapPythonObject@@@axscript.pydaxscript.pyd/ 1605328465 0 82 ` LQ^_>=??_7PyGActiveScriptError@@6BISupportErrorInfo@@@axscript.pydaxscript.pyd/ 1605328465 0 63 ` LQ^_+>??_7PyGActiveScriptParse@@6B@axscript.pyd axscript.pyd/ 1605328465 0 76 ` LQ^_8???_7PyGActiveScriptParse@@6BIDispatchEx@@@axscript.pydaxscript.pyd/ 1605328465 0 92 ` LQ^_H@??_7PyGActiveScriptParse@@6BIInternalUnwrapPythonObject@@@axscript.pydaxscript.pyd/ 1605328465 0 82 ` LQ^_>A??_7PyGActiveScriptParse@@6BISupportErrorInfo@@@axscript.pydaxscript.pyd/ 1605328465 0 62 ` LQ^_*B??_7PyGActiveScriptSite@@6B@axscript.pydaxscript.pyd/ 1605328465 0 75 ` LQ^_7C??_7PyGActiveScriptSite@@6BIDispatchEx@@@axscript.pyd axscript.pyd/ 1605328465 0 91 ` LQ^_GD??_7PyGActiveScriptSite@@6BIInternalUnwrapPythonObject@@@axscript.pyd axscript.pyd/ 1605328465 0 81 ` LQ^_=E??_7PyGActiveScriptSite@@6BISupportErrorInfo@@@axscript.pyd axscript.pyd/ 1605328465 0 58 ` LQ^_&F??_7PyGObjectSafety@@6B@axscript.pydaxscript.pyd/ 1605328465 0 71 ` LQ^_3G??_7PyGObjectSafety@@6BIDispatchEx@@@axscript.pyd axscript.pyd/ 1605328465 0 87 ` LQ^_CH??_7PyGObjectSafety@@6BIInternalUnwrapPythonObject@@@axscript.pyd axscript.pyd/ 1605328465 0 77 ` LQ^_9I??_7PyGObjectSafety@@6BISupportErrorInfo@@@axscript.pyd axscript.pyd/ 1605328465 0 58 ` LQ^_&J??_7PyIActiveScript@@6B@axscript.pydaxscript.pyd/ 1605328465 0 63 ` LQ^_+K??_7PyIActiveScriptError@@6B@axscript.pyd axscript.pyd/ 1605328465 0 63 ` LQ^_+L??_7PyIActiveScriptParse@@6B@axscript.pyd axscript.pyd/ 1605328465 0 62 ` LQ^_*M??_7PyIActiveScriptSite@@6B@axscript.pydaxscript.pyd/ 1605328465 0 58 ` LQ^_&N??_7PyIObjectSafety@@6B@axscript.pydaxscript.pyd/ 1605328465 0 70 ` LQ^_2O??_7PyIProvideMultipleClassInfo@@6B@axscript.pydaxscript.pyd/ 1605328465 0 76 ` LQ^_8P?AddNamedItem@PyGActiveScript@@MAGJPB_WK@Zaxscript.pydaxscript.pyd/ 1605328465 0 87 ` LQ^_CQ?AddNamedItem@PyIActiveScript@@SAPAU_object@@PAU2@0@Zaxscript.pyd axscript.pyd/ 1605328465 0 65 ` LQ^_-R?AddRef@PyGActiveScript@@MAGKXZaxscript.pyd axscript.pyd/ 1605328465 0 70 ` LQ^_2S?AddRef@PyGActiveScriptError@@MAGKXZaxscript.pydaxscript.pyd/ 1605328465 0 70 ` LQ^_2T?AddRef@PyGActiveScriptParse@@MAGKXZaxscript.pydaxscript.pyd/ 1605328465 0 69 ` LQ^_1U?AddRef@PyGActiveScriptSite@@MAGKXZaxscript.pyd axscript.pyd/ 1605328465 0 65 ` LQ^_-V?AddRef@PyGObjectSafety@@MAGKXZaxscript.pyd axscript.pyd/ 1605328465 0 111 ` LQ^_[W?AddScriptlet@PyGActiveScriptParse@@MAGJPB_W00000KKKPAPA_WPAUtagEXCEPINFO@@@Zaxscript.pyd axscript.pyd/ 1605328465 0 92 ` LQ^_HX?AddScriptlet@PyIActiveScriptParse@@SAPAU_object@@PAU2@0@Zaxscript.pydaxscript.pyd/ 1605328465 0 82 ` LQ^_>Y?AddTypeLib@PyGActiveScript@@MAGJABU_GUID@@KKK@Zaxscript.pydaxscript.pyd/ 1605328465 0 85 ` LQ^_AZ?AddTypeLib@PyIActiveScript@@SAPAU_object@@PAU2@0@Zaxscript.pyd axscript.pyd/ 1605328465 0 84 ` LQ^_@[?Clone@PyGActiveScript@@MAGJPAPAUIActiveScript@@@Zaxscript.pydaxscript.pyd/ 1605328465 0 80 ` LQ^_<\?Clone@PyIActiveScript@@SAPAU_object@@PAU2@0@Zaxscript.pydaxscript.pyd/ 1605328465 0 64 ` LQ^_,]?Close@PyGActiveScript@@MAGJXZaxscript.pydaxscript.pyd/ 1605328465 0 80 ` LQ^_<^?Close@PyIActiveScript@@SAPAU_object@@PAU2@0@Zaxscript.pydaxscript.pyd/ 1605328465 0 86 ` LQ^_B_?GetCurrentScriptThreadID@PyGActiveScript@@MAGJPAK@Zaxscript.pydaxscript.pyd/ 1605328465 0 99 ` LQ^_O`?GetCurrentScriptThreadID@PyIActiveScript@@SAPAU_object@@PAU2@0@Zaxscript.pyd axscript.pyd/ 1605328465 0 88 ` LQ^_Da?GetDocVersionString@PyGActiveScriptSite@@MAGJPAPA_W@Zaxscript.pydaxscript.pyd/ 1605328465 0 98 ` LQ^_Nb?GetDocVersionString@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Zaxscript.pydaxscript.pyd/ 1605328465 0 97 ` LQ^_Mc?GetExceptionInfo@PyGActiveScriptError@@MAGJPAUtagEXCEPINFO@@@Zaxscript.pyd axscript.pyd/ 1605328465 0 96 ` LQ^_Ld?GetExceptionInfo@PyIActiveScriptError@@SAPAU_object@@PAU2@0@Zaxscript.pydaxscript.pyd/ 1605328465 0 91 ` LQ^_Ge?GetI@PyIActiveScript@@SAPAUIActiveScript@@PAU_object@@@Zaxscript.pyd axscript.pyd/ 1605328465 0 101 ` LQ^_Qf?GetI@PyIActiveScriptError@@SAPAUIActiveScriptError@@PAU_object@@@Zaxscript.pyd axscript.pyd/ 1605328465 0 103 ` LQ^_Sg?GetI@PyIActiveScriptParse@@SAPAUIActiveScriptParse32@@PAU_object@@@Zaxscript.pyd axscript.pyd/ 1605328465 0 99 ` LQ^_Oh?GetI@PyIActiveScriptSite@@SAPAUIActiveScriptSite@@PAU_object@@@Zaxscript.pyd axscript.pyd/ 1605328465 0 91 ` LQ^_Gi?GetI@PyIObjectSafety@@SAPAUIObjectSafety@@PAU_object@@@Zaxscript.pyd axscript.pyd/ 1605328465 0 115 ` LQ^__j?GetI@PyIProvideMultipleClassInfo@@SAPAUIProvideMultipleClassInfo@@PAU_object@@@Zaxscript.pyd axscript.pyd/ 1605328465 0 74 ` LQ^_6k?GetIID@PyGActiveScript@@MAE?AU_GUID@@XZaxscript.pydaxscript.pyd/ 1605328465 0 79 ` LQ^_;l?GetIID@PyGActiveScriptError@@MAE?AU_GUID@@XZaxscript.pyd axscript.pyd/ 1605328465 0 79 ` LQ^_;m?GetIID@PyGActiveScriptParse@@MAE?AU_GUID@@XZaxscript.pyd axscript.pyd/ 1605328465 0 78 ` LQ^_:n?GetIID@PyGActiveScriptSite@@MAE?AU_GUID@@XZaxscript.pydaxscript.pyd/ 1605328465 0 74 ` LQ^_6o?GetIID@PyGObjectSafety@@MAE?AU_GUID@@XZaxscript.pydaxscript.pyd/ 1605328465 0 101 ` LQ^_Qp?GetInfoOfIndex@PyIProvideMultipleClassInfo@@SAPAU_object@@PAU2@0@Zaxscript.pyd axscript.pyd/ 1605328465 0 98 ` LQ^_Nq?GetInterfaceSafetyOptions@PyGObjectSafety@@MAGJABU_GUID@@PAK1@Zaxscript.pydaxscript.pyd/ 1605328465 0 100 ` LQ^_Pr?GetInterfaceSafetyOptions@PyIObjectSafety@@SAPAU_object@@PAU2@0@Zaxscript.pydaxscript.pyd/ 1605328465 0 110 ` LQ^_Zs?GetItemInfo@PyGActiveScriptSite@@MAGJPB_WKPAPAUIUnknown@@PAPAUITypeInfo@@@Zaxscript.pydaxscript.pyd/ 1605328465 0 90 ` LQ^_Ft?GetItemInfo@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Zaxscript.pydaxscript.pyd/ 1605328465 0 73 ` LQ^_5u?GetLCID@PyGActiveScriptSite@@MAGJPAK@Zaxscript.pyd axscript.pyd/ 1605328465 0 86 ` LQ^_Bv?GetLCID@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Zaxscript.pydaxscript.pyd/ 1605328465 0 108 ` LQ^_Xw?GetMultiTypeInfoCount@PyIProvideMultipleClassInfo@@SAPAU_object@@PAU2@0@Zaxscript.pydaxscript.pyd/ 1605328465 0 96 ` LQ^_Lx?GetScriptDispatch@PyGActiveScript@@MAGJPB_WPAPAUIDispatch@@@Zaxscript.pydaxscript.pyd/ 1605328465 0 92 ` LQ^_Hy?GetScriptDispatch@PyIActiveScript@@SAPAU_object@@PAU2@0@Zaxscript.pydaxscript.pyd/ 1605328465 0 87 ` LQ^_Cz?GetScriptSite@PyGActiveScript@@MAGJABU_GUID@@PAPAX@Zaxscript.pyd axscript.pyd/ 1605328465 0 88 ` LQ^_D{?GetScriptSite@PyIActiveScript@@SAPAU_object@@PAU2@0@Zaxscript.pydaxscript.pyd/ 1605328465 0 93 ` LQ^_I|?GetScriptState@PyGActiveScript@@MAGJPAW4tagSCRIPTSTATE@@@Zaxscript.pyd axscript.pyd/ 1605328465 0 89 ` LQ^_E}?GetScriptState@PyIActiveScript@@SAPAU_object@@PAU2@0@Zaxscript.pyd axscript.pyd/ 1605328465 0 80 ` LQ^_<~?GetScriptThreadID@PyGActiveScript@@MAGJKPAK@Zaxscript.pydaxscript.pyd/ 1605328465 0 92 ` LQ^_H?GetScriptThreadID@PyIActiveScript@@SAPAU_object@@PAU2@0@Zaxscript.pydaxscript.pyd/ 1605328465 0 106 ` LQ^_V?GetScriptThreadState@PyGActiveScript@@MAGJKPAW4tagSCRIPTTHREADSTATE@@@Zaxscript.pydaxscript.pyd/ 1605328465 0 95 ` LQ^_K?GetScriptThreadState@PyIActiveScript@@SAPAU_object@@PAU2@0@Zaxscript.pyd axscript.pyd/ 1605328465 0 87 ` LQ^_C?GetSourceLineText@PyGActiveScriptError@@MAGJPAPA_W@Zaxscript.pyd axscript.pyd/ 1605328465 0 97 ` LQ^_M?GetSourceLineText@PyIActiveScriptError@@SAPAU_object@@PAU2@0@Zaxscript.pyd axscript.pyd/ 1605328465 0 88 ` LQ^_D?GetSourcePosition@PyGActiveScriptError@@MAGJPAK0PAJ@Zaxscript.pydaxscript.pyd/ 1605328465 0 97 ` LQ^_M?GetSourcePosition@PyIActiveScriptError@@SAPAU_object@@PAU2@0@Zaxscript.pyd axscript.pyd/ 1605328465 0 71 ` LQ^_3?InitNew@PyGActiveScriptParse@@MAGJXZaxscript.pyd axscript.pyd/ 1605328465 0 87 ` LQ^_C?InitNew@PyIActiveScriptParse@@SAPAU_object@@PAU2@0@Zaxscript.pyd axscript.pyd/ 1605328465 0 99 ` LQ^_O?InterruptScriptThread@PyGActiveScript@@MAGJKPBUtagEXCEPINFO@@K@Zaxscript.pyd axscript.pyd/ 1605328465 0 96 ` LQ^_L?InterruptScriptThread@PyIActiveScript@@SAPAU_object@@PAU2@0@Zaxscript.pydaxscript.pyd/ 1605328465 0 76 ` LQ^_8?OnEnterScript@PyGActiveScriptSite@@MAGJXZaxscript.pydaxscript.pyd/ 1605328465 0 92 ` LQ^_H?OnEnterScript@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Zaxscript.pydaxscript.pyd/ 1605328465 0 76 ` LQ^_8?OnLeaveScript@PyGActiveScriptSite@@MAGJXZaxscript.pydaxscript.pyd/ 1605328465 0 92 ` LQ^_H?OnLeaveScript@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Zaxscript.pydaxscript.pyd/ 1605328465 0 99 ` LQ^_O?OnScriptError@PyGActiveScriptSite@@MAGJPAUIActiveScriptError@@@Zaxscript.pyd axscript.pyd/ 1605328465 0 92 ` LQ^_H?OnScriptError@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Zaxscript.pydaxscript.pyd/ 1605328465 0 112 ` LQ^_\?OnScriptTerminate@PyGActiveScriptSite@@MAGJPBUtagVARIANT@@PBUtagEXCEPINFO@@@Zaxscript.pydaxscript.pyd/ 1605328465 0 96 ` LQ^_L?OnScriptTerminate@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Zaxscript.pydaxscript.pyd/ 1605328465 0 94 ` LQ^_J?OnStateChange@PyGActiveScriptSite@@MAGJW4tagSCRIPTSTATE@@@Zaxscript.pydaxscript.pyd/ 1605328465 0 92 ` LQ^_H?OnStateChange@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Zaxscript.pydaxscript.pyd/ 1605328465 0 133 ` LQ^_q?ParseScriptText@PyGActiveScriptParse@@MAGJPB_W0PAUIUnknown@@0KKKPAUtagVARIANT@@PAUtagEXCEPINFO@@@Zaxscript.pyd axscript.pyd/ 1605328465 0 95 ` LQ^_K?ParseScriptText@PyIActiveScriptParse@@SAPAU_object@@PAU2@0@Zaxscript.pyd axscript.pyd/ 1605328465 0 121 ` LQ^_e?PyGatewayConstruct@PyGActiveScript@@SAJPAU_object@@PAVPyGatewayBase@@PAPAXABU_GUID@@@Zaxscript.pyd axscript.pyd/ 1605328465 0 126 ` LQ^_j?PyGatewayConstruct@PyGActiveScriptError@@SAJPAU_object@@PAVPyGatewayBase@@PAPAXABU_GUID@@@Zaxscript.pydaxscript.pyd/ 1605328465 0 126 ` LQ^_j?PyGatewayConstruct@PyGActiveScriptParse@@SAJPAU_object@@PAVPyGatewayBase@@PAPAXABU_GUID@@@Zaxscript.pydaxscript.pyd/ 1605328465 0 125 ` LQ^_i?PyGatewayConstruct@PyGActiveScriptSite@@SAJPAU_object@@PAVPyGatewayBase@@PAPAXABU_GUID@@@Zaxscript.pyd axscript.pyd/ 1605328465 0 121 ` LQ^_e?PyGatewayConstruct@PyGObjectSafety@@SAJPAU_object@@PAVPyGatewayBase@@PAPAXABU_GUID@@@Zaxscript.pyd axscript.pyd/ 1605328465 0 98 ` LQ^_N?PyObConstruct@PyIActiveScript@@SAPAVPyIUnknown@@PAUIUnknown@@@Zaxscript.pydaxscript.pyd/ 1605328465 0 103 ` LQ^_S?PyObConstruct@PyIActiveScriptError@@SAPAVPyIUnknown@@PAUIUnknown@@@Zaxscript.pyd axscript.pyd/ 1605328465 0 103 ` LQ^_S?PyObConstruct@PyIActiveScriptParse@@SAPAVPyIUnknown@@PAUIUnknown@@@Zaxscript.pyd axscript.pyd/ 1605328465 0 102 ` LQ^_R?PyObConstruct@PyIActiveScriptSite@@SAPAVPyIUnknown@@PAUIUnknown@@@Zaxscript.pydaxscript.pyd/ 1605328465 0 98 ` LQ^_N?PyObConstruct@PyIObjectSafety@@SAPAVPyIUnknown@@PAUIUnknown@@@Zaxscript.pydaxscript.pyd/ 1605328465 0 110 ` LQ^_Z?PyObConstruct@PyIProvideMultipleClassInfo@@SAPAVPyIUnknown@@PAUIUnknown@@@Zaxscript.pydaxscript.pyd/ 1605328465 0 88 ` LQ^_D?QueryInterface@PyGActiveScript@@MAGJABU_GUID@@PAPAX@Zaxscript.pydaxscript.pyd/ 1605328465 0 93 ` LQ^_I?QueryInterface@PyGActiveScriptError@@MAGJABU_GUID@@PAPAX@Zaxscript.pyd axscript.pyd/ 1605328465 0 93 ` LQ^_I?QueryInterface@PyGActiveScriptParse@@MAGJABU_GUID@@PAPAX@Zaxscript.pyd axscript.pyd/ 1605328465 0 92 ` LQ^_H?QueryInterface@PyGActiveScriptSite@@MAGJABU_GUID@@PAPAX@Zaxscript.pydaxscript.pyd/ 1605328465 0 88 ` LQ^_D?QueryInterface@PyGObjectSafety@@MAGJABU_GUID@@PAPAX@Zaxscript.pydaxscript.pyd/ 1605328465 0 66 ` LQ^_.?Release@PyGActiveScript@@MAGKXZaxscript.pydaxscript.pyd/ 1605328465 0 71 ` LQ^_3?Release@PyGActiveScriptError@@MAGKXZaxscript.pyd axscript.pyd/ 1605328465 0 71 ` LQ^_3?Release@PyGActiveScriptParse@@MAGKXZaxscript.pyd axscript.pyd/ 1605328465 0 70 ` LQ^_2?Release@PyGActiveScriptSite@@MAGKXZaxscript.pydaxscript.pyd/ 1605328465 0 66 ` LQ^_.?Release@PyGObjectSafety@@MAGKXZaxscript.pydaxscript.pyd/ 1605328465 0 96 ` LQ^_L?SetInterfaceSafetyOptions@PyGObjectSafety@@MAGJABU_GUID@@KK@Zaxscript.pydaxscript.pyd/ 1605328465 0 100 ` LQ^_P?SetInterfaceSafetyOptions@PyIObjectSafety@@SAPAU_object@@PAU2@0@Zaxscript.pydaxscript.pyd/ 1605328465 0 92 ` LQ^_H?SetPythonCOMError@PyIActiveScript@@SAPAU_object@@PAU2@J@Zaxscript.pydaxscript.pyd/ 1605328465 0 97 ` LQ^_M?SetPythonCOMError@PyIActiveScriptError@@SAPAU_object@@PAU2@J@Zaxscript.pyd axscript.pyd/ 1605328465 0 97 ` LQ^_M?SetPythonCOMError@PyIActiveScriptParse@@SAPAU_object@@PAU2@J@Zaxscript.pyd axscript.pyd/ 1605328465 0 96 ` LQ^_L?SetPythonCOMError@PyIActiveScriptSite@@SAPAU_object@@PAU2@J@Zaxscript.pydaxscript.pyd/ 1605328465 0 92 ` LQ^_H?SetPythonCOMError@PyIObjectSafety@@SAPAU_object@@PAU2@J@Zaxscript.pydaxscript.pyd/ 1605328465 0 104 ` LQ^_T?SetPythonCOMError@PyIProvideMultipleClassInfo@@SAPAU_object@@PAU2@J@Zaxscript.pydaxscript.pyd/ 1605328465 0 94 ` LQ^_J?SetScriptSite@PyGActiveScript@@MAGJPAUIActiveScriptSite@@@Zaxscript.pydaxscript.pyd/ 1605328465 0 88 ` LQ^_D?SetScriptSite@PyIActiveScript@@SAPAU_object@@PAU2@0@Zaxscript.pydaxscript.pyd/ 1605328465 0 91 ` LQ^_G?SetScriptState@PyGActiveScript@@MAGJW4tagSCRIPTSTATE@@@Zaxscript.pyd axscript.pyd/ 1605328465 0 89 ` LQ^_E?SetScriptState@PyIActiveScript@@SAPAU_object@@PAU2@0@Zaxscript.pyd axscript.pyd/ 1605328465 0 78 ` LQ^_:?ThisAsIID@PyGActiveScript@@MAEPAXU_GUID@@@Zaxscript.pydaxscript.pyd/ 1605328465 0 83 ` LQ^_??ThisAsIID@PyGActiveScriptError@@MAEPAXU_GUID@@@Zaxscript.pyd axscript.pyd/ 1605328465 0 83 ` LQ^_??ThisAsIID@PyGActiveScriptParse@@MAEPAXU_GUID@@@Zaxscript.pyd axscript.pyd/ 1605328465 0 82 ` LQ^_>?ThisAsIID@PyGActiveScriptSite@@MAEPAXU_GUID@@@Zaxscript.pydaxscript.pyd/ 1605328465 0 78 ` LQ^_:?ThisAsIID@PyGObjectSafety@@MAEPAXU_GUID@@@Zaxscript.pydaxscript.pyd/ 1605328465 0 77 ` LQ^_9?type@PyIActiveScript@@2VPyComTypeObject@@Aaxscript.pyd axscript.pyd/ 1605328465 0 82 ` LQ^_>?type@PyIActiveScriptError@@2VPyComTypeObject@@Aaxscript.pydaxscript.pyd/ 1605328465 0 82 ` LQ^_>?type@PyIActiveScriptParse@@2VPyComTypeObject@@Aaxscript.pydaxscript.pyd/ 1605328465 0 81 ` LQ^_=?type@PyIActiveScriptSite@@2VPyComTypeObject@@Aaxscript.pyd axscript.pyd/ 1605328465 0 77 ` LQ^_9?type@PyIObjectSafety@@2VPyComTypeObject@@Aaxscript.pyd axscript.pyd/ 1605328465 0 89 ` LQ^_E?type@PyIProvideMultipleClassInfo@@2VPyComTypeObject@@Aaxscript.pyd axscript.pyd/ 1605328465 0 50 ` LQ^__PyInit_axscriptaxscript.pydPK D$nQ9\\win32com/libs/pythoncom.libUT @^_ux ! / 1605328448 0 44429 ` W\F^_ff$$ @ @[[ddLL00RRB:B:HHIIhhrrjj22      zzTT  NNRRFFXX&&~r~r>>n n   FF::o o jjnn""x^x^00"D"DwLwL%n%n|r|r>>$${r{r& & }r}rVV9J9Jkk99llzzZZ   4,-D,:-ccTTEEbbGGHRHRIfIfbb''))jj~~XXDD   H H  ))':':@@NNnngg~aa.L.L22..,,ffaag^g^dd4^4^00FFޖޖ66  rr@@>l>lDXDXM"M"KKhbhb88GGFFCHCHK K DDMMAALLҦҦjNjN""ODJJ0000((ΨΨĚĚ$$nnԒԒmm$$nnPQN200LLBB77}}DDYvv\\$4$4ztzt@@ ` `t"t"eeJJ==33/r/rHHfffdfdpp  u(u(!!v8v8pp  &&rriiqq##ynyns s d`d`=Z=Zjj3d3d..ededddll.Jdn8p`PV  ZHZHZZ[*[*ʆʆ882P2P66ȴȴiNiNN<<?|?|@@kVkVOnnHHlflfP`tt>zzzzrrSssxxTH\\77XX؞؞ttTXX::uujjU^*X*X**(x(xˠˠррڂڂwwjjvvVU1.1.$$xxW11A.A.8.8.;*;*55@@<<yyhhW͈͈((ZZ$$VVzz{{VVRRvv$$zzvv``hh||XX(Y8CCEjEjJ>``XX++22XX22>>__IMPORT_DESCRIPTOR_pythoncom38__NULL_IMPORT_DESCRIPTORpythoncom38_NULL_THUNK_DATA?PyCom_VariantFromPyObject@@YAHPAU_object@@PAUtagVARIANT@@@Z__imp_?PyCom_VariantFromPyObject@@YAHPAU_object@@PAUtagVARIANT@@@Z?PyCom_PyObjectFromVariant@@YAPAU_object@@PBUtagVARIANT@@@Z__imp_?PyCom_PyObjectFromVariant@@YAPAU_object@@PBUtagVARIANT@@@Z?PyCom_InterfaceFromPyObject@@YAHPAU_object@@ABU_GUID@@PAPAXH@Z__imp_?PyCom_InterfaceFromPyObject@@YAHPAU_object@@ABU_GUID@@PAPAXH@Z?PyCom_PyObjectFromIUnknown@@YAPAU_object@@PAUIUnknown@@ABU_GUID@@H@Z__imp_?PyCom_PyObjectFromIUnknown@@YAPAU_object@@PAUIUnknown@@ABU_GUID@@H@Z?PyCom_MakeOlePythonCall@@YAHPAU_object@@PAUtagDISPPARAMS@@PAUtagVARIANT@@PAUtagEXCEPINFO@@PAI0@Z__imp_?PyCom_MakeOlePythonCall@@YAHPAU_object@@PAUtagDISPPARAMS@@PAUtagVARIANT@@PAUtagEXCEPINFO@@PAI0@Z?PyCom_CoInitializeEx@@YAJPAXK@Z__imp_?PyCom_CoInitializeEx@@YAJPAXK@Z?PyCom_CoInitialize@@YAJPAX@Z__imp_?PyCom_CoInitialize@@YAJPAX@Z?PyCom_CoUninitialize@@YAXXZ__imp_?PyCom_CoUninitialize@@YAXXZ_PyInit_pythoncom__imp__PyInit_pythoncom??4PyComTypeObject@@QAEAAV0@ABV0@@Z__imp_??4PyComTypeObject@@QAEAAV0@ABV0@@Z??1PyComEnumProviderTypeObject@@QAE@XZ__imp_??1PyComEnumProviderTypeObject@@QAE@XZ??4PyComEnumProviderTypeObject@@QAEAAV0@ABV0@@Z__imp_??4PyComEnumProviderTypeObject@@QAEAAV0@ABV0@@Z??4PyComEnumProviderTypeObject@@QAEAAV0@$$QAV0@@Z__imp_??4PyComEnumProviderTypeObject@@QAEAAV0@$$QAV0@@Z??1PyComEnumTypeObject@@QAE@XZ__imp_??1PyComEnumTypeObject@@QAE@XZ??4PyComEnumTypeObject@@QAEAAV0@ABV0@@Z__imp_??4PyComEnumTypeObject@@QAEAAV0@ABV0@@Z??4PyComEnumTypeObject@@QAEAAV0@$$QAV0@@Z__imp_??4PyComEnumTypeObject@@QAEAAV0@$$QAV0@@Z?compare@PyIBase@@UAEHPAU_object@@@Z__imp_?compare@PyIBase@@UAEHPAU_object@@@Z?iter@PyIBase@@UAEPAU_object@@XZ__imp_?iter@PyIBase@@UAEPAU_object@@XZ?iternext@PyIBase@@UAEPAU_object@@XZ__imp_?iternext@PyIBase@@UAEPAU_object@@XZ??0PyIBase@@QAE@ABV0@@Z__imp_??0PyIBase@@QAE@ABV0@@Z??4PyIBase@@QAEAAV0@ABV0@@Z__imp_??4PyIBase@@QAEAAV0@ABV0@@Z?PyCom_BuildPyException@@YAPAU_object@@JPAUIUnknown@@ABU_GUID@@@Z__imp_?PyCom_BuildPyException@@YAPAU_object@@JPAUIUnknown@@ABU_GUID@@@Z?PyCom_BuildPyExceptionFromEXCEPINFO@@YAPAU_object@@JPAUtagEXCEPINFO@@I@Z__imp_?PyCom_BuildPyExceptionFromEXCEPINFO@@YAPAU_object@@JPAUtagEXCEPINFO@@I@Z?PyCom_BuildInternalPyException@@YAPAU_object@@PAD@Z__imp_?PyCom_BuildInternalPyException@@YAPAU_object@@PAD@Z?PyCom_LoggerNonServerException@@YAXPAU_object@@PBDZZ__imp_?PyCom_LoggerNonServerException@@YAXPAU_object@@PBDZZ?PyCom_LoggerException@@YAXPAU_object@@PBDZZ__imp_?PyCom_LoggerException@@YAXPAU_object@@PBDZZ?PyCom_LoggerWarning@@YAXPAU_object@@PBDZZ__imp_?PyCom_LoggerWarning@@YAXPAU_object@@PBDZZ?PyCom_SetAndLogCOMErrorFromPyException@@YAJPBDABU_GUID@@@Z__imp_?PyCom_SetAndLogCOMErrorFromPyException@@YAJPBDABU_GUID@@@Z?PyCom_SetAndLogCOMErrorFromPyExceptionEx@@YAJPAU_object@@PBDABU_GUID@@@Z__imp_?PyCom_SetAndLogCOMErrorFromPyExceptionEx@@YAJPAU_object@@PBDABU_GUID@@@Z?PyCom_SetCOMErrorFromSimple@@YAJJABU_GUID@@PBD@Z__imp_?PyCom_SetCOMErrorFromSimple@@YAJJABU_GUID@@PBD@Z?PyCom_SetCOMErrorFromPyException@@YAJABU_GUID@@@Z__imp_?PyCom_SetCOMErrorFromPyException@@YAJABU_GUID@@@Z?PyCom_ExcepInfoFromPyException@@YAXPAUtagEXCEPINFO@@@Z__imp_?PyCom_ExcepInfoFromPyException@@YAXPAUtagEXCEPINFO@@@Z?PyCom_ExcepInfoFromPyObject@@YAHPAU_object@@PAUtagEXCEPINFO@@PAJ@Z__imp_?PyCom_ExcepInfoFromPyObject@@YAHPAU_object@@PAUtagEXCEPINFO@@PAJ@Z?PyCom_PyObjectFromExcepInfo@@YAPAU_object@@PBUtagEXCEPINFO@@@Z__imp_?PyCom_PyObjectFromExcepInfo@@YAPAU_object@@PBUtagEXCEPINFO@@@Z??4PyOleEmpty@@QAEAAV0@ABV0@@Z__imp_??4PyOleEmpty@@QAEAAV0@ABV0@@Z??4PyOleEmpty@@QAEAAV0@$$QAV0@@Z__imp_??4PyOleEmpty@@QAEAAV0@$$QAV0@@Z??4PyOleMissing@@QAEAAV0@ABV0@@Z__imp_??4PyOleMissing@@QAEAAV0@ABV0@@Z??4PyOleMissing@@QAEAAV0@$$QAV0@@Z__imp_??4PyOleMissing@@QAEAAV0@$$QAV0@@Z??4PyOleArgNotFound@@QAEAAV0@ABV0@@Z__imp_??4PyOleArgNotFound@@QAEAAV0@ABV0@@Z??4PyOleArgNotFound@@QAEAAV0@$$QAV0@@Z__imp_??4PyOleArgNotFound@@QAEAAV0@$$QAV0@@Z??4PyOleNothing@@QAEAAV0@ABV0@@Z__imp_??4PyOleNothing@@QAEAAV0@ABV0@@Z??4PyOleNothing@@QAEAAV0@$$QAV0@@Z__imp_??4PyOleNothing@@QAEAAV0@$$QAV0@@Z?PyObConstruct@PyIUnknown@@SAPAV1@PAUIUnknown@@@Z__imp_?PyObConstruct@PyIUnknown@@SAPAV1@PAUIUnknown@@@Z??0PyIUnknown@@QAE@ABV0@@Z__imp_??0PyIUnknown@@QAE@ABV0@@Z??4PyIUnknown@@QAEAAV0@ABV0@@Z__imp_??4PyIUnknown@@QAEAAV0@ABV0@@Z?PyObConstruct@PyIDispatch@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyIDispatch@@SAPAVPyIUnknown@@PAUIUnknown@@@Z??0PyIDispatch@@QAE@ABV0@@Z__imp_??0PyIDispatch@@QAE@ABV0@@Z??4PyIDispatch@@QAEAAV0@ABV0@@Z__imp_??4PyIDispatch@@QAEAAV0@ABV0@@Z?PyObConstruct@PyIDispatchEx@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyIDispatchEx@@SAPAVPyIUnknown@@PAUIUnknown@@@Z?SetPythonCOMError@PyIDispatchEx@@SAPAU_object@@PAU2@J@Z__imp_?SetPythonCOMError@PyIDispatchEx@@SAPAU_object@@PAU2@J@Z??0PyIDispatchEx@@QAE@ABV0@@Z__imp_??0PyIDispatchEx@@QAE@ABV0@@Z??4PyIDispatchEx@@QAEAAV0@ABV0@@Z__imp_??4PyIDispatchEx@@QAEAAV0@ABV0@@Z?PyObConstruct@PyIClassFactory@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyIClassFactory@@SAPAVPyIUnknown@@PAUIUnknown@@@Z??0PyIClassFactory@@QAE@ABV0@@Z__imp_??0PyIClassFactory@@QAE@ABV0@@Z??4PyIClassFactory@@QAEAAV0@ABV0@@Z__imp_??4PyIClassFactory@@QAEAAV0@ABV0@@Z?PyObConstruct@PyIProvideClassInfo@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyIProvideClassInfo@@SAPAVPyIUnknown@@PAUIUnknown@@@Z??0PyIProvideClassInfo@@QAE@ABV0@@Z__imp_??0PyIProvideClassInfo@@QAE@ABV0@@Z??4PyIProvideClassInfo@@QAEAAV0@ABV0@@Z__imp_??4PyIProvideClassInfo@@QAEAAV0@ABV0@@Z?PyObConstruct@PyIProvideClassInfo2@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyIProvideClassInfo2@@SAPAVPyIUnknown@@PAUIUnknown@@@Z??0PyIProvideClassInfo2@@QAE@ABV0@@Z__imp_??0PyIProvideClassInfo2@@QAE@ABV0@@Z??4PyIProvideClassInfo2@@QAEAAV0@ABV0@@Z__imp_??4PyIProvideClassInfo2@@QAEAAV0@ABV0@@Z?PyObConstruct@PyITypeInfo@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyITypeInfo@@SAPAVPyIUnknown@@PAUIUnknown@@@Z??0PyITypeInfo@@QAE@ABV0@@Z__imp_??0PyITypeInfo@@QAE@ABV0@@Z??4PyITypeInfo@@QAEAAV0@ABV0@@Z__imp_??4PyITypeInfo@@QAEAAV0@ABV0@@Z?PyObConstruct@PyITypeComp@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyITypeComp@@SAPAVPyIUnknown@@PAUIUnknown@@@Z??0PyITypeComp@@QAE@ABV0@@Z__imp_??0PyITypeComp@@QAE@ABV0@@Z??4PyITypeComp@@QAEAAV0@ABV0@@Z__imp_??4PyITypeComp@@QAEAAV0@ABV0@@Z?PyObConstruct@PyITypeLib@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyITypeLib@@SAPAVPyIUnknown@@PAUIUnknown@@@Z??0PyITypeLib@@QAE@ABV0@@Z__imp_??0PyITypeLib@@QAE@ABV0@@Z??4PyITypeLib@@QAEAAV0@ABV0@@Z__imp_??4PyITypeLib@@QAEAAV0@ABV0@@Z?PyObConstruct@PyIConnectionPoint@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyIConnectionPoint@@SAPAVPyIUnknown@@PAUIUnknown@@@Z?SetPythonCOMError@PyIConnectionPoint@@SAPAU_object@@PAU2@J@Z__imp_?SetPythonCOMError@PyIConnectionPoint@@SAPAU_object@@PAU2@J@Z??0PyIConnectionPoint@@QAE@ABV0@@Z__imp_??0PyIConnectionPoint@@QAE@ABV0@@Z??4PyIConnectionPoint@@QAEAAV0@ABV0@@Z__imp_??4PyIConnectionPoint@@QAEAAV0@ABV0@@Z?PyObConstruct@PyIConnectionPointContainer@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyIConnectionPointContainer@@SAPAVPyIUnknown@@PAUIUnknown@@@Z?SetPythonCOMError@PyIConnectionPointContainer@@SAPAU_object@@PAU2@J@Z__imp_?SetPythonCOMError@PyIConnectionPointContainer@@SAPAU_object@@PAU2@J@Z??0PyIConnectionPointContainer@@QAE@ABV0@@Z__imp_??0PyIConnectionPointContainer@@QAE@ABV0@@Z??4PyIConnectionPointContainer@@QAEAAV0@ABV0@@Z__imp_??4PyIConnectionPointContainer@@QAEAAV0@ABV0@@Z??4PythonOleArgHelper@@QAEAAV0@ABV0@@Z__imp_??4PythonOleArgHelper@@QAEAAV0@ABV0@@Z?PyCom_LogF@@YAXPBDZZ__imp_?PyCom_LogF@@YAXPBDZZ?PyCom_StreamMessage@@YAXPBD@Z__imp_?PyCom_StreamMessage@@YAXPBD@Z__imp_??_7PyIBase@@6B@__imp_??_7PyIUnknown@@6B@__imp_??_7PyIDispatch@@6B@__imp_??_7PyIDispatchEx@@6B@__imp_??_7PyIClassFactory@@6B@__imp_??_7PyIProvideClassInfo@@6B@__imp_??_7PyIProvideClassInfo2@@6B@__imp_??_7PyITypeInfo@@6B@__imp_??_7PyITypeComp@@6B@__imp_??_7PyITypeLib@@6B@__imp_??_7PyIConnectionPoint@@6B@__imp_??_7PyIConnectionPointContainer@@6B@__imp_?PyOleEmptyType@@3U_typeobject@@A__imp_?PyOleMissingType@@3U_typeobject@@A__imp_?PyOleArgNotFoundType@@3U_typeobject@@A__imp_?PyOleNothingType@@3U_typeobject@@A??0PyComTypeObject@@QAE@PBDPAV0@HPAUPyMethodDef@@P6APAVPyIUnknown@@PAUIUnknown@@@Z@Z__imp_??0PyComTypeObject@@QAE@PBDPAV0@HPAUPyMethodDef@@P6APAVPyIUnknown@@PAUIUnknown@@@Z@Z??1PyComTypeObject@@QAE@XZ__imp_??1PyComTypeObject@@QAE@XZ?is_interface_type@PyComTypeObject@@SAHPAU_object@@@Z__imp_?is_interface_type@PyComTypeObject@@SAHPAU_object@@@Z??0PyComEnumProviderTypeObject@@QAE@PBDPAVPyComTypeObject@@HPAUPyMethodDef@@P6APAVPyIUnknown@@PAUIUnknown@@@Z0@Z__imp_??0PyComEnumProviderTypeObject@@QAE@PBDPAVPyComTypeObject@@HPAUPyMethodDef@@P6APAVPyIUnknown@@PAUIUnknown@@@Z0@Z?iter@PyComEnumProviderTypeObject@@SAPAU_object@@PAU2@@Z__imp_?iter@PyComEnumProviderTypeObject@@SAPAU_object@@PAU2@@Z?iter@PyComEnumTypeObject@@SAPAU_object@@PAU2@@Z__imp_?iter@PyComEnumTypeObject@@SAPAU_object@@PAU2@@Z?iternext@PyComEnumTypeObject@@SAPAU_object@@PAU2@@Z__imp_?iternext@PyComEnumTypeObject@@SAPAU_object@@PAU2@@Z??0PyComEnumTypeObject@@QAE@PBDPAVPyComTypeObject@@HPAUPyMethodDef@@P6APAVPyIUnknown@@PAUIUnknown@@@Z@Z__imp_??0PyComEnumTypeObject@@QAE@PBDPAVPyComTypeObject@@HPAUPyMethodDef@@P6APAVPyIUnknown@@PAUIUnknown@@@Z@Z?PyObject_AsOLEMENUGROUPWIDTHS@@YAHPAU_object@@PAUtagOleMenuGroupWidths@@@Z__imp_?PyObject_AsOLEMENUGROUPWIDTHS@@YAHPAU_object@@PAUtagOleMenuGroupWidths@@@Z?PyObject_FromOLEMENUGROUPWIDTHS@@YAPAU_object@@PBUtagOleMenuGroupWidths@@@Z__imp_?PyObject_FromOLEMENUGROUPWIDTHS@@YAPAU_object@@PBUtagOleMenuGroupWidths@@@Z??0PyOleEmpty@@QAE@XZ__imp_??0PyOleEmpty@@QAE@XZ??0PyOleMissing@@QAE@XZ__imp_??0PyOleMissing@@QAE@XZ??0PyOleArgNotFound@@QAE@XZ__imp_??0PyOleArgNotFound@@QAE@XZ??0PyOleNothing@@QAE@XZ__imp_??0PyOleNothing@@QAE@XZ?PyCom_InterfaceFromPyInstanceOrObject@@YAHPAU_object@@ABU_GUID@@PAPAXH@Z__imp_?PyCom_InterfaceFromPyInstanceOrObject@@YAHPAU_object@@ABU_GUID@@PAPAXH@Z?PyCom_PyObjectFromSTATSTG@@YAPAU_object@@PAUtagSTATSTG@@@Z__imp_?PyCom_PyObjectFromSTATSTG@@YAPAU_object@@PAUtagSTATSTG@@@Z?PyCom_PyObjectAsSTATSTG@@YAHPAU_object@@PAUtagSTATSTG@@K@Z__imp_?PyCom_PyObjectAsSTATSTG@@YAHPAU_object@@PAUtagSTATSTG@@K@Z?PyCom_PyObjectAsSTGOPTIONS@@YAHPAU_object@@PAPAUtagSTGOPTIONS@@@Z__imp_?PyCom_PyObjectAsSTGOPTIONS@@YAHPAU_object@@PAPAUtagSTGOPTIONS@@@Z?PyCom_PyObjectFromSTATPROPSETSTG@@YAPAU_object@@PAUtagSTATPROPSETSTG@@@Z__imp_?PyCom_PyObjectFromSTATPROPSETSTG@@YAPAU_object@@PAUtagSTATPROPSETSTG@@@Z?PyCom_PyObjectAsSTATPROPSETSTG@@YAHPAU_object@@PAUtagSTATPROPSETSTG@@@Z__imp_?PyCom_PyObjectAsSTATPROPSETSTG@@YAHPAU_object@@PAUtagSTATPROPSETSTG@@@Z?PyObject_FromCurrency@@YAPAU_object@@AATtagCY@@@Z__imp_?PyObject_FromCurrency@@YAPAU_object@@AATtagCY@@@Z?PyObject_AsCurrency@@YAHPAU_object@@PATtagCY@@@Z__imp_?PyObject_AsCurrency@@YAHPAU_object@@PATtagCY@@@Z?PyCom_BstrFromPyObject@@YAHPAU_object@@PAPA_WH@Z__imp_?PyCom_BstrFromPyObject@@YAHPAU_object@@PAPA_WH@Z?MakeBstrToObj@@YAPAU_object@@QA_W@Z__imp_?MakeBstrToObj@@YAPAU_object@@QA_W@Z?MakeOLECHARToObj@@YAPAU_object@@PB_WH@Z__imp_?MakeOLECHARToObj@@YAPAU_object@@PB_WH@Z?MakeOLECHARToObj@@YAPAU_object@@PB_W@Z__imp_?MakeOLECHARToObj@@YAPAU_object@@PB_W@Z?PyGatewayConstruct@PyGatewayBase@@SAJPAU_object@@PAV1@PAPAXABU_GUID@@@Z__imp_?PyGatewayConstruct@PyGatewayBase@@SAJPAU_object@@PAV1@PAPAXABU_GUID@@@Z?GetIID@PyGatewayBase@@UAE?AU_GUID@@XZ__imp_?GetIID@PyGatewayBase@@UAE?AU_GUID@@XZ??0PyGatewayBase@@QAE@ABV0@@Z__imp_??0PyGatewayBase@@QAE@ABV0@@Z??4PyGatewayBase@@QAEAAV0@ABV0@@Z__imp_??4PyGatewayBase@@QAEAAV0@ABV0@@Z__imp_??_7PyGatewayBase@@6BIDispatchEx@@@__imp_??_7PyGatewayBase@@6BISupportErrorInfo@@@__imp_??_7PyGatewayBase@@6BIInternalUnwrapPythonObject@@@??0CPyFactory@@QAE@ABU_GUID@@@Z__imp_??0CPyFactory@@QAE@ABU_GUID@@@Z??1CPyFactory@@QAE@XZ__imp_??1CPyFactory@@QAE@XZ?QueryInterface@CPyFactory@@UAGJABU_GUID@@PAPAX@Z__imp_?QueryInterface@CPyFactory@@UAGJABU_GUID@@PAPAX@Z?AddRef@CPyFactory@@UAGKXZ__imp_?AddRef@CPyFactory@@UAGKXZ?Release@CPyFactory@@UAGKXZ__imp_?Release@CPyFactory@@UAGKXZ?CreateInstance@CPyFactory@@UAGJPAUIUnknown@@ABU_GUID@@PAPAX@Z__imp_?CreateInstance@CPyFactory@@UAGJPAUIUnknown@@ABU_GUID@@PAPAX@Z?LockServer@CPyFactory@@UAGJH@Z__imp_?LockServer@CPyFactory@@UAGJH@Z?CreateNewPythonInstance@CPyFactory@@IAGJABU_GUID@@0PAPAU_object@@@Z__imp_?CreateNewPythonInstance@CPyFactory@@IAGJABU_GUID@@0PAPAU_object@@@Z??0CPyFactory@@QAE@ABV0@@Z__imp_??0CPyFactory@@QAE@ABV0@@Z??4CPyFactory@@QAEAAV0@ABV0@@Z__imp_??4CPyFactory@@QAEAAV0@ABV0@@Z__imp_??_7CPyFactory@@6B@??0PyGatewayBase@@IAE@PAU_object@@@Z__imp_??0PyGatewayBase@@IAE@PAU_object@@@Z??1PyGatewayBase@@MAE@XZ__imp_??1PyGatewayBase@@MAE@XZ?InvokeViaPolicy@PyGatewayBase@@MAAJPBDPAPAU_object@@0ZZ__imp_?InvokeViaPolicy@PyGatewayBase@@MAAJPBDPAPAU_object@@0ZZ?AddRef@PyGatewayBase@@UAGKXZ__imp_?AddRef@PyGatewayBase@@UAGKXZ?Release@PyGatewayBase@@UAGKXZ__imp_?Release@PyGatewayBase@@UAGKXZ?QueryInterface@PyGatewayBase@@UAGJABU_GUID@@PAPAX@Z__imp_?QueryInterface@PyGatewayBase@@UAGJABU_GUID@@PAPAX@Z?GetTypeInfoCount@PyGatewayBase@@UAGJPAI@Z__imp_?GetTypeInfoCount@PyGatewayBase@@UAGJPAI@Z?GetTypeInfo@PyGatewayBase@@UAGJIKPAPAUITypeInfo@@@Z__imp_?GetTypeInfo@PyGatewayBase@@UAGJIKPAPAUITypeInfo@@@Z?GetIDsOfNames@PyGatewayBase@@UAGJABU_GUID@@PAPA_WIKPAJ@Z__imp_?GetIDsOfNames@PyGatewayBase@@UAGJABU_GUID@@PAPA_WIKPAJ@Z?Invoke@PyGatewayBase@@UAGJJABU_GUID@@KGPAUtagDISPPARAMS@@PAUtagVARIANT@@PAUtagEXCEPINFO@@PAI@Z__imp_?Invoke@PyGatewayBase@@UAGJJABU_GUID@@KGPAUtagDISPPARAMS@@PAUtagVARIANT@@PAUtagEXCEPINFO@@PAI@Z?GetDispID@PyGatewayBase@@UAGJPA_WKPAJ@Z__imp_?GetDispID@PyGatewayBase@@UAGJPA_WKPAJ@Z?InvokeEx@PyGatewayBase@@UAGJJKGPAUtagDISPPARAMS@@PAUtagVARIANT@@PAUtagEXCEPINFO@@PAUIServiceProvider@@@Z__imp_?InvokeEx@PyGatewayBase@@UAGJJKGPAUtagDISPPARAMS@@PAUtagVARIANT@@PAUtagEXCEPINFO@@PAUIServiceProvider@@@Z?DeleteMemberByName@PyGatewayBase@@UAGJPA_WK@Z__imp_?DeleteMemberByName@PyGatewayBase@@UAGJPA_WK@Z?DeleteMemberByDispID@PyGatewayBase@@UAGJJ@Z__imp_?DeleteMemberByDispID@PyGatewayBase@@UAGJJ@Z?GetMemberProperties@PyGatewayBase@@UAGJJKPAK@Z__imp_?GetMemberProperties@PyGatewayBase@@UAGJJKPAK@Z?GetMemberName@PyGatewayBase@@UAGJJPAPA_W@Z__imp_?GetMemberName@PyGatewayBase@@UAGJJPAPA_W@Z?GetNextDispID@PyGatewayBase@@UAGJKJPAJ@Z__imp_?GetNextDispID@PyGatewayBase@@UAGJKJPAJ@Z?GetNameSpaceParent@PyGatewayBase@@UAGJPAPAUIUnknown@@@Z__imp_?GetNameSpaceParent@PyGatewayBase@@UAGJPAPAUIUnknown@@@Z?InterfaceSupportsErrorInfo@PyGatewayBase@@UAGJABU_GUID@@@Z__imp_?InterfaceSupportsErrorInfo@PyGatewayBase@@UAGJABU_GUID@@@Z?Unwrap@PyGatewayBase@@UAGJPAPAU_object@@@Z__imp_?Unwrap@PyGatewayBase@@UAGJPAPAU_object@@@Z?ThisAsIID@PyGatewayBase@@UAEPAXU_GUID@@@Z__imp_?ThisAsIID@PyGatewayBase@@UAEPAXU_GUID@@@Z?getattr@PyIBase@@UAEPAU_object@@PAD@Z__imp_?getattr@PyIBase@@UAEPAU_object@@PAD@Z?setattr@PyIBase@@UAEHPADPAU_object@@@Z__imp_?setattr@PyIBase@@UAEHPADPAU_object@@@Z?repr@PyIBase@@UAEPAU_object@@XZ__imp_?repr@PyIBase@@UAEPAU_object@@XZ??0PyIBase@@IAE@XZ__imp_??0PyIBase@@IAE@XZ??1PyIBase@@MAE@XZ__imp_??1PyIBase@@MAE@XZ?is_object@PyIBase@@SAHPAU_object@@PAVPyComTypeObject@@@Z__imp_?is_object@PyIBase@@SAHPAU_object@@PAVPyComTypeObject@@@Z?is_object@PyIBase@@QAEHPAVPyComTypeObject@@@Z__imp_?is_object@PyIBase@@QAEHPAVPyComTypeObject@@@Z?dealloc@PyIBase@@SAXPAU_object@@@Z__imp_?dealloc@PyIBase@@SAXPAU_object@@@Z?repr@PyIBase@@SAPAU_object@@PAU2@@Z__imp_?repr@PyIBase@@SAPAU_object@@PAU2@@Z?getattro@PyIBase@@SAPAU_object@@PAU2@0@Z__imp_?getattro@PyIBase@@SAPAU_object@@PAU2@0@Z?setattro@PyIBase@@SAHPAU_object@@00@Z__imp_?setattro@PyIBase@@SAHPAU_object@@00@Z?cmp@PyIBase@@SAHPAU_object@@0@Z__imp_?cmp@PyIBase@@SAHPAU_object@@0@Z?richcmp@PyIBase@@SAPAU_object@@PAU2@0H@Z__imp_?richcmp@PyIBase@@SAPAU_object@@PAU2@0H@Z?CreateInstance@PyIClassFactory@@SAPAU_object@@PAU2@0@Z__imp_?CreateInstance@PyIClassFactory@@SAPAU_object@@PAU2@0@Z?LockServer@PyIClassFactory@@SAPAU_object@@PAU2@0@Z__imp_?LockServer@PyIClassFactory@@SAPAU_object@@PAU2@0@Z?GetI@PyIClassFactory@@SAPAUIClassFactory@@PAU_object@@@Z__imp_?GetI@PyIClassFactory@@SAPAUIClassFactory@@PAU_object@@@Z??0PyIClassFactory@@IAE@PAUIUnknown@@@Z__imp_??0PyIClassFactory@@IAE@PAUIUnknown@@@Z??1PyIClassFactory@@MAE@XZ__imp_??1PyIClassFactory@@MAE@XZ__imp_?type@PyIClassFactory@@2VPyComTypeObject@@A?Invoke@PyIDispatch@@SAPAU_object@@PAU2@0@Z__imp_?Invoke@PyIDispatch@@SAPAU_object@@PAU2@0@Z?InvokeTypes@PyIDispatch@@SAPAU_object@@PAU2@0@Z__imp_?InvokeTypes@PyIDispatch@@SAPAU_object@@PAU2@0@Z?GetIDsOfNames@PyIDispatch@@SAPAU_object@@PAU2@0@Z__imp_?GetIDsOfNames@PyIDispatch@@SAPAU_object@@PAU2@0@Z?GetTypeInfo@PyIDispatch@@SAPAU_object@@PAU2@0@Z__imp_?GetTypeInfo@PyIDispatch@@SAPAU_object@@PAU2@0@Z?GetTypeInfoCount@PyIDispatch@@SAPAU_object@@PAU2@0@Z__imp_?GetTypeInfoCount@PyIDispatch@@SAPAU_object@@PAU2@0@Z?GetDispID@PyIDispatchEx@@SAPAU_object@@PAU2@0@Z__imp_?GetDispID@PyIDispatchEx@@SAPAU_object@@PAU2@0@Z?InvokeEx@PyIDispatchEx@@SAPAU_object@@PAU2@0@Z__imp_?InvokeEx@PyIDispatchEx@@SAPAU_object@@PAU2@0@Z?DeleteMemberByName@PyIDispatchEx@@SAPAU_object@@PAU2@0@Z__imp_?DeleteMemberByName@PyIDispatchEx@@SAPAU_object@@PAU2@0@Z?DeleteMemberByDispID@PyIDispatchEx@@SAPAU_object@@PAU2@0@Z__imp_?DeleteMemberByDispID@PyIDispatchEx@@SAPAU_object@@PAU2@0@Z?GetMemberProperties@PyIDispatchEx@@SAPAU_object@@PAU2@0@Z__imp_?GetMemberProperties@PyIDispatchEx@@SAPAU_object@@PAU2@0@Z?GetMemberName@PyIDispatchEx@@SAPAU_object@@PAU2@0@Z__imp_?GetMemberName@PyIDispatchEx@@SAPAU_object@@PAU2@0@Z?GetNextDispID@PyIDispatchEx@@SAPAU_object@@PAU2@0@Z__imp_?GetNextDispID@PyIDispatchEx@@SAPAU_object@@PAU2@0@Z?GetI@PyIDispatch@@SAPAUIDispatch@@PAU_object@@@Z__imp_?GetI@PyIDispatch@@SAPAUIDispatch@@PAU_object@@@Z??0PyIDispatch@@IAE@PAUIUnknown@@@Z__imp_??0PyIDispatch@@IAE@PAUIUnknown@@@Z??1PyIDispatch@@MAE@XZ__imp_??1PyIDispatch@@MAE@XZ?GetI@PyIDispatchEx@@SAPAUIDispatchEx@@PAU_object@@@Z__imp_?GetI@PyIDispatchEx@@SAPAUIDispatchEx@@PAU_object@@@Z??0PyIDispatchEx@@IAE@PAUIUnknown@@@Z__imp_??0PyIDispatchEx@@IAE@PAUIUnknown@@@Z??1PyIDispatchEx@@MAE@XZ__imp_??1PyIDispatchEx@@MAE@XZ__imp_?type@PyIDispatch@@2VPyComTypeObject@@A__imp_?type@PyIDispatchEx@@2VPyComTypeObject@@A__imp_?szErrMsgObjectReleased@PyIUnknown@@2PADA?QueryInterface@PyIUnknown@@SAPAU_object@@PAU2@0@Z__imp_?QueryInterface@PyIUnknown@@SAPAU_object@@PAU2@0@Z?repr@PyIUnknown@@UAEPAU_object@@XZ__imp_?repr@PyIUnknown@@UAEPAU_object@@XZ?compare@PyIUnknown@@UAEHPAU_object@@@Z__imp_?compare@PyIUnknown@@UAEHPAU_object@@@Z?GetI@PyIUnknown@@SAPAUIUnknown@@PAU_object@@@Z__imp_?GetI@PyIUnknown@@SAPAUIUnknown@@PAU_object@@@Z?SafeRelease@PyIUnknown@@SAXPAV1@@Z__imp_?SafeRelease@PyIUnknown@@SAXPAV1@@Z??0PyIUnknown@@IAE@PAUIUnknown@@@Z__imp_??0PyIUnknown@@IAE@PAUIUnknown@@@Z??1PyIUnknown@@MAE@XZ__imp_??1PyIUnknown@@MAE@XZ__imp_?type@PyIUnknown@@2VPyComTypeObject@@A??4PySTGMEDIUM@@QAEAAV0@ABV0@@Z__imp_??4PySTGMEDIUM@@QAEAAV0@ABV0@@Z??_FPySTGMEDIUM@@QAEXXZ__imp_??_FPySTGMEDIUM@@QAEXXZ?PyGatewayConstruct@PyGPersist@@SAJPAU_object@@PAVPyGatewayBase@@PAPAXABU_GUID@@@Z__imp_?PyGatewayConstruct@PyGPersist@@SAJPAU_object@@PAVPyGatewayBase@@PAPAXABU_GUID@@@Z?PyGatewayConstruct@PyGOleWindow@@SAJPAU_object@@PAVPyGatewayBase@@PAPAXABU_GUID@@@Z__imp_?PyGatewayConstruct@PyGOleWindow@@SAJPAU_object@@PAVPyGatewayBase@@PAPAXABU_GUID@@@Z?PyCom_RegisterExtensionSupport@@YAHPAU_object@@PBUPyCom_InterfaceSupportInfo@@H@Z__imp_?PyCom_RegisterExtensionSupport@@YAHPAU_object@@PBUPyCom_InterfaceSupportInfo@@H@Z?PyCom_RegisterClientType@@YAHPAU_typeobject@@PBU_GUID@@@Z__imp_?PyCom_RegisterClientType@@YAHPAU_typeobject@@PBU_GUID@@@Z?PyCom_RegisterGatewayObject@@YAJABU_GUID@@P6AJPAU_object@@PAVPyGatewayBase@@PAPAX0@ZPBD@Z__imp_?PyCom_RegisterGatewayObject@@YAJABU_GUID@@P6AJPAU_object@@PAVPyGatewayBase@@PAPAX0@ZPBD@Z?PyCom_IsGatewayRegistered@@YAHABU_GUID@@@Z__imp_?PyCom_IsGatewayRegistered@@YAHABU_GUID@@@Z?PyObConstruct@PyIStream@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyIStream@@SAPAVPyIUnknown@@PAUIUnknown@@@Z??0PyIStream@@QAE@ABV0@@Z__imp_??0PyIStream@@QAE@ABV0@@Z??4PyIStream@@QAEAAV0@ABV0@@Z__imp_??4PyIStream@@QAEAAV0@ABV0@@Z?PyObConstruct@PyIPersist@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyIPersist@@SAPAVPyIUnknown@@PAUIUnknown@@@Z??0PyIPersist@@QAE@ABV0@@Z__imp_??0PyIPersist@@QAE@ABV0@@Z??4PyIPersist@@QAEAAV0@ABV0@@Z__imp_??4PyIPersist@@QAEAAV0@ABV0@@Z??0PyGPersist@@IAE@PAU_object@@@Z__imp_??0PyGPersist@@IAE@PAU_object@@@Z?GetIID@PyGPersist@@MAE?AU_GUID@@XZ__imp_?GetIID@PyGPersist@@MAE?AU_GUID@@XZ?ThisAsIID@PyGPersist@@MAEPAXU_GUID@@@Z__imp_?ThisAsIID@PyGPersist@@MAEPAXU_GUID@@@Z?AddRef@PyGPersist@@MAGKXZ__imp_?AddRef@PyGPersist@@MAGKXZ?Release@PyGPersist@@MAGKXZ__imp_?Release@PyGPersist@@MAGKXZ?QueryInterface@PyGPersist@@MAGJABU_GUID@@PAPAX@Z__imp_?QueryInterface@PyGPersist@@MAGJABU_GUID@@PAPAX@Z??1PyGPersist@@UAE@XZ__imp_??1PyGPersist@@UAE@XZ??0PyGPersist@@QAE@ABV0@@Z__imp_??0PyGPersist@@QAE@ABV0@@Z??0PyGPersist@@QAE@$$QAV0@@Z__imp_??0PyGPersist@@QAE@$$QAV0@@Z??4PyGPersist@@QAEAAV0@ABV0@@Z__imp_??4PyGPersist@@QAEAAV0@ABV0@@Z??4PyGPersist@@QAEAAV0@$$QAV0@@Z__imp_??4PyGPersist@@QAEAAV0@$$QAV0@@Z?PyObConstruct@PyIPersistStream@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyIPersistStream@@SAPAVPyIUnknown@@PAUIUnknown@@@Z??0PyIPersistStream@@QAE@ABV0@@Z__imp_??0PyIPersistStream@@QAE@ABV0@@Z??4PyIPersistStream@@QAEAAV0@ABV0@@Z__imp_??4PyIPersistStream@@QAEAAV0@ABV0@@Z?PyObConstruct@PyIPersistStreamInit@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyIPersistStreamInit@@SAPAVPyIUnknown@@PAUIUnknown@@@Z??0PyIPersistStreamInit@@QAE@ABV0@@Z__imp_??0PyIPersistStreamInit@@QAE@ABV0@@Z??4PyIPersistStreamInit@@QAEAAV0@ABV0@@Z__imp_??4PyIPersistStreamInit@@QAEAAV0@ABV0@@Z?PyObConstruct@PyIEnumMoniker@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyIEnumMoniker@@SAPAVPyIUnknown@@PAUIUnknown@@@Z??0PyIEnumMoniker@@QAE@ABV0@@Z__imp_??0PyIEnumMoniker@@QAE@ABV0@@Z??4PyIEnumMoniker@@QAEAAV0@ABV0@@Z__imp_??4PyIEnumMoniker@@QAEAAV0@ABV0@@Z?PyObConstruct@PyIMoniker@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyIMoniker@@SAPAVPyIUnknown@@PAUIUnknown@@@Z??0PyIMoniker@@QAE@ABV0@@Z__imp_??0PyIMoniker@@QAE@ABV0@@Z??4PyIMoniker@@QAEAAV0@ABV0@@Z__imp_??4PyIMoniker@@QAEAAV0@ABV0@@Z?PyObConstruct@PyIBindCtx@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyIBindCtx@@SAPAVPyIUnknown@@PAUIUnknown@@@Z??0PyIBindCtx@@QAE@ABV0@@Z__imp_??0PyIBindCtx@@QAE@ABV0@@Z??4PyIBindCtx@@QAEAAV0@ABV0@@Z__imp_??4PyIBindCtx@@QAEAAV0@ABV0@@Z?PyObConstruct@PyIEnumVARIANT@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyIEnumVARIANT@@SAPAVPyIUnknown@@PAUIUnknown@@@Z??0PyIEnumVARIANT@@QAE@ABV0@@Z__imp_??0PyIEnumVARIANT@@QAE@ABV0@@Z??4PyIEnumVARIANT@@QAEAAV0@ABV0@@Z__imp_??4PyIEnumVARIANT@@QAEAAV0@ABV0@@Z?PyObConstruct@PyIServiceProvider@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyIServiceProvider@@SAPAVPyIUnknown@@PAUIUnknown@@@Z??0PyIServiceProvider@@QAE@ABV0@@Z__imp_??0PyIServiceProvider@@QAE@ABV0@@Z??4PyIServiceProvider@@QAEAAV0@ABV0@@Z__imp_??4PyIServiceProvider@@QAEAAV0@ABV0@@Z?PyObConstruct@PyIOleWindow@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyIOleWindow@@SAPAVPyIUnknown@@PAUIUnknown@@@Z??0PyIOleWindow@@QAE@ABV0@@Z__imp_??0PyIOleWindow@@QAE@ABV0@@Z??4PyIOleWindow@@QAEAAV0@ABV0@@Z__imp_??4PyIOleWindow@@QAEAAV0@ABV0@@Z??0PyGOleWindow@@IAE@PAU_object@@@Z__imp_??0PyGOleWindow@@IAE@PAU_object@@@Z?GetIID@PyGOleWindow@@MAE?AU_GUID@@XZ__imp_?GetIID@PyGOleWindow@@MAE?AU_GUID@@XZ?ThisAsIID@PyGOleWindow@@MAEPAXU_GUID@@@Z__imp_?ThisAsIID@PyGOleWindow@@MAEPAXU_GUID@@@Z?AddRef@PyGOleWindow@@MAGKXZ__imp_?AddRef@PyGOleWindow@@MAGKXZ?Release@PyGOleWindow@@MAGKXZ__imp_?Release@PyGOleWindow@@MAGKXZ?QueryInterface@PyGOleWindow@@MAGJABU_GUID@@PAPAX@Z__imp_?QueryInterface@PyGOleWindow@@MAGJABU_GUID@@PAPAX@Z??1PyGOleWindow@@UAE@XZ__imp_??1PyGOleWindow@@UAE@XZ??0PyGOleWindow@@QAE@ABV0@@Z__imp_??0PyGOleWindow@@QAE@ABV0@@Z??0PyGOleWindow@@QAE@$$QAV0@@Z__imp_??0PyGOleWindow@@QAE@$$QAV0@@Z??4PyGOleWindow@@QAEAAV0@ABV0@@Z__imp_??4PyGOleWindow@@QAEAAV0@ABV0@@Z??4PyGOleWindow@@QAEAAV0@$$QAV0@@Z__imp_??4PyGOleWindow@@QAEAAV0@$$QAV0@@Z__imp_??_7PyIStream@@6B@__imp_??_7PyIPersist@@6B@__imp_??_7PyGPersist@@6BIDispatchEx@@@__imp_??_7PyGPersist@@6BISupportErrorInfo@@@__imp_??_7PyGPersist@@6BIInternalUnwrapPythonObject@@@__imp_??_7PyGPersist@@6B@__imp_??_7PyIPersistStream@@6B@__imp_??_7PyIPersistStreamInit@@6B@__imp_??_7PyIEnumMoniker@@6B@__imp_??_7PyIMoniker@@6B@__imp_??_7PyIBindCtx@@6B@__imp_??_7PyIEnumVARIANT@@6B@__imp_??_7PyIServiceProvider@@6B@__imp_??_7PyIOleWindow@@6B@__imp_??_7PyGOleWindow@@6BIDispatchEx@@@__imp_??_7PyGOleWindow@@6BISupportErrorInfo@@@__imp_??_7PyGOleWindow@@6BIInternalUnwrapPythonObject@@@__imp_??_7PyGOleWindow@@6B@?PyCom_DLLAddRef@@YAXXZ__imp_?PyCom_DLLAddRef@@YAXXZ?PyCom_DLLReleaseRef@@YAXXZ__imp_?PyCom_DLLReleaseRef@@YAXXZ?PyCom_EnableQuitMessage@@YAXK@Z__imp_?PyCom_EnableQuitMessage@@YAXK@Z_DllMain@12__imp__DllMain@12_DllRegisterServerEx__imp__DllRegisterServerEx_DllUnregisterServerEx__imp__DllUnregisterServerEx?GetClassID@PyGPersist@@MAGJPAU_GUID@@@Z__imp_?GetClassID@PyGPersist@@MAGJPAU_GUID@@@Z?GetRunningObjectTable@PyIBindCtx@@SAPAU_object@@PAU2@0@Z__imp_?GetRunningObjectTable@PyIBindCtx@@SAPAU_object@@PAU2@0@Z?GetBindOptions@PyIBindCtx@@SAPAU_object@@PAU2@0@Z__imp_?GetBindOptions@PyIBindCtx@@SAPAU_object@@PAU2@0@Z?SetBindOptions@PyIBindCtx@@SAPAU_object@@PAU2@0@Z__imp_?SetBindOptions@PyIBindCtx@@SAPAU_object@@PAU2@0@Z?RegisterObjectParam@PyIBindCtx@@SAPAU_object@@PAU2@0@Z__imp_?RegisterObjectParam@PyIBindCtx@@SAPAU_object@@PAU2@0@Z?RevokeObjectParam@PyIBindCtx@@SAPAU_object@@PAU2@0@Z__imp_?RevokeObjectParam@PyIBindCtx@@SAPAU_object@@PAU2@0@Z?GetObjectParam@PyIBindCtx@@SAPAU_object@@PAU2@0@Z__imp_?GetObjectParam@PyIBindCtx@@SAPAU_object@@PAU2@0@Z?EnumObjectParam@PyIBindCtx@@SAPAU_object@@PAU2@0@Z__imp_?EnumObjectParam@PyIBindCtx@@SAPAU_object@@PAU2@0@Z?GetI@PyIBindCtx@@SAPAUIBindCtx@@PAU_object@@@Z__imp_?GetI@PyIBindCtx@@SAPAUIBindCtx@@PAU_object@@@Z??0PyIBindCtx@@IAE@PAUIUnknown@@@Z__imp_??0PyIBindCtx@@IAE@PAUIUnknown@@@Z??1PyIBindCtx@@MAE@XZ__imp_??1PyIBindCtx@@MAE@XZ__imp_?type@PyIBindCtx@@2VPyComTypeObject@@A?GetConnectionInterface@PyIConnectionPoint@@SAPAU_object@@PAU2@0@Z__imp_?GetConnectionInterface@PyIConnectionPoint@@SAPAU_object@@PAU2@0@Z?GetConnectionPointContainer@PyIConnectionPoint@@SAPAU_object@@PAU2@0@Z__imp_?GetConnectionPointContainer@PyIConnectionPoint@@SAPAU_object@@PAU2@0@Z?Advise@PyIConnectionPoint@@SAPAU_object@@PAU2@0@Z__imp_?Advise@PyIConnectionPoint@@SAPAU_object@@PAU2@0@Z?Unadvise@PyIConnectionPoint@@SAPAU_object@@PAU2@0@Z__imp_?Unadvise@PyIConnectionPoint@@SAPAU_object@@PAU2@0@Z?EnumConnections@PyIConnectionPoint@@SAPAU_object@@PAU2@0@Z__imp_?EnumConnections@PyIConnectionPoint@@SAPAU_object@@PAU2@0@Z?GetI@PyIConnectionPoint@@SAPAUIConnectionPoint@@PAU_object@@@Z__imp_?GetI@PyIConnectionPoint@@SAPAUIConnectionPoint@@PAU_object@@@Z??0PyIConnectionPoint@@IAE@PAUIUnknown@@@Z__imp_??0PyIConnectionPoint@@IAE@PAUIUnknown@@@Z??1PyIConnectionPoint@@MAE@XZ__imp_??1PyIConnectionPoint@@MAE@XZ__imp_?type@PyIConnectionPoint@@2VPyComTypeObject@@A?EnumConnectionPoints@PyIConnectionPointContainer@@SAPAU_object@@PAU2@0@Z__imp_?EnumConnectionPoints@PyIConnectionPointContainer@@SAPAU_object@@PAU2@0@Z?FindConnectionPoint@PyIConnectionPointContainer@@SAPAU_object@@PAU2@0@Z__imp_?FindConnectionPoint@PyIConnectionPointContainer@@SAPAU_object@@PAU2@0@Z?GetI@PyIConnectionPointContainer@@SAPAUIConnectionPointContainer@@PAU_object@@@Z__imp_?GetI@PyIConnectionPointContainer@@SAPAUIConnectionPointContainer@@PAU_object@@@Z??0PyIConnectionPointContainer@@IAE@PAUIUnknown@@@Z__imp_??0PyIConnectionPointContainer@@IAE@PAUIUnknown@@@Z??1PyIConnectionPointContainer@@MAE@XZ__imp_??1PyIConnectionPointContainer@@MAE@XZ__imp_?type@PyIConnectionPointContainer@@2VPyComTypeObject@@A?Next@PyIEnumVARIANT@@SAPAU_object@@PAU2@0@Z__imp_?Next@PyIEnumVARIANT@@SAPAU_object@@PAU2@0@Z?Skip@PyIEnumVARIANT@@SAPAU_object@@PAU2@0@Z__imp_?Skip@PyIEnumVARIANT@@SAPAU_object@@PAU2@0@Z?Reset@PyIEnumVARIANT@@SAPAU_object@@PAU2@0@Z__imp_?Reset@PyIEnumVARIANT@@SAPAU_object@@PAU2@0@Z?Clone@PyIEnumVARIANT@@SAPAU_object@@PAU2@0@Z__imp_?Clone@PyIEnumVARIANT@@SAPAU_object@@PAU2@0@Z?GetI@PyIEnumVARIANT@@SAPAUIEnumVARIANT@@PAU_object@@@Z__imp_?GetI@PyIEnumVARIANT@@SAPAUIEnumVARIANT@@PAU_object@@@Z??0PyIEnumVARIANT@@IAE@PAUIUnknown@@@Z__imp_??0PyIEnumVARIANT@@IAE@PAUIUnknown@@@Z??1PyIEnumVARIANT@@MAE@XZ__imp_??1PyIEnumVARIANT@@MAE@XZ__imp_?type@PyIEnumVARIANT@@2VPyComEnumTypeObject@@A?Next@PyIEnumMoniker@@SAPAU_object@@PAU2@0@Z__imp_?Next@PyIEnumMoniker@@SAPAU_object@@PAU2@0@Z?Skip@PyIEnumMoniker@@SAPAU_object@@PAU2@0@Z__imp_?Skip@PyIEnumMoniker@@SAPAU_object@@PAU2@0@Z?Reset@PyIEnumMoniker@@SAPAU_object@@PAU2@0@Z__imp_?Reset@PyIEnumMoniker@@SAPAU_object@@PAU2@0@Z?Clone@PyIEnumMoniker@@SAPAU_object@@PAU2@0@Z__imp_?Clone@PyIEnumMoniker@@SAPAU_object@@PAU2@0@Z?BindToObject@PyIMoniker@@SAPAU_object@@PAU2@0@Z__imp_?BindToObject@PyIMoniker@@SAPAU_object@@PAU2@0@Z?BindToStorage@PyIMoniker@@SAPAU_object@@PAU2@0@Z__imp_?BindToStorage@PyIMoniker@@SAPAU_object@@PAU2@0@Z?ComposeWith@PyIMoniker@@SAPAU_object@@PAU2@0@Z__imp_?ComposeWith@PyIMoniker@@SAPAU_object@@PAU2@0@Z?Enum@PyIMoniker@@SAPAU_object@@PAU2@0@Z__imp_?Enum@PyIMoniker@@SAPAU_object@@PAU2@0@Z?IsEqual@PyIMoniker@@SAPAU_object@@PAU2@0@Z__imp_?IsEqual@PyIMoniker@@SAPAU_object@@PAU2@0@Z?Hash@PyIMoniker@@SAPAU_object@@PAU2@0@Z__imp_?Hash@PyIMoniker@@SAPAU_object@@PAU2@0@Z?GetDisplayName@PyIMoniker@@SAPAU_object@@PAU2@0@Z__imp_?GetDisplayName@PyIMoniker@@SAPAU_object@@PAU2@0@Z?IsSystemMoniker@PyIMoniker@@SAPAU_object@@PAU2@0@Z__imp_?IsSystemMoniker@PyIMoniker@@SAPAU_object@@PAU2@0@Z?GetI@PyIEnumMoniker@@SAPAUIEnumMoniker@@PAU_object@@@Z__imp_?GetI@PyIEnumMoniker@@SAPAUIEnumMoniker@@PAU_object@@@Z??0PyIEnumMoniker@@IAE@PAUIUnknown@@@Z__imp_??0PyIEnumMoniker@@IAE@PAUIUnknown@@@Z??1PyIEnumMoniker@@MAE@XZ__imp_??1PyIEnumMoniker@@MAE@XZ?GetI@PyIMoniker@@SAPAUIMoniker@@PAU_object@@@Z__imp_?GetI@PyIMoniker@@SAPAUIMoniker@@PAU_object@@@Z??0PyIMoniker@@IAE@PAUIUnknown@@@Z__imp_??0PyIMoniker@@IAE@PAUIUnknown@@@Z??1PyIMoniker@@MAE@XZ__imp_??1PyIMoniker@@MAE@XZ__imp_?type@PyIEnumMoniker@@2VPyComEnumTypeObject@@A__imp_?type@PyIMoniker@@2VPyComEnumProviderTypeObject@@A?GetWindow@PyIOleWindow@@SAPAU_object@@PAU2@0@Z__imp_?GetWindow@PyIOleWindow@@SAPAU_object@@PAU2@0@Z?ContextSensitiveHelp@PyIOleWindow@@SAPAU_object@@PAU2@0@Z__imp_?ContextSensitiveHelp@PyIOleWindow@@SAPAU_object@@PAU2@0@Z?GetI@PyIOleWindow@@SAPAUIOleWindow@@PAU_object@@@Z__imp_?GetI@PyIOleWindow@@SAPAUIOleWindow@@PAU_object@@@Z??0PyIOleWindow@@IAE@PAUIUnknown@@@Z__imp_??0PyIOleWindow@@IAE@PAUIUnknown@@@Z??1PyIOleWindow@@MAE@XZ__imp_??1PyIOleWindow@@MAE@XZ?GetWindow@PyGOleWindow@@MAGJPAPAUHWND__@@@Z__imp_?GetWindow@PyGOleWindow@@MAGJPAPAUHWND__@@@Z?ContextSensitiveHelp@PyGOleWindow@@MAGJH@Z__imp_?ContextSensitiveHelp@PyGOleWindow@@MAGJH@Z__imp_?type@PyIOleWindow@@2VPyComTypeObject@@A?GetClassID@PyIPersist@@SAPAU_object@@PAU2@0@Z__imp_?GetClassID@PyIPersist@@SAPAU_object@@PAU2@0@Z?GetI@PyIPersist@@SAPAUIPersist@@PAU_object@@@Z__imp_?GetI@PyIPersist@@SAPAUIPersist@@PAU_object@@@Z??0PyIPersist@@IAE@PAUIUnknown@@@Z__imp_??0PyIPersist@@IAE@PAUIUnknown@@@Z??1PyIPersist@@MAE@XZ__imp_??1PyIPersist@@MAE@XZ__imp_?type@PyIPersist@@2VPyComTypeObject@@A?IsDirty@PyIPersistStream@@SAPAU_object@@PAU2@0@Z__imp_?IsDirty@PyIPersistStream@@SAPAU_object@@PAU2@0@Z?Load@PyIPersistStream@@SAPAU_object@@PAU2@0@Z__imp_?Load@PyIPersistStream@@SAPAU_object@@PAU2@0@Z?Save@PyIPersistStream@@SAPAU_object@@PAU2@0@Z__imp_?Save@PyIPersistStream@@SAPAU_object@@PAU2@0@Z?GetSizeMax@PyIPersistStream@@SAPAU_object@@PAU2@0@Z__imp_?GetSizeMax@PyIPersistStream@@SAPAU_object@@PAU2@0@Z?GetI@PyIPersistStream@@SAPAUIPersistStream@@PAU_object@@@Z__imp_?GetI@PyIPersistStream@@SAPAUIPersistStream@@PAU_object@@@Z??0PyIPersistStream@@IAE@PAUIUnknown@@@Z__imp_??0PyIPersistStream@@IAE@PAUIUnknown@@@Z??1PyIPersistStream@@MAE@XZ__imp_??1PyIPersistStream@@MAE@XZ__imp_?type@PyIPersistStream@@2VPyComTypeObject@@A?InitNew@PyIPersistStreamInit@@SAPAU_object@@PAU2@0@Z__imp_?InitNew@PyIPersistStreamInit@@SAPAU_object@@PAU2@0@Z?GetI@PyIPersistStreamInit@@SAPAUIPersistStreamInit@@PAU_object@@@Z__imp_?GetI@PyIPersistStreamInit@@SAPAUIPersistStreamInit@@PAU_object@@@Z??0PyIPersistStreamInit@@IAE@PAUIUnknown@@@Z__imp_??0PyIPersistStreamInit@@IAE@PAUIUnknown@@@Z??1PyIPersistStreamInit@@MAE@XZ__imp_??1PyIPersistStreamInit@@MAE@XZ__imp_?type@PyIPersistStreamInit@@2VPyComTypeObject@@A?PyObject_FromPROPVARIANT@@YAPAU_object@@PAUtagPROPVARIANT@@@Z__imp_?PyObject_FromPROPVARIANT@@YAPAU_object@@PAUtagPROPVARIANT@@@Z?PyObject_FromPROPVARIANTs@@YAPAU_object@@PAUtagPROPVARIANT@@K@Z__imp_?PyObject_FromPROPVARIANTs@@YAPAU_object@@PAUtagPROPVARIANT@@K@Z?PyObject_AsPROPVARIANT@@YAHPAU_object@@PAUtagPROPVARIANT@@@Z__imp_?PyObject_AsPROPVARIANT@@YAHPAU_object@@PAUtagPROPVARIANT@@@Z?GetClassInfoW@PyIProvideClassInfo@@SAPAU_object@@PAU2@0@Z__imp_?GetClassInfoW@PyIProvideClassInfo@@SAPAU_object@@PAU2@0@Z?GetGUID@PyIProvideClassInfo2@@SAPAU_object@@PAU2@0@Z__imp_?GetGUID@PyIProvideClassInfo2@@SAPAU_object@@PAU2@0@Z?GetI@PyIProvideClassInfo@@SAPAUIProvideClassInfo@@PAU_object@@@Z__imp_?GetI@PyIProvideClassInfo@@SAPAUIProvideClassInfo@@PAU_object@@@Z??0PyIProvideClassInfo@@IAE@PAUIUnknown@@@Z__imp_??0PyIProvideClassInfo@@IAE@PAUIUnknown@@@Z??1PyIProvideClassInfo@@MAE@XZ__imp_??1PyIProvideClassInfo@@MAE@XZ?GetI@PyIProvideClassInfo2@@SAPAUIProvideClassInfo2@@PAU_object@@@Z__imp_?GetI@PyIProvideClassInfo2@@SAPAUIProvideClassInfo2@@PAU_object@@@Z??0PyIProvideClassInfo2@@IAE@PAUIUnknown@@@Z__imp_??0PyIProvideClassInfo2@@IAE@PAUIUnknown@@@Z??1PyIProvideClassInfo2@@MAE@XZ__imp_??1PyIProvideClassInfo2@@MAE@XZ__imp_?type@PyIProvideClassInfo@@2VPyComTypeObject@@A__imp_?type@PyIProvideClassInfo2@@2VPyComTypeObject@@A?QueryService@PyIServiceProvider@@SAPAU_object@@PAU2@0@Z__imp_?QueryService@PyIServiceProvider@@SAPAU_object@@PAU2@0@Z?GetI@PyIServiceProvider@@SAPAUIServiceProvider@@PAU_object@@@Z__imp_?GetI@PyIServiceProvider@@SAPAUIServiceProvider@@PAU_object@@@Z??0PyIServiceProvider@@IAE@PAUIUnknown@@@Z__imp_??0PyIServiceProvider@@IAE@PAUIUnknown@@@Z??1PyIServiceProvider@@MAE@XZ__imp_??1PyIServiceProvider@@MAE@XZ__imp_?type@PyIServiceProvider@@2VPyComTypeObject@@A?Read@PyIStream@@SAPAU_object@@PAU2@0@Z__imp_?Read@PyIStream@@SAPAU_object@@PAU2@0@Z?Write@PyIStream@@SAPAU_object@@PAU2@0@Z__imp_?Write@PyIStream@@SAPAU_object@@PAU2@0@Z?Seek@PyIStream@@SAPAU_object@@PAU2@0@Z__imp_?Seek@PyIStream@@SAPAU_object@@PAU2@0@Z?SetSize@PyIStream@@SAPAU_object@@PAU2@0@Z__imp_?SetSize@PyIStream@@SAPAU_object@@PAU2@0@Z?CopyTo@PyIStream@@SAPAU_object@@PAU2@0@Z__imp_?CopyTo@PyIStream@@SAPAU_object@@PAU2@0@Z?Commit@PyIStream@@SAPAU_object@@PAU2@0@Z__imp_?Commit@PyIStream@@SAPAU_object@@PAU2@0@Z?Revert@PyIStream@@SAPAU_object@@PAU2@0@Z__imp_?Revert@PyIStream@@SAPAU_object@@PAU2@0@Z?LockRegion@PyIStream@@SAPAU_object@@PAU2@0@Z__imp_?LockRegion@PyIStream@@SAPAU_object@@PAU2@0@Z?UnlockRegion@PyIStream@@SAPAU_object@@PAU2@0@Z__imp_?UnlockRegion@PyIStream@@SAPAU_object@@PAU2@0@Z?Stat@PyIStream@@SAPAU_object@@PAU2@0@Z__imp_?Stat@PyIStream@@SAPAU_object@@PAU2@0@Z?Clone@PyIStream@@SAPAU_object@@PAU2@0@Z__imp_?Clone@PyIStream@@SAPAU_object@@PAU2@0@Z?GetI@PyIStream@@SAPAUIStream@@PAU_object@@@Z__imp_?GetI@PyIStream@@SAPAUIStream@@PAU_object@@@Z??0PyIStream@@IAE@PAUIUnknown@@@Z__imp_??0PyIStream@@IAE@PAUIUnknown@@@Z??1PyIStream@@MAE@XZ__imp_??1PyIStream@@MAE@XZ__imp_?type@PyIStream@@2VPyComTypeObject@@A?GetI@PyITypeInfo@@SAPAUITypeInfo@@PAU_object@@@Z__imp_?GetI@PyITypeInfo@@SAPAUITypeInfo@@PAU_object@@@Z?GetContainingTypeLib@PyITypeInfo@@QAEPAU_object@@XZ__imp_?GetContainingTypeLib@PyITypeInfo@@QAEPAU_object@@XZ?GetDocumentation@PyITypeInfo@@QAEPAU_object@@J@Z__imp_?GetDocumentation@PyITypeInfo@@QAEPAU_object@@J@Z?GetRefTypeInfo@PyITypeInfo@@QAEPAU_object@@K@Z__imp_?GetRefTypeInfo@PyITypeInfo@@QAEPAU_object@@K@Z?GetRefTypeOfImplType@PyITypeInfo@@QAEPAU_object@@H@Z__imp_?GetRefTypeOfImplType@PyITypeInfo@@QAEPAU_object@@H@Z?GetFuncDesc@PyITypeInfo@@QAEPAU_object@@H@Z__imp_?GetFuncDesc@PyITypeInfo@@QAEPAU_object@@H@Z?GetNames@PyITypeInfo@@QAEPAU_object@@J@Z__imp_?GetNames@PyITypeInfo@@QAEPAU_object@@J@Z?GetTypeAttr@PyITypeInfo@@QAEPAU_object@@XZ__imp_?GetTypeAttr@PyITypeInfo@@QAEPAU_object@@XZ?GetVarDesc@PyITypeInfo@@QAEPAU_object@@H@Z__imp_?GetVarDesc@PyITypeInfo@@QAEPAU_object@@H@Z?GetImplTypeFlags@PyITypeInfo@@QAEPAU_object@@H@Z__imp_?GetImplTypeFlags@PyITypeInfo@@QAEPAU_object@@H@Z?GetTypeComp@PyITypeInfo@@QAEPAU_object@@XZ__imp_?GetTypeComp@PyITypeInfo@@QAEPAU_object@@XZ??0PyITypeInfo@@IAE@PAUIUnknown@@@Z__imp_??0PyITypeInfo@@IAE@PAUIUnknown@@@Z??1PyITypeInfo@@MAE@XZ__imp_??1PyITypeInfo@@MAE@XZ?GetI@PyITypeComp@@SAPAUITypeComp@@PAU_object@@@Z__imp_?GetI@PyITypeComp@@SAPAUITypeComp@@PAU_object@@@Z?Bind@PyITypeComp@@QAEPAU_object@@PA_WG@Z__imp_?Bind@PyITypeComp@@QAEPAU_object@@PA_WG@Z?BindType@PyITypeComp@@QAEPAU_object@@PA_W@Z__imp_?BindType@PyITypeComp@@QAEPAU_object@@PA_W@Z??0PyITypeComp@@IAE@PAUIUnknown@@@Z__imp_??0PyITypeComp@@IAE@PAUIUnknown@@@Z??1PyITypeComp@@MAE@XZ__imp_??1PyITypeComp@@MAE@XZ?GetI@PyITypeLib@@SAPAUITypeLib@@PAU_object@@@Z__imp_?GetI@PyITypeLib@@SAPAUITypeLib@@PAU_object@@@Z?GetLibAttr@PyITypeLib@@QAEPAU_object@@XZ__imp_?GetLibAttr@PyITypeLib@@QAEPAU_object@@XZ?GetDocumentation@PyITypeLib@@QAEPAU_object@@H@Z__imp_?GetDocumentation@PyITypeLib@@QAEPAU_object@@H@Z?GetTypeInfo@PyITypeLib@@QAEPAU_object@@H@Z__imp_?GetTypeInfo@PyITypeLib@@QAEPAU_object@@H@Z?GetTypeInfoCount@PyITypeLib@@QAEPAU_object@@XZ__imp_?GetTypeInfoCount@PyITypeLib@@QAEPAU_object@@XZ?GetTypeInfoOfGuid@PyITypeLib@@QAEPAU_object@@ABU_GUID@@@Z__imp_?GetTypeInfoOfGuid@PyITypeLib@@QAEPAU_object@@ABU_GUID@@@Z?GetTypeInfoType@PyITypeLib@@QAEPAU_object@@H@Z__imp_?GetTypeInfoType@PyITypeLib@@QAEPAU_object@@H@Z?GetTypeComp@PyITypeLib@@QAEPAU_object@@XZ__imp_?GetTypeComp@PyITypeLib@@QAEPAU_object@@XZ??0PyITypeLib@@IAE@PAUIUnknown@@@Z__imp_??0PyITypeLib@@IAE@PAUIUnknown@@@Z??1PyITypeLib@@MAE@XZ__imp_??1PyITypeLib@@MAE@XZ__imp_?type@PyITypeInfo@@2VPyComTypeObject@@A__imp_?type@PyITypeComp@@2VPyComTypeObject@@A__imp_?type@PyITypeLib@@2VPyComTypeObject@@A?deallocFunc@PySTGMEDIUM@@SAXPAU_object@@@Z__imp_?deallocFunc@PySTGMEDIUM@@SAXPAU_object@@@Z?getattro@PySTGMEDIUM@@SAPAU_object@@PAU2@0@Z__imp_?getattro@PySTGMEDIUM@@SAPAU_object@@PAU2@0@Z__imp_?methods@PySTGMEDIUM@@2PAUPyMethodDef@@A__imp_?Type@PySTGMEDIUM@@2U_typeobject@@A??0PySTGMEDIUM@@QAE@PAUtagSTGMEDIUM@@@Z__imp_??0PySTGMEDIUM@@QAE@PAUtagSTGMEDIUM@@@Z??1PySTGMEDIUM@@QAE@XZ__imp_??1PySTGMEDIUM@@QAE@XZ?DropOwnership@PySTGMEDIUM@@QAEXXZ__imp_?DropOwnership@PySTGMEDIUM@@QAEXXZ?Close@PySTGMEDIUM@@QAEXXZ__imp_?Close@PySTGMEDIUM@@QAEXXZ?CopyTo@PySTGMEDIUM@@QAEHPAUtagSTGMEDIUM@@@Z__imp_?CopyTo@PySTGMEDIUM@@QAEHPAUtagSTGMEDIUM@@@Z?PyObject_FromSTGMEDIUM@@YAPAVPySTGMEDIUM@@PAUtagSTGMEDIUM@@@Z__imp_?PyObject_FromSTGMEDIUM@@YAPAVPySTGMEDIUM@@PAUtagSTGMEDIUM@@@Z?PyCom_SAFEARRAYFromPyObject@@YAHPAU_object@@PAPAUtagSAFEARRAY@@W4VARENUM@@@Z__imp_?PyCom_SAFEARRAYFromPyObject@@YAHPAU_object@@PAPAUtagSAFEARRAY@@W4VARENUM@@@Z?PyCom_PyObjectFromSAFEARRAY@@YAPAU_object@@PAUtagSAFEARRAY@@W4VARENUM@@@Z__imp_?PyCom_PyObjectFromSAFEARRAY@@YAPAU_object@@PAUtagSAFEARRAY@@W4VARENUM@@@Z??0PythonOleArgHelper@@QAE@XZ__imp_??0PythonOleArgHelper@@QAE@XZ??1PythonOleArgHelper@@QAE@XZ__imp_??1PythonOleArgHelper@@QAE@XZ?ParseTypeInformation@PythonOleArgHelper@@QAEHPAU_object@@@Z__imp_?ParseTypeInformation@PythonOleArgHelper@@QAEHPAU_object@@@Z?MakeObjToVariant@PythonOleArgHelper@@QAEHPAU_object@@PAUtagVARIANT@@0@Z__imp_?MakeObjToVariant@PythonOleArgHelper@@QAEHPAU_object@@PAUtagVARIANT@@0@Z?MakeVariantToObj@PythonOleArgHelper@@QAEPAU_object@@PAUtagVARIANT@@@Z__imp_?MakeVariantToObj@PythonOleArgHelper@@QAEPAU_object@@PAUtagVARIANT@@@Z?MakePythonArgumentTuples@@YAHPAPAU_object@@PAPAVPythonOleArgHelper@@01PAUtagDISPPARAMS@@@Z__imp_?MakePythonArgumentTuples@@YAHPAPAU_object@@PAPAVPythonOleArgHelper@@01PAUtagDISPPARAMS@@@Z / 1605328448 0 44599 ` F\^_f$@ [dL‘0ԂܒR:BHIhrj2   zT N̢RΣFXԤ&r~> n F: ojn"^x0D"Lwn%r|>$r{ &r}VJ9k9lzZ  4,D-:,-cTEbGRHfIb')j~XD H  ):'@Nng~aցL.2.,fa^gd^40F6 r@l>XD"MKbh8GFHC KDMALNj"DOJ00($nm$nPQ2N0LB7}DYڥv\4$tz@` "teJ=3r/Hfdfp (u!8vp &riq#ny s`dZ=jd3.Ѓdedl.Jdn8p`Ա̧PV HZZ*[8P26NiN<|?@VkOnHfl`PtD<l5@RpR;4^:zoq R*S>zzrSsxHT\7XtTX:uj^UX**x(wjvVU.1$xW1.A.8*;Ծ5@<νyhW(Z$Vz{VRv$zލv`h|ΎX(X8YCjEJ>Ѐ`X+2X2>Whle 99BLHP26`Pcjqy~?<EBH/qoprf:CIaQdkrz :MQ37 @=FCI0+*'&)(-,R >WXVNYmhZE@7F20o<=]8AG_Obipx} 61wlg\|t[^u~SK} *+,#$tSzwx%yv "!T8JN14>;DAG.|m{n4UM5v3KO5TL ?gijk-./ hle 99BLHP26`Pcjqy~?<EBH/qoprf:CIaQdkrz :MQ37 @=FCI0+*'&)(-,R&#%$UY_`WX "[Z!]\^V >WXVNYmhZE@7F20o<=]8AG_Obipx} 61wlg\|t[^u~SK} *+,#$tSzwx%yv "!T8JN14>;DAG.|m{ncabd4UM5v3KO5TL ?gijk;DJeRfns{-./ ??0CPyFactory@@QAE@ABU_GUID@@@Z??0CPyFactory@@QAE@ABV0@@Z??0PyComEnumProviderTypeObject@@QAE@PBDPAVPyComTypeObject@@HPAUPyMethodDef@@P6APAVPyIUnknown@@PAUIUnknown@@@Z0@Z??0PyComEnumTypeObject@@QAE@PBDPAVPyComTypeObject@@HPAUPyMethodDef@@P6APAVPyIUnknown@@PAUIUnknown@@@Z@Z??0PyComTypeObject@@QAE@PBDPAV0@HPAUPyMethodDef@@P6APAVPyIUnknown@@PAUIUnknown@@@Z@Z??0PyGOleWindow@@IAE@PAU_object@@@Z??0PyGOleWindow@@QAE@$$QAV0@@Z??0PyGOleWindow@@QAE@ABV0@@Z??0PyGPersist@@IAE@PAU_object@@@Z??0PyGPersist@@QAE@$$QAV0@@Z??0PyGPersist@@QAE@ABV0@@Z??0PyGatewayBase@@IAE@PAU_object@@@Z??0PyGatewayBase@@QAE@ABV0@@Z??0PyIBase@@IAE@XZ??0PyIBase@@QAE@ABV0@@Z??0PyIBindCtx@@IAE@PAUIUnknown@@@Z??0PyIBindCtx@@QAE@ABV0@@Z??0PyIClassFactory@@IAE@PAUIUnknown@@@Z??0PyIClassFactory@@QAE@ABV0@@Z??0PyIConnectionPoint@@IAE@PAUIUnknown@@@Z??0PyIConnectionPoint@@QAE@ABV0@@Z??0PyIConnectionPointContainer@@IAE@PAUIUnknown@@@Z??0PyIConnectionPointContainer@@QAE@ABV0@@Z??0PyIDispatch@@IAE@PAUIUnknown@@@Z??0PyIDispatch@@QAE@ABV0@@Z??0PyIDispatchEx@@IAE@PAUIUnknown@@@Z??0PyIDispatchEx@@QAE@ABV0@@Z??0PyIEnumMoniker@@IAE@PAUIUnknown@@@Z??0PyIEnumMoniker@@QAE@ABV0@@Z??0PyIEnumVARIANT@@IAE@PAUIUnknown@@@Z??0PyIEnumVARIANT@@QAE@ABV0@@Z??0PyIMoniker@@IAE@PAUIUnknown@@@Z??0PyIMoniker@@QAE@ABV0@@Z??0PyIOleWindow@@IAE@PAUIUnknown@@@Z??0PyIOleWindow@@QAE@ABV0@@Z??0PyIPersist@@IAE@PAUIUnknown@@@Z??0PyIPersist@@QAE@ABV0@@Z??0PyIPersistStream@@IAE@PAUIUnknown@@@Z??0PyIPersistStream@@QAE@ABV0@@Z??0PyIPersistStreamInit@@IAE@PAUIUnknown@@@Z??0PyIPersistStreamInit@@QAE@ABV0@@Z??0PyIProvideClassInfo2@@IAE@PAUIUnknown@@@Z??0PyIProvideClassInfo2@@QAE@ABV0@@Z??0PyIProvideClassInfo@@IAE@PAUIUnknown@@@Z??0PyIProvideClassInfo@@QAE@ABV0@@Z??0PyIServiceProvider@@IAE@PAUIUnknown@@@Z??0PyIServiceProvider@@QAE@ABV0@@Z??0PyIStream@@IAE@PAUIUnknown@@@Z??0PyIStream@@QAE@ABV0@@Z??0PyITypeComp@@IAE@PAUIUnknown@@@Z??0PyITypeComp@@QAE@ABV0@@Z??0PyITypeInfo@@IAE@PAUIUnknown@@@Z??0PyITypeInfo@@QAE@ABV0@@Z??0PyITypeLib@@IAE@PAUIUnknown@@@Z??0PyITypeLib@@QAE@ABV0@@Z??0PyIUnknown@@IAE@PAUIUnknown@@@Z??0PyIUnknown@@QAE@ABV0@@Z??0PyOleArgNotFound@@QAE@XZ??0PyOleEmpty@@QAE@XZ??0PyOleMissing@@QAE@XZ??0PyOleNothing@@QAE@XZ??0PySTGMEDIUM@@QAE@PAUtagSTGMEDIUM@@@Z??0PythonOleArgHelper@@QAE@XZ??1CPyFactory@@QAE@XZ??1PyComEnumProviderTypeObject@@QAE@XZ??1PyComEnumTypeObject@@QAE@XZ??1PyComTypeObject@@QAE@XZ??1PyGOleWindow@@UAE@XZ??1PyGPersist@@UAE@XZ??1PyGatewayBase@@MAE@XZ??1PyIBase@@MAE@XZ??1PyIBindCtx@@MAE@XZ??1PyIClassFactory@@MAE@XZ??1PyIConnectionPoint@@MAE@XZ??1PyIConnectionPointContainer@@MAE@XZ??1PyIDispatch@@MAE@XZ??1PyIDispatchEx@@MAE@XZ??1PyIEnumMoniker@@MAE@XZ??1PyIEnumVARIANT@@MAE@XZ??1PyIMoniker@@MAE@XZ??1PyIOleWindow@@MAE@XZ??1PyIPersist@@MAE@XZ??1PyIPersistStream@@MAE@XZ??1PyIPersistStreamInit@@MAE@XZ??1PyIProvideClassInfo2@@MAE@XZ??1PyIProvideClassInfo@@MAE@XZ??1PyIServiceProvider@@MAE@XZ??1PyIStream@@MAE@XZ??1PyITypeComp@@MAE@XZ??1PyITypeInfo@@MAE@XZ??1PyITypeLib@@MAE@XZ??1PyIUnknown@@MAE@XZ??1PySTGMEDIUM@@QAE@XZ??1PythonOleArgHelper@@QAE@XZ??4CPyFactory@@QAEAAV0@ABV0@@Z??4PyComEnumProviderTypeObject@@QAEAAV0@$$QAV0@@Z??4PyComEnumProviderTypeObject@@QAEAAV0@ABV0@@Z??4PyComEnumTypeObject@@QAEAAV0@$$QAV0@@Z??4PyComEnumTypeObject@@QAEAAV0@ABV0@@Z??4PyComTypeObject@@QAEAAV0@ABV0@@Z??4PyGOleWindow@@QAEAAV0@$$QAV0@@Z??4PyGOleWindow@@QAEAAV0@ABV0@@Z??4PyGPersist@@QAEAAV0@$$QAV0@@Z??4PyGPersist@@QAEAAV0@ABV0@@Z??4PyGatewayBase@@QAEAAV0@ABV0@@Z??4PyIBase@@QAEAAV0@ABV0@@Z??4PyIBindCtx@@QAEAAV0@ABV0@@Z??4PyIClassFactory@@QAEAAV0@ABV0@@Z??4PyIConnectionPoint@@QAEAAV0@ABV0@@Z??4PyIConnectionPointContainer@@QAEAAV0@ABV0@@Z??4PyIDispatch@@QAEAAV0@ABV0@@Z??4PyIDispatchEx@@QAEAAV0@ABV0@@Z??4PyIEnumMoniker@@QAEAAV0@ABV0@@Z??4PyIEnumVARIANT@@QAEAAV0@ABV0@@Z??4PyIMoniker@@QAEAAV0@ABV0@@Z??4PyIOleWindow@@QAEAAV0@ABV0@@Z??4PyIPersist@@QAEAAV0@ABV0@@Z??4PyIPersistStream@@QAEAAV0@ABV0@@Z??4PyIPersistStreamInit@@QAEAAV0@ABV0@@Z??4PyIProvideClassInfo2@@QAEAAV0@ABV0@@Z??4PyIProvideClassInfo@@QAEAAV0@ABV0@@Z??4PyIServiceProvider@@QAEAAV0@ABV0@@Z??4PyIStream@@QAEAAV0@ABV0@@Z??4PyITypeComp@@QAEAAV0@ABV0@@Z??4PyITypeInfo@@QAEAAV0@ABV0@@Z??4PyITypeLib@@QAEAAV0@ABV0@@Z??4PyIUnknown@@QAEAAV0@ABV0@@Z??4PyOleArgNotFound@@QAEAAV0@$$QAV0@@Z??4PyOleArgNotFound@@QAEAAV0@ABV0@@Z??4PyOleEmpty@@QAEAAV0@$$QAV0@@Z??4PyOleEmpty@@QAEAAV0@ABV0@@Z??4PyOleMissing@@QAEAAV0@$$QAV0@@Z??4PyOleMissing@@QAEAAV0@ABV0@@Z??4PyOleNothing@@QAEAAV0@$$QAV0@@Z??4PyOleNothing@@QAEAAV0@ABV0@@Z??4PySTGMEDIUM@@QAEAAV0@ABV0@@Z??4PythonOleArgHelper@@QAEAAV0@ABV0@@Z??_FPySTGMEDIUM@@QAEXXZ?AddRef@CPyFactory@@UAGKXZ?AddRef@PyGOleWindow@@MAGKXZ?AddRef@PyGPersist@@MAGKXZ?AddRef@PyGatewayBase@@UAGKXZ?Advise@PyIConnectionPoint@@SAPAU_object@@PAU2@0@Z?Bind@PyITypeComp@@QAEPAU_object@@PA_WG@Z?BindToObject@PyIMoniker@@SAPAU_object@@PAU2@0@Z?BindToStorage@PyIMoniker@@SAPAU_object@@PAU2@0@Z?BindType@PyITypeComp@@QAEPAU_object@@PA_W@Z?Clone@PyIEnumMoniker@@SAPAU_object@@PAU2@0@Z?Clone@PyIEnumVARIANT@@SAPAU_object@@PAU2@0@Z?Clone@PyIStream@@SAPAU_object@@PAU2@0@Z?Close@PySTGMEDIUM@@QAEXXZ?Commit@PyIStream@@SAPAU_object@@PAU2@0@Z?ComposeWith@PyIMoniker@@SAPAU_object@@PAU2@0@Z?ContextSensitiveHelp@PyGOleWindow@@MAGJH@Z?ContextSensitiveHelp@PyIOleWindow@@SAPAU_object@@PAU2@0@Z?CopyTo@PyIStream@@SAPAU_object@@PAU2@0@Z?CopyTo@PySTGMEDIUM@@QAEHPAUtagSTGMEDIUM@@@Z?CreateInstance@CPyFactory@@UAGJPAUIUnknown@@ABU_GUID@@PAPAX@Z?CreateInstance@PyIClassFactory@@SAPAU_object@@PAU2@0@Z?CreateNewPythonInstance@CPyFactory@@IAGJABU_GUID@@0PAPAU_object@@@Z?DeleteMemberByDispID@PyGatewayBase@@UAGJJ@Z?DeleteMemberByDispID@PyIDispatchEx@@SAPAU_object@@PAU2@0@Z?DeleteMemberByName@PyGatewayBase@@UAGJPA_WK@Z?DeleteMemberByName@PyIDispatchEx@@SAPAU_object@@PAU2@0@Z?DropOwnership@PySTGMEDIUM@@QAEXXZ?Enum@PyIMoniker@@SAPAU_object@@PAU2@0@Z?EnumConnectionPoints@PyIConnectionPointContainer@@SAPAU_object@@PAU2@0@Z?EnumConnections@PyIConnectionPoint@@SAPAU_object@@PAU2@0@Z?EnumObjectParam@PyIBindCtx@@SAPAU_object@@PAU2@0@Z?FindConnectionPoint@PyIConnectionPointContainer@@SAPAU_object@@PAU2@0@Z?GetBindOptions@PyIBindCtx@@SAPAU_object@@PAU2@0@Z?GetClassID@PyGPersist@@MAGJPAU_GUID@@@Z?GetClassID@PyIPersist@@SAPAU_object@@PAU2@0@Z?GetClassInfoW@PyIProvideClassInfo@@SAPAU_object@@PAU2@0@Z?GetConnectionInterface@PyIConnectionPoint@@SAPAU_object@@PAU2@0@Z?GetConnectionPointContainer@PyIConnectionPoint@@SAPAU_object@@PAU2@0@Z?GetContainingTypeLib@PyITypeInfo@@QAEPAU_object@@XZ?GetDispID@PyGatewayBase@@UAGJPA_WKPAJ@Z?GetDispID@PyIDispatchEx@@SAPAU_object@@PAU2@0@Z?GetDisplayName@PyIMoniker@@SAPAU_object@@PAU2@0@Z?GetDocumentation@PyITypeInfo@@QAEPAU_object@@J@Z?GetDocumentation@PyITypeLib@@QAEPAU_object@@H@Z?GetFuncDesc@PyITypeInfo@@QAEPAU_object@@H@Z?GetGUID@PyIProvideClassInfo2@@SAPAU_object@@PAU2@0@Z?GetI@PyIBindCtx@@SAPAUIBindCtx@@PAU_object@@@Z?GetI@PyIClassFactory@@SAPAUIClassFactory@@PAU_object@@@Z?GetI@PyIConnectionPoint@@SAPAUIConnectionPoint@@PAU_object@@@Z?GetI@PyIConnectionPointContainer@@SAPAUIConnectionPointContainer@@PAU_object@@@Z?GetI@PyIDispatch@@SAPAUIDispatch@@PAU_object@@@Z?GetI@PyIDispatchEx@@SAPAUIDispatchEx@@PAU_object@@@Z?GetI@PyIEnumMoniker@@SAPAUIEnumMoniker@@PAU_object@@@Z?GetI@PyIEnumVARIANT@@SAPAUIEnumVARIANT@@PAU_object@@@Z?GetI@PyIMoniker@@SAPAUIMoniker@@PAU_object@@@Z?GetI@PyIOleWindow@@SAPAUIOleWindow@@PAU_object@@@Z?GetI@PyIPersist@@SAPAUIPersist@@PAU_object@@@Z?GetI@PyIPersistStream@@SAPAUIPersistStream@@PAU_object@@@Z?GetI@PyIPersistStreamInit@@SAPAUIPersistStreamInit@@PAU_object@@@Z?GetI@PyIProvideClassInfo2@@SAPAUIProvideClassInfo2@@PAU_object@@@Z?GetI@PyIProvideClassInfo@@SAPAUIProvideClassInfo@@PAU_object@@@Z?GetI@PyIServiceProvider@@SAPAUIServiceProvider@@PAU_object@@@Z?GetI@PyIStream@@SAPAUIStream@@PAU_object@@@Z?GetI@PyITypeComp@@SAPAUITypeComp@@PAU_object@@@Z?GetI@PyITypeInfo@@SAPAUITypeInfo@@PAU_object@@@Z?GetI@PyITypeLib@@SAPAUITypeLib@@PAU_object@@@Z?GetI@PyIUnknown@@SAPAUIUnknown@@PAU_object@@@Z?GetIDsOfNames@PyGatewayBase@@UAGJABU_GUID@@PAPA_WIKPAJ@Z?GetIDsOfNames@PyIDispatch@@SAPAU_object@@PAU2@0@Z?GetIID@PyGOleWindow@@MAE?AU_GUID@@XZ?GetIID@PyGPersist@@MAE?AU_GUID@@XZ?GetIID@PyGatewayBase@@UAE?AU_GUID@@XZ?GetImplTypeFlags@PyITypeInfo@@QAEPAU_object@@H@Z?GetLibAttr@PyITypeLib@@QAEPAU_object@@XZ?GetMemberName@PyGatewayBase@@UAGJJPAPA_W@Z?GetMemberName@PyIDispatchEx@@SAPAU_object@@PAU2@0@Z?GetMemberProperties@PyGatewayBase@@UAGJJKPAK@Z?GetMemberProperties@PyIDispatchEx@@SAPAU_object@@PAU2@0@Z?GetNameSpaceParent@PyGatewayBase@@UAGJPAPAUIUnknown@@@Z?GetNames@PyITypeInfo@@QAEPAU_object@@J@Z?GetNextDispID@PyGatewayBase@@UAGJKJPAJ@Z?GetNextDispID@PyIDispatchEx@@SAPAU_object@@PAU2@0@Z?GetObjectParam@PyIBindCtx@@SAPAU_object@@PAU2@0@Z?GetRefTypeInfo@PyITypeInfo@@QAEPAU_object@@K@Z?GetRefTypeOfImplType@PyITypeInfo@@QAEPAU_object@@H@Z?GetRunningObjectTable@PyIBindCtx@@SAPAU_object@@PAU2@0@Z?GetSizeMax@PyIPersistStream@@SAPAU_object@@PAU2@0@Z?GetTypeAttr@PyITypeInfo@@QAEPAU_object@@XZ?GetTypeComp@PyITypeInfo@@QAEPAU_object@@XZ?GetTypeComp@PyITypeLib@@QAEPAU_object@@XZ?GetTypeInfo@PyGatewayBase@@UAGJIKPAPAUITypeInfo@@@Z?GetTypeInfo@PyIDispatch@@SAPAU_object@@PAU2@0@Z?GetTypeInfo@PyITypeLib@@QAEPAU_object@@H@Z?GetTypeInfoCount@PyGatewayBase@@UAGJPAI@Z?GetTypeInfoCount@PyIDispatch@@SAPAU_object@@PAU2@0@Z?GetTypeInfoCount@PyITypeLib@@QAEPAU_object@@XZ?GetTypeInfoOfGuid@PyITypeLib@@QAEPAU_object@@ABU_GUID@@@Z?GetTypeInfoType@PyITypeLib@@QAEPAU_object@@H@Z?GetVarDesc@PyITypeInfo@@QAEPAU_object@@H@Z?GetWindow@PyGOleWindow@@MAGJPAPAUHWND__@@@Z?GetWindow@PyIOleWindow@@SAPAU_object@@PAU2@0@Z?Hash@PyIMoniker@@SAPAU_object@@PAU2@0@Z?InitNew@PyIPersistStreamInit@@SAPAU_object@@PAU2@0@Z?InterfaceSupportsErrorInfo@PyGatewayBase@@UAGJABU_GUID@@@Z?Invoke@PyGatewayBase@@UAGJJABU_GUID@@KGPAUtagDISPPARAMS@@PAUtagVARIANT@@PAUtagEXCEPINFO@@PAI@Z?Invoke@PyIDispatch@@SAPAU_object@@PAU2@0@Z?InvokeEx@PyGatewayBase@@UAGJJKGPAUtagDISPPARAMS@@PAUtagVARIANT@@PAUtagEXCEPINFO@@PAUIServiceProvider@@@Z?InvokeEx@PyIDispatchEx@@SAPAU_object@@PAU2@0@Z?InvokeTypes@PyIDispatch@@SAPAU_object@@PAU2@0@Z?InvokeViaPolicy@PyGatewayBase@@MAAJPBDPAPAU_object@@0ZZ?IsDirty@PyIPersistStream@@SAPAU_object@@PAU2@0@Z?IsEqual@PyIMoniker@@SAPAU_object@@PAU2@0@Z?IsSystemMoniker@PyIMoniker@@SAPAU_object@@PAU2@0@Z?Load@PyIPersistStream@@SAPAU_object@@PAU2@0@Z?LockRegion@PyIStream@@SAPAU_object@@PAU2@0@Z?LockServer@CPyFactory@@UAGJH@Z?LockServer@PyIClassFactory@@SAPAU_object@@PAU2@0@Z?MakeBstrToObj@@YAPAU_object@@QA_W@Z?MakeOLECHARToObj@@YAPAU_object@@PB_W@Z?MakeOLECHARToObj@@YAPAU_object@@PB_WH@Z?MakeObjToVariant@PythonOleArgHelper@@QAEHPAU_object@@PAUtagVARIANT@@0@Z?MakePythonArgumentTuples@@YAHPAPAU_object@@PAPAVPythonOleArgHelper@@01PAUtagDISPPARAMS@@@Z?MakeVariantToObj@PythonOleArgHelper@@QAEPAU_object@@PAUtagVARIANT@@@Z?Next@PyIEnumMoniker@@SAPAU_object@@PAU2@0@Z?Next@PyIEnumVARIANT@@SAPAU_object@@PAU2@0@Z?ParseTypeInformation@PythonOleArgHelper@@QAEHPAU_object@@@Z?PyCom_BstrFromPyObject@@YAHPAU_object@@PAPA_WH@Z?PyCom_BuildInternalPyException@@YAPAU_object@@PAD@Z?PyCom_BuildPyException@@YAPAU_object@@JPAUIUnknown@@ABU_GUID@@@Z?PyCom_BuildPyExceptionFromEXCEPINFO@@YAPAU_object@@JPAUtagEXCEPINFO@@I@Z?PyCom_CoInitialize@@YAJPAX@Z?PyCom_CoInitializeEx@@YAJPAXK@Z?PyCom_CoUninitialize@@YAXXZ?PyCom_DLLAddRef@@YAXXZ?PyCom_DLLReleaseRef@@YAXXZ?PyCom_EnableQuitMessage@@YAXK@Z?PyCom_ExcepInfoFromPyException@@YAXPAUtagEXCEPINFO@@@Z?PyCom_ExcepInfoFromPyObject@@YAHPAU_object@@PAUtagEXCEPINFO@@PAJ@Z?PyCom_InterfaceFromPyInstanceOrObject@@YAHPAU_object@@ABU_GUID@@PAPAXH@Z?PyCom_InterfaceFromPyObject@@YAHPAU_object@@ABU_GUID@@PAPAXH@Z?PyCom_IsGatewayRegistered@@YAHABU_GUID@@@Z?PyCom_LogF@@YAXPBDZZ?PyCom_LoggerException@@YAXPAU_object@@PBDZZ?PyCom_LoggerNonServerException@@YAXPAU_object@@PBDZZ?PyCom_LoggerWarning@@YAXPAU_object@@PBDZZ?PyCom_MakeOlePythonCall@@YAHPAU_object@@PAUtagDISPPARAMS@@PAUtagVARIANT@@PAUtagEXCEPINFO@@PAI0@Z?PyCom_PyObjectAsSTATPROPSETSTG@@YAHPAU_object@@PAUtagSTATPROPSETSTG@@@Z?PyCom_PyObjectAsSTATSTG@@YAHPAU_object@@PAUtagSTATSTG@@K@Z?PyCom_PyObjectAsSTGOPTIONS@@YAHPAU_object@@PAPAUtagSTGOPTIONS@@@Z?PyCom_PyObjectFromExcepInfo@@YAPAU_object@@PBUtagEXCEPINFO@@@Z?PyCom_PyObjectFromIUnknown@@YAPAU_object@@PAUIUnknown@@ABU_GUID@@H@Z?PyCom_PyObjectFromSAFEARRAY@@YAPAU_object@@PAUtagSAFEARRAY@@W4VARENUM@@@Z?PyCom_PyObjectFromSTATPROPSETSTG@@YAPAU_object@@PAUtagSTATPROPSETSTG@@@Z?PyCom_PyObjectFromSTATSTG@@YAPAU_object@@PAUtagSTATSTG@@@Z?PyCom_PyObjectFromVariant@@YAPAU_object@@PBUtagVARIANT@@@Z?PyCom_RegisterClientType@@YAHPAU_typeobject@@PBU_GUID@@@Z?PyCom_RegisterExtensionSupport@@YAHPAU_object@@PBUPyCom_InterfaceSupportInfo@@H@Z?PyCom_RegisterGatewayObject@@YAJABU_GUID@@P6AJPAU_object@@PAVPyGatewayBase@@PAPAX0@ZPBD@Z?PyCom_SAFEARRAYFromPyObject@@YAHPAU_object@@PAPAUtagSAFEARRAY@@W4VARENUM@@@Z?PyCom_SetAndLogCOMErrorFromPyException@@YAJPBDABU_GUID@@@Z?PyCom_SetAndLogCOMErrorFromPyExceptionEx@@YAJPAU_object@@PBDABU_GUID@@@Z?PyCom_SetCOMErrorFromPyException@@YAJABU_GUID@@@Z?PyCom_SetCOMErrorFromSimple@@YAJJABU_GUID@@PBD@Z?PyCom_StreamMessage@@YAXPBD@Z?PyCom_VariantFromPyObject@@YAHPAU_object@@PAUtagVARIANT@@@Z?PyGatewayConstruct@PyGOleWindow@@SAJPAU_object@@PAVPyGatewayBase@@PAPAXABU_GUID@@@Z?PyGatewayConstruct@PyGPersist@@SAJPAU_object@@PAVPyGatewayBase@@PAPAXABU_GUID@@@Z?PyGatewayConstruct@PyGatewayBase@@SAJPAU_object@@PAV1@PAPAXABU_GUID@@@Z?PyObConstruct@PyIBindCtx@@SAPAVPyIUnknown@@PAUIUnknown@@@Z?PyObConstruct@PyIClassFactory@@SAPAVPyIUnknown@@PAUIUnknown@@@Z?PyObConstruct@PyIConnectionPoint@@SAPAVPyIUnknown@@PAUIUnknown@@@Z?PyObConstruct@PyIConnectionPointContainer@@SAPAVPyIUnknown@@PAUIUnknown@@@Z?PyObConstruct@PyIDispatch@@SAPAVPyIUnknown@@PAUIUnknown@@@Z?PyObConstruct@PyIDispatchEx@@SAPAVPyIUnknown@@PAUIUnknown@@@Z?PyObConstruct@PyIEnumMoniker@@SAPAVPyIUnknown@@PAUIUnknown@@@Z?PyObConstruct@PyIEnumVARIANT@@SAPAVPyIUnknown@@PAUIUnknown@@@Z?PyObConstruct@PyIMoniker@@SAPAVPyIUnknown@@PAUIUnknown@@@Z?PyObConstruct@PyIOleWindow@@SAPAVPyIUnknown@@PAUIUnknown@@@Z?PyObConstruct@PyIPersist@@SAPAVPyIUnknown@@PAUIUnknown@@@Z?PyObConstruct@PyIPersistStream@@SAPAVPyIUnknown@@PAUIUnknown@@@Z?PyObConstruct@PyIPersistStreamInit@@SAPAVPyIUnknown@@PAUIUnknown@@@Z?PyObConstruct@PyIProvideClassInfo2@@SAPAVPyIUnknown@@PAUIUnknown@@@Z?PyObConstruct@PyIProvideClassInfo@@SAPAVPyIUnknown@@PAUIUnknown@@@Z?PyObConstruct@PyIServiceProvider@@SAPAVPyIUnknown@@PAUIUnknown@@@Z?PyObConstruct@PyIStream@@SAPAVPyIUnknown@@PAUIUnknown@@@Z?PyObConstruct@PyITypeComp@@SAPAVPyIUnknown@@PAUIUnknown@@@Z?PyObConstruct@PyITypeInfo@@SAPAVPyIUnknown@@PAUIUnknown@@@Z?PyObConstruct@PyITypeLib@@SAPAVPyIUnknown@@PAUIUnknown@@@Z?PyObConstruct@PyIUnknown@@SAPAV1@PAUIUnknown@@@Z?PyObject_AsCurrency@@YAHPAU_object@@PATtagCY@@@Z?PyObject_AsOLEMENUGROUPWIDTHS@@YAHPAU_object@@PAUtagOleMenuGroupWidths@@@Z?PyObject_AsPROPVARIANT@@YAHPAU_object@@PAUtagPROPVARIANT@@@Z?PyObject_FromCurrency@@YAPAU_object@@AATtagCY@@@Z?PyObject_FromOLEMENUGROUPWIDTHS@@YAPAU_object@@PBUtagOleMenuGroupWidths@@@Z?PyObject_FromPROPVARIANT@@YAPAU_object@@PAUtagPROPVARIANT@@@Z?PyObject_FromPROPVARIANTs@@YAPAU_object@@PAUtagPROPVARIANT@@K@Z?PyObject_FromSTGMEDIUM@@YAPAVPySTGMEDIUM@@PAUtagSTGMEDIUM@@@Z?QueryInterface@CPyFactory@@UAGJABU_GUID@@PAPAX@Z?QueryInterface@PyGOleWindow@@MAGJABU_GUID@@PAPAX@Z?QueryInterface@PyGPersist@@MAGJABU_GUID@@PAPAX@Z?QueryInterface@PyGatewayBase@@UAGJABU_GUID@@PAPAX@Z?QueryInterface@PyIUnknown@@SAPAU_object@@PAU2@0@Z?QueryService@PyIServiceProvider@@SAPAU_object@@PAU2@0@Z?Read@PyIStream@@SAPAU_object@@PAU2@0@Z?RegisterObjectParam@PyIBindCtx@@SAPAU_object@@PAU2@0@Z?Release@CPyFactory@@UAGKXZ?Release@PyGOleWindow@@MAGKXZ?Release@PyGPersist@@MAGKXZ?Release@PyGatewayBase@@UAGKXZ?Reset@PyIEnumMoniker@@SAPAU_object@@PAU2@0@Z?Reset@PyIEnumVARIANT@@SAPAU_object@@PAU2@0@Z?Revert@PyIStream@@SAPAU_object@@PAU2@0@Z?RevokeObjectParam@PyIBindCtx@@SAPAU_object@@PAU2@0@Z?SafeRelease@PyIUnknown@@SAXPAV1@@Z?Save@PyIPersistStream@@SAPAU_object@@PAU2@0@Z?Seek@PyIStream@@SAPAU_object@@PAU2@0@Z?SetBindOptions@PyIBindCtx@@SAPAU_object@@PAU2@0@Z?SetPythonCOMError@PyIConnectionPoint@@SAPAU_object@@PAU2@J@Z?SetPythonCOMError@PyIConnectionPointContainer@@SAPAU_object@@PAU2@J@Z?SetPythonCOMError@PyIDispatchEx@@SAPAU_object@@PAU2@J@Z?SetSize@PyIStream@@SAPAU_object@@PAU2@0@Z?Skip@PyIEnumMoniker@@SAPAU_object@@PAU2@0@Z?Skip@PyIEnumVARIANT@@SAPAU_object@@PAU2@0@Z?Stat@PyIStream@@SAPAU_object@@PAU2@0@Z?ThisAsIID@PyGOleWindow@@MAEPAXU_GUID@@@Z?ThisAsIID@PyGPersist@@MAEPAXU_GUID@@@Z?ThisAsIID@PyGatewayBase@@UAEPAXU_GUID@@@Z?Unadvise@PyIConnectionPoint@@SAPAU_object@@PAU2@0@Z?UnlockRegion@PyIStream@@SAPAU_object@@PAU2@0@Z?Unwrap@PyGatewayBase@@UAGJPAPAU_object@@@Z?Write@PyIStream@@SAPAU_object@@PAU2@0@Z?cmp@PyIBase@@SAHPAU_object@@0@Z?compare@PyIBase@@UAEHPAU_object@@@Z?compare@PyIUnknown@@UAEHPAU_object@@@Z?dealloc@PyIBase@@SAXPAU_object@@@Z?deallocFunc@PySTGMEDIUM@@SAXPAU_object@@@Z?getattr@PyIBase@@UAEPAU_object@@PAD@Z?getattro@PyIBase@@SAPAU_object@@PAU2@0@Z?getattro@PySTGMEDIUM@@SAPAU_object@@PAU2@0@Z?is_interface_type@PyComTypeObject@@SAHPAU_object@@@Z?is_object@PyIBase@@QAEHPAVPyComTypeObject@@@Z?is_object@PyIBase@@SAHPAU_object@@PAVPyComTypeObject@@@Z?iter@PyComEnumProviderTypeObject@@SAPAU_object@@PAU2@@Z?iter@PyComEnumTypeObject@@SAPAU_object@@PAU2@@Z?iter@PyIBase@@UAEPAU_object@@XZ?iternext@PyComEnumTypeObject@@SAPAU_object@@PAU2@@Z?iternext@PyIBase@@UAEPAU_object@@XZ?repr@PyIBase@@SAPAU_object@@PAU2@@Z?repr@PyIBase@@UAEPAU_object@@XZ?repr@PyIUnknown@@UAEPAU_object@@XZ?richcmp@PyIBase@@SAPAU_object@@PAU2@0H@Z?setattr@PyIBase@@UAEHPADPAU_object@@@Z?setattro@PyIBase@@SAHPAU_object@@00@Z_DllMain@12_DllRegisterServerEx_DllUnregisterServerEx_PyInit_pythoncom__IMPORT_DESCRIPTOR_pythoncom38__NULL_IMPORT_DESCRIPTOR__imp_??0CPyFactory@@QAE@ABU_GUID@@@Z__imp_??0CPyFactory@@QAE@ABV0@@Z__imp_??0PyComEnumProviderTypeObject@@QAE@PBDPAVPyComTypeObject@@HPAUPyMethodDef@@P6APAVPyIUnknown@@PAUIUnknown@@@Z0@Z__imp_??0PyComEnumTypeObject@@QAE@PBDPAVPyComTypeObject@@HPAUPyMethodDef@@P6APAVPyIUnknown@@PAUIUnknown@@@Z@Z__imp_??0PyComTypeObject@@QAE@PBDPAV0@HPAUPyMethodDef@@P6APAVPyIUnknown@@PAUIUnknown@@@Z@Z__imp_??0PyGOleWindow@@IAE@PAU_object@@@Z__imp_??0PyGOleWindow@@QAE@$$QAV0@@Z__imp_??0PyGOleWindow@@QAE@ABV0@@Z__imp_??0PyGPersist@@IAE@PAU_object@@@Z__imp_??0PyGPersist@@QAE@$$QAV0@@Z__imp_??0PyGPersist@@QAE@ABV0@@Z__imp_??0PyGatewayBase@@IAE@PAU_object@@@Z__imp_??0PyGatewayBase@@QAE@ABV0@@Z__imp_??0PyIBase@@IAE@XZ__imp_??0PyIBase@@QAE@ABV0@@Z__imp_??0PyIBindCtx@@IAE@PAUIUnknown@@@Z__imp_??0PyIBindCtx@@QAE@ABV0@@Z__imp_??0PyIClassFactory@@IAE@PAUIUnknown@@@Z__imp_??0PyIClassFactory@@QAE@ABV0@@Z__imp_??0PyIConnectionPoint@@IAE@PAUIUnknown@@@Z__imp_??0PyIConnectionPoint@@QAE@ABV0@@Z__imp_??0PyIConnectionPointContainer@@IAE@PAUIUnknown@@@Z__imp_??0PyIConnectionPointContainer@@QAE@ABV0@@Z__imp_??0PyIDispatch@@IAE@PAUIUnknown@@@Z__imp_??0PyIDispatch@@QAE@ABV0@@Z__imp_??0PyIDispatchEx@@IAE@PAUIUnknown@@@Z__imp_??0PyIDispatchEx@@QAE@ABV0@@Z__imp_??0PyIEnumMoniker@@IAE@PAUIUnknown@@@Z__imp_??0PyIEnumMoniker@@QAE@ABV0@@Z__imp_??0PyIEnumVARIANT@@IAE@PAUIUnknown@@@Z__imp_??0PyIEnumVARIANT@@QAE@ABV0@@Z__imp_??0PyIMoniker@@IAE@PAUIUnknown@@@Z__imp_??0PyIMoniker@@QAE@ABV0@@Z__imp_??0PyIOleWindow@@IAE@PAUIUnknown@@@Z__imp_??0PyIOleWindow@@QAE@ABV0@@Z__imp_??0PyIPersist@@IAE@PAUIUnknown@@@Z__imp_??0PyIPersist@@QAE@ABV0@@Z__imp_??0PyIPersistStream@@IAE@PAUIUnknown@@@Z__imp_??0PyIPersistStream@@QAE@ABV0@@Z__imp_??0PyIPersistStreamInit@@IAE@PAUIUnknown@@@Z__imp_??0PyIPersistStreamInit@@QAE@ABV0@@Z__imp_??0PyIProvideClassInfo2@@IAE@PAUIUnknown@@@Z__imp_??0PyIProvideClassInfo2@@QAE@ABV0@@Z__imp_??0PyIProvideClassInfo@@IAE@PAUIUnknown@@@Z__imp_??0PyIProvideClassInfo@@QAE@ABV0@@Z__imp_??0PyIServiceProvider@@IAE@PAUIUnknown@@@Z__imp_??0PyIServiceProvider@@QAE@ABV0@@Z__imp_??0PyIStream@@IAE@PAUIUnknown@@@Z__imp_??0PyIStream@@QAE@ABV0@@Z__imp_??0PyITypeComp@@IAE@PAUIUnknown@@@Z__imp_??0PyITypeComp@@QAE@ABV0@@Z__imp_??0PyITypeInfo@@IAE@PAUIUnknown@@@Z__imp_??0PyITypeInfo@@QAE@ABV0@@Z__imp_??0PyITypeLib@@IAE@PAUIUnknown@@@Z__imp_??0PyITypeLib@@QAE@ABV0@@Z__imp_??0PyIUnknown@@IAE@PAUIUnknown@@@Z__imp_??0PyIUnknown@@QAE@ABV0@@Z__imp_??0PyOleArgNotFound@@QAE@XZ__imp_??0PyOleEmpty@@QAE@XZ__imp_??0PyOleMissing@@QAE@XZ__imp_??0PyOleNothing@@QAE@XZ__imp_??0PySTGMEDIUM@@QAE@PAUtagSTGMEDIUM@@@Z__imp_??0PythonOleArgHelper@@QAE@XZ__imp_??1CPyFactory@@QAE@XZ__imp_??1PyComEnumProviderTypeObject@@QAE@XZ__imp_??1PyComEnumTypeObject@@QAE@XZ__imp_??1PyComTypeObject@@QAE@XZ__imp_??1PyGOleWindow@@UAE@XZ__imp_??1PyGPersist@@UAE@XZ__imp_??1PyGatewayBase@@MAE@XZ__imp_??1PyIBase@@MAE@XZ__imp_??1PyIBindCtx@@MAE@XZ__imp_??1PyIClassFactory@@MAE@XZ__imp_??1PyIConnectionPoint@@MAE@XZ__imp_??1PyIConnectionPointContainer@@MAE@XZ__imp_??1PyIDispatch@@MAE@XZ__imp_??1PyIDispatchEx@@MAE@XZ__imp_??1PyIEnumMoniker@@MAE@XZ__imp_??1PyIEnumVARIANT@@MAE@XZ__imp_??1PyIMoniker@@MAE@XZ__imp_??1PyIOleWindow@@MAE@XZ__imp_??1PyIPersist@@MAE@XZ__imp_??1PyIPersistStream@@MAE@XZ__imp_??1PyIPersistStreamInit@@MAE@XZ__imp_??1PyIProvideClassInfo2@@MAE@XZ__imp_??1PyIProvideClassInfo@@MAE@XZ__imp_??1PyIServiceProvider@@MAE@XZ__imp_??1PyIStream@@MAE@XZ__imp_??1PyITypeComp@@MAE@XZ__imp_??1PyITypeInfo@@MAE@XZ__imp_??1PyITypeLib@@MAE@XZ__imp_??1PyIUnknown@@MAE@XZ__imp_??1PySTGMEDIUM@@QAE@XZ__imp_??1PythonOleArgHelper@@QAE@XZ__imp_??4CPyFactory@@QAEAAV0@ABV0@@Z__imp_??4PyComEnumProviderTypeObject@@QAEAAV0@$$QAV0@@Z__imp_??4PyComEnumProviderTypeObject@@QAEAAV0@ABV0@@Z__imp_??4PyComEnumTypeObject@@QAEAAV0@$$QAV0@@Z__imp_??4PyComEnumTypeObject@@QAEAAV0@ABV0@@Z__imp_??4PyComTypeObject@@QAEAAV0@ABV0@@Z__imp_??4PyGOleWindow@@QAEAAV0@$$QAV0@@Z__imp_??4PyGOleWindow@@QAEAAV0@ABV0@@Z__imp_??4PyGPersist@@QAEAAV0@$$QAV0@@Z__imp_??4PyGPersist@@QAEAAV0@ABV0@@Z__imp_??4PyGatewayBase@@QAEAAV0@ABV0@@Z__imp_??4PyIBase@@QAEAAV0@ABV0@@Z__imp_??4PyIBindCtx@@QAEAAV0@ABV0@@Z__imp_??4PyIClassFactory@@QAEAAV0@ABV0@@Z__imp_??4PyIConnectionPoint@@QAEAAV0@ABV0@@Z__imp_??4PyIConnectionPointContainer@@QAEAAV0@ABV0@@Z__imp_??4PyIDispatch@@QAEAAV0@ABV0@@Z__imp_??4PyIDispatchEx@@QAEAAV0@ABV0@@Z__imp_??4PyIEnumMoniker@@QAEAAV0@ABV0@@Z__imp_??4PyIEnumVARIANT@@QAEAAV0@ABV0@@Z__imp_??4PyIMoniker@@QAEAAV0@ABV0@@Z__imp_??4PyIOleWindow@@QAEAAV0@ABV0@@Z__imp_??4PyIPersist@@QAEAAV0@ABV0@@Z__imp_??4PyIPersistStream@@QAEAAV0@ABV0@@Z__imp_??4PyIPersistStreamInit@@QAEAAV0@ABV0@@Z__imp_??4PyIProvideClassInfo2@@QAEAAV0@ABV0@@Z__imp_??4PyIProvideClassInfo@@QAEAAV0@ABV0@@Z__imp_??4PyIServiceProvider@@QAEAAV0@ABV0@@Z__imp_??4PyIStream@@QAEAAV0@ABV0@@Z__imp_??4PyITypeComp@@QAEAAV0@ABV0@@Z__imp_??4PyITypeInfo@@QAEAAV0@ABV0@@Z__imp_??4PyITypeLib@@QAEAAV0@ABV0@@Z__imp_??4PyIUnknown@@QAEAAV0@ABV0@@Z__imp_??4PyOleArgNotFound@@QAEAAV0@$$QAV0@@Z__imp_??4PyOleArgNotFound@@QAEAAV0@ABV0@@Z__imp_??4PyOleEmpty@@QAEAAV0@$$QAV0@@Z__imp_??4PyOleEmpty@@QAEAAV0@ABV0@@Z__imp_??4PyOleMissing@@QAEAAV0@$$QAV0@@Z__imp_??4PyOleMissing@@QAEAAV0@ABV0@@Z__imp_??4PyOleNothing@@QAEAAV0@$$QAV0@@Z__imp_??4PyOleNothing@@QAEAAV0@ABV0@@Z__imp_??4PySTGMEDIUM@@QAEAAV0@ABV0@@Z__imp_??4PythonOleArgHelper@@QAEAAV0@ABV0@@Z__imp_??_7CPyFactory@@6B@__imp_??_7PyGOleWindow@@6B@__imp_??_7PyGOleWindow@@6BIDispatchEx@@@__imp_??_7PyGOleWindow@@6BIInternalUnwrapPythonObject@@@__imp_??_7PyGOleWindow@@6BISupportErrorInfo@@@__imp_??_7PyGPersist@@6B@__imp_??_7PyGPersist@@6BIDispatchEx@@@__imp_??_7PyGPersist@@6BIInternalUnwrapPythonObject@@@__imp_??_7PyGPersist@@6BISupportErrorInfo@@@__imp_??_7PyGatewayBase@@6BIDispatchEx@@@__imp_??_7PyGatewayBase@@6BIInternalUnwrapPythonObject@@@__imp_??_7PyGatewayBase@@6BISupportErrorInfo@@@__imp_??_7PyIBase@@6B@__imp_??_7PyIBindCtx@@6B@__imp_??_7PyIClassFactory@@6B@__imp_??_7PyIConnectionPoint@@6B@__imp_??_7PyIConnectionPointContainer@@6B@__imp_??_7PyIDispatch@@6B@__imp_??_7PyIDispatchEx@@6B@__imp_??_7PyIEnumMoniker@@6B@__imp_??_7PyIEnumVARIANT@@6B@__imp_??_7PyIMoniker@@6B@__imp_??_7PyIOleWindow@@6B@__imp_??_7PyIPersist@@6B@__imp_??_7PyIPersistStream@@6B@__imp_??_7PyIPersistStreamInit@@6B@__imp_??_7PyIProvideClassInfo2@@6B@__imp_??_7PyIProvideClassInfo@@6B@__imp_??_7PyIServiceProvider@@6B@__imp_??_7PyIStream@@6B@__imp_??_7PyITypeComp@@6B@__imp_??_7PyITypeInfo@@6B@__imp_??_7PyITypeLib@@6B@__imp_??_7PyIUnknown@@6B@__imp_??_FPySTGMEDIUM@@QAEXXZ__imp_?AddRef@CPyFactory@@UAGKXZ__imp_?AddRef@PyGOleWindow@@MAGKXZ__imp_?AddRef@PyGPersist@@MAGKXZ__imp_?AddRef@PyGatewayBase@@UAGKXZ__imp_?Advise@PyIConnectionPoint@@SAPAU_object@@PAU2@0@Z__imp_?Bind@PyITypeComp@@QAEPAU_object@@PA_WG@Z__imp_?BindToObject@PyIMoniker@@SAPAU_object@@PAU2@0@Z__imp_?BindToStorage@PyIMoniker@@SAPAU_object@@PAU2@0@Z__imp_?BindType@PyITypeComp@@QAEPAU_object@@PA_W@Z__imp_?Clone@PyIEnumMoniker@@SAPAU_object@@PAU2@0@Z__imp_?Clone@PyIEnumVARIANT@@SAPAU_object@@PAU2@0@Z__imp_?Clone@PyIStream@@SAPAU_object@@PAU2@0@Z__imp_?Close@PySTGMEDIUM@@QAEXXZ__imp_?Commit@PyIStream@@SAPAU_object@@PAU2@0@Z__imp_?ComposeWith@PyIMoniker@@SAPAU_object@@PAU2@0@Z__imp_?ContextSensitiveHelp@PyGOleWindow@@MAGJH@Z__imp_?ContextSensitiveHelp@PyIOleWindow@@SAPAU_object@@PAU2@0@Z__imp_?CopyTo@PyIStream@@SAPAU_object@@PAU2@0@Z__imp_?CopyTo@PySTGMEDIUM@@QAEHPAUtagSTGMEDIUM@@@Z__imp_?CreateInstance@CPyFactory@@UAGJPAUIUnknown@@ABU_GUID@@PAPAX@Z__imp_?CreateInstance@PyIClassFactory@@SAPAU_object@@PAU2@0@Z__imp_?CreateNewPythonInstance@CPyFactory@@IAGJABU_GUID@@0PAPAU_object@@@Z__imp_?DeleteMemberByDispID@PyGatewayBase@@UAGJJ@Z__imp_?DeleteMemberByDispID@PyIDispatchEx@@SAPAU_object@@PAU2@0@Z__imp_?DeleteMemberByName@PyGatewayBase@@UAGJPA_WK@Z__imp_?DeleteMemberByName@PyIDispatchEx@@SAPAU_object@@PAU2@0@Z__imp_?DropOwnership@PySTGMEDIUM@@QAEXXZ__imp_?Enum@PyIMoniker@@SAPAU_object@@PAU2@0@Z__imp_?EnumConnectionPoints@PyIConnectionPointContainer@@SAPAU_object@@PAU2@0@Z__imp_?EnumConnections@PyIConnectionPoint@@SAPAU_object@@PAU2@0@Z__imp_?EnumObjectParam@PyIBindCtx@@SAPAU_object@@PAU2@0@Z__imp_?FindConnectionPoint@PyIConnectionPointContainer@@SAPAU_object@@PAU2@0@Z__imp_?GetBindOptions@PyIBindCtx@@SAPAU_object@@PAU2@0@Z__imp_?GetClassID@PyGPersist@@MAGJPAU_GUID@@@Z__imp_?GetClassID@PyIPersist@@SAPAU_object@@PAU2@0@Z__imp_?GetClassInfoW@PyIProvideClassInfo@@SAPAU_object@@PAU2@0@Z__imp_?GetConnectionInterface@PyIConnectionPoint@@SAPAU_object@@PAU2@0@Z__imp_?GetConnectionPointContainer@PyIConnectionPoint@@SAPAU_object@@PAU2@0@Z__imp_?GetContainingTypeLib@PyITypeInfo@@QAEPAU_object@@XZ__imp_?GetDispID@PyGatewayBase@@UAGJPA_WKPAJ@Z__imp_?GetDispID@PyIDispatchEx@@SAPAU_object@@PAU2@0@Z__imp_?GetDisplayName@PyIMoniker@@SAPAU_object@@PAU2@0@Z__imp_?GetDocumentation@PyITypeInfo@@QAEPAU_object@@J@Z__imp_?GetDocumentation@PyITypeLib@@QAEPAU_object@@H@Z__imp_?GetFuncDesc@PyITypeInfo@@QAEPAU_object@@H@Z__imp_?GetGUID@PyIProvideClassInfo2@@SAPAU_object@@PAU2@0@Z__imp_?GetI@PyIBindCtx@@SAPAUIBindCtx@@PAU_object@@@Z__imp_?GetI@PyIClassFactory@@SAPAUIClassFactory@@PAU_object@@@Z__imp_?GetI@PyIConnectionPoint@@SAPAUIConnectionPoint@@PAU_object@@@Z__imp_?GetI@PyIConnectionPointContainer@@SAPAUIConnectionPointContainer@@PAU_object@@@Z__imp_?GetI@PyIDispatch@@SAPAUIDispatch@@PAU_object@@@Z__imp_?GetI@PyIDispatchEx@@SAPAUIDispatchEx@@PAU_object@@@Z__imp_?GetI@PyIEnumMoniker@@SAPAUIEnumMoniker@@PAU_object@@@Z__imp_?GetI@PyIEnumVARIANT@@SAPAUIEnumVARIANT@@PAU_object@@@Z__imp_?GetI@PyIMoniker@@SAPAUIMoniker@@PAU_object@@@Z__imp_?GetI@PyIOleWindow@@SAPAUIOleWindow@@PAU_object@@@Z__imp_?GetI@PyIPersist@@SAPAUIPersist@@PAU_object@@@Z__imp_?GetI@PyIPersistStream@@SAPAUIPersistStream@@PAU_object@@@Z__imp_?GetI@PyIPersistStreamInit@@SAPAUIPersistStreamInit@@PAU_object@@@Z__imp_?GetI@PyIProvideClassInfo2@@SAPAUIProvideClassInfo2@@PAU_object@@@Z__imp_?GetI@PyIProvideClassInfo@@SAPAUIProvideClassInfo@@PAU_object@@@Z__imp_?GetI@PyIServiceProvider@@SAPAUIServiceProvider@@PAU_object@@@Z__imp_?GetI@PyIStream@@SAPAUIStream@@PAU_object@@@Z__imp_?GetI@PyITypeComp@@SAPAUITypeComp@@PAU_object@@@Z__imp_?GetI@PyITypeInfo@@SAPAUITypeInfo@@PAU_object@@@Z__imp_?GetI@PyITypeLib@@SAPAUITypeLib@@PAU_object@@@Z__imp_?GetI@PyIUnknown@@SAPAUIUnknown@@PAU_object@@@Z__imp_?GetIDsOfNames@PyGatewayBase@@UAGJABU_GUID@@PAPA_WIKPAJ@Z__imp_?GetIDsOfNames@PyIDispatch@@SAPAU_object@@PAU2@0@Z__imp_?GetIID@PyGOleWindow@@MAE?AU_GUID@@XZ__imp_?GetIID@PyGPersist@@MAE?AU_GUID@@XZ__imp_?GetIID@PyGatewayBase@@UAE?AU_GUID@@XZ__imp_?GetImplTypeFlags@PyITypeInfo@@QAEPAU_object@@H@Z__imp_?GetLibAttr@PyITypeLib@@QAEPAU_object@@XZ__imp_?GetMemberName@PyGatewayBase@@UAGJJPAPA_W@Z__imp_?GetMemberName@PyIDispatchEx@@SAPAU_object@@PAU2@0@Z__imp_?GetMemberProperties@PyGatewayBase@@UAGJJKPAK@Z__imp_?GetMemberProperties@PyIDispatchEx@@SAPAU_object@@PAU2@0@Z__imp_?GetNameSpaceParent@PyGatewayBase@@UAGJPAPAUIUnknown@@@Z__imp_?GetNames@PyITypeInfo@@QAEPAU_object@@J@Z__imp_?GetNextDispID@PyGatewayBase@@UAGJKJPAJ@Z__imp_?GetNextDispID@PyIDispatchEx@@SAPAU_object@@PAU2@0@Z__imp_?GetObjectParam@PyIBindCtx@@SAPAU_object@@PAU2@0@Z__imp_?GetRefTypeInfo@PyITypeInfo@@QAEPAU_object@@K@Z__imp_?GetRefTypeOfImplType@PyITypeInfo@@QAEPAU_object@@H@Z__imp_?GetRunningObjectTable@PyIBindCtx@@SAPAU_object@@PAU2@0@Z__imp_?GetSizeMax@PyIPersistStream@@SAPAU_object@@PAU2@0@Z__imp_?GetTypeAttr@PyITypeInfo@@QAEPAU_object@@XZ__imp_?GetTypeComp@PyITypeInfo@@QAEPAU_object@@XZ__imp_?GetTypeComp@PyITypeLib@@QAEPAU_object@@XZ__imp_?GetTypeInfo@PyGatewayBase@@UAGJIKPAPAUITypeInfo@@@Z__imp_?GetTypeInfo@PyIDispatch@@SAPAU_object@@PAU2@0@Z__imp_?GetTypeInfo@PyITypeLib@@QAEPAU_object@@H@Z__imp_?GetTypeInfoCount@PyGatewayBase@@UAGJPAI@Z__imp_?GetTypeInfoCount@PyIDispatch@@SAPAU_object@@PAU2@0@Z__imp_?GetTypeInfoCount@PyITypeLib@@QAEPAU_object@@XZ__imp_?GetTypeInfoOfGuid@PyITypeLib@@QAEPAU_object@@ABU_GUID@@@Z__imp_?GetTypeInfoType@PyITypeLib@@QAEPAU_object@@H@Z__imp_?GetVarDesc@PyITypeInfo@@QAEPAU_object@@H@Z__imp_?GetWindow@PyGOleWindow@@MAGJPAPAUHWND__@@@Z__imp_?GetWindow@PyIOleWindow@@SAPAU_object@@PAU2@0@Z__imp_?Hash@PyIMoniker@@SAPAU_object@@PAU2@0@Z__imp_?InitNew@PyIPersistStreamInit@@SAPAU_object@@PAU2@0@Z__imp_?InterfaceSupportsErrorInfo@PyGatewayBase@@UAGJABU_GUID@@@Z__imp_?Invoke@PyGatewayBase@@UAGJJABU_GUID@@KGPAUtagDISPPARAMS@@PAUtagVARIANT@@PAUtagEXCEPINFO@@PAI@Z__imp_?Invoke@PyIDispatch@@SAPAU_object@@PAU2@0@Z__imp_?InvokeEx@PyGatewayBase@@UAGJJKGPAUtagDISPPARAMS@@PAUtagVARIANT@@PAUtagEXCEPINFO@@PAUIServiceProvider@@@Z__imp_?InvokeEx@PyIDispatchEx@@SAPAU_object@@PAU2@0@Z__imp_?InvokeTypes@PyIDispatch@@SAPAU_object@@PAU2@0@Z__imp_?InvokeViaPolicy@PyGatewayBase@@MAAJPBDPAPAU_object@@0ZZ__imp_?IsDirty@PyIPersistStream@@SAPAU_object@@PAU2@0@Z__imp_?IsEqual@PyIMoniker@@SAPAU_object@@PAU2@0@Z__imp_?IsSystemMoniker@PyIMoniker@@SAPAU_object@@PAU2@0@Z__imp_?Load@PyIPersistStream@@SAPAU_object@@PAU2@0@Z__imp_?LockRegion@PyIStream@@SAPAU_object@@PAU2@0@Z__imp_?LockServer@CPyFactory@@UAGJH@Z__imp_?LockServer@PyIClassFactory@@SAPAU_object@@PAU2@0@Z__imp_?MakeBstrToObj@@YAPAU_object@@QA_W@Z__imp_?MakeOLECHARToObj@@YAPAU_object@@PB_W@Z__imp_?MakeOLECHARToObj@@YAPAU_object@@PB_WH@Z__imp_?MakeObjToVariant@PythonOleArgHelper@@QAEHPAU_object@@PAUtagVARIANT@@0@Z__imp_?MakePythonArgumentTuples@@YAHPAPAU_object@@PAPAVPythonOleArgHelper@@01PAUtagDISPPARAMS@@@Z__imp_?MakeVariantToObj@PythonOleArgHelper@@QAEPAU_object@@PAUtagVARIANT@@@Z__imp_?Next@PyIEnumMoniker@@SAPAU_object@@PAU2@0@Z__imp_?Next@PyIEnumVARIANT@@SAPAU_object@@PAU2@0@Z__imp_?ParseTypeInformation@PythonOleArgHelper@@QAEHPAU_object@@@Z__imp_?PyCom_BstrFromPyObject@@YAHPAU_object@@PAPA_WH@Z__imp_?PyCom_BuildInternalPyException@@YAPAU_object@@PAD@Z__imp_?PyCom_BuildPyException@@YAPAU_object@@JPAUIUnknown@@ABU_GUID@@@Z__imp_?PyCom_BuildPyExceptionFromEXCEPINFO@@YAPAU_object@@JPAUtagEXCEPINFO@@I@Z__imp_?PyCom_CoInitialize@@YAJPAX@Z__imp_?PyCom_CoInitializeEx@@YAJPAXK@Z__imp_?PyCom_CoUninitialize@@YAXXZ__imp_?PyCom_DLLAddRef@@YAXXZ__imp_?PyCom_DLLReleaseRef@@YAXXZ__imp_?PyCom_EnableQuitMessage@@YAXK@Z__imp_?PyCom_ExcepInfoFromPyException@@YAXPAUtagEXCEPINFO@@@Z__imp_?PyCom_ExcepInfoFromPyObject@@YAHPAU_object@@PAUtagEXCEPINFO@@PAJ@Z__imp_?PyCom_InterfaceFromPyInstanceOrObject@@YAHPAU_object@@ABU_GUID@@PAPAXH@Z__imp_?PyCom_InterfaceFromPyObject@@YAHPAU_object@@ABU_GUID@@PAPAXH@Z__imp_?PyCom_IsGatewayRegistered@@YAHABU_GUID@@@Z__imp_?PyCom_LogF@@YAXPBDZZ__imp_?PyCom_LoggerException@@YAXPAU_object@@PBDZZ__imp_?PyCom_LoggerNonServerException@@YAXPAU_object@@PBDZZ__imp_?PyCom_LoggerWarning@@YAXPAU_object@@PBDZZ__imp_?PyCom_MakeOlePythonCall@@YAHPAU_object@@PAUtagDISPPARAMS@@PAUtagVARIANT@@PAUtagEXCEPINFO@@PAI0@Z__imp_?PyCom_PyObjectAsSTATPROPSETSTG@@YAHPAU_object@@PAUtagSTATPROPSETSTG@@@Z__imp_?PyCom_PyObjectAsSTATSTG@@YAHPAU_object@@PAUtagSTATSTG@@K@Z__imp_?PyCom_PyObjectAsSTGOPTIONS@@YAHPAU_object@@PAPAUtagSTGOPTIONS@@@Z__imp_?PyCom_PyObjectFromExcepInfo@@YAPAU_object@@PBUtagEXCEPINFO@@@Z__imp_?PyCom_PyObjectFromIUnknown@@YAPAU_object@@PAUIUnknown@@ABU_GUID@@H@Z__imp_?PyCom_PyObjectFromSAFEARRAY@@YAPAU_object@@PAUtagSAFEARRAY@@W4VARENUM@@@Z__imp_?PyCom_PyObjectFromSTATPROPSETSTG@@YAPAU_object@@PAUtagSTATPROPSETSTG@@@Z__imp_?PyCom_PyObjectFromSTATSTG@@YAPAU_object@@PAUtagSTATSTG@@@Z__imp_?PyCom_PyObjectFromVariant@@YAPAU_object@@PBUtagVARIANT@@@Z__imp_?PyCom_RegisterClientType@@YAHPAU_typeobject@@PBU_GUID@@@Z__imp_?PyCom_RegisterExtensionSupport@@YAHPAU_object@@PBUPyCom_InterfaceSupportInfo@@H@Z__imp_?PyCom_RegisterGatewayObject@@YAJABU_GUID@@P6AJPAU_object@@PAVPyGatewayBase@@PAPAX0@ZPBD@Z__imp_?PyCom_SAFEARRAYFromPyObject@@YAHPAU_object@@PAPAUtagSAFEARRAY@@W4VARENUM@@@Z__imp_?PyCom_SetAndLogCOMErrorFromPyException@@YAJPBDABU_GUID@@@Z__imp_?PyCom_SetAndLogCOMErrorFromPyExceptionEx@@YAJPAU_object@@PBDABU_GUID@@@Z__imp_?PyCom_SetCOMErrorFromPyException@@YAJABU_GUID@@@Z__imp_?PyCom_SetCOMErrorFromSimple@@YAJJABU_GUID@@PBD@Z__imp_?PyCom_StreamMessage@@YAXPBD@Z__imp_?PyCom_VariantFromPyObject@@YAHPAU_object@@PAUtagVARIANT@@@Z__imp_?PyGatewayConstruct@PyGOleWindow@@SAJPAU_object@@PAVPyGatewayBase@@PAPAXABU_GUID@@@Z__imp_?PyGatewayConstruct@PyGPersist@@SAJPAU_object@@PAVPyGatewayBase@@PAPAXABU_GUID@@@Z__imp_?PyGatewayConstruct@PyGatewayBase@@SAJPAU_object@@PAV1@PAPAXABU_GUID@@@Z__imp_?PyObConstruct@PyIBindCtx@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyIClassFactory@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyIConnectionPoint@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyIConnectionPointContainer@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyIDispatch@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyIDispatchEx@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyIEnumMoniker@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyIEnumVARIANT@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyIMoniker@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyIOleWindow@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyIPersist@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyIPersistStream@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyIPersistStreamInit@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyIProvideClassInfo2@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyIProvideClassInfo@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyIServiceProvider@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyIStream@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyITypeComp@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyITypeInfo@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyITypeLib@@SAPAVPyIUnknown@@PAUIUnknown@@@Z__imp_?PyObConstruct@PyIUnknown@@SAPAV1@PAUIUnknown@@@Z__imp_?PyObject_AsCurrency@@YAHPAU_object@@PATtagCY@@@Z__imp_?PyObject_AsOLEMENUGROUPWIDTHS@@YAHPAU_object@@PAUtagOleMenuGroupWidths@@@Z__imp_?PyObject_AsPROPVARIANT@@YAHPAU_object@@PAUtagPROPVARIANT@@@Z__imp_?PyObject_FromCurrency@@YAPAU_object@@AATtagCY@@@Z__imp_?PyObject_FromOLEMENUGROUPWIDTHS@@YAPAU_object@@PBUtagOleMenuGroupWidths@@@Z__imp_?PyObject_FromPROPVARIANT@@YAPAU_object@@PAUtagPROPVARIANT@@@Z__imp_?PyObject_FromPROPVARIANTs@@YAPAU_object@@PAUtagPROPVARIANT@@K@Z__imp_?PyObject_FromSTGMEDIUM@@YAPAVPySTGMEDIUM@@PAUtagSTGMEDIUM@@@Z__imp_?PyOleArgNotFoundType@@3U_typeobject@@A__imp_?PyOleEmptyType@@3U_typeobject@@A__imp_?PyOleMissingType@@3U_typeobject@@A__imp_?PyOleNothingType@@3U_typeobject@@A__imp_?QueryInterface@CPyFactory@@UAGJABU_GUID@@PAPAX@Z__imp_?QueryInterface@PyGOleWindow@@MAGJABU_GUID@@PAPAX@Z__imp_?QueryInterface@PyGPersist@@MAGJABU_GUID@@PAPAX@Z__imp_?QueryInterface@PyGatewayBase@@UAGJABU_GUID@@PAPAX@Z__imp_?QueryInterface@PyIUnknown@@SAPAU_object@@PAU2@0@Z__imp_?QueryService@PyIServiceProvider@@SAPAU_object@@PAU2@0@Z__imp_?Read@PyIStream@@SAPAU_object@@PAU2@0@Z__imp_?RegisterObjectParam@PyIBindCtx@@SAPAU_object@@PAU2@0@Z__imp_?Release@CPyFactory@@UAGKXZ__imp_?Release@PyGOleWindow@@MAGKXZ__imp_?Release@PyGPersist@@MAGKXZ__imp_?Release@PyGatewayBase@@UAGKXZ__imp_?Reset@PyIEnumMoniker@@SAPAU_object@@PAU2@0@Z__imp_?Reset@PyIEnumVARIANT@@SAPAU_object@@PAU2@0@Z__imp_?Revert@PyIStream@@SAPAU_object@@PAU2@0@Z__imp_?RevokeObjectParam@PyIBindCtx@@SAPAU_object@@PAU2@0@Z__imp_?SafeRelease@PyIUnknown@@SAXPAV1@@Z__imp_?Save@PyIPersistStream@@SAPAU_object@@PAU2@0@Z__imp_?Seek@PyIStream@@SAPAU_object@@PAU2@0@Z__imp_?SetBindOptions@PyIBindCtx@@SAPAU_object@@PAU2@0@Z__imp_?SetPythonCOMError@PyIConnectionPoint@@SAPAU_object@@PAU2@J@Z__imp_?SetPythonCOMError@PyIConnectionPointContainer@@SAPAU_object@@PAU2@J@Z__imp_?SetPythonCOMError@PyIDispatchEx@@SAPAU_object@@PAU2@J@Z__imp_?SetSize@PyIStream@@SAPAU_object@@PAU2@0@Z__imp_?Skip@PyIEnumMoniker@@SAPAU_object@@PAU2@0@Z__imp_?Skip@PyIEnumVARIANT@@SAPAU_object@@PAU2@0@Z__imp_?Stat@PyIStream@@SAPAU_object@@PAU2@0@Z__imp_?ThisAsIID@PyGOleWindow@@MAEPAXU_GUID@@@Z__imp_?ThisAsIID@PyGPersist@@MAEPAXU_GUID@@@Z__imp_?ThisAsIID@PyGatewayBase@@UAEPAXU_GUID@@@Z__imp_?Type@PySTGMEDIUM@@2U_typeobject@@A__imp_?Unadvise@PyIConnectionPoint@@SAPAU_object@@PAU2@0@Z__imp_?UnlockRegion@PyIStream@@SAPAU_object@@PAU2@0@Z__imp_?Unwrap@PyGatewayBase@@UAGJPAPAU_object@@@Z__imp_?Write@PyIStream@@SAPAU_object@@PAU2@0@Z__imp_?cmp@PyIBase@@SAHPAU_object@@0@Z__imp_?compare@PyIBase@@UAEHPAU_object@@@Z__imp_?compare@PyIUnknown@@UAEHPAU_object@@@Z__imp_?dealloc@PyIBase@@SAXPAU_object@@@Z__imp_?deallocFunc@PySTGMEDIUM@@SAXPAU_object@@@Z__imp_?getattr@PyIBase@@UAEPAU_object@@PAD@Z__imp_?getattro@PyIBase@@SAPAU_object@@PAU2@0@Z__imp_?getattro@PySTGMEDIUM@@SAPAU_object@@PAU2@0@Z__imp_?is_interface_type@PyComTypeObject@@SAHPAU_object@@@Z__imp_?is_object@PyIBase@@QAEHPAVPyComTypeObject@@@Z__imp_?is_object@PyIBase@@SAHPAU_object@@PAVPyComTypeObject@@@Z__imp_?iter@PyComEnumProviderTypeObject@@SAPAU_object@@PAU2@@Z__imp_?iter@PyComEnumTypeObject@@SAPAU_object@@PAU2@@Z__imp_?iter@PyIBase@@UAEPAU_object@@XZ__imp_?iternext@PyComEnumTypeObject@@SAPAU_object@@PAU2@@Z__imp_?iternext@PyIBase@@UAEPAU_object@@XZ__imp_?methods@PySTGMEDIUM@@2PAUPyMethodDef@@A__imp_?repr@PyIBase@@SAPAU_object@@PAU2@@Z__imp_?repr@PyIBase@@UAEPAU_object@@XZ__imp_?repr@PyIUnknown@@UAEPAU_object@@XZ__imp_?richcmp@PyIBase@@SAPAU_object@@PAU2@0H@Z__imp_?setattr@PyIBase@@UAEHPADPAU_object@@@Z__imp_?setattro@PyIBase@@SAHPAU_object@@00@Z__imp_?szErrMsgObjectReleased@PyIUnknown@@2PADA__imp_?type@PyIBindCtx@@2VPyComTypeObject@@A__imp_?type@PyIClassFactory@@2VPyComTypeObject@@A__imp_?type@PyIConnectionPoint@@2VPyComTypeObject@@A__imp_?type@PyIConnectionPointContainer@@2VPyComTypeObject@@A__imp_?type@PyIDispatch@@2VPyComTypeObject@@A__imp_?type@PyIDispatchEx@@2VPyComTypeObject@@A__imp_?type@PyIEnumMoniker@@2VPyComEnumTypeObject@@A__imp_?type@PyIEnumVARIANT@@2VPyComEnumTypeObject@@A__imp_?type@PyIMoniker@@2VPyComEnumProviderTypeObject@@A__imp_?type@PyIOleWindow@@2VPyComTypeObject@@A__imp_?type@PyIPersist@@2VPyComTypeObject@@A__imp_?type@PyIPersistStream@@2VPyComTypeObject@@A__imp_?type@PyIPersistStreamInit@@2VPyComTypeObject@@A__imp_?type@PyIProvideClassInfo2@@2VPyComTypeObject@@A__imp_?type@PyIProvideClassInfo@@2VPyComTypeObject@@A__imp_?type@PyIServiceProvider@@2VPyComTypeObject@@A__imp_?type@PyIStream@@2VPyComTypeObject@@A__imp_?type@PyITypeComp@@2VPyComTypeObject@@A__imp_?type@PyITypeInfo@@2VPyComTypeObject@@A__imp_?type@PyITypeLib@@2VPyComTypeObject@@A__imp_?type@PyIUnknown@@2VPyComTypeObject@@A__imp__DllMain@12__imp__DllRegisterServerEx__imp__DllUnregisterServerEx__imp__PyInit_pythoncompythoncom38_NULL_THUNK_DATA pythoncom38.dll/1605328448 0 509 ` L@^_.debug$SE@B.idata$2@0.idata$6@  pythoncom38.dll'^Microsoft (R) LINK pythoncom38.dll@comp.id^.idata$2@h.idata$6.idata$4@h.idata$5@h$=Z__IMPORT_DESCRIPTOR_pythoncom38__NULL_IMPORT_DESCRIPTORpythoncom38_NULL_THUNK_DATA pythoncom38.dll/1605328448 0 254 ` L@^_.debug$SEd@B.idata$3@0 pythoncom38.dll'^Microsoft (R) LINK@comp.id^__NULL_IMPORT_DESCRIPTORpythoncom38.dll/1605328448 0 286 ` L@^_.debug$SE@B.idata$5@0.idata$4@0 pythoncom38.dll'^Microsoft (R) LINK@comp.id^!pythoncom38_NULL_THUNK_DATApythoncom38.dll/1605328448 0 68 ` L@^_0??0CPyFactory@@QAE@ABU_GUID@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 63 ` L@^_+??0CPyFactory@@QAE@ABV0@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 149 ` L@^_??0PyComEnumProviderTypeObject@@QAE@PBDPAVPyComTypeObject@@HPAUPyMethodDef@@P6APAVPyIUnknown@@PAUIUnknown@@@Z0@Zpythoncom38.dll pythoncom38.dll/1605328448 0 140 ` L@^_x??0PyComEnumTypeObject@@QAE@PBDPAVPyComTypeObject@@HPAUPyMethodDef@@P6APAVPyIUnknown@@PAUIUnknown@@@Z@Zpythoncom38.dllpythoncom38.dll/1605328448 0 121 ` L@^_e??0PyComTypeObject@@QAE@PBDPAV0@HPAUPyMethodDef@@P6APAVPyIUnknown@@PAUIUnknown@@@Z@Zpythoncom38.dll pythoncom38.dll/1605328448 0 72 ` L@^_4??0PyGOleWindow@@IAE@PAU_object@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 67 ` L@^_/??0PyGOleWindow@@QAE@$$QAV0@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 65 ` L@^_-??0PyGOleWindow@@QAE@ABV0@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 70 ` L@^_2??0PyGPersist@@IAE@PAU_object@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 65 ` L@^_- ??0PyGPersist@@QAE@$$QAV0@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 63 ` L@^_+ ??0PyGPersist@@QAE@ABV0@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 73 ` L@^_5 ??0PyGatewayBase@@IAE@PAU_object@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 66 ` L@^_. ??0PyGatewayBase@@QAE@ABV0@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 55 ` L@^_# ??0PyIBase@@IAE@XZpythoncom38.dll pythoncom38.dll/1605328448 0 60 ` L@^_(??0PyIBase@@QAE@ABV0@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 71 ` L@^_3??0PyIBindCtx@@IAE@PAUIUnknown@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 63 ` L@^_+??0PyIBindCtx@@QAE@ABV0@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 76 ` L@^_8??0PyIClassFactory@@IAE@PAUIUnknown@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 68 ` L@^_0??0PyIClassFactory@@QAE@ABV0@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 79 ` L@^_;??0PyIConnectionPoint@@IAE@PAUIUnknown@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 71 ` L@^_3??0PyIConnectionPoint@@QAE@ABV0@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 88 ` L@^_D??0PyIConnectionPointContainer@@IAE@PAUIUnknown@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 80 ` L@^_<??0PyIConnectionPointContainer@@QAE@ABV0@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 72 ` L@^_4??0PyIDispatch@@IAE@PAUIUnknown@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 64 ` L@^_,??0PyIDispatch@@QAE@ABV0@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 74 ` L@^_6??0PyIDispatchEx@@IAE@PAUIUnknown@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 66 ` L@^_.??0PyIDispatchEx@@QAE@ABV0@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 75 ` L@^_7??0PyIEnumMoniker@@IAE@PAUIUnknown@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 67 ` L@^_/??0PyIEnumMoniker@@QAE@ABV0@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 75 ` L@^_7??0PyIEnumVARIANT@@IAE@PAUIUnknown@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 67 ` L@^_/??0PyIEnumVARIANT@@QAE@ABV0@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 71 ` L@^_3??0PyIMoniker@@IAE@PAUIUnknown@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 63 ` L@^_+ ??0PyIMoniker@@QAE@ABV0@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 73 ` L@^_5!??0PyIOleWindow@@IAE@PAUIUnknown@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 65 ` L@^_-"??0PyIOleWindow@@QAE@ABV0@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 71 ` L@^_3#??0PyIPersist@@IAE@PAUIUnknown@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 63 ` L@^_+$??0PyIPersist@@QAE@ABV0@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 77 ` L@^_9%??0PyIPersistStream@@IAE@PAUIUnknown@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 69 ` L@^_1&??0PyIPersistStream@@QAE@ABV0@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 81 ` L@^_='??0PyIPersistStreamInit@@IAE@PAUIUnknown@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 73 ` L@^_5(??0PyIPersistStreamInit@@QAE@ABV0@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 81 ` L@^_=)??0PyIProvideClassInfo2@@IAE@PAUIUnknown@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 73 ` L@^_5*??0PyIProvideClassInfo2@@QAE@ABV0@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 80 ` L@^_<+??0PyIProvideClassInfo@@IAE@PAUIUnknown@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 72 ` L@^_4,??0PyIProvideClassInfo@@QAE@ABV0@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 79 ` L@^_;-??0PyIServiceProvider@@IAE@PAUIUnknown@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 71 ` L@^_3.??0PyIServiceProvider@@QAE@ABV0@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 70 ` L@^_2/??0PyIStream@@IAE@PAUIUnknown@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 62 ` L@^_*0??0PyIStream@@QAE@ABV0@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 72 ` L@^_41??0PyITypeComp@@IAE@PAUIUnknown@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 64 ` L@^_,2??0PyITypeComp@@QAE@ABV0@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 72 ` L@^_43??0PyITypeInfo@@IAE@PAUIUnknown@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 64 ` L@^_,4??0PyITypeInfo@@QAE@ABV0@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 71 ` L@^_35??0PyITypeLib@@IAE@PAUIUnknown@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 63 ` L@^_+6??0PyITypeLib@@QAE@ABV0@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 71 ` L@^_37??0PyIUnknown@@IAE@PAUIUnknown@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 63 ` L@^_+8??0PyIUnknown@@QAE@ABV0@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 64 ` L@^_,9??0PyOleArgNotFound@@QAE@XZpythoncom38.dllpythoncom38.dll/1605328448 0 58 ` L@^_&:??0PyOleEmpty@@QAE@XZpythoncom38.dllpythoncom38.dll/1605328448 0 60 ` L@^_(;??0PyOleMissing@@QAE@XZpythoncom38.dllpythoncom38.dll/1605328448 0 60 ` L@^_(<??0PyOleNothing@@QAE@XZpythoncom38.dllpythoncom38.dll/1605328448 0 76 ` L@^_8=??0PySTGMEDIUM@@QAE@PAUtagSTGMEDIUM@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 66 ` L@^_.>??0PythonOleArgHelper@@QAE@XZpythoncom38.dllpythoncom38.dll/1605328448 0 58 ` L@^_&???1CPyFactory@@QAE@XZpythoncom38.dllpythoncom38.dll/1605328448 0 75 ` L@^_7@??1PyComEnumProviderTypeObject@@QAE@XZpythoncom38.dll pythoncom38.dll/1605328448 0 67 ` L@^_/A??1PyComEnumTypeObject@@QAE@XZpythoncom38.dll pythoncom38.dll/1605328448 0 63 ` L@^_+B??1PyComTypeObject@@QAE@XZpythoncom38.dll pythoncom38.dll/1605328448 0 60 ` L@^_(C??1PyGOleWindow@@UAE@XZpythoncom38.dllpythoncom38.dll/1605328448 0 58 ` L@^_&D??1PyGPersist@@UAE@XZpythoncom38.dllpythoncom38.dll/1605328448 0 61 ` L@^_)E??1PyGatewayBase@@MAE@XZpythoncom38.dll pythoncom38.dll/1605328448 0 55 ` L@^_#F??1PyIBase@@MAE@XZpythoncom38.dll pythoncom38.dll/1605328448 0 58 ` L@^_&G??1PyIBindCtx@@MAE@XZpythoncom38.dllpythoncom38.dll/1605328448 0 63 ` L@^_+H??1PyIClassFactory@@MAE@XZpythoncom38.dll pythoncom38.dll/1605328448 0 66 ` L@^_.I??1PyIConnectionPoint@@MAE@XZpythoncom38.dllpythoncom38.dll/1605328448 0 75 ` L@^_7J??1PyIConnectionPointContainer@@MAE@XZpythoncom38.dll pythoncom38.dll/1605328448 0 59 ` L@^_'K??1PyIDispatch@@MAE@XZpythoncom38.dll pythoncom38.dll/1605328448 0 61 ` L@^_)L??1PyIDispatchEx@@MAE@XZpythoncom38.dll pythoncom38.dll/1605328448 0 62 ` L@^_*M??1PyIEnumMoniker@@MAE@XZpythoncom38.dllpythoncom38.dll/1605328448 0 62 ` L@^_*N??1PyIEnumVARIANT@@MAE@XZpythoncom38.dllpythoncom38.dll/1605328448 0 58 ` L@^_&O??1PyIMoniker@@MAE@XZpythoncom38.dllpythoncom38.dll/1605328448 0 60 ` L@^_(P??1PyIOleWindow@@MAE@XZpythoncom38.dllpythoncom38.dll/1605328448 0 58 ` L@^_&Q??1PyIPersist@@MAE@XZpythoncom38.dllpythoncom38.dll/1605328448 0 64 ` L@^_,R??1PyIPersistStream@@MAE@XZpythoncom38.dllpythoncom38.dll/1605328448 0 68 ` L@^_0S??1PyIPersistStreamInit@@MAE@XZpythoncom38.dllpythoncom38.dll/1605328448 0 68 ` L@^_0T??1PyIProvideClassInfo2@@MAE@XZpythoncom38.dllpythoncom38.dll/1605328448 0 67 ` L@^_/U??1PyIProvideClassInfo@@MAE@XZpythoncom38.dll pythoncom38.dll/1605328448 0 66 ` L@^_.V??1PyIServiceProvider@@MAE@XZpythoncom38.dllpythoncom38.dll/1605328448 0 57 ` L@^_%W??1PyIStream@@MAE@XZpythoncom38.dll pythoncom38.dll/1605328448 0 59 ` L@^_'X??1PyITypeComp@@MAE@XZpythoncom38.dll pythoncom38.dll/1605328448 0 59 ` L@^_'Y??1PyITypeInfo@@MAE@XZpythoncom38.dll pythoncom38.dll/1605328448 0 58 ` L@^_&Z??1PyITypeLib@@MAE@XZpythoncom38.dllpythoncom38.dll/1605328448 0 58 ` L@^_&[??1PyIUnknown@@MAE@XZpythoncom38.dllpythoncom38.dll/1605328448 0 59 ` L@^_'\??1PySTGMEDIUM@@QAE@XZpythoncom38.dll pythoncom38.dll/1605328448 0 66 ` L@^_.]??1PythonOleArgHelper@@QAE@XZpythoncom38.dllpythoncom38.dll/1605328448 0 67 ` L@^_/^??4CPyFactory@@QAEAAV0@ABV0@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 86 ` L@^_B_??4PyComEnumProviderTypeObject@@QAEAAV0@$$QAV0@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 84 ` L@^_@`??4PyComEnumProviderTypeObject@@QAEAAV0@ABV0@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 78 ` L@^_:a??4PyComEnumTypeObject@@QAEAAV0@$$QAV0@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 76 ` L@^_8b??4PyComEnumTypeObject@@QAEAAV0@ABV0@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 72 ` L@^_4c??4PyComTypeObject@@QAEAAV0@ABV0@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 71 ` L@^_3d??4PyGOleWindow@@QAEAAV0@$$QAV0@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 69 ` L@^_1e??4PyGOleWindow@@QAEAAV0@ABV0@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 69 ` L@^_1f??4PyGPersist@@QAEAAV0@$$QAV0@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 67 ` L@^_/g??4PyGPersist@@QAEAAV0@ABV0@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 70 ` L@^_2h??4PyGatewayBase@@QAEAAV0@ABV0@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 64 ` L@^_,i??4PyIBase@@QAEAAV0@ABV0@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 67 ` L@^_/j??4PyIBindCtx@@QAEAAV0@ABV0@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 72 ` L@^_4k??4PyIClassFactory@@QAEAAV0@ABV0@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 75 ` L@^_7l??4PyIConnectionPoint@@QAEAAV0@ABV0@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 84 ` L@^_@m??4PyIConnectionPointContainer@@QAEAAV0@ABV0@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 68 ` L@^_0n??4PyIDispatch@@QAEAAV0@ABV0@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 70 ` L@^_2o??4PyIDispatchEx@@QAEAAV0@ABV0@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 71 ` L@^_3p??4PyIEnumMoniker@@QAEAAV0@ABV0@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 71 ` L@^_3q??4PyIEnumVARIANT@@QAEAAV0@ABV0@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 67 ` L@^_/r??4PyIMoniker@@QAEAAV0@ABV0@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 69 ` L@^_1s??4PyIOleWindow@@QAEAAV0@ABV0@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 67 ` L@^_/t??4PyIPersist@@QAEAAV0@ABV0@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 73 ` L@^_5u??4PyIPersistStream@@QAEAAV0@ABV0@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 77 ` L@^_9v??4PyIPersistStreamInit@@QAEAAV0@ABV0@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 77 ` L@^_9w??4PyIProvideClassInfo2@@QAEAAV0@ABV0@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 76 ` L@^_8x??4PyIProvideClassInfo@@QAEAAV0@ABV0@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 75 ` L@^_7y??4PyIServiceProvider@@QAEAAV0@ABV0@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 66 ` L@^_.z??4PyIStream@@QAEAAV0@ABV0@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 68 ` L@^_0{??4PyITypeComp@@QAEAAV0@ABV0@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 68 ` L@^_0|??4PyITypeInfo@@QAEAAV0@ABV0@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 67 ` L@^_/}??4PyITypeLib@@QAEAAV0@ABV0@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 67 ` L@^_/~??4PyIUnknown@@QAEAAV0@ABV0@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 75 ` L@^_7??4PyOleArgNotFound@@QAEAAV0@$$QAV0@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 73 ` L@^_5??4PyOleArgNotFound@@QAEAAV0@ABV0@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 69 ` L@^_1??4PyOleEmpty@@QAEAAV0@$$QAV0@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 67 ` L@^_/??4PyOleEmpty@@QAEAAV0@ABV0@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 71 ` L@^_3??4PyOleMissing@@QAEAAV0@$$QAV0@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 69 ` L@^_1??4PyOleMissing@@QAEAAV0@ABV0@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 71 ` L@^_3??4PyOleNothing@@QAEAAV0@$$QAV0@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 69 ` L@^_1??4PyOleNothing@@QAEAAV0@ABV0@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 68 ` L@^_0??4PySTGMEDIUM@@QAEAAV0@ABV0@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 75 ` L@^_7??4PythonOleArgHelper@@QAEAAV0@ABV0@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 56 ` L@^_$??_7CPyFactory@@6B@pythoncom38.dllpythoncom38.dll/1605328448 0 58 ` L@^_&??_7PyGOleWindow@@6B@pythoncom38.dllpythoncom38.dll/1605328448 0 71 ` L@^_3??_7PyGOleWindow@@6BIDispatchEx@@@pythoncom38.dll pythoncom38.dll/1605328448 0 87 ` L@^_C??_7PyGOleWindow@@6BIInternalUnwrapPythonObject@@@pythoncom38.dll pythoncom38.dll/1605328448 0 77 ` L@^_9??_7PyGOleWindow@@6BISupportErrorInfo@@@pythoncom38.dll pythoncom38.dll/1605328448 0 56 ` L@^_$??_7PyGPersist@@6B@pythoncom38.dllpythoncom38.dll/1605328448 0 69 ` L@^_1??_7PyGPersist@@6BIDispatchEx@@@pythoncom38.dll pythoncom38.dll/1605328448 0 85 ` L@^_A??_7PyGPersist@@6BIInternalUnwrapPythonObject@@@pythoncom38.dll pythoncom38.dll/1605328448 0 75 ` L@^_7??_7PyGPersist@@6BISupportErrorInfo@@@pythoncom38.dll pythoncom38.dll/1605328448 0 72 ` L@^_4??_7PyGatewayBase@@6BIDispatchEx@@@pythoncom38.dllpythoncom38.dll/1605328448 0 88 ` L@^_D??_7PyGatewayBase@@6BIInternalUnwrapPythonObject@@@pythoncom38.dllpythoncom38.dll/1605328448 0 78 ` L@^_:??_7PyGatewayBase@@6BISupportErrorInfo@@@pythoncom38.dllpythoncom38.dll/1605328448 0 53 ` L@^_!??_7PyIBase@@6B@pythoncom38.dll pythoncom38.dll/1605328448 0 56 ` L@^_$??_7PyIBindCtx@@6B@pythoncom38.dllpythoncom38.dll/1605328448 0 61 ` L@^_)??_7PyIClassFactory@@6B@pythoncom38.dll pythoncom38.dll/1605328448 0 64 ` L@^_,??_7PyIConnectionPoint@@6B@pythoncom38.dllpythoncom38.dll/1605328448 0 73 ` L@^_5??_7PyIConnectionPointContainer@@6B@pythoncom38.dll pythoncom38.dll/1605328448 0 57 ` L@^_%??_7PyIDispatch@@6B@pythoncom38.dll pythoncom38.dll/1605328448 0 59 ` L@^_'??_7PyIDispatchEx@@6B@pythoncom38.dll pythoncom38.dll/1605328448 0 60 ` L@^_(??_7PyIEnumMoniker@@6B@pythoncom38.dllpythoncom38.dll/1605328448 0 60 ` L@^_(??_7PyIEnumVARIANT@@6B@pythoncom38.dllpythoncom38.dll/1605328448 0 56 ` L@^_$??_7PyIMoniker@@6B@pythoncom38.dllpythoncom38.dll/1605328448 0 58 ` L@^_&??_7PyIOleWindow@@6B@pythoncom38.dllpythoncom38.dll/1605328448 0 56 ` L@^_$??_7PyIPersist@@6B@pythoncom38.dllpythoncom38.dll/1605328448 0 62 ` L@^_*??_7PyIPersistStream@@6B@pythoncom38.dllpythoncom38.dll/1605328448 0 66 ` L@^_.??_7PyIPersistStreamInit@@6B@pythoncom38.dllpythoncom38.dll/1605328448 0 66 ` L@^_.??_7PyIProvideClassInfo2@@6B@pythoncom38.dllpythoncom38.dll/1605328448 0 65 ` L@^_-??_7PyIProvideClassInfo@@6B@pythoncom38.dll pythoncom38.dll/1605328448 0 64 ` L@^_,??_7PyIServiceProvider@@6B@pythoncom38.dllpythoncom38.dll/1605328448 0 55 ` L@^_#??_7PyIStream@@6B@pythoncom38.dll pythoncom38.dll/1605328448 0 57 ` L@^_%??_7PyITypeComp@@6B@pythoncom38.dll pythoncom38.dll/1605328448 0 57 ` L@^_%??_7PyITypeInfo@@6B@pythoncom38.dll pythoncom38.dll/1605328448 0 56 ` L@^_$??_7PyITypeLib@@6B@pythoncom38.dllpythoncom38.dll/1605328448 0 56 ` L@^_$??_7PyIUnknown@@6B@pythoncom38.dllpythoncom38.dll/1605328448 0 60 ` L@^_(??_FPySTGMEDIUM@@QAEXXZpythoncom38.dllpythoncom38.dll/1605328448 0 63 ` L@^_+?AddRef@CPyFactory@@UAGKXZpythoncom38.dll pythoncom38.dll/1605328448 0 65 ` L@^_-?AddRef@PyGOleWindow@@MAGKXZpythoncom38.dll pythoncom38.dll/1605328448 0 63 ` L@^_+?AddRef@PyGPersist@@MAGKXZpythoncom38.dll pythoncom38.dll/1605328448 0 66 ` L@^_.?AddRef@PyGatewayBase@@UAGKXZpythoncom38.dllpythoncom38.dll/1605328448 0 87 ` L@^_C?Advise@PyIConnectionPoint@@SAPAU_object@@PAU2@0@Zpythoncom38.dll pythoncom38.dll/1605328448 0 78 ` L@^_:?Bind@PyITypeComp@@QAEPAU_object@@PA_WG@Zpythoncom38.dllpythoncom38.dll/1605328448 0 85 ` L@^_A?BindToObject@PyIMoniker@@SAPAU_object@@PAU2@0@Zpythoncom38.dll pythoncom38.dll/1605328448 0 86 ` L@^_B?BindToStorage@PyIMoniker@@SAPAU_object@@PAU2@0@Zpythoncom38.dllpythoncom38.dll/1605328448 0 81 ` L@^_=?BindType@PyITypeComp@@QAEPAU_object@@PA_W@Zpythoncom38.dll pythoncom38.dll/1605328448 0 82 ` L@^_>?Clone@PyIEnumMoniker@@SAPAU_object@@PAU2@0@Zpythoncom38.dllpythoncom38.dll/1605328448 0 82 ` L@^_>?Clone@PyIEnumVARIANT@@SAPAU_object@@PAU2@0@Zpythoncom38.dllpythoncom38.dll/1605328448 0 77 ` L@^_9?Clone@PyIStream@@SAPAU_object@@PAU2@0@Zpythoncom38.dll pythoncom38.dll/1605328448 0 63 ` L@^_+?Close@PySTGMEDIUM@@QAEXXZpythoncom38.dll pythoncom38.dll/1605328448 0 78 ` L@^_:?Commit@PyIStream@@SAPAU_object@@PAU2@0@Zpythoncom38.dllpythoncom38.dll/1605328448 0 84 ` L@^_@?ComposeWith@PyIMoniker@@SAPAU_object@@PAU2@0@Zpythoncom38.dllpythoncom38.dll/1605328448 0 80 ` L@^_<?ContextSensitiveHelp@PyGOleWindow@@MAGJH@Zpythoncom38.dllpythoncom38.dll/1605328448 0 95 ` L@^_K?ContextSensitiveHelp@PyIOleWindow@@SAPAU_object@@PAU2@0@Zpythoncom38.dll pythoncom38.dll/1605328448 0 78 ` L@^_:?CopyTo@PyIStream@@SAPAU_object@@PAU2@0@Zpythoncom38.dllpythoncom38.dll/1605328448 0 81 ` L@^_=?CopyTo@PySTGMEDIUM@@QAEHPAUtagSTGMEDIUM@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 99 ` L@^_O?CreateInstance@CPyFactory@@UAGJPAUIUnknown@@ABU_GUID@@PAPAX@Zpythoncom38.dll pythoncom38.dll/1605328448 0 92 ` L@^_H?CreateInstance@PyIClassFactory@@SAPAU_object@@PAU2@0@Zpythoncom38.dllpythoncom38.dll/1605328448 0 105 ` L@^_U?CreateNewPythonInstance@CPyFactory@@IAGJABU_GUID@@0PAPAU_object@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 81 ` L@^_=?DeleteMemberByDispID@PyGatewayBase@@UAGJJ@Zpythoncom38.dll pythoncom38.dll/1605328448 0 96 ` L@^_L?DeleteMemberByDispID@PyIDispatchEx@@SAPAU_object@@PAU2@0@Zpythoncom38.dllpythoncom38.dll/1605328448 0 83 ` L@^_??DeleteMemberByName@PyGatewayBase@@UAGJPA_WK@Zpythoncom38.dll pythoncom38.dll/1605328448 0 94 ` L@^_J?DeleteMemberByName@PyIDispatchEx@@SAPAU_object@@PAU2@0@Zpythoncom38.dllpythoncom38.dll/1605328448 0 71 ` L@^_3?DropOwnership@PySTGMEDIUM@@QAEXXZpythoncom38.dll pythoncom38.dll/1605328448 0 77 ` L@^_9?Enum@PyIMoniker@@SAPAU_object@@PAU2@0@Zpythoncom38.dll pythoncom38.dll/1605328448 0 110 ` L@^_Z?EnumConnectionPoints@PyIConnectionPointContainer@@SAPAU_object@@PAU2@0@Zpythoncom38.dllpythoncom38.dll/1605328448 0 96 ` L@^_L?EnumConnections@PyIConnectionPoint@@SAPAU_object@@PAU2@0@Zpythoncom38.dllpythoncom38.dll/1605328448 0 88 ` L@^_D?EnumObjectParam@PyIBindCtx@@SAPAU_object@@PAU2@0@Zpythoncom38.dllpythoncom38.dll/1605328448 0 109 ` L@^_Y?FindConnectionPoint@PyIConnectionPointContainer@@SAPAU_object@@PAU2@0@Zpythoncom38.dll pythoncom38.dll/1605328448 0 87 ` L@^_C?GetBindOptions@PyIBindCtx@@SAPAU_object@@PAU2@0@Zpythoncom38.dll pythoncom38.dll/1605328448 0 77 ` L@^_9?GetClassID@PyGPersist@@MAGJPAU_GUID@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 83 ` L@^_??GetClassID@PyIPersist@@SAPAU_object@@PAU2@0@Zpythoncom38.dll pythoncom38.dll/1605328448 0 95 ` L@^_K?GetClassInfoW@PyIProvideClassInfo@@SAPAU_object@@PAU2@0@Zpythoncom38.dll pythoncom38.dll/1605328448 0 103 ` L@^_S?GetConnectionInterface@PyIConnectionPoint@@SAPAU_object@@PAU2@0@Zpythoncom38.dll pythoncom38.dll/1605328448 0 108 ` L@^_X?GetConnectionPointContainer@PyIConnectionPoint@@SAPAU_object@@PAU2@0@Zpythoncom38.dllpythoncom38.dll/1605328448 0 89 ` L@^_E?GetContainingTypeLib@PyITypeInfo@@QAEPAU_object@@XZpythoncom38.dll pythoncom38.dll/1605328448 0 77 ` L@^_9?GetDispID@PyGatewayBase@@UAGJPA_WKPAJ@Zpythoncom38.dll pythoncom38.dll/1605328448 0 85 ` L@^_A?GetDispID@PyIDispatchEx@@SAPAU_object@@PAU2@0@Zpythoncom38.dll pythoncom38.dll/1605328448 0 87 ` L@^_C?GetDisplayName@PyIMoniker@@SAPAU_object@@PAU2@0@Zpythoncom38.dll pythoncom38.dll/1605328448 0 86 ` L@^_B?GetDocumentation@PyITypeInfo@@QAEPAU_object@@J@Zpythoncom38.dllpythoncom38.dll/1605328448 0 85 ` L@^_A?GetDocumentation@PyITypeLib@@QAEPAU_object@@H@Zpythoncom38.dll pythoncom38.dll/1605328448 0 81 ` L@^_=?GetFuncDesc@PyITypeInfo@@QAEPAU_object@@H@Zpythoncom38.dll pythoncom38.dll/1605328448 0 90 ` L@^_F?GetGUID@PyIProvideClassInfo2@@SAPAU_object@@PAU2@0@Zpythoncom38.dllpythoncom38.dll/1605328448 0 84 ` L@^_@?GetI@PyIBindCtx@@SAPAUIBindCtx@@PAU_object@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 94 ` L@^_J?GetI@PyIClassFactory@@SAPAUIClassFactory@@PAU_object@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 100 ` L@^_P?GetI@PyIConnectionPoint@@SAPAUIConnectionPoint@@PAU_object@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 118 ` L@^_b?GetI@PyIConnectionPointContainer@@SAPAUIConnectionPointContainer@@PAU_object@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 86 ` L@^_B?GetI@PyIDispatch@@SAPAUIDispatch@@PAU_object@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 90 ` L@^_F?GetI@PyIDispatchEx@@SAPAUIDispatchEx@@PAU_object@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 92 ` L@^_H?GetI@PyIEnumMoniker@@SAPAUIEnumMoniker@@PAU_object@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 92 ` L@^_H?GetI@PyIEnumVARIANT@@SAPAUIEnumVARIANT@@PAU_object@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 84 ` L@^_@?GetI@PyIMoniker@@SAPAUIMoniker@@PAU_object@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 88 ` L@^_D?GetI@PyIOleWindow@@SAPAUIOleWindow@@PAU_object@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 84 ` L@^_@?GetI@PyIPersist@@SAPAUIPersist@@PAU_object@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 96 ` L@^_L?GetI@PyIPersistStream@@SAPAUIPersistStream@@PAU_object@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 104 ` L@^_T?GetI@PyIPersistStreamInit@@SAPAUIPersistStreamInit@@PAU_object@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 104 ` L@^_T?GetI@PyIProvideClassInfo2@@SAPAUIProvideClassInfo2@@PAU_object@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 102 ` L@^_R?GetI@PyIProvideClassInfo@@SAPAUIProvideClassInfo@@PAU_object@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 100 ` L@^_P?GetI@PyIServiceProvider@@SAPAUIServiceProvider@@PAU_object@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 82 ` L@^_>?GetI@PyIStream@@SAPAUIStream@@PAU_object@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 86 ` L@^_B?GetI@PyITypeComp@@SAPAUITypeComp@@PAU_object@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 86 ` L@^_B?GetI@PyITypeInfo@@SAPAUITypeInfo@@PAU_object@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 84 ` L@^_@?GetI@PyITypeLib@@SAPAUITypeLib@@PAU_object@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 84 ` L@^_@?GetI@PyIUnknown@@SAPAUIUnknown@@PAU_object@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 94 ` L@^_J?GetIDsOfNames@PyGatewayBase@@UAGJABU_GUID@@PAPA_WIKPAJ@Zpythoncom38.dllpythoncom38.dll/1605328448 0 87 ` L@^_C?GetIDsOfNames@PyIDispatch@@SAPAU_object@@PAU2@0@Zpythoncom38.dll pythoncom38.dll/1605328448 0 74 ` L@^_6?GetIID@PyGOleWindow@@MAE?AU_GUID@@XZpythoncom38.dllpythoncom38.dll/1605328448 0 72 ` L@^_4?GetIID@PyGPersist@@MAE?AU_GUID@@XZpythoncom38.dllpythoncom38.dll/1605328448 0 75 ` L@^_7?GetIID@PyGatewayBase@@UAE?AU_GUID@@XZpythoncom38.dll pythoncom38.dll/1605328448 0 86 ` L@^_B?GetImplTypeFlags@PyITypeInfo@@QAEPAU_object@@H@Zpythoncom38.dllpythoncom38.dll/1605328448 0 78 ` L@^_:?GetLibAttr@PyITypeLib@@QAEPAU_object@@XZpythoncom38.dllpythoncom38.dll/1605328448 0 80 ` L@^_<?GetMemberName@PyGatewayBase@@UAGJJPAPA_W@Zpythoncom38.dllpythoncom38.dll/1605328448 0 89 ` L@^_E?GetMemberName@PyIDispatchEx@@SAPAU_object@@PAU2@0@Zpythoncom38.dll pythoncom38.dll/1605328448 0 84 ` L@^_@?GetMemberProperties@PyGatewayBase@@UAGJJKPAK@Zpythoncom38.dllpythoncom38.dll/1605328448 0 95 ` L@^_K?GetMemberProperties@PyIDispatchEx@@SAPAU_object@@PAU2@0@Zpythoncom38.dll pythoncom38.dll/1605328448 0 93 ` L@^_I?GetNameSpaceParent@PyGatewayBase@@UAGJPAPAUIUnknown@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 78 ` L@^_:?GetNames@PyITypeInfo@@QAEPAU_object@@J@Zpythoncom38.dllpythoncom38.dll/1605328448 0 78 ` L@^_:?GetNextDispID@PyGatewayBase@@UAGJKJPAJ@Zpythoncom38.dllpythoncom38.dll/1605328448 0 89 ` L@^_E?GetNextDispID@PyIDispatchEx@@SAPAU_object@@PAU2@0@Zpythoncom38.dll pythoncom38.dll/1605328448 0 87 ` L@^_C?GetObjectParam@PyIBindCtx@@SAPAU_object@@PAU2@0@Zpythoncom38.dll pythoncom38.dll/1605328448 0 84 ` L@^_@?GetRefTypeInfo@PyITypeInfo@@QAEPAU_object@@K@Zpythoncom38.dllpythoncom38.dll/1605328448 0 90 ` L@^_F?GetRefTypeOfImplType@PyITypeInfo@@QAEPAU_object@@H@Zpythoncom38.dllpythoncom38.dll/1605328448 0 94 ` L@^_J?GetRunningObjectTable@PyIBindCtx@@SAPAU_object@@PAU2@0@Zpythoncom38.dllpythoncom38.dll/1605328448 0 89 ` L@^_E?GetSizeMax@PyIPersistStream@@SAPAU_object@@PAU2@0@Zpythoncom38.dll pythoncom38.dll/1605328448 0 80 ` L@^_<?GetTypeAttr@PyITypeInfo@@QAEPAU_object@@XZpythoncom38.dllpythoncom38.dll/1605328448 0 80 ` L@^_<?GetTypeComp@PyITypeInfo@@QAEPAU_object@@XZpythoncom38.dllpythoncom38.dll/1605328448 0 79 ` L@^_;?GetTypeComp@PyITypeLib@@QAEPAU_object@@XZpythoncom38.dll pythoncom38.dll/1605328448 0 89 ` L@^_E?GetTypeInfo@PyGatewayBase@@UAGJIKPAPAUITypeInfo@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 85 ` L@^_A?GetTypeInfo@PyIDispatch@@SAPAU_object@@PAU2@0@Zpythoncom38.dll pythoncom38.dll/1605328448 0 80 ` L@^_<?GetTypeInfo@PyITypeLib@@QAEPAU_object@@H@Zpythoncom38.dllpythoncom38.dll/1605328448 0 79 ` L@^_; ?GetTypeInfoCount@PyGatewayBase@@UAGJPAI@Zpythoncom38.dll pythoncom38.dll/1605328448 0 90 ` L@^_F ?GetTypeInfoCount@PyIDispatch@@SAPAU_object@@PAU2@0@Zpythoncom38.dllpythoncom38.dll/1605328448 0 84 ` L@^_@ ?GetTypeInfoCount@PyITypeLib@@QAEPAU_object@@XZpythoncom38.dllpythoncom38.dll/1605328448 0 95 ` L@^_K ?GetTypeInfoOfGuid@PyITypeLib@@QAEPAU_object@@ABU_GUID@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 84 ` L@^_@ ?GetTypeInfoType@PyITypeLib@@QAEPAU_object@@H@Zpythoncom38.dllpythoncom38.dll/1605328448 0 80 ` L@^_<?GetVarDesc@PyITypeInfo@@QAEPAU_object@@H@Zpythoncom38.dllpythoncom38.dll/1605328448 0 81 ` L@^_=?GetWindow@PyGOleWindow@@MAGJPAPAUHWND__@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 84 ` L@^_@?GetWindow@PyIOleWindow@@SAPAU_object@@PAU2@0@Zpythoncom38.dllpythoncom38.dll/1605328448 0 77 ` L@^_9?Hash@PyIMoniker@@SAPAU_object@@PAU2@0@Zpythoncom38.dll pythoncom38.dll/1605328448 0 90 ` L@^_F?InitNew@PyIPersistStreamInit@@SAPAU_object@@PAU2@0@Zpythoncom38.dllpythoncom38.dll/1605328448 0 96 ` L@^_L?InterfaceSupportsErrorInfo@PyGatewayBase@@UAGJABU_GUID@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 132 ` L@^_p?Invoke@PyGatewayBase@@UAGJJABU_GUID@@KGPAUtagDISPPARAMS@@PAUtagVARIANT@@PAUtagEXCEPINFO@@PAI@Zpythoncom38.dllpythoncom38.dll/1605328448 0 80 ` L@^_<?Invoke@PyIDispatch@@SAPAU_object@@PAU2@0@Zpythoncom38.dllpythoncom38.dll/1605328448 0 142 ` L@^_z?InvokeEx@PyGatewayBase@@UAGJJKGPAUtagDISPPARAMS@@PAUtagVARIANT@@PAUtagEXCEPINFO@@PAUIServiceProvider@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 84 ` L@^_@?InvokeEx@PyIDispatchEx@@SAPAU_object@@PAU2@0@Zpythoncom38.dllpythoncom38.dll/1605328448 0 85 ` L@^_A?InvokeTypes@PyIDispatch@@SAPAU_object@@PAU2@0@Zpythoncom38.dll pythoncom38.dll/1605328448 0 93 ` L@^_I?InvokeViaPolicy@PyGatewayBase@@MAAJPBDPAPAU_object@@0ZZpythoncom38.dll pythoncom38.dll/1605328448 0 86 ` L@^_B?IsDirty@PyIPersistStream@@SAPAU_object@@PAU2@0@Zpythoncom38.dllpythoncom38.dll/1605328448 0 80 ` L@^_<?IsEqual@PyIMoniker@@SAPAU_object@@PAU2@0@Zpythoncom38.dllpythoncom38.dll/1605328448 0 88 ` L@^_D?IsSystemMoniker@PyIMoniker@@SAPAU_object@@PAU2@0@Zpythoncom38.dllpythoncom38.dll/1605328448 0 83 ` L@^_??Load@PyIPersistStream@@SAPAU_object@@PAU2@0@Zpythoncom38.dll pythoncom38.dll/1605328448 0 82 ` L@^_>?LockRegion@PyIStream@@SAPAU_object@@PAU2@0@Zpythoncom38.dllpythoncom38.dll/1605328448 0 68 ` L@^_0?LockServer@CPyFactory@@UAGJH@Zpythoncom38.dllpythoncom38.dll/1605328448 0 88 ` L@^_D ?LockServer@PyIClassFactory@@SAPAU_object@@PAU2@0@Zpythoncom38.dllpythoncom38.dll/1605328448 0 73 ` L@^_5!?MakeBstrToObj@@YAPAU_object@@QA_W@Zpythoncom38.dll pythoncom38.dll/1605328448 0 76 ` L@^_8"?MakeOLECHARToObj@@YAPAU_object@@PB_W@Zpythoncom38.dllpythoncom38.dll/1605328448 0 77 ` L@^_9#?MakeOLECHARToObj@@YAPAU_object@@PB_WH@Zpythoncom38.dll pythoncom38.dll/1605328448 0 109 ` L@^_Y$?MakeObjToVariant@PythonOleArgHelper@@QAEHPAU_object@@PAUtagVARIANT@@0@Zpythoncom38.dll pythoncom38.dll/1605328448 0 128 ` L@^_l%?MakePythonArgumentTuples@@YAHPAPAU_object@@PAPAVPythonOleArgHelper@@01PAUtagDISPPARAMS@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 107 ` L@^_W&?MakeVariantToObj@PythonOleArgHelper@@QAEPAU_object@@PAUtagVARIANT@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 81 ` L@^_='?Next@PyIEnumMoniker@@SAPAU_object@@PAU2@0@Zpythoncom38.dll pythoncom38.dll/1605328448 0 81 ` L@^_=(?Next@PyIEnumVARIANT@@SAPAU_object@@PAU2@0@Zpythoncom38.dll pythoncom38.dll/1605328448 0 97 ` L@^_M)?ParseTypeInformation@PythonOleArgHelper@@QAEHPAU_object@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 86 ` L@^_B*?PyCom_BstrFromPyObject@@YAHPAU_object@@PAPA_WH@Zpythoncom38.dllpythoncom38.dll/1605328448 0 89 ` L@^_E+?PyCom_BuildInternalPyException@@YAPAU_object@@PAD@Zpythoncom38.dll pythoncom38.dll/1605328448 0 102 ` L@^_R,?PyCom_BuildPyException@@YAPAU_object@@JPAUIUnknown@@ABU_GUID@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 110 ` L@^_Z-?PyCom_BuildPyExceptionFromEXCEPINFO@@YAPAU_object@@JPAUtagEXCEPINFO@@I@Zpythoncom38.dllpythoncom38.dll/1605328448 0 66 ` L@^_. ?PyCom_CoInitialize@@YAJPAX@Zpythoncom38.dllpythoncom38.dll/1605328448 0 69 ` L@^_1 ?PyCom_CoInitializeEx@@YAJPAXK@Zpythoncom38.dll pythoncom38.dll/1605328448 0 65 ` L@^_- ?PyCom_CoUninitialize@@YAXXZpythoncom38.dll pythoncom38.dll/1605328448 0 60 ` L@^_(.?PyCom_DLLAddRef@@YAXXZpythoncom38.dllpythoncom38.dll/1605328448 0 64 ` L@^_,/?PyCom_DLLReleaseRef@@YAXXZpythoncom38.dllpythoncom38.dll/1605328448 0 69 ` L@^_10?PyCom_EnableQuitMessage@@YAXK@Zpythoncom38.dll pythoncom38.dll/1605328448 0 92 ` L@^_H1?PyCom_ExcepInfoFromPyException@@YAXPAUtagEXCEPINFO@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 104 ` L@^_T2?PyCom_ExcepInfoFromPyObject@@YAHPAU_object@@PAUtagEXCEPINFO@@PAJ@Zpythoncom38.dllpythoncom38.dll/1605328448 0 110 ` L@^_Z3?PyCom_InterfaceFromPyInstanceOrObject@@YAHPAU_object@@ABU_GUID@@PAPAXH@Zpythoncom38.dllpythoncom38.dll/1605328448 0 100 ` L@^_P ?PyCom_InterfaceFromPyObject@@YAHPAU_object@@ABU_GUID@@PAPAXH@Zpythoncom38.dllpythoncom38.dll/1605328448 0 80 ` L@^_<4?PyCom_IsGatewayRegistered@@YAHABU_GUID@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 58 ` L@^_&5?PyCom_LogF@@YAXPBDZZpythoncom38.dllpythoncom38.dll/1605328448 0 81 ` L@^_=6?PyCom_LoggerException@@YAXPAU_object@@PBDZZpythoncom38.dll pythoncom38.dll/1605328448 0 90 ` L@^_F7?PyCom_LoggerNonServerException@@YAXPAU_object@@PBDZZpythoncom38.dllpythoncom38.dll/1605328448 0 79 ` L@^_;8?PyCom_LoggerWarning@@YAXPAU_object@@PBDZZpythoncom38.dll pythoncom38.dll/1605328448 0 134 ` L@^_r ?PyCom_MakeOlePythonCall@@YAHPAU_object@@PAUtagDISPPARAMS@@PAUtagVARIANT@@PAUtagEXCEPINFO@@PAI0@Zpythoncom38.dllpythoncom38.dll/1605328448 0 109 ` L@^_Y9?PyCom_PyObjectAsSTATPROPSETSTG@@YAHPAU_object@@PAUtagSTATPROPSETSTG@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 96 ` L@^_L:?PyCom_PyObjectAsSTATSTG@@YAHPAU_object@@PAUtagSTATSTG@@K@Zpythoncom38.dllpythoncom38.dll/1605328448 0 103 ` L@^_S;?PyCom_PyObjectAsSTGOPTIONS@@YAHPAU_object@@PAPAUtagSTGOPTIONS@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 100 ` L@^_P<?PyCom_PyObjectFromExcepInfo@@YAPAU_object@@PBUtagEXCEPINFO@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 106 ` L@^_V ?PyCom_PyObjectFromIUnknown@@YAPAU_object@@PAUIUnknown@@ABU_GUID@@H@Zpythoncom38.dllpythoncom38.dll/1605328448 0 111 ` L@^_[=?PyCom_PyObjectFromSAFEARRAY@@YAPAU_object@@PAUtagSAFEARRAY@@W4VARENUM@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 110 ` L@^_Z>?PyCom_PyObjectFromSTATPROPSETSTG@@YAPAU_object@@PAUtagSTATPROPSETSTG@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 96 ` L@^_L??PyCom_PyObjectFromSTATSTG@@YAPAU_object@@PAUtagSTATSTG@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 96 ` L@^_L ?PyCom_PyObjectFromVariant@@YAPAU_object@@PBUtagVARIANT@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 95 ` L@^_K@?PyCom_RegisterClientType@@YAHPAU_typeobject@@PBU_GUID@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 119 ` L@^_cA?PyCom_RegisterExtensionSupport@@YAHPAU_object@@PBUPyCom_InterfaceSupportInfo@@H@Zpythoncom38.dll pythoncom38.dll/1605328448 0 127 ` L@^_kB?PyCom_RegisterGatewayObject@@YAJABU_GUID@@P6AJPAU_object@@PAVPyGatewayBase@@PAPAX0@ZPBD@Zpythoncom38.dll pythoncom38.dll/1605328448 0 114 ` L@^_^C?PyCom_SAFEARRAYFromPyObject@@YAHPAU_object@@PAPAUtagSAFEARRAY@@W4VARENUM@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 96 ` L@^_LD?PyCom_SetAndLogCOMErrorFromPyException@@YAJPBDABU_GUID@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 110 ` L@^_ZE?PyCom_SetAndLogCOMErrorFromPyExceptionEx@@YAJPAU_object@@PBDABU_GUID@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 87 ` L@^_CF?PyCom_SetCOMErrorFromPyException@@YAJABU_GUID@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 86 ` L@^_BG?PyCom_SetCOMErrorFromSimple@@YAJJABU_GUID@@PBD@Zpythoncom38.dllpythoncom38.dll/1605328448 0 67 ` L@^_/H?PyCom_StreamMessage@@YAXPBD@Zpythoncom38.dll pythoncom38.dll/1605328448 0 97 ` L@^_M ?PyCom_VariantFromPyObject@@YAHPAU_object@@PAUtagVARIANT@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 121 ` L@^_eI?PyGatewayConstruct@PyGOleWindow@@SAJPAU_object@@PAVPyGatewayBase@@PAPAXABU_GUID@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 119 ` L@^_cJ?PyGatewayConstruct@PyGPersist@@SAJPAU_object@@PAVPyGatewayBase@@PAPAXABU_GUID@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 109 ` L@^_YK?PyGatewayConstruct@PyGatewayBase@@SAJPAU_object@@PAV1@PAPAXABU_GUID@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 96 ` L@^_LL?PyObConstruct@PyIBindCtx@@SAPAVPyIUnknown@@PAUIUnknown@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 101 ` L@^_QM?PyObConstruct@PyIClassFactory@@SAPAVPyIUnknown@@PAUIUnknown@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 104 ` L@^_TN?PyObConstruct@PyIConnectionPoint@@SAPAVPyIUnknown@@PAUIUnknown@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 113 ` L@^_]O?PyObConstruct@PyIConnectionPointContainer@@SAPAVPyIUnknown@@PAUIUnknown@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 97 ` L@^_MP?PyObConstruct@PyIDispatch@@SAPAVPyIUnknown@@PAUIUnknown@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 99 ` L@^_OQ?PyObConstruct@PyIDispatchEx@@SAPAVPyIUnknown@@PAUIUnknown@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 100 ` L@^_PR?PyObConstruct@PyIEnumMoniker@@SAPAVPyIUnknown@@PAUIUnknown@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 100 ` L@^_PS?PyObConstruct@PyIEnumVARIANT@@SAPAVPyIUnknown@@PAUIUnknown@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 96 ` L@^_LT?PyObConstruct@PyIMoniker@@SAPAVPyIUnknown@@PAUIUnknown@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 98 ` L@^_NU?PyObConstruct@PyIOleWindow@@SAPAVPyIUnknown@@PAUIUnknown@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 96 ` L@^_LV?PyObConstruct@PyIPersist@@SAPAVPyIUnknown@@PAUIUnknown@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 102 ` L@^_RW?PyObConstruct@PyIPersistStream@@SAPAVPyIUnknown@@PAUIUnknown@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 106 ` L@^_VX?PyObConstruct@PyIPersistStreamInit@@SAPAVPyIUnknown@@PAUIUnknown@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 106 ` L@^_VY?PyObConstruct@PyIProvideClassInfo2@@SAPAVPyIUnknown@@PAUIUnknown@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 105 ` L@^_UZ?PyObConstruct@PyIProvideClassInfo@@SAPAVPyIUnknown@@PAUIUnknown@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 104 ` L@^_T[?PyObConstruct@PyIServiceProvider@@SAPAVPyIUnknown@@PAUIUnknown@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 95 ` L@^_K\?PyObConstruct@PyIStream@@SAPAVPyIUnknown@@PAUIUnknown@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 97 ` L@^_M]?PyObConstruct@PyITypeComp@@SAPAVPyIUnknown@@PAUIUnknown@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 97 ` L@^_M^?PyObConstruct@PyITypeInfo@@SAPAVPyIUnknown@@PAUIUnknown@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 96 ` L@^_L_?PyObConstruct@PyITypeLib@@SAPAVPyIUnknown@@PAUIUnknown@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 86 ` L@^_B`?PyObConstruct@PyIUnknown@@SAPAV1@PAUIUnknown@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 86 ` L@^_Ba?PyObject_AsCurrency@@YAHPAU_object@@PATtagCY@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 112 ` L@^_\b?PyObject_AsOLEMENUGROUPWIDTHS@@YAHPAU_object@@PAUtagOleMenuGroupWidths@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 98 ` L@^_Nc?PyObject_AsPROPVARIANT@@YAHPAU_object@@PAUtagPROPVARIANT@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 87 ` L@^_Cd?PyObject_FromCurrency@@YAPAU_object@@AATtagCY@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 113 ` L@^_]e?PyObject_FromOLEMENUGROUPWIDTHS@@YAPAU_object@@PBUtagOleMenuGroupWidths@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 99 ` L@^_Of?PyObject_FromPROPVARIANT@@YAPAU_object@@PAUtagPROPVARIANT@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 101 ` L@^_Qg?PyObject_FromPROPVARIANTs@@YAPAU_object@@PAUtagPROPVARIANT@@K@Zpythoncom38.dll pythoncom38.dll/1605328448 0 99 ` L@^_Oh?PyObject_FromSTGMEDIUM@@YAPAVPySTGMEDIUM@@PAUtagSTGMEDIUM@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 76 ` L@^_8i?PyOleArgNotFoundType@@3U_typeobject@@Apythoncom38.dllpythoncom38.dll/1605328448 0 70 ` L@^_2j?PyOleEmptyType@@3U_typeobject@@Apythoncom38.dllpythoncom38.dll/1605328448 0 72 ` L@^_4k?PyOleMissingType@@3U_typeobject@@Apythoncom38.dllpythoncom38.dll/1605328448 0 72 ` L@^_4l?PyOleNothingType@@3U_typeobject@@Apythoncom38.dllpythoncom38.dll/1605328448 0 86 ` L@^_Bm?QueryInterface@CPyFactory@@UAGJABU_GUID@@PAPAX@Zpythoncom38.dllpythoncom38.dll/1605328448 0 88 ` L@^_Dn?QueryInterface@PyGOleWindow@@MAGJABU_GUID@@PAPAX@Zpythoncom38.dllpythoncom38.dll/1605328448 0 86 ` L@^_Bo?QueryInterface@PyGPersist@@MAGJABU_GUID@@PAPAX@Zpythoncom38.dllpythoncom38.dll/1605328448 0 89 ` L@^_Ep?QueryInterface@PyGatewayBase@@UAGJABU_GUID@@PAPAX@Zpythoncom38.dll pythoncom38.dll/1605328448 0 87 ` L@^_Cq?QueryInterface@PyIUnknown@@SAPAU_object@@PAU2@0@Zpythoncom38.dll pythoncom38.dll/1605328448 0 93 ` L@^_Ir?QueryService@PyIServiceProvider@@SAPAU_object@@PAU2@0@Zpythoncom38.dll pythoncom38.dll/1605328448 0 76 ` L@^_8s?Read@PyIStream@@SAPAU_object@@PAU2@0@Zpythoncom38.dllpythoncom38.dll/1605328448 0 92 ` L@^_Ht?RegisterObjectParam@PyIBindCtx@@SAPAU_object@@PAU2@0@Zpythoncom38.dllpythoncom38.dll/1605328448 0 64 ` L@^_,u?Release@CPyFactory@@UAGKXZpythoncom38.dllpythoncom38.dll/1605328448 0 66 ` L@^_.v?Release@PyGOleWindow@@MAGKXZpythoncom38.dllpythoncom38.dll/1605328448 0 64 ` L@^_,w?Release@PyGPersist@@MAGKXZpythoncom38.dllpythoncom38.dll/1605328448 0 67 ` L@^_/x?Release@PyGatewayBase@@UAGKXZpythoncom38.dll pythoncom38.dll/1605328448 0 82 ` L@^_>y?Reset@PyIEnumMoniker@@SAPAU_object@@PAU2@0@Zpythoncom38.dllpythoncom38.dll/1605328448 0 82 ` L@^_>z?Reset@PyIEnumVARIANT@@SAPAU_object@@PAU2@0@Zpythoncom38.dllpythoncom38.dll/1605328448 0 78 ` L@^_:{?Revert@PyIStream@@SAPAU_object@@PAU2@0@Zpythoncom38.dllpythoncom38.dll/1605328448 0 90 ` L@^_F|?RevokeObjectParam@PyIBindCtx@@SAPAU_object@@PAU2@0@Zpythoncom38.dllpythoncom38.dll/1605328448 0 72 ` L@^_4}?SafeRelease@PyIUnknown@@SAXPAV1@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 83 ` L@^_?~?Save@PyIPersistStream@@SAPAU_object@@PAU2@0@Zpythoncom38.dll pythoncom38.dll/1605328448 0 76 ` L@^_8?Seek@PyIStream@@SAPAU_object@@PAU2@0@Zpythoncom38.dllpythoncom38.dll/1605328448 0 87 ` L@^_C?SetBindOptions@PyIBindCtx@@SAPAU_object@@PAU2@0@Zpythoncom38.dll pythoncom38.dll/1605328448 0 98 ` L@^_N?SetPythonCOMError@PyIConnectionPoint@@SAPAU_object@@PAU2@J@Zpythoncom38.dllpythoncom38.dll/1605328448 0 107 ` L@^_W?SetPythonCOMError@PyIConnectionPointContainer@@SAPAU_object@@PAU2@J@Zpythoncom38.dll pythoncom38.dll/1605328448 0 93 ` L@^_I?SetPythonCOMError@PyIDispatchEx@@SAPAU_object@@PAU2@J@Zpythoncom38.dll pythoncom38.dll/1605328448 0 79 ` L@^_;?SetSize@PyIStream@@SAPAU_object@@PAU2@0@Zpythoncom38.dll pythoncom38.dll/1605328448 0 81 ` L@^_=?Skip@PyIEnumMoniker@@SAPAU_object@@PAU2@0@Zpythoncom38.dll pythoncom38.dll/1605328448 0 81 ` L@^_=?Skip@PyIEnumVARIANT@@SAPAU_object@@PAU2@0@Zpythoncom38.dll pythoncom38.dll/1605328448 0 76 ` L@^_8?Stat@PyIStream@@SAPAU_object@@PAU2@0@Zpythoncom38.dllpythoncom38.dll/1605328448 0 78 ` L@^_:?ThisAsIID@PyGOleWindow@@MAEPAXU_GUID@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 76 ` L@^_8?ThisAsIID@PyGPersist@@MAEPAXU_GUID@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 79 ` L@^_;?ThisAsIID@PyGatewayBase@@UAEPAXU_GUID@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 72 ` L@^_4?Type@PySTGMEDIUM@@2U_typeobject@@Apythoncom38.dllpythoncom38.dll/1605328448 0 89 ` L@^_E?Unadvise@PyIConnectionPoint@@SAPAU_object@@PAU2@0@Zpythoncom38.dll pythoncom38.dll/1605328448 0 84 ` L@^_@?UnlockRegion@PyIStream@@SAPAU_object@@PAU2@0@Zpythoncom38.dllpythoncom38.dll/1605328448 0 80 ` L@^_<?Unwrap@PyGatewayBase@@UAGJPAPAU_object@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 77 ` L@^_9?Write@PyIStream@@SAPAU_object@@PAU2@0@Zpythoncom38.dll pythoncom38.dll/1605328448 0 69 ` L@^_1?cmp@PyIBase@@SAHPAU_object@@0@Zpythoncom38.dll pythoncom38.dll/1605328448 0 73 ` L@^_5?compare@PyIBase@@UAEHPAU_object@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 76 ` L@^_8?compare@PyIUnknown@@UAEHPAU_object@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 72 ` L@^_4?dealloc@PyIBase@@SAXPAU_object@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 80 ` L@^_<?deallocFunc@PySTGMEDIUM@@SAXPAU_object@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 75 ` L@^_7?getattr@PyIBase@@UAEPAU_object@@PAD@Zpythoncom38.dll pythoncom38.dll/1605328448 0 78 ` L@^_:?getattro@PyIBase@@SAPAU_object@@PAU2@0@Zpythoncom38.dllpythoncom38.dll/1605328448 0 82 ` L@^_>?getattro@PySTGMEDIUM@@SAPAU_object@@PAU2@0@Zpythoncom38.dllpythoncom38.dll/1605328448 0 90 ` L@^_F?is_interface_type@PyComTypeObject@@SAHPAU_object@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 83 ` L@^_??is_object@PyIBase@@QAEHPAVPyComTypeObject@@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 94 ` L@^_J?is_object@PyIBase@@SAHPAU_object@@PAVPyComTypeObject@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 93 ` L@^_I?iter@PyComEnumProviderTypeObject@@SAPAU_object@@PAU2@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 85 ` L@^_A?iter@PyComEnumTypeObject@@SAPAU_object@@PAU2@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 69 ` L@^_1?iter@PyIBase@@UAEPAU_object@@XZpythoncom38.dll pythoncom38.dll/1605328448 0 89 ` L@^_E?iternext@PyComEnumTypeObject@@SAPAU_object@@PAU2@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 73 ` L@^_5?iternext@PyIBase@@UAEPAU_object@@XZpythoncom38.dll pythoncom38.dll/1605328448 0 77 ` L@^_9?methods@PySTGMEDIUM@@2PAUPyMethodDef@@Apythoncom38.dll pythoncom38.dll/1605328448 0 73 ` L@^_5?repr@PyIBase@@SAPAU_object@@PAU2@@Zpythoncom38.dll pythoncom38.dll/1605328448 0 69 ` L@^_1?repr@PyIBase@@UAEPAU_object@@XZpythoncom38.dll pythoncom38.dll/1605328448 0 72 ` L@^_4?repr@PyIUnknown@@UAEPAU_object@@XZpythoncom38.dllpythoncom38.dll/1605328448 0 78 ` L@^_:?richcmp@PyIBase@@SAPAU_object@@PAU2@0H@Zpythoncom38.dllpythoncom38.dll/1605328448 0 76 ` L@^_8?setattr@PyIBase@@UAEHPADPAU_object@@@Zpythoncom38.dllpythoncom38.dll/1605328448 0 75 ` L@^_7?setattro@PyIBase@@SAHPAU_object@@00@Zpythoncom38.dll pythoncom38.dll/1605328448 0 78 ` L@^_:?szErrMsgObjectReleased@PyIUnknown@@2PADApythoncom38.dllpythoncom38.dll/1605328448 0 75 ` L@^_7?type@PyIBindCtx@@2VPyComTypeObject@@Apythoncom38.dll pythoncom38.dll/1605328448 0 80 ` L@^_<?type@PyIClassFactory@@2VPyComTypeObject@@Apythoncom38.dllpythoncom38.dll/1605328448 0 83 ` L@^_??type@PyIConnectionPoint@@2VPyComTypeObject@@Apythoncom38.dll pythoncom38.dll/1605328448 0 92 ` L@^_H?type@PyIConnectionPointContainer@@2VPyComTypeObject@@Apythoncom38.dllpythoncom38.dll/1605328448 0 76 ` L@^_8?type@PyIDispatch@@2VPyComTypeObject@@Apythoncom38.dllpythoncom38.dll/1605328448 0 78 ` L@^_:?type@PyIDispatchEx@@2VPyComTypeObject@@Apythoncom38.dllpythoncom38.dll/1605328448 0 83 ` L@^_??type@PyIEnumMoniker@@2VPyComEnumTypeObject@@Apythoncom38.dll pythoncom38.dll/1605328448 0 83 ` L@^_??type@PyIEnumVARIANT@@2VPyComEnumTypeObject@@Apythoncom38.dll pythoncom38.dll/1605328448 0 87 ` L@^_C?type@PyIMoniker@@2VPyComEnumProviderTypeObject@@Apythoncom38.dll pythoncom38.dll/1605328448 0 77 ` L@^_9?type@PyIOleWindow@@2VPyComTypeObject@@Apythoncom38.dll pythoncom38.dll/1605328448 0 75 ` L@^_7?type@PyIPersist@@2VPyComTypeObject@@Apythoncom38.dll pythoncom38.dll/1605328448 0 81 ` L@^_=?type@PyIPersistStream@@2VPyComTypeObject@@Apythoncom38.dll pythoncom38.dll/1605328448 0 85 ` L@^_A?type@PyIPersistStreamInit@@2VPyComTypeObject@@Apythoncom38.dll pythoncom38.dll/1605328448 0 85 ` L@^_A?type@PyIProvideClassInfo2@@2VPyComTypeObject@@Apythoncom38.dll pythoncom38.dll/1605328448 0 84 ` L@^_@?type@PyIProvideClassInfo@@2VPyComTypeObject@@Apythoncom38.dllpythoncom38.dll/1605328448 0 83 ` L@^_??type@PyIServiceProvider@@2VPyComTypeObject@@Apythoncom38.dll pythoncom38.dll/1605328448 0 74 ` L@^_6?type@PyIStream@@2VPyComTypeObject@@Apythoncom38.dllpythoncom38.dll/1605328448 0 76 ` L@^_8?type@PyITypeComp@@2VPyComTypeObject@@Apythoncom38.dllpythoncom38.dll/1605328448 0 76 ` L@^_8?type@PyITypeInfo@@2VPyComTypeObject@@Apythoncom38.dllpythoncom38.dll/1605328448 0 75 ` L@^_7?type@PyITypeLib@@2VPyComTypeObject@@Apythoncom38.dll pythoncom38.dll/1605328448 0 75 ` L@^_7?type@PyIUnknown@@2VPyComTypeObject@@Apythoncom38.dll pythoncom38.dll/1605328448 0 48 ` L@^__DllMain@12pythoncom38.dllpythoncom38.dll/1605328448 0 57 ` L@^_%_DllRegisterServerExpythoncom38.dll pythoncom38.dll/1605328448 0 59 ` L@^_'_DllUnregisterServerExpythoncom38.dll pythoncom38.dll/1605328448 0 54 ` L@^_"_PyInit_pythoncompythoncom38.dllPK {Rwin32com/makegw/UT Zx`Zx`ux PK ѳPHb.iwiwwin32com/makegw/makegwparse.pyUT l_Zx`ux """Utilities for makegw - Parse a header file to build an interface This module contains the core code for parsing a header file describing a COM interface, and building it into an "Interface" structure. Each Interface has methods, and each method has arguments. Each argument knows how to use Py_BuildValue or Py_ParseTuple to exchange itself with Python. See the @win32com.makegw@ module for information in building a COM interface """ import re import traceback class error_not_found(Exception): def __init__(self, msg="The requested item could not be found"): super(error_not_found, self).__init__(msg) class error_not_supported(Exception): def __init__(self, msg="The required functionality is not supported"): super(error_not_supported, self).__init__(msg) VERBOSE=0 DEBUG=0 ## NOTE : For interfaces as params to work correctly, you must ## make sure any PythonCOM extensions which expose the interface are loaded ## before generating. class ArgFormatter: """An instance for a specific type of argument. Knows how to convert itself""" def __init__(self, arg, builtinIndirection, declaredIndirection = 0): #print 'init:', arg.name, builtinIndirection, declaredIndirection, arg.indirectionLevel self.arg = arg self.builtinIndirection = builtinIndirection self.declaredIndirection = declaredIndirection self.gatewayMode = 0 def _IndirectPrefix(self, indirectionFrom, indirectionTo): """Given the indirection level I was declared at (0=Normal, 1=*, 2=**) return a string prefix so I can pass to a function with the required indirection (where the default is the indirection of the method's param. eg, assuming my arg has indirection level of 2, if this function was passed 1 it would return "&", so that a variable declared with indirection of 1 can be prefixed with this to turn it into the indirection level required of 2 """ dif = indirectionFrom - indirectionTo if dif==0: return "" elif dif==-1: return "&" elif dif==1: return "*" else: return "?? (%d)" % (dif,) raise error_not_supported("Can't indirect this far - please fix me :-)") def GetIndirectedArgName(self, indirectFrom, indirectionTo): #print 'get:',self.arg.name, indirectFrom,self._GetDeclaredIndirection() + self.builtinIndirection, indirectionTo, self.arg.indirectionLevel if indirectFrom is None: ### ACK! this does not account for [in][out] variables. ### when this method is called, we need to know which indirectFrom = self._GetDeclaredIndirection() + self.builtinIndirection return self._IndirectPrefix(indirectFrom, indirectionTo) + self.arg.name def GetBuildValueArg(self): "Get the argument to be passes to Py_BuildValue" return self.arg.name def GetParseTupleArg(self): "Get the argument to be passed to PyArg_ParseTuple" if self.gatewayMode: # use whatever they were declared with return self.GetIndirectedArgName(None, 1) # local declarations have just their builtin indirection return self.GetIndirectedArgName(self.builtinIndirection, 1) def GetInterfaceCppObjectInfo(self): """Provide information about the C++ object used. Simple variables (such as integers) can declare their type (eg an integer) and use it as the target of both PyArg_ParseTuple and the COM function itself. More complex types require a PyObject * declared as the target of PyArg_ParseTuple, then some conversion routine to the C++ object which is actually passed to COM. This method provides the name, and optionally the type of that C++ variable. If the type if provided, the caller will likely generate a variable declaration. The name must always be returned. Result is a tuple of (variableName, [DeclareType|None|""]) """ # the first return element is the variable to be passed as # an argument to an interface method. the variable was # declared with only its builtin indirection level. when # we pass it, we'll need to pass in whatever amount of # indirection was applied (plus the builtin amount) # the second return element is the variable declaration; it # should simply be builtin indirection return self.GetIndirectedArgName(self.builtinIndirection, self.arg.indirectionLevel + self.builtinIndirection), \ "%s %s" % (self.GetUnconstType(), self.arg.name) def GetInterfaceArgCleanup(self): "Return cleanup code for C++ args passed to the interface method." if DEBUG: return "/* GetInterfaceArgCleanup output goes here: %s */\n" % self.arg.name else: return "" def GetInterfaceArgCleanupGIL(self): """Return cleanup code for C++ args passed to the interface method that must be executed with the GIL held""" if DEBUG: return "/* GetInterfaceArgCleanup (GIL held) output goes here: %s */\n" % self.arg.name else: return "" def GetUnconstType(self): return self.arg.unc_type def SetGatewayMode(self): self.gatewayMode = 1 def _GetDeclaredIndirection(self): return self.arg.indirectionLevel print('declared:', self.arg.name, self.gatewayMode) if self.gatewayMode: return self.arg.indirectionLevel else: return self.declaredIndirection def DeclareParseArgTupleInputConverter(self): "Declare the variable used as the PyArg_ParseTuple param for a gateway" # Only declare it?? #if self.arg.indirectionLevel==0: # return "\t%s %s;\n" % (self.arg.type, self.arg.name) #else: if DEBUG: return "/* Declare ParseArgTupleInputConverter goes here: %s */\n" % self.arg.name else: return "" def GetParsePostCode(self): "Get a string of C++ code to be executed after (ie, to finalise) the PyArg_ParseTuple conversion" if DEBUG: return "/* GetParsePostCode code goes here: %s */\n" % self.arg.name else: return "" def GetBuildForInterfacePreCode(self): "Get a string of C++ code to be executed before (ie, to initialise) the Py_BuildValue conversion for Interfaces" if DEBUG: return "/* GetBuildForInterfacePreCode goes here: %s */\n" % self.arg.name else: return "" def GetBuildForGatewayPreCode(self): "Get a string of C++ code to be executed before (ie, to initialise) the Py_BuildValue conversion for Gateways" s = self.GetBuildForInterfacePreCode() # Usually the same if DEBUG: if s[:4] == "/* G": s = "/* GetBuildForGatewayPreCode goes here: %s */\n" % self.arg.name return s def GetBuildForInterfacePostCode(self): "Get a string of C++ code to be executed after (ie, to finalise) the Py_BuildValue conversion for Interfaces" if DEBUG: return "/* GetBuildForInterfacePostCode goes here: %s */\n" % self.arg.name return "" def GetBuildForGatewayPostCode(self): "Get a string of C++ code to be executed after (ie, to finalise) the Py_BuildValue conversion for Gateways" s = self.GetBuildForInterfacePostCode() # Usually the same if DEBUG: if s[:4] == "/* G": s = "/* GetBuildForGatewayPostCode goes here: %s */\n" % self.arg.name return s def GetAutoduckString(self): return '// @pyparm %s|%s||Description for %s' % (self._GetPythonTypeDesc(), self.arg.name, self.arg.name) def _GetPythonTypeDesc(self): "Returns a string with the description of the type. Used for doco purposes" return None def NeedUSES_CONVERSION(self): "Determines if this arg forces a USES_CONVERSION macro" return 0 # Special formatter for floats since they're smaller than Python floats. class ArgFormatterFloat(ArgFormatter): def GetFormatChar(self): return "f" def DeclareParseArgTupleInputConverter(self): # Declare a double variable return "\tdouble dbl%s;\n" % self.arg.name def GetParseTupleArg(self): return "&dbl" + self.arg.name def _GetPythonTypeDesc(self): return "float" def GetBuildValueArg(self): return "&dbl" + self.arg.name def GetBuildForInterfacePreCode(self): return "\tdbl" + self.arg.name + " = " + self.arg.name + ";\n" def GetBuildForGatewayPreCode(self): return "\tdbl%s = " % self.arg.name + self._IndirectPrefix( \ self._GetDeclaredIndirection(), 0) + self.arg.name + ";\n" def GetParsePostCode(self): s = "\t" if self.gatewayMode: s = s + self._IndirectPrefix( self._GetDeclaredIndirection(), 0) s = s + self.arg.name s = s + " = (float)dbl%s;\n" % self.arg.name return s # Special formatter for Shorts because they're # a different size than Python ints! class ArgFormatterShort(ArgFormatter): def GetFormatChar(self): return "i" def DeclareParseArgTupleInputConverter(self): # Declare a double variable return "\tINT i%s;\n" % self.arg.name def GetParseTupleArg(self): return "&i" + self.arg.name def _GetPythonTypeDesc(self): return "int" def GetBuildValueArg(self): return "&i" + self.arg.name def GetBuildForInterfacePreCode(self): return "\ti" + self.arg.name + " = " + self.arg.name + ";\n" def GetBuildForGatewayPreCode(self): return "\ti%s = " % self.arg.name + self._IndirectPrefix( \ self._GetDeclaredIndirection(), 0) + self.arg.name + ";\n" def GetParsePostCode(self): s = "\t" if self.gatewayMode: s = s + self._IndirectPrefix( self._GetDeclaredIndirection(), 0) s = s + self.arg.name s = s + " = i%s;\n" % self.arg.name return s # for types which are 64bits on AMD64 - eg, HWND class ArgFormatterLONG_PTR(ArgFormatter): def GetFormatChar(self): return "O" def DeclareParseArgTupleInputConverter(self): # Declare a PyObject variable return "\tPyObject *ob%s;\n" % self.arg.name def GetParseTupleArg(self): return "&ob"+self.arg.name def _GetPythonTypeDesc(self): return "int/long" def GetBuildValueArg(self): return "ob" + self.arg.name def GetBuildForInterfacePostCode(self): return "\tPy_XDECREF(ob%s);\n" % self.arg.name def DeclareParseArgTupleInputConverter(self): # Declare a PyObject variable return "\tPyObject *ob%s;\n" % self.arg.name def GetParsePostCode(self): return "\tif (bPythonIsHappy && !PyWinLong_AsULONG_PTR(ob%s, (ULONG_PTR *)%s)) bPythonIsHappy = FALSE;\n" % (self.arg.name, self.GetIndirectedArgName(None, 2)) def GetBuildForInterfacePreCode(self): notdirected = self.GetIndirectedArgName(None, 1) return "\tob%s = PyWinObject_FromULONG_PTR(%s);\n" % \ (self.arg.name, notdirected) def GetBuildForGatewayPostCode(self): return "\tPy_XDECREF(ob%s);\n" % self.arg.name class ArgFormatterPythonCOM(ArgFormatter): """An arg formatter for types exposed in the PythonCOM module""" def GetFormatChar(self): return "O" #def GetInterfaceCppObjectInfo(self): # return ArgFormatter.GetInterfaceCppObjectInfo(self)[0], \ # "%s %s%s" % (self.arg.unc_type, "*" * self._GetDeclaredIndirection(), self.arg.name) def DeclareParseArgTupleInputConverter(self): # Declare a PyObject variable return "\tPyObject *ob%s;\n" % self.arg.name def GetParseTupleArg(self): return "&ob"+self.arg.name def _GetPythonTypeDesc(self): return "" % self.arg.type def GetBuildValueArg(self): return "ob" + self.arg.name def GetBuildForInterfacePostCode(self): return "\tPy_XDECREF(ob%s);\n" % self.arg.name def DeclareParseArgTupleInputConverter(self): # Declare a PyObject variable return "\tPyObject *ob%s;\n" % self.arg.name class ArgFormatterBSTR(ArgFormatterPythonCOM): def _GetPythonTypeDesc(self): return "" def GetParsePostCode(self): return "\tif (bPythonIsHappy && !PyWinObject_AsBstr(ob%s, %s)) bPythonIsHappy = FALSE;\n" % (self.arg.name, self.GetIndirectedArgName(None, 2)) def GetBuildForInterfacePreCode(self): notdirected = self.GetIndirectedArgName(None, 1) return "\tob%s = MakeBstrToObj(%s);\n" % \ (self.arg.name, notdirected) def GetBuildForInterfacePostCode(self): return "\tSysFreeString(%s);\n" % (self.arg.name,) + \ ArgFormatterPythonCOM.GetBuildForInterfacePostCode(self) def GetBuildForGatewayPostCode(self): return "\tPy_XDECREF(ob%s);\n" % self.arg.name class ArgFormatterOLECHAR(ArgFormatterPythonCOM): def _GetPythonTypeDesc(self): return "" def GetUnconstType(self): if self.arg.type[:3]=="LPC": return self.arg.type[:2] + self.arg.type[3:] else: return self.arg.unc_type def GetParsePostCode(self): return "\tif (bPythonIsHappy && !PyWinObject_AsBstr(ob%s, %s)) bPythonIsHappy = FALSE;\n" % (self.arg.name, self.GetIndirectedArgName(None, 2)) def GetInterfaceArgCleanup(self): return "\tSysFreeString(%s);\n" % self.GetIndirectedArgName(None, 1) def GetBuildForInterfacePreCode(self): # the variable was declared with just its builtin indirection notdirected = self.GetIndirectedArgName(self.builtinIndirection, 1) return "\tob%s = MakeOLECHARToObj(%s);\n" % \ (self.arg.name, notdirected) def GetBuildForInterfacePostCode(self): # memory returned into an OLECHAR should be freed return "\tCoTaskMemFree(%s);\n" % (self.arg.name,) + \ ArgFormatterPythonCOM.GetBuildForInterfacePostCode(self) def GetBuildForGatewayPostCode(self): return "\tPy_XDECREF(ob%s);\n" % self.arg.name class ArgFormatterTCHAR(ArgFormatterPythonCOM): def _GetPythonTypeDesc(self): return "string/" def GetUnconstType(self): if self.arg.type[:3]=="LPC": return self.arg.type[:2] + self.arg.type[3:] else: return self.arg.unc_type def GetParsePostCode(self): return "\tif (bPythonIsHappy && !PyWinObject_AsTCHAR(ob%s, %s)) bPythonIsHappy = FALSE;\n" % (self.arg.name, self.GetIndirectedArgName(None, 2)) def GetInterfaceArgCleanup(self): return "\tPyWinObject_FreeTCHAR(%s);\n" % self.GetIndirectedArgName(None, 1) def GetBuildForInterfacePreCode(self): # the variable was declared with just its builtin indirection notdirected = self.GetIndirectedArgName(self.builtinIndirection, 1) return "\tob%s = PyWinObject_FromTCHAR(%s);\n" % \ (self.arg.name, notdirected) def GetBuildForInterfacePostCode(self): return "// ??? - TCHAR post code\n" def GetBuildForGatewayPostCode(self): return "\tPy_XDECREF(ob%s);\n" % self.arg.name class ArgFormatterIID(ArgFormatterPythonCOM): def _GetPythonTypeDesc(self): return "" def GetParsePostCode(self): return "\tif (!PyWinObject_AsIID(ob%s, &%s)) bPythonIsHappy = FALSE;\n" % (self.arg.name, self.arg.name) def GetBuildForInterfacePreCode(self): # notdirected = self.GetIndirectedArgName(self.arg.indirectionLevel, 0) notdirected = self.GetIndirectedArgName(None, 0) return "\tob%s = PyWinObject_FromIID(%s);\n" % (self.arg.name, notdirected) def GetInterfaceCppObjectInfo(self): return self.arg.name, "IID %s" % (self.arg.name) class ArgFormatterTime(ArgFormatterPythonCOM): def __init__(self, arg, builtinIndirection, declaredIndirection = 0): # we don't want to declare LPSYSTEMTIME / LPFILETIME objects if arg.indirectionLevel == 0 and arg.unc_type[:2] == "LP": arg.unc_type = arg.unc_type[2:] # reduce the builtin and increment the declaration arg.indirectionLevel = arg.indirectionLevel + 1 builtinIndirection = 0 ArgFormatterPythonCOM.__init__(self, arg, builtinIndirection, declaredIndirection) def _GetPythonTypeDesc(self): return "" def GetParsePostCode(self): # variable was declared with only the builtinIndirection ### NOTE: this is an [in] ... so use only builtin return '\tif (!PyTime_Check(ob%s)) {\n\t\tPyErr_SetString(PyExc_TypeError, "The argument must be a PyTime object");\n\t\tbPythonIsHappy = FALSE;\n\t}\n\tif (!((PyTime *)ob%s)->GetTime(%s)) bPythonIsHappy = FALSE;\n' % (self.arg.name, self.arg.name, self.GetIndirectedArgName(self.builtinIndirection, 1)) def GetBuildForInterfacePreCode(self): ### use just the builtinIndirection again... notdirected = self.GetIndirectedArgName(self.builtinIndirection,0) return "\tob%s = new PyTime(%s);\n" % (self.arg.name, notdirected) def GetBuildForInterfacePostCode(self): ### hack to determine if we need to free stuff ret = '' if self.builtinIndirection + self.arg.indirectionLevel > 1: # memory returned into an OLECHAR should be freed ret = "\tCoTaskMemFree(%s);\n" % self.arg.name return ret + ArgFormatterPythonCOM.GetBuildForInterfacePostCode(self) class ArgFormatterSTATSTG(ArgFormatterPythonCOM): def _GetPythonTypeDesc(self): return "" def GetParsePostCode(self): return '\tif (!PyCom_PyObjectAsSTATSTG(ob%s, %s, 0/*flags*/)) bPythonIsHappy = FALSE;\n' % (self.arg.name, self.GetIndirectedArgName(None, 1)) def GetBuildForInterfacePreCode(self): notdirected = self.GetIndirectedArgName(None, 1) return "\tob%s = PyCom_PyObjectFromSTATSTG(%s);\n\t// STATSTG doco says our responsibility to free\n\tif ((%s).pwcsName) CoTaskMemFree((%s).pwcsName);\n" % (self.arg.name, self.GetIndirectedArgName(None, 1),notdirected,notdirected) class ArgFormatterGeneric(ArgFormatterPythonCOM): def _GetPythonTypeDesc(self): return "" % self.arg.type def GetParsePostCode(self): return '\tif (!PyObject_As%s(ob%s, &%s) bPythonIsHappy = FALSE;\n' % (self.arg.type, self.arg.name, self.GetIndirectedArgName(None, 1)) def GetInterfaceArgCleanup(self): return '\tPyObject_Free%s(%s);\n' % (self.arg.type, self.arg.name) def GetBuildForInterfacePreCode(self): notdirected = self.GetIndirectedArgName(None, 1) return "\tob%s = PyObject_From%s(%s);\n" % (self.arg.name, self.arg.type, self.GetIndirectedArgName(None, 1)) class ArgFormatterIDLIST(ArgFormatterPythonCOM): def _GetPythonTypeDesc(self): return "" def GetParsePostCode(self): return '\tif (bPythonIsHappy && !PyObject_AsPIDL(ob%s, &%s)) bPythonIsHappy = FALSE;\n' % (self.arg.name, self.GetIndirectedArgName(None, 1)) def GetInterfaceArgCleanup(self): return '\tPyObject_FreePIDL(%s);\n' % (self.arg.name,) def GetBuildForInterfacePreCode(self): notdirected = self.GetIndirectedArgName(None, 1) return "\tob%s = PyObject_FromPIDL(%s);\n" % (self.arg.name, self.GetIndirectedArgName(None, 1)) class ArgFormatterHANDLE(ArgFormatterPythonCOM): def _GetPythonTypeDesc(self): return "" def GetParsePostCode(self): return '\tif (!PyWinObject_AsHANDLE(ob%s, &%s, FALSE) bPythonIsHappy = FALSE;\n' % (self.arg.name, self.GetIndirectedArgName(None, 1)) def GetBuildForInterfacePreCode(self): notdirected = self.GetIndirectedArgName(None, 1) return "\tob%s = PyWinObject_FromHANDLE(%s);\n" % (self.arg.name, self.GetIndirectedArgName(None, 0)) class ArgFormatterLARGE_INTEGER(ArgFormatterPythonCOM): def GetKeyName(self): return "LARGE_INTEGER" def _GetPythonTypeDesc(self): return "" % self.GetKeyName() def GetParsePostCode(self): return '\tif (!PyWinObject_As%s(ob%s, %s)) bPythonIsHappy = FALSE;\n' % (self.GetKeyName(), self.arg.name, self.GetIndirectedArgName(None, 1)) def GetBuildForInterfacePreCode(self): notdirected = self.GetIndirectedArgName(None, 0) return "\tob%s = PyWinObject_From%s(%s);\n" % (self.arg.name, self.GetKeyName(), notdirected) class ArgFormatterULARGE_INTEGER(ArgFormatterLARGE_INTEGER): def GetKeyName(self): return "ULARGE_INTEGER" class ArgFormatterInterface(ArgFormatterPythonCOM): def GetInterfaceCppObjectInfo(self): return self.GetIndirectedArgName(1, self.arg.indirectionLevel), \ "%s * %s" % (self.GetUnconstType(), self.arg.name) def GetParsePostCode(self): # This gets called for out params in gateway mode if self.gatewayMode: sArg = self.GetIndirectedArgName(None, 2) else: # vs. in params for interface mode. sArg = self.GetIndirectedArgName(1, 2) return "\tif (bPythonIsHappy && !PyCom_InterfaceFromPyInstanceOrObject(ob%s, IID_%s, (void **)%s, TRUE /* bNoneOK */))\n\t\t bPythonIsHappy = FALSE;\n" % (self.arg.name, self.arg.type, sArg) def GetBuildForInterfacePreCode(self): return "\tob%s = PyCom_PyObjectFromIUnknown(%s, IID_%s, FALSE);\n" % (self.arg.name, self.arg.name, self.arg.type) def GetBuildForGatewayPreCode(self): sPrefix = self._IndirectPrefix(self._GetDeclaredIndirection(), 1) return "\tob%s = PyCom_PyObjectFromIUnknown(%s%s, IID_%s, TRUE);\n" % (self.arg.name, sPrefix, self.arg.name, self.arg.type) def GetInterfaceArgCleanup(self): return "\tif (%s) %s->Release();\n" % (self.arg.name, self.arg.name) class ArgFormatterVARIANT(ArgFormatterPythonCOM): def GetParsePostCode(self): return "\tif ( !PyCom_VariantFromPyObject(ob%s, %s) )\n\t\tbPythonIsHappy = FALSE;\n" % (self.arg.name, self.GetIndirectedArgName(None, 1)) def GetBuildForGatewayPreCode(self): notdirected = self.GetIndirectedArgName(None, 1) return "\tob%s = PyCom_PyObjectFromVariant(%s);\n" % (self.arg.name, notdirected) def GetBuildForGatewayPostCode(self): return "\tPy_XDECREF(ob%s);\n" % self.arg.name # Key : , Python Type Description, ParseTuple format char ConvertSimpleTypes = {"BOOL":("BOOL", "int", "i"), "UINT":("UINT", "int", "i"), "BYTE": ("BYTE", "int", "i"), "INT": ("INT", "int", "i"), "DWORD": ("DWORD", "int", "l"), "HRESULT":("HRESULT", "int", "l"), "ULONG": ("ULONG", "int", "l"), "LONG": ("LONG", "int", "l"), "int": ("int", "int", "i"), "long": ("long", "int", "l"), "DISPID": ("DISPID", "long", "l"), "APPBREAKFLAGS": ("int", "int", "i"), "BREAKRESUMEACTION": ("int", "int", "i"), "ERRORRESUMEACTION": ("int", "int", "i"), "BREAKREASON": ("int", "int", "i"), "BREAKPOINT_STATE": ("int", "int", "i"), "BREAKRESUME_ACTION": ("int", "int", "i"), "SOURCE_TEXT_ATTR": ("int", "int", "i"), "TEXT_DOC_ATTR": ("int", "int", "i"), "QUERYOPTION": ("int", "int", "i"), "PARSEACTION": ("int", "int", "i"), } class ArgFormatterSimple(ArgFormatter): """An arg formatter for simple integer etc types""" def GetFormatChar(self): return ConvertSimpleTypes[self.arg.type][2] def _GetPythonTypeDesc(self): return ConvertSimpleTypes[self.arg.type][1] AllConverters = {"const OLECHAR": (ArgFormatterOLECHAR, 0, 1), "WCHAR": (ArgFormatterOLECHAR, 0, 1), "OLECHAR": (ArgFormatterOLECHAR, 0, 1), "LPCOLESTR": (ArgFormatterOLECHAR, 1, 1), "LPOLESTR": (ArgFormatterOLECHAR, 1, 1), "LPCWSTR": (ArgFormatterOLECHAR, 1, 1), "LPWSTR": (ArgFormatterOLECHAR, 1, 1), "LPCSTR": (ArgFormatterOLECHAR, 1, 1), "LPTSTR": (ArgFormatterTCHAR, 1, 1), "LPCTSTR": (ArgFormatterTCHAR, 1, 1), "HANDLE": (ArgFormatterHANDLE, 0), "BSTR": (ArgFormatterBSTR, 1, 0), "const IID": (ArgFormatterIID, 0), "CLSID": (ArgFormatterIID, 0), "IID": (ArgFormatterIID, 0), "GUID": (ArgFormatterIID, 0), "const GUID": (ArgFormatterIID, 0), "const IID": (ArgFormatterIID, 0), "REFCLSID": (ArgFormatterIID, 0), "REFIID": (ArgFormatterIID, 0), "REFGUID": (ArgFormatterIID, 0), "const FILETIME": (ArgFormatterTime, 0), "const SYSTEMTIME":(ArgFormatterTime, 0), "const LPSYSTEMTIME":(ArgFormatterTime, 1, 1), "LPSYSTEMTIME": (ArgFormatterTime, 1, 1), "FILETIME": (ArgFormatterTime, 0), "SYSTEMTIME": (ArgFormatterTime, 0), "STATSTG": (ArgFormatterSTATSTG, 0), "LARGE_INTEGER": (ArgFormatterLARGE_INTEGER, 0), "ULARGE_INTEGER": (ArgFormatterULARGE_INTEGER, 0), "VARIANT": (ArgFormatterVARIANT, 0), "float": (ArgFormatterFloat, 0), "single": (ArgFormatterFloat, 0), "short": (ArgFormatterShort, 0), "WORD": (ArgFormatterShort, 0), "VARIANT_BOOL": (ArgFormatterShort, 0), "HWND": (ArgFormatterLONG_PTR, 1), "HMENU": (ArgFormatterLONG_PTR, 1), "HOLEMENU": (ArgFormatterLONG_PTR, 1), "HICON": (ArgFormatterLONG_PTR, 1), "HDC": (ArgFormatterLONG_PTR, 1), "LPARAM": (ArgFormatterLONG_PTR, 1), "WPARAM": (ArgFormatterLONG_PTR, 1), "LRESULT": (ArgFormatterLONG_PTR, 1), "UINT": (ArgFormatterShort, 0), "SVSIF": (ArgFormatterShort, 0), "Control": (ArgFormatterInterface, 0, 1), "DataObject": (ArgFormatterInterface, 0, 1), "_PropertyBag": (ArgFormatterInterface, 0, 1), "AsyncProp": (ArgFormatterInterface, 0, 1), "DataSource": (ArgFormatterInterface, 0, 1), "DataFormat": (ArgFormatterInterface, 0, 1), "void **": (ArgFormatterInterface, 2, 2), "ITEMIDLIST": (ArgFormatterIDLIST, 0, 0), "LPITEMIDLIST": (ArgFormatterIDLIST, 0, 1), "LPCITEMIDLIST": (ArgFormatterIDLIST, 0, 1), "const ITEMIDLIST": (ArgFormatterIDLIST, 0, 1), } # Auto-add all the simple types for key in ConvertSimpleTypes.keys(): AllConverters[key] = ArgFormatterSimple, 0 def make_arg_converter(arg): try: clz = AllConverters[arg.type][0] bin = AllConverters[arg.type][1] decl = 0 if len(AllConverters[arg.type])>2: decl = AllConverters[arg.type][2] return clz(arg,bin, decl) except KeyError: if arg.type[0]=="I": return ArgFormatterInterface(arg, 0, 1) raise error_not_supported("The type '%s' (%s) is unknown." % (arg.type, arg.name)) ############################################################# # # The instances that represent the args, methods and interface class Argument: """A representation of an argument to a COM method This class contains information about a specific argument to a method. In addition, methods exist so that an argument knows how to convert itself to/from Python arguments. """ # in,out type name [ ] # -------------- -------- ------------ ------ regex = re.compile(r'/\* \[([^\]]*.*?)] \*/[ \t](.*[* ]+)(\w+)(\[ *])?[\),]') def __init__(self, good_interface_names): self.good_interface_names = good_interface_names self.inout = self.name = self.type = None self.const = 0 self.arrayDecl = 0 def BuildFromFile(self, file): """Parse and build my data from a file Reads the next line in the file, and matches it as an argument description. If not a valid argument line, an error_not_found exception is raised. """ line = file.readline() mo = self.regex.search(line) if not mo: raise error_not_found self.name = mo.group(3) self.inout = mo.group(1).split('][') typ = mo.group(2).strip() self.raw_type = typ self.indirectionLevel = 0 if mo.group(4): # Has "[ ]" decl self.arrayDecl = 1 try: pos = typ.rindex("__RPC_FAR") self.indirectionLevel = self.indirectionLevel + 1 typ = typ[:pos].strip() except ValueError: pass typ = typ.replace("__RPC_FAR", "") while 1: try: pos = typ.rindex("*") self.indirectionLevel = self.indirectionLevel + 1 typ = typ[:pos].strip() except ValueError: break self.type = typ if self.type[:6]=="const ": self.unc_type = self.type[6:] else: self.unc_type = self.type if VERBOSE: print(" Arg %s of type %s%s (%s)" % (self.name, self.type, "*" * self.indirectionLevel, self.inout)) def HasAttribute(self, typ): """Determines if the argument has the specific attribute. Argument attributes are specified in the header file, such as "[in][out][retval]" etc. You can pass a specific string (eg "out") to find if this attribute was specified for the argument """ return typ in self.inout def GetRawDeclaration(self): ret = "%s %s" % (self.raw_type, self.name) if self.arrayDecl: ret = ret + "[]" return ret class Method: """A representation of a C++ method on a COM interface This class contains information about a specific method, as well as a list of all @Argument@s """ # options ret type callconv name # ----------------- -------- -------- -------- regex = re.compile(r'virtual (/\*.*?\*/ )?(.*?) (.*?) (.*?)\(\w?') def __init__(self, good_interface_names): self.good_interface_names = good_interface_names self.name = self.result = self.callconv = None self.args = [] def BuildFromFile(self, file): """Parse and build my data from a file Reads the next line in the file, and matches it as a method description. If not a valid method line, an error_not_found exception is raised. """ line = file.readline() mo = self.regex.search(line) if not mo: raise error_not_found self.name = mo.group(4) self.result = mo.group(2) if self.result != "HRESULT": if self.result=="DWORD": # DWORD is for old old stuff? print("Warning: Old style interface detected - compilation errors likely!") else: print("Method %s - Only HRESULT return types are supported." % self.name) # raise error_not_supported, if VERBOSE: print(" Method %s %s(" % (self.result, self.name)) while 1: arg = Argument(self.good_interface_names) try: arg.BuildFromFile(file) self.args.append(arg) except error_not_found: break class Interface: """A representation of a C++ COM Interface This class contains information about a specific interface, as well as a list of all @Method@s """ # name base # -------- -------- regex = re.compile("(interface|) ([^ ]*) : public (.*)$") def __init__(self, mo): self.methods = [] self.name = mo.group(2) self.base = mo.group(3) if VERBOSE: print("Interface %s : public %s" % (self.name, self.base)) def BuildMethods(self, file): """Build all sub-methods for this interface""" # skip the next 2 lines. file.readline();file.readline(); while 1: try: method = Method([self.name]) method.BuildFromFile(file) self.methods.append(method) except error_not_found: break def find_interface(interfaceName, file): """Find and return an interface in a file Given an interface name and file, search for the specified interface. Upon return, the interface itself has been built, but not the methods. """ interface = None line = file.readline() while line: mo = Interface.regex.search(line) if mo: name = mo.group(2) print(name) AllConverters[name] = (ArgFormatterInterface, 0, 1) if name==interfaceName: interface = Interface(mo) interface.BuildMethods(file) line = file.readline() if interface: return interface raise error_not_found def parse_interface_info(interfaceName, file): """Find, parse and return an interface in a file Given an interface name and file, search for the specified interface. Upon return, the interface itself is fully built, """ try: return find_interface(interfaceName, file) except re.error: traceback.print_exc() print("The interface could not be built, as the regular expression failed!") def test(): f=open("d:\\msdev\\include\\objidl.h") try: parse_interface_info("IPersistStream", f) finally: f.close() def test_regex(r,text): res=r.search(text,0) if res==-1: print("** Not found") else: print("%d\n%s\n%s\n%s\n%s" % (res, r.group(1), r.group(2), r.group(3), r.group(4))) PK Y03K%"~win32com/makegw/__init__.pyUT  YZx`ux # indicates a python package. PK ѳP*qrBrBwin32com/makegw/makegw.pyUT l_Zx`ux """Utility functions for writing out gateway C++ files This module will generate a C++/Python binding for a specific COM interface. At this stage, no command line interface exists. You must start Python, import this module, change to the directory where the generated code should be written, and run the public function. This module is capable of generating both 'Interfaces' (ie, Python client side support for the interface) and 'Gateways' (ie, Python server side support for the interface). Many COM interfaces are useful both as Client and Server. Other interfaces, however, really only make sense to implement one side or the other. For example, it would be pointless for Python to implement Server side for 'IRunningObjectTable', unless we were implementing core COM for an operating system in Python (hey - now there's an idea!) Most COM interface code is totally boiler-plate - it consists of converting arguments, dispatching the call to Python, and processing any result values. This module automates the generation of such code. It has the ability to parse a .H file generated by the MIDL tool (ie, almost all COM .h files) and build almost totally complete C++ code. The module understands some of the well known data types, and how to convert them. There are only a couple of places where hand-editing is necessary, as detailed below: unsupported types -- If a type is not known, the generator will pretty much ignore it, but write a comment to the generated code. You may want to add custom support for this type. In some cases, C++ compile errors will result. These are intentional - generating code to remove these errors would imply a false sense of security that the generator has done the right thing. other return policies -- By default, Python never sees the return SCODE from a COM function. The interface usually returns None if OK, else a COM exception if "FAILED(scode)" is TRUE. You may need to change this if: * EXCEPINFO is passed to the COM function. This is not detected and handled * For some reason Python should always see the result SCODE, even if it did fail or succeed. For example, some functions return a BOOLEAN result in the SCODE, meaning Python should always see it. * FAILED(scode) for the interface still has valid data to return (by default, the code generated does not process the return values, and raise an exception to Python/COM """ import re from . import makegwparse def make_framework_support(header_file_name, interface_name, bMakeInterface = 1, bMakeGateway = 1): """Generate C++ code for a Python Interface and Gateway header_file_name -- The full path to the .H file which defines the interface. interface_name -- The name of the interface to search for, and to generate. bMakeInterface = 1 -- Should interface (ie, client) support be generated. bMakeGatewayInterface = 1 -- Should gateway (ie, server) support be generated. This method will write a .cpp and .h file into the current directory, (using the name of the interface to build the file name. """ fin=open(header_file_name) try: interface = makegwparse.parse_interface_info(interface_name, fin) finally: fin.close() if bMakeInterface and bMakeGateway: desc = "Interface and Gateway" elif bMakeInterface and not bMakeGateway: desc = "Interface" else: desc = "Gateway" if interface.name[:5]=="IEnum": # IEnum - use my really simple template-based one import win32com.makegw.makegwenum ifc_cpp_writer = win32com.makegw.makegwenum._write_enumifc_cpp gw_cpp_writer = win32com.makegw.makegwenum._write_enumgw_cpp else: # Use my harder working ones. ifc_cpp_writer = _write_ifc_cpp gw_cpp_writer = _write_gw_cpp fout=open("Py%s.cpp" % interface.name, "w") try: fout.write(\ '''\ // This file implements the %s %s for Python. // Generated by makegw.py #include "shell_pch.h" ''' % (interface.name, desc)) # if bMakeGateway: # fout.write('#include "PythonCOMServer.h"\n') # if interface.base not in ["IUnknown", "IDispatch"]: # fout.write('#include "Py%s.h"\n' % interface.base) fout.write('#include "Py%s.h"\n\n// @doc - This file contains autoduck documentation\n' % interface.name) if bMakeInterface: ifc_cpp_writer(fout, interface) if bMakeGateway: gw_cpp_writer(fout, interface) finally: fout.close() fout=open("Py%s.h" % interface.name, "w") try: fout.write(\ '''\ // This file declares the %s %s for Python. // Generated by makegw.py ''' % (interface.name, desc)) if bMakeInterface: _write_ifc_h(fout, interface) if bMakeGateway: _write_gw_h(fout, interface) finally: fout.close() ########################################################################### # # INTERNAL FUNCTIONS # # def _write_ifc_h(f, interface): f.write(\ '''\ // --------------------------------------------------- // // Interface Declaration class Py%s : public Py%s { public: MAKE_PYCOM_CTOR(Py%s); static %s *GetI(PyObject *self); static PyComTypeObject type; // The Python methods ''' % (interface.name, interface.base, interface.name, interface.name)) for method in interface.methods: f.write('\tstatic PyObject *%s(PyObject *self, PyObject *args);\n' % method.name) f.write(\ '''\ protected: Py%s(IUnknown *pdisp); ~Py%s(); }; ''' % (interface.name, interface.name)) def _write_ifc_cpp(f, interface): name = interface.name f.write(\ '''\ // --------------------------------------------------- // // Interface Implementation Py%(name)s::Py%(name)s(IUnknown *pdisp): Py%(base)s(pdisp) { ob_type = &type; } Py%(name)s::~Py%(name)s() { } /* static */ %(name)s *Py%(name)s::GetI(PyObject *self) { return (%(name)s *)Py%(base)s::GetI(self); } ''' % (interface.__dict__)) ptr = re.sub('[a-z]', '', interface.name) strdict = {'interfacename':interface.name, 'ptr': ptr} for method in interface.methods: strdict['method'] = method.name f.write(\ '''\ // @pymethod |Py%(interfacename)s|%(method)s|Description of %(method)s. PyObject *Py%(interfacename)s::%(method)s(PyObject *self, PyObject *args) { %(interfacename)s *p%(ptr)s = GetI(self); if ( p%(ptr)s == NULL ) return NULL; ''' % strdict) argsParseTuple = argsCOM = formatChars = codePost = \ codePobjects = codeCobjects = cleanup = cleanup_gil = "" needConversion = 0 # if method.name=="Stat": import win32dbg;win32dbg.brk() for arg in method.args: try: argCvt = makegwparse.make_arg_converter(arg) if arg.HasAttribute("in"): val = argCvt.GetFormatChar() if val: f.write ('\t' + argCvt.GetAutoduckString() + "\n") formatChars = formatChars + val argsParseTuple = argsParseTuple + ", " + argCvt.GetParseTupleArg() codePobjects = codePobjects + argCvt.DeclareParseArgTupleInputConverter() codePost = codePost + argCvt.GetParsePostCode() needConversion = needConversion or argCvt.NeedUSES_CONVERSION() cleanup = cleanup + argCvt.GetInterfaceArgCleanup() cleanup_gil = cleanup_gil + argCvt.GetInterfaceArgCleanupGIL() comArgName, comArgDeclString = argCvt.GetInterfaceCppObjectInfo() if comArgDeclString: # If we should declare a variable codeCobjects = codeCobjects + "\t%s;\n" % (comArgDeclString) argsCOM = argsCOM + ", " + comArgName except makegwparse.error_not_supported as why: f.write('// *** The input argument %s of type "%s" was not processed ***\n// Please check the conversion function is appropriate and exists!\n' % (arg.name, arg.raw_type)) f.write('\t%s %s;\n\tPyObject *ob%s;\n' % (arg.type, arg.name, arg.name)) f.write('\t// @pyparm |%s||Description for %s\n' % (arg.type, arg.name, arg.name)) codePost = codePost + '\tif (bPythonIsHappy && !PyObject_As%s( ob%s, &%s )) bPythonIsHappy = FALSE;\n' % (arg.type, arg.name, arg.name) formatChars = formatChars + "O" argsParseTuple = argsParseTuple + ", &ob%s" % (arg.name) argsCOM = argsCOM + ", " + arg.name cleanup = cleanup + "\tPyObject_Free%s(%s);\n" % (arg.type, arg.name) if needConversion: f.write("\tUSES_CONVERSION;\n") f.write(codePobjects); f.write(codeCobjects); f.write('\tif ( !PyArg_ParseTuple(args, "%s:%s"%s) )\n\t\treturn NULL;\n' % (formatChars, method.name, argsParseTuple)) if codePost: f.write('\tBOOL bPythonIsHappy = TRUE;\n') f.write(codePost); f.write('\tif (!bPythonIsHappy) return NULL;\n') strdict['argsCOM'] = argsCOM[1:] strdict['cleanup'] = cleanup strdict['cleanup_gil'] = cleanup_gil f.write(\ ''' HRESULT hr; PY_INTERFACE_PRECALL; hr = p%(ptr)s->%(method)s(%(argsCOM)s ); %(cleanup)s PY_INTERFACE_POSTCALL; %(cleanup_gil)s if ( FAILED(hr) ) return PyCom_BuildPyException(hr, p%(ptr)s, IID_%(interfacename)s ); ''' % strdict) codePre = codePost = formatChars = codeVarsPass = codeDecl = "" for arg in method.args: if not arg.HasAttribute("out"): continue try: argCvt = makegwparse.make_arg_converter(arg) formatChar = argCvt.GetFormatChar() if formatChar: formatChars = formatChars + formatChar codePre = codePre + argCvt.GetBuildForInterfacePreCode() codePost = codePost + argCvt.GetBuildForInterfacePostCode() codeVarsPass = codeVarsPass + ", " + argCvt.GetBuildValueArg() codeDecl = codeDecl + argCvt.DeclareParseArgTupleInputConverter() except makegwparse.error_not_supported as why: f.write('// *** The output argument %s of type "%s" was not processed ***\n// %s\n' % (arg.name, arg.raw_type, why)) continue if formatChars: f.write('%s\n%s\tPyObject *pyretval = Py_BuildValue("%s"%s);\n%s\treturn pyretval;' % (codeDecl, codePre, formatChars, codeVarsPass, codePost)) else: f.write('\tPy_INCREF(Py_None);\n\treturn Py_None;\n') f.write('\n}\n\n') f.write ('// @object Py%s|Description of the interface\n' % (name)) f.write('static struct PyMethodDef Py%s_methods[] =\n{\n' % name) for method in interface.methods: f.write('\t{ "%s", Py%s::%s, 1 }, // @pymeth %s|Description of %s\n' % (method.name, interface.name, method.name, method.name, method.name)) interfacebase = interface.base f.write('''\ { NULL } }; PyComTypeObject Py%(name)s::type("Py%(name)s", &Py%(interfacebase)s::type, sizeof(Py%(name)s), Py%(name)s_methods, GET_PYCOM_CTOR(Py%(name)s)); ''' % locals()) def _write_gw_h(f, interface): if interface.name[0] == "I": gname = 'PyG' + interface.name[1:] else: gname = 'PyG' + interface.name name = interface.name if interface.base == "IUnknown" or interface.base == "IDispatch": base_name = "PyGatewayBase" else: if interface.base[0] == "I": base_name = 'PyG' + interface.base[1:] else: base_name = 'PyG' + interface.base f.write(\ '''\ // --------------------------------------------------- // // Gateway Declaration class %s : public %s, public %s { protected: %s(PyObject *instance) : %s(instance) { ; } PYGATEWAY_MAKE_SUPPORT2(%s, %s, IID_%s, %s) ''' % (gname, base_name, name, gname, base_name, gname, name, name, base_name)) if interface.base != "IUnknown": f.write("\t// %s\n\t// *** Manually add %s method decls here\n\n" % (interface.base, interface.base)) else: f.write('\n\n') f.write("\t// %s\n" % name) for method in interface.methods: f.write('\tSTDMETHOD(%s)(\n' % method.name) if method.args: for arg in method.args[:-1]: f.write("\t\t%s,\n" % (arg.GetRawDeclaration())) arg = method.args[-1] f.write("\t\t%s);\n\n" % (arg.GetRawDeclaration())) else: f.write('\t\tvoid);\n\n') f.write('};\n') f.close() def _write_gw_cpp(f, interface): if interface.name[0] == "I": gname = 'PyG' + interface.name[1:] else: gname = 'PyG' + interface.name name = interface.name if interface.base == "IUnknown" or interface.base == "IDispatch": base_name = "PyGatewayBase" else: if interface.base[0] == "I": base_name = 'PyG' + interface.base[1:] else: base_name = 'PyG' + interface.base f.write('''\ // --------------------------------------------------- // // Gateway Implementation ''' % {'name':name, 'gname':gname, 'base_name':base_name}) for method in interface.methods: f.write(\ '''\ STDMETHODIMP %s::%s( ''' % (gname, method.name)) if method.args: for arg in method.args[:-1]: inoutstr = ']['.join(arg.inout) f.write("\t\t/* [%s] */ %s,\n" % (inoutstr, arg.GetRawDeclaration())) arg = method.args[-1] inoutstr = ']['.join(arg.inout) f.write("\t\t/* [%s] */ %s)\n" % (inoutstr, arg.GetRawDeclaration())) else: f.write('\t\tvoid)\n') f.write("{\n\tPY_GATEWAY_METHOD;\n") cout = 0 codePre = codePost = codeVars = "" argStr = "" needConversion = 0 formatChars = "" if method.args: for arg in method.args: if arg.HasAttribute("out"): cout = cout + 1 if arg.indirectionLevel ==2 : f.write("\tif (%s==NULL) return E_POINTER;\n" % arg.name) if arg.HasAttribute("in"): try: argCvt = makegwparse.make_arg_converter(arg) argCvt.SetGatewayMode() formatchar = argCvt.GetFormatChar(); needConversion = needConversion or argCvt.NeedUSES_CONVERSION() if formatchar: formatChars = formatChars + formatchar codeVars = codeVars + argCvt.DeclareParseArgTupleInputConverter() argStr = argStr + ", " + argCvt.GetBuildValueArg() codePre = codePre + argCvt.GetBuildForGatewayPreCode() codePost = codePost + argCvt.GetBuildForGatewayPostCode() except makegwparse.error_not_supported as why: f.write('// *** The input argument %s of type "%s" was not processed ***\n// - Please ensure this conversion function exists, and is appropriate\n// - %s\n' % (arg.name, arg.raw_type, why)) f.write('\tPyObject *ob%s = PyObject_From%s(%s);\n' % (arg.name, arg.type, arg.name)) f.write('\tif (ob%s==NULL) return MAKE_PYCOM_GATEWAY_FAILURE_CODE("%s");\n' % (arg.name, method.name)) codePost = codePost + "\tPy_DECREF(ob%s);\n" % arg.name formatChars = formatChars + "O" argStr = argStr + ", ob%s" % (arg.name) if needConversion: f.write('\tUSES_CONVERSION;\n') f.write(codeVars) f.write(codePre) if cout: f.write("\tPyObject *result;\n") resStr = "&result" else: resStr = "NULL" if formatChars: fullArgStr = '%s, "%s"%s' % (resStr, formatChars, argStr) else: fullArgStr = resStr f.write('\tHRESULT hr=InvokeViaPolicy("%s", %s);\n' % (method.name, fullArgStr)) f.write(codePost) if cout: f.write("\tif (FAILED(hr)) return hr;\n") f.write("\t// Process the Python results, and convert back to the real params\n") # process the output arguments. formatChars = codePobjects = codePost = argsParseTuple = "" needConversion = 0 for arg in method.args: if not arg.HasAttribute("out"): continue try: argCvt = makegwparse.make_arg_converter(arg) argCvt.SetGatewayMode() val = argCvt.GetFormatChar() if val: formatChars = formatChars + val argsParseTuple = argsParseTuple + ", " + argCvt.GetParseTupleArg() codePobjects = codePobjects + argCvt.DeclareParseArgTupleInputConverter() codePost = codePost + argCvt.GetParsePostCode() needConversion = needConversion or argCvt.NeedUSES_CONVERSION() except makegwparse.error_not_supported as why: f.write('// *** The output argument %s of type "%s" was not processed ***\n// %s\n' % (arg.name, arg.raw_type, why)) if formatChars: # If I have any to actually process. if len(formatChars)==1: parseFn = "PyArg_Parse" else: parseFn = "PyArg_ParseTuple" if codePobjects: f.write(codePobjects) f.write('\tif (!%s(result, "%s" %s))\n\t\treturn MAKE_PYCOM_GATEWAY_FAILURE_CODE("%s");\n' % (parseFn, formatChars, argsParseTuple, method.name)) if codePost: f.write('\tBOOL bPythonIsHappy = TRUE;\n') f.write(codePost) f.write('\tif (!bPythonIsHappy) hr = MAKE_PYCOM_GATEWAY_FAILURE_CODE("%s");\n' % method.name) f.write('\tPy_DECREF(result);\n'); f.write('\treturn hr;\n}\n\n') def test(): # make_framework_support("d:\\msdev\\include\\objidl.h", "ILockBytes") make_framework_support("d:\\msdev\\include\\objidl.h", "IStorage") # make_framework_support("d:\\msdev\\include\\objidl.h", "IEnumSTATSTG") PK Y03Kj'&&win32com/makegw/makegwenum.pyUT  YZx`ux """Utility file for generating PyIEnum support. This is almost a 'template' file. It simplay contains almost full C++ source code for PyIEnum* support, and the Python code simply substitutes the appropriate interface name. This module is notmally not used directly - the @makegw@ module automatically calls this. """ # # INTERNAL FUNCTIONS # # import string def is_interface_enum(enumtype): return not (enumtype[0] in string.uppercase and enumtype[2] in string.uppercase) def _write_enumifc_cpp(f, interface): enumtype = interface.name[5:] if is_interface_enum(enumtype): # Assume an interface. enum_interface = "I" + enumtype[:-1] converter = "PyObject *ob = PyCom_PyObjectFromIUnknown(rgVar[i], IID_%(enum_interface)s, FALSE);" % locals() arraydeclare = "%(enum_interface)s **rgVar = new %(enum_interface)s *[celt];" % locals() else: # Enum of a simple structure converter = "PyObject *ob = PyCom_PyObjectFrom%(enumtype)s(&rgVar[i]);" % locals() arraydeclare = "%(enumtype)s *rgVar = new %(enumtype)s[celt];" % locals() f.write(\ ''' // --------------------------------------------------- // // Interface Implementation PyIEnum%(enumtype)s::PyIEnum%(enumtype)s(IUnknown *pdisp): PyIUnknown(pdisp) { ob_type = &type; } PyIEnum%(enumtype)s::~PyIEnum%(enumtype)s() { } /* static */ IEnum%(enumtype)s *PyIEnum%(enumtype)s::GetI(PyObject *self) { return (IEnum%(enumtype)s *)PyIUnknown::GetI(self); } // @pymethod object|PyIEnum%(enumtype)s|Next|Retrieves a specified number of items in the enumeration sequence. PyObject *PyIEnum%(enumtype)s::Next(PyObject *self, PyObject *args) { long celt = 1; // @pyparm int|num|1|Number of items to retrieve. if ( !PyArg_ParseTuple(args, "|l:Next", &celt) ) return NULL; IEnum%(enumtype)s *pIE%(enumtype)s = GetI(self); if ( pIE%(enumtype)s == NULL ) return NULL; %(arraydeclare)s if ( rgVar == NULL ) { PyErr_SetString(PyExc_MemoryError, "allocating result %(enumtype)ss"); return NULL; } int i; /* for ( i = celt; i--; ) // *** possibly init each structure element??? */ ULONG celtFetched = 0; PY_INTERFACE_PRECALL; HRESULT hr = pIE%(enumtype)s->Next(celt, rgVar, &celtFetched); PY_INTERFACE_POSTCALL; if ( HRESULT_CODE(hr) != ERROR_NO_MORE_ITEMS && FAILED(hr) ) { delete [] rgVar; return PyCom_BuildPyException(hr,pIE%(enumtype)s, IID_IE%(enumtype)s); } PyObject *result = PyTuple_New(celtFetched); if ( result != NULL ) { for ( i = celtFetched; i--; ) { %(converter)s if ( ob == NULL ) { Py_DECREF(result); result = NULL; break; } PyTuple_SET_ITEM(result, i, ob); } } /* for ( i = celtFetched; i--; ) // *** possibly cleanup each structure element??? */ delete [] rgVar; return result; } // @pymethod |PyIEnum%(enumtype)s|Skip|Skips over the next specified elementes. PyObject *PyIEnum%(enumtype)s::Skip(PyObject *self, PyObject *args) { long celt; if ( !PyArg_ParseTuple(args, "l:Skip", &celt) ) return NULL; IEnum%(enumtype)s *pIE%(enumtype)s = GetI(self); if ( pIE%(enumtype)s == NULL ) return NULL; PY_INTERFACE_PRECALL; HRESULT hr = pIE%(enumtype)s->Skip(celt); PY_INTERFACE_POSTCALL; if ( FAILED(hr) ) return PyCom_BuildPyException(hr, pIE%(enumtype)s, IID_IE%(enumtype)s); Py_INCREF(Py_None); return Py_None; } // @pymethod |PyIEnum%(enumtype)s|Reset|Resets the enumeration sequence to the beginning. PyObject *PyIEnum%(enumtype)s::Reset(PyObject *self, PyObject *args) { if ( !PyArg_ParseTuple(args, ":Reset") ) return NULL; IEnum%(enumtype)s *pIE%(enumtype)s = GetI(self); if ( pIE%(enumtype)s == NULL ) return NULL; PY_INTERFACE_PRECALL; HRESULT hr = pIE%(enumtype)s->Reset(); PY_INTERFACE_POSTCALL; if ( FAILED(hr) ) return PyCom_BuildPyException(hr, pIE%(enumtype)s, IID_IE%(enumtype)s); Py_INCREF(Py_None); return Py_None; } // @pymethod |PyIEnum%(enumtype)s|Clone|Creates another enumerator that contains the same enumeration state as the current one PyObject *PyIEnum%(enumtype)s::Clone(PyObject *self, PyObject *args) { if ( !PyArg_ParseTuple(args, ":Clone") ) return NULL; IEnum%(enumtype)s *pIE%(enumtype)s = GetI(self); if ( pIE%(enumtype)s == NULL ) return NULL; IEnum%(enumtype)s *pClone; PY_INTERFACE_PRECALL; HRESULT hr = pIE%(enumtype)s->Clone(&pClone); PY_INTERFACE_POSTCALL; if ( FAILED(hr) ) return PyCom_BuildPyException(hr, pIE%(enumtype)s, IID_IE%(enumtype)s); return PyCom_PyObjectFromIUnknown(pClone, IID_IEnum%(enumtype)s, FALSE); } // @object PyIEnum%(enumtype)s|A Python interface to IEnum%(enumtype)s static struct PyMethodDef PyIEnum%(enumtype)s_methods[] = { { "Next", PyIEnum%(enumtype)s::Next, 1 }, // @pymeth Next|Retrieves a specified number of items in the enumeration sequence. { "Skip", PyIEnum%(enumtype)s::Skip, 1 }, // @pymeth Skip|Skips over the next specified elementes. { "Reset", PyIEnum%(enumtype)s::Reset, 1 }, // @pymeth Reset|Resets the enumeration sequence to the beginning. { "Clone", PyIEnum%(enumtype)s::Clone, 1 }, // @pymeth Clone|Creates another enumerator that contains the same enumeration state as the current one. { NULL } }; PyComEnumTypeObject PyIEnum%(enumtype)s::type("PyIEnum%(enumtype)s", &PyIUnknown::type, sizeof(PyIEnum%(enumtype)s), PyIEnum%(enumtype)s_methods, GET_PYCOM_CTOR(PyIEnum%(enumtype)s)); ''' % locals() ) def _write_enumgw_cpp(f, interface): enumtype = interface.name[5:] if is_interface_enum(enumtype): # Assume an interface. enum_interface = "I" + enumtype[:-1] converter = "if ( !PyCom_InterfaceFromPyObject(ob, IID_%(enum_interface)s, (void **)&rgVar[i], FALSE) )" % locals() argdeclare="%(enum_interface)s __RPC_FAR * __RPC_FAR *rgVar" % locals() else: argdeclare="%(enumtype)s __RPC_FAR *rgVar" % locals() converter="if ( !PyCom_PyObjectAs%(enumtype)s(ob, &rgVar[i]) )" % locals() f.write( ''' // --------------------------------------------------- // // Gateway Implementation // Std delegation STDMETHODIMP_(ULONG) PyGEnum%(enumtype)s::AddRef(void) {return PyGatewayBase::AddRef();} STDMETHODIMP_(ULONG) PyGEnum%(enumtype)s::Release(void) {return PyGatewayBase::Release();} STDMETHODIMP PyGEnum%(enumtype)s::QueryInterface(REFIID iid, void ** obj) {return PyGatewayBase::QueryInterface(iid, obj);} STDMETHODIMP PyGEnum%(enumtype)s::GetTypeInfoCount(UINT FAR* pctInfo) {return PyGatewayBase::GetTypeInfoCount(pctInfo);} STDMETHODIMP PyGEnum%(enumtype)s::GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo FAR* FAR* pptInfo) {return PyGatewayBase::GetTypeInfo(itinfo, lcid, pptInfo);} STDMETHODIMP PyGEnum%(enumtype)s::GetIDsOfNames(REFIID refiid, OLECHAR FAR* FAR* rgszNames, UINT cNames, LCID lcid, DISPID FAR* rgdispid) {return PyGatewayBase::GetIDsOfNames( refiid, rgszNames, cNames, lcid, rgdispid);} STDMETHODIMP PyGEnum%(enumtype)s::Invoke(DISPID dispid, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS FAR* params, VARIANT FAR* pVarResult, EXCEPINFO FAR* pexcepinfo, UINT FAR* puArgErr) {return PyGatewayBase::Invoke( dispid, riid, lcid, wFlags, params, pVarResult, pexcepinfo, puArgErr);} STDMETHODIMP PyGEnum%(enumtype)s::Next( /* [in] */ ULONG celt, /* [length_is][size_is][out] */ %(argdeclare)s, /* [out] */ ULONG __RPC_FAR *pCeltFetched) { PY_GATEWAY_METHOD; PyObject *result; HRESULT hr = InvokeViaPolicy("Next", &result, "i", celt); if ( FAILED(hr) ) return hr; if ( !PySequence_Check(result) ) goto error; int len; len = PyObject_Length(result); if ( len == -1 ) goto error; if ( len > (int)celt) len = celt; if ( pCeltFetched ) *pCeltFetched = len; int i; for ( i = 0; i < len; ++i ) { PyObject *ob = PySequence_GetItem(result, i); if ( ob == NULL ) goto error; %(converter)s { Py_DECREF(result); return PyCom_SetCOMErrorFromPyException(IID_IEnum%(enumtype)s); } } Py_DECREF(result); return len < (int)celt ? S_FALSE : S_OK; error: PyErr_Clear(); // just in case Py_DECREF(result); return PyCom_SetCOMErrorFromSimple(E_FAIL, IID_IEnum%(enumtype)s, "Next() did not return a sequence of objects"); } STDMETHODIMP PyGEnum%(enumtype)s::Skip( /* [in] */ ULONG celt) { PY_GATEWAY_METHOD; return InvokeViaPolicy("Skip", NULL, "i", celt); } STDMETHODIMP PyGEnum%(enumtype)s::Reset(void) { PY_GATEWAY_METHOD; return InvokeViaPolicy("Reset"); } STDMETHODIMP PyGEnum%(enumtype)s::Clone( /* [out] */ IEnum%(enumtype)s __RPC_FAR *__RPC_FAR *ppEnum) { PY_GATEWAY_METHOD; PyObject * result; HRESULT hr = InvokeViaPolicy("Clone", &result); if ( FAILED(hr) ) return hr; /* ** Make sure we have the right kind of object: we should have some kind ** of IUnknown subclass wrapped into a PyIUnknown instance. */ if ( !PyIBase::is_object(result, &PyIUnknown::type) ) { /* the wrong kind of object was returned to us */ Py_DECREF(result); return PyCom_SetCOMErrorFromSimple(E_FAIL, IID_IEnum%(enumtype)s); } /* ** Get the IUnknown out of the thing. note that the Python ob maintains ** a reference, so we don't have to explicitly AddRef() here. */ IUnknown *punk = ((PyIUnknown *)result)->m_obj; if ( !punk ) { /* damn. the object was released. */ Py_DECREF(result); return PyCom_SetCOMErrorFromSimple(E_FAIL, IID_IEnum%(enumtype)s); } /* ** Get the interface we want. note it is returned with a refcount. ** This QI is actually going to instantiate a PyGEnum%(enumtype)s. */ hr = punk->QueryInterface(IID_IEnum%(enumtype)s, (LPVOID *)ppEnum); /* done with the result; this DECREF is also for */ Py_DECREF(result); return PyCom_SetCOMErrorFromSimple(hr, IID_IEnum%(enumtype)s, "Python could not convert the result from Next() into the required COM interface"); } ''' % locals()) PK Y03Kvx+  win32com/License.txtUT  YZx`ux Unless stated in the specfic source file, this work is Copyright (c) 1996-2008, Greg Stein and Mark Hammond. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. Neither names of Greg Stein, Mark Hammond nor the name of contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. PK ѳPY win32com/olectl.pyUT l_Zx`ux """Constants used by COM Controls Hand created version of OLECTL.H constants. """ import winerror FACILITY_CONTROL = 0xa def MAKE_SCODE(sev, fac, code): return int((int(-sev)<<31) | ((fac)<<16) | ((code))) def STD_CTL_SCODE(n): return MAKE_SCODE(winerror.SEVERITY_ERROR, FACILITY_CONTROL, n) CTL_E_ILLEGALFUNCTIONCALL = STD_CTL_SCODE(5) CTL_E_OVERFLOW = STD_CTL_SCODE(6) CTL_E_OUTOFMEMORY = STD_CTL_SCODE(7) CTL_E_DIVISIONBYZERO = STD_CTL_SCODE(11) CTL_E_OUTOFSTRINGSPACE = STD_CTL_SCODE(14) CTL_E_OUTOFSTACKSPACE = STD_CTL_SCODE(28) CTL_E_BADFILENAMEORNUMBER = STD_CTL_SCODE(52) CTL_E_FILENOTFOUND = STD_CTL_SCODE(53) CTL_E_BADFILEMODE = STD_CTL_SCODE(54) CTL_E_FILEALREADYOPEN = STD_CTL_SCODE(55) CTL_E_DEVICEIOERROR = STD_CTL_SCODE(57) CTL_E_FILEALREADYEXISTS = STD_CTL_SCODE(58) CTL_E_BADRECORDLENGTH = STD_CTL_SCODE(59) CTL_E_DISKFULL = STD_CTL_SCODE(61) CTL_E_BADRECORDNUMBER = STD_CTL_SCODE(63) CTL_E_BADFILENAME = STD_CTL_SCODE(64) CTL_E_TOOMANYFILES = STD_CTL_SCODE(67) CTL_E_DEVICEUNAVAILABLE = STD_CTL_SCODE(68) CTL_E_PERMISSIONDENIED = STD_CTL_SCODE(70) CTL_E_DISKNOTREADY = STD_CTL_SCODE(71) CTL_E_PATHFILEACCESSERROR = STD_CTL_SCODE(75) CTL_E_PATHNOTFOUND = STD_CTL_SCODE(76) CTL_E_INVALIDPATTERNSTRING = STD_CTL_SCODE(93) CTL_E_INVALIDUSEOFNULL = STD_CTL_SCODE(94) CTL_E_INVALIDFILEFORMAT = STD_CTL_SCODE(321) CTL_E_INVALIDPROPERTYVALUE = STD_CTL_SCODE(380) CTL_E_INVALIDPROPERTYARRAYINDEX = STD_CTL_SCODE(381) CTL_E_SETNOTSUPPORTEDATRUNTIME = STD_CTL_SCODE(382) CTL_E_SETNOTSUPPORTED = STD_CTL_SCODE(383) CTL_E_NEEDPROPERTYARRAYINDEX = STD_CTL_SCODE(385) CTL_E_SETNOTPERMITTED = STD_CTL_SCODE(387) CTL_E_GETNOTSUPPORTEDATRUNTIME = STD_CTL_SCODE(393) CTL_E_GETNOTSUPPORTED = STD_CTL_SCODE(394) CTL_E_PROPERTYNOTFOUND = STD_CTL_SCODE(422) CTL_E_INVALIDCLIPBOARDFORMAT = STD_CTL_SCODE(460) CTL_E_INVALIDPICTURE = STD_CTL_SCODE(481) CTL_E_PRINTERERROR = STD_CTL_SCODE(482) CTL_E_CANTSAVEFILETOTEMP = STD_CTL_SCODE(735) CTL_E_SEARCHTEXTNOTFOUND = STD_CTL_SCODE(744) CTL_E_REPLACEMENTSTOOLONG = STD_CTL_SCODE(746) CONNECT_E_FIRST = MAKE_SCODE(winerror.SEVERITY_ERROR, winerror.FACILITY_ITF, 0x0200) CONNECT_E_LAST = MAKE_SCODE(winerror.SEVERITY_ERROR, winerror.FACILITY_ITF, 0x020F) CONNECT_S_FIRST = MAKE_SCODE(winerror.SEVERITY_SUCCESS, winerror.FACILITY_ITF, 0x0200) CONNECT_S_LAST = MAKE_SCODE(winerror.SEVERITY_SUCCESS, winerror.FACILITY_ITF, 0x020F) CONNECT_E_NOCONNECTION = CONNECT_E_FIRST+0 CONNECT_E_ADVISELIMIT = CONNECT_E_FIRST+1 CONNECT_E_CANNOTCONNECT = CONNECT_E_FIRST+2 CONNECT_E_OVERRIDDEN = CONNECT_E_FIRST+3 CLASS_E_NOTLICENSED = winerror.CLASSFACTORY_E_FIRST+2 PK {Rwin32com/client/UT Zx`Zx`ux PK %DQH{win32com/client/tlbrowse.pyUT Sy_Zx`ux import win32ui import win32con import win32api import commctrl import pythoncom from pywin.mfc import dialog class TLBrowserException(Exception): "TypeLib browser internal error" error = TLBrowserException FRAMEDLG_STD = win32con.WS_CAPTION | win32con.WS_SYSMENU SS_STD = win32con.WS_CHILD | win32con.WS_VISIBLE BS_STD = SS_STD | win32con.WS_TABSTOP ES_STD = BS_STD | win32con.WS_BORDER LBS_STD = ES_STD | win32con.LBS_NOTIFY | win32con.LBS_NOINTEGRALHEIGHT | win32con.WS_VSCROLL CBS_STD = ES_STD | win32con.CBS_NOINTEGRALHEIGHT | win32con.WS_VSCROLL typekindmap = { pythoncom.TKIND_ENUM : 'Enumeration', pythoncom.TKIND_RECORD : 'Record', pythoncom.TKIND_MODULE : 'Module', pythoncom.TKIND_INTERFACE : 'Interface', pythoncom.TKIND_DISPATCH : 'Dispatch', pythoncom.TKIND_COCLASS : 'CoClass', pythoncom.TKIND_ALIAS : 'Alias', pythoncom.TKIND_UNION : 'Union' } TypeBrowseDialog_Parent=dialog.Dialog class TypeBrowseDialog(TypeBrowseDialog_Parent): "Browse a type library" IDC_TYPELIST = 1000 IDC_MEMBERLIST = 1001 IDC_PARAMLIST = 1002 IDC_LISTVIEW = 1003 def __init__(self, typefile = None): TypeBrowseDialog_Parent.__init__(self, self.GetTemplate()) try: if typefile: self.tlb = pythoncom.LoadTypeLib(typefile) else: self.tlb = None except pythoncom.ole_error: self.MessageBox("The file does not contain type information") self.tlb = None self.HookCommand(self.CmdTypeListbox, self.IDC_TYPELIST) self.HookCommand(self.CmdMemberListbox, self.IDC_MEMBERLIST) def OnAttachedObjectDeath(self): self.tlb = None self.typeinfo = None self.attr = None return TypeBrowseDialog_Parent.OnAttachedObjectDeath(self) def _SetupMenu(self): menu = win32ui.CreateMenu() flags=win32con.MF_STRING|win32con.MF_ENABLED menu.AppendMenu(flags, win32ui.ID_FILE_OPEN, "&Open...") menu.AppendMenu(flags, win32con.IDCANCEL, "&Close") mainMenu = win32ui.CreateMenu() mainMenu.AppendMenu(flags|win32con.MF_POPUP, menu.GetHandle(), "&File") self.SetMenu(mainMenu) self.HookCommand(self.OnFileOpen,win32ui.ID_FILE_OPEN) def OnFileOpen(self, id, code): openFlags = win32con.OFN_OVERWRITEPROMPT | win32con.OFN_FILEMUSTEXIST fspec = "Type Libraries (*.tlb, *.olb)|*.tlb;*.olb|OCX Files (*.ocx)|*.ocx|DLL's (*.dll)|*.dll|All Files (*.*)|*.*||" dlg = win32ui.CreateFileDialog(1, None, None, openFlags, fspec) if dlg.DoModal() == win32con.IDOK: try: self.tlb = pythoncom.LoadTypeLib(dlg.GetPathName()) except pythoncom.ole_error: self.MessageBox("The file does not contain type information") self.tlb = None self._SetupTLB() def OnInitDialog(self): self._SetupMenu() self.typelb = self.GetDlgItem(self.IDC_TYPELIST) self.memberlb = self.GetDlgItem(self.IDC_MEMBERLIST) self.paramlb = self.GetDlgItem(self.IDC_PARAMLIST) self.listview = self.GetDlgItem(self.IDC_LISTVIEW) # Setup the listview columns itemDetails = (commctrl.LVCFMT_LEFT, 100, "Item", 0) self.listview.InsertColumn(0, itemDetails) itemDetails = (commctrl.LVCFMT_LEFT, 1024, "Details", 0) self.listview.InsertColumn(1, itemDetails) if self.tlb is None: self.OnFileOpen(None,None) else: self._SetupTLB() return TypeBrowseDialog_Parent.OnInitDialog(self) def _SetupTLB(self): self.typelb.ResetContent() self.memberlb.ResetContent() self.paramlb.ResetContent() self.typeinfo = None self.attr = None if self.tlb is None: return n = self.tlb.GetTypeInfoCount() for i in range(n): self.typelb.AddString(self.tlb.GetDocumentation(i)[0]) def _SetListviewTextItems(self, items): self.listview.DeleteAllItems() index = -1 for item in items: index = self.listview.InsertItem(index+1,item[0]) data = item[1] if data is None: data = "" self.listview.SetItemText(index, 1, data) def SetupAllInfoTypes(self): infos = self._GetMainInfoTypes() + self._GetMethodInfoTypes() self._SetListviewTextItems(infos) def _GetMainInfoTypes(self): pos = self.typelb.GetCurSel() if pos<0: return [] docinfo = self.tlb.GetDocumentation(pos) infos = [('GUID', str(self.attr[0]))] infos.append(('Help File', docinfo[3])) infos.append(('Help Context', str(docinfo[2]))) try: infos.append(('Type Kind', typekindmap[self.tlb.GetTypeInfoType(pos)])) except: pass info = self.tlb.GetTypeInfo(pos) attr = info.GetTypeAttr() infos.append(('Attributes', str(attr))) for j in range(attr[8]): flags = info.GetImplTypeFlags(j) refInfo = info.GetRefTypeInfo(info.GetRefTypeOfImplType(j)) doc = refInfo.GetDocumentation(-1) attr = refInfo.GetTypeAttr() typeKind = attr[5] typeFlags = attr[11] desc = doc[0] desc = desc + ", Flags=0x%x, typeKind=0x%x, typeFlags=0x%x" % (flags, typeKind, typeFlags) if flags & pythoncom.IMPLTYPEFLAG_FSOURCE: desc = desc + "(Source)" infos.append( ('Implements', desc)) return infos def _GetMethodInfoTypes(self): pos = self.memberlb.GetCurSel() if pos<0: return [] realPos, isMethod = self._GetRealMemberPos(pos) ret = [] if isMethod: funcDesc = self.typeinfo.GetFuncDesc(realPos) id = funcDesc[0] ret.append(("Func Desc", str(funcDesc))) else: id = self.typeinfo.GetVarDesc(realPos)[0] docinfo = self.typeinfo.GetDocumentation(id) ret.append(('Help String', docinfo[1])) ret.append(('Help Context', str(docinfo[2]))) return ret def CmdTypeListbox(self, id, code): if code == win32con.LBN_SELCHANGE: pos = self.typelb.GetCurSel() if pos >= 0: self.memberlb.ResetContent() self.typeinfo = self.tlb.GetTypeInfo(pos) self.attr = self.typeinfo.GetTypeAttr() for i in range(self.attr[7]): id = self.typeinfo.GetVarDesc(i)[0] self.memberlb.AddString(self.typeinfo.GetNames(id)[0]) for i in range(self.attr[6]): id = self.typeinfo.GetFuncDesc(i)[0] self.memberlb.AddString(self.typeinfo.GetNames(id)[0]) self.SetupAllInfoTypes() return 1 def _GetRealMemberPos(self, pos): pos = self.memberlb.GetCurSel() if pos >= self.attr[7]: return pos - self.attr[7], 1 elif pos >= 0: return pos, 0 else: raise error("The position is not valid") def CmdMemberListbox(self, id, code): if code == win32con.LBN_SELCHANGE: self.paramlb.ResetContent() pos = self.memberlb.GetCurSel() realPos, isMethod = self._GetRealMemberPos(pos) if isMethod: id = self.typeinfo.GetFuncDesc(realPos)[0] names = self.typeinfo.GetNames(id) for i in range(len(names)): if i > 0: self.paramlb.AddString(names[i]) self.SetupAllInfoTypes() return 1 def GetTemplate(self): "Return the template used to create this dialog" w = 272 # Dialog width h = 192 # Dialog height style = FRAMEDLG_STD | win32con.WS_VISIBLE | win32con.DS_SETFONT | win32con.WS_MINIMIZEBOX template = [['Type Library Browser', (0, 0, w, h), style, None, (8, 'Helv')], ] template.append([130, "&Type", -1, (10, 10, 62, 9), SS_STD | win32con.SS_LEFT]) template.append([131, None, self.IDC_TYPELIST, (10, 20, 80, 80), LBS_STD]) template.append([130, "&Members", -1, (100, 10, 62, 9), SS_STD | win32con.SS_LEFT]) template.append([131, None, self.IDC_MEMBERLIST, (100, 20, 80, 80), LBS_STD]) template.append([130, "&Parameters", -1, (190, 10, 62, 9), SS_STD | win32con.SS_LEFT]) template.append([131, None, self.IDC_PARAMLIST, (190, 20, 75, 80), LBS_STD]) lvStyle = SS_STD | commctrl.LVS_REPORT | commctrl.LVS_AUTOARRANGE | commctrl.LVS_ALIGNLEFT | win32con.WS_BORDER | win32con.WS_TABSTOP template.append(["SysListView32", "", self.IDC_LISTVIEW, (10, 110, 255, 65), lvStyle]) return template if __name__=='__main__': import sys fname = None try: fname = sys.argv[1] except: pass dlg = TypeBrowseDialog(fname) try: win32api.GetConsoleTitle() dlg.DoModal() except: dlg.CreateWindow(win32ui.GetMainFrame()) PK %DQhΪ[[win32com/client/build.pyUT Sy_Zx`ux """Contains knowledge to build a COM object definition. This module is used by both the @dynamic@ and @makepy@ modules to build all knowledge of a COM object. This module contains classes which contain the actual knowledge of the object. This include parameter and return type information, the COM dispid and CLSID, etc. Other modules may use this information to generate .py files, use the information dynamically, or possibly even generate .html documentation for objects. """ # # NOTES: DispatchItem and MapEntry used by dynamic.py. # the rest is used by makepy.py # # OleItem, DispatchItem, MapEntry, BuildCallList() is used by makepy import sys import string from keyword import iskeyword import pythoncom from pywintypes import TimeType import winerror import datetime # It isn't really clear what the quoting rules are in a C/IDL string and # literals like a quote char and backslashes makes life a little painful to # always render the string perfectly - so just punt and fall-back to a repr() def _makeDocString(s): if sys.version_info < (3,): s = s.encode("mbcs") return repr(s) error = "PythonCOM.Client.Build error" class NotSupportedException(Exception): pass # Raised when we cant support a param type. DropIndirection="DropIndirection" NoTranslateTypes = [ pythoncom.VT_BOOL, pythoncom.VT_CLSID, pythoncom.VT_CY, pythoncom.VT_DATE, pythoncom.VT_DECIMAL, pythoncom.VT_EMPTY, pythoncom.VT_ERROR, pythoncom.VT_FILETIME, pythoncom.VT_HRESULT, pythoncom.VT_I1, pythoncom.VT_I2, pythoncom.VT_I4, pythoncom.VT_I8, pythoncom.VT_INT, pythoncom.VT_NULL, pythoncom.VT_R4, pythoncom.VT_R8, pythoncom.VT_NULL, pythoncom.VT_STREAM, pythoncom.VT_UI1, pythoncom.VT_UI2, pythoncom.VT_UI4, pythoncom.VT_UI8, pythoncom.VT_UINT, pythoncom.VT_VOID, ] NoTranslateMap = {} for v in NoTranslateTypes: NoTranslateMap[v] = None class MapEntry: "Simple holder for named attibutes - items in a map." def __init__(self, desc_or_id, names=None, doc=None, resultCLSID=pythoncom.IID_NULL, resultDoc = None, hidden=0): if type(desc_or_id)==type(0): self.dispid = desc_or_id self.desc = None else: self.dispid = desc_or_id[0] self.desc = desc_or_id self.names = names self.doc = doc self.resultCLSID = resultCLSID self.resultDocumentation = resultDoc self.wasProperty = 0 # Have I been transformed into a function so I can pass args? self.hidden = hidden def GetResultCLSID(self): rc = self.resultCLSID if rc == pythoncom.IID_NULL: return None return rc # Return a string, suitable for output - either "'{...}'" or "None" def GetResultCLSIDStr(self): rc = self.GetResultCLSID() if rc is None: return "None" return repr(str(rc)) # Convert the IID object to a string, then to a string in a string. def GetResultName(self): if self.resultDocumentation is None: return None return self.resultDocumentation[0] class OleItem: typename = "OleItem" def __init__(self, doc=None): self.doc = doc if self.doc: self.python_name = MakePublicAttributeName(self.doc[0]) else: self.python_name = None self.bWritten = 0 self.bIsDispatch = 0 self.bIsSink = 0 self.clsid = None self.co_class = None class DispatchItem(OleItem): typename = "DispatchItem" def __init__(self, typeinfo=None, attr=None, doc=None, bForUser=1): OleItem.__init__(self,doc) self.propMap = {} self.propMapGet = {} self.propMapPut = {} self.mapFuncs = {} self.defaultDispatchName = None self.hidden = 0 if typeinfo: self.Build(typeinfo, attr, bForUser) def _propMapPutCheck_(self,key,item): ins, outs, opts = self.CountInOutOptArgs(item.desc[2]) if ins>1: # if a Put property takes more than 1 arg: if opts+1==ins or ins==item.desc[6]+1: newKey = "Set" + key deleteExisting = 0 # This one is still OK else: deleteExisting = 1 # No good to us if key in self.mapFuncs or key in self.propMapGet: newKey = "Set" + key else: newKey = key item.wasProperty = 1 self.mapFuncs[newKey] = item if deleteExisting: del self.propMapPut[key] def _propMapGetCheck_(self,key,item): ins, outs, opts = self.CountInOutOptArgs(item.desc[2]) if ins > 0: # if a Get property takes _any_ in args: if item.desc[6]==ins or ins==opts: newKey = "Get" + key deleteExisting = 0 # This one is still OK else: deleteExisting = 1 # No good to us if key in self.mapFuncs: newKey = "Get" + key else: newKey = key item.wasProperty = 1 self.mapFuncs[newKey] = item if deleteExisting: del self.propMapGet[key] def _AddFunc_(self,typeinfo,fdesc,bForUser): id = fdesc.memid funcflags = fdesc.wFuncFlags try: names = typeinfo.GetNames(id) name=names[0] except pythoncom.ole_error: name = "" names = None doc = None try: if bForUser: doc = typeinfo.GetDocumentation(id) except pythoncom.ole_error: pass if id==0 and name: self.defaultDispatchName = name invkind = fdesc.invkind # We need to translate any Alias', Enums, structs etc in result and args typerepr, flag, defval = fdesc.rettype # sys.stderr.write("%s result - %s -> " % (name, typerepr)) typerepr, resultCLSID, resultDoc = _ResolveType(typerepr, typeinfo) # sys.stderr.write("%s\n" % (typerepr,)) fdesc.rettype = typerepr, flag, defval, resultCLSID # Translate any Alias or Enums in argument list. argList = [] for argDesc in fdesc.args: typerepr, flag, defval = argDesc # sys.stderr.write("%s arg - %s -> " % (name, typerepr)) arg_type, arg_clsid, arg_doc = _ResolveType(typerepr, typeinfo) argDesc = arg_type, flag, defval, arg_clsid # sys.stderr.write("%s\n" % (argDesc[0],)) argList.append(argDesc) fdesc.args = tuple(argList) hidden = (funcflags & pythoncom.FUNCFLAG_FHIDDEN) != 0 if invkind == pythoncom.INVOKE_PROPERTYGET: map = self.propMapGet # This is not the best solution, but I dont think there is # one without specific "set" syntax. # If there is a single PUT or PUTREF, it will function as a property. # If there are both, then the PUT remains a property, and the PUTREF # gets transformed into a function. # (in vb, PUT=="obj=other_obj", PUTREF="set obj=other_obj elif invkind in (pythoncom.INVOKE_PROPERTYPUT, pythoncom.INVOKE_PROPERTYPUTREF): # Special case existing = self.propMapPut.get(name, None) if existing is not None: if existing.desc[4]==pythoncom.INVOKE_PROPERTYPUT: # Keep this one map = self.mapFuncs name = "Set"+name else: # Existing becomes a func. existing.wasProperty = 1 self.mapFuncs["Set"+name]=existing map = self.propMapPut # existing gets overwritten below. else: map = self.propMapPut # first time weve seen it. elif invkind == pythoncom.INVOKE_FUNC: map = self.mapFuncs else: map = None if not map is None: # if map.has_key(name): # sys.stderr.write("Warning - overwriting existing method/attribute %s\n" % name) map[name] = MapEntry(tuple(fdesc), names, doc, resultCLSID, resultDoc, hidden) # any methods that can't be reached via DISPATCH we return None # for, so dynamic dispatch doesnt see it. if fdesc.funckind != pythoncom.FUNC_DISPATCH: return None return (name,map) return None def _AddVar_(self,typeinfo,fdesc,bForUser): ### need pythoncom.VARFLAG_FRESTRICTED ... ### then check it if fdesc.varkind == pythoncom.VAR_DISPATCH: id = fdesc.memid names = typeinfo.GetNames(id) # Translate any Alias or Enums in result. typerepr, flags, defval = fdesc.elemdescVar typerepr, resultCLSID, resultDoc = _ResolveType(typerepr, typeinfo) fdesc.elemdescVar = typerepr, flags, defval doc = None try: if bForUser: doc = typeinfo.GetDocumentation(id) except pythoncom.ole_error: pass # handle the enumerator specially map = self.propMap # Check if the element is hidden. hidden = 0 if hasattr(fdesc,"wVarFlags"): hidden = (fdesc.wVarFlags & 0x40) != 0 # VARFLAG_FHIDDEN map[names[0]] = MapEntry(tuple(fdesc), names, doc, resultCLSID, resultDoc, hidden) return (names[0],map) else: return None def Build(self, typeinfo, attr, bForUser = 1): self.clsid = attr[0] self.bIsDispatch = (attr.wTypeFlags & pythoncom.TYPEFLAG_FDISPATCHABLE) != 0 if typeinfo is None: return # Loop over all methods for j in range(attr[6]): fdesc = typeinfo.GetFuncDesc(j) self._AddFunc_(typeinfo,fdesc,bForUser) # Loop over all variables (ie, properties) for j in range(attr[7]): fdesc = typeinfo.GetVarDesc(j) self._AddVar_(typeinfo,fdesc,bForUser) # Now post-process the maps. For any "Get" or "Set" properties # that have arguments, we must turn them into methods. If a method # of the same name already exists, change the name. for key, item in list(self.propMapGet.items()): self._propMapGetCheck_(key,item) for key, item in list(self.propMapPut.items()): self._propMapPutCheck_(key,item) def CountInOutOptArgs(self, argTuple): "Return tuple counting in/outs/OPTS. Sum of result may not be len(argTuple), as some args may be in/out." ins = out = opts = 0 for argCheck in argTuple: inOut = argCheck[1] if inOut==0: ins = ins + 1 out = out + 1 else: if inOut & pythoncom.PARAMFLAG_FIN: ins = ins + 1 if inOut & pythoncom.PARAMFLAG_FOPT: opts = opts + 1 if inOut & pythoncom.PARAMFLAG_FOUT: out = out + 1 return ins, out, opts def MakeFuncMethod(self, entry, name, bMakeClass = 1): # If we have a type description, and not varargs... if entry.desc is not None and (len(entry.desc) < 6 or entry.desc[6]!=-1): return self.MakeDispatchFuncMethod(entry, name, bMakeClass) else: return self.MakeVarArgsFuncMethod(entry, name, bMakeClass) def MakeDispatchFuncMethod(self, entry, name, bMakeClass = 1): fdesc = entry.desc doc = entry.doc names = entry.names ret = [] if bMakeClass: linePrefix = "\t" defNamedOptArg = "defaultNamedOptArg" defNamedNotOptArg = "defaultNamedNotOptArg" defUnnamedArg = "defaultUnnamedArg" else: linePrefix = "" defNamedOptArg = "pythoncom.Missing" defNamedNotOptArg = "pythoncom.Missing" defUnnamedArg = "pythoncom.Missing" defOutArg = "pythoncom.Missing" id = fdesc[0] s = linePrefix + 'def ' + name + '(self' + BuildCallList(fdesc, names, defNamedOptArg, defNamedNotOptArg, defUnnamedArg, defOutArg) + '):' ret.append(s) if doc and doc[1]: ret.append(linePrefix + '\t' + _makeDocString(doc[1])) # print "fdesc is ", fdesc resclsid = entry.GetResultCLSID() if resclsid: resclsid = "'%s'" % resclsid else: resclsid = 'None' # Strip the default values from the arg desc retDesc = fdesc[8][:2] argsDesc = tuple([what[:2] for what in fdesc[2]]) # The runtime translation of the return types is expensive, so when we know the # return type of the function, there is no need to check the type at runtime. # To qualify, this function must return a "simple" type, and have no byref args. # Check if we have byrefs or anything in the args which mean we still need a translate. param_flags = [what[1] for what in fdesc[2]] bad_params = [flag for flag in param_flags if flag & (pythoncom.PARAMFLAG_FOUT | pythoncom.PARAMFLAG_FRETVAL)!=0] s = None if len(bad_params)==0 and len(retDesc)==2 and retDesc[1]==0: rd = retDesc[0] if rd in NoTranslateMap: s = '%s\treturn self._oleobj_.InvokeTypes(%d, LCID, %s, %s, %s%s)' % (linePrefix, id, fdesc[4], retDesc, argsDesc, _BuildArgList(fdesc, names)) elif rd in [pythoncom.VT_DISPATCH, pythoncom.VT_UNKNOWN]: s = '%s\tret = self._oleobj_.InvokeTypes(%d, LCID, %s, %s, %s%s)\n' % (linePrefix, id, fdesc[4], retDesc, repr(argsDesc), _BuildArgList(fdesc, names)) s = s + '%s\tif ret is not None:\n' % (linePrefix,) if rd == pythoncom.VT_UNKNOWN: s = s + "%s\t\t# See if this IUnknown is really an IDispatch\n" % (linePrefix,) s = s + "%s\t\ttry:\n" % (linePrefix,) s = s + "%s\t\t\tret = ret.QueryInterface(pythoncom.IID_IDispatch)\n" % (linePrefix,) s = s + "%s\t\texcept pythoncom.error:\n" % (linePrefix,) s = s + "%s\t\t\treturn ret\n" % (linePrefix,) s = s + '%s\t\tret = Dispatch(ret, %s, %s)\n' % (linePrefix,repr(name), resclsid) s = s + '%s\treturn ret' % (linePrefix) elif rd == pythoncom.VT_BSTR: s = "%s\t# Result is a Unicode object\n" % (linePrefix,) s = s + '%s\treturn self._oleobj_.InvokeTypes(%d, LCID, %s, %s, %s%s)' % (linePrefix, id, fdesc[4], retDesc, repr(argsDesc), _BuildArgList(fdesc, names)) # else s remains None if s is None: s = '%s\treturn self._ApplyTypes_(%d, %s, %s, %s, %s, %s%s)' % (linePrefix, id, fdesc[4], retDesc, argsDesc, repr(name), resclsid, _BuildArgList(fdesc, names)) ret.append(s) ret.append("") return ret def MakeVarArgsFuncMethod(self, entry, name, bMakeClass = 1): fdesc = entry.desc names = entry.names doc = entry.doc ret = [] argPrefix = "self" if bMakeClass: linePrefix = "\t" else: linePrefix = "" ret.append(linePrefix + 'def ' + name + '(' + argPrefix + ', *args):') if doc and doc[1]: ret.append(linePrefix + '\t' + _makeDocString(doc[1])) if fdesc: invoketype = fdesc[4] else: invoketype = pythoncom.DISPATCH_METHOD s = linePrefix + '\treturn self._get_good_object_(self._oleobj_.Invoke(*((' ret.append(s + str(entry.dispid) + ",0,%d,1)+args)),'%s')" % (invoketype, names[0])) ret.append("") return ret # Note - "DispatchItem" poorly named - need a new intermediate class. class VTableItem(DispatchItem): def Build(self, typeinfo, attr, bForUser = 1): DispatchItem.Build(self, typeinfo, attr, bForUser) assert typeinfo is not None, "Cant build vtables without type info!" meth_list = list(self.mapFuncs.values()) + list(self.propMapGet.values()) + list(self.propMapPut.values()) meth_list.sort(key=lambda m: m.desc[7]) # Now turn this list into the run-time representation # (ready for immediate use or writing to gencache) self.vtableFuncs = [] for entry in meth_list: self.vtableFuncs.append( (entry.names, entry.dispid, entry.desc) ) # A Lazy dispatch item - builds an item on request using info from # an ITypeComp. The dynamic module makes the called to build each item, # and also holds the references to the typeinfo and typecomp. class LazyDispatchItem(DispatchItem): typename = "LazyDispatchItem" def __init__(self, attr, doc): self.clsid = attr[0] DispatchItem.__init__(self, None, attr, doc, 0) typeSubstMap = { pythoncom.VT_INT: pythoncom.VT_I4, pythoncom.VT_UINT: pythoncom.VT_UI4, pythoncom.VT_HRESULT: pythoncom.VT_I4, } def _ResolveType(typerepr, itypeinfo): # Resolve VT_USERDEFINED (often aliases or typed IDispatches) if type(typerepr)==tuple: indir_vt, subrepr = typerepr if indir_vt == pythoncom.VT_PTR: # If it is a VT_PTR to a VT_USERDEFINED that is an IDispatch/IUnknown, # then it resolves to simply the object. # Otherwise, it becomes a ByRef of the resolved type # We need to drop an indirection level on pointer to user defined interfaces. # eg, (VT_PTR, (VT_USERDEFINED, somehandle)) needs to become VT_DISPATCH # only when "somehandle" is an object. # but (VT_PTR, (VT_USERDEFINED, otherhandle)) doesnt get the indirection dropped. was_user = type(subrepr)==tuple and subrepr[0]==pythoncom.VT_USERDEFINED subrepr, sub_clsid, sub_doc = _ResolveType(subrepr, itypeinfo) if was_user and subrepr in [pythoncom.VT_DISPATCH, pythoncom.VT_UNKNOWN, pythoncom.VT_RECORD]: # Drop the VT_PTR indirection return subrepr, sub_clsid, sub_doc # Change PTR indirection to byref return subrepr | pythoncom.VT_BYREF, sub_clsid, sub_doc if indir_vt == pythoncom.VT_SAFEARRAY: # resolve the array element, and convert to VT_ARRAY subrepr, sub_clsid, sub_doc = _ResolveType(subrepr, itypeinfo) return pythoncom.VT_ARRAY | subrepr, sub_clsid, sub_doc if indir_vt == pythoncom.VT_CARRAY: # runtime has no support for this yet. # resolve the array element, and convert to VT_CARRAY # sheesh - return _something_ return pythoncom.VT_CARRAY, None, None if indir_vt == pythoncom.VT_USERDEFINED: try: resultTypeInfo = itypeinfo.GetRefTypeInfo(subrepr) except pythoncom.com_error as details: if details.hresult in [winerror.TYPE_E_CANTLOADLIBRARY, winerror.TYPE_E_LIBNOTREGISTERED]: # an unregistered interface return pythoncom.VT_UNKNOWN, None, None raise resultAttr = resultTypeInfo.GetTypeAttr() typeKind = resultAttr.typekind if typeKind == pythoncom.TKIND_ALIAS: tdesc = resultAttr.tdescAlias return _ResolveType(tdesc, resultTypeInfo) elif typeKind in [pythoncom.TKIND_ENUM, pythoncom.TKIND_MODULE]: # For now, assume Long return pythoncom.VT_I4, None, None elif typeKind == pythoncom.TKIND_DISPATCH: clsid = resultTypeInfo.GetTypeAttr()[0] retdoc = resultTypeInfo.GetDocumentation(-1) return pythoncom.VT_DISPATCH, clsid, retdoc elif typeKind in [pythoncom.TKIND_INTERFACE, pythoncom.TKIND_COCLASS]: # XXX - should probably get default interface for CO_CLASS??? clsid = resultTypeInfo.GetTypeAttr()[0] retdoc = resultTypeInfo.GetDocumentation(-1) return pythoncom.VT_UNKNOWN, clsid, retdoc elif typeKind == pythoncom.TKIND_RECORD: return pythoncom.VT_RECORD, None, None raise NotSupportedException("Can not resolve alias or user-defined type") return typeSubstMap.get(typerepr,typerepr), None, None def _BuildArgList(fdesc, names): "Builds list of args to the underlying Invoke method." # Word has TypeInfo for Insert() method, but says "no args" numArgs = max(fdesc[6], len(fdesc[2])) names = list(names) while None in names: i = names.index(None) names[i] = "arg%d" % (i,) # We've seen 'source safe' libraries offer the name of 'ret' params in # 'names' - although we can't reproduce this, it would be insane to offer # more args than we have arg infos for - hence the upper limit on names... names = list(map(MakePublicAttributeName, names[1:(numArgs + 1)])) name_num = 0 while len(names) < numArgs: names.append("arg%d" % (len(names),)) # As per BuildCallList(), avoid huge lines. # Hack a "\n" at the end of every 5th name - "strides" would be handy # here but don't exist in 2.2 for i in range(0, len(names), 5): names[i] = names[i] + "\n\t\t\t" return "," + ", ".join(names) valid_identifier_chars = string.ascii_letters + string.digits + "_" def demunge_leading_underscores(className): i = 0 while className[i] == "_": i += 1 assert i >= 2, "Should only be here with names starting with '__'" return className[i-1:] + className[:i-1] # Given a "public name" (eg, the name of a class, function, etc) # make sure it is a legal (and reasonable!) Python name. def MakePublicAttributeName(className, is_global = False): # Given a class attribute that needs to be public, convert it to a # reasonable name. # Also need to be careful that the munging doesnt # create duplicates - eg, just removing a leading "_" is likely to cause # a clash. # if is_global is True, then the name is a global variable that may # overwrite a builtin - eg, "None" if className[:2]=='__': return demunge_leading_underscores(className) elif className == 'None': # assign to None is evil (and SyntaxError in 2.4, even though # iskeyword says False there) - note that if it was a global # it would get picked up below className = 'NONE' elif iskeyword(className): # most keywords are lower case (except True, False etc in py3k) ret = className.capitalize() # but those which aren't get forced upper. if ret == className: ret = ret.upper() return ret elif is_global and hasattr(__builtins__, className): # builtins may be mixed case. If capitalizing it doesn't change it, # force to all uppercase (eg, "None", "True" become "NONE", "TRUE" ret = className.capitalize() if ret==className: # didn't change - force all uppercase. ret = ret.upper() return ret # Strip non printable chars return ''.join([char for char in className if char in valid_identifier_chars]) # Given a default value passed by a type library, return a string with # an appropriate repr() for the type. # Takes a raw ELEMDESC and returns a repr string, or None # (NOTE: The string itself may be '"None"', which is valid, and different to None. # XXX - To do: Dates are probably screwed, but can they come in? def MakeDefaultArgRepr(defArgVal): try: inOut = defArgVal[1] except IndexError: # something strange - assume is in param. inOut = pythoncom.PARAMFLAG_FIN if inOut & pythoncom.PARAMFLAG_FHASDEFAULT: # times need special handling... val = defArgVal[2] if isinstance(val, datetime.datetime): # VARIANT <-> SYSTEMTIME conversions always lose any sub-second # resolution, so just use a 'timetuple' here. return repr(tuple(val.utctimetuple())) if type(val) is TimeType: # must be the 'old' pywintypes time object... year=val.year; month=val.month; day=val.day; hour=val.hour; minute=val.minute; second=val.second; msec=val.msec return "pywintypes.Time((%(year)d, %(month)d, %(day)d, %(hour)d, %(minute)d, %(second)d,0,0,0,%(msec)d))" % locals() return repr(val) return None def BuildCallList(fdesc, names, defNamedOptArg, defNamedNotOptArg, defUnnamedArg, defOutArg, is_comment = False): "Builds a Python declaration for a method." # Names[0] is the func name - param names are from 1. numArgs = len(fdesc[2]) numOptArgs = fdesc[6] strval = '' if numOptArgs==-1: # Special value that says "var args after here" firstOptArg = numArgs numArgs = numArgs - 1 else: firstOptArg = numArgs - numOptArgs for arg in range(numArgs): try: argName = names[arg+1] namedArg = argName is not None except IndexError: namedArg = 0 if not namedArg: argName = "arg%d" % (arg) thisdesc = fdesc[2][arg] # See if the IDL specified a default value defArgVal = MakeDefaultArgRepr(thisdesc) if defArgVal is None: # Out params always get their special default if thisdesc[1] & (pythoncom.PARAMFLAG_FOUT | pythoncom.PARAMFLAG_FIN) == pythoncom.PARAMFLAG_FOUT: defArgVal = defOutArg else: # Unnamed arg - always allow default values. if namedArg: # Is a named argument if arg >= firstOptArg: defArgVal = defNamedOptArg else: defArgVal = defNamedNotOptArg else: defArgVal = defUnnamedArg argName = MakePublicAttributeName(argName) # insanely long lines with an 'encoding' flag crashes python 2.4.0 # keep 5 args per line # This may still fail if the arg names are insane, but that seems # unlikely. See also _BuildArgList() if (arg+1) % 5 == 0: strval = strval + "\n" if is_comment: strval = strval + "#" strval = strval + "\t\t\t" strval = strval + ", " + argName if defArgVal: strval = strval + "=" + defArgVal if numOptArgs==-1: strval = strval + ", *" + names[-1] return strval if __name__=='__main__': print("Use 'makepy.py' to generate Python code - this module is just a helper") PK nWQڡY0Y0win32com/client/makepy.pyUT ;_Zx`ux # Originally written by Curt Hagenlocher, and various bits # and pieces by Mark Hammond (and now Greg Stein has had # a go too :-) # Note that the main worker code has been moved to genpy.py # As this is normally run from the command line, it reparses the code each time. # Now this is nothing more than the command line handler and public interface. # XXX - TO DO # XXX - Greg and Mark have some ideas for a revamp - just no # time - if you want to help, contact us for details. # Main idea is to drop the classes exported and move to a more # traditional data driven model. """Generate a .py file from an OLE TypeLibrary file. This module is concerned only with the actual writing of a .py file. It draws on the @build@ module, which builds the knowledge of a COM interface. """ usageHelp = """ \ Usage: makepy.py [-i] [-v|q] [-h] [-u] [-o output_file] [-d] [typelib, ...] -i -- Show information for the specified typelib. -v -- Verbose output. -q -- Quiet output. -h -- Do not generate hidden methods. -u -- Python 1.5 and earlier: Do NOT convert all Unicode objects to strings. Python 1.6 and later: Convert all Unicode objects to strings. -o -- Create output in a specified output file. If the path leading to the file does not exist, any missing directories will be created. NOTE: -o cannot be used with -d. This will generate an error. -d -- Generate the base code now and the class code on demand. Recommended for large type libraries. typelib -- A TLB, DLL, OCX or anything containing COM type information. If a typelib is not specified, a window containing a textbox will open from which you can select a registered type library. Examples: makepy.py -d Presents a list of registered type libraries from which you can make a selection. makepy.py -d "Microsoft Excel 8.0 Object Library" Generate support for the type library with the specified description (in this case, the MS Excel object model). """ import sys, os, importlib, pythoncom from win32com.client import genpy, selecttlb, gencache from win32com.client import Dispatch bForDemandDefault = 0 # Default value of bForDemand - toggle this to change the world - see also gencache.py error = "makepy.error" def usage(): sys.stderr.write (usageHelp) sys.exit(2) def ShowInfo(spec): if not spec: tlbSpec = selecttlb.SelectTlb(excludeFlags=selecttlb.FLAG_HIDDEN) if tlbSpec is None: return try: tlb = pythoncom.LoadRegTypeLib(tlbSpec.clsid, tlbSpec.major, tlbSpec.minor, tlbSpec.lcid) except pythoncom.com_error: # May be badly registered. sys.stderr.write("Warning - could not load registered typelib '%s'\n" % (tlbSpec.clsid)) tlb = None infos = [(tlb, tlbSpec)] else: infos = GetTypeLibsForSpec(spec) for (tlb, tlbSpec) in infos: desc = tlbSpec.desc if desc is None: if tlb is None: desc = "" % (tlbSpec.dll) else: desc = tlb.GetDocumentation(-1)[0] print(desc) print(" %s, lcid=%s, major=%s, minor=%s" % (tlbSpec.clsid, tlbSpec.lcid, tlbSpec.major, tlbSpec.minor)) print(" >>> # Use these commands in Python code to auto generate .py support") print(" >>> from win32com.client import gencache") print(" >>> gencache.EnsureModule('%s', %s, %s, %s)" % (tlbSpec.clsid, tlbSpec.lcid, tlbSpec.major, tlbSpec.minor)) class SimpleProgress(genpy.GeneratorProgress): """A simple progress class prints its output to stderr """ def __init__(self, verboseLevel): self.verboseLevel = verboseLevel def Close(self): pass def Finished(self): if self.verboseLevel>1: sys.stderr.write("Generation complete..\n") def SetDescription(self, desc, maxticks = None): if self.verboseLevel: sys.stderr.write(desc + "\n") def Tick(self, desc = None): pass def VerboseProgress(self, desc, verboseLevel = 2): if self.verboseLevel >= verboseLevel: sys.stderr.write(desc + "\n") def LogBeginGenerate(self, filename): self.VerboseProgress("Generating to %s" % filename, 1) def LogWarning(self, desc): self.VerboseProgress("WARNING: " + desc, 1) class GUIProgress(SimpleProgress): def __init__(self, verboseLevel): # Import some modules we need to we can trap failure now. import win32ui, pywin SimpleProgress.__init__(self, verboseLevel) self.dialog = None def Close(self): if self.dialog is not None: self.dialog.Close() self.dialog = None def Starting(self, tlb_desc): SimpleProgress.Starting(self, tlb_desc) if self.dialog is None: from pywin.dialogs import status self.dialog=status.ThreadedStatusProgressDialog(tlb_desc) else: self.dialog.SetTitle(tlb_desc) def SetDescription(self, desc, maxticks = None): self.dialog.SetText(desc) if maxticks: self.dialog.SetMaxTicks(maxticks) def Tick(self, desc = None): self.dialog.Tick() if desc is not None: self.dialog.SetText(desc) def GetTypeLibsForSpec(arg): """Given an argument on the command line (either a file name, library description, or ProgID of an object) return a list of actual typelibs to use. """ typelibs = [] try: try: tlb = pythoncom.LoadTypeLib(arg) spec = selecttlb.TypelibSpec(None, 0,0,0) spec.FromTypelib(tlb, arg) typelibs.append((tlb, spec)) except pythoncom.com_error: # See if it is a description tlbs = selecttlb.FindTlbsWithDescription(arg) if len(tlbs)==0: # Maybe it is the name of a COM object? try: ob = Dispatch(arg) # and if so, it must support typelib info tlb, index = ob._oleobj_.GetTypeInfo().GetContainingTypeLib() spec = selecttlb.TypelibSpec(None, 0,0,0) spec.FromTypelib(tlb) tlbs.append(spec) except pythoncom.com_error: pass if len(tlbs)==0: print("Could not locate a type library matching '%s'" % (arg)) for spec in tlbs: # Version numbers not always reliable if enumerated from registry. # (as some libs use hex, other's dont. Both examples from MS, of course.) if spec.dll is None: tlb = pythoncom.LoadRegTypeLib(spec.clsid, spec.major, spec.minor, spec.lcid) else: tlb = pythoncom.LoadTypeLib(spec.dll) # We have a typelib, but it may not be exactly what we specified # (due to automatic version matching of COM). So we query what we really have! attr = tlb.GetLibAttr() spec.major = attr[3] spec.minor = attr[4] spec.lcid = attr[1] typelibs.append((tlb, spec)) return typelibs except pythoncom.com_error: t,v,tb=sys.exc_info() sys.stderr.write ("Unable to load type library from '%s' - %s\n" % (arg, v)) tb = None # Storing tb in a local is a cycle! sys.exit(1) def GenerateFromTypeLibSpec(typelibInfo, file = None, verboseLevel = None, progressInstance = None, bUnicodeToString=None, bForDemand = bForDemandDefault, bBuildHidden = 1): assert bUnicodeToString is None, "this is deprecated and will go away" if verboseLevel is None: verboseLevel = 0 # By default, we use no gui and no verbose level! if bForDemand and file is not None: raise RuntimeError("You can only perform a demand-build when the output goes to the gen_py directory") if isinstance(typelibInfo, tuple): # Tuple typelibCLSID, lcid, major, minor = typelibInfo tlb = pythoncom.LoadRegTypeLib(typelibCLSID, major, minor, lcid) spec = selecttlb.TypelibSpec(typelibCLSID, lcid, major, minor) spec.FromTypelib(tlb, str(typelibCLSID)) typelibs = [(tlb, spec)] elif isinstance(typelibInfo, selecttlb.TypelibSpec): if typelibInfo.dll is None: # Version numbers not always reliable if enumerated from registry. tlb = pythoncom.LoadRegTypeLib(typelibInfo.clsid, typelibInfo.major, typelibInfo.minor, typelibInfo.lcid) else: tlb = pythoncom.LoadTypeLib(typelibInfo.dll) typelibs = [(tlb, typelibInfo)] elif hasattr(typelibInfo, "GetLibAttr"): # A real typelib object! # Could also use isinstance(typelibInfo, PyITypeLib) instead, but PyITypeLib is not directly exposed by pythoncom. # pythoncom.TypeIIDs[pythoncom.IID_ITypeLib] seems to work tla = typelibInfo.GetLibAttr() guid = tla[0] lcid = tla[1] major = tla[3] minor = tla[4] spec = selecttlb.TypelibSpec(guid, lcid, major, minor) typelibs = [(typelibInfo, spec)] else: typelibs = GetTypeLibsForSpec(typelibInfo) if progressInstance is None: progressInstance = SimpleProgress(verboseLevel) progress = progressInstance bToGenDir = (file is None) for typelib, info in typelibs: gen = genpy.Generator(typelib, info.dll, progress, bBuildHidden=bBuildHidden) if file is None: this_name = gencache.GetGeneratedFileName(info.clsid, info.lcid, info.major, info.minor) full_name = os.path.join(gencache.GetGeneratePath(), this_name) if bForDemand: try: os.unlink(full_name + ".py") except os.error: pass try: os.unlink(full_name + ".pyc") except os.error: pass try: os.unlink(full_name + ".pyo") except os.error: pass if not os.path.isdir(full_name): os.mkdir(full_name) outputName = os.path.join(full_name, "__init__.py") else: outputName = full_name + ".py" fileUse = gen.open_writer(outputName) progress.LogBeginGenerate(outputName) else: fileUse = file worked = False try: gen.generate(fileUse, bForDemand) worked = True finally: if file is None: gen.finish_writer(outputName, fileUse, worked) importlib.invalidate_caches() if bToGenDir: progress.SetDescription("Importing module") gencache.AddModuleToCache(info.clsid, info.lcid, info.major, info.minor) progress.Close() def GenerateChildFromTypeLibSpec(child, typelibInfo, verboseLevel = None, progressInstance = None, bUnicodeToString=None): assert bUnicodeToString is None, "this is deprecated and will go away" if verboseLevel is None: verboseLevel = 0 # By default, we use no gui, and no verbose level for the children. if type(typelibInfo)==type(()): typelibCLSID, lcid, major, minor = typelibInfo tlb = pythoncom.LoadRegTypeLib(typelibCLSID, major, minor, lcid) else: tlb = typelibInfo tla = typelibInfo.GetLibAttr() typelibCLSID = tla[0] lcid = tla[1] major = tla[3] minor = tla[4] spec = selecttlb.TypelibSpec(typelibCLSID, lcid, major, minor) spec.FromTypelib(tlb, str(typelibCLSID)) typelibs = [(tlb, spec)] if progressInstance is None: progressInstance = SimpleProgress(verboseLevel) progress = progressInstance for typelib, info in typelibs: dir_name = gencache.GetGeneratedFileName(info.clsid, info.lcid, info.major, info.minor) dir_path_name = os.path.join(gencache.GetGeneratePath(), dir_name) progress.LogBeginGenerate(dir_path_name) gen = genpy.Generator(typelib, info.dll, progress) gen.generate_child(child, dir_path_name) progress.SetDescription("Importing module") importlib.invalidate_caches() __import__("win32com.gen_py." + dir_name + "." + child) progress.Close() def main(): import getopt hiddenSpec = 1 outputName = None verboseLevel = 1 doit = 1 bForDemand = bForDemandDefault try: opts, args = getopt.getopt(sys.argv[1:], 'vo:huiqd') for o,v in opts: if o=='-h': hiddenSpec = 0 elif o=='-o': outputName = v elif o=='-v': verboseLevel = verboseLevel + 1 elif o=='-q': verboseLevel = verboseLevel - 1 elif o=='-i': if len(args)==0: ShowInfo(None) else: for arg in args: ShowInfo(arg) doit = 0 elif o=='-d': bForDemand = not bForDemand except (getopt.error, error) as msg: sys.stderr.write (str(msg) + "\n") usage() if bForDemand and outputName is not None: sys.stderr.write("Can not use -d and -o together\n") usage() if not doit: return 0 if len(args)==0: rc = selecttlb.SelectTlb() if rc is None: sys.exit(1) args = [ rc ] if outputName is not None: path = os.path.dirname(outputName) if path != '' and not os.path.exists(path): os.makedirs(path) if sys.version_info > (3,0): f = open(outputName, "wt", encoding="mbcs") else: import codecs # not available in py3k. f = codecs.open(outputName, "w", "mbcs") else: f = None for arg in args: GenerateFromTypeLibSpec(arg, f, verboseLevel = verboseLevel, bForDemand = bForDemand, bBuildHidden = hiddenSpec) if f: f.close() if __name__=='__main__': rc = main() if rc: sys.exit(rc) sys.exit(0) PK %DQV win32com/client/connect.pyUT Sy_Zx`ux """Utilities for working with Connections""" import win32com.server.util, pythoncom class SimpleConnection: "A simple, single connection object" def __init__(self, coInstance = None, eventInstance = None, eventCLSID = None, debug = 0): self.cp = None self.cookie = None self.debug = debug if not coInstance is None: self.Connect(coInstance , eventInstance, eventCLSID) def __del__(self): try: self.Disconnect() except pythoncom.error: # Ignore disconnection as we are torn down. pass def _wrap(self, obj): useDispatcher = None if self.debug: from win32com.server import dispatcher useDispatcher = dispatcher.DefaultDebugDispatcher return win32com.server.util.wrap(obj, useDispatcher=useDispatcher) def Connect(self, coInstance, eventInstance, eventCLSID = None): try: oleobj = coInstance._oleobj_ except AttributeError: oleobj = coInstance cpc=oleobj.QueryInterface(pythoncom.IID_IConnectionPointContainer) if eventCLSID is None: eventCLSID = eventInstance.CLSID comEventInstance = self._wrap(eventInstance) self.cp=cpc.FindConnectionPoint(eventCLSID) self.cookie = self.cp.Advise(comEventInstance) def Disconnect(self): if not self.cp is None: if self.cookie: self.cp.Unadvise(self.cookie) self.cookie = None self.cp = None PK %DQf win32com/client/util.pyUT Sy_Zx`ux """General client side utilities. This module contains utility functions, used primarily by advanced COM programmers, or other COM modules. """ import pythoncom from win32com.client import Dispatch, _get_good_object_ PyIDispatchType = pythoncom.TypeIIDs[pythoncom.IID_IDispatch] def WrapEnum(ob, resultCLSID = None): """Wrap an object in a VARIANT enumerator. All VT_DISPATCHs returned by the enumerator are converted to wrapper objects (which may be either a class instance, or a dynamic.Dispatch type object). """ if type(ob) != pythoncom.TypeIIDs[pythoncom.IID_IEnumVARIANT]: ob = ob.QueryInterface(pythoncom.IID_IEnumVARIANT) return EnumVARIANT(ob, resultCLSID) class Enumerator: """A class that provides indexed access into an Enumerator By wrapping a PyIEnum* object in this class, you can perform natural looping and indexing into the Enumerator. Looping is very efficient, but it should be noted that although random access is supported, the underlying object is still an enumerator, so this will force many reset-and-seek operations to find the requested index. """ def __init__(self, enum): self._oleobj_ = enum # a PyIEnumVARIANT self.index = -1 def __getitem__(self, index): return self.__GetIndex(index) def __call__(self, index): return self.__GetIndex(index) def __GetIndex(self, index): if type(index)!=type(0): raise TypeError("Only integer indexes are supported for enumerators") # NOTE # In this context, self.index is users purely as a flag to say # "am I still in sequence". The user may call Next() or Reset() if they # so choose, in which case self.index will not be correct (although we # still want to stay in sequence) if index != self.index + 1: # Index requested out of sequence. self._oleobj_.Reset() if index: self._oleobj_.Skip(index) # if asked for item 1, must skip 1, Python always zero based. self.index = index result = self._oleobj_.Next(1) if len(result): return self._make_retval_(result[0]) raise IndexError("list index out of range") def Next(self, count=1): ret = self._oleobj_.Next(count) realRets = [] for r in ret: realRets.append(self._make_retval_(r)) return tuple(realRets) # Convert back to tuple. def Reset(self): return self._oleobj_.Reset() def Clone(self): return self.__class__( self._oleobj_.Clone(), self.resultCLSID) def _make_retval_(self, result): return result class EnumVARIANT(Enumerator): def __init__(self, enum, resultCLSID = None): self.resultCLSID = resultCLSID Enumerator.__init__(self, enum) def _make_retval_(self, result): return _get_good_object_(result, resultCLSID = self.resultCLSID) class Iterator: def __init__(self, enum, resultCLSID = None): self.resultCLSID = resultCLSID self._iter_ = iter(enum.QueryInterface(pythoncom.IID_IEnumVARIANT)) def __iter__(self): return self def __next__(self): return _get_good_object_(next(self._iter_), resultCLSID = self.resultCLSID) PK %DQcaLXXwin32com/client/__init__.pyUT Sy_Zx`ux # This module exists to create the "best" dispatch object for a given # object. If "makepy" support for a given object is detected, it is # used, otherwise a dynamic dispatch object. # Note that if the unknown dispatch object then returns a known # dispatch object, the known class will be used. This contrasts # with dynamic.Dispatch behaviour, where dynamic objects are always used. import pythoncom from . import dynamic from . import gencache import sys import pywintypes _PyIDispatchType = pythoncom.TypeIIDs[pythoncom.IID_IDispatch] def __WrapDispatch(dispatch, userName = None, resultCLSID = None, typeinfo = None, \ UnicodeToString=None, clsctx = pythoncom.CLSCTX_SERVER, WrapperClass = None): """ Helper function to return a makepy generated class for a CLSID if it exists, otherwise cope by using CDispatch. """ assert UnicodeToString is None, "this is deprecated and will go away" if resultCLSID is None: try: typeinfo = dispatch.GetTypeInfo() if typeinfo is not None: # Some objects return NULL, some raise exceptions... resultCLSID = str(typeinfo.GetTypeAttr()[0]) except (pythoncom.com_error, AttributeError): pass if resultCLSID is not None: from . import gencache # Attempt to load generated module support # This may load the module, and make it available klass = gencache.GetClassForCLSID(resultCLSID) if klass is not None: return klass(dispatch) # Return a "dynamic" object - best we can do! if WrapperClass is None: WrapperClass = CDispatch return dynamic.Dispatch(dispatch, userName, WrapperClass, typeinfo, clsctx=clsctx) def GetObject(Pathname = None, Class = None, clsctx = None): """ Mimic VB's GetObject() function. ob = GetObject(Class = "ProgID") or GetObject(Class = clsid) will connect to an already running instance of the COM object. ob = GetObject(r"c:\blah\blah\foo.xls") (aka the COM moniker syntax) will return a ready to use Python wrapping of the required COM object. Note: You must specifiy one or the other of these arguments. I know this isn't pretty, but it is what VB does. Blech. If you don't I'll throw ValueError at you. :) This will most likely throw pythoncom.com_error if anything fails. """ if clsctx is None: clsctx = pythoncom.CLSCTX_ALL if (Pathname is None and Class is None) or \ (Pathname is not None and Class is not None): raise ValueError("You must specify a value for Pathname or Class, but not both.") if Class is not None: return GetActiveObject(Class, clsctx) else: return Moniker(Pathname, clsctx) def GetActiveObject(Class, clsctx = pythoncom.CLSCTX_ALL): """ Python friendly version of GetObject's ProgID/CLSID functionality. """ resultCLSID = pywintypes.IID(Class) dispatch = pythoncom.GetActiveObject(resultCLSID) dispatch = dispatch.QueryInterface(pythoncom.IID_IDispatch) return __WrapDispatch(dispatch, Class, resultCLSID = resultCLSID, clsctx = clsctx) def Moniker(Pathname, clsctx = pythoncom.CLSCTX_ALL): """ Python friendly version of GetObject's moniker functionality. """ moniker, i, bindCtx = pythoncom.MkParseDisplayName(Pathname) dispatch = moniker.BindToObject(bindCtx, None, pythoncom.IID_IDispatch) return __WrapDispatch(dispatch, Pathname, clsctx=clsctx) def Dispatch(dispatch, userName = None, resultCLSID = None, typeinfo = None, UnicodeToString=None, clsctx = pythoncom.CLSCTX_SERVER): """Creates a Dispatch based COM object. """ assert UnicodeToString is None, "this is deprecated and will go away" dispatch, userName = dynamic._GetGoodDispatchAndUserName(dispatch,userName,clsctx) return __WrapDispatch(dispatch, userName, resultCLSID, typeinfo, clsctx=clsctx) def DispatchEx(clsid, machine=None, userName = None, resultCLSID = None, typeinfo = None, UnicodeToString=None, clsctx = None): """Creates a Dispatch based COM object on a specific machine. """ assert UnicodeToString is None, "this is deprecated and will go away" # If InProc is registered, DCOM will use it regardless of the machine name # (and regardless of the DCOM config for the object.) So unless the user # specifies otherwise, we exclude inproc apps when a remote machine is used. if clsctx is None: clsctx = pythoncom.CLSCTX_SERVER if machine is not None: clsctx = clsctx & ~pythoncom.CLSCTX_INPROC if machine is None: serverInfo = None else: serverInfo = (machine,) if userName is None: userName = clsid dispatch = pythoncom.CoCreateInstanceEx(clsid, None, clsctx, serverInfo, (pythoncom.IID_IDispatch,))[0] return Dispatch(dispatch, userName, resultCLSID, typeinfo, clsctx=clsctx) class CDispatch(dynamic.CDispatch): """ The dynamic class used as a last resort. The purpose of this overriding of dynamic.CDispatch is to perpetuate the policy of using the makepy generated wrapper Python class instead of dynamic.CDispatch if/when possible. """ def _wrap_dispatch_(self, ob, userName = None, returnCLSID = None, UnicodeToString=None): assert UnicodeToString is None, "this is deprecated and will go away" return Dispatch(ob, userName, returnCLSID,None) def CastTo(ob, target, typelib = None): """'Cast' a COM object to another interface""" # todo - should support target being an IID mod = None if typelib is not None: # caller specified target typelib (TypelibSpec). See e.g. selecttlb.EnumTlbs(). mod = gencache.MakeModuleForTypelib(typelib.clsid, typelib.lcid, int(typelib.major, 16), int(typelib.minor, 16)) if not hasattr(mod, target): raise ValueError("The interface name '%s' does not appear in the " \ "specified library %r" % (target, typelib.ver_desc)) elif hasattr(target, "index"): # string like # for now, we assume makepy for this to work. if "CLSID" not in ob.__class__.__dict__: # Eeek - no makepy support - try and build it. ob = gencache.EnsureDispatch(ob) if "CLSID" not in ob.__class__.__dict__: raise ValueError("Must be a makepy-able object for this to work") clsid = ob.CLSID # Lots of hoops to support "demand-build" - ie, generating # code for an interface first time it is used. We assume the # interface name exists in the same library as the object. # This is generally the case - only referenced typelibs may be # a problem, and we can handle that later. Maybe # So get the generated module for the library itself, then # find the interface CLSID there. mod = gencache.GetModuleForCLSID(clsid) # Get the 'root' module. mod = gencache.GetModuleForTypelib(mod.CLSID, mod.LCID, mod.MajorVersion, mod.MinorVersion) # Find the CLSID of the target target_clsid = mod.NamesToIIDMap.get(target) if target_clsid is None: raise ValueError("The interface name '%s' does not appear in the " \ "same library as object '%r'" % (target, ob)) mod = gencache.GetModuleForCLSID(target_clsid) if mod is not None: target_class = getattr(mod, target) # resolve coclass to interface target_class = getattr(target_class, "default_interface", target_class) return target_class(ob) # auto QI magic happens raise ValueError class Constants: """A container for generated COM constants. """ def __init__(self): self.__dicts__ = [] # A list of dictionaries def __getattr__(self, a): for d in self.__dicts__: if a in d: return d[a] raise AttributeError(a) # And create an instance. constants = Constants() # A helpers for DispatchWithEvents - this becomes __setattr__ for the # temporary class. def _event_setattr_(self, attr, val): try: # Does the COM object have an attribute of this name? self.__class__.__bases__[0].__setattr__(self, attr, val) except AttributeError: # Otherwise just stash it away in the instance. self.__dict__[attr] = val # An instance of this "proxy" is created to break the COM circular references # that exist (ie, when we connect to the COM events, COM keeps a reference # to the object. Thus, the Event connection must be manually broken before # our object can die. This solves the problem by manually breaking the connection # to the real object as the proxy dies. class EventsProxy: def __init__(self, ob): self.__dict__['_obj_'] = ob def __del__(self): try: # If there is a COM error on disconnection we should # just ignore it - object probably already shut down... self._obj_.close() except pythoncom.com_error: pass def __getattr__(self, attr): return getattr(self._obj_, attr) def __setattr__(self, attr, val): setattr(self._obj_, attr, val) def DispatchWithEvents(clsid, user_event_class): """Create a COM object that can fire events to a user defined class. clsid -- The ProgID or CLSID of the object to create. user_event_class -- A Python class object that responds to the events. This requires makepy support for the COM object being created. If this support does not exist it will be automatically generated by this function. If the object does not support makepy, a TypeError exception will be raised. The result is a class instance that both represents the COM object and handles events from the COM object. It is important to note that the returned instance is not a direct instance of the user_event_class, but an instance of a temporary class object that derives from three classes: * The makepy generated class for the COM object * The makepy generated class for the COM events * The user_event_class as passed to this function. If this is not suitable, see the getevents function for an alternative technique of handling events. Object Lifetimes: Whenever the object returned from this function is cleaned-up by Python, the events will be disconnected from the COM object. This is almost always what should happen, but see the documentation for getevents() for more details. Example: >>> class IEEvents: ... def OnVisible(self, visible): ... print "Visible changed:", visible ... >>> ie = DispatchWithEvents("InternetExplorer.Application", IEEvents) >>> ie.Visible = 1 Visible changed: 1 >>> """ # Create/Get the object. disp = Dispatch(clsid) if not disp.__class__.__dict__.get("CLSID"): # Eeek - no makepy support - try and build it. try: ti = disp._oleobj_.GetTypeInfo() disp_clsid = ti.GetTypeAttr()[0] tlb, index = ti.GetContainingTypeLib() tla = tlb.GetLibAttr() gencache.EnsureModule(tla[0], tla[1], tla[3], tla[4], bValidateFile=0) # Get the class from the module. disp_class = gencache.GetClassForProgID(str(disp_clsid)) except pythoncom.com_error: raise TypeError("This COM object can not automate the makepy process - please run makepy manually for this object") else: disp_class = disp.__class__ # If the clsid was an object, get the clsid clsid = disp_class.CLSID # Create a new class that derives from 3 classes - the dispatch class, the event sink class and the user class. # XXX - we are still "classic style" classes in py2x, so we need can't yet # use 'type()' everywhere - revisit soon, as py2x will move to new-style too... try: from types import ClassType as new_type except ImportError: new_type = type # py3k events_class = getevents(clsid) if events_class is None: raise ValueError("This COM object does not support events.") result_class = new_type("COMEventClass", (disp_class, events_class, user_event_class), {"__setattr__" : _event_setattr_}) instance = result_class(disp._oleobj_) # This only calls the first base class __init__. events_class.__init__(instance, instance) if hasattr(user_event_class, "__init__"): user_event_class.__init__(instance) return EventsProxy(instance) def WithEvents(disp, user_event_class): """Similar to DispatchWithEvents - except that the returned object is *not* also usable as the original Dispatch object - that is the returned object is not dispatchable. The difference is best summarised by example. >>> class IEEvents: ... def OnVisible(self, visible): ... print "Visible changed:", visible ... >>> ie = Dispatch("InternetExplorer.Application") >>> ie_events = WithEvents(ie, IEEvents) >>> ie.Visible = 1 Visible changed: 1 Compare with the code sample for DispatchWithEvents, where you get a single object that is both the interface and the event handler. Note that the event handler instance will *not* be able to use 'self.' to refer to IE's methods and properties. This is mainly useful where using DispatchWithEvents causes circular reference problems that the simple proxy doesn't deal with """ disp = Dispatch(disp) if not disp.__class__.__dict__.get("CLSID"): # Eeek - no makepy support - try and build it. try: ti = disp._oleobj_.GetTypeInfo() disp_clsid = ti.GetTypeAttr()[0] tlb, index = ti.GetContainingTypeLib() tla = tlb.GetLibAttr() gencache.EnsureModule(tla[0], tla[1], tla[3], tla[4], bValidateFile=0) # Get the class from the module. disp_class = gencache.GetClassForProgID(str(disp_clsid)) except pythoncom.com_error: raise TypeError("This COM object can not automate the makepy process - please run makepy manually for this object") else: disp_class = disp.__class__ # Get the clsid clsid = disp_class.CLSID # Create a new class that derives from 2 classes - the event sink # class and the user class. try: from types import ClassType as new_type except ImportError: new_type = type # py3k events_class = getevents(clsid) if events_class is None: raise ValueError("This COM object does not support events.") result_class = new_type("COMEventClass", (events_class, user_event_class), {}) instance = result_class(disp) # This only calls the first base class __init__. if hasattr(user_event_class, "__init__"): user_event_class.__init__(instance) return instance def getevents(clsid): """Determine the default outgoing interface for a class, given either a clsid or progid. It returns a class - you can conveniently derive your own handler from this class and implement the appropriate methods. This method relies on the classes produced by makepy. You must use either makepy or the gencache module to ensure that the appropriate support classes have been generated for the com server that you will be handling events from. Beware of COM circular references. When the Events class is connected to the COM object, the COM object itself keeps a reference to the Python events class. Thus, neither the Events instance or the COM object will ever die by themselves. The 'close' method on the events instance must be called to break this chain and allow standard Python collection rules to manage object lifetimes. Note that DispatchWithEvents() does work around this problem by the use of a proxy object, but if you use the getevents() function yourself, you must make your own arrangements to manage this circular reference issue. Beware of creating Python circular references: this will happen if your handler has a reference to an object that has a reference back to the event source. Call the 'close' method to break the chain. Example: >>>win32com.client.gencache.EnsureModule('{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}',0,1,1) >> >>> class InternetExplorerEvents(win32com.client.getevents("InternetExplorer.Application.1")): ... def OnVisible(self, Visible): ... print "Visibility changed: ", Visible ... >>> >>> ie=win32com.client.Dispatch("InternetExplorer.Application.1") >>> events=InternetExplorerEvents(ie) >>> ie.Visible=1 Visibility changed: 1 >>> """ # find clsid given progid or clsid clsid=str(pywintypes.IID(clsid)) # return default outgoing interface for that class klass = gencache.GetClassForCLSID(clsid) try: return klass.default_source except AttributeError: # See if we have a coclass for the interfaces. try: return gencache.GetClassForCLSID(klass.coclass_clsid).default_source except AttributeError: return None # A Record object, as used by the COM struct support def Record(name, object): """Creates a new record object, given the name of the record, and an object from the same type library. Example usage would be: app = win32com.client.Dispatch("Some.Application") point = win32com.client.Record("SomeAppPoint", app) point.x = 0 point.y = 0 app.MoveTo(point) """ # XXX - to do - probably should allow "object" to already be a module object. from . import gencache object = gencache.EnsureDispatch(object) module = sys.modules[object.__class__.__module__] # to allow us to work correctly with "demand generated" code, # we must use the typelib CLSID to obtain the module # (otherwise we get the sub-module for the object, which # does not hold the records) # thus, package may be module, or may be module's parent if demand generated. package = gencache.GetModuleForTypelib(module.CLSID, module.LCID, module.MajorVersion, module.MinorVersion) try: struct_guid = package.RecordMap[name] except KeyError: raise ValueError("The structure '%s' is not defined in module '%s'" % (name, package)) return pythoncom.GetRecordFromGuids(module.CLSID, module.MajorVersion, module.MinorVersion, module.LCID, struct_guid) ############################################ # The base of all makepy generated classes ############################################ class DispatchBaseClass: def __init__(self, oobj=None): if oobj is None: oobj = pythoncom.new(self.CLSID) elif isinstance(oobj, DispatchBaseClass): try: oobj = oobj._oleobj_.QueryInterface(self.CLSID, pythoncom.IID_IDispatch) # Must be a valid COM instance except pythoncom.com_error as details: import winerror # Some stupid objects fail here, even tho it is _already_ IDispatch!!?? # Eg, Lotus notes. # So just let it use the existing object if E_NOINTERFACE if details.hresult != winerror.E_NOINTERFACE: raise oobj = oobj._oleobj_ self.__dict__["_oleobj_"] = oobj # so we dont call __setattr__ # Provide a prettier name than the CLSID def __repr__(self): # Need to get the docstring for the module for this class. try: mod_doc = sys.modules[self.__class__.__module__].__doc__ if mod_doc: mod_name = "win32com.gen_py." + mod_doc else: mod_name = sys.modules[self.__class__.__module__].__name__ except KeyError: mod_name = "win32com.gen_py.unknown" return "<%s.%s instance at 0x%s>" % (mod_name, self.__class__.__name__, id(self)) # Delegate comparison to the oleobjs, as they know how to do identity. def __eq__(self, other): other = getattr(other, "_oleobj_", other) return self._oleobj_ == other def __ne__(self, other): other = getattr(other, "_oleobj_", other) return self._oleobj_ != other def _ApplyTypes_(self, dispid, wFlags, retType, argTypes, user, resultCLSID, *args): return self._get_good_object_( self._oleobj_.InvokeTypes(dispid, 0, wFlags, retType, argTypes, *args), user, resultCLSID) def __getattr__(self, attr): args=self._prop_map_get_.get(attr) if args is None: raise AttributeError("'%s' object has no attribute '%s'" % (repr(self), attr)) return self._ApplyTypes_(*args) def __setattr__(self, attr, value): if attr in self.__dict__: self.__dict__[attr] = value; return try: args, defArgs=self._prop_map_put_[attr] except KeyError: raise AttributeError("'%s' object has no attribute '%s'" % (repr(self), attr)) self._oleobj_.Invoke(*(args + (value,) + defArgs)) def _get_good_single_object_(self, obj, obUserName=None, resultCLSID=None): return _get_good_single_object_(obj, obUserName, resultCLSID) def _get_good_object_(self, obj, obUserName=None, resultCLSID=None): return _get_good_object_(obj, obUserName, resultCLSID) # XXX - These should be consolidated with dynamic.py versions. def _get_good_single_object_(obj, obUserName=None, resultCLSID=None): if _PyIDispatchType==type(obj): return Dispatch(obj, obUserName, resultCLSID) return obj def _get_good_object_(obj, obUserName=None, resultCLSID=None): if obj is None: return None elif isinstance(obj, tuple): obUserNameTuple = (obUserName,) * len(obj) resultCLSIDTuple = (resultCLSID,) * len(obj) return tuple(map(_get_good_object_, obj, obUserNameTuple, resultCLSIDTuple)) else: return _get_good_single_object_(obj, obUserName, resultCLSID) class CoClassBaseClass: def __init__(self, oobj=None): if oobj is None: oobj = pythoncom.new(self.CLSID) self.__dict__["_dispobj_"] = self.default_interface(oobj) def __repr__(self): return "" % (__doc__, self.__class__.__name__) def __getattr__(self, attr): d=self.__dict__["_dispobj_"] if d is not None: return getattr(d, attr) raise AttributeError(attr) def __setattr__(self, attr, value): if attr in self.__dict__: self.__dict__[attr] = value; return try: d=self.__dict__["_dispobj_"] if d is not None: d.__setattr__(attr, value) return except AttributeError: pass self.__dict__[attr] = value # A very simple VARIANT class. Only to be used with poorly-implemented COM # objects. If an object accepts an arg which is a simple "VARIANT", but still # is very pickly about the actual variant type (eg, isn't happy with a VT_I4, # which it would get from a Python integer), you can use this to force a # particular VT. class VARIANT(object): def __init__(self, vt, value): self.varianttype = vt self._value = value # 'value' is a property so when set by pythoncom it gets any magic wrapping # which normally happens for result objects def _get_value(self): return self._value def _set_value(self, newval): self._value = _get_good_object_(newval) def _del_value(self): del self._value value = property(_get_value, _set_value, _del_value) def __repr__(self): return "win32com.client.VARIANT(%r, %r)" % (self.varianttype, self._value) PK %DQմfSfSwin32com/client/dynamic.pyUT Sy_Zx`ux """Support for dynamic COM client support. Introduction Dynamic COM client support is the ability to use a COM server without prior knowledge of the server. This can be used to talk to almost all COM servers, including much of MS Office. In general, you should not use this module directly - see below. Example >>> import win32com.client >>> xl = win32com.client.Dispatch("Excel.Application") # The line above invokes the functionality of this class. # xl is now an object we can use to talk to Excel. >>> xl.Visible = 1 # The Excel window becomes visible. """ import sys import traceback import types import pythoncom import winerror from . import build from pywintypes import IIDType import win32com.client # Needed as code we eval() references it. debugging=0 # General debugging debugging_attr=0 # Debugging dynamic attribute lookups. LCID = 0x0 # These errors generally mean the property or method exists, # but can't be used in this context - eg, property instead of a method, etc. # Used to determine if we have a real error or not. ERRORS_BAD_CONTEXT = [ winerror.DISP_E_MEMBERNOTFOUND, winerror.DISP_E_BADPARAMCOUNT, winerror.DISP_E_PARAMNOTOPTIONAL, winerror.DISP_E_TYPEMISMATCH, winerror.E_INVALIDARG, ] ALL_INVOKE_TYPES = [ pythoncom.INVOKE_PROPERTYGET, pythoncom.INVOKE_PROPERTYPUT, pythoncom.INVOKE_PROPERTYPUTREF, pythoncom.INVOKE_FUNC ] def debug_print(*args): if debugging: for arg in args: print(arg, end=' ') print() def debug_attr_print(*args): if debugging_attr: for arg in args: print(arg, end=' ') print() def MakeMethod(func, inst, cls): return types.MethodType(func, inst) # get the type objects for IDispatch and IUnknown PyIDispatchType = pythoncom.TypeIIDs[pythoncom.IID_IDispatch] PyIUnknownType = pythoncom.TypeIIDs[pythoncom.IID_IUnknown] _GoodDispatchTypes=(str, IIDType) _defaultDispatchItem=build.DispatchItem def _GetGoodDispatch(IDispatch, clsctx = pythoncom.CLSCTX_SERVER): # quick return for most common case if isinstance(IDispatch, PyIDispatchType): return IDispatch if isinstance(IDispatch, _GoodDispatchTypes): try: IDispatch = pythoncom.connect(IDispatch) except pythoncom.ole_error: IDispatch = pythoncom.CoCreateInstance(IDispatch, None, clsctx, pythoncom.IID_IDispatch) else: # may already be a wrapped class. IDispatch = getattr(IDispatch, "_oleobj_", IDispatch) return IDispatch def _GetGoodDispatchAndUserName(IDispatch, userName, clsctx): # Get a dispatch object, and a 'user name' (ie, the name as # displayed to the user in repr() etc. if userName is None: if isinstance(IDispatch, str): userName = IDispatch ## ??? else userName remains None ??? else: userName = str(userName) return (_GetGoodDispatch(IDispatch, clsctx), userName) def _GetDescInvokeType(entry, invoke_type): # determine the wFlags argument passed as input to IDispatch::Invoke if not entry or not entry.desc: return invoke_type varkind = entry.desc[4] # from VARDESC struct returned by ITypeComp::Bind if varkind == pythoncom.VAR_DISPATCH and invoke_type == pythoncom.INVOKE_PROPERTYGET: return pythoncom.INVOKE_FUNC | invoke_type # DISPATCH_METHOD & DISPATCH_PROPERTYGET can be combined in IDispatch::Invoke else: return varkind def Dispatch(IDispatch, userName = None, createClass = None, typeinfo = None, UnicodeToString=None, clsctx = pythoncom.CLSCTX_SERVER): assert UnicodeToString is None, "this is deprecated and will go away" IDispatch, userName = _GetGoodDispatchAndUserName(IDispatch,userName,clsctx) if createClass is None: createClass = CDispatch lazydata = None try: if typeinfo is None: typeinfo = IDispatch.GetTypeInfo() if typeinfo is not None: try: #try for a typecomp typecomp = typeinfo.GetTypeComp() lazydata = typeinfo, typecomp except pythoncom.com_error: pass except pythoncom.com_error: typeinfo = None olerepr = MakeOleRepr(IDispatch, typeinfo, lazydata) return createClass(IDispatch, olerepr, userName, lazydata=lazydata) def MakeOleRepr(IDispatch, typeinfo, typecomp): olerepr = None if typeinfo is not None: try: attr = typeinfo.GetTypeAttr() # If the type info is a special DUAL interface, magically turn it into # a DISPATCH typeinfo. if attr[5] == pythoncom.TKIND_INTERFACE and attr[11] & pythoncom.TYPEFLAG_FDUAL: # Get corresponding Disp interface; # -1 is a special value which does this for us. href = typeinfo.GetRefTypeOfImplType(-1); typeinfo = typeinfo.GetRefTypeInfo(href) attr = typeinfo.GetTypeAttr() if typecomp is None: olerepr = build.DispatchItem(typeinfo, attr, None, 0) else: olerepr = build.LazyDispatchItem(attr, None) except pythoncom.ole_error: pass if olerepr is None: olerepr = build.DispatchItem() return olerepr def DumbDispatch(IDispatch, userName = None, createClass = None,UnicodeToString=None, clsctx=pythoncom.CLSCTX_SERVER): "Dispatch with no type info" assert UnicodeToString is None, "this is deprecated and will go away" IDispatch, userName = _GetGoodDispatchAndUserName(IDispatch,userName,clsctx) if createClass is None: createClass = CDispatch return createClass(IDispatch, build.DispatchItem(), userName) class CDispatch: def __init__(self, IDispatch, olerepr, userName=None, UnicodeToString=None, lazydata=None): assert UnicodeToString is None, "this is deprecated and will go away" if userName is None: userName = "" self.__dict__['_oleobj_'] = IDispatch self.__dict__['_username_'] = userName self.__dict__['_olerepr_'] = olerepr self.__dict__['_mapCachedItems_'] = {} self.__dict__['_builtMethods_'] = {} self.__dict__['_enum_'] = None self.__dict__['_unicode_to_string_'] = None self.__dict__['_lazydata_'] = lazydata def __call__(self, *args): "Provide 'default dispatch' COM functionality - allow instance to be called" if self._olerepr_.defaultDispatchName: invkind, dispid = self._find_dispatch_type_(self._olerepr_.defaultDispatchName) else: invkind, dispid = pythoncom.DISPATCH_METHOD | pythoncom.DISPATCH_PROPERTYGET, pythoncom.DISPID_VALUE if invkind is not None: allArgs = (dispid,LCID,invkind,1) + args return self._get_good_object_(self._oleobj_.Invoke(*allArgs),self._olerepr_.defaultDispatchName,None) raise TypeError("This dispatch object does not define a default method") def __bool__(self): return True # ie "if object:" should always be "true" - without this, __len__ is tried. # _Possibly_ want to defer to __len__ if available, but Im not sure this is # desirable??? def __repr__(self): return "" % (self._username_) def __str__(self): # __str__ is used when the user does "print object", so we gracefully # fall back to the __repr__ if the object has no default method. try: return str(self.__call__()) except pythoncom.com_error as details: if details.hresult not in ERRORS_BAD_CONTEXT: raise return self.__repr__() # Delegate comparison to the oleobjs, as they know how to do identity. def __eq__(self, other): other = getattr(other, "_oleobj_", other) return self._oleobj_ == other def __ne__(self, other): other = getattr(other, "_oleobj_", other) return self._oleobj_ != other def __int__(self): return int(self.__call__()) def __len__(self): invkind, dispid = self._find_dispatch_type_("Count") if invkind: return self._oleobj_.Invoke(dispid, LCID, invkind, 1) raise TypeError("This dispatch object does not define a Count method") def _NewEnum(self): try: invkind = pythoncom.DISPATCH_METHOD | pythoncom.DISPATCH_PROPERTYGET enum = self._oleobj_.InvokeTypes(pythoncom.DISPID_NEWENUM,LCID,invkind,(13, 10),()) except pythoncom.com_error: return None # no enumerator for this object. from . import util return util.WrapEnum(enum, None) def __getitem__(self, index): # syver modified # Improved __getitem__ courtesy Syver Enstad # Must check _NewEnum before Item, to ensure b/w compat. if isinstance(index, int): if self.__dict__['_enum_'] is None: self.__dict__['_enum_'] = self._NewEnum() if self.__dict__['_enum_'] is not None: return self._get_good_object_(self._enum_.__getitem__(index)) # See if we have an "Item" method/property we can use (goes hand in hand with Count() above!) invkind, dispid = self._find_dispatch_type_("Item") if invkind is not None: return self._get_good_object_(self._oleobj_.Invoke(dispid, LCID, invkind, 1, index)) raise TypeError("This object does not support enumeration") def __setitem__(self, index, *args): # XXX - todo - We should support calling Item() here too! # print "__setitem__ with", index, args if self._olerepr_.defaultDispatchName: invkind, dispid = self._find_dispatch_type_(self._olerepr_.defaultDispatchName) else: invkind, dispid = pythoncom.DISPATCH_PROPERTYPUT | pythoncom.DISPATCH_PROPERTYPUTREF, pythoncom.DISPID_VALUE if invkind is not None: allArgs = (dispid,LCID,invkind,0,index) + args return self._get_good_object_(self._oleobj_.Invoke(*allArgs),self._olerepr_.defaultDispatchName,None) raise TypeError("This dispatch object does not define a default method") def _find_dispatch_type_(self, methodName): if methodName in self._olerepr_.mapFuncs: item = self._olerepr_.mapFuncs[methodName] return item.desc[4], item.dispid if methodName in self._olerepr_.propMapGet: item = self._olerepr_.propMapGet[methodName] return item.desc[4], item.dispid try: dispid = self._oleobj_.GetIDsOfNames(0,methodName) except: ### what error? return None, None return pythoncom.DISPATCH_METHOD | pythoncom.DISPATCH_PROPERTYGET, dispid def _ApplyTypes_(self, dispid, wFlags, retType, argTypes, user, resultCLSID, *args): result = self._oleobj_.InvokeTypes(*(dispid, LCID, wFlags, retType, argTypes) + args) return self._get_good_object_(result, user, resultCLSID) def _wrap_dispatch_(self, ob, userName = None, returnCLSID = None, UnicodeToString=None): # Given a dispatch object, wrap it in a class assert UnicodeToString is None, "this is deprecated and will go away" return Dispatch(ob, userName) def _get_good_single_object_(self,ob,userName = None, ReturnCLSID=None): if isinstance(ob, PyIDispatchType): # make a new instance of (probably this) class. return self._wrap_dispatch_(ob, userName, ReturnCLSID) if isinstance(ob, PyIUnknownType): try: ob = ob.QueryInterface(pythoncom.IID_IDispatch) except pythoncom.com_error: # It is an IUnknown, but not an IDispatch, so just let it through. return ob return self._wrap_dispatch_(ob, userName, ReturnCLSID) return ob def _get_good_object_(self,ob,userName = None, ReturnCLSID=None): """Given an object (usually the retval from a method), make it a good object to return. Basically checks if it is a COM object, and wraps it up. Also handles the fact that a retval may be a tuple of retvals""" if ob is None: # Quick exit! return None elif isinstance(ob, tuple): return tuple(map(lambda o, s=self, oun=userName, rc=ReturnCLSID: s._get_good_single_object_(o, oun, rc), ob)) else: return self._get_good_single_object_(ob) def _make_method_(self, name): "Make a method object - Assumes in olerepr funcmap" methodName = build.MakePublicAttributeName(name) # translate keywords etc. methodCodeList = self._olerepr_.MakeFuncMethod(self._olerepr_.mapFuncs[name], methodName,0) methodCode = "\n".join(methodCodeList) try: # print "Method code for %s is:\n" % self._username_, methodCode # self._print_details_() codeObject = compile(methodCode, "" % self._username_,"exec") # Exec the code object tempNameSpace = {} # "Dispatch" in the exec'd code is win32com.client.Dispatch, not ours. globNameSpace = globals().copy() globNameSpace["Dispatch"] = win32com.client.Dispatch exec(codeObject, globNameSpace, tempNameSpace) # self.__dict__, self.__dict__ name = methodName # Save the function in map. fn = self._builtMethods_[name] = tempNameSpace[name] newMeth = MakeMethod(fn, self, self.__class__) return newMeth except: debug_print("Error building OLE definition for code ", methodCode) traceback.print_exc() return None def _Release_(self): """Cleanup object - like a close - to force cleanup when you dont want to rely on Python's reference counting.""" for childCont in self._mapCachedItems_.values(): childCont._Release_() self._mapCachedItems_ = {} if self._oleobj_: self._oleobj_.Release() self.__dict__['_oleobj_'] = None if self._olerepr_: self.__dict__['_olerepr_'] = None self._enum_ = None def _proc_(self, name, *args): """Call the named method as a procedure, rather than function. Mainly used by Word.Basic, which whinges about such things.""" try: item = self._olerepr_.mapFuncs[name] dispId = item.dispid return self._get_good_object_(self._oleobj_.Invoke(*(dispId, LCID, item.desc[4], 0) + (args) )) except KeyError: raise AttributeError(name) def _print_details_(self): "Debug routine - dumps what it knows about an object." print("AxDispatch container",self._username_) try: print("Methods:") for method in self._olerepr_.mapFuncs.keys(): print("\t", method) print("Props:") for prop, entry in self._olerepr_.propMap.items(): print("\t%s = 0x%x - %s" % (prop, entry.dispid, repr(entry))) print("Get Props:") for prop, entry in self._olerepr_.propMapGet.items(): print("\t%s = 0x%x - %s" % (prop, entry.dispid, repr(entry))) print("Put Props:") for prop, entry in self._olerepr_.propMapPut.items(): print("\t%s = 0x%x - %s" % (prop, entry.dispid, repr(entry))) except: traceback.print_exc() def __LazyMap__(self, attr): try: if self._LazyAddAttr_(attr): debug_attr_print("%s.__LazyMap__(%s) added something" % (self._username_,attr)) return 1 except AttributeError: return 0 # Using the typecomp, lazily create a new attribute definition. def _LazyAddAttr_(self,attr): if self._lazydata_ is None: return 0 res = 0 typeinfo, typecomp = self._lazydata_ olerepr = self._olerepr_ # We need to explicitly check each invoke type individually - simply # specifying '0' will bind to "any member", which may not be the one # we are actually after (ie, we may be after prop_get, but returned # the info for the prop_put.) for i in ALL_INVOKE_TYPES: try: x,t = typecomp.Bind(attr,i) # Support 'Get' and 'Set' properties - see # bug 1587023 if x==0 and attr[:3] in ('Set', 'Get'): x,t = typecomp.Bind(attr[3:], i) if x==1: #it's a FUNCDESC r = olerepr._AddFunc_(typeinfo,t,0) elif x==2: #it's a VARDESC r = olerepr._AddVar_(typeinfo,t,0) else: #not found or TYPEDESC/IMPLICITAPP r=None if not r is None: key, map = r[0],r[1] item = map[key] if map==olerepr.propMapPut: olerepr._propMapPutCheck_(key,item) elif map==olerepr.propMapGet: olerepr._propMapGetCheck_(key,item) res = 1 except: pass return res def _FlagAsMethod(self, *methodNames): """Flag these attribute names as being methods. Some objects do not correctly differentiate methods and properties, leading to problems when calling these methods. Specifically, trying to say: ob.SomeFunc() may yield an exception "None object is not callable" In this case, an attempt to fetch the *property*has worked and returned None, rather than indicating it is really a method. Calling: ob._FlagAsMethod("SomeFunc") should then allow this to work. """ for name in methodNames: details = build.MapEntry(self.__AttrToID__(name), (name,)) self._olerepr_.mapFuncs[name] = details def __AttrToID__(self,attr): debug_attr_print("Calling GetIDsOfNames for property %s in Dispatch container %s" % (attr, self._username_)) return self._oleobj_.GetIDsOfNames(0,attr) def __getattr__(self, attr): if attr=='__iter__': # We can't handle this as a normal method, as if the attribute # exists, then it must return an iterable object. try: invkind = pythoncom.DISPATCH_METHOD | pythoncom.DISPATCH_PROPERTYGET enum = self._oleobj_.InvokeTypes(pythoncom.DISPID_NEWENUM,LCID,invkind,(13, 10),()) except pythoncom.com_error: raise AttributeError("This object can not function as an iterator") # We must return a callable object. class Factory: def __init__(self, ob): self.ob = ob def __call__(self): import win32com.client.util return win32com.client.util.Iterator(self.ob) return Factory(enum) if attr.startswith('_') and attr.endswith('_'): # Fast-track. raise AttributeError(attr) # If a known method, create new instance and return. try: return MakeMethod(self._builtMethods_[attr], self, self.__class__) except KeyError: pass # XXX - Note that we current are case sensitive in the method. #debug_attr_print("GetAttr called for %s on DispatchContainer %s" % (attr,self._username_)) # First check if it is in the method map. Note that an actual method # must not yet exist, (otherwise we would not be here). This # means we create the actual method object - which also means # this code will never be asked for that method name again. if attr in self._olerepr_.mapFuncs: return self._make_method_(attr) # Delegate to property maps/cached items retEntry = None if self._olerepr_ and self._oleobj_: # first check general property map, then specific "put" map. retEntry = self._olerepr_.propMap.get(attr) if retEntry is None: retEntry = self._olerepr_.propMapGet.get(attr) # Not found so far - See what COM says. if retEntry is None: try: if self.__LazyMap__(attr): if attr in self._olerepr_.mapFuncs: return self._make_method_(attr) retEntry = self._olerepr_.propMap.get(attr) if retEntry is None: retEntry = self._olerepr_.propMapGet.get(attr) if retEntry is None: retEntry = build.MapEntry(self.__AttrToID__(attr), (attr,)) except pythoncom.ole_error: pass # No prop by that name - retEntry remains None. if not retEntry is None: # see if in my cache try: ret = self._mapCachedItems_[retEntry.dispid] debug_attr_print ("Cached items has attribute!", ret) return ret except (KeyError, AttributeError): debug_attr_print("Attribute %s not in cache" % attr) # If we are still here, and have a retEntry, get the OLE item if not retEntry is None: invoke_type = _GetDescInvokeType(retEntry, pythoncom.INVOKE_PROPERTYGET) debug_attr_print("Getting property Id 0x%x from OLE object" % retEntry.dispid) try: ret = self._oleobj_.Invoke(retEntry.dispid,0,invoke_type,1) except pythoncom.com_error as details: if details.hresult in ERRORS_BAD_CONTEXT: # May be a method. self._olerepr_.mapFuncs[attr] = retEntry return self._make_method_(attr) raise debug_attr_print("OLE returned ", ret) return self._get_good_object_(ret) # no where else to look. raise AttributeError("%s.%s" % (self._username_, attr)) def __setattr__(self, attr, value): if attr in self.__dict__: # Fast-track - if already in our dict, just make the assignment. # XXX - should maybe check method map - if someone assigns to a method, # it could mean something special (not sure what, tho!) self.__dict__[attr] = value return # Allow property assignment. debug_attr_print("SetAttr called for %s.%s=%s on DispatchContainer" % (self._username_, attr, repr(value))) if self._olerepr_: # Check the "general" property map. if attr in self._olerepr_.propMap: entry = self._olerepr_.propMap[attr] invoke_type = _GetDescInvokeType(entry, pythoncom.INVOKE_PROPERTYPUT) self._oleobj_.Invoke(entry.dispid, 0, invoke_type, 0, value) return # Check the specific "put" map. if attr in self._olerepr_.propMapPut: entry = self._olerepr_.propMapPut[attr] invoke_type = _GetDescInvokeType(entry, pythoncom.INVOKE_PROPERTYPUT) self._oleobj_.Invoke(entry.dispid, 0, invoke_type, 0, value) return # Try the OLE Object if self._oleobj_: if self.__LazyMap__(attr): # Check the "general" property map. if attr in self._olerepr_.propMap: entry = self._olerepr_.propMap[attr] invoke_type = _GetDescInvokeType(entry, pythoncom.INVOKE_PROPERTYPUT) self._oleobj_.Invoke(entry.dispid, 0, invoke_type, 0, value) return # Check the specific "put" map. if attr in self._olerepr_.propMapPut: entry = self._olerepr_.propMapPut[attr] invoke_type = _GetDescInvokeType(entry, pythoncom.INVOKE_PROPERTYPUT) self._oleobj_.Invoke(entry.dispid, 0, invoke_type, 0, value) return try: entry = build.MapEntry(self.__AttrToID__(attr),(attr,)) except pythoncom.com_error: # No attribute of that name entry = None if entry is not None: try: invoke_type = _GetDescInvokeType(entry, pythoncom.INVOKE_PROPERTYPUT) self._oleobj_.Invoke(entry.dispid, 0, invoke_type, 0, value) self._olerepr_.propMap[attr] = entry debug_attr_print("__setattr__ property %s (id=0x%x) in Dispatch container %s" % (attr, entry.dispid, self._username_)) return except pythoncom.com_error: pass raise AttributeError("Property '%s.%s' can not be set." % (self._username_, attr)) PK v,XQG \ \win32com/client/gencache.pyUT 0_Zx`ux """Manages the cache of generated Python code. Description This file manages the cache of generated Python code. When run from the command line, it also provides a number of options for managing that cache. Implementation Each typelib is generated into a filename of format "{guid}x{lcid}x{major}x{minor}.py" An external persistant dictionary maps from all known IIDs in all known type libraries to the type library itself. Thus, whenever Python code knows the IID of an object, it can find the IID, LCID and version of the type library which supports it. Given this information, it can find the Python module with the support. If necessary, this support can be generated on the fly. Hacks, to do, etc Currently just uses a pickled dictionary, but should used some sort of indexed file. Maybe an OLE2 compound file, or a bsddb file? """ import pywintypes, os, sys import pythoncom import win32com, win32com.client import glob import traceback from . import CLSIDToClass import operator from importlib import reload bForDemandDefault = 0 # Default value of bForDemand - toggle this to change the world - see also makepy.py # The global dictionary clsidToTypelib = {} # If we have a different version of the typelib generated, this # maps the "requested version" to the "generated version". versionRedirectMap = {} # There is no reason we *must* be readonly in a .zip, but we are now, # Rather than check for ".zip" or other tricks, PEP302 defines # a "__loader__" attribute, so we use that. # (Later, it may become necessary to check if the __loader__ can update files, # as a .zip loader potentially could - but punt all that until a need arises) is_readonly = is_zip = hasattr(win32com, "__loader__") and hasattr(win32com.__loader__, "archive") # A dictionary of ITypeLibrary objects for demand generation explicitly handed to us # Keyed by usual clsid, lcid, major, minor demandGeneratedTypeLibraries = {} import pickle as pickle def __init__(): # Initialize the module. Called once explicitly at module import below. try: _LoadDicts() except IOError: Rebuild() pickleVersion = 1 def _SaveDicts(): if is_readonly: raise RuntimeError("Trying to write to a readonly gencache ('%s')!" \ % win32com.__gen_path__) f = open(os.path.join(GetGeneratePath(), "dicts.dat"), "wb") try: p = pickle.Pickler(f) p.dump(pickleVersion) p.dump(clsidToTypelib) finally: f.close() def _LoadDicts(): # Load the dictionary from a .zip file if that is where we live. if is_zip: import io as io loader = win32com.__loader__ arc_path = loader.archive dicts_path = os.path.join(win32com.__gen_path__, "dicts.dat") if dicts_path.startswith(arc_path): dicts_path = dicts_path[len(arc_path)+1:] else: # Hm. See below. return try: data = loader.get_data(dicts_path) except AttributeError: # The __loader__ has no get_data method. See below. return except IOError: # Our gencache is in a .zip file (and almost certainly readonly) # but no dicts file. That actually needn't be fatal for a frozen # application. Assuming they call "EnsureModule" with the same # typelib IDs they have been frozen with, that EnsureModule will # correctly re-build the dicts on the fly. However, objects that # rely on the gencache but have not done an EnsureModule will # fail (but their apps are likely to fail running from source # with a clean gencache anyway, as then they would be getting # Dynamic objects until the cache is built - so the best answer # for these apps is to call EnsureModule, rather than freezing # the dict) return f = io.BytesIO(data) else: # NOTE: IOError on file open must be caught by caller. f = open(os.path.join(win32com.__gen_path__, "dicts.dat"), "rb") try: p = pickle.Unpickler(f) version = p.load() global clsidToTypelib clsidToTypelib = p.load() versionRedirectMap.clear() finally: f.close() def GetGeneratedFileName(clsid, lcid, major, minor): """Given the clsid, lcid, major and minor for a type lib, return the file name (no extension) providing this support. """ return str(clsid).upper()[1:-1] + "x%sx%sx%s" % (lcid, major, minor) def SplitGeneratedFileName(fname): """Reverse of GetGeneratedFileName() """ return tuple(fname.split('x',4)) def GetGeneratePath(): """Returns the name of the path to generate to. Checks the directory is OK. """ assert not is_readonly, "Why do you want the genpath for a readonly store?" try: os.makedirs(win32com.__gen_path__) #os.mkdir(win32com.__gen_path__) except os.error: pass try: fname = os.path.join(win32com.__gen_path__, "__init__.py") os.stat(fname) except os.error: f = open(fname,"w") f.write('# Generated file - this directory may be deleted to reset the COM cache...\n') f.write('import win32com\n') f.write('if __path__[:-1] != win32com.__gen_path__: __path__.append(win32com.__gen_path__)\n') f.close() return win32com.__gen_path__ # # The helpers for win32com.client.Dispatch and OCX clients. # def GetClassForProgID(progid): """Get a Python class for a Program ID Given a Program ID, return a Python class which wraps the COM object Returns the Python class, or None if no module is available. Params progid -- A COM ProgramID or IID (eg, "Word.Application") """ clsid = pywintypes.IID(progid) # This auto-converts named to IDs. return GetClassForCLSID(clsid) def GetClassForCLSID(clsid): """Get a Python class for a CLSID Given a CLSID, return a Python class which wraps the COM object Returns the Python class, or None if no module is available. Params clsid -- A COM CLSID (or string repr of one) """ # first, take a short-cut - we may already have generated support ready-to-roll. clsid = str(clsid) if CLSIDToClass.HasClass(clsid): return CLSIDToClass.GetClass(clsid) mod = GetModuleForCLSID(clsid) if mod is None: return None try: return CLSIDToClass.GetClass(clsid) except KeyError: return None def GetModuleForProgID(progid): """Get a Python module for a Program ID Given a Program ID, return a Python module which contains the class which wraps the COM object. Returns the Python module, or None if no module is available. Params progid -- A COM ProgramID or IID (eg, "Word.Application") """ try: iid = pywintypes.IID(progid) except pywintypes.com_error: return None return GetModuleForCLSID(iid) def GetModuleForCLSID(clsid): """Get a Python module for a CLSID Given a CLSID, return a Python module which contains the class which wraps the COM object. Returns the Python module, or None if no module is available. Params progid -- A COM CLSID (ie, not the description) """ clsid_str = str(clsid) try: typelibCLSID, lcid, major, minor = clsidToTypelib[clsid_str] except KeyError: return None try: mod = GetModuleForTypelib(typelibCLSID, lcid, major, minor) except ImportError: mod = None if mod is not None: sub_mod = mod.CLSIDToPackageMap.get(clsid_str) if sub_mod is None: sub_mod = mod.VTablesToPackageMap.get(clsid_str) if sub_mod is not None: sub_mod_name = mod.__name__ + "." + sub_mod try: __import__(sub_mod_name) except ImportError: info = typelibCLSID, lcid, major, minor # Force the generation. If this typelibrary has explicitly been added, # use it (it may not be registered, causing a lookup by clsid to fail) if info in demandGeneratedTypeLibraries: info = demandGeneratedTypeLibraries[info] from . import makepy makepy.GenerateChildFromTypeLibSpec(sub_mod, info) # Generate does an import... mod = sys.modules[sub_mod_name] return mod def GetModuleForTypelib(typelibCLSID, lcid, major, minor): """Get a Python module for a type library ID Given the CLSID of a typelibrary, return an imported Python module, else None Params typelibCLSID -- IID of the type library. major -- Integer major version. minor -- Integer minor version lcid -- Integer LCID for the library. """ modName = GetGeneratedFileName(typelibCLSID, lcid, major, minor) mod = _GetModule(modName) # If the import worked, it doesn't mean we have actually added this # module to our cache though - check that here. if "_in_gencache_" not in mod.__dict__: AddModuleToCache(typelibCLSID, lcid, major, minor) assert "_in_gencache_" in mod.__dict__ return mod def MakeModuleForTypelib(typelibCLSID, lcid, major, minor, progressInstance = None, bForDemand = bForDemandDefault, bBuildHidden = 1): """Generate support for a type library. Given the IID, LCID and version information for a type library, generate and import the necessary support files. Returns the Python module. No exceptions are caught. Params typelibCLSID -- IID of the type library. major -- Integer major version. minor -- Integer minor version. lcid -- Integer LCID for the library. progressInstance -- Instance to use as progress indicator, or None to use the GUI progress bar. """ from . import makepy makepy.GenerateFromTypeLibSpec( (typelibCLSID, lcid, major, minor), progressInstance=progressInstance, bForDemand = bForDemand, bBuildHidden = bBuildHidden) return GetModuleForTypelib(typelibCLSID, lcid, major, minor) def MakeModuleForTypelibInterface(typelib_ob, progressInstance = None, bForDemand = bForDemandDefault, bBuildHidden = 1): """Generate support for a type library. Given a PyITypeLib interface generate and import the necessary support files. This is useful for getting makepy support for a typelibrary that is not registered - the caller can locate and load the type library itself, rather than relying on COM to find it. Returns the Python module. Params typelib_ob -- The type library itself progressInstance -- Instance to use as progress indicator, or None to use the GUI progress bar. """ from . import makepy try: makepy.GenerateFromTypeLibSpec( typelib_ob, progressInstance=progressInstance, bForDemand = bForDemandDefault, bBuildHidden = bBuildHidden) except pywintypes.com_error: return None tla = typelib_ob.GetLibAttr() guid = tla[0] lcid = tla[1] major = tla[3] minor = tla[4] return GetModuleForTypelib(guid, lcid, major, minor) def EnsureModuleForTypelibInterface(typelib_ob, progressInstance = None, bForDemand = bForDemandDefault, bBuildHidden = 1): """Check we have support for a type library, generating if not. Given a PyITypeLib interface generate and import the necessary support files if necessary. This is useful for getting makepy support for a typelibrary that is not registered - the caller can locate and load the type library itself, rather than relying on COM to find it. Returns the Python module. Params typelib_ob -- The type library itself progressInstance -- Instance to use as progress indicator, or None to use the GUI progress bar. """ tla = typelib_ob.GetLibAttr() guid = tla[0] lcid = tla[1] major = tla[3] minor = tla[4] #If demand generated, save the typelib interface away for later use if bForDemand: demandGeneratedTypeLibraries[(str(guid), lcid, major, minor)] = typelib_ob try: return GetModuleForTypelib(guid, lcid, major, minor) except ImportError: pass # Generate it. return MakeModuleForTypelibInterface(typelib_ob, progressInstance, bForDemand, bBuildHidden) def ForgetAboutTypelibInterface(typelib_ob): """Drop any references to a typelib previously added with EnsureModuleForTypelibInterface and forDemand""" tla = typelib_ob.GetLibAttr() guid = tla[0] lcid = tla[1] major = tla[3] minor = tla[4] info = str(guid), lcid, major, minor try: del demandGeneratedTypeLibraries[info] except KeyError: # Not worth raising an exception - maybe they dont know we only remember for demand generated, etc. print("ForgetAboutTypelibInterface:: Warning - type library with info %s is not being remembered!" % (info,)) # and drop any version redirects to it for key, val in list(versionRedirectMap.items()): if val==info: del versionRedirectMap[key] def EnsureModule(typelibCLSID, lcid, major, minor, progressInstance = None, bValidateFile=not is_readonly, bForDemand = bForDemandDefault, bBuildHidden = 1): """Ensure Python support is loaded for a type library, generating if necessary. Given the IID, LCID and version information for a type library, check and if necessary (re)generate, then import the necessary support files. If we regenerate the file, there is no way to totally snuff out all instances of the old module in Python, and thus we will regenerate the file more than necessary, unless makepy/genpy is modified accordingly. Returns the Python module. No exceptions are caught during the generate process. Params typelibCLSID -- IID of the type library. major -- Integer major version. minor -- Integer minor version lcid -- Integer LCID for the library. progressInstance -- Instance to use as progress indicator, or None to use the GUI progress bar. bValidateFile -- Whether or not to perform cache validation or not bForDemand -- Should a complete generation happen now, or on demand? bBuildHidden -- Should hidden members/attributes etc be generated? """ bReloadNeeded = 0 try: try: module = GetModuleForTypelib(typelibCLSID, lcid, major, minor) except ImportError: # If we get an ImportError # We may still find a valid cache file under a different MinorVersion # # (which windows will search out for us) #print "Loading reg typelib", typelibCLSID, major, minor, lcid module = None try: tlbAttr = pythoncom.LoadRegTypeLib(typelibCLSID, major, minor, lcid).GetLibAttr() # if the above line doesn't throw a pythoncom.com_error, check if # it is actually a different lib than we requested, and if so, suck it in if tlbAttr[1] != lcid or tlbAttr[4]!=minor: #print "Trying 2nd minor #", tlbAttr[1], tlbAttr[3], tlbAttr[4] try: module = GetModuleForTypelib(typelibCLSID, tlbAttr[1], tlbAttr[3], tlbAttr[4]) except ImportError: # We don't have a module, but we do have a better minor # version - remember that. minor = tlbAttr[4] # else module remains None except pythoncom.com_error: # couldn't load any typelib - mod remains None pass if module is not None and bValidateFile: assert not is_readonly, "Can't validate in a read-only gencache" try: typLibPath = pythoncom.QueryPathOfRegTypeLib(typelibCLSID, major, minor, lcid) # windows seems to add an extra \0 (via the underlying BSTR) # The mainwin toolkit does not add this erroneous \0 if typLibPath[-1]=='\0': typLibPath=typLibPath[:-1] suf = getattr(os.path, "supports_unicode_filenames", 0) if not suf: # can't pass unicode filenames directly - convert try: typLibPath=typLibPath.encode(sys.getfilesystemencoding()) except AttributeError: # no sys.getfilesystemencoding typLibPath=str(typLibPath) tlbAttributes = pythoncom.LoadRegTypeLib(typelibCLSID, major, minor, lcid).GetLibAttr() except pythoncom.com_error: # We have a module, but no type lib - we should still # run with what we have though - the typelib may not be # deployed here. bValidateFile = 0 if module is not None and bValidateFile: assert not is_readonly, "Can't validate in a read-only gencache" filePathPrefix = "%s\\%s" % (GetGeneratePath(), GetGeneratedFileName(typelibCLSID, lcid, major, minor)) filePath = filePathPrefix + ".py" filePathPyc = filePathPrefix + ".py" if __debug__: filePathPyc = filePathPyc + "c" else: filePathPyc = filePathPyc + "o" # Verify that type library is up to date. # If we have a differing MinorVersion or genpy has bumped versions, update the file from . import genpy if module.MinorVersion != tlbAttributes[4] or genpy.makepy_version != module.makepy_version: #print "Version skew: %d, %d" % (module.MinorVersion, tlbAttributes[4]) # try to erase the bad file from the cache try: os.unlink(filePath) except os.error: pass try: os.unlink(filePathPyc) except os.error: pass if os.path.isdir(filePathPrefix): import shutil shutil.rmtree(filePathPrefix) minor = tlbAttributes[4] module = None bReloadNeeded = 1 else: minor = module.MinorVersion filePathPrefix = "%s\\%s" % (GetGeneratePath(), GetGeneratedFileName(typelibCLSID, lcid, major, minor)) filePath = filePathPrefix + ".py" filePathPyc = filePathPrefix + ".pyc" #print "Trying py stat: ", filePath fModTimeSet = 0 try: pyModTime = os.stat(filePath)[8] fModTimeSet = 1 except os.error as e: # If .py file fails, try .pyc file #print "Trying pyc stat", filePathPyc try: pyModTime = os.stat(filePathPyc)[8] fModTimeSet = 1 except os.error as e: pass #print "Trying stat typelib", pyModTime #print str(typLibPath) typLibModTime = os.stat(typLibPath)[8] if fModTimeSet and (typLibModTime > pyModTime): bReloadNeeded = 1 module = None except (ImportError, os.error): module = None if module is None: # We need to build an item. If we are in a read-only cache, we # can't/don't want to do this - so before giving up, check for # a different minor version in our cache - according to COM, this is OK if is_readonly: key = str(typelibCLSID), lcid, major, minor # If we have been asked before, get last result. try: return versionRedirectMap[key] except KeyError: pass # Find other candidates. items = [] for desc in GetGeneratedInfos(): if key[0]==desc[0] and key[1]==desc[1] and key[2]==desc[2]: items.append(desc) if items: # Items are all identical, except for last tuple element # We want the latest minor version we have - so just sort and grab last items.sort() new_minor = items[-1][3] ret = GetModuleForTypelib(typelibCLSID, lcid, major, new_minor) else: ret = None # remember and return versionRedirectMap[key] = ret return ret #print "Rebuilding: ", major, minor module = MakeModuleForTypelib(typelibCLSID, lcid, major, minor, progressInstance, bForDemand = bForDemand, bBuildHidden = bBuildHidden) # If we replaced something, reload it if bReloadNeeded: module = reload(module) AddModuleToCache(typelibCLSID, lcid, major, minor) return module def EnsureDispatch(prog_id, bForDemand = 1): # New fn, so we default the new demand feature to on! """Given a COM prog_id, return an object that is using makepy support, building if necessary""" disp = win32com.client.Dispatch(prog_id) if not disp.__dict__.get("CLSID"): # Eeek - no makepy support - try and build it. try: ti = disp._oleobj_.GetTypeInfo() disp_clsid = ti.GetTypeAttr()[0] tlb, index = ti.GetContainingTypeLib() tla = tlb.GetLibAttr() mod = EnsureModule(tla[0], tla[1], tla[3], tla[4], bForDemand=bForDemand) GetModuleForCLSID(disp_clsid) # Get the class from the module. from . import CLSIDToClass disp_class = CLSIDToClass.GetClass(str(disp_clsid)) disp = disp_class(disp._oleobj_) except pythoncom.com_error: raise TypeError("This COM object can not automate the makepy process - please run makepy manually for this object") return disp def AddModuleToCache(typelibclsid, lcid, major, minor, verbose = 1, bFlushNow = not is_readonly): """Add a newly generated file to the cache dictionary. """ fname = GetGeneratedFileName(typelibclsid, lcid, major, minor) mod = _GetModule(fname) # if mod._in_gencache_ is already true, then we are reloading this # module - this doesn't mean anything special though! mod._in_gencache_ = 1 dict = mod.CLSIDToClassMap info = str(typelibclsid), lcid, major, minor for clsid, cls in dict.items(): clsidToTypelib[clsid] = info dict = mod.CLSIDToPackageMap for clsid, name in dict.items(): clsidToTypelib[clsid] = info dict = mod.VTablesToClassMap for clsid, cls in dict.items(): clsidToTypelib[clsid] = info dict = mod.VTablesToPackageMap for clsid, cls in dict.items(): clsidToTypelib[clsid] = info # If this lib was previously redirected, drop it if info in versionRedirectMap: del versionRedirectMap[info] if bFlushNow: _SaveDicts() def GetGeneratedInfos(): zip_pos = win32com.__gen_path__.find(".zip\\") if zip_pos >= 0: import zipfile zip_file = win32com.__gen_path__[:zip_pos+4] zip_path = win32com.__gen_path__[zip_pos+5:].replace("\\", "/") zf = zipfile.ZipFile(zip_file) infos = {} for n in zf.namelist(): if not n.startswith(zip_path): continue base = n[len(zip_path)+1:].split("/")[0] try: iid, lcid, major, minor = base.split("x") lcid = int(lcid) major = int(major) minor = int(minor) iid = pywintypes.IID("{" + iid + "}") except ValueError: continue except pywintypes.com_error: # invalid IID continue infos[(iid, lcid, major, minor)] = 1 zf.close() return list(infos.keys()) else: # on the file system files = glob.glob(win32com.__gen_path__+ "\\*") ret = [] for file in files: if not os.path.isdir(file) and not os.path.splitext(file)[1]==".py": continue name = os.path.splitext(os.path.split(file)[1])[0] try: iid, lcid, major, minor = name.split("x") iid = pywintypes.IID("{" + iid + "}") lcid = int(lcid) major = int(major) minor = int(minor) except ValueError: continue except pywintypes.com_error: # invalid IID continue ret.append((iid, lcid, major, minor)) return ret def _GetModule(fname): """Given the name of a module in the gen_py directory, import and return it. """ mod_name = "win32com.gen_py.%s" % fname mod = __import__(mod_name) return sys.modules[mod_name] def Rebuild(verbose = 1): """Rebuild the cache indexes from the file system. """ clsidToTypelib.clear() infos = GetGeneratedInfos() if verbose and len(infos): # Dont bother reporting this when directory is empty! print("Rebuilding cache of generated files for COM support...") for info in infos: iid, lcid, major, minor = info if verbose: print("Checking", GetGeneratedFileName(*info)) try: AddModuleToCache(iid, lcid, major, minor, verbose, 0) except: print("Could not add module %s - %s: %s" % (info, sys.exc_info()[0],sys.exc_info()[1])) if verbose and len(infos): # Dont bother reporting this when directory is empty! print("Done.") _SaveDicts() def _Dump(): print("Cache is in directory", win32com.__gen_path__) # Build a unique dir d = {} for clsid, (typelibCLSID, lcid, major, minor) in clsidToTypelib.items(): d[typelibCLSID, lcid, major, minor] = None for typelibCLSID, lcid, major, minor in d.keys(): mod = GetModuleForTypelib(typelibCLSID, lcid, major, minor) print("%s - %s" % (mod.__doc__, typelibCLSID)) # Boot up __init__() def usage(): usageString = """\ Usage: gencache [-q] [-d] [-r] -q - Quiet -d - Dump the cache (typelibrary description and filename). -r - Rebuild the cache dictionary from the existing .py files """ print(usageString) sys.exit(1) if __name__=='__main__': import getopt try: opts, args = getopt.getopt(sys.argv[1:], "qrd") except getopt.error as message: print(message) usage() # we only have options - complain about real args, or none at all! if len(sys.argv)==1 or args: print(usage()) verbose = 1 for opt, val in opts: if opt=='-d': # Dump _Dump() if opt=='-r': Rebuild(verbose) if opt=='-q': verbose = 0 PK %DQ&\\win32com/client/selecttlb.pyUT Sy_Zx`ux """Utilities for selecting and enumerating the Type Libraries installed on the system """ import win32api, win32con, pythoncom class TypelibSpec: def __init__(self, clsid, lcid, major, minor, flags=0): self.clsid = str(clsid) self.lcid = int(lcid) # We avoid assuming 'major' or 'minor' are integers - when # read from the registry there is some confusion about if # they are base 10 or base 16 (they *should* be base 16, but # how they are written is beyond our control.) self.major = major self.minor = minor self.dll = None self.desc = None self.ver_desc = None self.flags = flags # For the SelectList def __getitem__(self, item): if item==0: return self.ver_desc raise IndexError("Cant index me!") def __lt__(self, other): # rich-cmp/py3k-friendly version me = (self.ver_desc or "").lower(), (self.desc or "").lower(), self.major, self.minor them = (other.ver_desc or "").lower(), (other.desc or "").lower(), other.major, other.minor return me < them def __eq__(self, other): # rich-cmp/py3k-friendly version return ((self.ver_desc or "").lower() == (other.ver_desc or "").lower() and (self.desc or "").lower() == (other.desc or "").lower() and self.major == other.major and self.minor == other.minor) def Resolve(self): if self.dll is None: return 0 tlb = pythoncom.LoadTypeLib(self.dll) self.FromTypelib(tlb, None) return 1 def FromTypelib(self, typelib, dllName = None): la = typelib.GetLibAttr() self.clsid = str(la[0]) self.lcid = la[1] self.major = la[3] self.minor = la[4] if dllName: self.dll = dllName def EnumKeys(root): index = 0 ret = [] while 1: try: item = win32api.RegEnumKey(root, index) except win32api.error: break try: # Note this doesn't handle REG_EXPAND_SZ, but the implementation # here doesn't need to - that is handled as the data is read. val = win32api.RegQueryValue(root, item) except win32api.error: val = "" # code using this assumes a string. ret.append((item, val)) index = index + 1 return ret FLAG_RESTRICTED=1 FLAG_CONTROL=2 FLAG_HIDDEN=4 def EnumTlbs(excludeFlags = 0): """Return a list of TypelibSpec objects, one for each registered library. """ key = win32api.RegOpenKey(win32con.HKEY_CLASSES_ROOT, "Typelib") iids = EnumKeys(key) results = [] for iid, crap in iids: try: key2 = win32api.RegOpenKey(key, str(iid)) except win32api.error: # A few good reasons for this, including "access denied". continue for version, tlbdesc in EnumKeys(key2): major_minor = version.split('.', 1) if len(major_minor) < 2: major_minor.append('0') # For some reason, this code used to assume the values were hex. # This seems to not be true - particularly for CDO 1.21 # *sigh* - it appears there are no rules here at all, so when we need # to know the info, we must load the tlb by filename and request it. # The Resolve() method on the TypelibSpec does this. # For this reason, keep the version numbers as strings - that # way we can't be wrong! Let code that really needs an int to work # out what to do. FWIW, http://support.microsoft.com/kb/816970 is # pretty clear that they *should* be hex. major = major_minor[0] minor = major_minor[1] key3 = win32api.RegOpenKey(key2, str(version)) try: # The "FLAGS" are at this point flags = int(win32api.RegQueryValue(key3, "FLAGS")) except (win32api.error, ValueError): flags = 0 if flags & excludeFlags==0: for lcid, crap in EnumKeys(key3): try: lcid = int(lcid) except ValueError: # not an LCID entry continue # Only care about "{lcid}\win32" key - jump straight there. try: key4 = win32api.RegOpenKey(key3, "%s\\win32" % (lcid,)) except win32api.error: continue try: dll, typ = win32api.RegQueryValueEx(key4, None) if typ==win32con.REG_EXPAND_SZ: dll = win32api.ExpandEnvironmentStrings(dll) except win32api.error: dll = None spec = TypelibSpec(iid, lcid, major, minor, flags) spec.dll = dll spec.desc = tlbdesc spec.ver_desc = tlbdesc + " (" + version + ")" results.append(spec) return results def FindTlbsWithDescription(desc): """Find all installed type libraries with the specified description """ ret = [] items = EnumTlbs() for item in items: if item.desc==desc: ret.append(item) return ret def SelectTlb(title="Select Library", excludeFlags = 0): """Display a list of all the type libraries, and select one. Returns None if cancelled """ import pywin.dialogs.list items = EnumTlbs(excludeFlags) # fixup versions - we assume hex (see __init__ above) for i in items: i.major = int(i.major, 16) i.minor = int(i.minor, 16) items.sort() rc = pywin.dialogs.list.SelectFromLists(title, items, ["Type Library"]) if rc is None: return None return items[rc] # Test code. if __name__=='__main__': print(SelectTlb().__dict__) PK %DQL-win32com/client/CLSIDToClass.pyUT Sy_Zx`ux """Manages a dictionary of CLSID strings to Python classes. Primary use of this module is to allow modules generated by makepy.py to share classes. @makepy@ automatically generates code which interacts with this module. You should never need to reference this module directly. This module only provides support for modules which have been previously been imported. The gencache module provides some support for loading modules on demand - once done, this module supports it... As an example, the MSACCESS.TLB type library makes reference to the CLSID of the Database object, as defined in DAO3032.DLL. This allows code using the MSAccess wrapper to natively use Databases. This obviously applies to all cooperating objects, not just DAO and Access. """ mapCLSIDToClass = {} def RegisterCLSID( clsid, pythonClass ): """Register a class that wraps a CLSID This function allows a CLSID to be globally associated with a class. Certain module will automatically convert an IDispatch object to an instance of the associated class. """ mapCLSIDToClass[str(clsid)] = pythonClass def RegisterCLSIDsFromDict( dict ): """Register a dictionary of CLSID's and classes. This module performs the same function as @RegisterCLSID@, but for an entire dictionary of associations. Typically called by makepy generated modules at import time. """ mapCLSIDToClass.update(dict) def GetClass(clsid): """Given a CLSID, return the globally associated class. clsid -- a string CLSID representation to check. """ return mapCLSIDToClass[clsid] def HasClass(clsid): """Determines if the CLSID has an associated class. clsid -- the string CLSID to check """ return clsid in mapCLSIDToClass PK [Qtwin32com/client/genpy.pyUT r_Zx`ux """genpy.py - The worker for makepy. See makepy.py for more details This code was moved simply to speed Python in normal circumstances. As the makepy.py is normally run from the command line, it reparses the code each time. Now makepy is nothing more than the command line handler and public interface. The makepy command line etc handling is also getting large enough in its own right! """ # NOTE - now supports a "demand" mechanism - the top-level is a package, and # each class etc can be made individually. # This should eventually become the default. # Then the old non-package technique should be removed. # There should be no b/w compat issues, and will just help clean the code. # This will be done once the new "demand" mechanism gets a good workout. import os import sys import time import win32com import pythoncom from . import build error = "makepy.error" makepy_version = "0.5.01" # Written to generated file. GEN_FULL="full" GEN_DEMAND_BASE = "demand(base)" GEN_DEMAND_CHILD = "demand(child)" # This map is used purely for the users benefit -it shows the # raw, underlying type of Alias/Enums, etc. The COM implementation # does not use this map at runtime - all Alias/Enum have already # been translated. mapVTToTypeString = { pythoncom.VT_I2: 'types.IntType', pythoncom.VT_I4: 'types.IntType', pythoncom.VT_R4: 'types.FloatType', pythoncom.VT_R8: 'types.FloatType', pythoncom.VT_BSTR: 'types.StringType', pythoncom.VT_BOOL: 'types.IntType', pythoncom.VT_VARIANT: 'types.TypeType', pythoncom.VT_I1: 'types.IntType', pythoncom.VT_UI1: 'types.IntType', pythoncom.VT_UI2: 'types.IntType', pythoncom.VT_UI4: 'types.IntType', pythoncom.VT_I8: 'types.LongType', pythoncom.VT_UI8: 'types.LongType', pythoncom.VT_INT: 'types.IntType', pythoncom.VT_DATE: 'pythoncom.PyTimeType', pythoncom.VT_UINT: 'types.IntType', } # Given a propget function's arg desc, return the default parameters for all # params bar the first. Eg, then Python does a: # object.Property = "foo" # Python can only pass the "foo" value. If the property has # multiple args, and the rest have default values, this allows # Python to correctly pass those defaults. def MakeDefaultArgsForPropertyPut(argsDesc): ret = [] for desc in argsDesc[1:]: default = build.MakeDefaultArgRepr(desc) if default is None: break ret.append(default) return tuple(ret) def MakeMapLineEntry(dispid, wFlags, retType, argTypes, user, resultCLSID): # Strip the default value argTypes = tuple([what[:2] for what in argTypes]) return '(%s, %d, %s, %s, "%s", %s)' % \ (dispid, wFlags, retType[:2], argTypes, user, resultCLSID) def MakeEventMethodName(eventName): if eventName[:2]=="On": return eventName else: return "On"+eventName def WriteSinkEventMap(obj, stream): print('\t_dispid_to_func_ = {', file=stream) for name, entry in list(obj.propMapGet.items()) + list(obj.propMapPut.items()) + list(obj.mapFuncs.items()): fdesc = entry.desc print('\t\t%9d : "%s",' % (entry.desc[0], MakeEventMethodName(entry.names[0])), file=stream) print('\t\t}', file=stream) # MI is used to join my writable helpers, and the OLE # classes. class WritableItem: # __cmp__ used for sorting in py2x... def __cmp__(self, other): "Compare for sorting" ret = cmp(self.order, other.order) if ret==0 and self.doc: ret = cmp(self.doc[0], other.doc[0]) return ret # ... but not used in py3k - __lt__ minimum needed there def __lt__(self, other): # py3k variant if self.order == other.order: return self.doc < other.doc return self.order < other.order def __repr__(self): return "OleItem: doc=%s, order=%d" % (repr(self.doc), self.order) class RecordItem(build.OleItem, WritableItem): order = 9 typename = "RECORD" def __init__(self, typeInfo, typeAttr, doc=None, bForUser=1): ## sys.stderr.write("Record %s: size %s\n" % (doc,typeAttr.cbSizeInstance)) ## sys.stderr.write(" cVars = %s\n" % (typeAttr.cVars,)) ## for i in range(typeAttr.cVars): ## vdesc = typeInfo.GetVarDesc(i) ## sys.stderr.write(" Var %d has value %s, type %d, desc=%s\n" % (i, vdesc.value, vdesc.varkind, vdesc.elemdescVar)) ## sys.stderr.write(" Doc is %s\n" % (typeInfo.GetDocumentation(vdesc.memid),)) build.OleItem.__init__(self, doc) self.clsid = typeAttr[0] def WriteClass(self, generator): pass # Given an enum, write all aliases for it. # (no longer necessary for new style code, but still used for old code. def WriteAliasesForItem(item, aliasItems, stream): for alias in aliasItems.values(): if item.doc and alias.aliasDoc and (alias.aliasDoc[0]==item.doc[0]): alias.WriteAliasItem(aliasItems, stream) class AliasItem(build.OleItem, WritableItem): order = 2 typename = "ALIAS" def __init__(self, typeinfo, attr, doc=None, bForUser = 1): build.OleItem.__init__(self, doc) ai = attr[14] self.attr = attr if type(ai) == type(()) and \ type(ai[1])==type(0): # XXX - This is a hack - why tuples? Need to resolve? href = ai[1] alinfo = typeinfo.GetRefTypeInfo(href) self.aliasDoc = alinfo.GetDocumentation(-1) self.aliasAttr = alinfo.GetTypeAttr() else: self.aliasDoc = None self.aliasAttr = None def WriteAliasItem(self, aliasDict, stream): # we could have been written as part of an alias dependency if self.bWritten: return if self.aliasDoc: depName = self.aliasDoc[0] if depName in aliasDict: aliasDict[depName].WriteAliasItem(aliasDict, stream) print(self.doc[0] + " = " + depName, file=stream) else: ai = self.attr[14] if type(ai) == type(0): try: typeStr = mapVTToTypeString[ai] print("# %s=%s" % (self.doc[0], typeStr), file=stream) except KeyError: print(self.doc[0] + " = None # Can't convert alias info " + str(ai), file=stream) print(file=stream) self.bWritten = 1 class EnumerationItem(build.OleItem, WritableItem): order = 1 typename = "ENUMERATION" def __init__(self, typeinfo, attr, doc=None, bForUser=1): build.OleItem.__init__(self, doc) self.clsid = attr[0] self.mapVars = {} typeFlags = attr[11] self.hidden = typeFlags & pythoncom.TYPEFLAG_FHIDDEN or \ typeFlags & pythoncom.TYPEFLAG_FRESTRICTED for j in range(attr[7]): vdesc = typeinfo.GetVarDesc(j) name = typeinfo.GetNames(vdesc[0])[0] self.mapVars[name] = build.MapEntry(vdesc) ## def WriteEnumerationHeaders(self, aliasItems, stream): ## enumName = self.doc[0] ## print >> stream "%s=constants # Compatibility with previous versions." % (enumName) ## WriteAliasesForItem(self, aliasItems) def WriteEnumerationItems(self, stream): num = 0 enumName = self.doc[0] # Write in name alpha order names = list(self.mapVars.keys()) names.sort() for name in names: entry = self.mapVars[name] vdesc = entry.desc if vdesc[4] == pythoncom.VAR_CONST: val = vdesc[1] use = repr(val) # Make sure the repr of the value is valid python syntax # still could cause an error on import if it contains a module or type name # not available in the global namespace try: compile(use, '', 'eval') except SyntaxError: # At least add the repr as a string, so it can be investigated further # Sanitize it, in case the repr contains its own quotes. (??? line breaks too ???) use = use.replace('"',"'") use = '"' + use + '"' + ' # This VARIANT type cannot be converted automatically' print("\t%-30s=%-10s # from enum %s" % \ (build.MakePublicAttributeName(name, True), use, enumName), file=stream) num += 1 return num class VTableItem(build.VTableItem, WritableItem): order = 4 def WriteClass(self, generator): self.WriteVTableMap(generator) self.bWritten = 1 def WriteVTableMap(self, generator): stream = generator.file print("%s_vtables_dispatch_ = %d" % (self.python_name, self.bIsDispatch), file=stream) print("%s_vtables_ = [" % (self.python_name, ), file=stream) for v in self.vtableFuncs: names, dispid, desc = v arg_desc = desc[2] arg_reprs = [] # more hoops so we don't generate huge lines. item_num = 0 print("\t((", end=' ', file=stream) for name in names: print(repr(name), ",", end=' ', file=stream) item_num = item_num + 1 if item_num % 5 == 0: print("\n\t\t\t", end=' ', file=stream) print("), %d, (%r, %r, [" % (dispid, desc[0], desc[1]), end=' ', file=stream) for arg in arg_desc: item_num = item_num + 1 if item_num % 5 == 0: print("\n\t\t\t", end=' ', file=stream) defval = build.MakeDefaultArgRepr(arg) if arg[3] is None: arg3_repr = None else: arg3_repr = repr(arg[3]) print(repr((arg[0], arg[1], defval, arg3_repr)), ",", end=' ', file=stream) print("],", end=' ', file=stream) for d in desc[3:]: print(repr(d), ",", end=' ', file=stream) print(")),", file=stream) print("]", file=stream) print(file=stream) class DispatchItem(build.DispatchItem, WritableItem): order = 3 def __init__(self, typeinfo, attr, doc=None): build.DispatchItem.__init__(self, typeinfo, attr, doc) self.type_attr = attr self.coclass_clsid = None def WriteClass(self, generator): if not self.bIsDispatch and not self.type_attr.typekind == pythoncom.TKIND_DISPATCH: return # This is pretty screwey - now we have vtable support we # should probably rethink this (ie, maybe write both sides for sinks, etc) if self.bIsSink: self.WriteEventSinkClassHeader(generator) self.WriteCallbackClassBody(generator) else: self.WriteClassHeader(generator) self.WriteClassBody(generator) print(file=generator.file) self.bWritten = 1 def WriteClassHeader(self, generator): generator.checkWriteDispatchBaseClass() doc = self.doc stream = generator.file print('class ' + self.python_name + '(DispatchBaseClass):', file=stream) if doc[1]: print('\t' + build._makeDocString(doc[1]), file=stream) try: progId = pythoncom.ProgIDFromCLSID(self.clsid) print("\t# This class is creatable by the name '%s'" % (progId), file=stream) except pythoncom.com_error: pass print("\tCLSID = " + repr(self.clsid), file=stream) if self.coclass_clsid is None: print("\tcoclass_clsid = None", file=stream) else: print("\tcoclass_clsid = " + repr(self.coclass_clsid), file=stream) print(file=stream) self.bWritten = 1 def WriteEventSinkClassHeader(self, generator): generator.checkWriteEventBaseClass() doc = self.doc stream = generator.file print('class ' + self.python_name + ':', file=stream) if doc[1]: print('\t' + build._makeDocString(doc[1]), file=stream) try: progId = pythoncom.ProgIDFromCLSID(self.clsid) print("\t# This class is creatable by the name '%s'" % (progId), file=stream) except pythoncom.com_error: pass print('\tCLSID = CLSID_Sink = ' + repr(self.clsid), file=stream) if self.coclass_clsid is None: print("\tcoclass_clsid = None", file=stream) else: print("\tcoclass_clsid = " + repr(self.coclass_clsid), file=stream) print('\t_public_methods_ = [] # For COM Server support', file=stream) WriteSinkEventMap(self, stream) print(file=stream) print('\tdef __init__(self, oobj = None):', file=stream) print("\t\tif oobj is None:", file=stream) print("\t\t\tself._olecp = None", file=stream) print("\t\telse:", file=stream) print('\t\t\timport win32com.server.util', file=stream) print('\t\t\tfrom win32com.server.policy import EventHandlerPolicy', file=stream) print('\t\t\tcpc=oobj._oleobj_.QueryInterface(pythoncom.IID_IConnectionPointContainer)', file=stream) print('\t\t\tcp=cpc.FindConnectionPoint(self.CLSID_Sink)', file=stream) print('\t\t\tcookie=cp.Advise(win32com.server.util.wrap(self, usePolicy=EventHandlerPolicy))', file=stream) print('\t\t\tself._olecp,self._olecp_cookie = cp,cookie', file=stream) print('\tdef __del__(self):', file=stream) print('\t\ttry:', file=stream) print('\t\t\tself.close()', file=stream) print('\t\texcept pythoncom.com_error:', file=stream) print('\t\t\tpass', file=stream) print('\tdef close(self):', file=stream) print('\t\tif self._olecp is not None:', file=stream) print('\t\t\tcp,cookie,self._olecp,self._olecp_cookie = self._olecp,self._olecp_cookie,None,None', file=stream) print('\t\t\tcp.Unadvise(cookie)', file=stream) print('\tdef _query_interface_(self, iid):', file=stream) print('\t\timport win32com.server.util', file=stream) print('\t\tif iid==self.CLSID_Sink: return win32com.server.util.wrap(self)', file=stream) print(file=stream) self.bWritten = 1 def WriteCallbackClassBody(self, generator): stream = generator.file print("\t# Event Handlers", file=stream) print("\t# If you create handlers, they should have the following prototypes:", file=stream) for name, entry in list(self.propMapGet.items()) + list(self.propMapPut.items()) + list(self.mapFuncs.items()): fdesc = entry.desc methName = MakeEventMethodName(entry.names[0]) print('#\tdef ' + methName + '(self' + build.BuildCallList(fdesc, entry.names, "defaultNamedOptArg", "defaultNamedNotOptArg","defaultUnnamedArg", "pythoncom.Missing", is_comment = True) + '):', file=stream) if entry.doc and entry.doc[1]: print('#\t\t' + build._makeDocString(entry.doc[1]), file=stream) print(file=stream) self.bWritten = 1 def WriteClassBody(self, generator): stream = generator.file # Write in alpha order. names = list(self.mapFuncs.keys()) names.sort() specialItems = {"count":None, "item":None,"value":None,"_newenum":None} # If found, will end up with (entry, invoke_tupe) itemCount = None for name in names: entry=self.mapFuncs[name] # skip [restricted] methods, unless it is the # enumerator (which, being part of the "system", # we know about and can use) dispid = entry.desc[0] if entry.desc[9] & pythoncom.FUNCFLAG_FRESTRICTED and \ dispid != pythoncom.DISPID_NEWENUM: continue # If not accessible via IDispatch, then we can't use it here. if entry.desc[3] != pythoncom.FUNC_DISPATCH: continue if dispid==pythoncom.DISPID_VALUE: lkey = "value" elif dispid==pythoncom.DISPID_NEWENUM: specialItems["_newenum"] = (entry, entry.desc[4], None) continue # Dont build this one now! else: lkey = name.lower() if lkey in specialItems and specialItems[lkey] is None: # remember if a special one. specialItems[lkey] = (entry, entry.desc[4], None) if generator.bBuildHidden or not entry.hidden: if entry.GetResultName(): print('\t# Result is of type ' + entry.GetResultName(), file=stream) if entry.wasProperty: print('\t# The method %s is actually a property, but must be used as a method to correctly pass the arguments' % name, file=stream) ret = self.MakeFuncMethod(entry,build.MakePublicAttributeName(name)) for line in ret: print(line, file=stream) print("\t_prop_map_get_ = {", file=stream) names = list(self.propMap.keys()); names.sort() for key in names: entry = self.propMap[key] if generator.bBuildHidden or not entry.hidden: resultName = entry.GetResultName() if resultName: print("\t\t# Property '%s' is an object of type '%s'" % (key, resultName), file=stream) lkey = key.lower() details = entry.desc resultDesc = details[2] argDesc = () mapEntry = MakeMapLineEntry(details[0], pythoncom.DISPATCH_PROPERTYGET, resultDesc, argDesc, key, entry.GetResultCLSIDStr()) if entry.desc[0]==pythoncom.DISPID_VALUE: lkey = "value" elif entry.desc[0]==pythoncom.DISPID_NEWENUM: lkey = "_newenum" else: lkey = key.lower() if lkey in specialItems and specialItems[lkey] is None: # remember if a special one. specialItems[lkey] = (entry, pythoncom.DISPATCH_PROPERTYGET, mapEntry) # All special methods, except _newenum, are written # "normally". This is a mess! if entry.desc[0]==pythoncom.DISPID_NEWENUM: continue print('\t\t"%s": %s,' % (build.MakePublicAttributeName(key), mapEntry), file=stream) names = list(self.propMapGet.keys()); names.sort() for key in names: entry = self.propMapGet[key] if generator.bBuildHidden or not entry.hidden: if entry.GetResultName(): print("\t\t# Method '%s' returns object of type '%s'" % (key, entry.GetResultName()), file=stream) details = entry.desc lkey = key.lower() argDesc = details[2] resultDesc = details[8] mapEntry = MakeMapLineEntry(details[0], pythoncom.DISPATCH_PROPERTYGET, resultDesc, argDesc, key, entry.GetResultCLSIDStr()) if entry.desc[0]==pythoncom.DISPID_VALUE: lkey = "value" elif entry.desc[0]==pythoncom.DISPID_NEWENUM: lkey = "_newenum" else: lkey = key.lower() if lkey in specialItems and specialItems[lkey] is None: # remember if a special one. specialItems[lkey]=(entry, pythoncom.DISPATCH_PROPERTYGET, mapEntry) # All special methods, except _newenum, are written # "normally". This is a mess! if entry.desc[0]==pythoncom.DISPID_NEWENUM: continue print('\t\t"%s": %s,' % (build.MakePublicAttributeName(key), mapEntry), file=stream) print("\t}", file=stream) print("\t_prop_map_put_ = {", file=stream) # These are "Invoke" args names = list(self.propMap.keys()); names.sort() for key in names: entry = self.propMap[key] if generator.bBuildHidden or not entry.hidden: lkey=key.lower() details = entry.desc # If default arg is None, write an empty tuple defArgDesc = build.MakeDefaultArgRepr(details[2]) if defArgDesc is None: defArgDesc = "" else: defArgDesc = defArgDesc + "," print('\t\t"%s" : ((%s, LCID, %d, 0),(%s)),' % (build.MakePublicAttributeName(key), details[0], pythoncom.DISPATCH_PROPERTYPUT, defArgDesc), file=stream) names = list(self.propMapPut.keys()); names.sort() for key in names: entry = self.propMapPut[key] if generator.bBuildHidden or not entry.hidden: details = entry.desc defArgDesc = MakeDefaultArgsForPropertyPut(details[2]) print('\t\t"%s": ((%s, LCID, %d, 0),%s),' % (build.MakePublicAttributeName(key), details[0], details[4], defArgDesc), file=stream) print("\t}", file=stream) if specialItems["value"]: entry, invoketype, propArgs = specialItems["value"] if propArgs is None: typename = "method" ret = self.MakeFuncMethod(entry,'__call__') else: typename = "property" ret = [ "\tdef __call__(self):\n\t\treturn self._ApplyTypes_(*%s)" % propArgs] print("\t# Default %s for this class is '%s'" % (typename, entry.names[0]), file=stream) for line in ret: print(line, file=stream) print("\tdef __str__(self, *args):", file=stream) print("\t\treturn str(self.__call__(*args))", file=stream) print("\tdef __int__(self, *args):", file=stream) print("\t\treturn int(self.__call__(*args))", file=stream) # _NewEnum (DISPID_NEWENUM) does not appear in typelib for many office objects, # but it can still be retrieved at runtime, so always create __iter__. # Also, some of those same objects use 1-based indexing, causing the old-style # __getitem__ iteration to fail for index 0 where the dynamic iteration succeeds. if specialItems["_newenum"]: enumEntry, invoketype, propArgs = specialItems["_newenum"] invkind = enumEntry.desc[4] # ??? Wouldn't this be the resultCLSID for the iterator itself, rather than the resultCLSID # for the result of each Next() call, which is what it's used for ??? resultCLSID = enumEntry.GetResultCLSIDStr() else: invkind = pythoncom.DISPATCH_METHOD | pythoncom.DISPATCH_PROPERTYGET resultCLSID = "None" # If we dont have a good CLSID for the enum result, assume it is the same as the Item() method. if resultCLSID == "None" and "Item" in self.mapFuncs: resultCLSID = self.mapFuncs["Item"].GetResultCLSIDStr() print('\tdef __iter__(self):', file=stream) print('\t\t"Return a Python iterator for this object"', file=stream) print('\t\ttry:', file=stream) print('\t\t\tob = self._oleobj_.InvokeTypes(%d,LCID,%d,(13, 10),())' % (pythoncom.DISPID_NEWENUM, invkind), file=stream) print('\t\texcept pythoncom.error:', file=stream) print('\t\t\traise TypeError("This object does not support enumeration")', file=stream) # Iterator is wrapped as PyIEnumVariant, and each result of __next__ is Dispatch'ed if necessary print('\t\treturn win32com.client.util.Iterator(ob, %s)' %resultCLSID, file=stream) if specialItems["item"]: entry, invoketype, propArgs = specialItems["item"] resultCLSID = entry.GetResultCLSIDStr() print('\t#This class has Item property/method which allows indexed access with the object[key] syntax.', file=stream) print('\t#Some objects will accept a string or other type of key in addition to integers.', file=stream) print('\t#Note that many Office objects do not use zero-based indexing.', file=stream) print('\tdef __getitem__(self, key):', file=stream) print('\t\treturn self._get_good_object_(self._oleobj_.Invoke(*(%d, LCID, %d, 1, key)), "Item", %s)' \ % (entry.desc[0], invoketype, resultCLSID), file=stream) if specialItems["count"]: entry, invoketype, propArgs = specialItems["count"] if propArgs is None: typename = "method" ret = self.MakeFuncMethod(entry,'__len__') else: typename = "property" ret = [ "\tdef __len__(self):\n\t\treturn self._ApplyTypes_(*%s)" % propArgs] print("\t#This class has Count() %s - allow len(ob) to provide this" % (typename), file=stream) for line in ret: print(line, file=stream) # Also include a __nonzero__ print("\t#This class has a __len__ - this is needed so 'if object:' always returns TRUE.", file=stream) print("\tdef __nonzero__(self):", file=stream) print("\t\treturn True", file=stream) class CoClassItem(build.OleItem, WritableItem): order = 5 typename = "COCLASS" def __init__(self, typeinfo, attr, doc=None, sources = [], interfaces = [], bForUser=1): build.OleItem.__init__(self, doc) self.clsid = attr[0] self.sources = sources self.interfaces = interfaces self.bIsDispatch = 1 # Pretend it is so it is written to the class map. def WriteClass(self, generator): generator.checkWriteCoClassBaseClass() doc = self.doc stream = generator.file if generator.generate_type == GEN_DEMAND_CHILD: # Some special imports we must setup. referenced_items = [] for ref, flag in self.sources: referenced_items.append(ref) for ref, flag in self.interfaces: referenced_items.append(ref) print("import sys", file=stream) for ref in referenced_items: print("__import__('%s.%s')" % (generator.base_mod_name, ref.python_name), file=stream) print("%s = sys.modules['%s.%s'].%s" % (ref.python_name, generator.base_mod_name, ref.python_name, ref.python_name), file=stream) # And pretend we have written it - the name is now available as if we had! ref.bWritten = 1 try: progId = pythoncom.ProgIDFromCLSID(self.clsid) print("# This CoClass is known by the name '%s'" % (progId), file=stream) except pythoncom.com_error: pass print('class %s(CoClassBaseClass): # A CoClass' % (self.python_name), file=stream) if doc and doc[1]: print('\t# ' + doc[1], file=stream) print('\tCLSID = %r' % (self.clsid,), file=stream) print('\tcoclass_sources = [', file=stream) defItem = None for item, flag in self.sources: if flag & pythoncom.IMPLTYPEFLAG_FDEFAULT: defItem = item # If we have written a Python class, reference the name - # otherwise just the IID. if item.bWritten: key = item.python_name else: key = repr(str(item.clsid)) # really the iid. print('\t\t%s,' % (key), file=stream) print('\t]', file=stream) if defItem: if defItem.bWritten: defName = defItem.python_name else: defName = repr(str(defItem.clsid)) # really the iid. print('\tdefault_source = %s' % (defName,), file=stream) print('\tcoclass_interfaces = [', file=stream) defItem = None for item, flag in self.interfaces: if flag & pythoncom.IMPLTYPEFLAG_FDEFAULT: # and dual: defItem = item # If we have written a class, refeence its name, otherwise the IID if item.bWritten: key = item.python_name else: key = repr(str(item.clsid)) # really the iid. print('\t\t%s,' % (key,), file=stream) print('\t]', file=stream) if defItem: if defItem.bWritten: defName = defItem.python_name else: defName = repr(str(defItem.clsid)) # really the iid. print('\tdefault_interface = %s' % (defName,), file=stream) self.bWritten = 1 print(file=stream) class GeneratorProgress: def __init__(self): pass def Starting(self, tlb_desc): """Called when the process starts. """ self.tlb_desc = tlb_desc def Finished(self): """Called when the process is complete. """ def SetDescription(self, desc, maxticks = None): """We are entering a major step. If maxticks, then this is how many ticks we expect to make until finished """ def Tick(self, desc = None): """Minor progress step. Can provide new description if necessary """ def VerboseProgress(self, desc): """Verbose/Debugging output. """ def LogWarning(self, desc): """If a warning is generated """ def LogBeginGenerate(self, filename): pass def Close(self): pass class Generator: def __init__(self, typelib, sourceFilename, progressObject, bBuildHidden=1, bUnicodeToString=None): assert bUnicodeToString is None, "this is deprecated and will go away" self.bHaveWrittenDispatchBaseClass = 0 self.bHaveWrittenCoClassBaseClass = 0 self.bHaveWrittenEventBaseClass = 0 self.typelib = typelib self.sourceFilename = sourceFilename self.bBuildHidden = bBuildHidden self.progress = progressObject # These 2 are later additions and most of the code still 'print's... self.file = None def CollectOleItemInfosFromType(self): ret = [] for i in range(self.typelib.GetTypeInfoCount()): info = self.typelib.GetTypeInfo(i) infotype = self.typelib.GetTypeInfoType(i) doc = self.typelib.GetDocumentation(i) attr = info.GetTypeAttr() ret.append((info, infotype, doc, attr)) return ret def _Build_CoClass(self, type_info_tuple): info, infotype, doc, attr = type_info_tuple # find the source and dispinterfaces for the coclass child_infos = [] for j in range(attr[8]): flags = info.GetImplTypeFlags(j) try: refType = info.GetRefTypeInfo(info.GetRefTypeOfImplType(j)) except pythoncom.com_error: # Can't load a dependent typelib? continue refAttr = refType.GetTypeAttr() child_infos.append( (info, refAttr.typekind, refType, refType.GetDocumentation(-1), refAttr, flags) ) # Done generating children - now the CoClass itself. newItem = CoClassItem(info, attr, doc) return newItem, child_infos def _Build_CoClassChildren(self, coclass, coclass_info, oleItems, vtableItems): sources = {} interfaces = {} for info, info_type, refType, doc, refAttr, flags in coclass_info: # sys.stderr.write("Attr typeflags for coclass referenced object %s=%d (%d), typekind=%d\n" % (name, refAttr.wTypeFlags, refAttr.wTypeFlags & pythoncom.TYPEFLAG_FDUAL,refAttr.typekind)) if refAttr.typekind == pythoncom.TKIND_DISPATCH or \ (refAttr.typekind == pythoncom.TKIND_INTERFACE and refAttr[11] & pythoncom.TYPEFLAG_FDISPATCHABLE): clsid = refAttr[0] if clsid in oleItems: dispItem = oleItems[clsid] else: dispItem = DispatchItem(refType, refAttr, doc) oleItems[dispItem.clsid] = dispItem dispItem.coclass_clsid = coclass.clsid if flags & pythoncom.IMPLTYPEFLAG_FSOURCE: dispItem.bIsSink = 1 sources[dispItem.clsid] = (dispItem, flags) else: interfaces[dispItem.clsid] = (dispItem, flags) # If dual interface, make do that too. if clsid not in vtableItems and refAttr[11] & pythoncom.TYPEFLAG_FDUAL: refType = refType.GetRefTypeInfo(refType.GetRefTypeOfImplType(-1)) refAttr = refType.GetTypeAttr() assert refAttr.typekind == pythoncom.TKIND_INTERFACE, "must be interface bynow!" vtableItem = VTableItem(refType, refAttr, doc) vtableItems[clsid] = vtableItem coclass.sources = list(sources.values()) coclass.interfaces = list(interfaces.values()) def _Build_Interface(self, type_info_tuple): info, infotype, doc, attr = type_info_tuple oleItem = vtableItem = None if infotype == pythoncom.TKIND_DISPATCH or \ (infotype == pythoncom.TKIND_INTERFACE and attr[11] & pythoncom.TYPEFLAG_FDISPATCHABLE): oleItem = DispatchItem(info, attr, doc) # If this DISPATCH interface dual, then build that too. if (attr.wTypeFlags & pythoncom.TYPEFLAG_FDUAL): # Get the vtable interface refhtype = info.GetRefTypeOfImplType(-1) info = info.GetRefTypeInfo(refhtype) attr = info.GetTypeAttr() infotype = pythoncom.TKIND_INTERFACE else: infotype = None assert infotype in [None, pythoncom.TKIND_INTERFACE], "Must be a real interface at this point" if infotype == pythoncom.TKIND_INTERFACE: vtableItem = VTableItem(info, attr, doc) return oleItem, vtableItem def BuildOleItemsFromType(self): assert self.bBuildHidden, "This code doesnt look at the hidden flag - I thought everyone set it true!?!?!" oleItems = {} enumItems = {} recordItems = {} vtableItems = {} for type_info_tuple in self.CollectOleItemInfosFromType(): info, infotype, doc, attr = type_info_tuple clsid = attr[0] if infotype == pythoncom.TKIND_ENUM or infotype == pythoncom.TKIND_MODULE: newItem = EnumerationItem(info, attr, doc) enumItems[newItem.doc[0]] = newItem # We never hide interfaces (MSAccess, for example, nominates interfaces as # hidden, assuming that you only ever use them via the CoClass) elif infotype in [pythoncom.TKIND_DISPATCH, pythoncom.TKIND_INTERFACE]: if clsid not in oleItems: oleItem, vtableItem = self._Build_Interface(type_info_tuple) oleItems[clsid] = oleItem # Even "None" goes in here. if vtableItem is not None: vtableItems[clsid] = vtableItem elif infotype == pythoncom.TKIND_RECORD or infotype == pythoncom.TKIND_UNION: newItem = RecordItem(info, attr, doc) recordItems[newItem.clsid] = newItem elif infotype == pythoncom.TKIND_ALIAS: # We dont care about alias' - handled intrinsicly. continue elif infotype == pythoncom.TKIND_COCLASS: newItem, child_infos = self._Build_CoClass(type_info_tuple) self._Build_CoClassChildren(newItem, child_infos, oleItems, vtableItems) oleItems[newItem.clsid] = newItem else: self.progress.LogWarning("Unknown TKIND found: %d" % infotype) return oleItems, enumItems, recordItems, vtableItems def open_writer(self, filename, encoding="mbcs"): # A place to put code to open a file with the appropriate encoding. # Does *not* set self.file - just opens and returns a file. # Actually returns a handle to a temp file - finish_writer then deletes # the filename asked for and puts everything back in place. This # is so errors don't leave a 1/2 generated file around causing bizarre # errors later, and so that multiple processes writing the same file # don't step on each others' toes. # Could be a classmethod one day... temp_filename = self.get_temp_filename(filename) return open(temp_filename, "wt", encoding=encoding) def finish_writer(self, filename, f, worked): f.close() try: os.unlink(filename) except os.error: pass temp_filename = self.get_temp_filename(filename) if worked: try: os.rename(temp_filename, filename) except os.error: # If we are really unlucky, another process may have written the # file in between our calls to os.unlink and os.rename. So try # again, but only once. # There are still some race conditions, but they seem difficult to # fix, and they probably occur much less frequently: # * The os.rename failure could occur more than once if more than # two processes are involved. # * In between os.unlink and os.rename, another process could try # to import the module, having seen that it already exists. # * If another process starts a COM server while we are still # generating __init__.py, that process sees that the folder # already exists and assumes that __init__.py is already there # as well. try: os.unlink(filename) except os.error: pass os.rename(temp_filename, filename) else: os.unlink(temp_filename) def get_temp_filename(self, filename): return '%s.%d.temp' % (filename, os.getpid()) def generate(self, file, is_for_demand = 0): if is_for_demand: self.generate_type = GEN_DEMAND_BASE else: self.generate_type = GEN_FULL self.file = file self.do_generate() self.file = None self.progress.Finished() def do_gen_file_header(self): la = self.typelib.GetLibAttr() moduleDoc = self.typelib.GetDocumentation(-1) docDesc = "" if moduleDoc[1]: docDesc = moduleDoc[1] # Reset all the 'per file' state self.bHaveWrittenDispatchBaseClass = 0 self.bHaveWrittenCoClassBaseClass = 0 self.bHaveWrittenEventBaseClass = 0 # You must provide a file correctly configured for writing unicode. # We assert this is it may indicate somewhere in pywin32 that needs # upgrading. assert self.file.encoding, self.file encoding = self.file.encoding # or "mbcs" print('# -*- coding: %s -*-' % (encoding,), file=self.file) print('# Created by makepy.py version %s' % (makepy_version,), file=self.file) print('# By python version %s' % \ (sys.version.replace("\n", "-"),), file=self.file) if self.sourceFilename: print("# From type library '%s'" % (os.path.split(self.sourceFilename)[1],), file=self.file) print('# On %s' % time.ctime(time.time()), file=self.file) print(build._makeDocString(docDesc), file=self.file) print('makepy_version =', repr(makepy_version), file=self.file) print('python_version = 0x%x' % (sys.hexversion,), file=self.file) print(file=self.file) print('import win32com.client.CLSIDToClass, pythoncom, pywintypes', file=self.file) print('import win32com.client.util', file=self.file) print('from pywintypes import IID', file=self.file) print('from win32com.client import Dispatch', file=self.file) print(file=self.file) print('# The following 3 lines may need tweaking for the particular server', file=self.file) print('# Candidates are pythoncom.Missing, .Empty and .ArgNotFound', file=self.file) print('defaultNamedOptArg=pythoncom.Empty', file=self.file) print('defaultNamedNotOptArg=pythoncom.Empty', file=self.file) print('defaultUnnamedArg=pythoncom.Empty', file=self.file) print(file=self.file) print('CLSID = ' + repr(la[0]), file=self.file) print('MajorVersion = ' + str(la[3]), file=self.file) print('MinorVersion = ' + str(la[4]), file=self.file) print('LibraryFlags = ' + str(la[5]), file=self.file) print('LCID = ' + hex(la[1]), file=self.file) print(file=self.file) def do_generate(self): moduleDoc = self.typelib.GetDocumentation(-1) stream = self.file docDesc = "" if moduleDoc[1]: docDesc = moduleDoc[1] self.progress.Starting(docDesc) self.progress.SetDescription("Building definitions from type library...") self.do_gen_file_header() oleItems, enumItems, recordItems, vtableItems = self.BuildOleItemsFromType() self.progress.SetDescription("Generating...", len(oleItems)+len(enumItems)+len(vtableItems)) # Generate the constants and their support. if enumItems: print("class constants:", file=stream) items = list(enumItems.values()) items.sort() num_written = 0 for oleitem in items: num_written += oleitem.WriteEnumerationItems(stream) self.progress.Tick() if not num_written: print("\tpass", file=stream) print(file=stream) if self.generate_type == GEN_FULL: items = [l for l in oleItems.values() if l is not None] items.sort() for oleitem in items: self.progress.Tick() oleitem.WriteClass(self) items = list(vtableItems.values()) items.sort() for oleitem in items: self.progress.Tick() oleitem.WriteClass(self) else: self.progress.Tick(len(oleItems)+len(vtableItems)) print('RecordMap = {', file=stream) for record in recordItems.values(): if record.clsid == pythoncom.IID_NULL: print("\t###%s: %s, # Record disabled because it doesn't have a non-null GUID" % (repr(record.doc[0]), repr(str(record.clsid))), file=stream) else: print("\t%s: %s," % (repr(record.doc[0]), repr(str(record.clsid))), file=stream) print("}", file=stream) print(file=stream) # Write out _all_ my generated CLSID's in the map if self.generate_type == GEN_FULL: print('CLSIDToClassMap = {', file=stream) for item in oleItems.values(): if item is not None and item.bWritten: print("\t'%s' : %s," % (str(item.clsid), item.python_name), file=stream) print('}', file=stream) print('CLSIDToPackageMap = {}', file=stream) print('win32com.client.CLSIDToClass.RegisterCLSIDsFromDict( CLSIDToClassMap )', file=stream) print("VTablesToPackageMap = {}", file=stream) print("VTablesToClassMap = {", file=stream) for item in vtableItems.values(): print("\t'%s' : '%s'," % (item.clsid,item.python_name), file=stream) print('}', file=stream) print(file=stream) else: print('CLSIDToClassMap = {}', file=stream) print('CLSIDToPackageMap = {', file=stream) for item in oleItems.values(): if item is not None: print("\t'%s' : %s," % (str(item.clsid), repr(item.python_name)), file=stream) print('}', file=stream) print("VTablesToClassMap = {}", file=stream) print("VTablesToPackageMap = {", file=stream) for item in vtableItems.values(): print("\t'%s' : '%s'," % (item.clsid,item.python_name), file=stream) print('}', file=stream) print(file=stream) print(file=stream) # Bit of a hack - build a temp map of iteItems + vtableItems - coClasses map = {} for item in oleItems.values(): if item is not None and not isinstance(item, CoClassItem): map[item.python_name] = item.clsid for item in vtableItems.values(): # No nones or CoClasses in this map map[item.python_name] = item.clsid print("NamesToIIDMap = {", file=stream) for name, iid in map.items(): print("\t'%s' : '%s'," % (name, iid), file=stream) print('}', file=stream) print(file=stream) if enumItems: print('win32com.client.constants.__dicts__.append(constants.__dict__)', file=stream) print(file=stream) def generate_child(self, child, dir): "Generate a single child. May force a few children to be built as we generate deps" self.generate_type = GEN_DEMAND_CHILD la = self.typelib.GetLibAttr() lcid = la[1] clsid = la[0] major=la[3] minor=la[4] self.base_mod_name = "win32com.gen_py." + str(clsid)[1:-1] + "x%sx%sx%s" % (lcid, major, minor) try: # Process the type library's CoClass objects, looking for the # specified name, or where a child has the specified name. # This ensures that all interesting things (including event interfaces) # are generated correctly. oleItems = {} vtableItems = {} infos = self.CollectOleItemInfosFromType() found = 0 for type_info_tuple in infos: info, infotype, doc, attr = type_info_tuple if infotype == pythoncom.TKIND_COCLASS: coClassItem, child_infos = self._Build_CoClass(type_info_tuple) found = build.MakePublicAttributeName(doc[0])==child if not found: # OK, check the child interfaces for info, info_type, refType, doc, refAttr, flags in child_infos: if build.MakePublicAttributeName(doc[0]) == child: found = 1 break if found: oleItems[coClassItem.clsid] = coClassItem self._Build_CoClassChildren(coClassItem, child_infos, oleItems, vtableItems) break if not found: # Doesn't appear in a class defn - look in the interface objects for it for type_info_tuple in infos: info, infotype, doc, attr = type_info_tuple if infotype in [pythoncom.TKIND_INTERFACE, pythoncom.TKIND_DISPATCH]: if build.MakePublicAttributeName(doc[0]) == child: found = 1 oleItem, vtableItem = self._Build_Interface(type_info_tuple) oleItems[clsid] = oleItem # Even "None" goes in here. if vtableItem is not None: vtableItems[clsid] = vtableItem assert found, "Cant find the '%s' interface in the CoClasses, or the interfaces" % (child,) # Make a map of iid: dispitem, vtableitem) items = {} for key, value in oleItems.items(): items[key] = (value,None) for key, value in vtableItems.items(): existing = items.get(key, None) if existing is not None: new_val = existing[0], value else: new_val = None, value items[key] = new_val self.progress.SetDescription("Generating...", len(items)) for oleitem, vtableitem in items.values(): an_item = oleitem or vtableitem assert not self.file, "already have a file?" # like makepy.py, we gen to a .temp file so failure doesn't # leave a 1/2 generated mess. out_name = os.path.join(dir, an_item.python_name) + ".py" worked = False self.file = self.open_writer(out_name) try: if oleitem is not None: self.do_gen_child_item(oleitem) if vtableitem is not None: self.do_gen_child_item(vtableitem) self.progress.Tick() worked = True finally: self.finish_writer(out_name, self.file, worked) self.file = None finally: self.progress.Finished() def do_gen_child_item(self, oleitem): moduleDoc = self.typelib.GetDocumentation(-1) docDesc = "" if moduleDoc[1]: docDesc = moduleDoc[1] self.progress.Starting(docDesc) self.progress.SetDescription("Building definitions from type library...") self.do_gen_file_header() oleitem.WriteClass(self) if oleitem.bWritten: print('win32com.client.CLSIDToClass.RegisterCLSID( "%s", %s )' % (oleitem.clsid, oleitem.python_name), file=self.file) def checkWriteDispatchBaseClass(self): if not self.bHaveWrittenDispatchBaseClass: print("from win32com.client import DispatchBaseClass", file=self.file) self.bHaveWrittenDispatchBaseClass = 1 def checkWriteCoClassBaseClass(self): if not self.bHaveWrittenCoClassBaseClass: print("from win32com.client import CoClassBaseClass", file=self.file) self.bHaveWrittenCoClassBaseClass = 1 def checkWriteEventBaseClass(self): # Not a base class as such... if not self.bHaveWrittenEventBaseClass: # Nothing to do any more! self.bHaveWrittenEventBaseClass = 1 if __name__=='__main__': print("This is a worker module. Please use makepy to generate Python files.") PK ѳP{} O Owin32com/client/combrowse.pyUT l_Zx`ux """A utility for browsing COM objects. Usage: Command Prompt Use the command *"python.exe catbrowse.py"*. This will display display a fairly small, modal dialog. Pythonwin Use the "Run Script" menu item, and this will create the browser in an MDI window. This window can be fully resized. Details This module allows browsing of registered Type Libraries, COM categories, and running COM objects. The display is similar to the Pythonwin object browser, and displays the objects in a hierarchical window. Note that this module requires the win32ui (ie, Pythonwin) distribution to work. """ import win32con import win32api, win32ui import sys import pythoncom from win32com.client import util from pywin.tools import browser class HLIRoot(browser.HLIPythonObject): def __init__(self, title): self.name = title def GetSubList(self): return [HLIHeadingCategory(), HLI_IEnumMoniker(pythoncom.GetRunningObjectTable().EnumRunning(), "Running Objects"), HLIHeadingRegisterdTypeLibs()] def __cmp__(self, other): return cmp(self.name, other.name) class HLICOM(browser.HLIPythonObject): def GetText(self): return self.name def CalculateIsExpandable(self): return 1 class HLICLSID(HLICOM): def __init__(self, myobject, name=None ): if type(myobject)==type(''): myobject = pythoncom.MakeIID(myobject) if name is None: try: name = pythoncom.ProgIDFromCLSID(myobject) except pythoncom.com_error: name = str(myobject) name = "IID: " + name HLICOM.__init__(self, myobject, name) def CalculateIsExpandable(self): return 0 def GetSubList(self): return [] class HLI_Interface(HLICOM): pass class HLI_Enum(HLI_Interface): def GetBitmapColumn(self): return 0 # Always a folder. def CalculateIsExpandable(self): if self.myobject is not None: rc = len(self.myobject.Next(1))>0 self.myobject.Reset() else: rc = 0 return rc pass class HLI_IEnumMoniker(HLI_Enum): def GetSubList(self): ctx = pythoncom.CreateBindCtx() ret = [] for mon in util.Enumerator(self.myobject): ret.append(HLI_IMoniker(mon, mon.GetDisplayName(ctx, None))) return ret class HLI_IMoniker(HLI_Interface): def GetSubList(self): ret = [] ret.append(browser.MakeHLI(self.myobject.Hash(), "Hash Value")) subenum = self.myobject.Enum(1) ret.append(HLI_IEnumMoniker(subenum, "Sub Monikers")) return ret class HLIHeadingCategory(HLICOM): "A tree heading for registered categories" def GetText(self): return "Registered Categories" def GetSubList(self): catinf=pythoncom.CoCreateInstance(pythoncom.CLSID_StdComponentCategoriesMgr,None,pythoncom.CLSCTX_INPROC,pythoncom.IID_ICatInformation) enum=util.Enumerator(catinf.EnumCategories()) ret = [] try: for catid, lcid, desc in enum: ret.append(HLICategory((catid, lcid, desc))) except pythoncom.com_error: # Registered categories occasionally seem to give spurious errors. pass # Use what we already have. return ret class HLICategory(HLICOM): "An actual Registered Category" def GetText(self): desc = self.myobject[2] if not desc: desc = "(unnamed category)" return desc def GetSubList(self): win32ui.DoWaitCursor(1) catid, lcid, desc = self.myobject catinf=pythoncom.CoCreateInstance(pythoncom.CLSID_StdComponentCategoriesMgr,None,pythoncom.CLSCTX_INPROC,pythoncom.IID_ICatInformation) ret = [] for clsid in util.Enumerator(catinf.EnumClassesOfCategories((catid,),())): ret.append(HLICLSID(clsid)) win32ui.DoWaitCursor(0) return ret class HLIHelpFile(HLICOM): def CalculateIsExpandable(self): return 0 def GetText(self): import os fname, ctx = self.myobject base = os.path.split(fname)[1] return "Help reference in %s" %( base) def TakeDefaultAction(self): fname, ctx = self.myobject if ctx: cmd = win32con.HELP_CONTEXT else: cmd = win32con.HELP_FINDER win32api.WinHelp(win32ui.GetMainFrame().GetSafeHwnd(), fname, cmd, ctx) def GetBitmapColumn(self): return 6 class HLIRegisteredTypeLibrary(HLICOM): def GetSubList(self): import os clsidstr, versionStr = self.myobject collected = [] helpPath = "" key = win32api.RegOpenKey(win32con.HKEY_CLASSES_ROOT, "TypeLib\\%s\\%s" % (clsidstr, versionStr)) win32ui.DoWaitCursor(1) try: num = 0 while 1: try: subKey = win32api.RegEnumKey(key, num) except win32api.error: break hSubKey = win32api.RegOpenKey(key, subKey) try: value, typ = win32api.RegQueryValueEx(hSubKey, None) if typ == win32con.REG_EXPAND_SZ: value = win32api.ExpandEnvironmentStrings(value) except win32api.error: value = "" if subKey=="HELPDIR": helpPath = value elif subKey=="Flags": flags = value else: try: lcid = int(subKey) lcidkey = win32api.RegOpenKey(key, subKey) # Enumerate the platforms lcidnum = 0 while 1: try: platform = win32api.RegEnumKey(lcidkey, lcidnum) except win32api.error: break try: hplatform = win32api.RegOpenKey(lcidkey, platform) fname, typ = win32api.RegQueryValueEx(hplatform, None) if typ == win32con.REG_EXPAND_SZ: fname = win32api.ExpandEnvironmentStrings(fname) except win32api.error: fname = "" collected.append((lcid, platform, fname)) lcidnum = lcidnum + 1 win32api.RegCloseKey(lcidkey) except ValueError: pass num = num + 1 finally: win32ui.DoWaitCursor(0) win32api.RegCloseKey(key) # Now, loop over my collected objects, adding a TypeLib and a HelpFile ret = [] # if helpPath: ret.append(browser.MakeHLI(helpPath, "Help Path")) ret.append(HLICLSID(clsidstr)) for lcid, platform, fname in collected: extraDescs = [] if platform!="win32": extraDescs.append(platform) if lcid: extraDescs.append("locale=%s"%lcid) extraDesc = "" if extraDescs: extraDesc = " (%s)" % ", ".join(extraDescs) ret.append(HLITypeLib(fname, "Type Library" + extraDesc)) ret.sort() return ret class HLITypeLibEntry(HLICOM): def GetText(self): tlb, index = self.myobject name, doc, ctx, helpFile = tlb.GetDocumentation(index) try: typedesc = HLITypeKinds[tlb.GetTypeInfoType(index)][1] except KeyError: typedesc = "Unknown!" return name + " - " + typedesc def GetSubList(self): tlb, index = self.myobject name, doc, ctx, helpFile = tlb.GetDocumentation(index) ret = [] if doc: ret.append(browser.HLIDocString(doc, "Doc")) if helpFile: ret.append(HLIHelpFile( (helpFile, ctx) )) return ret class HLICoClass(HLITypeLibEntry): def GetSubList(self): ret = HLITypeLibEntry.GetSubList(self) tlb, index = self.myobject typeinfo = tlb.GetTypeInfo(index) attr = typeinfo.GetTypeAttr() for j in range(attr[8]): flags = typeinfo.GetImplTypeFlags(j) refType = typeinfo.GetRefTypeInfo(typeinfo.GetRefTypeOfImplType(j)) refAttr = refType.GetTypeAttr() ret.append(browser.MakeHLI(refAttr[0], "Name=%s, Flags = %d" % (refAttr[0], flags))) return ret class HLITypeLibMethod(HLITypeLibEntry): def __init__(self, ob, name = None): self.entry_type = "Method" HLITypeLibEntry.__init__(self, ob, name) def GetSubList(self): ret = HLITypeLibEntry.GetSubList(self) tlb, index = self.myobject typeinfo = tlb.GetTypeInfo(index) attr = typeinfo.GetTypeAttr() for i in range(attr[7]): ret.append(HLITypeLibProperty((typeinfo, i))) for i in range(attr[6]): ret.append(HLITypeLibFunction((typeinfo, i))) return ret class HLITypeLibEnum(HLITypeLibEntry): def __init__(self, myitem): typelib, index = myitem typeinfo = typelib.GetTypeInfo(index) self.id = typeinfo.GetVarDesc(index)[0] name = typeinfo.GetNames(self.id)[0] HLITypeLibEntry.__init__(self, myitem, name) def GetText(self): return self.name + " - Enum/Module" def GetSubList(self): ret = [] typelib, index = self.myobject typeinfo = typelib.GetTypeInfo(index) attr = typeinfo.GetTypeAttr() for j in range(attr[7]): vdesc = typeinfo.GetVarDesc(j) name = typeinfo.GetNames(vdesc[0])[0] ret.append(browser.MakeHLI(vdesc[1], name)) return ret class HLITypeLibProperty(HLICOM): def __init__(self, myitem): typeinfo, index = myitem self.id = typeinfo.GetVarDesc(index)[0] name = typeinfo.GetNames(self.id)[0] HLICOM.__init__(self, myitem, name) def GetText(self): return self.name + " - Property" def GetSubList(self): ret = [] typeinfo, index = self.myobject names = typeinfo.GetNames(self.id) if len(names)>1: ret.append(browser.MakeHLI(names[1:], "Named Params")) vd = typeinfo.GetVarDesc(index) ret.append(browser.MakeHLI(self.id, "Dispatch ID")) ret.append(browser.MakeHLI(vd[1], "Value")) ret.append(browser.MakeHLI(vd[2], "Elem Desc")) ret.append(browser.MakeHLI(vd[3], "Var Flags")) ret.append(browser.MakeHLI(vd[4], "Var Kind")) return ret class HLITypeLibFunction(HLICOM): funckinds = {pythoncom.FUNC_VIRTUAL : "Virtual", pythoncom.FUNC_PUREVIRTUAL : "Pure Virtual", pythoncom.FUNC_STATIC : "Static", pythoncom.FUNC_DISPATCH : "Dispatch", } invokekinds = {pythoncom.INVOKE_FUNC: "Function", pythoncom.INVOKE_PROPERTYGET : "Property Get", pythoncom.INVOKE_PROPERTYPUT : "Property Put", pythoncom.INVOKE_PROPERTYPUTREF : "Property Put by reference", } funcflags = [(pythoncom.FUNCFLAG_FRESTRICTED, "Restricted"), (pythoncom.FUNCFLAG_FSOURCE, "Source"), (pythoncom.FUNCFLAG_FBINDABLE, "Bindable"), (pythoncom.FUNCFLAG_FREQUESTEDIT, "Request Edit"), (pythoncom.FUNCFLAG_FDISPLAYBIND, "Display Bind"), (pythoncom.FUNCFLAG_FDEFAULTBIND, "Default Bind"), (pythoncom.FUNCFLAG_FHIDDEN, "Hidden"), (pythoncom.FUNCFLAG_FUSESGETLASTERROR, "Uses GetLastError"), ] vartypes = {pythoncom.VT_EMPTY: "Empty", pythoncom.VT_NULL: "NULL", pythoncom.VT_I2: "Integer 2", pythoncom.VT_I4: "Integer 4", pythoncom.VT_R4: "Real 4", pythoncom.VT_R8: "Real 8", pythoncom.VT_CY: "CY", pythoncom.VT_DATE: "Date", pythoncom.VT_BSTR: "String", pythoncom.VT_DISPATCH: "IDispatch", pythoncom.VT_ERROR: "Error", pythoncom.VT_BOOL: "BOOL", pythoncom.VT_VARIANT: "Variant", pythoncom.VT_UNKNOWN: "IUnknown", pythoncom.VT_DECIMAL: "Decimal", pythoncom.VT_I1: "Integer 1", pythoncom.VT_UI1: "Unsigned integer 1", pythoncom.VT_UI2: "Unsigned integer 2", pythoncom.VT_UI4: "Unsigned integer 4", pythoncom.VT_I8: "Integer 8", pythoncom.VT_UI8: "Unsigned integer 8", pythoncom.VT_INT: "Integer", pythoncom.VT_UINT: "Unsigned integer", pythoncom.VT_VOID: "Void", pythoncom.VT_HRESULT: "HRESULT", pythoncom.VT_PTR: "Pointer", pythoncom.VT_SAFEARRAY: "SafeArray", pythoncom.VT_CARRAY: "C Array", pythoncom.VT_USERDEFINED: "User Defined", pythoncom.VT_LPSTR: "Pointer to string", pythoncom.VT_LPWSTR: "Pointer to Wide String", pythoncom.VT_FILETIME: "File time", pythoncom.VT_BLOB: "Blob", pythoncom.VT_STREAM: "IStream", pythoncom.VT_STORAGE: "IStorage", pythoncom.VT_STORED_OBJECT: "Stored object", pythoncom.VT_STREAMED_OBJECT: "Streamed object", pythoncom.VT_BLOB_OBJECT: "Blob object", pythoncom.VT_CF: "CF", pythoncom.VT_CLSID: "CLSID", } type_flags = [ (pythoncom.VT_VECTOR, "Vector"), (pythoncom.VT_ARRAY, "Array"), (pythoncom.VT_BYREF, "ByRef"), (pythoncom.VT_RESERVED, "Reserved"), ] def __init__(self, myitem): typeinfo, index = myitem self.id = typeinfo.GetFuncDesc(index)[0] name = typeinfo.GetNames(self.id)[0] HLICOM.__init__(self, myitem, name) def GetText(self): return self.name + " - Function" def MakeReturnTypeName(self, typ): justtyp = typ & pythoncom.VT_TYPEMASK try: typname = self.vartypes[justtyp] except KeyError: typname = "?Bad type?" for (flag, desc) in self.type_flags: if flag & typ: typname = "%s(%s)" % (desc, typname) return typname def MakeReturnType(self, returnTypeDesc): if type(returnTypeDesc)==type(()): first = returnTypeDesc[0] result = self.MakeReturnType(first) if first != pythoncom.VT_USERDEFINED: result = result + " " + self.MakeReturnType(returnTypeDesc[1]) return result else: return self.MakeReturnTypeName(returnTypeDesc) def GetSubList(self): ret = [] typeinfo, index = self.myobject names = typeinfo.GetNames(self.id) ret.append(browser.MakeHLI(self.id, "Dispatch ID")) if len(names)>1: ret.append(browser.MakeHLI(", ".join(names[1:]), "Named Params")) fd = typeinfo.GetFuncDesc(index) if fd[1]: ret.append(browser.MakeHLI(fd[1], "Possible result values")) if fd[8]: typ, flags, default = fd[8] val = self.MakeReturnType(typ) if flags: val = "%s (Flags=%d, default=%s)" % (val, flags, default) ret.append(browser.MakeHLI(val, "Return Type")) for argDesc in fd[2]: typ, flags, default = argDesc val = self.MakeReturnType(typ) if flags: val = "%s (Flags=%d)" % (val, flags) if default is not None: val = "%s (Default=%s)" % (val, default) ret.append(browser.MakeHLI(val, "Argument")) try: fkind = self.funckinds[fd[3]] except KeyError: fkind = "Unknown" ret.append(browser.MakeHLI(fkind, "Function Kind")) try: ikind = self.invokekinds[fd[4]] except KeyError: ikind = "Unknown" ret.append(browser.MakeHLI(ikind, "Invoke Kind")) # 5 = call conv # 5 = offset vtbl ret.append(browser.MakeHLI(fd[6], "Number Optional Params")) flagDescs = [] for flag, desc in self.funcflags: if flag & fd[9]: flagDescs.append(desc) if flagDescs: ret.append(browser.MakeHLI(", ".join(flagDescs), "Function Flags")) return ret HLITypeKinds = { pythoncom.TKIND_ENUM : (HLITypeLibEnum, 'Enumeration'), pythoncom.TKIND_RECORD : (HLITypeLibEntry, 'Record'), pythoncom.TKIND_MODULE : (HLITypeLibEnum, 'Module'), pythoncom.TKIND_INTERFACE : (HLITypeLibMethod, 'Interface'), pythoncom.TKIND_DISPATCH : (HLITypeLibMethod, 'Dispatch'), pythoncom.TKIND_COCLASS : (HLICoClass, 'CoClass'), pythoncom.TKIND_ALIAS : (HLITypeLibEntry, 'Alias'), pythoncom.TKIND_UNION : (HLITypeLibEntry, 'Union') } class HLITypeLib(HLICOM): def GetSubList(self): ret = [] ret.append(browser.MakeHLI(self.myobject, "Filename")) try: tlb = pythoncom.LoadTypeLib(self.myobject) except pythoncom.com_error: return [browser.MakeHLI("%s can not be loaded" % self.myobject)] for i in range(tlb.GetTypeInfoCount()): try: ret.append(HLITypeKinds[tlb.GetTypeInfoType(i)][0]( (tlb, i) ) ) except pythoncom.com_error: ret.append(browser.MakeHLI("The type info can not be loaded!")) ret.sort() return ret class HLIHeadingRegisterdTypeLibs(HLICOM): "A tree heading for registered type libraries" def GetText(self): return "Registered Type Libraries" def GetSubList(self): # Explicit lookup in the registry. ret = [] key = win32api.RegOpenKey(win32con.HKEY_CLASSES_ROOT, "TypeLib") win32ui.DoWaitCursor(1) try: num = 0 while 1: try: keyName = win32api.RegEnumKey(key, num) except win32api.error: break # Enumerate all version info subKey = win32api.RegOpenKey(key, keyName) name = None try: subNum = 0 bestVersion = 0.0 while 1: try: versionStr = win32api.RegEnumKey(subKey, subNum) except win32api.error: break try: versionFlt = float(versionStr) except ValueError: versionFlt = 0 # ???? if versionFlt > bestVersion: bestVersion = versionFlt name = win32api.RegQueryValue(subKey, versionStr) subNum = subNum + 1 finally: win32api.RegCloseKey(subKey) if name is not None: ret.append(HLIRegisteredTypeLibrary((keyName, versionStr), name)) num = num + 1 finally: win32api.RegCloseKey(key) win32ui.DoWaitCursor(0) ret.sort() return ret def main(): from pywin.tools import hierlist root = HLIRoot("COM Browser") if "app" in sys.modules: # do it in a window browser.MakeTemplate() browser.template.OpenObject(root) else: # list=hierlist.HierListWithItems( root, win32ui.IDB_BROWSER_HIER ) # dlg=hierlist.HierDialog("COM Browser",list) dlg = browser.dynamic_browser(root) dlg.DoModal() if __name__=='__main__': main() ni = pythoncom._GetInterfaceCount() ng = pythoncom._GetGatewayCount() if ni or ng: print("Warning - exiting with %d/%d objects alive" % (ni,ng)) PK {Rwin32com/demos/UT Zx`Zx`ux PK ѳP*uwin32com/demos/outlookAddin.pyUT l_Zx`ux # A demo plugin for Microsoft Outlook (NOT Outlook Express) # # This addin simply adds a new button to the main Outlook toolbar, # and displays a message box when clicked. Thus, it demonstrates # how to plug in to Outlook itself, and hook outlook events. # # Additionally, each time a new message arrives in the Inbox, a message # is printed with the subject of the message. # # To register the addin, simply execute: # outlookAddin.py # This will install the COM server, and write the necessary # AddIn key to Outlook # # To unregister completely: # outlookAddin.py --unregister # # To debug, execute: # outlookAddin.py --debug # # Then open Pythonwin, and select "Tools->Trace Collector Debugging Tool" # Restart Outlook, and you should see some output generated. # # NOTE: If the AddIn fails with an error, Outlook will re-register # the addin to not automatically load next time Outlook starts. To # correct this, simply re-register the addin (see above) from win32com import universal from win32com.server.exception import COMException from win32com.client import gencache, DispatchWithEvents import winerror import pythoncom from win32com.client import constants import sys # Support for COM objects we use. gencache.EnsureModule('{00062FFF-0000-0000-C000-000000000046}', 0, 9, 0, bForDemand=True) # Outlook 9 gencache.EnsureModule('{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}', 0, 2, 1, bForDemand=True) # Office 9 # The TLB defining the interfaces we implement universal.RegisterInterfaces('{AC0714F2-3D04-11D1-AE7D-00A0C90F26F4}', 0, 1, 0, ["_IDTExtensibility2"]) class ButtonEvent: def OnClick(self, button, cancel): import win32ui # Possible, but not necessary, to use a Pythonwin GUI win32ui.MessageBox("Hello from Python") return cancel class FolderEvent: def OnItemAdd(self, item): try: print("An item was added to the inbox with subject:", item.Subject) except AttributeError: print("An item was added to the inbox, but it has no subject! - ", repr(item)) class OutlookAddin: _com_interfaces_ = ['_IDTExtensibility2'] _public_methods_ = [] _reg_clsctx_ = pythoncom.CLSCTX_INPROC_SERVER _reg_clsid_ = "{0F47D9F3-598B-4d24-B7E3-92AC15ED27E2}" _reg_progid_ = "Python.Test.OutlookAddin" _reg_policy_spec_ = "win32com.server.policy.EventHandlerPolicy" def OnConnection(self, application, connectMode, addin, custom): print("OnConnection", application, connectMode, addin, custom) # ActiveExplorer may be none when started without a UI (eg, WinCE synchronisation) activeExplorer = application.ActiveExplorer() if activeExplorer is not None: bars = activeExplorer.CommandBars toolbar = bars.Item("Standard") item = toolbar.Controls.Add(Type=constants.msoControlButton, Temporary=True) # Hook events for the item item = self.toolbarButton = DispatchWithEvents(item, ButtonEvent) item.Caption="Python" item.TooltipText = "Click for Python" item.Enabled = True # And now, for the sake of demonstration, setup a hook for all new messages inbox = application.Session.GetDefaultFolder(constants.olFolderInbox) self.inboxItems = DispatchWithEvents(inbox.Items, FolderEvent) def OnDisconnection(self, mode, custom): print("OnDisconnection") def OnAddInsUpdate(self, custom): print("OnAddInsUpdate", custom) def OnStartupComplete(self, custom): print("OnStartupComplete", custom) def OnBeginShutdown(self, custom): print("OnBeginShutdown", custom) def RegisterAddin(klass): import winreg key = winreg.CreateKey(winreg.HKEY_CURRENT_USER, "Software\\Microsoft\\Office\\Outlook\\Addins") subkey = winreg.CreateKey(key, klass._reg_progid_) winreg.SetValueEx(subkey, "CommandLineSafe", 0, winreg.REG_DWORD, 0) winreg.SetValueEx(subkey, "LoadBehavior", 0, winreg.REG_DWORD, 3) winreg.SetValueEx(subkey, "Description", 0, winreg.REG_SZ, klass._reg_progid_) winreg.SetValueEx(subkey, "FriendlyName", 0, winreg.REG_SZ, klass._reg_progid_) def UnregisterAddin(klass): import winreg try: winreg.DeleteKey(winreg.HKEY_CURRENT_USER, "Software\\Microsoft\\Office\\Outlook\\Addins\\" + klass._reg_progid_) except WindowsError: pass if __name__ == '__main__': import win32com.server.register win32com.server.register.UseCommandLine(OutlookAddin) if "--unregister" in sys.argv: UnregisterAddin(OutlookAddin) else: RegisterAddin(OutlookAddin) PK ѳPwin32com/demos/trybag.pyUT l_Zx`ux import pythoncom from win32com.server import util from win32com.server import exception VT_EMPTY = pythoncom.VT_EMPTY class Bag: _public_methods_ = [ 'Read', 'Write' ] _com_interfaces_ = [ pythoncom.IID_IPropertyBag ] def __init__(self): self.data = { } def Read(self, propName, varType, errorLog): print("read: name=", propName, "type=", varType) if propName not in self.data: if errorLog: hr = 0x80070057 exc = pythoncom.com_error(0, "Bag.Read", "no such item", None, 0, hr) errorLog.AddError(propName, exc) raise exception.Exception(scode=hr) return self.data[propName] def Write(self, propName, value): print("write: name=", propName, "value=", value) self.data[propName] = value class Target: _public_methods_ = [ 'GetClassID', 'InitNew', 'Load', 'Save' ] _com_interfaces_ = [ pythoncom.IID_IPersist, pythoncom.IID_IPersistPropertyBag ] def GetClassID(self): raise exception.Exception(scode=0x80004005) # E_FAIL def InitNew(self): pass def Load(self, bag, log): print(bag.Read('prop1', VT_EMPTY, log)) print(bag.Read('prop2', VT_EMPTY, log)) try: print(bag.Read('prop3', VT_EMPTY, log)) except exception.Exception: pass def Save(self, bag, clearDirty, saveAllProps): bag.Write('prop1', 'prop1.hello') bag.Write('prop2', 'prop2.there') class Log: _public_methods_ = [ 'AddError' ] _com_interfaces_ = [ pythoncom.IID_IErrorLog ] def AddError(self, propName, excepInfo): print("error: propName=", propName, "error=", excepInfo) def test(): bag = Bag() target = Target() log = Log() target.Save(bag, 1, 1) target.Load(bag, log) comBag = util.wrap(bag, pythoncom.IID_IPropertyBag) comTarget = util.wrap(target, pythoncom.IID_IPersistPropertyBag) comLog = util.wrap(log, pythoncom.IID_IErrorLog) comTarget.Save(comBag, 1, 1) comTarget.Load(comBag, comLog) if __name__ == '__main__': test() PK ѳPk2JJwin32com/demos/connect.pyUT l_Zx`ux # Implements _both_ a connectable client, and a connectable server. # # Note that we cheat just a little - the Server in this demo is not created # via Normal COM - this means we can avoid registering the server. # However, the server _is_ accessed as a COM object - just the creation # is cheated on - so this is still working as a fully-fledged server. import pythoncom import win32com.server.util import win32com.server.connect from win32com.server.exception import Exception from pywin32_testutil import str2bytes # This is the IID of the Events interface both Client and Server support. IID_IConnectDemoEvents = pythoncom.MakeIID("{A4988850-49C3-11d0-AE5D-52342E000000}") # The server which implements # Create a connectable class, that has a single public method # 'DoIt', which echos to a single sink 'DoneIt' class ConnectableServer(win32com.server.connect.ConnectableServer): _public_methods_ = ["DoIt"] + win32com.server.connect.ConnectableServer._public_methods_ _connect_interfaces_ = [IID_IConnectDemoEvents] # The single public method that the client can call on us # (ie, as a normal COM server, this exposes just this single method. def DoIt(self,arg): # Simply broadcast a notification. self._BroadcastNotify(self.NotifyDoneIt, (arg,)) def NotifyDoneIt(self, interface, arg): interface.Invoke(1000, 0, pythoncom.DISPATCH_METHOD, 1, arg) # Here is the client side of the connection world. # Define a COM object which implements the methods defined by the # IConnectDemoEvents interface. class ConnectableClient: # This is another cheat - I _know_ the server defines the "DoneIt" event # as DISPID==1000 - I also know from the implementation details of COM # that the first method in _public_methods_ gets 1000. # Normally some explicit DISPID->Method mapping is required. _public_methods_ = ["OnDoneIt"] def __init__(self): self.last_event_arg = None # A client must implement QI, and respond to a query for the Event interface. # In addition, it must provide a COM object (which server.util.wrap) does. def _query_interface_(self, iid): import win32com.server.util # Note that this seems like a necessary hack. I am responding to IID_IConnectDemoEvents # but only creating an IDispatch gateway object. if iid==IID_IConnectDemoEvents: return win32com.server.util.wrap(self) # And here is our event method which gets called. def OnDoneIt(self, arg): self.last_event_arg = arg def CheckEvent(server, client, val, verbose): client.last_event_arg = None server.DoIt(val) if client.last_event_arg != val: raise RuntimeError("Sent %r, but got back %r" % (val, client.last_event_arg)) if verbose: print("Sent and received %r" % val) # A simple test script for all this. # In the real world, it is likely that the code controlling the server # will be in the same class as that getting the notifications. def test(verbose=0): import win32com.client.dynamic, win32com.client.connect import win32com.server.policy server = win32com.client.dynamic.Dispatch(win32com.server.util.wrap(ConnectableServer())) connection = win32com.client.connect.SimpleConnection() client = ConnectableClient() connection.Connect(server, client, IID_IConnectDemoEvents) CheckEvent(server, client, "Hello", verbose) CheckEvent(server, client, str2bytes("Here is a null>\x00<"), verbose) CheckEvent(server, client, "Here is a null>\x00<", verbose) val = "test-\xe0\xf2" # 2 extended characters. CheckEvent(server, client, val, verbose) if verbose: print("Everything seemed to work!") # Aggressive memory leak checking (ie, do nothing!) :-) All should cleanup OK??? if __name__=='__main__': test(1) PK ѳP15)win32com/demos/eventsApartmentThreaded.pyUT l_Zx`ux # A sample originally provided by Richard Bell, and modified by Mark Hammond. # This sample demonstrates how to use COM events in an aparment-threaded # world. In this world, COM itself ensures that all calls to and events # from an object happen on the same thread that created the object, even # if they originated from different threads. For this cross-thread # marshalling to work, this main thread *must* run a "message-loop" (ie, # a loop fetching and dispatching Windows messages). Without such message # processing, dead-locks can occur. # See also eventsFreeThreaded.py for how to do this in a free-threaded # world where these marshalling considerations do not exist. # NOTE: This example uses Internet Explorer, but it should not be considerd # a "best-practices" for writing against IE events, but for working with # events in general. For example: # * The first OnDocumentComplete event is not a reliable indicator that the # URL has completed loading # * As we are demonstrating the most efficient way of handling events, when # running this sample you will see an IE Windows briefly appear, but # vanish without ever being repainted. import sys import os import win32com.client import win32api import win32event # sys.coinit_flags not set, so pythoncom initializes apartment-threaded. import pythoncom import time class ExplorerEvents: def __init__(self): self.event = win32event.CreateEvent(None, 0, 0, None) def OnDocumentComplete(self, pDisp=pythoncom.Empty, URL=pythoncom.Empty): thread = win32api.GetCurrentThreadId() print("OnDocumentComplete event processed on thread %d"%thread) # Set the event our main thread is waiting on. win32event.SetEvent(self.event) def OnQuit(self): thread = win32api.GetCurrentThreadId() print("OnQuit event processed on thread %d"%thread) win32event.SetEvent(self.event) def WaitWhileProcessingMessages(event, timeout = 2): start = time.clock() while True: # Wake 4 times a second - we can't just specify the # full timeout here, as then it would reset for every # message we process. rc = win32event.MsgWaitForMultipleObjects( (event,), 0, 250, win32event.QS_ALLEVENTS) if rc == win32event.WAIT_OBJECT_0: # event signalled - stop now! return True if (time.clock() - start) > timeout: # Timeout expired. return False # must be a message. pythoncom.PumpWaitingMessages() def TestExplorerEvents(): iexplore = win32com.client.DispatchWithEvents( "InternetExplorer.Application", ExplorerEvents) thread = win32api.GetCurrentThreadId() print('TestExplorerEvents created IE object on thread %d'%thread) iexplore.Visible = 1 try: iexplore.Navigate(win32api.GetFullPathName('..\\readme.htm')) except pythoncom.com_error as details: print("Warning - could not open the test HTML file", details) # Wait for the event to be signalled while pumping messages. if not WaitWhileProcessingMessages(iexplore.event): print("Document load event FAILED to fire!!!") iexplore.Quit() # # Give IE a chance to shutdown, else it can get upset on fast machines. # Note, Quit generates events. Although this test does NOT catch them # it is NECESSARY to pump messages here instead of a sleep so that the Quit # happens properly! if not WaitWhileProcessingMessages(iexplore.event): print("OnQuit event FAILED to fire!!!") iexplore = None if __name__=='__main__': TestExplorerEvents() PK Y03Kwin32com/demos/__init__.pyUT  Yux PK ѳP\ED D win32com/demos/dump_clipboard.pyUT l_Zx`ux import pythoncom import win32con formats = """CF_TEXT CF_BITMAP CF_METAFILEPICT CF_SYLK CF_DIF CF_TIFF CF_OEMTEXT CF_DIB CF_PALETTE CF_PENDATA CF_RIFF CF_WAVE CF_UNICODETEXT CF_ENHMETAFILE CF_HDROP CF_LOCALE CF_MAX CF_OWNERDISPLAY CF_DSPTEXT CF_DSPBITMAP CF_DSPMETAFILEPICT CF_DSPENHMETAFILE""".split() format_name_map = {} for f in formats: val = getattr(win32con, f) format_name_map[val]=f tymeds = [attr for attr in pythoncom.__dict__.keys() if attr.startswith("TYMED_")] def DumpClipboard(): do = pythoncom.OleGetClipboard() print("Dumping all clipboard formats...") for fe in do.EnumFormatEtc(): fmt, td, aspect, index, tymed = fe tymeds_this = [getattr(pythoncom, t) for t in tymeds if tymed & getattr(pythoncom, t)] print("Clipboard format", format_name_map.get(fmt,str(fmt))) for t_this in tymeds_this: # As we are enumerating there should be no need to call # QueryGetData, but we do anyway! fetc_query = fmt, td, aspect, index, t_this try: do.QueryGetData(fetc_query) except pythoncom.com_error: print("Eeek - QGD indicated failure for tymed", t_this) # now actually get it. try: medium = do.GetData(fetc_query) except pythoncom.com_error as exc: print("Failed to get the clipboard data:", exc) continue if medium.tymed==pythoncom.TYMED_GDI: data = "GDI handle %d" % medium.data elif medium.tymed==pythoncom.TYMED_MFPICT: data = "METAFILE handle %d" % medium.data elif medium.tymed==pythoncom.TYMED_ENHMF: data = "ENHMETAFILE handle %d" % medium.data elif medium.tymed==pythoncom.TYMED_HGLOBAL: data = "%d bytes via HGLOBAL" % len(medium.data) elif medium.tymed==pythoncom.TYMED_FILE: data = "filename '%s'" % data elif medium.tymed==pythoncom.TYMED_ISTREAM: stream = medium.data stream.Seek(0,0) bytes = 0 while 1: chunk = stream.Read(4096) if not chunk: break bytes += len(chunk) data = "%d bytes via IStream" % bytes elif medium.tymed==pythoncom.TYMED_ISTORAGE: data = "a IStorage" else: data = "*** unknown tymed!" print(" -> got", data) do = None if __name__=='__main__': DumpClipboard() if pythoncom._GetInterfaceCount()+pythoncom._GetGatewayCount(): print("XXX - Leaving with %d/%d COM objects alive" % \ (pythoncom._GetInterfaceCount(), pythoncom._GetGatewayCount())) PK ѳP#+"**win32com/demos/ietoolbar.pyUT l_Zx`ux # -*- coding: latin-1 -*- # PyWin32 Internet Explorer Toolbar # # written by Leonard Ritter (paniq@gmx.net) # and Robert Frtsch (info@robert-foertsch.com) """ This sample implements a simple IE Toolbar COM server supporting Windows XP styles and access to the IWebBrowser2 interface. It also demonstrates how to hijack the parent window to catch WM_COMMAND messages. """ # imports section import sys, os from win32com import universal from win32com.client import gencache, DispatchWithEvents, Dispatch from win32com.client import constants, getevents import win32com import pythoncom import winreg from win32com.shell import shell from win32com.shell.shellcon import * from win32com.axcontrol import axcontrol try: # try to get styles (winxp) import winxpgui as win32gui except: # import default module (win2k and lower) import win32gui import win32ui import win32con import commctrl import array, struct # ensure we know the ms internet controls typelib so we have access to IWebBrowser2 later on win32com.client.gencache.EnsureModule('{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}',0,1,1) # IDeskBand_methods = ['GetBandInfo'] IDockingWindow_methods = ['ShowDW','CloseDW','ResizeBorderDW'] IOleWindow_methods = ['GetWindow','ContextSensitiveHelp'] IInputObject_methods = ['UIActivateIO','HasFocusIO','TranslateAcceleratorIO'] IObjectWithSite_methods = ['SetSite','GetSite'] IPersistStream_methods = ['GetClassID','IsDirty','Load','Save','GetSizeMax'] _ietoolbar_methods_ = IDeskBand_methods + IDockingWindow_methods + \ IOleWindow_methods + IInputObject_methods + \ IObjectWithSite_methods + IPersistStream_methods _ietoolbar_com_interfaces_ = [ shell.IID_IDeskBand, # IDeskBand axcontrol.IID_IObjectWithSite, # IObjectWithSite pythoncom.IID_IPersistStream, axcontrol.IID_IOleCommandTarget, ] class WIN32STRUCT: def __init__(self, **kw): full_fmt = "" for name, fmt, default in self._struct_items_: self.__dict__[name] = None if fmt == "z": full_fmt += "pi" else: full_fmt += fmt for name, val in kw.items(): self.__dict__[name] = val def __setattr__(self, attr, val): if not attr.startswith("_") and attr not in self.__dict__: raise AttributeError(attr) self.__dict__[attr] = val def toparam(self): self._buffs = [] full_fmt = "" vals = [] for name, fmt, default in self._struct_items_: val = self.__dict__[name] if fmt == "z": fmt = "Pi" if val is None: vals.append(0) vals.append(0) else: str_buf = array.array("c", val+'\0') vals.append(str_buf.buffer_info()[0]) vals.append(len(val)) self._buffs.append(str_buf) # keep alive during the call. else: if val is None: val = default vals.append(val) full_fmt += fmt return struct.pack(*(full_fmt,) + tuple(vals)) class TBBUTTON(WIN32STRUCT): _struct_items_ = [ ("iBitmap", "i", 0), ("idCommand", "i", 0), ("fsState", "B", 0), ("fsStyle", "B", 0), ("bReserved", "H", 0), ("dwData", "I", 0), ("iString", "z", None), ] class Stub: """ this class serves as a method stub, outputting debug info whenever the object is being called. """ def __init__(self,name): self.name = name def __call__(self,*args): print('STUB: ',self.name,args) class IEToolbarCtrl: """ a tiny wrapper for our winapi-based toolbar control implementation. """ def __init__(self,hwndparent): styles = win32con.WS_CHILD \ | win32con.WS_VISIBLE \ | win32con.WS_CLIPSIBLINGS \ | win32con.WS_CLIPCHILDREN \ | commctrl.TBSTYLE_LIST \ | commctrl.TBSTYLE_FLAT \ | commctrl.TBSTYLE_TRANSPARENT \ | commctrl.CCS_TOP \ | commctrl.CCS_NODIVIDER \ | commctrl.CCS_NORESIZE \ | commctrl.CCS_NOPARENTALIGN self.hwnd = win32gui.CreateWindow('ToolbarWindow32', None, styles, 0, 0, 100, 100, hwndparent, 0, win32gui.dllhandle, None) win32gui.SendMessage(self.hwnd, commctrl.TB_BUTTONSTRUCTSIZE, 20, 0) def ShowWindow(self,mode): win32gui.ShowWindow(self.hwnd,mode) def AddButtons(self,*buttons): tbbuttons = '' for button in buttons: tbbuttons += button.toparam() return win32gui.SendMessage(self.hwnd, commctrl.TB_ADDBUTTONS, len(buttons), tbbuttons) def GetSafeHwnd(self): return self.hwnd class IEToolbar: """ The actual COM server class """ _com_interfaces_ = _ietoolbar_com_interfaces_ _public_methods_ = _ietoolbar_methods_ _reg_clsctx_ = pythoncom.CLSCTX_INPROC_SERVER # if you copy and modify this example, be sure to change the clsid below _reg_clsid_ = "{F21202A2-959A-4149-B1C3-68B9013F3335}" _reg_progid_ = "PyWin32.IEToolbar" _reg_desc_ = 'PyWin32 IE Toolbar' def __init__( self ): # put stubs for non-implemented methods for method in self._public_methods_: if not hasattr(self,method): print('providing default stub for %s' % method) setattr(self,method,Stub(method)) def GetWindow(self): return self.toolbar.GetSafeHwnd() def Load(self, stream): # called when the toolbar is loaded pass def Save(self, pStream, fClearDirty): # called when the toolbar shall save its information pass def CloseDW(self, dwReserved): del self.toolbar def ShowDW(self, bShow): if bShow: self.toolbar.ShowWindow(win32con.SW_SHOW) else: self.toolbar.ShowWindow(win32con.SW_HIDE) def on_first_button(self): print("first!") self.webbrowser.Navigate2('http://starship.python.net/crew/mhammond/') def on_second_button(self): print("second!") def on_third_button(self): print("third!") def toolbar_command_handler(self,args): hwnd,message,wparam,lparam,time,point = args if lparam == self.toolbar.GetSafeHwnd(): self._command_map[wparam]() def SetSite(self,unknown): if unknown: # retrieve the parent window interface for this site olewindow = unknown.QueryInterface(pythoncom.IID_IOleWindow) # ask the window for its handle hwndparent = olewindow.GetWindow() # first get a command target cmdtarget = unknown.QueryInterface(axcontrol.IID_IOleCommandTarget) # then travel over to a service provider serviceprovider = cmdtarget.QueryInterface(pythoncom.IID_IServiceProvider) # finally ask for the internet explorer application, returned as a dispatch object self.webbrowser = win32com.client.Dispatch(serviceprovider.QueryService('{0002DF05-0000-0000-C000-000000000046}',pythoncom.IID_IDispatch)) # now create and set up the toolbar self.toolbar = IEToolbarCtrl(hwndparent) buttons = [ ('Visit PyWin32 Homepage',self.on_first_button), ('Another Button', self.on_second_button), ('Yet Another Button', self.on_third_button), ] self._command_map = {} # wrap our parent window so we can hook message handlers window = win32ui.CreateWindowFromHandle(hwndparent) # add the buttons for i in range(len(buttons)): button = TBBUTTON() name,func = buttons[i] id = 0x4444+i button.iBitmap = -2 button.idCommand = id button.fsState = commctrl.TBSTATE_ENABLED button.fsStyle = commctrl.TBSTYLE_BUTTON button.iString = name self._command_map[0x4444+i] = func self.toolbar.AddButtons(button) window.HookMessage(self.toolbar_command_handler,win32con.WM_COMMAND) else: # lose all references self.webbrowser = None def GetClassID(self): return self._reg_clsid_ def GetBandInfo(self, dwBandId, dwViewMode, dwMask): ptMinSize = (0,24) ptMaxSize = (2000,24) ptIntegral = (0,0) ptActual = (2000,24) wszTitle = 'PyWin32 IE Toolbar' dwModeFlags = DBIMF_VARIABLEHEIGHT crBkgnd = 0 return (ptMinSize,ptMaxSize,ptIntegral,ptActual,wszTitle,dwModeFlags,crBkgnd) # used for HKLM install def DllInstall( bInstall, cmdLine ): comclass = IEToolbar # register plugin def DllRegisterServer(): comclass = IEToolbar # register toolbar with IE try: print("Trying to register Toolbar.\n") hkey = winreg.CreateKey( winreg.HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Internet Explorer\\Toolbar" ) subKey = winreg.SetValueEx( hkey, comclass._reg_clsid_, 0, winreg.REG_BINARY, "\0" ) except WindowsError: print("Couldn't set registry value.\nhkey: %d\tCLSID: %s\n" % ( hkey, comclass._reg_clsid_ )) else: print("Set registry value.\nhkey: %d\tCLSID: %s\n" % ( hkey, comclass._reg_clsid_ )) # TODO: implement reg settings for standard toolbar button # unregister plugin def DllUnregisterServer(): comclass = IEToolbar # unregister toolbar from internet explorer try: print("Trying to unregister Toolbar.\n") hkey = winreg.CreateKey( winreg.HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Internet Explorer\\Toolbar" ) winreg.DeleteValue( hkey, comclass._reg_clsid_ ) except WindowsError: print("Couldn't delete registry value.\nhkey: %d\tCLSID: %s\n" % ( hkey, comclass._reg_clsid_ )) else: print("Deleting reg key succeeded.\n") # entry point if __name__ == '__main__': import win32com.server.register win32com.server.register.UseCommandLine( IEToolbar ) # parse actual command line option if "--unregister" in sys.argv: DllUnregisterServer() else: DllRegisterServer() else: # import trace utility for remote debugging import win32traceutil PK ѳP $win32com/demos/eventsFreeThreaded.pyUT l_Zx`ux # A sample originally provided by Richard Bell, and modified by Mark Hammond. # This sample demonstrates how to use COM events in a free-threaded world. # In this world, there is no need to marshall calls across threads, so # no message loops are needed at all. This means regular cross-thread # sychronization can be used. In this sample we just wait on win32 event # objects. # See also ieEventsApartmentThreaded.py for how to do this in an # aparment-threaded world, where thread-marshalling complicates things. # NOTE: This example uses Internet Explorer, but it should not be considerd # a "best-practices" for writing against IE events, but for working with # events in general. For example: # * The first OnDocumentComplete event is not a reliable indicator that the # URL has completed loading # * As we are demonstrating the most efficient way of handling events, when # running this sample you will see an IE Windows briefly appear, but # vanish without ever being repainted. import sys sys.coinit_flags=0 # specify free threading import os import win32api import win32event import win32com.client import pythoncom import time # The print statements indicate that COM has actually started another thread # and will deliver the events to that thread (ie, the events do not actually # fire on our main thread. class ExplorerEvents: def __init__(self): # We reuse this event for all events. self.event = win32event.CreateEvent(None, 0, 0, None) def OnDocumentComplete(self, pDisp=pythoncom.Empty, URL=pythoncom.Empty): # # Caution: Since the main thread and events thread(s) are different # it may be necessary to serialize access to shared data. Because # this is a simple test case, that is not required here. Your # situation may be different. Caveat programmer. # thread = win32api.GetCurrentThreadId() print("OnDocumentComplete event processed on thread %d"%thread) # Set the event our main thread is waiting on. win32event.SetEvent(self.event) def OnQuit(self): thread = win32api.GetCurrentThreadId() print("OnQuit event processed on thread %d"%thread) win32event.SetEvent(self.event) def TestExplorerEvents(): iexplore = win32com.client.DispatchWithEvents( "InternetExplorer.Application", ExplorerEvents) thread = win32api.GetCurrentThreadId() print('TestExplorerEvents created IE object on thread %d'%thread) iexplore.Visible = 1 try: iexplore.Navigate(win32api.GetFullPathName('..\\readme.htm')) except pythoncom.com_error as details: print("Warning - could not open the test HTML file", details) # In this free-threaded example, we can simply wait until an event has # been set - we will give it 2 seconds before giving up. rc = win32event.WaitForSingleObject(iexplore.event, 2000) if rc != win32event.WAIT_OBJECT_0: print("Document load event FAILED to fire!!!") iexplore.Quit() # Now we can do the same thing to wait for exit! # Although Quit generates events, in this free-threaded world we # do *not* need to run any message pumps. rc = win32event.WaitForSingleObject(iexplore.event, 2000) if rc != win32event.WAIT_OBJECT_0: print("OnQuit event FAILED to fire!!!") iexplore = None print("Finished the IE event sample!") if __name__=='__main__': TestExplorerEvents() PK ѳP$$win32com/demos/iebutton.pyUT l_Zx`ux # -*- coding: latin-1 -*- # PyWin32 Internet Explorer Button # # written by Leonard Ritter (paniq@gmx.net) # and Robert Frtsch (info@robert-foertsch.com) """ This sample implements a simple IE Button COM server with access to the IWebBrowser2 interface. To demonstrate: * Execute this script to register the server. * Open Pythonwin's Tools -> Trace Collector Debugging Tool, so you can see the output of 'print' statements in this demo. * Open a new IE instance. The toolbar should have a new "scissors" icon, with tooltip text "IE Button" - this is our new button - click it. * Switch back to the Pythonwin window - you should see: IOleCommandTarget::Exec called. This is the button being clicked. Extending this to do something more useful is left as an exercise. Contribtions to this sample to make it a little "friendlier" welcome! """ # imports section import sys, os from win32com import universal from win32com.client import gencache, DispatchWithEvents, Dispatch from win32com.client import constants, getevents import win32com.server.register import win32com import pythoncom import win32api # This demo uses 'print' - use win32traceutil to see it if we have no # console. try: win32api.GetConsoleTitle() except win32api.error: import win32traceutil from win32com.axcontrol import axcontrol import array, struct # ensure we know the ms internet controls typelib so we have access to IWebBrowser2 later on win32com.client.gencache.EnsureModule('{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}',0,1,1) # IObjectWithSite_methods = ['SetSite','GetSite'] IOleCommandTarget_methods = ['Exec','QueryStatus'] _iebutton_methods_ = IOleCommandTarget_methods + IObjectWithSite_methods _iebutton_com_interfaces_ = [ axcontrol.IID_IOleCommandTarget, axcontrol.IID_IObjectWithSite, # IObjectWithSite ] class Stub: """ this class serves as a method stub, outputting debug info whenever the object is being called. """ def __init__(self,name): self.name = name def __call__(self,*args): print('STUB: ',self.name,args) class IEButton: """ The actual COM server class """ _com_interfaces_ = _iebutton_com_interfaces_ _public_methods_ = _iebutton_methods_ _reg_clsctx_ = pythoncom.CLSCTX_INPROC_SERVER _button_text_ = 'IE Button' _tool_tip_ = 'An example implementation for an IE Button.' _icon_ = '' _hot_icon_ = '' def __init__( self ): # put stubs for non-implemented methods for method in self._public_methods_: if not hasattr(self,method): print('providing default stub for %s' % method) setattr(self,method,Stub(method)) def QueryStatus (self, pguidCmdGroup, prgCmds, cmdtextf): # 'cmdtextf' is the 'cmdtextf' element from the OLECMDTEXT structure, # or None if a NULL pointer was passed. result = [] for id, flags in prgCmds: flags |= axcontrol.OLECMDF_SUPPORTED | axcontrol.OLECMDF_ENABLED result.append((id, flags)) if cmdtextf is None: cmdtext = None # must return None if nothing requested. # IE never seems to want any text - this code is here for # demo purposes only elif cmdtextf == axcontrol.OLECMDTEXTF_NAME: cmdtext = "IEButton Name" else: cmdtext = "IEButton State" return result, cmdtext def Exec(self, pguidCmdGroup, nCmdID, nCmdExecOpt, pvaIn): print(pguidCmdGroup, nCmdID, nCmdExecOpt, pvaIn) print("IOleCommandTarget::Exec called.") #self.webbrowser.ShowBrowserBar(GUID_IETOOLBAR, not is_ietoolbar_visible()) def SetSite(self,unknown): if unknown: # first get a command target cmdtarget = unknown.QueryInterface(axcontrol.IID_IOleCommandTarget) # then travel over to a service provider serviceprovider = cmdtarget.QueryInterface(pythoncom.IID_IServiceProvider) # finally ask for the internet explorer application, returned as a dispatch object self.webbrowser = win32com.client.Dispatch(serviceprovider.QueryService('{0002DF05-0000-0000-C000-000000000046}',pythoncom.IID_IDispatch)) else: # lose all references self.webbrowser = None def GetClassID(self): return self._reg_clsid_ def register(classobj): import winreg subKeyCLSID = "SOFTWARE\\Microsoft\\Internet Explorer\\Extensions\\%38s" % classobj._reg_clsid_ try: hKey = winreg.CreateKey( winreg.HKEY_LOCAL_MACHINE, subKeyCLSID ) subKey = winreg.SetValueEx( hKey, "ButtonText", 0, winreg.REG_SZ, classobj._button_text_ ) winreg.SetValueEx( hKey, "ClsidExtension", 0, winreg.REG_SZ, classobj._reg_clsid_ ) # reg value for calling COM object winreg.SetValueEx( hKey, "CLSID", 0, winreg.REG_SZ, "{1FBA04EE-3024-11D2-8F1F-0000F87ABD16}" ) # CLSID for button that sends command to COM object winreg.SetValueEx( hKey, "Default Visible", 0, winreg.REG_SZ, "Yes" ) winreg.SetValueEx( hKey, "ToolTip", 0, winreg.REG_SZ, classobj._tool_tip_ ) winreg.SetValueEx( hKey, "Icon", 0, winreg.REG_SZ, classobj._icon_) winreg.SetValueEx( hKey, "HotIcon", 0, winreg.REG_SZ, classobj._hot_icon_) except WindowsError: print("Couldn't set standard toolbar reg keys.") else: print("Set standard toolbar reg keys.") def unregister(classobj): import winreg subKeyCLSID = "SOFTWARE\\Microsoft\\Internet Explorer\\Extensions\\%38s" % classobj._reg_clsid_ try: hKey = winreg.CreateKey( winreg.HKEY_LOCAL_MACHINE, subKeyCLSID ) subKey = winreg.DeleteValue( hKey, "ButtonText" ) winreg.DeleteValue( hKey, "ClsidExtension" ) # for calling COM object winreg.DeleteValue( hKey, "CLSID" ) winreg.DeleteValue( hKey, "Default Visible" ) winreg.DeleteValue( hKey, "ToolTip" ) winreg.DeleteValue( hKey, "Icon" ) winreg.DeleteValue( hKey, "HotIcon" ) winreg.DeleteKey( winreg.HKEY_LOCAL_MACHINE, subKeyCLSID ) except WindowsError: print("Couldn't delete Standard toolbar regkey.") else: print("Deleted Standard toolbar regkey.") # # test implementation # class PyWin32InternetExplorerButton(IEButton): _reg_clsid_ = "{104B66A9-9E68-49D1-A3F5-94754BE9E0E6}" _reg_progid_ = "PyWin32.IEButton" _reg_desc_ = 'Test Button' _button_text_ = 'IE Button' _tool_tip_ = 'An example implementation for an IE Button.' _icon_ = '' _hot_icon_ = _icon_ def DllRegisterServer(): register(PyWin32InternetExplorerButton) def DllUnregisterServer(): unregister(PyWin32InternetExplorerButton) if __name__ == '__main__': win32com.server.register.UseCommandLine(PyWin32InternetExplorerButton, finalize_register = DllRegisterServer, finalize_unregister = DllUnregisterServer) PK ѳP_E77win32com/demos/excelAddin.pyUT l_Zx`ux # A demo plugin for Microsoft Excel # # This addin simply adds a new button to the main Excel toolbar, # and displays a message box when clicked. Thus, it demonstrates # how to plug in to Excel itself, and hook Excel events. # # # To register the addin, simply execute: # excelAddin.py # This will install the COM server, and write the necessary # AddIn key to Excel # # To unregister completely: # excelAddin.py --unregister # # To debug, execute: # excelAddin.py --debug # # Then open Pythonwin, and select "Tools->Trace Collector Debugging Tool" # Restart excel, and you should see some output generated. # # NOTE: If the AddIn fails with an error, Excel will re-register # the addin to not automatically load next time Excel starts. To # correct this, simply re-register the addin (see above) # # Author Eric Koome # Copyright (c) 2003 Wavecom Inc. All rights reserved # # Redistribution and use in source and binary forms, with or without #modification, are permitted provided that the following conditions #are met: # #1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE # DISCLAIMED. IN NO EVENT SHALL ERIC KOOME OR # ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT # OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. from win32com import universal from win32com.server.exception import COMException from win32com.client import gencache, DispatchWithEvents import winerror import pythoncom from win32com.client import constants, Dispatch import sys # Support for COM objects we use. gencache.EnsureModule('{00020813-0000-0000-C000-000000000046}', 0, 1, 3, bForDemand=True) # Excel 9 gencache.EnsureModule('{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}', 0, 2, 1, bForDemand=True) # Office 9 # The TLB defiining the interfaces we implement universal.RegisterInterfaces('{AC0714F2-3D04-11D1-AE7D-00A0C90F26F4}', 0, 1, 0, ["_IDTExtensibility2"]) class ButtonEvent: def OnClick(self, button, cancel): import win32ui # Possible, but not necessary, to use a Pythonwin GUI import win32con win32ui.MessageBox("Hello from Python", "Python Test",win32con.MB_OKCANCEL) return cancel class ExcelAddin: _com_interfaces_ = ['_IDTExtensibility2'] _public_methods_ = [] _reg_clsctx_ = pythoncom.CLSCTX_INPROC_SERVER _reg_clsid_ = "{C5482ECA-F559-45A0-B078-B2036E6F011A}" _reg_progid_ = "Python.Test.ExcelAddin" _reg_policy_spec_ = "win32com.server.policy.EventHandlerPolicy" def __init__(self): self.appHostApp = None def OnConnection(self, application, connectMode, addin, custom): print("OnConnection", application, connectMode, addin, custom) try: self.appHostApp = application cbcMyBar = self.appHostApp.CommandBars.Add(Name="PythonBar", Position=constants.msoBarTop, MenuBar=constants.msoBarTypeNormal, Temporary=True) btnMyButton = cbcMyBar.Controls.Add(Type=constants.msoControlButton, Parameter="Greetings") btnMyButton=self.toolbarButton = DispatchWithEvents(btnMyButton, ButtonEvent) btnMyButton.Style = constants.msoButtonCaption btnMyButton.BeginGroup = True btnMyButton.Caption = "&Python" btnMyButton.TooltipText = "Python rules the World" btnMyButton.Width = "34" cbcMyBar.Visible = True except pythoncom.com_error as xxx_todo_changeme: (hr, msg, exc, arg) = xxx_todo_changeme.args print("The Excel call failed with code %d: %s" % (hr, msg)) if exc is None: print("There is no extended error information") else: wcode, source, text, helpFile, helpId, scode = exc print("The source of the error is", source) print("The error message is", text) print("More info can be found in %s (id=%d)" % (helpFile, helpId)) def OnDisconnection(self, mode, custom): print("OnDisconnection") self.appHostApp.CommandBars("PythonBar").Delete self.appHostApp=None def OnAddInsUpdate(self, custom): print("OnAddInsUpdate", custom) def OnStartupComplete(self, custom): print("OnStartupComplete", custom) def OnBeginShutdown(self, custom): print("OnBeginShutdown", custom) def RegisterAddin(klass): import winreg key = winreg.CreateKey(winreg.HKEY_CURRENT_USER, "Software\\Microsoft\\Office\\Excel\\Addins") subkey = winreg.CreateKey(key, klass._reg_progid_) winreg.SetValueEx(subkey, "CommandLineSafe", 0, winreg.REG_DWORD, 0) winreg.SetValueEx(subkey, "LoadBehavior", 0, winreg.REG_DWORD, 3) winreg.SetValueEx(subkey, "Description", 0, winreg.REG_SZ, "Excel Addin") winreg.SetValueEx(subkey, "FriendlyName", 0, winreg.REG_SZ, "A Simple Excel Addin") def UnregisterAddin(klass): import winreg try: winreg.DeleteKey(winreg.HKEY_CURRENT_USER, "Software\\Microsoft\\Office\\Excel\\Addins\\" + klass._reg_progid_) except WindowsError: pass if __name__ == '__main__': import win32com.server.register win32com.server.register.UseCommandLine(ExcelAddin) if "--unregister" in sys.argv: UnregisterAddin(ExcelAddin) else: RegisterAddin(ExcelAddin) PK ѳPME<< win32com/demos/excelRTDServer.pyUT l_Zx`ux """Excel IRTDServer implementation. This module is a functional example of how to implement the IRTDServer interface in python, using the pywin32 extensions. Further details, about this interface and it can be found at: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnexcl2k2/html/odc_xlrtdfaq.asp """ # Copyright (c) 2003-2004 by Chris Nilsson # # By obtaining, using, and/or copying this software and/or its # associated documentation, you agree that you have read, understood, # and will comply with the following terms and conditions: # # Permission to use, copy, modify, and distribute this software and # its associated documentation for any purpose and without fee is # hereby granted, provided that the above copyright notice appears in # all copies, and that both that copyright notice and this permission # notice appear in supporting documentation, and that the name of # Christopher Nilsson (the author) not be used in advertising or publicity # pertaining to distribution of the software without specific, written # prior permission. # # THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD # TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- # ABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR # BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY # DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS # ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. import pythoncom import win32com.client from win32com import universal from win32com.client import gencache from win32com.server.exception import COMException import threading import datetime # For the example classes... # Typelib info for version 10 - aka Excel XP. # This is the minimum version of excel that we can work with as this is when # Microsoft introduced these interfaces. EXCEL_TLB_GUID = '{00020813-0000-0000-C000-000000000046}' EXCEL_TLB_LCID = 0 EXCEL_TLB_MAJOR = 1 EXCEL_TLB_MINOR = 4 # Import the excel typelib to make sure we've got early-binding going on. # The "ByRef" parameters we use later won't work without this. gencache.EnsureModule(EXCEL_TLB_GUID, EXCEL_TLB_LCID, \ EXCEL_TLB_MAJOR, EXCEL_TLB_MINOR) # Tell pywin to import these extra interfaces. # -- # QUESTION: Why? The interfaces seem to descend from IDispatch, so # I'd have thought, for example, calling callback.UpdateNotify() (on the # IRTDUpdateEvent callback excel gives us) would work without molestation. # But the callback needs to be cast to a "real" IRTDUpdateEvent type. Hmm... # This is where my small knowledge of the pywin framework / COM gets hazy. # -- # Again, we feed in the Excel typelib as the source of these interfaces. universal.RegisterInterfaces(EXCEL_TLB_GUID, EXCEL_TLB_LCID, EXCEL_TLB_MAJOR, EXCEL_TLB_MINOR, ['IRtdServer','IRTDUpdateEvent']) class ExcelRTDServer(object): """Base RTDServer class. Provides most of the features needed to implement the IRtdServer interface. Manages topic adding, removal, and packing up the values for excel. Shouldn't be instanciated directly. Instead, descendant classes should override the CreateTopic() method. Topic objects only need to provide a GetValue() function to play nice here. The values given need to be atomic (eg. string, int, float... etc). Also note: nothing has been done within this class to ensure that we get time to check our topics for updates. I've left that up to the subclass since the ways, and needs, of refreshing your topics will vary greatly. For example, the sample implementation uses a timer thread to wake itself up. Whichever way you choose to do it, your class needs to be able to wake up occaisionally, since excel will never call your class without being asked to first. Excel will communicate with our object in this order: 1. Excel instanciates our object and calls ServerStart, providing us with an IRTDUpdateEvent callback object. 2. Excel calls ConnectData when it wants to subscribe to a new "topic". 3. When we have new data to provide, we call the UpdateNotify method of the callback object we were given. 4. Excel calls our RefreshData method, and receives a 2d SafeArray (row-major) containing the Topic ids in the 1st dim, and the topic values in the 2nd dim. 5. When not needed anymore, Excel will call our DisconnectData to unsubscribe from a topic. 6. When there are no more topics left, Excel will call our ServerTerminate method to kill us. Throughout, at undetermined periods, Excel will call our Heartbeat method to see if we're still alive. It must return a non-zero value, or we'll be killed. NOTE: By default, excel will at most call RefreshData once every 2 seconds. This is a setting that needs to be changed excel-side. To change this, you can set the throttle interval like this in the excel VBA object model: Application.RTD.ThrottleInterval = 1000 ' milliseconds """ _com_interfaces_ = ['IRtdServer'] _public_methods_ = ['ConnectData','DisconnectData','Heartbeat', 'RefreshData','ServerStart','ServerTerminate'] _reg_clsctx_ = pythoncom.CLSCTX_INPROC_SERVER #_reg_clsid_ = "# subclass must provide this class attribute" #_reg_desc_ = "# subclass should provide this description" #_reg_progid_ = "# subclass must provide this class attribute" ALIVE = 1 NOT_ALIVE = 0 def __init__(self): """Constructor""" super(ExcelRTDServer, self).__init__() self.IsAlive = self.ALIVE self.__callback = None self.topics = {} def SignalExcel(self): """Use the callback we were given to tell excel new data is available.""" if self.__callback is None: raise COMException(desc="Callback excel provided is Null") self.__callback.UpdateNotify() def ConnectData(self, TopicID, Strings, GetNewValues): """Creates a new topic out of the Strings excel gives us.""" try: self.topics[TopicID] = self.CreateTopic(Strings) except Exception as why: raise COMException(desc=str(why)) GetNewValues = True result = self.topics[TopicID] if result is None: result = "# %s: Waiting for update" % self.__class__.__name__ else: result = result.GetValue() # fire out internal event... self.OnConnectData(TopicID) # GetNewValues as per interface is ByRef, so we need to pass it back too. return result, GetNewValues def DisconnectData(self, TopicID): """Deletes the given topic.""" self.OnDisconnectData(TopicID) if TopicID in self.topics: self.topics[TopicID] = None del self.topics[TopicID] def Heartbeat(self): """Called by excel to see if we're still here.""" return self.IsAlive def RefreshData(self, TopicCount): """Packs up the topic values. Called by excel when it's ready for an update. Needs to: * Return the current number of topics, via the "ByRef" TopicCount * Return a 2d SafeArray of the topic data. - 1st dim: topic numbers - 2nd dim: topic values We could do some caching, instead of repacking everytime... But this works for demonstration purposes.""" TopicCount = len(self.topics) self.OnRefreshData() # Grow the lists, so we don't need a heap of calls to append() results = [[None] * TopicCount, [None] * TopicCount] # Excel expects a 2-dimensional array. The first dim contains the # topic numbers, and the second contains the values for the topics. # In true VBA style (yuck), we need to pack the array in row-major format, # which looks like: # ( (topic_num1, topic_num2, ..., topic_numN), \ # (topic_val1, topic_val2, ..., topic_valN) ) for idx, topicdata in enumerate(self.topics.items()): topicNum, topic = topicdata results[0][idx] = topicNum results[1][idx] = topic.GetValue() # TopicCount is meant to be passed to us ByRef, so return it as well, as per # the way pywin32 handles ByRef arguments. return tuple(results), TopicCount def ServerStart(self, CallbackObject): """Excel has just created us... We take its callback for later, and set up shop.""" self.IsAlive = self.ALIVE if CallbackObject is None: raise COMException(desc='Excel did not provide a callback') # Need to "cast" the raw PyIDispatch object to the IRTDUpdateEvent interface IRTDUpdateEventKlass = win32com.client.CLSIDToClass.GetClass('{A43788C1-D91B-11D3-8F39-00C04F3651B8}') self.__callback = IRTDUpdateEventKlass(CallbackObject) self.OnServerStart() return self.IsAlive def ServerTerminate(self): """Called when excel no longer wants us.""" self.IsAlive = self.NOT_ALIVE # On next heartbeat, excel will free us self.OnServerTerminate() def CreateTopic(self, TopicStrings=None): """Topic factory method. Subclass must override. Topic objects need to provide: * GetValue() method which returns an atomic value. Will raise NotImplemented if not overridden. """ raise NotImplemented('Subclass must implement') # Overridable class events... def OnConnectData(self, TopicID): """Called when a new topic has been created, at excel's request.""" pass def OnDisconnectData(self, TopicID): """Called when a topic is about to be deleted, at excel's request.""" pass def OnRefreshData(self): """Called when excel has requested all current topic data.""" pass def OnServerStart(self): """Called when excel has instanciated us.""" pass def OnServerTerminate(self): """Called when excel is about to destroy us.""" pass class RTDTopic(object): """Base RTD Topic. Only method required by our RTDServer implementation is GetValue(). The others are more for convenience.""" def __init__(self, TopicStrings): super(RTDTopic, self).__init__() self.TopicStrings = TopicStrings self.__currentValue = None self.__dirty = False def Update(self, sender): """Called by the RTD Server. Gives us a chance to check if our topic data needs to be changed (eg. check a file, quiz a database, etc).""" raise NotImplemented('subclass must implement') def Reset(self): """Call when this topic isn't considered "dirty" anymore.""" self.__dirty = False def GetValue(self): return self.__currentValue def SetValue(self, value): self.__dirty = True self.__currentValue = value def HasChanged(self): return self.__dirty # -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= ###################################### # Example classes ###################################### class TimeServer(ExcelRTDServer): """Example Time RTD server. Sends time updates back to excel. example of use, in an excel sheet: =RTD("Python.RTD.TimeServer","","seconds","5") This will cause a timestamp string to fill the cell, and update its value every 5 seconds (or as close as possible depending on how busy excel is). The empty string parameter denotes the com server is running on the local machine. Otherwise, put in the hostname to look on. For more info on this, lookup the Excel help for its "RTD" worksheet function. Obviously, you'd want to wrap this kind of thing in a friendlier VBA function. Also, remember that the RTD function accepts a maximum of 28 arguments! If you want to pass more, you may need to concatenate arguments into one string, and have your topic parse them appropriately. """ # win32com.server setup attributes... # Never copy the _reg_clsid_ value in your own classes! _reg_clsid_ = '{EA7F2CF1-11A2-45E4-B2D5-68E240DB8CB1}' _reg_progid_ = 'Python.RTD.TimeServer' _reg_desc_ = "Python class implementing Excel IRTDServer -- feeds time" # other class attributes... INTERVAL = 0.5 # secs. Threaded timer will wake us up at this interval. def __init__(self): super(TimeServer, self).__init__() # Simply timer thread to ensure we get to update our topics, and # tell excel about any changes. This is a pretty basic and dirty way to # do this. Ideally, there should be some sort of waitable (eg. either win32 # event, socket data event...) and be kicked off by that event triggering. # As soon as we set up shop here, we _must_ return control back to excel. # (ie. we can't block and do our own thing...) self.ticker = threading.Timer(self.INTERVAL, self.Update) def OnServerStart(self): self.ticker.start() def OnServerTerminate(self): if not self.ticker.finished.isSet(): self.ticker.cancel() # Cancel our wake-up thread. Excel has killed us. def Update(self): # Get our wake-up thread ready... self.ticker = threading.Timer(self.INTERVAL, self.Update) try: # Check if any of our topics have new info to pass on if len(self.topics): refresh = False for topic in self.topics.values(): topic.Update(self) if topic.HasChanged(): refresh = True topic.Reset() if refresh: self.SignalExcel() finally: self.ticker.start() # Make sure we get to run again def CreateTopic(self, TopicStrings=None): """Topic factory. Builds a TimeTopic object out of the given TopicStrings.""" return TimeTopic(TopicStrings) class TimeTopic(RTDTopic): """Example topic for example RTD server. Will accept some simple commands to alter how long to delay value updates. Commands: * seconds, delay_in_seconds * minutes, delay_in_minutes * hours, delay_in_hours """ def __init__(self, TopicStrings): super(TimeTopic, self).__init__(TopicStrings) try: self.cmd, self.delay = self.TopicStrings except Exception as E: # We could simply return a "# ERROR" type string as the # topic value, but explosions like this should be able to get handled by # the VBA-side "On Error" stuff. raise ValueError("Invalid topic strings: %s" % str(TopicStrings)) #self.cmd = str(self.cmd) self.delay = float(self.delay) # setup our initial value self.checkpoint = self.timestamp() self.SetValue(str(self.checkpoint)) def timestamp(self): return datetime.datetime.now() def Update(self, sender): now = self.timestamp() delta = now - self.checkpoint refresh = False if self.cmd == "seconds": if delta.seconds >= self.delay: refresh = True elif self.cmd == "minutes": if delta.minutes >= self.delay: refresh = True elif self.cmd == "hours": if delta.hours >= self.delay: refresh = True else: self.SetValue("#Unknown command: " + self.cmd) if refresh: self.SetValue(str(now)) self.checkpoint = now if __name__ == "__main__": import win32com.server.register # Register/Unregister TimeServer example # eg. at the command line: excelrtd.py --register # Then type in an excel cell something like: # =RTD("Python.RTD.TimeServer","","seconds","5") win32com.server.register.UseCommandLine(TimeServer) PK {Rwin32com/servers/UT Zx`Zx`ux PK ѳP[win32com/servers/perfmon.pyUT l_Zx`ux """A COM Server which exposes the NT Performance monitor in a very rudimentary way Usage from VB: set ob = CreateObject("Python.PerfmonQuery") freeBytes = ob.Query("Memory", "Available Bytes") """ from win32com.server import exception, register import pythoncom, win32pdhutil, winerror class PerfMonQuery: _reg_verprogid_ = "Python.PerfmonQuery.1" _reg_progid_ = "Python.PerfmonQuery" _reg_desc_ = "Python Performance Monitor query object" _reg_clsid_ = "{64cef7a0-8ece-11d1-a65a-00aa00125a98}" _reg_class_spec_ = "win32com.servers.perfmon.PerfMonQuery" _public_methods_ = [ 'Query' ] def Query(self, object, counter, instance = None, machine = None): try: return win32pdhutil.GetPerformanceAttributes(object, counter, instance, machine=machine) except win32pdhutil.error as exc: raise exception.Exception(desc=exc.strerror) except TypeError as desc: raise exception.Exception(desc=desc,scode=winerror.DISP_E_TYPEMISMATCH) if __name__=='__main__': print("Registering COM server...") register.UseCommandLine(PerfMonQuery) PK v,XQ4_>>win32com/servers/PythonTools.pyUT 0_Zx`ux import sys import time class Tools: _public_methods_ = [ 'reload', 'adddir', 'echo', 'sleep' ] def reload(self, module): if module in sys.modules: from importlib import reload reload(sys.modules[module]) return "reload succeeded." return "no reload performed." def adddir(self, dir): if type(dir) == type(''): sys.path.append(dir) return str(sys.path) def echo(self, arg): return repr(arg) def sleep(self, t): time.sleep(t) if __name__=='__main__': from win32com.server.register import RegisterServer, UnregisterServer clsid = "{06ce7630-1d81-11d0-ae37-c2fa70000000}" progid = "Python.Tools" verprogid = "Python.Tools.1" if "--unregister" in sys.argv: print("Unregistering...") UnregisterServer(clsid, progid, verprogid) print("Unregistered OK") else: print("Registering COM server...") RegisterServer(clsid, "win32com.servers.PythonTools.Tools", "Python Tools", progid, verprogid) print("Class registered.") PK Y03Kwin32com/servers/__init__.pyUT  Yux PK Q#KQ"win32com/servers/test_pycomtest.pyUT z_Zx`ux # This is part of the Python test suite. # The object is registered when you first run the test suite. # (and hopefully unregistered once done ;-) # Ensure the vtables in the tlb are known. from win32com import universal from win32com.server.exception import COMException from win32com.client import gencache import winerror from win32com.client import constants from win32com.server.util import wrap import pythoncom pythoncom.__future_currency__ = True # We use the constants from the module, so must insist on a gencache. # Otherwise, use of gencache is not necessary (tho still advised) gencache.EnsureModule('{6BCDCB60-5605-11D0-AE5F-CADD4C000000}', 0, 1, 1) class PyCOMTest: _typelib_guid_ = "{6BCDCB60-5605-11D0-AE5F-CADD4C000000}" _typelib_version = 1,0 _com_interfaces_ = ['IPyCOMTest'] _reg_clsid_ = "{e743d9cd-cb03-4b04-b516-11d3a81c1597}" _reg_progid_ = "Python.Test.PyCOMTest" def DoubleString(self, str): return str*2 def DoubleInOutString(self, str): return str*2 def Fire(self, nID): raise COMException(hresult=winerror.E_NOTIMPL) def GetLastVarArgs(self): raise COMException(hresult=winerror.E_NOTIMPL) def GetMultipleInterfaces(self, outinterface1, outinterface2): raise COMException(hresult=winerror.E_NOTIMPL) def GetSafeArrays(self, attrs, attrs2, ints): raise COMException(hresult=winerror.E_NOTIMPL) def GetSetDispatch(self, indisp): raise COMException(hresult=winerror.E_NOTIMPL) # Result is of type IPyCOMTest def GetSetInterface(self, ininterface): return wrap(self) def GetSetVariant(self, indisp): return indisp def TestByRefVariant(self, v): return v * 2 def TestByRefString(self, v): return v * 2 # Result is of type IPyCOMTest def GetSetInterfaceArray(self, ininterface): raise COMException(hresult=winerror.E_NOTIMPL) def GetSetUnknown(self, inunk): raise COMException(hresult=winerror.E_NOTIMPL) # Result is of type ISimpleCounter def GetSimpleCounter(self): raise COMException(hresult=winerror.E_NOTIMPL) def GetSimpleSafeArray(self, ints): raise COMException(hresult=winerror.E_NOTIMPL) def GetStruct(self): raise COMException(hresult=winerror.E_NOTIMPL) def SetIntSafeArray(self, ints): return len(ints) def SetLongLongSafeArray(self, ints): return len(ints) def SetULongLongSafeArray(self, ints): return len(ints) def SetBinSafeArray(self, buf): return len(buf) def SetVarArgs(self, *args): raise COMException(hresult=winerror.E_NOTIMPL) def SetVariantSafeArray(self, vars): raise COMException(hresult=winerror.E_NOTIMPL) def Start(self): raise COMException(hresult=winerror.E_NOTIMPL) def Stop(self, nID): raise COMException(hresult=winerror.E_NOTIMPL) def StopAll(self): raise COMException(hresult=winerror.E_NOTIMPL) def TakeByRefDispatch(self, inout): raise COMException(hresult=winerror.E_NOTIMPL) def TakeByRefTypedDispatch(self, inout): raise COMException(hresult=winerror.E_NOTIMPL) def Test(self, key, inval): return not inval def Test2(self, inval): return inval def Test3(self, inval): raise COMException(hresult=winerror.E_NOTIMPL) def Test4(self, inval): raise COMException(hresult=winerror.E_NOTIMPL) def Test5(self, inout): if inout == constants.TestAttr1: return constants.TestAttr1_1 elif inout == constants.TestAttr1_1: return constants.TestAttr1 else: return -1 def Test6(self, inval): return inval def TestInOut(self, fval, bval, lval): return winerror.S_OK, fval * 2, not bval, lval * 2 def TestOptionals(self, strArg='def', sval=0, lval=1, dval=3.1400001049041748): raise COMException(hresult=winerror.E_NOTIMPL) def TestOptionals2(self, dval, strval='', sval=1): raise COMException(hresult=winerror.E_NOTIMPL) def CheckVariantSafeArray(self, data): return 1 def LongProp(self): return self.longval def SetLongProp(self, val): self.longval = val def ULongProp(self): return self.ulongval def SetULongProp(self, val): self.ulongval = val def IntProp(self): return self.intval def SetIntProp(self, val): self.intval = val class PyCOMTestMI(PyCOMTest): _typelib_guid_ = "{6BCDCB60-5605-11D0-AE5F-CADD4C000000}" _typelib_version = 1,0 # Interfaces with a interface name, a real IID, and an IID as a string _com_interfaces_ = ['IPyCOMTest', pythoncom.IID_IStream, str(pythoncom.IID_IStorage), ] _reg_clsid_ = "{F506E9A1-FB46-4238-A597-FA4EB69787CA}" _reg_progid_ = "Python.Test.PyCOMTestMI" if __name__ == '__main__': import win32com.server.register win32com.server.register.UseCommandLine(PyCOMTest) win32com.server.register.UseCommandLine(PyCOMTestMI) PK ѳPMx"win32com/servers/interp.pyUT l_Zx`ux """Python.Interpreter COM Server This module implements a very very simple COM server which exposes the Python interpreter. This is designed more as a demonstration than a full blown COM server. General functionality and Error handling are both limited. To use this object, ensure it is registered by running this module from Python.exe. Then, from Visual Basic, use "CreateObject('Python.Interpreter')", and call its methods! """ from win32com.server.exception import Exception import winerror # Expose the Python interpreter. class Interpreter: """The interpreter object exposed via COM """ _public_methods_ = [ 'Exec', 'Eval' ] # All registration stuff to support fully automatic register/unregister _reg_verprogid_ = "Python.Interpreter.2" _reg_progid_ = "Python.Interpreter" _reg_desc_ = "Python Interpreter" _reg_clsid_ = "{30BD3490-2632-11cf-AD5B-524153480001}" _reg_class_spec_ = "win32com.servers.interp.Interpreter" def __init__(self): self.dict = {} def Eval(self, exp): """Evaluate an expression. """ if type(exp) != str: raise Exception(desc="Must be a string",scode=winerror.DISP_E_TYPEMISMATCH) return eval(str(exp), self.dict) def Exec(self, exp): """Execute a statement. """ if type(exp) != str: raise Exception(desc="Must be a string",scode=winerror.DISP_E_TYPEMISMATCH) exec(str(exp), self.dict) def Register(): import win32com.server.register return win32com.server.register.UseCommandLine(Interpreter) if __name__=='__main__': print("Registering COM server...") Register() PK ѳPoOwin32com/servers/dictionary.pyUT l_Zx`ux """Python.Dictionary COM Server. This module implements a simple COM server that acts much like a Python dictionary or as a standard string-keyed VB Collection. The keys of the dictionary are strings and are case-insensitive. It uses a highly customized policy to fine-tune the behavior exposed to the COM client. The object exposes the following properties: int Count (readonly) VARIANT Item(BSTR key) (propget for Item) Item(BSTR key, VARIANT value) (propput for Item) Note that 'Item' is the default property, so the following forms of VB code are acceptable: set ob = CreateObject("Python.Dictionary") ob("hello") = "there" ob.Item("hi") = ob("HELLO") All keys are defined, returning VT_NULL (None) if a value has not been stored. To delete a key, simply assign VT_NULL to the key. The object responds to the _NewEnum method by returning an enumerator over the dictionary's keys. This allows for the following type of VB code: for each name in ob debug.print name, ob(name) next """ import pythoncom from win32com.server import util, policy from win32com.server.exception import COMException import winerror import types import pywintypes from pythoncom import DISPATCH_METHOD, DISPATCH_PROPERTYGET from winerror import S_OK class DictionaryPolicy(policy.BasicWrapPolicy): ### BasicWrapPolicy looks for this _com_interfaces_ = [ ] ### BasicWrapPolicy looks for this _name_to_dispid_ = { 'item' : pythoncom.DISPID_VALUE, '_newenum' : pythoncom.DISPID_NEWENUM, 'count' : 1, } ### Auto-Registration process looks for these... _reg_desc_ = 'Python Dictionary' _reg_clsid_ = '{39b61048-c755-11d0-86fa-00c04fc2e03e}' _reg_progid_ = 'Python.Dictionary' _reg_verprogid_ = 'Python.Dictionary.1' _reg_policy_spec_ = 'win32com.servers.dictionary.DictionaryPolicy' def _CreateInstance_(self, clsid, reqIID): self._wrap_({ }) return pythoncom.WrapObject(self, reqIID) def _wrap_(self, ob): self._obj_ = ob # ob should be a dictionary def _invokeex_(self, dispid, lcid, wFlags, args, kwargs, serviceProvider): if dispid == 0: # item l = len(args) if l < 1: raise COMException(desc="not enough parameters", scode=winerror.DISP_E_BADPARAMCOUNT) key = args[0] if type(key) not in [str, str]: ### the nArgErr thing should be 0-based, not reversed... sigh raise COMException(desc="Key must be a string", scode=winerror.DISP_E_TYPEMISMATCH) key = key.lower() if wFlags & (DISPATCH_METHOD | DISPATCH_PROPERTYGET): if l > 1: raise COMException(scode=winerror.DISP_E_BADPARAMCOUNT) try: return self._obj_[key] except KeyError: return None # unknown keys return None (VT_NULL) if l != 2: raise COMException(scode=winerror.DISP_E_BADPARAMCOUNT) if args[1] is None: # delete a key when None is assigned to it try: del self._obj_[key] except KeyError: pass else: self._obj_[key] = args[1] return S_OK if dispid == 1: # count if not wFlags & DISPATCH_PROPERTYGET: raise COMException(scode=winerror.DISP_E_MEMBERNOTFOUND) # not found if len(args) != 0: raise COMException(scode=winerror.DISP_E_BADPARAMCOUNT) return len(self._obj_) if dispid == pythoncom.DISPID_NEWENUM: return util.NewEnum(list(self._obj_.keys())) raise COMException(scode=winerror.DISP_E_MEMBERNOTFOUND) def _getidsofnames_(self, names, lcid): ### this is a copy of MappedWrapPolicy._getidsofnames_ ... name = names[0].lower() try: return (self._name_to_dispid_[name],) except KeyError: raise COMException(scode=winerror.DISP_E_MEMBERNOTFOUND, desc="Member not found") def Register(): from win32com.server.register import UseCommandLine return UseCommandLine(DictionaryPolicy) if __name__ == '__main__': Register() PK Y03K 4- - win32com/universal.pyUT  YZx`ux # Code that packs and unpacks the Univgw structures. # See if we have a special directory for the binaries (for developers) import types import pythoncom from win32com.client import gencache com_error = pythoncom.com_error _univgw = pythoncom._univgw def RegisterInterfaces(typelibGUID, lcid, major, minor, interface_names = None): ret = [] # return a list of (dispid, funcname for our policy's benefit # First see if we have makepy support. If so, we can probably satisfy the request without loading the typelib. try: mod = gencache.GetModuleForTypelib(typelibGUID, lcid, major, minor) except ImportError: mod = None if mod is None: import win32com.client.build # Load up the typelib and build (but don't cache) it now tlb = pythoncom.LoadRegTypeLib(typelibGUID, major, minor, lcid) typecomp_lib = tlb.GetTypeComp() if interface_names is None: interface_names = [] for i in range(tlb.GetTypeInfoCount()): info = tlb.GetTypeInfo(i) doc = tlb.GetDocumentation(i) attr = info.GetTypeAttr() if attr.typekind == pythoncom.TKIND_INTERFACE or \ (attr.typekind == pythoncom.TKIND_DISPATCH and attr.wTypeFlags & pythoncom.TYPEFLAG_FDUAL): interface_names.append(doc[0]) for name in interface_names: type_info, type_comp = typecomp_lib.BindType(name, ) # Not sure why we don't get an exception here - BindType's C # impl looks correct.. if type_info is None: raise ValueError("The interface '%s' can not be located" % (name,)) # If we got back a Dispatch interface, convert to the real interface. attr = type_info.GetTypeAttr() if attr.typekind == pythoncom.TKIND_DISPATCH: refhtype = type_info.GetRefTypeOfImplType(-1) type_info = type_info.GetRefTypeInfo(refhtype) attr = type_info.GetTypeAttr() item = win32com.client.build.VTableItem(type_info, attr, type_info.GetDocumentation(-1)) _doCreateVTable(item.clsid, item.python_name, item.bIsDispatch, item.vtableFuncs) for info in item.vtableFuncs: names, dispid, desc = info invkind = desc[4] ret.append((dispid, invkind, names[0])) else: # Cool - can used cached info. if not interface_names: interface_names = list(mod.VTablesToClassMap.values()) for name in interface_names: try: iid = mod.NamesToIIDMap[name] except KeyError: raise ValueError("Interface '%s' does not exist in this cached typelib" % (name,)) # print "Processing interface", name sub_mod = gencache.GetModuleForCLSID(iid) is_dispatch = getattr(sub_mod, name + "_vtables_dispatch_", None) method_defs = getattr(sub_mod, name + "_vtables_", None) if is_dispatch is None or method_defs is None: raise ValueError("Interface '%s' is IDispatch only" % (name,)) # And create the univgw defn _doCreateVTable(iid, name, is_dispatch, method_defs) for info in method_defs: names, dispid, desc = info invkind = desc[4] ret.append((dispid, invkind, names[0])) return ret def _doCreateVTable(iid, interface_name, is_dispatch, method_defs): defn = Definition(iid, is_dispatch, method_defs) vtbl = _univgw.CreateVTable(defn, is_dispatch) _univgw.RegisterVTable(vtbl, iid, interface_name) def _CalcTypeSize(typeTuple): t = typeTuple[0] if t & (pythoncom.VT_BYREF | pythoncom.VT_ARRAY): # Its a pointer. cb = _univgw.SizeOfVT(pythoncom.VT_PTR)[1] elif t == pythoncom.VT_RECORD: # Just because a type library uses records doesn't mean the user # is trying to. We need to better place to warn about this, but it # isn't here. #try: # import warnings # warnings.warn("warning: records are known to not work for vtable interfaces") #except ImportError: # print "warning: records are known to not work for vtable interfaces" cb = _univgw.SizeOfVT(pythoncom.VT_PTR)[1] #cb = typeInfo.GetTypeAttr().cbSizeInstance else: cb = _univgw.SizeOfVT(t)[1] return cb class Arg: def __init__(self, arg_info, name = None): self.name = name self.vt, self.inOut, self.default, self.clsid = arg_info self.size = _CalcTypeSize(arg_info) # Offset from the beginning of the arguments of the stack. self.offset = 0 class Method: def __init__(self, method_info, isEventSink=0): all_names, dispid, desc = method_info name = all_names[0] names = all_names[1:] invkind = desc[4] arg_defs = desc[2] ret_def = desc[8] self.dispid = dispid self.invkind = invkind # We dont use this ATM. # self.ret = Arg(ret_def) if isEventSink and name[:2] != "On": name = "On%s" % name self.name = name cbArgs = 0 self.args = [] for argDesc in arg_defs: arg = Arg(argDesc) arg.offset = cbArgs cbArgs = cbArgs + arg.size self.args.append(arg) self.cbArgs = cbArgs self._gw_in_args = self._GenerateInArgTuple() self._gw_out_args = self._GenerateOutArgTuple() def _GenerateInArgTuple(self): # Given a method, generate the in argument tuple l = [] for arg in self.args: if arg.inOut & pythoncom.PARAMFLAG_FIN or \ arg.inOut == 0: l.append((arg.vt, arg.offset, arg.size)) return tuple(l) def _GenerateOutArgTuple(self): # Given a method, generate the out argument tuple l = [] for arg in self.args: if arg.inOut & pythoncom.PARAMFLAG_FOUT or \ arg.inOut & pythoncom.PARAMFLAG_FRETVAL or \ arg.inOut == 0: l.append((arg.vt, arg.offset, arg.size, arg.clsid)) return tuple(l) class Definition: def __init__(self, iid, is_dispatch, method_defs): self._iid = iid self._methods = [] self._is_dispatch = is_dispatch for info in method_defs: entry = Method(info) self._methods.append(entry) def iid(self): return self._iid def vtbl_argsizes(self): return [m.cbArgs for m in self._methods] def vtbl_argcounts(self): return [len(m.args) for m in self._methods] def dispatch(self, ob, index, argPtr, ReadFromInTuple=_univgw.ReadFromInTuple, WriteFromOutTuple=_univgw.WriteFromOutTuple): "Dispatch a call to an interface method." meth = self._methods[index] # Infer S_OK if they don't return anything bizarre. hr = 0 args = ReadFromInTuple(meth._gw_in_args, argPtr) # If ob is a dispatcher, ensure a policy ob = getattr(ob, "policy", ob) # Ensure the correct dispid is setup ob._dispid_to_func_[meth.dispid] = meth.name retVal = ob._InvokeEx_(meth.dispid, 0, meth.invkind, args, None, None) # None is an allowed return value stating that # the code doesn't want to touch any output arguments. if type(retVal) == tuple: # Like pythoncom, we special case a tuple. # However, if they want to return a specific HRESULT, # then they have to return all of the out arguments # AND the HRESULT. if len(retVal) == len(meth._gw_out_args) + 1: hr = retVal[0] retVal = retVal[1:] else: raise TypeError("Expected %s return values, got: %s" % (len(meth._gw_out_args) + 1, len(retVal))) else: retVal = [retVal] retVal.extend([None] * (len(meth._gw_out_args)-1)) retVal = tuple(retVal) WriteFromOutTuple(retVal, meth._gw_out_args, argPtr) return hr PK {R win32comext/UT Zx`Zx`ux PK {Rwin32comext/axscript/UT Zx`Zx`ux PK {Rwin32comext/axscript/test/UT Zx`Zx`ux PK ѳPne1 )win32comext/axscript/test/testHost4Dbg.pyUT l_Zx`ux import os, sys, traceback from win32com.axscript import axscript from win32com.axscript.server import axsite from win32com.axscript.server.error import Exception import pythoncom from win32com.server import util import win32ui version = "0.0.1" class MySite(axsite.AXSite): def OnScriptError(self, error): print("An error occurred in the Script Code") exc = error.GetExceptionInfo() try: text = error.GetSourceLineText() except: text = "" context, line, char = error.GetSourcePosition() print("Exception: %s (line %d)\n%s\n%s^\n%s" % (exc[1], line, text, " " * (char-1), exc[2])) class ObjectModel: _public_methods_ = [ 'echo', 'msgbox' ] def echo(self, *args): print(''.join(map(str, args))) def msgbox(self, *args): msg = ''.join(map(str, args)) win32ui.MessageBox(msg) def TestEngine(): model = {'Test' : util.wrap(ObjectModel()) } scriptDir = "." site = MySite(model) pyEngine = site._AddEngine("Python") # pyEngine2 = site._AddEngine("Python") vbEngine = site._AddEngine("VBScript") # forthEngine = site._AddEngine("ForthScript") try: # code = open(os.path.join(scriptDir, "debugTest.4ths"),"rb").read() # forthEngine.AddCode(code) code = open(os.path.join(scriptDir, "debugTest.pys"),"rb").read() pyEngine.AddCode(code) code = open(os.path.join(scriptDir, "debugTest.vbs"),"rb").read() vbEngine.AddCode(code) # code = open(os.path.join(scriptDir, "debugTestFail.pys"),"rb").read() # pyEngine2.AddCode(code) # from win32com.axdebug import axdebug # sessionProvider=pythoncom.CoCreateInstance(axdebug.CLSID_DefaultDebugSessionProvider,None,pythoncom.CLSCTX_ALL, axdebug.IID_IDebugSessionProvider) # sessionProvider.StartDebugSession(None) input("Press enter to continue") # forthEngine.Start() pyEngine.Start() # Actually run the Python code vbEngine.Start() # Actually run the VB code except pythoncom.com_error as details: print("Script failed: %s (0x%x)" % (details[1], details[0])) # Now run the code expected to fail! # try: # pyEngine2.Start() # Actually run the Python code that fails! # print "Script code worked when it should have failed." # except pythoncom.com_error: # pass site._Close() if __name__ == '__main__': import win32com.axdebug.util try: TestEngine() except: traceback.print_exc() win32com.axdebug.util._dump_wrapped() sys.exc_type = sys.exc_value = sys.exc_traceback = None print(pythoncom._GetInterfaceCount(),"com objects still alive") PK ѳP'Yؒ'win32comext/axscript/test/debugTest.pysUT l_Zx`ux def Function(i): Test.Echo(i) print(dir()) a=1 b=a c=b # And here is a comment d="A string" print(a) Test.echo("Hello from Python") for i in range(2): Function(i) a = """\ A multi-line string! """ PK Y03K>H#win32comext/axscript/test/test.htmlUT  Yux  A multi-language Active Debugging demo.

      PK ѳP Y^%win32comext/axscript/test/leakTest.pyUT l_Zx`ux import sys from win32com.axscript.server.error import Exception from win32com.axscript import axscript from win32com.axscript.server import axsite import pythoncom from win32com.server import util, connect import win32com.server.policy class MySite(axsite.AXSite): def OnScriptError(self, error): exc = error.GetExceptionInfo() context, line, char = error.GetSourcePosition() print(" >Exception:", exc[1]) try: st = error.GetSourceLineText() except pythoncom.com_error: st = None if st is None: st = "" text = st + "\n" + (" " * (char-1)) + "^" + "\n" + exc[2] for line in text.splitlines(): print(" >" + line) class MyCollection(util.Collection): def _NewEnum(self): print("Making new Enumerator") return util.Collection._NewEnum(self) class Test: _public_methods_ = [ 'echo' ] _public_attrs_ = ['collection', 'verbose'] def __init__(self): self.verbose = 0 self.collection = util.wrap( MyCollection( [1,'Two',3] )) self.last = "" # self._connect_server_ = TestConnectServer(self) def echo(self, *args): self.last = ''.join(map(str, args)) if self.verbose: for arg in args: print(arg, end=' ') print() # self._connect_server_.Broadcast(last) #### Connections currently wont work, as there is no way for the engine to #### know what events we support. We need typeinfo support. IID_ITestEvents = pythoncom.MakeIID("{8EB72F90-0D44-11d1-9C4B-00AA00125A98}") class TestConnectServer(connect.ConnectableServer): _connect_interfaces_ = [IID_ITestEvents] # The single public method that the client can call on us # (ie, as a normal COM server, this exposes just this single method. def __init__(self, object): self.object = object def Broadcast(self,arg): # Simply broadcast a notification. self._BroadcastNotify(self.NotifyDoneIt, (arg,)) def NotifyDoneIt(self, interface, arg): interface.Invoke(1000, 0, pythoncom.DISPATCH_METHOD, 1, arg) VBScript = """\ prop = "Property Value" sub hello(arg1) test.echo arg1 end sub sub testcollection test.verbose = 1 for each item in test.collection test.echo "Collection item is", item next end sub """ if sys.version_info < (3,): PyScript = """print "PyScript is being parsed..."\n""" else: PyScript = """print("PyScript is being parsed...")\n""" PyScript += """\ prop = "Property Value" def hello(arg1): test.echo(arg1) pass def testcollection(): test.verbose = 1 # test.collection[1] = "New one" for item in test.collection: test.echo("Collection item is", item) pass """ ErrScript = """\ bad code for everyone! """ def TestEngine(engineName, code, bShouldWork = 1): echoer = Test() model = { 'test' : util.wrap(echoer), } site = MySite(model) engine = site._AddEngine(engineName) engine.AddCode(code, axscript.SCRIPTTEXT_ISPERSISTENT) try: engine.Start() finally: if not bShouldWork: engine.Close() return doTestEngine(engine, echoer) # re-transition the engine back to the UNINITIALIZED state, a-la ASP. engine.eScript.SetScriptState(axscript.SCRIPTSTATE_UNINITIALIZED) engine.eScript.SetScriptSite(util.wrap(site)) print("restarting") engine.Start() # all done! engine.Close() def doTestEngine(engine, echoer): # Now call into the scripts IDispatch from win32com.client.dynamic import Dispatch ob = Dispatch(engine.GetScriptDispatch()) try: ob.hello("Goober") except pythoncom.com_error as exc: print("***** Calling 'hello' failed", exc) return if echoer.last != "Goober": print("***** Function call didnt set value correctly", repr(echoer.last)) if str(ob.prop) != "Property Value": print("***** Property Value not correct - ", repr(ob.prop)) ob.testcollection() # Now make sure my engines can evaluate stuff. result = engine.eParse.ParseScriptText("1+1", None, None, None, 0, 0, axscript.SCRIPTTEXT_ISEXPRESSION) if result != 2: print("Engine could not evaluate '1+1' - said the result was", result) def dotestall(): for i in range(10): TestEngine("Python", PyScript) print(sys.gettotalrefcount()) ## print "Testing Exceptions" ## try: ## TestEngine("Python", ErrScript, 0) ## except pythoncom.com_error: ## pass def testall(): dotestall() pythoncom.CoUninitialize() print("AXScript Host worked correctly - %d/%d COM objects left alive." % (pythoncom._GetInterfaceCount(), pythoncom._GetGatewayCount())) if __name__ == '__main__': testall() PK Y03K>I2TT'win32comext/axscript/test/debugTest.vbsUT  YZx`ux a=1 b=a Test.Echo "Hello from VBScript" ' Here is a comment for i = 1 to 10 next PK ѳP"dd%win32comext/axscript/test/testHost.pyUT l_Zx`ux import sys import pythoncom from win32com.axscript.server.error import Exception from win32com.axscript import axscript from win32com.axscript.server import axsite from win32com.server import util, connect import win32com.server.policy from win32com.client.dynamic import Dispatch from win32com.server.exception import COMException import unittest import win32com.test.util verbose = "-v" in sys.argv class MySite(axsite.AXSite): def __init__(self, *args): self.exception_seen = None axsite.AXSite.__init__(self, *args) def OnScriptError(self, error): self.exception_seen = exc = error.GetExceptionInfo() context, line, char = error.GetSourcePosition() if not verbose: return print(" >Exception:", exc[1]) try: st = error.GetSourceLineText() except pythoncom.com_error: st = None if st is None: st = "" text = st + "\n" + (" " * (char-1)) + "^" + "\n" + exc[2] for line in text.splitlines(): print(" >" + line) class MyCollection(util.Collection): def _NewEnum(self): return util.Collection._NewEnum(self) class Test: _public_methods_ = [ 'echo', 'fail' ] _public_attrs_ = ['collection'] def __init__(self): self.verbose = verbose self.collection = util.wrap( MyCollection( [1,'Two',3] )) self.last = "" self.fail_called = 0 # self._connect_server_ = TestConnectServer(self) def echo(self, *args): self.last = "".join([str(s) for s in args]) if self.verbose: for arg in args: print(arg, end=' ') print() def fail(self, *args): print("**** fail() called ***") for arg in args: print(arg, end=' ') print() self.fail_called = 1 # self._connect_server_.Broadcast(last) #### Connections currently wont work, as there is no way for the engine to #### know what events we support. We need typeinfo support. IID_ITestEvents = pythoncom.MakeIID("{8EB72F90-0D44-11d1-9C4B-00AA00125A98}") class TestConnectServer(connect.ConnectableServer): _connect_interfaces_ = [IID_ITestEvents] # The single public method that the client can call on us # (ie, as a normal COM server, this exposes just this single method. def __init__(self, object): self.object = object def Broadcast(self,arg): # Simply broadcast a notification. self._BroadcastNotify(self.NotifyDoneIt, (arg,)) def NotifyDoneIt(self, interface, arg): interface.Invoke(1000, 0, pythoncom.DISPATCH_METHOD, 1, arg) VBScript = """\ prop = "Property Value" sub hello(arg1) test.echo arg1 end sub sub testcollection if test.collection.Item(0) <> 1 then test.fail("Index 0 was wrong") end if if test.collection.Item(1) <> "Two" then test.fail("Index 1 was wrong") end if if test.collection.Item(2) <> 3 then test.fail("Index 2 was wrong") end if num = 0 for each item in test.collection num = num + 1 next if num <> 3 then test.fail("Collection didn't have 3 items") end if end sub """ PyScript = """\ # A unicode \xa9omment. prop = "Property Value" def hello(arg1): test.echo(arg1) def testcollection(): # test.collection[1] = "New one" got = [] for item in test.collection: got.append(item) if got != [1, "Two", 3]: test.fail("Didn't get the collection") pass """ # XXX - needs py3k work! Throwing a bytes string with an extended char # doesn't make much sense, but py2x allows it. What it gets upset with # is a real unicode arg - which is the only thing py3k allows! PyScript_Exc = """\ def hello(arg1): raise RuntimeError("exc with extended \xa9har") """ ErrScript = """\ bad code for everyone! """ state_map = { axscript.SCRIPTSTATE_UNINITIALIZED: "SCRIPTSTATE_UNINITIALIZED", axscript.SCRIPTSTATE_INITIALIZED: "SCRIPTSTATE_INITIALIZED", axscript.SCRIPTSTATE_STARTED: "SCRIPTSTATE_STARTED", axscript.SCRIPTSTATE_CONNECTED: "SCRIPTSTATE_CONNECTED", axscript.SCRIPTSTATE_DISCONNECTED: "SCRIPTSTATE_DISCONNECTED", axscript.SCRIPTSTATE_CLOSED: "SCRIPTSTATE_CLOSED", } def _CheckEngineState(engine, name, state): got = engine.engine.eScript.GetScriptState() if got != state: got_name = state_map.get(got, str(got)) state_name = state_map.get(state, str(state)) raise RuntimeError("Warning - engine %s has state %s, but expected %s" % (name, got_name, state_name)) class EngineTester(win32com.test.util.TestCase): def _TestEngine(self, engineName, code, expected_exc = None): echoer = Test() model = { 'test' : util.wrap(echoer), } site = MySite(model) engine = site._AddEngine(engineName) try: _CheckEngineState(site, engineName, axscript.SCRIPTSTATE_INITIALIZED) engine.AddCode(code) engine.Start() _CheckEngineState(site, engineName, axscript.SCRIPTSTATE_STARTED) self.failUnless(not echoer.fail_called, "Fail should not have been called") # Now call into the scripts IDispatch ob = Dispatch(engine.GetScriptDispatch()) try: ob.hello("Goober") self.failUnless(expected_exc is None, "Expected %r, but no exception seen" % (expected_exc,)) except pythoncom.com_error: if expected_exc is None: self.fail("Unexpected failure from script code: %s" % (site.exception_seen,)) if expected_exc not in site.exception_seen[2]: self.fail("Could not find %r in %r" % (expected_exc, site.exception_seen[2])) return self.assertEqual(echoer.last, "Goober") self.assertEqual(str(ob.prop), "Property Value") ob.testcollection() self.failUnless(not echoer.fail_called, "Fail should not have been called") # Now make sure my engines can evaluate stuff. result = engine.eParse.ParseScriptText("1+1", None, None, None, 0, 0, axscript.SCRIPTTEXT_ISEXPRESSION) self.assertEqual(result, 2) # re-initialize to make sure it transitions back to initialized again. engine.SetScriptState(axscript.SCRIPTSTATE_INITIALIZED) _CheckEngineState(site, engineName, axscript.SCRIPTSTATE_INITIALIZED) engine.Start() _CheckEngineState(site, engineName, axscript.SCRIPTSTATE_STARTED) # Transition back to initialized, then through connected too. engine.SetScriptState(axscript.SCRIPTSTATE_INITIALIZED) _CheckEngineState(site, engineName, axscript.SCRIPTSTATE_INITIALIZED) engine.SetScriptState(axscript.SCRIPTSTATE_CONNECTED) _CheckEngineState(site, engineName, axscript.SCRIPTSTATE_CONNECTED) engine.SetScriptState(axscript.SCRIPTSTATE_INITIALIZED) _CheckEngineState(site, engineName, axscript.SCRIPTSTATE_INITIALIZED) engine.SetScriptState(axscript.SCRIPTSTATE_CONNECTED) _CheckEngineState(site, engineName, axscript.SCRIPTSTATE_CONNECTED) engine.SetScriptState(axscript.SCRIPTSTATE_DISCONNECTED) _CheckEngineState(site, engineName, axscript.SCRIPTSTATE_DISCONNECTED) finally: engine.Close() engine = None site = None def testVB(self): self._TestEngine("VBScript", VBScript) def testPython(self): self._TestEngine("Python", PyScript) def testPythonUnicodeError(self): self._TestEngine("Python", PyScript) def testVBExceptions(self): self.assertRaises(pythoncom.com_error, self._TestEngine, "VBScript", ErrScript) def testPythonExceptions(self): expected = "RuntimeError: exc with extended \xa9har" self._TestEngine("Python", PyScript_Exc, expected) if __name__ == '__main__': unittest.main() PK L$nQ**!win32comext/axscript/axscript.pydUT P^_ux MZ@ !L!This program cannot be run in DOS mode. $Nl a? a? a?L?a?1?>a??>a?1?> a?1?>a?1?>a?y>a?>a?y>a? a?a??>a??> a??> a?Rich a?PELQ^_! vtM@-PT`T(@H.texttv `.rdataz@@.datax @.gfidsL@@@.rsrcTP@@.reloc`@Bh-Mh8 Nj5M('NhDMTMh@MGaYh-Mh!Nj5M(NhMTMhPMaYh@.MhH!Nj5M(NhMTMh`M`Yh_Mh!Nj5M)Nh̬MTMhpM`Yh.Mh!Nj5M*NhMTMhM`Yh`/Mh8"Nj5xM`+NhDMTMhMW`Yh/Mhh"Nj5M8,NhlMTMhM'`YUdjh/MPd%S]VWuWMd _^[]j[}Et(uMMGMG MG M3M EOtQPE7ԋVH3҉_EʋM^d []UdjhMPd%S]VWuWMd _^[]jZ}Et(uMܜMG,MG@MGTM3M EOtQPE7ԋVH3҉_EʋM^d []UdjhMPd%S]VWuWMd _^[]jY}Et(uMXMGMGMGРM3M EOtQPE7ԋVH3҉_EʋM^d []UdjhςMPd%S]VWuWMd _^[]j*Y}Et(uMMGMGMGM3M EOtQPE7ԋVH3҉_EʋM^d []UdjhMPd%S]VWuWMd _^[]jZX}Et(uM,MG|MGMGM3M EOtQPE7ԋVH3҉_EʋM^d []UdjhMPd%S]VWuWMd _^[]jW}Et(uMԞMG$MG8MGLM3M EOtQPE7ԋVH3҉_EʋM^d []̋D$ uP MY̋D$tu D$% M̋D$ VW=Mtt$PMj׃t&F@Tu$j׃uu V M_3^Ép hMt$MuMt$0M3_^áMUPPVjjt$(hMWM u W Mu V M]_^̋D$H tdD$t\VWT$ Rt$ PQ3̐Mtt$ M D$t0_^Åtu V M_^ø@Vt$MuF^WVt$t$M u V M_^@Mu3Whh NMu_VWMu^_j hMVؑMjh@MVWjhXMVJjhlMV=j@hMV0hhMV HhhMV hNhȘMVjhMVj@hMVjhMVj h,MVHj@hDMVhh\MVjhtMVjhMVjhMVjhMVuHjhЙMVejhMVXhh MVHhh,MV8hhHMV(hhdMVHjh|MVjhMVjhMVjhԚMVjhMVjhMVHjhMVjh4MVhhHMVjh\MVjhxMVjhMVsHjhMVcjhܛMVVjhMVIjhMVt jVDM_^d []Udjh`MPd%S]VWt?hpkMv~jVQCtQW~DNjMd _^[]gBt jVFDM_^d []UdjhpMPd%S]VWt?hiMv~jVBtQWCNjMd _^[]?t jVCM_^d []VMD$t jVC^VMD$t jVTC^VMD$t jV$C^VMD$t jVB^VMD$t jVB^VMD$t jVB^VX)D$t jVeB^Vx+D$t jVEB^V0D$t jV%B^VX;D$t jVB^V@D$t jVA^V>D$t jVA^%Ml$l$l$%Ml$l$l$%Ml$l$l$%Ml$l$l$%Ml$l$l$%Ml$l$l$̋D$M̋D$M̋D$ВM̋D$0M̋D$pM̋D$İMUjhOMdPd%Qj?EEtuU&Md ]ËM3d ]UjhoMdPd%Qj)?EEtu5(Md ]ËM3d ]UjhMdPd%Qj>EEtu,Md ]ËM3d ]UjhMdPd%Qji>EEtu7Md ]ËM3d ]UjhσMdPd%Qj >EEtu<Md ]ËM3d ]UjhMdPd%Qj=EEtu9Md ]ËM3d ]%Ml$l$l$%Ml$l$l$%Ml$l$l$%Ml$l$l$%Ml$l$l$%Ml$l$l$%Ml$l$l$%Ml$l$l$%Ml$l$l$%Ml$l$l$%Ml$l$l$%Ml$l$l$hMt$2Pt$M hMt$""Pt$M hВMt$R$Pt$M hpMt$.Pt$M hİMt$"7Pt$M hMt$B4Pt$M VWu3_^L$ M ;usG_^D$ ϋM_^VWu3_^L$ M ;usG_^D$ ϋM_^VWu3_^L$ ВM ;usG_^D$ ϋM_^VWu3_^L$ 0M ;usG_^D$ ϋM_^VWu3_^L$ pM ;usG_^D$ ϋM_^VWu3_^L$ İM ;usG_^D$ ϋM_^QT$D$ V ;usD$D$^YD$D$^Y̋T$D$V f ;us^3^̋D$ uP MY̋D$tu D$% MSVWȐMjhpMt$LML$VhxMjh|MQR@ ؃u V MWM_^[̃SVWȐM\$0t$,D$8ML$,uT$RPDP,MVhMT$D$RhġMQP@u V Mx>jSt$4t$|Mu&\$(T$CKRPDPhMsM D$ tu P Mt$M_^[ VWȐMt$L$hMjhMQR@WM_^Vt$ u W^SWȐML$؃D$jD$Ph(MQR@x7T$t/JATtRĐMT$tu R MSM_[^VWȐML$ jjh8MQR@WM_^VWȐMt$YY] t h-NEYwHjdY^U}u,-N8u2]+u j)Y]U Vutu| t*u&h-NYt2Wh -NYD"NuW-Nj Y+ȃ3"NEEE -NEEuE_^]jjhMeMZf9Mu]<MMPEuL f9Mu>EM+PQgYYt'x$|!EE3Ɂ8ËeE2UUt}u 3-N]U=,-Nt} uuuYY]U졨"N3-Nuȃum h-NUYY#E]U졨"N3 -Nȃu]:uh -NYY]UuYH]UE t3t tt3@0L&uuY}PY] jh MjzYu3lE]e= -Ntj -Nte h{M65 ${M%H $tMhpMJYYu)1t hlMhLM&YY -N2ۈ]EDL >tVYtu ju60-N3@7Ê]uYj h@M0-N3OH0-NZEe= -Ntj % -NEjuYY3ɄuZYj h`MZ} u9=0-N3et t]1]SWuuSWuuSWu{uu"uSPucSVuSVu`tuHSWuout5SWu:$MQ0hqMuu uËe3uEUV5\Mu3@uu u3^] U]U} uuu u ] %HMh+uMd5D$l$l$+SVW"N1E3PeuEEEEdËMd Y__^[]QUuuu uh'|Mh"N ]UaaEAM]UVuXM^]aaAMMUVu%M^]aaAMMUVFdM `PEPN YY^]UEdMaaA]AdMP YÍAdMP YÍAdMP YUVFdMP EYt j VYY^]UVFdMP EYt j VYY^]UVFdMP EYt j VYY^]U Mh|MEP^ U MhMEPA ̋AulM U%4-N(S3C "Nj me3 "N3VW4-N}S[wOW E؋MEineIE5ntel ȋEj5Genu XjYS[wOW uCE%?=t#=`t=pt=Pt=`t=pu=8-N=8-N=8-N}EEEEE|2jX3S[]؉sKS EܩEEt =8-N_^tm "N4-NtUtN3ЉEUEM3Ƀu3u/"N4-NE "Nt 4-N"N3[]3@39"NU$SVjtM)3hVP5<-NP |xffftfpflfhEEDž@jPEVPE E@EEMVXۍEEۉEMEPMu !<-N^[]UDjDEjPW EP MEtEj X]3jMȅu2øMZf9uA<8PEu f9HuۃxtvՃhpzMMUE8csmu%xu@= t=!t="t =@t3]̃%<-NUee"NVWN@;t t У"NfEP ME3EEM1EM1EEPMME3M3M3;uO@u G ȉ "Nщ "N_^]U} u=\Mu u$M3@] h@-N(Mh@-NYøH-NøP-NHHHHøt0NSVMM;sW>t ׃;r_^[SVMM;sW>t ׃;r_^[Ë HM3|M; "Nu(UjMuMh ,MP0M]U$jrtjY)X.N T.NP.NL.N5H.N=D.Nfp.Nf d.Nf@.Nf<.Nf%8.Nf-4.Nh.NE\.NE`.NEl.N-N`.Nd-NX-N \-Nh-NjXkǀl-NjXk "NLjX "NLhM]Uj]UjktM)X.N T.NP.NL.N5H.N=D.Nfp.Nf d.Nf@.Nf<.Nf%8.Nf-4.Nh.NE\.NE`.NEl.N`.Nd-NX-N \-Nh-NjXkMl-NhM]U jtM)X.N T.NP.NL.N5H.N=D.Nfp.Nf d.Nf@.Nf<.Nf%8.Nf-4.Nh.NE\.NE`.NEl.N`.Nd-NX-N \-N} v }ue } vE HE E @h-NjXkMl-NeE@EE;E sEMU p-NhM]%M% M%M%M%M%M%M%M%M%M%M%M%M%ܑM%ؑM%ԑM%БM%̑M%ȑM%đM%M%M%M%M%M%M%M%M%M%M%M%M%M%M%M%M%M%|M%LM%M%(M%,M%0M%4M%8M%MHM M"MMMMM&MM M"MMMMM(MM0M,M1MMMMMMMMMMMMM%MM`-M4M|M0M,M1MMM0M,M1MMM0M,M1MHM`IMM M"MMMMM0)MMP0M0,Mp1MMMMMMMMMMMMMP*MM -M3MMV0M6,Mv1MMM`0M@,M1MMMj0MJ,M1M]MPython didnt return an integeriGetScriptThreadStatePython did not return an integerClonec:\src\python-3.8\include\object.hOSetScriptSitecom/win32comext/axscript/src/PyGActiveScript.cppOGetScriptSitecom/win32comext/axscript/src/PyGActiveScript.cppiSetScriptStateGetScriptStateCloseNiAddNamedItemOlllAddTypeLibOGetScriptDispatchGetCurrentScriptThreadIDPython did not return an integeriGetScriptThreadIDGetSourcePositioniiicom/win32comext/axscript/src/PyGActiveScriptError.cppGetSourceLineTextcom/win32comext/axscript/src/PyGActiveScriptError.cppc:\src\python-3.8\include\object.hGetExceptionInfocom/win32comext/axscript/src/PyGActiveScriptError.cppc:\src\python-3.8\include\object.hInitNewNNNNNNNiAddScriptletNNONNiiiParseScriptTextcom/win32comext/axscript/src/PyGActiveScriptParse.cppcom/win32comext/axscript/src/PyGActiveScriptParse.cppOOnScriptErrorcom/win32comext/axscript/src/PyGActiveScriptSite.cppcom/win32comext/axscript/src/PyGActiveScriptSite.cppOnEnterScriptOnLeaveScriptc:\src\python-3.8\include\object.hGetLCIDcom/win32comext/axscript/src/PyGActiveScriptSite.cppNiGetItemInfocom/win32comext/axscript/src/PyGActiveScriptSite.cppcom/win32comext/axscript/src/PyGActiveScriptSite.cppcom/win32comext/axscript/src/PyGActiveScriptSite.cppcom/win32comext/axscript/src/PyGActiveScriptSite.cppcom/win32comext/axscript/src/PyGActiveScriptSite.cppcom/win32comext/axscript/src/PyGActiveScriptSite.cppcom/win32comext/axscript/src/PyGActiveScriptSite.cppGetDocVersionStringcom/win32comext/axscript/src/PyGActiveScriptSite.cppOOOnScriptTerminatecom/win32comext/axscript/src/PyGActiveScriptSite.cppcom/win32comext/axscript/src/PyGActiveScriptSite.cppiOnStateChangeOGetInterfaceSafetyOptionsiiOiiSetInterfaceSafetyOptionsc:\src\python-3.8\include\object.h:GetCurrentScriptThreadIDii:GetScriptThreadIDii:GetScriptThreadStateiiOi:InterruptScriptThread:CloneSetScriptSiteSetScriptStateGetScriptStateCloseAddNamedItemAddTypeLibGetScriptDispatchGetCurrentScriptThreadIDGetScriptThreadIDGetScriptThreadStateInterruptScriptThreadClonePyIActiveScriptc:\src\python-3.8\include\object.hO:SetScriptSiteargument is not a site|O:GetScriptSitei:SetScriptState:GetScriptStatei:CloseOi:AddNamedItemOiii:AddTypeLib|O:GetScriptDispatchc:\src\python-3.8\include\object.h:GetExceptionInfo:GetSourcePositioniii:GetSourceLineTextGetExceptionInfoGetSourcePositionGetSourceLineTextPyIActiveScriptErrorc:\src\python-3.8\include\object.h:InitNewOOOOOOiii:AddScriptletOOOOiii|i:ParseScriptTextargument is not a PyIUnknownInitNewAddScriptletParseScriptTextPyIActiveScriptParseOOOOOOiii:ParseProcedureTextParseProcedureTextPyIActiveScriptParseProcedureOOOOOOOiiParseProcedureTextOcom/win32comext/axscript/src/PyIActiveScriptParseProcedure.cppc:\src\python-3.8\include\object.hM M"MMMMM_MPyIActiveScriptSitec:\src\python-3.8\include\object.h:GetLCIDOi:GetItemInfoOO:GetDocVersionStringi:OnStateChange:OnEnterScript:OnLeaveScriptO:OnScriptErrorOO:OnScriptTerminateGetLCIDGetItemInfoGetDocVersionStringOnStateChangeOnEnterScriptOnLeaveScriptOnScriptErrorOnScriptTerminatec:\src\python-3.8\include\object.h:GetMultiTypeInfoCountii:GetInfoOfIndexOiPyIProvideMultipleClassInfoThe flags param is invalid. Note that you can not 'or' flags together - retrieve each element individuallyGetMultiTypeInfoCountGetInfoOfIndexO:GetInterfaceSafetyOptionsiiOii:SetInterfaceSafetyOptionsGetInterfaceSafetyOptionsSetInterfaceSafetyOptionsPyIObjectSafetyc:\src\python-3.8\include\object.hc:\src\python-3.8\include\object.h[ _,dB: ` 4H+)=sR {20 X" ( t0 t0 4eF$+.QbH6 NFO™k7E8+.@糗`+tN0 4З` {20  _,d7PBJ`] KRƽH+4:KQV ^>;)X" ( 0`44B: ` ,$4pLؠ U5qL؆4444.$4pL؀#N-+.`O7B5KQ44FFF`= ߏTe++ }Te++F/FFF*j`wNst5\'5vJ:` F@'1nD5KQF-F*'UB5KQF.FFFF@3"}Te++FFF`*0FCPf0 q6M%+њpIܾ<,FF"d+.[w0t?>ôJQW3F4f6M%+CPf0 lP]0|q*+ /CPf0 ɐGM<>HHcS F}P6^AL ePfxdJ9 E $2q0X J$\?lSFMfA#"@<ԕ~XFPOrK0H<FG(HfAo)B 7&Fv6M%+Ft6M%+4᪽~ hlGF&;CtHLHihBF#FCPf0 [0scS9 [0FveX`6eVDESTpH<k+ /lRۈH<qo"Fw~iG(FLF_Mc tE:efW+FFPxHBrWLAiELWF^v7XYOK/(3;K,k_be6M%+BlWox6M%+ cS#F2FihUN~>kʇHC:\src\pywin32\build\temp.win32-3.8\Release\axscript.pdb1"P.text$diPp.text$mnЁp.text$x@k.text$ydH.idata$5H.00cfgL.CRT$XCAP.CRT$XCUl.CRT$XCZp.CRT$XIAt.CRT$XIZx.CRT$XPA|.CRT$XPZ.CRT$XTA .CRT$XTZ0.rdata .rdata$r`h.rdata$sxdata.rdata$zzzdbg.rtc$IAA.rtc$IZZ.rtc$TAA.rtc$TZZH.xdata$x-.edata.idata$2@.idata$3TH.idata$4 ".idata$6 .data"h.data$r'` .bss@L.gfids$y@M"M"M"M"M"hM"M"M"M"M"M"XM"M"M"`M"M"M"HM" M"M"M"M"M"8MM"dM M"MlMlMmMpMpMrM[sM0tMOtMvMMMM&N kuM&N uM+vMMMMM&N uMQ^_8DP@p@ `0T`PV[pf@k`i 0 @ ` p @TV@[fpki@!`!!!!!" "@"`"""""# #Tܜ@,LԞ8$,| |h88M++,`,,?0W`8N <S7PM9PPD`bP=`T@JPTV`if,,-@-`-gHiB a@B`g8`O6`K@7L:P0;Q>U=U?V< RGcHdFdEPepFc@Y `P--@../`/// 00001@111`Ij2 2@2`2225PJ70L2 33@44('((*8,`+  ,Lx<gBb2V~9Yx (OuAk*S{Dp%Cn![,Ec=]9t ;Z7x1u7;d,yZ A}hS1p<~G#as'h9z:v /UzXR GAn,X  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~axscript.pyd??0PyGActiveScript@@IAE@PAU_object@@@Z??0PyGActiveScript@@QAE@$$QAV0@@Z??0PyGActiveScript@@QAE@ABV0@@Z??0PyGActiveScriptError@@IAE@PAU_object@@@Z??0PyGActiveScriptError@@QAE@$$QAV0@@Z??0PyGActiveScriptError@@QAE@ABV0@@Z??0PyGActiveScriptParse@@AAE@PAU_object@@@Z??0PyGActiveScriptParse@@QAE@$$QAV0@@Z??0PyGActiveScriptParse@@QAE@ABV0@@Z??0PyGActiveScriptSite@@IAE@PAU_object@@@Z??0PyGActiveScriptSite@@QAE@$$QAV0@@Z??0PyGActiveScriptSite@@QAE@ABV0@@Z??0PyGObjectSafety@@AAE@PAU_object@@@Z??0PyGObjectSafety@@QAE@$$QAV0@@Z??0PyGObjectSafety@@QAE@ABV0@@Z??0PyIActiveScript@@IAE@PAUIUnknown@@@Z??0PyIActiveScript@@QAE@ABV0@@Z??0PyIActiveScriptError@@IAE@PAUIUnknown@@@Z??0PyIActiveScriptError@@QAE@ABV0@@Z??0PyIActiveScriptParse@@IAE@PAUIUnknown@@@Z??0PyIActiveScriptParse@@QAE@ABV0@@Z??0PyIActiveScriptSite@@IAE@PAUIUnknown@@@Z??0PyIActiveScriptSite@@QAE@ABV0@@Z??0PyIObjectSafety@@IAE@PAUIUnknown@@@Z??0PyIObjectSafety@@QAE@ABV0@@Z??0PyIProvideMultipleClassInfo@@IAE@PAUIUnknown@@@Z??0PyIProvideMultipleClassInfo@@QAE@ABV0@@Z??1PyGActiveScript@@UAE@XZ??1PyGActiveScriptError@@UAE@XZ??1PyGActiveScriptParse@@UAE@XZ??1PyGActiveScriptSite@@UAE@XZ??1PyGObjectSafety@@UAE@XZ??1PyIActiveScript@@MAE@XZ??1PyIActiveScriptError@@MAE@XZ??1PyIActiveScriptParse@@MAE@XZ??1PyIActiveScriptSite@@MAE@XZ??1PyIObjectSafety@@MAE@XZ??1PyIProvideMultipleClassInfo@@MAE@XZ??4PyGActiveScript@@QAEAAV0@$$QAV0@@Z??4PyGActiveScript@@QAEAAV0@ABV0@@Z??4PyGActiveScriptError@@QAEAAV0@$$QAV0@@Z??4PyGActiveScriptError@@QAEAAV0@ABV0@@Z??4PyGActiveScriptParse@@QAEAAV0@$$QAV0@@Z??4PyGActiveScriptParse@@QAEAAV0@ABV0@@Z??4PyGActiveScriptSite@@QAEAAV0@$$QAV0@@Z??4PyGActiveScriptSite@@QAEAAV0@ABV0@@Z??4PyGObjectSafety@@QAEAAV0@$$QAV0@@Z??4PyGObjectSafety@@QAEAAV0@ABV0@@Z??4PyIActiveScript@@QAEAAV0@ABV0@@Z??4PyIActiveScriptError@@QAEAAV0@ABV0@@Z??4PyIActiveScriptParse@@QAEAAV0@ABV0@@Z??4PyIActiveScriptSite@@QAEAAV0@ABV0@@Z??4PyIObjectSafety@@QAEAAV0@ABV0@@Z??4PyIProvideMultipleClassInfo@@QAEAAV0@ABV0@@Z??_7PyGActiveScript@@6B@??_7PyGActiveScript@@6BIDispatchEx@@@??_7PyGActiveScript@@6BIInternalUnwrapPythonObject@@@??_7PyGActiveScript@@6BISupportErrorInfo@@@??_7PyGActiveScriptError@@6B@??_7PyGActiveScriptError@@6BIDispatchEx@@@??_7PyGActiveScriptError@@6BIInternalUnwrapPythonObject@@@??_7PyGActiveScriptError@@6BISupportErrorInfo@@@??_7PyGActiveScriptParse@@6B@??_7PyGActiveScriptParse@@6BIDispatchEx@@@??_7PyGActiveScriptParse@@6BIInternalUnwrapPythonObject@@@??_7PyGActiveScriptParse@@6BISupportErrorInfo@@@??_7PyGActiveScriptSite@@6B@??_7PyGActiveScriptSite@@6BIDispatchEx@@@??_7PyGActiveScriptSite@@6BIInternalUnwrapPythonObject@@@??_7PyGActiveScriptSite@@6BISupportErrorInfo@@@??_7PyGObjectSafety@@6B@??_7PyGObjectSafety@@6BIDispatchEx@@@??_7PyGObjectSafety@@6BIInternalUnwrapPythonObject@@@??_7PyGObjectSafety@@6BISupportErrorInfo@@@??_7PyIActiveScript@@6B@??_7PyIActiveScriptError@@6B@??_7PyIActiveScriptParse@@6B@??_7PyIActiveScriptSite@@6B@??_7PyIObjectSafety@@6B@??_7PyIProvideMultipleClassInfo@@6B@?AddNamedItem@PyGActiveScript@@MAGJPB_WK@Z?AddNamedItem@PyIActiveScript@@SAPAU_object@@PAU2@0@Z?AddRef@PyGActiveScript@@MAGKXZ?AddRef@PyGActiveScriptError@@MAGKXZ?AddRef@PyGActiveScriptParse@@MAGKXZ?AddRef@PyGActiveScriptSite@@MAGKXZ?AddRef@PyGObjectSafety@@MAGKXZ?AddScriptlet@PyGActiveScriptParse@@MAGJPB_W00000KKKPAPA_WPAUtagEXCEPINFO@@@Z?AddScriptlet@PyIActiveScriptParse@@SAPAU_object@@PAU2@0@Z?AddTypeLib@PyGActiveScript@@MAGJABU_GUID@@KKK@Z?AddTypeLib@PyIActiveScript@@SAPAU_object@@PAU2@0@Z?Clone@PyGActiveScript@@MAGJPAPAUIActiveScript@@@Z?Clone@PyIActiveScript@@SAPAU_object@@PAU2@0@Z?Close@PyGActiveScript@@MAGJXZ?Close@PyIActiveScript@@SAPAU_object@@PAU2@0@Z?GetCurrentScriptThreadID@PyGActiveScript@@MAGJPAK@Z?GetCurrentScriptThreadID@PyIActiveScript@@SAPAU_object@@PAU2@0@Z?GetDocVersionString@PyGActiveScriptSite@@MAGJPAPA_W@Z?GetDocVersionString@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Z?GetExceptionInfo@PyGActiveScriptError@@MAGJPAUtagEXCEPINFO@@@Z?GetExceptionInfo@PyIActiveScriptError@@SAPAU_object@@PAU2@0@Z?GetI@PyIActiveScript@@SAPAUIActiveScript@@PAU_object@@@Z?GetI@PyIActiveScriptError@@SAPAUIActiveScriptError@@PAU_object@@@Z?GetI@PyIActiveScriptParse@@SAPAUIActiveScriptParse32@@PAU_object@@@Z?GetI@PyIActiveScriptSite@@SAPAUIActiveScriptSite@@PAU_object@@@Z?GetI@PyIObjectSafety@@SAPAUIObjectSafety@@PAU_object@@@Z?GetI@PyIProvideMultipleClassInfo@@SAPAUIProvideMultipleClassInfo@@PAU_object@@@Z?GetIID@PyGActiveScript@@MAE?AU_GUID@@XZ?GetIID@PyGActiveScriptError@@MAE?AU_GUID@@XZ?GetIID@PyGActiveScriptParse@@MAE?AU_GUID@@XZ?GetIID@PyGActiveScriptSite@@MAE?AU_GUID@@XZ?GetIID@PyGObjectSafety@@MAE?AU_GUID@@XZ?GetInfoOfIndex@PyIProvideMultipleClassInfo@@SAPAU_object@@PAU2@0@Z?GetInterfaceSafetyOptions@PyGObjectSafety@@MAGJABU_GUID@@PAK1@Z?GetInterfaceSafetyOptions@PyIObjectSafety@@SAPAU_object@@PAU2@0@Z?GetItemInfo@PyGActiveScriptSite@@MAGJPB_WKPAPAUIUnknown@@PAPAUITypeInfo@@@Z?GetItemInfo@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Z?GetLCID@PyGActiveScriptSite@@MAGJPAK@Z?GetLCID@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Z?GetMultiTypeInfoCount@PyIProvideMultipleClassInfo@@SAPAU_object@@PAU2@0@Z?GetScriptDispatch@PyGActiveScript@@MAGJPB_WPAPAUIDispatch@@@Z?GetScriptDispatch@PyIActiveScript@@SAPAU_object@@PAU2@0@Z?GetScriptSite@PyGActiveScript@@MAGJABU_GUID@@PAPAX@Z?GetScriptSite@PyIActiveScript@@SAPAU_object@@PAU2@0@Z?GetScriptState@PyGActiveScript@@MAGJPAW4tagSCRIPTSTATE@@@Z?GetScriptState@PyIActiveScript@@SAPAU_object@@PAU2@0@Z?GetScriptThreadID@PyGActiveScript@@MAGJKPAK@Z?GetScriptThreadID@PyIActiveScript@@SAPAU_object@@PAU2@0@Z?GetScriptThreadState@PyGActiveScript@@MAGJKPAW4tagSCRIPTTHREADSTATE@@@Z?GetScriptThreadState@PyIActiveScript@@SAPAU_object@@PAU2@0@Z?GetSourceLineText@PyGActiveScriptError@@MAGJPAPA_W@Z?GetSourceLineText@PyIActiveScriptError@@SAPAU_object@@PAU2@0@Z?GetSourcePosition@PyGActiveScriptError@@MAGJPAK0PAJ@Z?GetSourcePosition@PyIActiveScriptError@@SAPAU_object@@PAU2@0@Z?InitNew@PyGActiveScriptParse@@MAGJXZ?InitNew@PyIActiveScriptParse@@SAPAU_object@@PAU2@0@Z?InterruptScriptThread@PyGActiveScript@@MAGJKPBUtagEXCEPINFO@@K@Z?InterruptScriptThread@PyIActiveScript@@SAPAU_object@@PAU2@0@Z?OnEnterScript@PyGActiveScriptSite@@MAGJXZ?OnEnterScript@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Z?OnLeaveScript@PyGActiveScriptSite@@MAGJXZ?OnLeaveScript@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Z?OnScriptError@PyGActiveScriptSite@@MAGJPAUIActiveScriptError@@@Z?OnScriptError@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Z?OnScriptTerminate@PyGActiveScriptSite@@MAGJPBUtagVARIANT@@PBUtagEXCEPINFO@@@Z?OnScriptTerminate@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Z?OnStateChange@PyGActiveScriptSite@@MAGJW4tagSCRIPTSTATE@@@Z?OnStateChange@PyIActiveScriptSite@@SAPAU_object@@PAU2@0@Z?ParseScriptText@PyGActiveScriptParse@@MAGJPB_W0PAUIUnknown@@0KKKPAUtagVARIANT@@PAUtagEXCEPINFO@@@Z?ParseScriptText@PyIActiveScriptParse@@SAPAU_object@@PAU2@0@Z?PyGatewayConstruct@PyGActiveScript@@SAJPAU_object@@PAVPyGatewayBase@@PAPAXABU_GUID@@@Z?PyGatewayConstruct@PyGActiveScriptError@@SAJPAU_object@@PAVPyGatewayBase@@PAPAXABU_GUID@@@Z?PyGatewayConstruct@PyGActiveScriptParse@@SAJPAU_object@@PAVPyGatewayBase@@PAPAXABU_GUID@@@Z?PyGatewayConstruct@PyGActiveScriptSite@@SAJPAU_object@@PAVPyGatewayBase@@PAPAXABU_GUID@@@Z?PyGatewayConstruct@PyGObjectSafety@@SAJPAU_object@@PAVPyGatewayBase@@PAPAXABU_GUID@@@Z?PyObConstruct@PyIActiveScript@@SAPAVPyIUnknown@@PAUIUnknown@@@Z?PyObConstruct@PyIActiveScriptError@@SAPAVPyIUnknown@@PAUIUnknown@@@Z?PyObConstruct@PyIActiveScriptParse@@SAPAVPyIUnknown@@PAUIUnknown@@@Z?PyObConstruct@PyIActiveScriptSite@@SAPAVPyIUnknown@@PAUIUnknown@@@Z?PyObConstruct@PyIObjectSafety@@SAPAVPyIUnknown@@PAUIUnknown@@@Z?PyObConstruct@PyIProvideMultipleClassInfo@@SAPAVPyIUnknown@@PAUIUnknown@@@Z?QueryInterface@PyGActiveScript@@MAGJABU_GUID@@PAPAX@Z?QueryInterface@PyGActiveScriptError@@MAGJABU_GUID@@PAPAX@Z?QueryInterface@PyGActiveScriptParse@@MAGJABU_GUID@@PAPAX@Z?QueryInterface@PyGActiveScriptSite@@MAGJABU_GUID@@PAPAX@Z?QueryInterface@PyGObjectSafety@@MAGJABU_GUID@@PAPAX@Z?Release@PyGActiveScript@@MAGKXZ?Release@PyGActiveScriptError@@MAGKXZ?Release@PyGActiveScriptParse@@MAGKXZ?Release@PyGActiveScriptSite@@MAGKXZ?Release@PyGObjectSafety@@MAGKXZ?SetInterfaceSafetyOptions@PyGObjectSafety@@MAGJABU_GUID@@KK@Z?SetInterfaceSafetyOptions@PyIObjectSafety@@SAPAU_object@@PAU2@0@Z?SetPythonCOMError@PyIActiveScript@@SAPAU_object@@PAU2@J@Z?SetPythonCOMError@PyIActiveScriptError@@SAPAU_object@@PAU2@J@Z?SetPythonCOMError@PyIActiveScriptParse@@SAPAU_object@@PAU2@J@Z?SetPythonCOMError@PyIActiveScriptSite@@SAPAU_object@@PAU2@J@Z?SetPythonCOMError@PyIObjectSafety@@SAPAU_object@@PAU2@J@Z?SetPythonCOMError@PyIProvideMultipleClassInfo@@SAPAU_object@@PAU2@J@Z?SetScriptSite@PyGActiveScript@@MAGJPAUIActiveScriptSite@@@Z?SetScriptSite@PyIActiveScript@@SAPAU_object@@PAU2@0@Z?SetScriptState@PyGActiveScript@@MAGJW4tagSCRIPTSTATE@@@Z?SetScriptState@PyIActiveScript@@SAPAU_object@@PAU2@0@Z?ThisAsIID@PyGActiveScript@@MAEPAXU_GUID@@@Z?ThisAsIID@PyGActiveScriptError@@MAEPAXU_GUID@@@Z?ThisAsIID@PyGActiveScriptParse@@MAEPAXU_GUID@@@Z?ThisAsIID@PyGActiveScriptSite@@MAEPAXU_GUID@@@Z?ThisAsIID@PyGObjectSafety@@MAEPAXU_GUID@@@Z?type@PyIActiveScript@@2VPyComTypeObject@@A?type@PyIActiveScriptError@@2VPyComTypeObject@@A?type@PyIActiveScriptParse@@2VPyComTypeObject@@A?type@PyIActiveScriptSite@@2VPyComTypeObject@@A?type@PyIObjectSafety@@2VPyComTypeObject@@A?type@PyIProvideMultipleClassInfo@@2VPyComTypeObject@@APyInit_axscript < |(t N TZL||l|  6Pl` :0xtfZP:l,B T h     0    $ 2 B V l |             dLJ,Jp0`hDzLzL,   ` @ $     h .  h,~JOLEAUT32.dlloPyObject_GetAttrString_Py_DeallocPyLong_FromLong=PyTuple_NewPyDict_SetItemStringPyModule_GetDictPyErr_SetStringPyErr_Occurred.Py_VaBuildValuePyModule_Create2XPyObject_CallFunction_Py_NoneStructPyExc_AttributeErrorPyLong_AsLongrPyGILState_EnsuretPyGILState_ReleasePyErr_SetInterrupt PyArg_ParseTuplePyLong_FromVoidPtrPyErr_ClearPyObject_SizePySequence_CheckPySequence_GetItemPy_BuildValuePyEval_SaveThreadPyEval_RestoreThread9PyExc_ValueError PyArg_Parse1PyExc_TypeErrorpython38.dll,?PyCom_BuildPyException@@YAPAU_object@@JPAUIUnknown@@ABU_GUID@@@Z1?PyCom_ExcepInfoFromPyException@@YAXPAUtagEXCEPINFO@@@Z8??0PyIUnknown@@QAE@ABV0@@Z~??4PyIUnknown@@QAEAAV0@ABV0@@Z*??0PyIProvideClassInfo2@@QAE@ABV0@@Zw??4PyIProvideClassInfo2@@QAEAAV0@ABV0@@Z ??0PyGatewayBase@@IAE@PAU_object@@@ZE??1PyGatewayBase@@MAE@XZ?AddRef@PyGatewayBase@@UAGKXZx?Release@PyGatewayBase@@UAGKXZp?QueryInterface@PyGatewayBase@@UAGJABU_GUID@@PAPAX@Z?ThisAsIID@PyGatewayBase@@UAEPAXU_GUID@@@Z ??0PyGatewayBase@@QAE@ABV0@@Zh??4PyGatewayBase@@QAEAAV0@ABV0@@ZA?PyCom_RegisterExtensionSupport@@YAHPAU_object@@PBUPyCom_InterfaceSupportInfo@@H@Z?DeleteMemberByDispID@PyGatewayBase@@UAGJJ@Z?DeleteMemberByName@PyGatewayBase@@UAGJPA_WK@Z?GetDispID@PyGatewayBase@@UAGJPA_WKPAJ@Z?GetIDsOfNames@PyGatewayBase@@UAGJABU_GUID@@PAPA_WIKPAJ@Z?GetMemberName@PyGatewayBase@@UAGJJPAPA_W@Z?GetMemberProperties@PyGatewayBase@@UAGJJKPAK@Z?GetNameSpaceParent@PyGatewayBase@@UAGJPAPAUIUnknown@@@Z?GetNextDispID@PyGatewayBase@@UAGJKJPAJ@Z?GetTypeInfo@PyGatewayBase@@UAGJIKPAPAUITypeInfo@@@Z ?GetTypeInfoCount@PyGatewayBase@@UAGJPAI@Z?InterfaceSupportsErrorInfo@PyGatewayBase@@UAGJABU_GUID@@@Z?Invoke@PyGatewayBase@@UAGJJABU_GUID@@KGPAUtagDISPPARAMS@@PAUtagVARIANT@@PAUtagEXCEPINFO@@PAI@Z?InvokeEx@PyGatewayBase@@UAGJJKGPAUtagDISPPARAMS@@PAUtagVARIANT@@PAUtagEXCEPINFO@@PAUIServiceProvider@@@Z?InvokeViaPolicy@PyGatewayBase@@MAAJPBDPAPAU_object@@0ZZ?Unwrap@PyGatewayBase@@UAGJPAPAU_object@@@Z?compare@PyIUnknown@@UAEHPAU_object@@@Z?getattr@PyIBase@@UAEPAU_object@@PAD@Z?iter@PyIBase@@UAEPAU_object@@XZ?iternext@PyIBase@@UAEPAU_object@@XZ?repr@PyIUnknown@@UAEPAU_object@@XZ?setattr@PyIBase@@UAEHPADPAU_object@@@ZPyCom_InterfaceFromPyObject3?PyCom_InterfaceFromPyInstanceOrObject@@YAHPAU_object@@ABU_GUID@@PAPAXH@ZPyCom_PyObjectFromIUnknownE?PyCom_SetAndLogCOMErrorFromPyExceptionEx@@YAJPAU_object@@PBDABU_GUID@@@ZG?PyCom_SetCOMErrorFromSimple@@YAJJABU_GUID@@PBD@ZF?PyCom_SetCOMErrorFromPyException@@YAJABU_GUID@@@Z2?PyCom_ExcepInfoFromPyObject@@YAHPAU_object@@PAUtagEXCEPINFO@@PAJ@ZPyCom_VariantFromPyObject?is_object@PyIBase@@SAHPAU_object@@PAVPyComTypeObject@@@ZPyCom_PyObjectFromVariant<?PyCom_PyObjectFromExcepInfo@@YAPAU_object@@PBUtagEXCEPINFO@@@Z?GetI@PyIUnknown@@SAPAUIUnknown@@PAU_object@@@Z?GetI@PyITypeInfo@@SAPAUITypeInfo@@PAU_object@@@Z?type@PyIUnknown@@2VPyComTypeObject@@A?type@PyITypeInfo@@2VPyComTypeObject@@A??0PyComTypeObject@@QAE@PBDPAV0@HPAUPyMethodDef@@P6APAVPyIUnknown@@PAUIUnknown@@@Z@ZB??1PyComTypeObject@@QAE@XZ7??0PyIUnknown@@IAE@PAUIUnknown@@@Z[??1PyIUnknown@@MAE@XZ!?MakeBstrToObj@@YAPAU_object@@QA_W@Z-?PyCom_BuildPyExceptionFromEXCEPINFO@@YAPAU_object@@JPAUtagEXCEPINFO@@I@Z*?PyCom_BstrFromPyObject@@YAHPAU_object@@PAPA_WH@Z)??0PyIProvideClassInfo2@@IAE@PAUIUnknown@@@ZT??1PyIProvideClassInfo2@@MAE@XZ?type@PyIProvideClassInfo2@@2VPyComTypeObject@@Apythoncom38.dll?PyWinGlobals_Ensure@@YAHXZ?PyWinObject_FromOLECHAR@@YAPAU_object@@PB_W@Z?PyWinObject_FromIID@@YAPAU_object@@ABU_GUID@@@Z?PyWinObject_AsBstr@@YAHPAU_object@@PAPA_WHPAK@Z?PyWinObject_FreeBstr@@YAXPA_W@Z?PyWinObject_AsWCHAR@@YAHPAU_object@@PAPA_WHPAK@Z?PyWinObject_FreeWCHAR@@YAXPA_W@Z?PyWinObject_AsIID@@YAHPAU_object@@PAU_GUID@@@Z?PyWin_MakePendingCalls@@YAXXZpywintypes38.dllIsProcessorFeaturePresentzIsDebuggerPresentUnhandledExceptionFiltereSetUnhandledExceptionFilterGetStartupInfoWtGetModuleHandleWFQueryPerformanceCounterGetCurrentProcessIdGetCurrentThreadIdGetSystemTimeAsFileTimeDisableThreadLibraryCalls^InitializeSListHeadGetCurrentProcessTerminateProcessKERNEL32.dll__CxxFrameHandler35_except_handler4_common!__std_exception_copy"__std_exception_destroy_CxxThrowExceptionHmemset%__std_type_info_destroy_listVCRUNTIME140.dlljterminate_callnewhmallocA_seh_filter_dll_configure_narrow_argv5_initialize_narrow_environment6_initialize_onexit_table>_register_onexit_function$_execute_onexit_table_crt_atexit_crt_at_quick_exit_cexit8_initterm9_initterm_efreeapi-ms-win-crt-runtime-l1-1-0.dllapi-ms-win-crt-heap-l1-1-0.dllMM'NtMPJMM0LMMLMMPMMMMMMNMȩM`OMܩMPPMMPM MQM$M RM0C0H0N0S0a0f0n0s0x0~00000000000000000001111!1&1.13181>1C1\111111,2y222222I3O3V3]3d3344&4-444444445l555555<6c6x6666666677(777~777778"858;8N8a8h8o8|8888888888 99*979D9Q9a9n9~9999999999::,:9:F:S:c:p:}::::<<<$<+ >.>4>=>D>K>i>o>x>>>>>>>>>>>>> ????&?9???H?O?V?i?o????????? 00"020B0R0b0r0I1i11111 2)2I2i22222 3)3L3f3334P4444,5F555506l66677786888<9V999%:U:::;;<2>?f???0@"0R00001B1r11122!282A2X2a2x222222 343j3333*4T4444|555555555606Q6^6p6666666777,7V7u77777778 81888G8e8q88888899#9@9W9^9g999999::):9:K:d:n:::::::;;;9;O;X;;;;;;;;;<(<=2><>X>m>z>>>> ??)?L?s??????@020?0`0w000000001+1O1]1i11111 232I2m2222222*3<3B3_3t3333334414G4V4g44444 55@5W5p5y55555555566!6(6?6N6[6t66666666677/7@7M7]7w777777788%8L8s88888888 99 9I9i9u999999:B:X:b:u:::::::::; ;>;H;o;y;;;;;;;;<<6<@>+>D>N>`>e>m>z>>>>>>>?*?/?7?D?L?d?r?|??????P000#0+060=0R0\0p00000000001171I1N1V1g1m1111111112 232=2S2z2222222223,353T3s333333334$4-4B4H4R4j444444444 55)575W5i5n5v55555555 666(676^6d6m6666666667777"7=7777^888889c9p999: :::%:W:]::::::::;$;-;B;H;\;;;;;;<]5>;>E>>>??"?,?K?T?r?????`0 0L0s00000000001&1P1Z1t111111111 2 2&2b2l22222222233$373L3\3a3i3t3|3333333333444.4@4Q4c4h4p4z44444444 55;5^5h5~55555566*686=6E6U6~666666667 7 737I7[7`7h7x77777 888&878A8M8S8h8888889*999>9F9n9t9}9999999::5:G:L:T:i:o:::::::;;;*;2;N;T;];r;x;~;;;;;;;;;;;;;;;;;;;;;;<<<<< <,<B?s?????p00;0P0W0]0o0y000 11,1F1N1f11 2242E2V2[2t2y2222233/3m3394l4444;5@5c5{55555556606A6X666677*787S7^7777>8M8T888888889999:$:e:k::::::;;C;K;`;l;x;~;;;;;;;;;<<)>%>*>Q>W>]>c>i>o>v>}>>>>>>>>>>>>>??9?@?P?V?\?b?h?n?t?z??????????????????????00 0000$0*00060<0B0H0N0T0Z0`0f0l0r0x0~000000000000000000000011111 1&1,12181>1D1J1P1V1\1b1h1n1t1z1111111111111122!212A2Q2a2q22222303P3p33333404A4G4Q4W4a4g4q4w4444444,H2P2T2X2\2`2d2h25555555555555555555555666 66666 6$6(6,64686<6H6L6P6x<|<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<=== ===== =$=(=,=0=4=8=<=@=D=H=L=P=T=X=\=`=d=h=l=p=t=x=|=================================>>> >>>>> >$>(>,>0>4>8><>@>D>H>L>P>T>X>\>`>d>h>l>p>t>x>|>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>??? ????? ?$?(?,?0?4?8? >$>4>8><>@>D>H>L>P>T>X>\>`>h>>>>>>>>>>>>>??? ??,?" # Hide traceback above this. In addition, keep going down # looking for a "_*_" attribute, and below hide these also. hide_names = ["r_import","r_reload","r_open"] # hide from these functions down in the traceback. depth = None tb_top = tb while tb_top: filename, lineno, name, line = self.ExtractTracebackInfo(tb_top, site) if filename[:7]==" all items in the list are utf8 courtesy of Python magically # > converting unicode to utf8 before compilation. # but that is likely just confusion from early unicode days; # Python isn't doing it, pywin32 probably was, so 'mbcs' would # be the default encoding. We should never hit this these days # anyway, but on py3k, we *never* will, and str objects there # don't have a decode method... if sys.version_info < (3,): for i in range(len(bits)): if type(bits[i]) is str: #assert type(bits[i]) is str, type(bits[i]) bits[i] = bits[i].decode('utf8') self.description = ExpandTabs(''.join(bits)) # Clear tracebacks etc. tb = tb_top = tb_look = None def ExtractTracebackInfo(self, tb, site): import linecache f = tb.tb_frame lineno = tb.tb_lineno co = f.f_code filename = co.co_filename name = co.co_name line = linecache.getline(filename, lineno) if not line: try: codeBlock = site.scriptCodeBlocks[filename] except KeyError: codeBlock = None if codeBlock: # Note: 'line' will now be unicode. line = codeBlock.GetLineNo(lineno) if line: line = line.strip() else: line = None return filename, lineno, name, line def __repr__(self): return "AXScriptException Object with description:" + self.description def ProcessAXScriptException(scriptingSite, debugManager, exceptionInstance): """General function to handle any exception in AX code This function creates an instance of our IActiveScriptError interface, and gives it to the host, along with out exception class. The host will likely call back on the IActiveScriptError interface to get the source text and other information not normally in COM exceptions. """ # traceback.print_exc() instance = IActiveScriptError() instance._SetExceptionInfo(exceptionInstance) gateway = win32com.server.util.wrap(instance, axscript.IID_IActiveScriptError) if debugManager: fCallOnError = debugManager.HandleRuntimeError() if not fCallOnError: return None try: result = scriptingSite.OnScriptError(gateway) except pythoncom.com_error as details: print("**OnScriptError failed:", details) print("Exception description:'%s'" % (repr(exceptionInstance.description))) print("Exception text:'%s'" % (repr(exceptionInstance.linetext))) result = winerror.S_FALSE if result==winerror.S_OK: # If the above returns NOERROR, it is assumed the error has been # correctly registered and the value SCRIPT_E_REPORTED is returned. ret = win32com.server.exception.COMException(scode=axscript.SCRIPT_E_REPORTED) return ret else: # The error is taken to be unreported and is propagated up the call stack # via the IDispatch::Invoke's EXCEPINFO parameter (hr returned is DISP_E_EXCEPTION. return exceptionInstance PK ѳPØ[11'win32comext/axscript/client/pyscript.pyUT l_Zx`ux """Python ActiveX Scripting Implementation This module implements the Python ActiveX Scripting client. To register the implementation, simply "run" this Python program - ie either double-click on it, or run "python.exe pyscript.py" from the command line. """ import winerror import win32com import win32api import pythoncom import sys import traceback import re import win32com.client.dynamic from win32com.axscript.client import framework, scriptdispatch from win32com.axscript import axscript import win32com.server.register from win32com.axscript.client.framework import \ RaiseAssert, trace, Exception, SCRIPTTEXT_FORCEEXECUTION, \ SCRIPTTEXT_ISEXPRESSION, SCRIPTTEXT_ISPERSISTENT PyScript_CLSID = "{DF630910-1C1D-11d0-AE36-8C0F5E000000}" debugging_attr = 0 def debug_attr_print(*args): if debugging_attr: trace(*args) def ExpandTabs(text): return re.sub('\t',' ', text) def AddCR(text): return re.sub('\n','\r\n',text) class AXScriptCodeBlock(framework.AXScriptCodeBlock): def GetDisplayName(self): return "PyScript - " + framework.AXScriptCodeBlock.GetDisplayName(self) # There is only ever _one_ ax object - it exists in the global namespace # for all script items. # It performs a search from all global/visible objects # down. # This means that if 2 sub-objects of the same name are used # then only one is ever reachable using the ax shortcut. class AXScriptAttribute: "An attribute in a scripts namespace." def __init__(self, engine): self.__dict__['_scriptEngine_'] = engine def __getattr__(self, attr): if attr[1]=="_" and attr[:-1]=="_": raise AttributeError(attr) rc = self._FindAttribute_(attr) if rc is None: raise AttributeError(attr) return rc def _Close_(self): self.__dict__['_scriptEngine_'] = None def _DoFindAttribute_(self, obj, attr): try: return obj.subItems[attr.lower()].attributeObject except KeyError: pass # Check out the sub-items for item in obj.subItems.values(): try: return self._DoFindAttribute_(item, attr) except AttributeError: pass raise AttributeError(attr) def _FindAttribute_(self, attr): for item in self._scriptEngine_.subItems.values(): try: return self._DoFindAttribute_(item, attr) except AttributeError: pass # All else fails, see if it is a global # (mainly b/w compat) return getattr(self._scriptEngine_.globalNameSpaceModule, attr) # raise AttributeError(attr) class NamedScriptAttribute: "An explicitely named object in an objects namespace" # Each named object holds a reference to one of these. # Whenever a sub-item appears in a namespace, it is really one of these # objects. Has a circular reference back to the item itself, which is # closed via _Close_() def __init__(self, scriptItem): self.__dict__['_scriptItem_'] = scriptItem def __repr__(self): return "" def __getattr__(self, attr): # If a known subitem, return it. try: return self._scriptItem_.subItems[attr.lower()].attributeObject except KeyError: # Otherwise see if the dispatch can give it to us if self._scriptItem_.dispatchContainer: return getattr(self._scriptItem_.dispatchContainer,attr) raise AttributeError(attr) def __setattr__(self, attr, value): # XXX - todo - if a known item, then should call its default # dispatch method. attr=attr.lower() if self._scriptItem_.dispatchContainer: try: return setattr(self._scriptItem_.dispatchContainer,attr, value) except AttributeError: pass raise AttributeError(attr) def _Close_(self): self.__dict__['_scriptItem_'] = None class ScriptItem(framework.ScriptItem): def __init__(self, parentItem, name, dispatch, flags): framework.ScriptItem.__init__(self, parentItem, name, dispatch, flags) self.scriptlets = {} self.attributeObject = None def Reset(self): framework.ScriptItem.Reset(self) if self.attributeObject: self.attributeObject._Close_() self.attributeObject = None def Close(self): framework.ScriptItem.Close(self) # calls reset. self.dispatchContainer = None self.scriptlets = {} def Register(self): framework.ScriptItem.Register(self) self.attributeObject = NamedScriptAttribute(self) if self.dispatch: # Need to avoid the new Python "lazy" dispatch behaviour. try: engine = self.GetEngine() olerepr = clsid = None typeinfo = self.dispatch.GetTypeInfo() clsid = typeinfo.GetTypeAttr()[0] try: olerepr = engine.mapKnownCOMTypes[clsid] except KeyError: pass except pythoncom.com_error: typeinfo = None if olerepr is None: olerepr = win32com.client.dynamic.MakeOleRepr(self.dispatch, typeinfo, None) if clsid is not None: engine.mapKnownCOMTypes[clsid] = olerepr self.dispatchContainer = win32com.client.dynamic.CDispatch(self.dispatch, olerepr, self.name) # self.dispatchContainer = win32com.client.dynamic.Dispatch(self.dispatch, userName = self.name) # self.dispatchContainer = win32com.client.dynamic.DumbDispatch(self.dispatch, userName = self.name) # def Connect(self): # framework.ScriptItem.Connect(self) # def Disconnect(self): # framework.ScriptItem.Disconnect(self) class PyScript(framework.COMScript): # Setup the auto-registration stuff... _reg_verprogid_ = "Python.AXScript.2" _reg_progid_ = "Python" # _reg_policy_spec_ = default _reg_catids_ = [axscript.CATID_ActiveScript,axscript.CATID_ActiveScriptParse] _reg_desc_ = "Python ActiveX Scripting Engine" _reg_clsid_ = PyScript_CLSID _reg_class_spec_ = "win32com.axscript.client.pyscript.PyScript" _reg_remove_keys_ = [(".pys",), ("pysFile",)] _reg_threading_ = "both" def __init__(self): framework.COMScript.__init__(self) self.globalNameSpaceModule = None self.codeBlocks = [] self.scriptDispatch = None def InitNew(self): framework.COMScript.InitNew(self) import imp self.scriptDispatch = None self.globalNameSpaceModule = imp.new_module("__ax_main__") self.globalNameSpaceModule.__dict__['ax'] = AXScriptAttribute(self) self.codeBlocks = [] self.persistedCodeBlocks = [] self.mapKnownCOMTypes = {} # Map of known CLSID to typereprs self.codeBlockCounter = 0 def Stop(self): # Flag every pending script as already done for b in self.codeBlocks: b.beenExecuted = 1 return framework.COMScript.Stop(self) def Reset(self): # Reset all code-blocks that are persistent, and discard the rest oldCodeBlocks = self.codeBlocks[:] self.codeBlocks = [] for b in oldCodeBlocks: if b.flags & SCRIPTTEXT_ISPERSISTENT: b.beenExecuted = 0 self.codeBlocks.append(b) return framework.COMScript.Reset(self) def _GetNextCodeBlockNumber(self): self.codeBlockCounter = self.codeBlockCounter + 1 return self.codeBlockCounter def RegisterNamedItem(self, item): wasReg = item.isRegistered framework.COMScript.RegisterNamedItem(self, item) if not wasReg: # Insert into our namespace. # Add every item by name if item.IsVisible(): self.globalNameSpaceModule.__dict__[item.name] = item.attributeObject if item.IsGlobal(): # Global items means sub-items are also added... for subitem in item.subItems.values(): self.globalNameSpaceModule.__dict__[subitem.name] = subitem.attributeObject # Also add all methods for name, entry in item.dispatchContainer._olerepr_.mapFuncs.items(): if not entry.hidden: self.globalNameSpaceModule.__dict__[name] = getattr(item.dispatchContainer,name) def DoExecutePendingScripts(self): try: globs = self.globalNameSpaceModule.__dict__ for codeBlock in self.codeBlocks: if not codeBlock.beenExecuted: if self.CompileInScriptedSection(codeBlock, "exec"): self.ExecInScriptedSection(codeBlock, globs) finally: pass def DoRun(self): pass def Close(self): self.ResetNamespace() self.globalNameSpaceModule = None self.codeBlocks = [] self.scriptDispatch = None framework.COMScript.Close(self) def GetScriptDispatch(self, name): # trace("GetScriptDispatch with", name) # if name is not None: return None if self.scriptDispatch is None: self.scriptDispatch = scriptdispatch.MakeScriptDispatch(self, self.globalNameSpaceModule) return self.scriptDispatch def MakeEventMethodName(self, subItemName, eventName): return subItemName[0].upper()+subItemName[1:] + "_" + eventName[0].upper()+eventName[1:] def DoAddScriptlet(self, defaultName, code, itemName, subItemName, eventName, delimiter,sourceContextCookie, startLineNumber): # Just store the code away - compile when called. (JIT :-) item = self.GetNamedItem(itemName) if itemName==subItemName: # Explicit handlers - eg PK {R0win32comext/axscript/Demos/client/asp/interrupt/UT Zx`Zx`ux PK Y03KsXX9win32comext/axscript/Demos/client/asp/interrupt/test1.aspUT  YZx`ux <%@ language =Python%> <%Response.Redirect("test.html")%> PK Y03K"f9win32comext/axscript/Demos/client/asp/interrupt/test.htmlUT  Yux  GOT There PK Y03KfwB:win32comext/axscript/Demos/client/asp/interrupt/test1.htmlUT  Yux  GOT HERE PK Y03K |&II8win32comext/axscript/Demos/client/asp/interrupt/test.aspUT  YZx`ux <%@ language=python%> <%Response.Redirect("test1.html")%> PK Y03K+##.win32comext/axscript/Demos/client/asp/caps.aspUT  YZx`ux <%@ Language=Python %> Python test <% import sys print sys.path from win32com.axscript.asputil import * print "Hello" print "There" print "How are you" %> <%bc = Server.CreateObject("MSWC.BrowserType")%>
      Browser <%=bc.browser %>
      Version <%=bc.version %>
      Frames <%Response.Write( iif(bc.frames, "TRUE", "FALSE")) %>
      Tables <%Response.Write( iif (bc.tables, "TRUE", "FALSE")) %>
      BackgroundSounds <%Response.Write( iif(bc.BackgroundSounds, "TRUE", "FALSE"))%>
      VBScript <%Response.Write( iif(bc.vbscript, "TRUE", "FALSE"))%>
      JavaScript <%Response.Write( iif(bc.javascript, "TRUE", "FALSE"))%>
      PK Y03K:6win32comext/axscript/Demos/client/asp/CreateObject.aspUT  YZx`ux  PK {R&win32comext/axscript/Demos/client/wsh/UT Zx`Zx`ux PK ѳP{ss.win32comext/axscript/Demos/client/wsh/test.pysUT l_Zx`ux # Testall - test core AX support. # Test "Restricted Execution" (ie, IObjectSafety). # This will fail if in a "restricted execution" environment, but # will silenty do nothing of not restricted. This same line in an MSIE # script would cause an exception. print("Importing win32api...") import win32api if 1==1: print("Hi") WScript.Echo("Hello from WScript") #fail PK ѳP#/win32comext/axscript/Demos/client/wsh/excel.pysUT l_Zx`ux #app=WScript.Application #app._print_details_() # Use this to see what Python knows about a COM object. g_index = 1 # A procedure, using a global. def Show(desc, value = None): global g_index # Need global for g_index, as I locally assign. # No global needed to "xl" object, as only referenced. # Also note "xl" is assigned later in the script - ie, Python is very late bound. xl.Cells(g_index, 1).Value = desc if value: xl.Cells(g_index, 2).Value = value g_index = g_index + 1 xl = WScript.CreateObject("Excel.Application") import sys xl.Visible = 1 #xl.Workbooks().Add() # Excel versions before 98 xl.Workbooks.Add() # Show the WScript properties. Show("Application Friendly Name", WScript.Name) Show("Application Version", WScript.Version) Show("Application Context: Fully Qualified Name", WScript.FullName) Show("Application Context: Path Only", WScript.Path) Show("State of Interactive Mode", WScript.Interactive) Show("All script arguments:") args = WScript.Arguments for i in range(0,args.Count()): Show("Arg %d" % i, args(i)) PK Y03K/win32comext/axscript/Demos/client/wsh/blank.pysUT  Yux PK Y03KYY2win32comext/axscript/Demos/client/wsh/registry.pysUT  YZx`ux """ Windows Script Host Sample Script ' Ported to Python ' ' ------------------------------------------------------------------------ ' Copyright (C) 1996 Microsoft Corporation ' ' You have a royalty-free right to use, modify, reproduce and distribute ' the Sample Application Files (and/or any modified version) in any way ' you find useful, provided that you agree that Microsoft has no warranty, ' obligations or liability for any Sample Application Files. ' ------------------------------------------------------------------------ ' ' This sample demonstrates how to write/delete from the registry. """ WshShell = WScript.CreateObject("WScript.Shell") WshShell.Popup("This script shows how to use registry related methods.", 2) WshShell.Popup("Create key HKCU\\Foo with value 'Top level key'") WshShell.RegWrite("HKCU\\Foo\\", "Top level key") WshShell.Popup("Create key HKCU\\Foo\\Bar with value 'Second level key'") WshShell.RegWrite( "HKCU\\Foo\\Bar\\", "Second level key") WshShell.Popup ("Set value HKCU\\Foo\\Value to REG_SZ 1") WshShell.RegWrite( "HKCU\\Foo\\Value", 1) WshShell.Popup ("Set value HKCU\\Foo\\Bar to REG_DWORD 2") WshShell.RegWrite ("HKCU\\Foo\\Bar", 2, "REG_DWORD") WshShell.Popup ("Set value HKCU\\Foo\\Bar to REG_EXPAND_SZ '3'") WshShell.RegWrite ("HKCU\\Foo\\Bar\\Baz", "%SystemRoot%\\Foo") WshShell.Popup ("Delete value HKCU\\Foo\\Bar\\Baz") WshShell.RegDelete ("HKCU\\Foo\\Bar\\Baz") WshShell.Popup ("Delete key HKCU\\Foo\\Bar") WshShell.RegDelete ("HKCU\\Foo\\Bar\\") WshShell.Popup ("Delete key HKCU\\Foo") WshShell.RegDelete ("HKCU\\Foo\\") WScript.Echo ("Done") PK {R%win32comext/axscript/Demos/client/ie/UT Zx`Zx`ux PK Y03Kw-win32comext/axscript/Demos/client/ie/demo.htmUT  Yux  Python AXScript Demos PK Y03Ky4win32comext/axscript/Demos/client/ie/marqueeDemo.htmUT  Yux  Internet Workshop


      Marquee Demo



       


      Notes:

      PK Y03K Python Script sample: Calculator

      Calculator

      PK Y03K5win32comext/axscript/Demos/client/ie/MarqueeText1.htmUT  Yux  Internet Workshop


      Python AX Script Engine
      Demo using the Marquee Control
      Mark Hammond.

      This is really quite a boring demo, as the Marquee control does everything. However, there is Python code behind the buttons that change the speed. This code is all of 2 lines per button!!!

      For more information on Python as an ActiveX scripting language, see

      Python
      http://www.python.org
      PK Y03K30win32comext/axscript/Demos/client/ie/dbgtest.htmUT  Yux  PK Y03K\m8-win32comext/axscript/Demos/client/ie/form.htmUT  Yux 

      Name
      Address
      PK Y03K23win32comext/axscript/Demos/client/ie/demo_check.htmUT  Yux 

      Engine Registration

      The Python ActiveX Scripting Engine is not currently registered.

      Due to a privacy concern discovered in the engine, the use of Python inside IE has been disabled.

      Before any of the supplied demos will work, the engine must be successfully registered.

      To install a version of the engine, that does work with IE, you can execute the Python program win32com\axscript\client\pyscript_rexec.py must be run. You can either do this manually, or follow the instructions below.

      Register the engine now!

      If you have read about the privacy concern and still wish to register the engine, just follow the process outlined below:

      1. Click on the link below
      2. A dialog will be presented asking if the file should be opened or saved to disk. Select "Open it".
      3. A Console program will briefly open, while the server is registered.

      Register the engine now

      Checking the registration

      After the registration is complete, simply hit the Reload button. If the registration was successful, the page will change to the Python/AvtiveX Demo Page. PK Y03KYQQ6win32comext/axscript/Demos/client/ie/pycom_blowing.gifUT  YZx`ux GIF89apqTTTrrrͯώHHvv𐐩OnjFA0- heiD1,ZNiXS1'E"K0/.qNfM'H0 FƤFq&ӲIHJslKTN,įkMGplh-65ddS̰mʎm+""lmmO0HIQpO4DBI/NjqpR"5 Kq/H#E +pgRG-+ -/xsE3skmKEed1/i0m2V&/6E+E.MjQ#m-4Q1A)Kj3fNY"'%K..&AFEߢ¿ub]Lmo4MLLK`^effcssTood7LLUAppmCN#JJ5$ttMttP-''qqL4op&j68-n..P`hiPpnŖ5bTrτnХ58<.Ms0jFMbgkPV邂PP磻rr㴴 ڶO2hȳʎ[ЌjdgOiaoLP) !,pq@Y H*\ȰÇ cy81&^ q!p )DrVT䪥PbɌ͂sR%M@)zbHT,h\ʴӧPJJի%ʵW$a q!ṼPpcD.10l4iEv ]$>p$Y:0LϿyö_8<| }eؑbȑ#.NHFeKlU_n+*Ij*7.֡ZkǪkɿ!j *T>:u2z @7xM8 6Dx .HL2UN$g1 9眃:N6 DCq 8pOAg-aTw`eV S[JP$u}->hX h\pqHRHVP*ҫ a%% 4 m1鄜N;$C-!wSRqM oe-i\KP\ :do6io )r\x5b8WK6D1D4H,Po 8l#7t-O $?p"tW 30Z E2xq I%:C5w/GetWo]2#hƱcIJ-O'pw!p;Sg{ufU^A " ~#a+. ?Yw3qI!au3AXL<'& pتV2p(>uNz ya/HB=(ЮMb{d]2!sIS240`+]r`'! z:.A `TCP/ K8<=UQxB]0u TV0 HW@;KA )) QaA]Ѕ.=N( (lT*5JV`fc] s1pHH(Xm8J&щb~0RG=J=yxhr0f6P pǸQjA0 b3B66Cya`Da"%BIa^?pW.z^4UІ98ig@C.jQ_L`gvLAGS5!`CDvT,  X@c\V [ $0 HNNBY{^3 R dɏ@yLd¬Jɐ W]8"!|q XAXUU-,jĀ$BWa)A?8tUBp*ϊFNjP8` / mp1d?M#iJjKZ !Z^:-WU"Z1} 8E*RG@B (r1T& #4QMlB VmVbp O@E.':\&-;84&]BGK! lb+Q2?̳H, 1 r@ P(0L@OA/vX[ R(-W$ુd|9w;=b6>E.r^>; Z4~'al@wu/7 @ƑD 8 &WPAD"z FHrE n)rB"q/"m%$_48G9ArFe6AIxeѕl~YrpI~Z$9S 9VzN U,y͊G&Oy0 r/kh9$aDPsȀr%֊W,}Xw0?y :\v<.UTeԤP@C#ƒ5L2LgfԜAV1b:é'itApu.&cD `A R KrTs+raH=||T26 bNd`EoߠP FF 2  k'$B8E<A,""B`ye *6`qG)/G1)|C~LCB% x}Y2$=zBr3`!X?3u{3(we(v(4ŧ13350~{-G3 @P HIH֔$o (^BR&CB:@C\_ bNᰁA2@ 44(4%LBwHXx1u P 4. CaFq긎؎8H_pb Џ )@QА0 wE6f."QlT"9$yxG5lPeI-pb(  @@ ZD:5_wB"آ_Om(t'ٯ*6zqGqe (0l(L^ |Lt@ Oi3&:'MQExKjppjRȪi0sE!exS{QeQjv :` GEiT"TE5IKT 0T@"!N,_EЭ|+V|KL{'UXN e01$%'q%2t_&.ngb0DYwVF3ǵS6q1 PP )60PPp)* ŰgK=0xxd )|h0gGRڮI^$VVxS&ʹVDX^Pb!Э+R 1Sq:w :D (Z%k}ۅ'YчNr8`Pkz `pNu`&w ` Vldg;@c81 UP Wpq pB X ` `  eZJs\˚xZ\[pm C}RhPʦX`o00 j E #Yrih}ɝ'j 0G\CI/b sE m  b 6 @ |b6w A W P vrW03g(cǖ2ƾ!vrEdK]fdK'w~9( j]TVNR`䠕h |-YW0 (C\Oq{wh=T] 18doAЦ X C*X*( ` RvF5Fw ܑ}Au'2P 1GЬوF+R(11<o @"@  2k7l 2AzgL%)3!$O2|L٪د1dX7}W$9ˆ0XZ-cK cC7Y(N PL% N Lt*3  mP`k,2w֬v`C "7K'Ҷ0aa{&bR1= 8㖀~V BpUsFXbR 2ax:Nˈ*ͭ,-ך h2y$}xT};( *V wuW0HL(0@R'jܾw] ;5GI@ @ ߰ {J`@ E+Yм1Ew`00 0S'pxlPF4a +G)G6, uM6G:#cWNt7AO,[eX8i|TYC=t@Ȑ#]Cņ'azGА)LO[Fu' ~;;hPY# fŌ@dQ!xG;ȅ,.'u+X2B@aYC! HFrcdFK`7щ ~B'ϭi%K~q~)% H-#-4#+(5H-)%HbWSC QM,rG>Ibe-֖gIje, Y-# U ]$!Р53^B/,AUX9/$E/gДl590pËÕ   J@T*&hY(G?2Pxx6 nTF&ĒMōPYٝTP۱(1} RՊO|"CK-rbrJ\RE"&HgIL$'2 W5X3߳gm0>brQS73DCxqu3 o8Dcπu.k`H*~CCg@6 $(BÑ h D }Cq,"JX@ T J䐉lX+K cFj?4y ~2u~:6J/q^D,U'H@TM--Hx Q(%@:$mK?E7J[d6}y.^k, &1c!Bk_. qQ L3kP9 ;>:;cxglTt%Lj) ip񒗌mvЌAc4p(@0`cs2}(1Y@J>T,`^0g9f9 M'w öcD(J ,j,6Dڪb@ @BSvJJlt?&P< !ϒS6aI+QID+ZEff vmg.kw@C0Y5zʞ9 ,! [>*fV%C6kHa=]pYb&s0 0A[k9\šYRU2Z(/, Pб4F7N,&~fz,hj' ༕vSl2:d,ɵ $p,iDmX1L`BP&P0S+ !gmQga'[ H5A@`} [ cqM*>v>I.QTr0O]g@ E>R2 $@ %. s^&)XA aJwaIQ,"_/nF+p\ vhF AAP4J(Y0\ȃ@R;8`s?A j[Zt)q%dpt]\(G8} R!Oh"ɚ~{*; 3h+Zk!C`RBqBoOB= fڈM庄Žpx<|~xU 5Q(()[=P^@TxGT Cq7Lf 2`%}ũ!PT]A\`(]DEXȅQ sO`C0\?h(J4Ђ+:03hT>p* l"ÙHa#s"0 ,,=#| 3@FԦ.î W?9p=0Ɍ/} J sBJ /?H2`D x[V#m]ȮzȇxxzPX&,  4viY􌭅+ Ͱjڧh5d*ԙ.-"%=m(۳ R i@= :\_Ї, b&ODC@^饝I I^`ZmW( W~8@5݉}xn؆"UHGwqP}s!(\5atz2 Rh{x{x||,_F 9!ڏP2VX%4H`u Yا()#F"Q5TL7ۃY_0B@MK/:m+0cVhxKExA_u Ѱ~}@q@sbxHnxl OܭA -QD:?h PQfU"&nwȆzw?GW ᘼr^" 5Xu * I7ވʈ5<&T(1;~#ȏ jCH/ ?؄xGWcCRh7bdJi L09P@ S{ Ht8SohTʩ6Q@N\N RgӄhfUjfSw{F@T_|aad;9T櫽i^ ]:ߺz+ };@N#޾mɪ*䨊h<J0VbVT%SīIl0j&#5SmV Ynbd~N~hnn{.ވ~ܭ[ML䛴n>o§n~oVKɍ0LP0Q`o?p+[PNpV p ߆fmxiA|p0/D oX*ii.BC?Mppq߄e#нr8`k@rl la -Gg~<Ñfl0mBA?(m s:s;]Іos@u*1rf8tfkhA|d:TMDh/* ȁ$@ESq^sXqp CV5m-B7 H#7ri]e=%s&/LsNnNrЍ0KHVs  $R^!<2P h($w$kHi%s8v_j_h߄WȄM O:{Ё s< {3HWywlfM%0yFn,k`p!lt*cK _>:/wz&(,@:p Eo@k=/ L_iPHӄ*' ؁" PHyqښu@ѦDu=g5(L<m|qKn^ZR;HH 310X(@WJ*rpD9{Oj9MӰ W$p!lN|cwv?.?]_G+CC6 }:0:1Q(BzRoἽ/BoI FNx)ԉȐ"G W^,ҁ~y#w\rlWp2(>r4Ǎ9hXA$֬ZrVakj6*Ubײm6R״n֪.Hu ,H}z;WĊJRťȒԚrd2UĶH|lᵄͦkcb6JebO p 'gDoذ!v.NʢE f:-[q LhִM"wCey8R{@2 $v$ Gpf]n%["IY"IRK[m%\v%Ik %hn! "G\608Ì3pH-D!guW$YRbX!2%)v%E0Ezp`ACg 9' Y LKWN)/4/C:PC 3ADjjIzXd}`&"oi NaXvUj_^WXj*0 qD/@.&XXj[r!H" vqelk骻-̠  A .C2.#M@I(&eOysMx;pBO?QkE$ &+' ʬM:[.WJȤk*!jb_:\lV B,I DgaU8=*q Ғ}Vvp{w@nXI[aUx_e-D490hn/t 3BcV8!yN3 >8 9hg? QE` |U}a_ -ЂJLb'(fz =xd;|Zb=ve$獫Os1N!;X#!f#[Vϐ*Z Ip j?p%  .Ą&uXC^Ri#ز6Qikx` w9A@"P"40 1$5G\iBB-fE9]BA%UTbU R[ Ɋ 3|/+CVqRBhi6/msGXUp0iKP 2x1`!è?4L؊H_toĠZ"p(OS>2Zo;%X4}Ỡ8GN-o3M2iDem%٧2JHC p?lm? >L4;Ҭ)@0rYNr-8ȓGʇ5c Th@t-xG¡@?zT`$2p$!JtP:Y(q%VMPNOyU}ܧ" Y|2-4X :HB{P!p#P-2.XQjG_"1PdbUz8]-V)m jaOXlB( sC6,![P|vH+ali @POhWehA * P~1 @+v RSn !*vG¬-D:O!e TVD>M)D-/w\#XB`~2Aap;Br^ZAҭ<%} 4W8@ A^Z:`c[ЌfT>0>|e9'6 V,8as@9z5 3PbA<pr(V+0I -c+c&*VD b(>F{ -<4 PG-^*GLtHWps ` aCh8C7IuMW=:p$1qLi{A J z z & tƹ/!.@*[@o<=@ GQ[U~qi!4agH%♾РajO? ̵  e$Ɉ0aDB#(qcwG]/qŽg=mDe@ቐ6dGCzFK: /ϟsV .z˾ @V(Π5P^pys^JȂ(*gVuw PȲȆ(f^0HKÁ#a(2p;~~3@qU0 14ĄwWr`zwB6)8r1SBDHچv;/A%l X{_H$`g@,XZL^uaTYڱ< e(Ԁ,АȩM% @ ('-Bq ݭ(A$ %pf!7H nŗIlmL$_8<.G@ױpi@n(4aQ=R!kIH0B%$ledC& ̈]ߥdRའHx1?D4xxAiU-jZ`9޼y =ⱚI102622a($4Nc/![4B(dz#B0|#8C34B"!6 cLC[d D= '_ T0NP/^aE1(B% $lB% K&x'|+dc,%Hn!^b^a`@u`,V,AH$-V\ jEi`eWqF$^p @<  (W M%8A &P1@ߎqa I-H2CD?|1̮QB[A}Frz?柪Eb+)hf,6%lBn(?>Y>‰//B<^T"nޑ*%T%hp 'dC?JVbA<\b橁HvZdd,~g,e[{xA[L%Un Ŗ#~@a[B6 h_h&d @耆Q#M"c R8R%jC E!tE6&V45EE#J&dCʁ%hKA&#hܠԂI'eHv""}7(h^$U*VOAE$*)呧y(d*) S?'zΧ )8P(0@ jD@o?`@D*Ȁ?@U؂x@x  O>u 8K 0Y(\2A$J?dfj)[F `L|^J8`O.0D$pd ݎB*#<,Pc}(aw%Ri&XB%|_&\.&A++b'(W-x饉AyEBtԋB!1Jc}Qd(BĤr`46o1f1+/>7,[Ae!AlH@ trL@jz L њH(#4^%'@n!hJ0++)P: HŖVj##7샶%L98p_8B)%@6r,(lB dBq5^Xv+q\bĂ! ƴ ./">bB.80Cg--LrX7(rvZ JUil@?dqi]q8vʧycO _ܪOx3$78kPDa!"%_2; EAu7Q,D/Lx)p@!|)+?F,nTB AW&/ܶ/p!x 40„B)52܂),"` 9Uw*4Br.*́͢p@1lxBIx#?;G;`Xp%tzhw+OP/&%)$*$'๴(J3*%x[əcy?,tO0`r!\b&(/$ $4L7Wbu<P8b|51lM|K pJܻ=}I\9$rW+|,,T{(-$B,|(9ǻoXdBTlE.xPm DԘp0t:.d0.YD-B"B"xD(t/|B'fbTO5;B(⁍<,7oA8gG(̼d)d΃D؆mH0 d tJ׾߾ p!t 3 +¹"Ȃ,"t5,*.D @4V!CpGO'<'jn&.w~/t" DIXd* W4xP$IjD9eM5^\ƝF"%`W-iִyAxs?E E4UHVZ"9JCVv!Wcɖ-kٶ%ʒMb:po+P ?pD )e*#Cb4kV.TPt[Fb t pVFt]ñ.\xsBINÉwJSO!T6 !B`5pD۹a3-Nx~ *UoTb6oR~T):!iaR>V Cs -"D44 " RHdKpl< gA*%D)DBdL9nM\Y.H#p #:JU䐋H(pЊV:0죨C$ %>UQ*eOD tMA_l2*/J`EL1ESNO4G3ClU 2 d , ̻lFA ~ ^4ɤiY@a =|B)2Btϛ+jioN$G9b*>I4ڐtO"I6y㫟180~y N^0DO=&[Zd֊횬oHlR(iMpЧ(LyQHPy$M IJ.DF* ƕiKe`dOl缴aL.+>879W萼Xz)0F|F6&V N8>Q$4,ږ.,*o6C7Rp?C(6(/Q4@6,qK'a@e Bp8:"íe,78pL(X1M0, U G"WE+ $^"{kYŷp8"/qsцw=OEDn#B*´H"*}d$ F\D"! E*NWɨTxPVT%7 (-J-TCzR$kAR+O$)['.%1ce.jz`%Jp8pb[KxbYEZ$U$Iɚ4d406q1 Y7`"-Tq4!igPDU=K^mdGATDg ×o eQ~\5P] e3͆G h66PbPC  [8Y$^hF9JGRw68<{#6_bOX&:W@0ZX!KGP 7Dul2dȲ[]ˊ@ҕ#zZ>7oƞ9}jbE#j8\+5W?`(TjaQ_͖,|tW~ .4!#qhk҈21e Db x8!!CG< Xm%AhXtcF61{эy;O+r?9n1+F^5[ o6ӓ,PZlKbS7^k"nۭZ ?d1(` ASw,!lpQ,bQBcwCKl>cQ0!*gyhZ- l@<~iU 1Jn١Od+*}Є&\A b`΀XiߓaưRq0Garp<wĴ M  |y锎(e򘮱:$0Ћ>fM'-D&o>'dF ծЪkڌ"k -b(+za9>o$,4po% B%fȸ<*RgҼ/ƬAAc&/.ۆpDD`fxHXʤah`A0.(O0ZA&4%~*hM >R>OٴnɊhc,K몕Bc+f ?P@AlN(6?8>aZ^oie"p>բ (4K#/ԡZAlqO|e8>a}|a `"'  hbjC$ &fF'\&  CѕZ%Ũ J'֞Jת֢&)7E02 7+'b`8h]4E*cDbNl.^2@DkZ,:d+N)%K2(#Ot!\*B/,kAp!ԤKZPe"R#@Rs4҆8R(M.A:`K+Q+kDL, P N-ͱq-`)7Ϗpq&+,"L eKC*!.2(-7pP(CXER,+L.l؜/PA<P<"< CklDMJD߁ cbqNx~x`J!G#.2@X5LAtSўIaa+Jf+BJBR01*J;*&̏TPJ<?Q3Tպ"nBNui*ِj:-,dҫ.P'+% A`ȚN+2!FDk#FO>rTGx"G"/r5AkH!ʆA8@o!XI3'QBdːpB=J+*g N&4 A3CknnuR4ҿu2ļꓲ/TM+0dU,b_ER0EK0q48$UVKS4a.a* GD wU 86!G^׳I!vvQ{, hgGi/iNN!bRiU!D!*WW\ސc5pi &!56eSN@mvCfooKi'Rl@۪̎,qCh!gVr'rA会r3WsIED^!0C An!XWDax6Wvgoє&J^ÎvwwA<^-!@EzylMyzi"zW{77;F"|7;ws;PK Y03KL{''3win32comext/axscript/Demos/client/ie/demo_intro.htmUT  Yux 

      Python ActiveX Scripting Demonstation

      Congratulations on installing the Python ActiveX Scripting Engine

      Be warned that there is a privacy concern with this engine. Please read this information, including how to disable the feature.

      Object model

      Except as described below, the object module exposed should be similar to that exposed by Visual Basic, etc. Due to the nature of ActiveX Scripting, the details for each host are different, but Python should work "correctly".

      The object model exposed via Python for MSIE is not as seamless as VB. The biggest limitation is the concept of a "local" namespace. For example, in VB, you can code text="Hi there", but in Python, you must code MyForm.ThisButton.Text="Hi There". See the foo2 sample for futher details.

      Known bugs and problems

      • This release seems to have broken Aaron's mouse-trace sample. No idea why, and Im supposed to be looking into it.

      • Builtin objects such as MARQUEE are giving me grief. Objects accessed via forms are generally no problem.

      • If you are trying to use Python with the Windows Scripting Host, note that .pys files are not correct registered - you will need to explicitely specify either cscript.exe or wscript.exe on the command line.

      PK Y03KɅ/3win32comext/axscript/Demos/client/ie/mousetrack.htmUT  Yux  Python Scripting sample: Mouse tracking
      Clickable Map Image
       

      A mouse tracking demo. Move the mouse over the image above...

      PK Y03K/ž -win32comext/axscript/Demos/client/ie/foo2.htmUT  Yux 

      The caption on the first button is set by the Window Load code. Clicking that button changes the text in the first edit box.

      The second button changes its own text when clicked.

      The fourth button calls a global function, defined in the global 'script' scope, rather than the 'MyForm' scope.


      And here is a second form


      PK Y03KE-r2win32comext/axscript/Demos/client/ie/demo_menu.htmUT  Yux 

      Scripting Demos

      An Introduction to the scripting engine.

      The Calculator Demo is a very cool sample written by Aaron Watters.

      Mouse track is another of Aaron's samples, and shows how fast the Python engine is!

      The foo2 sample is mainly used for debugging and testing, but does show some forms in action. PK Y03Ki1win32comext/axscript/Demos/client/ie/docwrite.htmUT  Yux  A page generated by Python PK {Rwin32comext/mapi/UT Zx`Zx`ux PK 2<Pe@`HPD`+Th@P.textK<> `.rdataPB@@.datap&@.gfidsL@@@.rsrcDP@@.reloc+`, @Bh@eh`gjh"gh0SfpgTRfhKf(YhehgjhP$ghTfHgTRfh Kfy(YhPeh@gjhP$ghUf gTRfh0KfI(Yh eh`gj5 RfghVfTRfh@Kf(Yh eh gjh"ghWf gTRfhPKf'YhP'eh!gj5 Rf!ghYfTRfh`Kf'Yh,ehgjhP$gh^f"gTRfhpKf'Yh7ehgjh"gh\afx#gTRfhKfY'YhFehpgj5 RfP$ghdfTRfhKf('Yh Ueh0gj5 Rf(%ghDhfTRfhKf&YhYehgjhP$ghif&gTRfhKf&Yhieh`gj5 Rf&gh0nfTRfhKf&Yhjeh'gjh"ghnf'gTRfhKfi&YhsehgjhP$ghqf(gTRfhKf9&Yh~ehgj5 Rfp)ghtfTRfhKf&Yhehgjhp)ghufH*gTRfhLf%Yh ehgjhP$gh xf +gTRfhLf%Yh0eh`gj5 Rf+ghPzfTRfh Lfx%Yh eh,gjhP$gh{f,gTRfh0LfI%Yh0ehgj5 Rf-gh}fTRfh@Lf%Y%LRfQVt$ t$_SfFpg^YSfeVSfRD$t jV ^Ujh?HfdPd%QVja uEt(uSfFpg^Md ]ËM3^d ]̋D$̋D$ uPQfY̋D$tu D$%Qf%LRf̃ SWt$,3|$|$ |$LRf؃u_[ VD$PD$ PD$ Phh[fhh,\fh\\f`Eu PQfh[fhhd[fh[f8Wv4QfQfuWӃu'h\fhh]fhD]fjRf(Qf uVӃ_^u$QfM3d [] Vt$ H,T&e$D&eFj%Pv}Pvvvv 6hXf0Qf(^Ã~v}tRfXQfu3^v Pvvvvv 6hXf0Qf$^=tK@t @v,dtPv$v(vv vvvvv 6hYf0Qf0^ÍF0PVPF P PFPPv v6hYf0Qf^=tG=t&Qh(YfjQf5Qf6hLYf0Qf^v vvQhXf0Qf^vvgPvv 6h Yf0Qf^f$e$eT%e%eV QfF^̋̋V~u6$QfF^VF]fu PQfF u PQfD$t jV ^V]f$RfD$t jV ^UjhHfdPd%QVjQ uEt)u(Rf]fF!g^Md ]ËM3^d ]V QfF^V~u6$QfF^QT$D$ V ;usD$D$^YD$D$^Y̋T$D$V f ;us^3^̋D$̋D$ uPQfY̋D$tu D$%Qf%LRf̃(Wt$0D$ D$LRfu3_(ÍD$PD$ PD$ Ph]ft$DQftԋL$QfU;u3l$/A@TQQft$ QfD$QfL$ S;uN3V QfD$PD$(Pt$(SUt$,WQ@VQf^y4hdfjW0Rf []_(Í\$$PQRfu[]_(jt$t$( []_(áQfh]f0,Qf3]_(̃Wt$LRfu3_ÍD$Phx^ft$Qf tV QfD$ Pt$ WQtV Qft$t$WQ(VQft$Rf^yhdfjW0Rf _ hxf0Qf_ ̃ SWt$,3|$|$|$|$|$ LRf؃u_3[ ÍD$PD$PD$,PD$,PD$,Phyft$HQftɋD$Vjj%PD$Pt$0ND$ jj%PD$ Pt$4'txD$ jj%PD$$Pt$8tU Qft$ t$ t$ t$ t$ SP$VQfyhdfjW0Rf hxf0Qft$5Rft$t$ փ ^_[ ̃ SWt$,3|$|$|$|$|$ LRf؃u_3[ ÍD$PD$PD$,PD$,PD$,Phxft$HQftɋD$Vjj%PD$Pt$0D$ jj%PD$ Pt$4לtxD$ jj%PD$$Pt$8贜tU Qft$ t$ t$ t$ t$ SP VQfyhdfjW0Rf hxf0Qft$5Rft$t$ փ ^_[ ̃Wt$$D$D$D$D$D$ D$LRfu3_ÍD$PD$PD$PD$Phyft$<QftV5dRfD$jjPt$ փt,jjD$Pt$$փtjjD$Pt$(փu^3_ Qft$ t$t$t$WQVQf5hRfy)t$t$t$hdfjW0Rf^_Ë=Qft$t$t$փ ^_̃ Wt$D$LRfu3_ ÍD$PD$Phxft$$QftًD$jj%PD$Pt$~tV Qft$t$WQVQft$Rf^yhdfjW0Rf _ hxf0Qf_ ̃Wt$LRfu3_ÍD$Ph\yft$Qf tV QfD$ Pt$ WQVQfyhdfjW0Rf ^_Ë=QfSjhft$Rf ؅tQf;uu PQf[^_ËG@TujQfVWTQfV,SWTQfS [^_̃SWt$$3|$|$|$|$ LRf؃u_3[ÍD$PD$PD$$PD$$Phxft$<Qft΋D$Vjj%PD$Pt$,臘ttD$ jj%PD$ Pt$0dtQ Qft$ t$t$t$SPVQfyhdfjW0Rf hxf0Qft$5Rft$փ^_[̃ Wt$D$D$ LRfu3_ ÍD$PD$Phxft$$QftV QfD$ Pt$ t$WQ VQf^yhdfjW0Rf _ ËL$uQf_Qf ËD$j%PQu _ QVt$ t$(RfzfF+g^Yzf%$RfVzf$RfD$t jVן^UjhJfdPd%QVjquEt)u(RfzfF+g^Md ]ËM3^d ]%LRfQVt$ t$o{fF,g^Y{fuV{fbD$t jV^UjhJfdPd%QVj聞uEt(uү{fF,g^Md ]ËM3^d ]̋D$̋D$ uPQfY̋D$tu D$%Qf%LRf̃,D$ PD$PD$PD$PD$$Ph{ft$LQfu3,ËD$;Qfu$D$L$QL$QPk tVt$4LRftBW QfD$$Pt$t$ t$t$t$0VQWQft$8_y3^,ÍD$ PRf^,̃0Wt$8D$D$ LRfu3_0ÍD$ PD$ PD$ Php|ft$LQftV5RfD$(Pt$ փu^_0ËD$ S;QfuG3 QfD$Pt$D$4SPWQVQfy0hdfjW0Rf [^_0Í\$QPփu[^_0Ë=Qfjhft$ Rf ؅tQf;uu PQf[^_0ËG@TujQfVWTQfVSWTQfS [^_0̃Wt$D$LRfu3_ÍD$Ph8|ft$(Qf tލD$Pt$RftV QfD$ PWQVQf^yhdfjW0Rf _áQf_̃Wt$LRfu3_ÍD$Ph{ft$Qf tV QfD$ Pt$ WQVQfyhdfjW0Rf ^_Ë=QfSjhft$Rf ؅tQf;uu PQf[^_ËG@TujQfVWTQfVSWTQfS [^_̃ Wt$D$D$ LRfu3_ ÍD$PD$Ph{ft$$QftV QfD$ Pt$ t$WQ VQf^yhdfjW0Rf _ ËL$uQf_Qf ËD$j%PQn _ QVt$ t$(Rf}fF-g^Y}f%$RfV}f$RfD$t jVט^UjhJfdPd%QVjquEt)u(Rf}fF-g^Md ]ËM3^d ]̋D$̋D$ uPQfY̋D$tu D$%QfVt$RfuF^WVt$t$dQf u VQf_^̃$PD$Phft$QfuË$VWPPfWt$ t$FWtRfWPf_^̃ D$Phft$Qf u3 Í$PjD$ Pt$dRftދ$@WPPfWt$ EuxQfhf0,Qf3_ ËD$VPWQfWPft$hRf^_ Ujh fh`GfdPd% SVWeh4fu QfuMd _^[]E84QfE+E3Ɂ8ËejhHfRf3EEMd _^[]̃QfWD$3D$|$PD$|$PD$ |$ PD$(|$ Ph\ft$<Qfu_ËD$Vjj%PD$Pt$,5t{D$jj%PD$Pt$$tX QfD$Pt$ t$t$t$0y3VQfyhdfjW0Rfjhft$ Rf t$ 5Rft$փ^_̃$D$ D$PD$ D$PD$ D$(PD$D$Phft$@WD$(fD$0D$,D$$Qfu3$jD$Phft$,RftVW QfD$PD$PD$$Pt$\L$QRVQfyhdfjW0Rf _^$t$jhft$Rf Phf0Qf _^$̃$PD$Phft$,Qft<$txQfh4f0,Qf3ËD$D$PD$ Rf̃$$Phdft$Qf uSVW5D$ QfD$Pt$V?QVQWQfyhdfjS0Rf _^[t$Qf_^[Q$$Phxft$Qf uYV Qft$QVQfQfQf^Ỹ QfSD$3ۍD$ D$PD$D$PD$PD$(PD$(PD$4Phft$HQf Qf9D$9D$SD$\$PhTft$(\$$,RfUVW Qfh4D$ Pt$t$$St$ SVhpeh ehet$TPtVPUQfyhdfjW0RfjhLft$(Rf؃ _^]T$t RQ[ áQfhf0,Qf3[ QS\$ VW|$D$ ?;?U-Qfj hܙfVՃ tF;rt$+\$]C_^[Y;<{<}j h}fVՃ uXF 3<0|<9 FI H<0}> FEƋ;L$u;s >}t F;r>}uFD${j h}fVՃ u=F 3ɉL$<0|f<9 FI H<0}L$> FEƋ-jh}fVՃ u'f}ff}fC> FEƋjh}fVՃ u > FEƋjh~fVՃ u+F<0|HD<9?FF<0}> FEƋjh~fVՃ u&F<0| <9FF<0}> FEƋUjh~fVՃ u|NVAЃ wAw7 AwWBЃ wʃ CBw7ʃ CBwWʈ Cjh~fVՃ u1;@>}F;rt$+\$]C_^[Yjh~fVՃ u.F;sj h(~fVՃ tF;r;F Cƀ8 pEG< t@< tPQR u't$ +މt$9\$ u6SWPf>t$VW؃tD$PWVt$\$t$$QfupQf#uQf-QfFPWQfT$t RQt WPf_^][̃QfD$D$PD$D$PD$D$Phd~ft$0D$QfuV5lRfD$WjjPt$$փtLjjD$Pt$փt6 QfD$Pt$t$t$ hpeheW.VQf|$t$5pRft$փlQft_3^ÅyhdfjW0Rf _^jhft$$Rf _^̃QfD$D$PD$D$PD$D$Ph~ft$0D$QfuV5dRfD$WjjPt$$փtLjjD$Pt$փt6 QfD$Pt$t$t$ hpehe'QVQf|$t$5hRft$փlQft_3^ÅyhdfjW0Rf _^jhft$$Rf _^́WD$D$PD$3Ph f$|$Qfu_ĐjD$ Ph ft$,RfSV QfD$ Pt$t$4VQfyhdfjS0Rf kt$ ltYO; QfuNw `Qft=D$ PD$ hfP D$(PQf0,Qfu WQf3^[L$tQPt$#_Đ̃WD$D$PD$3Phxft$(|$Qfu_jD$ Ph ft$,RfD$Pj&thdfjP0Rf _D$PPt$V_ tISV Qft$ t$3VQfyhdfjS0Rf Qf=Qf^[T$t RQt$"_UjhJfdPd% QfEEPEPh(fu Qft%u\Qfu%Qfhlf0,Qf3Md ]j覆EEtuus3jhfPERfM d ]̃ V5QfD$Phft$ D$փ u^ ËD$W|$ ;Qfu73 QfW#VQfy6hdfjW0Rf _^ ÍL$QL$QhfPփu_^ áQf_^ ̃$Phft$Qf uVW QfD$ Pt$ '%VQfyhdfjW0Rf _^Ë=QfSjh̲ft$Rf ؅tQf;uu PQf[_^ËG@TujQfVWTQfVSWTQftu SQf[_^̃(D$$D$PD$$D$PD$$D$$PD$$D$,PD$$D$Phft$HD$ Qfu3(jD$Phft$ RftݍD$Pt$ttjD$Pt$$s tjD$Pt$(r tVW QfD$ Pt$0t$ t$ t$ t$2VQfyYL$tQPD$tP4t$ tt$bsD$t PqhdfjW0Rf _^(Ë=QfSt$n؅uVQf;uu PQf:G@TujQfVWTQfVSWTQfS L$ [tQPD$tPet$h\fh gփh\fhfSh̲fh+gփh̲fh,fShlfhHgփhlfh<fShfh gփXhfhLfSh|fh'gփ1h|fh\fS{hfhpgփ hfhlfSThfh,gփhfhfS-hܲfhp)gփhܲfhfShLfhH*gփhLfhfShfh-gփurhfhfShfh!gփuOhfhfShfhehfQfu#hfhfSmhWfhgփt ^[3]WhWfhfS@hWfh4fS0hfhLfS hܳfh`fShfhhfSh fhfSHhfhfSh,fhԀfSh-u hf`,P`PfD/ggH/g=D/gt -t%D/g̡P/g;gu ,u hf,P`PfL/ggP/g=L/gt,t%L/g3̡`/g;gu ,u hf+P`Pf\/gg`/g=\/gt\,t%\/g̡X/g;gu .,u hDfP+P`PfT/ggX/g=T/gt+t%T/g̡h/g;gu +u h̟f*P`Pfd/ggh/g=d/gt+t%d/g̡x2g;gu n+u hf*P`Pft2ggx2g=t2gt<+t%t2g3̡0g;gu +u h̞f0*P`Pf0gg0g=0gt*t%0g@̡/g;gu *u hf)P`Pf/gg/g=/gt|*t%/g@̡/g;gu N*u hfp)P`Pf/gg/g=/gt*t%/g3̡/g;gu )u hlf)P`Pf/gg/g=/gt)t%/g3̡/g;gu )u hTf(P`Pf/gg/g=/gt\)t%/g3 ̡/g;gu .)u hfP(P`Pf/gg/g=/gt(t%/g3 ̡0g;gu (u hؤf'P`Pf/gg0g=/gt(t%/g3̡0g;gu n(u h,f'P`Pf0gg0g=0gt<(t%0g@̡0g;gu (u hpf0'P`Pf 0gg0g= 0gt't% 0g@̡/g;gu 'u h$f&P`Pf.gg/g=.gt|'t%.g@ ̡/g;gu N'u hdfp&P`Pf/gg/g=/gt't%/g@̡/g;gu &u hf&P`Pf /gg/g= /gt&t% /g@̡8/g;gu &u hf%P`Pf4/gg8/g=4/gt\&t%4/g@(̡1g;gu .&u h fP%P`Pf0gg1g=0gt%t%0g@ ̡1g;gu %u hPf$P`Pf1gg1g=1gt%t%1g@̡1g;gu n%u hf$P`Pf 1gg1g= 1gt<%t% 1g@̡1g;gu %u h̠f0$P`Pf1gg1g=1gt$t%1g@ ̡01g;gu $u hf#P`Pf,1gg01g=,1gt|$t%,1g3 ̡ 1g;gu N$u hfp#P`Pf1gg 1g=1gt$t%1g@̡(1g;gu #u hf#P`Pf$1gg(1g=$1gt#t%$1g@̡81g;gu #u hf"P`Pf41gg81g=41gt\#t%41g@̡H0g;gu .#u hfP"P`PfD0ggH0g=D0gt"t%D0g̡P0g;gu "u h@f!P`PfL0ggP0g=L0gt"t%L0g̡x0g;gu n"u h,f!P`Pft0ggx0g=t0gt<"t%t0g@ ̡0g;gu "u hLf0!P`Pf|0gg0g=|0gt!t%|0g@̡0g;gu !u h|f P`Pf0gg0g=0gt|!t%0g3̡0g;gu N!u hfp P`Pf0gg0g=0gt!t%0g3 ̡0g;gu u hf P`Pf0gg0g=0gt t%0g̡0g;gu u hfP`Pf0gg0g=0gt\ t%0g̡/g;gu . u hu hf`P`Pf1gg1g=1gt t%1g̡X1g;gu u hfP`PfT1ggX1g=T1gtt%T1g̡`1g;gu ~u hآfP`Pf\1gg`1g=\1gtLt%\1g̡h1g;gu u h f@P`Pfd1ggh1g=d1gtt%d1g̡1g;gu u hĤfP`Pf1gg1g=1gtt%1g̡p1g;gu ^u h,fP`Pfl1ggp1g=l1gt,t%l1g̡1g;gu u h8f P`Pf1gg1g=1gtt%1g@̡1g;gu u hfP`Pf1gg1g=1gtlt%1g@̡1g;gu >u hlf`P`Pf1gg1g=1gt t%1g@̡1g;gu u hfP`Pf1gg1g=1gtt%1g@ ̡1g;gu ~u hfP`Pf1gg1g=1gtLt%1g̡1g;gu u hf@P`Pf1gg1g=1gtt%1g@,̡1g;gu u hf P`Pf1gg1g=1gtt%1g@ ̡1g;gu ^u hLf P`Pf1gg1g=1gt,t%1g@̡2g;gu u hěf P`Pf1gg2g=1gt t%1g@̡0g;gu u hf P`Pf0gg0g=0gtl t%0g@̡0g;gu > u hlf` P`Pf0gg0g=0gt t%0g@ ̡0g;gu u hf P`Pf0gg0g=0gt t%0g@ ̡.g;gu ~ u hf P`Pf.gg.g=.gtL t%.g@ ̡.g;gu  u h u hhf` P`Pf/gg/g=/gt t%/g3̡/g;gu u hf P`Pf/gg/g=/gt t%/g@̡/g;gu ~ u hfP`Pf/gg/g=/gtL t%/g@ ̡/g;gu  u hDf@P`Pf/gg/g=/gtt%/g̡/g;gu u hfP`Pf/gg/g=/gtt%/g3̡(0g;gu ^u hfP`Pf$0gg(0g=$0gt&,tt$t$t$t$t$$0gff̡2g;gu u hfP`Pf2gg2g=2gtt%2g@̡h2g;gu ~u h0fP`Pfd2ggh2g=d2gtLt%d2g̡2g;gu u hf@P`Pf|2gg2g=|2gtt%|2g@̡2g;gu u h4fP`Pf2gg2g=2gtt%2g@̡2g;gu ^u hhfP`Pf2gg2g=2gt,t%2g@̡2g;gu u hf P`Pf2gg2g=2gtt%2g@ ̡2g;gu u hfP`Pf2gg2g=2gtlt%2g@̡2g;gu >u h,f`P`Pf2gg2g=2gt t%2g3̡2g;gu u h@fP`Pf2gg2g=2gtt%2g3̡2g;gu ~u hfP`Pf2gg2g=2gtLt%2g@$̡2g;gu u h f@P`Pf2gg2g=2gtt%2g@0̡2g;gu u hfP`Pf2gg2g=2gtt%2g@,̡2g;gu ^u hfP`Pf2gg2g=2gt,t%2g@ ̡2g;gu u hPf P`Pf2gg2g=2gtt%2g@ ̡2g;gu u hfP`Pf2gg2g=2gtlt%2g@ ̡2g;gu >u hf`P`Pf2gg2g=2gt t%2g@ ̡2g;gu u hfP`Pf2gg2g=2gtt%2g@$̡2g;gu ~u hfP`Pf2gg2g=2gtLt%2g@̡3g;gu u hVQfL$VQfL$Du VQfG;r^_][áQfh fS f fh ff fDf fff     f#ffQffff8f|flff     U4SVuW=Qf=HGjf$fFPQfbvQfOFZ$Qf/Ff~=LQfE=QfF$RfFPRfvXQfvtRfvRfFPRfvv Qf}=W-FCpf$Dfv׋|$8:39^/G F XPQfC;^r|$8v׋39^fF 4QfD C;^rv׋39^DF Z$QfD C;^rtv׋|$8^39^SG F $QfC;^r܋|$8!v׋|$8 39^G F $RfC;^r܋|$8v׋|$839^G F PRfC;^r|$8v׋r39^gF 4XQfD C;^rAv׋/39^$DF 4tRfD C;^rv׋|$839^G 3D$v'SUX nuQfmG[;>rD$][_^̃$|$4Vt$,t&;5QfuD$0^D$0$S(QfUVDQflQft ӡQfhf0,Qf3][^$ÍD$@D$@PD$PD$ D$Pt$DmP<D$Pt$DPW3;3҉|$T$$L$D$DWt$< \$HQftD$ PD$,PhзfVQf)D$D$D$D$Pt$,RfL$ A@TtCt$ `QfCljjD$PQRfCt$lPfD$,St$H EQD$0xdD$,@Pt$3Pft$Rfu VQfT$$GD$ T$$;L$sVWt$HQft!D$t$ QV t3ۅtu VQft$Gu_][^YQVt$ DQft$ulQft3^YSFPt$D$PO3ۅÅuhdfSP0Rf 3[^YUW33;>sVWt$HQft!D$t$ QVM t3ۅtu VQft$Gu_][^Y̋L$APAPQhft$QfSUl$VW3] ;}sDWt$HQft)KQSh`fVQfu VQfG_^]3[_^][t$t$t$t$苚p0PfVt$jPfL$ QjVPRp0Pf^%Pf%Pf%Pf%hPf%lPf%Qf%Qf%Qf%Qf%Qf%TQf%,Qf%Qf% Qf%Qf%XQf%Qf% Qf%$Qf%(Qf%0Qf%4Qf%8Qf%Ee+PQgYYt'x$|!EE3Ɂ8ËeE2 Ut}u 33g]U=,3gt} uuuYY]U$g33guȃul h3gTYY#E]U$g3 3gȃu]9uh 3gYY]UuYH]fUEVft j VYY^]U]UE t3t tt3@0uuY}PY] jhpfPjBYu34E]e= 3gtj  3gite hxCf1 $Cf> $SfhSfYYu)t h SfhRf YY 3g2ۈ]EDL >tVGYtu ju6V03g3@Ê]uYj hf>03g3OH03g"Ee= 3gtj% 3gEju]YY3Ʉ#u"Yj hf} u9=03g3et t]1]SWuuSWuuSWuwuu"uSPu_SVuSVu`tuHSWuout5SWu:$MQ0h!9fuu uËe3uEUV5fu3@uu u^] U]U} uuu u ] UaaEAf]UVuXf^]aaAffUVu%f^]aaAffUVFf `PEPw YY^]UEfaaA]AfPH YÍAfP7 YÍAfP& YUVFfP EYt j V}YY^]UVFfP EYt j VPYY^]UVFfP EYt j V#YY^]U MhfEP U Mh fEPj ̋Aufo U%43g(S3C gj me3 g3VW43g}S[wOW E؋MEineIE5ntel ȋEj5Genu XjYS[wOW uCE%?=t#=`t=pt=Pt=`t=pu=83g=83g=83g}EEEEE|2jX3S[]؉sKS EܩEEt =83g_^tm g43gtUtN3ЉEUEM3Ƀu3u/g43gE gt 43gg3[]3@39(gU$SVj tM)3hVP5<3g] |xffftfpflfhEEDž@jPEVPE E@EE,PfVXۍEEۉE4PfEP0Pfu !<3g^[]UDjDEjPd EP8PfEtEj X]3jt S׃;r_^[SVHfHf;sW>t (׃;r_^[Ë Rf3Cf; $gu(Uj4Pfu0Pfh XPfP\Pf]U$jtjY)P4g L4gH4gD4g5@4g=<4gfh4gf \4gf84gf44gf%04gf-,4g`4gET4gEX4gEd4g3gX4g\3gP3g T3g`3gjXkǀd3gjXk $gLjX gLhf]Uj]UjtM)P4g L4gH4gD4g5@4g=<4gfh4gf \4gf84gf44gf%04gf-,4g`4gET4gEX4gEd4gX4g\3gP3g T3g`3gjXkMd3ghf]U j0tM)P4g L4gH4gD4g5@4g=<4gfh4gf \4gf84gf44gf%04gf-,4g`4gET4gEX4gEd4gX4g\3gP3g T3g} v }ue } vE HE E @`3gjXkMd3geE@EE;E sEMU h3ghf]%`Pf%Pf%Pf%Pf%Pf% Pf%$Pf%(Pf%,Pf%0Pf%4Pf%8Pf%A~Iqp1”^hA IlA]$C9"D%y1PB +d7c0`.QSM%)fTy+:KH,* (N]Ko\E/?68@.\!RoÈ)pJ,$3Af1~NN_+!_uvdDS@̙! <Nsk+~-ۂg@ܟ\FcBA ZxdCK5M"ֹI腭3[sE&E~^ FI `eAPfyΖ-F9ŴfS@DneVoJpG$oGڸΩFDiF#ĎhhHuO0DMfofZNM8ۋ6ZMW`1GA]KwS_BPQ8K7^8gBJj@iunXNЉ2X〔J 1c2j9I@$jpvg# A$, 2́3xD7pp)چH{D{iD{3xZx~~IQZ#d)msAcc!~%piF+%HD5,)I%]6G{[FM5@B `VEn2!B'pH {Icq'A:>=FXF[OХIVJ8=xr%6*LFq;MҴmý4k~.Dd7%GA6X Jw.# bAƺSOs˃? ԄNJGRI[\)N +%'zOUDޞYsGHv>NfP)8bkPG;oAMSfl@Kg3\EnE{Gk6#L\2A:'O1 v/~c˻@,ǹFfONZ2li|]8@IOd-tj>]K4QeHM>@cyAZL˴h?&}IK\$nx'DC ܾ„+#M~HEEҽM FFFFF%FFFFFFFF F F F F FFF(F)FFFFFF F Fn E? F FF F FAAZk  FA F@ F FIUq9McX  FBD㩀N1z! [F0RP]0'O CI|ԌE*K.HFz5 Q!D0޷f nQXfHtö.V!NZ 8DMG@$ʟe[M*FFTLFYѶ,;Pgѐp9A M1с?7E ~{ /KU(z-^ EW^-9JCk^SzIx6 )O8HQN̄0Ll W@}K+3&PJzxoNTZ9z^JRrRL;B, R @ juwHh{L8veMcScS cS cS cS cScScScS`*0fAo)B 7ɐGM<>H=n%FߏP7(3;K,k_b!|D'üM[9[>0sx6M%+OOMAPINAMEIDArray must be a sequence of (iid, string/int) tuplesO|l:SNotRestriction tupleThe type of property ID is invalid - must be string/unicode or intcom/win32comext/mapi/src/mapiutil.cppk|ll:SExistRestriction tuplelkO:SPropertyRestriction tuplelkO:SContentRestriction tuplelk|lThe SRestriction object must be a sequence of length 2SRestriction must be a sequence of (integer, object)com/win32comext/mapi/src/mapiutil.cppcom/win32comext/mapi/src/mapiutil.cppUnsupported restriction type! Please fix in mapiutil.cpp!!!com/win32comext/mapi/src/mapiutil.cppNone is not a valid SRestriction in this contextllcom/win32comext/mapi/src/mapiutil.cppNone is not a valid SSortOrderSet in this contextO|llA SortOrder object must be tuple of (sequence, cCategories=0, cExpanded=0)The first object must be a sequenceAllocating SPropProblemArray resultkkicom/win32comext/mapi/src/mapiutil.cpplOOllA multi-valued SPropValue item must be a sequencec:\src\python-3.8\include\object.hkO:SPropValue itemAn SPropValue item must be a tuple of (integer, object)com/win32comext/mapi/src/mapiutil.cppcom/win32comext/mapi/src/mapiutil.cppcom/win32comext/mapi/src/mapiutil.cppcom/win32comext/mapi/src/mapiutil.cppcom/win32comext/mapi/src/mapiutil.cppcom/win32comext/mapi/src/mapiutil.cppcom/win32comext/mapi/src/mapiutil.cppcom/win32comext/mapi/src/mapiutil.cppcom/win32comext/mapi/src/mapiutil.cppPT_MV_BINARY elements must be stringscom/win32comext/mapi/src/mapiutil.cppcom/win32comext/mapi/src/mapiutil.cppcom/win32comext/mapi/src/mapiutil.cppUnsupported MAPI property type 0x%Xcom/win32comext/mapi/src/mapiutil.cppFile %s: Unsupported MAPI property type 0x%Xcom/win32comext/mapi/src/mapiutil.cppTuple(2) for PROP resultcom/win32comext/mapi/src/mapiutil.cppcom/win32comext/mapi/src/mapiutil.cppNone is not a valid SRowSet/ADRLIST in this contextADRLIST/SRowSet items must be a sequencecom/win32comext/mapi/src/mapiutil.cppcom/win32comext/mapi/src/mapiutil.cppAllocating SRow resultcom/win32comext/mapi/src/mapiutil.cppAllocating SRowSet resultcom/win32comext/mapi/src/mapiutil.cppSPropTagArray must be a sequence of integerscom/win32comext/mapi/src/mapiutil.cppcom/win32comext/mapi/src/mapiutil.cppSBinaryArray must be a sequence of stringsSBinary must be a stringcom/win32comext/mapi/src/mapiutil.cppcom/win32comext/mapi/src/mapiutil.cppSBinary must be a stringMAPINAMEID array list be a sequence of tuplesFCPf0 q6M%+њpIܾ<,FF"d+.[w0t?>ôJQW3F4f6M%+CPf0 lP]0|q*+ /CPf0 H F}P6^AL ePfxdJ9 E $2q0X J$\?lSFMfA#"@<ԕ~XFPOrK0H<FG(H&Fv6M%+Ft6M%+4᪽~ hlGF&;CtHLHihBF#FCPf0 [BrWLAiELWF^v7XYOK/e6M%+BlWox6M%+#F2FihUN~>kʇHFQF FPFXשFh FFFFF)FHF&F%F&F"F3Fk!Pi)?@FF:/ۆ/O0Fv nr Z'B>Mm8gh j;Yi+-z4j;Yi+-zFU 8r+C+n4FF=FacH&8Fvޮ xOF!F y.YDFF1F:/ۆ/OFCj?e~ҦFސy(_%FEFF2F:/ۆ/O4yOʙ^AiMm8gh +F FIF`k;Yi+-z4<OFFi;Yi+-z:/ۆ/OFF:/ۆ/OiM^eQI+Idʏ[FF4FGF F@FF F0:s *Dw=FFF0:s*Dw=z0Gd<O8m FFFǝv\WX$5I?#3:OF FFFFf8ff=f>fUnknown exceptionHfT=f>fbad allocationf=f>fbad array new lengthP3g3gp^_MTTp^_ p^_ \$gfRffff8f,g@fHg@f,ff8f`g@Tfdflf`g@Tfxgffff(fff8fxg@fg@fff(fff8fg@DfTf(fff8fg|fff(fff8fg@|fgfff(fff8fg@fg,f_register_onexit_function$_execute_onexit_table_crt_atexit_crt_at_quick_exit_cexit8_initterm9_initterm_ejterminateapi-ms-win-crt-string-l1-1-0.dllapi-ms-win-crt-heap-l1-1-0.dllapi-ms-win-crt-stdio-l1-1-0.dllapi-ms-win-crt-runtime-l1-1-0.dllTfeTf eTfpeUfeVfeVfeVfe^f(e^f *e^f0+e`f-e`f.e`f/e af0eaf2e,af3e3C3H3N3S3a3f3m3r3w3}33333333333344F444445)5M5W5h5555555:6^6h6x666666677E7J7R777778%868O8X8g8888888#9,9B9U9999:*:I:S:a::::::::;%;V;;;;;<<'<5<<>$>.>;>Z>f>o>{>>>>>>>>>&?[?a?j?????? \0P0Y00000000 11;1D11111111(242G2^22&3>3Y3h3r3w3~333333334 444#4<4F4K4S4\4t4444445*505555555555663696D6H6L6P6u66666%7+7V777777888899(9L9X9d9v9999999:*:D:N:\:v:::::::::: ;:;T;^;l;;;;;;;;;< <>%>G>n>w>>>>> ??#?@?Z?c?s????0H-070E0g0000011:1F1W1j1t1111111112J2}2222223%3L3333344-484S4_4h4444444445$5M5}55556'636<6E6O6^666666677"7c7l77778 828\8888888899'999999: ::/:T:^:|:::::$;;;Z;d;v;;;;;<<&<,D>Q>c>>>>>>>>7?A?X?????@00$0C0I0d0j0000000000/1T1i1r11111122?2f2{222222233,3N3h3333333334#414O4\4e4z444444 55*5k55555555>6D6M6b6h6q6}666667 7L7s77777777888&848D8h8r8888889#9C9O9X999999999":F:P:b:m::::::::::!;+;<;j;;;;;;;; <$<.<<=L=f=r={=========:>Y>c>q>>>>>> ?-?7?H???????P0 0*080M0Z0c0n000000011+1H1Y1b1q1|111111112(272@2M2z2222223 3#373G3z33333334+484A4Y44444444444&5[5a5j55556 66<6I6R6_6g6z66666666 7)737A7Z7g7p7}7777708M8S8k8t8888889P9Y99999::(:=:J:S:^:::::::;;B;f;p;;;;;;<1<;<`>>7>I>S>a>r>>>>>>>>>??'?/?=?????????` 000'0P0b0|000000 1Z1o1y11111111112-2G2U222223'3A3J3Y3333334 44:4J4g4q444444555*575E5U5y5555555 66 6-6J6i6s66666666677-7b77777777788%858R8\8m8888899%9:9B9~99999999:!:*:R:s:|::::;;\;;;;;;;;;<<*C>M>`>j>x>>>>>?!?+?=?H?h?t?}????????p0%0/0=0n0000001(111I1\1c1o1}11111122,2F2R2[2j2r2~2222223 3*383M3Z3c3n3333330494|44444455>5J5S5b5j5v555555 6.686F6i6s666666667%7/7@7777777 88"8+8:8F8r888888888 9$9.9<9V9b9k9z99999999:4:>:L:f:r:{:::::::::*;S;];s;;;;;;<<=$>->B>H>U>[>>>>>>9?c?m?????L 00S0\0r00000<1c1r111111111 2.282K2j2v222222223 33E3c3m333333333*4I4S4a44444445'585p555555566,6F6R6[6j6r6~666666767T7^77777788!8B8z88888889+989A9Y99999999&:`:i::::;*;T;^;;;;;;<>>>.>q>>>%?J?V?_?i?o?~??h0 00k0000001!1+1\1u11111111112"2+2:2B2N2\2l222223!3u3333333 4)434A4_4l4u444444445 565k5q5z555555&6`6i6666 77.7c7s777788&8I8S8s8888888899 9R9l9v99999999:::6:B:K:Z:b:n:|::::: ;);3;A;_;l;u;;;;;;;;< <6>4>9>A>Z>c>m>>>>>>>?4?d?n????`0 00#0x00000111+151>1D1m1w1111111 2,282A2U2}2222222233;3I3]33333333333354C444>5N5Y5v5556666.7H77777788/8A8888888949\9n9999999:: :0:::T:|:::::::;";7;@;P;Z;;;;;;;;<'<2O>v>>>>>>>>?(?2?E?^?j?s?????????H0e0w00001c1l1{111111^2h2222222223353?3P3333333 44!4)454G4W4t4~444444 5&5@5I5X5`5l5~55555566%616:6F6Q6Y6d6j66666666666667777'7,777<7N7S7^7c7u7z77777777777777788!8&888=8H8M8_8d8o8t888888888888889 99"9'92979E9J9U9Z9h9m9x9}999999999999999::::$:):4:9:D:I:T:Y:d:i:t:y::::::::::::::::: ;;;;*;/;:;?;M;R;j;;;;;;;;;;; <<&<6> >->=>J>Z>j>}>>>>>>>>??#?3?F?V?f?v????????? 00/0?0R0b0r000000000011&131C1P1]1j1z1111111111222,292F2Y2i2y2222222223"323B3R3e3u333333333 44.4>4N4^4q444444444555.5;5H5X5k5x5555555555666*676G6T6a6n6~666666666677#707=7J7]7m7}777777777788(858E8R8_8l8|888888888 99#969F9V9f9y999999999 ::N:T:]:d:k:::::;i;o;v;};;;>>1>7>G>S>X>]>b>h>z>>>>>>>>>>>>????"?(?:?Q?W?g?s?x?}?????????????00'03080=0B0H0Z0q0w000000000000001111171G1S1X1]1b1h1z1111111111112222"2(2:2Q2W2g2s2x2}222222222222233'33383=3B3H3Z3a3g3w333333333333333 4!4'474C4H4M4R4X4j444444444444455 555*5A5G5W5c5h5m5r5x55555555555666#6(6-62686J6Q6W6g6s6x6}666666666666677'73787=7B7H7Z7q7w777777777777778881878G8S8X8]8b8h8z8888888888889999"9(9:9Q9W9g9s9x9}9999999999999::':3:8:=:B:H:Z:q:w::::::::::::::;;;1;7;G;S;X;];b;h;z;;;;;;;;;;;;<<<<"<(<:>>1>7>G>S>X>]>b>h>z>>>>>>>>>>>>????"?(?:?Q?W?g?s?x?}?????????????00'03080=0B0H0Z0q0w000000000000001111171G1S1X1]1b1h1z1111111111112222"2(2:2Q2W2g2s2x2}222222222222233'33383=3B3H3Z3q3w333333333333334441474G4S4X4]4b4h4z4444444444445555"5(5:5Q5W5g5s5x5}555555555555566'63686=6B6H6Z6q6w666666666666667771777G7S7X7]7b7h7z7777777777778888"8(8:8Q8W8g8s8x8}888888888888899'93989=9B9H9Z9q9w99999999999999::*:2:8:A:G:W:c:h:m:r:x::::::::::::::;;;';3;8;=;B;H;j;r;x;;;;;;;;;;;;;;<<<<"<(<:>>1>7>G>S>X>]>b>h>z>>>>>>>>>>>>>?? ???*?A?G?W?c?h?m?r?x???????????000#0(0-02080J0a0g0w000000000000000 1!1'171C1H1M1R1X1j111111111111122 222*2A2G2W2c2h2m2r2x22222222222333#3(3-32383J3a3g3w333333333333333 4!4'474C4H4M4R4X4j444444444444455 555*5A5G5W5c5h5m5r5x55555555555666#6(6-62686J6a6g6w666666666666666 7!7'777C7H7M7R7X7j777777777777788 888*8A8G8W8c8h8m8r8x88888888888999#9(9-92989J9a9g9w999999999999999 :!:':7:C:H:M:R:X:j:::::::::::::;; ;;;>;F;L;a;g;w;;;;;;;;;;;;;;; >>#>(>->2>8>J>a>g>w>>>>>>>>>>>>>>> ?!?'?7?C?H?M?R?X?j?????????????00 000*0A0G0W0c0h0m0r0x00000000000111#1(1-12181J1a1g1w111111111111111 2!2'272C2H2M2R2X2j22222222333313<3I3Q3k3w33334L4c4k4v4|44445>5_5l5q5~55555616;6^66666767a7777788`888899%929=9J9U9b9m9z999999999999 :: :$:(:,:0:4:8:<:@:D:H:L:}:::::;/;8;d;;;;;;;;;< < <-8>[>n>>>>>>>?'?D?Q?????  0q00011:111102N2_2222i33334444445?5K5555^6|6667!797U7]7b7j77777777777777777<8@8D8H8L8P8T8X8\8`8d88888929N9U9m9999999::O:::3;;;H>L>P>T>X>\>`>d>h>l>>>>?>???? \ 000f00000012171?1Y1_1p1u1}1111 2T222222y3333333333 44&4F4O4444455g555555 66,6T6n6666666617X7b7m7x7}77;8W8^888889#929u9z9999999999:M:U:i:q:~::::::::; ;-;3;a;y;;;;;;<<< >>>>> >$>(>J>T>>>>>>>?#?\?l?????0 0030o000001?1t1~11111292U2`2f2l2r2x2~222222222222222222222233333 3&3,32383>3D3J3P3V3\3b3h3n3t3z333333333333333333333334 4444"4(4.444:4@4F4L4R4X4^4d4j4p4v4|44444444444455.5566#767I7U7e7v777777788E8l8t8888888w9999999 :::l::::::;;;>,>:>U>`>>>>@?O?V???????@00000 1)1j1p11111;2@2]2x222222223 333%3H3P3U3{333333333 4444!4'4.454<4C4J4Q4X4`4h4p4|4444444444555"5(5.555<5C5J5Q5X5_5g5o5w555555555555556 666!6(6/676?6G6R6W6]6g6666666666677777 7&7,72787>7D7J7P7V7\7b7h7n7t7z777777777777777777777778 888@8`888889 9@9`99999: :@:`:::::;;;!;';1;7;A;G;Q;W;a;g;q;w;;;;;;;;;;;;;;;;;<<<>>>>>>>????????px@2D2H2L2P2T2X2\2P5T5X5\5`5d5h5l5`6d6h6l6p6t6x6|688888888:::::::;;;;;;;;;========P999999::: ::::: :$:(:,:0:4:8:<:@:D:H:L:P:T:X:\:`:d:h:l:p:T444444444445555555555566(6,60686P6`6d6l666666666666666 77777 7(7@7P7T7X7\7`7t7x7777777777777777778$8(888<8@8D8H8P8h8x8|888888888888889 99909@9D9T9X9\9`9d9l99999999999999 ::::: :$:,:D:T:X:h:l:|::::::::::::::::;;;(;,;0;4;8;@;X;h;l;|;;;;;;;;;;;;;;;;;; << <0<4<8<<<@ >$>(>,>0>4>8><>@>H>`>d>|>>>>>>>>>>>>> ?? ?$?,?D?H?`?d?|?????????????000 00000 0(0@0D0\0`0x0000000000000 11 1$1,1D1T1X1h1l1p1x1111111111T5`55555556606<6\6h6666666 7787D7d7p77777778 8@8L8l8x88888889$9(949d9h9999999999:::$:,:4:8:<:D:X:L0000 0$0@0D0`0d0p0t00000000000001111 1$10141@1D1P1T1p1t1111111111111111122220242@2D2P2T2`2d2p2t2222222222222222233 3$30343@3D3`3d3p3t333333333333333334444 4$40444@4D4P4T4`4d4444444444444444455 5$50545@5D5P5T5`5d5p5t55555555555556666 6$60646@6D6`6d6p6t6666666666666667777 7$70747@7D7`7d7p7t777777777777777778888 8$80848@8D8P8T8`8d8p8t888888888888,9H9`9x99999:,:H:`::::::;4;P;l;;;;;<(>16 def PROP_TAG(ulPropType,ulPropID): return (ulPropID<<16)|(ulPropType) PROP_ID_NULL = 0 PROP_ID_INVALID = 65535 PR_NULL = PROP_TAG( PT_NULL, PROP_ID_NULL) PR_ACKNOWLEDGEMENT_MODE = PROP_TAG( PT_LONG, 1) PR_ACKNOWLEDGEMENT_MODE = PROP_TAG( PT_LONG, 1) PR_ALTERNATE_RECIPIENT_ALLOWED = PROP_TAG( PT_BOOLEAN, 2) PR_AUTHORIZING_USERS = PROP_TAG( PT_BINARY, 3) PR_AUTO_FORWARD_COMMENT = PROP_TAG( PT_TSTRING, 4) PR_AUTO_FORWARD_COMMENT_W = PROP_TAG( PT_UNICODE, 4) PR_AUTO_FORWARD_COMMENT_W = PROP_TAG( PT_UNICODE, 4) PR_AUTO_FORWARD_COMMENT_A = PROP_TAG( PT_STRING8, 4) PR_AUTO_FORWARDED = PROP_TAG( PT_BOOLEAN, 5) PR_CONTENT_CONFIDENTIALITY_ALGORITHM_ID = PROP_TAG( PT_BINARY, 6) PR_CONTENT_CORRELATOR = PROP_TAG( PT_BINARY, 7) PR_CONTENT_IDENTIFIER = PROP_TAG( PT_TSTRING, 8) PR_CONTENT_IDENTIFIER_W = PROP_TAG( PT_UNICODE, 8) PR_CONTENT_IDENTIFIER_A = PROP_TAG( PT_STRING8, 8) PR_CONTENT_LENGTH = PROP_TAG( PT_LONG, 9) PR_CONTENT_RETURN_REQUESTED = PROP_TAG( PT_BOOLEAN, 10) PR_CONVERSATION_KEY = PROP_TAG( PT_BINARY, 11) PR_CONVERSION_EITS = PROP_TAG( PT_BINARY, 12) PR_CONVERSION_WITH_LOSS_PROHIBITED = PROP_TAG( PT_BOOLEAN, 13) PR_CONVERTED_EITS = PROP_TAG( PT_BINARY, 14) PR_DEFERRED_DELIVERY_TIME = PROP_TAG( PT_SYSTIME, 15) PR_DELIVER_TIME = PROP_TAG( PT_SYSTIME, 16) PR_DISCARD_REASON = PROP_TAG( PT_LONG, 17) PR_DISCLOSURE_OF_RECIPIENTS = PROP_TAG( PT_BOOLEAN, 18) PR_DL_EXPANSION_HISTORY = PROP_TAG( PT_BINARY, 19) PR_DL_EXPANSION_PROHIBITED = PROP_TAG( PT_BOOLEAN, 20) PR_EXPIRY_TIME = PROP_TAG( PT_SYSTIME, 21) PR_IMPLICIT_CONVERSION_PROHIBITED = PROP_TAG( PT_BOOLEAN, 22) PR_IMPORTANCE = PROP_TAG( PT_LONG, 23) PR_IPM_ID = PROP_TAG( PT_BINARY, 24) PR_LATEST_DELIVERY_TIME = PROP_TAG( PT_SYSTIME, 25) PR_MESSAGE_CLASS = PROP_TAG( PT_TSTRING, 26) PR_MESSAGE_CLASS_W = PROP_TAG( PT_UNICODE, 26) PR_MESSAGE_CLASS_A = PROP_TAG( PT_STRING8, 26) PR_MESSAGE_DELIVERY_ID = PROP_TAG( PT_BINARY, 27) PR_MESSAGE_SECURITY_LABEL = PROP_TAG( PT_BINARY, 30) PR_OBSOLETED_IPMS = PROP_TAG( PT_BINARY, 31) PR_ORIGINALLY_INTENDED_RECIPIENT_NAME = PROP_TAG( PT_BINARY, 32) PR_ORIGINAL_EITS = PROP_TAG( PT_BINARY, 33) PR_ORIGINATOR_CERTIFICATE = PROP_TAG( PT_BINARY, 34) PR_ORIGINATOR_DELIVERY_REPORT_REQUESTED = PROP_TAG( PT_BOOLEAN, 35) PR_ORIGINATOR_RETURN_ADDRESS = PROP_TAG( PT_BINARY, 36) PR_PARENT_KEY = PROP_TAG( PT_BINARY, 37) PR_PRIORITY = PROP_TAG( PT_LONG, 38) PR_ORIGIN_CHECK = PROP_TAG( PT_BINARY, 39) PR_PROOF_OF_SUBMISSION_REQUESTED = PROP_TAG( PT_BOOLEAN, 40) PR_READ_RECEIPT_REQUESTED = PROP_TAG( PT_BOOLEAN, 41) PR_RECEIPT_TIME = PROP_TAG( PT_SYSTIME, 42) PR_RECIPIENT_REASSIGNMENT_PROHIBITED = PROP_TAG( PT_BOOLEAN, 43) PR_REDIRECTION_HISTORY = PROP_TAG( PT_BINARY, 44) PR_RELATED_IPMS = PROP_TAG( PT_BINARY, 45) PR_ORIGINAL_SENSITIVITY = PROP_TAG( PT_LONG, 46) PR_LANGUAGES = PROP_TAG( PT_TSTRING, 47) PR_LANGUAGES_W = PROP_TAG( PT_UNICODE, 47) PR_LANGUAGES_A = PROP_TAG( PT_STRING8, 47) PR_REPLY_TIME = PROP_TAG( PT_SYSTIME, 48) PR_REPORT_TAG = PROP_TAG( PT_BINARY, 49) PR_REPORT_TIME = PROP_TAG( PT_SYSTIME, 50) PR_RETURNED_IPM = PROP_TAG( PT_BOOLEAN, 51) PR_SECURITY = PROP_TAG( PT_LONG, 52) PR_INCOMPLETE_COPY = PROP_TAG( PT_BOOLEAN, 53) PR_SENSITIVITY = PROP_TAG( PT_LONG, 54) PR_SUBJECT = PROP_TAG( PT_TSTRING, 55) PR_SUBJECT_W = PROP_TAG( PT_UNICODE, 55) PR_SUBJECT_A = PROP_TAG( PT_STRING8, 55) PR_SUBJECT_IPM = PROP_TAG( PT_BINARY, 56) PR_CLIENT_SUBMIT_TIME = PROP_TAG( PT_SYSTIME, 57) PR_REPORT_NAME = PROP_TAG( PT_TSTRING, 58) PR_REPORT_NAME_W = PROP_TAG( PT_UNICODE, 58) PR_REPORT_NAME_A = PROP_TAG( PT_STRING8, 58) PR_SENT_REPRESENTING_SEARCH_KEY = PROP_TAG( PT_BINARY, 59) PR_X400_CONTENT_TYPE = PROP_TAG( PT_BINARY, 60) PR_SUBJECT_PREFIX = PROP_TAG( PT_TSTRING, 61) PR_SUBJECT_PREFIX_W = PROP_TAG( PT_UNICODE, 61) PR_SUBJECT_PREFIX_A = PROP_TAG( PT_STRING8, 61) PR_NON_RECEIPT_REASON = PROP_TAG( PT_LONG, 62) PR_RECEIVED_BY_ENTRYID = PROP_TAG( PT_BINARY, 63) PR_RECEIVED_BY_NAME = PROP_TAG( PT_TSTRING, 64) PR_RECEIVED_BY_NAME_W = PROP_TAG( PT_UNICODE, 64) PR_RECEIVED_BY_NAME_A = PROP_TAG( PT_STRING8, 64) PR_SENT_REPRESENTING_ENTRYID = PROP_TAG( PT_BINARY, 65) PR_SENT_REPRESENTING_NAME = PROP_TAG( PT_TSTRING, 66) PR_SENT_REPRESENTING_NAME_W = PROP_TAG( PT_UNICODE, 66) PR_SENT_REPRESENTING_NAME_A = PROP_TAG( PT_STRING8, 66) PR_RCVD_REPRESENTING_ENTRYID = PROP_TAG( PT_BINARY, 67) PR_RCVD_REPRESENTING_NAME = PROP_TAG( PT_TSTRING, 68) PR_RCVD_REPRESENTING_NAME_W = PROP_TAG( PT_UNICODE, 68) PR_RCVD_REPRESENTING_NAME_A = PROP_TAG( PT_STRING8, 68) PR_REPORT_ENTRYID = PROP_TAG( PT_BINARY, 69) PR_READ_RECEIPT_ENTRYID = PROP_TAG( PT_BINARY, 70) PR_MESSAGE_SUBMISSION_ID = PROP_TAG( PT_BINARY, 71) PR_PROVIDER_SUBMIT_TIME = PROP_TAG( PT_SYSTIME, 72) PR_ORIGINAL_SUBJECT = PROP_TAG( PT_TSTRING, 73) PR_ORIGINAL_SUBJECT_W = PROP_TAG( PT_UNICODE, 73) PR_ORIGINAL_SUBJECT_A = PROP_TAG( PT_STRING8, 73) PR_DISC_VAL = PROP_TAG( PT_BOOLEAN, 74) PR_ORIG_MESSAGE_CLASS = PROP_TAG( PT_TSTRING, 75) PR_ORIG_MESSAGE_CLASS_W = PROP_TAG( PT_UNICODE, 75) PR_ORIG_MESSAGE_CLASS_A = PROP_TAG( PT_STRING8, 75) PR_ORIGINAL_AUTHOR_ENTRYID = PROP_TAG( PT_BINARY, 76) PR_ORIGINAL_AUTHOR_NAME = PROP_TAG( PT_TSTRING, 77) PR_ORIGINAL_AUTHOR_NAME_W = PROP_TAG( PT_UNICODE, 77) PR_ORIGINAL_AUTHOR_NAME_A = PROP_TAG( PT_STRING8, 77) PR_ORIGINAL_SUBMIT_TIME = PROP_TAG( PT_SYSTIME, 78) PR_REPLY_RECIPIENT_ENTRIES = PROP_TAG( PT_BINARY, 79) PR_REPLY_RECIPIENT_NAMES = PROP_TAG( PT_TSTRING, 80) PR_REPLY_RECIPIENT_NAMES_W = PROP_TAG( PT_UNICODE, 80) PR_REPLY_RECIPIENT_NAMES_A = PROP_TAG( PT_STRING8, 80) PR_RECEIVED_BY_SEARCH_KEY = PROP_TAG( PT_BINARY, 81) PR_RCVD_REPRESENTING_SEARCH_KEY = PROP_TAG( PT_BINARY, 82) PR_READ_RECEIPT_SEARCH_KEY = PROP_TAG( PT_BINARY, 83) PR_REPORT_SEARCH_KEY = PROP_TAG( PT_BINARY, 84) PR_ORIGINAL_DELIVERY_TIME = PROP_TAG( PT_SYSTIME, 85) PR_ORIGINAL_AUTHOR_SEARCH_KEY = PROP_TAG( PT_BINARY, 86) PR_MESSAGE_TO_ME = PROP_TAG( PT_BOOLEAN, 87) PR_MESSAGE_CC_ME = PROP_TAG( PT_BOOLEAN, 88) PR_MESSAGE_RECIP_ME = PROP_TAG( PT_BOOLEAN, 89) PR_ORIGINAL_SENDER_NAME = PROP_TAG( PT_TSTRING, 90) PR_ORIGINAL_SENDER_NAME_W = PROP_TAG( PT_UNICODE, 90) PR_ORIGINAL_SENDER_NAME_A = PROP_TAG( PT_STRING8, 90) PR_ORIGINAL_SENDER_ENTRYID = PROP_TAG( PT_BINARY, 91) PR_ORIGINAL_SENDER_SEARCH_KEY = PROP_TAG( PT_BINARY, 92) PR_ORIGINAL_SENT_REPRESENTING_NAME = PROP_TAG( PT_TSTRING, 93) PR_ORIGINAL_SENT_REPRESENTING_NAME_W = PROP_TAG( PT_UNICODE, 93) PR_ORIGINAL_SENT_REPRESENTING_NAME_A = PROP_TAG( PT_STRING8, 93) PR_ORIGINAL_SENT_REPRESENTING_ENTRYID = PROP_TAG( PT_BINARY, 94) PR_ORIGINAL_SENT_REPRESENTING_SEARCH_KEY = PROP_TAG( PT_BINARY, 95) PR_START_DATE = PROP_TAG( PT_SYSTIME, 96) PR_END_DATE = PROP_TAG( PT_SYSTIME, 97) PR_OWNER_APPT_ID = PROP_TAG( PT_LONG, 98) PR_RESPONSE_REQUESTED = PROP_TAG( PT_BOOLEAN, 99) PR_SENT_REPRESENTING_ADDRTYPE = PROP_TAG( PT_TSTRING, 100) PR_SENT_REPRESENTING_ADDRTYPE_W = PROP_TAG( PT_UNICODE, 100) PR_SENT_REPRESENTING_ADDRTYPE_A = PROP_TAG( PT_STRING8, 100) PR_SENT_REPRESENTING_EMAIL_ADDRESS = PROP_TAG( PT_TSTRING, 101) PR_SENT_REPRESENTING_EMAIL_ADDRESS_W = PROP_TAG( PT_UNICODE, 101) PR_SENT_REPRESENTING_EMAIL_ADDRESS_A = PROP_TAG( PT_STRING8, 101) PR_ORIGINAL_SENDER_ADDRTYPE = PROP_TAG( PT_TSTRING, 102) PR_ORIGINAL_SENDER_ADDRTYPE_W = PROP_TAG( PT_UNICODE, 102) PR_ORIGINAL_SENDER_ADDRTYPE_A = PROP_TAG( PT_STRING8, 102) PR_ORIGINAL_SENDER_EMAIL_ADDRESS = PROP_TAG( PT_TSTRING, 103) PR_ORIGINAL_SENDER_EMAIL_ADDRESS_W = PROP_TAG( PT_UNICODE, 103) PR_ORIGINAL_SENDER_EMAIL_ADDRESS_A = PROP_TAG( PT_STRING8, 103) PR_ORIGINAL_SENT_REPRESENTING_ADDRTYPE = PROP_TAG( PT_TSTRING, 104) PR_ORIGINAL_SENT_REPRESENTING_ADDRTYPE_W = PROP_TAG( PT_UNICODE, 104) PR_ORIGINAL_SENT_REPRESENTING_ADDRTYPE_A = PROP_TAG( PT_STRING8, 104) PR_ORIGINAL_SENT_REPRESENTING_EMAIL_ADDRESS = PROP_TAG( PT_TSTRING, 105) PR_ORIGINAL_SENT_REPRESENTING_EMAIL_ADDRESS_W = PROP_TAG( PT_UNICODE, 105) PR_ORIGINAL_SENT_REPRESENTING_EMAIL_ADDRESS_A = PROP_TAG( PT_STRING8, 105) PR_CONVERSATION_TOPIC = PROP_TAG( PT_TSTRING, 112) PR_CONVERSATION_TOPIC_W = PROP_TAG( PT_UNICODE, 112) PR_CONVERSATION_TOPIC_A = PROP_TAG( PT_STRING8, 112) PR_CONVERSATION_INDEX = PROP_TAG( PT_BINARY, 113) PR_ORIGINAL_DISPLAY_BCC = PROP_TAG( PT_TSTRING, 114) PR_ORIGINAL_DISPLAY_BCC_W = PROP_TAG( PT_UNICODE, 114) PR_ORIGINAL_DISPLAY_BCC_A = PROP_TAG( PT_STRING8, 114) PR_ORIGINAL_DISPLAY_CC = PROP_TAG( PT_TSTRING, 115) PR_ORIGINAL_DISPLAY_CC_W = PROP_TAG( PT_UNICODE, 115) PR_ORIGINAL_DISPLAY_CC_A = PROP_TAG( PT_STRING8, 115) PR_ORIGINAL_DISPLAY_TO = PROP_TAG( PT_TSTRING, 116) PR_ORIGINAL_DISPLAY_TO_W = PROP_TAG( PT_UNICODE, 116) PR_ORIGINAL_DISPLAY_TO_A = PROP_TAG( PT_STRING8, 116) PR_RECEIVED_BY_ADDRTYPE = PROP_TAG( PT_TSTRING, 117) PR_RECEIVED_BY_ADDRTYPE_W = PROP_TAG( PT_UNICODE, 117) PR_RECEIVED_BY_ADDRTYPE_A = PROP_TAG( PT_STRING8, 117) PR_RECEIVED_BY_EMAIL_ADDRESS = PROP_TAG( PT_TSTRING, 118) PR_RECEIVED_BY_EMAIL_ADDRESS_W = PROP_TAG( PT_UNICODE, 118) PR_RECEIVED_BY_EMAIL_ADDRESS_A = PROP_TAG( PT_STRING8, 118) PR_RCVD_REPRESENTING_ADDRTYPE = PROP_TAG( PT_TSTRING, 119) PR_RCVD_REPRESENTING_ADDRTYPE_W = PROP_TAG( PT_UNICODE, 119) PR_RCVD_REPRESENTING_ADDRTYPE_A = PROP_TAG( PT_STRING8, 119) PR_RCVD_REPRESENTING_EMAIL_ADDRESS = PROP_TAG( PT_TSTRING, 120) PR_RCVD_REPRESENTING_EMAIL_ADDRESS_W = PROP_TAG( PT_UNICODE, 120) PR_RCVD_REPRESENTING_EMAIL_ADDRESS_A = PROP_TAG( PT_STRING8, 120) PR_ORIGINAL_AUTHOR_ADDRTYPE = PROP_TAG( PT_TSTRING, 121) PR_ORIGINAL_AUTHOR_ADDRTYPE_W = PROP_TAG( PT_UNICODE, 121) PR_ORIGINAL_AUTHOR_ADDRTYPE_A = PROP_TAG( PT_STRING8, 121) PR_ORIGINAL_AUTHOR_EMAIL_ADDRESS = PROP_TAG( PT_TSTRING, 122) PR_ORIGINAL_AUTHOR_EMAIL_ADDRESS_W = PROP_TAG( PT_UNICODE, 122) PR_ORIGINAL_AUTHOR_EMAIL_ADDRESS_A = PROP_TAG( PT_STRING8, 122) PR_ORIGINALLY_INTENDED_RECIP_ADDRTYPE = PROP_TAG( PT_TSTRING, 123) PR_ORIGINALLY_INTENDED_RECIP_ADDRTYPE_W = PROP_TAG( PT_UNICODE, 123) PR_ORIGINALLY_INTENDED_RECIP_ADDRTYPE_A = PROP_TAG( PT_STRING8, 123) PR_ORIGINALLY_INTENDED_RECIP_EMAIL_ADDRESS = PROP_TAG( PT_TSTRING, 124) PR_ORIGINALLY_INTENDED_RECIP_EMAIL_ADDRESS_W = PROP_TAG( PT_UNICODE, 124) PR_ORIGINALLY_INTENDED_RECIP_EMAIL_ADDRESS_A = PROP_TAG( PT_STRING8, 124) PR_TRANSPORT_MESSAGE_HEADERS = PROP_TAG(PT_TSTRING, 125) PR_TRANSPORT_MESSAGE_HEADERS_W = PROP_TAG(PT_UNICODE, 125) PR_TRANSPORT_MESSAGE_HEADERS_A = PROP_TAG(PT_STRING8, 125) PR_DELEGATION = PROP_TAG(PT_BINARY, 126) PR_TNEF_CORRELATION_KEY = PROP_TAG(PT_BINARY, 127) PR_BODY = PROP_TAG( PT_TSTRING, 4096) PR_BODY_W = PROP_TAG( PT_UNICODE, 4096) PR_BODY_A = PROP_TAG( PT_STRING8, 4096) PR_BODY_HTML = PROP_TAG( PT_TSTRING, 4115) PR_BODY_HTML_W = PROP_TAG( PT_UNICODE, 4115) PR_BODY_HTML_A = PROP_TAG( PT_STRING8, 4115) PR_REPORT_TEXT = PROP_TAG( PT_TSTRING, 4097) PR_REPORT_TEXT_W = PROP_TAG( PT_UNICODE, 4097) PR_REPORT_TEXT_A = PROP_TAG( PT_STRING8, 4097) PR_ORIGINATOR_AND_DL_EXPANSION_HISTORY = PROP_TAG( PT_BINARY, 4098) PR_REPORTING_DL_NAME = PROP_TAG( PT_BINARY, 4099) PR_REPORTING_MTA_CERTIFICATE = PROP_TAG( PT_BINARY, 4100) PR_RTF_SYNC_BODY_CRC = PROP_TAG( PT_LONG, 4102) PR_RTF_SYNC_BODY_COUNT = PROP_TAG( PT_LONG, 4103) PR_RTF_SYNC_BODY_TAG = PROP_TAG( PT_TSTRING, 4104) PR_RTF_SYNC_BODY_TAG_W = PROP_TAG( PT_UNICODE, 4104) PR_RTF_SYNC_BODY_TAG_A = PROP_TAG( PT_STRING8, 4104) PR_RTF_COMPRESSED = PROP_TAG( PT_BINARY, 4105) PR_RTF_SYNC_PREFIX_COUNT = PROP_TAG( PT_LONG, 4112) PR_RTF_SYNC_TRAILING_COUNT = PROP_TAG( PT_LONG, 4113) PR_ORIGINALLY_INTENDED_RECIP_ENTRYID = PROP_TAG( PT_BINARY, 4114) PR_CONTENT_INTEGRITY_CHECK = PROP_TAG( PT_BINARY, 3072) PR_EXPLICIT_CONVERSION = PROP_TAG( PT_LONG, 3073) PR_IPM_RETURN_REQUESTED = PROP_TAG( PT_BOOLEAN, 3074) PR_MESSAGE_TOKEN = PROP_TAG( PT_BINARY, 3075) PR_NDR_REASON_CODE = PROP_TAG( PT_LONG, 3076) PR_NDR_DIAG_CODE = PROP_TAG( PT_LONG, 3077) PR_NON_RECEIPT_NOTIFICATION_REQUESTED = PROP_TAG( PT_BOOLEAN, 3078) PR_DELIVERY_POINT = PROP_TAG( PT_LONG, 3079) PR_ORIGINATOR_NON_DELIVERY_REPORT_REQUESTED = PROP_TAG( PT_BOOLEAN, 3080) PR_ORIGINATOR_REQUESTED_ALTERNATE_RECIPIENT = PROP_TAG( PT_BINARY, 3081) PR_PHYSICAL_DELIVERY_BUREAU_FAX_DELIVERY = PROP_TAG( PT_BOOLEAN, 3082) PR_PHYSICAL_DELIVERY_MODE = PROP_TAG( PT_LONG, 3083) PR_PHYSICAL_DELIVERY_REPORT_REQUEST = PROP_TAG( PT_LONG, 3084) PR_PHYSICAL_FORWARDING_ADDRESS = PROP_TAG( PT_BINARY, 3085) PR_PHYSICAL_FORWARDING_ADDRESS_REQUESTED = PROP_TAG( PT_BOOLEAN, 3086) PR_PHYSICAL_FORWARDING_PROHIBITED = PROP_TAG( PT_BOOLEAN, 3087) PR_PHYSICAL_RENDITION_ATTRIBUTES = PROP_TAG( PT_BINARY, 3088) PR_PROOF_OF_DELIVERY = PROP_TAG( PT_BINARY, 3089) PR_PROOF_OF_DELIVERY_REQUESTED = PROP_TAG( PT_BOOLEAN, 3090) PR_RECIPIENT_CERTIFICATE = PROP_TAG( PT_BINARY, 3091) PR_RECIPIENT_NUMBER_FOR_ADVICE = PROP_TAG( PT_TSTRING, 3092) PR_RECIPIENT_NUMBER_FOR_ADVICE_W = PROP_TAG( PT_UNICODE, 3092) PR_RECIPIENT_NUMBER_FOR_ADVICE_A = PROP_TAG( PT_STRING8, 3092) PR_RECIPIENT_TYPE = PROP_TAG( PT_LONG, 3093) PR_REGISTERED_MAIL_TYPE = PROP_TAG( PT_LONG, 3094) PR_REPLY_REQUESTED = PROP_TAG( PT_BOOLEAN, 3095) PR_REQUESTED_DELIVERY_METHOD = PROP_TAG( PT_LONG, 3096) PR_SENDER_ENTRYID = PROP_TAG( PT_BINARY, 3097) PR_SENDER_NAME = PROP_TAG( PT_TSTRING, 3098) PR_SENDER_NAME_W = PROP_TAG( PT_UNICODE, 3098) PR_SENDER_NAME_A = PROP_TAG( PT_STRING8, 3098) PR_SUPPLEMENTARY_INFO = PROP_TAG( PT_TSTRING, 3099) PR_SUPPLEMENTARY_INFO_W = PROP_TAG( PT_UNICODE, 3099) PR_SUPPLEMENTARY_INFO_A = PROP_TAG( PT_STRING8, 3099) PR_TYPE_OF_MTS_USER = PROP_TAG( PT_LONG, 3100) PR_SENDER_SEARCH_KEY = PROP_TAG( PT_BINARY, 3101) PR_SENDER_ADDRTYPE = PROP_TAG( PT_TSTRING, 3102) PR_SENDER_ADDRTYPE_W = PROP_TAG( PT_UNICODE, 3102) PR_SENDER_ADDRTYPE_A = PROP_TAG( PT_STRING8, 3102) PR_SENDER_EMAIL_ADDRESS = PROP_TAG( PT_TSTRING, 3103) PR_SENDER_EMAIL_ADDRESS_W = PROP_TAG( PT_UNICODE, 3103) PR_SENDER_EMAIL_ADDRESS_A = PROP_TAG( PT_STRING8, 3103) PR_CURRENT_VERSION = PROP_TAG( PT_I8, 3584) PR_DELETE_AFTER_SUBMIT = PROP_TAG( PT_BOOLEAN, 3585) PR_DISPLAY_BCC = PROP_TAG( PT_TSTRING, 3586) PR_DISPLAY_BCC_W = PROP_TAG( PT_UNICODE, 3586) PR_DISPLAY_BCC_A = PROP_TAG( PT_STRING8, 3586) PR_DISPLAY_CC = PROP_TAG( PT_TSTRING, 3587) PR_DISPLAY_CC_W = PROP_TAG( PT_UNICODE, 3587) PR_DISPLAY_CC_A = PROP_TAG( PT_STRING8, 3587) PR_DISPLAY_TO = PROP_TAG( PT_TSTRING, 3588) PR_DISPLAY_TO_W = PROP_TAG( PT_UNICODE, 3588) PR_DISPLAY_TO_A = PROP_TAG( PT_STRING8, 3588) PR_PARENT_DISPLAY = PROP_TAG( PT_TSTRING, 3589) PR_PARENT_DISPLAY_W = PROP_TAG( PT_UNICODE, 3589) PR_PARENT_DISPLAY_A = PROP_TAG( PT_STRING8, 3589) PR_MESSAGE_DELIVERY_TIME = PROP_TAG( PT_SYSTIME, 3590) PR_MESSAGE_FLAGS = PROP_TAG( PT_LONG, 3591) PR_MESSAGE_SIZE = PROP_TAG( PT_LONG, 3592) PR_PARENT_ENTRYID = PROP_TAG( PT_BINARY, 3593) PR_SENTMAIL_ENTRYID = PROP_TAG( PT_BINARY, 3594) PR_CORRELATE = PROP_TAG( PT_BOOLEAN, 3596) PR_CORRELATE_MTSID = PROP_TAG( PT_BINARY, 3597) PR_DISCRETE_VALUES = PROP_TAG( PT_BOOLEAN, 3598) PR_RESPONSIBILITY = PROP_TAG( PT_BOOLEAN, 3599) PR_SPOOLER_STATUS = PROP_TAG( PT_LONG, 3600) PR_TRANSPORT_STATUS = PROP_TAG( PT_LONG, 3601) PR_MESSAGE_RECIPIENTS = PROP_TAG( PT_OBJECT, 3602) PR_MESSAGE_ATTACHMENTS = PROP_TAG( PT_OBJECT, 3603) PR_SUBMIT_FLAGS = PROP_TAG( PT_LONG, 3604) PR_RECIPIENT_STATUS = PROP_TAG( PT_LONG, 3605) PR_TRANSPORT_KEY = PROP_TAG( PT_LONG, 3606) PR_MSG_STATUS = PROP_TAG( PT_LONG, 3607) PR_MESSAGE_DOWNLOAD_TIME = PROP_TAG( PT_LONG, 3608) PR_CREATION_VERSION = PROP_TAG( PT_I8, 3609) PR_MODIFY_VERSION = PROP_TAG( PT_I8, 3610) PR_HASATTACH = PROP_TAG( PT_BOOLEAN, 3611) PR_BODY_CRC = PROP_TAG( PT_LONG, 3612) PR_NORMALIZED_SUBJECT = PROP_TAG( PT_TSTRING, 3613) PR_NORMALIZED_SUBJECT_W = PROP_TAG( PT_UNICODE, 3613) PR_NORMALIZED_SUBJECT_A = PROP_TAG( PT_STRING8, 3613) PR_RTF_IN_SYNC = PROP_TAG( PT_BOOLEAN, 3615) PR_ATTACH_SIZE = PROP_TAG( PT_LONG, 3616) PR_ATTACH_NUM = PROP_TAG( PT_LONG, 3617) PR_PREPROCESS = PROP_TAG( PT_BOOLEAN, 3618) PR_ORIGINATING_MTA_CERTIFICATE = PROP_TAG( PT_BINARY, 3621) PR_PROOF_OF_SUBMISSION = PROP_TAG( PT_BINARY, 3622) PR_ENTRYID = PROP_TAG( PT_BINARY, 4095) PR_OBJECT_TYPE = PROP_TAG( PT_LONG, 4094) PR_ICON = PROP_TAG( PT_BINARY, 4093) PR_MINI_ICON = PROP_TAG( PT_BINARY, 4092) PR_STORE_ENTRYID = PROP_TAG( PT_BINARY, 4091) PR_STORE_RECORD_KEY = PROP_TAG( PT_BINARY, 4090) PR_RECORD_KEY = PROP_TAG( PT_BINARY, 4089) PR_MAPPING_SIGNATURE = PROP_TAG( PT_BINARY, 4088) PR_ACCESS_LEVEL = PROP_TAG( PT_LONG, 4087) PR_INSTANCE_KEY = PROP_TAG( PT_BINARY, 4086) PR_ROW_TYPE = PROP_TAG( PT_LONG, 4085) PR_ACCESS = PROP_TAG( PT_LONG, 4084) PR_ROWID = PROP_TAG( PT_LONG, 12288) PR_DISPLAY_NAME = PROP_TAG( PT_TSTRING, 12289) PR_DISPLAY_NAME_W = PROP_TAG( PT_UNICODE, 12289) PR_DISPLAY_NAME_A = PROP_TAG( PT_STRING8, 12289) PR_ADDRTYPE = PROP_TAG( PT_TSTRING, 12290) PR_ADDRTYPE_W = PROP_TAG( PT_UNICODE, 12290) PR_ADDRTYPE_A = PROP_TAG( PT_STRING8, 12290) PR_EMAIL_ADDRESS = PROP_TAG( PT_TSTRING, 12291) PR_EMAIL_ADDRESS_W = PROP_TAG( PT_UNICODE, 12291) PR_EMAIL_ADDRESS_A = PROP_TAG( PT_STRING8, 12291) PR_COMMENT = PROP_TAG( PT_TSTRING, 12292) PR_COMMENT_W = PROP_TAG( PT_UNICODE, 12292) PR_COMMENT_A = PROP_TAG( PT_STRING8, 12292) PR_DEPTH = PROP_TAG( PT_LONG, 12293) PR_PROVIDER_DISPLAY = PROP_TAG( PT_TSTRING, 12294) PR_PROVIDER_DISPLAY_W = PROP_TAG( PT_UNICODE, 12294) PR_PROVIDER_DISPLAY_A = PROP_TAG( PT_STRING8, 12294) PR_CREATION_TIME = PROP_TAG( PT_SYSTIME, 12295) PR_LAST_MODIFICATION_TIME = PROP_TAG( PT_SYSTIME, 12296) PR_RESOURCE_FLAGS = PROP_TAG( PT_LONG, 12297) PR_PROVIDER_DLL_NAME = PROP_TAG( PT_TSTRING, 12298) PR_PROVIDER_DLL_NAME_W = PROP_TAG( PT_UNICODE, 12298) PR_PROVIDER_DLL_NAME_A = PROP_TAG( PT_STRING8, 12298) PR_SEARCH_KEY = PROP_TAG( PT_BINARY, 12299) PR_PROVIDER_UID = PROP_TAG( PT_BINARY, 12300) PR_PROVIDER_ORDINAL = PROP_TAG( PT_LONG, 12301) PR_FORM_VERSION = PROP_TAG(PT_TSTRING, 13057) PR_FORM_VERSION_W = PROP_TAG(PT_UNICODE, 13057) PR_FORM_VERSION_A = PROP_TAG(PT_STRING8, 13057) PR_FORM_CLSID = PROP_TAG(PT_CLSID, 13058) PR_FORM_CONTACT_NAME = PROP_TAG(PT_TSTRING, 13059) PR_FORM_CONTACT_NAME_W = PROP_TAG(PT_UNICODE, 13059) PR_FORM_CONTACT_NAME_A = PROP_TAG(PT_STRING8, 13059) PR_FORM_CATEGORY = PROP_TAG(PT_TSTRING, 13060) PR_FORM_CATEGORY_W = PROP_TAG(PT_UNICODE, 13060) PR_FORM_CATEGORY_A = PROP_TAG(PT_STRING8, 13060) PR_FORM_CATEGORY_SUB = PROP_TAG(PT_TSTRING, 13061) PR_FORM_CATEGORY_SUB_W = PROP_TAG(PT_UNICODE, 13061) PR_FORM_CATEGORY_SUB_A = PROP_TAG(PT_STRING8, 13061) PR_FORM_HOST_MAP = PROP_TAG(PT_MV_LONG, 13062) PR_FORM_HIDDEN = PROP_TAG(PT_BOOLEAN, 13063) PR_FORM_DESIGNER_NAME = PROP_TAG(PT_TSTRING, 13064) PR_FORM_DESIGNER_NAME_W = PROP_TAG(PT_UNICODE, 13064) PR_FORM_DESIGNER_NAME_A = PROP_TAG(PT_STRING8, 13064) PR_FORM_DESIGNER_GUID = PROP_TAG(PT_CLSID, 13065) PR_FORM_MESSAGE_BEHAVIOR = PROP_TAG(PT_LONG, 13066) PR_DEFAULT_STORE = PROP_TAG( PT_BOOLEAN, 13312) PR_STORE_SUPPORT_MASK = PROP_TAG( PT_LONG, 13325) PR_STORE_STATE = PROP_TAG( PT_LONG, 13326) PR_IPM_SUBTREE_SEARCH_KEY = PROP_TAG( PT_BINARY, 13328) PR_IPM_OUTBOX_SEARCH_KEY = PROP_TAG( PT_BINARY, 13329) PR_IPM_WASTEBASKET_SEARCH_KEY = PROP_TAG( PT_BINARY, 13330) PR_IPM_SENTMAIL_SEARCH_KEY = PROP_TAG( PT_BINARY, 13331) PR_MDB_PROVIDER = PROP_TAG( PT_BINARY, 13332) PR_RECEIVE_FOLDER_SETTINGS = PROP_TAG( PT_OBJECT, 13333) PR_VALID_FOLDER_MASK = PROP_TAG( PT_LONG, 13791) PR_IPM_SUBTREE_ENTRYID = PROP_TAG( PT_BINARY, 13792) PR_IPM_OUTBOX_ENTRYID = PROP_TAG( PT_BINARY, 13794) PR_IPM_WASTEBASKET_ENTRYID = PROP_TAG( PT_BINARY, 13795) PR_IPM_SENTMAIL_ENTRYID = PROP_TAG( PT_BINARY, 13796) PR_VIEWS_ENTRYID = PROP_TAG( PT_BINARY, 13797) PR_COMMON_VIEWS_ENTRYID = PROP_TAG( PT_BINARY, 13798) PR_FINDER_ENTRYID = PROP_TAG( PT_BINARY, 13799) PR_CONTAINER_FLAGS = PROP_TAG( PT_LONG, 13824) PR_FOLDER_TYPE = PROP_TAG( PT_LONG, 13825) PR_CONTENT_COUNT = PROP_TAG( PT_LONG, 13826) PR_CONTENT_UNREAD = PROP_TAG( PT_LONG, 13827) PR_CREATE_TEMPLATES = PROP_TAG( PT_OBJECT, 13828) PR_DETAILS_TABLE = PROP_TAG( PT_OBJECT, 13829) PR_SEARCH = PROP_TAG( PT_OBJECT, 13831) PR_SELECTABLE = PROP_TAG( PT_BOOLEAN, 13833) PR_SUBFOLDERS = PROP_TAG( PT_BOOLEAN, 13834) PR_STATUS = PROP_TAG( PT_LONG, 13835) PR_ANR = PROP_TAG( PT_TSTRING, 13836) PR_ANR_W = PROP_TAG( PT_UNICODE, 13836) PR_ANR_A = PROP_TAG( PT_STRING8, 13836) PR_CONTENTS_SORT_ORDER = PROP_TAG( PT_MV_LONG, 13837) PR_CONTAINER_HIERARCHY = PROP_TAG( PT_OBJECT, 13838) PR_CONTAINER_CONTENTS = PROP_TAG( PT_OBJECT, 13839) PR_FOLDER_ASSOCIATED_CONTENTS = PROP_TAG( PT_OBJECT, 13840) PR_DEF_CREATE_DL = PROP_TAG( PT_BINARY, 13841) PR_DEF_CREATE_MAILUSER = PROP_TAG( PT_BINARY, 13842) PR_CONTAINER_CLASS = PROP_TAG( PT_TSTRING, 13843) PR_CONTAINER_CLASS_W = PROP_TAG( PT_UNICODE, 13843) PR_CONTAINER_CLASS_A = PROP_TAG( PT_STRING8, 13843) PR_CONTAINER_MODIFY_VERSION = PROP_TAG( PT_I8, 13844) PR_AB_PROVIDER_ID = PROP_TAG( PT_BINARY, 13845) PR_DEFAULT_VIEW_ENTRYID = PROP_TAG( PT_BINARY, 13846) PR_ASSOC_CONTENT_COUNT = PROP_TAG( PT_LONG, 13847) PR_ATTACHMENT_X400_PARAMETERS = PROP_TAG( PT_BINARY, 14080) PR_ATTACH_DATA_OBJ = PROP_TAG( PT_OBJECT, 14081) PR_ATTACH_DATA_BIN = PROP_TAG( PT_BINARY, 14081) PR_ATTACH_ENCODING = PROP_TAG( PT_BINARY, 14082) PR_ATTACH_EXTENSION = PROP_TAG( PT_TSTRING, 14083) PR_ATTACH_EXTENSION_W = PROP_TAG( PT_UNICODE, 14083) PR_ATTACH_EXTENSION_A = PROP_TAG( PT_STRING8, 14083) PR_ATTACH_FILENAME = PROP_TAG( PT_TSTRING, 14084) PR_ATTACH_FILENAME_W = PROP_TAG( PT_UNICODE, 14084) PR_ATTACH_FILENAME_A = PROP_TAG( PT_STRING8, 14084) PR_ATTACH_METHOD = PROP_TAG( PT_LONG, 14085) PR_ATTACH_LONG_FILENAME = PROP_TAG( PT_TSTRING, 14087) PR_ATTACH_LONG_FILENAME_W = PROP_TAG( PT_UNICODE, 14087) PR_ATTACH_LONG_FILENAME_A = PROP_TAG( PT_STRING8, 14087) PR_ATTACH_PATHNAME = PROP_TAG( PT_TSTRING, 14088) PR_ATTACH_PATHNAME_W = PROP_TAG( PT_UNICODE, 14088) PR_ATTACH_PATHNAME_A = PROP_TAG( PT_STRING8, 14088) PR_ATTACH_RENDERING = PROP_TAG( PT_BINARY, 14089) PR_ATTACH_TAG = PROP_TAG( PT_BINARY, 14090) PR_RENDERING_POSITION = PROP_TAG( PT_LONG, 14091) PR_ATTACH_TRANSPORT_NAME = PROP_TAG( PT_TSTRING, 14092) PR_ATTACH_TRANSPORT_NAME_W = PROP_TAG( PT_UNICODE, 14092) PR_ATTACH_TRANSPORT_NAME_A = PROP_TAG( PT_STRING8, 14092) PR_ATTACH_LONG_PATHNAME = PROP_TAG( PT_TSTRING, 14093) PR_ATTACH_LONG_PATHNAME_W = PROP_TAG( PT_UNICODE, 14093) PR_ATTACH_LONG_PATHNAME_A = PROP_TAG( PT_STRING8, 14093) PR_ATTACH_MIME_TAG = PROP_TAG( PT_TSTRING, 14094) PR_ATTACH_MIME_TAG_W = PROP_TAG( PT_UNICODE, 14094) PR_ATTACH_MIME_TAG_A = PROP_TAG( PT_STRING8, 14094) PR_ATTACH_ADDITIONAL_INFO = PROP_TAG( PT_BINARY, 14095) PR_DISPLAY_TYPE = PROP_TAG( PT_LONG, 14592) PR_TEMPLATEID = PROP_TAG( PT_BINARY, 14594) PR_PRIMARY_CAPABILITY = PROP_TAG( PT_BINARY, 14596) PR_7BIT_DISPLAY_NAME = PROP_TAG( PT_STRING8, 14847) PR_ACCOUNT = PROP_TAG( PT_TSTRING, 14848) PR_ACCOUNT_W = PROP_TAG( PT_UNICODE, 14848) PR_ACCOUNT_A = PROP_TAG( PT_STRING8, 14848) PR_ALTERNATE_RECIPIENT = PROP_TAG( PT_BINARY, 14849) PR_CALLBACK_TELEPHONE_NUMBER = PROP_TAG( PT_TSTRING, 14850) PR_CALLBACK_TELEPHONE_NUMBER_W = PROP_TAG( PT_UNICODE, 14850) PR_CALLBACK_TELEPHONE_NUMBER_A = PROP_TAG( PT_STRING8, 14850) PR_CONVERSION_PROHIBITED = PROP_TAG( PT_BOOLEAN, 14851) PR_DISCLOSE_RECIPIENTS = PROP_TAG( PT_BOOLEAN, 14852) PR_GENERATION = PROP_TAG( PT_TSTRING, 14853) PR_GENERATION_W = PROP_TAG( PT_UNICODE, 14853) PR_GENERATION_A = PROP_TAG( PT_STRING8, 14853) PR_GIVEN_NAME = PROP_TAG( PT_TSTRING, 14854) PR_GIVEN_NAME_W = PROP_TAG( PT_UNICODE, 14854) PR_GIVEN_NAME_A = PROP_TAG( PT_STRING8, 14854) PR_GOVERNMENT_ID_NUMBER = PROP_TAG( PT_TSTRING, 14855) PR_GOVERNMENT_ID_NUMBER_W = PROP_TAG( PT_UNICODE, 14855) PR_GOVERNMENT_ID_NUMBER_A = PROP_TAG( PT_STRING8, 14855) PR_BUSINESS_TELEPHONE_NUMBER = PROP_TAG( PT_TSTRING, 14856) PR_BUSINESS_TELEPHONE_NUMBER_W = PROP_TAG( PT_UNICODE, 14856) PR_BUSINESS_TELEPHONE_NUMBER_A = PROP_TAG( PT_STRING8, 14856) PR_OFFICE_TELEPHONE_NUMBER = PR_BUSINESS_TELEPHONE_NUMBER PR_OFFICE_TELEPHONE_NUMBER_W = PR_BUSINESS_TELEPHONE_NUMBER_W PR_OFFICE_TELEPHONE_NUMBER_A = PR_BUSINESS_TELEPHONE_NUMBER_A PR_HOME_TELEPHONE_NUMBER = PROP_TAG( PT_TSTRING, 14857) PR_HOME_TELEPHONE_NUMBER_W = PROP_TAG( PT_UNICODE, 14857) PR_HOME_TELEPHONE_NUMBER_A = PROP_TAG( PT_STRING8, 14857) PR_INITIALS = PROP_TAG( PT_TSTRING, 14858) PR_INITIALS_W = PROP_TAG( PT_UNICODE, 14858) PR_INITIALS_A = PROP_TAG( PT_STRING8, 14858) PR_KEYWORD = PROP_TAG( PT_TSTRING, 14859) PR_KEYWORD_W = PROP_TAG( PT_UNICODE, 14859) PR_KEYWORD_A = PROP_TAG( PT_STRING8, 14859) PR_LANGUAGE = PROP_TAG( PT_TSTRING, 14860) PR_LANGUAGE_W = PROP_TAG( PT_UNICODE, 14860) PR_LANGUAGE_A = PROP_TAG( PT_STRING8, 14860) PR_LOCATION = PROP_TAG( PT_TSTRING, 14861) PR_LOCATION_W = PROP_TAG( PT_UNICODE, 14861) PR_LOCATION_A = PROP_TAG( PT_STRING8, 14861) PR_MAIL_PERMISSION = PROP_TAG( PT_BOOLEAN, 14862) PR_MHS_COMMON_NAME = PROP_TAG( PT_TSTRING, 14863) PR_MHS_COMMON_NAME_W = PROP_TAG( PT_UNICODE, 14863) PR_MHS_COMMON_NAME_A = PROP_TAG( PT_STRING8, 14863) PR_ORGANIZATIONAL_ID_NUMBER = PROP_TAG( PT_TSTRING, 14864) PR_ORGANIZATIONAL_ID_NUMBER_W = PROP_TAG( PT_UNICODE, 14864) PR_ORGANIZATIONAL_ID_NUMBER_A = PROP_TAG( PT_STRING8, 14864) PR_SURNAME = PROP_TAG( PT_TSTRING, 14865) PR_SURNAME_W = PROP_TAG( PT_UNICODE, 14865) PR_SURNAME_A = PROP_TAG( PT_STRING8, 14865) PR_ORIGINAL_ENTRYID = PROP_TAG( PT_BINARY, 14866) PR_ORIGINAL_DISPLAY_NAME = PROP_TAG( PT_TSTRING, 14867) PR_ORIGINAL_DISPLAY_NAME_W = PROP_TAG( PT_UNICODE, 14867) PR_ORIGINAL_DISPLAY_NAME_A = PROP_TAG( PT_STRING8, 14867) PR_ORIGINAL_SEARCH_KEY = PROP_TAG( PT_BINARY, 14868) PR_POSTAL_ADDRESS = PROP_TAG( PT_TSTRING, 14869) PR_POSTAL_ADDRESS_W = PROP_TAG( PT_UNICODE, 14869) PR_POSTAL_ADDRESS_A = PROP_TAG( PT_STRING8, 14869) PR_COMPANY_NAME = PROP_TAG( PT_TSTRING, 14870) PR_COMPANY_NAME_W = PROP_TAG( PT_UNICODE, 14870) PR_COMPANY_NAME_A = PROP_TAG( PT_STRING8, 14870) PR_TITLE = PROP_TAG( PT_TSTRING, 14871) PR_TITLE_W = PROP_TAG( PT_UNICODE, 14871) PR_TITLE_A = PROP_TAG( PT_STRING8, 14871) PR_DEPARTMENT_NAME = PROP_TAG( PT_TSTRING, 14872) PR_DEPARTMENT_NAME_W = PROP_TAG( PT_UNICODE, 14872) PR_DEPARTMENT_NAME_A = PROP_TAG( PT_STRING8, 14872) PR_OFFICE_LOCATION = PROP_TAG( PT_TSTRING, 14873) PR_OFFICE_LOCATION_W = PROP_TAG( PT_UNICODE, 14873) PR_OFFICE_LOCATION_A = PROP_TAG( PT_STRING8, 14873) PR_PRIMARY_TELEPHONE_NUMBER = PROP_TAG( PT_TSTRING, 14874) PR_PRIMARY_TELEPHONE_NUMBER_W = PROP_TAG( PT_UNICODE, 14874) PR_PRIMARY_TELEPHONE_NUMBER_A = PROP_TAG( PT_STRING8, 14874) PR_BUSINESS2_TELEPHONE_NUMBER = PROP_TAG( PT_TSTRING, 14875) PR_BUSINESS2_TELEPHONE_NUMBER_W = PROP_TAG( PT_UNICODE, 14875) PR_BUSINESS2_TELEPHONE_NUMBER_A = PROP_TAG( PT_STRING8, 14875) PR_OFFICE2_TELEPHONE_NUMBER = PR_BUSINESS2_TELEPHONE_NUMBER PR_OFFICE2_TELEPHONE_NUMBER_W = PR_BUSINESS2_TELEPHONE_NUMBER_W PR_OFFICE2_TELEPHONE_NUMBER_A = PR_BUSINESS2_TELEPHONE_NUMBER_A PR_MOBILE_TELEPHONE_NUMBER = PROP_TAG( PT_TSTRING, 14876) PR_MOBILE_TELEPHONE_NUMBER_W = PROP_TAG( PT_UNICODE, 14876) PR_MOBILE_TELEPHONE_NUMBER_A = PROP_TAG( PT_STRING8, 14876) PR_CELLULAR_TELEPHONE_NUMBER = PR_MOBILE_TELEPHONE_NUMBER PR_CELLULAR_TELEPHONE_NUMBER_W = PR_MOBILE_TELEPHONE_NUMBER_W PR_CELLULAR_TELEPHONE_NUMBER_A = PR_MOBILE_TELEPHONE_NUMBER_A PR_RADIO_TELEPHONE_NUMBER = PROP_TAG( PT_TSTRING, 14877) PR_RADIO_TELEPHONE_NUMBER_W = PROP_TAG( PT_UNICODE, 14877) PR_RADIO_TELEPHONE_NUMBER_A = PROP_TAG( PT_STRING8, 14877) PR_CAR_TELEPHONE_NUMBER = PROP_TAG( PT_TSTRING, 14878) PR_CAR_TELEPHONE_NUMBER_W = PROP_TAG( PT_UNICODE, 14878) PR_CAR_TELEPHONE_NUMBER_A = PROP_TAG( PT_STRING8, 14878) PR_OTHER_TELEPHONE_NUMBER = PROP_TAG( PT_TSTRING, 14879) PR_OTHER_TELEPHONE_NUMBER_W = PROP_TAG( PT_UNICODE, 14879) PR_OTHER_TELEPHONE_NUMBER_A = PROP_TAG( PT_STRING8, 14879) PR_TRANSMITABLE_DISPLAY_NAME = PROP_TAG( PT_TSTRING, 14880) PR_TRANSMITABLE_DISPLAY_NAME_W = PROP_TAG( PT_UNICODE, 14880) PR_TRANSMITABLE_DISPLAY_NAME_A = PROP_TAG( PT_STRING8, 14880) PR_PAGER_TELEPHONE_NUMBER = PROP_TAG( PT_TSTRING, 14881) PR_PAGER_TELEPHONE_NUMBER_W = PROP_TAG( PT_UNICODE, 14881) PR_PAGER_TELEPHONE_NUMBER_A = PROP_TAG( PT_STRING8, 14881) PR_BEEPER_TELEPHONE_NUMBER = PR_PAGER_TELEPHONE_NUMBER PR_BEEPER_TELEPHONE_NUMBER_W = PR_PAGER_TELEPHONE_NUMBER_W PR_BEEPER_TELEPHONE_NUMBER_A = PR_PAGER_TELEPHONE_NUMBER_A PR_USER_CERTIFICATE = PROP_TAG( PT_BINARY, 14882) PR_PRIMARY_FAX_NUMBER = PROP_TAG( PT_TSTRING, 14883) PR_PRIMARY_FAX_NUMBER_W = PROP_TAG( PT_UNICODE, 14883) PR_PRIMARY_FAX_NUMBER_A = PROP_TAG( PT_STRING8, 14883) PR_BUSINESS_FAX_NUMBER = PROP_TAG( PT_TSTRING, 14884) PR_BUSINESS_FAX_NUMBER_W = PROP_TAG( PT_UNICODE, 14884) PR_BUSINESS_FAX_NUMBER_A = PROP_TAG( PT_STRING8, 14884) PR_HOME_FAX_NUMBER = PROP_TAG( PT_TSTRING, 14885) PR_HOME_FAX_NUMBER_W = PROP_TAG( PT_UNICODE, 14885) PR_HOME_FAX_NUMBER_A = PROP_TAG( PT_STRING8, 14885) PR_COUNTRY = PROP_TAG( PT_TSTRING, 14886) PR_COUNTRY_W = PROP_TAG( PT_UNICODE, 14886) PR_COUNTRY_A = PROP_TAG( PT_STRING8, 14886) PR_BUSINESS_ADDRESS_COUNTRY = PR_COUNTRY PR_BUSINESS_ADDRESS_COUNTRY_W = PR_COUNTRY_W PR_BUSINESS_ADDRESS_COUNTRY_A = PR_COUNTRY_A PR_LOCALITY = PROP_TAG( PT_TSTRING, 14887) PR_LOCALITY_W = PROP_TAG( PT_UNICODE, 14887) PR_LOCALITY_A = PROP_TAG( PT_STRING8, 14887) PR_BUSINESS_ADDRESS_CITY = PR_LOCALITY PR_BUSINESS_ADDRESS_CITY_W = PR_LOCALITY_W PR_BUSINESS_ADDRESS_CITY_A = PR_LOCALITY_A PR_STATE_OR_PROVINCE = PROP_TAG( PT_TSTRING, 14888) PR_STATE_OR_PROVINCE_W = PROP_TAG( PT_UNICODE, 14888) PR_STATE_OR_PROVINCE_A = PROP_TAG( PT_STRING8, 14888) PR_BUSINESS_ADDRESS_STATE_OR_PROVINCE = PR_STATE_OR_PROVINCE PR_BUSINESS_ADDRESS_STATE_OR_PROVINCE_W = PR_STATE_OR_PROVINCE_W PR_BUSINESS_ADDRESS_STATE_OR_PROVINCE_A = PR_STATE_OR_PROVINCE_A PR_STREET_ADDRESS = PROP_TAG( PT_TSTRING, 14889) PR_STREET_ADDRESS_W = PROP_TAG( PT_UNICODE, 14889) PR_STREET_ADDRESS_A = PROP_TAG( PT_STRING8, 14889) PR_BUSINESS_ADDRESS_STREET = PR_STREET_ADDRESS PR_BUSINESS_ADDRESS_STREET_W = PR_STREET_ADDRESS_W PR_BUSINESS_ADDRESS_STREET_A = PR_STREET_ADDRESS_A PR_POSTAL_CODE = PROP_TAG( PT_TSTRING, 14890) PR_POSTAL_CODE_W = PROP_TAG( PT_UNICODE, 14890) PR_POSTAL_CODE_A = PROP_TAG( PT_STRING8, 14890) PR_BUSINESS_ADDRESS_POSTAL_CODE = PR_POSTAL_CODE PR_BUSINESS_ADDRESS_POSTAL_CODE_W = PR_POSTAL_CODE_W PR_BUSINESS_ADDRESS_POSTAL_CODE_A = PR_POSTAL_CODE_A PR_POST_OFFICE_BOX = PROP_TAG( PT_TSTRING, 14891) PR_POST_OFFICE_BOX_W = PROP_TAG( PT_UNICODE, 14891) PR_POST_OFFICE_BOX_A = PROP_TAG( PT_STRING8, 14891) PR_BUSINESS_ADDRESS_POST_OFFICE_BOX = PR_POST_OFFICE_BOX PR_BUSINESS_ADDRESS_POST_OFFICE_BOX_W = PR_POST_OFFICE_BOX_W PR_BUSINESS_ADDRESS_POST_OFFICE_BOX_A = PR_POST_OFFICE_BOX_A PR_TELEX_NUMBER = PROP_TAG( PT_TSTRING, 14892) PR_TELEX_NUMBER_W = PROP_TAG( PT_UNICODE, 14892) PR_TELEX_NUMBER_A = PROP_TAG( PT_STRING8, 14892) PR_ISDN_NUMBER = PROP_TAG( PT_TSTRING, 14893) PR_ISDN_NUMBER_W = PROP_TAG( PT_UNICODE, 14893) PR_ISDN_NUMBER_A = PROP_TAG( PT_STRING8, 14893) PR_ASSISTANT_TELEPHONE_NUMBER = PROP_TAG( PT_TSTRING, 14894) PR_ASSISTANT_TELEPHONE_NUMBER_W = PROP_TAG( PT_UNICODE, 14894) PR_ASSISTANT_TELEPHONE_NUMBER_A = PROP_TAG( PT_STRING8, 14894) PR_HOME2_TELEPHONE_NUMBER = PROP_TAG( PT_TSTRING, 14895) PR_HOME2_TELEPHONE_NUMBER_W = PROP_TAG( PT_UNICODE, 14895) PR_HOME2_TELEPHONE_NUMBER_A = PROP_TAG( PT_STRING8, 14895) PR_ASSISTANT = PROP_TAG( PT_TSTRING, 14896) PR_ASSISTANT_W = PROP_TAG( PT_UNICODE, 14896) PR_ASSISTANT_A = PROP_TAG( PT_STRING8, 14896) PR_SEND_RICH_INFO = PROP_TAG( PT_BOOLEAN, 14912) PR_WEDDING_ANNIVERSARY = PROP_TAG( PT_SYSTIME, 14913) PR_BIRTHDAY = PROP_TAG( PT_SYSTIME, 14914) PR_HOBBIES = PROP_TAG( PT_TSTRING, 14915) PR_HOBBIES_W = PROP_TAG( PT_UNICODE, 14915) PR_HOBBIES_A = PROP_TAG( PT_STRING8, 14915) PR_MIDDLE_NAME = PROP_TAG( PT_TSTRING, 14916) PR_MIDDLE_NAME_W = PROP_TAG( PT_UNICODE, 14916) PR_MIDDLE_NAME_A = PROP_TAG( PT_STRING8, 14916) PR_DISPLAY_NAME_PREFIX = PROP_TAG( PT_TSTRING, 14917) PR_DISPLAY_NAME_PREFIX_W = PROP_TAG( PT_UNICODE, 14917) PR_DISPLAY_NAME_PREFIX_A = PROP_TAG( PT_STRING8, 14917) PR_PROFESSION = PROP_TAG( PT_TSTRING, 14918) PR_PROFESSION_W = PROP_TAG( PT_UNICODE, 14918) PR_PROFESSION_A = PROP_TAG( PT_STRING8, 14918) PR_PREFERRED_BY_NAME = PROP_TAG( PT_TSTRING, 14919) PR_PREFERRED_BY_NAME_W = PROP_TAG( PT_UNICODE, 14919) PR_PREFERRED_BY_NAME_A = PROP_TAG( PT_STRING8, 14919) PR_SPOUSE_NAME = PROP_TAG( PT_TSTRING, 14920) PR_SPOUSE_NAME_W = PROP_TAG( PT_UNICODE, 14920) PR_SPOUSE_NAME_A = PROP_TAG( PT_STRING8, 14920) PR_COMPUTER_NETWORK_NAME = PROP_TAG( PT_TSTRING, 14921) PR_COMPUTER_NETWORK_NAME_W = PROP_TAG( PT_UNICODE, 14921) PR_COMPUTER_NETWORK_NAME_A = PROP_TAG( PT_STRING8, 14921) PR_CUSTOMER_ID = PROP_TAG( PT_TSTRING, 14922) PR_CUSTOMER_ID_W = PROP_TAG( PT_UNICODE, 14922) PR_CUSTOMER_ID_A = PROP_TAG( PT_STRING8, 14922) PR_TTYTDD_PHONE_NUMBER = PROP_TAG( PT_TSTRING, 14923) PR_TTYTDD_PHONE_NUMBER_W = PROP_TAG( PT_UNICODE, 14923) PR_TTYTDD_PHONE_NUMBER_A = PROP_TAG( PT_STRING8, 14923) PR_FTP_SITE = PROP_TAG( PT_TSTRING, 14924) PR_FTP_SITE_W = PROP_TAG( PT_UNICODE, 14924) PR_FTP_SITE_A = PROP_TAG( PT_STRING8, 14924) PR_GENDER = PROP_TAG( PT_SHORT, 14925) PR_MANAGER_NAME = PROP_TAG( PT_TSTRING, 14926) PR_MANAGER_NAME_W = PROP_TAG( PT_UNICODE, 14926) PR_MANAGER_NAME_A = PROP_TAG( PT_STRING8, 14926) PR_NICKNAME = PROP_TAG( PT_TSTRING, 14927) PR_NICKNAME_W = PROP_TAG( PT_UNICODE, 14927) PR_NICKNAME_A = PROP_TAG( PT_STRING8, 14927) PR_PERSONAL_HOME_PAGE = PROP_TAG( PT_TSTRING, 14928) PR_PERSONAL_HOME_PAGE_W = PROP_TAG( PT_UNICODE, 14928) PR_PERSONAL_HOME_PAGE_A = PROP_TAG( PT_STRING8, 14928) PR_BUSINESS_HOME_PAGE = PROP_TAG( PT_TSTRING, 14929) PR_BUSINESS_HOME_PAGE_W = PROP_TAG( PT_UNICODE, 14929) PR_BUSINESS_HOME_PAGE_A = PROP_TAG( PT_STRING8, 14929) PR_CONTACT_VERSION = PROP_TAG( PT_CLSID, 14930) PR_CONTACT_ENTRYIDS = PROP_TAG( PT_MV_BINARY, 14931) PR_CONTACT_ADDRTYPES = PROP_TAG( PT_MV_TSTRING, 14932) PR_CONTACT_ADDRTYPES_W = PROP_TAG( PT_MV_UNICODE, 14932) PR_CONTACT_ADDRTYPES_A = PROP_TAG( PT_MV_STRING8, 14932) PR_CONTACT_DEFAULT_ADDRESS_INDEX = PROP_TAG( PT_LONG, 14933) PR_CONTACT_EMAIL_ADDRESSES = PROP_TAG( PT_MV_TSTRING, 14934) PR_CONTACT_EMAIL_ADDRESSES_W = PROP_TAG( PT_MV_UNICODE, 14934) PR_CONTACT_EMAIL_ADDRESSES_A = PROP_TAG( PT_MV_STRING8, 14934) PR_COMPANY_MAIN_PHONE_NUMBER = PROP_TAG( PT_TSTRING, 14935) PR_COMPANY_MAIN_PHONE_NUMBER_W = PROP_TAG( PT_UNICODE, 14935) PR_COMPANY_MAIN_PHONE_NUMBER_A = PROP_TAG( PT_STRING8, 14935) PR_CHILDRENS_NAMES = PROP_TAG( PT_MV_TSTRING, 14936) PR_CHILDRENS_NAMES_W = PROP_TAG( PT_MV_UNICODE, 14936) PR_CHILDRENS_NAMES_A = PROP_TAG( PT_MV_STRING8, 14936) PR_HOME_ADDRESS_CITY = PROP_TAG( PT_TSTRING, 14937) PR_HOME_ADDRESS_CITY_W = PROP_TAG( PT_UNICODE, 14937) PR_HOME_ADDRESS_CITY_A = PROP_TAG( PT_STRING8, 14937) PR_HOME_ADDRESS_COUNTRY = PROP_TAG( PT_TSTRING, 14938) PR_HOME_ADDRESS_COUNTRY_W = PROP_TAG( PT_UNICODE, 14938) PR_HOME_ADDRESS_COUNTRY_A = PROP_TAG( PT_STRING8, 14938) PR_HOME_ADDRESS_POSTAL_CODE = PROP_TAG( PT_TSTRING, 14939) PR_HOME_ADDRESS_POSTAL_CODE_W = PROP_TAG( PT_UNICODE, 14939) PR_HOME_ADDRESS_POSTAL_CODE_A = PROP_TAG( PT_STRING8, 14939) PR_HOME_ADDRESS_STATE_OR_PROVINCE = PROP_TAG( PT_TSTRING, 14940) PR_HOME_ADDRESS_STATE_OR_PROVINCE_W = PROP_TAG( PT_UNICODE, 14940) PR_HOME_ADDRESS_STATE_OR_PROVINCE_A = PROP_TAG( PT_STRING8, 14940) PR_HOME_ADDRESS_STREET = PROP_TAG( PT_TSTRING, 14941) PR_HOME_ADDRESS_STREET_W = PROP_TAG( PT_UNICODE, 14941) PR_HOME_ADDRESS_STREET_A = PROP_TAG( PT_STRING8, 14941) PR_HOME_ADDRESS_POST_OFFICE_BOX = PROP_TAG( PT_TSTRING, 14942) PR_HOME_ADDRESS_POST_OFFICE_BOX_W = PROP_TAG( PT_UNICODE, 14942) PR_HOME_ADDRESS_POST_OFFICE_BOX_A = PROP_TAG( PT_STRING8, 14942) PR_OTHER_ADDRESS_CITY = PROP_TAG( PT_TSTRING, 14943) PR_OTHER_ADDRESS_CITY_W = PROP_TAG( PT_UNICODE, 14943) PR_OTHER_ADDRESS_CITY_A = PROP_TAG( PT_STRING8, 14943) PR_OTHER_ADDRESS_COUNTRY = PROP_TAG( PT_TSTRING, 14944) PR_OTHER_ADDRESS_COUNTRY_W = PROP_TAG( PT_UNICODE, 14944) PR_OTHER_ADDRESS_COUNTRY_A = PROP_TAG( PT_STRING8, 14944) PR_OTHER_ADDRESS_POSTAL_CODE = PROP_TAG( PT_TSTRING, 14945) PR_OTHER_ADDRESS_POSTAL_CODE_W = PROP_TAG( PT_UNICODE, 14945) PR_OTHER_ADDRESS_POSTAL_CODE_A = PROP_TAG( PT_STRING8, 14945) PR_OTHER_ADDRESS_STATE_OR_PROVINCE = PROP_TAG( PT_TSTRING, 14946) PR_OTHER_ADDRESS_STATE_OR_PROVINCE_W = PROP_TAG( PT_UNICODE, 14946) PR_OTHER_ADDRESS_STATE_OR_PROVINCE_A = PROP_TAG( PT_STRING8, 14946) PR_OTHER_ADDRESS_STREET = PROP_TAG( PT_TSTRING, 14947) PR_OTHER_ADDRESS_STREET_W = PROP_TAG( PT_UNICODE, 14947) PR_OTHER_ADDRESS_STREET_A = PROP_TAG( PT_STRING8, 14947) PR_OTHER_ADDRESS_POST_OFFICE_BOX = PROP_TAG( PT_TSTRING, 14948) PR_OTHER_ADDRESS_POST_OFFICE_BOX_W = PROP_TAG( PT_UNICODE, 14948) PR_OTHER_ADDRESS_POST_OFFICE_BOX_A = PROP_TAG( PT_STRING8, 14948) PR_STORE_PROVIDERS = PROP_TAG( PT_BINARY, 15616) PR_AB_PROVIDERS = PROP_TAG( PT_BINARY, 15617) PR_TRANSPORT_PROVIDERS = PROP_TAG( PT_BINARY, 15618) PR_DEFAULT_PROFILE = PROP_TAG( PT_BOOLEAN, 15620) PR_AB_SEARCH_PATH = PROP_TAG( PT_MV_BINARY, 15621) PR_AB_DEFAULT_DIR = PROP_TAG( PT_BINARY, 15622) PR_AB_DEFAULT_PAB = PROP_TAG( PT_BINARY, 15623) PR_FILTERING_HOOKS = PROP_TAG( PT_BINARY, 15624) PR_SERVICE_NAME = PROP_TAG( PT_TSTRING, 15625) PR_SERVICE_NAME_W = PROP_TAG( PT_UNICODE, 15625) PR_SERVICE_NAME_A = PROP_TAG( PT_STRING8, 15625) PR_SERVICE_DLL_NAME = PROP_TAG( PT_TSTRING, 15626) PR_SERVICE_DLL_NAME_W = PROP_TAG( PT_UNICODE, 15626) PR_SERVICE_DLL_NAME_A = PROP_TAG( PT_STRING8, 15626) PR_SERVICE_ENTRY_NAME = PROP_TAG( PT_STRING8, 15627) PR_SERVICE_UID = PROP_TAG( PT_BINARY, 15628) PR_SERVICE_EXTRA_UIDS = PROP_TAG( PT_BINARY, 15629) PR_SERVICES = PROP_TAG( PT_BINARY, 15630) PR_SERVICE_SUPPORT_FILES = PROP_TAG( PT_MV_TSTRING, 15631) PR_SERVICE_SUPPORT_FILES_W = PROP_TAG( PT_MV_UNICODE, 15631) PR_SERVICE_SUPPORT_FILES_A = PROP_TAG( PT_MV_STRING8, 15631) PR_SERVICE_DELETE_FILES = PROP_TAG( PT_MV_TSTRING, 15632) PR_SERVICE_DELETE_FILES_W = PROP_TAG( PT_MV_UNICODE, 15632) PR_SERVICE_DELETE_FILES_A = PROP_TAG( PT_MV_STRING8, 15632) PR_AB_SEARCH_PATH_UPDATE = PROP_TAG( PT_BINARY, 15633) PR_PROFILE_NAME = PROP_TAG( PT_TSTRING, 15634) PR_PROFILE_NAME_A = PROP_TAG( PT_STRING8, 15634) PR_PROFILE_NAME_W = PROP_TAG( PT_UNICODE, 15634) PR_IDENTITY_DISPLAY = PROP_TAG( PT_TSTRING, 15872) PR_IDENTITY_DISPLAY_W = PROP_TAG( PT_UNICODE, 15872) PR_IDENTITY_DISPLAY_A = PROP_TAG( PT_STRING8, 15872) PR_IDENTITY_ENTRYID = PROP_TAG( PT_BINARY, 15873) PR_RESOURCE_METHODS = PROP_TAG( PT_LONG, 15874) PR_RESOURCE_TYPE = PROP_TAG( PT_LONG, 15875) PR_STATUS_CODE = PROP_TAG( PT_LONG, 15876) PR_IDENTITY_SEARCH_KEY = PROP_TAG( PT_BINARY, 15877) PR_OWN_STORE_ENTRYID = PROP_TAG( PT_BINARY, 15878) PR_RESOURCE_PATH = PROP_TAG( PT_TSTRING, 15879) PR_RESOURCE_PATH_W = PROP_TAG( PT_UNICODE, 15879) PR_RESOURCE_PATH_A = PROP_TAG( PT_STRING8, 15879) PR_STATUS_STRING = PROP_TAG( PT_TSTRING, 15880) PR_STATUS_STRING_W = PROP_TAG( PT_UNICODE, 15880) PR_STATUS_STRING_A = PROP_TAG( PT_STRING8, 15880) PR_X400_DEFERRED_DELIVERY_CANCEL = PROP_TAG( PT_BOOLEAN, 15881) PR_HEADER_FOLDER_ENTRYID = PROP_TAG( PT_BINARY, 15882) PR_REMOTE_PROGRESS = PROP_TAG( PT_LONG, 15883) PR_REMOTE_PROGRESS_TEXT = PROP_TAG( PT_TSTRING, 15884) PR_REMOTE_PROGRESS_TEXT_W = PROP_TAG( PT_UNICODE, 15884) PR_REMOTE_PROGRESS_TEXT_A = PROP_TAG( PT_STRING8, 15884) PR_REMOTE_VALIDATE_OK = PROP_TAG( PT_BOOLEAN, 15885) PR_CONTROL_FLAGS = PROP_TAG( PT_LONG, 16128) PR_CONTROL_STRUCTURE = PROP_TAG( PT_BINARY, 16129) PR_CONTROL_TYPE = PROP_TAG( PT_LONG, 16130) PR_DELTAX = PROP_TAG( PT_LONG, 16131) PR_DELTAY = PROP_TAG( PT_LONG, 16132) PR_XPOS = PROP_TAG( PT_LONG, 16133) PR_YPOS = PROP_TAG( PT_LONG, 16134) PR_CONTROL_ID = PROP_TAG( PT_BINARY, 16135) PR_INITIAL_DETAILS_PANE = PROP_TAG( PT_LONG, 16136) PROP_ID_SECURE_MIN = 26608 PROP_ID_SECURE_MAX = 26623 # From EDKMDB.H pidExchangeXmitReservedMin = 16352 pidExchangeNonXmitReservedMin = 26080 pidProfileMin = 26112 pidStoreMin = 26136 pidFolderMin = 26168 pidMessageReadOnlyMin = 26176 pidMessageWriteableMin = 26200 pidAttachReadOnlyMin = 26220 pidSpecialMin = 26224 pidAdminMin = 26256 pidSecureProfileMin = PROP_ID_SECURE_MIN PR_PROFILE_VERSION = PROP_TAG( PT_LONG, pidProfileMin+0) PR_PROFILE_CONFIG_FLAGS = PROP_TAG( PT_LONG, pidProfileMin+1) PR_PROFILE_HOME_SERVER = PROP_TAG( PT_STRING8, pidProfileMin+2) PR_PROFILE_HOME_SERVER_DN = PROP_TAG( PT_STRING8, pidProfileMin+18) PR_PROFILE_HOME_SERVER_ADDRS = PROP_TAG( PT_MV_STRING8, pidProfileMin+19) PR_PROFILE_USER = PROP_TAG( PT_STRING8, pidProfileMin+3) PR_PROFILE_CONNECT_FLAGS = PROP_TAG( PT_LONG, pidProfileMin+4) PR_PROFILE_TRANSPORT_FLAGS = PROP_TAG( PT_LONG, pidProfileMin+5) PR_PROFILE_UI_STATE = PROP_TAG( PT_LONG, pidProfileMin+6) PR_PROFILE_UNRESOLVED_NAME = PROP_TAG( PT_STRING8, pidProfileMin+7) PR_PROFILE_UNRESOLVED_SERVER = PROP_TAG( PT_STRING8, pidProfileMin+8) PR_PROFILE_BINDING_ORDER = PROP_TAG( PT_STRING8, pidProfileMin+9) PR_PROFILE_MAX_RESTRICT = PROP_TAG( PT_LONG, pidProfileMin+13) PR_PROFILE_AB_FILES_PATH = PROP_TAG( PT_STRING8, pidProfileMin+14) PR_PROFILE_OFFLINE_STORE_PATH = PROP_TAG( PT_STRING8, pidProfileMin+16) PR_PROFILE_OFFLINE_INFO = PROP_TAG( PT_BINARY, pidProfileMin+17) PR_PROFILE_ADDR_INFO = PROP_TAG( PT_BINARY, pidSpecialMin+23) PR_PROFILE_OPTIONS_DATA = PROP_TAG( PT_BINARY, pidSpecialMin+25) PR_PROFILE_SECURE_MAILBOX = PROP_TAG( PT_BINARY, pidSecureProfileMin + 0) PR_DISABLE_WINSOCK = PROP_TAG( PT_LONG, pidProfileMin+24) PR_OST_ENCRYPTION = PROP_TAG(PT_LONG, 26370) PR_PROFILE_OPEN_FLAGS = PROP_TAG( PT_LONG, pidProfileMin+9) PR_PROFILE_TYPE = PROP_TAG( PT_LONG, pidProfileMin+10) PR_PROFILE_MAILBOX = PROP_TAG( PT_STRING8, pidProfileMin+11) PR_PROFILE_SERVER = PROP_TAG( PT_STRING8, pidProfileMin+12) PR_PROFILE_SERVER_DN = PROP_TAG( PT_STRING8, pidProfileMin+20) PR_PROFILE_FAVFLD_DISPLAY_NAME = PROP_TAG(PT_STRING8, pidProfileMin+15) PR_PROFILE_FAVFLD_COMMENT = PROP_TAG(PT_STRING8, pidProfileMin+21) PR_PROFILE_ALLPUB_DISPLAY_NAME = PROP_TAG(PT_STRING8, pidProfileMin+22) PR_PROFILE_ALLPUB_COMMENT = PROP_TAG(PT_STRING8, pidProfileMin+23) OSTF_NO_ENCRYPTION = -2147483648 OSTF_COMPRESSABLE_ENCRYPTION = 1073741824 OSTF_BEST_ENCRYPTION = 536870912 PR_NON_IPM_SUBTREE_ENTRYID = PROP_TAG( PT_BINARY, pidStoreMin+8) PR_EFORMS_REGISTRY_ENTRYID = PROP_TAG( PT_BINARY, pidStoreMin+9) PR_SPLUS_FREE_BUSY_ENTRYID = PROP_TAG( PT_BINARY, pidStoreMin+10) PR_OFFLINE_ADDRBOOK_ENTRYID = PROP_TAG( PT_BINARY, pidStoreMin+11) PR_EFORMS_FOR_LOCALE_ENTRYID = PROP_TAG( PT_BINARY, pidStoreMin+12) PR_FREE_BUSY_FOR_LOCAL_SITE_ENTRYID = PROP_TAG( PT_BINARY, pidStoreMin+13) PR_ADDRBOOK_FOR_LOCAL_SITE_ENTRYID = PROP_TAG( PT_BINARY, pidStoreMin+14) PR_OFFLINE_MESSAGE_ENTRYID = PROP_TAG( PT_BINARY, pidStoreMin+15) PR_IPM_FAVORITES_ENTRYID = PROP_TAG( PT_BINARY, pidStoreMin+24) PR_IPM_PUBLIC_FOLDERS_ENTRYID = PROP_TAG( PT_BINARY, pidStoreMin+25) PR_GW_MTSIN_ENTRYID = PROP_TAG( PT_BINARY, pidStoreMin+16) PR_GW_MTSOUT_ENTRYID = PROP_TAG( PT_BINARY, pidStoreMin+17) PR_TRANSFER_ENABLED = PROP_TAG( PT_BOOLEAN, pidStoreMin+18) PR_TEST_LINE_SPEED = PROP_TAG( PT_BINARY, pidStoreMin+19) PR_HIERARCHY_SYNCHRONIZER = PROP_TAG( PT_OBJECT, pidStoreMin+20) PR_CONTENTS_SYNCHRONIZER = PROP_TAG( PT_OBJECT, pidStoreMin+21) PR_COLLECTOR = PROP_TAG( PT_OBJECT, pidStoreMin+22) PR_FAST_TRANSFER = PROP_TAG( PT_OBJECT, pidStoreMin+23) PR_STORE_OFFLINE = PROP_TAG( PT_BOOLEAN, pidStoreMin+26) PR_IN_TRANSIT = PROP_TAG( PT_BOOLEAN, pidStoreMin) PR_REPLICATION_STYLE = PROP_TAG( PT_LONG, pidAdminMin) PR_REPLICATION_SCHEDULE = PROP_TAG( PT_BINARY, pidAdminMin+1) PR_REPLICATION_MESSAGE_PRIORITY = PROP_TAG( PT_LONG, pidAdminMin+2) PR_OVERALL_MSG_AGE_LIMIT = PROP_TAG( PT_LONG, pidAdminMin+3 ) PR_REPLICATION_ALWAYS_INTERVAL = PROP_TAG( PT_LONG, pidAdminMin+4 ) PR_REPLICATION_MSG_SIZE = PROP_TAG( PT_LONG, pidAdminMin+5 ) STYLE_ALWAYS_INTERVAL_DEFAULT = 15 REPLICATION_MESSAGE_SIZE_LIMIT_DEFAULT = 100 STYLE_NEVER = 0 STYLE_NORMAL = 1 STYLE_ALWAYS = 2 STYLE_DEFAULT = -1 PR_SOURCE_KEY = PROP_TAG( PT_BINARY, pidExchangeNonXmitReservedMin+0) PR_PARENT_SOURCE_KEY = PROP_TAG( PT_BINARY, pidExchangeNonXmitReservedMin+1) PR_CHANGE_KEY = PROP_TAG( PT_BINARY, pidExchangeNonXmitReservedMin+2) PR_PREDECESSOR_CHANGE_LIST = PROP_TAG( PT_BINARY, pidExchangeNonXmitReservedMin+3) PR_FOLDER_CHILD_COUNT = PROP_TAG( PT_LONG, pidFolderMin) PR_RIGHTS = PROP_TAG( PT_LONG, pidFolderMin+1) PR_ACL_TABLE = PROP_TAG( PT_OBJECT, pidExchangeXmitReservedMin) PR_RULES_TABLE = PROP_TAG( PT_OBJECT, pidExchangeXmitReservedMin+1) PR_HAS_RULES = PROP_TAG( PT_BOOLEAN, pidFolderMin+2) PR_ADDRESS_BOOK_ENTRYID = PROP_TAG( PT_BINARY, pidFolderMin+3) PR_ACL_DATA = PROP_TAG( PT_BINARY, pidExchangeXmitReservedMin) PR_RULES_DATA = PROP_TAG( PT_BINARY, pidExchangeXmitReservedMin+1) PR_FOLDER_DESIGN_FLAGS = PROP_TAG( PT_LONG, pidExchangeXmitReservedMin+2) PR_DESIGN_IN_PROGRESS = PROP_TAG( PT_BOOLEAN, pidExchangeXmitReservedMin+4) PR_SECURE_ORIGINATION = PROP_TAG( PT_BOOLEAN, pidExchangeXmitReservedMin+5) PR_PUBLISH_IN_ADDRESS_BOOK = PROP_TAG( PT_BOOLEAN, pidExchangeXmitReservedMin+6) PR_RESOLVE_METHOD = PROP_TAG( PT_LONG, pidExchangeXmitReservedMin+7) PR_ADDRESS_BOOK_DISPLAY_NAME = PROP_TAG( PT_TSTRING, pidExchangeXmitReservedMin+8) PR_EFORMS_LOCALE_ID = PROP_TAG( PT_LONG, pidExchangeXmitReservedMin+9) PR_REPLICA_LIST = PROP_TAG( PT_BINARY, pidAdminMin+8) PR_OVERALL_AGE_LIMIT = PROP_TAG( PT_LONG, pidAdminMin+9) RESOLVE_METHOD_DEFAULT = 0 RESOLVE_METHOD_LAST_WRITER_WINS = 1 RESOLVE_METHOD_NO_CONFLICT_NOTIFICATION = 2 PR_PUBLIC_FOLDER_ENTRYID = PROP_TAG( PT_BINARY, pidFolderMin+4) PR_HAS_NAMED_PROPERTIES = PROP_TAG(PT_BOOLEAN, pidMessageReadOnlyMin+10) PR_CREATOR_NAME = PROP_TAG(PT_TSTRING, pidExchangeXmitReservedMin+24) PR_CREATOR_ENTRYID = PROP_TAG(PT_BINARY, pidExchangeXmitReservedMin+25) PR_LAST_MODIFIER_NAME = PROP_TAG(PT_TSTRING, pidExchangeXmitReservedMin+26) PR_LAST_MODIFIER_ENTRYID = PROP_TAG(PT_BINARY, pidExchangeXmitReservedMin+27) PR_HAS_DAMS = PROP_TAG( PT_BOOLEAN, pidExchangeXmitReservedMin+10) PR_RULE_TRIGGER_HISTORY = PROP_TAG( PT_BINARY, pidExchangeXmitReservedMin+18) PR_MOVE_TO_STORE_ENTRYID = PROP_TAG( PT_BINARY, pidExchangeXmitReservedMin+19) PR_MOVE_TO_FOLDER_ENTRYID = PROP_TAG( PT_BINARY, pidExchangeXmitReservedMin+20) PR_REPLICA_SERVER = PROP_TAG(PT_TSTRING, pidMessageReadOnlyMin+4) PR_DEFERRED_SEND_NUMBER = PROP_TAG( PT_LONG, pidExchangeXmitReservedMin+11) PR_DEFERRED_SEND_UNITS = PROP_TAG( PT_LONG, pidExchangeXmitReservedMin+12) PR_EXPIRY_NUMBER = PROP_TAG( PT_LONG, pidExchangeXmitReservedMin+13) PR_EXPIRY_UNITS = PROP_TAG( PT_LONG, pidExchangeXmitReservedMin+14) PR_DEFERRED_SEND_TIME = PROP_TAG( PT_SYSTIME, pidExchangeXmitReservedMin+15) PR_GW_ADMIN_OPERATIONS = PROP_TAG( PT_LONG, pidMessageWriteableMin) PR_P1_CONTENT = PROP_TAG( PT_BINARY, 4352) PR_P1_CONTENT_TYPE = PROP_TAG( PT_BINARY, 4353) PR_CLIENT_ACTIONS = PROP_TAG(PT_BINARY, pidMessageReadOnlyMin+5) PR_DAM_ORIGINAL_ENTRYID = PROP_TAG(PT_BINARY, pidMessageReadOnlyMin+6) PR_DAM_BACK_PATCHED = PROP_TAG( PT_BOOLEAN, pidMessageReadOnlyMin+7) PR_RULE_ERROR = PROP_TAG(PT_LONG, pidMessageReadOnlyMin+8) PR_RULE_ACTION_TYPE = PROP_TAG(PT_LONG, pidMessageReadOnlyMin+9) PR_RULE_ACTION_NUMBER = PROP_TAG(PT_LONG, pidMessageReadOnlyMin+16) PR_RULE_FOLDER_ENTRYID = PROP_TAG(PT_BINARY, pidMessageReadOnlyMin+17) PR_CONFLICT_ENTRYID = PROP_TAG(PT_BINARY, pidExchangeXmitReservedMin+16) PR_MESSAGE_LOCALE_ID = PROP_TAG(PT_LONG, pidExchangeXmitReservedMin+17) PR_STORAGE_QUOTA_LIMIT = PROP_TAG(PT_LONG, pidExchangeXmitReservedMin+21) PR_EXCESS_STORAGE_USED = PROP_TAG(PT_LONG, pidExchangeXmitReservedMin+22) PR_SVR_GENERATING_QUOTA_MSG = PROP_TAG(PT_TSTRING, pidExchangeXmitReservedMin+23) PR_DELEGATED_BY_RULE = PROP_TAG( PT_BOOLEAN, pidExchangeXmitReservedMin+3) MSGSTATUS_IN_CONFLICT = 2048 PR_IN_CONFLICT = PROP_TAG(PT_BOOLEAN, pidAttachReadOnlyMin) PR_LONGTERM_ENTRYID_FROM_TABLE = PROP_TAG(PT_BINARY, pidSpecialMin) PR_ORIGINATOR_NAME = PROP_TAG( PT_TSTRING, pidMessageWriteableMin+3) PR_ORIGINATOR_ADDR = PROP_TAG( PT_TSTRING, pidMessageWriteableMin+4) PR_ORIGINATOR_ADDRTYPE = PROP_TAG( PT_TSTRING, pidMessageWriteableMin+5) PR_ORIGINATOR_ENTRYID = PROP_TAG( PT_BINARY, pidMessageWriteableMin+6) PR_ARRIVAL_TIME = PROP_TAG( PT_SYSTIME, pidMessageWriteableMin+7) PR_TRACE_INFO = PROP_TAG( PT_BINARY, pidMessageWriteableMin+8) PR_INTERNAL_TRACE_INFO = PROP_TAG( PT_BINARY, pidMessageWriteableMin+18) PR_SUBJECT_TRACE_INFO = PROP_TAG( PT_BINARY, pidMessageWriteableMin+9) PR_RECIPIENT_NUMBER = PROP_TAG( PT_LONG, pidMessageWriteableMin+10) PR_MTS_SUBJECT_ID = PROP_TAG(PT_BINARY, pidMessageWriteableMin+11) PR_REPORT_DESTINATION_NAME = PROP_TAG(PT_TSTRING, pidMessageWriteableMin+12) PR_REPORT_DESTINATION_ENTRYID = PROP_TAG(PT_BINARY, pidMessageWriteableMin+13) PR_CONTENT_SEARCH_KEY = PROP_TAG(PT_BINARY, pidMessageWriteableMin+14) PR_FOREIGN_ID = PROP_TAG(PT_BINARY, pidMessageWriteableMin+15) PR_FOREIGN_REPORT_ID = PROP_TAG(PT_BINARY, pidMessageWriteableMin+16) PR_FOREIGN_SUBJECT_ID = PROP_TAG(PT_BINARY, pidMessageWriteableMin+17) PR_MTS_ID = PR_MESSAGE_SUBMISSION_ID PR_MTS_REPORT_ID = PR_MESSAGE_SUBMISSION_ID PR_FOLDER_FLAGS = PROP_TAG( PT_LONG, pidAdminMin+24 ) PR_LAST_ACCESS_TIME = PROP_TAG( PT_SYSTIME, pidAdminMin+25 ) PR_RESTRICTION_COUNT = PROP_TAG( PT_LONG, pidAdminMin+26 ) PR_CATEG_COUNT = PROP_TAG( PT_LONG, pidAdminMin+27 ) PR_CACHED_COLUMN_COUNT = PROP_TAG( PT_LONG, pidAdminMin+28 ) PR_NORMAL_MSG_W_ATTACH_COUNT = PROP_TAG( PT_LONG, pidAdminMin+29 ) PR_ASSOC_MSG_W_ATTACH_COUNT = PROP_TAG( PT_LONG, pidAdminMin+30 ) PR_RECIPIENT_ON_NORMAL_MSG_COUNT = PROP_TAG( PT_LONG, pidAdminMin+31 ) PR_RECIPIENT_ON_ASSOC_MSG_COUNT = PROP_TAG( PT_LONG, pidAdminMin+32 ) PR_ATTACH_ON_NORMAL_MSG_COUNT = PROP_TAG( PT_LONG, pidAdminMin+33 ) PR_ATTACH_ON_ASSOC_MSG_COUNT = PROP_TAG( PT_LONG, pidAdminMin+34 ) PR_NORMAL_MESSAGE_SIZE = PROP_TAG( PT_LONG, pidAdminMin+35 ) PR_NORMAL_MESSAGE_SIZE_EXTENDED = PROP_TAG( PT_I8, pidAdminMin+35 ) PR_ASSOC_MESSAGE_SIZE = PROP_TAG( PT_LONG, pidAdminMin+36 ) PR_ASSOC_MESSAGE_SIZE_EXTENDED = PROP_TAG( PT_I8, pidAdminMin+36 ) PR_FOLDER_PATHNAME = PROP_TAG(PT_TSTRING, pidAdminMin+37 ) PR_OWNER_COUNT = PROP_TAG( PT_LONG, pidAdminMin+38 ) PR_CONTACT_COUNT = PROP_TAG( PT_LONG, pidAdminMin+39 ) PR_MESSAGE_SIZE_EXTENDED = PROP_TAG(PT_I8, PROP_ID(PR_MESSAGE_SIZE)) PR_USERFIELDS = PROP_TAG(PT_BINARY, 0x36e3) # IExchangeManageStoreEx::CreateStoreEntryID2 PR_FORCE_USE_ENTRYID_SERVER = PROP_TAG(PT_BOOLEAN, 0x7CFE) PR_PROFILE_MDB_DN = PROP_TAG(PT_STRING8, 0x7CFF) # MSPST.h PST_EXTERN_PROPID_BASE = 0x6700 PR_PST_PATH = PROP_TAG(PT_STRING8, PST_EXTERN_PROPID_BASE + 0) PR_PST_PATH_W = PROP_TAG(PT_UNICODE, PST_EXTERN_PROPID_BASE + 0) PR_PST_PATH_A = PROP_TAG(PT_STRING8, PST_EXTERN_PROPID_BASE + 0) PR_PST_REMEMBER_PW = PROP_TAG(PT_BOOLEAN, PST_EXTERN_PROPID_BASE + 1) PR_PST_ENCRYPTION = PROP_TAG(PT_LONG, PST_EXTERN_PROPID_BASE + 2) PR_PST_PW_SZ_OLD = PROP_TAG(PT_STRING8, PST_EXTERN_PROPID_BASE + 3) PR_PST_PW_SZ_OLD_W = PROP_TAG(PT_UNICODE, PST_EXTERN_PROPID_BASE + 3) PR_PST_PW_SZ_OLD_A = PROP_TAG(PT_STRING8, PST_EXTERN_PROPID_BASE + 3) PR_PST_PW_SZ_NEW = PROP_TAG(PT_STRING8, PST_EXTERN_PROPID_BASE + 4) PR_PST_PW_SZ_NEW_W = PROP_TAG(PT_UNICODE, PST_EXTERN_PROPID_BASE + 4) PR_PST_PW_SZ_NEW_A = PROP_TAG(PT_STRING8, PST_EXTERN_PROPID_BASE + 4) PK {Rwin32comext/mapi/demos/UT Zx`Zx`ux PK Y03K} } "win32comext/mapi/demos/mapisend.pyUT  YZx`ux #!/usr/bin/env python """module to send mail with Extended MAPI using the pywin32 mapi wrappers...""" # this was based on Jason Hattingh's C++ code at http://www.codeproject.com/internet/mapadmin.asp # written by David Fraser and Stephen Emslie # you can test this by changing the variables at the bottom and running from the command line from win32com.mapi import mapi from win32com.mapi import mapitags def SendEMAPIMail(Subject="", Message="", SendTo=None, SendCC=None, SendBCC=None, MAPIProfile=None): """Sends an email to the recipient using the extended MAPI interface Subject and Message are strings Send{To,CC,BCC} are comma-separated address lists MAPIProfile is the name of the MAPI profile""" # initialize and log on mapi.MAPIInitialize(None) session = mapi.MAPILogonEx(0, MAPIProfile, None, mapi.MAPI_EXTENDED | mapi.MAPI_USE_DEFAULT) messagestorestable = session.GetMsgStoresTable(0) messagestorestable.SetColumns((mapitags.PR_ENTRYID, mapitags.PR_DISPLAY_NAME_A, mapitags.PR_DEFAULT_STORE),0) while True: rows = messagestorestable.QueryRows(1, 0) #if this is the last row then stop if len(rows) != 1: break row = rows[0] #if this is the default store then stop if ((mapitags.PR_DEFAULT_STORE,True) in row): break # unpack the row and open the message store (eid_tag, eid), (name_tag, name), (def_store_tag, def_store) = row msgstore = session.OpenMsgStore(0,eid,None,mapi.MDB_NO_DIALOG | mapi.MAPI_BEST_ACCESS) # get the outbox hr, props = msgstore.GetProps((mapitags.PR_IPM_OUTBOX_ENTRYID), 0) (tag, eid) = props[0] #check for errors if mapitags.PROP_TYPE(tag) == mapitags.PT_ERROR: raise TypeError('got PT_ERROR instead of PT_BINARY: %s'%eid) outboxfolder = msgstore.OpenEntry(eid,None,mapi.MAPI_BEST_ACCESS) # create the message and the addrlist message = outboxfolder.CreateMessage(None,0) # note: you can use the resolveaddress functions for this. but you may get headaches pal = [] def makeentry(recipient, recipienttype): return ((mapitags.PR_RECIPIENT_TYPE, recipienttype), (mapitags.PR_SEND_RICH_INFO, False), (mapitags.PR_DISPLAY_TYPE, 0), (mapitags.PR_OBJECT_TYPE, 6), (mapitags.PR_EMAIL_ADDRESS_A, recipient), (mapitags.PR_ADDRTYPE_A, 'SMTP'), (mapitags.PR_DISPLAY_NAME_A, recipient)) if SendTo: pal.extend([makeentry(recipient, mapi.MAPI_TO) for recipient in SendTo.split(",")]) if SendCC: pal.extend([makeentry(recipient, mapi.MAPI_CC) for recipient in SendCC.split(",")]) if SendBCC: pal.extend([makeentry(recipient, mapi.MAPI_BCC) for recipient in SendBCC.split(",")]) # add the resolved recipients to the message message.ModifyRecipients(mapi.MODRECIP_ADD,pal) message.SetProps([(mapitags.PR_BODY_A,Message), (mapitags.PR_SUBJECT_A,Subject)]) # save changes and submit outboxfolder.SaveChanges(0) message.SubmitMessage(0) if __name__ == '__main__': MAPIProfile = "" # Change this to a valid email address to test SendTo = "an.invalid at address" SendMessage = "testing one two three" SendSubject = "Testing Extended MAPI!!" SendEMAPIMail(SendSubject, SendMessage, SendTo, MAPIProfile=MAPIProfile) PK ѳPАwin32comext/mapi/mapiutil.pyUT l_Zx`ux # General utilities for MAPI and MAPI objects. # We used to use these old names from the 'types' module... TupleType=tuple ListType=list IntType=int from pywintypes import TimeType import pythoncom from . import mapi, mapitags prTable = {} def GetPropTagName(pt): if not prTable: for name, value in mapitags.__dict__.items(): if name[:3] == 'PR_': # Store both the full ID (including type) and just the ID. # This is so PR_FOO_A and PR_FOO_W are still differentiated, # but should we get a PT_FOO with PT_ERROR set, we fallback # to the ID. # String types should have 3 definitions in mapitags.py # PR_BODY = PROP_TAG( PT_TSTRING, 4096) # PR_BODY_W = PROP_TAG( PT_UNICODE, 4096) # PR_BODY_A = PROP_TAG( PT_STRING8, 4096) # The following change ensures a lookup using only the the # property id returns the conditional default. # PT_TSTRING is a conditional assignment for either PT_UNICODE or # PT_STRING8 and should not be returned during a lookup. if mapitags.PROP_TYPE(value) == mapitags.PT_UNICODE or \ mapitags.PROP_TYPE(value) == mapitags.PT_STRING8: if name[-2:] == '_A' or name[-2:] == '_W': prTable[value] = name else: prTable[mapitags.PROP_ID(value)] = name else: prTable[value] = name prTable[mapitags.PROP_ID(value)] = name try: try: return prTable[pt] except KeyError: # Can't find it exactly - see if the raw ID exists. return prTable[mapitags.PROP_ID(pt)] except KeyError: # god-damn bullshit hex() warnings: I don't see a way to get the # old behaviour without a warning!! ret = hex(int(pt)) # -0x8000000L -> 0x80000000 if ret[0]=='-': ret = ret[1:] if ret[-1]=='L': ret = ret[:-1] return ret mapiErrorTable = {} def GetScodeString(hr): if not mapiErrorTable: for name, value in mapi.__dict__.items(): if name[:7] in ['MAPI_E_', 'MAPI_W_']: mapiErrorTable[value] = name return mapiErrorTable.get(hr, pythoncom.GetScodeString(hr)) ptTable = {} def GetMapiTypeName(propType, rawType=True): """Given a mapi type flag, return a string description of the type""" if not ptTable: for name, value in mapitags.__dict__.items(): if name[:3] == 'PT_': # PT_TSTRING is a conditional assignment # for either PT_UNICODE or PT_STRING8 and # should not be returned during a lookup. if name in ['PT_TSTRING', 'PT_MV_TSTRING']: continue ptTable[value] = name if rawType: propType = propType & ~mapitags.MV_FLAG return ptTable.get(propType, str(hex(propType))) def GetProperties(obj, propList): """Given a MAPI object and a list of properties, return a list of property values. Allows a single property to be passed, and the result is a single object. Each request property can be an integer or a string. Of a string, it is automatically converted to an integer via the GetIdsFromNames function. If the property fetch fails, the result is None. """ bRetList = 1 if type(propList) not in [TupleType, ListType]: bRetList = 0 propList = (propList,) realPropList = [] rc = [] for prop in propList: if type(prop)!=IntType: # Integer props = ( (mapi.PS_PUBLIC_STRINGS, prop), ) propIds = obj.GetIDsFromNames(props, 0) prop = mapitags.PROP_TAG( mapitags.PT_UNSPECIFIED, mapitags.PROP_ID(propIds[0])) realPropList.append(prop) hr, data = obj.GetProps(realPropList,0) if hr != 0: data = None return None if bRetList: return [v[1] for v in data] else: return data[0][1] def GetAllProperties(obj, make_tag_names = True): tags = obj.GetPropList(0) hr, data = obj.GetProps(tags) ret = [] for tag, val in data: if make_tag_names: hr, tags, array = obj.GetNamesFromIDs( (tag,) ) if type(array[0][1])==type(''): name = array[0][1] else: name = GetPropTagName(tag) else: name = tag ret.append((name, val)) return ret _MapiTypeMap = { type(0.0): mapitags.PT_DOUBLE, type(0): mapitags.PT_I4, type(''.encode('ascii')): mapitags.PT_STRING8, # bytes type(''): mapitags.PT_UNICODE, # str type(None): mapitags.PT_UNSPECIFIED, # In Python 2.2.2, bool isn't a distinct type (type(1==1) is type(0)). # (markh thinks the above is trying to say that in 2020, we probably *do* # want bool in this map? :) } def SetPropertyValue(obj, prop, val): if type(prop)!=IntType: props = ( (mapi.PS_PUBLIC_STRINGS, prop), ) propIds = obj.GetIDsFromNames(props, mapi.MAPI_CREATE) if val == (1==1) or val == (1==0): type_tag = mapitags.PT_BOOLEAN else: type_tag = _MapiTypeMap.get(type(val)) if type_tag is None: raise ValueError("Don't know what to do with '%r' ('%s')" % (val, type(val))) prop = mapitags.PROP_TAG( type_tag, mapitags.PROP_ID(propIds[0])) if val is None: # Delete the property obj.DeleteProps((prop,)) else: obj.SetProps(((prop,val),)) def SetProperties( msg, propDict): """ Given a Python dictionary, set the objects properties. If the dictionary key is a string, then a property ID is queried otherwise the ID is assumed native. Coded for maximum efficiency wrt server calls - ie, maximum of 2 calls made to the object, regardless of the dictionary contents (only 1 if dictionary full of int keys) """ newProps = [] # First pass over the properties we should get IDs for. for key, val in propDict.items(): if type(key) == str: newProps.append((mapi.PS_PUBLIC_STRINGS, key)) # Query for the new IDs if newProps: newIds = msg.GetIDsFromNames(newProps, mapi.MAPI_CREATE) newIdNo = 0 newProps = [] for key, val in propDict.items(): if type(key) == str: type_val=type(val) if type_val == str: tagType = mapitags.PT_UNICODE elif type_val==IntType: tagType = mapitags.PT_I4 elif type_val==TimeType: tagType = mapitags.PT_SYSTIME else: raise ValueError("The type of object %s(%s) can not be written" % (repr(val),type_val)) key = mapitags.PROP_TAG(tagType, mapitags.PROP_ID(newIds[newIdNo])) newIdNo = newIdNo + 1 newProps.append( (key, val) ) msg.SetProps(newProps) PK {Rwin32comext/taskscheduler/UT Zx`Zx`ux PK {Rwin32comext/taskscheduler/test/UT Zx`Zx`ux PK Y03KX"/GEE2win32comext/taskscheduler/test/test_localsystem.pyUT  YZx`ux f=open('test_localsystem.txt','w') f.write('I have run\n') f.close() PK ѳPthh0win32comext/taskscheduler/test/test_addtask_2.pyUT l_Zx`ux import pythoncom, time, win32api from win32com.taskscheduler import taskscheduler task_name='test_addtask_2.job' ts=pythoncom.CoCreateInstance(taskscheduler.CLSID_CTaskScheduler,None, pythoncom.CLSCTX_INPROC_SERVER,taskscheduler.IID_ITaskScheduler) tasks=ts.Enum() for task in tasks: print(task) if task_name in tasks: print('Deleting existing task '+task_name) ts.Delete(task_name) t=ts.NewWorkItem(task_name) t.SetComment('Test a task running as local system acct') t.SetApplicationName('c:\\python23\\python.exe') t.SetPriority(taskscheduler.REALTIME_PRIORITY_CLASS) t.SetParameters('test_localsystem.py') t.SetWorkingDirectory('c:\\python23') t.SetCreator('test_addtask_2.py') t.SetMaxRunTime(20000) #milliseconds t.SetFlags(taskscheduler.TASK_FLAG_DELETE_WHEN_DONE) t.SetAccountInformation('',None) ## empty string for account name means to use local system ## None is only valid for local system acct or if task flags contain TASK_FLAG_RUN_ONLY_IF_LOGGED_ON run_time = time.localtime(time.time() + 60) tr_ind, tr=t.CreateTrigger() tt=tr.GetTrigger() tt.Flags=0 ## flags for a new trigger default to TASK_TRIGGER_FLAG_DISABLED (4), make sure to clear them if not using any tt.TriggerType=taskscheduler.TASK_TIME_TRIGGER_ONCE tt.BeginYear=int(time.strftime('%Y',run_time)) tt.BeginMonth=int(time.strftime('%m',run_time)) tt.BeginDay=int(time.strftime('%d',run_time)) tt.StartMinute=int(time.strftime('%M',run_time)) tt.StartHour=int(time.strftime('%H',run_time)) tr.SetTrigger(tt) print(t.GetTriggerString(tr_ind)) pf=t.QueryInterface(pythoncom.IID_IPersistFile) pf.Save(None,1) PK ѳPc,,0win32comext/taskscheduler/test/test_addtask_1.pyUT l_Zx`ux import pythoncom, time, win32api from win32com.taskscheduler import taskscheduler test_task_name='test_addtask_1.job' ts=pythoncom.CoCreateInstance(taskscheduler.CLSID_CTaskScheduler,None, pythoncom.CLSCTX_INPROC_SERVER,taskscheduler.IID_ITaskScheduler) tasks=ts.Enum() for task in tasks: print(task) if test_task_name in tasks: print('Deleting existing task '+test_task_name) ts.Delete(test_task_name) new_task=pythoncom.CoCreateInstance(taskscheduler.CLSID_CTask,None, pythoncom.CLSCTX_INPROC_SERVER,taskscheduler.IID_ITask) ts.AddWorkItem(test_task_name,new_task) ## task object is modified in place new_task.SetFlags(taskscheduler.TASK_FLAG_INTERACTIVE|taskscheduler.TASK_FLAG_RUN_ONLY_IF_LOGGED_ON) new_task.SetIdleWait(1,10000) new_task.SetComment('test task with idle trigger') new_task.SetApplicationName('c:\\python23\\python.exe') new_task.SetPriority(taskscheduler.REALTIME_PRIORITY_CLASS) new_task.SetParameters('-c"import win32ui,time;win32ui.MessageBox(\'why aint you doing no work ?\');"') new_task.SetWorkingDirectory('c:\\python23') new_task.SetCreator('test_addtask_1.py') new_task.SetAccountInformation(win32api.GetUserName(),None) ## None is only valid for local system acct or if Flags contain TASK_FLAG_RUN_ONLY_IF_LOGGED_ON run_time = time.localtime(time.time() + 30) end_time = time.localtime(time.time() + 60*60*24) tr_ind, tr=new_task.CreateTrigger() tt=tr.GetTrigger() tt.TriggerType=taskscheduler.TASK_EVENT_TRIGGER_ON_IDLE tt.Flags=taskscheduler.TASK_TRIGGER_FLAG_HAS_END_DATE tt.BeginYear=int(time.strftime('%Y',run_time)) tt.BeginMonth=int(time.strftime('%m',run_time)) tt.BeginDay=int(time.strftime('%d',run_time)) tt.StartMinute=int(time.strftime('%M',run_time)) tt.StartHour=int(time.strftime('%H',run_time)) tt.EndYear=int(time.strftime('%Y',end_time)) tt.EndMonth=int(time.strftime('%m',end_time)) tt.EndDay=int(time.strftime('%d',end_time)) tr.SetTrigger(tt) print(new_task.GetTriggerString(tr_ind)) pf=new_task.QueryInterface(pythoncom.IID_IPersistFile) pf.Save(None,1) PK ѳP+9HH.win32comext/taskscheduler/test/test_addtask.pyUT l_Zx`ux import pythoncom, sys, os, time, win32api from win32com.taskscheduler import taskscheduler task_name='test_addtask.job' ts=pythoncom.CoCreateInstance(taskscheduler.CLSID_CTaskScheduler,None, pythoncom.CLSCTX_INPROC_SERVER,taskscheduler.IID_ITaskScheduler) tasks=ts.Enum() for task in tasks: print(task) if task_name in tasks: print('Deleting existing task '+task_name) ts.Delete(task_name) t=ts.NewWorkItem(task_name) t.SetComment('rude comments') t.SetApplicationName(sys.executable) t.SetPriority(taskscheduler.REALTIME_PRIORITY_CLASS) t.SetParameters('-c"import win32ui,time;win32ui.MessageBox(\'hey bubba I am running\');"') t.SetWorkingDirectory(os.path.dirname(sys.executable)) t.SetCreator('test_addtask.py') t.SetMaxRunTime(20000) #milliseconds t.SetFlags(taskscheduler.TASK_FLAG_INTERACTIVE|taskscheduler.TASK_FLAG_RUN_ONLY_IF_LOGGED_ON) ## |taskscheduler.TASK_FLAG_DELETE_WHEN_DONE) #task self destructs when no more future run times t.SetAccountInformation(win32api.GetUserName(),None) ## None is only valid for local system acct or if task flags contain TASK_FLAG_RUN_ONLY_IF_LOGGED_ON t.SetWorkItemData('some binary garbage') run_time = time.localtime(time.time() + 60) tr_ind, tr=t.CreateTrigger() tt=tr.GetTrigger() ## flags default to TASK_TRIGGER_FLAG_DISABLED (4) tt.Flags=taskscheduler.TASK_TRIGGER_FLAG_KILL_AT_DURATION_END tt.BeginYear=int(time.strftime('%Y',run_time)) tt.BeginMonth=int(time.strftime('%m',run_time)) tt.BeginDay=int(time.strftime('%d',run_time)) tt.StartMinute=int(time.strftime('%M',run_time)) tt.StartHour=int(time.strftime('%H',run_time)) tt.MinutesInterval=1 tt.MinutesDuration=5 tt.TriggerType=taskscheduler.TASK_TIME_TRIGGER_MONTHLYDATE #months can contain multiples in a bitmask, use 1<<(month_nbr-1) tt.MonthlyDate_Months=1<<(int(time.strftime('%m',run_time))-1) ## corresponds to TASK_JANUARY..TASK_DECEMBER constants #days too tt.MonthlyDate_Days=1<<(int(time.strftime('%d',run_time))-1) tr.SetTrigger(tt) print(t.GetTriggerString(tr_ind)) pf=t.QueryInterface(pythoncom.IID_IPersistFile) pf.Save(None,1) PK t$nQs+win32comext/taskscheduler/taskscheduler.pydUT ^_ux MZ@ !L!This program cannot be run in DOS mode. $;UUUUTUVUPUQUQTUTU刜TUTU刜RUQPUQUUQWURichUPEL^_! FNH`@0pd$ {T(|@`.text{EF `.rdata03`4J@@.data~@.gfidsL@@.rsrcd@@.reloc$ @Bh@hj5E+PQgYYt'x$|!EE3Ɂ8ËeE2 Ut}u 3X]U=tt} uu]uUYY]U졔3\uȃu h\YY#E]U졔3hȃu]uhhYY]UuYH]T{UEVT{t j VYY^]UE t3t tt3@0"uuY}PY] jh8JjPYu3BE]e=TtjTwte h0P + $O> $aha YYu)t haha YYT2ۈ]EDL >tVUYtu ju6Sx3@Ê]uYj hX8x3OHx0Ee=Ttj%TEjukYY3Ʉu0Yj hx} u9=x3et t]1]SWuuSWuuSWuquu"uSPuYSVuSVu`tuHSWuout5SWu:$MQ0hEuu uËe3uEUV5X{u3@uu u^] U]U} uuu u ] UaaEA{]UVuX{^]aaA{{UVu%{^]aaA{{UVF`{ `PEPI YY^]UE`{aaA]A`{P YÍA`{P YÍA`{P YUVF`{P EYt j VYY^]UVF`{P EYt j V^YY^]UVF`{P EYt j V1YY^]U MhEPY U Mh脃EP< ̋Auh{ U%|(S3C j me3 3VW|}S[wOW E؋MEineIE5ntel ȋEj5Genu XjYS[wOW uCE%?=t#=`t=pt=Pt=`t=pu===}EEEEE|2jX3S[]؉sKS EܩEEt =_^tm |tUtN3ЉEUEM3Ƀu3u/|E t |3[]3@39U$SVjtM)3hVP58 |xffftfpflfhEEDž@jPEVPE E@EE`VXۍEEۉE`EP `u !^[]UDjDEjP? EP`EtEj X]3j`ȅu2øMZf9uA<8PEu f9HuۃxtvՃh(N`UE8csmu%xu@= t=!t="t =@t3]̃%%ahNd5D$l$l$+SVW1E3PeuEEEEdËMd Y__^[]QUuuu uhnPh]UeeVWN@;t t УfEP(`E3EE$`1E `1EEP`ME3M3M3;uO@u G ȉ щ _^]U} u=X{u u,`3@] h0`h@YøøHHHH̸SV,,;sW>t N׃;r_^[SV44;sW>t #׃;r_^[Ë a3[P; u(Uj`u `h 4`P8`]U$jtjY) 5=ff fff%f-|EEE jXkǀjXk LjX Lh{]Uj]UjtM) 5=ff fff%f-|EEE jXkMh{]U j tM) 5=ff fff%f-|EEE } v }ue } vE HE E @jXkMeE@EE;E sEMU h{]%`%`%`% `%`%`%`%`% `%$`%(`%,`%0`%4`%8`%@`%D`%X`%T`%P`%L`%H`%``%d`%`%`%p`%t`%x`%|`%`%`%`%`%`%h`%`ðððð3jEPø@EjEPøl%jEPøjEPøăjEPø̹%a̹ب%a̹%a̹%a̹p%aҏ<Nb|ސ*@|bJޑڒ B^z̒Ԉ.҉Jdr*HZt‰Ċ>\ҋ:d֌*Hf`4ĎR.̍[P0`c:\src\python-3.8\include\object.hii:GetPageGetPagePyIProvideTaskPageH}A2A,AA A&A:PyIScheduledWorkItem::GetErrorRetryCountli:PyIScheduledWorkItem::SetErrorRetryInterval:PyIScheduledWorkItem::GetErrorRetryIntervalll:PyIScheduledWorkItem::SetFlags:PyIScheduledWorkItem::GetFlagslOO:SetAccountInformation:PyIScheduledWorkItem::GetAccountInformationCreateTriggerDeleteTriggerGetTriggerCountGetTriggerGetTriggerStringGetRunTimesGetNextRunTimeSetIdleWaitGetIdleWaitRunTerminateEditWorkItemGetMostRecentRunTimeGetStatusGetExitCodeSetCommentGetCommentSetCreatorGetCreatorSetWorkItemDataGetWorkItemDataSetErrorRetryCountGetErrorRetryCountSetErrorRetryIntervalGetErrorRetryIntervalSetFlagsGetFlagsSetAccountInformationGetAccountInformationPyIScheduledWorkItemc:\src\python-3.8\include\object.h:PyIScheduledWorkItem::CreateTriggerlNi:PyIScheduledWorkItem::DeleteTrigger:PyIScheduledWorkItem::GetTriggerCountii:PyIScheduledWorkItem::GetTriggeri:PyIScheduledWorkItem::GetTriggerStringh|OO:GetRunTimes:PyIScheduledWorkItem::GetNextRunTimeii:SetIdleWait:PyIScheduledWorkItem::GetIdleWaitll:PyIScheduledWorkItem::Run:PyIScheduledWorkItem::Terminate|Ol:PyIScheduledWorkItem::EditWorkItem:PyIScheduledWorkItem::GetMostRecentRunTimel:PyIScheduledWorkItem::GetExitCodellO:SetComment:PyIScheduledWorkItem::GetCommentO:SetCreator:PyIScheduledWorkItem::GetCreatorO:PyIScheduledWorkItem::SetWorkItemData:PyIScheduledWorkItem::GetWorkItemDatai:SetErrorRetryCount}A2A,AA A&A0&c:\src\python-3.8\include\object.hO:SetApplicationName:PyITask::GetApplicationNameO:SetParameters:PyITask::GetParametersO:SetWorkingDirectory:PyITask::GetWorkingDirectoryl:SetPriority:PyITask::GetPriorityll:SetTaskFlags:PyITask::GetTaskFlagsll:SetMaxRunTime:PyITask::GetMaxRunTimelSetApplicationNameGetApplicationNameSetParametersGetParametersSetWorkingDirectoryGetWorkingDirectorySetPriorityGetPrioritySetTaskFlagsGetTaskFlagsSetMaxRunTimeGetMaxRunTimePyITask}A2A,AA A&A.c:\src\python-3.8\include\object.hO&:PyITaskScheduler::SetTargetComputer:PyITaskScheduler::GetTargetComputer:PyITaskScheduler::EnumPyITaskScheduler::Enumcom/win32comext/taskscheduler/src/PyITaskScheduler.cppcom/win32comext/taskscheduler/src/PyITaskScheduler.cppO|O:PyITaskScheduler::ActivateO&:PyITaskScheduler::DeleteO|OO:NewWorkItemO&O:PyITaskScheduler::AddWorkItemOO:IsOfTypeSetTargetComputerGetTargetComputerEnumActivateDeleteNewWorkItemAddWorkItemIsOfTypePyITaskSchedulerH~A2A,AA A&A7c:\src\python-3.8\include\object.hO:PyITaskTrigger::SetTrigger:PyITaskTrigger::GetTrigger:PyITaskTrigger::GetTriggerStringSetTriggerGetTriggerGetTriggerStringPyITaskTriggerReserved1Reserved, do not useReserved2Reserved, do not useBeginYearBeginMonthBeginDayEndYearEndMonthEndDayStartHourStartMinuteMinutesDurationMinutesIntervalRandomMinutesIntervalFlagsCombination of TASK_TRIGGER_FLAG_HAS_END_DATE,TASK_TRIGGER_FLAG_KILL_AT_DURATION_END,TASK_TRIGGER_FLAG_DISABLEDTriggerTypeValue from TASK_TRIGGER_TYPE enum: TASK_TIME_TRIGGER_ONCE,TASK_TIME_TRIGGER_DAILY, TASK_TIME_TRIGGER_WEEKLY,TASK_TIME_TRIGGER_MONTHLYDATE, TASK_TIME_TRIGGER_MONTHLYDOW,TASK_EVENT_TRIGGER_ON_IDLE, TASK_EVENT_TRIGGER_AT_SYSTEMSTART,TASK_EVENT_TRIGGER_AT_LOGONDaily_DaysIntervalTASK_TIME_TRIGGER_DAILYWeekly_WeeksIntervalTASK_TIME_TRIGGER_WEEKLYWeekly_DaysOfTheWeekTASK_TIME_TRIGGER_WEEKLYMonthlyDate_DaysTASK_TIME_TRIGGER_MONTHLYDATEMonthlyDate_MonthsTASK_TIME_TRIGGER_MONTHLYDATEMonthlyDOW_WhichWeekOnly used for TASK_TIME_TRIGGER_MONTHLYDOWMonthlyDOW_DaysOfTheWeekOnly used for TASK_TIME_TRIGGER_MONTHLYDOWMonthlyDOW_MonthsOnly used for TASK_TIME_TRIGGER_MONTHLYDOWPyTASK_TRIGGERObject must be a PyTASK_TRIGGER~A2A,AA A&A;{trr{rrzrr {rrzrsp@{s,sب0{DsXsCLSID_CTaskSchedulerCLSID_CTaskSchedulerITaskSchedulerIID_ITaskSchedulerCLSID_CTaskCLSID_CTaskITaskIID_ITaskITaskTriggerIID_ITaskTriggerIScheduledWorkItemIID_IScheduledWorkItemIProvideTaskPageIID_IProvideTaskPagetaskschedulerSupports the Scheduled Tasks COM interfacesTASK_TIME_TRIGGER_ONCETASK_TIME_TRIGGER_DAILYTASK_TIME_TRIGGER_WEEKLYTASK_TIME_TRIGGER_MONTHLYDATETASK_TIME_TRIGGER_MONTHLYDOWTASK_EVENT_TRIGGER_ON_IDLETASK_EVENT_TRIGGER_AT_SYSTEMSTARTTASK_EVENT_TRIGGER_AT_LOGONTASK_TRIGGER_FLAG_HAS_END_DATETASK_TRIGGER_FLAG_KILL_AT_DURATION_ENDTASK_TRIGGER_FLAG_DISABLEDSCHED_S_TASK_READYSCHED_S_TASK_NOT_SCHEDULEDSCHED_S_TASK_RUNNINGSCHED_S_TASK_DISABLEDSCHED_S_TASK_HAS_NOT_RUNSCHED_S_TASK_NO_MORE_RUNSSCHED_S_TASK_TERMINATEDSCHED_S_TASK_NO_VALID_TRIGGERSSCHED_S_EVENT_TRIGGERSCHED_E_TRIGGER_NOT_FOUNDSCHED_E_TASK_NOT_READYSCHED_E_TASK_NOT_RUNNINGSCHED_E_SERVICE_NOT_INSTALLEDSCHED_E_CANNOT_OPEN_TASKSCHED_E_INVALID_TASKSCHED_E_ACCOUNT_INFORMATION_NOT_SETSCHED_E_ACCOUNT_NAME_NOT_FOUNDSCHED_E_ACCOUNT_DBASE_CORRUPTSCHED_E_ACCOUNT_DBASE_CORRUPTSCHED_E_UNKNOWN_OBJECT_VERSIONREALTIME_PRIORITY_CLASSHIGH_PRIORITY_CLASSNORMAL_PRIORITY_CLASSIDLE_PRIORITY_CLASSTASK_FLAG_INTERACTIVETASK_FLAG_DELETE_WHEN_DONETASK_FLAG_DISABLEDTASK_FLAG_HIDDENTASK_FLAG_RUN_ONLY_IF_LOGGED_ONTASK_FLAG_START_ONLY_IF_IDLETASK_FLAG_RUN_ONLY_IF_DOCKEDTASK_FLAG_SYSTEM_REQUIREDTASK_FLAG_KILL_ON_IDLE_ENDTASK_FLAG_RESTART_ON_IDLE_RESUMETASK_FLAG_DONT_START_IF_ON_BATTERIESTASK_FLAG_KILL_IF_GOING_ON_BATTERIESTASK_FLAG_RUN_IF_CONNECTED_TO_INTERNETTASK_SUNDAYTASK_MONDAYTASK_TUESDAYTASK_WEDNESDAYTASK_THURSDAYTASK_FRIDAYTASK_SATURDAYTASK_JANUARYTASK_FEBRUARYTASK_MARCHTASK_APRILTASK_MAYTASK_JUNETASK_JULYTASK_AUGUSTTASK_SEPTEMBERTASK_OCTOBERTASK_NOVEMBERTASK_DECEMBERTASK_FIRST_WEEKTASK_SECOND_WEEKTASK_THIRD_WEEKTASK_FOURTH_WEEKTASK_LAST_WEEKTASKPAGE_TASKTASKPAGE_SCHEDULETASKPAGE_SETTINGSc:\src\python-3.8\include\object.h+ՋS ՋS(ՋS*ՋS'ՋS$ՋSe@OeR}h~E8dJJUnknown exception JJbad allocation7JJbad array new length^_V88j^_ j^_ j\ a||||@|@||||Ц@}$},}Ц@}覃\}l}}|||覃@\} }}}||| @}0~~,~}|||0@~H\~l~~|||H@\~h~~~|||h@~@L\d@Ld@اdا@NTTTTURSDS~DgtC:\src\pywin32\build\temp.win32-3.8\Release\taskscheduler.pdb! .text$di pC.text$mnT.text$x0UK.text$yd`.idata$5a.00cfga.CRT$XCAa.CRT$XCUa.CRT$XCZa.CRT$XIAa.CRT$XIZa.CRT$XPAa.CRT$XPZa.CRT$XTAa.CRT$XTZa.rdata|.rdata$r .rdata$sxdata8.rdata$zzzdbg(.rtc$IAA,.rtc$IZZ0.rtc$TAA4.rtc$TZZ8.xdata$x0p.edata.idata$2@.idata$3T.idata$4Ԉ\ .idata$6.datad.data$r.bssL.gfids$yT"8T"dT"T"U"胃DD/GGHHĪ (I IĪا [I^_Xt:@;;;:<܅3Ytaskscheduler.pyd??0PyTASK_TRIGGER@@QAE@PAU_TASK_TRIGGER@@@Z??0PyTASK_TRIGGER@@QAE@XZ??1PyTASK_TRIGGER@@IAE@XZ??4PyTASK_TRIGGER@@QAEAAV0@ABV0@@Z?PyTASK_TRIGGERType@@3U_typeobject@@A?deallocFunc@PyTASK_TRIGGER@@SAXPAU_object@@@ZPyInit_taskscheduler`؊`daTaT`̑@```ćp`ҏ<Nb|ސ*@|bJޑڒ B^z̒Ԉ.҉Jdr*HZt‰Ċ>\ҋ:d֌*Hf`4ĎR.̍CoTaskMemFreeole32.dll PyArg_ParseTuplePyEval_SaveThreadPyEval_RestoreThread.PyBytes_FromStringAndSize&PyBytes_AsStringAndSize=PyTuple_New?PyTuple_SetItemPy_BuildValue_Py_NoneStruct_Py_DeallocPyList_NewPyList_Append_Py_FalseStruct_Py_TrueStructiPyObject_GenericGetAttrkPyObject_GenericSetAttrz_PyTraceMalloc_NewReferencePyErr_SetStringE_Py_tracemalloc_config1PyExc_TypeErrorKPyType_ReadyPyModule_GetDictPyModule_AddIntConstantPyModule_Create2python38.dll??0PyComTypeObject@@QAE@PBDPAV0@HPAUPyMethodDef@@P6APAVPyIUnknown@@PAUIUnknown@@@Z@ZB??1PyComTypeObject@@QAE@XZ,?PyCom_BuildPyException@@YAPAU_object@@JPAUIUnknown@@ABU_GUID@@@Z?GetI@PyIUnknown@@SAPAUIUnknown@@PAU_object@@@Z7??0PyIUnknown@@IAE@PAUIUnknown@@@Z[??1PyIUnknown@@MAE@XZ?compare@PyIUnknown@@UAEHPAU_object@@@Z?getattr@PyIBase@@UAEPAU_object@@PAD@Z?iter@PyIBase@@UAEPAU_object@@XZ?iternext@PyIBase@@UAEPAU_object@@XZ?repr@PyIUnknown@@UAEPAU_object@@XZ?setattr@PyIBase@@UAEHPADPAU_object@@@Z?type@PyIUnknown@@2VPyComTypeObject@@APyCom_PyObjectFromIUnknownPyCom_InterfaceFromPyObjectA?PyCom_RegisterExtensionSupport@@YAHPAU_object@@PBUPyCom_InterfaceSupportInfo@@H@Zpythoncom38.dll?PyWinLong_FromHANDLE@@YAPAU_object@@PAX@Z?PyWinObject_AsWCHAR@@YAHPAU_object@@PAPA_WHPAK@Z?PyWinObject_FreeWCHAR@@YAXPA_W@Z?PyWinObject_FromOLECHAR@@YAPAU_object@@PB_W@Z?PyWinObject_FromSYSTEMTIME@@YAPAU_object@@ABU_SYSTEMTIME@@@Z?PyWinObject_AsSYSTEMTIME@@YAHPAU_object@@PAU_SYSTEMTIME@@@Z?PyWinObject_AsHANDLE@@YAHPAU_object@@PAPAX@Z?PyWin_SetAPIError@@YAPAU_object@@PADJ@Z?PyWinObject_AsIID@@YAHPAU_object@@PAU_GUID@@@Z?PyWinGlobals_Ensure@@YAHXZpywintypes38.dll^GetLocalTimeIsProcessorFeaturePresentzIsDebuggerPresentUnhandledExceptionFiltereSetUnhandledExceptionFilterGetStartupInfoWtGetModuleHandleWFQueryPerformanceCounterGetCurrentProcessIdGetCurrentThreadIdGetSystemTimeAsFileTimeDisableThreadLibraryCalls^InitializeSListHeadGetCurrentProcessTerminateProcessKERNEL32.dll__CxxFrameHandler3Hmemset!__std_exception_copy"__std_exception_destroy_CxxThrowException5_except_handler4_common%__std_type_info_destroy_listVCRUNTIME140.dll_callnewhmallocA_seh_filter_dll_configure_narrow_argv5_initialize_narrow_environment6_initialize_onexit_table>_register_onexit_function$_execute_onexit_table_crt_atexit_crt_at_quick_exit_cexit8_initterm9_initterm_efreejterminateapi-ms-win-crt-heap-l1-1-0.dllapi-ms-win-crt-runtime-l1-1-0.dlla0Tcdctccc@ccpcccPccPcdd(d4d0@dLdXd0hd xd d!d"d"d0#d#d@$eP%i&i'iP(i)i)iP*i+j+j , j,0j@-@j- l/ l 04l00C0H0N0S0a0f0m0r0w0}00000000000000000001 1"1:1Y1c1r111111112222F2{22222233+373?3P3Z3f3l33333333334+4=4L4b4n4v444444445 55(5J5e5o55555555 6?6Q6i6s6666666 7'7;7U7z77777777 8)838M8a8m8u88888889992989W9i9s9999999999:::':3:=:Z:o:::::::::;;/;9;H;^;j;r;;;;;;;;;<+<=>(>7>O>V>b>j>y>>>>>>>>>??!?:?\?v???????? 00.0:0O0j0v0~0000000011.1@1L1T1a1k1111111111202:2N2`2l2t22222222233383P3Z3i3~3333333333444%4J4y4444455!5)595C5X5j5v5555555556 6"6(656;6f66667777F7a7h7t7|77777778 88,8;8s8}8888888889%989Q9]9e9r9999999::$:,:;:E:i:}::::::::;);8;P;\;d;q;{;;;;;;;<$>0>8>I>O>s>|>>>>??l??????????0000(0:0J0]0s00000000 1"1/151I1X1_1e11111112 232Z2q2222223 33 3;3X3q3v33333333334B4I4`4r4444445"5:5i5n555555555566I6[6q6666666667772787N7n7777777!838g8n8s8{88888888889 9(959?9Z9o9y999999 ::$:::F:N:]:n:}:::::::;,;N;d;q;;;&<[> >->:>G>T>d>q>~>>>>>>>>>>>? ??"?/???I?S?]?g?q?~????????????@X000)030=0J0T0^0h0z000000000000000000000001 1111"1(1.141:1@1F1L1R1X1^1d1j1p1v1|111112g3333 44)4:4`4u4|44444 50585Q5k5s5555-6\6l66666666"7?7I7W7i7~77788 989P9V9k99999999:B:o:::::: ;;;;;;< #>k>s>>>>> ?(?4?C?L?Y??????????P00 03080^0f0p0000000000000001 111 1(141=1B1H1R1\1l1|1111111111112 2222'2/2:2?2E2O2Y2l2q22222222222222222 3333I3X33333333333333333333344444 4&4,42484>4D4J4P4V4\4b4h4n44445 51575A5G5Q5W5a5g5q5w5`X1111111 22222 2$2(2(8,8084888<8@8D8X:\:`:d:h:l:p:t:<<<<<<<<p111111111111222222$2(2,20282<2@2D2L2P2T2X2`2d2h2l2P;T;\;`;d;|;;;;;;;;d>>>> >$>,>D>T>X>h>l>p>t>x>>>>>>>>>>>>>????4?D?H?X?\?d?|??????????????L00<3H3h3t3333333,404P4p4444444444444455 5 5H00 0$00040@0D0P0T0`0d0p0t000000000000000001111 1$10141@1D1P1T1`1d1p1t1111111111111112222 2$20242@2D2P2T2`2d2p2t2222222222222223333 3$30343@3D3`3d3p3t333333333344,4@4T4h4|444444444445555,505@5D5T5X5h55555d6h6p66666 707H7h77777PK Y03Km%win32comext/taskscheduler/__init__.pyUT  YZx`ux # This is a python package # __PackageSupportBuildPath__ not needed for distutil based builds, # but not everyone is there yet. import win32com win32com.__PackageSupportBuildPath__(__path__) PK {Rwin32comext/shell/UT Zx`Zx`ux PK n$nQ[""win32comext/shell/shell.pydUT ^_ux MZ@ !L!This program cannot be run in DOS mode. $)Iwwm($m($m($dP$k($Vv%o($Vv%o($Vv%|($Vv%f($v%i($yN%o($J%f($J%d($m($($v%+($v%l($v%l($Richm($PEL^_! ,@@`BLBDPT@@.text[+, `.rdatap&@(0@@.data8qp8X@.gfidsL@@.rsrcD@@.reloc@Bh3h`qj5Bh(Q$Ch`7*Yhp3hpj5BЧhPP$Chp7Yh3h@qj5BhP$Ch7YhP7hrj5BhQ$Ch7Yh:hXrj5BXhR$Ch7jYh`Ahrj5B0hS$Ch7:YhChrj5Bh2Ph4YD$Ph8YVW@x9L$ A@TtQAL$Fu QASA_^[ỸSUVWA\$0KD$jsPhYVQ@D$PD$PhYt$AuL$QPDPhY;t$4t$Ctt$8t$u L$QPDPhYsB D$u PAUA_^][ ̃UVWAt$,D$u+t$(T$FNRPDPhZvB l$(L$ Wh$ZQh(ZEUP@u WAxMt$0t$Cu%EL$QPDPD$,hpZpB D$ u PAt$A_^] ̃SUVWA\$(KD$j{PhZWQ@xiL$; AuD$,=jt$0h8QBu L$QPDPhZsB L$u QAUA_^][̃UVWAt$0D$Cu+t$,T$FNRPDPh [vB t$8l$0L$Wh[Qh [EUP@u WAxsjjD$Pt$Cu'EL$QPDPD$0hd[pB t$8t$t$<At$CD$u PAt$A_^]̃SUVWAt$05CD$֋؃u+t$,T$FNRPDPh[vB t$4֋u+t$,T$FNRPDPh[vB L$,T$WSh[Rh[QP@-AuSՃuWՃxPjt$t$(CPh(_D$$Ph0_VW@$x/T$ JATtRAT$u RASA_^[ỸSVWAt$$u(t$ T$ FNRPDPh_vB .D$ Vh_jh_PQ@u VASA_^[QSVWAt$C|$ L$WPD$h_Ph_QR@T$ JATt~t?t:jjD$ PRCtYt$(t$t$,At$$C3RjjD$ PRCtt$(t$t$,At$$C3tRAFT$ u RASA_^[YV8`CD$t jV虲^Ujh?&dPd%QVj3uEt)uC8`F^Md ]ËM3^d ]%C%C{SVWAt$5Ct$֋L$WPt$$QhT`jhX`QR@3SHA(_^[%C%C̋D$ uPAY++++QSVWAt$ 5Ct$ ֋L$WPt$(QD$ h`Ph`QR@$xLT$$L$ t1; Au!RQChRh`BL$u QASA_^[Y̋D$̋D$ uPAY%C̃(St$0C؃u3[(ÍD$PD$PD$$PD$PD$0PD$8PD$$Ph(at$TA$tD$(Pt$CtV5CD$jjPt$ փjjD$Pt$$փtzUWAt$$ t$t$0t$t$SUt$<CPhLgD$$PhTgVW@=A t EuU׃]uS׃xD$ uP׃t$A_^[̃UVWAL$(q1hfA u(t$$T$FNRPDPhgvB Lt$,D$(T$WhgRhgPQ@u WAxD$ u PAUA_^] VWAL$ jjhLhQR@WA_^̃UVWAL$0D$q1hfA u(t$(T$FNRPDPhXhvB oSjhXkt$8Bt$DL$CPhjjhjVW@SA_^[QVWAL$D$jPhjQR@xYt$t$ |Cu1D$@p Ahj0AhhjBD$u PAWA_^Ỹ(SUVWAt$@D$(3xC؃Ut$D-BՋ t$HՋl$XD$L$CPhljhpVW@SA_^[SVWAt$BL$VhjhQR@؅tu VAWA_^[VWAt$L$hjhQR@WA_^̃SVWAt$$Yu)t$ T$ FNRPDP5\vB 5D$(L$ PVhĚj5\QR@u VASA_^[ SVWAjt$*t$ L$VhjhQR@ ؅tu VAWA_^[ SUVWAt$0\$0KD$h P5`{WQ@D$Ph$t$\A u#L$QPDP5`sB Pjt$8hht$ Bu!L$QPDP5`sB D$u PAUA_^][ ̃SUVWAt$,l$,؋MD$hlP5d}WQ@xIt$0t$Cu!L$QPDP5duB D$u PASA_^][ QSVWAt$$5Ct$$֋L$WPt$,QD$ t$,hPhQR@T$4(JATtt$(RCT$u RASA_^[YSUVWA\$,KD$jP5h{WQ@D$Ph,t$\A u#L$QPDP5hsB Pjt$4hOt$ Bu!L$QPDP5hsB D$u PAUA_^][SVWAjhOt$BL$Vh`jhdQR@ ؅tu VAWA_^[̃SVWA5Au)t$ T$ FNRPDP5lvB 7t$,D$$t$,Vhj5lPQ@u VASA_^[VBD$t jV^Ujh?,dPd%QVjuEt)u,CFʅ^Md ]ËM3^d ]̋D$̋D$ uPAY̋D$tu D$%A%C̃Wt$ Cu3_ÍD$PD$PD$Ph t$4AtSVjjD$Pt$ jD$$PhXkt$4BۍD$@Pt$@#C(trtnAt$ t$t$WQ t$ T$t RQSAyhWWVC ^[_áA^[_A^[3_QVt$ t$CFp˅^Y%CUVWAjt$zjhXkt$(Bt$0L$(VWhLjhPQR@0D$tu WAtu VAUAD$_^]VCD$t jV ^Ujh_,dPd%QVjuEt)uCFp˅^Md ]ËM3^d ]̋D$ uPAY̋D$tu D$%A%CUdjh~,Pd%$VuCu^Md ]WEEEPEEPEEPEPhu AEPuCjjEPuCjEPh(luBSA؍EPEPEPuuuVQ EtPQSA[yhKVWC -juuVuhAV~3uECMd _^]̃Wt$Cu3_áAD$D$PD$D$Pht$(D$AtD$ Pt$CtSVAD$Pt$t$WQVAyhKWSC ^[_jhhDt$ B ^[_̃(Vt$0Ct}D$ PD$PD$Pht$DAtXD$Pt$CtBjjD$ Pt$lt)jD$ Ph(lt$ But$3^(SWA؍D$ PD$(Pt$t$VQt$ D$tPQSAyhKVWC _[^(jD$(Pt$(B _[^(̃(Wt$0Cu3_(ÍD$PD$PD$Pht$DAtVjjD$Pt$Zu3"jD$Ph(lt$ BD$ Pt$Ct|SA؍D$ PD$(Pt$t$WQt$ sD$tPQSA[yhKWVC ^_(jD$$Pt$$B ^_(^3_(̃Ut$ Cu]WD$3PD$|$ PD$|$Pht$8AtD$Pt$Cu_3]jjD$Pt$ tvjjD$Pt$$t]SVAt$Mt$t$,UQVAyhKUSC fyj~jjA^[t$t$_]̃ Wt$(Cu3_ ÍD$PD$Ph(t$8AtٍD$ Pt$CtÍD$Pt$ CtSVAD$PD$ Pt$WQ VAyhKWSC ^[_ jD$ Pt$ B ^[_ ̃Wt$Cu3_ÍD$ PD$Ph<t$(AtٍD$PD$ Pt$ tSVAD$Pt$t$WQ$t$ t$VA yhKWSC ^[_t$A^[_̃DWt$LCu3_DÍD$D$PD$D$PD$ PD$(PD$$PhPt$hAtD$ Pt$CtV5CD$,Pt$ փt=D$ u D$,D$<L$CPhLD$$PhTVW@=A t EuU׃t uS׃L$A@Tup Ahh0A :D$PD$PD$ PhQAtjjt$Dt$ uhKhBL$8tD$L$@tD$D$uP׃t$ A_^][QSVWAt$t$t$>CPhD$PhVW@xWL$ ; AuD$ +jt$$hhDQBhKhBL$$u QASA_^[ỸSUVWAjt$$D$jh(lt$4Bt$<CL$4VWUQD$4hTP5@QR@A4D$ t EuUӃt uWӃt uVӃt$ x?jt$0t$0t$BhK5@BD$8D$uPӃt$ t$A_^][̃SUVWAjt$$D$jh(lt$4Bt$<CL$4VWUQD$4hP5DQR@A4D$ t EuUӃt uWӃt uVӃt$ x?jt$0t$0t$BhK5DBD$8D$uPӃt$ t$A_^][QSVWAt$Cjt$$jt$0L$(PVWQD$,h̟PhПQR@0x/T$ JATtRAT$u RASA_^[YQSUVWAt$ Ct$؃St$ >CPh D$P5HVW@=At uS׃x9jt$(t$(t$BhK5HBD$uP׃UA_^][ỸSVWAt$ D$t$ t$,t3ҋD$RWT$hTRhXPQ@؅tu WAxHtL$ A@Tt QAhKhhB؃D$ u PAt$A_^[̃SUVWAt$(D$t$(t$4C؃ D$0t3ɋt$QSUt$,>CPhD$$P5LVW@=A t EuU׃t uS׃L$A@TtUt$8t$,CPhHD$$P5TVW@=AD$P t uP׃t EuU׃]x7t$jjSt$hK5TBD$ uP׃t$A_^[VCD$t jV虷^Ujh,dPd%QVj3uEt)uCFH̅^Md ]ËM3^d ]%C̋D$ uPAY̋D$tu D$%A{̃Wt$cu3_hġt$ AtSVAD$ PWQ4VAyh(EWSC ^[_ÍD$ PC^[_QWt$ u3_Yhܡt$AtSVAD$ PWQ8VAyh(EWSC ^[_Yjh(Rt$B ^[_Ỹ Wt$Cu3_ ÍD$D$Ph졃t$ A tSVAD$PD$Pt$WQPh䰃D$Ph调VW@x(t$ TAL$D$ u PA_^ Ul$ WUAu_]SV3t\$S襕tO F;r^[_]Ãu WA^[_3]Ujh-dPd%S]VWSuCuEtP AU u.B3tu VAM_^[d ]39;v0N 3ۉMP1UtEGMU M;8rؿVD$t jVZz^Ujh-dPd%QVjyuEt(uF0҅^Md ]ËM3^d ]̋D$W̋D$ uPAY̋D$tu D$%A%C̃4Vt$<Cu3^4ÍD$ PD$ PD$Pht$PAtW=CD$,Pt$׃t/D$Pt$׃tjD$ Ph(lt$ Bu_3^4SA؍D$PD$$PD$8Pt$VQ D$ tPQSA[yhhaVWC _^4jD$ Pt$ B _^4̃Wt$ Cu3_D$ D$P5CD$ Ph0t$4D$ AtSVAD$PD$Pt$WQVAyhhaWSC ^[_jD$Pt$B ^[_̃(Wt$0Cu3_(HD$P5CD$ Ph`+hHt$HD$ AtSVAD$ PD$PD$(PWQVAyhhaWSC ^[_(jD$Pt$B ^[_(̃ Wt$Cu3_ ÍD$PD$ Phlt$$AtSVAD$Pt$t$WQVAyhhaWSC ^[_ t$A^[_ QWt$ Cu3_Yht$AtSVAD$ PWQVAyhhaWSC ^[_Yt$ A^[_ỸWt$Cu3_ÍD$Pht$A tSVAD$Pt$WQ VAyhhaWSC ^[_jh8at$B ^[_QWt$ Cu3_Yht$AtSVAD$ PWQ$VAyhhaWSC ^[_Yjh`t$B ^[_YQVt$ t$CdFӅ^Yd%C̃SUVWAjh(lt$.Pd%WuCu_Md ]SVEEEPhu A t\jjEPuCtDAuWQ@VAyh[WSC A5A3uECMd ^[_]Wt$Cu_SVAWQDVAyh[WSC ^[_áA^[_AUdjhV.Pd%VuCu^Md ]WEEEPEPEPhu AjjEPuCjEPh8auBteSA؍EPuuuVQHEtPQSA[yh[VWC jh8auB 3uECMd _^]Udjhn.Pd% WuCu_Md ]SVEEEPEPEP5Chu AtojjEPuCtWAEPuEuPWQLVAyh[WSC jh8auB 3uECMd ^[_]QVt$ t$CƒFԅ^Yƒ%CVƒCD$t jVQ^Ujh.dPd%QVj#QuEt)uCƒFԅ^Md ]ËM3^d ]̋D$%ĆXS$`C؃u 3[XÍD$D$PD$ Ph0ƒ$pAtˋD$WP@u Ah<ƒ0A3_[XVhPD$jPb At$ D$Pt$WSQ VAy"W@hhjSC^_[XÍD$P\CPWCPhXƒAW@^_[XQWt$ Cu3_Yh\ƒt$AtVD$AD$PWQVA^yhhjWC _Yjt$a_ỸWt$Cu3_ÍD$Phhƒt$A tjjD$ Pt$^tVAt$WQVAt$ )b^yhhjWC _áA_AQSt$ C؃u3[YÍD$D$Phtƒt$A t؋D$WP@uAhƒ0A3_[YVAt$ WSQVAy$hhjSC W@^_[YWCW@^_[ỸWt$Cu3_ÍD$Phƒt$A tjjD$ Pt$CtVAt$WQVAt$ C^yhhjWC _áA_AQSt$ C؃u3[YÍD$D$Phƒt$A t؋D$WP@uAhƒ0A3_[YVAt$ WSQ VAy$hhjSC W@^_[YWCW@^_[ỸWt$Cu3_ÍD$Phƒt$A tjjD$ Pt$CtVAt$WQ$VAt$ C^yhhjWC _áA_AQSt$ C؃u3[YÍD$D$PhÃt$A t؋D$WP@uAhÃ0A3_[YVAt$ WSQ(VAy$hhjSC W@^_[YWCW@^_[ỸWt$Cu3_ÍD$Ph0Ãt$A tjjD$ Pt$CtVAt$WQ,VAt$ C^yhhjWC _áA_AQWt$ Cu_YVAD$PWQ0VA^yhhjWC _YD$PA_YQWt$ Cu3_YÍD$PhdÃt$A tVAt$WQ4VA^yhhjWC _YáA_AYQWt$ Cu_YVAD$PWQ8VA^yhhjWC _Yt$A_YQWt$ Cu3_YÍD$PhpÃt$A tVAt$WQPt$ qt'j t$8G,PA t$4K3t$4:j @uAj hLȃBWGWPGfPhDhhȃV_UA j@uAjhpȃWG WPGPGPhThȃVUA h@huAhȃjWNWD$0D$ PD$8PGPhhhȃVUA,tZjjD$Pt$,Ct@ht$(GPAht$ PAt$3t$h@huAhȃjW NWD$8D$$PD$@PGPh|hȃVUA,tMjjD$Pt$4Ct3ht$0GPAht$$ PA3t$Cu(t$S@3lAWhȃ0A Eu UA]_^[ ÐՁӁցNԁԁՁՁVt$N_1$`فf~jF,u PC j PhCȡAh ɃPhɃh(Ƀh@Ƀv|PhTɃvxPhdɃvtPhpɃvpPh|ɃvlF"hɃQhɃv(hɃv$hɃPF PFhɃvhɃvhɃPFPFhɃPFPFhɃPF PF hɃPFh ʃPh ʃvh0ʃ6h<ʃhPʃA^vhDʃQhʃ6hʃh˃A^v h˃vh˃Qh,˃6h8˃h@˃A$^Í PhT˃FPh`˃Qhl˃6hx˃h˃A$^Í Ph˃FPh˃Qh˃6h˃h˃A$^álAQh˃0A ^فׁHف؁؁؁فV`̓CD$t jV7^Ujh.dPd%QVjs7uEt)uC`̓Fhօ^Md ]ËM3^d ]̋D$̋D$ uPAY̋D$tu D$%A%B̃ Wt$(Bu3_ ÍD$Ph̓t$4A tލD$Pt$NtSVAD$PWQVAyhOWSC ^[_ SA^[_ QWt$ Bu3_YÍD$Ph̓t$A tSVAt$ WQVAyhOWSC ^[_YáA^[_AYQWt$ Bu3_YÍD$Ph̓t$A tSVAt$ WQVAyhOWSC ^[_YáA^[_AYWt$Bu3_h̓t$AtSVAWQ VAyhOWSC ^[_áA^[_Ã4Vt$<Bu3^4ÍD$PD$PD$PD$Ph̓t$TAtW=BD$jPhOt$׃D$$Pt$MjD$PhJt$$׃D$,Pt$ 0Mt|SA؍D$$PD$4Pt$D$4Pt$VQ$T$ t RQL$tQPSA[yhOVWC _^4t$ C_^4_3^4Wt$Bu3_h΃t$AtSVAWQ(VAyhOWSC ^[_áA^[_ÃWt$Bu3_h΃t$AtSVAD$ PWQ,VAyhOWSC ^[_ÍD$ PvK^[_Wt$Bu3_h$΃t$AtSVAWQ4VAyhOWSC ^[_áA^[_ÃWt$Bu3_ÍD$ PD$ Ph4΃t$(AtSjjD$Pt$A\$ u[3_VASt$WQ8t$ DVA^yhOWSC [_áA[_ÃWt$$Bu3_ÍD$PD$ PhD΃t$4AtٍD$Pt$CtSVAD$PD$Pt$WQt$,CL$$PVt$0QhуjhуQR@ u VASA_^[VWAL$ jjh\уQR@WA_^SVWAjt$*=t$ L$VhlуjhpуQR@ ؅tu VAWA_^[ SVWAL$8t$4D$C\$0Wt$8D$h|уPhу SQ@tu WAD$Phуt$\A u&L$QPDPD$0hуpB Rjt$0Pd% WuCu_Md ]SVEEEPEPEPEPh كu AtljjEPuCtT5BEjPh8auփt7jEPh8auփuH9EtAMQRVA3uECMd ^[_]AEPuuuuWQ,MQRMQRVAyhH^WSC jh8auBPSh0كA_̃ Wt$Cu3_ ÍD$Ph4كt$ A tjD$Ph8at$BtSVAD$Pt$WQ0L$ QRVAyhH^WSC ^[_ jh8at$B ^[_ ̃Wt$Cu3_ÍD$PD$PhLكt$,AtV5BD$jPh8at$ փt;jD$Ph8at$$փu*9D$tAL$QRVA^3_SAD$Pt$t$WQ4L$ QRL$QRVAyhH^WSC [^_t$Ct$$A[^_̃Wt$Cu3_ÍD$Phlكt$A tjD$Ph8at$BtSVAt$ WQ8L$ QRVAyhH^WSC ^[_SA^[_̃Wt$Cu3_ÍD$Ph|كt$A tjD$Ph8at$BtSVAt$ WQuv$AF^Vt$uA^AËWt?t*tDAh0A3*FPAFD$PA vC|$t>uv$AF_^Vt$ FPFPFPF PFPFPD$$Pht$(A$tVt$Ct^3^̋D$u AApppp pp0CPhdA ̋L$APQht$A̋D$u AAp0hA ̋L$A PAPAPQht$A̋D$u AAp pp0hxAt$PAL$ u At3ø%At$PAL$ u At3ø%AVt$ FPD$Ph t$Au^Vt$C^Vt$uA^AVCu^vPhD A ^QVt$D$PFPVh t$Au3^YjjD$Pt$Ctht$VAt$3fC^YVt$uA^AÍFPCu^Pv6hp A^à D$Vt$PD$ PFPFPFPFPD$0Phd t$4A$tjFPD$Ph t$$AtKVt$Ct9jPF"Pt$3 t#hPt$ ^ 3^ Vt$uA^AWVD$3CUvPhD A t~F"SPC؃t9PCt#FWSvvvPUhA D$E5AuUփt uWփt uSփ[]D$ _^̃D$Vt$PD$PFPFPVht$(Au3^jjF Pt$CthFPt$ ^̋D$p CYW|$uA_AÍGVPCtw Cuu VA^3_VPww7hdA^_Ujh0dPd%VEEEPEP5Chp"uAt9EPjEPuCtE=v;Ah"0A3uECMd ^]PuE PA Vt$FPCPVCPhL#A ^̋D$tf8t f8u3QVt$ D$uA^AYËFUjPtqSW6A39>v%DjPȃtC G;>rSUhA D$5At uSփE_[uUփD$]^Ỹ UVD$D$PD$ D$Pht$833Au^] SWD$ PjD$ Pt$0at$HAu$D$@p Ah0A ,t$8At$,<W@l$u BWjU 3ۅ~\fDSt$LA|$EPjUW8D$(uWAD$,C;|l$3D$ D$(ȉL$%yH@W+(EfnP@@fn@fnHfnXfbfn@fbfnPfbfnHffnXfbfbfbf;|f(fsf(fsff~ȉL$33;}?+ƒ|)ƍ +̓@ByIYuL$;}L;QjtA|$( Wt$$Yp؉D$,SH߅~<}t$ l$t$(u7wSb7m l$ uދt$,l$|$$Att$Ӆt!3~DtPG;|U@D$_[^] Ul$W|$t#S1Pd%=݅u#hhjh@C Md ]VWEEEPh u A t]jjEPuCtEAu݅VAyhhjWC A5A3uECMd _^]Q=݅uhhjh@C YVWAD$P݅VAyhhjWC _^Yt$Ct$$A_^YUdjhV1Pd%=݅u#hhjh@C Md ]VEAEEPEEPEPhhuu AjjEPuCjEPh(luBtvWAEPuEPuu݅EtPQWA_yhhjVC %uju辠Ph(A 3uECMd ^]Vt$AuF^WVt$t$B u VA_^Vt$CuF^WVt$t$B u VA_^̃8Cu3ShhA؃u[VSAu^[á4CUW0hVBjYhV(Bh D@=@@-<@4݅uh8գ4݅)hPPhd54݅D݅h|54݅@݅h54݅H݅h54݅X݅h54݅L݅h54݅P݅h54݅T݅h54݅`݅h54݅l݅h54݅p݅h 54݅x݅h<54݅|݅hP54݅t݅hh54݅h݅h54݅݅h54݅݅h54݅݅h54݅݅h 54݅݅ף݅h 54݅hd 54݅݅h 54݅݅h 54݅݅h 54݅݅h!54݅݅h !54݅݅h4!54݅݅ht!54݅݅h!54݅݅h!54݅݅ף݅=P݅u1h "D@8݅uh("գ8݅t hD"PףP݅hX"D@<݅uht"գ<݅t1h"Ph"5<݅\݅h"5<݅d݅ף݅jh"Vj@h#Vhh#Vjh #Vjh0#Vjh<#VHjhP#Vj h`#Vjhl#Vjh|#V|jh ރVojh0ރVbHjh<ރVRjhLރVEjhXރV8h[hhރVxh(bhxރVhhdhރVXHhKhރVEhXKhރV5hMhރV%hPhރVhhNh ߃Vh_h߃VHhQh0߃VhHJhD߃VhxChX߃VhHLhh߃Vh8Oh|߃VhLh߃VHhCh߃VhhXh߃VohXh߃V_hLh߃VOhLhV?hNh$V/HhGh<VhNhPV hGhVh(bhVhLhVhhDŽhVHhhDŽhVhJhVh(Th VhhVhVhJh8Vyh8FhPViHhTh\VVhWhlVFhOhV6hDhV&hMhVhXZhVHhHPhVh(HhVhEh VhhOh(VhUh<VhGhPVHhHDhtVhHhVhXPhVphxThV`hHRhVPhShV@HhMhV-hxMhVhKhV h8Th$VhHWhLVhEh`VHhXhpVhFhVhOhVhXNhVhEhVhƄhVzHhHhVgh8PhVWhxƄhVGhƄh8V7hƄhlV'hShVHh(FhVhxIhVhXRhVh8VhVhZhVh([hVHhThVhUhVhXVh VhZh0VqhhIh@VahEhTVQHhChdV>hXQhV.hVhVh8DhVhJhVhHShVHhXShVhRhVhUhVhxDhHVhHGhTVhXhlVHhHhVxh(PhVhhUhVXhHOhVHhOhV8hXhV(Hh(Ih Vh8Sh\Vh8[hxVhGhVh(DhVhIhVHh(LhVhIhVhxYhVhGhVhXHhVrhXh(VbHhXMh<VOhGhPV?hChdV/hKhVhxRhVhHhVHhThVh8UhVhNhVhWh,VhxXhPVhH[hhVHhMhVhYhVyhXThVihMhVYhx[hVIhIhV9Hh(NhV&h8RhVhHh,VhHh@VhHh\Vh[h|VHhxPhVhZhVhXChVhShVhShVhxFhVsHhxKhHV`h(XhXVPhFhpV@hhZhV0hJhV h8WhVHhZhVhIhVhDhVhPh4VhVhHVhZhdVHhHQh|VhZhVhShVzhVhVjhRhVZhWhVJHhLhV7hPh V'hPh4VhLhPVh(JhhVhRhVHhVhVhVhVhhQhVhhFhVhChVhVh(VHhEh8VqhNhPVahhEhVQhShVAhVhV1hIhV!HhXUhVhWhVhFhVhXEh$VhhWhDVhFhXVHhPhpVhxGhVhKhVhYhV{hXhVkhGhV[HhJhVHhhCh@V8hCh`V(h8MhxVhFhVhShVHhhThVhFhVh8NhVhLh(VhhPhLVh(YhdVHhxNh|VhHYhVrhChVbh(OhVRhJhVBhXh V2HhHVh(VhUh@VhHXh\VhYhVhJhVhQhVHhhShVhThVhXIhVhDhVhxHh0V|hWhHVlHh8Yh`VYhDhxVIhXFhV9D$4D$4tOPhVD$D hND$H KD$Lg< 0_]^[Udjh/3Pd%S]VWuWMd _^[]jz}Et(u|Bt4G4G4G43M EOtQPE7ԋVH3҉_EʋM^d []Udjho4Pd%S]VWuWMd _^[]jz}Et(u|B&G<'GP'Gd'3M EOtQPE7ԋVH3҉_EʋM^d []Udjh4Pd%S]VWuWMd _^[]j5y}Et(u|B<7G7G7G73M EOtQPE7ԋVH3҉_EʋM^d []Udjh3Pd%S]VWuWMd _^[]jex}Et(u|BD?G?G?G?3M EOtQPE7ԋVH3҉_EʋM^d []Udjh3Pd%S]VWuWMd _^[]jw}Et(u|BD,G,G,G,3M EOtQPE7ԋVH3҉_EʋM^d []Udjh6Pd%S]VWuWMd _^[]jv}Et(u|B0G0G0G03M EOtQPE7ԋVH3҉_EʋM^d []Udjho1Pd%S]VWuWMd _^[]ju}Et(u|B5G`5Gt5G53M EOtQPE7ԋVH3҉_EʋM^d []Udjh4Pd%S]VWuWMd _^[]j%u}Et(u|B|'G'G'G'3M EOtQPE7ԋVH3҉_EʋM^d []Udjh/4Pd%S]VWuWMd _^[]jUt}Et(u|B7G$8G88GL83M EOtQPE7ԋVH3҉_EʋM^d []Udjh/5Pd%S]VWuWMd _^[]js}Et(u|B?G,@G@@GT@3M EOtQPE7ԋVH3҉_EʋM^d []Udjho2Pd%S]VWuWMd _^[]jr}Et(u|B,G,-G@-GT-3M EOtQPE7ԋVH3҉_EʋM^d []UdjhO4Pd%S]VWuWMd _^[]jq}Et(u|B|8G8G8G83M EOtQPE7ԋVH3҉_EʋM^d []Udjho5Pd%S]VWuWMd _^[]jq}Et(u|B (G\(Gp(G(3M EOtQPE7ԋVH3҉_EʋM^d []UdjhO5Pd%S]VWuWMd _^[]j Ep}Et/u B1Gd1Gx1G1G13M EOtQPE7ԋVH3҉_EʋM^d []Udjh4Pd%S]VWuWMd _^[]juo}Et(u|B;G(<G<<GP<3M EOtQPE7ԋVH3҉_EʋM^d []Udjh3Pd%S]VWuWMd _^[]j n}Et/u B5G5G6G$6G<63M EOtQPE7ԋVH3҉_EʋM^d []Udjh2Pd%S]VWuWMd _^[]j m}Et/u|Bl@G@G@G@G@3M EOtQPE7ԋVH3҉_EʋM^d []Udjh2Pd%S]VWuWMd _^[]jm}Et(u|Bh-G-G-G-3M EOtQPE7ԋVH3҉_EʋM^d []Udjh1Pd%S]VWuWMd _^[]j5l}Et(u|B#G#G#G $3M EOtQPE7ԋVH3҉_EʋM^d []Udjh5Pd%S]VWuWMd _^[]jek}Et(u|B(G(G(G)3M EOtQPE7ԋVH3҉_EʋM^d []Udjho6Pd%S]VWuWMd _^[]jj}Et(u|B 9G\9Gp9G93M EOtQPE7ԋVH3҉_EʋM^d []Udjh1Pd%S]VWuWMd _^[]ji}Et(u|B1G@2GT2Gh23M EOtQPE7ԋVH3҉_EʋM^d []Udjh2Pd%S]VWuWMd _^[]j$h}Et6u B`6G6G6G6G6G 73M EOtQPE7ԋVH3҉_EʋM^d []Udjh2Pd%S]VWuWMd _^[]j h}Et/u|BAGdAGxAGAGA3M EOtQPE7ԋVH3҉_EʋM^d []UdjhO7Pd%S]VWuWMd _^[]jEg}Et(u|B<G<G=G=3M EOtQPE7ԋVH3҉_EʋM^d []Udjh1Pd%S]VWuWMd _^[]juf}Et(u|B,$G|$G$G$3M EOtQPE7ԋVH3҉_EʋM^d []Udjh/7Pd%S]VWuWMd _^[]j e}Et/u|BAG BG BG4BGLB3M EOtQPE7ԋVH3҉_EʋM^d []Udjh5Pd%S]VWuWMd _^[]j d}Et/u|BH)G)G)G)G)3M EOtQPE7ԋVH3҉_EʋM^d []UdjhO6Pd%S]VWuWMd _^[]j d}Et/u|B9G9G :G :GD:3M EOtQPE7ԋVH3҉_EʋM^d []Udjh6Pd%S]VWuWMd _^[]j 5c}Et/u B-GD.GX.Gl.G.3M EOtQPE7ԋVH3҉_EʋM^d []Udjh5Pd%S]VWuWMd _^[]j eb}Et/uB|2G2G2G2G33M EOtQPE7ԋVH3҉_EʋM^d []UdjhO2Pd%S]VWuWMd _^[]ja}Et(u|B$G%G0%GD%3M EOtQPE7ԋVH3҉_EʋM^d []Udjh7Pd%S]VWuWMd _^[]j`}Et(u|B\=G=G=G=3M EOtQPE7ԋVH3҉_EʋM^d []Udjh4Pd%S]VWuWMd _^[]j _}Et/u|BdBGBGBGBGB3M EOtQPE7ԋVH3҉_EʋM^d []Udjho3Pd%S]VWuWMd _^[]j%_}Et(u|BL*G*G*G*3M EOtQPE7ԋVH3҉_EʋM^d []Udjh2Pd%S]VWuWMd _^[]j U^}Et/u|B`%G%G%G%G%3M EOtQPE7ԋVH3҉_EʋM^d []Udjh5Pd%S]VWuWMd _^[]j]}Et(u|B.G/G,/G@/3M EOtQPE7ԋVH3҉_EʋM^d []Udjh4Pd%S]VWuWMd _^[]j$\}Et6uB 3Gp3G3G3G3G 33M EOtQPE7ԋVH3҉_EʋM^d []Udjh6Pd%S]VWuWMd _^[]j[}Et(u|B:G:G;G;3M EOtQPE7ԋVH3҉_EʋM^d []Udjh6Pd%S]VWuWMd _^[]j[}Et(u|B=G@>GT>Gh>3M EOtQPE7ԋVH3҉_EʋM^d []UdjhO3Pd%S]VWuWMd _^[]j 5Z}Et/u|B*G8+GL+G`+G+3M EOtQPE7ԋVH3҉_EʋM^d []Udjh/2Pd%S]VWuWMd _^[]j$eY}Et6u|B&Gd&Gx&G&G&G &3M EOtQPE7ԋVH3҉_EʋM^d []Udjh5Pd%S]VWuWMd _^[]jX}Et(u|BT/G/G/G/3M EOtQPE7ԋVH3҉_EʋM^d []Udjh1Pd%S]VWuWMd _^[]jW}Et(u|B3G04GD4GX43M EOtQPE7ԋVH3҉_EʋM^d []Udjh6Pd%S]VWuWMd _^[]jV}Et(u|B>G>G>G ?3M EOtQPE7ԋVH3҉_EʋM^d []̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋QVt$ t$|B5F`5Ft5F5^YQVt$ t$|B1F@2FT2Fh2^YQVt$ t$|B#F#F#F $^YQVt$ t$|B,$F|$F$F$^YQVt$ t$|B3F04FD4FX4^YQVt$ t$|B`%F%F%F%F%^YQVt$ t$|B&Fd&Fx&F&F&F &^YQVt$ t$|B$F%F0%FD%^YQVt$ t$|B,F,-F@-FT-^YQVt$ t$|Bh-F-F-F-^YQVt$ t$|BAFdAFxAFAFA^YQVt$ t$ B`6F6F6F6F6F 7^YQVt$ t$|Bl@F@F@F@F@^YQVt$ t$ B5F5F6F$6F<6^YQVt$ t$|Bt4F4F4F4^YQVt$ t$|B*F8+FL+F`+F+^YQVt$ t$|BL*F*F*F*^YQVt$ t$|B+F+F,F$,^YQVt$ t$|BD,F,F,F,^YQVt$ t$|BD?F?F?F?^YQVt$ t$|B@;F;F;F;^YQVt$ t$|B<7F7F7F7^YQVt$ t$|B7F$8F88FL8^YQVt$ t$|B|8F8F8F8^YQVt$ t$|B&F<'FP'Fd'^YQVt$ t$|B|'F'F'F'^YQVt$ t$|B;F(<F<<FP<^YQVt$ t$|BdBFBFBFBFB^YQVt$ t$B 3Fp3F3F3F3F 3^YQVt$ t$B|2F2F2F2F3^YQVt$ t$|B?F,@F@@FT@^YQVt$ t$ B1Fd1Fx1F1F1^YQVt$ t$|B (F\(Fp(F(^YQVt$ t$|BH)F)F)F)F)^YQVt$ t$|B(F(F(F)^YQVt$ t$|B.F/F,/F@/^YQVt$ t$|BT/F/F/F/^YQVt$ t$|B0F0F0F0^YQVt$ t$|B/F40FH0F\0^YQVt$ t$|B9F9F :F :FD:^YQVt$ t$|B 9F\9Fp9F9^YQVt$ t$|B:F:F;F;^YQVt$ t$|B>F>F>F ?^YQVt$ t$ B-FD.FX.Fl.F.^YQVt$ t$|B=F@>FT>Fh>^YQVt$ t$|B\=F=F=F=^YQVt$ t$|BAF BF BF4BFLB^YQVt$ t$|B<F<F=F=^Y%xB%xB%xB%xB%xB%xB%xB%xB%xB%xB%xB%B%xB%B%xB%xB%xB%xB%xB%xB%xB%xB%xB%xB%xB%xB%xB%xB%$B%$B%xB%B%xB%xB%xB%xB%xB%xB%xB%xB%xB%xB%xB%B%xB%xB%xB%xBVxBD$t jVC^VxBD$t jVC^VxBD$t jVC^VxBD$t jVoC^VxBD$t jV?C^VxBD$t j VC^VxBD$t j$VB^VxBD$t jVB^VxBD$t jVB^VxBD$t jVOB^VxBD$t j VB^VBD$t j$VA^VxBD$t j VA^VBD$t j VA^VxBD$t jV_A^VxBD$t j V/A^VxBD$t jV@^VxBD$t jV@^VxBD$t jV@^VxBD$t jVo@^VxBD$t jV?@^VxBD$t jV@^VxBD$t jV?^VxBD$t jV?^VxBD$t jV?^VxBD$t jVO?^VxBD$t jV?^VxBD$t j V>^V$BD$t j$V>^V$BD$t j V>^VxBD$t jV_>^VBD$t j V/>^VxBD$t jV=^VxBD$t j V=^VxBD$t jV=^VxBD$t jVo=^VxBD$t jV?=^VxBD$t jV=^VxBD$t jV<^VxBD$t j V<^VxBD$t jV<^VxBD$t jVO<^VxBD$t jV<^VBD$t j V;^VxBD$t jV;^VxBD$t jV;^VxBD$t j V_;^VxBD$t jV/;^%tBl$l$l$%tBl$l$l$%tBl$l$l$%tBl$l$l$%tBl$l$l$%tBl$l$l$l$%tBl$l$l$l$l$ %tBl$l$l$%tBl$l$l$%tBl$l$l$%tBl$l$l$l$%tBl$l$l$l$l$ %tBl$l$l$l$%tBl$l$l$l$%tBl$l$l$%tBl$l$l$l$%tBl$l$l$%tBl$l$l$%tBl$l$l$%tBl$l$l$%tBl$l$l$%tBl$l$l$%tBl$l$l$%tBl$l$l$%tBl$l$l$%tBl$l$l$%tBl$l$l$%tBl$l$l$l$%tBl$l$l$l$l$ %tBl$l$l$l$%tBl$l$l$%tBl$l$l$l$%tBl$l$l$%tBl$l$l$l$%tBl$l$l$%tBl$l$l$%tBl$l$l$%tBl$l$l$%tBl$l$l$%tBl$l$l$l$%tBl$l$l$%tBl$l$l$%tBl$l$l$%tBl$l$l$l$%tBl$l$l$%tBl$l$l$%tBl$l$l$l$%tBl$l$l$l$l$7l$=l$S+l$l$'l$ l$l$鉗l$Zl$5l$kl$l$+l$l$l$Fl$Fl$Dl$l$l$;l$l$̋D$8̋D$8d̋D$b̋D$g̋D$hK̋D$C̋D$R̋D$(G̋D$hH̋D$hY̋D$e̋D$(e̋D$\̋D$f̋D$xe̋D$،̋D$̋D$`̋D$hD̋D$f̋D$`̋D$Hb̋D$hh̋D$d̋D$xJ̋D$xJ̋D$Xa̋D$_̋D$e̋D$XG̋D$b̋D$J̋D$W̋D$(E̋D$K̋D$HF̋D$D̋D$HH̋D$ŐD$8e̋D$8a̋D$ha̋D$_̋D$ŐD$a̋D$g̋D$8h̋D$H^Hl$ Hl$Gl$Gl$;Gl$+Gl$Gl$ Gl$默l$l$l$xl$ml$cl$l$Rl$l$x;l$l$g?l$wl$xl$yxl$wt$t$t$t$[l$l$Twl$xl$x%lBl$l$l$%lBl$l$l$%lBl$l$l$%lBl$l$l$%lBl$l$l$%lBl$l$l$l$%lBl$l$l$l$l$ %lBl$l$l$%lBl$l$l$%lBl$l$l$%lBl$l$l$l$%lBl$l$l$l$l$ %lBl$l$l$l$%lBl$l$l$l$%lBl$l$l$%lBl$l$l$l$%lBl$l$l$%lBl$l$l$%lBl$l$l$%lBl$l$l$%lBl$l$l$%lBl$l$l$%lBl$l$l$%lBl$l$l$%lBl$l$l$%lBl$l$l$%lBl$l$l$%lBl$l$l$l$%lBl$l$l$l$l$ %lBl$l$l$l$%lBl$l$l$%lBl$l$l$l$%lBl$l$l$%lBl$l$l$l$%lBl$l$l$%lBl$l$l$%lBl$l$l$%lBl$l$l$%lBl$l$l$%lBl$l$l$l$%lBl$l$l$%lBl$l$l$%lBl$l$l$%lBl$l$l$l$%lBl$l$l$%lBl$l$l$%lBl$l$l$l$%lBl$l$l$%pBl$l$l$%pBl$l$l$%pBl$l$l$%pBl$l$l$%pBl$l$l$%pBl$l$l$l$%pBl$l$l$l$l$ %pBl$l$l$%pBl$l$l$%pBl$l$l$%pBl$l$l$l$%pBl$l$l$l$l$ %pBl$l$l$l$%pBl$l$l$l$%pBl$l$l$%pBl$l$l$l$%pBl$l$l$%pBl$l$l$%pBl$l$l$%pBl$l$l$%pBl$l$l$%pBl$l$l$%pBl$l$l$%pBl$l$l$%pBl$l$l$%pBl$l$l$%pBl$l$l$%pBl$l$l$l$%pBl$l$l$l$l$ %pBl$l$l$l$%pBl$l$l$%pBl$l$l$l$%pBl$l$l$%pBl$l$l$l$%pBl$l$l$%pBl$l$l$%pBl$l$l$%pBl$l$l$%pBl$l$l$%pBl$l$l$l$%pBl$l$l$%pBl$l$l$%pBl$l$l$%pBl$l$l$l$%pBl$l$l$%pBl$l$l$%pBl$l$l$l$%pBl$l$l$l$zl$el$Nz{l$VWu3_^L$ 8 ;usG_^D$ ϋhB_^VWu3_^L$ 8d ;usG_^D$ ϋhB_^VWu3_^L$ b ;usG_^D$ ϋhB_^VWu3_^L$ g ;usG_^D$ ϋhB_^VWu3_^L$ hK ;usG_^D$ ϋhB_^VWu3_^L$ C ;usG_^D$ ϋs_^VWu3_^L$ R ;usG _^D$ ϋS_^VWu3_^L$ (G ;usG_^D$ ϋhB_^VWu3_^L$ hH ;usG_^D$ ϋhB_^VWu3_^L$ hY ;usG_^D$ ϋhB_^VWu3_^L$ e ;usG_^D$ ϋ3_^VWu3_^L$ (e ;usG _^D$ ϋs_^VWu3_^L$ \ ;usG_^D$ ϋs_^VWu3_^L$ f ;usG_^D$ ϋB_^VWu3_^L$ xe ;usG_^D$ ϋhB_^VWu3_^L$ ، ;usG_^D$ ϋ_^VWu3_^L$  ;usG_^D$ ϋhB_^VWu3_^L$ ` ;usG_^D$ ϋhB_^VWu3_^L$ hD ;usG_^D$ ϋhB_^VWu3_^L$ f ;usG_^D$ ϋhB_^VWu3_^L$ ` ;usG_^D$ ϋhB_^VWu3_^L$ Hb ;usG_^D$ ϋhB_^VWu3_^L$ hh ;usG_^D$ ϋhB_^VWu3_^L$ d ;usG_^D$ ϋhB_^VWu3_^L$ xJ ;us_^D$ ϋhB_^VWu3_^L$ xJ ;usG_^D$ ϋhB_^VWu3_^L$ Xa ;usG_^D$ ϋhB_^VWu3_^L$ _ ;usG_^D$ ϋ_^VWu3_^L$ e ;usG _^D$ ϋ_^VWu3_^L$ XG ;usG_^D$ ϋ(C_^VWu3_^L$ b ;usG_^D$ ϋhB_^VWu3_^L$ J ;usG_^D$ ϋB_^VWu3_^L$ W ;usG_^D$ ϋhB_^VWu3_^L$ (E ;usG_^D$ ϋ_^VWu3_^L$ K ;usG_^D$ ϋhB_^VWu3_^L$ HF ;usG_^D$ ϋhB_^VWu3_^L$ D ;usG_^D$ ϋhB_^VWu3_^L$ HH ;usG_^D$ ϋhB_^VWu3_^L$ O ;usG_^D$ ϋhB_^VWu3_^L$ 8e ;usG_^D$ ϋ_^VWu3_^L$ 8a ;usG_^D$ ϋhB_^VWu3_^L$ ha ;usG_^D$ ϋhB_^VWu3_^L$ _ ;usG_^D$ ϋhB_^VWu3_^L$ O ;usG_^D$ ϋB_^VWu3_^L$ a ;usG_^D$ ϋhB_^VWu3_^L$ g ;usG_^D$ ϋhB_^VWu3_^L$ 8h ;usG_^D$ ϋ_^VWu3_^L$ H^ ;usG_^D$ ϋhB_^QT$D$ V ;usD$D$^YD$D$^Y̋T$D$V f ;us^3^%@%@%@%@%@%@%|@%x@%t@%@%p@%l@%h@%d@%`@%\@%T@%P@%L@%$A% A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%B%A%A%|A% B%HA%LA%PA%TA%XA%\A%`A%dA%hA%pA%tA%xA%A%B%B%A%A%A%A%A%,A%0A%4A%8A%E+PQgYYt'x$|!EE3Ɂ8ËeE2" Ut}u 3݅]U=݅t} uuuYY]U3݅uȃur h݅ZYY#E]U3݅ȃu]?uh݅ YY]UuYH]QL$+#ȋ%;r Y$-ȄUEVȄt j VYY^]U]tUE t3t tt3@0uuY}PY] jhpALjYu3E]e=݅tj݅7te h0 - $@ $DhD YYu)t hDhC YY݅2ۈ]EDL >tVYtu ju6S݅3@Ê]umYj hA:݅3OH݅Ee=݅tj%݅Eju+YY3ɄuYj hA} u9=݅3et t]1]SWuuSWuuSWusuu"uSPu[SVuSVu`tuHSWuout5SWu:$MQ0huu uPËe3uEUV5Ȅu3@uu u^] U]U} u uu u ] UaaEAɄ]UVuXɄ^]aaAɄɄUVu%$Ʉ^]aaA,Ʉ$ɄUVFȄ `PEPo YY^]UEȄaaA]AȄP@ YÍAȄP/ YÍAȄP YUVFȄP EYt j VKYY^]UVFȄP EYt j VYY^]UVFȄP EYt j VYY^]U MhAEP U Mh BEPb ̋AuȄg U%݅(S3C j me3 3VW݅}S[wOW E؋MEineIE5ntel ȋEj5Genu XjYS[wOW uCE%?=t#=`t=pt=Pt=`t=pu=݅=݅=݅}EEEEE|2jX3S[]؉sKS EܩEEt =݅_^tm ݅tUtN3ЉEUEM3Ƀu3u/݅E t ݅3[]3@39U$SVjtM)3hVP5݅L |xffftfpflfhEEDž@jPEVPE E@EE0@VXۍEEۉE(@EP,@u !݅^[]UDjDEjPS EP$@EtEj X]3jD@ȅu2øMZf9uA<8PEu f9HuۃxtvՃh&(@UE8csmu%xu@= t=!t="t =@t3]6̃%݅%Chd5D$l$l$+SVW1E3PeuEEEEdËMd Y__^[]QUuuu uhn h7]UeeVWN@;t t УfEP@E3EE@1E@1EEP @ME3M3M3;uO@u G ȉ щ _^]U} u=Ȅu u@3@] hޅ @hޅdYøޅøޅHHHH̸4SV$ $ ;sW>t L׃;r_^[SV, , ;sW>t !׃;r_^[Ë C3[ ; u(Uj(@u,@h @P@]U$jtjY)߅ ߅߅ ߅5߅=߅f0߅f $߅f߅fޅf%ޅf-ޅ(߅E߅E ߅E,߅hޅ ߅$ޅޅ ޅ(ޅjXkǀ,ޅjXk LjX LhDɄ]Uj]UjtM)߅ ߅߅ ߅5߅=߅f0߅f $߅f߅fޅf%ޅf-ޅ(߅E߅E ߅E,߅ ߅$ޅޅ ޅ(ޅjXkM,ޅhDɄ]U j$tM)߅ ߅߅ ߅5߅=߅f0߅f $߅f߅fޅf%ޅf-ޅ(߅E߅E ߅E,߅ ߅$ޅޅ ޅ} v }ue } vE HE E @(ޅjXkM,ޅeE@EE;E sEMU 0ޅhDɄ]%@%D@%@@%<@%8@%4@%0@%,@%(@%$@% @%@%@%@%@% @%@%@%@%@%@%@%@%@%@%@%@%@%A%@%@%A%@%A%A%@%@%@%@%@%@%@%@%@%Aðððð3jEPø 'jEPø8 jEPlød ̍Mø!̸ jEPø ̍MHø|!xjEPøX!WjEPø!7jEPø!jEP|ø("jEP\øT"jEP<ø"jEPø"jEPø"wjEPø#W̍MOø#8M7øx# MøT#jEPlø0#jEPLøH$jEP,øt$jEP ø$jEPø$gjEPø$GjEPø$%'jEPøP%jEPlø|%jEPLø%̍Mxø&M`ø%jEPø%wjEPø&WjEPø&7jEPø&jEP|ø'jEP\øH'jEP<øt'̍Mh øx(MP øT(M8 ø0(hM gø (PM Oø'8M M /)ø'jEP|ø'jEP\ø4*jEP<ø`*̍Mh ø*jEPø*w̍M( oø+XM Wø+@M ?øt+(MP+̍M@,jEP\ø+jEP<øl,jEPø,jEPø,wjEPø,WjEPø-7jEPøH-jEP|øt-̍M ø-jEP<ø-jEPø.̍MH ø.xM0 wøh.`jEPøD.GjEPø(/'jEPøT/jEPlø/jEPLø/̍Mx ø 0M` ø/jEPø/wjEPø0W̍M0>jEPø0jEP|ø 1jEP\øL1̍Mø1Mpø1MXø1jEPøx1gjEPø2GjEPø2'jEPø2jEPlø3̍Mø3Mø3Mhø3øl3jEPø@3g̍M_ø4HjEPø4'jEPø5̍Mø5Mø5Mød5jEPø@5jEPøx6w̍M(oø7XM 7FME?ÍM1+ÍMød7Mø@7Mø7Mø6Mpø6jEP ø=jEPø<gjEPø9GjEPøD9'jEPød=j EPlø9j$EPLø9jEP,øp9jEP ø;jEPø;gj EPø@Gj$EPø>'j EPø@j EPlø=jEPLø=j EP,ø:jEP ø:jEPø(;gjEPøT;GjEPøP@'jEPøH?jEPlø@>jEPLøl>jEP,ø>jEP ø9jEPø :gjEPøt?Gj EPø,A'j$EPø8=j EPlø =jEPLø|@j EP,ø<jEP øL:j EPø:gjEPøx:GjEPø<'jEPø0<jEPlø<jEPLø\<j EP,ø>jEP ø>jEPø?gjEPø$@Gj EPø;'jEPø?jEPlø?j EPLøAjEP,ø?̹% C̹Ч% C̹% C̹% C̹X% C̹0% C̹% C̹ଅ% C̹% C̹% C̹@% C̹h% C̹(% C̹% C̹ز% C̹% C̹% C̹p% C̹H%B̹ %B̹%B̹и%B̹%B̹% C̹X% C̹0% C̹% C̹ཅ% C̹% C̹% C̹h% C̹P% C̹(…% C̹Å% C̹Å% C̹ą% C̹Ņ% C̹`ƅ% C̹8Dž% C̹ȅ% C̹ȅ% C̹Ʌ% C̹ʅ% C̹p˅% C̹H̅%B̹ ͅ%B̹ͅ% C̹΅% C̹υ% C̹Ѕ% C̹Xх% C̹0҅% C̹Ӆ%B̹Ӆ% C̹ԅ% C̹Յ% C̹hօ% C̹@ׅ% C̹؅% C̹؅% C̹م% C̹څ% C̹ۅ% C̹`܅% CnbccccclcVcMPMjMK(K>KZKlKKKKKKKL LJJJLJJnJ`JNJ, str)O|O:SHCreateShellItemArrayFromDataObjectOO;SHARDAPPIDINFOIDLIST must be tuple of (, str)OO;SHARDAPPIDINFOLINK must be a tuple of (, str)SHARD value not supportedO:SHCreateShellItemArrayFromIDListsOzl:SHEmptyRecycleBinO|O&:SHCreateShellItemArrayFromShellItem|O:SHQueryRecycleBinLLO|O&:SHCreateItemFromIDListcom/win32comext/shell/src/shell.cppThis string has an invalid sub-item (too short)com/win32comext/shell/src/shell.cppThis string has an invalid sub-item (too long)com/win32comext/shell/src/shell.cppcom/win32comext/shell/src/shell.cppThis string is an invalid PIDL (win32 exception unpacking)NNOOO:SHCreateItemFromParsingNamecom/win32comext/shell/src/shell.cppO:SHFileOperationiOO&iONone is not a valid ITEMIDLIST in this context:SHGetDesktopFolderOnly sequences (but not strings) are valid ITEMIDLIST objects (got %s).ITEMIDLIST sub-items must be strings (got %s)com/win32comext/shell/src/shell.cppOOOO:SHCreateItemFromRelativeNamePython string exceeds maximum size for a PIDL itemcom/win32comext/shell/src/shell.cppcom/win32comext/shell/src/shell.cppcom/win32comext/shell/src/shell.cppOiii:SHUpdateImageO&kO|O&:SHCreateItemInKnownFolderMust be an array of IDLscom/win32comext/shell/src/shell.cppiiO|O:SHChangeNotifyType %d is not supportedOOO|O&:SHCreateItemWithParentcom/win32comext/shell/src/shell.cppshell32.dllOOO:SHGetIDListFromObjectOiii(Oi):SHChangeNotifyRegisterc:\src\python-3.8\include\object.hshell32.dlli:SHChangeNotifyDeregisterOOO:SHCreateShellItemOi:DragQueryFileFolderItemsFlagsOO:CIDAKids must be a sequence if PIDLs (not %s)Oi:DragQueryFileWOO|k:SHOpenFolderAndSelectItemscom/win32comext/shell/src/shell.cppO:DragQueryFileFileO(ii)ModeAttributesCreateTemplate:SHGetInstanceExplorerOkkl|O:SHCreateStreamOnFileExTemplate is reserved and must be NoneO:PIDLAsStrings#:StringAsPIDLiiBB|OOO:SetCurrentProcessExplicitAppUserModelIDO:AddressAsPIDLs#:StringAsCIDAO:CIDAAsStringiOOzziiO:CMINVOKECOMMANDINFO tupleNameAttributesBindCtxOk|Ocom/win32comext/shell/src/shell.cppcom/win32comext/shell/src/shell.cppcom/win32comext/shell/src/shell.cppiNNNNiiNNk|l:SHGetSettingsAssocCreatefDesktopHTMLAssocCreateForClassesDragQueryFilefDontPrettyPathDragQueryFileWDragQueryPointfDoubleClickInWebViewIsUserAnAdminSHCreateDataObjectfHideIconsSHCreateDefaultContextMenuSHCreateDefaultExtractIconfMapNetDrvBtnSHCreateShellFolderViewSHCreateShellItemArrayfNoConfirmRecycleunknown uTypeSHCreateShellItemArrayFromDataObjectSHCreateShellItemArrayFromIDListsfShowAllObjectsSHCreateShellItemArrayFromShellItemSHGetPathFromIDListfShowAttribColSHGetPathFromIDListWSHBrowseForFolderfShowCompColorSHGetFileInfoSHGetFolderPathfShowExtensionsOiiii(ii)SHSetFolderPathSHGetFolderLocationfShowInfoTipSHGetNameFromIDListSHGetSpecialFolderPathfShowSysFilesSHGetSpecialFolderLocationSHAddToRecentDocsfWin95ClassicNiiii(ii)SHChangeNotifySHEmptyRecycleBinSHQueryRecycleBinfRestFlagsSHGetDesktopFoldercom/win32comext/shell/src/shell.cppSHUpdateImageiiSHChangeNotifySHChangeNotifyRegisterSHChangeNotifyDeregisterSHCreateItemFromIDListSHCreateItemFromParsingNameSHCreateItemFromRelativeNameiiSHCreateItemInKnownFolderSHCreateItemWithParentSHGetIDListFromObjectSHGetInstanceExplorerSHFileOperationiiiiStringAsCIDACIDAAsStringStringAsPIDLAddressAsPIDLPIDLAsStringSHGetSettingsiiiiFILEGROUPDESCRIPTORAsStringStringAsFILEGROUPDESCRIPTORShellExecuteExSHGetViewStatePropertyBagSHILCreateFromPathSHCreateShellItemSHOpenFolderAndSelectItemsSHCreateStreamOnFileExSetCurrentProcessExplicitAppUserModelIDGetCurrentProcessExplicitAppUserModelIDSHParseDisplayNameIShellLink(T ՅhM  [  (T  8 0 0(GH X pCl | R  xJ  xJ  ཅx^ $ W8 H p˅K\ t H̅(E   ͅ0HF  ͅD  ΅HH( D υ@O  ЅpO  @ׅЭJʅhD4@ p`PhH@ 8d@XG8DžeȅPb Фg4LଅhKdtP`زxe0؍pTL`ȅ(exf`ూ،$жaPdHb|XЗhh0d eLlx_ąhh0hH@PhY(hhH@LhH\lhYhY8aXхp],<8eLX0҅hahxӅ0hchօU`܅8IЧM C4@`P`x\t8bÅhdÅhf؅a,@dTdh^xXaH^ۅg$<م@aXl؅_Ӆ fиbɅ8hڅ`e,<(\p0_Pc8`Xxb`8\8c4趄Ņx `ƅg8PHcpg[ԅIID_IShellLinkOi:SHCOLUMNID tupleIShellLinkAIID_IShellLinkACLSID_ShellLinkCLSID_ShellLinkIShellLinkWIID_IShellLinkWIAsyncOperationIID_IAsyncOperationNiIContextMenuIID_IContextMenuIContextMenu2IID_IContextMenu2IContextMenu3IID_IContextMenu3IExtractIconWiiO:SHCOLUMNINIT tupleIID_IExtractIconWIExtractIconIID_IExtractIconIExtractImageIID_IExtractImageIShellExtInitIID_IShellExtInitIShellFolderO|iiiNIID_IShellFolderIShellFolder2must be a sequence of mapping objects (got '%s')IID_IShellFolder2IShellIconIID_IShellIconIShellIconOverlayIID_IShellIconOverlayIShellIconOverlayIdentifierIID_IShellIconOverlayIdentifierOiiiiOO:SHCOLUMNINFO tupleIShellIconOverlayManagerIID_IShellIconOverlayManagerIShellViewIID_IShellViewsub-items must be mapping objects (got '%s')IShellBrowserIID_IShellBrowserdwFlagsIEnumIDListIID_IEnumIDListIEnumExplorerCommandIID_IEnumExplorerCommandIBrowserFrameOptionsclsidIID_IBrowserFrameOptionsIPersistFolderIID_IPersistFolderIPersistFolder2IID_IPersistFolder2sizelICategorizerIID_ICategorizerICategoryProvideriiIID_ICategoryProviderIColumnProviderIID_IColumnProviderpointlIDefaultExtractIconInitOiiiiOOIID_IDefaultExtractIconInitIDropTargetHelperiiIID_IDropTargetHelperIEmptyVolumeCacheCallBackIID_IEmptyVolumeCacheCallBackdwFileAttributesIQueryAssociationsIID_IQueryAssociationsIDeskBandiiiOO:SHCOLUMNDATA tupleIID_IDeskBandIDockingWindowftCreationTimeIID_IDockingWindowIEmptyVolumeCacheIID_IEmptyVolumeCacheIEmptyVolumeCache2IID_IEmptyVolumeCache2ftLastAccessTimeIExplorerBrowserIID_IExplorerBrowserIExplorerBrowserEventsIID_IExplorerBrowserEventsIExplorerCommandftLastWriteTimeIID_IExplorerCommandIExplorerCommandProviderIID_IExplorerCommandProvidercom/win32comext/shell/src/shell.cppIExplorerPaneVisibilityiiiNNIID_IExplorerPaneVisibilitynFileSizeINameSpaceTreeControlIID_INameSpaceTreeControlIExplorerCommandIID_IExplorerCommandICopyHookAIID_ICopyHookAcFileNameICopyHookWIID_ICopyHookWNikNNICopyHookIID_ICopyHookIShellCopyHookAIID_IShellCopyHookAIShellCopyHookWIID_IShellCopyHookWIShellCopyHookcom/win32comext/shell/src/shell.cppIID_IShellCopyHookcom/win32comext/shell/src/shell.cppIShellItemIID_IShellItemCLSID_ShellItemCLSID_ShellItemIShellItem2IID_IShellItem2IShellItemArrayIID_IShellItemArrayIShellLinkDataListIID_IShellLinkDataListIUniformResourceLocatorIID_IUniformResourceLocatorIActiveDesktopIID_IActiveDesktopIActiveDesktopPIID_IActiveDesktopPIADesktopP2IID_IADesktopP2IEnumShellItemsIID_IEnumShellItemsCLSID_KnownFolderManagerOOOOO|OOCLSID_KnownFolderManagerIKnownFolderManagerIID_IKnownFolderManagerIKnownFolderIID_IKnownFolderITaskbarListIID_ITaskbarListCLSID_TaskbarListCLSID_TaskbarListIFileOperationIID_IFileOperationCLSID_FileOperationCLSID_FileOperationIFileOperationProgressSinkOnly None is supported for obKeysIID_IFileOperationProgressSinkITransferSourceIID_ITransferSourceITransferDestinationIID_ITransferDestinationITransferAdviseSinkIID_ITransferAdviseSinkIShellItemResourcesIID_IShellItemResourcesIEnumResourcesIID_IEnumResourcesIRelatedItemIID_IRelatedItemITransferMediumItemz#|iIID_ITransferMediumItemICurrentItemIID_ICurrentItemThe buffer is way too small!IDisplayItemIID_IDisplayItemIIdentityNameIID_IIdentityNameIEnumObjectsIID_IEnumObjectsIApplicationDocumentListsIID_IApplicationDocumentListsYou must specify a value for make_unicode - got a buffer of %d bytes, but an ascii one would be %d bytes, and unicode %d bytesCLSID_ApplicationDocumentListsCLSID_ApplicationDocumentListsIApplicationDestinationsIID_IApplicationDestinationsCLSID_ApplicationDestinationsCLSID_EnumerableObjectCollectionThe buffer is too small - require %d bytes, but only %d suppliedCLSID_ApplicationDestinationsCLSID_EnumerableObjectCollectionIObjectArrayIID_IObjectArrayIObjectCollectiondwFlagsIID_IObjectCollectionCLSID_DestinationListCLSID_DestinationListclsidICustomDestinationListOiOO|iOOIID_ICustomDestinationListiiCLSID_ShellLibraryCLSID_ShellLibrarysizelThe NameMappings value must be NoneIShellLibraryiiIID_IShellLibrarypointldwFileAttributesftCreationTimeftLastAccessTimecom/win32comext/shell/src/shell.cppftLastWriteTimenFileSizecFileNamecom/win32comext/shell/src/shell.cppcom/win32comext/shell/src/shell.cppshellA module wrapping Windows Shell functions and interfacesfMaskhwndlpVerblpFilelpParameterslpDirectorynShowlpIDListlpClasshkeyClassdwHotKeyhIconhMonitorASSOCIATIONELEMENTs arg must be a sequence of tupleskOOerror|lOOOOOlOOOOOOshell32.dllshell32.dllSHGetFolderLocationSHGetSpecialFolderPathWSHEmptyRecycleBinASHQueryRecycleBinWSHGetSettingsSHGetFolderPathWSHILCreateFromPathSHShellFolderView_MessageIsUserAnAdminSHCreateShellFolderViewSHCreateDefaultExtractIconSHGetNameFromIDListAssocCreateForClassesSHCreateShellItemArraySHCreateShellItemArrayFromDataObjectSHCreateShellItemArrayFromIDListsSHCreateShellItemArrayFromShellItemSHCreateDefaultContextMenuSHCreateDataObjectSHCreateItemFromIDListSHBrowseForFolder callback with no data! SHCreateItemFromParsingNameSEE_MASK_ICON not declared on this platformSHCreateItemFromRelativeNameNilOSHCreateItemInKnownFolderSHCreateItemWithParentSHGetIDListFromObjectSHCreateShellItemSHOpenFolderAndSelectItemsSHBrowseForFolder callback failed! SetCurrentProcessExplicitAppUserModelIDhProcessGetCurrentProcessExplicitAppUserModelIDhInstAppSHParseDisplayName{s:l,s:N}ShellExecuteExshfolder.dllshfolder.dllSHGetFolderPathWshlwapi.dllO&Oshlwapi.dllSHGetViewStatePropertyBagAssocCreateSHCreateStreamOnFileEx:AssocCreateResource name too longSLR_NO_UISLR_NOLINKINFOSLR_INVOKE_MSISLR_ANY_MATCHSLR_UPDATESLR_NOUPDATENNSLR_NOSEARCHSLR_NOTRACKSLGP_SHORTPATHSLGP_UNCPRIORITYւZT6f0l*$B<NH͂rPւ`dւxxւ0DDFGւZT6f0l*$B<NH͂r ւ`,ׂx@ ׂPMMNOpPQTׂZT6f0l*$B<NH΂rpׂ`ׂxׂp\]]0Pׂ`ZT6f0l*$B<NHP΂r` 6Vׂf` @`ׂpx4Jjׂz___HTtׂ"w_\`ׂZT6f0l*$B<NH΂r|fׂ`pׂxzׂP```p`ׂ,`ׂ6`ۂZT6f0l*$B<NHтrlۂ`ۂ xۂ*΀̀0ۂ@ZT6f0l*$B<NH҂r046ۂF`H @ۂPx\*JۂZ ԀӀpp܂ZT6f0l*$B<NH`ӂrv܂`܂x$܂C8܂ZT6f0l*$B<NHӂr܂`݂x ݂`PQRST UUVWX܂ZT6f0l*$B<NHӂr0܂`܂x܂____`` `0`@`P`܂/߂߂߂ O_```ab0c@dPe$`قZT6f0l*$B<NH`Ђrfق`pقxzقpp@0Pق`ZT6f0l*$B<NH0Ђrp6Vقf`@`قpxJjقzP TtقU%0قZT6f0l*$B<NHЂr0ق`قxق@قZT6f0l*$B<NHЂrdق`xقxق `@ׂZT6f0l*$B<NH΂r,ׂ`@؂xT ؂pdh ؂0ZT6f0l*$B<NHςr0&؂6`0؂@x:؂J@eނZT6f0l*$B<NHpՂr  |ނ`ނxނ0@ނP ``0p ݂0ZT6f0l*$B<NHӂr X&݂6`l0݂@x:݂Jg0P݂`ZT6f0l*$B<NH Ԃr@P 6V݂f`4@`݂pxHJj݂zPkl\݂ZT6f0l*$B<NHԂr ݂`݂x݂0wxxyPy$`݂ZT6f0l*$B<NHPԂr`f݂`p݂xz݂ppq@`܂pZT6f0l*$B<NH0ӂrpFf܂v`Pp܂xZz܂: :d܂߂0: ;;;0<p<=p=`>??p@@pւZT6f0l*$B<NH͂r0dvւ`xւxւB܂ZT6f0l*$B<NH҂r`܂`܂ x܂* %($܂4m0%<ۂZT6f0l*$B<NH҂r@P@ۂ`Tۂxhۂ '|ۂY0'ۂc@' ׂ0ZT6f0l*$B<NH ΂r@P0&ׂ6`D0ׂ@xX:ׂJ`VVWl ق0ZT6f0l*$B<NHЂr&ق6` 0ق@x :قJ|`~}~4@`ւpZT6f0l*$B<NH`͂rFfւv`PpւxZzւ0>p>@??@؂ZT6f0l*$B<NHςr`؂`قx قpwwق$}߂wwx`؂ZT6f0l*$B<NHpςr  f؂` p؂x z؂tt, ؂i߂uu u@ ؂s߂߂0uT PpڂZT6f0l*$B<NHPтr` Vvڂ` `ڂx jڂ ڂZT6f0l*$B<NHтr ڂ` ڂx ڂP€ÀÀ`ĀĀŀ ƀƀ ڂZT6f0l*$B<NHтrpp ڂ` ڂx ڂǀȀ ނ ZT6f0l*$B<NHԂr 8 ނ&`L  ނ0x`  *ނ:~pt ݂ZT6f0l*$B<NHԂrp H݂`\݂xp݂ ߂@@߂ނ߂EE߂ ЍpP0Дp @ނPZT6f0l*$B<NHՂr0 $&FނV`80Pނ`xL:Zނj pࠁpТ` @ڂPZT6f0l*$B<NH тr@P&FڂV`0Pڂ`x:ZڂjЧP(@`ۂpZT6f0l*$B<NH@҂rFfۂv`PpۂxZzۂ `0P0@0p@`߂pZT6f0l*$B<NH0ւrp |Ff߂v`Pp߂xZz߂ 0``P߂ZT6f0l*$B<NHՂr` D߂`X߂ xl߂*ނZT6f0l*$B<NHՂr@P  ނ` ނx4ނ@`HPpނZT6f0l*$B<NH@Ղr Vvނ``ނxjނ@0`ڂ ZT6f0l*$B<NHЂr ڂ&` ڂ0x *ڂ:0p0܂@ZT6f0l*$B<NHӂrd6܂F`x @܂Px*J܂Z@..؂ZT6f0l*$B<NHςr@Pt؂`؂x؂؂0P؂`ZT6f0l*$B<NH@ςr`6V؂f`t@`؂pxJj؂zTt؂0߂@ZT6f0l*$B<NHւr L6߂F`` @߂Pxt*J߂Z04T߂d5pۂZT6f0l*$B<NHp҂r 8vۂ`Lۂx`ۂ tۂ%2\LC-rNFv]=D%Ocgi>VMYFDAtw@=TR%mG)fW0\"F-V '":i+002NfHyu ]TKFadT'tE`ެς`|I˃Fp+J=$?xԒF޾߂FW& o $aOBd-:̿,LB)隇AFS2IEt$K M;rG¸_eOkmFx8WFTpj%'GoGG+}.$u4H߈O7f{D_/F+_C(ڦH]K $O${aph}OUrb ŰKi}r^QmOR FHspOy~6JNfsñUVLM䲙Ӿo%yL%4FչL@mIh4Ku@ +0%G`묢^5N$̈옘 DMDf!\_[CWG 35T'B6Q:'9Y:Oh7&M[Or3K@~Oq !jOh nG."k1%B T #kRRJ X--ZHN?b9O'HKlqtAVgqFVe\Kz~| Ҩ\I;%SFH$O HNOiNFtA^?UXFtXT9bq^F*O =0*M~wЙl'K@-t"JL c'wj5Ob@Z|KJ5K@~Oq.jxOP‰B~dZPXBl OUК#FlHiFDMt Nn 8$M>MEQ @呰 חbPoW.I|Kg03NvFZ9\;û8FltxM NI{@ >K5i!Lz)z6,XKL߱9P0 C(DW@Xzv@`ެ&HS3M1736(A#)V&9Y:Oh7hXt_vJ)v]*@}Rn }jL^6CTd'wj5ObFS[bHNAFR IC0hxUX[∾K)#4wð1RWHΨ}'#CȫRF!Ru{HkKd_N" !:i+00E\\GNˇb zO1I( F ؂تI\"gJ]lV`R88`[1 ъ*Bp2rqF[͟W!mv`[)F#Ϋ>S0K*{+YfFK I5ꥂG)]/qNn;>VxzfCVjBŖF*TK IPB,ɨ=[E|tfapHUe`U;M|^1/`[ԐRO4plTI?rFqؘJO V:}A/)) @J7<}iFu`ެF4Oqa޼^Ol^\0p,o OsCůF+_C(ڦH/ICVJNztFS!AbosF%e{HqC,@wiKw^0wDObA AlG.PRO—-;ل.CZ0YcTTK Iw~s5i+.bFF21JOm^3lEZIC~CBg (#`OK #ص,O4K@~OqSBi+009tRNNgɆ7BWGCQl2Ft Ox_xrk(ԺCy&|=Hd_NM&uf4LP2nD\HC*v ] lELF9׉#G`` 4^ ;ݧB}/NKI6FOEг+$%|QOz)(B'WFAOfCNItwׄ+*U6F:(Y;dOr8A!ӱJ'8;owLfF;NPAM7?eEd9Ē^F{J\FЗ4mciI~+.ͩ'>O3߷;`[ƾ{,D Jec E kjO}΋!  HO :i+00Ld=0OEp#_yf@"nt<&KA>=ϦODa'wj5ObiO1 J#h~vIsB U[.IqL" VQ>pH|t$A`tpZd@y#uLKdqk(9Y:Oh76%ިYLAEGj꠷qEJ ǬMl4L~ɋ@_dP/N G:7՝5F3+z (2W]M^2mFT %19OA"=L /FLATHxV+FiPfrtgHU;aއ- pO]l^"`G3qss5i+.br`F$<;{d \&6N9jI=Smb`ߌ'yŲzCr|ުECBSlɟ$\E9 OQM\vWNVM.^}D"pNS*O#A,\Vs5i+.b|IJHKMO KF@S>LNdL֬ e.{ JOe/P($IZ^9[/tAxhj(5WWU]O ɊFըYBx`^l?<WN_3haO1FI+dWnOƠ!qFy4/]bM I]chOU\G aU.7V`ƆF鴺49L,A{_|O]UFS{a-kQG^)H٧C22~e-OР Wt חb奄`OO\;-NvEc7Vv*cMjVDEs!FsGF{H@EրEv+0-!CQ7o֩C(O\iN`|\$9Y:Oh7 G e+.bևA)[MEĀi0Ik^rTn9{ŞC $&F.6]PO,1D,=Nk.47ʸ!A9mG-*F'+I~v@L\J7~.gC\[bG^7*L"ID =ܦjc(=ORWpO6ܥ>G2Ez$HܨEye64 { 6YM+p"F*XClK3!ev _@^A% xS+dWnO} {ҜJ3F̉.|FiyŜ?OɝaKpȞ&Aõ*ieL:er=jY>4'awhM0Y3FEK}4@ Vq| *E yЎf|_GkXNut4F51Mlg*)l6ٿMp.л$53QB`ϝև+DW^ Oor˴GXL>8Ƃ>!OL'`g$#I12CgFPCU .4zF8;ӫNZiV A H Fo-XCMtY&"@0(9A8L3GHzD/4*&{-֔hJuAtXJQ xLb`wG:J'%9Y:Oh7kc~^MV׳QةP0 AGQ`{FL #Or:$aIJ9*`+cHi@UE= Dž4Cz "zC-G曂)M]`gc^NIe2.H iVhP}N<)Ѫ$$/4Ejfq6J[C40L]0wmjKDWw? cYz(w`$D&lQ`Ɔ!5C34sCU3 պFD-ʀr7v8yOo#RH kMDʹfD.b[.Í}DwMmxhO~o& IFk"t% l=:>CEgɚJ>0H Ng4Z{ْ{lhOBTyI6 EoܯOT;KI s<XGA'qQU (N伽I@܏UIZgnMI/09|)J=AxE)ПS(t;sM|@h>5qM?|a.  OuU:WPHw[ێ #RW$ZI/Փg?sy&oI V+UN;g'Dx+h\3bpc(Jg }AaB}KXJ 57Bx KiiyvF'6я]mCBUa{!sG3^F닧DBRm>oEH#ͼ_Ld=xDVm`ɠbfMlV!jДէ{E] -bVh`D!KsImDdSCAq!eRUBu(d%wCjW'tVa71CVLcBDz=ijA.VGމJ=O^7qQ Cpg{L{Sl"vM`3)/`V, ΪO(hHjxO.~,-Y@o3\.i6 IJ"՜阑D1r<NK RC4`[Z#@k{X8 rˆL~:6 B}FtxBʌHҶe_K#q}kFN]ͷghQd5CvSd_z\ LKo%E~2]r`, :i+00ٖINB]2;+IzÊChsxDp\`Otq $SJԔ<=r: Ӱ~C.`1 "RDMӌro=B:RC%jAyiȳ2hK_Lrz'WFAOFA&OA;,UpDF[ܻ1n"M{@aoM_9a@Y?JTwZح+ObƱLb VBPo`ڽWvGE>ς%=*K 9}EFVxoZ\Z܊M`* ڮP9Vu{3sG%`4)^vJYӞ~5}+EutX(T;z5Og5>'CHCy) Oh7 SNwL1"(!&D0ӗZr}Nr*Gݓ8KMn錕R䌠%D|DZ#wޒ<MB5*SAsEOW1OY ȿ:/ۆ/O FF F[F*F F FV% >FQF FPFXשFh FFFFF)FHF&F%F&F"F3Fk!Pi)?@FF:/ۆ/O0Fv nr Z'B>Mm8gh j;Yi+-z4j;Yi+-zFU 8r+C+n4FF=FacH&8Fvޮ xOF!F y.YDFF1F:/ۆ/OFCj?e~ҦFސy(_%FEFF2F:/ۆ/O4yOʙ^AiMm8gh +F FIF`k;Yi+-z4<OFFi;Yi+-z:/ۆ/OFF:/ۆ/OiM^eQI+Idʏ[FF4FGF F@FF F0:s *Dw=FFF0:s*Dw=z0Gd<O8m FFFǝv\WX$5I?#3:OF F܍TJr_/:Do(geOTN.dXecIqfe9īF+ܝ/bmGnjl},PDEST`FJhh+(@mM8alql})%WmUR:DD$ ޅcD4i'06L|TRLI878AњC%S ;dOaHyfMfCEWO}n1IKJE"Lon(qUCbLT8O6aA7PKEw-R[XO׆BOWrlu\@ʱaZ;Y@#]vjYL43oD]TBvBG]q2OGw A1o-La~)uaN[Kj5R{F G_#, D3{ETff}F䤺:yXGAGZ#GwT&YSFb9ey@p &!b E(`hiTG d|y8 ~\l[MڕH]}Be7">F?SK^ɨT1M([ /RytT2G^Cp*EBo 9_NN+$RNu|jEͶ9nFz?s>sdؖFAK{wO @{Jw/ F^E8HGDl0rVR}0 Qoʇ)NTدlJyM&BR'2\ ՙsb=tnE#o-"EDL/~EV'4cI˰=puɮADz:?J4#/c<AqZn}g<1 hNMin/[4 A𯗞u I87,}{gy\@4n*9ѕ)3]Qh#4:1J[#JPPK&#q^lM=jLR)nLsku=l:<:yO1SsX&1ЌFR;Iҩzl_]J4'܍uFx2z=̅Ur7jfqQ2mUAXE&fྉE\ĦѝQ&$2~C>`Jɋ'V6JMd \"̌':;^߇ﮃ9c|=M,g#-:͏ BUK0QBSҗjd syH? /y s?}No;d aSK,@+QQ噊fR\ξYüIKQGIDQ~M}Q_QMoE_we)A(KiO" N.TMbF@ mKd+0k6' ^BjDD F+\Xx MX3p2)A\@ߕb5O3'~ɝFνVSEXSP@ :yŏϖtG1n2CXkUY]{"M?oERQU~%Τr^; VWBؙtE0O&_9 7Ex؛čQw[G ~KtQiXCA?c$Y~2Ok2Ͷk/"U]QY܈ A$.t87(VAj|TAF@Z3KĀVMðV\bŨ\7 EׇДPE϶R"IviV4u) E%v -J /H*'NݖIFݫ<5wKjRxzRУ@KL8ԣp U]^xfJŊꁟmcB}0>@&v1قiFp޹xO<v<{eTi)Ix͹K )@G8 h;mdQ2ExN/Z*A]Ȳ}B&^ %ttzg1JpaACBN=djQF|IKJz{(hcMthJ\ YɋN6ڽofIEa|DEPJ& ?S.u wXW,~;᮪X)ߤStwP:v0Z,5D:&OlD9B4ɡP,Dn\ްJ B1~{ˊF^ߋ_P!^L`6VeKTm/Vsew[r޴ÿDCZ'*Ʊ4IH_П1XŦEIqpܞB-BQSSO +BcGyexh16U)"iFjCś21zhH}>jDZn8NWl^&jC@9Oń کLD-2ܣF ͒f"\)'k`-_%MS /Bt6F+0sM,-Z"+,fMtѼax.rC^r#QMh^FT|JF z)]/ecgEQݥIw.poDae^͢N,]ҢKҚDBpiQK>ƿ'ߕb5O3'ȜoF^}ws7C.wIzr O%%1CjCkDOJuwqRqcuiC׎I1{o.LO\ڐ{J Ok)l1Vԣuw=E^: \}FPgr~ ^ C>'֗F`/][ FiEG/$$*Oм~!#I @Mp"8X6uM%f!f^VNGBPtϯNsVB Z9]j A"s>lac6FY9Rћ\ D{rZrb{PVGC!í/wO*$e-H%lުD0;O3٩:/V`D/;OeX@@YQ0ڼx&kG#/Ce/#PWKcYt/[(es>9BB܏dG.qXùg:GJBA(뢽+mD`:>(q|lVW5P>M[8A(oʐB]JVۻ( |`_f'"ъA݊@P$LEF=uD+J]9PT`OuK)6+HR+FvuhVh*@?[R#iR,ѯ5zLK8SOxį:E֩Jd ˭i_2J`E^?e%8 ס\H3.f}TU['{CōҸU!TG٧k{ZՉ6O=E$Vw^qEJIDL%>$YCM@uo~Jk4J:\Dȕq=}lh`A)H1s};-BlB4UsW;]KEUM/!=`[˩fHa-QK!~ LJymVBSk8CCtGhi?_i+- Oc'ON:ӛR;RDW?~+B!4Bh^^G)ۈ*F8@,Qxa<M:ς9h:U`6sp\00*٩Ky3%SCDA!d|LCv m;n/Ӣ*b )-2mU~)7LV7,jQ`L:G$yRjZW?F^[( B(5LK7`{FL2QzE[)ZQK͚] ɟ{H-p4]NH= ˰~DV"N$E;k`C dtrLRF!ċTkUH ,) K4r`3CxO SyoTsac\% oFM,hsF r J ۄNQss`Dt(lNŗcMh9^'3.6)_Hx 5J]PF{o+Ģ%.DCE?)M!B^/Ò'SvZ K8 OY\oZfvFrKXкAW|b {IxÌHFH{Dzj*R;G3Oɳx J[^H-Ue&IR`؟_VO&;ז+2Yw[%3̛T{&BVo;WX@+@ =h*_fbJ6>q}0L?ݲ;8J+kJK8$x΂oRCĪh_mhEr,Ƥ;Oab<8~v@W{qwӭ݈B(} otOtaVWM*Z7_}/ƣ|&Q|O{qD HF"ntcK%b<767DϗMzcr` ],ru9T_D.*&l_`Z:[3MDZdAwqF]M& h[,. N+95&u/:Qb¶a?BBLɬs-->J6PpZd~(Qj^(YOiDŽYC?b'wj5Ob_F'8ꃈV8] 3*B&#mDŽBT U >r ^VїS0ҿ2Α I=B\ $E8LSddsxrX9VCGY7{q3K+TOatn&+FZ!*kvy35\",_ak_ mp qhMI/31I|E%VV>C93=T+ dD+Rw2u[yZc/_V^Lq|o}db6I\`qZA8unCQhZ`CF.%C֣_,ӹԅݿ~Orָ۲cEaFAO4Lf` \}%"]Bt"Ks ,AIRQQ  <,Pe$,KNw BwX.DqaQg$떱vE@E h]>\7kN'hП1x>*OЛ-&[VE3_Na[ft!%IWfR]kkTv .Fũ_JBN5mC)i&S""wJF"yg<5 jc[IF0M0Y*xlBE!Ov{pYB 9'YIrF-h$'_Ajhh~YoQK#}TnF\PDESTuO:@+@KoKK~w-oNy?IAlttJ ~zVF@bfA]eFڧ&NND9@`޿@D0M-|AZt YG8pWDkZND뒝y KGFa)AtPDEST/q/qKG)' k]f>jMPaemEE]‹qYB 9@سGTR LhJVX#e9fQxDZ=|q?A/iAKdzϞl4Z͐iS+;RUɰ -B)|0|oi?NCb_vdMgF@6A*' ^I4jh^єuANQdyoL*mO}Fn-HW[hG|ߵEIqjzF~+ /xρC%!U lHݚY&WA!O/\?+Kto>XvRM!TadX7/ǎC+l҈?:Z Q{eH,*E'2-Ew|AhteUG1 ?`QzQB3d#AQܖtFHUǰsPM 4@Ca\Uc2S&AZ^*j#M1t\Sa!DsO$E6* :r/4MQ*N7h َ(Nlդ7D--bQvhgZxGFJ o7EM; .qN HF"A*A7eBtE`O@`K:2FD=_:-1@Ǥ`ncHRĜ(uFJtыT,GEjHz^3f}ꄢO^kձSJbMӻ;J](~HsgkJL ߖW8&S<B[#~DPe]Der^Z AoJ3߀&?kpGLbvncRTT:֩htR@JEVS9'I&vOQY=}ԆR L2#\蛫uM[۲LOF}m{a͕`OH9_+75yAI+ieЎVW(z 9)[iV_*}r F2L8EԶ@ ,FPWr6M،FKnMS:%6lkZ8]w[{I<Y/2/ʇ"G"HfJh:mtP ?{I<uټPgS^uZYLZHcmKiMWOgRC^ZKB趖Bt^oW =H-$j1R @.Ol&E^E|SB[3^NP^oii QgDKPz# URSKpt!%dLPREqyr;HPs KZ7fs^Es \ǡ͞کWڂ2ş?dYH-8H [1@{E4e^x\JalF5{`aUX)sTl\O#bX6I~1.O>#ݏMp@oBCxDEST\~gYUfLf^&1!.4(2^lftC뻏KCF6\VpS[LL9Ns_2o,D[C= ?o Kyo|;ACSNqLAZ'B {9Cx&_$JD -B^6yjL;CHP3ˑKNThrݿ~Orָ0xC>CKhIgdN)ʮAߕb5O3'0iAumM*̠R~#6IҩCj팘yFO_>P xy^K 1R X*I3?5p]~C,+4-[G3f%- =A>Vmj`OOF7;6AIyAr \$E]$9b QAL3=+Lh'ՅH(Q3'zZUB00bE}DӿXXoPNF༮wISXQ 43o:G_،`YB[eLDݏ.Cb&BN.ƝBˈ Q%<)CO{P(-ʡK2)Aʤ Ne54 :GwYEY_;+ފDLNr:Ozz˜B)"^}`#)c'@t$u07cH<V;`F6 $SCUN2=G:Ja?vg~&$y#WZDq G@˘yZJOK3 R d XbbV+=S^Ә-TTL WLUus]b A,3c,/HT`9GYUSUAW K8SQguVSvK lL[o yP0 0LRK-! :)3suN#D@ A6%@Msk7cQL ôJQW3F4f6M%+CPf0 lP]0|q*+ /CPf0 ɐGM<>HHcS F}P6^AL ePfxdJ9 E $2q0X J$\?lSFMfA#"@<ԕ~XFPOrK0H<FG(HfAo)B 7&Fv6M%+Ft6M%+4᪽~ hlGF&;CtHLHihBF#FCPf0 [0scS9 [0FveX`6eVDESTpH<k+ /lRۈH<qo"Fw~iG(FLF_Mc tE:efW+FFPxHBrWLAiELWF^v7XYOK/(3;K,k_be6M%+BlWox6M%+ cS#F2FihUN~>kʇH]K4QeH֫EOIi@|]8@IOd=#L\2AD(OKdI`N]Ko\E1hsNcNc%śϕONfP)8bXNЉ2X\/ #H:_FXגK$ZQHp]x<'N70q)GA]KwS_BMs ײK`U~e0K8PN @-LߑNö$`EUw?gѐp9A M<( O)Z]=WEB,ɦ$+^H=G 7F\1 W@}K+3&L;DB{ﳙ/uFw0#TG 7F\1@cyPDNyaN[V!NZ A) NJт^ FI I%]6G{[sP=*`JW2́3xD7ppR+M\}I44SAqI!Mt3]X+〔J 1cs5f O ]FTLFYѶ,;PFM5@B 8ܻcDUї2|E8gBJj@iun8r3 FA`O7IpP^F:GX}fONZ2lila^iEE-݉oÈ)pJ,$3ڸΩFDiF#o0$ D;Q4bh!i@Ht<0`.QSM%)fTFXF[OД2,Ol @a'0&KgDnQXfHtö.1XīE+DkܶMD]AZL˴h'/hΤN7]?u༧Ea%O8HQN̄0Ll=+AƵ] )Mh6M8hcP^F:GX}ʢv]/@3!XI-X1\Q4=񽑏)DNFRE SOs˃? ^J:c\K`qdGw/"VoJpG$oGRL;B,  O1>bmO#0sB]Q2ST$HG t Sfl@KW EoqAf1~NN_+!;#O3xĻfEѷ L UB3BA ZxdQ޼{M`XMPB)DѨ!& q*F-$<+dN`ĎhhHuO0D# A$, @.%M t Ez4\ZNM8ۋ6&G^ErA~Iqp1”ky GڥQg/NOM ; |@wS:HEIE}u(1"Dy {V-kJ|ѓq?&}IK\$Mfofnx'DC ܾdD'{]Oh+'ُDdLp6DdLp6՜.+, ]8O8m%׸WDdLp6DdLp6՜.+,FrYB 9._E޸,n^g`sJdc|la ӯ>OnFi˅M hU޲ɋG$G._ =?ME\.*0[ SjnsILv3 3>n2B,aV 4kORԼ@m]rOA9 9*0[ hU޲ɋG*0[ r7J]!v>1KdyOU84eJ ǬM*0[ >WzFNɌfObA]hU޲ɋGbUnknown exceptionbad allocationd5bad array new lengthޅhޅ^_N88 ^_  ^_  \Cʄ(ʄDʄ|ʄ@ʄ@`ʄpʄDʄ|ʄ0@ʄʄʄ0@ʄHʄʄ˄(ʄDʄ|ʄH@ʄh4˄D˄X˄(ʄDʄ|ʄh@4˄˄˄˄(ʄDʄ|ʄ@˄˄˄̄(ʄDʄ|ʄ@˄А0̄@̄T̄(ʄDʄ|ʄА@0̄̄̄̄(ʄDʄ|ʄ@̄̄̄̄(ʄDʄ|ʄ@̄D,̈́<̈́P̈́(ʄDʄ|ʄD@,̈́ḧ́̈́̈́(ʄDʄ|ʄh@̈́̈́̈́̈́(ʄDʄ|ʄ@̈́(΄8΄L΄(ʄDʄ|ʄ@(΄đ|΄΄΄(ʄDʄ|ʄđ@|΄΄΄΄τ(ʄDʄ|ʄ@΄@0τ@ττ(ʄDʄ|ʄ hτxττ(ʄDʄ|ʄ @hτHτττ(ʄDʄ|ʄH@τpЄ Є8Єτ(ʄDʄ|ʄp@ЄhЄxЄЄ(ʄDʄ|ʄ@hЄЄЄЄ(ʄDʄ|ʄ@Єф ф4ф(ʄDʄ|ʄ@фdфtфф(ʄDʄ|ʄ@dф$ффф(ʄDʄ|ʄ$@фD ҄҄0҄(ʄDʄ|ʄD@ ҄d`҄p҄҄(ʄDʄ|ʄd@`҄҄҄҄(ʄDʄ|ʄ@҄ӄӄ,ӄ(ʄDʄ|ʄ@ӄГ\ӄlӄӄ(ʄDʄ|ʄГ@\ӄӄӄӄ(ʄDʄ|ʄ@ӄԄԄ(Ԅ(ʄDʄ|ʄ@Ԅ<XԄhԄ|Ԅ(ʄDʄ|ʄ<@XԄ\ԄԄԄ(ʄDʄ|ʄ\@Ԅ|ՄՄ$Մ(ʄDʄ|ʄ|@ՄTՄdՄ|Մτ(ʄDʄ|ʄ@TՄՄՄՄ(ʄDʄ|ʄ@Մܔքք$ք(ʄDʄ|ʄܔ@քTքdքxք(ʄDʄ|ʄ@Tք քքք(ʄDʄ|ʄ @քHք ׄ ׄ(ʄDʄ|ʄH@քhPׄ`ׄxׄ ׄ(ʄDʄ|ʄh@Pׄׄׄ(ʄDʄ|ʄ@ׄׄׄ؄ׄ(ʄDʄ|ʄ@ׄȕ@؄P؄l؄؄ׄ(ʄDʄ|ʄȕ@@؄蕅؄؄؄(ʄDʄ|ʄ蕅@؄0τلل(ʄDʄ|ʄ @؄(DلTلlلل(ʄDʄ|ʄ(@DلHللل(ʄDʄ|ʄH@لhلڄڄ(ʄDʄ|ʄh@لDڄTڄlڄڄ(ʄDʄ|ʄ@Dڄڄڄڄ(ʄDʄ|ʄ@ڄĖڄۄۄ(ʄDʄ|ʄĖ@ڄ薅DۄTۄhۄ(ʄDʄ|ʄ薅@Dۄۄۄۄ(ʄDʄ|ʄ@ۄ@ۄۄ܄(ʄDʄ|ʄ@@ۄ\@܄P܄h܄܄(ʄDʄ|ʄ\@@܄x܄܄܄(ʄDʄ|ʄx@܄܄܄݄(ʄDʄ|ʄ@܄@݄P݄d݄(ʄDʄ|ʄ@@݄ܗ݄݄݄(ʄDʄ|ʄܗ@݄݄݄ ބ(ʄDʄ|ʄ@݄<ބLބdބل(ʄDʄ|ʄ@<ބ8ބބބ(ʄDʄ|ʄ8@ބXބބ ߄(ʄDʄ|ʄX@ބ|<߄L߄`߄(ʄDʄ|ʄ|@<߄߄߄߄τ(ʄDʄ|ʄ@߄Ș߄߄ (ʄDʄ|ʄȘ@߄蘅<L`(ʄDʄ|ʄ蘅@<@|(@@@0TpTp\@ x@p@B|@,8@B|̙@̙@B|@(8@dx80@TL@l@ ,@Xd@HdĚ@@@@P@0|4@lP@l@(4@`l@PЛ@@@@L8@0xd@h@@ ,@Xd@H@@ 4@DP\@4|@l@@,<ԝ@hx@X@4@ X@LX@<@tȞ@䞅@,8 @dp,@TX@t@ @DP@4|PП@l TpTp4 @@B| TpTp4 @@8h xTpTp48 @h@8h8h8hX0@TpTp4X@0B@BB|X0X0X0X0xpTpTp4 (D`x@pB0 @T B B B|xpxpxpxp xp 4TpTpP4 @@t TpTp4 @Ȟ@ؠ TpTp4ؠ @@HؠؠؠL \TpTp4 @L@HLLL$dTpTp4@BHĚ@BH88 HxTpTp48 @8@4888888\PxTpTpl4\@B4П@lB4\\\\$ 4dTpTp4 @$4@$$$ ,TpTpH4 @@ġ TpTp4ġ @X@ġġġࡅ| TpTp4ࡅ @|t@ࡅ|ࡅ|ࡅ| @pTpTp4 @0@@ pTpTp(4D`@@B@@B4  TpTp<44 @@444P TpTp4P @ @PPPtp TpTp4t @p䞅@tptptp8 HxTpTp4 @8,@T888̢PpTpTp(4l`̢@@0̢̢̢̢종 ,TpTpH4종 @\@4종종종 TpTp4 @(@0,<|TpTp40@,(BL@(B0,0,0,0,PP`|TpTp4$`P@PLBl @L B( BPPPPPPPP PPp TpTp4p @@ppp TpTp4 @@H XTpTp4 @H@<HHHԣ `pTpTp(4|`ԣ@@ԣԣԣԣ d `pTpTp(4 `   `@B @ B@ B h  x  TpTp 4 @h 4@h h h 80  @ p TpTp 48 @0 @80 80 80 \   8 TpTpT 4\ @ X@\ \ \    TpTp 4 @ 4@l       TpTp 4,@ 4BlP@4Bl     TpTp4 @d@hअt TpTp4अ @tl@अtअtअt< L|TpTp4 @<8@0<<<, DTpTp`4, @@P,,,L  TpTp(4L @@LLLt TpTp4t @@ttt\ lTpTp4 @\@\\\$ 4dTpTp4 @$Л@$$$ܥ ,TpTpH4ܥ @@lܥܥܥ,TpTp 4<X@Bl@XBl(,TpTp 4DX@@<,TpTp 40X<@ԝ@<<<<`,TpTp 4X`@@````@@,<H@,ЦxHЦ@x$$$%.%@%_%~%%%%%&?&_&&&&&&'/'O'o'''''(/(N(f(((((()?)^)v))))))*?*^*******+?+_++++++,?,_,~,,,,,-/-N-f------.>.V.n....././F/^/n/////0&0>0_000001&1>1V1o111112/2O2o222223/3O3o333334/4O4o444445/5O5o555556/6O6o666667/7O7RSDSN8¦B;S(:Z0C:\src\pywin32\build\temp.win32-3.8\Release\shell.pdbm'#0 .text$di0.text$mn$.text$x`7.text$yd@.idata$5C.00cfgC.CRT$XCAC.CRT$XCUD.CRT$XCZD.CRT$XIAD.CRT$XIZD.CRT$XPAD.CRT$XPZD.CRT$XTAD.CRT$XTZD.rdataP.rdata$rx.rdata$sxdata8.rdata$zzzdbg .rtc$IAA$ .rtc$IZZ( .rtc$TAA, .rtc$TZZ0 0".xdata$x`BL.edataB.idata$2C.idata$3C.idata$4\G.idata$6p.data.data$r@:.bssL.gfids$y$"0 %"\ $" "P%" "(! %(%%"P!"!p%x%%"!%"!%" "&"L"0&"x"P&""p&""&""'"(#"#"$"#&&&&&& '"@$@'"l$`'"$'"$'"$'"%'"H%("t% ("%p("%"@&"h&X(`(@(H(("&("&("&("')"@'0)"l')"'")",)"l)"("("(P)X)))h)p)))))))))*",*0*"X*p*"*"*P*X*+"****"(+","+"0+*****"8,0+"d,P+",p+",+",+"-+"@-+"l-0,"-"-,,P,".,"<.".".,,p,x,," /,"L/-"x/ -"/p-"/"D0"l0X-`-@-H--"0-"0-"0-"1."D1."p1"2"X2"02`.h.0.8.H.P.."2."2."2/" 3/"83h/"d3"3",4"\4P/X/8/@/ /(//"4"4///" 5P0"85"6"5"860 0008000p0"p60$$11" 8"7"P8"6"8"6"7018100H1P11 10000000001"91"<9@2"h92"9 2"9`4"94":`5"D:5"p:5":`3":@3":3" ;3"L;`2"x;2";6";5";5"(< 6"T<6"<@5"<1"<5"=4"0=1"\= 3"=`1"=3"=2" >4"8> 4"d>@4">`6">@6">6"?3"@?4"l?@7"?7"?6"?6"@3"H@ 5"t@2"@2"@ 7"@4"$A-}AAB & 0B@BABЦ Y^_BBBBpBshell.pydPyInit_shellCH\@CHL@DHADM,AE[BF\b4CCc@MPMjMK(K>KZKlKKKKKKKL LJJJLJJnJ`JNJ_register_onexit_function$_execute_onexit_table_crt_atexit_crt_at_quick_exit_cexit8_initterm9_initterm_ejterminateapi-ms-win-crt-string-l1-1-0.dllapi-ms-win-crt-heap-l1-1-0.dllapi-ms-win-crt-runtime-l1-1-0.dllLpL\LlLLLLLLPLM M0C0H0N0S0a0f0n0s0x0~00000000000000000001111!1&1.13181>1C1Q1V1^1c1h1n1s1111111111111111111112222#2(2.232A2F2M2R2W2]2b2q2v2~2222222222222222222333333#31363>3C3H3N3S3a3f3n3s3x3~33333333333333333334444!4&4.43484>4C4Q4V4^4c4h4n4s4444444444444444444445555#5(5.535A5F5N5S5X5^5c5q5v5~5555555555555555555666666#61666>6C6H6N6S6a6f6n6s6x6~666666666666666666677 77!7&7.73787>7C7Q7V7]7b7g7m7r7777777777777777777778888#8(8.838A8F8K8S8X8]8c8h88888888888888888889999!9&9.93989>9C9Q9V9^9c9h9n9s999999999999999999999::!:&:.:3:8:>:C:Q:V:^:c:h:n:s:::::::::::::::::::::;;;;#;(;.;3;A;F;N;S;X;^;c;q;v;~;;;;;;;;;;;;;;;;;;;<<<<<<#+>E>T>m>w>>>>>>>>>?#?+???Z?????????  090C0X0m0r0z00000000 191C1]1l11111111122$2,2Z2222222223>3K3o3333333 44.4R4p4|4444444515=5E5W5a5555556 66)6H6[6e6t6666666 7"7@7L7T777778 88T88888888899D9x999999 :::/:9:d:::::::;;N;T;];r;x;;;;;;;;;; <<$<-=G=P=X=`=h=p=x========>">*>A>X>`>h>p>x>>>>>>>>? ??+?L?Q?]?b?s?y??????????????000'0;0`0t0000001f111111112 22#2>2C2K2b2u2{222223;3A3J3v333334!4*4b4|444444555$5,5@5j555555555566*6;6G6O6[6e6~6666666%7+7V777777828;8S8`8t8888888899"919T9`9h999999999:K:Q:Z:::::; ;;.;:;B;O;Y;h;{;;;;;;;;;< >">(>4>F>M>\>>>>>>>>? ?-?E?L?X?g?n?????@ 000.070E0`0m000000000151;1f111111222J2d2n2|222222222 3373P3Z3u3{33333484N4T4v444444445Q5W5n555555556$696`6i6~6666666 7707I7R7l7v7777778 88'808>8T8^8888889(949<9K9U9z99999999:::::T:^::::::::;;*;6;>;M;W;;;;;;;;<<:!>+>D>T>>>>>>>>? ?8?M?k?t??????P|0 0&0/0D0N0x00000001%1.1G1Q1d1q111112 2)2/2;2n2222223;3A3J3333334$40484J4T4p44444444405N5]5j555555 6.646=6R6X6h6666666677-7V7k7u77778 8)818?8h8|888889;9A9J999999::<:H:P:a:z:::::::;;*;V;`;v;;;;;;;;<<<>->7>N>g>q>>>>>>>+?1?:?b?r??????`0"0<000000011 1!1+1\1r111111(2V2g2s2{222222222 3B3L3b3p333333 44>4D4M4b4h4y4444444555I5Y5555555556%6+6U6[666666+717:777777 8)8b8|888888999$9,9@9j9999999999999::1:f:o::::::::::;8;P;Z;i;~;;;;;;;;;; <)<5<=>>$>8>g>z>>>>>>>>>>>? ?6?k?q?z??????p00"0/090J0d0n000000000 11-1<1X1_1k1s1111111122+232B2L2j2222222223 3*3I3S3m3|333333333344%4+4V4444495^5d5555556676A6T6a666667@7I7r777777777788*8K8T8{8888899/9H9h99999999 ::::O:^:z:::::::: ;;";3;?;G;S;];z;;;;;;; <-<5 >!>8>B>d>v>>>>>>>>??!?-?j??????????000F0{00000011+1F1O1[11111111122#2)2E2P2x22222222333%3*3/353J3T3w33333333444,4E4Z4`4g4t44444444445595I5`55555555 6P6U6[6w6666677>7H7[7q777777777 838=8K8Y888888899>9D9M9b9h9u9{99999,:B:a:k:::::::;;1;W;`;;;;;;;<<)<1<>7>F>l>>>>>>>>>>???,?D?V?e???????000$0+070U0[00000 1"1?1I1_1111112 2"2n222222222333.3A3R3^3f3r3|3333333334.444=4R4X4i444444,5N5V5\5o555555555566%6F6[6t6~6666666666 7%7+7V77777788#828H88888888809d9~9999999 :::(:1:;:N:a:r:~:::::::::;;;';N;T;];r;x;;;;;;;<>!>.>8>A>K>^>q>>>>>>>>>> ???-?7?^?d?m????????0[0}00000000001 1141F1U1u11111112222'2E2K2v22222313;3Q333333334*434g4r4444444 555(515;5N5a5r5~555555555666'6N6T6]6r6x66666677&7L7h7p7v777777777778&858U8j88888888889%9+9V999999::.:D:h::::::::::;;;#;-;L;h;r;;;;;;;;,$>.>R>h>t>|>>>>>>>>>"?.?6?J?h??????????0020G0S0[0j0t000000000 1)131[1t11111111222F2R2Z2i2s22222223'3/3>3H3W3i3s33333333334#4>4J4R4m444444444+515:555556666T6`6h6w66666666 77!707:7Z7t7~7777777 8$8.8V8t88888888888&9/9C9J9a9k999999999&:/:C:J:a:k::::::::;;F;{;;;;#<2=Q=[=r=======>>!>+>B>j>v>~>>>>>>>> ??'?J?i?s????????090C0Q0]0z000000011%141J1V1^1p11111111112$2-2B2H2V2]2i2|2222222223 33,323M3f3r3w3}3333333334"4'4-4B4L4e4z44444444445515B5K5P5X5m5w555555556 6%6:6S6\6a6i6~666666666 7757;7f777777 88"8+858V8s8|88888889,959J9W9r99999999::>:D:M:b:h:u:{:::::;C;R;j;;;;;;;;<$>5>f>o>{>>>>>>2?9?S?i?s????????0K0Q0Z0000001"111[1b1n1v111111112202?2M2q22222222222333&3A3J3c33333334 4(4b4h444444455)565U5[555555#626P6|666666777%757X7l77777777778882898Z8`8u8{88888"9:9T9^9q9{9999999::):>:J:R:_:i:x::::::::::;B;K;c;p;;;;;;;;<>*>I>U>]>l>v>>>>>>>>? ??&?>7>=>D>Z>a>>>>>>>??)?A?H?R????????00.0t00000000001W1]1d1u111111252<2H2[2b2}2222222233"3E3L3X3d3{333333333 484?4I44444445545F5U5t555555666p6y6666 7$7.7R7h7t7|7777778$81898G8P8g8y888888888899(9T9]9u9{999999#:,:B:I:[:u:::::::;K;Q;Z;;;;;;; <<'><>Q>>>>>>>>>>?:?T?^?m????????00"070X0k0u00000000011*121B1R1_1h1q1z111111111111.242=2R2X2e2k222223\333333334 4 4:4U4Z4d4s444444455+575?5T5y555555566.6:6B6S6]6|6666667 77.7Z77777778#828<8Z8u8z888888888969?9W9d99999999::6:P:e:m:~:::::;;%;A;g;;;;;;;;<<<2<8'>F>U>g>>??F?{????? 00-0<0Z0f0n0}0000000011&1:1X1p1z111111112 22'2@2j22222223"303<3Y3m33333334414;4J4m4y444444444455585K5U5d5z55555555 66$6O6[6c6r6|66666667'7/7C7h7{7777777778818;8J8r8~88888889969B9J9Y9c9z99999999:::::T:^:x::::::::: ;;&;0;?;k;w;;;;;;;; <K>Q>Z>>>>>>>> ??%?/?9?H?V?g?s?{?????????? |&0[0a0j00000 1(141<1K1U11111111112/292H2]2i2q2~222222223 3"353f33334"4:4T4^444444444455"555Q5X5s5}555556 6<6z666666667H7b777777&8`8i888889929H9[999999999::+:::_:f:r:z::::::;;!;?;R;|;;;;;;;;<<<>>2>8>I>a>>>>>> ?%?/?L?U?j?t?????00 0L0s000000001$1,1A1Z1~111112 22%2:2T2^2t222222222"3+3C3P3d3p3x3333333344"4/494J4i4s444444445#5K5m5y55555555666,666Z6t6~666666677+7^777777777 888-878Z8t8~888888888999C9l999999999:::":8:F:h:q:::::::;&;6;Z;a;n;;;;;;;;;;<<4 >5>?>i>>>>>>>>??9???c?v????????@X 000090N0X0u0|000000001141<1S1]1u1{11111,2S2b2z2222223=3I3Q3`3j33333333334404:4U4[444444#525L5a55555566L6Y6a6666666 7"717O7[7c7t7~777778 8/8l8x8888889#9>9T999999:!:7:::::: ;);3;I;_;n;;;;;;;<,">/>W>u>>>>>:?C?[?w?????P|0.040=0R0X0i0t00000001#1+1D1K1o1t1z111112272>2C2H2N2c2m222222221363<3B3f333333331464<4B4f4444445 5'535L5U5`5j55555556$6?6a6k6p6v666666777h7o7777778.858P8o8{888888899)939w9}999999+:1:::b:|::::: ;;!;6;j;t;;;;;;; <<$>>f>>>>>>??,?F?R?Z????`i000000001,161O1X1i111111112222<2U2^2s2}22222223393g3p3333334"4H4n4t44444455&535Y5o5x555555&6`6i66666 77;7b7n7v777777777 88,8<8F8`8f8}88888 999L9s999999 :::0:6:Z:t:~:::::::;$;-;B;H;X;z;;;;;;;;;<:<@<\>8>?>K>S>d>>>>>>>>?#?)?H?[?e?t?????????p000!060<0b0{0000001 1%1>1H1_1e1z1111111122E2K2v22222#323L3a33333333 4#4L4a444444455*5X5p5z5555555555666'636=6Z6y6666666667 7"7(787F7a7j777777778888>8W8g8q8888888889&959X9r9x999999999&:[:a:j:::::;;&;V;`;v;;;;;; <<$<:>7>C>K>_>~>>>>>>>>>>??R?\?{?????? 0!0<0F0_0h0z000000001"1.13191N1X1u11111111111 2 2&2A2R2[2`2h2}22222 333l333333 4*464>4Y4444444455575p55555556 66/6`6k6u6z66666667,7>7Q7[7j777777778848@8H8]8m888888889C9H9R9a9|9999999::(:0:D::::::::::#;(;2;A;\;h;p;;;;;;;<<(">?>H>]>g>>>>>? ??8?W?`?~?????0,050J0T0x000000000141>1Y1r1{11111112202:2k2u2222223303F3O3d333333344K4U4l4444444 5%5;5D5Y555555666W6y666767p7y7777 8.888F8v8888888919D9N9]9l99999999: ::):I:U:]:x:::::::;;8;K;U;d;z;;;;;;;;<<<,<6=H=l=r======>.>7>U>x>>>>>>>>??;?D?Y?f????????,060U0^0y00000011'1,141I1S1u1111111112232=2V2_2q2{2222222 33/383J3T3m3v3333334!4*4|4444444 55505J5_5i5x555555556(646<6L6r6x6666666 77"7,7P7m7z77777778+858D8Z8f8n8}8888889!9P9n9x9999999 :>:H:U:y:::::::;;#;/;7;C;M;n;t;};;;;;;;< < <*6>?>Z>`>x>>>>>>>?5???\?e?z???????0070e0n00000001131@1g11111111&2E2N2c2p2222223;3A3J3333333344&454?4Z4z44444444445515;5J5i5u5}5555555556%6-6<6F6Z6q666666666717<7K7Z7m7w77777778$8.8=8L8k8w88888889929>9F9U9_9x9999999 ::":;:G:O:^:h:z:::::::; ;;#;9;E;M;\;f;x;;;;;;;;#>+>9>B>[>>>>>>??-?9?A?O?X?q????????0;0A0J00000000101O1]1b1k111111111122'2Z2t2~22222223(323G3U3Z3b3r3333333344(464K4U4b4k4x44444444455$5-595J5V5z55555555566(6H6R6g6u6z666666666 7$7.7H7V7k7u7777777777 8(8@8J8X8m8z8888888888909:9H9]9j9s9~999999999:#:/:8:E:N:T:`:z::::::::;;;:;a;k;;;;;;;;;;<#<9c>r>>>>>>>>> ??*?D?N?]?w????????00"0/090H0[0e0t00000000011"1/191N1T1]1r1x11111122'2A2H2Y222222222223*3=3B333333333'4R4`4g4444444444555J5O5W5q55555566$6>6]6s666666666666667+797I77777777778888'8/8>8M8\8f8l8t8{8888888888888888899 99'9-94999?9I9O9W9`9d9h9l9p9t9x9999999<:c:r:::::::: ;(;@;J;Y;n;z;;;;;;;;;;<<<'<9>#>/>7>C>M>j>>>>>>>> ??"?3???G?S?]?z?????000'0:0Y0c0y00000001 1"1(121B1X111111111$262=2L2d2v2}2222223 3T3]3m3t333334$4-4K4d4v444445 5585>5^5g5x55555555656<6W6a6x66666667 7(7E7N7c7p777778 8B8W8j8{8888888888999%9/9H9a9f9p9999999999::$:0:8:E:O:h:::::::::::; ;";(;5;;;f;;;;;<"<:=J=R=_=i=|======>>1>C>X>t>>>>>>>>??*?I?U?]?n?????0+040A0p0|00000001:1C1_1q1z1111111 2 262M2_2d2~22222223332383D3t3{33333333344-444>4|4444444455.575F5f5555555556 6'606n666666677-797Q7W7t777777778,858;8G8O8k8t8888888899)969G9k9p9z9999999+:1:::::::;;!;+;:;^;j;r;;;;;;;;<<<,>">2><>Z>c>x>>>>>>> ??K?Q?d?????010>0i0000000C1L1b1u1111,2S2b2z222222223383P3Z3i3~3333333333 4)454=4L4V4j444444445552595?5\5q55555556'6<6X66666666677&727K7d7w777777777898C8V8`8o8888888*939O9e9n9{999999999:1:n:w::::::::;K;W;_;m;v;};;;;;;;;<*<2 >>:>T>^>q>{>>>>>>>>>??(?/?=?P?V?r???????0 0050<0H0W0^0y00000000 11I1S1p1y11111122(2<2X2^2h2222223!3E3g3333333344+484B4\4i4~4444444455/585D5h555555566)666@6Y6f6666666777i7s7777777868@8S8Y8e88888888993999E9~9999999::):3:U:\:h:w:~::::::+;1;:;r;;;;;;;;;; <<: >6>k>q>z>>>>? ??|?????? pL000000,1S1j1x1}111112O2]2l2q2y2222222373?3V3[3~33333334,4;4L4[4s4444444-5B5R5a55555 66 6(6T6k6666617L7h7}7777777 88$8+8=8_8p888888999'989H9S9m999999 :::::D:Y:`:k:q:::::::::;&;:;R;o;y;;;;;;;;;<4V>v>>>>>>> ??&?T?Y?b?|???????00000c0k0000001>1w1111111272d33414T4l444444\5d5x5566-666=6`66666666667>7r777777 88L8|8888888929;9m999999 :):?:P:W:\:d::: ;+;7;<;D;W;k;;;;;;< >>>%>M>}>>>>>>>>>> ??;F;O;b;g;o;;;;;;;;;;;;;; <<.<7(>2>\>i>r>w>>>>>>>>>>> ???(?6?@?h?r?????????P00N00000181P1W1\1g1n1t1|111111111111 292C2`22222222233 313B3O3\3g3o3v333333344434;4D4n4x44444445 5585B5^5t5~555555555556#6[6j6666667(7V7`77777777777888:8A8G8_8f8l88888888889 992999?9X9_9e9~9999999999::*:9:K:v:::::::;<;c;w;;;;;;;;;;;;<<1<8>>'>9>f>m>|>>>>>>>>?L?Q?Y?d????????`0M0R0Z000000011.1=1]1c1r111111112'2F2U222222&3U33333445 53585@5g5t5}5555555555666'646I6P6\6j6s66666666667A7X7c7t7}7777788/8M8t8888888899)9?9I9i9w99999999999 :::":5:=:J:V:u:::::::;;#;,;5;?;K;~;;;;;;;;;;;<<<5<=>*>9>h>v>>>>>>>>> ?'?5?g?y?????????p!050c0w000000001 11L1e1m1z111111111 2 2)252>2Q2d2w2222223330393B3L3u3}3333333334&424;4U4u4}44444445 55"555E5e5m5z55555566-666B6K6^6q66666666 7737J7j77777777808L8]8e8r88888899$90999J9_99999999=:G:T:p:{:::::::; ;;.;8;U;_;m;~;;;;;;;; <(<2>(>9>B>L>T>e>>>>>>? ??%?,?1?9?N?t????????? 00"0L0U0m0z000000000011"1+171@1Q1`1|1111111122'252N2d2q2z2222223'3E3V3u333333333333334444#4(4/454:4A4G4L4S4Y4^4e4k4p4}444444444444444444444455 5555$5+51565=5C5H5O5U5Z5a5g5l5s5x5~55555555555555555555556 6666 6'6-62696?6G6M6R6[6b6k6s6x6~666666666666666677#707=7J7W7d7t77777777777777778 888!8/848?8D8O8T8_8d8o8t888888888888888889 999%9*959:9E9J9X9]9h9m9x9}9999999999999999: :::#:.:3:>:C:N:S:^:c:n:s:::::::::::::::::; ;;;$;);4;9;G;L;W;\;g;l;w;|;;;;;;;;;;;;;;;;; <<<"<-<2<= >>>!>,>1><>A>L>Q>_>d>o>t>>>>>>>>>>>>>>>>>????%?*?5?:?E?J?U?Z?e?j?u?z???????????????? 0 000 0+000;0@0N0S0^0c0n0s0~00000000000000001111$1)14191D1I1T1Y1d1i1w1|11111111111111111 2222*2/2=2B2M2R2]2b2m2r2}22222222222222223333#3(33383C3H3S3X3f3k3v3{33333333333333333 4444,414<4A4L4Q4\4a4l4q4|44444444444444445555"5'52575B5G5U5Z5e5j5u5z55555555555555<666666 7Y7_7f7m7t77)8/868=8D88889 99|999999L::::::;i;o;v;};;;9>>>>>,?y?????? I0O0V0]0d0011&1-141;1111112l2222222<3333333 4Y4_4f4m4t44)5/565=5D55556 66|666666L7777778i8o8v8}88888I9O9V9]9d9k99::&:-:4::::::;l;;;;;;;<<<<<<<< =Y=_=f=m=t={==)>/>6>=>D>K>>>>? ???|??????L0000001i1o1v1}111192?2F2M2T22 3333$3+3333333\44444444<555555 6Y6_6f6m6t66)7/767=7D7K77778 888"8888888\999999,:y:::::.>4>=>D>K>n>t>}>>>>>>>>>>>? ?.?4?=?D?K?n?t?}???????????<000$0+0N0T0]0d0k000000000000111$1+12191^1d1m1t1{11111111111112$2-242;2B2^2d2m2t2{222222222223$3-343;3^3d3m3t3{333333333334$4-444;4^4d4m4t4{444444444445$5-545;5B5^5d5m5t5{5555555555556 6.646=6D6K6R6n6t6}6666666666667 7.747=7D7K7n7t7}777777777778 8.848=8D8K8R8n8t8}888888888889 9.949=9D9K9R9n9t9}99999999999: ::.:4:=:D:K:b:r:::::::::;;";2;B;R;b;r;;;;;;;;;<<"<2U>>>>?E?u???050e0000%1U11112E2u222353e3333%4U44445E5u555656b6666"7R7777"8R8888"9R9999:B:r:::;2;b;;;<2B>r>>>?2?b?001'1G1g111112'2G2g222223'3G3g333334'4G4g444445'5G5g555556'6G6g666B8r888929b999:2:b:::;2;b;;;;"B>r>>>?2?b????"0R00001B1r111222b222323b333424b4444"5R55556B6r6667B7r777828b8888"9R9999:B:r::;D;z;;;<:D>z>>?d???p$0Z0001D1z1112:2d2222$3Z33334D4z4445d555$6Z66667D7778:8d8888$9Z999:D:z:::;:;d;;;;$<<<>=D=J=P=V=\=b=h=n=t=z=======================> >>>>">(>.>4>:>@>F>L>R>X>^>d>j>p>v>|>>>>>>>>>>>>>>>>>>>>>>?? ????$?*?0?6?0D0J0P0V0\0b0h0n0t0z000000000000000000000001 1111"1(1.141:1@1111b2%3V3333333434:4@4R4\444445)515I555+6Z6j66666666 7=7G7U7g7|77788969N9T9i99999999:@:m:::::: ;;;;;;< <@!>i>q>>>>> ?(?4?C?L?Y?????????? 00 03080^0f0p0000000000000001 111 1(141=1B1H1R1\1l1|1111111111112 2222'2/2:2?2E2O2Y2l2q22222222222222222 3333I3X33333333333333333333344444 4&4,42484>4D4J4P4V4\4b4h4n4t4z4444444445/5A5`555556 6@6`666666707P7p77777808O8g888889 9@9_9w99999: :@:_::::::: ;@;`;;;;;<<@<`<<<<<<=0=O=g=====> >?>W>o>>>>>?/?G?_?o?????00'0?0`000001'1?1W1p11111202P2p22222303P3p33333404P4p44444505P5p55555606P6p66666707P7a7g7q7w777777777777777778888!8'81878A8G8Q8W8a8g8q8w888888888888888889999!9'91979A9G9Q9W9a9g9q9w99999999999999999::::!:':1:7:A:G:Q:W:a:g:q:w:::::::::::::::::;;;;!;';1;7;A;G;Q;W;@333333333333333444 44444 4$4(4,4044484<4@4D4H4L4P4T4X4\4`4d4h4l4p4t4x4|4444444444444444444P81<1@1D1H1L1P1T1X1\1`1d1h1l1p1t1x1|1111111024282<2@2D2H2L22222222244555 55555555555<<<<<<<<>>>>>>>>`4080<0@0D0H0L0P0@2D2H2L2P2T2X2\2`2d2h2l2p2t2x2|222222222$4(4,4044484<4@485<5@5D5H5L5P5T566 6$6(6,6064688888888<<<<<<<>> >>>>>3333333333333444 44444 4$4(4,40484<4@4D4L4P4T4X4\4`4d4h4l4p4t4x4|44444444444444444444444444444444555 55555 5$5(5,5054585<5@5D5H5L5P5T5X5\5`5d5h5l5p5t5x5|5555555555555555555555555555555666 6666 6$6(6064686@6D6H6L6T6X6\6`6h6l6p6t6|66666666666666666666666666666777 77777 7$7(7,7074787<7H7L7P7\7`7d7p7t7x77777777777777777777777777778888888$8(8,80888<8@8D8H8L8P8T8`8d8h8l8t8x8|8888888888888888888888888999 99999 9$9(9,9094989<9@9D9H9L9P9T9X9\9`9d9h9l9p9t9x9|99999999999999999999999999999:: ::: :,:0:4:8:@:D:H:L:T:X:\:h:l:p:t:|::::::: @3333333333333333333333333333444 44444 4$4(4,4044484<4@4D4H4L4P4T4X4\4`4d4h4l4p4t4x4|444444444444444444444444444444444555 55555 5$5(5,5054585<5@5D5H5L5P5T5X5\5`5d5h5l5p5t5x5|555555555555555555555555555555555666 66666 6$6(6,6064686<6@6D6H6L6P6T6X6\6`6d6h6l6p6t6x6|666666666666666666666666666666666777 77777 7$7(7,7074787<7@7D7H7L7P7T7X7\7`7d7h7l7p7t7x7|777777777777777777777777777777777888 88888 8$8(8,8084888<8@8D8H8L8P8T8X8\8`8d8h8l8p8t8x8|888888888888888888888888888888888999 99999 9$9(9,9094989<9@9D9H9L9P9T9X9\9`9d9h9l9p9t9x9|999999999999999999999999999999999::: ::::: :$:(:,:0:4:8:<:@:D:H:L:P:T:X:\:`:d:h:l:p:t:x:|:::::::::::::::::::::::::::::::::;;; ;;;;; ;$;(;,;0;4;8;<;@;D;H;L;P;T;X;\;`;d;h;l;p;t;x;|;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<<< <<<<< <$<(<,<0<4<8<<<@>> >>>>> >$>(>,>0>4>8><>@>D>H>L>P>T>X>\>`>d>h>l>p>t>x>|>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>??? ????? ?$?(?,?0?4?8?>> >>>>> >$>(>,>0>4>8><>@>D>H>L>P>T>X>\>`>d>h>l>p>t>x>|>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>??? ????? ?$?(?,?0?4?8? >$>4>8><>@>D>L>d>t>x>>>>>>>>>>>>>>>>>??,?> >$>4>8>H>L>P>T>X>\>d>|>>>>>>>>>>>>>>>?? ?$?4?8?H?L?P?T?X?`?x????????????????$00 0$04080H0L0P0T0X0`0x000000000000011,1014181<1@1D1H1L1T1l1p111111111111122(2,20282P2T2l2p22222222222223$3(3,30383P3`3d3h3l3p3x33333333333333 44 4$4,4D4T4X4\4d4|444444444444455 55,5<5@5D5H5P5h5x5|555555555555556$6(6,646L6\6`6d6l66666666666677 77,7<7@7D7L7d7t7x7|777777777777 88 8$8,8D8T8X8\8d8|888888888888889 99909@9D9H9P9h9x9|99999999999999::(:,:0:4:<:T:d:h:l:p:x:::::::::::;;;; ;8;H;L;P;X;p;;;;;;;;;;;;;;<<(<,<0<8>0>4>L>\>`>p>t>>>>>>>>>>>>>>>>>>>>?$?(?8?>> >>>> >8><>T>d>h>x>|>>>>>>>>>>>>>>>>>>???,?0?@?D?T?X?h?l?|??????????????????0 00 00040D0H0L0P0T0X0\0`0d0h0l0p0x000000000000 11111 1$1(1,1014181<1@1D1H1P1h1l11111111111111222 22222 2$2,2D2H2`2p2t222222222222222222223$3(383<3@3D3H3L3P3T3X3\3`3d3h3l3p3t3|3333333333 44 4$44484H4L4\4`4d4h4l4p4t4x4|44444444444444444455 5$5<5L5P5`5d5t5x5555555555555555555566,6<6@6P6T6d6h6x6|666666666666666667777,707@7D7T7X7\7`7d7h7l7p7t7x7|7777777777778 88 8$8(8,8084888<8@8D8H8L8P8T8X8`8x8|88888888888899999 9$9(9,9094989<9@9D9H9L9P9T9X9\9d9|9999999999:::$:(:8:<:L:P:`:d:t:x:|::::::::::::::::;;;;(;,;<;@;D;H;L;P;T;X;\;`;d;h;p;;;;;;;;;;;;<< <<<<< <$<(<,<0<8>(>,>D>T>X>h>l>|>>>>>>>>>>>>>>>>>>>?? ?0?4?D?H?X?\?l?p??????????????????? 00 0$04080H0L0P0T0X0\0`0d0h0l0p0t0|0000000000011111 1$1(1,1014181<1D1\1`1x111111111111111111122 2$2(2@2P2T2d2h2x2|222222222222222222333,303@3D3T3X3h3l3p3t3x3|3333333333333334 44 4044484<4@4D4H4L4P4T4X4\4d4|4444444444444555 55555 5$5,5D5H5`5p5t5555555555555555555555566 686<6T6X6p666666666666666666777 77777 7(7@7D7\7l7p777777777777777777777888 88,808H8X8\8l8p8888888888888888888888899949D9H9X9\9l9p99999999999999:$:(:8:<:@:H:`:p:t::::::: T40@0`0l00000 1,1L1T1`11111112$202P2\2|2222223 3,383\333333 44<4D4P4p4|4444445 5,5L5X5x5555556$6D6d6l666666667$7D7P7p7|77777888\8888888(909h9p9999 :(:0:<:\:h::::::; ;,;4;L;X;|;;;;< <4<<> >@>L>p>>>>>?$?0?P?\?|??????0l0(0H0h0p000000001(1H1T1t11111 2,242T2\2222222233<3H3h3t33334(404X4`444444555<5H5l55555646<6l6t666666667$7H7l7777778$8L8T8|88888888899 9@9L9l9x9999999:(:H:T:t:::::::;$;0;P;\;|;;;;;;< <,<8><>H>h>t>>>>>>>?$?D?P?p?|??????@P0 0,0L0X0x00000001(141d1h1111111111222$2,24282<2D2X2p00 0000 0$0,00040<0@0D0L0P0T0\0`0d0l0p0t0|000000000000000000000000011 1111 1$1,1@1D1L1`1d1l111111111111111111111111111111122 222(2,282<2X2\2h2l2222222222222333 3$30343@3D3P3T3`3d333333333333344 4$4@4D4P4T4`4d4p4t4444444444444445555 5$50545P5T5`5d5p5t555555555555566 6$60646@6D6P6T6p6t66666666666666677 7$70747@7D7`7d7p7t777777777777777778888 8$80848@8D8`8d8p8t8888888888888889999 9$9@9D9`9d9p9t99999999999:::: :$:0:4:@:D:P:T:`:d:p:t:::::::::::::::::;;;; ;$;@;D;P;T;`;d;;;;;;;;;;;;;;;;;<< <$<0<4<@ >>>(>,>H>L>X>\>x>|>>>>>>>>>>>? ???(?,?H?L?X?\?x?|?????????????????0 000(0,080<0X0\0`0d0h0l0p0t0000000000000001111 1$1@1D1H1L1P1T1X1\1h1l1x1|11111111111112 2(2,282<2H2L2h2l2x2|2222222222222223 3(3,383<3H3L3X3\3h3l3x3|3333333333333334 444(4,484<4H4L4X4\4h4l444444444444444445 55585<5H5L5X5\5h5l5x5|555555555555555556 666(6,686<6X6\6h6l6x6|666666666666666667 777(7,787<7H7L7X7\7h7l7777777777777777777777888 88888 8$8(8,8084888<8D8H8L8T8X8\8`8h8l8p8t8|8888888888888888889999 9$9@9D9P9T9`9d9p9t999999999999999:: :$:0:4:@:D:`:d:p:t:::::::::::::::::;;;; ;$;@;D;L;P;T;\;`;d;l;;;;;;;;;;;;;;;;;<<<< <$<0<4<@>>> >$>0>4>@>D>P>T>`>d>p>t>>>>>>>>>>>>>>>>>????0?4?8?4>X>>>>> ?,?X?t?????t080X0x00000181\111111242P2t2222303P3p33333484\444445,5L5t555556<6`66666PK {Rwin32comext/shell/test/UT Zx`Zx`ux PK ѳP&c-win32comext/shell/test/testSHFileOperation.pyUT l_Zx`ux from win32com.shell import shell, shellcon import win32api import os def testSHFileOperation(file_cnt): temp_dir=os.environ['temp'] orig_fnames=[win32api.GetTempFileName(temp_dir,'sfo')[0] for x in range(file_cnt)] new_fnames=[os.path.join(temp_dir,'copy of '+os.path.split(orig_fnames[x])[1]) for x in range(file_cnt)] pFrom='\0'.join(orig_fnames) pTo='\0'.join(new_fnames) shell.SHFileOperation((0, shellcon.FO_MOVE, pFrom, pTo, shellcon.FOF_MULTIDESTFILES|shellcon.FOF_NOCONFIRMATION)) for fname in orig_fnames: assert not os.path.isfile(fname) for fname in new_fnames: assert os.path.isfile(fname) shell.SHFileOperation((0, shellcon.FO_DELETE, fname, None, shellcon.FOF_NOCONFIRMATION|shellcon.FOF_NOERRORUI)) def testSHNAMEMAPPINGS(file_cnt): ## attemps to move a set of files to names that already exist, and generated filenames should be returned ## as a sequence of 2-tuples created from SHNAMEMAPPINGS handle temp_dir=os.environ['temp'] orig_fnames=[win32api.GetTempFileName(temp_dir,'sfo')[0] for x in range(file_cnt)] new_fnames=[win32api.GetTempFileName(temp_dir,'sfo')[0] for x in range(file_cnt)] pFrom='\0'.join(orig_fnames) pTo='\0'.join(new_fnames) rc, banyaborted, NameMappings=shell.SHFileOperation((0, shellcon.FO_MOVE, pFrom, pTo, shellcon.FOF_MULTIDESTFILES|shellcon.FOF_NOCONFIRMATION|shellcon.FOF_RENAMEONCOLLISION|shellcon.FOF_WANTMAPPINGHANDLE)) for old_fname, new_fname in NameMappings: print('Old:',old_fname, 'New:', new_fname) assert len(NameMappings)==file_cnt testSHFileOperation(10) testSHFileOperation(1) testSHNAMEMAPPINGS(5) PK ѳPҞDf f 'win32comext/shell/test/testShellItem.pyUT l_Zx`ux # Test IShellItem and related interfaces from win32com.shell import shell, shellcon, knownfolders import unittest class TestShellItem(unittest.TestCase): def assertShellItemsEqual(self, i1, i2): n1 = i1.GetDisplayName(shellcon.SHGDN_FORPARSING) n2 = i2.GetDisplayName(shellcon.SHGDN_FORPARSING) self.assertEqual(n1, n2) def test_idlist_roundtrip(self): pidl = shell.SHGetSpecialFolderLocation(0, shellcon.CSIDL_DESKTOP) item = shell.SHCreateItemFromIDList(pidl, shell.IID_IShellItem) pidl_back = shell.SHGetIDListFromObject(item) self.assertEqual(pidl, pidl_back) def test_parsing_name(self): sf = shell.SHGetDesktopFolder() flags = shellcon.SHCONTF_FOLDERS | shellcon.SHCONTF_NONFOLDERS children = sf.EnumObjects(0, flags) child_pidl = next(children) name = sf.GetDisplayNameOf(child_pidl, shellcon.SHGDN_FORPARSING) item = shell.SHCreateItemFromParsingName(name, None, shell.IID_IShellItem) # test the name we get from the item is the same as from the folder. self.assertEqual(name, item.GetDisplayName(shellcon.SHGDN_FORPARSING)) def test_parsing_relative(self): desktop_pidl = shell.SHGetSpecialFolderLocation(0, shellcon.CSIDL_DESKTOP) desktop_item = shell.SHCreateItemFromIDList(desktop_pidl, shell.IID_IShellItem) sf = shell.SHGetDesktopFolder() flags = shellcon.SHCONTF_FOLDERS | shellcon.SHCONTF_NONFOLDERS children = sf.EnumObjects(0, flags) child_pidl = next(children) name_flags = shellcon.SHGDN_FORPARSING | shellcon.SHGDN_INFOLDER name = sf.GetDisplayNameOf(child_pidl, name_flags) item = shell.SHCreateItemFromRelativeName(desktop_item, name, None, shell.IID_IShellItem) # test the name we get from the item is the same as from the folder. self.assertEqual(name, item.GetDisplayName(name_flags)) def test_create_in_known_folder(self): item = shell.SHCreateItemInKnownFolder(knownfolders.FOLDERID_Desktop, 0, None, shell.IID_IShellItem) # this will do for now :) def test_create_item_with_parent(self): desktop_pidl = shell.SHGetSpecialFolderLocation(0, shellcon.CSIDL_DESKTOP) desktop_item = shell.SHCreateItemFromIDList(desktop_pidl, shell.IID_IShellItem) sf = shell.SHGetDesktopFolder() flags = shellcon.SHCONTF_FOLDERS | shellcon.SHCONTF_NONFOLDERS children = sf.EnumObjects(0, flags) child_pidl = next(children) item1 = shell.SHCreateItemWithParent(desktop_pidl, None, child_pidl, shell.IID_IShellItem) item2 = shell.SHCreateItemWithParent(None, sf, child_pidl, shell.IID_IShellItem) self.assertShellItemsEqual(item1, item2) if __name__=='__main__': unittest.main() PK ѳPwJII)win32comext/shell/test/testShellFolder.pyUT l_Zx`ux from win32com.shell import shell from win32com.shell.shellcon import * sf = shell.SHGetDesktopFolder() print("Shell Folder is", sf) names = [] for i in sf: # Magically calls EnumObjects name = sf.GetDisplayNameOf(i, SHGDN_NORMAL) names.append(name) # And get the enumerator manually enum = sf.EnumObjects(0, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS | SHCONTF_INCLUDEHIDDEN) num = 0 for i in enum: num += 1 if num != len(names): print("Should have got the same number of names!?") print("Found", len(names), "items on the desktop") for name in names: print(name) PK Y03K7win32comext/shell/__init__.pyUT  YZx`ux # See if we have a special directory for the binaries (for developers) import win32com win32com.__PackageSupportBuildPath__(__path__) PK Y03KIwin32comext/shell/shellcon.pyUT  YZx`ux # Generated by h2py from \mssdk\include\shlobj.h and shellapi.h WM_USER = 1024 DROPEFFECT_NONE = 0 DROPEFFECT_COPY = 1 DROPEFFECT_MOVE = 2 DROPEFFECT_LINK = 4 DROPEFFECT_SCROLL = -2147483648 FO_MOVE = 1 FO_COPY = 2 FO_DELETE = 3 FO_RENAME = 4 ## File operation flags used with shell.SHFileOperation FOF_MULTIDESTFILES = 1 FOF_CONFIRMMOUSE = 2 FOF_SILENT = 4 FOF_RENAMEONCOLLISION = 8 FOF_NOCONFIRMATION = 16 FOF_WANTMAPPINGHANDLE = 32 FOF_ALLOWUNDO = 64 FOF_FILESONLY = 128 FOF_SIMPLEPROGRESS = 256 FOF_NOCONFIRMMKDIR = 512 FOF_NOERRORUI = 1024 FOF_NOCOPYSECURITYATTRIBS = 2048 FOF_NORECURSION = 4096 FOF_NO_CONNECTED_ELEMENTS = 8192 FOF_WANTNUKEWARNING = 16384 FOF_NORECURSEREPARSE = 32768 FOF_NO_UI = FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_NOCONFIRMMKDIR ## Extended file operation flags, used with IFileOperation FOFX_NOSKIPJUNCTIONS =0x00010000 FOFX_PREFERHARDLINK =0x00020000 FOFX_SHOWELEVATIONPROMPT =0x00040000 FOFX_EARLYFAILURE =0x00100000 FOFX_PRESERVEFILEEXTENSIONS =0x00200000 FOFX_KEEPNEWERFILE =0x00400000 FOFX_NOCOPYHOOKS =0x00800000 FOFX_NOMINIMIZEBOX =0x01000000 FOFX_MOVEACLSACROSSVOLUMES =0x02000000 FOFX_DONTDISPLAYSOURCEPATH =0x04000000 FOFX_DONTDISPLAYDESTPATH =0x08000000 FOFX_REQUIREELEVATION =0x10000000 FOFX_COPYASDOWNLOAD =0x40000000 FOFX_DONTDISPLAYLOCATIONS =0x80000000 PO_DELETE = 19 PO_RENAME = 20 PO_PORTCHANGE = 32 PO_REN_PORT = 52 SE_ERR_FNF = 2 SE_ERR_PNF = 3 SE_ERR_ACCESSDENIED = 5 SE_ERR_OOM = 8 SE_ERR_DLLNOTFOUND = 32 SE_ERR_SHARE = 26 SE_ERR_ASSOCINCOMPLETE = 27 SE_ERR_DDETIMEOUT = 28 SE_ERR_DDEFAIL = 29 SE_ERR_DDEBUSY = 30 SE_ERR_NOASSOC = 31 SEE_MASK_CLASSNAME = 1 SEE_MASK_CLASSKEY = 3 SEE_MASK_IDLIST = 4 SEE_MASK_INVOKEIDLIST = 12 SEE_MASK_ICON = 16 SEE_MASK_HOTKEY = 32 SEE_MASK_NOCLOSEPROCESS = 64 SEE_MASK_CONNECTNETDRV = 128 SEE_MASK_FLAG_DDEWAIT = 256 SEE_MASK_DOENVSUBST = 512 SEE_MASK_FLAG_NO_UI = 1024 SEE_MASK_UNICODE = 16384 SEE_MASK_NO_CONSOLE = 32768 SEE_MASK_ASYNCOK = 1048576 SEE_MASK_HMONITOR = 2097152 SEE_MASK_CLASSNAME = 1 SEE_MASK_CLASSKEY = 3 SEE_MASK_IDLIST = 4 SEE_MASK_INVOKEIDLIST = 12 SEE_MASK_ICON = 16 SEE_MASK_HOTKEY = 32 SEE_MASK_NOCLOSEPROCESS = 64 SEE_MASK_CONNECTNETDRV = 128 SEE_MASK_FLAG_DDEWAIT = 256 SEE_MASK_DOENVSUBST = 512 SEE_MASK_FLAG_NO_UI = 1024 SEE_MASK_UNICODE = 16384 SEE_MASK_NO_CONSOLE = 32768 SEE_MASK_ASYNCOK = 1048576 SEE_MASK_HMONITOR = 2097152 SHERB_NOCONFIRMATION = 1 SHERB_NOPROGRESSUI = 2 SHERB_NOSOUND = 4 NIM_ADD = 0 NIM_MODIFY = 1 NIM_DELETE = 2 NIF_MESSAGE = 1 NIF_ICON = 2 NIF_TIP = 4 SHGFI_ICON = 256 SHGFI_DISPLAYNAME = 512 SHGFI_TYPENAME = 1024 SHGFI_ATTRIBUTES = 2048 SHGFI_ICONLOCATION = 4096 SHGFI_EXETYPE = 8192 SHGFI_SYSICONINDEX = 16384 SHGFI_LINKOVERLAY = 32768 SHGFI_SELECTED = 65536 SHGFI_ATTR_SPECIFIED = 131072 SHGFI_LARGEICON = 0 SHGFI_SMALLICON = 1 SHGFI_OPENICON = 2 SHGFI_SHELLICONSIZE = 4 SHGFI_PIDL = 8 SHGFI_USEFILEATTRIBUTES = 16 SHGNLI_PIDL = 1 SHGNLI_PREFIXNAME = 2 SHGNLI_NOUNIQUE = 4 PRINTACTION_OPEN = 0 PRINTACTION_PROPERTIES = 1 PRINTACTION_NETINSTALL = 2 PRINTACTION_NETINSTALLLINK = 3 PRINTACTION_TESTPAGE = 4 PRINTACTION_OPENNETPRN = 5 PRINTACTION_DOCUMENTDEFAULTS = 6 PRINTACTION_SERVERPROPERTIES = 7 # Flags used with IContextMenu.QueryContextMenu CMF_NORMAL = 0 CMF_DEFAULTONLY = 1 CMF_VERBSONLY = 2 CMF_EXPLORE = 4 CMF_NOVERBS = 8 CMF_CANRENAME = 16 CMF_NODEFAULT = 32 CMF_INCLUDESTATIC = 64 CMF_ITEMMENU = 128 CMF_EXTENDEDVERBS = 256 CMF_DISABLEDVERBS = 512 CMF_ASYNCVERBSTATE = 1024 CMF_OPTIMIZEFORINVOKE = 2048 CMF_SYNCCASCADEMENU = 4096 CMF_DONOTPICKDEFAULT = 8192 CMF_RESERVED = 4294901760 # 0xffff0000 GCS_VERBA = 0 GCS_HELPTEXTA = 1 GCS_VALIDATEA = 2 GCS_VERBW = 4 GCS_HELPTEXTW = 5 GCS_VALIDATEW = 6 GCS_UNICODE = 4 GCS_VERB = GCS_VERBW GCS_HELPTEXT = GCS_HELPTEXTW GCS_VALIDATE = GCS_VALIDATEW GCS_VERB = GCS_VERBA GCS_HELPTEXT = GCS_HELPTEXTA GCS_VALIDATE = GCS_VALIDATEA CMDSTR_NEWFOLDERA = "NewFolder" CMDSTR_VIEWLISTA = "ViewList" CMDSTR_VIEWDETAILSA = "ViewDetails" CMDSTR_NEWFOLDER = CMDSTR_NEWFOLDERA CMDSTR_VIEWLIST = CMDSTR_VIEWLISTA CMDSTR_VIEWDETAILS = CMDSTR_VIEWDETAILSA CMIC_MASK_HOTKEY = SEE_MASK_HOTKEY CMIC_MASK_ICON = SEE_MASK_ICON CMIC_MASK_FLAG_NO_UI = SEE_MASK_FLAG_NO_UI CMIC_MASK_UNICODE = SEE_MASK_UNICODE CMIC_MASK_NO_CONSOLE = SEE_MASK_NO_CONSOLE CMIC_MASK_ASYNCOK = SEE_MASK_ASYNCOK CMIC_MASK_PTINVOKE = 536870912 GIL_OPENICON = 1 GIL_FORSHELL = 2 GIL_ASYNC = 32 GIL_DEFAULTICON = 64 GIL_FORSHORTCUT = 128 GIL_CHECKSHIELD = 512 GIL_SIMULATEDOC = 1 GIL_PERINSTANCE = 2 GIL_PERCLASS = 4 GIL_NOTFILENAME = 8 GIL_DONTCACHE = 16 GIL_SHIELD = 512 GIL_FORCENOSHIELD = 1024 ISIOI_ICONFILE = 1 ISIOI_ICONINDEX = 2 ISIOI_SYSIMAGELISTINDEX = 4 FO_MOVE = 1 FO_COPY = 2 FO_DELETE = 3 FO_RENAME = 4 FOF_MULTIDESTFILES = 1 FOF_CONFIRMMOUSE = 2 FOF_SILENT = 4 FOF_RENAMEONCOLLISION = 8 FOF_NOCONFIRMATION = 16 FOF_WANTMAPPINGHANDLE = 32 FOF_ALLOWUNDO = 64 FOF_FILESONLY = 128 FOF_SIMPLEPROGRESS = 256 FOF_NOCONFIRMMKDIR = 512 FOF_NOERRORUI = 1024 FOF_NOCOPYSECURITYATTRIBS = 2048 PO_DELETE = 19 PO_RENAME = 20 PO_PORTCHANGE = 32 PO_REN_PORT = 52 FVSIF_RECT = 1 FVSIF_PINNED = 2 FVSIF_NEWFAILED = 134217728 FVSIF_NEWFILE = -2147483648 FVSIF_CANVIEWIT = 1073741824 FCIDM_SHVIEWFIRST = 0 FCIDM_SHVIEWLAST = 32767 FCIDM_BROWSERFIRST = 40960 FCIDM_BROWSERLAST = 48896 FCIDM_GLOBALFIRST = 32768 FCIDM_GLOBALLAST = 40959 FCIDM_MENU_FILE = (FCIDM_GLOBALFIRST+0) FCIDM_MENU_EDIT = (FCIDM_GLOBALFIRST+64) FCIDM_MENU_VIEW = (FCIDM_GLOBALFIRST+128) FCIDM_MENU_VIEW_SEP_OPTIONS = (FCIDM_GLOBALFIRST+129) FCIDM_MENU_TOOLS = (FCIDM_GLOBALFIRST+192) FCIDM_MENU_TOOLS_SEP_GOTO = (FCIDM_GLOBALFIRST+193) FCIDM_MENU_HELP = (FCIDM_GLOBALFIRST+256) FCIDM_MENU_FIND = (FCIDM_GLOBALFIRST+320) FCIDM_MENU_EXPLORE = (FCIDM_GLOBALFIRST+336) FCIDM_MENU_FAVORITES = (FCIDM_GLOBALFIRST+368) FCIDM_TOOLBAR = (FCIDM_BROWSERFIRST + 0) FCIDM_STATUS = (FCIDM_BROWSERFIRST + 1) IDC_OFFLINE_HAND = 103 SBSP_DEFBROWSER = 0 SBSP_SAMEBROWSER = 1 SBSP_NEWBROWSER = 2 SBSP_DEFMODE = 0 SBSP_OPENMODE = 16 SBSP_EXPLOREMODE = 32 SBSP_ABSOLUTE = 0 SBSP_RELATIVE = 4096 SBSP_PARENT = 8192 SBSP_NAVIGATEBACK = 16384 SBSP_NAVIGATEFORWARD = 32768 SBSP_ALLOW_AUTONAVIGATE = 65536 SBSP_INITIATEDBYHLINKFRAME = -2147483648 SBSP_REDIRECT = 1073741824 SBSP_WRITENOHISTORY = 134217728 SBSP_NOAUTOSELECT = 67108864 FCW_STATUS = 1 FCW_TOOLBAR = 2 FCW_TREE = 3 FCW_INTERNETBAR = 6 FCW_PROGRESS = 8 FCT_MERGE = 1 FCT_CONFIGABLE = 2 FCT_ADDTOEND = 4 CDBOSC_SETFOCUS = 0 CDBOSC_KILLFOCUS = 1 CDBOSC_SELCHANGE = 2 CDBOSC_RENAME = 3 SVSI_DESELECT = 0 SVSI_SELECT = 1 SVSI_EDIT = 3 SVSI_DESELECTOTHERS = 4 SVSI_ENSUREVISIBLE = 8 SVSI_FOCUSED = 16 SVSI_TRANSLATEPT = 32 SVGIO_BACKGROUND = 0 SVGIO_SELECTION = 1 SVGIO_ALLVIEW = 2 SVGIO_CHECKED = 0x3, SVGIO_TYPE_MASK = 0xf, SVGIO_FLAG_VIEWORDER = -2147483648 # 0x80000000 STRRET_WSTR = 0 STRRET_OFFSET = 1 STRRET_CSTR = 2 CSIDL_DESKTOP = 0 CSIDL_INTERNET = 1 CSIDL_PROGRAMS = 2 CSIDL_CONTROLS = 3 CSIDL_PRINTERS = 4 CSIDL_PERSONAL = 5 CSIDL_FAVORITES = 6 CSIDL_STARTUP = 7 CSIDL_RECENT = 8 CSIDL_SENDTO = 9 CSIDL_BITBUCKET = 10 CSIDL_STARTMENU = 11 CSIDL_MYDOCUMENTS = 12 CSIDL_MYMUSIC = 13 CSIDL_MYVIDEO = 14 CSIDL_DESKTOPDIRECTORY = 16 CSIDL_DRIVES = 17 CSIDL_NETWORK = 18 CSIDL_NETHOOD = 19 CSIDL_FONTS = 20 CSIDL_TEMPLATES = 21 CSIDL_COMMON_STARTMENU = 22 CSIDL_COMMON_PROGRAMS = 23 CSIDL_COMMON_STARTUP = 24 CSIDL_COMMON_DESKTOPDIRECTORY = 25 CSIDL_APPDATA = 26 CSIDL_PRINTHOOD = 27 CSIDL_LOCAL_APPDATA = 28 CSIDL_ALTSTARTUP = 29 CSIDL_COMMON_ALTSTARTUP = 30 CSIDL_COMMON_FAVORITES = 31 CSIDL_INTERNET_CACHE = 32 CSIDL_COOKIES = 33 CSIDL_HISTORY = 34 CSIDL_COMMON_APPDATA = 35 CSIDL_WINDOWS = 36 CSIDL_SYSTEM = 37 CSIDL_PROGRAM_FILES = 38 CSIDL_MYPICTURES = 39 CSIDL_PROFILE = 40 CSIDL_SYSTEMX86 = 41 CSIDL_PROGRAM_FILESX86 = 42 CSIDL_PROGRAM_FILES_COMMON = 43 CSIDL_PROGRAM_FILES_COMMONX86 = 44 CSIDL_COMMON_TEMPLATES = 45 CSIDL_COMMON_DOCUMENTS = 46 CSIDL_COMMON_ADMINTOOLS = 47 CSIDL_ADMINTOOLS = 48 CSIDL_CONNECTIONS = 49 CSIDL_COMMON_MUSIC = 53 CSIDL_COMMON_PICTURES = 54 CSIDL_COMMON_VIDEO = 55 CSIDL_RESOURCES = 56 CSIDL_RESOURCES_LOCALIZED = 57 CSIDL_COMMON_OEM_LINKS = 58 CSIDL_CDBURN_AREA = 59 # 60 unused CSIDL_COMPUTERSNEARME = 61 BIF_RETURNONLYFSDIRS = 1 BIF_DONTGOBELOWDOMAIN = 2 BIF_STATUSTEXT = 4 BIF_RETURNFSANCESTORS = 8 BIF_EDITBOX = 16 BIF_VALIDATE = 32 BIF_BROWSEFORCOMPUTER = 4096 BIF_BROWSEFORPRINTER = 8192 BIF_BROWSEINCLUDEFILES = 16384 BFFM_INITIALIZED = 1 BFFM_SELCHANGED = 2 BFFM_VALIDATEFAILEDA = 3 BFFM_VALIDATEFAILEDW = 4 BFFM_SETSTATUSTEXTA = (WM_USER + 100) BFFM_ENABLEOK = (WM_USER + 101) BFFM_SETSELECTIONA = (WM_USER + 102) BFFM_SETSELECTIONW = (WM_USER + 103) BFFM_SETSTATUSTEXTW = (WM_USER + 104) BFFM_SETSTATUSTEXT = BFFM_SETSTATUSTEXTW BFFM_SETSELECTION = BFFM_SETSELECTIONW BFFM_VALIDATEFAILED = BFFM_VALIDATEFAILEDW BFFM_SETSTATUSTEXT = BFFM_SETSTATUSTEXTA BFFM_SETSELECTION = BFFM_SETSELECTIONA BFFM_VALIDATEFAILED = BFFM_VALIDATEFAILEDA SFGAO_CANCOPY = DROPEFFECT_COPY SFGAO_CANMOVE = DROPEFFECT_MOVE SFGAO_CANLINK = DROPEFFECT_LINK SFGAO_CANRENAME = 16 SFGAO_CANDELETE = 32 SFGAO_HASPROPSHEET = 64 SFGAO_DROPTARGET = 256 SFGAO_CAPABILITYMASK = 375 SFGAO_LINK = 65536 SFGAO_SHARE = 131072 SFGAO_READONLY = 262144 SFGAO_GHOSTED = 524288 SFGAO_HIDDEN = 524288 SFGAO_DISPLAYATTRMASK = 983040 SFGAO_FILESYSANCESTOR = 268435456 SFGAO_FOLDER = 536870912 SFGAO_FILESYSTEM = 1073741824 SFGAO_HASSUBFOLDER = (-2147483648) SFGAO_CONTENTSMASK = (-2147483648) SFGAO_VALIDATE = 16777216 SFGAO_REMOVABLE = 33554432 SFGAO_COMPRESSED = 67108864 SFGAO_BROWSABLE = 134217728 SFGAO_NONENUMERATED = 1048576 SFGAO_NEWCONTENT = 2097152 SFGAO_STORAGE = 8 DWFRF_NORMAL = 0 DWFRF_DELETECONFIGDATA = 1 DWFAF_HIDDEN = 1 DBIM_MINSIZE = 1 DBIM_MAXSIZE = 2 DBIM_INTEGRAL = 4 DBIM_ACTUAL = 8 DBIM_TITLE = 16 DBIM_MODEFLAGS = 32 DBIM_BKCOLOR = 64 DBIMF_NORMAL = 0 DBIMF_VARIABLEHEIGHT = 8 DBIMF_DEBOSSED = 32 DBIMF_BKCOLOR = 64 DBIF_VIEWMODE_NORMAL = 0 DBIF_VIEWMODE_VERTICAL = 1 DBIF_VIEWMODE_FLOATING = 2 DBIF_VIEWMODE_TRANSPARENT = 4 COMPONENT_TOP = (2147483647) COMP_TYPE_HTMLDOC = 0 COMP_TYPE_PICTURE = 1 COMP_TYPE_WEBSITE = 2 COMP_TYPE_CONTROL = 3 COMP_TYPE_CFHTML = 4 COMP_TYPE_MAX = 4 AD_APPLY_SAVE = 1 AD_APPLY_HTMLGEN = 2 AD_APPLY_REFRESH = 4 AD_APPLY_ALL = (AD_APPLY_SAVE | AD_APPLY_HTMLGEN | AD_APPLY_REFRESH) AD_APPLY_FORCE = 8 AD_APPLY_BUFFERED_REFRESH = 16 WPSTYLE_CENTER = 0 WPSTYLE_TILE = 1 WPSTYLE_STRETCH = 2 WPSTYLE_MAX = 3 COMP_ELEM_TYPE = 1 COMP_ELEM_CHECKED = 2 COMP_ELEM_DIRTY = 4 COMP_ELEM_NOSCROLL = 8 COMP_ELEM_POS_LEFT = 16 COMP_ELEM_POS_TOP = 32 COMP_ELEM_SIZE_WIDTH = 64 COMP_ELEM_SIZE_HEIGHT = 128 COMP_ELEM_POS_ZINDEX = 256 COMP_ELEM_SOURCE = 512 COMP_ELEM_FRIENDLYNAME = 1024 COMP_ELEM_SUBSCRIBEDURL = 2048 ADDURL_SILENT = 0X0001 CFSTR_SHELLIDLIST = "Shell IDList Array" CFSTR_SHELLIDLISTOFFSET = "Shell Object Offsets" CFSTR_NETRESOURCES = "Net Resource" CFSTR_FILEDESCRIPTORA = "FileGroupDescriptor" CFSTR_FILEDESCRIPTORW = "FileGroupDescriptorW" CFSTR_FILECONTENTS = "FileContents" CFSTR_FILENAMEA = "FileName" CFSTR_FILENAMEW = "FileNameW" CFSTR_PRINTERGROUP = "PrinterFriendlyName" CFSTR_FILENAMEMAPA = "FileNameMap" CFSTR_FILENAMEMAPW = "FileNameMapW" CFSTR_SHELLURL = "UniformResourceLocator" CFSTR_INETURLA = CFSTR_SHELLURL CFSTR_INETURLW = "UniformResourceLocatorW" CFSTR_PREFERREDDROPEFFECT = "Preferred DropEffect" CFSTR_PERFORMEDDROPEFFECT = "Performed DropEffect" CFSTR_PASTESUCCEEDED = "Paste Succeeded" CFSTR_INDRAGLOOP = "InShellDragLoop" CFSTR_DRAGCONTEXT = "DragContext" CFSTR_MOUNTEDVOLUME = "MountedVolume" CFSTR_PERSISTEDDATAOBJECT = "PersistedDataObject" CFSTR_TARGETCLSID = "TargetCLSID" CFSTR_LOGICALPERFORMEDDROPEFFECT = "Logical Performed DropEffect" CFSTR_AUTOPLAY_SHELLIDLISTS = "Autoplay Enumerated IDList Array" CFSTR_FILEDESCRIPTOR = CFSTR_FILEDESCRIPTORW CFSTR_FILENAME = CFSTR_FILENAMEW CFSTR_FILENAMEMAP = CFSTR_FILENAMEMAPW CFSTR_FILEDESCRIPTOR = CFSTR_FILEDESCRIPTORA CFSTR_FILENAME = CFSTR_FILENAMEA CFSTR_FILENAMEMAP = CFSTR_FILENAMEMAPA DVASPECT_SHORTNAME = 2 SHCNE_RENAMEITEM = 1 SHCNE_CREATE = 2 SHCNE_DELETE = 4 SHCNE_MKDIR = 8 SHCNE_RMDIR = 16 SHCNE_MEDIAINSERTED = 32 SHCNE_MEDIAREMOVED = 64 SHCNE_DRIVEREMOVED = 128 SHCNE_DRIVEADD = 256 SHCNE_NETSHARE = 512 SHCNE_NETUNSHARE = 1024 SHCNE_ATTRIBUTES = 2048 SHCNE_UPDATEDIR = 4096 SHCNE_UPDATEITEM = 8192 SHCNE_SERVERDISCONNECT = 16384 SHCNE_UPDATEIMAGE = 32768 SHCNE_DRIVEADDGUI = 65536 SHCNE_RENAMEFOLDER = 131072 SHCNE_FREESPACE = 262144 SHCNE_EXTENDED_EVENT = 67108864 SHCNE_ASSOCCHANGED = 134217728 SHCNE_DISKEVENTS = 145439 SHCNE_GLOBALEVENTS = 201687520 SHCNE_ALLEVENTS = 2147483647 SHCNE_INTERRUPT = -2147483648 SHCNEE_ORDERCHANGED = 2 SHCNF_IDLIST = 0 SHCNF_PATHA = 1 SHCNF_PRINTERA = 2 SHCNF_DWORD = 3 SHCNF_PATHW = 5 SHCNF_PRINTERW = 6 SHCNF_TYPE = 255 SHCNF_FLUSH = 4096 SHCNF_FLUSHNOWAIT = 8192 SHCNF_PATH = SHCNF_PATHW SHCNF_PRINTER = SHCNF_PRINTERW SHCNF_PATH = SHCNF_PATHA SHCNF_PRINTER = SHCNF_PRINTERA QIF_CACHED = 1 QIF_DONTEXPANDFOLDER = 2 # SHARD enum for SHAddToRecentDocs SHARD_PIDL = 1 SHARD_PATHA = 2 SHARD_PATHW = 3 SHARD_APPIDINFO = 4 SHARD_APPIDINFOIDLIST = 5 SHARD_LINK = 6 SHARD_APPIDINFOLINK = 7 SHARD_SHELLITEM = 8 ## SHARD_PATH = SHARD_PATHW SHARD_PATH = SHARD_PATHA SHGDFIL_FINDDATA = 1 SHGDFIL_NETRESOURCE = 2 SHGDFIL_DESCRIPTIONID = 3 SHDID_ROOT_REGITEM = 1 SHDID_FS_FILE = 2 SHDID_FS_DIRECTORY = 3 SHDID_FS_OTHER = 4 SHDID_COMPUTER_DRIVE35 = 5 SHDID_COMPUTER_DRIVE525 = 6 SHDID_COMPUTER_REMOVABLE = 7 SHDID_COMPUTER_FIXED = 8 SHDID_COMPUTER_NETDRIVE = 9 SHDID_COMPUTER_CDROM = 10 SHDID_COMPUTER_RAMDISK = 11 SHDID_COMPUTER_OTHER = 12 SHDID_NET_DOMAIN = 13 SHDID_NET_SERVER = 14 SHDID_NET_SHARE = 15 SHDID_NET_RESTOFNET = 16 SHDID_NET_OTHER = 17 PID_IS_URL = 2 PID_IS_NAME = 4 PID_IS_WORKINGDIR = 5 PID_IS_HOTKEY = 6 PID_IS_SHOWCMD = 7 PID_IS_ICONINDEX = 8 PID_IS_ICONFILE = 9 PID_IS_WHATSNEW = 10 PID_IS_AUTHOR = 11 PID_IS_DESCRIPTION = 12 PID_IS_COMMENT = 13 PID_INTSITE_WHATSNEW = 2 PID_INTSITE_AUTHOR = 3 PID_INTSITE_LASTVISIT = 4 PID_INTSITE_LASTMOD = 5 PID_INTSITE_VISITCOUNT = 6 PID_INTSITE_DESCRIPTION = 7 PID_INTSITE_COMMENT = 8 PID_INTSITE_FLAGS = 9 PID_INTSITE_CONTENTLEN = 10 PID_INTSITE_CONTENTCODE = 11 PID_INTSITE_RECURSE = 12 PID_INTSITE_WATCH = 13 PID_INTSITE_SUBSCRIPTION = 14 PID_INTSITE_URL = 15 PID_INTSITE_TITLE = 16 PID_INTSITE_CODEPAGE = 18 PID_INTSITE_TRACKING = 19 PIDISF_RECENTLYCHANGED = 1 PIDISF_CACHEDSTICKY = 2 PIDISF_CACHEIMAGES = 16 PIDISF_FOLLOWALLLINKS = 32 PIDISM_GLOBAL = 0 PIDISM_WATCH = 1 PIDISM_DONTWATCH = 2 SSF_SHOWALLOBJECTS = 1 SSF_SHOWEXTENSIONS = 2 SSF_SHOWCOMPCOLOR = 8 SSF_SHOWSYSFILES = 32 SSF_DOUBLECLICKINWEBVIEW = 128 SSF_SHOWATTRIBCOL = 256 SSF_DESKTOPHTML = 512 SSF_WIN95CLASSIC = 1024 SSF_DONTPRETTYPATH = 2048 SSF_SHOWINFOTIP = 8192 SSF_MAPNETDRVBUTTON = 4096 SSF_NOCONFIRMRECYCLE = 32768 SSF_HIDEICONS = 16384 ABM_NEW = 0 ABM_REMOVE = 1 ABM_QUERYPOS = 2 ABM_SETPOS = 3 ABM_GETSTATE = 4 ABM_GETTASKBARPOS = 5 ABM_ACTIVATE = 6 ABM_GETAUTOHIDEBAR = 7 ABM_SETAUTOHIDEBAR = 8 ABM_WINDOWPOSCHANGED = 9 ABN_STATECHANGE = 0 ABN_POSCHANGED = 1 ABN_FULLSCREENAPP = 2 ABN_WINDOWARRANGE = 3 ABS_AUTOHIDE = 1 ABS_ALWAYSONTOP = 2 ABE_LEFT = 0 ABE_TOP = 1 ABE_RIGHT = 2 ABE_BOTTOM = 3 def EIRESID(x): return (-1 * (int)(x)) # Some manually added ones CSIDL_COMMON_APPDATA = 35 CSIDL_LOCAL_APPDATA = 28 SHCONTF_FOLDERS = 32 # for shell browser SHCONTF_NONFOLDERS = 64 # for default view SHCONTF_INCLUDEHIDDEN = 128 # for hidden/system objects SHCONTF_INIT_ON_FIRST_NEXT = 256 SHCONTF_NETPRINTERSRCH = 512 SHCONTF_SHAREABLE = 1024 SHCONTF_STORAGE = 2048 SHGDN_NORMAL = 0 # default (display purpose) SHGDN_INFOLDER = 1 # displayed under a folder (relative) SHGDN_FOREDITING = 4096 # for in-place editing SHGDN_INCLUDE_NONFILESYS = 8192 # if not set, display names for shell name space items that are not in the file system will fail. SHGDN_FORADDRESSBAR = 16384 # for displaying in the address (drives dropdown) bar SHGDN_FORPARSING = 32768 # for ParseDisplayName or path SHCONTF_FOLDERS = 32 # for shell browser SHCONTF_NONFOLDERS = 64 # for default view SHCONTF_INCLUDEHIDDEN = 128 # for hidden/system objects BFO_NONE = 0 BFO_BROWSER_PERSIST_SETTINGS = 1 BFO_RENAME_FOLDER_OPTIONS_TOINTERNET = 2 BFO_BOTH_OPTIONS = 4 BIF_PREFER_INTERNET_SHORTCUT = 8 BFO_BROWSE_NO_IN_NEW_PROCESS = 16 BFO_ENABLE_HYPERLINK_TRACKING = 32 BFO_USE_IE_OFFLINE_SUPPORT = 64 BFO_SUBSTITUE_INTERNET_START_PAGE = 128 BFO_USE_IE_LOGOBANDING = 256 BFO_ADD_IE_TOCAPTIONBAR = 512 BFO_USE_DIALUP_REF = 1024 BFO_USE_IE_TOOLBAR = 2048 BFO_NO_PARENT_FOLDER_SUPPORT = 4096 BFO_NO_REOPEN_NEXT_RESTART = 8192 BFO_GO_HOME_PAGE = 16384 BFO_PREFER_IEPROCESS = 32768 BFO_SHOW_NAVIGATION_CANCELLED = 65536 BFO_QUERY_ALL = -1 # From ShlGuid.h PID_FINDDATA = 0 PID_NETRESOURCE = 1 PID_DESCRIPTIONID = 2 PID_WHICHFOLDER = 3 PID_NETWORKLOCATION = 4 PID_COMPUTERNAME = 5 PID_DISPLACED_FROM = 2 PID_DISPLACED_DATE = 3 PID_SYNC_COPY_IN = 2 PID_MISC_STATUS = 2 PID_MISC_ACCESSCOUNT = 3 PID_MISC_OWNER = 4 PID_HTMLINFOTIPFILE = 5 PID_MISC_PICS = 6 PID_DISPLAY_PROPERTIES = 0 PID_INTROTEXT = 1 PIDSI_ARTIST = 2 PIDSI_SONGTITLE = 3 PIDSI_ALBUM = 4 PIDSI_YEAR = 5 PIDSI_COMMENT = 6 PIDSI_TRACK = 7 PIDSI_GENRE = 11 PIDSI_LYRICS = 12 PIDDRSI_PROTECTED = 2 PIDDRSI_DESCRIPTION = 3 PIDDRSI_PLAYCOUNT = 4 PIDDRSI_PLAYSTARTS = 5 PIDDRSI_PLAYEXPIRES = 6 PIDVSI_STREAM_NAME = 2 PIDVSI_FRAME_WIDTH = 3 PIDVSI_FRAME_HEIGHT = 4 PIDVSI_TIMELENGTH = 7 PIDVSI_FRAME_COUNT = 5 PIDVSI_FRAME_RATE = 6 PIDVSI_DATA_RATE = 8 PIDVSI_SAMPLE_SIZE = 9 PIDVSI_COMPRESSION = 10 PIDVSI_STREAM_NUMBER = 11 PIDASI_FORMAT = 2 PIDASI_TIMELENGTH = 3 PIDASI_AVG_DATA_RATE = 4 PIDASI_SAMPLE_RATE = 5 PIDASI_SAMPLE_SIZE = 6 PIDASI_CHANNEL_COUNT = 7 PIDASI_STREAM_NUMBER = 8 PIDASI_STREAM_NAME = 9 PIDASI_COMPRESSION = 10 PID_CONTROLPANEL_CATEGORY = 2 PID_VOLUME_FREE = 2 PID_VOLUME_CAPACITY = 3 PID_VOLUME_FILESYSTEM = 4 PID_SHARE_CSC_STATUS = 2 PID_LINK_TARGET = 2 PID_QUERY_RANK = 2 # From PropIdl.h PROPSETFLAG_DEFAULT = ( 0 ) PROPSETFLAG_NONSIMPLE = ( 1 ) PROPSETFLAG_ANSI = ( 2 ) PROPSETFLAG_UNBUFFERED = ( 4 ) PROPSETFLAG_CASE_SENSITIVE = ( 8 ) PROPSET_BEHAVIOR_CASE_SENSITIVE = ( 1 ) PID_DICTIONARY = ( 0 ) PID_CODEPAGE = ( 1 ) PID_FIRST_USABLE = ( 2 ) PID_FIRST_NAME_DEFAULT = ( 4095 ) PID_LOCALE = ( (-2147483648) ) PID_MODIFY_TIME = ( (-2147483647) ) PID_SECURITY = ( (-2147483646) ) PID_BEHAVIOR = ( (-2147483645) ) PID_ILLEGAL = ( (-1) ) PID_MIN_READONLY = ( (-2147483648) ) PID_MAX_READONLY = ( (-1073741825) ) PIDDI_THUMBNAIL = 2 PIDSI_TITLE = 2 PIDSI_SUBJECT = 3 PIDSI_AUTHOR = 4 PIDSI_KEYWORDS = 5 PIDSI_COMMENTS = 6 PIDSI_TEMPLATE = 7 PIDSI_LASTAUTHOR = 8 PIDSI_REVNUMBER = 9 PIDSI_EDITTIME = 10 PIDSI_LASTPRINTED = 11 PIDSI_CREATE_DTM = 12 PIDSI_LASTSAVE_DTM = 13 PIDSI_PAGECOUNT = 14 PIDSI_WORDCOUNT = 15 PIDSI_CHARCOUNT = 16 PIDSI_THUMBNAIL = 17 PIDSI_APPNAME = 18 PIDSI_DOC_SECURITY = 19 PIDDSI_CATEGORY = 2 PIDDSI_PRESFORMAT = 3 PIDDSI_BYTECOUNT = 4 PIDDSI_LINECOUNT = 5 PIDDSI_PARCOUNT = 6 PIDDSI_SLIDECOUNT = 7 PIDDSI_NOTECOUNT = 8 PIDDSI_HIDDENCOUNT = 9 PIDDSI_MMCLIPCOUNT = 10 PIDDSI_SCALE = 11 PIDDSI_HEADINGPAIR = 12 PIDDSI_DOCPARTS = 13 PIDDSI_MANAGER = 14 PIDDSI_COMPANY = 15 PIDDSI_LINKSDIRTY = 16 PIDMSI_EDITOR = 2 PIDMSI_SUPPLIER = 3 PIDMSI_SOURCE = 4 PIDMSI_SEQUENCE_NO = 5 PIDMSI_PROJECT = 6 PIDMSI_STATUS = 7 PIDMSI_OWNER = 8 PIDMSI_RATING = 9 PIDMSI_PRODUCTION = 10 PIDMSI_COPYRIGHT = 11 PRSPEC_INVALID = ( (-1) ) PRSPEC_LPWSTR = ( 0 ) PRSPEC_PROPID = ( 1 ) # From ShObjIdl.h SHCIDS_ALLFIELDS = (-2147483648) SHCIDS_CANONICALONLY = 268435456 SHCIDS_BITMASK = (-65536) SHCIDS_COLUMNMASK = 65535 SFGAO_CANMONIKER = 4194304 SFGAO_HASSTORAGE = 4194304 SFGAO_STREAM = 4194304 SFGAO_STORAGEANCESTOR = 8388608 SFGAO_STORAGECAPMASK = 1891958792 MAXPROPPAGES = 100 PSP_DEFAULT = 0 PSP_DLGINDIRECT = 1 PSP_USEHICON = 2 PSP_USEICONID = 4 PSP_USETITLE = 8 PSP_RTLREADING = 16 PSP_HASHELP = 32 PSP_USEREFPARENT = 64 PSP_USECALLBACK = 128 PSP_PREMATURE = 1024 PSP_HIDEHEADER = 2048 PSP_USEHEADERTITLE = 4096 PSP_USEHEADERSUBTITLE = 8192 PSP_USEFUSIONCONTEXT = 16384 PSPCB_ADDREF = 0 PSPCB_RELEASE = 1 PSPCB_CREATE = 2 PSH_DEFAULT = 0 PSH_PROPTITLE = 1 PSH_USEHICON = 2 PSH_USEICONID = 4 PSH_PROPSHEETPAGE = 8 PSH_WIZARDHASFINISH = 16 PSH_WIZARD = 32 PSH_USEPSTARTPAGE = 64 PSH_NOAPPLYNOW = 128 PSH_USECALLBACK = 256 PSH_HASHELP = 512 PSH_MODELESS = 1024 PSH_RTLREADING = 2048 PSH_WIZARDCONTEXTHELP = 4096 PSH_WIZARD97 = 8192 PSH_WIZARD97 = 16777216 PSH_WATERMARK = 32768 PSH_USEHBMWATERMARK = 65536 PSH_USEHPLWATERMARK = 131072 PSH_STRETCHWATERMARK = 262144 PSH_HEADER = 524288 PSH_USEHBMHEADER = 1048576 PSH_USEPAGELANG = 2097152 PSH_WIZARD_LITE = 4194304 PSH_NOCONTEXTHELP = 33554432 PSCB_INITIALIZED = 1 PSCB_PRECREATE = 2 PSCB_BUTTONPRESSED = 3 PSNRET_NOERROR = 0 PSNRET_INVALID = 1 PSNRET_INVALID_NOCHANGEPAGE = 2 PSNRET_MESSAGEHANDLED = 3 PSWIZB_BACK = 1 PSWIZB_NEXT = 2 PSWIZB_FINISH = 4 PSWIZB_DISABLEDFINISH = 8 PSBTN_BACK = 0 PSBTN_NEXT = 1 PSBTN_FINISH = 2 PSBTN_OK = 3 PSBTN_APPLYNOW = 4 PSBTN_CANCEL = 5 PSBTN_HELP = 6 PSBTN_MAX = 6 ID_PSRESTARTWINDOWS = 2 ID_PSREBOOTSYSTEM = (ID_PSRESTARTWINDOWS | 1) WIZ_CXDLG = 276 WIZ_CYDLG = 140 WIZ_CXBMP = 80 WIZ_BODYX = 92 WIZ_BODYCX = 184 PROP_SM_CXDLG = 212 PROP_SM_CYDLG = 188 PROP_MED_CXDLG = 227 PROP_MED_CYDLG = 215 PROP_LG_CXDLG = 252 PROP_LG_CYDLG = 218 ISOLATION_AWARE_USE_STATIC_LIBRARY = 0 ISOLATION_AWARE_BUILD_STATIC_LIBRARY = 0 SHCOLSTATE_TYPE_STR = 1 SHCOLSTATE_TYPE_INT = 2 SHCOLSTATE_TYPE_DATE = 3 SHCOLSTATE_TYPEMASK = 15 SHCOLSTATE_ONBYDEFAULT = 16 SHCOLSTATE_SLOW = 32 SHCOLSTATE_EXTENDED = 64 SHCOLSTATE_SECONDARYUI = 128 SHCOLSTATE_HIDDEN = 256 SHCOLSTATE_PREFER_VARCMP = 512 FWF_AUTOARRANGE = 1 FWF_ABBREVIATEDNAMES = 2 FWF_SNAPTOGRID = 4 FWF_OWNERDATA = 8 FWF_BESTFITWINDOW = 16 FWF_DESKTOP = 32 FWF_SINGLESEL = 64 FWF_NOSUBFOLDERS = 128 FWF_TRANSPARENT = 256 FWF_NOCLIENTEDGE = 512 FWF_NOSCROLL = 1024 FWF_ALIGNLEFT = 2048 FWF_NOICONS = 4096 FWF_SHOWSELALWAYS = 8192 FWF_NOVISIBLE = 16384 FWF_SINGLECLICKACTIVATE = 32768 FWF_NOWEBVIEW = 65536 FWF_HIDEFILENAMES = 131072 FWF_CHECKSELECT = 262144 FVM_FIRST = 1 FVM_ICON = 1 FVM_SMALLICON = 2 FVM_LIST = 3 FVM_DETAILS = 4 FVM_THUMBNAIL = 5 FVM_TILE = 6 FVM_THUMBSTRIP = 7 SVUIA_DEACTIVATE = 0 SVUIA_ACTIVATE_NOFOCUS = 1 SVUIA_ACTIVATE_FOCUS = 2 SVUIA_INPLACEACTIVATE = 3 # SHChangeNotifyRegister flags SHCNRF_InterruptLevel = 1 SHCNRF_ShellLevel = 2 SHCNRF_RecursiveInterrupt = 4096 SHCNRF_NewDelivery = 32768 FD_CLSID = 0x0001 FD_SIZEPOINT = 0x0002 FD_ATTRIBUTES = 0x0004 FD_CREATETIME = 0x0008 FD_ACCESSTIME = 0x0010 FD_WRITESTIME = 0x0020 FD_FILESIZE = 0x0040 FD_PROGRESSUI = 0x4000 FD_LINKUI = 0x8000 # shlwapi stuff ASSOCF_INIT_NOREMAPCLSID = 0x00000001 # do not remap clsids to progids ASSOCF_INIT_BYEXENAME = 0x00000002 # executable is being passed in ASSOCF_OPEN_BYEXENAME = 0x00000002 # executable is being passed in ASSOCF_INIT_DEFAULTTOSTAR = 0x00000004 # treat "*" as the BaseClass ASSOCF_INIT_DEFAULTTOFOLDER = 0x00000008 # treat "Folder" as the BaseClass ASSOCF_NOUSERSETTINGS = 0x00000010 # dont use HKCU ASSOCF_NOTRUNCATE = 0x00000020 # dont truncate the return string ASSOCF_VERIFY = 0x00000040 # verify data is accurate (DISK HITS) ASSOCF_REMAPRUNDLL = 0x00000080 # actually gets info about rundlls target if applicable ASSOCF_NOFIXUPS = 0x00000100 # attempt to fix errors if found ASSOCF_IGNOREBASECLASS = 0x00000200 # dont recurse into the baseclass ASSOCSTR_COMMAND = 1 # shell\verb\command string ASSOCSTR_EXECUTABLE = 2 # the executable part of command string ASSOCSTR_FRIENDLYDOCNAME = 3 # friendly name of the document type ASSOCSTR_FRIENDLYAPPNAME = 4 # friendly name of executable ASSOCSTR_NOOPEN = 5 # noopen value ASSOCSTR_SHELLNEWVALUE = 6 # query values under the shellnew key ASSOCSTR_DDECOMMAND = 7 # template for DDE commands ASSOCSTR_DDEIFEXEC = 8 # DDECOMMAND to use if just create a process ASSOCSTR_DDEAPPLICATION = 9 # Application name in DDE broadcast ASSOCSTR_DDETOPIC = 10 # Topic Name in DDE broadcast ASSOCSTR_INFOTIP = 11 # info tip for an item, or list of properties to create info tip from ASSOCSTR_QUICKTIP = 12 # same as ASSOCSTR_INFOTIP, except, this list contains only quickly retrievable properties ASSOCSTR_TILEINFO = 13 # similar to ASSOCSTR_INFOTIP - lists important properties for tileview ASSOCSTR_CONTENTTYPE = 14 # MIME Content type ASSOCSTR_DEFAULTICON = 15 # Default icon source ASSOCSTR_SHELLEXTENSION = 16 # Guid string pointing to the Shellex\Shellextensionhandler value. ASSOCKEY_SHELLEXECCLASS = 1 # the key that should be passed to ShellExec(hkeyClass) ASSOCKEY_APP = 2 # the "Application" key for the association ASSOCKEY_CLASS = 3 # the progid or class key ASSOCKEY_BASECLASS = 4 # the BaseClass key ASSOCDATA_MSIDESCRIPTOR = 1 # Component Descriptor to pass to MSI APIs ASSOCDATA_NOACTIVATEHANDLER = 2 # restrict attempts to activate window ASSOCDATA_QUERYCLASSSTORE = 3 # should check with the NT Class Store ASSOCDATA_HASPERUSERASSOC = 4 # defaults to user specified association ASSOCDATA_EDITFLAGS = 5 # Edit flags. ASSOCDATA_VALUE = 6 # use pszExtra as the Value name # flags used with SHGetViewStatePropertyBag SHGVSPB_PERUSER = 1 SHGVSPB_ALLUSERS = 2 SHGVSPB_PERFOLDER = 4 SHGVSPB_ALLFOLDERS = 8 SHGVSPB_INHERIT = 16 SHGVSPB_ROAM = 32 SHGVSPB_NOAUTODEFAULTS = 2147483648 # 0x80000000 SHGVSPB_FOLDER = SHGVSPB_PERUSER | SHGVSPB_PERFOLDER SHGVSPB_FOLDERNODEFAULTS = SHGVSPB_PERUSER | SHGVSPB_PERFOLDER | SHGVSPB_NOAUTODEFAULTS SHGVSPB_USERDEFAULTS = SHGVSPB_PERUSER | SHGVSPB_ALLFOLDERS SHGVSPB_GLOBALDEAFAULTS = SHGVSPB_ALLUSERS | SHGVSPB_ALLFOLDERS # IDeskband and related DBIM_MINSIZE = 0x0001 DBIM_MAXSIZE = 0x0002 DBIM_INTEGRAL = 0x0004 DBIM_ACTUAL = 0x0008 DBIM_TITLE = 0x0010 DBIM_MODEFLAGS = 0x0020 DBIM_BKCOLOR = 0x0040 DBIMF_NORMAL = 0x0000 DBIMF_VARIABLEHEIGHT = 0x0008 DBIMF_DEBOSSED = 0x0020 DBIMF_BKCOLOR = 0x0040 DBIF_VIEWMODE_NORMAL = 0x0000 DBIF_VIEWMODE_VERTICAL = 0x0001 DBIF_VIEWMODE_FLOATING = 0x0002 DBIF_VIEWMODE_TRANSPARENT = 0x0004 # Message types used with SHShellFolderView_Message SFVM_REARRANGE = 1 SFVM_ADDOBJECT = 3 SFVM_REMOVEOBJECT = 6 SFVM_UPDATEOBJECT = 7 SFVM_GETSELECTEDOBJECTS = 9 SFVM_SETITEMPOS = 14 SFVM_SETCLIPBOARD = 16 SFVM_SETPOINTS = 23 # SHELL_LINK_DATA_FLAGS enum, used with IShellLinkDatalist SLDF_HAS_ID_LIST = 1 SLDF_HAS_LINK_INFO = 2 SLDF_HAS_NAME = 4 SLDF_HAS_RELPATH = 8 SLDF_HAS_WORKINGDIR = 16 SLDF_HAS_ARGS = 32 SLDF_HAS_ICONLOCATION = 64 SLDF_UNICODE = 128 SLDF_FORCE_NO_LINKINFO = 256 SLDF_HAS_EXP_SZ = 512 SLDF_RUN_IN_SEPARATE = 1024 SLDF_HAS_LOGO3ID = 2048 SLDF_HAS_DARWINID = 4096 SLDF_RUNAS_USER = 8192 SLDF_NO_PIDL_ALIAS = 32768 SLDF_FORCE_UNCNAME = 65536 SLDF_HAS_EXP_ICON_SZ = 16384 SLDF_RUN_WITH_SHIMLAYER = 131072 SLDF_RESERVED = 2147483648 # IShellLinkDataList data block signatures EXP_SPECIAL_FOLDER_SIG = 2684354565 NT_CONSOLE_PROPS_SIG = 2684354562 NT_FE_CONSOLE_PROPS_SIG = 2684354564 EXP_DARWIN_ID_SIG = 2684354566 EXP_LOGO3_ID_SIG = 2684354567 EXP_SZ_ICON_SIG = 2684354567 EXP_SZ_LINK_SIG = 2684354561 # IURL_SETURL_FLAGS enum, used with PyIUniformResourceLocator.SetURL IURL_SETURL_FL_GUESS_PROTOCOL = 1 IURL_SETURL_FL_USE_DEFAULT_PROTOCOL = 2 # IURL_INVOKECOMMAND_FLAGS enum, used with PyIUniformResourceLocator.InvokeCommand IURL_INVOKECOMMAND_FL_ALLOW_UI = 1 IURL_INVOKECOMMAND_FL_USE_DEFAULT_VERB = 2 IURL_INVOKECOMMAND_FL_DDEWAIT = 4 ## constants used with IActiveDesktop # COMPONENT.ComponentType COMP_TYPE_HTMLDOC = 0 COMP_TYPE_PICTURE = 1 COMP_TYPE_WEBSITE = 2 COMP_TYPE_CONTROL = 3 COMP_TYPE_CFHTML = 4 COMP_TYPE_MAX = 4 # COMPONENT.CurItemState IS_NORMAL = 1 IS_FULLSCREEN = 2 IS_SPLIT = 4 IS_VALIDSIZESTATEBITS = IS_NORMAL|IS_SPLIT|IS_FULLSCREEN IS_VALIDSTATEBITS = IS_NORMAL|IS_SPLIT|IS_FULLSCREEN|2147483648|1073741824 ## 0x80000000|0x40000000 # IActiveDesktop.ApplyChanges Flags AD_APPLY_SAVE = 1 AD_APPLY_HTMLGEN = 2 AD_APPLY_REFRESH = 4 AD_APPLY_ALL = AD_APPLY_SAVE|AD_APPLY_HTMLGEN|AD_APPLY_REFRESH AD_APPLY_FORCE = 8 AD_APPLY_BUFFERED_REFRESH = 16 AD_APPLY_DYNAMICREFRESH = 32 # Wallpaper styles used with GetWallpaper and SetWallpaper WPSTYLE_CENTER = 0 WPSTYLE_TILE = 1 WPSTYLE_STRETCH = 2 WPSTYLE_MAX = 3 # ModifyDesktopItem flags COMP_ELEM_TYPE = 1 ## 0x00000001 COMP_ELEM_CHECKED = 2 ## 0x00000002 COMP_ELEM_DIRTY = 4 ## 0x00000004 COMP_ELEM_NOSCROLL = 8 ## 0x00000008 COMP_ELEM_POS_LEFT = 16 ## 0x00000010 COMP_ELEM_POS_TOP = 32 ## 0x00000020 COMP_ELEM_SIZE_WIDTH = 64 ## 0x00000040 COMP_ELEM_SIZE_HEIGHT = 128 ## 0x00000080 COMP_ELEM_POS_ZINDEX = 256 ## 0x00000100 COMP_ELEM_SOURCE = 512 ## 0x00000200 COMP_ELEM_FRIENDLYNAME = 1024 ## 0x00000400 COMP_ELEM_SUBSCRIBEDURL = 2048 ## 0x00000800 COMP_ELEM_ORIGINAL_CSI = 4096 ## 0x00001000 COMP_ELEM_RESTORED_CSI = 8192 ## 0x00002000 COMP_ELEM_CURITEMSTATE = 16384 ## 0x00004000 COMP_ELEM_ALL = COMP_ELEM_TYPE|COMP_ELEM_CHECKED|COMP_ELEM_DIRTY|COMP_ELEM_NOSCROLL|COMP_ELEM_POS_LEFT \ |COMP_ELEM_SIZE_WIDTH|COMP_ELEM_SIZE_HEIGHT|COMP_ELEM_POS_ZINDEX|COMP_ELEM_SOURCE \ |COMP_ELEM_FRIENDLYNAME|COMP_ELEM_POS_TOP|COMP_ELEM_SUBSCRIBEDURL|COMP_ELEM_ORIGINAL_CSI \ |COMP_ELEM_RESTORED_CSI|COMP_ELEM_CURITEMSTATE DTI_ADDUI_DEFAULT = 0 DTI_ADDUI_DISPSUBWIZARD = 1 DTI_ADDUI_POSITIONITEM = 2 ADDURL_SILENT = 1 COMPONENT_TOP = 1073741823 ## 0x3fffffff COMPONENT_DEFAULT_LEFT = 65535 ## 0xFFFF COMPONENT_DEFAULT_TOP = 65535 ## 0xFFFF SSM_CLEAR = 0 SSM_SET = 1 SSM_REFRESH = 2 SSM_UPDATE = 4 SCHEME_DISPLAY = 1 ##0x0001 SCHEME_EDIT = 2 ##0x0002 SCHEME_LOCAL = 4 ##0x0004 SCHEME_GLOBAL = 8 ##0x0008 SCHEME_REFRESH = 16 ##0x0010 SCHEME_UPDATE = 32 ##0x0020 SCHEME_DONOTUSE = 64 ##0x0040 SCHEME_CREATE = 128 ##0x0080 GADOF_DIRTY = 1 # From EmptyVC.h EVCF_HASSETTINGS = 0x0001 EVCF_ENABLEBYDEFAULT = 0x0002 EVCF_REMOVEFROMLIST = 0x0004 EVCF_ENABLEBYDEFAULT_AUTO = 0x0008 EVCF_DONTSHOWIFZERO = 0x0010 EVCF_SETTINGSMODE = 0x0020 EVCF_OUTOFDISKSPACE = 0x0040 EVCCBF_LASTNOTIFICATION = 0x0001 # ShObjIdl.h IExplorer* related EBO_NONE = 0 EBO_NAVIGATEONCE = 0x1 EBO_SHOWFRAMES = 0x2 EBO_ALWAYSNAVIGATE = 0x4 EBO_NOTRAVELLOG = 0x8 EBO_NOWRAPPERWINDOW = 0x10 EBF_NONE = 0 EBF_SELECTFROMDATAOBJECT = 0x100 EBF_NODROPTARGET = 0x200 ECS_ENABLED = 0 ECS_DISABLED = 0x1 ECS_HIDDEN = 0x2 ECS_CHECKBOX = 0x4 ECS_CHECKED = 0x8 ECF_HASSUBCOMMANDS = 0x1 ECF_HASSPLITBUTTON = 0x2 ECF_HIDELABEL = 0x4 ECF_ISSEPARATOR = 0x8 ECF_HASLUASHIELD = 0x10 SIATTRIBFLAGS_AND = 0x1 SIATTRIBFLAGS_OR = 0x2 SIATTRIBFLAGS_APPCOMPAT = 0x3 SIATTRIBFLAGS_MASK = 0x3 SIGDN_NORMALDISPLAY = 0 SIGDN_PARENTRELATIVEPARSING = -2147385343 ## 0x80018001 SIGDN_DESKTOPABSOLUTEPARSING = -2147319808 ## 0x80028000 SIGDN_PARENTRELATIVEEDITING = -2147282943 ## 0x80031001 SIGDN_DESKTOPABSOLUTEEDITING = -2147172352 ## 0x8004c000 SIGDN_FILESYSPATH = -2147123200 ## 0x80058000 SIGDN_URL = -2147057664 ## 0x80068000 SIGDN_PARENTRELATIVEFORADDRESSBAR = -2146975743 ## 0x8007c001, SIGDN_PARENTRELATIVE = -2146959359 ## 0x80080001 SICHINT_DISPLAY = 0, SICHINT_ALLFIELDS = -2147483648 ## 0x80000000 SICHINT_CANONICAL = 0x10000000 ASSOCCLASS_SHELL_KEY = 0 ASSOCCLASS_PROGID_KEY = 1 # hkeyClass ASSOCCLASS_PROGID_STR = 2 # pszClass (HKCR\pszClass) ASSOCCLASS_CLSID_KEY = 3 # hkeyClass ASSOCCLASS_CLSID_STR = 4 # pszClass (HKCR\CLSID\pszClass) ASSOCCLASS_APP_KEY = 5 # hkeyClass ASSOCCLASS_APP_STR = 6 # pszClass (HKCR\Applications\PathFindFileName(pszClass)) ASSOCCLASS_SYSTEM_STR = 7 # pszClass ASSOCCLASS_FOLDER = 8 # none ASSOCCLASS_STAR = 9 # none NSTCS_HASEXPANDOS = 0x1 NSTCS_HASLINES = 0x2 NSTCS_SINGLECLICKEXPAND = 0x4 NSTCS_FULLROWSELECT = 0x8 NSTCS_SPRINGEXPAND = 0x10 NSTCS_HORIZONTALSCROLL = 0x20 NSTCS_ROOTHASEXPANDO = 0x40 NSTCS_SHOWSELECTIONALWAYS = 0x80 NSTCS_NOINFOTIP = 0x200 NSTCS_EVENHEIGHT = 0x400 NSTCS_NOREPLACEOPEN = 0x800 NSTCS_DISABLEDRAGDROP = 0x1000 NSTCS_NOORDERSTREAM = 0x2000 NSTCS_RICHTOOLTIP = 0x4000 NSTCS_BORDER = 0x8000 NSTCS_NOEDITLABELS = 0x10000 NSTCS_TABSTOP = 0x20000 NSTCS_FAVORITESMODE = 0x80000 NSTCS_AUTOHSCROLL = 0x100000 NSTCS_FADEINOUTEXPANDOS = 0x200000 NSTCS_EMPTYTEXT = 0x400000 NSTCS_CHECKBOXES = 0x800000 NSTCS_PARTIALCHECKBOXES = 0x1000000 NSTCS_EXCLUSIONCHECKBOXES = 0x2000000 NSTCS_DIMMEDCHECKBOXES = 0x4000000 NSTCS_NOINDENTCHECKS = 0x8000000 NSTCS_ALLOWJUNCTIONS = 0x10000000 NSTCS_SHOWTABSBUTTON = 0x20000000 NSTCS_SHOWDELETEBUTTON = 0x40000000 NSTCS_SHOWREFRESHBUTTON = -2147483648 # 0x80000000 NSTCRS_VISIBLE = 0 NSTCRS_HIDDEN = 0x1 NSTCRS_EXPANDED = 0x2 NSTCIS_NONE = 0 NSTCIS_SELECTED = 0x1 NSTCIS_EXPANDED = 0x2 NSTCIS_BOLD = 0x4 NSTCIS_DISABLED = 0x8 NSTCGNI_NEXT = 0 NSTCGNI_NEXTVISIBLE = 0x1 NSTCGNI_PREV = 0x2 NSTCGNI_PREVVISIBLE = 0x3 NSTCGNI_PARENT = 0x4 NSTCGNI_CHILD = 0x5 NSTCGNI_FIRSTVISIBLE = 0x6 NSTCGNI_LASTVISIBLE = 0x7 CLSID_ExplorerBrowser = "{71f96385-ddd6-48d3-a0c1-ae06e8b055fb}" # Names of the methods of many shell interfaces; used by implementation of # the interfaces. IBrowserFrame_Methods = ["GetFrameOptions"] ICategorizer_Methods = ["GetDescription", "GetCategory", "GetCategoryInfo", "CompareCategory"] ICategoryProvider_Methods = ["CanCategorizeOnSCID", "GetDefaultCategory", "GetCategoryForSCID", "EnumCategories", "GetCategoryName", "CreateCategory"] IContextMenu_Methods = ["QueryContextMenu", "InvokeCommand", "GetCommandString"] IExplorerCommand_Methods = ["GetTitle", "GetIcon", "GetToolTip", "GetCanonicalName", "GetState", "Invoke", "GetFlags", "EnumSubCommands"] IExplorerCommandProvider_Methods = ["GetCommand", "GetCommands"] IOleWindow_Methods = ["GetWindow", "ContextSensitiveHelp"] # XXX - this should be somewhere in win32com IPersist_Methods = ["GetClassID"] IPersistFolder_Methods = IPersist_Methods + ["Initialize"] IPersistFolder2_Methods = IPersistFolder_Methods + ["GetCurFolder"] IShellExtInit_Methods = ["Initialize"] IShellView_Methods = IOleWindow_Methods + \ ["TranslateAccelerator", "EnableModeless", "UIActivate", "Refresh", "CreateViewWindow", "DestroyViewWindow", "GetCurrentInfo", "AddPropertySheetPages", "SaveViewState", "SelectItem", "GetItemObject"] IShellFolder_Methods = ["ParseDisplayName", "EnumObjects", "BindToObject", "BindToStorage", "CompareIDs", "CreateViewObject", "GetAttributesOf", "GetUIObjectOf", "GetDisplayNameOf", "SetNameOf"] IShellFolder2_Methods = IShellFolder_Methods + \ ["GetDefaultSearchGUID", "EnumSearches", "GetDefaultColumn", "GetDefaultColumnState", "GetDetailsEx", "GetDetailsOf", "MapColumnToSCID"] ## enum GETPROPERTYSTOREFLAGS, used with IShellItem2 methods GPS_DEFAULT = 0 GPS_HANDLERPROPERTIESONLY = 0x1 GPS_READWRITE = 0x2 GPS_TEMPORARY = 0x4 GPS_FASTPROPERTIESONLY = 0x8 GPS_OPENSLOWITEM = 0x10 GPS_DELAYCREATION = 0x20 GPS_BESTEFFORT = 0x40 GPS_MASK_VALID = 0x7f ## Bind context parameter names, used with IBindCtx::RegisterObjectParam STR_AVOID_DRIVE_RESTRICTION_POLICY = "Avoid Drive Restriction Policy" STR_BIND_DELEGATE_CREATE_OBJECT = "Delegate Object Creation" STR_BIND_FOLDERS_READ_ONLY = "Folders As Read Only" STR_BIND_FOLDER_ENUM_MODE = "Folder Enum Mode" STR_BIND_FORCE_FOLDER_SHORTCUT_RESOLVE = "Force Folder Shortcut Resolve" STR_DONT_PARSE_RELATIVE = "Don't Parse Relative" STR_DONT_RESOLVE_LINK = "Don't Resolve Link" ## STR_ENUM_ITEMS_FLAGS STR_FILE_SYS_BIND_DATA = "File System Bind Data" STR_GET_ASYNC_HANDLER = "GetAsyncHandler" STR_GPS_BESTEFFORT = "GPS_BESTEFFORT" STR_GPS_DELAYCREATION = "GPS_DELAYCREATION" STR_GPS_FASTPROPERTIESONLY = "GPS_FASTPROPERTIESONLY" STR_GPS_HANDLERPROPERTIESONLY = "GPS_HANDLERPROPERTIESONLY" STR_GPS_NO_OPLOCK = "GPS_NO_OPLOCK" STR_GPS_OPENSLOWITEM = "GPS_OPENSLOWITEM" STR_IFILTER_FORCE_TEXT_FILTER_FALLBACK = "Always bind persistent handlers" STR_IFILTER_LOAD_DEFINED_FILTER = "Only bind registered persistent handlers" STR_INTERNAL_NAVIGATE = "Internal Navigation" STR_INTERNETFOLDER_PARSE_ONLY_URLMON_BINDABLE = "Validate URL" STR_ITEM_CACHE_CONTEXT = "ItemCacheContext" STR_NO_VALIDATE_FILENAME_CHARS = "NoValidateFilenameChars" STR_PARSE_ALLOW_INTERNET_SHELL_FOLDERS = "Allow binding to Internet shell folder handlers and negate STR_PARSE_PREFER_WEB_BROWSING" STR_PARSE_AND_CREATE_ITEM = "ParseAndCreateItem" STR_PARSE_DONT_REQUIRE_VALIDATED_URLS = "Do not require validated URLs" STR_PARSE_EXPLICIT_ASSOCIATION_SUCCESSFUL = "ExplicitAssociationSuccessful" STR_PARSE_PARTIAL_IDLIST = "ParseOriginalItem" STR_PARSE_PREFER_FOLDER_BROWSING = "Parse Prefer Folder Browsing" STR_PARSE_PREFER_WEB_BROWSING = "Do not bind to Internet shell folder handlers" STR_PARSE_PROPERTYSTORE = "DelegateNamedProperties" STR_PARSE_SHELL_PROTOCOL_TO_FILE_OBJECTS = "Parse Shell Protocol To File Objects" STR_PARSE_SHOW_NET_DIAGNOSTICS_UI = "Show network diagnostics UI" STR_PARSE_SKIP_NET_CACHE = "Skip Net Resource Cache" STR_PARSE_TRANSLATE_ALIASES = "Parse Translate Aliases" STR_PARSE_WITH_EXPLICIT_ASSOCAPP = "ExplicitAssociationApp" STR_PARSE_WITH_EXPLICIT_PROGID = "ExplicitProgid" STR_PARSE_WITH_PROPERTIES = "ParseWithProperties" ## STR_PROPERTYBAG_PARAM STR_SKIP_BINDING_CLSID = "Skip Binding CLSID" STR_TRACK_CLSID = "Track the CLSID" ## KF_REDIRECTION_CAPABILITIES enum KF_REDIRECTION_CAPABILITIES_ALLOW_ALL = 0x000000FF KF_REDIRECTION_CAPABILITIES_REDIRECTABLE = 0x00000001 KF_REDIRECTION_CAPABILITIES_DENY_ALL = 0x000FFF00 KF_REDIRECTION_CAPABILITIES_DENY_POLICY_REDIRECTED = 0x00000100 KF_REDIRECTION_CAPABILITIES_DENY_POLICY = 0x00000200 KF_REDIRECTION_CAPABILITIES_DENY_PERMISSIONS = 0x00000400 ## KF_REDIRECT_FLAGS enum KF_REDIRECT_USER_EXCLUSIVE = 0x00000001 KF_REDIRECT_COPY_SOURCE_DACL = 0x00000002 KF_REDIRECT_OWNER_USER = 0x00000004 KF_REDIRECT_SET_OWNER_EXPLICIT = 0x00000008 KF_REDIRECT_CHECK_ONLY = 0x00000010 KF_REDIRECT_WITH_UI = 0x00000020 KF_REDIRECT_UNPIN = 0x00000040 KF_REDIRECT_PIN = 0x00000080 KF_REDIRECT_COPY_CONTENTS = 0x00000200 KF_REDIRECT_DEL_SOURCE_CONTENTS = 0x00000400 KF_REDIRECT_EXCLUDE_ALL_KNOWN_SUBFOLDERS = 0x00000800 ## KF_CATEGORY enum KF_CATEGORY_VIRTUAL = 0x00000001 KF_CATEGORY_FIXED = 0x00000002 KF_CATEGORY_COMMON = 0x00000003 KF_CATEGORY_PERUSER = 0x00000004 ## FFFP_MODE enum FFFP_EXACTMATCH = 0 FFFP_NEARESTPARENTMATCH = 1 KF_FLAG_CREATE = 0x00008000 KF_FLAG_DONT_VERIFY = 0x00004000 KF_FLAG_DONT_UNEXPAND = 0x00002000 KF_FLAG_NO_ALIAS = 0x00001000 KF_FLAG_INIT = 0x00000800 KF_FLAG_DEFAULT_PATH = 0x00000400 KF_FLAG_NOT_PARENT_RELATIVE = 0x00000200 KF_FLAG_SIMPLE_IDLIST = 0x00000100 ## APPDOCLISTTYPE, used with IApplicationDocumentLists.GetList ADLT_RECENT = 0 ADLT_FREQUENT = 1 ## KNOWNDESTCATEGORY used with ICustomDestinationList.AppendKnownCategory KDC_FREQUENT = 1 KDC_RECENT = 2 ## LIBRARYFOLDERFILTER used with IShellLibrary.GetFolders LFF_FORCEFILESYSTEM = 1 LFF_STORAGEITEMS = 2 LFF_ALLITEMS = 3 ## DEFAULTSAVEFOLDERTYPE used with IShellLibrary.Get/SetDefaultSaveFolder DSFT_DETECT = 1 DSFT_PRIVATE = 2 DSFT_PUBLIC = 3 ## LIBRARYOPTIONFLAGS used with IShellLibrary.Get/SetOptions LOF_DEFAULT = 0 LOF_PINNEDTONAVPANE = 1 LOF_MASK_ALL = 1 ## LIBRARYSAVEFLAGS Used with PyIShellLibrary.Save LSF_FAILIFTHERE = 0 LSF_OVERRIDEEXISTING = 1 LSF_MAKEUNIQUENAME = 2 ## TRANSFER_SOURCE_FLAGS, used with IFileOperationProgressSink TSF_NORMAL = 0 TSF_FAIL_EXIST = 0 TSF_RENAME_EXIST = 0x1 TSF_OVERWRITE_EXIST = 0x2 TSF_ALLOW_DECRYPTION = 0x4 TSF_NO_SECURITY = 0x8 TSF_COPY_CREATION_TIME = 0x10 TSF_COPY_WRITE_TIME = 0x20 TSF_USE_FULL_ACCESS = 0x40 TSF_DELETE_RECYCLE_IF_POSSIBLE = 0x80 TSF_COPY_HARD_LINK = 0x100 TSF_COPY_LOCALIZED_NAME = 0x200 TSF_MOVE_AS_COPY_DELETE = 0x400 TSF_SUSPEND_SHELLEVENTS = 0x800 ## TRANSFER_ADVISE_STATE, used with ITransferAdviseSink TS_NONE = 0 TS_PERFORMING = 1 TS_PREPARING = 2 TS_INDETERMINATE = 4 ## Success HRESULTs returned by ITransfer* interface operations COPYENGINE_S_YES = 0x00270001 COPYENGINE_S_NOT_HANDLED = 0x00270003 COPYENGINE_S_USER_RETRY = 0x00270004 COPYENGINE_S_USER_IGNORED = 0x00270005 COPYENGINE_S_MERGE = 0x00270006 COPYENGINE_S_DONT_PROCESS_CHILDREN = 0x00270008 COPYENGINE_S_ALREADY_DONE = 0x0027000A COPYENGINE_S_PENDING = 0x0027000B COPYENGINE_S_KEEP_BOTH = 0x0027000C COPYENGINE_S_CLOSE_PROGRAM = 0x0027000D COPYENGINE_S_COLLISIONRESOLVED = 0x0027000E ## Error HRESULTS COPYENGINE_E_USER_CANCELLED = 0x80270000 COPYENGINE_E_CANCELLED = 0x80270001 COPYENGINE_E_REQUIRES_ELEVATION = 0x80270002 COPYENGINE_E_SAME_FILE = 0x80270003 COPYENGINE_E_DIFF_DIR = 0x80270004 COPYENGINE_E_MANY_SRC_1_DEST = 0x80270005 COPYENGINE_E_DEST_SUBTREE = 0x80270009 COPYENGINE_E_DEST_SAME_TREE = 0x8027000A COPYENGINE_E_FLD_IS_FILE_DEST = 0x8027000B COPYENGINE_E_FILE_IS_FLD_DEST = 0x8027000C COPYENGINE_E_FILE_TOO_LARGE = 0x8027000D COPYENGINE_E_REMOVABLE_FULL = 0x8027000E COPYENGINE_E_DEST_IS_RO_CD = 0x8027000F COPYENGINE_E_DEST_IS_RW_CD = 0x80270010 COPYENGINE_E_DEST_IS_R_CD = 0x80270011 COPYENGINE_E_DEST_IS_RO_DVD = 0x80270012 COPYENGINE_E_DEST_IS_RW_DVD = 0x80270013 COPYENGINE_E_DEST_IS_R_DVD = 0x80270014 COPYENGINE_E_SRC_IS_RO_CD = 0x80270015 COPYENGINE_E_SRC_IS_RW_CD = 0x80270016 COPYENGINE_E_SRC_IS_R_CD = 0x80270017 COPYENGINE_E_SRC_IS_RO_DVD = 0x80270018 COPYENGINE_E_SRC_IS_RW_DVD = 0x80270019 COPYENGINE_E_SRC_IS_R_DVD = 0x8027001A COPYENGINE_E_INVALID_FILES_SRC = 0x8027001B COPYENGINE_E_INVALID_FILES_DEST = 0x8027001C COPYENGINE_E_PATH_TOO_DEEP_SRC = 0x8027001D COPYENGINE_E_PATH_TOO_DEEP_DEST = 0x8027001E COPYENGINE_E_ROOT_DIR_SRC = 0x8027001F COPYENGINE_E_ROOT_DIR_DEST = 0x80270020 COPYENGINE_E_ACCESS_DENIED_SRC = 0x80270021 COPYENGINE_E_ACCESS_DENIED_DEST = 0x80270022 COPYENGINE_E_PATH_NOT_FOUND_SRC = 0x80270023 COPYENGINE_E_PATH_NOT_FOUND_DEST = 0x80270024 COPYENGINE_E_NET_DISCONNECT_SRC = 0x80270025 COPYENGINE_E_NET_DISCONNECT_DEST = 0x80270026 COPYENGINE_E_SHARING_VIOLATION_SRC = 0x80270027 COPYENGINE_E_SHARING_VIOLATION_DEST = 0x80270028 COPYENGINE_E_ALREADY_EXISTS_NORMAL = 0x80270029 COPYENGINE_E_ALREADY_EXISTS_READONLY = 0x8027002A COPYENGINE_E_ALREADY_EXISTS_SYSTEM = 0x8027002B COPYENGINE_E_ALREADY_EXISTS_FOLDER = 0x8027002C COPYENGINE_E_STREAM_LOSS = 0x8027002D COPYENGINE_E_EA_LOSS = 0x8027002E COPYENGINE_E_PROPERTY_LOSS = 0x8027002F COPYENGINE_E_PROPERTIES_LOSS = 0x80270030 COPYENGINE_E_ENCRYPTION_LOSS = 0x80270031 COPYENGINE_E_DISK_FULL = 0x80270032 COPYENGINE_E_DISK_FULL_CLEAN = 0x80270033 COPYENGINE_E_EA_NOT_SUPPORTED = 0x80270034 COPYENGINE_E_CANT_REACH_SOURCE = 0x80270035 COPYENGINE_E_RECYCLE_UNKNOWN_ERROR = 0x80270035 COPYENGINE_E_RECYCLE_FORCE_NUKE = 0x80270036 COPYENGINE_E_RECYCLE_SIZE_TOO_BIG = 0x80270037 COPYENGINE_E_RECYCLE_PATH_TOO_LONG = 0x80270038 COPYENGINE_E_RECYCLE_BIN_NOT_FOUND = 0x8027003A COPYENGINE_E_NEWFILE_NAME_TOO_LONG = 0x8027003B COPYENGINE_E_NEWFOLDER_NAME_TOO_LONG = 0x8027003C COPYENGINE_E_DIR_NOT_EMPTY = 0x8027003D COPYENGINE_E_FAT_MAX_IN_ROOT = 0x8027003E COPYENGINE_E_ACCESSDENIED_READONLY = 0x8027003F COPYENGINE_E_REDIRECTED_TO_WEBPAGE = 0x80270040 COPYENGINE_E_SERVER_BAD_FILE_TYPE = 0x80270041 PK {Rwin32comext/shell/demos/UT Zx`Zx`ux PK ѳPO -win32comext/shell/demos/IShellLinkDataList.pyUT l_Zx`ux from win32com.shell import shell, shellcon import pythoncom, win32api, os, sys temp_dir=win32api.GetTempPath() linkname=win32api.GetTempFileName(temp_dir,'cmd')[0] os.remove(linkname) linkname+='.lnk' print('Link name:',linkname) ish=pythoncom.CoCreateInstance(shell.CLSID_ShellLink, None, pythoncom.CLSCTX_INPROC_SERVER, shell.IID_IShellLink) ish.SetPath(os.environ['cOMSPEC']) ish.SetWorkingDirectory(os.path.split(sys.executable)[0]) ish.SetDescription('shortcut made by python') console_props={ 'Signature':shellcon.NT_CONSOLE_PROPS_SIG, 'InsertMode':True, 'FullScreen':False, ## True looks like "DOS Mode" from win98! 'FontFamily':54, 'CursorSize':75, ## pct of character size 'ScreenBufferSize':(152, 256), 'AutoPosition':False, 'FontSize':(4, 5), 'FaceName':'', 'HistoryBufferSize':32, 'InputBufferSize':0, 'QuickEdit':True, 'Font':0, ## 0 should always be present, use win32console.GetNumberOfConsoleFonts() to find how many available 'FillAttribute':7, 'PopupFillAttribute':245, 'WindowSize':(128, 32), 'WindowOrigin':(0, 0), 'FontWeight':400, 'HistoryNoDup':False, 'NumberOfHistoryBuffers':32, ## ColorTable copied from a 'normal' console shortcut, with some obvious changes ## These do not appear to be documented. From experimentation, [0] is background, [7] is foreground text 'ColorTable':(255, 8388608, 32768, 8421376, 128, 8388736, 32896, 12582912, 8421504, 16711680, 65280, 16776960, 255, 16711935, 65535, 16777215) } ishdl=ish.QueryInterface(shell.IID_IShellLinkDataList) ishdl.AddDataBlock(console_props) ipf=ish.QueryInterface(pythoncom.IID_IPersistFile) ipf.Save(linkname,1) os.startfile(linkname) PK ѳP$5win32comext/shell/demos/IFileOperationProgressSink.pyUT l_Zx`ux # Sample implementation of IFileOperationProgressSink that just prints # some basic info import pythoncom from win32com.shell import shell, shellcon from win32com.server.policy import DesignatedWrapPolicy tsf_flags = list((k,v) for k,v in list(shellcon.__dict__.items()) if k.startswith('TSF_')) def decode_flags(flags): if flags == 0: return 'TSF_NORMAL' flag_txt = '' for k,v in tsf_flags: if flags & v: if flag_txt: flag_txt = flag_txt + '|' + k else: flag_txt = k return flag_txt class FileOperationProgressSink(DesignatedWrapPolicy): _com_interfaces_ = [shell.IID_IFileOperationProgressSink] _public_methods_ = [ "StartOperations", "FinishOperations", "PreRenameItem", "PostRenameItem", "PreMoveItem", "PostMoveItem", "PreCopyItem", "PostCopyItem", "PreDeleteItem", "PostDeleteItem", "PreNewItem", "PostNewItem", "UpdateProgress", "ResetTimer", "PauseTimer", "ResumeTimer" ] def __init__(self): self._wrap_(self) def StartOperations(self): print ('StartOperations') def FinishOperations(self, Result): print('FinishOperations: HRESULT ', Result) def PreRenameItem(self, Flags, Item, NewName): print('PreRenameItem: Renaming ' + Item.GetDisplayName(shellcon.SHGDN_FORPARSING) + \ ' to ' + NewName) def PostRenameItem(self, Flags, Item, NewName, hrRename, NewlyCreated): if NewlyCreated is not None: newfile = NewlyCreated.GetDisplayName(shellcon.SHGDN_FORPARSING) else: newfile = 'not renamed, HRESULT ' + str(hrRename) print('PostRenameItem: renamed ' + \ Item.GetDisplayName(shellcon.SHGDN_FORPARSING) + ' to ' + newfile) def PreMoveItem(self, Flags, Item, DestinationFolder, NewName): print('PreMoveItem: Moving ' + \ Item.GetDisplayName(shellcon.SHGDN_FORPARSING) + ' to ' + \ DestinationFolder.GetDisplayName(shellcon.SHGDN_FORPARSING) + '\\' + str(NewName)) def PostMoveItem(self, Flags, Item, DestinationFolder, NewName, hrMove, NewlyCreated): if NewlyCreated is not None: newfile = NewlyCreated.GetDisplayName(shellcon.SHGDN_FORPARSING) else: newfile = 'not copied, HRESULT ' + str(hrMove) print('PostMoveItem: Moved ' + \ Item.GetDisplayName(shellcon.SHGDN_FORPARSING) + ' to ' + newfile) def PreCopyItem(self, Flags, Item, DestinationFolder, NewName): if not NewName: NewName = '' print('PreCopyItem: Copying ' + \ Item.GetDisplayName(shellcon.SHGDN_FORPARSING) + ' to ' + \ DestinationFolder.GetDisplayName(shellcon.SHGDN_FORPARSING) + '\\' + NewName) print('Flags: ', decode_flags(Flags)) def PostCopyItem(self, Flags, Item, DestinationFolder, NewName, hrCopy, NewlyCreated): if NewlyCreated is not None: newfile = NewlyCreated.GetDisplayName(shellcon.SHGDN_FORPARSING) else: newfile = 'not copied, HRESULT ' + str(hrCopy) print('PostCopyItem: Copied ' + Item.GetDisplayName(shellcon.SHGDN_FORPARSING) + ' to ' + newfile) print('Flags: ', decode_flags(Flags)) def PreDeleteItem(self, Flags, Item): print('PreDeleteItem: Deleting ' + Item.GetDisplayName(shellcon.SHGDN_FORPARSING)) def PostDeleteItem(self, Flags, Item, hrDelete, NewlyCreated): print('PostDeleteItem: Deleted ' + Item.GetDisplayName(shellcon.SHGDN_FORPARSING)) if NewlyCreated: print(' Moved to recycle bin - ' + NewlyCreated.GetDisplayName(shellcon.SHGDN_FORPARSING)) def PreNewItem(self, Flags, DestinationFolder, NewName): print('PreNewItem: Creating ' + DestinationFolder.GetDisplayName(shellcon.SHGDN_FORPARSING) + '\\' + NewName) def PostNewItem(self, Flags, DestinationFolder, NewName, TemplateName, FileAttributes, hrNew, NewItem): print('PostNewItem: Created ' + NewItem.GetDisplayName(shellcon.SHGDN_FORPARSING)) def UpdateProgress(self, WorkTotal, WorkSoFar): print('UpdateProgress: ', WorkSoFar, WorkTotal) def ResetTimer(self): print ('ResetTimer') def PauseTimer(self): print ('PauseTimer') def ResumeTimer(self): print ('ResumeTimer') def CreateSink(): return pythoncom.WrapObject(FileOperationProgressSink(), shell.IID_IFileOperationProgressSink) PK ѳP/CZZ&win32comext/shell/demos/create_link.pyUT l_Zx`ux # link.py # From a demo by Mark Hammond, corrupted by Mike Fletcher # (and re-corrupted by Mark Hammond :-) from win32com.shell import shell import pythoncom, os class PyShortcut: def __init__( self ): self._base = pythoncom.CoCreateInstance( shell.CLSID_ShellLink, None, pythoncom.CLSCTX_INPROC_SERVER, shell.IID_IShellLink ) def load( self, filename ): # Get an IPersist interface # which allows save/restore of object to/from files self._base.QueryInterface( pythoncom.IID_IPersistFile ).Load( filename ) def save( self, filename ): self._base.QueryInterface( pythoncom.IID_IPersistFile ).Save( filename, 0 ) def __getattr__( self, name ): if name != "_base": return getattr( self._base, name ) if __name__=='__main__': import sys if len(sys.argv)<2: print("Usage: %s LinkFile [path [, args[, description[, working_dir]]]]\n\nIf LinkFile does not exist, it will be created using the other args") sys.exit(1) file = sys.argv[1] shortcut = PyShortcut() if os.path.exists( file ): # load and dump info from file... shortcut.load( file ) # now print data... print('Shortcut in file %s to file:\n\t%s\nArguments:\n\t%s\nDescription:\n\t%s\nWorking Directory:\n\t%s\nItemIDs:\n\t'%( file, shortcut.GetPath(shell.SLGP_SHORTPATH)[0], shortcut.GetArguments(), shortcut.GetDescription(), shortcut.GetWorkingDirectory(), #shortcut.GetIDList(), )) else: if len(sys.argv) <3: print("Link file does not exist\nYou must supply the path, args, description and working_dir as args") sys.exit(1) # create the shortcut using rest of args... data = map( None, sys.argv[2:], ("SetPath", "SetArguments", "SetDescription", "SetWorkingDirectory") ) for value, function in data: if value and function: # call function on each non-null value getattr( shortcut, function)( value ) shortcut.save( file ) PK ѳPa2win32comext/shell/demos/IUniformResourceLocator.pyUT l_Zx`ux import pythoncom from win32com.shell import shell, shellcon import win32api, os class InternetShortcut: def __init__( self ): self._base = pythoncom.CoCreateInstance( shell.CLSID_InternetShortcut, None, pythoncom.CLSCTX_INPROC_SERVER, shell.IID_IUniformResourceLocator ) def load( self, filename ): # Get an IPersist interface # which allows save/restore of object to/from files self._base.QueryInterface( pythoncom.IID_IPersistFile ).Load( filename ) def save( self, filename ): self._base.QueryInterface( pythoncom.IID_IPersistFile ).Save( filename, 1 ) def __getattr__( self, name ): if name != "_base": return getattr( self._base, name ) temp_dir=win32api.GetTempPath() linkname=win32api.GetTempFileName(temp_dir, 'ish')[0] print('Link:',linkname) os.remove(linkname) linkname+='.url' ish=InternetShortcut() ish.SetURL('https://github.com/mhammond/pywin32') ish.save(linkname) ## IUniformResourceLocator also give access to IPropertySetStorage pss=ish.QueryInterface(pythoncom.IID_IPropertySetStorage) ps=pss.Open(shell.FMTID_InternetSite) property_ids=[(k,v) for k,v in shellcon.__dict__.items() if k.startswith('PID_INTSITE_')] for pname, pval in property_ids: print(pname, ps.ReadMultiple((pval,))[0]) ps=pss.Open(shell.FMTID_Intshcut) property_ids=[(k,v) for k,v in shellcon.__dict__.items() if k.startswith('PID_IS_')] for pname, pval in property_ids: print(pname, ps.ReadMultiple((pval,))[0]) new_sh=InternetShortcut() new_sh.load(linkname) new_sh.InvokeCommand('Open') PK ѳPS&h-win32comext/shell/demos/walk_shell_folders.pyUT l_Zx`ux # A little sample that walks from the desktop into child # items. from win32com.shell import shell, shellcon def walk(folder, depth=2, indent=""): try: pidls = folder.EnumObjects(0, shellcon.SHCONTF_FOLDERS) except shell.error: # no items return for pidl in pidls: dn = folder.GetDisplayNameOf(pidl, shellcon.SHGDN_NORMAL) print(indent, dn) if depth: try: child = folder.BindToObject(pidl, None, shell.IID_IShellFolder) except shell.error: pass else: walk(child, depth-1, indent+" ") walk(shell.SHGetDesktopFolder()) PK ѳP,Z}dd)win32comext/shell/demos/IActiveDesktop.pyUT l_Zx`ux from win32com.shell import shell, shellcon import pythoncom import time website='https://github.com/mhammond/pywin32/' iad=pythoncom.CoCreateInstance(shell.CLSID_ActiveDesktop, None, pythoncom.CLSCTX_INPROC_SERVER, shell.IID_IActiveDesktop) opts=iad.GetDesktopItemOptions() if not (opts['ActiveDesktop'] and opts['EnableComponents']): print('Warning: Enabling Active Desktop') opts['ActiveDesktop']=True opts['EnableComponents']=True iad.SetDesktopItemOptions(opts) iad.ApplyChanges(0xffff) iad=None ## apparently takes a short while for it to become active time.sleep(2) iad=pythoncom.CoCreateInstance(shell.CLSID_ActiveDesktop, None, pythoncom.CLSCTX_INPROC_SERVER, shell.IID_IActiveDesktop) cnt=iad.GetDesktopItemCount() print('Count:', cnt) for i in range(cnt): print(iad.GetDesktopItem(i)) component={ 'ID': cnt+1, 'ComponentType': shellcon.COMP_TYPE_WEBSITE, 'CurItemState': shellcon.IS_NORMAL, 'SubscribedURL': website, 'Source' : website, 'FriendlyName' : 'Pywin32 on SF', 'Checked' : True, ## this controls whether item is currently displayed 'NoScroll' : False, 'Dirty': False, 'Pos': {'Top':69, 'Left':69, 'Height': 400, 'Width': 400, 'zIndex': 1002, 'CanResize': True, 'CanResizeX': True, 'CanResizeY': True, 'PreferredLeftPercent': 0, 'PreferredTopPercent': 0}, 'Original': {'Top': 33, 'Left': 304, 'Height': 362, 'Width': 372, 'ItemState': shellcon.IS_NORMAL}, 'Restored': {'Top': 33, 'Left': 304, 'Height': 362, 'Width': 372, 'ItemState': shellcon.IS_NORMAL} } try: existing_item=iad.GetDesktopItemBySource(website) except pythoncom.com_error: pass else: iad.RemoveDesktopItem(existing_item) iad.ApplyChanges(0xffff) iad.AddDesktopItem(component) iad.ApplyChanges(0xffff) ## need to check which AD_APPLY constants are actually needed PK ѳPLI I .win32comext/shell/demos/ITransferAdviseSink.pyUT l_Zx`ux # ITransferAdviseSink implementation template import pythoncom from win32com.shell import shell, shellcon from win32com.server.policy import DesignatedWrapPolicy tsf_flags = list((k,v) for k,v in list(shellcon.__dict__.items()) if k.startswith('TSF_')) def decode_flags(flags): if flags == 0: return 'TSF_NORMAL' flag_txt = '' for k,v in tsf_flags: if flags & v: if flag_txt: flag_txt = flag_txt + '|' + k else: flag_txt = k return flag_txt TRANSFER_ADVISE_STATES = {} for k,v in list(shellcon.__dict__.items()): if k.startswith('TS_'): TRANSFER_ADVISE_STATES[v] = k def decode_flags(flags): if flags == 0: return 'TSF_NORMAL' flag_txt = '' for k,v in tsf_flags: if flags & v: if flag_txt: flag_txt = flag_txt + '|' + k else: flag_txt = k return flag_txt class TransferAdviseSink(DesignatedWrapPolicy): _com_interfaces_ = [shell.IID_ITransferAdviseSink] _public_methods_ = [ "UpdateProgress", "UpdateTransferState", "ConfirmOverwrite", "ConfirmEncryptionLoss", "FileFailure", "SubStreamFailure", "PropertyFailure" ] def __init__(self): self._wrap_(self) def UpdateProgress(self, SizeCurrent, SizeTotal, FilesCurrent, FilesTotal, FoldersCurrent, FoldersTotal): print('UpdateProgress - processed so far:') print('\t %s out of %s bytes' %(SizeCurrent, SizeTotal)) print('\t %s out of %s files' %(FilesCurrent, FilesTotal)) print('\t %s out of %s folders' %(FoldersCurrent, FoldersTotal)) def UpdateTransferState(self, State): print('Current state: ', TRANSFER_ADVISE_STATES.get(State, '??? Unknown state %s ???' %State)) def ConfirmOverwrite(self, Source, DestParent , Name): print('ConfirmOverwrite: ', Source.GetDisplayName(shellcon.SHGDN_FORPARSING), DestParent.GetDisplayName(shellcon.SHGDN_FORPARSING), Name) def ConfirmEncryptionLoss(self, Source): print('ConfirmEncryptionLoss:', Source.GetDisplayName(shellcon.SHGDN_FORPARSING)) def FileFailure(self, Item, ItemName , Error): print('FileFailure:', Item.GetDisplayName(shellcon.SHGDN_FORPARSING), ItemName) def SubStreamFailure(self, Item, StreamName , Error): print('SubStreamFailure:\n') def PropertyFailure(self, Item, key , Error): print('PropertyFailure:\n') def CreateSink(): return pythoncom.WrapObject(TransferAdviseSink(), shell.IID_ITransferAdviseSink, shell.IID_ITransferAdviseSink) PK ѳP..+win32comext/shell/demos/explorer_browser.pyUT l_Zx`ux # A sample of using Vista's IExplorerBrowser interfaces... # Currently doesn't quite work: # * CPU sits at 100% while running. import sys import pythoncom from win32com.shell import shell, shellcon import win32gui, win32con, win32api from win32com.server.util import wrap, unwrap # event handler for the browser. IExplorerBrowserEvents_Methods = """OnNavigationComplete OnNavigationFailed OnNavigationPending OnViewCreated""".split() class EventHandler: _com_interfaces_ = [shell.IID_IExplorerBrowserEvents] _public_methods_ = IExplorerBrowserEvents_Methods def OnNavigationComplete(self, pidl): print("OnNavComplete", pidl) def OnNavigationFailed(self, pidl): print("OnNavigationFailed", pidl) def OnNavigationPending(self, pidl): print("OnNavigationPending", pidl) def OnViewCreated(self, view): print("OnViewCreated", view) # And if our demo view has been registered, it may well # be that view! try: pyview = unwrap(view) print("and look - its a Python implemented view!", pyview) except ValueError: pass class MainWindow: def __init__(self): message_map = { win32con.WM_DESTROY: self.OnDestroy, win32con.WM_COMMAND: self.OnCommand, win32con.WM_SIZE: self.OnSize, } # Register the Window class. wc = win32gui.WNDCLASS() hinst = wc.hInstance = win32api.GetModuleHandle(None) wc.lpszClassName = "test_explorer_browser" wc.lpfnWndProc = message_map # could also specify a wndproc. classAtom = win32gui.RegisterClass(wc) # Create the Window. style = win32con.WS_OVERLAPPEDWINDOW | win32con.WS_VISIBLE self.hwnd = win32gui.CreateWindow( classAtom, "Python IExplorerBrowser demo", style, \ 0, 0, win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT, \ 0, 0, hinst, None) eb = pythoncom.CoCreateInstance(shellcon.CLSID_ExplorerBrowser, None, pythoncom.CLSCTX_ALL, shell.IID_IExplorerBrowser) # as per MSDN docs, hook up events early self.event_cookie = eb.Advise(wrap(EventHandler())) eb.SetOptions(shellcon.EBO_SHOWFRAMES) rect = win32gui.GetClientRect(self.hwnd) # Set the flags such that the folders autoarrange and non web view is presented flags = (shellcon.FVM_LIST, shellcon.FWF_AUTOARRANGE | shellcon.FWF_NOWEBVIEW) eb.Initialize(self.hwnd, rect, (0, shellcon.FVM_DETAILS)) if len(sys.argv)==2: # If an arg was specified, ask the desktop parse it. # You can pass anything explorer accepts as its '/e' argument - # eg, "::{guid}\::{guid}" etc. # "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}" is "My Computer" pidl = shell.SHGetDesktopFolder().ParseDisplayName(0, None, sys.argv[1])[1] else: # And start browsing at the root of the namespace. pidl = [] eb.BrowseToIDList(pidl, shellcon.SBSP_ABSOLUTE) # and for some reason the "Folder" view in the navigator pane doesn't # magically synchronize itself - so let's do that ourself. # Get the tree control. sp = eb.QueryInterface(pythoncom.IID_IServiceProvider) try: tree = sp.QueryService(shell.IID_INameSpaceTreeControl, shell.IID_INameSpaceTreeControl) except pythoncom.com_error as exc: # this should really only fail if no "nav" frame exists... print("Strange - failed to get the tree control even though " \ "we asked for a EBO_SHOWFRAMES") print(exc) else: # get the IShellItem for the selection. si = shell.SHCreateItemFromIDList(pidl, shell.IID_IShellItem) # set it to selected. tree.SetItemState(si, shellcon.NSTCIS_SELECTED, shellcon.NSTCIS_SELECTED) #eb.FillFromObject(None, shellcon.EBF_NODROPTARGET); #eb.SetEmptyText("No known folders yet..."); self.eb = eb def OnCommand(self, hwnd, msg, wparam, lparam): pass def OnDestroy(self, hwnd, msg, wparam, lparam): print("tearing down ExplorerBrowser...") self.eb.Unadvise(self.event_cookie) self.eb.Destroy() self.eb = None print("shutting down app...") win32gui.PostQuitMessage(0) def OnSize(self, hwnd, msg, wparam, lparam): x = win32api.LOWORD(lparam) y = win32api.HIWORD(lparam) self.eb.SetRect(None, (0, 0, x, y)) def main(): w=MainWindow() win32gui.PumpMessages() if __name__=='__main__': main() PK ѳPQ$win32comext/shell/demos/dump_link.pyUT l_Zx`ux # dump_link.py - dumps information about shell shortcuts # import sys, os from win32com.shell import shell, shellcon import pythoncom import glob from win32com.storagecon import * def DumpLink(fname): shellLink = pythoncom.CoCreateInstance(shell.CLSID_ShellLink, None, pythoncom.CLSCTX_INPROC_SERVER, shell.IID_IShellLink) persistFile = shellLink.QueryInterface(pythoncom.IID_IPersistFile) persistFile.Load(fname,STGM_READ) shellLink.Resolve(0, shell.SLR_ANY_MATCH | shell.SLR_NO_UI) fname, findData = shellLink.GetPath(0) print("Filename:", fname, ", UNC=", shellLink.GetPath(shell.SLGP_UNCPRIORITY)[0]) print("Description:", shellLink.GetDescription()) print("Working Directory:", shellLink.GetWorkingDirectory()) print("Icon:", shellLink.GetIconLocation()) def FavDumper(nothing, path, names): # called by os.path.walk for name in names: print(name, end=' ') try: DumpLink(name) except pythoncom.com_error: print(" - not a link") def DumpFavorites(): favfold = str(shell.SHGetSpecialFolderPath(0, shellcon.CSIDL_FAVORITES)) print("Your favourites are at", favfold) os.path.walk(favfold, FavDumper, None) if __name__=='__main__': if len(sys.argv)>1: for fspec in sys.argv[1:]: files = glob.glob(fspec) if files: for file in files: print(file) DumpLink(file) print() else: print("Can not find", fspec) else: print("Dumping your favorites folder!") DumpFavorites() PK ѳP   )win32comext/shell/demos/shellexecuteex.pyUT l_Zx`ux from win32com.shell import shell, shellcon import win32con def ExplorePIDL(): pidl = shell.SHGetSpecialFolderLocation(0, shellcon.CSIDL_DESKTOP) print("The desktop is at", shell.SHGetPathFromIDList(pidl)) shell.ShellExecuteEx(fMask=shellcon.SEE_MASK_NOCLOSEPROCESS, nShow=win32con.SW_NORMAL, lpClass="folder", lpVerb="explore", lpIDList=pidl) print("Done!") if __name__=='__main__': ExplorePIDL() PK {R win32comext/shell/demos/servers/UT Zx`Zx`ux PK ѳP>PZZ/win32comext/shell/demos/servers/context_menu.pyUT l_Zx`ux # A sample context menu handler. # Adds a 'Hello from Python' menu entry to .py files. When clicked, a # simple message box is displayed. # # To demostrate: # * Execute this script to register the context menu. # * Open Windows Explorer, and browse to a directory with a .py file. # * Right-Click on a .py file - locate and click on 'Hello from Python' on # the context menu. import pythoncom from win32com.shell import shell, shellcon import win32gui import win32con class ShellExtension: _reg_progid_ = "Python.ShellExtension.ContextMenu" _reg_desc_ = "Python Sample Shell Extension (context menu)" _reg_clsid_ = "{CED0336C-C9EE-4a7f-8D7F-C660393C381F}" _com_interfaces_ = [shell.IID_IShellExtInit, shell.IID_IContextMenu] _public_methods_ = shellcon.IContextMenu_Methods + shellcon.IShellExtInit_Methods def Initialize(self, folder, dataobj, hkey): print("Init", folder, dataobj, hkey) self.dataobj = dataobj def QueryContextMenu(self, hMenu, indexMenu, idCmdFirst, idCmdLast, uFlags): print("QCM", hMenu, indexMenu, idCmdFirst, idCmdLast, uFlags) # Query the items clicked on format_etc = win32con.CF_HDROP, None, 1, -1, pythoncom.TYMED_HGLOBAL sm = self.dataobj.GetData(format_etc) num_files = shell.DragQueryFile(sm.data_handle, -1) if num_files>1: msg = "&Hello from Python (with %d files selected)" % num_files else: fname = shell.DragQueryFile(sm.data_handle, 0) msg = "&Hello from Python (with '%s' selected)" % fname idCmd = idCmdFirst items = ['First Python content menu item'] if (uFlags & 0x000F) == shellcon.CMF_NORMAL: # Check == here, since CMF_NORMAL=0 print("CMF_NORMAL...") items.append(msg) elif uFlags & shellcon.CMF_VERBSONLY: print("CMF_VERBSONLY...") items.append(msg + " - shortcut") elif uFlags & shellcon.CMF_EXPLORE: print("CMF_EXPLORE...") items.append(msg + " - normal file, right-click in Explorer") elif uFlags & CMF_DEFAULTONLY: print("CMF_DEFAULTONLY...\r\n") else: print("** unknown flags", uFlags) win32gui.InsertMenu(hMenu, indexMenu, win32con.MF_SEPARATOR|win32con.MF_BYPOSITION, 0, None) indexMenu += 1 for item in items: win32gui.InsertMenu(hMenu, indexMenu, win32con.MF_STRING|win32con.MF_BYPOSITION, idCmd, item) indexMenu += 1 idCmd += 1 win32gui.InsertMenu(hMenu, indexMenu, win32con.MF_SEPARATOR|win32con.MF_BYPOSITION, 0, None) indexMenu += 1 return idCmd-idCmdFirst # Must return number of menu items we added. def InvokeCommand(self, ci): mask, hwnd, verb, params, dir, nShow, hotkey, hicon = ci win32gui.MessageBox(hwnd, "Hello", "Wow", win32con.MB_OK) def GetCommandString(self, cmd, typ): # If GetCommandString returns the same string for all items then # the shell seems to ignore all but one. This is even true in # Win7 etc where there is no status bar (and hence this string seems # ignored) return "Hello from Python (cmd=%d)!!" % (cmd,) def DllRegisterServer(): import winreg key = winreg.CreateKey(winreg.HKEY_CLASSES_ROOT, "Python.File\\shellex") subkey = winreg.CreateKey(key, "ContextMenuHandlers") subkey2 = winreg.CreateKey(subkey, "PythonSample") winreg.SetValueEx(subkey2, None, 0, winreg.REG_SZ, ShellExtension._reg_clsid_) print(ShellExtension._reg_desc_, "registration complete.") def DllUnregisterServer(): import winreg try: key = winreg.DeleteKey(winreg.HKEY_CLASSES_ROOT, "Python.File\\shellex\\ContextMenuHandlers\\PythonSample") except WindowsError as details: import errno if details.errno != errno.ENOENT: raise print(ShellExtension._reg_desc_, "unregistration complete.") if __name__=='__main__': from win32com.server import register register.UseCommandLine(ShellExtension, finalize_register = DllRegisterServer, finalize_unregister = DllUnregisterServer) PK ѳP7=Tpp.win32comext/shell/demos/servers/folder_view.pyUT l_Zx`ux # This is a port of the Vista SDK "FolderView" sample, and associated # notes at http://shellrevealed.com/blogs/shellblog/archive/2007/03/15/Shell-Namespace-Extension_3A00_-Creating-and-Using-the-System-Folder-View-Object.aspx # A key difference to shell_view.py is that this version uses the default # IShellView provided by the shell (via SHCreateShellFolderView) rather # than our own. # XXX - sadly, it doesn't work quite like the original sample. Oh well, # another day... import sys import os import pickle import random import win32api import winxpgui as win32gui # the needs vista, let alone xp! import win32con import winerror import commctrl import pythoncom from win32com.util import IIDToInterfaceName from win32com.server.exception import COMException from win32com.server.util import wrap as _wrap from win32com.server.util import NewEnum as _NewEnum from win32com.shell import shell, shellcon from win32com.axcontrol import axcontrol # IObjectWithSite from win32com.propsys import propsys GUID=pythoncom.MakeIID # If set, output spews to the win32traceutil collector... debug=0 # wrap a python object in a COM pointer def wrap(ob, iid=None): return _wrap(ob, iid, useDispatcher=(debug>0)) def NewEnum(seq, iid): return _NewEnum(seq, iid=iid, useDispatcher=(debug>0)) # The sample makes heavy use of "string ids" (ie, integer IDs defined in .h # files, loaded at runtime from a (presumably localized) DLL. We cheat. _sids = {} # strings, indexed bystring_id, def LoadString(sid): return _sids[sid] # fn to create a unique string ID _last_ids = 0 def _make_ids(s): global _last_ids _last_ids += 1 _sids[_last_ids] = s return _last_ids # These strings are what the user sees and would be localized. # XXX - its possible that the shell might persist these values, so # this scheme wouldn't really be suitable in a real ap. IDS_UNSPECIFIED = _make_ids("unspecified") IDS_SMALL = _make_ids("small") IDS_MEDIUM = _make_ids("medium") IDS_LARGE = _make_ids("large") IDS_CIRCLE = _make_ids("circle") IDS_TRIANGLE = _make_ids("triangle") IDS_RECTANGLE = _make_ids("rectangle") IDS_POLYGON = _make_ids("polygon") IDS_DISPLAY = _make_ids("Display") IDS_DISPLAY_TT = _make_ids("Display the item.") IDS_SETTINGS = _make_ids("Settings") IDS_SETTING1 = _make_ids("Setting 1") IDS_SETTING2 = _make_ids("Setting 2") IDS_SETTING3 = _make_ids("Setting 3") IDS_SETTINGS_TT = _make_ids("Modify settings.") IDS_SETTING1_TT = _make_ids("Modify setting 1.") IDS_SETTING2_TT = _make_ids("Modify setting 2.") IDS_SETTING3_TT = _make_ids("Modify setting 3.") IDS_LESSTHAN5 = _make_ids("Less Than 5") IDS_5ORGREATER = _make_ids("Five or Greater") del _make_ids, _last_ids # Other misc resource stuff IDI_ICON1 = 100 IDI_SETTINGS = 101 # The sample defines a number of "category ids". Each one gets # its own GUID. CAT_GUID_NAME=GUID("{de094c9d-c65a-11dc-ba21-005056c00008}") CAT_GUID_SIZE=GUID("{de094c9e-c65a-11dc-ba21-005056c00008}") CAT_GUID_SIDES=GUID("{de094c9f-c65a-11dc-ba21-005056c00008}") CAT_GUID_LEVEL=GUID("{de094ca0-c65a-11dc-ba21-005056c00008}") # The next category guid is NOT based on a column (see # ViewCategoryProvider::EnumCategories()...) CAT_GUID_VALUE="{de094ca1-c65a-11dc-ba21-005056c00008}" GUID_Display=GUID("{4d6c2fdd-c689-11dc-ba21-005056c00008}") GUID_Settings=GUID("{4d6c2fde-c689-11dc-ba21-005056c00008}") GUID_Setting1=GUID("{4d6c2fdf-c689-11dc-ba21-005056c00008}") GUID_Setting2=GUID("{4d6c2fe0-c689-11dc-ba21-005056c00008}") GUID_Setting3=GUID("{4d6c2fe1-c689-11dc-ba21-005056c00008}") # Hrm - not sure what to do about the std keys. # Probably need a simple parser for propkey.h PKEY_ItemNameDisplay = ("{B725F130-47EF-101A-A5F1-02608C9EEBAC}", 10) PKEY_PropList_PreviewDetails = ("{C9944A21-A406-48FE-8225-AEC7E24C211B}", 8) # Not sure what the "3" here refers to - docs say PID_FIRST_USABLE (2) be # used. Presumably it is the 'propID' value in the .propdesc file! # note that the following GUIDs are also references in the .propdesc file PID_SOMETHING=3 # These are our 'private' PKEYs # Col 2, name="Sample.AreaSize" PKEY_Sample_AreaSize=("{d6f5e341-c65c-11dc-ba21-005056c00008}", PID_SOMETHING) # Col 3, name="Sample.NumberOfSides" PKEY_Sample_NumberOfSides = ("{d6f5e342-c65c-11dc-ba21-005056c00008}", PID_SOMETHING) # Col 4, name="Sample.DirectoryLevel" PKEY_Sample_DirectoryLevel = ("{d6f5e343-c65c-11dc-ba21-005056c00008}", PID_SOMETHING) # We construct a PIDL from a pickle of a dict - turn it back into a # dict (we should *never* be called with a PIDL that the last elt is not # ours, so it is safe to assume we created it (assume->"ass" = "u" + "me" :) def pidl_to_item(pidl): # Note that only the *last* elt in the PIDL is certainly ours, # but it contains everything we need encoded as a dict. return pickle.loads(pidl[-1]) # Start of msdn sample port... # make_item_enum replaces the sample's entire EnumIDList.cpp :) def make_item_enum(level, flags): pidls = [] nums = """zero one two three four five size seven eight nine ten""".split() for i, name in enumerate(nums): size = random.randint(0,255) sides = 1 while sides in [1,2]: sides = random.randint(0,5) is_folder = (i % 2) != 0 # check the flags say to include it. # (This seems strange; if you ask the same folder for, but appear skip = False if not (flags & shellcon.SHCONTF_STORAGE): if is_folder: skip = not (flags & shellcon.SHCONTF_FOLDERS) else: skip = not (flags & shellcon.SHCONTF_NONFOLDERS) if not skip: data = dict(name=name, size=size, sides=sides, level=level, is_folder=is_folder) pidls.append([pickle.dumps(data)]) return NewEnum(pidls, shell.IID_IEnumIDList) # start of Utils.cpp port def DisplayItem(shell_item_array, hwnd_parent=0): # Get the first ShellItem and display its name if shell_item_array is None: msg = "You must select something!" else: si = shell_item_array.GetItemAt(0) name = si.GetDisplayName(shellcon.SIGDN_NORMALDISPLAY) msg = "%d items selected, first is %r" % (shell_item_array.GetCount(), name) win32gui.MessageBox(hwnd_parent, msg, "Hello", win32con.MB_OK) # end of Utils.cpp port # start of sample's FVCommands.cpp port class Command: def __init__(self, guid, ids, ids_tt, idi, flags, callback, children): self.guid = guid; self.ids = ids; self.ids_tt = ids_tt self.idi = idi; self.flags = flags; self.callback = callback; self.children = children assert not children or isinstance(children[0], Command) def tuple(self): return self.guid, self.ids, self.ids_tt, self.idi, self.flags, self.callback, self.children # command callbacks - called back directly by us - see ExplorerCommand.Invoke def onDisplay(items, bindctx): DisplayItem(items) def onSetting1(items, bindctx): win32gui.MessageBox(0, LoadString(IDS_SETTING1), "Hello", win32con.MB_OK) def onSetting2(items, bindctx): win32gui.MessageBox(0, LoadString(IDS_SETTING2), "Hello", win32con.MB_OK) def onSetting3(items, bindctx): win32gui.MessageBox(0, LoadString(IDS_SETTING3), "Hello", win32con.MB_OK) taskSettings = [ Command(GUID_Setting1, IDS_SETTING1, IDS_SETTING1_TT, IDI_SETTINGS, 0, onSetting1, None), Command(GUID_Setting2, IDS_SETTING2, IDS_SETTING2_TT, IDI_SETTINGS, 0, onSetting2, None), Command(GUID_Setting3, IDS_SETTING3, IDS_SETTING3_TT, IDI_SETTINGS, 0, onSetting3, None), ] tasks = [ Command(GUID_Display, IDS_DISPLAY, IDS_DISPLAY_TT, IDI_ICON1, 0, onDisplay, None ), Command(GUID_Settings, IDS_SETTINGS, IDS_SETTINGS_TT, IDI_SETTINGS, shellcon.ECF_HASSUBCOMMANDS, None, taskSettings), ] class ExplorerCommandProvider: _com_interfaces_ = [shell.IID_IExplorerCommandProvider] _public_methods_ = shellcon.IExplorerCommandProvider_Methods def GetCommands(self, site, iid): items = [wrap(ExplorerCommand(t)) for t in tasks] return NewEnum(items, shell.IID_IEnumExplorerCommand) class ExplorerCommand: _com_interfaces_ = [shell.IID_IExplorerCommand] _public_methods_ = shellcon.IExplorerCommand_Methods def __init__(self, cmd): self.cmd = cmd # The sample also appears to ignore the pidl args!? def GetTitle(self, pidl): return LoadString(self.cmd.ids) def GetToolTip(self, pidl): return LoadString(self.cmd.ids_tt) def GetIcon(self, pidl): # Return a string of the usual "dll,resource_id" format # todo - just return any ".ico that comes with python" + ",0" :) raise COMException(hresult=winerror.E_NOTIMPL) def GetState(self, shell_items, slow_ok): return shellcon.ECS_ENABLED def GetFlags(self): return self.cmd.flags def GetCanonicalName(self): return self.cmd.guid def Invoke(self, items, bind_ctx): # If no function defined - just return S_OK if self.cmd.callback: self.cmd.callback(items, bind_ctx) else: print("No callback for command ", LoadString(self.cmd.ids)) def EnumSubCommands(self): if not self.cmd.children: return None items = [wrap(ExplorerCommand(c)) for c in self.cmd.children] return NewEnum(items, shell.IID_IEnumExplorerCommand) # end of sample's FVCommands.cpp port # start of sample's Category.cpp port class FolderViewCategorizer: _com_interfaces_ = [shell.IID_ICategorizer] _public_methods_ = shellcon.ICategorizer_Methods description = None # subclasses should set their own def __init__(self, shell_folder): self.sf = shell_folder # Determines the relative order of two items in their item identifier lists. def CompareCategory(self, flags, cat1, cat2): return cat1-cat2 # Retrieves the name of a categorizer, such as "Group By Device # Type", that can be displayed in the user interface. def GetDescription(self, cch): return self.description # Retrieves information about a category, such as the default # display and the text to display in the user interface. def GetCategoryInfo(self, catid): # Note: this isn't always appropriate! See overrides below return 0, str(catid) # ???? class FolderViewCategorizer_Name(FolderViewCategorizer): description = "Alphabetical" def GetCategory(self, pidls): ret = [] for pidl in pidls: val = self.sf.GetDetailsEx(pidl, PKEY_ItemNameDisplay) ret.append(val) return ret class FolderViewCategorizer_Size(FolderViewCategorizer): description = "Group By Size" def GetCategory(self, pidls): ret = [] for pidl in pidls: # Why don't we just get the size of the PIDL? val = self.sf.GetDetailsEx(pidl, PKEY_Sample_AreaSize) val = int(val) # it probably came in a VT_BSTR variant if val < 255//3: cid = IDS_SMALL elif val < 2 * 255 // 3: cid = IDS_MEDIUM else: cid = IDS_LARGE ret.append(cid) return ret def GetCategoryInfo(self, catid): return 0, LoadString(catid) class FolderViewCategorizer_Sides(FolderViewCategorizer): description = "Group By Sides" def GetCategory(self, pidls): ret = [] for pidl in pidls: val = self.sf.GetDetailsEx(pidl, PKEY_ItemNameDisplay) if val==0: cid = IDS_CIRCLE elif val==3: cid = IDS_TRIANGLE elif val==4: cid = IDS_RECTANGLE elif val==5: cid = IDS_POLYGON else: cid = IDS_UNSPECIFIED ret.append(cid) return ret def GetCategoryInfo(self, catid): return 0, LoadString(catid) class FolderViewCategorizer_Value(FolderViewCategorizer): description = "Group By Value" def GetCategory(self, pidls): ret = [] for pidl in pidls: val = self.sf.GetDetailsEx(pidl, PKEY_ItemNameDisplay) if val in "one two three four".split(): ret.append(IDS_LESSTHAN5) else: ret.append(IDS_5ORGREATER) return ret def GetCategoryInfo(self, catid): return 0, LoadString(catid) class FolderViewCategorizer_Level(FolderViewCategorizer): description = "Group By Value" def GetCategory(self, pidls): return [self.sf.GetDetailsEx(pidl, PKEY_Sample_DirectoryLevel) for pidl in pidls] class ViewCategoryProvider: _com_interfaces_ = [shell.IID_ICategoryProvider] _public_methods_ = shellcon.ICategoryProvider_Methods def __init__(self, shell_folder): self.shell_folder = shell_folder def CanCategorizeOnSCID(self, pkey): return pkey in [PKEY_ItemNameDisplay, PKEY_Sample_AreaSize, PKEY_Sample_NumberOfSides, PKEY_Sample_DirectoryLevel] # Creates a category object. def CreateCategory(self, guid, iid): if iid == shell.IID_ICategorizer: if guid == CAT_GUID_NAME: klass = FolderViewCategorizer_Name elif guid == CAT_GUID_SIDES: klass = FolderViewCategorizer_Sides elif guid == CAT_GUID_SIZE: klass = FolderViewCategorizer_Size elif guid == CAT_GUID_VALUE: klass = FolderViewCategorizer_Value elif guid == CAT_GUID_LEVEL: klass = FolderViewCategorizer_Level else: raise COMException(hresult=winerror.E_INVALIDARG) return wrap(klass(self.shell_folder)) raise COMException(hresult=winerror.E_NOINTERFACE) # Retrieves the enumerator for the categories. def EnumCategories(self): # These are additional categories beyond the columns seq = [CAT_GUID_VALUE] return NewEnum(seq, pythoncom.IID_IEnumGUID) # Retrieves a globally unique identifier (GUID) that represents # the categorizer to use for the specified Shell column. def GetCategoryForSCID(self, scid): if scid==PKEY_ItemNameDisplay: guid = CAT_GUID_NAME elif scid == PKEY_Sample_AreaSize: guid = CAT_GUID_SIZE elif scid == PKEY_Sample_NumberOfSides: guid = CAT_GUID_SIDES elif scid == PKEY_Sample_DirectoryLevel: guid = CAT_GUID_LEVEL elif scid == pythoncom.IID_NULL: # This can be called with a NULL # format ID. This will happen if you have a category, # not based on a column, that gets stored in the # property bag. When a return is made to this item, # it will call this function with a NULL format id. guid = CAT_GUID_VALUE else: raise COMException(hresult=winerror.E_INVALIDARG) return guid # Retrieves the name of the specified category. This is where # additional categories that appear under the column # related categories in the UI, get their display names. def GetCategoryName(self, guid, cch): if guid == CAT_GUID_VALUE: return "Value" raise COMException(hresult=winerror.E_FAIL) # Enables the folder to override the default grouping. def GetDefaultCategory(self): return CAT_GUID_LEVEL, (pythoncom.IID_NULL, 0) # end of sample's Category.cpp port # start of sample's ContextMenu.cpp port MENUVERB_DISPLAY = 0 folderViewImplContextMenuIDs = [ ("display", MENUVERB_DISPLAY, 0, ), ] class ContextMenu: _reg_progid_ = "Python.ShellFolderSample.ContextMenu" _reg_desc_ = "Python FolderView Context Menu" _reg_clsid_ = "{fed40039-021f-4011-87c5-6188b9979764}" _com_interfaces_ = [shell.IID_IShellExtInit, shell.IID_IContextMenu, axcontrol.IID_IObjectWithSite] _public_methods_ = shellcon.IContextMenu_Methods + shellcon.IShellExtInit_Methods + ["GetSite", "SetSite"] _context_menu_type_ = "PythonFolderViewSampleType" def __init__(self): self.site = None self.dataobj = None def Initialize(self, folder, dataobj, hkey): self.dataobj = dataobj def QueryContextMenu(self, hMenu, indexMenu, idCmdFirst, idCmdLast, uFlags): s = LoadString(IDS_DISPLAY); win32gui.InsertMenu(hMenu, indexMenu, win32con.MF_BYPOSITION, idCmdFirst + MENUVERB_DISPLAY, s); indexMenu += 1 # other verbs could go here... # indicate that we added one verb. return 1 def InvokeCommand(self, ci): mask, hwnd, verb, params, dir, nShow, hotkey, hicon = ci # this seems very convuluted, but its what the sample does :) for verb_name, verb_id, flag in folderViewImplContextMenuIDs: if isinstance(verb, int): matches = verb==verb_id else: matches = verb==verb_name if matches: break else: assert False, ci # failed to find our ID if verb_id == MENUVERB_DISPLAY: sia = shell.SHCreateShellItemArrayFromDataObject(self.dataobj) DisplayItem(hwnd, sia) else: assert False, ci # Got some verb we weren't expecting? def GetCommandString(self, cmd, typ): raise COMException(hresult=winerror.E_NOTIMPL) def SetSite(self, site): self.site = site def GetSite(self, iid): return self.site # end of sample's ContextMenu.cpp port # start of sample's ShellFolder.cpp port class ShellFolder: _com_interfaces_ = [shell.IID_IBrowserFrameOptions, pythoncom.IID_IPersist, shell.IID_IPersistFolder, shell.IID_IPersistFolder2, shell.IID_IShellFolder, shell.IID_IShellFolder2, ] _public_methods_ = shellcon.IBrowserFrame_Methods + \ shellcon.IPersistFolder2_Methods + \ shellcon.IShellFolder2_Methods _reg_progid_ = "Python.ShellFolderSample.Folder2" _reg_desc_ = "Python FolderView sample" _reg_clsid_ = "{bb8c24ad-6aaa-4cec-ac5e-c429d5f57627}" max_levels = 5 def __init__(self, level=0): self.current_level = level self.pidl = None # set when Initialize is called def ParseDisplayName(self, hwnd, reserved, displayName, attr): #print "ParseDisplayName", displayName raise COMException(hresult=winerror.E_NOTIMPL) def EnumObjects(self, hwndOwner, flags): if self.current_level >= self.max_levels: return None return make_item_enum(self.current_level+1, flags) def BindToObject(self, pidl, bc, iid): tail = pidl_to_item(pidl) # assert tail['is_folder'], "BindToObject should only be called on folders?" # *sob* # No point creating object just to have QI fail. if iid not in ShellFolder._com_interfaces_: raise COMException(hresult=winerror.E_NOTIMPL) child = ShellFolder(self.current_level+1) # hrmph - not sure what multiple PIDLs here mean? # assert len(pidl)==1, pidl # expecting just relative child PIDL child.Initialize(self.pidl + pidl) return wrap(child, iid) def BindToStorage(self, pidl, bc, iid): return self.BindToObject(pidl, bc, iid) def CompareIDs(self, param, id1, id2): return 0 # XXX - todo - implement this! def CreateViewObject(self, hwnd, iid): if iid == shell.IID_IShellView: com_folder = wrap(self) return shell.SHCreateShellFolderView(com_folder) elif iid == shell.IID_ICategoryProvider: return wrap(ViewCategoryProvider(self)) elif iid == shell.IID_IContextMenu: ws = wrap(self) dcm = (hwnd, None, self.pidl, ws, None) return shell.SHCreateDefaultContextMenu(dcm, iid) elif iid == shell.IID_IExplorerCommandProvider: return wrap(ExplorerCommandProvider()) else: raise COMException(hresult=winerror.E_NOINTERFACE) def GetAttributesOf(self, pidls, attrFlags): assert len(pidls)==1, "sample only expects 1 too!" assert len(pidls[0])==1, "expect relative pidls!" item = pidl_to_item(pidls[0]) flags = 0 if item['is_folder']: flags |= shellcon.SFGAO_FOLDER if item['level'] < self.max_levels: flags |= shellcon.SFGAO_HASSUBFOLDER return flags # Retrieves an OLE interface that can be used to carry out # actions on the specified file objects or folders. def GetUIObjectOf(self, hwndOwner, pidls, iid, inout): assert len(pidls)==1, "oops - arent expecting more than one!" assert len(pidls[0])==1, "assuming relative pidls!" item = pidl_to_item(pidls[0]) if iid == shell.IID_IContextMenu: ws = wrap(self) dcm = (hwndOwner, None, self.pidl, ws, pidls) return shell.SHCreateDefaultContextMenu(dcm, iid) elif iid == shell.IID_IExtractIconW: dxi = shell.SHCreateDefaultExtractIcon() # dxi is IDefaultExtractIconInit if item['is_folder']: dxi.SetNormalIcon("shell32.dll", 4) else: dxi.SetNormalIcon("shell32.dll", 1) # just return the dxi - let Python QI for IID_IExtractIconW return dxi elif iid == pythoncom.IID_IDataObject: return shell.SHCreateDataObject(self.pidl, pidls, None, iid); elif iid == shell.IID_IQueryAssociations: elts = [] if item['is_folder']: elts.append((shellcon.ASSOCCLASS_FOLDER, None, None)) elts.append((shellcon.ASSOCCLASS_PROGID_STR, None, ContextMenu._context_menu_type_)) return shell.AssocCreateForClasses(elts, iid) raise COMException(hresult=winerror.E_NOINTERFACE) # Retrieves the display name for the specified file object or subfolder. def GetDisplayNameOf(self, pidl, flags): item = pidl_to_item(pidl) if flags & shellcon.SHGDN_FORPARSING: if flags & shellcon.SHGDN_INFOLDER: return item['name'] else: if flags & shellcon.SHGDN_FORADDRESSBAR: sigdn = shellcon.SIGDN_DESKTOPABSOLUTEEDITING else: sigdn = shellcon.SIGDN_DESKTOPABSOLUTEPARSING parent = shell.SHGetNameFromIDList(self.pidl, sigdn) return parent + "\\" + item['name'] else: return item['name'] def SetNameOf(self, hwndOwner, pidl, new_name, flags): raise COMException(hresult=winerror.E_NOTIMPL) def GetClassID(self): return self._reg_clsid_ # IPersistFolder method def Initialize(self, pidl): self.pidl = pidl # IShellFolder2 methods def EnumSearches(self): raise COMException(hresult=winerror.E_NOINTERFACE) # Retrieves the default sorting and display columns. def GetDefaultColumn(self, dwres): # result is (sort, display) return 0, 0 # Retrieves the default state for a specified column. def GetDefaultColumnState(self, iCol): if iCol < 3: return shellcon.SHCOLSTATE_ONBYDEFAULT | shellcon.SHCOLSTATE_TYPE_STR raise COMException(hresult=winerror.E_INVALIDARG) # Requests the GUID of the default search object for the folder. def GetDefaultSearchGUID(self): raise COMException(hresult=winerror.E_NOTIMPL) # Helper function for getting the display name for a column. def _GetColumnDisplayName(self, pidl, pkey): item = pidl_to_item(pidl) is_folder = item['is_folder'] if pkey == PKEY_ItemNameDisplay: val = item['name'] elif pkey == PKEY_Sample_AreaSize and not is_folder: val = "%d Sq. Ft." % item['size'] elif pkey == PKEY_Sample_NumberOfSides and not is_folder: val = str(item['sides']) # not sure why str() elif pkey == PKEY_Sample_DirectoryLevel: val = str(item['level']) else: val = '' return val # Retrieves detailed information, identified by a # property set ID (FMTID) and property ID (PID), # on an item in a Shell folder. def GetDetailsEx(self, pidl, pkey): item = pidl_to_item(pidl) is_folder = item['is_folder'] if not is_folder and pkey == PKEY_PropList_PreviewDetails: return "prop:Sample.AreaSize;Sample.NumberOfSides;Sample.DirectoryLevel" return self._GetColumnDisplayName(pidl, pkey) # Retrieves detailed information, identified by a # column index, on an item in a Shell folder. def GetDetailsOf(self, pidl, iCol): key = self.MapColumnToSCID(iCol); if pidl is None: data = [(commctrl.LVCFMT_LEFT, "Name"), (commctrl.LVCFMT_CENTER, "Size"), (commctrl.LVCFMT_CENTER, "Sides"), (commctrl.LVCFMT_CENTER, "Level"),] if iCol >= len(data): raise COMException(hresult=winerror.E_FAIL) fmt, val = data[iCol] else: fmt = 0 # ? val = self._GetColumnDisplayName(pidl, key) cxChar = 24 return fmt, cxChar, val # Converts a column name to the appropriate # property set ID (FMTID) and property ID (PID). def MapColumnToSCID(self, iCol): data = [PKEY_ItemNameDisplay, PKEY_Sample_AreaSize, PKEY_Sample_NumberOfSides, PKEY_Sample_DirectoryLevel] if iCol >= len(data): raise COMException(hresult=winerror.E_FAIL) return data[iCol] # IPersistFolder2 methods # Retrieves the PIDLIST_ABSOLUTE for the folder object. def GetCurFolder(self): # The docs say this is OK, but I suspect its a problem in this case :) #assert self.pidl, "haven't been initialized?" return self.pidl # end of sample's ShellFolder.cpp port def get_schema_fname(): me = win32api.GetFullPathName(__file__) sc = os.path.splitext(me)[0] + ".propdesc" assert os.path.isfile(sc), sc return sc def DllRegisterServer(): import winreg if sys.getwindowsversion()[0] < 6: print("This sample only works on Vista") sys.exit(1) key = winreg.CreateKey(winreg.HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\" \ "Explorer\\Desktop\\Namespace\\" + \ ShellFolder._reg_clsid_) winreg.SetValueEx(key, None, 0, winreg.REG_SZ, ShellFolder._reg_desc_) # And special shell keys under our CLSID key = winreg.CreateKey(winreg.HKEY_CLASSES_ROOT, "CLSID\\" + ShellFolder._reg_clsid_ + "\\ShellFolder") # 'Attributes' is an int stored as a binary! use struct attr = shellcon.SFGAO_FOLDER | shellcon.SFGAO_HASSUBFOLDER | \ shellcon.SFGAO_BROWSABLE import struct s = struct.pack("i", attr) winreg.SetValueEx(key, "Attributes", 0, winreg.REG_BINARY, s) # register the context menu handler under the FolderViewSampleType type. keypath = "%s\\shellex\\ContextMenuHandlers\\%s" % (ContextMenu._context_menu_type_, ContextMenu._reg_desc_) key = winreg.CreateKey(winreg.HKEY_CLASSES_ROOT, keypath) winreg.SetValueEx(key, None, 0, winreg.REG_SZ, ContextMenu._reg_clsid_) propsys.PSRegisterPropertySchema(get_schema_fname()) print(ShellFolder._reg_desc_, "registration complete.") def DllUnregisterServer(): import winreg paths = [ "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Desktop\\Namespace\\" + ShellFolder._reg_clsid_, "%s\\shellex\\ContextMenuHandlers\\%s" % (ContextMenu._context_menu_type_, ContextMenu._reg_desc_), ] for path in paths: try: winreg.DeleteKey(winreg.HKEY_LOCAL_MACHINE, path) except WindowsError as details: import errno if details.errno != errno.ENOENT: print("FAILED to remove %s: %s" % (path, details)) propsys.PSUnregisterPropertySchema(get_schema_fname()) print(ShellFolder._reg_desc_, "unregistration complete.") if __name__=='__main__': from win32com.server import register register.UseCommandLine(ShellFolder, ContextMenu, debug = debug, finalize_register = DllRegisterServer, finalize_unregister = DllUnregisterServer) PK ѳPeD++2win32comext/shell/demos/servers/column_provider.pyUT l_Zx`ux # A sample shell column provider # Mainly ported from MSDN article: # Using Shell Column Handlers for Detailed File Information, # Raymond Chen, Microsoft Corporation, February 2000 # # To demostrate: # * Execute this script to register the namespace. # * Open Windows Explorer # * Right-click an explorer column header - select "More" # * Locate column 'pyc size' or 'pyo size', and add it to the view. # This handler is providing that column data. import sys, os, stat import pythoncom from win32com.shell import shell, shellcon import commctrl import winerror from win32com.server.util import wrap from pywintypes import IID IPersist_Methods = ["GetClassID"] IColumnProvider_Methods = IPersist_Methods + \ ["Initialize", "GetColumnInfo", "GetItemData"] class ColumnProvider: _reg_progid_ = "Python.ShellExtension.ColumnProvider" _reg_desc_ = "Python Sample Shell Extension (Column Provider)" _reg_clsid_ = IID("{0F14101A-E05E-4070-BD54-83DFA58C3D68}") _com_interfaces_ = [pythoncom.IID_IPersist, shell.IID_IColumnProvider, ] _public_methods_ = IColumnProvider_Methods # IPersist def GetClassID(self): return self._reg_clsid_ # IColumnProvider def Initialize(self, colInit): flags, reserved, name = colInit print("ColumnProvider initializing for file", name) def GetColumnInfo(self, index): # We support exactly 2 columns - 'pyc size' and 'pyo size' if index in [0,1]: # As per the MSDN sample, use our CLSID as the fmtid if index==0: ext = ".pyc" else: ext = ".pyo" title = ext + " size" description = "Size of compiled %s file" % ext col_id = (self._reg_clsid_, # fmtid index) # pid col_info = ( col_id, # scid pythoncom.VT_I4, # vt commctrl.LVCFMT_RIGHT, # fmt 20, #cChars shellcon.SHCOLSTATE_TYPE_INT | \ shellcon.SHCOLSTATE_SECONDARYUI, # csFlags title, description) return col_info return None # Indicate no more columns. def GetItemData(self, colid, colData): fmt_id, pid = colid fmt_id==self._reg_clsid_ flags, attr, reserved, ext, name = colData if ext.lower() not in [".py", ".pyw"]: return None if pid==0: ext = ".pyc" else: ext = ".pyo" check_file = os.path.splitext(name)[0] + ext try: st = os.stat(check_file) return st[stat.ST_SIZE] except OSError: # No file return None def DllRegisterServer(): import winreg # Special ColumnProvider key key = winreg.CreateKey(winreg.HKEY_CLASSES_ROOT, "Folder\\ShellEx\\ColumnHandlers\\" + \ str(ColumnProvider._reg_clsid_ )) winreg.SetValueEx(key, None, 0, winreg.REG_SZ, ColumnProvider._reg_desc_) print(ColumnProvider._reg_desc_, "registration complete.") def DllUnregisterServer(): import winreg try: key = winreg.DeleteKey(winreg.HKEY_CLASSES_ROOT, "Folder\\ShellEx\\ColumnHandlers\\" + \ str(ColumnProvider._reg_clsid_) ) except WindowsError as details: import errno if details.errno != errno.ENOENT: raise print(ColumnProvider._reg_desc_, "unregistration complete.") if __name__=='__main__': from win32com.server import register register.UseCommandLine(ColumnProvider, finalize_register = DllRegisterServer, finalize_unregister = DllUnregisterServer) PK ѳPw( ( /win32comext/shell/demos/servers/icon_handler.pyUT l_Zx`ux # A sample icon handler. Sets the icon for Python files to a random # ICO file. ICO files are found in the Python directory - generally there will # be 3 icons found. # # To demostrate: # * Execute this script to register the context menu. # * Open Windows Explorer, and browse to a directory with a .py file. # * Note the pretty, random selection of icons! import sys, os import pythoncom from win32com.shell import shell, shellcon import win32gui import win32con import winerror # Use glob to locate ico files, and random.choice to pick one. import glob, random ico_files = glob.glob(os.path.join(sys.prefix, "*.ico")) if not ico_files: ico_files = glob.glob(os.path.join(sys.prefix, "PC", "*.ico")) if not ico_files: print("WARNING: Can't find any icon files") # Our shell extension. IExtractIcon_Methods = "Extract GetIconLocation".split() IPersistFile_Methods = "IsDirty Load Save SaveCompleted GetCurFile".split() class ShellExtension: _reg_progid_ = "Python.ShellExtension.IconHandler" _reg_desc_ = "Python Sample Shell Extension (icon handler)" _reg_clsid_ = "{a97e32d7-3b78-448c-b341-418120ea9227}" _com_interfaces_ = [shell.IID_IExtractIcon, pythoncom.IID_IPersistFile] _public_methods_ = IExtractIcon_Methods + IPersistFile_Methods def Load(self, filename, mode): self.filename = filename self.mode = mode def GetIconLocation(self, flags): # note - returning a single int will set the HRESULT (eg, S_FALSE, # E_PENDING - see MS docs for details. return random.choice(ico_files), 0, 0 def Extract(self, fname, index, size): return winerror.S_FALSE def DllRegisterServer(): import winreg key = winreg.CreateKey(winreg.HKEY_CLASSES_ROOT, "Python.File\\shellex") subkey = winreg.CreateKey(key, "IconHandler") winreg.SetValueEx(subkey, None, 0, winreg.REG_SZ, ShellExtension._reg_clsid_) print(ShellExtension._reg_desc_, "registration complete.") def DllUnregisterServer(): import winreg try: key = winreg.DeleteKey(winreg.HKEY_CLASSES_ROOT, "Python.File\\shellex\\IconHandler") except WindowsError as details: import errno if details.errno != errno.ENOENT: raise print(ShellExtension._reg_desc_, "unregistration complete.") if __name__=='__main__': from win32com.server import register register.UseCommandLine(ShellExtension, finalize_register = DllRegisterServer, finalize_unregister = DllUnregisterServer) PK ѳPKd5win32comext/shell/demos/servers/empty_volume_cache.pyUT l_Zx`ux # A sample implementation of IEmptyVolumeCache - see # http://msdn2.microsoft.com/en-us/library/aa969271.aspx for an overview. # # * Execute this script to register the handler # * Start the "disk cleanup" tool - look for "pywin32 compiled files" import sys, os, stat, time import pythoncom from win32com.shell import shell, shellcon from win32com.server.exception import COMException import win32gui import win32con import winerror # Our shell extension. IEmptyVolumeCache_Methods = "Initialize GetSpaceUsed Purge ShowProperties Deactivate".split() IEmptyVolumeCache2_Methods = "InitializeEx".split() ico = os.path.join(sys.prefix, "py.ico") if not os.path.isfile(ico): ico = os.path.join(sys.prefix, "PC", "py.ico") if not os.path.isfile(ico): ico = None print("Can't find python.ico - no icon will be installed") class EmptyVolumeCache: _reg_progid_ = "Python.ShellExtension.EmptyVolumeCache" _reg_desc_ = "Python Sample Shell Extension (disk cleanup)" _reg_clsid_ = "{EADD0777-2968-4c72-A999-2BF5F756259C}" _reg_icon_ = ico _com_interfaces_ = [shell.IID_IEmptyVolumeCache, shell.IID_IEmptyVolumeCache2] _public_methods_ = IEmptyVolumeCache_Methods + IEmptyVolumeCache2_Methods def Initialize(self, hkey, volume, flags): # This should never be called, except on win98. print("Unless we are on 98, Initialize call is unexpected!") raise COMException(hresult=winerror.E_NOTIMPL) def InitializeEx(self, hkey, volume, key_name, flags): # Must return a tuple of: # (display_name, description, button_name, flags) print("InitializeEx called with", hkey, volume, key_name, flags) self.volume = volume if flags & shellcon.EVCF_SETTINGSMODE: print("We are being run on a schedule") # In this case, "because there is no opportunity for user # feedback, only those files that are extremely safe to clean up # should be touched. You should ignore the initialization # method's pcwszVolume parameter and clean unneeded files # regardless of what drive they are on." self.volume = None # flag as 'any disk will do' elif flags & shellcon.EVCF_OUTOFDISKSPACE: # In this case, "the handler should be aggressive about deleting # files, even if it results in a performance loss. However, the # handler obviously should not delete files that would cause an # application to fail or the user to lose data." print("We are being run as we are out of disk-space") else: # This case is not documented - we are guessing :) print("We are being run because the user asked") # For the sake of demo etc, we tell the shell to only show us when # there are > 0 bytes available. Our GetSpaceUsed will check the # volume, so will return 0 when we are on a different disk flags = shellcon.EVCF_DONTSHOWIFZERO | shellcon.EVCF_ENABLEBYDEFAULT return ("pywin32 compiled files", "Removes all .pyc and .pyo files in the pywin32 directories", "click me!", flags ) def _GetDirectories(self): root_dir = os.path.abspath(os.path.dirname(os.path.dirname(win32gui.__file__))) if self.volume is not None and \ not root_dir.lower().startswith(self.volume.lower()): return [] return [os.path.join(root_dir, p) for p in ('win32', 'win32com', 'win32comext', 'isapi')] def _WalkCallback(self, arg, directory, files): # callback function for os.path.walk - no need to be member, but its # close to the callers :) callback, total_list = arg for file in files: fqn = os.path.join(directory, file).lower() if file.endswith(".pyc") or file.endswith(".pyo"): # See below - total_list == None means delete files, # otherwise it is a list where the result is stored. Its a # list simply due to the way os.walk works - only [0] is # referenced if total_list is None: print("Deleting file", fqn) # Should do callback.PurgeProcess - left as an exercise :) os.remove(fqn) else: total_list[0] += os.stat(fqn)[stat.ST_SIZE] # and callback to the tool if callback: # for the sake of seeing the progress bar do its thing, # we take longer than we need to... # ACK - for some bizarre reason this screws up the XP # cleanup manager - clues welcome!! :) ## print "Looking in", directory, ", but waiting a while..." ## time.sleep(3) # now do it used = total_list[0] callback.ScanProgress(used, 0, "Looking at " + fqn) def GetSpaceUsed(self, callback): total = [0] # See _WalkCallback above try: for d in self._GetDirectories(): os.path.walk(d, self._WalkCallback, (callback, total)) print("After looking in", d, "we have", total[0], "bytes") except pythoncom.error as exc: # This will be raised by the callback when the user selects 'cancel'. if exc.hresult != winerror.E_ABORT: raise # that's the documented error code! print("User cancelled the operation") return total[0] def Purge(self, amt_to_free, callback): print("Purging", amt_to_free, "bytes...") # we ignore amt_to_free - it is generally what we returned for # GetSpaceUsed try: for d in self._GetDirectories(): os.path.walk(d, self._WalkCallback, (callback, None)) except pythoncom.error as exc: # This will be raised by the callback when the user selects 'cancel'. if exc.hresult != winerror.E_ABORT: raise # that's the documented error code! print("User cancelled the operation") def ShowProperties(self, hwnd): raise COMException(hresult=winerror.E_NOTIMPL) def Deactivate(self): print("Deactivate called") return 0 def DllRegisterServer(): # Also need to register specially in: # HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches # See link at top of file. import winreg kn = r"Software\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\%s" \ % (EmptyVolumeCache._reg_desc_,) key = winreg.CreateKey(winreg.HKEY_LOCAL_MACHINE, kn) winreg.SetValueEx(key, None, 0, winreg.REG_SZ, EmptyVolumeCache._reg_clsid_) def DllUnregisterServer(): import winreg kn = r"Software\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\%s" \ % (EmptyVolumeCache._reg_desc_,) try: key = winreg.DeleteKey(winreg.HKEY_LOCAL_MACHINE, kn) except WindowsError as details: import errno if details.errno != errno.ENOENT: raise print(EmptyVolumeCache._reg_desc_, "unregistration complete.") if __name__=='__main__': from win32com.server import register register.UseCommandLine(EmptyVolumeCache, finalize_register = DllRegisterServer, finalize_unregister = DllUnregisterServer) PK ѳPE|A A ,win32comext/shell/demos/servers/copy_hook.pyUT l_Zx`ux # A sample shell copy hook. # To demostrate: # * Execute this script to register the context menu. # * Open Windows Explorer # * Attempt to move or copy a directory. # * Note our hook's dialog is displayed. import sys, os import pythoncom from win32com.shell import shell, shellcon import win32gui import win32con import winerror # Our shell extension. class ShellExtension: _reg_progid_ = "Python.ShellExtension.CopyHook" _reg_desc_ = "Python Sample Shell Extension (copy hook)" _reg_clsid_ = "{1845b6ba-2bbd-4197-b930-46d8651497c1}" _com_interfaces_ = [shell.IID_ICopyHook] _public_methods_ = ["CopyCallBack"] def CopyCallBack(self, hwnd, func, flags, srcName, srcAttr, destName, destAttr): # This function should return: # IDYES Allows the operation. # IDNO Prevents the operation on this folder but continues with any other operations that have been approved (for example, a batch copy operation). # IDCANCEL Prevents the current operation and cancels any pending operations. print("CopyCallBack", hwnd, func, flags, srcName, srcAttr, destName, destAttr) return win32gui.MessageBox(hwnd, "Allow operation?", "CopyHook", win32con.MB_YESNO) def DllRegisterServer(): import winreg key = winreg.CreateKey(winreg.HKEY_CLASSES_ROOT, "directory\\shellex\\CopyHookHandlers\\" + ShellExtension._reg_desc_) winreg.SetValueEx(key, None, 0, winreg.REG_SZ, ShellExtension._reg_clsid_) key = winreg.CreateKey(winreg.HKEY_CLASSES_ROOT, "*\\shellex\\CopyHookHandlers\\" + ShellExtension._reg_desc_) winreg.SetValueEx(key, None, 0, winreg.REG_SZ, ShellExtension._reg_clsid_) print(ShellExtension._reg_desc_, "registration complete.") def DllUnregisterServer(): import winreg try: key = winreg.DeleteKey(winreg.HKEY_CLASSES_ROOT, "directory\\shellex\\CopyHookHandlers\\" + ShellExtension._reg_desc_) except WindowsError as details: import errno if details.errno != errno.ENOENT: raise try: key = winreg.DeleteKey(winreg.HKEY_CLASSES_ROOT, "*\\shellex\\CopyHookHandlers\\" + ShellExtension._reg_desc_) except WindowsError as details: import errno if details.errno != errno.ENOENT: raise print(ShellExtension._reg_desc_, "unregistration complete.") if __name__=='__main__': from win32com.server import register register.UseCommandLine(ShellExtension, finalize_register = DllRegisterServer, finalize_unregister = DllUnregisterServer) #!/usr/bin/env python PK ѳPal!qq-win32comext/shell/demos/servers/shell_view.pyUT l_Zx`ux # A sample shell namespace view # To demostrate: # * Execute this script to register the namespace. # * Open Windows Explorer, and locate the new "Python Path Shell Browser" # folder off "My Computer" # * Browse this tree - .py files are shown expandable, with classes and # methods selectable. Selecting a Python file, or a class/method, will # display the file using Scintilla. # Known problems: # * Classes and methods don't have icons - this is a demo, so we keep it small # See icon_handler.py for examples of how to work with icons. # # # Notes on PIDLs # PIDLS are complicated, but fairly well documented in MSDN. If you need to # do much with these shell extensions, you must understand their concept. # Here is a short-course, as it applies to this sample: # A PIDL identifies an item, much in the same way that a filename does # (however, the shell is not limited to displaying "files"). # An "ItemID" is a single string, each being an item in the hierarchy. # A "PIDL" is a list of these strings. # All shell etc functions work with PIDLs, so even in the case where # an ItemID is conceptually used, a 1-item list is always used. # Conceptually, think of: # pidl = pathname.split("\\") # pidl is a list of "parent" items. # # each item is a string 'item id', but these are ever used directly # As there is no concept of passing a single item, to open a file using only # a relative filename, conceptually you would say: # open_file([filename]) # Pass a single-itemed relative "PIDL" # and continuing the analogy, a "listdir" type function would return a list # of single-itemed lists - each list containing the relative PIDL of the child. # # Each PIDL entry is a binary string, and may contain any character. For # PIDLs not created by you, they can not be interpreted - they are just # blobs. PIDLs created by you (ie, children of your IShellFolder) can # store and interpret the string however makes most sense for your application. # (but within PIDL rules - they must be persistable, etc) # There is no reason that pickled strings, for example, couldn't be used # as an EntryID. # This application takes a simple approach - each PIDL is a string of form # "directory\0directory_name", "file\0file_name" or # "object\0file_name\0class_name[.method_name" # The first string in each example is literal (ie, the word 'directory', # 'file' or 'object', and every other string is variable. We use '\0' as # a field sep just 'cos we can (and 'cos it can't possibly conflict with the # string content) import sys, os import _thread import pyclbr import pythoncom import win32gui, win32gui_struct, win32api, win32con, winerror import commctrl from win32com.shell import shell, shellcon from win32com.server.util import wrap, NewEnum from win32com.server.exception import COMException from win32com.util import IIDToInterfaceName from pywin.scintilla import scintillacon # Set this to 1 to cause debug version to be registered and used. A debug # version will spew output to win32traceutil. debug=0 if debug: import win32traceutil # markh is toying with an implementation that allows auto reload of a module # if this attribute exists. com_auto_reload = True # Helper function to get a system IShellFolder interface, and the PIDL within # that folder for an existing file/directory. def GetFolderAndPIDLForPath(filename): desktop = shell.SHGetDesktopFolder() info = desktop.ParseDisplayName(0, None, os.path.abspath(filename)) cchEaten, pidl, attr = info # We must walk the ID list, looking for one child at a time. folder = desktop while len(pidl) > 1: this = pidl.pop(0) folder = folder.BindToObject([this], None, shell.IID_IShellFolder) # We are left with the pidl for the specific item. Leave it as # a list, so it remains a valid PIDL. return folder, pidl # A cache of pyclbr module objects, so we only parse a given filename once. clbr_modules = {} # Indexed by path, item is dict as returned from pyclbr def get_clbr_for_file(path): try: objects = clbr_modules[path] except KeyError: dir, filename = os.path.split(path) base, ext = os.path.splitext(filename) objects = pyclbr.readmodule_ex(base, [dir]) clbr_modules[path] = objects return objects # Our COM interfaces. # Base class for a shell folder. # All child classes use a simple PIDL of the form: # "object_type\0object_name[\0extra ...]" class ShellFolderBase: _com_interfaces_ = [shell.IID_IBrowserFrameOptions, pythoncom.IID_IPersist, shell.IID_IPersistFolder, shell.IID_IShellFolder, ] _public_methods_ = shellcon.IBrowserFrame_Methods + \ shellcon.IPersistFolder_Methods + \ shellcon.IShellFolder_Methods def GetFrameOptions(self, mask): #print "GetFrameOptions", self, mask return 0 def ParseDisplayName(self, hwnd, reserved, displayName, attr): print("ParseDisplayName", displayName) # return cchEaten, pidl, attr def BindToStorage(self, pidl, bc, iid): print("BTS", iid, IIDToInterfaceName(iid)) def BindToObject(self, pidl, bc, iid): # We may be passed a set of relative PIDLs here - ie # [pidl_of_dir, pidl_of_child_dir, pidl_of_file, pidl_of_function] # But each of our PIDLs keeps the fully qualified name anyway - so # just jump directly to the last. final_pidl = pidl[-1] typ, extra = final_pidl.split('\0', 1) if typ == "directory": klass = ShellFolderDirectory elif typ == "file": klass = ShellFolderFile elif typ == "object": klass = ShellFolderObject else: raise RuntimeError("What is " + repr(typ)) ret = wrap(klass(extra), iid, useDispatcher = (debug>0)) return ret # A ShellFolder for an object with CHILDREN on the file system # Note that this means our "File" folder is *not* a 'FileSystem' folder, # as it's children (functions and classes) are not on the file system. # class ShellFolderFileSystem(ShellFolderBase): def _GetFolderAndPIDLForPIDL(self, my_idl): typ, name = my_idl[0].split('\0') return GetFolderAndPIDLForPath(name) # Interface methods def CompareIDs(self, param, id1, id2): if id1 < id2: return -1 if id1 == id2: return 0 return 1 def GetUIObjectOf(self, hwndOwner, pidls, iid, inout): # delegate to the shell. assert len(pidls)==1, "oops - arent expecting more than one!" pidl = pidls[0] folder, child_pidl = self._GetFolderAndPIDLForPIDL(pidl) try: inout, ret = folder.GetUIObjectOf(hwndOwner, [child_pidl], iid, inout, iid) except pythoncom.com_error as exc: raise COMException(hresult=exc.hresult) return inout, ret # return object of IID def GetDisplayNameOf(self, pidl, flags): # delegate to the shell. folder, child_pidl = self._GetFolderAndPIDLForPIDL(pidl) ret = folder.GetDisplayNameOf(child_pidl, flags) return ret def GetAttributesOf(self, pidls, attrFlags): ret_flags = -1 for pidl in pidls: pidl = pidl[0] # ?? typ, name = pidl.split('\0') flags = shellcon.SHGFI_ATTRIBUTES rc, info = shell.SHGetFileInfo(name, 0, flags) hIcon, iIcon, dwAttr, name, typeName = info # All our items, even files, have sub-items extras = shellcon.SFGAO_HASSUBFOLDER | \ shellcon.SFGAO_FOLDER | \ shellcon.SFGAO_FILESYSANCESTOR | \ shellcon.SFGAO_BROWSABLE ret_flags &= (dwAttr | extras) return ret_flags class ShellFolderDirectory(ShellFolderFileSystem): def __init__(self, path): self.path = os.path.abspath(path) def CreateViewObject(self, hwnd, iid): # delegate to the shell. folder, child_pidl = GetFolderAndPIDLForPath(self.path) return folder.CreateViewObject(hwnd, iid) def EnumObjects(self, hwndOwner, flags): pidls = [] for fname in os.listdir(self.path): fqn = os.path.join(self.path, fname) if os.path.isdir(fqn): type_name = "directory" type_class = ShellFolderDirectory else: base, ext = os.path.splitext(fname) if ext in [".py", ".pyw"]: type_class = ShellFolderFile type_name = "file" else: type_class = None if type_class is not None: pidls.append( [type_name + "\0" + fqn] ) return NewEnum(pidls, iid=shell.IID_IEnumIDList, useDispatcher=(debug>0)) def GetDisplayNameOf(self, pidl, flags): final_pidl=pidl[-1] full_fname=final_pidl.split('\0')[-1] return os.path.split(full_fname)[-1] def GetAttributesOf(self, pidls, attrFlags): return shellcon.SFGAO_HASSUBFOLDER|shellcon.SFGAO_FOLDER|shellcon.SFGAO_FILESYSANCESTOR|shellcon.SFGAO_BROWSABLE # As per comments above, even though this manages a file, it is *not* a # ShellFolderFileSystem, as the children are not on the file system. class ShellFolderFile(ShellFolderBase): def __init__(self, path): self.path = os.path.abspath(path) def EnumObjects(self, hwndOwner, flags): objects = get_clbr_for_file(self.path) pidls = [] for name, ob in objects.items(): pidls.append( ["object\0" + self.path + "\0" + name] ) return NewEnum(pidls, iid=shell.IID_IEnumIDList, useDispatcher=(debug>0)) def GetAttributesOf(self, pidls, attrFlags): ret_flags = -1 for pidl in pidls: assert len(pidl)==1, "Expecting relative pidls" pidl = pidl[0] typ, filename, obname = pidl.split('\0') obs = get_clbr_for_file(filename) ob = obs[obname] flags = shellcon.SFGAO_BROWSABLE | shellcon.SFGAO_FOLDER | \ shellcon.SFGAO_FILESYSANCESTOR if hasattr(ob, "methods"): flags |= shellcon.SFGAO_HASSUBFOLDER ret_flags &= flags return ret_flags def GetDisplayNameOf(self, pidl, flags): assert len(pidl)==1, "Expecting relative PIDL" typ, fname, obname = pidl[0].split('\0') fqname = os.path.splitext(fname)[0] + "." + obname if flags & shellcon.SHGDN_INFOLDER: ret = obname else: # SHGDN_NORMAL is the default ret = fqname # No need to look at the SHGDN_FOR* modifiers. return ret def CreateViewObject(self, hwnd, iid): return wrap(ScintillaShellView(hwnd, self.path), iid, useDispatcher=debug>0) # A ShellFolder for our Python objects class ShellFolderObject(ShellFolderBase): def __init__(self, details): self.path, details = details.split('\0') if details.find(".")>0: self.class_name, self.method_name = details.split(".") else: self.class_name = details self.method_name = None def CreateViewObject(self, hwnd, iid): mod_objects = get_clbr_for_file(self.path) object = mod_objects[self.class_name] if self.method_name is None: lineno = object.lineno else: lineno = object.methods[self.method_name] return wrap(ScintillaShellView(hwnd, self.path, lineno), iid, useDispatcher=debug>0) def EnumObjects(self, hwndOwner, flags): assert self.method_name is None, "Should not be enuming methods!" mod_objects = get_clbr_for_file(self.path) my_objects = mod_objects[self.class_name] pidls = [] for func_name, lineno in my_objects.methods.items(): pidl = ["object\0" + self.path + "\0" + self.class_name + "." + func_name] pidls.append(pidl) return NewEnum(pidls, iid=shell.IID_IEnumIDList, useDispatcher=(debug>0)) def GetDisplayNameOf(self, pidl, flags): assert len(pidl)==1, "Expecting relative PIDL" typ, fname, obname = pidl[0].split('\0') class_name, method_name = obname.split(".") fqname = os.path.splitext(fname)[0] + "." + obname if flags & shellcon.SHGDN_INFOLDER: ret = method_name else: # SHGDN_NORMAL is the default ret = fqname # No need to look at the SHGDN_FOR* modifiers. return ret def GetAttributesOf(self, pidls, attrFlags): ret_flags = -1 for pidl in pidls: assert len(pidl)==1, "Expecting relative pidls" flags = shellcon.SFGAO_BROWSABLE | shellcon.SFGAO_FOLDER | \ shellcon.SFGAO_FILESYSANCESTOR ret_flags &= flags return ret_flags # The "Root" folder of our namespace. As all children are directories, # it is derived from ShellFolderFileSystem # This is the only COM object actually registered and externally created. class ShellFolderRoot(ShellFolderFileSystem): _reg_progid_ = "Python.ShellExtension.Folder" _reg_desc_ = "Python Path Shell Browser" _reg_clsid_ = "{f6287035-3074-4cb5-a8a6-d3c80e206944}" def GetClassID(self): return self._reg_clsid_ def Initialize(self, pidl): # This is the PIDL of us, as created by the shell. This is our # top-level ID. All other items under us have PIDLs defined # by us - see the notes at the top of the file. #print "Initialize called with pidl", repr(pidl) self.pidl = pidl def CreateViewObject(self, hwnd, iid): return wrap(FileSystemView(self, hwnd), iid, useDispatcher=debug>0) def EnumObjects(self, hwndOwner, flags): items = [ ["directory\0" + p] for p in sys.path if os.path.isdir(p)] return NewEnum(items, iid=shell.IID_IEnumIDList, useDispatcher=(debug>0)) def GetDisplayNameOf(self, pidl, flags): ## return full path for sys.path dirs, since they don't appear under a parent folder final_pidl=pidl[-1] display_name=final_pidl.split('\0')[-1] return display_name # Simple shell view implementations # Uses a builtin listview control to display simple lists of directories # or filenames. class FileSystemView: _public_methods_ = shellcon.IShellView_Methods _com_interfaces_ = [pythoncom.IID_IOleWindow, shell.IID_IShellView, ] def __init__(self, folder, hwnd): self.hwnd_parent = hwnd # provided by explorer. self.hwnd = None # intermediate window for catching command notifications. self.hwnd_child = None # our ListView self.activate_state = None self.hmenu = None self.browser = None self.folder = folder self.children = None # IOleWindow def GetWindow(self): return self.hwnd def ContextSensitiveHelp(self, enter_mode): raise COMException(hresult=winerror.E_NOTIMPL) # IShellView def CreateViewWindow(self, prev, settings, browser, rect): print("FileSystemView.CreateViewWindow", prev, settings, browser, rect) self.cur_foldersettings = settings self.browser = browser self._CreateMainWindow(prev, settings, browser, rect) self._CreateChildWindow(prev) # This isn't part of the sample, but the most convenient place to # test/demonstrate how you can get an IShellBrowser from a HWND # (but ONLY when you are in the same process as the IShellBrowser!) # Obviously it is not necessary here - we already have the browser! browser_ad = win32gui.SendMessage(self.hwnd_parent, win32con.WM_USER+7, 0, 0) browser_ob = pythoncom.ObjectFromAddress(browser_ad, shell.IID_IShellBrowser) assert browser==browser_ob # and make a call on the object to prove it doesn't die :) assert browser.QueryActiveShellView()==browser_ob.QueryActiveShellView() def _CreateMainWindow(self, prev, settings, browser, rect): # Creates a parent window that hosts the view window. This window # gets the control notifications etc sent from the child. style = win32con.WS_CHILD | win32con.WS_VISIBLE # wclass_name = "ShellViewDemo_DefView" # Register the Window class. wc = win32gui.WNDCLASS() wc.hInstance = win32gui.dllhandle wc.lpszClassName = wclass_name wc.style = win32con.CS_VREDRAW | win32con.CS_HREDRAW try: win32gui.RegisterClass(wc) except win32gui.error as details: # Should only happen when this module is reloaded if details[0] != winerror.ERROR_CLASS_ALREADY_EXISTS: raise message_map = { win32con.WM_DESTROY: self.OnDestroy, win32con.WM_COMMAND: self.OnCommand, win32con.WM_NOTIFY: self.OnNotify, win32con.WM_CONTEXTMENU: self.OnContextMenu, win32con.WM_SIZE: self.OnSize, } self.hwnd = win32gui.CreateWindow( wclass_name, "", style, \ rect[0], rect[1], rect[2]-rect[0], rect[3]-rect[1], self.hwnd_parent, 0, win32gui.dllhandle, None) win32gui.SetWindowLong(self.hwnd, win32con.GWL_WNDPROC, message_map) print("View 's hwnd is", self.hwnd) return self.hwnd def _CreateChildWindow(self, prev): # Creates the list view window. assert self.hwnd_child is None, "already have a window" assert self.cur_foldersettings is not None, "no settings" style = win32con.WS_CHILD | win32con.WS_VISIBLE | win32con.WS_BORDER | \ commctrl.LVS_SHAREIMAGELISTS | commctrl.LVS_EDITLABELS view_mode, view_flags = self.cur_foldersettings if view_mode==shellcon.FVM_ICON: style |= commctrl.LVS_ICON | commctrl.LVS_AUTOARRANGE elif view_mode==shellcon.FVM_SMALLICON: style |= commctrl.LVS_SMALLICON | commctrl.LVS_AUTOARRANGE elif view_mode==shellcon.FVM_LIST: style |= commctrl.LVS_LIST | commctrl.LVS_AUTOARRANGE elif view_mode==shellcon.FVM_DETAILS: style |= commctrl.LVS_REPORT | commctrl.LVS_AUTOARRANGE else: # XP 'thumbnails' etc view_mode = shellcon.FVM_DETAILS # Default to 'report' style |= commctrl.LVS_REPORT | commctrl.LVS_AUTOARRANGE for f_flag, l_flag in [ (shellcon.FWF_SINGLESEL, commctrl.LVS_SINGLESEL), (shellcon.FWF_ALIGNLEFT, commctrl.LVS_ALIGNLEFT), (shellcon.FWF_SHOWSELALWAYS, commctrl.LVS_SHOWSELALWAYS), ]: if view_flags & f_flag: style |= l_flag self.hwnd_child = win32gui.CreateWindowEx( win32con.WS_EX_CLIENTEDGE, "SysListView32", None, style, 0, 0, 0, 0, self.hwnd, 1000, 0, None) cr = win32gui.GetClientRect(self.hwnd) win32gui.MoveWindow(self.hwnd_child, 0, 0, cr[2]-cr[0], cr[3]-cr[1], True) # Setup the columns for the view. lvc, extras = win32gui_struct.PackLVCOLUMN(fmt=commctrl.LVCFMT_LEFT, subItem=1, text='Name', cx=300) win32gui.SendMessage(self.hwnd_child, commctrl.LVM_INSERTCOLUMN, 0, lvc) lvc, extras = win32gui_struct.PackLVCOLUMN(fmt=commctrl.LVCFMT_RIGHT, subItem=1, text='Exists', cx=50) win32gui.SendMessage(self.hwnd_child, commctrl.LVM_INSERTCOLUMN, 1, lvc) # and fill it with the content self.Refresh() def GetCurrentInfo(self): return self.cur_foldersettings def UIActivate(self, activate_state): print("OnActivate") def _OnActivate(self, activate_state): if self.activate_state == activate_state: return self._OnDeactivate() # restore menu's first, if necessary. if activate_state != shellcon.SVUIA_DEACTIVATE: assert self.hmenu is None, "Should have destroyed it!" self.hmenu = win32gui.CreateMenu() widths = 0,0,0,0,0,0 # Ask explorer to add its standard items. self.browser.InsertMenusSB(self.hmenu, widths) # Merge with these standard items self._MergeMenus(activate_state) self.browser.SetMenuSB(self.hmenu, 0, self.hwnd); self.activate_state = activate_state def _OnDeactivate(self): if self.browser is not None and self.hmenu is not None: self.browser.SetMenuSB(0, 0, 0) self.browser.RemoveMenusSB(self.hmenu) win32gui.DestroyMenu(self.hmenu) self.hmenu = None self.hsubmenus = None self.activate_state = shellcon.SVUIA_DEACTIVATE def _MergeMenus(self, activate_state): # Merge the operations we support into the top-level menus. # NOTE: This function it *not* called each time the selection changes. # SVUIA_ACTIVATE_FOCUS really means "have a selection?" have_sel = activate_state == shellcon.SVUIA_ACTIVATE_FOCUS # only do "file" menu here, and only 1 item on it! mid = shellcon.FCIDM_MENU_FILE # Get the hmenu for the menu buf, extras = win32gui_struct.EmptyMENUITEMINFO(win32con.MIIM_SUBMENU) win32gui.GetMenuItemInfo(self.hmenu, mid, False, buf) data = win32gui_struct.UnpackMENUITEMINFO(buf) submenu = data[3] print("Do someting with the file menu!") def Refresh(self): stateMask = commctrl.LVIS_SELECTED | commctrl.LVIS_DROPHILITED state = 0 self.children = [] # Enumerate and store the child PIDLs for cid in self.folder.EnumObjects(self.hwnd, 0): self.children.append(cid) for row_index, data in enumerate(self.children): assert len(data)==1, "expecting just a child PIDL" typ, path = data[0].split('\0') desc = os.path.exists(path) and "Yes" or "No" prop_vals = (path, desc) # first col data, extras = win32gui_struct.PackLVITEM( item=row_index, subItem=0, text=prop_vals[0], state=state, stateMask=stateMask) win32gui.SendMessage(self.hwnd_child, commctrl.LVM_INSERTITEM, row_index, data) # rest of the cols. col_index = 1 for prop_val in prop_vals[1:]: data, extras = win32gui_struct.PackLVITEM( item=row_index, subItem=col_index, text=prop_val) win32gui.SendMessage(self.hwnd_child, commctrl.LVM_SETITEM, 0, data) col_index += 1 def SelectItem(self, pidl, flag): # For the sake of brevity, we don't implement this yet. # You would need to locate the index of the item in the shell-view # with that PIDL, then ask the list-view to select it. print("Please implement SelectItem for PIDL", pidl) def GetItemObject(self, item_num, iid): raise COMException(hresult=winerror.E_NOTIMPL) def TranslateAccelerator(self, msg): return winerror.S_FALSE def DestroyViewWindow(self): win32gui.DestroyWindow(self.hwnd) self.hwnd = None print("Destroyed view window") # Message handlers. def OnDestroy(self, hwnd, msg, wparam, lparam): print("OnDestory") def OnCommand(self, hwnd, msg, wparam, lparam): print("OnCommand") def OnNotify(self, hwnd, msg, wparam, lparam): hwndFrom, idFrom, code = win32gui_struct.UnpackWMNOTIFY(lparam) #print "OnNotify code=0x%x (0x%x, 0x%x)" % (code, wparam, lparam) if code == commctrl.NM_SETFOCUS: # Control got focus - Explorer may not know - tell it if self.browser is not None: self.browser.OnViewWindowActive(None) # And do our menu thang self._OnActivate(shellcon.SVUIA_ACTIVATE_FOCUS) elif code == commctrl.NM_KILLFOCUS: self._OnDeactivate() elif code == commctrl.NM_DBLCLK: # This DblClick implementation leaves a little to be desired :) # It demonstrates some useful concepts, such as asking the # folder for its context-menu and invoking a command from it. # However, as our folder delegates IContextMenu to the shell # itself, the end result is that the folder is opened in # its "normal" place in Windows explorer rather than inside # our shell-extension. # Determine the selected items. sel = [] n = -1 while 1: n = win32gui.SendMessage(self.hwnd_child, commctrl.LVM_GETNEXTITEM, n, commctrl.LVNI_SELECTED) if n==-1: break sel.append(self.children[n][-1:]) print("Selection is", sel) hmenu = win32gui.CreateMenu() try: # Get the IContextMenu for the items. inout, cm = self.folder.GetUIObjectOf(self.hwnd_parent, sel, shell.IID_IContextMenu, 0) # As per 'Q179911', we need to determine if the default operation # should be 'open' or 'explore' flags = shellcon.CMF_DEFAULTONLY try: self.browser.GetControlWindow(shellcon.FCW_TREE) flags |= shellcon.CMF_EXPLORE except pythoncom.com_error: pass # *sob* - delegating to the shell does work - but lands us # in the original location. Q179911 also shows that # ShellExecuteEx should work - but I can't make it work as # described (XP: function call succeeds, but another thread # shows a dialog with text of E_INVALID_PARAM, and new # Explorer window opens with desktop view. Vista: function # call succeeds, but no window created at all. # On Vista, I'd love to get an IExplorerBrowser interface # from the shell, but a QI fails, and although the # IShellBrowser does appear to support IServiceProvider, I # still can't get it if 0: id_cmd_first = 1 # TrackPopupMenu makes it hard to use 0 cm.QueryContextMenu(hmenu, 0, id_cmd_first, -1, flags) # Find the default item in the returned menu. cmd = win32gui.GetMenuDefaultItem(hmenu, False, 0) if cmd == -1: print("Oops: _doDefaultActionFor found no default menu") else: ci = 0, self.hwnd_parent, cmd-id_cmd_first, None, None, 0, 0, 0 cm.InvokeCommand(ci) else: rv = shell.ShellExecuteEx( hwnd = self.hwnd_parent, nShow=win32con.SW_NORMAL, lpClass="folder", lpVerb="explore", lpIDList=sel[0]) print("ShellExecuteEx returned", rv) finally: win32gui.DestroyMenu(hmenu) def OnContextMenu(self, hwnd, msg, wparam, lparam): # Get the selected items. pidls = [] n = -1 while 1: n = win32gui.SendMessage(self.hwnd_child, commctrl.LVM_GETNEXTITEM, n, commctrl.LVNI_SELECTED) if n==-1: break pidls.append(self.children[n][-1:]) spt = win32api.GetCursorPos() if not pidls: print("Ignoring background click") return # Get the IContextMenu for the items. inout, cm = self.folder.GetUIObjectOf(self.hwnd_parent, pidls, shell.IID_IContextMenu, 0) hmenu = win32gui.CreatePopupMenu() sel = None # As per 'Q179911', we need to determine if the default operation # should be 'open' or 'explore' try: flags = 0 try: self.browser.GetControlWindow(shellcon.FCW_TREE) flags |= shellcon.CMF_EXPLORE except pythoncom.com_error: pass id_cmd_first = 1 # TrackPopupMenu makes it hard to use 0 cm.QueryContextMenu(hmenu, 0, id_cmd_first, -1, flags) tpm_flags = win32con.TPM_LEFTALIGN | win32con.TPM_RETURNCMD | \ win32con.TPM_RIGHTBUTTON sel = win32gui.TrackPopupMenu(hmenu, tpm_flags, spt[0], spt[1], 0, self.hwnd, None) print("TrackPopupMenu returned", sel) finally: win32gui.DestroyMenu(hmenu) if sel: ci = 0, self.hwnd_parent, sel-id_cmd_first, None, None, 0, 0, 0 cm.InvokeCommand(ci) def OnSize(self, hwnd, msg, wparam, lparam): #print "OnSize", self.hwnd_child, win32api.LOWORD(lparam), win32api.HIWORD(lparam) if self.hwnd_child is not None: x = win32api.LOWORD(lparam) y = win32api.HIWORD(lparam) win32gui.MoveWindow(self.hwnd_child, 0, 0, x, y, False) # This uses scintilla to display a filename, and optionally jump to a line # number. class ScintillaShellView: _public_methods_ = shellcon.IShellView_Methods _com_interfaces_ = [pythoncom.IID_IOleWindow, shell.IID_IShellView, ] def __init__(self, hwnd, filename, lineno = None): self.filename = filename self.lineno = lineno self.hwnd_parent = hwnd self.hwnd = None def _SendSci(self, msg, wparam=0, lparam=0): return win32gui.SendMessage(self.hwnd, msg, wparam, lparam) # IShellView def CreateViewWindow(self, prev, settings, browser, rect): print("ScintillaShellView.CreateViewWindow", prev, settings, browser, rect) # Make sure scintilla.dll is loaded. If not, find it on sys.path # (which it generally is for Pythonwin) try: win32api.GetModuleHandle("Scintilla.dll") except win32api.error: for p in sys.path: fname = os.path.join(p, "Scintilla.dll") if not os.path.isfile(fname): fname = os.path.join(p, "Build", "Scintilla.dll") if os.path.isfile(fname): win32api.LoadLibrary(fname) break else: raise RuntimeError("Can't find scintilla!") style = win32con.WS_CHILD | win32con.WS_VSCROLL | \ win32con.WS_HSCROLL | win32con.WS_CLIPCHILDREN | \ win32con.WS_VISIBLE self.hwnd = win32gui.CreateWindow("Scintilla", "Scintilla", style, rect[0], rect[1], rect[2]-rect[0], rect[3]-rect[1], self.hwnd_parent, 1000, 0, None) message_map = { win32con.WM_SIZE: self.OnSize, } # win32gui.SetWindowLong(self.hwnd, win32con.GWL_WNDPROC, message_map) file_data = file(self.filename, "U").read() self._SetupLexer() self._SendSci(scintillacon.SCI_ADDTEXT, len(file_data), file_data) if self.lineno != None: self._SendSci(scintillacon.SCI_GOTOLINE, self.lineno) print("Scintilla's hwnd is", self.hwnd) def _SetupLexer(self): h = self.hwnd styles = [ ((0, 0, 200, 0, 0x808080), None, scintillacon.SCE_P_DEFAULT ), ((0, 2, 200, 0, 0x008000), None, scintillacon.SCE_P_COMMENTLINE ), ((0, 2, 200, 0, 0x808080), None, scintillacon.SCE_P_COMMENTBLOCK ), ((0, 0, 200, 0, 0x808000), None, scintillacon.SCE_P_NUMBER ), ((0, 0, 200, 0, 0x008080), None, scintillacon.SCE_P_STRING ), ((0, 0, 200, 0, 0x008080), None, scintillacon.SCE_P_CHARACTER ), ((0, 0, 200, 0, 0x008080), None, scintillacon.SCE_P_TRIPLE ), ((0, 0, 200, 0, 0x008080), None, scintillacon.SCE_P_TRIPLEDOUBLE), ((0, 0, 200, 0, 0x000000), 0x008080, scintillacon.SCE_P_STRINGEOL), ((0, 1, 200, 0, 0x800000), None, scintillacon.SCE_P_WORD), ((0, 1, 200, 0, 0xFF0000), None, scintillacon.SCE_P_CLASSNAME ), ((0, 1, 200, 0, 0x808000), None, scintillacon.SCE_P_DEFNAME), ((0, 0, 200, 0, 0x000000), None, scintillacon.SCE_P_OPERATOR), ((0, 0, 200, 0, 0x000000), None, scintillacon.SCE_P_IDENTIFIER ), ] self._SendSci(scintillacon.SCI_SETLEXER, scintillacon.SCLEX_PYTHON, 0) self._SendSci(scintillacon.SCI_SETSTYLEBITS, 5) baseFormat = (-402653169, 0, 200, 0, 0, 0, 49, 'Courier New') for f, bg, stylenum in styles: self._SendSci(scintillacon.SCI_STYLESETFORE, stylenum, f[4]) self._SendSci(scintillacon.SCI_STYLESETFONT, stylenum, baseFormat[7]) if f[1] & 1: self._SendSci(scintillacon.SCI_STYLESETBOLD, stylenum, 1) else: self._SendSci(scintillacon.SCI_STYLESETBOLD, stylenum, 0) if f[1] & 2: self._SendSci(scintillacon.SCI_STYLESETITALIC, stylenum, 1) else: self._SendSci(scintillacon.SCI_STYLESETITALIC, stylenum, 0) self._SendSci(scintillacon.SCI_STYLESETSIZE, stylenum, int(baseFormat[2]/20)) if bg is not None: self._SendSci(scintillacon.SCI_STYLESETBACK, stylenum, bg) self._SendSci(scintillacon.SCI_STYLESETEOLFILLED, stylenum, 1) # Only needed for unclosed strings. # IOleWindow def GetWindow(self): return self.hwnd def UIActivate(self, activate_state): print("OnActivate") def DestroyViewWindow(self): win32gui.DestroyWindow(self.hwnd) self.hwnd = None print("Destroyed scintilla window") def TranslateAccelerator(self, msg): return winerror.S_FALSE def OnSize(self, hwnd, msg, wparam, lparam): x = win32api.LOWORD(lparam) y = win32api.HIWORD(lparam) win32gui.MoveWindow(self.hwnd, 0, 0, x, y, False) def DllRegisterServer(): import winreg key = winreg.CreateKey(winreg.HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\" \ "Explorer\\Desktop\\Namespace\\" + \ ShellFolderRoot._reg_clsid_) winreg.SetValueEx(key, None, 0, winreg.REG_SZ, ShellFolderRoot._reg_desc_) # And special shell keys under our CLSID key = winreg.CreateKey(winreg.HKEY_CLASSES_ROOT, "CLSID\\" + ShellFolderRoot._reg_clsid_ + "\\ShellFolder") # 'Attributes' is an int stored as a binary! use struct attr = shellcon.SFGAO_FOLDER | shellcon.SFGAO_HASSUBFOLDER | \ shellcon.SFGAO_BROWSABLE import struct s = struct.pack("i", attr) winreg.SetValueEx(key, "Attributes", 0, winreg.REG_BINARY, s) print(ShellFolderRoot._reg_desc_, "registration complete.") def DllUnregisterServer(): import winreg try: key = winreg.DeleteKey(winreg.HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\" \ "Explorer\\Desktop\\Namespace\\" + \ ShellFolderRoot._reg_clsid_) except WindowsError as details: import errno if details.errno != errno.ENOENT: raise print(ShellFolderRoot._reg_desc_, "unregistration complete.") if __name__=='__main__': from win32com.server import register register.UseCommandLine(ShellFolderRoot, debug = debug, finalize_register = DllRegisterServer, finalize_unregister = DllUnregisterServer) PK Y03K'r}},win32comext/shell/demos/browse_for_folder.pyUT  YZx`ux # A couple of samples using SHBrowseForFolder import sys, os from win32com.shell import shell, shellcon import win32gui # A callback procedure - called by SHBrowseForFolder def BrowseCallbackProc(hwnd, msg, lp, data): if msg== shellcon.BFFM_INITIALIZED: win32gui.SendMessage(hwnd, shellcon.BFFM_SETSELECTION, 1, data) elif msg == shellcon.BFFM_SELCHANGED: # Set the status text of the # For this message, 'lp' is the address of the PIDL. pidl = shell.AddressAsPIDL(lp) try: path = shell.SHGetPathFromIDList(pidl) win32gui.SendMessage(hwnd, shellcon.BFFM_SETSTATUSTEXT, 0, path) except shell.error: # No path for this PIDL pass if __name__=='__main__': # Demonstrate a dialog with the cwd selected as the default - this # must be done via a callback function. flags = shellcon.BIF_STATUSTEXT shell.SHBrowseForFolder(0, # parent HWND None, # root PIDL. "Default of %s" % os.getcwd(), # title flags, # flags BrowseCallbackProc, # callback function os.getcwd() # 'data' param for the callback ) # Browse from this directory down only. # Get the PIDL for the cwd. desktop = shell.SHGetDesktopFolder() cb, pidl, extra = desktop.ParseDisplayName(0, None, os.getcwd()) shell.SHBrowseForFolder(0, # parent HWND pidl, # root PIDL. "From %s down only" % os.getcwd(), # title ) PK ѳP;2$win32comext/shell/demos/viewstate.pyUT l_Zx`ux """ Demonstrates how to propagate a folder's view state to all its subfolders The format of the ColInfo stream is apparently undocumented, but it can be read raw from one folder and copied to another's view state. """ from win32com.shell import shell, shellcon import pythoncom import os, sys template_folder=os.path.split(sys.executable)[0] print('Template folder:', template_folder) template_pidl=shell.SHILCreateFromPath(template_folder,0)[0] template_pb=shell.SHGetViewStatePropertyBag(template_pidl, "Shell", shellcon.SHGVSPB_FOLDERNODEFAULTS, pythoncom.IID_IPropertyBag) # Column info has to be read as a stream # This may blow up if folder has never been opened in Explorer and has no ColInfo yet template_iunk=template_pb.Read('ColInfo',pythoncom.VT_UNKNOWN) template_stream=template_iunk.QueryInterface(pythoncom.IID_IStream) streamsize=template_stream.Stat()[2] template_colinfo=template_stream.Read(streamsize) def update_colinfo(not_used, dir_name, fnames): for fname in fnames: full_fname=os.path.join(dir_name,fname) if os.path.isdir(full_fname): print(full_fname) pidl=shell.SHILCreateFromPath(full_fname,0)[0] pb=shell.SHGetViewStatePropertyBag(pidl, "Shell", shellcon.SHGVSPB_FOLDERNODEFAULTS, pythoncom.IID_IPropertyBag) ## not all folders already have column info, and we're replacing it anyway pb.Write('ColInfo', template_stream) iunk=pb.Read('ColInfo',pythoncom.VT_UNKNOWN) s=iunk.QueryInterface(pythoncom.IID_IStream) s.Write(template_colinfo) s=None ## attribute names read from registry, can't find any way to enumerate IPropertyBag for attr in ('Address','Buttons','Col','Vid','WFlags','FFlags','Sort','SortDir','ShowCmd','FolderType','Mode','Rev'): pb.Write(attr, template_pb.Read(attr)) pb=None os.path.walk(template_folder,update_colinfo,None) PK {Rwin32comext/adsi/UT Zx`Zx`ux PK Y03K,00win32comext/adsi/adsicon.pyUT  YZx`ux ADS_ATTR_CLEAR = ( 1 ) ADS_ATTR_UPDATE = ( 2 ) ADS_ATTR_APPEND = ( 3 ) ADS_ATTR_DELETE = ( 4 ) ADS_EXT_MINEXTDISPID = ( 1 ) ADS_EXT_MAXEXTDISPID = ( 16777215 ) ADS_EXT_INITCREDENTIALS = ( 1 ) ADS_EXT_INITIALIZE_COMPLETE = ( 2 ) ADS_SEARCHPREF_ASYNCHRONOUS = 0 ADS_SEARCHPREF_DEREF_ALIASES = 1 ADS_SEARCHPREF_SIZE_LIMIT = 2 ADS_SEARCHPREF_TIME_LIMIT = 3 ADS_SEARCHPREF_ATTRIBTYPES_ONLY = 4 ADS_SEARCHPREF_SEARCH_SCOPE = 5 ADS_SEARCHPREF_TIMEOUT = 6 ADS_SEARCHPREF_PAGESIZE = 7 ADS_SEARCHPREF_PAGED_TIME_LIMIT = 8 ADS_SEARCHPREF_CHASE_REFERRALS = 9 ADS_SEARCHPREF_SORT_ON = 10 ADS_SEARCHPREF_CACHE_RESULTS = 11 ADS_SEARCHPREF_DIRSYNC = 12 ADS_SEARCHPREF_TOMBSTONE = 13 ADS_SCOPE_BASE = 0 ADS_SCOPE_ONELEVEL = 1 ADS_SCOPE_SUBTREE = 2 ADS_SECURE_AUTHENTICATION = 0x1 ADS_USE_ENCRYPTION = 0x2 ADS_USE_SSL = 0x2 ADS_READONLY_SERVER = 0x4 ADS_PROMPT_CREDENTIALS = 0x8 ADS_NO_AUTHENTICATION = 0x10 ADS_FAST_BIND = 0x20 ADS_USE_SIGNING = 0x40 ADS_USE_SEALING = 0x80 ADS_USE_DELEGATION = 0x100 ADS_SERVER_BIND = 0x200 ADSTYPE_INVALID = 0 ADSTYPE_DN_STRING = ADSTYPE_INVALID + 1 ADSTYPE_CASE_EXACT_STRING = ADSTYPE_DN_STRING + 1 ADSTYPE_CASE_IGNORE_STRING = ADSTYPE_CASE_EXACT_STRING + 1 ADSTYPE_PRINTABLE_STRING = ADSTYPE_CASE_IGNORE_STRING + 1 ADSTYPE_NUMERIC_STRING = ADSTYPE_PRINTABLE_STRING + 1 ADSTYPE_BOOLEAN = ADSTYPE_NUMERIC_STRING + 1 ADSTYPE_INTEGER = ADSTYPE_BOOLEAN + 1 ADSTYPE_OCTET_STRING = ADSTYPE_INTEGER + 1 ADSTYPE_UTC_TIME = ADSTYPE_OCTET_STRING + 1 ADSTYPE_LARGE_INTEGER = ADSTYPE_UTC_TIME + 1 ADSTYPE_PROV_SPECIFIC = ADSTYPE_LARGE_INTEGER + 1 ADSTYPE_OBJECT_CLASS = ADSTYPE_PROV_SPECIFIC + 1 ADSTYPE_CASEIGNORE_LIST = ADSTYPE_OBJECT_CLASS + 1 ADSTYPE_OCTET_LIST = ADSTYPE_CASEIGNORE_LIST + 1 ADSTYPE_PATH = ADSTYPE_OCTET_LIST + 1 ADSTYPE_POSTALADDRESS = ADSTYPE_PATH + 1 ADSTYPE_TIMESTAMP = ADSTYPE_POSTALADDRESS + 1 ADSTYPE_BACKLINK = ADSTYPE_TIMESTAMP + 1 ADSTYPE_TYPEDNAME = ADSTYPE_BACKLINK + 1 ADSTYPE_HOLD = ADSTYPE_TYPEDNAME + 1 ADSTYPE_NETADDRESS = ADSTYPE_HOLD + 1 ADSTYPE_REPLICAPOINTER = ADSTYPE_NETADDRESS + 1 ADSTYPE_FAXNUMBER = ADSTYPE_REPLICAPOINTER + 1 ADSTYPE_EMAIL = ADSTYPE_FAXNUMBER + 1 ADSTYPE_NT_SECURITY_DESCRIPTOR = ADSTYPE_EMAIL + 1 ADSTYPE_UNKNOWN = ADSTYPE_NT_SECURITY_DESCRIPTOR + 1 ADSTYPE_DN_WITH_BINARY = ADSTYPE_UNKNOWN + 1 ADSTYPE_DN_WITH_STRING = ADSTYPE_DN_WITH_BINARY + 1 ADS_PROPERTY_CLEAR = 1 ADS_PROPERTY_UPDATE = 2 ADS_PROPERTY_APPEND = 3 ADS_PROPERTY_DELETE = 4 ADS_SYSTEMFLAG_DISALLOW_DELETE = -2147483648 ADS_SYSTEMFLAG_CONFIG_ALLOW_RENAME = 0x40000000 ADS_SYSTEMFLAG_CONFIG_ALLOW_MOVE = 0x20000000 ADS_SYSTEMFLAG_CONFIG_ALLOW_LIMITED_MOVE = 0x10000000 ADS_SYSTEMFLAG_DOMAIN_DISALLOW_RENAME = -2147483648 ADS_SYSTEMFLAG_DOMAIN_DISALLOW_MOVE = 0x4000000 ADS_SYSTEMFLAG_CR_NTDS_NC = 0x1 ADS_SYSTEMFLAG_CR_NTDS_DOMAIN = 0x2 ADS_SYSTEMFLAG_ATTR_NOT_REPLICATED = 0x1 ADS_SYSTEMFLAG_ATTR_IS_CONSTRUCTED = 0x4 ADS_GROUP_TYPE_GLOBAL_GROUP = 0x2 ADS_GROUP_TYPE_DOMAIN_LOCAL_GROUP = 0x4 ADS_GROUP_TYPE_LOCAL_GROUP = 0x4 ADS_GROUP_TYPE_UNIVERSAL_GROUP = 0x8 ADS_GROUP_TYPE_SECURITY_ENABLED = -2147483648 ADS_UF_SCRIPT = 0x1 ADS_UF_ACCOUNTDISABLE = 0x2 ADS_UF_HOMEDIR_REQUIRED = 0x8 ADS_UF_LOCKOUT = 0x10 ADS_UF_PASSWD_NOTREQD = 0x20 ADS_UF_PASSWD_CANT_CHANGE = 0x40 ADS_UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED = 0x80 ADS_UF_TEMP_DUPLICATE_ACCOUNT = 0x100 ADS_UF_NORMAL_ACCOUNT = 0x200 ADS_UF_INTERDOMAIN_TRUST_ACCOUNT = 0x800 ADS_UF_WORKSTATION_TRUST_ACCOUNT = 0x1000 ADS_UF_SERVER_TRUST_ACCOUNT = 0x2000 ADS_UF_DONT_EXPIRE_PASSWD = 0x10000 ADS_UF_MNS_LOGON_ACCOUNT = 0x20000 ADS_UF_SMARTCARD_REQUIRED = 0x40000 ADS_UF_TRUSTED_FOR_DELEGATION = 0x80000 ADS_UF_NOT_DELEGATED = 0x100000 ADS_UF_USE_DES_KEY_ONLY = 0x200000 ADS_UF_DONT_REQUIRE_PREAUTH = 0x400000 ADS_UF_PASSWORD_EXPIRED = 0x800000 ADS_UF_TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION = 0x1000000 ADS_RIGHT_DELETE = 0x10000 ADS_RIGHT_READ_CONTROL = 0x20000 ADS_RIGHT_WRITE_DAC = 0x40000 ADS_RIGHT_WRITE_OWNER = 0x80000 ADS_RIGHT_SYNCHRONIZE = 0x100000 ADS_RIGHT_ACCESS_SYSTEM_SECURITY = 0x1000000 ADS_RIGHT_GENERIC_READ = -2147483648 ADS_RIGHT_GENERIC_WRITE = 0x40000000 ADS_RIGHT_GENERIC_EXECUTE = 0x20000000 ADS_RIGHT_GENERIC_ALL = 0x10000000 ADS_RIGHT_DS_CREATE_CHILD = 0x1 ADS_RIGHT_DS_DELETE_CHILD = 0x2 ADS_RIGHT_ACTRL_DS_LIST = 0x4 ADS_RIGHT_DS_SELF = 0x8 ADS_RIGHT_DS_READ_PROP = 0x10 ADS_RIGHT_DS_WRITE_PROP = 0x20 ADS_RIGHT_DS_DELETE_TREE = 0x40 ADS_RIGHT_DS_LIST_OBJECT = 0x80 ADS_RIGHT_DS_CONTROL_ACCESS = 0x100 ADS_ACETYPE_ACCESS_ALLOWED = 0 ADS_ACETYPE_ACCESS_DENIED = 0x1 ADS_ACETYPE_SYSTEM_AUDIT = 0x2 ADS_ACETYPE_ACCESS_ALLOWED_OBJECT = 0x5 ADS_ACETYPE_ACCESS_DENIED_OBJECT = 0x6 ADS_ACETYPE_SYSTEM_AUDIT_OBJECT = 0x7 ADS_ACETYPE_SYSTEM_ALARM_OBJECT = 0x8 ADS_ACETYPE_ACCESS_ALLOWED_CALLBACK = 0x9 ADS_ACETYPE_ACCESS_DENIED_CALLBACK = 0xa ADS_ACETYPE_ACCESS_ALLOWED_CALLBACK_OBJECT = 0xb ADS_ACETYPE_ACCESS_DENIED_CALLBACK_OBJECT = 0xc ADS_ACETYPE_SYSTEM_AUDIT_CALLBACK = 0xd ADS_ACETYPE_SYSTEM_ALARM_CALLBACK = 0xe ADS_ACETYPE_SYSTEM_AUDIT_CALLBACK_OBJECT = 0xf ADS_ACETYPE_SYSTEM_ALARM_CALLBACK_OBJECT = 0x10 ADS_ACEFLAG_INHERIT_ACE = 0x2 ADS_ACEFLAG_NO_PROPAGATE_INHERIT_ACE = 0x4 ADS_ACEFLAG_INHERIT_ONLY_ACE = 0x8 ADS_ACEFLAG_INHERITED_ACE = 0x10 ADS_ACEFLAG_VALID_INHERIT_FLAGS = 0x1f ADS_ACEFLAG_SUCCESSFUL_ACCESS = 0x40 ADS_ACEFLAG_FAILED_ACCESS = 0x80 ADS_FLAG_OBJECT_TYPE_PRESENT = 0x1 ADS_FLAG_INHERITED_OBJECT_TYPE_PRESENT = 0x2 ADS_SD_CONTROL_SE_OWNER_DEFAULTED = 0x1 ADS_SD_CONTROL_SE_GROUP_DEFAULTED = 0x2 ADS_SD_CONTROL_SE_DACL_PRESENT = 0x4 ADS_SD_CONTROL_SE_DACL_DEFAULTED = 0x8 ADS_SD_CONTROL_SE_SACL_PRESENT = 0x10 ADS_SD_CONTROL_SE_SACL_DEFAULTED = 0x20 ADS_SD_CONTROL_SE_DACL_AUTO_INHERIT_REQ = 0x100 ADS_SD_CONTROL_SE_SACL_AUTO_INHERIT_REQ = 0x200 ADS_SD_CONTROL_SE_DACL_AUTO_INHERITED = 0x400 ADS_SD_CONTROL_SE_SACL_AUTO_INHERITED = 0x800 ADS_SD_CONTROL_SE_DACL_PROTECTED = 0x1000 ADS_SD_CONTROL_SE_SACL_PROTECTED = 0x2000 ADS_SD_CONTROL_SE_SELF_RELATIVE = 0x8000 ADS_SD_REVISION_DS = 4 ADS_NAME_TYPE_1779 = 1 ADS_NAME_TYPE_CANONICAL = 2 ADS_NAME_TYPE_NT4 = 3 ADS_NAME_TYPE_DISPLAY = 4 ADS_NAME_TYPE_DOMAIN_SIMPLE = 5 ADS_NAME_TYPE_ENTERPRISE_SIMPLE = 6 ADS_NAME_TYPE_GUID = 7 ADS_NAME_TYPE_UNKNOWN = 8 ADS_NAME_TYPE_USER_PRINCIPAL_NAME = 9 ADS_NAME_TYPE_CANONICAL_EX = 10 ADS_NAME_TYPE_SERVICE_PRINCIPAL_NAME = 11 ADS_NAME_TYPE_SID_OR_SID_HISTORY_NAME = 12 ADS_NAME_INITTYPE_DOMAIN = 1 ADS_NAME_INITTYPE_SERVER = 2 ADS_NAME_INITTYPE_GC = 3 ADS_OPTION_SERVERNAME = 0 ADS_OPTION_REFERRALS = ADS_OPTION_SERVERNAME + 1 ADS_OPTION_PAGE_SIZE = ADS_OPTION_REFERRALS + 1 ADS_OPTION_SECURITY_MASK = ADS_OPTION_PAGE_SIZE + 1 ADS_OPTION_MUTUAL_AUTH_STATUS = ADS_OPTION_SECURITY_MASK + 1 ADS_OPTION_QUOTA = ADS_OPTION_MUTUAL_AUTH_STATUS + 1 ADS_OPTION_PASSWORD_PORTNUMBER = ADS_OPTION_QUOTA + 1 ADS_OPTION_PASSWORD_METHOD = ADS_OPTION_PASSWORD_PORTNUMBER + 1 ADS_SECURITY_INFO_OWNER = 0x1 ADS_SECURITY_INFO_GROUP = 0x2 ADS_SECURITY_INFO_DACL = 0x4 ADS_SECURITY_INFO_SACL = 0x8 ADS_SETTYPE_FULL = 1 ADS_SETTYPE_PROVIDER = 2 ADS_SETTYPE_SERVER = 3 ADS_SETTYPE_DN = 4 ADS_FORMAT_WINDOWS = 1 ADS_FORMAT_WINDOWS_NO_SERVER = 2 ADS_FORMAT_WINDOWS_DN = 3 ADS_FORMAT_WINDOWS_PARENT = 4 ADS_FORMAT_X500 = 5 ADS_FORMAT_X500_NO_SERVER = 6 ADS_FORMAT_X500_DN = 7 ADS_FORMAT_X500_PARENT = 8 ADS_FORMAT_SERVER = 9 ADS_FORMAT_PROVIDER = 10 ADS_FORMAT_LEAF = 11 ADS_DISPLAY_FULL = 1 ADS_DISPLAY_VALUE_ONLY = 2 ADS_ESCAPEDMODE_DEFAULT = 1 ADS_ESCAPEDMODE_ON = 2 ADS_ESCAPEDMODE_OFF = 3 ADS_ESCAPEDMODE_OFF_EX = 4 ADS_PATH_FILE = 1 ADS_PATH_FILESHARE = 2 ADS_PATH_REGISTRY = 3 ADS_SD_FORMAT_IID = 1 ADS_SD_FORMAT_RAW = 2 ADS_SD_FORMAT_HEXSTRING = 3 # Generated by h2py from AdsErr.h def _HRESULT_TYPEDEF_(_sc): return _sc E_ADS_BAD_PATHNAME = _HRESULT_TYPEDEF_((-2147463168)) E_ADS_INVALID_DOMAIN_OBJECT = _HRESULT_TYPEDEF_((-2147463167)) E_ADS_INVALID_USER_OBJECT = _HRESULT_TYPEDEF_((-2147463166)) E_ADS_INVALID_COMPUTER_OBJECT = _HRESULT_TYPEDEF_((-2147463165)) E_ADS_UNKNOWN_OBJECT = _HRESULT_TYPEDEF_((-2147463164)) E_ADS_PROPERTY_NOT_SET = _HRESULT_TYPEDEF_((-2147463163)) E_ADS_PROPERTY_NOT_SUPPORTED = _HRESULT_TYPEDEF_((-2147463162)) E_ADS_PROPERTY_INVALID = _HRESULT_TYPEDEF_((-2147463161)) E_ADS_BAD_PARAMETER = _HRESULT_TYPEDEF_((-2147463160)) E_ADS_OBJECT_UNBOUND = _HRESULT_TYPEDEF_((-2147463159)) E_ADS_PROPERTY_NOT_MODIFIED = _HRESULT_TYPEDEF_((-2147463158)) E_ADS_PROPERTY_MODIFIED = _HRESULT_TYPEDEF_((-2147463157)) E_ADS_CANT_CONVERT_DATATYPE = _HRESULT_TYPEDEF_((-2147463156)) E_ADS_PROPERTY_NOT_FOUND = _HRESULT_TYPEDEF_((-2147463155)) E_ADS_OBJECT_EXISTS = _HRESULT_TYPEDEF_((-2147463154)) E_ADS_SCHEMA_VIOLATION = _HRESULT_TYPEDEF_((-2147463153)) E_ADS_COLUMN_NOT_SET = _HRESULT_TYPEDEF_((-2147463152)) S_ADS_ERRORSOCCURRED = _HRESULT_TYPEDEF_(0x00005011) S_ADS_NOMORE_ROWS = _HRESULT_TYPEDEF_(0x00005012) S_ADS_NOMORE_COLUMNS = _HRESULT_TYPEDEF_(0x00005013) E_ADS_INVALID_FILTER = _HRESULT_TYPEDEF_((-2147463148)) # ADS_DEREFENUM enum ADS_DEREF_NEVER = 0 ADS_DEREF_SEARCHING = 1 ADS_DEREF_FINDING = 2 ADS_DEREF_ALWAYS = 3 # ADS_PREFERENCES_ENUM ADSIPROP_ASYNCHRONOUS = 0 ADSIPROP_DEREF_ALIASES = 0x1 ADSIPROP_SIZE_LIMIT = 0x2 ADSIPROP_TIME_LIMIT = 0x3 ADSIPROP_ATTRIBTYPES_ONLY = 0x4 ADSIPROP_SEARCH_SCOPE = 0x5 ADSIPROP_TIMEOUT = 0x6 ADSIPROP_PAGESIZE = 0x7 ADSIPROP_PAGED_TIME_LIMIT = 0x8 ADSIPROP_CHASE_REFERRALS = 0x9 ADSIPROP_SORT_ON = 0xa ADSIPROP_CACHE_RESULTS = 0xb ADSIPROP_ADSIFLAG = 0xc # ADSI_DIALECT_ENUM ADSI_DIALECT_LDAP = 0 ADSI_DIALECT_SQL = 0x1 # ADS_CHASE_REFERRALS_ENUM ADS_CHASE_REFERRALS_NEVER = 0 ADS_CHASE_REFERRALS_SUBORDINATE = 0x20 ADS_CHASE_REFERRALS_EXTERNAL = 0x40 ADS_CHASE_REFERRALS_ALWAYS = ADS_CHASE_REFERRALS_SUBORDINATE | ADS_CHASE_REFERRALS_EXTERNAL # Generated by h2py from ObjSel.h DSOP_SCOPE_TYPE_TARGET_COMPUTER = 0x00000001 DSOP_SCOPE_TYPE_UPLEVEL_JOINED_DOMAIN = 0x00000002 DSOP_SCOPE_TYPE_DOWNLEVEL_JOINED_DOMAIN = 0x00000004 DSOP_SCOPE_TYPE_ENTERPRISE_DOMAIN = 0x00000008 DSOP_SCOPE_TYPE_GLOBAL_CATALOG = 0x00000010 DSOP_SCOPE_TYPE_EXTERNAL_UPLEVEL_DOMAIN = 0x00000020 DSOP_SCOPE_TYPE_EXTERNAL_DOWNLEVEL_DOMAIN = 0x00000040 DSOP_SCOPE_TYPE_WORKGROUP = 0x00000080 DSOP_SCOPE_TYPE_USER_ENTERED_UPLEVEL_SCOPE = 0x00000100 DSOP_SCOPE_TYPE_USER_ENTERED_DOWNLEVEL_SCOPE = 0x00000200 DSOP_SCOPE_FLAG_STARTING_SCOPE = 0x00000001 DSOP_SCOPE_FLAG_WANT_PROVIDER_WINNT = 0x00000002 DSOP_SCOPE_FLAG_WANT_PROVIDER_LDAP = 0x00000004 DSOP_SCOPE_FLAG_WANT_PROVIDER_GC = 0x00000008 DSOP_SCOPE_FLAG_WANT_SID_PATH = 0x00000010 DSOP_SCOPE_FLAG_WANT_DOWNLEVEL_BUILTIN_PATH = 0x00000020 DSOP_SCOPE_FLAG_DEFAULT_FILTER_USERS = 0x00000040 DSOP_SCOPE_FLAG_DEFAULT_FILTER_GROUPS = 0x00000080 DSOP_SCOPE_FLAG_DEFAULT_FILTER_COMPUTERS = 0x00000100 DSOP_SCOPE_FLAG_DEFAULT_FILTER_CONTACTS = 0x00000200 DSOP_FILTER_INCLUDE_ADVANCED_VIEW = 0x00000001 DSOP_FILTER_USERS = 0x00000002 DSOP_FILTER_BUILTIN_GROUPS = 0x00000004 DSOP_FILTER_WELL_KNOWN_PRINCIPALS = 0x00000008 DSOP_FILTER_UNIVERSAL_GROUPS_DL = 0x00000010 DSOP_FILTER_UNIVERSAL_GROUPS_SE = 0x00000020 DSOP_FILTER_GLOBAL_GROUPS_DL = 0x00000040 DSOP_FILTER_GLOBAL_GROUPS_SE = 0x00000080 DSOP_FILTER_DOMAIN_LOCAL_GROUPS_DL = 0x00000100 DSOP_FILTER_DOMAIN_LOCAL_GROUPS_SE = 0x00000200 DSOP_FILTER_CONTACTS = 0x00000400 DSOP_FILTER_COMPUTERS = 0x00000800 DSOP_DOWNLEVEL_FILTER_USERS = (-2147483647) DSOP_DOWNLEVEL_FILTER_LOCAL_GROUPS = (-2147483646) DSOP_DOWNLEVEL_FILTER_GLOBAL_GROUPS = (-2147483644) DSOP_DOWNLEVEL_FILTER_COMPUTERS = (-2147483640) DSOP_DOWNLEVEL_FILTER_WORLD = (-2147483632) DSOP_DOWNLEVEL_FILTER_AUTHENTICATED_USER = (-2147483616) DSOP_DOWNLEVEL_FILTER_ANONYMOUS = (-2147483584) DSOP_DOWNLEVEL_FILTER_BATCH = (-2147483520) DSOP_DOWNLEVEL_FILTER_CREATOR_OWNER = (-2147483392) DSOP_DOWNLEVEL_FILTER_CREATOR_GROUP = (-2147483136) DSOP_DOWNLEVEL_FILTER_DIALUP = (-2147482624) DSOP_DOWNLEVEL_FILTER_INTERACTIVE = (-2147481600) DSOP_DOWNLEVEL_FILTER_NETWORK = (-2147479552) DSOP_DOWNLEVEL_FILTER_SERVICE = (-2147475456) DSOP_DOWNLEVEL_FILTER_SYSTEM = (-2147467264) DSOP_DOWNLEVEL_FILTER_EXCLUDE_BUILTIN_GROUPS = (-2147450880) DSOP_DOWNLEVEL_FILTER_TERMINAL_SERVER = (-2147418112) DSOP_DOWNLEVEL_FILTER_ALL_WELLKNOWN_SIDS = (-2147352576) DSOP_DOWNLEVEL_FILTER_LOCAL_SERVICE = (-2147221504) DSOP_DOWNLEVEL_FILTER_NETWORK_SERVICE = (-2146959360) DSOP_DOWNLEVEL_FILTER_REMOTE_LOGON = (-2146435072) DSOP_FLAG_MULTISELECT = 0x00000001 DSOP_FLAG_SKIP_TARGET_COMPUTER_DC_CHECK = 0x00000002 CFSTR_DSOP_DS_SELECTION_LIST = "CFSTR_DSOP_DS_SELECTION_LIST" PK x9Ps&۝ win32comext/adsi/__init__.pyUT 44^Zx`ux import win32com import win32com.client if type(__path__)==type(''): # For freeze to work! import sys try: import adsi sys.modules['win32com.adsi.adsi'] = adsi except ImportError: pass else: # See if we have a special directory for the binaries (for developers) win32com.__PackageSupportBuildPath__(__path__) # Some helpers # We want to _look_ like the ADSI module, but provide some additional # helpers. # Of specific note - most of the interfaces supported by ADSI # derive from IDispatch - thus, you get the custome methods from the # interface, as well as via IDispatch. import pythoncom from .adsi import * LCID = 0 IDispatchType = pythoncom.TypeIIDs[pythoncom.IID_IDispatch] IADsContainerType = pythoncom.TypeIIDs[adsi.IID_IADsContainer] def _get_good_ret(ob, # Named arguments used internally resultCLSID = None): assert resultCLSID is None, "Now have type info for ADSI objects - fix me!" # See if the object supports IDispatch if hasattr(ob, "Invoke"): import win32com.client.dynamic name = "Dispatch wrapper around %r" % ob return win32com.client.dynamic.Dispatch(ob, name, ADSIDispatch) return ob class ADSIEnumerator: def __init__(self, ob): # Query the object for the container interface. self._cont_ = ob.QueryInterface(IID_IADsContainer) self._oleobj_ = ADsBuildEnumerator(self._cont_) # a PyIADsEnumVARIANT self.index = -1 def __getitem__(self, index): return self.__GetIndex(index) def __call__(self, index): return self.__GetIndex(index) def __GetIndex(self, index): if type(index)!=type(0): raise TypeError("Only integer indexes are supported for enumerators") if index != self.index + 1: # Index requested out of sequence. raise ValueError("You must index this object sequentially") self.index = index result = ADsEnumerateNext(self._oleobj_, 1) if len(result): return _get_good_ret(result[0]) # Failed - reset for next time around. self.index = -1 self._oleobj_ = ADsBuildEnumerator(self._cont_) # a PyIADsEnumVARIANT raise IndexError("list index out of range") class ADSIDispatch(win32com.client.CDispatch): def _wrap_dispatch_(self, ob, userName = None, returnCLSID = None, UnicodeToString=None): assert UnicodeToString is None, "this is deprectated and will be removed" if not userName: userName = "ADSI-object" olerepr = win32com.client.dynamic.MakeOleRepr(ob, None, None) return ADSIDispatch(ob, olerepr, userName) def _NewEnum(self): try: return ADSIEnumerator(self) except pythoncom.com_error: # doesnt support it - let our base try! return win32com.client.CDispatch._NewEnum(self) def __getattr__(self, attr): try: return getattr(self._oleobj_, attr) except AttributeError: return win32com.client.CDispatch.__getattr__(self, attr) def QueryInterface(self, iid): ret = self._oleobj_.QueryInterface(iid) return _get_good_ret(ret) # We override the global methods to do the right thing. _ADsGetObject = ADsGetObject # The one in the .pyd def ADsGetObject(path, iid = pythoncom.IID_IDispatch): ret = _ADsGetObject(path, iid) return _get_good_ret(ret) _ADsOpenObject = ADsOpenObject def ADsOpenObject(path, username, password, reserved = 0, iid = pythoncom.IID_IDispatch): ret = _ADsOpenObject(path, username, password, reserved, iid) return _get_good_ret(ret) PK F$nQXO$$win32comext/adsi/adsi.pydUT D^_ux MZ@ !L!This program cannot be run in DOS mode. $'ocCcCcCjCkCXBaCXBbCXBrCXBhCɡBgCwBaCBgCBjCcCCɡBiCɡBbCɡBbCRichcCPELD^_! A@0HxPD`(Th@P.text+ `.rdatawx@@.datap @.gfidsL@ @@.rsrcDP@@.reloc(`@BAhjh!B!B} ̡hAh!BAjh!B!B]} ̡hAj08%BAjh%B<%B0} h=Ah%Bj5A ,BhAAhAnYhPDAh0&Bj5A,BhAAhЏAXnYhEAh&Bj5A-BhtAAhA(nYh^Ah&Bjh ,BhдA.BAhAmYhcAhp(Bj5A/BhȹAAhAmYhkAh(Bj5AX0Bh̻AAhAmYhoAhp)Bj5A01Bh$AAh AhmYVt$t[FW=At uP׃F t uP׃Ft uP׃Ft uP׃jV%i_^UdjhAPd%Vut]FEtP@AFFtu PAFtu PAj$VhMd ^]Vt$ VAu^úTAS:utY:Zuu3Ƀ[uSWj At<5Ah`A֋O hlA֋O hxAA֋O hAA֋O A _^ùA:utP:Quu3uD$^HɡA̋T$Pt3P;t PA@uD$3f3t$ 4LAt$A ́<V$DPhD$,jPGqh$@jP3qD$$0hPhD$4PD$P\D$Df|$(D$uhD$,PV L$(QfDffu+DL&L$(;v"D t u3fL$(;wf|$(tPD$W5\AD$D$$$0PD$ ։D$ D$(P։D$D$jPt$ A ^<Ë%=h$4jPph$HjPpD$$8hPh$<PD$Pb[D$Df$0D$t15\AWD$D$$$8PD$ ։D$ $0+$L$LVA ^<Vt$ WH wiA$AjjFPt$DA_^t$ $AF_^ÍFPt$(A_^ÍFPt$4A_^áHAhtA0A3_^faA{AAAASVt$ F@T>AVӃ)VӃW~ VӃ~VNtO; ^UjhAdPd%QVj=uEt)uԡAAF ,B^Md ]ËM3^d ]̋D$̋D$ uPAY̋D$tu D$%A%ءÃSVWt$$ءAu 3_^[ÍD$ Ph$At$0 A t܍D$PhAD$Pt$ܡAtlAD$̋WR0VpAD$PdAyhAWS _^[áYUEVH<AQAk(;tM ;J r BB ;r (;u3^]ËUEu2]ùMZf9uH<ȁ9PEu f9A]d u2dV 2BP;t3u2^ð^ t PnYt2gjYu2u~toUW u} uuMPu4 UuuYY]' t h2BY(jYU}u(2BIu2]u jY]U Vutu|t*u&h2BjYt2Wh2BWYDT*BuW2Bj Y+ȃ3T*BEEE2BEEuE_^]j9jh B+ eMZf9Au]<AAPEuL f9Au>EA+PQgYYt'x$|!EE3Ɂ8ËeE2 Ut}u 3 2B]U=(2Bt} uu{usYY]UT*B32Buȃu h2BYY#E]UT*B32Bȃu]uh2BYY]UuYH]AUEVAt j VYY^]U]UE t3t tt3@0uuY}PY] jh@BPjBYu34E]e=2Btj2Bite h؉A1 $xA> $AhA YYu)t hAhTA YY2B2ۈ]EDL >tVGYtu ju6S,2B3@Ê]uYj h`B>,2B3OH,2B"Ee=2Btj%2BEju]YY3Ʉ#u"Yj hB} u9=,2B3et t]1]SWuuSWuuSWuwuu"uSPu_SVuSVu`tuHSWuout5SWu:$MQ0hAuu uËe3uEUV5Au3@uu u^] U]U} uuu u ] UaaEAA]UVuXA^]aaAAAUVu%A^]aaAAAUVFA `PEPM YY^]UEAaaA]AAP YÍAAP YÍAAP YUVFAP EYt j V}YY^]UVFAP EYt j VPYY^]UVFAP EYt j V#YY^]U MhBEP] U MhBEP@ ̋AuAK U%02B(S3C H*Bj me3 H*B3VW02B}S[wOW E؋MEineIE5ntel ȋEj5Genu XjYS[wOW uCE%?=t#=`t=pt=Pt=`t=pu=42B=42B=42B}EEEEE|2jX3S[]؉sKS EܩEEt =42B_^tm H*B02BtUtN3ЉEUEM3Ƀu3u/H*B02BE H*Bt 02BH*B3[]3@39X*BU$SVjtM)3hVP582B< |xffftfpflfhEEDž@jPEVPE E@EE AVXۍEEۉE(AEP$Au !82B^[]UDjDEjPC EP,AEtEj X]3j0Aȅu2øMZf9uA<8PEu f9HuۃxtvՃh҇A(AUE8csmu%xu@= t=!t="t =@t3]̃%82B%PAhAd5D$l$l$+SVWT*B1E3PeuEEEEdËMd Y__^[]QUuuu uhAhT*B]UeeT*BVWN@;t t УP*BfEP@AE3EEYøH2B!HHHHøl5BSVBB;sW>t P׃;r_^[SVBB;sW>t %׃;r_^[Ë PA3A; T*Bu(Uj(Au$Ah LAPPA]U$jtjY)P3B L3BH3BD3B5@3B=<3Bfh3Bf \3Bf83Bf43Bf%03Bf-,3B`3BET3BEX3BEd3B2BX3B\2BP2B T2B`2BjXkǀd2BjXk T*BLjX P*BLhA]Uj]UjtM)P3B L3BH3BD3B5@3B=<3Bfh3Bf \3Bf83Bf43Bf%03Bf-,3B`3BET3BEX3BEd3BX3B\2BP2B T2B`2BjXkMd2BhA]U jtM)P3B L3BH3BD3B5@3B=<3Bfh3Bf \3Bf83Bf43Bf%03Bf-,3B`3BET3BEX3BEd3BX3B\2BP2B T2B} v }ue } vE HE E @`2BjXkMd2BeE@EE;E sEMU h2BhA]%TA% A%$A%(A%,A%0A%4A%8A%D:2(6Pb|(Hft.  0 D T h z         2 D R j ~         V pR(b8T6v2d(   \ 6   p *    f B A AAPAAAAA@ApAAcom/win32comext/adsi/src/PyADSIUtil.cppcom/win32comext/adsi/src/PyADSIUtil.cppSecurity-descriptor size mis-matchUnknown ADS type code 0x%x - None will be returnedOicom/win32comext/adsi/src/PyADSIUtil.cppCant convert to this typeADSVALUE must be a tuple of (value, type) (but type may be None or omitted)No type given, and can't deduce it!The type specified must be None or a stringnames must be a sequence of stringsc:\src\python-3.8\include\object.hcom/win32comext/adsi/src/PyADSIUtil.cppPyADS_OBJECT_INFORDNObjectDNParentDNClassNamePyADS_ATTR_INFOAttrNameControlCodeADsTypecom/win32comext/adsi/src/PyADSIUtil.cppOllO:ADS_ATTR_INFO tuple4th item in an ATTR_INFO structure must be a sequence (got %s)com/win32comext/adsi/src/PyADSIUtil.cppADS_ATTR_INFOs must be a sequenceADS_SEARCHPREF_INFOs must be a sequenceiO:ADS_SEARCHPREF_INFO tuplecom/win32comext/adsi/src/PyADSIUtil.cppPAPAP@APtAPAPܧAP APHAPxA PA P̨A PA P4A PlAPAPȩAPAP$APAE_ADS_BAD_PATHNAMEE_ADS_INVALID_DOMAIN_OBJECTE_ADS_INVALID_USER_OBJECTE_ADS_INVALID_COMPUTER_OBJECTE_ADS_UNKNOWN_OBJECTE_ADS_PROPERTY_NOT_SETE_ADS_PROPERTY_NOT_SUPPORTEDE_ADS_PROPERTY_INVALIDE_ADS_BAD_PARAMETERE_ADS_OBJECT_UNBOUNDE_ADS_PROPERTY_NOT_MODIFIEDE_ADS_PROPERTY_MODIFIEDE_ADS_CANT_CONVERT_DATATYPEE_ADS_PROPERTY_NOT_FOUNDE_ADS_OBJECT_EXISTSE_ADS_SCHEMA_VIOLATIONE_ADS_COLUMN_NOT_SETE_ADS_INVALID_FILTER0__members__AttrNameControlCodeADsTypeValues{;ON z;OAZDGHޏs#:PyStringAsDS_SELECTION_LISTString must be at least %d bytes (got %d)com/win32comext/adsi/src/PyDSOPObjects.cppNNNNNlcom/win32comext/adsi/src/PyDSOPObjects.cppIndex specified larger than number of allocated buffersPyDSOP_SCOPE_INIT_INFOsc:\src\python-3.8\include\object.hiExpected DSOP_SCOPE_INIT_INFOs (got %s)PyDSOP_SCOPE_INIT_INFOcom/win32comext/adsi/src/PyDSOPObjects.cpptypescopehrdcNamefilterFlagstypescopescopedcNamefilterFlagsPyDSOP_FILTER_FLAGSfilterFlags attribute can not be set (try setting attributes on the object itself)com/win32comext/adsi/src/PyDSOPObjects.cppupleveldownleveldownlevelupleveluplevel attribute can not be set (try setting attributes on the object itself)PyDSOP_UPLEVEL_FILTER_FLAGScom/win32comext/adsi/src/PyDSOPObjects.cppbothModesmixedModeOnlynativeModeOnlybothModesmixedModeOnlynativeModeOnly:GetInfo:SetInfoO:GetOO:PutGetInfoSetInfoGetPutgetputAdsPathADsPathClassc:\src\python-3.8\include\object.hGUIDNameParentSchemaPyIADsAzAzAzAzAzAzA]K4QeHw`uS֫EOIi@"\Dw=`Q&kI|]8@IOd `uS:."\Dw=:s *Dw=(1PB +d7c*K.HFz51с?7E ~{ /KUJQDu7"\Dw="\Dw=:s *Dw=)ˁg O"\Dw=WH34Oэ:s *Dw="\Dw="\Dw=ӔJ+46kc'A`uS:s *Dw= Кy|4O"\Dw=H"{̳yMt,|'O CI|ԌE1kIZ-qZ~C* x2ʟe[M*F:s *Dw=!$} H C`"\Dw="\Dw=emlѯz6/~c˻@,ǹFj:#`LsE&E~1 4OmY3@("\Dw=ua;NMҜ0 q |HO9B-ۂg@ܟ\Fc@OP1"\Dw==#L\2AD(OKdI`N]Ko\E:s *Dw= "\Dw=1hsN*"\Dw=ϕONfP)8bQ2!_KGRJXNЉ2X֎:s *Dw=r%6OP\/ #H:_FXגK$ZQHp]x<'N70q)GA]KwS_B:s *Dw=:s *Dw=|HO9BMs ײK`U~>@OPܜ:s *Dw=e0K8PN @-LߑNö$`EUw?Ԯ nOPGOPgѐp9A M [4J,nWGOP"\Dw=<( O)Z]$+^H=G 7F\1 W@}K+3&n0[OPܒL;DB{3{]1kIﳙ/uFw0#T:s *Dw= G 7F\1 7>`uS@cyPDNyaN[:s *Dw=V!NZ o@OPA) NJт^ FI I%]6G{[:s *Dw= "\Dw="\Dw="\Dw=2́3xD7ppw@LOը"\Dw=ݜOx !nOPܶ:s *Dw= R+M\}I44Sż"\Dw=AqI!Mt3]X+ |HO9B〔J 1c]җc`uS"\Dw=s5f O ]"\Dw=FTLFYѶ,;P0ͪЋOy4:s *Dw=>7OIq@OPO'&6OP"\Dw=FM5@B "\Dw="\Dw=8ܻcDUї2|E:s *Dw=8gBJj@iun/"\Dw=R^ݛ,O8r3 FA`O7Ip"\Dw=-͡O""\Dw=P^F:GX}vI`uS:s *Dw=#1&Ibx'&CfONZ2li"\Dw=#"\Dw=la^iEE-݉oÈ)pJ,$3ڸΩFDiF#!\Dw=o0$ D;Q4. 74OѢ^OPieR!LAn:s *Dw=g2kIbh!i@Ht<0`.QSM%)fTFXF[OvM]OXypʁ:s *Dw=":s *Dw= i(O,ޘ"OnQXfHtö.1XīE+Dk=JsJVܶMD]:s *Dw="\Dw=AZL˴h'/hΤN7]?u༧Ea%O8HQN̄0Ll=+AƵ] )M|HO9B:s *Dw=%"\Dw=:s *Dw=&h6M8hc-"\Dw=P^F:GX}ʢv]/@3!XI-X)[ѯz61\Q4=FQF FPFXשFh FFFFF)FHF&F%F&F"F3Fk!Pi)?@FF:/ۆ/O0Fv nr Z'B>Mm8gh j;Yi+-z4j;Yi+-zFU 8r+C+n4FF=FacH&8Fvޮ xOF!F y.YDFF1F:/ۆ/OFCj?e~ҦFސy(_%FEFF2F:/ۆ/O4yOʙ^AiMm8gh +F FIF`k;Yi+-z4<OFFi;Yi+-z:/ۆ/OFF:/ۆ/OiM^eQI+Idʏ[FF4FGF F@FF F0:s *Dw=FFF0:s*Dw=z0Gd<O8m FFFǝv\WX$5I?#3:OF F`*0FCPf0 q6M%+њpIܾ<,FF"d+.[w0t?>ôJQW3F4f6M%+CPf0 lP]0|q*+ /CPf0 ɐGM<>HHcS F}P6^AL ePfxdJ9 E $2q0X J$\?lSFMfA#"@<ԕ~XFPOrK0H<FG(HfAo)B 7&Fv6M%+Ft6M%+4᪽~ hlGF&;CtHLHihBF#FCPf0 [0scS9 [0FveX`6eVDESTpH<k+ /lRۈH<qo"Fw~iG(FLF_Mc tE:efW+FFPxHBrWLAiELWF^v7XYOK/(3;K,k_be6M%+BlWox6M%+ cS#F2FihUN~>kʇH5KC:\src\pywin32\build\temp.win32-3.8\Release\adsi.pdb* .text$dip|.text$mn@.text$xk.text$ydP.idata$5P.00cfgT.CRT$XCAX(.CRT$XCU.CRT$XCZ.CRT$XIA.CRT$XIZ.CRT$XPA.CRT$XPZ.CRT$XTA.CRT$XTZ$V.rdata.rdata$r`@.rdata$sxdata.rdata$zzzdbg.rtc$IAA.rtc$IZZ.rtc$TAA.rtc$TZZ.xdata$x0H.edatax.idata$2h.idata$3|P.idata$4.idata$6 \ .data\*.data$r,X .bss@L.gfids$yYA@A"B"B"A"BA"@BA"lB"ЎA"BA"BA"B A"@B@A"lB`A"BA"BA"B^~Aq~AـATA)AHAABBB+B ҂A+B 8AABBBB+B AD^_bX\`Pukadsi.pydPyInit_adsi|\h4 | 0 pXBܠ`b$ 2Pbv Pzpf>D:2(6Pb|(Hft.  0 D T h z         2 D R j ~         V pR(b8T6v2d(   \ 6   p *    f B ACTIVEDS.dll_GetSecurityDescriptorLengthADVAPI32.dllOLEAUT32.dlliPyObject_GenericGetAttrkPyObject_GenericSetAttrz_PyTraceMalloc_NewReference_Py_Dealloc-PyBytes_FromStringxPyUnicode_AsUTF8PyLong_FromLongPyLong_AsLong=PyTuple_New@PyTuple_SizePyList_NewPyErr_WarnExPyErr_SetStringPyErr_NoMemoryPyErr_Format PyArg_ParseTuplePy_BuildValuePySequence_CheckPySequence_SizePySequence_GetItemE_Py_tracemalloc_config_Py_NoneStruct_Py_FalseStruct_Py_TrueStruct1PyExc_TypeError9PyExc_ValueError(PyExc_RuntimeWarning%PyBytes_AsStringPyErr_OccurredPyErr_ClearPyExc_AttributeErrorPyExc_IndexErrorPyEval_SaveThreadPyEval_RestoreThreadPyList_AppendPyLong_FromSsize_tKPyType_ReadyPyDict_SetItemStringPyModule_GetDictPyModule_Create2PyExc_MemoryErrorpython38.dlls?PyBuffer_New@@YAPAU_object@@H@Z?PyWinObject_AsWCHAR@@YAHPAU_object@@PAPA_WHPAK@Z?PyWinObject_FreeWCHAR@@YAXPA_W@Z?PyWinObject_AsWriteBuffer@@YAHPAU_object@@PAPAXPAKH@Z?PyWinObject_FromOLECHAR@@YAPAU_object@@PB_W@Z?PyWinObject_AsLARGE_INTEGER@@YAHPAU_object@@PAT_LARGE_INTEGER@@@Z?PyWinObject_FromLARGE_INTEGER@@YAPAU_object@@ABT_LARGE_INTEGER@@@Z?PyWinObject_FromSYSTEMTIME@@YAPAU_object@@ABU_SYSTEMTIME@@@Z?PyWinObject_AsSYSTEMTIME@@YAHPAU_object@@PAU_SYSTEMTIME@@@Z?PyWinTime_Check@@YAHPAU_object@@@Z?PyWinObject_FromSECURITY_DESCRIPTOR@@YAPAU_object@@PAX@Z?PyWinObject_AsBstr@@YAHPAU_object@@PAPA_WHPAK@Z?PyWinObject_FromBstr@@YAPAU_object@@QA_WH@Z?PyWinObject_FreeWCHARArray@@YAXPAPA_WK@Z?PyWinObject_AsWCHARArray@@YAHPAU_object@@PAPAPA_WPAKH@Z?PyWinObject_AsHANDLE@@YAHPAU_object@@PAPAX@Z?PyWinObject_AsIID@@YAHPAU_object@@PAU_GUID@@@Z?PyWinObject_FromIID@@YAPAU_object@@ABU_GUID@@@Z?PyWinExc_COMError@@3PAU_object@@Apywintypes38.dll,?PyCom_BuildPyException@@YAPAU_object@@JPAUIUnknown@@ABU_GUID@@@Z-?PyCom_BuildPyExceptionFromEXCEPINFO@@YAPAU_object@@JPAUtagEXCEPINFO@@I@ZPyCom_PyObjectFromVariant??0PyComTypeObject@@QAE@PBDPAV0@HPAUPyMethodDef@@P6APAVPyIUnknown@@PAUIUnknown@@@Z@ZB??1PyComTypeObject@@QAE@XZ?getattro@PyIBase@@SAPAU_object@@PAU2@0@ZPyCom_VariantFromPyObject?GetI@PyIDispatch@@SAPAUIDispatch@@PAU_object@@@Z??0PyIDispatch@@IAE@PAUIUnknown@@@ZK??1PyIDispatch@@MAE@XZ!?MakeBstrToObj@@YAPAU_object@@QA_W@Z?compare@PyIUnknown@@UAEHPAU_object@@@Z?getattr@PyIBase@@UAEPAU_object@@PAD@Z?iter@PyIBase@@UAEPAU_object@@XZ?iternext@PyIBase@@UAEPAU_object@@XZ?repr@PyIUnknown@@UAEPAU_object@@XZ?setattr@PyIBase@@UAEHPADPAU_object@@@Z?type@PyIDispatch@@2VPyComTypeObject@@APyCom_PyObjectFromIUnknown?GetI@PyIUnknown@@SAPAUIUnknown@@PAU_object@@@Z7??0PyIUnknown@@IAE@PAUIUnknown@@@Z[??1PyIUnknown@@MAE@XZ?type@PyIUnknown@@2VPyComTypeObject@@A3?PyCom_InterfaceFromPyInstanceOrObject@@YAHPAU_object@@ABU_GUID@@PAPAXH@ZS?PyObConstruct@PyIEnumVARIANT@@SAPAVPyIUnknown@@PAUIUnknown@@@Z@?PyCom_RegisterClientType@@YAHPAU_typeobject@@PBU_GUID@@@Zpythoncom38.dllIsProcessorFeaturePresentzIsDebuggerPresentUnhandledExceptionFiltereSetUnhandledExceptionFilterGetStartupInfoWtGetModuleHandleWFQueryPerformanceCounterGetCurrentProcessIdGetCurrentThreadIdGetSystemTimeAsFileTimeDisableThreadLibraryCalls^InitializeSListHeadGetCurrentProcessTerminateProcessKERNEL32.dll#__std_terminate__CxxFrameHandler3FmemcpyHmemset!__std_exception_copy"__std_exception_destroy_CxxThrowException5_except_handler4_common%__std_type_info_destroy_listVCRUNTIME140.dll __stdio_common_vsprintfwcsncpyfreemalloc_callnewhA_seh_filter_dll_configure_narrow_argv5_initialize_narrow_environment6_initialize_onexit_table>_register_onexit_function$_execute_onexit_table_crt_atexit_crt_at_quick_exit_cexit8_initterm9_initterm_ejterminateapi-ms-win-crt-stdio-l1-1-0.dllapi-ms-win-crt-string-l1-1-0.dllapi-ms-win-crt-heap-l1-1-0.dllapi-ms-win-crt-runtime-l1-1-0.dllAA A̤AAAA AAؤA$@AA05A@5AAp,A,A0.AA `0A0A1AA 2A3A4AA0+AX"B+ApA@7AxA7AA@8AA 9AA@8AA 9ALA=AXA>AdA?ApA`@A|A`AAAPBAdADAAFA$AGA0AHA@A`IAPAPJA`A KApALAALAAMAANAAOAȳA`PAسAPQAA RAASA ASA ATA0AUA@AVAPA`WA`APXApA YAAZAA[AA[AAp\AhA^AxA_AA`AA`aAA`bA8Y8e8j8r8888888+999999::&:>:Z:m:::::;; ;(;2;D;V;^;d;y;;;;;;;;;;;;;< <=V==(>V>]>o>>>>>>>>>>>>?R?g??????? $0 00U0Z0b00000011 1(1<1O1_11112 22N222222223=3Q3i333333334 44,424C4S44444444444444<5U5y5556<6`6v66-7o7777"8a88888899!9/99999:":2:k:::::;<;k;;;;;;<+<8<[<<<<< =?=K=====$>L>W>\>>>>>>%?2?o???????0X 00!0K0t000111;1n111111 22J2O2W2p222222.3?3r3~33334/4D4I4444445"5P5U5]555555556N6|666627G7Y7c7r7777777777888#8-8J8e8o8y88888888899,9D9S9]9{999999999:.:4:=:R:X:j:::::;Z;;;>$>3>@>^>l>u>>>>>>>>>??,?8O8T8k8w8888899$9;9G9z999999999:%:6:::::::::;:;D;S;l;x;;;;;;;;C >'>6>N>_>d>{>>>>>>> ??)?9?[?e?v?????P00$0;0G0z0000000001%161111111112:2D2S2l2x22222222C3M3g3v333333344,484M4[4i4y44445 5'565K5\5a5x5555555 66&666X6b6s66666 77!787D7z7777777778"838888888889:9D9S9i9u99999999*:4:C:Y:e:z:::::::;$;3;I;U;j;x;;;;;;<<(<@@>I>>>>>??(?7?L?]?b?y??????`|030U0c0k0t0~000001#1+1:1j1111112 22#2p222222223+353F3~333333334!4*4b4z444444445:5Y5c5555555*63696S6x66666666677)7>7J7^7h7x7777777788)8>8J8`8x888888889 9B9c99999999:4:>:j::::;;.;4;=;R;X;e;k;;;;;.>D>P>X>i>w>>>>>>>>>?K?Q?Z?????p0$0.0A0g0x00001$1o1{11111112(2I2S2t2~222223 393C3333333344J4f444485>5Q5\5a5g5z55555555555555556 666'6,676<6G6L6W6\6g6l6z666666666666666667 777"7-727@7E7P7U7`7e7p7u777777777777777778 88#8(83888>8B8H8L8^8c8n8s88888888888888889992989>9D9J9P9V9\9b9h9n9t9z99999999999999999999999: ::::":(:.:4:::@:F:L:R:X:^:d:j:p:v:|::::::::::::::::::::::;; ;;;;g;{;;@<=4========>>>0>:>>>>>>??'?K?\??00-0>0O0T0m0r0000011(1f1x122e222233-333C3l3333334J4g4}44444H5Q5Y5555556 66)6]67'717B7h77778818N88888888 989@9U9a9m9s9y9999999:::.:7:B:I:i:o:u:{::::::::::::::::::;;$;4;=;p;v;|;;;;;;;;;;;;;;;;;;<<<@=D=J=P=V=\=b=h=n=t=z=======================> >>>>">(>P>i>>>>>>>>?0?P?p???????????0000!0'0TP2X2\2`2d2h2l2p2t2x2|2L6T6\6d6l6t6|6666666666666>>>??? ??h4181<1@1D1H1L1P182<2@2D2H2L2P2T288888888l:p:t:x:|::::p= 2: print(" %s: %s=%s" % (child.Class, attr, val)) def DumpSchema(): "Dumps the default DSE schema" # Bind to rootDSE to get the schemaNamingContext property. path = "LDAP://%srootDSE" % server rootdse = ADsGetObject(path) name = rootdse.Get("schemaNamingContext") # Bind to the actual schema container. path= "LDAP://" + server + name print("Binding to", path) ob = ADsGetObject(path) nclasses = nattr = nsub = nunk = 0 # Enumerate the attribute and class objects in the schema container. for child in ob: # Find out if this is a class, attribute, or subSchema object. class_name = child.Class if class_name == "classSchema": _DumpClass(child) nclasses = nclasses + 1 elif class_name == "attributeSchema": _DumpAttribute(child) nattr = nattr + 1 elif class_name == "subSchema": nsub = nsub + 1 else: print("Unknown class:", class_name) nunk = nunk + 1 if verbose_level: print("Processed", nclasses, "classes") print("Processed", nattr, "attributes") print("Processed", nsub, "sub-schema's") print("Processed", nunk, "unknown types") def _DumpObject(ob, level = 0): prefix = " " * level print("%s%s object: %s" % (prefix, ob.Class, ob.Name)) # Do the directory object thing try: dir_ob = ADsGetObject(ob.ADsPath, IID_IDirectoryObject) except pythoncom.com_error: dir_ob = None if dir_ob is not None: info = dir_ob.GetObjectInformation() print("%s RDN='%s', ObjectDN='%s'" % (prefix, info.RDN, info.ObjectDN)) # Create a list of names to fetch names = ["distinguishedName"] attrs = dir_ob.GetObjectAttributes(names) for attr in attrs: for val, typ in attr.Values: print("%s Attribute '%s' = %s" % (prefix, attr.AttrName, val)) for child in ob: _DumpObject(child, level+1) def DumpAllObjects(): "Recursively dump the entire directory!" path = "LDAP://%srootDSE" % server rootdse = ADsGetObject(path) name = rootdse.Get("defaultNamingContext") # Bind to the actual schema container. path= "LDAP://" + server + name print("Binding to", path) ob = ADsGetObject(path) # Enumerate the attribute and class objects in the schema container. _DumpObject(ob) ########################################################## # # Code taken from article: # Example Code for Enumerating Schema Classes, Attributes, and Syntaxes # Fill a map with VT_ datatypes, to give us better names: vt_map = {} for name, val in pythoncom.__dict__.items(): if name[:3] == "VT_": vt_map[val] = name def DumpSchema2(): "Dumps the schema using an alternative technique" path = "LDAP://%sschema" % (server,) schema = ADsGetObject(path, IID_IADsContainer) nclass = nprop = nsyntax = 0 for item in schema: item_class = string.lower(item.Class) if item_class == "class": items = [] if item.Abstract: items.append("Abstract") if item.Auxiliary: items.append("Auxiliary") # if item.Structural: items.append("Structural") desc = string.join(items, ", ") import win32com.util iid_name = win32com.util.IIDToInterfaceName(item.PrimaryInterface) if verbose_level >= 2: print("Class: Name=%s, Flags=%s, Primary Interface=%s" % (item.Name, desc, iid_name)) nclass = nclass + 1 elif item_class == "property": if item.MultiValued: val_type = "Multi-Valued" else: val_type = "Single-Valued" if verbose_level >= 2: print("Property: Name=%s, %s" % (item.Name, val_type)) nprop = nprop + 1 elif item_class == "syntax": data_type = vt_map.get(item.OleAutoDataType, "") if verbose_level >= 2: print("Syntax: Name=%s, Datatype = %s" % (item.Name, data_type)) nsyntax = nsyntax + 1 if verbose_level >= 1: print("Processed", nclass, "classes") print("Processed", nprop, "properties") print("Processed", nsyntax, "syntax items") def DumpGC(): "Dumps the GC: object (whatever that is!)" ob = ADsGetObject("GC:", IID_IADsContainer) for sub_ob in ob: print("GC ob: %s (%s)" % (sub_ob.Name, sub_ob.ADsPath)) def DumpLocalUsers(): "Dumps the local machine users" path = "WinNT://%s,computer" % (local_name,) ob = ADsGetObject(path, IID_IADsContainer) ob.put_Filter(["User", "Group"]) for sub_ob in ob: print("User/Group: %s (%s)" % (sub_ob.Name, sub_ob.ADsPath)) def DumpLocalGroups(): "Dumps the local machine groups" path = "WinNT://%s,computer" % (local_name,) ob = ADsGetObject(path, IID_IADsContainer) ob.put_Filter(["Group"]) for sub_ob in ob: print("Group: %s (%s)" % (sub_ob.Name, sub_ob.ADsPath)) # get the members members = sub_ob.Members() for member in members: print(" Group member: %s (%s)" % (member.Name, member.ADsPath)) def usage(tests): import os print("Usage: %s [-s server ] [-v] [Test ...]" % os.path.basename(sys.argv[0])) print(" -v : Verbose - print more information") print(" -s : server - execute the tests against the named server") print("where Test is one of:") for t in tests: print(t.__name__,":", t.__doc__) print() print("If not tests are specified, all tests are run") sys.exit(1) def main(): import getopt, traceback tests = [] for ob in globals().values(): if type(ob)==type(main) and ob.__doc__: tests.append(ob) opts, args = getopt.getopt(sys.argv[1:], "s:hv") for opt, val in opts: if opt=="-s": if val[-1] not in "\\/": val = val + "/" global server server = val if opt=="-h": usage(tests) if opt=="-v": global verbose_level verbose_level = verbose_level + 1 if len(args)==0: print("Running all tests - use '-h' to see command-line options...") dotests = tests else: dotests = [] for arg in args: for t in tests: if t.__name__==arg: dotests.append(t) break else: print("Test '%s' unknown - skipping" % arg) if not len(dotests): print("Nothing to do!") usage(tests) for test in dotests: try: test() except: print("Test %s failed" % test.__name__) traceback.print_exc() if __name__=='__main__': main()PK ѳPg_&win32comext/adsi/demos/objectPicker.pyUT l_Zx`ux # A demo for the IDsObjectPicker interface. import win32clipboard import pythoncom from win32com.adsi import adsi from win32com.adsi.adsicon import * cf_objectpicker = win32clipboard.RegisterClipboardFormat(CFSTR_DSOP_DS_SELECTION_LIST) def main(): hwnd = 0 # Create an instance of the object picker. picker = pythoncom.CoCreateInstance(adsi.CLSID_DsObjectPicker, None, pythoncom.CLSCTX_INPROC_SERVER, adsi.IID_IDsObjectPicker) # Create our scope init info. siis = adsi.DSOP_SCOPE_INIT_INFOs(1) sii = siis[0] # Combine multiple scope types in a single array entry. sii.type = DSOP_SCOPE_TYPE_UPLEVEL_JOINED_DOMAIN | \ DSOP_SCOPE_TYPE_DOWNLEVEL_JOINED_DOMAIN # Set uplevel and downlevel filters to include only computer objects. # Uplevel filters apply to both mixed and native modes. # Notice that the uplevel and downlevel flags are different. sii.filterFlags.uplevel.bothModes = DSOP_FILTER_COMPUTERS sii.filterFlags.downlevel = DSOP_DOWNLEVEL_FILTER_COMPUTERS # Initialize the interface. picker.Initialize( None, # Target is the local computer. siis, # scope infos DSOP_FLAG_MULTISELECT, # options ('objectGUID','displayName') ) # attributes to fetch do = picker.InvokeDialog(hwnd) # Extract the data from the IDataObject. format_etc = (cf_objectpicker, None, pythoncom.DVASPECT_CONTENT, -1, pythoncom.TYMED_HGLOBAL) medium = do.GetData(format_etc) data = adsi.StringAsDS_SELECTION_LIST(medium.data) for item in data: name, klass, adspath, upn, attrs, flags = item print("Item", name) print(" Class:", klass) print(" AdsPath:", adspath) print(" UPN:", upn) print(" Attrs:", attrs) print(" Flags:", flags) if __name__=='__main__': main() PK ѳPDޥ$ win32comext/adsi/demos/search.pyUT l_Zx`ux from win32com.adsi import adsi from win32com.adsi.adsicon import * from win32com.adsi import adsicon import pythoncom, pywintypes, win32security options = None # set to optparse options object ADsTypeNameMap = {} def getADsTypeName(type_val): # convert integer type to the 'typename' as known in the headerfiles. if not ADsTypeNameMap: for n, v in adsicon.__dict__.items(): if n.startswith("ADSTYPE_"): ADsTypeNameMap[v] = n return ADsTypeNameMap.get(type_val, hex(type_val)) def _guid_from_buffer(b): return pywintypes.IID(b, True) def _sid_from_buffer(b): return str(pywintypes.SID(b)) _null_converter = lambda x: x converters = { 'objectGUID' : _guid_from_buffer, 'objectSid' : _sid_from_buffer, 'instanceType' : getADsTypeName, } def log(level, msg, *args): if options.verbose >= level: print("log:", msg % args) def getGC(): cont = adsi.ADsOpenObject("GC:", options.user, options.password, 0, adsi.IID_IADsContainer) enum = adsi.ADsBuildEnumerator(cont) # Only 1 child of the global catalog. for e in enum: gc = e.QueryInterface(adsi.IID_IDirectorySearch) return gc return None def print_attribute(col_data): prop_name, prop_type, values = col_data if values is not None: log(2, "property '%s' has type '%s'", prop_name, getADsTypeName(prop_type)) value = [converters.get(prop_name, _null_converter)(v[0]) for v in values] if len(value) == 1: value = value[0] print(" %s=%r" % (prop_name, value)) else: print(" %s is None" % (prop_name,)) def search(): gc = getGC() if gc is None: log(0, "Can't find the global catalog") return prefs = [(ADS_SEARCHPREF_SEARCH_SCOPE, (ADS_SCOPE_SUBTREE,))] hr, statuses = gc.SetSearchPreference(prefs) log(3, "SetSearchPreference returned %d/%r", hr, statuses) if options.attributes: attributes = options.attributes.split(",") else: attributes = None h = gc.ExecuteSearch(options.filter, attributes) hr = gc.GetNextRow(h) while hr != S_ADS_NOMORE_ROWS: print("-- new row --") if attributes is None: # Loop over all columns returned while 1: col_name = gc.GetNextColumnName(h) if col_name is None: break data = gc.GetColumn(h, col_name) print_attribute(data) else: # loop over attributes specified. for a in attributes: try: data = gc.GetColumn(h, a) print_attribute(data) except adsi.error as details: if details[0] != E_ADS_COLUMN_NOT_SET: raise print_attribute( (a, None, None) ) hr = gc.GetNextRow(h) gc.CloseSearchHandle(h) def main(): global options from optparse import OptionParser parser = OptionParser() parser.add_option("-f", "--file", dest="filename", help="write report to FILE", metavar="FILE") parser.add_option("-v", "--verbose", action="count", default=1, help="increase verbosity of output") parser.add_option("-q", "--quiet", action="store_true", help="suppress output messages") parser.add_option("-U", "--user", help="specify the username used to connect") parser.add_option("-P", "--password", help="specify the password used to connect") parser.add_option("", "--filter", default = "(&(objectCategory=person)(objectClass=User))", help="specify the search filter") parser.add_option("", "--attributes", help="comma sep'd list of attribute names to print") options, args = parser.parse_args() if options.quiet: if options.verbose != 1: parser.error("Can not use '--verbose' and '--quiet'") options.verbose = 0 if args: parser.error("You need not specify args") search() if __name__=='__main__': main() PK ѳP="KLKLwin32comext/adsi/demos/scp.pyUT l_Zx`ux """A re-implementation of the MS DirectoryService samples related to services. * Adds and removes an ActiveDirectory "Service Connection Point", including managing the security on the object. * Creates and registers Service Principal Names. * Changes the username for a domain user. Some of these functions are likely to become move to a module - but there is also a little command-line-interface to try these functions out. For example: scp.py --account-name=domain\\user --service-class=PythonScpTest \\ --keyword=foo --keyword=bar --binding-string=bind_info \\ ScpCreate SpnCreate SpnRegister would: * Attempt to delete a Service Connection Point for the service class 'PythonScpTest' * Attempt to create a Service Connection Point for that class, with 2 keywords and a binding string of 'bind_info' * Create a Service Principal Name for the service and register it to undo those changes, you could execute: scp.py --account-name=domain\\user --service-class=PythonScpTest \\ SpnCreate SpnUnregister ScpDelete which will: * Create a SPN * Unregister that SPN from the Active Directory. * Delete the Service Connection Point Executing with --test will create and remove one of everything. """ from win32com.adsi.adsicon import * from win32com.adsi import adsi import win32api, win32con, winerror from win32com.client import Dispatch import ntsecuritycon as dscon import win32security import optparse, textwrap import traceback verbose = 1 g_createdSCP = None g_createdSPNs = [] g_createdSPNLast = None import logging logger = logging # use logging module global methods for now. # still a bit confused about log(n, ...) vs logger.info/debug() # Returns distinguished name of SCP. def ScpCreate( service_binding_info, service_class_name, # Service class string to store in SCP. account_name = None, # Logon account that needs access to SCP. container_name = None, keywords = None, object_class = "serviceConnectionPoint", dns_name_type = "A", dn = None, dns_name = None, ): container_name = container_name or service_class_name if not dns_name: # Get the DNS name of the local computer dns_name = win32api.GetComputerNameEx(win32con.ComputerNameDnsFullyQualified) # Get the distinguished name of the computer object for the local computer if dn is None: dn = win32api.GetComputerObjectName(win32con.NameFullyQualifiedDN) # Compose the ADSpath and bind to the computer object for the local computer comp = adsi.ADsGetObject("LDAP://" + dn, adsi.IID_IDirectoryObject) # Publish the SCP as a child of the computer object keywords = keywords or [] # Fill in the attribute values to be stored in the SCP. attrs = [ ("cn", ADS_ATTR_UPDATE, ADSTYPE_CASE_IGNORE_STRING, (container_name,)), ("objectClass", ADS_ATTR_UPDATE, ADSTYPE_CASE_IGNORE_STRING, (object_class,)), ("keywords", ADS_ATTR_UPDATE, ADSTYPE_CASE_IGNORE_STRING, keywords), ("serviceDnsName", ADS_ATTR_UPDATE, ADSTYPE_CASE_IGNORE_STRING, (dns_name,)), ("serviceDnsNameType", ADS_ATTR_UPDATE, ADSTYPE_CASE_IGNORE_STRING, (dns_name_type,)), ("serviceClassName", ADS_ATTR_UPDATE, ADSTYPE_CASE_IGNORE_STRING, (service_class_name,)), ("serviceBindingInformation", ADS_ATTR_UPDATE, ADSTYPE_CASE_IGNORE_STRING, (service_binding_info,)), ] new = comp.CreateDSObject("cn=" + container_name, attrs) logger.info("New connection point is at %s", container_name) # Wrap in a usable IDispatch object. new = Dispatch(new) # And allow access to the SCP for the specified account name AllowAccessToScpProperties(account_name, new) return new def ScpDelete(container_name, dn = None): if dn is None: dn = win32api.GetComputerObjectName(win32con.NameFullyQualifiedDN) logger.debug("Removing connection point '%s' from %s", container_name, dn) # Compose the ADSpath and bind to the computer object for the local computer comp = adsi.ADsGetObject("LDAP://" + dn, adsi.IID_IDirectoryObject) comp.DeleteDSObject("cn=" + container_name) logger.info("Deleted service connection point '%s'", container_name) # This function is described in detail in the MSDN article titled # "Enabling Service Account to Access SCP Properties" # From that article: # The following sample code sets a pair of ACEs on a service connection point # (SCP) object. The ACEs grant read/write access to the user or computer account # under which the service instance will be running. Your service installation # program calls this code to ensure that the service will be allowed to update # its properties at run time. If you don't set ACEs like these, your service # will get access-denied errors if it tries to modify the SCP's properties. # # The code uses the IADsSecurityDescriptor, IADsAccessControlList, and # IADsAccessControlEntry interfaces to do the following: # * Get the SCP object's security descriptor. # * Set ACEs in the DACL of the security descriptor. # * Set the security descriptor back on the SCP object. def AllowAccessToScpProperties( accountSAM, #Service account to allow access. scpObject, # The IADs SCP object. schemaIDGUIDs = # Attributes to allow write-access to. ("{28630eb8-41d5-11d1-a9c1-0000f80367c1}", # serviceDNSName "{b7b1311c-b82e-11d0-afee-0000f80367c1}", # serviceBindingInformation ) ): # If no service account is specified, service runs under LocalSystem. # So allow access to the computer account of the service's host. if accountSAM: trustee = accountSAM else: # Get the SAM account name of the computer object for the server. trustee = win32api.GetComputerObjectName(win32con.NameSamCompatible) # Get the nTSecurityDescriptor attribute attribute = "nTSecurityDescriptor" sd = getattr(scpObject, attribute) acl = sd.DiscretionaryAcl for sguid in schemaIDGUIDs: ace = Dispatch(adsi.CLSID_AccessControlEntry) # Set the properties of the ACE. # Allow read and write access to the property. ace.AccessMask = ADS_RIGHT_DS_READ_PROP | ADS_RIGHT_DS_WRITE_PROP # Set the trustee, which is either the service account or the # host computer account. ace.Trustee = trustee # Set the ACE type. ace.AceType = ADS_ACETYPE_ACCESS_ALLOWED_OBJECT # Set AceFlags to zero because ACE is not inheritable. ace.AceFlags = 0 # Set Flags to indicate an ACE that protects a specified object. ace.Flags = ADS_FLAG_OBJECT_TYPE_PRESENT # Set ObjectType to the schemaIDGUID of the attribute. ace.ObjectType = sguid # Add the ACEs to the DACL. acl.AddAce(ace) # Write the modified DACL back to the security descriptor. sd.DiscretionaryAcl = acl # Write the ntSecurityDescriptor property to the property cache. setattr(scpObject, attribute, sd) # SetInfo updates the SCP object in the directory. scpObject.SetInfo() logger.info("Set security on object for account '%s'" % (trustee,)) # Service Principal Names functions from the same sample. # The example calls the DsWriteAccountSpn function, which stores the SPNs in # Microsoft Active Directory under the servicePrincipalName attribute of the # account object specified by the serviceAcctDN parameter. The account object # corresponds to the logon account specified in the CreateService call for this # service instance. If the logon account is a domain user account, # serviceAcctDN must be the distinguished name of the account object in # Active Directory for that user account. If the service's logon account is the # LocalSystem account, serviceAcctDN must be the distinguished name of the # computer account object for the host computer on which the service is # installed. win32api.TranslateNames and win32security.DsCrackNames can # be used to convert a domain\account format name to a distinguished name. def SpnRegister( serviceAcctDN, # DN of the service's logon account spns, # List of SPNs to register operation, # Add, replace, or delete SPNs ): assert type(spns) not in [str, str] and hasattr(spns, "__iter__"), \ "spns must be a sequence of strings (got %r)" % spns # Bind to a domain controller. # Get the domain for the current user. samName = win32api.GetUserNameEx(win32api.NameSamCompatible) samName = samName.split('\\', 1)[0] if not serviceAcctDN: # Get the SAM account name of the computer object for the server. serviceAcctDN = win32api.GetComputerObjectName(win32con.NameFullyQualifiedDN) logger.debug("SpnRegister using DN '%s'", serviceAcctDN) # Get the name of a domain controller in that domain. info = win32security.DsGetDcName( domainName=samName, flags=dscon.DS_IS_FLAT_NAME | dscon.DS_RETURN_DNS_NAME | dscon.DS_DIRECTORY_SERVICE_REQUIRED) # Bind to the domain controller. handle = win32security.DsBind( info['DomainControllerName'] ) # Write the SPNs to the service account or computer account. logger.debug("DsWriteAccountSpn with spns %s") win32security.DsWriteAccountSpn( handle, # handle to the directory operation, # Add or remove SPN from account's existing SPNs serviceAcctDN, # DN of service account or computer account spns) # names # Unbind the DS in any case (but Python would do it anyway) handle.Close() def UserChangePassword(username_dn, new_password): # set the password on the account. # Use the distinguished name to bind to the account object. accountPath = "LDAP://" + username_dn user = adsi.ADsGetObject(accountPath, adsi.IID_IADsUser) # Set the password on the account. user.SetPassword(new_password) # functions related to the command-line interface def log(level, msg, *args): if verbose >= level: print(msg % args) class _NoDefault: pass def _get_option(po, opt_name, default = _NoDefault): parser, options = po ret = getattr(options, opt_name, default) if not ret and default is _NoDefault: parser.error("The '%s' option must be specified for this operation" % opt_name) if not ret: ret = default return ret def _option_error(po, why): parser = po[0] parser.error(why) def do_ScpCreate(po): """Create a Service Connection Point""" global g_createdSCP scp = ScpCreate(_get_option(po, "binding_string"), _get_option(po, "service_class"), _get_option(po, "account_name_sam", None), keywords=_get_option(po, "keywords", None)) g_createdSCP = scp return scp.distinguishedName def do_ScpDelete(po): """Delete a Service Connection Point""" sc = _get_option(po, "service_class") try: ScpDelete(sc) except adsi.error as details: if details[0] != winerror.ERROR_DS_OBJ_NOT_FOUND: raise log(2, "ScpDelete ignoring ERROR_DS_OBJ_NOT_FOUND for service-class '%s'", sc) return sc def do_SpnCreate(po): """Create a Service Principal Name""" # The 'service name' is the dn of our scp. if g_createdSCP is None: # Could accept an arg to avoid this? _option_error(po, "ScpCreate must have been specified before SpnCreate") # Create a Service Principal Name" spns = win32security.DsGetSpn(dscon.DS_SPN_SERVICE, _get_option(po, "service_class"), g_createdSCP.distinguishedName, _get_option(po, "port", 0), None, None) spn = spns[0] log(2, "Created SPN: %s", spn) global g_createdSPNLast g_createdSPNLast = spn g_createdSPNs.append(spn) return spn def do_SpnRegister(po): """Register a previously created Service Principal Name""" if not g_createdSPNLast: _option_error(po, "SpnCreate must appear before SpnRegister") SpnRegister(_get_option(po, "account_name_dn", None), (g_createdSPNLast,), dscon.DS_SPN_ADD_SPN_OP) return g_createdSPNLast def do_SpnUnregister(po): """Unregister a previously created Service Principal Name""" if not g_createdSPNLast: _option_error(po, "SpnCreate must appear before SpnUnregister") SpnRegister(_get_option(po, "account_name_dn", None), (g_createdSPNLast,), dscon.DS_SPN_DELETE_SPN_OP) return g_createdSPNLast def do_UserChangePassword(po): """Change the password for a specified user""" UserChangePassword(_get_option(po, "account_name_dn"), _get_option(po, "password")) return "Password changed OK" handlers = ( ('ScpCreate', do_ScpCreate), ('ScpDelete', do_ScpDelete), ('SpnCreate', do_SpnCreate), ('SpnRegister', do_SpnRegister), ('SpnUnregister', do_SpnUnregister), ('UserChangePassword', do_UserChangePassword), ) class HelpFormatter(optparse.IndentedHelpFormatter): def format_description(self, description): return description def main(): global verbose _handlers_dict = {} arg_descs = [] for arg, func in handlers: this_desc = "\n".join(textwrap.wrap(func.__doc__, subsequent_indent = " " * 8)) arg_descs.append(" %s: %s" % (arg, this_desc)) _handlers_dict[arg.lower()] = func description = __doc__ + "\ncommands:\n" + "\n".join(arg_descs) + "\n" parser = optparse.OptionParser(usage = "%prog [options] command ...", description=description, formatter=HelpFormatter()) parser.add_option("-v", action="count", dest="verbose", default=1, help="increase the verbosity of status messages") parser.add_option("-q", "--quiet", action="store_true", help="Don't print any status messages") parser.add_option("-t", "--test", action="store_true", help="Execute a mini-test suite, providing defaults for most options and args"), parser.add_option("", "--show-tracebacks", action="store_true", help="Show the tracebacks for any exceptions") parser.add_option("", "--service-class", help="The service class name to use") parser.add_option("", "--port", default=0, help="The port number to associate with the SPN") parser.add_option("", "--binding-string", help="The binding string to use for SCP creation") parser.add_option("", "--account-name", help="The account name to use (default is LocalSystem)") parser.add_option("", "--password", help="The password to set.") parser.add_option("", "--keyword", action="append", dest="keywords", help="""A keyword to add to the SCP. May be specified multiple times""") parser.add_option("", "--log-level", help="""The log-level to use - may be a number or a logging module constant""", default=str(logging.WARNING)) options, args = parser.parse_args() po = (parser, options) # fixup misc try: options.port = int(options.port) except (TypeError, ValueError): parser.error("--port must be numeric") # fixup log-level try: log_level = int(options.log_level) except (TypeError, ValueError): try: log_level = int(getattr(logging, options.log_level.upper())) except (ValueError, TypeError, AttributeError): parser.error("Invalid --log-level value") try: sl = logger.setLevel # logger is a real logger except AttributeError: # logger is logging module sl = logging.getLogger().setLevel sl(log_level) # Check -q/-v if options.quiet and options.verbose: parser.error("Can't specify --quiet and --verbose") if options.quiet: options.verbose -= 1 verbose = options.verbose # --test if options.test: if args: parser.error("Can't specify args with --test") args = "ScpDelete ScpCreate SpnCreate SpnRegister SpnUnregister ScpDelete" log(1, "--test - pretending args are:\n %s", args) args = args.split() if not options.service_class: options.service_class = "PythonScpTest" log(2, "--test: --service-class=%s", options.service_class) if not options.keywords: options.keywords = "Python Powered".split() log(2, "--test: --keyword=%s", options.keywords) if not options.binding_string: options.binding_string = "test binding string" log(2, "--test: --binding-string=%s", options.binding_string) # check args if not args: parser.error("No command specified (use --help for valid commands)") for arg in args: if arg.lower() not in _handlers_dict: parser.error("Invalid command '%s' (use --help for valid commands)" % arg) # Patch up account-name. if options.account_name: log(2, "Translating account name '%s'", options.account_name) options.account_name_sam = win32security.TranslateName(options.account_name, win32api.NameUnknown, win32api.NameSamCompatible) log(2, "NameSamCompatible is '%s'",options.account_name_sam) options.account_name_dn = win32security.TranslateName(options.account_name, win32api.NameUnknown, win32api.NameFullyQualifiedDN) log(2, "NameFullyQualifiedDNis '%s'",options.account_name_dn) # do it. for arg in args: handler = _handlers_dict[arg.lower()] # already been validated if handler is None: parser.error("Invalid command '%s'" % arg) err_msg = None try: try: log(2, "Executing '%s'...", arg) result = handler(po) log(1, "%s: %s", arg, result) except: if options.show_tracebacks: print("--show-tracebacks specified - dumping exception") traceback.print_exc() raise except adsi.error as xxx_todo_changeme: (hr, desc, exc, argerr) = xxx_todo_changeme.args if exc: extra_desc = exc[2] else: extra_desc = "" err_msg = desc if extra_desc: err_msg += "\n\t" + extra_desc except win32api.error as xxx_todo_changeme1: (hr, func, msg) = xxx_todo_changeme1.args err_msg = msg if err_msg: log(1, "Command '%s' failed: %s", arg, err_msg) if __name__=='__main__': try: main() except KeyboardInterrupt: print("*** Interrupted") PK {Rwin32comext/axcontrol/UT Zx`Zx`ux PK I$nQX#win32comext/axcontrol/axcontrol.pydUT J^_ux MZ@ !L!This program cannot be run in DOS mode. $0^t t t }. r O v O u O d O  ջ s p `Ѽ v ռ s t 巽 e u u Richt PELK^_! G@0nTnTP'PETE@l.text[ `.rdata@@.data p@.gfidsL@@.rsrcT@@.relocP'(@BhOGhHj5pGHhHGh`GcYhVGhȐHj5pGHhHGhpG3Yh]Gh8Hj5pGhHh HGhGYhcGhhHj5pG@HhP HGhGӿYhlGhHj5pGHhHGhG裿YhqGh8Hj5lGHhpHGhGsYhyGhHjhHhHȤHGhGDYh}GhHj5lGHhHGhGYhGhXHj5lGxHhHGhGYhGhHjhxHhHPHGhG贾YhЗGhHHjhPHhHH(HGhG脾YhGhHj5lGHh,HGhGSYhGhhHj5pGةHh&HGh G#YhGhȖHj5pGHhD'HGh0GYh`GhHj5pGHh(HGh@GýYhGhXHjhHh*H`HGhPG蔽YUdjhGPd%S]VWuWMd _^[]j$}Et6uGHGHG$HG8HGPHG H3M EOtQPE7ԋVH3҉_EʋM^d []UdjhOGPd%S]VWuWMd _^[]j 3}Et/uGGG$GG8GGLGGdG3M EOtQPE7ԋVH3҉_EʋM^d []UdjhOGPd%S]VWuWMd _^[]jc}Et(uGGGGGGGG3M EOtQPE7ԋVH3҉_EʋM^d []UdjhGPd%S]VWuWMd _^[]j(蓶}Et=uGHG,HG@HGTHGlHG HG$H3M EOtQPE7ԋVH3҉_EʋM^d []UdjhGPd%S]VWuWMd _^[]j賵}Et(uGHGHGHGH3M EOtQPE7ԋVH3҉_EʋM^d []Udjh/GPd%S]VWuWMd _^[]j }Et/uG,GG|GGGGGGG3M EOtQPE7ԋVH3҉_EʋM^d []UdjhGPd%S]VWuWMd _^[]j }Et/uG HGpHGHGHGH3M EOtQPE7ԋVH3҉_EʋM^d []UdjhGPd%S]VWuWMd _^[]jC}Et(uGtHGHGHGH3M EOtQPE7ԋVH3҉_EʋM^d []UdjhGPd%S]VWuWMd _^[]js}Et(uGGGHGG\GGpG3M EOtQPE7ԋVH3҉_EʋM^d []UdjhoGPd%S]VWuWMd _^[]j裱}Et(uGHGPHGdHGxH3M EOtQPE7ԋVH3҉_EʋM^d []Udjh/GPd%S]VWuWMd _^[]j$Ӱ}Et6uGHG(HG<HGPHGhHG H3M EOtQPE7ԋVH3҉_EʋM^d []UdjhGPd%S]VWuWMd _^[]j}Et(uGXGGGGGGG3M EOtQPE7ԋVH3҉_EʋM^d []UdjhGPd%S]VWuWMd _^[]j#}Et(uGGGGGGGG3M EOtQPE7ԋVH3҉_EʋM^d []UdjhGPd%S]VWuWMd _^[]j S}Et/uG4GGGGGGGGG3M EOtQPE7ԋVH3҉_EʋM^d []UdjhGPd%S]VWuWMd _^[]j胭}Et(uGGGHGG\GGpG3M EOtQPE7ԋVH3҉_EʋM^d []̋D$̋D$ uP(GY̋D$tu D$%(G̋D$hG0G0G3̋D$t D$%GSVW|$GP G G3\$f;GsCUk 3ۍwFPPFPFPhGы GvEmGC;|ˋ\$]SPhGу u S(G_^[̃(D$0WD$8D$(PD$(PD$(PD$(PhGt$DGu_(V5`GD$jjPt$,փjjD$Pt$0փjjD$Pt$4փjjD$Pt$8փoD$5HGStP֍X3ۋD$UtP֍h3D$t P֍HL$ D$ D$tP@3D$ Í4EVxGL$Du4GhG0G7O |$u3fG"+fGT$Rfvfu Y|$u3fG*+fGT$Rfvfu i|$u3fG&+fGT$RfvfuD$ A|$u3fG +fG T$RfIfuD$$][t$5PGt$ t$t$֋D$^_(%GQUVt$WFfu3Ƌ=TGP׋Fl$ fu3 SQ׋؃Ffu3P׋F fu3PTGVWSUhGG-(GD$D$t uPՃt uSՃ[t uWՃt uVՃD$_^]YQVt$FPD$PD$PFPhhGt$ Gu3^YÍFPt$PGtF Pt$PG^YW|$ww LGPwLGPwhGG_̃DD$$PD$PD$(PD$ PD$ PD$ Ph,Gt$hG uDV5dGD$8Pt$փtJD$(Pt$փt85GD$jPh+Ht$$փtjD$Ph3Ht$(փu3^DW0GPhHjhHVW@SG_^[ VW,Gt$L$h4Hjh8HQR@WG_^VW,GL$ jjh@HQR@WG_^VXHGD$t jV`^UjhGdPd%QVj!`uEt)uGXHFH^Md ]ËM3^d ]̋D$%XG̃ Wt$(XGu3_ ÍD$PhHt$4G tލD$Pt$HGtSV0GPhHjhHVW@SG_^[VW,Gt$L$hHjhHQR@WG_^VW,Gt$L$hHjhHQR@WG_^SVW,Gt$t$jhh+Ht$$>G PD$p pp0hHjhHVW@SG,_^[VW,Gt$L$hHjhHQR@WG_^VH`GD$t jVZ^UjhGdPd%QVjZuEt)u\GHFH^Md ]ËM3^d ]̋D$̋D$ uP(GY+&̃$Wt$,&u3_$ÍD$PD$PhHt$<GtٍD$ Pt$PGtÍD$Pt$  GtSVLGPhDHjhHHVW@SG_^[SVW,Gt$t$>xGPhTHjhXHVW@SG_^[VW,Gt$L$hhHjhlHQR@WG_^SVW,Gt$؍D$Pt$>0GPh|HjhHVW@SG_^[ VH"D$t jVS^Ujh/GdPd%QVjRuEt(u!HFȤH^Md ]ËM3^d ]̋D$%XGWt$XGu3_hHt$GtVxGPjhh,Ht$ G PhHjhHVW@SG_^[ VH`GD$t jV/^UjhGdPd%QVj.uEt)u\GHFH^Md ]ËM3^d ]̋D$̋D$ uP(GY̋D$tu D$%(G%G̃Vt$Gu3^ÍD$Ph,$Ht$G tjD$Ph+Ht$GtWD$ ;8Gt|$0QPHGtjD$ Ph+Ht$Gu_3^DSq1t$4t$4jh+Ht$<G Pt$40GPt$4hd!Hjhp!HVW@SG8_^[̃UVW,G|$0D$u @l$,L$ E}jQhx!HWP@D$Ph!Ht$G u"L$QPDPh!HuG Ojt$4h,Ht$Gu L$QPDPh!HuG D$ u P(Gt$G_^]VW,GL$ jjh!HQR@WG_^VW,GL$ jjh!HQR@WG_^̃SUVW,G\$,KD$j{Ph!HWQ@D$Ph!Ht$G u"L$QPDPh!HsG Ht$0t$dGu L$QPDPh"HsG D$u P(GUG_^][̃SUVW,Gt$0\$0KD$h@"H{PhD"HWQ@D$PhP"Ht$G u"L$QPDPhT"HsG Jjt$8t$|G u L$QPDPh`"HsG D$u P(GUG_^][ VW,GL$ jt$h"Hjh"HQR@WG_^ QVW,Gt$L$D$ h"HPh"HQR@xL$u Q(GWG_^Y ̃UVW,GjhX5Ht$4D$Gl$4WD$h"HPh"HMUQ@ tu W(GxTt$0h"Ht$G u'EL$QPDPD$,h"HpG D$ u P(Gt$G_^] VW,Gt$L$h8#Hjh<#HQR@WG_^̃UVW,G|$0D$u @l$,L$ E}jQhH#HWP@D$PhT#Ht$G u"L$QPDPhX#HuG Ojt$4hh2Ht$Gu L$QPDPhd#HuG D$ u P(Gt$G_^]̃SUVW,Gt$,\$,KD$h#H{Ph#HWQ@xOt$0h#Ht$G u"L$QPDPh#HsG D$u P(GUG_^][ VW,GL$ jh#Hjh#HQR@WG_^V&HGD$t jV^UjhGdPd%QVjuEt)uG&HFةH^Md ]ËM3^d ]̋D$ uP(GY%G̃Wt$Gu3_h&Ht$GtVD$D$ u8.)U u} uuMPu UuuYY]t hEG+PQgYYt'x$|!EE3Ɂ8ËeE2 Uct}u 38H]U=THt} uu4u,YY]U졔H3tV~Ytu ju6SXH3@Ê]uYj h`mH;XH3OHXHYEe=4Htj %4HEjuYY3Ʉ uYYj hmH} u9=XH3et t]1]SWuuSWuuSWutuu"uSPu\SVuSVu`tuHSWuout5SWu:$MQ0hGuu uËe3uEUV5DHu3@uu u^] U]U} u uu u ] UaaEAEH]UVuXEH^]aaAEHEHUVu%$EH^]aaA,EH$EHUVFDH `PEP> YY^]UEDHaaA]ADHP YÍADHP YÍADHP YUVFDHP EYt j VYY^]UVFDHP EYt j V]YY^]UVFDHP| EYt j V0YY^]U MhmHEPN U MhmHEP1 ̋AuDH6 U%\H(S3C Hj me3 H3VW\H}S[wOW E؋MEineIE5ntel ȋEj5Genu XjYS[wOW uCE%?=t#=`t=pt=Pt=`t=pu=`H=`H=`H}EEEEE|2jX3S[]؉sKS EܩEEt =`H_^tm H\HtUtN3ЉEUEM3Ƀu3u/H\HE Ht \HH3[]3@39HU$SVjtM)3hVP5dHE |xffftfpflfhEEDž@jPEVPE E@EEGVXۍEEۉE$GEP Gu !dH^[]UDjDEjPL EP(GEtEj X]3j,Gȅu2øMZf9uA<8PEu f9HuۃxtvՃhG$GUE8csmu%xu@= t=!t="t =@t3]̃%dH%lGhGd5D$l$l$+SVWH1E3PeuEEEEdËMd Y__^[]QUuuu uht M׃;r_^[SVgHgH;sW>t "׃;r_^[Ë lG3)G; Hu(Uj$Gu Gh GPG]U$jtjY)H |HxHtH5pH=lHfHf HfhHfdHf%`Hf-\HHEHEHEHЭHHHH HHjXkǀHjXk HLjX HLhDEH]Uj]UjtM)H |HxHtH5pH=lHfHf HfhHfdHf%`Hf-\HHEHEHEHHHH HHjXkMHhDEH]U jtM)H |HxHtH5pH=lHfHf HfhHfdHf%`Hf-\HHEHEHEHHHH H} v }ue } vE HE E @HjXkMHeE@EE;E sEMU HhDEH]%G%G% G%$G%(G%,G%0G%4G%G%G%G% G%G%G%pG%XG%lG%hG%dG%`G%\G%G%xG%G%|G%G%G%G%G%G%G%G%G%G%G%G%Gðððð3jEPøiH=jEPøgHjEPøiHjEPøhHjEPøhHj EPzøhHj$EPZø(΃ &BZh~qqr(rqzssssssssttds4trrrrrrdrRrDrPsGP6GAGJGDG&GVG G\GGG2G,G>G8GP3GbG:GEGTLH>GV6GAGPGhLH>G`6GAGhG|LH>Gj6GAGSG@TGTGUGPUGUGLH@G8G DGJGDG&GVG G\GGG2G,G>G8G`5GbG G8Gp4GbG;GHGNH?G7GCGPGNH?G7GCGhGNH?G7GCGP|G`|GNH?G7G$CGG8G5GbGG8G5GbG`G6G0BGJGDG&GVG G\GGG2G,G>G8G3GbG;GFGQH>G6G6BGPGQH?G6G@BGhGQH ?G6GJBGaGpbG cG`cGQH ?G6G`BGJGDG&GVG G\GGG2G,G>G8G3GbG ;GFGPRH&?G6GfBGPGdRH0?G6GpBGhGxRH:?G6GzBGhGiGPiG0jGkG`kGkGRHP?G7GBGJGDG&GVG G\GGG2G,G>G8G4GbG@;G@GG(SHV?G7GBGPGG8G4GbG;G`HGTH?G7G6CGPG(TH@G7G@CGhGG8G4GbG;GHGUH&@G7GfCGPGUH0@G7GpCGhGUH:@G7GzCGG =GDG0>G=G@:G:G=GUHN@G8GCGG%=GEG5>G=GE:G:G=G`GG@GUH`@G 8GCGJGDG&GVG G\GGG2G,G>G8G5GbG;G IG@WHf@G&8GCGPGTWHp@G08GCGhGhWHz@G:8GCGG0=GEG@>G=GP:G :G=GWH@GN8GCGG5=G$EGE>G=GU:G%:G=G=G=GDGWH@GX8GCG =G9G9Go=G>G?=G.EGO>G=G_:G/:G=G=G=GDG`GGG G`GGPGGG GGGWHAG8GPDGJGDG&GVG G\GGG2G,G>G8G5GbG@G 6GAGJGDG&GVG G\GGG2G,G>G8G 3GbG:G`EG YHf>G&6GAGPG YHp>G06GAGhG4YHz>G:6GAGMGPNGYH>G6GBGJGDG&GVG G\GGG2G,G>G8G3GbG:G FG ZH>G6GBGPG ZH>G6GBGhG4ZH>G6GBGYG`\GHZH@Gp8GCGJGDG&GVG G\GGG2G,G>G8G05GbGG8G@4GbG`;GGG\H?GF7GBGPG0\H?GP7GBGhGD\H?GZ7GBGvGvGX\H?Gd7GBGcom/win32comext/axcontrol/src/PyIOleClientSite.cppGetContainerOcom/win32comext/axcontrol/src/PyIOleClientSite.cppShowObjectiOnShowWindowRequestNewObjectLayout]HGGGGGGUGiiElement %d of command buffer was not a tuple of 2 integerscom/win32comext/axcontrol/src/PyIOleCommandTarget.cppcom/win32comext/axcontrol/src/PyIOleCommandTarget.cppOOcmds must be a sequenceiNOiiOQueryStatusExecPyIOleCommandTargetcom/win32comext/axcontrol/src/PyIOleCommandTarget.cppQueryStatusllNNNQueryStatusOOOLECMD objects must be a sequenceString value returned but caller didn't request it (check the 3rd param!)Sequence must have %d items (got %d)com/win32comext/axcontrol/src/PyIOleCommandTarget.cppQueryStatusNllNExeccom/win32comext/axcontrol/src/PyIOleCommandTarget.cppc:\src\python-3.8\include\object.h]HGGGGGG]Gc:\src\python-3.8\include\object.h:GetControlInfoOi((iiiii(ii))):OnMnemonicl:OnAmbientPropertyChangei:FreezeEventsGetControlInfoOnMnemonicOnAmbientPropertyChangeFreezeEventsPyIOleControlGetControlInfo(Oi):GetControlInfoGetControlInfoOnly None is supported for ControlInfo.GetControlInfocom/win32comext/axcontrol/src/PyIOleControl.cpp((iiiii(ii)))OOnMnemoniccom/win32comext/axcontrol/src/PyIOleControl.cpplOnAmbientPropertyChangeiFreezeEvents@^HGGGGGGcGc:\src\python-3.8\include\object.h:OnControlInfoChangedi:LockInPlaceActive:GetExtendedControl(ll)(ff)l:TransformCoords(ll)(ff)Ol:TranslateAcceleratori:OnFocus:ShowPropertyFrameOnControlInfoChangedLockInPlaceActiveGetExtendedControlTransformCoordsTranslateAcceleratorOnFocusShowPropertyFramePyIOleControlSiteOnControlInfoChangediLockInPlaceActiveGetExtendedControlOGetExtendedControlGetExtendedControlcom/win32comext/axcontrol/src/PyIOleControlSite.cpp(ll)(ff)lTransformCoords(ll)(ff)GetExtendedControlcom/win32comext/axcontrol/src/PyIOleControlSite.cppNlTranslateAcceleratoriOnFocusShowPropertyFrame^HGGGGGGkGc:\src\python-3.8\include\object.hO:TranslateAcceleratori:OnFrameWindowActivatei:OnDocWindowActivate(iiii)Oi:ResizeBorderi:EnableModelessTranslateAcceleratorOnFrameWindowActivateOnDocWindowActivateResizeBorderEnableModelessPyIOleInPlaceActiveObjectNTranslateAcceleratoriOnFrameWindowActivateiOnDocWindowActivate(iiii)OiResizeBorderiEnableModeless(_HGGGGGGpqGO:RemoveMenusO:SetStatusTexti:EnableModelessOh:TranslateAcceleratorInsertMenusSetMenuRemoveMenusSetStatusTextEnableModelessTranslateAcceleratorPyIOleInPlaceFrameNNInsertMenuscom/win32comext/axcontrol/src/PyIOleInPlaceFrame.cppInsertMenusNNNSetMenuNRemoveMenusNSetStatusTextiEnableModelessNhTranslateAcceleratorc:\src\python-3.8\include\object.hOO:InsertMenusOOO:SetMenu_HGGGGGGPyGc:\src\python-3.8\include\object.h:InPlaceDeactivate:UIDeactivate(llll)(llll):SetObjectRects:ReactivateAndUndoInPlaceDeactivateUIDeactivateSetObjectRectsReactivateAndUndoPyIOleInPlaceObjectInPlaceDeactivateUIDeactivate(llll)(llll)SetObjectRectsReactivateAndUndo `HGGGGGG}Gc:\src\python-3.8\include\object.h:CanInPlaceActivate:OnInPlaceActivate:OnUIActivate:GetWindowContextNN(llll)(llll)Nll:Scrolli:OnUIDeactivate:OnInPlaceDeactivate:DiscardUndoState:DeactivateAndUndo(llll):OnPosRectChangeCanInPlaceActivateOnInPlaceActivateOnUIActivateGetWindowContextScrollOnUIDeactivateOnInPlaceDeactivateDiscardUndoStateDeactivateAndUndoOnPosRectChangePyIOleInPlaceSiteCanInPlaceActivateOnInPlaceActivateOnUIActivateGetWindowContextOO(llll)(llll)Ocom/win32comext/axcontrol/src/PyIOleInPlaceSite.cpp(ll)ScrolliOnUIDeactivateOnInPlaceDeactivateDiscardUndoStateDeactivateAndUndo((llll))OnPosRectChangex`HGGGGGGGc:\src\python-3.8\include\object.hi:OnInPlaceActivateExii:OnInPlaceDeactivateEx:RequestUIActivateOnInPlaceActivateExOnInPlaceDeactivateExRequestUIActivatePyIOleInPlaceSiteExiOnInPlaceActivateExicom/win32comext/axcontrol/src/PyIOleInPlaceSiteEx.cppiOnInPlaceDeactivateExRequestUIActivate`HGGGGGGG:CanWindowlessActivate:GetCapturei:SetCapture:GetFocusi:SetFocus(llll)l:GetDCll:ReleaseDC(llll)i:InvalidateRectli:InvalidateRgnii(llll)(llll):ScrollRect(llll):AdjustRect(llll)iil:OnDefWindowMessagelCanWindowlessActivateGetCaptureSetCaptureGetFocusSetFocusGetDCReleaseDCInvalidateRectInvalidateRgnScrollRectAdjustRectOnDefWindowMessagePyIOleInPlaceSiteWindowlessCanWindowlessActivateGetCaptureiSetCaptureGetFocusiSetFocus(llll)lGetDClcom/win32comext/axcontrol/src/PyIOleInPlaceSiteWindowless.cpplReleaseDC(llll)iInvalidateRectliInvalidateRgnii(llll)(llll)ScrollRect(llll)AdjustRectcom/win32comext/axcontrol/src/PyIOleInPlaceSiteWindowless.cppiilOnDefWindowMessagelcom/win32comext/axcontrol/src/PyIOleInPlaceSiteWindowless.cppc:\src\python-3.8\include\object.h,aHGGGGGGGc:\src\python-3.8\include\object.h:GetBorder(iiii)(iiii):RequestBorderSpace(iiii):SetBorderSpaceOO:SetActiveObjectGetBorderRequestBorderSpaceSetBorderSpaceSetActiveObjectPyIOleInPlaceUIWindowGetBorder(iiii)GetBordercom/win32comext/axcontrol/src/PyIOleInPlaceUIWindow.cpp(iiii)RequestBorderSpace(iiii)SetBorderSpaceNNSetActiveObjectaHGGGGGGPGGetClientSiteOcom/win32comext/axcontrol/src/PyIOleObject.cppOOSetHostNamesiCloseiOSetMonikeriiGetMonikerOcom/win32comext/axcontrol/src/PyIOleObject.cppOiiInitFromDataiGetClipboardDataOcom/win32comext/axcontrol/src/PyIOleObject.cppiNNii(iiii)DoVerbEnumVerbsOcom/win32comext/axcontrol/src/PyIOleObject.cppUpdateIsUpToDateGetUserClassIDOcom/win32comext/axcontrol/src/PyIOleObject.cppiGetUserTypeOcom/win32comext/axcontrol/src/PyIOleObject.cppizSetExtentiGetExtentcom/win32comext/axcontrol/src/PyIOleObject.cppOAdviseicom/win32comext/axcontrol/src/PyIOleObject.cppiUnadviseEnumAdviseOcom/win32comext/axcontrol/src/PyIOleObject.cppiGetMiscStatusicom/win32comext/axcontrol/src/PyIOleObject.cppzSetColorSchemec:\src\python-3.8\include\object.hO:SetClientSite:GetClientSiteOO:SetHostNamesi:CloseiO:SetMonikerii:GetMonikerOii:InitFromDatai:GetClipboardDataiOOii(iiii):DoVerb:EnumVerbs:Update:IsUpToDate:GetUserClassIDOi:GetUserTypeOi(ll):SetExtenti:GetExtentllO:Adviseii:Unadvise:EnumAdvisei:GetMiscStatusiO:SetColorSchemeSetClientSiteGetClientSiteSetHostNamesCloseSetMonikerGetMonikerInitFromDataGetClipboardDataDoVerbEnumVerbsUpdateIsUpToDateGetUserClassIDGetUserTypeSetExtentGetExtentAdviseUnadviseEnumAdviseGetMiscStatusSetColorSchemePyIOleObjectOSetClientSiteaHGGGGGGPGc:\src\python-3.8\include\object.h:GetPagescom/win32comext/axcontrol/src/PyISpecifyPropertyPages.cppGetPagesPyISpecifyPropertyPagesGetPagescom/win32comext/axcontrol/src/PyISpecifyPropertyPages.cppaHGGGGGG`Gc:\src\python-3.8\include\object.hlllOll(llll)(llll)OO:DrawThe function pointer argument is not supportedlllOi:GetColorSetiiO:Freezeii:UnfreezeiiO:SetAdvise:GetAdviseiiNDrawGetColorSetFreezeUnfreezeSetAdviseGetAdvisePyIViewObjectlllllllliiOOiiOOOODrawiiOFreezecom/win32comext/axcontrol/src/PyIViewObject.cppicom/win32comext/axcontrol/src/PyIViewObject.cppiUnfreezeiiOSetAdviseGetAdviseiiOcom/win32comext/axcontrol/src/PyIViewObject.cppHbHGGGGGG0Gc:\src\python-3.8\include\object.hiiO:GetExtentllGetExtentPyIViewObject2iiOGetExtentcom/win32comext/axcontrol/src/PyIViewObject2.cppllbHGGGGGGPG)FFFFF!F"FFF+F*FFFx89UNF FF'F(FFFFFF FPALN8.5ż"hN@Gpʼ"hN@GpsJ<~) &nɼ"hN@GpVD(Z2t˼"hN@GpƼ"hN@Gpȼ"hN@GpǼ"hN@GpB: ` 4H+)=sR {20 X" ( t0 t0 4eF$+.QbH6 NFO™k7E8+.@糗`+tN0 4З` {20  _,d7PBJ`] KRƽH+4:KQV ^>;)X" ( 0`44B: ` ,$4pLؠ U5qL؆4444.$4pL؀#N-+.`O7B5KQ44FFF1OY ȿ:/ۆ/O FF F[F*F F FV% >FQF FPFXשFh FFFFF)FHF&F%F&F"F3Fk!Pi)?@FF:/ۆ/O0Fv nr Z'B>Mm8gh j;Yi+-z4j;Yi+-zFU 8r+C+n4FF=FacH&8Fvޮ xOF!F y.YDFF1F:/ۆ/OFCj?e~ҦFސy(_%FEFF2F:/ۆ/O4yOʙ^AiMm8gh +F FIF`k;Yi+-z4<OFFi;Yi+-z:/ۆ/OFF:/ۆ/OiM^eQI+Idʏ[FF4FGF F@FF F0:s *Dw=FFF0:s*Dw=z0Gd<O8m FFFǝv\WX$5I?#3:OF F`*0FCPf0 q6M%+њpIܾ<,FF"d+.[w0t?>ôJQW3F4f6M%+CPf0 lP]0|q*+ /CPf0 ɐGM<>HHcS F}P6^AL ePfxdJ9 E $2q0X J$\?lSFMfA#"@<ԕ~XFPOrK0H<FG(HfAo)B 7&Fv6M%+Ft6M%+4᪽~ hlGF&;CtHLHihBF#FCPf0 [0scS9 [0FveX`6eVDESTpH<k+ /lRۈH<qo"Fw~iG(FLF_Mc tE:efW+FFPxHBrWLAiELWF^v7XYOK/(3;K,k_be6M%+BlWox6M%+ cS#F2FihUN~>kʇH(΃ &BZh~qqr(rqzssssssssttds4trrrrrrdrRrDrPs_register_onexit_function$_execute_onexit_table_crt_atexit_crt_at_quick_exit_cexit8_initterm9_initterm_ejterminateapi-ms-win-crt-heap-l1-1-0.dllapi-ms-win-crt-string-l1-1-0.dllapi-ms-win-crt-runtime-l1-1-0.dllG$GG%GG&GG@(G4G(GDGPGHH0LGHLG0HPG<H0QGHHQGXHPRGdHRGtH@SG HVG HPXG H^G H_G( H@`G@ H`GlHdGHeGHeGHfGHfGHgGHhG HlG$H@mG<HmGPH@nG`H oGxHPrGHsGHsGHtGH@uGHuGpHzGHzGHzGH{G<Hp~GPH~GdHPGtHGHGH@GHGH0GHGHGHGH0GHGH`GHЌGH@GHGH0GHGH`GHG HGHG(HБG4HGHGH G HGH`Gx%HPG%HG%HG%H`G%HG%HG%H@G%HG%HG%HФG&HPG&HG&H0G$&HG0&HG<&H@GH&HGP&HG\&H Gh&HGx&H0G8'H G(H`G(HG(HG(H0G(HG(HG*HGuDN@DH.?AUIUnknown@@DH.?AUIOleClientSite@@DH.?AUIOleObject@@DH.?AUIOleWindow@@DH.?AUIOleInPlaceUIWindow@@DH.?AUIOleInPlaceActiveObject@@DH.?AUIOleInPlaceFrame@@DH.?AUIOleInPlaceObject@@DH.?AUIOleInPlaceSite@@DH.?AUIViewObject@@DH.?AUIViewObject2@@DH.?AUIOleControl@@DH.?AUIOleControlSite@@DH.?AUISpecifyPropertyPages@@DH.?AUIOleInPlaceSiteEx@@DH.?AUIOleInPlaceSiteWindowless@@DH.?AUIObjectWithSite@@DH.?AVPyGatewayBase@@DH.?AUIDispatchEx@@DH.?AUIDispatch@@DH.?AUISupportErrorInfo@@DH.?AUIInternalUnwrapPythonObject@@DH.?AVPyGOleClientSite@@DH.?AVPyGOleObject@@DH.?AVPyGOleWindow@@DH.?AVPyGOleInPlaceObject@@DH.?AVPyGViewObject@@DH.?AVPyGViewObject2@@DH.?AVPyGOleControl@@DH.?AVPyGOleControlSite@@DH.?AVPyGOleInPlaceActiveObject@@DH.?AVPyGOleInPlaceSite@@DH.?AVPyGOleInPlaceSiteEx@@DH.?AVPyGOleInPlaceSiteWindowless@@DH.?AVPyGSpecifyPropertyPages@@DH.?AVPyGObjectWithSite@@DH.?AUIOleCommandTarget@@DH.?AVPyGOleCommandTarget@@DH.?AVPyGOleInPlaceUIWindow@@DH.?AVPyGOleInPlaceFrame@@DH.?AVPyIUnknown@@DH.?AVPyIBase@@DH.?AU_object@@DH.?AVPyIObjectWithSite@@DH.?AVPyIOleClientSite@@DH.?AVPyIOleCommandTarget@@DH.?AVPyIOleControl@@DH.?AVPyIOleControlSite@@DH.?AVPyIOleWindow@@DH.?AVPyIOleInPlaceActiveObject@@DH.?AVPyIOleInPlaceFrame@@DH.?AVPyIOleInPlaceUIWindow@@DH.?AVPyIOleInPlaceObject@@DH.?AVPyIOleInPlaceSite@@DH.?AVPyIOleInPlaceSiteEx@@DH.?AVPyIOleInPlaceSiteWindowless@@DH.?AVPyIOleObject@@DH.?AVPyISpecifyPropertyPages@@DH.?AVPyIViewObject@@DH.?AVPyIViewObject2@@DH.?AVtype_info@@DH.?AVbad_alloc@std@@DH.?AVexception@std@@DH.?AVbad_array_new_length@std@@6GJNPNWN]TULZ[4 0HX4VS_VERSION_INFO,,?\StringFileInfo8040904E4`$Commentshttps://github.com/mhammond/pywin32"CompanyName*FileDescription4 FileVersion3.8.300.0<InternalNameaxcontrol.pyd&LegalCopyright*LegalTrademarksDOriginalFilenameaxcontrol.pyd0ProductNamePyWin328 ProductVersion3.8.300.0DVarFileInfo$Translation PADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPAD000000#01060>0C0H0N0S0a0f0n0s0x0~00000000000000000001111!1&1-12171=1B1Q1V1^1c1h1n1s1111111111111111111112222#2(2.232A2F2N2S2X2^2c2q2v2~2222222222222222222 3Y3_3f3m3t3{33394?4F4M4T4[44 5555$555555556 6l666666<7777777 8Y8_8f8m8t8{88)9/969=9D9999: ::|::::::L;;;;;;;;,>&>->4>;>>>>>>?|?????? T00F0N0r00000V11111223k3v3|3334424]4j4v4|44444 5$5?5d5555555 66*6f666666 77>7U7_7q7777778(8Q8[8w8888888899(929]9l9999999999:::":8:N:d:z:::::::;*;@;V;h;z;;;;;; >>>>>D>M>T>[>~>>>>>>>>>>>? ???>?D?M?T?[?b?~?????????????0000$0+020N0T0]0d0k0r0y0000000000001 11.141=1D1K1n1t1}1111111111112 2"222B2R2b2r22222222233%3U33334E4u444555e5555"6R66667B7777"8r888929:::;';G;g;;;;;<'>>>"?R????@"0b0001B1r111222b222323b333"4R444t555 646j6666*7T7778J8t88849999*:T:::;J;;<"<:>)>3>X>f>y>>>>>>>>? ?5?B?e?????P 000E0m0000000111"1*1:1Y1c1q11111111122&2/2<2F2W2i2s22222222222 33#3.363G3Y3c3q333333333333 4#4/4E4Z4}44444445%525S5e5l5y5555556;6A6J66666667-797>7F7[7a7}777777888#8Z888888889,959=9M9a9q9999999999 :(:1:K:Q:p::::::::;;;1;J;Y;t;;;;;;;;;;<%<.>>N>\>q>>>>>> ??5?B?K?]?b?h?????`000)010H0`0j0x0000000000 11#1.161N1T1]1r1x11111122 22)222G2Q2x222222223$363=3L3d3v3}33333 444\4r44444444445 5*595N5Z5b5o5y55555555556H6R6a6666666 77)787R7^7f7w777777777 88)838B8S8_8g8s8}8888888889&9-9<9X999999999 ::9:~::::::::;.;7;>;K;d;v;};;;;;;;>">/>9>J>}>>>>>>>>? ?(?@?J?Y?n?z???????????p00 0'040T0f0m0|00000000 11!141F1M1\1u1{11111,2x222222223=3G3U33333334434B4W4c4k4z4444444555(525_5i5x555555556616=6E6T6^6666667-7;7D7N7i7|777777788%8:8@8G8T8u88888888899(9/9<9U9999::):3:A:R:_:h:r:z:::::::::::7;A;O;j;w;;;;;;;;;;;< <<$<- >L>b>w>>>>>>>>>>>??"?/?8?B?J?W?i?s???????????!0-060R0z00000000 11 1-151H1`1j1x1111111111222"2*272I2S2a2r2222222222223 33C3M3[3q3~333333333344&454T4f4u44444 5Q5[5t5}5555556646J6Q6`6t666666667747F7U7t7777777+818:8|888889 99"9O9Y9g9|9999999999:::3:<:R:i:::::::::;;;,;D;V;e;;;;;<>>!>)>O>Y>g>|>>>>>>>>?+?4?E?K?????????0!0/0I0V0_0l0t000000001`1j1x1111112 2202=2F2c2i22222223333<3R3d3v33333333 4$464E4d4v4}44444445505:5T5f5m5|555555566$6Z6a6n66666667 767@7Y7b7y777788\8r8888888899*9S9]9l999999999 :":.:6:E:O:j:::::::; ;;;-;7;N;T;];r;x;;;;;;;<<%3>B>Z>t>~>>>>>>>>>??%?3?I?V?_?l?v?????? 00+040C0M0h0000000000 11&101>1e1r1{11111111 22$2.2J2n2x222222222343>3L3f3s3|3333344(4;4E4[44444444455&5/5<5F5W5i5s55555555555666"6*6:6O6Y6g6}6666666677767B7K7^7f7l7{7777778 88#8+8J8d8n8|888888899!9+999a9n9w999999999:::(:;:E:S:i:v:::::::::; ;;#;:;T;^;;;;;;;;;;<<%<,<8>>,>E>L>X>k>r>>>>>>??-?6?H?R?o?x????????0 0(0T0Z0u0000000001%1N1X1f1s1z11111122,262O2X2m2z2222222313L3V3o3x33333334434=4V4_4v4444444445+515P5Z5x55555555566'6D6V6]6l6666666 77/787M7Z7y7777777778$8+8:8U8[8888889*9?9I9g9}9999999:!:>:D:M:b:h:w:::::; ;;2;=;L;e;k;;;;;8>N>W>>>>>>>???8?P?Z?h?}?????????00>0K0T0a0i000000000111>1D1M1b1h1y111111 22>2G2e222222233Y3333333444<4E4\4i44444444445585c5555555556656;6f666666=7G7j777777778y88888889"9.9U9999999::::: :&:,:2:8:>:D:J:P:V:\:b:h:n:t:z:::::::::::::::::::::::; ;;;;";(;.;4;:;@;F;L;R;X;^;d;j;p;v;|;;;;;;;;;;;;;;;;;;;;;;<< <<<<$<*<0<6<<>>>???0?V?k?r?x????0'0/0H0b0j000)191P1a1r1w11111 22$262K222U33344#484P4V4f4444445<5m5555555k6t6|666677%70797L77+8J8T8e8888889@9Q9n99999:::):X:`:u::::::::::;;,;4;>;T;];h;o;;;;;;;;;;;;;;;;;< <<< <*<:&>N>U>d>j>p>v>|>>>>>>>>>>>>>>>>>>>>>>?? ????$?*?0?6?>> >>>>> >$>(>,>0>4>8><>@>D>H>L>P>T>X>\>`>d>h>l>p>t>x>|>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>??? ????? ?$?(?,?0?4?8?>>>>>>>T1X1\1`1d1h1l1p1 33333 3$3(344444444$6(6,6064686<6@6$9(9,9094989<9@9::::::::L>P>T>X>\>`>d>h>??????? L066666666777777774:8:<:@:D:H:L:P:; ;;;;; ;$;@@4444455 5 5$5(5D5H555566 686H6L6P6X6p66666666666666677,7074787@7X7h7l7p7t7x777777777777778 8$8(808H8X8\8`8d8l88888888888899 99,9<9@9D9H9L9T9l9|999999999999999::: :::: :8:<:T:d:h:l:p:x::::::::::::;; ;8;<;T;d;h;l;t;;;;;;;;;;;;;;;;;;<<<4<8>> >>>>> >$>(>,>4>L>P>h>l>>>>>>>>>>>>? ?? ?0?4?8?>>>>$><>L>P>`>d>h>l>p>x>>>>>>>>>>>>>>?? ?$?4?8?H?L?P?T?X?\?d?|??????????????`00 0000,000@0D0H0L0P0T0\0t000000000000000001111(181<1L1P1T1X1\1`1d1h1p111111111111122222 2$2,2D2T2X2h2l2p2t2x22222222222223333 383H3L3\3`3h33333333333333344777778(848T8`88888889909<9\9h9999999 ::8:D:d:p:::::::; ;@;L;l;x;;;;;;;<(> >>(>0000 0$00040@0D0t0x000000000000001 11181<1H1L1h1l1x1|1111111111111112 22282<2H2L2X2\2h2l2x2|22222222222223 333(3,383<3X3\3h3l3x3|3333333333333334 444(4,4H4L4X4\4h4l4x4|4444444444444444455(5,585<5H5L5h5l5x5|555555555555555556 666(6,686<6H6L6X6\6h6l6x6|66666666666667 777(7,787<7X7\77777 808X8x88888 9,9P9p99999:(:T:t::::: ;(;H;p;;;;<(,>P>p>>>>? ?@?X?t??PK Y03K7!win32comext/axcontrol/__init__.pyUT  YZx`ux # See if we have a special directory for the binaries (for developers) import win32com win32com.__PackageSupportBuildPath__(__path__) PK {Rwin32comext/directsound/UT Zx`Zx`ux PK {Rwin32comext/directsound/test/UT Zx`Zx`ux PK Y03K(AA(win32comext/directsound/test/__init__.pyUT  YZx`ux # This is a Python package, imported by the win32com test suite. PK ѳP ~UU)win32comext/directsound/test/ds_record.pyUT l_Zx`ux import pywintypes import struct import win32event, win32api import os import win32com.directsound.directsound as ds def wav_header_pack(wfx, datasize): return struct.pack('<4sl4s4slhhllhh4sl', 'RIFF', 36 + datasize, 'WAVE', 'fmt ', 16, wfx.wFormatTag, wfx.nChannels, wfx.nSamplesPerSec, wfx.nAvgBytesPerSec, wfx.nBlockAlign, wfx.wBitsPerSample, 'data', datasize); d = ds.DirectSoundCaptureCreate(None, None) sdesc = ds.DSCBUFFERDESC() sdesc.dwBufferBytes = 352800 # 2 seconds sdesc.lpwfxFormat = pywintypes.WAVEFORMATEX() sdesc.lpwfxFormat.wFormatTag = pywintypes.WAVE_FORMAT_PCM sdesc.lpwfxFormat.nChannels = 2 sdesc.lpwfxFormat.nSamplesPerSec = 44100 sdesc.lpwfxFormat.nAvgBytesPerSec = 176400 sdesc.lpwfxFormat.nBlockAlign = 4 sdesc.lpwfxFormat.wBitsPerSample = 16 print(sdesc) print(d) buffer = d.CreateCaptureBuffer(sdesc) event = win32event.CreateEvent(None, 0, 0, None) notify = buffer.QueryInterface(ds.IID_IDirectSoundNotify) notify.SetNotificationPositions((ds.DSBPN_OFFSETSTOP, event)) buffer.Start(0) win32event.WaitForSingleObject(event, -1) data = buffer.Update(0, 352800) fname=os.path.join(win32api.GetTempPath(), 'test_directsound_record.wav') f = open(fname, 'wb') f.write(wav_header_pack(sdesc.lpwfxFormat, 352800)) f.write(data) f.close() PK ѳPg422'win32comext/directsound/test/ds_test.pyUT l_Zx`ux import unittest import struct import sys import os import pywintypes import win32event, win32api import os from pywin32_testutil import TestSkipped import win32com.directsound.directsound as ds import pythoncom # next two lines are for for debugging: # import win32com # import directsound as ds WAV_FORMAT_PCM = 1 WAV_HEADER_SIZE = struct.calcsize('<4sl4s4slhhllhh4sl') def wav_header_unpack(data): (riff, riffsize, wave, fmt, fmtsize, format, nchannels, samplespersecond, datarate, blockalign, bitspersample, data, datalength) \ = struct.unpack('<4sl4s4slhhllhh4sl', data) if riff != b'RIFF': raise ValueError('invalid wav header') if fmtsize != 16 or fmt != b'fmt ' or data != b'data': # fmt chuck is not first chunk, directly followed by data chuck # It is nowhere required that they are, it is just very common raise ValueError('cannot understand wav header') wfx = pywintypes.WAVEFORMATEX() wfx.wFormatTag = format wfx.nChannels = nchannels wfx.nSamplesPerSec = samplespersecond wfx.nAvgBytesPerSec = datarate wfx.nBlockAlign = blockalign wfx.wBitsPerSample = bitspersample return wfx, datalength def wav_header_pack(wfx, datasize): return struct.pack('<4sl4s4slhhllhh4sl', b'RIFF', 36 + datasize, b'WAVE', b'fmt ', 16, wfx.wFormatTag, wfx.nChannels, wfx.nSamplesPerSec, wfx.nAvgBytesPerSec, wfx.nBlockAlign, wfx.wBitsPerSample, b'data', datasize); class WAVEFORMATTest(unittest.TestCase): def test_1_Type(self): 'WAVEFORMATEX type' w = pywintypes.WAVEFORMATEX() self.assertTrue(type(w) == pywintypes.WAVEFORMATEXType) def test_2_Attr(self): 'WAVEFORMATEX attribute access' # A wav header for a soundfile from a CD should look like this... w = pywintypes.WAVEFORMATEX() w.wFormatTag = pywintypes.WAVE_FORMAT_PCM w.nChannels = 2 w.nSamplesPerSec = 44100 w.nAvgBytesPerSec = 176400 w.nBlockAlign = 4 w.wBitsPerSample = 16 self.assertTrue(w.wFormatTag == 1) self.assertTrue(w.nChannels == 2) self.assertTrue(w.nSamplesPerSec == 44100) self.assertTrue(w.nAvgBytesPerSec == 176400) self.assertTrue(w.nBlockAlign == 4) self.assertTrue(w.wBitsPerSample == 16) class DSCAPSTest(unittest.TestCase): def test_1_Type(self): 'DSCAPS type' c = ds.DSCAPS() self.assertTrue(type(c) == ds.DSCAPSType) def test_2_Attr(self): 'DSCAPS attribute access' c = ds.DSCAPS() c.dwFlags = 1 c.dwMinSecondarySampleRate = 2 c.dwMaxSecondarySampleRate = 3 c.dwPrimaryBuffers = 4 c.dwMaxHwMixingAllBuffers = 5 c.dwMaxHwMixingStaticBuffers = 6 c.dwMaxHwMixingStreamingBuffers = 7 c.dwFreeHwMixingAllBuffers = 8 c.dwFreeHwMixingStaticBuffers = 9 c.dwFreeHwMixingStreamingBuffers = 10 c.dwMaxHw3DAllBuffers = 11 c.dwMaxHw3DStaticBuffers = 12 c.dwMaxHw3DStreamingBuffers = 13 c.dwFreeHw3DAllBuffers = 14 c.dwFreeHw3DStaticBuffers = 15 c.dwFreeHw3DStreamingBuffers = 16 c.dwTotalHwMemBytes = 17 c.dwFreeHwMemBytes = 18 c.dwMaxContigFreeHwMemBytes = 19 c.dwUnlockTransferRateHwBuffers = 20 c.dwPlayCpuOverheadSwBuffers = 21 self.assertTrue(c.dwFlags == 1) self.assertTrue(c.dwMinSecondarySampleRate == 2) self.assertTrue(c.dwMaxSecondarySampleRate == 3) self.assertTrue(c.dwPrimaryBuffers == 4) self.assertTrue(c.dwMaxHwMixingAllBuffers == 5) self.assertTrue(c.dwMaxHwMixingStaticBuffers == 6) self.assertTrue(c.dwMaxHwMixingStreamingBuffers == 7) self.assertTrue(c.dwFreeHwMixingAllBuffers == 8) self.assertTrue(c.dwFreeHwMixingStaticBuffers == 9) self.assertTrue(c.dwFreeHwMixingStreamingBuffers == 10) self.assertTrue(c.dwMaxHw3DAllBuffers == 11) self.assertTrue(c.dwMaxHw3DStaticBuffers == 12) self.assertTrue(c.dwMaxHw3DStreamingBuffers == 13) self.assertTrue(c.dwFreeHw3DAllBuffers == 14) self.assertTrue(c.dwFreeHw3DStaticBuffers == 15) self.assertTrue(c.dwFreeHw3DStreamingBuffers == 16) self.assertTrue(c.dwTotalHwMemBytes == 17) self.assertTrue(c.dwFreeHwMemBytes == 18) self.assertTrue(c.dwMaxContigFreeHwMemBytes == 19) self.assertTrue(c.dwUnlockTransferRateHwBuffers == 20) self.assertTrue(c.dwPlayCpuOverheadSwBuffers == 21) class DSBCAPSTest(unittest.TestCase): def test_1_Type(self): 'DSBCAPS type' c = ds.DSBCAPS() self.assertTrue(type(c) == ds.DSBCAPSType) def test_2_Attr(self): 'DSBCAPS attribute access' c = ds.DSBCAPS() c.dwFlags = 1 c.dwBufferBytes = 2 c.dwUnlockTransferRate = 3 c.dwPlayCpuOverhead = 4 self.assertTrue(c.dwFlags == 1) self.assertTrue(c.dwBufferBytes == 2) self.assertTrue(c.dwUnlockTransferRate == 3) self.assertTrue(c.dwPlayCpuOverhead == 4) class DSCCAPSTest(unittest.TestCase): def test_1_Type(self): 'DSCCAPS type' c = ds.DSCCAPS() self.assertTrue(type(c) == ds.DSCCAPSType) def test_2_Attr(self): 'DSCCAPS attribute access' c = ds.DSCCAPS() c.dwFlags = 1 c.dwFormats = 2 c.dwChannels = 4 self.assertTrue(c.dwFlags == 1) self.assertTrue(c.dwFormats == 2) self.assertTrue(c.dwChannels == 4) class DSCBCAPSTest(unittest.TestCase): def test_1_Type(self): 'DSCBCAPS type' c = ds.DSCBCAPS() self.assertTrue(type(c) == ds.DSCBCAPSType) def test_2_Attr(self): 'DSCBCAPS attribute access' c = ds.DSCBCAPS() c.dwFlags = 1 c.dwBufferBytes = 2 self.assertTrue(c.dwFlags == 1) self.assertTrue(c.dwBufferBytes == 2) class DSBUFFERDESCTest(unittest.TestCase): def test_1_Type(self): 'DSBUFFERDESC type' c = ds.DSBUFFERDESC() self.assertTrue(type(c) == ds.DSBUFFERDESCType) def test_2_Attr(self): 'DSBUFFERDESC attribute access' c = ds.DSBUFFERDESC() c.dwFlags = 1 c.dwBufferBytes = 2 c.lpwfxFormat = pywintypes.WAVEFORMATEX() c.lpwfxFormat.wFormatTag = pywintypes.WAVE_FORMAT_PCM c.lpwfxFormat.nChannels = 2 c.lpwfxFormat.nSamplesPerSec = 44100 c.lpwfxFormat.nAvgBytesPerSec = 176400 c.lpwfxFormat.nBlockAlign = 4 c.lpwfxFormat.wBitsPerSample = 16 self.assertTrue(c.dwFlags == 1) self.assertTrue(c.dwBufferBytes == 2) self.assertTrue(c.lpwfxFormat.wFormatTag == 1) self.assertTrue(c.lpwfxFormat.nChannels == 2) self.assertTrue(c.lpwfxFormat.nSamplesPerSec == 44100) self.assertTrue(c.lpwfxFormat.nAvgBytesPerSec == 176400) self.assertTrue(c.lpwfxFormat.nBlockAlign == 4) self.assertTrue(c.lpwfxFormat.wBitsPerSample == 16) def invalid_format(self, c): c.lpwfxFormat = 17 def test_3_invalid_format(self): 'DSBUFFERDESC invalid lpwfxFormat assignment' c = ds.DSBUFFERDESC() self.assertRaises(ValueError, self.invalid_format, c) class DSCBUFFERDESCTest(unittest.TestCase): def test_1_Type(self): 'DSCBUFFERDESC type' c = ds.DSCBUFFERDESC() self.assertTrue(type(c) == ds.DSCBUFFERDESCType) def test_2_Attr(self): 'DSCBUFFERDESC attribute access' c = ds.DSCBUFFERDESC() c.dwFlags = 1 c.dwBufferBytes = 2 c.lpwfxFormat = pywintypes.WAVEFORMATEX() c.lpwfxFormat.wFormatTag = pywintypes.WAVE_FORMAT_PCM c.lpwfxFormat.nChannels = 2 c.lpwfxFormat.nSamplesPerSec = 44100 c.lpwfxFormat.nAvgBytesPerSec = 176400 c.lpwfxFormat.nBlockAlign = 4 c.lpwfxFormat.wBitsPerSample = 16 self.assertTrue(c.dwFlags == 1) self.assertTrue(c.dwBufferBytes == 2) self.assertTrue(c.lpwfxFormat.wFormatTag == 1) self.assertTrue(c.lpwfxFormat.nChannels == 2) self.assertTrue(c.lpwfxFormat.nSamplesPerSec == 44100) self.assertTrue(c.lpwfxFormat.nAvgBytesPerSec == 176400) self.assertTrue(c.lpwfxFormat.nBlockAlign == 4) self.assertTrue(c.lpwfxFormat.wBitsPerSample == 16) def invalid_format(self, c): c.lpwfxFormat = 17 def test_3_invalid_format(self): 'DSCBUFFERDESC invalid lpwfxFormat assignment' c = ds.DSCBUFFERDESC() self.assertRaises(ValueError, self.invalid_format, c) class DirectSoundTest(unittest.TestCase): # basic tests - mostly just exercise the functions def testEnumerate(self): '''DirectSoundEnumerate() sanity tests''' devices = ds.DirectSoundEnumerate() # this might fail on machines without a sound card self.assertTrue(len(devices)) # if we have an entry, it must be a tuple of size 3 self.assertTrue(len(devices[0]) == 3) def testCreate(self): '''DirectSoundCreate()''' try: d = ds.DirectSoundCreate(None, None) except pythoncom.com_error as exc: if exc.hresult != ds.DSERR_NODRIVER: raise raise TestSkipped(exc) def testPlay(self): '''Mesdames et Messieurs, la cour de Devin Dazzle''' # look for the test file in various places candidates = [ os.path.dirname(__file__), os.path.dirname(sys.argv[0]), # relative to 'testall.py' in the win32com test suite. os.path.join(os.path.dirname(sys.argv[0]), '../../win32comext/directsound/test'), '.', ] for candidate in candidates: fname=os.path.join(candidate, "01-Intro.wav") if os.path.isfile(fname): break else: raise TestSkipped("Can't find test .wav file to play") with open(fname, 'rb') as f: hdr = f.read(WAV_HEADER_SIZE) wfx, size = wav_header_unpack(hdr) d = ds.DirectSoundCreate(None, None) d.SetCooperativeLevel(None, ds.DSSCL_PRIORITY) sdesc = ds.DSBUFFERDESC() sdesc.dwFlags = ds.DSBCAPS_STICKYFOCUS | ds.DSBCAPS_CTRLPOSITIONNOTIFY sdesc.dwBufferBytes = size sdesc.lpwfxFormat = wfx buffer = d.CreateSoundBuffer(sdesc, None) event = win32event.CreateEvent(None, 0, 0, None) notify = buffer.QueryInterface(ds.IID_IDirectSoundNotify) notify.SetNotificationPositions((ds.DSBPN_OFFSETSTOP, event)) buffer.Update(0, f.read(size)) buffer.Play(0) win32event.WaitForSingleObject(event, -1) class DirectSoundCaptureTest(unittest.TestCase): # basic tests - mostly just exercise the functions def testEnumerate(self): '''DirectSoundCaptureEnumerate() sanity tests''' devices = ds.DirectSoundCaptureEnumerate() # this might fail on machines without a sound card self.assertTrue(len(devices)) # if we have an entry, it must be a tuple of size 3 self.assertTrue(len(devices[0]) == 3) def testCreate(self): '''DirectSoundCreate()''' try: d = ds.DirectSoundCaptureCreate(None, None) except pythoncom.com_error as exc: if exc.hresult != ds.DSERR_NODRIVER: raise raise TestSkipped(exc) def testRecord(self): try: d = ds.DirectSoundCaptureCreate(None, None) except pythoncom.com_error as exc: if exc.hresult != ds.DSERR_NODRIVER: raise raise TestSkipped(exc) sdesc = ds.DSCBUFFERDESC() sdesc.dwBufferBytes = 352800 # 2 seconds sdesc.lpwfxFormat = pywintypes.WAVEFORMATEX() sdesc.lpwfxFormat.wFormatTag = pywintypes.WAVE_FORMAT_PCM sdesc.lpwfxFormat.nChannels = 2 sdesc.lpwfxFormat.nSamplesPerSec = 44100 sdesc.lpwfxFormat.nAvgBytesPerSec = 176400 sdesc.lpwfxFormat.nBlockAlign = 4 sdesc.lpwfxFormat.wBitsPerSample = 16 buffer = d.CreateCaptureBuffer(sdesc) event = win32event.CreateEvent(None, 0, 0, None) notify = buffer.QueryInterface(ds.IID_IDirectSoundNotify) notify.SetNotificationPositions((ds.DSBPN_OFFSETSTOP, event)) buffer.Start(0) win32event.WaitForSingleObject(event, -1) event.Close() data = buffer.Update(0, 352800) fname=os.path.join(win32api.GetTempPath(), 'test_directsound_record.wav') f = open(fname, 'wb') f.write(wav_header_pack(sdesc.lpwfxFormat, 352800)) f.write(data) f.close() if __name__ == '__main__': unittest.main() PK Y03K7Q]]#win32comext/directsound/__init__.pyUT  YZx`ux # See if we have a special directory for the binaries (for developers) import win32com win32com.__PackageSupportBuildPath__(__path__) PK x$nQ,9'win32comext/directsound/directsound.pydUT ^_ux MZ@ !L!This program cannot be run in DOS mode. $ sssLssķrsķrsķrsķrsUrsrsrsrsrsssUrsUrsUrsRichsPEL^_! ``pV@@X( \04 PT@p.text{_` `.rdatapd@@.data8@.gfidsL@@.rsrc\ @@.reloc4 0@BpVj4VpVjhVV[ ̡pVj4jh$VV~[ ̡pVj4XVpVjhV\VT[ ̡pVj4hVpVjhVlV$[ ̡pVj4jhVVZ ̡pVj4VpVjhVVZ h(Vh0Vj5lqVVhlVqVh0oVt$t.F V(qVxt VpVWF^Y3^Ỹ|$ L$t; ,qVuD$Áy Vt0qVhV0pV3ËD$VF V(qVxt VpVWF^VF V(qVxt VpVD$FF^̋D$t jPy=QVj-=t$t9F V(qVxt VpVL$ FF^Y3^YD$Vt jV<^̍A̡(qVxtVt$VpV^ËD$̋D$̋D$ uP4qVY̋D$tu D$%4qVQh؇Vt$pVtj(<$t ȃn3Ỹ|$ T$t;,qVuD$Áz@Vt0qVhV0pV3ËD$J BAVF@V(qVxt VpVWF fFF$F ,qV,qVF^UdjhlVPd%VWF F@V(qVxt VpV}F ~GfFGF$taj:EEt(wqVFFƋMd _^]3FFƋMd _^],qVM_,qVFd ^]̋At uP4qVYVt$t!Ftu P4qVj(V":^t$8qVtg4V:utP:Quu3L$ T$u;; ,qVu B*A;qVtPqVh@V0pVÍABL$ T$%pVUjhlVdPd%Qj(69EEtuMd ]ËM3d ]VFtu P4qVD$t j(V9^̡(qVxtVt$VpV^ËD$QhVt$pVuYVje8t$t.F`V(qVxt VpVWF^Y3^Ỹ|$ L$t; ,qVuD$Áy`Vt0qVhV0pV3ËD$VF`V(qVxt VpVWF^VF`V(qVxt VpVD$FF^̋D$t jPY7QVj 7t$t9F`V(qVxt VpVL$ FF^Y3^YD$Vt jV6^̍A̋D$%qṼWt$qVu3_ÍD$PhVt$(pV tS39\$u9,qVtD$ PSqVt4\$ VpVSWQ(VpV^yWh$VqV[3_á,qV[_,qṼ Wt$D$ qVD$ PD$ Ph0Vt$$pVtlD$Pt$ qVtV|$uTpVD$u PpVD$VpVt$t$ WQVpV^yWhHVqV3_ á,qV_,qV UjhlVdPd%S]SEEEqVEu3[Md ]ÍEPEPh\Vu pVtVu~Vt'0qVhtV0pV3^[Md ]ËEtjMQhHVPqVt@uW pVuUERVPQ WpV_y!VhVqV^3[Md ]j3EEt u3MX^[d ]Wt$qVtEhČVt$pVt/VpVWQVpV^yWhЌVqV3_á,qV_,qVUjhmVdPd%QSuqV؃u3[Md ]hVu pVtWjh2EEt 3VEpVOQSRVpV^y!ShVqV3_[Md ]NjM_[d ]QWt$ qVtJh،Vt$pVt4VpVD$PWQ VpV^yWhVqV3_Yt$pV_YQWt$ qVtND$PhVt$pV t3VpVt$WQ$VpV^yWhVqV3_Yá,qV_,qVYQVt$ t$qVVFV^YV%qVVVqVD$t jV 1^Ujh?mVdPd%QVj0uEt)uqVVFV^Md ]ËM3^d ]̋D$̋D$ uP4qVY%qṼVt$D$PD$ D$PhVVpVu^WVt$V`qVhWWhqVttO3ɍF#FFA_^Ujh_mVdPd%QSuqV؃u3[Md ]hVu pVtWj /EEt 3VEpVOQSR VpV^y!ShVqV3_[Md ]NjM_[d ]UjhxmVdPd%QSuqV؃u3[Md ]h$Vu pVtWj,.EEt qV3VEpVOjjQSRVpV^y!Sh0VqV3_[Md ]NjM_[d ]QWt$ qVtJh3VEpVOQSR VpV^y!Sh0VqV3_[Md ]NjM_[d ]UjhXnVdPd%QSuqV؃u3[Md ]h8Vu pVtWjLEEt qV3VEpVOjjQSRVpV^y!ShDVqV3_[Md ]NjM_[d ]QWt$ qVtJhPVt$pVt4VpVD$PWQVpV^yWh\VqV3_Yt$pV_ỸWt$qVu3_hVt$pVtVD$D$ pVD$ PD$ PWQVpVyWhēVqV3^_SjpV؃u[^_t$ =pV׋5pVPjSt$ PjSփ [^_̃Wt$D$D$ qVtBD$PD$ PhhVt$ pVt"D$x@Vt0qVhxV0pV3_VpVL$ QjWRVpV^yWhVqV3_á,qV_,qVQWt$ qVtND$PhؓVt$pV t3VpVt$WQ$VpV^yWhVqV3_Yá,qV_,qVYWt$qVtEhVt$pVt/VpVWQ(VpV^yWhVqV3_á,qV_,qṼ Wt$(D$$D$ D$qVu3_ ÍD$PD$ PD$(PhVt$<pVtSU-pVVD$D$D$D$t$$D$PD$PD$$PD$,Pt$F;|ߋ\$jjD$l$Pt$U`0qVhV0pV 3_^][ étQqV|3ɺ Q 3l$~)@VD$PD$@ 4 zF;|pV UWSQ VpVUyWhVqV3_^][ á,qV_^],qV[ QVt$ t$qVVFFW^YUdjhnVPd%VVVdqVFtu P4qVqVMd ^]Vt$F@TtpVqV|aN W~tQA@TtEtAG;qVu6D$Q4 qVT$ PWqV _^_3^3^UdjhnVPd%VVEVdqVFtu P4qVqVEt jVMd ^]UjhnVdPd%QVjeuEt0uqVVFFW^Md ]ËM3^d ]̋D$̋D$ uP4qVYUjhnVdPd%$SWE3PE}PhؖVu }3ۉ}pVu_[Md ]ËEtjMQhHVPqVEt;,qVtMQPqVtu]VpVuEPS VpV^yh(VjS\qV 8jEEtu3GE#EtPQM_[d ]UjhoVdPd%SVWLqVE]jEpVttEt PqV ,qV,qV=pVPjV׃ uBu qVPjV׃u,uqVPjV׃uVu qVup3SpVMd _^[]hVt$ pVuWjqVu_SVpVWhJV0 VpVDqVtu W4qV^[3_Åy&u W4qVh(VjS\qV 3^[_^[_UjhoVdPd%$SWE3PE}PhhVu }3ۉ}pVu_[Md ]ËEtjMQhHVPqVEt;,qVtMQPqVtu]VpVuEPS! VpV^yh(VjS\qV 8jF EEtuU3GE#EtPQM_[d ]hVt$ pVuWjqVu_SVpVWhJVl VpVDqVtu W4qV^[3_Åy&u W4qVh(VjS\qV 3^[_^[_qVu3VhhpVhhVV׃ %h@h VV׃  hh VV׃ hh4VV׃ hhPVV׃ hhlVV׃ jhVV׃ jhVV׃ |jhVV׃ fjhVV׃ PjhȝVV׃ :jhܝVV׃ $j hVV׃ jhVV׃ hh(VV׃ jdh@VV׃ h@ hTVV׃ jhhVV׃ hhVV׃ jhVV׃ kh'hVV׃ RhhVV׃ 9jhVV׃ #jh̞VV׃  hh؞VV׃ j hVV׃ jhVV׃ jhVV׃ jh(VV׃ jhEV+PQgYYt'x$|!EE3Ɂ8ËeE2 Ut}u 3W]U=Wt} uuquiYY]U존V3Wuȃu hWYY#E]U존V3Wȃu]uhWYY]UuYH]VUEVVt j VYY^]U]UE t3t tt3@0uuY}PY] jhVLjBYu34E]e=WtjWite hhV- $gV@ $ rVhrV YYu)t hrVhqV YYW2ۈ]EDL >tVGYtu ju6SW3@Ê]uYj hV:W3OHW"Ee=Wtj%WEju]YY3Ʉu"Yj h V} u9=W3et t]1]SWuuSWuuSWusuu"uSPu[SVuSVu`tuHSWuout5SWu:$MQ0h]Vuu uËe3uEUV5Vu3@uu u^] U]U} u uu u ] UaaEAV]UVuXV^]aaAVVUVu%$V^]aaA,V$VUVFV `PEPO YY^]UEVaaA]AVP YÍAVP YÍAVP YUVFVP EYt j V}YY^]UVFVP EYt j VPYY^]UVFVP EYt j V#YY^]U Mht N׃;r_^[SV V V;sW>t #׃;r_^[Ë qV39hV; Vu(Uj(pVu$pVh pVPpV]U$jtjY)W WW W5W=Wf0Wf $WfWfWf%Wf-W(WEWE WE,WhW W$WW W(WjXkǀ,WjXk VLjX VLhDV]Uj]UjtM)W WW W5W=Wf0Wf $WfWfWf%Wf-W(WEWE WE,W W$WW W(WjXkM,WhDV]U jtM)W WW W5W=Wf0Wf $WfWfWf%Wf-W(WEWE WE,W W$WW W} v }ue } vE HE E @(WjXkM,WeE@EE;E sEMU 0WhDV]%pV% pV%$pV%(pV%,pV%0pV%4pV%8pV%ZxpfB26$^:Lxd6Tf,<P^p$zz<Pd.xR*tBJ|P9hVV0VPVVVVV0V`VVV:DSBCAPSThe object is not a PyDSBCAPS objectPyDSBCAPSdwFlagsFlags that specify buffer-object capabilities.dwBufferBytesSize of the buffer, in bytesdwUnlockTransferRateSpecifies the rate, in kilobytes per second, at which data is transferred to the buffer memory when IDirectSoundBuffer::Update is called. High-performance applications can use this value to determine the time required for IDirectSoundBuffer::Update to execute. For software buffers located in system memory, the rate will be very high because no processing is required. For hardware buffers, the rate might be slower because the buffer might have to be downloaded to the sound card, which might have a limited transfer rate.dwPlayCpuOverheadc:\src\python-3.8\include\object.h:DSBUFFERDESCThe object is not a PyDSBUFFERDESC objectPyDSBUFFERDESCdwFlagsIdentifies the capabilities to include when creating a new DirectSoundBuffer objectdwBufferBytesSize of the new buffer, in bytes. This value must be 0 when creating primary buffers. For secondary buffers, the minimum and maximum sizes allowed are specified by DSBSIZE_MIN and DSBSIZE_MAXlpwfxFormatStructure specifying the waveform format for the buffer. This value must be None for primary buffers. The application can use IDirectSoundBuffer::SetFormat to set the format of the primary buffer.lpwfxFormatlpwfxFormat must be a WAVEFORMATEX instancec:\src\python-3.8\include\object.h:DSCAPSThe object is not a PyDSCAPS objectPyDSCAPSTypedwFlagsSpecifies device capabilities.dwMinSecondarySampleRateMinimum sample rate supported by this device's hardware secondary sound buffers.dwMaxSecondarySampleRateMaximum sample rate supported by this device's hardware secondary sound buffers.dwPrimaryBuffersNumber of primary buffers supported. This value will always be 1.dwMaxHwMixingAllBuffersSpecifies the total number of buffers that can be mixed in hardware. This member can be less than the sum of dwMaxHwMixingStaticBuffers and dwMaxHwMixingStreamingBuffers. Resource tradeoffs frequently occur.dwMaxHwMixingStaticBuffersSpecifies the maximum number of static sound buffers.dwMaxHwMixingStreamingBuffersSpecifies the maximum number of streaming sound buffers.dwFreeHwMixingAllBuffersDescription of the free mixing hardware capabilities of the device. An application can use these values to determine whether hardware resources are available for allocation to a secondary sound buffer. Also, by comparing this value to the members that specify maximum mixing capabilities, the resources that are already allocated can be determined. dwFreeHwMixingStaticBuffersDescription of the free hardware mixing capabilities of the device. An application can use this value to determine whether hardware resources are available for allocation to a secondary sound buffer. Also, by comparing these values to the members that specify maximum mixing capabilities, the resources that are already allocated can be determined.dwFreeHwMixingStreamingBuffersDescription of the free hardware mixing capabilities of the device. An application can use this value to determine whether hardware resources are available for allocation to a secondary sound buffer. Also, by comparing these values to the members that specify maximum mixing capabilities, the resources that are already allocated can be determined.dwMaxHw3DAllBuffersDescription of the hardware 3-D positional capabilities of the device.dwMaxHw3DStaticBuffersDescription of the hardware 3-D positional capabilities of the device. dwMaxHw3DStreamingBuffersDescription of the hardware 3-D positional capabilities of the device.dwFreeHw3DAllBuffersDescription of the free, or unallocated, hardware 3-D positional capabilities of the device.dwFreeHw3DStaticBuffersDescription of the free, or unallocated, hardware 3-D positional capabilities of the device.dwFreeHw3DStreamingBuffersDescription of the free, or unallocated, hardware 3-D positional capabilities of the device.dwTotalHwMemBytesc:\src\python-3.8\include\object.hSize, in bytes, of the amount of memory on the sound card that stores static sound buffers.dwFreeHwMemBytesSize, in bytes, of the free memory on the sound card.dwMaxContigFreeHwMemBytesSize, in bytes, of the largest contiguous block of free memory on the sound card.dwUnlockTransferRateHwBuffersDescription of the rate, in kilobytes per second, at which data can be transferred to hardware static sound buffers. This and the number of bytes transferred determines the duration of a call to the IDirectSoundBuffer::Update method.dwPlayCpuOverheadSwBuffersDescription of the processing overhead, as a percentage of the central processing unit, needed to mix software buffers (those located in main system memory). This varies according to the bus type, the processor type, and the clock speed. The unlock transfer rate for software buffers is 0 because the data need not be transferred anywhere. Similarly, the play processing overhead for hardware buffers is 0 because the mixing is done by the sound device.:DSCBCAPSThe object is not a PyDSCBCAPS objectPyDSCBCAPSTypedwFlagsSpecifies device capabilities. Can be 0 or DSCBCAPS_EMULDRIVER (indicates that no DirectSoundCapture device is available and standard wave audio functions are being used)dwBufferBytesThe size, in bytes, of the capture buffer.c:\src\python-3.8\include\object.h:DSCBUFFERDESCThe object is not a PyDSCBUFFERDESC objectPyDSCBUFFERDESCdwFlagsIdentifies the capabilities to include when creating a new DirectSoundBuffer objectdwBufferBytesSize of the new buffer, in bytes. This value must be 0 when creating primary buffers. For secondary buffers, the minimum and maximum sizes allowed are specified by DSBSIZE_MIN and DSBSIZE_MAXlpwfxFormatStructure specifying the waveform format for the buffer. This value must be None for primary buffers. The application can use IDirectSoundCaptureBuffer::SetFormat to set the format of the primary buffer.lpwfxFormatlpwfxFormat must be a WAVEFORMATEX instancec:\src\python-3.8\include\object.h:DSCCAPSThe object is not a PyDSCCAPS objectPyDSCCAPSTypedwFlagsSpecifies device capabilities. Can be 0 or DSCCAPS_EMULDRIVER (indicates that no DirectSoundCapture device is available and standard wave audio functions are being used)dwFormatsSupported WAVE_FORMAT formats.dwChannelsNumber of channels supported by the device.c:\src\python-3.8\include\object.h|O:InitializeInitializeOi:SetCooperativeLevelSetCooperativeLevelO|O:CreateSoundBufferArgument 1 must be of type DSBUFFERDESCCreateSoundBuffer:GetCapsGetCaps:CompactGetCaps:GetSpeakerConfigGetSpeakerConfigi:SetSpeakerConfigSetSpeakerConfigInitializeSetCooperativeLevelCreateSoundBufferGetCapsCompactPyIDirectSoundc:\src\python-3.8\include\object.hVYV2YV,YVYV YV&YV`(Vcom/win32comext/directsound/src/PyIDirectSoundBuffer.cppO|O:QueryInterface:GetCapsGetCaps:GetFormatGetFormat:GetStatusGetStatusO:SetFormatArgument 1 must be of type WAVEFORMATEXSetFormatOO:InitializeArgument 2 must be of type DSBUFFERDESCInitialize:RestoreRestore:GetCurrentPositionGetCurrentPositioni:PlayPlayi:SetCurrentPositionSetCurrentPosition:StopStopiS|i:UpdateUpdate(Lock)Size mismatch from UnlockUpdate(Unlock):GetFrequencyGetFrequency:GetPanGetPan:GetVolumeGetVolumei:SetFrequencySetFrequencyi:SetPanSetPani:SetVolumeSetVolumeQueryInterfaceGetCapsGetFormatGetStatusSetFormatInitializeRestoreGetCurrentPositionPlaySetCurrentPositionStopUpdateGetFrequencyGetPanGetVolumeSetFrequencySetPanSetVolumePyIDirectSoundBufferc:\src\python-3.8\include\object.hVYV2YV,YVYV YV&YV5Vcom/win32comext/directsound/src/PyIDirectSoundCapture.cppO|O:QueryInterface|O:InitializeInitializeO|O:CreateCaptureBufferArgument 1 must be of type DSCBUFFERDESCCreateCaptureBuffer:GetCapsGetCapsInitializeCreateCaptureBufferGetCapsPyIDirectSoundCapturec:\src\python-3.8\include\object.hpVYV2YV,YVYV YV&YV;Vcom/win32comext/directsound/src/PyIDirectSoundCaptureBuffer.cppO|O:QueryInterface:GetCapsGetCaps:GetFormatGetFormat:GetStatusGetStatusOO:InitializeArgument 2 must be of type DSCBUFFERDESCInitialize:GetCurrentPositionGetCurrentPositioni:StartStart:StopStopii|i:UpdateUpdate(Lock)Update: could not allocate result stringUpdate: could not append to result stringcom/win32comext/directsound/src/PyIDirectSoundCaptureBuffer.cppUpdate(Unlock)QueryInterfaceGetCapsGetFormatGetStatusInitializeGetCurrentPositionStartStopUpdatePyIDirectSoundCaptureBufferc:\src\python-3.8\include\object.hVYV2YV,YVYV YV&YVDVcom/win32comext/directsound/src/PyIDirectSoundNotify.cppO:SetNotificationPositionsSetNotificationPositionsArgument must be a tuple (or a list of tuples) with two items: position and win32 Event handleSetNotificationPositionsPyIDirectSoundNotifyc:\src\python-3.8\include\object.hVYV2YV,YVYV YV&YVPHV|OO:DirectSoundCreate:DirectSoundEnumeratecom/win32comext/directsound/src/directsound.cppcom/win32comext/directsound/src/directsound.cpp|OO:DirectSoundCaptureCreatec:\src\python-3.8\include\object.h:DirectSoundCaptureEnumeratecom/win32comext/directsound/src/directsound.cppcom/win32comext/directsound/src/directsound.cppDirectSoundCreateDirectSoundEnumerateDirectSoundCaptureCreateDirectSoundCaptureEnumerateDSCAPSDSBCAPSDSCCAPSDSCBCAPSDSBUFFERDESCDSCBUFFERDESCXV2 C'\G[?k@?vR@35k6M%+FGbDESTq;MҴm„+#M~x>,r@,h9g{iD{3xZ!irqLNH ϯ*!;!$3Vy+:KH,* (RtO/I[\)N +%'z=愪Fo ndD'{^d}A).ZtrE}NO`'&W(hV : p~ ŕ4H f+ CڡBuX@AwR@35&Cώ_EM]>> Y>]K4QeH֫EOIi@(A)>ikzO›N|]8@IOdA=b9 q32 C~(қ` sGSMO0hU`CJl?tZBM%=M=b9 q3ӔJ+46t+ThA'Ү/MHo(^7XDr8 j6)T3ɠn5H"{̳yMt,|'O CI|ԌE"g̺i)Q$`%/d`uZ-qZ~C* x2ʟe[M*F'I! `'T3ɠn5$} H C`Q$`/~c˻@,ǹFsE&E~1 4OmY3@(ua;NMҜ0 q-ۂg@ܟ\Fc22濝B^?t`3Dx w `C=b9 q3@2"+>'/d`u8/gHzK=NmDEST ;sA2<21AAwR@35 Q!D0޷f  {la^iEE-݈`, C Ij5rDjL$pn,,uQJ8#T3ɠn5-F9Ŵ}9 =Hi*``Ͽ@VYg}It$ rH>m0>Io8,L\!2%$/d`uy(iMQS~ƶa`)Q$`OB^`\fs&3V^;/`[R" cq'A:>=@=b9 q3#L\2AD(OKdI`N]Ko\E1hsNmDEST,> QO?]}S7 {O=b9 q3ϕO.@3AOŠwaH)_=b9 q3D5|lR@35%6*LFmDESTT3HtsyfS@Dne긁!͉%wB7EE ?9O5rox$ضA5OV J[h,h@#T*H.)6-=9I\kumDEST3xc@L 1uf(O.~X T3ɠn5&`$ضH(O %YDEST"1 9Og0 >0y:HM]d6}aH)CfPA)D(OKdI`˽Hi4^ A2j9I@$jpvgzLB.lPYmHv>NfP)8bI%h$uMPjMbiA#֘s/NB^+T3ɠn5XNЉ2X$T3ɠn5\/ #H:_FDY.DESTEx w `=Y+%ZXגK$ZQHp]x!T3ɠn5<'N70q)GA]KwS_BA1uA%TP6Jmb`Ms ײK`U~tl`e0K8PNGSa4KuA!<8k @-LߑN Ij$`EUw?}(қ`w`VR@35gѐp9A M҈ɠn5xNB^Nڲi߻<( O)Z]7ul3! `$+^H=G 7F\1 W@}K+3&(/d`uL;DB{pzZB^"V2$ضmDEST`c} {ﳙ/uFw0#Tr\Q)B?vR@35EF$ضG 7F\1@cyPDNyaN[;fK-ED3o nV!NZ F=b9 q3A) NJ1y:HM]d6^ FI ,%3VI%]6G{[$-,e@+]O›NQ+O)2́3xD7pp01\QaxaH)o`'qR+M\}I44SŠ i9OgAqI!Mt3]X+mC+3V〔J 1cs5f O ]FTLFYѶ,;PE=b9 q3!QJxۙgF[wR@35FM5@B jjKf CbᤐGܹJLO08ܻcDUї2|ES6u8gBJj@iun8r3 FA`O7IpDžl3! `2SYHN9`z%nu0+ 5`[CE mxP^F:GX}vkL68vD=b9 q3AER䥎`tl`OB^fONZ2li} 'OĤLq\F aWla^iEE-݉`+oDESToÈ)pJ,$3ڸΩFDiF#`RDESTo0$ D;Q4da$ضbh!i@Ht</k@Z>@j<Bx3LwmDEST0`.QSM%)fT@xH9OgFXF[O %YDEST֨Jh`nQXfHtö.1XīE+Dk{b`ܶMD]+oDEST^=b9 q36гCFiviAZL˴h'/hΤN7]?u༧Ea%O8HQN̄0Ll"T3ɠn5`Ra=+AƵ] )Mj*fjsA״G(A)h6M8hcP^F:GX}ʢv]/@3!XI-Xda$ضQ$`1\Q4=3SYHN9`zSOs˃? Ԡ^]:irq@uzVR@35^J:c\mGMڏ+\(Ƀ@Cc 5VoJpG$oG^6w SND5|lR@35ᄥ pjRL;B, 0sB]Q2ST$HG t Sfl@KU'0Knr#:9 q3 2x`Af1~NN_+!Z6e-{uC=b9 q3;#O3xĻдXFA) ”OB^y@m@?ÝW.)BA ZxdQ޼{M`X}A)ͧϡuMPB)DѨ!& CAwR@35+dN`ĎhhHuO0D# A$, ;{R@35@.%M tm"y[O'm( Ez4\ %YDESTZNM8ۋ6!irqz`+oDEST&G^Er*4L~ =PTKb,N\ӶUWN3VzF*`3mDESTT`(A)1ű EGk^SzIx6 ) k%3Vf;i O0Me(z-^ EW^B'Ү/0 0`[OUDޞYsG$-,eFZ`R"ֹI腭3[KB1Y~.&T3ɠn5%piF+%BD3o n8P#`I3Y5NB^`,3aPY9JO0?3AOŠs" FJ J[Mfd%F=b9 q3Q=b9 q3cHxR@35F" SN?b`Nާ#fe rU<DEST8P#`I3Y5>A~Iqp1”ky GڥQ͚7He<6@0Sɠn5g/NOM ; |@wS:HEôJQW3F4f6M%+CPf0 lP]0|q*+ /CPf0 ɐGM<>HHcS F}P6^AL ePfxdJ9 E $2q0X J$\?lSFMfA#"@<ԕ~XFPOrK0H<FG(HfAo)B 7&Fv6M%+Ft6M%+4᪽~ hlGF&;CtHLHihBF#FCPf0 [0scS9 [0FveX`6eVDESTpH<k+ /lRۈH<qo"Fw~iG(FLF_Mc tE:efW+FFPxHBrWLAiELWF^v7XYOK/(3;K,k_be6M%+BlWox6M%+ cS#F2FihUN~>kʇHZxpfB26$^:Lxd6Tf,<P^p$zz<Pd.xR*tBJ|PRGetForegroundWindowBGetDesktopWindowUSER32.dllDSOUND.dlliPyObject_GenericGetAttrkPyObject_GenericSetAttrz_PyTraceMalloc_NewReferencePyErr_SetString PyArg_ParseTupleE_Py_tracemalloc_config_Py_NoneStruct1PyExc_TypeError_Py_DeallocxPyUnicode_AsUTF89PyExc_ValueErrorPyLong_FromLongPyEval_SaveThreadPyEval_RestoreThread0PyBytes_Size%PyBytes_AsString=PyTuple_New?PyTuple_SetItem'PyExc_RuntimeError.PyBytes_FromStringAndSize'PyBytes_ConcatPyExc_MemoryErrorPyLong_AsLong@PyTuple_SizePyList_SizeKPyType_ReadyPyList_NewPyList_AppendPyDict_SetItemStringPyModule_GetDictrPyGILState_EnsuretPyGILState_ReleasePyErr_OccurredPyModule_AddIntConstantPyModule_Create2python38.dll??0PyWAVEFORMATEX@@QAE@ABUtWAVEFORMATEX@@@Z?PyWAVEFORMATEXType@@3U_typeobject@@A?PyWin_SetAPIError@@YAPAU_object@@PADJ@Z?PyWinObject_AsIID@@YAHPAU_object@@PAU_GUID@@@Z?PyWinObject_AsHANDLE@@YAHPAU_object@@PAPAX@Z??0PyWAVEFORMATEX@@QAE@XZy?PyHANDLEType@@3U_typeobject@@A?PyWinObject_FromOLECHAR@@YAPAU_object@@PB_W@Z?PyWinObject_FromIID@@YAPAU_object@@ABU_GUID@@@Z?PyWinGlobals_Ensure@@YAHXZpywintypes38.dll??0PyComTypeObject@@QAE@PBDPAV0@HPAUPyMethodDef@@P6APAVPyIUnknown@@PAUIUnknown@@@Z@ZB??1PyComTypeObject@@QAE@XZ3?PyCom_InterfaceFromPyInstanceOrObject@@YAHPAU_object@@ABU_GUID@@PAPAXH@Z?GetI@PyIUnknown@@SAPAUIUnknown@@PAU_object@@@Z7??0PyIUnknown@@IAE@PAUIUnknown@@@Z[??1PyIUnknown@@MAE@XZ?compare@PyIUnknown@@UAEHPAU_object@@@Z?getattr@PyIBase@@UAEPAU_object@@PAD@Z?iter@PyIBase@@UAEPAU_object@@XZ?iternext@PyIBase@@UAEPAU_object@@XZ?repr@PyIUnknown@@UAEPAU_object@@XZ?setattr@PyIBase@@UAEHPADPAU_object@@@Z?type@PyIUnknown@@2VPyComTypeObject@@A?is_object@PyIBase@@SAHPAU_object@@PAVPyComTypeObject@@@Z}?SafeRelease@PyIUnknown@@SAXPAV1@@Zq?QueryInterface@PyIUnknown@@SAPAU_object@@PAU2@0@Z,?PyCom_BuildPyException@@YAPAU_object@@JPAUIUnknown@@ABU_GUID@@@ZA?PyCom_RegisterExtensionSupport@@YAHPAU_object@@PBUPyCom_InterfaceSupportInfo@@H@Zpythoncom38.dllIsProcessorFeaturePresentzIsDebuggerPresentUnhandledExceptionFiltereSetUnhandledExceptionFilterGetStartupInfoWtGetModuleHandleWFQueryPerformanceCounterGetCurrentProcessIdGetCurrentThreadIdGetSystemTimeAsFileTimeDisableThreadLibraryCalls^InitializeSListHeadGetCurrentProcessTerminateProcessKERNEL32.dllHmemset__CxxFrameHandler3#__std_terminateFmemcpy!__std_exception_copy"__std_exception_destroy_CxxThrowException5_except_handler4_common%__std_type_info_destroy_listVCRUNTIME140.dll_callnewhmallocA_seh_filter_dll_configure_narrow_argv5_initialize_narrow_environment6_initialize_onexit_table>_register_onexit_function$_execute_onexit_table_crt_atexit_crt_at_quick_exit_cexit8_initterm9_initterm_efreejterminateapi-ms-win-crt-heap-l1-1-0.dllapi-ms-win-crt-runtime-l1-1-0.dll`rV hrVrVrVrVrVtVTrVVVtuVuVuVuVvVvVduV0VV8VxV $xVDxV`xVxVxV$yV8yV|yVyVhzV zVzV$zV{V(8{V|V,|V~V08~VV4VV8VXV<xVV@؀V8VDPVVHЁV0VLhVĂVP؂VVT0VVXVV\V xVVXVV ȆVtVVVVV$V0VVVXVhVV(@VpVVԊV VVVVċVĊV "VV(V"V4V#VHVp$V\V@&VdV%VVV?VV?VV@VV0AV VAV`V@EV,VIV@VKVXV0LVtV`MVVpVV VV VVVVVĘV0V V,VVDN@V.?AVPyIUnknown@@V.?AVPyIBase@@V.?AU_object@@V.?AVPyIDirectSound@@V.?AVPyIDirectSoundBuffer@@V.?AVPyIDirectSoundCapture@@V.?AVPyIDirectSoundCaptureBuffer@@V.?AVPyIDirectSoundNotify@@V.?AVtype_info@@V.?AVbad_alloc@std@@V.?AVexception@std@@V.?AVbad_array_new_length@std@@6GJNPNWN]TULZ[4 0HX 4VS_VERSION_INFO,,?dStringFileInfo@040904E4`$Commentshttps://github.com/mhammond/pywin32"CompanyName*FileDescription4 FileVersion3.8.300.0@InternalNamedirectsound.pyd&LegalCopyright*LegalTrademarksHOriginalFilenamedirectsound.pyd0ProductNamePyWin328 ProductVersion3.8.300.0DVarFileInfo$Translation PADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADD00 00010:0?0Q0X0]0d0i00000000000000111111#11161>1C1H1N1S1a1f1n1s1x1~111111111111111112"2,2Q2V2c2222223 33F3K3X3333Q4c44444565=5B5J5v5{55555556R666667"7Y7m7t7y77778A8S8r8|888889 999F9K9X9999:::::::-;F;M;R;Z;;;;;;;9<>><>V>[>h>>>?/?X?v???????? 0r00000111M1f1m1r1z1111111Y2^2k2223343B3T3f3t3z333333344444B4H4W4_4v44444444%5,5@5\5j5p5555566"6.666F6_6~666666(767@7N7d7r7x777777777 88.848=8R8X8e8k88888L9b9999999:.:7:r::::::;;?;S;l;z;;;;;;;<<<8>>*>?>I>g>>>>>>>> ??#?3>L>Z>`>>>>>>>>>?/?9?W?r???????@x00.050:0B0S0n0|0000000001 11!171E1O1]1n1|11111111S2`2f2}2222222393B3H3~33333333 4%4+4A4L44444525R5p5z55Q6V6^6y6666777>7D7T7l7~7777788,8\8u8{8888 99!9l999999::":::G:P::::; ;;;/;E;\;q;;;;;;;;;<<<6<[>>.>B>I>O>V>l>>>>>>> ?%?>?T?j???????P0000F0\0r00000001(1A1Z1s11111112)2?2U2n22222223*3@3Y3o3333333 4%4>4W4p4444445585Q5j5555556626K6`6e6x66666666667 77!71767F7K7u777777788888 8&8,82888>8D8J8P8V8\8b8h8n8t8z888888888888888888888889 9999"9(9.949:9@9F9L9R9999t:7;h;;;;;; <0:>J>a>r>>>>>>??'?5?G?\???`f0001.141I1a1g1w111111 2M2~2222222|333333 4)464A4J4]44<5[5e5v55556I6Q6a6~666677#7,797h7p7777777777788<8D8N8d8m8x88888888888888888999 9&909:9J9Z9j9s999999999999999: :::#:-:7:J:O:v:|:::::::::::::::::::';6;^;e;t;z;;;;;;;;;;;;;;;;;;;;;;;< <<<<"<(<.<4<:<@ >@>Y>c>w>>>>>>??1?7?A?G?Q?W?a?g?q?w?p 111111111112========pP1T1X1\1`1d1h1l122222222h5l5p5t5x5|5556666666688888888999 9999 9(9,90949@2222233 3 3$3(3D3H33334444$4<4@4X4h4l4p4x444444444444455(5,5<5@5D5H5L5T5l5|555555555555555556$6(686<6@6D6H6P6h6x6|666666666667 77 7$7,7D7T7X7h7l7p7t7|77;;(;L;l;t;;;;;;;<($>T>x>>>>>? ?@?H?P?\??????,04080@0H0P0T0\0p0x000000000000$0(080<0t00081H1L1\1`1p11112X2h2l2|222222222222223 33 30343D3H3X3\3l3p333333333333334(444445,585556666(6L6X6667 7$74787H7l7x770848@8D8P8T8`8d8p8t8888888888888889999 9$90949@9D9P9T9`9d9p9t9999999999999:::: :$:0:4:@:D:P:T:`:d:p:t:::::::::::::;;;; ;$;0;4;@;D;P;T;;;;;;;<(b PD$p pp0hHbjhTbVW@S b,_^[SVWbt$t$t$>bPt$bPhdbjhhbVW@S b _^[̃SUVWbt$0l$,؋MD$hb}PhbWQ@xLjjt$4t$bu L$QPDPhbub D$u PbS b_^][ ̃SUVb\$0D$u @Wjhܼbt$8bT$D$8WhbRhbPQ@-b t uWՃ_xNjShܼbt$bu&\$(T$CKRPDPhbsb D$ uPՃt$ b^][ ̃SUVb|$(u@u\$$L$ jQh@bSP@xSjt$,hbPt$LSUt$LhLbjhTbVW@5bD$`Dt uPփt EuUփt uSփt$ b_^][ỸSVWbt$$)u(t$ T$ FNRPDPh\bvb .D$ VhhbjhlbPQ@u VbS b_^[VWbt$L$t$hbjhbQR@W b_^ VWbt$L$hbjhğbQR@W b_^VWbL$ jjhПbQR@W b_^VWbL$ jjh؟bQR@W b_^Vb|bD$t jV2^Ujh?bdPd%QVj2uEt)ubbFH c^Md ]ËM3^d ]̋D$̋D$ uPbY̋D$tu D$%b%b̃Wt$bu3_ÍD$Ph$bt$(b tލD$Pt$tVbD$ PWQ Vb^yhbjWb _áb_b̃ Wt$bu3_ ÍD$PD$Ph0bt$$btjD$Pt$b tVbt$t$WQVbt$Db^yhbjWb _ áb_b ̃ Wt$bu3_ ÍD$PD$ PD$PhDbt$(btVbt$t$t$WQVb^yhbjWb _ áb_b ̃Wt$bu3_ÍD$PD$PD$PhTbt$,btjD$Pt$b tVbt$t$t$WQVbt$Db^yhbjWb _áb_bQVt$ t$bDbF c^YDb%|b̃SVWbt$$u(t$ T$ FNRPDPhbvb .D$ VhbjhĠbPQ@u VbS b_^[SVWbt$xbL$Vt$hbjh bQR@؅tu VbW b_^[ VWbt$L$t$t$hbjh bQR@W b _^SVWbt$xbL$Vt$ t$ h,bjh0bQR@ ؅tu VbW b_^[VDb|bD$t jVQ-^Ujh_bdPd%QVj,uEt)ubDbF c^Md ]ËM3^d ]̋D$̋D$ uPbY̋D$tu D$%b%b̃Vt$bu3^ÍD$Phbt$b tjD$Ph bt$btSWbt$ VQ T$ t RQSbyhbVWb _[^áb_[^bQWt$ bu3_Yhbt$btSVbD$ PWQVbyhbWSb ^[_Yjh bt$b ^[_ỸWt$bu3_ÍD$ PD$ Phbt$(btjjD$ Pt$btSVbt$D$Pt$WQt$ DbVbyhbWSb ^[_t$b^[_́ W$bu 3_ ÍD$ Phb$ b tjjD$ Pt$btSVD$bjD$PD$ Pt$WQt$ DbVbyhbWSb ^[_ t$D$Pb^[_ ̃Wt$$bu3_ÍD$PD$PD$ PD$(PD$Ph̡bt$@btjjD$ Pt$btSVD$bjt$D$t$$t$,jPt$xbPt$hbjhbVW@S b _^[̃SUVb|$0u @t$4\$,L$t$0hbQhbSP@D$Ph bt$b u&L$QPDPD$,hbpb Sjt$4hEb+PQgYYt'x$|!EE3Ɂ8ËeE2 Ut}u 3c]U=ct} uuquiYY]Uc3cuȃu hcYY#E]Uc3cȃu]uhcYY]UuYH]bUEVbt j VYY^]U]UE t3t tt3@0uuY}PY] jhbFjBYu34E]e=ctjcite} h.b' $ȅb: $LbhHb YYu)t hDbh b YYc2ۈ]EDL>tVGYtu ju6Sc3@Ê]uYj hb4c3OHc"Ee=ctj%cEju]YY3Ʉu"Yj hb} u9=c3et t]1]SWuuSWuuSWumuu"uSPuUSVuSVu`tuHSWuout5SWu:$MQ0h{buu uËe3uEUV5bu3@uu u^] U]U} uuu u ] UaaEA |xffftfpflfhEEDž@jPEVPE E@EEbVXۍEEۉEbEPbu !c^[]UDjDEjPE EP bEtEj X]3jbȅu2øMZf9uA<8PEu f9HuۃxtvՃh,bbUE8csmu%xu@= t=!t="t =@t3] ̃%c%bhۄbd5D$l$l$+SVWc1E3PeuEEEEdËMd Y__^[]QUuuu uhlbhc]UeecVWN@;t t УcfEP0bE3EE,b1E(b1EEP$bME3M3M3;uO@u G ȉ cщ c_^]U} u=bu u4b3@] hc8bhcJYøcø cHHHHøDcSVbb;sW>t T׃;r_^[SVbb;sW>t )׃;r_^[Ë b3Yb; cu(Ujbubh &Bv^ft. Pz@V@, jrl@h< pF6jVj6 zBNX$XRYbb0b`bbbb bPblOTranslateUrlTranslateUrlcom/win32comext/internet/src/PyIDocHostUIHandler.cppOFilterDataObjectFilterDataObjectcom/win32comext/internet/src/PyIDocHostUIHandler.cppc:\src\python-3.8\include\object.hl(ii)OO:ShowContextMenu:GetHostInfoiiNNlOOOO:ShowUI:HideUI:UpdateUIi:EnableModelessi:OnDocWindowActivatei:OnFrameWindowActivate(iiii)Oi:ResizeBorderOOl:TranslateAcceleratorl:GetOptionKeyPathO:GetDropTarget:GetExternallO:TranslateUrlO:FilterDataObjectShowContextMenuGetHostInfoShowUIHideUIUpdateUIEnableModelessOnDocWindowActivateOnFrameWindowActivateResizeBorderTranslateAcceleratorGetOptionKeyPathGetDropTargetGetExternalTranslateUrlFilterDataObjectPyIDocHostUIHandlerl(ii)NOShowContextMenuGetHostInfoiiOOGetHostInfocom/win32comext/internet/src/PyIDocHostUIHandler.cpplOOOOShowUIHideUIUpdateUIiEnableModelessiOnDocWindowActivateiOnFrameWindowActivate(iiii)NiResizeBorderNNlTranslateAcceleratorlGetOptionKeyPathGetOptionKeyPathcom/win32comext/internet/src/PyIDocHostUIHandler.cppOGetDropTargetGetDropTargetcom/win32comext/internet/src/PyIDocHostUIHandler.cppGetExternalGetExternalcom/win32comext/internet/src/PyIDocHostUIHandler.cppbbvbzvbtvb\vbhvbnvb`%bllmoveTollmoveByllresizeTollresizeByc:\src\python-3.8\include\object.hc:\src\python-3.8\include\object.hO:GetBindInfoiGetBindString not implementedGetBindInfoGetBindStringPyIInternetBindInfoOGetBindInfocom/win32comext/internet/src/PyIInternetBindInfo.cppicom/win32comext/internet/src/PyIInternetBindInfo.cppLbbvbzvbtvb\vbhvbnvb)bi:SetPriorityc:\src\python-3.8\include\object.h:GetPriorityiSetPriorityGetPriorityPyIInternetPriorityiSetPriorityGetPriorityicom/win32comext/internet/src/PyIInternetPriority.cppbbvbzvbtvb\vbhvbnvb,bc:\src\python-3.8\include\object.hi:ReadOi:SeekOi:LockRequest:UnlockRequestReadSeekLockRequestUnlockRequestPyIInternetProtocollReadIInternetProtocol::Read must return a string objectOiSeekOcom/win32comext/internet/src/PyIInternetProtocol.cppiLockRequestUnlockRequestbbvbzvbtvb\vbhvbnvb03bc:\src\python-3.8\include\object.hOiiii:ParseUrlOOiii:CombineUrlOOi:CompareUrlOiiii:QueryInfoParseUrlCombineUrlCompareUrlQueryInfoPyIInternetProtocolInfoOiiiiParseUrlcom/win32comext/internet/src/PyIInternetProtocolInfo.cppOOiiiCombineUrlcom/win32comext/internet/src/PyIInternetProtocolInfo.cppOOiCompareUrlOiiiiQueryInfoIInternetProtocolInfo::QueryInfo can return an integer only when sizeof(int) bytes are requested.IInternetProtocolInfo::QueryInfo must return a string, or an integer iff cbBuffer==sizeof(int)com/win32comext/internet/src/PyIInternetProtocolInfo.cppbbvbzvbtvb\vbhvbnvb0=bc:\src\python-3.8\include\object.hOOOii:StartO:Continueii:Aborti:Terminate:Suspend:ResumeStartContinueAbortTerminateSuspendResumePyIInternetProtocolRootOOOiNStartOContinuecom/win32comext/internet/src/PyIInternetProtocolRoot.cppiiAbortiTerminateSuspendResumebbvbzvbtvb\vbhvbnvbDbc:\src\python-3.8\include\object.hO:SwitchiO:ReportProgressiii:ReportDataiiO:ReportResultSwitchReportProgressReportDataReportResultPyIInternetProtocolSinkOSwitchcom/win32comext/internet/src/PyIInternetProtocolSink.cppiOReportProgressiiiReportDataiiOReportResultbbvbzvbtvb\vbhvbnvb@Jbc:\src\python-3.8\include\object.hO:SetSecuritySite:GetSecuritySiteOl:MapUrlToZoneO:GetSecurityIdOlz#l:ProcessUrlActionlllOl:SetZoneMappingll:GetZoneMappingsSetSecuritySiteGetSecuritySiteMapUrlToZoneGetSecurityIdProcessUrlActionSetZoneMappingGetZoneMappingsPyIInternetSecurityManagerOSetSecuritySiteGetSecuritySiteGetSecuritySitecom/win32comext/internet/src/PyIInternetSecurityManager.cppOlMapUrlToZonelMapUrlToZonecom/win32comext/internet/src/PyIInternetSecurityManager.cppGetSecurityIdOlOGetSecurityIdcom/win32comext/internet/src/PyIInternetSecurityManager.cppcom/win32comext/internet/src/PyIInternetSecurityManager.cppGetSecurityIdcom/win32comext/internet/src/PyIInternetSecurityManager.cppOlOllProcessUrlActionProcessUrlActionlNlPyGInternetSecurityManager::ProcessUrlAction has %d bytes for policy - what is that?SetZoneMappingllGetZoneMappingsOGetZoneMappingsGetZoneMappingscom/win32comext/internet/src/PyIInternetSecurityManager.cppHbbvbzvbtvb\vbhvbnvbpVbc:\src\python-3.8\include\object.hOnly None is support for PROTOCOLDATA objectsiiz#|OOllOlllOOOlSorry - dont support STGMEDIUM yet - must be NoneCoInternetIsFeatureEnabled%s is not available with this Internet Explorer versioniiCoInternetSetFeatureEnabled%s is not available with this Internet Explorer versioniiiCoInternetCreateSecurityManager%s is not available with this Internet Explorer versionOiCoInternetCreateSecurityManagerCoInternetIsFeatureEnabledCoInternetSetFeatureEnabledcom/win32comext/internet/src/internet.cppܾbtbb cYbbbb0[bbԨbbH c\bbbb cdbLb4bLbp cebbhbb c WbFQF FPFXשFh FFFFF)FHF&F%F&F"F3Fk!Pi)?@FF:/ۆ/O0Fv nr Z'B>Mm8gh j;Yi+-z4j;Yi+-zFU 8r+C+n4FF=FacH&8Fvޮ xOF!F y.YDFF1F:/ۆ/OFCj?e~ҦFސy(_%FEFF2F:/ۆ/O4yOʙ^AiMm8gh +F FIF`k;Yi+-z4<OFFi;Yi+-z:/ۆ/OFF:/ۆ/OiM^eQI+Idʏ[FF4FGF F@FF F0:s *Dw=FFF0:s*Dw=z0Gd<O8m FFFǝv\WX$5I?#3:OF FFFF`= ߏTe++ }Te++F/FFF*j`wNst5\'5vJ:` F@'1nD5KQF-F*'UB5KQF.FFFF@3"}Te++)FFFFF!F"FFF+F*FFFx89UNF FF'F(FFFFFF FPALN8.5ż"hN@Gpʼ"hN@GpsJ<~) &nɼ"hN@GpVD(Z2t˼"hN@GpƼ"hN@Gpȼ"hN@GpǼ"hN@Gp-4%`,BO\P0 D>;#?>;P0 8SO\P0 `*0FCPf0 q6M%+њpIܾ<,FF"d+.[w0t?>ôJQW3F4f6M%+CPf0 lP]0|q*+ /CPf0 ɐGM<>HHcS F}P6^AL ePfxdJ9 E $2q0X J$\?lSFMfA#"@<ԕ~XFPOrK0H<FG(HfAo)B 7&Fv6M%+Ft6M%+4᪽~ hlGF&;CtHLHihBF#FCPf0 [0scS9 [0FveX`6eVDESTpH<k+ /lRۈH<qo"Fw~iG(FLF_Mc tE:efW+FFPxHBrWLAiELWF^v7XYOK/(3;K,k_be6M%+BlWox6M%+ cS#F2FihUN~>kʇH.rdata4,.rdata$r`H.rdata$sxdata.rdata$zzzdbg.rtc$IAA.rtc$IZZ.rtc$TAA.rtc$TZZ.xdata$xP.edata.idata$2.idata$3.idata$4(.idata$6.dataD.data$r 8 .bss L.gfids$yb"bb"bЊb"bb",bb"Xb0b"bPb"bpb"bb"bb"4bPb"`bb"b0b"bpb"bb"bЋb"&Bv^ft. Pz@V@, jrl@h< pF6jVj6 zBNX$XROLEAUT32.dllCoTaskMemFreeole32.dll_Py_DeallocPyLong_FromLongrPyGILState_EnsuretPyGILState_Release PyArg_ParseTuplePy_BuildValuePyEval_SaveThreadPyEval_RestoreThreadPyErr_SetString PyArg_Parse'PyExc_RuntimeError_Py_NoneStruct.PyBytes_FromStringAndSize0PyBytes_Size%PyBytes_AsString1PyExc_TypeErrorPyLong_AsLongPyLong_FromVoidPtr=PyTuple_NewPyDict_SetItemStringPyModule_GetDictPyErr_FormatPyModule_Create2_Py_FalseStruct_Py_TrueStructPyExc_NotImplementedErrorpython38.dll??0PyComTypeObject@@QAE@PBDPAV0@HPAUPyMethodDef@@P6APAVPyIUnknown@@PAUIUnknown@@@Z@ZB??1PyComTypeObject@@QAE@XZ3?PyCom_InterfaceFromPyInstanceOrObject@@YAHPAU_object@@ABU_GUID@@PAPAXH@ZPyCom_PyObjectFromIUnknown,?PyCom_BuildPyException@@YAPAU_object@@JPAUIUnknown@@ABU_GUID@@@ZE?PyCom_SetAndLogCOMErrorFromPyExceptionEx@@YAJPAU_object@@PBDABU_GUID@@@Z?GetI@PyIUnknown@@SAPAUIUnknown@@PAU_object@@@Z7??0PyIUnknown@@IAE@PAUIUnknown@@@Z[??1PyIUnknown@@MAE@XZ"?MakeOLECHARToObj@@YAPAU_object@@PB_W@Z?compare@PyIUnknown@@UAEHPAU_object@@@Z?getattr@PyIBase@@UAEPAU_object@@PAD@Z?iter@PyIBase@@UAEPAU_object@@XZ?iternext@PyIBase@@UAEPAU_object@@XZ?repr@PyIUnknown@@UAEPAU_object@@XZ?setattr@PyIBase@@UAEHPADPAU_object@@@Z?type@PyIUnknown@@2VPyComTypeObject@@A*?PyCom_BstrFromPyObject@@YAHPAU_object@@PAPA_WH@Z8?PyCom_LoggerWarning@@YAXPAU_object@@PBDZZ ??0PyGatewayBase@@IAE@PAU_object@@@ZE??1PyGatewayBase@@MAE@XZ?AddRef@PyGatewayBase@@UAGKXZx?Release@PyGatewayBase@@UAGKXZp?QueryInterface@PyGatewayBase@@UAGJABU_GUID@@PAPAX@Z?ThisAsIID@PyGatewayBase@@UAEPAXU_GUID@@@ZA?PyCom_RegisterExtensionSupport@@YAHPAU_object@@PBUPyCom_InterfaceSupportInfo@@H@Z?DeleteMemberByDispID@PyGatewayBase@@UAGJJ@Z?DeleteMemberByName@PyGatewayBase@@UAGJPA_WK@Z?GetDispID@PyGatewayBase@@UAGJPA_WKPAJ@Z?GetIDsOfNames@PyGatewayBase@@UAGJABU_GUID@@PAPA_WIKPAJ@Z?GetMemberName@PyGatewayBase@@UAGJJPAPA_W@Z?GetMemberProperties@PyGatewayBase@@UAGJJKPAK@Z?GetNameSpaceParent@PyGatewayBase@@UAGJPAPAUIUnknown@@@Z?GetNextDispID@PyGatewayBase@@UAGJKJPAJ@Z?GetTypeInfo@PyGatewayBase@@UAGJIKPAPAUITypeInfo@@@Z ?GetTypeInfoCount@PyGatewayBase@@UAGJPAI@Z?InterfaceSupportsErrorInfo@PyGatewayBase@@UAGJABU_GUID@@@Z?Invoke@PyGatewayBase@@UAGJJABU_GUID@@KGPAUtagDISPPARAMS@@PAUtagVARIANT@@PAUtagEXCEPINFO@@PAI@Z?InvokeEx@PyGatewayBase@@UAGJJKGPAUtagDISPPARAMS@@PAUtagVARIANT@@PAUtagEXCEPINFO@@PAUIServiceProvider@@@Z?InvokeViaPolicy@PyGatewayBase@@MAAJPBDPAPAU_object@@0ZZ?Unwrap@PyGatewayBase@@UAGJPAPAU_object@@@Zpythoncom38.dll?PyWinObject_AsWCHAR@@YAHPAU_object@@PAPA_WHPAK@Z?PyWinObject_FreeWCHAR@@YAXPA_W@Z?PyWinObject_AsTaskAllocatedWCHAR@@YAHPAU_object@@PAPA_WHPAK@Z?PyWinObject_AsIID@@YAHPAU_object@@PAU_GUID@@@Z?PyWinObject_FromIID@@YAPAU_object@@ABU_GUID@@@Z?PyWinObject_AsMSG@@YAHPAU_object@@PAUtagMSG@@@Z?PyWinObject_FromMSG@@YAPAU_object@@PBUtagMSG@@@Z?PyWinObject_AsLARGE_INTEGER@@YAHPAU_object@@PAT_LARGE_INTEGER@@@Z?PyWinObject_AsULARGE_INTEGER@@YAHPAU_object@@PAT_ULARGE_INTEGER@@@Z?PyWinObject_FromLARGE_INTEGER@@YAPAU_object@@ABT_LARGE_INTEGER@@@Z?PyWinObject_FromULARGE_INTEGER@@YAPAU_object@@ABT_ULARGE_INTEGER@@@Z?PyWinObject_AsBstr@@YAHPAU_object@@PAPA_WHPAK@Z?PyWinObject_FromOLECHAR@@YAPAU_object@@PB_WH@Z?PyWinObject_AsReadBuffer@@YAHPAU_object@@PAPAXPAKH@Z?PyWinObject_FromOLECHAR@@YAPAU_object@@PB_W@Z?PyWinObject_AsSECURITY_ATTRIBUTES@@YAHPAU_object@@PAPAU_SECURITY_ATTRIBUTES@@H@Z?PyWinObject_FromSECURITY_ATTRIBUTES@@YAPAU_object@@ABU_SECURITY_ATTRIBUTES@@@Z?PyWinGlobals_Ensure@@YAHXZpywintypes38.dlltGetModuleHandleWGetProcAddressLoadLibraryWIsProcessorFeaturePresentzIsDebuggerPresentUnhandledExceptionFiltereSetUnhandledExceptionFilterGetStartupInfoWFQueryPerformanceCounterGetCurrentProcessIdGetCurrentThreadIdGetSystemTimeAsFileTimeDisableThreadLibraryCalls^InitializeSListHeadGetCurrentProcessTerminateProcessKERNEL32.dll__CxxFrameHandler3FmemcpyHmemset!__std_exception_copy"__std_exception_destroy_CxxThrowException5_except_handler4_common%__std_type_info_destroy_listVCRUNTIME140.dllfreemalloc_callnewhA_seh_filter_dll_configure_narrow_argv5_initialize_narrow_environment6_initialize_onexit_table>_register_onexit_function$_execute_onexit_table_crt_atexit_crt_at_quick_exit_cexit8_initterm9_initterm_ejterminateapi-ms-win-crt-heap-l1-1-0.dllapi-ms-win-crt-runtime-l1-1-0.dllhbbxbbbbbbbbbbbpbĔbbܔbpbbPbb0bbb(bb4b bDbbdbp'bpb (bb`*bb*bb-bb0.bb/bb/b8b04bDb@5bPb6b\bp7bb0>bbp?bb@bb@b$b Ab,bAbhbEbpb@FbbFbbGbb@Kb bLb0bLb@bPMbPb0Nbdb ObtbOb0C0H0N0S0a0f0n0s0x0~00000000000000000001111!1&1.13181>1C1Q1V1^1c1h1n1s1111122 2,2E2o222222 3!303F3R3Z3n33333333464S4k444445)535B5S5_5g5u555555555566)6>6J6R6a6x66666666677)7>7J7R7a7z77777788#848Z8~88888888 9:9T9^9m999999999::*:R:^:f:w::::::::::;*;Q;[;u;;;;;;;;;<<1<;>(>5>W>]>d>u>>>>>>?4?F?U?t???????? 0 0040F0M0\0u0000000001 1191O1X1w1111111222%2F2P2o2x2222223%3:3D3h33333334 4H4f4p444444445%5M5e5k555556-6D6Z6a6p66666666677!707L7b7z77777778 8!8&8.8N8T8]8r8x8888888990999P9]9999999<:R:h:::::::::::;;);6;?;N;T;n;t;};;;;;;;;<> >X>b>x>>>>>>>>>/?9?G?\?i?r?}??????????0\0020000 11121;1F1P111111122+242I2f2o222222223353f33334"4:4h4r444445 55J5x555566=6F6[6666667 787A7P7Z7z777777'848C8K8T8m88888888889#9-9[9z999999":(:4:w:::::;;/;6;S;f;p;;;;;<8<=">:>h>r>>>>>>?,?5?>?N?X?z????????@0090C0Q0j0w0000000000111'191C1Q1b1o1x1111111111112222282G2U2[2b2s2222223D3M3a3h3333333333 4$464E4d4v44444 555\5555555666*626J6i6s66666666667(767S7`7i7v7~777777 88"8+888@8^8d8m888888888 9%919D9K9f9p99999999::$:E:K:v:::::#;2;J;d;n;;;;;;;;;<<%<4:>h>r>>>>>>>? ?*?N?X?r?????????P\ 00"0@0L0T0e0o00000000000 1181[1u11111111 22/2?2I2g2p22222223!3'313p3333 44*494^4d4n4444444%5>5K5R5_5x555555566/686M6W6u6{666667,7y777777I8O8V8]8d8899&9-94999999:l::::::<;;;;;; > >%>->J>b>>>>>>>???;?Z?g?v?????????`00&010:0F0O0e0m0r0w0000000000111%1/1H1R1i1~111111112"252;2N2b2i2q2w222222222222222233!3.3;3H3U3b3r3333333333344!4.4>4K4X4h4u44444455&5-545;5555556777$7+7N7T7]7d7k77777777777888$8+828N8T8]8d8k88888888888999$9+9B9R9b9r9999999:5:e::::%;U;;;;7>R>>>>?B?r???pT020b0000"1R1112D2z2223:3d333$4Z44445555555555555555556 6666"6(6.646:6@6F6L6R6X6^6d6j6p6v6|666666666666666666666677 7777$7*70767<7B7H7N7T7Z7`7f7l7r7x77778]9999:::0:V:k:r:x:::::&;.;G;a;i;;;;1<`>$?x>|>>>>>>????????@1D1H1L1P1T1X1\1l5p5t5x5|5555777777777777777888 88888 8$8(8,8084888<8@8D8H8L8P8T8X8\8`8d8h8l8p8???? ?$?(?,?0?4?8?>> >>>>>$><>@>X>h>l>|>>>>>>>>>>>>>>>>>>>?? ?0?4?D?H?X?\?l?p??????????????????? 00 0$04080H0L0T0l0|000000000000111$1(1,10181P144445505<5\5h5555555 6686D6d6p66666667 7@7L7l7x77777 888 8(8,848H8P8d8l8t8|888880000 0$00040@0D0P0T0`0d0p0t00000000000000011110141@1D1`1d1p1t11111111111112222 2$20242@2D2P2T2p2t2222222222222223333 3$3@3D3P3T3`3d33333344<4`44444 5L5d55555 606X6t66666787\77777 8D8h88888PK Y03K7 win32comext/internet/__init__.pyUT  YZx`ux # See if we have a special directory for the binaries (for developers) import win32com win32com.__PackageSupportBuildPath__(__path__) PK Y03K ,-,-win32comext/internet/inetcon.pyUT  YZx`ux INET_E_USE_DEFAULT_PROTOCOLHANDLER = -2146697199 # _HRESULT_TYPEDEF_(0x800C0011L) INET_E_USE_DEFAULT_SETTING = -2146697198 # _HRESULT_TYPEDEF_(0x800C0012L) INET_E_DEFAULT_ACTION = INET_E_USE_DEFAULT_PROTOCOLHANDLER INET_E_QUERYOPTION_UNKNOWN = -2146697197 # _HRESULT_TYPEDEF_(0x800C0013L) INET_E_REDIRECTING = -2146697196 #_HRESULT_TYPEDEF_(0x800C0014L) INET_E_INVALID_URL = -2146697214 # _HRESULT_TYPEDEF_(0x800C0002L) INET_E_NO_SESSION = -2146697213 # _HRESULT_TYPEDEF_(0x800C0003L) INET_E_CANNOT_CONNECT = -2146697212 # _HRESULT_TYPEDEF_(0x800C0004L) INET_E_RESOURCE_NOT_FOUND = -2146697211 # _HRESULT_TYPEDEF_(0x800C0005L) INET_E_OBJECT_NOT_FOUND = -2146697210 # _HRESULT_TYPEDEF_(0x800C0006L) INET_E_DATA_NOT_AVAILABLE = -2146697209 # _HRESULT_TYPEDEF_(0x800C0007L) INET_E_DOWNLOAD_FAILURE = -2146697208 # _HRESULT_TYPEDEF_(0x800C0008L) INET_E_AUTHENTICATION_REQUIRED = -2146697207 # _HRESULT_TYPEDEF_(0x800C0009L) INET_E_NO_VALID_MEDIA = -2146697206 # _HRESULT_TYPEDEF_(0x800C000AL) INET_E_CONNECTION_TIMEOUT = -2146697205 # _HRESULT_TYPEDEF_(0x800C000BL) INET_E_INVALID_REQUEST = -2146697204 # _HRESULT_TYPEDEF_(0x800C000CL) INET_E_UNKNOWN_PROTOCOL = -2146697203 # _HRESULT_TYPEDEF_(0x800C000DL) INET_E_SECURITY_PROBLEM = -2146697202 # _HRESULT_TYPEDEF_(0x800C000EL) INET_E_CANNOT_LOAD_DATA = -2146697201 # _HRESULT_TYPEDEF_(0x800C000FL) INET_E_CANNOT_INSTANTIATE_OBJECT = -2146697200 # _HRESULT_TYPEDEF_(0x800C0010L) INET_E_INVALID_CERTIFICATE = -2146697191 # _HRESULT_TYPEDEF_(0x800C0019L) INET_E_REDIRECT_FAILED = -2146697196 # _HRESULT_TYPEDEF_(0x800C0014L) INET_E_REDIRECT_TO_DIR = -2146697195 # _HRESULT_TYPEDEF_(0x800C0015L) INET_E_CANNOT_LOCK_REQUEST = -2146697194 # _HRESULT_TYPEDEF_(0x800C0016L) INET_E_USE_EXTEND_BINDING = -2146697193 # _HRESULT_TYPEDEF_(0x800C0017L) INET_E_TERMINATED_BIND = -2146697192 # _HRESULT_TYPEDEF_(0x800C0018L) INET_E_CODE_DOWNLOAD_DECLINED = -2146696960 #_HRESULT_TYPEDEF_(0x800C0100L) INET_E_RESULT_DISPATCHED = -2146696704 # _HRESULT_TYPEDEF_(0x800C0200L) INET_E_CANNOT_REPLACE_SFP_FILE = -2146696448 # _HRESULT_TYPEDEF_(0x800C0300L) INET_E_CODE_INSTALL_SUPPRESSED = -2146696192 # _HRESULT_TYPEDEF_(0x800C0400L) INET_E_CODE_INSTALL_BLOCKED_BY_HASH_POLICY = -2146695936 # _HRESULT_TYPEDEF_(0x800C0500L) # Generated by h2py from UrlMon.h MKSYS_URLMONIKER = 6 URL_MK_LEGACY = 0 URL_MK_UNIFORM = 1 URL_MK_NO_CANONICALIZE = 2 FIEF_FLAG_FORCE_JITUI = 0x1 FIEF_FLAG_PEEK = 0x2 FIEF_FLAG_SKIP_INSTALLED_VERSION_CHECK = 0x4 FMFD_DEFAULT = 0x00000000 FMFD_URLASFILENAME = 0x00000001 FMFD_ENABLEMIMESNIFFING = 0x00000002 FMFD_IGNOREMIMETEXTPLAIN = 0x00000004 URLMON_OPTION_USERAGENT = 0x10000001 URLMON_OPTION_USERAGENT_REFRESH = 0x10000002 URLMON_OPTION_URL_ENCODING = 0x10000004 URLMON_OPTION_USE_BINDSTRINGCREDS = 0x10000008 URLMON_OPTION_USE_BROWSERAPPSDOCUMENTS = 0x10000010 CF_NULL = 0 Uri_CREATE_ALLOW_RELATIVE = 0x00000001 Uri_CREATE_ALLOW_IMPLICIT_WILDCARD_SCHEME = 0x00000002 Uri_CREATE_ALLOW_IMPLICIT_FILE_SCHEME = 0x00000004 Uri_CREATE_NOFRAG = 0x00000008 Uri_CREATE_NO_CANONICALIZE = 0x00000010 Uri_CREATE_CANONICALIZE = 0x00000100 Uri_CREATE_FILE_USE_DOS_PATH = 0x00000020 Uri_CREATE_DECODE_EXTRA_INFO = 0x00000040 Uri_CREATE_NO_DECODE_EXTRA_INFO = 0x00000080 Uri_CREATE_CRACK_UNKNOWN_SCHEMES = 0x00000200 Uri_CREATE_NO_CRACK_UNKNOWN_SCHEMES = 0x00000400 Uri_CREATE_PRE_PROCESS_HTML_URI = 0x00000800 Uri_CREATE_NO_PRE_PROCESS_HTML_URI = 0x00001000 Uri_CREATE_IE_SETTINGS = 0x00002000 Uri_CREATE_NO_IE_SETTINGS = 0x00004000 Uri_CREATE_NO_ENCODE_FORBIDDEN_CHARACTERS = 0x00008000 Uri_DISPLAY_NO_FRAGMENT = 0x00000001 Uri_PUNYCODE_IDN_HOST = 0x00000002 Uri_DISPLAY_IDN_HOST = 0x00000004 Uri_ENCODING_USER_INFO_AND_PATH_IS_PERCENT_ENCODED_UTF8 = 0x00000001 Uri_ENCODING_USER_INFO_AND_PATH_IS_CP = 0x00000002 Uri_ENCODING_HOST_IS_IDN = 0x00000004 Uri_ENCODING_HOST_IS_PERCENT_ENCODED_UTF8 = 0x00000008 Uri_ENCODING_HOST_IS_PERCENT_ENCODED_CP = 0x00000010 Uri_ENCODING_QUERY_AND_FRAGMENT_IS_PERCENT_ENCODED_UTF8 = 0x00000020 Uri_ENCODING_QUERY_AND_FRAGMENT_IS_CP = 0x00000040 Uri_ENCODING_RFC = (Uri_ENCODING_USER_INFO_AND_PATH_IS_PERCENT_ENCODED_UTF8 | Uri_ENCODING_HOST_IS_PERCENT_ENCODED_UTF8 | Uri_ENCODING_QUERY_AND_FRAGMENT_IS_PERCENT_ENCODED_UTF8) UriBuilder_USE_ORIGINAL_FLAGS = 0x00000001 WININETINFO_OPTION_LOCK_HANDLE = 65534 URLOSTRM_USECACHEDCOPY_ONLY = 0x1 URLOSTRM_USECACHEDCOPY = 0x2 URLOSTRM_GETNEWESTVERSION = 0x3 SET_FEATURE_ON_THREAD = 0x00000001 SET_FEATURE_ON_PROCESS = 0x00000002 SET_FEATURE_IN_REGISTRY = 0x00000004 SET_FEATURE_ON_THREAD_LOCALMACHINE = 0x00000008 SET_FEATURE_ON_THREAD_INTRANET = 0x00000010 SET_FEATURE_ON_THREAD_TRUSTED = 0x00000020 SET_FEATURE_ON_THREAD_INTERNET = 0x00000040 SET_FEATURE_ON_THREAD_RESTRICTED = 0x00000080 GET_FEATURE_FROM_THREAD = 0x00000001 GET_FEATURE_FROM_PROCESS = 0x00000002 GET_FEATURE_FROM_REGISTRY = 0x00000004 GET_FEATURE_FROM_THREAD_LOCALMACHINE = 0x00000008 GET_FEATURE_FROM_THREAD_INTRANET = 0x00000010 GET_FEATURE_FROM_THREAD_TRUSTED = 0x00000020 GET_FEATURE_FROM_THREAD_INTERNET = 0x00000040 GET_FEATURE_FROM_THREAD_RESTRICTED = 0x00000080 PROTOCOLFLAG_NO_PICS_CHECK = 0x00000001 MUTZ_NOSAVEDFILECHECK = 0x00000001 MUTZ_ISFILE = 0x00000002 MUTZ_ACCEPT_WILDCARD_SCHEME = 0x00000080 MUTZ_ENFORCERESTRICTED = 0x00000100 MUTZ_RESERVED = 0x00000200 MUTZ_REQUIRESAVEDFILECHECK = 0x00000400 MUTZ_DONT_UNESCAPE = 0x00000800 MUTZ_DONT_USE_CACHE = 0x00001000 MUTZ_FORCE_INTRANET_FLAGS = 0x00002000 MUTZ_IGNORE_ZONE_MAPPINGS = 0x00004000 MAX_SIZE_SECURITY_ID = 512 URLACTION_MIN = 0x00001000 URLACTION_DOWNLOAD_MIN = 0x00001000 URLACTION_DOWNLOAD_SIGNED_ACTIVEX = 0x00001001 URLACTION_DOWNLOAD_UNSIGNED_ACTIVEX = 0x00001004 URLACTION_DOWNLOAD_CURR_MAX = 0x00001004 URLACTION_DOWNLOAD_MAX = 0x000011FF URLACTION_ACTIVEX_MIN = 0x00001200 URLACTION_ACTIVEX_RUN = 0x00001200 URLPOLICY_ACTIVEX_CHECK_LIST = 0x00010000 URLACTION_ACTIVEX_OVERRIDE_OBJECT_SAFETY = 0x00001201 URLACTION_ACTIVEX_OVERRIDE_DATA_SAFETY = 0x00001202 URLACTION_ACTIVEX_OVERRIDE_SCRIPT_SAFETY = 0x00001203 URLACTION_SCRIPT_OVERRIDE_SAFETY = 0x00001401 URLACTION_ACTIVEX_CONFIRM_NOOBJECTSAFETY = 0x00001204 URLACTION_ACTIVEX_TREATASUNTRUSTED = 0x00001205 URLACTION_ACTIVEX_NO_WEBOC_SCRIPT = 0x00001206 URLACTION_ACTIVEX_OVERRIDE_REPURPOSEDETECTION = 0x00001207 URLACTION_ACTIVEX_OVERRIDE_OPTIN = 0x00001208 URLACTION_ACTIVEX_SCRIPTLET_RUN = 0x00001209 URLACTION_ACTIVEX_DYNSRC_VIDEO_AND_ANIMATION = 0x0000120A URLACTION_ACTIVEX_CURR_MAX = 0x0000120A URLACTION_ACTIVEX_MAX = 0x000013ff URLACTION_SCRIPT_MIN = 0x00001400 URLACTION_SCRIPT_RUN = 0x00001400 URLACTION_SCRIPT_JAVA_USE = 0x00001402 URLACTION_SCRIPT_SAFE_ACTIVEX = 0x00001405 URLACTION_CROSS_DOMAIN_DATA = 0x00001406 URLACTION_SCRIPT_PASTE = 0x00001407 URLACTION_ALLOW_XDOMAIN_SUBFRAME_RESIZE = 0x00001408 URLACTION_SCRIPT_CURR_MAX = 0x00001408 URLACTION_SCRIPT_MAX = 0x000015ff URLACTION_HTML_MIN = 0x00001600 URLACTION_HTML_SUBMIT_FORMS = 0x00001601 URLACTION_HTML_SUBMIT_FORMS_FROM = 0x00001602 URLACTION_HTML_SUBMIT_FORMS_TO = 0x00001603 URLACTION_HTML_FONT_DOWNLOAD = 0x00001604 URLACTION_HTML_JAVA_RUN = 0x00001605 URLACTION_HTML_USERDATA_SAVE = 0x00001606 URLACTION_HTML_SUBFRAME_NAVIGATE = 0x00001607 URLACTION_HTML_META_REFRESH = 0x00001608 URLACTION_HTML_MIXED_CONTENT = 0x00001609 URLACTION_HTML_INCLUDE_FILE_PATH = 0x0000160A URLACTION_HTML_MAX = 0x000017ff URLACTION_SHELL_MIN = 0x00001800 URLACTION_SHELL_INSTALL_DTITEMS = 0x00001800 URLACTION_SHELL_MOVE_OR_COPY = 0x00001802 URLACTION_SHELL_FILE_DOWNLOAD = 0x00001803 URLACTION_SHELL_VERB = 0x00001804 URLACTION_SHELL_WEBVIEW_VERB = 0x00001805 URLACTION_SHELL_SHELLEXECUTE = 0x00001806 URLACTION_SHELL_EXECUTE_HIGHRISK = 0x00001806 URLACTION_SHELL_EXECUTE_MODRISK = 0x00001807 URLACTION_SHELL_EXECUTE_LOWRISK = 0x00001808 URLACTION_SHELL_POPUPMGR = 0x00001809 URLACTION_SHELL_RTF_OBJECTS_LOAD = 0x0000180A URLACTION_SHELL_ENHANCED_DRAGDROP_SECURITY = 0x0000180B URLACTION_SHELL_EXTENSIONSECURITY = 0x0000180C URLACTION_SHELL_SECURE_DRAGSOURCE = 0x0000180D URLACTION_SHELL_CURR_MAX = 0x0000180D URLACTION_SHELL_MAX = 0x000019ff URLACTION_NETWORK_MIN = 0x00001A00 URLACTION_CREDENTIALS_USE = 0x00001A00 URLPOLICY_CREDENTIALS_SILENT_LOGON_OK = 0x00000000 URLPOLICY_CREDENTIALS_MUST_PROMPT_USER = 0x00010000 URLPOLICY_CREDENTIALS_CONDITIONAL_PROMPT = 0x00020000 URLPOLICY_CREDENTIALS_ANONYMOUS_ONLY = 0x00030000 URLACTION_AUTHENTICATE_CLIENT = 0x00001A01 URLPOLICY_AUTHENTICATE_CLEARTEXT_OK = 0x00000000 URLPOLICY_AUTHENTICATE_CHALLENGE_RESPONSE = 0x00010000 URLPOLICY_AUTHENTICATE_MUTUAL_ONLY = 0x00030000 URLACTION_COOKIES = 0x00001A02 URLACTION_COOKIES_SESSION = 0x00001A03 URLACTION_CLIENT_CERT_PROMPT = 0x00001A04 URLACTION_COOKIES_THIRD_PARTY = 0x00001A05 URLACTION_COOKIES_SESSION_THIRD_PARTY = 0x00001A06 URLACTION_COOKIES_ENABLED = 0x00001A10 URLACTION_NETWORK_CURR_MAX = 0x00001A10 URLACTION_NETWORK_MAX = 0x00001Bff URLACTION_JAVA_MIN = 0x00001C00 URLACTION_JAVA_PERMISSIONS = 0x00001C00 URLPOLICY_JAVA_PROHIBIT = 0x00000000 URLPOLICY_JAVA_HIGH = 0x00010000 URLPOLICY_JAVA_MEDIUM = 0x00020000 URLPOLICY_JAVA_LOW = 0x00030000 URLPOLICY_JAVA_CUSTOM = 0x00800000 URLACTION_JAVA_CURR_MAX = 0x00001C00 URLACTION_JAVA_MAX = 0x00001Cff URLACTION_INFODELIVERY_MIN = 0x00001D00 URLACTION_INFODELIVERY_NO_ADDING_CHANNELS = 0x00001D00 URLACTION_INFODELIVERY_NO_EDITING_CHANNELS = 0x00001D01 URLACTION_INFODELIVERY_NO_REMOVING_CHANNELS = 0x00001D02 URLACTION_INFODELIVERY_NO_ADDING_SUBSCRIPTIONS = 0x00001D03 URLACTION_INFODELIVERY_NO_EDITING_SUBSCRIPTIONS = 0x00001D04 URLACTION_INFODELIVERY_NO_REMOVING_SUBSCRIPTIONS = 0x00001D05 URLACTION_INFODELIVERY_NO_CHANNEL_LOGGING = 0x00001D06 URLACTION_INFODELIVERY_CURR_MAX = 0x00001D06 URLACTION_INFODELIVERY_MAX = 0x00001Dff URLACTION_CHANNEL_SOFTDIST_MIN = 0x00001E00 URLACTION_CHANNEL_SOFTDIST_PERMISSIONS = 0x00001E05 URLPOLICY_CHANNEL_SOFTDIST_PROHIBIT = 0x00010000 URLPOLICY_CHANNEL_SOFTDIST_PRECACHE = 0x00020000 URLPOLICY_CHANNEL_SOFTDIST_AUTOINSTALL = 0x00030000 URLACTION_CHANNEL_SOFTDIST_MAX = 0x00001Eff URLACTION_BEHAVIOR_MIN = 0x00002000 URLACTION_BEHAVIOR_RUN = 0x00002000 URLPOLICY_BEHAVIOR_CHECK_LIST = 0x00010000 URLACTION_FEATURE_MIN = 0x00002100 URLACTION_FEATURE_MIME_SNIFFING = 0x00002100 URLACTION_FEATURE_ZONE_ELEVATION = 0x00002101 URLACTION_FEATURE_WINDOW_RESTRICTIONS = 0x00002102 URLACTION_FEATURE_SCRIPT_STATUS_BAR = 0x00002103 URLACTION_FEATURE_FORCE_ADDR_AND_STATUS = 0x00002104 URLACTION_FEATURE_BLOCK_INPUT_PROMPTS = 0x00002105 URLACTION_AUTOMATIC_DOWNLOAD_UI_MIN = 0x00002200 URLACTION_AUTOMATIC_DOWNLOAD_UI = 0x00002200 URLACTION_AUTOMATIC_ACTIVEX_UI = 0x00002201 URLACTION_ALLOW_RESTRICTEDPROTOCOLS = 0x00002300 URLACTION_ALLOW_APEVALUATION = 0x00002301 URLACTION_WINDOWS_BROWSER_APPLICATIONS = 0x00002400 URLACTION_XPS_DOCUMENTS = 0x00002401 URLACTION_LOOSE_XAML = 0x00002402 URLACTION_LOWRIGHTS = 0x00002500 URLACTION_WINFX_SETUP = 0x00002600 URLPOLICY_ALLOW = 0x00 URLPOLICY_QUERY = 0x01 URLPOLICY_DISALLOW = 0x03 URLPOLICY_NOTIFY_ON_ALLOW = 0x10 URLPOLICY_NOTIFY_ON_DISALLOW = 0x20 URLPOLICY_LOG_ON_ALLOW = 0x40 URLPOLICY_LOG_ON_DISALLOW = 0x80 URLPOLICY_MASK_PERMISSIONS = 0x0f URLPOLICY_DONTCHECKDLGBOX = 0x100 URLZONE_ESC_FLAG = 0x100 SECURITY_IE_STATE_GREEN = 0x00000000 SECURITY_IE_STATE_RED = 0x00000001 SOFTDIST_FLAG_USAGE_EMAIL = 0x00000001 SOFTDIST_FLAG_USAGE_PRECACHE = 0x00000002 SOFTDIST_FLAG_USAGE_AUTOINSTALL = 0x00000004 SOFTDIST_FLAG_DELETE_SUBSCRIPTION = 0x00000008 SOFTDIST_ADSTATE_NONE = 0x00000000 SOFTDIST_ADSTATE_AVAILABLE = 0x00000001 SOFTDIST_ADSTATE_DOWNLOADED = 0x00000002 SOFTDIST_ADSTATE_INSTALLED = 0x00000003 CONFIRMSAFETYACTION_LOADOBJECT = 0x00000001 PK {Rwin32comext/bits/UT Zx`Zx`ux PK {Rwin32comext/bits/test/UT Zx`Zx`ux PK ѳPm"win32comext/bits/test/test_bits.pyUT l_Zx`ux  from win32com.server.util import wrap import pythoncom, sys, os, time, win32api, win32event, tempfile from win32com.bits import bits TIMEOUT = 200 # ms StopEvent = win32event.CreateEvent(None, 0, 0, None) job_name = 'bits-pywin32-test' states = dict([(val, (name[13:])) for name, val in vars(bits).items() if name.startswith('BG_JOB_STATE_')]) bcm = pythoncom.CoCreateInstance(bits.CLSID_BackgroundCopyManager, None, pythoncom.CLSCTX_LOCAL_SERVER, bits.IID_IBackgroundCopyManager) class BackgroundJobCallback: _com_interfaces_ = [bits.IID_IBackgroundCopyCallback] _public_methods_ = ["JobTransferred", "JobError", "JobModification"] def JobTransferred(self, job): print('Job Transferred', job) job.Complete() win32event.SetEvent(StopEvent) # exit msg pump def JobError(self, job, error): print('Job Error', job, error) f = error.GetFile() print('While downloading', f.GetRemoteName()) print('To', f.GetLocalName()) print('The following error happened:') self._print_error(error) if f.GetRemoteName().endswith('missing-favicon.ico'): print('Changing to point to correct file') f2 = f.QueryInterface(bits.IID_IBackgroundCopyFile2) favicon = 'http://www.python.org/favicon.ico' print('Changing RemoteName from', f2.GetRemoteName(), 'to', favicon) f2.SetRemoteName(favicon) job.Resume() else: job.Cancel() def _print_error(self, err): ctx, hresult = err.GetError() try: hresult_msg = win32api.FormatMessage(hresult) except win32api.error: hresult_msg = "" print("Context=0x%x, hresult=0x%x (%s)" % (ctx, hresult, hresult_msg)) print(err.GetErrorDescription()) def JobModification(self, job, reserved): state = job.GetState() print('Job Modification', job.GetDisplayName(), states.get(state)) # Need to catch TRANSIENT_ERROR here, as JobError doesn't get # called (apparently) when the error is transient. if state == bits.BG_JOB_STATE_TRANSIENT_ERROR: print("Error details:") err = job.GetError() self._print_error(err) job = bcm.CreateJob(job_name, bits.BG_JOB_TYPE_DOWNLOAD) job.SetNotifyInterface(wrap(BackgroundJobCallback())) job.SetNotifyFlags(bits.BG_NOTIFY_JOB_TRANSFERRED | bits.BG_NOTIFY_JOB_ERROR | bits.BG_NOTIFY_JOB_MODIFICATION) # The idea here is to intentionally make one of the files fail to be # downloaded. Then the JobError notification will be triggered, where # we do fix the failing file by calling SetRemoteName to a valid URL # and call Resume() on the job, making the job finish successfully. # # Note to self: A domain that cannot be resolved will cause # TRANSIENT_ERROR instead of ERROR, and the JobError notification will # not be triggered! This can bite you during testing depending on how # your DNS is configured. For example, if you use OpenDNS.org's DNS # servers, an invalid hostname will *always* be resolved (they # redirect you to a search page), so be careful when testing. job.AddFile('http://www.python.org/favicon.ico', os.path.join(tempfile.gettempdir(), 'bits-favicon.ico')) job.AddFile('http://www.python.org/missing-favicon.ico', os.path.join(tempfile.gettempdir(), 'bits-missing-favicon.ico')) for f in job.EnumFiles(): print('Downloading', f.GetRemoteName()) print('To', f.GetLocalName()) job.Resume() while True: rc = win32event.MsgWaitForMultipleObjects( (StopEvent,), 0, TIMEOUT, win32event.QS_ALLEVENTS) if rc == win32event.WAIT_OBJECT_0: break elif rc == win32event.WAIT_OBJECT_0+1: if pythoncom.PumpWaitingMessages(): break # wm_quit PK ѳPxett&win32comext/bits/test/show_all_jobs.pyUT l_Zx`ux # Dump lots of info about BITS jobs. from win32com.bits import bits import pythoncom states = dict([(val, (name[13:])) for name, val in vars(bits).items() if name.startswith('BG_JOB_STATE_')]) job_types = dict([(val, (name[12:])) for name, val in vars(bits).items() if name.startswith('BG_JOB_TYPE_')]) bcm = pythoncom.CoCreateInstance(bits.CLSID_BackgroundCopyManager, None, pythoncom.CLSCTX_LOCAL_SERVER, bits.IID_IBackgroundCopyManager) try: enum = bcm.EnumJobs(bits.BG_JOB_ENUM_ALL_USERS) except pythoncom.error: print("Failed to get jobs for all users - trying for current user") enum = bcm.EnumJobs(0) for job in enum: print("Job:", job.GetDisplayName()) print("Description:", job.GetDescription()) print("Id:", job.GetId()) print("State:", states.get(job.GetState())) print("Type:", job_types.get(job.GetType())) print("Owner:", job.GetOwner()) print("Errors:", job.GetErrorCount()) print("Created/Modified/Finished times:", [str(t) for t in job.GetTimes()]) bytes_tot, bytes_xf, files_tot, files_xf = job.GetProgress() print("Bytes: %d complete of %d total" % (bytes_xf, bytes_tot)) print("Files: %d complete of %d total" % (files_xf, files_tot)) for f in job.EnumFiles(): bytes, total, done = f.GetProgress() print(" Remote:", f.GetRemoteName()) print(" Local:", f.GetLocalName()) print(" Progress: %d of %d bytes - completed=%s)" % (bytes, total, done)) print() print() PK v$nQP1win32comext/bits/bits.pydUT ^_ux MZ@ !L!This program cannot be run in DOS mode. $1Fur(Sur(Sur(S| Sqr(SN,)Rwr(SN,+Rtr(SN,-Rdr(SN,,R~r(S,)Rqr(Sa)Rwr(S)Rrr(Sur)Sr(S.Rqr(S,-R~r(S,(Rtr(S,*Rtr(SRichur(SPEL^_! T\"VpP@HȘDPЉT(@p.textST `.rdataJ:p<X@@.data  @.gfidsL@@.rsrcD@@.relocP@BhpPhPj5,qPPh0sP\qPhcPBYhPh`Pj5,qPPhsP\qPhcPhBYh@PhPjhPhtPP\qPh cP9BYhp/PhаPj5,qPPhxP\qPh0cPBYhP5PhPjhPhLzPpP\qPh@cPAYh@9Ph`PjhpPhH{PHP\qPhPcPAYhu~u pPV׃USPhPpP_^][̡pPhP0pP3̋D$8uxu pPpPÉD$%qPqPu3WhhPpPtWpPu3_Vj h@PPqP5pPjh|PWjhPWjhPWjhPWjh܄PWփHjhPWjh PWjh$PWjhHPWjhpPWjhPWփHjhPWjh؅PWjh PWjh@PWjhpPWjhPWփHjhPWjh̆PWjhPWjhPWjh4PWjhXPWփHjhX~PWjht~PWjh~PWjh~PWjh~PWjh~PWփHjh~PWjhPWjh0PWjhDPWjh\PWjhxPWփHjhPWjhPWjhPWjhPWjhPWjhPWփHjh,PWjh@PWjh\PWjhxPWjhPWjhPWփHjhPWփ ^_̋̋QVt$ t$qPPFЇPFPFP^Y%qPVqPD$t jVM^%qPl$l$l$̋D$P%qPl$l$l$%qPl$l$l$VWu3_^L$ P ;usG_^D$ ϋqP_^QT$D$ V ;usD$D$^YD$D$^Y̋T$D$V f ;us^3^%EP+PQgYYt'x$|!EE3Ɂ8ËeE2 Ut}u 3P]U=ԿPt} uuiuaYY]UP3Puȃu hPYY#E]UP3ȿPȃu]uhȿPYY]UuYH]TPUEVTPt j VYY^]U]UE t3t tt3@0uuY}PY] jhPPjBYu34E]e=PtjPite hn]P1 $]PD $rPhrP YYu)t hqPhqP YYP2ۈ]EDL >tVGYtu ju6SؿP3@Ê]uYj hP>ؿP3OHؿP"Ee=Ptj%PEju]YY3Ʉ#u"Yj hЗP} u9=ؿP3et t]1]SWuuSWuuSWuwuu"uSPu_SVuSVu`tuHSWuout5SWu:$MQ0hSPuu uËe3uEUV5XPu3@uu u^] U]U} uuu u ] UaaEAP]UVuXP^]aaAPPUVu%P^]aaAPPUVF`P `PEPA YY^]UE`PaaA]A`PP YÍA`PP YÍA`PP YUVF`PP EYt j V}YY^]UVF`PP EYt j VPYY^]UVF`PP EYt j V#YY^]U MhPEPQ U Mh@PEP4 ̋AuhP U%ܿP(S3C شPj me3 شP3VWܿP}S[wOW E؋MEineIE5ntel ȋEj5Genu XjYS[wOW uCE%?=t#=`t=pt=Pt=`t=pu=P=P=P}EEEEE|2jX3S[]؉sKS EܩEEt =P_^tm شPܿPtUtN3ЉEUEM3Ƀu3u/شPܿPE شPt ܿPشP3[]3@39PU$SVjtM)3hVP5PH |xffftfpflfhEEDž@jPEVPE E@EEpPVXۍEEۉEpPEP pPu !P^[]UDjDEjPO EPpPEtEj X]3jpPȅu2øMZf9uA<8PEu f9HuۃxtvՃhb[PpPUE8csmu%xu@= t=!t="t =@t3]̃%P%qPh\Pd5D$l$l$+SVWP1E3PeuEEEEdËMd Y__^[]QUuuu uh]PhP ]UeePVWN@;t t УPfEP(pPE3EE$pP1E pP1EEPpPME3M3M3;uO@u G ȉ Pщ P_^]U} u=XPu u,pP3@] hP0pPhP8YøPøPHHHHøPSVPP;sW>t J׃;r_^[SVPP;sW>t ׃;r_^[Ë qP3]P; Pu(UjpPu pPh 4pPPpP]U$jtjY)P PPP5P=PfPf PfPfPf%Pf-PPEPEPEPPPP PP PPjXkǀPjXk PLjX PLhP]Uj]UjtM)P PPP5P=PfPf PfPfPf%Pf-PPEPEPEPP PP PPjXkMPhP]U jtM)P PPP5P=PfPf PfPfPf%Pf-PPEPEPEPP PP P} v }ue } vE HE E @PjXkMPeE@EE;E sEMU PhP]%pP%pP% pP%pP%pP%pP%pP% pP%$pP%(pP%,pP%0pP%4pP%pP%\pP%LpP%XpP%TpP%PpP%DpP%HpP%lpP%dpP%pP%pP%tpP%pP%xpP%|pP%pP%pP%pP%pP%pP%hpP%pPðððð3jEPøPMjEPøP-jEPøP jEPøDPjEPøpPjEPzøPjEPZøȖPjEP:øPmjEPø PMjEPøLP-̹P%XqP̹P%XqP̹P%XqP̹P%XqP̹pP%XqP̹HP%XqP̹ P%XqP̹P%qP̹оP%qP"8Vh|§ܧƨZrD:xЩک \n4NjҜ"&8ԛv֣pğpJ"Ԟl:؝b֢l@ޡZ"ĠzDN¥\]PP0P`PPPP PPPPOJobTransferredOOJobErrorOlJobModificationc:\src\python-3.8\include\object.h:GetErrorlk:GetFile|l:GetErrorDescriptionl:GetErrorContextDescription:GetProtocolGetErrorGetFileGetErrorDescriptionGetErrorContextDescriptionGetProtocolPyIBackgroundCopyErrorc:\src\python-3.8\include\object.hHPMPMPMPMPMPMP@P:GetRemoteName:GetLocalName:GetProgressGetRemoteNameGetLocalNameGetProgressPyIBackgroundCopyFilec:\src\python-3.8\include\object.hPMPMPMPMPMPMPP:GetFileRangesO:SetRemoteNameGetFileRangesSetRemoteNamePyIBackgroundCopyFile2c:\src\python-3.8\include\object.hPMPMPMPMPMPMPPO:AddFileSetOO:AddFile:EnumFiles:Suspend:Resume:Cancel:Complete:GetType:GetProgress:GetTimesc:\src\python-3.8\include\object.h:GetState:GetError:GetOwnerO:SetDisplayName:GetDisplayNameO:SetDescription:GetDescriptionl:SetPriority:GetPriorityl:SetNotifyFlags:GetNotifyFlagsO:SetNotifyInterface:GetNotifyInterfacel:SetMinimumRetryDelay:GetMinimumRetryDelayl:SetNoProgressTimeout:GetNoProgressTimeout:GetErrorCountlOO:SetProxySettings:GetProxySettingslNN:TakeOwnershipAddFileSetAddFileEnumFilesSuspendResumeCancelCompleteGetIdGetTypeGetProgressGetTimesGetStateGetErrorGetOwnerSetDisplayNameGetDisplayNameSetDescriptionGetDescriptionSetPriorityGetPrioritySetNotifyFlagsGetNotifyFlagsSetNotifyInterfaceGetNotifyInterfaceSetMinimumRetryDelayGetMinimumRetryDelaySetNoProgressTimeoutGetNoProgressTimeoutGetErrorCountSetProxySettingsGetProxySettingsTakeOwnershipPyIBackgroundCopyJobHPMPMPMPMPMPMP@/POO:SetNotifyCmdLine:GetNotifyCmdLineNN:GetReplyProgress:GetReplyDataO:SetReplyFileName:GetReplyFileNamec:\src\python-3.8\include\object.hO:SetCredentialsSetNotifyCmdLineGetNotifyCmdLineGetReplyProgressGetReplyDataSetReplyFileNameGetReplyFileNameSetCredentialsPyIBackgroundCopyJob2PMPMPMPMPMPMP 5POO:ReplaceRemotePrefixOOO:AddFileWithRangesl:SetFileACLFlagsc:\src\python-3.8\include\object.h:GetFileACLFlagsReplaceRemotePrefixAddFileWithRangesSetFileACLFlagsGetFileACLFlagsPyIBackgroundCopyJob3PMPMPMPMPMPMP9POl:CreateJobO:GetJobl:EnumJobsll:GetErrorDescriptionCreateJobGetJobEnumJobsGetErrorDescriptionPyIBackgroundCopyManagerc:\src\python-3.8\include\object.hPPMPMPMPMPMPMP3C:\src\pywin32\build\temp.win32-3.8\Release\bits.pdb+ .text$diP.text$mna@.text$xc.text$ydp.idata$5q.00cfgq.CRT$XCAq$.CRT$XCUq.CRT$XCZr.CRT$XIAr.CRT$XIZr.CRT$XPA r.CRT$XPZr.CRT$XTAr .CRT$XTZ rd.rdata .rdata$r,.rdata$sxdata.rdata$zzzdbg.rtc$IAA.rtc$IZZ.rtc$TAA.rtc$TZZ.xdata$xH.edataȘ.idata$2|.idata$3.idata$4`.idata$6.data$.data$r .bssL.gfids$yaP"PaP"PbP"P bP"_register_onexit_function$_execute_onexit_table_crt_atexit_crt_at_quick_exit_cexit8_initterm9_initterm_efreejterminateapi-ms-win-crt-heap-l1-1-0.dllapi-ms-win-crt-runtime-l1-1-0.dllrPPrPPrP PsPP$sPpPsPPsPPsPPdtPPttP0PwPPwPPwPpP(wPP0wPpP8wPP@wPP PLwP PTwP0!P\wP!PhwP@"PtwP"PwPP#PwP#PwPp$PwP %PwP%PwP`&PwP&PwPp'PwP'PxPp(PxP(P$xP)P8xP@*PPxP*PhxP@+PxP+PxP@,PxP,PxP-PxP.PyP0PyP0PyP1PzP@2PzP3P(zP3P0C0H0N0S0a0f0m0r0w0}000000000000000000011 11!1&1.13181>1C1Q1V1^1c1h1n1s11111111111122292C2e2k2t22222222233"3=3G3e33333344(4C4O4W4n4t4444444445*5L5V5e555555555 6'636;6O6^6x6666666667772787E7K7v777777 88$8:8F8N8`8o88888888889/999H9^9j9r99999999:K:Q:Z::::::;;;S;];w;;;;;;;;;<>0><>D>T>^>x>>>>>>>>>??#?2?C?O?W?e?w?????????? 00#0/070E0W0i0s0000000001 1181K1U1d1z111111111 22J2_2i2x222222233&3.3@3X3k3u33333333344*464>4P4_4z444444444 55(5;5E5T5j5v5~555555566(606?6I6h6{66666666677)7>7J7R7_7i7x77777777788)8>8J8R8_8i8x8888888889919;9J9m9y999999999:::':H:`:j:y:::::::::: ;;;0;H;`;j;y;;;;;;;;;; <<<0=_=p=|======== >>>3>L>R>X>>>>>>>>>???2?8?E?K?v????0(020@0t000000011'1E1Q1Y1m11111112 22^2h2w2222222#3-3G3V3q3x33333333344"414c4m4444444445%5V555566D6a6r6~666666K7p77777778 8,848C8j8t8888888899F9999999 ::B:I:U:]:n:x::::::: ;;#;-;J;d;n;};;;;;;; <<"<@ >>0>K>d>l>>>>>>>&?0?D?X?m?y???????????@0 0"0,0@0T0j0v0~0000000000&1[1a1j11111282=2E2`2{22222233/3V3`3t3333333333444&424<4R4\4p444444444455%5+5V5555566&6-646666666777-767<7c7r7{77777777788-8?8O8U8q8v8~8888888889 999&909:9G9Q9[9e9o9y9999999999999:::":,:6:C:M:W:a:k:u:::::::::::::;>;D;M;T;[;r;;;;<2> >>>>$>*>0>6><>B>H>N>T>Z>`>f>l>r>x>~>>>>>>>>>> ???Ph001&191E1U1f1111111(252\2d2}222222g3333333344\4y444444555Z6r666666667'787O7|7777 88*8E8P888809?9F9|9999999:::::;W;];;;;;+<0=F=K=q=v=========> >>>>$>+>2>9>@>G>N>V>^>f>r>{>>>>>>>>>? ????$?+?2?9?@?G?N?U?]?e?m?x?}?????????????`0 0000%0-050=0H0M0S0]00000000000001 1111"1(1.141:1@1F1L1R1X1^1d1j1p1v1|1111111111202P2p222223333!3'31373A3G3Q3W3a3g3q3w333p1111111111l3p3t3x3|3333$4(4,4044484<4@44444444488999 999d:h:l:p:t:x:|::`;d;h;l;p;t;x;|;4<8<<<@8><>@>D>H>L>P>@1D1H1T1X1\1`1h1l1p1x1|11111111111111111111111111122 222|777777777777777777777777777777777888 8P9T9\9`9d9|99999999d:h:p:::::::::::::; ;$;,;D;T;X;h;l;p;t;x;;;;;;;;;;;;;<<<<< <$<,>>> >$>(>0>H>X>\>d>|>>>>>>>>>>>>>>>>?? ?0?4?8?GetSomeInterface( &p1 ); # p->GetSomeInterface( &p2 ); # p1==p2 # By default, this is _not_ true for Python. # (Now this is only true for Document objects, and Python # now does ensure this. all_wrapped = {} def _wrap_nodebug(object, iid): return win32com.server.util.wrap(object, iid) def _wrap_debug(object, iid): import win32com.server.policy dispatcher = win32com.server.policy.DispatcherWin32trace return win32com.server.util.wrap(object, iid, useDispatcher = dispatcher) if debugging: _wrap = _wrap_debug else: _wrap = _wrap_nodebug def _wrap_remove(object, iid = None): # Old - no longer used or necessary! return def _dump_wrapped(): from win32com.server.util import unwrap print("Wrapped items:") for key, items in all_wrapped.items(): print(key, end=' ') try: ob = unwrap(key) print(ob, sys.getrefcount(ob)) except: print("") def RaiseNotImpl(who = None): if who is not None: print("********* Function %s Raising E_NOTIMPL ************" % (who)) # Print a sort-of "traceback", dumping all the frames leading to here. try: 1/0 except: frame = sys.exc_info()[2].tb_frame while frame: print("File: %s, Line: %d" % (frame.f_code.co_filename, frame.f_lineno)) frame = frame.f_back # and raise the exception for COM raise Exception(scode=winerror.E_NOTIMPL) import win32com.server.policy class Dispatcher(win32com.server.policy.DispatcherWin32trace): def __init__(self, policyClass, object): win32com.server.policy.DispatcherTrace.__init__(self, policyClass, object) import win32traceutil # Sets up everything. # print "Object with win32trace dispatcher created (object=%s)" % `object` def _QueryInterface_(self, iid): rc = win32com.server.policy.DispatcherBase._QueryInterface_(self, iid) # if not rc: # self._trace_("in _QueryInterface_ with unsupported IID %s (%s)\n" % (IIDToInterfaceName(iid),iid)) return rc def _Invoke_(self, dispid, lcid, wFlags, args): print("In Invoke with", dispid, lcid, wFlags, args, "with object",self.policy._obj_) try: rc = win32com.server.policy.DispatcherBase._Invoke_(self, dispid, lcid, wFlags, args) # print "Invoke of", dispid, "returning", rc return rc except Exception: t, v, tb = sys.exc_info() tb = None # A cycle scode = v.scode try: desc = " (" + str(v.description) + ")" except AttributeError: desc = "" print("*** Invoke of %s raised COM exception 0x%x%s" % (dispid, scode, desc)) except: print("*** Invoke of %s failed:" % dispid) typ, val, tb = sys.exc_info() import traceback traceback.print_exception(typ, val, tb) raise PK ѳPF JJ win32comext/axdebug/documents.pyUT l_Zx`ux """ Management of documents for AXDebugging. """ import axdebug, gateways import pythoncom from .util import _wrap, _wrap_remove, RaiseNotImpl, trace from win32com.server.util import unwrap from . import codecontainer from . import contexts from win32com.server.exception import Exception import win32api, winerror, os, string, sys #def trace(*args): # pass def GetGoodFileName(fname): if fname[0] != "<": return win32api.GetFullPathName(fname) return fname class DebugDocumentProvider(gateways.DebugDocumentProvider): def __init__(self, doc): self.doc = doc def GetName(self, dnt): return self.doc.GetName(dnt) def GetDocumentClassId(self): return self.doc.GetDocumentClassId() def GetDocument(self): return self.doc class DebugDocumentText(gateways.DebugDocumentInfo, gateways.DebugDocumentText, gateways.DebugDocument): _com_interfaces_ = gateways.DebugDocumentInfo._com_interfaces_ + \ gateways.DebugDocumentText._com_interfaces_ + \ gateways.DebugDocument._com_interfaces_ _public_methods_ = gateways.DebugDocumentInfo._public_methods_ + \ gateways.DebugDocumentText._public_methods_ + \ gateways.DebugDocument._public_methods_ # A class which implements a DebugDocumentText, using the functionality # provided by a codeContainer def __init__(self, codeContainer): gateways.DebugDocumentText.__init__(self) gateways.DebugDocumentInfo.__init__(self) gateways.DebugDocument.__init__(self) self.codeContainer = codeContainer def _Close(self): self.docContexts = None # self.codeContainer._Close() self.codeContainer = None # IDebugDocumentInfo def GetName(self, dnt): return self.codeContainer.GetName(dnt) def GetDocumentClassId(self): return "{DF630910-1C1D-11d0-AE36-8C0F5E000000}" # IDebugDocument has no methods! # # IDebugDocumentText methods. # def GetDocumentAttributes def GetSize(self): # trace("GetSize") return self.codeContainer.GetNumLines(), self.codeContainer.GetNumChars() def GetPositionOfLine(self, cLineNumber): return self.codeContainer.GetPositionOfLine(cLineNumber) def GetLineOfPosition(self, charPos): return self.codeContainer.GetLineOfPosition(charPos) def GetText(self, charPos, maxChars, wantAttr): # Get all the attributes, else the tokenizer will get upset. # XXX - not yet! # trace("GetText", charPos, maxChars, wantAttr) cont = self.codeContainer attr = cont.GetSyntaxColorAttributes() return cont.GetText(), attr def GetPositionOfContext(self, context): trace("GetPositionOfContext", context) context = unwrap(context) return context.offset, context.length # Return a DebugDocumentContext. def GetContextOfPosition(self, charPos, maxChars): # Make one doc = _wrap(self, axdebug.IID_IDebugDocument) rc = self.codeContainer.GetCodeContextAtPosition(charPos) return rc.QueryInterface(axdebug.IID_IDebugDocumentContext) class CodeContainerProvider: """An abstract Python class which provides code containers! Given a Python file name (as the debugger knows it by) this will return a CodeContainer interface suitable for use. This provides a simple base imlpementation that simply supports a dictionary of nodes and providers. """ def __init__(self): self.ccsAndNodes = {} def AddCodeContainer(self, cc, node = None): fname = GetGoodFileName(cc.fileName) self.ccsAndNodes[fname] = cc, node def FromFileName(self, fname): cc, node = self.ccsAndNodes.get(GetGoodFileName(fname), (None, None)) # if cc is None: # print "FromFileName for %s returning None" % fname return cc def Close(self): for cc, node in self.ccsAndNodes.values(): try: # Must close the node before closing the provider # as node may make calls on provider (eg Reset breakpoints etc) if node is not None: node.Close() cc._Close() except pythoncom.com_error: pass self.ccsAndNodes = {} PK ѳPi""$win32comext/axdebug/codecontainer.pyUT l_Zx`ux """A utility class for a code container. A code container is a class which holds source code for a debugger. It knows how to color the text, and also how to translate lines into offsets, and back. """ import sys from win32com.axdebug import axdebug import tokenize from .util import RaiseNotImpl, _wrap from win32com.server.exception import Exception import win32api, winerror from . import contexts _keywords = {} # set of Python keywords for name in """ and assert break class continue def del elif else except exec finally for from global if import in is lambda not or pass print raise return try while """.split(): _keywords[name] = 1 class SourceCodeContainer: def __init__(self, text, fileName = "", sourceContext = 0, startLineNumber = 0, site = None, debugDocument = None): self.sourceContext = sourceContext # The source context added by a smart host. self.text = text if text: self._buildlines() self.nextLineNo = 0 self.fileName = fileName self.codeContexts = {} self.site = site self.startLineNumber = startLineNumber self.debugDocument = None def _Close(self): self.text = self.lines = self.lineOffsets = None self.codeContexts = None self.debugDocument = None self.site = None self.sourceContext = None def GetText(self): return self.text def GetName(self, dnt): assert 0, "You must subclass this" def GetFileName(self): return self.fileName def GetPositionOfLine(self, cLineNumber): self.GetText() # Prime us. try: return self.lineOffsets[cLineNumber] except IndexError: raise Exception(scode=winerror.S_FALSE) def GetLineOfPosition(self, charPos): self.GetText() # Prime us. lastOffset = 0 lineNo = 0 for lineOffset in self.lineOffsets[1:]: if lineOffset > charPos: break lastOffset = lineOffset lineNo = lineNo + 1 else: # for not broken. # print "Cant find", charPos, "in", self.lineOffsets raise Exception(scode=winerror.S_FALSE) # print "GLOP ret=",lineNo, (charPos-lastOffset) return lineNo, (charPos-lastOffset) def GetNextLine(self): if self.nextLineNo>=len(self.lines): self.nextLineNo = 0 # auto-reset. return "" rc = self.lines[self.nextLineNo] self.nextLineNo = self.nextLineNo + 1 return rc def GetLine(self, num): self.GetText() # Prime us. return self.lines[num] def GetNumChars(self): return len(self.GetText()) def GetNumLines(self): self.GetText() # Prime us. return len(self.lines) def _buildline(self, pos): i = self.text.find('\n', pos) if i < 0: newpos = len(self.text) else: newpos = i+1 r = self.text[pos:newpos] return r, newpos def _buildlines(self): self.lines = [] self.lineOffsets = [0] line, pos = self._buildline(0) while line: self.lines.append(line) self.lineOffsets.append(pos) line, pos = self._buildline(pos) def _ProcessToken(self, type, token, spos, epos, line): srow, scol = spos erow, ecol = epos self.GetText() # Prime us. linenum = srow - 1 # Lines zero based for us too. realCharPos = self.lineOffsets[linenum] + scol numskipped = realCharPos - self.lastPos if numskipped==0: pass elif numskipped==1: self.attrs.append(axdebug.SOURCETEXT_ATTR_COMMENT) else: self.attrs.append((axdebug.SOURCETEXT_ATTR_COMMENT, numskipped)) kwSize = len(token) self.lastPos = realCharPos + kwSize attr = 0 if type==tokenize.NAME: if token in _keywords: attr = axdebug.SOURCETEXT_ATTR_KEYWORD elif type==tokenize.STRING: attr = axdebug.SOURCETEXT_ATTR_STRING elif type==tokenize.NUMBER: attr = axdebug.SOURCETEXT_ATTR_NUMBER elif type==tokenize.OP: attr = axdebug.SOURCETEXT_ATTR_OPERATOR elif type==tokenize.COMMENT: attr = axdebug.SOURCETEXT_ATTR_COMMENT # else attr remains zero... if kwSize==0: pass elif kwSize==1: self.attrs.append(attr) else: self.attrs.append((attr, kwSize)) def GetSyntaxColorAttributes(self): self.lastPos = 0 self.attrs = [] try: tokenize.tokenize(self.GetNextLine, self._ProcessToken) except tokenize.TokenError: pass # Ignore - will cause all subsequent text to be commented. numAtEnd = len(self.GetText()) - self.lastPos if numAtEnd: self.attrs.append((axdebug.SOURCETEXT_ATTR_COMMENT, numAtEnd)) return self.attrs # We also provide and manage DebugDocumentContext objects def _MakeDebugCodeContext(self, lineNo, charPos, len): return _wrap(contexts.DebugCodeContext(lineNo, charPos, len, self, self.site), axdebug.IID_IDebugCodeContext) # Make a context at the given position. It should take up the entire context. def _MakeContextAtPosition(self, charPos): lineNo, offset = self.GetLineOfPosition(charPos) try: endPos = self.GetPositionOfLine(lineNo+1) except: endPos = charPos codecontext = self._MakeDebugCodeContext(lineNo, charPos, endPos-charPos) return codecontext # Returns a DebugCodeContext. debugDocument can be None for smart hosts. def GetCodeContextAtPosition(self, charPos): # trace("GetContextOfPos", charPos, maxChars) # Convert to line number. lineNo, offset = self.GetLineOfPosition(charPos) charPos = self.GetPositionOfLine(lineNo) try: cc = self.codeContexts[charPos] # trace(" GetContextOfPos using existing") except KeyError: cc = self._MakeContextAtPosition(charPos) self.codeContexts[charPos] = cc return cc class SourceModuleContainer(SourceCodeContainer): def __init__(self, module): self.module = module if hasattr(module, '__file__'): fname = self.module.__file__ # Check for .pyc or .pyo or even .pys! if fname[-1] in ['O','o','C','c', 'S', 's']: fname = fname[:-1] try: fname = win32api.GetFullPathName(fname) except win32api.error: pass else: if module.__name__=='__main__' and len(sys.argv)>0: fname = sys.argv[0] else: fname = "" SourceCodeContainer.__init__(self, None, fname) def GetText(self): if self.text is None: fname = self.GetFileName() if fname: try: self.text = open(fname, "r").read() except IOError as details: self.text = "# Exception opening file\n# %s" % (repr(details)) else: self.text = "# No file available for module '%s'" % (self.module) self._buildlines() return self.text def GetName(self, dnt): name = self.module.__name__ try: fname = win32api.GetFullPathName(self.module.__file__) except win32api.error: fname = self.module.__file__ except AttributeError: fname = name if dnt==axdebug.DOCUMENTNAMETYPE_APPNODE: return name.split(".")[-1] elif dnt==axdebug.DOCUMENTNAMETYPE_TITLE: return fname elif dnt==axdebug.DOCUMENTNAMETYPE_FILE_TAIL: return os.path.split(fname)[1] elif dnt==axdebug.DOCUMENTNAMETYPE_URL: return "file:%s" % fname else: raise Exception(scode=winerror.E_UNEXPECTED) if __name__=='__main__': import sys sys.path.append(".") import ttest sc = SourceModuleContainer(ttest) # sc = SourceCodeContainer(open(sys.argv[1], "rb").read(), sys.argv[1]) attrs = sc.GetSyntaxColorAttributes() attrlen = 0 for attr in attrs: if type(attr)==type(()): attrlen = attrlen + attr[1] else: attrlen = attrlen + 1 text = sc.GetText() if attrlen!=len(text): print("Lengths dont match!!! (%d/%d)" % (attrlen, len(text))) # print "Attributes:" # print attrs print("GetLineOfPos=", sc.GetLineOfPosition(0)) print("GetLineOfPos=", sc.GetLineOfPosition(4)) print("GetLineOfPos=", sc.GetLineOfPosition(10)) PK ѳP>_77"win32comext/axdebug/expressions.pyUT l_Zx`ux import axdebug, gateways from .util import _wrap, _wrap_remove, RaiseNotImpl import io, traceback from pprint import pprint from win32com.server.exception import COMException import winerror import string import sys # Given an object, return a nice string def MakeNiceString(ob): stream = io.StringIO() pprint(ob, stream) return string.strip(stream.getvalue()) class ProvideExpressionContexts(gateways.ProvideExpressionContexts): pass class ExpressionContext(gateways.DebugExpressionContext): def __init__(self, frame): self.frame = frame def ParseLanguageText(self, code, radix, delim, flags): return _wrap(Expression(self.frame, code, radix, delim, flags), axdebug.IID_IDebugExpression) def GetLanguageInfo(self): # print "GetLanguageInfo" return "Python", "{DF630910-1C1D-11d0-AE36-8C0F5E000000}" class Expression(gateways.DebugExpression): def __init__(self, frame, code, radix, delim, flags): self.callback = None self.frame = frame self.code = code self.radix = radix self.delim = delim self.flags = flags self.isComplete = 0 self.result=None self.hresult = winerror.E_UNEXPECTED def Start(self, callback): try: try: try: self.result = eval(self.code, self.frame.f_globals, self.frame.f_locals) except SyntaxError: exec(self.code, self.frame.f_globals, self.frame.f_locals) self.result = "" self.hresult = 0 except: l = traceback.format_exception_only(sys.exc_info()[0], sys.exc_info()[1]) # l is a list of strings with trailing "\n" self.result = string.join(map(lambda s:s[:-1], l), "\n") self.hresult = winerror.E_FAIL finally: self.isComplete = 1 callback.onComplete() def Abort(self): print("** ABORT **") def QueryIsComplete(self): return self.isComplete def GetResultAsString(self): # print "GetStrAsResult returning", self.result return self.hresult, MakeNiceString(self.result) def GetResultAsDebugProperty(self): result = _wrap(DebugProperty(self.code, self.result, None, self.hresult), axdebug.IID_IDebugProperty) return self.hresult, result def MakeEnumDebugProperty(object, dwFieldSpec, nRadix, iid, stackFrame = None): name_vals = [] if hasattr(object, "items") and hasattr(object, "keys"): # If it is a dict. name_vals = iter(object.items()) dictionary = object elif hasattr(object, "__dict__"): #object with dictionary, module name_vals = iter(object.__dict__.items()) dictionary = object.__dict__ infos = [] for name, val in name_vals: infos.append(GetPropertyInfo(name, val, dwFieldSpec, nRadix, 0, dictionary, stackFrame)) return _wrap(EnumDebugPropertyInfo(infos), axdebug.IID_IEnumDebugPropertyInfo) def GetPropertyInfo(obname, obvalue, dwFieldSpec, nRadix, hresult=0, dictionary = None, stackFrame = None): # returns a tuple name = typ = value = fullname = attrib = dbgprop = None if dwFieldSpec & axdebug.DBGPROP_INFO_VALUE: value = MakeNiceString(obvalue) if dwFieldSpec & axdebug.DBGPROP_INFO_NAME: name = obname if dwFieldSpec & axdebug.DBGPROP_INFO_TYPE: if hresult: typ = "Error" else: try: typ = type(obvalue).__name__ except AttributeError: typ = str(type(obvalue)) if dwFieldSpec & axdebug.DBGPROP_INFO_FULLNAME: fullname = obname if dwFieldSpec & axdebug.DBGPROP_INFO_ATTRIBUTES: if hasattr(obvalue, "has_key") or hasattr(obvalue, "__dict__"): # If it is a dict or object attrib = axdebug.DBGPROP_ATTRIB_VALUE_IS_EXPANDABLE else: attrib = 0 if dwFieldSpec & axdebug.DBGPROP_INFO_DEBUGPROP: dbgprop = _wrap(DebugProperty(name, obvalue, None, hresult, dictionary, stackFrame), axdebug.IID_IDebugProperty) return name, typ, value, fullname, attrib, dbgprop from win32com.server.util import ListEnumeratorGateway class EnumDebugPropertyInfo(ListEnumeratorGateway): """A class to expose a Python sequence as an EnumDebugCodeContexts Create an instance of this class passing a sequence (list, tuple, or any sequence protocol supporting object) and it will automatically support the EnumDebugCodeContexts interface for the object. """ _public_methods_ = ListEnumeratorGateway._public_methods_ + ["GetCount"] _com_interfaces_ = [ axdebug.IID_IEnumDebugPropertyInfo] def GetCount(self): return len(self._list_) def _wrap(self, ob): return ob class DebugProperty: _com_interfaces_ = [axdebug.IID_IDebugProperty] _public_methods_ = ['GetPropertyInfo', 'GetExtendedInfo', 'SetValueAsString', 'EnumMembers', 'GetParent' ] def __init__(self, name, value, parent = None, hresult = 0, dictionary = None, stackFrame = None): self.name = name self.value = value self.parent = parent self.hresult = hresult self.dictionary = dictionary self.stackFrame = stackFrame def GetPropertyInfo(self, dwFieldSpec, nRadix): return GetPropertyInfo(self.name, self.value, dwFieldSpec, nRadix, self.hresult, dictionary, stackFrame) def GetExtendedInfo(self): ### Note - not in the framework. RaiseNotImpl("DebugProperty::GetExtendedInfo") def SetValueAsString(self, value, radix): if self.stackFrame and self.dictionary: self.dictionary[self.name]= eval(value,self.stackFrame.f_globals, self.stackFrame.f_locals) else: RaiseNotImpl("DebugProperty::SetValueAsString") def EnumMembers(self, dwFieldSpec, nRadix, iid): # Returns IEnumDebugPropertyInfo return MakeEnumDebugProperty(self.value, dwFieldSpec, nRadix, iid, self.stackFrame) def GetParent(self): # return IDebugProperty RaiseNotImpl("DebugProperty::GetParent") PK Y03K7Q]]win32comext/axdebug/__init__.pyUT  YZx`ux # See if we have a special directory for the binaries (for developers) import win32com win32com.__PackageSupportBuildPath__(__path__) PK U$nQ͵}Owin32comext/axdebug/axdebug.pydUT b^_ux MZ@ !L!This program cannot be run in DOS mode. $)mèmèmèd;kèVoèVlèV|èVfèhèyoèièǝjèméèǝAèǝlèǝlèRichmèPELb^_! J@P@pLWT@D.text `.rdata2 @@.dataK&@.gfidsL`&@@.rsrcLp(@@.relocWX,@BhPJhxMj5tK5Mh(LKhKXYhJhMj5K5Mh<*LKhK(Yh0JhMj5tK6MhX,LKh KYhЩJh8Mj5tK7MhH/LKh0KȽYhpJhMjhUMh2L`8MKh@K虽YhJhMjh@Mh9L89MKhPKiYhJhhMj5tK:MhD;LKh`K8YhJhMjhWMhLMhELKhKHYhKhMj5tK0?MhhGLKhKYhKhMj5tK@Mh JLKhKYh KhHMjh@MhLKL@MKhK蹻Yh0KhhMjhj hKV׃ t,j@hKV׃ tjh KV׃ 3ɃD_^_3^Udjh?KPd%S]VWuWMd _^[]jk}Et(uK LG0LGDLGXL3M EOtQPE7ԋVH3҉_EʋM^d []UdjhKPd%S]VWuWMd _^[]j蛇}Et(uKHLGLGLGL3M EOtQPE7ԋVH3҉_EʋM^d []UdjhKPd%S]VWuWMd _^[]jˆ}Et(uK|LGLGLGL3M EOtQPE7ԋVH3҉_EʋM^d []Udjh?KPd%S]VWuWMd _^[]j }Et/uKLG`LGtLGLGL3M EOtQPE7ԋVH3҉_EʋM^d []UdjhKPd%S]VWuWMd _^[]j+}Et(uK\"LG"LG"LG"L3M EOtQPE7ԋVH3҉_EʋM^d []̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋QVt$ t$K LFp LF LF L^YQVt$ t$Kd&LF&LF&LF&LF&L^YQVt$ t$K LF LF LF, L^YQVt$ t$KLFLFLF(L^YQVt$ t$KPLFLFLFLFL^YQVt$ t$KLFLFLFLF,LF HL^YQVt$ t$K|LFLFLFL^YQVt$ t$KLF`LFtLFLFL^YQVt$ t$K LFpLFLFL^YQVt$ t$KLFhLF|LFLFL^YQVt$ t$KLFLFLFL^YQVt$ t$KLF LF4 LFH L^YQVt$ t$K"LF@#LFT#LFh#L^YQVt$ t$KLF,LF@LFTL^YQVt$ t$KlLFLFLFLFL^YQVt$ t$KLFLF$LF8LFPLF hL^YQVt$ t$K@!LF!LF!LF!LF!LF !LF$"L^YQVt$ t$K LF LF!LF!L^YQVt$ t$K\"LF"LF"LF"L^YQVt$ t$KLF(LF<LFPL^YQVt$ t$KtLFLFLFL^YQVt$ t$KHLFLFLFL^YQVt$ t$KLFTLFhLF|L^YQVt$ t$K$LF%LF%LF,%L^YQVt$ t$KLFPLFdLFxL^YQVt$ t$K4LFLFLFL^YQVt$ t$KLFLF$LF8LFLL^YQVt$ t$K#LF#LF#LF$L^YQVt$ t$KLFLFLFL^YQVt$ t$KLFLFLF(L^YQVt$ t$K@%LF%LF%LF%L^YQVt$ t$K'LFl'LF'LF'L^YQVt$ t$KLFLFLFL^YQVt$ t$K8LFLFLFL^YQVt$ t$KDLFLFLFL^YQVt$ t$KL LF LF LF L^YQVt$ t$K$$LFt$LF$LF$L^YQVt$ t$KLFdLFxLFL^YQVt$ t$K%LF(&LF<&LFP&L^YQVt$ t$K LF0LFDLFXL^YQVt$ t$KLFLFLF L^YQVt$ t$KdLFLFLFL^Y%K%K%K%K%K%K%K%K%K%K%K%K%K%K%K%K%K%K%K%K%K%K%K%K%K%K%K%K%K%K%K%K%K%K%K%K%K%K%K%K%K%KVKD$t jVt^VKD$t j Vut^VKD$t jVEt^VKD$t jVt^VKD$t j Vs^VKD$t j$Vs^VKD$t jVs^VKD$t j VUs^VKD$t jV%s^VKD$t j Vr^VKD$t jVr^VKD$t jVr^VKD$t jVer^VKD$t jV5r^VKD$t j Vr^VKD$t j$Vq^VKD$t j(Vq^VKD$t jVuq^VKD$t jVEq^VKD$t jVq^VKD$t jVp^VKD$t jVp^VKD$t jVp^VKD$t jVUp^VKD$t jV%p^VKD$t jVo^VKD$t j Vo^VKD$t jVo^VKD$t jVeo^VKD$t jV5o^VKD$t jVo^VKD$t jVn^VKD$t jVn^VKD$t jVun^VKD$t jVEn^VKD$t jVn^VKD$t jVm^VKD$t jVm^VKD$t jVm^VKD$t jVUm^VKD$t jV%m^VKD$t jVl^%Kl$l$l$%Kl$l$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$l$%Kl$l$l$l$l$ %Kl$l$l$%Kl$l$l$l$%Kl$l$l$%Kl$l$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$l$%Kl$l$l$l$l$ %Kl$l$l$l$l$ l$$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$l$rRl$xRl$Rl$tRl$Rl$Ppl$l$Rl$pl$l$9Rl$pl$bl$[l$bl$bl$vl$l$٪l$Ϫl$l$l$ l$/̋D$$L̋D$ďL̋D$L̋D$DL̋D$L̋D$4L̋D$L̋D$$L̋D$DL̋D$L̋D$TL̋D$L̋D$TL̋D$L̋D$L̋D$L̋D$dL̋D$L̋D$L̋D$L̋D$L̋D$ĐL̋D$ĒL̋D$$L̋D$L̋D$4L̋D$L̋D$L̋D$L̋D$ԐL̋D$L̋D$TL̋D$DL̋D$ԏL̋D$L̋D$TL̋D$ԎL̋D$| L̋D$tL̋D$L̋D$L̋D$4Ll$l$Ll$\l$\l$pl$3l$l$l$El$;l$ 1l$问l$]l$CLl$9l$*l$*l$il$jl$wil$-l$K%Kl$l$l$%Kl$l$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$l$%Kl$l$l$l$l$ %Kl$l$l$%Kl$l$l$l$%Kl$l$l$%Kl$l$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$l$%Kl$l$l$l$l$ %Kl$l$l$l$l$ l$$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$l$%Kl$l$l$l$l$ %Kl$l$l$%Kl$l$l$l$%Kl$l$l$%Kl$l$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$l$%Kl$l$l$l$l$ %Kl$l$l$l$l$ l$$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$%Kl$l$l$l$Yl$;l$NYl$dYVWu3_^L$ $L ;usG_^D$ ϋK_^VWu3_^L$ ďL ;usG_^D$ ϋK_^VWu3_^L$ L ;usG_^D$ ϋK_^VWu3_^L$ DL ;usG_^D$ ϋK_^VWu3_^L$ L ;usG_^D$ ϋ _^VWu3_^L$ 4L ;usG _^D$ ϋ_^VWu3_^L$ L ;usG_^D$ ϋK_^VWu3_^L$ $L ;usG_^D$ ϋs _^VWu3_^L$ DL ;usG_^D$ ϋK_^VWu3_^L$ L ;usG_^D$ ϋ3_^VWu3_^L$ TL ;usG_^D$ ϋK_^VWu3_^L$ L ;usG_^D$ ϋK_^VWu3_^L$ TL ;usG_^D$ ϋK_^VWu3_^L$ L ;usG_^D$ ϋK_^VWu3_^L$ L ;usG_^D$ ϋS_^VWu3_^L$ L ;usG _^D$ ϋs_^VWu3_^L$ dL ;usG$_^D$ ϋS_^VWu3_^L$ L ;usG_^D$ ϋK_^VWu3_^L$ L ;usG_^D$ ϋK_^VWu3_^L$ L ;usG_^D$ ϋK_^VWu3_^L$ L ;usG_^D$ ϋK_^VWu3_^L$ ĐL ;usG_^D$ ϋK_^VWu3_^L$ ĒL ;usG_^D$ ϋK_^VWu3_^L$ $L ;usG_^D$ ϋK_^VWu3_^L$ L ;usG_^D$ ϋK_^VWu3_^L$ 4L ;usG_^D$ ϋK_^VWu3_^L$ L ;usG_^D$ ϋS_^VWu3_^L$ L ;usG_^D$ ϋK_^VWu3_^L$ L ;usG_^D$ ϋK_^VWu3_^L$ ԐL ;usG_^D$ ϋK_^VWu3_^L$ L ;usG_^D$ ϋK_^VWu3_^L$ TL ;usG_^D$ ϋK_^VWu3_^L$ DL ;usG_^D$ ϋK_^VWu3_^L$ ԏL ;usG_^D$ ϋK_^VWu3_^L$ L ;usG_^D$ ϋK_^VWu3_^L$ TL ;usG_^D$ ϋK_^VWu3_^L$ ԎL ;usG_^D$ ϋK_^VWu3_^L$ | L ;usG_^D$ ϋK_^VWu3_^L$ tL ;usG_^D$ ϋK_^VWu3_^L$ L ;usG_^D$ ϋK_^VWu3_^L$ L ;usG_^D$ ϋK_^VWu3_^L$ 4L ;usG_^D$ ϋK_^QT$D$ V ;usD$D$^YD$D$^Y̋T$D$V f ;us^3^̋D$ uPXKY̋D$tu D$%XK%K̃Ut$$Ku3]ÍD$PD$PD$ Ph'Lt$80KtVjjD$Pt$$,KjD$Pt$4Kt$@K3ɉD$ Qo<D$ Kt$ Mt$$t$t$ t$UQ VKt$LF;M^Y>L%K̃UVWK|$0D$u @l$,L$ E}jQh>LWP@D$Ph>Lt$ K u"L$QPDPh>LuK Ojt$4hTLt$Ku L$QPDPh(>LuK D$ u PXKt$K_^]VWKt$L$hh>Ljhl>LQR@WK_^V>LKD$t jVo^UjhKdPd%QVj uEt)uK>LF;M^Md ]ËM3^d ]t$KhDLPt$K%KQVt$ t$(>LFL(()V>L(D$t jV@^UjhKdPd%QVjuEt(u(>LFM^Y8FL%KQSUVWKjhLt$$D$Kt$,5$Kt$4t$M^Md ]ËM3^d ]̋D$̋D$ uPXKY̋D$tu D$%XK%K̃U-KW|$$WՃD$u_3]ÍD$ PD$ PhxFLt$40Kt؋D$ 3SV@ QD$ 3ɋD$@ QD$Kt$T$D$$RT$Rt$(t$4PQ VD$$Kt$$yWhTLPVK^[_]t$t$  Ktt$S @5KVWhFLK-XK D$ t uWՃt uVՃt$SD$(^[_]̃St$$K؃u3[ÍD$PD$PD$PhFLt$80KtUV5KD$ WjPt$ փ t$@KD$jPt$$փ 3ɍE Qt$(K Vt$$D$,t$Ut$ SQ=_^][_^]3[QWt$ Ku3_YhFLt$0KtVKD$PWQVK^yhLjWK _YjhTLt$ K _YÃWt$Ku3_hFLt$0KtVKD$ PD$ PWQVKyhLjWK ^_t$pKt$VhFLKtu VXKt$V5XKփ6uV5XKփ5XKKhqL08K5XK,KthDL`KjhDLh@dK ؋D$uPփt$K_^][VWKt$L$h4sLjh8sLQR@WK_^VWKL$ jjh@sLQR@WK_^QSVWKL$؃D$ jPhHsLQR@5tKt$lKD$ uu PXKjhDLh@OtH3ɋy tKt$hDLWVKL$u QXKjhDLWdK SK_^[YVsLKD$t jV_N^UjhKdPd%QVjMuEt)uKsLFPM^Md ]ËM3^d ]t$KhDLPt$K̋D$̋D$ uPXKY%K̃D$D$Phu8.)U u} uuMPu UuuYY]t hXMYjYU}uXMu2]u jY]U Vutu|st*u&hXMYt2WhXM YD4MuWXMj Y+ȃ34MEEEXMEEuE_^]jjhL eMZf9Ju]<JJPEuL f9Ju>EJ+PQgYYt'x$|!EE3Ɂ8ËeE2 Ubt}u 3XM]U=XMt} uu5u-YY]U4M3XMuȃu hXMYY#E]U4M3XMȃu]uhXMYY]UuYH]UE t3t tt3@0L&uuY}PY] jhLHjzYu3lE]e=|XMtj|XMte hK6) $K%< $KhK YYu)1t hKhHK YY|XM2ۈ]EDL >tVYtu ju6SXM3@Ê]uYj h L6XM3OHXMZEe=|XMtj %|XMEjuYY3ɄuZYj h@L} u9=XM3et t]1]SWuuSWuuSWuouu"uSPuWSVuSVu`tuHSWuout5SWu:$MQ0hKuu uËe3uEUV5Lu3@uu u^] U]U} uuu u ] UaaEADL]UVuXDL^]aaALLDLUVu%`L^]aaAhL`LUVF$L `PEP9 YY^]UE$LaaA]A$LP YÍA$LP YÍA$LP YUVF$LP EYt j V}YY^]UVF$LP EYt j VPYY^]UVF$LPw EYt j V#YY^]U Mh\LEPI U MhLEP, ̋Au,L U%XM(S3C ,Mj me3 ,M3VWXM}S[wOW E؋MEineIE5ntel ȋEj5Genu XjYS[wOW uCE%?=t#=`t=pt=Pt=`t=pu=XM=XM=XM}EEEEE|2jX3S[]؉sKS EܩEEt =XM_^tm ,MXMtUtN3ЉEUEM3Ƀu3u/,MXME ,Mt XM,M3[]3@398MU$SVjtM)3hVP5XM@ |xffftfpflfhEEDž@jPEVPE E@EEKVXۍEEۉE KEPKu !XM^[]UDjDEjPG EPKEtEj X]3jKȅu2øMZf9uA<8PEu f9HuۃxtvՃhK KUE8csmu%xu@= t=!t="t =@t3]̃%XM%DKhKd5D$l$l$+SVW4M1E3PeuEEEEdËMd Y__^[]QUuuu uh,Kh4M ]Uee4MVWN@;t t У0MfEP$KE3EE K1EK1EEPKME3M3M3;uO@u G ȉ 4Mщ 0M_^]U} u=Lu u4K3@] hXM,KhXM8YøXMøXMHHHHø[MSVLL;sW>t R׃;r_^[SVLL;sW>t '׃;r_^[Ë DK3K; 4Mu(Uj KuKh (KP0K]U$jtjY)YM YMYMYM5YM=YMfYMf YMfYMfYMf%YMf-YMYMEYMEYMEYMYMYMXMXM XMXMjXkǀXMjXk 4MLjX 0MLhL]Uj]UjtM)YM YMYMYM5YM=YMfYMf YMfYMfYMf%YMf-YMYMEYMEYMEYMYMXMXM XMXMjXkMXMhL]U jtM)YM YMYMYM5YM=YMfYMf YMfYMfYMf%YMf-YMYMEYMEYMEYMYMXMXM XM} v }ue } vE HE E @XMjXkMXMeE@EE;E sEMU XMhL]%K%K%K% K%K%K%K%K% K%$K%4K%,K%(K%0K%TK%HK%LK%PK%XK%\K%`K%K%K%pK%lK%xK%|K%K%K%K%K%K%K%K%K%K%hK%Kðððð3jEPø L=j EPøLjEPøLLjEPø\Lj EPøLj$EPrøLjEPRøL}j EP2øL]jEPøL=j EPøLjEPøLjEPøHLjEPøLjEPrø(Lj EPRøTL}j$EP2øL]j(EPøL=jEPøtLjEPøLjEPødLjEPøLjEPrø8LjEPRøL}jEP2ø|L]jEPøL=jEPøLj EPø@LjEPø$LjEPøLjEPrø LjEPRøL}jEP2ø,L]jEPøL=jEPøLjEPøLjEPøxLjEPøPLjEPrø0LjEPRøL}jEP2øL]jEPøL=jEPølLjEPøXLjEPøLjEPøLjEPrøL̍M`LMְM%K̹0?M%K̹@M%K̹@M%K̹AM%K̹BM%K̹hCM%K̹@DM%K̹EM%K̹EM%K̹FM%K̹GM%K̹xHM%K̹PIM%K̹(JM%K̹KM%K̹KM%K̹LM%K̹MM%K̹`NM%K̹8OM%K̹PM%K̹PM%K̹QM%K̹RM%K̹pSM%K̹HTM%K̹ UM%K̹UM%K̹VM%K̹WM%K      . H ^ t      $ >  T ^ x     ">Zr  d,`6J`t  8H\rnZLD  d:tT"n6@(@"`2(X(    ^ :     \ KJ0J`JJJJ JPJJJJJ@JpJJJJ0J`JJJJ JPJJJJJ@JpJJJJ0J`JJJJ JPJJJCLSID_DefaultDebugSessionProviderCLSID_DefaultDebugSessionProvideraxdebugA module, encapsulating the ActiveX Debugging interfacesaxdebug.errorerrorAPPBREAKFLAG_DEBUGGER_BLOCKAPPBREAKFLAG_DEBUGGER_HALTAPPBREAKFLAG_STEPAPPBREAKFLAG_STEPTYPE_SOURCEAPPBREAKFLAG_STEPTYPE_BYTECODEAPPBREAKFLAG_STEPTYPE_MACHINEAPPBREAKFLAG_STEPTYPE_MASKAPPBREAKFLAG_IN_BREAKPOINTBREAKPOINT_DELETEDBREAKPOINT_DISABLEDBREAKPOINT_ENABLEDBREAKREASON_STEPBREAKREASON_BREAKPOINTBREAKREASON_DEBUGGER_BLOCKBREAKREASON_HOST_INITIATEDBREAKREASON_LANGUAGE_INITIATEDBREAKREASON_DEBUGGER_HALTBREAKREASON_ERRORBREAKRESUMEACTION_ABORTBREAKRESUMEACTION_CONTINUEBREAKRESUMEACTION_STEP_INTOBREAKRESUMEACTION_STEP_OVERBREAKRESUMEACTION_STEP_OUTDEBUG_TEXT_ISEXPRESSIONDEBUG_TEXT_ALLOWBREAKPOINTSDOCUMENTNAMETYPE_APPNODEDOCUMENTNAMETYPE_TITLEDOCUMENTNAMETYPE_FILE_TAILDOCUMENTNAMETYPE_URLDBGPROP_ATTRIB_NO_ATTRIBDBGPROP_ATTRIB_VALUE_IS_INVALIDDBGPROP_ATTRIB_VALUE_IS_EXPANDABLEDBGPROP_ATTRIB_VALUE_READONLYDBGPROP_ATTRIB_ACCESS_PUBLICDBGPROP_ATTRIB_ACCESS_PRIVATEDBGPROP_ATTRIB_ACCESS_PROTECTEDDBGPROP_ATTRIB_ACCESS_FINALDBGPROP_ATTRIB_STORAGE_GLOBALDBGPROP_ATTRIB_STORAGE_STATICDBGPROP_ATTRIB_STORAGE_FIELDDBGPROP_ATTRIB_STORAGE_VIRTUALDBGPROP_ATTRIB_TYPE_IS_CONSTANTDBGPROP_ATTRIB_TYPE_IS_SYNCHRONIZEDDBGPROP_ATTRIB_TYPE_IS_VOLATILEDBGPROP_ATTRIB_HAS_EXTENDED_ATTRIBSDBGPROP_INFO_NAMEDBGPROP_INFO_TYPEDBGPROP_INFO_VALUEDBGPROP_INFO_FULLNAMEDBGPROP_INFO_ATTRIBUTESDBGPROP_INFO_DEBUGPROPDBGPROP_INFO_AUTOEXPANDERRORRESUMEACTION_ReexecuteErrorStatementERRORRESUMEACTION_AbortCallAndReturnErrorToCallerERRORRESUMEACTION_SkipErrorStatementEX_DBGPROP_INFO_IDEX_DBGPROP_INFO_NTYPEEX_DBGPROP_INFO_NVALUEEX_DBGPROP_INFO_LOCKBYTESEX_DBGPROP_INFO_DEBUGEXTPROPSOURCETEXT_ATTR_KEYWORDSOURCETEXT_ATTR_COMMENTSOURCETEXT_ATTR_NONSOURCESOURCETEXT_ATTR_OPERATORSOURCETEXT_ATTR_NUMBERSOURCETEXT_ATTR_STRINGSOURCETEXT_ATTR_FUNCTION_STARTTEXT_DOC_ATTR_READONLYc:\src\python-3.8\include\object.hcom/win32comext/axdebug/src/AXDebug.cppInvalid format in SOURCE_TEXT_ATTR objectcom/win32comext/axdebug/src/AXDebug.cppThe attributes must resolve to the exact length as the textAttributes must be a sequence of [attribute|(attribute, repeat)]com/win32comext/axdebug/src/AXDebug.cppOO