tag:blogger.com,1999:blog-85509622024-02-18T15:39:14.035-08:00PyDev adventuresPosting about venturing (and creating) PyDev.<br>
<p><strong>LINKS: <a href="http://pydev.org">PyDev.org</a> <a href="http://pydev.blogspot.com/atom.xml">Blog RSS</a> <a href="http://twitter.com/statuses/user_timeline/57455092.rss">Twitter RSS</a></strong></p>Fabio Zadroznyhttp://www.blogger.com/profile/04202246218394712738noreply@blogger.comBlogger324125tag:blogger.com,1999:blog-8550962.post-32288777831048374022024-02-04T02:51:00.000-08:002024-02-04T02:51:45.154-08:00PyDev Debugger and sys.monitoring (PEP 669) -- i.e.: really fast debugging for Python 3.12!<p>The latest release of <b><a href="https://www.pydev.org/" target="_blank">PyDev </a>(12.0.0)</b> is now available and it brings a really nice speed improvement for those who are already in Python 3.12! -- If you're a <a href="https://www.liclipse.com/" target="_blank">LiClipse </a>user, it's now available in <b>LiClipse 11</b>.<br /></p><p>The PyDev Debugger now uses <b>sys.monitoring</b>, which enables faster debugging (on my tests it can be up to 15 times faster than the version using <b>sys.setttrace</b>, depending on the use case -- kudos to Mark Shannon for PEP 669 😉).<br /></p><p>It took me a while to cover the many scenarios that <b>pydevd</b> deals with, but the good thing is that most of the infrastructure available in <b>pydevd </b>didn't need changes (the debugger already had all the concepts needed as it already tried to trace only the frames which were actually needed, which definitely helped a lot as this is now pretty central in how to deal with the tracing using <b>sys.monitoring</b>)</p><p>Given that it's now out, I'll talk about how it works and some of the caveats when using it.</p><p>So, the first thing to note is that <b>PEP 669</b> defines a bunch of callbacks which are now related to the code object (and not the frame as happened with <b>sys.settrace</b>) and when inside one of those callbacks the debugger can react to decide what should happen.</p><p>Some things that could happen could be pausing due to a breakpoint or a step instruction or deciding that the given code should not be traced again (by returning a DISABLE).<br /></p><p>The reason it becomes faster than the previous approach is that the DISABLE is then considered by the Python interpreter which then bakes that DISABLE into the code when it's executing (up until <b>sys.monitoring.restart_events()</b> is called again). This does come with a big caveat though: if there are multiple threads running the program and one of those threads returns a DISABLE instruction then the related callback will actually be disabled for all the threads. Note that if DISABLE is not returned, the speed ends up being close to what was available with <b>sys.settrace</b> (which wasn't all that bad in <b>pydevd</b> already, but definitely a step down from what is now available).<br /></p><p>This means that the debugger is really <b>much faster</b> when going for a <b>breakpoint </b>(because it can DISABLE many of the tracing instructions), but after a breakpoint is hit, if one thread is doing a step operation, then the speed reverts back to being close to the <b>sys.settrace</b> variant (the debugger can still DISABLE tracing for places it knows the user never wants to stop, but it cannot DISABLE the tracing for any code in any thread where the user may want to stop, because the thread which is stepping could be affected by a DISABLE in another thread which is not stepping, or at least the stepping must be considered for all threads even if a given thread hasn't really stopped and is not stepping).</p><p>Also, it's worth to mention that <b>sys.monitoring</b> has finer grained events vs. the ones available in <b>sys.settrace</b>, which is good as for instance, it's possible to get events from exceptions separate from events related to entering/returning from a function or lines, which helps the debugger in tracing only what's actually needed (the tracing debugger had to do lots of gymnastics to create a separate tracer just for exceptions when there would be no need to trace a given scope for lines, so, the new code ends up being both simpler and faster).<br /></p><p>Note however that in <b>pydevd </b>I've done some other improvements and stepping should be more responsive even when using <b>sys.settrace</b> with older versions of Python!</p><p>p.s.: the <b>attach to process</b> is still <b>not </b>available for <b>Python 3.12</b>. </p><p style="margin-left: 40px; text-align: left;">Note: back in the day other players which make use of <b>pydevd </b>such
as JetBrains and Microsoft did step up to finance it, but at this point
the only support it has is from backers in the community.</p><p style="margin-left: 40px; text-align: left;">So, if you enjoy using <b>pydevd</b> please consider becoming a supporter... I've actually just setup sponsoring through GitHub sponsorships (<a href="https://github.com/sponsors/fabioz">https://github.com/sponsors/fabioz</a>). Any takes on becoming one of the first backers there 😉?<br /></p>Fabio Zadroznyhttp://www.blogger.com/profile/04202246218394712738noreply@blogger.com0tag:blogger.com,1999:blog-8550962.post-85156432436899575002023-06-23T12:39:00.001-07:002023-06-23T12:39:55.826-07:00robocorp.log: a library to answer what happened in a Python run.<div style="text-align: justify;"></div><p style="text-align: justify;"><span style="font-family: inherit;">It's been a while since I don't post, so, I decided to shed some details on what I'm working now (which I think is a really nice -- open source -- tool for the Python ecosystem -- in my view it's something close to a "Time travel debugger" for Python, although it's mostly labelled as automatic logging for Python 😄).</span></p><p style="text-align: justify;"><span style="font-family: inherit;">I'll start with a bit of history though: I'm working with <a href="https://robocorp.com/">Robocorp</a> right now (<a href="https://robocorp.com/">Robocorp </a>is a company which focuses on automation projects -- it leverages and provides many open source tools, especially in the Python ecosystem).</span></p><p style="text-align: justify;"><span style="font-family: inherit;">A few years back Robocorp approached me to do a language server for <a href="https://robotframework.org/">Robot Framework</a> (which started as a testing framework done in Python and right now is also used for doing automations, which Robocorp recommends for many clients doing automations -- although many clients also prefer to just use Python directly). </span></p><p style="text-align: justify;"><span style="font-family: inherit;">Now, one of the strong points of Robot Framework is that it generates an output which provides information on everything that happened during its execution (Keyword calls -- which is how "methods" are called in Robot Framework, if statements, return values, etc), so, it's almost a "Time travel" debugger as it records and shows information on everything that happened in the execution.</span></p><p style="text-align: left;"><span style="font-family: inherit;">Now, this brings me to what I'm working right now: a library which records what happens inside a Python process -- along with a UI which makes it possible to inspect it afterwards (its the Python log counterpart of Robot Framework).</span></p><p style="text-align: justify;"><span style="font-family: inherit;">For those curious I've created a repo with one example showing the output from Robot Framework and from the one generated by the Robocorp's Python Framework: <a href="https://github.com/fabioz/log_examples">https://github.com/fabioz/log_examples</a>.</span></p><p style="text-align: justify;"><span style="font-family: inherit;">You can also see a live example (which solves the <a href="https://rpachallenge.com/">https://rpachallenge.com/</a>) output of <a href="https://fabioz.github.io/log_examples/rf-browser-rpachallenge/output/log.html">Robot Framework log.html</a> as well as the output of <a href="https://fabioz.github.io/log_examples/python-browser-rpachallenge/output/log.html">Robocorp's Python Framework log.html</a>.<br /></span></p><p style="text-align: justify;"><span style="font-family: inherit;">The easiest way to use it right now is by using the tasks from Robocorp's Python Framework (see: <a href="https://github.com/robocorp/robo/tree/master/tasks">https://github.com/robocorp/robo/tree/master/tasks</a> as the log will be automatically generated for tasks run through it -- mostly, mark your entry points with <b>@task</b> (<b>from robocorp.tasks import task</b>) and run with `<b>python -m robocorp.tasks run</b>` and get your `<b>log.html</b>` in the `<b>output</b>` showing method calls, if statements, assigns, returns, etc that happened in your run).<br /></span></p><p style="text-align: justify;"><span style="font-family: inherit;">One question I got a few times is how does it work... Well, after working quite a bit on pydevd and debugpy one of the things scratched right from the start was trying to use Python debugger infrastructure due to a simple fact: if the debugger infrastructure was used then no one could actually debug the code while using the logging framework.<br /></span></p><p style="text-align: justify;"><span style="font-family: inherit;">In the end, inspiration ended up coming from <b>PyTest</b>. p.s.: thanks to <a href="https://github.com/nicoddemus">Bruno Oliveira</a> for a discussion back in the day about how assertions were rewritten using import hooks to provide nicer messages in assertion failures in <b>PyTest</b>.</span></p><p style="text-align: justify;"><span style="font-family: inherit;"><b>robocorp.log</b> uses the same approach as <b>PyTest</b> (import hooks + ast rewriting), but instead of rewriting asserts it rewrites the whole method to add callbacks on what's happening.</span></p><p style="text-align: left;"><span style="font-family: inherit;">So, something as:</span></p><div style="text-align: left;"><span style="font-family: courier;">def method():</span></div><div style="text-align: left;"><span style="font-family: courier;"> a = 1</span></div><p style="text-align: left;"><span style="font-family: inherit;"></span></p><p style="text-align: left;"><span style="font-family: inherit;">roughly becomes something as:</span></p><div style="text-align: left;"><span style="font-family: courier;">def method():</span></div><div style="text-align: left;"><span style="font-family: courier;"> report_method_start(..., 'method')</span></div><div style="text-align: left;"><span style="font-family: courier;"> a = 1 <br /></span></div><div style="text-align: left;"><span style="font-family: courier;"> report_assign(..., 'a', a)</span></div><div style="text-align: left;"><span style="font-family: courier;"> report_method_end()</span></div><p style="text-align: justify;"><span style="font-family: inherit;">The real output is a bit more contrived as it needs to deal with exceptions, yields, making sure the stack is correct, but I hope you get the idea.</span></p><p style="text-align: justify;"><span style="font-family: inherit;">Then, the callbacks are converted into a kind of journal of what happens and that is then fed to the <b>log.html</b> (the idea is having it directly in a view in VSCode in the future so that you can see the log being created in real time -- right now the info is added to a bunch of "<b>robolog</b>" files and embedded into the final <b>log.html</b>).<br /></span></p><p style="text-align: justify;"><span style="font-family: inherit;">Now, the approach does come with one caveat: import hooks need to be setup prior to importing a module, code imported before setting it up won't be traced -- it's one of the reasons why it's recommended to use <b>robocorp.tasks</b> to do the launching instead of bolting the logging manually as it makes sure things happen in the proper order.</span></p><p style="text-align: justify;"><span style="font-family: inherit;">The second caveat is related to the object <b>__repr__</b>. The framework is quite keen on getting the representation from objects at various times, so, if the <b>__repr__ </b>is too slow the execution may be much slower or even worse, if it has side-effects bad things will happen (thankfully most objects do the right thing as a <b>__repr__ </b>with side effects is a bug and the program would misbehave on debuggers too).</span></p><p style="text-align: justify;"><span style="font-family: inherit;">The third caveat is that right now it needs to be told what needs to be traced (by default full logging is available for all code which is considered user code and libraries need to be manually specified to be logged when it's called directly from a function which is considered user code -- this may change in the future, but it's the current state of affairs).</span></p><p style="text-align: justify;"><span style="font-family: inherit;">The final caveat is that right now it'll only trace what's happening in the main thread. Other threads won't appear in the log. <br /></span></p><p style="text-align: justify;"><span style="font-family: inherit;">Well, I guess this post is already a bit bigger than I planned so I'll stop here. For those interested in testing or reporting enhancements/bugs see: <a href="https://github.com/robocorp/robo/">https://github.com/robocorp/robo/</a>.</span></p><p style="text-align: justify;"><span style="font-family: inherit;">Enjoy!<br /></span></p>Fabio Zadroznyhttp://www.blogger.com/profile/04202246218394712738noreply@blogger.com0tag:blogger.com,1999:blog-8550962.post-30159004850972453372022-08-11T06:46:00.000-07:002022-08-11T06:46:30.937-07:00PyDev debugger: Going from async to sync to async... oh, wait.<p> In Python <b>asyncio</b> land it's always a bit of a hassle when you have existing code which runs in sync mode which needs to be retrofitted to run in <b>async</b>, but it's usually doable -- in many cases, slapping <b>async</b> on the top of a bunch of definitions and adding the needed <b>await </b>statements<b> </b>where needed does the trick -- even though it's not always that easy.</p><p>Now, unfortunately a debugger has no such option. You see, a debugger needs to work on the boundaries of callbacks which are called from python (i.e.: it will usually do a busy wait from a line event from a callback registered in <b>sys.settrace</b> which is always called as a <b>sync</b> call).</p><p>Still, users still want to do some evaluation in the breakpoint context which would <b>await</b>... What now? Classic questions of how to go from <a href="https://stackoverflow.com/questions/55647753/call-async-function-from-sync-function-while-the-synchronous-function-continues">async to sync</a> say this is not possible.<br /></p><p>This happens because to run something in <b>asynchronous</b> fashion an asyncio loop must be used to run it, but alas, the current loop is paused in the breakpoint and due to how <b>asyncio</b> is implemented in Python the <b>asyncio</b> loop is not reentrant, so, we can't just ask the loop to keep on processing at a certain point -- note that not all loops are equal, so, this is mostly an implementation detail on how CPython has implemented it, but unless we want to monkey-patch many things to make it reentrant, this would be a no-no... also, even if possible, it's not possible in <b>asyncio</b> to force a given coroutine to execute, rather we schedule it and <b>asyncio </b>decides when it'll run afterwards).</p><p>My initial naive attempt was just creating a new event loop, but again, CPython gets in the way because 2 event loops can't even coexist in the same thread. Then I thought about recreating the asyncio loop and got a bit further (up to being able to evaluate an <b>asyncio.sleep</b> coroutine), but after checking the <b>asyncio AbstractEventLoop </b>it became clear that the API is just too big to reimplement safely (it's not just about implementing the loop, it's also about implementing network I/O such as <b>getnameinfo</b>, <b>create_connection</b>, etc).<br /></p><p>In the end the solution implemented for the debugger is that to support <b>await</b> constructs for evaluation, a new thread is created with a new event loop and that event loop in that new thread will execute the coroutine (with the context of the paused frame passed to that thread for the evaluation).</p><p>This is not perfect as there are some cons, for instance, evaluating the code in a thread can mean that some evaluations may not work because some frameworks such as qt consider the UI thread as special and won't work properly, checks for the current thread won't match the thread paused and probably a bunch of other things, but I guess it's a reasonable tradeoff vs not having it at all as it should work in the majority of cases.</p><p>Keep an eye open for the next release as it'll be possible to await coroutines in the debugger evaluation and watches ;)</p><p>p.s.: For VSCode users this will also be available in debugpy.<br /></p>Fabio Zadroznyhttp://www.blogger.com/profile/04202246218394712738noreply@blogger.com2tag:blogger.com,1999:blog-8550962.post-77880057632280612842022-03-10T06:13:00.002-08:002022-03-10T06:13:59.040-08:00PyDev 9.3.0 (debugger improvements / last version with Python 2.7 - 3.5 support)<p>PyDev 9.3.0 is now available.</p><p>The main changes in this release are related to the debugger, with improvements such as: </p><ul style="text-align: left;"><li>Major issue fixed issue where variable children sometimes wouldn't expand correctly.</li><li>Fixed some case where automatic connection to subprocesses wouldn't work.</li><li>Debugging with Pandas is much improved with the addition of some custom converters.</li><li>Opt-in support to show paused greenlets by setting <b>GEVENT_SHOW_PAUSED_GREENLETS=1</b>.</li><li>Support for newer versions of gevent.</li><li>Information on user settings paths is cached to fix issue with slow debugging using pipenv project.</li><li>A warning is shown if getting some attribute / getting its repr is slow.</li><li>Interactively inspect matplotlib plots when the QtAgg backend is used.</li><li>Support for PySide2.</li><li>Better error messages in case Python 3.11 frozen modules are being used.</li></ul><p>Also noteworthy is that this will be the last release supporting older versions of Python including Python 2.7 up to Python 3.5. Newer releases will only support Python 3.6 onwards.</p><p></p>Fabio Zadroznyhttp://www.blogger.com/profile/04202246218394712738noreply@blogger.com0tag:blogger.com,1999:blog-8550962.post-65334879965579587862021-04-18T04:53:00.000-07:002021-04-18T04:53:35.703-07:00PyDev 8.3.0 (Java 11, Flake 8 , Code-completion LRU, issue on Eclipse 4.19)<p><b>PyDev 8.3.0</b> is now available!</p><p>Let me start with some warnings here:</p><p>First, PyDev now requires <b>Java 11</b>. I believe that <b>Java 11</b> is pretty standard nowadays and the latest Eclipse also requires <b>Java 11</b> (if you absolutely need<b> Java 8</b>, please keep using <b>PyDev 8.2.0</b> -- or earlier -- indefinitely, otherwise, if you are still using <b>Java 8</b>, please upgrade to <b>Java 11 -- </b>or higher).</p><p>Second, <b>Eclipse 2021-03 (4.19)</b> is <b>broken</b> and cannot be used <b>with any version of PyDev</b> due to <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=571990">https://bugs.eclipse.org/bugs/show_bug.cgi?id=571990</a>, so, if you use PyDev, please keep to <b>Eclipse 4.18 </b>(or get a newer if available) -- the latest version of PyDev warns about this, older versions will not complain but some features will not function properly, so, <b>please skip on using Eclipse 4.19</b> if you use PyDev.<br /></p><p>Now, on to the goodies ;)</p><p>On the linters front, the configurations for the linters can now be <b>saved to the project or user settings</b> and <b>flake8</b> has an UI for configuration which is much more flexible, allowing to change the severity of any error.</p><p>A new option which allows all comments to be added to a single indent was added (and this is now the default).</p><p>The <b>code-completion</b> and <b>quick fixes</b> which rely on <b>automatically </b>adding some <b>import </b>will now cache the selection so that if a given token is imported that selection is saved and when asked again it'll be reused (so, for instance, if you just resolved <b>Optional</b> to be <b>typing.Optional</b>, that'll be the first choice the next time around).</p><p>Environment variables are now properly supported in <strong>.pydevproject</strong>. The expected format is: <strong>${env_var:VAR_NAME}</strong>.</p><p>
<b>Acknowledgements</b><br />
<br />
Thanks to <a href="https://github.com/oluiscabral">Luis Cabral</a>, who is now helping in the project for doing many of those improvements (and to the Patrons at <a href="https://www.patreon.com/fabioz">https://www.patreon.com/fabioz</a> which enabled it to happen).</p><p> Enjoy! <br /></p>Fabio Zadroznyhttp://www.blogger.com/profile/04202246218394712738noreply@blogger.com0tag:blogger.com,1999:blog-8550962.post-68469003020923043552021-02-27T05:44:00.000-08:002021-02-27T05:44:56.279-08:00PyDev 8.2.0 released (external linters, Flake8, path mappings, ...)<p> PyDev 8.2.0 is now available for download.</p><p>This release has many improvements for dealing with external linters.</p><p>The main ones are the inclusion of support for the <a href="https://flake8.pycqa.org/en/latest/">Flake8</a> linter as well as using a single linter call for analyzing a directory, so, that should be much faster now (previously it called external linters once for each file) .</p><p>Note: to request code analysis for all the contents below a folder, right-click it and choose <b>PyDev > Code analysis:</b><br /></p><p></p><p></p><p></p><p><img alt="" src="data:image/png;base64,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" /></p><p>Another change is that comments are now added to the line indentation... </p><p>This means that some code as:</p><p></p><p></p><p></p>
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"> <code style="color: black; overflow-wrap: normal; word-wrap: normal;">def method():
if True:
pass</code></pre>
<p>
Will become:
</p>
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"> <code style="color: black; overflow-wrap: normal; word-wrap: normal;">def method():
# if True:
# pass</code></pre>
<p>
p.s.: it's possible to revert to the old behavior by changing the preferences at <b>PyDev > Editor > Code Style > Comments.</b> </p><p>Also note that after some feedback, on the next release an option to format such as the code below will also be added (and will probably be made the default):<br /></p>
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"> <code style="color: black; overflow-wrap: normal; word-wrap: normal;">def method():
# if True:
# pass</code></pre>
<p>Interpreter configuration also got a revamp:</p><p></p><p></p><p></p><p><img alt="" src="data:image/png;base64,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" /></p>So, it's possible to set a given interpreter to be the default one and if you work with conda, select <b>Choose from Conda </b>to select one of your conda environments and configure it in PyDev.<p></p><p>Path mappings for remote debugging can now (finally) be configured from within PyDev itself, so, changing environment variables is no longer needed for that:<br /></p><p> <img alt="" src="data:image/png;base64,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" /></p><p>Note that <b>Add path mappings template entry</b> may be clicked multiple times to add multiple entries.</p><p><span class="emoji">That's it... More details may be found at: <a href="http://pydev.org">http://pydev.org</a>.</span></p><p><span class="emoji">Hope you</span><span class="emoji"> enjoy the release </span><span class="emoji"><span class="emoji">😊</span></span></p><p><br /></p><p></p>Fabio Zadroznyhttp://www.blogger.com/profile/04202246218394712738noreply@blogger.com5tag:blogger.com,1999:blog-8550962.post-4649754212325958732020-12-08T11:26:00.000-08:002020-12-08T11:26:28.828-08:00PyDev 8.1.0 released (Python 3.9, Code analysis, f-string quick-fixes)<p> PyDev 8.1.0 is now available for download.</p><p>As a note, I didn't really create a post on 8.0.1, so, I'm covering some of the features in that version in this blog post too! <span class="emoji">😊</span></p><p><span class="emoji">Some nice things added: </span></p><ul style="text-align: left;"><li><span class="emoji">Python 3.9 is officially supported in PyDev -- definitely a must if you plan on using Python 3.9!</span></li></ul><ul style="text-align: left;"><li><span class="emoji">There are quick-fixes (<b>Ctrl+1</b>) to convert a string into an <b>f-string</b> (see image below):<br /></span></li></ul><p><span class="emoji"></span></p><p><span class="emoji"></span></p><p><span class="emoji"></span></p><p><span class="emoji"></span></p><p><span class="emoji"></span></p><p><span class="emoji"></span></p><p style="text-align: center;"><span class="emoji"><img alt="" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAbcAAAEgCAYAAAA39D0QAAAgAElEQVR4nO3df3QU9aH38YTwIxB+/yaQX0vIRp6rhShXS0i8D7YShFsLCBYDweoRCbXKr6TeSy2UVimKlUAJpFgiYJQiPArRQkQSgv1hBQ4KiBtrb/ucnuo9topG7A3X59zP88fsbma+853Z2d3Znd3ZD+e8jrI7szO7Jvv2+53Z2TRvsQdERERuknZX5XwQERElq699/WZ93JyuKxERkd0YNyIich3GjYiIXIdxSybVe+Dbt1R3e/U+H1o33ur8/hERJYg0b7EH10wsxH3LH8CufQdx8JV27Np3EPctfwDXTCy0/EC13lW46tUf1Atr/aJu73knO/7iyJTtu4yl+x6K/2NX74HPdwKP3Sa577Yfo9Xnw95q518fIqJEkHbNxEI8sb0Ru5pexOZt9Xh082Zs3laPXU0v4ontjZYDF03c5niX4mrRQtQmwAviXX4YSzsOo8zgfmfithR7fSFGZ9V74PPtQbXTrx8RUQJIW7J0ORqeb0Zdw9M6Dc83Y8nS5ZYeKJq4RTvqs1UCxq16nw++1h9jpun6t+KxVp902pKIKNWkbd71S+w+2IzGF17U2X2wGZt3/dLSA0UeqMloKGLcjB9bGbVZmnLk6I2ICN5iD9K2NR3DgeOvY+F9a3UOHH8d25qOyVf2LtQcI7sqC5S4jPp+2fpBYUxR3laHRR2HUbHxLSztuIylbXW4fvlh5d/FSAVv91OF5PrA+hKLNs4KLhcIkGb5tjpcL+yX7vEky+j2p0MSt7CCZR7COQ0X0NXViZZa53/wiIhiKW3jjufReOgY9r74K53GQ8ewccfzupVkx8jEkZt+GaMRWpQjt9vqsCgQD/W/Fz+EeR2XMW+5spwSG3XsZqGiTRITKyM3TYSU7egCKNuWKnD6/ZGP3GZuPGFhSjJAmZo0OjbHuBFRqkhbfN9y1Dc1Y/szTTr1Tc1YfJ94zO1mtBStQotX+0DauCnB0p3x6F0oGZXZEbe3UHGbJxg6JWjquClxUQfIW+yRhyyCaUnNbZp9MNhPIbxmj21n3IiIUkXaNRMLsXHbbuzc9xI279iNn9TVY/MO5e8bt+2WnC05G++FjJsSQGtTjvGIm/Lv8mnHWMQtEDE11f4YBJBxIyKyR/BzbvcsewDbGw+h6XA7tjcewj3LjD7nZmXkJl9GLn5x042mZBJs5GbnMTciolQR0RVKlA9cz8acYg+CcSoKdczNSDziJj/GZfx4xiEMGbdik2Nu4jLBY3D++2UnlNh4tiSPuRFRqojw8lvaacf3vJOVmAmBUgIX4ozKOMXNW2xwRqTktH5xOdnZkurlDW8z3Y52qnTRxlnKdmP4OTfGjYhSBa8tmRR4hRIionAwbsmieg98RtOTvLYkEZEG45ZEZm48wW8FICKygHEjIiLXYdyIiMh1GDciInIdxo2IiFyHcSMiItdh3NRqm9HV1RnEDzsTESUnxk1qBVpcGLebVk/HuuYZWLdpknyZylLlfr+Vq4sd32ciokgwblJui9sk3Ns8AytXT8G9RnGrLMW65ulYcIv/77dMwUoGjoiSFOMm5a64zdg0A/dWehCInD5uxViwWx8yZaRXihkJ8ByIiMKR/HGbuxUdshDVNqOr6wJ2zhVv6z6m1tWx1f/NBiLjuNW0dKKrZUXI23TbEu93hEHcbpmClepRW/C2GdrRHBFRkkj+uBX746IJ1Szs7BCCMncrOjSBUQImj050cVOuvt+MGrP9CUm5WLJPxvKXl4oM4iZMSc7Y5I9apRI4ZdRHRJQ8XBE33Sht7lZ0iKM2CemIq9iD6OKmhKyjYZZkH9XBc0KIuPljFrz/FsaNiJKTO+ImBGVOwwXJlKN/9NTVaWG6MJq4+UeEUgkaN6MpSNl0JRFREnBJ3DyqkZEsTP6wCcGLzcjNrpNR4jgtGTybUnJCye4puMnp/7ZERGFyT9wCUWlpNh61qaMUOOEjzLiJx9NqWvQjQP0xt0RhFLfAmZH6jwJwSpKIkpGL4haIiuR4V7EneFal+kzJmoYLmigFQ2U6dSlMO7asULYrRDKwL4lwxmTww9siYVQmLsewEVGyclXciIiIvMWMGxERuRDjRkRErsO4ERGR64Qdt/KyEiKKQPups2g/ddbx/SBym+uvn8i4ETmFcSOKDcaNyEGMG1FsMG6JrKYJvv0POb8fFDOMm31q9/vQvmWu4/tBiYFxs2pKFa4WrcL7JWXx2V5NE3y+Nmy5y+D+2iX44A9rcKauPHb74N9GwJHaBPjvEK/nHlI5dpwKvDZLsDZ4+0wcCWPfNHGL6nnNxZb2wOXYmlAbvP0h7Pc59Kb/w6OaCxa0/TDG27vrCbT7fNhf49TPBCUSxs0qO+I2pQpXi6qwIeSyFt6Q/G+EYnDWHhDfbIX7Ts1HVdj7rrxhM27dquqqg6/l2gNr8MGBmd2vsf/frZDFLZLXuXJLG3ztT6CyTBnBBEb86n93zr+hLR5xKyvx/0+hOu6Uqhi3eLIYt9r9vuAbleFyRm+EtUvwwR+qsaNSXCeaQCVY3BLA2gPdca2qq1aCVrvE8H8sjNgVt9rn38XJp+aivKwElU+14t3nH0J5zbN4991nE+CN/t/Q+l+foTUecSubi6dOvqs8f8efNzmJcYsnS3FTRm0hp1Yq5+OMScR0o5oI3njFx2TcuokjtzN1M7HjVPivkSZulfNx+r1q1Ov+m4Z211OtuHTycdxVVoKa5y/h5FMP4qmTl/D8Gudfq/Kyh9H6j0/Ruj5O21vzLC5dehY1jj9vcpJr47bhOmUKccN1q3C1KEAIy5QqXJ14B+4pq8DJou7lTk4RljG6z+K27ilZpnkMNd00pw3TKrLpR+l0mXBMzXjK0jhusse1tK0wpu6MHsMoJFV11dptGUQ9sFw0o9nA67Y2MHoLc39Otp/ByfYzEf13Lps2WeVBPHfpEi5duoRLbZtQ89MTuPTcg8IyFty9A+99cRkn1gu3r38FX3xxAY13i7dd7taxA3dLH/dhnJA95rTJ+OGJy/jixMMhb9NtS7xf8lo8tybM506uUlLi4rhdLVqFq9dV+G8rw96J6r+XqMK1DHunqkMkG10pATSKm3ZbyrK6cFkYuamPnUT8/HVTk5I4Vc7HGc2bsf/NWvoGHV3clDd3dWD8J2NEErgQ+xPOCDW6uAmvpdE2Q+yPWdwi/sVeuAmt7+zFmgjXX//aJ7jiU4dqARp9n+DKa9/rXu7uHehQ/33a9/DaFWEZ4b7X1hlsS1hHvO3uxvO4cuVlrDfbH405+GnrO2j96RzH32DJOe6OmzpkZSX6uEyp0oStvKwE5VPvwPvibWUlCBk3YVuWti9hS9zEqUmLb/jGJ0NEEzclZHGbJo3iuFVkyv3TkeqzJ1X/YxFif2Rxi+6X+pt48sRFNK1W/nnx4kVcvHgcT34rjMdY9zI+//xt7F7i//uSevjUfzew/vjH+Py4PG7HP/8Yx2Vxk6yjvW0+dr/7MXy750v2UR08/Wtw4slvOv4GS85JwbipwmX57MUSJFfctFOT8mip34xDTRdGEzfV9J1OjI4BVs7HGdV2YnlWZfDYW+0S49dbtT9/fW8NTm/p3p+T7WfQdvI0ysusR21aqbGFm1/F+dc2YuGqPco/Sydj9bPncf7ZB0zX05qPX7zzd1z6xXxMK52Mql+8hc53tqNKskxnp+DVWsnj1eLVzr/j1R/ot7XuVf062tuUdXXb6fw7OjuPYJ10/7+Jza+dx2ubvxnGcya3ScG4iSO3xIqbbacyB6cmZSHwh83KcbkQMbEaN3tHUmE8pj8sMQmc6qSeKtUxN/XJJrJ1TqsC13byNNpOng4zZJPk7nwMx99uwRN3TsK3nmjB23u/g2ml/n8//hi+ZbSezCOH8emnh/GD0hq0fPoRWh5R338Hnr74ET69+DNUqdb5QctH+LSlRvJ4sscwXkd7m/G6xr6DvW+/jb0rw1mH3Kak5JpUiZvkOFi84zb1Drxv8BjdLJ4taTEAZ06Jx7tKID3mFThZI8y4icfTlM/ZhTrmZs9zsxZMg2nRsmiPuWkf1+hzb7L16ttDx80sZKVqUwO+gcdbzqHl8W+gdOok3Pn4UZxreRR3Tp2ElXvO4dye5aplrViDox9/iKNHX8THb2/FYs198/Dztz/Ex0fXdN+29kV8/LFwm/hYa/XbWfzzM/j44xfxff/fv3/0Q93jiMuEtGI3zp3bjZVhPV9ym8mT3Rw34cxEXVQsxE32ONqTR8KIW5n+zEnZh8Itfc7NAllogoSpO9kZf8H1TacuhWnHAzM1oxgxJNGcMWllf2TbMRq1RRM3/Rmp8iuWqPfnr+9ppyXLpk1G28nTaG170zRq2ogFfEVjReNZnD36YywI3vYN/OToWZw9exZnzz6NFcLyVixqeBN/+9tf8VbDXP39i+rw1t/+ir8FvFWHtQ1v4m+vrA4us/YV1f1qqmVKp67GK8J9i4THUe+L8eMIz7uxOuznS+4yeXKxi+MmiUtycPCSSRQ3ZdMmo7XtTZxo/b0qbEZR6/6lnfpVMvTgLpw+vQsPOb0f5DjGLVHVNMHH6+S5VmCk1tr2e5xo/b1uxKaOmtEv71e/eh2pzfshmt94A08/kAD7Qo6bxLglrsotbQlwXUCKhUDcTrT+Hq+deEMSNknIbpK7iXDTTdfhOw2/wUs/muX4flBi+Mokl8aNKFGVTdPG7fhrv9OEbaoqbJqI3Xitzo03Xosb/5mIRF/5ijf6uBFReIq8BVpFBZhQlK+YkI/ym6cRURSuv2GS7veOcSOKIV3YvAWYoIpboT9u/MM//BPdH/F3j3EjiiF53LrDVjghj3HjH/6x4Y/4u8e4EcVQqFFbYSHjxj/8Y8cf8XePcSOKoVCjtvGMG//wjy1/xN89xo0ohhg3/uGf+PwRf/cYN6IYCh23XMaNf/jHhj/i7x7jRhQjVo63BeImrlvgySGKGad/N+KBcSOKEcaNEpXTvxvxwLgRxYh53JTjbePHM24Uf07/bsQD40YUI1bi5mHcyAFO/27EA+NGFCOxitucn5/G7TvfxDd2vOn4myQlJ6d/N+KBcSOKEbvjNr/hNCrqfodbn/oNvvbkrzH98ddx809OYeaTv7b0hrbqWCe6jn03sjfE2XXwdZ1H/Wzn35gLVh9BV1cnujrqMNvSfn0XxwyXMbsvB7Prz0fwmgmPqd7fSJ9zhK//qmOd8NVXMG5EZB+741b2WDtKf9SGDS9dQoEnB+sPvYPJ//4qvvK9Fmtvjh1HcKwjQQIVIirm63Xi2Gq7tmVy3+w6+CIKkvoxI9lfO1/XCtRL/ps7/bsRD4wbUYzYGbdAxL6//7zm9pp951BQfQR59x82fdObXX8evvqK4D+TO27hrhdZ3CJ/rcS4xfN/KCTbW31EN/p0+ncjHhg3ohixM27jH2hGQfUR6RvayKqDGL7oBZM3PNX/vetGIxWo7+hUps2CIwzZbcKb5uw6+Pz3++rr9G/m9UeC6+sDoYxmAvcH33hVj9klHe1o11Me13i/urqOYJXsDd9w3w1eM8PXKdT2ZPsrCdFq9f5UaO47duy8/3ElwdS9xiavqzACdfp3Ix4YN6IYsTNuI6sOYmTVQTzQoD2JpLr+DQy6cz8G3bnfOG6aNzfhTVvyf/XS20ym2mbXn0eXcF9w/dVHVG/6ZiMMYfrO8BiTbD2DUdLqI5IAmu27uB3Vfod8Tcy2ZzZqVB2L0zxn5T4xdqFfY9n2hOfCuBFRNOw+5haIWHX9G9bD5tFPr2lOkvCPPDSjCtlt6jdN3UjA7M3c6M1dNprSvgGvOmY0ejN4fGHk1z16sbrvJkEweZ1MtxfmlGj3cw4j4iG3pz/u5vTvRjwwbkQxYnfccr99KBgztdxvHzKJmzBVpZtCU49gtDHR3pYscQsxSow0brLXxMr2woqbMvVpf9w4ciOKqeuK8nE+sw8+69EDn/dIx0+HD3F8n2IpVp9zU4fNbLnglJXujD/1m6j2jVs8LtR9WzjTkhHETTotaXU602gqz3iZ0NOS8rMM9a+Jle1Z3F/Nc7YxbjzmRqmgMncMdg4djLasfrjUpzfeyuyDIwP743tjRsR82zdOyAPS0oJ2DxkUs209NnIofjUgC78akIWmwQMdea0T4QolRp9zCk5NBj6DpR7NyW4z+uyW0QklIePm/9yd4QklVkc7ZieUyKYJzfbdJPbS18TK9kKHSDlpRDyJJtK4SV5Xni1JbnZX7hj8tl+mJi6iv/bsiVXZIzXrlRbmYl7eWMzLGxv1PsQjbvPzsvH7vtrn+UHPDEde80SIW1wYjrKSXMSfc7MqHh8T4OfcyMXWjBlhGjW11/v1Da43tTBXc9+uodHFKNZx2zl0sPQ5/SfjFlOrjkV59Y0EFtkVSqyKfdyMrkrj9HtSPDBuLndbwTj8t/BmfzUtDYcH9scPRg3HI6OHY++QgfhHejqQloaLfXoH1xXj9myU03uRxG26Jwc3FeaFXO693r0Mg/1RBuNmL+1nvuSn+lNo8f6Adzen35figXFzuVf799O80f+lV0/My8vWLVcyIR87hw7GSwP7B28T4/bCoAFhbfufvAW4fkJ+8O/hxk0drKmFuabLft4jPbjsoyOHabbz94wejrz27o0bJTun35figXFzsbn5Y3WjmMrcMSHXK5mQj7cy++D/9uqpm977Y+9euJDZG6/27xdcft2o4bjUpzc6evdCnf8MyJcG9g+u93/8wQw3burtl403j9sHPTPws2GDcY23AN5ij2Y7n/To4cjrz7hRonL6vSkeGDcX+5Ewgjnbt4+l9W715IQ8NvcfvXoFl//ZsO5jXS8PyMJrwmjxVJZyHC/cuP1nzwzLcROpt/NpEsaNiKLDuLnYC4MGaN7kt1j8XNmNhXkh4+ZTHZtTx+1Kerpu2fYI4/ZJjx62xK2TcSNKOYybi4mn/j882vpn2SoKxmFR7hjN+scGZOFf88fiX/PHamKjjlvA25l98O+jh2PdqOF4fMRQeIvDj5s6lNHE7Up6uiOvP+NG5BzGzcU6hDMI784ZHdb6ZeO1J5TsMzhbUozb+717oUR1IkmAWdyeGTIQr/bvh5NZffHbfpk43TcTX6qW/W2/TLRl9cPRAVl42c9s39Xb+QfjRpRyGDcXezuzj+ZN/jtjR4W1vhg3o5GWGLfFOfKTVszi9qlqCtKq2QXjDPddvVyXy+I25+encfvON/GNHW86/jNGlKgYNxc7ojpjEWlp2DBqWFjri3FrGDpYupwYt38xmEI0i9ulPr3DjluFxbj9d1qaI6+/3XGb33AaFXW/w61P/QZfe/LXmP7467j5J6cw88lfW1q/pqUTXS0rIns+c7eio+sCds51+ud6BVpish/mjzun4UL4r12Er1lNSyc6GmY5/DonP8bNxcTo7DSIk5F4xu1WTw5uzx8bNCd/LK6qll06bjQW5GUHfTPf/HJg6u38P5fEreyxdpT+qA0bXroEb7EH6w+9E/yG7pDrz92Kjo5mtHQkQqA8iDxSDsRt7lZ0dGzFnLi9FrOwM2H+OyUvxs3FaoTLbn3eIx2TivTHwozEM24y6g9mh/oQt0i9nf9xQdwCEfv+/vPa/8b7zqGg+gjy7j9suv6chgvoaJgV/KfTP5vJFLfYv2aSbdc2Rz7KJniLGTdXm1qYi/8STs3/Xb9Mw+UnFeXjkdHDg38vFa5Q8kuDK5TEKm6fZPSwJW5wQdzGP9CMguoj0vtGVh3E8EUvmKyvGgnoRiGzsFN1Ka2WWqPbhDfguVvR4b+/o2Gr6j7/cg3NwfX1YViBFvWV9ANv4qrH7N6uyHg/9OvInod/elbctmHcxFGUf7la9fOfpbmvpeUCurqaUaN5TKPXxeS1iOlo0f0YN5fbPGKo7o3+8MD+yrSe/2oe/3t8DjaPGIqPM3poPr/mLfZopgb/0qsnJvrX+Sf/P73FsYub+kPcqR63kVUHMbLqIB5o0J5Eov42bsP1NW+Uwpu1bIQgHTWIb9TdsZjTcAFdwn3B9Wub/W/04n6JMdE+pvHxKuP90K6jhM18xCWJj3R76v33P7/A66nZpnKfGLvQr4ts2+J2KVyMWwr4j17yiwr/T1oavhBGdmLc3hc+TnA1PQ3v+C+1FVgmVnH7i+ryW6Hi9pt+fYMXfzbyZVoaPuvRA8vDPGs0UnYfcwtErLr+DXiLLYatWD+tpjk5wj/y0URAdpv6DVg3qjCLhFk0xBGY9s28pkU2ehP2w2gdyX1Btc2qiz5HEjftct37afbcw7nPAx53ix7jlgJu9eTgVFZfS2cgHlZdONlb7MH6UcOky/2pV8/gMrGK21PDh+DwwP6WToT5LIyPEtTF6RvA7Y5b7rcPab6FOyD324dM1hOmvYK0b/zK6EsbE+1tLomb5nZ1QCKNmzJCtD9uHLlFi3FLIY+PGKoZDamdy+yDH4waLl3v6aGDdMu/oTp2t3X4kODtX6Snm8ZNfZJItN8Pp3Yh0/pHCVaPGWnbds3E6nNu6rCFXL62uXsKLUj9htxNduJE923hTEtGEDfpFGOo6UyzdQymJdWvh25K0eoxN9XjarZpY9x4zC1qjFsKmu7Jwbdys/Hd7JGYn5eNf54Q+vvSSibkY15eNqpyxmC65Kri0wpzMa0wF8WqY3FGvlqYh/9lYblwXeMtsCRer3MiXKHE6DNTwalJzRSd/01adpv4BlyrPjFCckJJyLipTuyQnlBiNCVndkKJbPRjcrKM5qMRVs+WVJ80Ip7EEmncJK8Fz5aMGuNGFCOJELe4MDu+5QaaUVSsPoqgxuNtdmDciGLEStysTqUSWeX0z32iYNyIYoRxIyc4/XOfKBg3ohgJJ25O7yslP/4saTFuRDHCuFE88WdJi3EjihHGjeKJP0tajBtRjDBuFE/8WdJi3IhixI64NTY2Yv369ZY0NjY6/pzJOYybFuNGFCN2xG39+vUA0ixZsmSJ48+ZnMO4aTFuRDFiZ9yWLFliinEjxk2LcSOKkcQauWm/20x/vUmXCFwWzM7nZ/j1O4mFcdNi3IhixL64hf7zpz+1GcfNf/1FzYWS527FTumXgcaL2WWsovmWbqMvOY10X5IH46bFuBHFSGLETf4NAM6LVdziuV5iYdy0GDeiGJjuycHcvGwsGTca3xs9HCvGjIgqbmnr12NJYyMa29qQtn59UOA2w7hZuaix5sr6kqvcN6i/AWAWpMHUfZWM/FsF1FfTD9Jc/V74/jnpNwYYfc9bp7CfsuernZ5tqZVtT72vzaiRXd1f95roX0vttyXEHuOmxbgRWXRtUT4qCsbh3nGjsW7UcGwbNhjPDR6Alwdk4Y1+mfhzr56GX5r65149nRm5hfxeMNl3omm/L03zNSzqr8VRRcnw26hrm1XfB9ep++oYayM3s300W09C+lUy8u3J99XkNTH9nrvYY9y0GDcilRsL87AgLxsPjx6BhqGDcXRAFs5l9sFHGRlRXcz2sx49oh65yUQ9cjP9BuxQ30+melOXjtr0oyEr3/Nmy7d06/bFv77/Nu3ILtS+WfxeNtNvKI89xk2LcaOUdMOEPCzMzcaGUcPw3OABOJ/ZG1fS06MKWCjFE/IT75hbxHHr/hJPzZd5WvoGbdnfTZaNNG4mlFGVtefJuCUnxo1SwnRPDtaMGYHnBg9AR+9eMY2YkX8pGBf1yE087hZy5FbsCZ4eLz9bUjblZ/Dt27LodDSjpUMdHnFKz2DdqKclrQTUXHeUbYobpyUTCuNGrnRjYR4eHj0CLw/IinpK0S7fyhnjzEcBij366UL1CENzn9U3eQ+CJ2eIx7DEbUmnJZXRl/6EEoP7DPdRzeIxN93JLuL2Io2b9vF5QomzGDdyja97crBpxFCc6ZuJLx0O2Yc9M3CpT2+0Z/XFoYH9sX3o4IhHbm1tjZbwCiUJxsqZqjZi3LQYN0pqpYW52DRiaNymGj/smYFzmX1wdEAWnhkyEJtHDMXDo0fg7pzRuD1/LEoLc4P7ZteFk0NdeiuAF05OLDUt8b0SDOOmxbhR0pnoLcDysaNwvH8/20doXenp6OjdC8f798PTQwdh3ajhWJwzBtM9OWHvJ7/yJtUIlziL46jNW8y4iRg3ShqlhbnYNmwwPsmQf5YsXB9lZKA1S4nYmjEjcHv+WEz0Fti2v4wbxRN/lrQYN0p45eNz8cyQgeiK8lT9S31645khA/Fg9kjN9GGsMG4UT/xZ0mLcKGGVFubi0KD+EU89ftgzA88NHoDlY0fhhgl5cd9/xo3iiT9LWowbJZzJRfnYNmxwRCO1c5l9sGX4EMwuGOf482DcKJ74s6TFuFHCmOgtwMOjR4T9ubRPMnrg6aGDEiJoaowbxRN/lrQYN0oIC/KycalP77Ci1prVDw9mj7T1JBA7MW4UT/xZ0mLcyFHXFuXj6aGDLB9X+zItDUcHZOH2/LGO73so4cSNyC5O/9wnCsaNHLMgLxt/tPjh6670dBwa1B9fj+DzZk5h3MgJTv/cJwrGjeJuorcAzwwZaHm09vKArIg+RO00K3HzjM9F+c3THN9XIrdh3CiupntycD7T2rG185m9sTA32/F9jhTjRuQcxo3iZvnYUYbfVK32Yc8MPDx6hOP7Gy3Gjcg5jBvFXGAa0spo7dCg/o584DoWGDci5zBuFFOTi/Lxm359LY3W7h83yvH9tRPjRuQcxo1iZronx9LZkC8PyHLNaE2NcSNyDuNGMbEgLzvklUa60tOxbtRwx/c1Vhg3IucwbmS7B7NH4kqI60L+uVfPpPggdjQYNyLnMG5kqwezR4b8/Nrx/v0wuSjf8X2NNcaNyDmMG9nGStj2DR6YsNeCtBvjRuQcxo1ssTJE2L5MS8OGUcMc3894YtyInMO4UdTuHTfaNGxX0tNdd5q/FYwbkXMYN4rK7fljTU8euZKentSX0IoG40bkHMaNIlY+Ptf0dP9UDpu3mHEjchLjRhG5YUKe6W/CH4oAAA/cSURBVAe0Uz1s3mLGjchJjBtF5OUBWQxbCIwbkXMYNwrboyOHmZ4VuXxs6p08IsO4ETmHcaOwLMjLNj0zMtVO9zfDuBE5h3EjyyYX5ePDnsYnkDwzZKDj+5hIGDci5zBuZJnZd7Kd6ZuZMlcesYpxI3IO40aWmE1HfpLRA+Xjcx3fx0TDuBE5h3GjkCZ6C3CpT2/DURtPIJFj3Iicw7hRSOtGDTcM24FBAxzfv0TFuBE5h3EjUxO9Bfhzr56G05E3FrrvG7TtwrgROYdxI1MPjx5hOGpbO9q936JtB8aNyDmMGxkyG7Vd6tPb8f1LdIwbkXMYNzK0fOwonkQSBcaNyDmMGxk63r8fR21RsBK38YwbUUwwbinkhgnWT/64sTDP8HNtK7NHOv5ckoF53PJRWJiH8YWMG1EsMG4pYKK3AIcG9UdH716YXJRvaZ3NI4ZKw/ZZjx641uJjpDrGjcg5jJvLlRbm4kzfzGCcWrP6WVpPvY7avsG8fmQ49IFTxW0C40YUK4ybi1UUjJOe7bh92GDT9W6YYDwleXv+WNN1N40YigV5/C63gNBxy2PciGKAcXOpr3tycCU93fBsxzVjRhiuu2aM/LNtH/bMMFwnMPWJtDR8lJHBa036MW5EzmDcXOzwwP6GcetKTzccYe0bLL/6v9GltkoLc3Eus4/ujEqrx/fczMoZk4wbkf0YNxe7tihfFx01oxGW0UWSZWdJ3p4/1vA73l4ekOX4a+A0MW7i6I1xI4oNxs3lSgtzTb9g9HymdoR1bVG+4fG26Z4czWOvzB5pOvWJtDRsHjHU8dfASfK4FWimJhk3Ivsxbing9vyxphFSj7AW5mYbXiRZ/Zjbhg02jVpgapLH3iSBE6Ymy2+eRkRRuP6GSbrfO8YtRZhdSgtpadjmP4Nyw6hh0vuP91c+QjC5KN/wyiViMHnMTVHkNT72pr5SiceTgwJPDvILxiE/fxzy8scSkQUeyf9EM24pJNRoa2X2SDwzRH4yyfZhg1E+Ptf0S0vFUFI3o2Nv6rMmParAFRSMUyJHRCGNL2TcUt7LA7IMo3QlPd3wWwD2DR6IjzKMj90F1ucFleXMR2/CCG58Ljzjc7pDR0Smxku+V5JxSzGTi/JxPjP06Ctcf+nVM+QHvFOdPHD5OoHYEZE1EySHQBi3FFRamBtyFBaOM30zUSqZFiAicgrjlqLm5ZmfQWnVgUEDMNFb4PjzISJSY9xS2MrskRFH7cu0NDw6cpjjz4GISIZxS3FWPq8m+qxHD9w7brTj+05EZIRxI9MzKEV/7N0LFQXjHN9nIiIzjBtZPoPyVFbfsL7Nm4jIKYwbwVsc+gzKZ4YM5IkjRJQ0GDcKmpc3Fl3CGZRfpqXh4dHG3/1GRJSIGDfSUH9R6UcZGViYy2/VJqLkw7iRztNDB6Gjdy/dV9wQESULxo10JnoLeEV/IkpqjBsREbkO40ZERK7DuBERketEFbe7KucTEZFNnA6Cm3DkRkRErsO4ERGR6zBuRETkOoxbKqjeA9++pbrbq/f50LrxVuf3j4jIZlHF7ZqJhbhv+QPYte8gDr7Sjl37DuK+5Q/gmomFlh+j1rsKV703R7wPtd5VuFrU7T3vZMdfVJmyfZexdN9D8X/s6j3w+U7gsdsk9932Y7T6fNhb7fzrQ0Rkp6ji9sT2RuxqehGbt9Xj0c2bsXlbPXY1vYgntjdaDlw0cZvjXYqrRQtRmwAvpHf5YSztOIwyg/udidtS7PWFGJ1V74HPtwfVTr9+REQ2iipuDc83o67haZ2G55uxZOlyS48RTdyiHfXZKgHjVr3PB1/rjzHTdP1b8VirTzptSUSUrKKK2+6DzWh84UWd3QebsXnXLy09RuSBmoyGIsbN+LGVUZulKUeO3ojIZaKK24Hjr2PhfWt1Dhx/HduajsnX8y7UHCO7KguUuIz6ftn6QWFMUd5Wh0Udh1Gx8S0s7biMpW11uH75YeXfxUgFb/dTheT6wPoSizbOCi4XCJBm+bY6XC/sl+7xJMvo9qdDErewgmUewjkNF9DV1YmWWud/YImIrIgqbo2HjmHvi7/SaTx0DBt3PK9bXnaMTBy56ZcxGqFFOXK7rQ6LAvFQ/3vxQ5jXcRnzlivLKbFRx24WKtokMbEyctNESNmOLoCybakCp98f+cht5sYTFqYkA5SpSaNjc4wbESWbqOJW39SM7c806dQ3NWPxfeIxt5vRUrQKLV7tY2jjpgRLd8ajd6FkVGZH3N5CxW2eYOiUoKnjpsRFHSBvsUcesgimJTW3afbBYD+F8Jo9tp1xIyJKNlHFbeO23di57yVs3rEbP6mrx+Ydyt83btstOVtyNt4LGTclgNamHOMRN+Xf5dOOsYhbIGJqqv0xCCDjRkSkFfXn3O5Z9gC2Nx5C0+F2bG88hHuWGX3OzcrITb6MXPziphtNySTYyM3OY25ERMkmrlcoUT5wPRtzij0Ixqko1DE3I/GIm/wYl/HjGYcwZNyKTY65icsEj8H575edUGLj2ZI85kZEySbOl9/STju+552sxEwIlBK4EGdUxilu3mKDMyIlp/WLy8nOllQvb3ib6Xa0U6WLNs5SthvDz7kxbkSUbHhtSVfjFUqIKDUxbm5XvQc+o+lJXluSiFyKcUsBMzee4LcCEFFKYdyIiMh1GDciInIdxo2IiFyHcSMiItdh3IiIyHUYNzvUNqOrqzOIH3YmInIW42arFWhxYdxuWj0d65pnYN2mSfJlKkuV+/1Wri52fJ+JKLUxbrZyW9wm4d7mGVi5egruNYpbZSnWNU/Hglv8f79lClYycETkMMbNVu6K24xNM3BvpQeByOnjVowFu/UhU0Z6pZiRAM+BiFJT6sZt7lZ0yEJU24yurgvYOVe8rfuYWlfHVv83G4iM41bT0omulhUhb9NtS7zfEQZxu2UKVqpHbcHbZmhHc0REcZa6cSv2x0UTqlnY2SEEZe5WdGgCowRMHp3o4qZcfb8ZNWb7E5JysWSfjOUvLxUZxE2YkpyxyR+1SiVwyqiPiCj+UjpuulHa3K3oEEdtEtIRV7EH0cVNCVlHwyzJPqqD54QQcfPHLHj/LYwbETkrteMmBGVOwwXJlKN/9NTVaWG6MJq4+UeEUgkaN6MpSNl0JRFRHKV43DyqkZEsTP6wCcGLzcjNrpNR4jgtGTybUnJCye4puMnp/7ZElLIYt0BUWpqNR23qKAVO+AgzbuLxtJoW/QhQf8wtURjFLXBmpP6jAJySJCInMW7FgahIjncVe4JnVarPlKxpuKCJUjBUplOXwrRjywplu0IkA/uSCGdMBj+8LRJGZeJyDBsROY1xIyIi12HciIjIdRg3IiJyHcaNiIhcJ25xKy8roThoP3UW7afOOr4fRHaQfqRF4PQ+2snpILgJ4+YyjBu5Sah4MW7EuKUIxo3chHEjxi1V1TTBt/+h4N8ZN3KTQLxq9/vQvmWu4f1u4XQQ3IRxs9OUKlwtWoX3S8ris72aJvh8bdhyV/dtYtzWHliDD/7Q7UxdufYxapfIb7eTfxsBR2oT4L9VvJ57mO5+5H5cfmUlLr9yP35xRwy2sWyx//EVLcti+Xwq0OLfzsVHQvxOGPy3CMbrrifQ7vNhf02J/H6XcDoIbsK42cmOuE2pwtWiKmwIuexD2O/T/9+sOm5VddX44A9LsNbscfxvKmJwlCjK1117YA0+ODUfVWE/v5k4wrgZW7Y4dlHTUcIT27j53TEPF0Nty+DnUBOvmib4fE2oNbrfBZwOgpswbonGYtxq9/vga38ClcLt6ritPbAGHxyYab49gzcV5fZq7KgU14kmUAkWtwRz9yP34/Leebg7LtuLY9zKyvCLvSFGb1biVjYXW9p9mml4xo0Yt2RhKW7KqE2coikvU8etHDtOWYhb5XycMYmYfBozxGjQEONmJqXjZvBzqIuXMHpj3Ihxk9hwnTKFuOG6VbhaFCCEZUoVrk68A/eUVeBkUfdyJ6cIyxjdZ3Fb95Qs0zyGmm6aUzI9E9C+6RmMKXxCc4yrW3hRkk0/SkeDwjE14ylL47jJHtfStkLFW8biMUBlWjf06xdYLtpoG8bNaFpPNo0pHFMzjqVx3NZtWYnLWypC3qbblnh/kIW4GdDHS/s/dowbMW4SwdBcF/ilLMPeieq/l6jCtQx7pyq3KSGSja6UABrFTbstZVlduCyM3Cq3tEmnJMvLIhi5mdFNTUriVDkfZzTbUJaRbze6uOmPIUb7HE1GkmGMUO2KmzQg6vs0oVKCoVn+jnm4qFnff0KH9DGji5ty4stirDPbH9P9t0YfL2VqMnCsmXEjxk1iw3VCyMpK9HGZUqUJW3lZCcqn3oH3xdvKlDcM07gJ27K0fYm4xU2cmrT4hm98rC+auCnPJ27TpEbHImNg3RYLZy6Ko7Q75uGihZNPjIMZTdwMRmLLFgvBE/hHoMYjPD3GjRi3CBjHRRUuy2cvlsB9cdNOTcqj5d+OOAVqe9z8I0Ibplut7E95WYn/OJDJxyhsZT7yEYMin8L0P8YrKy1MF0YTt+5T/PXkcYv0eCLjRoxbBKyP3BIrbqbH3GyOW/fUpCwE/m1YOS5XVgI74mbvSCqMx/SHLpaBCxmA4MhIFiZ/2IT1YzNyC/dkFB5zs8rpILgJ43ad9hiF7jhYvOM29Q68b/AYRr/garbHLTA1eUr2mTnJNgIna4QZN/F4WvDD56bH3KIVTjANpkXL4nBCiernq+WVlWjZsth41KaOUuCEjzDjJh5PC0ybmh9zM2Nj3Hi2JDFuoWnPXDQ409FC3GSPoz15JIy4lenPnJR9KDz059zsips8NEHC1N0Hp+ZjbV21ZlnxKinyqUth2vHATCUawjb1ZzCG/xyt7I9sO0ajtvjFrfsKJtJQBI5pqc6UXPfI/ZooBUNlOnUpTDtuqVC2K0Sy+2oqoaZA7YobP+dGjJslRnFJDqGvUELJJb6fc4snm+LGK5QQ42ZNcsetxP/Lrp2eZNySWFwvvxVHVi6/ZYDXliTGLQJJH7cy/5mT/FYA14j5hZPjKowLJxvgtwIQ40YoL2PcyF34TdyU8HEjIiKKF8aNiIhch3EjIiLXYdyIiMh1GDciInIdxo2IiFyHcSMiItdh3IiIyHUYNyIich3GjYiIXIdxIyIi12HciIjIdRg3IiJyHcaNiIhch3EjIiLXYdyIiMh1GDciInIdxo2IiFyHcSMiItdh3IiIyHUYNyIich3GjYiIXIdxIyIi12HciIjIdRg3IiJyHcaNiIhch3EjIiLXYdyIiMh1GDciInIdxo2IiFyHcSMiItdh3IiIyHUYNyIich3GjYiIXIdxIyIi12HciIjIdRg3IiJyHcaNiIhch3EjIiLXYdyIiMh1GDciInIdxo2IiFyHcSMiItdh3IiIyHUYNyIich3GjYiIXOf/A4kNlI9HjOjXAAAAAElFTkSuQmCC" /></span><br /></p><p><span class="emoji"></span></p><p><span class="emoji">Note that even if there's no formatting in the string, with this it's possible to write some string as: <b>"Value is {value}"</b> and then use the quick fix just to add the <b>"f"</b> to the front of the string (which is quite handy if you weren't initially planning to create it as an f-string).</span></p><ul style="text-align: left;"><li><span class="emoji">When starting the <b>interactive console</b>, it's now possible to save how the interactive console should be initialized (see image below):</span></li></ul><p style="text-align: center;"><span class="emoji"><img alt="" src="data:image/png;base64,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" /></span></p><p><span class="emoji"></span></p><p><span class="emoji">Note that it's also possible to change those settings in the <b>interactive console preferences</b> if you want to change them after the initial selection (<b>hint</b>: after the interactive console is created it's possible to use <b>F2</b> to send a line from the editor for execution to the interactive console for notebook-like evaluation).</span></p><p><span class="emoji">Besides this there are many other improvements, such as improved conda activation, rerunning pytest parametrized tests from the PyUnit view, MyPy integration improvements, support for <b>from __future__ import annotations</b> in code analysis and debugger improvements, among many others.. see: <a href="https://pydev.org">https://pydev.org</a> for more details.<br /></span></p><p><span class="emoji">Enjoy!<br /></span></p><p><span class="emoji"><br /></span></p><p><span class="emoji"><br /></span></p>Fabio Zadroznyhttp://www.blogger.com/profile/04202246218394712738noreply@blogger.com7tag:blogger.com,1999:blog-8550962.post-80721153431149287732020-09-15T09:16:00.002-07:002020-09-15T09:18:12.982-07:00PyDev 8.0 released (17 years of PyDev, typing support, MyPy and Debugger)<p>Wow, PyDev is turning 8.0... the 8.0 version probably doesn't do much justice as it's actually being developed for 17 years already! <span class="emoji">😊</span></p><p>I'm actually pretty happy on how things are working around it right now... Some interesting points:<br /></p><ul style="text-align: left;"><li>Many users now support PyDev through <a href="https://www.patreon.com/fabioz" target="_blank">Patreon</a> or <a href="https://pydev.org/about.html" target="_blank">PayPal</a> -- so, it's been a while since I spent time to do a dedicated crowdfunding campaign (which usually demands quite a bit of time). That funding also allows having additional help (it's what currently sponsors the work of <a href="https://github.com/oluiscabral" target="_blank">Luis Cabral</a> in PyDev).</li><li>It has a good amount of users (although it doesn't have as much users as it did in the past as there are many good Python IDEs available in the Python ecosystem now) -- I'm actually quite happy with this as for
some time it seems like Eclipse had such a big market share that users
that didn't like it had to bear with it, so, I'm pretty glad that there
are alternatives now, even if it means its market share isn't as big as
at was -- so, although this may mean less users it also means happier users.</li></ul><div style="margin-left: 40px; text-align: left;">sidenote: it's hard to actually get the real usage stats because telemetry is not baked into PyDev -- there are individual file download counts in <a href="https://bintray.com/fabioz/pydev/pydev#statistics" target="_blank">Bintray</a> (which generously hosts the PyDev update site) and <a href="https://sourceforge.net/projects/pydev/files/pydev/stats/timeline?dates=2020-08-01%20to%202020-08-31&period=daily" target="_blank">Sourceforge</a> (which summed currently put it around 32k downloads/month)... anyways, I'm always a bit skeptical of download stats, so, I currently define success based on the number of <a href="https://www.brainwy.com/supporters/PyDev/" target="_blank">supporters</a> in <a href="https://www.patreon.com/fabioz" target="_blank">Patreon</a>/<a href="https://pydev.org/about.html" target="_blank">PayPal</a> and <a href="https://www.liclipse.com/" target="_blank">LiClipse licenses</a> <span class="emoji">(all of which are at an all time high</span> <span class="emoji">😊) </span><span class="emoji">than the raw number of downloads.</span></div><div style="margin-left: 40px; text-align: left;"><span class="emoji"> </span></div><div style="margin-left: 40px; text-align: left;"><span class="emoji">sidenote 2: I've never really lived from the PyDev income (I worked many years doing scientific computing in Python and nowadays I'm onto consulting) -- at this point it'd probably be in the Ramen profitable stage, but there's an interesting dichotomy in that if I lived only from it I wouldn't be able to dogfood it as much as I do now as it's a Python IDE done in Java (so, I'm happy in having it as a side hustle), but it's good that it got to a point where I can have additional help to do it (my time is definitely very limited nowadays, compared to 17 years ago when I started working on it).<br /></span></div><ul style="text-align: left;"><li>Microsoft is currently sponsoring my work on the <a href="https://github.com/fabioz/PyDev.Debugger/" target="_blank">pydevd</a> debugger (as it's also used in the <a href="https://visualstudio.microsoft.com/vs/features/python/">Python in Visual Studio</a> and the <a href="https://marketplace.visualstudio.com/items?itemName=ms-python.python">Python Extension for Visual Studio Code</a>), so, this actually translates into a high quality debugger for the whole Python ecosystem!<br /></li></ul><p>Ok, on to news on the PyDev 8.0 release... <br /></p><p>As with the previous release, this release keeps on improving the support for type hinting and MyPy.</p><p>On the MyPy front, besides showing an error it will also show the related notes for a message on the tooltip (which would previously be available only in the output view) and MyPy processes are no longer launched in parallel when using the same cache folder (as this could end up making MyPy write wrong caches which required the cache folder to be manually erased).<br /></p><p>In the type inference front there are multiple improvements to take advantage of type hints (such as support for Optional[] in code completion, handle types given as string and following type hints when presenting an option to create a new method in a class).</p><p></p><p>The debugger had a critical fix on the frame-evaluation mode (the mode which works by adding programmatic breakpoints by manipulating bytecode) which could make it skip breakpoints or even change the behavior of a program in extreme cases.<br /></p><p></p><p>Besides this, other niceties such as code-completion inside f-strings are now available and this release had many other fixes (see: <a href="https://www.pydev.org">https://www.pydev.org</a> for more details).</p><p> So, thank you to all PyDev users and here's to the next 17 years, hope you enjoy using it as much as I enjoy making it!<br /></p><h1><span class="emoji">🥂</span></h1>Fabio Zadroznyhttp://www.blogger.com/profile/04202246218394712738noreply@blogger.com0tag:blogger.com,1999:blog-8550962.post-66138672718875935142020-08-02T10:43:00.001-07:002020-08-02T10:43:29.951-07:00PyDev 7.7.0 released (mypy integration improvements, namespace packages)This release brings multiple improvements for dealing with type hints as well as improvements in the <b><a href="http://mypy-lang.org/">Mypy</a></b> integration in PyDev:<br />
<br />
The <b>MYPYPATH</b> can now be set automatically to the source folders set on PyDev and the <b>--follow-imports</b> flag is set to <b>silent</b> by default (this flag is required because only one file is analyzed at a time in PyDev as failing to do so would end up showing errors for other files).<br />
<br />
<img alt="" height="640" src="data:image/png;base64,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" width="449" /> <br />
<br />
Personally, I think that with Python 3.8 it's finally possible to actually use Python type hints properly (due to the <b>typing.Protocol</b> -- a.k.a Duck typing -- support), so, more improvements are expected in that front on PyDev itself.<br />
<br />
This release also brings many other improvements, such as support for pip-installed namespace packages, debugger fixes, support for parsing with the latest version of Cython and support for the latest PyTest.<br />
<br />
There are actually many other minor improvements and bug-fixes in this release too. Check the release notes at <a href="http://www.pydev.org/">http://www.pydev.org/</a> for more details!<br />
<br />
<b>Acknowledgements</b><br />
<br />
Thanks to <a href="https://github.com/oluiscabral">Luis Cabral</a>, who is now helping in the project for doing many of those improvements (and to the Patrons at <a href="https://www.patreon.com/fabioz">https://www.patreon.com/fabioz</a> which enabled it to happen).<br />
<br />
Thanks for Microsoft for sponsoring the debugger improvements, which are also available in <a href="https://visualstudio.microsoft.com/vs/features/python/">Python in Visual Studio</a> and the <a href="https://marketplace.visualstudio.com/items?itemName=ms-python.python">Python Extension for Visual Studio Code</a>.<br />
<br />
Enjoy!<br />
<br />
--<br />
FabioFabio Zadroznyhttp://www.blogger.com/profile/04202246218394712738noreply@blogger.com0tag:blogger.com,1999:blog-8550962.post-14815532391048418062020-06-11T05:13:00.000-07:002020-06-11T05:13:07.758-07:00PyDev 7.6.0 (Python 3.8 parsing fixes and debugger improvements)<b>PyDev 7.6.0</b> is now available for download.<br />
<br />
This release brings multiple fixes to parsing the <b>Python 3.8 grammar</b> (in particular, dealing with f-strings and iterable unpacking had some corner cases that weren't well supported).<br />
<br />
Also, the debugger had a number of improvements, such as:<br />
<ul>
<li>Grouping variables which were previously hidden -- note that they can be hidden/shown when debugging from the variables view dropdown menu as shown in the screen below:</li>
</ul>
<img alt="" height="208" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA9EAAAE+CAYAAACKvZMNAAAgAElEQVR4nOy9bZgU1bn32+fTOTvXOWfn6Mm7O+qIdEM0iuO0COr4DsyAMoMBiSA0xMEBhBGdiZroZD8PcRolCuNWZ2IeJmFAAjZB7B22HWXGtwFNZtsmkx2mByLonPhsX7KNHTVjfJL7fKiu6rVWraqu6q6u6qr+13X9LuiuqlWrVtV016/ve60VCkdqCAAAAAAAAAAAAIUJeV0BAAAAAAAAAADAL0CiAQAAAAAAAAAAi0CiAQCgRL55wzc4vK4PAAAAAAAoH5pEf/vb3wZlAA/UAAQfI4m+7Z97gcvgMxcAAAAA5SYUjtTQ7bffBsoIHuoACDYyiW67+1+AR+AzFwAAgNd8Yf5dZcPrcwM5iW5rWw/KCB7oAAg2Molee+cW4BH4zAUAAOA1X5h/F5160TWOA4muDELhSA3dcstaUEbwQAdAsJFJdGvH/cAj8JkLAADAayDRwSYUjtRQ6+pWUEbwQAdAsJFJdMtt3wcegc9cAAAAXgOJDjahcKSGWlbdBMoIHugACDYyiV65/nvAI/CZCwAAoBTq62fSkiWLSyqjWIk+7eL5vpLoSWeeSl8/52yKRusoHJ7keX3cIhSO1NDKlSsMWdPZQE/9+E5a09lAK7Ye5F7fdeBO032BAh7oAAg2MolevuY7wCPwmVthTD2Tvn5pM507ewVNrZ1usu0ZFPnaFO/rCwCoambPvpK2b99O27Zto6+dNZnCkRq66urLqLe3h666+jLL5RQj0TX1zdS46kFTkTaS6Mf3vWQZJ9ur9vzz6O233yYioo6ODqo546ueX0M3CIUjNbRs2Y2G3HXgTvr007/Rp5/+jf7+l7/Q3/72d/rzn/9Kf/7zXzWpNtsf3IgHOgAs0traaolKK1sm0UtWdQCPMP3MrZ1BU+Z8i86afyt9vfFbFD5nmuf3faCZeiadc9US+vqlzTT1/Jl0zmXyazPl61+naXNW0nlz19BZ0y/3vt4AgKrkvNqv06ZNXbT5B/fTjh076ILptUUJdDhSnERftuR7dOOdT9D0b9xWlET/+x+JXnzbHKcl+uqrryJ1eemll6impjSJ9suzYCgcqaElS75pyJrOBk2iRZ768Z30l/37aE1ng2kZdvnO/mM08cZe+o6DZRYL26B21rFAogGwRmtrKxVaSvngLFfZMolevHKDjmuW3ErNN+rfX7xyA1279Faat+RW6Tod//xv9Mab/0Z3iO8/NkwTwz+xVMYd/3qcJmRlCNu88a/3215XCuznqp11LEafuZPPv4jO/UY73f7wk/SjX/yaWu//KU2dv6E4kb47RRMTWY1jfc2O/R0s7Pud4+VNHPshLXT9b/oMOueyb+TE+QwKR86gc2ev0G0X+doUmta4ir42/VKKnD2VzrnyhoLt7c35VFLbAgDKwapVN9E550ylq2ddTjt27KD5TfOKEuhwxL5ET7l6KS29YzfdeOcT9M32nTTp0m/Q9v0v04Pbn6fvdv/CkkS/+DbR/Y88YRkn2mzq1yLU09NDIyMjdMklF9OkM08tqTy/PAuGwpEaWrx4kSFP/ViJRP/hnU/o3155lwbGjtOr/9//pIlP/kYv/PoFWtPZoGFWTsVwR4LeeCNBd1jcnm3s1tbWgu/LgEQDYI1yf3C6GYleuPwWjgU33kLTr11P1y27Rbdu4fJbaMHSWyh6zXpacKN8PU8X7XvzOO27h3//X36VpZd7rexvjW8nj9MbyS7b60pB/Gwt9L4Mo8/cqde20ZpH/pUe+MXvNBZ89zEKX/FN+9f97hRNDN6Re30HDUz8jvoWOfN34LREW2bRD+mYY0IoCrTyfmQK318u8rUpdO7sFXTWhVdo7339susKtDcAADjPzIsuoIMHD9LQoSEaGBigHTt20OOPP04DAwM0dGjIlERCL6SFJPrHDzbR7oeb6OtXNtKpF11D81q76cY7n9C4akWX7Ui0KtFWItJOSXQ4UkNnnHEqhcOT6IxJpQl0OOKfZ8FQOFJDCxdeZ4gaiV55b4bOPLCMzn+2lc575mY695lVdODNF+nTT/9Gv/z1L2lNZ4NpORXDt5+gN954gr5tcXvxQqqNK75nVgYkGgBrlDuFp1wfyjKJXrDkZo5LF6ylqxeuoQVLbqYrr1tDly5YSwuW3Ewzrl1HDYtWa+9fnnu/ELfvf51O7P/vzHs/opcnXqZuC/taRX8Ma+tKwepnrlkZhpHoazbQt7a9QKu2H9L45taf09Rr19m/7oLU3T2YpYG7nfk7CIJEn3PZN+iC+avpwuvW0bmXzqWzZlxF5169lM6dHaOvXzyPaq9aQBcuWEd1166ls2dcbbu9AQCgHLz88mH64IMP6LXXXqMdO3bQkSNH6IMPPjDlvffeo8HBAV1ZhSR6//Z19Jc//Z729VxLZ+dE+tSLrqEb73yiqIHFWIl+8W2iEx8Svf5nOb979yPHJHrSmafRtPPOpYsumklTpkwuuTy/PAuGwpEaWrBgviErth6kTz/9G133z/9O4VfmaancC7c/QWe9soA+/fRv9MZvFIk2LKf7xXwK1ok9dPuC+XT7z47SiZ89QD87wb+/QFvXxvyf2W7iKP3s9vkF1y1YMJ+6X86nfp34WRstuH0PnWDSwV7uNj5vFrMGb21tLbg/JBoA73FboucvXslRN28dXXP9t7TXM65dS5c0rab65tXae42LvkXTr7mF5i36Fl0w7xYOsbz5d+ynE2/spw3q64dfpolXepR/tc+539PeO5T1G578PZ14cj8dnsjSxCs9uded+X0N9+mhvW8YrevU6rPlFebzVlYuW9cCFPrMLbS/4WfuvHV0zfcTtOxHL2pc9e3/QVPmrLR/3XWR6BTdnVunSPAPaWAiq21z96Ak9ZtLUc5HslmJXtj3O22d8v4d1HdMv494DDbFWCyPK0PdbtEP6Rjz/Thwt1A/m3J9wdwV1L71p5T63Vu06ns9NO3SJoqcfTZNOWcaRRuWMut66ZyL59hs7xqm3fl2mxi8w7Sdiro26rlL3hN/8DC/BpJ2NzoWAMATDh06ROPj47Rnzx7asWMHvffee/Txxx/Txx9/TB9++KH2f5YPPviADh58VleWKNE/um8ux/NP3k1//+v79OG7v6Wf/ctcOvuKRp1EH1p8s4ZdiT7+IdH7f5XzuxPjjkn0+eefRx988AEREf3zP/8znV7zT55fRyMcl+hrr51riBqJntP3Ywofmq9J9M7Uf9LUw82cRMvLWEeJ42OUuJV//9bEGE1MqO+vo8TxLB1+ML/ueGKdZLvc6+M/pVsLrHvwcL48rg63/pSO57YxO28RWaO3trZa2hcSDYD3uC3R876xlKNu3i3c66sXrKDaueuo8bpl/HZz1+n2lXMXJU4co0SH8vrBl7N06CFhm4cO0cTLD9O8byyltn3HaGLiED2YW9e27xgd33eXvlzdPvljtO07RhMn9lGbsD9/bLVefP3sYvSZa2Vfw8/c6VfStMV30bIHn6Tbf/oyLfz+LpradDuFz4sq6+0MOmbSJ1oR37xU81HqZuo7Jkn9ZiRRE7O7UzoRE4VQXX/3YJaTTFUoufJ0ZTRT3zGmblwk2qCeFqmbv57+/b0JevMvRGMn3qKLrrvF0jqr7a2dq9puTN3N2snatZGdu7w92LYtdA3k7V5aOwMAnOXZZ5+lJ554gkZGRmjHjh305ptv0kcffURvvvkmvf322/TRRx/p+NOf/kTPPvuMrixRov/+0euG/NfYk/Tj+GWaRKu8vnQN/XHHXnp96Rr7Ev0R0Qefyhl9wzmJvvLKK7Tv6RdffJFqzig9pbtcOC7RjXPnGKL2ib5k7/dpyvPX07P//h5tP/A2XbJ5N13+ys2cRBuV8cChLE1MPE8PMO+te2KMjj+xRvra6P8K99GhXFnG69bQE8ez/BfuRJYOPTiHGtfvouPHd9E6k3OWYfRAZ2VfSDQA3uO2RDc0Xc9RO3cdNTQtzr1eTNOvWU2XXLuSZl6zSttm9vxvUnTuGpo9/5t04bxWDrG8hqbr6Za9x+j43g5qaOqmoYmX6IGm66mhqYP2nGA++04k6BZuW3Ff6/uwx8mvE/bNMbT1enrgcJYmtHrZw+gz18q+pp+5F15JX7t2PU2+ZgNNaVhF4doZFI4UMeiYJJ2bj/aqUt3MRESFSK+4jo1uHtMPWKVP81Yj4DIRy0fH9ZHoZnmZQjq3ElXNC6cdps9dTj94PEXvffAh/beHHqfaK5osrTPEJJ1bqac8km/WFmbXRnbusvfy5Vm/BmIdS2lnAIBzXHX1ZfT444/TiRMn6J133qEdO3ZQKpWiX/3qVzQ0NEQffvihlP/6r/+iX/wipStPlOgdP2jkOLT/Tvr7+6/Qp+88T//au5AubJiji0S/vnQNHVp8c1ES/b9dfZchYw5K9JSpk2njxv9OL7zwAl144XQ6c/Jpnl9LIxyX6NlzrjJEjURf8bNNFHn+ejrvl9dTdChGF/1qBT37/iFOos3KmT0nTkMTWZo4vpPWzrmK1u7J0PE9rdp69rXR//PlPEebTde10p7jGdpzi6Qet+yk47k6mNc3T6HUwkL7Q6IB8B63JXrWvOs4ps9bRZfP+ybNmncdXTRvJV08L0az5l1HF85dRZfOu5FmzbuOLp13I82c+y3dvoa0PUHHjz9Bax98iY4nbqdZ826nPcezNPSgsH7edbQ2cSy3jbIu/9r6PrPmbaGhiZdos27/Y7SnzaieW3Kf/UqZVs6r0Gduof2L+cy1PeiYKHVM1FgvarJIo3EUWImc/o6OCenabkt0vhz7acaRs8+mGfOW0/Tm9XTB7Ou5+Z/N1hliItGyyLN1iTaLAsvOnX/PCYkupZ0BAM7R29tDzzzzDGWzWcpms/Tcc8/Rrl276Je//CV98MEH2vsi7733HqVST+vKK9QnOvHIYvpf/5mk/Y800fSG2dI+0Rdc2qRhu0/0R0Qf/i+iY1k9Tkp0OFJDp9f8E51e81U688zKFehwpAwSfdXVlxui9om+ct99NPXgjdKprlSJNitHoYV2H8/Q7jWX0+o9GTq+p0Vbx74W/z8x8Rzdz2w38dK9Bdfd/1JW+z/Hmh10/PgOWl2wrgpWB7kxKwMSDYD3uC3RVzZcy1HfuJguaLyZrmyYr1t3ZcO1dEVDE0XnrqbLGq6TrpeznnYfP0rHjx+l3bdcS1c2PEAvTaj/v5Za9xylieO7qTX3/+N71mv75l+b7zMx8QLdx+wzMfSAsP+1dN9QVnvfrJ7qMcyw+plrVkYxn7m2Bx2zHInWp/kqSPrzimK26Id0TOhrPSG+Zvv1WkzntifRNVQRKcdGEm2Yzi1vJ2vXptC559+zk85tLtEV0s4AVDkvvPBCwYHERN599136t387oCurkET3ff9i2r35Kpo+Zzb3vlN9ot/4iOjjv8k59qZzEj3pzNOoru58mj1nNk39WsTza2iG4xJ9+RX1hqiR6Bn999O5T603lWh5GTfRT5nU6uM/vYkuv6Kebv5pRvu/+Fr//x30kppqdXwH3cztI18nHndiYpA2Ce+/dJ/xeauI06oUel8GJBoA73F7iqvLrm7QcUHDCrp41jek6y6acz3NnPNN6Tozbt4zRhPHd9HN7Gv18/al5+l4bt3Ne8bo+J613H7qa/N9djGfsfxx8uWtFT5vn6dNwnvssc0QP1sLvS+jqM9cu4OOGfXRjcgESUwbzkcntT7VgylOAsUBrgbuFgbF0kUt5anhYn3MZS5fxsDdfHlOjBZ+6tn1dMbXaum0s2dq731p2jc0TPcX23siRXcv+iEXrVcl1qydrF0b2bnL28M0PdzkuHwE29l2BgAUz3PPPUfvv/8+DQwM0MDAgOn/jx07RseOHaOxsTH69a9/rSurkERPvayRIpc26t4vpU/04/te0iT6zY+JJv4u5/Vx5yQ6Gq2jjz/+mIiINv9gM512+imeX0cjHJ/i6pL6mYaofaLfe/vPdPToH00l2qycYrlpV4Ze37XC9jqnYBvUzjoWSDQAwUYm0RdffpWEqw3eByrs56qddSxFfeYWGnSsAvBs6iuHmByZTF86dwHaCQBQsQwODtIf//hH2r9/P+3fv9/0/2NjYzQ2Nka//e1vaePG/6Yrq5BEW8FOn2gVVqL/+nc5JxyU6CuuuFz7kfu5556j02u+6vl1dINQOKJMLm7Ems4GeuHXL5jSt1+RaLNyimXl4xl6/fHlttdVEpBoAIKNTKJnXHIp8IiiP3MNBh2rFPwuhyVFoquonQAA3nHw4EF69913aXx8nMbHx03/bybQ4YgzEm2nT7TK/Y88YRkn2iwy5Uy69dY22rt3L51fdz6dOfl0z6+jG4TCkRqaPv18Q1ZsPUhrOhtoTWcDtc0O05rOBmpeX8u9VjErp1hW7Bil3++40fa6SgISDUCwkUn0BTNmAo8I6mcu5BDtBAAoLwMDA/Tss89awkygwxFnJFpGIYn2gtNr/olOOeWLNDlcHQIdjuQk+vy6c0EZCeoDHQBAQSbR518QBR6Bz1wAAABeU00SXY2EwpEamnbe2aCM4IEOgGAjk+hp508DHoHPXAAAAF7zhfl3lQ2vzw3kJPrsr08BZQQPdAAEG5lEn33uWcAj8JkLAAAAgHISCkdqaOrXJoMyggc6AIKNTKKnnhUGHoHPXOB3KBQCAABQoQwPDysSDcqL+IANAAgOsr9xrz9zqh2v7wkASsXrB0QAAADGZLNZSDQAIJjU/uB/Um0vlY1pm9/SjiU+AIcjNYQFS7Usf/jDH7yuQvCWCnhIBAAAIAcSDQAILLW9RDNWdtFZ191ZFmp7STsWJBpLNS+Q6DIs7AMbFixYfLUMDw9TNpulbDZLf/rTn1xFPS5wHkg0AKAqgERjweLOAokuwwKJxoLFtwskOph4LtFTpk6im1avpcf6E5T4+fP0WH+Cblq9lqZMnWS7rI7wBvpkskIq7P1Du33W04LMfrq4jMdo7R+l7a1Wtm2j1ESS2gtt19xNmYkspTrK3DYNG2lgYCPN8fwaAb8CicaCxZ0FEl2GBRKNBYtvF0h0MHFJohupJ5OlCUG2pkydRPc/3EeP7dxHmx96hL6/eTNtfugRemznPrr/4b6iRDocmUa9nkv0elqQeZ9aNF6j2Q1W9ytWohtp9uD7tGC18TZzug7SaH+LxfK8kGjlPjEqq7V/1Eb9AeCBRGPB4s4CiS7DAonGgsW3CyQ6mLgg0W2Umhihnma9IC1rWU29u5K0tfdHOnp3JWlZy+oijlcpEp0X59qu16hlcCvVWtqvTBLdsJEGRn9CrbaumwWJdhRziQ5HWmj76EG619IPEgDwQKKxYHFngUSXYYFEY8Hi2wUSHUxcTOfWC9Lmx3bTtkSS+p7Yp2NbIkmbH9stLYtN2/5k8mLq4NbLJZrfR1w/l8aYdWPhaRbXGcFLdLhhKy1h5bhhKy1hItV58c1J9Or92rolXY35cg32q+16jYl6y6Pfrf2jNNB1tb6uuUjyxISYKZCT6I6kti7Tq9Yln1mg38+sTIX2FLuvIupNvSNceQoj1NPM72sYTc/Vs+xp5cC3QKKxYHFngUSXYYFEY8Hi2wUSHUw8leiHdj5Ne555kRbf9B0de555kR7a+bSunI7wBvokXG9yHCuR6Lk0xsh3R9h4e7N1xvASfXH/+9TSv15Z17CVlugEW32dSwOXbWu6n9K+xpFogwhuczdlWFHlXrdRaiJLE6k2+baG11WMYKuZCMrr9hRTpoV7RIdRRB0SDQpQuRJ9gFpCIQq1HJC8P4O2HC3nVzsWLM4vZhJ9oCVEM8Sb+kCL5P7XVuLvgAgSjQWLj5fKkugELQ/VUVfaewn1O55KdNeju6hv79O0fd8BHX17n6auR3cJZdRTanIL9Zoex0Ciw4u5SDQbwW4KtyjvSeTcbJ0xQp9oJpW7tuu1vCTnuLhflV8xnTsvxub78dvq69NC2yXi2dQ7ohPa9pR6jUQZNhJc4X0hCs1HlHmhtnKPyM8FKd3APpUt0TNoxowQ8R4BecDiz8U0Ei0R5gMt4r3PrcXfAREkGgsWHy+Q6Eo6vjVeffVVWrRoEb311luVKdFLb1pNj+xM0sM/3qnjkZ1JWnqT2Ce6WIkW9+Mj0RqqaMuE2WydDiYSnUvBVtOyAy/RHUmayHRTk7RdINHAOypdorcc2EIzZmyho+L71S4PWHy3mEr00S00I9RCeWc+QC3ca3HB3wERQaKxYPHxAomupONb56677jIVaU8lesrUSdT10Dbq6X+SNj+6jeJbH6HNjyqvux7aJhmdWxFk++ncc2mMkWilf7REorVti1nHIhlYTJXjguncjESv3m9xP4WL+4U+1BrFpnMzEt2R1Povm19XJQ1cLsK5vtSG6dyKxOf7XktAOjcokoqX6KNiqisvDwdaQhQK5dDCdoyA59a1HCA6umWGti2XOns0v13IVFywYCl+Me8TfZS2sFkXTGTa9B4/Kv5f8jrI9zckGgsW3y5+kejEcuYzeHmCstk0ddWFaHmC2S6xnEJ1XZTOZimb7qK6UH6f/HbiMdTXCVoeEo/hvSwXK9Iujc4tpvfmZWfK1Em04ua19HDfXtq5/3l6uG8vrbjZbJ7onEjr0rLF9/kBxNiBxcbCcyllsl9ewM3WmSEMLJZL79YElxk4rEWyneHUWIb75eAGHrM4sBgzcBg/kJd43YwiyJLosZjSzUWmxUHJBDHn9sXAYsA5/CDR5sJgtH2IQmoE+0ALL84HWhiZEMo70KLvm4oFiwNLoYHFjm6Zod178lRuq38TJuuCdn9DorFg8e3iF4mWbpNYzsluYrkqy4oQa+Kc7qI6rVwjifZXJFplxYoVtG7dOi8kGlQEtqe4soqVFGynQCo3KB5/SDQxkTnJ+9ovuBYjc+xrLkonRvuwYHFuKTg691G168JR2jLDzj1exfc3JBoLFt8uvpHoxHLmM5SV3uWUUPflotDq+zLBDoZE79mzhy655BJ69dVXIdHVjGEUtxQM07ydp7V/1Pn6g6rBNxKtpbuKgqBGlFnxsCvRAUtxxVKRS+EprnL3MDsOgKV7vIrvb0g0Fiy+XXwh0ZwUp6mrLr9NuquO6rrS2r/67YMp0WYCDYmuQlr7R2l7a4nlFJgHuiy0/gQCDUrCPxJNTFQt9/6BlnzK9tEtNKOYSHQu9TtQKa5YKnKxMk+02m+f63pQ8B6X9KeulvsbEo0Fi28XX0i0rq8zs026i+rqltPyOlGMxXRuVsKZdYnlQmS78iX61VdfNRVoSDQAoGrwlUSTKhm8PIRCIQrNaKGWYiLRSqF8ymuQ0l2xVMxiRaJ5USayfI+zKd8tLdVzf0OisWDx7VJ5Es13fVGiy4r4hkIhCumEOTfomDgQGDewmCDGbGr48uWcOGsDmFX4wGJjY2Om6yHRAICqoHIlGguWYC2WJBqLvQUSjQWLb5fKkujiyKdqA0g0AKCqgERjweLOAokuwwKJxoLFt4vvJTrdRXVqqjeoHImeMnUS3bR6LT3Wn6DEz5+nx/oTdNNqsymuvMTqPNEq/BRZY+Fp5a1fboqrBatd2q9EHOmfbePaNIVb8tOVheuVEcsHNtIcz+8r4AaQaCxY3Fkg0WVYINFYsPh28a9Eqyneld+HObgSbTD375Spk+j+h/vosZ37aPNDj9D3N2+mzQ89Qo/t3Ef3P9xXgSJtU6LDi+mTyXOZOZLLjOMS3UizB8sj146PFF6grRWB1q/HiN/VAyQaCxZ3Fkh0GRZINBYsvl38K9HAY4lupJ5Mfgqkpt4Rmsh0U1Okhpa1rKbeXUna2vsjHb27krSsZbXnD9489iS6KdyiRDw9r3fx164sEl2GOavN21rJCEiFZesw93S1AInGgsWdBRJdhgUSjQWLbxdIdDBxP52bmVd482O7aVsiSX1P7NOxLZGkzY/t9vzBWxHnfEr2J5xE8+tUSePShqX7Oc/F/e9TS0aBl971tCCzn2Z3vaatX9LVWHC/Wmb7PK/RbAdks7V/lAa6rpau6wizbdZCvYbr+PbsCBtJcg2FI/WUEspiMYyKdyTdm8ILlB1INBYs7iyQ6DIskGgsWHy7QKKDiesS3dQ7QhOpNgpHauihnU/TnmdepMU3fUfHnmdepId2Pu3xg3c9pbgIJhuJrqcUJ3J6UXM/Ei2LHK+nBZn3qaV/vfJ69X5qyeyniwvuZ/Z+KRhHfs3aS5Rk/rWRJIs/gKgIad1GkXFIdKCARGPB4s4CiS7DAonGgsW3CyQ6mLgr0UwUOhypoa5Hd1Hf3qdp+74DOvr2Pk1dj+7y9sFb18+WlWiZoFWqRDPS3LCVlngu0Qap3OHF+UG/uHWStua2KZBmX7BvOlK6qwFINBYs7iyQ6DIskGgsWHy7QKKDiWsS3dQ7wgl0OFJDS29aTY/sTNLDP96p45GdSVp6k8d9os0k2sKgYZBoGSYSzbU7I8rhxebtaGFQMfOR0SHR1YDXEg1AtTA+Pu55HYIG+7DmdV0AAPaARAcTVyRaJtDhiDI6d9dD26in/0na/Og2im99hDY/qrzuemhbBYzOPZfGtOiyOl0Vm85t1g83CBKt9Jlm+1CXjkVhZcU4vNi0TznfzvWU4oTabFAxtU2Qzl0NQKIBcAdItPNAogHwL5DoYFJ+ieamt8qjismUqZNoxc1r6eG+vbRz//P0cN9eWnFz5cwTzQ4SlgqL/aDFNGM+GuqeRCsSLA4EpkixmUSb7cdu78LAYmr02WTgMHY9H1lmr4Mo2+aDioUjGFisWoBEA+AOkGjngUQD4F+8lOgjR46AMsF+Lh85csSF0bkBKMMUV8YUmpYMqdzVAiQaAHeARDsPJBoA/4JIdDBxf4orACIm0V+H6QjLBirL09o/6ko9gPdAom0iZhFlunOZNm2UmhihnuZCZVjdrtR9QKVRUKKDdG81d1OmYLlmx7ZWL0g0AP4FEh1MINEVQ24qKts4k2LtRT1b+wkvcgQAACAASURBVEdpe2t56plP/zYZ/K31JxDoKqLaJLq+s57D1v4SMWhPqeNa+FB0gKuYSnRV3luQaACqGUh0MIFEW+TOO2/3vA4AgOKpJomu76ynvsFlHPXLrIp0I/VkzMYCCKroAKcwluhqvbcg0QBUM5DoYAKJBgBUBX6T6KGhQTrp5M/SF7/0OVv7yQS6b3AZdfZZFOnmbspIZlPIIzz0C6m5eUHKbdeRX5/pzY/0355i0nlTbZKyFeFSt/H6/gHWMZToirm3VCRS35HU0svNykml1FlH+HJNjy2tr9k5q23VyD2sYbBLAPwFJDqYQKIBAFWBnyR6aGiQhoYG6TOf+Qc66eTP2trXEYnW+qiqUxRmaUJ70Gcf+tsoxcoNl6qrrNP6uxr2HRXLy/2/I8lICPATphJdCfcWu41wn7WnZJFyfb0MJdhkH3l9TerYkVSO05FEJBoAHwOJDiaQaIv4I5270EjU/JRd7s5hDYC3+EWiVYFWI9GTw6fb2r88kWiDB33JtnkJ0csFJyi5KeQMJSoXkWMjjMAf2ItEe3Bv6Y7P9MlmJN9aOXrxtXJs6bnIpgRNtVG4uRsSDYCPgUQHE1ckmktvQn+38hFebDqQliLQJgNtgTxX1NGtyVnUmZxFncnLaeEVFVAnUBJ+kGhWoIeGBm0LdDgil+jOPhsSLZUNJ0SHSZ3l9muknoyxbKjRSq/vH2Ad4z7RlXVvsfdYprdR+zccsVOOUZ3N9mHTyM3PWQXp3AD4F0h0MHE9Et3UO8JMZwEcbdtwi0l0eRr1Tt5AqbD39ax8zqWVyVm08obc6yvq6NbkTJrleb1AKVS6RIsCPTQ0WPS51i+r18TZnkArKOLKPswbpZzKUm7ZkZazcilh+p0ap7by9fH6/gHWMRudu9LuLW3/TJJSGaZelssRuiAY7mNQX9NU8TzswxqyMwDwF5DoYOKNRPuwn5ub6dz56Zk20CeTW6jXcB2fut0RNpPkekoJZRWPkv7Wo/VnE770DQeD0a+z9DCQS4/jB5UpY5rnDTOpc1sdTc+9nn7b5dTJSjXwJZUs0TKBLkWiwxFFpFlsl8GlpVodCEkvF8oATOJnATNoWCZJKVnEjjt+0vP7B1in4DzRXt9bujrl9uGeTayWYzAYnmQfeX3NB1ObSLXp+kQbD8wGAKhEKk+iE7Q8VEddae9F1M+4JNG5QTXYgTWAFLNosijJ/GsjSZ5LY5NZ8bYwf7LV66k+cLC/uIsDvAiv5YO2WKAjqUUv2lMWBbphIw2MjtKoQKG5qaffdjl1bjqXwpEamrVpFnVuq6OFm2bRrbdFPL8/QPFUskQDECQKSjSwDfpEA+BfINH+49VXX6VFixbRW2+95bVEMzAy5PVNXZGEFxsM+iWRYW6bAoOKFegvbQ92IJYaYvt3yTINWHHWRmMtIhuhlH3toEr0rE2zOJmGRPsbSDQA7gCJdh5INAD+BRLtT+666y5TkfZgdG6zlKrKxfXRuUWZDi82H03bwqBiY+FpDl7D4iRaQ03nsyHETb0jlMnY6A5QZCQ6fMNM6kyy0hyhhduQzu13VIkOhYbLAiQaAAVItPNAogHwL5Uu0YnlIQqFcixPUDabpq66EC1PMPskllOorovS0u29F14vRNqbSDRSuq3BinF4sa4PNAufBl5PKU6oCwwqputzXAhBotnsggLp3BwmI5Ea3zeKsJd3YJVzaSU7IvcNM6kTA4v5Hl6i6x0GEg2ACiTaeSDRAPiXSpdo6fuJ5ZwgJ5YLUm1aTrBYsWIFrVu3zguJZvpDo0+0OWr02WTgMHY9H1lm071F2TYfVExNk7Yn0SbTlknnyawhbtAV2aBjRnQk+XLcmD8WU1wFDq8lenx83DHYD24AKhEn73cwjrYFwMdUvEQnlpMWWdbeT9Dy0HJKqNvnotDG2weTPXv20CWXXEKvvvqqFxIdDFxP53aUAv2lbSOmcwNQ+Xgt0U7itSABUAiv/96DBtoWAP9S0RKd7qI6TZbT1FWXl+J0Vx3VdaW1f7NZ8+2DhplAQ6KrhI6wbKCyUoBEA/8RpD7RXgsSAIXw+u89aKBtAfAvFSfRTP9m7v/pLqpjI8vpLqqrW07L61RpLrB9gHj11VdNBRoSHXDy6d92R+UW07XF1G2nJbrQ8bxvS+B/gjQ6Nx6oQSWC+xJtCwDQU0kSvTwkpmArg4iFQiEK1S2n5XWSddzgYWbbB4uxsTHT9ZBoi/g7nRsAAIkGoLzgvkTbAgD0VJJEA+eARAMAqgJItNdU6PSGZjMIWKp7hZ6XB/jzvvQHaFsA/AskOphAogEAVQEk2h71nfUcpZfpZ9mERFsBooe2BQDogUQHE0i0RfyRzl14FO6mcEt+mixHBxsDoLKBRFunvrOe+gaXcdQvK/Xzws+yCYm2AkQPbQsA0AOJDiauSrT9+YiBLcKLTQcRUwTa7iBjVQrmiQ4c1SbRQ0ODdNLJn6UvfulztsqWCXTf4DLq7LMj0vyc8MpnPi+b7SlmAMFUm8l+svf443DvdSRpItNNTYbHUOqRSo3QxESS2i3VK7dNhzJH/QQ3T70g0c35bSa0ARj5c/D6b6FcQPTQtgAAPZDoYOKeRHckaSKTpJT4wAMcoyncYhJdnka9kzdQKux9PSufc2llchatvCH3+oo6ujU5k2Z5Xi9QCtUk0UNDgzQ0NEif+cw/0Eknf9ZW2aVLtCKMeclUMYrYMu93JBlxzSF7z2R9e0r2HcMeW5kNwFCCTfZR5ZzvRy1ux5TVkVSOU+gcAgJED20LANADiQ4mLkm0+mAhiRr4BDfTufNTU22gTya3UK/hOj51uyNsJsn1lBLKKu16Jqknl1nAR2VqhEiMcL2FdfoHbT1NvSP5h9dIDRk/pDvEDTOpc1sdTc+9nn7b5dTJSjXwJdUi0apAq5HoyeHTbZVdskQ3d1NGOgWeXjB1U9nlPh9knyfGf+/slHttlGI/K2TH0EmzhXpJRDsv68w64fNNi2YXPIdgANFD2wIA9ECig4krEt2eUh8e/CvRbmEWTRYlmX9tJMlzaWwyK97Fzh3NkovKqJEVNiojjnQrvJZHiawcTyzTwjzVDRtpYHSURgW2t5rvN/22y6lz07kUjtTQrE2zqHNbHS3cNItuvS3i+f0BiqcaJJoV6KGhQdsCHY7IJbqzz2GJ5rZppJ4ML6iyrj9m3YGaekco09uo/auvB3sME4m2vA/7XWa0v7yeSOcGaFsAqgtIdDApv0RzaWyQ6IKEFxsM+iWRYW6bAoOKFegvbQ828sNf16beEV3aIivO6kOk3dTG/A8xNfyDchlQJXrWplmcTEOi/U3QJVoU6KGhwaLLr19Wr4mzLYGO1JCldG6m37LRFFOyv3PDv/3mbspkkpTKMJ9LhscwkWjTfbIGgm6WKq6nqXfE87+FcgHRQ9sCAPRAooNJmSWaH0yFI9Pt+U1tB9dH5xZlOrzYfDRtC4OKjYWnOVS/4iVaQ02ZtCrTzd2UyXRTk+7YJhQZiQ7fMJM6k6w0R2jhNqRz+50gS7RMoEuR6HBEEWkWe/vnslUMBxZjvhsySUplGIkVB+WSvacjVx73eWJwDNN0bvN9lMHIxG4qZgOL5eoknIPXfwvlAqKHtgUA6IFEBxOXp7hCJNoWrBiHF+v6QLPwaeD1lOKEusCgYrkHPOvXRRDZjmT+4bZAOjeH1bTsHO2pEerpdWOAnnNpJTsi9w0zqRMDi/meIEs0AJUA7ku0LQBAj5cSfeTIEVAm2M/lI0eOQKI9RY0+mwwcxq7nI8tsurco2+aDitmfeoyPMk2IkiwdmCd//Sd0ESqL2Jb9EsAUV4EDEg1AecF96U7bDg8PAwB8CiLRwcHlSLR/cT2d21EK9Je2jY2Uaidh+ysCYJOgSjQAlYjXf+9Bg21brx8cAQDFAYkOFuLnMiQ6gHSEZQOVlYIXEq1Ev5HFAIoFEg2Ae3j99x402Lb1+sERAFAckOhgIX4uQ6IDRD792+6o3GK6tpi67bREmx8v9ZL1OaUBMOL8h/5Mtb1UNs7r/kA7lkyix8fHHcNrQQKgEE7e74D/m9/y8sdlAQ/hAJSX4eHhsv39GrH1lb+AMsF+Lm995S+QaCP8nc4NAKi/dAbVXzrDlWOVOxINQCUzPj7ueR2CBiQaAP8DiQ4WkGgAQFUAiQbAHSDRzgOJBsD/DA8P06aBt+n+5/9IP3jpA3rw0If04OGPINE+BRINAKgKINEAuAMk2nkg0QD4n+HhYfrOnl/T9546SvGD/6mINCTat0CiLYJ0bgD8DSQaAHeARDsPJBoA/zM8PEwtP/gZtf3oOfreU0fpvufeowcPfQiJ9ikuSLR+buCJVJvnX0gAgOoCEu0X2iilTWWnH3TQ2gj9bZQS568vuS56mnpHtO+zpt4Rpp7MwIu5+e11gyNK3ufLkJSlbsPUye5x21NZ3fvtKWcHbgyGRDt1D9m7p4yARAPgf4aHh+n6ux6hlh/8jL6z59e0aeBtSLSPcU2iMTURAMBLINEut3dnPYf1fUWJZkSmI6mTSsMyihIgcT8T4Wnupgyzrj0l+55jy2P+39xNGe08jOva1DsiyG3uR4VCxzUqv7mbejpkdWuknoxzwmgs0eUS03IQTInuTPzGGYlOxCgUCuWIUSKbpWw2QbFQlOJp96QkEQtRKJYQ3mfrYVQn2fvu19+N9onG0/prp2szA9JxihZsE7N2C16blsLw8DA13Xo/xboepzt2/TvFD/4nPXDozy5L9JM0Q/vbDVEoFKWmvYWEUdwnRKe1/dZzifUaSLRFkM4NgL+BRBszNDTobFt31lPf4DKO+mVWRdpEoi2LTfklWhTc9pTkeAaiLe6rl2W1LvoodKpXLFN/XGvlC+LckXQsS6zSJVp6rVyrq3cSvXDNd6m2tpY2/vz3pUl0Ok5RTZyV1/GEB8KUjlM0GqNY1EyGq1uiZcKciIUolnDyOJBoqwwPD9P89Zsodu9OuuNxLyU6L853t0UpdNZ9dHdBiWZlOyfVTU96LrLl4nt7R+iqa6+n+wff9V6i+XmGvf0CBQBUH5BoY4aGBh0TaZlA9w0uo84+OyKtIolEswLS3E0Zaap3br+O/HpOIqX7CanjpkIpRm7577n8sdjt8lJsSXI7kvo6p9oEMZcftyhJz5XrxD1gJNF8+3brf2DXrq+d65c7B/HekJFLcdf/qM+3Y/5+yF9jNg0+f2/I9pO9VyptJUu0KtC3bEmUHolOxCgUjVPaY2FKx6MUjae1f+X1qHKJFn/wyCYoxr12Aki0VSpRovWvrUj0X2jr3vvotNAKurkChLdcLFzzXVORdn1gMaX/lpV0PAAAcA5ItDGqQDsh0s5LtJHYKus0SWnupgyXOs2kPUvWGe9nNUpp9D0mlMEIn3ZMLi1dkS5ecmWSzqSCS2WROW7B8mX9oJVzcuJ+shyJFqLf+dT0QtePLyPT22gu0eo1kP4wIm8f43tBaGexTAcj+uwxrUh0Z+I30nRtKwJtL507QbGQJE1YFaZEnKK5lE9um3T+/VAoHw3lI6OCdKXjFJWmHqcprkag03GKclLvhESbnYud8+RT3WOxKPNemuJReXtoabPaucu3lR9LbCdmeyYyLT+OWE++ncz2MW2rtFl9Dc4tgFS2RP+Wms4K0YwtzLZbVuSi1DLRFrbfex+dpl3bFXSzuJ4rz3tBdkKk3R+dm/sy9A9I5wbA30CijWHluVSRLlskmuvnK3kdESWM/57R1tncz7hexj8Ga4Jq0m86PyDYCKVSI/KocyS/rbbeUKJ5MTYu30gaFVF34n6yns7NtqNZGr94/ewNVqpEkQ2uq+R+kNaVGahtgrsn5VFyJwdqsyrR82PrafpFl3AibVWg7Uk0Lz68AIfyUepETJBIUf5ycsWmHCdiFI3mI8v6KDOzvybOjFA7KtHMuXB9gwutY8pNxHL1F394UNpPem6y+kj7MRsdiy+HbUN5Krf+vA0luKi2KtA2dvpo+5xKlGgunXvLCi5F++YmVYILSbSwfssKpc+0YXn+ouH6lTQ/1ua9RLensoVTrgAAwGEg0caI4qy+Pu30U+y3s0SiO/ucSefWyaRlGWbG5nBJomV9n42ilOLgYE29I0Jqujhit/x7VD64Gfu+2QBiHkSimWvKt5W962cNNc1a2NeKRHPb6NtQ/cFCvIZup3PfN/AOXXXtIk2k7Qi0fYlmZVgVM1G4mNe6tGJG6BghTsRyEc1onNI6OZaLofpaFxl1IhKdltTXbJ0Qbc9HbGURWYO0am7QNrb9zCP7fHRYuEay9pQdx+waWt7HoK2M6is7t4BSORLNXgc2JftJmqG9fpJmaFFjI4nOvcdFoXM0PWlSnn+4ZcteuvCievre3hEvJFroEw2BBgB4ACTaGCcj0eFIDdUvq9fEuXiBriHzgcVkadnsiNRZA+EutJ8ViTaRUTbbSkgxlk4lpUtDLjBStlEk2ijLiy3fLNXYhT7R0vZt7qZMJkmpjHidza9f4Xa0ek9ZSOdmyzZoZ1m/c3lf9GKw3idaFena2lpbAl20RHMCW6REa3KXoJgmezFK6NK02XKFB3bDUcKNJFoi6Fwdxf3YtGiTdYZybFGiuff1dUzHo/nov5mIy841wbSn4XGsXkOzfQzaqkB9uXOrAOENtkQb94G+uy1Kp7X9VvvXcB+2T7RJ/2h5ef7ATKA9iUT7FaRzA+BvINHGONknWmvvZfUcxZUjj1zyQiMbtFLZL5UakQ/wZLgfM4BUgRRhfeRUPpgUN4+zVia7vRgFNY9y8xJtdFx5+bJ5qLVzcGV0bnn7tqdk/d2tXr/cvpYl2ug+MxtYjAkGsMLPpXgzA5wZXttisTewmCrSdgTalkQn4jphyqcsm6VVi+nceaFKx6O6NO5YTJ6eLB/YzEhyjQe2SsRCXDn8dFlCWrNOsC2uM5Joo3Ru9twMppfKR+GNjmUsqNq2hscxuYam+5i1h1GquLyeQY5I+0Git+69j047awXNOMts8DElmp1PzVZeSyVZK89fg5B9b++IqUBDogEAVQMk2hgnR+euGkz6JvsPt+aJlqNPQ6+MqbAqCafmiXYmEi1EgqVp1JLXXDqvLAosbmssv0Z9f/URcbPRofkBrUKSwcmUAbZkfb+N1onnaZDOLWnHfFRerQ8zfZd0Xm6jY0nOVdeeBscxvYbm+5i1lfweyNXX6NwCiC8k+hWl7zI/fZWFuaXFlG5tf6XvtB+nw/r+gddN10OiAQBVASTaGAh0cTT1jpRhJGb30UeCS8OWREt/jKgGiTbo665DiWZXlkRXA5i2CThPZUh0Yfw6AJjbQKIBAFUBJBoAd7Am0WqKdIFppCrgfCoBSLTbQKKB8/hCovfeR6f5cAAwSDQAAJQJSDQA7mA3nRsUBhLtNpBo4DyVLdG5tOsCqd4AEg0AqDK8lujx8XEAACgKSDQA/qeyJRr4TqKnTJ1EN61eS4/1Jyjx8+fpsf4E3bR6LU2ZOsnzh249c2ls8mLqsLz9NOqdvIE+yTEWnla2ul3c/z61ZBQWrGbXNdLsQfE9Oa39o7S91b22agq3aG3zSbjY0Xs9oGEjDQxspDle1wPYwmuJBqBaGB9HJNppINEA+B9IdLBwT6LZaR9yg4hMmTqJ7n+4jx7buY82P/QIfX/zZtr80CP02M59dP/DfRUo0jYlOryYPpk818XRW2XCbE2i53QdpNH+FufqUuDcFYF2s22cpbV/1Nn2AmUHEg2AO0CinQcSDYD/gUQHC1ckmpvXk2FZy2rq3ZWkrb0/0tG7K0nLWlZ7/sXFY0+im8ItLkdYi5Toho00MPoTanXympueuxKhT4W9vp6l0ELbRw/SvQ1e1wNYBRINgDtAop0HEg2A/4FEBwsXJNp4lM3Nj+2mbYkk9T2xT8e2RJI2P7bb8y8uRZzzKdmfcBLNr1OlkEtTlu4nw0B2V++nlsGtVBvhU7b1adtGZfDv1Xa9ptu3tX+UBrqultarI8yeQwv1Gq7jz68jbCbJ9ZQSyiqaXIZDfo5RZdqQTG9j0WXqf/RRRpEVyzSM3uvqBCoBSDQA7gCJdh5INAD+Z3h4mLq6umj79u30yiuv0B/+8Ad6//33Pa8XKA72czmbzZZBonNzQLb3jmjp3KqMPLTzadrzzIu0+Kbv6NjzzIv00M6nPf7iqqcUFzFlI9H1lOLEUS+GdiPRF/e/T0u6GikcWU8LMvvp4khOevvX67dv2EpLctvk3zeX6Iv739eEPL/eOKJqVn9RkvnXRpIs/iChUmJad0dSm0uzPVWaQCsIP/w0d1MmVz5/DQwi+JDoigQS7RbOTE+kzsHszN80cBNDiW7upozTU1cxXcWCfJ9AogHwP5DoYOGORHNfbvkHrK5Hd1Hf3qdp+74DOvr2Pk1dj+7y9otL16+XlWiZEJYm0bVdrykSvXo/LRl8jRasZt6L1ChR6QwbjbYu0S2Z9+UyHmmh7Uap3OHFBoN+Sc6d26ZA2nsZ+oo3qT/SpNocKY99cG/qHTF4OENKt5+ARLuFAxKd+/FV+YxopJ4M5gz2E6VHoq3eQ+x2wZ5bGhINgP8ZHh6mDRs20KZNm2jPnj30/PPP0y9/+UsaHh4GPoT9XB4eHi5fJJoVpvaUEqVbetNqemRnkh7+8U4dj+xM0tKbPO4TbSbRFkTQdp/o1fuppX891Xbtp9mrt9KS/vV0cb8qxetpQeY1mq0Km+1I9HpaIE0BN5Forh0YUQ4vNj8vC4OKOT1SeVPvCGUyI45JdP6+baOULAqttR0k2i9Aot2idJnR/XDVkXTubxuUHdckWni+UJ8tvD7/cgCJBsD/DA8P0+c/fzJ9+StfoFNP+wqdetpX6JRTvkhf/OLn6PNfOJk+//nK5Z577vG8DpUG+7n8+c+fXI4+0Up/Uu2LjUnnmjJ1EnU9tI16+p+kzY9uo/jWR2jzo8rrroe2VcDo3HNpTIsuq9NVsenc5oNj2Zbohq20ZHA/LejfSrWRRprdv58WDObEuWErLWEkWukfbS+dWylDXG9RBFkxDi827ePNn3c9pTihLjCoWOtPaHTU5lRbHclcH2Z53+WiyozUUHtqhHp6TR7ekc7tKyDR9jg8doju3LWU7tixlA6/dsjGvrLuELmZGbQfpHLb9MpScSWR55wsed0mwBrGEi2JHOvuAWVcC202j1Qb8xkvlsfeK2Y/ePofSDQA/oeV6NNO+wqdXnMKffVURaS//JUvVDQ9PT2e16HSYD+Xv/yVL5RpiivuIYqXiylTJ9GKm9fSw317aef+5+nhvr204ubKmSeaHSQsFRb7QYtpzXz01f7o3Eq0WE3fVgYBy4syO7DYkq6tWr9pLmVbN/CYINa5lHAtRTxiMLCYGn02GTiMXc9Hltl2EWW7wKBiDRtpYNTG9FEdSZqQPLBzIm23TK5sYxnGwGL+AhJtj/b+RZR4eSXtPrySVt27yMa+Jim2HUlelNQfqJhxDeQypLzndZsAa1iXaLN7gL9v5BJdwz1fBPkzFxINgP8RJfqMSV+lMyZ9lU6v+Sc6/fRT6LQK5uDBg57XodJgP5dPO/2UMs4TDSqXMkxxZUyhacJaaHsRUWNziizT7MENqdy+AxJtj9u3L6Ldh1fStoGV1LKxSIkWfkDNj1sgpuuKciVKtBJx9LpNgDVsRaIN7wGkc7M4JdGdid84I9GJGIVCoRwxSmSzlM0mKBaKUjztlpSkKR4N5esRjVO62LLScYrarjtzvkXtX6BM5v1ELETReFp/DWIJB8/P7Pq5fW2DCSfRp59Ck848lc6cfDqdOfm0iufIkSOe16HSYD+Xz5x8GiS6WjGMqjpMR1g2UBlTh1Hj6baKPq+iylSiJEYPZK39RUS2gadAou1x+D8O0dr4UloTX0qHik3nNhrZ3rZEIxLtJ9yS6GrqO++ERC9c812qra2ljT//fWkSnY5TVBNn5XU84bJopeMUDYUoluDfiyecKN/qeZTjfA3KlAhzIiacf1nPGxLtBKJEnzn5NM8/W6xy4sQJz+tQabCfy+FIDSS6mmntdzoCnCef/u3sqNzloD1VYLqU1p9AoH0IJNot9Cm7+r8lM4FCn2i/47hEG2UFCe8HeTq0UiVaFehbtiRKj0QnYgZRX7dES4lAOyuQxZyHixIt/nCRTVCMe13u84ZEO4GfJbr0ASODByTaInfeebvndQAAFA8k2i3MBhazks5dXRHGIFK6ROd/zDQfWIyZ3tDBKQ4rESsS3Zn4jTRd24pA20vnTlAsJEkvVkUroUSJQ+I26fz7ISaKzEdUBVlLxykqpizrhFJPIsakeWv7m9VPPa5ybuK+puWl+f+n41Em1Z3Znjt/PpKfr0/cQFaFHw6YyLRZ3WKxaO5YfLsW3z6ya6meC59eX74fOfwLJDpYQKIBAFUBJNpHYJ5oX4OHLeexItHzY+tp+kWXcCJtVaDtDyyWFyZegJm+yYmY0F+a2Zbto8umKidiFI1GNXlLx6N6WU/HKWq5/7Moukz9uH7CciEuXJ7ZPmy0WFifiOXOi28XRcDlx2bbQp7KrT9XQwl2sn3Uc7HTR7tKgUQHC0g0AKAqgET7i6ZeZd739lSwI4xBBA9bzmNFou8beIeuunaRJtJ2BLro0bm5vsmiqIkDb/HRY00EGSlOxHKR0Gic0tk0xaNWUpslcAOfGYtuXkYLCHHB8szKzuqi8FoEWPeDgInApw3axdK56sW36PYxOxdphgKARAcTSLRF/JHOXWjka37KLnvTbwHgbyDRALgDHracx2qfaFWka2trbQl0KVNcpePRXASySInWpDBBMU0SY5QwjDgX6BPNHYsVTrF+bDkmQmypPImkslFZI/G3I9HqsRPMPpbP1ehaFNE+BX7EUNPZkc6tBxIdLMov0bk5c0WCOg2Fp4QXmw7cpQh05Q/sBUA5gEQD4A542HIeOwOLqSJtR6DtDSwW14lWPjXZfDKFsgAAIABJREFUKPopS+fOi1g6HtWlccdiMeOoZi6SKh2dmx34TJeSzERKuToUEGJbKc6yQb/M+pFbS+dmBVUrx1LdhNeOtI95xFmahg8g0QHDg0i0xfkfgW2awi0m0eVp1Dt5A6XC3tfTfVpou2vzYINKxWuJHh8fBwCAonBqnmgnBxYzH2hL8ppLAxZEUZzH2Mq8xmJasRbRZQa4isYoJkRalcG2ZP25JQNvxRIFyxP/zw3apetjLGk3JrXaeGAxo3axUjfxdentIz0X6dzhQJToe+65h3p6eujgwYN05MgROnHihOefL6D0z+Xx8fHyS7Taz83rB2q7uJnOnZ8OagN9MrmFeg3X8anbHWEzSa6nlFBW8ShztvYwo6JyI+kKo/FyWQfCOkvTkeSyGfLlGE2bY4SDEl1yXYBXeC3RAFQL4+OIWDhNZUm0X8E0TcBbEIkOFi5HohGFLoRZNFmUZP61kSTPpbHJrHg7MV+zIo7ajyHN3ZRRryv7f3FdRJm2pKhU/o4kTUwkqT1SzFygEolu2EgDo6M0KmBpnuyS6gK8AhINgDvgYct5INFOAIkG3gKJDhauSrRfo9CuEl5sMOiXRIa5bQoMKlagv7Q9lEh0u/a6kXoyihzLrjErztqcnkXcB3b3ndN1UCfJo6OjNNB1dcltUMp5AG+ARAPgDnjYch5ItBNAooG3QKKDhXsSLUYofYbro3OLMh1ebD6atoVBxcbC0xyqX/ESraEOOGdDQpt6RyiTKeaHGIcj0SXVBXgFJBoAd8DDlvNAogHwP5DoYOGaRGOuzyJgxTi8WNcHmoVPA6+nFCfUBQYV0/XzLYQg0Ux6c6F0bo7mbspwMm5CR5ImMt3UlBP2ktO5S6GkugCvgESXA6GLTu6zxPt6AS8xftjKdQWyPVNHFXUFM/jOhEQD4H8g0cHCHYn2eRTaNdTos8nAYex6PrLMpnuLsm0+qJiammxPotkHIeHactOasesU6bT9ANWR5MvJDU7m3cBipdQFeEW1SXR9Zz1HeY7Dyo3yuYDpC4G5RIs/ulj5IbVYiQ6OfEOiAfA/kOhg4cEUV/7E9XRuRynQX9o2Yjo3AJVPNUl0fWc99Q0u46hfVg6RFiU6GMICSsOyRFu+Z9yX6PZUZd3LkGgA/A8kOlhAoquAjrBsoLJSgEQD/+E3iR4aGqSTTv4sffFLn7N3nhKB7htcRp19VkWazxjRIsvc9HTq378qKXx2itfXGniLrUh0pjvf9chwesTcfh359YWnVRQyplJt+uPJsN29SXJ+TD21sUIk9W5PCfXTtVHu/71J7mHNSHbLhdfiAUBQgEQHC0h0gMmnf9sdlVvfb41Pz3Zaogsdz/u2BP7HTxI9NDRIQ0OD9JnP/AOddPJn7Z1nqRLdkZSMX6GXH0UGEIkGeiz3iebuM6E7ANcNLLefKsCSdcb7mUg7iyriJY3dItQzJ+SaOBumrxv9HeWnk4REA+B/INHBAhJtEX+ncwMA/CLRqkCrkejJ4dPtnWepEi3r5y9E+vICBIkGeixFosWBJSUDTeZndtDfW9o6m/sZoUSFS71/C6Wrywfi438wlv9NQaIB8D+Q6GABiQYAVAV+kGhWoIeGBm0LdDgil+jOPjvp3ArcgIOGI+lDooEeq+ncTb0j+R9rbMlwflpFpySaLdfaYGeFz8/0NVfvRurJQKIBCDqQ6GABiQYAVAWVLtGiQA8NDRZ/rsvqNXEuRqBV8pKjpJXqR6GHRAM9xQ0sJkvLZvveZw2Eu9B+FtO5TetpFRsSzdbFMAUdEg1AkIBEBwtItEX8kc5deBTupnBLfposRwcbA6CyqWSJlgl0KRIdjigizWJ5Xy7FVEy3RTo3KIx1ic5lPHAyKRsPQ9kvlcoP0MUN/GW4HzN4l9WBxUrCTjo3M4BfJkkpRKIBCDyQ6GDhjkRzD2WlDtwBDAkvNh1ETBFou4OMARAMKlmiAQgSeNhynoqT6ESMQqFQjhglslnKZhMUC0Upni63jCQoph1bIRpPl1+C0nGKOnh+iZik3okYhWIJB+tjdk3cul5ABRIdLFyQaHEkZ0QrykVTuMUkujyNeidvoFTY+3q6TwttH/0JtXpeD+AlkGgA3CFYD1tms0dk5VkbZaCiJDodp6gmzsrreMJNKQvIcSTCnIiFKJZw6xwg0W4DiQ4WLki0krLETfFQ1nSq8uBmOnd+aqoN9MnkFuo1XMenbneEzSS5nlJCWcWj/DDSYzD3pfFcn/p1+j6Werh0P9k9VRDnJLr0ugCvCKJEsx/gAFQaXv/NBwm2XT2X6ESMQtE4pT2TsoAcR/wxIpugGPe63OcAiXYbSHSwEL/vytYnmuuXVAEnXqmYRZNFSeZfG0nyXBqbzIp3sXNHs+TnrgxHavhBUbgBUvSv86Om2j2eWKadX/0lEt2wkQZGR2lUYHtruesCvAISDYC7eP03HyTYdvVconPp1PoU6pyUJeIUDUnSrNP590OhfMSVj74KYpeOU1SX3mwkf+L77Ovc/+P5NHS+/mmKR9m6CSnjsYS8bpLzKXws/pjafkxkOhETj50vNxaLkpJCz9fHbB/5NTE7H1XmxXbxXkT9DCQ6WIjfd2WLRKvC1Z7K+jIS7RrhxQaDfklkmNumwKBiBfpL20NM0c9PN9LUO6L7oYQVZ3XaHLs/prSn8tFebloUE+Z0HdRJ8ujoKA10XV3S+RdTF+A9Xkv0+Pi443gtSQCYUY57vlph29V7ieblipfHUD5KnYgR31+a2Zbtz8umNSdiFI1GNdFLx6MGss73iY5J08lFiQ5xxxFF0fBHAZPypOdjeiwe9vzkqdz6YxpKsMk+2jXR1VP2/9x1iKft9dEGBRkeHqZ77rmHenp66ODBg3TkyBE6ceKE558voPTP5fHx8TJItC5SJ0xH4RNcH51blOnwYvPRtC0MKjYWnuZQ/YqXaA11sDmrMt3cTZlMNzXpjm0FJyPRpdYFeIXXEl0O2A9wr9sXgHAE96Qb7VoZEs3KowWJ1aUuM9KYjlM0J3mJWC5qGo1TOpumeNRKxNnofRNJLFC3guWZnY9pPSTtJztXbuA2C+dgeR+DegpRdS2anXvflYHbqgBEooOF+H1XJok2Tu8FJrBiHF6s6wPNwqeB11OKE+oCg4rlhNb6DxuCPHYk84Oq2LneNlOh21Mj1NObLKJLgPMDixVfF+AVkGgAyg/uyfK3a0VJdFaJpkrTnS1LpyqQCYppQhmjBCPXgZVo9dwTzLlyZbNybbU+ZvuwKeRW2oC5xiGkc0Oiva9HJVF+iY4wKbyygaZAHjX6bDJwGLuejyyz6d6ibJsPKqZeH3sSzY5KKkgyN6UZu46ZF7OYe8G27KuUYXTuousCvAISDUD5wT1Z/nb1XKITcZ2UKZFKu+nPeWlLx6O6NO5YLGYQATWSUkkfY0tRXKfSuY2m+jIfwEsVVO347MBthunXwmvTfZiyDetp1M+dryci0qUBiQ4Wrkh0EHA9ndtRCvSXto1HacyVNLJ7JdUFWAISDUD5wT1Z/nb1XKLFPsniIFZG8silDAtSKc55bDoHsomUsinNsZi1SLTknNhBz6wNLFaobJNRsHXnygzmFY1RzEokusA+ymBkBgOgGQyUFoolDOYDB5BoIH4uhyOQ6EDSEZYNVFYKXkh0JfWlr6S6AKtAooE1hBH4ncJSVyazY5epXg6De7L87eq9RAMAigESHSwg0QEmn/5td1RuMV1bTN12WqLNj5d6yfqc0uVGnaqtEuoC7AGJttlenfUc7l+zUqWx2P29lFVINCjcrpBoAPwJJDpY+EqiL7n4PM/ouvduT48PACgNSLR16jvrqW9wGUf9MrdFGhJdOfWyDiS6/O0KiQbAn0CigwUkGgBQFVSbRA8NDdJJJ3+Wvvilz9kqUybQfYPLqLPPqkjnZK+jmzITYuaGsi6VGhFG9BcHGxSyU9RR8Llt9dPs5cuwuX8zW9duiazmp/HT3mPGRVAzVPhp+8Rz5SXYbB+ztuNnPhDPhW8HL76nIdHlb1dINAD+BBIdLAwl+pZ1qymdfpVmXnSB55VU8fohHADgX6pJooeGBmloaJA+85l/oJNO/qytMp2R6Gx+4D2uL7CyjhdDRk5127IyK7zuSObKUcRR38XC6v58HZTZCiQR3w5+Srv2lGxcBPYYsnOVRZL1+xi3nUHbqOfS4f20e5Do8rcrJBoAfwKJDhaGEn3flq1U/919ZLa4XVkvH8CRzg2Av6kWiVYFWo1ETw6fbqtMxyLRjCzmhVMWTeXHVzDfVhgzIdVmMt+8jf25kfbNZFc9Thul2H2k0/oVlvjC+xi0h2lbeDtmAyS6/O0KiQbAn0Cig4VUot999x3KjL+jyfLx44M089e3UvjQ+XT2wW9QYnivPZHmHhaKH5DK64dwAIB/qQaJZgV6aGjQtkCHI3KJ7uwrRaLZVOhSJVry/WFLog32tyTRSpQ609uo/asvt5F6MhYk2vI+Bm1neM75eiKdO1hAogHwP5DoYCGV6M8u+RF9dsmPiIjo9eODdNHwvdT4p7k0/fcX0jmpFXTqdy6lwcFBaxItftmXML+u1w/hAAD/EnSJFgV6aGiw6HLrl9Vr4mxPoGtIl8bMfQfIxFJM5zbfVh9ltZPObbSdhXRutX6ZJKUyBt9pVtPRTfex0nZG55KnqXfElXvd7J704vhBhW3XLS9/XBYg0QCUF0h0sJBK9A+eeo1+8NRrREQ0M30XzX3/Gpr++xl05isRCh8+j07a92X63MavWZNoXR+t4kcY9fIBHOncAPgbSLQ96pfVc1jflx1Qix0szODzn0tN1qcyGw8MJg7IJQ5OZmN/JltKPrCYSm7gLu47jRnMK5OklJVIdIF9LLWd7FyErC837nWze9KL4wcVSDQA/gcSHSykEv293b/S0rXP+cWNdNvHt9EVb82mM38Zpn986mT6wu6pdMoNNiSaiUSb/spfAK8fwgEA/iXoEu31l0kef0zFBMpDZd6T/gcSDYD/gUQHC6lEq8s7f3+HHph4kFo+WkWXjNfTPz51En1lZx3971v/b/o/1vxflvtEq/2zCv/Kb47XD+EAAP8CiXYLSHQ1U5n3pP+BRAPgfyDRwcJQoofeO0Df/vjbND/bTCdfX0v/+NT/Qyft+zL9w4MnUygUotueay9uhO4CA6KY4eUDONK5AfA3QZdoACoNrx9wggTbrpBoAPwJJDpYiN93oXCkhh7/5Z/oqb8+RQv/Z4ymPHQuraM2+j9/8EWadN0FNOOKRfTjH+8ocporowFgrOH1QzgAwL9AogFwF68fcIIE266QaAD8CSQ6WIjfd6FwpIZCJ/2I5h5ZTF9Y9VW68PWZJc4TzQygwg2SYh+vH8IBAP7Fa4keHx93HK8lCQAzynHPVytsu5Yiyp2J3zgj0YkYhUKhHDFKZLOUzSYoFopSPO2WlKQpHg3l6xGNU7qM9UjEQhSNp/XtEEtYKyMdp2jBepnV3e32BU4zPDxM99xzD/X09NDBgwfpyJEjdOLECc8/X0Dpn8vj4+OKREfv+x8Umvpl+n//9ZQiI87lwcsHcKRzA+BvvJZoAKqF8XFELJzGCYleuOa7VFtbSxt//vvSJDodp6gmzsrreMJlyUvHKRoKUSzBv1fWekiEORET6lAykOggg0h0sGA/l8MRpk906PTGihLocASRaABA8UCiAXAHPGw5T6kSrQr0LVsSpUeiEzEm6uuF5CkRaGN5LVM9xB8PsgmKca+dABIdZCDRwcJQoitNoMMRSDQAoHgg0QC4Ax62nMeKRHcmfiNN17Yi0PbSuRMUC0lSm1XJSyhR4pC4TTr/foiJIvPRXEEU03GKiunSOpmV1S9fRiLGpHxrZfGp4MrxZe+xCPLORKblx1DqEYtFcynvVupl1oaSttGl1Bc6B+AlkOhgIZVooOfOO2/3vA4AgOKBRAPgDnjYch4rEj0/tp6mX3QJJ9JWBdr+wGJ5WeMFmOmbnIgJ/aWZbdn+wWyadCJG0WhUE8d0PKqX9XScotJIOFsPWcSWeV/Wl9lC/2a2PvJUbvbY4o8NFuoltiHXj1rcjikrEVOOY6ePNnAdSHSwgEQDAKoCSDQA7mD4sNXcTZlyzCHekaQJcerMjqQ2oGmxM4JUElYk+r6Bd+iqaxdpIm1HoIsenZvrmyxKIvNaEj3WJJSR4kQsF4WNximdTVM8KpFOm5FofhA0tj7ySLk+wi4cW1Y32THM2sPyPqysi+3JRLLVaLaVcwCeAYkOFpBoAEBVAIkGwB1Kf9hqo5Ql2c7N/pFKUoqT6DbmtdWyKhurfaJVka6trbUl0KVMcZWOR3PRzyIlWhPSBMU0QY1RwjDibKNPNHdcvZSn41Fd2rPsPf7YrOibHcNqe5jtw56reXvqrgnSuSsOSHSwgERbBOncAPgbSDQA7uCeRLPbMxLdkaSJVJu2vql3xPfRaDsDi6kibUeg7Q0sFtdJnhL5NIu8ytK58xKYjkd1adyxWMw4opqL4hYcnZsdBM1giilZyrg0jVwQVG294TFM2sN0H6Zsrp3MUsXl9UREurKARAcLByU6Px+0bi7o5m7KTKhzRfv/F2EAgP+ARLvL4bFDdOeupXTHjqV0+LVDJZaXk6qO/HcJJ0Xcdwz7HZT/XpJ+NzHbaOV1JD1vO79j/LDFynHu/71i2nUbpZhrOZFqU6Q4001NpvdHXqJ10ixItR9xap5oJwcWMxwUyyh9mUtBFmRWFFwrcyqLKc3SeaKZgbaiMYpFGYkVB+WSzn1tdFx9tFh3DNP2MN9HGYxM1ufcqD1z18HqOQBPgEQHC4ckWv1iVB5G+AcV5QtRe6+5mzJi3yUAACgzkGh3ae9fRImXV9Luwytp1b2LSiwvJ1aqSHF9a2XfMbl1luVJlTDlX6/bzu9Yl+hs/vpw/ZqFSDQkusIkGgBQDJDoYOFwOrdEooUvv6beEZOIQOWCdG4A/A0k2l1u376Idh9eSdsGVlLLRickms9iak/lvkckP8zy6ywOLJUbiMpv302ViK1IdLOVdVbuD0g0JBqAygYSHSzKLtFNvSPal1d7Sokk9KSCMVomAMA/QKLd5fB/HKK18aW0Jr6UDjmVzq1JFfNdYybRudeWfryFRDuG1xJd7X2iIdEAVCaQ6GDhmkS3p7KcTPv9Cw0A4C8g0X5GSf3Vvjc4cbbWZchcpJDO7SSOS7TNdG79/eH/sVgg0QD4H0h0sHAnnZtLp5P1m658kM4NgL+BRPsZRYRSqRH5IGFGg1cycwXr5hHW4AcWa+odqYDz9TelS3Quc63IgcXEa++35w0ZkGgA/A8kOliUX6JlvyhjYDEAgMtAov1MMKKJ1QIetpwHEg2A/4FEBwsHR+dmpqQQf/3FFFcAAI+BRPsD/XeJmmbtxHeH7LsKP+o6DR62nAcSDYD/gUQHC4cj0cEF6dwA+BtItJ9BJNpP4GHLeSDRAPgfSHSwgEQDAKoCSDQA7oCHLeeBRAPgfyDRwQISDQCoCryW6PHxcQAAKApINAD+Z3h4mO655x7q6emhgwcP0pEjR+jEiROef76A0j+Xx8fHIdEAgGDitUQDUC2MjyNi4TSQaAD8DyLRwQKRaABAVQCJBsAd8LDlPJBoAPwPJDpYQKIBAFUBJBoAd8DDlvNAogHwP5DoYOFTiZ5LY5M3UCosWzeNeidvoE9yjIWnVUB9q5DGefTK0dspsboK61JJ5w40INEAuAMetpzHKYnuTPzGGYlOxCgUCuWIUSKbpWw2QbFQlOLpcstIgmLasUMUcuWYTtdfX+dELETReFrfzrGEtXLTcYoWbAuza+TW9ateINHBwkGJbqSejDA/tKV1xWAi0eHF9MnkudRUAY1b3dRTolJE0nWpraBzBxqQaADcwfBhq7mbMg5PVdbUO1IVc347IdEL13yXamtraePPf1+aRKfjFNXEWXkdT7gpYfxx0vEohaJxSpdYTqn1KHk/iTAnYiGKJcrXds62BygEJDpYOCTR6hyeiizzomy2znmawi30Sbje84YF9ZQ4uooeaPS6Hjh3oACJBsAdSn/Ysj4veHuq/M8VlUCpEq0K9C1bEqVHohMxA2n1RqIdl9my72+wn/jjRDZBMe51OdrOi+tXvUCig4XD6dxmouyMRHeE86nabCS6KdyivZ9nMXWUrfHaKDWRpB7mV/BMb6O2vj2VZX4dz593U+8IZXq7KTWRpYlMN/WkhAh9czdlJPtVM3Pjq+iV+DxKHL2d3npuHj2w83Z6i4n0rsu9VmEjwOw6PjJcT4mjN9AD8VXa+lfi55X/fDqSuK4eAYkGwB3clWhnI9uVihWJ7kz8RpqubUWg7aVzK+nUutRjVcIScYrmUq25bdL590OhfISVj7YKIpeOU1SXzmwm0cr/Y7FoPs1celwhJVw9BrctK7BpikfZMmzun2bbJG4gq8oxtLZgItOJmORYunPl28VsH/k1krS97lzEdvBeTP0EJDpY+E6iFZR+z7J0bvci0W2KCKfalNcdSeNUsuZuyuTWKalnSWrP7Z/pbcyJdSOpYt7OHaOMDwgNG2lgdJRGBba3Fljn8k06N76K3jp6A63LpUm/Ej8vJ9YS6W2cR68cvYHWce+fRw88J5Po2+mtnbl7ZfUNuWOU+Xwg0Z4BiXaXw2OH6M5dS+mOHUvp8GuHSiwv91nYkf+Rkf3R0vjHx3xXIuO/O8l3U0fS8/bzM8YPW+x3Wu7/vUnhh+jcd6tKqk353Mx0S7pp8deXuycChhWJnh9bT9MvuoQTaasCbX9gsbxM8QIcykepEzGhvzSzLdt/l01jTsQoGo1qYpeOR41lXZrOLQq+yXELRbQTsVw5yrkWqofx/nwd0vGoYT9u9nzlqdziDwYmEmyyj9Zehu1hcC52+mgDHZDoYAGJLhpBeBlRDkdqNFkS+2o19Y7kxDv/MKFJtPAgqFAdv7KbMTe+Kie7+TRpTqJX38BFovUybCTRzHZS+QZBAhLtLu39iyjx8krafXglrbp3UYnltWnZO02RGqFvrbKOz+bJretI5n/oNEPYrj2V9bz9/Ix1iTb6IVr4AdlQoo3KDh5WJPq+gXfoqmsXaSJtR6CLHp07F62MSftEM691qcqMJKbjFM1JXSKWi5JG45TOpikeNZJCdmAxMQVajKYaHNc08spEcCVlGB/LYH8u/d0kbTptcO7cQG7WfwQovI9Be5i2hewHBQCJrj4g0UVjJtHCl7kYiTaSaEsPCg7ip0i0oUQL/Y9tRaIh0dUEJNpdbt++iHYfXknbBlZSy0YnJJoXJK0vrPgDpm6dlQgl+3neRqlMt+ft52dsRaKbrayzRnsquNFoq32iVZGura21JdClTHGVjkdz0ckiJVoTxgTFNIGMUUInnxYktGSJlsiyLYk22N+qRKttkWD24cpl5dpqe5vtw6aQm18v3TVHOrdtINHBAhJdNCYSLYxAqvSPtiDRYkQFUDhSQKIb59ErjEQrfaArWKKRzu0ZkGh3Ofwfh2htfCmtiS+lQ06lc2tSxXyfmEl07rU6grPZ3536OZz/PPa+Df2KlxId1M9WOwOLqSJtR6DtDSwW10lYPm3ZrK+ymFadl7R0PKpL447FYgYRTzuDY5kdV76t/ph20rmNtrOWzs0KqlYOO5Cb1XR0032Ysg3bw+hc+HoiIm0PSHSwcHB0bjENWf0yM1tnF34OaMMBxryW6Ag/sJgykJgVia7Rp3S7GZmuUAqlc7ODhykDkKkyrMgzn+qtyjQkutqARPuZ/BgS4UiNJPNHTOfWj09RUI6buymTSVIqE9yUYLdwXKKtZGmVYfqsSsKpeaKdHFjMcNAqo/RiLkVYkEhxjmPTOY9tjjBtclxt8C3pwGDiuckHRbO0P5NabTywmNG5M4N5RWMUsxKJLrCPMhiZrE+7SXp6LGEwPziARFcnDkeiAQCgMoFE+xlFqlKpEfkPsdyPj4J82ZhDuD2VtdaHGphSukQzP0SbDizG/0gf5B8nK0uiAQDFAIkOFpBoAEBVAIn2M+4MGhXkdGA3wcOW80CiAfA/kOhgUeUSLU81L4zbKWN+qacZuSmlbMMMGoZ6ghKARPsD/WedOiWgE59nss9SZiwLdJ9xBDxsOQ8kGgD/A4kOFlUu0QCAagES7WfKGYlW5xqupB8d/Q0etpwHEg2A/4FEBwtINACgKoBEA+AOeNhyHkg0AP4HEh0sINEAgKrAa4keHx8HAICigEQD4H+Gh4fpnnvuoZ6eHjp48CAdOXKETpw44fnnCyj9c3l8fBwS7QzC9FdloLV/lLa3Mu81bKSBgY00x6VzZKfw4gfisT4fuO4cKgmX2xOUH68lGoBqYXwcEQungUQD4H8QiQ4WDkai1X5lEoEymn6k4hEHobFa91IkurCEzuk6SKP9Lbr3W/tHpe+XD1ldrUm0/BwitHDbLOpMzqKVNwj7XFFHtyaVdZ3Jy2nhFaXWPX8sjU3netyeoJxAogFwBzxsOQ/7sGYku+XCa/EAIChAooOFQxKtDvpiJFV5oWzqHTGY77ES4QezsV73Mkp0w0YaGP0JtUr3baHtowfp3ga32qdIiZaew7m0Mnk5LbxCkVteos+llaxYX1FHtyZn0qyS6i47jtftCcoJJBoAd8DDlvNAogHwP5DoYOFwn2gLAtWRzE8pUvEII8I2d1OGrTsXYWfPOyfRHUltXaa3MV+uwX5NvSMFp6lq7R+lga6rDetsFKW2fK06ktoPBWzKtjTDwIJEq+fEbmN+DhK5vWEmdW6ro+m519Nvu1werbaFFYm2056g0oFEA+AOeNhyHkg0AP4HEh0sXJfopt4Rmki1eX7i1uAluj2Vzde9uZsyOsFWX+fSwGXbmu5XqA0tREZNI9U87SlV7vORc8PrI/6AYFjX/Hvtqawkcl/oHPRyO/22y7VU61mbZlHntjpauGkW3XpbpIRrK6ZzG6SI22hPUNlAogFNqau6AAANYElEQVRwB8OHLd33nUPIfpw3+hHbp0CiAfA/kOhg4a5E+yoKXUO6PtGMEMpksz2lnruYzp1vF/P9CrVhC20vKHTWU5CbekeUh4uOJGUyI1r9tAcO5iFEwbpET7A/Itg6B2OJnrVpFifTpUk0jxLdlqWII6U7KECiAXCH0h+2rM4Lnvu+SSWF71z2O7icc4y7ByQaAP8DiQ4Wrkm0ktbrJ4GuIe7LN5eCrQpmECQ63JGkiVQbNfUmqaejmzKpNuEcTFLZDeuqvqf8AKE/D/sSHb5hJnUmWWm2loptiyvq6FZpNBoSHRQg0QC4g3sSzW7PfD/lvtvU9dyPwz4FEg2A/4FEBwtXJNqfAl1D0oHF1PMomM4tfKFb2k8hn2Yt1qeEdO5cVJm7Ns3dlMkkKZXqpqZII/WkkpTKyNPOlf7R9tK51R8e+PX207nzg47lXt8wUx81bv0JjY4WP2WWmiY+XVyHdO7AUG0SfXjsEN25ayndsWMpHX7tkOX9ejJZLhvF6+sG/Ifxwxb7nZr7f6+Ydi1kgKXauLE6jMvlBzDlvkMFqfYjFSfRiRiFQqEcMUpks5TNJigWilI87YKQSI/vIOk4RQuei/x8E7EQReNpfX1jibIfu/A64CWQ6GDh4Ojc4oBYvEhJ11VAAxQ+L1ZwlfOUpzvrtzOcGstwvxwmU4IVO7CYbIAv8XzEHzvYgcUyvd3MQwqTsq27poJY586VfaCRn4MyAnenAD8it0n/5YaNNDBqZ0oqoU+0TKBN2hP4j2qT6Pb+RZR4eSXtPrySVt27yMa+qpAo/3p93YD/sC7RTLcfrruX8N0Lia4siU7HKcqKazpO8YSL8mZ4fLcxOF+JMCdiIYo5WkdItB+BRAcLhyPRoOxU1BRX5TiHYmmh7SVEoo3L9EF7AktUm0Tfvn0R7T68krYNrKSWjXYkukaeuQKARWxFoputrCsEJNpViU7EKBT9/9u7Y902sjMMw76UeIG1dAW8CVfrxpULwkACY7fYIjaSxlUQsHYlNwESBwgWYKdKxaa0UxhQgMXCUSoDcweq3M0WoqUhRfJQEnWG/OYpHiTx2qRGXvz435zhaNKe9hVvK9+/thXXuxj559N2vPXTchG9j0R0FhG9h1adjr54d5OT2N28hlu/1v/Wn9Dfxj59PykbWkR/+PV9+8PkWfv95Fn7/ga3cx8cfiOiuZO+I9pnou/7du5pO36w5Jblr/E2nbSj2a3Wc7/n9OrXHzy4OpmdP6VdCMDTSTu6dhv0Nt6/G7Wn7WS0+HXNfx3T8dU/vzplXhWrF693eU2dk+l1rzMej2Zf1w3ee+m1LvkeXrvuZdeMiL7NXB8uEb2nXrxbOHV98fe9C75r17BL9vD7yXpDi+jbczs3d7P1iL7h7dzzD8L0dO57+Ux0J8LmA/jB1SnxdLzweenO7+1+7rd7+/N03I5Go8sgPJ2MlsTyhu8/99nihbCcjmeve/E6K4P8WiB3f331iW/3615+K/fi66yJ4DV/pnytK677Jp/RZmtEdBYRDQyCiN5M98Fi3739pfevh/1z94juPJPjFg8WOzj8Zu7ZIwl3VOxeRM/MTjmXnd7O/e9rtzh34vJ00o5mMTgdz05XR5P29Py0nYwKtyWvff+F9+icgl+e6i75upaG7NyDzMoRfXVNC9ew0evc7r2vYn3x+77qupf9nweI6JvO9eES0cAgiGiow7K1fTsb0ecXp64Xp5q3jOjL0Jy248vwHLfTTlzf7v07t1WviuVNInru93SjeN1nj2e/b9q5ho1f5zbv3b2FfP33/dr3zu3c1YjoLCIaGAQRDXVYtrZvpyJ6OrkWbxcnmutOVJfdzn0Vd6eT0bXbuMfj8fKT0rXv3zldnXuPVZ+j3uB27u6DzNbdIr4iUC9fe+PX2fS9113rqlvFl3+dTqTrENFZRDQwCCIa6rBsbd9ORfTXz+MWH7S17gFXC/G5+LOR1/6s5PXvf/GAriUPzFq8tXnuz617sFjnIVyjcTve6CR62TVs+jqbv/fya133fZ9d933/nG2WEtFZRDQwCCIa6rBsbd9uRfSu8qOd2G0iOouIBgah74humgbgVkT0JkQ0u+3jx4/t69ev26Ojo/bnn39uP3361H7+/Ln3+cLd53LTNCIayNR3RMNQNI0Ti20T0ZsQ0ew2J9FZnEQDgyCioQ7L1vaJaNh/IjqLiAYGQURDHZat7eszooG7EdGZRDQwCCIa6rBsbZ+Ihv0lojOJaGAQRDTUsXLZevKmPfvyS3v0ZHvv9d3bX9ovX85njtuXO3D990FEw/4S0ZlENDAIIhrquPuy9WN7smFsvzw5b09e9X/N9627rPX9uU7gdkR0FhENDIKIhjrqRvR2T7Z3lYiG/Seis4hoYBCGFtEf/v++/fO/nrV/+uez9sN/32/8547OFk72Xh33/nfHflm9bHXjePbf3x5f3o599vbx7NfPr27RPvmxPXh13H45e9N+d+31HrdHZ+cLf77/678P3WXt48ePwJ4S0TlENDAIQ4vol++ettP/PG9/+vC8/cNfn27+Z18dX4TL19c5Oe/97479snlEn1/9u/bquPOZ5oWT6JURveq183SXNQB2y8GhiAZCDS2i//iPp+1PH563f/v38/b3f7lBRB/+2J50Y+bsTe9/d+yXG51EP9nkn23m5UnuaXTfCyIAqx0cimgg1NAi+sOv79sfJs/a7yfP2vc3uJ374PDiicdnbx9f/mfff3fslz4jOvUhY30viACsdnAoooFQQ4voO3nypj07O25PznJvj+X+bD2iN7md+x5+fNY+eHTwsP320cP220e/A/bEo4OH7aODh73Pj+3Mdb4S0UAkEX0zL0/O5z4bDZu6e0TP/v0rPlhs/iFkqafQAH0T0WUiGogkom8m+dZY7pdlCyCLuV4mooFIIvoGnrxpz4pPQ4blLFsAWcz1MhENRBLRm7n4ubvD+2wp22PZAshirpeJaCCSiIY6LFsAWcz1MhENROo7opumAQAgkIgGIvUd0TAUTePEAiCJuV4mooFIIhrqsGwBZDHXy0Q0EElEQx2WLYAs5nqZiAYiiWiow7IFkMVcLxPRQCQRDXVYtgCymOtlIhqIJKKhDssWQBZzvUxEA5FENNRh2QLIYq6XiWggkoiGOixbAFnM9TIRDUQS0VCHZQsgi7leJqKBSCIa6rBsAWQx18tENBBJREMdli2ALOZ6mYgGIoloqMOyBZDFXC8T0UAkEQ11WLYAspjrZSIaiCSioQ7LFkAWc71MRAORRDTUYdkCyGKul4loIJKIhjosWwBZzPUyEQ1EEtFQh2ULIIu5XiaigUh9R3TTNAAABBLRQKS+IxqGommcWAAkMdfLRDQQSURDHZYtgCzmepmIBiKJaKjDsgWQxVwvE9FAJBENdVi2ALKY62UiGogkoqEOyxZAFnO9TEQDkUQ01GHZAshirpeJaCCSiIY6LFsAWcz1MhENRBLRUIdlCyCLuV4mooFIIhrqsGwBZDHXy0Q0EElEQx2WLYAs5nqZiAYiiWiow7IFkMVcLxPRQCQRDXVYtgCymOtlIhqIJKKhDssWQBZzvUxEA5FENNRh2QLIYq6XiWggkoiGOixbAFnM9TIRDUQS0VCHZQsgi7leJqKBSCIa6rBsAWQx18tENBCp74humgYAgEAiGojUd0TDUDSNEwuAJOZ6mYgGIoloqMOyBZDFXC8T0UAkEQ11WLYAspjrZSIaiCSioQ7LFkAWc71MRAORRDTUYdkCyGKul4loIJKIhjosWwBZzPUyEQ1EEtFQh2ULIIu5XiaigUgiGuqwbAFkMdfLRDQQSURDHZYtgCzmepmIBiKJaKjDsgWQxVwvE9FAJBENdVi2ALKY62UiGogkoqEOyxZAFnO9TEQDkUQ01GHZAshirpeJaCCSiIY6LFsAWcz1MhENRBLRUIdlCyCLuV4mooFIIhrqsGwBZDHXy0Q0EElEQx2WLYAs5nqZiAYi9R3RTdMAABBIRAOR+o5oGIqmcWIBkMRcLxPRQCQRDXVYtgCymOtlIhqIJKKhDssWQBZzvUxEA5FENNRh2QLIYq6XiWggkoiGOixbAFnM9TIRDUQS0VCHZQsgi7leJqKBSCIa6rBsAWQx18tENBBJREMdli2ALOZ6mYgGIoloqMOyBZDFXC8T0UAkEQ11WLYAspjrZSIaiCSioQ7LFkAWc71MRAORRDTUYdkCyGKul4loIJKIhjosWwBZzPUyEQ1EEtFQh2ULIIu5XiaigUgiGuqwbAFkMdfLRDQQSURDHZYtgCzmepmIBiKJaKjDsgWQxVwvE9FApL4jumkaAAACiWggUt8RDUPRNE4sAJKY62UiGogkoqEOyxZAFnO9TEQDkUQ01GHZAshirpeJaCCSiIY6LFsAWcz1MhENRBLRUIdlCyCLuV4mooFIIhrqsGwBZDHXy0Q0EElEQx2WLYAs5nqZiAYiiWiow7IFkMVcLxPRQCQRDXVYtgCymOtlIhqIJKKhDssWQBZzvUxEA5FENNRh2QLIYq6XiWggkoiGOixbAFnM9TIRDUQS0VCHZQsgi7le9huYHdaq9NMqDgAAAABJRU5ErkJggg==" width="640" /> <br />
<ul>
<li>Better support for PySide2;</li>
<li>Show the disassembly of frames when sources aren't available:</li>
</ul>
<img alt="" height="237" src="data:image/png;base64,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" width="640" /> <br />
<br />
<br />
Besides those, there were a number of other improvements... some noteworthy are support for the <b>latest PyTest</b>, faster PyDev Package Explorer, <b>type inference</b> for type comments with self attributes (i.e.: <b>#: :type self.var: MyClass</b>) and properly recognizing trailing commas on automatic import.<br />
<br />
<b>Acknowledgements</b><br />
<br />
Thanks to <a href="https://github.com/oluiscabral">Luis Cabral</a>, who is now helping in the project for doing many of those improvements (and to the Patrons at <a href="https://www.patreon.com/fabioz">https://www.patreon.com/fabioz</a> which enabled it to happen).<br />
<br />Thanks for Microsoft for sponsoring the debugger improvements, which are also available in <a href="https://visualstudio.microsoft.com/vs/features/python/">Python in Visual Studio</a> and the <a href="https://marketplace.visualstudio.com/items?itemName=ms-python.python">Python Extension for Visual Studio Code</a>.<br />
<br />
Enjoy!<br />
--<br />
FabioFabio Zadroznyhttp://www.blogger.com/profile/04202246218394712738noreply@blogger.com4tag:blogger.com,1999:blog-8550962.post-6788435654885053912020-03-18T07:19:00.000-07:002020-03-18T07:19:00.008-07:00How is frame evaluation used in pydevd?<b>First some background in frame evaluation:</b><br />
<br />
Since Python 3.6, CPython has a mechanism which allows clients to override how it evaluates frames. This is done by changing <b>PyThreadState.interp.eval_frame</b> to a different C-function (the default being <b>_PyEval_EvalFrameDefault</b>). See: <a href="https://github.com/fabioz/PyDev.Debugger/blob/pydev_debugger_1_9_0/_pydevd_frame_eval/pydevd_frame_evaluator.pyx#L370">pydevd_frame_evaluator.pyx#L370</a> in pydevd (note that <a href="https://cython.org/">Cython</a> is used there).<br />
<br />
Note that this affects the Python runtime globally, whereas the regular Python tracing function -- set through <b>sys.settrace()</b> -- affects only the current thread (so, some of the caches for frame evaluation in pydevd are thread-local due to that).<br />
<br />
<b>How is this used in the debugger?</b><br />
<br />
Well, the debugger doesn't really want to change how Python code is executed, but, there's another interesting side effect of the frame evaluation: it's possible to change the bytecode of the frame right before it's evaluated and CPython will interpret that bytecode instead of the original bytecode of the frame.<br />
<br />
So, this works the following way: the frame evaluation function receives a <b>PyFrameObject*</b>, and at that point, the debugger checks the frame for existing breakpoints, if it has a breakpoint, it'll create a new code object which has a programmatic breakpoint (<a href="https://github.com/fabioz/PyDev.Debugger/blob/pydev_debugger_1_9_0/_pydevd_frame_eval/pydevd_frame_evaluator.pyx#L234">pydevd_frame_evaluator.pyx#L234</a>) and change <b>PyFrameObject.f_code</b> to point to the new code object (<a href="https://github.com/fabioz/PyDev.Debugger/blob/pydev_debugger_1_9_0/_pydevd_frame_eval/pydevd_frame_evaluator.pyx#L358">pydevd_frame_evaluator.pyx#L358</a>) -- when it reaches the programmatic breakpoint (<a href="https://github.com/fabioz/PyDev.Debugger/blob/pydev_debugger_1_9_0/_pydevd_frame_eval/pydevd_frame_tracing.py#L34">pydevd_frame_tracing.py#L34</a>), the regular (trace-based) debugger will kick in at that frame. Until that breakpoint is reached, frames are executed at full speed.<br />
<br />
<b>But if it runs at full speed, why is my program still running slower when using pydevd with frame evaluation?</b><br />
<br />
Well, frames are executed at full speed, but, the debugger still adds some overhead at function calls (when it decides whether to add the programmatic breakpoint) and it also needs to add an <b>almost no-op trace</b> (<a href="https://github.com/fabioz/PyDev.Debugger/blob/pydev_debugger_1_9_0/_pydevd_frame_eval/pydevd_frame_evaluator.pyx#L95">pydevd_frame_evaluator.pyx#L95</a>) function to <b>sys.settrace</b> -- which makes function calls slower too (this is needed because otherwise the debugger is not able to switch to the regular tracing by just changing the <b>frame.f_trace</b> as <b>frame.f_trace</b> is only checked when a tracing function is set for some thread through <b>sys.settrace()</b>). There are also some cases where it can't completely skip tracing for a frame even if it doesn't have a breakpoint (for instance, when it needs to break on caught exceptions or if it's stepping in the debugger).<br />
<br />
It's interesting to note that even the regular (tracing) debugger on pydevd can run frames at full speed (it evaluates all frames and if a frame doesn't have a breakpoint the tracing for that frame will be skipped), the difference is that if a frame does have a breakpoint, that frame can run at full speed until it reaches the breakpoint in the frame eval mode, whereas in the regular mode each new <b>line </b>tracing event would need to be individually checked for a breakpoint.<br />
<br />
<b>If it just changes the bytecode, why use frame eval at all, can't you just change the bytecode of objects at a custom import hook? </b>(which could have the benefit of avoiding the performance penalty of checking the frame on each new frame call)<br />
<br />
There are 2 main reasons for that: the 1st is that breakpoints can change and when they change the frame evaluation would need to be completely shut down and only the tracing debugger would be valid from that point onwards (whereas right now, if breakpoints change, the tracing debugger kicks in for all the frames that were currently running but the frame evaluation debugger can still be used for new frames). The 2nd is that it can be hard to consistently do that if not just before frame evaluation (because user code can also change a method code and there are a number of corner cases to change the bytecode for live objects -- think of a function inside a function or decorated functions).<br />
<br />
Note that this means that the debugger could probably get away with something simpler than frame evaluation and could potentially be applicable to other Python implementations (say, a different callback just before the frame is evaluated which allows to change the frame code... unfortunately it can't currently be done through the "<b>call</b>" event received by the trace function set by <b>sys.settrace</b> because at that point the frame is already being evaluated with the current code and at that point, even if it's changed, Python won't pick up that change).<br />
<br />
That's it, hope you enjoyed pydevd using frame evaluation for debugging purposes 101 ;)<br />
<br />
<br />
<br />
<br />
<br />Fabio Zadroznyhttp://www.blogger.com/profile/04202246218394712738noreply@blogger.com0tag:blogger.com,1999:blog-8550962.post-32264940529533814982020-01-10T10:05:00.000-08:002020-01-10T10:05:13.643-08:00PyDev 7.5.0 Released (Python 3.8 and Cython)<div style="text-align: justify;">
PyDev 7.5.0 is now available for download.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
The major changes in this release are Python 3.8 support and improved Cython parsing.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Python 3.8 should've been in 7.4.0 (but because of an oversight on my part during the build it wasn't, so, this release fixes that). </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
As for the Cyhon AST, Cython is now parsed using Cython itself (so, it needs to be installed and available in the default interpreter for PyDev to be able to parse it). The major issue right now is that the parser is not fault tolerant (this means that for code-completion and code-analysis to kick in the code needs to be syntax-correct, which is a problem when completing for instance variables right after a dot).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Fixing that in Cython seems to be trivial (https://github.com/cython/cython/issues/3303), but I'm still waiting for a signal that it's ok to add that support to make Cython parsing fault-tolerant.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Enjoy!</div>
Fabio Zadroznyhttp://www.blogger.com/profile/04202246218394712738noreply@blogger.com2tag:blogger.com,1999:blog-8550962.post-5278762635100135932019-03-27T06:39:00.000-07:002019-03-27T06:39:01.296-07:00PyDev 7.2.0 releasedPyDev 7.2.0 is now available for download.<br />
<br />
This version brings some improvements to the debugger and a fix for when PyDev could not properly find pipenv which could impact some users.<br />
<br />
See: <a href="http://pydev.org/">http://pydev.org</a> for more details. Fabio Zadroznyhttp://www.blogger.com/profile/04202246218394712738noreply@blogger.com4tag:blogger.com,1999:blog-8550962.post-52412332061306274252018-11-09T05:17:00.003-08:002018-11-09T05:17:42.260-08:00PyDev 7.0 (mypy, black, pipenv, faster debugger)<div style="text-align: justify;">
PyDev 7.0 (actually, PyDev 7.0.3 after some critical bugfixes on 7.0.0) is now available.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Some of the improvements available in this version include:</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b><a href="http://mypy-lang.org/">Mypy</a> </b>may be used as an additional backend for code analysis (see the preferences in the <b><span style="background-color: #eeeeee;">Preferences > PyDev > Editor > Code Analysis > Mypy</span></b>). It is is similar to the <b>PyLint </b>integration, and will run <b>Mypy </b>whenever a file is saved in the editor.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b><a href="https://black.readthedocs.io/en/stable/">Black</a> </b>can be used as the code-formatting engine (so, it's now possible to choose between the PyDev formatter, autopep8 or Black).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b><a href="https://pipenv.readthedocs.io/en/latest/">pipenv</a> </b>may be used for managing virtual environments (so, when creating a new project, clicking to configure an interpreter not listed will present an option to create a new interpreter with pipenv).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Improvements managing interpreters: it's now possible to manage interpreters directly from the editor (so, for instance, doing <b><span style="background-color: #eeeeee;">ctrl+2 pip install django</span></b> will use pip to install django in the interpreter related to the opened editor -- and it's possible to change pip for <b><span style="background-color: #eeeeee;">conda</span> </b>or <b><span style="background-color: #eeeeee;">pipenv</span> </b>too).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b>Debugger improvements</b></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
The debugger is much faster for Python 3.6 onwards (when cython compiled extensions are available).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
The performance improvement on the debugger is due to the using the frame eval mode for breakpoints again.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
To give some history, that mode was previously disabled on <a href="https://github.com/fabioz/pydev.debugger">pydevd</a> because it had some issues which made function calls much slower (even though line stepping was zero overhead), but in the end, that overhead could make the performance worse than just using the plain tracing mode. Also, it had a big memory leak and in the cases where the tracing mode had to be reenabled both modes would be active at the same time and performance would suffer quite a bit.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
-- all of those should be fixed and it should now perform better or at least on par with the tracing mode with cython in all scenarios... if you like numbers, see: <a href="https://github.com/fabioz/PyDev.Debugger/blob/master/tests_python/performance_check.py#L193">https://github.com/fabioz/PyDev.Debugger/blob/master/tests_python/performance_check.py#L193</a> for some benchmarks.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
p.s.: the improvements in the Debugger were sponsored by Microsoft, as the <a href="https://github.com/fabioz/pydev.debugger">PyDev Debugger</a> is used as the core of <a href="https://github.com/Microsoft/ptvsd/">ptvsd</a>, the Python debugger package used by <a href="https://visualstudio.microsoft.com/vs/features/python/">Python in Visual Studio</a> and the <a href="https://marketplace.visualstudio.com/items?itemName=ms-python.python">Python Extension for Visual Studio Code</a>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
</div>
Fabio Zadroznyhttp://www.blogger.com/profile/04202246218394712738noreply@blogger.com0tag:blogger.com,1999:blog-8550962.post-23015635116528344812018-09-03T11:26:00.002-07:002018-09-03T11:26:38.588-07:00PyDev 6.5.0 (#region code folding)<div style="text-align: justify;">
PyDev 6.5.0 is now available for download.</div>
<div style="text-align: justify;">
<br /></div>
There are some nice features and fixes available in this release:<ul>
<li><b>#region / #endregion</b> comments can now be used by the code-folding engine. </li>
</ul>
<ul>
<li>An action to easily switch the default interpreter is now available (default binding: <b>Ctrl+Shift+Alt+I</b> -- note that it must be executed with an opened editor). </li>
</ul>
<ul>
<li>It's possible to create local imports from global imports (use <b>Ctrl+1</b> on the name of a given global import and select "<b>Move import to local scope(s)</b>" -- although note that the global import needs to be manually deleted later on). </li>
</ul>
<ul>
<li>The interactive interpreter now has scroll-lock. </li>
</ul>
<ul>
<li>The debugger is much more responsive!</li>
</ul>
<div style="text-align: justify;">
See: <a href="http://www.pydev.org/">http://www.pydev.org</a> for more details.</div>
Fabio Zadroznyhttp://www.blogger.com/profile/04202246218394712738noreply@blogger.com2tag:blogger.com,1999:blog-8550962.post-66625634062975165742018-08-13T12:19:00.000-07:002018-08-13T12:19:14.864-07:00Profiling pytest startup<div style="text-align: justify;">
I'm a fan of pytest (<a href="http://www.pytest.org/">http://www.pytest.org</a>), yet, it seems that the startup time for running tests locally in the app I'm working on is slowly ramping up, so, I decided to do a profile to see if there was anything I could do to improve that.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
The first thing I did was creating a simple test and launching it from the PyDev (<a href="http://www.pydev.org/">http://www.pydev.org/</a>) profile view -- it enables any launch done in PyDev to show its performance profile on PyVmMonitor (<a href="https://www.pyvmmonitor.com/">https://www.pyvmmonitor.com</a>).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Note that this is an integration test that is starting up a big application, so, the total time just to startup all the fixtures which make the application live and shut down the fixtures is 15 seconds (quite a lot IMHO).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
The first thing I noticed looking the profile is that 14% of that time seems to be creating a session temp dir:</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-yRKZ3uNeiQM/W3HMB6Jo45I/AAAAAAAAJTM/hP1MJ5S29XwyDqiRYX8zm6EHNJDp7S_9QCLcBGAs/s1600/img0.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="777" data-original-width="313" height="640" src="https://3.bp.blogspot.com/-yRKZ3uNeiQM/W3HMB6Jo45I/AAAAAAAAJTM/hP1MJ5S29XwyDqiRYX8zm6EHNJDp7S_9QCLcBGAs/s640/img0.png" width="256" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
After investigating a bit more it seems that there is a problem in the way the fixture used make_numbered_dir (it was passing a unicode when it should be a str on Python 2) and make_numbered_dir had an issue where big paths were not removed.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
So, pytest always visited my old files every time I launched any test and that accounted for 1-2 seconds (I reported this particular error in: <a href="https://github.com/pytest-dev/pytest/issues/3810">https://github.com/pytest-dev/pytest/issues/3810</a>).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Ok, down from 15 to 13 seconds after manually removing old files with big paths and using the proper API with str on Py2.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Now, doing a new profile with that change has shown another pytest-related slowdown doing rewrites of test cases. </div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-y41SXOUcrv4/W3HOHP3DbfI/AAAAAAAAJTY/_eS2QOMXec8iatoJq0hgImo1d42oqhTxgCLcBGAs/s1600/img1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="719" data-original-width="862" height="531" src="https://4.bp.blogspot.com/-y41SXOUcrv4/W3HOHP3DbfI/AAAAAAAAJTY/_eS2QOMXec8iatoJq0hgImo1d42oqhTxgCLcBGAs/s640/img1.png" width="640" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
This is because of a feature of pytest where it'll rewrite test files to provide a prettier stack trace when there's some assertion failure.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
So, I passed <b>--assert=plain</b> to pytest and got 3 more seconds (from 13 down to 10) -- it seems all imports are a bit faster with the import rewrite disabled, so, I got an overall improvement there, not only in that specific part of the code (probably not nice on CI where I want to have more info, but seems like a nice plus locally, where I run many tests manually as I think the saved time for those runs will definitely be worth it even with less info when some assertion fails).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Now, with that disabled the next culprit seems to be getting its plugins to load:</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/--mpSwmmvbyU/W3HRWWaNmSI/AAAAAAAAJTk/U-hTEi3zgK8aT6CSgwYioNpepz7hH-STgCLcBGAs/s1600/img2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="262" data-original-width="697" height="240" src="https://4.bp.blogspot.com/--mpSwmmvbyU/W3HRWWaNmSI/AAAAAAAAJTk/U-hTEi3zgK8aT6CSgwYioNpepz7hH-STgCLcBGAs/s640/img2.png" width="640" /></a></div>
<div style="text-align: justify;">
</div>
<br />
<br />
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
But alas, it uses setuptools and I know from previous experience that it's very hard to improve that (it is very greedy in the way it handles loading metadata, so, stay away unless you're ok in wasting a lot of time on your imports) and the remainder of the time seems to be spread out importing many modules -- the app already tries to load things as lazy as possible... I think I'll be able to improve on that to delay some imports, but Python libraries are really hard to fix as everyone imports everything in the top of the module.</div>
<br />
Well, I guess going from 15 s to 10 s with just a few changes is already an improvement in my case for an integrated tests which starts up the whole app (although it could certainly be better...) and I think I'll still be able to trim some of that time doing some more imports lazily -- although that's no longer really pytest-related, so, that's it for this post ;)<br />
<br />
Fabio Zadroznyhttp://www.blogger.com/profile/04202246218394712738noreply@blogger.com0tag:blogger.com,1999:blog-8550962.post-28957707504421070042018-07-06T04:37:00.000-07:002018-07-06T04:37:18.585-07:00PyDev 6.4.3 (code formatter standalone, debugger improvements and f-strings handling)The latest version of PyDev is now out... <br /><br />Major changes in this release include:<br /><br />1. Being able to use the PyDev code formatter as a standalone tool.<br /><br />To use it it's possible to install it as <b><span style="background-color: #eeeeee;">pip install pydevf</span></b> (the command line is provided as a python library which will call the actual formatter from PyDev -- see the README at <a href="https://github.com/fabioz/PyDev.Formatter">https://github.com/fabioz/PyDev.Formatter</a> for more details on how to use it). <br /><br />The target of the PyDev formatter is trying to keep as close to the original structure of the code while fixing many common issues (so, it won't try to indent based on line width but will fix many common issues such as a space after a comma, space at start of comment, blank lines among methods and classes, etc).<br /><br />2. Improvements to the debugger, such as:<br /><ul>
<li>Thread creation is notified as threads are created instead of synchronized afterwards.</li>
<li>Support for using frame evaluation disabled by default as it made the debugger much slower on some cases.</li>
<li>Fixed case where breakpoint was missed if an exception was raised in a given line.</li>
<li>Properly break on unhandled exceptions on threads.</li>
<li>Add missing import which affected repl with IPython.</li>
<li>Fix for case where breakpoints could be missed.</li>
</ul>
<br />As a note, the debugger improvements have been sponsored by Microsoft, which is in the process of using the <a href="https://github.com/fabioz/pydev.debugger">PyDev Debugger</a> as the core of <a href="https://github.com/Microsoft/ptvsd/">ptvsd</a>, the Python debugger package used by <a href="https://visualstudio.microsoft.com/vs/features/python/">Python in Visual Studio</a> and the <a href="https://marketplace.visualstudio.com/items?itemName=ms-python.python">Python Extension for Visual Studio Code</a> (note that it's still marked as experimental there as it's in the process of being integrated into ptvsd).<br /><br /> It's really nice to see <span style="background-color: #eeeeee;"><b>pydevd </b></span>being used in more IDEs in the Python world! 😉<br /><br />Besides those, there are some bugfixes in handling f-strings and sending the contents of the current line to the console (through <span style="background-color: #eeeeee;"><b>F2</b></span>).<br /><br />Also, a new major version of <a href="http://www.liclipse.com/">LiClipse</a> (5.0) is now also available (see: <a href="http://www.liclipse.com/download.html">http://www.liclipse.com/download.html</a> for how to get it). It includes the latest PyDev and a new major Eclipse release (4.8 - Photon).Fabio Zadroznyhttp://www.blogger.com/profile/04202246218394712738noreply@blogger.com0tag:blogger.com,1999:blog-8550962.post-69719507114887468312018-05-12T08:39:00.000-07:002018-05-12T08:39:18.671-07:00Howto launch and debug in VSCode using the debug adapter protocol (part 2)<div style="text-align: justify;">
Ok, after the basic infracstructure, the next thing to do is actually launch some program without worrying about the debugger, so, we'll just run a program without being in debug mode to completion, show its output and terminate it when requested.<br /><br />To launch a program, our debug adapter must treat the '<b>LaunchRequest</b>' message and actually run the program (bear in mind that we'll just launch it without doing any debugging at this point).<br /><br />The first point then is how to actually launch it. We provided options for the debugger to be launched with different console arguments specifying where to launch it (either just showing output to the debug console, using the integrated terminal or using an external terminal).<br /><br />So, let's start with just showing output in the debug console.<br /><br />Launching it should be simple: just generate a command line while treating the '<b>LaunchRequest</b>' message, but then, based on the console specified some things may be different...<br /><br />Let's start handling just showing the output on the debug console.<br /><br />To do that we have launch the command properly redirecting the output to pipes (for python it's something as <b>subprocess.Popen([sys.executable, '-u', file_to_run], stdout=subprocess.PIPE, stderr=subprocess.PIPE)</b> and then create threads which will read that output to provide it back to vscode (so, when output is obtained, an <b>OutputEvent</b> must be given).<br /><br />Also, create another thread so that when the process finishes, a <b>TerminatedEvent</b> is given (in python, just do a <b>popen.wait()</b> in a thread and when complete send the <b>TerminatedEvent</b> -- you may want to synchronize to make sure other threads related to output have finished before doing that).<br /><br />At this point, we can run something and should be able to see anything printed both to <b>stdout</b> and <b>stderr</b> and when the process finishes, VSCode itself acknowledges that and closes the related controls. <br /><br />Great! On to launching in the integrated terminal!<br /><br />So, to launch in the terminal we have to first actually check if the client does support running in the terminal... in the <b>InitializeRequest</b>, if it is supported, we should've received in the arguments <b>"supportsRunInTerminalRequest": True</b> (if it doesn't, in my case I just fall back to the debug console).<br /><br />This also becomes a little bit trickier because at this point we're the ones doing the request (<b>RunInTerminalRequest</b>) and the client should send a response (<b>RunInTerminalResponse</b>). So, on to it: when the client launches, create a <b>RunInTerminalRequest</b> with the proper kind ('<b>internal</b>' or '<b>external</b>') and wait for the response.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
At this point, the <b>processId</b> may not actually be available after launching in that mode (the <b>RunInTerminalResponse processId</b> is optional), which means that if we didn't really create a debugger (just a simple run), we're blind... we could do another program to launch it and return the <b>pid</b> to be able to notify that it was stopped and to kill it when needed, but this seems a bit overkill for me and I couldn't find any info on the proper behavior here, so, I decided that when the user chooses that mode with '<b>noDebug</b>' I'll simply notify that the debug session is finished for the adapter with a <b>TerminatedEvent </b>(and the user can see the output and <b>Ctrl+C</b> it in the actual terminal).<br /><br />As a note the '<b>noDebug</b>' option is added behind the scenes by VSCode depending on whether the user has chosen to do a debug or run for the selected launch (so, it shouldn't be a part of the declared configuration in the extension).<br /><br />Now, thinking a bit more about it, there's a caveat: when launching with the redirection to the debug console, we should treat sending to <b>stdin</b> too (we don't want to create a process he can't do any communication with later on).<br /><br />To do that in '<b>noDebug</b>' should be simple... when we receive an '<b>EvaluateRequest'</b>, we'll send it to <b>stdin</b> (when actually in debug mode we probably have to check the current debugger state to determine if we want to do an evaluation or send to <b>stdin</b> -- i.e.: if we are stopped in a breakpoint we may want to evaluate and not send to <b>stdin</b>).<br /><br />As a note, after playing with it more I renamed the "<b>console</b>" option to "<b>terminal</b>" with options <b>"none", "internal", "external"</b> as I think that's a better representation of what's expected.<br /><br />So, that's it for part 2: we're launching a program and redirecting the output as requested by the user (albeit without actually debugging it for now).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
The related code may be seen at: <a href="https://github.com/fabioz/python_debug_adapter_tutorial/tree/master/part2">https://github.com/fabioz/python_debug_adapter_tutorial/tree/master/part2</a></div>
Fabio Zadroznyhttp://www.blogger.com/profile/04202246218394712738noreply@blogger.com0tag:blogger.com,1999:blog-8550962.post-73868374143827458262018-05-09T05:11:00.000-07:002018-05-09T05:11:14.632-07:00Howto launch and debug in VSCode using the debug adapter protocol (part 1)<div style="text-align: justify;">
This is a walkthrough with the steps I'm taking to add support to launch and debug a Python script in <a href="http://www.pydev.org/vscode/">PyDev for VSCode</a> (note that I'm writing as I'm learning).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
The debugger protocol is the protocol used in VSCode to talk to debuggers and handle launching in general (the naming may be a bit weird as the same protocol is used for regular launches and debugging, but apparently the team first did the debugging and then launching came as an afterthought just passing a separate flag during the launching of the program to specify that no debugging should be done -- and not the other way around as I think would be more common).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
There is an overview of the protocol at <a href="https://code.visualstudio.com/docs/extensionAPI/api-debugging">https://code.visualstudio.com/docs/extensionAPI/api-debugging</a> and <a href="https://code.visualstudio.com/docs/extensionAPI/extension-points">https://code.visualstudio.com/docs/extensionAPI/extension-points</a> provides more information on what an extension must use to provide a debugger.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
There's also a json schema which specifies the format of the messages sent back and forth in the debugger at <a href="https://raw.githubusercontent.com/Microsoft/vscode-debugadapter-node/master/debugProtocol.json">https://raw.githubusercontent.com/Microsoft/vscode-debugadapter-node/master/debugProtocol.json</a>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
But, after reading all that, it seems that many things are still cloudy on my head on how to actually go on about it and what should be done concretely to implement a debugger in VSCode.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
So, my approach is getting the <a href="https://raw.githubusercontent.com/Microsoft/vscode-debugadapter-node/master/debugProtocol.json">debugProtocol.json</a>, converting it to a structure with Python classes (so that each message that can be sent has a Python representation) and playing a bit doing a debugger stub, just to exercise a dummy debugger talking to VSCode (but without actually doing anything).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
It's interesting to note that the first thing to do is actually making the debugger available in the extension. For that, I've used the json below in <b>package.json</b> (as a note, my <b>package.json</b> is actually generated from Python code, so, the structure below is actually a Python dict which is later converted to json, not the actual json -- if you're doing a VSCode extension, I highly recommend generating your <b>package.json</b> and parts of the code that are related and not doing it all by hand... this way it's possible to see it in small pieces and auto generate command ids and the related code, etc... initially I haven't done so in PyDev, but as the declarative files grow, it becomes harder to follow and make changes while keeping the code and declaration in sync):</div>
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: "andale mono" , "lucida console" , "monaco" , "fixed" , monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"> <code style="color: black; word-wrap: normal;">
{
'type': 'PyDev',
'label': 'PyDev (Python)',
'languages': ['python'],
'adapterExecutableCommand': 'pydev.start.debugger',
# Note: adapterExecutableCommand will be replaced by a different API (right now still in proposal mode).
# See: https://code.visualstudio.com/updates/v1_20#_debug-api
# See: https://github.com/Microsoft/vscode/blob/7636a7d6f7d2749833f783e94fd3d48d6a1791cb/src/vs/vscode.proposed.d.ts#L388-L395
'enableBreakpointsFor': {
'languageIds': ['python', 'html'],
},
'configurationAttributes': {
'launch': {
'required': [
'mainModule'
],
'properties': {
'mainModule': {
'type': 'string',
'description': 'The .py file that should be debugged.',
},
'args': {
'type': 'string',
'description': 'The command line arguments passed to the program.'
},
"cwd": {
"type": "string",
"description": "The working directory of the program.",
"default": "${workspaceFolder}"
},
"console": {
"type": "string",
"enum": [
"integratedTerminal",
"externalTerminal"
],
"enumDescriptions": [
"VS Code integrated terminal.",
"External terminal that can be configured in user settings."
],
"description": "The specified console to launch the program.",
"default": "integratedTerminal"
},
}
}
},
"configurationSnippets": [
{
"label": "PyDev: Launch Python Program",
"description": "Add a new configuration for launching a python program with the PyDev debugger.",
"body": {
"type": "PyDev",
"name": "PyDev Debug (Launch)",
"request": "launch",
"cwd": "^\"\\${workspaceFolder}\"",
"console": "integratedTerminal",
"mainModule": "",
"args": ""
}
},
]
}
</code></pre>
<br />
<br />
<div style="text-align: justify;">
So, although there are many things there, initially we just need to make <b>adapterExecutableCommand</b> return the command to be executed (you could also create a standalone executable or something to run along with a supported vm -- such as mono, but there's nothing for python there, so, the <b>adapterExecutableCommand </b>is probably the best approach for a python debugger).<br />
</div>
<br />
In my case it's something as:<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: "andale mono" , "lucida console" , "monaco" , "fixed" , monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"> <code style="color: black; word-wrap: normal;">
commands.registerCommand('pydev.start.debugger', () => {
return {
command: "C:/bin/python27/python.exe", // paths initially hardcoded for simplicity
args: ["X:/vscode-pydev/vscode-pydev/src/debug_adapter/debugger_protocol.py"]
}
});
</code></pre>
<br />
<div style="text-align: justify;">
The <b>configurationSnippets </b>section provides the snippets which allow VSCode to autogenerate the configuration for the user and the <b>configurationAttributes </b>are actually custom for each implementation (so, those will probably need more tweaking going forward).<br />
<br />
Another interesting point is that when VSCode launches the debug adapter it'll use stdin and stdout to communicate with the adapter (this makes some things a bit quirky to develop the debugger because you have to (initially) resort to printing debug information to a file to be able to check what's happening, although on the bright side, you won't have to worry about having a firewall at that point).<br />
<br /></div>
<div style="text-align: justify;">
Also, don't forget to flush after writing messages to stdout. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Now, on to the protocol itself... I created something which would read from stdin and then redirect that to a file to see what's coming (after digging up things a bit more I found an issue in the VSCode tracker referencing: <a href="https://github.com/buggerjs/bugger-v8-client/blob/master/PROTOCOL.md">https://github.com/buggerjs/bugger-v8-client/blob/master/PROTOCOL.md</a> which details that a bit more -- although not all that's there is actually applicable to the VSCode debugger). </div>
<br />
The first message that arrives from stdin is:<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: "andale mono" , "lucida console" , "monaco" , "fixed" , monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"> <code style="color: black; word-wrap: normal;">
Content-Length: 312\r\n
\r\n
{
"arguments": {
"adapterID": "PyDev",
"clientID": "vscode",
"clientName": "Visual Studio Code",
"columnsStartAt1": true,
"linesStartAt1": true,
"locale": "en-us",
"pathFormat": "path",
"supportsRunInTerminalRequest": true,
"supportsVariablePaging": true,
"supportsVariableType": true
},
"command": "initialize",
"seq": 1,
"type": "request"
}</code></pre>
<br />
-- this is the InitializeRequest in the json schema.<br />
<br />
<div style="text-align: justify;">
So, it seems a regular http-protocol, sending json contents as the actual content... so, in response to that, the debug adapter should do its initialization and return the capabilities it has -- something as:</div>
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: "andale mono" , "lucida console" , "monaco" , "fixed" , monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"> <code style="color: black; word-wrap: normal;">
{
"seq": 1,
"request_seq": 1,
"command": "initialize",
</code><code style="color: black; word-wrap: normal;"><code style="color: black; word-wrap: normal;"> "body": {"supportsConfigurationDoneRequest": true,
</code></code><code style="color: black; word-wrap: normal;"><code style="color: black; word-wrap: normal;"><code style="color: black; word-wrap: normal;"> "supportsConditionalBreakpoints": true},
</code></code> "type": "response",
"success": true
}
</code></pre>
<br />
-- this is the InitializeResponse in the json schema.<br />
<br />
and then send and event saying that it has initialized properly:<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: "andale mono" , "lucida console" , "monaco" , "fixed" , monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"> <code style="color: black; word-wrap: normal;">
{"type": "event", "event": "initialized", "seq": 2}
</code></pre>
<br />
-- this is the InitializedEvent in the json schema.<br />
<br />
<div style="text-align: justify;">
Note that those are all http responses, so, the <b>Content-Length: $size\r\n\r\n</b> needs to be passed on each request (note that each message sent or received has a <b>seq</b>, which is a number that should be raised whenever a new message is sent -- the <b>seq</b> is raised independently on the server and on the client and responses should reference the <b>seq</b> from the request in <b>request_seq</b>). </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Afterwards, the client (VSCode) sends the actual launch request (which should be based on the <b>configurationAttributes</b> previously configured). In this case:</div>
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: "andale mono" , "lucida console" , "monaco" , "fixed" , monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"> <code style="color: black; word-wrap: normal;">
{
"arguments": {
"__sessionId": "474aa497-0a90-4b30-8cc6-edf3bebbe703",
"args": "",
"console": "integratedTerminal",
"cwd": "X:\\vscode_example",
"name": "PyDev Debug (Launch)",
"program": "X:/vscode_example/robots.py",
"request": "launch",
"type": "PyDev"
},
"command": "launch",
"seq": 2,
"type": "request"
}
</code></pre>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
-- this is the launch request in the json schema (it comes with additional attributes the user specified in the launch... each extension needs to tweak the actual parameters to its use case).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
At this point, it becomes clear that this is really just an adapter: we're expected to actually launch the process and provide the communication layer to the actual debugger (so, the debugger doesn't really have to be changed -- although on some cases that may be benefical if possible... for instance, the debugger could already give output on the variable frames as json so that the message doesn't need to be decoded and recoded in a new format). </div>
<br />
<div style="text-align: justify;">
Also, the stdin and stdout may be in use (because VSCode uses it to communicate to the debug adapter), so, it may be hard to reuse this process to be the actual debugger process (for instance, launch could then make main proceed to launch the program in this process if the debugger could directly handle the debug protocol, but then if clients managed to write to the 'real' stdin/stdout handles, the debugger would stop working). </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
The launch request just requires a notification that the program was launched, so, the response would be a launch response with an empty body (or if there was some error -- say, the file to be launched no longer exists -- a "message" could be set and "success" could be False). </div>
<div style="text-align: justify;">
<br /></div>
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: "andale mono" , "lucida console" , "monaco" , "fixed" , monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"> <code style="color: black; word-wrap: normal;">
{
"request_seq": 2,
"command": "launch",
"body": {},
"type": "response",
"success": true
}
</code></pre>
<br />
-- this is the LaunchResponse in the json schema.<br />
<br />
<div style="text-align: justify;">
Ok, now, at this point I already have a structure which parses the json and creates python instances for each protocol message (and vice-versa), so, instead of specifying each message in its full format, I'll just reference it from the identifier on the schema instead of the actual json. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
After the launch request, I get a <b>ConfigurationDoneRequest</b> and return the proper <b>ConfigurationDoneResponse</b> and for the <b>ThreadsRequest</b> a <b>ThreadsResponse</b>.</div>
<div style="text-align: justify;">
At this point, the debugger will sit idle, waiting for actions from the user or events from our debug adapter (if more than one thread was returned in the <b>ThreadsResponse</b>, the threads will appear in the <b>CallStack</b>).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Now, the only thing different at this point is that the debug controls will appear, so, a pause or stop can be activated from the UI.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Pressing stop will send us a <b>DisconnectRequest</b> (for which a <b>DisconnectResponse</b> should be sent as an acknowledgement) and the pause will send a <b>PauseRequest</b> (which requires us to send back a <b>PauseResponse</b> -- and after a thread is actually paused, a <b>StoppedEvent</b> should be sent). </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Ok, this is the end of part 1 (we have something which can be started and later stopped -- without actually doing anything, so, pretty much a mock debugger)... This actually took me 2 full days to implement (most of the work trying to wrap my head around how things worked and generating python code from the json schema -- I tried some libraries and none of them worked as I needed, so, I rolled my own here). </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
My main gripe was the lack of a better documentation on how to approach doing a debug protocol from scratch and how it should work. For instance, it took me quite a while to find a reference to launching from the <b>adapterExecutableCommand</b> where I could construct a command line -- initial references I found pointed only to using an executable or a supported runtime such as mono -- some things I still don't know how to handle such as how to actually provide output based on the console type the user expects: (i.e.: <b>integratedTerminal</b>, <b>externalTerminal</b>) -- anyways, hope to get to that in the upcoming parts... </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
The final code I have at this point (which also contains the code generator I did) may be seen at:</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<a href="https://github.com/fabioz/python_debug_adapter_tutorial/tree/master/part1">https://github.com/fabioz/python_debug_adapter_tutorial/tree/master/part1</a> </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Part 2 should get us to the point of actually launching a process...</div>
Fabio Zadroznyhttp://www.blogger.com/profile/04202246218394712738noreply@blogger.com0tag:blogger.com,1999:blog-8550962.post-21191864112384677882018-03-21T11:35:00.004-07:002018-03-21T11:35:59.688-07:00PyDev 6.3.2: support for .pyi filesPyDev 6.3.2 is now available for download.<br />
<br />
<div style="text-align: justify;">
The main change in this release is that PyDev will now consider <b>.pyi</b> (stub) files when doing type inference, although there's still a shortcoming: the <b>.pyi</b> file must be in the same directory where the typed <b>.py</b> file is and it's still not possible to use it to get type inference for modules which are compiled (for instance PyQt).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
I hope to address that in the next release (initially I wanted to delay this release to add full support for <b>.pyi</b> files, but there was a critical bug opening the preferences page for code completion, so, it really couldn't be delayed more, nevertheless, the current support is already useful for users using <b>.pyi</b> files along <b>.py</b> files).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Also, code completion had improvements for discovering whether some call is for a bound or unbound method and performance improvements (through caching of some intermediary results during code completion).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Enjoy!</div>
Fabio Zadroznyhttp://www.blogger.com/profile/04202246218394712738noreply@blogger.com0tag:blogger.com,1999:blog-8550962.post-59327005534494225872018-03-01T03:48:00.001-08:002018-03-01T03:48:34.729-08:00PyDev 6.3.1 (implicit namespace packages and Visual Studio Code support)<div style="text-align: justify;">
The major change in this release is that PyDev now recognizes that folders no longer require <b>__init__.py</b> files to be considered a package (<b>PEP 420</b>).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Although this is only available for Python 3.3 onwards, PyDev will now always display valid folders under the <b>PYTHONPATH </b>as if they were packages.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
There were also some improvements, such as recognizing that dlls may have a postfix (so that dlls for multiple versions of Python may be available in the same folder) and a number of bugfixes (see: <a href="http://www.pydev.org/">http://www.pydev.org</a> has more details).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Besides those, a good amount of work in this release was refactoring the codebase so that PyDev could also be available as a language server for Python, to enable it to be used on Visual Studio Code (<a href="http://www.pydev.org/vscode">http://www.pydev.org/vscode</a>), so, Visual Studio Code users can now also use many of the nice features on PyDev ;)</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Enjoy!</div>
Fabio Zadroznyhttp://www.blogger.com/profile/04202246218394712738noreply@blogger.com0tag:blogger.com,1999:blog-8550962.post-38735896551323040222018-02-19T03:10:00.000-08:002018-02-19T03:10:38.282-08:00Python with PyDev on Visual Studio Code<div style="text-align: justify;">
<b><a href="http://www.pydev.org/vscode">PyDev</a></b> can now be used for Python development on <b><a href="https://code.visualstudio.com/">Visual Studio Code</a></b>!</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
The first release already provides features such as code analysis, code completion, go to definition, symbols for the workspace and editor, code formatting, find references, quick fixes and more (see <a href="http://www.pydev.org/vscode/">http://www.pydev.org/vscode/</a> for details).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
All features have a strong focus on speed and have been shaped by the usage on <b>PyDev </b>over the last <b>14 years</b>, so, I believe it's already pretty nice to use... there are still some big things to integrate (such as the PyDev debugger), but those should come on shortly.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
The requisites are having <b>java 8</b> (or higher) installed on the system (if it doesn't find it automatically the java home location may need to be specified in the settings -- <a href="http://www.pydev.org/vscode/">http://www.pydev.org/vscode/</a> has more details) and <b>Python 2.6 or newer</b>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
By default it should pick the python executable available on the <b>PATH</b>, but it's possible to specify a different <b>python executable</b> through the settings on <b>VSCode </b>(see <a href="http://www.pydev.org/vscode/settings.html">http://www.pydev.org/vscode/settings.html</a> for details).</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Below, I want to share some of the things that are unique in <b>PyDev </b>and are now available for <b>VSCode </b>users:</div>
<ul style="text-align: justify;">
<li>Niceties from <b>PyDev </b>when typing such as auto-adding <b>self</b> where needed (note that having the <b>editor.formatOnType </b>setting turned on is a requisite for that to work).</li>
<li>Really fast code-completion, code-analysis and code-formatting engines. </li>
<li>Code completion provides options to import modules, top level classes, methods and variables (<b>python.pydev.preferredImportLocation </b>can be used to determine the location of the import).</li>
<li><b>Quick fix</b> which automatically allows adding an import for <b>unresolved symbols</b>.</li>
<li>In-file navigation to previous or next class or method through <b>Ctrl+Shift+Up</b> and <b>Ctrl+Shift+Down</b>.</li>
</ul>
<div style="text-align: justify;">
Now, the extension itself is not currently open source as PyDev... my target is making the best Python development environment around and all earnings will go towards that (as a note, all improvements done to PyDev itself will still be open source, so, most earnings from <b>PyDev on VSCode</b> will go toward open source development).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Enjoy!</div>
Fabio Zadroznyhttp://www.blogger.com/profile/04202246218394712738noreply@blogger.com3tag:blogger.com,1999:blog-8550962.post-60215314103341484562017-12-04T03:07:00.000-08:002017-12-04T06:20:14.269-08:00Creating extension to profile Python with PyVmMonitor from Visual Studio CodeOk, so, the target here is doing a simple extension with Visual Studio Code which will help in profiling the current module using PyVmMonitor (<a href="http://www.pyvmmonitor.com/">http://www.pyvmmonitor.com/</a>).<br />
<br />
The extension will provide a command which should open a few options for the user on how he wants to do the profile (with <a href="https://bitbucket.org/sumerc/yappi/">yappi</a>, cProfile or start without profiling but connected with the live sampling view).<br />
<br />
I went with <a href="https://code.visualstudio.com/docs/extensions/yocode">https://code.visualstudio.com/docs/extensions/yocode</a> to bootstrap the extension, which gives a template with a command to run then renamed a bunch of things (such as the extension name, description, command name, etc).<br />
<br />
Next was finding a way to ask the user for the options (to ask how the profile should be started). Searching for it revealed <a href="https://tstringer.github.io/nodejs/javascript/vscode/2015/12/14/input-and-output-vscode-ext.html">https://tstringer.github.io/nodejs/javascript/vscode/2015/12/14/input-and-output-vscode-ext.html</a>, so, I went with creating the needed constants and going with <b>vscode.window.showQuickPick</b> (experimenting, undefined is returned if the user cancel the action, so, that needs to be taken into account too).<br />
<br />
Now, after the user chooses how to start PyVmMonitor, the idea would be making any launch actually start in the chosen profile mode (which is how it works in PyDev).<br />
<br />
After investigating a bit, I couldn't find out how to intercept an existing launch to modify the command line to add the needed parameters for profiling with PyVmMonitor, so, this integration will be a bit more limited than the one in PyDev as it will simply create a new terminal and call PyVmMonitor asking it to profile the currently opened module... <br />
<br />
In the other integrations, it was done as a setting where the user selected that it wanted to profile any python launch from a given point onward as a toggle and then intercepted launches changing the command line given, so, for instance, it could intercept a unittest launch too, but in this case, it seems that there's currently no way to do that -- or some ineptitude on my part finding an actual API to do it ;)<br />
<br />
Now, searching on the VSCode Python plugin, I found a "function <b>execInTerminal</b>", so, I based the launching in it (but not using its settings as I don't want to add a dependency on it for now, so, I just call `python` -- if that's wrong, as it opens a shell, the user is free to cancel that and correct the command line to use the appropriate python interpreter or change it as needed later on).<br />
<br />
Ok, wrapping up: put the initial version of the code on <a href="https://github.com/fabioz/vscode-pyvmmonitor">https://github.com/fabioz/vscode-pyvmmonitor</a>. Following <a href="https://code.visualstudio.com/docs/extensions/publish-extension">https://code.visualstudio.com/docs/extensions/publish-extension</a> did work out, so, there's a "<b>Profile Python with PyVmMonitor</b>" extension now ;).<br />
<br />
Some notes I took during the process related to things I stumbled on or found awkard:<br />
<ul>
<li>After publishing the first time and installing, the extension wasn't working because I wrongly put a dependency from <b>npm </b>in "<b>devDependencies</b>" and not in "<b>dependencies</b>" (the console in the developer tools helped in finding out that the dependency wasn't being loaded after the extension was installed).</li>
<li>When a dependency is added/removed, npm install needs to be called again, it's not automatic.</li>
<li>When uploading the extension I had the (common) error of not generating a token for "all" ;)</li>
<li>Apparently there's a "String" and a "string" in TypeScript (or at least within the dependencies when editing VSCode).</li>
<li>The whole launching on VSCode seems a bit limited/ad-hoc right now (for instance, .launch files create actual launchers which can be debugged but the python extension completely bypasses that by doing a launch in terminal for the current file -- probably because it's a bit of a pain creating that .launch file) -- I guess this reflects how young VSCode is... on the other hand, it really seems it built upon previous experience as the commands and bindings seems to have evolved directly to a good design (Eclipse painfully iterated over several designs on its command API).</li>
<li>Extensions seem to be limited by design. I guess this is good and bad at the same time... good that extensions should never slow down the editor, but bad because they are not able to do something which is not in the platform itself to start with -- for instance, I really missed a good unittest UI when using it... there are actually many other things I missed from PyDev, although I guess this is probably a reflect on how young the platform is (and it does seem to be shaping up fast).</li>
</ul>
Fabio Zadroznyhttp://www.blogger.com/profile/04202246218394712738noreply@blogger.com0tag:blogger.com,1999:blog-8550962.post-33215526406806568992017-11-29T16:23:00.000-08:002017-11-29T16:23:26.342-08:00PyDev 6.2.0: Interactive Console word wrapping, pytest hyperlinking<div style="text-align: justify;">
PyDev 6.2.0 is mostly a bugfix release, although it does bring some features to the table to such as adding the possibility of activating word-wrapping in the console and support for code-completion using the Python 3.6 variable typing.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Another interesting change is that pytest filenames are properly hyperlinked in the console (until now PyDev resorted to mocking some functions of pytest so that when it printed exceptions it used the default Python traceback format -- now that's no longer done).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
See: <a href="http://www.pydev.org/">http://www.pydev.org</a> for complete details.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
p.s.: Thank you to all PyDev supporters -- <a href="https://www.brainwy.com/supporters/PyDev">https://www.brainwy.com/supporters/PyDev</a>-- which enable PyDev to keep on being improved!</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
p.s.: LiClipse 4.4.0 already bundles PyDev 6.2.0, see: <a href="http://www.liclipse.com/download.html">http://www.liclipse.com/download.html</a> for download links.</div>
Fabio Zadroznyhttp://www.blogger.com/profile/04202246218394712738noreply@blogger.com0tag:blogger.com,1999:blog-8550962.post-50601771200968090052017-11-07T02:37:00.001-08:002017-11-07T02:37:56.704-08:00PyDev 6.1.0: dealing with blank lines in code formatter<div style="text-align: justify;">
<b>PyDev </b>6.1.0 is now available for download. The major change in this release is in the code formatter, which can now deal with adding or removing <b>blank lines</b> so that code can properly conform to <b>pep-8</b>, besides having a number bugs fixed (see <a href="http://www.pydev.org/">http:///www.pydev.org</a> for more details).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Now, why use the PyDev code formatter at all when there are so many other options available? (i.e.: <b>autopep8, yapf, PythonTidy -- </b>and autopep8 is even already included by default in PyDev) </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Well, the PyDev code formatter is unique in that it tries to do as few changes as possible to the code, so, it tries to conform to the coding format that the programmer uses, just fixing few (usually obvious) issues, such as spaces after comma, spaces in comments, operators or right-trimming lines, with an option to actually only fix only the lines actually changed.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
-- for actually changing the indentation of statements or comments, PyDev has options which can be manually activated, such as wrap or unwrap statement -- through <b>Ctrl+1, wrap statement</b> or <b>Ctrl+1, unwrap statement</b> in the line which has the contents to be wrapper or unwrapped or <b>Ctrl+2, w </b>to wrap comments -- see: <a href="http://pydev.blogspot.com.br/2015/04/wrapping-docstringscomments-in-pydev.html">http://pydev.blogspot.com.br/2015/04/wrapping-docstringscomments-in-pydev.html</a>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Also, the PyDev code formatter is pretty fast, so, I don't have issues in letting the option to autoformat on save turned on (speed is the main reason why I added such a feature to the PyDev code formatter instead of going with autopep8 or integrating another code formatting tool).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
So, that's it, enjoy!</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
p.s.: Thank you to all PyDev supporters -- <a href="https://www.brainwy.com/supporters/PyDev/">https://www.brainwy.com/supporters/PyDev/</a> -- which enable PyDev to keep on being improved!</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
p.s.: LiClipse 4.3.1 already bundles PyDev 6.1.0, see: <a href="http://www.liclipse.com/download.html">http://www.liclipse.com/download.html</a> for download links.</div>
<br />Fabio Zadroznyhttp://www.blogger.com/profile/04202246218394712738noreply@blogger.com0