From ea87c4e063d1035f9f5784cd489c6767485976fd Mon Sep 17 00:00:00 2001 From: d-millar <33498836+d-millar@users.noreply.github.com> Date: Tue, 15 Dec 2020 21:19:34 +0000 Subject: [PATCH] GP-500: Added Memview (address x time object plot) --- .../ghidra_scripts/PopulateMemviewLocal.java | 284 ++++++++++ Ghidra/Debug/Debugger/certification.manifest | 7 + .../src/main/help/help/TOC_Source.xml | 6 +- .../DebuggerMemviewPlugin.html | 84 +++ .../images/DebuggerMemviewPlugin.png | Bin 0 -> 194575 bytes .../images/filter_off.png | Bin 0 -> 510 bytes .../images/sync_enabled.png | Bin 0 -> 446 bytes .../images/view-refresh.png | Bin 0 -> 1364 bytes .../DebuggerMemviewPlugin/images/zoom_in.png | Bin 0 -> 725 bytes .../DebuggerMemviewPlugin/images/zoom_out.png | Bin 0 -> 708 bytes .../gui/memview/DebuggerMemviewPlugin.java | 98 ++++ .../memview/DebuggerMemviewTraceListener.java | 251 +++++++++ .../core/debug/gui/memview/MemoryBox.java | 249 +++++++++ .../debug/gui/memview/MemviewBoxType.java | 62 +++ .../core/debug/gui/memview/MemviewMap.java | 58 +++ .../debug/gui/memview/MemviewMapModel.java | 245 +++++++++ .../core/debug/gui/memview/MemviewPanel.java | 489 ++++++++++++++++++ .../debug/gui/memview/MemviewProvider.java | 302 +++++++++++ .../debug/gui/memview/MemviewService.java | 38 ++ .../core/debug/gui/memview/MemviewTable.java | 288 +++++++++++ .../gui/memview/actions/ZoomInAAction.java | 55 ++ .../gui/memview/actions/ZoomInTAction.java | 55 ++ .../gui/memview/actions/ZoomOutAAction.java | 55 ++ .../gui/memview/actions/ZoomOutTAction.java | 55 ++ 24 files changed, 2680 insertions(+), 1 deletion(-) create mode 100644 Ghidra/Debug/Debugger-agent-dbgmodel-traceloader/ghidra_scripts/PopulateMemviewLocal.java create mode 100644 Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerMemviewPlugin/DebuggerMemviewPlugin.html create mode 100644 Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerMemviewPlugin/images/DebuggerMemviewPlugin.png create mode 100644 Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerMemviewPlugin/images/filter_off.png create mode 100644 Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerMemviewPlugin/images/sync_enabled.png create mode 100644 Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerMemviewPlugin/images/view-refresh.png create mode 100644 Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerMemviewPlugin/images/zoom_in.png create mode 100644 Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerMemviewPlugin/images/zoom_out.png create mode 100644 Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/DebuggerMemviewPlugin.java create mode 100644 Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/DebuggerMemviewTraceListener.java create mode 100644 Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/MemoryBox.java create mode 100644 Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/MemviewBoxType.java create mode 100644 Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/MemviewMap.java create mode 100644 Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/MemviewMapModel.java create mode 100644 Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/MemviewPanel.java create mode 100644 Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/MemviewProvider.java create mode 100644 Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/MemviewService.java create mode 100644 Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/MemviewTable.java create mode 100644 Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/actions/ZoomInAAction.java create mode 100644 Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/actions/ZoomInTAction.java create mode 100644 Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/actions/ZoomOutAAction.java create mode 100644 Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/actions/ZoomOutTAction.java diff --git a/Ghidra/Debug/Debugger-agent-dbgmodel-traceloader/ghidra_scripts/PopulateMemviewLocal.java b/Ghidra/Debug/Debugger-agent-dbgmodel-traceloader/ghidra_scripts/PopulateMemviewLocal.java new file mode 100644 index 0000000000..13f81d54a9 --- /dev/null +++ b/Ghidra/Debug/Debugger-agent-dbgmodel-traceloader/ghidra_scripts/PopulateMemviewLocal.java @@ -0,0 +1,284 @@ + +/* ### + * IP: GHIDRA + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* ### + * IP: GHIDRA + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import java.io.File; +import java.util.*; + +import com.google.common.collect.Range; +import com.sun.jna.Pointer; + +import agent.dbgeng.dbgeng.DebugClient; +import agent.dbgeng.dbgeng.DebugControl; +import agent.dbgmodel.dbgmodel.DbgModel; +import agent.dbgmodel.dbgmodel.bridge.HostDataModelAccess; +import agent.dbgmodel.dbgmodel.main.ModelMethod; +import agent.dbgmodel.dbgmodel.main.ModelObject; +import agent.dbgmodel.impl.dbgmodel.bridge.HDMAUtil; +import ghidra.app.plugin.core.debug.gui.memview.*; +import ghidra.app.script.GhidraScript; +import ghidra.program.model.address.*; +import ghidra.program.model.lang.Language; +import ghidra.program.model.lang.Register; +import ghidra.trace.model.memory.TraceMemoryFlag; +import ghidra.util.Swing; + +public class PopulateMemviewLocal extends GhidraScript { + + private Language lang; + + private AddressSpace defaultSpace; + + private HostDataModelAccess access; + private DebugClient client; + private DebugControl control; + private HDMAUtil util; + + private Map boxes = new HashMap(); + private Set eventSnaps = new HashSet(); + private MemviewService memview; + + /** + * Create an address in the processor's (x86_64) default space. + * + * @param offset the byte offset + * @return the address + */ + protected Address addr(long offset) { + return defaultSpace.getAddress(offset); + } + + /** + * Create an address range in the processor's default space. + * + * @param min the minimum byte offset + * @param max the maximum (inclusive) byte offset + * @return the range + */ + protected AddressRange rng(long min, long max) { + return new AddressRangeImpl(addr(min), addr(max)); + } + + /** + * Get a register by name + * + * @param name the name + * @return the register + */ + protected Register reg(String name) { + return lang.getRegister(name); + } + + @Override + protected void run() throws Exception { + + memview = state.getTool().getService(MemviewService.class); + if (memview == null) { + throw new RuntimeException("Unable to find DebuggerMemviewPlugin"); + } + + access = DbgModel.debugCreate(); + client = access.getClient(); + control = client.getControl(); + util = new HDMAUtil(access); + + File f = askFile("Trace", "Load"); + + lang = currentProgram.getLanguage(); + defaultSpace = lang.getAddressFactory().getDefaultAddressSpace(); + + client.openDumpFileWide(f.getAbsolutePath()); + control.waitForEvent(); + + List children = util.getElements( + List.of("Debugger", "State", "DebuggerVariables", "curprocess", "TTD", "Events")); + + Map maxPos = util.getAttributes(List.of("Debugger", "State", + "DebuggerVariables", "curprocess", "TTD", "Lifetime", "MaxPosition")); + Long max = (Long) maxPos.get("Sequence").getValue(); + + for (ModelObject event : children) { + Map eventMap = event.getKeyValueMap(); + ModelObject pos = eventMap.get("Position"); + ModelObject seq = pos.getKeyValue("Sequence"); + //ModelObject step = pos.getKeyValue("Steps"); + ModelObject type = eventMap.get("Type"); + String display = type.getValueString(); + Long snap = (Long) seq.getValue(); + if (display.contains("ModuleLoaded") || display.contains("ModuleUnloaded")) { + ModelObject module = eventMap.get("Module"); + Map moduleMap = module.getKeyValueMap(); + ModelObject name = moduleMap.get("Name"); + ModelObject address = moduleMap.get("Address"); + ModelObject size = moduleMap.get("Size"); + String moduleId = name.getValueString(); + display += " " + moduleId; + //Address base = currentProgram.getAddressFactory().getAddress(address.getValueString()); + if (display.contains("ModuleLoaded")) { + Long start = (Long) address.getValue(); + Long sz = (Long) size.getValue(); + AddressRange rng = rng(start, start + sz - 1); + addLoadedModule(moduleId, moduleId, Range.atLeast(snap), rng); + //addRegion(moduleId, Range.atLeast(snap), rng, TraceMemoryFlag.READ, + // TraceMemoryFlag.WRITE, TraceMemoryFlag.EXECUTE); + } + else { + markModuleClosed(moduleId, snap); + } + } + else if (display.contains("ThreadCreated") || display.contains("ThreadTerminated")) { + ModelObject thread = eventMap.get("Thread"); + //ModelObject uid = thread.getKeyValue("UniqueId"); + ModelObject id = thread.getKeyValue("Id"); + String threadId = id.getValueString(); + int iid = Integer.parseInt(threadId, 16); + AddressRange rng = rng(iid, iid + 1); + display += " " + threadId; + if (display.contains("ThreadCreated")) { + addThread("Thread " + threadId, Range.atLeast(snap), rng); + } + else { + markThreadClosed(threadId, snap); + } + } + if (snap < 0) { + snap = ++max; + } + //timeManager.getSnapshot(snap, true).setDescription(display); + eventSnaps.add(snap); + } + + for (Long snap : eventSnaps) { + control.execute("!tt " + Long.toHexString(snap) + ":0"); + control.waitForEvent(); + + List modelThreads = util.getElements( + List.of("Debugger", "State", "DebuggerVariables", "curprocess", "Threads")); + Map modelThreadMap = new HashMap(); + for (ModelObject obj : modelThreads) { + modelThreadMap.put(obj.getSearchKey(), obj); + } + } + + ModelObject currentSession = util.getCurrentSession(); + ModelObject data = currentSession.getKeyValue("TTD").getKeyValue("Data"); + ModelMethod heap = data.getMethod("Heap"); + Pointer[] args = new Pointer[0]; + ModelObject ret = heap.call(data, 0, args); + for (ModelObject heapObj : ret.getElements()) { + Map heapMap = heapObj.getKeyValueMap(); + ModelObject address = heapMap.get("Address"); + ModelObject size = heapMap.get("Size"); + ModelObject timeStart = heapMap.get("TimeStart").getKeyValue("Sequence"); + ModelObject timeEnd = heapMap.get("TimeEnd").getKeyValue("Sequence"); + if (address == null) { + continue; + } + Long start = (Long) address.getValue(); + if (size == null) { + continue; + } + Long sz = (Long) size.getValue(); + if (sz == null) { + continue; + } + AddressRange rng = rng(start, start + sz); + String heapId = "Heap " + address.getValueString(); + Long startTick = (Long) timeStart.getValue(); + Long stopTick = (Long) timeEnd.getValue(); + Range interval = + (stopTick > 0) ? Range.open(startTick, stopTick) : Range.atLeast(startTick); + addHeap(heapId, interval, rng, TraceMemoryFlag.READ, TraceMemoryFlag.WRITE, + TraceMemoryFlag.EXECUTE); + } + + /** + * Give a program view to Ghidra's program manager + * + * NOTE: Eventually, there will probably be a TraceManager service as well, but to use the + * familiar UI components, we generally take orders from the ProgramManager. + */ + //manager.openTrace(trace); + //manager.activateTrace(trace); + List boxList = new ArrayList<>(); + for (MemoryBox memoryBox : boxes.values()) { + boxList.add(memoryBox); + } + Swing.runIfSwingOrRunLater(() -> { + memview.setBoxes(boxList); + memview.setProgram(currentProgram); + memview.initViews(); + }); + } + + private void addHeap(String heapId, Range interval, AddressRange rng, + TraceMemoryFlag read, TraceMemoryFlag write, TraceMemoryFlag execute) { + MemoryBox box = new MemoryBox(heapId, MemviewBoxType.HEAP_CREATE, rng, interval); + boxes.put(box.getId(), box); + } + + private void addThread(String threadId, Range interval, AddressRange rng) { + MemoryBox box = new MemoryBox(threadId, MemviewBoxType.THREAD, rng, interval); + boxes.put(box.getId(), box); + } + + private void addRegion(String regionId, Range interval, AddressRange rng, + TraceMemoryFlag read, TraceMemoryFlag write, TraceMemoryFlag execute) { + MemoryBox box = new MemoryBox(regionId, MemviewBoxType.IMAGE, rng, interval); + boxes.put(box.getId(), box); + } + + private void addLoadedModule(String moduleId, String moduleId2, Range interval, + AddressRange rng) { + MemoryBox box = new MemoryBox(moduleId, MemviewBoxType.MODULE, rng, interval); + boxes.put(box.getId(), box); + } + + private void markThreadClosed(String threadId, Long end) { + MemoryBox box = boxes.get(threadId); + if (box != null) { + if (end < 0) { + end = Long.MAX_VALUE; + } + box.setEnd(end); + } + } + + private void markModuleClosed(String moduleId, Long end) { + MemoryBox box = boxes.get(moduleId); + if (box != null) { + if (end < 0) { + end = Long.MAX_VALUE; + } + box.setEnd(end); + } + } + +} diff --git a/Ghidra/Debug/Debugger/certification.manifest b/Ghidra/Debug/Debugger/certification.manifest index 21cfd14c2d..cee9787af6 100644 --- a/Ghidra/Debug/Debugger/certification.manifest +++ b/Ghidra/Debug/Debugger/certification.manifest @@ -42,6 +42,13 @@ src/main/help/help/topics/DebuggerListingPlugin/DebuggerListingPlugin.html||GHID src/main/help/help/topics/DebuggerListingPlugin/images/DebuggerGoToDialog.png||GHIDRA||||END| src/main/help/help/topics/DebuggerListingPlugin/images/DebuggerListingPlugin.png||GHIDRA||||END| src/main/help/help/topics/DebuggerListingPlugin/images/DebuggerModuleImportDialog.png||GHIDRA||||END| +src/main/help/help/topics/DebuggerMemviewPlugin/DebuggerMemviewPlugin.html||GHIDRA||||END| +src/main/help/help/topics/DebuggerMemviewPlugin/images/DebuggerMemviewPlugin.png||GHIDRA||||END| +src/main/help/help/topics/DebuggerMemviewPlugin/images/filter_off.png||GHIDRA||||END| +src/main/help/help/topics/DebuggerMemviewPlugin/images/sync_enabled.png||GHIDRA||||END| +src/main/help/help/topics/DebuggerMemviewPlugin/images/view-refresh.png||Tango Icons - Public Domain|||tango icon set|END| +src/main/help/help/topics/DebuggerMemviewPlugin/images/zoom_in.png||FAMFAMFAM Icons - CC 2.5|||famfamfam silk icon set|END| +src/main/help/help/topics/DebuggerMemviewPlugin/images/zoom_out.png||FAMFAMFAM Icons - CC 2.5|||famfamfam silk icon set|END| src/main/help/help/topics/DebuggerModelServicePlugin/DebuggerModelServicePlugin.html||GHIDRA||||END| src/main/help/help/topics/DebuggerModulesPlugin/DebuggerModulesPlugin.html||GHIDRA||||END| src/main/help/help/topics/DebuggerModulesPlugin/images/DebuggerModuleMapProposalDialog.png||GHIDRA||||END| diff --git a/Ghidra/Debug/Debugger/src/main/help/help/TOC_Source.xml b/Ghidra/Debug/Debugger/src/main/help/help/TOC_Source.xml index 52045e9a48..848df0c1aa 100644 --- a/Ghidra/Debug/Debugger/src/main/help/help/TOC_Source.xml +++ b/Ghidra/Debug/Debugger/src/main/help/help/TOC_Source.xml @@ -132,8 +132,12 @@ sortgroup="n" target="help/topics/DebuggerWatchesPlugin/DebuggerWatchesPlugin.html" /> + + diff --git a/Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerMemviewPlugin/DebuggerMemviewPlugin.html b/Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerMemviewPlugin/DebuggerMemviewPlugin.html new file mode 100644 index 0000000000..9a678ad06c --- /dev/null +++ b/Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerMemviewPlugin/DebuggerMemviewPlugin.html @@ -0,0 +1,84 @@ + + + + + + + Debugger: Memory View + + + + + +

Debugger: Memory View

+ + + + + + + +
+ +

As in the Threads view, you may wish to follow the evolution of various objects over time. + The Debugger Memview Plugin provides a generic time vs. memory (or memory vs. time) plot of + objects marked as of interest. The plot may be populated from either a script, typically + processing an entire trace, or updated on-the-fly from a live target trace. The objects are + listed in the viewer's table on the left for the purpose of quick identification and sorting, + and displayed in a scrolled plotting panel on the right.

+ +

The panel does NOT preserve distances. Rather, the objects are plotted based on the order of + their lower/upper time/memory bounds. In other words, if two objects are plotted with address + ranges [0x100-0x102] and [0x10000000-0x20000000], positions 1-4 on the address axis will + correspond to the addresses 0x100, 0x102, 0x10000000, and 0x20000000. Mousing over the object + should display it's true bounds, but, in some cases, you will need to locate on the top left + corner to get an accurate tool tip. Points past the maximum time or address will not display + values for that coordinate.

+ +

Memview Table

+ +

The table on the right provides the standard Ghidra table-style interface listing each + object, its starting and ending times and starting and ending addresses, if available. Clicking + on start/end addresses will navigate in the listing. All columns are sortable, and the tables + filterable, as usual. A single selected row will cause a red arrow to be drawn at the top left + corner of the corresponding object in the panel. Applying the filter will redisplay only the + selected objects in the panel, if that option is enabled.

+ +

Memview Panel

+ +

The panel displays all of the object in the table or the table's selection, depending on the + options enabled. Clicking on the panel will set the red arrow at that position and display the + current position in the title. Doubling-clicking on object will cause it to be centered in the + display. The size of the panel can be expanded or contracted on either axis with the Zoom + buttons. The top left corner of the panel (which may or may not be visible depending on + scrolling) always corresponds to the first address and the first tick. Scroll bars are enabled + if any object lies outside the viewable portion of the panel. Drag&drop can also be used to + position the panel view. Ctrl-drag&drop draws a box around a region of the display, and the + enclosed objects are selected in the table.

+ +

Navigation

+ +

Zoom

+ +

The four zoom buttons either contract or expand the view along the time or address axes.

+ +

Toggle Layout

+ +

The default panel view is time vs address. The toggle button serves as both the way to + switch views and to refresh the display.

+ +

Toggle Process + Trace

+ +

By default, as new objects are added to a debugger trace, they appear in the Memview table + and panel. The behavior can be toggled on or off at the user's discretion.

+ +

Toggle Apply + Filter

+ +

This button determines whether the table filter affects the display panel. When toggled on, + only selected objects are displayed in the panel.

+ + diff --git a/Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerMemviewPlugin/images/DebuggerMemviewPlugin.png b/Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerMemviewPlugin/images/DebuggerMemviewPlugin.png new file mode 100644 index 0000000000000000000000000000000000000000..25da6faaf526f84b93052e0d6d4660dbf9f124ff GIT binary patch literal 194575 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 mf!q}s9(QpE4JQcj|r|T zv#3I20@I*KM2l12rU+^nBl~goNGARokRYz;gu3o|vIU)Z@?ot*WMvQlJrE02Q+C|w zd?H6?b65TPRC^Tzz|pbZ#{?5ixe>{3PZ~Lp;4 zs(`}?H6=^U>{!-?%#-zI!X_i**RSK>0b7v3Jf`688l9~^eG0AxgNzNd2zLP&9@uRj zXM`#0cpSN^t1m{7-$POyF=n?Ic{ZiUWxd0m;v1kd6e!-ooO45m`Y z_wr99^;^==VVTru)v|Z-jW4dNj5?{-$N?oxoMa2wZmB%Y-#J~k`3t-nQ(CKeWoIm3 zlb^F)Wb`A5Ggk<3xB1gfslyqu+>A4|v^{#r)z+;1ahYDm&g_wNqF@s3IOpkt>gwBL z#3F?aV3NrLS$ty+z=)c&w>6!3TLXBgY}_`D39R9w2OXYVS$wV&T>~S~%a3qY6y0(x zNM=WMdyKLq<2RzEZu)om@NF2kp|sAYFhsWJ$r6iFF+?JhcOpC#BF9jM;FJjd+TdBE{i)pH}hC zju5b;=<~{yV2DiP}3cWxLl_)1U z4aKziLTwlv?u|rd45C@!if|W*>5wDKq002u#@Z^YhpUxnGR;bf43hD`X^;cvfvDSD zT^g~lF#+kjJlg1AHsCMjcvpW*C8Vh(PC z#AD%I1egP?ILs~BuPiEar=4R%{gO+ASvb>V#Sx6^7$nYMh=hi187(P^la!F%y}ys_ zto+6+b*nmkafwN)Q$yMFC@`-I7X-Dx5-*X}xG0#s-Q-(ld4dc+f4Uy)6|A(Xo><0q1Gh8|H^;$%j^gWQG>O38GhZ@sEsp4&UnPzk&U zrPU!>==Mxqax@bYNSF*aRCD&r?;Vfxx#P5nj_SV|kDjPwdUczmFr=yMWcdN?$$FQ1 zTn`aF$~f`7#SdYGlz?+9pr&MuX1WBsQc>hwtiq(;KyfgmB%Siewz-DT;F2orOq>f` z7a1eq3Qe*GB^=DcHyadYvvd8bf{o_J^yk}R!Q zdfIzXMSE?|zi`N=IW{|2`yZt$ecF-vEbK?5>BJ5!_T7bushfF#AU=@7wS?zPDN|cEuOR zk$s0u#sglB)v)N0r|vV>BMEV?=)TX&p(kM0Ov4nUWnWFD z{r}LzSiSjvyzU*lAT=)TD{IQrX1_tm81bW>_Idi2U%+_YM3u$ONY{`bJ$^u#F^mUw zUNin6wSW|LPy?%k$G}^aS7UZ-2Q`^KqHyrO3ap-Hw$x&Unt zS?A1bGkkn%nzrhuTRH#&A!1AukdTGPi`(sUU-{26n7-xqlxg||5^c>$&x2Ng0X3MB zr%yUy%u2|K8x0MQ&-}MOBvinWQcSrDT^K1xV*(JzpiQWf>Jk_fz5eO$7go0o}bU*{6u-&Dc60t#exF| zKJg9(#Ptg|SeX5e8g_^Goa;I?L-Ro$+Yof(a+LI{cH015duJUW$g!5Cr@#jEX_y(d zCRuO3I&34b(i|e4wq3XImu9^&*C5A*wL}4H#a*bOgSdT*qsi)B@b-4g4WHic__i!F zK~gyO?fUkW8vX)@Ta6`qNQ|5K^@qz&AABbarA3CK zDq9kiVmiXRP>5JoikFW7HAKU9%IxSzLj@1%<#S#{d9Kl?#2K|{W>Rx$ z5-iC|rpoUMY;JQhWR6r){$qQ3jAhB_gl>|p65~;-bBmv-(~+|+iPhSbNlAMn)lLoN zh+Jg#(QsXDKYuu5nez}rNy?oZU$zsHWe-)f=D(Y-a}%?K*xi#fo1_ z`2j(2Gw`G(qX*l8aB+-{#!F|Ly-K+7X=6Mg*efdif2kmjzh82FR~S^6DS~qbG(&-Am0CH*;*mMW)>WmT>PT@$0G72r52cDbT49s7L)q1Y?tn zoD$`Yh(_~q0qWa48dh9u*g6BS;2XZHx|!nTOn`V3!)X|Z4^aX$gfqG~=3?bPxt@MduZSdqMC*Qi9~+I((&>z51r=1V5Kff*j*Xp9h?0 zPWPZlXIYx&d7=-`2Y&fe@p85CCz=6T_3F@>6+aAsp^71k8N zBi>R@AxUgQ9Vz9Af5UXi8_YGxMkp=9k`^pCL-+-sm?dkcy;-jX>=7g=`F@|dLufP) z;U3|h1NZ2ABdb{#hEVD^3E44%#})e@dTlaLuD_-#lMvWWGIF4!1ykIT zlUH2&Hu$DR+pP<3Q#}B_#>^~?bsfFHCFM0BVJI5hGIThLl+73 zPDD4C>*tLmC1KqRm0h*ULN}$2Ilv4idECbnqfG`{^z2jvA4#~Mk&F?%1dpgGI86ib za@IJ!oKdx>&E?M!#9zz;qIKHOS?eME-+>U`@Yd)5DL?x|_XzL%T_)qnsBgcfQ$(@D zqqgLS!z^^~tt6EOC$YgDDQLI|ya}h`EaInFvhF7Gt#4BUT`gD1k49; z8iJ~5M^p1O2UJ-GTQGap#9xyx8v1MqM-Tv{&B+QO?C~^sTDd-&g3vC6qcJ$8@I*YX zEUm5&G08v+3mk22nnA!YgFM}A02!+-EtvK?YD4>ARsVjie{1~#qGVTlAWqMS5qo|F z0Dra3G~Qzb2mR#*PNMnm%R|T>0|AH!17a6KZ20m<7YQNgIH||#*x7;Oo{2k?e89QT zN*G5SI7v!Ql^IAXn7mQeMDtUY)ijV z^fX!<1eGR%?YvsgjA(RSnFSzz=BiTub)bh(LLS{huHv4R8XT-h{P@04{T>UT##*b^ zdAcB;jV3GKEciy-C=e-UP=#Uh)~_!zC!CngsV`H zF%3p&9x9fmSjJ(7ay;?9RkugmBu(%fe=Ahplxu<0Q2eAq&Xm+ukmIBgmf|!-M3muP zb&VY8@yrF?iCDf8j#kJr2tpRs#WvloEBX|%eD6a(I^#IE`&*x1|HVF(*M81tXL~|Y z92`u6*pbQ>M;NgiYrC65Bdm2?Huw_>11wPCPcnbL~( zG>Y7ScpDO;$nokvqAW%p%5NyCE2}ZUpT#BM@H*+WZk>?E5QK+z*nV^>|GeNO_N00k4qWoyP%`7z{j^(>4*6&-Tb}o z%KaJqxI0G^3j3ZpmUid0d)r(4NJ7%{jUOg_S<3(B)2}L~Sxx5QQ9w-y zt&YlBug!jkR%+tj=vQn*u70JC-l}oxLmvR*QSxY8=$G36J-rZS1TJQWQAZx!(g4k} zBt>(-oe>2fKhmOLLHUI^+>8Pua=&4f+b$}nLW3UImn~v#=02I$7rhNp1?o(-DPX=+ zz)s@7&W4v|4k%A_zGTe){(zZzq?w-Ge?BYjM)368r?%YdI~cK1!Lb+}oZ^H)5x~Id z(`yBS|J6yUM{Tv+3@8UlB|!HAp{s|i@3?j4E2f0#~l%m9-64iE`I0X{G~v3~k$n3wj z&42NsQLY0on<9gp*Pt(t0T3jQ%#{Xd_psvwF^-_pPCC+;gC3RTsBwYPh&Rxs3* zyCngi2#*$9VhV9w{B`P`Xn$S`FWQj5qfH}hxkC?&^#)-JO2eT@CX$4*W0=qZ1CoF* zt|@ygTt~c3i6`v~11ROWaj*)q;SM&`up{S0-Pl<|caE0Gn4rY!46ms8YWMW!ea}!XhtVefe@LfKR)j&%d(%e8( zW*s|=?v1hqN=JO~lJQ?RbcK#<#3vcA7oW5MY5^fjq5;t6J8$LFlufCEH`+2>?*{O{ zU-pXj>D^ZmsgYhTpH1wRkss*Hd8zhDM4y;5$x*(BS;ZHV-^tBl_)CQ#&$ z4{8J^8W_Q~=w|*MOyLRj#Z(SOm!Zb%|Ku&lr(?<2wNedsNc0abap-Fx8dyRwX{#9n zI%?sCO7ZV>a+Q`og10w(u-4IJq!!o?gQEyP#o0EbWVh0pqZE*dvN1te6`CE<$b7_N zO#2{2h^qlK8wyFdwc&)-ngCKQAB>buOrs;fOF%>@8U#js&xD$m;?%=*O1j95o*_eF zul%vKM*a1Gd0yvzbWz-&#V6|$lqqzwj_bl9ccF6YmSdIKPN}@5gFs5hAY*Of`>V^L zS{##M3~U?UJalhk!&-avR6NGo3&km1 z1;rIh>;sq}l_q~J)PXv61&5!J$}mJOMf-6WJEQ;nG;<=|m&-(rSV+SEOSoEGwodo^IQV+zUJ4-Tt zAY8r^4Q#qNxX*}K8WZ+?5K?%I{M8`J*;IJ#bLDGUDe-wvQW+Yl2vqmu>2ep@TCYqC zGg{Pte7eDvQf~$PjFr;wG#FdSLr{k) z2F{%cM*y-6Q+cKT0uFK1(>O`$G1a$#?)W@} zWqZE3J*iPg?hM*Kc}WOGo}8884J(mL0@Nr&wSEBVmg#Ec;hZNR5~)RSl}aPV6z;+- zbKq=9k6fk^G+BH#oX&mDos^MWj@VB-$2leOa2CD@MD#KAf#B~9_>TYcvB4SY8VFfE zr)V|6XFx@E_oT``U;y)DqS|On8jdcX%8ML`j*_+#q*1~%f7+8Xj3pLoOHjKwNRq?8 zR;R1l6CH$%dXkJ3kF^MnesNiKlFS8~zCB)QrIC#EuT?T><^2(qJ`1H2b}3HTHgUmF zSRdTsUgnAYelrQ@Y}9HtK9&X;V90AYDuJNb=t^TJ;D-+uqYc9{?h4E2_lnX4 z-zrv^P105B$p$$Lm3|OK7h1i89NIwtnL%af_?D9;rPq|5NAGwEYB_U(e+Lw}F-UzI zCsjC39GkT*-T3vGX3kBF4RJh;>dfv6(4_yoHt%?9?$|MGvOKz>eK<>5rAhp4DV{2j zHPIzC8l;$4IXLzrc)R2pgZfT*imVQ_LNPW2)>mJ-X2mCeNfT@7LlNS)9aRvkL7iB>dAFeS%VMWU2!n2IH`BBuymg-HETF05S717i2FDm$p)NF9#qZL>MxGiUpk@} zX@oA&$Uo}-z&S#;9`J9n^)x6c}N9x-vuJUERW1Hr+8}8hI^cz)663pZ)2u1-R{YO@fRpbZpV+xmu8|B%MU# z8+W6KV`%_$w77Fr1sqr9H)f+&&A1+CBAkPB-sP#aM8C0L@0a(erh$g05J5MFAc-YE z;~m4kFgeo45YRC&I}UoRv6UY3p!RoK(3N}$X#MFa${Q770t71-#Q7hkn;4B=iN1?a z>IRvjtY)?wdvUR{&~HA=%zdqvQ8#0#V|CC>8?yjIAF1o?d?mCET>r<8U>B3Gfc3GXalQY?v+1c3 z;jAQWTz2(e01mADF>Xd#ee6d#7>3*4*kX|L#;u>Biolw$sUceiQQd#uvUhuxT#(zp zLdlXOD1~&#Qa;~9CDJ7cM-jD(2KUwy2{4nHuj>3ypTNF2Y4#=bSytPrkBRvd!@}+P zu3wb$3Clk`qMJ-7gezVX-=5SZk#>{l2mQt8_Rt1p=m(_R0_Gj^mq@;U8(@Z4lDQr&tT8!KXlVc>kBM*Xb2+!I#xc7K5wG;!u#VKEpp!jA z4q!BkT1D{QruA2o)&RE+7IlwjYNYO5$HSr?+IN_;;>mwH2MgdF;9vY||GV~M7dG4}^9x&Ty?d&;UT4*w#zGE|*cxcw9qW~d+WGhB>eNH+~OuDw_%0_5B zG8LaUEDRedVwA`Q&*uamFn!Bt-O;wphBBj*!>fOB(tr>mA7x;eHBKNpW7Z_ApLmhr z0UapBUul#kZlrulOb@exaypfQL3t(?RefzCBn1=72ogt=s>^)dRQHL^4nU7|cyw30 z06&&4hA<$nZp^NMv09b*Jr?X20nEZBSul2D=>C#ZVHzTjR9S&nOOL82Qn4jXgCz=4 zB}J{2`AW;ps9{XJGWj{ZogyEnmH?k4pH7h}utl!_fQmlfPY-~Me}vP!%b<)`Y*`Yp zLJL*+mPd+z6IseGlkt_flE=APP0HWKQv$%21b%mMhQ&R(9FBtHC5}IIhH|=32hPL> zq(Go3ieL7iC#s@Izx0K?9Yan6sfX|{q#o`v;m8lQBw}`5QWk+KPnU0(omgzyR`C4$ zS1BDYJ*h4}MHICf`ScF&X(+1(y8cm5kX2Ih+6sB?> zv|W3D&g$naI&c6ElrP~pBEwsX&W`rcJ5V~;w zxQP)8V5v7kys>fFiW!%>1@1ivD3Vg%1DocpIXn9SK6-Pr*IZDl1PSPsybwgE60FPJ z+0x)&oO)b@{gDGY(m0ePOh5_!C+GsJHogU9iEk*mGzl8m*@FV;+1B1fk`-y8b~7miqMrLP49xzP;{iC#?$11<*F1X9Xfg7pWp?&&zN;X za1nD8I;BljLlM%1oT2*Qn5OSX>AUX*HbD3S&BZC&@uC zUJrWZ;wb(I(c!5CirLU^EtHju^kN&g0eHA;8LbYyq?k zz*A6J4w@O)>1x)zIeYC~aZcl{0e+)t$*&4+rg#~UM-Gp&p!^5N3ooe*k-qu*z8UeG z#PQNv$hMdqKx@oO`uM?r7UulzG9genV8Smc%Kw7G(QGYwgiBD|090jCEk7;CN!nb- zbc=L1g5D>a==3QVq}N)JLv2pxIARM>WTIbyLrXdXdT78%hjJdLWgr5AD0@(L@Q|t~ zD=YwHb&-^Oj9FbZBG68hC3pscn!gpNP6D&&!|jnUH8=95e5lJl5@=Gc#ieQ7 z9dOv7|IG{yiPyNZSFTeMLN-}v_$fsrc`*nLNK`gr2deog^w#(i;J|@|L{53K{c7UMQ}LcSXVm;-gxG`4nH zokLLCJTC0VDMtr?=TKs#4&z6tNY?xdr=*4-{FpdGC`*f1{KlccvcQFxhF4{KP8*BMx1p28&dY-7Dw~b}5@x(v?dJgRS2Hcz_qc_O*lXbP{Dy z$yBu|o9qUwx?JV>5Jr-Z_k?Ru6$UO))4#O+b)fhONXT1@>5Nn3O=nNI_|>Zxjh&L3@Fz5_M~+VSqSEP{ph#7eJ}~x2imp)xvi;C#qx)Ek z-wpcT226|+{~Mkjb-^;y{itQL7G!fX#`Y<>VbCN)QdL7FBfO#eb8MlhT;o${nxz}) zbPH6MTodfw04>)9!I}n7gxobgWjk-QR;TDeT9oXzCm#k|=925F_Du9&U;j%3&GEo! z$umO3gt8a`oDmS6^0fTsjIekUgvG`We7cSyr_uy+_hH(-Ehqh~ib`j{`zdrwO*>p% zv&aHkr~3V6>s06V_7EwDTqUqj++bHzK4qjwf!Nu@7K3z7HJYg=;c)k$WHuS}{s`4} z#qz-q9jVUh(dxd!AnqRkSWMF=G=R*y0RzvTJM&l0Xsv^nCXpGrfv#(T>lmltW4m$Tyv;%dqu z5!5Aomt@8$tMi_7eFEE^@%5^g}aDf{AI z0yQq#+yJ3P+>3iftbhIvHQsyPUj@#eO{Yg}X6br_TAzohz4RN<)WD{j@MbO(G>~-r z_D}f8>+@oyvj5xM)9!$Apf%~ZlY{pbox|6_9ULSb_isy0)urQq6XW;`BE=!D^rgA~ zHv^7x{XZa)$61|M##5E~xnDkgg(qVk&UstYYoijnzb<)~IupurLZGaBe`DtV56XHi zTjdW6jsmL|(oJbYuWQ8NR$jowbNej1GU=z7IC;Sd_9)3ELDQWy#AgbTNT;}_(peDg zGJI^2E*;}H{o@rG@*_$9{9tJ`lkr#0JI`r2FhO&-`2*arcCtz96`$_Ui(fQ=$<rQWj5(L6ZvD>3FUUiAET-R%pm1>p=Mx_|Zp1tySEthX`{Z5kL290g!R7Ku{pP z4Gl!Auf@lrwr?nj$KeSBoPt6O0b}4h-3#D+GGiToGYFYq5`1u#pJJ8i_<$vhs^WYa zrcp!aaJMEJcbxw-2vRXInn9^PQUrZR|GJf^Pa8@M>98!CPazFI|4F$|izl!V1zY}? z9y$ZE@G1_u4NqRV4JWtU3i-q3QR;fJ-f*VU=8FacztJn*#t?JzUItw7J*jv}lx5d{ zY9`u*uuSNbdQ{;>7k;}toow9g!hfQC{;esN_zGeI-7A^~+lN~REioRq|9!s>G2)w? zAvV+brh#sQoVKWKFMZHV`C{p|}Q|gK@s`?1h8Qn7c zcNX17s18q;0S%d>%I@Kh!)nfG9~yiQe*)<+>Pi?45|N11pUZEm1bk|}3WyNSmIQjs zmi{KI4wd$>bZngTdibsq`xJeza1BF1Eo7Uu%QDz+H*4^kUpQJ~2xl&7A|(#}B9*RD ztZ2Fe9@Y!?eW|I)giY!6AQ0t?f_0tF$6*yo+IiCXbAbDSs9KVWy9#*q%H5{P@(jA# zSs@e+I~OF9eGGC4yt4`|pcmd?u8}u*x8|q*3~FUfwc^Q^b*Kv?2cMtw&UOh2c=5~q z|Dsg~fEX;yd1wg=e1SX-V;Q3K?1;yPW+UHl(JbD@JR`h{zbIc zvpd$0dzyuoGZ`$!(9V*v;F3CmhZ*Nu|C3QRNi; zg(`<9$syS(3R#AX7g2P+Bl)3(u|?AeRAy)3X(t}l$Z@Vl%@n-*Yc4?j%nJZcyaT#& zprI?r+($w3WO>$j8wL6tNVfskB!l~S5FujpkOMS5G;Npn>Do1=sK=$E@QZ* z?nGb=F4p14pnQ;gq3Y?FBS_{o3=^CiLVm zc~Bx>)G@9tVqCe&~uz)}B-i69m<-MHZN{ zWm#6~k&C9g&B8M&$TLFviZ6;eQSGa*@f#4A1xlH6S^;<^XM=lI1>Zgv0Kmz6jl6G~deMEzu}7YOn_E zqebdFd30BWNih`xCPs^zc-q|G-pn;#nMS9i(oHxaB-vV8rVGCdlm1^2Am9rNW~3eS z4$b|xEh_1Qf%qdM4tV_(j1s?TY&`PSE|gn2!D}jtk0wsI4l{+7?bu+b!Ot9aCf0(z zFHHRrbjPeEA$kLOtNJ9>Tde^m2CdsA!B74D+68uLY!*H#ULpu%+)G8Pow=;gbomQi z9}$R-GqAH~v=K1|f>>E*oAJ!*IS^tJP^XWw?=H!Tmye3?A?;5%))W^5le}6pO?M6d zswW8Su$wHsG7c9D+PG$`uYz{#$Q4BMf+kB7DDl{(X7wcHMQB3FR}mEM3i>2FA`DS& z+{7qauG1wV5y|e)ojozo*|V7A*_5WuWA1L4L`jo;tJ@*!;Ak?AO{z=NZAXhaTmx|$+DlF5x$FXw8>ZQsX7+6mnYc(7m%)?5BLsDHu>ZY zBcMjIyx-TG!ey~|!;i$5{(quyBp@xPqY>HAWJ6cYca2OcH86uPnkGq}h#nS=boET0 z305>odKb0S1Ju`&lp5t%SS;XmhMyOF&Ax^I!DtLLA;9p$PcvfJsegc_MpYUa#G zWkWlpuSR3aG+*2j=1U%VADFIKR(rovTm*o5Z&0#m23bShAL1^Htf znR^Vd>!F2bHT3g*eG5-bj*W%(otnnc2s2``;~EHk4}8Qxx^-ManjtyscpRoPABKQv zz`sN=0cgsffd~#}G#qElB0+!kqtAaLlZ>nXtRngI*P#rpojkXUFDG_@R?|w8R-(_7 z$5v{;#ieTcTU`DR9X%+xj&$N6z%E7%F$CBd9=u7!A)_^c90tM){$b2^oqO?w>Thwy zuBKGo<+XxEU^+pi@0Bmpu>NQ;{f&$a>Bc#%BY~?s#LNu`Ds-_>1iZ-p?K>@6(sQ^G z!g*f&)=b7Qa3{Ry%XSRnl92U^FVsHDqiT8i!l7WBxcnKtu9K0sUAUvry$wMg z5GBh1zqHn|*hDdGT$Eu{z{M2vupL1hpbB2xg7L8dSV z2qATq0&_D$OK%aAaoN=%m{!u^TA0FytZTyzi`8#ChzYF&R za=${W{rnx~utI)zR>;B~GjZ=n6d77h&lKVX{Ne2O!hZCgzIkqHvb{Y`x3g`>6!c@h z-yIL6UQt}ZMpb|@-a`)DoOi#k%Pi$K*HswytcbR3p+{5)0xN1=E#%P8V9nv3|jUE+Fjchy88W} ze*7ux{0H>+R-YYz@AAaMWi`KR&1 z*shODB?tR_rExRwan$3=JEBzIvNd}Y{Jtdf0=+6$7U7t_8V9-!kwlR#ZFyUyuR~bn z@x-0)m(p2D+XgS~CJh>RWmMNrrv{pL)u$loWIGNPnL@>hQ~trn2{%e0)l#-FpyEVi z(;%h5IId`${8Ubq_z8(6nY>n8IMo^6l8aQHa-Xy$Pql*1O9Ot7xN1-Pt07@Knarfl zeK(48pPTN-5rRcM!vxl}faHEdo_cOZXb_U$w|QR&@lng^wn}_SfbvGmUS0yjU1j+c zaXnk>XAD=nz1y}V0KXZ1ePn~YuSJs^R@W-tFBV>6^t!1h>u_vr39+QJ@kXfJhp9qS znEK|dLu|#NiU$TD3^3mT$i8{2`4zjJ_#5>U-`inWm}%)?2H`c(%o9mAlZe`f6{_~p zyFae0uQAJxZq}BT4bbvL{b2`sZjD3Llcbk>UcKnz=5ImuGWfq&T$pfap>woIoR*i3 zuG47&TUnVrdqsp6f|sHcj-G~5!ESbRd`Svq%;*b4bjoUUBV)L(H-d<*>yjO%QXl%u zRWsb)Acx#od-p`fM54+}U2z5b3Gm~JjO2YCx-=?GUC+OJ=zY@2#n-;|)2{bZAsW1K zN)sMPSo*-c2LJ9Ve>?H*!5Rbt9XAz!ArC6qMD@Ez_0prvk%AN!azf^1?cgeS$kip zpR6Ucfpm!jup!t8y}VBx@tj%m2LJjnNVS6H@Sb-15#UDhJ9mo8_67^ zdM`tee=R!}kwH{ky!%PIFn*?e?YHUuEIfI#`Q_LaLi$`9+o+OcA}kKr?q?_Zk`kN_ zp>QLISePhzMVhv0U;Gd+DENhQd7Ux&DBGy%95$EPbPj|^fs~5y65e0V?*DkCfc7$M z_zj9khl<>;ZIoL9q$u+3DUEey5P_K}jOLa~?nXA2&e*^P*MKQ*EpB*mgjK6?$H{N%*w*@)rYxI1ZJ8Og%@3v z5Q8`;f_ePQ8s?NXQKCQRu{FOYp~PAYS9v+?Efjx=^GaWfvhzHL22)qvH&8$Jhj&km zRlW-Fa4l|2?7Rtwm^L!Nnh%v!CumSoW#_QorCwk2=qN<)T`wwnxFHjYS)3}Uq~=c8 z@jtdS5e0Ph=_&GMrB8M_+U4}HI+#QO&O z|JMWOy3Q;++pVF*m-7y<&0xCnsjTXXTa`<{hod>ZXR~9Kb`(XB;ZjmA+_K)Wd<9N; z3lu=u0Jp@yAPO)mtT0>%fsboVzNvn~149?Y-Ul6jqya_)4g+H^opa+#9i5+b(J%CZ zJ}5|+;IaJspm%cMj-OuJxEj-=|UpJnOu#Tzqwd2Ha+`K`}PhwQmdyTO{x!s+%B zB7u4<S18bQ}9g za+bh8v-Fl7@{);|{|wu4DcT_yH-6kko4*E^cZxiuB|LyBtHEFJeCez(K{=9Sw*hzK zNj|M5EJ5g+c4*;;;6Z2z{sFQ#Iv@H3dYXX#$JnbsquzKwK%6-9 zpfHmg-Mf$KmBbct4fw*Vqyong-cWG3au;2aSnYjr#ebQKE@|E5l&mGR^?XH#{l5a%fxeR_me}yFwMF^_@E{uZQN;(z{Z|OR=G2+` z%T%b;L4H^WC6lK~@}}&aIdl{9F3st*t&%pb5jV2etUa&I74Vd{+0UcXNW-E;(F>wO zzYwcw7(L@sMKC6C#OI_9%&MmSZ3Bx;(=0*PX@S9iYh_cIN!?i+8dAC;vZ<8%nWMP# z^ezIVz?ALm>c>wF5yEH2Cy(E)o>^!YW9MY%*h)Eg44IL{9qz zO=J~#wr~s3_ZS?_2D}KM9@FD4)rq1;4xWq2ZF?y)ZEUwC43h?@`eq+cmNYoC%Y|DZ z$-hk)doGC@@F<+c%KNiZYPU!7m@Ry|lh$M)@pOsIQ~9>zDl9(7vHDh~eD9{?T3Iz= zJ&$aa4d`Q>{G{n5e#$Dl9^-@fhTR+5ZILQC{$Q?VWGQS5*4MnNJ13P6w2oT3x@Og$ zR3f1XY0#a+ig5*QB_aM>T3?RU1Sa}VUTF=OyiQFq#8rO0? zek>kJ%N8}OW<>iCmyq>38dgpv|4bPErZrl=+6*19P|NMgc>9x?#V-A+n8Y!D|-Xj9{Q zGoXo_2QFvs7L?Rr&q{LXS0PnZ%nW=wdfG0qjg}=eV5L$H;!BzpAPXkFy%vts?A}we z-<$Z^`Ejc8h-Zg*bEjIjkED?LzogEp$s4c|tLd4+E`h7hiLEY7nx;{qd^of7;No0= zD>r+#Q>#A@*e0W2p!*jWq!B#EYg?6^>6z&FpdP#K2!%!nJZC zA;&s!i^DoJA!nf}!GaHcncJ~EtCoOxf|X?wt#e2oT+K#Ozpa0%9skR@dz5@S#)V7c z&^qfq^eYM2%N)ngh;c~qNpaJ9pf4&6H)S={4 z^fkVRVJfu^8*NmNGC8};Gi*vf0nWx($Dc1k3MXL~Sa^SOV^Jbv)95v5MX2xlz%n?`m8#+u0$>!3pKzxFQC?;+W_5?MNCKnOHqV;bz4}%^_1NU4+ZTmvm$U>)a~>jG7W-GPG0z7Q6B*{ zogGNX=QykM;UXGgunwM;Y@`z&TV%fGzLNNtvVlJr%&hcdX_m7_ zvcgm>OKxvEj|@7)Z)C*wtyb=U-+uZmUS_r7=gu#KmsafcIRJ!o9r)8H!(fT-g!F?4 z;Bif_q6-(s<64o++EL53tVvO>u|j+Z%#~jJFT0nhmLY55<|TMtVfEuROIn``qc@C7 zr#6KZRp>j-@yT;RS||Tp)Hgx9bAG$r9AA@F;5G#hCQDdkO1Y(=i($=Dvt5cJZ0SRZ0(S> zO81olet-I4v4W1Y-)6A%0^|j3Y@$*?P`O z;r>o|UG*LJKeCltmUZ1<7`i^h(62?rdynhEBrR>x{5Ubb0`Fue_ggIvJIv%K7ELy+ z=N*yx)3&A}{#PnfyZYZ1>u7U3m%Yj7XEPu)%EcP;k*@rOl569PFb`yG;4)L@K; zPW16~E8i_+&5ZGc@0Rq{iuU`1>}=6D@>BlFe+0JP>#VFhc>Dvo2EKJkJTLo2G zyLcqdLit`8R{LvyAtWbdsU^{+b@Xw7fD+7jjv{)gYf zax2;mqf}68m}jm~d8lJN@|ey?27lytoXp3E&e~KM(T!5`&AHj*G1==NCs;rSi^PvccBT@t;PJSxaC;;ZyR?^dK z1Twz!rql5{GB)ch8%z###Dig&EhDuj*z>M9nhSNB*REDpWA_q_SXN*9*?}ni(e~#p z&tnF6vXZn5JvBr$j0#c1>yN__QW5U#6$IW7psYnS{jHE3d89$7B=y4yJ`basC(22> ztddU~xfm!Dn0^&0-GcO}Idl9MBEvsbaHDjqJF}#j#Az^!1{pN8*2;lPjIF8}tdm_~ z3k&&LQ6Mz2+UGOtO(8TeR4!UsgU#H|q}*i`mLN&?P^QL9UL*+ouI)(z2A==S(E z_=lH9l)=}!4sn>XW_*eRTt7i#P(QK2uFS(^CTZ}O6?Q%Q8Xq*wKwgJmT&Z4r+H4=z zOu!rw4|rK|eZ8<|!&DDL2oOIHPKUKDJ8;gwzkF`j*v?lDASW<&>r&(~)eIc&1I5{r zl2wtMUr%Es2jL#kv-KeBVS3F>4y8~&c+)lZ_tOW?4*I5tvOFEe|4^?A@D3Uw>*GX! zQU&hnY{6(;y19mHtfE7OH6QK*dmT2g1DVr_VzmZ#E|1n|mC)57Qp+S)mzWNHuicTm zV1uCo4cH9v`@0bj(*-f#N3?Fdr=|RU0XFn8CUBeIXvTJv3*f0B_qo#$pk}lk^cy!VPGoR23;v;W>B$%4u5DX zLhTUv0<)jlW;3%MU&^$ortOKs@^|36B9b-K;oZzm_yfn!oY?LV6%&Uk9{bt3@oEfj zXuZYxlu5l*#<)uRPepx(zp>BxLS>QaI+o?KC|9SWR!wgIB z@eb$m%h7KAKkFfMT&TeURDrD6ID@R%>~)$A+2cFf9^_a|8v>S;T-XD}m~S<1&`ysn z(vqWdL&xGP8a+@*BDhq=(!{89D#fJ){_qP!ie&av4^suzo!O7Rq!(PaSjudW-1&z} z0n})zcIhZ(nR1lAQ@ckE4B9!c^)9Ac09=CN=;DnpZ|ghZr$4aKct>a3_{No*>fUZa zz0T^c>v#>PC==zE-Ae4bD$VaqPk?@0?`!8qtoFE*o#j3k+bs#|omhbnZo}Ia9DW3}ooUDim>7`pygPD(a>28yCg>M!?sdl1MB_WB z2=%QmaTm7n0U)W<*mqZ$zXb$icIHuitbAWWupEH~%SDIeA3=wV>r#$|%U6GO$#lrJ zVOsfn&c?GEV8m?X0tqLzCZox$o!vi%gy(*bQ~dolD-+wu;8YmQo&g0#9>_|ynVGFJ0sB1cM%DI2+u70%z5=4;jhQ@(S(S5+KA3(lXl0GO) zgtvFrZ%7_NKd_DM%){QxOCqYNdwWv5%l*0m*92fv*(-a}QmrE2(S-jHBpXZ^2eWqt zSB`KU)=~7GxF%X#VfZ)gSPP5Tt+?8A3uj}92Xd}Qc|14>H(1nV?aIwzk`$#?MmihD zpXij;5wVM4P(*g%#P&PlL+XAWYB(;4%s$PpM7YvWdbj)k(N?O4V> zeAi!RG73NVRbDOB@)-Yv4w-MP=X>s82TfjT_QVL%O<2#%rek5z#jI$#su!iRou}Cc zXA<4a(He?Z;K=r(!`^%ss!4PCCCLwpH|V8#KU7(`4*OUom_T0bpXXpxu%!?SN_vA$P@+1Hs!C%|Se136>hJTdNIn zALf(qKDC4lJqDs!Ol=@M?@tp4$L1QcY9ymx#ep-G%v}^w`pDBd)1d~cybvjhayJ^? z24Y{NSYI##ZxPqef(Vr_C_*C(s6;h`zACk?>}Gge8)kbD(B4xGj9drm%!Fz5ajUU& ztx0^^Oey<-Y;be_=fPc&GDfR4Ic(5oH@k)JbD0?u7aWunaPfd!F`nf4P+?qK%nu%1vM>aV+4Iti({T*}&84|Te0ScIX;KAwD$3wJKdFT=^+_l(LE6eMQ z{oWVX4xxt!U643<%4Et)!?Woi%PRl5c~C*tb9@QS>qa$WTotDr(#HJ_umZ;TSAQMK z=Zr_+;UP+Q>*7!1(b;UCo(LkMQIUFAMPOkdVN zn!a5K6mvWFUtl%V^ z=-iN8i0s)Iv~~Twb?e?#8v(tbK4zuLk?%znhrI7 zpfEKRK^hpjQI4UKmN1j)P4-BUq$0zW=U<=EnpESSid}Q_=Vg&indip!oEn#!YmVvA zQ(_qGv{f07P{EW^k~y%q{VGvo!Z3<}Ha|Y_tR4S{WLVJ{-3E{E`%?{eL0+ldpb%P~ z)=1+uMD`|F!6llFZ#HGcK&qz|hTj2i$0)1o3*bs2d!jgiA3b2_=MkS@FLI5?5Hp7M z3|2|9Jsa{P1~ttuc~tUSX{j72t5h&x>{4+Q& ziAEo|0BM->3Ahz;ZpG=#Yt)uFTF9S{;O#Zxu?|8c(m5U^XK(N_%z;W***rQRf2Md^ z1qw*jj#whH*~0x05PS5FEWx(Wu>C^_LH0fR2(he>Fz6BCIQuJe{2CE2>AVH{bQ7+~CR09Y(_Sra`i7Z^rp#||!=<_J4fK== zx^ed}DwhV(0NvmscSJ6u=s9}eqIbejQUs8Jj%%&I%j=k;+uU)eqjeFIfZl`Ia)eAv3I-!kl(QW3|#}Uk8fMZDSrZI zgnn?ATahfv_}8^SW% zLwNQs()^F)XJ#48PJ*g*Q#?9Jt!kO8kl$P~O9p#Fth+oI4$Wb$;SUit^)<&#FRdy& zWfPBpaK{Z{0ad8nhDnE)k>fz8tIu^IHj*w>sE}hiRH2!nI-ikZ53XtN?Ac*wjdvF! zr>3Z7ysi39+0L$~-~KiNNSLc7-jOw`WBGEOO1EO{rH3crdgrI}hoK>AUtbcgQ_TqN z@OisD5BJkiAfssfFr-WfykOS|z{$#B<$1uz{wg#?-znPAdqai`eFQEI&;UM!s4!Xx zXt~Xg)#%cmU#`eDQ-W#Hz4*d?UKRHI2|4?lU;}$Ug{}C$4<3FuORGqHHL_{=W2zA! zp-yB6zd@ZixcZZ8TvG+V!U&f*rElBHbFS*zwKlKuwY=-!mO3SN^`TRH0RPcV08mb7q zkg%C|MxEKewc4%(&=3;@d`OY<4($AX#(Uq$FYvnSG8_PC$ZnVTAY#xW5hA2H7%q5Q zuv-@-CopDci`ip#M&YJIwU|mFx%l$GAw36fetBD8Iaf`3WJWd#SyOppk0&MCir=o^ zi$VN$|CxF#w7@Jqzj&*$d0UOq>AI)4a&J&piJ+Qm%1ceP8X1!VqDS9T#ByWXGS}&= zeCx6Gq4v>S`8N=pgv}(9dY`S>aRbA*Y6G#|hES4%m)1Htd^}6@W4Gcg_VWcigsp_G z4Ud@{)en^Ne!a^F)^794(ZVMt99JBk#{snrjSrQ{bl(9&6(M&no*F#-^ns;chVBCz5HuUpL=@j%;EJ^jbAI4MxmkuU#f zM>fEhDz!+Y5dE5$3ifbX-k0zj+n|NrpzqX(>Vv#fd=B!bJlx5AuJC<_QgV5S4mc_B&mMcerVP#X=|mfgmv#`%kt%am>zM zg>7WWKyU14BJ?Q!p73ttRrq84!!jh&;WZ>j37!dEG2DdKP_yyJY)KN7Eb;j8V-xKO z8&K$6$M&0!Mvky0$;Djl`5yiPAu~;^lHqcF7svpOZbPU9W`ZhCRrv0L+-K5c%} zE4+joggoR1p+%`9=!!VCIXJzIuGI4N`!^#zGGe;=^)$iced#Dl-^Q}PEsz9ZYWqEwUUa#UMpB9)#0E`Cfw=iW?fyQw3csX3p6MCE_Zw$k|!sl^g zc)nf!$E4wGf#jGu4^XpIk8||rB0x9<=3Nl%MHac@cDxJ|l*=+^kGrAAy2Bk;0(L`2 z(10y?lAMU6aN@PBK{^r+9f5fBL3@~k|LaTyrXV=}Uukh1DbVghnefx^5{}URRUHk= zr38S2fmCr?98v=mhy|fB1V8}a;N?m2cyrir*B=Mrv{FQmS!BPrZpc{H(Z?x#q*4X> zB`Iss_@6d)FC9;y=Ru4sbZs^3sq(5L;uhh7xYF{(Aj{)lG-h(~qI-q^BkUnV9RQfr z?PB!e^Dja*%y$ zcqB!$;5*vHCMkk3zrU*fWDHaxk$)ohwhia66aRNG66GN>OL(9LSQSRF{(&a(C72m~ zC${i?n+)lCKJGp5iATR?(QMFcH zk)>OMcv!HEOAt}S?6XEn{1+8zV{@rRve z{icJzTe!O5Wbg){AgyQGYy>v=i=U+jSzhA)(P;%30}W(5vpBp4;lMElzMZC8WlW>w zMm-pHH&LvI_kDXG!`s@r01F0qRU#jwRNWCj!>~)sJ@oT_^$BlmHn2}}tQOz%aG|$v zU_H;d&qkffit;nEi{fM9=sIuQXmleKVP_bZ9)`M}J9LpP%7ra@PBmjpJ0@q@bF-`O zoK$m&5|&2891tC*n$EHM?xzrgI-BZuw#@?|RIkjb-|7mLIt){MtpMU7{cj*1WDJ;o z9-6nf%?PnJZrpv$NHvsJU*V_eB)5X|pYt^016T4j;ww~BiRSF~t{r6n`7ed4Pda%@u-|;b&z2Yr( zdRlAR*8^PrRw%}*IOIIg+M&35#kDRoF_9)bH5 zp5ey)?~EP9L+5?0Abd8K%Vz)~Br4;UY^BUcx%u)4GIJrq{pA;V7*NFw>~ zAc-)PeD&$cBk`$~yMSd{4CTtsDXU=Yar~SVIT$*a*XFELv8=1RfCBfpVr2WfJS9j*R_7z5dk3@Qz@Xdj`=nmBPB$g zjFXK@2cSVNbGt@&Ypw(^XE(dm!5s8+Mhj1CO~zU_7reD7jv>IFoUg?^0Q2qfuw}{| zeW%d-1rbev5ve7q!ub@8w)~jp&v^g|mUkdT5yM^GL?m@1bp4Th)ey{{_0{}S_IVL| z$1SR@0-Fb_ZxjWfgpqb)9nE)pq&ZS34L~?YAEexHO$x1#1?eMpl%-d}z#X|$H5UlT zh5iJMFxLy>qhrE7gVaCGf0!@m5F&y}antfHWHu*mL=d7LA$c*DYIH5enva%nFTDPx zrSd1s(yciD>B23JJ$r)RhX$rT`!5^lS{(Ju5d;85RvI)}C(R9B3HYEOvZ>L)%;!^( zc|LSWmVEvw(gOqPC*>NV7pJsCUr^xgjwg+OQ|Mh}(5=K4|dyL8ii9kli7 z6@qQeXNrR*g2wQJv!kz{x)nk>@0E!$;5e-V$LX|I)^euT^eo zv%3)lRa%19nMJSGY!?>M-$n|G~a*mMmU57G<-14oi!*k^uOMhMk+BA1sc$@Ulr z5CQ;rymBa;??g5+V=>3-o@ig*G&I_%VX_fHT&5o6%M>&JUNjSbWsN`CX7`E5hxc9ntTm(#0%S+Cx^mJ zU8A$ix=6*7-~9l$bFK$233sbzkY~gW)%FJGmy_`mPcEAasr))i&$rsc;fJR0Da@q! zXEgZtJ%n1aWfLBg3s{WU)v@^lG&Q|CW}Q=~a8=z&tjm2WhRzyWEiO>_qR_|Awf=K!zm zCS7N3born<%E6Q#v7G$}z@Zf(cbf_l#pVUG0dm`CBakc}6}HVk05R=uQ|wfljh7T!hl{nZbe9q$Jf*bzS>dXFO#Xu;D*1A z+qEF_HV8h`OVc6$L+oFFMtz7sk1(y_qC;tU8`zGQVFlv&^RJ)m=Qz|PJcfRG{A)f@ z=C23|!mw9uh#t`uO!E{TPU+1$f>mNL^rnRAds5jRfJ6*m9!pz`{U^+3i(~&SKv?WH zu=9z+*Vh9_J;+E=6vP7u`Uu(kz2$)9QB*N5FTqXb=Pzf@ zW`={c?W&i4gnM=up<0{NdqC6SC9tB)8*4L5X?_J4Jc*g3zs>$FCSj+Ja4(Eix6U(* z^EXJh$;P4$peD+m9AAmyU0o0S6cwJLc-K+NG2)xK4=7FI?hU5*o^VVG&J^qxNX`xUns$H zV|-|$oVI4kdfiexvCEiSzk2&md%Y~^R))CVuH@je7`{VmD6j`;IE4}9Vi>t}GC{}R zo$X(`4!s!FqeLN0Wj1(xRi>_&9lbK@ZcegK^m<$fnX`OsIrq%BC%T$}h@TpLOlm&J z0&+ui(9!uocz%FUcsR0%^U92m_pheQ01D|!oHbyw914~0C>z-C>NdDf1KLOu+qWl1IqxWh>$iXxg`Y0yYVfaL0IQZP zpFMJR9-38ze#2~8h&-&W>3~RL;9e4J=Ma!**mXf_#ogYw9 z`X@pojFy13@xoi9i1roSRFq3x?Z;pH8~KF${Nb zVOdd_qmK?IAel3wQHcwJ{|gn0fIAd~jgnEd?@PUc^s zt^_B1xa|$7;ItNyN?M6wtKtSWx^8bhL)n&VrR}#B$Sjyev}e#B$>x81=u9j7a!TXs(HPx@7&?yK=)UthF@Z{?YSo)Q&H;KNg0mBH!h*?#-Rs5 zz|RFYq7a8dY|9;R-*o;Ix?4=9zUXj*u=MeY*W2Q&a;4UNDLS8N9!%qOEdKx%e1MZLy5p9WKJu8I&QQiJsE-nlVdZLRC&68&ih z|DqIGnRn&vfbxe?&9IBnUl19vKW6?lu;xdB`E&QoYS_yPsJEl@o57B_RT1${TKYft zQLh&@Q+Rq`W-Z2+=jE3dvLWD<4{DT=1OPGPG``HtYrP8LD*f4Qz>WFO^+0*0Rja8 z6?n4TqEZ6Lv|eFFHYsLn@%K2f$GdHl#VpzeP4z9jAau1rsv-ty^(nW#X{u zrt`LP`8vQd7*?`fQdk37Cn0VCTD9I_G%uh>MNl+o6bB@Agdy&`jc9{E?@!e1XY<@K$NG&`V_v+fTYKDu6%{*W}_yEWl3Pv(AhHRL^ zq2c1r6+@G~4!ES6wS~YYd?@vts2YUblTo z9DT%9Az%AD6Oz?TP!`{RNROpq=JSn4@2NtNH$b&LC)RX$A@z2K6CR|FgzFYQ>JdZv z6>lba`YF$SGLKi7*F3{6i`FFVTf!l7EZ+PD%9KMU9`QwIfv1m<+$K-vYAV=E_Xk7# zKIWC7vd$OJSG|tFqm9gePMY~x&d>emb#BEYZkgm1)&&7fopq;jgteTTsglP^3o;e+bdf}_ z%0C$fq;;eV&jh{}pqIZSQ-waB#W_^~GI;TgaM8ej#z%;TOaK+q4JMX=3iS59lAZ`R zQ;;)pdvse?Ycd4bfLG=q)72#*>@DMjitONLOLh3y7R?u4?lr1MEIMID)|( zw4^}#VSoR_^$PYeU=QO+#n#Gx^eGxn-~JIM52cl~ypdz`zoC_Ue`oMdDx$EFq#2nU z?2TxQ22V-|nS}#tjORUlK^}m8L}L{i7q@UUP!7S$AV=X;d?dI(+)vTXf}53$q+EDC z>Z&#FUc2@KomO(SCGLCI`OF%Gzrs#O!yn$-XWWgF_)ITM<5NPej$dt5uSp(Oh`U1# ztYiCUM{)h9%o{he@4?+DI}msZwb7+VaCx}r&PQ?LS%xjaD+=FpaiY*rSvA9q`tL=w zIHU|LP_~lz^?T3T!-8h=kt?|@ZM1FLsu}j*c7LC_A$z+C|5oT~ssVUnjt=H*Ut3Pa zOo};ccl20&4C^15Blwc7LAxO(osqzL9)~hbxFx>Ty@rGTkep*Rc92j7l`&knkU=y> z57PUGJd<0=NzNKTrYg=*0kOwZv$X~y$C4*nq7E+h2$Y01Tp2-GJDmpQQ?GI{60v*- ztPiZF+2X0QO=@wyw?ibdK>0-utxTl=p-ShIE8%H*zZ+i$Y6d$2^+NAX~$3)hxlK>IBRZRk=kU7Vz`{J{L|~(j$HI4G;Rv(+4$os zO5ndiz4cyj|IE1pP#GBf-5jJ!HV}hRUI^QH33$<{s!ifF8dDKGbFCdc)FOboH=N)S zzYWQfJ4R84Ty;ZMED;p$Lr%Ir z$$*q)usytR9mzx)QrxB|qNVx}Sb+Pgwjq#6MlcGcoVA&t8xWKszo`2wsO$k_A}B7WZIHlUAPxKxkVKSwrbGql_I$NsMCt(;2~iKMf{>rU%P>1?bdt=~ zg+ou~^)v!%aGB50siWkgDub2}ac1`&NaCo>mTtV+Y&w*nngD`6I|feEz~_J&ox6 zpz>HNk78aQ?MGClD0JE$T~S?DFTlA{0t{t-7yR!TEQMqS!eGHJha8FmcG)6}d&jEz zU@9Co`WwL%pzT3FJv#q-<6wGU=;KUJD@u)T5)p^4kmN?BRpkqbPO?<2=*h^vC2K*a zMVh=LgIMC>7+G2aW=oVisl`s3igfvi3^zsd0;P1g84xicEfp~lHzER3ytS8r(gz#BEcr;H47UL&A{mb0$kC0=_|>V&>51F&0}Qi4;o~C9s_h_qIyTCe zQJAD<$!V?4_B6C`9LGSGPxCf$b?(;HeIQ)*GH2!aHnRjf7YS#|ej{@tB1jFvHH6mj zc^pP>DGrn3(qMSo$J)e8{nYE$iX7w@#Po4%e@I&^4iIct_j@pMqY$)J#($CWR!~8> zz3sJ1jn(@v@v#H1YzMPTxxZ&S>>dKs@&=y)GI-Eveos8GM>kl;8bWZfSsFBWE9CFy zUd*^qf8~gaE|b%c+BlZ8a%!g1OT&6m4g}~@2z2sB?0#QSwkmJDwJNEbAJt-X^j(Y7 zdS&+^i=M^9GLzdN?&qp-&%PL3g8;|_n}di~uW=~eIS zT9^7!`VXYX%J-fmyc_0s>2cJKW4mtmEsrg|8+T|t&p||e_#iAI?EUBn#=Ew+T6n#^ z)G|Yr;h$1xT5-X%?Pfd)uYrbF=5<+O^O|sT!-~B9WumS*Az`-X^iI~?KY9OQzRw=QL;g1)93E zgt_U)aKVCp1V%Arjz2doC=`$-!ks+4=HY4FY}uTz%{WfNo15uN!rSmzlF&K-a=t{^ zuKQdl;!+8{;@RwlTjhXTS-p8aJnLshxRPXQu>Y-J=UCHKclN}MWs}++huY_6h2fHf z$fi}HRdY|TnCt91*JUtRPu{ki8do;%y;~N4ZyNnvE}v@^$u?`aJ{OviT4p+wXi@An zAKi-)+C|WN_ERlkk{P*D(;)%>H%KVLP?oXaIL1;6w#p#bc`(5MVey0-d=@?rYGK}8 zzJVrm@12`!nG4_@<(hm7?_2ubb3Y)rLJP8sw zz<}h%|E3~CKjxc`*^P87C_l9Im94TM^xfmHmvl;54(dS6eWIZ7zB#n}zM1ohC2t~s zmO|#0cZA3Nt1ggi!|>}{XjTXl(yanGF}Tt~z%9Gt(|(Y`tn-6?t;ik5X5^=~E4aOv zOw*J}nwL&~i;yZ5R(5ljE4R({ljpc=hh{}teYnFjfyCUNsBtd2BC~RPNC4>1PDGPu zx_;?w&GQldX}gP8XNfDQoa=4j=}ZplvK}?Am{9CjcUk6*jVFz34}KRjys)U4BR7>gIw^inzak-pm=bHy0OJLIN<61co19zobmk zqFhDwgPN$zl-u;3gt+j4EimAUnf&UppwWCH`HuvC4&+RKn|zx7)|_d43v>C-iM;xg za*p|jQHh;vMJWIRx&ei*%t8y1TOd3PVdLgzzHCR>AYG#|L7Hl_VcSNDa)CO{VS)>P zY1ti^&9>ssj%xXQ-xkp_d&nicR&*CkWtNh0-}2q3n#0_dsT6MP5O=Iwo$wXR;7Kj- z7w^2x+oogxAgY}#*tfcBT#wW{*vVY4daM%bG51c~%;VZ7%d3=A~~71G`NH4vh5^64Lfx zoO{QD&R2S5q`II(P|*9k5Rha0HQzd}BhqZXdq`dH0`4c=-`F0*A|=9g8F z^^}|*j_AD5$Jg+Nto>+SHoAkSLB=p@>Wu$@|3kXLNp*ypl#A8~$^z~W)2@d;53%7v z{KBt0XO9IX5xIBqQTtO0vE^?nV*eJ|1Rzy&G%Q_lhR-R)hHF7+(PBFEEcs}osTPM9 zMpsc0X)kYIF<1Ts7ioTpy;(J*M8!%u@Je9j2_2(JTWX{yP^bt}F^}@|m%LEX%8vSJ%4p>Np2NzD_U;_=8wZ$UXO2nZ{ zt4OLDTGSsLfQfWF@_L+npk`os@%1rKPxqWQb@jQ9FDWyw_1fC`q^C{7ota?1lyQjk z8iAQjECeao>_R&bVys))ZJ128$&z7O_VZ}lY}>Rwc^A$vX;FHHlB3^v7{>=S1`FIC z3gltsV0s74+UINr2dl@@>?hmyaGkWgc`@fDLIvNkN$dx6Qt~L|C$^Yw`zGqt+2VAo z%y!^)mha?GVGVk7jy3ECi{@G!EO@&6Ry#&VZN%-HwnP4RAEWBF+E@QyXfzxtgZY!` z9O2^v%OXKC6ay+Z9ZG-{qD^bO8y?XoDv9%aq-3aqEaM}cLo&kV>Ji1&h5Ri%=(_~< zrYvAiP;CN@o+3c$7A_DqhTY`W5lTJQv#b95@3oZF47<^cRM^uUxZQ6E>{wkWJwo-{ zqRxMjh{*aFVBx9~ayNwA)}x73h{kL5SI0*{VQ0W^buOZ?b9fo(!jSkEJT;M}h9)$? zQnNspS|YW6cp4}g>KWN01OLNC!pANe{?2QVu>eHqj^*ddI`$`9KWhCrt#>Eo$g}_4 z7PLyJEUtn(U$cNadrRWR;!8aA{$n5B_@4I#&w!Rxi&7?b%JNN+(+Y4yBIRHiW&(tV zo%KK;r(y;oRFm*4NTOWOpO7f${Nc?2sl2ZaL}w&4I%^43YYjzA2Fk$RE0-uW8GYJb zd05qq>>LCCJ8){k|Bcq8Yqr|8_@dI|cP%wsO6#aJP{6X&?V4)Mg@iGF>V;mk><%B( zy8vCaAo4MBq+LOHNS44Ix@**aF5cAvk-?fVym@CK{VEx_I1YtiD0!a;m!yEm3{s}p z6>I6SkZFcgE@xHj!M8*DRn21hRd{0Ei23mWLoa~zg1(4AA-yOcePa5v@N7M5VE}@T ze}{I-wdzdwN;quJO&Ei9H$1J;zM>2?2y;I}d;w6YYP2jRX(;P7TPI#t#i13S$*cdS&m7~cgbS&qDS2o)BX-@Zg`_xR zAeQjPs~UVnUj}<>Vu!TYae(IW0L>Gxx#@3_0K%z+e|4dhr>=ymTU*CFhbxnLP<&>& zLOpuq+v#mE1gq0sr^3*Oju@}q>VM!8JE?Au6XAD}*B^P$XuUhD19fzerO>vRhXW;Q zW^2aWO$K;U9)__4$SUz)^VQ}>u%Ki#tWfW>@tBt`a^^W8l2c(ONI*n#wB3?voe@NA zV6gj(*MJqGLdUR$k*#JJhA{3#D>2p= zyj@PA$o_$nUA&!7#*sr}p_C=X`>}oY+E_K!m{mtq!wnwKe<1DWWQ`P_^UmE;?c4j5 zYxs4jrP=}vg6eBG%HO!?5D**}J%CIKfS(p%vDkrAGq3JSg~6m_k`0f) zNVbqF^wfd1(bL4THG!Flph1{$y6+ChVP>Zt$^!GTXh@CM9Pv{ddMB zucYPJJh#DA>ZyKjaney8IC^77c`t>JA%HAv!conWNyWYIu2%lQusQ>_eG`=5s@B%^ zPN87V>VX&xZz4L%2WV`vG0*jlW84AUsj(Wi$fH>|IS=+1%ruz5vT4}_4t6>ex+5r| zF}b&;g__rnXyG_uISY$HnK$kQ=F&rwC{~Yt)ou?EAo=}}6mC6;^k_0$y3*tTyeuKz>@X;HCgHbDYBs2{kBC(=t8i;$m*Y9eA9$Rp*#$K(g2mR+c&bPY7yru+fOOZJRU zSgVcKI6iknp1QaM(WmNBW?zc(0wJ;SFqr34H!`_CqGPN&RJ&=|(;>g2QFd_?AodX6 zLG+v6?%6DG!pNSiuIu7EG`46u`qLePcq2&5boLI2N5M-2qW4b+3w({AevxN}tTH}a zn3<6O)T1Ex{eRPN00zHAfI*u`JpTspI+Jx=<4C#=_{LYh$<$mF7_9Zq)v+i%h=)&P zahN(;c8Up;c)25fUXZQkfURaMbRa%3Hhlw>PM{N83*53T2L?S|%JKq*oJ=dnfdf#V zAW{#s95H6V=*h0|_(+48;xU4duku+w2%Gi}%BJn@>cb-5e<+$o3huuLR4KUMh#MY) z2<{cT@ns%A=)BwSy)8d3W8vKpPOT{L0>Y_1T*JQX(w~d*=t`hSJf*}zsEQoJsI>yx zC0&pfKFrydEQu{T>X-mnU|ckRP-Y*LwFyZyV3^ts+W3%KhGV9UfT^X^UVt*SYOM#Y zx{wT*6(X5cqk_a#^nBgj0Dg~|387km?+mRS#4 zHdr=fv>gSR9ZOEabcCMb9e-)3$hsA?sgfgjsFw^JEjzlUqi0jSWy4N#YGLj5WSUl2 zr54W`*k-q{n1h4*HK9MurEFu7AJ5CZVY&fC)D|&8?%L5#H>@5Ji6WqrMsmB}pL8$w z_Ogf+TduX->~$!CclrOL?!DuhzTUTSMJ-ybh*ohhY*G2t0V>KS(b`HCg<3>JmWmh^ zWEfT;2~ulO5mE;t0*RGkgfK*8PX{0}qB4~cWQ83dga9G%+~*xYrR}HvKELOAy`JBH zBH^8L&ijn}zRq=BcY$6?qG<`w6d8j#;Y60Hu5!oh+gn=;@3C|WYucF|FVszK+F#so zW8#{MpWUbTL5I953E|NTUEkTv+t*Ujo{mAAEdHHnMzn2K)W}`~dW^0B>?Sn?SFt%b zW_?R+Dq_YNRpqJ6;F2YzGx+Qn)_F67{1Ais*v1&*w)w#^8BM=r17;Wqm|=ZqZM1;Z zm+%p9i>=a-S3^EoI+2RHV(+Z`hZRb`5D_Sc{k+{3Qb4bFyB(z44!Edl45m9r4{D#W zGR+F4eV@xEOz!2_8+Qh6UneB6hObB#i(s7QN4H`ikZ&TI!XA>0*!4?>&)BeCHt6wX z^WUq8a9X3X<_&E4mNUxk+yY`X(70V_B?Nwlb! z^mcM(A)vxHc3v-?pzLn{rj@Y^kP7X`Dtw~Ms3)D_ zqB$%bt}VAbEi9mV%{`y*qzt^XX)mhpe7GD|ob3tRt_*2PRm@z^zC+hsEG4*&Gk)gE z&oqwn2yMj$vb~gEml&&dsuXIgH+~mk8kFXVJPa8lo-!HQYV`}fU6)BvsacZIgj7#q z=&KbEwsEATbru+Y17&%jkj3Q}68vRif2l#EF_ich~HAc9gf7;LfY3 zbc-7H9ewHXRW4eE8Gm-jX@W7)9a|Be@U2=scrx^uV{a!}GA5OOl;nH{2{f?z0%3Z< zsCL1BP3n~hHR(D^Ljl+=?k!&XMX4L12)%m zoBIym{1mZ+BA7s{8($F9uoec^daKKKk_r3pCiZd+_vnnvqD*|YUDe^eSYLv#yFwa2 z*$Qkiseov4aF5JjLk+~T4brEEvDd$O4ZNIP%RCGYK#ZsGYT>p#;geYkm6r`$&_Y^* zpY3QR`L4-l<@y0YCtjpr>n#hrh+6-I^(=cIjBR2U5PuWHn!71OIL}c32wPd~NJ%KQ zyL|?fb3aqZD`d2{6|plz;{Dl29FA@Qpi9QGU)scX5uRQ^8YTf53ovB|%N?(Pc|DFq_w#kF0uYeSoJ)a|Ofd8sfbP-x)Tyv@A+uyz9 z`x_JA#OfPadB?J;=}^Hbexqoru=Pivl|fZWI-p+#minX+vzG5Y+~+d`XJO7i)8VbD zPf}VbH*G3HIunh-wWt%Tmc+_@uA5<6f5xgZBc;a?;yhDf8`7=CXt5_;oY&5z#sPWo zMAHi@ijZho8zyM2>!BOBG>)@Ii3MW01Feg7Z`BK**oIe`vs#4r0;(J5Jy0F`9AlYv z0n4l%vCJe2!i;Hvm799f^i;I<)oSlOe(bR8vA68}}EW zAFn<=W7x3Cv@U{{$cssA)H7p{1VA_eAz|7haGDQL7NIGQAB>yOB0re>%K4$Jh3q-< zeyMDkxIJZ-7BImZ+gByjeQ&*#({XfnVbR5+EF{C@;-<)2mNl_8EuDx*R1C?1uDI5- zL*TUJ1@Q+w;p`*>EG^k0MG{|!071ZG-QXs@5M zxUKYnk!VqaCEPPShf} zI`ZiSFW$C?R>(~v`bJ-j8p+LNAWGS1(nA?Cb0&^|P^Wc&1-rtu^E%Vtgp+u9FjQ3V z?|~mkC;VWB9e#I7{AwlfIPAyrM+(YDaGsg!y0&>}3_upv%4Z`O}i0211nu+568Xx+QiVt@& z()r}eT&)q+K%)$`iF8~Txw*arJacvH--e}q4WSBoq(^dA?q0j&*|F0I?pF}}QV?Av ze3DT5?2O}*2H5Wa=h9>>QniepUlMwQsuIwKZe>qq}#lHJInEBv!nUZ z`Gu8Ow;2~c#=}(WC7VkUpOAfE^bDs$%T0m-lJ0zj?qQ>YrRUoiViONc-^T%cpK$F& zik|&tKBiJE&<#~LYtE|)G3I1p8+h)6*{8JNhEMPdouvu^V5c6#O>@**kD{Ec)6nyE zJSq~EmYNGtuP0YsW=d=3F=9}VA$Tx_9{@O7?8helg0UVyo|5tNHnyY>j;cbf=*hGg zu?KsH({_H06gkKlqy%?&c)Mm=$QVt+DH1%4jz>IEu;V2yv*s) zqGPPWNUoEpG(wl(#$}_iYbgH|IUC*u))DY0P^`T z9M=?XY&|8@44Ic-GMCZAEl^K7AVQ8g&rx%>2)Mk(9IZr3RimZFB2hJ^qA6D%d?mpu|yP~h(K zzdn1jJBB0c{rColY0Z%q0))Yz+w1*$_eZeScc$|FE*8^aErjp}+~*-%CIrT9p9aQF zA>Q?4mN;|XJO1>}gtB1qjlLZXH0$w*!*M(Dzvh+`JHR`N_O{#QkT1-qrm(jw)(aZD z7cjdNvBkR}m%?{-dLDrec$_4}+(sP$b{lyt4YAwqw{d~pW<^iyGh$OGXa4`)mcRSQmIJZy zyTa-tkOf(SXKM1AT;BJq624bnHuTrxLaZuQRHJu$E2@fh26JQ*A5`EoJ2ohg?pJPs zP%y-%BJmckDysip+1TFm#CA`&bXCmS=!`gOBub|;6v1AF=~ZtC)|IS&D4`ghwNbMg`tc(pmduy_MxqTf zOCy`6P%HtngV}M|2|;Ztoz{j7l6m~goLh9a!AD*3?_}Jd%XBExQGpq9e>6VVy!uCs*aN=Sk@3DZjwZ;;?X8Q`qo zyZmGXQY<@If}DgJB50|bZ(W>C_XVUww19b-_eA&vE~j1KQX0Wl>hF;bu@uuGE}yPL zR9T(t4K%DJ@`Jv~ZFx1m3yXe&6kr#~ONM^@-Xdo9=KzY#-)y|KOVn^fzWIjJ1vY>d zGCHSJH=j#;z4BqX$78Q3iwqf{ZBZ~Y*@-k6ddVY!eek-oW7?1oh3+!MG(_#-nUpPL z+zQXWzIR^cnqJP>GoP#laJ#AYR;&Lypa5ziT3Z!o;s8v*wK=5bzG!iHzD`!GyjbfU zpYmOPDLo-0?IP(phP+6}%nTLVk8k*SU-HQenM?*c)8*tRBJ_XhM@o`IHPn?7VhCS8lw*1fafoOK7-_L0h5%e4<HN)ybIoMJi39vVwohX8+2O-n;8=*CrlC*#63G9P5rIgtIz$n3y=1}OLoQ{@^Xm)-06{75?ZFpA0wPaz%ufYc)N3$wa}{J*-_R=d z0|{)FWRPa~xjbEb>Ums}+w=f}90wNwt@ox`eD9FT0eNC)#OAL7%h|2B)E-odbYHAV zjQ87UDX=&SbQASA3{sqpN8%+it}9pOkrm*N=YG6}1dV~%V`MyB zjSp-NIGm$A_)Q>@zkdjqs(oDUurEBx;Pmq`_V_SfEn}>XJ!ia0EY9%~bTm>&3kh-} zZjSi9_@U3FC)VTu`04`sl(i(ROk*u9y8E8{0qG38jeV2x=%TJvH^79S;v3!ozS#T9 z=+yC@mUqhhi^h2Iz@r{b4%H(8V_jyG_^rn|*%WU8-_@3nf(h(L6LGa~0gQ`C zt1@m|I6#?Y=1~Zr-t32c5%))vjAh_qZr{TH)8#SXRQ9S~7@GCb<9b&C=MVR}@?x0P z&rK56!4z5n_DP_7Tw%ob^aj{9Q@tkfI0O`b@ZOmKTMM>|^;_JgJ;n$X2rFDTy1E8V z`PI^PA&{iKmpsPVK=|dHvP%NpU^Pd>t?E61$!kDj%^(T7hw4JZbGi8AziN|`3r0laC|20HBWOc3>Y0_ zDV;lYivgC{a*U+v+~b3VV`WOI1EG-zd_H??6WFPy{2PLwY?4Q`65pzbjD5oPGBOsY zCK{H`%JGj_Rq>NgkA0_?d9d3#F(iT*Hxn)oD2PAi{$_s@hb*dFJ6>f&bxAPQkGILm zevTh&PV^U-b>gid_;P>JyKTI$vHNu3n*dlC7bM%vQEB4!b7OhbR8p5SuxY_0!v9*G3&(*T-cAmz^cmtwsdiI256+= zq7K_WYq@$IJs1%tg8u5T+b~Y6l61J_tQ5A#lyD13B^* zc3yNGtV6E}9$CB#jsdP#7@Ve(@ChT!V_1ihU&bBeD(YWh?SEbQ6cuk zItZj8pJ^wIL0ZzTj=RGU?ZJ1}O^QLQRh80Tx=$4|ix?pawaxGy*=%bwk3a%9v1$xy zD80kach-Lmo8Bg@?9Jk#Hf2?^9RxDufol+I)EfIjAV$e%KhnhopG9P{67`m+@9TFr zm;52U(h{>ZzgIo^mBh1gq152`vi}YQ0@E$0sHz=RSp%&d^dMq5jWLi|KiU5a-Tl9_ z91wg#sE69fn$dU<2HHzq19=U^G^l=MF|=_3M7@v(+Q? z$?y9+juc!R?_!hlKNPC@K&QGt^6eaXo0O=j(9QEq& z5{0Y4k+2y*{l1U=@^hQTy^M8Kpe^2kh->>Q!6m(bfpB5ehx*yEdhJIE}TM{bzq7Wb&*ln)icY&?c{ml3ie zhL$qVgr#SoifqGrC6maUUpGJyL8vra%o3}>2*hc4y-{?(r+F8+m3u%DbILpkT#&7H zu@943_La64FD3Q4x0ZSEF!0p*Js_ljB?jz058kkXVdEw7pWO1X!R-O=`50G$^7&5) z97cA#lg-kUV2MtDjU`TCA~7Cc<}@Az^L31h#$ZkXbbuHuB)?G)To~$h4+=3)WK8AZ zSKasZ_@I>W=ZJ4+68>LlSRe7{YG$`e z^p?Ri!6fx+B9Bk3&l0DRAJu z3O7kw&n+O2ma9RbwnVH@+n~y^7_oPs2AozPL)g3!>rNnX-Jz}FGXko4IpfrkKUTfO zc=#QhOIb6ymw$ze%zMwsjj_FH4$8?|%{|ANw+DI8ior;1oHHj!{8dvp-h;|yYf&qo zc-rZTBbw^Gx*{fNJ|DfdlzGMaRmG1Gw%9p|Ely2B;4lrJ$U=x*0u@8#o*aU0EwY8E zqyQH1bSjgv%2<3rd}T>fMRqjt!M~%;9hC=Z?7K?}+kI*gxxs0 zB}2b-Ju0Oarmnjy(mFHz{mr@va6SYf8BDnPU2JXdC3j^r4k?TwL0Mo(!G{ytL0KbP z`Ii4@s}jb~k&drlSVc1t*F9{zbuJv(e;kV{YZ4s4Z)HBz4MbNDf5v(L%e(kL)&r0O z3Fpb%Qvk_wvnIseLOTG|mG^CU`qipy6`tFjqQGLj4~V%v0m;CkKK1QCzk#V zCyN@Xg4;fBNeR+~^E6xtOXbTVYGS?Pc-sc>0XqynU|FTHM{-sw`PaKwJOrtZq)Zl@xW~sYuW~p~PkyRO=U+|GaRgVE_ zH$Oxhik4_eW4i#oDU)$F7yy*+?^5aj`vGGjkq&eT2X>zdSBnyzF}yD6!hz1{4ma{f zDIDH5+^=E^IYBZuYp@Kn{<*Z~XLz>7kK36NKnUUw1PEp8L%~kn<7|&XVOO>AiT49- z?rUtsM5p=_6y;WF9G`Wy=l6M6M=X_AM(0i0Wce!0MbCAY9#S=j^gi}GTYxIGppY1B zT=dbMT5W^C#TjUDUk^9l;kg-I8$r%gb1D2{H+75L@{nVXKieo!h_&vh?Aevewflg8 zL&BcC4nx&q_k{W^1azkL)lc9-7It}tTs9aQx^}P=&5+~U3m!NrHQy$YmE`%BF&%fX z^%$S#(CXrQZGQEo{a=q5tZ{zK6SagK~Ss{hSW@Ir1>-)r2Vs~*Sq`RARXMZu>9=Qn~{KHheIJBNV%8l;E* zXz}hF{6o4k8HjCp*uuzI9y!l_H9`<0VH2BnjF4~c?gE6!^=&SXsyd{^b80~%U*QLl zub(*aQ-o;dyuVV!{p?`pTahskt5cDSc5!>_8h=w}9X zq}{F#k%W%tjP?8bQ~0eVdD#@vAY5)(Zyr*b)-4)BA%O#US_h`W{luRDU<(6n8k!1j zJ?uvo7%e_AtSwp8OL4ZyK563z1B3v!nsNR!yCyg{-AXwdrvXYwAmX<8?sIp9UoU)R z1&UG7r41~i1yeaq#4!A4wKdr{FeFlqBjm;@2wmjt8V=K5Mz9m1|&AFHpv!n>e(S8JR6OkCC3=L4S3Ht6oz)D6mio7 zsxK(swVT=_CNCS{gR%2M#}!d7ysJbTX1FXg2X^GSOuGPkEW)uKKixQOYC@y#_)inM zf;TsSfibkFmjKXT)psyv4`>xHU~Q_pdpa-zRlj_^q$UO3QMT|p%CNqN-oKUNItE4W0NEBTY2b$M?HBHrBhU|ldtw_sMKyc(7wnr6 zO-b9v_Qllt!#2KLYP3FTC8MV90D002fELvlL4%ocWnfDsKyu5uC*Zy2lBF!Gp^P@W z6s(+Jk_{1tUMLLVhJJV#=cWep2;;NOJpcB^QF8P`an>!jXr1&-sE##U80yjygV<*g zY$zsG9!XQ(lrCSuNOxp1GK?a59ltN^CN6$J_pjZ=o(HC6K*(w9O)#}?ByQ?FVV$2r z)`nyptEyF@2kx0Ykp!{9+cV>7IK7V%IflKt3V&;TOA#qb#h6({8ma@$7Ld)+wbr>f z*E*=v3Udl9$oO{3gKJkA3@XFCrgmAu#$J638|IW2hrumSdD@DlGY(njr-wg&ukxUp z&v235tQ=8VgHL8okXgL7mE~A_6lP=KSA-}2etxyuz;Z_PE}wY2@aRBQ-kV`lYX8YF z9n3+$jTok-;Re;O{8bD3m~l1j+&B}sAAYb)6b5c}Uwaf0e^$i1O+t}FmPI-t!N6}R z-Nhb7Wx^e{)4=l7yWM>JK=M1EI2oCb8GYO%m4%sCJ%-O&cNCVjpHrl2f&#(~yPXUV z+hC;$G#Yq)z{erKy+kR@za~Z;RwZvUxFAS|6DJmoW4DVdSOkDAGBqCe1Br@zBK`IJI__NWj0WTTG<;lBf&Q!H-I{Di+CGiQ7WMCTMa& z#tP5*X{+f?ZMsEpHOW5+m!kDr0)@P|ERHJYK&qa1IKAw)N-?m`6!_%QBSCUb1bvcl zlP@Yy2VLRf?LCIB&%ka?;5}O}1_JonB?kG*x!jQhD-+-*qioJSALV4vTdAv~R8RSz zzVZK9(_yEB>>z615bki|maPlX%0hV7jrqSu;S37($Q$7zH;Ar8L*47vzI5RMIj(Yd;&68|w8dg17rwbZfORe7(OfmrRmpg@<__v$$-RqEe5 zj@1sG8gU$_1)7nUv%R!@Yxf zP;RM^`1z^;!!1$uWZ~h9^<^7HK`=6j*^8f$bOPHIy zeY@jc2%lUtE_eqf32?0GB7;8X*Ru|PlvDD^t;bB*o_1iqXGFi+w1l^j9O7qF(&=hS z2K%x*p)}Hwd86Mp)N`44f)BoK@f;)nUep(6)}9Vof)CHDIKEP{e7>~ki<)A;J*g#| zaDn_+R$8KN%IN&jpws|)okbw8v!yDHhk@IuZk! zQ@1H9gD@{lav-u@>U;X{NEXu_|N65)m#uGYY`SPHNh-QV0OoU_mR#G$4&AQ0{= zeWb|mWs$<;uEcLQvLf=g7;gX@h+5I;LH_mi>GEubnyWUQzurm{xClHe+Hgg>DS4Z| zTj22xxGA<9Xjz>)$o-ET-=&f6cMugiUJSPZ(VBR$Xe=tH@jLmVOn|XZ3qg^Vi4qq3ua+JTfvrH#O}NpQ2sgT5->h9)V`Ytm86~@T&w!&ax>+g07BJ$v-Ca%r zhXXJA|C;%*sBa*IhH*kAPEA3y>_=(ry}`q;w*)dY_z~>Bu;BCo6B?jpXOmRngb5%} zM~k0%2GLRnYiFl(n~(_9Xubl~j>YgV2OU_v0wdH3e4eX|7#ZvsA|?wo@UwZ_F}zoQ z7)~rzad{JSAtN)$5%y?$-pi(HmBQhYx;c2I;sUlF)D7fy;q)N?5${=UKMrCNiDeL~ znE-33bIbNJ7ih)k!^2`^>I3*kDI|Gz%FwY zRAvwH>jUfQ?zDNX>;eS4g)P$=eR&8Eu5>n$Ho7=X4peSW2!i-?8pNvEmK=Dcv7{_aM>iGv1Bp6@khi1&D;%?IzBq(LU`77?)VVWesvOROZX%W1U zu*8+W{{&=stvU8^3y6Zp!c_?sb4-QjPlV0CU2GP>B?H~2JkmJ(F}h%&am)wVdZUht zecs$HHloRa&+6IM6V55IkTf~4Goq0w3~>XGw4&fnrVnp43MSijTuQd8u^d|v*yADU zZUno5#7exN7EPYS{wxn01f8kvo5rs-b{Ye@a z8!pNrnAI0q=ALLuSQ&rar~=+<x>x#2NL%X0bm5IU z*1zjZ8&0nDuvA)#riMLCjciN2*qdt{Zq^>%mnLu{rGpp0Yfg=m9DZbsku(;?t%McI z2;yaleg>AB_dFe^`49k~-B}R^2l`wn&II`X)6<8aMF6Hu+16(p54X+i_(Wl8Xa7pP zhHn)6d!~ghuu&hF@mU~y*TH#Y#R{COi`+#KaTs`JU=dPjZ^Cf@c^fU{KoA}ryF8nQ>N zC@W{y&qpOp!Uvu^&wQ4*>_)Up<7w1XYHJ=N8pNoX|L0q(S#S2Y2pAL;kIVY$B1HPg zdB|c(y(Un$MExFu)3ZI*U>XyYmla#?Yp_k5@wDKOSEII5v|?TPaFnh1adU}F>k_nD zOaxKS*yN!Y@Co&_!@3g0a2Xh?j&i$Kg;SYHr}dE9T&?82Am*(Y0ZD{yJzOmtP`eUa z2|l!B=eX3Lj6YUX?llf01qEt(IYfe;DxhA0ivD!)WeJlBpZ5SVC^f&D{D3|zZqp-X1eG^zZ5=+px35#v}Qq4n^sy^ zH%&@-dmsG&iG!ajA(@%QiA@buq>V{e;iPKHymsSW*wj4+o8$jcRTJZV=kIJq_mk zd6**L@xH^g<239q`rWTNNiG~|-qY4Uq?a^goyUyP6fK{`7g0vqnZbCJ+scUq!8Vp% zp_)#rgWWYLa*&|^{A7F@Ugaqdi-~62y|)a}%ff^90=STX4Z7%XPu!sVY{W%bH9ZN# z7F@~q)11twQ0?cA8tW?)qaBWIfMk*pf)Y%U*q zA<`oZ@6!cXCB&#K>xTyL#e5Hn;Iz_;I=x>dk@l8MS~dW52KXn$ayEJrF)Srx!s%~v z&^9B?_w9?Y-Wf3O^=CXXgkN|7X9_xMH5BH04)z-3u^Gj+*}MztzTa>z&fv|_IPUQT zKX%VD^+Y7{T9m)j0;LbD@(7#m551q=Kl-25>=2i3%IxdJ{_aL$Y{$lVwGh8JS&h0M zGSGE2Y+8)?gh=b?L>=ubh%(W5O+jE*=Epva2z6pRr=hF9b|MqLuD4Hq>pL0+_tJU zS!IX$(T9#iGt!XSdZH=nP%nHt9o>_xd1v0o69!I=8|t1 zG`n792NEt(7*~Aa<^q&(&4s)MTQi%CBGVf-G_$@SzD}qbarlFEL2KmYBZMb`bOgL! z0Zf>}lN5n5ga{xk5>z^_Gh~mHn*wt#W*M$-?7g2Np8Nk5s%s0e!IV%WD<~mRsei>T z$K2_hGR};x2P|ta8v+`gL&=L5O|Z=jdbY;>XXZRm5u;gjI`iP31`5n^4)Z-j7xo1A zU#`-2oEQEKSMwSEnd@;+zj8F6C8sLv!E>36Bqz{ku4m|6;*KHl*UPOm&+STe<=_%G z=-1t`i8F35m}gF=o4ujpidi$^cpM3t|m=x-c zYq;%xKDWbMsiwq0GrfE8THgTC$4XBy0-}tt!T0sCF9D_kqX(ZgaP^?LrzQzzs5Z7! z>iXS*)E?uv=z-bGpBDm4DXws|)#d$O?c{>EW0opxj8kv1i^dV*%gN&^Pz zHd1Zcv@a(p;vnm24DW7b2hi@b#U6r4>v1!wrJDISmayBWSX3i>L9W&tViT~0=b-81 zNZv+C88;}{fV)c24-@{~r{pPdhINo(3m@R*ug|CUY!IxdQUXx z!I*E;l^pCh&%AMX#&vDE05M8*~* zK}SWNc*z=r~Ypp0?+*OXGdEfGjEe!wpqZ?kcjq-JUdPa>TuKzFHF(qiVG=hq_ z!Cw8QBS}p}{@GYYk+Ogw0H{daXMaK-Gvg!4m_*)7*b5=BI|3JHNp1tV>}8!W_@f6&Q6)b62L zvPI{O0_(9_%E@qycn09w%R_9ljzY8cs=)YgH6ec^#;0RcXdn7_e7as^Y$p|~EE!(| zA&kRwqqUJeafExs1>uoNfLWBj?OaB~HL#$gNV|F4Hl`v3~Q(fw};S^pM zt6@+SEI|0&BqSD}w}l^;$MD7#+D(CC9{kEcc1cPSPP?atT}P-)1OA^)9AhktpFy%O zs45MXr|0psT5$hHfm*NziyCa{3{xI5ht3|QC8tAxt(!osEJ6YHsptJ#&hLKUvIIDO4xF z@B-r&sjU~_by}>eb|78Pl&n@)oBm*lMYkVZaiW{8^$IQnhXub4RXmMqJQs_L*9J<2Tr{1cm+!E!r=u$G?#^piv&v zb<*8<0g3SuhdobZ)s4M2gE|BWP=~-f+#-p(9k(p2JNno-=)`OtT8B~I&vqzXpnA2n z_yDklP@=Uw0C_IGyBuQyq^ZvSZ8aLRJ>zkZ^!tp`#$9IiNe+=8th2n_TqHUhK4+|# znmVd3_j%p-U{|3h_n_a@t5qHOH~zKrTJoDE1nWrUKt-0~;+!K|rj~IPT*3Ww9RLYF zMUbF&NyQBs$-ZT+(r^O%4nwT}?rB=%Uj2`?sT=fNT1|Bt+Y)G%CI%@zSuTTaU(Tof zJCayQ$dik&!?Y(o-Vym>dVeLvo3qQ#JObJcQ!ekXWMC}K<7(#8Lo#x!ysflM=kAVW zLB)eD^M>RDz?Mnkg@uq7F!`aB?(RBxyaVLx{wZg_As%bS$EI&0BuXp_w$B6#2N=UD z0gt`GZ+N-Fg&DjGNLz6-sPI7#d68<)Jl_Kh-hK`HpQez!-d|>WG7@D)zxa7KY$Ej~ zcfWTz29Dhpr6;k1UcM7<@08mh5>RTjbzLBpX$D~6E0VMCwW5H^^O4yR6^3=dN*}82 zD&ka37&}39`);;p4%mxnnDaM%1!RH6USdnts}5Koh$MBnUI?cOdJWL&Cw2qq=~=Ch zLJH>WRy~T!QYwYyzNYh)6O-LPw0W*nCI>F#XP>RQy%$Cz>W`i>)apSTwG=CM=qmyW zQ5LPnoB*ELm{%t$9%>}U{JBP=3}QDOdti0yGe|K`=BDp@dGQ)tHa2K~k2wbPtlNQE z!sX}|s4W4Pbbb*TfHla>$AAdT)PKi(w;T;IqvLSh)lW%Uz5-~16)iHP5>X|*Hagig zK7FyfYm-hOW}KgU2#zVo?+3N{Belf6%c1YS`4ilp-(~=N?N+bTG%GJ*2SjT=Fy)FqqY8;n#yx#D#9L>jr%J4# zhMjyo@m-9mw*}Y)5)C#OK~l(@&3(Kda>nFu>OoQbNH*i62?qAGdIPw9Xouo&(fMp< zJ?k_IkQ{@b;(!@Yl#T>+c~o(WoSdk&B-9^h4&8a6{yf?{Ra0UDfl)MogQV$j#v4}v zVD=N-XxHZ}uSyWUA_ihDsWpUB0pNC^_Jml%r}SEKDdlzj))c_NY{vS7=bwR>aDbuJ z`Kd;8A$sQfz^*Unc*8v2Li`u=SfNQT=39w3#H464*BL=z9&45jsKb;UW>Z|HmgLBGCQfXDlaOY^PIxG8?&G3jq@&tsnV5%O zVt7F5Jjpvg4}i*?UL&mv;gcnbBQsNqy^{i}XDQOxPGfR;qRJJtyIm`Z2s;d}*3*~U z4SuaICaB!N4yhsu?J?LzugC!`+0MNws8``tATr)SnXz00aPe&M9)~`)iIcws-;KP^ z_6i!$);w!PvotxZMB?LD1aMTrn^GV z4;$ME=!#9W+^?*fT5Ii_vqt_CP@N<0b_(9bhpLrb(~;6e z2q~57-kON67v@(vY(c#xL=b<*zI-F9NHH^WiIITP`->kncN5KdH)6JELwV$q~e zZPxbnJ)74&d|(G%z3H83?iy}$O&-sp!hCV+{=44w=|kNyf$p`p^4B71`O)<=shrWF zCYlM;;hqQu{3MJh8QVb;j|kR|Np1qH$NP?pSINpPFy<@4Jkj5ab~neOw_Vs9b>1(T zz$M@FG+^wUh%T-hv7J+))AHA-U*`vJ{Ld=f3f^dO=r9=Oa)z=2LVU39-$IDf?b6PA z)6smYyOk&@Ioogt-s$v{fO+=$x!-?OFwoF|BG*mjNmV0V%zuKfK!z0M63>_$F3Lbydg-~jD(n;+WHq(J+COHOD(Z=jGKxO;Lwou&-ZnujXWQ__} zqHW$nZ+^ubo3Cun-u4fK!U)QLQ5fM7?zzBbAz;k*WUsnHK=y?&_n>zxY)|KN7y5@M-|j_6wkYGzc(GU)O54%cwrHH z!waYzq#mfR{hwuu=1wW&a5>*DA=D9}X5%EGF1ai1ANN~eGj*%>M-MG8NVQsOnOcjL z_dJvhydoC4V>Ml*G6BBTjlzpFg+c?y`k0JiLWEbSDXFW8eVDD%Cl6H?T4i~y#uX8) zelR)ic!G&eRH4#VsM~#p0C}@vpq(~?!cOag;B?YjlAqIxh?e$_wageooYxGUm^Iv!zsz4D^BLy1F3$VyxmE;dGC`?mLt7ci0`n zUfpIS1kCZHBK{{h*V&@*`4MN$woH^@K5Buu2FYY$X^*I(UZr8g1nVo%gi5%8+^Ift zyyCdv5Pv!Qo4*DmktT{A;1mmxWamFYl3lgK;Z#SmJqAj$#9QeC=X#T-Hgy@kI{4Ua zPyk0_0(H9)Ij)3^N@+AP1Ji@^)p-XfT5IG+Yt2yc(9e9+xWC|7T(OZ^pJO3s_3n)I_R>)a>{jpz z>{hlV9_t~~5i;CqSXS^SSe8*iCRFeM-Fdn}LIsuO($Rwz+8q7}=<_T!*6)*7F-BD$ z!8mI|0=nm)C7>KC&+_)LvAPrc-BNTwXBq=JVTiJFEKM22tp+cK=E4a+VWIcpqM_UG zB;p(P1q4d!VW4CT(J?!U4`zR-)s4YmuKjjZJ2yY2(nJ$;6u+}0FLoutT_W!+`UJjY z+FE0?(YP+6`b^FgA&ty!4b@>}#)N9{Pv~)(bkD#WDotQ~26ZR6r*2V9Jo?xCGfwA} zz5J~r@PeSKfrIQ z+3wkvYGTJM%#TYDKhL4W+i}duSnvU@%Jv61s>(3O!YK~N?`~0x^+tR&t>2%;I|#^; zbTU-IEF2wbHkfcEi>SFWtEpmaeOyp|-`TmY+=H<%hqox<1=Cn*mYD&jK_BEnP^j!m z?)V4~uXpB~s%yD*5OIwK`wXwn1i!TlH+&XuMQ~zR@L#D}eG##27#b4vQA=SXa}nE1 zS@7whIb|mLsKXL!8n4lwTO@eHs{|qt*?ZWq(;A>H86(tPeVZs1&QJQJt$5t`Xd)PNb4kADwnDZKL|lM zD-%e*&%WOkI4jLR;+gx%RgaHrhcbP@#!jtMf~~27RVetPm7(TgW`B2bD>J#Ryn(8U zoB>2r>ufaNgUv98fHw`&;+9%O^IFvcRDvT$6#Qzd{;pnt`UU`8ZoxHgF=U-93D}Q9XTG;Y{TJV){yBUKoP}((7LZqN; zP>YodV6}v7;cEx>7m!R}jYvc(TQS@gxqoQ#V*m=feGJ3q`#HQg)FkhTHjPhg2!|#; z_eVBZl*H#3CPKNJt~X?DJf%`{+`~y4R_8ANz6=V8dJI2cJwl)yuqm6LsDduNjG%y# zZechS?UJ z_nFet2A}1(|FYnSvh=?7U%rxdc6O<_V1J7w|4pg*>o09I1Am??zaXx3u}nEt`0}N8 z>$oM~<%gCRn#5+${OC8)*B)qaI2oR;?Rb?L2GR-a;Z)!eWGc>7ES7(sU0>(*H3W^d zvzI@Qt7sV?Wsk?0zSKdX_(|CY@5l>>r4x+tJM>a}e-j)WXlgu?9#?uQv&@WpEbC=_ zWkzNc1iDGWRk51UOecq6T2GJrda&ek&tz5ASp?a{nmC;f)2WUWY{gRsrvfB3-6V$O zGksD0EVmAbo?NR{>)X>oIx&dPu<8u63Qr`aTKGf=FXFWO#7X`H`WR8l*>#a9jK+fL z)+yWYqbkYK8`xQFNpBNiL zts~c%Cff~GaS=?TrTD#?@8l@QS^OX6KwiH@1;g!3WiB%|hOJk1st|sRgy{!#L>bf{ zaf>pbbg?SAWN!;CGs|`+C?;b-F*(Ro)d5bN5r(B@1ZA@_Ov8v)d8%2#SDH*qeNu2~ zyojFIcR5FLip0)T=>(577d8mNdXKiQu4JQZ%$G86^Cj_6U(>ySoYDRwgY5C|yS~1< z4p!KPMN{K%q?hU{19b*=cb+ISWt4|U8+_cNunZlQ^bCXyTgmyMDx_}45ndhFQVv;l z98eNP3$!`)2(27JXk{m$mEtH2t-N8@ekr2B5tJ~FOSzV235LALM$aHVC)T(}^uU`n z7+=XdhY#cI?6PvKB|?I!cU$|CAQ9!RM{T4Q9v8NBJHopdoIPYss@d5!c!}Aa`z-%} zjFD+Dp_|oFB_J;DCAyY+Cv2F4pMb@|;mX4$!+j&E#i=^j1hf{f>jo}O>dKj)CD;qP zeW1$Lo=(WfiSv51-t6qM{CPu5-^2H--Phi|rM=WQk(zBhr|{%d2Az9(UN5C|XV+!5 z!b%uRQ*2<}O=FhbfZY1kV&_FQU;hLxw!Aunvq9l`kE@H`(PnqTs@yl6ijhdC?u6N+ zwem%rx+ypZz_%ePceVT3N0sn|(!J-U)uj^%Szn1@o>>RYxNz8KcNeSvA@_Q&crMmH zBM-Y*?X-Qoi_v7MPMckVdX8Qa!V2M^y^XVBl@HDF)`P!NkgWM#P1wxaKTqpY-IwusAS9h7 z>CMdEy6H72m(JC?l=XDeThR7DT!;O6+@1=!ghv4Ug5%;93HlqB!Zg?}dBFCbBGqYK z=rV$S_PnV35u}Q@XULpfcw8oXZVF(ejt20H?zq}nh7B!}mtAC&Bt4yPL_2?>np9g1 z;~!^uUOKUpo?D82L4(h{A@$>8dFZFX60GkLPEW^+wl}N= zgT=k^>u}ezyf z%zJC$7bdXH!k?R1`Ik(-vx(QIB{Nexftxm87aG~K^SrdKbb>I|$r!ee(a;$es(rw* zU1j`CquppRz(wl9)4N}Q^WD+ zihJ-+UzmdMi(Erz`>ClTc@SY;!|K7}6k8|w)P}`aCpOf_5#WX349@TDDxfLhRqSnT zsKYJ0ntWty?xFSOuf3yF&KNHE*U^|zLHf|ElUF=ceiItZA_0}1EBixfVTwPy zrefnfJ(X7!z@zxlai8E(Im7S$lRIr^t{1lDWnQ1xC$Nt)5Kv*{i&){^*KQCQ7)JW1xZQep` zxY1Y2PB)MD_Yedq8LsBh9Q*0!RizTP7$b#czSz^~t|-&3k85hxow_N&@GvaP+=Ei1 zRFf}o%u4fU*d1=(9ftoim3;4d&65oH=?J`P}v)V*X z=RcDH`=1H=lvQKIEeaT;S!G3$qB=Vc^+m@=k5!IDvtuh+{AOw|R0EhOVHs^mE`MYU z6)ai7q$p_!Zz_=xs;E||IvvkVdoZppoFDAH`pXP z0W|}>O!z-lRm3)$+L(%C1p|dRQ>C^ZV7!GR#+!P)#H6fau~Jgk4L5UM$NmySE3=d< zW)xFFN~IaaG08eyMR-B_gUItk*NYAH-R^h1Fs7IhPKQzAk83*(hSpx9fuIqZ31l}b zZB%m;-7KKpuM1uZw)^FNv@LG_7AAX&(sOqik|}xi;L;?$)M9;~RwiQ~FuSNh#!Aom zqtA&7ly^p)yhQ5}E2!Va>j>z`@B+IdJ>O;q^(64b#OoQjOWb(5#UdnQxETf9!DrNFss;UmRHCFBh@aVyRKL10r6Y5Pt{nu zcjkuR2zE)9)+POsb+zbposYG>z9nBD92922yBIQzg|p+EoqX7gz{(k|{Z1a^QS+1E zy*E?tj7s?%vKhneD)#^%vS}%k?#uM~iW6CJkM^XD%d{^1m~-R!Gep^kI{ zoYHzfG)v#}IvP9Bd;>Xeb%N9ZoVUD=3>J+<8RopS)fbc_#+Ta*wpM3Uylc!2KVxc= z5xM-3;4s@OLj0p&=0GBPH3Jb)t6==QyN#t@=U#$x2VCpLR}<;L{L&!}HJf!lH#lob z6U1nOz3mG_d?(nkL0z{9akNimVoq~8QaX;TAm|H%0^Rz13*##N8qKt&Re{#_;hIvoL-&C##i{sqhHe_I2U7BjkJ~f(T|e1O#we zHmttoH&@YfF*(0XsY0!UH;A}kYUz(nt&@zX7?{GdeOzBo?s(+%F6KsGF>k;WM=F1Y z2WXGsBIeGH_KvNLdV_I2*{@G!MGcqRaUPqiGyy)tBKJS=^LdODLcfL%b`I2FpAs#P z)!fcV?+SH)Y!t~(9}2=%y)NU`YPrRo)YhbMhc9z=kcq$dM&BqQs;Nhdbk44O53w8B z!`1-yYJ156XR!vwh$Z~Y*u!QM4WLkM`kWwlu|3#p}5XTl|{Fshat{zDE`)cwQKgh?-e?q`k~mna8)`tfzU>TlfCG;HQO`;PA( zh=2oEsRXKp6tHoJ;~khB-TLkV?N>nlO3x`baf+hrm@6@WI0a=hKN#pU0|!;43`ud} zoQkG;^x2WH`*bfuL3!cGP&q=OrYcHe-g(_4@8GG@N{BPoqbn$fI~%0MWaxCrf@35t z-^9l>r}4R$o2r(XOO^1eSO1H;H;-%bYP*G%YN^@>9I8}>fK^ND0Id@UA#rG>N`+d) zFa;E1QHU?weK)Ew0++5 zeeXHH_x#hJ)jRjS$7}Ds_FC&|w62~hH779mk;SP^jdUNAv$=Bpha%V;g4zb{`kV?I z&0&DgQ7wY04QJ`F)w6&xE?gCiUE_rQCOn~B< zDw+n|i84&msr=q5_m&_32YLV>OOiX0U>4GTn!IFvu%;u^n?VZm-;U&;Uf2EjYpbpG z1#Q;4zy_HT0b{vH1jqV(GIRs5=Ig7nhTQ=lRGSR`9dnc{d5M+61}w}3)tN1hMdap? zEi@||tp?qZ;aKM-96y>A4SXSM1_#1(&)3-g)PEigY*1R(!0v_F@o5iO0YN(MW`R5L z>~nQ(+>(u1l zc%4EgURlpxbZU6m-9L`b+)G5pwR|mXte2trdsE$TkYxU?}dU(W7^>6u6GClTQfTvOa!?vYYdqbsa>P zR2kTVb=|dStIEvkHEti-A-hYtg$}4y)mfbs9tD2y?q! zkPDmnT&cp}Z&p;$wB`#sg~fUirLP_?Q@>K}cNHjP8(4XF$+X}*sHm_iNS|ui%SIG4Fl&l~uC`C2~|vSzQPYnozNgFdJ&OCIr{AS^II0K9BuY$vi#Rl1Y>eP2KULyG~FKo2JI0 z69wKpa~jPQs97KutriFqQJDcrEI%+g-zR0&SjyM`%`(6It1`n0n$mV2I~`WR(5`X2 z2=kY_qCo1Ro>HV2ajfH2kb1OZNy+U{D!+xj5+%H>K?yIp<<{);y0@10ULd4Y``&pS zc1cW@Y>s2`bB1<0M{6j^y?ZT@3z-(UkY%y=n28@d#2bk3gy|$YcO=>b-e>KyVgc}U ziVlwYWtlHP8lf;3S1tGG%{s4Q=9iCSN~ZStPaWcwhly92gzostoB8q4Ph%ld=kV`fe=OY) z$Hw^{tG66@}6FONAPNy(7YaI-H zY7wr^gPK=G%1U4dYN$0d?~(57bxvdjzm$*>at1yQ>a%iY!w7=jczVfC1D!18=oqg_ zp}_`Svb;drS`WC?cEw1vPpvWkVJu&mK(|q3F)Y;>p=G{?-fu9%}FU433qh~Ii~^L_q>y_$YWKJ*caF_KSO^t=r#gv+sT*;l0DLi?l)&?8#< z^fd}{qO+_9G-#aXDWi>3Ir9>BpYEe+xNtu`W;QFwKvj96jz37>5b&^nZuY+8V;4Zi zVGrxeuNJ4#OL_CPpS4Y2Ua5_&|5q<~@RB$BG@*Cum8gjD%Ku^!rJo21sPL1h#_1Ub zI{>&TGI-{_@`M^zL$ikmYcWJ=&OB_Fn)~8bT^vA9c4`5J-gD)4-@gAAF4GVRxQx6h zS3eSt{iyk)EnWaVwM9+30^k9rR2aLm|0y;QC09M_QZeG!R1s{q!1vXBZtrTjJ;Ue3 z$+`ZOnx{)Jl~_0o=4;)36{Cw&`Yt~}-2p%ZYUlU+yx*!s(l&UBjr&u=$`d$MB{g3U+_+ z#aS_>u&Mn|v)eP=w_u<5I8ldF<)fKwMbNN7Pkp!ETulmlVEDa%pavdHv-E=Yz(1Iu ziv@tJ%o6)GhhZ&w+q_>79@13nOP~MX3v5g{4bMN0dbnUZ!Yk6!-oOP@{sS)P2DqfY zddkv*v_DV*v=HEP#*iDc6WSLA1IcaOX<;g!)MO+6w!B3zefbZN`ScsC^>(k5VgJ^@ zS%nI+Vt#e+LEz)ObcdZSU#lY0*9KLtSVTGpVHL^sOQAU=f@ZxLJnTR|^)ae*R&`0Zmkbr0oDo+3U#HLyq_(I?#m%*gGZ$ z*klF3lnDWo7o6{wgcrPzjic=8juvq0pYL-3TGx5_q}lZu?z>bSD4X6D`aIZz&rph` znH$NGPf)Vv(q6ZRr~f4xoVz z83N?bHHo8NY&^K2k)<4sG;eGk6B=nch()g+g_w_O<&RcBQoefRp<6TdNo&xuQnb0=X8mRZf(I#eMSs*5DcFQ@;MLIdvVV&h3z(h!Zt zYK|JTbMlD`D8dc@0+YeR^lZo0SJt1glwKN}2$znJaE7Q=%BaMDz;3QZ`tkn=6<4u| z8x5&du@XBAmV7U@ys>(p^fJB$^nBy?Q&aGjq3C<7=&BT^Y>3@?E7YW#aICwIV(0)M z4lkfVt$&Ra~ASO6Hht)5%xP~+$|6+D6s`4la!+H8g9FfuPu z(VMDQ5{}mC3+^>lm*!Mi>r)fh1O;GkF_vi@dp}8C=|0{Q#bzK+O?Z*L2~&Mv;>WMl zM_cp=IA+w*%WlxU18(!J*~lngzaV+LdP-m212}Er^|6S;3vfhfLiK`p5UU8hR*1+a zP}TAjdg=a;<6F78vLn%=mUYt6Yb=I$$^jsys&E-*B z26q#YW)XvXMsivgaHy@(D|H(W>kK}zU}a5Nzk;uA%yG#zh9qPB)n&PDZ$FIf8$+31 zdjln+=CphvuJ36_mzS5JhD%u9ENNr`RW-RyXouKn=E4oi)&$~miE6SJEK!9g0Imkx z9|nb#vwzoea`aO^vm%xQ{YnL?Dd3Yse_6iB;@B9vrQXPG7Sb)|KV@sS1~?7C34fsM z=P>vC8YAtutjJTFU^p+8Z<2pYl-HXuBGk|2e1!YnE4LzM zIpXibM$(#kl_|d86DbBmlB+NZVv&Ws;PN{djAB)oc$ae`339#HY1Q|JSjr=|6kQT$ z@W+NV32a~jrD}i+*IU?B@}O<<5IQ`hG3gw*61~TypKSi8XA@!`RY)t0#Yyh3E<5&% z0%AE2l$$@e*t9^_!{lt$;@|;zY3b6FY}O?KKqrMN`{|DF_g6r8fg3bNLL-hqkTczn%jdYV(m@kENV zTL$Rf0O2sIX^zt=>`bm~57x}DLWhJJKZ)6e#IjO9$*ktTK*Ltw@a-n~CXoDU$`5q= zABplKWnfrU-aleh1^%$i<%Xf@g)LI(T1sJ?jS>_^VS5A(4Hw_DEkXJN;ElFNQ8DVC z5BVnLkZ-cXM$oRxs7Tl`4#DUohRYH{IC-(jHSsx#;+_k=lI?7|#c!?q62lu24yB_A zxI*f!PYh>yAJw%{B!oD3$BS2i&PUEH+Q&<*>CQ$vK2x#RX`I8`j~RFz)o!d_)!+BEdJ4ozhM&)g#q_%gfbVVU!!k{>V#K#Qtt07`p*1_{HIFFG6U|=aEx%cr zxAHsB_?jmeH7k^n_c&hCTl2)qG%YNSQS<1Hk+x4Tgw-}$ws{NOq`&o8q|wGu;n76~ zLuO*97vU`5!Ze=V7h)zdP}+PriaiHV7PIj!8@lC6fN|zM*B`5fh6{&I^oBjt#RV;p ztx>mdUsqg+3GS0Pe9aT{FpS}(k5WxW-?uXYj9r%7*2oyb%%&8#n0~OrL=t3<`hkhV zhjaHR4v)p=XXkJ1E0;wx<=ZewCCZPFIZ}0bMUSSn#sEfNH?~Jvk%tcX4`(4!A7?v1 z7OiaEF&ye(*m(+(BwihwK;p$cAo+2@>AulAZS`LxMkvhr!B{gr3(_VZE7;7)ALlHD zYd+N_XwCA1d@Y^AMc)Ea^hvLCDTay}J|vDITl?#fsU(y|zw1Wo5VodlJ4z&s<;xylHD3epwV=h0M;va_K&J|T%h~aEYm=` z-zGo><;-)dA?BsQAS{xK=hOwtyhQBIM96pe170C)h>;~Z z6^ol88JzU6!g4HKE^TTUjr9e#j>%#xq7@V1GJ0{?V5B4$;GyKU4Mu@Sn-FuQ!l$Hr z)j;TWrt4nT2#Do>^|Ok0KN7&IbfRb>)UGVLE>^WqZTSrA12g{nNx6o>wQ$L4VDdN; zZaE)I^UsohEdK%a2{YA3{RaTR8 z;ov`OFG#azf2U<0(mS-cFM#h7$&U@+B!F0f^^_qbTtWyIq(zK|1Pjsrdz-6EA1EDw zjD|~W?r!!TYr1iRxX}af5Fi2ao&fWf%^98;a@45KPOIk*7TjvPC4I)^l}(~I0FqrkeA&h_t=r}|?6jWYMKtth)M z&)@Lnfes9*9sDb#_K^_K*&a#TSbxjiQ{OpM$4Yk6W$h{qMvJ(ME8e)IZzwADo(mxnGHjxg+>0yOfoP2sx|@dfccavkenU2OtMcvHmRhX1`Z!AxOvg&%U&1y4aqh_` z*3z4OsV{}vhwG?c(%y24-H?bC5i0ahq zt4;qWRs}dAD)%DT07-uju1yZS-oKAqj2KT{wg`n1gIyOM62sb+z$JmBxmENk#xL&o z4P}Mg`AM1)%r(>TxrQ_^ znjdE?v{HWKy;`RGqpf)eFuXv$3EIwcsYu%iHx?!~qn|Y%b{;yHShk&f3JMdIv&&rD z447UeKRb748&mIg4Wy8Pbe1+$6_Xri@K@w1@5XXjwX*7Ag&`sRDP-?b`a6`_MBjjf zrCJ=5;aX^k-yebXT05qIgzra;?rJXL#;vF7N=&mm@O6}u#VDzznb!0PHWlY(E(?Fm*(N`U z6@Ho(mmOHODtMumWxRv_QHUAc5fYobh-Fw1^gf0%jVB zPA`XhBquWw(vS_l|q#u3M~V0 z-6sVS%dzmZac}GvvFfd2p?BDVFA;7c+*)r2O<<-fr~eD3rzY-;lklURUyVJTktEri zzwVenCa}b2xc}T1Igkv@4rhab8k+Pipq@ngfL?!moIixOD>P>qJ*#2#lyB|X_haJQ zI1XY*IgP3vAGdS5yBvaIdj(tSNI&|;e6Qi+ajFhyqh_=WTeelG&?E?iozAB49`yGOk=T#>n}Mq`E6A(4nZ54E^WMd4lBS-ZcFFH10MpgD<5bp2}+Pw z7y>Iar7LiroOuatnetSvNzcr_@zyXXMX=?yc)!Ze0$XTvY6!%%wgu`tVFf`?52-3`wm>18`Se31_8yD0b6_7ogLw^2qftOk%FYy8~*{``elv^=Of8uu%=DPvt5M$qGc?m*0 zH=os6UX1!DbVBP1t>6hG4_DF@4I||E2mQQzaBblG-JSl<{b0eBYw2v>%kj-3oQ+9d z!vhi&T=?T)8GMrjWqE5k)0b3UX~erD+d(7EVF^c(v~N7A<6BVHE_1vn>32?EhGex< zrs3$6fBY0>>7Wxowz7MjW`3#j5(+Ect}L2PiZU15ksvU^DZrVe;nJMCSu`8{gpTRYwwLUYdtFY_L+Z9ZCYzz5=bPj50GIodZAyefQpTOc-bAg~74tYb@m;BXiHh?i;T+6e)hyyKE8QkfBod%z_CaLLL{ z%q}jc=nSqe^8*coZDP1-3@;wq9! z&67v^`S$uwbUPX!}jxbVfGVt_}lkA!~ zp4&|UzMMZ**XfBSkrN5#RIK2FF0-2);fVIBfoGM0meWEJ3cOjc3Y$|kOYa#@%&DI- zqPN@6*~q9>tZ;4lHq~1VL?zmE3pPS2_2tf${J>4pmkM!@{XCgf#ewBf3Rs zlK}$aXVsPJPf!Qnks;QC(=oxdynwQ-r`Svq|I`C3J+{CF!95yK(jiKd^s&Wj0-hp% z07)5vCXinb!p6qDu8MuW)g~%it(>rO;916&<{dE?{K53ACd8UY3hY84C#U2cU}tdi zLtPb9Djb+n{8&;iD0MTL)U$9fXilx==Tw`}G0^MPC8E8@Q3AD2zxQx-tgIn~uny(0 zrzRcUOjPLWqX~8)rV1b7AkFM}gb>c&ZG;wEkQgsG^)%y)1`gVx}hj2LjL+`Hs~m88RzNM9tJPXPZS7 zRQdCPnOX9^akCI%Zh6@wj^@}R$op*Z#9pT5TUd#h-J5!V4*|(w0u8bOod0*7S-XvI zLOAEqOhni*W#N0iH=|Y@Y6NJYTN+A}mt$%?DMZ;xV|4LZcHsTIdSaW*W7fqcUVV>j z?1Lb8z;_Udt;5Tq$c{rFI7f<*0lEdG%&;1s(tISw@g4`^J3Sco#asRw(S=Fb=#4Y^2D9)x_!Emq>CaYHsU8KWfr>k6Sc4sPW8fvQGxKx3L*V@Pfw15MbFHqt73H4^Cyr8gEP( zD+|AcEpfC*bE-uP&{AM~FbPq)z9=d`0N9c#Tyy{f>yPJIkY=&6PY0NZ%1RbMG|3e< zf}uC*D8NRVqMr$b$0w*t5D1Xm40u2j{F-`idM~_6F#JqK6B74i0D8k?kff$K-@HBa zPC?)H@rgpW^p7UD0RPH_CdrQ;R0o0tH_Iq{9NcNRHVs%EAHxQI@)8tn3pO!!tkL|J zhRc{}pf1k1UESmJ4AlMO=$cK|(P-tm3DO)^Fd!(EE5F+RIW|ffbDvMJmnKV%5sEN{ zcv3P#QFU0EBi7)4pT<;p1K`}y$7hr*|9cviGQ%315DUxUb1*}cYpsu)Ye#6q5{Udq%g`|&K7~BD%w%zH zNPou$i6J7ATkF0-ag2<9X{91i4ey0TQ=H|)cDUYL4FqZ0!g^0ZYm`@F+N};NH3=JTk<|FeG6GD1LhlwA5??B9{7<##W zx{2ny*b+F<`!6(8oD7ZgI7P#p#tbwlr-p0!%pEFXltVS!neWQw1IJh1cf32*#7J=} z%YaD*b1P-l*CB~Rg-_y76_&dKX0>Jn035$HekdO@8aCHE8tP~zv;H2x@z`^X*zd8Y z{`$m;?VFa_GXN?eJy;1Ib;lN{B3}OWUj_ePL8@~xB~D*k#KhA8dd;jhb zEsfFb;J;=%(WqpQMw{5=t+=~sdS3G+!T$U-&3zg!tG6Yg*ForkjfP3|>kxqSW&DRO zW6fhSVpxo_r{t%xf$p2{%wocGqUiLMe{Dvyf%NH#G|tFXyZUh_2zYO8@U-SW!1+`l z*BDj@TO!6=5uzI83hOI(wP?Uqa481Do3__F2MiRsHWL*ihMFqvQvOKijSz*T-a}V1 z7+hQO`RL?fS z+W&NWTLaewKNs$9P(a~u3EG7+JG4JNVTiSF8faZ7Ar{nWUbC*h&2%b)&_W-WBk`GU zybOB-v;U+U+#X*p_zB+Z{sFfF{p+Vh=S@(!%@$=<0< z;L2St;DPQI07nKhd=J2eCaO0~5Dmtg5;dAPDAv454ep z%8}zefe!HBI|O*mzoIijFs!T0d=RT1swL+)EA-YI$;1(fSCMJ1!)=Rt1rFk-b&gZ=XP>gn%J*snY4rP7NBKay^={?P3Nx)JW4)Q&9G>*38Xml8sJLg2;}@hy99r= zQ4>(}s~}AYL`*LP8u{9Fn2pg9}|erZx@y-ro5;y*oz%! zffwup|9NFqR#%)NqBvezmRFXU$_cI9OXm+^{FY%VkX_7{l3<&(7{{nO80-uSjO@3(r7ELs9IvnIEBGG6!C4Yj%G?KX-FeKR3-X}x)C1-m> zQF3S4;K$X@mrBU8Ug3a&cA2-OuxM*foqI83MSqqmDrC`mo}ihFSB+lz#ZUwnF9cRT zL^f_SF_#FKRY=|6VpbF1>*F6+oz^y}`FeCyu1*LDN5$Jz;-MqiIdG1xuD55&S#;l>&h( z8VZ_H^wDv;|02X=%3eqKa}uzAA(l}9)xG>!bF1|74L?wOfek!WWdm=vR(?w8}Cw!$Z+Rs%U@8UANtPu$haM*1Tmo9Ff7En&ibIxOyq&UKK00gW|% zHIUbuHl|aq7Hq~k4U(VK7o&~*RXu1t6ffCsNuG;eTkF~*FZ2ktzTu?21Lm2ig z`)Br*3@{;vYl8@tAqUWtNwy;E*x^q;fR>6SQpydd%@uN zRZ?Pj^OUkLKOP?FHagA*`3)Jei!~}S4K6<~jv7Zr87J6E6GTPQAt&=~s4rYi$v|1q zm{QFcgbEKki0u+9J&^dYhO>MH_6gQ|M5yCyZA!WAVxC+B#vdBn6p%m z7vN2!7<;1mezbvV*3;ymtQ5_NlgHJ>)}RVT%LLQR(qGa}<;H<5IIQ;+=yFV^`V>RA zt0`%g`RJXt#IVc5PrUKj!}UkGB4gd?Fb3f<2hTt94^*+*&}o{t;ZoYw?cl7v&;k2? za8$vgeG3u8O3T))YGCf3jucCR9~w+xSo9V`5)%k|y60f;{37O2GM|=pkT150uB zlnk%^pJjM}KMRAKy8#TMV&D`u12Fn;M8Wq-$9Obx6Glm5`F7_wceAfz?GN-G6|im2 zxuHN(%TfhEV(HC);#g@Z5P$V1fCO+CMz@qXk< z2h;rcNCn97h@uJ(z5nf53}7udPS`%BLW?)m3!DADMC%O|Qd7nK3aBz%IQqzr2~wNN zm0iB6%?KdNMD#Owq(MEu5?MX&hnpDDs`R!iJnd>qo{})*b`zE;fp?!PfQ^W(v?UP^r0R|a}A_g)`T zSl%kr>xeemkO5^@fCbaoQRVlzsEqhvOMkSe0I+*{IM6T{b&qzS7l z9fQ#+B})vHw<&elc$flp82$&dg^C9cB9h|Q1KX?G*H#x5*+jnouUb6tlNSR&s#JUb zEk!@}pNbC6eXJpz44cYISP=i*>h|T?nJYCl@m=jEgiX{0YjxsUWC)+~kE9{MfS7(Y z>pkK^M^n2~lkt$g)IqJmwIm+oZr)#mGrUB%+Bz&Jmb#i;^QhzyPCg&euTs0a1)t3c zJFkWGdhb9^US zRA2~$<~CYQ+6gc%Kn~L9#bfSOO9m=63@AjUP7t+JnEjY|YiVNmZW8@_8d%EuS_}4N zC4_`M$4gd*0$YkwNpZGm?z&H$*Mc*3LbAi9aKHUBaIclw;O&~kQ+ArVH+*|6v~QTy z!0lXe%o_YEr=jZZET5W(CHv&oQOYcOouy9%#Fx&OZOh zP97(tDja8wjz$RxJxE{$dmR|1XgdwI50iKS2}D@2!L_R!ujl5?MhA%KlGiVZp!eT& zl9~xlQb|_ROFo@EtQMTXJV|=a7(CyHm2v+jtg*{>9R7WVimDNP4tB&lv9Z)+sa5!< za&LP9r}WE)MwO-nz10nrd%ns6C&u%P4`iIkqvqnn-jn9g$;cs)6KobIB zl6FIkpJ=P`v-m!wK3sV@0*Q$*V$8#;tvxG~NOx)W+!B8PU4F(`$)>?n; zmI48SFb1-J`D0}M$NJcj*|e+-^fxV0XfM>#t2sE~1)wL1lDd-Ks*eWZ-t@1&t9o}W zkgi~NLichG~sHdlMiUCJ8{<4^?CZL}#LG*x?$5Kgx% z<6tsYguB0B6^Q(KgR@$jYIu~?T?0;16nH1V_n9I_&#uYwud2f(;7#{WJ^mK=}ehyLy=*^sssxb=7w9gmOH#~qL1$s(2_Ihb~e-e}pu4HF| zYqJ?@_>8x3p`YO6?_WMJi4=ibKdz@wMsk&t796<1Lwy#c|MbjtN;`)6y^^NEKYgpSlKz6f&fRQ>FOhh3GPVy?*bU z&?-<_8YAorl->wQl#TSidbC`ry3FZ+m7yuv-tb=V7%-Yt-GofH0;RxpBDJH`gX2=& zX08rU${w7=X=;zOm{4!r8nKq{0rXQF*gk!ye$Mwe2H=-AMS;w4e0fpqWO zpF<2pu>XihlL)0nM6ggSHG;2QXt44yh}~3!fdU$^+~8WOJK%*T+KIsIe5PN}Cji`j z@V9Ay26X*EkJC^%mV%KIx$)Krncmt1`B9W?{yG+(f68+RatE746GSHT8hzaxBj6^u z{|P6nu<~~f6_n*4=b8^y=X!fuUeeHYcnc;u+?d)O?{z%a$@4KiQ}-=$&;&d)6l=6G zzY=_60!agK7vbQkQ%xZwS35JzaEZ<-9_KPb6*1eTJ_2Tu_(=i?R4(*iLwmn(PNN1? zF5p+G=kCfFa`$QZ)gkbRvPxOUuBaT_ORiZKW`dk*`cp00oE%G*_({nj|G z!2K>SGUiJ&k4{Y{M_D7Ma!gJb%b(B5x=Mg6J$tE}jPK}>OwvB-EK~>4oyxTR4e-c- z4pvirLl$jy%{BpL(TaVJZ!@+gbWhMJ2|G`#10z*e>i`734_HrNo}GuJk&Rn>h&L_i zFXB&G^!=nBnkkO#q$$E`z{w`Zo}G^_Dg7gi6?>)i;++KVy;e+#{ft3oC8u%{HsUc~ z15L)afj3w@E26w{f>gxO0Z*ppqViih&jna%>lEdpP(FvD%$9H)+sK*Pbaw;@l^eZM zPDI%puxIRnb|(v%iuiMr*T@WK;1*i_yYam>zpd68$cz{-G5vo^iFFE-yedI2|LQOd zq5XvE4Cj0WmjXPc1bDE(iohn)7`S~o_sC6$b1F!JA?n^7 zI7LT${gKH3!*c989I+3YSrsMo{#)@Ll#esNf+oHV{5YF6IfJAB2>}^jy7sSyFxN~+ zR#0TYf`g!M27eGNNDBINX%FAqPH5Om(E0{Ph`|59Ur!XyKZphX+&lu@nFIkADbE6Z zKRDs7@acMz4X!2*0&{68qd(gOL548{pna_5*n9GCMf;7l@9tGM+a$fIF>oIV6f$f!=@ zc@j)G9CbmgYi`8?E;D$Vl-mf2td2cl1kSs2CeduD z1eofw6dw-sSD2kWc*VeDgHt!Ki|kfg=H6czd9?XxbXMU&N~YDV_@RVj$y-m$6NP5n z%{EufwJ&Js-k_Gl-MHJWrT-;}Y7>!$#CkLUS_q2U=%9$fs#%)4Wmlx7eteLAB3)g9 zf-0>BJ1frCHaxiiSUtYNLd(gebvL%Ol6ef6T#w3ELEs8djX74Z?RSGOE^BVdWD-WE zu%`7+BVDU+@V+I(NxCDPRFqAB5@QJ|;|a&FhJ>PogigTF8nOmLU;a}sh5d{y|3+lD zL`LwCGv#$i=N(AF6~mA?){!AN9fl1$jVltefs2$R)DIgH1)vnD_48W@J7}-CIwQk& zlu4FPcHn$`{>0+w0Ml5&4LYo9|0hM2Cdv(jNEAHnf@vYW^J?x4F ztZdB@vZCC_Cc_>%pouEX*}0Gb*aX;1m`K&wz3r`}+C|g=1PZa&bKX(7GW#R| za|njJDk!xf;cO!A&TU47kI&*nYiL^=VszdG5;!3anzwbuHrK^E#$F&O+;!WydM_FU zz_ZE^fDPO?l*27*ef9s>5mvvC{zhRCTavQ7^CaKip< zv%;5l21rz*rYq4CyZ!zpP||$4o_AvX(CfA`u+#x2&0+lH<8xrzu-${8uJF@g80D{rX^%q}A5Xpc8E^)yzX>O2)Dc9ET*P7vtyhB1xgWQ6u0 z)1}wZ9)#5=yM&v|e9KTWS=Vt7D8{pHPWEbq$Vx+dz@P#3)X@j{4WXeoA zf;d$d9l9Mf-XF=B=e4=>>%fk(!tYw(#=u`n?kJDqg%uvOuqV^$Nj#}|6;mMN%qjpO zj~5|n@=`enVKcCm1P#1*qSY_RuO|kJiV#r32^a7M{dcQZQe_5~3NYGL1=D!{!mFqL!aEtOTt zx+*(Ivi#cF8Z4ieM_E<3SiXz7MD^*y{A|obXziql(C$Qs?t3`GCQ)sqF~B-N4|X=U z^Vyrz1rW_U7TusgvoaI3+W^)dqtBwETaIx$%yqDeP^JL*!e?X%lfbaMIg6EA#RK>S z*xeFz4vU_q=}zgZRHC>DyQ8tAt)%<|9Q_~>-0b*AI>Fi1+EMfwf_%Q1kT5d zM@%a<93IFP*J2Aty0DHuA;f+p+4AP*+Yk8}9V&tUxBFnUd5kya zf4>#%DN8Taf)ESNvdwdJ;5>3<@;ov=)3lKN@7IPkt`IDcA@lRCJ%`S&MRfnq5VYWz zg0oOF0s_xA^%NuJT%S{Klwyk-3tVR;UZ*fZFsLHbjV3HFzG?A7FtO$O`QT)QyLk&( zL$&|L3gNz$JH^rh5CUer6VeB1J@_gNI~NP*RiCBVt|V=%1&7Ie?-2ILn!KC@8i3o?NZVa=gIi5lq&mcrI^e5 zNkMt*3-f>739bC?iQ6!EGJvQCy&@M zEHKmTjOrm1CyTcEn7P-k)6F!-@T-vWDjV^LdT|^}QZXDWeN45TkXC=Lb9BqMAl33oRE z*DWX>W|F^n>HWZ2kiES>w;%KGp8p|3W0P(3%L?uuxmVs_i?SxjGbSt<+3b{E^3!^I zE8QMzagb2B$Wlk$`1cY{&g+6Sn@FFU#GzP00G}p)aWEH5Lg#^`c-%+v=jg5@}tEaiFX$704 zNi$oBQEO}WX$G7LNIQr#0aNnezcD2rCk}B(s`~ghOZ|{Zi)=qDP7|oRC-}w%^WJhL zpC~EMIzK+dKwtxgHmQ)!o9~!Obo~ECHab0nsS4TaO_ESlyaUlRvF>9yvLykN;LNy- z_vm#lA@>;0v6D#@RdOsR%#Ktx-dg4)yTNmu#t@VC3BEbT@E6Va*-Lh9LYh{_o6GV^ z0=h^18u6PC14E+BCAE1dl`~F_@f0plJ!)ZUPuok(a^`b{h_Ay^jM93Of%bB8v#g=v zLU64r!9h^GYIxhYKO;Z@OjX63*H_+TAe+}WD<#H*9ERJlE(@ppONU`w`Kz>sewUz7 zD_Rr~kwlXg-lDB4rq0!stl+xXQ~-gB<8BFn%yJC^;f=aAR{U?R5~ijKm5pxiIUPgd+b(uFuN zqqe|_(f=Dxj2(+Qbgal+aEae7cS|=>7t|T%ysLksc@DlfkV+670Y4g6R$8l_luyX{ zS(Cvu6r*i!P`Up$R-*`#u)Sq#5d^0C5Q$gBz*_lDiwNy`oHm;AVZABabqiw9zpy0> ztZUgn`krW6rvG)J7k#hQ|BfDI%imf{{0zaF zE=!0}S<6^8Q&Oup+j1DM%-->+%Dn*2>^H=ARu%+^Oo^uK_OGbaQUJpN-DY)!xA!kWet* zOFP#oI(yt9yCWb>5aS@{Ou`XWl=(8B6M0=bA@HP@urdr#1dHTpzsSGk^ zApf#)w{SeRI}qqey7kYhN0zIX!hx6~!koAzn?W|m!2D1=DA_sX!!V zU7DO#s0fj(Du21sI(cjX4DDU+Q>X}c>zfbtj2#Xf%BkynIYKs*AhYXHJXJ*m$`&Vt zGay$P!c7)xLW+vDxfyXu0#|^K;^I8t)N}#bQ(VRgeqI|9O>BPZ6Zt{~5MpVIUjKQs`~cJ>hfsG4%@?WaNU31Z8Xk$l+&l zBo#2Uz9IjTY{k6^P{*o+24HET*f-QYA4_%6mJV)F$=Mm1BS8GgFdV=p2s4l40!$uE zU^m6&u~tAYU=Y{82_z79FAN#Iv$i80*j<<%5~K4L_(U=yjg~aqvv^$+3zV_I#2wWn%l`)A718AL z`v#R`5}}zSeP~UOd~>k6^B0TNo7dIitP7Sry8o|~#+F?vycxSLe`0>;a&fP&&CWk{ z54at?z4Hh!GUi&`oxr`@4a+wCJofqHn_mrXsamz?tJn{Ek2tPc67WG#==AEOxL@|W zww0y~46n<$o)*}=o$#AT!I+knyduZ``E{Fo^pgC z16b*!1V0?#n0zdtXVgcxTI`~%kxv#r^S`g~iT|na`IRubeG>D0@Z5UC(&d(n2y=YrdK{1X{DR0X zk{Ws`wXDKkXe!J;sYfhb?rv&0y-dEB7eOX2WkojmWWQ3bEexgP6kqji*}u&D5?f&Q zIgGK{pM4QJ?M&@4Zjv~w;Oc79^%2JMbgh{1h2QO;Hl3hlcQ$RVe}6~edy)LDwcq)Y zx#w<_f%och(GypvdTMIU104OOahPB}Y7(q=^+vwwrW3VmYA+cQ+cJG-@w~fpO+(}3SN&GdJ!9DMe%-d7?k;Kav*1hCW+z@YKcADEDHNR1k!5V2 zGc3C%>V9CP`rSw0{gykePq3yi-Dth2VkH{e;%cnD;6KM_epZvBE|%FIjBI@5J%Au0tFB?$bA^UAjMe5m2N)uAOQ_)P6g zo$C%Z*gv)usx5M{3Yg~PG=1j#TG+cD9?>*>{NBZnqaCJ4DApd&@2Qt;P|I_&Y!li{ zzAp7?SXX$FJweIRopPjP(cwO^Zom~~wkG^ZM z#YUCcz8Ah&jGOpR!PA-0Z=B^CR1P(^wbQ6dH_t)R;XUqfnHE z8Sp!NVxA`{X9G5PhA-!CR8{S!&r!pzCj8*BTQz=ypf@x=^Hui;8?J&=c%U8AN6f$K3q9X-lzKdLTFR+tDAlnv)vrAMl(`w>z7OnRn;@! z7Ho6-v~BonHPr0>SAPCd)o33*usOXgA%C8K{P{rAmY|h$`ZFJI>-pKLJXbXyC#t?2 zKA|&@R%C&V*Ylcn4yrM;e?PS7d%;;zYO|wM-?n0WBx;zZ>DVfCqKcmwSH{iY<7O`)KP7ebQjv>h0W=}zJ>>$ zF@mbCBHh3-_3L7s@9@Lh&m~^o-Zh1NdAz3E^r4=cx5Y+(F8S$+5(^Jc9_Li!uz9 z1@CEYAQKLc^%{;kWc;L%UxCItSLymtzc`-ZXp}@MiWgsE?a*T`%|6R3eQ=x@)TI+0 z?~@;I>JUT^;*0kcNlB?BU-6~Y3D9q+7Pd5-ddUlZ?Je2n#$ABZXQAO*GC;LawR{a4 zOPAPuv(N7yhat14<{6>H^4135WfAJL>;6^z=Z*-YA!E5owK$V?R2SmAy)ZaH_GSM0 za4T3t+{mqDhotaC3w+Xz4p<85sz1}>0wfRf?$Ix2h!?S+PB$OyF7dUA3K;CFJS3Rk z_wr;k{LZs+4Y4z=*9-e|u60KV{o87ecB|NP8H@1@a*Tz;qT>+h!;KL9AebK}I5hHQ zGQUI&t5BPRJ6;L9g1VmvM&X#X82C!Y0N~?2liev1#4qzgtz!h|jky zt7$$@(^o@(W>fm2SKr+S{dqiZu7la*($-`211FsECpJrzZKJh3ll!hE znU>Y}GzVK13&PskNuGmo5!A;QxXW=RPr?Rj^}{w5yRz^v^E_)(a&7fYN*GaQ-gqZN zL8@l!0Cg8WG~Bu9NxXf{GDD{@A8mai_VCAH^ufdN#=c%h+8C}xp;wPjj#CXqx3JB3 z{1f-mdq-C#d*JJv9ZRyCJh-EoP0|{vO>|og-I6*MWwCEK>ZtP~7xvG%P7^FDUu4It zg5KSkXgO+(&!1=d%O8Tzek(}9c6a{bC&54APdvsw!$sZy{b8O|msi60V~Hs)IZ|Aw zKH#H-!7^eKl@oVRXRuX#w#0ML6)$-ba|u;2-6M+XX1M5VS&A+tOec(6D(eaM35cHm z53RAvvdQt~gXY>Wx%T8In#MnoaNIQisbDEbV#FOtlGbkwOp@k`={CFvRF-ukk>|2Z zvRD7^Gr=H=_v<(uvMQ{dm3#jd5|R@s+^l2qS|B>^=aOZACKk48VH;5#Y47uSaoM5zO-%J9$w;%lUi6x{JB zEqQx+u}@F9dA(7YNqWf4ba>$oc7@M4mu9@SGrx8Tp zxEymyOl<&|r)+Lf>=N0o(Sz-4Aj{Tr( z)Cj%Jv+zlRc-b>falEnUam+z_>(DvM+L15IM)L+92rJ}1U+KyQlrD^m^{kLBT(3`vLMC_X z!Z1;f?xKS7Z9NBc%{Av>Yd!pFd_ipShQ80ZVf;Is7*!k5&@;BUuli5x=Y8mcmt=QJ zqn*iy#oZ+CO2hQJ9JiOu`x395nwu_)r$R03Jls-qlG+lM@`|9~U*e#{AvA{e z9te77w3Kpn6;9MunXcfS4tUv)wj-A6z}sa#%igw?tg48 z=A<|f=zZiMDvZO!qBFHUKB?+k@Mj-)epwbU*u8*#X&{aRp>ZT(LHz^wizSS!L~2eJ zPOcxus3{i3cV4l=DctCT_l(;TwiD>Bs&1K@hjKMKIfUt)SR#B9!%7)i$ z4Rl(LIwsz)f6d$L*Ae`K-vZaa8a4dVNt|7l46~cjpx$QZ&|#&MoK!-;jLI@%qbdu* z*DlJlW*Lj%sfrp?(~lmMm$aReT;nQjFXy}*_DlSS#&IZmVruih+I#b`CaEQ5j-HW|BxP6-A`gsvuzSai9tk5t$)DMWRB8 ziW24^5uzj^LLdP$ops+q1gq_P-gB<+d%x@Y`iB>k-84-5vg)9njAfAvAly=rh+h)0Cf|a%Kj!)D*81Y1p5jlGY0W7BcOX_g8 zeKUp<>TAdb??CO#JmtzxkR>Vnc#KGZTec764K-Tw0aiI<2lxw^3XUbep+~1bbZ!(W zzfIYL7tOW8)+Q*LsfT;Nx4;_u=c5J`6~)btSLruyN-&@$xX!}@xh0rzzDp!rS3)aT zkG5yBvvy_loFM{Dv43*Y#qDR=7+YrR3f|HPk9e=z6y~l>>x0Snaqr+I?ZE97ocPwR z;%K&Z%@#C{xsL~$I5-v}lfNb;-n@$zj7a@|@cK6hELg3jEgbt)xs_4vqSdts2&xpT@~_#TI}67+QuilydNesob3LHTT$Xj8;FFt;y|XYypA z>|s(VPZ2%NgrkQ0*IDhcS5*PxU0z-eu?s&Rq%XqVTT*PNIrH`W3fWg`m<-tMpN7eH z1R?rS{$4*&PnEvD^Z54hK;FmpJIfT`T_6Nt2|)$VZXW^sy#E&P8;6;pFki(j4eMKX z^sKV8vXMt34f}^KcSG}nN zs4Fd|{!vHfV}6ObWJ_wRF8{P$YUd1p+&Q~6h$kXy{L6%8%c=YlKVFFUPE!r7 z<7P2Zt%vV4Musx|ZMyQkFx3hCr}N9cQPOIh7qu=heC9YbhggfNULE@K^f0c$;0JlCh9{t9rDxAbY-d5&w2C*C zQ^f}{?_dN7q06XwdePY#VibHR`TT9gvkid;YeHtZ9eW2YURvgw^Nm=sInaEwDI{4F z;4Qg&RulG87Dga|S<-((c#BrD*#j+UElFxq3xRC-#5T5je7bB)F&4z{GZ)ph(o^F8 z6>vvBdBwQFO$#izf%6LDmkIi^r!xy-YP)L1CoKRKp6t*RA}zY);EPX|S~ z8lL4)k^l474t*Y<|1At&-xfc&yH>GTusC?5?i+7%uKhl6XM*+3&NZk-ORE;p;J75KEA(wG5{PM^?d z4-dYgKHw##1|v`$3fce?wE&XJwf>!su&CHIsHO z#jD>*TMd+6L4eZ7q6f&^nW)$VU8mX%UD{8_xp_|pZLmP!>DBxw3j0n$(c`aJ5AW3a z`S5I1W-jQ_H=n5fx2DU&^(J9|rjCW_{=c(r@ZSS#K%KH?w1f3&cro`T=E{h+t9Sn| zMBZQ8x&G+0b)wPW50MVkt7>tyOa^$aI6YqWqffL(nR%gJX?dRX)Ob~K0g-vGO1V-2 z-?7uaI?JIL72ZV6MF=dqs^~o6!OfuH!6p)mue6jfBWuNvTxVCx$&Km5gw`V5EYaar zXG~|r^Qz*wLth6sJI#x-<1K9yb=SK1cxObFJNGJH2%K?5t~L_)dua|zYZDDIC605y zQT0m68SbLrj~NFx1!DdE{T<{z(LF&;b}XX<9>$ex{-w;F2HP2=hqXS8RcrEAWIt!; zTq(SCL<6IVE^5(naNJDd+zL^m2ch$B$xkdB)qg)JA&FY>!QfYcRV=lOm|t za#z4G53y>~!K&?=*mfRYpjSO9?!L7`=Tu|K3rpFFxU&b^p7a77l*K<}{HiWVe8X}G zDT~xEY|HOl*9b6Fi94w#K@nJmxm!aLvG)|)Zn|N!N(c!f2;g;|7b)nv6CjAxy zX~1<%p|%B|onyv+RKL)O&Fu5T3Hq26_kwhx=5Qq%1Y-~AmD4eCe1 zzy?-*LL@;Eh^z5S&lMNfJ`W1>CKwm}_P26L8hDgxEFP}nM%lj!;SlI&w>Qg^{h@3S zY|u{G2>Eie<$o%6YDTn!dCoC?MMDkoRIti6S2~j6Sly3EJ5$XoU3B|y51!VgGutBD z4+#{Ep%25DIc^r@+0IIwoe-khUAlW`v3*ja92HclwxcmhKL8+9uhRN})vh@^_jkz>8*nEbUDn4=RA1EYGg@mS+kdl3 zwz1s5=_pZztxZyVzh-np^8bk&0*g=ntOx8rM9jqExP}Efxz@kMGk&spm^jp*!YJuK zzS@ye5QIC&iU=&m?ZkFHAXy~!CbNb=2~h2%5Injblm%L+V&L9fy_sWo5rI0AdMy*! zcAvth4B7r^=OR~`Lu!$j&I;w#@0BtmTFh(z;Zv-u9$j8Y#itF_KkJxAe9e%Z99k7j zHq!879hVnH48pz`gpRD`ZylW4)u?+6d3X~F{tFxPQlHp!v z+f?-^iN6wCH9Kj@-H2OrnI#V_JFz;+x~a&Pd#5HLvN6H}FNn#pDzqrYS8+*%;7`GY zBcHO$(a0>4$jvT1r=RqCBeu;Sz%rRw?{$>pD@Ln$-JfIY?tf~8sIBSRi>IQ0LOlFP zB@c}0PhiAnJz2Z!-7J7$lL9{|B}}t!KW={H%Ooh76M2wY6NX=eK1v9(FgNrkq39Dg z@~{_GC_m5&d6A^KfZ62_uojwWqo5qD%rDw)o|swXe)R+c5{V$y+IbL72eW$v%LC{3 zWm!PBmxn`Ni{fA|gg(dCy|S9BMm+j_qRsr=fMu+uG2s0sS5S2UH?YGlJvUkMFx=REvS$kQfGRnBHEt~ z#O{H8@H*7+oJ>%HYaV)00;>=d2Bk7tRqmMg@VKnXogulkzAH5`Z!5a4W@X5Fpc1s^ za2ul<*S&K6FgZlPgA%4BB{7eK!g<3{-}$m#E;`4M^E(HMuwiWj19#DK;n{6;A;T>1i;r0rW*JnlwH7t zS@-zAQPd>#3X~-mJqu286_am-Ja*y9lfhd^0r)9sW7KUB)O&x?raBE#4OssznO!*a zY!+8eUHB3Y|GZfTWzTH2gZuf#(e&L-%w1jL_Mer^U&Qpvh!>)D^v6krVS@2V{~$GH zC;iq)k)6nMeZLa+8rv`uTfvBtSpjxEv-MX5sZ%eQa`b=^gaEAiq!E@5SLxI$ilP(f z2-w0MRzqAj)DV}#62~;OGLq)?le!*6gps{iW}b{*lE#a*d$K}EHQ?i9;Nv_+Tu1@< z)X5_97Sw>0UfCW(MGeT9OoTSHAu#61{iDBH*6L)OIAiD8$%udk{0|XGTnkxXjDk=R z>Dk^){#Wozn_XymGM;R@t=Iu@JJs7-=! z182&26<3||mw9wYbj}iGeUkgsvjf$xfqXPqyY+7fH=uZZ+L2ifyp2t0d}>Hqa87HA zzON_%hfUcSLl_7(1jOur!de0KSZ5}^0kja*$6Czvy~~Z=xcs}lU~g$)rSi<14nSSf zS=Rj(wXc|!EnJ7KW>v{>g&uI9u{c1M=#NETB@KCsT-yeBL~dkc4K%pchmG*GJpYlW z)g~=@Q9|T4D!bO%K3BN#YX+2sCDa_=CQ^ULhrmY9n!NX>-(*)bs0zJbN($##|T<;$^#ymh%jsVG?F$`)RLBj-w_ znoIGwvrsr`6g;D`Z`K0}n#6`mAV9zJ9f|`SLDpl#b-0@h+U)}LQKIP91Atxzl0)Vi zcayS0yP{N{t*&hGd~8&&GXDf4QlhKV4sq$Nq|4ehKOWJtg$y@hUC$OI+L<@wmR{;3 zOW-uvt3!h;dewLP+GDlW5z=gfYW&hdUo*}{zItj3xAl%YZVq(*-5$K&SJIO}e70A5 zzvR`^y+f5L=R2pF0%6KXJUdDJ5SUzyb8^dzOk)5K52gniziRB6+!O_<%N#sXcILep z&t}TXskZj$ds9~xIvd`>PrK2nye)$RiA{?)2YpCY>uykF1gd zIm#cRf;7$uOrx9M8-5poX*f;G7O#XEF%aZUUDyql39iWY&$q=7V0<&5NWOwlJPx%~ zz``4h;>Ow!%nSUpEQep|;4jLc$%x%`N%u3fWF568jMq!V}UM0 z4NSA|9EG2}=mEC;PrbvIz1F!}u}8}Kdpg?h28>6UH~WUGiq&*9EAh!8SO80DJ=v1J zJ>4@*5g221fGhf0R;Xu1%Xi)8vlzYnbGJSReh>r!*MRnD6?dBrDgF`&0%$}*+2j~S4d1#Y@f}=*SZv^H87+Hlt$EF$J(kt)Dmj6QOS{Gn z66JK3JGilerKrm_C279(xvwTF=`KZ(rwq&+U-hfOrNQ^Ydjqp-(lMb~4vdes%_=s* ze}_UCu?v7}WE9&qQ*-8*J0M2@P+P4a(%sfEy{VlRQ;=~P{aT>K-DIbgff z-jW@x6Z2f5V)+I>_kc;*{179b%4+xc#QBo*i*MawOQ$Ec=8f)Cdtw{UJ>Djc#@+#3 z5O~-g6Umo0JVY@v;X*{Oi>5+m$_2XF^9=$^S`JvIcN;?zRvdWlj-)4s+k8U6RovDq zExs)M73h91A#*rZGDXF%94))ae$vThXs<(no)Nke{Nz>)Y^k%xw+b^Wv>|`mgK(7i zW#Z>>=CIBann@Z@t=75rl3c?JG-Mht_%~08s09~|q;pk6**(8S zzIp)sgY1ATSlu0j@`MR)*=M!qk1_^F6}z|9&WLntf1V;OJ$+4Ysi?Sczp+j9pZgVw zw|>2go!Riq1l_XbmBAfFrQkrZ2ajXJ&95^<$JNbAGs2c<@k*fvlT9g ziX48e8Mc&~%UFFZ!mAdl(VxP0{1FNQ!hN7$?JpJ;acc4dNITgy4WN%#U|scn@r491 zyj@GwT4QY-j^LNO)mrnzLjp+o0%{=^nVz?4w|}N(*!3;rdJZdbhislBsUAh#fVlG! z#+Z7I6q&C#(Z&sb)6DUO;^p_Y3d@gUP}!W&*5Xco=^9Bymmalx=x@NMY<3vwER>O@ zg@4$Bb5AV}VVz*Fu`ND2h5{6t`QV5@|M0JiGO2xoJ-y;1HIqF$1!OixWi^7Ujw?VDO} z2-qSySP`KD9Ls9-aiMlE;IZKvROUPQ0NyFDZ*dVy> zbdSF*W4$M8e1ewkMX0PRb&*<_u<8Q?Qa=3Z+l@w+yLI>KI(j_y;mDH2e%PN9-!Y`D z$sL3=`BFz*U=~urei7vd={!IMpN7sFT*QE|Werr-Cb21=*fz3&p*Z#KaWSpaMt0g9 zibKVZk&@Ul;RUQz#_3kx2x+-deO;6qlB*Zpedg^jdUX)f-+UqkA*I$J_r$vPt`{85 zLC80N^}ZX>hUvZE-_R;vMX?pTowp@G*|LCH-8VbQjGe$|lr^xrRvC%i>3_@ZsY3}H z9|0itSl4!h)>$}`b{+%vPecu??@NCpBA^w{X%MmAwk3=saHv^yz#F^X97s9IP`u=P z@|`4oAmQZ650n=Wa`MjUQzKOUTw>MVu&5x#lB>Nj$)9@)(Z+_wQpYa*0`a0K zi^}uA%A(44N*hPwcu$lA+=+(ZPQjnTojmGI9VwP-1{DgxpaMil9igehGrdJvdGjX_ zE020s$EqaKIq#cni`r0t+h&OAYeKkYga#>M6$<&xapUak{0n}D5kPkp|#jfxHveNvd!RmBl%FwM3!2h3SMu#;?M zOyK5~36;r=bv1t>$Kfq%m!hy$=fDO!KPm{ipy1r{=-CUgRn0v~k=gglM!BFPTHI(U zyNL+Ttfzm>ha?0cgd|RQxh44xF{UV~fM;(j=2~}r9A0}gsA0WwwrVTx+mTqIYC1#& z=d$@r5gTRe8c5SijoqW$9ijI-6L^KM>P#ICxz3cxJ4CU&X#oK+Ld8-tLKKn!*J=!a z;|u^GFr=&e$gkldeOX9$%iynl;QTQVhuQ~52?e+iK;QAxKn}tW!R9mrzsNHREB3K2 zr9=BlWOr8jeIGiw}BCgy=kT zK-vvPw`>As+49Oo1^*p<>VMAm;u^;84k)beH}{@gwf5(wjz&Rejp5`%_kRc|5>&Zl zlnTWSeeH^PlI)EiSld$bC+yJILocFarS$S}^tE{Uv*0UgHW;X>Zn`nsDwNJwR4Jwc z_-Ky9N|Mrzc@IcsQ&CnAC3GL$Uw^Y8=-d_>ND~#O@eg|C9zMut#}k8&U3? z|6GKK?QZWGSt%1-Fy=K=HfIReIs+0>*CITW^K)igLuXowmC(Fm(hQwkg_)Q7TE!MX zcG0{Qag_Gc+C$>v8n(rEPKa#R)A=2$15`YTGbBhT@DS~Yd_gOz%8Kb(Jwl#}Xhlg; z9(aMgdl;%7-WltRKg5W}ye2}ieIQG=+uIo_nA%9r=6mt{ftOnrJZcj5D`-Y7`24An zU=ChK;gE`gvV0sy#D{{y@wkT2i&QjHT)ff=f)jR*7eD{*hZGd#ECNgAXIqIAVmQG3K%_aXbzD)#Y=%%%9(5&1^4$0Kc*xI#pw)IpYN zhoal|f48G@9Kq`KIv{rVnuMkE_+DtIUd?tSMqxdG-zs`hO@gMxOPzNo=^pN|BsL{8 zEcs88%z#wvWW6a9fY~S#2Rq_OSfZ9 zHDcL^YW&j>cKo^eLmUF<>h-0)GeprG znMcsI03}zXTA$amKo{F^r;$`!TYF)!Roc>gC+VV4(utY>)l}6!NC!Yc&F=m%(zG)H z4tdh@7t3GD=%aKj(9?gWVS27VBL!B5e#(jwh~XKhLuI$1ZS&t(3`do%OynY#9PxCt-d zP4xFSF9BW-9KCiB73d5|e(zYZA)7iGvYk{g`zS3dw(q|{%L?#}2aW;8Z%KtqWaWOd z%K5vj;!q>ycuBZMom@8n_X)5>;wJbM59pBGWg@9GeSCC^POho#=jPZyD|ULbkG5S& zP&bPL#$>41PE3z$m@=oJFk<@=twoTdogRc@77|))HURg#E*FyX*yGTow96!Hegpz# zF>g+&R-P;HmIOtAHPPEVlOVnE4j%xcSjOUe#P9KrS#3d@VNvzQ|0XA%xqFWBM)cu~ zC!r&qH&b=C#oNpg+IB-N6ch3*^b-RyTw5pie#x~gplK~~`$xRY8j5jXp)Yn%F3Um1 zstv_DNyM0{J3QZE8SfB_)Z^$%YG18yfsKIZ7Xhpo+>s2p zfyF{}C8_Je@alHBcgxvl{v=v64jV6Q*bde_iw1yBxLC9TLgJJ2=y%mn=G@~sk}ccyJS!kPue_lVDN<59fiyo%g7 zx1QtpDkGVLTYax#?)MFjCg^jv?~9(ImR=Z|qq})e158dILNS2rs*gt*zdLrdT33K$ z(fTa3c$0b?^G{VfpnzBQcVOzaPJPx4J4!`OUG$ksIwIyV?{8W9q);!K??F`dV0>k- z*A@b61x`2YEK(;&WWj~*Pb2z0uM-BCcmBJ<$rSWxG+; zT)uLDLHd$gYfu@qHa&`_kJ$r2WA-3$vr9jCs&zA`+pS#9QAYtroS7r7eJWKT`e)FGY3M?er1)w9+eehp5`w+tEX0N7CBPjuqbGC!Wwi ziQi!0mH|@JFA6P0*i49od9WSg5>UzO=na-UHzkmWMhDBfyU*AO{}jmu|M9z->V?12 zo8QLXLBjFwXq1r}H_4@&XZb^RdQ~8P?ifNRg`RSbSs`^5=A8&HPdZRe>&=m^LXPF( z&A@^{G&w(q6Vk<0wBLSRsLXi zQj_7%OGkil`>q=}!W(SlBJ;^c2P=Qx+AJJMr+E2ihvxAe*3jx@7ap_tX)Z_D=B4qf zwm&;+tU^owAYN?R-@~TX=AK}6DsK>7puy_Ln`}&5D7Fi!YNt$4**?~$G?rarm{m?S z>y83>RDc(5huSLQg>Qn$1SKqX>2{w4zz7-xk=DjJq~*I;wpk>}{h)tQc-f;+Bo9>N z)-!W3F9tnC0ZXye)h8!V?;lvBEMNa2yflN&tSZeh7Q16kG59mo{r;(um5TN)K%jCR zOQ1T=-^!md3?g9h9&Bj78bcPv0JLoZs`l#eS6>3n>4FAZMw;Pq}O z+N?h!T?j^};_w&aOu+isUhoB{@Pb*0&OzI71<(YLwqd+89J-5Bo6N3b~ms5LrV?o`pStKNtrF@>t0lj%vy% z;lO^Re5Jm{=v9WrY=MP2J{CSe7WM!*uduL=Q?*l;9elJQ+gt;U2}JfTuJPq0#c)&Y zV;NFZdjA9qv$qX?Ny1h-w0dxFA(;E(gDcQg(EdHs?V{R5Mf&rA``LaApj23bgs@}m z6TtQ@0-NA}NG}+1GReggbP;xoJfr2Jh89u{TTl2NCIFaK$WFh|_od>>OI}YpBpxT6 zih9kS5`NCn$xzpsmjHF0jEXMxy%L*iPSjtF)Lm}M#@1b?f28uX&1VPVocc-tCtZvT zutfS=TAxO3G=z#_Y3xRc{;Y;%bPK_P_HwT=LVztSfi0Xr^b=ZINIs_C0@u1F4tf<( zu*>Utjr020wNNtJy(F%|Ta{>PSgY=%zGwTkVv>UtP95LGXHzjZ!324pm5-kxFt+Zb zo%R!|#!iviIL}xvA|hVba*!Mq7PmNHFE)4ei@DZHrS3Q9qh7t#N|hWpy|~Y#`-Z-+ z;i)&O!3W;MPx=i8MrxOcuBXlzq=|@(uAWB2oOcy8ILNYj=sB7v4`MXW%|~RYfSC{P ziw&o*&h({_hTn9#0JA;Ul=RA4C)e)YT6K#*a>5yB0PS+znYyJwuQcVd1SylnehW|_ z*gHK(gCBi<0&$-?6ukOJe#x7($12z{z0cfR+1F!BQu4^OVu2lY_~|vGteMkxM-;=e%5159lmivd-TgQ>*n`^@ z^e9*K4Yu@Gsi!>{l1(CH+VDjY$VGQO{HI^biMWPUJG|Z(l_tQxz84hg`-U6o`%1kH zB>BJbrwrexTEyz&RDpG*VQ!AU5Gz%g^MB=B3`5H!hY@XWGtPb+P zKsf#zigw0r8w9jtaScS>Xmn3dFh#5jQZP-v463pA;t8PT#oB`1%hhYPBTNbbWUBqQ z^3mw2{TB_QPOfO^4d+0ZN@*M!P)B-orW9Y)b{BuYM>SJ$)t^P4AxZHMi}a2fPTAY0 zz(+;aDW5T5Mge))iW1o5q^NGi>`~>>zhPqh$itcBlHwIAO_c$C@WC}>RmS?EQ13!n zP&2gE;fefOeh@y|^K8^JOX+M3fm@Ym`MjS6>7nF3Iovw+6dCmn*-+U9PvRO~+17AE ztrzHci`Ybfvms)xno8pfJ>rE+_d=~{#GkA;fK!)wfJ)dbuk49#K$FWNH}pYBTwgH< zE?;f$4um?>Kdl`R?Wq$LL7ntJ3-p?MHGNCoKgl$f7S~`r^vE=ouXyF%Ow1GeQHn3W z@uuC8Rq=aR_UA8JsjBl>Htb4zlrpiwoIKEYO?3)WerG?n@4A;fMU1aiaybpa=5fU; zQWhznl+yC|GlseMjg<%U`b}Y?;xz@6BWIS|w?^{P9aKU*Il8V5l#e7m?QyuLn0Ijz ze}GCRCJ5@T0;f5>+|>mR{oLY;5G$Z7S=&goU zH-;i`V2)mOqHDxVk4N}sYQ2|7%Lc(S#~Q_GHM@HHYp;04^`vhw@n1vg-agF%M z9{23dc@}x2w1JZxq@U8RtCKrpUNjOE_`pmNMxI{je>M)dSS(OCx7Pd~eOWsj2PVaS zNoC)hjy|?Ujmj%~?G-Jfh>ZOrx=MKs+;3DJt~@G#Ki9Y=Vos8xAkMXZ0X8SEA5`Hg zB||pa!qbHm%vC_>>4^p+g7g+T73E;=1lF77l{mrf9kFYHppeeJUIa6Y5Q^yZ#}}Xo z{W@=_s5ptPn#BAn$y)AHXWLsj!@=Gw^er?h#cgj-HkL7ST>IfR&zgI!5PHGYT3xd( z18*Xs%Aeyg;R988vR@rZ+1N@h9Kz6KFC0`NxwsXxg&r*3RA;YhBa*Xclb_Bl#Xlwu zq_pDikviptzM!Cnw^`|hhO|A#k)qh# znlZB4lZz_EvZpKB@4@2Nn^f>n4;IyZz3bFxGH_w4`JbH{%JnWXUlC{$MzHGw+KM{X ziQNRu{qn&g7}*i3w^(L=95D;>_x1T9dDy{KTCOmEtp7!8@@S9DP0bh;`@-YzAS{Ib zSMU}(J{f}s;q^(?zpyEyUH5H~!&VCysox zAh-}uRHQS#NrR#^@&XB!$Xl`U8HFzgO070Jquj_j&=J6SO9{R%!hW+Xx2+&pEd&xs*B!n2TiqQN4R&nX5RSWRoKk#@QZDMDO_QB45V@%2Ll`geU=TI%Gu%*ODgFp)IH45(Q287y zJG@$X;=GVHQFfgrf`9R4hYBm2+xq(!DQkxCHGSW{u~JpC*Ko;0a*Qu|*p2~_4>t)5 zKDGfn7}RV|d}FV5zP)f4T^da-g4rDT*}*Z zm7AvQXeRCax)$M7Fhbwdoj(8I5x*JS&a&4dQ&y0mJ^>=c9zJRc^h!m$sOb|Z=gle$ z#9!MZK^g?5NMGIkB}H1Gr$2$7rotc1d^9$ZUL+m+js%t_P?3xYg^=KR2X2(B)o^Y- zdxL;8$nXw4LK`v+r?(EPly`d!Z)1n+Tk(~ox@BRUz*eGY;Mqdkw=sh4-oaf8!5Kiyic8xD0b!R!KsALvpUlT9f`%d}cww=QTu01XtV1Pw7TnOZOq#oV{;vAWlN|P^A zw29{K?8v7QgH|g~g_m94&*{I0nOnoRddQn+%bQbr5yFtp0vo8@L&=9ewJaLl*&YBN z%fo~o)I{&%LswHcQsO?UgC){!J9q)qG-5?=F}|`uVX$i3D_6x}_k8Rr28=AINiD&f zgdHGIN5@G8+JpO1MtUOF^qmOr|D6cosyk=g-mw29qw_`tM{Y@e4MzIXCa+QPZEJUl z&4D~X{;;ReN%fL(asRo<2lgN`#XY#mp5#|xB@1YMN$IN10^^=OWvPmL#zBdp1!9z1 zydiQ|Xes`QGF968qLN~z+A8QV*lq3=B@RHGnmxAHDRodwHB5A{syB}5u?$oAQ(6^^ zddwBi%-7h*2>gr#n%H#ZfP+lIQ7Ig%c{53?3udRiG=?NBVzExcbShpaSI2UBA#_^9 z{jMlRFu(P~G^)`7W5ks=!@MnsO*+<0n5pW>8734%2^?zI*ji&mZu@>@zwgN`LbBVN zU!7mkTkJ=^Lxd>N{b;DvMrt9v?612f$eS%O_34@euyBw`*woCIM(VtBpDEC}($Ba< z7B*+1?RmF&v)X?xwk>j16zzn9xU;Rex$AdwAkWBUIWa_G;|Wu@`hc> zhoqi=a+Fj7?dfnF%eM7OnxfstK{i7rUZL#6HxNT4_LSxas%}av{J4k5`LomT7R$C! z7TUmLk#|eH>CqUGxqML7mMxX4E@L0*J3g~j^arcx1D^C3J5{N)H>nrS;mdAcPa?~? zOmA%Oak!mX-iq#P#8y6zedoNncv*=oYWY=(hFULcYr&>}o18eMZ!Lt^Ra4uV zQ3%-W4g}Pjj49B`8#@W66#x-s0cUh|_`t}f?kIR?+%FhhP&We81DWw(6R`sc**RLt$24Smly+PCi%0mpc zh`gX*p1I4sm)YPYxoS_AvdXUv@hRk28y#f2%6iKDZ??)1_u?)s=5;uRotM4vR=nsk zH&(p1OO$UIspr0MrQ&Q@4fvwo0@Zv72Uy)F z>yr44h_eQ~GfpsK-e`zX0By@>LlABf61zeuVTib}tur0XDtmT}#*w@4Vq5R1n08^DxAGiz%hP@qxo_ZE9#6HFm&fz|Wlx&w@flUi8HsB6)oP}k z5+Mst$4V)3s)LG0jtNh{w)&niy>A))S@vVq&z86jHc807V4}2l?!ZUYrCy-ZB>AOy zjnx^=ddaGZ>2;(!mG<~qY$1o@6$y(Jt{#CJgQCpd~ z6jvhaT0Ti`A+Q&9Ai#rS8mSGBF)N}-){%b8)0ia|cHf%Kj4w|7THT( za#8UL&ddk}-<#9V8ORA=Bdi7(>5L#CJHaD<~ zOv3hRb%c#Nk+YB{c{RpPjj=-NZmkawp$q+elGFlSsEY|KbQa^a11!``y-=MK@q zsBjUmR^J`izrg>8Syr#ffl;uDnd_7`y%m1)WsxJa7ib?p0__(3M@8nE1q&dFLqe-c zaEjYbPohG@ozFIy9PrNSG$1O(*kuYK?v#09o&axOcD}u3#Bkr*3Pw50+6BKA61=y? z0NecMRM0Tww`XdcbX7a{bqY5n(Bz%qAfb%g;Y{t7B7Fyy1} z^1(?!8U>gm&~9ZNv`a_;6wA}Il3hN8z}fF41A?=F6$Fc0%3(UBCGLn8349Ue@HHr> zZaxC@HC&~TiM<;=h&*9*Zpynuf+{*fYhOxD0LBo~VF8UOXotnfpja5Z0YKkd8blnQ z>2f>~T<85;&mpSzMdm9bSfL}ja;wbk1anw9^6AiF(R3wqEuuQUqy-iWzlL?s06YvH z^<6toJvw;wX&I?t_kwZgP&Pya`~XPs&MkuH?>Frt&DxeRy`9*2KqoiJM&h=|2ihmz zuL8V(tOh_9mPP!$yu7_*hBwfs5q_)w7J`9G6LjT>=Qs$S!v&NY`Y!qvocH5bU`e?@ z*S^;iGz_vl4of<7D;jv4Zb#4utZ2X0@*fRt0qC{5y0Hw{35`%H5|N~(t_Q8#ejW`1 z)RDlVCk1+`%)*f4@)bc*WNlC#bkV+7 zAmpc&_OUQyG`+K@^^fuEuh<94w%z5>UE@Avee9Ia|A=#&ZsGHC#7=zhym7xC)xJWX z29{x)KQvB^UD5|DgkNK)e9__(ugEo)AD>C+NhBJ!X;}tDDTOP(26E@g}@-oK0;KO>ySup`^Dau5Nk3fhKJz@N@foey?5fp}Z!IYoBf1vis<#1Vc z`OM!uKC{Unl1EM&kqe<$!}l>~tMP^*{9i zLE3PPNPW;^VHwz^54ZGz7Gz{r_$ArYXTNQe(hB$ENeckBadOZ6r)5>_)qK2RIo7Du z-30&P{ramg_boZd_6is7Q9jXCY^$RS4dHtMq-lar?O5B}=hX0o37>Ur`R>~tqc6G+ zhx

KbiNF3@u}~+M_W3`FYJF_1CX~|4MMQjv zCJdEbc?Wv4{(e0bVUR}z^Rmmg|I?yOuQQZVITbJGap1gvp}>{U?L7EhDcYD6S!#E^AFUAbb!yjoOAW+Fqdp_r?3xTl_e6`sgd?X<(pI z9Lb8lpjy*AFRLW}<2S6vqrKKj)Y8nUbHbLhGsV40h#;d z8VQ-GitM`za`Dp{6s6?GF}whbFQVm)|FVS<9fN6VF&S1_+=Hui4Bk>Qd>v|BpGb-LXvknm^@xm9_bGk?m6e4@0@e* z6;;Jr8vjFzB2okP)~F({wiJ$m z|A11d^mIHPS48CVGWd5kn;j%cGR?~l!!S;ZsVV^0+6r(CoH*yMvkA>+^O367MdV|* z+x@lH?Fx{mdc7VNi^VIT3`{-Gd)Dc6E>eIo=FgUS1K>f%{s+8v&Yc4Iz|Sp!hrnUR zz68>uTSsWO+x}!S`2@UB)h|hsRQvt@O?p68*OoD+Y>XKgW2#xdwf4#8Sye?^t=8kk zV&P?gLtuYtHZsqfDvsmPU@#Z~`1ASvoQ;o^QBPHSo6aBz+Q2&iUsd0W$nG+>1H1)R z9eo47ZUR*G`)YsZ60Nm0AOd~>FP(G0bGifI7Q%L`ndNQHu>b%707*qoM6N<$g85_H A)c^nh literal 0 HcmV?d00001 diff --git a/Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerMemviewPlugin/images/sync_enabled.png b/Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerMemviewPlugin/images/sync_enabled.png new file mode 100644 index 0000000000000000000000000000000000000000..73137044d7c61357a6b8672643910bc651fbaf82 GIT binary patch literal 446 zcmV;v0YUzWP)^lmBD+z$eim7A76uF~yS^bv*-zLT z`h*zUZY8zzUR$?`1TH)ckb#a*mGN~S>(C*qzEpz|z=Ie0O o;Iz}0`mK|?{9^YnzwtM`0x(}}vZ)sw`v3p{07*qoM6N<$f)xe8>;M1& literal 0 HcmV?d00001 diff --git a/Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerMemviewPlugin/images/view-refresh.png b/Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerMemviewPlugin/images/view-refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..cab4d02c756502f922bbff34df34c0056406bd96 GIT binary patch literal 1364 zcmV-a1*`grP)b zm1#^AXBfx-?>jR)yR%CSkD4Z}F=^Tmf|{770@hEqO%szQ{n9is zHEGgX6eKmafTT2OwXsKHJW8z!1VLK`LOl=`0dax7=XjrfU?CiS@JlE8XOfv`e)F4W zo|%^s5&n;jKTAy&;^&>EBHBBo`5EO|sKj&=J z5_Cb3Xb}|nqocOcn7QVqeWz0dr@u@KTRZD39?SzX23GoBb3MSyUw(0^ZDmff>~gB$ zoI%$O1VRQLJess_^m+m#;{k~=9QJeN3zwvG=)Bz$Vg)gg)ls`=U>nzH zUSF+63=0$fFk&_?ZmD@ zc?Mck^<7DVOM82J@iOh}mUc1b4RX!_VG$97nd)|hN(wTZg)gK^L_o+OY+avgFUrrb z_dk3R^J-BR>*^ggbs>p)FV8M3)z7(9XZ@K@nhF@qVOPSI5Z_;`t>7V!6wio%`?=P> zA3pu2HQ3fOOioq8(0B+>0w&hyr!z(7uq*-D9-a>d!)pV>lgu3#<6WMedPCPuFCab# zfSWZH-uC*6wktK|<%Vu;{QXK_`-vYrg7FTH%p?t$ZjC~bI4mJpWT7z$sG36^%FIZv zjn(W8V7$*Fn|I;FwAEE~>4te|Dxga-4h2KwAqW6=g~PIlDMA(iFxz8Gh+v}2@nwv| z{_|(`Ig88U z%-%Ny0HAWkqWLbWYDiTyjEIJ7LTO$Sn$F*e42=4Y zwjJNqu+UBx&J;-%$5e;!r^&ELn(+IpY_e?4oS!pp)0T!Qkdf#F1JK<+Mx3!##qTsP zUG&@%p0g~mVbT}eef!?vhrU2Kn{nKoz45Fth%o?ba^f&J9>kEBT0b&DOv1B6Yh(lH4dhQNwwkZ<1V>QD&5vpGVo|a|^hIHgFiABV;(0R{` zR|+$w;{0^28<*3^uZbcVE|zw(r3W-b^98;e$VZ)-gBS*1HciDJ$>!YH7P5%l`C5O zT5zU1RmBKKOo<2(5#OJqeXYj^t~PZ82t^YlqTmdet=@g?&6^GTF9WaxQ0GL6Mv|Ov zB_X3AA?O|U21fh50QBfwN1{+4fCv%MqNRy3Ce4A(LT%lQu} WXm%7v+TE=2L@ zAc44q=tejYU5HLZGooZ=NXsV%)bU*sTokj@jZSo^9&w{ke7#VNQ*1zG!rIRk_@ zCqOr;g6B6CM1oPv1(~U4k@Gd+5tN0(j@GA*K*busv3Lb0UyXuowiRkTRZ#85JN!eC z_8ZVW>+upx5C#N|BTv2dK_EW@%(@F6yu1sZv>T3gm&*mIkvej1R4=RyYw#mS zx}c)#2z<)=VQ1|=ux>5PwjVE+J!Q84EQyG-j9SFYV*6AQj$Gb(7!KJE!k5iQ@O3K$ z@0NQZ)>b7&TaFd~Ciolk*Q(7cL+9cB`Y;G@rr`tk5Hdjv+))zSdlF#gI!>6`zB<@i zaKYP!9!Pl&5VMjydlq1x&}37{RQY+SSBXX-w?kCLKK%bXFYU6{?d+nH00000NkvXX Hu0mjfTSP*+ literal 0 HcmV?d00001 diff --git a/Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerMemviewPlugin/images/zoom_out.png b/Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerMemviewPlugin/images/zoom_out.png new file mode 100644 index 0000000000000000000000000000000000000000..07bf98a79cfea526e250703356dbefdb6b80d166 GIT binary patch literal 708 zcmV;#0z3VQP)TNkCP1&*^7LC~A?iZQEu_hKZoQoXI zA7tfTv}|~Fb8b^XuP>qvDk=)P)vYKtT12;}bKn-mwHWl`1Bb)&{XXC4IY$Nnvj5@N zfekg1Y}gcI!)Cq|u?lR+A{2&=d~S$}&0ei1|7pO6jkZ$6%&{R8TNpk>=dV#j&aWqO zgE~4pNU_-giktFkY-J5_XDlv`7+j?n3mXtxgadILp+c<9cr~t!x1LM6m69Z~V#pLL z22Cs~BoIdtZHTjo7Q|_U0a2OmSF=gCGFB$RVZIP(pixmBqE!^15yd!#9Z{Wh)zB%o zikBFa!WJPvMB(noe(U;k1e~Y|r$}@wh*Ymykd6>E3t69z5DT&Jq-fSG-dPdU{SG;i zbSb3<`RfKgJD|lQC`6(Cdut1PbDV&$M=Y?U)x)A(0iQN+gAeOBg2Z6fr$_Is!%M70 z=n*z7{*s%3rO7yazIO)}qa&~o@WZ=R>!b#mOSR zlCR8M*iRy2j7!PmWiiegA>Og~W1?FLk0*NI^}`$RW boxList) { + provider.setBoxes(boxList); + } + + @Override + public void initViews() { + provider.initViews(); + } + + @Override + public void setProgram(Program program) { + provider.setProgram(program); + } +} diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/DebuggerMemviewTraceListener.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/DebuggerMemviewTraceListener.java new file mode 100644 index 0000000000..cfd3132ffd --- /dev/null +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/DebuggerMemviewTraceListener.java @@ -0,0 +1,251 @@ +/* ### + * IP: GHIDRA + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package ghidra.app.plugin.core.debug.gui.memview; + +import java.util.Collection; +import java.util.Objects; + +import com.google.common.collect.Range; + +import ghidra.app.plugin.core.debug.DebuggerCoordinates; +import ghidra.app.services.TraceRecorder; +import ghidra.async.AsyncDebouncer; +import ghidra.async.AsyncTimer; +import ghidra.program.model.address.*; +import ghidra.trace.model.*; +import ghidra.trace.model.Trace.*; +import ghidra.trace.model.breakpoint.TraceBreakpoint; +import ghidra.trace.model.breakpoint.TraceBreakpointManager; +import ghidra.trace.model.memory.TraceMemoryManager; +import ghidra.trace.model.memory.TraceMemoryRegion; +import ghidra.trace.model.modules.*; +import ghidra.trace.model.thread.TraceThread; +import ghidra.trace.model.thread.TraceThreadManager; +import ghidra.util.Swing; + +public class DebuggerMemviewTraceListener extends TraceDomainObjectListener { + + protected MemviewProvider provider; + DebuggerCoordinates current = DebuggerCoordinates.NOWHERE; + Trace currentTrace; + TraceRecorder currentRecorder; + + private boolean trackTrace = true; + private boolean trackThreads = true; + private boolean trackRegions = true; + private boolean trackModules = true; + private boolean trackSections = true; + private boolean trackBreakpoints = true; + private boolean trackBytes = true; + + private final AsyncDebouncer updateLabelDebouncer = + new AsyncDebouncer<>(AsyncTimer.DEFAULT_TIMER, 100); + + public DebuggerMemviewTraceListener(MemviewProvider provider) { + this.provider = provider; + + updateLabelDebouncer.addListener(__ -> Swing.runIfSwingOrRunLater(() -> doUpdateLabel())); + + listenFor(TraceThreadChangeType.ADDED, this::threadChanged); + listenFor(TraceThreadChangeType.CHANGED, this::threadChanged); + listenFor(TraceThreadChangeType.LIFESPAN_CHANGED, this::threadChanged); + listenFor(TraceThreadChangeType.DELETED, this::threadChanged); + + listenFor(TraceMemoryRegionChangeType.ADDED, this::regionChanged); + listenFor(TraceMemoryRegionChangeType.CHANGED, this::regionChanged); + listenFor(TraceMemoryRegionChangeType.LIFESPAN_CHANGED, this::regionChanged); + listenFor(TraceMemoryRegionChangeType.DELETED, this::regionChanged); + + listenFor(TraceModuleChangeType.ADDED, this::moduleChanged); + listenFor(TraceModuleChangeType.CHANGED, this::moduleChanged); + listenFor(TraceModuleChangeType.LIFESPAN_CHANGED, this::moduleChanged); + listenFor(TraceModuleChangeType.DELETED, this::moduleChanged); + + listenFor(TraceSectionChangeType.ADDED, this::sectionChanged); + listenFor(TraceSectionChangeType.CHANGED, this::sectionChanged); + listenFor(TraceSectionChangeType.DELETED, this::sectionChanged); + + listenFor(TraceBreakpointChangeType.ADDED, this::breakpointChanged); + listenFor(TraceBreakpointChangeType.CHANGED, this::breakpointChanged); + listenFor(TraceBreakpointChangeType.LIFESPAN_CHANGED, this::breakpointChanged); + listenFor(TraceBreakpointChangeType.DELETED, this::breakpointChanged); + + listenFor(TraceMemoryBytesChangeType.CHANGED, this::bytesChanged); + } + + public MemviewProvider getProvider() { + return provider; + } + + protected AddressRange rng(AddressSpace space, long min, long max) { + return new AddressRangeImpl(space.getAddress(min), space.getAddress(max)); + } + + private void threadChanged(TraceThread thread) { + if (!trackThreads || !trackTrace) { + return; + } + AddressFactory factory = thread.getTrace().getBaseAddressFactory(); + AddressSpace defaultSpace = factory.getDefaultAddressSpace(); + Long threadId = thread.getKey(); + AddressRange rng = rng(defaultSpace, threadId, threadId); + MemoryBox box = new MemoryBox("Thread " + thread.getName(), MemviewBoxType.THREAD, rng, + thread.getLifespan()); + provider.addBox(box); + } + + private void regionChanged(TraceMemoryRegion region) { + if (!trackRegions || !trackTrace) { + return; + } + MemoryBox box = new MemoryBox("Region " + region.getName(), MemviewBoxType.VIRTUAL_ALLOC, + region.getRange(), region.getLifespan()); + provider.addBox(box); + updateLabelDebouncer.contact(null); + } + + private void moduleChanged(TraceModule module) { + if (!trackModules || !trackTrace) { + return; + } + AddressRange range = module.getRange(); + AddressRange xrange = new AddressRangeImpl(range.getMinAddress(), range.getMaxAddress()); + MemoryBox box = new MemoryBox("Module " + module.getName(), MemviewBoxType.MODULE, xrange, + module.getLifespan()); + provider.addBox(box); + updateLabelDebouncer.contact(null); + } + + private void sectionChanged(TraceSection section) { + if (!trackSections || !trackTrace) { + return; + } + MemoryBox box = new MemoryBox("Section " + section.getName(), MemviewBoxType.IMAGE, + section.getRange(), section.getModule().getLifespan()); + provider.addBox(box); + updateLabelDebouncer.contact(null); + } + + private void breakpointChanged(TraceBreakpoint bpt) { + if (!trackBreakpoints || !trackTrace) { + return; + } + MemoryBox box = new MemoryBox("Breakpoint " + bpt.getName(), MemviewBoxType.BREAKPOINT, + bpt.getRange(), bpt.getLifespan()); + provider.addBox(box); + updateLabelDebouncer.contact(null); + } + + private void bytesChanged(TraceAddressSnapRange range) { + if (!trackBytes || !trackTrace) { + return; + } + Range lifespan = range.getLifespan(); + Range newspan = Range.closedOpen(lifespan.lowerEndpoint(), lifespan.lowerEndpoint()); + MemoryBox box = new MemoryBox("BytesChanged " + range.description(), + MemviewBoxType.WRITE_MEMORY, range.getRange(), newspan); + provider.addBox(box); + updateLabelDebouncer.contact(null); + } + + private void doUpdateLabel() { + //updateLocationLabel(); + } + + protected void addListener() { + Trace trace = current.getTrace(); + if (trace != null) { + trace.addListener(this); + } + } + + protected void removeListener() { + Trace trace = current.getTrace(); + if (trace != null) { + trace.removeListener(this); + } + } + + public void setCoordinates(DebuggerCoordinates coordinates) { + if (current.equals(coordinates)) { + current = coordinates; + return; + } + boolean doListeners = !Objects.equals(current.getTrace(), coordinates.getTrace()); + if (doListeners) { + removeListener(); + } + current = coordinates; + if (doListeners) { + addListener(); + } + } + + protected DebuggerCoordinates adjustCoordinates(DebuggerCoordinates coordinates) { + // Because the view's snap is changing with or without us.... So go with. + return current.withSnap(coordinates.getSnap()); + } + + public void coordinatesActivated(DebuggerCoordinates coordinates) { + //DebuggerCoordinates adjusted = adjustCoordinates(coordinates); + setCoordinates(coordinates); + Trace trace = coordinates.getTrace(); + if (trace != null) { + Swing.runLater(new Runnable() { + @Override + public void run() { + processTrace(trace); + } + }); + } + } + + public void traceClosed(Trace trace) { + if (current.getTrace() == trace) { + setCoordinates(DebuggerCoordinates.NOWHERE); + } + } + + public void toggleTrackTrace() { + trackTrace = !trackTrace; + } + + private void processTrace(Trace trace) { + provider.reset(); + TraceThreadManager threadManager = trace.getThreadManager(); + for (TraceThread thread : threadManager.getAllThreads()) { + threadChanged(thread); + } + TraceModuleManager moduleManager = trace.getModuleManager(); + for (TraceModule module : moduleManager.getAllModules()) { + moduleChanged(module); + Collection sections = module.getSections(); + for (TraceSection section : sections) { + sectionChanged(section); + } + } + TraceMemoryManager memoryManager = trace.getMemoryManager(); + for (TraceMemoryRegion region : memoryManager.getAllRegions()) { + regionChanged(region); + } + TraceBreakpointManager breakpointManager = trace.getBreakpointManager(); + for (TraceBreakpoint bpt : breakpointManager.getAllBreakpoints()) { + breakpointChanged(bpt); + } + updateLabelDebouncer.contact(null); + } + +} diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/MemoryBox.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/MemoryBox.java new file mode 100644 index 0000000000..0195d0c588 --- /dev/null +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/MemoryBox.java @@ -0,0 +1,249 @@ +/* ### + * IP: GHIDRA + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package ghidra.app.plugin.core.debug.gui.memview; + +import java.awt.Color; +import java.awt.Graphics; +import java.util.HashMap; +import java.util.Map; + +import com.google.common.collect.Range; + +import ghidra.program.model.address.AddressRange; + +public class MemoryBox { + + protected String id; + protected MemviewBoxType type; + protected AddressRange range; + protected long start; + protected long stop = Long.MAX_VALUE; + protected long startAddr; + protected long stopAddr = -1; + protected long startTime; + protected long stopTime = -1; + protected Color color = Color.BLUE; + + protected int pixAstart; + protected int pixAend; + protected int boundA; + protected int pixTstart; + protected int pixTend; + protected int boundT; + + protected boolean current; + + public MemoryBox(String id, MemviewBoxType type, AddressRange range, long tick) { + this.id = id; + this.type = type; + this.range = range; + this.start = tick; + this.color = type.getColor(); + } + + public MemoryBox(String id, MemviewBoxType type, AddressRange range, Range trange) { + this(id, type, range, trange.lowerEndpoint()); + if (trange.hasUpperBound()) { + setEnd(trange.upperEndpoint()); + } + } + + public String getId() { + return id; + } + + public MemviewBoxType getType() { + return type; + } + + public AddressRange getRange() { + return range; + } + + public Range getSpan() { + return Range.openClosed(start, stop); + } + + public long getStart() { + return start; + } + + public long getEnd() { + return stop; + } + + public void setEnd(long tick) { + this.stop = stop < tick ? stop : tick; + } + + public Color getColor() { + return color; + } + + public void setColor(Color color) { + this.color = color; + } + + public void setColor(Color base, int type) { + setColor(new Color(base.getRed(), (base.getGreen() + type) % 255, base.getBlue())); + } + + public void setColor(Color base, int type, int src) { + setColor(new Color(base.getRed(), (base.getGreen() + type * 8) % 255, + (base.getBlue() + src * 16) % 255)); + } + + public int getAddressPixelStart() { + return pixAstart; + } + + public int getAddressPixelWidth() { + if (pixAend - pixAstart <= 0) + return 1; + return pixAend - pixAstart; + } + + public int getTimePixelStart() { + return pixTstart; + } + + public int getTimePixelWidth() { + if (pixTend < pixTstart) { + pixTend = boundT; + } + if (pixTend - pixTstart == 0) + return 1; + return pixTend - pixTstart; + } + + public int getX(boolean vertical) { + return vertical ? pixTstart : pixAstart; + } + + public int getY(boolean vertical) { + return vertical ? pixAstart : pixTstart; + } + + public void setCurrent(boolean current) { + this.current = current; + } + + public boolean isCurrent() { + return current; + } + + public void render(Graphics g, boolean vertical) { + int x = vertical ? getTimePixelStart() : getAddressPixelStart(); + int w = vertical ? getTimePixelWidth() : getAddressPixelWidth(); + int y = vertical ? getAddressPixelStart() : getTimePixelStart(); + int h = vertical ? getAddressPixelWidth() : getTimePixelWidth(); + g.setColor(Color.BLACK); + g.fillRect(x - 1, y - 1, w + 2, h + 2); + g.setColor(color); + g.fillRect(x, y, w, h); + } + + public void renderBA(Graphics g, boolean vertical, int sz) { + int x = vertical ? 0 : getAddressPixelStart(); + int w = vertical ? sz : getAddressPixelWidth(); + int y = vertical ? getAddressPixelStart() : 0; + int h = vertical ? getAddressPixelWidth() : sz; + g.setColor(Color.BLACK); + g.fillRect(x - 1, y - 1, w + 2, h + 2); + g.setColor(color); + g.fillRect(x, y, w, h); + } + + public void renderBT(Graphics g, boolean vertical, int sz, int bound) { + int x = vertical ? getTimePixelStart() : 0; + int w = vertical ? 1 : sz; + int y = vertical ? 0 : getTimePixelStart(); + int h = vertical ? sz : 1; + g.setColor(Color.BLACK); + g.fillRect(x - 1, y - 1, w + 2, h + 2); + g.setColor(color); + g.fillRect(x, y, w, h); + } + + public void setAddressBounds(MemviewMap map, int bound) { + if (stopAddr < 0) { + stopAddr = startAddr; + } + pixAstart = getPixel(map, startAddr, bound); + pixAend = getPixel(map, stopAddr, bound); + boundA = bound; + } + + public void setTimeBounds(MemviewMap map, int bound) { + pixTstart = getPixel(map, startTime, bound); + pixTend = getPixel(map, stopTime, bound); + boundT = bound; + } + + protected int getPixel(MemviewMap map, long offset, int bound) { + return map.getPixel(offset); + } + + public long getStartAddress() { + return startAddr; + } + + public void setStartAddress(long val) { + startAddr = val; + } + + public long getStopAddress() { + return stopAddr; + } + + public void setStopAddress(long val) { + stopAddr = val; + } + + public long getStartTime() { + return startTime; + } + + public void setStartTime(long val) { + startTime = val; + } + + public long getStopTime() { + return stopTime; + } + + public void setStopTime(long val) { + stopTime = val; + } + + public boolean inPixelRange(long pos) { + if (pos < pixTstart) + return false; + if (pixTend <= 0) + return true; + return pos <= pixTend; + } + + public Map getAttributeMap() { + Map map = new HashMap<>(); + map.put("Id", getId()); + map.put("StartAddr", getStartAddress()); + map.put("StopAddr", getStopAddress()); + map.put("StartTime", getStartTime()); + map.put("StopTIme", getStopTime()); + return map; + } +} diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/MemviewBoxType.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/MemviewBoxType.java new file mode 100644 index 0000000000..ff6408e8e0 --- /dev/null +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/MemviewBoxType.java @@ -0,0 +1,62 @@ +/* ### + * IP: GHIDRA + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package ghidra.app.plugin.core.debug.gui.memview; + +import java.awt.Color; + +public enum MemviewBoxType { + INSTRUCTIONS, + PROCESS, + THREAD, + MODULE, + REGION, + IMAGE, + VIRTUAL_ALLOC, + HEAP_CREATE, + HEAP_ALLOC, + POOL, + STACK, + PERFINFO, + READ_MEMORY, + WRITE_MEMORY, + BREAKPOINT; + + Color[] colors = { // + new Color(128, 000, 000), // INSTRUCTIONS + new Color(200, 200, 255), // PROCESS + new Color(200, 255, 255), // THREAD + Color.GREEN, //new Color(000, 150, 200), // MODULE + Color.YELLOW, //new Color(000, 150, 200), // REGION + Color.MAGENTA, //new Color(050, 100, 255), // IMAGE + Color.LIGHT_GRAY, // VIRTUAL_ALLOC + Color.BLUE, // HEAP_CREATE + new Color(000, 100, 050), // HEAP_ALLOC + new Color(100, 000, 150), // POOL + Color.CYAN, // STACK + Color.LIGHT_GRAY, // PERFINFO + Color.DARK_GRAY, // READ_MEMORY + Color.BLUE, // WRITE_MEMORY + Color.RED, // WRITE_MEMORY + }; + + public Color getColor() { + return colors[this.ordinal()]; + } + + public void setColor(Color color) { + colors[this.ordinal()] = color; + } +} diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/MemviewMap.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/MemviewMap.java new file mode 100644 index 0000000000..df02e5bdc7 --- /dev/null +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/MemviewMap.java @@ -0,0 +1,58 @@ +/* ### + * IP: GHIDRA + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package ghidra.app.plugin.core.debug.gui.memview; + +public class MemviewMap { + + private long max; + private long sz; + private double elementsPerPixel; + private double multiplier; + + public MemviewMap(long elems, long pixels) { + max = sz = elems; + elementsPerPixel = pixels == 0 ? 0 : elems / pixels; + multiplier = 1.0; + } + + public void createMapping(double mult) { + this.multiplier = mult; + } + + public long getOffset(int pixel) { + return Math.round(pixel * elementsPerPixel / multiplier); + } + + public int getPixel(long offset) { + if (offset < 0) { + offset = max; + } + double doffset = offset * multiplier / elementsPerPixel; + return (int) Math.round(doffset); + } + + public long getSize() { + return getPixel(max); + } + + public double getMultiplier() { + return multiplier; + } + + public double getOriginalElemPerPixel() { + return elementsPerPixel; + } +} diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/MemviewMapModel.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/MemviewMapModel.java new file mode 100644 index 0000000000..d150793213 --- /dev/null +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/MemviewMapModel.java @@ -0,0 +1,245 @@ +/* ### + * IP: GHIDRA + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package ghidra.app.plugin.core.debug.gui.memview; + +import java.util.*; + +import docking.widgets.table.AbstractSortedTableModel; +import ghidra.program.model.address.Address; + +class MemviewMapModel extends AbstractSortedTableModel { + + final static byte NAME = 0; + final static byte ASTART = 1; + final static byte ASTOP = 2; + final static byte TSTART = 3; + final static byte TSTOP = 4; + + final static String NAME_COL = "Name"; + final static String ASTART_COL = "Start Address"; + final static String ASTOP_COL = "End Address"; + final static String TSTART_COL = "Start Time"; + final static String TSTOP_COL = "End Time"; + + private List memList = new ArrayList<>(); + private Map memMap = new HashMap<>(); + private MemviewProvider provider; + + private final static String COLUMN_NAMES[] = + { NAME_COL, ASTART_COL, ASTOP_COL, TSTART_COL, TSTOP_COL }; + + public MemviewMapModel(MemviewProvider provider) { + super(ASTART); + this.provider = provider; + } + + public List getBoxes() { + return memList; + } + + public void addBoxes(Collection boxes) { + if (memList == null) { + memList = new ArrayList<>(); + } + for (MemoryBox b : boxes) { + if (memMap.containsKey(b.getId())) { + MemoryBox mb = memMap.get(b.getId()); + memList.remove(mb); + } + memList.add(b); + memMap.put(b.getId(), b); + } + fireTableDataChanged(); + } + + public void setBoxes(Collection boxes) { + memList = new ArrayList<>(); + for (MemoryBox b : boxes) { + memList.add(b); + memMap.put(b.getId(), b); + } + fireTableDataChanged(); + } + + public void reset() { + memList = new ArrayList<>(); + memMap.clear(); + fireTableDataChanged(); + } + + void update() { + } + + @Override + public boolean isSortable(int columnIndex) { + return true; + } + + @Override + public String getName() { + return "Memory vs Time Map"; + } + + @Override + public int getColumnCount() { + return COLUMN_NAMES.length; + } + + @Override + public String getColumnName(int column) { + + if (column < 0 || column >= COLUMN_NAMES.length) { + return "UNKNOWN"; + } + + return COLUMN_NAMES[column]; + } + + /** + * Convenience method for locating columns by name. + * Implementation is naive so this should be overridden if + * this method is to be called often. This method is not + * in the TableModel interface and is not used by the JTable. + */ + @Override + public int findColumn(String columnName) { + for (int i = 0; i < COLUMN_NAMES.length; i++) { + if (COLUMN_NAMES[i].equals(columnName)) { + return i; + } + } + return 0; + } + + /** + * Returns Object.class by default + */ + @Override + public Class getColumnClass(int columnIndex) { + if (columnIndex == ASTART || columnIndex == ASTOP) { + return Address.class; + } + return String.class; + } + + /** + * Return whether this column is editable. + */ + @Override + public boolean isCellEditable(int rowIndex, int columnIndex) { + return false; + } + + /** + * Returns the number of records managed by the data source object. A + * JTable uses this method to determine how many rows it + * should create and display. This method should be quick, as it + * is call by JTable quite frequently. + * + * @return the number or rows in the model + * @see #getColumnCount + */ + @Override + public int getRowCount() { + return memList.size(); + } + + public MemoryBox getBoxAt(int rowIndex) { + if (memList == null) { + return null; + } + if (rowIndex < 0 || rowIndex >= memList.size()) { + return null; + } + MemoryBox box = memList.get(rowIndex); + try { + box.getStart(); + } + catch (ConcurrentModificationException e) { + update(); + } + return memList.get(rowIndex); + } + + public int getIndexForBox(MemoryBox box) { + return memList.indexOf(box); + } + + @Override + public Object getColumnValueForRow(MemoryBox box, int columnIndex) { + try { + switch (columnIndex) { + case NAME: + return box.getId(); + case ASTART: + return box.getRange().getMinAddress(); + case ASTOP: + return box.getRange().getMaxAddress(); + case TSTART: + return Long.toString(box.getStart()); + case TSTOP: + long end = box.getEnd(); + if (end == Long.MAX_VALUE) { + return "+" + '\u221e' + '\u2025'; + } + return Long.toString(end); + default: + return "UNKNOWN"; + } + } + catch (ConcurrentModificationException e) { + update(); + } + return null; + } + + @Override + public List getModelData() { + return memList; + } + + @Override + protected Comparator createSortComparator(int columnIndex) { + return new MemoryMapComparator(columnIndex); + } + + private class MemoryMapComparator implements Comparator { + private final int sortColumn; + + public MemoryMapComparator(int sortColumn) { + this.sortColumn = sortColumn; + } + + @Override + public int compare(MemoryBox b1, MemoryBox b2) { + + switch (sortColumn) { + case NAME: + return b1.getId().compareToIgnoreCase(b2.getId()); + case ASTART: + return (int) (b1.getStartAddress() - b2.getStartAddress()); + case ASTOP: + return (int) (b1.getStopAddress() - b2.getStopAddress()); + case TSTART: + return (int) (b1.getStartTime() - b2.getStartTime()); + case TSTOP: + return (int) (b1.getStopTime() - b2.getStopTime()); + default: + return 0; + } + } + } +} diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/MemviewPanel.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/MemviewPanel.java new file mode 100644 index 0000000000..5f20740de9 --- /dev/null +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/MemviewPanel.java @@ -0,0 +1,489 @@ +/* ### + * IP: GHIDRA + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package ghidra.app.plugin.core.debug.gui.memview; + +import java.awt.*; +import java.awt.event.*; +import java.util.*; +import java.util.List; + +import javax.swing.*; + +import ghidra.program.model.address.Address; +import ghidra.program.model.address.AddressRange; + +public class MemviewPanel extends JPanel implements MouseListener, MouseMotionListener { + private static final long serialVersionUID = 1L; + + private MemviewProvider provider; + private MemviewMap amap; + private MemviewMap tmap; + private List boxList = new ArrayList(); + + private int pressedX; + private int pressedY; + private boolean enableDrag = false; + private boolean ctrlPressed = false; + private int barWidth = 1000; + private int barHeight = 500; + private boolean vertical = false; + + private int currentPixelAddr = -1; + private int currentPixelTime = -1; + private Rectangle currentRectangle = null; + + private List blist = null; + private Map bmap = new HashMap<>(); + + private TreeSet

