From 204185ed08351a5117e69b6e17df10428ff71752 Mon Sep 17 00:00:00 2001 From: hannah Date: Wed, 6 Nov 2019 23:52:01 -0500 Subject: [PATCH] hooks + doc amends --- README.md | 25 +- contrib_colormaps/plotting.py | 14 +- examples/colormaps/index.ipynb | 170 +- examples/index.ipynb | 2754 +++++++++++++++++++++++++++++++- 4 files changed, 2815 insertions(+), 148 deletions(-) diff --git a/README.md b/README.md index 927942b..9160a15 100644 --- a/README.md +++ b/README.md @@ -34,8 +34,9 @@ pip install contrib_colormaps ## Contributing -To add a colormap, open a pull request on this repository adding a -comma-separated file of RGB values to the contrib_colormaps/colormaps +To add a colormap, open a pull request on this repository adding the following files: + +1. comma-separated file of RGB values to the contrib_colormaps/colormaps directory. This file should look like: ``` @@ -43,22 +44,16 @@ directory. This file should look like: 0,0.22113,0.96201 ``` -This PR should also include a new notebook in -[examples/colormaps](examples/colormaps) with a name that matches the -name of the csv (e.g. for a new colormap called 'rainforest' with a csv -'rainforest.csv' there should be a corresponding 'rainforest.ipynb'). +2. A Jupyter notebook in[examples/colormaps](examples/colormaps) meeting the following criteria: -The last requirement is that you regenerate the baseline images used for tests. -First make sure you have holoviews, matplotlib, and pytest-mpl in your -environment. Then change directories into tests, and regenerate the plots - -``` -cd contrib_colorcets/tests -pytest --mpl-generate-path=baseline -``` + 1. a name that matches the + name of the csv + e.g. for a new colormap called 'rainforest' with a csv 'rainforest.csv' there should be a corresponding 'rainforest.ipynb' + 2. an explaination of the colormap + 3. a swatch of the colormap + 3. at least one example plot using the colormap ## About PyViz - contrib_colormaps is part of the PyViz initiative for making Python-based visualization tools work well together. See [pyviz.org](http://pyviz.org). diff --git a/contrib_colormaps/plotting.py b/contrib_colormaps/plotting.py index 3efe179..c62ec74 100644 --- a/contrib_colormaps/plotting.py +++ b/contrib_colormaps/plotting.py @@ -26,10 +26,16 @@ def swatch(name, bounds=None, array=array, **kwargs): default_tools=['xwheel_zoom', 'xpan', 'save', 'reset'], cmap=palette[name])) if 'matplotlib' in backends: - aspect = kwargs.pop('aspect', 15) - fig_size = kwargs.pop('fig_size',350) - plot.opts(opts.Image(backend='matplotlib', aspect=aspect, fig_size=fig_size, - cmap=cm[name])) + def hook(plot, element): + plot.handles['axis'].axis('off') + plot.handles['axis'].set_title("sample", loc='left', + fontfamily='DejaVu Sans', fontsize=14, + fontweight='roman',fontstretch='semi-expanded') + + aspect = kwargs.pop('aspect', 10) + fig_size = kwargs.pop('fig_size',300) + + plot.opts(opts.Image(backend='matplotlib', aspect=aspect, fig_size=fig_size, title="", cmap=cm[name], hooks=[hook])) return plot.opts(opts.Image(xaxis=None, yaxis=None), opts.Image(**kwargs)) diff --git a/examples/colormaps/index.ipynb b/examples/colormaps/index.ipynb index 0c88a38..925bd1a 100644 --- a/examples/colormaps/index.ipynb +++ b/examples/colormaps/index.ipynb @@ -30,7 +30,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -38,20 +38,7 @@ "text/html": [ "\n", "\n", - "\n", + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "function HoloViewsWidget() {\n", + "}\n", + "\n", + "HoloViewsWidget.prototype.init_slider = function(init_val){\n", + " if(this.load_json) {\n", + " this.from_json()\n", + " } else {\n", + " this.update_cache();\n", + " }\n", + "}\n", + "\n", + "HoloViewsWidget.prototype.populate_cache = function(idx){\n", + " this.cache[idx].innerHTML = this.frames[idx];\n", + " if (this.embed) {\n", + " delete this.frames[idx];\n", + " }\n", + "}\n", + "\n", + "HoloViewsWidget.prototype.process_error = function(msg){\n", + "}\n", + "\n", + "HoloViewsWidget.prototype.from_json = function() {\n", + " var data_url = this.json_path + this.id + '.json';\n", + " $.getJSON(data_url, $.proxy(function(json_data) {\n", + " this.frames = json_data;\n", + " this.update_cache();\n", + " this.update(0);\n", + " }, this));\n", + "}\n", + "\n", + "HoloViewsWidget.prototype.dynamic_update = function(current){\n", + " if (current === undefined) {\n", + " return\n", + " }\n", + " this.current = current;\n", + " if (this.comm) {\n", + " var msg = {comm_id: this.id+'_client', content: current}\n", + " this.comm.send(msg);\n", + " }\n", + "}\n", + "\n", + "HoloViewsWidget.prototype.update_cache = function(force){\n", + " var frame_len = Object.keys(this.frames).length;\n", + " for (var i=0; i 0) {\n", + " that.time = Date.now();\n", + " that.dynamic_update(that.queue[that.queue.length-1]);\n", + " that.queue = [];\n", + " } else {\n", + " that.wait = false;\n", + " }\n", + " if ((msg.msg_type == \"Ready\") && msg.content) {\n", + " console.log(\"Python callback returned following output:\", msg.content);\n", + " } else if (msg.msg_type == \"Error\") {\n", + " console.log(\"Python failed with the following traceback:\", msg.traceback)\n", + " }\n", + " }\n", + " var comm = HoloViews.comm_manager.get_client_comm(this.plot_id, this.id+'_client', ack_callback);\n", + " return comm\n", + " }\n", + "}\n", + "\n", + "HoloViewsWidget.prototype.msg_handler = function(msg) {\n", + " var metadata = msg.metadata;\n", + " if ((metadata.msg_type == \"Ready\")) {\n", + " if (metadata.content) {\n", + " console.log(\"Python callback returned following output:\", metadata.content);\n", + " }\n", + "\treturn;\n", + " } else if (metadata.msg_type == \"Error\") {\n", + " console.log(\"Python failed with the following traceback:\", metadata.traceback)\n", + " return\n", + " }\n", + " this.process_msg(msg)\n", + "}\n", + "\n", + "HoloViewsWidget.prototype.process_msg = function(msg) {\n", + "}\n", + "\n", + "function SelectionWidget(frames, id, slider_ids, keyMap, dim_vals, notFound, load_json, mode, cached, json_path, dynamic, plot_id){\n", + " this.frames = frames;\n", + " this.id = id;\n", + " this.plot_id = plot_id;\n", + " this.slider_ids = slider_ids;\n", + " this.keyMap = keyMap\n", + " this.current_frame = 0;\n", + " this.current_vals = dim_vals;\n", + " this.load_json = load_json;\n", + " this.mode = mode;\n", + " this.notFound = notFound;\n", + " this.cached = cached;\n", + " this.dynamic = dynamic;\n", + " this.cache = {};\n", + " this.json_path = json_path;\n", + " this.init_slider(this.current_vals[0]);\n", + " this.queue = [];\n", + " this.wait = false;\n", + " if (!this.cached || this.dynamic) {\n", + " this.comm = this.init_comms();\n", + " }\n", + "}\n", + "\n", + "SelectionWidget.prototype = new HoloViewsWidget;\n", + "\n", + "\n", + "SelectionWidget.prototype.get_key = function(current_vals) {\n", + " var key = \"(\";\n", + " for (var i=0; i Date.now()))) {\n", + " this.queue.push(key);\n", + " return\n", + " }\n", + " this.queue = [];\n", + " this.time = Date.now();\n", + " this.current_frame = key;\n", + " this.wait = true;\n", + " this.dynamic_update(key)\n", + " } else if (key !== undefined) {\n", + " this.update(key)\n", + " }\n", + "}\n", + "\n", + "\n", + "/* Define the ScrubberWidget class */\n", + "function ScrubberWidget(frames, num_frames, id, interval, load_json, mode, cached, json_path, dynamic, plot_id){\n", + " this.slider_id = \"_anim_slider\" + id;\n", + " this.loop_select_id = \"_anim_loop_select\" + id;\n", + " this.id = id;\n", + " this.plot_id = plot_id;\n", + " this.interval = interval;\n", + " this.current_frame = 0;\n", + " this.direction = 0;\n", + " this.dynamic = dynamic;\n", + " this.timer = null;\n", + " this.load_json = load_json;\n", + " this.mode = mode;\n", + " this.cached = cached;\n", + " this.frames = frames;\n", + " this.cache = {};\n", + " this.length = num_frames;\n", + " this.json_path = json_path;\n", + " document.getElementById(this.slider_id).max = this.length - 1;\n", + " this.init_slider(0);\n", + " this.wait = false;\n", + " this.queue = [];\n", + " if (!this.cached || this.dynamic) {\n", + " this.comm = this.init_comms()\n", + " }\n", + "}\n", + "\n", + "ScrubberWidget.prototype = new HoloViewsWidget;\n", + "\n", + "ScrubberWidget.prototype.set_frame = function(frame){\n", + " this.current_frame = frame;\n", + " var widget = document.getElementById(this.slider_id);\n", + " if (widget === null) {\n", + " this.pause_animation();\n", + " return\n", + " }\n", + " widget.value = this.current_frame;\n", + " if (this.dynamic || !this.cached) {\n", + " if ((this.time !== undefined) && ((this.wait) && ((this.time + 10000) > Date.now()))) {\n", + " this.queue.push(frame);\n", + " return\n", + " }\n", + " this.queue = [];\n", + " this.time = Date.now();\n", + " this.wait = true;\n", + " this.dynamic_update(frame)\n", + " } else {\n", + " this.update(frame)\n", + " }\n", + "}\n", + "\n", + "ScrubberWidget.prototype.get_loop_state = function(){\n", + " var button_group = document[this.loop_select_id].state;\n", + " for (var i = 0; i < button_group.length; i++) {\n", + " var button = button_group[i];\n", + " if (button.checked) {\n", + " return button.value;\n", + " }\n", + " }\n", + " return undefined;\n", + "}\n", + "\n", + "\n", + "ScrubberWidget.prototype.next_frame = function() {\n", + " this.set_frame(Math.min(this.length - 1, this.current_frame + 1));\n", + "}\n", + "\n", + "ScrubberWidget.prototype.previous_frame = function() {\n", + " this.set_frame(Math.max(0, this.current_frame - 1));\n", + "}\n", + "\n", + "ScrubberWidget.prototype.first_frame = function() {\n", + " this.set_frame(0);\n", + "}\n", + "\n", + "ScrubberWidget.prototype.last_frame = function() {\n", + " this.set_frame(this.length - 1);\n", + "}\n", + "\n", + "ScrubberWidget.prototype.slower = function() {\n", + " this.interval /= 0.7;\n", + " if(this.direction > 0){this.play_animation();}\n", + " else if(this.direction < 0){this.reverse_animation();}\n", + "}\n", + "\n", + "ScrubberWidget.prototype.faster = function() {\n", + " this.interval *= 0.7;\n", + " if(this.direction > 0){this.play_animation();}\n", + " else if(this.direction < 0){this.reverse_animation();}\n", + "}\n", + "\n", + "ScrubberWidget.prototype.anim_step_forward = function() {\n", + " if(this.current_frame < this.length - 1){\n", + " this.next_frame();\n", + " }else{\n", + " var loop_state = this.get_loop_state();\n", + " if(loop_state == \"loop\"){\n", + " this.first_frame();\n", + " }else if(loop_state == \"reflect\"){\n", + " this.last_frame();\n", + " this.reverse_animation();\n", + " }else{\n", + " this.pause_animation();\n", + " this.last_frame();\n", + " }\n", + " }\n", + "}\n", + "\n", + "ScrubberWidget.prototype.anim_step_reverse = function() {\n", + " if(this.current_frame > 0){\n", + " this.previous_frame();\n", + " } else {\n", + " var loop_state = this.get_loop_state();\n", + " if(loop_state == \"loop\"){\n", + " this.last_frame();\n", + " }else if(loop_state == \"reflect\"){\n", + " this.first_frame();\n", + " this.play_animation();\n", + " }else{\n", + " this.pause_animation();\n", + " this.first_frame();\n", + " }\n", + " }\n", + "}\n", + "\n", + "ScrubberWidget.prototype.pause_animation = function() {\n", + " this.direction = 0;\n", + " if (this.timer){\n", + " clearInterval(this.timer);\n", + " this.timer = null;\n", + " }\n", + "}\n", + "\n", + "ScrubberWidget.prototype.play_animation = function() {\n", + " this.pause_animation();\n", + " this.direction = 1;\n", + " var t = this;\n", + " if (!this.timer) this.timer = setInterval(function(){t.anim_step_forward();}, this.interval);\n", + "}\n", + "\n", + "ScrubberWidget.prototype.reverse_animation = function() {\n", + " this.pause_animation();\n", + " this.direction = -1;\n", + " var t = this;\n", + " if (!this.timer) this.timer = setInterval(function(){t.anim_step_reverse();}, this.interval);\n", + "}\n", + "\n", + "function extend(destination, source) {\n", + " for (var k in source) {\n", + " if (source.hasOwnProperty(k)) {\n", + " destination[k] = source[k];\n", + " }\n", + " }\n", + " return destination;\n", + "}\n", + "\n", + "function update_widget(widget, values) {\n", + " if (widget.hasClass(\"ui-slider\")) {\n", + " widget.slider('option', {\n", + " min: 0,\n", + " max: values.length-1,\n", + " dim_vals: values,\n", + " value: 0,\n", + " dim_labels: values\n", + " })\n", + " widget.slider('option', 'slide').call(widget, event, {value: 0})\n", + " } else {\n", + " widget.empty();\n", + " for (var i=0; i\", {\n", + " value: i,\n", + " text: values[i]\n", + " }))\n", + " };\n", + " widget.data('values', values);\n", + " widget.data('value', 0);\n", + " widget.trigger(\"change\");\n", + " };\n", + "}\n", + "\n", + "function init_slider(id, plot_id, dim, values, next_vals, labels, dynamic, step, value, next_dim,\n", + " dim_idx, delay, jQueryUI_CDN, UNDERSCORE_CDN) {\n", + " // Slider JS Block START\n", + " function loadcssfile(filename){\n", + " var fileref=document.createElement(\"link\")\n", + " fileref.setAttribute(\"rel\", \"stylesheet\")\n", + " fileref.setAttribute(\"type\", \"text/css\")\n", + " fileref.setAttribute(\"href\", filename)\n", + " document.getElementsByTagName(\"head\")[0].appendChild(fileref)\n", + " }\n", + " loadcssfile(\"https://code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css\");\n", + " /* Check if jQuery and jQueryUI have been loaded\n", + " otherwise load with require.js */\n", + " var jQuery = window.jQuery,\n", + " // check for old versions of jQuery\n", + " oldjQuery = jQuery && !!jQuery.fn.jquery.match(/^1\\.[0-4](\\.|$)/),\n", + " jquery_path = '',\n", + " paths = {},\n", + " noConflict;\n", + " var jQueryUI = jQuery.ui;\n", + " // check for jQuery\n", + " if (!jQuery || oldjQuery) {\n", + " // load if it's not available or doesn't meet min standards\n", + " paths.jQuery = jQuery;\n", + " noConflict = !!oldjQuery;\n", + " } else {\n", + " // register the current jQuery\n", + " define('jquery', [], function() { return jQuery; });\n", + " }\n", + " if (!jQueryUI) {\n", + " paths.jQueryUI = jQueryUI_CDN.slice(null, -3);\n", + " } else {\n", + " define('jQueryUI', [], function() { return jQuery.ui; });\n", + " }\n", + " paths.underscore = UNDERSCORE_CDN.slice(null, -3);\n", + " var jquery_require = {\n", + " paths: paths,\n", + " shim: {\n", + " \"jQueryUI\": {\n", + " exports:\"$\",\n", + " deps: ['jquery']\n", + " },\n", + " \"underscore\": {\n", + " exports: '_'\n", + " }\n", + " }\n", + " }\n", + " require.config(jquery_require);\n", + " require([\"jQueryUI\", \"underscore\"], function(jUI, _){\n", + " if (noConflict) $.noConflict(true);\n", + " var vals = values;\n", + " if (dynamic && vals.constructor === Array) {\n", + " var default_value = parseFloat(value);\n", + " var min = parseFloat(vals[0]);\n", + " var max = parseFloat(vals[vals.length-1]);\n", + " var wstep = step;\n", + " var wlabels = [default_value];\n", + " var init_label = default_value;\n", + " } else {\n", + " var min = 0;\n", + " if (dynamic) {\n", + " var max = Object.keys(vals).length - 1;\n", + " var init_label = labels[value];\n", + " var default_value = values[value];\n", + " } else {\n", + " var max = vals.length - 1;\n", + " var init_label = labels[value];\n", + " var default_value = value;\n", + " }\n", + " var wstep = 1;\n", + " var wlabels = labels;\n", + " }\n", + " function adjustFontSize(text) {\n", + " var width_ratio = (text.parent().width()/8)/text.val().length;\n", + " var size = Math.min(0.9, Math.max(0.6, width_ratio))+'em';\n", + " text.css('font-size', size);\n", + " }\n", + " var slider = $('#_anim_widget'+id+'_'+dim);\n", + " slider.slider({\n", + " animate: \"fast\",\n", + " min: min,\n", + " max: max,\n", + " step: wstep,\n", + " value: default_value,\n", + " dim_vals: vals,\n", + " dim_labels: wlabels,\n", + " next_vals: next_vals,\n", + " slide: function(event, ui) {\n", + " var vals = slider.slider(\"option\", \"dim_vals\");\n", + " var next_vals = slider.slider(\"option\", \"next_vals\");\n", + " var dlabels = slider.slider(\"option\", \"dim_labels\");\n", + " if (dynamic) {\n", + " var dim_val = ui.value;\n", + " if (vals.constructor === Array) {\n", + " var label = ui.value;\n", + " } else {\n", + " var label = dlabels[ui.value];\n", + " }\n", + " } else {\n", + " var dim_val = vals[ui.value];\n", + " var label = dlabels[ui.value];\n", + " }\n", + " var text = $('#textInput'+id+'_'+dim);\n", + " text.val(label);\n", + " adjustFontSize(text);\n", + " HoloViews.index[plot_id].set_frame(dim_val, dim_idx);\n", + " if (Object.keys(next_vals).length > 0) {\n", + " var new_vals = next_vals[dim_val];\n", + " var next_widget = $('#_anim_widget'+id+'_'+next_dim);\n", + " update_widget(next_widget, new_vals);\n", + " }\n", + " }\n", + " });\n", + " slider.keypress(function(event) {\n", + " if (event.which == 80 || event.which == 112) {\n", + " var start = slider.slider(\"option\", \"value\");\n", + " var stop = slider.slider(\"option\", \"max\");\n", + " for (var i=start; i<=stop; i++) {\n", + " var delay = i*delay;\n", + " $.proxy(function doSetTimeout(i) { setTimeout($.proxy(function() {\n", + " var val = {value:i};\n", + " slider.slider('value',i);\n", + " slider.slider(\"option\", \"slide\")(null, val);\n", + " }, slider), delay);}, slider)(i);\n", + " }\n", + " }\n", + " if (event.which == 82 || event.which == 114) {\n", + " var start = slider.slider(\"option\", \"value\");\n", + " var stop = slider.slider(\"option\", \"min\");\n", + " var count = 0;\n", + " for (var i=start; i>=stop; i--) {\n", + " var delay = count*delay;\n", + " count = count + 1;\n", + " $.proxy(function doSetTimeout(i) { setTimeout($.proxy(function() {\n", + " var val = {value:i};\n", + " slider.slider('value',i);\n", + " slider.slider(\"option\", \"slide\")(null, val);\n", + " }, slider), delay);}, slider)(i);\n", + " }\n", + " }\n", + " });\n", + " var textInput = $('#textInput'+id+'_'+dim)\n", + " textInput.val(init_label);\n", + " adjustFontSize(textInput);\n", + " });\n", + "}\n", + "\n", + "function init_dropdown(id, plot_id, dim, vals, value, next_vals, labels, next_dim, dim_idx, dynamic) {\n", + " var widget = $(\"#_anim_widget\"+id+'_'+dim);\n", + " widget.data('values', vals)\n", + " for (var i=0; i\", {\n", + " value: val,\n", + " text: labels[i]\n", + " }));\n", + " };\n", + " widget.data(\"next_vals\", next_vals);\n", + " widget.val(value);\n", + " widget.on('change', function(event, ui) {\n", + " if (dynamic) {\n", + " var dim_val = parseInt(this.value);\n", + " } else {\n", + " var dim_val = $.data(this, 'values')[this.value];\n", + " }\n", + " var next_vals = $.data(this, \"next_vals\");\n", + " if (Object.keys(next_vals).length > 0) {\n", + " var new_vals = next_vals[dim_val];\n", + " var next_widget = $('#_anim_widget'+id+'_'+next_dim);\n", + " update_widget(next_widget, new_vals);\n", + " }\n", + " var widgets = HoloViews.index[plot_id]\n", + " if (widgets) {\n", + " widgets.set_frame(dim_val, dim_idx);\n", + " }\n", + " });\n", + "}\n", + "\n", + "\n", + "if (window.HoloViews === undefined) {\n", + " window.HoloViews = {}\n", + " window.PyViz = window.HoloViews\n", + "} else if (window.PyViz === undefined) {\n", + " window.PyViz = window.HoloViews\n", + "}\n", + "\n", + "\n", + "var _namespace = {\n", + " init_slider: init_slider,\n", + " init_dropdown: init_dropdown,\n", + " comms: {},\n", + " comm_status: {},\n", + " index: {},\n", + " plot_index: {},\n", + " kernels: {},\n", + " receivers: {}\n", + "}\n", + "\n", + "for (var k in _namespace) {\n", + " if (!(k in window.HoloViews)) {\n", + " window.HoloViews[k] = _namespace[k];\n", + " }\n", + "}\n", + "\n", + "// Define Bokeh specific subclasses\n", + "function BokehSelectionWidget() {\n", + " SelectionWidget.apply(this, arguments);\n", + "}\n", + "\n", + "function BokehScrubberWidget() {\n", + " ScrubberWidget.apply(this, arguments);\n", + "}\n", + "\n", + "// Let them inherit from the baseclasses\n", + "BokehSelectionWidget.prototype = Object.create(SelectionWidget.prototype);\n", + "BokehScrubberWidget.prototype = Object.create(ScrubberWidget.prototype);\n", + "\n", + "// Define methods to override on widgets\n", + "var BokehMethods = {\n", + " update_cache : function(){\n", + " for (var index in this.frames) {\n", + " this.frames[index] = JSON.parse(this.frames[index]);\n", + " }\n", + " },\n", + " update : function(current){\n", + " if (current === undefined) {\n", + " return;\n", + " }\n", + " var data = this.frames[current];\n", + " if (data !== undefined) {\n", + " if (data.root in HoloViews.plot_index) {\n", + " var doc = HoloViews.plot_index[data.root].model.document;\n", + " } else {\n", + " var doc = Bokeh.index[data.root].model.document;\n", + " }\n", + " doc.apply_json_patch(data.content);\n", + " }\n", + " },\n", + " init_comms: function() {\n", + " if (Bokeh.protocol !== undefined) {\n", + " this.receiver = new Bokeh.protocol.Receiver()\n", + " } else {\n", + " this.receiver = null;\n", + " }\n", + " return HoloViewsWidget.prototype.init_comms.call(this);\n", + " },\n", + " process_msg : function(msg) {\n", + " if (this.plot_id in HoloViews.plot_index) {\n", + " var doc = HoloViews.plot_index[this.plot_id].model.document;\n", + " } else {\n", + " var doc = Bokeh.index[this.plot_id].model.document;\n", + " }\n", + " if (this.receiver === null) { return }\n", + " var receiver = this.receiver;\n", + " if (msg.buffers.length > 0) {\n", + " receiver.consume(msg.buffers[0].buffer)\n", + " } else {\n", + " receiver.consume(msg.content.data)\n", + " }\n", + " const comm_msg = receiver.message;\n", + " if ((comm_msg != null) && (doc != null)) {\n", + " doc.apply_json_patch(comm_msg.content, comm_msg.buffers)\n", + " }\n", + " }\n", + "}\n", + "\n", + "// Extend Bokeh widgets with backend specific methods\n", + "extend(BokehSelectionWidget.prototype, BokehMethods);\n", + "extend(BokehScrubberWidget.prototype, BokehMethods);\n", + "\n", + "window.HoloViews.BokehSelectionWidget = BokehSelectionWidget\n", + "window.HoloViews.BokehScrubberWidget = BokehScrubberWidget\n", + "\n", + "// Define MPL specific subclasses\n", + "function MPLSelectionWidget() {\n", + " SelectionWidget.apply(this, arguments);\n", + "}\n", + "\n", + "function MPLScrubberWidget() {\n", + " ScrubberWidget.apply(this, arguments);\n", + "}\n", + "\n", + "// Let them inherit from the baseclasses\n", + "MPLSelectionWidget.prototype = Object.create(SelectionWidget.prototype);\n", + "MPLScrubberWidget.prototype = Object.create(ScrubberWidget.prototype);\n", + "\n", + "// Define methods to override on widgets\n", + "var MPLMethods = {\n", + " init_slider : function(init_val){\n", + " if(this.load_json) {\n", + " this.from_json()\n", + " } else {\n", + " this.update_cache();\n", + " }\n", + " if (this.dynamic | !this.cached | (this.current_vals === undefined)) {\n", + " this.update(0)\n", + " } else {\n", + " this.set_frame(this.current_vals[0], 0)\n", + " }\n", + " },\n", + " process_msg : function(msg) {\n", + " var data = msg.content.data;\n", + " this.frames[this.current] = data;\n", + " this.update_cache(true);\n", + " this.update(this.current);\n", + " }\n", + "}\n", + "// Extend MPL widgets with backend specific methods\n", + "extend(MPLSelectionWidget.prototype, MPLMethods);\n", + "extend(MPLScrubberWidget.prototype, MPLMethods);\n", + "\n", + "window.HoloViews.MPLSelectionWidget = MPLSelectionWidget\n", + "window.HoloViews.MPLScrubberWidget = MPLScrubberWidget\n", + "\n", + " function JupyterCommManager() {\n", + " }\n", + "\n", + " JupyterCommManager.prototype.register_target = function(plot_id, comm_id, msg_handler) {\n", + " if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n", + " var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n", + " comm_manager.register_target(comm_id, function(comm) {\n", + " comm.on_msg(msg_handler);\n", + " });\n", + " } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n", + " window.PyViz.kernels[plot_id].registerCommTarget(comm_id, function(comm) {\n", + " comm.onMsg = msg_handler;\n", + " });\n", + " }\n", + " }\n", + "\n", + " JupyterCommManager.prototype.get_client_comm = function(plot_id, comm_id, msg_handler) {\n", + " if (comm_id in window.PyViz.comms) {\n", + " return window.PyViz.comms[comm_id];\n", + " } else if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n", + " var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n", + " var comm = comm_manager.new_comm(comm_id, {}, {}, {}, comm_id);\n", + " if (msg_handler) {\n", + " comm.on_msg(msg_handler);\n", + " }\n", + " } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n", + " var comm = window.PyViz.kernels[plot_id].connectToComm(comm_id);\n", + " comm.open();\n", + " if (msg_handler) {\n", + " comm.onMsg = msg_handler;\n", + " }\n", + " }\n", + "\n", + " window.PyViz.comms[comm_id] = comm;\n", + " return comm;\n", + " }\n", + "\n", + " window.PyViz.comm_manager = new JupyterCommManager();\n", + " \n", + "\n", + "var JS_MIME_TYPE = 'application/javascript';\n", + "var HTML_MIME_TYPE = 'text/html';\n", + "var EXEC_MIME_TYPE = 'application/vnd.holoviews_exec.v0+json';\n", + "var CLASS_NAME = 'output';\n", + "\n", + "/**\n", + " * Render data to the DOM node\n", + " */\n", + "function render(props, node) {\n", + " var div = document.createElement(\"div\");\n", + " var script = document.createElement(\"script\");\n", + " node.appendChild(div);\n", + " node.appendChild(script);\n", + "}\n", + "\n", + "/**\n", + " * Handle when a new output is added\n", + " */\n", + "function handle_add_output(event, handle) {\n", + " var output_area = handle.output_area;\n", + " var output = handle.output;\n", + " if ((output.data == undefined) || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n", + " return\n", + " }\n", + " var id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n", + " var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n", + " if (id !== undefined) {\n", + " var nchildren = toinsert.length;\n", + " var html_node = toinsert[nchildren-1].children[0];\n", + " html_node.innerHTML = output.data[HTML_MIME_TYPE];\n", + " var scripts = [];\n", + " var nodelist = html_node.querySelectorAll(\"script\");\n", + " for (var i in nodelist) {\n", + " if (nodelist.hasOwnProperty(i)) {\n", + " scripts.push(nodelist[i])\n", + " }\n", + " }\n", + "\n", + " scripts.forEach( function (oldScript) {\n", + " var newScript = document.createElement(\"script\");\n", + " var attrs = [];\n", + " var nodemap = oldScript.attributes;\n", + " for (var j in nodemap) {\n", + " if (nodemap.hasOwnProperty(j)) {\n", + " attrs.push(nodemap[j])\n", + " }\n", + " }\n", + " attrs.forEach(function(attr) { newScript.setAttribute(attr.name, attr.value) });\n", + " newScript.appendChild(document.createTextNode(oldScript.innerHTML));\n", + " oldScript.parentNode.replaceChild(newScript, oldScript);\n", + " });\n", + " if (JS_MIME_TYPE in output.data) {\n", + " toinsert[nchildren-1].children[1].textContent = output.data[JS_MIME_TYPE];\n", + " }\n", + " output_area._hv_plot_id = id;\n", + " if ((window.Bokeh !== undefined) && (id in Bokeh.index)) {\n", + " window.PyViz.plot_index[id] = Bokeh.index[id];\n", + " } else {\n", + " window.PyViz.plot_index[id] = null;\n", + " }\n", + " } else if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n", + " var bk_div = document.createElement(\"div\");\n", + " bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n", + " var script_attrs = bk_div.children[0].attributes;\n", + " for (var i = 0; i < script_attrs.length; i++) {\n", + " toinsert[toinsert.length - 1].childNodes[1].setAttribute(script_attrs[i].name, script_attrs[i].value);\n", + " }\n", + " // store reference to server id on output_area\n", + " output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n", + " }\n", + "}\n", + "\n", + "/**\n", + " * Handle when an output is cleared or removed\n", + " */\n", + "function handle_clear_output(event, handle) {\n", + " var id = handle.cell.output_area._hv_plot_id;\n", + " var server_id = handle.cell.output_area._bokeh_server_id;\n", + " if (((id === undefined) || !(id in PyViz.plot_index)) && (server_id !== undefined)) { return; }\n", + " var comm = window.PyViz.comm_manager.get_client_comm(\"hv-extension-comm\", \"hv-extension-comm\", function () {});\n", + " if (server_id !== null) {\n", + " comm.send({event_type: 'server_delete', 'id': server_id});\n", + " return;\n", + " } else if (comm !== null) {\n", + " comm.send({event_type: 'delete', 'id': id});\n", + " }\n", + " delete PyViz.plot_index[id];\n", + " if ((window.Bokeh !== undefined) & (id in window.Bokeh.index)) {\n", + " var doc = window.Bokeh.index[id].model.document\n", + " doc.clear();\n", + " const i = window.Bokeh.documents.indexOf(doc);\n", + " if (i > -1) {\n", + " window.Bokeh.documents.splice(i, 1);\n", + " }\n", + " }\n", + "}\n", + "\n", + "/**\n", + " * Handle kernel restart event\n", + " */\n", + "function handle_kernel_cleanup(event, handle) {\n", + " delete PyViz.comms[\"hv-extension-comm\"];\n", + " window.PyViz.plot_index = {}\n", + "}\n", + "\n", + "/**\n", + " * Handle update_display_data messages\n", + " */\n", + "function handle_update_output(event, handle) {\n", + " handle_clear_output(event, {cell: {output_area: handle.output_area}})\n", + " handle_add_output(event, handle)\n", + "}\n", + "\n", + "function register_renderer(events, OutputArea) {\n", + " function append_mime(data, metadata, element) {\n", + " // create a DOM node to render to\n", + " var toinsert = this.create_output_subarea(\n", + " metadata,\n", + " CLASS_NAME,\n", + " EXEC_MIME_TYPE\n", + " );\n", + " this.keyboard_manager.register_events(toinsert);\n", + " // Render to node\n", + " var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n", + " render(props, toinsert[0]);\n", + " element.append(toinsert);\n", + " return toinsert\n", + " }\n", + "\n", + " events.on('output_added.OutputArea', handle_add_output);\n", + " events.on('output_updated.OutputArea', handle_update_output);\n", + " events.on('clear_output.CodeCell', handle_clear_output);\n", + " events.on('delete.Cell', handle_clear_output);\n", + " events.on('kernel_ready.Kernel', handle_kernel_cleanup);\n", + "\n", + " OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n", + " safe: true,\n", + " index: 0\n", + " });\n", + "}\n", + "\n", + "if (window.Jupyter !== undefined) {\n", + " try {\n", + " var events = require('base/js/events');\n", + " var OutputArea = require('notebook/js/outputarea').OutputArea;\n", + " if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n", + " register_renderer(events, OutputArea);\n", + " }\n", + " } catch(err) {\n", + " }\n", + "}\n" + ], + "application/vnd.holoviews_load.v0+json": "function HoloViewsWidget() {\n}\n\nHoloViewsWidget.prototype.init_slider = function(init_val){\n if(this.load_json) {\n this.from_json()\n } else {\n this.update_cache();\n }\n}\n\nHoloViewsWidget.prototype.populate_cache = function(idx){\n this.cache[idx].innerHTML = this.frames[idx];\n if (this.embed) {\n delete this.frames[idx];\n }\n}\n\nHoloViewsWidget.prototype.process_error = function(msg){\n}\n\nHoloViewsWidget.prototype.from_json = function() {\n var data_url = this.json_path + this.id + '.json';\n $.getJSON(data_url, $.proxy(function(json_data) {\n this.frames = json_data;\n this.update_cache();\n this.update(0);\n }, this));\n}\n\nHoloViewsWidget.prototype.dynamic_update = function(current){\n if (current === undefined) {\n return\n }\n this.current = current;\n if (this.comm) {\n var msg = {comm_id: this.id+'_client', content: current}\n this.comm.send(msg);\n }\n}\n\nHoloViewsWidget.prototype.update_cache = function(force){\n var frame_len = Object.keys(this.frames).length;\n for (var i=0; i 0) {\n that.time = Date.now();\n that.dynamic_update(that.queue[that.queue.length-1]);\n that.queue = [];\n } else {\n that.wait = false;\n }\n if ((msg.msg_type == \"Ready\") && msg.content) {\n console.log(\"Python callback returned following output:\", msg.content);\n } else if (msg.msg_type == \"Error\") {\n console.log(\"Python failed with the following traceback:\", msg.traceback)\n }\n }\n var comm = HoloViews.comm_manager.get_client_comm(this.plot_id, this.id+'_client', ack_callback);\n return comm\n }\n}\n\nHoloViewsWidget.prototype.msg_handler = function(msg) {\n var metadata = msg.metadata;\n if ((metadata.msg_type == \"Ready\")) {\n if (metadata.content) {\n console.log(\"Python callback returned following output:\", metadata.content);\n }\n\treturn;\n } else if (metadata.msg_type == \"Error\") {\n console.log(\"Python failed with the following traceback:\", metadata.traceback)\n return\n }\n this.process_msg(msg)\n}\n\nHoloViewsWidget.prototype.process_msg = function(msg) {\n}\n\nfunction SelectionWidget(frames, id, slider_ids, keyMap, dim_vals, notFound, load_json, mode, cached, json_path, dynamic, plot_id){\n this.frames = frames;\n this.id = id;\n this.plot_id = plot_id;\n this.slider_ids = slider_ids;\n this.keyMap = keyMap\n this.current_frame = 0;\n this.current_vals = dim_vals;\n this.load_json = load_json;\n this.mode = mode;\n this.notFound = notFound;\n this.cached = cached;\n this.dynamic = dynamic;\n this.cache = {};\n this.json_path = json_path;\n this.init_slider(this.current_vals[0]);\n this.queue = [];\n this.wait = false;\n if (!this.cached || this.dynamic) {\n this.comm = this.init_comms();\n }\n}\n\nSelectionWidget.prototype = new HoloViewsWidget;\n\n\nSelectionWidget.prototype.get_key = function(current_vals) {\n var key = \"(\";\n for (var i=0; i Date.now()))) {\n this.queue.push(key);\n return\n }\n this.queue = [];\n this.time = Date.now();\n this.current_frame = key;\n this.wait = true;\n this.dynamic_update(key)\n } else if (key !== undefined) {\n this.update(key)\n }\n}\n\n\n/* Define the ScrubberWidget class */\nfunction ScrubberWidget(frames, num_frames, id, interval, load_json, mode, cached, json_path, dynamic, plot_id){\n this.slider_id = \"_anim_slider\" + id;\n this.loop_select_id = \"_anim_loop_select\" + id;\n this.id = id;\n this.plot_id = plot_id;\n this.interval = interval;\n this.current_frame = 0;\n this.direction = 0;\n this.dynamic = dynamic;\n this.timer = null;\n this.load_json = load_json;\n this.mode = mode;\n this.cached = cached;\n this.frames = frames;\n this.cache = {};\n this.length = num_frames;\n this.json_path = json_path;\n document.getElementById(this.slider_id).max = this.length - 1;\n this.init_slider(0);\n this.wait = false;\n this.queue = [];\n if (!this.cached || this.dynamic) {\n this.comm = this.init_comms()\n }\n}\n\nScrubberWidget.prototype = new HoloViewsWidget;\n\nScrubberWidget.prototype.set_frame = function(frame){\n this.current_frame = frame;\n var widget = document.getElementById(this.slider_id);\n if (widget === null) {\n this.pause_animation();\n return\n }\n widget.value = this.current_frame;\n if (this.dynamic || !this.cached) {\n if ((this.time !== undefined) && ((this.wait) && ((this.time + 10000) > Date.now()))) {\n this.queue.push(frame);\n return\n }\n this.queue = [];\n this.time = Date.now();\n this.wait = true;\n this.dynamic_update(frame)\n } else {\n this.update(frame)\n }\n}\n\nScrubberWidget.prototype.get_loop_state = function(){\n var button_group = document[this.loop_select_id].state;\n for (var i = 0; i < button_group.length; i++) {\n var button = button_group[i];\n if (button.checked) {\n return button.value;\n }\n }\n return undefined;\n}\n\n\nScrubberWidget.prototype.next_frame = function() {\n this.set_frame(Math.min(this.length - 1, this.current_frame + 1));\n}\n\nScrubberWidget.prototype.previous_frame = function() {\n this.set_frame(Math.max(0, this.current_frame - 1));\n}\n\nScrubberWidget.prototype.first_frame = function() {\n this.set_frame(0);\n}\n\nScrubberWidget.prototype.last_frame = function() {\n this.set_frame(this.length - 1);\n}\n\nScrubberWidget.prototype.slower = function() {\n this.interval /= 0.7;\n if(this.direction > 0){this.play_animation();}\n else if(this.direction < 0){this.reverse_animation();}\n}\n\nScrubberWidget.prototype.faster = function() {\n this.interval *= 0.7;\n if(this.direction > 0){this.play_animation();}\n else if(this.direction < 0){this.reverse_animation();}\n}\n\nScrubberWidget.prototype.anim_step_forward = function() {\n if(this.current_frame < this.length - 1){\n this.next_frame();\n }else{\n var loop_state = this.get_loop_state();\n if(loop_state == \"loop\"){\n this.first_frame();\n }else if(loop_state == \"reflect\"){\n this.last_frame();\n this.reverse_animation();\n }else{\n this.pause_animation();\n this.last_frame();\n }\n }\n}\n\nScrubberWidget.prototype.anim_step_reverse = function() {\n if(this.current_frame > 0){\n this.previous_frame();\n } else {\n var loop_state = this.get_loop_state();\n if(loop_state == \"loop\"){\n this.last_frame();\n }else if(loop_state == \"reflect\"){\n this.first_frame();\n this.play_animation();\n }else{\n this.pause_animation();\n this.first_frame();\n }\n }\n}\n\nScrubberWidget.prototype.pause_animation = function() {\n this.direction = 0;\n if (this.timer){\n clearInterval(this.timer);\n this.timer = null;\n }\n}\n\nScrubberWidget.prototype.play_animation = function() {\n this.pause_animation();\n this.direction = 1;\n var t = this;\n if (!this.timer) this.timer = setInterval(function(){t.anim_step_forward();}, this.interval);\n}\n\nScrubberWidget.prototype.reverse_animation = function() {\n this.pause_animation();\n this.direction = -1;\n var t = this;\n if (!this.timer) this.timer = setInterval(function(){t.anim_step_reverse();}, this.interval);\n}\n\nfunction extend(destination, source) {\n for (var k in source) {\n if (source.hasOwnProperty(k)) {\n destination[k] = source[k];\n }\n }\n return destination;\n}\n\nfunction update_widget(widget, values) {\n if (widget.hasClass(\"ui-slider\")) {\n widget.slider('option', {\n min: 0,\n max: values.length-1,\n dim_vals: values,\n value: 0,\n dim_labels: values\n })\n widget.slider('option', 'slide').call(widget, event, {value: 0})\n } else {\n widget.empty();\n for (var i=0; i\", {\n value: i,\n text: values[i]\n }))\n };\n widget.data('values', values);\n widget.data('value', 0);\n widget.trigger(\"change\");\n };\n}\n\nfunction init_slider(id, plot_id, dim, values, next_vals, labels, dynamic, step, value, next_dim,\n dim_idx, delay, jQueryUI_CDN, UNDERSCORE_CDN) {\n // Slider JS Block START\n function loadcssfile(filename){\n var fileref=document.createElement(\"link\")\n fileref.setAttribute(\"rel\", \"stylesheet\")\n fileref.setAttribute(\"type\", \"text/css\")\n fileref.setAttribute(\"href\", filename)\n document.getElementsByTagName(\"head\")[0].appendChild(fileref)\n }\n loadcssfile(\"https://code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css\");\n /* Check if jQuery and jQueryUI have been loaded\n otherwise load with require.js */\n var jQuery = window.jQuery,\n // check for old versions of jQuery\n oldjQuery = jQuery && !!jQuery.fn.jquery.match(/^1\\.[0-4](\\.|$)/),\n jquery_path = '',\n paths = {},\n noConflict;\n var jQueryUI = jQuery.ui;\n // check for jQuery\n if (!jQuery || oldjQuery) {\n // load if it's not available or doesn't meet min standards\n paths.jQuery = jQuery;\n noConflict = !!oldjQuery;\n } else {\n // register the current jQuery\n define('jquery', [], function() { return jQuery; });\n }\n if (!jQueryUI) {\n paths.jQueryUI = jQueryUI_CDN.slice(null, -3);\n } else {\n define('jQueryUI', [], function() { return jQuery.ui; });\n }\n paths.underscore = UNDERSCORE_CDN.slice(null, -3);\n var jquery_require = {\n paths: paths,\n shim: {\n \"jQueryUI\": {\n exports:\"$\",\n deps: ['jquery']\n },\n \"underscore\": {\n exports: '_'\n }\n }\n }\n require.config(jquery_require);\n require([\"jQueryUI\", \"underscore\"], function(jUI, _){\n if (noConflict) $.noConflict(true);\n var vals = values;\n if (dynamic && vals.constructor === Array) {\n var default_value = parseFloat(value);\n var min = parseFloat(vals[0]);\n var max = parseFloat(vals[vals.length-1]);\n var wstep = step;\n var wlabels = [default_value];\n var init_label = default_value;\n } else {\n var min = 0;\n if (dynamic) {\n var max = Object.keys(vals).length - 1;\n var init_label = labels[value];\n var default_value = values[value];\n } else {\n var max = vals.length - 1;\n var init_label = labels[value];\n var default_value = value;\n }\n var wstep = 1;\n var wlabels = labels;\n }\n function adjustFontSize(text) {\n var width_ratio = (text.parent().width()/8)/text.val().length;\n var size = Math.min(0.9, Math.max(0.6, width_ratio))+'em';\n text.css('font-size', size);\n }\n var slider = $('#_anim_widget'+id+'_'+dim);\n slider.slider({\n animate: \"fast\",\n min: min,\n max: max,\n step: wstep,\n value: default_value,\n dim_vals: vals,\n dim_labels: wlabels,\n next_vals: next_vals,\n slide: function(event, ui) {\n var vals = slider.slider(\"option\", \"dim_vals\");\n var next_vals = slider.slider(\"option\", \"next_vals\");\n var dlabels = slider.slider(\"option\", \"dim_labels\");\n if (dynamic) {\n var dim_val = ui.value;\n if (vals.constructor === Array) {\n var label = ui.value;\n } else {\n var label = dlabels[ui.value];\n }\n } else {\n var dim_val = vals[ui.value];\n var label = dlabels[ui.value];\n }\n var text = $('#textInput'+id+'_'+dim);\n text.val(label);\n adjustFontSize(text);\n HoloViews.index[plot_id].set_frame(dim_val, dim_idx);\n if (Object.keys(next_vals).length > 0) {\n var new_vals = next_vals[dim_val];\n var next_widget = $('#_anim_widget'+id+'_'+next_dim);\n update_widget(next_widget, new_vals);\n }\n }\n });\n slider.keypress(function(event) {\n if (event.which == 80 || event.which == 112) {\n var start = slider.slider(\"option\", \"value\");\n var stop = slider.slider(\"option\", \"max\");\n for (var i=start; i<=stop; i++) {\n var delay = i*delay;\n $.proxy(function doSetTimeout(i) { setTimeout($.proxy(function() {\n var val = {value:i};\n slider.slider('value',i);\n slider.slider(\"option\", \"slide\")(null, val);\n }, slider), delay);}, slider)(i);\n }\n }\n if (event.which == 82 || event.which == 114) {\n var start = slider.slider(\"option\", \"value\");\n var stop = slider.slider(\"option\", \"min\");\n var count = 0;\n for (var i=start; i>=stop; i--) {\n var delay = count*delay;\n count = count + 1;\n $.proxy(function doSetTimeout(i) { setTimeout($.proxy(function() {\n var val = {value:i};\n slider.slider('value',i);\n slider.slider(\"option\", \"slide\")(null, val);\n }, slider), delay);}, slider)(i);\n }\n }\n });\n var textInput = $('#textInput'+id+'_'+dim)\n textInput.val(init_label);\n adjustFontSize(textInput);\n });\n}\n\nfunction init_dropdown(id, plot_id, dim, vals, value, next_vals, labels, next_dim, dim_idx, dynamic) {\n var widget = $(\"#_anim_widget\"+id+'_'+dim);\n widget.data('values', vals)\n for (var i=0; i\", {\n value: val,\n text: labels[i]\n }));\n };\n widget.data(\"next_vals\", next_vals);\n widget.val(value);\n widget.on('change', function(event, ui) {\n if (dynamic) {\n var dim_val = parseInt(this.value);\n } else {\n var dim_val = $.data(this, 'values')[this.value];\n }\n var next_vals = $.data(this, \"next_vals\");\n if (Object.keys(next_vals).length > 0) {\n var new_vals = next_vals[dim_val];\n var next_widget = $('#_anim_widget'+id+'_'+next_dim);\n update_widget(next_widget, new_vals);\n }\n var widgets = HoloViews.index[plot_id]\n if (widgets) {\n widgets.set_frame(dim_val, dim_idx);\n }\n });\n}\n\n\nif (window.HoloViews === undefined) {\n window.HoloViews = {}\n window.PyViz = window.HoloViews\n} else if (window.PyViz === undefined) {\n window.PyViz = window.HoloViews\n}\n\n\nvar _namespace = {\n init_slider: init_slider,\n init_dropdown: init_dropdown,\n comms: {},\n comm_status: {},\n index: {},\n plot_index: {},\n kernels: {},\n receivers: {}\n}\n\nfor (var k in _namespace) {\n if (!(k in window.HoloViews)) {\n window.HoloViews[k] = _namespace[k];\n }\n}\n\n// Define Bokeh specific subclasses\nfunction BokehSelectionWidget() {\n SelectionWidget.apply(this, arguments);\n}\n\nfunction BokehScrubberWidget() {\n ScrubberWidget.apply(this, arguments);\n}\n\n// Let them inherit from the baseclasses\nBokehSelectionWidget.prototype = Object.create(SelectionWidget.prototype);\nBokehScrubberWidget.prototype = Object.create(ScrubberWidget.prototype);\n\n// Define methods to override on widgets\nvar BokehMethods = {\n update_cache : function(){\n for (var index in this.frames) {\n this.frames[index] = JSON.parse(this.frames[index]);\n }\n },\n update : function(current){\n if (current === undefined) {\n return;\n }\n var data = this.frames[current];\n if (data !== undefined) {\n if (data.root in HoloViews.plot_index) {\n var doc = HoloViews.plot_index[data.root].model.document;\n } else {\n var doc = Bokeh.index[data.root].model.document;\n }\n doc.apply_json_patch(data.content);\n }\n },\n init_comms: function() {\n if (Bokeh.protocol !== undefined) {\n this.receiver = new Bokeh.protocol.Receiver()\n } else {\n this.receiver = null;\n }\n return HoloViewsWidget.prototype.init_comms.call(this);\n },\n process_msg : function(msg) {\n if (this.plot_id in HoloViews.plot_index) {\n var doc = HoloViews.plot_index[this.plot_id].model.document;\n } else {\n var doc = Bokeh.index[this.plot_id].model.document;\n }\n if (this.receiver === null) { return }\n var receiver = this.receiver;\n if (msg.buffers.length > 0) {\n receiver.consume(msg.buffers[0].buffer)\n } else {\n receiver.consume(msg.content.data)\n }\n const comm_msg = receiver.message;\n if ((comm_msg != null) && (doc != null)) {\n doc.apply_json_patch(comm_msg.content, comm_msg.buffers)\n }\n }\n}\n\n// Extend Bokeh widgets with backend specific methods\nextend(BokehSelectionWidget.prototype, BokehMethods);\nextend(BokehScrubberWidget.prototype, BokehMethods);\n\nwindow.HoloViews.BokehSelectionWidget = BokehSelectionWidget\nwindow.HoloViews.BokehScrubberWidget = BokehScrubberWidget\n\n// Define MPL specific subclasses\nfunction MPLSelectionWidget() {\n SelectionWidget.apply(this, arguments);\n}\n\nfunction MPLScrubberWidget() {\n ScrubberWidget.apply(this, arguments);\n}\n\n// Let them inherit from the baseclasses\nMPLSelectionWidget.prototype = Object.create(SelectionWidget.prototype);\nMPLScrubberWidget.prototype = Object.create(ScrubberWidget.prototype);\n\n// Define methods to override on widgets\nvar MPLMethods = {\n init_slider : function(init_val){\n if(this.load_json) {\n this.from_json()\n } else {\n this.update_cache();\n }\n if (this.dynamic | !this.cached | (this.current_vals === undefined)) {\n this.update(0)\n } else {\n this.set_frame(this.current_vals[0], 0)\n }\n },\n process_msg : function(msg) {\n var data = msg.content.data;\n this.frames[this.current] = data;\n this.update_cache(true);\n this.update(this.current);\n }\n}\n// Extend MPL widgets with backend specific methods\nextend(MPLSelectionWidget.prototype, MPLMethods);\nextend(MPLScrubberWidget.prototype, MPLMethods);\n\nwindow.HoloViews.MPLSelectionWidget = MPLSelectionWidget\nwindow.HoloViews.MPLScrubberWidget = MPLScrubberWidget\n\n function JupyterCommManager() {\n }\n\n JupyterCommManager.prototype.register_target = function(plot_id, comm_id, msg_handler) {\n if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n comm_manager.register_target(comm_id, function(comm) {\n comm.on_msg(msg_handler);\n });\n } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n window.PyViz.kernels[plot_id].registerCommTarget(comm_id, function(comm) {\n comm.onMsg = msg_handler;\n });\n }\n }\n\n JupyterCommManager.prototype.get_client_comm = function(plot_id, comm_id, msg_handler) {\n if (comm_id in window.PyViz.comms) {\n return window.PyViz.comms[comm_id];\n } else if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n var comm = comm_manager.new_comm(comm_id, {}, {}, {}, comm_id);\n if (msg_handler) {\n comm.on_msg(msg_handler);\n }\n } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n var comm = window.PyViz.kernels[plot_id].connectToComm(comm_id);\n comm.open();\n if (msg_handler) {\n comm.onMsg = msg_handler;\n }\n }\n\n window.PyViz.comms[comm_id] = comm;\n return comm;\n }\n\n window.PyViz.comm_manager = new JupyterCommManager();\n \n\nvar JS_MIME_TYPE = 'application/javascript';\nvar HTML_MIME_TYPE = 'text/html';\nvar EXEC_MIME_TYPE = 'application/vnd.holoviews_exec.v0+json';\nvar CLASS_NAME = 'output';\n\n/**\n * Render data to the DOM node\n */\nfunction render(props, node) {\n var div = document.createElement(\"div\");\n var script = document.createElement(\"script\");\n node.appendChild(div);\n node.appendChild(script);\n}\n\n/**\n * Handle when a new output is added\n */\nfunction handle_add_output(event, handle) {\n var output_area = handle.output_area;\n var output = handle.output;\n if ((output.data == undefined) || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n return\n }\n var id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n if (id !== undefined) {\n var nchildren = toinsert.length;\n var html_node = toinsert[nchildren-1].children[0];\n html_node.innerHTML = output.data[HTML_MIME_TYPE];\n var scripts = [];\n var nodelist = html_node.querySelectorAll(\"script\");\n for (var i in nodelist) {\n if (nodelist.hasOwnProperty(i)) {\n scripts.push(nodelist[i])\n }\n }\n\n scripts.forEach( function (oldScript) {\n var newScript = document.createElement(\"script\");\n var attrs = [];\n var nodemap = oldScript.attributes;\n for (var j in nodemap) {\n if (nodemap.hasOwnProperty(j)) {\n attrs.push(nodemap[j])\n }\n }\n attrs.forEach(function(attr) { newScript.setAttribute(attr.name, attr.value) });\n newScript.appendChild(document.createTextNode(oldScript.innerHTML));\n oldScript.parentNode.replaceChild(newScript, oldScript);\n });\n if (JS_MIME_TYPE in output.data) {\n toinsert[nchildren-1].children[1].textContent = output.data[JS_MIME_TYPE];\n }\n output_area._hv_plot_id = id;\n if ((window.Bokeh !== undefined) && (id in Bokeh.index)) {\n window.PyViz.plot_index[id] = Bokeh.index[id];\n } else {\n window.PyViz.plot_index[id] = null;\n }\n } else if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n var bk_div = document.createElement(\"div\");\n bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n var script_attrs = bk_div.children[0].attributes;\n for (var i = 0; i < script_attrs.length; i++) {\n toinsert[toinsert.length - 1].childNodes[1].setAttribute(script_attrs[i].name, script_attrs[i].value);\n }\n // store reference to server id on output_area\n output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n }\n}\n\n/**\n * Handle when an output is cleared or removed\n */\nfunction handle_clear_output(event, handle) {\n var id = handle.cell.output_area._hv_plot_id;\n var server_id = handle.cell.output_area._bokeh_server_id;\n if (((id === undefined) || !(id in PyViz.plot_index)) && (server_id !== undefined)) { return; }\n var comm = window.PyViz.comm_manager.get_client_comm(\"hv-extension-comm\", \"hv-extension-comm\", function () {});\n if (server_id !== null) {\n comm.send({event_type: 'server_delete', 'id': server_id});\n return;\n } else if (comm !== null) {\n comm.send({event_type: 'delete', 'id': id});\n }\n delete PyViz.plot_index[id];\n if ((window.Bokeh !== undefined) & (id in window.Bokeh.index)) {\n var doc = window.Bokeh.index[id].model.document\n doc.clear();\n const i = window.Bokeh.documents.indexOf(doc);\n if (i > -1) {\n window.Bokeh.documents.splice(i, 1);\n }\n }\n}\n\n/**\n * Handle kernel restart event\n */\nfunction handle_kernel_cleanup(event, handle) {\n delete PyViz.comms[\"hv-extension-comm\"];\n window.PyViz.plot_index = {}\n}\n\n/**\n * Handle update_display_data messages\n */\nfunction handle_update_output(event, handle) {\n handle_clear_output(event, {cell: {output_area: handle.output_area}})\n handle_add_output(event, handle)\n}\n\nfunction register_renderer(events, OutputArea) {\n function append_mime(data, metadata, element) {\n // create a DOM node to render to\n var toinsert = this.create_output_subarea(\n metadata,\n CLASS_NAME,\n EXEC_MIME_TYPE\n );\n this.keyboard_manager.register_events(toinsert);\n // Render to node\n var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n render(props, toinsert[0]);\n element.append(toinsert);\n return toinsert\n }\n\n events.on('output_added.OutputArea', handle_add_output);\n events.on('output_updated.OutputArea', handle_update_output);\n events.on('clear_output.CodeCell', handle_clear_output);\n events.on('delete.Cell', handle_clear_output);\n events.on('kernel_ready.Kernel', handle_kernel_cleanup);\n\n OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n safe: true,\n index: 0\n });\n}\n\nif (window.Jupyter !== undefined) {\n try {\n var events = require('base/js/events');\n var OutputArea = require('notebook/js/outputarea').OutputArea;\n if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n register_renderer(events, OutputArea);\n }\n } catch(err) {\n }\n}\n" + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ - "Below are all the colormaps in the current version of the library. To contribute a new colormap, see the contributing section of the [README](https://github.com/pyviz/contrib_colormaps#contributing). To learn more about how to use the various colormaps and what each is for, see the [colormaps section](colormaps/index.ipynb)." + "from contrib_colormaps.plotting import swatch\n", + "import holoviews as hv\n", + "hv.extension('bokeh', 'matplotlib', logo=False)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmsAAABbCAYAAAAsqcJgAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAHzUlEQVR4nO3dXYiUZRsH8P8zq5Q1kq20QpjSiUilgvRmglQEfchSdmAfIpEHUYihC0FaQkcGHZTgUSeBRORBRIV0EKEUktWahUVKCbVa9EH0QeiBkrvzHrgfM7PjrpXlHf1+IDtzXfdzPfcMg/v3GWe3ajQajQAAUKTa+d4AAABnJqwBABRMWAMAKJiwBgBQMGENAKBgwhoAQMH+tWHtyJEjqaoq+/fvP99bAQD42/xrwxoAwH+BsAYAULCzCmt79uzJ9ddfn3q9nksuuSRLlizJZ599lp9//jmrVq3K7NmzM23atFx99dXZvn17y7E33XRT1q5dm0cffTTd3d257LLLsm3btpw8eTLr1q3LjBkzMmfOnLz44oujx4y8xbljx44sW7YsF154YebPn5+33nprwn0eOnQovb29mT59enp6erJq1ar88MMPf+JpAQAow6Rh7dSpU1mxYkWWLVuWTz75JP39/dmwYUO6urpy4sSJLF68OG+88UYOHjyYDRs25OGHH87u3btbZrz00kuZPn16+vv7s2nTpvT19eWuu+7KvHnzsn///jzwwAN58MEH891337Uc99hjj2X9+vU5cOBAbrnllqxYsSLffvttx31+//33ueGGG3LNNddk37592bVrV44fP54777wzQ0NDf+EpAgA4f6rJfjfoL7/8kpkzZ+add97JjTfeOOnA++67L/V6Pc8//3yS01fWTp48mffffz9J0mg00tPTk6VLl2bnzp1Jkt9//z0XX3xxduzYkZUrV+bIkSO58sors2XLlmzevDlJMjQ0lPnz5+eee+7Jli1bRtd8+OGHufbaa/Pkk09m7969LUHx119/TXd3d/r7+3Pdddf9uWcIAOA8mvTKWnd3d9asWZPbbrstvb292bp1a7755pskyeDgYJ566qksXLgwM2fOTL1ez6uvvpqvv/66ZcbChQtHb1dVlZ6enixYsGC0NnXq1Fx66aX58ccfW45bunTp2EZrtSxZsiSHDh3quM+PPvooe/bsSb1eH/1zxRVXJEm+/PLLyR4mAECRppzNou3bt6evry9vvvlmdu7cmc2bN+f111/PgQMH8uyzz2bbtm1ZsGBB6vV6nnjiiXGha+rUqS33q6rqWPsrb1cODQ2lt7c3zzzzzLjerFmz/vRcAIDz6azCWpIsWrQoixYtysaNG7N8+fK88MILOXbsWO64447cf//9SU6/xXn48OHMmDHjnGzugw8+yM033zw6e9++fVm5cmXHtYsXL87LL7+cuXPnjguCAAD/VpO+DTowMJBNmzblvffey9GjR/P222/n008/zVVXXZV58+Zl9+7deffdd/P555/nkUceycDAwDnb3HPPPZdXXnklX3zxRfr6+nL06NGsXbu249p169blt99+y7333pv+/v589dVX2bVrVx566KEcO3bsnO0JAOCfNOmVtYsuuiiHDx/O3XffnZ9++imzZs3K6tWrs3Hjxhw/fjwDAwNZvnx5pk2bljVr1mT16tVn/H9lf9TTTz+drVu35uOPP87cuXPz2muvZfbs2R3XXn755dm7d28ef/zx3H777Tlx4kTmzJmTW2+9NRdccME52Q8AwD9t0k+Dng/tn/QEAPiv8hsMAAAKJqwBABSsyLdBAQA4zZU1AICCTfhp0Op/J4dXDY4Vu04Nfx1svd+p11yrdei112pNs2pt8zv1JqrVBsf1quFeVzXW6xrudQ33pnToTWmaNXJsV3WqZU1Lb7hWq8b3ahP0qqZa+7pOvapDb7Q2sq/q1Jl7STI6o8Pz1t6rmp/TU63nbtlDW6/pnCO9Woc916qhcb2uttrI/dO3G8O9sYvDXRka7rWuSZIpI7XR48ceztj61jWna1WH9VXbrKqp136e8b1aJpjZXBteV6ta13Sa3/wvr6629c2Pp/Y3nqe1d+bayMxapz2M9CaY1dyrNVprVYde08tgbF2H3ujLa/gNh4l66dQbaio2WmvNs0bXtc9srk3Y61BrtM1sXtfImXt/+DwT9Npndlo/0R4mmzV8u9H+uCY7brCt17J+ZGanWW1fm2+Pzmx6xY3cnqg21PTqbdRaa42u8b3hWtX6t9Lw17Fv4VVbraqavr1XXa215l5tpDa19X7zuo61s1hfa/qZp7W2c0/U6zT/7+gl4x93877a9zrheTo8npZZp283hnuNDr3a+jP/jFhX1gAACiasAQAUTFgDACiYsAYAUDBhDQCgYMIaAEDBhDUAgIIJawAABRPWAAAKJqwBABRMWAMAKJiwBgBQMGENAKBgwhoAQMGENQCAgglrAAAFE9YAAAomrAEAFExYAwAomLAGAFAwYQ0AoGDCGgBAwYQ1AICCCWsAAAUT1gAACiasAQAUTFgDACiYsAYAUDBhDQCgYMIaAEDBhDUAgIIJawAABRPWAAAKJqwBABRMWAMAKJiwBgBQMGENAKBgwhoAQMGENQCAgglrAAAFE9YAAAomrAEAFExYAwAomLAGAFAwYQ0AoGDCGgBAwYQ1AICCCWsAAAUT1gAACiasAQAUTFgDACiYsAYAUDBhDQCgYMIaAEDBhDUAgIIJawAABRPWAAAKJqwBABRMWAMAKJiwBgBQsKrRaDTO9yYAAOjMlTUAgIIJawAABRPWAAAKJqwBABRMWAMAKJiwBgBQsP8DEK4rN9N1QVAAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "from contrib_colormaps.plotting import swatches\n", - "import holoviews as hv\n", - "hv.extension('bokeh', logo=False)\n", - "\n", - "swatches()" + "hv.render(swatch('sample'), backend='matplotlib')" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "(function(root) {\n", + " function embed_document(root) {\n", + " \n", + " var docs_json = {\"016170ec-8abc-4573-819c-23262e6b74cb\":{\"roots\":{\"references\":[{\"attributes\":{\"align\":null,\"below\":[{\"id\":\"1173\",\"type\":\"LinearAxis\"}],\"center\":[{\"id\":\"1177\",\"type\":\"Grid\"},{\"id\":\"1182\",\"type\":\"Grid\"}],\"left\":[{\"id\":\"1178\",\"type\":\"LinearAxis\"}],\"margin\":null,\"min_border_bottom\":10,\"min_border_left\":10,\"min_border_right\":10,\"min_border_top\":10,\"plot_height\":100,\"plot_width\":900,\"renderers\":[{\"id\":\"1198\",\"type\":\"GlyphRenderer\"}],\"sizing_mode\":\"fixed\",\"title\":{\"id\":\"1165\",\"type\":\"Title\"},\"toolbar\":{\"id\":\"1187\",\"type\":\"Toolbar\"},\"toolbar_location\":\"above\",\"x_range\":{\"id\":\"1162\",\"type\":\"Range1d\"},\"x_scale\":{\"id\":\"1169\",\"type\":\"LinearScale\"},\"y_range\":{\"id\":\"1163\",\"type\":\"Range1d\"},\"y_scale\":{\"id\":\"1171\",\"type\":\"LinearScale\"}},\"id\":\"1164\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"color_mapper\":{\"id\":\"1192\",\"type\":\"LinearColorMapper\"},\"dh\":{\"field\":\"dh\",\"units\":\"data\"},\"dw\":{\"field\":\"dw\",\"units\":\"data\"},\"image\":{\"field\":\"image\"},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1196\",\"type\":\"Image\"},{\"attributes\":{\"active_drag\":\"auto\",\"active_inspect\":\"auto\",\"active_multi\":null,\"active_scroll\":\"auto\",\"active_tap\":\"auto\",\"tools\":[{\"id\":\"1183\",\"type\":\"WheelZoomTool\"},{\"id\":\"1184\",\"type\":\"PanTool\"},{\"id\":\"1185\",\"type\":\"SaveTool\"},{\"id\":\"1186\",\"type\":\"ResetTool\"}]},\"id\":\"1187\",\"type\":\"Toolbar\"},{\"attributes\":{\"high\":1.0,\"low\":0.0,\"nan_color\":\"rgba(0, 0, 0, 0)\",\"palette\":[\"#0034f8\",\"#0038f5\",\"#003bf1\",\"#003eee\",\"#0041ea\",\"#0044e6\",\"#0047e3\",\"#004adf\",\"#004cdb\",\"#004fd8\",\"#0051d4\",\"#0054d1\",\"#0056cd\",\"#0058ca\",\"#005bc6\",\"#005dc2\",\"#005fbf\",\"#0061bb\",\"#0063b8\",\"#0065b4\",\"#0067b1\",\"#0069ae\",\"#016baa\",\"#046ca7\",\"#076ea4\",\"#0a70a0\",\"#0e719d\",\"#11739a\",\"#157597\",\"#187694\",\"#1b7790\",\"#1e798d\",\"#217a8a\",\"#247c87\",\"#267d84\",\"#297e81\",\"#2b807e\",\"#2d817b\",\"#308278\",\"#318375\",\"#338572\",\"#35866f\",\"#36876c\",\"#388969\",\"#398a66\",\"#3a8b63\",\"#3b8c60\",\"#3c8e5d\",\"#3c8f59\",\"#3d9056\",\"#3e9253\",\"#3e9350\",\"#3f944c\",\"#3f9649\",\"#3f9746\",\"#409842\",\"#40993f\",\"#409b3b\",\"#419c38\",\"#419d35\",\"#429e31\",\"#439f2e\",\"#44a12b\",\"#45a227\",\"#47a324\",\"#48a421\",\"#4aa51f\",\"#4ca61c\",\"#4fa71a\",\"#51a817\",\"#54a915\",\"#57aa14\",\"#59ab13\",\"#5cab11\",\"#5fac11\",\"#62ad10\",\"#66ae10\",\"#69ae10\",\"#6caf10\",\"#6fb010\",\"#72b110\",\"#75b110\",\"#78b211\",\"#7bb311\",\"#7eb412\",\"#81b412\",\"#84b513\",\"#87b613\",\"#8ab613\",\"#8db714\",\"#90b814\",\"#92b815\",\"#95b915\",\"#98ba16\",\"#9bbb16\",\"#9ebb17\",\"#a0bc17\",\"#a3bd18\",\"#a6bd18\",\"#a9be19\",\"#abbe19\",\"#aebf19\",\"#b1c01a\",\"#b4c01a\",\"#b6c11b\",\"#b9c21b\",\"#bcc21c\",\"#bec31c\",\"#c1c41d\",\"#c4c41d\",\"#c7c51e\",\"#c9c51e\",\"#ccc61e\",\"#cfc71f\",\"#d1c71f\",\"#d4c820\",\"#d6c820\",\"#d9c921\",\"#dcc921\",\"#deca21\",\"#e1ca22\",\"#e3ca22\",\"#e5ca22\",\"#e8cb23\",\"#eacb23\",\"#eccb23\",\"#eeca23\",\"#f0ca23\",\"#f1ca23\",\"#f3c923\",\"#f4c823\",\"#f6c823\",\"#f7c723\",\"#f8c623\",\"#f9c423\",\"#f9c322\",\"#fac222\",\"#fbc022\",\"#fbbf21\",\"#fbbe21\",\"#fcbc21\",\"#fcba20\",\"#fcb920\",\"#fcb71f\",\"#fdb61f\",\"#fdb41e\",\"#fdb21e\",\"#fdb11d\",\"#fdaf1d\",\"#fdad1d\",\"#fdac1c\",\"#fdaa1c\",\"#fda81b\",\"#fda61b\",\"#fda51a\",\"#fda31a\",\"#fda119\",\"#fda019\",\"#fd9e19\",\"#fd9c18\",\"#fd9a18\",\"#fd9917\",\"#fd9717\",\"#fd9516\",\"#fd9316\",\"#fd9216\",\"#fd9015\",\"#fd8e15\",\"#fd8c14\",\"#fd8a14\",\"#fd8914\",\"#fd8713\",\"#fd8513\",\"#fd8312\",\"#fd8112\",\"#fd7f12\",\"#fd7d11\",\"#fd7b11\",\"#fd7911\",\"#fc7710\",\"#fc7610\",\"#fc7410\",\"#fc720f\",\"#fc700f\",\"#fc6d0f\",\"#fc6b0e\",\"#fc690e\",\"#fc670e\",\"#fb650e\",\"#fb630e\",\"#fb610e\",\"#fb5f0e\",\"#fb5d0e\",\"#fb5a0e\",\"#fb580f\",\"#fb5610\",\"#fb5411\",\"#fb5212\",\"#fb5013\",\"#fb4e15\",\"#fb4d17\",\"#fb4b19\",\"#fb4a1c\",\"#fb491e\",\"#fb4821\",\"#fc4824\",\"#fc4827\",\"#fc482b\",\"#fd482e\",\"#fd4832\",\"#fe4936\",\"#fe4a39\",\"#ff4b3d\",\"#ff4c41\",\"#ff4e45\",\"#ff4f4a\",\"#ff514e\",\"#ff5252\",\"#ff5456\",\"#ff555a\",\"#ff575f\",\"#ff5963\",\"#ff5a67\",\"#ff5c6b\",\"#ff5e70\",\"#ff6074\",\"#ff6178\",\"#ff637d\",\"#ff6581\",\"#ff6685\",\"#ff688a\",\"#ff6a8e\",\"#ff6b92\",\"#ff6d97\",\"#ff6f9b\",\"#ff709f\",\"#ff72a4\",\"#ff74a8\",\"#ff75ac\",\"#ff77b1\",\"#ff79b5\",\"#ff7aba\",\"#ff7cbe\",\"#ff7ec3\",\"#ff7fc7\",\"#ff81cc\",\"#ff82d0\",\"#ff84d5\",\"#ff86d9\",\"#ff87de\",\"#ff89e2\",\"#ff8be7\",\"#ff8cec\",\"#fe8ef0\",\"#fd90f5\",\"#fd91fa\"]},\"id\":\"1192\",\"type\":\"LinearColorMapper\"},{\"attributes\":{\"dimensions\":\"width\"},\"id\":\"1183\",\"type\":\"WheelZoomTool\"},{\"attributes\":{\"dimensions\":\"width\"},\"id\":\"1184\",\"type\":\"PanTool\"},{\"attributes\":{},\"id\":\"1171\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1185\",\"type\":\"SaveTool\"},{\"attributes\":{},\"id\":\"1203\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"text\":\"sample\",\"text_color\":{\"value\":\"black\"},\"text_font_size\":{\"value\":\"12pt\"}},\"id\":\"1165\",\"type\":\"Title\"},{\"attributes\":{},\"id\":\"1221\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"1186\",\"type\":\"ResetTool\"},{\"attributes\":{},\"id\":\"1174\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"1201\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"grid_line_color\":null,\"ticker\":{\"id\":\"1174\",\"type\":\"BasicTicker\"}},\"id\":\"1177\",\"type\":\"Grid\"},{\"attributes\":{\"axis_label\":\"x\",\"bounds\":\"auto\",\"formatter\":{\"id\":\"1201\",\"type\":\"BasicTickFormatter\"},\"major_label_orientation\":\"horizontal\",\"ticker\":{\"id\":\"1174\",\"type\":\"BasicTicker\"},\"visible\":false},\"id\":\"1173\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1169\",\"type\":\"LinearScale\"},{\"attributes\":{\"source\":{\"id\":\"1193\",\"type\":\"ColumnDataSource\"}},\"id\":\"1199\",\"type\":\"CDSView\"},{\"attributes\":{\"callback\":null,\"end\":256.0,\"reset_end\":256.0,\"reset_start\":0.0,\"tags\":[[[\"x\",\"x\",null]]]},\"id\":\"1162\",\"type\":\"Range1d\"},{\"attributes\":{\"axis_label\":\"y\",\"bounds\":\"auto\",\"formatter\":{\"id\":\"1203\",\"type\":\"BasicTickFormatter\"},\"major_label_orientation\":\"horizontal\",\"ticker\":{\"id\":\"1179\",\"type\":\"BasicTicker\"},\"visible\":false},\"id\":\"1178\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1179\",\"type\":\"BasicTicker\"},{\"attributes\":{\"dimension\":1,\"grid_line_color\":null,\"ticker\":{\"id\":\"1179\",\"type\":\"BasicTicker\"}},\"id\":\"1182\",\"type\":\"Grid\"},{\"attributes\":{\"color_mapper\":{\"id\":\"1192\",\"type\":\"LinearColorMapper\"},\"dh\":{\"field\":\"dh\",\"units\":\"data\"},\"dw\":{\"field\":\"dw\",\"units\":\"data\"},\"image\":{\"field\":\"image\"},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1197\",\"type\":\"Image\"},{\"attributes\":{\"data_source\":{\"id\":\"1193\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"1196\",\"type\":\"Image\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"1197\",\"type\":\"Image\"},\"selection_glyph\":null,\"view\":{\"id\":\"1199\",\"type\":\"CDSView\"}},\"id\":\"1198\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"callback\":null,\"data\":{\"dh\":[1],\"dw\":[256],\"image\":[{\"__ndarray__\":\"AAAAAAAAAAAQEBAQEBBwPxAQEBAQEIA/GBgYGBgYiD8QEBAQEBCQPxQUFBQUFJQ/GBgYGBgYmD8cHBwcHBycPxAQEBAQEKA/EhISEhISoj8UFBQUFBSkPxYWFhYWFqY/GBgYGBgYqD8aGhoaGhqqPxwcHBwcHKw/Hh4eHh4erj8QEBAQEBCwPxEREREREbE/EhISEhISsj8TExMTExOzPxQUFBQUFLQ/FRUVFRUVtT8WFhYWFha2PxcXFxcXF7c/GBgYGBgYuD8ZGRkZGRm5PxoaGhoaGro/GxsbGxsbuz8cHBwcHBy8Px0dHR0dHb0/Hh4eHh4evj8fHx8fHx+/PxAQEBAQEMA/kJCQkJCQwD8RERERERHBP5KRkZGRkcE/EhISEhISwj+SkpKSkpLCPxMTExMTE8M/lJOTk5OTwz8UFBQUFBTEP5SUlJSUlMQ/FRUVFRUVxT+WlZWVlZXFPxYWFhYWFsY/lpaWlpaWxj8XFxcXFxfHP5iXl5eXl8c/GBgYGBgYyD+YmJiYmJjIPxkZGRkZGck/mpmZmZmZyT8aGhoaGhrKP5qampqamso/GxsbGxsbyz+cm5ubm5vLPxwcHBwcHMw/nJycnJyczD8dHR0dHR3NP56dnZ2dnc0/Hh4eHh4ezj+enp6enp7OPx8fHx8fH88/oJ+fn5+fzz8QEBAQEBDQP1BQUFBQUNA/kJCQkJCQ0D/R0NDQ0NDQPxEREREREdE/UVFRUVFR0T+SkZGRkZHRP9LR0dHR0dE/EhISEhIS0j9SUlJSUlLSP5KSkpKSktI/09LS0tLS0j8TExMTExPTP1NTU1NTU9M/lJOTk5OT0z/U09PT09PTPxQUFBQUFNQ/VFRUVFRU1D+UlJSUlJTUP9XU1NTU1NQ/FRUVFRUV1T9VVVVVVVXVP5aVlZWVldU/1tXV1dXV1T8WFhYWFhbWP1ZWVlZWVtY/lpaWlpaW1j/X1tbW1tbWPxcXFxcXF9c/V1dXV1dX1z+Yl5eXl5fXP9jX19fX19c/GBgYGBgY2D9YWFhYWFjYP5iYmJiYmNg/2djY2NjY2D8ZGRkZGRnZP1lZWVlZWdk/mpmZmZmZ2T/a2dnZ2dnZPxoaGhoaGto/WlpaWlpa2j+ampqampraP9va2tra2to/GxsbGxsb2z9bW1tbW1vbP5ybm5ubm9s/3Nvb29vb2z8cHBwcHBzcP1xcXFxcXNw/nJycnJyc3D/d3Nzc3NzcPx0dHR0dHd0/XV1dXV1d3T+enZ2dnZ3dP97d3d3d3d0/Hh4eHh4e3j9eXl5eXl7eP56enp6ent4/397e3t7e3j8fHx8fHx/fP19fX19fX98/oJ+fn5+f3z/g39/f39/fPxAQEBAQEOA/MDAwMDAw4D9QUFBQUFDgP3BwcHBwcOA/kJCQkJCQ4D+xsLCwsLDgP9HQ0NDQ0OA/8fDw8PDw4D8RERERERHhPzExMTExMeE/UVFRUVFR4T9xcXFxcXHhP5KRkZGRkeE/srGxsbGx4T/S0dHR0dHhP/Lx8fHx8eE/EhISEhIS4j8yMjIyMjLiP1JSUlJSUuI/cnJycnJy4j+SkpKSkpLiP7OysrKysuI/09LS0tLS4j/z8vLy8vLiPxMTExMTE+M/MzMzMzMz4z9TU1NTU1PjP3Nzc3Nzc+M/lJOTk5OT4z+0s7Ozs7PjP9TT09PT0+M/9PPz8/Pz4z8UFBQUFBTkPzQ0NDQ0NOQ/VFRUVFRU5D90dHR0dHTkP5SUlJSUlOQ/tbS0tLS05D/V1NTU1NTkP/X09PT09OQ/FRUVFRUV5T81NTU1NTXlP1VVVVVVVeU/dXV1dXV15T+WlZWVlZXlP7a1tbW1teU/1tXV1dXV5T/29fX19fXlPxYWFhYWFuY/NjY2NjY25j9WVlZWVlbmP3Z2dnZ2duY/lpaWlpaW5j+3tra2trbmP9fW1tbW1uY/9/b29vb25j8XFxcXFxfnPzc3Nzc3N+c/V1dXV1dX5z93d3d3d3fnP5iXl5eXl+c/uLe3t7e35z/Y19fX19fnP/j39/f39+c/GBgYGBgY6D84ODg4ODjoP1hYWFhYWOg/eHh4eHh46D+YmJiYmJjoP7m4uLi4uOg/2djY2NjY6D/5+Pj4+PjoPxkZGRkZGek/OTk5OTk56T9ZWVlZWVnpP3l5eXl5eek/mpmZmZmZ6T+6ubm5ubnpP9rZ2dnZ2ek/+vn5+fn56T8aGhoaGhrqPzo6Ojo6Ouo/WlpaWlpa6j96enp6enrqP5qampqamuo/u7q6urq66j/b2tra2trqP/v6+vr6+uo/GxsbGxsb6z87Ozs7OzvrP1tbW1tbW+s/e3t7e3t76z+cm5ubm5vrP7y7u7u7u+s/3Nvb29vb6z/8+/v7+/vrPxwcHBwcHOw/PDw8PDw87D9cXFxcXFzsP3x8fHx8fOw/nJycnJyc7D+9vLy8vLzsP93c3Nzc3Ow//fz8/Pz87D8dHR0dHR3tPz09PT09Pe0/XV1dXV1d7T99fX19fX3tP56dnZ2dne0/vr29vb297T/e3d3d3d3tP/79/f39/e0/Hh4eHh4e7j8+Pj4+Pj7uP15eXl5eXu4/fn5+fn5+7j+enp6enp7uP7++vr6+vu4/397e3t7e7j///v7+/v7uPx8fHx8fH+8/Pz8/Pz8/7z9fX19fX1/vP39/f39/f+8/oJ+fn5+f7z/Av7+/v7/vP+Df39/f3+8/AAAAAAAA8D8AAAAAAAAAABAQEBAQEHA/EBAQEBAQgD8YGBgYGBiIPxAQEBAQEJA/FBQUFBQUlD8YGBgYGBiYPxwcHBwcHJw/EBAQEBAQoD8SEhISEhKiPxQUFBQUFKQ/FhYWFhYWpj8YGBgYGBioPxoaGhoaGqo/HBwcHBwcrD8eHh4eHh6uPxAQEBAQELA/ERERERERsT8SEhISEhKyPxMTExMTE7M/FBQUFBQUtD8VFRUVFRW1PxYWFhYWFrY/FxcXFxcXtz8YGBgYGBi4PxkZGRkZGbk/GhoaGhoauj8bGxsbGxu7PxwcHBwcHLw/HR0dHR0dvT8eHh4eHh6+Px8fHx8fH78/EBAQEBAQwD+QkJCQkJDAPxEREREREcE/kpGRkZGRwT8SEhISEhLCP5KSkpKSksI/ExMTExMTwz+Uk5OTk5PDPxQUFBQUFMQ/lJSUlJSUxD8VFRUVFRXFP5aVlZWVlcU/FhYWFhYWxj+WlpaWlpbGPxcXFxcXF8c/mJeXl5eXxz8YGBgYGBjIP5iYmJiYmMg/GRkZGRkZyT+amZmZmZnJPxoaGhoaGso/mpqampqayj8bGxsbGxvLP5ybm5ubm8s/HBwcHBwczD+cnJycnJzMPx0dHR0dHc0/np2dnZ2dzT8eHh4eHh7OP56enp6ens4/Hx8fHx8fzz+gn5+fn5/PPxAQEBAQENA/UFBQUFBQ0D+QkJCQkJDQP9HQ0NDQ0NA/ERERERER0T9RUVFRUVHRP5KRkZGRkdE/0tHR0dHR0T8SEhISEhLSP1JSUlJSUtI/kpKSkpKS0j/T0tLS0tLSPxMTExMTE9M/U1NTU1NT0z+Uk5OTk5PTP9TT09PT09M/FBQUFBQU1D9UVFRUVFTUP5SUlJSUlNQ/1dTU1NTU1D8VFRUVFRXVP1VVVVVVVdU/lpWVlZWV1T/W1dXV1dXVPxYWFhYWFtY/VlZWVlZW1j+WlpaWlpbWP9fW1tbW1tY/FxcXFxcX1z9XV1dXV1fXP5iXl5eXl9c/2NfX19fX1z8YGBgYGBjYP1hYWFhYWNg/mJiYmJiY2D/Z2NjY2NjYPxkZGRkZGdk/WVlZWVlZ2T+amZmZmZnZP9rZ2dnZ2dk/GhoaGhoa2j9aWlpaWlraP5qampqamto/29ra2tra2j8bGxsbGxvbP1tbW1tbW9s/nJubm5ub2z/c29vb29vbPxwcHBwcHNw/XFxcXFxc3D+cnJycnJzcP93c3Nzc3Nw/HR0dHR0d3T9dXV1dXV3dP56dnZ2dnd0/3t3d3d3d3T8eHh4eHh7eP15eXl5eXt4/np6enp6e3j/f3t7e3t7ePx8fHx8fH98/X19fX19f3z+gn5+fn5/fP+Df39/f398/EBAQEBAQ4D8wMDAwMDDgP1BQUFBQUOA/cHBwcHBw4D+QkJCQkJDgP7GwsLCwsOA/0dDQ0NDQ4D/x8PDw8PDgPxEREREREeE/MTExMTEx4T9RUVFRUVHhP3FxcXFxceE/kpGRkZGR4T+ysbGxsbHhP9LR0dHR0eE/8vHx8fHx4T8SEhISEhLiPzIyMjIyMuI/UlJSUlJS4j9ycnJycnLiP5KSkpKSkuI/s7KysrKy4j/T0tLS0tLiP/Py8vLy8uI/ExMTExMT4z8zMzMzMzPjP1NTU1NTU+M/c3Nzc3Nz4z+Uk5OTk5PjP7Szs7Ozs+M/1NPT09PT4z/08/Pz8/PjPxQUFBQUFOQ/NDQ0NDQ05D9UVFRUVFTkP3R0dHR0dOQ/lJSUlJSU5D+1tLS0tLTkP9XU1NTU1OQ/9fT09PT05D8VFRUVFRXlPzU1NTU1NeU/VVVVVVVV5T91dXV1dXXlP5aVlZWVleU/trW1tbW15T/W1dXV1dXlP/b19fX19eU/FhYWFhYW5j82NjY2NjbmP1ZWVlZWVuY/dnZ2dnZ25j+WlpaWlpbmP7e2tra2tuY/19bW1tbW5j/39vb29vbmPxcXFxcXF+c/Nzc3Nzc35z9XV1dXV1fnP3d3d3d3d+c/mJeXl5eX5z+4t7e3t7fnP9jX19fX1+c/+Pf39/f35z8YGBgYGBjoPzg4ODg4OOg/WFhYWFhY6D94eHh4eHjoP5iYmJiYmOg/ubi4uLi46D/Z2NjY2NjoP/n4+Pj4+Og/GRkZGRkZ6T85OTk5OTnpP1lZWVlZWek/eXl5eXl56T+amZmZmZnpP7q5ubm5uek/2tnZ2dnZ6T/6+fn5+fnpPxoaGhoaGuo/Ojo6Ojo66j9aWlpaWlrqP3p6enp6euo/mpqampqa6j+7urq6urrqP9va2tra2uo/+/r6+vr66j8bGxsbGxvrPzs7Ozs7O+s/W1tbW1tb6z97e3t7e3vrP5ybm5ubm+s/vLu7u7u76z/c29vb29vrP/z7+/v7++s/HBwcHBwc7D88PDw8PDzsP1xcXFxcXOw/fHx8fHx87D+cnJycnJzsP728vLy8vOw/3dzc3Nzc7D/9/Pz8/PzsPx0dHR0dHe0/PT09PT097T9dXV1dXV3tP319fX19fe0/np2dnZ2d7T++vb29vb3tP97d3d3d3e0//v39/f397T8eHh4eHh7uPz4+Pj4+Pu4/Xl5eXl5e7j9+fn5+fn7uP56enp6enu4/v76+vr6+7j/f3t7e3t7uP//+/v7+/u4/Hx8fHx8f7z8/Pz8/Pz/vP19fX19fX+8/f39/f39/7z+gn5+fn5/vP8C/v7+/v+8/4N/f39/f7z8AAAAAAADwPwAAAAAAAAAAEBAQEBAQcD8QEBAQEBCAPxgYGBgYGIg/EBAQEBAQkD8UFBQUFBSUPxgYGBgYGJg/HBwcHBwcnD8QEBAQEBCgPxISEhISEqI/FBQUFBQUpD8WFhYWFhamPxgYGBgYGKg/GhoaGhoaqj8cHBwcHBysPx4eHh4eHq4/EBAQEBAQsD8RERERERGxPxISEhISErI/ExMTExMTsz8UFBQUFBS0PxUVFRUVFbU/FhYWFhYWtj8XFxcXFxe3PxgYGBgYGLg/GRkZGRkZuT8aGhoaGhq6PxsbGxsbG7s/HBwcHBwcvD8dHR0dHR29Px4eHh4eHr4/Hx8fHx8fvz8QEBAQEBDAP5CQkJCQkMA/ERERERERwT+SkZGRkZHBPxISEhISEsI/kpKSkpKSwj8TExMTExPDP5STk5OTk8M/FBQUFBQUxD+UlJSUlJTEPxUVFRUVFcU/lpWVlZWVxT8WFhYWFhbGP5aWlpaWlsY/FxcXFxcXxz+Yl5eXl5fHPxgYGBgYGMg/mJiYmJiYyD8ZGRkZGRnJP5qZmZmZmck/GhoaGhoayj+ampqamprKPxsbGxsbG8s/nJubm5ubyz8cHBwcHBzMP5ycnJycnMw/HR0dHR0dzT+enZ2dnZ3NPx4eHh4eHs4/np6enp6ezj8fHx8fHx/PP6Cfn5+fn88/EBAQEBAQ0D9QUFBQUFDQP5CQkJCQkNA/0dDQ0NDQ0D8RERERERHRP1FRUVFRUdE/kpGRkZGR0T/S0dHR0dHRPxISEhISEtI/UlJSUlJS0j+SkpKSkpLSP9PS0tLS0tI/ExMTExMT0z9TU1NTU1PTP5STk5OTk9M/1NPT09PT0z8UFBQUFBTUP1RUVFRUVNQ/lJSUlJSU1D/V1NTU1NTUPxUVFRUVFdU/VVVVVVVV1T+WlZWVlZXVP9bV1dXV1dU/FhYWFhYW1j9WVlZWVlbWP5aWlpaWltY/19bW1tbW1j8XFxcXFxfXP1dXV1dXV9c/mJeXl5eX1z/Y19fX19fXPxgYGBgYGNg/WFhYWFhY2D+YmJiYmJjYP9nY2NjY2Ng/GRkZGRkZ2T9ZWVlZWVnZP5qZmZmZmdk/2tnZ2dnZ2T8aGhoaGhraP1paWlpaWto/mpqampqa2j/b2tra2traPxsbGxsbG9s/W1tbW1tb2z+cm5ubm5vbP9zb29vb29s/HBwcHBwc3D9cXFxcXFzcP5ycnJycnNw/3dzc3Nzc3D8dHR0dHR3dP11dXV1dXd0/np2dnZ2d3T/e3d3d3d3dPx4eHh4eHt4/Xl5eXl5e3j+enp6enp7eP9/e3t7e3t4/Hx8fHx8f3z9fX19fX1/fP6Cfn5+fn98/4N/f39/f3z8QEBAQEBDgPzAwMDAwMOA/UFBQUFBQ4D9wcHBwcHDgP5CQkJCQkOA/sbCwsLCw4D/R0NDQ0NDgP/Hw8PDw8OA/ERERERER4T8xMTExMTHhP1FRUVFRUeE/cXFxcXFx4T+SkZGRkZHhP7KxsbGxseE/0tHR0dHR4T/y8fHx8fHhPxISEhISEuI/MjIyMjIy4j9SUlJSUlLiP3JycnJycuI/kpKSkpKS4j+zsrKysrLiP9PS0tLS0uI/8/Ly8vLy4j8TExMTExPjPzMzMzMzM+M/U1NTU1NT4z9zc3Nzc3PjP5STk5OTk+M/tLOzs7Oz4z/U09PT09PjP/Tz8/Pz8+M/FBQUFBQU5D80NDQ0NDTkP1RUVFRUVOQ/dHR0dHR05D+UlJSUlJTkP7W0tLS0tOQ/1dTU1NTU5D/19PT09PTkPxUVFRUVFeU/NTU1NTU15T9VVVVVVVXlP3V1dXV1deU/lpWVlZWV5T+2tbW1tbXlP9bV1dXV1eU/9vX19fX15T8WFhYWFhbmPzY2NjY2NuY/VlZWVlZW5j92dnZ2dnbmP5aWlpaWluY/t7a2tra25j/X1tbW1tbmP/f29vb29uY/FxcXFxcX5z83Nzc3NzfnP1dXV1dXV+c/d3d3d3d35z+Yl5eXl5fnP7i3t7e3t+c/2NfX19fX5z/49/f39/fnPxgYGBgYGOg/ODg4ODg46D9YWFhYWFjoP3h4eHh4eOg/mJiYmJiY6D+5uLi4uLjoP9nY2NjY2Og/+fj4+Pj46D8ZGRkZGRnpPzk5OTk5Oek/WVlZWVlZ6T95eXl5eXnpP5qZmZmZmek/urm5ubm56T/a2dnZ2dnpP/r5+fn5+ek/GhoaGhoa6j86Ojo6OjrqP1paWlpaWuo/enp6enp66j+ampqamprqP7u6urq6uuo/29ra2tra6j/7+vr6+vrqPxsbGxsbG+s/Ozs7Ozs76z9bW1tbW1vrP3t7e3t7e+s/nJubm5ub6z+8u7u7u7vrP9zb29vb2+s//Pv7+/v76z8cHBwcHBzsPzw8PDw8POw/XFxcXFxc7D98fHx8fHzsP5ycnJycnOw/vby8vLy87D/d3Nzc3NzsP/38/Pz8/Ow/HR0dHR0d7T89PT09PT3tP11dXV1dXe0/fX19fX197T+enZ2dnZ3tP769vb29ve0/3t3d3d3d7T/+/f39/f3tPx4eHh4eHu4/Pj4+Pj4+7j9eXl5eXl7uP35+fn5+fu4/np6enp6e7j+/vr6+vr7uP9/e3t7e3u4///7+/v7+7j8fHx8fHx/vPz8/Pz8/P+8/X19fX19f7z9/f39/f3/vP6Cfn5+fn+8/wL+/v7+/7z/g39/f39/vPwAAAAAAAPA/AAAAAAAAAAAQEBAQEBBwPxAQEBAQEIA/GBgYGBgYiD8QEBAQEBCQPxQUFBQUFJQ/GBgYGBgYmD8cHBwcHBycPxAQEBAQEKA/EhISEhISoj8UFBQUFBSkPxYWFhYWFqY/GBgYGBgYqD8aGhoaGhqqPxwcHBwcHKw/Hh4eHh4erj8QEBAQEBCwPxEREREREbE/EhISEhISsj8TExMTExOzPxQUFBQUFLQ/FRUVFRUVtT8WFhYWFha2PxcXFxcXF7c/GBgYGBgYuD8ZGRkZGRm5PxoaGhoaGro/GxsbGxsbuz8cHBwcHBy8Px0dHR0dHb0/Hh4eHh4evj8fHx8fHx+/PxAQEBAQEMA/kJCQkJCQwD8RERERERHBP5KRkZGRkcE/EhISEhISwj+SkpKSkpLCPxMTExMTE8M/lJOTk5OTwz8UFBQUFBTEP5SUlJSUlMQ/FRUVFRUVxT+WlZWVlZXFPxYWFhYWFsY/lpaWlpaWxj8XFxcXFxfHP5iXl5eXl8c/GBgYGBgYyD+YmJiYmJjIPxkZGRkZGck/mpmZmZmZyT8aGhoaGhrKP5qampqamso/GxsbGxsbyz+cm5ubm5vLPxwcHBwcHMw/nJycnJyczD8dHR0dHR3NP56dnZ2dnc0/Hh4eHh4ezj+enp6enp7OPx8fHx8fH88/oJ+fn5+fzz8QEBAQEBDQP1BQUFBQUNA/kJCQkJCQ0D/R0NDQ0NDQPxEREREREdE/UVFRUVFR0T+SkZGRkZHRP9LR0dHR0dE/EhISEhIS0j9SUlJSUlLSP5KSkpKSktI/09LS0tLS0j8TExMTExPTP1NTU1NTU9M/lJOTk5OT0z/U09PT09PTPxQUFBQUFNQ/VFRUVFRU1D+UlJSUlJTUP9XU1NTU1NQ/FRUVFRUV1T9VVVVVVVXVP5aVlZWVldU/1tXV1dXV1T8WFhYWFhbWP1ZWVlZWVtY/lpaWlpaW1j/X1tbW1tbWPxcXFxcXF9c/V1dXV1dX1z+Yl5eXl5fXP9jX19fX19c/GBgYGBgY2D9YWFhYWFjYP5iYmJiYmNg/2djY2NjY2D8ZGRkZGRnZP1lZWVlZWdk/mpmZmZmZ2T/a2dnZ2dnZPxoaGhoaGto/WlpaWlpa2j+ampqampraP9va2tra2to/GxsbGxsb2z9bW1tbW1vbP5ybm5ubm9s/3Nvb29vb2z8cHBwcHBzcP1xcXFxcXNw/nJycnJyc3D/d3Nzc3NzcPx0dHR0dHd0/XV1dXV1d3T+enZ2dnZ3dP97d3d3d3d0/Hh4eHh4e3j9eXl5eXl7eP56enp6ent4/397e3t7e3j8fHx8fHx/fP19fX19fX98/oJ+fn5+f3z/g39/f39/fPxAQEBAQEOA/MDAwMDAw4D9QUFBQUFDgP3BwcHBwcOA/kJCQkJCQ4D+xsLCwsLDgP9HQ0NDQ0OA/8fDw8PDw4D8RERERERHhPzExMTExMeE/UVFRUVFR4T9xcXFxcXHhP5KRkZGRkeE/srGxsbGx4T/S0dHR0dHhP/Lx8fHx8eE/EhISEhIS4j8yMjIyMjLiP1JSUlJSUuI/cnJycnJy4j+SkpKSkpLiP7OysrKysuI/09LS0tLS4j/z8vLy8vLiPxMTExMTE+M/MzMzMzMz4z9TU1NTU1PjP3Nzc3Nzc+M/lJOTk5OT4z+0s7Ozs7PjP9TT09PT0+M/9PPz8/Pz4z8UFBQUFBTkPzQ0NDQ0NOQ/VFRUVFRU5D90dHR0dHTkP5SUlJSUlOQ/tbS0tLS05D/V1NTU1NTkP/X09PT09OQ/FRUVFRUV5T81NTU1NTXlP1VVVVVVVeU/dXV1dXV15T+WlZWVlZXlP7a1tbW1teU/1tXV1dXV5T/29fX19fXlPxYWFhYWFuY/NjY2NjY25j9WVlZWVlbmP3Z2dnZ2duY/lpaWlpaW5j+3tra2trbmP9fW1tbW1uY/9/b29vb25j8XFxcXFxfnPzc3Nzc3N+c/V1dXV1dX5z93d3d3d3fnP5iXl5eXl+c/uLe3t7e35z/Y19fX19fnP/j39/f39+c/GBgYGBgY6D84ODg4ODjoP1hYWFhYWOg/eHh4eHh46D+YmJiYmJjoP7m4uLi4uOg/2djY2NjY6D/5+Pj4+PjoPxkZGRkZGek/OTk5OTk56T9ZWVlZWVnpP3l5eXl5eek/mpmZmZmZ6T+6ubm5ubnpP9rZ2dnZ2ek/+vn5+fn56T8aGhoaGhrqPzo6Ojo6Ouo/WlpaWlpa6j96enp6enrqP5qampqamuo/u7q6urq66j/b2tra2trqP/v6+vr6+uo/GxsbGxsb6z87Ozs7OzvrP1tbW1tbW+s/e3t7e3t76z+cm5ubm5vrP7y7u7u7u+s/3Nvb29vb6z/8+/v7+/vrPxwcHBwcHOw/PDw8PDw87D9cXFxcXFzsP3x8fHx8fOw/nJycnJyc7D+9vLy8vLzsP93c3Nzc3Ow//fz8/Pz87D8dHR0dHR3tPz09PT09Pe0/XV1dXV1d7T99fX19fX3tP56dnZ2dne0/vr29vb297T/e3d3d3d3tP/79/f39/e0/Hh4eHh4e7j8+Pj4+Pj7uP15eXl5eXu4/fn5+fn5+7j+enp6enp7uP7++vr6+vu4/397e3t7e7j///v7+/v7uPx8fHx8fH+8/Pz8/Pz8/7z9fX19fX1/vP39/f39/f+8/oJ+fn5+f7z/Av7+/v7/vP+Df39/f3+8/AAAAAAAA8D8AAAAAAAAAABAQEBAQEHA/EBAQEBAQgD8YGBgYGBiIPxAQEBAQEJA/FBQUFBQUlD8YGBgYGBiYPxwcHBwcHJw/EBAQEBAQoD8SEhISEhKiPxQUFBQUFKQ/FhYWFhYWpj8YGBgYGBioPxoaGhoaGqo/HBwcHBwcrD8eHh4eHh6uPxAQEBAQELA/ERERERERsT8SEhISEhKyPxMTExMTE7M/FBQUFBQUtD8VFRUVFRW1PxYWFhYWFrY/FxcXFxcXtz8YGBgYGBi4PxkZGRkZGbk/GhoaGhoauj8bGxsbGxu7PxwcHBwcHLw/HR0dHR0dvT8eHh4eHh6+Px8fHx8fH78/EBAQEBAQwD+QkJCQkJDAPxEREREREcE/kpGRkZGRwT8SEhISEhLCP5KSkpKSksI/ExMTExMTwz+Uk5OTk5PDPxQUFBQUFMQ/lJSUlJSUxD8VFRUVFRXFP5aVlZWVlcU/FhYWFhYWxj+WlpaWlpbGPxcXFxcXF8c/mJeXl5eXxz8YGBgYGBjIP5iYmJiYmMg/GRkZGRkZyT+amZmZmZnJPxoaGhoaGso/mpqampqayj8bGxsbGxvLP5ybm5ubm8s/HBwcHBwczD+cnJycnJzMPx0dHR0dHc0/np2dnZ2dzT8eHh4eHh7OP56enp6ens4/Hx8fHx8fzz+gn5+fn5/PPxAQEBAQENA/UFBQUFBQ0D+QkJCQkJDQP9HQ0NDQ0NA/ERERERER0T9RUVFRUVHRP5KRkZGRkdE/0tHR0dHR0T8SEhISEhLSP1JSUlJSUtI/kpKSkpKS0j/T0tLS0tLSPxMTExMTE9M/U1NTU1NT0z+Uk5OTk5PTP9TT09PT09M/FBQUFBQU1D9UVFRUVFTUP5SUlJSUlNQ/1dTU1NTU1D8VFRUVFRXVP1VVVVVVVdU/lpWVlZWV1T/W1dXV1dXVPxYWFhYWFtY/VlZWVlZW1j+WlpaWlpbWP9fW1tbW1tY/FxcXFxcX1z9XV1dXV1fXP5iXl5eXl9c/2NfX19fX1z8YGBgYGBjYP1hYWFhYWNg/mJiYmJiY2D/Z2NjY2NjYPxkZGRkZGdk/WVlZWVlZ2T+amZmZmZnZP9rZ2dnZ2dk/GhoaGhoa2j9aWlpaWlraP5qampqamto/29ra2tra2j8bGxsbGxvbP1tbW1tbW9s/nJubm5ub2z/c29vb29vbPxwcHBwcHNw/XFxcXFxc3D+cnJycnJzcP93c3Nzc3Nw/HR0dHR0d3T9dXV1dXV3dP56dnZ2dnd0/3t3d3d3d3T8eHh4eHh7eP15eXl5eXt4/np6enp6e3j/f3t7e3t7ePx8fHx8fH98/X19fX19f3z+gn5+fn5/fP+Df39/f398/EBAQEBAQ4D8wMDAwMDDgP1BQUFBQUOA/cHBwcHBw4D+QkJCQkJDgP7GwsLCwsOA/0dDQ0NDQ4D/x8PDw8PDgPxEREREREeE/MTExMTEx4T9RUVFRUVHhP3FxcXFxceE/kpGRkZGR4T+ysbGxsbHhP9LR0dHR0eE/8vHx8fHx4T8SEhISEhLiPzIyMjIyMuI/UlJSUlJS4j9ycnJycnLiP5KSkpKSkuI/s7KysrKy4j/T0tLS0tLiP/Py8vLy8uI/ExMTExMT4z8zMzMzMzPjP1NTU1NTU+M/c3Nzc3Nz4z+Uk5OTk5PjP7Szs7Ozs+M/1NPT09PT4z/08/Pz8/PjPxQUFBQUFOQ/NDQ0NDQ05D9UVFRUVFTkP3R0dHR0dOQ/lJSUlJSU5D+1tLS0tLTkP9XU1NTU1OQ/9fT09PT05D8VFRUVFRXlPzU1NTU1NeU/VVVVVVVV5T91dXV1dXXlP5aVlZWVleU/trW1tbW15T/W1dXV1dXlP/b19fX19eU/FhYWFhYW5j82NjY2NjbmP1ZWVlZWVuY/dnZ2dnZ25j+WlpaWlpbmP7e2tra2tuY/19bW1tbW5j/39vb29vbmPxcXFxcXF+c/Nzc3Nzc35z9XV1dXV1fnP3d3d3d3d+c/mJeXl5eX5z+4t7e3t7fnP9jX19fX1+c/+Pf39/f35z8YGBgYGBjoPzg4ODg4OOg/WFhYWFhY6D94eHh4eHjoP5iYmJiYmOg/ubi4uLi46D/Z2NjY2NjoP/n4+Pj4+Og/GRkZGRkZ6T85OTk5OTnpP1lZWVlZWek/eXl5eXl56T+amZmZmZnpP7q5ubm5uek/2tnZ2dnZ6T/6+fn5+fnpPxoaGhoaGuo/Ojo6Ojo66j9aWlpaWlrqP3p6enp6euo/mpqampqa6j+7urq6urrqP9va2tra2uo/+/r6+vr66j8bGxsbGxvrPzs7Ozs7O+s/W1tbW1tb6z97e3t7e3vrP5ybm5ubm+s/vLu7u7u76z/c29vb29vrP/z7+/v7++s/HBwcHBwc7D88PDw8PDzsP1xcXFxcXOw/fHx8fHx87D+cnJycnJzsP728vLy8vOw/3dzc3Nzc7D/9/Pz8/PzsPx0dHR0dHe0/PT09PT097T9dXV1dXV3tP319fX19fe0/np2dnZ2d7T++vb29vb3tP97d3d3d3e0//v39/f397T8eHh4eHh7uPz4+Pj4+Pu4/Xl5eXl5e7j9+fn5+fn7uP56enp6enu4/v76+vr6+7j/f3t7e3t7uP//+/v7+/u4/Hx8fHx8f7z8/Pz8/Pz/vP19fX19fX+8/f39/f39/7z+gn5+fn5/vP8C/v7+/v+8/4N/f39/f7z8AAAAAAADwPwAAAAAAAAAAEBAQEBAQcD8QEBAQEBCAPxgYGBgYGIg/EBAQEBAQkD8UFBQUFBSUPxgYGBgYGJg/HBwcHBwcnD8QEBAQEBCgPxISEhISEqI/FBQUFBQUpD8WFhYWFhamPxgYGBgYGKg/GhoaGhoaqj8cHBwcHBysPx4eHh4eHq4/EBAQEBAQsD8RERERERGxPxISEhISErI/ExMTExMTsz8UFBQUFBS0PxUVFRUVFbU/FhYWFhYWtj8XFxcXFxe3PxgYGBgYGLg/GRkZGRkZuT8aGhoaGhq6PxsbGxsbG7s/HBwcHBwcvD8dHR0dHR29Px4eHh4eHr4/Hx8fHx8fvz8QEBAQEBDAP5CQkJCQkMA/ERERERERwT+SkZGRkZHBPxISEhISEsI/kpKSkpKSwj8TExMTExPDP5STk5OTk8M/FBQUFBQUxD+UlJSUlJTEPxUVFRUVFcU/lpWVlZWVxT8WFhYWFhbGP5aWlpaWlsY/FxcXFxcXxz+Yl5eXl5fHPxgYGBgYGMg/mJiYmJiYyD8ZGRkZGRnJP5qZmZmZmck/GhoaGhoayj+ampqamprKPxsbGxsbG8s/nJubm5ubyz8cHBwcHBzMP5ycnJycnMw/HR0dHR0dzT+enZ2dnZ3NPx4eHh4eHs4/np6enp6ezj8fHx8fHx/PP6Cfn5+fn88/EBAQEBAQ0D9QUFBQUFDQP5CQkJCQkNA/0dDQ0NDQ0D8RERERERHRP1FRUVFRUdE/kpGRkZGR0T/S0dHR0dHRPxISEhISEtI/UlJSUlJS0j+SkpKSkpLSP9PS0tLS0tI/ExMTExMT0z9TU1NTU1PTP5STk5OTk9M/1NPT09PT0z8UFBQUFBTUP1RUVFRUVNQ/lJSUlJSU1D/V1NTU1NTUPxUVFRUVFdU/VVVVVVVV1T+WlZWVlZXVP9bV1dXV1dU/FhYWFhYW1j9WVlZWVlbWP5aWlpaWltY/19bW1tbW1j8XFxcXFxfXP1dXV1dXV9c/mJeXl5eX1z/Y19fX19fXPxgYGBgYGNg/WFhYWFhY2D+YmJiYmJjYP9nY2NjY2Ng/GRkZGRkZ2T9ZWVlZWVnZP5qZmZmZmdk/2tnZ2dnZ2T8aGhoaGhraP1paWlpaWto/mpqampqa2j/b2tra2traPxsbGxsbG9s/W1tbW1tb2z+cm5ubm5vbP9zb29vb29s/HBwcHBwc3D9cXFxcXFzcP5ycnJycnNw/3dzc3Nzc3D8dHR0dHR3dP11dXV1dXd0/np2dnZ2d3T/e3d3d3d3dPx4eHh4eHt4/Xl5eXl5e3j+enp6enp7eP9/e3t7e3t4/Hx8fHx8f3z9fX19fX1/fP6Cfn5+fn98/4N/f39/f3z8QEBAQEBDgPzAwMDAwMOA/UFBQUFBQ4D9wcHBwcHDgP5CQkJCQkOA/sbCwsLCw4D/R0NDQ0NDgP/Hw8PDw8OA/ERERERER4T8xMTExMTHhP1FRUVFRUeE/cXFxcXFx4T+SkZGRkZHhP7KxsbGxseE/0tHR0dHR4T/y8fHx8fHhPxISEhISEuI/MjIyMjIy4j9SUlJSUlLiP3JycnJycuI/kpKSkpKS4j+zsrKysrLiP9PS0tLS0uI/8/Ly8vLy4j8TExMTExPjPzMzMzMzM+M/U1NTU1NT4z9zc3Nzc3PjP5STk5OTk+M/tLOzs7Oz4z/U09PT09PjP/Tz8/Pz8+M/FBQUFBQU5D80NDQ0NDTkP1RUVFRUVOQ/dHR0dHR05D+UlJSUlJTkP7W0tLS0tOQ/1dTU1NTU5D/19PT09PTkPxUVFRUVFeU/NTU1NTU15T9VVVVVVVXlP3V1dXV1deU/lpWVlZWV5T+2tbW1tbXlP9bV1dXV1eU/9vX19fX15T8WFhYWFhbmPzY2NjY2NuY/VlZWVlZW5j92dnZ2dnbmP5aWlpaWluY/t7a2tra25j/X1tbW1tbmP/f29vb29uY/FxcXFxcX5z83Nzc3NzfnP1dXV1dXV+c/d3d3d3d35z+Yl5eXl5fnP7i3t7e3t+c/2NfX19fX5z/49/f39/fnPxgYGBgYGOg/ODg4ODg46D9YWFhYWFjoP3h4eHh4eOg/mJiYmJiY6D+5uLi4uLjoP9nY2NjY2Og/+fj4+Pj46D8ZGRkZGRnpPzk5OTk5Oek/WVlZWVlZ6T95eXl5eXnpP5qZmZmZmek/urm5ubm56T/a2dnZ2dnpP/r5+fn5+ek/GhoaGhoa6j86Ojo6OjrqP1paWlpaWuo/enp6enp66j+ampqamprqP7u6urq6uuo/29ra2tra6j/7+vr6+vrqPxsbGxsbG+s/Ozs7Ozs76z9bW1tbW1vrP3t7e3t7e+s/nJubm5ub6z+8u7u7u7vrP9zb29vb2+s//Pv7+/v76z8cHBwcHBzsPzw8PDw8POw/XFxcXFxc7D98fHx8fHzsP5ycnJycnOw/vby8vLy87D/d3Nzc3NzsP/38/Pz8/Ow/HR0dHR0d7T89PT09PT3tP11dXV1dXe0/fX19fX197T+enZ2dnZ3tP769vb29ve0/3t3d3d3d7T/+/f39/f3tPx4eHh4eHu4/Pj4+Pj4+7j9eXl5eXl7uP35+fn5+fu4/np6enp6e7j+/vr6+vr7uP9/e3t7e3u4///7+/v7+7j8fHx8fHx/vPz8/Pz8/P+8/X19fX19f7z9/f39/f3/vP6Cfn5+fn+8/wL+/v7+/7z/g39/f39/vPwAAAAAAAPA/AAAAAAAAAAAQEBAQEBBwPxAQEBAQEIA/GBgYGBgYiD8QEBAQEBCQPxQUFBQUFJQ/GBgYGBgYmD8cHBwcHBycPxAQEBAQEKA/EhISEhISoj8UFBQUFBSkPxYWFhYWFqY/GBgYGBgYqD8aGhoaGhqqPxwcHBwcHKw/Hh4eHh4erj8QEBAQEBCwPxEREREREbE/EhISEhISsj8TExMTExOzPxQUFBQUFLQ/FRUVFRUVtT8WFhYWFha2PxcXFxcXF7c/GBgYGBgYuD8ZGRkZGRm5PxoaGhoaGro/GxsbGxsbuz8cHBwcHBy8Px0dHR0dHb0/Hh4eHh4evj8fHx8fHx+/PxAQEBAQEMA/kJCQkJCQwD8RERERERHBP5KRkZGRkcE/EhISEhISwj+SkpKSkpLCPxMTExMTE8M/lJOTk5OTwz8UFBQUFBTEP5SUlJSUlMQ/FRUVFRUVxT+WlZWVlZXFPxYWFhYWFsY/lpaWlpaWxj8XFxcXFxfHP5iXl5eXl8c/GBgYGBgYyD+YmJiYmJjIPxkZGRkZGck/mpmZmZmZyT8aGhoaGhrKP5qampqamso/GxsbGxsbyz+cm5ubm5vLPxwcHBwcHMw/nJycnJyczD8dHR0dHR3NP56dnZ2dnc0/Hh4eHh4ezj+enp6enp7OPx8fHx8fH88/oJ+fn5+fzz8QEBAQEBDQP1BQUFBQUNA/kJCQkJCQ0D/R0NDQ0NDQPxEREREREdE/UVFRUVFR0T+SkZGRkZHRP9LR0dHR0dE/EhISEhIS0j9SUlJSUlLSP5KSkpKSktI/09LS0tLS0j8TExMTExPTP1NTU1NTU9M/lJOTk5OT0z/U09PT09PTPxQUFBQUFNQ/VFRUVFRU1D+UlJSUlJTUP9XU1NTU1NQ/FRUVFRUV1T9VVVVVVVXVP5aVlZWVldU/1tXV1dXV1T8WFhYWFhbWP1ZWVlZWVtY/lpaWlpaW1j/X1tbW1tbWPxcXFxcXF9c/V1dXV1dX1z+Yl5eXl5fXP9jX19fX19c/GBgYGBgY2D9YWFhYWFjYP5iYmJiYmNg/2djY2NjY2D8ZGRkZGRnZP1lZWVlZWdk/mpmZmZmZ2T/a2dnZ2dnZPxoaGhoaGto/WlpaWlpa2j+ampqampraP9va2tra2to/GxsbGxsb2z9bW1tbW1vbP5ybm5ubm9s/3Nvb29vb2z8cHBwcHBzcP1xcXFxcXNw/nJycnJyc3D/d3Nzc3NzcPx0dHR0dHd0/XV1dXV1d3T+enZ2dnZ3dP97d3d3d3d0/Hh4eHh4e3j9eXl5eXl7eP56enp6ent4/397e3t7e3j8fHx8fHx/fP19fX19fX98/oJ+fn5+f3z/g39/f39/fPxAQEBAQEOA/MDAwMDAw4D9QUFBQUFDgP3BwcHBwcOA/kJCQkJCQ4D+xsLCwsLDgP9HQ0NDQ0OA/8fDw8PDw4D8RERERERHhPzExMTExMeE/UVFRUVFR4T9xcXFxcXHhP5KRkZGRkeE/srGxsbGx4T/S0dHR0dHhP/Lx8fHx8eE/EhISEhIS4j8yMjIyMjLiP1JSUlJSUuI/cnJycnJy4j+SkpKSkpLiP7OysrKysuI/09LS0tLS4j/z8vLy8vLiPxMTExMTE+M/MzMzMzMz4z9TU1NTU1PjP3Nzc3Nzc+M/lJOTk5OT4z+0s7Ozs7PjP9TT09PT0+M/9PPz8/Pz4z8UFBQUFBTkPzQ0NDQ0NOQ/VFRUVFRU5D90dHR0dHTkP5SUlJSUlOQ/tbS0tLS05D/V1NTU1NTkP/X09PT09OQ/FRUVFRUV5T81NTU1NTXlP1VVVVVVVeU/dXV1dXV15T+WlZWVlZXlP7a1tbW1teU/1tXV1dXV5T/29fX19fXlPxYWFhYWFuY/NjY2NjY25j9WVlZWVlbmP3Z2dnZ2duY/lpaWlpaW5j+3tra2trbmP9fW1tbW1uY/9/b29vb25j8XFxcXFxfnPzc3Nzc3N+c/V1dXV1dX5z93d3d3d3fnP5iXl5eXl+c/uLe3t7e35z/Y19fX19fnP/j39/f39+c/GBgYGBgY6D84ODg4ODjoP1hYWFhYWOg/eHh4eHh46D+YmJiYmJjoP7m4uLi4uOg/2djY2NjY6D/5+Pj4+PjoPxkZGRkZGek/OTk5OTk56T9ZWVlZWVnpP3l5eXl5eek/mpmZmZmZ6T+6ubm5ubnpP9rZ2dnZ2ek/+vn5+fn56T8aGhoaGhrqPzo6Ojo6Ouo/WlpaWlpa6j96enp6enrqP5qampqamuo/u7q6urq66j/b2tra2trqP/v6+vr6+uo/GxsbGxsb6z87Ozs7OzvrP1tbW1tbW+s/e3t7e3t76z+cm5ubm5vrP7y7u7u7u+s/3Nvb29vb6z/8+/v7+/vrPxwcHBwcHOw/PDw8PDw87D9cXFxcXFzsP3x8fHx8fOw/nJycnJyc7D+9vLy8vLzsP93c3Nzc3Ow//fz8/Pz87D8dHR0dHR3tPz09PT09Pe0/XV1dXV1d7T99fX19fX3tP56dnZ2dne0/vr29vb297T/e3d3d3d3tP/79/f39/e0/Hh4eHh4e7j8+Pj4+Pj7uP15eXl5eXu4/fn5+fn5+7j+enp6enp7uP7++vr6+vu4/397e3t7e7j///v7+/v7uPx8fHx8fH+8/Pz8/Pz8/7z9fX19fX1/vP39/f39/f+8/oJ+fn5+f7z/Av7+/v7/vP+Df39/f3+8/AAAAAAAA8D8AAAAAAAAAABAQEBAQEHA/EBAQEBAQgD8YGBgYGBiIPxAQEBAQEJA/FBQUFBQUlD8YGBgYGBiYPxwcHBwcHJw/EBAQEBAQoD8SEhISEhKiPxQUFBQUFKQ/FhYWFhYWpj8YGBgYGBioPxoaGhoaGqo/HBwcHBwcrD8eHh4eHh6uPxAQEBAQELA/ERERERERsT8SEhISEhKyPxMTExMTE7M/FBQUFBQUtD8VFRUVFRW1PxYWFhYWFrY/FxcXFxcXtz8YGBgYGBi4PxkZGRkZGbk/GhoaGhoauj8bGxsbGxu7PxwcHBwcHLw/HR0dHR0dvT8eHh4eHh6+Px8fHx8fH78/EBAQEBAQwD+QkJCQkJDAPxEREREREcE/kpGRkZGRwT8SEhISEhLCP5KSkpKSksI/ExMTExMTwz+Uk5OTk5PDPxQUFBQUFMQ/lJSUlJSUxD8VFRUVFRXFP5aVlZWVlcU/FhYWFhYWxj+WlpaWlpbGPxcXFxcXF8c/mJeXl5eXxz8YGBgYGBjIP5iYmJiYmMg/GRkZGRkZyT+amZmZmZnJPxoaGhoaGso/mpqampqayj8bGxsbGxvLP5ybm5ubm8s/HBwcHBwczD+cnJycnJzMPx0dHR0dHc0/np2dnZ2dzT8eHh4eHh7OP56enp6ens4/Hx8fHx8fzz+gn5+fn5/PPxAQEBAQENA/UFBQUFBQ0D+QkJCQkJDQP9HQ0NDQ0NA/ERERERER0T9RUVFRUVHRP5KRkZGRkdE/0tHR0dHR0T8SEhISEhLSP1JSUlJSUtI/kpKSkpKS0j/T0tLS0tLSPxMTExMTE9M/U1NTU1NT0z+Uk5OTk5PTP9TT09PT09M/FBQUFBQU1D9UVFRUVFTUP5SUlJSUlNQ/1dTU1NTU1D8VFRUVFRXVP1VVVVVVVdU/lpWVlZWV1T/W1dXV1dXVPxYWFhYWFtY/VlZWVlZW1j+WlpaWlpbWP9fW1tbW1tY/FxcXFxcX1z9XV1dXV1fXP5iXl5eXl9c/2NfX19fX1z8YGBgYGBjYP1hYWFhYWNg/mJiYmJiY2D/Z2NjY2NjYPxkZGRkZGdk/WVlZWVlZ2T+amZmZmZnZP9rZ2dnZ2dk/GhoaGhoa2j9aWlpaWlraP5qampqamto/29ra2tra2j8bGxsbGxvbP1tbW1tbW9s/nJubm5ub2z/c29vb29vbPxwcHBwcHNw/XFxcXFxc3D+cnJycnJzcP93c3Nzc3Nw/HR0dHR0d3T9dXV1dXV3dP56dnZ2dnd0/3t3d3d3d3T8eHh4eHh7eP15eXl5eXt4/np6enp6e3j/f3t7e3t7ePx8fHx8fH98/X19fX19f3z+gn5+fn5/fP+Df39/f398/EBAQEBAQ4D8wMDAwMDDgP1BQUFBQUOA/cHBwcHBw4D+QkJCQkJDgP7GwsLCwsOA/0dDQ0NDQ4D/x8PDw8PDgPxEREREREeE/MTExMTEx4T9RUVFRUVHhP3FxcXFxceE/kpGRkZGR4T+ysbGxsbHhP9LR0dHR0eE/8vHx8fHx4T8SEhISEhLiPzIyMjIyMuI/UlJSUlJS4j9ycnJycnLiP5KSkpKSkuI/s7KysrKy4j/T0tLS0tLiP/Py8vLy8uI/ExMTExMT4z8zMzMzMzPjP1NTU1NTU+M/c3Nzc3Nz4z+Uk5OTk5PjP7Szs7Ozs+M/1NPT09PT4z/08/Pz8/PjPxQUFBQUFOQ/NDQ0NDQ05D9UVFRUVFTkP3R0dHR0dOQ/lJSUlJSU5D+1tLS0tLTkP9XU1NTU1OQ/9fT09PT05D8VFRUVFRXlPzU1NTU1NeU/VVVVVVVV5T91dXV1dXXlP5aVlZWVleU/trW1tbW15T/W1dXV1dXlP/b19fX19eU/FhYWFhYW5j82NjY2NjbmP1ZWVlZWVuY/dnZ2dnZ25j+WlpaWlpbmP7e2tra2tuY/19bW1tbW5j/39vb29vbmPxcXFxcXF+c/Nzc3Nzc35z9XV1dXV1fnP3d3d3d3d+c/mJeXl5eX5z+4t7e3t7fnP9jX19fX1+c/+Pf39/f35z8YGBgYGBjoPzg4ODg4OOg/WFhYWFhY6D94eHh4eHjoP5iYmJiYmOg/ubi4uLi46D/Z2NjY2NjoP/n4+Pj4+Og/GRkZGRkZ6T85OTk5OTnpP1lZWVlZWek/eXl5eXl56T+amZmZmZnpP7q5ubm5uek/2tnZ2dnZ6T/6+fn5+fnpPxoaGhoaGuo/Ojo6Ojo66j9aWlpaWlrqP3p6enp6euo/mpqampqa6j+7urq6urrqP9va2tra2uo/+/r6+vr66j8bGxsbGxvrPzs7Ozs7O+s/W1tbW1tb6z97e3t7e3vrP5ybm5ubm+s/vLu7u7u76z/c29vb29vrP/z7+/v7++s/HBwcHBwc7D88PDw8PDzsP1xcXFxcXOw/fHx8fHx87D+cnJycnJzsP728vLy8vOw/3dzc3Nzc7D/9/Pz8/PzsPx0dHR0dHe0/PT09PT097T9dXV1dXV3tP319fX19fe0/np2dnZ2d7T++vb29vb3tP97d3d3d3e0//v39/f397T8eHh4eHh7uPz4+Pj4+Pu4/Xl5eXl5e7j9+fn5+fn7uP56enp6enu4/v76+vr6+7j/f3t7e3t7uP//+/v7+/u4/Hx8fHx8f7z8/Pz8/Pz/vP19fX19fX+8/f39/f39/7z+gn5+fn5/vP8C/v7+/v+8/4N/f39/f7z8AAAAAAADwPwAAAAAAAAAAEBAQEBAQcD8QEBAQEBCAPxgYGBgYGIg/EBAQEBAQkD8UFBQUFBSUPxgYGBgYGJg/HBwcHBwcnD8QEBAQEBCgPxISEhISEqI/FBQUFBQUpD8WFhYWFhamPxgYGBgYGKg/GhoaGhoaqj8cHBwcHBysPx4eHh4eHq4/EBAQEBAQsD8RERERERGxPxISEhISErI/ExMTExMTsz8UFBQUFBS0PxUVFRUVFbU/FhYWFhYWtj8XFxcXFxe3PxgYGBgYGLg/GRkZGRkZuT8aGhoaGhq6PxsbGxsbG7s/HBwcHBwcvD8dHR0dHR29Px4eHh4eHr4/Hx8fHx8fvz8QEBAQEBDAP5CQkJCQkMA/ERERERERwT+SkZGRkZHBPxISEhISEsI/kpKSkpKSwj8TExMTExPDP5STk5OTk8M/FBQUFBQUxD+UlJSUlJTEPxUVFRUVFcU/lpWVlZWVxT8WFhYWFhbGP5aWlpaWlsY/FxcXFxcXxz+Yl5eXl5fHPxgYGBgYGMg/mJiYmJiYyD8ZGRkZGRnJP5qZmZmZmck/GhoaGhoayj+ampqamprKPxsbGxsbG8s/nJubm5ubyz8cHBwcHBzMP5ycnJycnMw/HR0dHR0dzT+enZ2dnZ3NPx4eHh4eHs4/np6enp6ezj8fHx8fHx/PP6Cfn5+fn88/EBAQEBAQ0D9QUFBQUFDQP5CQkJCQkNA/0dDQ0NDQ0D8RERERERHRP1FRUVFRUdE/kpGRkZGR0T/S0dHR0dHRPxISEhISEtI/UlJSUlJS0j+SkpKSkpLSP9PS0tLS0tI/ExMTExMT0z9TU1NTU1PTP5STk5OTk9M/1NPT09PT0z8UFBQUFBTUP1RUVFRUVNQ/lJSUlJSU1D/V1NTU1NTUPxUVFRUVFdU/VVVVVVVV1T+WlZWVlZXVP9bV1dXV1dU/FhYWFhYW1j9WVlZWVlbWP5aWlpaWltY/19bW1tbW1j8XFxcXFxfXP1dXV1dXV9c/mJeXl5eX1z/Y19fX19fXPxgYGBgYGNg/WFhYWFhY2D+YmJiYmJjYP9nY2NjY2Ng/GRkZGRkZ2T9ZWVlZWVnZP5qZmZmZmdk/2tnZ2dnZ2T8aGhoaGhraP1paWlpaWto/mpqampqa2j/b2tra2traPxsbGxsbG9s/W1tbW1tb2z+cm5ubm5vbP9zb29vb29s/HBwcHBwc3D9cXFxcXFzcP5ycnJycnNw/3dzc3Nzc3D8dHR0dHR3dP11dXV1dXd0/np2dnZ2d3T/e3d3d3d3dPx4eHh4eHt4/Xl5eXl5e3j+enp6enp7eP9/e3t7e3t4/Hx8fHx8f3z9fX19fX1/fP6Cfn5+fn98/4N/f39/f3z8QEBAQEBDgPzAwMDAwMOA/UFBQUFBQ4D9wcHBwcHDgP5CQkJCQkOA/sbCwsLCw4D/R0NDQ0NDgP/Hw8PDw8OA/ERERERER4T8xMTExMTHhP1FRUVFRUeE/cXFxcXFx4T+SkZGRkZHhP7KxsbGxseE/0tHR0dHR4T/y8fHx8fHhPxISEhISEuI/MjIyMjIy4j9SUlJSUlLiP3JycnJycuI/kpKSkpKS4j+zsrKysrLiP9PS0tLS0uI/8/Ly8vLy4j8TExMTExPjPzMzMzMzM+M/U1NTU1NT4z9zc3Nzc3PjP5STk5OTk+M/tLOzs7Oz4z/U09PT09PjP/Tz8/Pz8+M/FBQUFBQU5D80NDQ0NDTkP1RUVFRUVOQ/dHR0dHR05D+UlJSUlJTkP7W0tLS0tOQ/1dTU1NTU5D/19PT09PTkPxUVFRUVFeU/NTU1NTU15T9VVVVVVVXlP3V1dXV1deU/lpWVlZWV5T+2tbW1tbXlP9bV1dXV1eU/9vX19fX15T8WFhYWFhbmPzY2NjY2NuY/VlZWVlZW5j92dnZ2dnbmP5aWlpaWluY/t7a2tra25j/X1tbW1tbmP/f29vb29uY/FxcXFxcX5z83Nzc3NzfnP1dXV1dXV+c/d3d3d3d35z+Yl5eXl5fnP7i3t7e3t+c/2NfX19fX5z/49/f39/fnPxgYGBgYGOg/ODg4ODg46D9YWFhYWFjoP3h4eHh4eOg/mJiYmJiY6D+5uLi4uLjoP9nY2NjY2Og/+fj4+Pj46D8ZGRkZGRnpPzk5OTk5Oek/WVlZWVlZ6T95eXl5eXnpP5qZmZmZmek/urm5ubm56T/a2dnZ2dnpP/r5+fn5+ek/GhoaGhoa6j86Ojo6OjrqP1paWlpaWuo/enp6enp66j+ampqamprqP7u6urq6uuo/29ra2tra6j/7+vr6+vrqPxsbGxsbG+s/Ozs7Ozs76z9bW1tbW1vrP3t7e3t7e+s/nJubm5ub6z+8u7u7u7vrP9zb29vb2+s//Pv7+/v76z8cHBwcHBzsPzw8PDw8POw/XFxcXFxc7D98fHx8fHzsP5ycnJycnOw/vby8vLy87D/d3Nzc3NzsP/38/Pz8/Ow/HR0dHR0d7T89PT09PT3tP11dXV1dXe0/fX19fX197T+enZ2dnZ3tP769vb29ve0/3t3d3d3d7T/+/f39/f3tPx4eHh4eHu4/Pj4+Pj4+7j9eXl5eXl7uP35+fn5+fu4/np6enp6e7j+/vr6+vr7uP9/e3t7e3u4///7+/v7+7j8fHx8fHx/vPz8/Pz8/P+8/X19fX19f7z9/f39/f3/vP6Cfn5+fn+8/wL+/v7+/7z/g39/f39/vPwAAAAAAAPA/AAAAAAAAAAAQEBAQEBBwPxAQEBAQEIA/GBgYGBgYiD8QEBAQEBCQPxQUFBQUFJQ/GBgYGBgYmD8cHBwcHBycPxAQEBAQEKA/EhISEhISoj8UFBQUFBSkPxYWFhYWFqY/GBgYGBgYqD8aGhoaGhqqPxwcHBwcHKw/Hh4eHh4erj8QEBAQEBCwPxEREREREbE/EhISEhISsj8TExMTExOzPxQUFBQUFLQ/FRUVFRUVtT8WFhYWFha2PxcXFxcXF7c/GBgYGBgYuD8ZGRkZGRm5PxoaGhoaGro/GxsbGxsbuz8cHBwcHBy8Px0dHR0dHb0/Hh4eHh4evj8fHx8fHx+/PxAQEBAQEMA/kJCQkJCQwD8RERERERHBP5KRkZGRkcE/EhISEhISwj+SkpKSkpLCPxMTExMTE8M/lJOTk5OTwz8UFBQUFBTEP5SUlJSUlMQ/FRUVFRUVxT+WlZWVlZXFPxYWFhYWFsY/lpaWlpaWxj8XFxcXFxfHP5iXl5eXl8c/GBgYGBgYyD+YmJiYmJjIPxkZGRkZGck/mpmZmZmZyT8aGhoaGhrKP5qampqamso/GxsbGxsbyz+cm5ubm5vLPxwcHBwcHMw/nJycnJyczD8dHR0dHR3NP56dnZ2dnc0/Hh4eHh4ezj+enp6enp7OPx8fHx8fH88/oJ+fn5+fzz8QEBAQEBDQP1BQUFBQUNA/kJCQkJCQ0D/R0NDQ0NDQPxEREREREdE/UVFRUVFR0T+SkZGRkZHRP9LR0dHR0dE/EhISEhIS0j9SUlJSUlLSP5KSkpKSktI/09LS0tLS0j8TExMTExPTP1NTU1NTU9M/lJOTk5OT0z/U09PT09PTPxQUFBQUFNQ/VFRUVFRU1D+UlJSUlJTUP9XU1NTU1NQ/FRUVFRUV1T9VVVVVVVXVP5aVlZWVldU/1tXV1dXV1T8WFhYWFhbWP1ZWVlZWVtY/lpaWlpaW1j/X1tbW1tbWPxcXFxcXF9c/V1dXV1dX1z+Yl5eXl5fXP9jX19fX19c/GBgYGBgY2D9YWFhYWFjYP5iYmJiYmNg/2djY2NjY2D8ZGRkZGRnZP1lZWVlZWdk/mpmZmZmZ2T/a2dnZ2dnZPxoaGhoaGto/WlpaWlpa2j+ampqampraP9va2tra2to/GxsbGxsb2z9bW1tbW1vbP5ybm5ubm9s/3Nvb29vb2z8cHBwcHBzcP1xcXFxcXNw/nJycnJyc3D/d3Nzc3NzcPx0dHR0dHd0/XV1dXV1d3T+enZ2dnZ3dP97d3d3d3d0/Hh4eHh4e3j9eXl5eXl7eP56enp6ent4/397e3t7e3j8fHx8fHx/fP19fX19fX98/oJ+fn5+f3z/g39/f39/fPxAQEBAQEOA/MDAwMDAw4D9QUFBQUFDgP3BwcHBwcOA/kJCQkJCQ4D+xsLCwsLDgP9HQ0NDQ0OA/8fDw8PDw4D8RERERERHhPzExMTExMeE/UVFRUVFR4T9xcXFxcXHhP5KRkZGRkeE/srGxsbGx4T/S0dHR0dHhP/Lx8fHx8eE/EhISEhIS4j8yMjIyMjLiP1JSUlJSUuI/cnJycnJy4j+SkpKSkpLiP7OysrKysuI/09LS0tLS4j/z8vLy8vLiPxMTExMTE+M/MzMzMzMz4z9TU1NTU1PjP3Nzc3Nzc+M/lJOTk5OT4z+0s7Ozs7PjP9TT09PT0+M/9PPz8/Pz4z8UFBQUFBTkPzQ0NDQ0NOQ/VFRUVFRU5D90dHR0dHTkP5SUlJSUlOQ/tbS0tLS05D/V1NTU1NTkP/X09PT09OQ/FRUVFRUV5T81NTU1NTXlP1VVVVVVVeU/dXV1dXV15T+WlZWVlZXlP7a1tbW1teU/1tXV1dXV5T/29fX19fXlPxYWFhYWFuY/NjY2NjY25j9WVlZWVlbmP3Z2dnZ2duY/lpaWlpaW5j+3tra2trbmP9fW1tbW1uY/9/b29vb25j8XFxcXFxfnPzc3Nzc3N+c/V1dXV1dX5z93d3d3d3fnP5iXl5eXl+c/uLe3t7e35z/Y19fX19fnP/j39/f39+c/GBgYGBgY6D84ODg4ODjoP1hYWFhYWOg/eHh4eHh46D+YmJiYmJjoP7m4uLi4uOg/2djY2NjY6D/5+Pj4+PjoPxkZGRkZGek/OTk5OTk56T9ZWVlZWVnpP3l5eXl5eek/mpmZmZmZ6T+6ubm5ubnpP9rZ2dnZ2ek/+vn5+fn56T8aGhoaGhrqPzo6Ojo6Ouo/WlpaWlpa6j96enp6enrqP5qampqamuo/u7q6urq66j/b2tra2trqP/v6+vr6+uo/GxsbGxsb6z87Ozs7OzvrP1tbW1tbW+s/e3t7e3t76z+cm5ubm5vrP7y7u7u7u+s/3Nvb29vb6z/8+/v7+/vrPxwcHBwcHOw/PDw8PDw87D9cXFxcXFzsP3x8fHx8fOw/nJycnJyc7D+9vLy8vLzsP93c3Nzc3Ow//fz8/Pz87D8dHR0dHR3tPz09PT09Pe0/XV1dXV1d7T99fX19fX3tP56dnZ2dne0/vr29vb297T/e3d3d3d3tP/79/f39/e0/Hh4eHh4e7j8+Pj4+Pj7uP15eXl5eXu4/fn5+fn5+7j+enp6enp7uP7++vr6+vu4/397e3t7e7j///v7+/v7uPx8fHx8fH+8/Pz8/Pz8/7z9fX19fX1/vP39/f39/f+8/oJ+fn5+f7z/Av7+/v7/vP+Df39/f3+8/AAAAAAAA8D8=\",\"dtype\":\"float64\",\"shape\":[10,256]}],\"x\":[0],\"y\":[0]},\"selected\":{\"id\":\"1194\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"1221\",\"type\":\"UnionRenderers\"}},\"id\":\"1193\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"1194\",\"type\":\"Selection\"},{\"attributes\":{\"callback\":null,\"reset_end\":1.0,\"reset_start\":0.0,\"tags\":[[[\"y\",\"y\",null]]]},\"id\":\"1163\",\"type\":\"Range1d\"}],\"root_ids\":[\"1164\"]},\"title\":\"Bokeh Application\",\"version\":\"1.4.0\"}};\n", + " var render_items = [{\"docid\":\"016170ec-8abc-4573-819c-23262e6b74cb\",\"roots\":{\"1164\":\"75c3d895-12a1-4d35-9d99-d909976b800f\"}}];\n", + " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", + "\n", + " }\n", + " if (root.Bokeh !== undefined) {\n", + " embed_document(root);\n", + " } else {\n", + " var attempts = 0;\n", + " var timer = setInterval(function(root) {\n", + " if (root.Bokeh !== undefined) {\n", + " clearInterval(timer);\n", + " embed_document(root);\n", + " } else {\n", + " attempts++;\n", + " if (attempts > 100) {\n", + " clearInterval(timer);\n", + " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", + " }\n", + " }\n", + " }, 10, root)\n", + " }\n", + "})(window);" + ], + "application/vnd.bokehjs_exec.v0+json": "" + }, + "metadata": { + "application/vnd.bokehjs_exec.v0+json": { + "id": "1164" + } + }, + "output_type": "display_data" + } + ], + "source": [ + "show(hv.render(swatch('sample'), backend='bokeh'))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To contribute a new colormap, see the contributing section of the [README](https://github.com/pyviz/contrib_colormaps#contributing). To learn more about how to use the various colormaps and what each is for, see the [colormaps section](colormaps/index.ipynb)." ] } ], @@ -129,5 +2829,5 @@ } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 }