##// END OF EJS Templates
update nbconvert-as-library notebook...
Min RK -
Show More
@@ -1,1542 +1,1448 b''
1 1 {
2 2 "cells": [
3 3 {
4 4 "cell_type": "markdown",
5 5 "metadata": {},
6 6 "source": [
7 7 "# NbConvert, Python library"
8 8 ]
9 9 },
10 10 {
11 11 "cell_type": "markdown",
12 12 "metadata": {},
13 13 "source": [
14 14 "In this Notebook, I will introduce you to the programatic API of nbconvert to show you how to use it in various context. \n",
15 15 "\n",
16 16 "For this I will use one of [@jakevdp](https://github.com/jakevdp) great [blog post](http://jakevdp.github.io/blog/2013/04/15/code-golf-in-python-sudoku/).\n",
17 17 "I've explicitely chosen a post with no javascript tricks as Jake seem to be found of right now, for the reason that the becommings of embeding javascript in nbviewer, which is based on nbconvert is not fully decided yet. \n",
18 18 "\n",
19 19 "\n",
20 20 "This will not focus on using the command line tool to convert file. The attentive reader will point-out that no data are read from, or written to disk during the conversion process. Indeed, nbconvert as been though as much as\n",
21 21 "possible to avoid IO operation and work as well in a database, or web-based environement."
22 22 ]
23 23 },
24 24 {
25 25 "cell_type": "markdown",
26 26 "metadata": {},
27 27 "source": [
28 28 "#### Quick overview"
29 29 ]
30 30 },
31 31 {
32 32 "cell_type": "markdown",
33 33 "metadata": {},
34 34 "source": [
35 "<pre style='background-color:#FDD'> Warning, Do use 1.0 or 1.x branch and not master naming have changed.</pre>\n",
36 "\n",
37 "<pre style='background-color:#FDD'> Warning, NbConvert is a Tech-Preview, API will change within the next 6 month.</pre>"
38 ]
39 },
40 {
41 "cell_type": "markdown",
42 "metadata": {},
43 "source": [
44 35 "Credit, Jonathan Freder (@jdfreder on github)\n",
45 36 "\n",
46 37 "<center>\n",
47 " ![nbca](files/nbconvert_arch.png)\n",
38 " ![nbca](images/nbconvert_arch.png)\n",
48 39 "</center>"
49 40 ]
50 41 },
51 42 {
52 43 "cell_type": "markdown",
53 44 "metadata": {},
54 45 "source": [
55 46 "The main principle of nbconvert is to instanciate a `Exporter` that controle\n",
56 47 "a pipeline through which each notebook you want to export with go through."
57 48 ]
58 49 },
59 50 {
60 51 "cell_type": "markdown",
61 52 "metadata": {},
62 53 "source": [
63 54 "Let's start by importing what we need from the API, and download @jakevdp's notebook."
64 55 ]
65 56 },
66 57 {
67 58 "cell_type": "code",
68 59 "execution_count": 1,
69 60 "metadata": {
70 61 "collapsed": false
71 62 },
72 63 "outputs": [
73 64 {
74 65 "data": {
75 66 "text/plain": [
76 67 "'{\\n \"metadata\": {\\n \"name\": \"XKCD_plots\"\\n },\\n \"nbformat\": 3,\\n...'"
77 68 ]
78 69 },
79 70 "execution_count": 1,
80 71 "metadata": {},
81 72 "output_type": "execute_result"
82 73 }
83 74 ],
84 75 "source": [
85 76 "import requests\n",
86 77 "response = requests.get('http://jakevdp.github.com/downloads/notebooks/XKCD_plots.ipynb')\n",
87 "response.content[0:60]+'...'"
78 "response.text[0:60]+'...'"
88 79 ]
89 80 },
90 81 {
91 82 "cell_type": "markdown",
92 83 "metadata": {},
93 84 "source": [
94 85 "If you do not have request install downlad by hand, and read the file as usual."
95 86 ]
96 87 },
97 88 {
98 89 "cell_type": "markdown",
99 90 "metadata": {},
100 91 "source": [
101 92 "We read the response into a slightly more convenient format which represent IPython notebook. \n",
102 93 "There are not real advantages for now, except some convenient methods, but with time this structure should be able to\n",
103 94 "guarantee that the notebook structure is valid. Note also that the in-memory format and on disk format can be slightly different. In particual, on disk, multiline strings might be spitted into list of string to be more version control friendly."
104 95 ]
105 96 },
106 97 {
107 98 "cell_type": "code",
108 99 "execution_count": 2,
109 100 "metadata": {
110 101 "collapsed": false
111 102 },
112 103 "outputs": [
113 104 {
114 105 "data": {
115 106 "text/plain": [
116 "{u'cell_type': u'heading',\n",
117 " u'level': 1,\n",
118 " u'metadata': {},\n",
119 " u'source': u'XKCD plots in Matplotlib'}"
107 "{'cell_type': 'markdown',\n",
108 " 'metadata': {},\n",
109 " 'source': '# XKCD plots in Matplotlib'}"
120 110 ]
121 111 },
122 112 "execution_count": 2,
123 113 "metadata": {},
124 114 "output_type": "execute_result"
125 115 }
126 116 ],
127 117 "source": [
128 "from IPython.nbformat import current as nbformat\n",
129 "jake_notebook = nbformat.reads_json(response.content)\n",
130 "jake_notebook.worksheets[0].cells[0]"
118 "from IPython import nbformat\n",
119 "jake_notebook = nbformat.reads(response.text, as_version=4)\n",
120 "jake_notebook.cells[0]"
131 121 ]
132 122 },
133 123 {
134 124 "cell_type": "markdown",
135 125 "metadata": {},
136 126 "source": [
137 127 "So we have here Jake's notebook in a convenient form, which is mainly a Super-Powered dict and list nested.\n",
138 128 "You don't need to worry about the exact structure."
139 129 ]
140 130 },
141 131 {
142 132 "cell_type": "markdown",
143 133 "metadata": {},
144 134 "source": [
145 135 "The nbconvert API exposes some basic exporter for common format and default options. We will start\n",
146 136 "by using one of them. First we import it, instanciate an instance with most of the default parameters and fed it\n",
147 137 "the downloaded notebook. "
148 138 ]
149 139 },
150 140 {
151 141 "cell_type": "code",
152 142 "execution_count": 3,
153 143 "metadata": {
154 144 "collapsed": false
155 145 },
156 146 "outputs": [],
157 147 "source": [
158 "import IPython.nbconvert"
159 ]
160 },
161 {
162 "cell_type": "code",
163 "execution_count": 4,
164 "metadata": {
165 "collapsed": false
166 },
167 "outputs": [],
168 "source": [
169 148 "from IPython.config import Config\n",
170 149 "from IPython.nbconvert import HTMLExporter\n",
171 150 "\n",
172 151 "## I use `basic` here to have less boilerplate and headers in the HTML.\n",
173 152 "## we'll see later how to pass config to exporters.\n",
174 "exportHtml = HTMLExporter(config=Config({'HTMLExporter':{'default_template':'basic'}}))"
153 "html_exporter = HTMLExporter(config=Config({'HTMLExporter':{'default_template':'basic'}}))"
175 154 ]
176 155 },
177 156 {
178 157 "cell_type": "code",
179 "execution_count": 5,
158 "execution_count": 4,
180 159 "metadata": {
181 160 "collapsed": false
182 161 },
183 162 "outputs": [],
184 163 "source": [
185 "(body, resources) = exportHtml.from_notebook_node(jake_notebook)"
164 "(body, resources) = html_exporter.from_notebook_node(jake_notebook)"
186 165 ]
187 166 },
188 167 {
189 168 "cell_type": "markdown",
190 169 "metadata": {},
191 170 "source": [
192 171 "The exporter returns a tuple containing the body of the converted notebook, here raw HTML, as well as a resources dict.\n",
193 172 "The resource dict contains (among many things) the extracted PNG, JPG [...etc] from the notebook when applicable.\n",
194 173 "The basic HTML exporter does keep them as embeded base64 into the notebook, but one can do ask the figures to be extracted. Cf advance use. So for now the resource dict **should** be mostly empty, except for 1 key containing some css, and 2 others whose content will be obvious.\n",
195 174 "\n",
196 175 "Exporter are stateless, you won't be able to extract any usefull information (except their configuration) from them.\n",
197 176 "You can directly re-use the instance to convert another notebook. Each exporter expose for convenience a `from_file` and `from_filename` methods if you need."
198 177 ]
199 178 },
200 179 {
201 180 "cell_type": "code",
202 "execution_count": 6,
181 "execution_count": 5,
203 182 "metadata": {
204 183 "collapsed": false
205 184 },
206 185 "outputs": [
207 186 {
208 187 "name": "stdout",
209 188 "output_type": "stream",
210 189 "text": [
211 "['inlining', 'output_extension', 'metadata']\n",
190 "['raw_mimetypes', 'inlining', 'metadata', 'output_extension']\n",
212 191 "defaultdict(None, {'name': 'Notebook'})\n",
213 "html\n"
192 ".html\n"
214 193 ]
215 194 }
216 195 ],
217 196 "source": [
218 "print resources.keys()\n",
219 "print resources['metadata']\n",
220 "print resources['output_extension']\n",
197 "print([key for key in resources ])\n",
198 "print(resources['metadata'])\n",
199 "print(resources['output_extension'])\n",
221 200 "# print resources['inlining'] # too lng to be shown"
222 201 ]
223 202 },
224 203 {
225 204 "cell_type": "code",
226 "execution_count": 7,
205 "execution_count": 6,
227 206 "metadata": {
228 207 "collapsed": false
229 208 },
230 209 "outputs": [
231 210 {
232 211 "name": "stdout",
233 212 "output_type": "stream",
234 213 "text": [
214 "<!DOCTYPE html>\n",
215 "<html>\n",
216 "<head>\n",
235 217 "\n",
236 "<div class=\"text_cell_render border-box-sizing rendered_html\">\n",
237 "<h1 id=\"XKCD-plots-in-Matplotlib\">XKCD plots in Matplotlib<a class=\"anchor-link\" href=\"#XKCD-plots-in-Matplotlib\">&#182;</a></h1>\n",
238 "</div>\n",
218 "<meta charset=\"utf-8\" />\n",
219 "<title>Notebook</title>\n",
220 "\n",
221 "<script src=\"https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.10/require.min.js\"></script>\n",
222 "<script src=\"https://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.3/jquery.min.js\"></script>\n",
239 223 "\n",
240 "<div class=\"text_cell_render border-box-sizing rendered_html\">\n",
241 "<p>This notebook originally appeared as a blog post at <a href=\"http://jakevdp.github.com/blog/2012/10/07/xkcd-style-plots-in-matplotli...\n"
224 "<style type=\"text/css\">\n",
225 " /*!\n",
226 "*\n",
227 "* Twitter Bootstrap\n",
228 "*\n",
229 "*/\n",
230 "/*! normalize.css v3.0.2 | MIT License | git.io/normalize */\n",
231 "html {\n",
232 " fon...\n"
242 233 ]
243 234 }
244 235 ],
245 236 "source": [
246 237 "# Part of the body, here the first Heading\n",
247 238 "start = body.index('<h1 id', )\n",
248 "print body[:400]+'...'"
239 "print(body[:400]+'...')"
249 240 ]
250 241 },
251 242 {
252 243 "cell_type": "markdown",
253 244 "metadata": {},
254 245 "source": [
255 246 "You can directly write the body into an HTML file if you wish, as you see it does not contains any body tag, or style declaration, but thoses are included in the default HtmlExporter if you do not pass it a config object as I did."
256 247 ]
257 248 },
258 249 {
259 250 "cell_type": "markdown",
260 251 "metadata": {},
261 252 "source": [
262 253 "#### Extracting Figures"
263 254 ]
264 255 },
265 256 {
266 257 "cell_type": "markdown",
267 258 "metadata": {},
268 259 "source": [
269 260 "When exporting one might want to extract the base64 encoded figures to separate files, this is by default what does the RstExporter does, let see how to use it. "
270 261 ]
271 262 },
272 263 {
273 264 "cell_type": "code",
274 "execution_count": 8,
265 "execution_count": 7,
275 266 "metadata": {
276 267 "collapsed": false
277 268 },
278 269 "outputs": [],
279 270 "source": [
280 271 "from IPython.nbconvert import RSTExporter\n",
281 272 "\n",
282 "rst_export = RSTExporter()\n",
273 "rst_exporter = RSTExporter()\n",
283 274 "\n",
284 "(body,resources) = rst_export.from_notebook_node(jake_notebook)"
275 "(body,resources) = rst_exporter.from_notebook_node(jake_notebook)"
285 276 ]
286 277 },
287 278 {
288 279 "cell_type": "code",
289 "execution_count": 9,
280 "execution_count": 8,
290 281 "metadata": {
291 282 "collapsed": false
292 283 },
293 284 "outputs": [
294 285 {
295 286 "name": "stdout",
296 287 "output_type": "stream",
297 288 "text": [
298 289 "\n",
299 290 "XKCD plots in Matplotlib\n",
300 291 "========================\n",
301 292 "\n",
302 "\n",
303 293 "This notebook originally appeared as a blog post at `Pythonic\n",
304 "Perambulations <http://jakevdp.github.com/blog/2012/10/07/xkcd-style-plots-in-matplotlib/>`_\n",
294 "Perambulations <http://jakevdp.github.com/blog/2012/10/07/xkcd-style-plots-in-matplotlib/>`__\n",
305 295 "by Jake Vanderplas.\n",
306 296 "\n",
307 " *Update: the matplotlib pull request has been merged! See* `*This\n",
308 "post* <http://jakevdp.github.io/blog/2013/07/10/XKCD-plots-in-matplotlib/>`_\n",
297 ".. raw:: html\n",
298 "\n",
299 " <!-- PELICAN_BEGIN_SUMMARY -->\n",
300 "\n",
301 "*Update: the matplotlib pull request has been merged! See* `*This\n",
302 "post* <http://jakevdp.github.io/blog/2013/07/10/XKCD-plots-in-matplotlib/>`__\n",
309 303 "*for a description of the XKCD functionality now built-in to\n",
310 304 "matplotlib!*\n",
311 305 "\n",
312 306 "One of the problems I've had with typical matplotlib figures is that\n",
313 307 "everything in them is so precise, so perfect. For an example of what I\n",
314 308 "mean, take a look at this figure:\n",
315 "In[1]:\n",
309 "\n",
316 310 ".. code:: python\n",
317 311 "\n",
318 312 " from IPython.display import Image\n",
319 313 " Image('http://jakevdp.github.com/figures/xkcd_version.png')\n",
320 314 "\n",
321 315 "\n",
322 316 "\n",
323 "\n",
324 "\n",
325 317 ".. image:: output_3_0.png\n",
326 318 "\n",
327 319 "\n",
328 320 "\n",
329 321 "Sometimes when showing schematic plots, this is the type of figure I\n",
330 322 "want to display. But drawing it by hand is a pain: I'd rather just use\n",
331 "matplotlib. The problem is, matplotlib is a bit...\n",
323 "matpl...\n",
332 324 "[.....]\n",
333 "owing schematic plots, this is the type of figure I\n",
325 "mage:: output_3_0.png\n",
326 "\n",
327 "\n",
328 "\n",
329 "Sometimes when showing schematic plots, this is the type of figure I\n",
334 330 "want to display. But drawing it by hand is a pain: I'd rather just use\n",
335 331 "matplotlib. The problem is, matplotlib is a bit too precise. Attempting\n",
336 332 "to duplicate this figure in matplotlib leads to something like this:\n",
337 "In[2]:\n",
333 "\n",
338 334 ".. code:: python\n",
339 335 "\n",
340 336 " Image('http://jakevdp.github.com/figures/mpl_version.png')\n",
341 337 "\n",
342 338 "\n",
343 339 "\n",
344 "\n",
345 "\n",
346 ".. image:: output_5_0.png\n",
347 "\n",
348 "\n",
349 "\n",
350 "It just doesn'...\n"
340 ".. image:...\n"
351 341 ]
352 342 }
353 343 ],
354 344 "source": [
355 "print body[:970]+'...'\n",
356 "print '[.....]'\n",
357 "print body[800:1200]+'...'"
345 "print(body[:970]+'...')\n",
346 "print('[.....]')\n",
347 "print(body[800:1200]+'...')"
358 348 ]
359 349 },
360 350 {
361 351 "cell_type": "markdown",
362 352 "metadata": {},
363 353 "source": [
364 354 "Here we see that base64 images are not embeded, but we get what look like file name. Actually those are (Configurable) keys to get back the binary data from the resources dict we havent inspected earlier.\n"
365 355 ]
366 356 },
367 357 {
368 358 "cell_type": "markdown",
369 359 "metadata": {},
370 360 "source": [
371 361 "So when writing a Rst Plugin for any blogengine, Sphinx or anything else, you will be responsible for writing all those data to disk, in the right place. \n",
372 362 "Of course to help you in this task all those naming are configurable in the right place."
373 363 ]
374 364 },
375 365 {
376 366 "cell_type": "markdown",
377 367 "metadata": {},
378 368 "source": [
379 369 "let's try to see how to get one of these images"
380 370 ]
381 371 },
382 372 {
383 373 "cell_type": "code",
384 "execution_count": 10,
374 "execution_count": 9,
385 375 "metadata": {
386 376 "collapsed": false
387 377 },
388 378 "outputs": [
389 379 {
390 380 "data": {
391 381 "text/plain": [
392 "[u'output_13_1.text',\n",
393 " u'output_18_0.text',\n",
394 " u'output_3_0.text',\n",
395 " u'output_18_1.png',\n",
396 " u'output_12_0.text',\n",
397 " u'output_5_0.text',\n",
398 " u'output_5_0.png',\n",
399 " u'output_13_1.png',\n",
400 " u'output_16_0.text',\n",
401 " u'output_13_0.text',\n",
402 " u'output_18_1.text',\n",
403 " u'output_3_0.png',\n",
404 " u'output_16_0.png']"
382 "['output_5_0.png',\n",
383 " 'output_16_0.png',\n",
384 " 'output_13_1.png',\n",
385 " 'output_18_1.png',\n",
386 " 'output_3_0.png']"
405 387 ]
406 388 },
407 "execution_count": 10,
389 "execution_count": 9,
408 390 "metadata": {},
409 391 "output_type": "execute_result"
410 392 }
411 393 ],
412 394 "source": [
413 "resources['outputs'].keys()"
395 "list(resources['outputs'])"
414 396 ]
415 397 },
416 398 {
417 399 "cell_type": "markdown",
418 400 "metadata": {},
419 401 "source": [
420 402 "We have extracted 5 binary figures, here `png`s, but they could have been svg, and then wouldn't appear in the binary sub dict.\n",
421 403 "keep in mind that a object having multiple _repr_ will store all it's repr in the notebook. \n",
422 404 "\n",
423 405 "Hence if you provide `_repr_javascript_`,`_repr_latex_` and `_repr_png_`to an object, you will be able to determine at conversion time which representaition is the more appropriate. You could even decide to show all the representaition of an object, it's up to you. But this will require beeing a little more involve and write a few line of Jinja template. This will probably be the subject of another tutorial.\n",
424 406 "\n",
425 407 "Back to our images,\n",
426 408 "\n"
427 409 ]
428 410 },
429 411 {
430 412 "cell_type": "code",
431 "execution_count": 11,
413 "execution_count": 10,
432 414 "metadata": {
433 415 "collapsed": false
434 416 },
435 417 "outputs": [
436 418 {
437 419 "data": {
438 420 "image/png": [
439 421 "iVBORw0KGgoAAAANSUhEUgAAAbAAAAEgCAYAAADVKCZpAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\n",
440 422 "AAALEgAACxIB0t1+/AAAIABJREFUeJzsnXd4FGXXxu/ZTYP0RkvoJKH3IvAivQsiINIEgUAsgPIJ\n",
441 423 "Cq8IAgroqxRRUJpSpCO9ifQSpEgNvYYSCJDek93z/XEyuwkkIWV3Zjd5fte11yxbZu5ZsnvPc57z\n",
442 424 "nAMSCCyApUuXUqlSpUiSJKpfvz4dPnzY8Fy1atUoLCwsy/edPXuWiIjS0tLo008/JVtbW5Ik6aVb\n",
443 425 "mTJlKDEx0fA++fX29vak1Wqpe/fu9ODBAyIiWrFiBbm5udHx48fzfT6ffPIJOTo60u3bt/O9j5zY\n",
444 426 "vn07VaxY0XB+JUuWpBs3brzyfSdOnCAfHx+Kjo7O8zHv379PDg4O5OTkRFFRUfmRLRCYFBsIBCoz\n",
445 427 "e/ZsfPrppyhZsiSmTp2K5ORkrFmzBi1atAAAJCYmIiUlJcv3NmnSBMnJydi4cSNmzZoFLy8vTJky\n",
446 428 "Bfb29ple16hRIzg4OAAAUlNT0b9/f2zcuBG1atVCUFAQjhw5giNHjqBv3764efMmoqOjsWnTJjRt\n",
447 429 "2hSjR4/G77//jlu3bsHb2ztX57R//34kJibi/v378PT0REJCQo6v9/DwgJ2dXa72/ejRI/Tq1Qup\n",
448 430 "qamYNWsWrl69it9++w0dO3bE8ePHUbJkScNrY2Nj4ezsbPi3JEl49OgRlixZgjFjxgAAYmJicqXP\n",
449 431 "19cX77zzDpYvX47z58/j9ddfz5VegcBsqO2ggqLNypUrSZIk8vPzo9DQ0Jeef/78Obm6umb5HBGR\n",
450 432 "JElERBQeHk6SJNHSpUtfeczAwECSJIm6d+9OKSkpLz0/efJkkiSJ/vrrL7py5QppNBoqX758lq/N\n",
451 433 "js8++4wkSaKDBw9Sv379SJIk0mg0ZG9vn+UI8fvvv8/1vtu2bUtubm40d+5cw2ObNm0iOzs7atGi\n",
452 434 "heGxzZs3k1arpdOnT2d6f5MmTahcuXKG8+nbt2+u9cmfzaFDh3KtVyAwF8LABKrx6NEjcnNzI3d3\n",
453 435 "d3r8+HGWrzlw4ABVq1aN9Hp9ls/LBpaYmEiSJNHYsWMpLCzMcHsxVLZjxw6SJIlatGhBaWlpWe5T\n",
454 436 "/pGeMWMG1alTh3x8fOjWrVt5Ojd/f/9MP/SnTp2iq1ev0v3790mSJOrRowft2bOH9uzZQydOnMj1\n",
455 437 "fo8dO0aSJNG2bdteek6+GDh//jwREU2ZMiXL1x46dIgkSaL58+cbHsutvh9++IE0Go0hdCsQqIkw\n",
456 438 "MIFqTJ8+nSRJom+//Tbb1xw4cCDTqCI2NpbCwsLozp07NGbMGJIkiR48eEDR0dEkSRLZ29uTg4MD\n",
457 439 "SZJEtra21Llz50zm16FDB9JoNPTPP/9ke0zZwOTb4MGD83xu5cuXz/aHXpIkWrZsWZ73SUTUvn17\n",
458 440 "GjhwYJbP6fV6qly5Mk2ePJmIiJo2bUqurq4UHx+f6XUpKSnk5eVFNjY2dPfu3TzpS0lJoa1bt+ZL\n",
459 441 "u0BgasQcmEA1kpOTodFoMHjw4Bxfd+7cOVy+fBlubm5o06YNrl+/bnhOkiT4+Phg5cqVAIC///4b\n",
460 442 "tWrVwsmTJ1GzZk2ULl36pWNWrVoVjRs3zrXOVatWoWzZspg2bVoezg4oW7Ys6tatm6f35MSDBw+w\n",
461 443 "f/9+XLlyJcvnJUmCk5MTQkJCEB0djQsXLqBXr14oXrx4ptfZ2tqiTZs2WL9+PaKjo/OkwdbWFt26\n",
462 444 "dcv3OQgEpkSjtgBB0aVChQrQ6/XYu3dvjq+Li4tDzZo14evri+vXr6Nt27bYvXs3Bg4caHhNWloa\n",
463 445 "AOA///kPXF1d0b59+5fMSz7mtWvXcO/evVfqGz9+PHbs2AF7e3t88803GDduXK7OKyUlBbGxsdBo\n",
464 446 "TPv1WrduHd544w34+fll+fyWLVtw5coVjBo1CpGRkUhISIBWq83ytRcvXkSJEiVQuXJlk2oUCJRE\n",
465 447 "GJhANfr374/y5ctj1KhRePLkSabnTp06halTp0KSJGi1Wnz88cfYvXs3du/ejRUrVqBDhw5o3bo1\n",
466 448 "iAgAcOPGDQBAREQEEhMT8fjxY8MtJibGsN/x48eDiDBw4EDodLpMx1y6dCk2bdqEevXqAeDRWufO\n",
467 449 "nbF79244Ozvjhx9+wKZNm155XpcvX0ZkZGSBPpus2LFjB9zd3V96PCkpCd9//z369OmDb7755pXZ\n",
468 450 "gRcuXMC1a9cwd+5cODo65kkDEeH69esvfXYCgRoIAxOohp2dHdavXw+NRoMGDRpgxowZCAkJwcyZ\n",
469 451 "M9G8eXNDWnmzZs0we/ZsdOjQAR06dECpUqUAcMhMJiQkBABQpUoVlC1bFmXKlDHc3n//fcPrqlat\n",
470 452 "il9//RXHjx9H48aNsWjRIly9ehWDBw9GYGAgSpcuje7du2PkyJEoX748AKB58+ZYtGgRAGDjxo2v\n",
471 453 "PK/jx48D4HCbKfH398fmzZsxbtw4LF68GIsXL8b06dNRqVIlzJw5E7Nnz8bYsWMBwDDy0uv1L+0n\n",
472 454 "KCgI9erVwzvvvJNnDXPmzEHVqlXh7++PO3fuFOyEBIICIubABKrSsGFDnDp1CtOnT8eXX36JL774\n",
473 455 "Ara2thg5ciQ+++wzHD58ONtQXKNGjVCnTh0AgJ+fHypUqIBWrVoB4B/wLl26wNnZ+aURSWBgIKpW\n",
474 456 "rYovv/wSQUFBAAAvLy8sWrQIr732GgDgxx9/zPSePn36IDk5GQEBAa88p/DwcAC8Ru1F7t+//8r3\n",
475 457 "Z8fMmTPh7e2NX3/9FU+fPoWtrS2CgoIwf/589OjRI9Nry5Yti5o1a2Lbtm1ITExEsWLFALABnTp1\n",
476 458 "CpcuXcryGK/S5+7uDkmSYGdnBycnp3yfi0BgElROIilSJCcnZ5sOLsiaI0eO0Mcff6y2jDwhZzEO\n",
477 459 "HTr0peeOHTtGTk5OdOfOHbPrWL58OUmSREFBQbRo0SKaNGkS2djY0PLly7N9j5L6BIKCIhGlTyII\n",
478 460 "zMr9+/fRsGFDhIeHY968eRg5cqTakgRmYubMmZg5cyZ27tyJZs2aqarlrbfewpYtWwBwKHb69Omi\n",
479 461 "goag0CAMzMzo9XosWLAA48ePR1xcHAAOw5w+fRqVKlVSWZ1AIBBYLyKJw0Q8ffoUqampmR67fPky\n",
480 462 "WrRogZEjRyIuLg5ubm4AgMjISHTq1AnPnj1TQ6pAIBAUCoSBmYCIiAh8/PHHOHfuHABeBzR16lTU\n",
481 463 "q1cPx48fR+nSpbFx40aULVsWABAQEIAbN26ge/fuSExMVFO6QCAQWC3CwEzA/v37sWbNGsTGxiIt\n",
482 464 "LQ1NmjTB5MmTkZKSguHDh+Py5cvo2bOnoaL6okWLUK5cOQQHB6N///5ZpjoLBAKBIGeEgb2ClJSU\n",
483 465 "TAthdToddDodiOtIAuBFt9WqVUPNmjVhY2ODbt26wc/PDwcOHMDChQsNoUPZwHx9fbFr1y54eHig\n",
484 466 "VatWJq/YIBAIBEUBkcTxClavXo2tW7fivffeQ9u2bWFjY1w6p9frodFo0Lp1azx//hybNm1C5cqV\n",
485 467 "kZycDL1eb1h7I+Pr64uHDx/i/v378PX1RWRkZJaVFQQCgUDwasSlfw7o9Xrcvn0ba9euxVtvvYXX\n",
486 468 "X38ds2fPxvHjxxEdHW0YOV27dg16vd5gRvb29i+ZF2CsHCGX4RHmJRAIBPlHVOLIAY1Gg+HDh+Pu\n",
487 469 "3bv4448/cOLECZw4cQIAULNmTQQGBuKff/4x1Nzz8PDIcX9y5YL4+HizaxcIBILCjggh5pLIyEic\n",
488 470 "PXsW27Ztw/79+3H16lUQkaEKepcuXbB9+3bodLpsK4A3bNgQZ86cwcmTJ9GoUSMl5QsEAkGhQ4zA\n",
489 471 "skGe31qzZg2aN2+OsmXLok2bNmjTpg0ePXqEQ4cOYdOmTXjy5AkaNmyIYcOGAUCOCRnyCCw2NlaR\n",
490 472 "cxAIBILCjDCwbJCNqH///pg/fz6CgoKg1+uh1WpRpkwZ9OvXz7AYuUqVKob5rYwV0l9E7k/16NEj\n",
491 473 "85+AQCAQFHKEgeVAWFgYAMDT09PQlwrgnkiSJMHd3T1PiRjyQuaCVCQXCAQCASOyELNAnhY8evQo\n",
492 474 "ihcvbugLdfbsWaxZs8YwygoJCclTm3lhYAKBQGA6hIFlgWxg+/fvR5UqVVCiRAkAwMKFC7FmzRrD\n",
493 475 "67Zv346lS5cit3kwsoGFhoaaWLFAIBAUPYSB5cDx48dRq1YtQ5jw1KlTKFmypMGw/vnnH1SuXBnR\n",
494 476 "0dG52p8YgQkEAoHpEAaWBXICx9WrV2FrawsXFxcAwN27d9G1a1dDCPHff/81tL3PDcLABAKBwHSI\n",
495 477 "JI5siIiIgK+vL37//Xc4OTkhOjoaKSkpaNeuHQBOs9fpdChevHiuW6t7eXnBxsYGkZGRSEpKgoOD\n",
496 478 "gzlPQSAQCAo1YgSWDW5ubhgzZgy8vLxw4MAB/PXXX0hJSUFgYCD++usv/P7774iIiECjRo0y1UfM\n",
497 479 "CY1Gg1KlSgEAHj9+bE75AoFAUOgRI7Bs0Gg0GDlypKEZ5ZUrV7BlyxasXLkS69atA8CjsOTkZADG\n",
498 480 "1PpXUapUKTx48ABhYWGoUKGCOU9BIBAICjViBJYFcpLGhQsXMGPGDKSlpaFRo0b4+uuvcffuXZw7\n",
499 481 "dw6ff/453njjDTRo0CBP+/b29gYAPH/+3OS6BQKBoCghRmDZsG7dOowaNQpPnz5Fq1at0LRpU9y+\n",
500 482 "fRvR0dGoW7cuvvrqK8TExBh6feVm9AXAkPSRmppqNu0CgUBQFBAGlgVnzpxBYGAgunbtioCAACxc\n",
501 483 "uBAxMTGYMGEC7t69Cy8vL+zevRuVKlXK875tbW0BGJtbCgQCgSB/iBBiBvR6PQBgx44d8Pb2xs8/\n",
502 484 "/4y33noLmzdvxldffYXmzZvj9u3baN26NYKCggAg14uYZWQDEyMwgUAgKBjCwLJg3759aNiwIezt\n",
503 485 "7VGnTh1UrFgRvr6++N///gc3Nzf4+flh37592LVrV65DhzKJiYkAIFLoBQKBoIAIA8uAvIC5ePHi\n",
504 486 "uHLlisFsEhISUL16dYNZyYkYcgWOvIzCIiMjAYhuzAKBQFBQhIFlwYgRI2BrawsvLy8QEVasWIHB\n",
505 487 "gwcb1nvJC5ebNm0KIPcJHIDRwF7VvVkgEAgEOSOSODIgN7GsUqUK/P39ER0dDVdX15e6J1+9ejVT\n",
506 488 "lfq8IEZgAoFAYBqEgWVAHkmFhYUhODgYHh4esLW1hZ+fH1q2bIlu3bohICAAly5dQq1atQAAOp3O\n",
507 489 "0CcsN4gRmEAgEJgGifKaRlcECA8PR1JSEsqVK4cHDx5g9+7dOHDgAE6cOIFHjx4hOTkZn3zyCWbN\n",
508 490 "mmUYteWG1NRU2NnZQavVIjU1Nc8JIAKBQCAwIgwsAxnLQSUlJUGSJNjb27/0utDQUJQsWTLL53Ii\n",
509 491 "PDwcJUuWhKenJ549e2YSzQKBQFBUESHEDEiShAMHDuDo0aO4du0aQkNDkZqaiqpVq8Le3h4pKSlw\n",
510 492 "c3NDjRo1ULZsWbRt2zZP4cO4uDgAgLOzs7lOQSAQCIoMwsDSOXDgACZMmIDr168jKioK5cuXR8WK\n",
511 493 "FSFJEpYtWwZnZ2fY29sjOjoaNWvWxLBhw9ChQ4c8HSMtLQ2AcTGzQCAQCPKPMLB01q1bh5MnT2LU\n",
512 494 "qFEYNGgQ/Pz84OLigpEjR+LBgwdYunQp6tati+TkZMTFxeW6B1hG5OobwsAEAoGg4AgDS0euKu/v\n",
513 495 "75+pwny7du1w5MgRlCpVCq6urgCAEiVK5OsY8ggst/3DBAKBQJA9YiFzOoGBgXj//fcxfvx4fPbZ\n",
514 496 "Zzh79iwAoEePHrh48aKhAaVer89z/UMZMQITCAQC0yGGAhmYOHEibG1tsWLFCnz//fdo3bo17O3t\n",
515 497 "4eDggPv37xtS5vV6fb5S4IWBCQQCgekQBpaBMmXKYO7cuRgwYAB+++03rF+/HhEREQCAmTNnQqfT\n",
516 498 "YcCAAfkOAYoQokAgEJgOEULMgBwabNy4MRYsWIBr165h+/btGDduHJycnPDhhx/Czs4O3377bb72\n",
517 499 "L0ZgAoFAYDrEUCADclhQDhF6enqiS5cu6NKlCwAgJiYGixcvRv369fO1f5FGLxAIBKZDGFgWyKWh\n",
518 500 "iAg6nQ4Az4/17NkTH3/8ca5LR72IPAITIUSBQCAoOCKEmE5WmYWSJMHGxgaXLl3Cd999h5s3b0Kr\n",
519 501 "1ea7hqEIIQoEAoHpKPJDAb1eD8A46pLDh5IkGWojnj59Gt7e3mjWrFmBjiWSOF6BXg8cPgxs3Aic\n",
520 502 "Pg08fMiPV6gANG4M9O0LNGgAiCLIAoEAYgSG4OBgTJgwAYcOHQLARiaPsOTw4YkTJ6DVag2tUPKL\n",
521 503 "GIFlAxGwaRNQqxbQujXw00/AiRPA/ft8O3IE+OEHoFEjoGVLNjeBQFDkKfIGdvToUcyZMwcDBw7E\n",
522 504 "wIEDsWXLFjxMv/KXR0oXL16Eg4MD3NzcCnSslJQUAMLAMhERAfTsybfLlwFfX+C//wX+/hu4cwe4\n",
523 505 "dQvYtQv4+GPA3Z3N7LXXgGnT2PgEAkGRpcjHsoYOHYozZ85gw4YNWLVqFVatWgVbW1s0adIEo0aN\n",
524 506 "ws2bN3H58mXEx8cX2MDi4+MBAI6OjqaQbv1cuQJ07w7cvAk4OwPTpwMjRgB2dplfV6kS0KkTMGUK\n",
525 507 "3+bMASZNYnNbtAgQFwQCQZGkyBuYt7c3Vq9ejYkTJ+LQoUPYu3cvgoODcfToUVy4cAExMTEAgPLl\n",
526 508 "y8Pd3b1AxxIGloFjx4AuXYCYGKBuXWDzZqB8+Zzf4+oKzJoFtGsHvP02sGwZ8OwZ8OefL5ueQCAo\n",
527 509 "9BT5ECIAaLVa1K5dG6NGjcLWrVtx6NAh/Pzzz6hXrx4CAgLQvn17/PzzzwCMSR/5QRhYOidPAp07\n",
528 510 "s3n17AkcPfpq88pIly7A/v2ApyewYwcQGCjCiQJBEaTIj8Bk9Ho99Ho9bGxsUL16dfj7+6NDhw54\n",
529 511 "+vQpqlataggf5ncNGABDF+aCjuSsmqtXgY4dgdhYzipcuRLIQ1NQA02aAHv2cFLHihUcZvzqK5PL\n",
530 512 "FQgElosYgaWj0Wgypbfb2NigcuXKeO211wo89yUjJ4f4+PiYZH9WR0QE0K0bEBXFc1/Ll+fPvGQa\n",
531 513 "NADWrQM0Gp4b273bdFoFAoHFIwwsB4go361TsuLRo0cAiqiB6fVA//6csFG3LrBqlWmSL7p0AaZO\n",
532 514 "5fvvvgukf8YCgaDwIwwsB+QFzaZCHoGVKVPGZPu0GmbP5pCfpyewZQtgynnACROA9u05oeP998V8\n",
533 515 "mEBQRJDIlEMMQbbodDrY29tDp9MhOTkZdkUpa+7sWZ6zSk1l8+re3fTHePgQqF6dE0PWrgX69DH9\n",
534 516 "MQQCgUUhRmAoWJfl3PLkyRPodDp4e3sXLfNKSuLQYWoq8MEH5jEvAPDxAb77ju+PGgU8f26e4wgE\n",
535 517 "AotBGBiM5aMKkiL/KuT5ryIXPvzmG848rFoV+P578x5r+HDg9deB8HDgiy/MeyyBQKA6RdrA4uLi\n",
536 518 "MGfOHPzwww+Ij48vUIr8qyiSGYiXLgEzZ/L9RYuA4sXNezyNBvjlF85sXLQICAkx7/EEAoGqFGkD\n",
537 519 "c3R0RPHixfH1119j+PDhCA0NBWDMPjRHBmKRGYHp9VwWKi0NCAoC/vMfZY5brRofT68Hxo5V5pgC\n",
538 520 "gUAVirSBAcCIESPwv//9D0ePHsXEiRPx+PFjQ/ahKTMQw8PDAQClSpUy2T4tml9/BYKDgVKljKMw\n",
539 521 "pfjqK8DFhdeF7d2r7LEFAoFiFFkDk3t9AUBgYCCWLl2KlStXomHDhli4cCFCQkLw+PFjJCQkmOR4\n",
540 522 "soGVKFHCJPuzaJ4944ryAPDjj4CJFoLnGm9vYPx4vj9likirFwgKKUXWwCRJMvTnunDhgsFgwsLC\n",
541 523 "8MEHH6Bjx44YMmQIJk2aZCjoWxCKlIFNmsTVNtq1A3r3VkfDyJHcfuXYMSC915tAIChcFMlaiBER\n",
542 524 "Edi1axfWrl2LkJAQxMTEoGTJkmjbti26dOmCcuXK4dixY9ixYwdOnDgBHx8fjBkzpkDHjI6OBgCT\n",
543 525 "laWyWC5c4PChVsttT9TqnuzsDHzyCTB5MvcOa9VKHR0CgcBsFEkDO3HiBKZNmwZJktC2bVvUqFED\n",
544 526 "LVq0QP369Q2v6d69O4YMGYLk5GQEBAQU+JjJyckAAHt7+wLvy2Ih4saTej2vxapRQ109o0dz6v7+\n",
545 527 "/cD580CdOurqEQgEJqVIGljLli0RHBwMFxcX6PV6Q4dknU4HbXpxWVtbW9SqVctkxywSBvbnn8DB\n",
546 528 "g1wuasoUtdXw3NvgwcBPP/GocP58tRUJBAITUiTnwBwdHeHu7g6tVmswLwAG8wJMX8hXnm/LWPG+\n",
547 529 "UJGSAowbx/enTeP5J0sgKIi3K1ZwCxeBQFBoKJIGlhtMnUYvN7GUm1oWOhYvBu7c4XqEw4errcZI\n",
548 530 "zZq8Bi0ujmskCgSCQoMwMIWQkzciIyNVVmIGEhKAr7/m+1OnApY2ynzvPd6uW6eqDIFAYFqEgSmE\n",
549 531 "3IW5UBrY/PlAWBhQrx7Qs6faal6mRw821f37eY2aQCAoFAgDUwjZwKKiolRWYmJiY42VNr7+Wr20\n",
550 532 "+Zzw9ATatgV0OmDzZrXVCAQCEyEMTCEK7Qhs8WJuXdK0KdC5s9pqskdeUL1li7o6BAKByRAGphCF\n",
551 533 "0sDS0oC5c/n+559b5uhLpmtX3v79N8/ZCQQCq0cYmEIUyiSOTZuAe/eAKlWAN95QW03OlC4NNGzI\n",
552 534 "DTb371dbjUAgMAEWli5WeCmUI7BZs3g7ZgyXjrJ0unUDTp8Gtm+3fMMt5EREALt2ccOCe/d4KtXF\n",
553 535 "BahY0RiNdnVVW6XA0hEGphCFLokjOBg4cYIXLA8erLaa3PHGG1wbcft2LntlySHPQsrFi9yke9Mm\n",
554 536 "XvueFT/+CNjZ8bTlZ5+JCmCC7BEGphCFbgT2ww+8ff99IH2RtsVTrx5Qpgzw8CFw7hz/W6AIkZE8\n",
555 537 "TbpoEf9bo+HE0LZtuQepiws3MLhyhacpDx0CVq0CVq/mvqjTpwMeHuqeg8DykMiU9ZIE2fLw4UP4\n",
556 538 "+vqiZMmSePz4sdpyCsbdu0Dlyhw2vHuXTcFaCAoCFi7kWo2TJqmtpkhw+jSPpu7dA2xt+Zpn3Dig\n",
557 539 "bNns33PvHkeo58/nXCFPT0547dFDOd0Cy0ckcShEoRqB/fQTV5x/5x3rMi+A58EADiMKzM6iRUDz\n",
558 540 "5mxIjRpxU4Aff8zZvACgfHlOcD1/njvhPH8OvPUWMHYskF5WVCAQIzClICLY2tpCp9MhKSnJeqvS\n",
559 541 "x8YCvr5ATAxfWjdooLaivJGQwJfzSUnAo0ecnSgwCzNmGBtzf/ghj6jy82dPxGY2bhyPxtq04cYH\n",
560 542 "IslDIEZgCiFJElxcXAAAsdZcFf3339m8/vMf6zMvAChenDtFA8DOnepqKcRMmsTmJUncyebnn/Nn\n",
561 543 "XgDv45NPeF6sVCleBfH66zyVKSjaCANTEGdnZwBWbGA6nXHhcgE7VKuKnEK/bZu6OgopP/7IHXW0\n",
562 544 "Wu5iM2KEafbbrBlw/Djg78+Nv1u2FCZW1BEGpiBWb2AbNwK3bgEVKgBvvqm2mvwjV+X46y9usyIw\n",
563 545 "GZs28WgJAJYuBQYMMO3+K1ZkE6tfn/8UW7fmSLCgaCIMTEGs2sD0er6sBoDx461j4XJ2+Pry5Xxi\n",
564 546 "IrB1q9pqCg3XrgGDBvGc1ddf831z4OkJ7N0L1K0L3LjBc2LWntgryB/CwBTEqg1syxbg0iX+8Zf7\n",
565 547 "a1kz/fvzdtUqdXUUEhITgbff5gHtO+8YkzfMhYcHrxerXZuNs2tX0XC7KCIMTEHs7OwAAKnWlgdM\n",
566 548 "ZBx9ff55/mfjLYm33+ZR5J49okeYCZg0iats+Ptz6rwSRU48PdnEqlQB/v0X6NNHpNgXNYSBKYg2\n",
567 549 "Peym0+lUVpJHduwAzp7llPPAQLXVmIYSJYD27Tkve8MGtdVYNf/+yynyGg2wciWQHmhQBG9vrqno\n",
568 550 "5QXs3g188AFfbwmKBsLAFESj4Y9br9errCQPEAFTp/L9zz4DHBzU1WNK5DDi6tXq6rBi0tL4mkav\n",
569 551 "B0aP5sXKSlOlCieUFisGLFkCzJunvAaBOggDUxCrHIH99Rdw6hSPWEyVD20p9OjBhnz4MHD/vtpq\n",
570 552 "rJIFC3hwXr68McqsBq+9xksUAeDTT/m/VFD4EQamIJYwAiPiYhSRkbys65V88w1vP/2UFwEXJpyd\n",
571 553 "ge7d+f6aNepqsUJiYoyD89mzAScndfX06cOlptLSeIpTrBEr/AgDU5DExEQAQLFixRQ7JhEPoP77\n",
572 554 "X84cd3Xl4vEeHtyywt+fu6Fs3gwkJ7/w5iNH+ObuzpMLhZF+/XgrshHzzA8/cP5Ls2aWU2R3xgxO\n",
573 555 "qw8PB3r1yuJvWlCoEAamIAnpreyLKzCSSUjgousNGgCNG/MXOziYU43t7bl9hV7P62iWL+dCqQ0a\n",
574 556 "vJDFNX06b0ePVnZmXknkzonnzgGXL6utxmoIDzd21PnuO8tprWZjw4PpcuWAf/7hEZmg8CIMTEHi\n",
575 557 "4+MBAI5m7J+l0/FEtr8/dw45e5bTjUeP5myt8HCuYxsdzVenZ84AM2cCNWvyYMTWNn1H//7LaV2O\n",
576 558 "jsCoUWbTqzr29tzrAxDJHHnghx+A+HiuytW8udpqMuPtzYmldnbcOGHtWrUVCcwGCRSjZs2aBIDO\n",
577 559 "nz9vlv2fOEFUqxYRBw6J6tYlWrmSKDHx1e/V64lSUjI80KsX72TsWLNotSj27eNzrVSJPwhBjjx9\n",
578 560 "SuToyB/ZqVNqq8men35ijU5ORFevqq1GYA7ECExBzBVCTEriVhPNmvFi0goVgD/+4NHVgAG5y3yX\n",
579 561 "pAyjrytXuF+FnR3wf/9nUq0WScuWvMbt9m3g5Em11Vg8s2fz6KtLF6BhQ7XVZM+HHwJ9+3J1kN69\n",
580 562 "OawuKFwIA1MQc4QQb94EmjYFvv+e/z1uHE/l9O/PC0vzxcyZPIgbOtTQLyspyTR6LRKtln/pAJHM\n",
581 563 "8QoiIozrrL78Ul0tr0KSeB44IICroH34oVjkXNgQBqYgsoGZagT255+ceHHuHFC5MidpfPcdL+jM\n",
582 564 "N3fv8vBNq+WFy+l88QWwfn2BJVsu8qLmtWs5D1uQJXPnciJQ+/a89srScXbm+bBixYBly7hCvqDw\n",
583 565 "IAxMIYjIZCFEvZ5LEvbqxWtxevbkcGHjxiYQ+t13nAnSvz/3rgCHYH75hYu0/vGHCY5hiTRoAPj5\n",
584 566 "AU+eAAdPcYCBAAAgAElEQVQOqK3GIomKMraDmzRJXS15oWZN/vsFgI8+4gs+QeFAGJhCpKSkQK/X\n",
585 567 "w9bWFraGyaa8k5DAizS/+45ThmfP5itMk7RXDwvjS1RJAiZMMDzs6MgdVIh4zdj27SY4lqUhSaJC\n",
586 568 "/SuYN4+zV1u14obc1sSgQVzyKjmZ58Oio9VWJDAJameRFBUiIiIIALm5ueV7H48fEzVuzJlVrq6c\n",
587 569 "PGdSxo7lnffsmeXT48fz0w4OnPFY6Lh6lU/Q2ZkoIUFtNRZFbCyRhwd/PPv3q60mfyQkcGau/Ccu\n",
588 570 "Ek6tHzECU4iCzn9dvsxzDidPcpbh8eNcccBkRERwYTsg22ZO06cDw4dzQkfPnjxgK1QEBHAoMTYW\n",
589 571 "2LlTbTUWxW+/8Z/Ia6/xCMwaKVaM53FdXHj+WA6HCqwXYWAKUZD5r2PHeLHo3bs8z3XiBFC9uokF\n",
590 572 "zpvHudEdO/KPeBZIEvDzz8Drr3Mb9969C2G+gxxGFLURDeh0HKoGOMvVUqpu5IcqVdiMAT6X4GB1\n",
591 573 "9QgKhjAwhcivge3YAbRrxxPoPXpwfkHJkiYWFxtrvBx9RStdW1u+ivXx4VGgXG2q0CBX5di5kw1d\n",
592 574 "gE2bgDt3ONP1zTfVVlNwevYExozhi68+fUQ/U2tGGJhCyBXo5ZYquWHFCv7BSEriCegNG8xUEP7X\n",
593 575 "X7k8ffPmQIsWr3x5iRJcPxHgauSnTplBk1qUKwc0acLZMrt3q63GIpBrHn7yCa+uKAx8+y2vn3zw\n",
594 576 "ABg4kDN7BdaHMDCFyGsrldmzOXNKp+OEwIULzfTjkZRk/IX64otcx4fatOGrWJ2OC9VbU4uzVyKP\n",
595 577 "wkSnZpw5wyFrd3dgyBC11ZgOW1te8ufpCezZY+waJLAuhIEpRG4NjIijeHIFp1mzOExntnmHpUuB\n",
596 578 "x4+BevWATp3y9NapUwFfX/6RW7jQTPrUoFcv3m7fDqS3wCmqyAt/Bw3i5RSFibJleV2jJAGTJwN/\n",
597 579 "/622IkFeEQamEFK6A1EOtWzS0rjp8YwZPNpatoxHOWYjKck4iZWH0ZeMkxMwZw7f/+9/gadPTaxP\n",
598 580 "LSpW5ESWuDi+PC+iJCYaF64PHaquFnPRsSMwcSJfOPbvL5pgWhvCwBTiVSOw1FT+Ai1ezMV3N2/m\n",
599 581 "q16zsmgRf2Pr1OGGYPmgZ0+gQwdOMilUCR1vv83bIhxG3LyZF/w2bAjUrq22GvMxeTLQti1fgL3z\n",
600 582 "DpCSorYiQW4RBqYQORmYXB1AXqOydy/3WTIrCQlGx5kyJd+VfyWJq4IAwPz5QGioifSpjRxG3Lq1\n",
601 583 "yLb1lb373XfV1WFutFouvlKmDC9ZCQwURX+tBWFgCiEbWMX0+oIyiYmcabh1K0+U79unUJmeX37h\n",
602 584 "ua8GDYDu3Qu0qzp1uJh7SgowbZqJ9KlNlSpA3bq8xGDvXrXVKE5iojEJM5+Dc6uiRAlg2zbO8l2x\n",
603 585 "ohD9HRdyhIEphEajQZ06dbBy5UrDY3FxQNeuPM3i7c1rvBTpr/TsGfD113x/yhSTZIhMncpXsr/9\n",
604 586 "Bly/XuDdWQZyNmKhLsOfNX/9xYP0hg052aEoUL8+m9jAgWxkha7STCFEGJhCFCtWDAcOHICHhwcA\n",
605 587 "nlvo1IlNq3Rp4OBBHskowoQJvO6rfXvuSmgC/Px4ol+nA776yiS7VB95HmzLliI3MfLnn7zt2VNd\n",
606 588 "HUrTpg2PwMaONbTCE1gwEuWUFicwGXq93hBGjIhg8zp1iq9u9+1jA1CEf/7hFZw2Nty+OSDAZLsO\n",
607 589 "DeXIm07HtRtNuGv1qF2bP6edO4HOndVWowipqVztJTKSm3NXraq2IguAiMPJAA/PbGzU1SMAIEZg\n",
608 590 "iiGb19OnfJV36hRnax8+rKB56XTcEImIF5qZ2GHKlePFrnp9IcpILIKLmg8fZvOqWrUImldcHE9I\n",
609 591 "T5nCw8+AAF7tbGPDPYtcXXkVtK0tT5w1aQL068ftqbdtK0RrSawDMQJTkLAwrmt4+TLg788jL19f\n",
610 592 "BQX8+ivw/vt80CtXeCGXibl7lw2ZCLh6lUdkVs3ly0CNGoCHBye9FKCXm7UwciQXbf7vf4tIhYq0\n",
611 593 "NI6ZrlkD7NrF6yOzwtGR54sTEnKuPeXnx6H5bt248nUR+JtRC2FgChEaymtNbt7k38O//wZKlVJQ\n",
612 594 "wPPn7JoREcC6dcb5HTMwbBhXcBg6FFiyxGyHUY4aNdjI9uzhRW+FGL2ew9qPHnGUQJGkIrXQ6Th/\n",
613 595 "fto04MYN4+NNm3Jd0Lp1OYRcurRx5AXw1VlqKo+27tzhW0gIh+dPnmSDk3Fz4wWew4ZxtRtrLuVv\n",
614 596 "iajYi6zIcPMmUbly3EivXj2ip09VEDFiBAto29bsnfxu3iTSaolsbIhu3zbroZRh0iT+7IYPV1uJ\n",
615 597 "2Tlxgk+1bNlC3vDx8mWiRo34ZAGiKlWI5swhevCgYPtNTSU6fpxowgSiGjWM+weI6tQhmjuXKCrK\n",
616 598 "NOcgIGFgZubyZaLSpfnv97XXiCIjVRBx8iSRJLGjXL6syCEHDeJzHjFCkcOZl7Nn+WRKly7kv+pE\n",
617 599 "n3/OpzpqlNpKzIReT/Tjj0T29kan/v13Np5XEBfHnal1ujwc7/x5oo8/Nrazljt+jx1LFBqa//MQ\n",
618 600 "EJEwMLNy+jSRtzf/zbZsSRQTo4IInc54pfnZZ4od9upVIo2GyNaW6N49xQ5rHvR6Ih8f/gzPnFFb\n",
619 601 "jdnQ64n8/Pg0DxxQW40ZSEnhUbRsJMOGEUVH5/rthw4ZfW/GjDweOymJaN06/iGQj29jQzRwIF8g\n",
620 602 "CfKFMDAzsWsXkaMj/5127EgUH6+SkIULWYSPD18+Kkj//nzoDz9U9LDmQQ7BTp2qthKzcekSn6Kn\n",
621 603 "Z64GJNZFQgJRhw58gg4ORGvW5Gs3GzZwMAMgWrIkn1pOnSLq25fj7LKZtW9PtG9foR/hmxphYGbg\n",
622 604 "t9+Mf5sDBxIlJxufe1DQGHteePbMGLrI5xe2IISE8Jfdzo4oLEzxw5uWLVv4c2zcWG0lZmPaND7F\n",
623 605 "IUPUVmJiEhKI2rXjkytRguiffwq0u59/5l1ptUTbtxdgR3fvEo0ZQ+TkZDSyxo2J/vwzj3HKoosw\n",
624 606 "MBOi1xt/BACi8eMzX1Ddvn2bateurZygoCAW0qaNald2PXuyhC++UOXwpiMujuNHkkT05InaasxC\n",
625 607 "vXr8f7Vtm9pKTEhCAo9uZPMy0RzwF1/wLosV48SXAhERQfT118b5BoAoIIBo6dLMV7+ClxAGZiIS\n",
626 608 "EowhM0kimjcv8/NpaWlUpkwZcnZ2VkbQqVPGxI2QEGWOmQXHjvFn4u7OHmDVdOrEJ/P772orMTl3\n",
627 609 "7vCpOTkRJSaqrcZEpKURdetmNC8Tfg/0eqKhQ40h16tXTbDT+Hiin34iKl/eaGS+vkSzZike/rcW\n",
628 610 "hIGZgNBQovr1jT8Amza9/JrY2FgCQI6OjuYXpNNxKALgbCeVee01lvLTT2orKSDz5vGJ9O6tthKT\n",
629 611 "M3s2n9rbb6utxISMHs0n5eHBE3wmJiWFqEsXPkT58kQPH5pwxytWZE7D9/AgmjxZpTU4loswsALy\n",
630 612 "9998cQcQVapEdPFi1q+Lj48nAFSsWDHzi1q0iAWVKaNS6mNmNmwwfj5paWqrKQC3b/OJuLgUutDO\n",
631 613 "66/zqa1apbYSEzF3Lp+QnR3R4cNmO0xcnPFasU4dEy/x0uk4ntusmdHIihfntHyrT+01DcLA8klq\n",
632 614 "KtHEicaMpLZtOWciOxITEwkA2dvbm1fY8+cc0wCIVq8277FySVoaUcWKLKlAk96WQPXqfCL79qmt\n",
633 615 "xGQ8eWJMtslDVrnlsnu38Yu5cqXZD/f0KZG/v3G6OSnJDAc5fNg43JNT8N97T7F1nZaKKOabD0JD\n",
634 616 "uSDv119zZZivvuIqQ56e2b9HSi8hQ+au3PXf/3LZqNatuT+6BaDVcglGgPtoWjVdu/J21y51dZiQ\n",
635 617 "rVv5V7FtW+4IbtXcvw8MGMAnNHky3zczXl7c/LNUKWD/fmDw4JxLJeaLFi2AHTuAc+e4NJVeD/z+\n",
636 618 "O1C9OnfEPXy4aLaRVttBrQm9nuiXX3ghvVyYIbcLPlNSUggA2djYmE/ggQMszNbWLDH/ghAezrI0\n",
637 619 "GiuPfvz9N3/GSmaTmpmOHfmUFi5UW0kBSU42Trh27qx4KvrZs8bfhv79zRxlvnWL6IMPjCurAZ7I\n",
638 620 "LGIIA8slt29zeED+W+nZk3+Uc0taWhoBII1GYx6B8fFElSuzuK++Ms8xCki/fizvyy/VVlIAkpI4\n",
639 621 "dxogevRIbTUF5skTY93KnELgVsH//Z+xPJRKJ3PwoHFZV6dOCmTePn7MX6jSpYnu3zfzwSwPYWCv\n",
640 622 "ID6ek3/k3ywvL6K1a/O+rEqv1xMAMtug95NPWGCtWhabYHDwoHHkatWVHjp35hNZtkxtJQXmp5/4\n",
641 623 "VLp2VVtJATl0yDg3VOCFWQXj1Cn+nZDrnyqyiN+qv1D5R8yBZQMRsHo1N/SbMgVITAT69uWuGn36\n",
642 624 "5L0rgpThDWTqWPWWLcCcOTzZtGQJYGdn2v2biNdf51ZJYWHcTsZq6diRt3v2qKvDBKxaxdv+/dXV\n",
643 625 "USDi47mTKsBzwE2aqCqnYUPg2DFu8HriBNCgARAcbOaDFtUO0Wo76Itcu3aNBgwYQI9UCs/o9Vw1\n",
644 626 "qGFDY7iwXj2+wCsoGo2GAFCqKa+Wbt0icnVlod9/b7r9mompU41zBFbL5ct8Et7eVl3yR168XLy4\n",
645 627 "la+THTXKmMduQdGHsDCiFi2M09ILFohSh6bGYgzswYMHNGLECNJqtQSARo4cqejx09K4WHTt2kbj\n",
646 628 "KlGCaPFi06xdyhhC1JnqRy8hgahBAxb75ptW8e2Ql1IVK2YRS9Tyh17P8ywA0b//qq0m38yYwafQ\n",
647 629 "t6/aSgrA2bPGijMWWNU9JYWXbeV37twSiI2NpfsWOr+m+rgzIiICM2fOxLx585CUlASNRoPAwEB8\n",
648 630 "9tlnihz/6VPuHvzrr9xYFQDKlAE++wwYPhwoXtz4Wr1ej7t37+Lu3bvQaDSwtbWFjY0NbG1tUbx4\n",
649 631 "cTg7O8PFxQWOjo7QaDJHZ/XpebWSJL30XL7Q6ThF+MwZoEIF4LffrKLba8WKwH/+Axw9yl3cBw9W\n",
650 632 "W1E+kCTuzLxkCbBvH3faBZCWloakpCTo9XoQkWGb8X5+n0tNTc10S0lJMdxPS0uDVquFnZ0dbG1t\n",
651 633 "M20dHBxQvHhxFCtWzPA3KoezrT58SAR8/DFvR43iDsoWhq0tR/cbNQI++ID/5o8eBRYu5Ox3a2Dr\n",
652 634 "1q0YMGAA6tWrh27duqFbt26oX7++aX7HCohEpM7igbi4OMydOxf/+9//EB0dDQDo2bMnJk2aBH9/\n",
653 635 "/0xf4he/zNn9OyUlBQkJCUhMTERCQgISEhKQnJyMzp07wyZDjDgxkZfx/PEHsH07kJLCj1eowMY1\n",
654 636 "ZAjg4JBZ77Zt2/Dpp5/iRsbW49kgSRKcnJwMhiab2oEDBwwG7ejoCCcnJzg6Ohpu9vb20Gq1Wd5q\n",
655 637 "1aoFHx8f40HGjOFvhqsrB9xr1AAA6HQ6pKSkwMHBIdO8myWxcCEQFMTrjtScC0tNTUVUVBQiIyMz\n",
656 638 "3eTHoqOjERMTg+joaERHR6Nz584YOXIkv/n33/kPpVcvYMMGAMD+/fvRtm1b9U7oFfTt2xerV68G\n",
657 639 "AFy6BNSqBbi7A48fG6dNhwwZgpiYGIPhZTS/rB6T79vZ2UGSJMMFmnxfvmX1vc3KqOX7kiTBwcHh\n",
658 640 "pZubmxu0Wi2LXbeO1zp6ewPXrwNubip9srnj7l3+kzl4kP89YADw/fe8fiw/xMXF4dGjRwgLC8Oj\n",
659 641 "R4/w+PFjREdHIz4+HnFxcYiPj0diYiIAZPq/sLGxgb29PRwcHLLdZry/c+dOrFy5EklJSYZjlyhR\n",
660 642 "Au3atUOnTp3Qvn17lChRQhVDU8XALl68iNq1ayt2vPXr16N3794A+G9+6FCe9wX4YrpLF7466tSJ\n",
661 643 "8yAycuHCBcyfPx+XLl2Ck5MTNBrNS1fDqampSExMRExMDGJjYxEXF2dS/b/88guCgoKMD8ydC3zy\n",
662 644 "CV/e7dnDi5YBJCcno0WLFjh16hQ0Go3BRJ2cnF66n91NNlYnJyfY2dlBq9XCxsbmpZtWq830owTg\n",
663 645 "pQuOjI/b29ujXLlyAIDISKB0ab5wePCAR7wAcOvWLcTFxeW4vxcvUvK6TUhIQExMDCIjI/P8/9Ss\n",
664 646 "WTMcO3aM/3H1KlCtGuDjwycB/kEpXbo0AGT6EZfvv7jN7XOSJMHW1tZwk0dY8n0bGxukpaVlGpml\n",
665 647 "pKQgJSUFSUlJhvP/7bff0KVLFwDAF18A06dzlGHhQj6l4OBgNGvWLE+fiZK0bNkSB+Vf/9RUzrC6\n",
666 648 "fZvDJyNGAOC/oZ49e4KIoNVqodPpoNPpkJaWluVWp9NlebEs3yRJQrFixV66ZYy4ZLd1dXVFzZo1\n",
667 649 "UaJECcM56PXAvHnA+PFAUhIvHJ8yBfjoI/46ZyQqKgohISE4c+YMQkNDM5lVWFgYYmNjFfrkX835\n",
668 650 "8+cV/U2XUSWEmJ1Ty19aGxubl67iXvVv+Uvu6Oj40lXiw4cPDceoVo3Nq1Ejzibs149/g7Kjdu3a\n",
669 651 "+CWP5SN0Oh3i4uIQGxtrMLXHjx+jR48esLe3x5w5cwxXSBlvycnJhi+V/MUKDAxE9+7djTtfvJjN\n",
670 652 "C+DYZ7p5AcD//d//4fbt27C3t0dycjJiYmIQExOTJ+3m5Pr16/Dz84O7O18sbNkCbNrEX14A2Llz\n",
671 653 "J0aPHq2YHo1GAzc3N7i7u2e6yY+5uroabi4uLnB3dzf8qMHfn6/4Hz5kA/P1hZOTk0X9qGSHnGEL\n",
672 654 "ZA4fenl5YceOHZnM/lX35W1KSkq2kRH5M8uNUcv39Xo9kpOTkZSUZLhNnz7dKHbZMjavgABg2DDD\n",
673 655 "wyNHjsSFCxdM+nnFy1e7+aR3795YsGABvLy8oNFw1PONN3i7YwcHU+bNA6ZO5Uxn+SLazc0NzZs3\n",
674 656 "R+3atbFp0ybcvXsX58+fR2RkJADAwcEBpUuXRpkyZVCmTBmUKlUK7u7umaI7xYoVA5D5YjAtLc3w\n",
675 657 "2eZn++zZMzx8+BA6nQ4Af4/s7e0L9BnlF1VGYEQEnU6H4OBgbNu2Ddu2bcPVq1cNz2u1WkybNg0T\n",
676 658 "Jkwww7G52kz6YEAxIiMj4eHhAVdXV0RFReVvJ8uWcQyCCJg1i//ysyE1NRVxcXGGmzwyjI2NRWxs\n",
677 659 "rME0M75GNlX5vjy/It/kK1f59uIFBICXHsv4+JgxY/Dhhx8CAFauBN59F2jVCjhwgDWHh4ejffv2\n",
678 660 "htdntT87O7tsw1mv2sr3XVxc4ObmBmdn54KFPTp14hHwunXA22/nfz8Kc+IE0LQpX7jdu/dy1MHi\n",
679 661 "SUnh9RihoezEffsCABISEvDgwQPDaFSn0xkiCFlt5VtWF8PyTa/XIykpCYmJiZluCQkJhu+SfKGY\n",
680 662 "1X15a29vj5kzZxpGwDLbtgHjxgHXrvG/q1UDPv2Uw4svTmMA/Nsp5wrIYVulOHXqFCZMmIB9+/YB\n",
681 663 "AEqVKoVJkyZh2LBhsFNr6U5BMkBMyY0bN2jWrFnUunVrsrGxoXXr1qktyaQ8ffqUAJCHh0f+drBq\n",
682 664 "FddhAohmzjStOBWIijKWlnr8WG01+WTiRP7/mDBBbSV5Qs46/7//U1tJPlmwgE+gRg2ra2+Qlpb2\n",
683 665 "UhZyair3rixXLnMG9IQJllGr98qVK9SrVy9DFrWrqyvNmDGD4iygwZ/FGFhGIiMjKbHQdNVjwsLC\n",
684 666 "CACVKFEi729euNBYXXvqVNOLU4muXfmUfvlFbSX5ZM0aPoHu3dVWkmtSU43tf06fVltNPkhM5CaP\n",
685 667 "ANH69WqrMSnJydwGrG5do5EB3GtwyhSi4GDzFNzQ6/Wk0+leMtbo6GgaP348DRw4kACQg4MDff75\n",
686 668 "5/T8+XPTi8gnFmlghZHQ0FACQD4+Prl/k15vXKxTyMyLiOi33/i02rVTW0k+uXiRT6ByZbWV5Jq/\n",
687 669 "/mLJ/v5WsWzwZWbNMi5atuJF5Dmh13P3lMBAY40C+ebqStS6NdGYMTxq27ePu0HnZSG6Xq+ntGxG\n",
688 670 "rjqdjmLSF2jOnj2bJEmi0aNH0wcffEAPTdax03QIA1OIW7duEQCqUKFC7t6g03E3ZYBHX/Pnm1eg\n",
689 671 "Cjx/zutPtVorbTSbnMwnIElcNNMKeO89/pOaPFltJfkgJsZYZHDHDrXVKEJiItHmzUQffkhUpUpm\n",
690 672 "M3vx9vPPL79fp9ORPocrlevXr9OSJUtowIAB5OfnR5Ik0S/pIZFx48aRJEn0VXpxcJNWEDIRqi9k\n",
691 673 "LiqkpqYCAGxfzJXNirg4znDYvJlrnK1YYZioLkx4ePBasD17OCMxQzKZdWBnx8kEV67wrUEDtRXl\n",
692 674 "SFISL6QFOPvW6pg9G3j2DGjeHOjcWW01iuDgwAue5UXPDx4A589zW7DLl/nfciJsyZIvvz+rJKVn\n",
693 675 "z55h8uTJWLRoEdLS0uDq6oqAgAC0bNkSkydPRq9evQBwkgbASxOy25faCANTiFwb2PXrQO/ewMWL\n",
694 676 "nKa9bh2QnplXGOnd25jIZ3UGBvAC8itXgJAQizewnTuBmBiWGRCgtpo88uwZr/oFgBkzrKLqjDnw\n",
695 677 "9eWb3FdVhghIS9NDr2ejSUlJQXBwMPbt24eIiAgMGDAATZs2BcBFGRYsWICAgADMnj0b3t7eKFmy\n",
696 678 "JNzc3ODo6GjIbKxSpQoAGFLkLdHALE+RudHpuG1quqEoRVpaGgBe25ElRLyuq149Nq+AAOCffwq1\n",
697 679 "eQFAjx6cxr1vHzeStjrSK6AgJERdHbkgvWCIpTTqzhszZwKxsbx0oUULtdWoAqWveHr48CEOHjyI\n",
698 680 "x48fA0B65RLA1lYDjUaD06dPo1KlSmjbti02bNiAvXv34u2338aoUaOQnJwMR0dHAMDnn3+OTp06\n",
699 681 "oUGDBvBNX8eYMS1froYSGhqKiIiITBosBrVjmIpz7JhxNvSdd4j++IMoIsLsh719+zZt2bKFkrOq\n",
700 682 "ln3jhjElD+DOj1FRZtdkKXTowKe9eLHaSvLB+vVk6ABswSQmGhst3r6ttpo8cv++sfPwmTNqq1EF\n",
701 683 "OUPwxo0bZG9vT5Ik0bvvvpvp+X///ZfWr19P1atXpxo1atC2bdsoOjqaIiMjqV27dqTVaunIkSNE\n",
702 684 "ROTh4UFBQUH077//0ooVK2jQoEHUsWNHunbtmmGfu3fvJh8fH6pfvz7dvHmTiHgZQE5zakpT9Axs\n",
703 685 "925eP5Jx9lOrJWrVijOc0v+jFOHJE6Lx44ns7FiHiwvR8uVWmh6WfxYv5tPv0EFtJfng+nUWn5fs\n",
704 686 "UhXYutWYkm11jBjB4t9+W20lqtOnTx9ycXGhLl26kCRJ9NFHHxmSKz799FNq06YN7d27N9N7li9f\n",
705 687 "Tj169KD9+/cbHnvjjTdIkiRyc3OjUqVKUevWrWnNmjWUnJxsyFA8fPgwOTs7U8eOHenZCx2uIyMj\n",
706 688 "KSQkRHUzK3oGJnPrFtGcOURt2rCBZTQ0Pz/+0qxebfpVtno9X0UGBRE5OBiPOXiwQq1bLY9nz6w4\n",
707 689 "GzEtjRtqAaq1sc8NgwezxG++UVtJHrlxg/8wNBrOFy+k3Lhxg4YNG2YY6WTFtWvXyNHR0ZAlOGLE\n",
708 690 "CJIkiZYvX05ERMePH6dWrVrRsWPHiIgzDL/88kuSJIlGjBhBqampBsPp27cv1a1blxITEykhIYFi\n",
709 691 "s8jDv3TpEjk7O5OzszMFBQXRhg0b6L333qPq1auTJEnk7OxMoaGhpv4o8kTRNbCMRERwpYu+fV9e\n",
710 692 "eAEQVa1KNGgQ0dy5REeOcEOfvFx5PHzIubCffkpUsWLmfXfvrnoLdEugUyf+OBYuVFtJPmjShMVn\n",
711 693 "uMK1JFJTidzdWaLVeUC/fix86FC1lZiVQYMGGVLYXxzVyP/eu3cveXt70x9//EFERCEhIdSoUSOq\n",
712 694 "X78+XU4v2TFy5EiaPn06ERF988035O7uTm+++Sa1bduW6tatSxcvXiSdTkdDhw4lPz+/l3To9Xp6\n",
713 695 "mn4VmZSURE2aNCFJkgw3T09PevPNN2n16tX0559/UpTKUx0iCxHgnhL9+vEtNZV7bB04wLejR7ny\n",
714 696 "+NWrwPLlxve4ugKVKgElSgCenrwPSeJy06mpQHg48OgRF15Mn2w1UKoUt+EYOZIragvQpw+wezdn\n",
715 697 "Iw4frraaPFKnDifcnD+fqbiypXD6NHcA8POzsuzD8+e51qGdHTB5stpq8gSl13vVarU51iuUXyMX\n",
716 698 "6PX09IQkSYbH5X1JkoT4+HhERkYiLCwMAFC9enVMmzYN77//Pg4ePIhq1aqhYsWKOHfuHADgww8/\n",
717 699 "xLvvvgs3Nzc8efIE3377LaZMmYL169ejSpUqWL58OaKjo3Hv3j3s2LEDBw4cwJkzZ9C4cWOsW7cO\n",
718 700 "zs7OWLFiBcaNG4fDhw+jfv36GDt2LBo0aAAvLy+LaNckDOxFbG2B117j24QJXDj07Fk2tdOngQsX\n",
719 701 "gBs3gOhofjw3uLgADRtyCfyuXYFmzaywgqp56dGDe4Tt389NRr291VaUB+Q2Eiaugm4q/vqLtx06\n",
720 702 "qKsjz0ycyNsPP1S++nYBkftuvQqtVovU1FSULVsWAHLsNyhnMLu4uAAAjhw5gokTJyI8PByHDx/G\n",
721 703 "Bx98gGrVqmH79u2G18vvcXZ2RunSpZGUlGQoCAwA5cuXN7SDatWqFcaOHYv33nsPzs7OSEtLg5+f\n",
722 704 "H1atWoXiGTv7WhDCwF6FnR3QpAnfZIh4hHX3Lud+P38OyBXmNRq+lSjBTa/KlOEvnwWuobAk3N2B\n",
723 705 "du240eiff7KZWQ116vD2/Hl1dWSDVRrYsWPcbdbRkS8krYyoqCisXbsWOp0OgYGBOVZr12q1qJoe\n",
724 706 "icnYokRGvm9nZwedTodNmzbB19cXEyZMQEBAgOFYM2fOROXKlSFJEu7du4fy5csjNjYWFy9exC+/\n",
725 707 "/IKVK1di48aNkCQJpUqVgouLC/z9/fHGG2+gTJkyaN26NcqVKweNRgMigo2NDYjIYF46nc5Qud9i\n",
726 708 "UDWAKRBkQK6N2Lq12krySFQUC7e3N0+11QIQFcU5EDY2RNHRaqvJJXo90euv82f65Zdqq3klGZMj\n",
727 709 "5H9/9dVXhkSHyMjIHN+v1+tp3rx5htT4F4vqyvu+dOkS+fj4kCRJVLx4cerWrRtFR0fT2rVrqVix\n",
728 710 "Yt33RU8AACAASURBVPTll1/SvXv3qHfv3jRu3DhasmQJjRgxgsqVK0eSJNHYsWMN+wwPD6fz589T\n",
729 711 "vJWUQMsOYWAKkZiYSAsWLKBx48apLcViiYw0tlh58kRtNXmkfHn+wbWE/hcZ2LSJZbVoobaSPLB3\n",
730 712 "L4t2d7f49ZCRkZE0depUWrZsGRHxOqnjx48bkh6CgoJyrCEom9Py5cupePHi1LNnT4PhvWhkz549\n",
731 713 "oxYtWlDNmjUNmYZERPfv36fWrVtT48aN6fbt2/T++++TJElkb29P1apVo2HDhtHGjRuzzDR8UYe1\n",
732 714 "IQxMIR48eEAAqHTp0mpLsWi6dOHfrgUL1FaSR7p3Z+Fr1qitJBMffMCypk1TW0ku0euJmjdn0TNm\n",
733 715 "qK3mlYSHhxvMavPmzURE1LRpU5IkiVq3bk23bt3K8f2ySS1fvtyQ7p7RaJKSkuj8+fMUHBxMaWlp\n",
734 716 "NGTIEGrSpAkRsVnKa7b+/PNP8vLyosuXL9OdO3fo3Llz5jhdi0NMzCiEHEdOSEhQWYll06cPb9ev\n",
735 717 "V1dHnrHQRA6rm//at4/nvzw9gY8+UlvNK/H29kZQUBC0Wi3ee+89tG7dGmfPnoWtrS2++OILVKpU\n",
736 718 "Kcf3U3ppJg8PD0iShPXr12P8+PGYOXMmWrRogTJlyqBu3br46KOPEBMTg8qVK2d6v5yp2KVLF4wY\n",
737 719 "MQKOjo6oUKEC6qTPy+r1euj1essrAWUiRBKHQsj1x+Lj41VWYtm8+SYngh48yHkyJUqorSiXWKCB\n",
738 720 "3brFN3d3i68zbGTqVN6OHQs4O6urJZf89NNPKF68OGbPno1Dhw4BAPr27Yu2bdtCr9fnWARXfq5W\n",
739 721 "rVqoXr06QkJCMH/+fABA7dq1MWjQILz11lvQaDRwdHREVFQUwsPDkZSUBAcHB8N+7O3t8c0332S7\n",
740 722 "/0KL2kPAooJeryetVksAKCUlRW05Fo1cFtKqwohXr7LocuXUVmJgwQIrq8B06hQLdnPj3l9WxJMn\n",
741 723 "T2j06NGGcGLVqlUpODiYiCjb5pEvcvv2berYsSPVqlWLPv74Y7p06RIlJCS89JrHpq4OZMUUcnu2\n",
742 724 "HCRJEqOwXPL227y1qjBilSrcvCk01LikQmWsLnw4dy5vAwOtZvQl4+rqisTERMO/r127hoEDB+KP\n",
743 725 "P/4whPlygohQsWJF7Ny5ExcuXMCcOXNQo0YNFCtW7KXXlMyq8VcRRRiYgjg5OQEA4uLiVFZi2bwY\n",
744 726 "RrQKtFqgZk2+bwFhxLQ0nk4CrKQjT1gYsHYtr5e0grmvF9m/fz8WL14MHx8fnD9/Ht26dcPt27fx\n",
745 727 "7rvv4vvvv0dMTAyA7NuRSJIEIjKswdLr9Vm+RpAZYWAK4unpCYA7ogqyx82NRw16vbGDsFVgQfNg\n",
746 728 "J09y80p/f6B8ebXV5IKVK7kEW/fuQIUKaqvJMxPTq4ZMnDgRtWrVwpYtWzA5vfzVrFmzcqywISMb\n",
747 729 "lCRJhX/uykSIJA4F8fLyAgA8ffpUZSWWT+/ewI4dwNatwPvvq60ml8gVOdJr0amJ1YUP167l7aBB\n",
748 730 "6urIB4mJiahevTpq1KiBgQMHGh7/4osvUL9+fSQlJaFatWoAxCjK1AgDUxDv9AJ/wsBeTefOvD1w\n",
749 731 "AEhIACy0FFtm6tfn7Zkz6uqAlRnYzZv8mTk5Gf/jrYhixYphyZIl0Ov1cHBwMBTftbGxQbdu3dSW\n",
750 732 "V6gR41QFEQaWe0qW5PrHSUk8F2YV1K3LHQkuXWLhKhEVxcXxbWyAVq1Uk5F75GydN9/kRBgrxM7O\n",
751 733 "zpDWLkZZyiEMTEGEgeWNLl14u3OnujpyjZMTUK0aZ1CoOA+2fz/PHzZrZiXJfHL48J131NUhsDqE\n",
752 734 "gSmIMLC8kdHArKaQgLxi+PRp1SQcOMDbdu1Uk5B7rl3jKv6urlYS7xRYEsLAFEQkceSNhg25otCd\n",
753 735 "O8D162qrySWvvcbbw4dVkyAfumVL1STkHnn09dZbgL29uloEVocwMAUpkV4XSRhY7tBqgU6d+P6O\n",
754 736 "HepqyTVt2/J23z6O4ylMRARw8SK3sWvcWPHD551163grF8EUCPKAMDAFkQ0s3GpW56qPHEZMbzJr\n",
755 737 "+fj7A2XLAs+eqdLg8tgxDrc2aWIF+RAhIXzz8LCSeKfA0hAGpiDCwPJO5848Ejt8GIiMVFtNLpAk\n",
756 738 "Y+mLXbsUP/yRI7x9/XXFD5135PBhz55cekUgyCPCwBTEw8MDWq0WUVFRSElJUVuOVeDuzj/GOh2w\n",
757 739 "e7faanLJm2/ydsMGxQ8tL0GTp+IsFiJg1Sq+L7IPBflEGJiCaDQaQyaiKCeVe+S1oFu3qqsj13To\n",
758 740 "ALi4AGfP8iJdhSAyFgGpW1exw+aPQ4e414uvL9C6tdpqBFaKMDCFEWHEvNO9O2937eJyeRaPg4Nx\n",
759 741 "FCYnKSjAgwecxOHlBfj4KHbY/LF4MW+HDOEYsUCQD4SBKYwwsLxTuTJQvToQHa1qdnrekMNiK1Yo\n",
760 742 "tojt7FneygVBLJaoKGDjRr4/ZIi6WgRWjTAwhXF3dwcARFlIzyhroUcP3q5Zo66OXNOxI1C6NHD1\n",
761 743 "KnD8uCKHtJrw4apVXGqrXTugYkW11QisGGFgCiP3BIuNjVVZiXUxYABvN2wAkpPV1ZIrbGyAwYP5\n",
762 744 "/pIlihxSHoHVq6fI4fKPHD4cNkxdHQKrRxiYwjinF6cTTS3zRvXqPLKIirKi2ohDh/J23TpAgQuW\n",
763 745 "jCFEi+Xff1moh4dxWC0Q5BNhYAojRmD5Rx6F/fGHujpyjZ8frwGIjzeueTITz58D9+5x25mAALMe\n",
764 746 "qmDIo9GBA61gpbXA0hEGpjDCwPJPv36cnLB9Oyd0WAVymMzMYUR5/Vfduhac1JeYaLz6EOFDgQkQ\n",
765 747 "BqYwNjbcQ1SvQp08a8fHh/tbJScbk9gsnt69uafJiRPAlStmO4xsYHIxfIvkzz/5yqNRI6B2bbXV\n",
766 748 "CAoBwsAEVoXcsX3lSnV15JrixY0p9cuWme0wcveWhg3NdoiCI5I3BCZGGJjAqujVi6dODh4E7t9X\n",
767 749 "W00ukdc6rVjBNbFMDBEQHMz3LdbAbt7k/7RixYC+fdVWIygkCAMTWBWurlyZI2MpPYunaVNO6Hj0\n",
768 750 "CPjrL5Pv/soVICwMKFmSG0JbJEuX8rZPH/5PFAhMgDAwhZHnviSLLpVg2chhRAWLXBQMSQLee4/v\n",
769 751 "//67yXf/99+8bdfOQitwpKUZz1uEDwUmRBiYwkSm9wRxc3NTWYn10qkTd2oOCTFWn7B4ZNfdvh1I\n",
770 752 "SDDprvfs4a3cxcXi2L2bh4j+/sB//qO2GkEhQhiYwshV6L28vFRWYr3Y2hqnUawmmaNcOW6RnJBg\n",
771 753 "dBwT8Pw5sHcvoNEYu1dbHBmTNyxyiCiwVoSBKYxsYHJbFUH+ePdd3q5axREqq6BXL96asE/Y+vVc\n",
772 754 "ob99e54DszgeP+ZRp1YLDBqkthpBIUMYmMKIEZhpaNyY8yIePwb27VNbTS6RDWz7dpMVdJRHoHKV\n",
773 755 "Eotj+XLOvHzjDaBUKbXVCAoZwsAURhiYaZAk44/2+vXqask1lSsDdeoAMTEmcd07d4Bjx3ip2Vtv\n",
774 756 "mUCfqSEyViAJDFRXi6BQIgxMYYSBmY6ePXm7ZYtZlleZB9lpTNBeWl5G8OabQHqFMsvi6FHg+nVu\n",
775 757 "K2OxE3QCa0YYmILodDpERERAkiRDXzBB/qlZE6hSBXj2jH8rrYJu3Xi7fXuB1gAQGcOHcoKjxZGx\n",
776 758 "63J6CTWBwJQIA1OQyMhIEBHc3d0NNREF+UeSjAOaTZvU1ZJr6tXjoo4PHxr7n+SDs2e5V6aXl4Wm\n",
777 759 "z0dHG2O7clsZgcDECANTEBE+ND0ZDcxqFjXLo7AChBHlou7vvMPLCiyONWu4+nyrVjz3JxCYAWFg\n",
778 760 "CiIMzPQ0acJTLKGh3CvRKpANbNu2fL1dpwNWr+b7Fh8+FMkbAjMiDExBhIGZHo3G2Nh382Z1teSa\n",
779 761 "Nm04dfDff4EHD/L89sOHubBFpUps4BbH+fNcHt/V1ZhpIxCYAWFgCiIMzDxY3TyYgwPQoQPf3749\n",
780 762 "z2+Xp5b69LHQwhZy6vyAAVx9XiAwE8LAFOTp06cAhIGZmpYt+WI/JAS4cUNtNbkkn2FEnY77QgLA\n",
781 763 "22+bWJMpSEzkKsuACB8KzI4wMAURIzDzYGfHhR4AKxqFde3Kw6d9+4D4+Fy/7ehR4MkTDh/Wq2dG\n",
782 764 "ffll40YgKoobk1mkQEFhQhiYgggDMx9yGNFq5sFKluQJrORkrsabS+Qyir17W2j4cNEi3g4frq4O\n",
783 765 "QZFAGJiCCAMzH5068dRScDAnOFgF+Qgj7tjBW4vMjbh6lTNMHB2Bfv3UViMoAggDUxBRid58ODoa\n",
784 766 "F/Ru2aKullyTsSpHeqPTnLh1i+sfurtzhM7ikFPn+/UDnJ3V1SIoEggDUxAxAjMvVhdGrFkTqFAB\n",
785 767 "CA8HTp585cvlzstt2nB3EosiORlYtozvi/ChQCGEgSmIMDDz0q0brwvbv58rGVk8eazKIU+VWWTp\n",
786 768 "qC1buChl7dpAo0ZqqxEUEYSBKURKSgpiYmKg1Wrh6uqqtpxCiZcX8Prr3ODRBMXelSGX82A6HRsz\n",
787 769 "YKEGtnAhb0eMsNDsEkFhRBiYQkRERAAAPDw8IIkvuNno04e3a9eqqyPXtGzJ80WXLvEEVzacOQNE\n",
788 770 "RnL6fKVKCurLDbdu8XKAYsUsuLOmoDAiDEwhnj9/DgDw9PRUWUnhplcvDiPu2QOkXzNYNnZ2xl5Z\n",
789 771 "OYzC5Pmvdu0U0JRXfvyRt337Am5u6mr5//bOPS7Kauvjv/0MV+UqIDZeEgVN8M4RMAWviaNg2pt5\n",
790 772 "T+3NUsvrqY9ancC3TLDQMLWL4iW1g2bmDdTykimK+cpLmsqBBPWAiiIEKDdh1vvHdh4YAUGF5xkO\n",
791 773 "+/v5zGce5tmz99qjzI+199prCRoVQsAUoqIHJqg/mjfnQQ6lpQ3oUHMtlhENBZwHDVLAnschNxdY\n",
792 774 "v55fz5mjri2CRocQMIUwCJjwwOqfsWP5c4NZRhw2jLuNx45VGX1SWAjExfHrgQMVtq0moqKAu3e5\n",
793 775 "Yd26qW2NoJEhBEwhDEuIwgOrf0aN4gWADx/mEeomj5MT0KcPjz45eLDS7ZMneZR69+48UMVkKC0t\n",
794 776 "Xz6cN09dWwSNEiFgCiGWEJWjWTOe7F2v56n5GgSPWEY07H+Z3PLhtm3A1auAhwf3IgUChRECphD5\n",
795 777 "+fkAAFuRoUARDMuI0dHq2lFrRozgzzEx3LOpgOH8l0kJWGkpsHgxv160iC+BCgQKI/7XKURJSQkA\n",
796 778 "wNLSUmVLGgcvvghYWgLHjwPXr6ttTS3o2JF7Mjk5fM3wAXfu8BD6Jk14xL3JsHUrr13Tvj0waZLa\n",
797 779 "1ggaKULAFEIImLLY2QE6HUBUXgDS5KliGTEnhz8PG8ZFzCS4fx/4n//h1yEhfMNRIFABIWAKYRAw\n",
798 780 "CwsLlS1pPDTYZcQKaURatuSepElln9+0CUhN5V7j+PFqWyNoxAgBUwiDgJmbm6tsSeMhKIh7LfHx\n",
799 781 "wJUraltTC/r04anmk5OBf/0LAE9u8cILJhQjUVICfPQRvw4NNcGswoLGhBAwhZAebHLra1E2Q1A3\n",
800 782 "NG1aXql5+3Z1bakVZmZ83RMwWkacMwcwmfSZ69YB164Bnp7A6NFqWyNo5AgBU4gmDzYwCgoKVLak\n",
801 783 "cdHgDjUblhErCJi/v0q2PExBQbn39dFHwvsSqI4QMIUwCFhhYaHKljQudDqeKzchgQfNmTxDh3JP\n",
802 784 "7MQJIDMTAN8DMwlWrwZu3gS8vcuLrwkEKiIETCGsra0BCA9MaayseEg90EAONdvbcxHT603LbczL\n",
803 785 "A8LC+PWSJaJkisAkEAKmEMIDUw/DqtyBA+raUWsmTuTPW7aoa0dFVqzg6f39/XmaE4HABBACphDC\n",
804 786 "A1OPwYN5ooi4OO5ImDwjRvCDbGfOAJcuqW0NP00dEcGvhfclMCGEgCmECOJQD0dHwM+PZz8yVDU2\n",
805 787 "aayty6NP1qxR1xYACA8H8vOBwEATiigRCISAKYbBAxNLiOpgqBnZYJYR336bP2/cWGWJFcXIzARW\n",
806 788 "reLXH3+snh0CQRUIAVMI4YGpS0UBI1LXluq4fZs7OgCALl2AAQN4ra0NG9QzKjycFyR78UXgb39T\n",
807 789 "zw6BoAqEgCmEIQdicXGxypY0Try9eS2tq1d5ogtTZNUq7nDJGCocf/opFxGluXED+PJLfh0aqvz4\n",
808 790 "AkENCAFTCCFg6iJJ5cFzpriMWFICfP11+WodAJ7ct3t3nk7fICRKEhYGFBXxM1/duys/vkBQA0LA\n",
809 791 "FEIImPqY8j7YDz/w7SYLiwpLnJJUvu+0dClfTlSKjAyuqIDwvgQmixAwhRACpj4GD+yXX9RZkXsU\n",
810 792 "q1fz57feeihKfdgwHkKZlcVFTClCQ4HiYuDll4GuXZUbVyB4DISAKYQQMPVxdQV69uSrYocPq21N\n",
811 793 "Ob//zs+o2dmVn2GWYQxYvpxff/qpMufCzp4FoqJ4SisReSgwYYSAKYQQMNPgv/6LP2/erK4dFTF4\n",
812 794 "X5MnAzY2VTTo3RuYNo0Xkpwxo37DKIl48IjhuWPH+htLIHhKGJGpBhX/Z3Hjxg1otVq4urri5s2b\n",
813 795 "apvTaPn3v4FnnwXMzXleWkdHde3JyeFFKwsLuXP13HPVNMzO5mKSlQWsXQu8/nr9GLRhA/Daa0Dz\n",
814 796 "5jxc02TquAgElREemEIID8w0aN2aF4gsKQG++05ta3jYfGEhT3dVrXgBQLNmwOef8+s5c+SCl3XK\n",
815 797 "1avlofsREUK8BCaPEDCFMAiYoTKzQD1ee40/r1mj7qFmvb48U9Rbb9XiDePH80dBAU81VZeH4u/f\n",
816 798 "ByZN4iepR40CJkyou74FgnpCLCEqRGlpKczNzaHRaFBaWqq2OY2a+/eBtm358aqffuIemRocPMhD\n",
817 799 "+1u3BlJTecxEjeTm8kiU1FReETk6mofbPy1z5gArVwLPPAMkJvIlRIHAxBEemEJoNBowxlBWVoay\n",
818 800 "sjK1zWnUmJuXezyGVTk1MBxanjGjluIF8GW9vXt5yOL33wMLFz69G/nll1y8zM35gTQhXoIGgvDA\n",
819 801 "FMTKygrFxcUoLCyElZWV2uY0arKyuOdTVAQkJSkfbJeWBrRvzzUjPR1wcXnMDvbv55k6ysqA+fOB\n",
820 802 "zz57sjInmzYBU6bw6/oMDhEI6gHhgSmIhYUFABHIYQo4O/MtH4DXalSar77ijtMrrzyBeAGATsc9\n",
821 803 "MHNzfk7sv/+bq3FtIeIHo6dO5T9/+mmjEC+9Xo/x48dDkiS8Xov5ZmZm4oUXXkBKSooC1tUNCQkJ\n",
822 804 "WLx4MTaomQRaKUigGM7OzgSAbt26pbYpAiK6dImIMSILC6L0dOXGLSggcnIiAoji45+ys337iKys\n",
823 805 "eGedOxOdOFHze27dInrpJf4egCgs7CmNUJedO3eSk5MTMcbkR9euXenPP/+s1HbmzJnEGCN7e3ti\n",
824 806 "jNGRI0fke9u3b6d33nlH/lmv11Pfvn2JMUaffPIJERF5eHgYjWN4TJgwgdLS0oiIKDk5mZ5//vkq\n",
825 807 "2zHGaO7cuURElJGRQf7+/kb3LC0tacuWLU/0ORQVFdG4ceNIkiTS6XSUmJhIREQJCQkkSRKFhYXR\n",
826 808 "/fv3ydzcnN57771K7w8JCSHGGH377bdERLR+/Xpq3rx5lXPQaDSUkJDwRHbWJULAFESr1RIA+ve/\n",
827 809 "/622KYIHjB7Nv8MffKcowvr1fExvbyK9vg46/L//I3J3LxekgQOJNm4kysgoH6C4mOjMGaJ33yWy\n",
828 810 "t+ft7OyI9uypAwPU48yZM2RpaUmtWrWi2bNnU1RUFC1atIjs7e3Jzs6OLl26JLeNj48nxhhFRkbS\n",
829 811 "7du3yc3NjTw9PUn/4DOaM2cOMcZowYIFRET0xRdfkIWFBWk0GvL29iYiIsYYSZJEY8eOpaioKIqK\n",
830 812 "iqJp06YRY4z8/PyIiEin0xFjjIYOHSq3MTw2bNhA9+7do9LSUvL19SUzMzMaMWIErV27llavXk1d\n",
831 813 "unQhxhgtWbLksT6HwsJC8vLyIltbW1q7dq08JyKi5cuXE2OMpk6dSkVFRcQYoyZNmtCJh/7YMQjY\n",
832 814 "sWPH6ObNm8QYIzMzMwoNDa00j4MHDz7+P1Y9IARMQdq2bUsA6PLly2qbInhAYiL/Lre2JsrMrP/x\n",
833 815 "9Hqibt34mBs21GHHBQVEH3xAZGtbLmQAUdOmRI6ORGZmxq8HBhIlJ9ehAepw8eJFsrS0pMWLFxu9\n",
834 816 "np2dTS4uLhQUFCS/tmLFCrK0tKScnBwi4gLFGKPY2FgiKhcwV1dXSkhIIK1WS8uXL6ewsDBijBER\n",
835 817 "FzCdTlfJDk9PT3J1dSUiomXLlpG5uTkVFxc/0vaAgAByc3Mzek2v19O0adPIwcGhSg+yKoqKikin\n",
836 818 "05GFhQWlpqZWun/x4sVKAsYYo86dOxu1MwjYb7/9RkREnTt3pldffbVWNqiF2ANTEMNZsKLH2asQ\n",
837 819 "1CvduvFYiMJCZfbCfv2V5z5s3hwYN64OO7a2Bj76CLh2jeemGjKEH36+d4+n+ygt5ZEq06YBp07x\n",
838 820 "lPweHnVoAIeI5wDOyOBJk7dtA37+uf6KSnfq1AmzZs0CPRSL5ujoiE2bNiEmJga5DwaPiYmBjY0N\n",
839 821 "HBwcAABBQUFwdHTE3r17AQBt2rQBANy6dQve3t5o0aIFpk+fjhYtWoBVCJAJDg42Gmv//v24dOkS\n",
840 822 "/v73vwMAbG1tUVZWhsTERNy8eVN+PHx8Zs2aNZXsZoxh1apVsLW1le2qidWrV+PAgQOYP38+3Nzc\n",
841 823 "Kt3ftWuXfF3RhgsXLhjtk5WWlqJly5bo1asXAKBp06ZIS0vD9evX5TlkZWXVyibFUFtBGxPdu3cn\n",
842 824 "AHT27Fm1TRFUID6eOyU2NkR37tTvWCNH8rFCQup3HJmcHKKsLKLCwnobIi/P2Lmr6mFmRjRoEN+y\n",
843 825 "q2tCQ0MpNDS0ynstWrSg6OhoKigoIK1WS6+88op8Lzs7m4KDg6l///5ERHT06FF5j8rKykr2RFJS\n",
844 826 "Uow8sI4dO1J8fDxdv36dIiMjycrKivz9/eV+IyMjiTFGtra2JEmSfL3hIZc7LS2N2rZtW6XdCxcu\n",
845 827 "pMDAwFrN//Tp09S6dWtijNGwYcMo+SHP2uBZzZkzh/75z38SY4zi4+Np6NCh1KJFC8rIyCAiok6d\n",
846 828 "Ohl5hD169CCNRkM2Njay19axY0e5vSkgPDAFMYTOF5paLY9Gjq8vP8x89y6wbFn9jZOaCuzezWt+\n",
847 829 "TZ9ef+MY4eAAODkBCh7bMDPjHmbv3rwaS+/eXMYOHwbu3Kn78fR6fbX3fH190aZNG2RmZuLGjRtI\n",
848 830 "SkpCRkYGli1bBhcXF+zbt6+SVzFv3jzExcXJnoj00EHx5ORk9O7dGy1btsTcuXPh4+OD2NhY+f6e\n",
849 831 "PXvg7u6OvLw8nDt3DocOHcJff/2FKYbjCg+gR5xg8vHxkT3CmvDx8cG1a9dw+PBh3LlzB15eXthc\n",
850 832 "RbbqkSNHyqs/vr6++OKLL1BQUIDAwED88ccfuHPnjuxppqenIzExEaGhocjLy8OhQ4dw/vx5JCUl\n",
851 833 "QavV1souJajt8UlBHWBtbQ1ACJgpsmQJX+qKjOSHnFu3rvsxwsL4F/m4cUCLFnXfv1rY2tZ8lvrO\n",
852 834 "HeDQIWDAgLof/6effoJOp6v0ekFBAfbv34/NmzfjzgPlPH/+PFq3bg0bGxts374dK1asQFxcHG7d\n",
853 835 "umX03p49e8rXx48fN7onSRLeeustDB8+HJIkwd/fX94eAPhSXN++fQEAXl5e8PLyqtbu6tixYwf8\n",
854 836 "/PxqmLkxAwYMwMmTJ7Fu3TrMnDkTXl5e6Nmzpzz3h4XY3d0de/fuhU6nQ9cHNd9GjBghzwEAAgIC\n",
855 837 "wBjDwIEDH8sWpRAemIIYBEzsgZkevXrxM1lFRfVTgPjKFZ7oXZKARYvqvn9Tx8kJGDOmfpJ8NK+m\n",
856 838 "0127dsHX1xe2trbya6+++iqOHDmC3NxcvPTSS3jzzTcBACdPnqy2/4c9pcDAQERGRmLIkCEYPHiw\n",
857 839 "kXiVlZUhNTUVOTk5ICJkZ2cb7YPdv39fbutSzQHAkpIS7Nu3r0pRrglJkjBx4kSYm5vjm2++AVBZ\n",
858 840 "gCsSEBCAhQsXAuD7b6NHjwYA+dxbVlYWysrKjOZw+/btx7arvhAemIIID8y0+fhjYOdOLjQzZgB/\n",
859 841 "+1vd9b10KY+jmDhRlNiqa3r27FlJZAoLCxEREYGlD1WxnjJlCvr37y//3KFDBwDAtWvXqgyAMFDR\n",
860 842 "exk1alS17fLz85Geno709HR4eHggNTVVvscYQ2xsLAIDA2W7q2L58uUYPnw43N3dqx3HQEZGBvbv\n",
861 843 "34/AwEAcP34cd+/exZo1a5CXl4fg4GBkZ2cjKSkJjDGYm5tX2cf777+P9PR0ODk5YciDsuUXLlwA\n",
862 844 "AIwZMwatW7fGlStX5PbPPvssUlJSYFbr/Gf1h/oWNCKEgJk2Hh48p21EBN+jOn0a0Gievt+LF3mB\n",
863 845 "Y0kCPvjg6fsTGENERlGC+fn5eOONN+Dg4CB/IScnJ8PKygq9e/c2eq+Pj4/swXXr1g3u7u7y76kB\n",
864 846 "Pz8/oz0lQ0adqmjSpAm0Wi08PT3RqlUrBAQE4JlnnkG/fv3g7OxcrWgBPEPPgQMHEBYWhri4uFrN\n",
865 847 "/ejRo3jjjTcgSZK8F+jn54djx46hT58+uHLlCkpKSsAYg6+vL/5VRRkeSZLw9ddfG73Wvn172NjY\n",
866 848 "YNSoUdA8+CV4/vnn0aZNG3Tr1s0kxAsQAqYoQsBMn9BQHvp99ixPL7hgwdP1RwTMns1TFs6YIbyv\n",
867 849 "uqaoqAh79uyBq6sr1q1bh5iYGOzevRu9evXCkSNH5HaXL1+GtbW10XKfgenTp8sBE8nJyZXuP/fc\n",
868 850 "c3juQbG2KVOmwNfXt1p7LCwskJ6eXivbt23bhpycHKxbtw6pqan46quvUFxcjNjY2Gr3zR6mb9++\n",
869 851 "sLS0RElJCXQ6HWJiYqptK0mSkdA/iuDgYOTl5dWqraqoGgPZyJg1axYBoBUrVqhtiuARxMaWh36f\n",
870 852 "Pv10fUVF8b6aNePR7IK6JTEx0SjFkY2NDYWGhlJeXp7aptVI9+7dZbsN6Z/OnTtXp2NkZGSQJEk0\n",
871 853 "f/58IiJKTU2lnj171ukYaiI8MAURHljDQKfjS4mRkTwM/ORJoFWrx+/nzz+59wXwsi1OTnVrSCc+\n",
872 854 "OgAADbxJREFUpwBwc3PD4sWLERAQgH79+qltzmMxf/585Obm4u233663MbRarVH5Jjc3N5w9e7be\n",
873 855 "xlMaIWAKYthEFQUtTZ/wcODMGS5eQ4cCx48Djo61f//t28Dw4TwRxpgxPHhDUPfY2dnhH//4h9pm\n",
874 856 "PBGTDOUQBE+MCKNXEMP6M4kSbCaPpSWvG9mpE3DhAtCvH8/SVBtycoBhw4DkZJ6q6uuvn6xUl0Ag\n",
875 857 "eDRCwBRECFjDolkz4OBBHnhx/jzQvTsPsX9UQe3TpwE/P+B//xdo146nHLS3V85mgaAxIQRMQQxn\n",
876 858 "SYSANRxatwbi4vhyYE4O8NprQIcOPFrx5595iHxCArBxI08K3Ls397y6dgWOHv3PyrghEJgaYg9M\n",
877 859 "QQwe2KNytwlMDycnvpz43Xf8HFdqKrB4cdVtLSyAuXOBkBCgSRNl7RQIGhtCwBRELCE2XBgDJkzg\n",
878 860 "ARmHDwN79vCyKFlZXLQ6dAD69OHBGtVkCBIIBHWMWEJUECFgDR8zMyAwkJfcOnECSEoCzp0DduwA\n",
879 861 "5s0T4mXq6PV6jB8/HpIk4fXXX6+xfWZmJl544QU5N2Bj5ejRowgNDcWPP/6otilGCAFTELEHJhDU\n",
880 862 "PT/++COcnZ0hSZL86NatGy5fvlyp7axZsxAdHQ07OzusX78eR48ele99//33ePfdd+WfiQgvv/wy\n",
881 863 "Dh8+jB07dgDguRMrjmN4TJw4Uc4XmJKSgj59+lTZTpIkzJs3DwBw/fp1BAQEGN2zsrLC1q1bn+hz\n",
882 864 "2LdvH9q3bw9JkvDcc89h586dldro9Xq88847sLCwkMccPXp0td9JOTk5GDJkCAYNGoSUlBR0794d\n",
883 865 "ALB7925IkoTo6GikpaVBo9HIyYMrMmXKFEiSJCcUDg8Ph52dXZWfi42NDa5fv/54k1bvDHXjY8mS\n",
884 866 "JQSAFi5cqLYpAsF/BGfOnCFLS0tq1aoVzZ49m6KiomjRokVkb29PdnZ2dOnSJbltfHw8McYoMjKS\n",
885 867 "bt++TW5ubuTp6Ul6vZ6IiObMmUOMMVqwYAEREX3xxRdkYWFBGo2GvL29iYjkrBljx46lqKgoioqK\n",
886 868 "omnTphFjjPz8/IiISKfTEWOMhg4dKrcxPDZs2ED37t2j0tJS8vX1JTMzMxoxYgStXbuWVq9eTV26\n",
887 869 "dCHGGC1ZsuSxPoft27eTmZkZOTg40MKFCyk8PJxGjhxZqV1ERAQxxqhr1670zTffkI+PDzHGaObM\n",
888 870 "mZXaXr9+nVq1akUuLi60e/duo3uzZ88mxhgtXryYkpKSiDFGLi4ulJSUZNRu8uTJxBijq1ev0unT\n",
889 871 "p4kxRk2bNqWIiIhKn01cXNxjzZmISAiYgnzyyScEQP4FEQgET8fFixfJ0tKSFi9ebPR6dnY2ubi4\n",
890 872 "UFBQkPzaihUryNLSknJycoiICxRjjGJjY4moXMBcXV0pISGBtFotLV++nMLCwowqMut0ukp2eHp6\n",
891 873 "kqurKxERLVu2jMzNzam4uPiRtgcEBBhVQCYi0uv1NG3aNHJwcKA///yzVp/BsWPHSKPRkKurK/3+\n",
892 874 "++/VtktNTSUzMzPq0qUL/fHHH0REVFZWRmPHjiXGGEVFRclts7Ozydvbm5ycnCg3N7dSX7GxsZUE\n",
893 875 "zFARuiKTJ08mjUZDmZmZVFJSQg4ODvThhx/Wal61QQRxKIjYAxP8R1JczOvFADx7sV7Po14YA/Lz\n",
894 876 "gYICwNmZh3MOHgx06VJnQ3fq1AmzZs2q9Dvl6OiITZs2Yfjw4cjNzYW9vT1iYmJgY2MDBwcHAEBQ\n",
895 877 "UBBCQkLkoo6GhL63bt2Ct7c3evTogenTp2P79u1GSXCDg4ONxtq/fz8uXbqE8PBwAICtrS3KysqQ\n",
896 878 "mJhoVFXZ2dnZKIv7mjVrEBQUZNQXYwyrVq3CgQMHsHfvXsydO/eR8y8uLsakSZPAGMORI0fg6elZ\n",
897 879 "bdulS5eiefPmOHv2rJwVSJIkbN26FTk5OVi1ahVee+01AEBISAgSEhLw5Zdfws7OrlJfu3btkq8r\n",
898 880 "1jg7cOAADh8+jEGDBgHgWYeef/55OeO/lZUVkpOTcfPmTfk9lpaWcHycNDcVqTMpFNRIeHg4AaB3\n",
899 881 "331XbVMEgrojL49nLK7N45tv6nz40NBQCg0NrfJeixYtKDo6mgoKCkir1dIrr7wi38vOzqbg4GDq\n",
900 882 "378/EREdPXqUGGM0d+5csrKyot9++42IiFJSUow8sI4dO1J8fDxdv36dIiMjycrKivz9/eV+IyMj\n",
901 883 "iTFGtra2JEmSfL1hwwYj29LS0qht27ZV2r1w4UIKDAysce7fffcdMcZoxowZj2yXlpZGFhYWdOjQ\n",
902 884 "oSrvG7y4y5cvExHR3r17ycnJiTQaDU2cOJEyMjKM2huWBlesWEFLly4lOzs7OnfuHPXo0YO8vLwo\n",
903 885 "Pz+fiIisra1pwIABRMS9y2bNmpG5uTk1adKEGGOk0WioV69edPfu3RrnWhXCA6tniAh//fUXHB0d\n",
904 886 "H3kOLDc3F3Z2drUudyAQmAwWFvzgmwFJKvfEbG35gbjMTCA3t069LwN6vd6o4GRFfH190aZNG2Rm\n",
905 887 "ZuLGjRtISkpCRkYGtm7divfeew96vb5S6ZJ58+Zh0qRJcu2uh/tOTk42qivm7+9vVMZkz549cHd3\n",
906 888 "R3JyMi5cuIDMzEz079+/Uj/0iJUYHx8f3Llzp8a5FxcXAwCmTp36yHZbtmyBr6+v7Bk9jJ2dHfR6\n",
907 889 "PS5duoR27dohKCgIWVlZ2LlzJ95//305KGTw4MFG7xs5ciQ2btyIZs2aoUuXLli5ciUGDhyIF198\n",
908 890 "EStXrkRRUZH8nRYXF4ecnBx8++23GD16NI4fP4527dqhXbt2Nc6zWp5I9gS1orS0lGbMmEEeHh50\n",
909 891 "+/Zt+vTTTwmAXNqAiP9VsnXrVnJ2dqZt27apaK1A0DDx8/OrtAdGRHTv3j2ysLCgvLw8SktLMyq7\n",
910 892 "YmtrSz/88AP17duXGGOUmZkpe2BXr1416mfjxo1GHphGo6HZs2fTwYMH6eeff6aioiKj9v369aOp\n",
911 893 "U6fWaPdXX31VrQc2fvx4WrlyZY19GGz+6KOPHtmua9eu9OOPP1Z5r7S0lMaNG0cdOnSg0tLSSvdL\n",
912 894 "Skrogw8+IK1WS2lpaUREFBQURJIk0ZUrVygkJMRoHtHR0aTRaOTP+uOPPzay9eHP92kQYfT1SGFh\n",
913 895 "IU6dOoWUlBQEBwfLa8X04C+vq1evYvjw4ZgwYQKysrJM7oyFQNAQMOyvPMyuXbvg6+sLW1tb+bVX\n",
914 896 "X30VR44cQW5uLl566SW8+eabAICTJ09W2z895CkFBgYiMjISQ4YMweDBg42KZJaVlSE1NRU5OTkg\n",
915 897 "ImRnZ+PmzZvyo+J+kUs1hwZLSkqwb98+6HS6Gufev39/+Pn5ITQ0FBcvXjS6d+XKFcyaNQvp6ek4\n",
916 898 "f/58lftMKSkpGDVqFI4cOYJdu3bJ1ZcrYm5ujrfeegs3btxAdHQ0AMhh8VUxZswYTJ48GQDf03v5\n",
917 899 "5ZflsQAgKysLJSUlRp9LdnZ2jXOtCrGEWI/Y2NggJiYGvXv3Rnx8PO7evQuA/ydfuXIl3nvvPdy7\n",
918 900 "dw8ODg5Yvnw5pkyZoq7BAkEDpGfPnpVEprCwEBEREVhqCC55wJQpU9C/f3/55w4dOgAArl27Bjc3\n",
919 901 "t2rHqLj8N2rUqGrb5efnIz09Henp6fDw8EBqaqp8jzGG2NhYBAYGynZXxfLlyzF8+HC4u7tXO05F\n",
920 902 "tmzZgkGDBsHf3x8zZ87EqFGjkJCQgLlz52LixIlwcHCAi4sL5s+fj/Hjx8P+QXbpU6dO4dtvv0WP\n",
921 903 "Hj1w6NAhdOrUCQCQlJSEkydPYtiwYThw4AAKCwsRHh4OKysrBAYG4uLFi8jLywNjTA4GeZhVq1Yh\n",
922 904 "Ly8PAQEB6PigDPmFCxcA8CVXR0dHozNffn5+j/wjojqEgNUzWq0W+/fvR58+ffDHH38AALZv3y5H\n",
923 905 "4YwePRorV65EC5H1VSB4IojIaO84Pz8fb7zxBhwcHDBkyBAAfN/KysrKaO8K4HtNBg+uW7ducHd3\n",
924 906 "lwvPGvDz88PmzZvlny0sLKq1pUmTJtBqtfD09ESrVq0QEBCAZ555Bv369YOzs3O1ogXw/awDBw4g\n",
925 907 "LCwMcXFxtZ5/u3btcOrUKUREROCzzz7DkiVLwBjD+PHjERERgaZNmyImJgbLli3DggULoNfr0aFD\n",
926 908 "B4wePRrJycmVhHvHjh348MMPIUmSvF8/dOhQxMTEwMvLC7/88gsAoGXLltBqtVXaZG1tje+//97o\n",
927 909 "NQ8PD7i4uGD48OEAuKAPGjQILi4u8PX1rfV8jaizxUjBI/n1119Jo9EQAAJAWq2Wdu3apbZZAkGD\n",
928 910 "prCwkHr06EFDhw6ltWvX0siRI4kxRj4+PkaRbWvWrKFmzZpV2UdISEi1+0MPM3Xq1EqHdZ+UsLAw\n",
929 911 "sre3p7Vr19KiRYvI0dGRmjRpQr/88kud9P+knDhxgjQaDUmSVGV0o2Evq127dkTEo0Cr28urb4SA\n",
930 912 "KcjUqVMJAHXu3Jn++usvtc0RCBo8iYmJRsEZNjY2FBoaSnl5eWqbViPdu3eX7ZYkiXQ6HZ07d05t\n",
931 913 "s2rk5MmTpNFo6PPPPyciotOnT9cq5L8+YETiVK1S0ENLHQKB4OnIy8tDZGQkAgIC0K9fP7XNeSw2\n",
932 914 "b96M3NxcvP3222qb0mARAiYQCASCBokIoxcIBAJBg0QImEAgEAgaJELABAKBQNAgEQImEAgEggaJ\n",
933 915 "EDCBQCAQNEiEgAkEAoGgQSIETCAQCAQNEiFgAoFAIGiQCAETCAQCQYPk/wEPvRJNIO9OCwAAAABJ\n",
934 916 "RU5ErkJggg==\n"
935 917 ],
936 918 "text/plain": [
937 "<IPython.core.display.Image at 0x10d2bbf90>"
919 "<IPython.core.display.Image object>"
938 920 ]
939 921 },
940 "execution_count": 11,
922 "execution_count": 10,
941 923 "metadata": {},
942 924 "output_type": "execute_result"
943 925 }
944 926 ],
945 927 "source": [
946 928 "from IPython.display import Image\n",
947 929 "Image(data=resources['outputs']['output_3_0.png'],format='png')"
948 930 ]
949 931 },
950 932 {
951 933 "cell_type": "markdown",
952 934 "metadata": {},
953 935 "source": [
954 936 "Yep, this is indeed the image we were expecting, and I was able to see it without ever writing or reading it from disk. I don't think I'll have to show to you what to do with those data, as if you are here you are most probably familiar with IO."
955 937 ]
956 938 },
957 939 {
958 940 "cell_type": "markdown",
959 941 "metadata": {},
960 942 "source": [
961 943 "## Extracting figures with HTML Exporter ?"
962 944 ]
963 945 },
964 946 {
965 947 "cell_type": "markdown",
966 948 "metadata": {},
967 949 "source": [
968 950 "Use case:\n",
969 951 "\n",
970 952 "> I write an [awesome blog](http://jakevdp.github.io/) in HTML, and I want all but having base64 embeded images. \n",
971 953 "Having one html file with all inside is nice to send to coworker, but I definitively want resources to be cached !\n",
972 954 "So I need an HTML exporter, and I want it to extract the figures !"
973 955 ]
974 956 },
975 957 {
976 958 "cell_type": "markdown",
977 959 "metadata": {},
978 960 "source": [
979 961 "### Some theory"
980 962 ]
981 963 },
982 964 {
983 965 "cell_type": "markdown",
984 966 "metadata": {},
985 967 "source": [
986 968 "The process of converting a notebook to a another format with the nbconvert Exporters happend in a few steps:\n",
987 969 "\n",
988 970 " - Get the notebook data and other required files. (you are responsible for that)\n",
989 971 " - Feed them to the exporter that will\n",
990 " - sequentially feed the data to a number of `Transformers`. Transformer only act on the **structure**\n",
972 " - sequentially feed the data to a number of `Preprocessors`. Preprocessor only act on the **structure**\n",
991 973 " of the notebook, and have access to it all. \n",
992 974 " - feed the notebook through the jinja templating engine\n",
993 975 " - the use templates are configurable.\n",
994 976 " - templates make use of configurable macros called filters.\n",
995 977 " - The exporter return the converted notebook as well as other relevant resources as a tuple.\n",
996 978 " - Write what you need to disk, or elsewhere. (You are responsible for it)"
997 979 ]
998 980 },
999 981 {
1000 982 "cell_type": "markdown",
1001 983 "metadata": {},
1002 984 "source": [
1003 "Here we'll be interested in the `Transformers`. Each `Transformer` is applied successively and in order on the notebook before going through the conversion process.\n",
985 "Here we'll be interested in the `Preprocessors`. Each `Preprocessor` is applied successively and in order on the notebook before going through the conversion process.\n",
1004 986 "\n",
1005 "We provide some transformer that do some modification on the notebook structure by default.\n",
1006 "One of them, the `ExtractOutputTransformer` is responsible for crawling notebook,\n",
987 "We provide some preprocessor that do some modification on the notebook structure by default.\n",
988 "One of them, the `ExtractOutputPreprocessor` is responsible for crawling notebook,\n",
1007 989 "finding all the figures, and put them into the resources directory, as well as choosing the key\n",
1008 990 "(`filename_xx_y.extension`) that can replace the figure in the template.\n",
1009 991 "\n",
1010 992 "\n",
1011 "The `ExtractOutputTransformer` is special in the fact that it **should** be availlable on all `Exporter`s, but is just inactive by default on some exporter."
993 "The `ExtractOutputPreprocessor` is special in the fact that it **should** be availlable on all `Exporter`s, but is just inactive by default on some exporter."
1012 994 ]
1013 995 },
1014 996 {
1015 997 "cell_type": "code",
1016 "execution_count": 12,
998 "execution_count": 11,
1017 999 "metadata": {
1018 1000 "collapsed": false
1019 1001 },
1020 1002 "outputs": [
1021 1003 {
1022 1004 "data": {
1023 1005 "text/plain": [
1024 "[<function IPython.nbconvert.transformers.coalescestreams.wrappedfunc>,\n",
1025 " <IPython.nbconvert.transformers.svg2pdf.SVG2PDFTransformer at 0x10d2a7490>,\n",
1026 " <IPython.nbconvert.transformers.extractoutput.ExtractOutputTransformer at 0x10d2a7ad0>,\n",
1027 " <IPython.nbconvert.transformers.csshtmlheader.CSSHTMLHeaderTransformer at 0x10d2a7b50>,\n",
1028 " <IPython.nbconvert.transformers.revealhelp.RevealHelpTransformer at 0x10d29dd90>,\n",
1029 " <IPython.nbconvert.transformers.latex.LatexTransformer at 0x10d29db50>,\n",
1030 " <IPython.nbconvert.transformers.sphinx.SphinxTransformer at 0x10d2a7b90>]"
1006 "[<function IPython.nbconvert.preprocessors.coalescestreams.cell_preprocessor.<locals>.wrappedfunc>,\n",
1007 " <IPython.nbconvert.preprocessors.svg2pdf.SVG2PDFPreprocessor at 0x107d1a630>,\n",
1008 " <IPython.nbconvert.preprocessors.extractoutput.ExtractOutputPreprocessor at 0x107d1a748>,\n",
1009 " <IPython.nbconvert.preprocessors.csshtmlheader.CSSHTMLHeaderPreprocessor at 0x107d1aba8>,\n",
1010 " <IPython.nbconvert.preprocessors.revealhelp.RevealHelpPreprocessor at 0x107d1a710>,\n",
1011 " <IPython.nbconvert.preprocessors.latex.LatexPreprocessor at 0x107daa860>,\n",
1012 " <IPython.nbconvert.preprocessors.clearoutput.ClearOutputPreprocessor at 0x107db7080>,\n",
1013 " <IPython.nbconvert.preprocessors.execute.ExecutePreprocessor at 0x107db7160>,\n",
1014 " <IPython.nbconvert.preprocessors.highlightmagics.HighlightMagicsPreprocessor at 0x107db7048>]"
1031 1015 ]
1032 1016 },
1033 "execution_count": 12,
1017 "execution_count": 11,
1034 1018 "metadata": {},
1035 1019 "output_type": "execute_result"
1036 1020 }
1037 1021 ],
1038 1022 "source": [
1039 "# second transformer shoudl be Instance of ExtractFigureTransformer\n",
1040 "exportHtml._transformers # 3rd one shouel be <ExtractOutputTransformer>"
1023 "# 3rd one should be <ExtractOutputPreprocessor>\n",
1024 "html_exporter._preprocessors"
1041 1025 ]
1042 1026 },
1043 1027 {
1044 1028 "cell_type": "markdown",
1045 1029 "metadata": {},
1046 1030 "source": [
1047 1031 "To enable it we will use IPython configuration/Traitlets system. If you are have already set some IPython configuration options, \n",
1048 1032 "this will look pretty familiar to you. Configuration option are always of the form:\n",
1049 1033 "\n",
1050 " ClassName.attribute_name = value\n",
1034 " ClassName.attribute_name = value\n",
1051 1035 " \n",
1052 "A few ways exist to create such config, like reading a config file in your profile, but you can also do it programatically usign a dictionary. Let's create such a config object, and see the difference if we pass it to our `HtmlExporter`"
1036 "A few ways exist to create such config, like reading a config file in your profile, but you can also do it programatically usign a dictionary. Let's create such a config object, and see the difference if we pass it to our `HTMLExporter`"
1053 1037 ]
1054 1038 },
1055 1039 {
1056 1040 "cell_type": "code",
1057 "execution_count": 13,
1041 "execution_count": 12,
1058 1042 "metadata": {
1059 1043 "collapsed": false
1060 1044 },
1061 1045 "outputs": [
1062 1046 {
1063 1047 "name": "stdout",
1064 1048 "output_type": "stream",
1065 1049 "text": [
1066 1050 "resources without the \"figures\" key :\n",
1067 "['inlining', 'output_extension', 'metadata']\n",
1051 "['raw_mimetypes', 'inlining', 'metadata', 'output_extension']\n",
1068 1052 "\n",
1069 "Here we have one more field \n",
1070 "['outputs', 'inlining', 'output_extension', 'metadata']\n"
1053 "Here we have one more field\n",
1054 "['outputs', 'raw_mimetypes', 'inlining', 'metadata', 'output_extension']\n"
1071 1055 ]
1072 1056 },
1073 1057 {
1074 1058 "data": {
1075 1059 "text/plain": [
1076 "[u'output_13_1.text',\n",
1077 " u'output_18_0.text',\n",
1078 " u'output_3_0.text',\n",
1079 " u'output_18_1.png',\n",
1080 " u'output_12_0.text',\n",
1081 " u'output_5_0.text',\n",
1082 " u'output_5_0.png',\n",
1083 " u'output_13_1.png',\n",
1084 " u'output_16_0.text',\n",
1085 " u'output_13_0.text',\n",
1086 " u'output_18_1.text',\n",
1087 " u'output_3_0.png',\n",
1088 " u'output_16_0.png']"
1060 "['output_5_0.png',\n",
1061 " 'output_16_0.png',\n",
1062 " 'output_13_1.png',\n",
1063 " 'output_18_1.png',\n",
1064 " 'output_3_0.png']"
1089 1065 ]
1090 1066 },
1091 "execution_count": 13,
1067 "execution_count": 12,
1092 1068 "metadata": {},
1093 1069 "output_type": "execute_result"
1094 1070 }
1095 1071 ],
1096 1072 "source": [
1097 1073 "from IPython.config import Config\n",
1098 1074 "\n",
1099 1075 "c = Config({\n",
1100 " 'ExtractOutputTransformer':{'enabled':True}\n",
1076 " 'ExtractOutputPreprocessor':{'enabled':True}\n",
1101 1077 " })\n",
1102 1078 "\n",
1103 "exportHtml = HTMLExporter()\n",
1104 "exportHtml_and_figs = HTMLExporter(config=c)\n",
1079 "exportHTML = HTMLExporter()\n",
1080 "exportHTML_and_figs = HTMLExporter(config=c)\n",
1105 1081 "\n",
1106 "(_, resources) = exportHtml.from_notebook_node(jake_notebook)\n",
1107 "(_, resources_with_fig) = exportHtml_and_figs.from_notebook_node(jake_notebook)\n",
1082 "(_, resources) = exportHTML.from_notebook_node(jake_notebook)\n",
1083 "(_, resources_with_fig) = exportHTML_and_figs.from_notebook_node(jake_notebook)\n",
1108 1084 "\n",
1109 "print 'resources without the \"figures\" key :'\n",
1110 "print resources.keys()\n",
1085 "print('resources without the \"figures\" key :')\n",
1086 "print(list(resources))\n",
1111 1087 "\n",
1112 "print ''\n",
1113 "print 'Here we have one more field '\n",
1114 "print resources_with_fig.keys()\n",
1115 "resources_with_fig['outputs'].keys() "
1088 "print('')\n",
1089 "print('Here we have one more field')\n",
1090 "print(list(resources_with_fig))\n",
1091 "list(resources_with_fig['outputs'])"
1116 1092 ]
1117 1093 },
1118 1094 {
1119 1095 "cell_type": "markdown",
1120 1096 "metadata": {},
1121 1097 "source": [
1122 1098 "So now you can loop through the dict and write all those figures to disk in the right place... "
1123 1099 ]
1124 1100 },
1125 1101 {
1126 1102 "cell_type": "markdown",
1127 1103 "metadata": {},
1128 1104 "source": [
1129 "#### Custom transformer"
1105 "#### Custom Preprocessor"
1130 1106 ]
1131 1107 },
1132 1108 {
1133 1109 "cell_type": "markdown",
1134 1110 "metadata": {},
1135 1111 "source": [
1136 "Of course you can imagine many transformation that you would like to apply to a notebook. This is one of the reason we provide a way to register your own transformers that will be applied to the notebook after the default ones.\n",
1112 "Of course you can imagine many transformation that you would like to apply to a notebook. This is one of the reason we provide a way to register your own preprocessors that will be applied to the notebook after the default ones.\n",
1137 1113 "\n",
1138 "To do so you'll have to pass an ordered list of `Transformer`s to the Exporter constructor. \n",
1114 "To do so you'll have to pass an ordered list of `Preprocessor`s to the Exporter constructor. \n",
1139 1115 "\n",
1140 "But what is an transformer ? Transformer can be either *decorated function* for dead-simple `Transformer`s that apply\n",
1116 "But what is an preprocessor ? Preprocessor can be either *decorated function* for dead-simple `Preprocessor`s that apply\n",
1141 1117 "independently to each cell, for more advance transformation that support configurability You have to inherit from\n",
1142 "`Transformer` and define a `call` method as we'll see below.\n",
1118 "`Preprocessor` and define a `call` method as we'll see below.\n",
1143 1119 "\n",
1144 1120 "All transforers have a magic attribute that allows it to be activated/disactivate from the config dict."
1145 1121 ]
1146 1122 },
1147 1123 {
1148 1124 "cell_type": "code",
1149 "execution_count": 14,
1125 "execution_count": 13,
1150 1126 "metadata": {
1151 1127 "collapsed": false
1152 1128 },
1153 1129 "outputs": [
1154 1130 {
1155 1131 "name": "stdout",
1156 1132 "output_type": "stream",
1157 1133 "text": [
1158 1134 "Four relevant docstring\n",
1159 1135 "=============================\n",
1160 " A configurable transformer\n",
1136 " A configurable preprocessor\n",
1161 1137 "\n",
1162 1138 " Inherit from this class if you wish to have configurability for your\n",
1163 " transformer.\n",
1139 " preprocessor.\n",
1164 1140 "\n",
1165 " Any configurable traitlets this class exposed will be configurable in profiles\n",
1166 " using c.SubClassName.atribute=value\n",
1141 " Any configurable traitlets this class exposed will be configurable in\n",
1142 " profiles using c.SubClassName.attribute = value\n",
1167 1143 "\n",
1168 " you can overwrite transform_cell to apply a transformation independently on each cell\n",
1169 " or __call__ if you prefer your own logic. See corresponding docstring for informations.\n",
1144 " you can overwrite :meth:`preprocess_cell` to apply a transformation\n",
1145 " independently on each cell or :meth:`preprocess` if you prefer your own\n",
1146 " logic. See corresponding docstring for informations.\n",
1170 1147 "\n",
1171 1148 " Disabled by default and can be enabled via the config by\n",
1172 " 'c.YourTransformerName.enabled = True'\n",
1149 " 'c.YourPreprocessorName.enabled = True'\n",
1173 1150 " \n",
1174 1151 "=============================\n",
1175 1152 "\n",
1176 " Transformation to apply on each notebook.\n",
1153 " Preprocessing to apply on each notebook.\n",
1177 1154 " \n",
1178 " You should return modified nb, resources.\n",
1179 " If you wish to apply your transform on each cell, you might want to \n",
1180 " overwrite transform_cell method instead.\n",
1155 " Must return modified nb, resources.\n",
1156 " \n",
1157 " If you wish to apply your preprocessing to each cell, you might want\n",
1158 " to override preprocess_cell method instead.\n",
1181 1159 " \n",
1182 1160 " Parameters\n",
1183 1161 " ----------\n",
1184 1162 " nb : NotebookNode\n",
1185 1163 " Notebook being converted\n",
1186 1164 " resources : dictionary\n",
1187 1165 " Additional resources used in the conversion process. Allows\n",
1188 " transformers to pass variables into the Jinja engine.\n",
1166 " preprocessors to pass variables into the Jinja engine.\n",
1189 1167 " \n",
1190 1168 "=============================\n",
1191 1169 "\n",
1192 " Overwrite if you want to apply a transformation on each cell. You \n",
1193 " should return modified cell and resource dictionary.\n",
1170 " Override if you want to apply some preprocessing to each cell.\n",
1171 " Must return modified cell and resource dictionary.\n",
1194 1172 " \n",
1195 1173 " Parameters\n",
1196 1174 " ----------\n",
1197 1175 " cell : NotebookNode cell\n",
1198 1176 " Notebook cell being processed\n",
1199 1177 " resources : dictionary\n",
1200 1178 " Additional resources used in the conversion process. Allows\n",
1201 " transformers to pass variables into the Jinja engine.\n",
1179 " preprocessors to pass variables into the Jinja engine.\n",
1202 1180 " index : int\n",
1203 1181 " Index of the cell being processed\n",
1204 1182 " \n",
1205 1183 "=============================\n"
1206 1184 ]
1207 1185 }
1208 1186 ],
1209 1187 "source": [
1210 "from IPython.nbconvert.transformers import Transformer\n",
1188 "from IPython.nbconvert.preprocessors import Preprocessor\n",
1211 1189 "import IPython.config\n",
1212 "print \"Four relevant docstring\"\n",
1213 "print '============================='\n",
1214 "print Transformer.__doc__\n",
1215 "print '============================='\n",
1216 "print Transformer.call.__doc__\n",
1217 "print '============================='\n",
1218 "print Transformer.transform_cell.__doc__\n",
1219 "print '============================='"
1190 "print(\"Four relevant docstring\")\n",
1191 "print('=============================')\n",
1192 "print(Preprocessor.__doc__)\n",
1193 "print('=============================')\n",
1194 "print(Preprocessor.preprocess.__doc__)\n",
1195 "print('=============================')\n",
1196 "print(Preprocessor.preprocess_cell.__doc__)\n",
1197 "print('=============================')"
1220 1198 ]
1221 1199 },
1222 1200 {
1223 1201 "cell_type": "markdown",
1224 1202 "metadata": {},
1225 1203 "source": [
1226 1204 "***\n",
1227 "We don't provide convenient method to be aplied on each worksheet as the **data structure** for worksheet will be removed. (not the worksheet functionnality, which is still on it's way)\n",
1205 "We don't provide convenient method to be aplied on each worksheet as the **data structure** for worksheet will be removed. (not the worksheet functionality, which is still on it's way)\n",
1228 1206 "***"
1229 1207 ]
1230 1208 },
1231 1209 {
1232 1210 "cell_type": "markdown",
1233 1211 "metadata": {},
1234 1212 "source": [
1235 1213 "### Example"
1236 1214 ]
1237 1215 },
1238 1216 {
1239 1217 "cell_type": "markdown",
1240 1218 "metadata": {},
1241 1219 "source": [
1242 "I'll now demonstrate a specific example [requested](https://github.com/ipython/nbconvert/pull/137#issuecomment-18658235) while nbconvert 2 was beeing developped. The ability to exclude cell from the conversion process based on their index. \n",
1220 "I'll now demonstrate a specific example [requested](https://github.com/ipython/nbconvert/pull/137#issuecomment-18658235) while nbconvert 2 was being developed. The ability to exclude cell from the conversion process based on their index. \n",
1243 1221 "\n",
1244 1222 "I'll let you imagin how to inject cell, if what you just want is to happend static content at the beginning/end of a notebook, plese refer to templating section, it will be much easier and cleaner."
1245 1223 ]
1246 1224 },
1247 1225 {
1248 1226 "cell_type": "code",
1249 "execution_count": 15,
1227 "execution_count": 14,
1250 1228 "metadata": {
1251 1229 "collapsed": false
1252 1230 },
1253 1231 "outputs": [],
1254 1232 "source": [
1255 1233 "from IPython.utils.traitlets import Integer"
1256 1234 ]
1257 1235 },
1258 1236 {
1259 1237 "cell_type": "code",
1260 "execution_count": 16,
1238 "execution_count": 15,
1261 1239 "metadata": {
1262 1240 "collapsed": false
1263 1241 },
1264 1242 "outputs": [],
1265 1243 "source": [
1266 "class PelicanSubCell(Transformer):\n",
1267 " \"\"\"A Pelican specific transformer to remove somme of the cells of a notebook\"\"\"\n",
1244 "class PelicanSubCell(Preprocessor):\n",
1245 " \"\"\"A Pelican specific preprocessor to remove somme of the cells of a notebook\"\"\"\n",
1268 1246 " \n",
1269 1247 " # I could also read the cells from nbc.metadata.pelican is someone wrote a JS extension\n",
1270 1248 " # But I'll stay with configurable value. \n",
1271 1249 " start = Integer(0, config=True, help=\"first cell of notebook to be converted\")\n",
1272 1250 " end = Integer(-1, config=True, help=\"last cell of notebook to be converted\")\n",
1273 1251 " \n",
1274 " def call(self, nb, resources):\n",
1252 " def preprocess(self, nb, resources):\n",
1275 1253 "\n",
1276 1254 " #nbc = deepcopy(nb)\n",
1277 1255 " nbc = nb\n",
1278 " # don't print in real transformer !!!\n",
1279 " print \"I'll keep only cells from \", self.start, \"to \", self.end, \"\\n\\n\"\n",
1280 " for worksheet in nbc.worksheets :\n",
1281 " cells = worksheet.cells[:]\n",
1282 " worksheet.cells = cells[self.start:self.end] \n",
1256 " # don't print in real preprocessor !!!\n",
1257 " print(\"I'll keep only cells from \", self.start, \"to \", self.end, \"\\n\\n\")\n",
1258 " nbc.cells = nb.cells[self.start:self.end] \n",
1283 1259 " return nbc, resources"
1284 1260 ]
1285 1261 },
1286 1262 {
1287 1263 "cell_type": "code",
1288 "execution_count": 17,
1264 "execution_count": 16,
1289 1265 "metadata": {
1290 1266 "collapsed": false
1291 1267 },
1292 1268 "outputs": [],
1293 1269 "source": [
1294 1270 "# I create this on the fly, but this could be loaded from a DB, and config object support merging...\n",
1295 "c = Config({\n",
1296 " 'PelicanSubCell':{\n",
1297 " 'enabled':True,\n",
1298 " 'start':4,\n",
1299 " 'end':6,\n",
1300 " }\n",
1301 " })"
1271 "c = Config()\n",
1272 "c.PelicanSubCell.enabled = True\n",
1273 "c.PelicanSubCell.start = 4\n",
1274 "c.PelicanSubCell.end = 6"
1302 1275 ]
1303 1276 },
1304 1277 {
1305 1278 "cell_type": "markdown",
1306 1279 "metadata": {},
1307 1280 "source": [
1308 "I'm creating a pelican exporter that take `PelicanSubCell` extra transformers and a `config` object as parameter. This might seem redundant, but with configuration system you'll see that one can register an inactive transformer on all exporters and activate it at will form its config files and command line. "
1281 "I'm creating a pelican exporter that take `PelicanSubCell` extra preprocessors and a `config` object as parameter. This might seem redundant, but with configuration system you'll see that one can register an inactive preprocessor on all exporters and activate it at will form its config files and command line. "
1309 1282 ]
1310 1283 },
1311 1284 {
1312 1285 "cell_type": "code",
1313 "execution_count": 18,
1286 "execution_count": 17,
1314 1287 "metadata": {
1315 1288 "collapsed": false
1316 1289 },
1317 1290 "outputs": [],
1318 1291 "source": [
1319 "pelican = RSTExporter(transformers=[PelicanSubCell], config=c)"
1292 "pelican = RSTExporter(preprocessors=[PelicanSubCell], config=c)"
1320 1293 ]
1321 1294 },
1322 1295 {
1323 1296 "cell_type": "code",
1324 "execution_count": 19,
1297 "execution_count": 18,
1325 1298 "metadata": {
1326 1299 "collapsed": false
1327 1300 },
1328 1301 "outputs": [
1329 1302 {
1330 1303 "name": "stdout",
1331 1304 "output_type": "stream",
1332 1305 "text": [
1333 1306 "I'll keep only cells from 4 to 6 \n",
1334 1307 "\n",
1335 1308 "\n",
1336 1309 "\n",
1337 1310 "Sometimes when showing schematic plots, this is the type of figure I\n",
1338 1311 "want to display. But drawing it by hand is a pain: I'd rather just use\n",
1339 1312 "matplotlib. The problem is, matplotlib is a bit too precise. Attempting\n",
1340 1313 "to duplicate this figure in matplotlib leads to something like this:\n",
1341 "In[2]:\n",
1314 "\n",
1342 1315 ".. code:: python\n",
1343 1316 "\n",
1344 1317 " Image('http://jakevdp.github.com/figures/mpl_version.png')\n",
1345 1318 "\n",
1346 1319 "\n",
1347 1320 "\n",
1348 "\n",
1349 "\n",
1350 1321 ".. image:: output_5_0.png\n",
1351 1322 "\n",
1352 1323 "\n",
1353 1324 "\n"
1354 1325 ]
1355 1326 }
1356 1327 ],
1357 1328 "source": [
1358 "print pelican.from_notebook_node(jake_notebook)[0]"
1359 ]
1360 },
1361 {
1362 "cell_type": "markdown",
1363 "metadata": {},
1364 "source": [
1365 "### Programatic example of extending templates / cutom filters"
1366 ]
1367 },
1368 {
1369 "cell_type": "code",
1370 "execution_count": 20,
1371 "metadata": {
1372 "collapsed": false
1373 },
1374 "outputs": [],
1375 "source": [
1376 "from IPython.nbconvert.filters.highlight import _pygment_highlight\n",
1377 "from pygments.formatters import HtmlFormatter\n",
1378 "\n",
1379 "from IPython.nbconvert.exporters import HTMLExporter\n",
1380 "from IPython.config import Config\n",
1381 "\n",
1382 "from IPython.nbformat import current as nbformat"
1383 ]
1384 },
1385 {
1386 "cell_type": "markdown",
1387 "metadata": {},
1388 "source": [
1389 "Here we define a dustom 'highlight' filter that apply a custom class to code in css. We register this filter with a already existing name, so it will replace the default one."
1390 ]
1391 },
1392 {
1393 "cell_type": "code",
1394 "execution_count": 21,
1395 "metadata": {
1396 "collapsed": false
1397 },
1398 "outputs": [],
1399 "source": [
1400 "def my_highlight(source, language='ipython'):\n",
1401 " formatter = HtmlFormatter(cssclass='highlight-ipynb')\n",
1402 " return _pygment_highlight(source, formatter, language)\n",
1403 " \n",
1404 "c = Config({'CSSHtmlHeaderTransformer':\n",
1405 " {'enabled':False, 'highlight_class':'highlight-ipynb'}})\n",
1406 "\n",
1407 "exportHtml = HTMLExporter( config=c , filters={'highlight2html': my_highlight} )\n",
1408 "(body,resources) = exportHtml.from_notebook_node(jake_notebook)"
1409 ]
1410 },
1411 {
1412 "cell_type": "code",
1413 "execution_count": 22,
1414 "metadata": {
1415 "collapsed": false
1416 },
1417 "outputs": [
1418 {
1419 "data": {
1420 "text/plain": [
1421 "u'<div class=\"highlight-ipynb\"><pre><span class=\"kn\">from</span>'"
1422 ]
1423 },
1424 "execution_count": 22,
1425 "metadata": {},
1426 "output_type": "execute_result"
1427 }
1428 ],
1429 "source": [
1430 "i = body.index('highlight-ipynb')\n",
1431 "body[i-12:i+50]"
1329 "print(pelican.from_notebook_node(jake_notebook)[0])"
1432 1330 ]
1433 1331 },
1434 1332 {
1435 1333 "cell_type": "markdown",
1436 1334 "metadata": {},
1437 1335 "source": [
1438 1336 "### Programatically make templates"
1439 1337 ]
1440 1338 },
1441 1339 {
1442 1340 "cell_type": "code",
1443 "execution_count": 23,
1341 "execution_count": 19,
1444 1342 "metadata": {
1445 1343 "collapsed": false
1446 1344 },
1447 1345 "outputs": [
1448 1346 {
1449 1347 "name": "stdout",
1450 1348 "output_type": "stream",
1451 1349 "text": [
1452 "<p>This post was written entirely in an IPython Notebook: the notebook file is available for download <a href=\"http://jakevdp.github.com/downloads/notebooks/XKCD_plots.ipynb\">here</a>. For more information on blogging with notebooks in octopress, see my <a href=\"http://jakevdp.github.com/blog/2012/10/04/blogging-with-ipython/\">previous post</a> on the subject.</p>\n",
1350 "</div>\n",
1453 1351 "</div>\n",
1454 1352 "FOOOOOOOOTEEEEER\n",
1455 1353 "\n"
1456 1354 ]
1457 1355 }
1458 1356 ],
1459 1357 "source": [
1460 1358 "from jinja2 import DictLoader\n",
1461 1359 "\n",
1462 "dl = DictLoader({'html_full.tpl': \n",
1360 "dl = DictLoader({'full.tpl': \n",
1463 1361 "\"\"\"\n",
1464 "{%- extends 'html_basic.tpl' -%} \n",
1362 "{%- extends 'basic.tpl' -%} \n",
1465 1363 "\n",
1466 1364 "{% block footer %}\n",
1467 1365 "FOOOOOOOOTEEEEER\n",
1468 1366 "{% endblock footer %}\n",
1469 1367 "\"\"\"})\n",
1470 1368 "\n",
1471 1369 "\n",
1472 "exportHtml = HTMLExporter( config=None , filters={'highlight': my_highlight}, extra_loaders=[dl] )\n",
1473 "(body,resources) = exportHtml.from_notebook_node(jake_notebook)\n",
1370 "exportHTML = HTMLExporter(extra_loaders=[dl])\n",
1371 "(body,resources) = exportHTML.from_notebook_node(jake_notebook)\n",
1474 1372 "for l in body.split('\\n')[-4:]:\n",
1475 " print l"
1373 " print(l)"
1476 1374 ]
1477 1375 },
1478 1376 {
1479 1377 "cell_type": "markdown",
1480 1378 "metadata": {},
1481 1379 "source": [
1482 1380 "### Real World Use"
1483 1381 ]
1484 1382 },
1485 1383 {
1486 1384 "cell_type": "markdown",
1487 1385 "metadata": {},
1488 1386 "source": [
1489 1387 "@jakevdp use Pelican and IPython Notebook to blog. Pelican [Will use](https://github.com/getpelican/pelican-plugins/pull/21) nbconvert programatically to generate blog post. Have a look a [Pythonic Preambulations](http://jakevdp.github.io/) for Jake blog post."
1490 1388 ]
1491 1389 },
1492 1390 {
1493 1391 "cell_type": "markdown",
1494 1392 "metadata": {},
1495 1393 "source": [
1496 1394 "@damianavila Wrote a Nicholas Plugin to [Write blog post as Notebook](http://www.damian.oquanta.info/posts/one-line-deployment-of-your-site-to-gh-pages.html) and is developping a js-extension to publish notebooks in one click from the web app."
1497 1395 ]
1498 1396 },
1499 1397 {
1500 1398 "cell_type": "markdown",
1501 1399 "metadata": {},
1502 1400 "source": [
1503 1401 "<center>\n",
1504 "<blockquote class=\"twitter-tweet\"><p>As <a href=\"https://twitter.com/Mbussonn\">@Mbussonn</a> requested... easieeeeer! Deploy your Nikola site with just a click in the IPython notebook! <a href=\"http://t.co/860sJunZvj\">http://t.co/860sJunZvj</a> cc <a href=\"https://twitter.com/ralsina\">@ralsina</a></p>&mdash; Dami\u00e1n Avila (@damian_avila) <a href=\"https://twitter.com/damian_avila/statuses/370306057828335616\">August 21, 2013</a></blockquote>\n",
1402 "<blockquote class=\"twitter-tweet\"><p>As <a href=\"https://twitter.com/Mbussonn\">@Mbussonn</a> requested... easieeeeer! Deploy your Nikola site with just a click in the IPython notebook! <a href=\"http://t.co/860sJunZvj\">http://t.co/860sJunZvj</a> cc <a href=\"https://twitter.com/ralsina\">@ralsina</a></p>&mdash; DamiΓ‘n Avila (@damian_avila) <a href=\"https://twitter.com/damian_avila/statuses/370306057828335616\">August 21, 2013</a></blockquote>\n",
1505 1403 "</center>"
1506 1404 ]
1507 1405 },
1508 1406 {
1509 1407 "cell_type": "markdown",
1510 1408 "metadata": {},
1511 1409 "source": [
1512 1410 "And finaly, what you just did, is replicate what [nbviewer](http://nbviewer.ipython.org) does. WHich to fetch a notebook from url, convert it and send in back to you as a static html."
1513 1411 ]
1514 1412 },
1515 1413 {
1516 1414 "cell_type": "markdown",
1517 1415 "metadata": {},
1518 1416 "source": [
1519 1417 "##### A few gotchas"
1520 1418 ]
1521 1419 },
1522 1420 {
1523 1421 "cell_type": "markdown",
1524 1422 "metadata": {},
1525 1423 "source": [
1526 1424 "Jinja blocks use `{% %}`by default which does not play nicely with $\\LaTeX$, hence thoses are replaced by `((* *))` in latex templates."
1527 1425 ]
1528 },
1529 {
1530 "cell_type": "code",
1531 "execution_count": null,
1532 "metadata": {
1533 "collapsed": false
1534 },
1535 "outputs": [],
1536 "source": []
1537 1426 }
1538 1427 ],
1539 "metadata": {},
1428 "metadata": {
1429 "kernelspec": {
1430 "display_name": "Python 3",
1431 "name": "python3"
1432 },
1433 "language_info": {
1434 "codemirror_mode": {
1435 "name": "ipython",
1436 "version": 3
1437 },
1438 "file_extension": ".py",
1439 "mimetype": "text/x-python",
1440 "name": "python",
1441 "nbconvert_exporter": "python",
1442 "pygments_lexer": "ipython3",
1443 "version": "3.4.2"
1444 }
1445 },
1540 1446 "nbformat": 4,
1541 1447 "nbformat_minor": 0
1542 1448 } No newline at end of file
General Comments 0
You need to be logged in to leave comments. Login now