addresses = new TreeSet<>(); + private TreeSet times = new TreeSet<>(); + private Address[] addressArray; + private Long[] timesArray; + private Map> addr2box = new HashMap<>(); + private Map> time2box = new HashMap<>(); + + public MemviewPanel(MemviewProvider provider) { + super(); + this.provider = provider; + setPreferredSize(new Dimension(barWidth, barHeight)); + setSize(getPreferredSize()); + setBorder(BorderFactory.createLineBorder(Color.BLACK, 1)); + setFocusable(true); + + addMouseListener(this); + addMouseMotionListener(this); + ToolTipManager.sharedInstance().registerComponent(this); + } + + @Override + public Dimension getPreferredSize() { + int asz = amap != null ? (int) (amap.getSize()) : 500; + int tsz = tmap != null ? (int) (tmap.getSize()) : 500; + int w = vertical ? tsz : asz; + int h = vertical ? asz : tsz; + return new Dimension(w, h); + } + + @Override + public void paintComponent(Graphics g) { + super.paintComponent(g); + g.setColor(getBackground()); + Rectangle clip = g.getClipBounds(); + g.fillRect(clip.x, clip.y, clip.width, clip.height); + + //If the width has changed, force a refresh + int height = getHeight(); + int width = getWidth(); + if (vertical && clip.height > height || !vertical && clip.width > width) { + refresh(); + return; + } + + g.fillRect(0, 0, width, height); + + for (MemoryBox box : boxList) { + box.render(g, vertical); + } + + //Draw the current location arrow + if (currentPixelAddr >= 0) { + drawArrow(g); + } + if (currentRectangle != null) { + drawFrame(g); + } + } + + private static final int LOCATION_BASE_WIDTH = 1; + private static final int LOCATION_BASE_HEIGHT = 6; + private static final int LOCATION_ARROW_WIDTH = 3; + private static final int LOCATION_ARROW_HEIGHT = 9; + private static final int[] locXs = { 0, -LOCATION_BASE_WIDTH, -LOCATION_BASE_WIDTH, + -LOCATION_ARROW_WIDTH, 0, LOCATION_ARROW_WIDTH, LOCATION_BASE_WIDTH, LOCATION_BASE_WIDTH }; + private static final int[] locYs = { 0, 0, LOCATION_BASE_HEIGHT, LOCATION_BASE_HEIGHT, + LOCATION_ARROW_HEIGHT, LOCATION_BASE_HEIGHT, LOCATION_BASE_HEIGHT, 0 }; + + private void drawArrow(Graphics g) { + Graphics2D g2 = (Graphics2D) g; + if (vertical) { + g2.rotate(90.0f / 180.0f * Math.PI); + g2.translate(0, LOCATION_ARROW_HEIGHT); + g.translate(currentPixelAddr, -currentPixelTime); + g2.rotate(Math.PI); + } + else { + g2.translate(0, -LOCATION_ARROW_HEIGHT); + g.translate(currentPixelAddr, currentPixelTime); + } + + g.setColor(Color.RED); + g.fillPolygon(locXs, locYs, locXs.length); + + if (vertical) { + g2.rotate(Math.PI); + g.translate(-currentPixelAddr, currentPixelTime); + g2.translate(0, -LOCATION_ARROW_HEIGHT); + g2.rotate(-90.0f / 180.0f * Math.PI); + } + else { + g.translate(-currentPixelAddr, -currentPixelTime); + g2.translate(0, LOCATION_ARROW_HEIGHT); + } + } + + private void drawFrame(Graphics g) { + int x = currentRectangle.x; + int y = currentRectangle.y; + int w = currentRectangle.width; + int h = currentRectangle.height; + g.setColor(Color.RED); + g.fillRect(x - 1, y - 1, 1, h + 2); + g.fillRect(x - 1, y - 1, w + 2, 1); + g.fillRect(x + w + 1, y - 1, 1, h + 2); + g.fillRect(x - 1, y + h + 1, w + 2, 1); + } + + void initViews() { + setSize(new Dimension(vertical ? times.size() : addresses.size(), + vertical ? addresses.size() : times.size())); + this.amap = new MemviewMap(addresses.size(), addresses.size()); + this.tmap = new MemviewMap(times.size(), times.size()); + } + + public void refresh() { + if (amap == null || tmap == null) { + return; + } + if (vertical) { + amap.createMapping(provider.getZoomAmountA()); + tmap.createMapping(provider.getZoomAmountT()); + } + else { + amap.createMapping(provider.getZoomAmountA()); + tmap.createMapping(provider.getZoomAmountT()); + } + + updateBoxes(); + } + + void updateBoxes() { + if (!this.isShowing()) + return; + + boxList = new ArrayList(); + Collection boxes = getBoxes(); + if (boxes == null) { + return; + } + for (MemoryBox box : boxes) { + if (box == null) + continue; + + int bound = vertical ? getHeight() - 1 : getWidth() - 1; + box.setAddressBounds(amap, bound); + bound = vertical ? getWidth() - 1 : getHeight() - 1; + box.setTimeBounds(tmap, bound); + + boxList.add(box); + } + + repaint(0, 0, getWidth(), getHeight()); + } + + @Override + public void mousePressed(MouseEvent e) { + requestFocus(); + + ctrlPressed = false; + currentRectangle = null; + + if (e.getButton() == MouseEvent.BUTTON1) { + enableDrag = true; + pressedX = e.getX(); + pressedY = e.getY(); + currentPixelAddr = vertical ? pressedY : pressedX; + currentPixelTime = vertical ? pressedX : pressedY; + provider.selectTableEntry(getBoxesAt(pressedX, pressedY)); + provider.refresh(); + } + + if (e.getButton() == MouseEvent.BUTTON2) { + System.err.println("BUTTON2"); + } + + if (e.getButton() == MouseEvent.BUTTON3) { + ctrlPressed = true; + enableDrag = true; + pressedX = e.getX(); + pressedY = e.getY(); + } + } + + @Override + public void mouseReleased(MouseEvent e) { + enableDrag = false; + } + + @Override + public void mouseClicked(MouseEvent e) { + enableDrag = false; + } + + @Override + public void mouseEntered(MouseEvent e) { + // Nothing to do + } + + @Override + public void mouseExited(MouseEvent e) { + // Nothing to do + } + + @Override + public void mouseDragged(MouseEvent e) { + if (enableDrag) { + if (!ctrlPressed) { + provider.goTo(pressedX - e.getX(), pressedY - e.getY()); + } + else { + currentRectangle = + new Rectangle(pressedX, pressedY, e.getX() - pressedX, e.getY() - pressedY); + provider.selectTableEntry(getBoxesIn(currentRectangle)); + provider.refresh(); + } + } + } + + @Override + public void mouseMoved(MouseEvent e) { + // Nothing to do + } + + public void setSelection(Set boxes) { + for (MemoryBox memoryBox : boxes) { + currentPixelAddr = memoryBox.pixAstart; + currentPixelTime = memoryBox.pixTstart; + refresh(); + } + } + + public String getTitleAnnotation() { + if (currentPixelAddr < 0 || addressArray == null) { + return ""; + } + String aval = getTagForAddr(currentPixelAddr); + String tval = getTagForTick(currentPixelTime); + String vals = vertical ? tval + ":" + aval : aval + ":" + tval; + return "curpos=[" + vals + "]"; + } + + public Set getBoxesAt(int x, int y) { + long addr = getAddr(x, y); + long tick = getTick(x, y); + long pos = vertical ? x : y; + Set matches = new HashSet<>(); + Set mboxes = addr2box.get(addr); + if (mboxes != null && tick < timesArray.length) { + for (MemoryBox memoryBox : mboxes) { + if (memoryBox.inPixelRange(pos)) { + matches.add(memoryBox); + } + } + } + return matches; + } + + public Set getBoxesIn(Rectangle r) { + long startAddr = getAddr(r.x, r.y); + long startTick = getTick(r.x, r.y); + long stopAddr = getAddr(r.x + r.width, r.y + r.height); + long stopTick = getTick(r.x + r.width, r.y + r.height); + Set matches = new HashSet<>(); + for (long addr = startAddr; addr < stopAddr; addr++) { + Set mboxes = addr2box.get(addr); + for (MemoryBox memoryBox : mboxes) { + if (memoryBox.getStartTime() >= startTick || memoryBox.getStopTime() <= stopTick) { + matches.add(memoryBox); + } + } + } + return matches; + } + + @Override + public String getToolTipText(MouseEvent e) { + if (amap == null || tmap == null) { + return e.getX() + ":" + e.getY(); + } + long addr = getAddr(e.getX(), e.getY()); + long tick = getTick(e.getX(), e.getY()); + String aval = getTagForAddr(addr); + String tval = getTagForTick(tick); + Set boxes = getBoxesAt(e.getX(), e.getY()); + for (MemoryBox memoryBox : boxes) { + aval = memoryBox.getId(); + } + return vertical ? tval + ":" + aval : aval + ":" + tval; + } + + private void parseBoxes(Collection boxes) { + addresses.clear(); + times.clear(); + addr2box.clear(); + time2box.clear(); + + for (MemoryBox box : boxes) { + AddressRange range = box.getRange(); + if (range != null) { + addresses.add(range.getMinAddress()); + addresses.add(range.getMaxAddress()); + } + long start = box.getStart(); + long end = box.getEnd(); + times.add(start); + times.add(end); + } + + initViews(); + addressArray = new Address[addresses.size()]; + timesArray = new Long[times.size()]; + addresses.toArray(addressArray); + times.toArray(timesArray); + + for (MemoryBox box : boxes) { + AddressRange range = box.getRange(); + if (range != null) { + box.setStartAddress(addresses.headSet(range.getMinAddress()).size()); + box.setStopAddress(addresses.headSet(range.getMaxAddress()).size()); + } + box.setStartTime(times.headSet(box.getStart()).size()); + box.setStopTime(times.headSet(box.getEnd()).size()); + + Set mboxes = addr2box.get(box.getStartAddress()); + if (mboxes == null) { + mboxes = new HashSet(); + } + mboxes.add(box); + addr2box.put(box.getStartAddress(), mboxes); + mboxes = addr2box.get(box.getStopAddress()); + if (mboxes == null) { + mboxes = new HashSet(); + } + mboxes.add(box); + addr2box.put(box.getStopAddress(), mboxes); + + mboxes = time2box.get(box.getStartTime()); + if (mboxes == null) { + mboxes = new HashSet(); + } + mboxes.add(box); + time2box.put(box.getStartTime(), mboxes); + mboxes = time2box.get(box.getStopTime()); + if (mboxes == null) { + mboxes = new HashSet(); + } + mboxes.add(box); + time2box.put(box.getStopTime(), mboxes); + } + refresh(); + } + + public List getBoxes() { + return blist; + } + + public void setBoxes(List boxes) { + this.blist = boxes; + for (MemoryBox b : boxes) { + bmap.put(b.getId(), b); + } + parseBoxes(blist); + } + + public void addBoxes(List boxes) { + if (blist == null) { + blist = new ArrayList(); + } + for (MemoryBox b : boxes) { + if (bmap.containsKey(b.getId())) { + MemoryBox box = bmap.get(b.getId()); + blist.remove(box); + } + blist.add(b); + bmap.put(b.getId(), b); + } + parseBoxes(blist); + } + + public void reset() { + blist = new ArrayList(); + bmap.clear(); + parseBoxes(blist); + } + + void setAddressPixelMap(MemviewMap map) { + this.amap = map; + } + + void setTimePixelMap(MemviewMap tmap) { + this.tmap = tmap; + } + + public boolean getVerticalMode() { + return vertical; + } + + public void setVerticalMode(boolean vertical) { + this.vertical = vertical; + } + + public long getAddr(int x, int y) { + if (amap == null) + return 0; + return vertical ? amap.getOffset(y) : amap.getOffset(x); + } + + public long getTick(int x, int y) { + if (tmap == null) + return 0; + return vertical ? tmap.getOffset(x) : tmap.getOffset(y); + } + + public String getTagForAddr(long addr) { + String aval = ""; + if (0 <= addr && addr < addressArray.length) { + aval = addressArray[(int) addr].toString(); + } + return aval; + } + + public String getTagForTick(long tick) { + String tval = ""; + if (0 <= tick && tick < timesArray.length) { + tval = Long.toString(timesArray[(int) tick]); + } + return tval; + } + + public void scaleCurrentPixelAddr(double changeAmount) { + this.currentPixelAddr = (int) (currentPixelAddr * Math.pow(2.0, changeAmount)); + } + + public void scaleCurrentPixelTime(double changeAmount) { + this.currentPixelTime = (int) (currentPixelTime * Math.pow(2.0, changeAmount)); + } + +} diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/MemviewProvider.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/MemviewProvider.java new file mode 100644 index 0000000000..e8d09bcfcf --- /dev/null +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/MemviewProvider.java @@ -0,0 +1,302 @@ +/* ### + * IP: GHIDRA + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package ghidra.app.plugin.core.debug.gui.memview; + +import java.awt.*; +import java.awt.event.*; +import java.util.*; +import java.util.List; + +import javax.swing.*; + +import docking.ActionContext; +import docking.action.DockingAction; +import docking.action.builder.ToggleActionBuilder; +import ghidra.app.plugin.core.debug.DebuggerPluginPackage; +import ghidra.app.plugin.core.debug.gui.DebuggerResources; +import ghidra.app.plugin.core.debug.gui.DebuggerResources.AbstractRefreshAction; +import ghidra.app.plugin.core.debug.gui.memview.actions.*; +import ghidra.app.services.DebuggerListingService; +import ghidra.framework.plugintool.*; +import ghidra.framework.plugintool.AutoService.Wiring; +import ghidra.framework.plugintool.annotation.AutoServiceConsumed; +import ghidra.program.model.listing.Program; +import ghidra.util.HelpLocation; +import ghidra.util.Swing; + +public class MemviewProvider extends ComponentProviderAdapter { + + private static final String TITLE = "Memview"; + + private Wiring autoServiceWiring; + @AutoServiceConsumed + private DebuggerListingService listingService; + + private DebuggerMemviewPlugin plugin; + private JComponent mainPanel; + private MemviewPanel memviewPanel; + private MemviewTable memviewTable; + private JScrollPane scrollPane; + + //private Address location; + private boolean vertical = true; + private boolean applyFilter = true; + + private double zoomAmountA = 1.0; + private double zoomAmountT = 1.0; + long halfPage = 512L; + + public MemviewProvider(PluginTool tool, DebuggerMemviewPlugin plugin) { + super(tool, TITLE, plugin.getName()); + this.plugin = plugin; + + this.autoServiceWiring = AutoService.wireServicesConsumed(plugin, this); + + //setIcon(DebuggerResources.ICON_PROVIDER_REGIONS); + //setHelpLocation(DebuggerResources.HELP_PROVIDER_REGIONS); + setWindowMenuGroup(DebuggerPluginPackage.NAME); + + mainPanel = new JPanel(new BorderLayout()); + mainPanel.addComponentListener(new ComponentAdapter() { + @Override + public void componentResized(ComponentEvent e) { + resized(); + } + }); + tool.addComponentProvider(this, false); + createActions(); + buildPanel(); + } + + private void createActions() { + + DockingAction zoomInAAction = new ZoomInAAction(this); + tool.addLocalAction(this, zoomInAAction); + + DockingAction zoomOutAAction = new ZoomOutAAction(this); + tool.addLocalAction(this, zoomOutAAction); + + DockingAction zoomInTAction = new ZoomInTAction(this); + tool.addLocalAction(this, zoomInTAction); + + DockingAction zoomOutTAction = new ZoomOutTAction(this); + tool.addLocalAction(this, zoomOutTAction); + + new ToggleActionBuilder("Toggle Layout", plugin.getName()) // + //.menuPath("&Toggle layout") // + .toolBarIcon(AbstractRefreshAction.ICON) + .helpLocation(new HelpLocation(plugin.getName(), "toggle_layout")) // + .onAction(ctx -> performToggleLayout(ctx)) + .buildAndInstallLocal(this); + + new ToggleActionBuilder("Toggle Process Trace", plugin.getName()) // + //.menuPath("&Toggle layout") // + .toolBarIcon(DebuggerResources.ICON_SYNC) + .helpLocation(new HelpLocation(plugin.getName(), "toggle_process_trace")) // + .onAction(ctx -> performToggleTrace(ctx)) + .selected(true) + .buildAndInstallLocal(this); + + new ToggleActionBuilder("Apply Filter To Panel", plugin.getName()) // + //.menuPath("&Toggle layout") // + .toolBarIcon(DebuggerResources.ICON_FILTER) + .helpLocation(new HelpLocation(plugin.getName(), "apply_to_panel")) // + .onAction(ctx -> performApplyFilterToPanel(ctx)) + .selected(true) + .buildAndInstallLocal(this); + + } + + void buildPanel() { + mainPanel.removeAll(); + memviewPanel = new MemviewPanel(this); + memviewTable = new MemviewTable(this); + + scrollPane = new JScrollPane(memviewPanel); + scrollPane.setPreferredSize(memviewPanel.getSize()); + + JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); + splitPane.setRightComponent(scrollPane); + splitPane.setLeftComponent(memviewTable.getComponent()); + splitPane.setDividerLocation(0.5); + mainPanel.add(splitPane, BorderLayout.CENTER); + //mainPanel.add(memviewTable.getComponent(), BorderLayout.WEST); + + setDirection(); + + mainPanel.validate(); + } + + private void performToggleLayout(ActionContext ctx) { + vertical = !vertical; + setDirection(); + refresh(); + } + + private void performToggleTrace(ActionContext ctx) { + plugin.toggleTrackTrace(); + } + + private void performApplyFilterToPanel(ActionContext ctx) { + applyFilter = !isApplyFilter(); + if (applyFilter) { + memviewTable.applyFilter(); + } + else { + memviewPanel.setBoxes(memviewTable.getBoxes()); + } + refresh(); + } + + private void setDirection() { + memviewPanel.setVerticalMode(vertical); + } + + void dispose() { + tool.removeComponentProvider(this); + } + + @Override + public ActionContext getActionContext(MouseEvent event) { + if (event != null && event.getSource() == mainPanel) { + return new ActionContext(this, mainPanel); + } + if (event != null && event.getSource() == memviewPanel) { + return new ActionContext(this, memviewPanel); + } + return null; + } + + @Override + public JComponent getComponent() { + return mainPanel; + } + + @Override + public HelpLocation getHelpLocation() { + return new HelpLocation(plugin.getName(), plugin.getName()); + } + + public void setProgram(Program program) { + memviewTable.setProgram(program); + } + + public void initViews() { + memviewPanel.initViews(); + memviewPanel.setPreferredSize(new Dimension(300, 100)); + memviewTable.setListingService(listingService); + mainPanel.doLayout(); + mainPanel.repaint(); + } + + public void refresh() { + String subTitle = " (" + zoomAmountA + "x:" + zoomAmountT + ") "; + subTitle += memviewPanel.getTitleAnnotation(); + setSubTitle(subTitle); + memviewPanel.refresh(); + scrollPane.getViewport().doLayout(); + } + + public void goTo(int x, int y) { + Rectangle bounds = scrollPane.getBounds(); + scrollPane.getViewport() + .scrollRectToVisible(new Rectangle(x, y, bounds.width, bounds.height)); + scrollPane.getViewport().doLayout(); + } + + public void goTo(MemoryBox box) { + Point p = new Point(box.getX(vertical) - 10, box.getY(vertical) - 10); + Point p0 = scrollPane.getViewport().getViewPosition(); + int w = scrollPane.getViewport().getWidth(); + int h = scrollPane.getViewport().getHeight(); + if (p.x > p0.x && p.x < p0.x + w && p.y > p0.y && p.y < p0.y + h) { + return; + } + scrollPane.getViewport().setViewPosition(p); + } + + public void selectTableEntry(Set boxes) { + memviewTable.setSelection(boxes); + } + + public void selectPanelPosition(Set boxes) { + memviewPanel.setSelection(boxes); + if (boxes.size() == 1) { + Iterator iterator = boxes.iterator(); + goTo(iterator.next()); + } + } + + public void changeZoomA(int changeAmount) { + this.zoomAmountA = (float) (zoomAmountA * Math.pow(2.0, changeAmount)); + memviewPanel.scaleCurrentPixelAddr(changeAmount); + } + + public double getZoomAmountA() { + return zoomAmountA; + } + + public void changeZoomT(int changeAmount) { + this.zoomAmountT = (float) (zoomAmountT * Math.pow(2.0, changeAmount)); + memviewPanel.scaleCurrentPixelTime(changeAmount); + } + + public double getZoomAmountT() { + return zoomAmountT; + } + + void resized() { + memviewPanel.refresh(); + } + + public void setBoxes(List blist) { + Swing.runIfSwingOrRunLater(() -> { + memviewTable.setBoxes(blist); + memviewPanel.setBoxes(blist); + }); + } + + public void setBoxesInPanel(List blist) { + Swing.runIfSwingOrRunLater(() -> { + memviewPanel.setBoxes(blist); + memviewPanel.refresh(); + }); + } + + public void addBox(MemoryBox box) { + List blist = new ArrayList<>(); + blist.add(box); + addBoxes(blist); + } + + public void addBoxes(List blist) { + Swing.runIfSwingOrRunLater(() -> { + memviewTable.addBoxes(blist); + memviewPanel.addBoxes(blist); + }); + } + + public boolean isApplyFilter() { + return applyFilter; + } + + public void reset() { + Swing.runIfSwingOrRunLater(() -> { + memviewTable.reset(); + memviewPanel.reset(); + }); + } +} diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/MemviewService.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/MemviewService.java new file mode 100644 index 0000000000..921705a65a --- /dev/null +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/MemviewService.java @@ -0,0 +1,38 @@ +/* ### + * IP: GHIDRA + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package ghidra.app.plugin.core.debug.gui.memview; + +import java.util.List; + +import ghidra.framework.plugintool.ServiceInfo; +import ghidra.program.model.listing.Program; + +/** + * The MemviewService provides a general service for displaying objects + * on time vs. memory axes (a la Boxes) + */ +@ServiceInfo(defaultProvider = DebuggerMemviewPlugin.class, description = "Display memory vs. time events") +public interface MemviewService { + + public void setBoxes(List boxList); + + public void initViews(); + + public void setProgram(Program currentProgram); + + public MemviewProvider getProvider(); + +} diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/MemviewTable.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/MemviewTable.java new file mode 100644 index 0000000000..39d68a351e --- /dev/null +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/MemviewTable.java @@ -0,0 +1,288 @@ +/* ### + * IP: GHIDRA + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package ghidra.app.plugin.core.debug.gui.memview; + +import java.awt.BorderLayout; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.util.*; + +import javax.swing.*; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; + +import docking.widgets.filter.FilterListener; +import ghidra.app.services.DebuggerListingService; +import ghidra.program.model.address.Address; +import ghidra.program.model.address.AddressRangeImpl; +import ghidra.program.model.listing.Program; +import ghidra.util.table.GhidraTable; +import ghidra.util.table.GhidraTableFilterPanel; +import ghidra.util.task.SwingUpdateManager; +import resources.ResourceManager; + +public class MemviewTable { + + public static final ImageIcon ICON_TABLE = ResourceManager.loadImage("images/table.png"); + + private MemviewMapModel model; + private GhidraTable table; + private GhidraTableFilterPanel filterPanel; + private FilterListener filterListener; + private SwingUpdateManager applyFilterManager = new SwingUpdateManager(this::applyFilter); + private JPanel component; + + private MemviewProvider provider; + private Program program; + private DebuggerListingService listingService; + + public MemviewTable(MemviewProvider provider) { + this.provider = provider; + this.model = new MemviewMapModel(provider); + this.table = new GhidraTable(model); + table.setHTMLRenderingEnabled(true); + this.component = new JPanel(new BorderLayout()); + JScrollPane scrollPane = new JScrollPane(table); + filterPanel = new GhidraTableFilterPanel<>(table, model); + component.add(scrollPane, BorderLayout.CENTER); + component.add(filterPanel, BorderLayout.SOUTH); + table.setAutoscrolls(true); + + table.getSelectionModel().addListSelectionListener(new ListSelectionListener() { + @Override + public void valueChanged(ListSelectionEvent e) { + if (e.getValueIsAdjusting()) { + return; + } + int modelRow = filterPanel.getModelRow(table.getSelectedRow()); + MemoryBox box = model.getBoxAt(modelRow); + if (box != null) { + Set boxes = new HashSet(); + boxes.add(box); + provider.selectPanelPosition(boxes); + } + } + }); + table.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + if (e.getClickCount() == 2) { + navigateToSelectedObject(); + } + } + }); + + filterListener = new FilterActionFilterListener(); + filterPanel.addFilterChagnedListener(filterListener); + } + + public JComponent getComponent() { + return component; + } + + public JComponent getPrincipalComponent() { + return table; + } + + public void setProgram(Program program) { + this.program = program; + } + + public void setListingService(DebuggerListingService listingService) { + this.listingService = listingService; + } + + public void setBoxes(Collection blist) { + model.setBoxes(blist); + } + + public void addBoxes(Collection blist) { + model.addBoxes(blist); + } + + public void reset() { + model.reset(); + } + + public List getBoxes() { + return model.getBoxes(); + } + + public void setSelection(Set set) { + table.clearSelection(); + for (MemoryBox box : set) { + int index = model.getIndexForBox(box); + int viewRow = filterPanel.getViewRow(index); + if (viewRow >= 0) { + table.addRowSelectionInterval(viewRow, viewRow); + table.scrollToSelectedRow(); + } + } + } + + protected void navigateToSelectedObject() { + int selectedRow = table.getSelectedRow(); + int selectedColumn = table.getSelectedColumn(); + Object value = table.getValueAt(selectedRow, selectedColumn); + Address addr = null; + if (value instanceof Address) { + addr = (Address) value; + } + if (value instanceof AddressRangeImpl) { + AddressRangeImpl range = (AddressRangeImpl) value; + addr = range.getMinAddress(); + } + if (value instanceof Long) { + Long lval = (Long) value; + if (program != null) { + addr = program.getAddressFactory().getAddressSpace("ram").getAddress(lval); + } + } + if (listingService != null) { + listingService.goTo(addr, true); + } + } + + public void applyFilter() { + List blist = new ArrayList<>(); + for (int i = 0; i < filterPanel.getRowCount(); i++) { + int row = filterPanel.getModelRow(i); + if (row >= 0) { + blist.add(model.getBoxAt(row)); + } + } + provider.setBoxesInPanel(blist); + } + + private class FilterActionFilterListener implements FilterListener { + @Override + public void filterChanged(String text) { + if (provider.isApplyFilter()) { + applyFilterManager.updateLater(); + } + } + } + + /* + private List generateRows(Collection changed) { + List list = new ArrayList<>(); + for (MemoryBox box : changed) { + list.add(new MemviewRow(box)); + } + if (model instanceof EnumeratedColumnTableModel) { + @SuppressWarnings("unchecked") + EnumeratedColumnTableModel m = + (EnumeratedColumnTableModel) model; + m.clear(); + m.addAll(list); + } + setColumns(); + model.fireTableStructureChanged(); + return list; + } + */ + + /* + private MemviewRow findMatch(MemoryBox changed) { + MemviewRow match = null; + for (int i = 0; i < model.getRowCount(); i++) { + MemviewRow row = model.getRowObject(i); + if (row.getBox().equals(changed)) { + row.setAttributes(changed.getAttributeMap()); + match = row; + break; + } + } + return match; + } + */ + + /* + private List updateMatch(MemviewRow match) { + MemviewEnumeratedColumnTableModel m = (MemviewEnumeratedColumnTableModel) model; + m.updateColumns(match); + m.fireTableDataChanged(); + List list = new ArrayList<>(); + if (match != null) { + list.add(match); + model.setLastSelectedObjects(list); + model.fireTableStructureChanged(); + } + return list; + } + */ + + /* + public void setColumns() { + MemviewEnumeratedColumnTableModel m = (MemviewEnumeratedColumnTableModel) model; + for (int i = 0; i < model.getRowCount(); i++) { + MemviewRow r = model.getRowObject(i); + m.updateColumns(r); + } + m.fireTableStructureChanged(); + } + */ + + /* + public TargetObject getSelectedObject() { + int selectedColumn = table.getSelectedColumn(); + R r = model.getRowObject(table.getSelectedRow()); + if (r instanceof ObjectAttributeRow) { + ObjectAttributeRow row = (ObjectAttributeRow) r; + return row.getTargetObject(); + } + if (r instanceof MemviewRow) { + MemviewRow row = (MemviewRow) r; + TargetObject targetObject = row.getTargetObject(); + if (selectedColumn > 0) { + List keys = row.getKeys(); + if (selectedColumn >= keys.size()) { + selectedColumn = 0; + } + String key = keys.get(selectedColumn); + Map attributes = targetObject.getCachedAttributes(); + Object object = attributes.get(key); + if (object instanceof TargetObject) { + return (TargetObject) object; + } + } + return targetObject; + } + return null; + } + */ + + /* + public void setSelectedObject(MemoryBox selection) { + for (int i = 0; i < model.getRowCount(); i++) { + MemviewRow row = model.getRowObject(i); + if (row.getBox().equals(selection)) { + table.selectRow(i); + break; + } + } + } + */ + + /* + public void setFocus(MemoryBox focused) { + Swing.runIfSwingOrRunLater(() -> { + setSelectedObject(focused); + }); + } + */ + +} diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/actions/ZoomInAAction.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/actions/ZoomInAAction.java new file mode 100644 index 0000000000..cca269873e --- /dev/null +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/actions/ZoomInAAction.java @@ -0,0 +1,55 @@ +/* ### + * IP: GHIDRA + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package ghidra.app.plugin.core.debug.gui.memview.actions; + +import javax.swing.ImageIcon; + +import docking.ActionContext; +import docking.action.DockingAction; +import docking.action.ToolBarData; +import ghidra.app.plugin.core.debug.gui.memview.MemviewProvider; +import ghidra.util.HelpLocation; +import resources.ResourceManager; + +public class ZoomInAAction extends DockingAction { + + private final ImageIcon ICON = ResourceManager.loadImage("images/zoom_in.png"); + + private MemviewProvider provider; + + public ZoomInAAction(MemviewProvider provider) { + super("Zoom In (Addrs)", provider.getName()); + this.provider = provider; + setEnabled(true); + + this.setToolBarData(new ToolBarData(ICON, "aoverview")); + + setDescription("Zoom In (A)"); + setHelpLocation(new HelpLocation("DebuggerMemviewPlugin", "zoom")); + } + + @Override + public boolean isEnabledForContext(ActionContext context) { + return true; + } + + @Override + public void actionPerformed(ActionContext context) { + provider.changeZoomA(1); + provider.refresh(); + } + +} diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/actions/ZoomInTAction.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/actions/ZoomInTAction.java new file mode 100644 index 0000000000..0effc0c1fe --- /dev/null +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/actions/ZoomInTAction.java @@ -0,0 +1,55 @@ +/* ### + * IP: GHIDRA + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package ghidra.app.plugin.core.debug.gui.memview.actions; + +import javax.swing.ImageIcon; + +import docking.ActionContext; +import docking.action.DockingAction; +import docking.action.ToolBarData; +import ghidra.app.plugin.core.debug.gui.memview.MemviewProvider; +import ghidra.util.HelpLocation; +import resources.ResourceManager; + +public class ZoomInTAction extends DockingAction { + + private final ImageIcon ICON = ResourceManager.loadImage("images/zoom_in.png"); + + private MemviewProvider provider; + + public ZoomInTAction(MemviewProvider provider) { + super("Zoom In (Time)", provider.getName()); + this.provider = provider; + setEnabled(true); + + this.setToolBarData(new ToolBarData(ICON, "aoverview")); + + setDescription("Zoom In (T)"); + setHelpLocation(new HelpLocation("DebuggerMemviewPlugin", "zoom")); + } + + @Override + public boolean isEnabledForContext(ActionContext context) { + return true; + } + + @Override + public void actionPerformed(ActionContext context) { + provider.changeZoomT(1); + provider.refresh(); + } + +} diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/actions/ZoomOutAAction.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/actions/ZoomOutAAction.java new file mode 100644 index 0000000000..f3174c729c --- /dev/null +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/actions/ZoomOutAAction.java @@ -0,0 +1,55 @@ +/* ### + * IP: GHIDRA + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package ghidra.app.plugin.core.debug.gui.memview.actions; + +import javax.swing.ImageIcon; + +import docking.ActionContext; +import docking.action.DockingAction; +import docking.action.ToolBarData; +import ghidra.app.plugin.core.debug.gui.memview.MemviewProvider; +import ghidra.util.HelpLocation; +import resources.ResourceManager; + +public class ZoomOutAAction extends DockingAction { + + private final ImageIcon ICON = ResourceManager.loadImage("images/zoom_out.png"); + + private MemviewProvider provider; + + public ZoomOutAAction(MemviewProvider provider) { + super("Zoom Out (Addrs)", provider.getName()); + this.provider = provider; + setEnabled(true); + + this.setToolBarData(new ToolBarData(ICON, "aoverview")); + + setDescription("Zoom Out (A)"); + setHelpLocation(new HelpLocation("DebuggerMemviewPlugin", "zoom")); + } + + @Override + public boolean isEnabledForContext(ActionContext context) { + return true; + } + + @Override + public void actionPerformed(ActionContext context) { + provider.changeZoomA(-1); + provider.refresh(); + } + +} diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/actions/ZoomOutTAction.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/actions/ZoomOutTAction.java new file mode 100644 index 0000000000..0243042d94 --- /dev/null +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/actions/ZoomOutTAction.java @@ -0,0 +1,55 @@ +/* ### + * IP: GHIDRA + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package ghidra.app.plugin.core.debug.gui.memview.actions; + +import javax.swing.ImageIcon; + +import docking.ActionContext; +import docking.action.DockingAction; +import docking.action.ToolBarData; +import ghidra.app.plugin.core.debug.gui.memview.MemviewProvider; +import ghidra.util.HelpLocation; +import resources.ResourceManager; + +public class ZoomOutTAction extends DockingAction { + + private final ImageIcon ICON = ResourceManager.loadImage("images/zoom_out.png"); + + private MemviewProvider provider; + + public ZoomOutTAction(MemviewProvider provider) { + super("Zoom Out (Time)", provider.getName()); + this.provider = provider; + setEnabled(true); + + this.setToolBarData(new ToolBarData(ICON, "aoverview")); + + setDescription("Zoom Out (T)"); + setHelpLocation(new HelpLocation("DebuggerMemviewPlugin", "zoom")); + } + + @Override + public boolean isEnabledForContext(ActionContext context) { + return true; + } + + @Override + public void actionPerformed(ActionContext context) { + provider.changeZoomT(-1); + provider.refresh(); + } + +}