From 4f81f186af5bb8392700636c82e8741271bd705c Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Thu, 1 Apr 2021 19:31:02 -0700 Subject: [PATCH] embed mode and reworked web build system (#592) * root element id from Settings, respect element size * Plumb assets root via settings * adapt crates to new wasm api * more FileLoader cleanup * use tsc bin from node_modules * avoid spurious unlink errors GNU Make considers the src/*/wasm_pkg targets as intermediate build files and attempted to `rm` them. We can stop that my marking them as `.PRECIOUS` https://www.gnu.org/software/make/manual/html_node/Special-Targets.html * `open` doesn't work on Linux We could do something with xdg-open, but meh, not worth having platform dependent logic for this. * fix typo, clarify instructions * make server compatible with older python install on linux * revert change - we dont want to include music on web the leading "-" means exclude a subdir of an included dir. * better wrap of comments * fix misfire in copy/pasted comment * update docs --- abstio/src/io_web.rs | 5 + fifteen_min/index.html | 142 ------- fifteen_min/pkg/index.html | 1 - fifteen_min/pkg/system | 1 - fifteen_min/run_web.sh | 6 - fifteen_min/src/lib.rs | 32 +- game/index.html | 142 ------- game/pkg/favicon.ico | 1 - game/pkg/index.html | 1 - game/pkg/prefetch.html | 1 - game/pkg/system | 1 - game/run_web.sh | 6 - game/src/lib.rs | 32 +- map_gui/src/load.rs | 88 ++--- osm_viewer/index.html | 142 ------- osm_viewer/pkg/index.html | 1 - osm_viewer/pkg/system | 1 - osm_viewer/run_web.sh | 6 - osm_viewer/src/lib.rs | 33 +- release/deploy_web.sh | 23 +- santa/index.html | 142 ------- santa/pkg/index.html | 1 - santa/pkg/system | 1 - santa/run_web.sh | 6 - santa/src/lib.rs | 51 ++- web/.gitignore | 2 + web/Makefile | 117 ++++++ web/README.md | 42 ++ web/bin/build-wasm | 36 ++ web/bin/bundle-widgetry-js | 6 + web/package-lock.json | 55 +++ web/package.json | 12 + web/src/abstreet/abstreet.ts | 20 + web/src/fifteen_min/fifteen_min.ts | 20 + web/src/osm_viewer/osm_viewer.ts | 20 + web/src/santa/santa.ts | 20 + web/src/web_root/abstreet.css | 15 + web/src/web_root/abstreet.html | 23 ++ .../blog_root/2021/03/31/example-post.html | 167 ++++++++ .../blog_root/static_assets/snow_bike.jpg | Bin 0 -> 169911 bytes web/src/web_root/fifteen_min.html | 22 ++ web/src/web_root/index.html | 20 + web/src/web_root/osm_viewer.html | 23 ++ web/src/web_root/santa.html | 24 ++ web/src/web_root/widgetry_demo.html | 21 + web/src/widgetry.ts | 363 ++++++++++++++++++ web/src/widgetry_demo/widgetry_demo.ts | 20 + widgetry/src/assets.rs | 19 +- widgetry/src/backend_glow_native.rs | 6 +- widgetry/src/backend_glow_wasm.rs | 50 ++- widgetry/src/drawing.rs | 8 + widgetry/src/runner.rs | 35 +- widgetry_demo/index.html | 142 ------- widgetry_demo/pkg/index.html | 1 - widgetry_demo/run_web.sh | 6 - widgetry_demo/src/lib.rs | 39 +- 56 files changed, 1299 insertions(+), 921 deletions(-) delete mode 100644 fifteen_min/index.html delete mode 120000 fifteen_min/pkg/index.html delete mode 120000 fifteen_min/pkg/system delete mode 100755 fifteen_min/run_web.sh delete mode 100644 game/index.html delete mode 120000 game/pkg/favicon.ico delete mode 120000 game/pkg/index.html delete mode 120000 game/pkg/prefetch.html delete mode 120000 game/pkg/system delete mode 100755 game/run_web.sh delete mode 100644 osm_viewer/index.html delete mode 120000 osm_viewer/pkg/index.html delete mode 120000 osm_viewer/pkg/system delete mode 100755 osm_viewer/run_web.sh delete mode 100644 santa/index.html delete mode 120000 santa/pkg/index.html delete mode 120000 santa/pkg/system delete mode 100755 santa/run_web.sh create mode 100644 web/.gitignore create mode 100644 web/Makefile create mode 100644 web/README.md create mode 100755 web/bin/build-wasm create mode 100755 web/bin/bundle-widgetry-js create mode 100644 web/package-lock.json create mode 100644 web/package.json create mode 100644 web/src/abstreet/abstreet.ts create mode 100644 web/src/fifteen_min/fifteen_min.ts create mode 100644 web/src/osm_viewer/osm_viewer.ts create mode 100644 web/src/santa/santa.ts create mode 100644 web/src/web_root/abstreet.css create mode 100644 web/src/web_root/abstreet.html create mode 100644 web/src/web_root/blog_root/2021/03/31/example-post.html create mode 100644 web/src/web_root/blog_root/static_assets/snow_bike.jpg create mode 100644 web/src/web_root/fifteen_min.html create mode 100644 web/src/web_root/index.html create mode 100644 web/src/web_root/osm_viewer.html create mode 100644 web/src/web_root/santa.html create mode 100644 web/src/web_root/widgetry_demo.html create mode 100644 web/src/widgetry.ts create mode 100644 web/src/widgetry_demo/widgetry_demo.ts delete mode 100644 widgetry_demo/index.html delete mode 120000 widgetry_demo/pkg/index.html delete mode 100755 widgetry_demo/run_web.sh diff --git a/abstio/src/io_web.rs b/abstio/src/io_web.rs index a851a7bce8..a1f4307e24 100644 --- a/abstio/src/io_web.rs +++ b/abstio/src/io_web.rs @@ -71,6 +71,11 @@ pub fn list_dir(dir: String) -> Vec { pub fn slurp_file>(path: I) -> Result> { let path = path.as_ref(); + debug!( + "slurping file: {}, trimmed_path: {}", + path, + path.trim_start_matches("../data/system/") + ); if let Some(raw) = SYSTEM_DATA.get_file(path.trim_start_matches("../data/system/")) { Ok(raw.contents().to_vec()) diff --git a/fifteen_min/index.html b/fifteen_min/index.html deleted file mode 100644 index 04dd1f1ed4..0000000000 --- a/fifteen_min/index.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - - - - -
-

15-minute Neighborhood Explorer

- - -
- - diff --git a/fifteen_min/pkg/index.html b/fifteen_min/pkg/index.html deleted file mode 120000 index 79c5d6f02c..0000000000 --- a/fifteen_min/pkg/index.html +++ /dev/null @@ -1 +0,0 @@ -../index.html \ No newline at end of file diff --git a/fifteen_min/pkg/system b/fifteen_min/pkg/system deleted file mode 120000 index 43efaaa57a..0000000000 --- a/fifteen_min/pkg/system +++ /dev/null @@ -1 +0,0 @@ -../../data/system/ \ No newline at end of file diff --git a/fifteen_min/run_web.sh b/fifteen_min/run_web.sh deleted file mode 100755 index 01f1f62d1c..0000000000 --- a/fifteen_min/run_web.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash - -set -e -wasm-pack build --dev --target web -- --no-default-features --features wasm -cd pkg -python3 -m http.server 8000 diff --git a/fifteen_min/src/lib.rs b/fifteen_min/src/lib.rs index 6e49afd732..0cdfb66ff8 100644 --- a/fifteen_min/src/lib.rs +++ b/fifteen_min/src/lib.rs @@ -1,3 +1,5 @@ +use widgetry::Settings; + #[macro_use] extern crate log; @@ -8,21 +10,29 @@ mod viewer; type App = map_gui::SimpleApp<()>; pub fn main() { - widgetry::run( - widgetry::Settings::new("15-minute neighborhoods").read_svg(Box::new(abstio::slurp_bytes)), - |ctx| { - map_gui::SimpleApp::new(ctx, map_gui::options::Options::default(), (), |ctx, app| { - vec![viewer::Viewer::random_start(ctx, app)] - }) - }, - ); + let settings = Settings::new("15-minute neighborhoods"); + run(settings); +} + +fn run(mut settings: Settings) { + settings = settings.read_svg(Box::new(abstio::slurp_bytes)); + widgetry::run(settings, |ctx| { + map_gui::SimpleApp::new(ctx, map_gui::options::Options::default(), (), |ctx, app| { + vec![viewer::Viewer::random_start(ctx, app)] + }) + }); } #[cfg(target_arch = "wasm32")] use wasm_bindgen::prelude::*; #[cfg(target_arch = "wasm32")] -#[wasm_bindgen(start)] -pub fn run() { - main(); +#[wasm_bindgen(js_name = "run")] +pub fn run_wasm(root_dom_id: String, assets_base_url: String, assets_are_gzipped: bool) { + let settings = Settings::new("15-minute neighborhoods") + .root_dom_element_id(root_dom_id) + .assets_base_url(assets_base_url) + .assets_are_gzipped(assets_are_gzipped); + + run(settings); } diff --git a/game/index.html b/game/index.html deleted file mode 100644 index 706949c3ee..0000000000 --- a/game/index.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - - - - -
-

A/B Street

- - -
- - diff --git a/game/pkg/favicon.ico b/game/pkg/favicon.ico deleted file mode 120000 index b4ea1f728c..0000000000 --- a/game/pkg/favicon.ico +++ /dev/null @@ -1 +0,0 @@ -../../data/system/assets/pregame/favicon.ico \ No newline at end of file diff --git a/game/pkg/index.html b/game/pkg/index.html deleted file mode 120000 index 79c5d6f02c..0000000000 --- a/game/pkg/index.html +++ /dev/null @@ -1 +0,0 @@ -../index.html \ No newline at end of file diff --git a/game/pkg/prefetch.html b/game/pkg/prefetch.html deleted file mode 120000 index 880f119524..0000000000 --- a/game/pkg/prefetch.html +++ /dev/null @@ -1 +0,0 @@ -../prefetch.html \ No newline at end of file diff --git a/game/pkg/system b/game/pkg/system deleted file mode 120000 index 43efaaa57a..0000000000 --- a/game/pkg/system +++ /dev/null @@ -1 +0,0 @@ -../../data/system/ \ No newline at end of file diff --git a/game/run_web.sh b/game/run_web.sh deleted file mode 100755 index 01f1f62d1c..0000000000 --- a/game/run_web.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash - -set -e -wasm-pack build --dev --target web -- --no-default-features --features wasm -cd pkg -python3 -m http.server 8000 diff --git a/game/src/lib.rs b/game/src/lib.rs index aa103de060..76dfe52cb0 100644 --- a/game/src/lib.rs +++ b/game/src/lib.rs @@ -10,7 +10,7 @@ use map_gui::options::Options; use map_gui::tools::URLManager; use map_model::Map; use sim::{Sim, SimFlags}; -use widgetry::{EventCtx, State, Transition}; +use widgetry::{EventCtx, Settings, State, Transition}; use crate::app::{App, Flags}; use crate::common::jump_to_time_upon_startup; @@ -29,6 +29,18 @@ mod pregame; mod sandbox; pub fn main() { + let settings = Settings::new("A/B Street"); + run(settings); +} + +fn run(mut settings: Settings) { + settings = settings + .read_svg(Box::new(abstio::slurp_bytes)) + .window_icon(abstio::path("system/assets/pregame/icon.png")) + .loading_tips(map_gui::tools::loading_tips()) + // This is approximately how much the 3 top panels in sandbox mode require. + .require_minimum_width(1500.0); + let mut args = CmdArgs::new(); if args.enabled("--prebake") { challenges::prebake::prebake_all(); @@ -42,12 +54,7 @@ pub fn main() { let mut opts = Options::default(); opts.toggle_day_night_colors = true; opts.update_from_args(&mut args); - let mut settings = widgetry::Settings::new("A/B Street") - .read_svg(Box::new(abstio::slurp_bytes)) - .window_icon(abstio::path("system/assets/pregame/icon.png")) - .loading_tips(map_gui::tools::loading_tips()) - // This is approximately how much the 3 top panels in sandbox mode require. - .require_minimum_width(1500.0); + if args.enabled("--dump_raw_events") { settings = settings.dump_raw_events(); } @@ -329,7 +336,12 @@ fn finish_app_setup( use wasm_bindgen::prelude::*; #[cfg(target_arch = "wasm32")] -#[wasm_bindgen(start)] -pub fn run() { - main(); +#[wasm_bindgen(js_name = "run")] +pub fn run_wasm(root_dom_id: String, assets_base_url: String, assets_are_gzipped: bool) { + let settings = Settings::new("A/B Street") + .root_dom_element_id(root_dom_id) + .assets_base_url(assets_base_url) + .assets_are_gzipped(assets_are_gzipped); + + run(settings); } diff --git a/map_gui/src/load.rs b/map_gui/src/load.rs index 98793aeb89..030b71c128 100644 --- a/map_gui/src/load.rs +++ b/map_gui/src/load.rs @@ -106,7 +106,7 @@ impl State for MapAlreadyLoaded { mod native_loader { use super::*; - // This loads a JSON or bincoded file, then deserializes it + /// Loads a JSON or bincoded file, then deserializes it pub struct FileLoader { path: String, // Wrapped in an Option just to make calling from event() work. Technically this is unsafe @@ -142,7 +142,9 @@ mod native_loader { } } - // TODO Ideally merge with FileLoader + /// Loads a file without deserializing it. + /// + /// TODO Ideally merge with FileLoader pub struct RawFileLoader { path: String, // Wrapped in an Option just to make calling from event() work. Technically this is unsafe @@ -191,9 +193,11 @@ mod wasm_loader { use super::*; - // Instead of blockingly reading a file within ctx.loading_screen, on the web have to - // asynchronously make an HTTP request and keep "polling" for completion in a way that's - // compatible with winit's event loop. + /// Loads a JSON or bincoded file, then deserializes it + /// + /// Instead of blockingly reading a file within ctx.loading_screen, on the web have to + /// asynchronously make an HTTP request and keep "polling" for completion in a way that's + /// compatible with winit's event loop. pub struct FileLoader { response: oneshot::Receiver>>, on_load: @@ -209,22 +213,18 @@ mod wasm_loader { path: String, on_load: Box) -> Transition>, ) -> Box> { - // The current URL is of the index.html page. We can find the data directory relative - // to that. - let base_url = get_base_url().unwrap(); - let file_path = path.strip_prefix(&abstio::path("")).unwrap(); + let base_url = ctx + .prerender + .assets_base_url() + .expect("assets_base_url must be specified for wasm builds via `Settings`"); + // Note that files are gzipped on S3 and other deployments. When running locally, we // just symlink the data/ directory, where files aren't compressed. - let url = - if base_url.contains("http://0.0.0.0") || base_url.contains("http://localhost") { - format!("{}/{}", base_url, file_path) - } else if base_url.contains("abstreet.s3-website") { - // The directory structure on S3 is a little weird -- the base directory has - // data/ alongside game/, fifteen_min/, etc. - format!("{}/../data/{}.gz", base_url, file_path) - } else { - format!("{}/{}.gz", base_url, file_path) - }; + let url = if ctx.prerender.assets_are_gzipped() { + format!("{}/{}.gz", base_url, path) + } else { + format!("{}/{}", base_url, path) + }; // Make the HTTP request nonblockingly. When the response is received, send it through // the channel. @@ -312,8 +312,10 @@ mod wasm_loader { } } - // TODO This is a horrible copy of FileLoader. Make the serde FileLoader just build on top of - // this one!!! + /// This loads a file without deserializing it. + /// + /// TODO This is a horrible copy of FileLoader. Make the serde FileLoader just build on top of + /// this one!!! pub struct RawFileLoader { response: oneshot::Receiver>>, on_load: Option>) -> Transition>>, @@ -328,22 +330,18 @@ mod wasm_loader { path: String, on_load: Box>) -> Transition>, ) -> Box> { - // The current URL is of the index.html page. We can find the data directory relative - // to that. - let base_url = get_base_url().unwrap(); - let file_path = path.strip_prefix(&abstio::path("")).unwrap(); + let base_url = ctx + .prerender + .assets_base_url() + .expect("assets_base_url must be specified for wasm builds via `Settings`"); + // Note that files are gzipped on S3 and other deployments. When running locally, we // just symlink the data/ directory, where files aren't compressed. - let url = - if base_url.contains("http://0.0.0.0") || base_url.contains("http://localhost") { - format!("{}/{}", base_url, file_path) - } else if base_url.contains("abstreet.s3-website") { - // The directory structure on S3 is a little weird -- the base directory has - // data/ alongside game/, fifteen_min/, etc. - format!("{}/../data/{}.gz", base_url, file_path) - } else { - format!("{}/{}.gz", base_url, file_path) - }; + let url = if ctx.prerender.assets_are_gzipped() { + format!("{}/{}.gz", base_url, path) + } else { + format!("{}/{}", base_url, path) + }; // Make the HTTP request nonblockingly. When the response is received, send it through // the channel. @@ -424,26 +422,6 @@ mod wasm_loader { self.panel.draw(g); } } - - /// Returns the base URL where the game is running, excluding query parameters and the - /// implicit index.html that might be there. - fn get_base_url() -> Result { - let window = web_sys::window().ok_or(anyhow!("no window?"))?; - let url = window.location().href().map_err(|err| { - anyhow!(err - .as_string() - .unwrap_or("window.location.href failed".to_string())) - })?; - // Consider using a proper url parsing crate. This works fine for now, though. - let url = url.split("?").next().ok_or(anyhow!("empty URL?"))?; - Ok(url - .trim_end_matches("index.html") - // TODO This is brittle; we should strip off the trailing filename no matter what it - // is. - .trim_end_matches("prefetch.html") - .trim_end_matches("/") - .to_string()) - } } pub struct FutureLoader diff --git a/osm_viewer/index.html b/osm_viewer/index.html deleted file mode 100644 index 648c99e5ad..0000000000 --- a/osm_viewer/index.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - - - - -
-

OpenStreetMap Viewer

- - -
- - diff --git a/osm_viewer/pkg/index.html b/osm_viewer/pkg/index.html deleted file mode 120000 index 79c5d6f02c..0000000000 --- a/osm_viewer/pkg/index.html +++ /dev/null @@ -1 +0,0 @@ -../index.html \ No newline at end of file diff --git a/osm_viewer/pkg/system b/osm_viewer/pkg/system deleted file mode 120000 index 43efaaa57a..0000000000 --- a/osm_viewer/pkg/system +++ /dev/null @@ -1 +0,0 @@ -../../data/system/ \ No newline at end of file diff --git a/osm_viewer/run_web.sh b/osm_viewer/run_web.sh deleted file mode 100755 index 01f1f62d1c..0000000000 --- a/osm_viewer/run_web.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash - -set -e -wasm-pack build --dev --target web -- --no-default-features --features wasm -cd pkg -python3 -m http.server 8000 diff --git a/osm_viewer/src/lib.rs b/osm_viewer/src/lib.rs index 9c162ba61e..114f31827d 100644 --- a/osm_viewer/src/lib.rs +++ b/osm_viewer/src/lib.rs @@ -3,22 +3,33 @@ extern crate log; mod viewer; +use widgetry::Settings; + pub fn main() { - widgetry::run( - widgetry::Settings::new("OpenStreetMap viewer").read_svg(Box::new(abstio::slurp_bytes)), - |ctx| { - map_gui::SimpleApp::new(ctx, map_gui::options::Options::default(), (), |ctx, app| { - vec![viewer::Viewer::new(ctx, app)] - }) - }, - ); + let settings = Settings::new("OpenStreetMap viewer").read_svg(Box::new(abstio::slurp_bytes)); + run(settings) +} + +pub fn run(mut settings: Settings) { + settings = settings.read_svg(Box::new(abstio::slurp_bytes)); + + widgetry::run(settings, |ctx| { + map_gui::SimpleApp::new(ctx, map_gui::options::Options::default(), (), |ctx, app| { + vec![viewer::Viewer::new(ctx, app)] + }) + }); } #[cfg(target_arch = "wasm32")] use wasm_bindgen::prelude::*; #[cfg(target_arch = "wasm32")] -#[wasm_bindgen(start)] -pub fn run() { - main(); +#[wasm_bindgen(js_name = "run")] +pub fn run_wasm(root_dom_id: String, assets_base_url: String, assets_are_gzipped: bool) { + let settings = Settings::new("OpenStreetMap viewer") + .root_dom_element_id(root_dom_id) + .assets_base_url(assets_base_url) + .assets_are_gzipped(assets_are_gzipped); + + run(settings); } diff --git a/release/deploy_web.sh b/release/deploy_web.sh index 89db30116f..0a839263f6 100755 --- a/release/deploy_web.sh +++ b/release/deploy_web.sh @@ -1,30 +1,25 @@ #!/bin/bash +set -x VERSION=dev +# S3_ROOT=s3://mjk_asdf/abstreet +S3_ROOT=s3://abstreet set -e -# The parking mapper doesn't work on WASM yet, so don't include it -for tool in game santa fifteen_min osm_viewer; do - cd $tool - wasm-pack build --release --target web -- --no-default-features --features wasm - cd pkg - # Temporarily remove the symlink to the data directory; it's uploaded separately by the updater tool - rm -f system - aws s3 sync . s3://abstreet/$VERSION/$tool - # Undo that symlink hiding - git checkout system - cd ../.. -done +cd web; +make release +aws s3 sync build/dist/ $S3_ROOT/$VERSION/ # Set the content type for .wasm files, to speed up how browsers load them aws s3 cp \ - s3://abstreet/$VERSION \ - s3://abstreet/$VERSION \ + $S3_ROOT/$VERSION \ + $S3_ROOT/$VERSION \ --exclude '*' \ --include '*.wasm' \ --no-guess-mime-type \ --content-type="application/wasm" \ --metadata-directive="REPLACE" \ --recursive + echo "Have the appropriate amount of fun: http://abstreet.s3-website.us-east-2.amazonaws.com/$VERSION" diff --git a/santa/index.html b/santa/index.html deleted file mode 100644 index 3ea211fef8..0000000000 --- a/santa/index.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - - - - -
-

15-minute Santa

- - -
- - diff --git a/santa/pkg/index.html b/santa/pkg/index.html deleted file mode 120000 index 79c5d6f02c..0000000000 --- a/santa/pkg/index.html +++ /dev/null @@ -1 +0,0 @@ -../index.html \ No newline at end of file diff --git a/santa/pkg/system b/santa/pkg/system deleted file mode 120000 index 43efaaa57a..0000000000 --- a/santa/pkg/system +++ /dev/null @@ -1 +0,0 @@ -../../data/system/ \ No newline at end of file diff --git a/santa/run_web.sh b/santa/run_web.sh deleted file mode 100755 index 01f1f62d1c..0000000000 --- a/santa/run_web.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash - -set -e -wasm-pack build --dev --target web -- --no-default-features --features wasm -cd pkg -python3 -m http.server 8000 diff --git a/santa/src/lib.rs b/santa/src/lib.rs index 669a684db2..0f5181fdb8 100644 --- a/santa/src/lib.rs +++ b/santa/src/lib.rs @@ -3,6 +3,8 @@ extern crate anyhow; #[macro_use] extern crate log; +use widgetry::Settings; + mod after_level; mod animation; mod before_level; @@ -21,33 +23,40 @@ type App = map_gui::SimpleApp; type Transition = widgetry::Transition; pub fn main() { - widgetry::run( - widgetry::Settings::new("15-minute Santa").read_svg(Box::new(abstio::slurp_bytes)), - |ctx| { - let mut opts = map_gui::options::Options::default(); - opts.color_scheme = map_gui::colors::ColorSchemeChoice::NightMode; - let session = session::Session::load(); - session.save(); + let settings = Settings::new("15-minute Santa"); + run(settings); +} - map_gui::SimpleApp::new(ctx, opts, session, |ctx, app| { - if app.opts.dev { - app.session.unlock_all(); - } - app.session.music = - music::Music::start(ctx, app.session.play_music, "jingle_bells"); - app.session.music.specify_volume(music::OUT_OF_GAME); +fn run(mut settings: Settings) { + settings = settings.read_svg(Box::new(abstio::slurp_bytes)); + widgetry::run(settings, |ctx| { + let mut opts = map_gui::options::Options::default(); + opts.color_scheme = map_gui::colors::ColorSchemeChoice::NightMode; + let session = session::Session::load(); + session.save(); - vec![title::TitleScreen::new(ctx, app)] - }) - }, - ); + map_gui::SimpleApp::new(ctx, opts, session, |ctx, app| { + if app.opts.dev { + app.session.unlock_all(); + } + app.session.music = music::Music::start(ctx, app.session.play_music, "jingle_bells"); + app.session.music.specify_volume(music::OUT_OF_GAME); + + vec![title::TitleScreen::new(ctx, app)] + }) + }); } #[cfg(target_arch = "wasm32")] use wasm_bindgen::prelude::*; #[cfg(target_arch = "wasm32")] -#[wasm_bindgen(start)] -pub fn run() { - main(); +#[wasm_bindgen(js_name = "run")] +pub fn run_wasm(root_dom_id: String, assets_base_url: String, assets_are_gzipped: bool) { + let settings = Settings::new("15-minute Santa") + .root_dom_element_id(root_dom_id) + .assets_base_url(assets_base_url) + .assets_are_gzipped(assets_are_gzipped); + + run(settings); } diff --git a/web/.gitignore b/web/.gitignore new file mode 100644 index 0000000000..dd87e2d73f --- /dev/null +++ b/web/.gitignore @@ -0,0 +1,2 @@ +node_modules +build diff --git a/web/Makefile b/web/Makefile new file mode 100644 index 0000000000..ec025e43b2 --- /dev/null +++ b/web/Makefile @@ -0,0 +1,117 @@ +DEFAULT: dev + +SERVER_PORT=8000 +REPO_ROOT:=$(shell git rev-parse --show-toplevel) + +## +# Section: Tasks (Phony targets) +## + +APPS=abstreet fifteen_min osm_viewer santa widgetry_demo + +.PHONY: server clean dev release $(APPS) +.PRECIOUS: src/%/wasm_pkg + +TSC=npx tsc --lib dom,es2020 --module es2020 --target es6 --strict --noEmitOnError --outDir build + +server: + cd build/dist && python3 -m http.server $(SERVER_PORT) + +clean: + rm -fr build + rm -fr src/*/wasm_pkg + +# Build all of our apps +build: $(APPS) build/dist/index.html + +# Build all of our apps for distribution (optimized) +release: export WASM_PACK_FLAGS=--release +# note: `clean` is because we don't know if any cached wasm files were optimized +# Once you've compiled the optimized wasm this way, you can skip `clean` and just run `make build`, since the remaining output is identical for dev vs release +release: clean build + +dev: export WASM_PACK_FLAGS=--dev +dev: build build/dist/data + +# Symlink in data for dev builds +build/dist/data: + ln -sf ../../../data build/dist/data + +## +# Section: Shared Deps and Templates +## + +build/dist/%.html: src/web_root/*.html + # just copy everything... we could do something more nuanced + cp -r src/web_root/* build/dist + +# Produce the wasm package via our wasm-pack script +# To skip optimization: +# WASM_PACK_FLAGS="--dev" make +src/%/wasm_pkg: + bin/build-wasm $* + +# simply copies over the wasm pkg we +# built to be able to compile our typescript +build/dist/%/wasm_pkg: src/%/wasm_pkg + mkdir -p $(dir $@) + cp -r "${<}" "${@}" + +# Concatenate the target crate's js file with the generic widgetry loading +# code. +# +# Alternatives and their downsides would be: +# 1. import outside of pkg root +# - pkg is less portable +# 2. copy widgetry.js file into each package and update import path on build +# - not really any less hacky, since we're still transforming at build +# - an extra request for the client +# 3. use proper bundler like webpack and system.js: +# - They're all complex - conceptually and dependency-wise +# - We can't use AMD modules because it doesn't support `import.meta` +build/dist/%.bundle.js: build/widgetry.js build/%.js + mkdir -p $(dir $@) + bin/bundle-widgetry-js $^ > $@ + +build/%.js: src/%.ts + $(TSC) $^ + +## +# Section: Apps +## + +## A/BStreet + +abstreet: build/dist/abstreet/wasm_pkg build/dist/abstreet/abstreet.bundle.js build/dist/abstreet build/dist/abstreet.html + +# Unlike the other crates, we have an explicit rule to give the "game" js a +# more meaningful name +src/abstreet/wasm_pkg: + bin/build-wasm game abstreet + +build/dist/abstreet/abstreet.bundle.js: build/widgetry.js build/abstreet/abstreet.js + +## Fifteen Minute Tool + +fifteen_min: build/dist/fifteen_min/wasm_pkg build/dist/fifteen_min/fifteen_min.bundle.js build/dist/fifteen_min.html + +build/dist/fifteen_min/fifteen_min.bundle.js: build/widgetry.js build/fifteen_min/fifteen_min.js + +## OSM Viewer + +osm_viewer: build/dist/osm_viewer/wasm_pkg build/dist/osm_viewer/osm_viewer.bundle.js build/dist/osm_viewer.html + +build/dist/osm_viewer/osm_viewer.bundle.js: build/widgetry.js build/osm_viewer/osm_viewer.js + +## Widgetry Demo + +widgetry_demo: build/dist/widgetry_demo/wasm_pkg build/dist/widgetry_demo/widgetry_demo.bundle.js build/dist/widgetry_demo.html + +build/dist/widgetry_demo/widgetry_demo.bundle.js: build/widgetry.js build/widgetry_demo/widgetry_demo.js + +## Santa + +santa: build/dist/santa/wasm_pkg build/dist/santa/santa.bundle.js build/dist/santa.html + +build/dist/santa/santa.bundle.js: build/widgetry.js build/santa/santa.js + diff --git a/web/README.md b/web/README.md new file mode 100644 index 0000000000..acf6530b9d --- /dev/null +++ b/web/README.md @@ -0,0 +1,42 @@ +# Web Stuff + +This is a collection of API's and build tools for packaging our various +Widgetry apps as web applications. + +## Goals + +A web developer, who might not know anything about rust or wasm, should be able +to use our packaged javascript libraries on their website with minimal +customization or arcanery. + +Users of their website should be able to interact with the widgetry app without +it feeling weird or having to jump through hoops. + +## Limitations + +### JS feature: `import.meta` + +To allow the application to live at any URL (rather than presupposing it lives +at root, or whatever), we rely on `import.meta` which isn't supported on some +browsers before 2018. See: https://caniuse.com/?search=import.meta + +An alternative would be to require configuration, so the loader knows where to +download it's "*_wasm.bg file". + +### Browser Feature: WebGL + +We prefer WebGL2, but now gracefully fall back to WebGL1. This should cover +all common browsers since late 2014. https://caniuse.com/?search=webgl + +## Examples + +See [`src/web_root/*.js`](examples/) for code examples. + +You can build and see the examples in your webbrowser with: + +``` +// install typescript build dependency +npm install +make build +make server +``` diff --git a/web/bin/build-wasm b/web/bin/build-wasm new file mode 100755 index 0000000000..e75ba556e4 --- /dev/null +++ b/web/bin/build-wasm @@ -0,0 +1,36 @@ +#!/bin/bash +set -euf -o pipefail + +PROJECT_ROOT=$(git rev-parse --show-toplevel) + +BIN_NAME=$0 +function usage { + cat < +Example: + $BIN_NAME widgetry_demo + $BIN_NAME game abstreet +EOS +} + +if [ $# -eq 0 ]; then + usage + exit1 +fi + +CRATE_NAME="${1}" + +shift + +if [ $# -eq 0 ]; then +JS_NAME="${CRATE_NAME}" +else +JS_NAME="${1}" +fi + +# Default to a dev build +WASM_PACK_FLAGS="${WASM_PACK_FLAGS:-"--dev"}" + +cd $PROJECT_ROOT/$CRATE_NAME +wasm-pack build $WASM_PACK_FLAGS --target web --out-dir "${PROJECT_ROOT}/web/src/${JS_NAME}/wasm_pkg" -- --no-default-features --features wasm diff --git a/web/bin/bundle-widgetry-js b/web/bin/bundle-widgetry-js new file mode 100755 index 0000000000..d8b2734045 --- /dev/null +++ b/web/bin/bundle-widgetry-js @@ -0,0 +1,6 @@ +for file in "$@" +do + # concatenate all input files, removing any reference to importing widgetry + # assuming it's one of the input files being concatenated + cat $file | grep -v "from '../widgetry.js'" | grep -v 'from "../widgetry.js"' +done diff --git a/web/package-lock.json b/web/package-lock.json new file mode 100644 index 0000000000..e304066bde --- /dev/null +++ b/web/package-lock.json @@ -0,0 +1,55 @@ +{ + "name": "widgetry-apps", + "version": "0.1.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "widgetry-apps", + "version": "0.1.0", + "devDependencies": { + "prettier": "^2.2.1", + "typescript": "^4.2.3" + } + }, + "node_modules/prettier": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", + "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/typescript": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz", + "integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + } + }, + "dependencies": { + "prettier": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", + "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", + "dev": true + }, + "typescript": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz", + "integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==", + "dev": true + } + } +} diff --git a/web/package.json b/web/package.json new file mode 100644 index 0000000000..038ec87808 --- /dev/null +++ b/web/package.json @@ -0,0 +1,12 @@ +{ + "author": "Michael Kirk { + initializeWasm( + module_or_path?: InitInput | Promise + ): Promise { + return wasm_pkg.default(module_or_path); + } + + run(rootDomId: string, assetsBaseURL: string, assetsAreGzipped: boolean) { + wasm_pkg.run(rootDomId, assetsBaseURL, assetsAreGzipped); + } + + wasmURL(): string { + return modRoot(import.meta.url) + wasm_bg_path; + } +} diff --git a/web/src/fifteen_min/fifteen_min.ts b/web/src/fifteen_min/fifteen_min.ts new file mode 100644 index 0000000000..d49d752ac2 --- /dev/null +++ b/web/src/fifteen_min/fifteen_min.ts @@ -0,0 +1,20 @@ +import * as wasm_pkg from "./wasm_pkg/fifteen_min.js"; +let wasm_bg_path = "wasm_pkg/fifteen_min_bg.wasm"; + +import { InitInput, modRoot, WidgetryApp } from "../widgetry.js"; + +export class FifteenMinute extends WidgetryApp { + initializeWasm( + module_or_path?: InitInput | Promise + ): Promise { + return wasm_pkg.default(module_or_path); + } + + run(rootDomId: string, assetsBaseURL: string, assetsAreGzipped: boolean) { + wasm_pkg.run(rootDomId, assetsBaseURL, assetsAreGzipped); + } + + wasmURL(): string { + return modRoot(import.meta.url) + wasm_bg_path; + } +} diff --git a/web/src/osm_viewer/osm_viewer.ts b/web/src/osm_viewer/osm_viewer.ts new file mode 100644 index 0000000000..54af9e02b0 --- /dev/null +++ b/web/src/osm_viewer/osm_viewer.ts @@ -0,0 +1,20 @@ +import * as wasm_pkg from "./wasm_pkg/osm_viewer.js"; +let wasm_bg_path = "wasm_pkg/osm_viewer_bg.wasm"; + +import { InitInput, modRoot, WidgetryApp } from "../widgetry.js"; + +export class OSMViewer extends WidgetryApp { + initializeWasm( + module_or_path?: InitInput | Promise + ): Promise { + return wasm_pkg.default(module_or_path); + } + + run(rootDomId: string, assetsBaseURL: string, assetsAreGzipped: boolean) { + wasm_pkg.run(rootDomId, assetsBaseURL, assetsAreGzipped); + } + + wasmURL(): string { + return modRoot(import.meta.url) + wasm_bg_path; + } +} diff --git a/web/src/santa/santa.ts b/web/src/santa/santa.ts new file mode 100644 index 0000000000..22a2cb02c6 --- /dev/null +++ b/web/src/santa/santa.ts @@ -0,0 +1,20 @@ +import * as wasm_pkg from "./wasm_pkg/santa.js"; +let wasm_bg_path = "wasm_pkg/santa_bg.wasm"; + +import { InitInput, modRoot, WidgetryApp } from "../widgetry.js"; + +export class Santa extends WidgetryApp { + initializeWasm( + module_or_path?: InitInput | Promise + ): Promise { + return wasm_pkg.default(module_or_path); + } + + run(rootDomId: string, assetsBaseURL: string, assetsAreGzipped: boolean) { + wasm_pkg.run(rootDomId, assetsBaseURL, assetsAreGzipped); + } + + wasmURL(): string { + return modRoot(import.meta.url) + wasm_bg_path; + } +} diff --git a/web/src/web_root/abstreet.css b/web/src/web_root/abstreet.css new file mode 100644 index 0000000000..64f9e420e8 --- /dev/null +++ b/web/src/web_root/abstreet.css @@ -0,0 +1,15 @@ +body { + font-family: Arial; + background: white; + color: #4a4a4a; +} + +.full-screen-widgetry-app { + height: 100%; + width: 100%; +} + +.widgetry-app .preloading { + padding: 16px; + color: white; +} diff --git a/web/src/web_root/abstreet.html b/web/src/web_root/abstreet.html new file mode 100644 index 0000000000..cd0faff88e --- /dev/null +++ b/web/src/web_root/abstreet.html @@ -0,0 +1,23 @@ + + + + + + + + +
+
+

A/B Street

+
+
+ + + diff --git a/web/src/web_root/blog_root/2021/03/31/example-post.html b/web/src/web_root/blog_root/2021/03/31/example-post.html new file mode 100644 index 0000000000..cffae2d2b4 --- /dev/null +++ b/web/src/web_root/blog_root/2021/03/31/example-post.html @@ -0,0 +1,167 @@ + + + + + + + + + + + +
+ +
+

Another Day, Another Post

+ By Jane Jacobs +

+ This page is a bunch of fake content as example of how you might go about + embedding a Widgetry app into a web page, like a blog post. +

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer ornare + tempus est sed placerat. In venenatis faucibus finibus. Vivamus vel + fringilla velit, id sagittis leo. Fusce at ligula vitae risus rutrum + blandit. Aenean non leo ligula. Orci varius natoque penatibus et magnis dis + parturient montes, nascetur ridiculus mus. Ut eget pharetra arcu, id congue + mi. Donec tempor dignissim hendrerit. Praesent molestie arcu ligula, vel + ornare lectus blandit sit amet. In hac habitasse platea dictumst. +

+
+
+
+

A/B Street

+
+
+
+ As the above simulation shows, the results are very true. +
+
+

+ Sed luctus luctus volutpat. Morbi urna turpis, commodo nec ex ac, vulputate + dignissim ante. Nunc ac nisi consectetur, sodales sem in, laoreet lorem. + Cras id mauris eu leo dictum elementum vitae sed dolor. Sed non ex + faucibus, sollicitudin odio sed, sollicitudin risus. Phasellus gravida + velit consectetur odio malesuada venenatis a quis turpis. Praesent eros mi, + molestie rhoncus sem eget, pellentesque suscipit velit. Sed efficitur + rhoncus justo, at malesuada dui hendrerit sed. Aenean ac placerat elit. +

+

+ Etiam ullamcorper leo quis consequat posuere. Proin sem felis, bibendum ac + porttitor nec, tristique sit amet nibh. Proin ac nibh a orci porta pharetra + gravida in nisl. In mollis hendrerit lacus, a commodo tortor fermentum + eget. Vivamus metus felis, sagittis a fermentum sit amet, mollis quis + augue. Nullam eros sem, accumsan non convallis non, condimentum id quam. + Fusce efficitur in nulla sit amet ornare. Aliquam id est tempor, consequat + risus ornare, porttitor urna. +

+
+ +
+ It was a snowy, bikey day. +
+
+

+ Nullam dignissim eu eros ut pharetra. Phasellus euismod vitae velit non + ornare. Nulla turpis tortor, interdum at purus quis, vulputate congue + velit. Morbi a elit ac magna sagittis molestie. Maecenas ut ipsum faucibus, + aliquet nulla ac, commodo risus. Donec pretium et lorem non laoreet. Morbi + eu aliquet ex. Aliquam faucibus nibh quis ligula sollicitudin, quis maximus + urna cursus. +

+

+ Suspendisse a nibh diam. Mauris nec ante in felis ullamcorper blandit + tincidunt pulvinar enim. Maecenas tempus ante at convallis scelerisque. + Vivamus hendrerit dui dui, et mattis libero pulvinar ut. Nullam facilisis + nisl eget viverra consectetur. Quisque et elit at urna iaculis venenatis. + Vestibulum dapibus dignissim sapien porta tempus. Nam commodo tempus dui in + imperdiet. Vestibulum consequat nisl sed leo feugiat, sed convallis sem + lobortis. In eget purus mi. Morbi tincidunt, nibh posuere iaculis blandit, + erat ex malesuada magna, et posuere lacus eros id risus. Fusce non orci + molestie, sagittis sem eu, vulputate tellus. +

+
+ + + diff --git a/web/src/web_root/blog_root/static_assets/snow_bike.jpg b/web/src/web_root/blog_root/static_assets/snow_bike.jpg new file mode 100644 index 0000000000000000000000000000000000000000..76dade649e9a39e4ef770c0e405139a3af364ec2 GIT binary patch literal 169911 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%0A)u;#L_9fPdvujGqN zWV?)`3Y!J>AdM>gL&CSc#a4d8*Y3WX>w8o+TjquH8YR!MM(~RjSedv8NU{|KNvQru z=}jq-LWHZ0z0_0dO!JM+Az8X?3D|8E(i&XVFKACJJb}p zUE$L{{1n&BKE0HbY+WXg2)4eh-E6ryk@VKb?&d4ed8QC@SACicX12j}$0yB|EzhJ@ zOClybbyUh_r`60xs$mY-M!{y1=74{fWh?tR2>>eLU|j`8^b1L<>!zV=K}e+;gvQR zp#hxV#UVN7Fcej0q8`V>zMe|^c2Voyh3^JSze>`1Fb=C)2(Tp7q}R|7Qs0xa?vFpv zxrGuxvIrwF-^i+o?NvMXU05q4{r<&RoxS%>73q}P@u=KfZ#(GCKSTfdy@Wa1zx0c^ z?W?FTAL=mP_Dg}{SF_4tJTL32rEgs0yRCP9?xc;Whwh&D#@_rUzQqm)`iNv|hK?Og zUo@rlI=r$SY1-6JCc2@N+(5;C_MBUzyeE26GIG50y2;JGphWCYHGrS%G*v@mv`mqw zNhPNRhjj2H2NQ&+=y{$qIw=JQ`=dp>wUhp&{A+ptAqU=iLF350 zFPp(o6hI?ATl8aCdbGeh^Vw~>Yc}j%RdI<}aCmLPq|vr>A*a6@65c@dftQL%=P-x`n4;LW{V0$5j&;lBZ8qL3i*F7Y9@Emx7~Q(k49aDsPj=Q5{mEL_!D?ZdZV zYd>5T3e}rmLTLOAuBpRDty&E&^i;84NiEh8 z4Q`HX<=9>Gie+7V)Dy~$OIw4-oE@-ulRWe-ojP)v zmGzT57SQ;rvbyIQkR8CY;cfO@T698@4yCu#B#|!ucs#Y!)H z4w?`0R&_)A?o!;3Ham}e=c|9O=vfYGlS+isMo0ApZr<$7oW=eYMM+YOYP?{N!(^`10Q{MtDJYE^$O5w~FG$uz zKtX{-#+cw_S5~Au@Aib4+l4ZN_0UIk3hdz4S?^l)*5UYg))(Gh^Bh~>>-Nj${YcVU zuz!>Pq`RRRDqkw!<5>YS2Ab5itwv(nm;kJn<0mn^^K(1KWDjq)^NqD5LR4OE4pXcY z_%&Y0v181xN3$YzEkB{z#VK-uC=J2}09#!Ez($|#js`*OEG8WUSRf&90g#jgaY+!p z0d*TT|G4h|{{T@+TOjR7khu7g6J~5fRr$X+nZRfIC;&>k0KFhzAc4SfF%|MhV%-fF zvK7sl8m)f%0s}*2Pjk5iUci_QQV7jsyCXdMnY6vV-CMbe+4w4pCCGkrV@zaTD)@YA z>nG&h1;dJY+J*7yVamo)fE4F!3zzqTV3Ix@Wtt&M(a#pW+6Vw z5=O=8udStKkICMO>N)fIyAOhk_>?|TaA(lfa*ff~M-t2>X!f0ihH7f=lx;EN@2ThJ z4RK^@xxg)IiP+BR^19taQDJmdl43_Vv(aa;>IZ&(W4-pJL}-lm_JeMI*Q?DSG7YDq+GO}! z@PbBB;rc@>p-jxz;e*#XwS~~$8}5aKfb`bP@wz%Ll-QWC+M{#Ftee2!<2UZ_Wq5WD zZJLZ_N|g1CvN`+}hf+~aN%{-#RMU4UMZd0GHpY`vY)$C7e&zo#tyV=3Clj4kQ`^Hq zc@oE}9GlY^4Jg@JW>7f}y6mYkyA#xNl&~aMrt5?0tK0YTJoyNwN9-4rzEha+$)o+iHWVais#OaYU=GSy1vn$)?O5GX~!vx{t0l~eFlcI)Y!El zLk7>(FEdys$h!%~;jaUK0p<*j+N8T2vVPYt=TbLsGgcJ2K9bHTNsK`-#zyJVv%)S<3OpzUIRhAOic>dV%exY`jYDxugXlMcc4lafOoVBtNWS+g)JL4XncaUm6W9}fV1O5nW_F({V9Xn2fx7e@*)hahyo-66!bfePad z0zW#J3m6ar>o!@R(*G4?06=2`kFoq30O&atHdPQ70Ht3*U_5Rz2T1)vpD1Oe$j0H7pra`h}S53;}qqzvzD2dZ&ei_#JAHTHq z*)nm3Rx8?vk02{Ar4$v!jbz=OHRZ`uaJBe1mO>HCnHvC&6Gsb}6zfmvRfv8uyH%;B ztH~u=Aga(;He7g%dqD&7W=^Yc`N(#3i1$Tu)7#s)bwJgxo!1Mb@D}V6-4QHEuVG$i zO%;oJ)^eg0Xy)v4d$GB0&T3$Z`btKn;nP&TUXZwwqO}5nqSD!Y(k#3EP0w~ zQ<*wzuf8jFNA_3ApM09fIjS-S`!y>Up|sPyo~GW)F7BJVZ)F-(RU|8}rEP5!nMS3V zoK(27>QX2;LNRbmi*0=D#tRSHe+BDrP;JhRQvIS#{jFM?MhD7}WMr-5g4uaUQL}LG z+>GV|+mZqE$BNQTD)OcQCwBd8bf2~{uUb%46{k&AV%43GtWu`OJ4RkbrRwe<_n2Gl z4vFryYFpp%|D6F1x`8Vv=dCZSU~5zKmxz$6El?xnDMUzxQlT zXYhTjA6JL&i-a|ooqc*T5`0v}ce3_T1tB`*Q8R{dzL9fB;CG_FuNhSGwDmS?%a-N) z#)GdDVF%7Vs@_KeTm2}?dOc>=CU_%x^TnygE2XMvWv|RH*Hc;_)|0i9C`$}HzKGnX z1(`N+9JGh3$O+^!vVCDjejL3o5Z)BNE1aEIIU9Xaxd8vJudtO&`^#@S>&m~NGIVkN z>Ai`4TaiDz+k{pDHMFIDgL(KHtprqmq(n+8U(~n@TGjIkR_|fH%Z7lg6bU!n@wwTjm5~ZfWGUx>5E_!akP3GySAk34 z99iJL>6+ECoR)RAxlOyXp6=R3n5&&8`Sl`5)Fqrl;?V2CN7|#F{`K<9nemMS+e!0y z+24B$TWK$ka+Fr}R(o9xna^nRjS<~R(m@;FH690mktSr&g5c1p9{zQGy$EJ8lj zBs`ZU^N*>^JL_UDblpEU%lG+_Qy0|0?Ytlw*^Tmpm%nVQ(@kcH8;mo(08Ard34msx(Fbg=OErsn$gNf}G>#Ys=Vb(McZrEIw8J zLH4vNv4#2m+f*#prNe8DX|+y#>QAOmI9KIHORtH&yM%WH!k|9sLG)GpoE%96<`Po( zvlePjH61iLp{Cvwvnqi`f2PeuqYORa^<~ctmbz2_10CLVEdUbL-$jSw{8&Gy=e zOb0>QI}N=wm;L)kn|F?^Wd(G6d%Dftt_Q=X-63<`@Oq*_2KQ>olYUj&MTs$)G>`Um zUvodng6q^jrGXW6lPvkOg+)cvrL6IaG?1yv=7>1#bk5=k01u$_o)#63u^(K__C$Ls zWO9hkoJ$HBC=nfv2cYe^Pz7)?g{%G|@mP2JPS2XBJkuc8rSbHdjcd%{{l_0*c*Ln1 z@n8~viTJYB@MHrit)|aM;L;yU^~Cs)qs;gCzezoDTNj*wMG%u87*vL&dG~3#f;;J&%C|w^k=or|xYhUv0v2 zA*Q4Fd_7xRWA0W2BW%kUbYz{4mjFbJN&qwvSSvTZBevA>CVB8}LGM zD8W9X{idG@7sIq{zRPx_7WZc^>sWZx=oouL754~gBSfaY&O9_ND_j-`=Gf29 zy|5O>>GEEj-hb-WxPB*7m8>o0(p4lQ4;-_hduN{k6(Rsz{%V`FEt&njvI@Pag z!)2zd+@#M37+s*DBZjN?y!=e^WgF)yf-eWPYrk_p82!NwNY>dTKtgp5e)JOL?nYp5aVsvpyF82ja_QSF|(G?XR$Z?*jHDWZVNWy#V*<7zakXDD?d&f4AN32HrdTAruA zSnJ9Olx^jBW^je-^Gp3zP55Y?dLs76WLDPi`*sp~`ZB7<|Bmnp$v!1F(JJYtvDIMs zw(7=5Yk$sO2N%Y;%?DmRtFOaDxeRY2wl=Iu_tyAbez2z=bU1nC@T}R|i_JQJ9{=X5 z_d|;5KY*=vq#ARP3B$zX0}#@u07$#@T_~;#e7C{#@4|n24gFx$%M9=u#J0xRh(ntx z5PmPN$^VS>(P*cujwRb$4Nipuqn5I4%^5eQcqIcp^K91=4ITU?M2nCA>}zS|=*1=2 zl~{gFJsg_;ax0)qUy|kFC2Og-loqNllY>jE;k`LFr$}R;WPCU8;In@dwKrsV_)0F^ zG*m_Q{De2&`CgOdM5e~NXr8m86NWtbJbUfc{3rZWNT6OfGgi5ZU!Ufn(dv}lQXX^) z#7o;=W7pgDYzx!7OGd({zlb5F(-vZXMYuUzS4~m{f7**$Qsvi5W-Z-ns=X^d6#CKe zw&#wbyufEHL_+6Ny7iVdPj%e<>7RL_ayga5-95Wpj1yqNgCl#>N@D#@hw zmHY8S>(c}*KAPq{dtx9jRyqL_Q%lMbE zW>8N4cBBRT7A9qE=l+ssesW4?D`!3Ci=i-jRXY>B$=Tvx4?BA32`r6dez*TFnYc1~QqQi92iqH9Mxs+L z0KSri=IID{5i^JlG}exi69B+~U?J6%E z?tefmM~Ibd(EX#%OIe?ps|RI)*e%$P^sL4mV$Ao#@%utmHSx%1wQfHCZQok{3epUx zxwCn5+zaFl zYac=`t8q&UsRl`JHjyzQRbm00^pqT^Ih`qwgJB_W7Hc+P$Okok3rJaaWiuNML7$_9 z`Lyl+iKJazC}U(Pa8>`-*HoJKNLX9>UgXqAg%rh|U{QL@w=BP0zx(r>@9Y=8`k0>= z@{W~z(vwl4e+_&moaPz&0!nbfEvYj2^AWZX1SQx0Aih_ke(P;3I-#&G(#^~=Lf6ZW zO+x{|*i5R@Ayt&4^35sg2UBs!GKlRP)$}aX)EAK$w5rwnEJIEYmN~;4avEWA!k4il z=>01_T-i^mi9^37vYZ&+nOJYA=Ae(bd`liUmN)pm{!Q+cy1+Fms9IKmk*eczbIvwv zIg{wr4C&!e@KOGiZ4t%VY@9Y3mNw>(x!H##o*PBu^Ei@b{j z`m3)#^v2`fJr8!O*DUX40=+mlU_X;gH%1D7q+h^e1_B+&S3;(Ra}I152L0a4ewrYf zn-NX`>mGZ~#%x_F&eq`=VR@Kb!(L2_FRV}L$iJ9^u#_i;LwIJ+)f|eSKUIE$HUbeIO{4-(E zep9sHye8?UjSOeM{IiJuxy^#8SL2NwS5SgQs4pm|lgPPk@*2IJf-uA*iRQ2AlqEiVE@h z?l%&&unxGUQ@O|Wd9XUIZN`(zS@!2;TRUmKyaC+CY;N>DVM(urYy4-79AY@CHQ%@f z{9alid~;1?GuyKTjziv@i)hNfajNmK-+vkx{=v&k>Oa6GYMXPTs`4-YH{wazIHQM* zrgJg*ZVM}mPmNPe&rg<8~;%qMp%d5J#{*zd#Ir;$SYUWROJ7bE8< zcUw8z9-GO8rY~~xq<+?OUPuQwj$ug36`aYcd8Makh}{$1gchAG8f0C0-)7yurw(K! znK->sCBL)_G;Z@5A3`SP_$~In+^^>Ui2mr)Wm2tC_O^M-Sw%9A?ZJbjLNs=t zRrx;;CNrZa&W5GvEtI0rb&cCye1tbHAW8h;NQ`i<1YBxPUQD1302l>sto~DGYfh?)f=qFCKs34^bPb(UNzK{IOR@ zm2S`DWOyxIe7G6sHY0s9gk19!KVK`2kA&7p6 zu|f;jQZfMpw3h$`xk@02IpSJHJp%oFL2j~(ZGqTs0c~K!8fYfH@$wTp zb`57XtVC)I?!+U6BB+IA9O?`{Vuj(PDLY3BOAtg`kd@?R9m^%`BWmq!AXcwuc6?0Zz7tCAce+l|B zPhDXFELB*cJ7opt9K9_@ghb_>%0RcHz53~z45_7)tKKiR>E@VjQ}U(T79)RB6F+j2 zasD1pJpYPbZb_>PQQ2kU?U0$L&&sK%$LWV+|Ts zhwk)VIcgM_oSr}7JDOB{)4*WY^Jw-$U-Lg8H!`c{%4LxDOLfrkEz9c57+SRL94|M~ zS<81uzq;qnUZ1KMlY6vp`cbh(vc#KPjpNH8!g zhgCS`9rQ&IP6Qe?>a&6R`&>=sQ@iyxs2~5%RG3-`8^QI$v^1K@NMLO?Vc#6K9`|SN z5mXYj?WSav@@WoDW9fmXtbF|g{V-dI=n8$C-f9p7riGN?*6Y*$&n_S3kCNO=iU)If zMbx8sev{G3#hhXKi z=H;D$mT=TI_5HN({Q!~wvRm5(L`r}yD>jsHySGdbd`{5G0yOF~ z?@knfM@!nyrfPX7Re_k1fR8*tn5Q#KO2;K7Bdv?^NU{QDYvXMfowW<=dAZ^*2x*56 zDx>zaW{#O2DUcyb>pi)tIWY4aS-)59-?4+Y_I}kq-g!bUk-_E3{8jFOj3BJ`R-JZ} zolE&4T2(gip-iCriLVRTeQlTKOG-af;29izDWs}bVz-B@=NOp&W#TQ*-Yw@940|$it(u&nx02_B%&Ag8=NR<+Z6fYoSmJ`%;YO+mgIA8Ej6_X9#2B3Qa?2ZvJEp%}~;I z__T#jO*-d~QUy#Tw|Z~uX4hemr?vLARY+1^Qme(sg7bEvfP$*5xr_Caj_kXYzghne zcR`50X7=_yPOB%%>76>1wnvlfU*$he@8iFr_?)p;E~fHg;Xd&_Sg7QO%;~Z$k@0qX z(WVUfdTg5UO~LnFpSbV%&c5Pv-ad!+h{1hIN%){$MmcWVuVa^|_@7VJEgedZES_Hv z@@p(ullmtI>8Wmc?6c~+%&ldg61KHE^yI=n6UOG@@^W9`G{5C(_$73%?o#|A&&Tw$ z{Wbl)U-(;lnROj}{!HZzaZ*cW_X%N1Y;$IdsVa3xS@6G%Wpm5oJzV0V^0dFosk0{K zCG|ZI37R7Nn&aM%Nc-WG9k1>8q0Mdot`X*r&Z086HM|+T7Mm zc}#s)BZ=z5^{)$NH8JgKR7;$1lfjo=);WDqlvj-*9=|Lh^={MdfcH}xd!8(Q zEh6nwbt=)m?hP-;B5d__$=i`c*XOA=e!_eCC(Wm)IL;usrC<|}59>oH4Z zIR2n@>JpabUp6i_ni9x>=uCEF9EtZYQlKcLLXc}n3$dnVr)5S!SxJ+qECO=a`9F;H z4?kZt)hvHPK8LUCA<|%$NmZ}5K3VcPCoGect44U!9RG>b)92~kJ} zn8Y+t(9n`9fMR?AFo^&YbQJ7qkz+tzg^~dkVPx1?7h)BKfW#I}fkPt7Ob0kgD-&QTJ+>5YxC3A*6&?)Ahz?AGq(}`R+7;3e z6Fx~Cfp7v7O_vr74D^PNCAYDhrPv0UX&Bz-n)U*u$dlMtVr@|d85eUK+}9@T!cMz^ zP0=!%Msk#%{30chwMYU|P2CdY+Yk@}^(Q_|cp6ShO{=6G8~OPwBHNUJ*Bl;5OGiDK z#h(Q6%T%7H-1lLQIF+vFCt9(%wf%}bcB(*BlI3q(2`1V}TYDscOPYQ5GisYhYEZhKBZvLY+O zpTT;Vzot-<_oG}t3(qL5dFGZh?xWoG+=A0UWsd|gK}Q-i)=)OwVjW(Ozcmt9yrkYjxH(Z?Frtx~9nVQsXgQm;WPD>hJPVKi; zjHyeKl;s=KCX|&re2Z%$vZ`j7FiSge$0+Jb)Lz%@PDGTpH-}A;LOF4|@9b;Vd|^Bp zvCB;HO+RB?eI|EPmrs$#_oYppJvYSj;@cwmk^LF#biHOiqB^3}^1GtqJZ13Al7CFn zi~eOzeh){W_;fH$NqtlPX1F~l>6c_uNo;|m9B9!pP{0#u(%_~f5&~NqB2v<;PE_dOXWxER7Qgl*wa;r$KQtSspWhofLk8;o(DGf_= zB`PT}G_WB^dVur(H__zkx=O=((@#qNFGJW^_8`bbIJ6>!05CMb zzNU1e98jfw&5;8W00F~7nsZkl23>A^c^ZZ+N(pc7TQi&#y};%H$}TRLiX2s%Buo~@ zxZ|#BDW!ecnz5YT$4|mCe6NZ0)BgZEU#`b4NXbpbrkWgY9HTxQT4hGvZaY6MV2(_VOcY52~ z!a#KVK5jimKIu(bd^6Vn0Em~!jtOC3Ew|Q@eJ7HrKT>tcR5vF{0opi!yJ=}?P|)C+h%e6I&UvUhEm>6JF~ViwYWwZ z8Nt?Mj1p3kTAy>fGNyQ+7oGJHhw{h!n7?-#i`5szll+YHC~<8yO|8p@y&)UqivIxn zemP?lvPUI3cjWT_0BFj;i}gbXYF6mkK}!_k<)>QGpQ+8$N^^#}*QFKJWyt3amlLNd za`zq$J|FWwNAD9&eJc5+YxiV-p>ODiJStwMIr4mrE#K7kOVsk)^6AojM;Bd}=H}5J zBeBm)B~@isJ6V> zZ{awz#XQoSrCT)VFJyLOjYS<0;LpZxuD)Zg_*QO}N`H1J{{Rue4VpgQa8rYfm8Q2x z$$Uqomr2yMrlBU>N(axyGmDaR z)vr@*a*}bH+P0&kHYJ-Lp6l&?4k$^%wJn@q9tkd(^zqG3DocXV!_(yXc`Ck{K0F=P z-zd$Pu}Z8t6|19fmk8t3<-6e#S*5V)3(#q91LOjNngQ+&F6zNBy}*Zu9KP&v{Shyv z>Du2Ee+Je7bN<8A_EL|unG*PR8GjttIHZ% z)W?$k9n_^!lv?zYLVYh?6}GDM$a=s&RL72=U5;P#t$JB+uj^u}O|N(!t%KjPFUZH3 zzAMyM{J+rBKNrbgRw%dV&fO5ZabKY_!G>RUDE|QVq4F`F4~a%!d~`n6&bW07PU7tx zvgrDI{{RgyVSdAknoendsJ|q~bLz3h)TbExvq<$2Z6ze#S>(&2#<$le@43wKe3|tT zi?~8OvdgA1_{UPZj=Fkfsu22Be^Z5t0i*x{*nlq_rx~eZy;ed& z5@WEW(Jd6oU`-4F00n!Ex&R6lm0=PzH@PVQ#8E5)#u`F^X_T1*0<0`Z0;mZ^00n>m z!~+2U!hk{@2n@sm?YIrGSq+3hb`66fOb20Pp@1$+NR&_tM2^XCa2?wdXhh9`+e{zY zL|u)&hzQ7SnWwnhC>z*@Q>rD9OLPib3Pji&McNbGh{+|%PFn#oR74UUmb%U3+*^-N@z5)XO5H6=}8H+ZJqahMDy6 z$nNcdlwHe9?t7mH=ph_%>L#xv;XmO#j0@*=P^cuF*V7)z`pj!gXrh!6l;Nf7NZ!eN zpgHeiT&sI4DyL}Y%ew;9`P`Xg@MTC(jz}NPZTCnekuBA>OW6?K;9AV@f}Upk8Ep1L z?c@hJ$?$dHwTW7$a%0~lQ(eyLv;is9OlOkNO_<*Mfn2@KF-2XrVCP+dX42ODfz>){ zmnS#Yo9I;YM$0s@mEcNMl~O)+agh&+GA3+Y}sGm=+y2c7XQnlWo8IP${vS@b(V~$!R+f7L;j@`== zy`H)ldTb6`YHMT0$C6NLP?L`N zMpeGd`CFo(+@_-yyV+4wA6*R5mkiTVu1}lCo2=<07U3t4)mr}mvDqJsVw^tr7P~YD zt@9{PGJG@2Ul5K>qV+!vZ-Gz+XqY4xki0PZAvcGK=l$T z30~yJOG@%q%qs4J?d(Ehx&uVYPjeL7DiYicS}jqOp2Cc&fxC1oM7b{HsaP8zt0pX< zGR@Or&a~yn8Lw1wPvD&dulF?Dy_x8U4;MH5J%z8_&K;hcTZ_f&~#K2RS7mw=<}dXI&4eMjGhDfy1f^ZK9o zbv^ogx_`?p@A3!FB-~vj(%p#lKkyE+{{ZFJn>ae2n=eh3t_WOpX02sh|*;=$B>%&^v! zT`yCd0GX#L%1Kgfy6`wc-sKGeqT7Oznq?*h*sN9nF)#okP*POPCkF>i>LyWAO)xNA z4(X}}w7nwk1!TzbWYs5c$e#R@MSFo$oTsJEPFhlmZ?ZFGA*=8e1!LsXKTj+;@k&>D z71eRz$!x+pV(heI256WQ)LMe@*@A5*ljoDI?x~!OQ)%)Q=wbT)8`a1Bk(cQu{{U0Z zJr9Tdc(ddFd^2Ct{{YzY$rJzwYp{aE00RIAz#3uYuS4lRFZ1Li^ z_;QlB^1rhK=2J<#R)u>VonJvNn*?%7R@+JbPB1>t!{AjKMc>) zxl2y0ao<(;KB=V4=M=%OC#O)K{6CZCH=;Q$*WmFoX_Vi~O+~$vK98%%9A6LW;T@wj zs=ZI2!5w)KM|K$fkX#nJf0fl_%-*K=kL13V7cE8RRW_fKm-M+B=6$6%DQc71e?!jC zmFCRn{3~Vbbai<&!{tYrbL?_TqaC+o{#^dARTGuHj9%`_`UYh^cW$IDlv@d zB(_^0I7N<++T_(r5oz*av*1EbfYTh_DeI5rc{`)j;(g!c92|~23=2Jc*|hf5eJ@C* zEHIRsZ%RIABDq(S>N;Pi3}dF6TooNqH-a+8tsBJv&oATnqb`w6uc{K;e-9P@bviM|4lUPmRgTnh^|)?7HXN_H zdK9|MebZlpmsN%HCG63kwQ}H_jN;brtoGvJpQl+iO)gR4WYdo-(In#cRoLwKcTn-q zcTjJ1*}qwJ&{?KzdKz(e8E|H(=GfI-hN>L~oxo~LYC@r;tOsGM$WW*UV@y;Cf!OT` zJ%FpO;7A}TCrn$0s#GiW0fp==Eoyz*b7Y}%xtKzG)%R*j-sO`1?gkb{0}imSKu|D4C`c?QK^B;qExy3LLWUu>O@s^skN_DrI|{1{BErHh$7HSm3ruuE zDKG|wMF;=^u>~|y2xtdkV8jIgtN?a0MgtdcLj#)Vmh5c^31d!ylE8A7#4+8l0Et#g zJC$*yYD4>e0 z$f1IH9}!l0(drcbtw~47M@C$W7B?wyd3n0blaq1!QKwzhsig=?)8yk^)m!jYcl7;q zrSv$fYiU@qXUnBGn;)}u&IIdz3Pc{RJnhOVI$M9sBh!qw-12@E(_49^vi=j*wH`nv z1usTpC}fWMZ`jvgbXs-?B(uDKdU3xdPpFILNbj1}8g%{7AFAlHeA&wv+k9P69X~!i z4P?isQg7I~kFi+`jH{LFWm|aIsp&eM&$NL=nc6NFTJTmUm zSKcfAjI(r(Q@lxBxbVTOx_*x)Xt`||c5KHiC5CPi+DnFe_^`(oD8VYEaC}D&x^YWV zh@kM*XzbTr-;+Wi$lwY~ypxKNi*RwB(#xAN+Yn0JY_=Xmi_2$vyy;64D zZ_5&sT;Akq?#r#hzmw6q}CefxP09v?%0T5~XQ04@+JGwbZE1@JeA7ry)faC;gi zW$aRR28d0GGGxLlW;L;jle1pHHY)_fNCu&%P1hlNfoU0aT_!H86UUZ1lm3Q^NVMz^ z13&ybO7Q1x*ArZxR!)bh$0r%!pEYS(XWB7R3iw$Km zOm<|O9;e_9mnP81XyuHZt&c+nXsj+S3CaHe6MO;BIO$}XW|gxr0f+$4HGMuz&}EjX zy5Vex6-$0V65L^8ci0BIl#{Dlcp^L&G9#7>l@kkIqCQuowB2Euth|) zN<{$d%PRWs$)Pe<71!{0eO5UC05!+;O&)z#$7jQ3^7_1Q#Ls zZI7DxE>#|)SfuGqTK7lLVr`Rt@UhT_3xSmigwXqg0}QzJDyunvX2lP;9AoT`=Ixov z7E2dg+EU>heN@yW{ihpdm z1LCCAvPw!SDZP^66x&>P*y#9|N&6pE;J1vG#nH`@l0Yj9BUd49fo_?$Ib2`ioXM*$ zGTaYSKUu4xc$&HGPl`AfQI&C)U#U@^zrrxf9W!gUVhz7+&cEhw0N%nje=& zkduyYfNl;(Hn=xj45*nrH!XRgu6Z z2C1Ur%$Jhl2JtlPX9GYY*W@g1B4`R4*ny|HMcGN&8#Yuxp)hPs>;M)`iLfctMDP|% zJ&0byta001-=AOe#vEXgxO!Yl=2uqK3CBq$hw2Vfupg^2(Z1lYi#p(Yjw zGi2W6i~)&^0Gb#D03xo503C_2p+0B?**8HXXC?tD65W7N04K3j$@c*OtSkjKLwk-= zRz!ep>_)EuHRK7Wd;_?vVsfXkIVPg6YzEqq$)6-tmWTBjXX>?W1DfAAxDC!t+HHF? zqowMn43UhUr1rLR&2N34;se>1O-S>)%Xv3Y(SxPSlQ+wbDPNYUME1TD(!&M?J*7N~+`T*z*!q_(3LL9>|v8E)P9m-G?I&!;CFn)EpNfjrM}N&RXt18gQ7AmG+`9d z+_fMzlGw`^N7LiC3^0xJQ7ch!b^)azX;%Yaz{$h9A*)`dvb13-RPKPoG&SR#9?D6h z=I4%h?M^LItL%L|{;NpybKq@C6HQr1lBK3HNhhgR{eiTlaJA#fdGS0m)4g_V$bpoF zU55nRl3TDnuZGR8mI_PT)ai1wENY^uBJW@;RWg*k7}-g+z#D4VnNufFn?Q1PT?Q<= zr4^!Y_>t#k=`&(hoG!N$*sD!f8xd0(ILguM{5KTk51T7dd?s-GJEfL>rZnm?e^Wk5m2DHIP}KP^7Bv;IQ1oB8((F}Or1XJ~U!~HsDLqS*T)MI^r(+2%D|c+D z2+z&HD{Y6QO~MNfTKul2HG-|n&7O@v)yn4Sr>Ih>Vrz2{p_Dj zeZbPM;R~4<@B9ugkyPk zuc?tt}`fOSc2EN{}r{tec`sxXrDk@U;} z`7WoR>biBSCO4nzUm+lLX@8@k2}HP#+a3(LXckZ@**d`k#RG zxgl7u6uULK<>mhXhx(|+xJnZA;=u9CTbGvv@J+`oTx7d4DRv8oL#8DE08+UilHVxalOVJe-1L=R^$?cjwt}OYu(?`Ak01iv{ z`B#`H{Y?I^?l zr54*;c|LP2uO#H1rr!QfTjIS$apKUDl&7*sk0-K@+Md_oD;%k~#lHM|30f;O)aI0a z*sU=o@#+MKU;;fKfV%jmD(`>T^N&N|U;h9!#rgil9?$$nui?wnB0gQ8RsR4G{{Z~4 z{{XEYD##G^Y1l%O+@O=x#Y2m6cD4rGox5zPyldu4Fn`3-KDQinq?fVseLw!E6@NPZ z=hZ_ZT(S%m<_ZY{3cocN`?M_g&A;)pn;_9VQK()#{U4RB>)US2AH>+GdAh>nJB*J2_@rUneT2CIh+t3%U;;gV zhp(53E^mHLE{77F5}a<0*vd+a{c0b*=* zK){riZ7{NiN_qj*zGXIshO;Ob10p$8<7Kz!(X#bp<;bWLZcG z5Ws*#pg>TDAOVGd0n0!MqPqbvWGmPmiGWz_f{+XZ*wX=og{czVffHs%%^A4(0WHf( z6B5-B4yej=UxDPBTr-|c@&!L~C2P2A@+-Mm68Rpa`D1ivC4IndYlXQtDl?p;1!o>^ zt;*vT2GZ(2T%|5fJh`WqR@kE6tCPFggrO)>lB-s|P!fk*008-mUN=OPoiyJa$!kk! z0063`zdisOO(xCyEOF1&!yJ>+-O}&wV;${2=dti!nZq2i&Mit?Cj1n7QCbp7Qd=OD z$1k_o#;|2 z7t%vtQ3RLLw`Zp(PhdE|@d&s_W~EG za`7GtJ&0$HTydOTrmYmEXOWL2dP)4JC!y~a-}F1tj505(DV*85CoGz=&BcE$1$mM9cN(($(mL^A$AT1<-uA_nPaGq1 z(<|Roq|DT^c9u8)0J#CsvPLh^)y-+Naq7w693TGSeQ%6U{{XlSg(b_D;`z_AGFq27 zr}!SFrj{&;_jCr!GF;e8ENf<9+S=na?-5#FSK)!T&DcI`d>E-myZ(j6Uh&;~0dbqu zTUxC&WZ>5KRp=)<-Rf2Z&!fWP=``PT_&J|RnlEaS_d6oxEwx4dP5OLOo>|!?4X5JnndvLjIKe5tey!WR^+q zC(RZrE~Z9WyzC~EG--Dw!8f+W)_y2(b$46V;@x&M($@~e*O=F^)cDZ{6qUs^*Due4 zn}+n<9dTr(7sRRhgrMuQUY)&yy1HJkHWsRCYD)C8SbRdU+^{z9W_i}vKgs^(!9SC& zwxXR{d@!#;b=cQ;Z^AnIez`c(JUz8tZ+ouAw$r>$QEL0_kqxh-k5LxA8Lqgc%16$_ zK5v$xagtr{b9L8zylG1BiUz&d zUo+*lt?+L=%C_VSrK@7E)Z|i=m8M$0EDnW}dS$0}-;X*eg##?u_Ft%Tfp| zX`x7)0_DLS$&}iA@EW$TG>f9ttmjg`O=1RtWTrIjfmSO57#Cwq&M$J)0))^e76w^x zW6KvA#YsNRS>knH@b2yO*?WDm@_hi9SIA`eH(3a|yh>E~i?(x5rO%DEEK`kniT2ci z#Xe9U5k8YVW3A!IRd=PCX?D|Gc|Pw-?unOAid^H1{2)FeF-V!+pI6p=9|m|m5m@K^ z(MOLzgLQC?>5Sim!1AeuGqWd2mmIXu6qBo}F?jp|jWDKa;K^yHxDYt2Wm0CCTE~_% zYU$koB<`x8hBSwgYc^?Q$#K2vKhYBxw);>HQc#Wli09?o#}s2eqd)Xk zJF1l9N}ErUIeZ5i-WjH!uHbo{W@puPIWxHFb9be7Fw%GC_-|2)Tq#EDQaJ0kf-1T+ z*I9@CX!=ZVo9=wvWZ^i@JjJGuqUrKSE;!_m5>|PC@+JDNoL13wwb5@QMl(-p@@ll{ zuIFFn*7DC&DEWc&FLY-42GZcyUCw<;&WXvjvoU!RYWPIw>TzOURF(KRx}5s)N#4~- z80V|i`i)s5pRMXXcTn7AaE{5Ga(3--jVV?3{^euG^f^nqJ22*4l^}7`DhJ3A1E%;z zEOLE-gR|iB)A1Y+{Pc6IPrEkgn(6wiS!Vv2%{NQ2N6>tIH}J{VX+-&HCZ6Zhd|#=- zpW#^^EYOzmbe{a5H5qAA`crRY-(nE~LjWVVA-$N2ijUlVAHkrqbjiu;^k>Z{O#1JK z;QgPcgf7}!zfz;R3X!Z?luc0s7=R96h+FA$rOuXoT%EfTLjeF#0FoF8 z4pOX1|4mY@J$B z+wL&W)k`C&?2M)LK})*XfajK39_)k#N?NOAsaC)u@=jS4WhZpBkW_cL`2tOz4H4Bj z$BrWRvk(9sYDunE%xXQ}%lnU3r>3beCeq{e5FU@i{uw@@>&V<7pAA!x5%BJZCsCF& zlv=|VZMDy#^gBigB}sNEMMgBXqdC6C5t3AADb#I`B$Q)qo_2iG$t4JG+u3*^T~2J7 z@_d|I$@2Udbv+w`g2bgZ_I~G~)8JSmT*>mvly?K0r|DyXUo&c(E=KiaN(rDbPK@(s zSm5P*_Cw2#ap5+3*`+B;@%=SJTf_*nj802?1 zyT0Clb~Q_2NHrnHb_TFTG$^V?1Z6yFoY}g4OJ_{&C4uJDv28EZr8IX-8hw$3`e?PX zr{oM|p*2%VOT$Mr{u$Bazuc(bcWO6QxsriZz z8&>M?W8QKTcDV!2#qgYz-1E5awv(oR563jFb5-G;Dpkli#R0>Y;nHsL^*JK_c%c1? zNw56YOI^;lHDH>1ftD_vL+{Bszb%~1pW=2WQ)xHj__>%gT#}0qFC$fFYif(z5P~z#a&!E=_ z88p$J49ljDOf`<7ZKwG* z#;96JjtTrHAN;o9ye-Zg{SItBoR^f3qDUMQBEC=$qw0DLS>dIs-qS~q)%-svOtmMj z9p7{n#MP5&8Z$hVKsy9vrM)v$zhKu21G^b++4`xVo>}ZZTSA;hsDs zv@KF=cT`u-mN~60{VwkJBE8t>Se?yMW{)IXlaAJT&*B(z^lw`I;^j5V@@0=aRN8I5 zw?hqkSZ5k-J?!XHO2t^C#xZHB@wwkQEOO_60bQ`3`x|85T!Gf<`l2l@nS#pKEPAb28>%&gwmG44R&5>t(!$BVQWj0X z)y{=<$h9Vo61BKdb{9f%YuExUF}6fOx(cNsvpXKGfOoj;h6#b7(J7Re0Gdo203ukU zE>)w8FTy%W%TmWq?bGD+0fFiN1YLTaqOd$UaXd zIb)lQ(@l9h{t?t@o53fvw~xPr)Xmc4%Ua-@Twh}dd_N93>d>#1w+4FWca;3uLbNqjLOW*o< znSaHV$;sc{8~I-(^p=_5e=J(U;?qSSO}Jr8+45Iur4_D%|&-R^87wH`h9o3 z9(*!5$v)`YH(5N<(%!&xPCh#jlfSmjwhg%hUxoDVsOzz&o|t`3mxJnKadi1PJ`d6^ zp9ZJ*&ZPGKhiv0=yP!3Mts5hr8*pl*5uyT93js;eZ1|40a-Ub4Q&lH7Yr*!pUdPFN zTNaMHBdSvRm4$iWTY$8IBeCfX03%#3pSI?1FR<~top}SfEl^9!I3CWt9oXe@ew!S5 z)n=OY0z@DIfJRO-)VW*=${QqN06O|b^fqyw-7>5x`7_szbL&OO<-Wj)l+v7I-JIPT zN0d%aw!Z}~;-2zIfyZbZ**l$5+Z#D1&GN@g+P6f15ppAzZGsTQP(A?-RjpRnpueF2 zF#$kUI6RY3k1}+LFBJY>NYB9sy^0z!MmKs=M@Bu5E2iplacKm$c0P{!b;~n`NT<5` zyqLLoCALjhbf+0EOlet$Hrw6oZF_7~RkTd0??SU2nLR+ab#`SOiQcDF$;s5m5>C^8 z4qm6I{ih`51*gITO#MomXkVjRMTGNeNT(R`H z7C77AB)Rl8$A?O{&tq&*sapeFcq3m@wkhL>kFVV$A%cb)%uz}(3>1>_5x|&2KeHV6k%MJ0}~yIgeEOZhABx!87b;}0lkAE zGOPtwM6kwOqTiGW*c{X86XCO#STZR+n_f>-kkX1gcd2ln=tFJuX`an1suZxr@`$e) zx7bc|+K*a&G#qM-C(!=@ESMZRrZsE1x9qvEg#B!ZW62I+->@0D+uSXsv42}%OdUT$ zp@$^@0EMq`I{qIU#M|<9wMfIG#_+>Sce%Wpt-#~!^0?zsS8bdM@ub$xnr3e&Q962} zo!ONBsU*2zdL1rJc$B{fOkb(X({%p;Eib9xe+=r3Hv-eNP?9JjWfdj4&6}r;)mOKn z)Fx5Dx>Vy*T$*C(al`mi_c~~LNFzd`I5u{XjIA&(C8A^Yl@=7p$pqI1luUv=Pl|L& zMdpVq?njk4+CHx=6r$qyv%=5t?9j;6BdR@}f#l6N%W~tAs?#25wUbPfRmx`2junH< z-}DMml6(|m)oxs}!$eYxQeSg#kW-YBTbRmL$2nM`7d3vgUm5i+?@M-GJWah*UdZ1b zIL8d9>r31(!8K$ilGw*4%I=Mt*|yGkLV0IxX>xM871P~In{NwrPVUCLo= zPiGbQ6r%@PYAkvQ(JR^ems1DJmW`?IwkINLZqr+hww-b8Qj_$4cAS>Y-6V19i+@x*R=}c~tMuQxBI~mc#A2;ZG?xtz z#kQK0?OlZBar#@d?kR#jEPoJF$)-2;Y?C*|)j`d#nFRZ*JXa)?r%9)}Pt>=S$8KG2 zRDA=>2~9z|lNZcOCWPBf?#~V9ZVlf1ZQSU`)qJ^2_l=~tO@H%pV(Z(EMIDna8Do6W z;K!?!;M^l8T>2FbvFUo+i}V<4+<6q9%&n5Mhoj3JxUD-hl%*c_h_0wjdEDAE*x5C?9t;mi<*?OYYSQ4@-wk>=6iR18S*VD4xDBu|j zcT676z}h~gSrK+QZ~>@yu`~^VX@g|Mt$-|P*`4lE0){IK0g9|m>|<8BMh8)@sp%)!Ye_*u_Sk#?lrz>Y87WGwS+$Q^N@4 z#T{~Vr`+-Syl}GJ%iqDqzW zJG_nep-UuV+f=-EMI9O8jmKU^roXAnuI0seGo0m;TBPlcF_fCF-N4$ly`6Wl##giC znsIiSNhvM1k^z#&(U?sUy**`%hxixsCu`HAO zTdM96^!+TgVvM%kBc&@idLQsHxUZ$fa(6|9B$_HKa@OLd5Eu~TN_+0Yo@&x~UmM5! zs870nJ09j*(s*AT$$u&vt=j~79Dv(eQc?P@+p$mx0is%Ifc?-V^(HH$tKr=*?VU=4 zZDWq}{{WyG^q6vHi*Sv_ZrkAF>eE?o%09mq2;;`11;V6!$Hbv1buvDKcz*fNq#l zCB3;7vWvP6TLO};$dw0MeYW+H6m<$fm(ve0E)4q8Bq$=a1E1jZl>WiL=oP=LEZWB?Upw`@YN zIoO&Op*dG114Oow4?Hfc%6V^wsA#$6-jXwvr7yYZUW990FVu$Ynx^KK$q@JC7>EWb zQjNDpd9%Y7&v|%97F@H-E0f!@>`~D!rskuDH@__ES>o3#*x~79qbWA7*1$}yxDaqD7V@o z<{q&nHn&?pAXMQja&VfaxkUCHrzw5Szi|Ok-8lK<+(}AKqZZjvg}qXGVvR9pcrqzM zDf@w*l@Ggj;8J(U^JIB)YiTFwN&rtwv!klXf^o+jSoFB1Z^_R`yYRn<=!(mkCnmm? zTp%;}XTuhkm#BvAeKCEPlh=w-REJczCAwfK@n&h(?7WhwoLPE`dSkl*^;wc>WBZw1 zHX8cnyq@HAxK-I^!!FR%Hjh*{y{n=(P4Hkh)R@LKI&q}d?{;VMv}99{ zDD7y@NC%H~XGBhXSJ>!_0>BV=2$q^5+cbNS+TZ~V5;Y(jMpBKVN5Ki*pe8E4iiW5xvqtF z6bxsh#F`3}T6CYWtGY|F6&Fm5ZZy-4SpHmP7XD>5!fTU98|0UbcGzlTH;t;T_ZpYq zb#8si(Iv#cQAx_GQM6ORJd#{-+inPQa(3j~^(*Oo*q%N9muRty-=yl_PZ=hz_ePK6 z6KQVKzjKMEy9&Xz>U5oQeL~f@hTn74`O=hs-1&p2r0XZs#lN$y9yWN<_C2l$7)Twe6YIVr<-v%45N2*@HbVqW|Xyl_+JMIRljLOST$PbY) zWH|wRq0y3+GfhAZ6S-QDS_3^rA|CCIJONCb8xRdJWVb=PXayu=E4n&bGjQ$)J47ic zNxwsBMvP{u*ckN<;lkwG`nI#hl}{^aQhU{&m&J1?w8rYVJlRFYaf{}YWEteR%A?C6 z<9ewhX8!t%d*;s8w5`fD)SiC1cYU!)PkN15J9b1UR>Q6wvirRH>z2 z;6x!7-n;fe^6Bih^)%G$c1`~PoChuCdSaJk88Xiz(9 z#(I)VeZDvcje7^`PC zyH_sZN?ls{-!4yx+2j0MJabJby`byd*F04E$)`BQUpKME)K40Z$%Q)KRc;0sL*$gL z4POCp=uI|1$gCl0b-C{U0K?rfT|3WTRNGhRk0YnUKBqKsLz#E*yq{IlVvkLNIH7uC zsaPAeNcnG$Nq^!KO8sxi?e*Pkx_Gx%-pP8OG1blF%-eSRx7~pVRYFps>I#;Ejd5jI z=dVhWs#n;~PThn}4u@b+L4NW+=XyA?Z!f-^3HeM+;gayqSltQ+kNkVmm=(GktEZmF5n%&xMJ4{&CW55JokPP9fjPYiut)d zU(43?_#glP0001TX}_gX>{Kx1nr<;|F5o}_0M5ROP6@QFrg5EJFY#?Uy4%u@ z$X#xE-7fhrlzK~asE}zBRLo-8Ym$p?j>HrJxao>4(jY1(d>1Y@Gi3=eIcx%C3CL-Z z(KgT<#zu+kVHaqtU~1;PiZ0BCodL5cNX0v4CIWfs_wn-K-3 z4U!FjHZ4J73cCRzlmZw~2mk=9*p|SDEx@Z2WY{NQa8EM+9n4$Q?oGc!P+5@WE7>iG zV-*of!I|aHj~Cx9{4LqZm#v)k#rWEA+w##vf z`lYv`@(~Ixy_0OW7{l*({!|Wbsx*`EXGIk$xhh{u@PxjWniUlpRqUPl0Fp{uaQ8!u zZ8vFB;l0?F@UHRPa?`8my*^kH#8;r701we2ZMi#Ow~JlY;0e=A1T+m(uHAqR&xT=+ey%Z{()zzc>ENjz z2f*VmpE*;lHFdR~;+E6}NtixMl#YCvX*Ph*tIf8QuT`XQDZ&{cj_t{-Y_6j$;|D5p zei4U7(sdc;x`@g#sdD@I1KdjhEJ4%0vKzFlBB*5olkA4x!F`esmnY~3QnD1QW1--a z=0jaHJYTpR&H9OM=^Yt*RO0kDn7Uq`P~LUz;0=0wDlxXVHld(kBv}Kn88TZ9Fnfe$ zu7u^al{|gXn_77R>lCL;a$88xB%WlsDxvxEi}(9<9QyZCmF6Jj#+%}o^IWz-;~0>hYwQ+ zYWF(fJ4ef4>J}=M$;rQ|ct_B5xm>V9Z;2~j#2t!MHq2u+BWSBY8={jLEd*7Al16Xb z0If~%ic!8qjSvY%Av94kbgT@f{{VRy-CLt4C6lgtU8rM9{l}joQFE?1GwEZc<@9Pd z?1H!0i7kg|A~jnGG5s@VM0YWaT(>rYpsf%vLkNcUIWp@~cd|O&9Q{MI1ILq64M{sV zrIF&cxEymS(^5@WU^~>US~J%jRGH5l>vYap=Kbta)y?ox>Pji0Mv|a})S|cKQcILT zH+vzgT$#4e+_v=!+6=cwP?p=5b^y|6Cs)(Pc;#`oTOElsPDt7a`RxsC`9Y-V>XL?6 z>SCVs6qYL^CraD6ojB=oYgPxA;^Qi7bTg-_#i`s@=QTCTpa7wa38LYmnw{;su2_XY zR+ua*PG4JlMR@fhtaLg8XeeNi3(yi9K|o7EMNm)>)rixC)h)$H2xQ5n9_^YsM?9XX z(pz@`tK5d%dH#l~EfYB303|yf&y*#Pbjnama_cvkoiThdI5okmitsHSB++#~EVo>a z86^+4PB-DvbtTz9VKlp{F0+*uZHKDOinPws;XVxXC&LqiMP=JRh`C8hIP|*Tf9!42 zd_uD6%lMGW%B|^Lj;uN3 zD7CBFiHj?#eO5T6_Gdn|{M6YHd1Gm>r?c=yb+qH#V@!MQVzQ~F9j)wd7aVCu!mT~Z zGt`+^uthT_s!TPv=qGYp1vKrH?8|}cZ2_WVvlPc{2ISPd4P6<_aq50Ry;Mt)F2Qc- z4Pm+oJuI00BAl!ZFJU%kt7;|43X`)L?x=c$ln0g6;FPo5Uqfd%TOBzgC*2;tWpVX9 z?}#tm!S_-FJbf?B>8F`nlr~9rM>**H8MiEo-FWOz#jr;dvC0uqPSd4ZfxsXD00000 z00A^mfQJJ#^s{znD1kGR)9x6zZFwcVsCb%=MPPckK8mOKJ1}(_A(30O{GNU(*37Jq zQ&f;1%({wvZe={0owLrs+&P!v-{$RB->4CuP8TJ?j5_TR{o}tB_YSImyL+wto^x%= zExo$|(=VzLedywiDBFI=WH*9Ozb6fSRq8>cSJJFGW{xpYjZagp>1>GZ6t=LYOr23l z>`~kBnMWU0u3e*7XTLo0h8H_q9v4Z93#EA_B^LhxiT?nxGtZMOR4?~&<7x=gt?GVu zUzw}v(@W6ur1eR&qp6)mMRz%b2nGcRU;qFXAdRqph>o;!^xt!ShfGd=dh5@MA9b~o zbl`*}u0~q5&my$7Hk#dbD>junhbe+>>Xe@J2Rz>CwQIqYcFGa#HBjn0kMYE)H ztfj~<0$h}n(W=#OR!|{;334$mMo<7C009gDrY0 z$OuPAO)9i=qh6W*_wY(P@IT&rp2imy6q>Wf!8IJQZ*|2UrZ;NI7P=n&wiz*>jt42E zR8nJaV>H$7HzhzgI%cTC+GdJCRHa5uzQ&eKASLW8DJ02$fC69*fa1y_GJpn2XaNjG zEx@Qtb7agHCW(OOxhaF(R8&=khytp~Y*qvf6oiHY9f%4Yg@`~^35hk2;^vA?W zQ2JJ-rn#{D3bGP9WDau^BUJ)#!rIJ-q`d6T1cX50_?m*VS z1C2NJIzyVepJ{(`KrCWI{(v~kOp^&Jm3Hh)EAEYVkM;o$F>-q=_a2nK=fCoxa=ogT zgaP!&kE&jK59Ur)8A-VKW_`hc_;mXSscw|N3_t(?1Li)$LyM=s4`5q1pI|=f^NF(JNo>}Uf z)hQj2!qgIK`|Ns8;K~`LIAo~47M==y1lJNz+$+xca(jJC*#pAW#l^MVG2oNj^5uRg(+|S2PD>|K z8aypMsPGh z44ErbQz7sX&zm0U@{yND^gA&h--OKiG?&BiUwGIP^-6SUEL(DAig9@< za+RHYpfbg4W^RmJex%Ky6+-~9h@C!6GA&Axw1{fADDyrc8AlY-+1DqBgRISgB?(+t z@U!ST&#o;#8S`@IPh{90-%HeE>Y&_qlI1?f9!|DNwFRb0?)?rF>1nq`UZv_KPNjQY zKU4ED+;t`D&ir%w6`wuQ^=}Mi2`f*3W_mpzQS;u?rQwSSb?7&I3M$^?RYfWzOZGI1 zqdaP)*|qEexHL4u(+K41a7QF*qrmDXJb7A=n!hL0$~KM;r{TDA$;wJr{5lHYPNi0x zT+_3nF5-E)VLp#Ep}&~7-5aj0RjBRn0hJDmaT8Po zG$xH1oR;8Yl22BZ;H-T-^f~EmRoPk-c6P_9ymO3_N~$RV=g_pEO zg-p_dfP}UkSxs1|2zcY-y@}BKKh)JA35;q>nBTCV)MliTwZ)@%w*<*wD7v2*#&L6# zla;pZkmAw1#=ANp>Pp`Q)^9bQ;bo~QE3JmMO(#lRms!NQxjXcs$1LN-niGTUPL_&~ zOQY+xXRP&7+gB8NvYar*#qsKV#gy_+N}QzEhRI`6z05sU7c}*0myai6&98l*iauRQ z`8^+pbq<=G{@s#fv1dO zE3M8rby%khy}Xx;JTf&D?Ri5NW3^2^m^5QNdJ?B&`Hqz|{E=EGzT>(xl|8JNl||D7 zWxoPc_!^RuR0=6dz|mt`cQce4X6RF@Yz!`4!EVD*DWEN)8fC_rqM$jRIW#1kc{-g@ zhFzE#Pjk!oob*N!t))HRgVdCdGvdlG61P%YpclfYr>fI@uhi-I-dHY{8>cN>9!@E` zjNo18vFM zcKm@L$3O;hg02i&I#~??t~u(8bncB-RpjJ{)8%+HQg4)>xE(5StFZZ!lhXw2yYO<$ zB46_V0I8hv&T-TB$N6Fgy-s+|>5H_CV(wnXbY3;P1ELDnru`Ai#Qy*%Y->Z?ZV|)W z4urNKQOUOaigLY?F;ORMyl&MIMwqe5yDBa!O{Kd_gl?LQZS6~fp#>HErWxm{>5mA5 z9M4m;GV*YVqQHWOLr`ruwIZTGstq7OE=$rjwhGgyT(hDk7#GlPj$L}`&xhmOq}tg& zN$@qv8YsW3a_{M6N0H0z30P$@p6J&m=5v2dEthkobF7~u>`7gUgd(FCCs9^Q*_1Q@ zfB*mh000J+rtK>7NW=g!3j{IFzc8l zgu;Om4W<8pNF=^Xg_ zWel!xZ+^!^n_6Stky^z!$k8xuY|FJpK$#QBxUouGJ@+$9djm~QhkFTdHU#P_FKxwJ z*w6!^SlKUt9h9uhxIO3%5ou8>iaibGip~Y z?~szyD*XvB@5laVe_#nlP-#h3t6suFZMwI0vKjye00l#PgYU<=JbQRl*-?)h{oA5{BBJ(;qApqZjn8ySK{}o0GXaWUwi%EujyXUvXOL~`(5&!@Jz0!Y%A;+CQK=1fhQ}U%ObDz@pOVsr~WMuZMJRA_$ zetUbJeLi{g`%V{rK=tF3YALq&N1gjzT1`FQW^E3x*8c#|4!B2Dy^hRlV}qp2^Kv@u zk3tHN6aY+{NT6~^TQi#^r>d3tvsg;icObScTbau$OOqGWsP4e(u{Lw8>Q9lpsd5JD zNTky_K5}nnTylEs2J)&SRqTx3ME!>urPvG9ic)p5A}%G`NCf?P7PPyQFR7B_>IRXT z?!mqGW^^iRa5mIEyO=rdH83|xP})Xum5*1b6}s*x#^@|=NFp1dU4~0a>ti372CdMw z7`e&tCnnb6T1mU(V1qJ*{-&9%H=0NetXrc_35un$Pk@1uCR1vR<+|7oF0&=z&FLC7 z#@0TQ8tkBse!Cya>9Q_$SN9ILD#w9GyNU|a1XG@*lfA6%OJmLWSIm|za%raa_B}KJ z&{0SN5SUZGL)h6{pKpKVILBvxEe81%1GShrzSb->q<~{#oL;lF?Pqa3?}!yhy)bz32>H z6idX>(hUK|;K^`198)3V1CgOo(($hZJbnPdp;6G_l3m|$#~4QOx&9m99#NeL>xq5iydbpR9CxbLyC#iX| z>pud}*8*Ci?{v+cDKE9(xiuxs8Fn*ytnbNMo8__n58N~^%&gF)*K?z%>nDZwYre-e znIUe9&;J0AXCK9&+KiXv=!a2@BdEz*^*jYleaSxz6q@0g$luPsia8?w)>4c&w3~g; zpN?t6i9chb4_h?qPhs&{{Xg5+i+JU;bZGLlw>WV1vB@8$Z{0q}N6m#T)w4LVMN@aW|Dg39pTHq?{s73jsOChVDWvEg+6bnrUKbC2~sY#ml9!Y@@f+Qufe zj#)24;X9QkXOc0O+V>|M`>mg;721rmzodBP+Vn0-HNaPslRAG)B%Aa+zN0goZg1*s z((sQ*t&BQcu5pc8*)A;eHt)C?;gw3eKkj-R7G;k;wAyN#M<#{f*A7>QD#((1RRPoS zZh{zKv*C`E-_;fU(dBtQlcDON)J3M!t|HGDt?8Z)s&P%}ZsUFcP~9(L?Wof4 gy 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 + + + diff --git a/web/src/web_root/index.html b/web/src/web_root/index.html new file mode 100644 index 0000000000..46e84a83cd --- /dev/null +++ b/web/src/web_root/index.html @@ -0,0 +1,20 @@ + + + + + +

Apps

+
+ +

Examples

+ + + diff --git a/web/src/web_root/osm_viewer.html b/web/src/web_root/osm_viewer.html new file mode 100644 index 0000000000..a862d49207 --- /dev/null +++ b/web/src/web_root/osm_viewer.html @@ -0,0 +1,23 @@ + + + + + + + + +
+
+

OSM Viewer

+
+
+ + + diff --git a/web/src/web_root/santa.html b/web/src/web_root/santa.html new file mode 100644 index 0000000000..43a9badc7a --- /dev/null +++ b/web/src/web_root/santa.html @@ -0,0 +1,24 @@ + + + + + + + + +
+
+

Fifteen Minute Santa

+
+
+ + + diff --git a/web/src/web_root/widgetry_demo.html b/web/src/web_root/widgetry_demo.html new file mode 100644 index 0000000000..0d57a10a34 --- /dev/null +++ b/web/src/web_root/widgetry_demo.html @@ -0,0 +1,21 @@ + + + + + + + + +
+

Widgetry Demo

+
+ + + diff --git a/web/src/widgetry.ts b/web/src/widgetry.ts new file mode 100644 index 0000000000..575ba59be1 --- /dev/null +++ b/web/src/widgetry.ts @@ -0,0 +1,363 @@ +// WidgetryApp is a wrapper for a rust Widgetry app which has been compiled to a wasm package using wasm_bindgen. +// +// The type signatures of `InitInput` and `initializeWasm` were copy/pasted from the wasm_bindgen +// generated ts.d files. They should be stable, unless wasm_bindgen has breaking changes. +export type InitInput = + | RequestInfo + | URL + | Response + | BufferSource + | WebAssembly.Module; + +export abstract class WidgetryApp { + private appLoader: AppLoader; + private _assetsBaseURL: string; + private _assetsAreGzipped: boolean; + + public constructor(domId: string) { + this.appLoader = new AppLoader(this, domId); + + // Assume a default relative path to where we can find the "system" dir + // Overide with `myApp.setAssetsBaseURL('path/to/dir')` + this._assetsBaseURL = "./data"; + + // Assume files are gzipped unless on localhost. + // Overide with `myApp.setAssetsAreGzipped(true)` + this._assetsAreGzipped = !isLocalhost; + } + + public async loadAndStart() { + this.appLoader.loadAndStart(); + } + + // Assets (the "system" dir) are assumed to be at "./data" relative + // to the current URL. Otherwise override with `setAssetsBaseURL`. + public assetsBaseURL(): string { + return this._assetsBaseURL; + } + + public setAssetsBaseURL(newValue: string) { + this._assetsBaseURL = newValue; + } + + // Assets are assumed to gzipped, unless on localhost + public assetsAreGzipped(): boolean { + return this._assetsAreGzipped; + } + + public setAssetsAreGzipped(newValue: boolean) { + this._assetsAreGzipped = newValue; + } + + abstract initializeWasm( + module_or_path?: InitInput | Promise + ): Promise; + abstract run( + rootDomId: string, + assetsBaseURL: string, + assetsAreGzipped: boolean + ): void; + abstract wasmURL(): string; +} + +enum LoadState { + unloaded, + loading, + loaded, + starting, + started, + error, +} + +/** + * Helper class used by `WidgetryApp` implementations to load their wasm and + * render their content. + */ +export class AppLoader { + app: WidgetryApp; + el: HTMLElement; + loadingEl?: HTMLElement; + errorEl?: HTMLElement; + domId: string; + state: LoadState = LoadState.unloaded; + // (receivedLength, totalLength) + downloadProgress?: [number, number]; + errorMessage?: string; + + public constructor(app: WidgetryApp, domId: string) { + this.app = app; + this.domId = domId; + const el = document.getElementById(domId); + if (el === null) { + throw new Error(`element with domId: ${domId} not found`); + } + this.el = el; + console.log("sim constructor", this); + } + + public async loadAndStart() { + this.render(); + try { + await this.load(); + await this.start(); + } catch (e) { + this.reportErrorState(e.toString()); + throw e; + } + } + + async load() { + console.assert(this.state == LoadState.unloaded, "already loaded"); + this.updateState(LoadState.loading); + + console.log("Started loading WASM"); + const t0 = performance.now(); + let response: Response = await fetch(this.app.wasmURL()); + + if (response.body == null) { + this.reportErrorState("response.body was unexpectedly null"); + return; + } + let reader = response.body.getReader(); + + let contentLength = response.headers.get("Content-Length"); + if (contentLength == undefined) { + this.reportErrorState( + "unable to fetch wasm - contentLength was unexpectedly undefined" + ); + return; + } + + if (response.status == 404) { + this.reportErrorState( + `server misconfiguration, wasm file not found: ${this.app.wasmURL()}` + ); + return; + } + + this.downloadProgress = [0, parseInt(contentLength)]; + + let chunks: Uint8Array[] = []; + while (true) { + const { done, value } = await reader.read(); + if (done) { + break; + } + if (value == undefined) { + console.error("reader value was unexpectedly undefined"); + break; + } + chunks.push(value); + this.downloadProgress[0] += value.length; + this.render(); + } + let blob = new Blob(chunks); + let buffer = await blob.arrayBuffer(); + const t1 = performance.now(); + console.log(`It took ${t1 - t0} ms to download WASM, now initializing it`); + + // TODO: Prefer streaming instantiation where available (not safari)? Seems like it'd be faster. + // const { instance } = await WebAssembly.instantiateStreaming(response, imports); + + //let imports = {}; + //let instance = await WebAssembly.instantiate(bytes, imports); + + await this.app.initializeWasm(buffer); + this.updateState(LoadState.loaded); + } + + async start() { + console.assert(this.state == LoadState.loaded, "not yet loaded"); + this.updateState(LoadState.starting); + try { + console.log( + `running app with assetsBaseURL: ${this.app.assetsBaseURL()}, assetsAreGzipped: ${this.app.assetsAreGzipped()}` + ); + this.app.run( + this.domId, + this.app.assetsBaseURL(), + this.app.assetsAreGzipped() + ); + } catch (e) { + if ( + e.toString() == + "Error: Using exceptions for control flow, don't mind me. This isn't actually an error!" + ) { + // This is an expected, albeit unfortunate, control flow mechanism for winit on wasm. + this.updateState(LoadState.started); + } else { + throw e; + } + } + } + + isWebGL1Supported(): boolean { + try { + var canvas = document.createElement("canvas"); + return !!canvas.getContext("webgl"); + } catch (e) { + return false; + } + } + + isWebGL2Supported(): boolean { + try { + var canvas = document.createElement("canvas"); + return !!canvas.getContext("webgl2"); + } catch (e) { + return false; + } + } + + updateState(newValue: LoadState) { + console.debug( + `state change: ${LoadState[this.state]} -> ${LoadState[newValue]}` + ); + this.state = newValue; + this.render(); + } + + reportErrorState(errorMessage: string) { + this.errorMessage = errorMessage; + this.updateState(LoadState.error); + } + + // UI + + render() { + this.el.style.backgroundColor = "black"; + + switch (this.state) { + case LoadState.loading: { + if (this.loadingEl == undefined) { + this.loadingEl = buildLoadingEl(); + // insert after rendering initial progress to avoid jitter. + this.el.append(this.loadingEl); + } + + if (this.downloadProgress != undefined) { + let received = this.downloadProgress[0]; + let total = this.downloadProgress[1]; + let progressText = `${prettyPrintBytes( + received + )} / ${prettyPrintBytes(total)}`; + let percentText = `${(100.0 * received) / total}%`; + this.loadingEl.querySelector( + ".widgetry-app-loader-progress-text" + )!.innerText = progressText; + this.loadingEl.querySelector( + ".widgetry-app-loader-progress-bar" + )!.style.width = percentText; + } + + break; + } + case LoadState.error: { + if (this.loadingEl != undefined) { + this.loadingEl.remove(); + this.loadingEl = undefined; + } + + if (this.errorEl == undefined) { + if (!this.isWebGL1Supported() && !this.isWebGL2Supported()) { + this.errorMessage = + this.errorMessage + + "😭 Looks like your browser doesn't support WebGL."; + } + + if (this.errorMessage == undefined) { + this.errorMessage = + "An unknown error occurred. Try checking the developer console."; + } + + let el = buildErrorEl(this.errorMessage); + this.errorEl = el; + this.el.append(el); + } + + break; + } + } + } +} + +export function modRoot(importMetaURL: string): string { + function dirname(path: string): string { + return path.match(/.*\//)!.toString(); + } + + let url = new URL(importMetaURL); + url.pathname = dirname(url.pathname).toString(); + return url.toString(); +} + +function buildLoadingEl(): HTMLElement { + let loadingEl = document.createElement("div"); + loadingEl.innerHTML = ` + +

Loading...

+
+
+
+
0 / 0
+

If you think something has broken, check your browser's developer console (Ctrl+Shift+I or similar)

+

(Your browser must support WebGL and WebAssembly)

+ `; + loadingEl.setAttribute("class", "widgetry-app-loader"); + + return loadingEl; +} + +function buildErrorEl(errorMessage: string): HTMLElement { + let el = document.createElement("p"); + el.innerHTML = ` + +

Error Loading App

+ ${errorMessage} + `; + el.setAttribute("class", "widgetry-app-loader-error"); + + return el; +} + +function prettyPrintBytes(bytes: number): string { + if (bytes < 1024 ** 2) { + return Math.round(bytes / 1024) + " KB"; + } + return Math.round(bytes / 1024 ** 2) + " MB"; +} + +// courtesy: https://stackoverflow.com/a/57949518 +const isLocalhost = Boolean( + window.location.hostname === "localhost" || + window.location.hostname === "0.0.0.0" || + // [::1] is the IPv6 localhost address. + window.location.hostname === "[::1]" || + // 127.0.0.1/8 is considered localhost for IPv4. + window.location.hostname.match( + /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/ + ) +); diff --git a/web/src/widgetry_demo/widgetry_demo.ts b/web/src/widgetry_demo/widgetry_demo.ts new file mode 100644 index 0000000000..fe40bd8cfb --- /dev/null +++ b/web/src/widgetry_demo/widgetry_demo.ts @@ -0,0 +1,20 @@ +import * as wasm_pkg from "./wasm_pkg/widgetry_demo.js"; +let wasm_bg_path = "wasm_pkg/widgetry_demo_bg.wasm"; + +import { InitInput, modRoot, WidgetryApp } from "../widgetry.js"; + +export class WidgetryDemo extends WidgetryApp { + initializeWasm( + module_or_path?: InitInput | Promise + ): Promise { + return wasm_pkg.default(module_or_path); + } + + run(rootDomId: string, assetsBaseURL: string, assetsAreGzipped: boolean) { + wasm_pkg.run(rootDomId, assetsBaseURL, assetsAreGzipped); + } + + wasmURL(): string { + return modRoot(import.meta.url) + wasm_bg_path; + } +} diff --git a/widgetry/src/assets.rs b/widgetry/src/assets.rs index 3df643eb55..4cd03042a3 100644 --- a/widgetry/src/assets.rs +++ b/widgetry/src/assets.rs @@ -22,10 +22,17 @@ pub struct Assets { pub(crate) style: RefCell - - -
-

Widgetry Demo

- - -
- - diff --git a/widgetry_demo/pkg/index.html b/widgetry_demo/pkg/index.html deleted file mode 120000 index 79c5d6f02c..0000000000 --- a/widgetry_demo/pkg/index.html +++ /dev/null @@ -1 +0,0 @@ -../index.html \ No newline at end of file diff --git a/widgetry_demo/run_web.sh b/widgetry_demo/run_web.sh deleted file mode 100755 index 01f1f62d1c..0000000000 --- a/widgetry_demo/run_web.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash - -set -e -wasm-pack build --dev --target web -- --no-default-features --features wasm -cd pkg -python3 -m http.server 8000 diff --git a/widgetry_demo/src/lib.rs b/widgetry_demo/src/lib.rs index 5c7af64456..bcfa9fa769 100644 --- a/widgetry_demo/src/lib.rs +++ b/widgetry_demo/src/lib.rs @@ -7,30 +7,33 @@ use geom::{Angle, Duration, Percent, Polygon, Pt2D, Time}; use widgetry::{ lctrl, Choice, Color, ContentMode, Drawable, EventCtx, Fill, GeomBatch, GfxCtx, HorizontalAlignment, Image, Key, Line, LinePlot, Outcome, Panel, PersistentSplit, PlotOptions, - ScreenDims, Series, SharedAppState, State, TabController, Text, TextExt, Texture, Toggle, - Transition, UpdateType, VerticalAlignment, Widget, + ScreenDims, Series, Settings, SharedAppState, State, TabController, Text, TextExt, Texture, + Toggle, Transition, UpdateType, VerticalAlignment, Widget, }; pub fn main() { // Use this to initialize logging. abstutil::CmdArgs::new().done(); + let settings = Settings::new("widgetry demo"); + run(settings); +} + +fn run(mut settings: Settings) { + settings = settings.read_svg(Box::new(abstio::slurp_bytes)); // Control flow surrendered here. App implements State, which has an event handler and a draw // callback. // // TODO The demo loads a .svg file, so to make it work on both native and web, for now we use // read_svg. But we should have a more minimal example of how to do that here. - widgetry::run( - widgetry::Settings::new("widgetry demo").read_svg(Box::new(abstio::slurp_bytes)), - |ctx| { - // TODO: remove Style::pregame and make light_bg the default. - ctx.set_style(widgetry::Style::light_bg()); - // TODO: Add a toggle to switch theme in demo (and recreate UI in that new theme) - // ctx.set_style(widgetry::Style::dark_bg()); + widgetry::run(settings, |ctx| { + // TODO: remove Style::pregame and make light_bg the default. + ctx.set_style(widgetry::Style::light_bg()); + // TODO: Add a toggle to switch theme in demo (and recreate UI in that new theme) + // ctx.set_style(widgetry::Style::dark_bg()); - (App {}, vec![Box::new(Demo::new(ctx))]) - }, - ); + (App {}, vec![Box::new(Demo::new(ctx))]) + }); } struct App {} @@ -608,7 +611,13 @@ fn make_controls(ctx: &mut EventCtx, tabs: &mut TabController) -> Panel { use wasm_bindgen::prelude::*; #[cfg(target_arch = "wasm32")] -#[wasm_bindgen(start)] -pub fn run() { - main(); +#[wasm_bindgen(js_name = "run")] +pub fn run_wasm(root_dom_id: String, assets_base_url: String, assets_are_gzipped: bool) { + // Use this to initialize logging. + abstutil::CmdArgs::new().done(); + let settings = Settings::new("widgetry demo") + .root_dom_element_id(root_dom_id) + .assets_base_url(assets_base_url) + .assets_are_gzipped(assets_are_gzipped); + run(settings); }

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 literal 0 HcmV?d00001 diff --git a/web/src/web_root/fifteen_min.html b/web/src/web_root/fifteen_min.html new file mode 100644 index 0000000000..068932fc56 --- /dev/null +++ b/web/src/web_root/fifteen_min.html @@ -0,0 +1,22 @@ + + + + + + + +