You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2465 lines
244 KiB
2465 lines
244 KiB
{ |
|
"cells": [ |
|
{ |
|
"cell_type": "markdown", |
|
"metadata": { |
|
"pycharm": { |
|
"name": "#%% md\n" |
|
} |
|
}, |
|
"source": [ |
|
"# Tuning Curves" |
|
] |
|
}, |
|
{ |
|
"cell_type": "markdown", |
|
"metadata": { |
|
"pycharm": { |
|
"name": "#%% md\n" |
|
} |
|
}, |
|
"source": [ |
|
"**Import everything**" |
|
] |
|
}, |
|
{ |
|
"cell_type": "code", |
|
"execution_count": 1, |
|
"metadata": { |
|
"pycharm": { |
|
"name": "#%%\n" |
|
} |
|
}, |
|
"outputs": [], |
|
"source": [ |
|
"%matplotlib notebook\n", |
|
"import typing\n", |
|
"\n", |
|
"import matplotlib as mpl\n", |
|
"import numpy as np\n", |
|
"import matplotlib.pyplot as plt\n", |
|
"\n", |
|
"import ipywidgets as widgets\n", |
|
"import sympy as sp\n", |
|
"sp.init_printing()\n", |
|
"AxOrImg = typing.Union[mpl.axes.Axes, mpl.image.AxesImage]" |
|
] |
|
}, |
|
{ |
|
"cell_type": "code", |
|
"execution_count": 2, |
|
"metadata": { |
|
"pycharm": { |
|
"name": "#%%\n" |
|
} |
|
}, |
|
"outputs": [], |
|
"source": [ |
|
"k, x0, y0, phi, theta, sigma_x, sigma_y, sigma, x, y = sp.symbols(r'k x_0 y_0 \\phi \\theta \\sigma_x \\sigma_y \\sigma x y')\n", |
|
"defaults = {\n", |
|
" k: 6,\n", |
|
" sigma: 0.2,\n", |
|
" phi: sp.pi / 2,\n", |
|
" theta: 0,\n", |
|
" sigma: 1,\n", |
|
" x0: 0, y0: 0\n", |
|
"}\n", |
|
"sigma_x = sigma_y = sigma" |
|
] |
|
}, |
|
{ |
|
"cell_type": "markdown", |
|
"metadata": { |
|
"pycharm": { |
|
"name": "#%% md\n" |
|
} |
|
}, |
|
"source": [ |
|
"#### Formulas" |
|
] |
|
}, |
|
{ |
|
"cell_type": "code", |
|
"execution_count": 3, |
|
"metadata": { |
|
"pycharm": { |
|
"name": "#%%\n" |
|
} |
|
}, |
|
"outputs": [ |
|
{ |
|
"data": { |
|
"image/png": "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\n", |
|
"text/latex": [ |
|
"$\\displaystyle \\cos{\\left(\\phi + k \\left(x - x_{0}\\right) \\cos{\\left(\\theta \\right)} + k \\left(y - y_{0}\\right) \\sin{\\left(\\theta \\right)} \\right)}$" |
|
], |
|
"text/plain": [ |
|
"cos(\\phi + k⋅(x - x₀)⋅cos(\\theta) + k⋅(y - y₀)⋅sin(\\theta))" |
|
] |
|
}, |
|
"execution_count": 3, |
|
"metadata": {}, |
|
"output_type": "execute_result" |
|
} |
|
], |
|
"source": [ |
|
"grating_f = sp.cos(k * (x - x0) * sp.cos(theta) + k * (y - y0) * sp.sin(theta) + phi)\n", |
|
"receptive_field = 1 / (2 * sp.pi * sigma * sigma) * sp.exp(-(x ** 2 + y ** 2) / (2 * sigma ** 2)) * sp.cos(k * x * sp.cos(theta) + k * y * sp.sin(theta) + phi)\n", |
|
"receptive_field = receptive_field.subs(theta, 0).subs(phi, 0)\n", |
|
"grating_f" |
|
] |
|
}, |
|
{ |
|
"cell_type": "code", |
|
"execution_count": 4, |
|
"metadata": { |
|
"pycharm": { |
|
"name": "#%%\n" |
|
} |
|
}, |
|
"outputs": [ |
|
{ |
|
"data": { |
|
"image/png": "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\n", |
|
"text/latex": [ |
|
"$\\displaystyle \\frac{e^{\\frac{- x^{2} - y^{2}}{2 \\sigma^{2}}} \\cos{\\left(k x \\right)}}{2 \\pi \\sigma^{2}}$" |
|
], |
|
"text/plain": [ |
|
" 2 2 \n", |
|
" - x - y \n", |
|
" ───────── \n", |
|
" 2 \n", |
|
" 2⋅\\sigma \n", |
|
"ℯ ⋅cos(k⋅x)\n", |
|
"───────────────────\n", |
|
" 2 \n", |
|
" 2⋅π⋅\\sigma " |
|
] |
|
}, |
|
"execution_count": 4, |
|
"metadata": {}, |
|
"output_type": "execute_result" |
|
} |
|
], |
|
"source": [ |
|
"receptive_field" |
|
] |
|
}, |
|
{ |
|
"cell_type": "code", |
|
"execution_count": 5, |
|
"metadata": { |
|
"pycharm": { |
|
"name": "#%%\n" |
|
} |
|
}, |
|
"outputs": [], |
|
"source": [ |
|
"int1 = sp.Integral(grating_f * receptive_field, (x, -1, 1), (y, -1, 1)).subs(defaults)\n", |
|
"# int1.evalf(2).doit()" |
|
] |
|
}, |
|
{ |
|
"cell_type": "code", |
|
"execution_count": 5, |
|
"metadata": { |
|
"pycharm": { |
|
"name": "#%%\n" |
|
} |
|
}, |
|
"outputs": [], |
|
"source": [] |
|
}, |
|
{ |
|
"cell_type": "code", |
|
"execution_count": 6, |
|
"metadata": { |
|
"pycharm": { |
|
"name": "#%%\n" |
|
} |
|
}, |
|
"outputs": [ |
|
{ |
|
"data": { |
|
"image/png": "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\n", |
|
"text/latex": [ |
|
"$\\displaystyle e^{\\frac{k^{2} \\left(\\cos^{2}{\\left(\\theta \\right)} + 1\\right)}{2}} \\cos{\\left(\\phi - k \\left(x_{0} \\cos{\\left(\\theta \\right)} + y_{0} \\sin{\\left(\\theta \\right)}\\right) \\right)} \\cosh{\\left(\\sigma^{2} k^{2} \\cos{\\left(\\theta \\right)} \\right)}$" |
|
], |
|
"text/plain": [ |
|
" 2 ⎛ 2 ⎞ \n", |
|
" k ⋅⎝cos (\\theta) + 1⎠ \n", |
|
" ───────────────────── \n", |
|
" 2 ⎛ \n", |
|
"ℯ ⋅cos(\\phi - k⋅(x₀⋅cos(\\theta) + y₀⋅sin(\\theta)))⋅cosh⎝\\s\n", |
|
"\n", |
|
" \n", |
|
" \n", |
|
" \n", |
|
" 2 2 ⎞\n", |
|
"igma ⋅k ⋅cos(\\theta)⎠" |
|
] |
|
}, |
|
"execution_count": 6, |
|
"metadata": {}, |
|
"output_type": "execute_result" |
|
} |
|
], |
|
"source": [ |
|
"# p = sp.cos(phi) * sp.cos(k*x0*sp.cos(theta) + k*y0*sp.sin(theta)) * sp.exp(k**2 * (sigma_x **2 * (1 + sp.cos(theta))**2 + sigma_y**2 * sp.sin(theta) **2) / 2)\n", |
|
"p = sp.cosh(k**2 * sigma**2 * sp.cos(theta)) * sp.exp(k ** 2 * (1 + sp.cos(theta) ** 2) / 2) * sp.cos(phi - k * (x0 * sp.cos(theta) + y0 * sp.sin(theta)))\n", |
|
"p" |
|
] |
|
}, |
|
{ |
|
"cell_type": "markdown", |
|
"metadata": { |
|
"pycharm": { |
|
"name": "#%% md\n" |
|
} |
|
}, |
|
"source": [ |
|
"#### Plot stuff" |
|
] |
|
}, |
|
{ |
|
"cell_type": "code", |
|
"execution_count": 7, |
|
"metadata": { |
|
"pycharm": { |
|
"name": "#%%\n" |
|
} |
|
}, |
|
"outputs": [], |
|
"source": [ |
|
"def get_orientation_phase_grid(step_phase: float, step_orientation: float) -> np.ndarray:\n", |
|
" \"\"\"\n", |
|
" Returns a grid of x and y values for plotting.\n", |
|
" :param step_phase: step for the phase (phi) - in degrees\n", |
|
" :param step_orientation: step for the orientation (theta) - in degrees\n", |
|
" :return: numpy array of shape (n_orientation, n_phase). Each element is a tuple (theta, phi)\n", |
|
" \"\"\"\n", |
|
" # phase <-> phi\n", |
|
" # orientation <-> theta\n", |
|
" step_phase *= np.pi / 180\n", |
|
" step_orientation *= np.pi / 180\n", |
|
" phi = np.arange(0, 2 * np.pi, step_phase)\n", |
|
" theta = np.arange(0, np.pi, step_orientation)\n", |
|
" return np.array(np.meshgrid(theta, phi)).T.reshape(-1, len(phi), 2)\n", |
|
"\n", |
|
"\n", |
|
"def get_spatial_grid(step_x: float, step_y: float, size: float = 1) -> np.ndarray:\n", |
|
" \"\"\"\n", |
|
" Returns a grid of x and y values for plotting.\n", |
|
" :param step_x: step for the x-coordinate\n", |
|
" :param step_y: step for the y-coordinate\n", |
|
" :param size: size of the grid\n", |
|
" :return: numpy array of shape (2 * size / step_x, 2 * size / step_y). Each element is a tuple (x, y)\n", |
|
" \"\"\"\n", |
|
" x = np.arange(-size, size, step_x)\n", |
|
" y = np.arange(-size, size, step_y)\n", |
|
" return np.array(np.meshgrid(x, y)).T.reshape(-1, len(x), 2)" |
|
] |
|
}, |
|
{ |
|
"cell_type": "code", |
|
"execution_count": 8, |
|
"metadata": { |
|
"pycharm": { |
|
"name": "#%%\n" |
|
} |
|
}, |
|
"outputs": [], |
|
"source": [ |
|
"def eval_func(func: sp.Expr, sub_1: sp.Expr, sub_2: sp.Expr, grid: np.ndarray) -> np.ndarray:\n", |
|
" # return np.array([[float(func.subs(sub_1, x_).subs(sub_2, y_)) for x_, y_ in line] for line in grid])\n", |
|
" func = sp.lambdify([sub_1, sub_2], func, 'numpy')\n", |
|
" return func(grid[:, :, 0], grid[:, :, 1])\n", |
|
"\n", |
|
"def plot_spatial(func: sp.Expr, ax: AxOrImg, step_x: float = 0.05, step_y: float = 0.05, size: float = 1, title: str = None, show: bool = False,\n", |
|
" patch: typing.Optional[typing.Tuple[float, float, float]] = None\n", |
|
" ):\n", |
|
" \"\"\"\n", |
|
" Plots a spatial map of the function.\n", |
|
"\n", |
|
" :param func: function to plot\n", |
|
" :param ax: axes to plot on or the image on axes\n", |
|
" :param step_x: step for the x-coordinate\n", |
|
" :param step_y: step for the y-coordinate\n", |
|
" :param size: size of the grid\n", |
|
" :param title: title of the plot\n", |
|
" :param show: whether to show the plot\n", |
|
" :param patch: optional circle to plot - a tuple (x, y, radius)\n", |
|
" \"\"\"\n", |
|
" grid = get_spatial_grid(step_x, step_y, size)\n", |
|
" image: np.ndarray = eval_func(func, x, y, grid)\n", |
|
" if isinstance(ax, mpl.image.AxesImage):\n", |
|
" ax.set_data(image)\n", |
|
" return ax\n", |
|
" img = ax.imshow(image, extent=[-size, size, -size, size], vmin=-size, vmax=size, cmap='gray')\n", |
|
" ax.invert_yaxis()\n", |
|
" if patch is not None:\n", |
|
" ax.add_patch(plt.Circle(patch[:2], radius=patch[2], color='b', fill=False))\n", |
|
" ax.set_title(title)\n", |
|
" if show:\n", |
|
" plt.show()\n", |
|
" return img\n", |
|
"\n", |
|
"def normalize(img):\n", |
|
" return (img - img.min()) / (img.max() - img.min())\n", |
|
"\n", |
|
"def plot_tuning_curve(func: typing.Union[sp.Expr, typing.Callable], ax: AxOrImg, step_phase: float = 20, step_orientation: float = 15, title: str = None, show: bool = False):\n", |
|
" \"\"\"\n", |
|
" Plots a tuning curve of the function.\n", |
|
"\n", |
|
" :param func: function to plot - sympy or a function of (theta, phi)\n", |
|
" :param ax: axes to plot on or image to update\n", |
|
" :param step_phase: step for the phase (phi) - in degrees\n", |
|
" :param step_orientation: step for the orientation (theta) - in degrees\n", |
|
" :param title: title of the plot\n", |
|
" :param show: whether to show the plot\n", |
|
" \"\"\"\n", |
|
" grid = get_orientation_phase_grid(step_phase, step_orientation)\n", |
|
" if isinstance(func, sp.Expr):\n", |
|
" image: np.ndarray = eval_func(func, theta, phi, grid)\n", |
|
" else:\n", |
|
" image = np.array([[func(theta_val, phi_val) for theta_val, phi_val in line] for line in grid])\n", |
|
" image = normalize(image)\n", |
|
" if isinstance(ax, mpl.image.AxesImage):\n", |
|
" ax.set_data(image)\n", |
|
" return ax\n", |
|
" img = ax.imshow(image, extent=[0, 360, 0, 180], cmap='viridis')\n", |
|
" ax.set_title(title)\n", |
|
" if show:\n", |
|
" plt.show()\n", |
|
" return img" |
|
] |
|
}, |
|
{ |
|
"cell_type": "code", |
|
"execution_count": 9, |
|
"metadata": { |
|
"pycharm": { |
|
"name": "#%%\n" |
|
} |
|
}, |
|
"outputs": [], |
|
"source": [ |
|
"def plot_gratings(ax: typing.Union[plt.Axes, mpl.image.AxesImage], k_val: float, phi_val: float, theta_val: float, x0_val: float = 0, y0_val: float = 0):\n", |
|
" phi_val *= np.pi / 180\n", |
|
" theta_val *= np.pi / 180\n", |
|
" return plot_spatial(\n", |
|
" # grating_f.evalf(subs={k: k_val, x0: x0_val, y0: y0_val, theta: theta_val, phi: phi_val}),\n", |
|
" grating_f.subs(k, k_val).subs(x0, x0_val).subs(y0, y0_val).subs(theta, theta_val).subs(phi, phi_val),\n", |
|
" ax, step_x=0.05, step_y=0.05, size=1, title='Grating', show=False)\n", |
|
"\n", |
|
"def plot_receptive_field(ax: plt.Axes, k_val: float, phi_val: float, theta_val: float, sigma_val: float = 1):\n", |
|
" phi_val *= np.pi / 180\n", |
|
" theta_val *= np.pi / 180\n", |
|
" return plot_spatial(\n", |
|
" receptive_field.subs(k, k_val).subs(theta, theta_val).subs(phi, phi_val).subs(sigma, sigma_val),\n", |
|
" ax, step_x=0.05, step_y=0.05, size=1, title='Receptive field', show=False)" |
|
] |
|
}, |
|
{ |
|
"cell_type": "code", |
|
"execution_count": 10, |
|
"metadata": { |
|
"pycharm": { |
|
"name": "#%%\n" |
|
} |
|
}, |
|
"outputs": [], |
|
"source": [ |
|
"def get_value(k_val: float = defaults[k], phi_val: float = 90, theta_val: float = 0, x0_val: float = 0, y0_val: float = 0, sigma_val: float = defaults[sigma]):\n", |
|
" phi_val *= np.pi / 180\n", |
|
" theta_val *= np.pi / 180\n", |
|
" grid_size = 0.05\n", |
|
" grid = get_spatial_grid(grid_size, grid_size, 1)\n", |
|
" subs = {\n", |
|
" k: k_val,\n", |
|
" x0: x0_val,\n", |
|
" y0: y0_val,\n", |
|
" theta: theta_val,\n", |
|
" phi: phi_val,\n", |
|
" sigma: sigma_val\n", |
|
" }\n", |
|
" grating_img = eval_func(grating_f.subs(subs), x, y, grid)\n", |
|
" rf_img = eval_func(receptive_field.subs(subs), x, y, grid)\n", |
|
" return np.sum(grating_img * rf_img) * grid_size ** 2" |
|
] |
|
}, |
|
{ |
|
"cell_type": "code", |
|
"execution_count": 15, |
|
"metadata": { |
|
"pycharm": { |
|
"name": "#%%\n" |
|
} |
|
}, |
|
"outputs": [ |
|
{ |
|
"data": { |
|
"application/javascript": [ |
|
"/* Put everything inside the global mpl namespace */\n", |
|
"/* global mpl */\n", |
|
"window.mpl = {};\n", |
|
"\n", |
|
"mpl.get_websocket_type = function () {\n", |
|
" if (typeof WebSocket !== 'undefined') {\n", |
|
" return WebSocket;\n", |
|
" } else if (typeof MozWebSocket !== 'undefined') {\n", |
|
" return MozWebSocket;\n", |
|
" } else {\n", |
|
" alert(\n", |
|
" 'Your browser does not have WebSocket support. ' +\n", |
|
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", |
|
" 'Firefox 4 and 5 are also supported but you ' +\n", |
|
" 'have to enable WebSockets in about:config.'\n", |
|
" );\n", |
|
" }\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n", |
|
" this.id = figure_id;\n", |
|
"\n", |
|
" this.ws = websocket;\n", |
|
"\n", |
|
" this.supports_binary = this.ws.binaryType !== undefined;\n", |
|
"\n", |
|
" if (!this.supports_binary) {\n", |
|
" var warnings = document.getElementById('mpl-warnings');\n", |
|
" if (warnings) {\n", |
|
" warnings.style.display = 'block';\n", |
|
" warnings.textContent =\n", |
|
" 'This browser does not support binary websocket messages. ' +\n", |
|
" 'Performance may be slow.';\n", |
|
" }\n", |
|
" }\n", |
|
"\n", |
|
" this.imageObj = new Image();\n", |
|
"\n", |
|
" this.context = undefined;\n", |
|
" this.message = undefined;\n", |
|
" this.canvas = undefined;\n", |
|
" this.rubberband_canvas = undefined;\n", |
|
" this.rubberband_context = undefined;\n", |
|
" this.format_dropdown = undefined;\n", |
|
"\n", |
|
" this.image_mode = 'full';\n", |
|
"\n", |
|
" this.root = document.createElement('div');\n", |
|
" this.root.setAttribute('style', 'display: inline-block');\n", |
|
" this._root_extra_style(this.root);\n", |
|
"\n", |
|
" parent_element.appendChild(this.root);\n", |
|
"\n", |
|
" this._init_header(this);\n", |
|
" this._init_canvas(this);\n", |
|
" this._init_toolbar(this);\n", |
|
"\n", |
|
" var fig = this;\n", |
|
"\n", |
|
" this.waiting = false;\n", |
|
"\n", |
|
" this.ws.onopen = function () {\n", |
|
" fig.send_message('supports_binary', { value: fig.supports_binary });\n", |
|
" fig.send_message('send_image_mode', {});\n", |
|
" if (fig.ratio !== 1) {\n", |
|
" fig.send_message('set_device_pixel_ratio', {\n", |
|
" device_pixel_ratio: fig.ratio,\n", |
|
" });\n", |
|
" }\n", |
|
" fig.send_message('refresh', {});\n", |
|
" };\n", |
|
"\n", |
|
" this.imageObj.onload = function () {\n", |
|
" if (fig.image_mode === 'full') {\n", |
|
" // Full images could contain transparency (where diff images\n", |
|
" // almost always do), so we need to clear the canvas so that\n", |
|
" // there is no ghosting.\n", |
|
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", |
|
" }\n", |
|
" fig.context.drawImage(fig.imageObj, 0, 0);\n", |
|
" };\n", |
|
"\n", |
|
" this.imageObj.onunload = function () {\n", |
|
" fig.ws.close();\n", |
|
" };\n", |
|
"\n", |
|
" this.ws.onmessage = this._make_on_message_function(this);\n", |
|
"\n", |
|
" this.ondownload = ondownload;\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype._init_header = function () {\n", |
|
" var titlebar = document.createElement('div');\n", |
|
" titlebar.classList =\n", |
|
" 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n", |
|
" var titletext = document.createElement('div');\n", |
|
" titletext.classList = 'ui-dialog-title';\n", |
|
" titletext.setAttribute(\n", |
|
" 'style',\n", |
|
" 'width: 100%; text-align: center; padding: 3px;'\n", |
|
" );\n", |
|
" titlebar.appendChild(titletext);\n", |
|
" this.root.appendChild(titlebar);\n", |
|
" this.header = titletext;\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n", |
|
"\n", |
|
"mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n", |
|
"\n", |
|
"mpl.figure.prototype._init_canvas = function () {\n", |
|
" var fig = this;\n", |
|
"\n", |
|
" var canvas_div = (this.canvas_div = document.createElement('div'));\n", |
|
" canvas_div.setAttribute(\n", |
|
" 'style',\n", |
|
" 'border: 1px solid #ddd;' +\n", |
|
" 'box-sizing: content-box;' +\n", |
|
" 'clear: both;' +\n", |
|
" 'min-height: 1px;' +\n", |
|
" 'min-width: 1px;' +\n", |
|
" 'outline: 0;' +\n", |
|
" 'overflow: hidden;' +\n", |
|
" 'position: relative;' +\n", |
|
" 'resize: both;'\n", |
|
" );\n", |
|
"\n", |
|
" function on_keyboard_event_closure(name) {\n", |
|
" return function (event) {\n", |
|
" return fig.key_event(event, name);\n", |
|
" };\n", |
|
" }\n", |
|
"\n", |
|
" canvas_div.addEventListener(\n", |
|
" 'keydown',\n", |
|
" on_keyboard_event_closure('key_press')\n", |
|
" );\n", |
|
" canvas_div.addEventListener(\n", |
|
" 'keyup',\n", |
|
" on_keyboard_event_closure('key_release')\n", |
|
" );\n", |
|
"\n", |
|
" this._canvas_extra_style(canvas_div);\n", |
|
" this.root.appendChild(canvas_div);\n", |
|
"\n", |
|
" var canvas = (this.canvas = document.createElement('canvas'));\n", |
|
" canvas.classList.add('mpl-canvas');\n", |
|
" canvas.setAttribute('style', 'box-sizing: content-box;');\n", |
|
"\n", |
|
" this.context = canvas.getContext('2d');\n", |
|
"\n", |
|
" var backingStore =\n", |
|
" this.context.backingStorePixelRatio ||\n", |
|
" this.context.webkitBackingStorePixelRatio ||\n", |
|
" this.context.mozBackingStorePixelRatio ||\n", |
|
" this.context.msBackingStorePixelRatio ||\n", |
|
" this.context.oBackingStorePixelRatio ||\n", |
|
" this.context.backingStorePixelRatio ||\n", |
|
" 1;\n", |
|
"\n", |
|
" this.ratio = (window.devicePixelRatio || 1) / backingStore;\n", |
|
"\n", |
|
" var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n", |
|
" 'canvas'\n", |
|
" ));\n", |
|
" rubberband_canvas.setAttribute(\n", |
|
" 'style',\n", |
|
" 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n", |
|
" );\n", |
|
"\n", |
|
" // Apply a ponyfill if ResizeObserver is not implemented by browser.\n", |
|
" if (this.ResizeObserver === undefined) {\n", |
|
" if (window.ResizeObserver !== undefined) {\n", |
|
" this.ResizeObserver = window.ResizeObserver;\n", |
|
" } else {\n", |
|
" var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n", |
|
" this.ResizeObserver = obs.ResizeObserver;\n", |
|
" }\n", |
|
" }\n", |
|
"\n", |
|
" this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n", |
|
" var nentries = entries.length;\n", |
|
" for (var i = 0; i < nentries; i++) {\n", |
|
" var entry = entries[i];\n", |
|
" var width, height;\n", |
|
" if (entry.contentBoxSize) {\n", |
|
" if (entry.contentBoxSize instanceof Array) {\n", |
|
" // Chrome 84 implements new version of spec.\n", |
|
" width = entry.contentBoxSize[0].inlineSize;\n", |
|
" height = entry.contentBoxSize[0].blockSize;\n", |
|
" } else {\n", |
|
" // Firefox implements old version of spec.\n", |
|
" width = entry.contentBoxSize.inlineSize;\n", |
|
" height = entry.contentBoxSize.blockSize;\n", |
|
" }\n", |
|
" } else {\n", |
|
" // Chrome <84 implements even older version of spec.\n", |
|
" width = entry.contentRect.width;\n", |
|
" height = entry.contentRect.height;\n", |
|
" }\n", |
|
"\n", |
|
" // Keep the size of the canvas and rubber band canvas in sync with\n", |
|
" // the canvas container.\n", |
|
" if (entry.devicePixelContentBoxSize) {\n", |
|
" // Chrome 84 implements new version of spec.\n", |
|
" canvas.setAttribute(\n", |
|
" 'width',\n", |
|
" entry.devicePixelContentBoxSize[0].inlineSize\n", |
|
" );\n", |
|
" canvas.setAttribute(\n", |
|
" 'height',\n", |
|
" entry.devicePixelContentBoxSize[0].blockSize\n", |
|
" );\n", |
|
" } else {\n", |
|
" canvas.setAttribute('width', width * fig.ratio);\n", |
|
" canvas.setAttribute('height', height * fig.ratio);\n", |
|
" }\n", |
|
" canvas.setAttribute(\n", |
|
" 'style',\n", |
|
" 'width: ' + width + 'px; height: ' + height + 'px;'\n", |
|
" );\n", |
|
"\n", |
|
" rubberband_canvas.setAttribute('width', width);\n", |
|
" rubberband_canvas.setAttribute('height', height);\n", |
|
"\n", |
|
" // And update the size in Python. We ignore the initial 0/0 size\n", |
|
" // that occurs as the element is placed into the DOM, which should\n", |
|
" // otherwise not happen due to the minimum size styling.\n", |
|
" if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n", |
|
" fig.request_resize(width, height);\n", |
|
" }\n", |
|
" }\n", |
|
" });\n", |
|
" this.resizeObserverInstance.observe(canvas_div);\n", |
|
"\n", |
|
" function on_mouse_event_closure(name) {\n", |
|
" return function (event) {\n", |
|
" return fig.mouse_event(event, name);\n", |
|
" };\n", |
|
" }\n", |
|
"\n", |
|
" rubberband_canvas.addEventListener(\n", |
|
" 'mousedown',\n", |
|
" on_mouse_event_closure('button_press')\n", |
|
" );\n", |
|
" rubberband_canvas.addEventListener(\n", |
|
" 'mouseup',\n", |
|
" on_mouse_event_closure('button_release')\n", |
|
" );\n", |
|
" rubberband_canvas.addEventListener(\n", |
|
" 'dblclick',\n", |
|
" on_mouse_event_closure('dblclick')\n", |
|
" );\n", |
|
" // Throttle sequential mouse events to 1 every 20ms.\n", |
|
" rubberband_canvas.addEventListener(\n", |
|
" 'mousemove',\n", |
|
" on_mouse_event_closure('motion_notify')\n", |
|
" );\n", |
|
"\n", |
|
" rubberband_canvas.addEventListener(\n", |
|
" 'mouseenter',\n", |
|
" on_mouse_event_closure('figure_enter')\n", |
|
" );\n", |
|
" rubberband_canvas.addEventListener(\n", |
|
" 'mouseleave',\n", |
|
" on_mouse_event_closure('figure_leave')\n", |
|
" );\n", |
|
"\n", |
|
" canvas_div.addEventListener('wheel', function (event) {\n", |
|
" if (event.deltaY < 0) {\n", |
|
" event.step = 1;\n", |
|
" } else {\n", |
|
" event.step = -1;\n", |
|
" }\n", |
|
" on_mouse_event_closure('scroll')(event);\n", |
|
" });\n", |
|
"\n", |
|
" canvas_div.appendChild(canvas);\n", |
|
" canvas_div.appendChild(rubberband_canvas);\n", |
|
"\n", |
|
" this.rubberband_context = rubberband_canvas.getContext('2d');\n", |
|
" this.rubberband_context.strokeStyle = '#000000';\n", |
|
"\n", |
|
" this._resize_canvas = function (width, height, forward) {\n", |
|
" if (forward) {\n", |
|
" canvas_div.style.width = width + 'px';\n", |
|
" canvas_div.style.height = height + 'px';\n", |
|
" }\n", |
|
" };\n", |
|
"\n", |
|
" // Disable right mouse context menu.\n", |
|
" this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n", |
|
" event.preventDefault();\n", |
|
" return false;\n", |
|
" });\n", |
|
"\n", |
|
" function set_focus() {\n", |
|
" canvas.focus();\n", |
|
" canvas_div.focus();\n", |
|
" }\n", |
|
"\n", |
|
" window.setTimeout(set_focus, 100);\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype._init_toolbar = function () {\n", |
|
" var fig = this;\n", |
|
"\n", |
|
" var toolbar = document.createElement('div');\n", |
|
" toolbar.classList = 'mpl-toolbar';\n", |
|
" this.root.appendChild(toolbar);\n", |
|
"\n", |
|
" function on_click_closure(name) {\n", |
|
" return function (_event) {\n", |
|
" return fig.toolbar_button_onclick(name);\n", |
|
" };\n", |
|
" }\n", |
|
"\n", |
|
" function on_mouseover_closure(tooltip) {\n", |
|
" return function (event) {\n", |
|
" if (!event.currentTarget.disabled) {\n", |
|
" return fig.toolbar_button_onmouseover(tooltip);\n", |
|
" }\n", |
|
" };\n", |
|
" }\n", |
|
"\n", |
|
" fig.buttons = {};\n", |
|
" var buttonGroup = document.createElement('div');\n", |
|
" buttonGroup.classList = 'mpl-button-group';\n", |
|
" for (var toolbar_ind in mpl.toolbar_items) {\n", |
|
" var name = mpl.toolbar_items[toolbar_ind][0];\n", |
|
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", |
|
" var image = mpl.toolbar_items[toolbar_ind][2];\n", |
|
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n", |
|
"\n", |
|
" if (!name) {\n", |
|
" /* Instead of a spacer, we start a new button group. */\n", |
|
" if (buttonGroup.hasChildNodes()) {\n", |
|
" toolbar.appendChild(buttonGroup);\n", |
|
" }\n", |
|
" buttonGroup = document.createElement('div');\n", |
|
" buttonGroup.classList = 'mpl-button-group';\n", |
|
" continue;\n", |
|
" }\n", |
|
"\n", |
|
" var button = (fig.buttons[name] = document.createElement('button'));\n", |
|
" button.classList = 'mpl-widget';\n", |
|
" button.setAttribute('role', 'button');\n", |
|
" button.setAttribute('aria-disabled', 'false');\n", |
|
" button.addEventListener('click', on_click_closure(method_name));\n", |
|
" button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", |
|
"\n", |
|
" var icon_img = document.createElement('img');\n", |
|
" icon_img.src = '_images/' + image + '.png';\n", |
|
" icon_img.srcset = '_images/' + image + '_large.png 2x';\n", |
|
" icon_img.alt = tooltip;\n", |
|
" button.appendChild(icon_img);\n", |
|
"\n", |
|
" buttonGroup.appendChild(button);\n", |
|
" }\n", |
|
"\n", |
|
" if (buttonGroup.hasChildNodes()) {\n", |
|
" toolbar.appendChild(buttonGroup);\n", |
|
" }\n", |
|
"\n", |
|
" var fmt_picker = document.createElement('select');\n", |
|
" fmt_picker.classList = 'mpl-widget';\n", |
|
" toolbar.appendChild(fmt_picker);\n", |
|
" this.format_dropdown = fmt_picker;\n", |
|
"\n", |
|
" for (var ind in mpl.extensions) {\n", |
|
" var fmt = mpl.extensions[ind];\n", |
|
" var option = document.createElement('option');\n", |
|
" option.selected = fmt === mpl.default_extension;\n", |
|
" option.innerHTML = fmt;\n", |
|
" fmt_picker.appendChild(option);\n", |
|
" }\n", |
|
"\n", |
|
" var status_bar = document.createElement('span');\n", |
|
" status_bar.classList = 'mpl-message';\n", |
|
" toolbar.appendChild(status_bar);\n", |
|
" this.message = status_bar;\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n", |
|
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", |
|
" // which will in turn request a refresh of the image.\n", |
|
" this.send_message('resize', { width: x_pixels, height: y_pixels });\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype.send_message = function (type, properties) {\n", |
|
" properties['type'] = type;\n", |
|
" properties['figure_id'] = this.id;\n", |
|
" this.ws.send(JSON.stringify(properties));\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype.send_draw_message = function () {\n", |
|
" if (!this.waiting) {\n", |
|
" this.waiting = true;\n", |
|
" this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n", |
|
" }\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype.handle_save = function (fig, _msg) {\n", |
|
" var format_dropdown = fig.format_dropdown;\n", |
|
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", |
|
" fig.ondownload(fig, format);\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype.handle_resize = function (fig, msg) {\n", |
|
" var size = msg['size'];\n", |
|
" if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n", |
|
" fig._resize_canvas(size[0], size[1], msg['forward']);\n", |
|
" fig.send_message('refresh', {});\n", |
|
" }\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n", |
|
" var x0 = msg['x0'] / fig.ratio;\n", |
|
" var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n", |
|
" var x1 = msg['x1'] / fig.ratio;\n", |
|
" var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n", |
|
" x0 = Math.floor(x0) + 0.5;\n", |
|
" y0 = Math.floor(y0) + 0.5;\n", |
|
" x1 = Math.floor(x1) + 0.5;\n", |
|
" y1 = Math.floor(y1) + 0.5;\n", |
|
" var min_x = Math.min(x0, x1);\n", |
|
" var min_y = Math.min(y0, y1);\n", |
|
" var width = Math.abs(x1 - x0);\n", |
|
" var height = Math.abs(y1 - y0);\n", |
|
"\n", |
|
" fig.rubberband_context.clearRect(\n", |
|
" 0,\n", |
|
" 0,\n", |
|
" fig.canvas.width / fig.ratio,\n", |
|
" fig.canvas.height / fig.ratio\n", |
|
" );\n", |
|
"\n", |
|
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n", |
|
" // Updates the figure title.\n", |
|
" fig.header.textContent = msg['label'];\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype.handle_cursor = function (fig, msg) {\n", |
|
" fig.rubberband_canvas.style.cursor = msg['cursor'];\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype.handle_message = function (fig, msg) {\n", |
|
" fig.message.textContent = msg['message'];\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype.handle_draw = function (fig, _msg) {\n", |
|
" // Request the server to send over a new figure.\n", |
|
" fig.send_draw_message();\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n", |
|
" fig.image_mode = msg['mode'];\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n", |
|
" for (var key in msg) {\n", |
|
" if (!(key in fig.buttons)) {\n", |
|
" continue;\n", |
|
" }\n", |
|
" fig.buttons[key].disabled = !msg[key];\n", |
|
" fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n", |
|
" }\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n", |
|
" if (msg['mode'] === 'PAN') {\n", |
|
" fig.buttons['Pan'].classList.add('active');\n", |
|
" fig.buttons['Zoom'].classList.remove('active');\n", |
|
" } else if (msg['mode'] === 'ZOOM') {\n", |
|
" fig.buttons['Pan'].classList.remove('active');\n", |
|
" fig.buttons['Zoom'].classList.add('active');\n", |
|
" } else {\n", |
|
" fig.buttons['Pan'].classList.remove('active');\n", |
|
" fig.buttons['Zoom'].classList.remove('active');\n", |
|
" }\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype.updated_canvas_event = function () {\n", |
|
" // Called whenever the canvas gets updated.\n", |
|
" this.send_message('ack', {});\n", |
|
"};\n", |
|
"\n", |
|
"// A function to construct a web socket function for onmessage handling.\n", |
|
"// Called in the figure constructor.\n", |
|
"mpl.figure.prototype._make_on_message_function = function (fig) {\n", |
|
" return function socket_on_message(evt) {\n", |
|
" if (evt.data instanceof Blob) {\n", |
|
" var img = evt.data;\n", |
|
" if (img.type !== 'image/png') {\n", |
|
" /* FIXME: We get \"Resource interpreted as Image but\n", |
|
" * transferred with MIME type text/plain:\" errors on\n", |
|
" * Chrome. But how to set the MIME type? It doesn't seem\n", |
|
" * to be part of the websocket stream */\n", |
|
" img.type = 'image/png';\n", |
|
" }\n", |
|
"\n", |
|
" /* Free the memory for the previous frames */\n", |
|
" if (fig.imageObj.src) {\n", |
|
" (window.URL || window.webkitURL).revokeObjectURL(\n", |
|
" fig.imageObj.src\n", |
|
" );\n", |
|
" }\n", |
|
"\n", |
|
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", |
|
" img\n", |
|
" );\n", |
|
" fig.updated_canvas_event();\n", |
|
" fig.waiting = false;\n", |
|
" return;\n", |
|
" } else if (\n", |
|
" typeof evt.data === 'string' &&\n", |
|
" evt.data.slice(0, 21) === 'data:image/png;base64'\n", |
|
" ) {\n", |
|
" fig.imageObj.src = evt.data;\n", |
|
" fig.updated_canvas_event();\n", |
|
" fig.waiting = false;\n", |
|
" return;\n", |
|
" }\n", |
|
"\n", |
|
" var msg = JSON.parse(evt.data);\n", |
|
" var msg_type = msg['type'];\n", |
|
"\n", |
|
" // Call the \"handle_{type}\" callback, which takes\n", |
|
" // the figure and JSON message as its only arguments.\n", |
|
" try {\n", |
|
" var callback = fig['handle_' + msg_type];\n", |
|
" } catch (e) {\n", |
|
" console.log(\n", |
|
" \"No handler for the '\" + msg_type + \"' message type: \",\n", |
|
" msg\n", |
|
" );\n", |
|
" return;\n", |
|
" }\n", |
|
"\n", |
|
" if (callback) {\n", |
|
" try {\n", |
|
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", |
|
" callback(fig, msg);\n", |
|
" } catch (e) {\n", |
|
" console.log(\n", |
|
" \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n", |
|
" e,\n", |
|
" e.stack,\n", |
|
" msg\n", |
|
" );\n", |
|
" }\n", |
|
" }\n", |
|
" };\n", |
|
"};\n", |
|
"\n", |
|
"// from https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", |
|
"mpl.findpos = function (e) {\n", |
|
" //this section is from http://www.quirksmode.org/js/events_properties.html\n", |
|
" var targ;\n", |
|
" if (!e) {\n", |
|
" e = window.event;\n", |
|
" }\n", |
|
" if (e.target) {\n", |
|
" targ = e.target;\n", |
|
" } else if (e.srcElement) {\n", |
|
" targ = e.srcElement;\n", |
|
" }\n", |
|
" if (targ.nodeType === 3) {\n", |
|
" // defeat Safari bug\n", |
|
" targ = targ.parentNode;\n", |
|
" }\n", |
|
"\n", |
|
" // pageX,Y are the mouse positions relative to the document\n", |
|
" var boundingRect = targ.getBoundingClientRect();\n", |
|
" var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n", |
|
" var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n", |
|
"\n", |
|
" return { x: x, y: y };\n", |
|
"};\n", |
|
"\n", |
|
"/*\n", |
|
" * return a copy of an object with only non-object keys\n", |
|
" * we need this to avoid circular references\n", |
|
" * https://stackoverflow.com/a/24161582/3208463\n", |
|
" */\n", |
|
"function simpleKeys(original) {\n", |
|
" return Object.keys(original).reduce(function (obj, key) {\n", |
|
" if (typeof original[key] !== 'object') {\n", |
|
" obj[key] = original[key];\n", |
|
" }\n", |
|
" return obj;\n", |
|
" }, {});\n", |
|
"}\n", |
|
"\n", |
|
"mpl.figure.prototype.mouse_event = function (event, name) {\n", |
|
" var canvas_pos = mpl.findpos(event);\n", |
|
"\n", |
|
" if (name === 'button_press') {\n", |
|
" this.canvas.focus();\n", |
|
" this.canvas_div.focus();\n", |
|
" }\n", |
|
"\n", |
|
" var x = canvas_pos.x * this.ratio;\n", |
|
" var y = canvas_pos.y * this.ratio;\n", |
|
"\n", |
|
" this.send_message(name, {\n", |
|
" x: x,\n", |
|
" y: y,\n", |
|
" button: event.button,\n", |
|
" step: event.step,\n", |
|
" guiEvent: simpleKeys(event),\n", |
|
" });\n", |
|
"\n", |
|
" /* This prevents the web browser from automatically changing to\n", |
|
" * the text insertion cursor when the button is pressed. We want\n", |
|
" * to control all of the cursor setting manually through the\n", |
|
" * 'cursor' event from matplotlib */\n", |
|
" event.preventDefault();\n", |
|
" return false;\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype._key_event_extra = function (_event, _name) {\n", |
|
" // Handle any extra behaviour associated with a key event\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype.key_event = function (event, name) {\n", |
|
" // Prevent repeat events\n", |
|
" if (name === 'key_press') {\n", |
|
" if (event.key === this._key) {\n", |
|
" return;\n", |
|
" } else {\n", |
|
" this._key = event.key;\n", |
|
" }\n", |
|
" }\n", |
|
" if (name === 'key_release') {\n", |
|
" this._key = null;\n", |
|
" }\n", |
|
"\n", |
|
" var value = '';\n", |
|
" if (event.ctrlKey && event.key !== 'Control') {\n", |
|
" value += 'ctrl+';\n", |
|
" }\n", |
|
" else if (event.altKey && event.key !== 'Alt') {\n", |
|
" value += 'alt+';\n", |
|
" }\n", |
|
" else if (event.shiftKey && event.key !== 'Shift') {\n", |
|
" value += 'shift+';\n", |
|
" }\n", |
|
"\n", |
|
" value += 'k' + event.key;\n", |
|
"\n", |
|
" this._key_event_extra(event, name);\n", |
|
"\n", |
|
" this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n", |
|
" return false;\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype.toolbar_button_onclick = function (name) {\n", |
|
" if (name === 'download') {\n", |
|
" this.handle_save(this, null);\n", |
|
" } else {\n", |
|
" this.send_message('toolbar_button', { name: name });\n", |
|
" }\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n", |
|
" this.message.textContent = tooltip;\n", |
|
"};\n", |
|
"\n", |
|
"///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n", |
|
"// prettier-ignore\n", |
|
"var _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\n", |
|
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", |
|
"\n", |
|
"mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n", |
|
"\n", |
|
"mpl.default_extension = \"png\";/* global mpl */\n", |
|
"\n", |
|
"var comm_websocket_adapter = function (comm) {\n", |
|
" // Create a \"websocket\"-like object which calls the given IPython comm\n", |
|
" // object with the appropriate methods. Currently this is a non binary\n", |
|
" // socket, so there is still some room for performance tuning.\n", |
|
" var ws = {};\n", |
|
"\n", |
|
" ws.binaryType = comm.kernel.ws.binaryType;\n", |
|
" ws.readyState = comm.kernel.ws.readyState;\n", |
|
" function updateReadyState(_event) {\n", |
|
" if (comm.kernel.ws) {\n", |
|
" ws.readyState = comm.kernel.ws.readyState;\n", |
|
" } else {\n", |
|
" ws.readyState = 3; // Closed state.\n", |
|
" }\n", |
|
" }\n", |
|
" comm.kernel.ws.addEventListener('open', updateReadyState);\n", |
|
" comm.kernel.ws.addEventListener('close', updateReadyState);\n", |
|
" comm.kernel.ws.addEventListener('error', updateReadyState);\n", |
|
"\n", |
|
" ws.close = function () {\n", |
|
" comm.close();\n", |
|
" };\n", |
|
" ws.send = function (m) {\n", |
|
" //console.log('sending', m);\n", |
|
" comm.send(m);\n", |
|
" };\n", |
|
" // Register the callback with on_msg.\n", |
|
" comm.on_msg(function (msg) {\n", |
|
" //console.log('receiving', msg['content']['data'], msg);\n", |
|
" var data = msg['content']['data'];\n", |
|
" if (data['blob'] !== undefined) {\n", |
|
" data = {\n", |
|
" data: new Blob(msg['buffers'], { type: data['blob'] }),\n", |
|
" };\n", |
|
" }\n", |
|
" // Pass the mpl event to the overridden (by mpl) onmessage function.\n", |
|
" ws.onmessage(data);\n", |
|
" });\n", |
|
" return ws;\n", |
|
"};\n", |
|
"\n", |
|
"mpl.mpl_figure_comm = function (comm, msg) {\n", |
|
" // This is the function which gets called when the mpl process\n", |
|
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n", |
|
"\n", |
|
" var id = msg.content.data.id;\n", |
|
" // Get hold of the div created by the display call when the Comm\n", |
|
" // socket was opened in Python.\n", |
|
" var element = document.getElementById(id);\n", |
|
" var ws_proxy = comm_websocket_adapter(comm);\n", |
|
"\n", |
|
" function ondownload(figure, _format) {\n", |
|
" window.open(figure.canvas.toDataURL());\n", |
|
" }\n", |
|
"\n", |
|
" var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n", |
|
"\n", |
|
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", |
|
" // web socket which is closed, not our websocket->open comm proxy.\n", |
|
" ws_proxy.onopen();\n", |
|
"\n", |
|
" fig.parent_element = element;\n", |
|
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n", |
|
" if (!fig.cell_info) {\n", |
|
" console.error('Failed to find cell for figure', id, fig);\n", |
|
" return;\n", |
|
" }\n", |
|
" fig.cell_info[0].output_area.element.on(\n", |
|
" 'cleared',\n", |
|
" { fig: fig },\n", |
|
" fig._remove_fig_handler\n", |
|
" );\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype.handle_close = function (fig, msg) {\n", |
|
" var width = fig.canvas.width / fig.ratio;\n", |
|
" fig.cell_info[0].output_area.element.off(\n", |
|
" 'cleared',\n", |
|
" fig._remove_fig_handler\n", |
|
" );\n", |
|
" fig.resizeObserverInstance.unobserve(fig.canvas_div);\n", |
|
"\n", |
|
" // Update the output cell to use the data from the current canvas.\n", |
|
" fig.push_to_output();\n", |
|
" var dataURL = fig.canvas.toDataURL();\n", |
|
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n", |
|
" // the notebook keyboard shortcuts fail.\n", |
|
" IPython.keyboard_manager.enable();\n", |
|
" fig.parent_element.innerHTML =\n", |
|
" '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n", |
|
" fig.close_ws(fig, msg);\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype.close_ws = function (fig, msg) {\n", |
|
" fig.send_message('closing', msg);\n", |
|
" // fig.ws.close()\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n", |
|
" // Turn the data on the canvas into data in the output cell.\n", |
|
" var width = this.canvas.width / this.ratio;\n", |
|
" var dataURL = this.canvas.toDataURL();\n", |
|
" this.cell_info[1]['text/html'] =\n", |
|
" '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype.updated_canvas_event = function () {\n", |
|
" // Tell IPython that the notebook contents must change.\n", |
|
" IPython.notebook.set_dirty(true);\n", |
|
" this.send_message('ack', {});\n", |
|
" var fig = this;\n", |
|
" // Wait a second, then push the new image to the DOM so\n", |
|
" // that it is saved nicely (might be nice to debounce this).\n", |
|
" setTimeout(function () {\n", |
|
" fig.push_to_output();\n", |
|
" }, 1000);\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype._init_toolbar = function () {\n", |
|
" var fig = this;\n", |
|
"\n", |
|
" var toolbar = document.createElement('div');\n", |
|
" toolbar.classList = 'btn-toolbar';\n", |
|
" this.root.appendChild(toolbar);\n", |
|
"\n", |
|
" function on_click_closure(name) {\n", |
|
" return function (_event) {\n", |
|
" return fig.toolbar_button_onclick(name);\n", |
|
" };\n", |
|
" }\n", |
|
"\n", |
|
" function on_mouseover_closure(tooltip) {\n", |
|
" return function (event) {\n", |
|
" if (!event.currentTarget.disabled) {\n", |
|
" return fig.toolbar_button_onmouseover(tooltip);\n", |
|
" }\n", |
|
" };\n", |
|
" }\n", |
|
"\n", |
|
" fig.buttons = {};\n", |
|
" var buttonGroup = document.createElement('div');\n", |
|
" buttonGroup.classList = 'btn-group';\n", |
|
" var button;\n", |
|
" for (var toolbar_ind in mpl.toolbar_items) {\n", |
|
" var name = mpl.toolbar_items[toolbar_ind][0];\n", |
|
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", |
|
" var image = mpl.toolbar_items[toolbar_ind][2];\n", |
|
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n", |
|
"\n", |
|
" if (!name) {\n", |
|
" /* Instead of a spacer, we start a new button group. */\n", |
|
" if (buttonGroup.hasChildNodes()) {\n", |
|
" toolbar.appendChild(buttonGroup);\n", |
|
" }\n", |
|
" buttonGroup = document.createElement('div');\n", |
|
" buttonGroup.classList = 'btn-group';\n", |
|
" continue;\n", |
|
" }\n", |
|
"\n", |
|
" button = fig.buttons[name] = document.createElement('button');\n", |
|
" button.classList = 'btn btn-default';\n", |
|
" button.href = '#';\n", |
|
" button.title = name;\n", |
|
" button.innerHTML = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n", |
|
" button.addEventListener('click', on_click_closure(method_name));\n", |
|
" button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", |
|
" buttonGroup.appendChild(button);\n", |
|
" }\n", |
|
"\n", |
|
" if (buttonGroup.hasChildNodes()) {\n", |
|
" toolbar.appendChild(buttonGroup);\n", |
|
" }\n", |
|
"\n", |
|
" // Add the status bar.\n", |
|
" var status_bar = document.createElement('span');\n", |
|
" status_bar.classList = 'mpl-message pull-right';\n", |
|
" toolbar.appendChild(status_bar);\n", |
|
" this.message = status_bar;\n", |
|
"\n", |
|
" // Add the close button to the window.\n", |
|
" var buttongrp = document.createElement('div');\n", |
|
" buttongrp.classList = 'btn-group inline pull-right';\n", |
|
" button = document.createElement('button');\n", |
|
" button.classList = 'btn btn-mini btn-primary';\n", |
|
" button.href = '#';\n", |
|
" button.title = 'Stop Interaction';\n", |
|
" button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n", |
|
" button.addEventListener('click', function (_evt) {\n", |
|
" fig.handle_close(fig, {});\n", |
|
" });\n", |
|
" button.addEventListener(\n", |
|
" 'mouseover',\n", |
|
" on_mouseover_closure('Stop Interaction')\n", |
|
" );\n", |
|
" buttongrp.appendChild(button);\n", |
|
" var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n", |
|
" titlebar.insertBefore(buttongrp, titlebar.firstChild);\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype._remove_fig_handler = function (event) {\n", |
|
" var fig = event.data.fig;\n", |
|
" if (event.target !== this) {\n", |
|
" // Ignore bubbled events from children.\n", |
|
" return;\n", |
|
" }\n", |
|
" fig.close_ws(fig, {});\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype._root_extra_style = function (el) {\n", |
|
" el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype._canvas_extra_style = function (el) {\n", |
|
" // this is important to make the div 'focusable\n", |
|
" el.setAttribute('tabindex', 0);\n", |
|
" // reach out to IPython and tell the keyboard manager to turn it's self\n", |
|
" // off when our div gets focus\n", |
|
"\n", |
|
" // location in version 3\n", |
|
" if (IPython.notebook.keyboard_manager) {\n", |
|
" IPython.notebook.keyboard_manager.register_events(el);\n", |
|
" } else {\n", |
|
" // location in version 2\n", |
|
" IPython.keyboard_manager.register_events(el);\n", |
|
" }\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype._key_event_extra = function (event, _name) {\n", |
|
" // Check for shift+enter\n", |
|
" if (event.shiftKey && event.which === 13) {\n", |
|
" this.canvas_div.blur();\n", |
|
" // select the cell after this one\n", |
|
" var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n", |
|
" IPython.notebook.select(index + 1);\n", |
|
" }\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype.handle_save = function (fig, _msg) {\n", |
|
" fig.ondownload(fig, null);\n", |
|
"};\n", |
|
"\n", |
|
"mpl.find_output_cell = function (html_output) {\n", |
|
" // Return the cell and output element which can be found *uniquely* in the notebook.\n", |
|
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", |
|
" // IPython event is triggered only after the cells have been serialised, which for\n", |
|
" // our purposes (turning an active figure into a static one), is too late.\n", |
|
" var cells = IPython.notebook.get_cells();\n", |
|
" var ncells = cells.length;\n", |
|
" for (var i = 0; i < ncells; i++) {\n", |
|
" var cell = cells[i];\n", |
|
" if (cell.cell_type === 'code') {\n", |
|
" for (var j = 0; j < cell.output_area.outputs.length; j++) {\n", |
|
" var data = cell.output_area.outputs[j];\n", |
|
" if (data.data) {\n", |
|
" // IPython >= 3 moved mimebundle to data attribute of output\n", |
|
" data = data.data;\n", |
|
" }\n", |
|
" if (data['text/html'] === html_output) {\n", |
|
" return [cell, data, j];\n", |
|
" }\n", |
|
" }\n", |
|
" }\n", |
|
" }\n", |
|
"};\n", |
|
"\n", |
|
"// Register the function which deals with the matplotlib target/channel.\n", |
|
"// The kernel may be null if the page has been refreshed.\n", |
|
"if (IPython.notebook.kernel !== null) {\n", |
|
" IPython.notebook.kernel.comm_manager.register_target(\n", |
|
" 'matplotlib',\n", |
|
" mpl.mpl_figure_comm\n", |
|
" );\n", |
|
"}\n" |
|
], |
|
"text/plain": [ |
|
"<IPython.core.display.Javascript object>" |
|
] |
|
}, |
|
"metadata": {}, |
|
"output_type": "display_data" |
|
}, |
|
{ |
|
"data": { |
|
"text/html": [ |
|
"<img src=\"data:image/png;base64,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S92SSy5ZFH744Yfdeuut57bffnu3++67Bw386Ec/cieeeKI755xz3PLLL99XRuV/9atfuWuuucaNHTvWTZkyxX31q18tvEXyNim9++67brPNNnMvvPCCu/76690HPvABugkCEIDAsBJADA0rbm4GAQhAAAIQaCaBVVdd1c0zzzzu7LPPbqngVlttVSyfu+6664IVl5h56aWXCtFTTSq/yy67uKOPPtqttdZa7oQTTnA//vGPCzsSR2WS12nvvffuJ6aaSYlaQQACuRFADOXWo7QHAhCAAAQgUJPAq6++6lZYYQW37bbb9nltShNHHnmkO/XUU90dd9zh5phjjn6WtfdHS+UWWWSRljztC9ISOXmc5BHaaaed3F133VXYqaY///nPhVjad9993TbbbFOz5hSHAAQgMDQCiKGh8eNqCEAAAhCAwIgn8Oijj7q11167EEISRNV0+umnu8MPP9xdfvnlfcvnYg1+//33i31BjzzySLF3SPuI9P8KynDllVe2XF4KMS2f22+//WKmyYcABCDQUQKIoY7ixBgEIAABCEBg5BG45557iuhvBx98sNt0001bGnDeeecVf9e/J0yYYGpcuY9o4403dt/5zneKa7785S8XnqULL7ywxcZbb73lll56abfRRhu5Qw891GS/LPT22287iamZZprJTTfddLWupTAERiqBf//7307PjZ4nBTghDY0AYmho/LgaAhCAAAQgMOIJaPma9v4ccsghhSiqplIMXXDBBW6ZZZaJtrX0JC2++OLu/PPPd6NGjSquWX311d2HPvQhJzvVVIqhqnCK3uT/Crz44ovuiSeesBanHASyIrDgggu6j3zkI1m1qRuNQQx1gzr3hAAEIAABCDSIgKLGTZw4MbhvpxQ3V111lVtsscUGrfXxxx/vjjvuOKdJmgIxaHlcmRSVTucMXXHFFS02ymVyX/va14pACnWSrn3ssceK+8g7FEoSW9rXNFiZOvek7FQCcE03EmJsy/xFF100uI8vXc3ytIwYyrNfaRUEIAABCEDATOC1114rwmJvt912bq+99mq5LhZAQYW1R+h73/ueO+uss9zHPvax4iyhqhBSGUWWu/vuu92tt97aYn8oARQUuEH7kpZYYgk322yzBdtrKWMGRcE+AnBNNxhibGP56WqWp2XEUJ79SqsgAAEIQAACtQisttpqbr755iuE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lA4qnqGusOWmEIAABCAAAQgkJGCZkFvKJKxitqbhmq5rY2xj+elqlqdlPEN59iutggAEIAABCGRPwDIptJTJHlSCBsI1AVQ8Q+mg4hnqCltuCgEIQAACEIBAQgKWCflVd09xR1/ziHv3P6Z30003XcLa9Jbpf//73+6dt99xM8w4A1w73PViO/3777o9V1/CrTVhoX7WLeO+w1XK2hyeoay7l8ZBAAIQgAAE8iVgmRRucMLv3F1PvpovBFqWLYHlF5zDXbzzZxFDiXsYMZQYMOYhAAEIQAACEEhDwCKG8AylYY9nKA1XWcUzlI5tyDJiaHh5czcIQAACEIAABDpEwCKGLGU6VJ2eMgPXdN0dYxvLT1ezPC0jhvLsV1oFAQhAAAIQyJ6AZVJoKZM9qAQNhGsCqP9nMsY2lp+uZnlaRgzl2a+0CgIQgAAEIJA9Acuk0FIme1AJGgjXBFARQ+mgDmIZMdQV7NwUAhCAAAQg0DwCzzzzjDvqqKPcbbfd5t555x230koruX322cfNP//85speeeWV7lvf+pZ74IEH3PTTT99y3WmnneaOOOKIoK27777bjRo1ynwfFbRMyC1lat2UwgUBuKYbCDG2sfx0NcvTMmIoz36lVRCAAAQgAIFaBF555RU3adIk98Ybb7gtt9yyEDISLzPOOKO77LLL3OjRo6P2HnroIbfFFlsUE+WQGNp3333db3/7W/ftb3+7n60111yzn3iK3dAyKbSUid2H/P4E4JpuVMTYxvLT1SxPy4ihPPuVVkEAAhCAAARqETj22GPdySef7C699FK35JJLFtc+/PDDbr311nPbb7+923333Qe1d91117m99967EEJKITEksTXHHHO4yZMn16rbQIUtk0JLmY5UpseMwDVdh8fYxvLT1SxPy4ihPPuVVkEAAhCAAARqEVh11VXdPPPM484+++yW67baaiun5XMSOwOlAw880F1wwQVuqaWWch/60Ifc7373u35i6P3333cTJkxwG264odtvv/1q1Q0x1BFcHTXChLyjOFuMxdjG8tPVLE/LiKE8+5VWQQACEIAABMwEXn31VbfCCiu4bbfdttgjVE1HHnmkO/XUU90dd9xReHVCafPNNy/2F33jG99wEkbyLvmeoSeffNJJcB166KFuo402cm+++aabaaaZ3HTTTWeup1/QMim0lGm7Aj18IVzTdX6MbSw/Xc3ytIwYyrNfaRUEIAABCEDATODRRx91a6+9diGEJIiq6fTTT3eHH364u/zyy/uWz/mG33777WJvkZJshMTQ9ddf73beeWc3ceJEd+edd7qnn37azTrrrG6dddYpltfpv+smy6TQUqbufSlPAIWUYyA2ZmP5KeuWo23EUI69SpsgAAEIQAACNQjcc889bpNNNnEHH3yw23TTTVuuPO+884q/699a5hZLA4mhk046yR1zzDFu7NixbocddnCzzz67u/nmm93FF1/sVlxxRSfRVddLVE4KF1xwQTfLLLMEqyYP1BNPPOEGKxNrE/n9CcA13aiIsS3zl1hiCTfbbLOlq0iPWEYM9UhH00wIQAACEIDAQATuuusut9lmm7lDDjmkEEXVVIoh7QlaZpllohAHEkNaZnfLLbcU95l77rn77Bx99NHupz/9qTvhhBOKZXR1UimG6lxDWQjkQgAx1JmeRAx1hiNWIAABCEAAAiOWgKLGafmaQl9vs802Le0ol8ldddVVbrHFFou2cSAxNNCFTz31lFtllVWKcN4HHHBA1H61AJ6hWrg6WjjmvejozXrMWIwtnqHODgjEUGd5Yg0CEIAABCAw4gi89tprbvnll3fbbbed22uvvVrqbwmgUL2grhjSxE4epw022MAddthhtdhZ9k5YytS6KYULAnBNNxBibGP56WqWp2XEUJ79SqsgAAEIQAACtQisttpqbr755nNnnHFGy3UKrf3cc8+5a665xmRvIDGkc4q0d+eSSy5psaOoc+uvv77bddddiwALdZJlUmgpU+eelJ1KAK7pRkKMbSw/Xc3ytIwYyrNfaRUEIAABCECgFgHt3TnllFOCh67uuOOOhVixpIHE0He/+1131llnFfuDvvCFLxSmdPbQN7/5TXfDDTe4q6++2i200EKWW/SVsUwKLWVq3ZTCiKHEYyA2ZmP5iauXnXnEUHZdSoMgAAEIQAAC9Qm88sorRXjt9957r1guJ6Gi84UUpU3enNGjR7uXXnqpCIKgyGzLLrts8CYDiaG///3vRRjt119/3W2xxRZFEAV5m26//Xa32267uZ122ql2pS2TQkuZ2jfmAjxDCcdAbMzG8hNWLUvTiKEsu5VGQQACEIAABOoT0DI2nSl02223FecGKeS19hAtsMAChTEJFy2bW2+99dwRRxxRSwypsA5elQfq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P//8ZltXXnml+9a3vuUeeOABN/3007dc995777nJkye7iy66yD3//PNu4YUXdjvuuKP7yle+YrZfLWiZFFrKtHXzHr8IrukGQIxtLD9dzfK0jBjKs19pFQQgAAEIQKAWgVdeecVNmjTJvfHGG27LLbcshMxpp53mZpxxRnfZZZe50aNHR+ltIqMAACAASURBVO099NBDbosttnCarIXE0GGHHebOOOMMt/7667tPfOIT7uqrr3a33367O+aYY9waa6wRte8XsEwKLWVq35gLij5+5JFH3BJLLOFmm202iHSQQIxtLL+DVekJU4ihnuhmGgkBCEAAAhAYnMCxxx7rTj75ZHfppZe6JZdcsij88MMPu/XWW89tv/32bvfddx/UwHXXXef23nvvYpKs5IuhKVOmuK9+9atu6623LrxNSu+++67bbLPN3AsvvOCuv/5694EPfKBWN1kmhZYytW5K4YIAXNMNhBjbWH66muVpGTGUZ7/SKghAAAIQgEAtAquuuqqbZ5553Nlnn91y3VZbbeW0fE5iZ6B04IEHugsuuMAttdRS7kMf+pD73e9+108MnXDCCe7HP/5xYWfs2LF9puR1kog655xz3PLLL1+rzpZJoaVMrZtSGDGUeAzExmwsP3H1sjOPGMquS2lQKgLvv/+++98HJpV57EIAAh4BnrnhGxKvvvqqW2GFFdy2227b57Up737kkUe6U0891d1xxx1ujjnmCFZq8803L/YXfeMb33ASRvIu+Z6hnXbayd11112FnWr685//7NZaay237777um222aZWoy2TQkuZWjelMGIo8RiIjdlYfuLqZWceMZRdl+bXIC2juPnmm93ll19erE/Wplulueaaq/jx1hp3rT1PmXT/c88915100kl9t/n5z39e/HhvvPHG7jvf+U7K22O7BwloH4W+yIeSRPmss87qxowZ4yZMmFAsYVpkkUWyoaRn/IgjjigmxtVnW3sTtH/l/vvv72pb3377bff973/f/fKXv3TaZ/PhD3/Y6X3wmc98Zkj1e+qpp9wqq6ziPvaxj7lf/epXpjZ2ismjjz7q1l577UIISRBV0+mnn+4OP/zw4h1cLp/zKycm6hsl2QiJIe0TUlAGBVioplKIafncfvvtZ2p3WcgyKbSUqXVTCiOGEo+B2JiN5SeuXnbmEUPZdWleDXr88cfdbrvt5vRDrQnguHHjiqhGikj02GOPuSeeeKJo8CabbFJ8jay73txCS8tDVl555X4TFMSQhR5l2iVQiiEJHn1xryZ5TLTH4sEHHyzW7c8yyyzFEiMtUcohSQSq/Vp2tcwyy/Q1qVMT/6Ey0kcRbfj/4Ac/6D796U8X7yYt/xpq/bophu65557iPXrwwQe7TTfdtAXReeedV/xd/5b4jqWBxNCXv/zlwrN04YUXtph466233NJLL+022mgjd+ihh8bMt+SXk8IFF1yweA5C6c033yx+KwYrU+umFC4IwDXdQIixLfMJXtGZPkAMdYYjVhIQePrppwuvz9///nentez6ga2uM9ct//CHPxRrzVV2jz32cDvssEPHazLQBOW1114rJqT6cZ9zzjk7fl8M9jaBUgzJ+3nWWWcFYcgroU3tv//9792KK67ozjzzzCygKZKZllL5YkgfR6abbrriw0Q3k5Z73XDDDUUI6okTJ/ZVZaj166YY0vI1BTI45JBDClFUTaUY8vtjoD4YSAytvvrqxX4i2ammUgy142UvxVA3xwP3hkC3CCCGOkMeMdQZjlhJQEBrz7U8TWvJf/CDHwy4X0cTEE1IZpppJnfLLbe4mWeeuaO1aWeC0tEKYKwnCVjEkMBo/CsksbwTf/zjH4vnYKSngcRQU9q13XbbFQECJD4lQjuV2nnXDNUbVdZdUeP0Hg3t2ymXyV111VVuscUWizZ3IDGkqHTy6l9xxRUtNsplcl/72teKj1t1Ep6hOrQ6Wzbmvejs3XrLWowtnqHOjgfEUGd5Yq1DBP76178Wh/Dp7AJ9gR1o0255u+OOO879+9//LvZY6MtjOZnSmn6tQf/Tn/7kPvKRjziFjtUeBJ2joWVF11xzjdO9/vWvfxXX6Su8vvouuuiihWnZPf7441taVX6pDy2TK8vrbA55jnS4oJb4aS29Jk277rprn+2qUUVXOuWUU4qyM8wwg/viF79YHFqoL7WaPIgBqbcIWMWQxvKyyy5bwNEEXeO8TPKqKlSyxpf24eg50pK7//qv/3If/ehH+wGVp0kb5X/961+75557rtiTtNxyy7lvfvObxRKjapI39ic/+Yn77W9/615++eWirJaT7rLLLi11KCf4WiIlL9b3vve9YhO9ljQpcphslxPssqxfMYVcXmCBBVqWoWkCrT06sqOPIOV+lfJaPX9qq5ay6aNKefinnjHVW54n2Zh33nmd6qaDP2NnpZTPvF8/7afRfpiBhEldVqE9Q2rDz372s2JppNoib/mee+5ZLNPrxD4q8VJ/SOjttddeLU20BFCoXjCQGNLYuPvuu92tt97aYp8ACiPz3ca+lXT9FmMby09XszwtI4by7NcR3yoJEAkLbeiVV6huKsXQQgstVGzY1V4jffnUl00lRT5SpCPtP1Kelmno/zV5HDVqVFFuvvnmK8SSNg1rMqmJkiZ72qguwTSYGNJERdcsvvjiTnWQGNPeI01GtTFaG67LpAmO2igRJMGkZUA6/V2TWn390WQPMVR3BIz88lYxpPEkka0xJVGg8aP05JNPFh8Fnn322UJIaJzrvzUWNZYl1Kv7cTRh18cECRI9Fx//+MeL/9ZzIUGhpU1lkIb77rvPff3rXy/EhD4cLLzwwsVHBU1qFdhEoZlLsVUKHH2EUJ0k7vVBQc+DbOt508cD5ev506GcWvYngfXZz362+EihDxpqny82NLnWcyZx86Uvfaml07WBX5NyMTjggAOKvBtvvNH993//t9Nmf+2vEhfVQXVUO7Qcsfps+qPozjvvdOeff37xfL744ouF2JII1LIyCYmQGGqHlS+GtExNy9e0J1Ls5P1THdRP2jvZCTGktq622mrFe0+HolaTxoXEsd6HljSQGDrxxBPdj370o6IfdJ8ylaG1FaRG4rtOskwKLWXq3JOyUwnANd1IiLGN5aerWZ6WEUN59uuIb5WiY/3mN79x3/3ud92GG25Yuz2lGNKkQqJFkbfkOdJE8ac//ak7+uij3brrrltESConj/rCrj1H+mKsL9j6Uqw00NKVwcSQrqvWXZMvfXGV7W9/+9vFRFJJS5wk+GafffZiyY3EU/l3RVbShEsTHsRQ7SEw4i8YTAwpwqLEgrwFimomUeIvb9L+i3vvvbfw1MgTVI7zq6++uvAoyCMiIVV6VMplqfpQIPFRelIkmrQ3Rh4ILZfSWJbXVuLJfz7lVZIXQcKm3CRf9fZIkKlMKTjkDVX9Ne710aGs40DL5HyxUQrBddZZp7BTTXrG5LVSPVQf8ZIHSF5gnXfzhS98oSgucabIdXr+tNxQgRFiaaBlcn792mVVFUMSsOItNuJfRtcTV4kU9UOnxJDei+qT0KGreh9KdFvSQGJI77s111yziFZXLocTfwVseOmll9y1115bOwiOZVJoKWNpF2VaCcA13YiIsY3lp6tZnpYRQ3n264hvlSY3CqOtJT5aMlZNmmAMFH5VG3T1TzmZ0qRPwqqa9NVTkySFw65+nVQZffU96KCDWsJltyOGPvnJT/Y7uFCTPS0/0YRMkaeUFDlJX9FDEZwUflZL5RBDI344t9WAwUJrVw1qj5wmqvqnPAerjAym5XMa036SINe+DU1+tSdPE249Z3oeNCEthZCuU+Q6fZDQBwVNlOUd0HOl63S9n7S0U8vgdF/dvyqGQqGZFUFMe52qB25axZA8uloqpzpq6VUp7P7xj38UXqWyPaqj3iU//OEPiw8eCrZSTRKXei7lrZLXQgePDpasYkge5nZYVcVQ6U3Zeeed+4kRLR/U3zslhrRMUh9nJFDURnGVeJV3+pJLLnGjR48uRIs8kFo2WS7P9FkNJIZUTu9XeRk1psaPH1944fWRSO9EvbvrJsuk0FKm7n0pj2co5RiIjdlYfsq65WgbMZRjr2bQJv0ga21/SAy9/vrrA4Z31Rdw7UEoJ1Oh60N4/vnPf7qHHnqo+IqsH2et/5fXSKkdMRRad6+lP/oi+vnPf75Y+6+kL9H6Wqov/HPPPXdL1bRETktGNDHDM5TBoK7ZhFBobXk39ZFAS6O0rFKTek0qtYytmsrQzxJI8nL6qRTmZfSu8v9lS96ewdL/+3//r3hOJOQlZPxUTt7L6I7l86OldNrD5yctcdNePoXQ1/JTJasYUll9GNFEXd4eLU9VUv1UT3nFtCxOSZvzNYnX5F4Cyk/777+/u/jii/sE4mAMrGKoXVZVMaR3ht4dpbis1ktLgCVIJII7dfaSQlDr3adleOVeR33E0ZJCpXJcKhiCPGqhNJgYkvDUGFGfSXxpXEjQaYleO8kyKbSUaefevX4NXNONgBjbWH66muVpGTGUZ7+O+FaVkw3rMrly6ZsvhgY6F0NfwrU+XaG5p0yZ4vQlWUmTCn0Nrf7QtyOGQmG+y0mEvlhr6ZGSJjJatiMhFkoqqwkJYmjED+naDRhomZzGp7ybmrBqeaWWTvnnC5VnwsRuqqVienbKpXD6kKBnaLBULqeL2ZaHSF6A8vmR50kfJ/xU7hcpyyu/jhiSR0iHs1Y9VVpiqsm8xJcm20rlh4dYvavLWAcqaxVD7bKqiiEtK5P49ffZlHWTAFRwjE6JoRifpuVbJoWWMk1r10ioD1zT9VKMbSw/Xc3ytIwYyrNfR3yrtP5fS3I22GCDYkN1LA0khkLnYijilr5Aa7mdlnr853/+ZxHNSks2dG6QNlsPVQyFlueFxJDuqa+7EkPlEqdqW/UFW5ulEUOxEZBffiyAgoSGvAUKtKElb9WN/zqAWGNfYrv8oh8ipKAB8h6Vz4+8KPKmDJZKIaCxOViwAS0VleepFEMKcCAvkJ/KvXfVQAd1xJC8ZRJamhxIGCkqmryv2p8k70OZtAxOHz7kgRgs/L7KxbwUVjHULquqGJLIU2CKgcRQubwPMbTEgNEAmTimeT/CNQ1XWY2xjeWnq1melhFDefbriG9VeeaFoq9pXby/DMhvoFUM6au6vqRqguYfmCib5eGCwyWGNOnSshQFi/D3KWg/hCazLJMb8cO5rQbExJCWUcproA302mCvKF1l0v4LLRsLifJQZSQatNxsoEMvtYxTP76KniaPlLw52n+j+8dSKYYUna4qTsrrVE/Vt+qRqSOGZKcM/azlV4p6pv2AfkCJLbbYovAEWw8OtQhC/5whP4CCggS0w6oqhkpBVd1TVdZN7zMtpdUHFcQQYij2LHY6nwl5p4lOsxdjG8tPV7M8LSOG8uzXLFqlL9b6GqoJlzZqhzwnaqi+DGsipb0+/jI5f+KjiFKa0CmS1k033dSPk76M64wVHT4osaSkyaa+avvhbgeLJmf1DMkLddFFFwUDKGijupYtEUAhi+FcuxExMSSDEilaiqWkfWjyiChpb4z2yJRnYvk313I1RWJTFC/t+/nLX/7ivvrVr7qxY8cWARLKqG7ldXoGVUaBR+Sl1F4YRWOUCPGThIjCScv7usoqq/R5hhSUQc9c9RwkXTtp0qRiIl8NrlBXDMmzqvqoLQrfLXb6wKAw32VSlDjtparuI6rWXX/X+0EiqozYNlCnWT1D5d6luqyq75pyCaP2DmkvTjVJ3EnkdSqAQu1B2oALLJNCS5kGNGXEVQGu6bosxjaWn65meVpGDOXZr1m0SmeOyEOjL71akqNJin/6uaJW6YweHeSnpOVBCg080GRKUZImTJhQLJHTZulyr4UElc46KQVQ9Uu7oifp/prEaYldmTohhuQBUxt1loq+MpeHvWpCp30PEmKIoSyGc+1GWMSQjOoDgCLA6VwffRDQxFjjWREZtbxKglrCRGfUKGkCLQElz5KeAS3VVCr32ShPe95KQaTnQhvly71uCmAi76r22SmIQjX0vcJ2KwKirpVokhipRpPTOV3yYGnpp1Lp0fVFWxkWW0tlP/e5z/WxG+hQUxXQcjK9MxQMRfYUKKGa9CxJ8CnJE1WNUlmGBNdzKBFV1m+gTrOKoXZZVcWQ2qT3kUL/a5lhyUPvJfVZJ88Zqj1IG3CBZVJoKdOApoy4KsA1XZfF2Mby09UsT8uIoTz7NZtW6ZwdLTXRl24lHfqoSZ+Wh2iip4mWkkLoKuJROdkZSAyprASPvraWh5xq/4AOopTokhjR5EIHKGpZipImljoMVZMsLUnR5FHCrBNiSPbLA2bLyE36gl4euqoldDq0Vd4qUm8RsIohTfIVHECBOKoBEBR1ToEFNJmWoF5yySULAaOw23p+/CAfepb0IUHPgcachMff/va34rBiHSyqs2fKiIfam6MIYJqga+Ku56Y8RFUeXD1jEmNKpRhSsAdFEtOSVx32WtrWMlAFhNA9y6TAKToAVXny0sjzK6/VYGKoDJ0tGxJv+sjgJ+2t0rOreoiH9gwqmqP+0fMn79qnPvWp6ECziiEZaoeV74WW2FVUQNVbe7HEUu8IiTcJLk2MWCbHMrnowO1wASbkHQZaMRdjG8tPV7M8LSOG8uzXrFqliZvOodAyGi2/0WRNa+Q1QdNESUtx9OW0ejbKYGJIEwpNtLR/QRO1UaNGFZvMJaQ0GVSELR1iqSVB5QZxfeXWkiBNPLXETpOTTokhdZYmaZoQSohJnKlNOg9F527Ie6V7kXqLgFUMiUoZzloejV/84heFcFBSlDF5X7Q8Tf+tc2J0wKmWXFU9LiVZLROT90HjXcFEtGdPS++0fFTjvpr++te/Frb1oUKCa8455yzGqs71qi4zq0Zj1HJXPUc6V0gTei0/1fK06nI23UP10JIwebHk0dL+JD2Xg4khPZt6biRqFIp6ttlmCw4YiQaJnjvvvLP4wCGBJ2+xluXqY4sl1RFDstcOKy1jrCYdoKt+1r/l4S695Xpn6aMRYggxZBm7nSzDhLyTNFttxdjG8tPVLE/LiKE8+5VWjRAC+jquJUXybJXLmMqqP/DAA8V5R/7m+BHSNKoJgYLAQKHpwQOBThCwTAotZTpRl16zAdd0PR5jG8tPV7M8LSOG8uxXWjVCCJQhxP3zXbTkSV/MtUdJZcolRyOkWVQTAn0EEEMMhpQELJNCS5mUdczVNlzT9WyMbSw/Xc3ytIwYyrNfadUIISDPkLw/erFp34WW6UgIaRmRTmfXGSLa7E2CwEglgBgaqT03MuptmRRayoyM1jarlnBN1x8xtrH8dDXL0zJiKM9+pVUjiIAix51++umFF0j7obTnQaJIIkmRugYKKT6CmkhVe5gAYqiHO38Ymm6ZFFrKDENVs7sFXNN1aYxtLD9dzfK0jBiK9Ks22GrPhiL5VEPIDnbZo48+WkRT0kZX7QPRJmFFOlPkHxIEINA+AZ7H9tlxJQRyJGCZFFrK5MgmdZvgmo5wjG0sP13N8rSMGBqkX3UWjSJ6KTKRQr1axJC+8usQQUVK0oGGCj2rMM4KG6sDQPXVnwQBCNQnwPNYnxlXQCB3ApZJoaVM7pxStA+uKahOtRljG8tPV7M8LSOGBuhXhaHdddddizM5lKxiSOdhXHfddcXp7uWZHDfeeGMRtlUHFOqEdBIEIFCPAM9jPV6UhkCvELBMCi1leoVXJ9sJ107SbLUVYxvLT1ezPC0jhgL9qr0biu6ltMEGGxRn0ljEkM6+0aGcOq9GZ2lUk86/0Fk2OkuGBAEI2AnwPNpZURICvUbAMim0lOk1bp1oL1w7QTFsI8Y2lp+uZnlaRgwF+lWCRaeG77fffu7ZZ591W221lUkMPfjgg8Wp5wcccIDToZ/VpEMLdTjhXXfdledIolUQSESA5zERWMxCIAMClkmhpUwGKIa9CXBNhzzGNpafrmZ5WkYMBfpVexPKvT3lKfAWz1C5HO64445zq6++eotlXS8Pk049/+AHP5jnaKJVEEhAgOcxAVRMQiATApZJoaVMJjiGtRlwTYc7xjaWn65meVruGTGk8K6Dpdlmm82NHj26X5E6Yuiqq65ye+65p/vZz37mPv/5z7fY+sEPflD8/eabb+7bS2QZUpoIvvrqq26mmWZy0003neUSykCg8QSeeeaZQes4atSo4qPBW2+95eaYY462Pk6keB5VaZ7Jxg8vKpiAwL///e9+z2OC29Q2aZkUWsrUvjEXRDf5g6h9ArExG8tv/869eWXPiKElllhi0B7WUrj9999/SGLoiiuucAqgcMopp7jPfe5zQTGk/Q8f+chHzKPtxRdfdE888YS5PAUhMBIIbLbZZoNWU+Hs9UwqLbjggn3PTJ2PEymeR9WHZ3IkjDDqmIpA9XlMdY86di2TQkuZOvek7FQCcE03EmJsY/npapan5Z4RQ5dffvmgPahDLj/+8Y8PSQxdf/31buedd3bHH3+8W2211VpslcvkFJ1u1llnNY8meYUee+yx4kDORx55pO86fTH3k/+3d999t1+Z9957z/Q3v1Do4M+Qp2r66afvZz8UTlyermry/195M888cz9bIXb+30Jl5GnwU+xvM8wwg5tzzjnda6+95qrcQvZnmWWWfvZDbfL/FmKjs6n8FPqb5TBWfc31U2hchP7mj6fQmPvXv/7Vz/6bb77Z728KMV9N2j832PjVB4Nx48a5eeed1y266KKFd0ipjhhK8TyqDuUzKW/zP/7xD/Oz3PSCKT3PlrFq4aPn7GMf+5j761//6kLjzGIjVub999+PFRlSfuiZHJLBYbpY5+QpCFD1eRymWw96G8uk0FKmCW0ZaXWAa7oei7GN5aerWZ6We0YMtdt9dSZfDz/8sJs4caI78MAD3eabb95ySwVQUFCGP/zhD7WqUg54nVV0ww039F2rv/vJn3CGJqqKeOen0ETYLxOazEgs+Ck0uQ8JBV+IaJmin8oJcPXvoaWM/mG2ocNtP/zhD/ezH/ub6q3zoV566SVX5RaqQ6iuob1hfrtDbEIMQ6wtE8yQ+NUyLz+Fxsrrr7/eUsz/f2XqEFQ/SSz46ZVXXmn509///vd+ZXxhMf/88xeCSF7dcnx0+3lUpctn8v777++I19bSj6GXRrvXDfQCalcMWephKWN5Meo5W2GFFdwdd9xRiNIUySqGrOX8OnZSDLVbB9Wp7rXyCI0fP77leUzBv65Ny6TQUqbufSmPZyjlGIiN2Vh+yrrlaBsxFOnVOpMvTTL1Q73GGmu4ww47rMWyQmvrx+S0006rNY4QQ624EEPTeFgmmL0shlI8j4ih/q8vyzi0lLG8GBFDrZTqCprq1XWvRQxZRmhvlWFCnq6/Y2xj+elqlqdlxFAHxZBM7bHHHu43v/mN++Uvf+nmmmuuwnoZZe573/uemzRpUq2RVA74iy66qFgiVCb/S3s5SasaD3mPQktLLB4k69fM0NflkFfDXy5mXdoW8rb4XpmQZyj0t5CwqnqLlP/pT3/aKWR6laXVfshbNPvss7f0f6g91mV4vgfJupQuNAlqd5mc1VukpYbVFPqq73uGxGqeeeZp2zOU4nmsiqH77rsv6hnqlAgIvTSGYnso19Z6gdUsHPNO6ZlcccUVi3dh6B0Yu531PRaz0+n8usKkvH+711nrX7UvMbT00kvjGbLC64FyTMjTdXKMbSw/Xc3ytIwYGoIY0v4fBTf4zGc+U+wtUZoyZYpbf/313ZgxY4oN4Jr0aYmb9iSde+65fVGxrMMJMdRKCjE0jQdiaMOWwTEczyNiyPrmaq8cYqgeN8SQbakWE8d648paGq5WUvXLxdjG8uvfsbevQAwNQQzts88+7tJLL3Vnnnlm8bWyTH/605/cUUcd5f74xz8Wex2++MUvFiG3Q3tUYsMPMYQYEgHL3qJe9wwNx/OIGIq9sYaWjxiqxw8xhBiqN2I6W5oJeWd5Vq3F2Mby09UsT8uIoYb3K2IIMYQYmhZAoQmPa/lMskyu872BGKrHFDGEGKo3Yjpbmgl5Z3kihtLxjFlGDMUIdTkfMYQYQgwhhkKvoaHs+xnKtSlfiYihenQRQ4iheiOms6URQ53liRhKxzNmGTEUI9Tl/PJlozNTtPyuTKHzTfwNxaGwx6G/+SG5dQ8/0ELojJlQmG7rj7O/pCsUTtp6zpAflju0rygULCEWmW7uued26667bhHS/OWXX+5jHwvJXRa0BG2wBFmQvVDocT/QQuhcI+s5RqFh7m82twRZCI0d/c0PtOAHVFAZP6iCxojaVA2t3eXHsbh9Hc9QE+qbUx30TGmPps6pyumMp5HQRwRQGAm9NLx1RAyl4x1jG8tPV7M8LSOGGt6viKHWDgpFWkMMTWWEGBqehxkxNDycQ3dBDHWPPWKoe+ybemcm5Ol6JsY2lp+uZnlaRgw1vF8RQ4ghEcAz1P9Q3m49uoihbpF3DjHUPfaIoe6xb+qdmZCn65kY21h+uprlaRkx1PB+RQwhhhBDI3fPUMNfLyOueoih7nUZYqh77Jt6Zybk6XomxjaWn65meVpGDDW8X8sBrzNUdIZRmf7+97/3q7m/hj50KGHob6F9RP6ejtC+otBhraG9Re+9916/uvp7i0Ibuqeffvp+11n2Fo0aNarfdSHPin8Aqi6q7iMaO3as22GHHdx5553nnnnmmT6bob1GOlfKT6G9Rf4+Isu+ItkN7S3y90aF2hgKyR1aThc6GDe2mV31CvVtaC+ZPy5C40ljvZp0jf5p6p4hhc7XOWODJeseunZeQ0Ox3e617V5nbV/sUFQ9UyuvvHJxkHXoHRi7j2VMx2wMlt9uYIrhvs7axmq9JIY+8YlPNPZ5HOw9wcTR2uP1ysG1Hq86pWNsY/l17kVZ5xBDDR8FiKHWDkIMTeOBGOrOw1s+k4ihzvNHDNVj2q6Ist4FMWQl1ZvlmJCn6/cY21h+uprlaRkx1PB+RQwhhkQAz1Dz9gwhhjr/8kQM1WOKGCK0dr0R09nSTMg7y7NqLcY2lp+uZnlaRgw1vF8RQ4ghxFAz9wwhhjr/8kQM1WOKGEIM1RsxnS3NhLyzPBFD6XjGLCOGYoS6nI8YQgwhhhBDodfQUPbvtHttu9dZX6OIzZGsEwAAIABJREFUISupqeUQQ4iheiOms6URQ53liRhKxzNmGTEUI9Tl/PJl87e//a3l4E9LAAVLGTUvdHihfwBmKMiCv+FdtkIb40NBFd5+++0WsqGN+CH0oQ3QfqCFUICAUCCB0JlF1aAKiyyyiNt///3dscce2xK8InZYa1lvy+GsoQAKob+FbPkBIEL1Ch1AG2q3JdBCKKCFdTLmH9gaCrLgH/SrMafDbpsaQOHee+9tCaBgEQqWMho/lnIx4VCOQ4ut0D1D17Vrq1Nibs4553Srrbaau/baa91LL73UkbezZQxbyoTESei6dm1Z34ehcpZ7xsp89KMfdcsss0xjn0cCKHTkcahlBDFUC1etwjG2sfxaN6MwARSaPgYQQ609hBiaxgMx1J2nt3wmEUMD87eIJksZ/w6Iofj7EDHUnwATxzTvSrim4SqrMbax/HQ1y9MynqGG9ytiKP7jj2doKiM8Q8PzMCOG4pwtQsdSBjE0OGtrqPCY10d3iZXBMxQf971Wggl5uh6PsY3lp6tZnpYRQw3vV8QQYkgEWCbXvGhyeIbwDPkEfEHBMrn0P7CWSaGlTPqa5ncHuKbr0xjbWH66muVpGTHU8H5FDCGGEEPNDKCAGEIMIYa6/wNqmRRaynS/JSOvBnBN12cxtrH8dDXL0zJiqOH9Wg54bSavBiJ45ZVX+tXcD5gQCqDQblCF0P38IAuq0GuvvdavXq+//nq/v/mBFkJBFkKb7C2bxkNLR0KHtYYCLVSDCyy55JLu+9//vjvwwAPdo48+2tcGf6+OMkLnAIWWrfl/swRZGEgM+YEWQoEXQvUK1d8SaGHmmWfu148hrqFAC/6FoSVSfpAFBU94+umnG7thW2JIgU3KZAk4YBm/smexZSkzkC1LwJKQ/VD9LfWwLomL8Zlrrrnc2muv7a688kr3wgsv1H57W5aVWb05oXK+/djSs7IBH/jAB/q1xVIPSxkZttQjxKZ63UILLUQAhdojLu8LmJCn698Y21h+uprlaRkx1PB+RQy1dlBssqTSiKFpzBBDnX/Aq3uGEEPtC7dQz8Seb8TQf7RgQwzFN5oLGBPHzr8H4ZqGaWk1NmZj+Wlrl591xFDD+xQxhBgSgZAHCc9Qdx5exFArdzxD03jgGRr+Z9IyKbSUGf6aj/w7wjVdH8bYxvLT1SxPy4ihhvcrYggxhBhq7p4hPEN4hqpvKMTQ8P+gWiaFljLDX/ORf0e4puvDGNtYfrqa5WkZMdTwfkUMIYYQQ4ghjQHfA2PxyISu09/YMzTwi38oS88QQ8P/g2qZFFrKDH/NR/4d4ZquD2NsY/npapanZcRQw/u1HPD6ka1uslVABT/5QQ7+8Y9/9CsT+psl0EKoTCiogjXQgtpVTaEgC2+++Wa/+ocCLfgb762btUMb/WeYYYa+e3784x93P/nJT9yuu+7qHnzwwb6/jxo1ql+9Zputf+jn0N/8pW2hIAuWJXEhgWS9LnRPy96iUHtmmWWWfixCgRaqXHVBaMO4b+jFF190TzzxRGMDKNxzzz1uypQpfdWO7XcZSJhYRY1v3yJodM9QvSx/s5QZqE3+tdZgDLHX8TzzzOM22GADd8kll7jnnnsuVtyUbxEwseAC5Y38cqHrhvI3v0Gh58ha14HCgCu4zf33318EqFA/ap/W0ksv7ZZaaim33HLLDfg8/utf/3LHHXec+8UvfuH0OzNu3Di32267uU996lMt1T7ttNPcEUccEeybu+++24Xer4N1pGVSaCljGiwUaiEA13QDIsY2lp+uZnlaRgw1vF8RQ60dhBiaxsMXP4ih4XmYy2cSMTSVt0XoWMpYeg8x1Eqp02Lo7bffdjfccIPTB6ZFF120iEL35z//uQhKs+2227rPfvazA4qhXXbZxd14441uiy22cIo8d9FFFxXXnnnmmW7ChAl9Fd93333db3/7W/ftb3+7X5evueaazhKNsnqhZVJoKWMZf5RpJQDXdCMixjaWn65meVpGDDW8XxFDiCERCIXNRgx15+FFDLVytwgdSxlLbyKG0oqhBx54wD388MNulVVWcaUHWd7+66+/3q244oqFl3yJJfovW7311lvdNtts4w444AC35ZZbFpWUt19h0OVZOv/88/sqPmnSpOIogsmTJ1u6PFrGMim0lIneiAL9CMA13aCIsY3lp6tZnpYRQw3vV8QQYggx1Mw9Q3iGpj6bFqFjKWN5FSOG0oqhX/3qV05LX7/whS+03Ojmm2928hpp2XBIDO23337F2U9/+MMfXHWZ7PHHH18snZPHaL755ivGirxEG264odM1nUiWSaGlTCfq0ms24Jqux2NsY/npapanZcRQw/u1HPD6klbds+HvuVEz/ANPQ4eihvb0WPYR6QBMP1n3JIXK+XUL1TW0jyj0N61Vryb9aPsptL8iNEGrrqPXOnl9vdx+++2LNfRlCh00Gto7Y9lbFDrsNOQFsuwtGsoBrpYDYkP7ikL1D7W7epitOIYOvPWXx2jP0FNPPdXYPUN33XVXy56h0KvEH2PWQ0st+3UsZVQnf0+dVcCEnhnrPS17hqx7nqpcNaHedNNN3XnnneeeeeaZjry9/aVmlsNUdWPL3p+hLGMLLRfr5J4kv50aJ1dddVWxPE7vPqWyzH333VcsefvpT39a7Bvy9w+us846xfK2n//85y19ctNNN7kddtjBSRStttpq7sknn3SrrrqqO/TQQ91GG23ktC9U7wLLYbgDdbZlUmgp05HB1GNG4Jquw2NsY/npapanZcRQw/sVMdTaQYihaTwsy+SsAgkxZH8RlM8kYmgqM4tACn14QAxNG3MhATbcYkgf07Qcbvz48W6xxRZrEUMSQhJEhx9+uFt99dX7iSEtoVt22WXdSSed1PIgKfDMeuutV3iBtt5668L+zjvv7CZOnOjuvPNO9/TTTzt9KJGY2nvvvYv/rpssk0JLmbr3pTyH2aYcA7ExG8tPWbccbSOGGt6riCHEkAjgGeofra9bjy5iqJU8YmgaD9/DMZI8Q/Lg/+Y3v3HLLLOMW3jhhVvE0F/+8henZaEHH3xwsQ/I9wwp8qY8P8ccc0zL4Hj88cfdGmus4XbffXe34447FmJJZcaOHVt4jGaffXanJXgXX3xxsSfp9NNPr+0lKp/HBRdcsFjiF0ryQCky5WBluvU+Gcn3hWu63ouxLfNDy1bT1Spfy4ihhvctYggxhBhq5p4hPENTn03EUO+IoUMOOcSttdZaQTEkj9EPf/jDoBjac889i+XGd9xxh7vlllvcZptt5uaee+6+skcffXSxBO+EE04oltHVSeVvZJ1rKAuBXAgghjrTk4ihznBMZgUxhBhCDCGGQqLDIkJ0HXuGBn89s2doKh/LMrmjjjqqiDTne4ZWWGGFYi+RAixUU7lM7sADD3Sbb775gB2hvYGyq0h0ikhXJ+EZqkOrs2Vj3ovO3q23rMXY4hnq7HhADHWWZ8etlS96RVGq7v/wgwboxv5+mtD+mtBhraHgBX7QA0uQBdUhdDhr6Fo/IEMosIO1rjoksJr8/1deiNc777zTr7+q+xi0ifjUU091X/va14r18mUKbfYNre8PBQnw18SHgg2EghKEghf4f7OE31YbrOcR+eVC9i2HteqefptC7fYPa9WYeP7550dMAAXL4alWAWMpF9pzM5SgB75ostRBfWsRW9ZocjGG888/v9tqq62Ks2u032SwFNqHYwmOYL2u3T09luvUrtB7xhdu1mV4lmAPGjsKoKD9Qlr2plSyUACZwQIorLvuukUABS13q6YygELM46OJnZbn6UDdww47rNbvqGXvhKVMrZtSuCAA13QDIcY2lp+uZnlaRgw1vF8RQ60dFBJuiKGpjBBDw/MwD7RnKDaRV+2sAsNSDjGEGOqkGJJguuaaa4ogBjpctSqGdEiqPh6deOKJwY8T+++/fyGkFFq7Gm2zDK2tfUFaFqe9Q9q7c8kll7Q8rDrfaP311y/OMVKAhTrJMim0lKlzT8pOJQDXdCMhxjaWn65meVpGDDW8XxFDiCERwDPU/AAKiKFpz6rPAs/QNDZN9QxJDEmUPProo+5LX/pS8c6RZ0ge2htuuMF96lOfcv/93/8dFEMSS1//+tdddTlceejqvPPO684555wCwHe/+1131llnFfuDyrOMNDa++c1vFve4+uqr3UILLVTrV9kyKbSUqXVTCiOGEo+B2JiN5SeuXnbmEUMN71LEEGIIMTQy9gwhhhBDlnOAmiyGdEabwl9rLJfhtbU8Th6obbbZpvAYzTnnnO7ee+8tIrMpnHaZJIZuu+22Yt+P8i688EL32GOPFeJHS+CUtIxaYbQllLbYYovCWyRv1O233+522203t9NOO9X+RbZMCi1lat+YC/AMJRwDsTEby09YtSxNI4YG6Fb9IGids0KKau/EpEmTimg4oR8y34Q2kmqg+kl7T3SWQp2EGEIMIYaWKCZLTXge1Rcsk2t9JtkzNI3HSBdD5fjWHqGXXnqp2Lf0kY98pNhDpH/026ZACwqLrfODjjjiiL7GS+AobLa8O9oDtOSSS7o99tjDffKTn2wZMDp4VdHjfv/73xfldMirziDSvqN2kmVSaCnTzr17/Rq4phsBMbax/HQ1y9MyYijQr9dee23httdL/Ctf+Yp76KGH3EUXXVSEAz3ooIMGHQk6FX3llVcuypZfw8oL9NJfaqmlao2kcsDrXAb9KJUpNAF56623WmyHggaEgguEAhXoB6+aQgEOQn/zAyPIhiX4QqhM6G+he/r7iPy6qw6hYBL6IfZTlaF+/E8++WS33XbbOU0OyhTazxHq1NB6/hlmmKGlqB80QJmhszJCAQf8pXM6s8NPlvOJdI3lcFbrnqTQPS119SNUaayqL7VRfq+99mrE8yhWdcSQP1asy8UsgRAsZVRf694iv1xonLd7T2u7Y8+WAijIQ6HzaGIBFELPpCWQQCiAgnVvjl/OEgRB9QzZt9zTUmYg+37dYsElPvaxjxViqGmhfC2TQkuZWj/MFC4IwDXdQIixjeWnq1melhFDXr/qx16Hx2kpwLnnntvnCTryyCOLH2BtEl1kkUUGHA06tE4epAsuuKCfGGpnCCGGWqkhhqbxsAiMkS6GJHQlhPQhoAnPI2LovX6vMYtoQgxNw2YVPhahYymDGGLS3s7cw3INE3ILpfbKxNjG8tu7a+9ehRjy+v7OO+8szkNQeE+F+SxT6fHRBtJddtllwBHzs5/9zP3gBz9wshMKkVx3qCGGEEMi0KueIUWn+s53vtOY5xExhBgq30gWr4+lzEBixSJ0LGUQQ4ihuvMOa3km5FZS9cvF2Mby69+xt69ADHn9L+/P4Ycf7q644opiOUA1KZqONoz6B8tVy+gr9q233uoUXUdfTLXsKrTsyTrsEEOIoV4WQ/Kwnn322Y15HhFDiCHEUDMDmgy2fI+Jo3XGUa8cXOvxqlM6xjaWX+delC3OVPuP//jfJQzvA2MqAS2H00Gb2rDtLzFSFBx96bvssssGxKVNpdrroP1BEkQSQ3pJK3DCZz7zmdqYEUOIoV4WQyeddJL7xS9+0ZjnETGEGEIMIYZq/5BnegET8nQdG2Mby09Xszwt94wYeuqppwbtQW3elvjROQn6Gn3fffe5mWaaqeWajTbayGkPw69//eugLXmC5DlS4IKNN964OEfh+eefd6eccop77rnnin+vtNJKtUZSOeAVgjS0/6NqzF+7H9rsrIPz/OQHXlC+H1wgFHghFJQgFLwg9Dc/aIOljOplCfYQqlfob6E2Vdut8y50CKCWPSqqYJlCwStCrC3fGCxBFnTf6kGGZT388anDEv0UWl7nByrQNaG/+QEZQss+Q0EbQn/zrw2NuWr95U1VnfTM6PyRpjyPVTH08MMPu2effXbQ59kfA6H9Ndb9NBZb1gAHoXtaAih0sq6WUOQ+XO0dU1CbX/7yl+7FF1/syw5t/g91TKic/7fQ0rZYcIHyXhZboWfeat8SoMFqy1LXahmdF6QIcQRQqPUTnnVhJuTpujfGNpafrmZ5Wu4ZMeQvefO7c6uttnI6RfuAAw4oIscpepg/AZUY0mT8V7/6VXA0SATpTIUxY8YUp2mXSSFK9QOuSEiXX355rZFUDvhaF1EYAg0noGiLgyU9L3omtQfvxhtvbMzzWBVDDUdM9SCQhABiKAnWEWmUCXm6bouxjeWnq1melntGDMVEiCLEKZSy9gtp39Add9xRnMBdTVomp9DIl1xySe3RsM8++7hLL700aHcwY3iGWungGZrGYyR7hnTSvZ+q7ZlvvvncwgsvXHxckBegKc9jVQzhGZragxZvl6WMbMW8qXiGPtDy2KT2YuEZqv1T31MXMCFP190xtrH8dDXL03LPiCFr951xxhlF5CrtU9C+n2pSAIUJEya4E0880Wqur9xRRx3lJk+e7G666San5QbWVA54nehdPWcodL0/4bCcRSQ7ofN2/GVlIRES+lso9HW75wzptHI/hc4x8u/pnzskGxYRpXLVdo8bN644RHDnnXd21cm7Tmn3k+XgyVCfhQ7xDS2JC51H5C+LCy118wW96hD6myUEt/WcodCZRf61lrOINDGWEJIgasrzKH7lM3nXXXe5KVOm9HWrZdlXSBS0+7fQdaFxaLXvX2u9zlLOUkYgY2JI3vUtt9zSnXnmmS3nDA1lmZzloFTL+USqv8VW6Jm32vevtV5nKRcTVpwzZP3V7p1yTMjT9XWMbSw/Xc3ytIwY8vq1DK2tQArVE7HL0Nq77bab22mnnYKjQWGAtcxOobflRaqmHXfcsYgyJ/v+wZuDDS3EUCsdxNA0Hr0ghuR9UWjtpjyPiKF/93tdWYSOpQxiqBVtSJwghvr/WlomhZYyeU7x0rYKrun4xtjG8tPVLE/LiCGvX/Wj/cUvftHNM8887rzzzus7Gbw8dFX7hT760Y8GR4M8GZ/73Ofc+PHjiwMiyx+zP/3pT077jdZaay0nD1GdVA54LRuqfnEPCarQj6d/r3aDKoSCDahufgoFQgh5anxvUch7ZPEo6f6+B8lqK+ZBWmyxxdxBBx1URAJ85JFH+poaYqH9Yn6yepD860JfuUNfk/1lcqEQ7qGgCqFACCFvkR8IIeTxsXiB1D6/nOU6tUd12GOPPQpvahOex6oYuueee1o8Q5alYO0GINB9/WfXassaVMGvv1XAWMpZ6xp6N1av1TjYZJNN3Pnnnx8NXmH1FvnvTWsAgna9LZbrxMFyhlCoru0GaIgFl1BAmeWWW44ACnV+wDMvy4Q8XQfH2Mby09UsT8uIoUC/akmOJmArrrhiIWAUTOHCCy8sNnQryEKZNBl64oknipDZc845Z/FnnUF07LHHuuWXX96tscYaRTQ5LfPRsiBFqZtrrrlqjSTEUCuu0NI5xNBURjmKIT03Woq23377NeJ5RAy15xlCDE17jyGGav0ERgtbJoWWMtEbUaAfAbimGxQxtrH8dDXL0zJiaIB+veqqq9zJJ59cTMQU1nrSpEnuG9/4RsvXujIogtavSzgp6UdfX7DPOecc97e//c3pK7xCbO++++6FnboJMYQYEoFe9QxJDCl6lfbaNeF5RAwhhso3kkXUWMrIXqgcniHbr6VlUmgpY7sbpaoE4JpuPMTYxvLT1SxPy4ihhvcrYggxhBhq5iGPLJOb+myyTG7aO8oSQMEqkBBDth9ny6TQUsZ2N0ohhoZnDMTGbCx/eGqZz10QQw3vy3LAKxpXdQ9HKLqYv4ck5E2wrqP3I0uF9r+E9slY9xb50d1CUejajUzXbhQ6DYXqPbU37L/+67/cEUcc0XLoaigynfVQV/+w0dAhuKE9HqFh6k+qQvvI/DEhO6HldKFIdP7eImsUulDUOf9vlv1Hip6o8NpNPdfk3nvvbdkzFOojy0GplutCosMSvU7XWceTL2qs9i1iyNrGWDktM544cWJxXtsLL7ww6Nvb+q6zlLMKGN+Wdf9RqCGWvT9W++22sXqd9gwts8wyjX0eB3tPMHFMM9GBaxqushpjG8tPV7M8LSOGGt6viKHWDrIEVUAMTWOGGOr8A14+k4ihqWwRQ9PGGGKo889bzKJlUmgpE7sP+f0JwDXdqIixjeWnq1melhFDDe9XxBBiaKAhimeoOw8vYqiVO2IIMdSdJ3HqXS2TQkuZbrZhpN4brul6LsY2lp+uZnlaRgw1vF8RQ4ghxFAz9wzhGcIz5D+beIaG/wfVMim0lBn+mo/8O8I1XR/G2Mby09UsT8uIoYb3K2IIMYQYQgxpDLS7p4c9Q4O/5NvdTxPaR4QYGv4fVMuk0FJm+Gs+8u8I13R9GGMby09XszwtI4Ya3q/lgJ9xxhlddYN8aMO7f8BmKMiC7PgpFGjBLxPaTO0HWdA1foAA/S0UaMEPOBA6rDUUqCAUVMHfI2Qpo3qF9hZV9yTp4F0dljt58mT31FNP9SEJ7VsK1TX0Nz/AxJtvvtmvP0IMQ6xDy5N8Y6FN2KFAC6Gx4o+n0JjzD2bV/S2BFkJBFvygCgqeoPO6mhxAQeeMDTWFni2LTet11nL+PS3jy1LPgcq0U68xY8a4lVde2d14443u5ZdfHsrt+661iKF2b2Q5CHsg25Z6WcoMxX712gUXXJAACu0OhEyvY0KermNjbGP56WqWp2XEUMP7FTHU2kEWoWMpgxhq5YoYsr8IqnuGEEN2bn5JxNDg7CxCx1IGMWTbV9T+SO7dK5mQp+v7GNtYfrqa5WkZMdTwfkUMIYZEAM/QbI15UhFDnekKxBBiqBMjyTIptJTpRF16zQZc0/V4jG0sP13N8rSMGGp4vyKGEEOIoebuGcIz1P4LFDGEGGp/9Ey70jIptJTpRF16zQZc0/V4jG0sP13N8rSMGGp4vyKGEEOIIcRQ6DVlFRPWcv492DM09B8H9gwNnWHMgmVSaCkTuw/5/QnANd2oiLGN5aerWZ6WEUMN79dywGuj/TvvvNNX29Am9Q9+8IMtrbEEWdAFoYM5/U32oY34IXShCVS13uU1fpCAUCABP8iCrrUEKgjtGbIc1ir71aAK2tD/+c9/3l155ZUtp91b7YfK+YEiQoEjQu0OBaF4++23W7ogtJQuNBEO7TMI9a8fbGOWWWbp1+V+kAUV8Meh/uYHWgiNXz+owtJLL+1WX331xgZQuP/++13VM9Tu/o12r7NOtEP2rX/zO7yT11lfvdV7ahxNmDDB3X333cF3QdVmuyLQel2onOVa63UWW0MRrBb7VZ5jx45148ePb+zzOFigFSaO1qetXjm41uNVp3SMbSy/zr0o6xxiqOGjADHU2kGIoWk8EEPdeXjLZxIxNJW/RcxZygzUm4ihgcc5YsgWHIGJY5p3JVzTcJXVGNtYfrqa5WkZMdTwfkUMIYZEAM9Q8wIoIIYQQ/7Ph8Xbgmeosz+6lkmhpUxna9Ub1uCarp9jbGP56WqWp2XEUMP7FTGEGEIMNXPPEGIIMYQY6v4PqGVSaCnT/ZaMvBrANV2fxdjG8tPVLE/LiKGG9ytiCDGEGEIMhV5T7Bn656Bvb4uXJmTAep3Vw2MRTO3aYplcfDmR+DNxTDPRgWsarpYxC/vOskcMdZZnx62VA/7pp5921Q35/mZz3Xj06NEt9/c3rSsztLk9FGjB3ywfCrIw/fTT92uvdYL23nvvtVwbCrIQWhr2xhtv9LunGFVTKCjBq6++2u+6UFCF6t9GjRrlFl98cXfnnXe66vXVIAulUWuABj+ogiXIQvli9Bvgs7AspZMNn/1Ag9bf5+EH1dB1fpAF/S0UaEEsqyk05vzx++lPf9ptvPHGjd2wLc/QU0891des0Nj3GYb2zliu0038cu1eF7JltR+6p6UeljKqQ2xvkcbWIoss4h5//HEXCroSewFbREdIYISuC5Xz/2Ypozpby/n1aPe60D1jbBZYYAG31FJLNfZ5JIBCbPR3Pp8JeeeZlhZjbGP56WqWp2XEUMP7FTHU2kGIoWk8EEPdeXirARQQQ/1FWkjUIIamjVWrgLGIMqsti5hDDHXnfTKS78qEPF3vxdjG8tPVLE/LiKGG9ytiCDEkAr73S39DDHXn4UUMtXK3CB1LGTxDrVwRQ7bn2zIptJSx3Y1SVQJwTTceYmxj+elqlqdlxFDD+xUxhBhCDDV3zxCeITxD1TcUy+SG/wfVMim0lBn+mo/8O8I1XR/G2Mby09UsT8uIoYb3a/Ur9JNPPtlX29CeoTFjxrS0xt+DoczQ3yyHZIYO15x55pn70bPuLfL3BoSWaIT2tvhn66gC/l6Z0KGlIc9K6Myi6h4e7YkSL014q/cYyp4h/9rQXqPQPqLQ3/w2hdoY2lcR2lsU2rNl2Zwd+uIf2lvkj5XQviJ/H9Eqq6zivvGNbzR2j8KDDz7otJevTJb9QNY9N6Fy/sG4oYNyO/m3odiy7G9qx1uksTXnnHO6l156qeUQ6tBrPLbsq7ymXQETej/5f7OUUT3aLWe9zrKcLlZm/vnnd+PGjWvs88ieoeGfzDAhT8c8xjaWn65meVpGDDW8XxFDrR2EGJrGAzHUnYe3fCYRQ1P5h0QTYmgqG6tYabec9bqY0FFdY2UQQ9153zT5rkzI0/VOjG0sP13N8rSMGGp4vyKGEEMigGeoeYeuIoYQQ/7PB56h4f9BtUwKLWWGv+Yj/45wTdeHMbax/HQ1y9MyYqjh/YoYQgwhhpq5ZwgxhBhCDHX/B9QyKbSU6X5LRl4N4Jquz2JsY/npapanZcRQw/sVMYQYQgwhhjQG2DPkHHuGWs9nY5mc7UBVJo5pJjpwTcNVVmNsY/npapanZcRQw/u1HPA33XSTe+ihh/pq++EPf7hfzf2/hcqEAi+E/jbHHHO02A8d4OofpKkLQn8LBVrwN9mHDnANdU1oU7S/+T+0rygUSCAUaKF6YKvW0L/77rvurbfeallPbw1wYDmINRSMIfQ3yz1YNgr4AAAgAElEQVQtS+nENNTuEB+fYyjIQqg/Qv3mT+RDh7X642SNNdZwu+++e2M3bOt5fOaZZ/qaawmOYAmMEBI++pv/jISeGWvQgxB/i31rwAyLcLPwUrurgSl0jYK0+M+k9V0R2xcjO1aBYQk6oveHn0J/C72zLPWw2rfYirGZd9553ZJLLtnY55EACsM/mWFCno55jG0sP13N8rSMGGp4vyKGWjsIMTSNhy9+EEPD8zCXzyRiaCrvUPRAxNBUNlaxghhq/9m1TAotZdqvQe9eCdd0fR9jG8tPV7M8LSOGGt6viCHEkAjgGWpeAAXEEGLI//nwvSuIofQ/sJZJoaVM+prmdwe4puvTGNtYfrqa5WkZMdTwfkUMIYYQQ83cM4QYQgwhhrr/A2qZFFrKdL8lI68GcE3XZzG2sfx0NcvTMmKo4f2KGEIMIYYQQxoDlj097Bma9r4ILamN7YvR1Zb9NSrHnqFm/HhaJoWWMs1ozciqBVzT9VeMbSw/Xc3ytIwYani/lgP+0ksvdX/4wx/6amsJhBAqM2bMmH4ttgRaGD16dL/r/CALKvDBD36wX7nZZuu/xGmWWWZpKWcJsqALQpuu/RuGJjyhiYs2YfvpjTfe6PuT8nXSvepfnYj+85//7Hdd6G+hpW1+UAVrAIVQOd9WKGDDq6++aqprNXBEeUGVhf5mCbIw0GTSn5hWN8WX9/Mn+xMnTnT77LNPYzdsyzP07LPP9vG1BEewipVQcASLGApdF9rTE/qbf62ljBofKuezsAZ7CDGsjpXqOAqNoepgt4ohX/yElrZZ3yn+taH3Tsh+qJzlWusyvFC5umciKYCCghQMFqigGz+nlkmhpUw36j7S7wnXdD0YYxvLT1ezPC0jhhrer4ih1g5CDE3jgRjqzsNbDaCAGEIMVUchYmj4n0nLpNBSZvhrPvLvCNd0fRhjG8tPV7M8LSOGGt6viCHEkAjgGWpmAAXEEGIIMdTdH1HLpNBSprutGJl3h2u6fouxjeWnq1melhFDA/Srzg856qij3G233VasDV9ppZWKJTvzzz//oCPhX//6lzvuuOPcL37xC6cv9+PGjXO77bab+9SnPtXWCEIMIYYQQ0s4LUNswvOovsAz1PpMskxuGo8cPENaMnvrrbe6p59+utg/pd+8T3/6027xxRcfdJmc9bdPNidPnuwuuugi9/zzz7uFF17Y7bjjju4rX/nKkH4jOWeoLXxDuogJ+ZDwDXpxjG0sP13N8rSMGAr0q/Z6TJo0yWnPxJZbblnsFznttNOcDiq87LLLXGj/TGlml112cTfeeKPbYost3EILLVS88P/85z+7M888002YMKH2KEIMIYZ6XQzNM888buutt27E84gYmr7fOwwxlI8YkqC55JJLig+A48ePLxp2//33F3s19du2zDLLDLhnyPrbd9hhh7kzzjjDrb/++u4Tn/iEu/rqq93tt9/ujjnmGKeDlusmy6TQUqbufSk/7cNQ0/aR5dA3sTEby8+BwXC2ATEUoH3ssce6k08+2SlogU7cVnr44Yfdeuut57bffnu3++67B/tIX9O22WYbd8ABBxQiSun11193a6+9tptrrrnc+eefX7tvywF/+umnu5tuuqnv+lDwAl+khURbKFiC5W+WgA2qXOies88+e792+4EWRo0a1a+MH2RBBXT6vJ/8yVhsY3V5fShqVPXwQ4nhKVOmuPnmm89VAzyoT/0U+lsoKIHloNRQIARLoAXLUjrVOxTYwRJoQWPRT36QBeWHAlP4h0qG2Pu29bztv//+7vrrry8+RjTheVQdy2dS74RuLpMbSoADS1AFq/12gz2E9v/F/qZABho7CkQR2z9oiRyn/mz3bCBL8AJrYARruXY9T9YAChIld999t9twww3dnHPOWbB++eWXC4H02c9+1u20005BMWT97dP79Ktf/WrxcUMrLZRUt80228y98MILxbMeCjIy2A+nZVJoKVP7x5kL+t6FiKHOD4bYmI3ld75GeVtEDAX6d9VVV3X6Gn322We35G611VZOy+euu+664KjYb7/93JVXXllEfatOno8//vhi6Zw8RppY10mIoVZaiKFpPHzxk6sY+va3v108N014HhFD/T1DiKFpz6RFrFiFjyWanKVMKTj8351QNDk9Y4qeue666xbFyzL6XVM0yRNOOCEohqy/fbr+xz/+cfEbOnbs2L4qacXF3nvv7c455xy3/PLL1/mJNE3ImTjWQmouDFczqtoFY2xj+bVv2OMXIIa8AaAv5CussILbdttt+75clUWOPPJId+qpp7o77rjDhTwz66yzTrGk7uc//3mLVXl0dthhBydRtNpqq9UacoghxJAI9KpnaNdddy28sU15HhFDiKHyjZSbZ0jebf2+aenaZz7zmRYxJM/Pfffd537605+65ZZbrhBM1WT97ZNn6a677ip+Q6tJS8nXWmstt++++xarK+oky6TQUqbOPSk7lQBc042EGNtYfrqa5WkZMeT166OPPlosa5MLXxOwatJStcMPP9xdfvnlfcvnqvkrrriiW3bZZd1JJ53Uct2DDz5YLLHT1zMtD6iTEEOIoV4WQ/LG6otxU55HxBBiKFcxpGVqF1xwQREsSHuDlErPkISQBJF+/1ZfffV+Ysj626d9QvJmydNUTeVHSP0+6neyTrJMCi1l6tyTsoih1GMgNmZj+anrl5t9xJDXo/fcc4/bZJNN3MEHH+w23XTTltzzzjuv+Lv+HQqG8PGPf7zw/GgjaDU9/vjjxcZQ7TVS1Jw6qRzwik6nupUptMfG34cTOuw0tH/H8rfQYarWv80666z9muz/rd39QTLsL9Ox7hmKHaSozcTPPfdcsXZewTPKFDp8VGX9FNpP4+8jCu3DCe01shz0GioTshW6Z+hv/j4oa7sty4BC7H1+n//854uJmZ65pjyPVTH0t7/9rTiUt0yx/S4qZzmYVeUsh7NaDzK1LGML3XMo9v36h9oTek4th65q7Khc7Dm3HrrqlwvtZwv9zbIPx1JG7C1eJpWzHBBrrb9f7sknnyyWokrs6KOeUvmc3nvvve7aa68tnkN9LPR/W6y/fV/+8peLVRUXXnhhy+OufYZLL72022ijjdyhhx5a5yeyzzux4IILutDviIzp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itG6hqtd14bYhu7b1SxOz0SG4uxXWgUBCEAAAhCInoBmUqixiR6UQQPhagCVyJAdVCJDFWFLoRCAAAQgAIEmQ2DRokVu2rRpbuXKlW7bbbd1Q4YMcaNHj3abb755UW0YOXKk++EPf+iuueaaWs8NHDjQrVixotbnv/zlL91vfvObosoRY82EXGNTdME8oGIPpoYRCI3Z0P2GlVq9TxEZqt6+p+UQgAAEIACBhMDChQvd6aef7nr27OkGDBjg3nzzTXf//fe74447zl100UVqSjfccIO7+eabnYietBj6/vvvXbdu3dwvfvEL17dv3wKf7du3d/vss4+6nJyhZlKosSm6YB5ADBmOgdCYDd03rFqUrhFDUXYrjYIABCAAAQjoCKxbt87179/ftWnTxt1zzz01kaCrr77a3X777W7+/Plu9913r9fZd99956644gp37733JnY+MfTOO++4Qw45xF133XXJv6W4NJNCjU0p6lJtPuBq1+MhtqH7djWL0zNiKM5+pVUQgAAEIAABFYGXXnrJDR06NBEzRx55ZM0zq1atcgceeKA744wz3NixY+v09fHHH7tjjz3Wif2oUaPcb3/7W68YevTRR9348ePdvHnzXOfOnVV1CxlpJoUam1A53K9NAK52oyLENnTfrmZxekYMxdmvtAoCEIAABCCgIiDRnyuvvNI9/PDDbo899ih4Zt9993Xdu3d3t9xyS52+ZEndueee6y644AK33377JT58kSFZQnfrrbe6V155xTVv3tx98803bquttlLVsS4jzaRQY9OoSlTpw3C16/gQ29B9u5rF6RkxFGe/0ioIQAACEICAioAsh5sxY4ZbsmSJ22abbQqeGTRokNtss83c3Llz6/S1du3aZGndPyYUiU1dYui0005zL774YhJteuKJJ9zXX3/tdt55Zzdu3Dh36KGHquqaNtJMCjU2DSq8yh+Cq90ACLEN3berWZyeEUNx9iutggAEIACBKifw4Ycf1kugVatWifiZPHmyu++++9yrr77qWrRoUfDM0Ucf7VavXp2IF+1VlxiSjHHvv/++k39FZH3xxRfuzjvvdMuXL6+1RE9bVm5S2KFDB9eyZUvvYxKB+uCDD1x9NtrysNtEAK52oyHENndf3jV5j7kaRwAx1Dh+PA0BCEAAAhDIJIH0krd0JYcPH+4mTpzoJk2alGSOe+21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\" width=\"640.1666666666666\">" |
|
], |
|
"text/plain": [ |
|
"<IPython.core.display.HTML object>" |
|
] |
|
}, |
|
"metadata": {}, |
|
"output_type": "display_data" |
|
}, |
|
{ |
|
"data": { |
|
"application/vnd.jupyter.widget-view+json": { |
|
"model_id": "26092ac79aa740f5b1207f63c07ed12a", |
|
"version_major": 2, |
|
"version_minor": 0 |
|
}, |
|
"text/plain": [ |
|
"interactive(children=(FloatSlider(value=6.0, description='k', max=10.0, step=0.2), FloatSlider(value=90.0, des…" |
|
] |
|
}, |
|
"metadata": {}, |
|
"output_type": "display_data" |
|
} |
|
], |
|
"source": [ |
|
"fig, ax = plt.subplots(1, 3)\n", |
|
"img_gr = plot_gratings(ax[0], defaults[k], 90, 0, 0, 0)\n", |
|
"img_rf = plot_receptive_field(ax[1], defaults[k], 90, 90, defaults[sigma])\n", |
|
"val = get_value()\n", |
|
"line = ax[2].plot([val, val])[0]\n", |
|
"ax[2].set(ylim=[-0.2, 0.2])\n", |
|
"\n", |
|
"@widgets.interact(\n", |
|
" k_val=widgets.FloatSlider(min=0, max=10, step=0.2, value=defaults[k], description='k'),\n", |
|
" phi_val=widgets.FloatSlider(min=0, max=360, step=10, value=90, description='phi'),\n", |
|
" theta_val=widgets.FloatSlider(min=0, max=180, step=10, value=0, description='theta'),\n", |
|
" x0_val=widgets.FloatSlider(min=-1, max=1, step=0.05, value=0, description='x0'),\n", |
|
" y0_val=widgets.FloatSlider(min=-1, max=1, step=0.05, value=0, description='y0'),\n", |
|
" sigma_val=widgets.FloatSlider(min=0, max=1, step=0.05, value=defaults[sigma], description='sigma'),\n", |
|
")\n", |
|
"def plot_stuff(k_val, phi_val, theta_val, x0_val, y0_val, sigma_val):\n", |
|
" plot_gratings(img_gr, k_val, phi_val, theta_val, x0_val, y0_val)\n", |
|
" plot_receptive_field(img_rf, k_val, phi_val, theta_val, sigma_val)\n", |
|
" val = get_value(k_val, phi_val, theta_val, x0_val, y0_val, sigma_val)\n", |
|
" line.set_ydata([val, val])\n", |
|
" fig.canvas.draw_idle()" |
|
] |
|
}, |
|
{ |
|
"cell_type": "code", |
|
"execution_count": 16, |
|
"metadata": { |
|
"pycharm": { |
|
"name": "#%%\n" |
|
} |
|
}, |
|
"outputs": [ |
|
{ |
|
"data": { |
|
"application/javascript": [ |
|
"/* Put everything inside the global mpl namespace */\n", |
|
"/* global mpl */\n", |
|
"window.mpl = {};\n", |
|
"\n", |
|
"mpl.get_websocket_type = function () {\n", |
|
" if (typeof WebSocket !== 'undefined') {\n", |
|
" return WebSocket;\n", |
|
" } else if (typeof MozWebSocket !== 'undefined') {\n", |
|
" return MozWebSocket;\n", |
|
" } else {\n", |
|
" alert(\n", |
|
" 'Your browser does not have WebSocket support. ' +\n", |
|
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", |
|
" 'Firefox 4 and 5 are also supported but you ' +\n", |
|
" 'have to enable WebSockets in about:config.'\n", |
|
" );\n", |
|
" }\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n", |
|
" this.id = figure_id;\n", |
|
"\n", |
|
" this.ws = websocket;\n", |
|
"\n", |
|
" this.supports_binary = this.ws.binaryType !== undefined;\n", |
|
"\n", |
|
" if (!this.supports_binary) {\n", |
|
" var warnings = document.getElementById('mpl-warnings');\n", |
|
" if (warnings) {\n", |
|
" warnings.style.display = 'block';\n", |
|
" warnings.textContent =\n", |
|
" 'This browser does not support binary websocket messages. ' +\n", |
|
" 'Performance may be slow.';\n", |
|
" }\n", |
|
" }\n", |
|
"\n", |
|
" this.imageObj = new Image();\n", |
|
"\n", |
|
" this.context = undefined;\n", |
|
" this.message = undefined;\n", |
|
" this.canvas = undefined;\n", |
|
" this.rubberband_canvas = undefined;\n", |
|
" this.rubberband_context = undefined;\n", |
|
" this.format_dropdown = undefined;\n", |
|
"\n", |
|
" this.image_mode = 'full';\n", |
|
"\n", |
|
" this.root = document.createElement('div');\n", |
|
" this.root.setAttribute('style', 'display: inline-block');\n", |
|
" this._root_extra_style(this.root);\n", |
|
"\n", |
|
" parent_element.appendChild(this.root);\n", |
|
"\n", |
|
" this._init_header(this);\n", |
|
" this._init_canvas(this);\n", |
|
" this._init_toolbar(this);\n", |
|
"\n", |
|
" var fig = this;\n", |
|
"\n", |
|
" this.waiting = false;\n", |
|
"\n", |
|
" this.ws.onopen = function () {\n", |
|
" fig.send_message('supports_binary', { value: fig.supports_binary });\n", |
|
" fig.send_message('send_image_mode', {});\n", |
|
" if (fig.ratio !== 1) {\n", |
|
" fig.send_message('set_device_pixel_ratio', {\n", |
|
" device_pixel_ratio: fig.ratio,\n", |
|
" });\n", |
|
" }\n", |
|
" fig.send_message('refresh', {});\n", |
|
" };\n", |
|
"\n", |
|
" this.imageObj.onload = function () {\n", |
|
" if (fig.image_mode === 'full') {\n", |
|
" // Full images could contain transparency (where diff images\n", |
|
" // almost always do), so we need to clear the canvas so that\n", |
|
" // there is no ghosting.\n", |
|
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", |
|
" }\n", |
|
" fig.context.drawImage(fig.imageObj, 0, 0);\n", |
|
" };\n", |
|
"\n", |
|
" this.imageObj.onunload = function () {\n", |
|
" fig.ws.close();\n", |
|
" };\n", |
|
"\n", |
|
" this.ws.onmessage = this._make_on_message_function(this);\n", |
|
"\n", |
|
" this.ondownload = ondownload;\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype._init_header = function () {\n", |
|
" var titlebar = document.createElement('div');\n", |
|
" titlebar.classList =\n", |
|
" 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n", |
|
" var titletext = document.createElement('div');\n", |
|
" titletext.classList = 'ui-dialog-title';\n", |
|
" titletext.setAttribute(\n", |
|
" 'style',\n", |
|
" 'width: 100%; text-align: center; padding: 3px;'\n", |
|
" );\n", |
|
" titlebar.appendChild(titletext);\n", |
|
" this.root.appendChild(titlebar);\n", |
|
" this.header = titletext;\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n", |
|
"\n", |
|
"mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n", |
|
"\n", |
|
"mpl.figure.prototype._init_canvas = function () {\n", |
|
" var fig = this;\n", |
|
"\n", |
|
" var canvas_div = (this.canvas_div = document.createElement('div'));\n", |
|
" canvas_div.setAttribute(\n", |
|
" 'style',\n", |
|
" 'border: 1px solid #ddd;' +\n", |
|
" 'box-sizing: content-box;' +\n", |
|
" 'clear: both;' +\n", |
|
" 'min-height: 1px;' +\n", |
|
" 'min-width: 1px;' +\n", |
|
" 'outline: 0;' +\n", |
|
" 'overflow: hidden;' +\n", |
|
" 'position: relative;' +\n", |
|
" 'resize: both;'\n", |
|
" );\n", |
|
"\n", |
|
" function on_keyboard_event_closure(name) {\n", |
|
" return function (event) {\n", |
|
" return fig.key_event(event, name);\n", |
|
" };\n", |
|
" }\n", |
|
"\n", |
|
" canvas_div.addEventListener(\n", |
|
" 'keydown',\n", |
|
" on_keyboard_event_closure('key_press')\n", |
|
" );\n", |
|
" canvas_div.addEventListener(\n", |
|
" 'keyup',\n", |
|
" on_keyboard_event_closure('key_release')\n", |
|
" );\n", |
|
"\n", |
|
" this._canvas_extra_style(canvas_div);\n", |
|
" this.root.appendChild(canvas_div);\n", |
|
"\n", |
|
" var canvas = (this.canvas = document.createElement('canvas'));\n", |
|
" canvas.classList.add('mpl-canvas');\n", |
|
" canvas.setAttribute('style', 'box-sizing: content-box;');\n", |
|
"\n", |
|
" this.context = canvas.getContext('2d');\n", |
|
"\n", |
|
" var backingStore =\n", |
|
" this.context.backingStorePixelRatio ||\n", |
|
" this.context.webkitBackingStorePixelRatio ||\n", |
|
" this.context.mozBackingStorePixelRatio ||\n", |
|
" this.context.msBackingStorePixelRatio ||\n", |
|
" this.context.oBackingStorePixelRatio ||\n", |
|
" this.context.backingStorePixelRatio ||\n", |
|
" 1;\n", |
|
"\n", |
|
" this.ratio = (window.devicePixelRatio || 1) / backingStore;\n", |
|
"\n", |
|
" var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n", |
|
" 'canvas'\n", |
|
" ));\n", |
|
" rubberband_canvas.setAttribute(\n", |
|
" 'style',\n", |
|
" 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n", |
|
" );\n", |
|
"\n", |
|
" // Apply a ponyfill if ResizeObserver is not implemented by browser.\n", |
|
" if (this.ResizeObserver === undefined) {\n", |
|
" if (window.ResizeObserver !== undefined) {\n", |
|
" this.ResizeObserver = window.ResizeObserver;\n", |
|
" } else {\n", |
|
" var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n", |
|
" this.ResizeObserver = obs.ResizeObserver;\n", |
|
" }\n", |
|
" }\n", |
|
"\n", |
|
" this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n", |
|
" var nentries = entries.length;\n", |
|
" for (var i = 0; i < nentries; i++) {\n", |
|
" var entry = entries[i];\n", |
|
" var width, height;\n", |
|
" if (entry.contentBoxSize) {\n", |
|
" if (entry.contentBoxSize instanceof Array) {\n", |
|
" // Chrome 84 implements new version of spec.\n", |
|
" width = entry.contentBoxSize[0].inlineSize;\n", |
|
" height = entry.contentBoxSize[0].blockSize;\n", |
|
" } else {\n", |
|
" // Firefox implements old version of spec.\n", |
|
" width = entry.contentBoxSize.inlineSize;\n", |
|
" height = entry.contentBoxSize.blockSize;\n", |
|
" }\n", |
|
" } else {\n", |
|
" // Chrome <84 implements even older version of spec.\n", |
|
" width = entry.contentRect.width;\n", |
|
" height = entry.contentRect.height;\n", |
|
" }\n", |
|
"\n", |
|
" // Keep the size of the canvas and rubber band canvas in sync with\n", |
|
" // the canvas container.\n", |
|
" if (entry.devicePixelContentBoxSize) {\n", |
|
" // Chrome 84 implements new version of spec.\n", |
|
" canvas.setAttribute(\n", |
|
" 'width',\n", |
|
" entry.devicePixelContentBoxSize[0].inlineSize\n", |
|
" );\n", |
|
" canvas.setAttribute(\n", |
|
" 'height',\n", |
|
" entry.devicePixelContentBoxSize[0].blockSize\n", |
|
" );\n", |
|
" } else {\n", |
|
" canvas.setAttribute('width', width * fig.ratio);\n", |
|
" canvas.setAttribute('height', height * fig.ratio);\n", |
|
" }\n", |
|
" canvas.setAttribute(\n", |
|
" 'style',\n", |
|
" 'width: ' + width + 'px; height: ' + height + 'px;'\n", |
|
" );\n", |
|
"\n", |
|
" rubberband_canvas.setAttribute('width', width);\n", |
|
" rubberband_canvas.setAttribute('height', height);\n", |
|
"\n", |
|
" // And update the size in Python. We ignore the initial 0/0 size\n", |
|
" // that occurs as the element is placed into the DOM, which should\n", |
|
" // otherwise not happen due to the minimum size styling.\n", |
|
" if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n", |
|
" fig.request_resize(width, height);\n", |
|
" }\n", |
|
" }\n", |
|
" });\n", |
|
" this.resizeObserverInstance.observe(canvas_div);\n", |
|
"\n", |
|
" function on_mouse_event_closure(name) {\n", |
|
" return function (event) {\n", |
|
" return fig.mouse_event(event, name);\n", |
|
" };\n", |
|
" }\n", |
|
"\n", |
|
" rubberband_canvas.addEventListener(\n", |
|
" 'mousedown',\n", |
|
" on_mouse_event_closure('button_press')\n", |
|
" );\n", |
|
" rubberband_canvas.addEventListener(\n", |
|
" 'mouseup',\n", |
|
" on_mouse_event_closure('button_release')\n", |
|
" );\n", |
|
" rubberband_canvas.addEventListener(\n", |
|
" 'dblclick',\n", |
|
" on_mouse_event_closure('dblclick')\n", |
|
" );\n", |
|
" // Throttle sequential mouse events to 1 every 20ms.\n", |
|
" rubberband_canvas.addEventListener(\n", |
|
" 'mousemove',\n", |
|
" on_mouse_event_closure('motion_notify')\n", |
|
" );\n", |
|
"\n", |
|
" rubberband_canvas.addEventListener(\n", |
|
" 'mouseenter',\n", |
|
" on_mouse_event_closure('figure_enter')\n", |
|
" );\n", |
|
" rubberband_canvas.addEventListener(\n", |
|
" 'mouseleave',\n", |
|
" on_mouse_event_closure('figure_leave')\n", |
|
" );\n", |
|
"\n", |
|
" canvas_div.addEventListener('wheel', function (event) {\n", |
|
" if (event.deltaY < 0) {\n", |
|
" event.step = 1;\n", |
|
" } else {\n", |
|
" event.step = -1;\n", |
|
" }\n", |
|
" on_mouse_event_closure('scroll')(event);\n", |
|
" });\n", |
|
"\n", |
|
" canvas_div.appendChild(canvas);\n", |
|
" canvas_div.appendChild(rubberband_canvas);\n", |
|
"\n", |
|
" this.rubberband_context = rubberband_canvas.getContext('2d');\n", |
|
" this.rubberband_context.strokeStyle = '#000000';\n", |
|
"\n", |
|
" this._resize_canvas = function (width, height, forward) {\n", |
|
" if (forward) {\n", |
|
" canvas_div.style.width = width + 'px';\n", |
|
" canvas_div.style.height = height + 'px';\n", |
|
" }\n", |
|
" };\n", |
|
"\n", |
|
" // Disable right mouse context menu.\n", |
|
" this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n", |
|
" event.preventDefault();\n", |
|
" return false;\n", |
|
" });\n", |
|
"\n", |
|
" function set_focus() {\n", |
|
" canvas.focus();\n", |
|
" canvas_div.focus();\n", |
|
" }\n", |
|
"\n", |
|
" window.setTimeout(set_focus, 100);\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype._init_toolbar = function () {\n", |
|
" var fig = this;\n", |
|
"\n", |
|
" var toolbar = document.createElement('div');\n", |
|
" toolbar.classList = 'mpl-toolbar';\n", |
|
" this.root.appendChild(toolbar);\n", |
|
"\n", |
|
" function on_click_closure(name) {\n", |
|
" return function (_event) {\n", |
|
" return fig.toolbar_button_onclick(name);\n", |
|
" };\n", |
|
" }\n", |
|
"\n", |
|
" function on_mouseover_closure(tooltip) {\n", |
|
" return function (event) {\n", |
|
" if (!event.currentTarget.disabled) {\n", |
|
" return fig.toolbar_button_onmouseover(tooltip);\n", |
|
" }\n", |
|
" };\n", |
|
" }\n", |
|
"\n", |
|
" fig.buttons = {};\n", |
|
" var buttonGroup = document.createElement('div');\n", |
|
" buttonGroup.classList = 'mpl-button-group';\n", |
|
" for (var toolbar_ind in mpl.toolbar_items) {\n", |
|
" var name = mpl.toolbar_items[toolbar_ind][0];\n", |
|
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", |
|
" var image = mpl.toolbar_items[toolbar_ind][2];\n", |
|
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n", |
|
"\n", |
|
" if (!name) {\n", |
|
" /* Instead of a spacer, we start a new button group. */\n", |
|
" if (buttonGroup.hasChildNodes()) {\n", |
|
" toolbar.appendChild(buttonGroup);\n", |
|
" }\n", |
|
" buttonGroup = document.createElement('div');\n", |
|
" buttonGroup.classList = 'mpl-button-group';\n", |
|
" continue;\n", |
|
" }\n", |
|
"\n", |
|
" var button = (fig.buttons[name] = document.createElement('button'));\n", |
|
" button.classList = 'mpl-widget';\n", |
|
" button.setAttribute('role', 'button');\n", |
|
" button.setAttribute('aria-disabled', 'false');\n", |
|
" button.addEventListener('click', on_click_closure(method_name));\n", |
|
" button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", |
|
"\n", |
|
" var icon_img = document.createElement('img');\n", |
|
" icon_img.src = '_images/' + image + '.png';\n", |
|
" icon_img.srcset = '_images/' + image + '_large.png 2x';\n", |
|
" icon_img.alt = tooltip;\n", |
|
" button.appendChild(icon_img);\n", |
|
"\n", |
|
" buttonGroup.appendChild(button);\n", |
|
" }\n", |
|
"\n", |
|
" if (buttonGroup.hasChildNodes()) {\n", |
|
" toolbar.appendChild(buttonGroup);\n", |
|
" }\n", |
|
"\n", |
|
" var fmt_picker = document.createElement('select');\n", |
|
" fmt_picker.classList = 'mpl-widget';\n", |
|
" toolbar.appendChild(fmt_picker);\n", |
|
" this.format_dropdown = fmt_picker;\n", |
|
"\n", |
|
" for (var ind in mpl.extensions) {\n", |
|
" var fmt = mpl.extensions[ind];\n", |
|
" var option = document.createElement('option');\n", |
|
" option.selected = fmt === mpl.default_extension;\n", |
|
" option.innerHTML = fmt;\n", |
|
" fmt_picker.appendChild(option);\n", |
|
" }\n", |
|
"\n", |
|
" var status_bar = document.createElement('span');\n", |
|
" status_bar.classList = 'mpl-message';\n", |
|
" toolbar.appendChild(status_bar);\n", |
|
" this.message = status_bar;\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n", |
|
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", |
|
" // which will in turn request a refresh of the image.\n", |
|
" this.send_message('resize', { width: x_pixels, height: y_pixels });\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype.send_message = function (type, properties) {\n", |
|
" properties['type'] = type;\n", |
|
" properties['figure_id'] = this.id;\n", |
|
" this.ws.send(JSON.stringify(properties));\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype.send_draw_message = function () {\n", |
|
" if (!this.waiting) {\n", |
|
" this.waiting = true;\n", |
|
" this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n", |
|
" }\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype.handle_save = function (fig, _msg) {\n", |
|
" var format_dropdown = fig.format_dropdown;\n", |
|
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", |
|
" fig.ondownload(fig, format);\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype.handle_resize = function (fig, msg) {\n", |
|
" var size = msg['size'];\n", |
|
" if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n", |
|
" fig._resize_canvas(size[0], size[1], msg['forward']);\n", |
|
" fig.send_message('refresh', {});\n", |
|
" }\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n", |
|
" var x0 = msg['x0'] / fig.ratio;\n", |
|
" var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n", |
|
" var x1 = msg['x1'] / fig.ratio;\n", |
|
" var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n", |
|
" x0 = Math.floor(x0) + 0.5;\n", |
|
" y0 = Math.floor(y0) + 0.5;\n", |
|
" x1 = Math.floor(x1) + 0.5;\n", |
|
" y1 = Math.floor(y1) + 0.5;\n", |
|
" var min_x = Math.min(x0, x1);\n", |
|
" var min_y = Math.min(y0, y1);\n", |
|
" var width = Math.abs(x1 - x0);\n", |
|
" var height = Math.abs(y1 - y0);\n", |
|
"\n", |
|
" fig.rubberband_context.clearRect(\n", |
|
" 0,\n", |
|
" 0,\n", |
|
" fig.canvas.width / fig.ratio,\n", |
|
" fig.canvas.height / fig.ratio\n", |
|
" );\n", |
|
"\n", |
|
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n", |
|
" // Updates the figure title.\n", |
|
" fig.header.textContent = msg['label'];\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype.handle_cursor = function (fig, msg) {\n", |
|
" fig.rubberband_canvas.style.cursor = msg['cursor'];\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype.handle_message = function (fig, msg) {\n", |
|
" fig.message.textContent = msg['message'];\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype.handle_draw = function (fig, _msg) {\n", |
|
" // Request the server to send over a new figure.\n", |
|
" fig.send_draw_message();\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n", |
|
" fig.image_mode = msg['mode'];\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n", |
|
" for (var key in msg) {\n", |
|
" if (!(key in fig.buttons)) {\n", |
|
" continue;\n", |
|
" }\n", |
|
" fig.buttons[key].disabled = !msg[key];\n", |
|
" fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n", |
|
" }\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n", |
|
" if (msg['mode'] === 'PAN') {\n", |
|
" fig.buttons['Pan'].classList.add('active');\n", |
|
" fig.buttons['Zoom'].classList.remove('active');\n", |
|
" } else if (msg['mode'] === 'ZOOM') {\n", |
|
" fig.buttons['Pan'].classList.remove('active');\n", |
|
" fig.buttons['Zoom'].classList.add('active');\n", |
|
" } else {\n", |
|
" fig.buttons['Pan'].classList.remove('active');\n", |
|
" fig.buttons['Zoom'].classList.remove('active');\n", |
|
" }\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype.updated_canvas_event = function () {\n", |
|
" // Called whenever the canvas gets updated.\n", |
|
" this.send_message('ack', {});\n", |
|
"};\n", |
|
"\n", |
|
"// A function to construct a web socket function for onmessage handling.\n", |
|
"// Called in the figure constructor.\n", |
|
"mpl.figure.prototype._make_on_message_function = function (fig) {\n", |
|
" return function socket_on_message(evt) {\n", |
|
" if (evt.data instanceof Blob) {\n", |
|
" var img = evt.data;\n", |
|
" if (img.type !== 'image/png') {\n", |
|
" /* FIXME: We get \"Resource interpreted as Image but\n", |
|
" * transferred with MIME type text/plain:\" errors on\n", |
|
" * Chrome. But how to set the MIME type? It doesn't seem\n", |
|
" * to be part of the websocket stream */\n", |
|
" img.type = 'image/png';\n", |
|
" }\n", |
|
"\n", |
|
" /* Free the memory for the previous frames */\n", |
|
" if (fig.imageObj.src) {\n", |
|
" (window.URL || window.webkitURL).revokeObjectURL(\n", |
|
" fig.imageObj.src\n", |
|
" );\n", |
|
" }\n", |
|
"\n", |
|
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", |
|
" img\n", |
|
" );\n", |
|
" fig.updated_canvas_event();\n", |
|
" fig.waiting = false;\n", |
|
" return;\n", |
|
" } else if (\n", |
|
" typeof evt.data === 'string' &&\n", |
|
" evt.data.slice(0, 21) === 'data:image/png;base64'\n", |
|
" ) {\n", |
|
" fig.imageObj.src = evt.data;\n", |
|
" fig.updated_canvas_event();\n", |
|
" fig.waiting = false;\n", |
|
" return;\n", |
|
" }\n", |
|
"\n", |
|
" var msg = JSON.parse(evt.data);\n", |
|
" var msg_type = msg['type'];\n", |
|
"\n", |
|
" // Call the \"handle_{type}\" callback, which takes\n", |
|
" // the figure and JSON message as its only arguments.\n", |
|
" try {\n", |
|
" var callback = fig['handle_' + msg_type];\n", |
|
" } catch (e) {\n", |
|
" console.log(\n", |
|
" \"No handler for the '\" + msg_type + \"' message type: \",\n", |
|
" msg\n", |
|
" );\n", |
|
" return;\n", |
|
" }\n", |
|
"\n", |
|
" if (callback) {\n", |
|
" try {\n", |
|
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", |
|
" callback(fig, msg);\n", |
|
" } catch (e) {\n", |
|
" console.log(\n", |
|
" \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n", |
|
" e,\n", |
|
" e.stack,\n", |
|
" msg\n", |
|
" );\n", |
|
" }\n", |
|
" }\n", |
|
" };\n", |
|
"};\n", |
|
"\n", |
|
"// from https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", |
|
"mpl.findpos = function (e) {\n", |
|
" //this section is from http://www.quirksmode.org/js/events_properties.html\n", |
|
" var targ;\n", |
|
" if (!e) {\n", |
|
" e = window.event;\n", |
|
" }\n", |
|
" if (e.target) {\n", |
|
" targ = e.target;\n", |
|
" } else if (e.srcElement) {\n", |
|
" targ = e.srcElement;\n", |
|
" }\n", |
|
" if (targ.nodeType === 3) {\n", |
|
" // defeat Safari bug\n", |
|
" targ = targ.parentNode;\n", |
|
" }\n", |
|
"\n", |
|
" // pageX,Y are the mouse positions relative to the document\n", |
|
" var boundingRect = targ.getBoundingClientRect();\n", |
|
" var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n", |
|
" var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n", |
|
"\n", |
|
" return { x: x, y: y };\n", |
|
"};\n", |
|
"\n", |
|
"/*\n", |
|
" * return a copy of an object with only non-object keys\n", |
|
" * we need this to avoid circular references\n", |
|
" * https://stackoverflow.com/a/24161582/3208463\n", |
|
" */\n", |
|
"function simpleKeys(original) {\n", |
|
" return Object.keys(original).reduce(function (obj, key) {\n", |
|
" if (typeof original[key] !== 'object') {\n", |
|
" obj[key] = original[key];\n", |
|
" }\n", |
|
" return obj;\n", |
|
" }, {});\n", |
|
"}\n", |
|
"\n", |
|
"mpl.figure.prototype.mouse_event = function (event, name) {\n", |
|
" var canvas_pos = mpl.findpos(event);\n", |
|
"\n", |
|
" if (name === 'button_press') {\n", |
|
" this.canvas.focus();\n", |
|
" this.canvas_div.focus();\n", |
|
" }\n", |
|
"\n", |
|
" var x = canvas_pos.x * this.ratio;\n", |
|
" var y = canvas_pos.y * this.ratio;\n", |
|
"\n", |
|
" this.send_message(name, {\n", |
|
" x: x,\n", |
|
" y: y,\n", |
|
" button: event.button,\n", |
|
" step: event.step,\n", |
|
" guiEvent: simpleKeys(event),\n", |
|
" });\n", |
|
"\n", |
|
" /* This prevents the web browser from automatically changing to\n", |
|
" * the text insertion cursor when the button is pressed. We want\n", |
|
" * to control all of the cursor setting manually through the\n", |
|
" * 'cursor' event from matplotlib */\n", |
|
" event.preventDefault();\n", |
|
" return false;\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype._key_event_extra = function (_event, _name) {\n", |
|
" // Handle any extra behaviour associated with a key event\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype.key_event = function (event, name) {\n", |
|
" // Prevent repeat events\n", |
|
" if (name === 'key_press') {\n", |
|
" if (event.key === this._key) {\n", |
|
" return;\n", |
|
" } else {\n", |
|
" this._key = event.key;\n", |
|
" }\n", |
|
" }\n", |
|
" if (name === 'key_release') {\n", |
|
" this._key = null;\n", |
|
" }\n", |
|
"\n", |
|
" var value = '';\n", |
|
" if (event.ctrlKey && event.key !== 'Control') {\n", |
|
" value += 'ctrl+';\n", |
|
" }\n", |
|
" else if (event.altKey && event.key !== 'Alt') {\n", |
|
" value += 'alt+';\n", |
|
" }\n", |
|
" else if (event.shiftKey && event.key !== 'Shift') {\n", |
|
" value += 'shift+';\n", |
|
" }\n", |
|
"\n", |
|
" value += 'k' + event.key;\n", |
|
"\n", |
|
" this._key_event_extra(event, name);\n", |
|
"\n", |
|
" this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n", |
|
" return false;\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype.toolbar_button_onclick = function (name) {\n", |
|
" if (name === 'download') {\n", |
|
" this.handle_save(this, null);\n", |
|
" } else {\n", |
|
" this.send_message('toolbar_button', { name: name });\n", |
|
" }\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n", |
|
" this.message.textContent = tooltip;\n", |
|
"};\n", |
|
"\n", |
|
"///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n", |
|
"// prettier-ignore\n", |
|
"var _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\n", |
|
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", |
|
"\n", |
|
"mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n", |
|
"\n", |
|
"mpl.default_extension = \"png\";/* global mpl */\n", |
|
"\n", |
|
"var comm_websocket_adapter = function (comm) {\n", |
|
" // Create a \"websocket\"-like object which calls the given IPython comm\n", |
|
" // object with the appropriate methods. Currently this is a non binary\n", |
|
" // socket, so there is still some room for performance tuning.\n", |
|
" var ws = {};\n", |
|
"\n", |
|
" ws.binaryType = comm.kernel.ws.binaryType;\n", |
|
" ws.readyState = comm.kernel.ws.readyState;\n", |
|
" function updateReadyState(_event) {\n", |
|
" if (comm.kernel.ws) {\n", |
|
" ws.readyState = comm.kernel.ws.readyState;\n", |
|
" } else {\n", |
|
" ws.readyState = 3; // Closed state.\n", |
|
" }\n", |
|
" }\n", |
|
" comm.kernel.ws.addEventListener('open', updateReadyState);\n", |
|
" comm.kernel.ws.addEventListener('close', updateReadyState);\n", |
|
" comm.kernel.ws.addEventListener('error', updateReadyState);\n", |
|
"\n", |
|
" ws.close = function () {\n", |
|
" comm.close();\n", |
|
" };\n", |
|
" ws.send = function (m) {\n", |
|
" //console.log('sending', m);\n", |
|
" comm.send(m);\n", |
|
" };\n", |
|
" // Register the callback with on_msg.\n", |
|
" comm.on_msg(function (msg) {\n", |
|
" //console.log('receiving', msg['content']['data'], msg);\n", |
|
" var data = msg['content']['data'];\n", |
|
" if (data['blob'] !== undefined) {\n", |
|
" data = {\n", |
|
" data: new Blob(msg['buffers'], { type: data['blob'] }),\n", |
|
" };\n", |
|
" }\n", |
|
" // Pass the mpl event to the overridden (by mpl) onmessage function.\n", |
|
" ws.onmessage(data);\n", |
|
" });\n", |
|
" return ws;\n", |
|
"};\n", |
|
"\n", |
|
"mpl.mpl_figure_comm = function (comm, msg) {\n", |
|
" // This is the function which gets called when the mpl process\n", |
|
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n", |
|
"\n", |
|
" var id = msg.content.data.id;\n", |
|
" // Get hold of the div created by the display call when the Comm\n", |
|
" // socket was opened in Python.\n", |
|
" var element = document.getElementById(id);\n", |
|
" var ws_proxy = comm_websocket_adapter(comm);\n", |
|
"\n", |
|
" function ondownload(figure, _format) {\n", |
|
" window.open(figure.canvas.toDataURL());\n", |
|
" }\n", |
|
"\n", |
|
" var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n", |
|
"\n", |
|
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", |
|
" // web socket which is closed, not our websocket->open comm proxy.\n", |
|
" ws_proxy.onopen();\n", |
|
"\n", |
|
" fig.parent_element = element;\n", |
|
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n", |
|
" if (!fig.cell_info) {\n", |
|
" console.error('Failed to find cell for figure', id, fig);\n", |
|
" return;\n", |
|
" }\n", |
|
" fig.cell_info[0].output_area.element.on(\n", |
|
" 'cleared',\n", |
|
" { fig: fig },\n", |
|
" fig._remove_fig_handler\n", |
|
" );\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype.handle_close = function (fig, msg) {\n", |
|
" var width = fig.canvas.width / fig.ratio;\n", |
|
" fig.cell_info[0].output_area.element.off(\n", |
|
" 'cleared',\n", |
|
" fig._remove_fig_handler\n", |
|
" );\n", |
|
" fig.resizeObserverInstance.unobserve(fig.canvas_div);\n", |
|
"\n", |
|
" // Update the output cell to use the data from the current canvas.\n", |
|
" fig.push_to_output();\n", |
|
" var dataURL = fig.canvas.toDataURL();\n", |
|
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n", |
|
" // the notebook keyboard shortcuts fail.\n", |
|
" IPython.keyboard_manager.enable();\n", |
|
" fig.parent_element.innerHTML =\n", |
|
" '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n", |
|
" fig.close_ws(fig, msg);\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype.close_ws = function (fig, msg) {\n", |
|
" fig.send_message('closing', msg);\n", |
|
" // fig.ws.close()\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n", |
|
" // Turn the data on the canvas into data in the output cell.\n", |
|
" var width = this.canvas.width / this.ratio;\n", |
|
" var dataURL = this.canvas.toDataURL();\n", |
|
" this.cell_info[1]['text/html'] =\n", |
|
" '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype.updated_canvas_event = function () {\n", |
|
" // Tell IPython that the notebook contents must change.\n", |
|
" IPython.notebook.set_dirty(true);\n", |
|
" this.send_message('ack', {});\n", |
|
" var fig = this;\n", |
|
" // Wait a second, then push the new image to the DOM so\n", |
|
" // that it is saved nicely (might be nice to debounce this).\n", |
|
" setTimeout(function () {\n", |
|
" fig.push_to_output();\n", |
|
" }, 1000);\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype._init_toolbar = function () {\n", |
|
" var fig = this;\n", |
|
"\n", |
|
" var toolbar = document.createElement('div');\n", |
|
" toolbar.classList = 'btn-toolbar';\n", |
|
" this.root.appendChild(toolbar);\n", |
|
"\n", |
|
" function on_click_closure(name) {\n", |
|
" return function (_event) {\n", |
|
" return fig.toolbar_button_onclick(name);\n", |
|
" };\n", |
|
" }\n", |
|
"\n", |
|
" function on_mouseover_closure(tooltip) {\n", |
|
" return function (event) {\n", |
|
" if (!event.currentTarget.disabled) {\n", |
|
" return fig.toolbar_button_onmouseover(tooltip);\n", |
|
" }\n", |
|
" };\n", |
|
" }\n", |
|
"\n", |
|
" fig.buttons = {};\n", |
|
" var buttonGroup = document.createElement('div');\n", |
|
" buttonGroup.classList = 'btn-group';\n", |
|
" var button;\n", |
|
" for (var toolbar_ind in mpl.toolbar_items) {\n", |
|
" var name = mpl.toolbar_items[toolbar_ind][0];\n", |
|
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", |
|
" var image = mpl.toolbar_items[toolbar_ind][2];\n", |
|
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n", |
|
"\n", |
|
" if (!name) {\n", |
|
" /* Instead of a spacer, we start a new button group. */\n", |
|
" if (buttonGroup.hasChildNodes()) {\n", |
|
" toolbar.appendChild(buttonGroup);\n", |
|
" }\n", |
|
" buttonGroup = document.createElement('div');\n", |
|
" buttonGroup.classList = 'btn-group';\n", |
|
" continue;\n", |
|
" }\n", |
|
"\n", |
|
" button = fig.buttons[name] = document.createElement('button');\n", |
|
" button.classList = 'btn btn-default';\n", |
|
" button.href = '#';\n", |
|
" button.title = name;\n", |
|
" button.innerHTML = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n", |
|
" button.addEventListener('click', on_click_closure(method_name));\n", |
|
" button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", |
|
" buttonGroup.appendChild(button);\n", |
|
" }\n", |
|
"\n", |
|
" if (buttonGroup.hasChildNodes()) {\n", |
|
" toolbar.appendChild(buttonGroup);\n", |
|
" }\n", |
|
"\n", |
|
" // Add the status bar.\n", |
|
" var status_bar = document.createElement('span');\n", |
|
" status_bar.classList = 'mpl-message pull-right';\n", |
|
" toolbar.appendChild(status_bar);\n", |
|
" this.message = status_bar;\n", |
|
"\n", |
|
" // Add the close button to the window.\n", |
|
" var buttongrp = document.createElement('div');\n", |
|
" buttongrp.classList = 'btn-group inline pull-right';\n", |
|
" button = document.createElement('button');\n", |
|
" button.classList = 'btn btn-mini btn-primary';\n", |
|
" button.href = '#';\n", |
|
" button.title = 'Stop Interaction';\n", |
|
" button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n", |
|
" button.addEventListener('click', function (_evt) {\n", |
|
" fig.handle_close(fig, {});\n", |
|
" });\n", |
|
" button.addEventListener(\n", |
|
" 'mouseover',\n", |
|
" on_mouseover_closure('Stop Interaction')\n", |
|
" );\n", |
|
" buttongrp.appendChild(button);\n", |
|
" var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n", |
|
" titlebar.insertBefore(buttongrp, titlebar.firstChild);\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype._remove_fig_handler = function (event) {\n", |
|
" var fig = event.data.fig;\n", |
|
" if (event.target !== this) {\n", |
|
" // Ignore bubbled events from children.\n", |
|
" return;\n", |
|
" }\n", |
|
" fig.close_ws(fig, {});\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype._root_extra_style = function (el) {\n", |
|
" el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype._canvas_extra_style = function (el) {\n", |
|
" // this is important to make the div 'focusable\n", |
|
" el.setAttribute('tabindex', 0);\n", |
|
" // reach out to IPython and tell the keyboard manager to turn it's self\n", |
|
" // off when our div gets focus\n", |
|
"\n", |
|
" // location in version 3\n", |
|
" if (IPython.notebook.keyboard_manager) {\n", |
|
" IPython.notebook.keyboard_manager.register_events(el);\n", |
|
" } else {\n", |
|
" // location in version 2\n", |
|
" IPython.keyboard_manager.register_events(el);\n", |
|
" }\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype._key_event_extra = function (event, _name) {\n", |
|
" // Check for shift+enter\n", |
|
" if (event.shiftKey && event.which === 13) {\n", |
|
" this.canvas_div.blur();\n", |
|
" // select the cell after this one\n", |
|
" var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n", |
|
" IPython.notebook.select(index + 1);\n", |
|
" }\n", |
|
"};\n", |
|
"\n", |
|
"mpl.figure.prototype.handle_save = function (fig, _msg) {\n", |
|
" fig.ondownload(fig, null);\n", |
|
"};\n", |
|
"\n", |
|
"mpl.find_output_cell = function (html_output) {\n", |
|
" // Return the cell and output element which can be found *uniquely* in the notebook.\n", |
|
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", |
|
" // IPython event is triggered only after the cells have been serialised, which for\n", |
|
" // our purposes (turning an active figure into a static one), is too late.\n", |
|
" var cells = IPython.notebook.get_cells();\n", |
|
" var ncells = cells.length;\n", |
|
" for (var i = 0; i < ncells; i++) {\n", |
|
" var cell = cells[i];\n", |
|
" if (cell.cell_type === 'code') {\n", |
|
" for (var j = 0; j < cell.output_area.outputs.length; j++) {\n", |
|
" var data = cell.output_area.outputs[j];\n", |
|
" if (data.data) {\n", |
|
" // IPython >= 3 moved mimebundle to data attribute of output\n", |
|
" data = data.data;\n", |
|
" }\n", |
|
" if (data['text/html'] === html_output) {\n", |
|
" return [cell, data, j];\n", |
|
" }\n", |
|
" }\n", |
|
" }\n", |
|
" }\n", |
|
"};\n", |
|
"\n", |
|
"// Register the function which deals with the matplotlib target/channel.\n", |
|
"// The kernel may be null if the page has been refreshed.\n", |
|
"if (IPython.notebook.kernel !== null) {\n", |
|
" IPython.notebook.kernel.comm_manager.register_target(\n", |
|
" 'matplotlib',\n", |
|
" mpl.mpl_figure_comm\n", |
|
" );\n", |
|
"}\n" |
|
], |
|
"text/plain": [ |
|
"<IPython.core.display.Javascript object>" |
|
] |
|
}, |
|
"metadata": {}, |
|
"output_type": "display_data" |
|
}, |
|
{ |
|
"data": { |
|
"text/html": [ |
|
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABOkAAAKTCAYAAABMyFzvAAAgAElEQVR4XuzdB7xdVZ3w/X96SCcJhBBSpAUQpQqCYgexgKhjBR54VQhjBQRmKKJiwwYqUqLjOIoMDgJiAQRUHFSKqDCoQEJoCS2EkkBIL2/2eZ7LJLS19sk+2Td3f+/7mc87j659ztnf9U9Y8+Oce3qtXPUTfggQIECAAAECBAgQIECAAAECBAgQqE2gl0hXm70nJkCAAAECBAgQIECAAAECBAgQINASEOkMAgECBAgQIECAAAECBAgQIECAAIGaBUS6mjfA0xMgQIAAAQIECBAgQIAAAQIECBAQ6cwAAQIECBAgQIAAAQIECBAgQIAAgZoFRLqaN8DTEyBAgAABAgQIECBAgAABAgQIEBDpzAABAgQIECBAgAABAgQIECBAgACBmgVEupo3wNMTIECAAAECBAgQIECAAAECBAgQEOnMAAECBAgQIECAAAECBAgQIECAAIGaBUS6mjfA0xMgQIAAAQIECBAgQIAAAQIECBAQ6cwAAQIECBAgQIAAAQIECBAgQIAAgZoFRLqaN8DTEyBAgAABAgQIECBAgAABAgQIEBDpzAABAgQIECBAgAABAgQIECBAgACBmgVEupo3wNMTIECAAAECBAgQIECAAAECBAgQEOnMAAECBAgQIECAAAECBAgQIECAAIGaBUS6mjfA0xMgQIAAAQIECBAgQIAAAQIECBAQ6cwAAQIECBAgQIAAAQIECBAgQIAAgZoFRLqaN8DTEyBAgAABAgQIECBAgAABAgQIEBDpzAABAgQIECBAgAABAgQIECBAgACBmgVEupo3wNMTIECAAAECBAgQIECAAAECBAgQEOnMAAECBAgQIECAAAECBAgQIECAAIGaBUS6mjfA0xMgQIAAAQIECBAgQIAAAQIECBAQ6cwAAQIECBAgQIAAAQIECBAgQIAAgZoFRLqaN8DTEyBAgAABAgQIECBAgAABAgQIEBDpzAABAgQIECBAgAABAgQIECBAgACBmgVEupo3wNMTIECAAAECBAgQIECAAAECBAgQEOnMAAECBAgQIECAAAECBAgQIECAAIGaBUS6mjfA0xMgQIAAAQIECBAgQIAAAQIECBAQ6cwAAQIECBAgQIAAAQIECBAgQIAAgZoFRLqaN8DTEyBAgAABAgQIECBAgAABAgQIEBDpzAABAgQIECBAgAABAgQIECBAgACBmgVEupo3wNMTIECAAAECBAgQIECAAAECBAgQEOnMAAECBAgQIECAAAECBAgQIECAAIGaBUS6mjfA0xMgQIAAAQIECBAgQIAAAQIECBAQ6cwAAQIECBAgQIAAAQIECBAgQIAAgZoFRLqaN8DTEyBAgAABAgQIECBAgAABAgQIEBDpzAABAgQIECBAgAABAgQIECBAgACBmgVEupo3wNMTIECAAAECBAgQIECAAAECBAgQEOnMAAECBAgQIECAAAECBAgQIECAAIGaBUS6mjfA0xMgQIAAAQIECBAgQIAAAQIECBAQ6cwAAQIECBAgQIAAAQIECBAgQIAAgZoFRLqaN8DTEyBAgAABAgQIECBAgAABAgQIEBDpzAABAgQIECBAgAABAgQIECBAgACBmgVEupo3wNMTIECAAAECBAgQIECAAAECBAgQEOnMAAECBAgQIECAAAECBAgQIECAAIGaBUS6mjfA0xMgQIAAAQIECBAgQIAAAQIECBAQ6cwAAQIECBAgQIAAAQIECBAgQIAAgZoFRLqaN8DTEyBAgAABAgQIECBAgAABAgQIEBDpzAABAgQIECBAgAABAgQIECBAgACBmgVEupo3wNMTIECAAAECBAgQIECAAAECBAgQEOnMAAECBAgQIECAAAECBAgQIECAAIGaBUS6mjfA0xMgQIAAAQIECBAgQIAAAQIECBAQ6cwAAQIECBAgQIAAAQIECBAgQIAAgZoFRLqaN8DTEyBAgAABAgQIECBAgAABAgQIEBDpzAABAgQIECBAgAABAgQIECBAgACBmgVEupo3wNMTIECAAAECBAgQIECAAAECBAgQEOnMAAECBAgQIECAAAECBAgQIECAAIGaBUS6mjfA0xMgQIAAAQIECBAgQIAAAQIECBAQ6cwAAQIECBAgQIAAAQIECBAgQIAAgZoFRLqaN8DTEyBAgAABAgQIECBAgAABAgQIEBDpzAABAgQIECBAgAABAgQIECBAgACBmgVEupo3wNMTIECAAAECBAgQIECAAAECBAgQEOnMAAECBAgQIECAAAECBAgQIECAAIGaBUS6mjfA0xMgQIAAAQIECBAgQIAAAQIECBAQ6cwAAQIECBAgQIAAAQIECBAgQIAAgZoFRLqaN8DTEyBAgAABAgQIECBAgAABAgQIEBDpzAABAgQIECBAgAABAgQIECBAgACBmgVEupo3wNMTIECAAAECBAgQIECAAAECBAgQEOnMAAECBAgQIECAAAECBAgQIECAAIGaBUS6mjfA0xMgQIAAAQIECBAgQIAAAQIECBAQ6cwAAQIECBAgQIAAAQIECBAgQIAAgZoFRLqaN8DTEyBAgAABAgQIECBAgAABAgQIEBDpzAABAgQIECBAgAABAgQIECBAgACBmgVEupo3wNMTIECAAAECBAgQIECAAAECBAgQEOnMAAECBAgQIECAAAECBAgQIECAAIGaBUS6mjfA0xMgQIAAAQIECBAgQIAAAQIECBAQ6cwAAQIECBAgQIAAAQIECBAgQIAAgZoFRLqaN8DTEyBAgAABAgQIECBAgAABAgQIEBDpzAABAgQIECBAgAABAgQIECBAgACBmgVEupo3wNMTIECAAAECBAgQIECAAAECBAgQEOnMAAECBAgQIECAAAECBAgQIECAAIGaBUS6mjfA0xMgQIAAAQIECBAgQIAAAQIECBAQ6cwAAQIECBAgQIAAAQIECBAgQIAAgZoFRLqaN8DTEyBAgAABAgQIECBAgAABAgQIEBDpzAABAgQIECBAgAABAgQIECBAgACBmgVEupo3wNMTIECAAAECBAgQIECAAAECBAgQEOnMAAECBAgQIECAAAECBAgQIECAAIGaBUS6mjfA0xMgQIAAAQIECBAgQIAAAQIECBAQ6cwAAQIECBAgQIAAAQIECBAgQIAAgZoFRLqaN8DTEyBAgAABAgQIECBAgAABAgQIEBDpzAABAgQIECBAgAABAgQIECBAgACBmgVEupo3wNMTIECAAAECBAgQIECAAAECBAgQEOnMAAECBAgQIECAAAECBAgQIECAAIGaBUS6mjfA0xMgQIAAAQIECBAgQIAAAQIECBAQ6cwAAQIECBAgQIAAAQIECBAgQIAAgZoFRLqaN8DTEyBAgAABAgQIECBAgAABAgQIEBDpzAABAgQIECBAgAABAgQIECBAgACBmgVEupo3wNMTIECAAAECBAgQIECAAAECBAgQEOnMAAECBAgQIECAAAECBAgQIECAAIGaBUS6mjfA0xMgQIAAAQIECBAgQIAAAQIECBAQ6cwAAQIECBAgQIAAAQIECBAgQIAAgZoFRLqaN8DTEyBAgAABAgQIECBAgAABAgQIEBDpzAABAgQIECBAgAABAgQIECBAgACBmgVEupo3wNMTIECAAAECBAgQIECAAAECBAgQEOnMAAECBAgQIECAAAECBAgQIECAAIGaBUS6mjfA0xMgQIAAAQIECBAgQIAAAQIECBAQ6cwAAQIECBAgQIAAAQIECBAgQIAAgZoFRLqaN8DTEyBAgAABAgQIECBAgAABAgQIEBDpzAABAgQIECBAgAABAgQIECBAgACBmgVEupo3wNMTIECAAAECBAgQIECAAAECBAgQEOnMAAECBAgQIECAAAECBAgQIECAAIGaBUS6mjfA0xMgQIAAAQIECBAgQIAAAQIECBAQ6cwAAQIECBAgQIAAAQIECBAgQIAAgZoFRLqaN8DTEyBAgAABAgQIECBAgAABAgQIEBDpzAABAgQIECBAgAABAgQIECBAgACBmgVEupo3wNMTIECAAAECBAgQIECAAAECBAgQEOnMAAECBAgQIECAAAECBAgQIECAAIGaBUS6mjfA0xMgQIAAAQIECBAgQIAAAQIECBAQ6cwAAQIECBAgQIAAAQIECBAgQIAAgZoFRLqaN8DTEyBAgAABAgQIECBAgAABAgQIEBDpzAABAgQIECBAgAABAgQIECBAgACBmgVEupo3wNMTIECAAAECBAgQIECAAAECBAgQEOnMAAECBAgQIECAAAECBAgQIECAAIGaBUS6mjfA0xMgQIAAAQIECBAgQIAAAQIECBAQ6cwAAQIECBAgQIAAAQIECBAgQIAAgZoFRLqaN8DTEyBAgAABAgQIECBAgAABAgQIEBDpzAABAgQIECBAgAABAgQIECBAgACBmgVEupo3wNMTIECAAAECBAgQIECAAAECBAgQEOnMAAECBAgQIECAAAECBAgQIECAAIGaBUS6mjfA0xMgQIAAAQIECBAgQIAAAQIECBAQ6cwAAQIECBAgQIAAAQIECBAgQIAAgZoFRLqaN8DTEyBAgAABAgQIECBAgAABAgQIEBDpzAABAgQIECBAgAABAgQIECBAgACBmgVEupo3wNMTIECAAAECBAgQIECAAAECBAgQEOnMAAECBAgQIECAAAECBAgQIECAAIGaBUS6mjfA0xMgQIAAAQIECBAgQIAAAQIECBAQ6cwAAQIECBAgQIAAAQIECBAgQIAAgZoFRLqaN8DTEyBAgAABAgQIECBAgAABAgQIEBDpzAABAgQIECBAgAABAgQIECBAgACBmgVEupo3wNMTIECAAAECBAgQIECAAAECBAgQEOnMAAECBAgQIECAAAECBAgQIECAAIGaBUS6mjfA0xMgQIAAAQIECBAgQIAAAQIECBAQ6cwAAQIECBAgQIAAAQIECBAgQIAAgZoFRLqaN8DTEyBAgAABAgQIECBAgAABAgQIEBDpzAABAgQIECBAgAABAgQIECBAgACBmgVEupo3wNMTIECAAAECBAgQIECAAAECBAgQEOnMAAECBAgQIECAAAECBAgQIECAAIGaBUS6mjfA0xMgQIAAAQIECBAgQIAAAQIECBAQ6cwAAQIECBAgQIAAAQIECBAgQIAAgZoFRLqaN8DTEyBAgAABAgQIECBAgAABAgQIEBDpzAABAgQIECBAgAABAgQIECBAgACBmgVEupo3wNMTIECAAAECBAgQIECAAAECBAgQEOnMAAECBAgQIECAAAECBAgQIECAAIGaBUS6mjfA0xMgQIAAAQIECBAgQIAAAQIECBAQ6cwAAQIECBAgQIAAAQIECBAgQIAAgZoFRLqaN8DTEyBAgAABAgQIECBAgAABAgQIEBDpzAABAgQIECBAgAABAgQIECBAgACBmgVEupo3wNMTIECAAAECBAgQIECAAAECBAgQEOnMAAECBAgQIECAAAECBAgQIECAAIGaBUS6mjfA0xMgQIAAAQIECBAgQIAAAQIECBAQ6cwAAQIECBAgQIAAAQIECBAgQIAAgZoFRLqaN8DTEyBAgAABAgQIECBAgAABAgQIEBDpzAABAgQIECBAgAABAgQIECBAgACBmgVEupo3wNMTIECAAAECBAgQIECAAAECBAgQEOnMAAECBAgQIECAAAECBAgQIECAAIGaBUS6mjfA0xMgQIAAAQIECBAgQIAAAQIECBAQ6cwAAQIECBAgQIAAAQIECBAgQIAAgZoFRLqaN8DTEyBAgAABAgQIECBAgAABAgQIEBDpzAABAgQIECBAgAABAgQIECBAgACBmgVEupo3wNMTIECAAAECBAgQIECAAAECBAgQEOnMAAECBAgQIECAAAECBAgQIECAAIGaBUS6mjfA0xMgQIAAAQIECBAgQIAAAQIECBAQ6cwAAQIECBAgQIAAAQIECBAgQIAAgZoFRLqaN8DTEyBAgAABAgQIECBAgAABAgQIEBDpzAABAgQIECBAgAABAgQIECBAgACBmgVEupo3wNMTIECAAAECBAgQIECAAAECBAgQEOnMAAECBAgQIECAAAECBAgQIECAAIGaBUS6mjfA0xMgQIAAAQIECBAgQIAAAQIECBAQ6cwAAQIECBAgQIAAAQIECBAgQIAAgZoFRLqaN8DTEyBAgAABAgQIECBAgAABAgQIEBDpzAABAgQIECBAgAABAgQIECBAgACBmgVEupo3wNMTIECAAAECBAgQIECAAAECBAgQEOnMAAECBAgQIECAAAECBAgQIECAAIGaBUS6mjfA0xMgQIAAAQIECBAgQIAAAQIECBAQ6cwAAQIECBAgQIAAAQIECBAgQIAAgZoFRLqaN8DTEyBAgAABAgQIECBAgAABAgQIEBDpzAABAgQIECBAgAABAgQIECBAgACBmgVEupo3wNMTIECAAAECBAgQIECAAAECBAgQEOnMAAECBAgQIECAAAECBAgQIECAAIGaBUS6mjfA0xMgQIAAAQIECBAgQIAAAQIECBAQ6cwAAQIECBAgQIAAAQIECBAgQIAAgZoFRLqaN8DTEyBAgAABAgQIECBAgAABAgQIEBDpzAABAgQIECBAgAABAgQIECBAgACBmgVEupo3wNMTIECAAAECBAgQIECAAAECBAgQEOnMAAECPV7gjDPOiG9/+9vZ9zlu3Lj47W9/m72+3YWve93r4v77748//OEPsdFGG7X7MJVfN2/evPj5z38el19+ecycOTPmzp0bI0aMiB133DHe9773xSte8YrKn9MDEiBAgACB7izgLFFud5wlynlZTYAAgS4Bkc4sECDQ4wWuvPLKKP5n9Z/77rsvbrrpphg/fnwrPq3+M3LkyDjhhBM67tIdI90f//jHOPbYY+PRRx9thbmtt946hg8fHvfee29Mnz69ZXLwwQfHSSed1HEfT0CAAAECBLqLgLNE/k44S+RbWUmAAIFnCoh0ZoIAgUYKXHzxxXH88cfH29/+9jj11FNrMSjepbZ06dKYNGlS9OnTp5bXsPqTXnfddfGBD3wgevfu3Qp1xbvmBgwY8PSSP//5z/Hxj3+8FfA+8pGPtP53PwQIECBAoKkCzhLP3nlniab+aXDfBAhUJSDSVSXpcQgQWK8EusPBujuBzZ8/P9785jfH7Nmz48tf/nIccMABz/nyincfvve9742BAwfG1VdfHcW7Dv0QIECAAIEmCjhLrLnrzhJN/FPgngkQqFpApKta1OMRILBeCKQO1sXHYV//+tfHi170ovjVr371rHt6yUteEkuWLIlp06a1/ruu9fvtt18ceeSRcfrpp0fxcY8FCxbElltuGQcddFC84x3vWONxnuvjrpMnT46dd945zjzzzPjGN77R+t14xe91mTBhQvzTP/1THHLIIa13uq3+U7yz7ayzzmqtLf734jUX74grfo477rj40pe+9KznfuYNXXTRRa2P+Bb3deGFF77gHn7yk59s3fsRRxwRL37xi1tri9fdv3//+Nvf/vasa/fdd9+4++674ze/+U1sttlmT68v7rN4jM997nOtOFi87uJdhVdccUXLr4iGz/w56qij4rLLLouzzz47Cr/i56mnnop///d/b/3nxT4MGjQodtlll9a7/bpe33oxlF4kAQIECKxXAs4Sa26Xs8R6Nb5eLAEC3VRApOumG+NlESDQWYFOHayL8FQEqeKn+F13RWD761//2vp/f/7zn493vetdT9/Y80W6rbbaqvUx2Dlz5rSC3bJly+JPf/pTLF++vBW1ilDV9VPErSIAFh+dnThxYmyzzTatcHjPPffES1/60rjllluyIt1hhx0W11xzTfzLv/zL04GvzA60E+k22WST1pdSbLHFFjF69OjW07373e9uxbV99tknil/SvfrPwoULY88992zFwOLLNvr16xePP/54K1wW97zxxhvH9ttv3zIv3vFXfIS4CJ1veMMbytyKtQQIECBAIEvAWWJNJmeJrLGxiAABAi8oINIZEAIEGinQqYN1gfnqV786vv71r8fQoUNbtueff3585jOfab2j7tJLL33a+/kiXbGgeEdb8e64IjwVP0VAKw6/xZc4FIGqCFXFT/Gutl/+8pdx4IEHxoknntgKUytWrIivfOUr8f3vf7+1JueddHvvvXcr9J133nmx6667lp6JdiJd8ST7779/fPWrX209X/G6iyC51157xaJFi+Laa6+NwYMHP/1ainfKFYGy+LjtZz/72dZ/fvTRR7dMi3cZfvrTn37a5cYbb4zDDz+85VG8E7IrApa+MRcQIECAAIHnEXCWWBPGWcIfFQIECKy9gEi39oYegQCB9VCgkwfrX//6161vje36KcJT8Y64xYsXt95V1xWeXijS/eAHP4iXv/zla8h2HX6LKFe82+6xxx6LV7ziFTFmzJi46qqrWu8s6/op3nX31re+Ne66666sSFe86694p9rll18em2++eekdbTfS/dd//dezvl335JNPjuI/L0JncQ9dPx/96Edb99kVEh966KF47WtfG2PHjm2FuK5w2bW+eBdd8bHYIuRNmTKl9D25gAABAgQIvJCAs8SaOs4S/rwQIEBg7QVEurU39AgECKyHAp06WBdfpFB8s9kzf171qle1fu9a8e6wUaNGtf7rF4p0N998c2ywwQZrPEzxbatF5PvJT37S+ihr1zvLio+IFr/X7Zk/p512WkydOjUr0hURsfjdbr/4xS9i6623Lr2j7Ua64mOpxe+QW/2n+BbZ4p2BxcdUi9/NV/wUv4y6+Khr8Y644nfb9erVq/VajznmmFbIK4LeM3+6HueVr3xlfO973yt9Ty4gQIAAAQIvJOAssaaOs4Q/LwQIEFh7AZFu7Q09AgEC66FApw7WXV988EyS5wpyzxfpinfE/f3vf3+W6sEHH9z63XRd7z4rviyh+CbWj3/8463f4/bMnx//+Metj4DmfNz1jW98Y+v32D3XO/hytredSPd897ly5crWl3Y88sgjrag5ZMiQuOSSS1q/L694R1zxzrji57vf/W587WtfS768Z37MOHmBBQQIECBAIEPAWWJNJGeJjKGxhAABAgkBkc6IECDQSIG1PVgX3xpafIz1md/u+nzfBlsm0j3ft6Q+M9J95zvfab2D7GMf+1gUHwV95k/X78LLiXRdv9ut+B13xe9ye6Gf4nfiFfdd/O69IoAVPy8U6Yovgbj33nuf9e2uz3efxeMV91XcX/H76orfW1fEud/97ndrvNOveJdg8W7B4rlf6N1/xbsbi2+u9UOAAAECBKoUcJZYU9NZosrp8lgECDRVQKRr6s67bwINF0gdrB944IHW7zsrvjH1yiuvXEOr+Fho8ZGO4qfOSPezn/0sjjvuuNaXJnzhC1941o6efvrpcc4552S9k67ro6PFx2iLj9O+0M8HPvCB+OMf/9j6Ftji3W3FT/GtssWXNPzjH/941qW7775761tci4+pbrbZZq3//oWiXvHf33HHHa2PsRa/h++LX/xi66OuxbfAFvfc9XPRRRe14tt73vOeOOWUUxo+0W6fAAECBNa1gLPEmuLOEut6Aj0fAQI9UUCk64m76p4I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2PqxvcRN2XuJ2Pnyud39eRq/DvYTL3vOluGyH9wY7rune/uJ4ffmX2qYPWn9CpcvyvueeHwvccCu4bKv/iZ/L/FYw2GjRpYcWnabYRO7+xCSZj/xiu3+tp+4P98rewD/V7hoWpf3E9Py9xNTx/TbSyzOH/MmUzP3mJ3i9KvfceKctWj95E3HLN8wTHt0jzC6y/uJKcNHd20MseNHlufvJ5YumxYeWLRfWH/8uWFU5h6qr439RFencdB1LqQbdFMyeA7o6quvDq9//evD0Ucf3YR1/V99Id03v/nNsMMOO2Qf9N133x3mzOneB372gSgkQIAAAQJdFpg+fXrYeOONu/wug797+4nBP0eOkAABAgQGr4D9xOCdm24cmZCuG6o90md8iusrXvGKcOSRR4Y3v/nNK42q73LX7373u2HGjBnZI16yZEmIZ9ONGTMmDB8+PLudQgIECBAgMFQEli9fHhYvXtycRTd6dHf/ij8UTOwnhsIsOUYCBAgQGGwC9hODbUbWzfEI6daN85B8lwceeCDsvPPO4aCDDgof/OAHVxpD6YMjhiSEgyZAgAABAgSKBewniuk0JECAAAECBFomIKRr2YR3Otw999wzbLrppuHMM89cqekBBxwQ5s6dG370ox912qV6AgQIECBAoGUC9hMtm3DDJUCAAAECBIoEhHRFbO1p9NnPfjaceuqp4fzzz3/8Ka7xspV99903vOMd7wjvec972oNhpAQIECBAgECRgP1EEZtGBAgQIECAQMsEhHQtm/BOhzt//vyw9957h2XLljWXva5YsSKcdtppYdy4ceHcc88NkydP7rRL9QQIECBAgEDLBOwnWjbhhkuAAAECBAgUCQjpitja1Sg+jfXYY48NV1xxRXMD7F133bW5R93mm2/eLgijJUCAAAECBIoF7CeK6TQkQIAAAQIEWiIgpGvJRBsmAQIECBAgQIAAAQIECBAgQIDA4BUQ0g3euXFkBAgQIECAAAECBAgQIECAAAECLREQ0rVkog2TAAECBAgQIECAAAECBAgQIEBg8AoI6Qbv3DgyAgQIECBAgAABAgQIECBAgACBlggI6Voy0YZJgAABAgQIECBAgAABAgQIECAweAWEdIN3bnruyO68885w/PHHN0+JXbp0adh9993DEUccETbbbLOeGOvee+8dZs+e/YSxvOxlLwtf/OIXm3+/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p3/dDn7OnDnNZXNXXHFF8wv+rrvu2tyjbvPNN1+3B9Kld4tPRoxnC86ePTuMHTu2GV98KuZWW231+Dvee++9zT3KLr300iao3H777Ztwr+/swi4dWle6XdP92XLHGM+c+/znPx++973vNTfXjQbRK96fZLC+1jTmX//61yHeR++6665rzpqLIWM8OzTOb//XUBhzPDV/1XtHrjof8ezALbfcMvTKXHcy5l6a6755jZvruH7jLw0xnI0PdXn3u98d+t+XrVfmupMx9+JcD9bP1k6Oq9f3EtGiTfuJNu4l1hTSxX/vlc+dTr5Xe+n7pZNx98pcd/K92ktz3cm4e22uO/nOVlsmIKQrc9OKAAECBAgQIECAAAECBAgQIECAQDUBIV01Sh0RIECAAAECBAgQIECAAAECBAgQKBMQ0pW5aUWAAAECBAgQIECAAAECBAgQIECgmoCQrhqljggQIECAAAECBAgQIECAAAECBAiUCQjpyty0IkCAAAECBAgQIECAAAECBAgQIFBNQEhXjVJHBAgQIECAAAECBAgQIECAAAECBMoEhHRlbloRIECAAAECBAgQIECAAAECBAgQqCYgpKtGqSMCBAgQIECAAAECBAgQIECAAAECZQJCujI3rQgQIECAAAECBAgQIECAAAECBAhUExDSVaPUEQECBAgQIECAAAECBAgQIECAAIEyASFdmZtWBAgQIECAAAECBAgQIECAAAECBKoJCOmqUeqIAAECBAgQIECAAAECBAgQIECAQJmAkK7MTSsCBAgQIECAAAECBAgQIECAAAEC1QSEdNUodUSAAAECBAgQIECAAAECBAgQIECgTEBIV+amFQECBAgQIECAAAECBAgQIECAAIFqAkK6apQ6IkCAAAECBAgQIECAAAECBAgQIFAmIKQrc9OKAAECBAgQIECAAAECBAgQIECAQDUBIV01Sh0RIECAAAECBAgQIECAAAECBAgQKBMQ0pW5aUWAAAECBAgQIECAAAECBAgQIECgmoCQrhqljggQIECAAAECBAgQIECAAAECBAiUCQjpyty0IkCAAAECBAgQIECAAAECBAgQIFBNQEhXjVJHBAgQIECAAAECBAgQIECAAAECBMoEhHRlbloRIECAAAECBAgQIECAAAECBAgQqCYgpKtGqSMCBAgQIECAAAECBAgQIECAAAECZQJCujI3rQgQIECAAAECBAgQIECAAAECBAhUExDSVaPUEQECBAgQIECAAAECBAgQIECAAIEyASFdmZtWBAgQIECAAAECBAgQIECAAAECBKoJCOmqUeqIAAECBAgQIECAAAECBAgQIECAQJmAkK7MTSsCBAgQIECAAAECBAgQIECAAAEC1QSEdNUodUSAAAECBAgQIECAAAECBAgQIECgTEBIV+amFQECBAgQIECAAAECBAgQIECAAIFqAkK6apQ6IkCAAAECBAgQIECAAAECBAgQIFAmIKQrc9OKAAECBAgQIECAAAECBAgQIECAQDUBIV01Sh0RIECAAAECBAgQIECAAAECBAgQKBMQ0pW5aUWAAAECBAgQIECAAAECBAgQIECgmoCQrhqljggQIECAAAECBAgQIECAAAECBAiUCQjpyty0IkCAAAECBAgQIECAAAECBAgQIFBNQEhXjVJHBAgQIECAAAECBAgQIECAAAECBMoEhHRlbloRIECAAAECBAgQIECAAAECBAgQqCYgpKtGqSMCBAgQIECAAAECBAgQIECAAAECZQJCujI3rQgQIECAAAECBAgQIECAAAECBAhUExDSVaPUEQECBAgQIECAAAECBAgQIECAAIEyASFdmZtWBAgQIECAAAECBAgQIECAAAECBKoJCOmqUeqIAAECBAgQIECAAAECBAgQIECAQJmAkK7MTSsCBAgQIECAAAECBAgQIECAAAEC1QSEdNUodUSAAAECBAgQIECAAAECBAgQIECgTEBIV+amFQECBAgQIECAAAECBAgQIECAAIFqAkK6apQ6IkCAAAECBAgQIECAAAECBAgQIFAmIKQrc9OKAAECBAgQIECAAAECBAgQIECAQDUBIV01Sh0RIECAAAECBAgQIECAAAECBAgQKBMQ0pW5aUWAAAECBAgQIECAAAECBAgQIECgmoCQrhqljggQIECAAAECBAgQIECAAAECBAiUCQjpyty0IkCAAAECBAgQIECAAAECBAgQIFBNQEhXjVJHBAgQIECAAAECBAgQIECAAAECBMoEhHRlbloRIECAAAECBAgQIECAAAECBAgQqCYgpKtGqSMCBAgQIECAAAECBAgQIECAAAECZQJCujI3rQgQIECAAAECBAgQIECAAAECBAhUExDSVaPUEQECBAgQIECAAAECBAgQIECAAIEyASFdmZtWBAgQIECAAAECBAgQIECAAAECBKoJCOmqUeqIAAECBAgQIECAAAECBAgQIECAQJmAkK7MTSsCBAgQIECAAAECBAgQIECAAAEC1QSEdNUodUSAAAECBAgQIECAAAECBAgQIECgTEBIV+amFQECBAgQIECAAAECBAgQIECAAIFqAkK6apQ6IkCAAAECBAgQIECAAAECBAgQIFAmIKQrc9OKAAECBAgQIECAAAECBAgQIECAQDUBIV01Sh0RIECAAAECBAgQIECAAAECBAgQKBMQ0pW5aUWAAAECBAgQIECAAAECBAgQIECgmoCQrhqljggQIECAAAECBAgQIECAAAECBAiUCQjpyty0IkCAAAECBAgQIECAAAECBAgQIFBNQEhXjVJHBAgQIECAAAECBAgQIECAAAECBMoEhHRlbloRIECAAAECBAgQIECAAAECBAgQqCYgpKtGqSMCBAgQIECAAAECBAgQIECAAAECZQJCujI3rQgQIECAAAECBAgQIECAAAECBAhUExDSVaPUEQECBAgQIECAAAECBAgQIECAAIEyASFdmZtWBAgQIECAAAECBAgQIECAAAECBKoJCOmqUeqIAAECBAgQIECAAAECBAgQIECAQJmAkK7MTSsCBAgQIECAAAECBAgQIECAAAEC1QSEdNUodUSAAAECBAgQIECAAAECBAgQIECgTEBIV+amFQECBAgQIECAAAECBAgQIECAAIFqAkK6apQ6IkCAAAECBAgQIECAAAECBAgQIFAmIKQrc9OKAAECBAgQIECAAAECBAgQIECAQDUBIV01Sh0RIECAAAECBAgQIECAAAECBAgQKBMQ0pW5aUWAAAECBAgQIECAAAECBAgQIECgmoCQrhqljggQIECAAAECBAgQIECAAAECBAiUCQjpyty0IkCAAAECBAgQIECAAAECBAgQIFBNQEhXjVJHBAgQIECAAAECBAgQIECAAAECBMoEhHRlbloRIECAAAECBAgQIECAAAECBAgQqCYgpKtGqSMCBAgQIECAAAECBAgQIECAAAECZQJCujI3rQgQIECAAAECBAgQIECAAAECBAhUExDSVaPUEQECBAgQIECAAAECBAgQIECAAIEyASFdmZtWBAgQIECAAAECBAgQIECAAAECBKoJCOmqUeqIAAECBAgQIECAAAECBAgQIECAQJmAkK7MTSsCBAgQIECAAAECBAgQIECAAAEC1QSEdNUodUSAAAECBAgQIECAAAECBAgQIECgTEBIV+amFQECBAgQIECAAAECBAgQIECAAIFqAkK6apQ6IkCAAAECBAgQIECAAAECBAgQIFAmIKQrc9OKAAECBAgQIECAAAECBAgQIECAQDUBIV01Sh0RIECAAAECBAgQIECAAAECBAgQKBMQ0pW5aUWAAAECBAgQIECAAAECBAgQIECgmoCQrhqljggQIECAAAECBAgQIECAAAECBAiUCQjpyty0IkCAAAECBAgQIECAAAECBAgQIFBNQEhXjVJHBAgQIECAAAECBAgQIECAAAECBMoEhHRlbloRIECAAAECBAgQIECAAAECBAgQqCYgpKtGqSMCBAgQIECAAAECBAgQIECAAAECZQJCujI3rQgQIECAAAECBAgQIECAAAECBAhUExDSVaPUEQECBAgQIECAAAECBAgQIECAAIEyASFdmZtWBAgQIECAAAECBAgQIECAAAECBKoJCOmqUeqIAAECBAgQIECAAAECBAgQIECAQJmAkK7MTSsCBAgQIECAAAECBAgQIECAAAEC1QSEdNUodUSAAAECBAgQIECAAAECBAgQIECgTEBIV+amFQECBAgQIECAAAECBAgQIECAAIFqAkK6apQ6IkCAAAECBAgQIECAAAECBAgQIFAmIKQrc9OKAAECBAgQIECAAAECBAgQIECAQDUBv/2cdQAAB/pJREFUIV01Sh0RIECAAAECBAgQIECAAAECBAgQKBMQ0pW5aUWAAAECBAgQIECAAAECBAgQIECgmoCQrhqljggQIECAAAECBAgQIECAAAECBAiUCQjpyty0IkCAAAECBAgQIECAAAECBAgQIFBNQEhXjVJHBAgQIECAAAECBAgQIECAAAECBMoEhHRlbloRIECAAAECBAgQIECAAAECBAgQqCYgpKtGqSMCBAgQIECAAAECBAgQIECAAAECZQJCujI3rQgQIECAAAECBAgQIECAAAECBAhUExDSVaPUEQECBAgQIECAAAECBAgQIECAAIEyASFdmZtWBAgQIECAAAECBAgQIECAAAECBKoJCOmqUeqIAAECBAgQIECAAAECBAgQIECAQJmAkK7MTSsCBAgQIECAAAECBAgQIECAAAEC1QSEdNUodUSAAAECBAgQIECAAAECBAgQIECgTEBIV+amFQECBAgQIECAAAECBAgQIECAAIFqAkK6apQ6IkCAAAECBAgQIECAAAECBAgQIFAmIKQrc9OKAAECBAgQIECAAAECBAgQIECAQDUBIV01Sh0RIECAAAECBAgQIECAAAECBAgQKBMQ0pW5aUWAAAECBAgQIECAAAECBAgQIECgmoCQrhqljggQIECAAAECBAgQIECAAAECBAiUCQjpyty0IkCAAAECBAgQIECAAAECBAgQIFBNQEhXjVJHBAgQIECAAAECBAgQIECAAAECBMoEhHRlbloRIECAAAECBAgQIECAAAECBAgQqCYgpKtGqSMCBAgQIECAAAECBAgQIECAAAECZQJCujI3rQgQIECAAAECBAgQIECAAAECBAhUExDSVaPUEQECBAgQIECAAAECBAgQIECAAIEyASFdmZtWBAgQIECAAAECBAgQIECAAAECBKoJCOmqUeqIAAECBAgQIECAAAECBAgQIECAQJmAkK7MTSsCBAgQIECAAAECBAgQIECAAAEC1QSEdNUodUSAAAECBAgQIECAAAECBAgQIECgTEBIV+amFQECBAgQIECAAAECBAgQIECAAIFqAkK6apQ6IkCAAAECBAgQIECAAAECBAgQIFAmIKQrc9OKAAECBAgQIECAAAECBAgQIECAQDUBIV01Sh0RIECAAAECBAgQIECAAAECBAgQKBMQ0pW5aUWAAAECBAgQIECAAAECBAgQIECgmoCQrhqljggQIECAAAECBAgQIECAAAECBAiUCQjpyty0IkCAAAECBAgQIECAAAECBAgQIFBNQEhXjVJHBAgQIECAAAECBAgQIECAAAECBMoEhHRlbloRIECAAAECBAgQIECAAAECBAgQqCYgpKtGqSMCBAgQIECAAAECBAgQIECAAAECZQJCujI3rQgQIECAAAECBAgQIECAAAECBAhUExDSVaPUEQECBAgQIECAAAECBAgQIECAAIEyASFdmZtWBAgQIECAAAECBAgQIECAAAECBKoJCOmqUeqIAAECBAgQIECAAAECBAgQIECAQJmAkK7MTSsCBAgQIECAAAECBAgQIECAAAEC1QSEdNUodUSAAAECBAgQIECAAAECBAgQIECgTEBIV+amFQECBAgQIECAAAECBAgQIECAAIFqAkK6apQ6IkCAAAECBAgQIECAAAECBAgQIFAmIKQrc9OKAAECBAgQIECAAAECBAgQIECAQDUBIV01Sh0RIECAAAECBAgQIECAAAECBAgQKBMQ0pW5aUWAAAECBAgQIECAAAECBAgQIECgmoCQrhqljggQIECAAAECBAgQIECAAAECBAiUCQjpyty0IkCAAAECBAgQIECAAAECBAgQIFBNQEhXjVJHBAgQIECAAAECBAgQIECAAAECBMoEhHRlbloRIECAAAECBAgQIECAAAECBAgQqCYgpKtGqSMCBAgQIECAAAECBAgQIECAAAECZQJCujI3rQgQIECAAAECBAgQIECAAAECBAhUExDSVaPUEQECBAgQIECAAAECBAgQIECAAIEyASFdmZtWBAgQIECAAAECBAgQIECAAAECBKoJCOmqUeqIAAECBAgQIECAAAECBAgQIECAQJmAkK7MTSsCBAgQIECAAAECBAgQIECAAAEC1QSEdNUodUSAAAECBAgQIECAAAECBAgQIECgTEBIV+amFQECBAgQIECAAAECBAgQIECAAIFqAkK6apQ6IkCAAAECBAgQIECAAAECBAgQIFAmIKQrc9OKAAECBAgQIECAAAECBAgQIECAQDUBIV01Sh0RIECAAAECBAgQIECAAAECBAgQKBMQ0pW5aUWAAAECBAgQIECAAAECBAgQIECgmoCQrhqljggQIECAAAECBAgQIECAAAECBAiUCQjpyty0IkCAAAECBAgQIECAAAECBAgQIFBNQEhXjVJHBAgQIECAAAECBAgQIECAAAECBMoEhHRlbloRIECAAAECBAgQIECAAAECBAgQqCYgpKtGqSMCBAgQIECAAAECBAgQIECAAAECZQJCujI3rQgQIECAAAECBAgQIECAAAECBAhUExDSVaPUEQECBAgQIECAAAECBAgQIECAAIEyASFdmZtWBAgQIECAAAECBAgQIECAAAECBKoJCOmqUeqIAAECBAgQIECAAAECBAgQIECAQJmAkK7MTSsCBAgQIECAAAECBAgQIECAAAEC1QSGVetJRwQIECBAgAABAgQIECBAgAABAgQIFAn8f6vT4tjiBU/JAAAAAElFTkSuQmCC\" width=\"963.6999999999999\">" |
|
], |
|
"text/plain": [ |
|
"<IPython.core.display.HTML object>" |
|
] |
|
}, |
|
"metadata": {}, |
|
"output_type": "display_data" |
|
}, |
|
{ |
|
"data": { |
|
"application/vnd.jupyter.widget-view+json": { |
|
"model_id": "43a5782034fb4bec9f235bff100cb9a5", |
|
"version_major": 2, |
|
"version_minor": 0 |
|
}, |
|
"text/plain": [ |
|
"interactive(children=(FloatSlider(value=0.8, description='k', max=10.0, step=0.2), FloatSlider(value=0.8, desc…" |
|
] |
|
}, |
|
"metadata": {}, |
|
"output_type": "display_data" |
|
} |
|
], |
|
"source": [ |
|
"fig, ax = plt.subplots(1, 2)\n", |
|
"DEF_K, DEF_SIGMA, DEF_X = 0.8, 0.05, 0.8\n", |
|
"get_tuning_curve_func = lambda k_val, x0_val, y0_val, sigma_val: lambda theta_val, phi_val: get_value(k_val, phi_val * 180 / np.pi, theta_val * 180 / np.pi, x0_val, y0_val, sigma_val)\n", |
|
"left_img = plot_tuning_curve(get_tuning_curve_func(DEF_K, DEF_X, 0, DEF_SIGMA), ax[0], title='Tuning Curve')\n", |
|
"right_img = plot_tuning_curve(p.subs({k: defaults[k], x0: defaults[x0], y0: defaults[y0], sigma: defaults[sigma]}), ax[1], title='Tuning Curve')\n", |
|
"\n", |
|
"@widgets.interact(\n", |
|
" k_val=widgets.FloatSlider(min=0, max=10, step=0.2, value=DEF_K, description='k'),\n", |
|
" x0_val=widgets.FloatSlider(min=-1, max=1, step=0.05, value=DEF_X, description='x0'),\n", |
|
" y0_val=widgets.FloatSlider(min=-1, max=1, step=0.05, value=0, description='y0'),\n", |
|
" sigma_val=widgets.FloatSlider(min=0, max=1, step=0.05, value=DEF_SIGMA, description='sigma'),\n", |
|
")\n", |
|
"def plot_tuning_curves(k_val, x0_val, y0_val, sigma_val):\n", |
|
" plot_tuning_curve(get_tuning_curve_func(k_val, x0_val, y0_val, sigma_val), left_img, title='Tuning Curve - Numeric')\n", |
|
" plot_tuning_curve(p.subs({k: k_val, x0: x0_val, y0: y0_val, sigma: sigma_val}), right_img, title='Tuning Curve - Analytic')\n", |
|
" fig.canvas.draw_idle()" |
|
] |
|
}, |
|
{ |
|
"cell_type": "code", |
|
"execution_count": null, |
|
"metadata": {}, |
|
"outputs": [], |
|
"source": [] |
|
} |
|
], |
|
"metadata": { |
|
"kernelspec": { |
|
"display_name": "Python 3 (ipykernel)", |
|
"language": "python", |
|
"name": "python3" |
|
}, |
|
"language_info": { |
|
"codemirror_mode": { |
|
"name": "ipython", |
|
"version": 3 |
|
}, |
|
"file_extension": ".py", |
|
"mimetype": "text/x-python", |
|
"name": "python", |
|
"nbconvert_exporter": "python", |
|
"pygments_lexer": "ipython3", |
|
"version": "3.10.5" |
|
} |
|
}, |
|
"nbformat": 4, |
|
"nbformat_minor": 1 |
|
} |