From ee3d686eea9cc92f3d23f06780c38f4242336679 Mon Sep 17 00:00:00 2001 From: "edburns%acm.org" Date: Wed, 14 Mar 2007 21:02:14 +0000 Subject: [PATCH] A webclient/classes_spec/org/mozilla/mcp/package.html - package description for MCP M dist/build.xml - copy ancilliary files for javadoc A dist/javadoc.css - Stylesheet for code samples within Javadocs M dist/netbeans/build.xml - Use releasenotes for test browesr start page M dom/jni/Makefile.in M dom/src/Makefile.in M webclient/src_moz/Makefile.in M webclient/src_share/Makefile.in - FORCE_PR_LOG M dom/jni/javaDOMEventsGlobals.cpp M dom/jni/nativeDOMProxyListener.cpp M dom/jni/org_mozilla_dom_events_MouseEventImpl.cpp - use nsCOMPtr and correct QI-ing. M webclient/classes_spec/org/mozilla/mcp/MCP.java - Javadocs - Make private things private A webclient/classes_spec/org/mozilla/mcp/mcp.jpg - Master Control Program M webclient/classes_spec/org/mozilla/webclient/WebclientFactory.java - javadocs --- java/dist/build.xml | 18 ++ java/dist/javadoc.css | 19 ++ java/dist/netbeans/build.xml | 3 + java/dom/jni/Makefile.in | 2 +- java/dom/jni/javaDOMEventsGlobals.cpp | 29 ++- java/dom/jni/nativeDOMProxyListener.cpp | 12 +- .../org_mozilla_dom_events_MouseEventImpl.cpp | 217 +++++++++++++----- java/dom/src/Makefile.in | 2 +- .../classes_spec/org/mozilla/mcp/MCP.java | 147 +++++++++++- .../classes_spec/org/mozilla/mcp/mcp.jpg | Bin 0 -> 70743 bytes .../classes_spec/org/mozilla/mcp/package.html | 200 ++++++++++++++++ .../mozilla/webclient/WebclientFactory.java | 9 +- java/webclient/src_moz/Makefile.in | 2 +- java/webclient/src_share/Makefile.in | 2 +- 14 files changed, 573 insertions(+), 89 deletions(-) create mode 100755 java/dist/javadoc.css create mode 100755 java/webclient/classes_spec/org/mozilla/mcp/mcp.jpg create mode 100755 java/webclient/classes_spec/org/mozilla/mcp/package.html diff --git a/java/dist/build.xml b/java/dist/build.xml index af30c710ba7..09bc6074cbe 100644 --- a/java/dist/build.xml +++ b/java/dist/build.xml @@ -259,9 +259,18 @@ + + + + + + + + + + @@ -279,7 +290,14 @@ + + + + + + + diff --git a/java/dist/javadoc.css b/java/dist/javadoc.css new file mode 100755 index 00000000000..fc265122f29 --- /dev/null +++ b/java/dist/javadoc.css @@ -0,0 +1,19 @@ +/* GeSHi (c) Nigel McNie 2004 (http://qbnz.com/highlighter) */ +.java .de1, .java .de2 {font-family: 'Courier New', Courier, monospace; font-weight: normal;} +.java {font-family: monospace;} +.java .imp {font-weight: bold; color: red;} +.java li {background: #ffffff;} +.java li.li2 {background: #f4f4f4;} +.java .kw1 {color: #b1b100;} +.java .kw2 {color: #000000; font-weight: bold;} +.java .kw3 {color: #aaaadd; font-weight: bold;} +.java .kw4 {color: #993333;} +.java .co1 {color: #808080; font-style: italic;} +.java .co2 {color: #a1a100;} +.java .coMULTI {color: #808080; font-style: italic;} +.java .es0 {color: #000099; font-weight: bold;} +.java .br0 {color: #66cc66;} +.java .st0 {color: #ff0000;} +.java .nu0 {color: #cc66cc;} +.java .me1 {color: #006600;} +.java .me2 {color: #006600;} diff --git a/java/dist/netbeans/build.xml b/java/dist/netbeans/build.xml index ca2af049e28..c3313b8706a 100755 --- a/java/dist/netbeans/build.xml +++ b/java/dist/netbeans/build.xml @@ -209,6 +209,8 @@ ${so.prefix}xul.${so.extension}. + @@ -218,6 +220,7 @@ ${so.prefix}xul.${so.extension}. + diff --git a/java/dom/jni/Makefile.in b/java/dom/jni/Makefile.in index 1a1022b9e8e..500f4ad0b99 100644 --- a/java/dom/jni/Makefile.in +++ b/java/dom/jni/Makefile.in @@ -77,7 +77,7 @@ EXTRA_LIBS += \ include $(topsrcdir)/config/config.mk -DEFINES += -DMOZILLA_INTERNAL_API +DEFINES += -DMOZILLA_INTERNAL_API -DFORCE_PR_LOG ifeq ($(OS_ARCH),Darwin) INCLUDES += -I$(MOZ_JDKHOME)/include diff --git a/java/dom/jni/javaDOMEventsGlobals.cpp b/java/dom/jni/javaDOMEventsGlobals.cpp index ce5b39dc0db..0204d452818 100644 --- a/java/dom/jni/javaDOMEventsGlobals.cpp +++ b/java/dom/jni/javaDOMEventsGlobals.cpp @@ -26,6 +26,8 @@ #include "nsIDOMEvent.h" #include "nsIDOMUIEvent.h" +#include "nsCOMPtr.h" + jclass JavaDOMEventsGlobals::eventClass = NULL; jclass JavaDOMEventsGlobals::uiEventClass = NULL; jclass JavaDOMEventsGlobals::eventListenerClass = NULL; @@ -47,6 +49,9 @@ static NS_DEFINE_IID(kIDOMUIEventIID, NS_IDOMUIEVENT_IID); void JavaDOMEventsGlobals::Initialize(JNIEnv *env) { + PR_LOG(JavaDOMGlobals::log, PR_LOG_DEBUG, + ("JavaDOMEventsGlobals::Initialize: Beginning initialization")); + eventClass = env->FindClass("org/mozilla/dom/events/EventImpl"); if (!eventClass) { JavaDOMGlobals::ThrowException(env, "Class org.mozilla.dom.events.EventImpl not found"); @@ -116,6 +121,10 @@ void JavaDOMEventsGlobals::Initialize(JNIEnv *env) mouseEventClass = (jclass) env->NewGlobalRef(mouseEventClass); if (!mouseEventClass) return; + + PR_LOG(JavaDOMGlobals::log, PR_LOG_DEBUG, + ("JavaDOMEventsGlobals::Initialize: Completed Successfully")); + } void JavaDOMEventsGlobals::Destroy(JNIEnv *env) @@ -175,19 +184,18 @@ static jboolean isEventOfType(const char* const* types, nsString &type) } jobject JavaDOMEventsGlobals::CreateEventSubtype(JNIEnv *env, - nsIDOMEvent *event) + nsIDOMEvent *eventIn) { jobject jevent; jclass clazz = eventClass; - nsISupports *isupports; - void *target; + nsCOMPtr event = eventIn; + nsCOMPtr uiEvent; nsresult rv; - - isupports = (nsISupports *) event; + uiEvent = do_QueryInterface(event, &rv); + //check whenever our Event is UIEvent - rv = isupports->QueryInterface(kIDOMUIEventIID, (void **) &target); - if (!NS_FAILED(rv) && target) { + if (NS_SUCCEEDED(rv) && uiEvent) { // At the moment DOM2 draft specifies set of UIEvent subclasses // However Mozilla still presents these events as nsUIEvent // So we need a cludge to determine proper java class to be created @@ -232,8 +240,6 @@ jobject JavaDOMEventsGlobals::CreateEventSubtype(JNIEnv *env, clazz = uiEventClass; } - event->Release(); - event = (nsIDOMEvent *) target; } PR_LOG(JavaDOMGlobals::log, PR_LOG_WARNING, @@ -247,14 +253,13 @@ jobject JavaDOMEventsGlobals::CreateEventSubtype(JNIEnv *env, return NULL; } - env->SetLongField(jevent, eventPtrFID, (jlong) event); + env->SetLongField(jevent, eventPtrFID, (jlong) event.get()); if (env->ExceptionOccurred()) { PR_LOG(JavaDOMGlobals::log, PR_LOG_ERROR, ("JavaDOMEventGlobals::CreateEventSubtype: failed to set native ptr %x\n", - (jlong) event)); + (jlong) event.get())); return NULL; } - event->AddRef(); return jevent; } diff --git a/java/dom/jni/nativeDOMProxyListener.cpp b/java/dom/jni/nativeDOMProxyListener.cpp index 88fb9d0580c..559282c3b5a 100644 --- a/java/dom/jni/nativeDOMProxyListener.cpp +++ b/java/dom/jni/nativeDOMProxyListener.cpp @@ -27,6 +27,8 @@ #include"nsIDOMEventListener.h" #include"javaDOMEventsGlobals.h" +#include "nsCOMPtr.h" + static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); static NS_DEFINE_IID(kIDOMEventListener, NS_IDOMEVENTLISTENER_IID); @@ -59,10 +61,11 @@ NativeDOMProxyListener::~NativeDOMProxyListener() } } -NS_IMETHODIMP NativeDOMProxyListener::HandleEvent(nsIDOMEvent* aEvent) +NS_IMETHODIMP NativeDOMProxyListener::HandleEvent(nsIDOMEvent* aEventIn) { jobject jevent; JNIEnv *env; + nsCOMPtr aEvent = aEventIn; if (vm->AttachCurrentThread(&env, NULL) != 0) { PR_LOG(JavaDOMGlobals::log, PR_LOG_WARNING, @@ -78,10 +81,17 @@ NS_IMETHODIMP NativeDOMProxyListener::HandleEvent(nsIDOMEvent* aEvent) return NS_ERROR_FAILURE; } + PR_LOG(JavaDOMGlobals::log, PR_LOG_WARNING, + ("NativeDOMProxyListener::HandleEvent About to call into java.\n listener: %p\n eventListenerHandleEventMID: %p\n jevent: %p\n", listener, JavaDOMEventsGlobals::eventListenerHandleEventMID, jevent)); + env->CallVoidMethod(listener, JavaDOMEventsGlobals::eventListenerHandleEventMID, jevent); + PR_LOG(JavaDOMGlobals::log, PR_LOG_WARNING, + ("NativeDOMProxyListener::HandleEvent returned from java")); + + if (env->ExceptionOccurred()) { PR_LOG(JavaDOMGlobals::log, PR_LOG_ERROR, ("NativeDOMProxyListener::HandleEvent: failed to call EventListener %x\n", diff --git a/java/dom/jni/org_mozilla_dom_events_MouseEventImpl.cpp b/java/dom/jni/org_mozilla_dom_events_MouseEventImpl.cpp index 297ec48d40b..88558cfa3b0 100644 --- a/java/dom/jni/org_mozilla_dom_events_MouseEventImpl.cpp +++ b/java/dom/jni/org_mozilla_dom_events_MouseEventImpl.cpp @@ -21,11 +21,15 @@ #include "prlog.h" #include "nsIDOMNode.h" +#include "nsIDOMEvent.h" #include "nsIDOMMouseEvent.h" #include "nsIDOMEventTarget.h" #include "javaDOMEventsGlobals.h" #include "org_mozilla_dom_events_MouseEventImpl.h" +#include "nsCOMPtr.h" + + /* * Class: org_mozilla_dom_events_MouseEventImpl * Method: getAltKey @@ -34,21 +38,28 @@ JNIEXPORT jboolean JNICALL Java_org_mozilla_dom_events_MouseEventImpl_nativeGetAltKey (JNIEnv *env, jobject jthis) { - nsIDOMMouseEvent* event = (nsIDOMMouseEvent*) - env->GetLongField(jthis, JavaDOMEventsGlobals::eventPtrFID); - if (!event) { + nsresult rv = NS_OK; + nsIDOMEvent *eventPtr = (nsIDOMEvent*) + env->GetLongField(jthis, JavaDOMEventsGlobals::eventPtrFID); + nsCOMPtr event = do_QueryInterface(eventPtr, &rv); + + if (!event || NS_FAILED(rv)) { + PR_LOG(JavaDOMGlobals::log, PR_LOG_DEBUG, + ("MouseEventImpl::nativeGetAltKey: cannot QI to nsIDOMMouseEvent from nsIDOMEvent")); JavaDOMGlobals::ThrowException(env, - "MouseEvent.getAltKey: NULL pointer"); + "MouseEvent.getAltKey: NULL pointer"); return JNI_FALSE; } PRBool altKey = PR_FALSE; - nsresult rv = event->GetAltKey(&altKey); + rv = event->GetAltKey(&altKey); if (NS_FAILED(rv)) { JavaDOMGlobals::ThrowException(env, "MouseEvent.getAltKey: failed", rv); return JNI_FALSE; } + PR_LOG(JavaDOMGlobals::log, PR_LOG_DEBUG, + ("MouseEventImpl::nativeGetAltKey: result: %d", altKey)); return (altKey == PR_TRUE) ? JNI_TRUE : JNI_FALSE; @@ -63,21 +74,28 @@ JNIEXPORT jboolean JNICALL Java_org_mozilla_dom_events_MouseEventImpl_nativeGetA JNIEXPORT jshort JNICALL Java_org_mozilla_dom_events_MouseEventImpl_nativeGetButton (JNIEnv *env, jobject jthis) { - nsIDOMMouseEvent* event = (nsIDOMMouseEvent*) - env->GetLongField(jthis, JavaDOMEventsGlobals::eventPtrFID); - if (!event) { + nsresult rv = NS_OK; + nsIDOMEvent *eventPtr = (nsIDOMEvent*) + env->GetLongField(jthis, JavaDOMEventsGlobals::eventPtrFID); + nsCOMPtr event = do_QueryInterface(eventPtr, &rv); + + if (!event || NS_FAILED(rv)) { + PR_LOG(JavaDOMGlobals::log, PR_LOG_DEBUG, + ("MouseEventImpl::nativeGetButton: cannot QI to nsIDOMMouseEvent from nsIDOMEvent")); JavaDOMGlobals::ThrowException(env, "MouseEvent.getButton: NULL pointer"); return 0; } PRUint16 code = 0; - nsresult rv = event->GetButton(&code); + rv = event->GetButton(&code); if (NS_FAILED(rv)) { JavaDOMGlobals::ThrowException(env, "MouseEvent.getButton: failed", rv); return 0; } + PR_LOG(JavaDOMGlobals::log, PR_LOG_DEBUG, + ("MouseEventImpl::nativeGetButton: result: %d", code)); return (jshort) code; } @@ -90,21 +108,28 @@ JNIEXPORT jshort JNICALL Java_org_mozilla_dom_events_MouseEventImpl_nativeGetBut JNIEXPORT jint JNICALL Java_org_mozilla_dom_events_MouseEventImpl_nativeGetClientX (JNIEnv *env, jobject jthis) { - nsIDOMMouseEvent* event = (nsIDOMMouseEvent*) - env->GetLongField(jthis, JavaDOMEventsGlobals::eventPtrFID); - if (!event) { + nsresult rv = NS_OK; + nsIDOMEvent *eventPtr = (nsIDOMEvent*) + env->GetLongField(jthis, JavaDOMEventsGlobals::eventPtrFID); + nsCOMPtr event = do_QueryInterface(eventPtr, &rv); + + if (!event || NS_FAILED(rv)) { + PR_LOG(JavaDOMGlobals::log, PR_LOG_DEBUG, + ("MouseEventImpl::nativeGetClientX: cannot QI to nsIDOMMouseEvent from nsIDOMEvent")); JavaDOMGlobals::ThrowException(env, "MouseEvent.getClientX: NULL pointer"); - return 0; + return JNI_FALSE; } PRInt32 clientX = 0; - nsresult rv = event->GetClientX(&clientX); + rv = event->GetClientX(&clientX); if (NS_FAILED(rv)) { JavaDOMGlobals::ThrowException(env, "MouseEvent.getClientX: failed", rv); return 0; } + PR_LOG(JavaDOMGlobals::log, PR_LOG_DEBUG, + ("MouseEventImpl::nativeGetClientX: result: %d", clientX)); return (jint) clientX; } @@ -117,21 +142,28 @@ JNIEXPORT jint JNICALL Java_org_mozilla_dom_events_MouseEventImpl_nativeGetClien JNIEXPORT jint JNICALL Java_org_mozilla_dom_events_MouseEventImpl_nativeGetClientY (JNIEnv *env, jobject jthis) { - nsIDOMMouseEvent* event = (nsIDOMMouseEvent*) - env->GetLongField(jthis, JavaDOMEventsGlobals::eventPtrFID); - if (!event) { + nsresult rv = NS_OK; + nsIDOMEvent *eventPtr = (nsIDOMEvent*) + env->GetLongField(jthis, JavaDOMEventsGlobals::eventPtrFID); + nsCOMPtr event = do_QueryInterface(eventPtr, &rv); + + if (!event || NS_FAILED(rv)) { + PR_LOG(JavaDOMGlobals::log, PR_LOG_DEBUG, + ("MouseEventImpl::nativeGetClientY: cannot QI to nsIDOMMouseEvent from nsIDOMEvent")); JavaDOMGlobals::ThrowException(env, "MouseEvent.getClientY: NULL pointer"); - return 0; + return JNI_FALSE; } PRInt32 clientY = 0; - nsresult rv = event->GetClientY(&clientY); + rv = event->GetClientY(&clientY); if (NS_FAILED(rv)) { JavaDOMGlobals::ThrowException(env, "MouseEvent.getClientY: failed", rv); return 0; } + PR_LOG(JavaDOMGlobals::log, PR_LOG_DEBUG, + ("MouseEventImpl::nativeGetClientY: result: %d", clientY)); return (jint) clientY; } @@ -145,21 +177,28 @@ JNIEXPORT jint JNICALL Java_org_mozilla_dom_events_MouseEventImpl_nativeGetClien JNIEXPORT jboolean JNICALL Java_org_mozilla_dom_events_MouseEventImpl_nativeGetCtrlKey (JNIEnv *env, jobject jthis) { - nsIDOMMouseEvent* event = (nsIDOMMouseEvent*) - env->GetLongField(jthis, JavaDOMEventsGlobals::eventPtrFID); - if (!event) { + nsresult rv = NS_OK; + nsIDOMEvent *eventPtr = (nsIDOMEvent*) + env->GetLongField(jthis, JavaDOMEventsGlobals::eventPtrFID); + nsCOMPtr event = do_QueryInterface(eventPtr, &rv); + + if (!event || NS_FAILED(rv)) { + PR_LOG(JavaDOMGlobals::log, PR_LOG_DEBUG, + ("MouseEventImpl::nativeGetCtrlKey: cannot QI to nsIDOMMouseEvent from nsIDOMEvent")); JavaDOMGlobals::ThrowException(env, "MouseEvent.getCtrlKey: NULL pointer"); return JNI_FALSE; } PRBool ctrlKey = PR_FALSE; - nsresult rv = event->GetCtrlKey(&ctrlKey); + rv = event->GetCtrlKey(&ctrlKey); if (NS_FAILED(rv)) { JavaDOMGlobals::ThrowException(env, "MouseEvent.getCtrlKey: failed", rv); return JNI_FALSE; } + PR_LOG(JavaDOMGlobals::log, PR_LOG_DEBUG, + ("MouseEventImpl::nativeGetCtrlKey: result: %d", ctrlKey)); return (ctrlKey == PR_TRUE) ? JNI_TRUE : JNI_FALSE; } @@ -173,21 +212,28 @@ JNIEXPORT jboolean JNICALL Java_org_mozilla_dom_events_MouseEventImpl_nativeGetC JNIEXPORT jboolean JNICALL Java_org_mozilla_dom_events_MouseEventImpl_nativeGetMetaKey (JNIEnv *env, jobject jthis) { - nsIDOMMouseEvent* event = (nsIDOMMouseEvent*) - env->GetLongField(jthis, JavaDOMEventsGlobals::eventPtrFID); - if (!event) { + nsresult rv = NS_OK; + nsIDOMEvent *eventPtr = (nsIDOMEvent*) + env->GetLongField(jthis, JavaDOMEventsGlobals::eventPtrFID); + nsCOMPtr event = do_QueryInterface(eventPtr, &rv); + + if (!event || NS_FAILED(rv)) { + PR_LOG(JavaDOMGlobals::log, PR_LOG_DEBUG, + ("MouseEventImpl::nativeGetMetaKey: cannot QI to nsIDOMMouseEvent from nsIDOMEvent")); JavaDOMGlobals::ThrowException(env, "MouseEvent.getMetaKey: NULL pointer"); return JNI_FALSE; } PRBool metaKey = PR_FALSE; - nsresult rv = event->GetMetaKey(&metaKey); + rv = event->GetMetaKey(&metaKey); if (NS_FAILED(rv)) { JavaDOMGlobals::ThrowException(env, "MouseEvent.getMetaKey: failed", rv); return JNI_FALSE; } + PR_LOG(JavaDOMGlobals::log, PR_LOG_DEBUG, + ("MouseEventImpl::nativeGetMetaKey: result: %d", metaKey)); return (metaKey == PR_TRUE) ? JNI_TRUE : JNI_FALSE; } @@ -201,21 +247,28 @@ JNIEXPORT jboolean JNICALL Java_org_mozilla_dom_events_MouseEventImpl_nativeGetM JNIEXPORT jint JNICALL Java_org_mozilla_dom_events_MouseEventImpl_nativeGetScreenX (JNIEnv *env, jobject jthis) { - nsIDOMMouseEvent* event = (nsIDOMMouseEvent*) - env->GetLongField(jthis, JavaDOMEventsGlobals::eventPtrFID); - if (!event) { + nsresult rv = NS_OK; + nsIDOMEvent *eventPtr = (nsIDOMEvent*) + env->GetLongField(jthis, JavaDOMEventsGlobals::eventPtrFID); + nsCOMPtr event = do_QueryInterface(eventPtr, &rv); + + if (!event || NS_FAILED(rv)) { + PR_LOG(JavaDOMGlobals::log, PR_LOG_DEBUG, + ("MouseEventImpl::nativeGetScreenX: cannot QI to nsIDOMMouseEvent from nsIDOMEvent")); JavaDOMGlobals::ThrowException(env, - "MouseEvent.getScreenX: NULL pointer\n"); - return 0; + "MouseEvent.getScreenX: NULL pointer"); + return JNI_FALSE; } PRInt32 screenX = 0; - nsresult rv = event->GetScreenX(&screenX); + rv = event->GetScreenX(&screenX); if (NS_FAILED(rv)) { JavaDOMGlobals::ThrowException(env, "MouseEvent.getScreenX: failed", rv); return 0; } + PR_LOG(JavaDOMGlobals::log, PR_LOG_DEBUG, + ("MouseEventImpl::nativeGetScreenX: result: %d", screenX)); return (jint) screenX; } @@ -228,21 +281,28 @@ JNIEXPORT jint JNICALL Java_org_mozilla_dom_events_MouseEventImpl_nativeGetScree JNIEXPORT jint JNICALL Java_org_mozilla_dom_events_MouseEventImpl_nativeGetScreenY (JNIEnv *env, jobject jthis) { - nsIDOMMouseEvent* event = (nsIDOMMouseEvent*) - env->GetLongField(jthis, JavaDOMEventsGlobals::eventPtrFID); - if (!event) { + nsresult rv = NS_OK; + nsIDOMEvent *eventPtr = (nsIDOMEvent*) + env->GetLongField(jthis, JavaDOMEventsGlobals::eventPtrFID); + nsCOMPtr event = do_QueryInterface(eventPtr, &rv); + + if (!event || NS_FAILED(rv)) { + PR_LOG(JavaDOMGlobals::log, PR_LOG_DEBUG, + ("MouseEventImpl::nativeGetScreenY: cannot QI to nsIDOMMouseEvent from nsIDOMEvent")); JavaDOMGlobals::ThrowException(env, "MouseEvent.getScreenY: NULL pointer"); - return 0; + return JNI_FALSE; } PRInt32 screenY = 0; - nsresult rv = event->GetScreenY(&screenY); + rv = event->GetScreenY(&screenY); if (NS_FAILED(rv)) { JavaDOMGlobals::ThrowException(env, "MouseEvent.getScreenY: failed", rv); return 0; } + PR_LOG(JavaDOMGlobals::log, PR_LOG_DEBUG, + ("MouseEventImpl::nativeGetScreenY: result: %d", screenY)); return (jint) screenY; } @@ -256,8 +316,15 @@ JNIEXPORT jint JNICALL Java_org_mozilla_dom_events_MouseEventImpl_nativeGetScree JNIEXPORT jboolean JNICALL Java_org_mozilla_dom_events_MouseEventImpl_nativeGetShiftKey (JNIEnv *env, jobject jthis) { - nsIDOMMouseEvent* event = (nsIDOMMouseEvent*) - env->GetLongField(jthis, JavaDOMEventsGlobals::eventPtrFID); + nsresult rv = NS_OK; + nsIDOMEvent *eventPtr = (nsIDOMEvent*) + env->GetLongField(jthis, JavaDOMEventsGlobals::eventPtrFID); + PR_LOG(JavaDOMGlobals::log, PR_LOG_DEBUG, + ("MouseEventImpl::nativeGetShiftKey: eventPtr: %p", eventPtr)); + nsCOMPtr event = do_QueryInterface(eventPtr, &rv); + PR_LOG(JavaDOMGlobals::log, PR_LOG_DEBUG, + ("MouseEventImpl::nativeGetShiftKey: QI nsCOMPtr from: %p, rv: %d", eventPtr, rv)); + if (!event) { JavaDOMGlobals::ThrowException(env, "MouseEvent.getShiftKey: NULL pointer"); @@ -265,12 +332,16 @@ JNIEXPORT jboolean JNICALL Java_org_mozilla_dom_events_MouseEventImpl_nativeGetS } PRBool shiftKey = PR_FALSE; - nsresult rv = event->GetShiftKey(&shiftKey); + rv = event->GetShiftKey(&shiftKey); if (NS_FAILED(rv)) { + PR_LOG(JavaDOMGlobals::log, PR_LOG_DEBUG, + ("MouseEventImpl::nativeGetShiftKey: rv: %d", rv)); JavaDOMGlobals::ThrowException(env, "MouseEvent.getShiftKey: failed", rv); return JNI_FALSE; } + PR_LOG(JavaDOMGlobals::log, PR_LOG_DEBUG, + ("MouseEventImpl::nativeGetShiftKey: result: %d", shiftKey)); return (shiftKey == PR_TRUE) ? JNI_TRUE : JNI_FALSE; } @@ -283,29 +354,51 @@ JNIEXPORT jboolean JNICALL Java_org_mozilla_dom_events_MouseEventImpl_nativeGetS JNIEXPORT jobject JNICALL Java_org_mozilla_dom_events_MouseEventImpl_nativeGetRelatedTarget (JNIEnv *env, jobject jthis) { - nsIDOMMouseEvent* event = (nsIDOMMouseEvent*) - env->GetLongField(jthis, JavaDOMEventsGlobals::eventPtrFID); - if (!event) { - JavaDOMGlobals::ThrowException(env, - "MouseEvent.getRelatedNode: NULL pointer"); - return NULL; - } + nsresult rv = NS_OK; + nsIDOMEvent *eventPtr = (nsIDOMEvent*) + env->GetLongField(jthis, JavaDOMEventsGlobals::eventPtrFID); + nsCOMPtr event = do_QueryInterface(eventPtr, &rv); - nsIDOMEventTarget* ret = nsnull; - nsresult rv = event->GetRelatedTarget(&ret); - if (NS_FAILED(rv)) { - JavaDOMGlobals::ThrowException(env, - "MouseEvent.getRelatedNode: failed", rv); - return NULL; - } - if (!ret) - return NULL; + if (!event || NS_FAILED(rv)) { + PR_LOG(JavaDOMGlobals::log, PR_LOG_DEBUG, + ("MouseEventImpl::getRelatedTarget: cannot QI nsIDOMMouseEvent from nsIDOMEvent")); + JavaDOMGlobals::ThrowException(env, + "MouseEvent.getRelatedNode: NULL pointer"); + return NULL; + } + + nsCOMPtr ret = nsnull; + rv = event->GetRelatedTarget(getter_AddRefs(ret)); + if (NS_FAILED(rv)) { + PR_LOG(JavaDOMGlobals::log, PR_LOG_DEBUG, + ("MouseEventImpl::getRelatedTarget: cannot get related target")); - nsIDOMNode* node = nsnull; - rv = ret->QueryInterface(NS_GET_IID(nsIDOMNode), (void**)&node); - printf("========== rv:%x node:%x", rv, node); -// return JavaDOMGlobals::CreateNodeSubtype(env, ret); - return JavaDOMGlobals::CreateNodeSubtype(env, node); + JavaDOMGlobals::ThrowException(env, + "MouseEvent.getRelatedNode: failed", rv); + return NULL; + } + if (!ret) { + PR_LOG(JavaDOMGlobals::log, PR_LOG_DEBUG, + ("MouseEventImpl::getRelatedTarget: related target is null")); + + return NULL; + } + + nsCOMPtr node = nsnull; + node = do_QueryInterface(ret, &rv); + jobject result = nsnull; + if (NS_SUCCEEDED(rv) && node) { + result = JavaDOMGlobals::CreateNodeSubtype(env, node); + } + else { + PR_LOG(JavaDOMGlobals::log, PR_LOG_DEBUG, + ("MouseEventImpl::getRelatedTarget: can't QI nsIDOMNode from nsIDOMEventTarget")); + + } + PR_LOG(JavaDOMGlobals::log, PR_LOG_DEBUG, + ("MouseEventImpl::getRelatedTarget: returning %p", result)); + + return result; } /* diff --git a/java/dom/src/Makefile.in b/java/dom/src/Makefile.in index 67be1095174..77a82b7611d 100644 --- a/java/dom/src/Makefile.in +++ b/java/dom/src/Makefile.in @@ -105,7 +105,7 @@ EXPORTS := $(addprefix $(srcdir)/, $(EXPORTS)) include $(topsrcdir)/config/rules.mk -DEFINES += -DMOZILLA_INTERNAL_API +DEFINES += -DMOZILLA_INTERNAL_API -DFORCE_PR_LOG edburns: @echo $(XPCOM_LIBS) diff --git a/java/webclient/classes_spec/org/mozilla/mcp/MCP.java b/java/webclient/classes_spec/org/mozilla/mcp/MCP.java index f7d59971983..8a88ed8e9ab 100755 --- a/java/webclient/classes_spec/org/mozilla/mcp/MCP.java +++ b/java/webclient/classes_spec/org/mozilla/mcp/MCP.java @@ -1,5 +1,5 @@ /* - * $Id: MCP.java,v 1.7 2007-03-13 06:21:44 edburns%acm.org Exp $ + * $Id: MCP.java,v 1.8 2007-03-14 21:02:13 edburns%acm.org Exp $ */ /* @@ -51,7 +51,10 @@ import org.w3c.dom.Document; import org.w3c.dom.Element; /** - * + *

The main class for the Mozilla Control Program. Please see the package description for an + * overview.

+ * @author edburns */ public class MCP { @@ -60,12 +63,12 @@ public class MCP { public MCP() { } - public static final String MCP_LOG = "org.mozilla.mcp"; - public static final String MCP_LOG_STRINGS = "org.mozilla.mcp.MCPLogStrings"; + private static final String MCP_LOG = "org.mozilla.mcp"; + private static final String MCP_LOG_STRINGS = "org.mozilla.mcp.MCPLogStrings"; - public static final Logger LOGGER = getLogger(MCP_LOG); + private static final Logger LOGGER = getLogger(MCP_LOG); - static Logger getLogger( String loggerName ) { + private static Logger getLogger( String loggerName ) { return Logger.getLogger(loggerName, MCP_LOG_STRINGS ); } @@ -212,31 +215,76 @@ public class MCP { } return pageInfoListener; } + + /** + + *

Add the argument AjaxListener to this MCP + * instance.

+ + */ public void addAjaxListener(AjaxListener listener) { getEventRegistration().addDocumentLoadListener(listener); } + /** + + *

Remove the argument AjaxListener to this MCP + * instance.

+ + */ public void removeAjaxListener(AjaxListener listener) { getEventRegistration().removeDocumentLoadListener(listener); } + /** + + *

Add the argument MouseListener to the + * Canvas for this MCP instance.

+ + */ public void addMouseListener(MouseListener listener) { getBrowserControlCanvas().addMouseListener(listener); } + /** + + *

Remove the argument MouseListener from the + * Canvas for this MCP instance.

+ + */ public void removeMouseListener(MouseListener listener) { getBrowserControlCanvas().removeMouseListener(listener); } + /** + + *

Add the argument KeyListener to the + * Canvas for this MCP instance.

+ + */ public void addKeyListener(KeyListener listener) { getBrowserControlCanvas().addKeyListener(listener); } + /** + + *

Remove the argument KeyListener from the + * Canvas for this MCP instance.

+ + */ public void removeKeyListener(KeyListener listener) { getBrowserControlCanvas().removeKeyListener(listener); } + /** + + *

Return the Webclient BrowserControl instance used + * by this MCP instance. This is useful for operations + * that require more complex browser control than that offered by + * MCP.

+ + */ public BrowserControl getBrowserControl() { if (!initialized) { IllegalStateException ise = new IllegalStateException("Not initialized. Call setAppData()"); @@ -264,6 +312,15 @@ public class MCP { } return browserControl; } + + /** + + *

Return the realized and visible java.awt.Frame + * containing the actual browser window. There is no need to put + * this Frame inside of any surrounding Swing or AWT windows. It is + * sufficient to stand alone.

+ + */ public Frame getRealizedVisibleBrowserWindow() { if (null == frame) { @@ -288,11 +345,50 @@ public class MCP { } return frame; } + + /** + + *

Make invisible, and delete the BrowserControl + * instance for this MCP instance. Reset internal state of the + * instance so that a subsequent call to {@link + * #getRealizedVisibleBrowserWindow} will create a new + * Frame.

+ + */ public void deleteBrowserControl() { getRealizedVisibleBrowserWindow().setVisible(false); BrowserControlFactory.deleteBrowserControl(getBrowserControl()); + browserControl = null; + navigation = null; + eventRegistration = null; + canvas = null; + pageInfoListener = null; + frame = null; + x = 0; + y = 0; + width = 1280; + height = 960; + initialized = false; + robot = null; + treeDumper = null; + if (null != latch) { + latch.countDown(); + } + latch = null; } + + /** + + *

Return the DOM Element with the given id or name. + * First, Document.getElementById() is called, passing + * the argument id. If an element is found, it is + * returned. Otherwise, the document is traversed and the first + * element encountered with a name equal to the argument + * id is returned. If no such element exists, + * null is returned.

+ + */ public Element findElement(String id) { Element result = null; @@ -309,12 +405,32 @@ public class MCP { return result; } + + /** + + *

Return true if and only if the argument + * toFind occurs within the current page. Case is not + * significant. Users desiring more detailed find behavior should + * use {@link #getBrowserControl} to obtain a reference to the + * CurrentPage interface, which has more advanced + * methods pertaining to the current page.

+ + */ public boolean findInPage(String toFind) { boolean found = false; - found = getCurrentPage().find(toFind, true, true); + found = getCurrentPage().find(toFind, true, false); return found; } + + /** + + *

Find the DOM element within the current page matching the + * argument id using {@link #findElement}. Use + * java.awt.Robot to click the element. Return + * immediately after clicking the element.

+ + */ public void clickElement(String id) { Element element = findElement(id); @@ -345,6 +461,16 @@ public class MCP { throw new IllegalStateException("Unable to click element " + id); } } + + /** + + *

Find the DOM element within the current page matching the + * argument id using {@link #findElement}. Use + * java.awt.Robot to click the element. Block until the + * document load triggered by the click has completed.

+ + */ + public void blockingClickElement(String idOrName) { synchronized (this) { @@ -359,6 +485,13 @@ public class MCP { } } } + + /** + + *

Load the url, blocking until the load has completed.

+ + */ + public void blockingLoad(String url) { Navigation2 nav = getNavigation(); diff --git a/java/webclient/classes_spec/org/mozilla/mcp/mcp.jpg b/java/webclient/classes_spec/org/mozilla/mcp/mcp.jpg new file mode 100755 index 0000000000000000000000000000000000000000..3531a5bf3f2b6ab908a4f1e2914f876754c64003 GIT binary patch literal 70743 zcmb4qbx<5l(D&i)u0ao%<8XI(Jsb`=+#v~)5ZnpQ9qw+2Lr8)gepqk`2?Un}2_z&W zd3oxq`s)4n?X8`a>Dukt>Fw$HbpWEZk2RnK+qgY1stXIDtHT{Co^gghYjS zMY(zTc>j9{1|A+BAwD4$At4nnBP}EE|C#=c04VS=rLowsFgO616c|_(82?ZJCIA2v z>rq(1|0gVL00!oxq>q(!|25-(RRI7PkKF$@0mN93C*)YEIL*~^JPW|I4 zR0@y13(S_DD8hWO@?lbdfZrD3Sd!Jt7u-5a&$3jRz?BJzFV|h($ajLJC(?di5%Lec zn!MiX1Is#3`}_5El9|xyKt2*+uvaJT>9Lm=(CrItSD*Do(5<~nZFXqjRI@!>jd8&8 zoT_9?ZiWf>!jcbZl!?8b83fJp5tNY@y2Qg_3L{r>`j` zGNZ~&uBKzM-lM|OzaK{R=XW1c!o1M=TL4EGnwdC$R#GQVdG`l zax4ii)Q8v9FbOQP5`IzZSuFhM$*PxcB{$CJvV5l6AQ_AYUHp-2M>7rO%UDFDKgZeTYR0ZhFh-bK4or)T> zwhR45am^5re$IK|aB<8OL7E#%&kEr&rRjAUK6h=SDC~*g%JNb@Ol_H+3yg7V|I6DX z=C-1L%D+!wKJM0CQ6tbD5AQz;8+UF^!ozNOYBUFG3I4qQ)tKuN5854no=p^>Nh{~& z5?JCcI88EQ8(Kbmwd_4tHFy?UCD)+qI?|csL}AH7er74vSp}F1wbeOrb#Z$7YLw8H zdSUXRY9PhN@Xtz#W985#k9S*wIsMC)f>`Cm%) z+hM|Xg(z

&T(CK$~%bY~~e^say2^Mf}Bh^zthxCAvR^W&MoruK($1Hf!`^dq0cc z`F>7V$A_;SzgKeu3NT%z$bAIoz-fHkbT%}lri(4AmB)vDGG7-Aw_0tUS%0{Ny zcm*GX^v>ihPD=?_9;^w6V!JW=V=^?4wT_J8G_PtkaJ=27AWgMilN}&xYzEcw*+y`U zei&oZB;59kog&>n$z|f`D)Qy;>Pz6_^QX-|A?E!r@KbU!FK<%xWmh;3JUI!BI7LrFHKk$TC_ieush#g*!MVI zeX5aVpKmU*G=o-S0DgE}T>OJ;y3J$k%Tot)g3~jqy zhoDw{>>6peNPqQdJPV_F2=P5;EfUG3_0gkuZ~B^{iF>UI(S`(LFkq!?2mDI$|=LAqWqD zHSY0&_!~(ei^f8GVDPs}f<(rFr7U^~Uu&gv3w3u9%aVkU?c$PD*7BkV)(vg}Fh8AMg0m)1K^Iy2%VUllhz5tfTKj4&h zH*X$hEuT(2SMy1uU?LOK{ahK|xWLv`)955LjW-+<^Fl_nCvvI>@uR@(yK9-aqaIzt znr6CtSfQq*A9?TB%%gC@iPCwqvP`fmx?R?#)HbnPOM&eeZD`_6YaCno!oy}kGo02A z5}?P{I?lLUI@^J7kK?5OSz`cJ0L?XMR}j@o_gEe$sJyu#V1UvYH5Fe_NoyNQOJFcQ zvwBjq*nMPn?{=rx1aGi+sBM~0T(U3YJ@PBQKOpYY)O|033$qfCq%+|8aHyq*Lo;ve zW5Gg~=dV?B;fk$0p-kYyD1F9dz>||%c(5M-T~ZLHZ!OLs}$qZ6w0-m2)k9Chbrbl`S0RFpG;mXPusK5GtWqj2N%*i zs*SC>$jyd{{VFA8=^k~gZYhnKR@0qpBLbVS%!FI1?^5>KV>B^$Q??)Le;2QM!Gb5H zpvs}|lQZg^>uKMYSD-WQB(ZSh8NNt+!Fbyu+G*2Bxoq>Xeb*;mqeXRU7mK?dFl!xa z!kiW~pLWn>qUz%kuFb+?;7b^$eg>0~Id=^MeGS%ygxM>J2|!HM7;G^Qc)6kko}Hg$ zcvRUgy~SvhwKOL^AvmuWDP@?0#Qq(n|5o(55<>a@I=E{m%K5$%9XU zwb#udrW^%@x)6oRk-}D@!gvfP>)-gqWg6nv`>gZQR;lcR zt&XufXU}CEUc74z9Tzc7gml#SU>_AjXtMLd&ByB!dIedI=6x$BvZny z3DiRLGx^@a7&s*KoL*=13Li)~YeiLOG#y~SP_2I9`Gc#7ymZwMy@Q5lk`@w7o^pcM zxBa>L$uTTvL2ASU{-(*$KXO8#qEFw}|LZ8`p9P3#B~OP$hF_w{nKa z+FGx1I7rwQP)zTHHh)~vYx1?XhuKT$xVaOo$u@b47?iBe$b4+PgbS<^F|62=u);ez zhURnCI}CdXYQ4Ta?Je>Ymawmmksk%utLNElSl;SE zgsG@Pq$^!{Nkr5N=RCQRRC2W2b?6IoN>;P@8ZspU{L0U&kt({=bG~T1Cu%ZMMK#L} zjo+lWvK!4CS0@@53ltkdgSmQ&hIuG;7j6aP`a4$rj<{I&DavVevR87rm#p4+Mie&o zh6sGLloD5oOJgqLVtzv1Lr=?YLf={J6U>!fp2J7L+X^!QA<@|>`*}5JeB>FoaE&T< znhY<$PGhS%KnsFI6vxF5g!u4PH>3o2x-SzXt-!uESxVO|JVnDAyTMG)QaM;O#ZO7k zLJ_jOL>4wv_Kj~t${SOi2ZR$@D7pq@8xOia+PYitUj;PodvZ1Q^Y@krW@BeddRtf< z>~~rQi+T|zZLrkt;o#QToYCd4mmC0!aSMf8gXqBlf!PY{sMt|%~u3wEGcs6AQ zY?U8V!Z3dJGAQ-jsSG&YR2+>MDJg6zzAwsls}${7a=|1p15}V$zRjEpW%r$KX!AKnMuuREj_os{`$wgvuCN?B0TAM zszpwMq~92`zvC>P9^16`bi+-xB}_FOg4LVNvyq$;q)h?gEjxa#+M9?ack2N%fxcE@ z`GtE1>-Iw;0WWlItf6j;m4z?2CL1Ybvp)`3UTS^PA(3zg#msZkkawwks}nB0&D(X0 zq0DQ~7j-x(;x{|;R#8C*wiwQ%g)RNteJ}$p<53R6o5ltgO8u_|TRMO?7(-K))e@Ow z&9kDD7JF~Y;F{x@=EKHZ%}H&Wf!co4)| zhxoxQhhW~+!g?whv~yfovUjSK9`B-@hgUI=T*#pbr}Tt)^IV|5rn*5l66GQ-WX>Wb zQg-~j_`Vg_J0~F}p;@f8Vl?n{;O9|@_=Q7z6#p*oQO5xmywAX$57~ zyhTSzdUMTzRNh0BYq9JUhkwPKJ7jes?V^IH+|S~h;w$;f^Ybq`*0TKvCj*wr7#}P0 zeK>;Iu2&?|x`}xwH1kfI7T5ImpEZdC4v!JUQhItc?X=X~txT9T1MFrTT?&i%Og;2q z8|9PCEFYt<`9gj>G?n6xIE!q^npP2r^C*u>?fE24E;x zM{VAkzJs+z%~Xk>&LC?S9k{m6Yc8?GgKe4+I5sHsq^w2Q@I`72XUQ&}#v| zO;w5)K+>drxdtk6mGxT#^&M|63&asoRm{;REBPJ2@GO(SVh_9I&m|mC)l?UO_7YID zsek+yu7f5L;Y)Y_1so<7)HPRm4YCMLpJMaVsX&$LHpxvjW|LO8!s};)KU}3H*;M%x ze2zs3cT92X0LKeFecdHQ>9b9oVp`%qis|)NXmohdt{I2-BhI$3+BzAS zzl(1_|BlVsr7FI~W1~+$orjn?ir1O`DlFf3ZP_rEN;nhn0rc_Eq-NCUfG)(pRA1Qd zS}M5O-IGB91~-cwfQohNH3;I_oMcYPoazX;Ie2*fmD?O&v#HKbC5cAb9exj)cVt`w z!b(AX7bqCI|(_0emB-pLDQxrNr_hm82lEACZl_6oED-b(z zebfALyoMDe5Cm%os}weH-8*WUL%*f3n78J_?HDFiaWHWtYnGFAAXd0^;UPijUBEF!D}}Fe7!_* zRJF!mr@SrZRzDEbQVKaBomk`Em59EPpCh;`|9>(xY}&KA7q z3g6_7c$G|R)QY#(z-864C}uvBiONYIG16Cfh2Tj#*tfRv=5DUw)${`WbI%(kRivlz z(mxu2PbCwO0`?5kA@Ust2lHl#)sqZO*YW+F(ykBTJ8oTd$}>F`_Bth+SX-+ysqgFL z_Xa5!6Fj``1=-`%EqoHW8ybB>O!2!ji4pXt>E6c%s_x1=#_5o8k6)yozw82@zA{*- z?=p?iDYRmEVoYrQ;Z_iBPh^HQ;DCCAozRuf)FlzjY4J-#>^vhdghNUz>4R)an>Kbo zuXl*##?dc7^J`}jIR@lnP~-k_O|WiHsA-qC4YS@E&xci+3SZ*h^qkVQG+4)nr7+ox z*Vg9M+_m62HyYr_xJ^-Xt76TXTth)J%PWp)%|-sJ(-=-SLRx^N92mbNM{|<5aizv* zY6&nqg>FI;c!F^bL55#SZ*di7Dt0`W@ku#PcqBl1b5d#NS|s@D1e+qwGtgSSY^(g* zN(;jyS3gBrD;38I!ApbV;of9h=I%M?j)U)@<%I&NYQe!Rf9a3pm^@_YGjA4FmCOyP z!jW$ARw*v{&Rp~2;%QjVui%rWIWanyyiIlA4Lw*cK`mQM0QQI=>zYi_I)HTS=&Y_! zqrr3#->1wR$ijH$Ce|fSD~jfx>bMzI2%D4$+1O(&9^q`A-tJh_!apTxXqZXq)Fx|9 z^C~}H;#;#DoUo$b3Ja4vBP^)Bv&+{Ha_9_Ke(zX%;1hDAw*U5NKbnbptJGiiEgc7+ zxWW-*gMiSEeeCMenqoF_Rj*!8t>mQW95<{pBl~nuy6A=IyJv;78{$?P!&iF(E_#u4mbK!W-K=Ci}LB;m&<++PI#17qDqt}_u z+yKEXdMD@9pM}aGB(SLkY{vLnl|UjsfYi-8J}ptDnuRM+?f9$wO1SY_nLs^^Z8*f_ zTbSw0N=b0%5_3b9oj@W!-_~7QcGbE?{*(*xDxB+du$2@3N`kMv6rnZm#wvM;L# zoOSrrt3kp#>|A_YjQs-AIo4y^hP~XiQ@|1)E+B(&h&4S|mgIKYD5bahc7Z)izp9^+ zP=DiK(k__?fBT+9B*-Iu3JG*YtGgaFaE1Ib^%t(;E_=k(1<3)Jn3w?E$KpTS{SjTq zzyx4XP-2r)v9W_V#HcyJDx%`5%4%Hdk3c*ABLfBw=8>(JeUzzLzatjd{*JClcO|hprLxz%N?zJmn7V$g0jY=blSr{BUq;Lxw(;_2cxGD;736a$o~$r zwM$?ZG1&Oyb&gn=>%9EnjZl)EVMo&QXfn#BYoT=CT3=_li#S+KJlCRpTrki^B?PF{7czr+gs^c!=*`HR<}1Tw*>S5!Fg zbeH6N5q(+l?OIyJ05RlnDIY>UYZtF~Ke!v)&p zO*r$Xvl*~Lw7kSFOph_qz%O!+>4F&@^(x$``+b-h)TVDg!xUE!3$s(F$16 z(viPJMj@iq)}TCWaK|#B;;+W#Y8lg9waDZ9ZdxP-wPau1JmFR(o_8Z^yo+FoL#ZyT z=V>8}r>!X0Hqv(cS%(jC2pBtLT(W=nMLrBu$~v7%r2K?y#)D=kw5HzP5kOBr#(pL^ zk7^Sfij@6~zFQ@F)8+W)PgYH8)l>I8Pb3V5p6CBNI6Uk;P(~hHBjvKmZXJyu4OX(z zik!t>Cb01p6dgzJj^jplO>no3N<$2x>+0;R%+1!XMb3lJrmgtP7h=Fb+LOEeGH67z z!P=Uj?h<+N9sQ>XGQlw?jaW0pBf;OdHlu!9-=URy2GQsd7?dvvP3@k!|9)JK{PQLP zevpQ8D14@r@Iz66byo~%Nt+@mDOL}JGU!|-?XVHw(5$kKZ0G6Gld^SsnB|owN|b=1 z-yteyhB=1OF$IwFcAM$f3PUp!#p?P6U;hCzR^;&P_2-3IB)y*qmC^iZ`5mRb*-Huc zH4mG`A~M9Adg z3jMM=#uMRSO5$K`!tQ~l7F=YzqAn={qaS~5`2x|SeC$?!dy)EiKQ>m-ymfN& z57L2R4F<07OWwSWm8obuplnzG{cEsW5&jwmU6P>9m&{d)-#mzA)aj<%i>LH^ zq9lU@&gJzp7vb(B>z^z9EYgdTWDXuuU-QCC=sfsQG%_4{oEB7O;_Y*Ji%s3$8>l%L z58AMaU@c*Ka*;IzVgyH+iSGHG;Ze};JEx6ik#;IO*UxGv@Lhj`0%gu*VT6T*Br%(H zDwPZF+Mi9IhU33XPCzV(HD(wnhVvm!6!w^X8MlBGwJ zhV|ry4%{xlHXes&AL0ZxL?6XdTBqmB} zv+KRjE@{a4LW?}pS=raLYb7qSmv%W#cAK4i=3JFQH}VEqE`hq74i}i~E(>F-m9v>f z!E6S*w2#WzSi{!hNs`24%^66Oe6Od(3H-`weGh!8LgDAm=T$DRor=PeT|vBmwW_7x z(0tIWOn`2f?xk=Md%HRdpO5^rN-rvr2Y*Gu>@yHc1Bhp%Y)jd^pk0kQS+VZcj0841 zm(vf*HH8YBt>Ai_831Cz=*>l`?eKg{Q>f@sa>IenjT<*)_=HX)@{P+7+9p-u-L1^R zY#<1PiN+9MDg$7ZZ>|TE-qdx`n6pU`EO(8!uExX{)+2P@s)oi%!SA|iiX6HyRkv*v9E(cERk4IjGA!pz^@r2qUNM<0bnuS-r+LJ`K@9ROgl0~zJ zXB49q{t~-Y(vscLLOuk2@xMZEc})F@W;?ML(+rtsDd@b;%uojBVM{JJ!8(luZ@qEu z-S_$;7c6OI17zMY98HFSuCyQ|H*^=5aQhjF`S}T_`1_LJ%=@=Zr2H ze62ofM8a?4<;D;ibB6tpHotsxHJq-8Z=RvOE(IKUokF(%{$5bdO836|P82IkP5i-$ z=Tv76B?VbJJgS_xF|7#JRYOJpr}QphR#o1Uw!TDdkdGU0ARyFD*j6y`ce=MDXCCjZO;^mhd= z@_aFP;(nK!<2l57@q0B;fhD|NkxC}Tq7qnjcxmRGI%4DW*+v9EhJ!;jX{pLwUcvaX zTYWc|b~g#PmP$~H15SqMZ{TN=KW=ftv5)T7*Qjs^z#<1Ny z%dd}2dFX~m6Qj&w(WVV964`~fRx&b&8Kz+F_C!OyUu#qBZ1kmvwH^zchOu333DPea zJC$e~7U~W2jB&I>JRTG@SqY`EoDvhd416Ig`7Ln%BkLc9-^q!)kA$>7zFn5k@+k@M zebNazi#0-RcaBUiwurASIWEh%-Uwn_nMoF5$?HE(5^==l7^*^>VwPl+m8{`9)iik` zqcVacv{JwTZAVE+Q`da26z@P48>FK58#h>spG1Cstt>hRty_{h54Vni` z&j-7bR<%BxAzaqCkgPUr3BIP~i{LN=U_Jq(CQCGmnkDOF#=u`@fG~dtUlpjMt?5ug zZmrwBi}sY8Sk`ZG!5=R`f~>y3+uFQ9bcfxSU%%OK6RskKe(eP^Snges(O!P?OuIvj z>=QB6*d87s?S(r+Z7udTxu+NIUyrUX{)Caobh4o{txyi!*TW2knX9#o>qZqkk5hY&H%co3=kFB4-V~F*r6dZ#yYR`g>fgx=!}IK_I#zv6}o=Si71; za)e;(LD(sagZ(hf%ZpS`6(kVUo_YFxPheo!&wXgF5V2HRw;gPSx*Vk!qTBlI=zB*9 z@CHv_8>JK@mP#bZbE(>rR*`v2U3R=3vq`C+%g+d(GiwlLj(2f&9C|im%@_nzh_ZHO z?LFb7B5(dcc*Tfjyda@1%du^KV@qE};GVSOPORj1PgT2M{Nc?@gPI)klzQ&5z|jSR zW?AUWTp(QD011ZM_)C?T2=r-mf<8f3iD_{oj+$FG+@6L4evaPcuabZ7WRMWJDm_Z& zY-qkvKxa{`Pv=VzE?vbvg#Em^I?@BxPch4Tf$0*jy)a)Yx_=>9pt@Qmq?Mg;C(m}T zw*lCtdzL-F7_>m2KrJg$oPjRuw2<>9W~72)IfWmEAUY!OG2_N2l*bgW$YA$IB5&P% z?Z!bQVYV0qkgR>497nse)!ppu!pjgE{V>kNJ1hCp#B$6^&m&yz{s10{4njFn)}h{B zzZl-*D?OBP&$IlzS)x2>Si2dDdCl$$ZAgat(9S~5R>~4S*LV!BM#MgpR>)5`q>uR6 zCP*Yk(O9uC)UGs3AvARk%#l$l!8moThA7qqY@ry!2Kk>Ff1jQDHa-bMJbI6_(B{yajIbhu+Ax^e z%g&@0Ujols3Gc|`E*ddZK>PP~iS)wO4Xsj_f_LZ7A`;uT;wAefzL0pyOMvGmocVWu zLAQS8#Fz8F+nzTQMRe`>&QMXdvzwHt^8!ILU}ub}TEyDSrs%S+l{zQrlUUaxai42A zu1H*r^sv^dyR(<>i{2dj=7i0$#?#5C(X~HIbdaJl&pX5#1gt_RD2JBFRsKfmF>~G9_}uFgMsrmw+hFqNTf>&c z@*@IqCJk2za>3@JD|UV?`ke`Z_@M|<dRfEuD9(j7LIBz4koDLm;S%y?{k; z^+TOBltHs7UvzlZggQn?tJ-G2Q>27+DhnNZbS#P!M-YY0I{a73}r1hj<~NGKA0C$iSuh z>8Q=PmRMnr6-SM`5SZGduAn_ay(_wckHR2;m~qzLn=gmLRXm+$z2@E!-1{mCP+iBhempYa zykZ1j3F{!!nnOuiUO9rO5xU}51PmQ+Slk(5ul+sPiY_M^=wAqUA8@|GZgf=Wb z*7o7XYiUc*%Su~s@#O=-t566A^l$ZXccyu_2CTz{JR+(iE$52)M&!=O1N2u#5p`b# zwRVhlrtmcl*YOFtTBNG&tZlE<2+{7bbPiZd#rKiVb$tVK&rXE9Pz3n5==>C1Cs+nU zU06f^gppnKDjkpFb!hvh?YOz|#+TuGE#{Akqvkk@wQeM%D`~;L?lzr_DDbV(nnbIo zbzUux0rlHcg2ArF!I2$F6uR@{OAN3=!9M__<-Ayqb@c>0U^Ezya{AY+pNdViVskC9 zkh?-LG>WM+$aK*hv4G1MFu)79-h)v(-9=8=vBIEGOZlKDU;H5HXH?`7{*k$`7cRr{ z=y@tasAX*kAgx-HY-X`L5RBuqRMRYJ$zzgcBzo`Vc`_2bZsqY1LnRCI!rnw;wU%hg zcVe}dXvJ(STVJ}4paqu=)ITuh9pu9Pv!O;4DRG8*Fv3QYMk6XP4}$)}F(56$j#ZOX z=da7`TQ$0k9||aYbq_fZoRl3=q(2{BA`AC4PD7O7Bqmt@+~a1GGVCr)Zq(-*3#LI= zwpqAaR3LYuVf46sR4k)Ee}nO|cW!3DqDJ>$DGJ(yLnm)%e(jf3J@6oIi5=bZyfdQK zB*=%i-+tQqeURaD_U8^NmGU156joLzudi|U;(9{q9yQ^93#Jcd?H_W}_+x{^}QBY$pX=B0K1d1JN} zaq$mO`soar7-ok7qGm{LUUkX*h7yn{9O;Bu^6!5E+<~yg`)CpOtcCW$*b*JzDE4qt_4nkLaK0;Hjnu zZiG@pX;|tx`VM*Zh^WnglWrBpDmJlOkyaEAKi+`L3y`G30kl_=HMOtiSZmEH;1^9B zKhQys;w_%iVoEFpK_9HT!eajc)P7&w5%5|bGZ=B6b-(x_wN}bzChqC0zADShlwu%<1eYw3$dht8;5_cR7OGO;I4kJttpZrm*NrjKNqTxF*?IQa3$iO7UiBG;S z=ifo#2{uaF6l-(r$rrDS{{ilEClrI{=H;clb)#PY_8{KGEiz<2bkBcOMW$A zbLpM20gB*nd$4{)unr#gE;M@nr%;>d&%^ClsLY1h%;SK3s9%2%d}Q|p3o6xld^_^c zH|qTTG6y4qSME}VAx9*p3>tCt_y9{n+qtSD$gLf{aOFq|gz~H}6 zj7ycXu+T^Oazaf`JHREGxY9$E1uL@L+_Vop=84HYk%AC{@!2i_?(1EBzZfdr{5<~ zfx(jTb;O^DAN3l2-E{G1C~kfg*+x%{KIoXMR)O~)nCA0c*`crJC9h^YKaUR;32r#G z8*y(+W$ONkQo81Ji5A$>i^j5MKic4(UI1iC{fUxd}u#+1u*#71F!8?;Dk! z!uaCQe={e9cb+0%jVpTn12{+xQqk6OS=ki&w7!u}01gGpw&28I*wQs}NNKXp-|xPE ztpEp`@ma2~HF%pizeUeEF<_0_J|rhv+ELK$d*~zg+0QvSb0j%?OM<7!5b&_5M-BvP z3vZ325z+``U$Z@RiERP_6KOTNOQ|i)dnfc?z}!afIlzD zb2!*ax`#Gl?4s8ojAY&Koz`F7(kTWmIWT*hql3Zlo?!G#{b2f^cvRo$MuYsUe>RQ; zxBB#3?5O*lr8@3uF`QFw!R_X-+mdPVR{*`@yg7kGdWB}aN~MzglJo3 zY@O#&{NX)cDC}K}D$|Eh)I*YVKKT_f6fz#8lh`va{&em8*WEdmaYojtl_yi~*H0P` zN!glr-mul$+veL8k}}U_ikgcBV8}Ns1}hGMD4uvkJ_#CvC16jVB$uZ)yV>o!c#5`r zHN7&d6fSf0IPqux+532v{orLk}B;o(ZPQk|LR3$y-=gp6BTlPYQ znZ062g5Jq6-Vlo7;HPcia2P}<45~1Py`K7Px&X*ox0z8N8SU(7m};7&vRwXI)+!9| zIM;pY^VfQ=;%%d0Yscs^nZw)H(!sw*H9fnSW6pm(ltD(Bk#t+?{{S{p{v`W%OP>(M zONi2_6~~CE%okxM4la*KX3Ed#+P>IHBWMXE5$d)6!rjy#ZbO8h8mS zEIYTVZxw~kMC!hO72!8W_w`6-rPDbS!Bbj^*C;C&sMFcBZ^V{(u4+yPq4*mzo1a@M;zyJnhuqd!J zJW-fuIYa4<=On=jZGP;Uw_~r&!?%QLwk|>E3lkuchbbh zzhp1SZ^$G19)5L4=+7WlO zRGTx5H^4rW^CYQzTxLHJXPoVFaPf)><=DnK#Tbb19q|tkuN6Bbqhj=IotY?R^LzSPuq2AdO(#taHu9cI=GEs!T1`{TFyVVdk;aR};^&QYBH+g; z0(E=0{$icMZOZAriZlA7teePE=@IzPU=fHUaREM;nD4*MPir^)V`#e z5JZp9kbz-E;xh(m#OiPA+u!Cixt?y3^o+gx*w)wNt2VIrFR%i?qZW7JV606xfGxSv)OG8TM z@EyPHl~5Vj*F+Y*ITf!g+iea()FXH9XzhPe*kZedqbUFc-TR5Y?%ucOQq~lFW5)VSc;Q(9E|~$S>5cV z`th~psrS~wER7fG!MrdzY)3a#P?C9T_QeYD;#oHK+H{(#J896y@}f!CFBW*TiV}qw zaKw+t^byYRgHlPB60g8wu+!3vwC8fo%Q84W;Oo9(G%P-Wd4w()SVo4qW)%Uy$<~It zTZYp5waZR?aAIhP3%(U@s((Y1_uxf_^_)%rxjDpK0sA?MlciW>95l60ZQi=Y8cFu4 zu$WScx#5QFX}CoWoZYk3yckj}d8ZGJgq`x(gl>k?Pvbg3y(Qq7ewCp-=3`ywdbsN& zhdyq$c=BourmW;{Q4n>iCxTFgU$f_4sp7O0Qb3;(&MX_qQu9b?+y?QAbE_wa9#)YT zvq~OFB0Ds@Fx*h6_w!|YH;J86`wqZIH3*|v0Un{*%r0{tl};X3n1aXhlWiNi(=o>s1#n!uB(JmK7ONP z&DUxKY4kAnESzRe2Z@ko%-lhFR`=b(aBCR8hD~7F{4u{-6R~Nd=FQ+0OEgTq=N><&V(R%gOsVqY3IoqR8 z1>^;?nEKq&edszZFL~ZP%Xr`KW~*=8$#OQHvUu{dO<%J=V2!?6M~Zyp0@J;@b z(otK?{Bc!a1ehQrAldb0jaD1tS93xF`C80-*b}*NU58ub$rZ)&^2i4s`_Fqw*=|Dr z%Eund6~@5sh*m~+M3^SJjGHdT(3^U|WMY#aI@+)^wBx5cOyAt{rv%d2Ojht`oZnD5 zx0E6+*~0TB?&H_5TR=i`L0DdY^k>U)>c(Jmix$ceHShimLrgD9wSNl5QlS8LeMvo95;_MwANY+J*( z*N`zyuU)Xtvx-0?!W#ANo58GIsBKjfJLJsN`_Sd z9ESeyo$c zo!o+E57E!vX}3&FJzT_VoFxcWQIh?o_r@`eCo)q10NlO}-EwLaw0Goo)fX1i-`89p ze6(7y8>rl92;4S%4`fPI7h0XHjTfGXz8vGkwR}(aqC!3ax) z`yzRiQ{1^8KZX?^oi>|5jc%%~StP=44NrfU^MyI4j|wfPioM!N!@wZ0K5)8I9_ZwX zq7_3|4OwGJdY@Q2H^kjy>GO5W!&Yw1gN0yHd<9mTTUXd{a~>%b(xl2GGf zXIN))d-lfH-P2;d3u?W8fc)WvhASccXKj~QNkY!D8)XgUwUI-|0y!!=$;KO{P%?_O z`X`VNcND|sOAdl=i_tN0cUajPVU%0x6IMCt@E?90^8_~`H>iz=^y^m3 z9eSs`*SACH+eu}PL+-SS=f#FKR=Pj!jW2(eu*>6TR1|I-R+ZZBh1x`JhM+Cj3VTWF zV;9@N_{dU;W|eg`!y}Zzew?ApzRwOn$BDDG2?dK=M&mQ?g{)4loDMu1$XI7AhOd}= zLTG{jTMKX%JXcgHjbFse?Pr>vFia**lPCF#Xf$iJ_g?9!P^FT>L4RGrZ2DIxMOV^p!*$B&n}~wN>`XU|>vo zI&xC$A_J6&Bm(_mREc#756_30V?y+9_3ZCfSm?jHE(?USJ5-LI4d{2Pr`Y~hOd@`4N@;F!;0Q=xnk5)+@ z-evRQ9U&i zdta0%G2`emlklWxb>rmMwWGw1<**x0Sk&c_h1=Xn#XidZ-3|S?640Hr3)-{YZWIb4Jy z&W+M3-|zmH?#4~=U%DICWAT{n_W#zHV~|r&vSG4=L{&_jsl=26|65RwkMUTogu!G2 z4c6q?bAm#R;~>2iLSH?GhU|#-byI~c2pvsSZLBvoe2_uH9=1EVCMGaVP5s{e`tS7> zg#0pu!u;~7eI4KR?cyi(-%@yVxwb^m#;;3-uPPc{FCwfXW%c@G!#K!!%t= zc^cYOv0P|?s*C^~-RHhs<39Sbaba9)sF_xl1~o@YiiYVCEG{ssi% ztxOy%ws>Oe>gtNFpPZaL9)BUAp~}yDe5T8vl9HB|HUl$vb+rz9%k)bFK}Wyd2hTNy z@s9g^HwjKoPEP8BcVbaiAnEY?P*fR*ur=%XmUDZzQZnM&kiK z*4Y!dxACg4llG}?YVI=Uq`8e49r!i-wJbyCeI&1H%7&^Sk~VPvQ4rUc^S_Ca1R691 z^zikBG-wZ!HJ4Yz_g9>WSyJBraP{6nO?6+`s4t4rOXyvC3oTRuK?4cB_YR@=j(~tK z5JCw7LJ1&66M9n;ihvY>P(qQefQW#A5hDU3BBJld@6P>Z?%Xry&og`Wp0n1o*Iw&c z&t`YnB{t{CNF7;u7snxe$1tL^mbg>=1Y!RNg)rw8_TM!T87@fa^CEBtUBLH5WC^Dm z7oGJ&;N~Q*8w*|w_V2SVmebuYwm);->=b6V@6ri|1i~r@Z^*G*x!7lUkb8O{jtl0p zvGfr7%Q@pp$O&#|P(g>;D>SMO%)U}=pTkl=M*k@G#Oh*k&lmuga*6U@2!`bw&;{97 zj|h!UoJoO;E1i~=rWR*1HhM5s5@xWWIZNZfT^U!` z6>tuC2bRNv{bD(#q{Qz8&N!C#poXx+EYX%3ObYgL{J#Wg+T_`Pv%|b!6n2BFXL4V7 zFKyaAH0R7E#-W8wA|RnJ#-!BfzAprg)I^4i936oP7yg3x$wWdfQXFcHArRM^I;e( z3FCU6XcwNHZHdb@HD-5;wybkR@_{rO{S0^FBsAINg+zApGA0Qh7c&XPaqhpkR3T%z zkRBL>-)(wFUOCa$Dm$-~PKMuQ2_NaF&TjjT>re`ushup7vC&poJcHyCj=IYV0Y8?J zEt6j*Z?^n^0NLe4shozl=y-(+p@>N zY#3o-hL8}vhLy8zGO7~xQfKb}3j|lv5!e5JKwx#>E0XQH$i4pu2&n!C1Y_7pDVwMU zk!?B<(1RJ010+m?xE}t+9xM5Ra&Y52+n~SnmkjtQ5SOU3=>Hy(X;2P;-Ld}T((s*$ zaQgKj>cIVCm^Zr$3})p5g2Qw2knB#B_kmfZYgaDfVddN=g?&D}E4swS#w!Ibp_4MK zVPga2LUgjhtPpnLP)lS6EeE@m^TwMY5-!(R=FzRk8s@-(<-`P`uA#@$SmOw!f(H~{ zPbQ4dAg_jg_>j}dw>(9~unB*MFmvUiR}VJ7X?%)MCIU>P!V*VWY2M$zC`Sy^=nLww3KxhkZ4R5Sjd;VL?$SZkW*~y z3x$Rxl~-^n|GDvZiqHtw=A6pQoIGF`=>)S{U16;i#cDr01xogY&*T;mg&}(9N{V_r z8SHX*Sz~GcBr#58;)-#^T&o;Fqw|~U*P;-1d1c>Oa7G8;6Y4XkVjm~)j@8v1cI8T6 zW98Otz&Q(Yf!RsYV;1f8IXM+2Ei1xcSrcF#{nkLS+=eAKNtJ`%$5whE_`hq^#u*Kf zkff|Hb~2oekZE}qxMjDEp7Vy}K&h&loIK#XXDrtm3(;EupR+r8v*2=8!r+5{`AYbE zK4b_D<>VSyAeTA@l2#(QSZSgoeM_Yvl?C&C>}wE{jsf}Y6E=3-&qiY)UN1U2syuQ! zYyQR20MHe87(g+okSju1Wkc943y@IAMxvFTWw~!wN3rb{x`XqGW2#cU9lv=5Xafxp zN&!~BrD~6ujR7+9u90w<<;Sew89K3CjO7extP3`l+gxP@g?aQkTna0g z)q9#eh2;D}gM-_5O4}HI8D^w|H}2Ln&~bK(iNRprGWIQ3AYG#1FU_v0aq8qte*nY^ zCr@OivBEgNK{(|Upu+elM2s7q)TDu!q!n@Z%6w(y!&oD)fK{Yn%LZi#R)ZtP zKW3q~Cn5CYHW_v&SdCaLyOjr5CImZ=m6OZDz0O18^|(X}YZjtFY;aLFUYW$p;#^~- zpOpd3v>pi}5U;WgdG$F;NL}C2)6=6J`8o1@RkhHtF-s?bcv=G}54j?o<0F4-vWwp} zGvR$q*;Tm60-x|~y%w*QWz(3-k?Pe0U~n1i;?DuNJyfOR+^anEZJH~LP`%>DU!$g? zzJC4sjjMp+e<<+}6$`7d(rpm{=qg&ct{8bQ6)kEFV^aoOVuwBP-V59RFG>EUF4dFt zFlu*O7pQNb&&$N1PT$IzndiXD@kjH!q;hB1u^m76JW2Fh17(nFf9snZkd()&xqQZ- zTyFncP1$SG{_lo*m+OKYurbIQ39BbHQ_8Z^c55aI?~V_n?}QolH_@+qeHjj1!gqc6 z(CzSI-<{rjjZ~GO3=AG*7CiX&ZSz|@79Q271T0^yBND7tT-FoiC~wK(X;V&T&(kMf zj$Z`0uXy_k50Cvdy<*PE;KnJKiC%+m@jux`-9Mxuc?15yGnjiF(h5XAv0JC?@L!q? ze{x|W?MI6$MRLvX zM`t%Wpiy!BnRcv(=XhrQ&|bsH*|)+sHqXzCGcl2$TOHMmf4ZBMD?G~`M2)|_N`{K# z@IlV;u(y{R1$&p6wg%>gpJ(UT1@pl%6lKlF!+=3!fuG`jEU0C?RO@Rm*15CKz^&-G zG4ObL{6z~wPTPVmAPQnHm?Mf{9;|E5XWL1>3%92JDWA)&7%SCc??ukB%iT`rmHlfT zSBmD6-}8~*{O=kq80qqMlwJZePo!go#vnw%r0C9;2+CdZ};2mAD(h02|cu->%A-qgr@ zp}shUXbfU?y41is1Tu|VckgG z=)UGXXW9*doYx!W-wi+M`!K-gK-WRCS@)4m)9BmQ7S`_nuH6z2kUj~^V=E&q+md2l zH&|!z#>&?f)iyS1)%$YG=glN3jW`c^$C^w_Mv*Cz_T#4fnZmw6!m$#BF^J$>?&oCx zo|V|_Tkfx{u@gRw@tq>~OG;SsjdXzqy^Zmu#R1D||XsKc#__-^_T={)72exzxoEg_`U)157ge z53Jv@&g1Q@fBsS*{qGu}!ymi?S+NQRp--yCL%B-?1ufXpUy5daQw?U%yvYzWJo?Xn z*Pv3!Wio2E6xcl5zC_WpCwoYOkBz57U!-U27AfeVKGlAkvRS+=IXHE$!)0w8Y7Q{e z`lDE-<7H{1N0%V!AKi{3D$r32oS3DXWYbD{Sw1(bw2MmB^Fjk+c}VfWkL`*oCP8T@ zZuwY$*fFORdSq&Z;$eMaQ?q2A<7(9>D9)g%&9CU)h=D_PlNStE@}wehh0R*}t_^m& z3ajtq;z0?{5lGyp&tt#%%`B2`*@otlVUL#G41~PDiT!3$|10i4|AA+v;&!Q(^QQyC zilUPMeeZE>6n{u8)VBG{GraOJ?1(>8x^ST!vpU|=xy3SxO@`3LLH=BEEy2fCSKHoGxz81zTpa!E zjxyDUW2z3grBNQ+ubQ8q!v>hRbv5~IcJiNtKcY_glRGss6w))ci~W{YXF<92yeZ30ZDF`2n-n zb*hnZZ8)307X~SWJO<8iW#n}K(nwYyB|MT4wy8a@d3D zP4T|6-4KTaw~khVH!W%7Y8}3;Wr(DT6Mb3pd*##jcUrv6>djYKLf2Pluv|Tg+l-?^B9(JIukl)8>24@C)~y)dhzlK)*p0iBtB# z@m<=F0Pj$%J8byb2#mdtTV1|5ZSxiA@ADR9Qlgu zz7RmlDTS2J_>c-Iq#2)m;B-eBsYpDRD;obBr%^NEO?+m}Zqu}de@AYbZyFoB|KBzA zR20TRpsr}gRmsoH7%hW)=P~RMdm594|D)^V`0=#LOI;N2=ww%j=3|^0m{zFmQzM3H z*fUABhY_@jGx)6r8vmB!P-{{HrC%Lr{>)eo!>aN)ByW{q%+82|Y|{yn`hI@-wKvv*U{AMsztdTEy< zJJSm3q2{3zF=6oW#raa>dJcLKGQP7fQMs8^@z2W&c10*0bVhKD)Bu`)FY7DpvVE+2ZkT^0XK`@BzZpInux zFxjhQzPa&J)<*pG_W^p&CWJF*R7Xjb*$in60zO1cqL(dgsOhI?Hv6WC+R(LyZA{4w zS5QNCOcgq*q7d6vs*qMtjHGUt)NFZr-gN2l6?bZo*b7?l}0ZMAKUKDa(_aOTB+8vs-VYI1mT+`%!;p z2-^^@eRJCjK`Gx}e#0(wk%YfJl6zq%PQJKB7VJ5|#<{vt##9ra9OR1 zR_5#SdjTd+7NGukp~$YRGGqmfpW_Qq^*y6 zKt3ecBB@lBqTu~}G2!Cf?{DuDx6gzxf*%o5zPzdZi+Z%JV0^~aKXfF1C_Ki8qQ~{4X81h}xjWYxpJzTi=_R>Tg2YGx(@Ov2H?ykG^#=fZ^YFZBRH@7PGrH{I^ z+=^5rJ# zg=b~tO0Dc(*PkEveoQ=5Na_3Xqx&sUq3-uVaK~H0p00uL?m>m1&BJ7*zul3H*B_vV zW{va5x12AU>}sRM@_eF2rKUjeP5NZ>*!8g;1JE7x>%5p~&VY%Y(@m>`7)sbWDtA2V z$3z=>V>Zh!j-NF-uij~ST65`hG;nHjr8!o!%6FKFv30}s9pDW2mjA2Vu_#Q0a@BlD zc~7UT7u>{A-E+D%oF0p6(vMTXp?!#7Gqf;galc(mKCXV(5wnBEWR~ewRop>d_ytTu zk=%EjvJL7w5-ci7(r%E*}c<7W|Eg)aGRMj`_TCW%nf+^Z#8VERlNoLYzfa zo&+FC&URVrjdi`47zj)a>@#y@i#M3@0JdOcP7{^{>p$qLw_Sd5#+{!@ZzNiNN@90h ziOy#K!TMskM#zdA!=TJSfUQrDOshqgD|`DG<94zwr$EuAS)(DgwhGStt)q&b!`b0K zba&U{!YA;yFSsg}KRohE`i)O|sQN8gDtbGU_seqZ19dU)%&m6^4!iGZ|8zbI6?$hN zqT4-mOGJSd9%EpE?{XZTn$h@I0XA%|3tH?0RgD zik&WO9VL43dgp(oTs*+WFU-XHK83Pk9@#AamNQ!JJCV<*9;(s~|N8v(GdYz<<&k$e z^!(WkQt{8Jk>44WuTZi0AnfH5cwLige30|rOF2copDP0xR}YDm`+BZH?zIn+S)7>BHPM^TnX#sXd*6~yzsX=eLnFXTaek)L zph3FEZcNs`zw(`Oa|v&Ab{&-L z9bXn}s^QkYwG4-29k}LQH2XQysq3>^WR;V7&t+4;_7bvQF25XW$k7QKb1AIy`k6E! zXS~;L&HVahGGHk@ZrULoxpZkZbX`ehs`YLl``1u@_Xc%+yScAg98L?&`C%v7@jOWn zG`z-J%ayes@_<}P=#BrqMdGioG%4C)@zuu59T*i2>?dhXLtM$U@gAqwTlQp3o>cFJ z$a8%Q!jfG%vFjJoTI9KmF95gT6H{`!Z*Ktp1NE8do3FK8?RXm(lCd1?3{nSj!4IMZ zBxcGL{}+=P1i+sp+s4NUHaa*Y97E!tfS;R2K3K7P5>35+Cr>gi)E?trQS!``Te*28 zbZWj50Z^cmqwNC_tUJ~H7~65(=j!*|$8aF=7SM376(`aT=V$2k!>h@ikH>FvVZL`c zO`&74;L`ZnG2voB^@ANUI<|ED@r$^t4#RFX;7*QQ19R>3jb7$))T)wwD1PifH?6Mk z0N=mnBd>1nxsH6v=K?$=_|(`*>jl*I2v;?`l+^~b_rTO^{F1Z0G+=vj9DPDfv@bxt z2?{hFF>24ak(lhtnSNESAGh~4w)PT5@;jgZ8TZgcQ&IBQotDRuocsJr<{yfF8f;{% zC#=5jtrmwd)}Ny{-g$#|^4U%r3di?DT&3PeXD+eoJ=!|f98DWA`}DbBr6LYrpTlmA zH(dE$)?O)}_Hm=!(T?Gm@9B2(ELy6cugJzNQ=a=9?WMbTK>o5Tq#Ga6#X1$$H=X&$ z)!kgds2*AGLGwap_`Oh_{%^hxsbr0)xxXHN82hIgC?3m@pL9az|JchBZT;DWqCp#V z-qbDD8z-%5+F7JX>37;xyBDZz8mBg^EJ&h|d7eJe%W!))V^eoAhPu036icQ29^f zhMu!Wc=Qf(oGUO~g}EEv+xvb@HjF|oOozD{5o;YjT2mKjvA<>ub{Ob#?(7Br)6+i& z%gB9K%a0D=gPj~L%XbG{ad(j8>Yw|%-P!6h*}ll`S>yl%2)-1_tA8aP&6?ithMbah ztOdU339j(;rG#ZcOq7F#<#&;eoseyX>!6UVHhEP5&{|7**gLiyU!T8>K&;NOZ6~$1 zsv{hRLqw{$Kk2t^tbgGtl2{I})s=c_8d2M>9lV1CoMJ_Ol_Ff2U4F^Q%~x45&IbzrWCAf7xHyGqAJI0G&v2v}>#Gi_8j5ZzT6*DA z{qrIG);fL}pUi1PdL7+SRrxyZ`P*1|q}KnUs2QIQ52w?NXkP8T%RtY)sJSISHxr4dspHCVU$_^yl3a8BSN@1c z!-l_duGn)Z%S&{?PX1Sw3}%>a_Q;?% z?sl2mB%~J;zp)lc_@+1SD1^SNBgsvG~@_+Rbe|4Lf_bCp-T$|**& zq@uC6@xu$-$4CEHa6?!4dsRPosaUx&cLs~7bF-}kYZPG-IxYIvL@(wqH#2!fV&}}H z+oWUB8w-?C=}VBXz zx&1?}YK%z~IBbD@C(lsucqW>^cHrBnh-10+ozFD$s=?P;ogK(K4tjq4e2OXUg1F>L z6dwL3@82%rzO&^J3!I~|Uj;dwEvOnEIEb?5Y1Y5H@DT7PE48F5Q*1sMRR^dqz5KXZ zb-*^X>m=fuE60KWtcDYz2ehCgtv8b_e_2FN#kx5R$kX$_rgV2{qykj3GHD( zp)^)AviLe5ilKtI^j{jKAlXl|ZEW#l&QfnCUjWhDsNA8V&qaKw&KGIY&8xdMWCe4B zQ(Ym-xx1y@D97^p?S07>u}wpswZTu~CwWgPp--Es6+xg5R=i=K$ znnWoyc4AwVMT_;@#KCRDv>WoLCQ3&c_kqy!R~Ic#d;zBIo9qGU@xYtqLEnhUY~qH& zlZIuIYdU$FfX#VSq}(mLRC>32KjmH?RU!62QnHGZoVLUIoAnZmj=$S#yr@@_f>J17A@K+mASJ_ zOI}Y|ouEvR6-GQK-$kM;zD1H$y6-u@7qe*H?LM&%9(LenQ^L^*eS<5EQq-;4veI0& z%(HDUyzj1upgN;_SWOG#0DpK>%eX|3bqxy^%SF6Dj;4%7()@TXn!-{R&O~aP(V6%Z zBrseUCn0%hiJGWYC}M?LW^FA8pQi97lj77}C*QH-e>H`mvI9%V*pM|w)Ne`h#gTIt zA16xNNK%g`AVg1hS$Cmt_bto-0 zn8B~7Bcr6E;4MCP<3SwRiL~DKR!ctVfR<4nr{i zew$9U6h^jFSlr}68wk(?D7#$K-1102`o(G4*qwoHzT^2M-4s8Yn=mG>PfHu`u@3z7 z3dN|&Yu*oC>0^F)H@B!33nG4%xDh>BL7P5v@A4KIniZB`Zi=tX4GeQKYp0i77N@0> z=w`pZR6_-aH*^^`29p?fT}~!D8yIOur}Sl|ab5MgF|8eFT?k9o5$YYw8{TH#GhM6^ z2Xj=`ua9K^<*{v%1(lg5N7MTFBgjp==1uC3f26k0%U#Oo!$SF$(Ol-xA`zsVPepsx zopZ5F{NweRc;UbCpL3}!;fZY8LFC%TV4thmhnSDMQhQ>E&-5wAh<~f5O}r0akt%lr zotH=cfIrZ3dX>IB%M==wvd{9RLHv&`DKMe$y{5RC)i1BUd zkPI_gCjkz4Uh=t#X~(B(mU|!O51XL6BSM8N|JIVSp}` zuQM)%=|qh$+rN?Yy_r8KF;@+IJKvj~pY2pn_*ALWWPm-lMVKWhi^kagJ>47-fy=|; z>BOn7gPT5H0M6>O+|aL32G;`PCQoJxdb+aj!s9bmSIcn5f|ljfU3%i)wvPMi*xP3W z&O)Bf)D96TR4w%Ts%F*)XdA8Lo;gEMgh~rnM;Hr1WU_5__3Z#5JTA&?^<}($L3`#5 zxglmj%-9$g>iOipvsNp!!;QP$s@Hy+kPl7nmd*a*8!PH(_8CM!7svDdh55VwuViJaBe-YnQ)HvHk{tAH^|EOL2h?Wa;&Vbi5-MrA} z%(+vC3xpa53&)0!`?`b>+umuM4Kc@q_}5{u&z=TiWw>2-;Jy zM;t@+2(@Jsrp24Q*C68ES7$l8SX@-0iEzmbY6;WYYxsf#ZHMA>!k&8xS$YzPA#u0s zv(-uNG$z(CPm@1hWNYbOz_hA94(0vSn2E)}GR1U{nGeyTan+nOW!Q*}5gT}{=7!{X z4WHc1>SgPjPG_YUJ-i+Ov%Q~n&svOwTU!T`wj`+!-6${~FKZ1Tyh2hX+_L`4dwd~S z%%!)^^jOGMq@36Bb>Y85rzq?2!nbGKubKAsT(LpEd!WSb)emldp}vHCr}?sXS{wYNg)M=Q^!$ zAJ4N&+6p%Tf3)rePn#L`g@+$)sf6KzrDLJj)|;A%>haCVGN-gfgX>t61&t{Aoi}1( z5vW<3j3tH1`ZaXZVwQ#_wvFtdf!!>F(7FIk#~P^ISQDP`=Cy#kgpXC(;v`AJ>s9qS z;$}oFd!BPZWM59}EYo>vHo<~NjZZq+lPs;s)=9Nds!j=Ayj7p*J<_f6^%+wR`ThJ1 z53PwmXPOyg^*PgmEN2lnJ>nf~qFaqb+v_r(E3e=ACbmiUD7~QC8q|FA*5tbydi{7~ zGw#id&yPosO^ou=QgREH>>--mM_*AE4>_7^WoYL$fBK(_Q<9uz)dBOB(|AVRVV(4! z>=8cD{-WXGQqvrLD0PFqsB=DS<9cjiARxg!UYVz}hsz~ixwxFS#$Iy9T8HHp<{16V zFf^!8f*&N9aSF0*6$Y(X{$QtEsTa~jB*aVBg5#v6Ma^4;PPGE&tis^=2_!1>uSjYW zZnbL-@8l=dD*I`cLjJq9iwxEGy6dd>ggMfCD>PT1rO|ObfqQP4VK474wi+>NVKuc7 zC(n0%XC5{{n-7771Yj}c^0Z}wM_6$V2)YW?8c0Tr{17v18*Ly}(5h35_iztnrNABh zscxK^!gNK^ZMwTr5ztf-$p?5#eRH+o?2M793V zY$NxhC_X3Hgf+uSI8NqK#$ILax^fbE49Hk28oXMUzx7V-Hl|oEz;(_?9l--m;x3Po zq`uK+D4^gK)Yw|78l?p_)n+?NKb(7qUFv38@_Uz!Z)>7$s5MY^ENvfL2+Ye_ev*T= zSV8S=352PrM@P#%YAoF6=^j6|pGa(+^GdU|Khj5;^wFo1m+AmtVF4<}4E1~jfgn$i zQk1gmYX85g?>l*oHb*gv^QH4irj7=9olLYZZLq&pUpW}kswLE3f=QI&<<+zYF8by< zAZ#M+<(r;PeMKH;C-Xgg`gkmy`cSC7xNn-@?j0x#9e?^&1m83v+J1O;`vH%J(&g|4 zVC!6x!6HEvxaiG&Y19avjLt^2-HL#MIOFsl_z-0ig%|T80%tS2kTtgqi(1_H_Rv&& zvZ51hA?gXK;@?JmVsu3|et6E#e!PBhm!R9}4XDOF8;M6NlWnV?KFZu8f!bquI9!6p zG9wF6|5!qw`Awdd&{K@_to15-GYTVR=ijRPNUYMD_-Z8@iS6=jB;3KF7XiPKnFcI2Cn9!FV`eDS=_wLTd^kE{R!*_5-@HO$otM3<(+6xL$M48 zFQ9x``A>_LHO+eYVY@W@VSVnMM`z8F9lmK3zYn1muUrYwvKo zOvg!JRR1lzJJ0of`@VRQiE(EA`2DCzuolaLBGHY0*sm0=uZ&}G&h*aq997Bf*6X2p zJDw|1-b%FSI#um9V>22g#hN32DaYw7O+ExnJUfyj#*5IZPl8?w3R9(G(-~7GVP8Fv46G4no_4wyny|3$W3iY!zMe~u}a_hI<0P4jQ z2~}%&qtlmDm#yA8+=cplc3uD06v8M>$)`RydWtjHPi3WBwD>NZFzq)i*Tz?n5Q1_N z`^67gV27@*ZS80R>6USDy;g*Q=ez z_`l=nL8{Am_gLPIZhiF*oAm-kttc_}y(kY(f;&RHtl7!fIhd!|J1sB#vLVcKDsFWx z#)WsoF5s(psCVSrW`2N^VIp&P$$gr}w%ymP(maMQ0Y7!dYRh=fHGsMOJjm^qoD9YJEFa~6>2SKOyRS7C>zOfsE;gNqnoVI%wb8rGh^?{BS~x=+?%v@aGx76}$la$S2gE zEYYC%L;p8zFzNAUQRoMlWl<6xt`L6;GEbeXce=OIn|ek}`jc7WgE<9$+R(Sf&uR!QAu=c6&gfq9JmOut{5KUS5gg#${&BqN*^cM4{k0W27P$Ko3s z6BBfZZ%|4rgXwC8=zIH&C^NldC+Mj&s#&takc~Y=(s9>@u97X(wfvS3RVJ1BI8I7` zeSG(^VRB)Y9>trflhtH3;zeeW*$Ahfsq^FNv=t$|iQ@O0-t)?pthL>UC7fzqmx%M? zYqUMhN~c_7brRTw6JD`%J90#F*-B@;G(z1lyBt8sMF^qK#P#a~(CVVHrp%OZZ&-ly zjTF<0sdQ!5bZb{s`{eY{%|HYzZIrH8s-((HE+m&=79{zCeG%ekG}h#PC1XZ`+B!{7 z%L0Lg$uewRlA_P+r;(|e+_g!`K!AwB_O{`XhxOp z#EAd85Vv(M6S4I(#5CbVMxsesM$2WLj)=Sc^n_;Lr4~-UT)$>T1Rk z;a=67d<>DR0nkfTe;pZ4|fJ)`$)ZkEy=N@DIIRFGUX1-f6LSKsXW0A#p~F@ukWy4P-$$5zHjwvK+&9F}o`yi5 zY6Lc)1*+m{_3(D7a@A-r6b*Y9eHZ8nRd2V7!u{Z7CpfRYQNJ*+7%I!pl`fNXSR}C8 zuy(wITAj|p5iGg2l2SJ!G05k|M%Iap@^KRN@wUy*9{ z@k_=(xu7g*n>S=*`hz54E-~6IKqhn)SHOGoo5t_Ts+)NS-gO+MW+e&^w^0nq*Pm$I z#q~~cZQqfc8MpnDJ*m*g(>8Z6P2`JcvN4uU4S>^OE+!W2!9lC$mn_+j`;J_I&FVo? z#d};AEdpj-se(N0fr_AKuSoazSZ|*Ty<_hM6y&iqp~2TpMwE8bZ>u4y$Nf4#13Haj zh4j>$=yuY9hC4S~#4lNVqb|6E2{cffpiCnTy5t0CUyhat4a+?GR7_WiQ^7**FKRrH zF3N=sei-rq1-BNn>Suk57}Jv|c{;NJYe4MU;{soVv$GmdX`-GREDA5I#P7Rd3q5G$ zlMK1X8SB-r+Zz2_?u&{zdT6Y!X*?15=7#DTymx+uBej-Q=8&TIxkkBXk_<0g4@u)B z(e*hR)k$S*!Gvn~?aRvJ)CsOUzd6}zfJY{c?L3=SEo#B19q6Q@)lNqA=X76Z4yjWH z(Gy;X09P$Ot;_h!jY)nLhOn^0H;Z=*>yP9j>$p~&6hbtXlnpu&UGQBQWrMzza=1K@&xfz-@MGMq4jZgjg<7$4^&TUqJoQefdPj9CUci>3;%sEUni`U zYGu^upzf0dKUa=-0r5Dh)7$39OlCw;$odUp$N#h{Xb9ebqz9HA&M&^z&UV$t&OLPt zTHqLh56~tb|6zW$9HmP3*P?TJd;R-3)G#AkDJCR`D}m>Q8r@XYP3_xgO?IZrRUJ1ejl!g}>QmNPdX zT3?j+TxvO+I?nRWOs!wmjW)z(VhjgP&%vFIC4*j@U5jkNqwHo> zD1#Cin&Q#~??XWNimnYv3!m}kL_YJ@Swp`XXDF}vpYIa`T__FLN96{Lh%b?NGllL`fmHaMX_q zwrMf{RhjI3z+Ji4Pm>>%$HuvlXCqs5r?6Mxx>$)%27S+CI(4HR60CKc4<8epgN2ggkQn9V zJu5llpb;%W?F4A_ar9`A6*|jkipA+>B+D0W=+_7e0>rnYd*EU!o(5S$g1n;VygDCV zU17O2FnUeYrspr>zJeiwlci?z((r?&a^CfaHVRfcA%zLBB)H4cw+k)Z;E!SC&a{|!OIZJR(>4JWnWB$pHB|Mt6$@cqi?j!)CpWxW1N*ZW*o zWLH^~S;Sok&QR`ruYKAJk4K9m%Eb8qX9uWug@mBSQSwI=x=R)Ks zUzxQ4M~G8Lwxg1MU4WWejNXNs;Rie@d`#)waI~fao7}{A8gOuj?D~}jX+LfQ(c3{z zRy~`;FWz`dxIw@A##x3d3!K9B=UnUw%_CDXZIb8=&2zX=W7+4@sZkY{dAR^M)cr`0y5C^f!`;i1usXvhLpNB8 z2pWY(M^9ie^B(R13BxDWPy=j|=#rBT{MP*lT}f~#EIw69*IO*LO?h8m7eoZz6<{Pd ze!ze9>L7_YSD6!T+e!~p*@Fx)#4p<-DU9>M0yjuv;h*1oq7jbh`r?U~F_QmXGsQ}W zys9nrgBH}>Bu;l`nDw*x0BX#khXxV;W2;XYiA>h-18;2&(x8VV+tHxpTy^pj3YTaK zfag4Gwg4rEy6nuNsOHhKAjXQtQf^&JlC!yo^1;V*8QTS_uE=U_rB~}>C3WayGZ}Rw zKc9k2YYT!d{KO1kB>IT4lO`beon!~!@5YY- zBviR)4fnerLH5M(dw&zaV5r}S9@j}e+xGbvk)w?7#Q6Kv%IN0|!Ndz+opqj+r)l$9 zoNPy|9e17t17@s58fivKQ<02dJO zMy&7J@J5mug}8QXe#soxbgz<7H;JaY+2})NO)4;etH{~9(y}&WasSebXSKo4Wb`PR zZ%6h^tW%?hWJgZ^yOwr4K<}vk`PNk>yw;%bfJC+f!hOp7T*HJ6Sbi@rQF#O6TlG?06hY&PpMm8OjhXml9`PNN#4vAw zG*>#GKJ>lz9XS{|AVmKcUh}Bhf+pP1pG6%cHZsW)xe9lM++NDG7;feYku5(95**)V z_*6u;x{;gtZx9@jF_iYeC_5!i_evPaP>l0N{JlT?MGWYnVI{wQkM{d1Ig%bHeosb2zk z-`*+|a%U5}%yvPE`jGTe#e{V_OdSOBxMzEpXh*L%5|-}LkBMDsa9{)feH_+;6p9)0 z^HCvcyysTsH#L{6HW)Whv!F`g8S*{XDQ}04LzK3C;uihjFrsR(hfEf-N}JtV5t28_quwbB1p%eUbOmriV9H3C12e zEf8SQLQQw3uxRWK;$6|Efe~4VUjIWjj3>piSI#PeSQ^~Ih1ye5 zS2lIdvtdZr7s#23Oj2Tsgmsnd8@!bKl@Xfn6Q##_9=RLb`8aKRi{cW|SXUNtS0ArM z?S^m`ZV`gW8}}FNyy=scEqM5m3SGFKXJndBOP4OkSVW}VIl2$W;>=wHu{BRgcbJoD zESAYZO~NhU77oV%p;3aqk$HW!{~hVGG$^XrxuG??Xkys&)Bd$V3SMwV`n)nlnXwVbWc z-MuTVLA-sSp{}CjNCrehVOiaX?_i)(QR10rIGY?ulX_0#A`{*~K7IRhIBt{Xsdn-)3$BUL4KL5el?nz%EHGni1IhHdyQ(>3d$?7Fn=&#bsomo zw7@2*AIr_-19rh>6BpFmpVX_|7Y+FGwCpi&kJ?dtsEaTrLbS?qRYiwYo$%VSv-l5aU(H9UHxM zAr0oWc9B?B?8lhvZGed?VSPCWR2+44Dz&wYD3)0=f_6{|BA!m__s7}Z3{Dj#w97JX z6stlpA4OI4hX0OoH)#;_4EfQFpsb6ji9&Pzf!$0ePUEFp&oqC9i+Aq2S*b1g?uJdd zSm+Vr%nn73RLFXKm?kGDoNirqQwfmyv|H-Pu%b&ZN6?x$M`f$xBFARk8syCCq%|^d zvsGAw=l$1Gd$Zp>Ca>N&vmJA4pBFul7{6?wgwOY@92q7heDVUlw12XNnDd07AKm0r zoFeR6x0g-{Y16Vx$)(?Ny!Rtj$S==ejsJF0ke+Y(8zVlYpsHEg&>zZnOuSQaiHx)6 zxxqScS3ZFg)gah<6t9E*y;5H@pEvch0`WzlU$hUE&HD3knksDjO`;273(&d)@^0(b(K=4&|bQ z8igArFeWT}nJkVL6+8&;Z*jJBC}!;r>EKMmS{GJl1o|YzqGU$K(QuR}c`Jwn_)AnY z_8V*`9U?6V$(SP00J%DBXepdSz2sqVp7>8k$x}6!}~WzNUMyIq}G@+oSU>7F=!{6 zo9K?<(FDKnEmqawYNR1;NpLbq5p>!&>=${^&0`i@iCT`taJlwtqG}dx?FpekOQZ@j zF^%ttVh_OE{u8X|N!jR(wLXa?)kDtb?9xGWNknRqtot!>${*m@!F>?D2FJEYL3tAf zcM!e`kUo$TIDQjX4XW)mWC=XgmpbB&C2?n} zBaZ@}a+vE;z~AWF8~Ab{u-!X7Ctet*_97#ep^0U!58Yx}O^FZ3P$Z?S2mb(~U&r;6 zXvbt5HcG_cx06QnXF~!aFv=6Z)XSl^>&XO(?3_W?!3##y4xE{6hS4)2nGJpZ5baYi z__v4S5X7!iR2x&Sd@1!4lW9hYZiZ-(lbE++**J;q0?dhG+m)a2bChyOUZ(9ti5CZUgvd}HGl!c3y-Ei#D2 z0+ra=rzV`6nj7%Mr;(K;o1t2Vp_H+)L8eJ&;II&}HX=m9zE5Xo)41k{IoS7dC+wJ&gjc%ak!bd(Ss~oWiqK!Mj z4yU1SO6cgW4#T3QHjJi?iD*PFB2nm1LdGVtHogOpT*H*#ffISGk1UM%hmg1s!di4w z8lZlv!E(zW#s?}5ES4xXD>1b&i#at7^gS5&HL^svmo4~JJ#=$Rks+b6Ddme0xd&u+ zKe&=KGeXNl`yM%nVLVdpz@cZ#~^cye}@jnF7E7?Cp@(l=jC42C7oF!wLTY>U$GsNU|CY2l%BDR`i zY0H9FvR!J45^ZBqp%ieP4GfX8SwBk|CVm1_vqEBi#@L%MGStj2a%jJD5_;IOn4=h- zMX7>tC!p&2MA%Uwb8JDAP<^=;=D?JzqjfqR$o{dHOF}INc&b}Kmz?9pz zhx_3W&tfU8JN^^=G_iQuB6}{jLM@KR_9s|#RufS*u$}TSh#?YpNQ4waL2L@yjJMjE2{>L)S%LNewMqleCc4>{>Xrh^xh-ABE-(%P}}6{3R|IL}lI+ zR$rf6A^2pOD-or#yvb;@N8^v;_%uV>u&A?vwhEY@L4OD9t_DKh2IoZzI?$AKNRXEj zH`<8iYf6%x;FS(KpwC$?%qO0wx>FzYuri4cGi9;W#poFAbS! zD-Wp;#SPZa*NO1Zig9)h^cjumqEpEm;O>+;iLHi6l}MsGp%R*^XktA$bT^@Chk?DLU=Z~(lY!jMhf)Y2LvO5x z#gLM0O@njnWD7PCAAIJnf5He|60$>OLqbnxIi}kNofBcZ zd<>I#sG&-08=0=hatX+&{(@{1V$LrDls?jzeJy0|S94cf88X^tAD*rHS_8pe~n8W3@sbSDid zAbc+nLdeY?MW~-;Bc7vE(F=wplNSvVu{6o}b(AY?$yA_=B<-$9Ad;CPIW^KnBwqyC zuE=#_ojxJXLN$0QI-pp^>){Y`IRIFo=#{Z*4KBs=OV5-fhQxyq!itue}LOBx=viu9%WIfIaBuTzSvPxehRK!4HtZd=*hTAlLcx|ZB2{B2YMvO$! z7Y$JcjG+xlU=wh)zwl}5cF@|AWvO>V%(b*tu{1{5&`@bbh`LDRYR4sDIks{s=`pav z!rW`{uqC-o$~WBzv>2nS62&*L==Oxd-N$V#2`X+{$d(0aiM7y=3X+l%j#CkKHSxMe zJqQz4?8c*2BOH-DiN2^bEbt}DLRslsG!BHE-Waf$8uI%QGEA(N7#TB_nK5xK3TGf{ zD9FPRFGM{Tt4kLWlB0={i-L4I>g;4UrcC)nRMa0ebr0Sx5)jjZP1-sMxlS6fRDkEB z2(+micIH;>1BjQhSu$B-5U?BQ?O9yKW~Hb+hR4$|#hghwehj^qV08e;DLY(jUKmaV zl-j_S3Y5^D2D%&IW8RTF0cw#5QFO?4>Lp0F!h#nH>OY~>PUs|&OH?kGg_x15a>ig~ zHu6WT*Cvt44J_V+)oIlhi*Gp>z?0C6Xi{*3wNjECX@XMZ;*>EOhOE^sh_dq5f_2X7 zHK#<nGa4 zt2;u=R!PX?$dtaz%pgfoU+;AYuA+h7|#ZfMwgMd zX`V7Lltv(E`9=Z)D%AsC(hk6}xfEEyvaUpKO^{;H?*|j%s2+@$NMw+Yn!>@+@G{NIcjAA7_0p4LMM5K2EQ`> zvyunXi;PI4gn0^Tz_yjr$@*hXt+XdxfTC6_8boeQl?yad6n%tCH>t|l)nPQmnEwDo@kD(TFiHCGCGI8AyWm}h!cWlG zCHLbYC8{BZV!Fr88K+>;rod;coL@HMQmVhL`3y-B5z|Y7ASnE`(pO7 zu8P-(^v0gWvku8!u>&Zt(abb(jVqQ{ zZ3gI)GSHt1OO0@0yVM^xPDfK)4e6Nw0Ac~*V3As6VuuYB1#J%~fec>)e44hc97vFWMV4{RRagea&o`O&I0gG0}lnz_0g zI-wF?nD!0&XV~7@%4=CitSL7J(fu-5nK1`-8p~xQZ-yvxLI={(u>pOLNi*n0%l`m) z;HQj{2u{flSy6n$W&wao!Dh zA!s1PBy-X;nMTPRd09TD5V(;&ZrIJ-_{iv*O_+qSx}vx@TXlIMf<*R1o-#Qf*;})I zCSRp`u9(^6m2I#(PInDU+cZ7LeUSYPBUHw-bbdC9+h&kdQO=4@$8xJ^e^8+4_ab}LI1Kv00-kDBWYGTVxjq1pmL2B?Hx4umRf zQH;?=SU5l-NueP-1c)$_x{bh#`*|>eo`9)>5}DT3Wuh`NIsl@bC^!}ZIIP)Nu%=Ez z2`a@{lKy-G01VtuGNC0LAZ5X&OA?X@q$L70B1Z~1SPUU)uO)$Q&_Ds8TZ>IRGho9- z(N={J!elZSN-||cP{CwKV;BIVtOTsQLITVdV3v3v0GUjPdQ*m+GL#GZOp^ZTqBz2gkcfZ^LgoNKTxQh| zKA~zM^R94!nFtgdpi+iGO}X|G0Rm|-GXd=&Wep=)4U{l^bZbly2NW?+wR$836(7La zVgQ%sw>?9HxaoBiDL7pIOpam+C)5rIAr3Ot{Zea8Ruu&a79b$X6fr;)fdhrga}7Dc zB{R+DMZ<(u;C#L*oUqa&C{e94!6qb11rAdvQ9_(DN(8Ks0+q6$hKsCnU`+#WA(*I4 zHBhZd6v42x#++a>l~;iW5EWWWsDipC0vdyp4tU{Wy8r=9$f3Kh0+${LDuFGvGs24~n%jna=DJMJI z%+Z?1Kw|=eP@-350^K$tG2H7xhxP)?m=o1wN8PZ)X za0C@OjR@5UveGF9^MGU#2$+KcLC$J&s1Sq=zgl;Sj&rb8gxm2I3=N(o6Av^1g+0TKA zd97?1|M}HZ3$d8_XQ*c4`iScY8*lp zD&i7F@Ho{lMes3a7BLLQ-MyR$BZ~l#;SP0x2@wzg07Hy%$-%5d7!l{CFj54%Ef6so zoEQNJfI~#h;T=c-;qnBCRTn^GJjxUjL;;8ZCaFW3;MMAaYrtD5zzkIiS`-oS6js?S zFai*&^C6;Xp~Q|zBS9@KM6@zRiz<#qK%WKg9dsyN2q(gLD5H)5AaWo<1{fU&*Isqd zf(|eq`Y=L$@Ld1I03Z_2R=?>fAOxgqZ5_I+CL;DUwrPstZD&+Yqz zW41G}wz+M)t=St}D&A{mSUF(7f_+8wO5KwW?}mS5SwnL6BO&tB>722c%Nbvg-Y`C` z5H`*GXWCQT2FJ-y557uqlKmmDmYF%05I)#)!?UT0?$^ONaCQ=6(phcW8@6&^seY4- zW8@#Q_X$4t()~o#=_BA2UHq~3aj+jFp9De4NI`VFn`)PRU6}juc*{u;OOx#P)sMJb zv12Fm3f9YNy4sGma)kBj;n)(#vOUV)M!raYd_R~zHhhv!!(iCCW8Ase%cqNkklT48 zc1NBQsYnlSBMD1?Ct%p#mK)m=H{1`BT9&(OBijaDS$bp-L=Tg)ZDnk2{gou}!yudC zsoCeNxwdh%W&@qKIg-%Gx11C;E3Cy2ve6eQDjM6g0Ei)}6jrvY}j##$U;T-nj?0|@;@{ydd z{PDjaKICQEB&Tc>_OoTXPtM0XvOi_6Hos-CzS5Uotj))$8QA>D9^ow5dLWGZVU|Ze zU0(8Ym+xT@R=+J-S7`Sc9c(GPVCA{TuMp+>rEvQ*##HrnC4E8@pHi5^Ey4S{kJZ%u z6VDIg5qylxN01OKd$6&cgC6D?WsRoKwTQ%zxB%H+rJRM9j4x=1>N@4`mSM=>Z1=zt z*xAJI$X#Eg0kH_r0)9xGgBWMIN|BfHT0;Gvyt?df?0<6e+?np-?mw&j`1AJsCQAEe z$P8^P>k0P;!35L5)facNeNTOeS!=BOZ*P9ymJOr{xD%&iFtUEwGDw&EV}0A%V71%7 zB-%?{jn94!yXru-*(}Jw)^&LcAPMD$YAcr_WuApo|Bd=Jg zORzs|Sjiu583J9KYi?&@c-b59ib%WRjLd+2$z$@^#iWA}wiZIvjg5@*Rvqd{Ha$cF z#x#4seVyC)=^hJbgd-hGBES z88X$at*x!IPcA*$Mc+}*%e;dLBs>p0ABj&qjr9ksd)sZ>7v1XTg0H9&cI+7#z5!={ z;L9YE#>dn$?}swsYDU$lE!lP%?!sS_`YzSuD39?`IZLF04i$1N&)m$B44FtntV^1PdMqoWHA{ zFr0!S>($WLVRm=<)8Q8_<3)I@y)WyJYvrQ`QW{g zVK4>4MCu4kPge>sPle6yD*3&KUUR%i*Bj0>GkaxGO zgqJJdEfRCa@=t-_yoa$Bw!Ce=2HtpXLvQ>Mmu1<##$Neyf0AcxiRuYE;56rl%#*S( zxo_>JL1!*!jkUI2`D?u+cK$6(pY#*KEX&gEr{5$`QtsMY9g*2C&XB$d8?h3beMR{u zb+p^yWlv-b?Yf+SXKr}b-)${6&e)#09E5xjCP+Td4kXy#*&VUAEEdk;Ct=oEtVp`w<=a1Oep=kIFH07mFMh80 zYrsP3YWo1pdXSeq1Ahr0kUPloNJptQLp)+gBWo{d8vveky|(>tha>xRyE`kFXJK>4 zX6!3FdU!bfweE>F_J?|*TW~@Fz;-IzfjX};>^2k zn{R1*40R(9JK@J}++~DrLj99$C;PI@0buq+mNMqp z^tb6L_j>jLXWIh{Tdnjj-b3A(**hTngVp*-CBCdk7S-Dr-y1QT;IqhHUEhl_mR4bw{3zCQZmiSPfrb9yJKgUCfCa*qj$k)FH-YMpLQQ}pCDgS zyM)4KFbRH7?0lqOa6LphXzAeekbXn#lQ_WrkSzXM{Eb_ltPF>WpRk5^<=IS0Q0~d=`CVvg8et$j*2#`Dyt+_)6qR9_^WtFD2QY zr}1iR?s~P}!~1QD+IqR|VUk@g*()J*zCVSkTJ_@yqx6Tpo-&&umVJWPq>@~b;A`c$ zIlepI%HMOZ5!!ibahLmkkSzws$y+JAWwupzKCK?ZJ%u7Xo%X?{{JFR4$Gev{0c`xT zcN&kVA6HIV$J7OfdyKkSY^vhznf2X{{V0MKe#_71+Q?ITNW;e>nzh@$!Gfu zv%8YIv+T)u_!RjgaJ4sjAU2;N{kdo4J0{rtosU)?;4_yk4{{JMA^m~(XtnQcmu-}S za_544w(*{_5?B?^BORLZeReA3ZSCxbsNY*@bb}!7$bH#n@pLv0e{9p2Y(38H&O^7| zoJdk1+utpp3^)vdR-?Q@cSv+e`zVJwT&AE*O$aD%q~$9{83 z&#^v9oI<^Yd1}Ro41{wgTsa88OIS=V+XvhL$%{|6EqYr0wI8bs2xX9SzzeJAeH&9j7`ZN9C$F~s_>@c_EE9ka*F83&99yI?-86a14O+cG{#c-)oL zdzZhfJaORW2!!L;hV9&p-oU_^_b2iP><76r*xJ1f=&y(H&>rMB!TZr^(#!SDc? zb2wkP1TY_G2+wN}R42b9z6%!hDee!FpKUns1-!z;>>09|B>5B8+FR6Djg5oy9JQI- zcf;;DlPuCO_FtCn{lG>RnSYBPo)M4TnF2k|?)btdZZC!Cw`?HZC-{Z=d--G5Sbj)+ z8L{9%>~(Y9soaseHr&Z`4;Wa+&X&Q>!5eGiB(t)S@Enbg278xorR<-x&sT1-yLw%b z*xv)l?~cWNOCKp=av$K|cH12Hl2sN8{rmPrRZdSs04j@jZC zFk4nw426pxyjcUo>faf5*JHbzw%Vi)`59v09FvhQLwg(Q)vFjeXMmDMMn=Sky8~#m zC6{v9uw)=@i(%n>1#aIjx4aNHcGA)lW5FKnHs;4Hvri0QVc_~(@&wcic6 zS~knT+<|1AnX|%D7y009Hs!J<8I~7i-LsxJBxHBQPdu+~Nb$=a1dYr7+HboO^T4+* zT7E`KZMb_bk{J^Io zZdr5XsJ8uFY!UrQlLw?9jBY^M`n&RW$0u@EEpK3vge8wsU(_RKIU}63Lp8e_AK9CK zwtr;1b&qw0jOB@b+vB{k5%jn6-;=T62?k}6kvDB}7sFP!l0PG5@ou{VyC2y?66EXP z*2a6goNZ;6x0i0l9Ba!xOFJ~=Jw&8xUtL{37=^A)F?SpI{LkaZ_ z_IK0?cOj2*KO=Xo&)FrTh1{AFE#;8A-v#acg!L(s_aMn+3~pqo<=S7YgyTQmp!a7d zxF2k18}(ur!bhU{M;Q}4mbwuW0)JJ`=qXFU_l zo4a~;GBBK5u|R>BU9|gRINZoGHSR(qcEEkeazqC5d&ta|Jibr#1vlV+IyaxG+0Ek%sJJ5T%W@f(N3-gupT+ip7T9%NC0Q4zSLcr~s*b@WPV*<|j z2G?%o*)aFvH^ImsZ0wwgnSVDuTXA;J$#8Z<+bJb^8eBHWPp1MQ8oF%rl>X4llaXqjhn$Ot~!`2>TO1U5-emSmroe%&u#+=sYK zy^_7KEDev%!;I+CZ?&#Z%m|K=`jFdoh2E_(?THp`JzRv8l)2%S5E2H{EdEHe`)QV& zvKPjlr~3_blPU5i-Npt^2*Yi?mkwDCWN;uCS=^h_*5hE!wl{o}k%SiX+s`E@Z7lq{ zw4dX{3o$ZJ4BARS%z-_BA7@4d6YeoK?2R0GRe)Ch4$iKmgK8qbh`#sgZAgo44+W`Tg-!QJ_Dld+x<@L35P8owpx>% zmKfQcyXgbfs`eNhm&i|2vU9iA)pkEi417iQuuFUKi9ao75x$=U$a}kbwmtP9-1B3` z+I_T?`E8b2VeM%5ezN(ooVzybW4F6<;g&YV_$3ZDj<;Sx(2*phON@_CQNEITw~{vD zHTMyYAuIYMKQ4Yq=MPdoOFd6KK>I6d$cyZs>v-xMiq@R=hu_2Ivnah1`s8zxM-?CR({z)NwU&YbjsW`pKc0&!L@=Kr+K)eOqcpcE82k_<(a1@~@;`Ph>2mThnaYnX-u)Nm=RP(>wRF#_?4&+56>_mmy|39?mwt@-Qu7d z@{G4j*kfHULMBsZguCm!5mF(%?5y+cD)7TD-w~=fKl>A}WIGAqV+M}u6JL~aC$MqQd4!E3z`AZv=F<0ppbs2F7XgfzFMvWVUAOg@Pr5bo)B`7%Y zDDx_uFdGTM2nv`S2}0YLBJf3x6)V!{T&noUxX@bLsYK(k%}h@SX^B0G{-zq91%9Pf zd(igWW(z%#w=YCPh+D+9Y9TOPuuCXD(uS!c8U;aRNEF-dnRfuxk&V9XxlGh{QBvAXbS>x5*Cz`Xl3C zfhv;V!W9$J1P=cIs#jL-?5rLWKgp=|(7svfmeNE@UqTI9`Vz(lC@lx9{KrADywd9r! zM0FvYkjOd+?^v> zJi?>1^$i(egAUY{38o}vaw|~ln1nAg5jdKuWlRZJ`z7^+XoBu63z!j>d9^PZluL0G zH?x?|u`Ma9gA%S{>fr^{0NX5FEZhWJ#1s;p64khxHP3RMuQAYjI zqz+_a_+^D=8f)SMqEmuWpa8?X;ZvV)6_y^k9!9*y{z%suOoZZMvmRJ-@ z24e;zwl$!esDTZsBQ{;!tkmE9?QdDY|->sDkAj#iK-t5|)*lhN9m@JHo_tvFci1 z%j%rN2IN?ia5w=hdU8r~t$?e4F?5YJ2!Ai+gtwR(v5FZKfNQr6x?#g zCI)iLk}R;;f7b!b4MRoT3(TYy#5yd6UdY<0Xl07&VMK^7SM?sE{Gf--=`1hx2<(Lv z38iIqQ5Y{DNd+xngIlhB;VE%IzQkh7VQsm@s@L4860luH$IhWyA4epr(Wt0G4P=E6 zmeCco7wk&8A%{lb=iS#e7{I54cVq>V<}?cpBS|aNHj>$PlWo*RR_@{)Gtn{?h|)!| zgUl-xz?5`AR-r?xmgWSRRfx>2Wa|ayn7knx-B~VBdJyb5sd+>79WA_>c+?AAL53ln z2F6cWL5xBMmJL<5*$wIOa-O_L)LEw@d6wG^7b@w6T*frQ$Wb;2088!ypb(;}r&&Nn zR`VNjrJ9Kvv#Dgsd4eS|mlAc~S_99#DyC2wUUSSKp_F-oQI;S*l*&7E z%2d=>q3sGSXq4BG82IrsU7biXW6CMPcwz%75D{og#Y+K90B}ojEpkB(N+1eWmVhxU zqUCOXF`^PL=PeMWIl+<_+9oL$&2<&bPjo#D#9PBI3g$Gh&{a&yOeCv%5qHrU*5jtH za>!$dsc6Gyi1AbM>fk}ClP!EPa+7MpF1tZt;s{zBZC`>tceNrhZ1E{;6zU$lr;gH& zSj3>({KNN*MOBUw>2VT=1;B8@h6h2Obwd%L4s}~88yc@6EVSNBmkLaTxwmjplZGyB z_le;jSxJ&EX(bnwij-D^#2yF2J9I2vCK$e1byfXJ=wQ4?DwLEQLs4Fd#u$WcV5aN* zC_4_b6_CNm`Qj^!$V`dmBy@XB`}l`faqn?bD;gbPm1^&hzl=@wzDS1U!^EM~9n3RN zSV-u|Oey=+beP*o33fv2eSPD=N2``uc0KG! zJCse_DB?0{h%L6+))*`su010LnQo9|mee2^vW@y&%Vj{gHHehJHw@{FZLcYm6QnK# z4mW)JMAv8`OXh3_+n8-vf@*|Qy}4ckm`bHG3%AU&2f+z!UQB7VeL-^ehKsYzOS5RP z0OIV-q%E5@LFJB?8w<|@y&VFB)BHHb>Bsm2l#PvC1OuR`{9-VQBVaY{0Je`N<*j7L zykN{&n1x3343xCcVV{PE{o}~`Z|o~x+xslT=)bVFOuSe2Qy!9xc+}XxxSM9ipHDDu zSE6Z?-dbu7k&D5XFjEvX(HvxHTfo2~fbA}dfn=z-98{KFO5WBqn`wrxFSNR=U_444 zTs%`7G=G$olGO%TX&u){^;B@C;73scu@G5Qi%^eeg)>($888Dx5`RcMMo}SKY9ouf z8CyatXEBKB=Byjl!7U=mR7PA32ure!5wSNMzg=Yl3_I^B01QKX!;HYXiVp1C+Glno zv7#aaDR$fl;^NXl$pKp_qQwo%oD}wf8%NSHK`o&n3Kyls zZ#*$(7s@AyRK|Vd&3+j}lj17uu1=i9ufk;*Zl=y{juwLja(v5r&c<4-i?Wd(vl&AE zk*fayQEV(DoA`|~U`)WiC@{6@QDs{)^@{TQ%jZBmumD++d4KXHw8xm3t1W`yNVa)u zQXSiQ)Ir(LS(dBjUoy*GQ(ozk@hfn!>s1)W1JV}K;=^ZfJi*{pb1K7?!5qO%KM`kj z=>(ObUeK#?iHHX+N_k)n5mOCDasgxtHZ0Tc0Bjju+buK?v|Aq}*nFYTF*k&+39cz@Lv`?`LkDKh$fBL-=cguSHi`$CJqGc8|%Z|Q`B z{ipRa_xD1ogfB1LN~HmpIP(nD-BMs-T@nDRcM42kdZHzv>Pj;EU&vV>NrfLLlauW@RUWiug`S$i;bSWM0(gJz%o9LjH*0Ri#)Wt+Z){FDZ4o0qGAmP-^qm{dt$#rx>_uDE%T=v(&=M)NU7 zz5f6-L?D2oWxlhfA607hhCyc9`b!J;Ec+#;w>1+-s2|fYwG6E z9GnnG6hTeYcivoTN&~t#HfC5g$eSUfl&BeFWEc6=L3Mptue7HX`@d`^8z>EaAbfe7 zR^NEQ#PvV8#lx_DEATxLZYHHD%FOeqz8~B1O7-wpZ-S!feTt^9Mw|!|E|t<}vjibKdGI4}ph;4x2LaqaStKagl52BZV?Bjh&!iAda2boW%%0c#klrZzomyxYYuuu5Hmq5-YIXJTQb6I zdnK%oc!;eY%kme0h}HMGKP;_9#Hj=%a{mB`nw9t#APuO?*WNmv3tv&>W1|P^ zT($Bf$p=EEj2?&X3rOP0^(vVdZEJla?Zb@fWYOSZCY}sGQE|N5E-N)f1S{2xX(h2n zA=rJNh6l^S!4F)(m<_GB&D2C!CkRaBgA+bI!X`Hw4(MgEyU8+u>da*L!t zuplt@2p!#IeMYDrgX(5dw@N=zn4_`&Op+T~8Bs)0uD_V4kIU{;c*4X~7 zSx9g$>&z-!+RG6~yda;#piCW#t?$0^78y3Ba+a=oDiN_b|Y*tcJpCvJ9I`3^!Y)`0d^ot6^(044vEg*eCx?~@s2^M5- z$;oz5=>o186^B~rLMjwTW*h1p27eOLQZ^84zh0tC4&{j;3aihuM8XbJ`vSAd!8Q@t zgIJ#lhO^*4qT9>`L<$yIOuo@q<`1cGJ*;2iccoaP;t`C<&0IJ)8qA=v$2A30-?;on zTdW0D`iu%JOp>G6Wkb4AW9BW)$nwH>jhh$5uquPz707X_j4`+@SN{MV<%&b3Dk6lgNqdPKfh|*7M=Xi7uw%ru z5*iDrSaL+C?pP%3VrDvh;Rw^zuGww4#k5PLwW`dkBpDLyvP9e^=d8u9)J&BEq}Z!b zmci^`QjwXkFi^$Aa$Jo|fn;kMg6Q%G4kqg|!Lp^0E{s5-35`S*0S)4@9V0?&tN#FH z$Ou$KbHzfziYq`~V?an$1D;r4bx8CWi;XQj z5hCn(K|$LTMAI9J1k9}#d;37TCh~ru1LQuUS5J__mxmPlm5{wg{@~sQ2>w9qw*v~E zs|sc|NZAWdxffjv1QIF$w4wdRD;1DO8Xj`LQ4Kv(lq{4gBixj^4^th$bu0B6p$3O8 zHK_IhEGrmWCPMKPX=)3j5N}A@*HNI*En>(BfLoP-3a*97Fh!}nvdcjxl>Ep8MMaeY z5n%0)>tSEi1&Z{#erjf$+7IkScSlmc68`{t zC+&+Ao<*Oiwp4E``hi^?=TiA0WE?((ZH^T{q_CLffQqzOBhB>~1OV#HWrFh>;`yim zcR+~0SgUM32*_sFYlt&AUr4u?5TTX<6`@Gzl=vAz-9@x-pjH8@VR~Q74%5^O-@LL^ z>nY>q7pVLAag01 zfS72#YAEo!hag^|p`GERg=f<_Pi#a80g|Q-qdbuq&Vn#*oGBR>>Y8fkmNBzRrfsoe zu@+$lpNJD5qgX)IOH>q9hmS}aC=0V2Xqp7kQMrt|Lz|UYuF+a8I!O0F2*Xi2tO$Et z3=sgd;Bv}3w@C2FR-58 zFiIda$4|VzcTsxufk&|SN?`0D0Kiay#;O*ShQ9`UkfgXaO3u(J5*pTpABd*S>oSa7 z0l;}hF~Y{Ij2(EuX?Tsb_=p=}sS+3i0JOlu(7FJJ-{J!O>KNYWTKlLP6m{p?Rkbsl zEcGThlX*U+y=~25@ez?Y3M^Arewax|=KjSKt*DmhdmpG6$-&=Vn}J}ustLCGL`to= zexO3E;}6uPtN_!5zR=V*%|EQ92-s2kXT$OXTK<*xL~k#ppSC?_1SouuiMBpR=!Gyq z0>6S0RI-Bq0Cf%0R;8SFY7u8JQ~S8plrqI!L4q-K++!rV$qEhoCObyP*xyyCX9Q)2 z9I$H(Gt=;S2a*fk>RLPw^~svkTsA$KTx%R(Q8v0O+?xkwgvVe-h9T~ zvMcPuwHPhMrXnC|q6G`u6Z507u1fTx5T|L22mT=f5+aFQ4NCqvTH4-q6I9BpHxY$x zVd%_eG_)&1`Xwr5;!_37Ek;u_BI3e%1gc{JIr2P3GWMz{Eq$U5S|dSJY1#yLe-RLd zpbkA_MaKaCK?$A&TsB`+u|iZ*ELiZ0yn`Ci=$3O(6S3%vER<>iM87KE#95)NO0RgX zLo~NgVB@k~Bodp?LSFNbbl0|H;%)(_*~~QZLO`nqSRgo0Lki)2QHn1kGpjqR9Kks) zheETLnP}~S&+fA&rwff8mX^is{HPM!)XM-Z?`$l{_kiph)*uGFV-c`4Cf+<5jW~(M zb<9^+RdjUx#-VMjz?HVFBlQeYDmrVwSat8g8m~qavFJ*QUWr?@xV{D>sF?)|646v( z?fu|xv8ipq(XP=IyIbG9#KBHPyY(QoM$I9YG-)rDM%Y{<3IJUVD|0SmU|qgq>oCz_ zh;orl;x9Ef5zWBeJ&5nN#}6|14Yg{c&{u$}ePR?wOL&SW>c$~NY(P-3HZ-bEkc4x4 zYqX$8ShV#y9*}`h2s+gDF%_Nkl@|-ya>$J)xsO;Zj?n%@DUpT@pxs!w^fI!l+e*K<-i%rs`IhKvDRuK4Du2VQOHUK`5U*Mfv|bo2 zH?MhgnUGdJVq0X(oC%JKl5NTkkHR9dKG1g0iD9Ds;?^B1VgL|qJ3XLFzQw=|Sg1tT zrLC4}s{u#giK;u7Y(txux)a(m-k>853bqNKF=EbTu`m#4`7SpYn8-?JBX_6Y^4Xh8qnZp zP-RC&7wi(njse<{9XeOR5yRRBDmzzXye-Dv`Y@zbaPe!?iD<)Zi4%~WlFvm!u{)+=aFma6YlC zQpIc!{g?j$M(@l8)T*`2OXlszq`KFZ6Obaud5E@b!y*~e8i0f&AhX0UEsJ^PR%x}4 zr-&C;V#CdU>{}wX^AYDcbP}nJR<0zcZ*V0mIPXOgjp29O8@u_1(fqLnd;=bk!UclO z+t^Du_J)yc)#9R{?;vO1Ip>%9l^&#d3lhRmyqm{pj;T-F(h2O1S9(F-?{Cxqe2Q+! z3Bg&zuMq>9H+UZ~zc-P1CBRf27_9}M(pKeQLcQc77DyF#a}hUj5Wvh^UL?eNvar>s ztf+?JZ4VJYOIZssFQ}E|dk}_&&oavs1Bh_3mME4!M@T~UdPJpGV;PrJT^2^l529w4 z&>3b6>76g6vNhOfrgk2K*g1{>=yKlKIm`{X3lsY+tQuf7r4Y(pbs`a(Jc&kxw@B4# zfeKS+NYtZxfnJ2HMl`bN5EKM5UC7oTJb1$7BW;heOnN{>tAL2m3k}0o-IoMf7%byG z(d+C%m@=D_?xKZ0A^V9AjWVaf8(`o{fj8?*9|~k#K9GvI<+y+Vt=loG_EuRjT%cdO zD_1ux&lrFj^MVj2&I^kGMvXA102l2N3XN2ChZTOYuuj@o8o!=cRW8jtiCKKV+0W|c zF;8BmFwl6}`i86)1-Is+DLBV_Zc6!_J4JH(mkAdFn?`bCt0?!Bq?vVl{L0sAS_Z(_ zoJWuVA(W=y#02idwv5!eWS$tMwlY_-gD?-nRxu%x64yn0K}^)bxQ*v6FRy4ti~tLn zdmPXKgUHPN#f!Ky0^RtAuRH>wtSjaaF5qUp(N0vAb9vgtSK}i~(WI%FPC!L42hw2n z44}m>-q01Rt7&Sshi2-$ZLDneaw+~BD;9Ba}X(cAU$EU z(ZQHCAzK(Q-NpUPA#yOrh^~_d6`4hgw4!O-aJK8Tm1tI%R}4thto~*$?xKTdsw=?_ zL0uk^7W=Sev2P~7adA_iNE_ye{6ey=D!-WZ1+IX>lushje=xI?8r$y@PzM8XEXZ0* z%nOOQV2*w97D4F1d@%m@D%BG-n1(3|O?+n9=+4Dw=2ckRFn%C4kYcC>0TovGMwx>m zYF(lAROT;{7)dcJGBFE*CJZbziw$Op18mf#vY>84g47`PposdcWj$C|BtV8L{QAt0 zO0c{~UD^sj8Xsu#P#rrkj9YD%W36{0T-0r^xPluvZXT<34g5AMMEdav0vTX1 z6G0BLxxGX|PpCo)J`s(OW~G`Ap(PpQE10C+W28Z7_dcWT%J)+t#)y8x0$=Q(QNpS% zM*brbo!6n2ENCyM5h{*n8TZWIu4sb_l`Y;`x5`#0j9<7Be{%l-vjaJ(`zBJ|$wvJp z`bU8efqP0{(G3d?Vgx$DTZWA$IDiJtxJMzK6$lm%DlnPOS~2Y!E7YlzFN!Bu^b)4* z_z)rV;*7#qEU3}scDU1cr z>LeJPh(%+9zTsOlDi!cBBNmyeqFAkO%l`mWsL(nj!Tf^eU0Z7AA;hyV&5+%j^&tXS z7m^CpLloRyDcNK~QAPnG7e-H6Wsl6WkIE{W@VOf26E`axY?_X) z>LY)fj~3cFpNULTShdHi8ee1&>L3NUIK)?^#A>}@?HsXo*CA zGXbR(W^UIN4O~T=+Z@pPgaIm|ILjF|cL6TtD_>+KN{h(FMPJNq#+_nKg!P0JSf<5- z3LGPrJoSuAoe`D_fr(SXSfkj&>h~(!ULlc|?-1+B51J{FgTh6(Q)d4BL`qA5Tj>_J zb;=S#(`Smf7B-CamS6yF+7vEa>zGU8f!}ck1rb%AVAlS&>Rc~6bt~|*CvwZciLTM5 zYhtOYlrp6aA@2ortX9hRiw(0d9EJK#C<7uvMrs=52nqn|LIGQh$UI8IfSW0pP}o7O zv%eRnLuA{x+CNv_C^2$a)CNp*HwoDLY_5i&6x1Q51zV&K$k1nUx7+b8UXUknr~`a-Uw7Fk}B)vrpDSjEolKQXhihE}t~ zQ!r|U1MLbELrp3XCa){d#;PdG)=?^%M=LE=zS6GDu%!D&t^6f+R4py9M5Ri@qZE`k z(Tgg>(S_1_7+6sZ%@De)4k|8Jx&Tf|Nl*c9s@8ayO$LSyKtNI2+!4zK8`BQ38;0xt zVamW+g=ebHGb)b>LudxU=Md1=-BA;;ok5BMm?2sx0#Mme zTAJvMG>}7>qoM5z^gwhVF98blN;nThKxU?HX^0EIL?x&a%7BO(G-wO9W}aa%S21Xu zA*JssF~a7TsTKmIaSk!W$whDsM1|c=1h%f3A~K@j78@m)&4h<;U`4KM!R@%b+=XxR z6Hp%r#Is{^p%HAjNF@g|sM3!GQ}r6?U|IY{lamr9m3k$iQyh@QX-<*c4v1Tq(l!%P zr7-%g_a55@61ovnX$88+N`V}4G%?Y)TRDK>fJbQy4F_@J1!=6lBImjWE&-{Obg6og zLY^Y4WT**nJ7y-GBZx?e=z)i#3OJ6c&?U|aLA864yBRET1hLc|WgOep#qsY3OJ^dG zucB_i{mQZ3oe#7PW)V?8*?Ufg-i9@f2J5t;h0#<}yNaXUVNl(&g}dmKRear;0Z@YI2nug$(q^fC z!}(%Oqc$j&(zkn$%T?x++FS72DY#&R*oSJ1nq@=0#%uV8Cu|KLXhlY>g-?r!RcBTD zl$6`m`iAKDzMM7XvvvUy7rxVpdCeL76Ko-glH((G4meIOpq=o2C{I(OB)Uo z+EXcH3l_T3hD*6=T36tSS4|NR6Jw*>F{OJ&zs*ObCc;v~j7PS0)l225pk@%=HV);5 zdm#b@-*_aVcubluGh6gVcW|yQ4)F`g4CQMGXJY_3U;%=6Md2Iaakm>d2B2Gnw`y5X zB#$R-w5qEqw!uQT0xs-gFYZ&YE-N=KieCtK>kWIrCY37DQBYbtO$V%U!^+mY%m(Kr zSG08HWP*q0ErXjRkWsWypucEUZ<#*gcH*JG)L}v#Ag_q#J`tB79a)dD^ZJ)_>K~|) zLj0nBYAT&hM<_K^qTN3cY2cr6V6EbaG}<>rt6(zS+bRk=mvXrSWmS*FT6&>J+^gnv zul`B^ZQ`S~h6%w=t&EFZ9w9fF1=(;>Pf{3W#t@6L#Y#!J z2kHO@=e*^b0ZaCWh0$ORBbiv}APuzaOX4ZkqXz^VqNA~YFt1r>adU{Zn80S`)B6Ov zApm=l;Y#YFSW?eWlq}dN%&;6_9m50-8-+w$%%zanE3eE*%RCmn<%J88sgSC@NHPjP znQkT7bS3@TuHQ(U(a1;YG>@bue9V&Qa1XS!NHa>TNGAhD!Y!@CQu=qPC#m^Q{z^96 zCNb?4g6!2sZQc}5)JRg9SWy8@qfMyMN}0UDrQZjX_m44p4g6wNTj&FE%VLU(YxB&% z-!Vt(Wr<*geZ=dk7^ymgogoW(!X#kHxL+6qbnKsgT}iX zeWe$Eq*{s7QJ&kfLbs<$Dzq@=1F;%VZT5gw+61T-_Vh7FJ?$#gY_vf9#ODqZWrzxiYQ{(JIaIs z6^kD-odjcK&z`cS%mqz~Wu(n_D1(`6AX897nM0Ud#2nNh;l#PesF}N9YARcCO?IiMdiBWe8Vy+vYg<&Vbm)t6cb7X2OE-tmW0iS}ZqHR;%7~Khq zJeTfYvH&f`(9+Hf`qaKHwicA_6zV>qKrTjbE&l-TiIherhAVQS+oL4m_KG)V-5T_{ zU~C!%`++EShS!-!9`deOSc^m7tgzEmhfx{?dab@?tW+jtpP89hQKx!dkXsJo5!zG9 zEG(Zyi0D1xa-T3O40T4BS{5SSC^hdk=>jrF>Xrxrd-Q!J6|EIlUG)}~Y%b-k$S_@0 z6$iL4?oyd92G$$qWjhtAAj7wNuh9%9|uxxK7AWM8qFXB`8 zwu9DV8t^bytPoY{BHU5vmFQ$L7P;Iz5X_SNmC8NHTa5963wm%#kpnN()A$9GEV{sXV8}wUGXY`s&f=f;CB_g z*R45$6>JA8fpdTnLxg{4Jth&(Jo#v)D_hd$u2gr7m208T;>;X zGdbD*deT0kwZvXE6I8-RTq5%*)Xb?2u~P%2Dgo#b&4GH!|Z>$UzzZ4_aM_MWv&J-2I4crGZ{O!U&1iY&ApUDv4tUjT? z<9#BY^40uJjFDTfiE4p+roJav(SMS&C*=J@oIXs&0hUW)ShSZ`)HsWMEx&OV9}ybS zT;PR0p->LzNxXaN5(SYmRn6kLhwh-IWTJQ6y^3lE^6~9$(Sn!c1h6{NX+rLHBHxT)8&656$@EfCSvDS3|V8pT3VRyQgRaEToewWybw zkc#V=D~X)LE&l+JXEiLC6Bnp*(Gjc>wGF>yruxA6jR<%AP4*j>YaW6M;IU^hBPknX zg=JyZ0BRXdB^OaMO4)doo^qgC*ATjV&d`~y5k?P~&U5aKATTMdOE>UF{{VOfEOs$h zg=R)a)({(c)!YiDpskMieNv0t?-E;|SzQEBuaW>Tfd~K_O2w<{ja(zg;vz$B?oavo1+rR zcer<;iW?9O<`6W)DToYAa~vXgM}OfadP-qlE_0?M#HD40dzh@s;kFI)GJOnUZ=FI> z-B^0XAW;UZa)*`yVCgpOfEa4Aqi{4rfGTZ!O~2xmr~||_(+B~1H5$4|+%KY1w#67O zGB(9RU7X8{S|Izzk1-b%#_*wrTnZ-!*vb6B2C0X7BE7&;*-9$O-6$}@)3hjCEd)Tr zEEl)~!vw7`z?Kgo6$qflsgWtwDRPkj2)hp~SOtV;T})bvYM^S_{z1`$j6l2@w5(t7 zS|P|zL4+AzP%1D=ipJSbd1b7`4QEi9Z@`ZAnL%jZKj9TA!OX?pWjMKECc}sgaT%kA zqBp5l>4^n!CGI15NloSUmsy48CS_>Eqr3{{C|dM?66M)zH4qo*TvxPZc$$i=ts=Lm zMQVoe3bA0baWul&OkLX z8og>I;v>T>wM;J3U{L@;ZLx`jQ|N;iPqZn+)TS5b@jB=yaZoM*H*o`k8nzMGg~&=? zh^Poey&x8ainv*su=^vx{6v%zO~{UYmi3pG-Us(_Xw1_Gew zTH<10qll_vTIO8JO!$@@MYoiq=2Of>i`k)8AYI)avke38O!$0~zYw^a~A033ipHuGd|ft%v;MF znYdQ$5t?^SeF!P9bXLWont+{bqB^Wu1j4d2RIV48e#oJ4Wtr5%89EdcATr$sn)f1# zTe5-m2U|_le@v{nwV3?GI>sp@Q*HHw<$5JOA44tG^i8uVSZ)Q?tl|aSz*O=vY}3V;}|kBM5z0OC+swi2i- zq72nQ=rcSK6wJejM9GD_mgJY(SnQk8D!CytHlrM0SlgWrBtnj&oy?V?Aong>2my#%&o(R}oOEjlhjMz-Z zm}Ypz8O$tdRN6if+6u?icGY=fD-&7hRJF&lz_Bu%J?ca91uNoEG=RR_kFRx#oAnue zbTAP71V>Z4s}SkR^%4}u)~@kEEut0!Dm4%}^df7YSwsoGgc^X=G)5~#EnZ=2`l1N< zyZeV#eMLWTif;ve<7IT^s7u}5mm~0n15`;f$s__eef>Nd23kpX4Tc^Fywo| zx%JYHUw#(kz8H?};ej>odPh|{D|H!FT;+yKF$&43R?7y?iHh6-;sdk;n}GC!rGlKp z4gA1BMChb5C?yqPD80&6tg`Vts#z&~#2sI}vW$-DTDg_x8#8cmUa3b(d4a^h$q`cI z4=GOSG@L`yr%;b+mtLU)kC0wi9!iFVF2-aNg7*wfG1e^C-dZqy<=F?i65=6EzOjOz z$~~rD^G)u`ocT<8{{Z3Q7bX7y9Uxk5HvSedi38ikyY75-LMW1tJrhel3Bu%(cs zt0FcGN1A&~oqi#hua;tRrVBq(u*DWtaVi~?KtNbDKr2#<6joV5!oxt^E6H^(S#O~m zRT$`fMD_a-P}|T#-LGPDD=xTp^qs zOtUNm+EWX4WF@7q6Cet1=W#D_Pz%-y;lyUNFvq#xA}M{LWUrx#5j#;3g?))sQNDx^ z`64tu1Xi}*0vs}mVxS;ADKIgW%xa@c%+qY*vmTQC&nb}->IHWSJAI*d4js(h)XTDO z#I%;dr#Be$GgM5+gUJ~fZYtwTV%fm}@9at+p(!fx=todqf+0(I2+4?WFSUBd4NQze z1a97v<~?SSC4?x2O~YKAL{)N_vodutK|IB*hr%3>q+Gm+fOGhbrdG(FS^C(Jv z;Rk0}7K-l5tsKmKCS6X{x?*(k0-c|EK|yCpVn6#Z+QdzK#!-4dh-+rjg*Jeji0ejz z^hFhFRd91D0|X2wWN-~r0&ZXw1}0!`!eGcoMFDU#z=blN@!1RO2T1~=wmL@re8D&S zjuNL(B~%ZXy`M7$q+_aCqa7p}RDPwb-VWv|S|&A|?55yvva2Im7PE+S2lBS8#x%w(;eU@R}* zIK=l$clAYc`;SF3e~3YQzPDhq&` z=?pgvw=Nv>3Y&N!X}|1%iCv~>f_eV{4ApQ6xlkA&Y7wFe^EELHRC)+dh_-Ktf(vC1 zgt4Z`VuG<{e-SRO65`?#j=;eNU57}mSMxIMJrGxTQCvhy1@w$Gq*%EwH3)L=4A8xV zVXI?$%Pdy+6*-p)dxEYOAhmcS94sB9Zl;-bK-J)^{Y108L<1xMwlu^7H!%qr;^L^# z=Aup*&_)=jVuoaw5Oaj8teGl@h-%uYL726~rD3Us5s5CN)1(0-%x2dT_X@JZ!V>q- zNpiR(3N;IH=_v>rjYQ=veqmg|{l-DwUYCF1D@4dx3zw?+q?T9WTb5h_!WS`=w=t?y zcqIgyADL!RD^*18e9M~ol-QI*ppR-8IqwC?nSo@vl6%iGR??8Q*#bnwqn={t?G}_I zslx&ndL__Zg)SXc0&5EohkY?xZ!*{9M!EymTd#UO7pc|&3y2VJg_t>KQIu7+;TV$K zMv6F4ddCb<+y*T7fij*h zR4_WF+RUZdf&Ifq)2Rt?Zcr+qjWrk54<^k5?@_Lbr=E3NgU-Gm#7P>COu%eP-IBL) z6sLkPmy$rH47It`S=PdueUhyPPLb(s1Kw_yRAqzhGagta+-lrpCe6%(@-P51eWpT_ zscIKt#2bcSaW5};xqPrRdq!r^myxU7z5p0f%nf@brh91e#dAlJ99oF7ES6mcEw*H_ zit<55SQAac?Hb2vac+e$Juj5hW8oPy>Qs2Q;@!l!KI}(76^jzwH&Z*8!5-4*r}hvC z;i~@1PJO?z39qC36lMilUc_3e{Y`Ae({K-Hr05=mNufj%wv4I>ZsRR{P(hr<+_ALv zfG8I5j#Uc4t8QuyUG*7DSv^u9Ag&g%K-?_A2moSAu2ZUKhh%N>9&fk~B9=E8e&r&A zNB$y~cS11+PeL|>gCxkY++bxf0=QDMY*o#IS_>>nuGAOv4us!GqzVmoicE^D-^Fh+SNKwcvvb?pOpy0O6PLMA^tTQ{|LK3>cL5jbCRq4}#pK%u;V?ROboj z?NFwWP*eMfZeg-lk~|{C!km*GA=(P>ao8zIQs#!N#&+_TVPav`1kk=Bn5PeJ0d_@* zD5g1MnNivcT>C?kID=8ur+K+d4@3z@t?wGHhzW#fhbpR%Y-U*zX#?URA2vf!1=U(K zu`CW4Bj>bf>xUk24&Kqvhp0B@ThFIrr~a8X=PMx z^2!_nHZ-L$q3E0a!9W%9RZerXk zttJq5!6x~m{c|aCy!$XP_)<1i$}MjUzj3JfLj}iEV>6zkRqw_Z~Ik>I$NXRIN)1&c6R3=xDp zr7Qq;pAb{$L3LTM{F(qsrq4+3N?B8jFx!359Zxzfm zo#qu#t}^}0Cp=~S$D6Rt5{n8t4)9(9y#&dj{(}=`R3fxmynjFVxr76l9EuRRjLPdd z#46*|5~h=*t{^@ca684IdrO?o3Q0j4SlEGuRi5#dE0YJ9vt7m^?dm9eGc4a~ugtQ! za6*I~W^z@2ArwI7oa4lxV>XY}G6N~HA1oRHx7I!TYYl7GGNFS4kqbr&uLQjpL!%Ov za)rRLTZjpjgJhtwcPN?=F_#k=S860pBW=ui_Y;fsBGvCgR8&!9ON4!Urptp|=UDrj zOX$>HxL%)eQtXcqCfp%I5w#BiO8mvAwPaW{%PNae?ClCTy8_(5XxQRetr>9(s(KKl z7i#6Hb#!~fMpI8@8tRw{R{{TZ75E_=^Sm&?b{{Sn9+Q5H=%DR?Hc$MG$ z3u3iUrn@;tK?W~1HJk>B3Hl(8{w57y#3U{IL8qEh;c|XsLeGfXhf$>ti3>i^AwbaP z*kBU|ZNU;fv_!9%S}Vzzs4m1P7h;%&SL-^2W_Q)BdB(*GiA4h6bhIN^G>M?}0XF~^ zlQ5QD#V{pTwQTfY%A5gezGEFZ4DA>U_R+GSP|-|IaACh%FA4*_2J_nYbWlY?~r} z3o5fdV>E@R9K^K#WqDY^w`pm?msk_f4SK=V7d<6L$(zIAAkn{{WBzty)dK@{!gpF@Ez=(d?FX_aLqMq#Lyt z3OV4cA=;t2kAT6#I{*xnZ`vxEbCJFx9wwdU7O1l&;wGD@N9{)fP(;h53a-ZbK-W>1&n?X2IY80EJnCU_)u|{E#iU)gS!=Wz$ElBeGJy$NvC=Uy?C@ zHK>+$Tjo^ht4eTfbV9%zE(l)72Qq>r$SAh`z&09*SQBL(4q{FSmaH<84}hkh5h&h8 z#QBL{Y!qkNfIaxW&amay$Z_T>uS77o_*mlp7Ji;EvY$|i6o%=C^&-K4Fk=j&FVhNL z32Q%@h>oGZsabD1G5Usx4-S7&m2jZZ`6JMFWitCq&|%1B^{7`Mc`N*tDy^#iKn7Bj zv+*vRZkki`FW8!}KXGiL2sVp3gL9L!EZOa{tRCA3zpWq|RoN@`7UpW43yMY4v-l!F zyji?$l`KY<1wh7xP&04@8?*&Qc1Oz^sjq2Nma-BrC<3S&L|{VzrSB6->>~*qf>oXB zI_m?j(^5lR<{`njk9f#q$5g9{)Bbr&X5~Vq#cY_f2}=Z*cvYiqLXA8`&-e*n5rk|% z_<2f(IDxen>Hv<50+0TgeIy8Cg1TB}bN;-K5~nmZ7_r+aoNrL@^_GT?vifWTm4Lb~ z0q4>-wb+3!i}#9*sugsj4Q(}xrc;SnJ|#DkEAT3R#XVcq3~1Qju5;-C>0F`5O3?Xzqlqk?dhAA>53$f>#&0UN3?p z^)Py)7q7%n58krk2YIJZAx$n_PX_ec9|>QsF-u7bp{DG+mOyiqM;u{T$G<{cKkMv|0y2pE*f0}z9`QRd_F*}_?5R0nPs z>MMu4{gG%i4P!8cP5Q^&6I9Vh+&GcRK)q$RdHP|S!$*P=6OqCE_DRBJ3&;Xn!Tlk#8UqNfjSq&8%yAi0eZIg zg*x&yH`8%C{edz5nxG0k3rS_8JC*i_JS8Eu(1Fg3`amTp$%1b>nv{If?iNkBdNTP zt|65*sGZ>jxN{7f7dxo#dVhh4X9NvzNM;fvLXK(x_luvng*!4_8$`nJiLUt&zlmw- zt1IXn4fhC77I&Uo{Y1`YDtSvBzVV@6MgSHY7UcJY)rvlI%oyvHW-gn&RBnmr{{VnL zz;B3{aPZ58SW+2vC^!f-IjP6pkX{p~bY+TIS>>p+ub5LL^@QE9RtJ*?KzALb^H*?L zN32spPDUb{uelX6eaVOR5J;ibhzkHv##mUEURssxed7*C)fzOgY3VMjQkLc-sh*MI zqC&%GLkLxO-H5nYBsI{etP?_|#@H$51z^Mi?lL;u3lk&?O7mC`c%iu+{$PT40b=)J zPz6M6WvTKWX7<8va$n5FFCtb(%(qcUpjA_bA#;Q!hpR5gnhUyzz&@#Nhu`}(9^|Xw z;8yNcX_16S;_}EeeerFzKY&Zaf4i0V{o#KT)J` zth=K5nN?RZsob!~_(h{^dZ-kZXEw23OJKDFreJDwB~(Pamz{s`W-!9NxRmbWS&vv` z8>GV+I-80rwV_ckgV5Z%sCZ!Js%HB|U&Ktor)I6F!DC$l-?RxvN@}a#4Vi+N$BBQR zN%bjczoY6>UHi|dw=cZSen9K$$-h-oFuf55xh9UE!C2I7Cj% z;6X}$8CJc#x&3hJdSymHM4?ftMA1t`OjSlQ`->P4C){aqdad^{(!7dw6pVTVrPK@K zmM13_P0fRta2OW^#B9cdaYmd&_|DO45{VW>U(B^(>V3i%pCj&9lzvaRy?}Nvxo$2( zOVhU0g3qT!TzqnzhvHV+C$y%oRSqYZR^!{sgtP5CuX0<;^-J2fys#48^#v~CrjyZ$ z)>g<$TKNbjp79tfL%H=boCH~~Xfz_BN?JOSsOS{i_K#fU8>iWd3ZBi!9<5|y;Nk<& zxH!CxK#dNA18J*6`-GwK8b2gk9U{-Dv0Gx;ViaLUmz-2fXD(i4%^b|t1BmDX2P%sa z?bY6+7j2QcI!dHD=PyU%WlR90k6MVBr?dQDALbX$5cP!+lsJEzO~f?%ChziYRH`akyzi|FQ6{${pO3@CSx%VSj*0lmJ=+?>t&FVC}Lc0|WSn@FecMNAvu)7-x;Pr+{ z%eTx`t7+Aia!LTg4q*d^y&*yyGU_!bpkomo%f2O!V#a1mu!>v7ig|jxM>0CFUII;t+8 z5gbXt;#EubL9mVlTj&;zX_geE6{=tjLYit7N7QWjj~u0A`50uOqh+-5n3c`!U)dKR zwbOO;FQ?ei@f5PYP0eC)Px$Ie;0r0vANd6V_LVj@8Fz7n1sVX`0a1;sX?)j?@fs|_ z!Ra2hu?{e7e}k5-lZ5U?qoo~>h!M~FAnjW|C5ToBhd=!*y!C@f%C&BT`x4c+{1dVS zLxJU&w4_tUAavXTkSnVM#JWEv$BXBMY@R#KwFPJ%ol$Gj~kYh2g+p z4#ywmT-X~a?f#CjW(kPw-UYn%h>cVJZJ5JYnm931ll^mF;nJmiGzyTe_yN*bM0_S0 zoee|ss_NiG6QUFlK=&oYfLeHBIJmkL`l&00u1eb~8I8L4gw}l{@S!EBgAAM&ea001 zQ1(;aCBgEC5PF}elK}U9OWXtAS;3FM`X#ZQ3f!}o)}0pJ7}xVKLth&w+$N!WEABLg z&C&M`B0Z0}QIY6AP;6CD@E`eWgSbLLk2} zg9zr_N3XM!?jYgzh)Vhc}9a2By-6qXccrE!zkFW z)pW4Fd_{;Wp;1-3gh4G_Lbf&o#o7M=z-peM<}SqY-T3ANX%eMhBtkp@JcbqZPWp(AzufNSf%0)nt&({L>A6`CEH7BjUCB%_-?{g(^V)hH3rr7Wo(Y)5L@Y= za{7m~AlZDF+#Sjm-;5Ea32YIS{{T|Y543BMJdC8TUX7%l#EsDN2;Q^RidE#y=4e#g z<~Kl?voK{o*(_2$0$5nyz<*I(q*!$LiEQlF$FwuB)r4L5DkW4AzgbJe32{nh5=F`> zW+TiyNx%X5nR&UE9@5J)RbyA;F_jFgeMYqO5Tx`08^!z|Q!(P;IzZN6Asq9txpU}7 zV}rU#MHJx?65ZIfnJIpZu~zP;8vFqIkqYS;CQBQrKx5ibOg^Z}>hlCP`*I+l;Je%p z4>p+Um`%GjJRY)X#E@G9ci2weVx0lrR<=>;jeO=cDHA*|KnEhi4slz2bVqihlO zd>N=q5|CBU7RsFt1rIZEG7HeEmRKe+V8FekI|y7C>-8wD&VS1~MjU(>xoCj9pB0&8 zh;-8$DZ4o2>#0;m* zVJ!f(DKV@<;*P}|VwCFr#>M%D#8#HO824qjoKd{XjGVTYpH__RBBihi-$1@?7&_ z{{XPY$*f{#z+Wfa3aFurI(dPWZgoE8Cw5@Rv>LZK5+j|!R(%OnMZxOv2Df1aJ5 z*a9RL9bJB<2oE}#X~vEQ7E;~w5Mg}*LJ__0NTZ~cbBW5YFfIDiG8gkvs(oc;wg$;q z_k>v3V6Ta0=kSAd?J=F`B(+lCC@8Q%DqGly2nMbDkAln!$IQXjhf8(dA086od{pXh zfiU@oBsf2qsSA3c`i-q?Ykf@V3O0_m;U}$cC(sURd@dYil1H7Pai639+Z{&6w8W*4bzn)JqE z0k#@Vp0HeI8CqQG3{t>A9E#K-Z-51iuWhJTqz|KV+0FTfE%3!eI8McVLz4Gf^)NF) z>R!;+F35c4b9#YX`(;dgN+$~^4zi*L0*~BmEeYpP_LaL>_lP7~%>($2D#wKSjt>@l zLKV)cg%qWSZ&V@5E;3h_f!agIhM&Uzo^%8BD}C zo2CHHV+JAg75J$Bu-0H#sLEm@$f{SlM9UKCKK%(+c`w=XSp82LeTt3e7}6bpx^NmMwTK=z8+pSZ<#Fk**AF0W7q z_QAhQOuZP25 zaTCbkneLX`pGaEnvk%EH5IbWY2Bt^`@zOmE44!HMFLWD#D)KHRzc`wf7LEiAw=51$ zV5p38oG<}Z7z1+s48`U6fEx7|e(|7_3*2s{*tdT(D}cx>za(a>W^tpe0DXarVNn}s zs8IAIVGtbL-)u@hc)gzyQ4mmiN@#-duNs>{7)7Vj6rCkO`G>m@iyvuwFkl)())w^v zWNsJPGuVt+$zcybW8Sb8bpTTW^;IZ>k7QZI|IMGqDP>OMmcR=!5wUIpNV9x z)uy6VGEveUVR80Jo0qN2YJnWgfg+W0puz2On^9%bJ{B}2?P5kGfweJRC6X$j-~$Cl zg-zT?+>0B`>0c{S!#Ye6Zq#GUDH2k1ZI=wxOD0g~ZJi@1Z)J6HRd7%leFioy9g$Nm z*Jum-mvn{zCHLG?Y~rc?L8Xu(XQKf2$j&z?pJinydV`Qhtj7b~Ty{AX31)@eaS74l z#;M;41Sp(bvTB1^T9cK<`N38CFUD;2b(49AwlL)^>ixVVp(o> zCH1*^N^-HpDK{W#>_E?G3d`k=(&N>ZfukUz{E;BL43Z7x4u%gE;c-}w+nB+mE?E6E zP6!-gUS>e6Uqk|zRlLD_nM0`)6O>g1$IZg3Le2tUW6ojbZJJj<5i^U1Z?sE_xF^h{ z43@6Zu8o}2MkXqpz!y@k^60?;rR**>Pw<~R2t)%3vDN58uD}|{ylXavB}IbshAc zuHm$>d0Bn%!7P?@g7=7Q-fYK&VQ_Sl{zew}HAeW^8n>Pe#_sA_Np<%IDY@CqXiPw< zR(22oqM(+Z9wmV-f|`e99U0tAYGJ5o;&m}htEf<>+v({K)&WCJbYoWV=mq(SX^;Ef zDPl|;AZ}80eG;XkLcxIh9VNk2AT4`%mm5)ZnSfDq)ccF>&APv4SVI*G4@*a{XrrR1 zVq9L4ps0qswW(^-+N<~(YFhB0(GpJmOZ$`)x}{)M(~iFpc763$0-%5d7F?@!sL!y+ zyLde%)@{l!6AgsiA<#ja%#m-IeWDtK?VhA~p;uB8GAM{Y60+q31T)jT8;Q`PpH@9k zxhVa`D|1XOz};AW-~x4^*>pqFtv?Vg4Gom+1RB%4MalLmCO{}kvCYLr*#a0#Mz7K% zUThw*%AQ0&eNF|1tw1Ok+=$zhU8846)vLh-6x*8*xn9PgBI{a;yjyxVD8as2kxhw*IB7T{1sx z&j&yQ_W%oa)%70Ka+rP~Sx)PIpeLo&Ke<>08K+M%h_9#t`<1uSKggEqz*qQ<+PGHX zUJXawO4-^I@e=N3Ur@9;%Yg>zA+z2ykwq7|d<@d`h>OWWt{4+Qs6Lv7)$|gRh$W-u z&!|_W*eEZ;ME$Up^|&0fWoUWS$fYOvWc=@+a9Jd?>DGvodJRcff-#FuvVkYQrJo>Ep|ai(v~#n z3OV^Bt2Yg2(&54c8dmGXOTut24%!yMIk}N<`U=sN;wHD?I2T)rnzQI{Dbt!^T zEccdipbLOMK)RHy)J)fF{{S3+p)^BL{{U!<nab# zw7aMT$$uhK;uYJpEEV1acQB~?*fNE+-};rX`cf*w^(Dfi(8AeEG$ClC+(RgMlWF2a zj+DwMQOL2Dpe>dmM5kbfv1;l=n!E_bDe7vXX&K%OiMG*w%59)*#014t2r~Bp$T#tc zOdCA$^BUXU45zd;Ys!R9_fTjJg_QP=+S%T!0P2ZL#G+fXBKtw3tei)@5oRD`_>I(h zg5~x3SoxPIS%%+;zk!4y%`sOSEL43U0eK77ZmL{{0MWJpZ54wyf5dhGkofq4!uYu3 zVwzj|lw#&k{Y2MY!w2SQ7mG?h(PvAp*UU=KumklPBp#$S;srOWBH7UM9b1KkOqBls zj|oNYIi*dS!%~WY3oWcH9i_F?F<%Aa!3|O6eqcs+RqwRHtBeDnye=cPqK{cj)BXu% zE(Q~B@4*#OL}VqC7Zafuwyy{wJyAalpc|W3wTKR@C-H25K!HtdjW?;E}VT1@%K$r0v5Nz+K zGL*$+4EsXgC?Y=uT`ur{a)Z*9Bcc}((Hx&5v07bqW-1R)_DL-pUA5`-z}i8xyez*PMkV9-qk82f)RI z7u5>CMpkC~TLc3!xHY(<@Mt*qhiIIXVgrM`3Hnq@yvqpd+AsznhAYfS;DAIuoA*TVS{H02vEX_{u8T6Rj$nnIK~LN{5;Ibpt%(XKKEViC`k@t5 zD=+aDXvxv_9&hY@MRo-RE&<&3!pjeweZrU8sr!vVw%C5jOxVVaH? zBG_YvJT$>y1uJiC{mM%A@7!TW%l9nW?f(FEm#KVMU}3B-37wML=~Qo4VJLSI1y<&-i!`uK|mwh=^N z+Yq>g%r@uHhE8fOWp|0ZEVP!qt{N55Xl4p&_GOm5!jz`*a=`*DInL7R0d642M?w|} z1><~6rdJT!8kF8oX<_9&X2HNftq){pc0jtz z)>W_$_cCXCCS0$GH5IzVDyNcO$I^rp4;>{DE#QTNeuxcF_m?o73xJkgmjJ6(bj(Jc zV2k8ltfKHxcA|Rf-sGYqp5U!#PjYPG2o#NSd7Tv<+^3HxrsF0?kSzYT;yr}A}%6{o>K2qIc z?fFGY{f2B;li)*0b<9iD73w)4W?lL19697?8-Zsg5K-7@YU?uREPRQYPFb#q3#|%w zEBy|<1_tRNhs{8ZXZ^@Q$z#x)M9eh{mY}3_A%YBVv|F#le2Qq$dPhsmg^uiUfpm}y zZL|#B2+hRo^wF=x$$GMd{>Z6G&Jd`9fW0wi=HV1=aWMFOhSEexlF=VzCHp9gHh4-7=?YUCyA0%6|8iCG3f*}i(s=>zv3v!ca*<-o3o zf6Q@RNPkkU8?BmtE>uhEOMT)pN6Cx;BBx4&LyCpiBWGHSnV)({z{SY#9}?iXhKP86 z;bR$LDY7l7hIbvJ7XJXJWUC!e_!CLx9wSF4uh`~W?;8M69zVgZVJd*Bb*5!|wixZZ z50Nv4%3|17a?m<%;;;O=nB&}ZkY-~Axu#V|6kb=rmbHs)1wf7Ht^#tnj#d4071@?n z<2G0%HJE46v(=XL_CmQnBiNndH-wC;o}($?>N$WBmJ8mn-NXUwWP@C0I* zU7$rBpi3*Km~Ra6RV+~KP!VVj4KGP!AGx?>C%p|oJFI@80~b2C9}!iyYZoddZM(?> zSKNRxbqz%@1>i**J>u2i6)0OoawuEkT}r?a!StNAdZNaM$t;IxECVNiV)JOmt=ZxY zO!f(7u;@W70}3CxOs=57XfH|(ybas{O2UO1w=&IVLfrg8G2pB97f~AlD^fiOBA}=} zV%qb`qi>WRWI9|>2CNW|U@uq@r$`2VWi@tE)lELCtAlLF*~BoUIw}UGuSs~>0sxlf zC9qeb8UX;Hz}#Y+3$A226U1j#n8)K>^@xWnX@k~e!4!*3Aet}CZca$&1g0C=H$&n& d0`wgFy>%5;M&+QEEZN%gQMrUs+FSg8|Jmp=sp9|u literal 0 HcmV?d00001 diff --git a/java/webclient/classes_spec/org/mozilla/mcp/package.html b/java/webclient/classes_spec/org/mozilla/mcp/package.html new file mode 100755 index 00000000000..e351479769c --- /dev/null +++ b/java/webclient/classes_spec/org/mozilla/mcp/package.html @@ -0,0 +1,200 @@ + + + + + + + + org.mozilla.mcp + + + + + +

Mozilla Control Program

+ + Master Control Program, from TRON + +

This package is a simple layer on top of the Webclient API to enable automated +testing of web applications using software such as JUnit or TestNG. It fulfills a similar role as +HtmlUnit or HttpUnit, but unlike those two, MCP has a real browser +behind it. MCP also fulfills a similar role as Selenium. However, +unlike Selenium, MCP allows you to make assertions about the response +content of actual XMLHttpRequest responses, including getting an actual +DOM instance of the response XML.

+ +

The main class in the package is MCP. An +instance of MCP corresponds to one browser window. Methods +doing the following obvious tasks are provided:

+ +
+ + + +

Here is a code excerpt that illustrates the use of MCP and JUnit to +test a JSF application that uses Project Dynamic +Faces for Ajax.

+ + +
  1. enum TestFeature {
  2. +
  3.     RECEIVED_END_AJAX_EVENT,
  4. +
  5.     HAS_MAP,
  6. +
  7.     HAS_VALID_PARTIAL_RESPONSE,
  8. +
  9.     HAS_VALID_READYSTATE,
  10. +
  11.     STOP_WAITING
  12. +
  13. }
  14. +
  15.  
  16. +
  17. public void testCardemo() throws Exception {
  18. +
  19.    
  20. +
  21.     MCP mcp = new MCP();
  22. +
  23.     try {
  24. +
  25.         mcp.setAppData(getBrowserBinDir());
  26. +
  27.     }
  28. +
  29.     catch (Exception e) {
  30. +
  31.         fail();
  32. +
  33.     }
  34. +
  35.    
  36. +
  37.     mcp.getRealizedVisibleBrowserWindow();
  38. +
  39.     final BitSet bitSet = new BitSet();
  40. +
  41.     AjaxListener listener = new AjaxListener() {
  42. +
  43.       public void endAjax(Map eventMap) {
  44. +
  45.           bitSet.flip(TestFeature.RECEIVED_END_AJAX_EVENT.ordinal());
  46. +
  47.           if (null != eventMap) {
  48. +
  49.               bitSet.flip(TestFeature.HAS_MAP.ordinal());
  50. +
  51.           }
  52. +
  53.           String responseText = (String) eventMap.get("responseText");
  54. +
  55.           if (null != responseText) {
  56. +
  57.               if (-1 != responseText.indexOf("<partial-response>") &&
  58. +
  59.                   -1 != responseText.indexOf("</partial-response>")) {
  60. +
  61.                   bitSet.flip(TestFeature.
  62. +
  63.                     HAS_VALID_PARTIAL_RESPONSE.ordinal());
  64. +
  65.               }
  66. +
  67.           }
  68. +
  69.           String readyState = (String) eventMap.get("readyState");
  70. +
  71.           bitSet.set(TestFeature.HAS_VALID_READYSTATE.ordinal(),
  72. +
  73.                      null != readyState && readyState.equals("4"));
  74. +
  75.           bitSet.flip(TestFeature.STOP_WAITING.ordinal());
  76. +
  77.           
  78. +
  79.       }
  80. +
  81.     };
  82. +
  83.     mcp.addAjaxListener(listener);
  84. +
  85.    
  86. +
  87.     // Load the main page of the app
  88. +
  89.     mcp.blockingLoad("http://javaserver.org/jsf-ajax-cardemo/faces/chooseLocale.jsp");
  90. +
  91.     // Choose the "German" language button
  92. +
  93.     mcp.blockingClickElement("j_id_id73:Germany");
  94. +
  95.     // Choose the roadster
  96. +
  97.     mcp.blockingClickElement("j_id_id18:j_id_id43");
  98. +
  99.     // Sample the Basis-Preis and Ihr Preis before the ajax transaction
  100. +
  101.     Element pricePanel = mcp.findElement("j_id_id10:zone1");
  102. +
  103.     assertNotNull(pricePanel);
  104. +
  105.     String pricePanelText = pricePanel.getTextContent();
  106. +
  107.    
  108. +
  109.     assertNotNull(pricePanelText);
  110. +
  111.     assertTrue(pricePanelText.matches("(?s).*Basis-Preis\\s*15700.*"));
  112. +
  113.     assertTrue(pricePanelText.matches("(?s).*Ihr Preis\\s*15700.*"));
  114. +
  115.    
  116. +
  117.     // Choose the "Tempomat" checkbox
  118. +
  119.     bitSet.clear();
  120. +
  121.     mcp.clickElement("j_id_id10:j_id_id63j_id_1");
  122. +
  123.    
  124. +
  125.     while (!bitSet.get(TestFeature.STOP_WAITING.ordinal())) {
  126. +
  127.         Thread.currentThread().sleep(5000);
  128. +
  129.     }
  130. +
  131.    
  132. +
  133.     // assert that the ajax transaction succeeded
  134. +
  135.     assertTrue(bitSet.get(TestFeature.RECEIVED_END_AJAX_EVENT.ordinal()));
  136. +
  137.     assertTrue(bitSet.get(TestFeature.HAS_MAP.ordinal()));
  138. +
  139.     assertTrue(bitSet.get(TestFeature.HAS_VALID_PARTIAL_RESPONSE.ordinal()));
  140. +
  141.     assertTrue(bitSet.get(TestFeature.HAS_VALID_READYSTATE.ordinal()));
  142. +
  143.     bitSet.clear();
  144. +
  145.    
  146. +
  147.     // Sample the Basis-Preis and Ihr-Preis after the ajax transaction
  148. +
  149.     pricePanel = mcp.findElement("j_id_id10:zone1");
  150. +
  151.     assertNotNull(pricePanel);
  152. +
  153.     pricePanelText = pricePanel.getTextContent();
  154. +
  155.    
  156. +
  157.     assertNotNull(pricePanelText);
  158. +
  159.     assertTrue(pricePanelText.matches("(?s).*Basis-Preis\\s*15700.*"));
  160. +
  161.     assertTrue(pricePanelText.matches("(?s).*Ihr Preis\\s*16600.*"));
  162. +
  163.    
  164. +
  165.     mcp.deleteBrowserControl();
  166. +
  167. }
+ + + + diff --git a/java/webclient/classes_spec/org/mozilla/webclient/WebclientFactory.java b/java/webclient/classes_spec/org/mozilla/webclient/WebclientFactory.java index e38b6f431e9..ba404493e0d 100644 --- a/java/webclient/classes_spec/org/mozilla/webclient/WebclientFactory.java +++ b/java/webclient/classes_spec/org/mozilla/webclient/WebclientFactory.java @@ -30,9 +30,12 @@ import java.io.File; import java.io.FileNotFoundException; /** - *

Do per-app one-time initialization and shutdown, as well as being - * the factory for per-window {@link BrowserControl} instances. This - * interface allows a pluggable webclient API implementation. The + * + *

An implementation for this interface must be provided by the + * Webclient implementation. This interface is not to be called by the + * end user. Do per-app one-time initialization and shutdown, as well + * as being the factory for per-window {@link BrowserControl} instances. + * This interface allows a pluggable webclient API implementation. The * static methods in {@link BrowserControlFactory} call through to * methods on this interface. The implementation of this interface must * be a singleton and its the lifetime must be the same as the diff --git a/java/webclient/src_moz/Makefile.in b/java/webclient/src_moz/Makefile.in index d81c34543b3..5b7adb6af42 100644 --- a/java/webclient/src_moz/Makefile.in +++ b/java/webclient/src_moz/Makefile.in @@ -178,7 +178,7 @@ endif include $(topsrcdir)/config/rules.mk -DEFINES += -DMOZILLA_INTERNAL_API +DEFINES += -DMOZILLA_INTERNAL_API -DFORCE_PR_LOG ifdef MOZ_ENABLE_GTK ifndef MOZ_MONOLITHIC_TOOLKIT diff --git a/java/webclient/src_share/Makefile.in b/java/webclient/src_share/Makefile.in index 1b8e0840b21..ce00cbc7617 100644 --- a/java/webclient/src_share/Makefile.in +++ b/java/webclient/src_share/Makefile.in @@ -48,7 +48,7 @@ FORCE_STATIC_LIB = 1 include $(topsrcdir)/config/rules.mk -DEFINES += -DMOZILLA_INTERNAL_API +DEFINES += -DMOZILLA_INTERNAL_API -DFORCE_PR_LOG ifneq ($(BAL_INTERFACE),) INCLUDES := -I../bal -I../bal/solaris $(INCLUDES)