From 098a8170085cb55b8cd5d2c204dea7a6bfe5abfe Mon Sep 17 00:00:00 2001 From: Ivan Danyliuk Date: Wed, 19 Sep 2018 12:45:54 +0300 Subject: [PATCH] Fix upload and initialization --- main.go | 1 - network_selector.go | 56 ++++++----- page.go | 24 +---- upload.go | 14 --- whispervis.js | 208 +++++++++++++++------------------------- whispervis.js.map | 2 +- widgets/force_editor.go | 3 +- 7 files changed, 113 insertions(+), 195 deletions(-) delete mode 100644 upload.go diff --git a/main.go b/main.go index b877cff..f5c8529 100644 --- a/main.go +++ b/main.go @@ -11,5 +11,4 @@ func main() { vecty.AddStylesheet("css/pure-min.css") vecty.AddStylesheet("css/controls.css") vecty.RenderBody(page) - page.UpdateNetworkGraph(inputJSON) } diff --git a/network_selector.go b/network_selector.go index 5dda18b..f2ed55c 100644 --- a/network_selector.go +++ b/network_selector.go @@ -40,6 +40,7 @@ func NewNetworkSelector(handler func(*Network)) *NetworkSelector { handler: handler, } ns.upload = widgets.NewUploadWidget(ns.onUpload) + ns.setCurrentNetwork(current) return ns } @@ -61,8 +62,8 @@ func (n *NetworkSelector) Render() vecty.ComponentOrHTML { ), ), n.descriptionBlock(), - elem.HorizontalRule(), vecty.If(n.isCustom, n.upload), + elem.HorizontalRule(), ) } @@ -77,26 +78,6 @@ func (n *NetworkSelector) descriptionBlock() *vecty.HTML { ) } -// onChange implements handler for select input changed value -func (n *NetworkSelector) onChange(e *vecty.Event) { - value := e.Target.Get("value").String() - - if value == "upload" { - n.isCustom = true - vecty.Rerender(n) - return - } - - n.isCustom = false - n.current = n.networks[value] - - if n.handler != nil { - go n.handler(n.current) - } - - vecty.Rerender(n) -} - // LoadNetworks imports preloaded neworks from the directory with JSON files. func LoadNetworks() (map[string]*Network, error) { files, err := AssetDir("data") @@ -118,11 +99,12 @@ func LoadNetworks() (map[string]*Network, error) { func (n *NetworkSelector) networkOptions() vecty.List { var options vecty.List - for name, _ := range n.networks { + for name := range n.networks { + fmt.Printf("'%s' == '%s'\n", n.current.Name, name) options = append(options, elem.Option( vecty.Markup( vecty.Property("value", name), - vecty.Property("selected", n.current.Name == name), + vecty.Property("selected", n.current.Name == "data/"+name), // TODO(divan): get rid of "data" ), vecty.Text(name), )) @@ -130,6 +112,24 @@ func (n *NetworkSelector) networkOptions() vecty.List { return options } +// onChange implements handler for select input changed value +func (n *NetworkSelector) onChange(e *vecty.Event) { + value := e.Target.Get("value").String() + + if value == "upload" { + n.isCustom = true + vecty.Rerender(n) + return + } + + n.isCustom = false + + net := n.networks[value] + n.setCurrentNetwork(net) + + vecty.Rerender(n) +} + // onUpload implements callback for "Upload" button clicked event. func (n *NetworkSelector) onUpload(json []byte) { r := bytes.NewReader(json) @@ -139,12 +139,18 @@ func (n *NetworkSelector) onUpload(json []byte) { } net.Name = fmt.Sprintf("Uploaded (%d nodes)", net.NodesCount()) + n.networks[net.Name] = net + n.setCurrentNetwork(net) + + vecty.Rerender(n) +} + +// setCurrentNetwork changes current network and runs needed update handlers. +func (n *NetworkSelector) setCurrentNetwork(net *Network) { n.current = net if n.handler != nil { go n.handler(n.current) } - - vecty.Rerender(n) } diff --git a/page.go b/page.go index 48c1dc6..da7a3f7 100644 --- a/page.go +++ b/page.go @@ -1,10 +1,8 @@ package main import ( - "bytes" "fmt" - "github.com/divan/graphx/formats" "github.com/divan/graphx/graph" "github.com/divan/graphx/layout" "github.com/gopherjs/vecty" @@ -25,7 +23,6 @@ type Page struct { loader *widgets.Loader forceEditor *widgets.ForceEditor - upload *widgets.UploadWidget network *NetworkSelector data *graph.Graph @@ -37,7 +34,6 @@ func NewPage() *Page { loader: widgets.NewLoader(), forceEditor: widgets.NewForceEditor(), } - page.upload = widgets.NewUploadWidget(page.onUpload) page.network = NewNetworkSelector(page.onNetworkChange) page.webgl = NewWebGLScene() return page @@ -56,7 +52,6 @@ func (p *Page) Render() vecty.ComponentOrHTML { elem.Heading1(vecty.Text("Whisper Message Propagation")), elem.Paragraph(vecty.Text("This visualization represents message propagation in the p2p network.")), p.network, - p.upload, elem.Div( vecty.Markup( vecty.MarkupIf(!p.loaded, vecty.Style("visibility", "hidden")), @@ -118,26 +113,9 @@ func (p *Page) onUpdateClick(e *vecty.Event) { } func (p *Page) onNetworkChange(network *Network) { + fmt.Println("Network changed:", network) p.data = network.Data - if !p.loaded { - return - } config := p.forceEditor.Config() p.layout = layout.NewFromConfig(p.data, config.Config) go p.StartSimulation() } - -// UpdateNetworkGraph updates graph and scene with new data. -func (p *Page) UpdateNetworkGraph(json []byte) error { - buf := bytes.NewBuffer(json) - data, err := formats.FromD3JSONReader(buf) - if err != nil { - return fmt.Errorf("update graph: %v", err) - } - - p.data = data - config := p.forceEditor.Config() - p.layout = layout.NewFromConfig(data, config.Config) - go p.StartSimulation() - return nil -} diff --git a/upload.go b/upload.go deleted file mode 100644 index 3da7244..0000000 --- a/upload.go +++ /dev/null @@ -1,14 +0,0 @@ -package main - -import ( - "fmt" -) - -// onUpload implements callback for "Upload" button clicked event. -func (p *Page) onUpload(json []byte) { - if err := p.UpdateNetworkGraph(json); err != nil { - fmt.Println("[ERROR] Failed to process network.json:", err) - return - } - fmt.Println("Uploaded new network graph") -} diff --git a/whispervis.js b/whispervis.js index 9c3d0f4..fed0837 100644 --- a/whispervis.js +++ b/whispervis.js @@ -34910,19 +34910,17 @@ $packages["github.com/status-im/whispervis/widgets"] = (function() { sliceType$4 = $sliceType($Uint8); funcType = $funcType([sliceType$4], [], false); ForceEditor.ptr.prototype.Render = function() { - var _arg, _arg$1, _arg$2, _r, _r$1, _r$2, _r$3, _r$4, l, x, $s, $r; - /* */ $s = 0; var $f, $c = false; if (this !== undefined && this.$blk !== undefined) { $f = this; $c = true; _arg = $f._arg; _arg$1 = $f._arg$1; _arg$2 = $f._arg$2; _r = $f._r; _r$1 = $f._r$1; _r$2 = $f._r$2; _r$3 = $f._r$3; _r$4 = $f._r$4; l = $f.l; x = $f.x; $s = $f.$s; $r = $f.$r; } s: while (true) { switch ($s) { case 0: + var _arg, _arg$1, _r, _r$1, _r$2, _r$3, l, x, $s, $r; + /* */ $s = 0; var $f, $c = false; if (this !== undefined && this.$blk !== undefined) { $f = this; $c = true; _arg = $f._arg; _arg$1 = $f._arg$1; _r = $f._r; _r$1 = $f._r$1; _r$2 = $f._r$2; _r$3 = $f._r$3; l = $f.l; x = $f.x; $s = $f.$s; $r = $f.$r; } s: while (true) { switch ($s) { case 0: l = this; _r = vecty.Text("Layout forces:", new sliceType([])); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } _r$1 = elem.Heading3(new sliceType([_r])); /* */ $s = 2; case 2: if($c) { $c = false; _r$1 = _r$1.$blk(); } if (_r$1 && _r$1.$blk !== undefined) { break s; } _arg = _r$1; - _r$2 = elem.HorizontalRule(new sliceType([])); /* */ $s = 3; case 3: if($c) { $c = false; _r$2 = _r$2.$blk(); } if (_r$2 && _r$2.$blk !== undefined) { break s; } + _r$2 = elem.Form(new sliceType([(x = vecty.Markup(new sliceType$2([vecty.Class(new sliceType$1(["pure-form"]))])), new x.constructor.elem(x)), l.repelling, l.spring, l.drag, l.steps])); /* */ $s = 3; case 3: if($c) { $c = false; _r$2 = _r$2.$blk(); } if (_r$2 && _r$2.$blk !== undefined) { break s; } _arg$1 = _r$2; - _r$3 = elem.Form(new sliceType([(x = vecty.Markup(new sliceType$2([vecty.Class(new sliceType$1(["pure-form"]))])), new x.constructor.elem(x)), l.repelling, l.spring, l.drag, l.steps])); /* */ $s = 4; case 4: if($c) { $c = false; _r$3 = _r$3.$blk(); } if (_r$3 && _r$3.$blk !== undefined) { break s; } - _arg$2 = _r$3; - _r$4 = elem.Div(new sliceType([_arg, _arg$1, _arg$2])); /* */ $s = 5; case 5: if($c) { $c = false; _r$4 = _r$4.$blk(); } if (_r$4 && _r$4.$blk !== undefined) { break s; } - $s = -1; return _r$4; - /* */ } return; } if ($f === undefined) { $f = { $blk: ForceEditor.ptr.prototype.Render }; } $f._arg = _arg; $f._arg$1 = _arg$1; $f._arg$2 = _arg$2; $f._r = _r; $f._r$1 = _r$1; $f._r$2 = _r$2; $f._r$3 = _r$3; $f._r$4 = _r$4; $f.l = l; $f.x = x; $f.$s = $s; $f.$r = $r; return $f; + _r$3 = elem.Div(new sliceType([_arg, _arg$1])); /* */ $s = 4; case 4: if($c) { $c = false; _r$3 = _r$3.$blk(); } if (_r$3 && _r$3.$blk !== undefined) { break s; } + $s = -1; return _r$3; + /* */ } return; } if ($f === undefined) { $f = { $blk: ForceEditor.ptr.prototype.Render }; } $f._arg = _arg; $f._arg$1 = _arg$1; $f._r = _r; $f._r$1 = _r$1; $f._r$2 = _r$2; $f._r$3 = _r$3; $f.l = l; $f.x = x; $f.$s = $s; $f.$r = $r; return $f; }; ForceEditor.prototype.Render = function() { return this.$val.Render(); }; NewForceEditor = function() { @@ -35345,7 +35343,7 @@ $packages["io/ioutil"] = (function() { return $pkg; })(); $packages["github.com/status-im/whispervis"] = (function() { - var $pkg = {}, $init, bytes, gzip, fmt, formats, graph, layout, js, vecty, elem, event, prop, three, widgets, vthree, io, ioutil, os, filepath, runtime, strings, time, asset, bindataFileInfo, bintree, TrackBallControl, Network, NetworkSelector, Page, WebGLScene, sliceType, ptrType, funcType, sliceType$1, arrayType, ptrType$1, ptrType$2, sliceType$2, ptrType$3, structType, sliceType$3, structType$1, sliceType$4, ptrType$4, ptrType$5, ptrType$6, ptrType$7, sliceType$5, sliceType$6, sliceType$7, ptrType$8, ptrType$9, ptrType$10, ptrType$11, ptrType$12, ptrType$13, ptrType$14, ptrType$15, ptrType$16, ptrType$17, funcType$1, mapType, ptrType$18, ptrType$19, ptrType$20, mapType$1, funcType$2, ptrType$21, mapType$2, ptrType$22, sliceType$8, _data3dgrid125Json, _dataNet100Json, _dataNet300Json, _bindata, _bintree, inputJSON, bindataRead, data3dgrid125JsonBytes, data3dgrid125Json, dataNet100JsonBytes, dataNet100Json, dataNet300JsonBytes, dataNet300Json, Asset, AssetDir, NewTrackBallControl, NewEthereumGeometry, main, NewNodeMaterial, NewEdgeMatherial, LoadNetwork, LoadNetworkFromReader, NewNetworkSelector, LoadNetworks, NewPage, NewWebGLScene; + var $pkg = {}, $init, bytes, gzip, fmt, formats, graph, layout, js, vecty, elem, event, prop, three, widgets, vthree, io, ioutil, os, filepath, runtime, strings, time, asset, bindataFileInfo, bintree, TrackBallControl, Network, NetworkSelector, Page, WebGLScene, sliceType, ptrType, funcType, sliceType$1, arrayType, ptrType$1, ptrType$2, sliceType$2, ptrType$3, structType, sliceType$3, structType$1, sliceType$4, ptrType$4, ptrType$5, ptrType$6, ptrType$7, sliceType$5, sliceType$6, sliceType$7, ptrType$8, ptrType$9, ptrType$10, ptrType$11, ptrType$12, ptrType$13, ptrType$14, ptrType$15, ptrType$16, ptrType$17, funcType$1, mapType, ptrType$18, ptrType$19, ptrType$20, mapType$1, funcType$2, ptrType$21, mapType$2, ptrType$22, sliceType$8, _data3dgrid125Json, _dataNet100Json, _dataNet300Json, _bindata, _bintree, bindataRead, data3dgrid125JsonBytes, data3dgrid125Json, dataNet100JsonBytes, dataNet100Json, dataNet300JsonBytes, dataNet300Json, Asset, AssetDir, NewTrackBallControl, NewEthereumGeometry, main, NewNodeMaterial, NewEdgeMatherial, LoadNetwork, LoadNetworkFromReader, NewNetworkSelector, LoadNetworks, NewPage, NewWebGLScene; bytes = $packages["bytes"]; gzip = $packages["compress/gzip"]; fmt = $packages["fmt"]; @@ -35439,7 +35437,7 @@ $packages["github.com/status-im/whispervis"] = (function() { this.upload = upload_; this.handler = handler_; }); - Page = $pkg.Page = $newType(0, $kindStruct, "main.Page", true, "github.com/status-im/whispervis", true, function(Core_, layout_, webgl_, loaded_, loader_, forceEditor_, upload_, network_, data_) { + Page = $pkg.Page = $newType(0, $kindStruct, "main.Page", true, "github.com/status-im/whispervis", true, function(Core_, layout_, webgl_, loaded_, loader_, forceEditor_, network_, data_) { this.$val = this; if (arguments.length === 0) { this.Core = new vecty.Core.ptr($ifaceNil, $ifaceNil, false, false); @@ -35448,7 +35446,6 @@ $packages["github.com/status-im/whispervis"] = (function() { this.loaded = false; this.loader = ptrType$13.nil; this.forceEditor = ptrType$14.nil; - this.upload = ptrType$7.nil; this.network = ptrType$15.nil; this.data = ptrType$6.nil; return; @@ -35459,7 +35456,6 @@ $packages["github.com/status-im/whispervis"] = (function() { this.loaded = loaded_; this.loader = loader_; this.forceEditor = forceEditor_; - this.upload = upload_; this.network = network_; this.data = data_; }); @@ -35808,18 +35804,16 @@ $packages["github.com/status-im/whispervis"] = (function() { }; Page.prototype.KeyListener = function(e) { return this.$val.KeyListener(e); }; main = function() { - var _r, _r$1, page, $s, $r; - /* */ $s = 0; var $f, $c = false; if (this !== undefined && this.$blk !== undefined) { $f = this; $c = true; _r = $f._r; _r$1 = $f._r$1; page = $f.page; $s = $f.$s; $r = $f.$r; } s: while (true) { switch ($s) { case 0: + var _r, page, $s, $r; + /* */ $s = 0; var $f, $c = false; if (this !== undefined && this.$blk !== undefined) { $f = this; $c = true; _r = $f._r; page = $f.page; $s = $f.$s; $r = $f.$r; } s: while (true) { switch ($s) { case 0: _r = NewPage(); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } page = _r; $r = vecty.SetTitle("Whisper Simulation"); /* */ $s = 2; case 2: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } $r = vecty.AddStylesheet("css/pure-min.css"); /* */ $s = 3; case 3: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } $r = vecty.AddStylesheet("css/controls.css"); /* */ $s = 4; case 4: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } $r = vecty.RenderBody(page); /* */ $s = 5; case 5: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } - _r$1 = page.UpdateNetworkGraph(inputJSON); /* */ $s = 6; case 6: if($c) { $c = false; _r$1 = _r$1.$blk(); } if (_r$1 && _r$1.$blk !== undefined) { break s; } - _r$1; $s = -1; return; - /* */ } return; } if ($f === undefined) { $f = { $blk: main }; } $f._r = _r; $f._r$1 = _r$1; $f.page = page; $f.$s = $s; $f.$r = $r; return $f; + /* */ } return; } if ($f === undefined) { $f = { $blk: main }; } $f._r = _r; $f.page = page; $f.$s = $s; $f.$r = $r; return $f; }; NewNodeMaterial = function() { var params; @@ -35928,6 +35922,7 @@ $packages["github.com/status-im/whispervis"] = (function() { /* } */ case 4: ns = new NetworkSelector.ptr(new vecty.Core.ptr($ifaceNil, $ifaceNil, false, false), current, false, networks, ptrType$7.nil, handler); ns.upload = widgets.NewUploadWidget($methodVal(ns, "onUpload")); + ns.setCurrentNetwork(current); $s = -1; return ns; /* */ } return; } if ($f === undefined) { $f = { $blk: NewNetworkSelector }; } $f._entry = _entry; $f._r = _r; $f._r$1 = _r$1; $f._tuple = _tuple; $f.current = current; $f.err = err; $f.handler = handler; $f.networks = networks; $f.ns = ns; $f.$s = $s; $f.$r = $r; return $f; }; @@ -35951,9 +35946,9 @@ $packages["github.com/status-im/whispervis"] = (function() { _arg$6 = _r$5; _r$6 = n.descriptionBlock(); /* */ $s = 7; case 7: if($c) { $c = false; _r$6 = _r$6.$blk(); } if (_r$6 && _r$6.$blk !== undefined) { break s; } _arg$7 = _r$6; + _arg$8 = vecty.If(n.isCustom, new sliceType$7([n.upload])); _r$7 = elem.HorizontalRule(new sliceType$5([])); /* */ $s = 8; case 8: if($c) { $c = false; _r$7 = _r$7.$blk(); } if (_r$7 && _r$7.$blk !== undefined) { break s; } - _arg$8 = _r$7; - _arg$9 = vecty.If(n.isCustom, new sliceType$7([n.upload])); + _arg$9 = _r$7; _r$8 = elem.Div(new sliceType$5([_arg, _arg$6, _arg$7, _arg$8, _arg$9])); /* */ $s = 9; case 9: if($c) { $c = false; _r$8 = _r$8.$blk(); } if (_r$8 && _r$8.$blk !== undefined) { break s; } $s = -1; return _r$8; /* */ } return; } if ($f === undefined) { $f = { $blk: NetworkSelector.ptr.prototype.Render }; } $f._arg = _arg; $f._arg$1 = _arg$1; $f._arg$2 = _arg$2; $f._arg$3 = _arg$3; $f._arg$4 = _arg$4; $f._arg$5 = _arg$5; $f._arg$6 = _arg$6; $f._arg$7 = _arg$7; $f._arg$8 = _arg$8; $f._arg$9 = _arg$9; $f._r = _r; $f._r$1 = _r$1; $f._r$2 = _r$2; $f._r$3 = _r$3; $f._r$4 = _r$4; $f._r$5 = _r$5; $f._r$6 = _r$6; $f._r$7 = _r$7; $f._r$8 = _r$8; $f.n = n; $f.x = x; $f.x$1 = x$1; $f.$s = $s; $f.$r = $r; return $f; @@ -35971,30 +35966,6 @@ $packages["github.com/status-im/whispervis"] = (function() { /* */ } return; } if ($f === undefined) { $f = { $blk: NetworkSelector.ptr.prototype.descriptionBlock }; } $f._arg = _arg; $f._arg$1 = _arg$1; $f._r = _r; $f._r$1 = _r$1; $f.n = n; $f.x = x; $f.$s = $s; $f.$r = $r; return $f; }; NetworkSelector.prototype.descriptionBlock = function() { return this.$val.descriptionBlock(); }; - NetworkSelector.ptr.prototype.onChange = function(e) { - var _entry, e, n, value, $s, $r; - /* */ $s = 0; var $f, $c = false; if (this !== undefined && this.$blk !== undefined) { $f = this; $c = true; _entry = $f._entry; e = $f.e; n = $f.n; value = $f.value; $s = $f.$s; $r = $f.$r; } s: while (true) { switch ($s) { case 0: - n = this; - value = $internalize(e.Target.value, $String); - /* */ if (value === "upload") { $s = 1; continue; } - /* */ $s = 2; continue; - /* if (value === "upload") { */ case 1: - n.isCustom = true; - $r = vecty.Rerender(n); /* */ $s = 3; case 3: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } - $s = -1; return; - /* } */ case 2: - n.isCustom = false; - n.current = (_entry = n.networks[$String.keyFor(value)], _entry !== undefined ? _entry.v : ptrType$5.nil); - /* */ if (!(n.handler === $throwNilPointerError)) { $s = 4; continue; } - /* */ $s = 5; continue; - /* if (!(n.handler === $throwNilPointerError)) { */ case 4: - $go(n.handler, [n.current]); - /* } */ case 5: - $r = vecty.Rerender(n); /* */ $s = 6; case 6: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } - $s = -1; return; - /* */ } return; } if ($f === undefined) { $f = { $blk: NetworkSelector.ptr.prototype.onChange }; } $f._entry = _entry; $f.e = e; $f.n = n; $f.value = value; $f.$s = $s; $f.$r = $r; return $f; - }; - NetworkSelector.prototype.onChange = function(e) { return this.$val.onChange(e); }; LoadNetworks = function() { var _i, _key, _r, _r$1, _r$2, _ref, _tuple, _tuple$1, err, err$1, file, files, network, networks, $s, $r; /* */ $s = 0; var $f, $c = false; if (this !== undefined && this.$blk !== undefined) { $f = this; $c = true; _i = $f._i; _key = $f._key; _r = $f._r; _r$1 = $f._r$1; _r$2 = $f._r$2; _ref = $f._ref; _tuple = $f._tuple; _tuple$1 = $f._tuple$1; err = $f.err; err$1 = $f.err$1; file = $f.file; files = $f.files; network = $f.network; networks = $f.networks; $s = $f.$s; $r = $f.$r; } s: while (true) { switch ($s) { case 0: @@ -36029,8 +36000,8 @@ $packages["github.com/status-im/whispervis"] = (function() { }; $pkg.LoadNetworks = LoadNetworks; NetworkSelector.ptr.prototype.networkOptions = function() { - var _arg, _arg$1, _entry, _i, _keys, _r, _r$1, _ref, n, name, options, x, $s, $r; - /* */ $s = 0; var $f, $c = false; if (this !== undefined && this.$blk !== undefined) { $f = this; $c = true; _arg = $f._arg; _arg$1 = $f._arg$1; _entry = $f._entry; _i = $f._i; _keys = $f._keys; _r = $f._r; _r$1 = $f._r$1; _ref = $f._ref; n = $f.n; name = $f.name; options = $f.options; x = $f.x; $s = $f.$s; $r = $f.$r; } s: while (true) { switch ($s) { case 0: + var _arg, _arg$1, _entry, _i, _keys, _r, _r$1, _r$2, _ref, n, name, options, x, $s, $r; + /* */ $s = 0; var $f, $c = false; if (this !== undefined && this.$blk !== undefined) { $f = this; $c = true; _arg = $f._arg; _arg$1 = $f._arg$1; _entry = $f._entry; _i = $f._i; _keys = $f._keys; _r = $f._r; _r$1 = $f._r$1; _r$2 = $f._r$2; _ref = $f._ref; n = $f.n; name = $f.name; options = $f.options; x = $f.x; $s = $f.$s; $r = $f.$r; } s: while (true) { switch ($s) { case 0: n = this; options = vecty.List.nil; _ref = n.networks; @@ -36044,17 +36015,39 @@ $packages["github.com/status-im/whispervis"] = (function() { /* continue; */ $s = 1; continue; } name = _entry.k; - _arg = (x = vecty.Markup(new sliceType$6([vecty.Property("value", new $String(name)), vecty.Property("selected", new $Bool(n.current.Name === name))])), new x.constructor.elem(x)); - _r = vecty.Text(name, new sliceType$5([])); /* */ $s = 3; case 3: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } - _arg$1 = _r; - _r$1 = elem.Option(new sliceType$5([_arg, _arg$1])); /* */ $s = 4; case 4: if($c) { $c = false; _r$1 = _r$1.$blk(); } if (_r$1 && _r$1.$blk !== undefined) { break s; } - options = $append(options, _r$1); + _r = fmt.Printf("'%s' == '%s'\n", new sliceType$1([new $String(n.current.Name), new $String(name)])); /* */ $s = 3; case 3: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } + _r; + _arg = (x = vecty.Markup(new sliceType$6([vecty.Property("value", new $String(name)), vecty.Property("selected", new $Bool(n.current.Name === "data/" + name))])), new x.constructor.elem(x)); + _r$1 = vecty.Text(name, new sliceType$5([])); /* */ $s = 4; case 4: if($c) { $c = false; _r$1 = _r$1.$blk(); } if (_r$1 && _r$1.$blk !== undefined) { break s; } + _arg$1 = _r$1; + _r$2 = elem.Option(new sliceType$5([_arg, _arg$1])); /* */ $s = 5; case 5: if($c) { $c = false; _r$2 = _r$2.$blk(); } if (_r$2 && _r$2.$blk !== undefined) { break s; } + options = $append(options, _r$2); _i++; /* } */ $s = 1; continue; case 2: $s = -1; return options; - /* */ } return; } if ($f === undefined) { $f = { $blk: NetworkSelector.ptr.prototype.networkOptions }; } $f._arg = _arg; $f._arg$1 = _arg$1; $f._entry = _entry; $f._i = _i; $f._keys = _keys; $f._r = _r; $f._r$1 = _r$1; $f._ref = _ref; $f.n = n; $f.name = name; $f.options = options; $f.x = x; $f.$s = $s; $f.$r = $r; return $f; + /* */ } return; } if ($f === undefined) { $f = { $blk: NetworkSelector.ptr.prototype.networkOptions }; } $f._arg = _arg; $f._arg$1 = _arg$1; $f._entry = _entry; $f._i = _i; $f._keys = _keys; $f._r = _r; $f._r$1 = _r$1; $f._r$2 = _r$2; $f._ref = _ref; $f.n = n; $f.name = name; $f.options = options; $f.x = x; $f.$s = $s; $f.$r = $r; return $f; }; NetworkSelector.prototype.networkOptions = function() { return this.$val.networkOptions(); }; + NetworkSelector.ptr.prototype.onChange = function(e) { + var _entry, e, n, net, value, $s, $r; + /* */ $s = 0; var $f, $c = false; if (this !== undefined && this.$blk !== undefined) { $f = this; $c = true; _entry = $f._entry; e = $f.e; n = $f.n; net = $f.net; value = $f.value; $s = $f.$s; $r = $f.$r; } s: while (true) { switch ($s) { case 0: + n = this; + value = $internalize(e.Target.value, $String); + /* */ if (value === "upload") { $s = 1; continue; } + /* */ $s = 2; continue; + /* if (value === "upload") { */ case 1: + n.isCustom = true; + $r = vecty.Rerender(n); /* */ $s = 3; case 3: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + $s = -1; return; + /* } */ case 2: + n.isCustom = false; + net = (_entry = n.networks[$String.keyFor(value)], _entry !== undefined ? _entry.v : ptrType$5.nil); + n.setCurrentNetwork(net); + $r = vecty.Rerender(n); /* */ $s = 4; case 4: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + $s = -1; return; + /* */ } return; } if ($f === undefined) { $f = { $blk: NetworkSelector.ptr.prototype.onChange }; } $f._entry = _entry; $f.e = e; $f.n = n; $f.net = net; $f.value = value; $f.$s = $s; $f.$r = $r; return $f; + }; + NetworkSelector.prototype.onChange = function(e) { return this.$val.onChange(e); }; NetworkSelector.ptr.prototype.onUpload = function(json) { var _key, _r, _r$1, _r$2, _tuple, err, json, n, net, r, $s, $r; /* */ $s = 0; var $f, $c = false; if (this !== undefined && this.$blk !== undefined) { $f = this; $c = true; _key = $f._key; _r = $f._r; _r$1 = $f._r$1; _r$2 = $f._r$2; _tuple = $f._tuple; err = $f.err; json = $f.json; n = $f.n; net = $f.net; r = $f.r; $s = $f.$s; $r = $f.$r; } s: while (true) { switch ($s) { case 0: @@ -36073,17 +36066,21 @@ $packages["github.com/status-im/whispervis"] = (function() { _r$2 = fmt.Sprintf("Uploaded (%d nodes)", new sliceType$1([new $Int(net.NodesCount())])); /* */ $s = 5; case 5: if($c) { $c = false; _r$2 = _r$2.$blk(); } if (_r$2 && _r$2.$blk !== undefined) { break s; } net.Name = _r$2; _key = net.Name; (n.networks || $throwRuntimeError("assignment to entry in nil map"))[$String.keyFor(_key)] = { k: _key, v: net }; - n.current = net; - /* */ if (!(n.handler === $throwNilPointerError)) { $s = 6; continue; } - /* */ $s = 7; continue; - /* if (!(n.handler === $throwNilPointerError)) { */ case 6: - $go(n.handler, [n.current]); - /* } */ case 7: - $r = vecty.Rerender(n); /* */ $s = 8; case 8: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + n.setCurrentNetwork(net); + $r = vecty.Rerender(n); /* */ $s = 6; case 6: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } $s = -1; return; /* */ } return; } if ($f === undefined) { $f = { $blk: NetworkSelector.ptr.prototype.onUpload }; } $f._key = _key; $f._r = _r; $f._r$1 = _r$1; $f._r$2 = _r$2; $f._tuple = _tuple; $f.err = err; $f.json = json; $f.n = n; $f.net = net; $f.r = r; $f.$s = $s; $f.$r = $r; return $f; }; NetworkSelector.prototype.onUpload = function(json) { return this.$val.onUpload(json); }; + NetworkSelector.ptr.prototype.setCurrentNetwork = function(net) { + var n, net; + n = this; + n.current = net; + if (!(n.handler === $throwNilPointerError)) { + $go(n.handler, [n.current]); + } + }; + NetworkSelector.prototype.setCurrentNetwork = function(net) { return this.$val.setCurrentNetwork(net); }; WebGLScene.ptr.prototype.CreateObjects = function(positions, links) { var links, positions, w, $s, $r; /* */ $s = 0; var $f, $c = false; if (this !== undefined && this.$blk !== undefined) { $f = this; $c = true; links = $f.links; positions = $f.positions; w = $f.w; $s = $f.$s; $r = $f.$r; } s: while (true) { switch ($s) { case 0: @@ -36168,8 +36165,7 @@ $packages["github.com/status-im/whispervis"] = (function() { NewPage = function() { var _r, page, $s, $r; /* */ $s = 0; var $f, $c = false; if (this !== undefined && this.$blk !== undefined) { $f = this; $c = true; _r = $f._r; page = $f.page; $s = $f.$s; $r = $f.$r; } s: while (true) { switch ($s) { case 0: - page = new Page.ptr(new vecty.Core.ptr($ifaceNil, $ifaceNil, false, false), ptrType$11.nil, ptrType$12.nil, false, widgets.NewLoader(), widgets.NewForceEditor(), ptrType$7.nil, ptrType$15.nil, ptrType$6.nil); - page.upload = widgets.NewUploadWidget($methodVal(page, "onUpload")); + page = new Page.ptr(new vecty.Core.ptr($ifaceNil, $ifaceNil, false, false), ptrType$11.nil, ptrType$12.nil, false, widgets.NewLoader(), widgets.NewForceEditor(), ptrType$15.nil, ptrType$6.nil); _r = NewNetworkSelector($methodVal(page, "onNetworkChange")); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } page.network = _r; page.webgl = NewWebGLScene(); @@ -36178,8 +36174,8 @@ $packages["github.com/status-im/whispervis"] = (function() { }; $pkg.NewPage = NewPage; Page.ptr.prototype.Render = function() { - var _arg, _arg$1, _arg$10, _arg$11, _arg$12, _arg$2, _arg$3, _arg$4, _arg$5, _arg$6, _arg$7, _arg$8, _arg$9, _r, _r$1, _r$10, _r$2, _r$3, _r$4, _r$5, _r$6, _r$7, _r$8, _r$9, p, x, x$1, x$2, x$3, x$4, x$5, $s, $r; - /* */ $s = 0; var $f, $c = false; if (this !== undefined && this.$blk !== undefined) { $f = this; $c = true; _arg = $f._arg; _arg$1 = $f._arg$1; _arg$10 = $f._arg$10; _arg$11 = $f._arg$11; _arg$12 = $f._arg$12; _arg$2 = $f._arg$2; _arg$3 = $f._arg$3; _arg$4 = $f._arg$4; _arg$5 = $f._arg$5; _arg$6 = $f._arg$6; _arg$7 = $f._arg$7; _arg$8 = $f._arg$8; _arg$9 = $f._arg$9; _r = $f._r; _r$1 = $f._r$1; _r$10 = $f._r$10; _r$2 = $f._r$2; _r$3 = $f._r$3; _r$4 = $f._r$4; _r$5 = $f._r$5; _r$6 = $f._r$6; _r$7 = $f._r$7; _r$8 = $f._r$8; _r$9 = $f._r$9; p = $f.p; x = $f.x; x$1 = $f.x$1; x$2 = $f.x$2; x$3 = $f.x$3; x$4 = $f.x$4; x$5 = $f.x$5; $s = $f.$s; $r = $f.$r; } s: while (true) { switch ($s) { case 0: + var _arg, _arg$1, _arg$10, _arg$11, _arg$2, _arg$3, _arg$4, _arg$5, _arg$6, _arg$7, _arg$8, _arg$9, _r, _r$1, _r$10, _r$2, _r$3, _r$4, _r$5, _r$6, _r$7, _r$8, _r$9, p, x, x$1, x$2, x$3, x$4, x$5, $s, $r; + /* */ $s = 0; var $f, $c = false; if (this !== undefined && this.$blk !== undefined) { $f = this; $c = true; _arg = $f._arg; _arg$1 = $f._arg$1; _arg$10 = $f._arg$10; _arg$11 = $f._arg$11; _arg$2 = $f._arg$2; _arg$3 = $f._arg$3; _arg$4 = $f._arg$4; _arg$5 = $f._arg$5; _arg$6 = $f._arg$6; _arg$7 = $f._arg$7; _arg$8 = $f._arg$8; _arg$9 = $f._arg$9; _r = $f._r; _r$1 = $f._r$1; _r$10 = $f._r$10; _r$2 = $f._r$2; _r$3 = $f._r$3; _r$4 = $f._r$4; _r$5 = $f._r$5; _r$6 = $f._r$6; _r$7 = $f._r$7; _r$8 = $f._r$8; _r$9 = $f._r$9; p = $f.p; x = $f.x; x$1 = $f.x$1; x$2 = $f.x$2; x$3 = $f.x$3; x$4 = $f.x$4; x$5 = $f.x$5; $s = $f.$s; $r = $f.$r; } s: while (true) { switch ($s) { case 0: p = this; _arg = (x = vecty.Markup(new sliceType$6([vecty.Class(new sliceType$2(["pure-g"])), vecty.Style("height", "100%")])), new x.constructor.elem(x)); _arg$1 = (x$1 = vecty.Markup(new sliceType$6([vecty.Class(new sliceType$2(["pure-u-1-5"]))])), new x$1.constructor.elem(x$1)); @@ -36190,23 +36186,22 @@ $packages["github.com/status-im/whispervis"] = (function() { _r$3 = elem.Paragraph(new sliceType$5([_r$2])); /* */ $s = 4; case 4: if($c) { $c = false; _r$3 = _r$3.$blk(); } if (_r$3 && _r$3.$blk !== undefined) { break s; } _arg$3 = _r$3; _arg$4 = p.network; - _arg$5 = p.upload; - _arg$6 = (x$2 = vecty.Markup(new sliceType$6([vecty.MarkupIf(!p.loaded, new sliceType$6([vecty.Style("visibility", "hidden")]))])), new x$2.constructor.elem(x$2)); - _arg$7 = p.forceEditor; + _arg$5 = (x$2 = vecty.Markup(new sliceType$6([vecty.MarkupIf(!p.loaded, new sliceType$6([vecty.Style("visibility", "hidden")]))])), new x$2.constructor.elem(x$2)); + _arg$6 = p.forceEditor; _r$4 = p.updateButton(); /* */ $s = 5; case 5: if($c) { $c = false; _r$4 = _r$4.$blk(); } if (_r$4 && _r$4.$blk !== undefined) { break s; } - _arg$8 = _r$4; - _r$5 = elem.Div(new sliceType$5([_arg$6, _arg$7, _arg$8])); /* */ $s = 6; case 6: if($c) { $c = false; _r$5 = _r$5.$blk(); } if (_r$5 && _r$5.$blk !== undefined) { break s; } - _arg$9 = _r$5; - _r$6 = elem.Div(new sliceType$5([_arg$1, _arg$2, _arg$3, _arg$4, _arg$5, _arg$9])); /* */ $s = 7; case 7: if($c) { $c = false; _r$6 = _r$6.$blk(); } if (_r$6 && _r$6.$blk !== undefined) { break s; } - _arg$10 = _r$6; + _arg$7 = _r$4; + _r$5 = elem.Div(new sliceType$5([_arg$5, _arg$6, _arg$7])); /* */ $s = 6; case 6: if($c) { $c = false; _r$5 = _r$5.$blk(); } if (_r$5 && _r$5.$blk !== undefined) { break s; } + _arg$8 = _r$5; + _r$6 = elem.Div(new sliceType$5([_arg$1, _arg$2, _arg$3, _arg$4, _arg$8])); /* */ $s = 7; case 7: if($c) { $c = false; _r$6 = _r$6.$blk(); } if (_r$6 && _r$6.$blk !== undefined) { break s; } + _arg$9 = _r$6; _r$7 = elem.Div(new sliceType$5([(x$3 = vecty.Markup(new sliceType$6([vecty.Class(new sliceType$2(["pure-u-4-5"])), vecty.MarkupIf(!p.loaded, new sliceType$6([vecty.Style("visibility", "hidden"), vecty.Style("height", "0px"), vecty.Style("width", "0px")]))])), new x$3.constructor.elem(x$3)), p.webgl])); /* */ $s = 8; case 8: if($c) { $c = false; _r$7 = _r$7.$blk(); } if (_r$7 && _r$7.$blk !== undefined) { break s; } - _arg$11 = _r$7; + _arg$10 = _r$7; _r$8 = elem.Div(new sliceType$5([(x$4 = vecty.Markup(new sliceType$6([vecty.Class(new sliceType$2(["pure-u-4-5"]))])), new x$4.constructor.elem(x$4)), vecty.If(!p.loaded, new sliceType$7([p.loader]))])); /* */ $s = 9; case 9: if($c) { $c = false; _r$8 = _r$8.$blk(); } if (_r$8 && _r$8.$blk !== undefined) { break s; } - _arg$12 = _r$8; - _r$9 = elem.Div(new sliceType$5([_arg, _arg$10, _arg$11, _arg$12])); /* */ $s = 10; case 10: if($c) { $c = false; _r$9 = _r$9.$blk(); } if (_r$9 && _r$9.$blk !== undefined) { break s; } + _arg$11 = _r$8; + _r$9 = elem.Div(new sliceType$5([_arg, _arg$9, _arg$10, _arg$11])); /* */ $s = 10; case 10: if($c) { $c = false; _r$9 = _r$9.$blk(); } if (_r$9 && _r$9.$blk !== undefined) { break s; } _r$10 = elem.Body(new sliceType$5([_r$9, (x$5 = vecty.Markup(new sliceType$6([event.KeyDown($methodVal(p, "KeyListener")), event.VisibilityChange($methodVal(p, "VisibilityListener"))])), new x$5.constructor.elem(x$5))])); /* */ $s = 11; case 11: if($c) { $c = false; _r$10 = _r$10.$blk(); } if (_r$10 && _r$10.$blk !== undefined) { break s; } $s = -1; return _r$10; - /* */ } return; } if ($f === undefined) { $f = { $blk: Page.ptr.prototype.Render }; } $f._arg = _arg; $f._arg$1 = _arg$1; $f._arg$10 = _arg$10; $f._arg$11 = _arg$11; $f._arg$12 = _arg$12; $f._arg$2 = _arg$2; $f._arg$3 = _arg$3; $f._arg$4 = _arg$4; $f._arg$5 = _arg$5; $f._arg$6 = _arg$6; $f._arg$7 = _arg$7; $f._arg$8 = _arg$8; $f._arg$9 = _arg$9; $f._r = _r; $f._r$1 = _r$1; $f._r$10 = _r$10; $f._r$2 = _r$2; $f._r$3 = _r$3; $f._r$4 = _r$4; $f._r$5 = _r$5; $f._r$6 = _r$6; $f._r$7 = _r$7; $f._r$8 = _r$8; $f._r$9 = _r$9; $f.p = p; $f.x = x; $f.x$1 = x$1; $f.x$2 = x$2; $f.x$3 = x$3; $f.x$4 = x$4; $f.x$5 = x$5; $f.$s = $s; $f.$r = $r; return $f; + /* */ } return; } if ($f === undefined) { $f = { $blk: Page.ptr.prototype.Render }; } $f._arg = _arg; $f._arg$1 = _arg$1; $f._arg$10 = _arg$10; $f._arg$11 = _arg$11; $f._arg$2 = _arg$2; $f._arg$3 = _arg$3; $f._arg$4 = _arg$4; $f._arg$5 = _arg$5; $f._arg$6 = _arg$6; $f._arg$7 = _arg$7; $f._arg$8 = _arg$8; $f._arg$9 = _arg$9; $f._r = _r; $f._r$1 = _r$1; $f._r$10 = _r$10; $f._r$2 = _r$2; $f._r$3 = _r$3; $f._r$4 = _r$4; $f._r$5 = _r$5; $f._r$6 = _r$6; $f._r$7 = _r$7; $f._r$8 = _r$8; $f._r$9 = _r$9; $f.p = p; $f.x = x; $f.x$1 = x$1; $f.x$2 = x$2; $f.x$3 = x$3; $f.x$4 = x$4; $f.x$5 = x$5; $f.$s = $s; $f.$r = $r; return $f; }; Page.prototype.Render = function() { return this.$val.Render(); }; Page.ptr.prototype.updateButton = function() { @@ -36232,45 +36227,20 @@ $packages["github.com/status-im/whispervis"] = (function() { }; Page.prototype.onUpdateClick = function(e) { return this.$val.onUpdateClick(e); }; Page.ptr.prototype.onNetworkChange = function(network) { - var _r, config, network, p, $s, $r; - /* */ $s = 0; var $f, $c = false; if (this !== undefined && this.$blk !== undefined) { $f = this; $c = true; _r = $f._r; config = $f.config; network = $f.network; p = $f.p; $s = $f.$s; $r = $f.$r; } s: while (true) { switch ($s) { case 0: + var _r, _r$1, config, network, p, $s, $r; + /* */ $s = 0; var $f, $c = false; if (this !== undefined && this.$blk !== undefined) { $f = this; $c = true; _r = $f._r; _r$1 = $f._r$1; config = $f.config; network = $f.network; p = $f.p; $s = $f.$s; $r = $f.$r; } s: while (true) { switch ($s) { case 0: p = this; + _r = fmt.Println(new sliceType$1([new $String("Network changed:"), network])); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } + _r; p.data = network.Data; - if (!p.loaded) { - $s = -1; return; - } config = $clone(p.forceEditor.Config(), widgets.ForcesConfig); - _r = layout.NewFromConfig(p.data, $clone(config.Config, layout.Config)); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } - p.layout = _r; + _r$1 = layout.NewFromConfig(p.data, $clone(config.Config, layout.Config)); /* */ $s = 2; case 2: if($c) { $c = false; _r$1 = _r$1.$blk(); } if (_r$1 && _r$1.$blk !== undefined) { break s; } + p.layout = _r$1; $go($methodVal(p, "StartSimulation"), []); $s = -1; return; - /* */ } return; } if ($f === undefined) { $f = { $blk: Page.ptr.prototype.onNetworkChange }; } $f._r = _r; $f.config = config; $f.network = network; $f.p = p; $f.$s = $s; $f.$r = $r; return $f; + /* */ } return; } if ($f === undefined) { $f = { $blk: Page.ptr.prototype.onNetworkChange }; } $f._r = _r; $f._r$1 = _r$1; $f.config = config; $f.network = network; $f.p = p; $f.$s = $s; $f.$r = $r; return $f; }; Page.prototype.onNetworkChange = function(network) { return this.$val.onNetworkChange(network); }; - Page.ptr.prototype.UpdateNetworkGraph = function(json) { - var _r, _r$1, _r$2, _tuple, buf, config, data, err, json, p, $s, $r; - /* */ $s = 0; var $f, $c = false; if (this !== undefined && this.$blk !== undefined) { $f = this; $c = true; _r = $f._r; _r$1 = $f._r$1; _r$2 = $f._r$2; _tuple = $f._tuple; buf = $f.buf; config = $f.config; data = $f.data; err = $f.err; json = $f.json; p = $f.p; $s = $f.$s; $r = $f.$r; } s: while (true) { switch ($s) { case 0: - p = this; - buf = bytes.NewBuffer(json); - _r = formats.FromD3JSONReader(buf); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } - _tuple = _r; - data = _tuple[0]; - err = _tuple[1]; - /* */ if (!($interfaceIsEqual(err, $ifaceNil))) { $s = 2; continue; } - /* */ $s = 3; continue; - /* if (!($interfaceIsEqual(err, $ifaceNil))) { */ case 2: - _r$1 = fmt.Errorf("update graph: %v", new sliceType$1([err])); /* */ $s = 4; case 4: if($c) { $c = false; _r$1 = _r$1.$blk(); } if (_r$1 && _r$1.$blk !== undefined) { break s; } - $s = -1; return _r$1; - /* } */ case 3: - p.data = data; - config = $clone(p.forceEditor.Config(), widgets.ForcesConfig); - _r$2 = layout.NewFromConfig(data, $clone(config.Config, layout.Config)); /* */ $s = 5; case 5: if($c) { $c = false; _r$2 = _r$2.$blk(); } if (_r$2 && _r$2.$blk !== undefined) { break s; } - p.layout = _r$2; - $go($methodVal(p, "StartSimulation"), []); - $s = -1; return $ifaceNil; - /* */ } return; } if ($f === undefined) { $f = { $blk: Page.ptr.prototype.UpdateNetworkGraph }; } $f._r = _r; $f._r$1 = _r$1; $f._r$2 = _r$2; $f._tuple = _tuple; $f.buf = buf; $f.config = config; $f.data = data; $f.err = err; $f.json = json; $f.p = p; $f.$s = $s; $f.$r = $r; return $f; - }; - Page.prototype.UpdateNetworkGraph = function(json) { return this.$val.UpdateNetworkGraph(json); }; NewWebGLScene = function() { var w; w = new WebGLScene.ptr(ptrType$16.nil, ptrType$17.nil, new three.PerspectiveCamera.ptr(null, new three.Vector3.ptr(null)), ptrType.nil, ptrType$10.nil, ptrType$10.nil, ptrType$10.nil, new TrackBallControl.ptr(null), false); @@ -36382,25 +36352,6 @@ $packages["github.com/status-im/whispervis"] = (function() { /* */ } return; } if ($f === undefined) { $f = { $blk: Page.ptr.prototype.StartSimulation }; } $f._r = _r; $f.config = config; $f.i = i; $f.p = p; $f.$s = $s; $f.$r = $r; return $f; }; Page.prototype.StartSimulation = function() { return this.$val.StartSimulation(); }; - Page.ptr.prototype.onUpload = function(json) { - var _r, _r$1, _r$2, err, json, p, $s, $r; - /* */ $s = 0; var $f, $c = false; if (this !== undefined && this.$blk !== undefined) { $f = this; $c = true; _r = $f._r; _r$1 = $f._r$1; _r$2 = $f._r$2; err = $f.err; json = $f.json; p = $f.p; $s = $f.$s; $r = $f.$r; } s: while (true) { switch ($s) { case 0: - p = this; - _r = p.UpdateNetworkGraph(json); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } - err = _r; - /* */ if (!($interfaceIsEqual(err, $ifaceNil))) { $s = 2; continue; } - /* */ $s = 3; continue; - /* if (!($interfaceIsEqual(err, $ifaceNil))) { */ case 2: - _r$1 = fmt.Println(new sliceType$1([new $String("[ERROR] Failed to process network.json:"), err])); /* */ $s = 4; case 4: if($c) { $c = false; _r$1 = _r$1.$blk(); } if (_r$1 && _r$1.$blk !== undefined) { break s; } - _r$1; - $s = -1; return; - /* } */ case 3: - _r$2 = fmt.Println(new sliceType$1([new $String("Uploaded new network graph")])); /* */ $s = 5; case 5: if($c) { $c = false; _r$2 = _r$2.$blk(); } if (_r$2 && _r$2.$blk !== undefined) { break s; } - _r$2; - $s = -1; return; - /* */ } return; } if ($f === undefined) { $f = { $blk: Page.ptr.prototype.onUpload }; } $f._r = _r; $f._r$1 = _r$1; $f._r$2 = _r$2; $f.err = err; $f.json = json; $f.p = p; $f.$s = $s; $f.$r = $r; return $f; - }; - Page.prototype.onUpload = function(json) { return this.$val.onUpload(json); }; Page.ptr.prototype.VisibilityListener = function(e) { var _r, document, e, hidden, p, $s, $r; /* */ $s = 0; var $f, $c = false; if (this !== undefined && this.$blk !== undefined) { $f = this; $c = true; _r = $f._r; document = $f.document; e = $f.e; hidden = $f.hidden; p = $f.p; $s = $f.$s; $r = $f.$r; } s: while (true) { switch ($s) { case 0: @@ -36416,8 +36367,8 @@ $packages["github.com/status-im/whispervis"] = (function() { bindataFileInfo.methods = [{prop: "Name", name: "Name", pkg: "", typ: $funcType([], [$String], false)}, {prop: "Size", name: "Size", pkg: "", typ: $funcType([], [$Int64], false)}, {prop: "Mode", name: "Mode", pkg: "", typ: $funcType([], [os.FileMode], false)}, {prop: "ModTime", name: "ModTime", pkg: "", typ: $funcType([], [time.Time], false)}, {prop: "IsDir", name: "IsDir", pkg: "", typ: $funcType([], [$Bool], false)}, {prop: "Sys", name: "Sys", pkg: "", typ: $funcType([], [$emptyInterface], false)}]; TrackBallControl.methods = [{prop: "Update", name: "Update", pkg: "", typ: $funcType([], [], false)}]; ptrType$5.methods = [{prop: "String", name: "String", pkg: "", typ: $funcType([], [$String], false)}, {prop: "NodesCount", name: "NodesCount", pkg: "", typ: $funcType([], [$Int], false)}, {prop: "LinksCount", name: "LinksCount", pkg: "", typ: $funcType([], [$Int], false)}]; - ptrType$15.methods = [{prop: "Render", name: "Render", pkg: "", typ: $funcType([], [vecty.ComponentOrHTML], false)}, {prop: "descriptionBlock", name: "descriptionBlock", pkg: "github.com/status-im/whispervis", typ: $funcType([], [ptrType$19], false)}, {prop: "onChange", name: "onChange", pkg: "github.com/status-im/whispervis", typ: $funcType([ptrType$20], [], false)}, {prop: "networkOptions", name: "networkOptions", pkg: "github.com/status-im/whispervis", typ: $funcType([], [vecty.List], false)}, {prop: "onUpload", name: "onUpload", pkg: "github.com/status-im/whispervis", typ: $funcType([sliceType], [], false)}]; - ptrType$21.methods = [{prop: "KeyListener", name: "KeyListener", pkg: "", typ: $funcType([ptrType$20], [], false)}, {prop: "Render", name: "Render", pkg: "", typ: $funcType([], [vecty.ComponentOrHTML], false)}, {prop: "updateButton", name: "updateButton", pkg: "github.com/status-im/whispervis", typ: $funcType([], [ptrType$19], false)}, {prop: "onUpdateClick", name: "onUpdateClick", pkg: "github.com/status-im/whispervis", typ: $funcType([ptrType$20], [], false)}, {prop: "onNetworkChange", name: "onNetworkChange", pkg: "github.com/status-im/whispervis", typ: $funcType([ptrType$5], [], false)}, {prop: "UpdateNetworkGraph", name: "UpdateNetworkGraph", pkg: "", typ: $funcType([sliceType], [$error], false)}, {prop: "StartSimulation", name: "StartSimulation", pkg: "", typ: $funcType([], [], false)}, {prop: "onUpload", name: "onUpload", pkg: "github.com/status-im/whispervis", typ: $funcType([sliceType], [], false)}, {prop: "VisibilityListener", name: "VisibilityListener", pkg: "", typ: $funcType([ptrType$20], [], false)}]; + ptrType$15.methods = [{prop: "Render", name: "Render", pkg: "", typ: $funcType([], [vecty.ComponentOrHTML], false)}, {prop: "descriptionBlock", name: "descriptionBlock", pkg: "github.com/status-im/whispervis", typ: $funcType([], [ptrType$19], false)}, {prop: "networkOptions", name: "networkOptions", pkg: "github.com/status-im/whispervis", typ: $funcType([], [vecty.List], false)}, {prop: "onChange", name: "onChange", pkg: "github.com/status-im/whispervis", typ: $funcType([ptrType$20], [], false)}, {prop: "onUpload", name: "onUpload", pkg: "github.com/status-im/whispervis", typ: $funcType([sliceType], [], false)}, {prop: "setCurrentNetwork", name: "setCurrentNetwork", pkg: "github.com/status-im/whispervis", typ: $funcType([ptrType$5], [], false)}]; + ptrType$21.methods = [{prop: "KeyListener", name: "KeyListener", pkg: "", typ: $funcType([ptrType$20], [], false)}, {prop: "Render", name: "Render", pkg: "", typ: $funcType([], [vecty.ComponentOrHTML], false)}, {prop: "updateButton", name: "updateButton", pkg: "github.com/status-im/whispervis", typ: $funcType([], [ptrType$19], false)}, {prop: "onUpdateClick", name: "onUpdateClick", pkg: "github.com/status-im/whispervis", typ: $funcType([ptrType$20], [], false)}, {prop: "onNetworkChange", name: "onNetworkChange", pkg: "github.com/status-im/whispervis", typ: $funcType([ptrType$5], [], false)}, {prop: "StartSimulation", name: "StartSimulation", pkg: "", typ: $funcType([], [], false)}, {prop: "VisibilityListener", name: "VisibilityListener", pkg: "", typ: $funcType([ptrType$20], [], false)}]; ptrType$12.methods = [{prop: "animate", name: "animate", pkg: "github.com/status-im/whispervis", typ: $funcType([], [], false)}, {prop: "ToggleAutoRotation", name: "ToggleAutoRotation", pkg: "", typ: $funcType([], [], false)}, {prop: "CreateObjects", name: "CreateObjects", pkg: "", typ: $funcType([mapType$2, sliceType$8], [], false)}, {prop: "createNodes", name: "createNodes", pkg: "github.com/status-im/whispervis", typ: $funcType([mapType$2], [], false)}, {prop: "createEdges", name: "createEdges", pkg: "github.com/status-im/whispervis", typ: $funcType([mapType$2, sliceType$8], [], false)}, {prop: "RemoveObjects", name: "RemoveObjects", pkg: "", typ: $funcType([], [], false)}, {prop: "init", name: "init", pkg: "github.com/status-im/whispervis", typ: $funcType([ptrType], [], false)}, {prop: "shutdown", name: "shutdown", pkg: "github.com/status-im/whispervis", typ: $funcType([ptrType], [], false)}, {prop: "Reset", name: "Reset", pkg: "", typ: $funcType([], [], false)}, {prop: "InitScene", name: "InitScene", pkg: "", typ: $funcType([$Float64, $Float64], [], false)}, {prop: "InitLights", name: "InitLights", pkg: "", typ: $funcType([], [], false)}, {prop: "InitControls", name: "InitControls", pkg: "", typ: $funcType([], [], false)}]; asset.init("github.com/status-im/whispervis", [{prop: "bytes", name: "bytes", embedded: false, exported: false, typ: sliceType, tag: ""}, {prop: "info", name: "info", embedded: false, exported: false, typ: os.FileInfo, tag: ""}]); bindataFileInfo.init("github.com/status-im/whispervis", [{prop: "name", name: "name", embedded: false, exported: false, typ: $String, tag: ""}, {prop: "size", name: "size", embedded: false, exported: false, typ: $Int64, tag: ""}, {prop: "mode", name: "mode", embedded: false, exported: false, typ: os.FileMode, tag: ""}, {prop: "modTime", name: "modTime", embedded: false, exported: false, typ: time.Time, tag: ""}]); @@ -36425,7 +36376,7 @@ $packages["github.com/status-im/whispervis"] = (function() { TrackBallControl.init("", [{prop: "Object", name: "Object", embedded: true, exported: true, typ: ptrType$18, tag: ""}]); Network.init("", [{prop: "Name", name: "Name", embedded: false, exported: true, typ: $String, tag: ""}, {prop: "Description", name: "Description", embedded: false, exported: true, typ: $String, tag: ""}, {prop: "Data", name: "Data", embedded: false, exported: true, typ: ptrType$6, tag: ""}]); NetworkSelector.init("github.com/status-im/whispervis", [{prop: "Core", name: "Core", embedded: true, exported: true, typ: vecty.Core, tag: ""}, {prop: "current", name: "current", embedded: false, exported: false, typ: ptrType$5, tag: ""}, {prop: "isCustom", name: "isCustom", embedded: false, exported: false, typ: $Bool, tag: ""}, {prop: "networks", name: "networks", embedded: false, exported: false, typ: mapType$1, tag: ""}, {prop: "upload", name: "upload", embedded: false, exported: false, typ: ptrType$7, tag: ""}, {prop: "handler", name: "handler", embedded: false, exported: false, typ: funcType$2, tag: ""}]); - Page.init("github.com/status-im/whispervis", [{prop: "Core", name: "Core", embedded: true, exported: true, typ: vecty.Core, tag: ""}, {prop: "layout", name: "layout", embedded: false, exported: false, typ: ptrType$11, tag: ""}, {prop: "webgl", name: "webgl", embedded: false, exported: false, typ: ptrType$12, tag: ""}, {prop: "loaded", name: "loaded", embedded: false, exported: false, typ: $Bool, tag: ""}, {prop: "loader", name: "loader", embedded: false, exported: false, typ: ptrType$13, tag: ""}, {prop: "forceEditor", name: "forceEditor", embedded: false, exported: false, typ: ptrType$14, tag: ""}, {prop: "upload", name: "upload", embedded: false, exported: false, typ: ptrType$7, tag: ""}, {prop: "network", name: "network", embedded: false, exported: false, typ: ptrType$15, tag: ""}, {prop: "data", name: "data", embedded: false, exported: false, typ: ptrType$6, tag: ""}]); + Page.init("github.com/status-im/whispervis", [{prop: "Core", name: "Core", embedded: true, exported: true, typ: vecty.Core, tag: ""}, {prop: "layout", name: "layout", embedded: false, exported: false, typ: ptrType$11, tag: ""}, {prop: "webgl", name: "webgl", embedded: false, exported: false, typ: ptrType$12, tag: ""}, {prop: "loaded", name: "loaded", embedded: false, exported: false, typ: $Bool, tag: ""}, {prop: "loader", name: "loader", embedded: false, exported: false, typ: ptrType$13, tag: ""}, {prop: "forceEditor", name: "forceEditor", embedded: false, exported: false, typ: ptrType$14, tag: ""}, {prop: "network", name: "network", embedded: false, exported: false, typ: ptrType$15, tag: ""}, {prop: "data", name: "data", embedded: false, exported: false, typ: ptrType$6, tag: ""}]); WebGLScene.init("github.com/status-im/whispervis", [{prop: "WebGLRenderer", name: "WebGLRenderer", embedded: true, exported: true, typ: ptrType$16, tag: ""}, {prop: "scene", name: "scene", embedded: false, exported: false, typ: ptrType$17, tag: ""}, {prop: "camera", name: "camera", embedded: false, exported: false, typ: three.PerspectiveCamera, tag: ""}, {prop: "renderer", name: "renderer", embedded: false, exported: false, typ: ptrType, tag: ""}, {prop: "graph", name: "graph", embedded: false, exported: false, typ: ptrType$10, tag: ""}, {prop: "nodes", name: "nodes", embedded: false, exported: false, typ: ptrType$10, tag: ""}, {prop: "edges", name: "edges", embedded: false, exported: false, typ: ptrType$10, tag: ""}, {prop: "controls", name: "controls", embedded: false, exported: false, typ: TrackBallControl, tag: ""}, {prop: "autoRotate", name: "autoRotate", embedded: false, exported: false, typ: $Bool, tag: ""}]); $init = function() { $pkg.$init = function() {}; @@ -36456,7 +36407,6 @@ $packages["github.com/status-im/whispervis"] = (function() { _dataNet300Json = (new sliceType($stringToBytes("\x1F\x8B\b\x00\x00\x00\x00\x00\x00\xFF\xAC\x9D\xCF\xAA\x1C\xC9sF\xF7z\x8A\xE6\xAEE\xD3\x19\xFD\x7F\x1E\xC3[3\v!\x89\x19a[\x12\x92\x8C\x17\xC3\xBC\xBB\xB9\xD7\f\x86\x1F\x95u\xBE\x93\xC4F\x9B\xDB:DUfeFDF\xC6\xF7\xD7\xBB\xC3\xE1\xE5\xD3\xE7\x9F\x1F\x7F|\xF9\xFE\xEB\xCB\xB7\xAF/\xBF\x1D^\xFE\xED\xC3\xD7O\xDF\xFE\xEB\xF0\xC7\x8F\x0F\xDF\xFF<\xFC\xCF\x97_\x7F\x1E\xCE\xA7\xD3\xE1\xEB\xB7O\x9F\x7F\xBE?\\\x0E\xDF\xEB\xFB\xE1\xE3\xB7\xAF_?\x7F|\xFD\x0F?\x0F\x9F?|\xFC\xF3\xE5\xFD+\xE7\xED'/\xBF\x1D\xFE\xFD\xDD\xE1p8\xFC\xF5\xF6\xEF\xE1\xF0\xF2\xE5\xD3+u<\xEB8n\x8F\xE38\xD6\xCB\xDB_\xFE~\xBF\xFF\xB3s\xF6\xB3K\xF6\xB3k\xF6\xB3[\xF6\xB3{\xF6\xB3G\xF6\xB3g\xF6\xB3q\n\x7F7\xC2\xDF\x85\x031\xC2\x91\x18\xE1P\x8Cp,F8\x18#\x1C\x8D\x11\x0E\xC7\b\xC7\xA3\xC2\xF1\xA8p<*\x1C\x8F\n\xC7\xA3\xC2\xF1\xA8p<*\x1C\x8F\n\xC7\xA3\xC2\xF1\xA8p<\xCE\xE1x\x9C\xC3\xF18\xA7\vU8\x1E\xE7p<\xCE\xE1x\x9C\xC3\xF18\x87\xE3q\x0E\xC7\xE3\x1C\x8E\xC7%\x1C\x8FK8\x1E\x97p<.\xE9\xCE\x11\x8E\xC7%\x1C\x8FK8\x1E\x97p<.\xE1x\\\xC2\xF1\xB8\x86\xE3q\r\xC7\xE3\x1A\x8E\xC75\x1C\x8Fk\xBA\x95\x87\xE3q\r\xC7\xE3\x1A\x8E\xC75\x1C\x8Fk8\x1E\xB7p\xD2\xB8}\xA4\x81\xFBH#\xF7\x91\x86\xEE#\x8D\xDDG\x1A\xBC\x8F4z\x1Fi\xF8>\xD2\xF8}\xA4\x01\xFCH#\xF8\x91\x86\xF0#\x8D\xE1G\x1A\xC4\x8F4\x8A\x1Fi\x18?\xD28~\xA4\x81\xFCH#\xF9\x91\x86\xF2#\x8D\xE5G\x1A\xCC\x8F4\x9A\x1Fi8?\xD2x~\xA4\x01\xFDH#\xFA\x91\x86\xF4#\x8D\xE9G\x1A\xD4\x8F4\xAA\x1FiX?\xD2\xB8~\xA4\x81\xFDH#\xFB\x91\x86\xF6#\x8D\xEDG\x1A\xDC\x8F4\xBA\x1Fix?\xD2\xF8~\xA4\x01\xFEH#\xFC\x91\x86\xF8#\x8D\xF1G\x1A\xE4\x8F4\xCA\x1Fi\x98?\xD28\x7F\xA4\x81\xFEH#\xFD\x91\x86\xFA#\x8D\xF5G\x1A\xEC\x8F4\xDA\x1Fi\xB8?\xD2x\x7F\xA4\x01\xFFH#\xFE\x91\x86\xFC#\x8D\xF9G\x1A\xF4\x8F4\xEA\x1Fi\xD8?\xD2\xB8\x7F\xA4\x81\xFFH#\xFF\x91\x86\xFE#\x8D\xFDG\x1A\xFC\x8F4\xFA\x1Fi\xF8?\xD2\xF8\x7F\xA4\t\x80\x91f\x00F\x9A\x02\x18i\x0E\xA0\xD2\x1C@\xA59\x80Js\x00\x95\xE6\x00*\xCD\x01T\x9A\x03\xA84\x07Pi\x0E\xA0\xD2\x1C@\xA59\x80Js\x00\x95\xE6\x00*\xCD\x01T\x9A\x03\xA84\x07Pi\x0E\xA0\xD2\x1C@\xA59\x80Js\x00\x15\x9F\xDB\xC7\x07\xF7\xF9\xC9}:2\xF1\xD9}|x\x1F\x9F\xDE\xC7\xC7\xF7\xF1\xF9}|\x80\x9F\xE6\x00*\xCD\x01T\x9A\x03\xA84\x07Pi\x0E\xA0\xD2\x1C@\xA59\x80Js\x00\x95\xE6\x00*\xCD\x01T\x9A\x03\xA84\x07Pi\x0E\xA0\xD2\x1C@\xA59\x80Js\x00\x95\xE6\x00*\xCD\x01T\x9A\x03\xA84\x07Pi\x0E\xA0\xD2\x1C@\xA59\x80Js\x00\x95\xE6\x00*\xCD\x01T\x96\x03\xA8c\xF4\xCCu\x8C\x9E\xB8\xB2\x8A\xC4\xCA*\x12+\xABH\xAC\xAC\"\xB1\xB2\x8A\xC4\xCA*\x12+\xABH\xAC\xAC\"\xB1\xC2\x8A\xC4\n+\x12+\xACH\xAC\xB0\"\xB1\xC2\x8A\xC4\n+\x12+\xACH\xAC\xB0\"\xB1\xC2\x8A\xC4\n+\x12+\xACH\xAC\xB0\"\xB1\xC2\x8A\xC4\n+\x12+\xACH\xAC\xB0\"\xB1\xC2\x8A\xC4\n+\x12+\xACH\xAC\xB0\"\xB1\xC2\x8A\xC4\n+\x12+\xACH\xAC\xB0\"\xB1\xC2\x8A\xC4\n+\x12+\xACH\xAC\xB0\"\xB1\xC2\x8A\xC4\n+\x12+\xACH\xAC\xB0\"\xB1\xC2\x8A\xC4\n+\x12+\xACH\xAC\xFF\xAFH|w8\xFC\xFE\xFA\xDB\x97\xFF\xFC\xF2\xF5?6J\xEF\x7F~\xFB\xEF\x1F\x1F?\xFF\xCB\x1E\xFB\xF2\xFE\x9F?\xFF\xFA\xF0\xE3\x8F\xCF\xBF\xB2\xB9\xADQ;^\xFA\x02k\x96\x82^@M\xCF\x80\xB7Xgx\xC4\xD9\x12\xB9\xC0\x9A}\x8D\v\xA8\xE9\xE1\xD5\nk\x96\xDD\xDAb]\x805\xDB\x91WX}f\xCD\x8E-\x16PS\x9Fx\x8Bu\xDDg\xCD\xBC\xE6\x05\xD4\xF4\x14n\x855K\xC9.\xB0\xA6\xA1\xD8\x16\xEBF\xDF\xB5\x18\xC6]\xD6\xDC\x13]0kv\x96\xB3\x80\x12\xA4;\xAD[b\x99G\x96\x18Cb\xCD\\&\xCD\x9AFN[\xA4\xC7>I\xCC\xF7]\xD2\xBC\x96{\x015\xCDX-\xB0\xCCt\x7F\x02j\xE2\xB3-\xA0\xC4\x02OF\xCDKX,\xC1\xD4'\x0E\xB0Y\xA5\xCE&\v\xFD\xFB6\xD8<\x05\xB5d\xD8,?\xBB\x04\x9B\x95Km\xC2\xC0\x056_%x\xE6&;A,\xE5\xA8P\xC4\xA06\x11p\xF4\x8D\xF3\xBA\xCF\xDA)\x15[\x81\xCDJ^WX\xB3\xBA\xC6M\x169\xD6\xB3jJ\x0F\x9B\x1F7\xAC\x186\xABN\\a\x99=\xBC\xC0\x15\x9E\x96a,\xC1f\xC7\xCEK0\xE3r\x12lv\x84\xBC\xC9\"\xBF\xDA\xCC1\x82\xA9\xFC\xDC>l~\xCE\xB7d\x98\xD9D\x8AR\xDC\xB3\x13M\x0F\x9B\x9E\x8E\xAF\xD8%VDB\x99\xC8\xAD\xC0\x176\xF9_bMkoV`\xD3\xB2\xED\x15\x98Y\xF7\x8B\xD2\xDC\xE6\xED\x13\xCB\xEC\xE0\x04\x9B\xDEtY\x81\xA9\xB5\x023\xF0\xE6\xFB\xA6\xB4\xB9yH2\xCC\xF8)\b3ax\x91\x8Fn&?\xFA\xE8f\x19\x03\xC3\xD4\x1E\x0E\x86M\xAB(7a\xE0\xEF\x9B\xFD\b\xB3\xFA\xE6\x85\x81]j$\xC10u\x94U\x94D7\xFB$\x9D\x12\x98\x17F\xC1\xC3\xAC\n\x7F\x05fR\r\x05\xBE\xB0IA\x11K\xBD0\nDf\xB7\x11\x96`\xB3\x82\xA6\xCD\xE3sJ~\xCF.}\xAC\xC0f\x17\x15\x97\f\x9B]\xB7X\x81\xA9e\xECL\x1E\xFF\xEC\xAA\xD3\x12\xCC\x04\xF5\xFB\xB0y%\xD4\x8Aa\xB3\x1B\x8B\x9B,r\xF8g\xB7CW`fQD\x96I\xB4\x9D\xC9\x1D61\x12\xC1\xA6w\x83\x96,3\x9B\x12\xC2TQ\xD1\xAE\x0F\xEBRZ\xFB\xAC\x9D\xEB\xF8+\xB0i=\xFA\n\xCCd\x14\xCF\xE8\xC3\x9A\xD7O\x9E\xBA\x1AK\x80\xA9\n\xB1]\x96\xABp9\x93s=\xBB\xAE\xE8a\xF3\"\xE6%\xC3Ll\x830\xB3,\x82\x13;\xBB\xEA\xECY\xF3*\xD9\x15\xBBf\xF7wWX\xD3>\r\x9B0r\x88M\x8E\x86`\xD3kxk03\x96\x10C\x98\x87$O\xBD\x0F\xE5\xBC\vt\xAE\xFBX\xD3\x8B\xC0[\xB0\v\xB8\xB0\xE6\xC8\x80X\xD3\x96k+0U\xE9\x850\xE3C]\xA8JE\x8C%\xB1L9/x\xE9f \xF1\xF0A\xB0\xA8\x86],\x14\xC42/\x9EJz\x1A\x1FQU\"\\\xC8\x0F\x9E5\x0EX\x82\xA92v\x80\x99\\.\xB1\xA6}\x146a\xE0\xED\x9BD\xDB>k*K\xB0\x82R\xD9\x01\x82\xA92\xA8\vf\xD2\x8DeT\xB0\xDFiX\x1FjvMi\x93EN\xB0\xB9\xD3C07-\xE8\xB4\xA0\xD10uXsA?\xD8\xAC\xFB\x148\x98\xA7$\xC3L\x92\xF9\x02\x9E\xAB9\xC4\xDBg\xC9S$\x84\x999\x06\xACY\xAF\xA6M\x16\xF8\xAE\xB3\x0EH+,5]\xC9\xA76\xEF\x8B2\xFCb\xCF\xBD\x92Km\xD2\x92\b3\xDF\x11\xC2\xCCt%\x98)\xFF\xBB\x92{.\xA6+\xB1\xA6}&V`\xB3\xB6uK\x86\x99\xABLW\xF0_M\fH,sK\x8E\xEAf\x1AYj\xE6\x93\xEFj\xC2\xA3}\x98\xBBZ@\x86M;\xF5.\xC1L\xBA\xE8J\xDE\xEB\xAC\x81\xD8\nl\xD6\x97o\x85e\x12\xD5\xC42\xA5\x84W\xACG7\x8BEg\x15\x0E\xC1\xD4RM>\xBAyH\xBA&\xDA\xC92\xCFH\xEE\xBEI\x17!L}\x94\xE4U\x9B\xD5\x02XjV`q\xBBY_\xA9\xEA\xDE\xB00\xE9m\x9E\x12o\x9Fv\xC2\xD4\xDAC\x8Fi\xA2\x9A+9\xD6j\x17\xA7[\xA8f\xC6\x92a&%L0\xE5Y\xDF(Y-^?\xB1\xCC1\x19\xB2\x04\nr\xD5\xA6;\x00\x15\xA7\x98\xFE\x07\xC42\r\x10\xC0C7\x97\x03oXOb\x1AFP\xB6z\xD6\xA4y\xC9\xB2Yw0\x0F\x9B6\xAE\xDBDa\xD1\x8C\xB1\v|t\x13\xE9\xA2a&\xD3@\xB0i\xDF\xC9M\x18\xDE@5\x96\x91\x8Fn\xBE$\xF2\xD1\x1B\xED\x9A\xB6<\xDE\x84a\x99\x8B\xF9\xC6\xC9\x17\x16\x8E\n\xB1\x8C7\x86\x0Fi*@n\x98Hod\x99\x97Oit3+\xF0\x19\xCD\xD2\x03e.\xEA\x85\x91_=k\x9B\xBEb\x98\xC9K\x12K\xBD0t^\xCDP\xA2[m\x9E\x12\xA3\x07\xF3\x98\x94\xFB\xEECM\x95\x8E\x96`\xE6\xF4\x9A`\xAE\xC7\x12x\xAF\xC6C'\x96k\xD8D\x89\xF4\x99\xF8\x88\x87\xCD\x9BBn\xB2\xA8\n\xC4\xD4\xF0\xEF\xC3\xDCI\x19\x19\xD6f\xD6\x8E\xF0\xC3&\xAC\xB3\xB5\xCB>l\xDE>s\xC505])|0\x17k\xEE\xE0\xC0\xCETIVX\xE6\xA8\x86Xf\xDD\xDFg\xCD\xFB\xE1n\xB20]m^>\xC0\xCCNI,U\x9E\x820\x93\xCB\xBDC\xC9\xB7\xF9\xBE;;\xCE \xCC4w%\x98\x9A\xAF\x94c6\xE5\xA5\x04\x9Bj#\xADY\xD6\xF9\x98&~\xB8SQ\x89\xDAw\xD1O7s\x16{KvZf.\xFC\xDC\xB1\xDE\xC5<&\xC1L\xC3Q\x82\x99\xE3\x1F4l\xD6\xDEz\x13\xD6\x99ff\x98\xF9\xCE\xA9\xE6\xC5\xBC2\xAA\xE1\x17\xF3\xE2\x81\xF7P\xC5\xEB'\x98:\xCB \x98iL\xB1\xCFrY\x82\x07y\xFD&\x11\xB5\x0FS\x19]\xB2K\xAD\x8A\xF8\x90\xA6h\xF5A\x1E\xB1\xB9\xF6\x800S\xD1\x89\xB0\x99(\xE2\x12\xCC\\]|`\rM'\xCCx\xB2\x04\x9B\xEA\xB4/YfR[\x0Fr\x8B\xCD\xEAO0\x95[A\x989m\xD9\x87\xCD\xF5 6Y\x94\xBC6\x0F\x89]\xDB\xBBXs\r\x8D\x15\x96Z0\xB0X\xA5\x8F\xA5z:\x12\xCC\x94q\xF0C\x1A\x18%\xE8\xCD\f\xA3(b&\xC8\xBBd\x98\xF9$\xE9\x82\xACHa<\xA8\xDBd\x17Jj\x9A\x10L\x892\xA0e&\xB6y@\xD5\x8B\xC9*\xEE\xB3vd\xBBW\f3Y\x072l*1\xBB\x05{R\xAE\xBF\v5W\xF9Z1\xCB8P\xC4\x9AJ\xBFo\xC2\xD0\x1D6o\x8C:\xBC\x18\xD5\x012\xCC\x94G\x13\xCC\x1Cg<\xA9\x11c\x17J%(\xC9*\xF3q\xA3Y\xE6\x11\xB1\xA3c#\xCB\x14i\x11\xCC\xC4\xBA\xFC\x90f\xAEbo\xF9F\x98\xD1\xC5B\xC3n\xE6+\xA2*!c\x18\xD5\xCF\x98\xF5\x90\\}\x93k\xD8\x87)\x87\x87P\xC6\xDFyb\xFE\xDB\xCC}\x80\x99wO(3\xBF\xB0\xFF\xA5y\xF9\xE4\x9D\x8B\xF8\x0FY\xA6\r\x17\xC2:\x1F\xD2\xBC\xFD\xC6\xCB\xB1\xFB\xAC\xB7C\xD66\x96:\xAB$\x98j\xA8\xF6$\xEF\xFC\xDA\t3u\xBE\xFB0\xE7\xEA\xA3aJ\xCC\xE8\x04\x8E\xB0\xA94E\xD8T\x05|\x89f\"J~N\xA3\x90q\"\xBFZ\xE9\\a\x9DP\x9Fi\xAE\x14\x13M3\xCE\xCA8ayO\x1B\xCC-\x8Eh\x99\xD4-\xC3\xB6\x9A\xEA\xAD\xA1\xBF\xDE\bS\xEA\"\xFB0\xA9\x86C\x96\x99\"\xBEqB\xEF\xDF(\x9F\xEC\xD3\\%\x19\x9A\xA6\xBA\x97\xA0i&\xBB2N\x8D\xDE1\xC0^\xA39\xB5xw*B\x11\xAC\xDC'E\x99u5\xD5:[\xC8 M\xA9\x85\x11L\x95_\xBF\xFA\xE7\x9D\xD3\x83\n\xE0\xD5\xF4\xA0\"\x1D\xB7\xB9ce\x93ZrQ\xBEU\r\x02\xD0\x9C():\xF2}\xA6\xA9f|\xE3\x84\x05\xFAjz\x00\xCD\xED\x06\xADJXD3A\xC6 \xF9Uu\xDB\x05i\xEA@\x07hV\xCD\x95\x8A\x7F\x14\f;?v\xD2\xD4\x02N0\x15\x9A\x11L\xB9\xB8$\xE9\xEA6\x03\xA4\xA98\x83\xE5f\xD5\x18\xD0\x01\x83aa\xF7x5\xA0Xi\xA3\xC6\xA0\xF3\x90\x81i&{5P\x90\xD5\xE9J\x03\xCDM]<\x1CPS\xB7\xF1\x0E\xF1 MV7=\xD0\x03WC\x80\xBD~\x1Aa*\xAF@\xB2\xAC\xA5\x9C?R\x9F5\x07\x0Eh\x9AZ\xBF\xB1a\xBE\xA25V\x04\x01\xCC~\x9E\xE4\xCB\x9B3]\xA6\xB9\xDD\x9D\xCA\x82\xD4\x17E\xA7\x05\x8D,\x15\xBA\x13\xCC\xB9\x1D\xD8\xC1\xA6\x11\xD6i\xD8PR\xC7HSI?\xD2hU\x01\v\xC1\x9Cj8\xD1L\x8D#\xC2\x94\x03\x83b\xB4*O\x874\x93#\"5Z5\x9Ct\xAFX\xC1 \xC1\xDF\xC7\x92\xC5qH3\x17e\xD94\xE5\xBD\xA0\xF4\xAB\xA9Ze\x9AJ\xA3#\xCDT\xE72M\x99\x86b\xB2\xEAk'Y)\xB5\x0E\xE1QF'L\x8D\x00f\xF8\xCD\x9E\x87\xE2\xB4\xA6\x9D_@S\x03J\x1D\xFA\x15\f\xCB\xFA\xD5\xF4\x00\x9A\xB9#\x800S:\x840SO6H\nV%aP\v\xD6='^\x10V+\x11\xD0\xCC\xE5\x9D\x81:\xB5\xE6V)\xD0J\xD5o\xA1i\xAA\xB8\x86in\xF1\xA0\xB8@\x1D'\xED\xD3\xE4)9\x99f\n\x94\x11f\xCAZ\x07\xEA\xC2\x9A\xE2|\xA4\x95:. \x9A\xA9\xA8\x07\x98\xEB\xA1:PfV=&]\x166\xCB\x1AY\xA6\xCA\x88\xF01U*\x12\xD5aM\x8F,\xA6)w\x9EmS\x9F\x01\xD0L\xF3\x8FA\x02\xB1*\xA9\x80:\xB8*\xA2E\xEDZ\x95]f\xC1_5\xDB\xC8g6=;\x90\xD6k\x99Z\xC016P4*\xDAW\x93\x8D\"\r\x15\xBE\xB3Ro\xABmFu|\xA0Z\xAC\x9Akt\xFA\xA0\x9CI4M\x1D?\x10M\xC5\x8E\xA8\x19\xAB2\xB9HS\x91\v\xD2\x9C\xF3\xD1ZM\x84\xF2\xB8\xEA\x04\xA2Ul\x17i*\xD3\x8Fj\xBBF-q\xA0\x16\xAD\xCAs\xA2\x1A\xAD\xB9C\x074Y\x10J\xA6\xA9c=\x14\xB7U\xE7zHS\x91\x10\xCA\xDB^\xFBls\xB5k\xA8$\xAB\x9Cz\xA2\xA9D\x16\x9BfV]\xA4\xA9\x99\x8BB\xB7*\xF3\x81Z\xB7j\fH\xCF\xD7\xAC\xE0d\x99Js\xB2\xD8\xAD\x1A\x02\xA4\xA9!@U_\xF5\x85\xC2\xCD\x05U\x10\x8A2\xB5\xEA\xADuv\x02\x02Z\x99k\xA5l\x99\xD9\xA6X@WM\\j\xD7\xAF\xBEO\f6\x1Aa\xA6\xC9\xC4@\xE1[uZ\x8E4\xE5\xE6\x92\x8E\xAE\xAA\xB9D!]U\xDF\x8B\x82\xB5\xEAr\x17\xD1\xE4\xCE\x82R]j%\xA2\xCA)\xF5\x89b\x86^\rBg\xAB!\xA4\xA9>\xAAL3W\x90\x07\xA9\xD7\xAA\xE3=\x94\xD55}\x16\x91\xE6\x12Fh\x9B\xDA\x11H\xC1\xD6}W\xADJ\xBDHSC\xCA\xBA\xBFfH\xF7ul\xA5\x03\x88\xA2\xB8\xCA\xF9@\x1Da\xC3\xA2\x9A~u\x15\x1Ci\xEA\xF0q\x9F\xE6\xC2=\xB4L-\x93$A\xAB,\xA3\xD3\x03\xF5A\xB5\x96\x02\x91\x04\xB0\xDA\xF6XiW\x8D\x00\xC6\x06\xEA\xB5\x01\xCD\xBD5\xBCk\xA0^\x1B5\xD1T\xABwcGN\x80\xC9\xFBz\xA4\x1F\xEB\xD2N,m\xAB\xE6\x1A\x15\xDCtZ\xA6\xFC\xD2}\rY\x19n\x93 \xAD:J&\x98KJ2\xCD\xC0Z\xBD\xD2}\x9A\xAC\r@\xD3\xDC\xBC\xC5^\x9Fj\xED\xC0\xE2\x9DF\x98\xAB[@\x9A\xE9\x9B\xC443sI\x9AV\xF5\xD3B\x9A\xBBA\x8F\xB6)\xAF\x94h\xEA\xADQ\xC1\x8D\xF9\xDEI\xEF\xD6\xDD\x9F'\x9A\xAB\xA8 \x9A\xD9ZP\xF1\xD6|\xED\xAC\xC5\xDB\b3z\x1E\xFC\x98\xEE\x1B\xA0r\x1BU]G4U4\x8C\xA6\xB9\xCF\x13#\x035\xD7P\bK-k\x90MW_\x14\x86\x19\xEA\xAD\xA1*\xAF\xB2\r\xEF\xD3\x9A]\x8Fi\xEAC@\xD5/\xF5!\xA0 \x99\xD9\x91I\x04W]\x1D&\x15\xDC>\xC3^\xA3\x16\xF5\xD20jQS\x17\xB3\xF3j\tG\x0F\\}\xF0ty\xB8\xCF4\xA714H\vWUv\xA1\xB0\xAE\xDB\xAA \xD2P\x87Td\xDAC\xADD\x9D\xBD\xFB\x99\xA6^\x1A\xE6\xF9\xD5\x80\x02\xCDhv\rR\xC4UW\xE3X\xF8\xD7\xB8\x1EHS\x9F\x01\xEB\b\x9BM\x14\xC5\x7F\xDD{\x03\x9A\x9A\xB9\b\xEBd\xA9\xF1lm\x9C\x89459(6\xE8\x84\r#\xDB;Hk\xD7U\xBF\"M]\xF0'\x9A\v\x0E\x90\xA6n,\x91J\xAE:\f%\x98JY\xA3~\xAFi\x9F\x8F4%\xCC3H)W-\x1E\xD4pT\x8D\x00\x96\xF5w\x9A\xE6\xC6\x13[g6\xC2\x8C\xD4\f\xC2\\\x80\x8C\xCF\xA9\xAER\xA1&\xB0\xAA'\xDF\xA799\x166M\xBD5\xBC\xBD\xA0h\xD4\xBAG='5\bU\xBB;\xC0T=(\xCA\x02\xAB\\:J\xF9\xBAm\n\xE3\f\xB5x\xE0\xA9\x81zo\x14\x1A\x18\x18\x8A\x03\x9B\xA5\ba*#\xC6R\xC3f)B}`\xF5\xA0\x98\x9A7\xDB\x01\xD2T\x99\x1E\xE9\r\xAB\xF2\x134M\xB9\x92$\x9F\xAB\x82\xDA}\x98,W%\xCB\x94\x12>\xD3\xD4\x15/\x14\xD0Uw\xA5Q\xDBW\x05hDS7!\xD047\xD9:[g\x12LE-\b3{\v>\xA6\xD9DI\xDFW\xD5\x93\x93(\xAF\xAA\t@\xE5a5\x00\xAD\xF7`\x91\xA6\xCEiY\x99W\xCD[8\xCFP1\x10I\xE0\xAA4?\xC1\\or\xA4\xA9R\n\xD4\xC1UU\x01DS\xC7]\xAC\xF7\xDBG\x93\xA5\xC7\xA8\xAB\xAB\x12lHS\xCFI\xF2\xC1j\x91\x04\xCBT\x84L\x1A\xB6\xCE\xF1`Z\xA7m*\xBB\xC6\xA6\x19\x18U\xED(\xCB\xF0\x12l'\xCD\xDD\x05G\xDB\xD4\xE2A\xDA\xB8\xAEA\x1F\xD2\xCC\x92KR\xBB\xCAY@\xCB\xD4\x80bn^}S@s\xDF\x14:\xCC\xAD4\xB7\xB0Q\x02\\]\xDF\xD9\xA7\xC9\x0Elh\x9A\xAA\x94$\x9A\xF2\xFEHu\xF7u\xF3\xE9\xA3\xB9\xC3U\x14\xF1\xED\x83\xD9\x8B\xB0(\xE4\xABfnkq\xCC>\xCDU\x9C\x11K9\xB9(s\xAB\xCA\xAC\xF7i\xB2\xC4\x80LS!\x10k\x16\xAB\x85\xA8\xD3\x99G\x15^u\xAC\x87\xFA\xC0\xEA#\xC0\x8A~5;\xB0\xD0\xA6\x95v1\x81(\xD1\xDC\xF4\xA0N\xA1b\xE6\x16j\xE7\n\xCB\x10f\xD2a\bS\t\x14\xA4\xA9[\xC8Ez\xB7fr \xCC\x84\x06\b3\x05b\b3\x99\xD7\"\xB9[\xB3\xE3!\xACL\x9E\x88i&\xA4E\x9A*\xDB)\xD4\xF55\x97\x90\x99fR\x1EHS\"\xB5\x01M\xCD\x10\xBC\xB7\xAA\xC6\xB4\xB3\x0E\x1Fi&U\x840%JP$\xEE\xAB^\x1A\xA9\xF1\xAAw\xD6Xi\x83\x96\xB9U\x92\xEA\xF9\xFB`\xAF\x1F\x81\xFA\xDC\xA9\xDDN\x1F\xEC\xD54\xF5\xA0\xE42\x9B[\xEALs\xDB;u\xD7o5\xCD\xD1\xB0\x17\xA7zP:\x840\x87qL3M\xAD\x91f\xEE\x03\x15\v\xE8\xAA\x9D\ni\xEA\xB5\xE1U\xE4N\xDA0\x05\x10\x85z\xBCf\x01aq_\xB3!\xA0\xB8o\x1F\xEC\xFFn\x9F\v\x1A\x85\x07j\b(\xD9o\x92\x7FHSyI\xA4\xA9My_\xF4VnV\xA4\xA0k\xEA\xBA\x10\xA6\x1C\x19\x82\x99:\xBD\"\xC9[\xF7\xB1\xB7\xBA\xF3\xFB4\x97N\xE7\xE7T\x96\x913\xAF,\xC3;\xB5j\xA6\x91Lp\xABi&e](\xC6\xAB\x9Cf\xA4\x99\xB3Z\xA09\x19\x01\x84)7\x175o\x8D6\x1E\xD2L/&\x84)\x07\v%\x8C\r\v\vm\xD4\x12I4S\x80\xC24s\xF4\x0E\xB4R\xE7zE\xA2\xB7n\xF5\xA68C9\xA5H\xBB\xA91\xC08C\xCD\\p\x98\xCDi\v\xC2\xD4i(\xD2\x94\xCE;?\xA8yk\xA4{[j\x13\xDD\xA7\x95j\x1A\x8D\xA6\xA9b\n\xA6\x99\xC2\xF9\"\xE9[7u\x89\xA6\\I\x82\x99\xA3=\x84\xA943i\xDF\xAA\x8B2Hs'AHS\x07\x11\xF8\xA4*B&\xED[i\x1B\xF9\xF3}0\xE9\x823L}\x07P\x06dZ\xCE\x03L&\x9A\xC925\x00\x14\x03)\xAF\b5~\xD5FE4S\xB1\x800\xD5\x1A\x1Bh\xA5\xDC\\T\xF8U\xE9R\xD4\xD1U\xB3\x03\xAF\x1B\xF4\xD1\xE4\xBC\xA5l\xFAU\xAD\x1C\x18i\xA8\xC9\x81\x91F\xE7\x93\xD6I\xD1\xC8\x03w\x9F\x01\xF5\xDBic\xC9\xB4\x1F\x19\xE6\x9C\x18\xBC\x1E\xA0L\x83\xB2\x1D\xB7\xE5\x91\xE4V'L)\x1D\x16*\xFC\x1A\xD3\b\xA6\xA2m\x82\x19\xF5.~LgZk\x92\x9Fut\xCDvLz\xC1\xEA\x03E\xD3T9\v\t\xDF\xBA\xBC\x02\x8A\xF2\xBAAhT\x03C\xD3\x9E\xEA\v\xA5\xFB\x01\x8D,U\xEB\x84\x8A\xBC\xEA8\x1Aijn\xE0U\x03\xF5\xA0X\xB3cvc\xB4M\xE5K\x91\xA6N\bQ\xF7\xD6h\t2M}S\x04\xBB\xABU\x92\xEA\x93L\xE4\x8E\"\xBA*4@\x9A\xE9\xE6\x814uy\x18h\xE5\x0E!H\xF6\xD6e\xD7\x90\xA6F\x14\xCB\x9D\xD4W\x85\x0Fj`\x9D=r\x80&\xD3'(\xC8\xAB\xF2'DS!2)\xE8\xAA\xE1\xC4\n \xF5\xB97J\x1B LU\xE9\xA1~\xAE\x99\x1B(\xED\xABrNH3\x17\xCB\xF9A\xD5\x1EJ\x9A\xB7\xEA\xB2\x18\xD2\x94j\"\xD3\x94\xCB\xB6OSB\xA4\x85\xDA\xBE\xA6\x9F\n\xD3\xD4\xBA\x864\xB5\xB7\xB0\x8A\xB1\xFAH1\x9B\xAE\xBE\x04\x14\xE4m\x84\x99\xF6\xB6\bS\x05(\xA4\xA0\xEBf\x07\xDD\xF6U\x1F(\x06.\xAD4\xD3\n\xA8P\xDEWedP\x91\xF7\xA9F\x14\x03\x17\xF5\xDE0\xD600j\xED\xA9\xDE\x1A6\xE3T\x9F;\x06\x07j\t\xA7\xC0E9\xCD$\xA2\xEBVI\xBCp\xD0\bS\xF1\x19\xC9\xD4\xAA\xEB@\x04S\x8E)\n\xE8\xBA\x97\x86\xB1\x81\xDAZ(\x07\xAE\xBCf\xA6\xA9\x89K\xCD8[MS_h\xA7\xE4-\xC2\xDCm\x94}\x9AS\x13D\xD3T13)\xDE\xBAM\x94\xA4}\x95\xB7\x80\xA6\xA9T\"\n\x05\xBB\xB9\x86n\xAEY>\x90\xA6R\xB0(\xC8k\x9AP\x17)\xD5\xAAs\b\x12\xD1U\xC5S\x04S\xE9~\x82\x95\xFB\xAA(\xA7\xAEL\xEB\xD3\xF0b\xC3T\xD6\x9Ah\xAA\xFE\x81Do]u:\xD1n\xEA\xAD\xA1\x1E\x98\xF1K\x91\x96'=\xEAH\xDBT\xFC\xCE\x10%\x1C\\d\xE5=w\x11\x95{\xCAu\xC4\xBD.^~\x98\x95\xD7\xBB\"\xABr\x7F\xAF\x8Em}\xE5\x005\x8Ey\xB0\x8E\xA8\xFCd\x05Q\xF9\x9D\xE3:\xD2\xD6&\xAC\xC2\x9E\xD5}f\xE5\x99iF\x89\xD9\x00\xBB\x90xW\xB0k\x98/\x07S@b\x8E\xC2\x03\xE69\xB8\xD7-y\xFF\t\xC5\xCB\xC2]\xB1\x0F\x95\xFB\x85\xC02^a\x1D)\xB1bV?\xCAF\x89\xB7\x05\xA8\xBC\xC6\x02PF^\xB0\x8E\x94\xEA\xC9e\x96\x98\x95;\xD0\xC8\x12\xA7\xDD\xC8\xCAK\xAE\xEB\x88\xAA\xEFb}\xA0\xA3\xE9\xD4\xC8o\x83\x060\xE3J\x10\xECn\"<\xEC)g\xC22,\x01\xEDc\x19\xA7\x9E\xBAY\x98G\x04\xA7\xD7\xAC\x14m\xDA\x94\xCC\x12W\x97\x03\x98\xF1\x99\xB0WD~\x9B4\x80\xE5\xE7c\x043\xB9\xF7\xD7\x7F\xDB\x82=B\xE5\xA9Pf\xE5\xC7(oW\\\xF6?\xEE\xFC\xAC\x99a\xC6e\xC5>\ff\x1C\xE9\x98\xD9|\x93PLiV\x1Dl\xB6l\xDE\x17*\xC4\x98\xD9\x8A\xF5\xA7fV\xA0\x17l\x86\x92\xBC\xF3>\xBB\xC4\x99\x1F\xC3\xF2\x96\x15oR}}\xDF$v\x850)9\xB4\xCC$0\xC9\xB0\xBCf\xE6-+\x05\xFB\x91\xD8B\b\xD6g\x98\x9A\xAFd\x96Y\xC5\xB0G\x82\xD9r\xB1E\x82\xC9\xDB\xA3\x7Fn^>\xC0\xAE\xE6\xED\x83\xE7j\xB2W\xD4\xB7\xC18\x03h\x97\xF9\xBC\xE9$\xC0\xAC;$\xDD\xD2\xC62\xCD\x1B\x99eR2\xD8\xB1!?\xF9}\x1Bt\xF0\x06\xCCS\x92\xD6{\xA7ay\xE3F\x86\xA97F\xB9\xE9FV^\x1D\xC6\xACF\x94\xD0\xE3xk\xD9\xD4\x17Nr\xD7\x07s.\x8A\xAA\xECf\x8A\xB5i\xD2\xBC\xA5\xE2\xC0{2\xEF\x9FZ4\x98\x89\x01a\x88\xDA\x8E:\xBD}\xEA\\\xE0&\x19&\xBD;a&\xF9\x84\r\x1AL6\x05\x1B\x17\x98\xFA\x15\x82\xE5\x9D\x97\x02\xC3\xCC\xF4\xC7\x86\n&)\x89\xB0\\\xFD\x81a\xEA\xA8\x00{3\x88)\x8B\xCD\x14\x8C\xCF\x8F0\xB3\xC8R+\x05\xF3\xC2\xA8\xC9\xB4a\xA1\x98\xA1y\xFBTYi&?\x16V6\x1A\xE6\xA6\x05\xD6B\x9A\xC7\xA4\xEC\xB7\x88\xB8\x88e\x0EW\xB0\x83\x82\x99c\xD8'\xB9\x13&BAd\x19G\x1Da\x86\x85\xBD\xCB\xCC\x14\xA3\x86\xCB\xE6C\"\xC3L1\x03\xC2\xCCP\x82C\xAC\x1E\x92\x9C\xEB\xBC\xD89\x81\x99\xAF\x12`\x0F3\xC7\xB0\x9B\x9Aye\xD4\xB3\xCC\xBC1b\x19G\x91\xEE~\x99\x97O\x19k\xE3\x8D\x917\xAC^>\x9E\x174\xC2\xD4y?v$0g\xF4\b3e \xD8\xDD@\xAC=t\xE3\xDF\x84I\xDC\xD9\xC0\xBC1*)\x11\x8B56p0\x85\xBC\x94f6\x95\xBC\xD4\xA2\xAC\x8D5\x8Eb\xB1 \x94\xF1\x9F\xE8\x96\xBF))\xE5\xCE\b\xE6!\tf