From 2bf3b6c9246e6f288e68db3dbf51b4574b7a1506 Mon Sep 17 00:00:00 2001 From: cmontella Date: Sun, 22 Jan 2023 22:22:15 -0500 Subject: [PATCH 01/84] Move start maestro to program --- src/lib.rs | 107 ----------------------------------------------------- 1 file changed, 107 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index cd08fa0..7d567ae 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -43,113 +43,6 @@ lazy_static! { //extern crate nom; -pub fn start_maestro(mech_socket_address: String, formatted_address: String, maestro_address: String, websocket_address: String, mech_client_channel: Sender) -> Result,MechError> { - - mech_client_channel.send(RunLoopMessage::String((format!("Core socket started at: {}", mech_socket_address.clone()),None))); - - let mech_client_channel_ws = mech_client_channel.clone(); - let mech_client_channel_heartbeat = mech_client_channel.clone(); - - let core_thread = thread::Builder::new().name("Core socket".to_string()).spawn(move || { - // A socket bound to 3235 is the maestro. It will be the one other cores search for - 'socket_loop: loop { - match UdpSocket::bind(maestro_address.clone()) { - // The maestro core - Ok(socket) => { - mech_client_channel.send(RunLoopMessage::String((format!("{} Socket started at: {}", "[Maestro]".truecolor(246,192,78), maestro_address),None))); - let mut buf = [0; 16_383]; - // Heartbeat thread periodically checks to see how long it's been since we've last heard from each remote core - thread::Builder::new().name("Heartbeat".to_string()).spawn(move || { - loop { - thread::sleep(Duration::from_millis(500)); - let now = SystemTime::now(); - let mut core_map = CORE_MAP.lock().unwrap(); - // If a core hasn't been heard from since 1 second ago, disconnect it. - for (_, (remote_core_address, _)) in core_map.drain_filter(|_k,(_, last_seen)| now.duration_since(*last_seen).unwrap().as_secs_f32() > 1.0) { - mech_client_channel_heartbeat.send(RunLoopMessage::RemoteCoreDisconnect(hash_str(&remote_core_address.to_string()))); - } - } - }); - // TCP socket thread for websocket connections - thread::Builder::new().name("TCP Socket".to_string()).spawn(move || { - let server = Server::bind(websocket_address.clone()).unwrap(); - mech_client_channel_ws.send(RunLoopMessage::String((format!("{} Websocket server started at: {}","[Maestro]".truecolor(246,192,78), &websocket_address),None))); - for request in server.filter_map(Result::ok) { - let mut ws_stream = request.accept().unwrap(); - let address = ws_stream.peer_addr().unwrap(); - mech_client_channel_ws.send(RunLoopMessage::RemoteCoreConnect(MechSocket::WebSocket(ws_stream))); - } - }); - - // Loop to receive UDP messages from remote cores - loop { - let (amt, src) = socket.recv_from(&mut buf).unwrap(); - let now = SystemTime::now(); - let message: Result = bincode::deserialize(&buf); - match message { - // If a remote core connects, send a connection message back to it - Ok(SocketMessage::RemoteCoreConnect(remote_core_address)) => { - CORE_MAP.lock().unwrap().insert(src,(remote_core_address.clone(), SystemTime::now())); - mech_client_channel.send(RunLoopMessage::RemoteCoreConnect(MechSocket::UdpSocket(remote_core_address))); - let message = bincode::serialize(&SocketMessage::RemoteCoreConnect(mech_socket_address.clone())).unwrap(); - let len = socket.send_to(&message, src.clone()).unwrap(); - }, - Ok(SocketMessage::Ping) => { - let mut core_map = CORE_MAP.lock().unwrap(); - match core_map.get_mut(&src) { - Some((_, last_seen)) => { - *last_seen = now; - } - None => (), - } - let message = bincode::serialize(&SocketMessage::Pong).unwrap(); - let len = socket.send_to(&message, src).unwrap(); - }, - _ => (), - } - } - } - // Maestro port is already bound, start a remote core - Err(_) => { - let socket = UdpSocket::bind(formatted_address.clone()).unwrap(); - let message = bincode::serialize(&SocketMessage::RemoteCoreConnect(mech_socket_address.clone().to_string())).unwrap(); - // Send a remote core message to the maestro - let len = socket.send_to(&message, maestro_address.clone()).unwrap(); - let mut buf = [0; 16_383]; - loop { - let message = bincode::serialize(&SocketMessage::Ping).unwrap(); - let len = socket.send_to(&message, maestro_address.clone()).unwrap(); - match socket.recv_from(&mut buf) { - Ok((amt, src)) => { - let now = SystemTime::now(); - if src.to_string() == maestro_address { - let message: Result = bincode::deserialize(&buf); - match message { - Ok(SocketMessage::Pong) => { - thread::sleep(Duration::from_millis(500)); - // Maestro is still alive - }, - Ok(SocketMessage::RemoteCoreConnect(remote_core_address)) => { - CORE_MAP.lock().unwrap().insert(src,(remote_core_address.clone(), SystemTime::now())); - mech_client_channel.send(RunLoopMessage::RemoteCoreConnect(MechSocket::UdpSocket(remote_core_address))); - } - _ => (), - } - } - } - Err(_) => { - mech_client_channel_ws.send(RunLoopMessage::String(("Maestro has died.".to_string(),None))); - continue 'socket_loop; - } - } - } - } - } - } - }).unwrap(); - Ok(core_thread) -} - pub fn read_mech_files(mech_paths: &Vec) -> Result, MechError> { From f52aeabe14dd053218a20caab78d9793335cb6bd Mon Sep 17 00:00:00 2001 From: cmontella Date: Tue, 24 Jan 2023 23:02:38 -0500 Subject: [PATCH 02/84] upgrade core --- src/core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core b/src/core index 9bdc444..306fab1 160000 --- a/src/core +++ b/src/core @@ -1 +1 @@ -Subproject commit 9bdc4443f76d37d3ce9a72730d04d952d4ce784f +Subproject commit 306fab1536ff9f628ab5d7499683edcd038b7ac3 From b7a810fd6747bc4c616b3f6da7ca02ff924d150a Mon Sep 17 00:00:00 2001 From: cmontella Date: Sun, 29 Jan 2023 23:05:44 -0500 Subject: [PATCH 03/84] Upgrade program --- src/program | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/program b/src/program index cb747d8..37a633d 160000 --- a/src/program +++ b/src/program @@ -1 +1 @@ -Subproject commit cb747d838f3a5a71ae94dd9e6f1eb939ad074305 +Subproject commit 37a633dd2da36f1267508ca09b9c376f4115fed7 From dd4be708e0de13674c6f489274bc9d3618880fdd Mon Sep 17 00:00:00 2001 From: Xinhao Tang Date: Tue, 31 Jan 2023 23:41:33 -0500 Subject: [PATCH 04/84] merge local change --- src/bin/mech.rs | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/bin/mech.rs b/src/bin/mech.rs index 3669dc2..a715cc8 100644 --- a/src/bin/mech.rs +++ b/src/bin/mech.rs @@ -169,7 +169,12 @@ async fn main() -> Result<(), MechError> { .long("port") .value_name("PORT") .help("Sets the port for the server (default: 4041)") - .takes_value(true))) + .takes_value(true)) + .arg(Arg::with_name("stdio") + .long("stdio") + .value_name("STDIO") + .help("Start the server in stdio way") + .takes_value(false))) .subcommand(SubCommand::with_name("run") .about("Run a target folder or *.mec file") .arg(Arg::with_name("repl_mode") @@ -620,10 +625,15 @@ async fn main() -> Result<(), MechError> { // Run language server // ------------------------------------------------ } else if let Some(matches) = matches.subcommand_matches("langserver") { + let stdio_flag = matches.is_present("stdio"); let address = "localhost".to_owned(); let port = matches.value_of("port").unwrap_or("4041").to_string(); - println!("{} Starting language server at {}:{}", "[INFO]".truecolor(34,204,187), address, port); - mech_syntax::langserver::run_langserver(&address, &port).await?; + if stdio_flag { + mech_syntax::langserver::run_io_langserver().await?; + } else { + println!("{} Starting language server at {}:{}", "[INFO]".truecolor(34,204,187), address, port); + mech_syntax::langserver::run_tcp_langserver(&address, &port).await?; + } std::process::exit(0); None // ------------------------------------------------ From 4d96cc5cb401342fa3fb3471060727bd1d428c21 Mon Sep 17 00:00:00 2001 From: Xinhao Tang Date: Tue, 31 Jan 2023 23:42:13 -0500 Subject: [PATCH 05/84] update syntax module --- src/syntax | 2 +- syntax | 1 + utilities | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) create mode 160000 syntax create mode 160000 utilities diff --git a/src/syntax b/src/syntax index d225af7..337ca71 160000 --- a/src/syntax +++ b/src/syntax @@ -1 +1 @@ -Subproject commit d225af73f1fd07978364a3b5b5fff9a410a8b693 +Subproject commit 337ca7182eed886db9d76a506e68913081b1c52b diff --git a/syntax b/syntax new file mode 160000 index 0000000..337ca71 --- /dev/null +++ b/syntax @@ -0,0 +1 @@ +Subproject commit 337ca7182eed886db9d76a506e68913081b1c52b diff --git a/utilities b/utilities new file mode 160000 index 0000000..989db09 --- /dev/null +++ b/utilities @@ -0,0 +1 @@ +Subproject commit 989db09d0beb16b5e94ea03d05adcc15b3e1d5fa From d4c13b879d54ec75c14506d0c20d6db3c8da8d57 Mon Sep 17 00:00:00 2001 From: Haocheng Gao Date: Sun, 5 Feb 2023 16:11:51 -0500 Subject: [PATCH 06/84] Rename run_langserver function --- src/bin/mech.rs | 2 +- src/syntax | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bin/mech.rs b/src/bin/mech.rs index a715cc8..cbb1dd9 100644 --- a/src/bin/mech.rs +++ b/src/bin/mech.rs @@ -629,7 +629,7 @@ async fn main() -> Result<(), MechError> { let address = "localhost".to_owned(); let port = matches.value_of("port").unwrap_or("4041").to_string(); if stdio_flag { - mech_syntax::langserver::run_io_langserver().await?; + mech_syntax::langserver::run_stdio_langserver().await?; } else { println!("{} Starting language server at {}:{}", "[INFO]".truecolor(34,204,187), address, port); mech_syntax::langserver::run_tcp_langserver(&address, &port).await?; diff --git a/src/syntax b/src/syntax index 337ca71..08f7031 160000 --- a/src/syntax +++ b/src/syntax @@ -1 +1 @@ -Subproject commit 337ca7182eed886db9d76a506e68913081b1c52b +Subproject commit 08f70317cbac3ed91892d9b619a250d7aae44703 From 6013208f27cee278543deb01c21b85b06d7fbe8d Mon Sep 17 00:00:00 2001 From: Haocheng Gao Date: Tue, 7 Feb 2023 01:50:41 -0500 Subject: [PATCH 07/84] Update langserver subcommand --- src/bin/mech.rs | 50 ++++++++++++++++++++++++++++++++----------------- src/syntax | 2 +- 2 files changed, 34 insertions(+), 18 deletions(-) diff --git a/src/bin/mech.rs b/src/bin/mech.rs index cbb1dd9..edfc0eb 100644 --- a/src/bin/mech.rs +++ b/src/bin/mech.rs @@ -164,17 +164,31 @@ async fn main() -> Result<(), MechError> { .takes_value(false))) .subcommand(SubCommand::with_name("langserver") .about("Run a local mech language server") - .arg(Arg::with_name("port") - .short("p") - .long("port") - .value_name("PORT") - .help("Sets the port for the server (default: 4041)") - .takes_value(true)) .arg(Arg::with_name("stdio") + .conflicts_with("socket") + .short("o") .long("stdio") - .value_name("STDIO") - .help("Start the server in stdio way") - .takes_value(false))) + .help("Use stdio for server communciation. This is the default option") + .takes_value(false)) + .arg(Arg::with_name("socket") + .conflicts_with("stdio") + .short("p") + .long("socket") + .value_name("PORT") + .help("Use tcp socket at PORT for server communication") + .takes_value(true) + .validator(|s| match s.parse::() { + Ok(_) => Ok(()), + Err(_) => Err("Invalid port number".to_owned()), + })) + .arg(Arg::with_name("log") + .required(false) + .short("l") + .long("log") + .value_name("LEVEL") + .help("Specify log level (default: debug)") + .possible_values(&["off", "error", "warn", "info", "debug", "trace"]) + .takes_value(true))) .subcommand(SubCommand::with_name("run") .about("Run a target folder or *.mec file") .arg(Arg::with_name("repl_mode") @@ -625,14 +639,16 @@ async fn main() -> Result<(), MechError> { // Run language server // ------------------------------------------------ } else if let Some(matches) = matches.subcommand_matches("langserver") { - let stdio_flag = matches.is_present("stdio"); - let address = "localhost".to_owned(); - let port = matches.value_of("port").unwrap_or("4041").to_string(); - if stdio_flag { - mech_syntax::langserver::run_stdio_langserver().await?; - } else { - println!("{} Starting language server at {}:{}", "[INFO]".truecolor(34,204,187), address, port); - mech_syntax::langserver::run_tcp_langserver(&address, &port).await?; + let log_lvl = matches.value_of("log").unwrap_or(""); + match matches.value_of("socket") { + Some(port) => { + let address = "localhost"; + println!("{} Starting language server at {}:{}", "[INFO]".truecolor(34,204,187), address, port); + mech_syntax::langserver::run_tcp_langserver(address, port, log_lvl).await?; + }, + _ => { // stdio + mech_syntax::langserver::run_stdio_langserver(log_lvl).await?; + }, } std::process::exit(0); None diff --git a/src/syntax b/src/syntax index 08f7031..7afb268 160000 --- a/src/syntax +++ b/src/syntax @@ -1 +1 @@ -Subproject commit 08f70317cbac3ed91892d9b619a250d7aae44703 +Subproject commit 7afb268cb269ae10d5badb4a09a9439e5f8cfd16 From 575e248498753fb5a58ba065f760e51c6732402b Mon Sep 17 00:00:00 2001 From: Haocheng Gao Date: Tue, 7 Feb 2023 15:29:20 -0500 Subject: [PATCH 08/84] Simple goto definition implemented --- src/syntax | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/syntax b/src/syntax index 7afb268..c1d6823 160000 --- a/src/syntax +++ b/src/syntax @@ -1 +1 @@ -Subproject commit 7afb268cb269ae10d5badb4a09a9439e5f8cfd16 +Subproject commit c1d68233be7518f14f72ec2a00827c90d453a8d2 From 06c8d9e5fef0cc92f81135e05427ad5fd28a3082 Mon Sep 17 00:00:00 2001 From: cmontella Date: Tue, 14 Feb 2023 17:28:34 -0500 Subject: [PATCH 09/84] fix paths --- src/bin/mech.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bin/mech.rs b/src/bin/mech.rs index 3669dc2..430ee7e 100644 --- a/src/bin/mech.rs +++ b/src/bin/mech.rs @@ -282,7 +282,7 @@ async fn main() -> Result<(), MechError> { let mut headers = HeaderMap::new(); headers.insert("accept-ranges", HeaderValue::from_static("bytes")); headers.insert("content-type", HeaderValue::from_static("application/javascript")); - let nb = warp::path!("pkg" / "mech_notebook.js") + let nb = warp::path!("pkg" / "mech_wasm_notebook.js") .map(move || { mech_notebook }) @@ -291,7 +291,7 @@ async fn main() -> Result<(), MechError> { let mut headers = HeaderMap::new(); headers.insert("accept-ranges", HeaderValue::from_static("bytes")); headers.insert("content-type", HeaderValue::from_static("application/wasm")); - let pkg = warp::path!("pkg" / "mech_notebook_bg.wasm") + let pkg = warp::path!("pkg" / "mech_wasm_notebook_bg.wasm") .map(move || { mech_wasm.to_vec() }) From a8a7976a98626217807d4b7701deedb3313a2acf Mon Sep 17 00:00:00 2001 From: cmontella Date: Tue, 14 Feb 2023 17:35:47 -0500 Subject: [PATCH 10/84] fix paths --- src/bin/mech.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/mech.rs b/src/bin/mech.rs index 430ee7e..58625fc 100644 --- a/src/bin/mech.rs +++ b/src/bin/mech.rs @@ -282,7 +282,7 @@ async fn main() -> Result<(), MechError> { let mut headers = HeaderMap::new(); headers.insert("accept-ranges", HeaderValue::from_static("bytes")); headers.insert("content-type", HeaderValue::from_static("application/javascript")); - let nb = warp::path!("pkg" / "mech_wasm_notebook.js") + let nb = warp::path!("pkg" / "mech_notebook.js") .map(move || { mech_notebook }) From c32405c220756f4cd458277010391e773724d45a Mon Sep 17 00:00:00 2001 From: cmontella Date: Thu, 16 Feb 2023 15:36:50 -0500 Subject: [PATCH 11/84] fix core --- src/core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core b/src/core index 306fab1..c921b1c 160000 --- a/src/core +++ b/src/core @@ -1 +1 @@ -Subproject commit 306fab1536ff9f628ab5d7499683edcd038b7ac3 +Subproject commit c921b1cc2364b396607abdfdd84caf82b7ef46c7 From b356596af1a891d007e2f373268f30bf2de0595d Mon Sep 17 00:00:00 2001 From: cmontella Date: Thu, 16 Feb 2023 15:37:01 -0500 Subject: [PATCH 12/84] upgrade syntax --- src/syntax | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/syntax b/src/syntax index d225af7..cba0246 160000 --- a/src/syntax +++ b/src/syntax @@ -1 +1 @@ -Subproject commit d225af73f1fd07978364a3b5b5fff9a410a8b693 +Subproject commit cba024625498abf960454631d1e6b9e076f0fd32 From 33c1f9ccfaf136279db3e8278496ed75539ae8bf Mon Sep 17 00:00:00 2001 From: cmontella Date: Thu, 16 Feb 2023 15:37:17 -0500 Subject: [PATCH 13/84] upgrade notebook --- notebook | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notebook b/notebook index ad0bc5b..9b90468 160000 --- a/notebook +++ b/notebook @@ -1 +1 @@ -Subproject commit ad0bc5bfc6d312bed1a7ebdb7be8a347b3f44033 +Subproject commit 9b90468c66488bfdd00e763cbd898c8cb31bd1c7 From e75bbbf0e34e41d232f054a59d6607b16667eceb Mon Sep 17 00:00:00 2001 From: Haocheng Gao Date: Tue, 21 Feb 2023 15:31:48 -0500 Subject: [PATCH 14/84] Sync submodule versions --- src/core | 2 +- src/syntax | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core b/src/core index 306fab1..c450bec 160000 --- a/src/core +++ b/src/core @@ -1 +1 @@ -Subproject commit 306fab1536ff9f628ab5d7499683edcd038b7ac3 +Subproject commit c450bec0db19116a17d5b416047dc34de86b85e8 diff --git a/src/syntax b/src/syntax index c1d6823..2f3b6f1 160000 --- a/src/syntax +++ b/src/syntax @@ -1 +1 @@ -Subproject commit c1d68233be7518f14f72ec2a00827c90d453a8d2 +Subproject commit 2f3b6f135007377f2d9abdc27dce0a6811a4d002 From f7987a972c36376388d9de4cdacd3c7599248293 Mon Sep 17 00:00:00 2001 From: cmontella Date: Tue, 21 Feb 2023 22:27:26 -0500 Subject: [PATCH 15/84] write output files --- src/bin/mech.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/bin/mech.rs b/src/bin/mech.rs index 58625fc..bca640c 100644 --- a/src/bin/mech.rs +++ b/src/bin/mech.rs @@ -158,7 +158,7 @@ async fn main() -> Result<(), MechError> { .arg(Arg::with_name("html") .short("h") .long("html") - .value_name("Debug") + .value_name("HTML") .help("Format with HTML.") .required(false) .takes_value(false))) @@ -604,7 +604,13 @@ async fn main() -> Result<(), MechError> { }).collect::>(); for f in formatted_source { - println!("{}", f); + if html { + let mut file = File::create("index.html")?; + file.write_all(f.as_bytes())?; + } else { + let mut file = File::create("index.mec")?; + file.write_all(f.as_bytes())?; + } } std::process::exit(0); From 63c9b1eb9b308b0a06b44de94984d85829ee7dc3 Mon Sep 17 00:00:00 2001 From: cmontella Date: Thu, 23 Feb 2023 15:11:13 -0500 Subject: [PATCH 16/84] read in file names with files --- src/bin/mech.rs | 27 ++++++++++++++++++--------- src/lib.rs | 18 +++++++++--------- src/repl.rs | 1 + 3 files changed, 28 insertions(+), 18 deletions(-) diff --git a/src/bin/mech.rs b/src/bin/mech.rs index bca640c..593c81a 100644 --- a/src/bin/mech.rs +++ b/src/bin/mech.rs @@ -411,7 +411,7 @@ async fn main() -> Result<(), MechError> { let maestro_address: String = matches.value_of("maestro").unwrap_or("127.0.0.1:3235").to_string(); let websocket_address: String = matches.value_of("websocket").unwrap_or("127.0.0.1:3236").to_string(); - let mut code: Vec = match read_mech_files(&mech_paths) { + let mut code = match read_mech_files(&mech_paths) { Ok(code) => code, Err(mech_error) => { println!("{}",format_errors(&vec![mech_error])); @@ -531,7 +531,7 @@ async fn main() -> Result<(), MechError> { // ------------------------------------------------ } else if let Some(matches) = matches.subcommand_matches("build") { let mech_paths: Vec = matches.values_of("mech_build_file_paths").map_or(vec![], |files| files.map(|file| file.to_string()).collect()); - let mut code: Vec = match read_mech_files(&mech_paths) { + let mut code = match read_mech_files(&mech_paths) { Ok(code) => code, Err(mech_error) => { println!("{}",format_errors(&vec![mech_error])); @@ -572,7 +572,7 @@ async fn main() -> Result<(), MechError> { } else if let Some(matches) = matches.subcommand_matches("format") { let html = matches.is_present("html"); let mech_paths: Vec = matches.values_of("mech_format_file_paths").map_or(vec![], |files| files.map(|file| file.to_string()).collect()); - let mut code: Vec = match read_mech_files(&mech_paths) { + let mut code = match read_mech_files(&mech_paths) { Ok(code) => code, Err(mech_error) => { println!("{}",format_errors(&vec![mech_error])); @@ -582,7 +582,7 @@ async fn main() -> Result<(), MechError> { let mut source_trees = vec![]; - for c in code { + for (_,c) in code { match c { MechCode::String(source) => { let parse_tree = parser::parse(&source)?; @@ -603,17 +603,26 @@ async fn main() -> Result<(), MechError> { } }).collect::>(); - for f in formatted_source { + if formatted_source.len() == 1 { if html { let mut file = File::create("index.html")?; - file.write_all(f.as_bytes())?; + file.write_all(formatted_source[0].as_bytes())?; } else { let mut file = File::create("index.mec")?; - file.write_all(f.as_bytes())?; + file.write_all(formatted_source[0].as_bytes())?; + } + std::process::exit(0); + } else { + for f in formatted_source { + if html { + let mut file = File::create("index.html")?; + file.write_all(f.as_bytes())?; + } else { + let mut file = File::create("index.mec")?; + file.write_all(f.as_bytes())?; + } } } - std::process::exit(0); - None // ------------------------------------------------ // Clean diff --git a/src/lib.rs b/src/lib.rs index 7d567ae..cc6d712 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -44,12 +44,12 @@ lazy_static! { //extern crate nom; -pub fn read_mech_files(mech_paths: &Vec) -> Result, MechError> { +pub fn read_mech_files(mech_paths: &Vec) -> Result, MechError> { - let mut code: Vec = Vec::new(); + let mut code: Vec<(String,MechCode)> = Vec::new(); - let read_file_to_code = |path: &Path| -> Result, MechError> { - let mut code: Vec = Vec::new(); + let read_file_to_code = |path: &Path| -> Result, MechError> { + let mut code: Vec<(String,MechCode)> = Vec::new(); match (path.to_str(), path.extension()) { (Some(name), Some(extension)) => { match extension.to_str() { @@ -60,7 +60,7 @@ pub fn read_mech_files(mech_paths: &Vec) -> Result, MechEr let mut reader = BufReader::new(file); let mech_code: Result = bincode::deserialize_from(&mut reader); match mech_code { - Ok(c) => {code.push(c);}, + Ok(c) => {code.push((name.to_string(),c));}, Err(err) => { return Err(MechError{msg: "".to_string(), id: 1247, kind: MechErrorKind::GenericError(format!("{:?}", err))}); }, @@ -77,7 +77,7 @@ pub fn read_mech_files(mech_paths: &Vec) -> Result, MechEr println!("{} {}", "[Loading]".truecolor(153,221,85), name); let mut buffer = String::new(); file.read_to_string(&mut buffer); - code.push(MechCode::String(buffer)); + code.push((name.to_string(),MechCode::String(buffer))); } Err(err) => { return Err(MechError{msg: "".to_string(), id: 1249, kind: MechErrorKind::None}); @@ -100,7 +100,7 @@ pub fn read_mech_files(mech_paths: &Vec) -> Result, MechEr match reqwest::blocking::get(path.to_str().unwrap()) { Ok(response) => { match response.text() { - Ok(text) => code.push(MechCode::String(text)), + Ok(text) => code.push((path.to_str().unwrap().to_owned(),MechCode::String(text))), _ => {return Err(MechError{msg: "".to_string(), id: 1241, kind: MechErrorKind::None});}, } } @@ -128,12 +128,12 @@ pub fn read_mech_files(mech_paths: &Vec) -> Result, MechEr Ok(code) } -pub fn compile_code(code: Vec) -> Result>,MechError> { +pub fn compile_code(code: Vec<(String,MechCode)>) -> Result>,MechError> { print!("{}", "[Compiling] ".truecolor(153,221,85)); stdout().flush(); let mut sections = vec![]; let now = Instant::now(); - for c in code { + for (_,c) in code { match c { MechCode::MiniCores(cores) => { todo!() diff --git a/src/repl.rs b/src/repl.rs index 378fe0b..a63bf80 100644 --- a/src/repl.rs +++ b/src/repl.rs @@ -76,6 +76,7 @@ fn load(input: ParseString) -> ParseResult { let string = syntax::compiler::compile_text(&text).unwrap(); match read_mech_files(&vec![string.clone()]) { Ok(code) => { + let code = code.iter().map(|(_,c)| c).cloned().collect::>(); Ok((input, ReplCommand::Code(code))) } Err(err) => { From ae6b1ea051ee95ea348b0458908b02b74af1deb8 Mon Sep 17 00:00:00 2001 From: Haocheng Gao Date: Tue, 28 Feb 2023 13:01:09 -0500 Subject: [PATCH 17/84] "Release" Feb 28, 2023 --- src/core | 2 +- src/syntax | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core b/src/core index c450bec..422b3aa 160000 --- a/src/core +++ b/src/core @@ -1 +1 @@ -Subproject commit c450bec0db19116a17d5b416047dc34de86b85e8 +Subproject commit 422b3aa8ec03533a8d639a7ca77d97f2ae0c5f77 diff --git a/src/syntax b/src/syntax index 2f3b6f1..11c95a3 160000 --- a/src/syntax +++ b/src/syntax @@ -1 +1 @@ -Subproject commit 2f3b6f135007377f2d9abdc27dce0a6811a4d002 +Subproject commit 11c95a32447ffbdfece04902f2b120b0422f1e20 From dd07563dfc23028844e694cf0a68eb222652341e Mon Sep 17 00:00:00 2001 From: cmontella Date: Tue, 28 Feb 2023 15:46:42 -0500 Subject: [PATCH 18/84] update examples --- examples | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples b/examples index 2132f1f..09bea5a 160000 --- a/examples +++ b/examples @@ -1 +1 @@ -Subproject commit 2132f1fdd7499db7af68daa3df50ea04fe528a20 +Subproject commit 09bea5af93182765c391b48ba1e58cd96712a969 From 75b4247e1e2d25546d3f668145abd60f6143a251 Mon Sep 17 00:00:00 2001 From: cmontella Date: Tue, 28 Feb 2023 15:49:29 -0500 Subject: [PATCH 19/84] update examples --- examples | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples b/examples index 09bea5a..3113ed8 160000 --- a/examples +++ b/examples @@ -1 +1 @@ -Subproject commit 09bea5af93182765c391b48ba1e58cd96712a969 +Subproject commit 3113ed8244659a43708cfac28f4e559028feaa8e From ccd8ced27f58ad19bedef278986926e0164af895 Mon Sep 17 00:00:00 2001 From: Haocheng Gao Date: Thu, 2 Mar 2023 11:54:19 -0500 Subject: [PATCH 20/84] "Release" Mar 02, 2023 --- src/syntax | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/syntax b/src/syntax index 11c95a3..c86ee81 160000 --- a/src/syntax +++ b/src/syntax @@ -1 +1 @@ -Subproject commit 11c95a32447ffbdfece04902f2b120b0422f1e20 +Subproject commit c86ee81e0c46706d6c788ca28564edd2ba979e76 From 637ad6f211314779286db85e335d4bd374ef4f68 Mon Sep 17 00:00:00 2001 From: cmontella Date: Sat, 4 Mar 2023 19:16:42 -0500 Subject: [PATCH 21/84] update core --- src/core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core b/src/core index c921b1c..d6f1a89 160000 --- a/src/core +++ b/src/core @@ -1 +1 @@ -Subproject commit c921b1cc2364b396607abdfdd84caf82b7ef46c7 +Subproject commit d6f1a896642b99e57afabbeccdb3de4d2d78206b From 9bd8dd5bb423ab4671e7e3d9f89fbde653f46d38 Mon Sep 17 00:00:00 2001 From: cmontella Date: Sat, 4 Mar 2023 19:16:56 -0500 Subject: [PATCH 22/84] update syntax --- src/syntax | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/syntax b/src/syntax index cba0246..e8c4f62 160000 --- a/src/syntax +++ b/src/syntax @@ -1 +1 @@ -Subproject commit cba024625498abf960454631d1e6b9e076f0fd32 +Subproject commit e8c4f62a57f3f728ff9304adad9171fae5a87e68 From 98a6fb9747441878b4e600578abfbdc7ec40117e Mon Sep 17 00:00:00 2001 From: cmontella Date: Tue, 7 Mar 2023 14:46:16 -0500 Subject: [PATCH 23/84] update error message --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index cc6d712..72d378a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -87,7 +87,7 @@ pub fn read_mech_files(mech_paths: &Vec) -> Result (), // Do nothing if the extension is not recognized } }, - _ => {return Err(MechError{msg: "".to_string(), id: 1250, kind: MechErrorKind::None});}, + err => {return Err(MechError{msg: "".to_string(), id: 1250, ind: MechErrorKind::GenericError(format!("{:?}", err))});}, } Ok(code) }; From b0d644348d4231159959b39a6c9128f0422a7113 Mon Sep 17 00:00:00 2001 From: cmontella Date: Tue, 7 Mar 2023 14:46:35 -0500 Subject: [PATCH 24/84] upgrade syntax --- src/syntax | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/syntax b/src/syntax index e8c4f62..0a0197e 160000 --- a/src/syntax +++ b/src/syntax @@ -1 +1 @@ -Subproject commit e8c4f62a57f3f728ff9304adad9171fae5a87e68 +Subproject commit 0a0197e0abdea5c3023437e8ce8b1ea562400bec From 2e7b2efc50efd5c62f282a62eda6083805d6cb97 Mon Sep 17 00:00:00 2001 From: cmontella Date: Thu, 9 Mar 2023 18:22:17 -0500 Subject: [PATCH 25/84] show more info in message --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 72d378a..a3a218e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -87,7 +87,7 @@ pub fn read_mech_files(mech_paths: &Vec) -> Result (), // Do nothing if the extension is not recognized } }, - err => {return Err(MechError{msg: "".to_string(), id: 1250, ind: MechErrorKind::GenericError(format!("{:?}", err))});}, + err => {return Err(MechError{msg: "".to_string(), id: 1250, kind: MechErrorKind::GenericError(format!("{:?}", err))});}, } Ok(code) }; From 6fd407e38ea4de5cfb42125846415fd8a99730c2 Mon Sep 17 00:00:00 2001 From: cmontella Date: Thu, 9 Mar 2023 20:29:30 -0500 Subject: [PATCH 26/84] upgrade syntax --- src/syntax | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/syntax b/src/syntax index 0a0197e..c149645 160000 --- a/src/syntax +++ b/src/syntax @@ -1 +1 @@ -Subproject commit 0a0197e0abdea5c3023437e8ce8b1ea562400bec +Subproject commit c149645cfc769d21dfa130d5dd4244955a8b5bc3 From b1419d642c3cf4eb0ef6735f504b622e69b6a61d Mon Sep 17 00:00:00 2001 From: cmontella Date: Thu, 9 Mar 2023 20:29:45 -0500 Subject: [PATCH 27/84] upgrade examples --- examples | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples b/examples index 3113ed8..b43d1db 160000 --- a/examples +++ b/examples @@ -1 +1 @@ -Subproject commit 3113ed8244659a43708cfac28f4e559028feaa8e +Subproject commit b43d1dbd7f09a774dfc503ae9a39e4b6c10b563a From 23e74768f916fd700a041552c0e65555dfedaade Mon Sep 17 00:00:00 2001 From: cmontella Date: Thu, 9 Mar 2023 23:18:12 -0500 Subject: [PATCH 28/84] fix more tests --- src/syntax | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/syntax b/src/syntax index c149645..7403591 160000 --- a/src/syntax +++ b/src/syntax @@ -1 +1 @@ -Subproject commit c149645cfc769d21dfa130d5dd4244955a8b5bc3 +Subproject commit 740359180897aee0a94b0833c26c1cea2a871080 From cf05059dbd192c75e73bf61dc859975939c15723 Mon Sep 17 00:00:00 2001 From: cmontella Date: Fri, 10 Mar 2023 16:07:29 -0500 Subject: [PATCH 29/84] update roadmap --- ROADMAP.md | 60 ++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 43 insertions(+), 17 deletions(-) diff --git a/ROADMAP.md b/ROADMAP.md index b5b722a..3a4a1d9 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -7,42 +7,49 @@ Implementation: started 2018 ### Stage 2 - Beta v0.1.0 - ? -Target release date: Fall 2022 +Released: December 2022 ### Stage 3 - Stable v1.0.0 Target release date: ??? -## Version 0.2.0 (Spring 2023?) +## Version 0.3.0 (Maybe Fall 2024?) - [ ] GPGPU Runtime - [ ] Automatic Differentiation - [ ] Capability system + +## Version 0.2.0 (Fall 2023) + +- [ ] Distributed Runtime Improvements - [ ] Persistence - [ ] Time travel debugging +- [ ] More complete examples + - Machines - [ ] JSON - [ ] Sockets - [ ] Serial - [ ] Bluetooth + - [ ] Audio + - [ ] Maps + - [ ] ChatGPT? -## Version 0.1.0 (Fall 2022) +## Version 0.1.1 (Summer 2023) -- [x] User defined functions -- [x] Errors -- [x] Distribution -- [x] Paralell operators -- [x] Async blocks -- [x] Units -- [x] Type checking -- [x] Multiple dispatch -- [x] JIT Block Compiler -- [x] Native executables -- [x] REPL -- Machines - - [x] Matrix - - [x] GUI +- Language Server + - [ ] Syntax Highlighter + - [ ] Autocomplete + - [ ] Goto Definition + - [ ] Goto Docs + - [ ] Hover inspector + - [ ] Workspace support + - [ ] Database expolorer - Editor + - [ ] Compile programs + - [ ] Start and stop cores + - [ ] Save and load programs + - [ ] Workspace explorer - [ ] Database Explorer - [ ] API endpoint server - Docs @@ -58,6 +65,25 @@ Target release date: ??? - [ ] Homepage - [ ] Blog - [ ] Try +- Machines + - [x] Fleshed out gui + +## Version 0.1.0 (December 2022) + +- [x] User defined functions +- [x] Errors +- [x] Distribution +- [x] Paralell operators +- [x] Async blocks +- [x] Units +- [x] Type checking +- [x] Multiple dispatch +- [x] JIT Block Compiler +- [x] Native executables +- [x] REPL +- Machines + - [x] Matrix + - [x] GUI ## Version 0.0.6 Alpha (unreleased) From 1beae6c03447649423898baa9191892465640384 Mon Sep 17 00:00:00 2001 From: cmontella Date: Fri, 10 Mar 2023 22:16:44 -0500 Subject: [PATCH 30/84] upgrade syntax --- src/syntax | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/syntax b/src/syntax index 7403591..c0d4e04 160000 --- a/src/syntax +++ b/src/syntax @@ -1 +1 @@ -Subproject commit 740359180897aee0a94b0833c26c1cea2a871080 +Subproject commit c0d4e043f16c53d2e5a424897872be16ec5b4141 From 439b9c5870327541e68cc1af9801b8256107c07a Mon Sep 17 00:00:00 2001 From: cmontella Date: Fri, 10 Mar 2023 22:17:18 -0500 Subject: [PATCH 31/84] upgrade core --- src/core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core b/src/core index d6f1a89..cba3de1 160000 --- a/src/core +++ b/src/core @@ -1 +1 @@ -Subproject commit d6f1a896642b99e57afabbeccdb3de4d2d78206b +Subproject commit cba3de15ffde24ee3711b0eeb83a3dd921223cf8 From 66140e0d0f83fa1027a333c98fb20d9b21622bf5 Mon Sep 17 00:00:00 2001 From: cmontella Date: Fri, 10 Mar 2023 23:22:31 -0500 Subject: [PATCH 32/84] update packags --- src/program | 2 +- src/syntax | 2 +- src/utilities | 2 +- src/wasm | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/program b/src/program index 37a633d..85ef08e 160000 --- a/src/program +++ b/src/program @@ -1 +1 @@ -Subproject commit 37a633dd2da36f1267508ca09b9c376f4115fed7 +Subproject commit 85ef08ef5e1578fee8d20c2450c279915be1f437 diff --git a/src/syntax b/src/syntax index c0d4e04..36bdc61 160000 --- a/src/syntax +++ b/src/syntax @@ -1 +1 @@ -Subproject commit c0d4e043f16c53d2e5a424897872be16ec5b4141 +Subproject commit 36bdc61dd0935d678ff87a9d4570ef9fbb4d96b5 diff --git a/src/utilities b/src/utilities index 989db09..8bf8654 160000 --- a/src/utilities +++ b/src/utilities @@ -1 +1 @@ -Subproject commit 989db09d0beb16b5e94ea03d05adcc15b3e1d5fa +Subproject commit 8bf865484bcd749f3905c38053c6409035961a41 diff --git a/src/wasm b/src/wasm index 4df9cd9..30e0c80 160000 --- a/src/wasm +++ b/src/wasm @@ -1 +1 @@ -Subproject commit 4df9cd9f59bb0656c7f22c5e42e2220bbac0755a +Subproject commit 30e0c809bafa2510ded8dfa269921245e85ebb16 From a70e42dc89bb1df99039a14b6e67e1941720fea0 Mon Sep 17 00:00:00 2001 From: cmontella Date: Fri, 10 Mar 2023 23:24:33 -0500 Subject: [PATCH 33/84] test syntax --- .gitlab-ci.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b4eaad8..a9da159 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -7,4 +7,6 @@ test:cargo: - rustup default nightly-2022-08-25 - wasm-pack build wasm-notebook --target web - cargo build --bin mech --release - - ./target/release/mech test tests \ No newline at end of file + - ./target/release/mech test tests + - cd src/syntax + - cargo test \ No newline at end of file From dbb8a0cd97202f31d46aefd8de78cccad5ff42f5 Mon Sep 17 00:00:00 2001 From: cmontella Date: Fri, 10 Mar 2023 23:31:52 -0500 Subject: [PATCH 34/84] test in release mode --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a9da159..9805e8a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -9,4 +9,4 @@ test:cargo: - cargo build --bin mech --release - ./target/release/mech test tests - cd src/syntax - - cargo test \ No newline at end of file + - cargo test --release \ No newline at end of file From db7aa1d396044408d61d07e229c5636a87944eba Mon Sep 17 00:00:00 2001 From: cmontella Date: Sun, 12 Mar 2023 21:39:41 -0400 Subject: [PATCH 35/84] update roadmap with plot machine --- ROADMAP.md | 1 + 1 file changed, 1 insertion(+) diff --git a/ROADMAP.md b/ROADMAP.md index 3a4a1d9..ccdbdd0 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -67,6 +67,7 @@ Target release date: ??? - [ ] Try - Machines - [x] Fleshed out gui + - [ ] Plot ## Version 0.1.0 (December 2022) From 14c5280dac1b3747cc46596805ed0ac600b688d2 Mon Sep 17 00:00:00 2001 From: cmontella Date: Tue, 11 Apr 2023 22:29:44 -0400 Subject: [PATCH 36/84] Update roadmap --- ROADMAP.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/ROADMAP.md b/ROADMAP.md index ccdbdd0..ef25d3b 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -38,19 +38,19 @@ Target release date: ??? ## Version 0.1.1 (Summer 2023) - Language Server - - [ ] Syntax Highlighter - - [ ] Autocomplete - - [ ] Goto Definition - - [ ] Goto Docs - - [ ] Hover inspector - - [ ] Workspace support + - [x] Syntax Highlighter + - [x] Autocomplete + - [x] Goto Definition + - [x] Goto Docs + - [x] Hover inspector + - [x] Workspace support - [ ] Database expolorer - Editor - - [ ] Compile programs + - [x] Compile programs - [ ] Start and stop cores - [ ] Save and load programs - [ ] Workspace explorer - - [ ] Database Explorer + - [x] Database Explorer - [ ] API endpoint server - Docs - Mech platform references From 8e97d2c1443e6b0e6e3c7a2e5103eaa453035a1c Mon Sep 17 00:00:00 2001 From: Xinhao Tang Date: Thu, 13 Apr 2023 00:06:47 -0400 Subject: [PATCH 37/84] update vscode wasm extension --- Cargo.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/Cargo.toml b/Cargo.toml index 0a79121..1003c1d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -45,6 +45,7 @@ base64 = "0.13.0" members = [ "wasm-notebook", + "src/syntax/editor-modes/vscode" ] [build-dependencies] From 187cefbacefe290e41855f4028d985690bc5236e Mon Sep 17 00:00:00 2001 From: cmontella Date: Tue, 18 Apr 2023 18:03:57 -0400 Subject: [PATCH 38/84] Set output filename on format --- src/bin/mech.rs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/bin/mech.rs b/src/bin/mech.rs index 593c81a..c485ba5 100644 --- a/src/bin/mech.rs +++ b/src/bin/mech.rs @@ -603,22 +603,27 @@ async fn main() -> Result<(), MechError> { } }).collect::>(); + let output_name = match (matches.value_of("output_name"),html) { + (Some(name),true) => format!("{}.html",name), + (Some(name),false) => format!("{}.mec",name), + (None, true) => "output.html".to_string(), + (None, false) => "output.mec".to_string(), + }; + + let mut file = File::create(output_name)?; + if formatted_source.len() == 1 { if html { - let mut file = File::create("index.html")?; file.write_all(formatted_source[0].as_bytes())?; } else { - let mut file = File::create("index.mec")?; file.write_all(formatted_source[0].as_bytes())?; } std::process::exit(0); } else { for f in formatted_source { if html { - let mut file = File::create("index.html")?; file.write_all(f.as_bytes())?; } else { - let mut file = File::create("index.mec")?; file.write_all(f.as_bytes())?; } } From e347198e92e60aa99cd2edab1fb0c75bedddbe47 Mon Sep 17 00:00:00 2001 From: cmontella Date: Tue, 18 Apr 2023 18:04:08 -0400 Subject: [PATCH 39/84] upgrade core --- src/core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core b/src/core index cba3de1..b038d01 160000 --- a/src/core +++ b/src/core @@ -1 +1 @@ -Subproject commit cba3de15ffde24ee3711b0eeb83a3dd921223cf8 +Subproject commit b038d01a316a11389480f2cc00cf01cb3bf62feb From 0bbfaebd616e6cb2df4e88326dde6a9cda22777d Mon Sep 17 00:00:00 2001 From: Xinhao Tang Date: Wed, 19 Apr 2023 22:56:24 -0400 Subject: [PATCH 40/84] delete old syntax path --- syntax | 1 - 1 file changed, 1 deletion(-) delete mode 160000 syntax diff --git a/syntax b/syntax deleted file mode 160000 index 337ca71..0000000 --- a/syntax +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 337ca7182eed886db9d76a506e68913081b1c52b From 282081cf6d08a7cc5c54169f86f3127c74170195 Mon Sep 17 00:00:00 2001 From: Xinhao Tang Date: Wed, 19 Apr 2023 22:56:38 -0400 Subject: [PATCH 41/84] update submodule --- src/core | 2 +- src/syntax | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core b/src/core index 422b3aa..4a70683 160000 --- a/src/core +++ b/src/core @@ -1 +1 @@ -Subproject commit 422b3aa8ec03533a8d639a7ca77d97f2ae0c5f77 +Subproject commit 4a70683e0e06e6e62852bac6212c6305a531a3a7 diff --git a/src/syntax b/src/syntax index c86ee81..94ac013 160000 --- a/src/syntax +++ b/src/syntax @@ -1 +1 @@ -Subproject commit c86ee81e0c46706d6c788ca28564edd2ba979e76 +Subproject commit 94ac0131922bb4ab800ef9a056805f2138dd87ee From 511ee774029c3ad72d5c41ea3c144a88c491f243 Mon Sep 17 00:00:00 2001 From: cmontella Date: Tue, 14 Feb 2023 17:28:34 -0500 Subject: [PATCH 42/84] fix paths --- src/bin/mech.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bin/mech.rs b/src/bin/mech.rs index edfc0eb..0e58f5b 100644 --- a/src/bin/mech.rs +++ b/src/bin/mech.rs @@ -301,7 +301,7 @@ async fn main() -> Result<(), MechError> { let mut headers = HeaderMap::new(); headers.insert("accept-ranges", HeaderValue::from_static("bytes")); headers.insert("content-type", HeaderValue::from_static("application/javascript")); - let nb = warp::path!("pkg" / "mech_notebook.js") + let nb = warp::path!("pkg" / "mech_wasm_notebook.js") .map(move || { mech_notebook }) @@ -310,7 +310,7 @@ async fn main() -> Result<(), MechError> { let mut headers = HeaderMap::new(); headers.insert("accept-ranges", HeaderValue::from_static("bytes")); headers.insert("content-type", HeaderValue::from_static("application/wasm")); - let pkg = warp::path!("pkg" / "mech_notebook_bg.wasm") + let pkg = warp::path!("pkg" / "mech_wasm_notebook_bg.wasm") .map(move || { mech_wasm.to_vec() }) From 6a9011af9d83f381ee8fbd367a806c9d9b8a44dd Mon Sep 17 00:00:00 2001 From: cmontella Date: Tue, 25 Apr 2023 11:55:45 -0400 Subject: [PATCH 43/84] add capabilities to mech toolchain --- src/bin/mech.rs | 52 +++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 48 insertions(+), 4 deletions(-) diff --git a/src/bin/mech.rs b/src/bin/mech.rs index c485ba5..08cf0fa 100644 --- a/src/bin/mech.rs +++ b/src/bin/mech.rs @@ -38,7 +38,8 @@ use std::thread::{self, JoinHandle}; extern crate reqwest; -use std::collections::HashMap; +extern crate hashbrown; +use hashbrown::{HashMap, HashSet}; extern crate bincode; use std::io::{Write, BufReader, BufWriter, stdout}; @@ -172,6 +173,12 @@ async fn main() -> Result<(), MechError> { .takes_value(true))) .subcommand(SubCommand::with_name("run") .about("Run a target folder or *.mec file") + .arg(Arg::with_name("secure") + .short("s") + .long("secure") + .value_name("Secure") + .help("Secures the runtime environment by limiting capabilities.") + .takes_value(false)) .arg(Arg::with_name("repl_mode") .short("r") .long("repl") @@ -338,8 +345,14 @@ async fn main() -> Result<(), MechError> { } }; + + // The tester can write its output to std out and also connect to a core network and download dependencies, but otherwise it's locked down. + let mut tester_caps = HashSet::new(); + tester_caps.insert(Capability::StdOut); + tester_caps.insert(Capability::DownloadDependencies); + println!("{}", "[Running]".truecolor(153,221,85)); - let runner = ProgramRunner::new("Mech Test"); + let runner = ProgramRunner::new("Mech Test",tester_caps); let mech_client = runner.run()?; mech_client.send(RunLoopMessage::Code((1,MechCode::MiniBlocks(blocks)))); @@ -402,6 +415,7 @@ async fn main() -> Result<(), MechError> { let mech_paths: Vec = matches.values_of("mech_run_file_paths").map_or(vec![], |files| files.map(|file| file.to_string()).collect()); let repl_flag = matches.is_present("repl_mode"); let debug_flag = matches.is_present("debug"); + let secure_flag = matches.is_present("secure"); let timings_flag = matches.is_present("timings"); let machine_registry = matches.value_of("registry").unwrap_or("https://gitlab.com/mech-lang/machines/mech/-/raw/v0.1-beta/src/registry.mec").to_string(); let input_arguments = matches.values_of("inargs").map_or(vec![], |inargs| inargs.collect()); @@ -435,7 +449,23 @@ async fn main() -> Result<(), MechError> { println!("{}", "[Running]".truecolor(153,221,85)); - let mut runner = ProgramRunner::new("Run"); + // Run capabilities are very permissive by default, but can be secured when the secure flag is passed. + let mut run_caps = HashSet::new(); + if !secure_flag { + run_caps.insert(Capability::StdIn); + run_caps.insert(Capability::StdOut); + run_caps.insert(Capability::StdErr); + run_caps.insert(Capability::InputArguments); + run_caps.insert(Capability::FileSystemRead); + run_caps.insert(Capability::FileSystemWrite); + run_caps.insert(Capability::NetworkRead); + run_caps.insert(Capability::NetworkWrite); + run_caps.insert(Capability::CoreNetworkRead); + run_caps.insert(Capability::CoreNetworkWrite); + run_caps.insert(Capability::DownloadDependencies); + } + + let mut runner = ProgramRunner::new("Run", run_caps); runner.registry = machine_registry; let mech_client = runner.run()?; mech_client.send(RunLoopMessage::Code((1,MechCode::MiniBlocks(blocks)))); @@ -700,7 +730,21 @@ save - save the state of a core to disk as a .blx file"#; let mech_client = match mech_client { Some(mech_client) => mech_client, None => { - let runner = ProgramRunner::new("REPL"); + + // Run capabilities are very permissive by default + let mut repl_caps = HashSet::new(); + repl_caps.insert(Capability::StdIn); + repl_caps.insert(Capability::StdOut); + repl_caps.insert(Capability::StdErr); + repl_caps.insert(Capability::FileSystemRead); + repl_caps.insert(Capability::FileSystemWrite); + repl_caps.insert(Capability::NetworkRead); + repl_caps.insert(Capability::NetworkWrite); + repl_caps.insert(Capability::CoreNetworkRead); + repl_caps.insert(Capability::CoreNetworkWrite); + repl_caps.insert(Capability::DownloadDependencies); + + let runner = ProgramRunner::new("REPL", repl_caps); runner.run()? } }; From d92ab6376137f97abe814b60801ded2430ff1781 Mon Sep 17 00:00:00 2001 From: cmontella Date: Tue, 25 Apr 2023 11:56:03 -0400 Subject: [PATCH 44/84] Upgrade modules --- src/core | 2 +- src/program | 2 +- src/syntax | 2 +- src/utilities | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/core b/src/core index b038d01..2efd80b 160000 --- a/src/core +++ b/src/core @@ -1 +1 @@ -Subproject commit b038d01a316a11389480f2cc00cf01cb3bf62feb +Subproject commit 2efd80b6061db2acc8156152761a32cc4e98e50a diff --git a/src/program b/src/program index 85ef08e..8eb80f0 160000 --- a/src/program +++ b/src/program @@ -1 +1 @@ -Subproject commit 85ef08ef5e1578fee8d20c2450c279915be1f437 +Subproject commit 8eb80f0f89a3f27ee24e9fd5843919d89a3249da diff --git a/src/syntax b/src/syntax index 36bdc61..3856b59 160000 --- a/src/syntax +++ b/src/syntax @@ -1 +1 @@ -Subproject commit 36bdc61dd0935d678ff87a9d4570ef9fbb4d96b5 +Subproject commit 3856b5901144d983b88fde116829b559dbbe2184 diff --git a/src/utilities b/src/utilities index 8bf8654..c860e54 160000 --- a/src/utilities +++ b/src/utilities @@ -1 +1 @@ -Subproject commit 8bf865484bcd749f3905c38053c6409035961a41 +Subproject commit c860e546e3305c3a5b3f1fef8fed6284d70d0475 From 687cd0f906fbde0b12e2af09dc21c71a31faac88 Mon Sep 17 00:00:00 2001 From: cmontella Date: Tue, 25 Apr 2023 17:24:45 -0400 Subject: [PATCH 45/84] update program --- src/program | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/program b/src/program index 8eb80f0..a1d654b 160000 --- a/src/program +++ b/src/program @@ -1 +1 @@ -Subproject commit 8eb80f0f89a3f27ee24e9fd5843919d89a3249da +Subproject commit a1d654b243b22ee6c3ac69cf2aed114686e4edcc From ff85e7905bf7585da1cfb4301e524f78718c1bbd Mon Sep 17 00:00:00 2001 From: cmontella Date: Wed, 26 Apr 2023 16:04:28 -0400 Subject: [PATCH 46/84] Update cargo with hashbrown dep --- Cargo.toml | 1 + src/bin/mech-exe.rs | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 0a79121..eb7b1a9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,6 +25,7 @@ mech-utilities = {path = "src/utilities", version = '0.1' } clap = "2.34.0" colored = "2.0.0" nom = "7.1.1" +hashbrown = "0.13.1" reqwest = {version = "0.11.11", features = ["blocking"]} bincode = "1.3.3" serde = "1.0.152" diff --git a/src/bin/mech-exe.rs b/src/bin/mech-exe.rs index 5e4580b..c9adfc8 100644 --- a/src/bin/mech-exe.rs +++ b/src/bin/mech-exe.rs @@ -1,15 +1,29 @@ //const SOURCE_FILES: &[(&str, &[u8])] = &include!(concat!(env!("OUT_DIR"), "/mech_app_files.rs")); extern crate mech; +extern crate hashbrown; use mech::core::Core; use mech::syntax::compiler::Compiler; use mech::*; +use hashbrown::HashSet; fn main() { let mut compiler = Compiler::new(); - let runner = ProgramRunner::new("Mech Run"); + let mut caps = HashSet::new(); + caps.insert(Capability::StdIn); + caps.insert(Capability::StdOut); + caps.insert(Capability::StdErr); + caps.insert(Capability::FileSystemRead); + caps.insert(Capability::FileSystemWrite); + caps.insert(Capability::NetworkRead); + caps.insert(Capability::NetworkWrite); + caps.insert(Capability::CoreNetworkRead); + caps.insert(Capability::CoreNetworkWrite); + caps.insert(Capability::DownloadDependencies); + + let runner = ProgramRunner::new("Mech Executable", caps); let mech_client = runner.run().unwrap(); /*for (name, data) in SOURCE_FILES { From 865d335bb412aa66a0219ace7155413305856305 Mon Sep 17 00:00:00 2001 From: Xinhao Tang Date: Tue, 2 May 2023 14:34:12 -0400 Subject: [PATCH 47/84] transfer 1d array to 2d --- src/syntax | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/syntax b/src/syntax index 94ac013..f2fe4cd 160000 --- a/src/syntax +++ b/src/syntax @@ -1 +1 @@ -Subproject commit 94ac0131922bb4ab800ef9a056805f2138dd87ee +Subproject commit f2fe4cdc301c5c4ee1e88136745b633867570e49 From ed79e8fb36335e33b0c74fad74c7728867c48262 Mon Sep 17 00:00:00 2001 From: Haocheng Gao Date: Tue, 2 May 2023 15:01:48 -0400 Subject: [PATCH 48/84] update submodule versions --- src/core | 2 +- src/syntax | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core b/src/core index 4a70683..f2d7ead 160000 --- a/src/core +++ b/src/core @@ -1 +1 @@ -Subproject commit 4a70683e0e06e6e62852bac6212c6305a531a3a7 +Subproject commit f2d7eadce5380d5f3514d275463617ef8fa44699 diff --git a/src/syntax b/src/syntax index f2fe4cd..d40a94d 160000 --- a/src/syntax +++ b/src/syntax @@ -1 +1 @@ -Subproject commit f2fe4cdc301c5c4ee1e88136745b633867570e49 +Subproject commit d40a94d1f29f43e4e778d260707bb5319646bbec From 3b9d9d3c1b3211d39bd9d32426ff377f8a8a2c25 Mon Sep 17 00:00:00 2001 From: cmontella Date: Tue, 2 May 2023 16:34:15 -0400 Subject: [PATCH 49/84] =?UTF-8?q?support=20mech=20files=20with=20a=20?= =?UTF-8?q?=F0=9F=A4=96=20extension?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index a3a218e..8c1a005 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -71,7 +71,7 @@ pub fn read_mech_files(mech_paths: &Vec) -> Result { + Some("mec") | Some("🤖") => { match File::open(name) { Ok(mut file) => { println!("{} {}", "[Loading]".truecolor(153,221,85), name); From 6ab0fad108ebb9a9eebb59aee91a42138bdadd12 Mon Sep 17 00:00:00 2001 From: cmontella Date: Wed, 3 May 2023 08:36:26 -0400 Subject: [PATCH 50/84] upgrade core --- src/core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core b/src/core index 2efd80b..2dc935e 160000 --- a/src/core +++ b/src/core @@ -1 +1 @@ -Subproject commit 2efd80b6061db2acc8156152761a32cc4e98e50a +Subproject commit 2dc935e611702aedf83af7f8e96c52ff5335c038 From 3600eb61cc325b25e3d4e280bafb7e7f09ea811c Mon Sep 17 00:00:00 2001 From: Xinhao Tang Date: Sun, 14 May 2023 15:21:44 -0400 Subject: [PATCH 51/84] update vscode ext --- src/syntax | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/syntax b/src/syntax index d40a94d..3a48de6 160000 --- a/src/syntax +++ b/src/syntax @@ -1 +1 @@ -Subproject commit d40a94d1f29f43e4e778d260707bb5319646bbec +Subproject commit 3a48de6489a488fa352d0891036aa5e25afa1195 From 105af855bc725d10c17894e6f15f98e6ff4e7ee6 Mon Sep 17 00:00:00 2001 From: Xinhao Tang Date: Sun, 14 May 2023 15:25:05 -0400 Subject: [PATCH 52/84] utilities should move to src --- utilities | 1 - 1 file changed, 1 deletion(-) delete mode 160000 utilities diff --git a/utilities b/utilities deleted file mode 160000 index 989db09..0000000 --- a/utilities +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 989db09d0beb16b5e94ea03d05adcc15b3e1d5fa From 4ed3cea7b0adc38e7cbea2585037a16eb2e19d7d Mon Sep 17 00:00:00 2001 From: Xinhao Tang Date: Tue, 16 May 2023 14:39:53 -0400 Subject: [PATCH 53/84] update --- src/core | 2 +- src/syntax | 2 +- src/utilities | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/core b/src/core index f2d7ead..40c9039 160000 --- a/src/core +++ b/src/core @@ -1 +1 @@ -Subproject commit f2d7eadce5380d5f3514d275463617ef8fa44699 +Subproject commit 40c9039ed2ade5f7ddc3f184b29b6876736dcf0b diff --git a/src/syntax b/src/syntax index 3a48de6..2ffb86b 160000 --- a/src/syntax +++ b/src/syntax @@ -1 +1 @@ -Subproject commit 3a48de6489a488fa352d0891036aa5e25afa1195 +Subproject commit 2ffb86bd195a9d7798f7db97dfe35ffa1432aab5 diff --git a/src/utilities b/src/utilities index c860e54..51f5234 160000 --- a/src/utilities +++ b/src/utilities @@ -1 +1 @@ -Subproject commit c860e546e3305c3a5b3f1fef8fed6284d70d0475 +Subproject commit 51f523410ced1bb02b0f3f90f4cca7fb88aa5f85 From 5890bce507609e6b4aaa8e93c4d9b35e390bc953 Mon Sep 17 00:00:00 2001 From: cmontella Date: Tue, 16 May 2023 23:00:48 -0400 Subject: [PATCH 54/84] Summer roadmap --- ROADMAP.md | 141 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 82 insertions(+), 59 deletions(-) diff --git a/ROADMAP.md b/ROADMAP.md index ef25d3b..572090b 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -13,30 +13,65 @@ Released: December 2022 Target release date: ??? -## Version 0.3.0 (Maybe Fall 2024?) +## Version 0.3.0 (???) -- [ ] GPGPU Runtime -- [ ] Automatic Differentiation -- [ ] Capability system +- ... ## Version 0.2.0 (Fall 2023) -- [ ] Distributed Runtime Improvements -- [ ] Persistence -- [ ] Time travel debugging -- [ ] More complete examples - +- [ ] Monorepo +- [ ] Tensor refactor +- [ ] Database redo + - [ ] ACID + - [ ] Persistence + - [ ] Time travel debugging + - [ ] Capabilities +- [ ] Distributed runtime redo + - [ ] Core syntax + - [ ] CAP + - [ ] QOS + - [ ] Inbox + - [ ] Capabilities +- [ ] State machines + - [ ] Atomic datatypes + - [ ] Delays + - [ ] Pattern Matching +- [ ] Tuples +- [ ] Type definitions +- [ ] Capabilities syntax +- [ ] Autograd syntax +- Editor + - [x] Compile programs + - [ ] Start and stop cores + - [ ] Save and load programs + - [ ] Workspace explorer + - [x] Database explorer + - [ ] API endpoint server - Machines - - [ ] JSON - - [ ] Sockets - - [ ] Serial - - [ ] Bluetooth - - [ ] Audio - - [ ] Maps - - [ ] ChatGPT? + - [ ] json + - [ ] sockets + - [ ] serial + - [ ] bluetooth + - [ ] audio + - [ ] maps + - [ ] plot +- Docs + - User Guides + - [ ] Tutorials + - [ ] How-Tos + - [ ] Mech for X +- Website + - [ ] Homepage + - [ ] Blog + - [ ] Docs + - [ ] Try -## Version 0.1.1 (Summer 2023) +## Version 0.1.1 (Spring 2023) +- Core + - [ ] GPGPU Runtime + - [x] Automatic differentiation + - [x] Capability system - Language Server - [x] Syntax Highlighter - [x] Autocomplete @@ -44,30 +79,18 @@ Target release date: ??? - [x] Goto Docs - [x] Hover inspector - [x] Workspace support - - [ ] Database expolorer + - [x] Database watcher - Editor - - [x] Compile programs - - [ ] Start and stop cores - - [ ] Save and load programs - - [ ] Workspace explorer - - [x] Database Explorer - - [ ] API endpoint server + - [x] Compile programs + - [x] Database Explorer - Docs - - Mech platform references - - [ ] Syntax - - [ ] Ecosystem - - [ ] Architecture - - User Guides - - [ ] Tutorials - - [ ] How-Tos - - [ ] Mech for X -- Website - - [ ] Homepage - - [ ] Blog - - [ ] Try + - Mech platform references + - [x] Syntax + - [x] Ecosystem + - [x] Architecture - Machines - - [x] Fleshed out gui - - [ ] Plot + - [x] More gui + - [x] ai ## Version 0.1.0 (December 2022) @@ -83,29 +106,29 @@ Target release date: ??? - [x] Native executables - [x] REPL - Machines - - [x] Matrix - - [x] GUI + - [x] Matrix + - [x] GUI ## Version 0.0.6 Alpha (unreleased) - [x] Testing - Machines - - HTML - - [x] Mouse - - [x] Keyboard - - [x] Canvas Drawing - - [x] File I/O - - [x] Standard Streams - - [x] Strings - - [x] Number Literals - - [x] HTTP - - [x] Math - - [x] Stats - - [x] Random - - [x] Time - - [x] Set - - System - - [x] Input Arguments - - [x] Exit - - [x] Mech Compiler - - [x] Table + - HTML + - [x] Mouse + - [x] Keyboard + - [x] Canvas Drawing + - [x] File I/O + - [x] Standard Streams + - [x] Strings + - [x] Number Literals + - [x] HTTP + - [x] Math + - [x] Stats + - [x] Random + - [x] Time + - [x] Set + - System + - [x] Input Arguments + - [x] Exit + - [x] Mech Compiler + - [x] Table From 036b34867b38b2582cc91486d74ccfaf08f7b53f Mon Sep 17 00:00:00 2001 From: cmontella Date: Tue, 16 May 2023 23:10:26 -0400 Subject: [PATCH 55/84] Add machines redo to roadmap --- ROADMAP.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/ROADMAP.md b/ROADMAP.md index 572090b..33d1e9f 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -36,6 +36,13 @@ Target release date: ??? - [ ] Atomic datatypes - [ ] Delays - [ ] Pattern Matching +- [ ] Machines revamp + - [ ] Packaging + - [ ] Reuse + - [ ] Composition + - [ ] Explicit importing + - [ ] Remapping + - [ ] Specifying versions - [ ] Tuples - [ ] Type definitions - [ ] Capabilities syntax From e1fbd03d6a5bc14fc3f670cb5160a3b8d93676f2 Mon Sep 17 00:00:00 2001 From: cmontella Date: Tue, 16 May 2023 23:27:58 -0400 Subject: [PATCH 56/84] Add types to roadmap --- ROADMAP.md | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/ROADMAP.md b/ROADMAP.md index 33d1e9f..4fc9f17 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -19,8 +19,26 @@ Target release date: ??? ## Version 0.2.0 (Fall 2023) +(Some of this will likely move to v0.3.0, it's a lot to do in one summer) + - [ ] Monorepo -- [ ] Tensor refactor +- [ ] Types + - [ ] Tuples + - [ ] Type definitions + - [ ] Specifying converstions + - [ ] Typeclasses + - [ ] Unit conversion + - [ ] Specifying units + - [ ] Dec64 + - [ ] Currency + - [ ] Scientific notation + - [ ] Dimensional analysis +- [ ] Table redo + - [ ] Simplify indexing + - [ ] Support efficient tensors + - [ ] Autograd syntax + - [ ] History syntax + - [ ] HashTable/HashSet support - [ ] Database redo - [ ] ACID - [ ] Persistence @@ -43,17 +61,14 @@ Target release date: ??? - [ ] Explicit importing - [ ] Remapping - [ ] Specifying versions -- [ ] Tuples -- [ ] Type definitions -- [ ] Capabilities syntax -- [ ] Autograd syntax - Editor - - [x] Compile programs - [ ] Start and stop cores - [ ] Save and load programs - [ ] Workspace explorer - - [x] Database explorer - [ ] API endpoint server + - [ ] Syntax highlighting + - [ ] Embed programs + - [ ] Display errors - Machines - [ ] json - [ ] sockets @@ -76,9 +91,9 @@ Target release date: ??? ## Version 0.1.1 (Spring 2023) - Core - - [ ] GPGPU Runtime - [x] Automatic differentiation - [x] Capability system + - [x] New parser - Language Server - [x] Syntax Highlighter - [x] Autocomplete @@ -92,12 +107,13 @@ Target release date: ??? - [x] Database Explorer - Docs - Mech platform references - - [x] Syntax + - [x] User Guide - [x] Ecosystem - [x] Architecture - Machines - [x] More gui - [x] ai + - [ ] gpu ## Version 0.1.0 (December 2022) From 8198076b4538d3dafe2d558ea0e468806423eb10 Mon Sep 17 00:00:00 2001 From: cmontella Date: Sat, 20 May 2023 19:36:09 -0400 Subject: [PATCH 57/84] Upgrade Rust --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9805e8a..613f46a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -4,7 +4,7 @@ variables: test:cargo: script: - rustup show - - rustup default nightly-2022-08-25 + - rustup default nightly-2023-05-19 - wasm-pack build wasm-notebook --target web - cargo build --bin mech --release - ./target/release/mech test tests From dc49b6f29ee32a5a71a9baf5379ca09730336c83 Mon Sep 17 00:00:00 2001 From: cmontella Date: Sat, 20 May 2023 19:37:23 -0400 Subject: [PATCH 58/84] Upgrade Rust --- .github/workflows/nightly-release.yml | 2 +- .github/workflows/rust.yml | 2 +- Dockerfile | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/nightly-release.yml b/.github/workflows/nightly-release.yml index 54e9c55..256f84c 100644 --- a/.github/workflows/nightly-release.yml +++ b/.github/workflows/nightly-release.yml @@ -14,7 +14,7 @@ jobs: steps: - uses: actions/checkout@v2 - name: Setup - run: rustup default nightly-2022-08-25 + run: rustup default nightly-2023-05-19 - name: Build run: cargo build --bin mech --release - name: Run tests diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index da2adc5..b5f822a 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -19,7 +19,7 @@ jobs: with: submodules: recursive - name: Setup - run: rustup default nightly-2022-08-25 + run: rustup default nightly-2023-05-19 - name: Build run: cargo build --bin mech --release - name: Run tests diff --git a/Dockerfile b/Dockerfile index 073a544..2a73ffc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,7 +5,7 @@ COPY . . RUN pwd RUN rustup override set nightly -RUN rustup default nightly-2022-08-25 +RUN rustup default nightly-2023-05-19 RUN cargo build --bin mech --release ENV PATH="/mech/target/release:${PATH}" \ No newline at end of file From 0d4009e5990d827a4dcfeb976a65f978791206f0 Mon Sep 17 00:00:00 2001 From: cmontella Date: Sat, 20 May 2023 19:37:56 -0400 Subject: [PATCH 59/84] Upgrade components --- docs | 2 +- examples | 2 +- notebook | 2 +- src/core | 2 +- src/program | 2 +- src/syntax | 2 +- src/utilities | 2 +- src/wasm | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs b/docs index b05bfe5..5b097ab 160000 --- a/docs +++ b/docs @@ -1 +1 @@ -Subproject commit b05bfe52d7606202bd45651cf409cabbeffa294c +Subproject commit 5b097ab67df22ee8804512d93c03d097c095034f diff --git a/examples b/examples index b43d1db..b84e5c0 160000 --- a/examples +++ b/examples @@ -1 +1 @@ -Subproject commit b43d1dbd7f09a774dfc503ae9a39e4b6c10b563a +Subproject commit b84e5c0ad249565c2fc361ecdd4f53c6db18eea0 diff --git a/notebook b/notebook index 9b90468..ff91262 160000 --- a/notebook +++ b/notebook @@ -1 +1 @@ -Subproject commit 9b90468c66488bfdd00e763cbd898c8cb31bd1c7 +Subproject commit ff912624d0dd728a9827ba34de7fa62827b7941b diff --git a/src/core b/src/core index 40c9039..ad92109 160000 --- a/src/core +++ b/src/core @@ -1 +1 @@ -Subproject commit 40c9039ed2ade5f7ddc3f184b29b6876736dcf0b +Subproject commit ad921091276129cbb761c6f0ed408a1e722b88ca diff --git a/src/program b/src/program index a1d654b..d5ed5a0 160000 --- a/src/program +++ b/src/program @@ -1 +1 @@ -Subproject commit a1d654b243b22ee6c3ac69cf2aed114686e4edcc +Subproject commit d5ed5a0845f00507310223e925b43e72dce5c262 diff --git a/src/syntax b/src/syntax index 2ffb86b..21ac6fa 160000 --- a/src/syntax +++ b/src/syntax @@ -1 +1 @@ -Subproject commit 2ffb86bd195a9d7798f7db97dfe35ffa1432aab5 +Subproject commit 21ac6faf586c3c0bad2b576dee594a6ba82080d5 diff --git a/src/utilities b/src/utilities index 51f5234..565189c 160000 --- a/src/utilities +++ b/src/utilities @@ -1 +1 @@ -Subproject commit 51f523410ced1bb02b0f3f90f4cca7fb88aa5f85 +Subproject commit 565189c3ee81e4c2003d3f66483bb822cf2a2bc9 diff --git a/src/wasm b/src/wasm index 30e0c80..6f4c2f5 160000 --- a/src/wasm +++ b/src/wasm @@ -1 +1 @@ -Subproject commit 30e0c809bafa2510ded8dfa269921245e85ebb16 +Subproject commit 6f4c2f5b07ef33581c1df44e6aa5189ee7542a44 From 7bf5c442ceed3a6c1f7a41317e89716af3cefa8e Mon Sep 17 00:00:00 2001 From: Corey Montella Date: Sat, 20 May 2023 23:43:31 +0000 Subject: [PATCH 60/84] Revert "Upgrade components" This reverts commit 0d4009e5990d827a4dcfeb976a65f978791206f0 --- docs | 2 +- examples | 2 +- notebook | 2 +- src/core | 2 +- src/program | 2 +- src/syntax | 2 +- src/utilities | 2 +- src/wasm | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs b/docs index 5b097ab..b05bfe5 160000 --- a/docs +++ b/docs @@ -1 +1 @@ -Subproject commit 5b097ab67df22ee8804512d93c03d097c095034f +Subproject commit b05bfe52d7606202bd45651cf409cabbeffa294c diff --git a/examples b/examples index b84e5c0..b43d1db 160000 --- a/examples +++ b/examples @@ -1 +1 @@ -Subproject commit b84e5c0ad249565c2fc361ecdd4f53c6db18eea0 +Subproject commit b43d1dbd7f09a774dfc503ae9a39e4b6c10b563a diff --git a/notebook b/notebook index ff91262..9b90468 160000 --- a/notebook +++ b/notebook @@ -1 +1 @@ -Subproject commit ff912624d0dd728a9827ba34de7fa62827b7941b +Subproject commit 9b90468c66488bfdd00e763cbd898c8cb31bd1c7 diff --git a/src/core b/src/core index ad92109..40c9039 160000 --- a/src/core +++ b/src/core @@ -1 +1 @@ -Subproject commit ad921091276129cbb761c6f0ed408a1e722b88ca +Subproject commit 40c9039ed2ade5f7ddc3f184b29b6876736dcf0b diff --git a/src/program b/src/program index d5ed5a0..a1d654b 160000 --- a/src/program +++ b/src/program @@ -1 +1 @@ -Subproject commit d5ed5a0845f00507310223e925b43e72dce5c262 +Subproject commit a1d654b243b22ee6c3ac69cf2aed114686e4edcc diff --git a/src/syntax b/src/syntax index 21ac6fa..2ffb86b 160000 --- a/src/syntax +++ b/src/syntax @@ -1 +1 @@ -Subproject commit 21ac6faf586c3c0bad2b576dee594a6ba82080d5 +Subproject commit 2ffb86bd195a9d7798f7db97dfe35ffa1432aab5 diff --git a/src/utilities b/src/utilities index 565189c..51f5234 160000 --- a/src/utilities +++ b/src/utilities @@ -1 +1 @@ -Subproject commit 565189c3ee81e4c2003d3f66483bb822cf2a2bc9 +Subproject commit 51f523410ced1bb02b0f3f90f4cca7fb88aa5f85 diff --git a/src/wasm b/src/wasm index 6f4c2f5..30e0c80 160000 --- a/src/wasm +++ b/src/wasm @@ -1 +1 @@ -Subproject commit 6f4c2f5b07ef33581c1df44e6aa5189ee7542a44 +Subproject commit 30e0c809bafa2510ded8dfa269921245e85ebb16 From 7cceb88437985496dbbd58810c6972e7b12b2b87 Mon Sep 17 00:00:00 2001 From: Corey Montella Date: Sat, 20 May 2023 23:44:16 +0000 Subject: [PATCH 61/84] Revert "Merge branch 'language-server' into 'v0.1-beta'" This reverts merge request !42 --- Cargo.toml | 1 - src/bin/mech.rs | 42 ++++++++---------------------------------- src/core | 2 +- src/syntax | 2 +- src/utilities | 2 +- 5 files changed, 11 insertions(+), 38 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index a2a7533..eb7b1a9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -46,7 +46,6 @@ base64 = "0.13.0" members = [ "wasm-notebook", - "src/syntax/editor-modes/vscode" ] [build-dependencies] diff --git a/src/bin/mech.rs b/src/bin/mech.rs index 8443ed3..08cf0fa 100644 --- a/src/bin/mech.rs +++ b/src/bin/mech.rs @@ -165,30 +165,11 @@ async fn main() -> Result<(), MechError> { .takes_value(false))) .subcommand(SubCommand::with_name("langserver") .about("Run a local mech language server") - .arg(Arg::with_name("stdio") - .conflicts_with("socket") - .short("o") - .long("stdio") - .help("Use stdio for server communciation. This is the default option") - .takes_value(false)) - .arg(Arg::with_name("socket") - .conflicts_with("stdio") + .arg(Arg::with_name("port") .short("p") - .long("socket") + .long("port") .value_name("PORT") - .help("Use tcp socket at PORT for server communication") - .takes_value(true) - .validator(|s| match s.parse::() { - Ok(_) => Ok(()), - Err(_) => Err("Invalid port number".to_owned()), - })) - .arg(Arg::with_name("log") - .required(false) - .short("l") - .long("log") - .value_name("LEVEL") - .help("Specify log level (default: debug)") - .possible_values(&["off", "error", "warn", "info", "debug", "trace"]) + .help("Sets the port for the server (default: 4041)") .takes_value(true))) .subcommand(SubCommand::with_name("run") .about("Run a target folder or *.mec file") @@ -308,7 +289,7 @@ async fn main() -> Result<(), MechError> { let mut headers = HeaderMap::new(); headers.insert("accept-ranges", HeaderValue::from_static("bytes")); headers.insert("content-type", HeaderValue::from_static("application/javascript")); - let nb = warp::path!("pkg" / "mech_wasm_notebook.js") + let nb = warp::path!("pkg" / "mech_notebook.js") .map(move || { mech_notebook }) @@ -689,17 +670,10 @@ async fn main() -> Result<(), MechError> { // Run language server // ------------------------------------------------ } else if let Some(matches) = matches.subcommand_matches("langserver") { - let log_lvl = matches.value_of("log").unwrap_or(""); - match matches.value_of("socket") { - Some(port) => { - let address = "localhost"; - println!("{} Starting language server at {}:{}", "[INFO]".truecolor(34,204,187), address, port); - mech_syntax::langserver::run_tcp_langserver(address, port, log_lvl).await?; - }, - _ => { // stdio - mech_syntax::langserver::run_stdio_langserver(log_lvl).await?; - }, - } + let address = "localhost".to_owned(); + let port = matches.value_of("port").unwrap_or("4041").to_string(); + println!("{} Starting language server at {}:{}", "[INFO]".truecolor(34,204,187), address, port); + mech_syntax::langserver::run_langserver(&address, &port).await?; std::process::exit(0); None // ------------------------------------------------ diff --git a/src/core b/src/core index 40c9039..2dc935e 160000 --- a/src/core +++ b/src/core @@ -1 +1 @@ -Subproject commit 40c9039ed2ade5f7ddc3f184b29b6876736dcf0b +Subproject commit 2dc935e611702aedf83af7f8e96c52ff5335c038 diff --git a/src/syntax b/src/syntax index 2ffb86b..3856b59 160000 --- a/src/syntax +++ b/src/syntax @@ -1 +1 @@ -Subproject commit 2ffb86bd195a9d7798f7db97dfe35ffa1432aab5 +Subproject commit 3856b5901144d983b88fde116829b559dbbe2184 diff --git a/src/utilities b/src/utilities index 51f5234..c860e54 160000 --- a/src/utilities +++ b/src/utilities @@ -1 +1 @@ -Subproject commit 51f523410ced1bb02b0f3f90f4cca7fb88aa5f85 +Subproject commit c860e546e3305c3a5b3f1fef8fed6284d70d0475 From dabb28dfa9cdb5c9baa1506475941ae91e9aafa7 Mon Sep 17 00:00:00 2001 From: cmontella Date: Sat, 20 May 2023 19:53:58 -0400 Subject: [PATCH 62/84] Upgrade components --- docs | 2 +- examples | 2 +- src/core | 2 +- src/program | 2 +- src/syntax | 2 +- src/utilities | 2 +- src/wasm | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs b/docs index b05bfe5..ce9016c 160000 --- a/docs +++ b/docs @@ -1 +1 @@ -Subproject commit b05bfe52d7606202bd45651cf409cabbeffa294c +Subproject commit ce9016cd202f47cea6fc47bb5f376fcd6d73139d diff --git a/examples b/examples index b43d1db..b84e5c0 160000 --- a/examples +++ b/examples @@ -1 +1 @@ -Subproject commit b43d1dbd7f09a774dfc503ae9a39e4b6c10b563a +Subproject commit b84e5c0ad249565c2fc361ecdd4f53c6db18eea0 diff --git a/src/core b/src/core index 2dc935e..ad92109 160000 --- a/src/core +++ b/src/core @@ -1 +1 @@ -Subproject commit 2dc935e611702aedf83af7f8e96c52ff5335c038 +Subproject commit ad921091276129cbb761c6f0ed408a1e722b88ca diff --git a/src/program b/src/program index a1d654b..d5ed5a0 160000 --- a/src/program +++ b/src/program @@ -1 +1 @@ -Subproject commit a1d654b243b22ee6c3ac69cf2aed114686e4edcc +Subproject commit d5ed5a0845f00507310223e925b43e72dce5c262 diff --git a/src/syntax b/src/syntax index 3856b59..21ac6fa 160000 --- a/src/syntax +++ b/src/syntax @@ -1 +1 @@ -Subproject commit 3856b5901144d983b88fde116829b559dbbe2184 +Subproject commit 21ac6faf586c3c0bad2b576dee594a6ba82080d5 diff --git a/src/utilities b/src/utilities index c860e54..565189c 160000 --- a/src/utilities +++ b/src/utilities @@ -1 +1 @@ -Subproject commit c860e546e3305c3a5b3f1fef8fed6284d70d0475 +Subproject commit 565189c3ee81e4c2003d3f66483bb822cf2a2bc9 diff --git a/src/wasm b/src/wasm index 30e0c80..6f4c2f5 160000 --- a/src/wasm +++ b/src/wasm @@ -1 +1 @@ -Subproject commit 30e0c809bafa2510ded8dfa269921245e85ebb16 +Subproject commit 6f4c2f5b07ef33581c1df44e6aa5189ee7542a44 From 5a488e481d0e5957daf5fdf1d700dad670bf3497 Mon Sep 17 00:00:00 2001 From: cmontella Date: Sun, 21 May 2023 13:17:41 -0400 Subject: [PATCH 63/84] remove project folder --- project/main.mec | 1 - 1 file changed, 1 deletion(-) delete mode 100644 project/main.mec diff --git a/project/main.mec b/project/main.mec deleted file mode 100644 index 56aa5a4..0000000 --- a/project/main.mec +++ /dev/null @@ -1 +0,0 @@ -#x = [1 2 3] + [4 5 6] \ No newline at end of file From 79dc633eee7b5b38d3265c599397c8d86ddeba9b Mon Sep 17 00:00:00 2001 From: cmontella Date: Sun, 21 May 2023 13:18:00 -0400 Subject: [PATCH 64/84] delete wasm notebook --- wasm-notebook/Cargo.toml | 21 -- wasm-notebook/README.md | 33 --- wasm-notebook/editor/editor.mec | 16 -- wasm-notebook/fonts/FiraCode-Bold.ttf | Bin 257712 -> 0 bytes wasm-notebook/fonts/FiraCode-Light.ttf | Bin 225992 -> 0 bytes wasm-notebook/fonts/FiraCode-Medium.ttf | Bin 223652 -> 0 bytes wasm-notebook/fonts/FiraCode-Regular.ttf | Bin 225332 -> 0 bytes wasm-notebook/fonts/FiraCode-Retina.ttf | Bin 226328 -> 0 bytes wasm-notebook/fonts/FiraMono-Bold.ttf | Bin 206548 -> 0 bytes wasm-notebook/fonts/FiraMono-Regular.ttf | Bin 174632 -> 0 bytes .../fonts/Monoid-Bold-Large-Dollar-0-1-l.ttf | Bin 73052 -> 0 bytes .../Monoid-Italic-Large-Dollar-0-1-l.ttf | Bin 95128 -> 0 bytes .../Monoid-Regular-Large-Dollar-0-1-l.ttf | Bin 79248 -> 0 bytes .../Monoid-Retina-Large-Dollar-0-1-l.ttf | Bin 81928 -> 0 bytes wasm-notebook/fonts/Readme+License.html | 10 - wasm-notebook/fonts/ionicons.ttf | Bin 188508 -> 0 bytes wasm-notebook/index.html | 35 ---- wasm-notebook/src/lib.rs | 15 -- wasm-notebook/website/images/logo.png | Bin 12509 -> 0 bytes wasm-notebook/website/index.mec | 14 -- wasm-notebook/website/robot-drawing.mec | 39 ---- wasm-notebook/wstest.html | 190 ------------------ 22 files changed, 373 deletions(-) delete mode 100644 wasm-notebook/Cargo.toml delete mode 100644 wasm-notebook/README.md delete mode 100644 wasm-notebook/editor/editor.mec delete mode 100644 wasm-notebook/fonts/FiraCode-Bold.ttf delete mode 100644 wasm-notebook/fonts/FiraCode-Light.ttf delete mode 100644 wasm-notebook/fonts/FiraCode-Medium.ttf delete mode 100644 wasm-notebook/fonts/FiraCode-Regular.ttf delete mode 100644 wasm-notebook/fonts/FiraCode-Retina.ttf delete mode 100644 wasm-notebook/fonts/FiraMono-Bold.ttf delete mode 100644 wasm-notebook/fonts/FiraMono-Regular.ttf delete mode 100644 wasm-notebook/fonts/Monoid-Bold-Large-Dollar-0-1-l.ttf delete mode 100644 wasm-notebook/fonts/Monoid-Italic-Large-Dollar-0-1-l.ttf delete mode 100644 wasm-notebook/fonts/Monoid-Regular-Large-Dollar-0-1-l.ttf delete mode 100644 wasm-notebook/fonts/Monoid-Retina-Large-Dollar-0-1-l.ttf delete mode 100644 wasm-notebook/fonts/Readme+License.html delete mode 100644 wasm-notebook/fonts/ionicons.ttf delete mode 100644 wasm-notebook/index.html delete mode 100644 wasm-notebook/src/lib.rs delete mode 100644 wasm-notebook/website/images/logo.png delete mode 100644 wasm-notebook/website/index.mec delete mode 100644 wasm-notebook/website/robot-drawing.mec delete mode 100644 wasm-notebook/wstest.html diff --git a/wasm-notebook/Cargo.toml b/wasm-notebook/Cargo.toml deleted file mode 100644 index f9562ca..0000000 --- a/wasm-notebook/Cargo.toml +++ /dev/null @@ -1,21 +0,0 @@ -[package] -name = "mech-wasm-notebook" -version = "0.1.0" -authors = ["Corey Montella "] -description = "A notebook writing Mech in the browser" -documentation = "http://docs.mech-lang.org" -homepage = "https://mech-lang.org" -repository = "https://github.com/mech-lang/mech" -keywords = ["mech", "language", "programming", "dataflow", "runtime"] -categories = ["science::robotics", "science", "game-engines", "web-programming"] -license = "Apache-2.0" -readme = "README.md" -edition = "2021" - -[lib] -crate-type = ["cdylib", "rlib"] - -[dependencies] -mech-wasm = {git = "https://gitlab.com/mech-lang/wasm", branch = "v0.1-beta"} - -wasm-bindgen = "0.2.83" diff --git a/wasm-notebook/README.md b/wasm-notebook/README.md deleted file mode 100644 index 0704f1d..0000000 --- a/wasm-notebook/README.md +++ /dev/null @@ -1,33 +0,0 @@ -

- -

- -Mech is a language for developing **data-driven**, **reactive** systems like animations, games, and robots. It makes **composing**, **transforming**, and **distributing** data easy, allowing you to focus on the essential complexity of your project. - -You can try Mech online at [try.mech-lang.org](http://try.mech-lang.org). - -Usage and installation instructions can be found in the [documentation](https://mech-lang.org/page/learn/) or the [main Mech repository](https://github.com/mech-lang/mech). - -Read about progress on our [blog](https://mech-lang.org/blog/), and follow us on Twitter [@MechLang](https://twitter.com/MechLang). - -## Documentation - -Right now, most Mech features and syntax are undocumented. You can find some minimal documentation [here](http://docs.mech-lang.org), and also the beginning of a tutorial [here](http://docs.mech-lang.org/#/docs/tutorial.mec). - -## Build Instructions - -To build the Mech Notebook, you'll need [wasm-pack](https://github.com/rustwasm/wasm-pack), which requires Rust 1.30.0 or later. - -```bash -wasm-pack build --target web -``` - -## Project Status - -Mech is currently in the **v0.0.5 alpha** stage of development. This means that while some features work and are tested, programs are still likely to crash and produce incorrect results. We've implemented some language features, but many are not yet implemented. - -Feel free to use the language for your own satisfaction, but please don't use it for anything important. - -## License - -Apache 2.0 \ No newline at end of file diff --git a/wasm-notebook/editor/editor.mec b/wasm-notebook/editor/editor.mec deleted file mode 100644 index 8b3e74d..0000000 --- a/wasm-notebook/editor/editor.mec +++ /dev/null @@ -1,16 +0,0 @@ -# Mech Homepage - -Messages - #messages = [|name content| - "Corey" "One" - "Rachel" "Two" - "Corey" "Three" - "Corey" "Four"] -block - name-tag >- [type: "div" class: _ content: #messages.name] - message-tag >- [type: "div" class: _ content: #messages.content] - boo >- [name-tag message-tag] - #baz = [type: "div" class: _ contains: boo] - -block - #app/main = [root: "mech-root" class: _ contains: [type: "div" class: _ contains: [#baz]]] \ No newline at end of file diff --git a/wasm-notebook/fonts/FiraCode-Bold.ttf b/wasm-notebook/fonts/FiraCode-Bold.ttf deleted file mode 100644 index 6124d186345a9af5895bd074087b3e98616221e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 257712 zcmeEv3v`vm)%MK1mz*Rg_mCSQ=j0?OHszbqzbwyL&)&25 z%UW61vB!bw&Uv<-U*FuuQI=LL&b8S_Zu9LPtx)G{kpzF20d)<_B)!E+& zp~eZ3Ir`e0Ztnc#+5TxlWE~aauEo7>YE`~qSi>zsOrM7MgNNNaWK49I@~8Qtle^z!>P`;eUYAziZUP!yh=myO|Jw zUMtk|b4J`bq&li(!1uzsvkLz0MnEC2vjpTxkaI`eJ8r_Fr>jmvt`Q=A_^A7a4e>lV zz$2_jJ&-5dJ7mHb&zo__g|%Rc5W+ut$h~*|uDbTOkP+VgcFcVbj4SVMT`jENE)b&g z)nmrqIp)m`>Aw=zKk5;FBT7aHFCb*DP@)uN))KlBxTGi(&w~C|yaxKZcpvlwaR9VV zoB*wt@j}WJnF^XNuLQkHUJH7iydLxhc?;;RauDbcIRtc=91S`~jsqPp$AeCg6F?`* z$3TBBe*^lgd=d2baxLgOiFD=b@*U83S*Q8!e=6&#-3*=`3~@3+ciTsN<#z%Wdyo zE-aLb133}eBsW8nJ~N3;7z zrn`yKxI7`5ywpgV)&3A?xW!7jGT z8STM40mKPacK0wSOmDlN!9eyOYL5tq4aI41kA{wL!A?{6IC~<}m;(Rl2BC1X?DkH> zg?LTfVOtc3!p}8)0r+C$zHkgp(=%>ZTN)16-d+LsYI~i%F?`(mST5w7j+f#RzmVrp zUPEai&o<$LKI9I?Cx0r_PB!Ir3zuJedpq2_fCctYd#{O4{sgi`ycVG2J!JSXJ{ROy zZ=bfmwHu+oINb|rmOHi+^)LPxhaY{>d1pT-9_Jv%$#eoC*u_o(bfpFr-~~OR zbcLJHRL5?ohtr4jPJ;&QrI>L2ok4Vt!*QCrb=+!ar12jE-hlsjU=rLR8wG5y6Wf^D z#8x;T2tR|40i0~m@y&MTISW~*kAw5=)HusX$9j|Jkj!?;Mvb!)?*2fEv&LEPY;v}S z{5Y((zXNIQhQ1VhA8-Kf!zi=k92RbtkstV-g!?2otoi(t?d*{rEz zI+!(gv%4kJc1*LFrl?ma6^=WYH5p8ch>A}w%*n)G*utHxAH+0QtwXF_s|RQ{$4#+l zmf4QoSwsb9g)Z9O3YzIAnm`0d_ZI8e~n7 zawvzfTd+IGHcL6oWrk8di&>wgcEDZ2ZXZ#^L}|p2NvOCmvN#ye9Gc-0C(Jf-NEhPd zHxF0{)Cl2V?c$7QP(0yGlHD9?<7ma;BT?VSGoR#41)srg(i5mnYWKp6^dbLhr{>@2 zM>^V`wi61k`7*>IT<}}zjPy)`OszMhU+I|y-6n&rVSUKIDX(^R;COZe`+x($VcHfiIJNZS0JZ!x&LkIQ<+^|uNCeV=EIuwiHaFMl?-l`NKs%r# z&>2Aax;;brb^AIa-M(%vPz00#?SPIzXP_H^u8S2kL;M zzzN_KaMnE+p`4Ww9w64~AK{5ej>sT6!XJ@GGEfY#p9vGo;kAz3B!IYh*`i~pdT<07z&I4Mg!x3iNF+K0rI{WSPHBFRs-vRjX(y&AF&0; zwjJ07>;-CpL%=bh9>@#hG~A~nz6BbAEx>kQ7qAzo1r7nnfcl8j9^2{fi2~w*6d)7F zzZX0J6u>cev@bm%tL-+5()x(d{(&2xUd(dYg zel^mmMmp6%lR~dq#T3 zpuYi-kMaNWQJDH|sYga0fAxs`Z%5(Fd0f+DPzk&BXsbtFJ$S#(%>J0_r|O}(okO-@JEz!vCHvmUv`Izhdsc=!PQB0<3^91?hhr1OJVFDfCORE?&)` zmGPz6f>o=wxeNTqaA}(VF0D($^}`zYV*I%MT`2R~f5E>V=YK!lq4vKE8`2-bv0eb3 zKbeY&d-|PaE`OKz{nzE1V7ln)`;_%*pR!jA<$(oj!z+ z&KXbng^uREO#oXnehj>BptVC&7@Hy6;A5J&IlYh^O1B9Q=Pwk-aJGSP7oQV4k96$1 z3}%r3|9DJqGLD;-ufF=H*S3SHHKQ`QasNsRFJ9*G zJ=nd8-FiOIj;-lgfu1wywQ$pQr5?+gu5%rZ+?AT1UeLx7w_B!|fH_MI7XAKu^QT z-Pgz=U5Jz40AMgM9O#DY$EBh|bij37T)(9h|M%By5e6&k#*MU!H|y@!bY4^sMeBO6 z+3CO@3hjk3P-n2G@?%$I4)J()R^>K1lF)T#;)H5IUw6K64LamU*P&@o5$ke<^@>iS z3gyvT^b-TcP%%P`7URT3G3CE`WS{aFTg+o`d!ph1yRYF9IDu&?Yg+Jl-jb;vrS)8Z z#%k<`V22F*O1w7~@6x_m0&FRJ2KLmHXwLhDg7*m(?-SG zrD&h<1Kuax!~2A_yifQg?-QOvE+craQ1D)1H18F@&U=L$d9QE_?-l-;_6M=gse}i$ zh}t*pmC}C2v!aOiO6T)l=^uHobUW{r?&ZDG&k;xQKB7SRv=^}`9~*MKo9(t@H+C0M zewV|IeMN+}Ih=5>bg{eYUgdT{{BCY{5s6f(MMS9yEfO!AvQD#L3@zdqP4hM+$Qc3kBFymY%k%cY{b!6 zYsF1sh`3)oCVnBF7q5u7j6dy*7GO`R8~U4}Vl4KG=87d^jo4!RX}7dcTrRE?H;ZB7 z0r7M3OYwsEqxiG&r#;jn^gZ3tVyn?sr-^ykrClqw8h_eZZ7Hr0*Na=ko#H|9xcHU$ zo%j=78^!sH!5PdH#iFC=f!049y})!aUn~>r#5UtkyRaqVN^yg@Roo>W5>JRATraja2|@d{t;AKLm$+LzES?m<5x>WM0Plz$LxzkR zXK!MFEoItn7=`Ra)a^+$Vh~Z!Xrhsm ziAK#P8oijPcNNi?O+;gN5sj-O8h?^#LL;BG40N@H`9Jh z2QnSXbOh7UOvf>u$aD(R=}c!aoy&AV_2~QVOJ?rrVkBV!C(qgZGY2tz~+M=`p7DOiwfYmT4o=G@EG@ z(|D#SOf#7Vm=-WCWm<6`SXu|Bl}x)b?ZLDU)Ba2cF|B4glIa+xKX#>%8#Wad(;sXy3eIPx9sh?>c z(_*IOOxrW<#I%ZOcc#6W_G3Db=}@L4n2u&T?tur#Jdi$-=@h2Zna*N5m+1ngiCk7*J0Ha+l#;iPyI|Ud!iqQWT^Sq)J#_84=XWL-BYl|`KGK@Qy zW9+yB{r{EdzpuiGdo@PkYcLvi!H9M(My2a8vRseR;Rf{Xy)Z`Jh;i;Fj8!*dytxHq z#;q9lZ^O8KJ4VktFai$2C^ifu(VZAg?!tI*H)aL*U{t>sW9xkwAMeK)_W;JJ2Qk(> zgwf(*%o!fRnEx}3ypLk^d<-Mt&oPQUj*;jIj3rNEM)4G81W#jJeg_S5|I zr}_F%>zAL_b3d(b|G!)B({34Ef%(r-+NHqG%72Jj{Pau&tpDHXqFqNiemw03iXAyn zJmm$Nz?Ak)C3bI!#xsp!8q3uB4^!ST7XK+qdvdfl_J4{?dUg)w`k$lvs^x!bPpKqO1(7$m(Eqw+2`vt%=r5Yq7P;+GOpr>a3GiqaAB!*`;{mr>8v#cY95? zXX6g7RrV&_FH~or#C<=pP8ROk>E!gp9W|q!$+&xEv9k(Klk9Tpa8G!n8|!Ad#cl`e z-}ZB>-LdX8cdlFGu5vfJJ8)n0G4~Aa_>GUqiYSig5YY{H{8mSd#l5|=BNpL~-t`gN zaPRHmh*J@b9$yFGQDdQU^7Co&~6H?lmk zGO}mnz{ru26C!6uE{I$fxi)f3s#8>tr~y&KqsBx{j+!1d zJ8FK^;;3a&tD@FLZHn3!wJU00R9)1usFP7=qZ*^#=-B9#=&b0x=+fwR(Ve2ZM)!>F z7d~U zym{VIZ#!=%Z&zg@$?>6r)?>=vx_n7yj z_pG-u2G3tm{kd!nKYb}LFV}K(hT-iD?_>CA!$g16c`!T3zoDS4+DdA{MRIi%}dgX66Ao{Di} zGPNegA5#(2EoM;6xR{wnGdpHU%(|GJF^6NmHJWp=@v*tF9b$XO>J**Wk+G9vXU8sy zUB@Au*bT8eW9wp1$GKXLi;ByPD~;dHlW5XN zJdt=VDK;sPq|o&*CcN<@{Z&K$tRnsW+_^3meH)ZS*K=wnhiJd$Yzt8&2F}&**YU{ zXtuLiU9;0Eu9j1xQZiFYQ#z;gGxC6xQ7MyC=B6w&@`{v=DZ5e*r<^r%L#j75E44he ztCmx{rw&XVojNsjzL6KEu1wvOx+nFRkx!(aON&hlq_xv>T8FeAX@kmeY&UJEr$cADTYi$P?3Nr7uojlfKQ!JJJuNpUhAhDO%3R z$SBU}l+h<+xRFO@Ov;#@u_R-ikvC-Q%&5ya-Q3l3^Qh*T%}bkiZr;zx1DcO&KDqha z=F5z{qWQ+=yP6+ve%8nhncmE-%<{~xTF&gAIWTi{=G4sjMqZe?GILYrp3GxLK9PB@ zMQn>ei*{OW(V<0;7K2)hZ86=*Gg~Zbv8u(E7W<4`+oHZjV^(5T9?N!CQC5en?pXtk zG&pNa)|9NdMw*|sENflXb|dY~I*?VL)u<((@+JBLz6v9?_jU92_l;!9^^NvT_RaP! z_O0@5HvXG^yM2dzr;T*h@A^~x1zPeK`#bu3_y-wjsDG?~s(+r57WkL@*ZX%EX_vpw ze=-}lRH1*ev+eBU?A&a9+;(<{?C#kEvUR^^XOGFAl07GTi3zzZdtLUn?EOYMkX@gB zE)c7wKw=;eC=XN_sav3bU_@Y|ktPRb2Nnl(uVe?-2DS$F26VaGffIp-oTwb#KiN6{ zoU)wCoIW~UPQRStIpcF?7-?3{qMVgEn~bz2XHU-IoHIuHHrJDzmRqEy+|t}mxjl0S z8>u>XT<)}7ectWdg}EzoH{|X#e!FuI<(>*EEd||RN-!_j-bfvTJ%R&+qm48+I5jvo zxYS6?gX@FagSAGg3!V%%=EZ9%FF7wauOhFjk-Fy%$QzlbM+ZA^O5U8jn!Gi}Z(ZKD zynT7cjZ~j^F5jDNW%-p7fdf$V5CI_D+@Lj>@w1xg2M%;3vDeGdJ5AD3ko|J zsZ(Lk!a;>&j5MxrTH(CHWky<2xS?=I;Q=EZDm+yriW0R{lv0#e)UK$Tk$MyjEE-ib z*+^51<`yj}T5F{BMca$^7o9ND$)d)Vu`T^9xh->BR({}ij%ceoK{>=+`hQGk$M&nDjr=t#YoeN=M^t4UT35Y#XE{? zi|bi(i%*q^lK2vTNm)r}?O)Qlq)*Avl5s4_k_kpTtz=%w(h_5%WJAf0lG+k&!!9{h zDoW!^13F}BUTM41uBH8rG_Z73>7>%xELo* zyw>o;h95J$-td!`$ft~a#_$Hi&s`#ad$C+$Yq`QTJl61d!_9fC@Ee)#$;El9C@{Rp z@M6Qu46iV}qv4$l?_qd%!+RS(*zi$?k1>3l;pRM7%rf#E!xtL9#Bg)|D$Mz*Fz2Ph zoQH}{Cfp98+O80B);jA|YrXZFwZVGb+GxFj^~{^rY3pnI7xsAjeuSBhFe|M;V5Rf2 zwc2{cT4VjuT5J8uI%oZW=TClPFGQH32(!d`!CGql&RS-@Xf3yXZ>_LivKp-K?RoaE zY}C271I`~LiaS><@IgQ|l_T&RYw+fZwtX(rpd{PU{n{78WI@wCtdVUi;pYKt=MS*4 z$NCih<+%EyK+COJ*3;H(>ltf~^$TmR^-F7>^(*VR9ckZUSKD{m!|l89gwEaeNc$dp zlzp%Lti8zoEmmyL*){g__7eLAJQwpjdzt;Bz1;pio{o9RUTOaU>$#Wh)y^E}HD`nK zy0Z}}`9;9`t98seWBt=QYkgyVYkg_Rvs3I;`bAmD zx~<)Ew~brjwso&?d$>2aHzMaWV#u~>pbFH+9?xBPixTcSZX4A^k`**UsJ05%NW%Bj zNUw~Mu`*7^yX{an_aX#cr%@FRcpObu=(bQ}bf+uop*zjxS_2o20J5SE*F>UlHHfZ@ zy$AQZOdn1 zW5ZfHw%$mmU&X)*)SqzJKG64pz7PGO^3<5HVZZ2vy{`v@wb@<-)W$fK4~d^9Dke9^bc!goBq)EhrU1lgAhuG ztU~%#_;<(HLprNXF8vXfpZ_p6Rh!s0IQ}*nfd7Kcayot+>Dz6h!dj$Xj`xn0pTz%6 zSS!nM{D3MyT3#1Qy?i;s?J3_`zLPbod^t1}3O0b>(J_|K16BgM4V0d{p@;)~NDs&`>CCe;M1afChD=yer!x9mR}=rB3DLVVx{b zgEkG?wDPjBeYB`@w>+ynOWSXKyfw~vxxPj%aCbHG-+C`_2tZjOl(FA>r%ku9obKWrNpv^uuis) zhc;fQvf8p*wuVq;jlwG1PJh-YcFD4JWC39NWor=*;}ik9-)sA2TVZK-+3c`RmQ6&M ziO{YFHMO^F1ne&^8v#xl#V%Ra4-(m0LHRH13rqkyhjo;*QiQGsrEo8CxPH*~gSKB; zC$>hRs$jpWthlV0HLA>0=7BZ?QaE0#GtgiRDs#g+iWvn8@JxouUcfp|2o;uu>M!%{IQ z<$-jvbRR>N?rTMDfJ2pT6;|oi(uUFo)+o5QBGhrR5RSJRn#I80unxYZGleRhS-Lr_ zlcnRK9S`li(uHCB)v!OcbVlh6W52qznnN|U-y0f?1*Jp7w#a@FEOjgG8P>^Cv=Km+ z4gwA3A8n+x2mOtGT+T(P4v@n6FF6Gb+6V#qRp!XiMoJS)6T>=LJPNOm#CTOa3e?yy z9w4mZ0rc1QvEo>YP~D7uvL#FAKvSUs{ma^Zu^*OjVSw$EP8NF^s$^EltdRYd4Z}BEP8OeKs1p1`_KS}q|EK7$?H3<~ zMi$o@`#RokXfU@YK>v!#{|e-P9oA?eoh;soFz6YJHxzFO+sBw$yqx~V{ zCtI?33@}v#dUKt(cnU0yE*{PHNhdib#>?WqaD~c$EbMnK9$P%t*v~D_MaaRBC|^2W zJT#d=kFXBD#qD9q14`lkNcLNz{sXGzVNhegCF+06-7U9*lSZ*iwp;`0LcG<8w*o*L zFt*^^67?S|;hC&k%l1+Ku})T4BTo(6NBzg@c}&YO#(s6nYJ{TtOSW{p-q3Ucx`%aS zAN9XwQOkB=oopF^HUMn^G?f2%*pH{bv2VAug)C|`_WwlrDmn$6(13m&bg*B9k|^2- zO8Fq2ELz79$ zV}uTe_FXg-sZK1?wVgus7FN*+`WyRIMODy-#)wxrUuDpA)&>CbNCg$$}JyD(F+tA#C4<{mKITjD5Sn z=1{tPI9~oKXfgoQj|=wmDW`7!$*@l5qy7UbzdpY{WIrGEKfjj#+J630Xk`9&NFiG? ze-1QjHK5<5^Pi9UpI?(-!{JCL^D##PRQ@bbQ$G2aBjr!T6~+<9epP-ILiIEDb-XfY zP&e{BhixJCe9V#ZD?uqAZ?gSjXff*JT4r(Beul8}PUL6gXK4F*NAr#%l*icTczL^p z%-af_3EP7GyhE_G8kFpBCi{6C7%FcGTqgf{m?h%6>T+<>sJv-;(-4Z<$Ax%fpcx5F z4eQAMXoT(uO5xsO`|Y4@2knHs0b%>Ous=MnTV6L~KQ}LzLuvb4I9@z7l|X=Pkq*AW z6R=dA7aP{eAkHBP zJlZ5&4Z_qwTLWs!CpcSJ!P)d@jS5x=s}X7vqzm?YLo-4H`ahfeqbCUV4dT2ToeZM> z11i`j*oUprQKJ3_E9uV~6||v|!BR-!c)6#bLH#E{zg64MMg7NBcRepA-39w8x#9ZH z_U+u-+*)lvcWLfYA#=AI`y4NK4m5QD+Q7y3b9dyTOpH$E_CuI{LSau}99u&kbE|}v zJCy#cQMpyn$lTtLF2pN?rlSV*e=+%wf~A67tcZ+G=A07*g(*U~{^y*4{S5kR`#DE* zj>1x?{*x`4vl~F&Cm_@|Z9iwVP&tQk4uy3xX9>dKtmiDr3D^IeIl{`Ble0X>)c>4m zInxj-RR77A%oziq{^#iWAF_{S*b@0vc!%__>h1<^Iil8k*szo_ezqysYZUf} zwh9?I4vFHuL-DYCBm-D01@?w@@D0=n6{rhr4(nuKJhbDXT^U#yvLC1xR$yUZMqq}q zUkwd~YHGhXG~tvtzG@yT1+s{T%kbM%Aj+1mUyOyD{YqP`kKN}^Ny&albZ9jWy_ELn}ZtUxLbD%-p zpmWf~{%qKvom~^w$?O#fvjW-`+5Om>fV=?q7i3puR~h@{lG)`K*)M};ERYqpB_LrX zlszarDy);)=>Gwg-4E21Pd560SkC|_jq)G$A4MpSvA>g!+rJwc*!G`cTci_^4#83s zC>_ BwDHJ7HrdsIl+gAT0j|`m;v)r}?KL)N)7^Zx_cK1I;`Q=-xN>r@+z_{}c{K zI_aO!Q2zOFh3rp*eb|Imo&Q{aE<%OoS2|uiG=nq{YPYf99rnBXyR&`LN#8yVzl%_O zjJ|C``Of;zvMhbu;eQNn%DJ)PTMFIYutxe;LnbT^+o*w!**@LBOCOHjH~A79lc7V~ zHddt%^~4~QkEO7&6lswxeU-qxOKhO;@Bz?%z+t*V)(F{X2OI5t?X-<7^o71WV}oMg zsC>y9aPJ`-_!a`gN41SZWbK8GfG@zZ%vz7|i4@bsfGcYabQd%-s|Gs4nXrvHLS-GL z?<{Z{QklMaA;FWJcK5r(mm*-@y>j-cAc z4ER&a3&nsd6Jss`+K)INJ7ANbkBw5B z2=oOlDq2(+8>Gplm_Wz|#!tLeB&3m<$OA(kKf-1rADMNTR0edc8-ZOH+sH&dNN=pl z%vq2%Lgg_DHYR1#?1pSi07hM6V*qpjwEH*=+D0Z}ILD!UjE0SVnYxFRnHA7sEpkiyIGbQi{Q5zZi?}#K9-C+=vIX_GGi@djZi+&&t)vlSZZwa zhyT1wY@qxy0BA8Yha2abL3MyjECX#Wqg{sS=Q5JvAL{2Q1|1998|lL~NY=WLjVRc# zGpG!ZM*42x48=4t;7UIZ91d$_Miy)U2ph5yD^&XC^vx{GbhLx?)o_!I&vZW0>!Dj5 z*2wg6kO{Lm4y95J8`u@UJp94(jqqD~Aq% z_7Igvnlhk%m(PCcY1qh2%hWbf&%obnY)}m3BNgX6wc&z|RLlzuLN+ijNZppY&DdBC z|8vP><2-x!JsglwSSOC1!}$kY_bKuROWp;WN*oN_Y7jB_bR;a7LD4c6_vU?XK4 z!VuPmY^1D%jio83-KNyQFVt>LJ|N2!-EO%&Qf5OY)P!wJhK)HX`q*U3K=@68Uz1~D z-RQ7Jrl8yn%z1$|l~QAD%9J$tlf9-kCPN26dzj8kN?(m;4bX6@r&I~m>_oE@EX!tl z@ud+uXQ3Eyr39ec9@gkE6mCn%MzgK3v8LG?V`C2dmRxKDvTO!Dw44vzYbqH7!Z!NB zM)zjjjg21g?{JBY3g~do!#4UrCIrGZI>Sa{vqWRV13zVK9MMPH%r9i}DYiix*^I(y znDR*eR;c7}K}nX$TY=*j+ek+HAV7PR!z_eMSjllvV#zaMV^Q)VV`B<5vy2UjK_Nx} zXd`fI8|W942~(iaA+TOb9+OPN8*?3H@Gj#l<#~>Y>B=4ckC@CId-_I1brBnI`Q{+Rd^|S_{9;aED@02tRbI!Wx-0 z88Sg1KSCs74wE!1iOPWTF$SPMo@^Y`$C8BeoisA6kx4a>39~s4*}yzHX)^3;8^zF! zzQhLFN)p<5*uhkNa;d83LtBQ@`1Z964DaVjE!mV_grG*Eb;q;P zqpdK;avaJj+DrV<_@Tx|B{Y4E4T?b_&|c!9hnsE0ZWfXdU&?V1B6c-wWW{H(Eb$d7 z86QhAfiJX;*x7>hMkC|VrWkn~2VvtgVIw6zg=HDH9vTC- zhHS(Z2o<+BZf#gb`NS=aHRThB`V#9w_<8Iv<50)rrokPu2v^K8=*EUMGA;`;VQ|Q1 z9QwJq-f_K+jd=J~!c8{n&9T-)R~pvH*h5Gch>Pbq2phW_Hu#0BbWUP-0;evqfj%y_ z?t+aNoC5;FnsXn6xp?fx*o`d9*ctF!X>9yM=OYGnHg+M~AdQS2WH3HtBeo}O49D{> z+!kW1;7@g&j>XuBErt$yqmi+(kO>(a2Vr9xVIwLwie-t@E@K+trWhwpJ`O;4Jgkwi zXa@%7SYS=XW*D0?W+VK`UQ-)r3wTn8G+)xO#4I)l&$VJ^3l(!R<|IOp{{$d3*P){UNiY$~v zr~4nBPn-if4>95XI0k)3%*YtiAA5JhFVr8Ke0otzc$s`q4`Pw0CIrvE(8=>ZZ4>i4Nm~ zHw6F>hwA~E@^(Q}2@Un27c~8#p*}XGfeTNv{mW5!sV+4QgBg%_D2^heQ+T3}&I$Fk zTBp2~;w?-Za5t+==65{Nov%;GBbG-O9_G+^J0WDSscjQ`zl>dyxN&JCLIrM1i1pM32OK{HEgFd<$_8 z;~MNi@4)r7qvEt^kRF_kESW3IWk*>hyURXufE2={Ba%lvn^XZu;W zH{gErWw?8L5!|oi&hr;>ANOzJ-iUk9m*bA^#c;oYyU~A-d%K^5dlT+UUxB;4Yv6tp zcc{OF`@NqRuAT1oveWEqozJYl2^Vg^bHwg!`z*|CAm!TS$lYwD`v>kAQ!7d#(xdpWiEHq_U4p|jO4a6WR* z*;hD!vvJo2zL0Q>u;|@*Y4ze>g;sh$EH?0`x@s5=WXXN&d1I!yQA|DZ1i>$ zKKps+O{d=ZtMhl%7J=_o?ZKD&ik-Lc6{~NY{rHYmon7R7iSJ*1;(X;aI@_Fg?HuO= zJHy$IFGjXR?v^0U51mua3A@z!r+t-k+Acx)zXLDA{M(#Rai@Cdu63Lv>qGP@Hg+i4 z<#v=y5Q7vhz0nTZ!c%F^H<|HpZ!oK zh%*y$YT^4K+%w1$YjHIKx>L|iLY=^)Bu0;`SXBF<$8$#14)EQt!^Uqs#j$(94`Vc3 z*TIGR(-7u3$MCaz54)>%O*1ivk`Kb2K#ajC!>|hAlsf}6wCP(epf-l`G$l!kv$Tzq+KmB!}09GdGK>+JTHil zU7W4XQJt!12gkrymOb0ilG2P{$O#Dt+U!k9U z$etj)_9ONq0yA78E%auf9D?P|EU&cwggF-ZEU{kV*%s`G83>_7ckJ3Crl=xn-v~{t zNuk!NMGDfEBHF$YK3@A)`*smy-(e3EiAeczk!n9-KOyq$C+(+1zWucQj3~laX&Xg} zv&2~J#fTtKRwt-jVSo<=;AQ3w&n5vZL&1+iS!^ znQjZb{le$^@uh=+n}hEe2HkwO0B^&%&h75fToqr-1Z*)F?;t*oH52lOchq#jdyEH( zDR^)2PVCJdlaX#Fhuun)M*}IYgj-n$?L-`<^{?f~zEiDP6vLj(@vu&U8zqNtDxhzL zC9F))$KuQL(Ep6-LriaD`UumX6SY1dDt=)15vF)54f<0|KVpj6KQ#YfN=G6stPc2l znnYKT+n&w(lS~h>?{mn1Bud~3Oq^5X5X_c`$&q5W93>wS`{mE%@5FI@onnVfpktKF zQ08CB)y}KVdby5{T+EQo5ObMoD`u;At;b{*+n!2P(y`JrXYqIkP%7R%9Yj5$_c1?< zr}KUfdq20PS&v)OttYG*){}Vi$x~z(R+TPKmZI1m#sJ}{UJBO})J+P#uewJ)ffN3s zS|zg8YW1opq;TpggtNopZZhF44(I0(=o_HzrEZ3$d(;jQ!SZG579(d)m(ZIN>u zH9Qf2i8_I=V4#Ly55Gb9JE${*@r>JW{3B3Trr?>u8Tdz{*38H3VGaJ#s6RV}7p>w$ zd_UnB{&A>f$59?%;-4TDN+?lA%1Dt!YXOl=GkwvFbC<%oYk|4#Eb%kUa{nYITYIcM zVg_pdC*n!e{?Eir)OsnNLan#NY}EW1@eJD40P#zFiRyOoD{fuCwjZ`9ibeJ$dy-ge zKWa}E&)L)LY2pQLZ%eto{SNKzX|ddX2CeS*-0D_1&pFSDm$>b%R zjx=q_XvH_$w^46|zUXIo?kMLyKlc16(o|@f)J|mhQ(&p}$8j?pWlSJ0Bb4J(`rw(|kESr^CkL6cYt^5^XTIeJgj9_w?Y zOfK6xLgBP+xJ`Zxw>g~7hh=?AArZ&XE;@3urPE=n`%MUotaI21lw~c-?-a^Q+fi^) zJjeP7VPL}?7u@VZxrAfep_C9_QFw3{=jH%H+-AZnNZQ^9=xx6=_7skv@~UtI#65gQ zKey_2Zq4!TN1iAyUX0|_fLkcbM~v$Ll?-$a_(L2^hkS&4DzaCL+JW+<<1#s~MM&+A zG&SgyJ{Ec}5^O~v&X*TybV-qAcCj6oYu*v-B=SOiuLos_nuvIOo=x6Ag-pG%4t`d$Hj|AxLsa67&} zFoM4@KwlPk6f=oE)|bvI>xi4vbezIdfG?vj--J8Bx8j<`yXej9u(SU;_WbJc1@Lp? z2b?!cdaQcqMe83p3j!m77tcIr;)@79@jZhl@kIjqF2OJGO@aj|;bnOCm%h968lGu+ z75B=0i2Hj!!nKeCxE69&oDu&-PrD5L_)uqwwbyxGeBms0UT}Vg*-SS2@L16Y{o!Nw z6!hi8@MXuR?V0wIs@A3}Tgj>?zIjlKvEdW+@lWB6VN>lHG$XP;wr|3Dh~c-per5}d z8*z5LonR;8Tak^@#R#+6zMbYxbVi()tPkxZym{;y5rHp7I5_VC%)01n5N$F3-GCtU zb)I|hrG`IZZdHI;RSV3o@-frOb@SXTVaF`QoS+jbLxkvrR9lJ3aS8^FH=sR=nZPVup?MxxYCcCko8dN?R(4yvgZ;46 zD(msAuYD1|IA1eg3tzskmG3g&RlY918+^C;ZuQ;fyWMw(?=IiZd{6kE@%`HOobN^7 zTHjXR`@Ro-pZX5^zVw~(HTpgNXn!+*sz1Y@78-g2yn{n6v+rf8(?*~5&ejNNX_}AbU!7qbf z2fxYl=XK1h%=ld*@pxMR);734bA>$%YEy7+wfkYeZJ4=-9o;z z{s@#`BFZn#pXv8=`CV?xZ=8P$m)~nm%I~J^o3m%)EkVb!|7OZB0p*t-F2BKnYA!#2 zP9B$^2zrC}2OkUmDp(U-aZ&kg3%(QF72F;CDELY6K=5xUzf-|8D8I|Y<#%V^NG?BI z1UOW4Xf>7J`F~Q4Mz6G!XyXj@YXgBBNur-6RipZcI;763GY}(4*Z4NDj9fqVI~s9h z*wOeSBaV8G3_cnMcifRXjz%829(eXQsy_LgH9iDm^ zmJSa9?mB$?;em%cu-~fBr!t@MIqk^s?_lLYtm_WWIQaO%X$Pkq{Mo@r4z?qYgDF4; z(7o>L!LD`R9lZbGtq1!Zy!l}JgY6EsJy>4%)Mwe+0#h_#T#+3h&!U`GTi6${HiTep zwRT#&n}ikCcKGeJ4uBp5j$?EhYS-Y(@fv(*^{8F%jBwYuv=8^c{ke-Tc)Oe2eeP+T z6cypcI|@r9%E>PRqZnvqL>2MSFQQ`v?P-XJks%FBgYmuc@z74!TH+x$TvH;r*eIQF9i?&AAvkmtpLr zk@Gc-oiuVT!r1vSM$eBha_++#rxv5K#i^5)mD`sL9_6$~V^YJ#?--s0K zJ|y95KDuEG;KSL1qdXFQ$K z1uMX7@kBvaJZbPAzLK;X-$nXF^uYbvy>U8@Li-SSV>Nm z(c&=~g_Y(n@%5!o@xGT6*!Mc+Hh0r8R%e-!IuE0Et{dTc+$g*uG|u(9F1`pE<3_sC zm_L50ZdIpT%eB=2^_4n}FH)Ydd#iR><8@TMY^=i7jjE68t8P}uR5x`U=Bn4@i=;PT zSBm!0>d~K`R7cg{)w^n^dQa_A@2lPF1GPtesP?Ll@ZQsp)qeGfs#Tw=1L`wXrw*e3 z{ahVZN7P^OPSg|XZ|Vy*SbdMLUk*`2)iCt~`sfCA8@`D-5dHM+>KipkeXH(J->LH$ z1Er-@wPm?V-HA#5aCMjEKp3I!RwHFV=E&=@w{(r{EW60A@>*Fbua@0pOIaY>qHoKP z&1I%+A^kEN`%gicC-Y^IES4p*RJM|3vNiUk+QjzM)?_b$m--x@}TT156PS5=dzzXEN_uVWPiMiwov{_E>&gncdE7Y$(Qhr)4!q* zKPGRJf0G08b<*4A-{l~ALf#?2kc08&+9C2Ea;Q9s>prLCo$@O=T%MM9$*<)Iywmn> z`A_V`ot5{2J zs;x{_ZDfin$BnxcVuFSqnHhFbSqW7VJWj^DpvruMelj@jA{D-rXwW|-@ySP7O-J*dX32h=$AklV?c zf-kLJ?{>2)tTvd(m0O+Ebga$hs9&hLZl&AVt+KAOdaB>4W$FdB)V-UR7(=pVZ54SNB@?I_p7eoHgEhzIvBH?yroOOp^M(tC7b=&yP4>{O!gRlL(>rZ4(n}eyY-H>!+IC9f%ovv z;`goH)?3bc=T-Yv`xX0-_Mhz6><#vM%mLQo8}P5=OYmyc4@jCsS80QYha&B<0b#8VX=X$4$)7P<`C!L==gB;g+!g+);e>{fJ#}pRm8c_szev8|?4xv-UU6)lO&U8mH2J z%YM_|?DlbQa{IbBgJo55+tM^J#@fL7_*8Wv`r z7`Yi%9e9ogu7e4Tm<;u1n$bT^={u3v9J`R!pqdAtGW2~c{y3@Bc2gMQ$&ilJFAUFW&U;C67jTZS+U zz;$lM2ylvX3-ACyac%`31_l^B3Vxf0brO7_2Ch2^TrFW(UxE+Pa8`lep-zml>|y3tTl~ zNDufU8rX9Y_(mnec@doI7GV7Ye6j{#BdUQLz;zjVLmdOx^#$gi44cl)3mP_+-%<@+ z-KY1OG3;UB%QT$j;FKQVkPVUnHyfPF6mZDi3JtoY8gpER9RfzB_bLGS`(mkf*Zq9oJ5Sw&3p>l!5O8-UrHo z-3Dpk9~fK*PW7133!w5MTo3FuxB>hlgTCPV40?iptbuhFJqxJO2b}60;a;HD;BN3w zfdjxj0F@nq>NvF@!Y#l-gD=1j89WXCxxtg*hYg+rKVt9;@S_G)AO31E2mF}9T=2gc zEC4@lunhd~1~uR(07{?gcD(`Boqrgt1wRRV2~fQ|Wv~dG+BSj8__P6))7J)6zGn=m zT>oi6<#N`5%J>@%tU(3VXBt$N-x*NY1_Mgxd*B>EwtvvTvu20%sezR=Zj05xni{twYhZPa+qgBb&c-e38d!1T)_V>52Ct-i z05qrIM?7GU`Y&qd+}2xwQ=S0oBPHbnpt*@m)u6smqMZb^P<55u! z>R)B12F*t#r2$a?hrMeC%~>ScDuMb)>DQn+i=?yx>K7&2If3Rhl8ynOzEe^@0GhwZ zpa%7kGEal%IFix;s2`P-4**vf@cJVS>dz#l2jHp$UaO@+{hy@x0Ioy`NofGozsgb# zT%Ewn^)#rDlw}&YVu4pIYEU07%Qa{|CEI9FUn?mbKyxYCRzqwCr+ff3pOTaY@=N`u zyj+9kQNjOi4Vt^jUK-RN%ibC^Uy~FEpng~O(V#h*yh(%lR@_m>pt+bNKY;p9*-wM!V)7OZ z>N{nB4VtgXTQ#VEl@uSKIhrItfcjKP@d28b$=fxkAH}{PLktGLLxcKSNisn5J4tZ> z>W}464VtgXVH(u8%4!Xo(@6vBcO``bXx=C9(xARsj?kcan7mtq`b9ZXgXV7X9u4YK zwQ8}38SVsdJEz~uF`Vt&IMFUhE47nz)aXAJF_$t>XkJccm{g(N!A<;z0sgs$`VRaQ@HOI|2S1~ss=+C30@Vjf4{)jO zQyPG}6P)Z4Y=CUxIMi@(I_7hL1JH58wiCj&3o+TKn~o+;N%yC`+xEF9)NKbSKIKNTXxl@)oORuwN+iR ztW|N7ecg*}EO*OTmW?eJFyM*{;22{}#}GOMLK2ezp%{WqNe{e%)Hm-N5>kN_NDm|- zA#aG+|MSe;ZL-Oi|NFlGCpkW=xpVKGIdkUBX*0J6xLyJE4ij^fKwZS-yPNQP0x<7K zyQo{3ydOZl!)#MPeZg!8j6wNa;0{0>zds4w1wh-yqriM0-Xo3!^SJ!$|XDbjd0+U{NkN7I^JOIW)d>wec0`WEA1q#G>fX@LeM4j&e4*(Y7 z_v65e6$tP$eFp^b2=Gz`0&~J#ra*ifcsXDt>R@h|gMd}|{Y~I=6^K`WS1SPPfV5X29GHz=U4WR55hKLXyUfO?a; zNrCt=@MZQ3z5?n}<^>7_=ApS&0d*_$LIvVA;ENPc&oVDoAYKRFrhqz^ zxm|&H19*o5>R#qf1>$GGyA)6t!)_P};^)AZD4S*RZ1>%>$*D0Wm zZ(grJoB+N-fj9Z(}3aAg7w<-{C0^g>9 zdZBr{0`V5`9SW!;ns+J?zXHBX0rf@mZUy4k!1pMi{%GE-K>P;yBMPWXn)fLXzXiTu z0rg7rqYA|DfFDpG$VVSjAbt=0aRt;h%}*#0e*h+30MtEA(gGm<2>eL})I-frDG=`f zKcs+qsQIu0@h4!;69Dy5lk@_JKLbCifcmNVm;&(^;KvnES2dqdAl?N&u7G;0`J@8z zSKy}+=FfOrr1qyp-;<}(V!-+`Z1Kt0!dPJ#Fz;O7-k=QTg8 zK>P#va|)>Qnx9ud{n7k_0_wiz7Zp&KG`|G+GTK0X|B3?Yk>(2us0*7fD$q6H|4=}^ z*!-#jT>!tNfcmldvH~49m|s&secAlF0^I=qh63u&<~J4SCh)fuP>(jhtw6Vc|5E{V zUh_K&s9&4^r9gK9|F;6_+U9o^=x*Rw6j0|jzo$UY0sg)M>fh$83iMpyA1I(cZvIe# zo(KFR1>!@%KUSdU1OG&UI0*bx1$qJSYYM~_z^^ON3xVHIAPxclOo3hm{Bs53O5k58 z(2Ie8sX!bCep7*70{oT&aTV~d6zCq{Un>wtfPbSvF9rUs0&z9)?-b}>;NL3{*8u-P zfnEmuM+M?q;I|d%KHzs0i0gp=q(Jur|5<^!9+-0mpa+28RUmEv{;LAoDCXZ3h#P_5 zQ$Tyg{JR2i6EJxlK-afi5cdFMya{?eFvgf5?ghrU z67&XOj3q&Q1Q_E-&>Mj3n&|he=-2gof%(epPPqf%RfZhqrHUa2QwAc=S z-lb`^2Nf{>Q+tI1`eJJjDbRKUU#Wn8+}gtmv^~IADL{3t_Rk8m1HgY#KtC+Vq}2h_ zj;#Y9)fMBt7XV|->o9f(Xjg|e)sfC*7*4!}IeR^0vE^UD+&zoULD&FFyg>3DxgmSXTwS`I)PtOVDMcp1HOj#90C41 z;G6hOI( z{1)&#{O0)lUV)Brt@{JukFb|#0l%%l#Ww$00sSm>e^EfcOWnH)=yT!8x&-=W>fTd8 zpGw`|0sn({JqG*_z(4VuV|7Y_i}Xn-a81#)pc{~b^=1)pz5?20!BPb#CV$YYz|?@t z6wp==g8v8xo)-)#FhHANIiM2H1n&i_0X6tt3|y;#Hg+%w2tiIg0vuLgyaHUWz`(c# zI~34{2#yC#z;gF~H0@|NJwhurXHTZc2=30b`Ky!liFtA^Ng)t3*Rs;(?9BNl!;XR=x0F0aQ0`M}x z8vMrG3gNi~YyK? zI}}j&58bJN_CyHuBG85i-K~IjLkRPQKpj7X`4Yk$p-m71y$BZG8`c%jrVP6jnAZS< zhX^LdBkWN?+cXSbCD48i`xMY_4p%6kJsqx8K>IZeJ|vh|0XHcyj{vtQFs}xlqrf}_ zjPW3t;FU1Oj6j<^yg`9^5O_p^3BHM-{RHbcaESuixRIa&+U1du0@~}5dIc6}6=_gl zJq6sTzyi%9XdA)8SVX?9zydvEngZ%%F`>X(4vhB`sGr3Q1s3=q#(Dtii!ojUSPOuQ z6j-x?L1Tio3>fVvP>+m(<^-!B81yDsGl9JdtfjzZ3aEp|Fct(0;}!EOu&x9SD6qhz zv2q2}O=B1@f(81=FkS@f3g9XQ7UoW@S^;&_7~~4UItq;OBv^-l>l9cR!x(5zux&5-tm}cnO9X2^aI*sI z2r$NtV66jgRY09P)~3MP0Nk#?+5fwcso72%3$QRxW27Cx+5+6Kz*-B;u>n{Y0h8|m)&MYh0$^PX%;y5EMZmlUpgj=d-vHVw zvBdz;n|geVd=H?F5#yWzSRP=`Lx5ERyg~tOo7hSPvw84HF}uftP8I#Yj5QUw;rf#VIZ_Ne*ySf1@yfc~V|?SPM>{CmI;06u|swg5i@_%wcx0e%$l7=CNOk1H@w13#gFzJSF%nJgx&J5uAX?O z-&f{x`&`a1)>$QvC02`z5?}jxab8|=cYS4~Cg67E7fuXMinn!6Dl0B7Bbb%{xTec0 z`Nuorn}vn>ON~%dD4K5+=6TEPc=rT%+g#Kt@%c*7MxDDD^$q$7v@lQGd?HVnx|r90 zyk%geU4|ZL!qhfux^DLyLSTQ({Hp%rZSop+h+mnkki2GBX)MN{8oZ0R8}TC3)Ygy| z=L`-$!Nhze=TR2n>Y;ozX1M{@cjQFm@ti|O)}`Qx3vN$%-wa40N5;a58As>*8% zYHFt~n=+|Rk$Yj{>v#0~d&1=v?xCEi6MAP?9?T$qiuSLiXwa2Ko7+?6-41Oqi?NUD zgjTGTYWJNeMf;O{gdV|xX+p=z!Hmh#MnElnNHP@?E5wjHi?gB{&VIpe{E;*6%B*WQ zeQ-4)T+5OVc8LX`Q~@c)|4MRmYZUW^+>t=sM+lJ#$KOzW-xK1)o|B>bu8rQ7c< zt!#<9A`y=xKKy>4ULT40;+;L+{^SpR;(Z6-`pKRT&*`0Z?hEnW&T(BGl@rHJpEQ2z z>ec#*C2JvN3`|1P^b+KcLQf3=>=jrU|0BT-q=mI9HB4MQl`6)o~!- zzpP7<8&1{5baI(6E1Y{Wo@(PvJiZ$bOjg2bX1G9fY@*XwkOv_@bjlA1kZ82Q8?7&q z0>teDuauFd4ZV;gT#I@g@^+3Qy!gju@vg*bagew zZBOA`Po1}DgYWsfLH&&JNYk70TG6|m^iGY>CsXAe93S)xjHpkRYgLIhq!uY(#xzy9GPfk4f*(dJ%!ovge zB9Z=u`iWa#yka;pe$zp=D;NLtqh0x0xptdsSI7cG2<+=asMs`(p&U#LyFXXB-J{xA zhbtQ7ow+G}M^-gEcJ>yL&L3u#{1L-X-L36M~MDpa+@s*%Qk?y!B zUMlqrhy))%-1r6bYuvae)-OcI_U?_aW6)a0Y!Km7U)glm|dqL#&A)e)D#Oc;_2A_mPE0^!q(Vl|dMVL?(tb5qqb z>)4^QT*fN0%&DXslz|k=`C7h|^loSwLiRD_gPw&o=ACy$C^1p|hex+Rwd2W4^b@;f z`(=BjEU3cmkOjp+=$9&|j-kq1$}-DI2UXshRZd=31E!W8Cn=-3n%^h7!!(%wKm`{e3F2*o~k0E6@hoLMIbJpCDFXGD9QFtIftaoMuuD98ut7KedzqFSr+ltyDQ&I!L-F{MaP zEvCKQk%o}R6?y93rMI3tdrRx`(D-Qoa(nieh7~13-*M3M*{60MTiVt%SW~&@@*@}d zKDs0E&@9Xm*;j*eq#m!)T`ipJsdCN*RoQjqI5tUOqE`Ia_PDDuHt`T9tX zaJfd?PyeE-7&4r>X*c0k3)<`lKUY>(N^WHtBu-hN4ALKs@{(QUe??Gvg^wMQ|Lcx- z$9)8Mcf_YJ?>%<^v0naj?0$VaEoA(^JroE2sh?Kf(^CuG-aE7oedmOI{cH*~L1>#uvg` z7U|Xtj~-1-K6+F?u{SYk-#+o;UbZdg^jy6aZ7b6*e7el5>$6o01FD5m2qs^VAtQW9 z%Q##6sxr&ZY@QSho-%6QCTw^zj?=ghO5F{jcunY&-HG4LovTM5{GxZ-$6iz=7nl6nr;8&&Suy3TVr$5eU8 z`QfY6VVxQnw6tX^3pI!&RcL!r3C&x^y0TbEy}7j1Q^JSlm-<#4$}Me`nynmPTN;vUAiFc>DJ}>N z2QLaeb-{-1Da$xLlUIZepOc-B$KaR)kH^gQw@{>q+(XAiYY99}-#P?3#rR%1@A_nW znol2)?Nsgg2HJ^oNbsiRrk3-h5Xa5q@fO@SgnqES^1AHDmehSvRh;|W*roEx#FJVs z?tC`!ByMFxsWVSPokDG`U07IL8yqK# zFd9;8!423sHaK{~=P5Cu`NyDRb-NpSF*AAtZc&1sC+zm_^~WyjdFs%iw`x}OiIsm@ zunaN?H-fVIY_zLP+xkpto*U=iBwOU;stYDKK=a=2hvlEaBUu-<&8*LMzg zCFYB#cdqVE{0N+7i!Y(wNj;$m9G&xjiK9Jbo-%T@7iKYKy0^X?%oF)kUeWd6I$nPL zOM2V<8y6kXowRV|ZT;b7mGY8zxxtjE~lta0pXHm`!P7-Y`?wpx&D5>i@<}GGU)^*#@TTu>A zuard2jVWER+T-)WKTG=w>zDEeNV(IE;Yrg%k8T-mv1=xk1w56Nk&}unphm~K%>n=F z+?={-(1 zF4DHgZHAPla3h5{qVSKwm##eQu=Jh@J*`dp_~Iad?XL6vizR^`ccdi3*?>#-{TeyVGx!xZlf zKsM1l40!7!^iMPx{ua<~7|f>M3+$F@HF zg0(JmQQOBZc=!c#ZRo=3yANGDK|Ew8N_QXHJ2A1!RCFdCI42RqIb*!Yhl*~FA6v@< zA1(tQ20*p9`;Qk%haTufmvnwESHEG>4@*-HY)xgdO_e4a9eQzavZ^X_bKS#v@b^e( zsC4>3q~i`6;h2&+Ij&*Y<(vMHPL62#5SpxJQIq*_rrjb=7JL(QXE0Glo#B-^+WTI{pjYq9=d$|)Ny@c&7NQB zC$?|D@D~#hbX0m0+gX4abU?Ke_Bc%y4X#&MHleTq2)b{ZTu)dQdO<-633+I#hk6ymP_CgNLrW>d3W^l(sfBw3fDwYiudqF|TOOqW1CABcFft zk*|E|(Un^|<6Bl7+7aKvr4fBXi$ffiUkeyQeG`4@riRbTV zKlY=eH$6OlVozUBulUGtMdBwSH}Rf+V)F%^?Jsv?U?BTtAEZp8?wejiR5|qoRo==j zvp)0$_F0uvPdE=3gjV4Anqt~Tc5wivML7c!u$oeOf)5-j12IYpjb1`AuizPBL?$Kd zv4o~d@s4bRB-#>@21%5XLBo#W_0%6=FBMPFyZ`7*KO$CuzFToV||N1wqfDq)g7w_Yic4Pe{E%HaAXzwE&C_w zgc+ToPpNX!NtH`|iu6F7hQ7C6ZL3|;#5hg4Zdd^rnYvL34XOZ?u^b(nQF&Tp=sZc8 z4%0xE+d)il#OyH9Gb?4%!p@Dh#Jtf)6>vLi@Z{g1&w*{(ft2f4eju^7Uy>KfjHs+D zSpIL&j(UfpQG1@^r2_C0X{5^2IwveBsr$RN)k@lxnh5YIH;uGK(l#N?5MBfM=uKt0 zjhF!E4{xAP9!5VZDCZi3cy7%NJDov1K`&G{e5aQmdqE#tqW7Nqn%;W=CKn%&Y(ufO zN425K5{`0#=m8$1+zR07bl{)@o&*f5TZ8X6S=XsxL)z-b;miuO4^a=@g3hAcODbM~ z*l-R#2r@1r+ZgYro!$HV?%l_B?Lu4i-jA(Ld{sV zoQKSaA2oVxO3SL7$+CksGd`-|490(m`{iQA51l3Irv@nE5$9$xXF($e?D>vNCfvrc zJM}e55AYTH9mZ5rcD>A2(3&Bm+EHGnEmLFaq3cbqn$l)T`$u>|7gvIPQWtE0vJ50< z^paO}Z2-QJvZy!0#Rk3+sinX;EA!J%frBKjw@=u$^uXZ(Me+GrT*Ln4+ywidO+ZgLZXovbLgR$zy8wW2leh#jMaiBr%&M>%vmYWE_fzC z2S!bbuwF$;X?Lyx@uZYfT7>6iEO9j(_JJ>(&lu^$&aes z;YX*O{HV&4`A(ysBl!^ogjx-ohw}OmU5sbIf5)8H!9GQc`G7U0Am5~9QKgj@aN|FJ%; z^p%Gn6K3L{aBV%6_`YbC^p)?F^xdCDUsX=}s`4a#RXORa%9HdR{hTCyVXEt$=u<9z z#<^G%;MLa7<}(HXm?D(+_(`8JCOH?{)FtIJR;74QRJIsSE#`R= zE-^RpWAXZxS6(VU`=QG)A7z_lpFgDfoCB09r*5UnTPZ41<%}Pw@(!oI%BA@x%IUDx zUA^m7edP;dx$=4ScBpdY$6&d#yL%b(!}FC+$8x2wB)v?28 zxy&4_WG#yxCcCJ%wzi?RzCIR?Hqvm5GI6H9K`l^lIK{iWUe#0b=ak~tGgDTcg>}}wL8EI(8&~!JD4MGBP^!Ept9(qVJeXBplPV8om8YK{$t>5A zPvyKf#&V8L;$1m5ZP3IYvCAXEw8FwLdxhK8T3UjHNw_lgq#_;#Xe#DSQC6R?;;!zQzUY>PNMor{EjjrTIo7~X!Q_CQ1UX??cA8Ei~HASLS{?16E z{J^0r!@wG9>^foQeKnoCFl$;>(HX;t(Y=S`Sk+q;OQl>+m|N+o95tjh7-*qkQ0uBV zC)D_@OVPI>lkP@&s=QIs-8lUZ%!!ql6HQu&Hc1$^uRf?-t~!u^0++_(e5k*i7A5dh z)x&*Nlm|I)YMTmkb<1)M7q}6+>+gr30Lgn4_$qskeyvs6Gj9`p5IeD zdF;%A4I7&V%NuH=&C_CC)5^S4T4QzQ<)S?N?T+She_6Q1(qq?NQ(1m}Ny)N+t*9JRb-D7Q+V^rHuuYI}n_;_3C2s?2wvKYnU<UOdhv2;NK9epLJl#l0)-C;o-&ym&}%HpzI6wn}@aA(KVN= z8cB9Ca(MbLGIB_npz4HEb!tb~Ax&U|k|r(mgJAj_&5#3T3&^5dXZk@bSdJE?BXl?V zLEt=-tE36NE(kfRl9w|pWg3-sZiGps|H=|Q_c^7Ars1}5)h?!YQ zq$A#2E=*GlG&~zUf}`n?qFHr{X5rCwFy9)%N2Qo=B}giG!Y(TYCu6GNLt>JX7?GXh zOeu1=T$ivyadtrkbIb!dr7|z$0_#Zb%bZg9f(1-=EMuc9*dZ_*W;v!*st*2=kt{yN zaAp*2n`%#0LoA{!3Qr^@*)X{R9^FZ`>xM+rOK-?2pEq{x`mVM1oQ{1REe)M9Ppn*j z>r~~0aMN9f7ayF{361#qMax(B_r2+-vz@ePHEOh4aL@|dUx`^2gv&yoS6fq^gIKkJ z?`?n@|2tv0lhLO7b{SV?o-yM-GVM5P_CP8$Xbtu0$lSAy@w#Pwa~E|Fuj<>gc+ReA z6VIE_GPyc5ciaY1B9r9r~W)+)V`)^Jn$+ef8QUM;1)lv0%>jDHWCHb&qdP z{4LNjWBTmr3l@=Q1p0SE|0nq2-XFqsbW`0r$<74G~)G?f@|bP2mwz|7T>_*74L>2 zZzSEg*ioVn3}o`prI+46@JFyui{vAH(Wxg=Otfb8JkR*V5Bz?~NnFF)LBnRqAwTBS z4R#)eJ;P_hmt%$b)lBeS>4 z6a@l->Ohs(SFa)}m?Wb_HuZ#14|RaZYujhcn9{Iy>fmKl`gSjxzpc+mJk;A|y`T@B z*Sb91F#AJG2d?O!dg-!I`5RNF9wa}>e#$lcqi8?$Z#Ph?ocgyaugNN>{;kSuKcGCA zRZhKJ)emKrH>JwMS>@E%RsBe2xzyKHd5q<9oD4ZmTru|81;|_1Dofq;;5s%`gsUM! zUI*O5#gz#x2``jxY=E9FH#hXtYt9cP%UblFbB97k?PPxNTHXc+RB?TMeM@~ytU1yg z^5k&WiaP`~4WoiBZ=({0Q|qeVC#8a0Z^n=mbC}wCGE%x`Zr`g0>>honrOWzD`M%cW z^&XK<@0!(CaOZ9{cnt@qOhw;?HXj5y2lL#gU2W%~H75VRQe$&L5MniySd;yg&?E?&uo_ z7kaK+%f;>xe3Q$>j_(`{YL3{HC!^I6UYLNo?ixa18iK~Mq%516+PQ}4)u{X3xHE?l zYv(~{zuSg0;D33ehL3_FCoug|$g9!`6DG`my)O+%o%j$|GmkbCmn$J)t zRYn0AC9a&nR47&WF}aDw-_z^ZcL-TU^l4oqUGZ@nr-y2Cas!c-lU8@$a{c=4Z8vzk zI%jn^)GuAUxURahb<)n8!9-Af?Otx=RwNm8Jm!Q zoS!?a<>q2cO*3Z*D*?vT?Uu&%%v6&3ln;JTE*_DWo1c2(*&k!~{l9sFmg6$9Cn4Po zjBYi3XzTw53yA#I zz}SJRU|U%D{x_IGU)mauwy)b+6$`bk{XgOh%5OFPVLAQ+qpm?0{Tt%;8|-4Hf-sPz z&nxx7-gAN|m}t_2)jw)uE~N>0Mc;(LiS#2nA(X=?*5#_mg;t|FaMBy`%7iGdG{_)o zFlpeP!jIlxP9K~#|9*c>d0YAY_lwtNFPWd%FIIKbhk}V)^tZ6fnQj2t#!BtOc5yj& zI_1NqqR;b|>e%TfrA@61c|zt8^oPNuqEhorB>lV&O5rquolez%fEB$<4fkQ-Z`7|Q;vi22FB+Ju6oFQAFFae$5KnwwdJIN(FDJ_Py3v5tAx=O zfpvmjYsfMeHh#HW(_wfziNR{&pf(spCFX%(Z{7#iqlR6Zs)tA6L_wD&cR$E9V?ND} zp0xrNTqInox618NNc@re!+ZtY9p))1E-FOB^P;(&U5@xyfN74Z2KIUo{s9~qeL5=!!In*h)wK5od7))A~ z#t26_b-T&VwGk3RLW(?F?m%3)PrlT}VR ztjdE~<YBZ{`CwP#cQbAAKWSDYyAe(;8o6>&-EM!!LR(Bqya?`_ zbU}JdrB18HA|`2$xrvymnw$07Z%+6bad(uuX32i$dT4tp?FBQ{?UoDV^nR?VE|(6W z1#g!OcaiRm8g_BP>50XaoQu<^Ke#@LkB~;PKDOXtfu;q=`$jz-Zq?BhSpzS}2?DqW zu9y{^P1rtcn9_ig!%$FPAcr6ntgEdo_j#R(%wga%DWy3wcfB9D7XofF5WNYr`&ZXw z=+6V6xZ@TvM&F}o-q3mKuUpf)^O7-~@QK0nJfi2`K;4n@dL@{71~8ldrIWa z8*;fH(?DQrxRi>HB%GciFSdqbuERQ{k5S4sUgOsAWHEdXGN_u7BL@dudB86vm^E60 zrFpJ9B<=yDHFtG4ZCv``73Ise^n5|ACVSP#I~%}O+qd67Sh3GLZn$3rwxW^nyP^+} zXN6k)X;_`fRJnZifU&vhOn2b|h)odqlhG<}fq2?esUx+O*$58169EIgYhOkI_w3QMPPUWr$y{yYNj5VTs4Yh76r`CF|LHb5#Tgp}0_ekRH!4+<>=pF@fM z7S3WotQGzfxY6*BGxbyZb6~{bwMi#J(v<}&Cu6P2OQT|~S#AaF&xuF{Dpn>fR~j5l zZW8Cth&9CQ!J(m#hzXyXSaN>kf_37H;4acrw$Jo~o-d*WZmdnOXx~*@#doFe$*I#W z{Zpz=llBqmpTh1F<)305j0^iIpCiZRrquIqPnP5PVNsBH!r6cFgnU7oMtipvB zs%`w|+MW58@o-&pZqF1w*1ssRN9?KbM-uxSqA}F2Tx~uoLm4I|3QusL|yhpncy+_ z4D{`Y+{5E_`jx47&$=!@y0CNR0>_Tfy?u=hOZ#C+tn93>t4-Xf;G3n#Q~;8wEy2ffMtp!Tm}F2lvvks01eS?4}~9 zq4cg$W+lo~)O0+z>562VI;mYl=Yq@Y1FDgFHR)>1Juu*{#I_ymhE*@M!|Ce?#UM#? zR4v`4nl*?~&_cnQs`5ZtDXiZ@t-zm?)UMoaoXElDJ#ZFUuWrpRY&yqR*BY!FMfHES z1WSYE1FI{eb*;Y{H3F3HlKxzW6#Z*Sf0jeOkjGRx<^D>NOs-ojuLSQEmqD}^OZm!t zPpGtTq1Y$+%0BNg$$;j!A+oUP4$;8sZlVOjy zg`os9x#p(qR}hFXMvq?FIXGurLtBNfmX_>w`Ll*+%@3SErFNGmGNE16cPfL{+qV!l z;K>Yrq;8|=(Wv;*$zzPcAyKY5JDvmF>7vvc={HLWL&wsA{(>5EN;%fL-0@kNSq|#U zyhg}MUFMLK79!!Mu)Hwf_0ai&4KrEh83Wa+%@`5!;I-H6-+xWt?t!uG?PCdg?CvX$ z+;RJnWgnWod*O!+U|$toXA)sMDi)R%g@dQOb>!2`{w_aN8tPFU16h`d~9SNJg8YTFV-(7)QX z#1MDJisTFeqtG(Gn{^S9?~HQ1_pG~?qO}q1TB>S3>#ilt!!vd*#l^c5uG#O)kM3&h zorqBh*6(O|aZKr2D?dKQv!+n|`0^!3?hyOJ`@;uTV1&fZ@SgsG!8I|_A`*`coI4mx zysBsk8c3P=BhX~@Sdljs&0v?1W~cuSoo5Z^WG(hA#l@Qb<6cat;%ebGkujl_6kyg+ zTskE=$r49iMv-GFefkBt`G(tV4(D-iVLxn9C;=IHAbjYUWZistU{W;;;66_MG5R(N z(eb=32VsK`zD)+ID5>W%#WVB0ln!HYW3K65!KUGDE)yVhA=fo+z zSml(!(ygzrtJAdlcztJEOI@rk8V-T5HApE5mlbj=5v*IJl=#ogDUqu>WD$&ui1anH z4mU_d^pbOo-@4kH{0&GYS+=p$J88_&x#tdz?en&+jMkcagg=;gvogQZ@2@DR3hJ?I zuB|MeGriceaQr|+(}%A;d}mA3Qsj>GPbuv`*Pc^XH)rZ9IO?S=ZpXMYX8k$4tPm^> z|C@o`qMRvtxzc)}NG|6(B!(^Y7izhqn>k4k9G_~Cd^*zN7}%!i3vqVFOsaw0Wp>8_ zR6tD`zRsv*htGDMGs}6DR0RiZIO#Nv!Rvqz?Jh3EsU*&hKq!X|KDSbk5CxJHCh^2~ z){I>}Wx?3{Z*bQwXjsqSb!%HAa{q3cNEqUG? zde|HbGd;vB6+V^l!VdP9W_0eC<+GYMIQ_dnmh78&Eu89|@uDa3T&i=F2au6rxi&lF zjzM8skYPf{z_|0=6K5%w>s+@oGK?nn&wG;~Y5fG4>nLw`(M5cSi`-PhgUwRHV3GJ?$Zrp9=rBo@$Pb+s+0 ziar0Be8&;wF6GdA4tiRT#$i-y$A+w_qJqi~pHWdNh0H{RHVD6)BVx0jW=GC; z9dk7M02BmEF-%T~&{yh&2qWE)H1KJwb5Nv4sOLA0 z#zU)T?iFGbTC^BTZ3L4noqL5+=r)*IoMod@95A;yH^ru`Yp~SP#hA4+_lkEKsY3zl zaWZ$LMde;WMAWMtXvlnV!^)z5P7G0Il@Ej#b(D zSiAc{n5MJRZP}_(d(rZz503jF5~gUErcp3SJMa~0q-dA6F(!epro!jc#i$C`uRNx9 z`(%I#yFAn%ShDA(vK(P+Vc{}OSbStS_!6DfjdL5P(xxvP2BM%2Q>J|y6^uSWjv@_i zbOk#^*Cf~!3tzGhnKm;E4u%`8o-QrkF{ZV-0>+yww+xyB9pP>%(-c2qg#$O@3>R#g zY}aAS^(y@UJWCe=qEqLc+fiBR_14x!+Ctj~XN~U+R@Br+B2{&GRB1_dMKpB(CENA) znr63#TC2)xO3Q+Q%GOz9m#?oozc^SMX{+?tjtK_G)Ko?M6;(asPQ9gjFWf_ZoB*0e z^}8WQaDHbQ3=@#k(y1gQ9g8>~iJ}g4Rd()Za|Rb^xzO>Gkv?x%W|k+9iDe<`x zgyp}=`sY+m!H3wL^tT==JkaQTRu zOUbs^Xm{B8HP|CB<`oyE;*8i#h#Uriz4=HaO2?iML>bkCIt(CcAV(GgIeANFH9LCt z8aV%Lg;OtACHhxaat|FLl*c1wAK@MLauNe8?_U5bre}?F%PoR8qpt+ z1)bs!*UE|%aq2ac^VJi&x_RGUAb}i>x!}p&8Y1 z+Mw>vQCXx}Q^PLsk_UX=C_;@jEv6G3k`saI9TPMpZuuPAt&ah5@Y05wfJXUrS}YbQLutR1Hl8y&%9Mb3KWhfAYq^) zR^}8}$@NVu&JiEtdM*1R z*Q7t;!D%~Dm50!GRi3ozRXOFbDi7kW^mAy_tMX7*`SetI(xz9>p-r#qCvAFJE^T^M z9^-SsJ+l~#1I;7aLAxXf+W`rPn1&85`;4jQr(OiqtpL#;ihbiz>3EaZP~eHJ-x^wl74$`A9cn+{8xHEM_aQ) ze>EEEcv!n#K0%E{;`Zdwq-nV>MVkhaAT?IB-4$(=?JnTu;Mvh$ShMGx;LiQzZnr|j zyc}Lkhfri;#(uYaR#Jas!<$X5%!QAP%kYj+dkpo7Pd@*dPjA|)A|;89;vO~#1|r_O z4DT(_&U*$2nt&yfZ^k5$D*%kU)c!{0OyQL?c0OX+P=#Ra?2V7lU;|!h@`R_ov3 z`*?fDrx)H5={+(wdV?5A+>7A-fVePmD?f!yTFJIazCMM5G+(Q7@~J|dE{@2U%Z4iRG$vv3^2wShwVJLX|T3xseDUpg_c7A?O#*}LtFVJz%7@>B6HzkX?`_fZZO801p?$Mr}UbW>^Tpzt@PwD)*{@#Z^wQ1YO zFSyXXEw7^+Bd}OJPFl)#k@f=A%b>j~2ko8mAg-qCgZ55&lJ=vYlcfC|JhTA){?~gU zr3_BFfzJ}3OKy`K6`wo%UPyTenn1|O2WvF9IMFY1{wyBeyLX#t-E%SeEZZdeoTK{e zR((_D?6WFQ=IN?(Jx33Lw_TsXDK#A}BH#|VdDc<`l&#|{ zufBTa;luJ@J+$)5t5#lf&C08;TzQ1|zW)H)mXEQC;_TXzXsEWT+*eYVM=v7MNLBQ? z5<*+6?#G#Rxh68)*WlnfY$_3=D)ngy*2vMWJZlX*l6es+70X6f%i-a5c3C7GtgET6 ztbhRFf1Z*;H!?rDk$cqt)h_Ccf5oLYpYv#Z%2oE{Bes2HGXCF1Su^gci8GIkn|*Nh zxFa(sUDZozNXauAQj&<$C<91aLt6^^=&(!bu*^h~* zfyDe=M5&V7PI>(I`HV5i`MJHH2Sdr^o~^0#pBj10HypLxiIcqb?Df@&;MrC2KR&v^77U2kQHvpq{Zsl_s>@qZ*(o%{8&x z3pazfW>ry1ZEJUN#mvSTOLuJQj}pYF7-%Boyv-eVz^c+sw=9iDvQgD zVYZ<;h4s1l47pHGm8yaCOG!h#Uy zFW)qE)5P z1##+}MDD>#UWekO;eabvk_#eWxi9>4u`p6WFN~p;o?fia!yfetFi1>$-Y%&0ml^IHoJi(o zOX($U)Q~%FxN}G3dl$oUP?M0!*MUbXT^-phHKHIUmQ8N7Eus9`EVx z4S5W>=DQ=_Zm4|d)8%D36Y+;c=i(URE`I{eHiKqWT10Emo;v|ikP?(Fc_Ifc zF;@-`B{y8gBCVjnJ%scwx4W{xxDfdVPJTgE>d?j}UeyY6+yx_}ZytSv-FCLRti_xK zeDGmJ-eDk-4ev&1*{)P+dlah3oATj!OZi_(2?T2>!sD!bX}ZBFEB}Y1GjJ4Sk?xN7 z;$R$o^QOravlbM5q3E0%Um&mOm8NscC#{>4cq)wV;8gmz9%*V4cH&EqgL1`io>AgGwny?M3sqPmGsr5*A|}e z4f9y>7va3NjWIPDd)Hx*2 zc?^b?uHk?dz)8Uok0%H0FArGCKDbkkr5-)@P{xU!#~zYrjYJb)NuAfJ|CGm@Ll;SX z6AJbe9u}+2+7(Rb?8|; z<1$=zJj0I4-kz<=QIz&GULK4bDW4orhhPUa(Qj zR}B3ccj)Ym}v^A8B(x+ZtmUy-7@`m!-iu^Kh=+5)pd6mtfA7BbU zCLql#=3R5ik08WfTDj|nB?x(P!s+~WM!uHfYB|6e-zotQIHIU3YPmh(-~CpJ2uXg){x%5Dqag$7F8PfS^bhPRzfs`R zK6J7ek+77B4|lggS0QF57Yx0!AFF)kz>TgThEf%vdf^r@J%nr4LsT7g=v$Gm39str~1uRd? z1IVma$BC%wa2+vP#X5HAESJ%WZ0BYXYBy;0(NHwnO6lbI{8QRv%HJP}^g5y{4COj5 zHt)6<&0jJ+yCFU zozm0M)wQd&siCE32?Ph}(S`Bl8dRh$K3TvZZ_-MW=QCAGKS5d;XB^rjWy1#?+EnK8 zNul6{;)Ihf;gZD8DAwiRDxOix`OSX)k9dg&^W@{~Dkvn~oK zf6hWxMIT){k4|nNl9$zN&6QKN#6|T1(~|mvJi}iErW`xgclSq+zwjB+p7?L9q;CsP z;;V_PoUvUi*DjpE!nF$v5E^#+-P6C9JXx%r%d@Vq9L$5HaZ)XiH?M-}5UV_jFd26! zf~bPHf}~WXHkLY(b)F;yDbHa&Q3cPjI{=L}Q*VQAb75Xd+rqhathuhJOgxaKu;H0# zFP3$AKB2BnPxB_|t7|Q&@UPDwhwy+!mJ|$0Zxk8~nlfORx&&`jsuU}4R_e=1dHy(7 z+y8^}$1~=9`kYQSpK2H81dp11Et1Nfaf^pbdtbe z11JO@e*Q+hBai9C*>s@eWZcMek>&0;{GI$RpiTjYxF6yr>nYo&95A8K5Q8+YOOHcvT+ItKG2!+rTg4D6?G_~{vG?dEJ)KKAEUj)f14Bd9CbFuwUzOlcFSqNfe-z9tY z?%2C$_x>F>Ghzd7g5TR;3!_ksoP`)|GV&YXFlY+Jox!BB^Zk3!5b zJBAi4Slvcd8}tK`XYuKX{E;|}AW_D9v`g$fer=R$T+$-vd}o_C!)HJSz#ZvHm3>iJ z7hKoW(U2Ve%$w7UKyQLa^F+L1X(hp+Q299&ZIF1q9!$5sB^$RNYwMcONGswmZTof# zBQdo%Di+H&Q@$@noAb4s`j0n2r_~Rft`9MeBj;2%2<-t?2OK}3GBK!#uBTNOvWIMy*Re}3( zvi!S-Ejf(#rkujO*{X{ffUFn=xrp z-&FC9i?{9GgGKq{ulG*sMVsZhpFG=?XV#}J8fZ00LSvhgb|Z2@N84%8mtmS<{Y}=+ zs3Yz4(U;-5p`FeLnd&2InWxr+t<&vCN<^v$f9<;d&N~kNXwBclvu00`UAW{Dy>D;g z!8g07j_ZX)!pg5tmvk?}T5^M;Jn|IzDKyQs$?XU_oXw7}|75Oq;p{rqvLys+?#vpl~?V# z<%oFbNaD4k-rf=M?d{w4!tcN-oOtAqy)$-VZ2knjXeIjP(`tDZ4!ppomHr?9Zy{EFzF*xiP8 z3+r?8%zbRDl=3yH|J3k%j}SN(xJcvYue}fznP-qvS)_iOvPad%UNfAEX-In%MlANg zC@qpZ?Bww}tfTDFQI|*W5SEgzMyrnEs~$0Bk21c)hz@)UNrMFm57b~_g+8`%?1J!= z*v!?4%bnI-D`&OOjLlhnbnVRpOK%<0Uuviy43w{2arx?@>dKX?mLA*9FDMJG2s&K{ z>~Q&w%L>@x<*>uC;~B?-VOX4K!T-NDIKFX-(Z)9}r482rA>2=$WRhm&4Y`nz#)mYnwoGmD17hd>JkvFC>l)zuR(R`do^EUPX zzl4=AqWzc3$fWBIpXU-I`~6cb9@qIvC!~SU4B&urix?P7~u%0q1;K|vaEh#Q8Dl08QW^+9>U^mvV zP^25dF|VBe@wi(aKOFCdM!#(DlXp*?c=X0!ym3k2r19^+FDj~r=3I2q&I`wneHD5n z;x@}AA6IK1vT-Jj(8^$utNc-C34?k>Yg5SYLpfgIl$uX9KEQLBc@P4{pfa-@R)%s! z4|V!7o}abVS}O6S?IG!+P;3l03(u8MaZbg|?ue)+H(#{ArK!0%$YtYfG~PmrUq; zkn>m4bV*;garRB-CHewVH4J{gz|Qkw6#NkgEOkn)%2iJWoRK?}+UF-DnDUG44GnR< zp?=IjXMAj7-GasEmDQFXF7yW~%L_gGi%Z5WlFZtx<7u+&uOvmuC2Uc9Wep=7! z8#i3Arn>6wx2vnZcEO#iW1P=0hvoOmOTlLksA(F7Fo7n7)6X!Y@pVodDMimlB{CIq zazErK%Bbu}NO=HPQv7AzK&EQIG{@0w&~($yNsGUX>Y(qLHL>Ljsme+5 zr)tZTWpG?k4L$=MkvdU`K6xfB(+ls2JZJL+zWXINxAp34CocF^Y5TqRj>*4j_l%y- zP^`OKzwbUVc3f-N8x=i?AM4L1-n{vq&~VAQYj1oH!StU?PSOX`E?!)Zr?!Z%3~gXqx%#hwv3WT}2$vvP*zwGwLx%WsXUT}C^U|If2M(;9`O-~^ zA8qKwXB6JU$EN-c{5SoX#Bnje9)jTPqk(_;jR%ibrhUpTC@Iu)&`U3tA}6{Sq4|TQ zNISrZ=_n(J`XC2M9fXixlR~MgnhTZjskxES7462e*TG`9ETgVGJi+#tBFI--R$4~C zlk`P2MV1*wTPl#*^~gLsU(e$)ZEv4Z)uR zf~9*L##L0yap#XD?>eKV9ZOf@MW^COX2l%oYOR!C;HxaJM9Tt*lqLTwqMee_XJ^Ed zJ=a^u@2{-bR#COLdHR6^x2_V0Ry@0CL00E`5-(%qfAXyrE53#QIPQI?YxOGQDNK|G zd?hSU51lat+f&CjLHL3#Z4N&J>8#*L!bY^1xfL)@*QFc=3?$ddOO!0Qi|H4%|AA5t z02}HB(+qhwRInD_HXk%jq#X7JbeT!zY=d!2*D3v_kw`Z+bDvwxTYJ;^tF9VXe}3Qc znG>V6ZR4JvH8^g3X!GUICH^X&e^!6{(9~tirY4GqhV6l7pT}R~DX&;FcT>-l>eBLt zx`9<+zVwpMN!>di9p+lD>kH)H@>>&-`MNkF*8r}2%k{4z@_&E-@d5~21SlYp=0PRL z)JY1S4eNGJjp=D7Sn|ujhD`>D!>N6qwCqxWEH#$u{wTL1IawtH>qCDZLR9u>+*aIF*8G}D)asMK2I^aksHkg zuleQ47@bUfNo}cuw;H)`PTn(;zveDkvhZW)EU7N9Kr(-M)u+eC^Ty8J(Ad6qe$|IP zUwZW67ZSHU`lSt*-gx7s`)|7O(%+O#vsGI3sXu&{EfiWkdNK$6RjBP$S`!X0#7sz9 z_KwWNkfsBZu-|Ye^06{%I>E>w^&`2QIoG-K6V(tQ!!y;#$zZ_oKV`rn@dd^k{s(_r zNFSGY{pitS3l@m)>0MWzmv~YvJP#9BwzCt-*F}9)AYi#(lFZ2%Q9ak^YH9IW>T`P(OfKmZ^VZqF7JlIK$gW z>4o-T2WvSgy&+uE>Cz?Ks1yQZTuXhhRR|qlX)!^T4$Z*4${{rn8Z~fmQ8mMi z(r9!kJJYXp76F(M2h~_mms#|{Q;gM^j@OvFn%0UHacYFsXp>H>rBzUnD&^#qX5Cg4 zpOVq4D_cf(7nr@UWt&nn0xc^ z6Nw#oV$Sh>3bALHemX289-kp7g^8SAX*j+&J~H;)(i!j?!vfE-V^>0GZ07QKJMPrRy)kwHMVo3$f6U;06*f>P1TYm+V9Aa~% zJtbM;R~o)Cb-MdT%mV=cP<-7-oc_CY3;=n_%qRe=KlVe)OX`&FzL;aWJC|a?!0Dex zz(3dpfo4yGfrE}rIvQdp<>ln$QA17*(?vRpHJbKDmJ}ccsF0{gY;I>@Zi8n`D9yM- z3rK?{;QD3o&O3vxx%(&YfBLfr9p^u#y+U@IPkvI)CuoD*{3-5rI!h@xoKw0%?DZuu z!vJxfO6ChtK|*oFO_`7==wFkjco{LldPjQ%sfpx}A(z?=?_)us7H2zSR{^@PMODMt zP1w;WfA;C;PIg~tZ@(}yGW+y{@*y;Vuo`(|syen?h6;n~p)I3m3*E@zf{)(F3b0$_ zK)@)G&p}*xVVyFK5JIP+?~!Ab3l_p&%^Sb>}Ke}{mNnOXi z>)&oWasLBPKPlI1|3Xfn|CAjx1l<3I4>?CVEc$<@37=>!ok`}ySQJ!qb{00W*SPP| z3%c7_4r>1gvxjiA=w~1L`6~2tmQiOfHYsD(C5`G}U|ft$Jq$kyX2WtrkY#kQ2O%O# zsDMQfbuHc%6A_L#f&gbpS*$1s2r!V5;y-dLD_1%9UD$Ww0z8F)bjp71`=~JPh^Vg{ zdIDiJN~BM-o?vxi*M%J)T5wEH2of!`0(2J4u}Qj$L-SxJO@VfuB%DS}<;)?$CN)9!Mf zS$I}n8*Y^UX=$JKiDg%~^Om^!<1pJ4Au_9}U3=0K&e3_NRCc^ejm3k%dF>Wbw*A+FptgNiQtPW!nE+fASj#!E&ijZ0-{7Ya&65c05jx-7t z9VxRBR^(&4C!IT4rijI%@yxdeMCBwpO zNa>GxH>4+2!&6joEG_&avDa5(uP^O}*;2M?H?$BD18jlKjg$pc8Gm)-#D$5CuObsD z*8i^2uYGM)zEz|Gr9MtVACsLd7rZTL9Q_zOFJYmB1mTp(fQcS7RoeVagb%PD2F;t+ zKR!Vno|K?}rP=K`;$zUHK(mE$(v&V$aRScnJAgE)7dd4r>tC{!GNsCMC~qn%gW5=_ zFWvQWqzeLTRYX-}tQAfit|(Xz5)oH`8|W<|ItU>Kld58%e{>xa53pGyw9DA&%reAj z8GFpT9PWp3A#9o;W~p1RgDi|+*)IgVM-=I zJ9>qJ5Mb^l|9%Ra>u5^3Bo}#7MT`vx4kdu%aL|rmRYZYtj4CrD<3!w06wl|8exs)6 z=Q)6I#zu=ak--VMj-ZGc7%12lMsemA!qu!Rm~?+7rHynrp|lyYhJ@>VyoK(l@BS9D z+d%ch1_6wZ_%{Bc7>KZ#erE~x(o%h*5)_lj*G__6AvVwDsCU}vfM6&gViHYV=Z0nu z;tMz+y`{Y=SwI!~LcOJ4GS2_bk-2g}W@uqsTguPhOmj255Y?f3M>pn$O_~r$8Y7;P zZF5*_TxH?E!n`zT=PvU@lTKcMZ5~mT)1GouRDp=h<@idn&XE&6YOQF5-XXt!)djXr zTapI%g<5dxZ?QYU-XX-@GvpE{|9~E_eI3uE}#P3Wh&^ zpS+}}q&6R(v%G==`4bnk$@|u=yAEB#ePU6lPZ|(0cSyBG!b-B0`lQH(xQ1x21TiCU z^eIOHU!XIL@IFv86w4;qI8w&YQ$8zn5JZp*G0X{TGTgCdaVRT9IcOQD&mo;wCNs~>90ZyQ*shh-GK6v%Y-#V+8|5`gsU6kPeDD3ki>>e0HDQNr$!juFzzqgv7j0sju6CWEW!zZ9c7`Kvf zye4M9jFV!Jg}A#IQrLE5ufg_D#~nsZe@tdeI>AB&E@EGOg5eVDhctL$Gm(Ec$7He$ zSM0cOq36y|J|v&nxaKEOd*xfT)qHLIsqED#CYIvsHe!EpNViOni3Pn4Xg6_2K*=Js z2b~aTsL3NiyLDlLlyNWDPr6|2F)4!5VRX<*%$>xv3bfOiBV;MA#T;p2Q#K-yrE`%v z+T!HBh+v6}xOnHsc#S@OgnQu_S;PKp?0Xda%45g(*~<=Iyx2^mN83mAMKcW_o!=BA z3%0IMK*Y$#nV$Kw%va^0Y3%5Zk7KAlI%@Ke`L17yF4AH=w$DOJ(3c-}F3qj8^zhpVR z1JA68Oo8vgI!Z65W&i+!$aEwpA~!H8TLikD9)4hHbOXW!jUlRQ{qbD6&v}G(22&`) zJ6}2Yl$eJuwDCH$F<-jt1y@!&6k6jZf+S2(A(K)tYWm_bC=KEdU?gEO%aNYI+Pop9 zmPG|nBK2Wa~ttG4`8sTrBU$KJj_F+~BDbI6ykzTtI$8BR2@=j1^6niX>R& zY4;R&Y4#wpkJN99o)s1n3LIx?*dGM-KFMGiO@9n44EY3EDw%@Gdn#v#2OF-LcjF!BPv3Z>JlJXZmE6@K@Ahq6=Pg`O zS@puR&;IR8kN$Ga=FMx!m&$Fmd_wZ`zMGO#`#YF?pH-A+WO!2XT%1|xOIe&*2L6*{ zR0$U?m|Nw*nNgg1q4bz)hg~8GyynmY<1w=#vc=F|c9d0X`7kzm!#Ag& zNU`wMz%*f~uyE=}4=;{lExWuFs%18503n2$0!RyU+l)Y3fx6PY_Kou2UfX|kWZ91T zp|bha&0W3fhL^P8%P&2bBHyuLUC)(WHB~E13R>EmD_1;w=(;C)UXk7&v>Zm?gt>1T zbLWyk8^0TK{3{A zxE>P+q--Iji{)uEjS69}n&CODD=Q5#!E5PsI5IOG9!GwjE7P87a|L~=h*dL(_Q4uP zMBsKY2bG>%&z!x5{?{(HCjU6OxwXAH=_i)fw$FX(@1A%J|NnmN#*J&W{P8VY#<{Oz zZ9fxhJLVl@uPt|@ulg~5n3q5O3uSjvUYz=iaPddu->9F_vzUX8$@nK)PW>#(Yvanl z9W6Jw5;*pZ`@c=p;Xm;Y=JFcsr!<$-q$@?=yHN-oWdoiX(-o>%bjiDDzhOUvE+!tT zr8uqWl1W};{duAh>IG80a>>pnQ!aJprL2@YIQX=$7f3|dKYGL%I< zCwg(TMU}>fq*Mq?scA477@wZ@5jFZ1WNk}MIy}>dVqbxikbGJ2*9wgVf0HjuFa%I| zah%s&paHCM->tU}n6#Gx0tVzNKn8s4&Zq`c#u$MUc)5)JDpEF}PrTASs;$6{lu$^_ ziRKeTz)-Jarz0I;y2WcIfI#%{69*kz#^U5Ci=lpiLc}nIVM~iy`{`8lN?x#i=~~(} zfPf`x8*?igOl>VX7&VgJaM0Y^)R?jC9cnXXnT~X}Rj#7zUBuSv>yuELK=kMO%9oub_ZYBm0`DC_Bk7Db0Bl3K&?Haj#Mfo?;K*e*#1 zzebn*_!G~fEsuZV;~yuJ-zOiIyS2Xqn(vQt_eR+Xo8K=t(!7T9ASphK9mS>{6)TWD z{A9u)uo0DLI|{Q(D=Irc+j#n9Pf2OxmU;89Z2R*&-}dAWF7E5oe&BF_ zqifE7UX!`#8^RX_fCunkEgD)Xp~<0zQ+#|(AHbnCj!(tSo&tHD8(k%HUY(oCSletsR}K zSKoTeyjcs<^K!kO%4d8+4`5X_iafXoH+AZA$ z#4Vshy3Gh@0(Nd-46$Jt<}kyxVK(j3rJlGu82=F`uU~m#KLHmiQ9?}@BqJH#pJ3y~ z9nlx?VY_9WoX#2xHJP#I(WWacN1RP}pE|#@z4P(MZoPG=`${&CC}NHvkui4zw(Sy_D<>xGP5a5GZ~CpNx$sA`o;T3@1zgH26^w ztk`K!u>-J!4zJ-D1Mmxb!7q%nQ{tgSaysJj(z&i^3iA-Ic)o8%b6RRiTWg26G!LX@ zL3>Vp@)1l}?N2Kg$rm5H@1Yf;_3k<6Z+eSn?I-#$fHKDfEynm2N`Ei#^M1*iM2H4D z%(2%q?HO4q(97dwgcS{=n{xOvlGv?;cw9HkC{0eP1Zkw7PpAN}Y+p0x`ufJG}_dTFxs^Q?PBg7j3>uAmST@0Y@r)-ImW$%V-P3&W_;|U zk9CYlVM2M~EW#`&Z?k>|fl6E)Mh&oY>i%e=1LUa3+YdA^>R;R1)z!S)F|PK{>D;<- z>Gnrfo#-E1ws2AZeuTPJ)huhNij-GQG&R+=bdOxovY}^SWm@*UuJ%<8+#ldM5&Umn zX{nl-=SoG3Np&)`N`Qc2r^6BzhB`yf0b4K1pghui#BpY*KPs_rK>LB}lZ<R7&-?8*HQVjXN>*SslLr6?()T30sm65B#=!5C z@DU&&YK%xR$}lDuH-r{e^Z|QIUa&)lV~yQMY^@HEF-A8X_G_*`Id9&v9liDGX~pd= z?Z|A9njNEaK;I$1at?mFT}4PXoE@lQiqYAH zu#jMmrofO+b}NkJ?U48TA;K#g-qgl$J`(wDDlT^+dX(Y05lF1Y^GP1+NK1s=J2 z?$4Bq8^-@m`+|0>y!znoUt(|+>>7fnD^CJm`yz!%8>e9e+ZB>hB7txk`XNmLuqKAq zMU&B1b0b3%bogZWO5ksa{~W$2CJd$M@^a`{0awARMegnFk|H`4Blw@myh4<9CK^T9 z(g;^BA(Jh}(vv^+y!M5XkxyRN(5znFFR!pYeA7+0Im>HnBJMqVD6+70O<&*U)@z@- zMlR`SYi;4XTj|s?bF+{R+ zG;&4#gG!G z4CbFuFia{C{G8Z_X!q1nvN60>Y)KR9Dzm*}pr)d;xT&<1l9xE0M_SDKM2HYri|1&c zXkA+E&Kq`>1m$f4gEe5Rb?6oZ#lq<2>wOfEo>T2UWPNi&_esR0mC>bJNlF8J$qFsd zN`Ny8(4uh{zMc4Pnps{z9^>WJ@Jz49dl4}hw_}S-dO+fMItHlGC0%rx(PQxdHS#c! zk5x(P86Ap()bi|5D^4#x6{(*IrKTI}p<-x%ETz2y_a;f{#T@$of9&QncicMhA8lF@-Rxb}twxyqce|HMK_u`YIa>k~_wdn``Pjs_Gi#|C&9qXym$C^6Wk5M?Ln^qD|gnS9YMi zZa}-LXX&CowR_nzss!c=j7G%h`$vZjY!*x>S>2%bA~_o10&fUtHwPb?4@l`GaIDHsYEAM&L_z7}?x#Aq&`z z*ycCqp56J2L*rMT>}Y<()wgiP)~br31+urlb?HJS+da@<)sc07(*D`q+M{zygXd`P zJczb?!QT%PwYY150ge;q$|ejE4Q@7saj9e-T_|(-Bz()H6UAWwFXG78`Sx(i%lVV? zL-yY&4tx>WTlxDeeUe{(jOJBJAzgW*^>|_i{#pqO5%^+SlBklgB&kYp{vq}d|I<;m zMSldC5|`rqI)xkbyYbi3#my&w>^A#vCS{xQ#JvZ#t>_6w%7UF?Hhv;Dp_#dB3qMls z+B_FnBLPU{C{KgCmcegW2}DY+bJxz^=g@xQ*jG_ll$I@De|~e4)mh^Go4wkHCV$HnCE%8frC#7mP`st=1fMk!vO`1o?~MWRAR#01PDgP zei0GHN1YD58Qeoj3iL%?+$^K|W_XP6h-YTVcDvn$Zm+|I`~q|f!+fR{uHU(6c4K;5 zeJ$h;34DK7e}8vmN6+fR-Lv;D8M=11MSHZhDfvsv=*FrQ{>Z#zBa2TA_8eO7%l~0_ z&vBY#+)kcj@FAf-0X^4-D5sn+4|2JW%E|5mq4gMVmvrV*ZZa+|hANF%y*Rqs!ol=3 zE9O)z93@dg9*s$;K3F5^T1y~7Gj*;m6pKLtQqZ8jWxG8n=RvrE4V>uut~S zn-A_gH{#vlU3L1pgEy}By!obF^!7LL2MJ={e3RND6=00>F~(u(0X5I?724%w$qOF_ z`4FRbZgRC#P)XGFiqY0R3Nv_KW6~xW8g1GZh+x%t894pfra&&-BzC+yWGNIVDe}0p zGp)%|SPomQ&PrL>2mN5=pm0?hZ#~osiesK(J#3ZJ%ByNB%ZE$*YxeeBdFt5E!aMih zHQHaXw63|izHU#N++R{ySm<<&l=>FVUFl1k)vb~Rzy(7ikf*FN)Zi(d(thb8& zu7al?zRUa6g~yIuq3u%~PaN1H--!9hb+BY(&-)zDyTvr^qUC+j@&J|ND|)d1j6psN zr_pBw*KOf+uG>}{D<3qhqU+gI9Y1Uqq>snh~RpF-*T>W`@o_SqoNIQ**U_m*;2Pv?ICxUsO zrYsQArwB)bbyVQF3n7lxO~j@N&&Bpk6Tu(}p@{%12H9;~AYgQWVpPu}j;@AsaYH}~CfIfQfJZxCY_(sy6VvthG!{&|UVWS7?^gL`F z^e*zS(E)>N56;IAl!uMZ8MF`k51%ub*xBgQ0lvGHORb38EAjxlAXQg|L$DR)WCE3D z87M%H&o^Z_FHW5wlQ|Or%zM6%}4@MQcS%eXY0LTZRa!V1OvrWEblN(1injq(Em5)}i7Hu`Hf>Xjqy67@21C*yR1CYjh{9)tXtx-4EmEz+NfV(K;iDb{TX zaNHQ>G#LPu?nZQ8JyrB zJ6;M`K|=s{JPzglK=jD=hxa)ieBci1RnQ~rgRMxg(koS{=jHg3QCA$4m`bKi{3GW_ ze!KPfvD4T6>tt7DMP;qLcire#q&U_7{K-&tIh{f{|2fxc2D}KDd=?WDAB5 z8Ae6AXW_ma<50%UY5HT@9d#j{A2~BK)0s&jWC6Y>%Z&|m!ozOSY~tH>mTQN0e|MXl zQp-))^WyqZ`BS^JKTd|K%Ang@U{#ZpF7Eei=z25rBclms)??8IKiv#s9Ll;kC|*+i zApFSgoV@qLj~os>l(uhT_qK=5$`72?e(sKxl~u{RR*$Y56AN`pdbYBzx*W}#`U7<9 zHE0|8!C=$KMIRD5lR-~~%a76fg^hjkc;Q*1xQ2&z3dR z0^YAkKKwO`_EJ8AkBQY@1Om3SR3%E1jG+WiTmngQAVDZPmS#~E_+Yrhm?hbG<4iQk zlwq^L?h$^BKxsPQ5XRIrsmIZ_o=AV~nr&y+pE$Apgr%~~ACgx+v0~-hZ!3=%b-kbR*@<|$*X-e&&W((AqCes<6CYN7BJe@`;M9Yu2JK|SjPBE8 ztqTyRFg&+xx{*_hOa`yVj+@jWC^K9#v|2}K8zrDDxdY!6-=ARf@c5I$MFygd# z^laK?cdYc6@K~?FJhofPF{5DK`b0_bO^G>y`+)pimirr)OQp{#Z{u^% zkepPC`_>@lj7=(iH=bdv2|#&Ftem<_2M!g$j(A%jTZiBo=3AP;6~*`NN5?bFY=))w zl7f7+Bo|(DJ1fDG4(ibFoY08lScU`2;Ob3lR$J>%ovKe=y~^cIO+}D{JJnsRgtRwq zykp<)?<$U0uiCdQIMmla7z_^ek1s`^!7Kq@YO;yBq_eQ5;QFasQ@rp(;OGarFjf!j zAv4_mJt%}D#F7L*mM&{37pjl0TMTE7O5o)TgQwFmS#Vae70CtbHm62HTgkOSF*`7N z3cO9D+W<&rO)lQ_nUj^Z$B#C*)>dNUd*?r2dg{WVL*|8#dKILzxO755vO6F%ui z#>yz*7l#h+E5(&2CtFF<(JF{{!+PNmBe)cF?gorCSm>gB>Ol0O_0a9n126Af_lwC6asW#VTU*^72(>&Wrfb~#^%MWN}47X&m= zZ?*mjvy@7w$8-UU1-#kfWg=l{uERleyg|_L`fQ-k2VfbXDx3qxNl49(B?^#FXYXq` zestp6pLcgpwvqCp1V>k_UAJ~jetGojTy5+9p~^Bk8!)LV(dKTfbDx|du!D9N-0OK1 zD@BC7I02IeylO(BfacoDbA~;;v9(l4O^Y9)_&%3gRQEQ_O-> zhC8qkY;1f7=7zu<#>uPohA0%Pq*OTlaNJUzAZ4cEH9jPGcp2O8lS%;@pd;5FBG^E% zMR%DHYb_b1=(>y(i8p4H5rT)-7sNbBi6}isajFOBz~{ zligqJKfIH+h;0Wu=4NJg_G~(fse~PfI1A}Mk;upEp`~sx3;={Z8l&75niLp$X%9$} z2s&wg48IZl>l9}`?Rg4s3z*vP!N>dgj-qRdTW)#rAKDIN@3T~A($lX- zo!_00mqr{4&;K?bFAWjzZah?!DGhwQ5&6Gs3&!%QC+hnT9a=x{v3s;P#_ONsKe&Ks zvVykRV5tSf41bNFZ6Ab(w~*2^l1G_n{!CXt*krJ6V>uuF$a#2;R-1Tu|8wi<`nr>K z4X3v)*eQQ;$JbUYm#ejJejR`0>iY)XjnA_Y|`LVW}iFWsm z;dN~tZg0s$PybPV=9$o<)wRp}8yj-%j!H|ddecqn`oEmo(A4YB&dawsZ0l~{ea+dS zzQ*2iTNbW_;H7%R$;_;muSQ^@sidhc#deu;9g!L0obKg6!0zFj{>tB^?)V z)F;OJa_4oGl^3LEXXU0GcnQmMi#%&c&D@og>(th9{kguD)skOEdyrlsSHZ0t`M&=Q z?%Yi{w=xlR7?QrMraN(=rpZhrD7aa8m4ew9O(95{JO+20tQ%QLP4(-xZOD;2s-Htb zlt>R_=Gam^PELWTfj*(1Kk;%Z9j7dUa(G!*k}aINmeFwX7~Yqn^X3+y0R^FgU}m63K6S&Lr=7hf&Rn^4bmxw>qgU-*hY=!wS~KRzyK(0x4F8A8oy!PS+PI;$ z_>{nJCMG5a2jz$4`!-zht#4iNZ|F$WaVgen0qR&PeJaMAn}|I$p)++TuBdkO0vGcV z_{iiAWrAZ_l=nhsPLqX}M{|U|2r7lgl}aU~F@!=oI#YOv3?I8-q`_VVbP3tpd%sP8a*o2g$HM zZbu(@qHH<#_FW+2aHZt!!vmEwL8xZ09>)~^bWGJ zzKK5uyaHc<*B5}FmarA=vZ4lRWNT_QIBHt}p3cXe-Hkgtb|}SyoVf}mtxUycMFdTV z`-Epzxfa_w;DZFWpm$vX8%^q%l$y#H5L3K6^;?zr2;ySi-)9JyQxW}4s$@+`wGx~= z?)%KRjk?PU!`_PngR)5_q%8(vOep9Jf^IxmMuaisanunT0_#h2iOF%vM8JTwX!hcG zkcX1LXFQG_H~sLk7@}i55%95WWx7A5sk~9OWi7CkII_pBT?W7-5&MB!FTh-c0r!3J z;|d=`j709Eq5`FPr{f2d)Zu-OvVC(V8A3qQ?1w*O5CP2z1LHv4xL|IGVjN1Lvthdi zLX|G1a3xsbAIobp-HTxdHiTiwJ zhLVJvDa~+VsDUAYnQ^TUv*Ny;nwp3-m|4mMIl#R%`kGX$l)4;#VdG^iCXy#)q7{M{ zm(#j2h(o`GQxpQVM}F*~&+KcMT(oHN;K7zX_sKQI{3Ew^o1_sg$~^^d=ipN?>W z2A4Zjb73u^7)$bgCbq!K^a@1P%5o%Ps(ulfTLu3@qCgVEKy@y6@Ktc^FHa;=&8Wg( zy!X+avnIF8R&~2xU0D6U{&jp&1J(ebDezsr3lHx9*5r>Fgk^2sKF3;yOwhy^unC&? z{5VHG zTz+0wNtiH1=jTn-Ndka(V|fxf7Zx_tJT8cbj=2Xud8DlRXCcO7sC6Zx$N zE0C5Ur)XucD~@Edd54)Q__h%h6p!I1g|^0b3Go<5EJf2MArTa8g~%YMWzNYBZqt8KbSwODHv*1+Zw#X zeLagGwmE8j4{j>0o7XnfWflGe-wwy36$|Glb=9g17R+tQcU9LEcU576&H=}5A^IaC zZC0H?6DpA+obwp~Z-Z?;7DseBirWBz<`6&pUKF-vw3bgnP&@0h)>tF5@Lw7EGeZ&tZZa@$dtbAA`xCO-dI*(1y5 zxpCX0{R3-~FhQm@iBnEiHqa@_f#3f*7s>(9M*geCf7;rJG?A)yih*wy13&2 z+a7u$6#>UM4TMSh64Z5Iv4_0R(+?A?pSRl;5G1&piFLNo;`+hMpS|kZhhF~vkCYs3 zpM36}-@eA}HQtvk?NT!kAr6lx0ow4+VjQgiPyj|p`z87Yj(=m;(1j;mk4Ja{%|QQ{z;h7(jk$4gev>W@=n3U5c0*SAA;U_{YcQJc)|pTHL(q zuWkRlN`8fEiw|NQ68|vaWwM}=?NYOt9hb8lB^#G{CmoK-G6rip)X@CQbZ&AAM9RG$ z#dpDX9d$5(A=hrRGefQ~5TQgBr0_#!u{K7O-sej9IsWC+BhM~h`sn?)F0Y*Zi>GAw zUmkz_?MIh#-x4=&E9#pg?bp4lw7Z+QadCM;4<(>w;5Q*!Tda@GEFLF9L?*^lett9U`<1`C+&7f^lEVC-NdU)Yobgc2EiEk#mxepFQ&vE)7h-7Vb zb#*OuEoi$tP~o!?8YI?uBPVIAl>h|sT(a-h8G-7ahA5G2&+xLe%XdtvJ+H-|@3D@i z_H+!?*!HcRv72CX_F?YiDsQ00UnZNai2LEV48{`Zcv-^J6#;|nkbJ};>jPFc6H71y z-DQwm(X3(mP;uoW12miR#xX@>ro1>Q;c<Y2c*v6e5-5*+`wNF628V1Q zK~ZjG)&Rq_Apf*eHW}~awk?yBUHk4jAqN)s+))rU-BsP&`l{mi-uHfrx?-49u?Nt7 z=7aFaCY~VBcA;%W*=7xwgE(c>506K75rRhMjF_Vuj@*QBk+{ePBVL5YkT8+&gGW{< zhjBwAcEA4x9@*G+({36&x+CK-`DS#`rZ~ia#;X_OwT$(X_vDaGyoqAh$AX=SZT7?C zkd3ydQU1+F3|BwhpeJdRjO#wyP=_{TqYW-X>^T9BM7(WO9i&A;u}9l@r$Qnt9Q|fK zd!e(;AQQt-`{Q1*oZf)0BcC+(ZD=+kvV*MS2)y%?#=`VXfS^!f32Fj1`2iqJyA6uWKHjz~L9aJ9Re5MFjF@OW+T zc`uFC#TDnYFUo3h%e(} z4CEawC*m(DKH*80TWrNYcxw3moVW|!O<5ZhWLgILTR+Q7&?V5HLE8oE`WRu7^vLUY za2AYd!j(nFYnJDbYD0*yjnkh)sYzt%bRjItRp|2OyJ7!?3JA}M9(k>wU`!heKo4?C z!_SMz1NqT2v-d9DcMd>*rK@#OSI^3$t*y#;l$It6vq5y~Z6`|eySr*u&DA`1A1`%R0L7?c2Yg{Z{_Mm#yE~Jl?;vyQ*SkVPQvGTf_J(d$0Ni+ALy`rqJfk;ro=7 z5dNmV5b>1MN21*5qiCPX6ySzFC3)bVjro;{Q?5X|L)`012^&Rm%(%&rZcQ1=pdrFO zYs?sN2!KdWhJ*;u(m!FAqK=wDz+l$G%aS-?tH9}`kS%9{vmie&%K>M24tZ2L6KO)= z7L&ljd_wzAEOe`;A?1~nhU%>;4Yl~u6u`B+v%9%6aNzagUxd2O}-gS)2UKpPkj&vku8)Rn4=x>iAFAb;}*=6ppP z{%_}e6<%zs+%PfGZ_+gS$)jy2m-hIrQEj6V-tB|vk4*Fj;lSQM-z%MKaO|=!Maw9r z49D}r>e-Is*NBLlhq1@4%r~_&w0-jvy3uFHUQ5-M6K6bsPUU=ba zD`;(&;k>mY&QFm(fxcI;UVjaa_W!~tR7jsv-ALT7_+g3i!BY+1IUwj=PDRljamM!6rLH-V;Q9NWDK>j;tvT@H6~Vu47IQbRKdU>9B)6J(}IH3z(@6(!{%XDAfp z6bm}xpx{kq*1ZOIv)g9S4uUon1gnCfPg%QVZTY->XMJeln(CqIx}qBc`S~dy(+;^a zo%!BEPl4RibK}`?C=|Zu^x_i>{J+h4=h5axE7e)r_w(}Qf`Vo1HxG$5Z$Tf;!yNZZ z_r~$3hLB5@;1@(H8%LwcYn>0k7yvX76~-CKsjrL=!4@)(FJc;;vdc@68iI}|S%XwH z;tTj3h%-R?5dGT6tg41%oz7X1s^W-XO2&CRH_hD|@vfRXQW=?$cO5)jUF9zh7Z;=u zr|OMoXAd^*n(O!PT)V7gPX6qcffed3%y;sYd(igx&8NyLLM*_RF1Ro_LNSA4^-=Mu z&d_Sbv(Hhr>Bg%^Dk2ZaA3tz7RM|xqqbInDYewqkdTH;Gr-;9haFfLn_*6x*S+J_= zXz*!#s(cVdM@t<3|8qW7XQ03Venv!5h*2~MRT0z+CKvXB@Bof%S}}iJd#bgxzOt{N zG}SJ5*s}B8Dd#YJ=WZAskuArzUe{H$GJng~Uuf4l^A@hc2-2SA!ThB*dQF_F0HRov z;y6{&Hexa*Wq@Sfs;7CAU4Nml-4n3{Bm8II920c`+hi89cE5dP>u?~ zgqby28QHpG{@RhVXGd0B;oRs*%eNKBKmT)FpEOPV3j1IP=Q!eq&}Q(C zA_y8c3gZ1UY+UP;MoO- z7AT=mV71%zMHD=U@)dK3|PF@Gg9@m;lo>+nM=d4eeL;0VT|& zvxF7W>13yAwP{3&>wsHR@Wt{C391H>6~*Rub?5f}Raagwf5CA>p3_%>J*j$N;ni&$ z*Z$Y;-P&&p3VM4MU^2^+igt8i+``grYF;7iVMS2T!5%|7FQg0^ocsEXkka>%@e;7s zB!*7$&?T650llE32yR_N*lgD=o&I#1Q8z6Zs0;>6sc|9w;4uuk1eVpQVF`4vKW&ts z+Fn=R(pf!f`@bI$ea`+JsF)>oBp`$1_@Nx+@IX6~vbooY&ETW$56 zNY6+F6gG6p&4#{3JRv30fST#aPlGPS$XC79F1r8fA&lq{L%&iTrm1O^uD;}Tg@S^k zMn67uS{IV`JpqWZjnl2=a|KR3Vc%>J&%bZnj#V)L|iww>Hcy4`KpZ`-SHoAB}B zdvkF|9>pBX!`AjIfxvZV!u?oU;sQ$&vc$v5Wf_3ITbk!p6P_d)PxP1)xFO+o1n5r& zSsLMNr7@7h8k;6PB^xy?)4qHiyr||2Wugi1)GF$mgeV}yjHLq#! zXm71ww61@kIH>&x5ILBLv=@=hhx{{j^3|e;v+dY`5gCId(YQw=PRCRL&z2FRQ;~rb z(~>0>>pBhg@HES2VEQR2k9KGDBCTIy1rY8V5Bj%#=1*`&yZ}W6;M1e%ect}~T4LHH zXnv4`IjIJjVDJ_lEMQW=n+2!Pma9mIpyIm-Ek+DaCMOlxhLjnRCZo}t902Aa^ zhV@EWW%-#L47ekn?zyWMZOU=aziF(dx^8UFu|VbW^(Wzk>0`l zkR?RCDnr;eoYFouH^#~9z@#_qeQ}h$iGaGehbBnC2cqPS0y1NiypI!|6HuAK1;It3 z`{oY>m*@~c$Je`k!@-{Y{-F@+KlLW|XyS^C5Fc+yR#Hk_;NvY$$GkRYKsO=2!Lg!G zLBmaC?A$`f#5wz+^6^HbZ~>#ME`#{i(N!Fj&YP$U7%Nu-#_GoI)D)j^Y$j3tWDgtG3AvyHW9pbcJziDM$gXFq2Fdjmb((GCx~@I zTp91p*-J5Psi_G}DM51efTKl0Fe~CbK;(waCKWqXoGd`&mlp%~!%9OsRib<}ZU>@V zD8SR>M!n!Q!JlA;V13qUDVVU(3Pf$5fPjP3{F%dNuKOnhcwR{VcuS!VQ&b@z$Ilv>GZ)~;r9T5l7`&DIQ9lI(s42m zK0^$?fTkD>z5wCT5lhA=P;=rWmdCN@ioh5OvI&x?PTu=&vOMGBW$BH0xvpj=yqjhm zV%ROPlqciDW&VyBeQ&HXYVCW;Vzl6o5cN+Xek62zj?3i=A#I&2;1pcHP`8=umw1tk zquiAeCHw`dfV>ilx2djoQGK3sxMA{UYw>W|ru9EhTCk|WSyAh)aM&XymrnV2EKY9y zolW^oXC!?7?4$C&W#P4B^Giy8=z%HB!hWrG%s~%M^N{om`Rc5x88QM3b&WIvxOJMv znzk92EQ_=h2yT%I5mPcF#bQb1atV=N3jny(&GDa05LPRu$*}}>7|^^5VP>?kh*>E~ zp`fo6q=bd2smD!8J8hYyvy%y!JbKvWpsN#ZC(kViR6#7-9B>D~uGOft?{xmsxwF>p zP8}TF?{q6*mr!3tu-w9ho70N&AHGWa8R%3!?xynW&HYD?hssj33!l(d$riWoEK8)!Oe^9~p_vp8=464&YFdb9 zIX#s!Q>~c@3y%MA;s?~~nPf?d!agl2(q{eyZ+{|0yC4i}o8MPdh=6m%$=H}<7L2{Q z)*_Hf(ZNW7Ilb3fndgq-{-FSn9M(oSyc(5lo4VZdmuA11wY1o7PtE*E^(xQovBlcw z%PdI+MO$vHu72~)r_g6P{wohX!R(}ujO@QUa`r5p5!vV~!UH;_Mic4QQj{C4&d4fkX+1p&5Q%%XjpMHiFLe~ z@L$J?sdUkez6eW_eAs~B=&zx@0hOUVwMYUIbzT2sXnuv=vC@=B3`aybbfV| z7tV=cQm!`y=t@J+Q~>i(j9(@B6g|{QrD%L`zUX=TQUMdg1cZ+|U}?0-x4jbl?CUST z{>-=T9=!W*%GWAq%8jTR>e`07b#h&E`S&&WopKB+GJ-u#b+lcZrcvrj^s2}P=mTZE574l;-jaPf6A5dW^oAb7)Ym-&rExE(l%7qrq}VRf935>hS_aifA={8{!H$VwnqKB<9bDe4 z)ifBqfIn_jaOUYl6@&QG;=kbX>C+PpOwP*^y z4=n;G3-zGe(3ZU2nbOHr?amp~6S$xSH z89yxuLFOa7P_vSC>#bVXt+y%{_iM8b9FV`fpXNj->PC4~6#5B!AK)Fz7=BNY7G4C# zGP)x$dvX<1D#sQU6-vtWSo6Hv)Qs5g6X;BWJs{_r9SbRsv!x*3TE6XHo;h{;$ya$D zb-wczd=<}4;-#3!_2}c@oA5i$O-1U5fJJJ??*aU7!ETiyo!9;RaNc9ADFz;OM}N}# zhaW$gX)LOv%rE5U$4g|1@BrciaZ+k4Eswhfr4Z*1y5+St+2*x1q85SzCX$B$1; z9H)5^?SC2Gf7H1Pe^JhjbleWMi#q4)X8<2tM2LdTE`Gm=vg}}V=y=nQiXzk;hlJ^= z$W&$=<}dh=cF&iLok9X39=QuBat1$@2ey8H|6>whJ;{`J9q-~W$&`@TwjOTK6^*RP-# zP5lwS(;7^b=Dm=D3gb)la~S-se59FAGb$6AJNY1kbwd9YOYS0~BP^-RxMbrv6Zzr_5l4$WU z7Tcdnv9%@>OXv*33fvVqUx_y-8AqUYvC5%$Xy}iymFRX5C6z-lW|xuUflixlH{}ZC{SIE7Ae#f9xlcGK}Bz zq!ntKGb0tphGdLD7Fr-lXuri0JHbU^?8tVK5LV%G7N&A$8oz|gor7jZYq%Ll9d0Q2 zo4BIzGwyMLpZx2`0xgFdgCE``K?d9m;(X^@GJ% z=}}(BIPJUSK@NlH^Z=ukZhdZIB@NdNeJeIjY|7^VLjhZ!V^4ujHa$QW@G-*AWsXgy zbEHHnwz)#KJS*0rorBmg6pb_#w5PyFP3(BhJQji9HHE8wJ#h?NaVwAX9N+uv>QGa= zvT)nZ-3JTy?Ct&g4fm{AanFV?_V3-}Ik;!%HjKg4n`qM}<#owVqk-E@=M<1TD8~+o z^-JYmQLcTS%Sk;8a(Sg*ejAtXMR^vN*XZS+;qp6RtM1`)SS9KG+LyV!3i9Jzeo!yR zoAJGOp`7KFg?jnRR4&eL${{V$`}G{skmoha<@BCdZs~FK=AST^tcF%f9vq;{vHMNi zAkB}WyAXJ+X;+Vumeavt;94)?c9Y9n4FynA_|Tu;e)!?H<*@cW<)Zdq_#U0#iFA!? z#V!p>U%I`>7Vy18&BY#@IGb@Z(KMQ^M3|I0tKZUS|Wfb@e5Lr{IXj z##au*3*}4H&qE52;cC~jibrM~2g+y@+YptaEr&81^MNRya$F64P$X{4%*n|q$niwN zj$~|*FtZpN3mq;gY|+y3Cp}v>+`nN9GR%KUMYC-Hcreg&dB2vXac^l z5*#oKFy19n!*eB3YSIj>QPI_OHNp)h;m~;ASFJ!NN)|g=4e|59j<4sa%mc+AZh2O@ zqde5KaNhcsk%xC*wBNRKt7lGs*FgF5btl|Dm!s5IG`N5D=E>F9@7gqLerutpsr6SEiaa&uEK7F}+rgvtmwo3d^%l znk^2rN|(~@Hl7c%I{@X>7eQpEVk?lp^W=B6fADZ5m!ctLq|20^vN{4x?iU$fSyzY5)%PkM2ZC&}Z^ zb2@Uf)2yhS#YTED-SVdAZbwHu8ZOA!n)0?6KJnP2PaLC*!O?q7IqG-IecIQisP8em z;D3A>8tA8l?=dq2;e*hA29VHezE{npyk4S6G5n6WSKvZ}4b`lj(jGz@H_s%t{^BB; zpt_>^3fr7$^9Jl(SUHL?tHc9*?J4?6ab+BN(H(~+*Oh}2AyA7|k(`pqNlR&&Uln~n28LQr5d=m{FB zWP$(HV&RTZXk444Q-oKa(GAgOB6V$Cah*bUXc$oNRr$Dx&`xX4!fSXhg%Tk@wXJ4x z_u#yhD+X(N!vpJX9=m<%$ertym&4%=jr$KA*jrjWwtnQ1iCq`4p;5cy?ueKV8E97v z+Eqa9a%1fCpbRVIsxwvrr`?UUE5T9_&Am&*8+{f_$r~*ewgGAvlGp`@D14s9GJmV4a zrpCr6B;CuXCYaZg3DuNDgJhtZN{Ez|P&-?Bv?y3&rqSY93E-k6CUF(=*h!5cRo~^g z7(Zu>9ZVm`)OQ_6J9UJ9*}Tk{HZ;^n!VL}KnZ{Q8WnCaxR~HQ6qN$k1G)#TLqY7UU zP(n#&AFQb_jKC4@i|8l{1(@4P27j~wDG=X%4kor4E2L}kE%5#)=m3t zf=tg0GEXPS^lB~B-jgWPr?pO#d6eHn^G4LCUz^8ko5n?-FPe~{`66WIXdQ_%QzQHy z>Q7-87}A7YAkkhhEXt)O%t5j%^E;tiwJZ1Wdfv(9w4U)@n47b)_Z{Q8iRTIPZZtub z`+H_t?Mar^`yKD)emBdS=HX`(WV!z@Bl~oMERVzcl;!cbjO?TQUVU6pUmlkP+35JN ztUf-FhoTHkMp?(rFbF?LiGI(#i9cxH?mgi++ z`LOmGD%b5&bdKSjv2#o>r*lk{8|TCyKHv&^drGQHYL?pw3Wza+@?O_!Nk!7{Y|g`ICmyMz1fXhQk0_6(PA zMQ5oz59e_|bZa*zwsC3+WX4$r@5Ef~)+VOS!-rUg=An@3(aNXIjUx#%eOmG~nPV(N zb3?pmj%J%SH|DbpwNcnChcv7v=qyzU<-?k=WeVFQ%?;|4n2saLX>N#eV{Tl45ZRag zWc%c``PIbsPQlz2C)2InlPIG-mLQ{Qb<^65*&Fws9<6qo4Cr9uWO}tV(_~&tkm;L2 z<_8Hf{o2vQzSR5RD$S59XP z`q{i+nsl3q1X=FynPs8%n7@zC81%bY)^x^vCP9|_|1z@QOpxVqxQy&;39>vMmy!KJ zf-H|qf~;}IB+Bym%p{AuBXJmX0%Mpj`J`vn?BZ+y3lStD58(C)Tp@u4;W2@sYK&~n zQY~4-WP%YiGq{DULIiZL<#dP&i2f9%H9>|zfkha0gaRbNvIZ{-h=Fk-H@)cHp4Z7R zkgQf69uG_;K2K?p7nOBaIjk@S!%#w@t;q3W4TmG9NJ;o!kb?+5TzU4QRL?CVUTZ;q zV_joSh9ulE9nBD2H7X&hWLJEt~s$ zdmilE-Zyt!Yfrzwqo>K2?kojh&>ya>l5bhLxo>+%`M-NDseKz7o7S|di*4FJ&g$xz zeQk4HZC!PhHjGh_U`NWC3c`jTfL$@=x$G3V4n%lF(`eNxjSyVpb|?#8^QIpzbe3)F zyT5vF?h*MfTJh}pWwWw6yP9S_`16tWx!*V;_(wzlle_<~v|J|tYoS|-mpY-WP zgAKF%{_L{I;F_xLy$cuboxNzVtzy?zi~VDDb&k4fAVwS)0!YDw z2aDBaBajPg$z+ETJy8g=sUFB>NSkD^9544+n5qy!<|`>IaJw?ot;v#K_FGe(l_BBB zX%O^W9Lbcv#FrJpYN7S_y zm}}xR&qMxF8{#oA0g-tOvk-fhkz@ikRoy<$!xMw~DHBp=+8xf7reG*vcy^w7)&JseBWZ1{(7)_JSf{NwcM$YC52K z7Gkn9FxGiwac4gv&LY#i7p=v5!*iJH2{;q8-%c-%ncczWiB!5|o_0_KGN-O1%d9P& zB{$6pM#8r}lIHakZu-f9-yl-AX*>LmyP2HYr?teyclvNj`?#P0nNQRm%^-Tq^jsOfwx{2!oU@mj=rAvNrz9Kk2nUZp0W50;U)E7_#!T95`t~7DaNFj#4TD|tdUy3If9M(sl!dCp+uB>oY6HcN zP;+?~Hk+~ryDPiAZDh{EHQBB?Z4JXnPhjHV$(ODaPFquMbnGo+yD;ewt|UYr8{|78 zH#)E28OnvWFfA>5{CfTWm=+x!n}oU5!?^XU)m(51DA}3BFR2W`cdpNVJGM-WI)TP` zsmAunTuci*!$uj!w~37souWgFM@fK_JhN{M(=uesr$Li(29TOTmaF=Y+#^eVr89VZJ)0*wa-cGsH2|IB}%^_Yb=y8f- z=y9aXe&_>`gPBht3K#8XS)mkT0HP`zL9|?XOk4qV^>c^o*LN?fojiD;E>u!mT~kq| zgl_%Vk`n`MzqiT1IeqiQ@=aT6mnOeTA$blU z0j;#lBl4e))|FI1d%q0dtC|iOpHv#KP_?4VVWu+{3*g&J`y17c{(_G7=5GJ$(auOD z)ZRN%Kld0CdG@XkFBq(D4(B;T&1IPJ8=OH;UO}FxbK~I9A(#!Q|A}|1S1Ck4c%|)^ z(DPWZI%tovE2IR}BF{DUcjIg_c6Aa4Y%}heifr)-#bVMEY{i>Xkk=IA2@^5-+8W%f z7)LmTQ=`&*#iDZu4&HF%u`53NMvceaFuS;>UVc2ad+(7u&YwPhSBAE9;fe)|opRA& z{|dSf5Vzg0d0%r%*Qq(Vm_a!Jm*Gl--A8YV8#}FzP3OJebXy`l7C=f8z-G0TUT9pU zW-8~K5933Scp?yhZa|1hzS%H~DtICM`U2R{7mkF~)hn;4RU`RT3*~e2gMSjo)l|k# zI}8z2_a4+ef;H=u7K`16(f_CFS2ng*z!QZqcl9M_z!7B6J=~e3 zPYcYR!NL-me{gW)zR5tKrp0@|eCpKNL!Dd3x{4*s58py_!j3gLm-Q_lPW!Y1 zJK({{VTdVASI_JuR+(6Ts%76gtx-GbO7n!^PK0=AB_tDkj;J2k98rR8pQ6DKQh8}LvTBLN_|}RaANX$b2~U2ocJYehoceOB z%b|omcGHyP{YvIH@_%~U`GqHEk1Wl6>)KtLTIc;bW97=Zg8@_yeVsGq1XolL$extv z(q!C^lC2h;qPSb=Cz~?={*y-^_y^yX?t5$cT-V-p>F+A#7VYan`MQmdw6}DeUI|RJ z_5{Dn$PMO|D%3PjZccU@;=tO}K<})s{i{#ka^#5Pi?(lMUNb7s*IsIBwaPDw_82)f z%cU)9MiH_G&=oiu;NzfszrJ+G(f_8YM2`g4$Rb4_snbfu%1v{D|0ozFWSpT@8kc%~ zj4-uYnwwkcA|SR*XhqdU3kO?za&o&Gh8H&lumPL|Zfh7$Kx`W0sT28!#qTKhk zxtwg7qI{NK&TEX{^8@joY9TMm={=&{hhloaD5v*`asaZqTyXcHJ`${UR3H64JP!Q+ zAIFum9f!+b5#@AG$NTy2$>skd%IOPG&i5QH|Ar`sBY>C=#dD(P&e$?Vg&s3*6~1J#?4%`N`V@ znR{}E=L8?G(Iynf69=})H)@~cy3In}u)hdw4l=hZIjkh%W?`Hyd8jSlYM>k%T5WSQ zND8Pvv`_*1-24p3WMXlh#lRc^n-dE1F_~wksMJ9@KzY)({?$$4xuwWG(bdr5pB?D0 z+t7XDOz)xPws7gDJomh1tB0JH&Bg9bcUG%OgwB6@{suHhAiDIL^9SYct-B%0GwtBnAQ z8SCXWpJJPXwI^7dV(lYsb7t5F2?{V`?FYU-1PD(RprGNskOP&k&%{L zRa{u@&d3ckG>sK4%XDU$a@`!U`i}7w7@SvIS5=E-#eJRQD8da7u z(fk<~NkL?ENC{}NAxB{o3C9~eGD3~OM3ak+kebXaqfilb!PUri#ZJPLvgx#*=ejO0 zf^~68&Bb?AEo=Wv`f+|+k$WU1ZEbq+A&XSwAFVkb_?KQi3%Dsy`Ukit-6LsQf(`jU z0~~&ToCmg=lzdsQcUz>~Go1Me2c_CZYw$ljOO?-gJk!H>KGD0V%3il)Y5CBGXL}Y^ z(?{>T4RZep&=+{5&oTe9K&m;zn3j^LW4*8zCd>>9BvQkWoS= zxXR$W3^9v&m?wZ#P}pyM9;d@@&B2nVCnWJ+bz8!k-tD5-x`En>-6aA?YzUlHYW-mE zgx*eU6zDD>r%I)K&EoRD9ABn0JI}$r6@OgHO$o8k%RF>8d7An6e9|3~gUgUmBPmH&fa;I$SDFQCY{Hs%^;wy_6 zH&>ACz|eZ7BFDDoLPGj*;6H1)9_7W$*{>_(Go%y|^g|7O2 zTR2}jShLW(cRTNIEzGyOKn9oz__Y)IJ~KFo0+#q#UT#iydYq;TI8v7;`DK?0KbU9u zO6YK642AHn(wU{shNboVMqa9&f61%501@8G>*i(#ClBr1?$lP+?54I-VQ`D0&R12%}myWEtpz1)(8X4S4MJ}TY5<@zYB?8d2A?aAk zvS_Ve#!z;hM=t=3lNuHsq>kpwc|B!~Y3cr=*~1n21y);Y8$WtO`k&KHS()i)>kNjh zbbjBeW!o>Q_Se1PX&BgpvNrF7#J6?0aY*3UJsh;1;Al4frRZ zNei~MtR5%ziO?Skwn|pKk>pH{njosHLV6UxOh!m)jspZn4E>EN?3g4R4U=E3StW1mGcY%z_Ivin9VB*E;z(ds7eS&E=I#&bVm%1($f2HP5L= z)dEktC%dR>{s^>o>4qeI%F0zAUiOs(J7(|bZSBmroAms|{KZ|ioH?_v2TVnbZUIx+ zstYa>dKKt_a5y8?Ml$CZno?McF;)Wj>MgWn_b2DEQ%-`NJ7_!Wg_Dc!F7vt^18d3bf z8_1)8QV$_;Umt`=m3hg>l3`fv~)Hjius z=61&VsyGs8AmJ6{PsYuWUIz^6aM6*2dJ{6dk7gb()Lh(AXn$}I0w|gMB%kp+J$+I!aTYnT; z-W6&e_)F~awl`y!x5I)W+<&;AjuVmPM??L0>Lbe^3zc_$6j|O8DtG=VcDXI8JS)_` zKdRgwD$k89mk>u^fsZ>>UMuWPGdjH9XeW{Q`OTtovNPJ>s0l$Zqw`4^>gTG{ifHe>*&zYI!>=w*T<==mpZYa zN(<~uSr0_>2i^g*(_AgD_tf&%e~&CDc*yOcMG)&Cw-1-MeIC2KJrKLRBQLU?)?4o1 znHIa;rj*P2DjL76uWBxn+fOZTeJ8S<#woWKk%0gQxqZ02?bF!p+h@ft?@;t=azC_Q za{ry~$o8~Oa(Nf5Q0Uys?PoC1uT@RcetjF|vbzN|N zurAZ`O(|qOrI}MTLG*7v_>pvsQY5&RP&L};0xZD<1PVkW1_eYfzzL(2$Bg+N8m&@H$ z4uUPum;7!?>r=uW4w!ID!=1>-=R&SR4Ro&(S8^`6Py;Pbf(CjIUWYJ_;1*Hx9VLbVU|^PYpM|Zs8rXY=D&$FeAV@9F-N$;8jt8 z8$RgEAfQ#)9py6M9OY90r|!20Ad9+?H?@_09LS)o9vt~BHLRW|BsFkEAyUK#9~f>5 zaRj*szTjF(vo=+qqCqGmXjHY@ivBd7loY=dVI0A1CnO{;XNifvM0E#xr#;N#@jya+ z(s*<)k&gzx^ix%dv`34otKDw0fURz=Zf$BrV3!(qmAkUEINO!&%+Do@SeM(G4hfAF zdWfqf)f_4Ogg{2hIa%c(^S{m-v5^HY?2L=v!n~)zl$~zOOc^w{m0Ijb%#@g(nL220 zFMSo8+F4cQ{7H2+Hh85ocx~kJ7*bP=8CiwCw$zk_gbYieFYrXA*yRqardYJfBaxdN zI90ymBAoh5;0o|04jETXEpL4zvYc?I+&-Y-Lb-joyzM_?w{NeGUEZPa7;-;^3+4Xl z3Xo{@)N(R-rgC9VqM`A>jRK5cxucs}-m2hu`L2)J%XfY1e5aPH^OehKUUGYNzEjK9 z`A#iY=R37rov&O@G(_&d(<;wPE+-lymv?C*%LzVmxe6b-eYjkOk6cbPL~c)aRs=V> zoM?z#PNGeyT+k4?oLDNNA#!__hEySbLlV&ty0;6_j{ImcK&kFp{QmK zx;W9n%yw6F`^c7oFKSe!r6ZX`M578vun@e3>UahE+g7frx72c2oL8DJq zPjEj~J;DD}^|TJt>(%vu90-~=yS=ita0mR7Y0rtF*enJKfvvI*G>vN&UrzmuwaA9)? zstq7;Y(xbHKdL@0g6RZca6^{*l(98ABbf|q5?%U)saE=M)qyRVxTEuEa6R|!-Me?} zz^|`bcVDu@>Z{V+nNch~|J3&$c>3uFzW3CYEtie@_?f1(V9MqL{*vHhCel?m;sAQ! z7oNzL3!Cn6Tqgt6)Pa6MVi7!ww+UY{x^+VZ)9j6^!1az&1{E=^YS1&DVH9xcD56BB zYZDNfS`Nsn_xQd1TbBe|zI{!{I|sLK-_E~&#>OkK2r&D`SWJL-Hf~15-KZH#Wb)jI zyeg2*zvg%9MyFJY7?$FO9rpzugC#Bje76u0b$UBO znhMi9l?mr7&i2<{u#p!Tg0(v?@>i968f`0zw+u6qcYcGt!Psuhx=X z1nKGF@*x7f(@eOC@NV}}#A?KMmx{Y?=D~NLx%?X!8!qSZ=U;#QI{tD^aLc#9jpr~X z57s6Zdp?)l9Y{r-A)bz0-H138x{`9kDhF5ZxQWI!DB{J@hSDtse;J@lXkolHI}|0# z8ETA3D+oRYb9m*Uh^DxIR=b?m3KwFdO1Bze=bC6RINgPgbbSJ%fjW_KLxi0a45wl%YER{88XMIKMdBi1@^ySKW!n*Xl5pz}iivU>kwf8(MYXHR|O zXl40ueOXmTR#m>IqO>^pR%yPmWU$=l16IerE1UdR(3$69*I;J|@t=d!mWaI}?if{2 z)6F*iUj-m2R8`z;gIEH4bGq3^HQj6zP9q0ALInA+!$PkaWpOHjlnn;NaiMu*y8yBI z>tquRe$U=B9>2kU@s*kOj^esAYTGyWF0J%shP{?P8rzP~m9-2Aokb93v* z+xpIH4gRdYsDG@ytwXFO-5L6%ZrIjR-tCovge*&lCm`Y&i{^_=si&s-fy_`U?QBY< zjsBBddVQGW3uOfB%QKT%uLc{icZNUA}IPj7YF<9 zJka*m!Sl~QpBE2pxD@ZJ!21kOMRKZIf!pb@10Jv#j8(2vLh+B$YC$Y zR}6~1YJI(D!`VD3J=nQ>TX9)&QFGpslJke8?&<~Jnt`#l3pR}{X>z!V9fiHK$etSG z&70hZT!r1RA?povxk0mC3e7gaq9Pr5A+GNW=`1?(z-8I)a+S$>F=ZM%mB<#t*Hutk z==lVdJ!5@cZ+q{emhE3R;Q>LxdD*JduwFsZzp(w7U1J zJowJDd%v;Aboq7L4jx>~pYsLxeB&GP`#gYGuG9=0u8u$;nvR|>wKEu8g3=)+@Jy7B zAVj3@ufZr%*Y2w8s3{Y)j=yxB#lO0(>m1O!p*(wgZDYNKpG#x>FVH)CnBIjG#-4)S zi9`O+)4T9q{=ZM}+9!7)CQ%d9v66rX$d$BkK&m}t-vPhv2%~s_5Qz*jG(be$4BJRV z_)nR*?oYutrKYnc?yHil=YJ{sW)IP~Fi5A-Hvz~mq;Eh!|I6sxF3`7b*sa*XMbueA z-;xAN7U|V{Y zRuy`y3jL)x`<)lg-SgnN`RCeK&CSoNTiM*Tu_gGs+M?BCt+VJnXoSrR(XS*yiILHO z&@knRfSD;w+SkII2UhK}J-?7a^eaNj4{E7}A93nh-(9 z=)z6qHfoXCF?_YezjwufJ$nvZamnUppRakd)#b9`*D7`2dF7S&+;b%nwAE)UUiJ9J zF00k;w&sv#IZ{TqFekfSwo@z!%|bSw#ppTqp3FF~@ZS6HnK#tPSy?pkEN7M@&z5XS z&NQaSo_J{Hh0#-2MfaM@${KHZWwo`i&}MVHZBf$ufz6u_>_6`Zg;pDCt%aCA^cGi7 zHt-kODe51dY~|l%dr%LgE!QL3PPqO$)ITqtM>M1u_50EP z%cB09Gt{^8SJ(mc|E-wy^7!ce5WZsceEF>v2t?TyQSUferKq1ZUP4*xul zxn{D#Kq|$I22T@md!^Titjm!K6!A8sg9D(1S|#*W^aervs0(>oDIqf)IK0t16S}12 zKWv`=wUpp{y**i(CR4tlr)fn;|D!Fg`Ll~E^Nr~l=^3@{O=TE2dfSh6co}1Jv-86G z5>lR}f%ig&d!a9(G0v zS<#|_su5e8rNo+@Q&XEw z-j7MX!u!B&K@S4|dh(Hjd8Vodfg>z*9as(#UtBnIp&>$S^Oz3=D!!;KfGl)g7!7BXX)=&V2~MH&(u2dK^BG!Q!B$dI zcX$em&HCc#!1Bh{jH2wU>{gr|(r!Ur2hjmRsY%Tz6i8Nbc(%u=mL!oC zh#G034uU6**_>z2Ep)jY1+>UWbqF5~`QBePW`Slzs6uMUWrMG=w(A|<+Kz?2^G3!O zHI|i+XKT!vMF!*N9r?bhy0!&9gR8PyS7hd7yG=kO0MxCMf9FpNyyFN!@k9I|rqY9& zs3<;Abm&RZ;dhdv!@d6C1Kgch`m=c*M2G48z6y8{6)s1v_k_ZnR8_|zqZVv#(iEv0 zjxR#0MI|L31+_$Q39=G{X0MA-VZiqdl$GQu{!D?rq-bntaM%aDpp zJEpOGx3e}o=a+ejDTM`P^}g~vcT!qGwyV0zm6oE9PmYgASp7Ze38@*j6jJ)o8vjkK zu@NVwKH$rMo(xA64%0>hcshVbOo-IWP{F9S>(JnvOeUMjT7o$6;ObRQju;=YXb|@( zs2RD7ct4zDwU$__TbK0Coqzdd**9hJjI4}IPhY-0HMyp;F3{J!Xr*azYpN~BWGDdr z0=?(w@)xBiWO~mjk~Qc(7m=*RT0YFT@NY_wPN5;>HxPD#%^~sri)aXsq#=BZN=0bD zT!(i&kC@t-Z0>YAqB{3u8?6M#C9(|U&|W_cG6IhNbjgV1nSqY*jr?Vd&CL$YOh+iq zI*D@le^p5BoVScsF=x`Q4iDbLHJ)Y-^OUfrp+t zHi46TSpQ2EoHR=r`>e1G!e;>|?L_@I@Vuz!-{;}_>rnr^cpfrHjQag>`FmN^Lk5Xi zKMQ;PGV~7_Bu4$!c>YE4e#js(>aRroanV1)e){-t<<)>ajUO^djOS^5uZrghe&Tt+ zFFe01d4Zjvejc3MfHE47 zS7~#z(&pEA*G{D$8Y{ISzFY%25ps|i&ri_idSyH`S8C%?+Pt8&c?)g!DDNV;P#d$- z=BU!<6|}hmxX`INJV~|`)W)H-fk&5k*GaTlri`agX;UiN+{><2+MEcrd1!K@(x!My zn?In93TJi91)|OU3=+C{*ZXL*Ng4A>6w!DJ@K>X`pWTVSw5ESUn>AuQ4^57vh}u|` zHa974K1Camqe1h?^^r5bpWT2K9Qb$uvDM}QtJ?#4DalCPiKuP3hLm^;>j8(yD5ell zzLbyw18I-mqPO@hevjXy_rGiYZp9DwY+tr)`<@?EeAg_^dvfsV!h@st+%tNx@ajRa z893r1+$rU0oMPX?+PezD_qe{Ph2PVn(c4bm0`nJ+ee-+%HGT~8byfiDg13&+*yJz( zE<0VF86&vaC)+A2+US?>ZEr8HXm77TA9t`9_z(Dd=p!!xQ;<*}Li8O(cVr)-!SzpF zgh}j2^M+blhK5>RnAhBlKg|dcgKf#4oBW91C|QNPzf{&1Aq!Va`uL@9|Z39Lv*uM0RKIKWqho3v+Q@gzKXMf-S|MNGwdm=n$tY zlR)AksaCIdDvUE<++xh`J9tl?`|!^=Sn$sa+<_D4qpIlQ1C3G_paIrWa7V(VdsNQ4_z8L&o{V-ZKy zYWX7GhzOgEdQZlwL|<3}ex^10z$ixPFb zUW}KvsTeOUqZqHS9O{tAOA+?E1m9^xb!fb6#emex@OY^l<3%!f%oWudk(AI#T1a@D zQgkUg6Et2m1{292CKD17&sWCUnt7jDVs(WspU+iT7yLNb!Ns|jAi*)jOFqJ^ET6sG zf0(%CqEwxPXvq|xijR|tWS~DSJw>C}$1hDzl;Yz%L@2Me5aV1(rJ@Ck*RPrWFa`dS zTa$2Dh#un;_Rjc>+B#4vH^g@Y8kyD{Ydk`)!cL%}3JV{&hCs)jmutgptU1|P7A&2K zQa8#!3AqS@fqb4gAmZ2Og>(z;329JJ9*3{|KeAirm@YM~FkNbF>dR@JW86!hP0hi_ zSLCeVPaRu#9e&mwTYoiv)*m}YYYx1JJ^D4A-y~KppQ9uyCO2nshSKpR3KcGTR7Qr8 zhb4pz530COV)eLxPQ^WXE-Pj?1rn`L+T>uSsV`i0I0!6Q&1B6*W#8WJ7?J!!&N zEmv&@4I2h4aTusYGzwq`$lXNNYcyKesmaZ>gz5sOJODSZIIqa%z<_KeRz1+UYD7gr z*qn6#uEdfM{tVuzqjTOmUv7z`xaiuvl7fQVGM6J@UA^SSq&hk}I84u13{(_1x-Hgn zmpKPP@iH^>E!MpJyt!vj{Kn^Yi)Mrmn&H1}66dRktqvq+L64P9#{)VTI%|1QJ|S$m zv`ef2WFami`V|047h!WGrk5L_4(DC?l1Lh*8e!)cEAmjV<=AJ6;>(Dr#%k1AVRS%~ z_Idf4b#-o<%WRsVt<2T!U%lj}*=v2aVn<2wH4(?}XBBOTX<^#%V!xaU2Ch&Sxx1VRVL}BEy4Sn%5v(xcf6chVJ#zW zn#14zTKGv#L`RYa+U}{CYU*rG8&l=ymN|R;3o2WlAy&mUg{p42ub4@P{d;)>y0K z)yOoQ?jlH!kMO0QLSjNPOo-ksxJZZ2LaYes?GbZHugmnBNtxd&L51(D@p&ko2aIoj zUQ>x&nDhDv=SpeXs_H%GNojm``&B$m+Pqu(mDP1)LV9~gQgWbOpK+tpc24*F#LR0` zDm;5eQm)BLoZkhIV%(Qu+#g}wg{&>m0{y<$hC`l&`$dgx&je$gwbT${N}!%6HW)jT z#tkkQ<%O)!?J`&l7CjjiVz_Bi21aX^CxFq`$)gn_h98D@P9Kk>fnFt#Q=Y=W;9O2q z(DcfK98t%3PQ)yX2{a2D^KFxt@mDl{V3?wSn+8XWCq|@^C~~9*tUmTU;VC`SgOwxe zZHs{dR(j31@!C7@+@X2+{E3Eb^d!3ieLbP}Me2I2m^6-xsOycWzPQ2e^CGP`ebl$XB{Y5-Eln*c}+A(rS^1rkTe%=gnTcd+*-ei`R_u z#C?|x4R8G0ZMXex`I6ZP1`G3wV(o`pT!g7f(&_IKrc{#`krm!a+> zQTOL*b+=9Kzc%I>0IwlD_wls4L#X?ksQXKF9pLoC$-DS& z{sbf@1C(=I%DS%Y^X6UHSy$!ngwZ*z`&;Pawx~Yj z(7hpGmm!fhoS z{5DM$>IvRkWr*^vA>F5yyQF4*2S-ROP=|Qn!^1^#CAJ?sDUI>-K}S`+#tbyr2l^|G zoxJEGd0tjL*L*t9`SF}pa>x&IRsft-59Rq6zR!f`3MBB+^hVBx@xHjzecv#DSbg7q zb`p1jr!hYo=YHNNo&!u7U^YfD(@aLg40SWY6LrIQE>6H&n)cj&?!s7T9W>MGhS}?Q zZZ7JiX*5fP8C{JN?^DYRh~ZZTzAS~sA4!UbC|XtO)_dsIJx>0^8y4Sx|KhED`Qq<< zXYrQ4hF`CKyW#a;$bVw=k&J9j=)>gkTg-ZoTmJLyEz}2Jww3ze`L8#;z53S;zmWf+ z56*692L3}a4&5VQzCvT*KRok^C(hh6FMziOUY7SuWLp>+Anv355^meQ^2sMx^8A+r z=sqCEHa6J@N$PIQ&dOW?d$#b>?UQ8-gq_E$my+DU=VZDw?PO)H3ao-3_CN?D)oGzj-%AW{~CU!8w1I##6WT@<+NFQKW=8D1_9LQMe|2$ClsmEROS!&kyDlHP&h%S=F}(c?Xnef%q8 zKZ&u^i%_hnKIA^-9;0{8t8$OMXOtCgByd!?ZhFXCjWb@$T5$dr;jAXY&H(sSI$SRB zX;dAwE>r4mXDv7{^jxxB$HUKs>r$rHP5cHrbSHG^PR*+m&(bc@y!r>wg%hu^0sfZs z2j)Tfz3dRxpLi5AL;Y<`#`A|{JTFbWIQbrbSGpEB!_3?P2cXgmB@{S8=;=r+FYDw@ zFe!ja-onAQn?QAZ<&swqtbzy}u;#*vg_s_!;a$NW1|Qs?{!Z~9Z`rtO(>Vt}C_>l4 z_cjOr^_Hg}-}lMr#j_3%9eZ-b`Lx39iWEBFL)h_lj&Xmt6;~H6|U~i&Ms*4oXZ#UCxbT( z733%5TmRs2Z$ZV7^rH#?R_ENF-F0Pq%IYqdJ+E+EQjT@U{Ql(RzTusPIarP0y~^12 zkRmDqrHD+8QNo*ytf|0(lLr}ia0vHYniC%%pA?^D1iP3{hBSyajdN7_~dia^AjYCYmim&GX6Q>lMe~T!=V!)jc7efWC_WM3FBr{hCxfT zgRDWuSv=Fn>sO}o)T2mZqghNl7*#w_1g~M^a&(`aIQAL!QLeoT4w%^vX|@ z#e6pC;y;*M1t(xcYPc zz#q(6k)vu|gP#yv9{iY8uff-j;Rky@i2SJ>w&~2F`326RM)Qjx)Z&wqC$B=e4dqVF zFHX??A^zg*(wY9n6)>JWnanKwH&Ta?M@jcx%KYqzj24T4=;MI3k||QJgrG%yZ3@>j zU4mXWp2*|l6PA-w+?t>oz!jrCNQM>?6&_()L^&Ft;ekM9jJD`gmk>WX{gLMCnV@NZQLrA4%vv@mV}yNxdc=NNJk?cg7Yjr2ZOmRn=Lt621>TYWT5+y z43|BTJS-xnO`wPb1APzfX(^?9xzZNRH4{gJKg5LTmadt;g>LD}cJBPFsR`{`N{4pr zAp9_A@;~{1O51_ojj#r64ESMh&VYBYQG}RE)VdeaHsSY~G#o{w;m{D;ce^83B=Y7^ z%O`>wz9e{0aGtsp>R)Ml@WkfeKdyb~AxBKzNAR!M`>D9oacbTQ7KlCn7WO=!_{-#T zSeK*lW<&lhL%O8vg;}c9qeomXAX0d7$$5qMka5DPW(-%8-%6`%JmVVi$alrdYK+#AnCM@NEiW+ zC7=Dh8*Z4`EL|7gJFa&N$NM8H~ zoB8bn{B}r6LKxJXcpLq_tn`<}>H=Qna&|<%oLw4^oHb%8LH(#-qJRjV71qa+bB5YG zz2U^${Aca_m3IC!@e)PmJn_Wj2mDj%0C;1}KLt9kUhD*61R147F__6lltaL%qul^` z8*!<^$tvEKd(U1d+*6J z>nPe|^125W1rKAMpM56w56$oIfL}cG1YB5hyc|2b7uvQMFU}A^1m~v#3{Cv+@4dI~ zvx$qPy`M={pMAE7n=axoOOWRz_nAs_N=XDRMZc->Se@h~gpi-9Ym?eF3{(;7cO&(G z@&V2K&-h>PG58v<2)_suSj30;5Y9jbdyW5v;2+z#)f)U#}E#@vZB1Kw4}HQ%pNSz z?FA~YM{-P-J_Fu(F%{Z=zdh#Nx?NUqo5A<#y>=26{C0l#RAqNk@bMTo@7$OK_4fpB z-*evM6?sb+76d<@K^Z9-P~;=x=?e=AXoXM7 z&zl85FNCKV3@0E|(YktlPX5ZBcLrbjB*rQ}&1)xC(GvdtWg&9$jArjbiI(si_G|)9CENtlMOgmKt%!CHcaTmZ^q} zN5nI!uuqBX=u}VA8dXI-Nw2_NKtk$xR3A}q4ERp#5lJ$QgobJ&dmgL?W0B_#TvAB9 z5~3CTL#v^Q6t1S)usBU#PIfGCXG#dmR#B!b+<5b>LlYZuqNJkxP4}zfRmi9X*C3t8 zg6-Fe^_ch<5FfG+DrJ?-%aEx>UXQvwYi_p9f+#PE@j7_95YLujOxL8Q=Je+v<1o07 zl%-~qAx)c-V(U-P$7xiFmR6)zu8|w^6t?CRy+uAtYf>v-lajjkH2MfX8)#P_6J?TS z-;9sbISGvi$3>nXSYcYEmfG5?s_ZXR%h+ z0Y0Li4f0#%b?z+ll)6it#rC57v?QLIOu(Q_1Jbw+tCtaHH0Jad!dWRVUB{SVX|6Tf zVm2WYhpj&)36RFJhqWN>YOVSJH?TFQ(SLMLvq4F8`(5d&5YUM_#THRCX-8?pt;dwcjp;JTq0hojr0s{b zgtjrKzox39tfZ(gBOVdemb#txd|J?Wv)R^fNE54!te)W=ITUUYeh?<*Yre!Ar}j(x zb0{<3oeSWI_ep>tfboPJf9Q?yD(>a*&M8r51Q%{CC9pH&3j)N!qZ3Is=-hbGH zT~=mJOHS0r!{aeUt0&XjOjA0po{d1dqjmZ{2jtM1nPCvv2T(K-oN|5w=TR+`d zk_W%6YV}YlHGqQc_r0QdI&nS6EyK!BUnfRlXKkq;nxuimX(yukp+vX~4YLA_y4nfkDUkl2Nk1 znRi~^?_w}S_vLLGUOaIg9n4$f^|xnBH$Q#R0y5F*zHubt@GU&lGd%IvW5>KTzS3i2 zEo7VPde+2x`J-}L>lP3w^3C6sX-v>);&l?@1!^HD^5muF^i&O9{}>V>bA+ycEIcD4 zZmCHx#l=~LXCtj*cg$Yo+avUqzTC{y)9q7wqTqSfe(KM(91?@Wq%Lu%+8f;|(c4*) zv?gkN(|V5C7p;F6nx^ygWXO@qL@^XxQl;~?Gxi>%v%uVG{h*cBq>VG}irFEir8Q-Y zMvYpXYK94yAJ{ro&CLzCnrrTD?&)Z2XliJh)yV3ZKbmWjH;&x;?JX^tXUUcZUOv@ky?m+Tj_j6!7`v^d;FghK5;mK(;?x%Hv*tzl5X_w) ztT}dUBy8c11pq#P%`WhLF0^l-${3&=>kyYpx~n)0-|lpPTn8ksIhL{G3Zbqob2N7!XB@fmGeXqlRlOA z6}lxoB6H9It-!5#OFIpHN!bLHat;DsHKBphDKT?`N76i_P#vxL@P)3DRuhqq^ znYoA1GX&-`^s3YE{h}w8X99k?In+|A2#~Vt)Q^oot3g3UQf1UzP*PG-UIKkyNQ(z} ztBBV`h?g=Sx@U&A-X1b|j3cZYH-5pw6P9V9Z|Vc+t(u?RDXbw+yn(au^EWok;nC~x zv!lOP>?6lX_>_V^_7MLQe+l=nX{<5;Lp%^{_}D?iiHjhir6tcPxSUOOcfwVMiw36n zp3${N@N)P8HshBkNCgk6zJUF>*3blN*>$i|{Vncs(s2KEu8h}Vqzs+*2qH+q_F+T< z!9@%yT;ow>Ea8_Phij*Ri>~;nA?~L{Lncu(WFLuWrsNl3EZvk2HEDz+8C|+?@Cht( zwD>NiO&ke6tBhDPXW|I|?arOSpR2=OjQd91Z~q2&c~1BiIW=!9cX@B)E>C;n!-)CN z9qae{4<}+{d2rDHJ6Vi131*5qJ?`=(1hUs?AhfSVk)A@^>UDF#Cy+lzA*ykDN28w7 z=trm}(p2L~twygIw4QdqMC;}BJdDZwReC5nkK$OD90MK&(_ypWcj>C zq@SulQvZ(c*nvC$e*vuefgYXOU6b|TtN^o>;m4H{D{3S!*c>2-qdDN zSbm^wHnqWCxd#1ghmAk^UHRC((><>oV8~&6qIh26%2KlTC+Ono$`XE9k(T}iYD+W{ zdgZlK+XaeZHz5zKh_ zxD(DyWSqtyJvBXx_Rxx?W7^i4!)Mf$v$ie0+NW* zAzavOA}XT}StoTmM<|gL)THtgXbkHgxU=C*!w_FfIo6SNN^MQJWafrQR4L*Ti}rCk zva^8ONo#Y1-&T%oiF={xu5nQEH!Zp&aAkyX_@?!t2m@wu>^+rFqLA6ETH>qW( z@QC~4)NB6;+Y7`Zhg}Q7+|Jyrn!O!@dB|@NMuEC`9gE+Uh?`IijAVf;kYWYy;>6NQ z%jH!_26v%fjs&0%z3O=b-Msvu0KFEVpWZ{%W4Ixi@d-4H)5nj7UadYDucyUu78W`j zwABl%3#-aX9Bv10qVnu{;2PwGN%_Ksfo$d{`7AP})sdJBA-z3uVjaJI;+bm|557~t z{sUq3vMyqy%lHD};gx;<{|vr3^}ddD-i*W-^)W%1q(F`z`KQo@CfJF6dp}@U&pO!< zI}%8$tHwor6)3-oD%>Q>gRS;$htIuy-|7rCre-9r;>vnz z(?IErtsq&CMl{z843XE>MWRU8P}gAp?1s*Uj@D)pMO-D>CDs(O#F`mVpuZU62+%T8 ze$9-VdCC-E7cX|Fl(B1@^xZYx3@KtjUR20q-|a?$Epodq}JdSt>(bdskRL@{?JU-TYc%+hm8cA{;;W z(iu?AlH^1lkPd`t6G>q{*loTiZTb8PY4Z&&J9ok|olpEK?`ai*v`VTeR8>!fH)|*Y&c-Df-z;9G!S@Z#>FBwn!+*| zmHT;`)>6z&#OkMjW8elT_8#_^@WqqufEOLj%5=HOd4UVxEfI??6XE0F!KH`Ky6nvb z@9isk8#;5Utk5yl=9K03H1?dgeEo)Ho22~Ys^wvN9HH9>~qfhIL7thM6;rsmV#m{~`5R<0RH=N)d`YVt1zHbMGgAPw<^& zI~XgUdm!0nvw3WVm1TBvdouxHAZ`og@qjgt2Z{=^7YFkUoAJzufU}QPb$3<|^~^1> z5B3aIcXrhb^$g|b4ffpZ^;T6?S64}<+}xp_L0@}^Z?Jo=%{J6CucoUTPu$t)t7~km z^ECpv$fLJRs?dyKo`tN8Au3)OE~s-YCZqwC7;LwVX~{4`l3?-(`JclY1^)<_JrX}9 zHYdxHtHGcJ;5|q+Prg_J!MZwW4SKy2P7;pSiNF zcEdG6Q)*{^i4l7Qyy1pPC;v0_De%FD-A+E+7f8#6&0{KuRMeNACTW!P4+R)BVh6A_ z@nDQ7+U42=Fh&}kW)%#lcz}#ki}6X~dt)_(j0GE2osM`{9YQ7qY-Y1wk9(+mGm@O^ zGxVmEBwZYBYC|H$7BSh8sMIT-PnB?QLq`mp0hhRFS`G zpug6dW3!l$%p`ar-{0}kuEh%m#~n8(^7{E>!4J=@EBDTt1^qToM*)14J3vca>=_Cg z!;*;pWk3^W#;nz>A0>&LgO8&NG#K3Kf%izI33Hg`$uN9Db_ykh>+BHcU4#mBpTxlS z#dtKLeW3gcniBi1yg+8YGx25@bCOcXV01c2KjBV6zz(JyTEq%;n(<5NG5uyz(0O3u z;KMKJ?Oqx1%(9ggthXLF|M-acmZaAD-p+x6%~xeEF*naM_h#R4j`Vy^4$>iAGTgnO zv$Mn>1erjC?I5 zacpq9ctScpa#_%ed4xmGIAO_~sM9CXagOnjBvI2qDbSa+FLqPx2WV0NPsJe)D`!SD z6dTf!WHR`b$Un&mHiYFxgc%??S~C0^6!nw`_X{}MPRlnU{%z-EeD?RGuIg?4=P+Zd%$@J;w*~)=vt?uROWd@&=pTZ& zQ~?}eN6sqbMPhmxM`%NNkqV&oLPQwC4|qTixmpiBDd??;*Vq=y(3yt{bf{+tD-(Jk zqE)~dvjJImE1ki%8}Nkt83t2e$V7l+qZ|Gep|g*}0FZ)qz}lNqbqUx~t`~mKxO-(r zS^mglkJ((j%NWdaJCkP5_O0!ep0BCx&dpl3VtAmWIb-|gWP4>v&+zKzWpy-n7zap0 zfUSkyegvsX64WDLNANAe?~Jbj^@bt`I=*q3s8a+aC?&#kwo@TX*c+?8(lAi0v_V1+ z?Y^jnK>D{XNvDC+$HTQ@qG$E7*t~;N}6Xx z{oRv0`D1K|>$QjQeR{n6yZLthm^2{Q^Qo~GHAtye0)KIY>!Tjb@p6E}mjMs#qPK0u<=sgW07Og}FJmEm@&iW?!4( zaGzMOy>97hWzJ7x&dHe5P3oMZ;#Sx-fd?Uz?J0JR30cHswBk` z=28$O3gRR%#&HsbQ%GV-0&&S{)x!IXZ+!8^y+8e_)N%a6~|Vwj!4i6H;({D6(< zBU}OS2T_R#Qq&tUHX22@E5!xp^7924QF|s^&;QOR@ILr26FiVUHstBZ?;PE>ZFI{P z@h_iHKjFLRa~L5D3`#V=P6pRBT<+5mzc zG~Lkbqg|X992!yr)3t)EqK=5AmM|rjng#nL>SB=Ms*!f|m%+JgQu!>M>yzWF`98Vu z!tcvrtqOfWHQ0yh-GiQ01-@kb9CfdT_9<=�KT)Hy-dy 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
*#B|)9>{IfV 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 U$Anz}gl_j(eLcKK$7k&S05mmr^#A|> literal 0 HcmV?d00001 diff --git a/wasm-notebook/fonts/FiraCode-Light.ttf b/wasm-notebook/fonts/FiraCode-Light.ttf new file mode 100644 index 0000000000000000000000000000000000000000..88204eb19b1f5063d5efa78c7039d91fe0107afb GIT binary patch literal 225992 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 {_ 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

cCe(7t*t?iZ!rJc_y%L% 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 literal 0 HcmV?d00001 diff --git a/wasm-notebook/fonts/FiraCode-Retina.ttf b/wasm-notebook/fonts/FiraCode-Retina.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7710c659fad7a9a12471d862b11da80ff7fe3588 GIT binary patch literal 226328 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 O#7Mae?~(W;BmV9u>m3?a4o2ah$uxs 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

urq6;1) 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 hv^sBC-hf%fH|bDOGoRN+122`{|Bk)!3zKY literal 0 HcmV?d00001 diff --git a/wasm-notebook/fonts/FiraMono-Regular.ttf b/wasm-notebook/fonts/FiraMono-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..59e1e1a1d3b8894fcd446cdc031b6caef0fc4716 GIT binary patch literal 174632 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≥3+F=kmf3Kn4KK6d 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�jLKD1Nk$BT;k3E;mbrN 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 literal 0 HcmV?d00001 diff --git a/wasm-notebook/fonts/Monoid-Bold-Large-Dollar-0-1-l.ttf b/wasm-notebook/fonts/Monoid-Bold-Large-Dollar-0-1-l.ttf new file mode 100644 index 0000000000000000000000000000000000000000..0369ae30f16f82b03119e18c05fb80596faf4097 GIT binary patch literal 73052 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 literal 0 HcmV?d00001 diff --git a/wasm-notebook/fonts/Monoid-Italic-Large-Dollar-0-1-l.ttf b/wasm-notebook/fonts/Monoid-Italic-Large-Dollar-0-1-l.ttf new file mode 100644 index 0000000000000000000000000000000000000000..cc733e19cb2505e28cea8b3c0565652e238ce1ce GIT binary patch literal 95128 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%0AN$v(MQ-*ca?eu+3kw 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 Z*AX`Odv!+g2hyDkYf + + + + + + +

You can find the readme on this page

+ + diff --git a/wasm-notebook/fonts/ionicons.ttf b/wasm-notebook/fonts/ionicons.ttf new file mode 100644 index 0000000000000000000000000000000000000000..c4e4632486d863337c1c73478ddb3c20726c55a0 GIT binary patch literal 188508 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

8E#xmG!w{$tO5=<$!EHPzZXo}IBc1_sqA&q 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 literal 0 HcmV?d00001 diff --git a/wasm-notebook/index.html b/wasm-notebook/index.html new file mode 100644 index 0000000..355b1f9 --- /dev/null +++ b/wasm-notebook/index.html @@ -0,0 +1,35 @@ + + + + + + +

+ + + \ No newline at end of file diff --git a/wasm-notebook/src/lib.rs b/wasm-notebook/src/lib.rs new file mode 100644 index 0000000..304ee6e --- /dev/null +++ b/wasm-notebook/src/lib.rs @@ -0,0 +1,15 @@ +#[macro_use] +extern crate mech_wasm; +use mech_wasm::WasmCore; + +use wasm_bindgen::prelude::*; + +#[wasm_bindgen(start)] +pub fn main() -> Result<(), JsValue> { + Ok(()) +} + +#[wasm_bindgen] +pub fn new_core() -> WasmCore { + WasmCore::new(1000, 1000) +} diff --git a/wasm-notebook/website/images/logo.png b/wasm-notebook/website/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..1ab2087ebb3828f2c615db6b912871bb972c25dd GIT binary patch literal 12509 zcmb7qbyU=C(DoWAiinCxNvkN`$kHkx-CfeswM&;$3IYn!E+Hb_-6A60OQ+IHceCHk zEiTgqVK3;`M%8Fh6d*%8S{ELs@nF@hV z6y_=#u;;ec)+RPE@Lvezxr2!T%*2@5*&OzoT0&A*!I;J5Dg;6ek$fSl;xe)_?&_h^ z{|AlUL&!A$ym#@+ofpIGk8uqMgC1&pzIW}blI1MjugdO=T1t&nEI4n}3RFb%RhW;5 zbZA&qMJ^D1RDE*`=OXPJ5$cc4cSK&|wv4S&k+jCOBie=X=BGae#>c{ne^9z~FnsAKaED$ITf@Iw&;mJ?dd&V`ETI(DmWEhT)SE zBY%H?SynfM=fqy+{t@Fzw*B;P)MQV zoMtR8x~E0q;ddgVqB6gIdtui3C1ZQ(*ny}-S4+z+mtgvLh;o_D_&(kpj8JKkT9f6# zN&3|FTpw2D=dXwR%sPlli%sgU!c`yA(`R|3Pi@RCn?KUzrKP1Etu(ebH+TQ^$Lq+| zt-7;}S>o1A=3Ug?d-r%er`}vG6h2&_s}mG;4tNppXHv7JCq*JMJp8La9&wy*C5&e1 z!r2t+cf&e4B)D%nyG~%*+NYGLm%V=)0{hEs^>g&=5KA%hN{rmS<`sz?}%xm=S9=2(1(UcnPNi^vtrzi8Re0D)^d?xn| zPID|=RPSE;BZfH5*U@&SAgI{NRc6#WSfbyYzfhjtXd7*T4ilqsU2PoIi|jDn-!V&@ z$RkFn*pm`+{}2=RTiSPyI62*e!8V)ZqI1}gEiEnVYt>twJ_NAqcz8udhK8B<4P7i! zX6&kD|2RG0WsA@BCpXg%JUP~{l69)0aUUAqTQLZbi~jt?a_<^KXgc2`d%Vgy3rJ6^ z+%DO596op(DC2FMAdBYi753wYPvsW+Xyd~^bo3j!Pl5ki{qZY4qI9ArVI;-<9i z8uDGsr0X%QlT3CB!6TR=LMs=Cf3(zESxPEscX{~vziU2?R+32&7zVE|N;;(c?!wbf z4QN2tn^69W&6iueLajZ%-d*c1lhB6)Jy%&_iZUH`;6&qM^m=Cxp>Ak@mQ2<0l2>M1a~*E0 z74!QlXEK7^f>^2I!{*SI?{cj*28}4PEs_Wc2~&QDkXNO$<_18+i(l=C?s$6Sgr2~D zrw|t};TIgfdPdxzxjG`=pC*U+tBmnXB9MIW5=T>m*h{{0o%kR1r#RxZ!DWk(84jzs zut&0S-)3fv%LEGDfBIb$&(o{X$*nW&qZvQl*P5Mk-&I^4ANj>_a=?;#+eC2a2?N9b ztXiRzA<(@zxFmkIno8);4yA|np;Z?VNTf=GuCHpA8Z)zI;ji+oPJUe*y6K~5JD!F) zrL$kw7yMVejC51$x;1+~8APE9l(6pV$COg~R#)1Ua>|AKqmPQplYTm!k}Q1Yyz!jM zWBm>L>u&1k(S4dd`m>XH*6gH9u&%O>_V*nDEyQ#j7*Hdzewa<;Cj9hpVTBAfD9b|8 zZf_Oe{fpf)aeM6&^t6`3iJ~~B$)h=vz2btygrEm5c2=?Fy z_eRt+gjbCXQa^Cdeo-WJderw(_Y+i>;8^4guacs_kqeu5B7LQXp{<|0@9{kHS*aIA~ zB<0o9qcvWkRf4+bQwCETeS*&M{ladWNl5V z+p1m$AyNH`I#$5sW&Y5F+F7Y^C1vGHK%3DYKfbCyTCIvgePP)+kfIPG#f;nM)24>= zJbLtq`f7#EcqOaW6Yr5GchoJccBjx*H{Q&Py?F7VP$?lzA1j^Ka#p1M7Xz+5YFgT# zN(bTL9A%V=k>`4)O3XvPFUVJPNV-ly5Zy6%tZ-D{m$z?>y~O+&G0MdyVn)Qwq@>e4 z!3ziTnc=pA`x*MUvMi!~4L)}Aa?9cm&v3&R@7E;B*m!)}Wt|+l_$pOS%!3s5a=@mZ z7Hj=K&>P!~tQ)f{>ft5Y`M6kXUiTIvfLjFq5N`=zdrqNtZl^jIQJ?0L3)4Cm@0@?~ z2^#iY@l(syF}E2jS0p7R9Vxd@0f0=vt$H9wJL`GiO(`iUrNEmMu&oYWeJ2US$+e8> zzY zyKL(WQ_u0m!^b>Ql)_%s!zGsLc~_y)MKq&W@d>K`xvfQNXCwK;Fe>2* zodQGu$zA8hAfkD-WsOngrV~cE%OMd)^!1H`$)Usv9`FKSbqBN85y2spf?5FEaAv7y z&A}-CQxRdle4UiEG+uhGxP%11?gSnA!=iIXmUKrUxpQ;2Eixj)Xl`!quTa(Jx(wZ-jT5ClZvepin=qP}32bYHtaDxpAZyfcQ5uiU z7>V5_T_vTz9-0JxP=S-PTn6GZ^*2F*o~hN6qO+x?$L|{9+rzIehVuVo4P$puBmugm z(3P5j#pC1Sq}s=|6Uu4X*)nPJiF18eL#J{aO@Nj*KaKrl&k>Br)L&I9S}Y;Y=Daq+ zSnIs6(7#vkI{Nd>t`K@L_mPclUu$39gGFS9at$pltw8U(t*mHiX3$B3hp*MzkI}~u?+R`t`;DrfD5pY|G^Y?d=7h13 zR}#I<6uG@wVUr7=N_BDJ``Bb^s>y2ArW-dnJZAtNg+k`u&fPm5kSwwE3taYpeV;04 zQQqA~|7)|wKle!(FF}^$mGhzbsWd#-`c_V3M3w)tf6OT?oD3PVt#OonZfxa40t5MY zM@z-ldfJKpukyDN(?+ti<2Ax48~j7U5B_Z~aPLfl2JE~VxqEF+JKGbJ(7<*a7dJab z{N?fH=_Z47Td!}VBqW?J_#I+VP^em`1{^q3zx3jS2%5yp7Z{$j0>SB;ZH-o!P)Xrkkgs_rEB% z&l^8@^De2`fw{))J^9spT=kud=GOgLeX2ryJm>DNzTqA&B3qYECz#$@d4=rH1;HUY zuR$4t$(|vzrn1e;OwTAV)^Z%rtN_)bT)td5kA~IAhv}=CLUp4QF!%z3HpTnaSqgO6 z^{w=8X2mPb-!v3Yb(UeS|4mL+Fzc#qQ00%CzCpKoDV9Ifd@5!q>ObE<2_idV?SZJg zK;r6QPrH)%SewJmFTI{d16k{SB_bjJ?Q^i3^`t1;{5UI^qynPg^7q3kd66F9)$FTW z^zsSD5X@s*H)2`I;PgU0dy9au*|ocwtUjGn8o$S^#pZ*#%07EEuT&}7a?F_9tm>sE ztM0-N&sq9w_9oo9tw*?g6)&HS`r$nc+?{T&)srEE2;)3b=!UjuIc-;JWsUpZ07yZe zCt<+5PhwFBDd%qzc0<25{11th3d*LeTUvpZgShjVs#CFpglN_Aa$WN%;J8I_>6cs3Mri<)KV@$hv0O##}IwiCDI z*)^R^%d$~!?^BNw>(M9?EFy$BwDjeT-Ck}#cr~7Co3B_X;Za*F;``egR&jcKu+^U; zL2wbP_>1i(ROWj9ujZ4}=JbSy-e_A7IjI1t*;Sl^1NGN=d;c5wG3RaF`jJU~LtkF! zNX6Q>D?(+W^l}xY>OF0&b=d&A{u}tY<|{9NQsyr?%sS#`m8J;N#oy_4sys-;Et1{>2ZwCibJaK_`ug(2`BRl70Xq?A_xc8>lNUV9wZMWS#BVC(QD=%HWi3ASx8rH?& zUgR;uQ{x_Tb=khyal%w4g*eGbS3#rc`7ZDedGEUicriGf@DvNz#$?E=QNS`*SIQ=H zc_%$0&c#V>P^9EC*B&eG;856hm7K#sIr1%{N$*rn-&T+;-}hv-*VAp;WKfMMB(7A| zQD}TgX&fLRb0F$}CUHBy|9V>#^Oj`()|^>|oAY9=57oMJ^lD%Hy-xHtY2fe9q1-21 zg}P8ZL&L9gU5R<=>5omZq=4wJRjE{ywkT3T_g$`NR{hmp(LkA@Z$`q1o)Y}84<-GD z5gGZ%1&N)nm$$7&ITsrA57idiHjU%H2gyfgl>bWp8qPtK$fDe19vIYC$7qS1sEje`_X7`bm!CJnI(@fN;+EFGi$XNujD=#x@fan zWUFco5ne(BSV8~zFY&)yKG9Ysrykl6cARTh1kBez=^OGmb3MzS7S?l}B^viepZpun zS5-xpiK66Ry+uWpmzLlr6++HiyL?2>YqPzuv9-0uZ95?VxUFCG^TJNc8iKn+M&~pA zAo2XH2lGAoZh6yzl<&-EA^KH?H$@()^rTy&`#J=uIlhqCELLyT%*f0&j74gG*F35#<=dPFJ*{8jxIG{i<>olJOhdp~9-r)*lJaL?oYhDS2tUF3VvtO^gPjdfu5UuaE*bg$eTF;|xKpZXskJQe9*=@>RlnBM7 zT`B{($lc+MHeakahREY(j^+Vo!8pUi#ijgk!mCQF#3D6{S(|}|M)Z3FO<+SZh)@=z zyDM&MHG7}+6{cYEM|*2#YS{aR;kC@$^V&}6I8VZ(R~H85dwP1Jnfvk$o}Z-z-Y!!Y z0FSwtf<9F*GVM~6l)P4iA(bHeUzm|{`}M-dqKjK|i+dneHj2y}0-cf_rU@^eY{NjR zz-fs&xlfnBOuA#gs=E0hx$Q#Fp9Wo)-N1yU?;$lYazj&FAv^N6@^`}6p0o$uLUR}Z7BN6vdf!_KT zZi&tK2%WX?#{P6=rNML4+n8DFl}R_@m9W+9dfzL2s=NCe)2#rR?@fB=`CcV}s?r08 zRd=wH7b}Jt{bT8^n>?awwKA)hvZK|YvoCg zt&q^fr+-wm8EX%vn!>2+{vOGa@v6aKTtygg0CAD+4uB4-0@g1o(tIn5Ir?~vOO`ai zei+JMRKzHtmleevD~nn5hvhL3a=6;Hh|hi3s;~dB#InEguRG4c0mG9gpI|)APs~Vu zR}2yd@=Ju?&scZ4{pl0Sjw7J(=H@!$Wxvy6*2w?4_6z|Ss8|FP&H-4yED+cS<=f}R zG7wZVU%I$D@VxXWFY30;j@XG?SY(cX5poDfavNC+X6-TTa~-^s+4$r< zDit{mMA_LHiYdQw^73G9{RhH%>SZ?mO^l3;SxVl#RzpegwzZl@zdxK81R#-{!5Geb zc_1gA&t~jtS;>KsXg$#+NF<}~{GDbl87#FPy*@cvY8|hACHqzK)Tolb`_ngka$dE4ueN*4$R+i<$||Euo@sb;6iGaSVU^uRzN2!;Y-CS;r&pG@NllF+^W08#LmNewpOER&bw>+iv>c5 zYuYEiDfQ-;CS3aSxrFW$A=;Y}l6 zi?h*@@$uwbMp&xlVqn)ZL`bBS@iNP#^+a~v$;q0H?Oq7_SYoYqPfsBP%L?G$7pgjG zZAC@Q#A~5W%%7_i9j1m6Q3=m_hM)(di3a4o(Vl!V$|;GS1I(U@LPi1KPmU%dqmE<; z4*|I=O@;9KtCF$mI!B%}1Z!S7-}>2ekufiLsz{T)MP0(F?gv0AXB3AJ2ge~5>8891Rh3?3f=sPE{@y1^vVsAq*+F_r>bT@yO;V4 z6+;*km5aye{vFL%P=VhjVT7(vkwLO@F+f8wVnoV2amRCZM@E@ZEn8uexojcS>jasj z&HM1tBNQqCpY?Hce0QLngOsRN+SU@0r_>#(N`_qFK)1oJ(aulRI@p6em*5(hp4xnYZDY0D-*o!br z_(%+2ESWad+;}ML?(9LogEpy_Ug5hB0E35y@acX^+Z(y2Usyg}Ig5<*d|#Cx0Z@jj zV!~Ozn6qHioz)Fq6omI_9Ak%?R0Qr|Q79*V$cZPJ^m& z+89ObqhPeEcQcGQ9TQ)x>rVYiub`?rz5lvqudLJUVNMQh)^N-}_w^R~ejjLlge@yA z0RMF+Tl}9=C%T{3WNyyN)-l7%PsYjFg0a^b9QHlE+;BtoKFIuKty71CcP%>8+#^el z{G_eNhrX6xIhi9HN5_i;?%iw`GX;`(E!Oxe;6VhPjn=}&XcpB*Q0u>k_}*WWMr&EOn8Gq zrl{5But(Tr*(=!n-Gj!#U}J#Fz>kOs24!6^I!YjvBCG!J1_E(WtoW;(>{DW)Ve9mb|$i-X9*vv=-a!yzNADHcb7Be;jp;m+qU?LSjDAvD( zK&lsKS|Y?je7STX@6|c8@_(#*z=V7s6y#93{63;lly{w8F4E078+*Oi>ze5ipFhvQ zhN}W=DOKt_-z%q{)o27b)G!06x%QVo%}Gj1YSp-vD4Rs*jV4!0h6OH*{ksV9*02=f z47eVCz`6`OMew?bP$bw#YR8`F549dCW`{a0Hxs450L9jRP)YawgjpRjzqLr$K`$Hk zi|Ew{%oiU#4>FWEmvJw^#N21S0I;=*aT1UesQMjhbaFI{e!m{frO3jj3_pm5k25%pnnJk&DV(9;!Jr1tUE(k+WmAE{`w+Q;BkjOS z=QW#b{W`sPURxec4vu2`X>m}geoROA96(M{_60>n#WS3$q!bQ?EhK&W_JC3wYX(dO zN0v<^#pXr;UyB3KQ)@`tz$RlhdbB?s#(FRe>Rh_3li(@{7R$ItZ?H82J4W*7See~& z`Tw=6gK@f!qN1V>P$+#FF4OnfJdVg~Et|FOcynxT7VhZa!18+jc$f8bxN%Z@qs#lW zueyAVxULq!$o^t;WlB%%slWVHPnL6XDjf!;ee22E@fB-%P%ku_=XRKBmTGH9@T(_! zY`zEh#qli`4J$mUt2nU$B@;?K*v0zYmC>{20Xm6LfuF?~5(g5w5wAec&CP9m3E?nW zW;>W9>Z@m_g^{pN>%LezCqQ*uTV2BQ7BA0A&y?=V>=EaNL$u+VzSYW@7X#EfE%n6= zh0KT(aOJ4S9<`h{F#wwAb(q0t_zO4pr^&a})WzvA;YZjiF(i7nNWp9{SJ%|Sf=u>gr>DnemCIgpY=Jx8l? zf!_d}z-_($s%8%M*|SXTD9i`5*0KQ*Ro|?=-pRlAdbTz4yhUK@eqJCHz278!(e1~L z=Y_*J{7;Te2tbv)?8%soa*16$?N95VY^PmD23i?VB+NYBQV)4tMVnQ@Geh`D=2aialXv!G|#@?vVm=T zt4(^8Pkr9o`ZRADJz^iojvoI0-uC2GM(0iSF1YKygf;#a=`#I}Sk5M$IjYHfq1)Ke9bbrFzV&En3)>B~^23b% zeHV~VZOoGjtLo^q&o{|~kPeD}!Cf~Yl6qPhM)1ha{tfu{ujgf2nMNc|E%{f+a9j*u z;XOnK7pu&tM(+n>v%%!f>EzCl63ep(rjfa|?^~k-jWP(kUXFLmlym#nk9$$5v&JGo zjLhiEVeWxzKuG|<$Es(Q;jv{o&9!`L935(+5{%y*yxzng|G2WfYfG-184(QOZR~pvs4X#R6~7zCM0ye2t=H)h(a~nP+GU-Ko7P&~NGh+|*R8JtWGD^YR7YE>rjNBG-UptJ(zEAQEV8hf zr7&N*nv(?+psO|&(f^=7sWPeLy4#PLN)0=ZP4D}rC>PhcH`YnLh*d zU{t8)C*h``D!P@%Y#yt!>0Az{Vss^ugjlr+p@= z^&kjaa*jqHcFT*QFfODkED_WO z{KBuW8c{6!DB4v|q9|iUwrAOs>abnG~Pyvt&fIfV<+({QEreMVRJ! zoPQRf?+4vks-Q=*w*|fZ`}NnLqY#qMZVFO_;gEc8fq8N|<65hH>6&DBiBm5yVy`Lk zP~Z;g^XJbC0FTN=JC8~sdZ{%tjA)Pti)o3lfiHYmzKZWv7(M6A+OD#U*~l~BV&S< zc(BAX1eivyrnWRgR8E8B^L+4{MXLVx{Bwjwf94Y&o?ZO!*b^r=8ijGmzkF#|xqQLd z4{8>AwL`3+P$^J553>@ktSBMsa$624&??Zgu!L&fIQuMudp$^@iA&lf>OOv4aJaYM zc_}5y5LiRDRg_M@ApEVlFoooySKgNV#yRSs<~nGULQqs~mFxrxM2DH&TOo+UE95&W zcbZ2yR0^DhNgXJ8_%Q7t;uD2k|si3Jyo+9tQ0?=3WuHf6^gi>BEqSuTuHkSP+~ z-mgIaPHpjJ@BC7ZKNRpZrvJ-?xy*ZiEesW;^v%{C&Rr$CFJ!Pt@?DdmN#6bKoZ)?8 zSMfH^n|!*p($OqZFJH37U}2{pWjsCkT3=dN>ZY3dQVhN0gCefiEWdkgy^2*5RI#L; zA4}bJc=mD@I3Z3y1BE0RzfpYZ<~gJ1#{xPXK(8G;8Mnm@>|js0t$S__F-q5DZ)m2F z(|fQRXmrNq_sx=Xy-ot0wfzzngweFlEnd>l&Djd$jZ)G2t*Ap?^q4iBhCfov*J@HM z*JNP4o*B%xIF5)~+Fl)Z$L%9N6Q)o1?1n;Sa|SWp=q+F{xU z9!qQmMqhqUL5=OKMKk-#ZA%WP#fHj4Yvg{AGq(u#HAf)wPt&mayJgNPq?!uYq5%{|9xoa0N736 zcmxw_A$k5#kf+<0JCF~gbanLga#y{z=#DnK-)qF`ZB{W6Aup5xc!E&F^WpKl1UweV z$0-I40Z~hW+a3Xhdx6z zrQ~_e8M~MZ!c$?@`I1N8#iuWK0qx5G`bkMKa)LZ?<-cY&|lH880Etd!0){c*N(P{$GfAD+drs(rff>ph`vX4!W9#fJpi8U2$KH`7J+ zPR0#REcO|gooN7B0$2)=h_Y*AT+9zXA<659+lxjr2xxz5W!0A4;y{y{<-pIH3+z8^ zy`r+TskCzhugX`bpi2hzl)DlHHByG zy2AK)6UBF*fvG3mT)W?Nir8j&$qdwyGPTQAAAhIE*kk#fI+t%sRZc4(_#EfTQ**q% z^R=1RG&9Zg+LV6p`BSd!jWA1a0YFl6IIbic8@&?61A=45*;^gOzSZ=PVyq zyt>m$KI7(FWyQSUX`NLYbt#Bb^$>qymh)N2Eafj2;#FR)pbdig0IHvu!`S^dZwo%9 zP%zp#$#w&rUmcXq9&}^02Z`j6>D$h_nWItgQ$|)+RZcEcVg#+)l!g3LNuo|utOxR>zOf3&e$bMkWmj`E8$WE}$Bf_P`>-%| zP=U}#56>_3q|_K18AUskOv&FNB#exVoZa)b#l^$pq_`>ZQZEJY>13+odY3yHSyzAyq+% z=)9CU#T75?#2_Rzp;7Hp!0xecmq$4``lj5+PkeM>6%s=(Zd&$ zBS6gHsXf^pO_3Mac=6*VOhY3k!E;v=5Y~evY_A~a^{Vtc+DR}j78Vw#zrWu9P7rkG zvKq?wA)Aq)@>Fr(TkQvYRR}=IoLI;!5;=S^rvW_XkPTE;9@$x*XE}tkw+l)1=1XF@2 z!bK1XdkTys1h?8bL2}z&4W^(=1!kT+er$KNVKJEN$?|KlFRkn2(9jTX3>NeL(7w^f z<$L-7q)jF)des_$tyJ>zI<3eH4-c1G5`XdHF%8Y1G4+N3{Qfj~s&Tiaob2D&Erkg0 zBzH#MKWmc*9Xf+u1a1}s*#N!oZ{9NVs&U&{HHgD1!Fvl05!B-`fF(s?=o?8fxfi+5 HUcLQ)s$P-W literal 0 HcmV?d00001 diff --git a/wasm-notebook/website/index.mec b/wasm-notebook/website/index.mec new file mode 100644 index 0000000..dfebc3d --- /dev/null +++ b/wasm-notebook/website/index.mec @@ -0,0 +1,14 @@ +# Mech Website + +## Homepage + +A one sentence description of the mech language + #mech-website/headline = "Mech is a language for developing data-driven, reactive systems like animations, games, and robots. It makes composing, transforming, and distributing data easy, allowing you to focus on the essential complexity of your work." + #mech-website/logo = "https://mech-lang.org/img/logo.png" + +This is where the drawing is added to the DOM + logo = [type: "img" class: "logo" contains: #mech-website/logo] + headline = [type: "div" class: "well" contains: #mech-website/headline] + container = [type: "div" class: "container" contains: [logo; headline; #robot]] + #app/main = [|root direction contains| + "mech-root" "column" [container]] \ No newline at end of file diff --git a/wasm-notebook/website/robot-drawing.mec b/wasm-notebook/website/robot-drawing.mec new file mode 100644 index 0000000..c136fd8 --- /dev/null +++ b/wasm-notebook/website/robot-drawing.mec @@ -0,0 +1,39 @@ +# Robot Arm Drawing + +## Logic + +Set up the parameters + #x = [400; 0; 0; 0; 0; 0] + #y = [450; 0; 0; 0; 0; 0] + #angle = [#slider1{4}{3}; #slider2{4}{3}; #slider3{4}{3}] + +Calculate the robot arm link coordiantes + i = 2:6 + j = math/floor(column: i / 2) + link-length = [53; 100; 85] + #x{i} := #x{i - 1} + link-length{j} * math/sin(degrees: #angle{j}) + #y{i} := #y{i - 1} - link-length{j} * math/cos(degrees: #angle{j}) + +## Layout + +Use the linkage coordinates to define image position and rotation + #robot-arm = [|shape parameters| + "image" [x: #x{4} y: #y{4} rotation: #angle{2} image: "https://mech-lang.org/img/robotarm/link2.png"] + "image" [x: #x{2} y: #y{2} rotation: #angle{1} image: "https://mech-lang.org/img/robotarm/link1.png"] + "image" [x: #x{1} y: #y{1} + 50 rotation: 0 image: "https://mech-lang.org/img/robotarm/link0.png"] + "image" [x: #x{6} y: #y{6} rotation: #angle{3} image: "https://mech-lang.org/img/robotarm/gripper.png"]] + +Embed arm link images in canvas + #drawing = [type: "canvas" class: _ contains: [#robot-arm] parameters: [width: 800 height: 650]] + +Animation controls + #slider1 = [type: "slider" class: _ contains: _ parameters: [min: -120 max: 120 value: -45]] + #slider2 = [type: "slider" class: _ contains: _ parameters: [min: -120 max: 120 value: 60]] + #slider3 = [type: "slider" class: _ contains: _ parameters: [min: -90 max: 200 value: 170]] + +Compose animation and controls + #robot-controls = [type: "div" class: _ contains: [#slider1; #slider2; #slider3]] + #robot-animation = [type: "div" class: _ contains: [#drawing]] + +Package for attachment into webpage + #robot = [#robot-controls; #robot-animation] \ No newline at end of file diff --git a/wasm-notebook/wstest.html b/wasm-notebook/wstest.html new file mode 100644 index 0000000..c3155ef --- /dev/null +++ b/wasm-notebook/wstest.html @@ -0,0 +1,190 @@ + + + + + + HTML5 Chat + + + +
+ +
+

HTML5 Chat

+
+ + + +
+ +
+ +
+ +

Not connected

+

Users connected: 0 +

+
    + +
    + + + +
    + + + + + + \ No newline at end of file From c50af016eb34ee04678b2c853fb433380de27b88 Mon Sep 17 00:00:00 2001 From: cmontella Date: Mon, 22 May 2023 21:09:43 -0400 Subject: [PATCH 66/84] Remove modules --- assets | 1 - docs | 1 - examples | 1 - src/core | 1 - src/program | 1 - src/syntax | 1 - src/utilities | 1 - src/wasm | 1 - 8 files changed, 8 deletions(-) delete mode 160000 assets delete mode 160000 docs delete mode 160000 examples delete mode 160000 src/core delete mode 160000 src/program delete mode 160000 src/syntax delete mode 160000 src/utilities delete mode 160000 src/wasm diff --git a/assets b/assets deleted file mode 160000 index bd630f5..0000000 --- a/assets +++ /dev/null @@ -1 +0,0 @@ -Subproject commit bd630f5fffa2c4afbe7ef27c7cc117061ca6ad0f diff --git a/docs b/docs deleted file mode 160000 index ce9016c..0000000 --- a/docs +++ /dev/null @@ -1 +0,0 @@ -Subproject commit ce9016cd202f47cea6fc47bb5f376fcd6d73139d diff --git a/examples b/examples deleted file mode 160000 index b84e5c0..0000000 --- a/examples +++ /dev/null @@ -1 +0,0 @@ -Subproject commit b84e5c0ad249565c2fc361ecdd4f53c6db18eea0 diff --git a/src/core b/src/core deleted file mode 160000 index ad92109..0000000 --- a/src/core +++ /dev/null @@ -1 +0,0 @@ -Subproject commit ad921091276129cbb761c6f0ed408a1e722b88ca diff --git a/src/program b/src/program deleted file mode 160000 index d5ed5a0..0000000 --- a/src/program +++ /dev/null @@ -1 +0,0 @@ -Subproject commit d5ed5a0845f00507310223e925b43e72dce5c262 diff --git a/src/syntax b/src/syntax deleted file mode 160000 index 21ac6fa..0000000 --- a/src/syntax +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 21ac6faf586c3c0bad2b576dee594a6ba82080d5 diff --git a/src/utilities b/src/utilities deleted file mode 160000 index 565189c..0000000 --- a/src/utilities +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 565189c3ee81e4c2003d3f66483bb822cf2a2bc9 diff --git a/src/wasm b/src/wasm deleted file mode 160000 index 6f4c2f5..0000000 --- a/src/wasm +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 6f4c2f5b07ef33581c1df44e6aa5189ee7542a44 From aa21968f62a06a5fb035073320c81e6fca140d67 Mon Sep 17 00:00:00 2001 From: cmontella Date: Mon, 22 May 2023 21:12:10 -0400 Subject: [PATCH 67/84] Add core --- src/core/Cargo.toml | 41 + src/core/LICENSE | 201 ++ src/core/README.md | 33 + src/core/benches/balls.rs | 233 ++ src/core/src/bin/main.rs | 288 ++ src/core/src/block.rs | 1180 +++++++++ src/core/src/capabilities.rs | 151 ++ src/core/src/column.rs | 762 ++++++ src/core/src/core.rs | 594 +++++ src/core/src/database.rs | 227 ++ src/core/src/error.rs | 76 + src/core/src/function/compare.rs | 824 ++++++ src/core/src/function/logic.rs | 324 +++ src/core/src/function/math.rs | 1219 +++++++++ src/core/src/function/math_update.rs | 328 +++ src/core/src/function/matrix.rs | 335 +++ src/core/src/function/mod.rs | 8 + src/core/src/function/set.rs | 233 ++ src/core/src/function/stats.rs | 560 ++++ src/core/src/function/table.rs | 3601 ++++++++++++++++++++++++++ src/core/src/lib.rs | 567 ++++ src/core/src/nodes.rs | 692 +++++ src/core/src/schedule.rs | 307 +++ src/core/src/table.rs | 773 ++++++ src/core/src/transformation.rs | 172 ++ src/core/src/user_functions.rs | 115 + src/core/src/value.rs | 324 +++ 27 files changed, 14168 insertions(+) create mode 100644 src/core/Cargo.toml create mode 100644 src/core/LICENSE create mode 100644 src/core/README.md create mode 100644 src/core/benches/balls.rs create mode 100644 src/core/src/bin/main.rs create mode 100644 src/core/src/block.rs create mode 100644 src/core/src/capabilities.rs create mode 100644 src/core/src/column.rs create mode 100644 src/core/src/core.rs create mode 100644 src/core/src/database.rs create mode 100644 src/core/src/error.rs create mode 100644 src/core/src/function/compare.rs create mode 100644 src/core/src/function/logic.rs create mode 100644 src/core/src/function/math.rs create mode 100644 src/core/src/function/math_update.rs create mode 100644 src/core/src/function/matrix.rs create mode 100644 src/core/src/function/mod.rs create mode 100644 src/core/src/function/set.rs create mode 100644 src/core/src/function/stats.rs create mode 100644 src/core/src/function/table.rs create mode 100644 src/core/src/lib.rs create mode 100644 src/core/src/nodes.rs create mode 100644 src/core/src/schedule.rs create mode 100644 src/core/src/table.rs create mode 100644 src/core/src/transformation.rs create mode 100644 src/core/src/user_functions.rs create mode 100644 src/core/src/value.rs diff --git a/src/core/Cargo.toml b/src/core/Cargo.toml new file mode 100644 index 0000000..7c09b85 --- /dev/null +++ b/src/core/Cargo.toml @@ -0,0 +1,41 @@ +[package] +name = "mech-core" +version = "0.1.0" +authors = ["Corey Montella "] +description = "The Mech language runtime. It's a small dataflow engine that accepts transactions of changes, and applies them to a compute network." +documentation = "http://docs.mech-lang.org" +homepage = "https://mech-lang.org" +repository = "https://github.com/mech-lang/core" +keywords = ["mech", "language", "programming", "dataflow", "runtime"] +categories = ["no-std", "science::robotics", "science", "game-engines", "database-implementations"] +license = "Apache-2.0" +readme = "README.md" +edition = "2021" + +[badges] +gitlab = { repository = "mech-lang/core", branch = "main" } +maintenance = { status = "actively-developed" } + +[features] +default = ["stdlib", "parallel"] +stdlib = ["time", "rand", "ed25519-dalek"] +parallel = ["rayon"] +no-std = ["rlibc"] + +[dependencies] +hashbrown = "0.13.1" +serde = {version = "1.0.152", default-features = false, features = ["alloc"] } +serde_derive = "1.0.152" +rlibc = { version = "=1.0", optional = true } +lazy_static = "1.4.0" +seahash = "4.1.0" +indexmap = "1.9.2" +rayon = {version = "1.6.1", optional = true} +time = {version = "0.3.17", optional = true} +ed25519-dalek = {version = "1.0.1", optional = true} +rand = {version = "0.7", optional = true} + +[dependencies.num-traits] +version = "0.2.15" +default-features = false +features = ["libm"] \ No newline at end of file diff --git a/src/core/LICENSE b/src/core/LICENSE new file mode 100644 index 0000000..41c00c9 --- /dev/null +++ b/src/core/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2018 Corey Montella + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/src/core/README.md b/src/core/README.md new file mode 100644 index 0000000..e46b242 --- /dev/null +++ b/src/core/README.md @@ -0,0 +1,33 @@ +

    + +

    + +Mech is a language for developing **data-driven**, **reactive** systems like robots, games, and animations. It makes **composing**, **transforming**, and **distributing** data easy, allowing you to focus on the essential complexity of your project. + +You can try Mech online at [https://mech-lang.org/try](https://mech-lang.org/try). + +Usage and installation instructions can be found in the [documentation](https://mech-lang.org/#/docs/index.mec) or the [main Mech repository](https://github.com/mech-lang/mech). + +Be sure to follow our [blog](https://mech-lang.org/blog/)([RSS](https://mech-lang.org/feed.xml))! + +# Core + +The language runtime. It's a small dataflow engine that accepts transactions of changes, and applies them to a compute network. + +## Contents + +- **block** - defines a `Block`, which is the ubiquitous unit of code in Mech. A block is comprised of transformations on input tables. These transformations can either modify existing tables or create new tables. +- **table** - defines a `Table`, the core data structure of Mech. A table is a 2D array of values. +- **column** - defines a `Column`, which is a vector of values. +- **value** - defines a `Value`, a unified datatype for Mech. A value can be empty, a boolean, a string, a reference to another table, a number literal. +- **database** - defines a `Database` of tables. Databases accept `Transactions`, which are sets of `Changes` to the database. +- **function** - defines the standard library for Mech, including basic indexing, mathematical, comparison, and logic functions. +- **error** - defines an `MechError`, which holds the information necessary to track and render error messages. + +## Project Status + +Mech is currently in the **beta** stage of development. This means that the language is at a suitable stage for a wider audience. While most language feature implementations are started, none are finished, and some new features may, while others could be removed. Backwards and forwards compatibility of Mech programs is not guaranteed at this time. + +## License + +Apache 2.0 diff --git a/src/core/benches/balls.rs b/src/core/benches/balls.rs new file mode 100644 index 0000000..10bb795 --- /dev/null +++ b/src/core/benches/balls.rs @@ -0,0 +1,233 @@ +#![allow(warnings)] +#![feature(iter_intersperse)] + +#![feature(test)] +#![feature(get_mut_unchecked)] + +extern crate test; + +use test::Bencher; + +use std::sync::Arc; +use std::cell::RefCell; +use std::fmt; +use std::ptr; +use std::rc::Rc; +use hashbrown::{HashMap, HashSet}; + +use rayon::prelude::*; +use std::collections::VecDeque; +use std::thread; +use mech_core::*; +use mech_core::function::table; + +use std::fmt::*; +use num_traits::*; +use std::ops::*; + +#[bench] +fn bouncing_balls(b:&mut Bencher){ + + let n = 1e6 as usize; + + let sizes: Vec = vec![1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7].iter().map(|x| *x as usize).collect(); + + // Create a core + let mut core = Core::new(); + + { + // #time/timer += [period: 60Hz] + let mut time_timer = Table::new(hash_str("time/timer"),1,2); + time_timer.set_col_kind(0,ValueKind::f32); + time_timer.set_col_kind(1,ValueKind::f32); + time_timer.set_raw(0,0,Value::f32(60.0)); + core.insert_table(time_timer); + + // #gravity = 1 + let mut gravity = Table::new(hash_str("gravity"),1,1); + gravity.set_col_kind(0,ValueKind::f32); + gravity.set_raw(0,0,Value::f32(1.0)); + core.insert_table(gravity); + + // -80% + let mut const1 = Table::new(hash_str("-0.8"),1,1); + const1.set_col_kind(0,ValueKind::f32); + const1.set_raw(0,0,Value::f32(-0.8)); + core.insert_table(const1); + + // 500 + let mut const2 = Table::new(hash_str("500.0"),1,1); + const2.set_col_kind(0,ValueKind::f32); + const2.set_raw(0,0,Value::f32(500.0)); + core.insert_table(const2); + + // 0 + let mut const3 = Table::new(hash_str("0.0"),1,1); + const3.set_col_kind(0,ValueKind::f32); + const3.set_raw(0,0,Value::f32(0.0)); + core.insert_table(const3); + + // Create balls + // #balls = [x: 0:n y: 0:n vx: 3.0 vy: 4.0] + let mut balls = Table::new(hash_str("balls"),n,4); + balls.set_col_kind(0,ValueKind::f32); + balls.set_col_kind(1,ValueKind::f32); + balls.set_col_kind(2,ValueKind::f32); + balls.set_col_kind(3,ValueKind::f32); + for i in 0..n { + balls.set_raw(i,0,Value::f32(i as f32)); + balls.set_raw(i,1,Value::f32(i as f32)); + balls.set_raw(i,2,Value::f32(3.0)); + balls.set_raw(i,3,Value::f32(4.0)); + } + core.insert_table(balls); + } + + // Table + let (x,y,vx,vy) = { + match core.get_table_by_id(hash_str("balls")) { + Ok(balls_rc) => { + let balls = balls_rc.borrow(); + (balls.get_column_unchecked(0), + balls.get_column_unchecked(1), + balls.get_column_unchecked(2), + balls.get_column_unchecked(3)) + } + _ => std::process::exit(1), + } + }; + + let g = { + match core.get_table_by_id(hash_str("gravity")) { + Ok(gravity_rc) => { + let gravity = gravity_rc.borrow(); + gravity.get_column_unchecked(0) + } + _ => std::process::exit(1), + } + }; + + let c1 = { + match core.get_table_by_id(hash_str("-0.8")) { + Ok(const1_rc) => { + let const1 = const1_rc.borrow(); + const1.get_column_unchecked(0) + } + _ => std::process::exit(1), + } + }; + + let c500 = { + match core.get_table_by_id(hash_str("500.0")) { + Ok(const1_rc) => { + let const1 = const1_rc.borrow(); + const1.get_column_unchecked(0) + } + _ => std::process::exit(1), + } + }; + + let c0 = { + match core.get_table_by_id(hash_str("0.0")) { + Ok(const1_rc) => { + let const1 = const1_rc.borrow(); + const1.get_column_unchecked(0) + } + _ => std::process::exit(1), + } + }; + + // Temp Vars + let mut vy2 = Column::f32(ColumnV::new(vec![0.0; n])); + let mut iy = Column::Bool(ColumnV::new((vec![false; n]))); + let mut iyy = Column::Bool(ColumnV::new((vec![false; n]))); + let mut iy_or = Column::Bool(ColumnV::new((vec![false; n]))); + let mut ix = Column::Bool(ColumnV::new((vec![false; n]))); + let mut ixx = Column::Bool(ColumnV::new((vec![false; n]))); + let mut ix_or = Column::Bool(ColumnV::new((vec![false; n]))); + let mut vx2 = Column::f32(ColumnV::new((vec![0.0; n]))); + + // Update the block positions on each tick of the timer + let mut block1 = Block::new(); + block1.add_tfm(Transformation::NewTable{table_id: TableId::Local(hash_str("block1")), rows: 1, columns: 1}); + block1.triggers.insert((TableId::Global(hash_str("time/timer")),RegisterIndex::All,RegisterIndex::All)); + block1.input.insert((TableId::Global(hash_str("gravity")),RegisterIndex::All,RegisterIndex::All)); + block1.input.insert((TableId::Global(hash_str("ball")),RegisterIndex::All,RegisterIndex::All)); + block1.output.insert((TableId::Global(hash_str("ball")),RegisterIndex::All,RegisterIndex::All)); + match (&x,&vx,&y,&vy,&g) { + (Column::f32(x),Column::f32(vx),Column::f32(y),Column::f32(vy),Column::f32(g)) => { + // #ball.x := #ball.x + #ball.vx + block1.plan.push(math::ParAddVVIP{out: x.clone(), arg: vx.clone()}); + // #ball.y := #ball.y + #ball.vy + block1.plan.push(math::ParAddVVIP{out: y.clone(), arg: vy.clone()}); + // #ball.vy := #ball.vy + #gravity + block1.plan.push(math::ParAddVSIP{out: vy.clone(), arg: g.clone()}); + } + _ => (), + } + + // Keep the balls within the boundary height + let mut block2 = Block::new(); + block2.add_tfm(Transformation::NewTable{table_id: TableId::Local(hash_str("block2")), rows: 1, columns: 1}); + block2.triggers.insert((TableId::Global(hash_str("time/timer")),RegisterIndex::All,RegisterIndex::All)); + block2.input.insert((TableId::Global(hash_str("ball")),RegisterIndex::All,RegisterIndex::All)); + block2.output.insert((TableId::Global(hash_str("ball")),RegisterIndex::All,RegisterIndex::All)); + match (&y,&iy,&iyy,&iy_or,&c1,&vy2,&vy,&c500,&c0) { + (Column::f32(y),Column::Bool(iy),Column::Bool(iyy),Column::Bool(iy_or),Column::f32(c1),Column::f32(vy2),Column::f32(vy),Column::f32(m500),Column::f32(m0)) => { + // iy = #ball.y > #boundary.height + block2.plan.push(compare::ParGreaterVS{lhs: (y.clone(),0,y.len()-1), rhs: (m500.clone(),0,0), out: iy.clone()}); + // iyy = #ball.y < 0 + block2.plan.push(compare::ParLessVS{lhs: (y.clone(),0,y.len()-1), rhs: (m0.clone(),0,0), out: iyy.clone()}); + // #ball.y{iy} := #boundary.height + block2.plan.push(table::ParSetVSB{arg: m500.clone(), ix: 0, out: y.clone(), oix: iy.clone()}); + // #ball.vy{iy | iyy} := #ball.vy * -80% + block2.plan.push(logic::ParOrVV{lhs: iy.clone(), rhs: iyy.clone(), out: iy_or.clone()}); + block2.plan.push(math::ParMulVS{lhs: vy.clone(), rhs: c1.clone(), out: vy2.clone()}); + block2.plan.push(table::ParSetVVB{arg: vy2.clone(), out: vy.clone(), oix: iy_or.clone()}); + } + _ => (), + } + + // Keep the balls within the boundary width + let mut block3 = Block::new(); + block3.add_tfm(Transformation::NewTable{table_id: TableId::Local(hash_str("block3")), rows: 1, columns: 1}); + block3.triggers.insert((TableId::Global(hash_str("time/timer")),RegisterIndex::All,RegisterIndex::All)); + block3.input.insert((TableId::Global(hash_str("ball")),RegisterIndex::All,RegisterIndex::All)); + block3.output.insert((TableId::Global(hash_str("ball")),RegisterIndex::All,RegisterIndex::All)); + match (&x,&ix,&ixx,&ix_or,&vx,&c1,&vx2,&c500,&c0) { + (Column::f32(x),Column::Bool(ix),Column::Bool(ixx),Column::Bool(ix_or),Column::f32(vx),Column::f32(c1),Column::f32(vx2),Column::f32(m500),Column::f32(m0)) => { + // ix = #ball.x > #boundary.width + block3.plan.push(compare::ParGreaterVS{lhs: (x.clone(),0,x.len()-1), rhs: (m500.clone(),0,0), out: ix.clone()}); + // ixx = #ball.x < 0 + block3.plan.push(compare::ParLessVS{lhs: (x.clone(),0,x.len()-1), rhs: (m0.clone(),0,0), out: ixx.clone()}); + // #ball.x{ix} := #boundary.width + block3.plan.push(table::ParSetVSB{arg: m500.clone(), ix: 0, out: x.clone(), oix: ix.clone()}); + // #ball.vx{ix | ixx} := #ball.vx * -80% + block3.plan.push(logic::ParOrVV{lhs: ix.clone(), rhs: ixx.clone(), out: ix_or.clone()}); + block3.plan.push(math::ParMulVS{lhs: vx.clone(), rhs: c1.clone(), out: vx2.clone()}); + block3.plan.push(table::ParSetVVB{arg: vx2.clone(), out: vx.clone(), oix: ix_or.clone()}); + } + _ => (), + } + + //println!("{:?}", block1); + let block1_ref = Rc::new(RefCell::new(block1)); + core.load_block(block1_ref.clone()); + + //println!("{:?}", block2); + let block2_ref = Rc::new(RefCell::new(block2)); + core.load_block(block2_ref.clone()); + + //println!("{:?}", block3); + let block3_ref = Rc::new(RefCell::new(block3)); + core.load_block(block3_ref.clone()); + + core.schedule_blocks(); + + let txn = vec![Change::Set((hash_str("time/timer"), + vec![(TableIndex::Index(1), TableIndex::Index(2), Value::f32(1.0))]))]; + + b.iter(|| { + core.process_transaction(&txn); + }); +} \ No newline at end of file diff --git a/src/core/src/bin/main.rs b/src/core/src/bin/main.rs new file mode 100644 index 0000000..3074446 --- /dev/null +++ b/src/core/src/bin/main.rs @@ -0,0 +1,288 @@ +#![allow(warnings)] +#![feature(iter_intersperse)] +// New runtime +// requirements: +// pass all tests +// robust units +// all number types +// Unicode +// async blocks +// parallel operators +// rewind capability +// pre-serialized memory layout +// performance target: 10 million updates per 60Hz cycle +// stack allocated tables +// matrix library in std + +use std::sync::Arc; +use std::cell::RefCell; +use std::fmt; +use std::ptr; +use std::rc::Rc; +use hashbrown::{HashMap, HashSet}; +use std::time::{Instant}; + +use std::collections::VecDeque; +use mech_core::*; +use mech_core::function::table; + +use std::fmt::*; +use num_traits::*; +use std::ops::*; +extern crate time; + +fn main() -> std::result::Result<(),MechError> { + + //let now = Instant::now(); + let n = 1e7 as usize; + + let sizes: Vec = vec![1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7].iter().map(|x| *x as usize).collect(); + + // Create a core + let mut core = Core::new(); + + { + // #time/timer += [period: 60Hz] + let mut time_timer = Table::new(hash_str("time/timer"),1,2); + time_timer.set_col_kind(0,ValueKind::f32); + time_timer.set_col_kind(1,ValueKind::f32); + time_timer.set_raw(0,0,Value::f32(60.0)); + core.insert_table(time_timer); + + // #gravity = 1 + let mut gravity = Table::new(hash_str("gravity"),1,1); + gravity.set_col_kind(0,ValueKind::f32); + gravity.set_raw(0,0,Value::f32(1.0)); + core.insert_table(gravity); + + // -80% + let mut const1 = Table::new(hash_str("-0.8"),1,1); + const1.set_col_kind(0,ValueKind::f32); + const1.set_raw(0,0,Value::f32(-0.8)); + core.insert_table(const1); + + // 500 + let mut const2 = Table::new(hash_str("500.0"),1,1); + const2.set_col_kind(0,ValueKind::f32); + const2.set_raw(0,0,Value::f32(500.0)); + core.insert_table(const2); + + // 0 + let mut const3 = Table::new(hash_str("0.0"),1,1); + const3.set_col_kind(0,ValueKind::f32); + const3.set_raw(0,0,Value::f32(0.0)); + core.insert_table(const3); + + // Create balls + // #balls = [x: 0:n y: 0:n vx: 3.0 vy: 4.0] + let mut balls = Table::new(hash_str("balls"),n,4); + balls.set_col_kind(0,ValueKind::f32); + balls.set_col_kind(1,ValueKind::f32); + balls.set_col_kind(2,ValueKind::f32); + balls.set_col_kind(3,ValueKind::f32); + for i in 0..n { + balls.set_raw(i,0,Value::f32(i as f32)); + balls.set_raw(i,1,Value::f32(i as f32)); + balls.set_raw(i,2,Value::f32(3.0)); + balls.set_raw(i,3,Value::f32(4.0)); + } + core.insert_table(balls); + } + + // Table + let (x,y,vx,vy) = { + match core.get_table_by_id(hash_str("balls")) { + Ok(balls_rc) => { + let balls = balls_rc.borrow(); + (balls.get_column_unchecked(0), + balls.get_column_unchecked(1), + balls.get_column_unchecked(2), + balls.get_column_unchecked(3)) + } + _ => std::process::exit(1), + } + }; + + let g = { + match core.get_table_by_id(hash_str("gravity")) { + Ok(gravity_rc) => { + let gravity = gravity_rc.borrow(); + gravity.get_column_unchecked(0) + } + _ => std::process::exit(1), + } + }; + + let c1 = { + match core.get_table_by_id(hash_str("-0.8")) { + Ok(const1_rc) => { + let const1 = const1_rc.borrow(); + const1.get_column_unchecked(0) + } + _ => std::process::exit(1), + } + }; + + let c500 = { + match core.get_table_by_id(hash_str("500.0")) { + Ok(const1_rc) => { + let const1 = const1_rc.borrow(); + const1.get_column_unchecked(0) + } + _ => std::process::exit(1), + } + }; + + let c0 = { + match core.get_table_by_id(hash_str("0.0")) { + Ok(const1_rc) => { + let const1 = const1_rc.borrow(); + const1.get_column_unchecked(0) + } + _ => std::process::exit(1), + } + }; + + // Temp Vars + let mut vy2 = Column::f32(ColumnV::new(vec![0.0; n])); + let mut iy = Column::Bool(ColumnV::new((vec![false; n]))); + let mut iyy = Column::Bool(ColumnV::new((vec![false; n]))); + let mut iy_or = Column::Bool(ColumnV::new((vec![false; n]))); + let mut ix = Column::Bool(ColumnV::new((vec![false; n]))); + let mut ixx = Column::Bool(ColumnV::new((vec![false; n]))); + let mut ix_or = Column::Bool(ColumnV::new((vec![false; n]))); + let mut vx2 = Column::f32(ColumnV::new((vec![0.0; n]))); + + // Update the block positions on each tick of the timer + let mut block1 = Block::new(); + block1.add_tfm(Transformation::NewTable{table_id: TableId::Local(hash_str("block1")), rows: 1, columns: 1}); + block1.triggers.insert((TableId::Global(hash_str("time/timer")),RegisterIndex::All,RegisterIndex::All)); + block1.input.insert((TableId::Global(hash_str("gravity")),RegisterIndex::All,RegisterIndex::All)); + block1.input.insert((TableId::Global(hash_str("ball")),RegisterIndex::All,RegisterIndex::All)); + block1.output.insert((TableId::Global(hash_str("ball")),RegisterIndex::All,RegisterIndex::All)); + match (&x,&vx,&y,&vy,&g) { + (Column::f32(x),Column::f32(vx),Column::f32(y),Column::f32(vy),Column::f32(g)) => { + // #ball.x := #ball.x + #ball.vx + block1.plan.push(math::ParAddVVIP{out: x.clone(), arg: vx.clone()}); + // #ball.y := #ball.y + #ball.vy + block1.plan.push(math::ParAddVVIP{out: y.clone(), arg: vy.clone()}); + // #ball.vy := #ball.vy + #gravity + block1.plan.push(math::ParAddVSIP{out: vy.clone(), arg: g.clone()}); + } + _ => (), + } + + // Keep the balls within the boundary height + let mut block2 = Block::new(); + block2.add_tfm(Transformation::NewTable{table_id: TableId::Local(hash_str("block2")), rows: 1, columns: 1}); + block2.triggers.insert((TableId::Global(hash_str("time/timer")),RegisterIndex::All,RegisterIndex::All)); + block2.input.insert((TableId::Global(hash_str("ball")),RegisterIndex::All,RegisterIndex::All)); + block2.output.insert((TableId::Global(hash_str("ball")),RegisterIndex::All,RegisterIndex::All)); + match (&y,&iy,&iyy,&iy_or,&c1,&vy2,&vy,&c500,&c0) { + (Column::f32(y),Column::Bool(iy),Column::Bool(iyy),Column::Bool(iy_or),Column::f32(c1),Column::f32(vy2),Column::f32(vy),Column::f32(m500),Column::f32(m0)) => { + // iy = #ball.y > #boundary.height + block2.plan.push(compare::ParGreaterVS{lhs: (y.clone(),0,y.len()-1), rhs: (m500.clone(),0,0), out: iy.clone()}); + // iyy = #ball.y < 0 + block2.plan.push(compare::ParLessVS{lhs: (y.clone(),0,y.len()-1), rhs: (m0.clone(),0,0), out: iyy.clone()}); + // #ball.y{iy} := #boundary.height + block2.plan.push(table::ParSetVSB{arg: m500.clone(), ix: 0, out: y.clone(), oix: iy.clone()}); + // #ball.vy{iy | iyy} := #ball.vy * -80% + block2.plan.push(logic::ParOrVV{lhs: iy.clone(), rhs: iyy.clone(), out: iy_or.clone()}); + block2.plan.push(math::ParMulVS{lhs: vy.clone(), rhs: c1.clone(), out: vy2.clone()}); + block2.plan.push(table::ParSetVVB{arg: vy2.clone(), out: vy.clone(), oix: iy_or.clone()}); + } + _ => (), + } + + // Keep the balls within the boundary width + let mut block3 = Block::new(); + block3.add_tfm(Transformation::NewTable{table_id: TableId::Local(hash_str("block3")), rows: 1, columns: 1}); + block3.triggers.insert((TableId::Global(hash_str("time/timer")),RegisterIndex::All,RegisterIndex::All)); + block3.input.insert((TableId::Global(hash_str("ball")),RegisterIndex::All,RegisterIndex::All)); + block3.output.insert((TableId::Global(hash_str("ball")),RegisterIndex::All,RegisterIndex::All)); + match (&x,&ix,&ixx,&ix_or,&vx,&c1,&vx2,&c500,&c0) { + (Column::f32(x),Column::Bool(ix),Column::Bool(ixx),Column::Bool(ix_or),Column::f32(vx),Column::f32(c1),Column::f32(vx2),Column::f32(m500),Column::f32(m0)) => { + // ix = #ball.x > #boundary.width + block3.plan.push(compare::ParGreaterVS{lhs: (x.clone(),0,x.len()-1), rhs: (m500.clone(),0,0), out: ix.clone()}); + // ixx = #ball.x < 0 + block3.plan.push(compare::ParLessVS{lhs: (x.clone(),0,x.len()-1), rhs: (m0.clone(),0,0), out: ixx.clone()}); + // #ball.x{ix} := #boundary.width + block3.plan.push(table::ParSetVSB{arg: m500.clone(), ix: 0, out: x.clone(), oix: ix.clone()}); + // #ball.vx{ix | ixx} := #ball.vx * -80% + block3.plan.push(logic::ParOrVV{lhs: ix.clone(), rhs: ixx.clone(), out: ix_or.clone()}); + block3.plan.push(math::ParMulVS{lhs: vx.clone(), rhs: c1.clone(), out: vx2.clone()}); + block3.plan.push(table::ParSetVVB{arg: vx2.clone(), out: vx.clone(), oix: ix_or.clone()}); + } + _ => (), + } + + //println!("{:?}", block1); + let block1_ref = Rc::new(RefCell::new(block1)); + core.load_block(block1_ref.clone()); + + //println!("{:?}", block2); + let block2_ref = Rc::new(RefCell::new(block2)); + core.load_block(block2_ref.clone()); + + //println!("{:?}", block3); + let block3_ref = Rc::new(RefCell::new(block3)); + core.load_block(block3_ref.clone()); + + core.schedule_blocks(); + + let mut x: Vec = vec![10.0;n]; + let mut y: Vec = vec![10.0;n]; + let mut vx: Vec = vec![1.0;n]; + let mut vy: Vec = vec![1.0;n]; + let gravity: f32 = 1.0; + + //println!("{:?}", core); + + let mut total_time = VecDeque::new(); + for i in 0..50000 { + let txn = vec![Change::Set((hash_str("time/timer"), + vec![(TableIndex::Index(1), TableIndex::Index(2), Value::f32(i as f32))]))]; + + let now = Instant::now(); + /*for i in 0..n { + x[i] = x[i] + vx[i]; + y[i] = y[i] + vy[i]; + vy[i] = vy[i] + gravity; + if x[i] > 500.0 { + x[i] = 500.0; + vx[i] = vx[i] * -0.8; + } + if x[i] < 0.0 { + x[i] = 0.0; + vx[i] = vx[i] * -0.8; + } + if y[i] < 0.0 { + y[i] = 0.0; + vy[i] = vy[i] * -0.8; + } + if y[i] > 500.0 { + y[i] = 500.0; + vy[i] = vy[i] * -0.8; + } + }*/ + core.process_transaction(&txn)?; + let elapsed_time = now.elapsed(); + + let cycle_duration = elapsed_time.as_nanos() as f64; + total_time.push_back(cycle_duration); + if total_time.len() > 1000 { + total_time.pop_front(); + } + let average_time: f64 = total_time.iter().sum::() / total_time.len() as f64; + //println!("{:e} - {:0.2?}Hz", n, 1.0 / (average_time / 1_000_000_000.0)); + println!("{:e} - {:0.2?}Hz", n, 1.0 / (cycle_duration / 1_000_000_000.0)); + } + + //let average_time: f32 = total_time.iter().sum::() / total_time.len() as f32; + //println!("{:e} - {:0.2?}Hz", n, 1.0 / (average_time / 1_000_000_000.0)); + // let time = (end_ns0 - start_ns0) as f32; + //println!("{:0.4?} s", time / 1e9); + //println!("{:?}", core); + + Ok(()) +} \ No newline at end of file diff --git a/src/core/src/block.rs b/src/core/src/block.rs new file mode 100644 index 0000000..77908ef --- /dev/null +++ b/src/core/src/block.rs @@ -0,0 +1,1180 @@ +// # Block + +// Blocks are the ubiquitous unit of code in a Mech program. Users do not write functions in Mech, as in +// other languages. Blocks consist of a number of "Transforms" that read values from tables and reshape +// them or perform computations on them. Blocks can be thought of as pure functions where the input and +// output are tables. Blocks have their own internal table store. Local tables can be defined within a +// block, which allows the programmer to break a computation down into steps. The result of the computation +// is then output to one or more global tables, which triggers the execution of other blocks in the network. + +// ## Prelude + +use crate::*; +#[cfg(feature = "stdlib")] +use crate::function::{ + table::*, + math::*, + math_update::*, +}; +use std::cell::RefCell; +use std::rc::Rc; +use hashbrown::{HashMap, HashSet}; +use std::fmt; +use serde::Serialize; +use std::mem::transmute; +use std::convert::TryInto; + +lazy_static! { + pub static ref cF32L: u64 = hash_str("f32-literal"); + pub static ref cF32: u64 = hash_str("f32"); + pub static ref cF64: u64 = hash_str("f64"); + pub static ref cU8: u64 = hash_str("u8"); + pub static ref cU16: u64 = hash_str("u16"); + pub static ref cU32: u64 = hash_str("u32"); + pub static ref cU64: u64 = hash_str("u64"); + pub static ref cU128: u64 = hash_str("u128"); + pub static ref cI8: u64 = hash_str("i8"); + pub static ref cI16: u64 = hash_str("i16"); + pub static ref cI32: u64 = hash_str("i32"); + pub static ref cI64: u64 = hash_str("i64"); + pub static ref cI128: u64 = hash_str("i128"); + pub static ref cHZ: u64 = hash_str("hz"); + pub static ref cMS: u64 = hash_str("ms"); + pub static ref cS: u64 = hash_str("s"); + pub static ref cM: u64 = hash_str("m"); + pub static ref cM_S: u64 = hash_str("m/s"); + pub static ref cKM: u64 = hash_str("km"); + pub static ref cHEX: u64 = hash_str("hex"); + pub static ref cDEC: u64 = hash_str("dec"); + pub static ref cSTRING: u64 = hash_str("string"); + pub static ref cBOOL: u64 = hash_str("bool"); + pub static ref cANY: u64 = hash_str("_"); +} + +/* +Defines a Plan struct which represents a sequence of Mech functions to be +executed in a specific order. It provides methods for manipulating and +executing the plan, such as adding new functions to the plan and solving the +plan by iterating over each function in order. The Plan struct is designed to +help organize and execute functions in a predictable and controlled manner, +making it easier to reason about program behavior. +*/ + +#[derive(Clone)] +pub struct Plan{ + pub plan: Vec> +} + +impl Plan { + pub fn new () -> Plan { + Plan { + plan: Vec::new(), + } + } + pub fn push(&mut self, mut fxn: S) { + fxn.solve(); + self.plan.push(Rc::new(fxn)); + } + + pub fn solve(&self) { + for fxn in &self.plan { + fxn.solve(); + } + } + +} + +impl fmt::Debug for Plan { + #[inline] + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + let mut plan = BoxPrinter::new(); + let mut ix = 1; + for step in &self.plan { + plan.add_title("🦿",&format!("Step {}", ix)); + plan.add_line(format!("{}",&step.to_string())); + ix += 1; + } + write!(f,"{:?}",plan)?; + Ok(()) + } +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub enum BlockState { + New, // Has just been created, but has not been tested for satisfaction + Ready, // All inputs are satisfied and the block is ready to execute + Done, // All inputs are satisfied and the block has executed + Unsatisfied, // One or more inputs are not satisfied + Error, // One or more errors exist on the block + Pending, // THe block is currently solving and the state is not settled + Disabled, // The block is disabled will not execute if it otherwise would +} + +// ## Block + +/* +Defines the Block, which represents a single unit of computation in Mech. Block instances are created and managed by the Core. When a Mech program is executed, the Core creates a set of Block instances based on the program's source, and schedules those blocks to execute based on their data dependencies. When a block writes data to a table, it can trigger other blocks to execute based on their dependencies. These dependencies are managed by the Core, which tracks which blocks read from and write to which tables, and schedules their execution accordingly. The Core then manages the execution of these Block instances, ensuring that each Block receives input when needed and produces output as expected. + +This dataflow architecture means that each block operates independently, reading data from tables and producing output as necessary. This allows for a high degree of concurrency and makes it easier to reason about program behavior. At the same time, the Core ensures that the program as a whole is executed correctly by coordinating the interactions between the various blocks and tables. +*/ + +#[derive(Clone)] +pub struct Block { + pub id: BlockId, + pub ast: nodes::AstNode, + pub state: BlockState, + pub tables: Database, + pub plan: Plan, + pub functions: Option>>, + pub user_functions: Option>>>, + pub global_database: Rc>, + pub unsatisfied_transformation: Option<(MechError,Transformation)>, + pub pending_transformations: Vec, + pub pending_global_tables: HashMap, + pub transformations: Vec, + pub defined_tables: HashSet<(TableId,RegisterIndex,RegisterIndex)>, + pub required_functions: HashSet, + pub strings: StringDictionary, + pub triggers: HashSet<(TableId,RegisterIndex,RegisterIndex)>, + pub input: HashSet<(TableId,RegisterIndex,RegisterIndex)>, + pub output: HashSet<(TableId,RegisterIndex,RegisterIndex)>, + pub dynamic_tables: HashSet<(TableId,RegisterIndex,RegisterIndex)>, +} + +impl Block { + pub fn new() -> Block { + Block { + id: 0, + ast: nodes::AstNode::Null, + state: BlockState::New, + tables: Database::new(), + plan: Plan::new(), + functions: None, + user_functions: None, + required_functions: HashSet::new(), + global_database: Rc::new(RefCell::new(Database::new())), + unsatisfied_transformation: None, + pending_transformations: Vec::new(), + pending_global_tables: HashMap::new(), + defined_tables: HashSet::new(), + transformations: Vec::new(), + strings: Rc::new(RefCell::new(HashMap::new())), + triggers: HashSet::new(), + input: HashSet::new(), + output: HashSet::new(), + dynamic_tables: HashSet::new(), + } + } + + pub fn get_table(&self, table_id: &TableId) -> Result>, MechError> { + match &table_id { + TableId::Local(id) => match self.tables.get_table_by_id(id) { + Some(table) => Ok(table.clone()), + None => { + match self.tables.table_alias_to_id.get(table_id.unwrap()) { + Some(TableId::Global(id)) => match self.global_database.borrow().get_table_by_id(id) { + Some(table) => Ok(table.clone()), + None => { + let table_name: String = self.strings.borrow().get(table_id.unwrap()).unwrap().to_string(); + Err(MechError{msg: table_name, id: 2101, kind: MechErrorKind::MissingTable(*table_id)}) + } + } + Some(TableId::Local(id)) => match self.tables.get_table_by_id(id) { + Some(table) => Ok(table.clone()), + None => { + let table_name: String = self.strings.borrow().get(table_id.unwrap()).unwrap().to_string(); + Err(MechError{msg: table_name, id: 2102, kind: MechErrorKind::MissingTable(*table_id)}) + } + } + None => { + let table_name: String = match self.strings.borrow().get(table_id.unwrap()) { + Some(table_name) => table_name.to_string(), + None => humanize(table_id.unwrap()), + }; + Err(MechError{msg: table_name, id: 2103, kind: MechErrorKind::MissingTable(*table_id)}) + } + } + }, + }, + TableId::Global(id) => match self.global_database.borrow().get_table_by_id(id) { + Some(table) => Ok(table.clone()), + None => { + match self.pending_global_tables.get(id) { + Some(table) => Ok(table.clone()), + None => { + let table_name: String = self.strings.borrow().get(table_id.unwrap()).unwrap().to_string(); + Err(MechError{msg: table_name, id: 2104, kind: MechErrorKind::MissingTable(*table_id)}) + } + } + } + } + } + } + + pub fn gen_id(&mut self) -> BlockId { + self.id = hash_str(&format!("{:?}",self.transformations)); + self.id + } + + pub fn id(&self) -> BlockId { + self.id + } + + // Clear everything and recompile it all + pub fn recompile(&mut self) -> Result<(),MechError> { + let tfms = self.transformations.clone(); + self.transformations.clear(); + self.plan = Plan::new(); + self.tables.clear(); + for tfm in tfms { + self.compile_tfm(tfm)?; + } + Ok(()) + } + + pub fn ready(&mut self) -> Result<(),MechError> { + match self.state { + // If the state is ready, we are good. + BlockState::Ready => Ok(()), + // If the block is disable that'd the end of it + BlockState::Disabled => Err(MechError{msg: "".to_string(), id: 2144, kind: MechErrorKind::BlockDisabled}), + // Other + BlockState::New | BlockState::Done | BlockState::Unsatisfied | BlockState::Error | + BlockState::Pending => { + match &self.unsatisfied_transformation { + Some((_,tfm)) => { + self.state = BlockState::Pending; + match self.add_tfm(tfm.clone()) { + Ok(_) => { + self.unsatisfied_transformation = None; + let mut pending_transformations = self.pending_transformations.clone(); + self.pending_transformations.clear(); + for tfm in pending_transformations.drain(..) { + self.add_tfm(tfm); + } + self.ready() + } + Err(x) => { + Err(x) + }, + } + } + None => { + self.state = BlockState::Ready; + for (_,table_ref) in self.pending_global_tables.drain() { + self.global_database.borrow_mut().insert_table_ref(table_ref); + } + Ok(()) + } + } + } + } + } + + pub fn get_arg_column(&self, argument: &Argument) -> Result<(u64,Column,ColumnIndex),MechError> { + + let (arg_name, table_id, indices) = argument; + + // This part handles multi-dimensional indexing e.g. {1,2}{3,4}{5,6} + let mut table_id = *table_id; + for (row,column) in indices.iter().take(indices.len()-1) { + let argument = (0,table_id,vec![(row.clone(),column.clone())]); + match self.get_arg_dim(&argument)? { + TableShape::Scalar => { + let arg_col = self.get_arg_column(&argument)?; + match (arg_col,row,column) { + ((_,Column::Ref(ref_col),ColumnIndex::Index(row)),_,TableIndex::None) => { + table_id = ref_col.borrow()[row].clone(); + } + ((_,Column::Ref(ref_col),_),TableIndex::Index(row_ix),_) => { + table_id = ref_col.borrow()[row_ix-1].clone(); + } + ((_,Column::Ref(ref_col),_),_,_) => { + table_id = ref_col.borrow()[0].clone(); + } + x => {return Err(MechError{msg: "".to_string(), id: 2105, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + x => {return Err(MechError{msg: "".to_string(), id: 2106, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + + // get the table + let (row,col) = &indices.last().unwrap(); + let table = self.get_table(&table_id)?; + let table_brrw = table.borrow(); + + // Get the column and row + match (row,col) { + // Return an error if either index is 0. An index can never be zero + (_,TableIndex::Index(ix)) | + (TableIndex::Index(ix),_) if ix == &0 => { + return Err(MechError{msg: "".to_string(), id: 2107, kind: MechErrorKind::ZeroIndex}); + } + // x{1,1} + (TableIndex::Index(row),TableIndex::Index(_)) => { + let col = table_brrw.get_column(&col)?; + Ok((*arg_name,col.clone(),ColumnIndex::Index(row-1))) + } + // x.y{1} + (TableIndex::Index(ix),TableIndex::Alias(col_alias)) => { + let arg_col = table_brrw.get_column(col)?; + Ok((*arg_name,arg_col.clone(),ColumnIndex::Index(*ix-1))) + } + // x{1} + (TableIndex::Index(ix),TableIndex::None) => { + let (ix_row,ix_col) = table_brrw.index_to_subscript(ix-1)?; + let col = table_brrw.get_column(&TableIndex::Index(ix_col + 1))?; + Ok((*arg_name,col.clone(),ColumnIndex::Index(ix_row))) + } + // x{z,1} + // x.y{z} + (TableIndex::IxTable(ix_table_id),TableIndex::Index(_)) | + (TableIndex::IxTable(ix_table_id),TableIndex::Alias(_)) => { + let ix_table = self.get_table(&ix_table_id)?; + let ix_table_brrw = ix_table.borrow(); + if ix_table_brrw.cols > 1 { + return Err(MechError{msg: "".to_string(), id: 2108, kind: MechErrorKind::GenericError("Index table must be a column vector.".to_string())}); + } + let ix = match ix_table_brrw.get_column_unchecked(0) { + Column::Bool(bool_col) => ColumnIndex::Bool(bool_col), + Column::Index(ix_col) => ColumnIndex::IndexCol(ix_col), + Column::U8(ix_col) => ColumnIndex::IndexColU8(ix_col), + Column::F32(ix_col) => { + ColumnIndex::RealIndex(ix_col) + }, + x => {return Err(MechError{msg: "".to_string(), id: 2109, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + }; + let arg_col = table_brrw.get_column(col)?; + Ok((*arg_name,arg_col.clone(),ix)) + } + // x{z} + (TableIndex::IxTable(ix_table_id),TableIndex::None) => { + let ix_table = self.get_table(&ix_table_id)?; + let ix_table_brrw = ix_table.borrow(); + match table.borrow().kind() { + ValueKind::Compound(table_kind) => { + return Err(MechError{msg: "".to_string(), id: 2110, kind: MechErrorKind::GenericError("Can't handle compound".to_string())}); + } + table_kind => { + let ix = match ix_table_brrw.get_column_unchecked(0) { + Column::Bool(bool_col) => ColumnIndex::Bool(bool_col), + Column::Index(ix_col) => ColumnIndex::IndexCol(ix_col), + Column::U8(ix_col) => ColumnIndex::Index(ix_col.borrow()[0].unwrap() as usize - 1), + Column::F32(ix_col) => { + ColumnIndex::RealIndex(ix_col) + }, + x => {return Err(MechError{msg: "".to_string(), id: 2111, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + }; + match table_brrw.shape() { + TableShape::Column(rows) => { + let col = table_brrw.get_column_unchecked(0); + Ok((*arg_name,col.clone(),ix)) + } + _ => Ok((*arg_name,Column::Reference((table.clone(),(ix,ColumnIndex::None))),ColumnIndex::All)), + } + } + } + } + // x{:,1} + (TableIndex::All, TableIndex::Index(col_ix)) => { + let col = table_brrw.get_column(&TableIndex::Index(*col_ix))?; + Ok((*arg_name,col.clone(),ColumnIndex::All)) + }, + // x{:,:} + (TableIndex::All, TableIndex::All) => { + if table_brrw.cols > 1 { + let reference = Column::Reference((table.clone(),(ColumnIndex::All,ColumnIndex::All))); + return Ok((*arg_name,reference,ColumnIndex::All)); + } + let col = table_brrw.get_column(&col)?; + if col.len() == 1 { + Ok((*arg_name,col.clone(),ColumnIndex::Index(0))) + } else { + Ok((*arg_name,col.clone(),ColumnIndex::All)) + } + } + _ => { + let col = table_brrw.get_column(&col)?; + if col.len() == 1 { + Ok((*arg_name,col.clone(),ColumnIndex::Index(0))) + } else { + Ok((*arg_name,col.clone(),ColumnIndex::All)) + } + } + } + } + + pub fn get_arg_columns(&self, arguments: &Vec) -> Result,MechError> { + let mut argument_columns = vec![]; + for argument in arguments { + let arg_col = self.get_arg_column(argument)?; + argument_columns.push(arg_col); + } + Ok(argument_columns) + } + + pub fn get_whole_table_arg_cols(&self, argument: &Argument) -> Result,MechError> { + + let (arg_name,table_id,indices) = argument; + let mut table_id = *table_id; + for (row,column) in indices.iter().take(indices.len()-1) { + let argument = (0,table_id,vec![(row.clone(),column.clone())]); + match self.get_arg_dim(&argument)? { + TableShape::Scalar => { + let arg_col = self.get_arg_column(&argument)?; + match (arg_col,row,column) { + ((_,Column::Ref(ref_col),_),_,TableIndex::None) => { + table_id = ref_col.borrow()[0].clone(); + } + ((_,Column::Ref(ref_col),_),TableIndex::Index(row_ix),_) => { + table_id = ref_col.borrow()[row_ix-1].clone(); + } + ((_,Column::Ref(ref_col),_),_,_) => { + table_id = ref_col.borrow()[0].clone(); + } + x => {return Err(MechError{msg: "".to_string(), id: 2211, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + x => {return Err(MechError{msg: "".to_string(), id: 2112, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + let (row,col) = &indices.last().unwrap(); + let table = self.get_table(&table_id)?; + let table_brrw = table.borrow(); + /*match self.get_arg_dim(argument) { + Ok(TableShape::Column(rows)) => { + return Err(MechError{msg: "".to_string(), id: 2113, kind: MechErrorKind::GenericError("Can't handle this unless it's a column vector.".to_string())}); + } + _ => (), + };*/ + let row_index = match (row,col) { + (TableIndex::ReshapeColumn,_) => ColumnIndex::ReshapeColumn, + (TableIndex::All,_) => ColumnIndex::All, + (TableIndex::None,_) => ColumnIndex::None, + (TableIndex::Index(ix),_) => ColumnIndex::Index(ix - 1), + (TableIndex::Alias(alias),_) => { + return Err(MechError{msg: "".to_string(), id: 2114, kind: MechErrorKind::GenericError("Can't index on row alias yet".to_string())}); + }, + (TableIndex::IxTable(ix_table_id),_) => { + let ix_table = self.get_table(&ix_table_id)?; + let ix_table_brrw = ix_table.borrow(); + let ix = match ix_table_brrw.get_column_unchecked(0) { + Column::Bool(bool_col) => ColumnIndex::Bool(bool_col), + Column::Index(ix_col) => ColumnIndex::IndexCol(ix_col), + Column::U8(ix_col) => ColumnIndex::Index(ix_col.borrow()[0].unwrap() as usize - 1), + Column::F32(ix_col) => ColumnIndex::Index(ix_col.borrow()[0].unwrap() as usize - 1), + x => {return Err(MechError{msg: "".to_string(), id: 2115, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + }; + ix + } + _ => ColumnIndex::All, + }; + let arg_cols = table_brrw.get_columns(&col)?.iter().map(|arg_col| (*arg_name,arg_col.clone(),row_index.clone())).collect(); + Ok(arg_cols) + } + + + pub fn get_out_column(&self, out: &Out, rows: usize, col_kind: ValueKind) -> Result { + let (out_table_id, _, _) = out; + let table = self.get_table(out_table_id)?; + let mut t = table.borrow_mut(); + let cols = if t.cols == 0 { 1 } else { t.cols }; + let rows = if rows == 0 { 1 } else { rows }; + t.resize(rows,cols); + t.set_col_kind(0, col_kind)?; + let column = t.get_column_unchecked(0); + Ok(column) + } + + pub fn get_arg_dims(&self, arguments: &Vec) -> Result,MechError> { + let mut arg_shapes = Vec::new(); + for argument in arguments { + arg_shapes.push(self.get_arg_dim(argument)?); + } + Ok(arg_shapes) + } + + pub fn get_arg_dim(&self, argument: &Argument) -> Result { + let (_, table_id, indices) = argument; + let mut table_id = *table_id; + for (row,column) in indices.iter().take(indices.len()-1) { + let argument = (0,table_id,vec![(row.clone(),column.clone())]); + match self.get_arg_dim(&argument)? { + TableShape::Scalar => { + let arg_col = self.get_arg_column(&argument)?; + match (arg_col,row,column) { + ((_,Column::Ref(ref_col),_),_,TableIndex::None) => { + table_id = ref_col.borrow()[0].clone(); + } + ((_,Column::Ref(ref_col),_),TableIndex::Index(row_ix),_) => { + table_id = ref_col.borrow()[row_ix-1].clone(); + } + ((_,Column::Ref(ref_col),_),_,_) => { + table_id = ref_col.borrow()[0].clone(); + } + x => {return Err(MechError{msg: "".to_string(), id: 2116, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + x => {return Err(MechError{msg: "".to_string(), id: 2117, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + + let (row,col) = &indices.last().unwrap(); + let table = self.get_table(&table_id)?; + let table_brrw = table.borrow(); + let mut dynamic = table_brrw.dynamic; + let dim = match (row,col) { + (TableIndex::ReshapeColumn, TableIndex::All) => (table_brrw.rows*table_brrw.cols,1), + (TableIndex::All, TableIndex::All) => (table_brrw.rows, table_brrw.cols), + (TableIndex::All, TableIndex::None) => (table_brrw.rows*table_brrw.cols,1), + (TableIndex::All,TableIndex::Index(_)) | + (TableIndex::All, TableIndex::Alias(_)) => (table_brrw.rows, 1), + (TableIndex::Index(_),TableIndex::None) | + (TableIndex::Index(_),TableIndex::Index(_)) | + (TableIndex::Index(_),TableIndex::Alias(_)) => { + dynamic = false; + (1,1) + }, + (TableIndex::Index(_),TableIndex::All) => (1,table_brrw.cols), + (TableIndex::IxTable(ix_table_id),TableIndex::Alias(_)) | + (TableIndex::IxTable(ix_table_id),TableIndex::None) => { + let ix_table = self.get_table(&ix_table_id)?; + let rows = ix_table.borrow().len(); + (rows,1) + }, + (TableIndex::IxTable(ix_table_id),TableIndex::All) => { + let ix_table = self.get_table(&ix_table_id)?; + let rows = ix_table.borrow().len(); + (rows,table_brrw.cols) + }, + (TableIndex::All,TableIndex::IxTable(ix_table_id)) => { + let ix_table = self.get_table(&ix_table_id)?; + let ix_table_brrw = ix_table.borrow(); + let rows = ix_table_brrw.len(); + let cols = match ix_table_brrw.kind() { + ValueKind::Bool => { + ix_table_brrw.logical_len() + } + ValueKind::String => { + ix_table_brrw.len() + } + x => {return Err(MechError{msg: "".to_string(), id: 2128, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + }; + (table_brrw.rows, cols) + } + (TableIndex::All,TableIndex::Aliases(aliases)) => { + (table_brrw.rows,aliases.len()) + } + x => {return Err(MechError{msg: "".to_string(), id: 2118, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + }; + let arg_shape = match (dim,dynamic) { + ((_,0),_) | + ((0,_),_) | + ((0,0),_) => TableShape::Pending(table_id), + ((1,1),false) => TableShape::Scalar, + ((1,x),false) => TableShape::Row(x), + ((x,1),false) => TableShape::Column(x), + ((x,y),false) => TableShape::Matrix(x,y), + ((x,y),true) => TableShape::Dynamic(x,y), + _ => TableShape::Pending(table_id), + }; + Ok(arg_shape) + } + + pub fn add_tfm(&mut self, tfm: Transformation) -> Result<(),MechError> { + self.init_registers(&tfm); + match self.state { + BlockState::Unsatisfied => { + self.pending_transformations.push(tfm.clone()); + return Err(MechError{msg: "".to_string(), id: 2119, kind: MechErrorKind::GenericError("Unsatisfied block".to_string())}); + } + _ => { + match self.compile_tfm(tfm.clone()) { + Ok(()) => (), + Err(mech_error) => { + self.unsatisfied_transformation = Some((mech_error.clone(),tfm)); + self.state = BlockState::Unsatisfied; + return Err(mech_error); + } + } + } + } + Ok(()) + } + + fn init_registers(&mut self, tfm: &Transformation) { + match tfm { + Transformation::TableDefine{table_id, indices, out} => { + if let TableId::Global(_) = table_id { + self.input.insert((*table_id,RegisterIndex::All,RegisterIndex::All)); + self.triggers.insert((*table_id,RegisterIndex::All,RegisterIndex::All)); + } + } + Transformation::ColumnAlias{table_id, column_ix, column_alias} => { + if let TableId::Global(_) = table_id { + self.triggers.insert((*table_id,RegisterIndex::All,RegisterIndex::Alias(*column_alias))); + self.input.insert((*table_id,RegisterIndex::All,RegisterIndex::Alias(*column_alias))); + self.output.insert((*table_id,RegisterIndex::All,RegisterIndex::Alias(*column_alias))); + } + } + Transformation::Function{name, ref arguments, out} => { + self.required_functions.insert(*name); + for (_,table_id,indices) in arguments { + if let TableId::Global(_) = table_id { + let register = (*table_id,RegisterIndex::All,RegisterIndex::All); + self.input.insert(register); + self.triggers.insert(register); + } + for (row_ix, col_ix) in indices { + match row_ix { + TableIndex::IxTable(TableId::Global(ix_table_id)) => { + let register = (TableId::Global(*ix_table_id),RegisterIndex::All,RegisterIndex::All); + self.input.insert(register); + self.triggers.insert(register); + } + _ => (), + } + match col_ix { + TableIndex::IxTable(TableId::Global(ix_table_id)) => { + let register = (TableId::Global(*ix_table_id),RegisterIndex::All,RegisterIndex::All); + self.input.insert(register); + self.triggers.insert(register); } + _ => (), + } + } + } + if let (TableId::Global(table_id),_,_) = out { + self.output.insert((TableId::Global(*table_id),RegisterIndex::All,RegisterIndex::All)); + } + } + Transformation::Whenever{table_id, indices} => { + self.triggers.clear(); + self.triggers.insert((*table_id,RegisterIndex::All,RegisterIndex::All)); + } + _ => (), + } + } + + fn compile_tfm(&mut self, tfm: Transformation) -> Result<(), MechError> { + self.init_registers(&tfm); + match &tfm { + Transformation::Identifier{name, id} => { + self.strings.borrow_mut().insert(*id, MechString::from_chars(name)); + } + Transformation::NewTable{table_id, rows, columns} => { + match table_id { + TableId::Local(id) => { + let mut table = Table::new(*id, 0, 0); + table.dictionary = self.strings.clone(); + self.tables.insert_table(table); + } + TableId::Global(id) => { + let mut table = Table::new(*id, 0, 0); + table.dictionary = self.strings.clone(); + let table = Rc::new(RefCell::new(table)); + self.pending_global_tables.insert(*table_id.unwrap(),table); + self.output.insert((*table_id,RegisterIndex::All,RegisterIndex::All)); + self.defined_tables.insert((*table_id,RegisterIndex::All,RegisterIndex::All)); + } + } + }, + Transformation::TableReference{table_id, reference} => { + let table = self.get_table(table_id)?; + let mut table_brrw = table.borrow_mut(); + table_brrw.resize(1,1); + table_brrw.set_kind(ValueKind::Reference); + table_brrw.set_raw(0,0,reference.clone())?; + + let src_table = self.get_table(&reference.as_table_reference()?)?; + let src_table_brrw = src_table.borrow(); + let src_id = src_table_brrw.id; + let rows = src_table_brrw.rows; + let cols = src_table_brrw.cols; + let dest_table = Table::new(src_id,rows,cols); + { + self.global_database.borrow_mut().insert_table(dest_table); + } + } + Transformation::TableAlias{table_id, alias} => { + self.tables.insert_alias(*alias, *table_id)?; + }, + Transformation::ColumnKind{table_id, column_ix, kind} => { + let table = self.get_table(table_id)?; + let mut table_brrw = table.borrow_mut(); + if *kind == *cU8 { table_brrw.set_col_kind(*column_ix,ValueKind::U8)?; } + else if *kind == *cU16 { table_brrw.set_col_kind(*column_ix,ValueKind::U16)?; } + else if *kind == *cU32 { table_brrw.set_col_kind(*column_ix,ValueKind::U32)?; } + else if *kind == *cU64 { table_brrw.set_col_kind(*column_ix,ValueKind::U64)?; } + else if *kind == *cU128 { table_brrw.set_col_kind(*column_ix,ValueKind::U128)?; } + else if *kind == *cI8 { table_brrw.set_col_kind(*column_ix,ValueKind::I8)?; } + else if *kind == *cI16 { table_brrw.set_col_kind(*column_ix,ValueKind::I16)?; } + else if *kind == *cI32 { table_brrw.set_col_kind(*column_ix,ValueKind::I32)?; } + else if *kind == *cI64 { table_brrw.set_col_kind(*column_ix,ValueKind::I64)?; } + else if *kind == *cI128 { table_brrw.set_col_kind(*column_ix,ValueKind::I128)?; } + else if *kind == *cF32 { table_brrw.set_col_kind(*column_ix,ValueKind::F32)?; } + else if *kind == *cF32L { table_brrw.set_col_kind(*column_ix,ValueKind::F32)?; } + else if *kind == *cM { table_brrw.set_col_kind(*column_ix,ValueKind::Length)?; } + else if *kind == *cKM { table_brrw.set_col_kind(*column_ix,ValueKind::Length)?; } + else if *kind == *cS { table_brrw.set_col_kind(*column_ix,ValueKind::Time)?; } + else if *kind == *cMS { table_brrw.set_col_kind(*column_ix,ValueKind::Time)?; } + else if *kind == *cSTRING { table_brrw.set_col_kind(*column_ix,ValueKind::String)?; } + else if *kind == *cBOOL { table_brrw.set_col_kind(*column_ix,ValueKind::Bool)?; } + else if *kind == *cM_S { table_brrw.set_col_kind(*column_ix,ValueKind::Speed)?; } + else if *kind == *cANY { table_brrw.set_col_kind(*column_ix,ValueKind::Any)?; } + else { + return Err(MechError{msg: "".to_string(), id: 2120, kind: MechErrorKind::UnknownColumnKind(*kind)}); + } + } + Transformation::ColumnAlias{table_id, column_ix, column_alias} => { + if let TableId::Global(_) = table_id { + self.triggers.insert((*table_id,RegisterIndex::All,RegisterIndex::Alias(*column_alias))); + self.input.insert((*table_id,RegisterIndex::All,RegisterIndex::Alias(*column_alias))); + self.output.insert((*table_id,RegisterIndex::All,RegisterIndex::Alias(*column_alias))); + } + let mut table = self.tables.get_table_by_id(table_id.unwrap()).unwrap().borrow_mut(); + if table.cols == 0 || *column_ix > (table.cols - 1) { + let rows = table.rows; + table.resize(rows,*column_ix + 1); + } + table.set_col_alias(*column_ix,*column_alias); + }, + Transformation::TableDefine{table_id, indices, out} => { + if let TableId::Global(id) = table_id { + self.input.insert((*table_id,RegisterIndex::All,RegisterIndex::All)); + self.triggers.insert((*table_id,RegisterIndex::All,RegisterIndex::All)); + } + for (row_ix, col_ix) in indices { + match row_ix { + TableIndex::IxTable(TableId::Global(ix_table_id)) => { + self.input.insert((TableId::Global(*ix_table_id),RegisterIndex::All,RegisterIndex::All)); + } + _ => (), + } + match col_ix { + TableIndex::IxTable(TableId::Global(ix_table_id)) => { + self.input.insert((TableId::Global(*ix_table_id),RegisterIndex::All,RegisterIndex::All)); + } + _ => (), + } + } + // Compile a Table Define function + let arguments = vec![(0,table_id.clone(),indices.clone())]; + let out = (*out, TableIndex::All, TableIndex::All); + let fxns = self.functions.clone(); + match &fxns { + Some(functions) => { + let mut fxns = functions.borrow_mut(); + #[cfg(feature = "stdlib")] + match fxns.get(*TABLE_DEFINE) { + Some(fxn) => { + fxn.compile(self,&arguments,&out)?; + } + None => {return Err(MechError{msg: "".to_string(), id: 2223, kind: MechErrorKind::MissingFunction(*TABLE_DEFINE)});}, + } + } + None => {return Err(MechError{msg: "".to_string(), id: 2224, kind: MechErrorKind::GenericError("No functions are loaded.".to_string())});}, + } + } + Transformation::Set{src_id, src_row, src_col, dest_id, dest_row, dest_col} => { + self.output.insert((*dest_id,RegisterIndex::All,RegisterIndex::All)); + match src_row { + TableIndex::IxTable(TableId::Global(ix_table_id)) => { + self.input.insert((TableId::Global(*ix_table_id),RegisterIndex::All,RegisterIndex::All)); + } + _ => (), + } + match dest_row { + TableIndex::IxTable(TableId::Global(ix_table_id)) => { + self.input.insert((TableId::Global(*ix_table_id),RegisterIndex::All,RegisterIndex::All)); + } + _ => (), + } + #[cfg(feature = "stdlib")] + self.compile_tfm(Transformation::Function{ + name: *TABLE_SET, + arguments: vec![(0,*src_id,vec![(src_row.clone(), src_col.clone())])], + out: (*dest_id,dest_row.clone(),dest_col.clone()), + })?; + } + Transformation::UpdateData{name, src_id, src_row, src_col, dest_id, dest_row, dest_col} => { + self.output.insert((*dest_id,RegisterIndex::All,RegisterIndex::All)); + match dest_row { + TableIndex::IxTable(TableId::Global(ix_table_id)) => { + self.input.insert((TableId::Global(*ix_table_id),RegisterIndex::All,RegisterIndex::All)); + } + _ => (), + } + self.compile_tfm(Transformation::Function{ + name: *name, + arguments: vec![(0,*src_id,vec![(src_row.clone(), src_col.clone())])], + out: (*dest_id,dest_row.clone(),dest_col.clone()), + })?; + } + Transformation::NumberLiteral{kind, bytes} => { + let mut num = NumberLiteral::new(*kind, bytes.to_vec()); + let mut bytes = bytes.clone(); + let table_id = hash_str(&format!("{:?}{:?}", kind, bytes)); + let table = self.get_table(&TableId::Local(table_id))?; + let mut table_brrw = table.borrow_mut(); + table_brrw.resize(1,1); + if *kind == *cU8 { + table_brrw.set_kind(ValueKind::U8)?; + table_brrw.set_raw(0,0,Value::U8(U8::new(num.as_u8())))?; + } + else if *kind == *cU16 { + table_brrw.set_kind(ValueKind::U16)?; + table_brrw.set_raw(0,0,Value::U16(U16::new(num.as_u16())))?; + } + else if *kind == *cU32 { + table_brrw.set_kind(ValueKind::U32)?; + table_brrw.set_raw(0,0,Value::U32(U32::new(num.as_u32())))?; + } + else if *kind == *cU64 { + table_brrw.set_kind(ValueKind::U64)?; + table_brrw.set_raw(0,0,Value::U64(U64::new(num.as_u64())))?; + } + else if *kind == *cU128 { + table_brrw.set_kind(ValueKind::U128)?; + table_brrw.set_raw(0,0,Value::U128(U128::new(num.as_u128())))?; + } + else if *kind == *cI8 { + table_brrw.set_kind(ValueKind::I8)?; + table_brrw.set_raw(0,0,Value::I8(I8::new(num.as_i8())))?; + } + else if *kind == *cI16 { + table_brrw.set_kind(ValueKind::I16)?; + table_brrw.set_raw(0,0,Value::I16(I16::new(num.as_i16())))?; + } + else if *kind == *cI32 { + table_brrw.set_kind(ValueKind::I32)?; + table_brrw.set_raw(0,0,Value::I32(I32::new(num.as_i32())))?; + } + else if *kind == *cI64 { + table_brrw.set_kind(ValueKind::I64)?; + table_brrw.set_raw(0,0,Value::I64(I64::new(num.as_i64())))?; + } + else if *kind == *cI128 { + table_brrw.set_kind(ValueKind::I128)?; + table_brrw.set_raw(0,0,Value::I128(I128::new(num.as_i128())))?; + } + else if *kind == *cMS { + table_brrw.set_kind(ValueKind::Time)?; + table_brrw.set_raw(0,0,Value::Time(F32::new(num.as_f32() / 1000.0)))?; + } + else if *kind == *cS { + table_brrw.set_kind(ValueKind::Time)?; + table_brrw.set_raw(0,0,Value::Time(F32::new(num.as_f32())))?; + } + else if *kind == *cF32 { + table_brrw.set_kind(ValueKind::F32)?; + table_brrw.set_raw(0,0,Value::F32(F32::new(num.as_f32())))?; + } + else if *kind == *cF64 { + table_brrw.set_kind(ValueKind::F64)?; + table_brrw.set_raw(0,0,Value::F64(F64::new(num.as_f64())))?; + } + else if *kind == *cF32L { + table_brrw.set_kind(ValueKind::F32)?; + table_brrw.set_raw(0,0,Value::F32(F32::new(num.as_f32())))?; + } + else if *kind == *cKM { + table_brrw.set_kind(ValueKind::Length)?; + table_brrw.set_raw(0,0,Value::Length(F32::new(num.as_f32() * 1000.0)))?; + } + else if *kind == *cM { + table_brrw.set_kind(ValueKind::Length)?; + table_brrw.set_raw(0,0,Value::Length(F32::new(num.as_f32())))?; + } + else if *kind == *cM_S { + table_brrw.set_kind(ValueKind::Speed)?; + table_brrw.set_raw(0,0,Value::Speed(F32::new(num.as_f32())))?; + } + else if *kind == *cDEC { + match bytes.len() { + 1 => { + table_brrw.set_col_kind(0, ValueKind::U8)?; + table_brrw.set_raw(0,0,Value::U8(U8::new(num.as_u8())))?; + } + 2 => { + table_brrw.set_kind(ValueKind::U16)?; + table_brrw.set_raw(0,0,Value::U16(U16::new(num.as_u16())))?; + } + 3 | 4 => { + table_brrw.set_kind(ValueKind::U32)?; + table_brrw.set_raw(0,0,Value::U32(U32::new(num.as_u32())))?; + } + 5..=8 => { + table_brrw.set_kind(ValueKind::U64)?; + table_brrw.set_raw(0,0,Value::U64(U64::new(num.as_u64())))?; + } + 9..=16 => { + table_brrw.set_kind(ValueKind::U128)?; + table_brrw.set_raw(0,0,Value::U128(U128::new(num.as_u128())))?; + } + _ => {return Err(MechError{msg: "".to_string(), id: 2121, kind: MechErrorKind::GenericError("Too many bytes in number".to_string())});}, + } + } + else if *kind == *cHEX { + let mut x: u128 = 0; + table_brrw.set_kind(ValueKind::U128)?; + while bytes.len() < 16 { + bytes.insert(0,0); + } + for half_byte in bytes { + x = x << 4; + x = x | half_byte as u128; + } + table_brrw.set_raw(0,0,Value::U128(U128::new(x)))?; + } + else { + return Err(MechError{msg: "".to_string(), id: 2122, kind: MechErrorKind::UnknownColumnKind(*kind)}); + } + }, + Transformation::Constant{table_id, value} => { + let table = self.get_table(table_id)?; + let mut table_brrw = table.borrow_mut(); + table_brrw.resize(1,1); + match &value { + Value::Bool(_) => {table_brrw.set_col_kind(0, ValueKind::Bool)?;}, + Value::String(_) => {table_brrw.set_col_kind(0, ValueKind::String)?;}, + _ => (), + } + table_brrw.set_raw(0,0,value.clone())?; + } + Transformation::Whenever{table_id, indices} => { + self.triggers.clear(); + self.triggers.insert((*table_id,RegisterIndex::All,RegisterIndex::All)); + } + Transformation::Function{name, ref arguments, out} => { + for (_,_,indices) in arguments { + for (row_ix, col_ix) in indices { + match row_ix { + TableIndex::IxTable(TableId::Global(ix_table_id)) => { + self.input.insert((TableId::Global(*ix_table_id),RegisterIndex::All,RegisterIndex::All)); + } + _ => (), + } + match col_ix { + TableIndex::IxTable(TableId::Global(ix_table_id)) => { + self.input.insert((TableId::Global(*ix_table_id),RegisterIndex::All,RegisterIndex::All)); + } + _ => (), + } + } + } + // A list of all the functions that are + // loaded onto this core. + let fxns = self.functions.clone(); + match &fxns { + Some(functions) => { + let fxns_brrw = functions.borrow(); + match fxns_brrw.get(*name) { + Some(fxn) => { + // A function knows how to compile itself + // based on what arguments are passed. + // Not all arguments are valid, in which + // case an error is returned. + fxn.compile(self,&arguments,&out)?; + } + None => { + // check if it's a user function instead + let user_fxns = self.user_functions.clone(); + match &user_fxns { + Some(user_fxns) => { + let mut user_fxns_brrw = user_fxns.borrow(); + match user_fxns_brrw.get(name) { + Some(fxn) => { + let compiled_fxn = fxn.compile(self,&arguments,&out)?; + self.plan.push(compiled_fxn); + }, + None => return Err(MechError{msg: "".to_string(), id: 2123, kind: MechErrorKind::MissingFunction(*name)}), + } + } + None => return Err(MechError{msg: "".to_string(), id: 2124, kind: MechErrorKind::MissingFunction(*name)}), + } + }, + } + } + None => {return Err(MechError{msg: "".to_string(), id: 2125, kind: MechErrorKind::GenericError("No functions are loaded.".to_string())});}, + } + } + Transformation::FollowedBy{table_id, initial, subsequent} => { + self.output.remove(&(*table_id,RegisterIndex::All,RegisterIndex::All)); + + let indices = vec![(TableIndex::All, TableIndex::All)]; + if let TableId::Global(id) = subsequent { + self.input.insert((*subsequent,RegisterIndex::All,RegisterIndex::All)); + self.triggers.insert((*subsequent,RegisterIndex::All,RegisterIndex::All)); + } + for (row_ix, col_ix) in &indices { + match row_ix { + TableIndex::IxTable(TableId::Global(ix_table_id)) => { + self.input.insert((TableId::Global(*ix_table_id),RegisterIndex::All,RegisterIndex::All)); + } + _ => (), + } + match col_ix { + TableIndex::IxTable(TableId::Global(ix_table_id)) => { + self.input.insert((TableId::Global(*ix_table_id),RegisterIndex::All,RegisterIndex::All)); + } + _ => (), + } + } + // Compile a Table Define function + let arguments = vec![(0,initial.clone(),indices.clone())]; + let out = (*table_id, TableIndex::All, TableIndex::All); + let fxns = self.functions.clone(); + match &fxns { + Some(functions) => { + let mut fxns = functions.borrow_mut(); + #[cfg(feature = "stdlib")] + match fxns.get(*TABLE_DEFINE) { + Some(fxn) => { + fxn.compile(self,&arguments,&out)?; + self.plan.plan.pop(); + } + None => {return Err(MechError{msg: "".to_string(), id: 2423, kind: MechErrorKind::MissingFunction(*TABLE_DEFINE)});}, + } + let arguments = vec![(0,subsequent.clone(),indices.clone())]; + #[cfg(feature = "stdlib")] + match fxns.get(*TABLE_FOLLOWED__BY) { + Some(fxn) => { + fxn.compile(self,&arguments,&out)?; + } + None => {return Err(MechError{msg: "".to_string(), id: 2424, kind: MechErrorKind::MissingFunction(*TABLE_DEFINE)});}, + } + } + None => {return Err(MechError{msg: "".to_string(), id: 2425, kind: MechErrorKind::GenericError("No functions are loaded.".to_string())});}, + } + } + _ => (), + } + self.transformations.push(tfm.clone()); + Ok(()) + } + + pub fn solve(&self) -> Result<(),MechError> { + if self.state == BlockState::Ready { + // Solve synchronous functions + for ref mut fxn in &mut self.plan.plan.iter() { + fxn.solve(); + } + Ok(()) + } else { + Err(MechError{msg: "".to_string(), id: 2126, kind: MechErrorKind::GenericError("Block not ready".to_string())}) + } + } + +} + +impl fmt::Debug for Block { + #[inline] + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + let mut block_drawing = BoxPrinter::new(); + block_drawing.add_title("🧊","BLOCK"); + block_drawing.add_line(format!("id: {}", humanize(&self.id))); + block_drawing.add_line(format!("state: {:?}", &self.state)); + block_drawing.add_title("🌳","Ast"); + block_drawing.add_line(format!("{:?}", &self.ast)); + + block_drawing.add_title("⚙️",&format!("triggers ({})",self.triggers.len())); + if self.triggers.len() > 0 { + for (table,row,col) in &self.triggers { + let table_name: String = if let TableId::Global(table_id) = table { + match self.strings.borrow().get(table_id) { + Some(s) => s.to_string(), + None => format!("{:?}",table), + } + } else { + format!("{:?}",table) + }; + block_drawing.add_line(format!(" - #{}{{{:?}, {:?}}}", table_name,row,col)); + } + } + block_drawing.add_title("📭",&format!("input ({})",self.input.len())); + if self.input.len() > 0 { + for (table,row,col) in &self.input { + let table_name: String = if let TableId::Global(table_id) = table { + match self.strings.borrow().get(table_id) { + Some(s) => s.to_string(), + None => format!("{:?}",table), + } + } else { + format!("{:?}",table) + }; + block_drawing.add_line(format!(" - #{}{{{:?}, {:?}}}", table_name,row,col)); + } + } + block_drawing.add_title("📬",&format!("output ({})",self.output.len())); + if self.output.len() > 0 { + for (table,row,col) in &self.output { + let table_name: String = if let TableId::Global(table_id) = table { + match self.strings.borrow().get(table_id) { + Some(s) => s.to_string(), + None => format!("{:?}",table_id), + } + } else { + format!("{:?}",table) + }; + block_drawing.add_line(format!(" - #{}{{{:?}, {:?}}}", table_name,row,col)); + } + } + block_drawing.add_title("🪄",&format!("transformations ({})",self.transformations.len())); + block_drawing.add_line(format!("{:#?}", &self.transformations)); + if let Some(ut) = &self.unsatisfied_transformation { + block_drawing.add_title("😔","unsatisfied transformation"); + block_drawing.add_line(format!("{:#?}", &ut)); + } + if self.pending_transformations.len() > 0 { + block_drawing.add_title("⏳","pending transformations"); + block_drawing.add_line(format!("{:#?}", &self.pending_transformations)); + } + block_drawing.add_title("🗺️","plan"); + block_drawing.add_line(format!("{:?}", &self.plan)); + block_drawing.add_title("📅","tables"); + block_drawing.add_line(format!("{:?}", &self.tables)); + write!(f,"{:?}",block_drawing)?; + Ok(()) + } +} + +// ### RegisterIndex + +#[derive(Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)] +pub enum RegisterIndex { + Index(usize), + Alias(u64), + All, +} + +impl RegisterIndex { + pub fn unwrap(&self) -> usize { + match self { + RegisterIndex::Index(ix) => *ix, + RegisterIndex::Alias(alias) => { + alias.clone() as usize + }, + RegisterIndex::All => 0, + } + } + +} + +impl fmt::Debug for RegisterIndex { + #[inline] + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + &RegisterIndex::Index(ref ix) => write!(f, "Ix({:?})", ix), + &RegisterIndex::Alias(ref alias) => write!(f, "IxAlias({})", humanize(alias)), + &RegisterIndex::All => write!(f, "IxAll"), + } + } +} + +#[derive(Debug, Copy, PartialEq, Eq, Hash, Clone, Serialize, Deserialize)] +pub struct Register { + pub table_id: TableId, + pub row: RegisterIndex, + pub column: RegisterIndex, +} \ No newline at end of file diff --git a/src/core/src/capabilities.rs b/src/core/src/capabilities.rs new file mode 100644 index 0000000..283fab3 --- /dev/null +++ b/src/core/src/capabilities.rs @@ -0,0 +1,151 @@ +// Capabilities +//================ + +/* +Defines a capability-based permission system for Mech, featuring an enum Capability representing different system permissions, and a struct CapabilityToken storing capability tokens with their associated permissions. The CapabilityToken methods allow creating, signing, verifying, and revoking tokens. Additionally, the generate_keypair function generates cryptographic keypairs for signing and verifying tokens, ensuring secure access management for the file system. +*/ + +use ed25519_dalek::{Verifier, Signer, Keypair, PublicKey, Signature}; +use rand::rngs::OsRng; +use rand::RngCore; +use crate::hash_str; +use hashbrown::HashSet; +use crate::*; + +#[derive(Debug, Clone, Eq, PartialEq, Hash, Serialize, Deserialize)] +pub enum Capability { + PinCPUCore(u64) , // Pin Mech program to a particular CPU core + AvailableCores(u64), // 0 indicats all, otherwise the number of CPU cores to use is specified + GPGPURead, // Permission to read from GPGPU + GPGPUWrite, // Permission to write to GPGPU + InputArguments, // Permission to accept input arguments + StdOut, // Permission to write to stdout stream + StdIn, // Permission to read from stdin stream + StdErr, // Permission to write to stderr stream + CoreDatabaseRead, // Read access to the database of a core + CoreDatabaseWrite, // Write access to the database of a core. Cores without this permission are read-only data sources + DownloadDependencies, // Permission for the program to download dependencies + LoadDependencies, // Permission for the program to load dependencies from disk + CoreNetworkRead, // Read access for a core node to receive messages from other cores + CoreNetworkWrite, // Write access for a core node to send messages to other cores + NetworkRead, // Read access to the general network interface + NetworkWrite, // Write access to the general network interface + FileSystemRead, // Read access to the whole file system + FileSystemWrite, // Write access to the whole file system + FileRead(String), // Read access to a specific file or folder + FileWrite(String), // Write access to a specific file or folder + AllTablesRead, // Allow all tables to be read. If you don't include this capability, you should include per-table read permissions + AllTablesWrite, // Allow all tables to be written. If you don't include this capability, you should include per-table write permissions + TableRead((TableId,u64,u64)), // Read access to a specific table{row,col} + TableWrite((TableId,u64,u64)), // Write access to a specific table{row,col} + UserDefined(u64), // Users can define their own custom capabilities with an id +} + +#[derive(Clone)] +pub struct CapabilityToken { + id: u64, + name: String, + capabilities: HashSet, + owner: u64, + expires: Option, + signature: Option<(Signature,PublicKey)>, // WARNING: Including the public key with the signature makes it vulnerable to MITM attacks. Use secure channels where security is necessary. +} + +impl CapabilityToken { + + // Create a new CapabilityToken with the given name, capabilities, owner, and expiration time + pub fn new( + name: String, + capabilities: HashSet, + owner: u64, + expires: Option) -> CapabilityToken { + let data = format!("{:?}{:?}{:?}", &name, &owner, &capabilities); + let id = hash_str(&data); + CapabilityToken { + id, + name, + capabilities, + owner, + expires, + signature: None, + } + } + + // Sign the token using a provided keypair + pub fn sign(&mut self, keypair: &Keypair) -> Result<(),MechError> { + match self.signature { + Some(s) => { Err(MechError{msg: "".to_string(), id: 3295, kind: MechErrorKind::GenericError(format!("Capability already signed"))})}, + None => { + let data_str = format!("{:?}{:?}{:?}", &self.name, &self.owner, &self.capabilities); + let data_bytes = data_str.as_bytes(); + let signature = keypair.sign(&data_bytes); + self.signature = Some((signature,keypair.public)); + Ok(()) + } + } + } + + // Verify the token's signature using a provided public key + pub fn verify(&self) -> Result<(),MechError> { + match self.signature { + Some((s,public_key)) => { + let data_str = format!("{:?}{:?}{:?}", &self.name, &self.owner, &self.capabilities); + let data_bytes = data_str.as_bytes(); + if public_key.verify(&data_bytes, &s).is_ok() { + Ok(()) + } else { + Err(MechError{id: 83820, msg: "".to_string(), kind: MechErrorKind::InvalidCapabilityToken}) + } + }, + None => Err(MechError{id: 83821, msg: "".to_string(), kind: MechErrorKind::InvalidCapabilityToken}) + } + } + + // Check to see if a token has a given capability + pub fn has_capability(&self, capability: &Capability) -> Result<(),MechError> { + if self.capabilities.contains(capability) { + Ok(()) + } else { + Err(MechError{id: 83822, msg: "".to_string(), kind: MechErrorKind::MissingCapability(capability.clone())}) + } + } + + // Returns true if the token is valid and contains the capability, false otherwise. + pub fn verify_capability(&self, capability: &Capability) -> Result<(),MechError> { + match self.verify() { + Ok(()) => self.has_capability(capability), + x => x, + } + } + + // Revoke the token by removing its expiration time and signature, so it cannot be validated + pub fn revoke(&mut self) { + self.expires = None; + self.signature = None; + } + +} + +impl fmt::Debug for CapabilityToken { + #[inline] + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + for c in self.capabilities.iter() { + write!(f,"{:?}\n",c)?; + } + Ok(()) + } +} + +// Generate a new id for creating unique owner ids +pub fn generate_uuid() -> u64 { + let mut key = [0u8; 16]; + OsRng.fill_bytes(&mut key); + OsRng.next_u64() +} + + +// Generate a new keypair for signing and verifying tokens +pub fn generate_keypair() -> Keypair { + let mut csprng = OsRng{}; + Keypair::generate(&mut csprng) +} \ No newline at end of file diff --git a/src/core/src/column.rs b/src/core/src/column.rs new file mode 100644 index 0000000..d94da4e --- /dev/null +++ b/src/core/src/column.rs @@ -0,0 +1,762 @@ +/* +In Mech, a table is composed of one or more columns, and each column contains values of a specific data type. The Column enum represents the different types of columns that can be created in Mech, such as floating-point columns (f32, F32, F64, etc.), integer columns (U8, U16, U32, etc.), boolean columns (Bool), and so on. Each variant of the Column enum is associated with a specific type of value. +*/ + +use std::sync::Arc; +use std::cell::RefCell; +use std::fmt; +use std::ptr; +use std::rc::Rc; +use hashbrown::{HashMap, HashSet}; + +use std::collections::VecDeque; +use std::thread; +use crate::*; + +use std::fmt::*; +use num_traits::identities::Zero; +use std::ops::*; + +pub type TableRef = Rc>; + +#[derive(Clone, Debug)] +pub enum Column { + f32(ColumnV), + F32(ColumnV), + F64(ColumnV), + U8(ColumnV), + U16(ColumnV), + U32(ColumnV), + U64(ColumnV), + U128(ColumnV), + Ref(ColumnV), + I8(ColumnV), + I16(ColumnV), + I32(ColumnV), + I64(ColumnV), + I128(ColumnV), + Index(ColumnV), + Bool(ColumnV), + String(ColumnV), + Reference((TableRef,(ColumnIndex,ColumnIndex))), + Time(ColumnV), + Length(ColumnV), + Angle(ColumnV), + Speed(ColumnV), + Any(ColumnV), + Empty, +} + +#[derive(Clone, Debug)] +pub enum ColumnIndex { + All, + RealIndex(ColumnV), + Index(usize), + IndexCol(ColumnV), + IndexColU8(ColumnV), + Bool(ColumnV), + ReshapeColumn, + None, +} + +impl Column { + + pub fn len(&self) -> usize { + match self { + Column::U8(col) => col.len(), + Column::U16(col) => col.len(), + Column::U32(col) => col.len(), + Column::U64(col) => col.len(), + Column::U128(col) => col.len(), + Column::I8(col) => col.len(), + Column::I16(col) => col.len(), + Column::I32(col) => col.len(), + Column::I64(col) => col.len(), + Column::I128(col) => col.len(), + Column::f32(col) => col.len(), + Column::Length(col) | Column::Time(col) | Column::Speed(col) | + Column::Angle(col) | + Column::F32(col) => col.len(), + Column::F64(col) => col.len(), + Column::Bool(col) => col.len(), + Column::Index(col) => col.len(), + Column::String(col) => col.len(), + Column::Any(col) => col.len(), + Column::Ref(col) => col.len(), + Column::Reference((table,index)) => { + let t = table.borrow(); + t.rows * t.cols + }, + Column::Empty => 0, + } + } + + pub fn logical_len(&self) -> usize { + match self { + Column::Bool(col) => col.borrow_mut().iter().fold(0, |acc,x| if *x { acc + 1 } else { acc }), + _ => self.len(), + } + } + + pub fn resize(&self, rows: usize) -> std::result::Result<(),MechError> { + match self { + Column::U8(col) => col.borrow_mut().resize(rows,U8(0)), + Column::U16(col) => col.borrow_mut().resize(rows,U16(0)), + Column::U32(col) => col.borrow_mut().resize(rows,U32(0)), + Column::U64(col) => col.borrow_mut().resize(rows,U64(0)), + Column::U128(col) => col.borrow_mut().resize(rows,U128(0)), + Column::I8(col) => col.borrow_mut().resize(rows,I8(0)), + Column::I16(col) => col.borrow_mut().resize(rows,I16(0)), + Column::I32(col) => col.borrow_mut().resize(rows,I32(0)), + Column::I64(col) => col.borrow_mut().resize(rows,I64(0)), + Column::I128(col) => col.borrow_mut().resize(rows,I128(0)), + Column::f32(col) => col.borrow_mut().resize(rows,0.0), + Column::Length(col) | Column::Time(col) | Column::Speed(col) | + Column::Angle(col) | + Column::F32(col) => col.borrow_mut().resize(rows,F32(0.0)), + Column::F64(col) => col.borrow_mut().resize(rows,F64(0.0)), + Column::Ref(col) => col.borrow_mut().resize(rows,TableId::Local(0)), + Column::Index(col) => col.borrow_mut().resize(rows,0), + Column::Any(col) => col.borrow_mut().resize(rows,Value::Empty), + Column::Bool(col) => col.borrow_mut().resize(rows,false), + Column::String(col) => col.borrow_mut().resize(rows,MechString::new()), + Column::Reference(_) | + Column::Empty => {return Err(MechError{msg: "".to_string(), id: 9430, kind: MechErrorKind::None});} + } + Ok(()) + } + + pub fn extend(&self, other: &Column) -> std::result::Result<(),MechError> { + match (self,other) { + (Column::U8(col),Column::U8(other)) => col.extend(other), + (Column::U16(col),Column::U16(other)) => col.extend(other), + (Column::U32(col),Column::U32(other)) => col.extend(other), + (Column::U64(col),Column::U64(other)) => col.extend(other), + (Column::U128(col),Column::U128(other)) => col.extend(other), + (Column::I8(col),Column::I8(other)) => col.extend(other), + (Column::I16(col),Column::I16(other)) => col.extend(other), + (Column::I32(col),Column::I32(other)) => col.extend(other), + (Column::I64(col),Column::I64(other)) => col.extend(other), + (Column::I128(col),Column::I128(other)) => col.extend(other), + (Column::Length(col),Column::Length(other)) | + (Column::Time(col),Column::Time(other)) | + (Column::Speed(col),Column::Speed(other)) | + (Column::Angle(col),Column::Angle(other)) | + (Column::F32(col),Column::F32(other)) => col.extend(other), + (Column::F64(col),Column::F64(other)) => col.extend(other), + (Column::f32(col),Column::f32(other)) => col.extend(other), + (Column::Index(col),Column::Index(other)) => col.extend(other), + (Column::Bool(col),Column::Bool(other)) => col.extend(other), + (Column::String(col),Column::String(other)) => col.extend(other), + _ => {return Err(MechError{msg: "".to_string(), id: 9431, kind: MechErrorKind::None});} + } + Ok(()) + } + + unwrap_column!(unwrap_u8,U8); + unwrap_column!(unwrap_u16,U16); + unwrap_column!(unwrap_u32,U32); + unwrap_column!(unwrap_u64,U64); + unwrap_column!(unwrap_u128,U128); + unwrap_column!(unwrap_i8,I8); + unwrap_column!(unwrap_i16,I16); + unwrap_column!(unwrap_i32,I32); + unwrap_column!(unwrap_i64,I64); + unwrap_column!(unwrap_i128,I128); + unwrap_column!(unwrap_f32,F32); + unwrap_column!(unwrap_f64,F64); + + pub fn kind(&self) -> ValueKind { + match self { + Column::f32(_) => ValueKind::f32, + Column::F32(_) => ValueKind::F32, + Column::F64(_) => ValueKind::F64, + Column::U8(_) => ValueKind::U8, + Column::U16(_) => ValueKind::U16, + Column::U32(_) => ValueKind::U32, + Column::U64(_) => ValueKind::U64, + Column::U128(_) => ValueKind::U128, + Column::I8(_) => ValueKind::I8, + Column::I16(_) => ValueKind::I16, + Column::I32(_) => ValueKind::I32, + Column::I64(_) => ValueKind::I64, + Column::I128(_) => ValueKind::I128, + Column::Bool(_) => ValueKind::Bool, + Column::String(_) => ValueKind::String, + Column::Index(_) => ValueKind::Index, + Column::Ref(_) => ValueKind::Reference, + Column::Reference((table,index)) => table.borrow().kind(), + Column::Time(_) => ValueKind::Time, + Column::Speed(_) => ValueKind::Speed, + Column::Length(_) => ValueKind::Length, + Column::Angle(_) => ValueKind::Angle, + Column::Any(_) => ValueKind::Any, + Column::Empty => ValueKind::Empty, + } + } +} + +#[macro_export] +macro_rules! unwrap_column { + ($function_name:tt,$type:tt) => ( + pub fn $function_name(&self) -> Option<&ColumnV<$type>> { + match self { + Column::$type(c) => Some(c), + _ => None, + } + } + ) +} + +#[derive(Clone)] +pub struct ColumnV(Rc>>); + +impl ColumnV { + + pub fn new(vec: Vec) -> ColumnV { + ColumnV(Rc::new(RefCell::new(vec))) + } + + pub fn len(&self) -> usize { + let ColumnV(col) = self; + col.borrow().len() + } + + pub fn extend(&self, other: &ColumnV) { + let mut col_brrw = self.borrow_mut(); + let other_brrw = other.borrow(); + col_brrw.append(&mut other_brrw.clone()); + } + + pub fn get_unchecked(&self, row: usize) -> T { + let ColumnV(col) = self; + let mut c_brrw = col.borrow(); + c_brrw[row].clone() + } + + pub fn set_unchecked(&mut self, row: usize, value: T) { + let ColumnV(col) = self; + let mut c_brrw = col.borrow_mut(); + c_brrw[row] = value; + } + + pub fn borrow(&self) -> std::cell::Ref> { + let ColumnV(col) = self; + col.borrow() + } + + pub fn borrow_mut(&self) -> std::cell::RefMut> { + let ColumnV(col) = self; + col.borrow_mut() + } + +} + +impl fmt::Debug for ColumnV { + #[inline] + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + let ColumnV(col) = self; + let col_brrw = col.borrow(); + write!(f,"[")?; + for c in col_brrw.iter().map(|c| format!("{:?}",c)).intersperse(", ".to_string()) { + write!(f,"{}",c)?; + } + write!(f,"]")?; + Ok(()) + } +} + +mech_type!(F32,f32); +mech_type!(F64,f64); +mech_type!(U8,u8); +mech_type!(U16,u16); +mech_type!(U32,u32); +mech_type!(U64,u64); +mech_type!(U128,u128); +mech_type!(I8,i8); +mech_type!(I16,i16); +mech_type!(I32,i32); +mech_type!(I64,i64); +mech_type!(I128,i128); +mech_neg!(I8); +mech_neg!(I16); +mech_neg!(I32); +mech_neg!(I64); +mech_neg!(I128); +mech_neg!(F32); +mech_neg!(F64); + +impl Zero for U8 { + fn zero() -> Self { + U8::new(0) + } + fn is_zero(&self) -> bool { + self.0 == 0 + } +} + +impl Zero for U16 { + fn zero() -> Self { + U16::new(0) + } + fn is_zero(&self) -> bool { + self.0 == 0 + } +} + +impl Zero for U32 { + fn zero() -> Self { + U32::new(0) + } + fn is_zero(&self) -> bool { + self.0 == 0 + } +} + +impl Zero for U64 { + fn zero() -> Self { + U64::new(0) + } + fn is_zero(&self) -> bool { + self.0 == 0 + } +} + +impl Zero for U128 { + fn zero() -> Self { + U128::new(0) + } + fn is_zero(&self) -> bool { + self.0 == 0 + } +} + +impl Zero for I8 { + fn zero() -> Self { + I8::new(0) + } + fn is_zero(&self) -> bool { + self.0 == 0 + } +} + +impl Zero for I16 { + fn zero() -> Self { + I16::new(0) + } + fn is_zero(&self) -> bool { + self.0 == 0 + } +} + +impl Zero for I32 { + fn zero() -> Self { + I32::new(0) + } + fn is_zero(&self) -> bool { + self.0 == 0 + } +} + +impl Zero for I64 { + fn zero() -> Self { + I64::new(0) + } + fn is_zero(&self) -> bool { + self.0 == 0 + } +} + +impl Zero for I128 { + fn zero() -> Self { + I128::new(0) + } + fn is_zero(&self) -> bool { + self.0 == 0 + } +} + +impl Zero for F32 { + fn zero() -> Self { + F32::new(0.0) + } + fn is_zero(&self) -> bool { + self.0 == 0.0 + } +} + +impl Zero for F64 { + fn zero() -> Self { + F64::new(0.0) + } + fn is_zero(&self) -> bool { + self.0 == 0.0 + } +} + +mech_type_conversion!(U8,F32,f32); +mech_type_conversion!(U8,F64,f64); +mech_type_conversion!(U8,U128,u128); +mech_type_conversion!(U8,U64,u64); +mech_type_conversion!(U8,U32,u32); +mech_type_conversion!(U8,U16,u16); +mech_type_conversion!(F32,U8,u8); +mech_type_conversion!(F32,U16,u16); +mech_type_conversion!(F32,U32,u32); +mech_type_conversion!(F32,U64,u64); +mech_type_conversion!(F32,U128,u128); +mech_type_conversion!(F32,F64,f64); +mech_type_conversion!(F32,I8,i8); +mech_type_conversion!(F32,I16,i16); +mech_type_conversion!(F32,I32,i32); +mech_type_conversion!(F32,I64,i64); +mech_type_conversion!(F32,I128,i128); +mech_type_conversion!(I8,I16,i16); +mech_type_conversion!(I8,I32,i32); +mech_type_conversion!(I8,I64,i64); +mech_type_conversion!(I8,I128,i128); +mech_type_conversion!(I8,F32,f32); +mech_type_conversion!(I8,F64,f64); +mech_type_conversion!(I16,I32,i32); +mech_type_conversion!(I16,I64,i64); +mech_type_conversion!(I16,I128,i128); +mech_type_conversion!(I16,F32,f32); +mech_type_conversion!(I16,F64,f64); +mech_type_conversion!(I32,I64,i64); +mech_type_conversion!(I32,I128,i128); +mech_type_conversion!(I32,F32,f32); +mech_type_conversion!(I32,F64,f64); +mech_type_conversion!(I64,F32,f32); +mech_type_conversion!(I64,I128,i128); +mech_type_conversion!(I64,F64,f64); +mech_type_conversion!(I128,F32,f32); +mech_type_conversion!(I128,F64,f64); +mech_type_conversion!(F64,U8,u8); +mech_type_conversion!(F64,U16,u16); +mech_type_conversion!(F64,U32,u32); +mech_type_conversion!(F64,U64,u64); +mech_type_conversion!(F64,U128,u128); +mech_type_conversion!(F64,I8,i8); +mech_type_conversion!(F64,I16,i16); +mech_type_conversion!(F64,I32,i32); +mech_type_conversion!(F64,I64,i64); +mech_type_conversion!(F64,I128,i128); +mech_type_conversion!(F64,F32,f32); +mech_type_conversion!(U16,U32,u32); +mech_type_conversion!(U16,U64,u64); +mech_type_conversion!(U16,U128,u128); +mech_type_conversion!(U16,F32,f32); +mech_type_conversion!(U16,F64,f64); +mech_type_conversion!(U32,U64,u64); +mech_type_conversion!(U32,U128,u128); +mech_type_conversion!(U32,F32,f32); +mech_type_conversion!(U32,F64,f64); +mech_type_conversion!(U64,U8,u8); +mech_type_conversion!(U64,U128,u128); +mech_type_conversion!(U64,F32,f32); +mech_type_conversion!(U64,F64,f64); +mech_type_conversion!(U128,F32,f32); +mech_type_conversion!(U128,F64,f64); +mech_type_conversion_raw!(U8,u8); +mech_type_conversion_raw!(U16,u16); +mech_type_conversion_raw!(U32,u32); +mech_type_conversion_raw!(U64,u32); +mech_type_conversion_raw!(U64,u64); +mech_type_conversion_raw!(U64,i32); +mech_type_conversion_raw!(U64,f32); +mech_type_conversion_raw!(U64,f64); +mech_type_conversion_raw!(U128,u32); +mech_type_conversion_raw!(U128,u128); +mech_type_conversion_raw!(I8,i8); +mech_type_conversion_raw!(I16,i16); +mech_type_conversion_raw!(I32,i32); +mech_type_conversion_raw!(I64,i64); +mech_type_conversion_raw!(I128,u32); +mech_type_conversion_raw!(I128,i128); +mech_type_conversion_raw!(F32,i32); +mech_type_conversion_raw!(F32,f32); +mech_type_conversion_raw!(F32,f64); +mech_type_conversion_raw!(F32,u64); +mech_type_conversion_raw!(F32,usize); + +mech_value_conversion!(U8,U8); +mech_value_conversion!(U16,U16); +mech_value_conversion!(U32,U32); +mech_value_conversion!(U64,U64); +mech_value_conversion!(U128,U128); +mech_value_conversion!(I8,I8); +mech_value_conversion!(I16,I16); +mech_value_conversion!(I32,I32); +mech_value_conversion!(I64,I64); +mech_value_conversion!(I128,I128); +mech_value_conversion!(F32,F32); +mech_value_conversion!(F64,F64); +mech_value_conversion!(MechString,String); + +#[macro_export] +macro_rules! mech_type { + ($wrapper:tt,$type:tt) => ( + use std::fmt::*; + use num_traits::*; + use std::ops::*; + #[derive(Copy,Clone,PartialEq,PartialOrd,Serialize,Deserialize)] + pub struct $wrapper($type); + impl $wrapper { + pub fn new(inner: $type) -> $wrapper { + $wrapper(inner) + } + pub fn kind(&self) -> ValueKind { + ValueKind::$wrapper + } + pub fn unwrap(&self) -> $type { + self.0 + } + } + impl Add for $wrapper { + type Output = $wrapper; + fn add(self, rhs: $wrapper) -> $wrapper { + let ($wrapper(lhs),$wrapper(rhs)) = (self,rhs); + $wrapper(lhs + rhs) + } + } + impl Sub for $wrapper { + type Output = $wrapper; + fn sub(self, rhs: $wrapper) -> $wrapper { + let ($wrapper(lhs),$wrapper(rhs)) = (self,rhs); + $wrapper(lhs - rhs) + } + } + impl Mul for $wrapper { + type Output = $wrapper; + fn mul(self, rhs: $wrapper) -> $wrapper { + let ($wrapper(lhs),$wrapper(rhs)) = (self,rhs); + $wrapper(lhs * rhs) + } + } + impl Div for $wrapper { + type Output = $wrapper; + fn div(self, rhs: $wrapper) -> $wrapper { + let ($wrapper(lhs),$wrapper(rhs)) = (self,rhs); + $wrapper(lhs / rhs) + } + } + impl AddAssign for $wrapper { + fn add_assign(&mut self, other: Self) { + let ($wrapper(lhs),$wrapper(rhs)) = (&self,other); + *self = $wrapper(*lhs + rhs); + } + } + impl SubAssign for $wrapper { + fn sub_assign(&mut self, other: Self) { + let ($wrapper(lhs),$wrapper(rhs)) = (&self,other); + *self = $wrapper(*lhs - rhs); + } + } + impl MulAssign for $wrapper { + fn mul_assign(&mut self, other: Self) { + let ($wrapper(lhs),$wrapper(rhs)) = (&self,other); + *self = $wrapper(*lhs * rhs); + } + } + impl DivAssign for $wrapper { + fn div_assign(&mut self, other: Self) { + let ($wrapper(lhs),$wrapper(rhs)) = (&self,other); + *self = $wrapper(*lhs / rhs); + } + } + impl fmt::Debug for $wrapper { + #[inline] + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + let $wrapper(col) = self; + write!(f,"{}",col)?; + Ok(()) + } + } + ) +} + +impl From for MechString { + fn from(n: bool) -> MechString { + MechString{chars: format!("{:?}", n).chars().collect()} + } +} + +impl From for Value { + fn from(n: TableId) -> Value { + Value::Reference(n) + } +} + +impl From for Value { + fn from(n: bool) -> Value { + Value::Bool(n) + } +} + +macro_rules! pow_impl { + ($t:ty) => { + pow_impl!($t, u8); + pow_impl!($t, usize); + }; + ($t:ty, $rhs:ty) => { + pow_impl!($t, $rhs, usize, pow); + }; + ($t:tt, $rhs:tt, $rhs_t:tt, $method:expr) => { + impl Pow<$rhs> for $t { + type Output = $t; + #[inline] + fn pow(self, rhs: $rhs) -> $t { + let ($t(lhs),$rhs(rhs)) = (self,rhs); + $t(($method)(lhs, >::from(rhs))) + } + } + + impl<'a> Pow<&'a $rhs> for $t { + type Output = $t; + #[inline] + fn pow(self, rhs: &'a $rhs) -> $t { + let ($t(lhs),$rhs(rhs)) = (self,rhs); + $t(($method)(lhs, >::from(*rhs))) + } + } + + impl<'a> Pow<$rhs> for &'a $t { + type Output = $t; + #[inline] + fn pow(self, rhs: $rhs) -> $t { + let ($t(lhs),$rhs(rhs)) = (self,rhs); + $t(($method)(*lhs, >::from(rhs))) + } + } + + impl<'a, 'b> Pow<&'a $rhs> for &'b $t { + type Output = $t; + #[inline] + fn pow(self, rhs: &'a $rhs) -> $t { + let ($t(lhs),$rhs(rhs)) = (self,rhs); + $t(($method)(*lhs, >::from(*rhs))) + } + } + }; +} + +pow_impl!(U8, U8, u8, u8::pow); +pow_impl!(U8, U16, u16, u8::pow); +pow_impl!(U8, U32, u32, u8::pow); +pow_impl!(I8, U8, u8, i8::pow); +pow_impl!(I8, U16, u16, i8::pow); +pow_impl!(I8, U32, u32, i8::pow); +pow_impl!(U16, U8, u8, u16::pow); +pow_impl!(U16, U16, u16, u16::pow); +pow_impl!(U16, U32, u32, u16::pow); +pow_impl!(I16, U8, u8, i16::pow); +pow_impl!(I16, U16, u16, i16::pow); +pow_impl!(I16, U32, u32, i16::pow); +pow_impl!(U32, U8, u8, u32::pow); +pow_impl!(U32, U16, u16, u32::pow); +pow_impl!(U32, U32, u32, u32::pow); +pow_impl!(I32, U8, u8, i32::pow); +pow_impl!(I32, U16, u16, i32::pow); +pow_impl!(I32, U32, u32, i32::pow); +pow_impl!(I64, U8, u8, i64::pow); +pow_impl!(I64, U16, u16, i64::pow); +pow_impl!(I64, U32, u32, i64::pow); +pow_impl!(I128, U8, u8, i128::pow); +pow_impl!(I128, U16, u16, i128::pow); +pow_impl!(I128, U32, u32, i128::pow); + +mech_powf!(F32,f32); + + +// These are just to get things compiling. We should +// to a better job implementing these. +mech_pow_dummy!(I8,I8); +mech_pow_dummy!(I16,I16); +mech_pow_dummy!(I32,I32); +mech_pow_dummy!(I64,I64); +mech_pow_dummy!(I128,I128); +mech_pow_dummy!(U128,U128); +mech_pow_dummy!(U64,U64); + +// powf64 dummy +impl> Pow for F64 { + type Output = F64; + fn pow(self, rhs: T) -> F64 { + let (F64(lhs),rhs) = (self,F64); + F64(0.0) + } +} + +#[macro_export] +macro_rules! mech_pow_dummy{ + ($wrapper:tt,$rhs:tt) => ( + impl> Pow for $wrapper { + type Output = $wrapper; + fn pow(self, rhs: T) -> $wrapper { + let ($wrapper(lhs),rhs) = (self,rhs); + $wrapper(0) + } + } + ) +} + +#[macro_export] +macro_rules! mech_powf{ + ($wrapper:tt,$rhs:tt) => ( + impl> Pow for $wrapper { + type Output = $wrapper; + fn pow(self, rhs: T) -> $wrapper { + let ($wrapper(lhs),rhs) = (self,rhs); + $wrapper(lhs.powf(T::into(rhs))) + } + } + ) +} + +#[macro_export] +macro_rules! mech_neg { + ($wrapper:tt) => ( + impl Neg for $wrapper { + type Output = $wrapper; + fn neg(self) -> $wrapper { + let $wrapper(val) = self; + $wrapper(-val) + } + } + ) +} + +#[macro_export] +macro_rules! mech_type_conversion { + ($from_wrapper:tt,$to_wrapper:tt,$to_type:tt) => ( + impl From<$from_wrapper> for $to_wrapper { + fn from(n: $from_wrapper) -> $to_wrapper { + let $from_wrapper(c) = n; + $to_wrapper(c as $to_type) + } + } + ) +} + +#[macro_export] +macro_rules! mech_type_conversion_raw { + ($from_wrapper:tt,$to_type:tt) => ( + impl From<$from_wrapper> for $to_type { + fn from(n: $from_wrapper) -> $to_type { + let $from_wrapper(c) = n; + c as $to_type + } + } + ) +} + +#[macro_export] +macro_rules! mech_value_conversion { + ($from_wrapper:tt,$to_type:tt) => ( + impl From<$from_wrapper> for Value { + fn from(n: $from_wrapper) -> Value { + Value::$to_type(n) + } + } + ) +} \ No newline at end of file diff --git a/src/core/src/core.rs b/src/core/src/core.rs new file mode 100644 index 0000000..38b1660 --- /dev/null +++ b/src/core/src/core.rs @@ -0,0 +1,594 @@ +use crate::*; +#[cfg(feature = "stdlib")] +use crate::function::{ + math::*, + math_update::*, + compare::*, + stats::*, + table::*, + set::*, + logic::*, + matrix::*, +}; +use crate::capabilities::*; + +use hashbrown::{HashMap, HashSet}; +use std::rc::Rc; +use std::cell::RefCell; +use rand::rngs::OsRng; +use rand::RngCore; +use ed25519_dalek::PublicKey; + +pub type BlockRef = Rc>; + +/* +The Functions struct serves as a container for managing custom functions implemented as MechFunctionCompiler +objects. Stored in a HashMap, these custom functions can be accessed, inserted, and extended during the execution +of a Mech program. This enables the Mech runtime to integrate user-defined functionality, making it more versatile +and adaptable to various use cases by allowing users to add their own functions tailored to their specific requirements. +*/ + +pub struct Functions{ + pub functions: HashMap>, +} + +impl Functions { + fn new () -> Functions { + Functions { + functions: HashMap::new(), + } + } + pub fn get(&self, key: u64) -> std::option::Option<&Box> { + self.functions.get(&key) + } + pub fn insert(&mut self, key: u64, mut fxn: Box) { + self.functions.insert(key,fxn); + } + + pub fn extend(&mut self, other: HashMap>) { + self.functions.extend(other); + } + +} + +impl fmt::Debug for Functions { + #[inline] + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f,"Functions...")?; + Ok(()) + } +} + + +/* +The Core struct is the central component of the Mech programming language +runtime, containing a variety of fields and methods for managing data +structures used during program execution. It provides functionality for loading +and processing transactions, managing errors, interacting with tables, +scheduling blocks for execution, and loading user-defined functions. + +Additionally, the Core struct supports dynamic loading of sections of a Mech +program, making it useful for large and complex programs. +*/ + +pub struct Core { + pub id: u64, + pub public_key: PublicKey, + pub sections: Vec>, + pub blocks: HashMap, + pub unsatisfied_blocks: HashMap, + pub database: Rc>, + pub functions: Rc>, + pub user_functions: Rc>>, + pub required_functions: HashSet, + pub errors: HashMap>, + pub full_errors: HashMap>, + pub input: HashSet, + pub output: HashSet, + pub defined_tables: HashSet, + pub schedule: Schedule, + pub dictionary: StringDictionary, + pub capabilities: Vec, +} + +impl Core { + + pub fn new() -> Core { + + let mut functions = Functions::new(); + // ----------------- + // Standard Machines + // ----------------- + let dictionary = Rc::new(RefCell::new(HashMap::new())); + #[cfg(feature = "stdlib")] + { + let mut dict = dictionary.borrow_mut(); + // Math + functions.insert(*MATH_ADD, Box::new(MathAdd{})); dict.insert(*MATH_ADD,MechString::from_str("math/add")); + functions.insert(*MATH_SUBTRACT, Box::new(MathSub{})); dict.insert(*MATH_SUBTRACT,MechString::from_str("math/subtract")); + functions.insert(*MATH_MULTIPLY, Box::new(MathMul{})); dict.insert(*MATH_MULTIPLY,MechString::from_str("math/multiply")); + functions.insert(*MATH_DIVIDE, Box::new(MathDiv{})); dict.insert(*MATH_DIVIDE,MechString::from_str("math/divide")); + functions.insert(*MATH_EXPONENT, Box::new(MathExp{})); dict.insert(*MATH_EXPONENT,MechString::from_str("math/exp")); + functions.insert(*MATH_NEGATE, Box::new(MathNegate{})); dict.insert(*MATH_NEGATE,MechString::from_str("math/negate")); + functions.insert(*MATH_ADD__UPDATE, Box::new(MathAddUpdate{})); dict.insert(*MATH_ADD__UPDATE,MechString::from_str("math/add-update")); + functions.insert(*MATH_SUBTRACT__UPDATE, Box::new(MathSubtractUpdate{})); dict.insert(*MATH_SUBTRACT__UPDATE,MechString::from_str("math/subtract-update")); + functions.insert(*MATH_MULTIPLY__UPDATE, Box::new(MathMultiplyUpdate{})); dict.insert(*MATH_MULTIPLY__UPDATE,MechString::from_str("math/multiply-update")); + functions.insert(*MATH_DIVIDE__UPDATE, Box::new(MathDivideUpdate{})); dict.insert(*MATH_DIVIDE__UPDATE,MechString::from_str("math/divide-update")); + + // Matrix + functions.insert(*MATRIX_MULTIPLY, Box::new(MatrixMul{})); + functions.insert(*MATRIX_TRANSPOSE, Box::new(MatrixTranspose{})); + + // Logic + functions.insert(*LOGIC_NOT, Box::new(LogicNot{})); + functions.insert(*LOGIC_AND, Box::new(LogicAnd{})); + functions.insert(*LOGIC_OR, Box::new(LoigicOr{})); + functions.insert(*LOGIC_XOR, Box::new(LogicXor{})); + + // Compare + functions.insert(*COMPARE_GREATER__THAN, Box::new(CompareGreater{})); + functions.insert(*COMPARE_LESS__THAN, Box::new(CompareLess{})); + functions.insert(*COMPARE_GREATER__THAN__EQUAL, Box::new(CompareGreaterEqual{})); + functions.insert(*COMPARE_LESS__THAN__EQUAL, Box::new(CompareLessEqual{})); + functions.insert(*COMPARE_EQUAL, Box::new(CompareEqual{})); + functions.insert(*COMPARE_NOT__EQUAL, Box::new(CompareNotEqual{})); + + // Table + functions.insert(*TABLE_APPEND, Box::new(TableAppend{})); + functions.insert(*TABLE_RANGE, Box::new(TableRange{})); + functions.insert(*TABLE_SPLIT, Box::new(TableSplit{})); + functions.insert(*TABLE_FLATTEN, Box::new(TableFlatten{})); + functions.insert(*TABLE_DEFINE, Box::new(TableDefine{})); + functions.insert(*TABLE_SET, Box::new(TableSet{})); + functions.insert(*TABLE_HORIZONTAL__CONCATENATE, Box::new(TableHorizontalConcatenate{})); + functions.insert(*TABLE_VERTICAL__CONCATENATE, Box::new(TableVerticalConcatenate{})); + functions.insert(*TABLE_SIZE, Box::new(TableSize{})); + functions.insert(*TABLE_FOLLOWED__BY, Box::new(TableFollowedBy{})); + + // Stats + functions.insert(*STATS_SUM, Box::new(StatsSum{})); + + // Set + functions.insert(*SET_ANY, Box::new(SetAny{})); + functions.insert(*SET_ALL, Box::new(SetAll{})); + functions.insert(*SET_CARTESIAN, Box::new(SetCartesian{})); + } + + let mut key = [0u8; 16]; + OsRng.fill_bytes(&mut key); + let core_id = OsRng.next_u64(); + let name = format!("core-{:?}",core_id); + let mut default_caps = HashSet::new(); + default_caps.insert(Capability::CoreDatabaseRead); + default_caps.insert(Capability::CoreDatabaseWrite); + + let mut core_cap_token = CapabilityToken::new(name,default_caps,core_id,None); + let keypair = generate_keypair(); + core_cap_token.sign(&keypair); + + Core { + id: core_id, + public_key: keypair.public, + sections: Vec::new(), + blocks: HashMap::new(), + unsatisfied_blocks: HashMap::new(), + database: Rc::new(RefCell::new(Database::new())), + functions: Rc::new(RefCell::new(functions)), + user_functions: Rc::new(RefCell::new(HashMap::new())), + required_functions: HashSet::new(), + errors: HashMap::new(), + full_errors: HashMap::new(), + schedule: Schedule::new(), + input: HashSet::new(), + output: HashSet::new(), + defined_tables: HashSet::new(), + dictionary: dictionary, + capabilities: vec![core_cap_token], + } + } + + pub fn get_name(&self, name_id: u64) -> Option { + match self.dictionary.borrow().get(&name_id) { + Some(mech_string) => Some(mech_string.to_string()), + None => None, + } + } + + pub fn load_function(&mut self, name: &str, mut fxn: Box) -> Result<(),MechError> { + let mut functions_brrw = self.functions.borrow_mut(); + functions_brrw.insert(hash_str(name),fxn); + Ok(()) + } + + pub fn needed_registers(&self) -> HashSet { + self.input.difference(&self.defined_tables).cloned().collect() + } + + pub fn process_transaction(&mut self, txn: &Transaction) -> Result<(Vec,HashSet),MechError> { + let mut block_refs = vec![]; + let changed_registers = self.database.borrow_mut().process_transaction(txn)?; + for (changed_table_id,_,_) in &changed_registers { + let mut cured_block_refs = self.remove_error(*changed_table_id)?; + block_refs.append(&mut cured_block_refs); + } + for register in &changed_registers { + self.step(register); + } + Ok((block_refs,changed_registers)) + } + + pub fn has_pending_transactions(&mut self) -> bool { + !(self.database.borrow().transaction_queue.is_empty()) + } + + pub fn process_transaction_queue(&mut self) -> Result<(Vec,HashSet),MechError> { + let mut block_refs = vec![]; + let changed_registers = self.database.borrow_mut().process_transaction_queue()?; + for (changed_table_id,_,_) in &changed_registers { + let mut cured_block_refs = self.remove_error(*changed_table_id)?; + block_refs.append(&mut cured_block_refs); + } + for register in &changed_registers { + self.step(register); + } + Ok((block_refs,changed_registers)) + } + + pub fn remove_error(&mut self, table_id: TableId) -> Result,MechError> { + let mut block_refs = vec![]; + match &self.errors.remove(&MechErrorKind::MissingTable(table_id)) { + Some(ref ublocks) => { + let mut mb = ublocks.clone(); + block_refs.append(&mut mb); + } + None => (), + } + match self.errors.remove(&MechErrorKind::PendingTable(table_id)) { + Some(ref ublocks) => { + let mut mb = ublocks.clone(); + block_refs.append(&mut mb); + } + None => (), + } + self.load_block_refs(block_refs.clone()); + self.schedule_blocks(); + let mut graph_output = vec![]; + match self.schedule.trigger_to_output.get(&(table_id,RegisterIndex::All,RegisterIndex::All)) { + Some(output) => { + for (table_id,_,_) in output { + graph_output.push(table_id.clone()); + } + } + None => (), + } + for table_id in graph_output { + self.remove_error(table_id); + } + Ok(block_refs) + } + + pub fn insert_table(&mut self, table: Table) -> Result { + self.database.borrow_mut().insert_table(table) + } + + pub fn overwrite_tables(&mut self, tables: &Vec) -> Result<(),MechError> { + let mut database_brrw = self.database.borrow_mut(); + for table in tables { + let table2 = database_brrw.get_table_by_id(&table.id).unwrap(); + } + Ok(()) + } + + pub fn get_table(&self, table_name: &str) -> Result { + match self.database.borrow().get_table(table_name) { + Some(table) => Ok(table.clone()), + None => {return Err(MechError{msg: "".to_string(), id: 1004, kind: MechErrorKind::MissingTable(TableId::Global(hash_str(table_name)))});}, + } + } + + pub fn get_table_by_id(&self, table_id: u64) -> Result { + match self.database.borrow().get_table_by_id(&table_id) { + Some(table) => Ok(table.clone()), + None => {return Err(MechError{msg: "".to_string(), id: 1005, kind: MechErrorKind::MissingTable(TableId::Global(table_id))});}, + } + } + + pub fn table_names(&self) -> Vec { + self.database.borrow().tables.iter().filter_map(|(_,t)| { + t.borrow().name() + }).collect::>() + } + + pub fn recompile_dynamic_tables(&mut self, register: Register) -> Result<(),MechError> { + match self.schedule.schedules.get(®ister) { + Some(schedules) => { + for schedule in schedules { + schedule.recompile_blocks()?; + } + } + None => (), + } + + Ok(()) + } + + pub fn load_sections(&mut self, sections: Vec>) -> Vec<((Vec,Vec,Vec))> { + let mut result = vec![]; + for elements in sections.iter() { + let mut block_ids_agg = vec![]; + let mut fxn_ids = vec![]; + let mut errors_agg = vec![]; + for section_element in elements.iter() { + match section_element { + SectionElement::Block(block) => { + let (mut block_ids, mut errors) = self.load_blocks(&vec![block.clone()]); + block_ids_agg.append(&mut block_ids); + errors_agg.append(&mut errors); + } + SectionElement::UserFunction(fxn) => { + self.load_user_function(fxn); + } + } + } + result.push((block_ids_agg,fxn_ids,errors_agg)); + } + result + } + + pub fn load_user_function(&mut self, user_function: &UserFunction) -> Result<(),MechError> { + + let mut usr_fxns_brrw = self.user_functions.borrow_mut(); + + usr_fxns_brrw.insert(user_function.name,user_function.clone()); + + Ok(()) + } + + pub fn load_block_refs(&mut self, mut blocks: Vec) -> (Vec,Vec) { + let mut block_ids = vec![]; + let mut block_errors = vec![]; + for block in blocks { + let (mut new_block_ids, mut new_block_errors, mut new_block_output) = self.load_block(block.clone()); + block_ids.append(&mut new_block_ids); + block_errors.append(&mut new_block_errors); + for register in new_block_output.iter() { + self.step(register); + } + self.schedule_blocks(); + //self.recompile_dynamic_tables(); + } + (block_ids,block_errors) + } + + pub fn load_blocks(&mut self, mut blocks: &Vec) -> (Vec,Vec) { + let mut block_ids = vec![]; + let mut block_errors = vec![]; + for block in blocks { + let (mut new_block_ids, mut new_block_errors, mut new_block_output) = self.load_block(Rc::new(RefCell::new(block.clone()))); + block_ids.append(&mut new_block_ids); + block_errors.append(&mut new_block_errors); + for register in new_block_output.iter() { + self.step(register); + } + self.schedule_blocks(); + //self.recompile_dynamic_tables(); + } + (block_ids,block_errors) + } + + pub fn load_block(&mut self, mut block_ref: BlockRef) -> (Vec,Vec,HashSet) { + let block_ref_c = block_ref.clone(); + let mut new_block_ids = vec![]; + let mut new_block_errors = vec![]; + let mut new_block_output = HashSet::new(); + { + let mut block_brrw = block_ref.borrow_mut(); + let temp_db = block_brrw.global_database.clone(); + block_brrw.global_database = self.database.clone(); + block_brrw.functions = Some(self.functions.clone()); + block_brrw.user_functions = Some(self.user_functions.clone()); + // Merge databases + { + let mut temp_db_brrw = temp_db.borrow(); + match self.database.try_borrow_mut() { + Ok(ref mut database_brrw) => { + database_brrw.union(&mut temp_db_brrw); + } + Err(_) => () + } + } + // Merge dictionaries + for (k,v) in block_brrw.strings.borrow().iter() { + self.dictionary.borrow_mut().insert(*k,v.clone()); + } + // Merge dictionaries + for fxn_id in block_brrw.required_functions.iter() { + self.required_functions.insert(*fxn_id); + } + // try to satisfy the block + match block_brrw.ready() { + Ok(()) => { + + let id = block_brrw.gen_id(); + + // Merge input and output + self.input = self.input.union(&mut block_brrw.input).cloned().collect(); + self.output = self.output.union(&mut block_brrw.output).cloned().collect(); + self.defined_tables = self.defined_tables.union(&mut block_brrw.defined_tables).cloned().collect(); + { + let mut database_brrw = self.database.borrow_mut(); + database_brrw.dynamic_tables = database_brrw.dynamic_tables.union(&mut block_brrw.dynamic_tables).cloned().collect(); + } + self.schedule.add_block(block_ref.clone()); + self.blocks.insert(id,block_ref_c.clone()); + + // Try to satisfy other blocks + let mut block_output = block_brrw.output.clone(); + new_block_output = new_block_output.union(&mut block_output).cloned().collect(); + let mut resolved_tables: Vec = block_output.iter().map(|(table_id,_,_)| MechErrorKind::MissingTable(*table_id)).collect(); + let mut resolved_pending_tables: Vec = block_output.iter().map(|(table_id,_,_)| MechErrorKind::PendingTable(*table_id)).collect(); + resolved_tables.append(&mut resolved_pending_tables); + new_block_ids.push(id); + let (mut newly_resolved_block_ids, mut new_errors, mut new_output) = self.resolve_errors(&resolved_tables); + new_block_output = new_block_output.union(&mut new_output).cloned().collect(); + new_block_ids.append(&mut newly_resolved_block_ids); + new_block_errors.append(&mut new_errors); + } + Err(x) => { + // Merge input and output + self.input = self.input.union(&mut block_brrw.input).cloned().collect(); + self.output = self.output.union(&mut block_brrw.output).cloned().collect(); + let (mech_error,_) = block_brrw.unsatisfied_transformation.as_ref().unwrap(); + let blocks_with_errors = self.full_errors.entry(mech_error.clone()).or_insert(Vec::new()); + blocks_with_errors.push(block_ref_c.clone()); + let blocks_with_errors = self.errors.entry(mech_error.kind.clone()).or_insert(Vec::new()); + blocks_with_errors.push(block_ref_c.clone()); + self.unsatisfied_blocks.insert(0,block_ref_c.clone()); + let error = MechError{msg: "".to_string(), id: 1006, kind: MechErrorKind::GenericError(format!("{:?}", x))}; + new_block_errors.push(error); + }, + }; + } + self.unsatisfied_blocks.drain_filter(|k,v| { + let state = { + match v.try_borrow() { + Ok(brrw) => brrw.state.clone(), + Err(_) => BlockState::Pending, + } + }; + state == BlockState::Ready + }); + + (new_block_ids,new_block_errors,new_block_output) + } + + pub fn resolve_errors(&mut self, resolved_errors: &Vec) -> (Vec,Vec,HashSet) { + let mut new_block_ids = vec![]; + let mut new_block_errors = vec![]; + let mut new_block_output = HashSet::new(); + for error in resolved_errors.iter() { + match self.errors.remove(error) { + Some(mut ublocks) => { + for ublock in ublocks { + let (mut nbids,mut nberrs, mut nboutput) = self.load_block(ublock); + { + new_block_ids.append(&mut nbids); + self.unsatisfied_blocks = self.unsatisfied_blocks.drain_filter(|k,v| { + let state = { + match v.try_borrow() { + Ok(brrw) => brrw.state.clone(), + Err(_) => BlockState::Pending, + } + }; + state != BlockState::Ready + }).collect(); + // For each of the new blocks, check to see if any of the tables + // it provides are pending. + let mut new_block_pending_ids = vec![]; + for id in &new_block_ids { + let mut output = { + let block_ref = self.blocks.get(id).unwrap(); + let block_ref_brrw = block_ref.borrow(); + block_ref_brrw.output.clone() + }; + new_block_output = new_block_output.union(&mut output).cloned().collect(); + for (table_id,_,_) in &output { + let (mut resolved, mut errs, mut output) = self.resolve_errors(&vec![MechErrorKind::PendingTable(*table_id)]); + new_block_pending_ids.append(&mut resolved); + new_block_errors.append(&mut errs); + new_block_output = new_block_output.union(&mut output).cloned().collect(); + } + } + new_block_ids.append(&mut new_block_pending_ids); + } + new_block_errors.append(&mut nberrs) + } + } + None => (), + } + } + (new_block_ids,new_block_errors,new_block_output) + } + + pub fn get_output_by_block_id(&self, block_id: BlockId) -> Result,MechError> { + match self.blocks.get(&block_id) { + Some(block_ref) => { + let output = block_ref.borrow().output.clone(); + Ok(output) + } + None => Err(MechError{msg: "".to_string(), id: 1008, kind: MechErrorKind::MissingBlock(block_id)}), + } + } + + pub fn schedule_blocks(&mut self) -> Result<(),MechError> { + self.schedule.schedule_blocks() + } + + pub fn step(&mut self, register: &Register) -> Result<(),MechError> { + self.schedule.run_schedule(register) + } + +} + +impl fmt::Debug for Core { + #[inline] + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + let dictionary = self.dictionary.clone(); + let mut box_drawing = BoxPrinter::new(); + box_drawing.add_title("🤖",&format!("CORE: {:?}", humanize(&self.id))); + if self.errors.len() > 0 { + box_drawing.add_title("🐛","errors"); + for (error,blocks) in self.errors.iter() { + box_drawing.add_line(format!(" - {:?}", error)); + } + } + box_drawing.add_title("📭","input"); + for (table,row,col) in &self.input { + let table = match dictionary.borrow().get(table.unwrap()) { + Some(x) => x.to_string(), + None => format!("{:?}", table), + }; + box_drawing.add_line(format!(" - ({:?}, {:?}, {:?})", table,row,col)); + } + box_drawing.add_title("📬","output"); + for (table,row,col) in &self.output { + let table = match dictionary.borrow().get(table.unwrap()) { + Some(x) => x.to_string(), + None => format!("{:?}", table), + }; + box_drawing.add_line(format!(" - ({:?}, {:?}, {:?})", table,row,col)); + } + box_drawing.add_title("🧊","blocks"); + box_drawing.add_line(format!("{:#?}", &self.blocks.iter().map(|(k,v)|humanize(&k)).collect::>())); + if self.unsatisfied_blocks.len() > 0 { + box_drawing.add_title("😔","unsatisfied blocks"); + box_drawing.add_line(format!("{:#?}", &self.unsatisfied_blocks)); + } + box_drawing.add_title("💻","functions"); + box_drawing.add_line("Compiled Functions".to_string()); + box_drawing.add_line(format!("{:#?}", &self.functions.borrow().functions.iter().map(|(k,v)| + { + match dictionary.borrow().get(k) { + Some(x) => x.to_string(), + None => humanize(&k), + } + }).collect::>())); + box_drawing.add_line("User Functions".to_string()); + box_drawing.add_line(format!("{:#?}", &self.user_functions.borrow().iter().map(|(k,v)| + { + match dictionary.borrow().get(k) { + Some(x) => x.to_string(), + None => humanize(&k), + } + }).collect::>())); + box_drawing.add_title("🦾","capabilities"); + box_drawing.add_line(format!("{:#?}", &self.capabilities)); + box_drawing.add_title("🗓️","schedule"); + box_drawing.add_line(format!("{:#?}", &self.schedule)); + box_drawing.add_title("💾","database"); + box_drawing.add_line(format!("{:#?}", &self.database.borrow())); + write!(f,"{:?}",box_drawing)?; + Ok(()) + } +} + diff --git a/src/core/src/database.rs b/src/core/src/database.rs new file mode 100644 index 0000000..d01bd40 --- /dev/null +++ b/src/core/src/database.rs @@ -0,0 +1,227 @@ +use crate::*; +use crate::core::*; +use hashbrown::{HashMap, HashSet}; +use std::rc::Rc; +use std::cell::RefCell; +use std::fmt; + +#[derive(Clone, Serialize, Deserialize)] +pub enum Change { + Set((u64, Vec<(TableIndex, TableIndex, Value)>)), + NewTable{table_id: u64, rows: usize, columns: usize}, + ColumnAlias{table_id: u64, column_ix: usize, column_alias: u64}, + ColumnKind{table_id: u64, column_ix: usize, column_kind: ValueKind}, +} + +impl fmt::Debug for Change { + #[inline] + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + Change::Set((table_id,args)) => write!(f,"Set({},{:#?})",humanize(table_id),args)?, + Change::NewTable{table_id,rows,columns} => write!(f,"NewTable({},{:?},{:?})",humanize(table_id),rows,columns)?, + Change::ColumnAlias{table_id,column_ix,column_alias} => write!(f,"ColumnAlias({},{:?},{})",humanize(table_id),column_ix,humanize(column_alias))?, + Change::ColumnKind{table_id,column_ix,column_kind} => write!(f,"ColumnKind({},{:?},{:?})",humanize(table_id),column_ix,column_kind)?, + } + Ok(()) + } +} + +pub type Transaction = Vec; +pub type Register = (TableId,RegisterIndex,RegisterIndex); + +#[derive(Clone)] +pub struct Database { + pub transaction_queue: Vec>, + pub dynamic_tables: HashSet, + pub tables: HashMap, + pub table_alias_to_id: HashMap, +} + +impl Database { + pub fn new() -> Database { + Database { + transaction_queue: Vec::new(), + dynamic_tables: HashSet::new(), + tables: HashMap::new(), + table_alias_to_id: HashMap::new(), + } + } + + pub fn clear(&mut self) { + self.dynamic_tables.clear(); + self.tables.clear(); + self.table_alias_to_id.clear(); + } + + pub fn process_transaction_queue(&mut self) -> Result,MechError> { + let mut changed_registers = HashSet::new(); + let queue = self.transaction_queue.clone(); + self.transaction_queue.clear(); + for txn in queue { + let mut r = self.process_transaction(&txn)?; + changed_registers = changed_registers.union(&mut r).cloned().collect(); + } + Ok(changed_registers) + } + + pub fn process_transaction(&mut self, txn: &Transaction) -> Result,MechError> { + let mut changed_registers = HashSet::new(); + for change in txn { + match change { + Change::Set((table_id, adds)) => { + match self.get_table_by_id(table_id) { + Some(table) => { + let table_brrw = table.borrow(); + for (row,col,val) in adds { + match table_brrw.set(row, col, val.clone()) { + Ok(()) => { + // TODO This is inserting a {:,:} register instead of the one passed in, and that needs to be fixed. + changed_registers.insert((TableId::Global(*table_id),RegisterIndex::All,RegisterIndex::All)); + }, + Err(x) => { return Err(MechError{msg: "".to_string(), id: 1719, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + None => {return Err(MechError{msg: "".to_string(), id: 1720, kind: MechErrorKind::MissingTable(TableId::Global(*table_id))});}, + } + } + Change::NewTable{table_id, rows, columns} => { + let table = Table::new(*table_id,rows.clone(),*columns); + self.insert_table(table)?; + } + Change::ColumnAlias{table_id, column_ix, column_alias} => { + match self.get_table_by_id(table_id) { + Some(table) => { + let mut table_brrw = table.borrow_mut(); + let rows = table_brrw.rows; + if *column_ix + 1 > table_brrw.cols { + table_brrw.resize(rows, column_ix + 1); + } + table_brrw.set_col_alias(*column_ix,*column_alias); + } + x => {return Err(MechError{msg: "".to_string(), id: 1721, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + Change::ColumnKind{table_id, column_ix, column_kind} => { + match self.get_table_by_id(table_id) { + Some(table) => { + let mut table_brrw = table.borrow_mut(); + let rows = table_brrw.rows; + if *column_ix + 1 > table_brrw.cols { + table_brrw.resize(rows, column_ix + 1); + } + table_brrw.set_col_kind(*column_ix,column_kind.clone()); + } + x => {return Err(MechError{msg: "".to_string(), id: 1722, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + } + Ok(changed_registers) + } + + + pub fn union(&mut self, other: &Self) -> Result<(),MechError> { + let mut other_tables = other.tables.clone(); + for (id,other_table) in other_tables.drain() { + match self.tables.try_insert(id, other_table.clone()) { + Ok(_) => (), + Err(x) => {return Err(MechError{msg: "".to_string(), id: 1723, kind: MechErrorKind::None});}, + } + } + let mut other_table_aliases = other.table_alias_to_id.clone(); + for (id,other_table) in other_table_aliases.drain() { + match self.table_alias_to_id.try_insert(id, other_table.clone()) { + Ok(_) => (), + Err(x) => {return Err(MechError{msg: "".to_string(), id: 1724, kind: MechErrorKind::None});}, + } + } + Ok(()) + } + + pub fn insert_alias(&mut self, alias: u64, table_id: TableId) -> Result { + match self.table_alias_to_id.try_insert(alias, table_id) { + Err(x) => {return Err(MechError{msg: "".to_string(), id: 1725, kind: MechErrorKind::DuplicateAlias(*table_id.unwrap())});}, + Ok(x) => Ok(*x), + } + } + + pub fn insert_table(&mut self, table: Table) -> Result { + match self.tables.try_insert(table.id, Rc::new(RefCell::new(table))) { + Ok(x) => Ok(x.clone()), + Err(x) => {return Err(MechError{msg: "".to_string(), id: 1726, kind: MechErrorKind::None});}, + } + } + + pub fn overwrite_table(&mut self, table: Table) -> Result { + match self.tables.insert(table.id, Rc::new(RefCell::new(table))) { + Some(x) => Ok(x.clone()), + None => {return Err(MechError{msg: "".to_string(), id: 1726, kind: MechErrorKind::None});}, + } + } + + pub fn insert_table_ref(&mut self, table: TableRef) -> Result { + let table_id = { + let table_brrw = table.borrow(); + table_brrw.id + }; + match self.tables.try_insert(table_id, table) { + Ok(x) => Ok(x.clone()), + Err(x) => {return Err(MechError{msg: "".to_string(), id: 1726, kind: MechErrorKind::None});}, + } + } + + pub fn get_table(&self, table_name: &str) -> Option<&TableRef> { + let alias = hash_str(table_name); + match self.table_alias_to_id.get(&alias) { + Some(table_id) => { + self.tables.get(table_id.unwrap()) + } + _ => self.tables.get(&alias), + } + } + + pub fn get_table_by_id(&self, table_id: &u64) -> Option<&TableRef> { + match self.tables.get(table_id) { + None => { + match self.table_alias_to_id.get(table_id) { + None => None, + Some(table_id) => { + self.tables.get(table_id.unwrap()) + } + } + } + x => x + } + } + + pub fn get_table_by_id_mut(&self, table_id: u64) -> Option<&TableRef> { + let table_id = match self.tables.contains_key(&table_id) { + true => table_id, + false => match self.table_alias_to_id.get(&table_id) { + Some(table_id) => *table_id.unwrap(), + None => return None, + } + }; + self.tables.get(&table_id) + } +} + +impl fmt::Debug for Database { + #[inline] + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + let mut db_drawing = BoxPrinter::new(); + db_drawing.add_header("tables"); + for table in self.tables.values() { + db_drawing.add_line(format!("{:?}", table.borrow())); + } + if self.table_alias_to_id.len() > 0 { + db_drawing.add_header("table alias → table id"); + for (alias,id) in self.table_alias_to_id.iter() { + db_drawing.add_line(format!("{} → {:?}", humanize(alias), id)); + } + } + write!(f,"{:?}",db_drawing)?; + Ok(()) + } +} \ No newline at end of file diff --git a/src/core/src/error.rs b/src/core/src/error.rs new file mode 100644 index 0000000..9e73ad2 --- /dev/null +++ b/src/core/src/error.rs @@ -0,0 +1,76 @@ +// # Errors + +// Defines a struct for errors and an enum which enumerates the error types + +// ## Prelude + +use crate::*; +use crate::nodes::SourceRange; + +type Rows = usize; +type Cols = usize; + +#[derive(Clone, Debug, Eq, PartialEq, Hash, Serialize, Deserialize)] +pub struct MechError { + pub id: u64, + pub kind: MechErrorKind, + pub msg: String, +} + +pub type ParserErrorReport = Vec; + +#[derive(Clone, Debug, Eq, PartialEq, Hash, Serialize, Deserialize)] +pub struct ParserErrorContext { + pub cause_rng: SourceRange, + pub err_message: String, + pub annotation_rngs: Vec, +} + +#[derive(Clone, Debug, Eq, PartialEq, Hash, Serialize, Deserialize)] +pub enum MechErrorKind { + MissingTable(TableId), // TableId of missing table + MissingBlock(BlockId), // BlockId of missing block + PendingTable(TableId), // TableId of pending table + DimensionMismatch(Vec<(Rows,Cols)>), // Argument dimensions are mismatched ((row,col),(row,col)) + //MissingColumn((TableId,TableIndex)), // The identified table is missing a needed column + //ColumnKindMismatch(Vec), // Excepted kind versus given kind + //SubscriptOutOfBounds(((Rows,Cols),(Rows,Cols))), // (target) vs (actual) index + LinearSubscriptOutOfBounds((Rows,Rows)), // (target) vs (actual) index + DuplicateAlias(u64), // Alias ID + //DomainMismatch(u64, u64), // domain IDs (target vs actual) + MissingFunction(u64), // ID of missing function + //TransformationPending(Transformation), // Block is unsatisfied so the transformation is not added + //IncorrectFunctionArgumentType, + ZeroIndex, // Zero cannot ever be used as an index. + BlockDisabled, + IoError, + GenericError(String), + FileNotFound(String), + Unhandled, + UnknownFunctionArgument(u64), + UnknownColumnKind(u64), + UnhandledFunctionArgumentKind(ValueKind), + UnhandledTableShape(TableShape), + TooManyInputArguments(usize,usize), // (given,expected) + ParserError(nodes::ParserNode, ParserErrorReport, String), + MissingCapability(Capability), + InvalidCapabilityToken, + None, +} + +impl From for MechError { + fn from(n: std::io::Error) -> MechError { + MechError{msg: "".to_string(), id: 74892, kind: MechErrorKind::IoError} + } +} + +/* +impl fmt::Debug for MechErrorKind { + #[inline] + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + _ => write!(f,"No Format")?; + } + Ok(()) + } +}*/ \ No newline at end of file diff --git a/src/core/src/function/compare.rs b/src/core/src/function/compare.rs new file mode 100644 index 0000000..9c410a7 --- /dev/null +++ b/src/core/src/function/compare.rs @@ -0,0 +1,824 @@ +use crate::*; +use std::cell::RefCell; +use std::rc::Rc; +use std::fmt::*; +use num_traits::*; +#[cfg(feature = "parallel")] +use rayon::prelude::*; +use std::thread; + +lazy_static! { + pub static ref COMPARE_GREATER__THAN: u64 = hash_str("compare/greater-than"); + pub static ref COMPARE_LESS__THAN: u64 = hash_str("compare/less-than"); + pub static ref COMPARE_GREATER__THAN__EQUAL: u64 = hash_str("compare/greater-than-equal"); + pub static ref COMPARE_LESS__THAN__EQUAL: u64 = hash_str("compare/less-than-equal"); + pub static ref COMPARE_EQUAL: u64 = hash_str("compare/equal"); + pub static ref COMPARE_NOT__EQUAL: u64 = hash_str("compare/not-equal"); +} + +compare_infix_vv!(GreaterVV,>); +compare_infix_vv!(LessVV,<); +compare_infix_vv!(LessEqualVV,<=); +compare_infix_vv!(GreaterEqualVV,>=); +compare_infix_vv!(EqualVV,==); +compare_infix_vv!(NotEqualVV,!=); + +#[cfg(feature = "parallel")] +par_compare_infix_vv!(ParGreaterVV,>); +par_compare_infix_vv!(ParLessVV,<); +#[cfg(feature = "parallel")] +par_compare_infix_vv!(ParLessEqualVV,<=); +#[cfg(feature = "parallel")] +par_compare_infix_vv!(ParGreaterEqualVV,>=); +#[cfg(feature = "parallel")] +par_compare_infix_vv!(ParEqualVV,==); +#[cfg(feature = "parallel")] +par_compare_infix_vv!(ParNotEqualVV,!=); + +compare_infix_vs!(GreaterVS,>); +compare_infix_vs!(LessVS,<); +compare_infix_vs!(LessEqualVS,<=); +compare_infix_vs!(GreaterEqualVS,>=); +compare_infix_vs!(EqualVS,==); +compare_infix_vs!(NotEqualVS,!=); + +#[cfg(feature = "parallel")] +par_compare_infix_vs!(ParGreaterVS,>); +#[cfg(feature = "parallel")] +par_compare_infix_vs!(ParLessVS,<); +#[cfg(feature = "parallel")] +par_compare_infix_vs!(ParLessEqualVS,<=); +#[cfg(feature = "parallel")] +par_compare_infix_vs!(ParGreaterEqualVS,>=); +#[cfg(feature = "parallel")] +par_compare_infix_vs!(ParEqualVS,==); +#[cfg(feature = "parallel")] +par_compare_infix_vs!(ParNotEqualVS,!=); + +compare_infix_sv!(GreaterSV,>); +compare_infix_sv!(LessSV,<); +compare_infix_sv!(LessEqualSV,<=); +compare_infix_sv!(GreaterEqualSV,>=); +compare_infix_sv!(EqualSV,==); +compare_infix_sv!(NotEqualSV,!=); + +#[cfg(feature = "parallel")] +par_compare_infix_sv!(ParGreaterSV,>); +#[cfg(feature = "parallel")] +par_compare_infix_sv!(ParLessSV,<); +#[cfg(feature = "parallel")] +par_compare_infix_sv!(ParLessEqualSV,<=); +#[cfg(feature = "parallel")] +par_compare_infix_sv!(ParGreaterEqualSV,>=); +#[cfg(feature = "parallel")] +par_compare_infix_sv!(ParEqualSV,==); +#[cfg(feature = "parallel")] +par_compare_infix_sv!(ParNotEqualSV,!=); + +compare_infix_dd!(GreaterDD,>); +compare_infix_dd!(LessDD,<); +compare_infix_dd!(LessEqualDD,<=); +compare_infix_dd!(GreaterEqualDD,>=); +compare_infix_dd!(EqualDD,==); +compare_infix_dd!(NotEqualDD,!=); + +compare_infix_ds!(GreaterDS,>); +compare_infix_ds!(LessDS,<); +compare_infix_ds!(LessEqualDS,<=); +compare_infix_ds!(GreaterEqualDS,>=); +compare_infix_ds!(EqualDS,==); +compare_infix_ds!(NotEqualDS,!=); + +compare_eq_compiler!(CompareEqual,EqualVS,EqualSV,EqualVV,EqualDD,EqualDS); +compare_eq_compiler!(CompareNotEqual,NotEqualVS,NotEqualSV,NotEqualVV,NotEqualDD,NotEqualDS); + +compare_compiler!(CompareGreater,GreaterVS,GreaterSV,GreaterVV,GreaterDD,GreaterDS); +compare_compiler!(CompareLess,LessVS,LessSV,LessVV,LessDD,LessDS); +compare_compiler!(CompareGreaterEqual,GreaterEqualVS,GreaterEqualSV,GreaterEqualVV,GreaterEqualDD,GreaterEqualDS); +compare_compiler!(CompareLessEqual,LessEqualVS,LessEqualSV,LessEqualVV,LessEqualDD,LessEqualDS); + +// Vector : Vector +#[macro_export] +macro_rules! compare_infix_vv { + ($func_name:ident, $op:tt) => ( + #[derive(Debug)] + pub struct $func_name + { + pub lhs: (ColumnV, usize, usize), + pub rhs: (ColumnV, usize, usize), + pub out: ColumnV + } + impl MechFunction for $func_name + where T: Clone + Debug + PartialEq + PartialOrd + Into, + U: Clone + Debug + PartialEq + PartialOrd + Into, + { + fn solve(&self) { + let (lhs,lsix,leix) = &self.lhs; + let (rhs,rsix,reix) = &self.rhs; + self.out.borrow_mut() + .iter_mut() + .zip(lhs.borrow()[*lsix..=*leix].iter()) + .zip(rhs.borrow()[*rsix..=*reix].iter()) + .for_each(|((out, lhs), rhs)| *out = *lhs $op U::into(rhs.clone())); + } + fn to_string(&self) -> String { format!("{:#?}", self)} + } + ) +} + + +#[macro_export] +macro_rules! par_compare_infix_vv { + ($func_name:ident, $op:tt) => ( + #[cfg(feature = "parallel")] + #[derive(Debug)] + pub struct $func_name + { + pub lhs: (ColumnV, usize, usize), + pub rhs: (ColumnV, usize, usize), + pub out: ColumnV + } + #[cfg(feature = "parallel")] + impl MechFunction for $func_name + where T: Clone + Debug + PartialEq + PartialOrd + Into + Send + Sync, + U: Clone + Debug + PartialEq + PartialOrd + Into + Send + Sync, + { + fn solve(&self) { + let (lhs,lsix,leix) = &self.lhs; + let (rhs,rsix,reix) = &self.rhs; + self.out.borrow_mut() + .par_iter_mut() + .zip(lhs.borrow()[*lsix..=*leix].par_iter()) + .zip(rhs.borrow()[*rsix..=*reix].par_iter()) + .for_each(|((out, lhs), rhs)| *out = *lhs $op U::into(rhs.clone())); + } + fn to_string(&self) -> String { format!("{:#?}", self)} + } + ) +} + + +// Vector : Scalar +#[macro_export] +macro_rules! compare_infix_vs { + ($func_name:ident, $op:tt) => ( + #[derive(Debug)] + pub struct $func_name + { + pub lhs: (ColumnV, usize, usize), + pub rhs: (ColumnV, usize, usize), + pub out: ColumnV + } + impl MechFunction for $func_name + where T: Clone + Debug + PartialEq + PartialOrd + Into, + U: Clone + Debug + PartialEq + PartialOrd + Into, + { + fn solve(&self) { + let (lhs,lsix,leix) = &self.lhs; + let (rhs,rsix,reix) = &self.rhs; + let rhs = &rhs.borrow()[*rsix]; + self.out.borrow_mut() + .iter_mut() + .zip(lhs.borrow()[*lsix..=*leix].iter()) + .for_each(|(out, lhs)| *out = *lhs $op U::into(rhs.clone())); + } + fn to_string(&self) -> String { format!("{:#?}", self)} + } + ) +} + +#[macro_export] +macro_rules! par_compare_infix_vs { + ($func_name:ident, $op:tt) => ( + #[cfg(feature = "parallel")] + #[derive(Debug)] + pub struct $func_name + { + pub lhs: (ColumnV, usize, usize), + pub rhs: (ColumnV, usize, usize), + pub out: ColumnV + } + impl MechFunction for $func_name + where T: Clone + Debug + PartialEq + PartialOrd + Into + Send + Sync, + U: Clone + Debug + PartialEq + PartialOrd + Into + Send + Sync, + { + fn solve(&self) { + let (lhs,lsix,leix) = &self.lhs; + let (rhs,rsix,reix) = &self.rhs; + let rhs = &rhs.borrow()[*rsix]; + self.out.borrow_mut() + .par_iter_mut() + .zip(lhs.borrow()[*lsix..=*leix].par_iter()) + .for_each(|(out, lhs)| *out = *lhs $op U::into(rhs.clone())); + } + fn to_string(&self) -> String { format!("{:#?}", self)} + } + ) +} + +// Scalar : Vector +#[macro_export] +macro_rules! compare_infix_sv { + ($func_name:ident, $op:tt) => ( + #[derive(Debug)] + pub struct $func_name + { + pub lhs: (ColumnV, usize, usize), + pub rhs: (ColumnV, usize, usize), + pub out: ColumnV + } + impl MechFunction for $func_name + where T: Clone + Debug + PartialEq + PartialOrd + Into, + U: Clone + Debug + PartialEq + PartialOrd + Into, + { + fn solve(&self) { + let (lhs,lsix,leix) = &self.lhs; + let (rhs,rsix,reix) = &self.rhs; + let lhs = &lhs.borrow()[*lsix]; + self.out.borrow_mut() + .iter_mut() + .zip(rhs.borrow()[*rsix..=*reix].iter()) + .for_each(|(out, rhs)| *out = T::into(lhs.clone()) $op *rhs ); + } + fn to_string(&self) -> String { format!("{:#?}", self)} + } + ) +} + +#[cfg(feature = "parallel")] +#[macro_export] +macro_rules! par_compare_infix_sv { + ($func_name:ident, $op:tt) => ( + #[derive(Debug)] + pub struct $func_name + { + pub lhs: (ColumnV, usize, usize), + pub rhs: (ColumnV, usize, usize), + pub out: ColumnV + } + impl MechFunction for $func_name + where T: Clone + Debug + PartialEq + PartialOrd + Into + Send + Sync, + U: Clone + Debug + PartialEq + PartialOrd + Into + Send + Sync, + { + fn solve(&self) { + let (lhs,lsix,leix) = &self.lhs; + let (rhs,rsix,reix) = &self.rhs; + let lhs = &lhs.borrow()[*lsix]; + self.out.borrow_mut() + .par_iter_mut() + .zip(rhs.borrow()[*rsix..=*reix].par_iter()) + .for_each(|(out, rhs)| *out = T::into(lhs.clone()) $op *rhs ); + } + fn to_string(&self) -> String { format!("{:#?}", self)} + } + ) +} + +// Dynamic : Dynamic +#[macro_export] +macro_rules! compare_infix_dd { + ($func_name:ident, $op:tt) => ( + #[derive(Debug)] + pub struct $func_name + { + pub lhs: ColumnV, + pub rhs: ColumnV, + pub out: OutTable + } + impl MechFunction for $func_name + where T: Clone + Debug + PartialEq + PartialOrd + Into, + U: Clone + Debug + PartialEq + PartialOrd + Into, + { + fn solve(&self) { + let lhs = &self.lhs.borrow(); + let rhs = &self.rhs.borrow(); + let mut out_table_brrw = self.out.borrow_mut(); + out_table_brrw.resize(lhs.len(),1); + let out_col = out_table_brrw.get_column_unchecked(0); + match out_col { + Column::Bool(out) => { + out.borrow_mut() + .iter_mut() + .zip(lhs.iter()) + .zip(rhs.iter()) + .for_each(|((out, lhs), rhs)| *out = *lhs $op U::into(rhs.clone())); + } + _ => (), + } + + } + fn to_string(&self) -> String { format!("{:#?}", self)} + } + ) +} + +// Dynamic : Scalar +#[macro_export] +macro_rules! compare_infix_ds { + ($func_name:ident, $op:tt) => ( + #[derive(Debug)] + pub struct $func_name + { + pub lhs: ColumnV, + pub rhs: ColumnV, + pub out: OutTable + } + impl MechFunction for $func_name + where T: Clone + Debug + PartialEq + PartialOrd + Into, + U: Clone + Debug + PartialEq + PartialOrd + Into, + { + fn solve(&self) { + let lhs = &self.lhs.borrow(); + let rhs = U::into(self.rhs.borrow()[0].clone()); + let mut out_table_brrw = self.out.borrow_mut(); + out_table_brrw.resize(lhs.len(),1); + let out_col = out_table_brrw.get_column_unchecked(0); + match out_col { + Column::Bool(out) => { + out.borrow_mut() + .iter_mut() + .zip(lhs.iter()) + .for_each(|(out, lhs)| *out = *lhs $op rhs); + } + _ => (), + } + } + fn to_string(&self) -> String { format!("{:#?}", self)} + } + ) +} + +#[macro_export] +macro_rules! compare_compiler { + ($func_name:ident,$op2:tt,$op3:tt,$op4:tt,$op5:tt,$op6:tt) => ( + pub struct $func_name {} + + impl MechFunctionCompiler for $func_name { + fn compile(&self, block: &mut Block, arguments: &Vec, out: &(TableId, TableIndex, TableIndex)) -> std::result::Result<(),MechError> { + let arg_dims = block.get_arg_dims(&arguments)?; + match (&arg_dims[0],&arg_dims[1]) { + (TableShape::Scalar, TableShape::Scalar) => { + resize_one(block,out); + let mut argument_columns = block.get_arg_columns(arguments)?; + let out_column = block.get_out_column(out, 1, ValueKind::Bool)?; + match (&argument_columns[0], &argument_columns[1], &out_column) { + ((_,Column::U8(lhs),ColumnIndex::All), (_,Column::U8(rhs),ColumnIndex::All), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,0), out: out.clone()})} + ((_,Column::U8(lhs),ColumnIndex::Index(lix)), (_,Column::U8(rhs),ColumnIndex::Index(rix)), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),*lix,*lix), rhs: (rhs.clone(),*rix,*rix), out: out.clone()})} + ((_,Column::U16(lhs),ColumnIndex::All), (_,Column::U16(rhs),ColumnIndex::All), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,0), out: out.clone()})} + ((_,Column::U16(lhs),ColumnIndex::Index(lix)), (_,Column::U16(rhs),ColumnIndex::Index(rix)), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),*lix,*lix), rhs: (rhs.clone(),*rix,*rix), out: out.clone()})} + ((_,Column::U32(lhs),ColumnIndex::All), (_,Column::U32(rhs),ColumnIndex::All), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,0), out: out.clone()})} + ((_,Column::U32(lhs),ColumnIndex::Index(lix)), (_,Column::U32(rhs),ColumnIndex::Index(rix)), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),*lix,*lix), rhs: (rhs.clone(),*rix,*rix), out: out.clone()})} + ((_,Column::U64(lhs),ColumnIndex::All), (_,Column::U64(rhs),ColumnIndex::All), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,0), out: out.clone()})} + ((_,Column::U64(lhs),ColumnIndex::Index(lix)), (_,Column::U64(rhs),ColumnIndex::Index(rix)), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),*lix,*lix), rhs: (rhs.clone(),*rix,*rix), out: out.clone()})} + ((_,Column::U128(lhs),ColumnIndex::All), (_,Column::U128(rhs),ColumnIndex::All), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,0), out: out.clone()})} + ((_,Column::U128(lhs),ColumnIndex::Index(lix)), (_,Column::U128(rhs),ColumnIndex::Index(rix)), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),*lix,*lix), rhs: (rhs.clone(),*rix,*rix), out: out.clone()})} + ((_,Column::I8(lhs),ColumnIndex::All), (_,Column::I8(rhs),ColumnIndex::All), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,0), out: out.clone()})} + ((_,Column::I8(lhs),ColumnIndex::Index(lix)), (_,Column::I8(rhs),ColumnIndex::Index(rix)), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),*lix,*lix), rhs: (rhs.clone(),*rix,*rix), out: out.clone()})} + ((_,Column::I16(lhs),ColumnIndex::All), (_,Column::I16(rhs),ColumnIndex::All), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,0), out: out.clone()})} + ((_,Column::I16(lhs),ColumnIndex::Index(lix)), (_,Column::I16(rhs),ColumnIndex::Index(rix)), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),*lix,*lix), rhs: (rhs.clone(),*rix,*rix), out: out.clone()})} + ((_,Column::I32(lhs),ColumnIndex::All), (_,Column::I32(rhs),ColumnIndex::All), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,0), out: out.clone()})} + ((_,Column::I32(lhs),ColumnIndex::Index(lix)), (_,Column::I32(rhs),ColumnIndex::Index(rix)), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),*lix,*lix), rhs: (rhs.clone(),*rix,*rix), out: out.clone()})} + ((_,Column::I64(lhs),ColumnIndex::All), (_,Column::I64(rhs),ColumnIndex::All), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,0), out: out.clone()})} + ((_,Column::I64(lhs),ColumnIndex::Index(lix)), (_,Column::I64(rhs),ColumnIndex::Index(rix)), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),*lix,*lix), rhs: (rhs.clone(),*rix,*rix), out: out.clone()})} + ((_,Column::I128(lhs),ColumnIndex::All), (_,Column::I128(rhs),ColumnIndex::All), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,0), out: out.clone()})} + ((_,Column::I128(lhs),ColumnIndex::Index(lix)), (_,Column::I128(rhs),ColumnIndex::Index(rix)), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),*lix,*lix), rhs: (rhs.clone(),*rix,*rix), out: out.clone()})} + ((_,Column::F32(lhs),ColumnIndex::All), (_,Column::F32(rhs),ColumnIndex::All), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,0), out: out.clone()})} + ((_,Column::F32(lhs),ColumnIndex::Index(lix)), (_,Column::F32(rhs),ColumnIndex::Index(rix)), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),*lix,*lix), rhs: (rhs.clone(),*rix,*rix), out: out.clone()})} + ((_,Column::F64(lhs),ColumnIndex::All), (_,Column::F64(rhs),ColumnIndex::All), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,0), out: out.clone()})} + ((_,Column::F64(lhs),ColumnIndex::Index(lix)), (_,Column::F64(rhs),ColumnIndex::Index(rix)), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),*lix,*lix), rhs: (rhs.clone(),*rix,*rix), out: out.clone()})} + x => {return Err(MechError{msg: "".to_string(), id: 7100, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + (TableShape::Column(rows), TableShape::Scalar) => { + let mut argument_columns = block.get_arg_columns(arguments)?; + let out_column = block.get_out_column(out, *rows, ValueKind::Bool)?; + match (&argument_columns[0], &argument_columns[1], &out_column) { + ((_,Column::U8(lhs),_), (_,Column::U8(rhs),_), Column::Bool(out)) => { block.plan.push($op2{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,0), out: out.clone()}) } + ((_,Column::U16(lhs),_), (_,Column::U16(rhs),_), Column::Bool(out)) => { block.plan.push($op2{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,0), out: out.clone()}) } + ((_,Column::U32(lhs),_), (_,Column::U32(rhs),_), Column::Bool(out)) => { block.plan.push($op2{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,0), out: out.clone()}) } + ((_,Column::U64(lhs),_), (_,Column::U64(rhs),_), Column::Bool(out)) => { block.plan.push($op2{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,0), out: out.clone()}) } + ((_,Column::U128(lhs),_), (_,Column::U128(rhs),_), Column::Bool(out)) => { block.plan.push($op2{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,0), out: out.clone()}) } + ((_,Column::I8(lhs),_), (_,Column::I8(rhs),_), Column::Bool(out)) => { block.plan.push($op2{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,0), out: out.clone()}) } + ((_,Column::I16(lhs),_), (_,Column::I16(rhs),_), Column::Bool(out)) => { block.plan.push($op2{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,0), out: out.clone()}) } + ((_,Column::I32(lhs),_), (_,Column::I32(rhs),_), Column::Bool(out)) => { block.plan.push($op2{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,0), out: out.clone()}) } + ((_,Column::I64(lhs),_), (_,Column::I64(rhs),_), Column::Bool(out)) => { block.plan.push($op2{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,0), out: out.clone()}) } + ((_,Column::I128(lhs),_), (_,Column::I128(rhs),_), Column::Bool(out)) => { block.plan.push($op2{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,0), out: out.clone()}) } + ((_,Column::F32(lhs),_), (_,Column::F32(rhs),_), Column::Bool(out)) => { block.plan.push($op2{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,0), out: out.clone()}) } + ((_,Column::F64(lhs),_), (_,Column::F64(rhs),_), Column::Bool(out)) => { block.plan.push($op2{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,0), out: out.clone()}) } + x => {return Err(MechError{msg: "".to_string(), id: 7101, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + (TableShape::Matrix(_,cols), TableShape::Scalar) | + (TableShape::Row(cols), TableShape::Scalar) => { + + let lhs_columns = block.get_whole_table_arg_cols(&arguments[0])?; + let rhs_column = block.get_arg_column(&arguments[1])?; + + let rows: usize = match &arg_dims[0] { + TableShape::Matrix(rows,_) => *rows, + _ => 1, + }; + + let (out_table_id, _, _) = out; + let out_table = block.get_table(out_table_id)?; + let mut out_brrw = out_table.borrow_mut(); + out_brrw.resize(rows,*cols); + + for (col_ix,(_,lhs_column,_)) in lhs_columns.iter().enumerate() { + out_brrw.set_col_kind(col_ix, ValueKind::Bool)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + match (lhs_column,&rhs_column, out_col) { + (Column::U8(lhs), (_,Column::U8(rhs),_), Column::Bool(out)) => block.plan.push($op2{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,0), out: out.clone()}), + (Column::U16(lhs), (_,Column::U16(rhs),_), Column::Bool(out)) => block.plan.push($op2{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,0), out: out.clone()}), + (Column::U32(lhs), (_,Column::U32(rhs),_), Column::Bool(out)) => block.plan.push($op2{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,0), out: out.clone()}), + (Column::U64(lhs), (_,Column::U64(rhs),_), Column::Bool(out)) => block.plan.push($op2{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,0), out: out.clone()}), + (Column::U128(lhs), (_,Column::U128(rhs),_), Column::Bool(out)) => block.plan.push($op2{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,0), out: out.clone()}), + (Column::I8(lhs), (_,Column::I8(rhs),_), Column::Bool(out)) => block.plan.push($op2{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,0), out: out.clone()}), + (Column::I16(lhs), (_,Column::I16(rhs),_), Column::Bool(out)) => block.plan.push($op2{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,0), out: out.clone()}), + (Column::I32(lhs), (_,Column::I32(rhs),_), Column::Bool(out)) => block.plan.push($op2{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,0), out: out.clone()}), + (Column::I64(lhs), (_,Column::I64(rhs),_), Column::Bool(out)) => block.plan.push($op2{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,0), out: out.clone()}), + (Column::I128(lhs), (_,Column::I128(rhs),_), Column::Bool(out)) => block.plan.push($op2{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,0), out: out.clone()}), + (Column::F32(lhs), (_,Column::F32(rhs),_), Column::Bool(out)) => block.plan.push($op2{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,0), out: out.clone()}), + (Column::F64(lhs), (_,Column::F64(rhs),_), Column::Bool(out)) => block.plan.push($op2{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,0), out: out.clone()}), + (Column::Speed(lhs), (_,Column::F64(rhs),_), Column::Bool(out)) => block.plan.push($op2{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,0), out: out.clone()}), + (Column::Time(lhs), (_,Column::F64(rhs),_), Column::Bool(out)) => block.plan.push($op2{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,0), out: out.clone()}), + (Column::Length(lhs), (_,Column::F64(rhs),_), Column::Bool(out)) => block.plan.push($op2{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,0), out: out.clone()}), + x => {return Err(MechError{msg: "".to_string(), id: 7201, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + (TableShape::Scalar, TableShape::Matrix(_,cols)) | + (TableShape::Scalar, TableShape::Row(cols)) => { + + let lhs_column = block.get_arg_column(&arguments[0])?; + let rhs_columns = block.get_whole_table_arg_cols(&arguments[1])?; + + let rows: usize = match &arg_dims[1] { + TableShape::Matrix(rows,_) => *rows, + _ => 1, + }; + + let (out_table_id, _, _) = out; + let out_table = block.get_table(out_table_id)?; + let mut out_brrw = out_table.borrow_mut(); + out_brrw.resize(rows,*cols); + + for (col_ix,(_,rhs_column,_)) in rhs_columns.iter().enumerate() { + out_brrw.set_col_kind(col_ix, ValueKind::Bool)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + match (&lhs_column,rhs_column, out_col) { + ((_,Column::U8(lhs),_), Column::U8(rhs), Column::Bool(out)) => { block.plan.push($op3{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()}) } + ((_,Column::U16(lhs),_), Column::U16(rhs), Column::Bool(out)) => { block.plan.push($op3{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()}) } + ((_,Column::U32(lhs),_), Column::U32(rhs), Column::Bool(out)) => { block.plan.push($op3{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()}) } + ((_,Column::U64(lhs),_), Column::U64(rhs), Column::Bool(out)) => { block.plan.push($op3{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()}) } + ((_,Column::U128(lhs),_), Column::U128(rhs), Column::Bool(out)) => { block.plan.push($op3{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()}) } + ((_,Column::I8(lhs),_), Column::I8(rhs), Column::Bool(out)) => { block.plan.push($op3{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()}) } + ((_,Column::I16(lhs),_), Column::I16(rhs), Column::Bool(out)) => { block.plan.push($op3{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()}) } + ((_,Column::I32(lhs),_), Column::I32(rhs), Column::Bool(out)) => { block.plan.push($op3{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()}) } + ((_,Column::I64(lhs),_), Column::I64(rhs), Column::Bool(out)) => { block.plan.push($op3{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()}) } + ((_,Column::I128(lhs),_), Column::I128(rhs), Column::Bool(out)) => { block.plan.push($op3{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()}) } + ((_,Column::F32(lhs),_), Column::F32(rhs), Column::Bool(out)) => { block.plan.push($op3{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()}) } + ((_,Column::F64(lhs),_), Column::F64(rhs), Column::Bool(out)) => { block.plan.push($op3{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()}) } + ((_,Column::Time(lhs),_), Column::Time(rhs), Column::Bool(out)) => { block.plan.push($op3{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()}) } + ((_,Column::Length(lhs),_), Column::Length(rhs), Column::Bool(out)) => { block.plan.push($op3{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()}) } + ((_,Column::Speed(lhs),_), Column::Speed(rhs), Column::Bool(out)) => { block.plan.push($op3{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()}) } + + x => {return Err(MechError{msg: "".to_string(), id: 7202, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + (TableShape::Scalar,TableShape::Column(rows)) => { + let mut argument_columns = block.get_arg_columns(arguments)?; + let out_column = block.get_out_column(out, *rows, ValueKind::Bool)?; + match (&argument_columns[0], &argument_columns[1], &out_column) { + ((_,Column::U8(lhs),_), (_,Column::U8(rhs),_), Column::Bool(out)) => { block.plan.push($op3{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,lhs.len()-1), out: out.clone()}) } + ((_,Column::U16(lhs),_), (_,Column::U16(rhs),_), Column::Bool(out)) => { block.plan.push($op3{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,lhs.len()-1), out: out.clone()}) } + ((_,Column::U32(lhs),_), (_,Column::U32(rhs),_), Column::Bool(out)) => { block.plan.push($op3{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,lhs.len()-1), out: out.clone()}) } + ((_,Column::U64(lhs),_), (_,Column::U64(rhs),_), Column::Bool(out)) => { block.plan.push($op3{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,lhs.len()-1), out: out.clone()}) } + ((_,Column::U128(lhs),_), (_,Column::U128(rhs),_), Column::Bool(out)) => { block.plan.push($op3{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,lhs.len()-1), out: out.clone()}) } + ((_,Column::I8(lhs),_), (_,Column::I8(rhs),_), Column::Bool(out)) => { block.plan.push($op3{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,lhs.len()-1), out: out.clone()}) } + ((_,Column::I16(lhs),_), (_,Column::I16(rhs),_), Column::Bool(out)) => { block.plan.push($op3{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,lhs.len()-1), out: out.clone()}) } + ((_,Column::I32(lhs),_), (_,Column::I32(rhs),_), Column::Bool(out)) => { block.plan.push($op3{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,lhs.len()-1), out: out.clone()}) } + ((_,Column::I64(lhs),_), (_,Column::I64(rhs),_), Column::Bool(out)) => { block.plan.push($op3{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,lhs.len()-1), out: out.clone()}) } + ((_,Column::I128(lhs),_), (_,Column::I128(rhs),_), Column::Bool(out)) => { block.plan.push($op3{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,lhs.len()-1), out: out.clone()}) } + ((_,Column::F32(lhs),_), (_,Column::F32(rhs),_), Column::Bool(out)) => { block.plan.push($op3{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,lhs.len()-1), out: out.clone()}) } + ((_,Column::F64(lhs),_), (_,Column::F64(rhs),_), Column::Bool(out)) => { block.plan.push($op3{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,lhs.len()-1), out: out.clone()}) } + x => {return Err(MechError{msg: "".to_string(), id: 7102, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + (TableShape::Column(lhs_rows), TableShape::Column(rhs_rows)) => { + if lhs_rows != rhs_rows { + return Err(MechError{msg: "".to_string(), id: 7103, kind: MechErrorKind::DimensionMismatch(vec![(*lhs_rows,0),(*rhs_rows,0)])}); + } + let mut argument_columns = block.get_arg_columns(arguments)?; + let out_column = block.get_out_column(out, *lhs_rows, ValueKind::Bool)?; + match (&argument_columns[0], &argument_columns[1], &out_column) { + ((_,Column::U8(lhs),_), (_,Column::U8(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::U16(lhs),_), (_,Column::U16(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::U32(lhs),_), (_,Column::U32(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::U64(lhs),_), (_,Column::U64(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::U128(lhs),_), (_,Column::U128(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::I8(lhs),_), (_,Column::I8(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::I16(lhs),_), (_,Column::I16(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::I32(lhs),_), (_,Column::I32(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::I64(lhs),_), (_,Column::I64(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::I128(lhs),_), (_,Column::I128(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::F32(lhs),_), (_,Column::F32(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::F64(lhs),_), (_,Column::F64(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + x => {return Err(MechError{msg: "".to_string(), id: 7104, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + (TableShape::Matrix(lhs_rows,lhs_cols), TableShape::Matrix(rhs_rows,rhs_cols)) => { + if lhs_rows != rhs_rows { + return Err(MechError{msg: "".to_string(), id: 7103, kind: MechErrorKind::DimensionMismatch(vec![(*lhs_rows,0),(*rhs_rows,0)])}); + } + if lhs_cols != rhs_cols { + return Err(MechError{msg: "".to_string(), id: 7103, kind: MechErrorKind::DimensionMismatch(vec![(*lhs_rows,0),(*rhs_rows,0)])}); + } + let mut lhs_arg_cols = block.get_whole_table_arg_cols(&arguments[0])?; + let mut rhs_arg_cols = block.get_whole_table_arg_cols(&arguments[1])?; + let (out_table_id,_,_) = out; + let out_table = block.get_table(out_table_id)?; + { + let mut out_table_brrw = out_table.borrow_mut(); + out_table_brrw.resize(*lhs_rows,*lhs_cols); + out_table_brrw.set_kind(ValueKind::Bool); + } + + for col in 0..*lhs_cols { + let mut out_table_brrw = out_table.borrow_mut(); + let out_column = out_table_brrw.get_column_unchecked(col); + match (&lhs_arg_cols[col], &rhs_arg_cols[col], &out_column) { + ((_,Column::U8(lhs),_), (_,Column::U8(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::U16(lhs),_), (_,Column::U16(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::U32(lhs),_), (_,Column::U32(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::U64(lhs),_), (_,Column::U64(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::U128(lhs),_), (_,Column::U128(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::I8(lhs),_), (_,Column::I8(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::I16(lhs),_), (_,Column::I16(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::I32(lhs),_), (_,Column::I32(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::I64(lhs),_), (_,Column::I64(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::I128(lhs),_), (_,Column::I128(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::F32(lhs),_), (_,Column::F32(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::F64(lhs),_), (_,Column::F64(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + x => {return Err(MechError{msg: "".to_string(), id: 7104, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + + } + } + (TableShape::Dynamic(lhs_rows,1),TableShape::Dynamic(rhs_rows,1)) => { + if lhs_rows != rhs_rows { + return Err(MechError{msg: "".to_string(), id: 7111, kind: MechErrorKind::DimensionMismatch(vec![(*lhs_rows,0),(*rhs_rows,0)])}); + } + let mut argument_columns = block.get_arg_columns(arguments)?; + let (out_table_id,_,_) = out; + let out_table = block.get_table(out_table_id)?; + { + let mut out_table_brrw = out_table.borrow_mut(); + out_table_brrw.resize(*lhs_rows,1); + out_table_brrw.set_kind(ValueKind::Bool); + } + match (&argument_columns[0], &argument_columns[1]) { + ((_,Column::U8(lhs),_), (_,Column::U8(rhs),_)) => {block.plan.push($op5{lhs: lhs.clone(), rhs: rhs.clone(), out: out_table.clone()})} + ((_,Column::U16(lhs),_), (_,Column::U16(rhs),_)) => {block.plan.push($op5{lhs: lhs.clone(), rhs: rhs.clone(), out: out_table.clone()})} + ((_,Column::U32(lhs),_), (_,Column::U32(rhs),_)) => {block.plan.push($op5{lhs: lhs.clone(), rhs: rhs.clone(), out: out_table.clone()})} + ((_,Column::U64(lhs),_), (_,Column::U64(rhs),_)) => {block.plan.push($op5{lhs: lhs.clone(), rhs: rhs.clone(), out: out_table.clone()})} + ((_,Column::U128(lhs),_), (_,Column::U128(rhs),_)) => {block.plan.push($op5{lhs: lhs.clone(), rhs: rhs.clone(), out: out_table.clone()})} + ((_,Column::I8(lhs),_), (_,Column::I8(rhs),_)) => {block.plan.push($op5{lhs: lhs.clone(), rhs: rhs.clone(), out: out_table.clone()})} + ((_,Column::I16(lhs),_), (_,Column::I16(rhs),_)) => {block.plan.push($op5{lhs: lhs.clone(), rhs: rhs.clone(), out: out_table.clone()})} + ((_,Column::I32(lhs),_), (_,Column::I32(rhs),_)) => {block.plan.push($op5{lhs: lhs.clone(), rhs: rhs.clone(), out: out_table.clone()})} + ((_,Column::I64(lhs),_), (_,Column::I64(rhs),_)) => {block.plan.push($op5{lhs: lhs.clone(), rhs: rhs.clone(), out: out_table.clone()})} + ((_,Column::I128(lhs),_), (_,Column::I128(rhs),_)) => {block.plan.push($op5{lhs: lhs.clone(), rhs: rhs.clone(), out: out_table.clone()})} + ((_,Column::F32(lhs),_), (_,Column::F32(rhs),_)) => {block.plan.push($op5{lhs: lhs.clone(), rhs: rhs.clone(), out: out_table.clone()})} + ((_,Column::F64(lhs),_), (_,Column::F64(rhs),_)) => {block.plan.push($op5{lhs: lhs.clone(), rhs: rhs.clone(), out: out_table.clone()})} + x => {return Err(MechError{msg: "".to_string(), id: 7204, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + (TableShape::Dynamic(lhs_rows,1),TableShape::Scalar) => { + let mut argument_columns = block.get_arg_columns(arguments)?; + let (out_table_id,_,_) = out; + let out_table = block.get_table(out_table_id)?; + { + let mut out_table_brrw = out_table.borrow_mut(); + out_table_brrw.dynamic = true; + out_table_brrw.resize(*lhs_rows,1); + out_table_brrw.set_kind(ValueKind::Bool); + } + match (&argument_columns[0], &argument_columns[1]) { + ((_,Column::U8(lhs),_), (_,Column::U8(rhs),_)) => {block.plan.push($op6{lhs: lhs.clone(), rhs: rhs.clone(), out: out_table.clone()})} + ((_,Column::U16(lhs),_), (_,Column::U16(rhs),_)) => {block.plan.push($op6{lhs: lhs.clone(), rhs: rhs.clone(), out: out_table.clone()})} + ((_,Column::U32(lhs),_), (_,Column::U32(rhs),_)) => {block.plan.push($op6{lhs: lhs.clone(), rhs: rhs.clone(), out: out_table.clone()})} + ((_,Column::U64(lhs),_), (_,Column::U64(rhs),_)) => {block.plan.push($op6{lhs: lhs.clone(), rhs: rhs.clone(), out: out_table.clone()})} + ((_,Column::U128(lhs),_), (_,Column::U128(rhs),_)) => {block.plan.push($op6{lhs: lhs.clone(), rhs: rhs.clone(), out: out_table.clone()})} + ((_,Column::I8(lhs),_), (_,Column::I8(rhs),_)) => {block.plan.push($op6{lhs: lhs.clone(), rhs: rhs.clone(), out: out_table.clone()})} + ((_,Column::I16(lhs),_), (_,Column::I16(rhs),_)) => {block.plan.push($op6{lhs: lhs.clone(), rhs: rhs.clone(), out: out_table.clone()})} + ((_,Column::I32(lhs),_), (_,Column::I32(rhs),_)) => {block.plan.push($op6{lhs: lhs.clone(), rhs: rhs.clone(), out: out_table.clone()})} + ((_,Column::I64(lhs),_), (_,Column::I64(rhs),_)) => {block.plan.push($op6{lhs: lhs.clone(), rhs: rhs.clone(), out: out_table.clone()})} + ((_,Column::I128(lhs),_), (_,Column::I128(rhs),_)) => {block.plan.push($op6{lhs: lhs.clone(), rhs: rhs.clone(), out: out_table.clone()})} + ((_,Column::F32(lhs),_), (_,Column::F32(rhs),_)) => {block.plan.push($op6{lhs: lhs.clone(), rhs: rhs.clone(), out: out_table.clone()})} + ((_,Column::F64(lhs),_), (_,Column::F64(rhs),_)) => {block.plan.push($op6{lhs: lhs.clone(), rhs: rhs.clone(), out: out_table.clone()})} + x => {return Err(MechError{msg: "".to_string(), id: 7205, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + x => {return Err(MechError{msg: "".to_string(), id: 7106, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + Ok(()) + } + } + ) +} + +#[macro_export] +macro_rules! compare_eq_compiler { + ($func_name:ident, $op2:tt,$op3:tt,$op4:tt,$op5:tt,$op6:tt) => ( + pub struct $func_name {} + + impl MechFunctionCompiler for $func_name { + fn compile(&self, block: &mut Block, arguments: &Vec, out: &(TableId, TableIndex, TableIndex)) -> std::result::Result<(),MechError> { + let arg_dims = block.get_arg_dims(&arguments)?; + match (&arg_dims[0],&arg_dims[1]) { + (TableShape::Scalar, TableShape::Scalar) => { + resize_one(block,out); + let mut argument_columns = block.get_arg_columns(arguments)?; + let out_column = block.get_out_column(out, 1, ValueKind::Bool)?; + match (&argument_columns[0], &argument_columns[1], &out_column) { + ((_,Column::U8(lhs),ColumnIndex::All), (_,Column::U8(rhs),ColumnIndex::All), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,0), out: out.clone()})} + ((_,Column::U8(lhs),ColumnIndex::Index(lix)), (_,Column::U8(rhs),ColumnIndex::Index(rix)), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),*lix,*lix), rhs: (rhs.clone(),*rix,*rix), out: out.clone()})} + ((_,Column::U16(lhs),ColumnIndex::All), (_,Column::U16(rhs),ColumnIndex::All), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,0), out: out.clone()})} + ((_,Column::U16(lhs),ColumnIndex::Index(lix)), (_,Column::U16(rhs),ColumnIndex::Index(rix)), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),*lix,*lix), rhs: (rhs.clone(),*rix,*rix), out: out.clone()})} + ((_,Column::U32(lhs),ColumnIndex::All), (_,Column::U32(rhs),ColumnIndex::All), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,0), out: out.clone()})} + ((_,Column::U32(lhs),ColumnIndex::Index(lix)), (_,Column::U32(rhs),ColumnIndex::Index(rix)), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),*lix,*lix), rhs: (rhs.clone(),*rix,*rix), out: out.clone()})} + ((_,Column::U64(lhs),ColumnIndex::All), (_,Column::U64(rhs),ColumnIndex::All), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,0), out: out.clone()})} + ((_,Column::U64(lhs),ColumnIndex::Index(lix)), (_,Column::U64(rhs),ColumnIndex::Index(rix)), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),*lix,*lix), rhs: (rhs.clone(),*rix,*rix), out: out.clone()})} + ((_,Column::U128(lhs),ColumnIndex::All), (_,Column::U128(rhs),ColumnIndex::All), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,0), out: out.clone()})} + ((_,Column::U128(lhs),ColumnIndex::Index(lix)), (_,Column::U128(rhs),ColumnIndex::Index(rix)), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),*lix,*lix), rhs: (rhs.clone(),*rix,*rix), out: out.clone()})} + ((_,Column::I8(lhs),ColumnIndex::All), (_,Column::I8(rhs),ColumnIndex::All), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,0), out: out.clone()})} + ((_,Column::I8(lhs),ColumnIndex::Index(lix)), (_,Column::I8(rhs),ColumnIndex::Index(rix)), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),*lix,*lix), rhs: (rhs.clone(),*rix,*rix), out: out.clone()})} + ((_,Column::I16(lhs),ColumnIndex::All), (_,Column::I16(rhs),ColumnIndex::All), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,0), out: out.clone()})} + ((_,Column::I16(lhs),ColumnIndex::Index(lix)), (_,Column::I16(rhs),ColumnIndex::Index(rix)), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),*lix,*lix), rhs: (rhs.clone(),*rix,*rix), out: out.clone()})} + ((_,Column::I32(lhs),ColumnIndex::All), (_,Column::I32(rhs),ColumnIndex::All), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,0), out: out.clone()})} + ((_,Column::I32(lhs),ColumnIndex::Index(lix)), (_,Column::I32(rhs),ColumnIndex::Index(rix)), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),*lix,*lix), rhs: (rhs.clone(),*rix,*rix), out: out.clone()})} + ((_,Column::I64(lhs),ColumnIndex::All), (_,Column::I64(rhs),ColumnIndex::All), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,0), out: out.clone()})} + ((_,Column::I64(lhs),ColumnIndex::Index(lix)), (_,Column::I64(rhs),ColumnIndex::Index(rix)), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),*lix,*lix), rhs: (rhs.clone(),*rix,*rix), out: out.clone()})} + ((_,Column::I128(lhs),ColumnIndex::All), (_,Column::I128(rhs),ColumnIndex::All), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,0), out: out.clone()})} + ((_,Column::I128(lhs),ColumnIndex::Index(lix)), (_,Column::I128(rhs),ColumnIndex::Index(rix)), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),*lix,*lix), rhs: (rhs.clone(),*rix,*rix), out: out.clone()})} + ((_,Column::F32(lhs),ColumnIndex::All), (_,Column::F32(rhs),ColumnIndex::All), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,0), out: out.clone()})} + ((_,Column::F32(lhs),ColumnIndex::Index(lix)), (_,Column::F32(rhs),ColumnIndex::Index(rix)), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),*lix,*lix), rhs: (rhs.clone(),*rix,*rix), out: out.clone()})} + ((_,Column::F64(lhs),ColumnIndex::All), (_,Column::F64(rhs),ColumnIndex::All), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,0), out: out.clone()})} + ((_,Column::F64(lhs),ColumnIndex::Index(lix)), (_,Column::F64(rhs),ColumnIndex::Index(rix)), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),*lix,*lix), rhs: (rhs.clone(),*rix,*rix), out: out.clone()})} + ((_,Column::Bool(lhs),ColumnIndex::All), (_,Column::Bool(rhs),ColumnIndex::All), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,0), out: out.clone()})} + ((_,Column::Bool(lhs),ColumnIndex::Index(lix)), (_,Column::Bool(rhs),ColumnIndex::Index(rix)), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),*lix,*lix), rhs: (rhs.clone(),*rix,*rix), out: out.clone()})} + ((_,Column::String(lhs),ColumnIndex::All), (_,Column::String(rhs),ColumnIndex::All), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,0), out: out.clone()})} + ((_,Column::String(lhs),ColumnIndex::Index(lix)), (_,Column::String(rhs),ColumnIndex::Index(rix)), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),*lix,*lix), rhs: (rhs.clone(),*rix,*rix), out: out.clone()})} + ((_,Column::Any(lhs),ColumnIndex::Index(lix)), (_,Column::Any(rhs),ColumnIndex::Index(rix)), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),*lix,*lix), rhs: (rhs.clone(),*rix,*rix), out: out.clone()})} + x => {return Err(MechError{msg: "".to_string(), id: 7106, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + (TableShape::Column(rows), TableShape::Scalar) => { + let mut argument_columns = block.get_arg_columns(arguments)?; + let out_column = block.get_out_column(out, *rows, ValueKind::Bool)?; + match (&argument_columns[0], &argument_columns[1], &out_column) { + ((_,Column::U8(lhs),_), (_,Column::U8(rhs),_), Column::Bool(out)) => { block.plan.push($op2{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,0), out: out.clone()}) } + ((_,Column::U16(lhs),_), (_,Column::U16(rhs),_), Column::Bool(out)) => { block.plan.push($op2{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,0), out: out.clone()}) } + ((_,Column::U32(lhs),_), (_,Column::U32(rhs),_), Column::Bool(out)) => { block.plan.push($op2{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,0), out: out.clone()}) } + ((_,Column::U64(lhs),_), (_,Column::U64(rhs),_), Column::Bool(out)) => { block.plan.push($op2{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,0), out: out.clone()}) } + ((_,Column::U128(lhs),_), (_,Column::U128(rhs),_), Column::Bool(out)) => { block.plan.push($op2{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,0), out: out.clone()}) } + ((_,Column::I8(lhs),_), (_,Column::I8(rhs),_), Column::Bool(out)) => { block.plan.push($op2{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,0), out: out.clone()}) } + ((_,Column::I16(lhs),_), (_,Column::I16(rhs),_), Column::Bool(out)) => { block.plan.push($op2{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,0), out: out.clone()}) } + ((_,Column::I32(lhs),_), (_,Column::I32(rhs),_), Column::Bool(out)) => { block.plan.push($op2{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,0), out: out.clone()}) } + ((_,Column::I64(lhs),_), (_,Column::I64(rhs),_), Column::Bool(out)) => { block.plan.push($op2{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,0), out: out.clone()}) } + ((_,Column::I128(lhs),_), (_,Column::I128(rhs),_), Column::Bool(out)) => { block.plan.push($op2{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,0), out: out.clone()}) } + ((_,Column::F32(lhs),_), (_,Column::F32(rhs),_), Column::Bool(out)) => { block.plan.push($op2{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,0), out: out.clone()}) } + ((_,Column::F64(lhs),_), (_,Column::F64(rhs),_), Column::Bool(out)) => { block.plan.push($op2{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,0), out: out.clone()}) } + ((_,Column::Bool(lhs),_), (_,Column::Bool(rhs),_), Column::Bool(out)) => { block.plan.push($op2{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,0), out: out.clone()}) } + ((_,Column::String(lhs),_), (_,Column::String(rhs),_), Column::Bool(out)) => { block.plan.push($op2{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,0), out: out.clone()}) } + x => {return Err(MechError{msg: "".to_string(), id: 7107, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + (TableShape::Scalar,TableShape::Column(rows)) => { + let mut argument_columns = block.get_arg_columns(arguments)?; + let out_column = block.get_out_column(out, *rows, ValueKind::Bool)?; + match (&argument_columns[0], &argument_columns[1], &out_column) { + ((_,Column::U8(lhs),_), (_,Column::U8(rhs),_), Column::Bool(out)) => block.plan.push($op3{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,lhs.len()-1), out: out.clone()}), + ((_,Column::U16(lhs),_), (_,Column::U16(rhs),_), Column::Bool(out)) => block.plan.push($op3{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,lhs.len()-1), out: out.clone()}), + ((_,Column::U32(lhs),_), (_,Column::U32(rhs),_), Column::Bool(out)) => block.plan.push($op3{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,lhs.len()-1), out: out.clone()}), + ((_,Column::U64(lhs),_), (_,Column::U64(rhs),_), Column::Bool(out)) => block.plan.push($op3{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,lhs.len()-1), out: out.clone()}), + ((_,Column::U128(lhs),_), (_,Column::U128(rhs),_), Column::Bool(out)) => block.plan.push($op3{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,lhs.len()-1), out: out.clone()}), + ((_,Column::I8(lhs),_), (_,Column::I8(rhs),_), Column::Bool(out)) => block.plan.push($op3{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,lhs.len()-1), out: out.clone()}), + ((_,Column::I16(lhs),_), (_,Column::I16(rhs),_), Column::Bool(out)) => block.plan.push($op3{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,lhs.len()-1), out: out.clone()}), + ((_,Column::I32(lhs),_), (_,Column::I32(rhs),_), Column::Bool(out)) => block.plan.push($op3{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,lhs.len()-1), out: out.clone()}), + ((_,Column::I64(lhs),_), (_,Column::I64(rhs),_), Column::Bool(out)) => block.plan.push($op3{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,lhs.len()-1), out: out.clone()}), + ((_,Column::I128(lhs),_), (_,Column::I128(rhs),_), Column::Bool(out)) => block.plan.push($op3{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,lhs.len()-1), out: out.clone()}), + ((_,Column::F32(lhs),_), (_,Column::F32(rhs),_), Column::Bool(out)) => block.plan.push($op3{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,lhs.len()-1), out: out.clone()}), + ((_,Column::F64(lhs),_), (_,Column::F64(rhs),_), Column::Bool(out)) => block.plan.push($op3{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,lhs.len()-1), out: out.clone()}), + ((_,Column::Bool(lhs),_), (_,Column::Bool(rhs),_), Column::Bool(out)) => block.plan.push($op3{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,lhs.len()-1), out: out.clone()}), + ((_,Column::String(lhs),_), (_,Column::String(rhs),_), Column::Bool(out)) => block.plan.push($op3{lhs: (lhs.clone(),0,0), rhs: (rhs.clone(),0,lhs.len()-1), out: out.clone()}), + x => {return Err(MechError{msg: "".to_string(), id: 7108, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + (TableShape::Column(lhs_rows), TableShape::Column(rhs_rows)) => { + if lhs_rows != rhs_rows { + return Err(MechError{msg: "".to_string(), id: 7109, kind: MechErrorKind::DimensionMismatch(vec![(*lhs_rows,0),(*rhs_rows,0)])}); + } + let mut argument_columns = block.get_arg_columns(arguments)?; + let out_column = block.get_out_column(out, *lhs_rows, ValueKind::Bool)?; + match (&argument_columns[0], &argument_columns[1], &out_column) { + ((_,Column::Any(lhs),_), (_,Column::Any(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::U8(lhs),_), (_,Column::U8(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::U16(lhs),_), (_,Column::U16(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::U32(lhs),_), (_,Column::U32(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::U64(lhs),_), (_,Column::U64(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::U128(lhs),_), (_,Column::U128(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::I8(lhs),_), (_,Column::I8(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::I16(lhs),_), (_,Column::I16(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::I32(lhs),_), (_,Column::I32(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::I64(lhs),_), (_,Column::I64(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::I128(lhs),_), (_,Column::I128(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::F32(lhs),_), (_,Column::F32(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::F64(lhs),_), (_,Column::F64(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::Bool(lhs),_), (_,Column::Bool(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::String(lhs),_), (_,Column::String(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + x => {return Err(MechError{msg: "".to_string(), id: 7110, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + (TableShape::Matrix(lhs_rows,lhs_cols), TableShape::Matrix(rhs_rows,rhs_cols)) => { + if lhs_rows != rhs_rows { + return Err(MechError{msg: "".to_string(), id: 7103, kind: MechErrorKind::DimensionMismatch(vec![(*lhs_rows,0),(*rhs_rows,0)])}); + } + if lhs_cols != rhs_cols { + return Err(MechError{msg: "".to_string(), id: 7103, kind: MechErrorKind::DimensionMismatch(vec![(*lhs_rows,0),(*rhs_rows,0)])}); + } + let mut lhs_arg_cols = block.get_whole_table_arg_cols(&arguments[0])?; + let mut rhs_arg_cols = block.get_whole_table_arg_cols(&arguments[1])?; + let (out_table_id,_,_) = out; + let out_table = block.get_table(out_table_id)?; + { + let mut out_table_brrw = out_table.borrow_mut(); + out_table_brrw.resize(*lhs_rows,*lhs_cols); + out_table_brrw.set_kind(ValueKind::Bool); + } + + for col in 0..*lhs_cols { + let mut out_table_brrw = out_table.borrow_mut(); + let out_column = out_table_brrw.get_column_unchecked(col); + match (&lhs_arg_cols[col], &rhs_arg_cols[col], &out_column) { + ((_,Column::U8(lhs),_), (_,Column::U8(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::U16(lhs),_), (_,Column::U16(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::U32(lhs),_), (_,Column::U32(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::U64(lhs),_), (_,Column::U64(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::U128(lhs),_), (_,Column::U128(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::I8(lhs),_), (_,Column::I8(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::I16(lhs),_), (_,Column::I16(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::I32(lhs),_), (_,Column::I32(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::I64(lhs),_), (_,Column::I64(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::I128(lhs),_), (_,Column::I128(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::F32(lhs),_), (_,Column::F32(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + ((_,Column::F64(lhs),_), (_,Column::F64(rhs),_), Column::Bool(out)) => {block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone()})} + x => {return Err(MechError{msg: "".to_string(), id: 7104, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + + } + } + (TableShape::Dynamic(lhs_rows,1),TableShape::Dynamic(rhs_rows,1)) => { + if lhs_rows != rhs_rows { + return Err(MechError{msg: "".to_string(), id: 7111, kind: MechErrorKind::DimensionMismatch(vec![(*lhs_rows,0),(*rhs_rows,0)])}); + } + let mut argument_columns = block.get_arg_columns(arguments)?; + let (out_table_id,_,_) = out; + let out_table = block.get_table(out_table_id)?; + { + let mut out_table_brrw = out_table.borrow_mut(); + out_table_brrw.dynamic = true; + out_table_brrw.resize(*lhs_rows,1); + out_table_brrw.set_kind(ValueKind::Bool); + } + match (&argument_columns[0], &argument_columns[1]) { + ((_,Column::Any(lhs),_), (_,Column::Any(rhs),_)) => {block.plan.push($op5{lhs: lhs.clone(), rhs: rhs.clone(), out: out_table.clone()})} + ((_,Column::U8(lhs),_), (_,Column::U8(rhs),_)) => {block.plan.push($op5{lhs: lhs.clone(), rhs: rhs.clone(), out: out_table.clone()})} + ((_,Column::U16(lhs),_), (_,Column::U16(rhs),_)) => {block.plan.push($op5{lhs: lhs.clone(), rhs: rhs.clone(), out: out_table.clone()})} + ((_,Column::U32(lhs),_), (_,Column::U32(rhs),_)) => {block.plan.push($op5{lhs: lhs.clone(), rhs: rhs.clone(), out: out_table.clone()})} + ((_,Column::U64(lhs),_), (_,Column::U64(rhs),_)) => {block.plan.push($op5{lhs: lhs.clone(), rhs: rhs.clone(), out: out_table.clone()})} + ((_,Column::U128(lhs),_), (_,Column::U128(rhs),_)) => {block.plan.push($op5{lhs: lhs.clone(), rhs: rhs.clone(), out: out_table.clone()})} + ((_,Column::I8(lhs),_), (_,Column::I8(rhs),_)) => {block.plan.push($op5{lhs: lhs.clone(), rhs: rhs.clone(), out: out_table.clone()})} + ((_,Column::I16(lhs),_), (_,Column::I16(rhs),_)) => {block.plan.push($op5{lhs: lhs.clone(), rhs: rhs.clone(), out: out_table.clone()})} + ((_,Column::I32(lhs),_), (_,Column::I32(rhs),_)) => {block.plan.push($op5{lhs: lhs.clone(), rhs: rhs.clone(), out: out_table.clone()})} + ((_,Column::I64(lhs),_), (_,Column::I64(rhs),_)) => {block.plan.push($op5{lhs: lhs.clone(), rhs: rhs.clone(), out: out_table.clone()})} + ((_,Column::I128(lhs),_), (_,Column::I128(rhs),_)) => {block.plan.push($op5{lhs: lhs.clone(), rhs: rhs.clone(), out: out_table.clone()})} + ((_,Column::F32(lhs),_), (_,Column::F32(rhs),_)) => {block.plan.push($op5{lhs: lhs.clone(), rhs: rhs.clone(), out: out_table.clone()})} + ((_,Column::F64(lhs),_), (_,Column::F64(rhs),_)) => {block.plan.push($op5{lhs: lhs.clone(), rhs: rhs.clone(), out: out_table.clone()})} + ((_,Column::Bool(lhs),_), (_,Column::Bool(rhs),_)) => {block.plan.push($op5{lhs: lhs.clone(), rhs: rhs.clone(), out: out_table.clone()})} + ((_,Column::String(lhs),_), (_,Column::String(rhs),_)) => {block.plan.push($op5{lhs: lhs.clone(), rhs: rhs.clone(), out: out_table.clone()})} + x => {return Err(MechError{msg: "".to_string(), id: 7110, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + (_, TableShape::Pending(table_id)) | + (TableShape::Pending(table_id), _) => { + return Err(MechError{msg: "".to_string(), id: 7112, kind: MechErrorKind::PendingTable(*table_id)}); + } + x => {return Err(MechError{msg: "".to_string(), id: 7113, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + Ok(()) + } + } + ) +} diff --git a/src/core/src/function/logic.rs b/src/core/src/function/logic.rs new file mode 100644 index 0000000..a9d6079 --- /dev/null +++ b/src/core/src/function/logic.rs @@ -0,0 +1,324 @@ +use crate::*; +use std::cell::RefCell; +use std::rc::Rc; +use std::fmt::*; +use num_traits::*; + +#[cfg(feature = "parallel")] +use rayon::prelude::*; +use std::thread; + +lazy_static! { + pub static ref LOGIC_AND: u64 = hash_str("logic/and"); + pub static ref LOGIC_OR: u64 = hash_str("logic/or"); + pub static ref LOGIC_NOT: u64 = hash_str("logic/not"); + pub static ref LOGIC_XOR: u64 = hash_str("logic/xor"); +} + +logic_infix_ss!(AndSS,&&); +logic_infix_ss!(OrSS,||); +logic_infix_ss!(XorSS,^); + +logic_infix_vv!(AndVV,&&); +logic_infix_vv!(OrVV,||); +logic_infix_vv!(XorVV,^); + +#[cfg(feature = "parallel")] +logic_infix_par_vv!(ParAndVV,&&); +#[cfg(feature = "parallel")] +logic_infix_par_vv!(ParOrVV,||); +#[cfg(feature = "parallel")] +logic_infix_par_vv!(ParXorVV,^); + +logic_infix_vs!(AndVS,&&); +logic_infix_vs!(OrVS,||); +logic_infix_vs!(XorVS,^); + +#[cfg(feature = "parallel")] +logic_infix_par_vs!(ParAndVS,&&); +#[cfg(feature = "parallel")] +logic_infix_par_vs!(ParOrVS,||); +#[cfg(feature = "parallel")] +logic_infix_par_vs!(ParXorVS,^); + +logic_infix_sv!(AndSV,&&); +logic_infix_sv!(OrSV,||); +logic_infix_sv!(XorSV,^); + +#[cfg(feature = "parallel")] +logic_infix_par_sv!(ParAndSV,&&); +#[cfg(feature = "parallel")] +logic_infix_par_sv!(ParOrSV,||); +#[cfg(feature = "parallel")] +logic_infix_par_sv!(ParXorSV,^); + +logic_compiler!(LogicAnd,AndSS,AndVS,AndSV,AndVV); +logic_compiler!(LoigicOr,OrSS,OrVS,OrSV,OrVV); +logic_compiler!(LogicXor,XorSS,XorVS,XorSV,XorVV); + +// Scalar : Scalars +#[macro_export] +macro_rules! logic_infix_ss { + ($func_name:ident, $op:tt) => ( + #[derive(Debug)] + pub struct $func_name + { + pub lhs: ColumnV, pub rhs: ColumnV, pub out: ColumnV + } + impl MechFunction for $func_name + { + fn solve(&self) { + (self.out.borrow_mut())[0] = (self.lhs.borrow())[0] $op (self.rhs.borrow())[0]; + } + fn to_string(&self) -> String { format!("{:#?}", self)} + } + ) +} + +// Vector : Vector +#[macro_export] +macro_rules! logic_infix_vv { + ($func_name:ident, $op:tt) => ( + #[derive(Debug)] + pub struct $func_name { + pub lhs: ColumnV, pub rhs: ColumnV, pub out: ColumnV + } + + impl MechFunction for $func_name { + fn solve(&self) { + self.out.borrow_mut().iter_mut().zip(self.lhs.borrow().iter()).zip(self.rhs.borrow().iter()).for_each(|((out, lhs), rhs)| *out = *lhs $op *rhs); + } + fn to_string(&self) -> String { format!("{:#?}", self)} + } + ) +} + +#[macro_export] +macro_rules! logic_infix_par_vv { + ($func_name:ident, $op:tt) => ( + #[cfg(feature = "parallel")] + #[derive(Debug)] + pub struct $func_name { + pub lhs: ColumnV, pub rhs: ColumnV, pub out: ColumnV + } + impl MechFunction for $func_name { + fn solve(&self) { + self.out.borrow_mut().par_iter_mut().zip(self.lhs.borrow().par_iter()).zip(self.rhs.borrow().par_iter()).for_each(|((out, lhs), rhs)| *out = *lhs $op *rhs); + } + fn to_string(&self) -> String { format!("{:#?}", self)} + } + ) +} + +// Vector : Scalar +#[macro_export] +macro_rules! logic_infix_vs { + ($func_name:ident, $op:tt) => ( + #[derive(Debug)] + pub struct $func_name { + pub lhs: ColumnV, pub rhs: ColumnV, pub out: ColumnV + } + + impl MechFunction for $func_name { + fn solve(&self) { + let rhs = self.rhs.borrow()[0]; + self.out.borrow_mut().iter_mut().zip(self.lhs.borrow().iter()).for_each(|(out, lhs)| *out = *lhs $op rhs); + } + fn to_string(&self) -> String { format!("{:#?}", self)} + } + ) +} + +#[macro_export] +macro_rules! logic_infix_par_vs { + ($func_name:ident, $op:tt) => ( + #[cfg(feature = "parallel")] + #[derive(Debug)] + pub struct $func_name { + pub lhs: ColumnV, pub rhs: ColumnV, pub out: ColumnV + } + + impl MechFunction for $func_name { + fn solve(&self) { + let rhs = self.rhs.borrow()[0]; + self.out.borrow_mut().par_iter_mut().zip(self.lhs.borrow().par_iter()).for_each(|(out, lhs)| *out = *lhs $op rhs); + } + fn to_string(&self) -> String { format!("{:#?}", self)} + } + ) +} + +// Scalar : Vector +#[macro_export] +macro_rules! logic_infix_sv { + ($func_name:ident, $op:tt) => ( + #[derive(Debug)] + pub struct $func_name { + pub lhs: ColumnV, pub rhs: ColumnV, pub out: ColumnV + } + + impl MechFunction for $func_name { + fn solve(&self) { + let lhs = self.lhs.borrow()[0]; + self.out.borrow_mut().iter_mut().zip(self.rhs.borrow().iter()).for_each(|(out, rhs)| *out = lhs $op *rhs); + } + fn to_string(&self) -> String { format!("{:#?}", self)} + } + ) +} + +#[macro_export] +macro_rules! logic_infix_par_sv { + ($func_name:ident, $op:tt) => ( + #[cfg(feature = "parallel")] + #[derive(Debug)] + pub struct $func_name { + pub lhs: ColumnV, pub rhs: ColumnV, pub out: ColumnV + } + + impl MechFunction for $func_name { + fn solve(&self) { + let lhs = self.lhs.borrow()[0]; + self.out.borrow_mut().par_iter_mut().zip(self.rhs.borrow().par_iter()).for_each(|(out, rhs)| *out = lhs $op *rhs); + } + fn to_string(&self) -> String { format!("{:#?}", self)} + } + ) +} + +// Not Vector +#[derive(Debug)] +pub struct NotV { + pub arg: ColumnV, pub out: ColumnV +} + +impl MechFunction for NotV { + fn solve(&self) { + self.out.borrow_mut().iter_mut().zip(self.arg.borrow().iter()).for_each(|(out, arg)| *out = !(*arg)); + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + +// Not Dynamic +#[derive(Debug)] +pub struct NotD { + pub arg: ColumnV, + pub out: ColumnV, + pub out_table: OutTable, +} + +impl MechFunction for NotD { + fn solve(&self) { + let arg = self.arg.borrow(); + { + let mut out_table_brrw = self.out_table.borrow_mut(); + out_table_brrw.resize(arg.len(),1); + } + self.out.borrow_mut() + .iter_mut() + .zip(arg.iter()) + .for_each(|(out, arg)| *out = !(*arg)); + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + +// Not Scalar +#[derive(Debug)] +pub struct NotS +{ + pub arg: ColumnV, pub out: ColumnV +} +impl MechFunction for NotS +{ + fn solve(&self) { + (self.out.borrow_mut())[0] = !(self.arg.borrow())[0]; + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + +pub struct LogicNot {} + +impl MechFunctionCompiler for LogicNot { + fn compile(&self, block: &mut Block, arguments: &Vec, out: &Out) -> std::result::Result<(),MechError> { + let arg_dims = block.get_arg_dims(&arguments)?; + match &arg_dims[0] { + TableShape::Column(rows) => { + let mut argument_columns = block.get_arg_columns(arguments)?; + let out_column = block.get_out_column(out, *rows, ValueKind::Bool)?; + match (&argument_columns[0], &out_column) { + ((_,Column::Bool(arg),_), Column::Bool(out)) => { + block.plan.push(NotV{arg: arg.clone(), out: out.clone() }); + } + x => {return Err(MechError{msg: "".to_string(), id: 8213, kind: MechErrorKind::GenericError(format!("{:?}",x))});}, + } + } + TableShape::Scalar => { + let mut argument_columns = block.get_arg_columns(arguments)?; + let out_column = block.get_out_column(out, 1, ValueKind::Bool)?; + match (&argument_columns[0], &out_column) { + ((_,Column::Bool(arg),_), Column::Bool(out)) => { + block.plan.push(NotS{arg: arg.clone(), out: out.clone() }); + } + x => {return Err(MechError{msg: "".to_string(), id: 8214, kind: MechErrorKind::GenericError(format!("{:?}",x))});}, + } + } + TableShape::Dynamic(rows,1) => { + let (out_table_id,_,_) = &out; + let out_table = block.get_table(out_table_id)?; + { + let mut out_table_brrw = out_table.borrow_mut(); + out_table_brrw.dynamic = true; + } + let mut argument_columns = block.get_arg_columns(arguments)?; + let out_column = block.get_out_column(out, *rows, ValueKind::Bool)?; + match (&argument_columns[0], &out_column) { + ((_,Column::Bool(arg),_), Column::Bool(out)) => { + block.plan.push(NotD{arg: arg.clone(), out: out.clone(), out_table: out_table.clone() }); + } + x => {return Err(MechError{msg: "".to_string(), id: 8213, kind: MechErrorKind::GenericError(format!("{:?}",x))});}, + } + } + TableShape::Pending(table_id) => {return Err(MechError{msg: "".to_string(), id: 8215, kind: MechErrorKind::PendingTable(*table_id)});}, + x => {return Err(MechError{msg: "".to_string(), id: 8219, kind: MechErrorKind::GenericError(format!("{:?}",x))});}, + } + Ok(()) + } +} + +#[macro_export] +macro_rules! logic_compiler { + ($func_name:ident, $op1:tt,$op2:tt,$op3:tt,$op4:tt) => ( + + pub struct $func_name {} + + impl MechFunctionCompiler for $func_name { + fn compile(&self, block: &mut Block, arguments: &Vec, out: &Out) -> std::result::Result<(),MechError> { + let arg_dims = block.get_arg_dims(&arguments)?; + match (&arg_dims[0],&arg_dims[1]) { + (TableShape::Scalar, TableShape::Scalar) => { + let mut argument_columns = block.get_arg_columns(arguments)?; + let out_column = block.get_out_column(out, 1, ValueKind::Bool)?; + match (&argument_columns[0], &argument_columns[1], &out_column) { + ((_,Column::Bool(lhs),_), (_,Column::Bool(rhs),_), Column::Bool(out)) => { + block.plan.push($op1{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }); + } + x => {return Err(MechError{msg: "".to_string(), id: 8216, kind: MechErrorKind::GenericError(format!("{:?}",x))});}, + } + } + (TableShape::Column(lhs_rows), TableShape::Column(rhs_rows)) => { + let mut argument_columns = block.get_arg_columns(arguments)?; + let out_column = block.get_out_column(out, *lhs_rows, ValueKind::Bool)?; + match (&argument_columns[0], &argument_columns[1], &out_column) { + ((_,Column::Bool(lhs),_), (_,Column::Bool(rhs),_), Column::Bool(out)) => { + block.plan.push($op4{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }); + } + x => {return Err(MechError{msg: "".to_string(), id: 8217, kind: MechErrorKind::GenericError(format!("{:?}",x))});}, + } + } + x => {return Err(MechError{msg: "".to_string(), id: 8218, kind: MechErrorKind::GenericError(format!("{:?}",x))});}, + } + Ok(()) + } + } + ) +} \ No newline at end of file diff --git a/src/core/src/function/math.rs b/src/core/src/function/math.rs new file mode 100644 index 0000000..7f79113 --- /dev/null +++ b/src/core/src/function/math.rs @@ -0,0 +1,1219 @@ +use crate::*; +use std::cell::RefCell; +use std::rc::Rc; +use std::fmt::*; +use num_traits::*; +use std::ops::*; + +#[cfg(feature = "parallel")] +use rayon::prelude::*; +use std::thread; + +lazy_static! { + pub static ref MATH_ADD: u64 = hash_str("math/add"); + pub static ref MATH_DIVIDE: u64 = hash_str("math/divide"); + pub static ref MATH_MULTIPLY: u64 = hash_str("math/multiply"); + pub static ref MATH_SUBTRACT: u64 = hash_str("math/subtract"); + pub static ref MATH_EXPONENT: u64 = hash_str("math/exponent"); + pub static ref MATH_NEGATE: u64 = hash_str("math/negate"); +} + +impl MechNumArithmetic for U8 {} +impl MechNumArithmetic for U16 {} +impl MechNumArithmetic for U32 {} +impl MechNumArithmetic for U64 {} +impl MechNumArithmetic for U128 {} +impl MechNumArithmetic for I8 {} +impl MechNumArithmetic for I16 {} +impl MechNumArithmetic for I32 {} +impl MechNumArithmetic for I64 {} +impl MechNumArithmetic for I128 {} +impl MechNumArithmetic for F32 {} +impl MechNumArithmetic for F64 {} +impl MechNumArithmetic for f32 {} +impl MechNumArithmetic for f64 {} + + +// Scalar : Scalar +binary_infix_ss!(AddSS,add); +binary_infix_ss!(SubSS,sub); +binary_infix_ss!(MulSS,mul); +binary_infix_ss!(DivSS,div); +binary_infix_ss!(ExpSS,pow); + +// Scalar : Vector +binary_infix_sv!(AddSV,add); +binary_infix_sv!(SubSV,sub); +binary_infix_sv!(MulSV,mul); +binary_infix_sv!(DivSV,div); +binary_infix_sv!(ExpSV,pow); + +// Vector : Scalar +binary_infix_vs!(AddVS,add); +binary_infix_vs!(SubVS,sub); +binary_infix_vs!(MulVS,mul); +binary_infix_vs!(DivVS,div); +binary_infix_vs!(ExpVS,pow); + +// Vector : Vector +binary_infix_vv!(AddVV,add); +binary_infix_vv!(SubVV,sub); +binary_infix_vv!(MulVV,mul); +binary_infix_vv!(DivVV,div); +binary_infix_vv!(ExpVV,pow); + +// Parallel Vector : Scalar +#[cfg(feature = "parallel")] +binary_infix_par_vs!(ParAddVS,add); +#[cfg(feature = "parallel")] +binary_infix_par_vs!(ParSubVS,sub); +#[cfg(feature = "parallel")] +binary_infix_par_vs!(ParMulVS,mul); +#[cfg(feature = "parallel")] +binary_infix_par_vs!(ParDivVS,div); +#[cfg(feature = "parallel")] +binary_infix_par_vs!(ExpParVS,pow); + +// Parallel Vector : Vector +#[cfg(feature = "parallel")] +binary_infix_par_vv!(ParAddVV,add); +#[cfg(feature = "parallel")] +binary_infix_par_vv!(ParSubVV,sub); +#[cfg(feature = "parallel")] +binary_infix_par_vv!(ParMulVV,mul); +#[cfg(feature = "parallel")] +binary_infix_par_vv!(ParDivVV,div); +#[cfg(feature = "parallel")] +binary_infix_par_vv!(ExpParVV,pow); + +// Vector : Vector In Place +binary_infix_vvip!(AddVVIP,add); + +// Parallel Vector : Vector In Place +#[cfg(feature = "parallel")] +binary_infix_par_vvip!(ParAddVVIP,add); + +// Parallel Vector : Scalar In Place +#[cfg(feature = "parallel")] +binary_infix_par_vsip!(ParAddVSIP,add); + +// Vector : Scalar In Place +binary_infix_vsip!(AddVSIP,add); + +// Parallel Scalar : Vector +#[cfg(feature = "parallel")] +binary_infix_par_sv!(ParAddSV,add); +#[cfg(feature = "parallel")] +binary_infix_par_sv!(ParSubSV,sub); +#[cfg(feature = "parallel")] +binary_infix_par_sv!(ParMulSV,mul); +#[cfg(feature = "parallel")] +binary_infix_par_sv!(ParDivSV,div); +#[cfg(feature = "parallel")] +binary_infix_par_sv!(ExpParSV,pow); + +// Dynamic : Dynamic +binary_infix_dd!(AddDD,add); +binary_infix_dd!(SubDD,sub); +binary_infix_dd!(MulDD,mul); +binary_infix_dd!(DivDD,div); +binary_infix_dd!(ExpDD,pow); + +math_compiler!(MathAdd,AddSS,AddSV,AddVS,AddVV,AddDD); +math_compiler!(MathSub,SubSS,SubSV,SubVS,SubVV,SubDD); +math_compiler!(MathMul,MulSS,MulSV,MulVS,MulVV,MulDD); +math_compiler!(MathDiv,DivSS,DivSV,DivVS,DivVV,DivDD); +math_compiler!(MathExp,ExpSS,ExpSV,ExpVS,ExpVV,ExpDD); + +// Negate Vector +#[derive(Debug)] +pub struct NegateS +where T: std::ops::Neg + Copy + Debug +{ + pub arg: ColumnV, pub out: ColumnV +} + +impl MechFunction for NegateS +where T: std::ops::Neg + Copy + Debug +{ + fn solve(&self) { + (self.out.borrow_mut())[0] = -((self.arg.borrow())[0]); + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + +// Negate Vector +#[derive(Debug)] +pub struct NegateV +{ + pub arg: ColumnV, pub out: ColumnV +} + +impl MechFunction for NegateV +where T: std::ops::Neg + Into + Copy + Debug, + U: std::ops::Neg + Into + Copy + Debug, +{ + fn solve(&self) { + self.out.borrow_mut().iter_mut().zip(self.arg.borrow().iter()).for_each(|(out, arg)| *out = -(T::into(*arg))); + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + + +#[macro_export] +macro_rules! binary_infix_sv { + ($func_name:ident, $op:tt) => ( + #[derive(Debug)] + pub struct $func_name { + pub lhs: ColumnV, pub rhs: ColumnV, pub out: ColumnV + } + impl MechFunction for $func_name + where T: MechNumArithmetic + Copy + Debug + { + fn solve(&self) { + let lhs = self.lhs.borrow()[0]; + self.out.borrow_mut().iter_mut().zip(self.rhs.borrow().iter()).for_each(|(out, rhs)| *out = lhs.$op(*rhs)); + } + fn to_string(&self) -> String { format!("{:#?}", self)} + } + ) +} + +#[macro_export] +macro_rules! binary_infix_vs { + ($func_name:ident, $op:tt) => ( + #[derive(Debug)] + pub struct $func_name { + pub lhs: ColumnV, pub rhs: ColumnV, pub out: ColumnV + } + impl MechFunction for $func_name + where T: MechNumArithmetic + Copy + Debug + { + fn solve(&self) { + let rhs = self.rhs.borrow()[0]; + self.out.borrow_mut().iter_mut().zip(self.lhs.borrow().iter()).for_each(|(out, lhs)| *out = (*lhs).$op(rhs)); + } + fn to_string(&self) -> String { format!("{:#?}", self)} + } + ) +} + +#[macro_export] +macro_rules! binary_infix_vv { + ($func_name:ident, $op:tt) => ( + + #[derive(Debug)] + pub struct $func_name { + pub lhs: (ColumnV, usize, usize), + pub rhs: (ColumnV, usize, usize), + pub out: ColumnV + } + impl MechFunction for $func_name + where T: Copy + Debug + Clone + MechNumArithmetic + Into + Sync + Send, + U: Copy + Debug + Clone + MechNumArithmetic + Into + Sync + Send, + V: Copy + Debug + Clone + MechNumArithmetic + Sync + Send, + { + fn solve(&self) { + let (lhs,lsix,leix) = &self.lhs; + let (rhs,rsix,reix) = &self.rhs; + self.out.borrow_mut() + .iter_mut() + .zip(lhs.borrow()[*lsix..=*leix].iter().map(|x| T::into(*x))) + .zip(rhs.borrow()[*rsix..=*reix].iter().map(|x| U::into(*x))) + .for_each(|((out, lhs),rhs)| *out = lhs.$op(rhs)); + } + fn to_string(&self) -> String { format!("{:#?}", self)} + } + ) +} + +#[macro_export] +macro_rules! binary_infix_par_vv { + ($func_name:ident, $op:tt) => ( + #[cfg(feature = "parallel")] + #[derive(Debug)] + pub struct $func_name { + pub lhs: (ColumnV, usize, usize), + pub rhs: (ColumnV, usize, usize), + pub out: ColumnV + } + impl MechFunction for $func_name + where T: Copy + Debug + Clone + MechNumArithmetic + Into + Sync + Send, + U: Copy + Debug + Clone + MechNumArithmetic + Into + Sync + Send, + V: Copy + Debug + Clone + MechNumArithmetic + Sync + Send, + { + fn solve(&self) { + let (lhs,lsix,leix) = &self.lhs; + let (rhs,rsix,reix) = &self.rhs; + self.out.borrow_mut() + .par_iter_mut() + .zip(lhs.borrow()[*lsix..=*leix].par_iter().map(|x| T::into(*x))) + .zip(rhs.borrow()[*rsix..=*reix].par_iter().map(|x| U::into(*x))) + .for_each(|((out, lhs),rhs)| *out = lhs.$op(rhs)); + } + fn to_string(&self) -> String { format!("{:#?}", self)} + } + ) +} + +#[macro_export] +macro_rules! binary_infix_par_vvip { + ($func_name:ident, $op:tt) => ( + #[cfg(feature = "parallel")] + #[derive(Debug)] + pub struct $func_name { + pub arg: ColumnV, pub out: ColumnV + } + impl MechFunction for $func_name + where T: MechNumArithmetic + Copy + Debug + Send + Sync + { + fn solve(&self) { + self.out.borrow_mut() + .par_iter_mut() + .zip(self.arg.borrow().par_iter()) + .for_each(|(out, arg)| *out = (*out).$op(*arg)); + } + fn to_string(&self) -> String { format!("{:#?}", self)} + } + ) +} + +#[macro_export] +macro_rules! binary_infix_vvip { + ($func_name:ident, $op:tt) => ( + + #[derive(Debug)] + pub struct $func_name { + pub arg: ColumnV, pub out: ColumnV + } + impl MechFunction for $func_name + where T: MechNumArithmetic + Copy + Debug + Send + Sync + { + fn solve(&self) { + self.out.borrow_mut() + .iter_mut() + .zip(self.arg.borrow().iter()) + .for_each(|(out, arg)| *out = (*out).$op(*arg)); + } + fn to_string(&self) -> String { format!("{:#?}", self)} + } + ) +} + +#[macro_export] +macro_rules! binary_infix_par_vs { + ($func_name:ident, $op:tt) => ( + #[cfg(feature = "parallel")] + #[derive(Debug)] + pub struct $func_name { + pub lhs: ColumnV, pub rhs: ColumnV, pub out: ColumnV + } + impl MechFunction for $func_name + where T: MechNumArithmetic + Copy + Debug + Send + Sync + { + fn solve(&self) { + let rhs = self.rhs.borrow()[0]; + self.out.borrow_mut().par_iter_mut().zip(&(*self.lhs.borrow())).for_each(|(out, lhs)| *out = (*lhs).$op(rhs)); + } + fn to_string(&self) -> String { format!("{:#?}", self)} + } + ) +} + +#[macro_export] +macro_rules! binary_infix_par_vsip { + ($func_name:ident, $op:tt) => ( + #[cfg(feature = "parallel")] + #[derive(Debug)] + pub struct $func_name { + pub arg: ColumnV, pub out: ColumnV + } + impl MechFunction for $func_name + where T: MechNumArithmetic + Copy + Debug + Send + Sync + { + fn solve(&self) { + let arg = self.arg.borrow()[0]; + self.out.borrow_mut().par_iter_mut().for_each(|out| *out = (*out).$op(arg)); + } + fn to_string(&self) -> String { format!("{:#?}", self)} + } + ) +} + +#[macro_export] +macro_rules! binary_infix_vsip { + ($func_name:ident, $op:tt) => ( + + #[derive(Debug)] + pub struct $func_name { + pub arg: ColumnV, pub out: ColumnV + } + impl MechFunction for $func_name + where T: MechNumArithmetic + Copy + Debug + Send + Sync + { + fn solve(&self) { + let arg = self.arg.borrow()[0]; + self.out.borrow_mut().iter_mut().for_each(|out| *out = (*out).$op(arg)); + } + fn to_string(&self) -> String { format!("{:#?}", self)} + } + ) +} + +#[macro_export] +macro_rules! binary_infix_ss { + ($func_name:ident, $op:tt) => ( + #[derive(Debug)] + pub struct $func_name { + pub lhs: ColumnV, pub lix: usize, pub rhs: ColumnV, pub rix: usize, pub out: ColumnV + } + impl MechFunction for $func_name + where T: MechNumArithmetic + Copy + Debug + { + fn solve(&self) { + let lhs = self.lhs.borrow()[self.lix]; + let rhs = self.rhs.borrow()[self.rix]; + self.out.borrow_mut().iter_mut().for_each(|out| *out = lhs.$op(rhs)); + } + fn to_string(&self) -> String { format!("{:#?}", self)} + } + ) +} + +#[macro_export] +macro_rules! binary_infix_par_sv { + ($func_name:ident, $op:tt) => ( + #[cfg(feature = "parallel")] + #[derive(Debug)] + pub struct $func_name { + pub lhs: ColumnV, pub rhs: ColumnV, pub out: ColumnV + } + impl MechFunction for $func_name + where T: MechNumArithmetic + Copy + Debug + { + fn solve(&self) { + let lhs = self.lhs.borrow()[0]; + self.out.borrow_mut().iter_mut().zip(self.rhs.borrow().iter()).for_each(|(out, rhs)| *out = lhs.$op(*rhs)); + } + fn to_string(&self) -> String { format!("{:#?}", self)} + } + ) +} + +#[macro_export] +macro_rules! binary_infix_dd { + ($func_name:ident, $op:tt) => ( + + #[derive(Debug)] + pub struct $func_name { + pub lhs: ColumnV, + pub rhs: ColumnV, + pub out_col: ColumnV, + pub out: OutTable, + } + impl MechFunction for $func_name + where T: Copy + Debug + Clone + MechNumArithmetic + Into + Sync + Send, + U: Copy + Debug + Clone + MechNumArithmetic + Into + Sync + Send, + V: Copy + Debug + Clone + MechNumArithmetic + Sync + Send, + { + fn solve(&self) { + let lhs = &self.lhs.borrow(); + let rhs = &self.rhs.borrow(); + let mut out_table_brrw = self.out.borrow_mut(); + out_table_brrw.resize(lhs.len(),1); + self.out_col.borrow_mut() + .iter_mut() + .zip(lhs.iter().map(|x| T::into(*x))) + .zip(rhs.iter().map(|x| U::into(*x))) + .for_each(|((out, lhs),rhs)| *out = lhs.$op(rhs)); + } + fn to_string(&self) -> String { format!("{:#?}", self)} + } + ) +} + +pub struct MathNegate{} + +impl MechFunctionCompiler for MathNegate { + + fn compile(&self, block: &mut Block, arguments: &Vec, out: &(TableId, TableIndex, TableIndex)) -> std::result::Result<(),MechError> { + let arg_dims = block.get_arg_dims(&arguments)?; + match &arg_dims[0] { + TableShape::Column(rows) => { + let mut argument_columns = block.get_arg_columns(arguments)?; + let out_column = block.get_out_column(out, *rows, ValueKind::I8)?; + match (&argument_columns[0], &out_column) { + ((_,Column::I8(arg),_), Column::I8(out)) => { block.plan.push(NegateV{arg: arg.clone(), out: out.clone() });} + ((_,Column::I16(arg),_), Column::I16(out)) => { block.plan.push(NegateV{arg: arg.clone(), out: out.clone() });} + ((_,Column::I32(arg),_), Column::I32(out)) => { block.plan.push(NegateV{arg: arg.clone(), out: out.clone() });} + ((_,Column::I64(arg),_), Column::I64(out)) => { block.plan.push(NegateV{arg: arg.clone(), out: out.clone() });} + ((_,Column::I128(arg),_), Column::I128(out)) => { block.plan.push(NegateV{arg: arg.clone(), out: out.clone() });} + ((_,Column::F32(arg),_), Column::F32(out)) => { block.plan.push(NegateV{arg: arg.clone(), out: out.clone() });} + ((_,Column::F64(arg),_), Column::F64(out)) => { block.plan.push(NegateV{arg: arg.clone(), out: out.clone() });} + ((_,Column::F32(arg),_), Column::I8(out)) => { block.plan.push(NegateV{arg: arg.clone(), out: out.clone() });} + x => {return Err(MechError{msg: "".to_string(), id: 6001, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + TableShape::Scalar => { + let mut argument_columns = block.get_arg_columns(arguments)?; + let (_,col,_) = &argument_columns[0]; + let out_column = block.get_out_column(out, 1, col.kind())?; + match (&argument_columns[0], &out_column) { + ((_,Column::I8(arg),_), Column::I8(out)) => block.plan.push(NegateS{arg: arg.clone(), out: out.clone() }), + ((_,Column::I16(arg),_), Column::I16(out)) => block.plan.push(NegateS{arg: arg.clone(), out: out.clone() }), + ((_,Column::I32(arg),_), Column::I32(out)) => block.plan.push(NegateS{arg: arg.clone(), out: out.clone() }), + ((_,Column::I64(arg),_), Column::I64(out)) => block.plan.push(NegateS{arg: arg.clone(), out: out.clone() }), + ((_,Column::I128(arg),_), Column::I128(out)) => block.plan.push(NegateS{arg: arg.clone(), out: out.clone() }), + ((_,Column::F64(arg),_), Column::F64(out)) => block.plan.push(NegateS{arg: arg.clone(), out: out.clone() }), + ((_,Column::F32(arg),_), Column::F32(out)) => block.plan.push(NegateS{arg: arg.clone(), out: out.clone() }), + x => {return Err(MechError{msg: "".to_string(), id: 6002, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + x => {return Err(MechError{msg: "".to_string(), id: 6003, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + Ok(()) + } +} + +/* +#[derive(Debug)] +pub struct ConcatVV { + pub lhs: (ColumnV, usize, usize), + pub rhs: (ColumnV, usize, usize), + pub out: ColumnV +} +impl MechFunction for ConcatVV +where T: Copy + Debug + Clone + Sync + Send, + U: Copy + Debug + Clone + Sync + Send, +{ + fn solve(&self) { + let (lhs,lsix,leix) = &self.lhs; + let (rhs,rsix,reix) = &self.rhs; + self.out.borrow_mut() + .iter_mut() + .zip(lhs.borrow()[*lsix..=*leix].iter()) + .zip(rhs.borrow()[*rsix..=*reix].iter()) + .for_each(|((out, lhs),rhs)| + *out = MechString::from_string(format!("{:?}{:?}", lhs, *rhs))); + } + fn to_string(&self) -> String { format!("{:#?}", self)} +}*/ + +#[macro_export] +macro_rules! math_compiler { + ($func_name:ident, $op1:tt,$op2:tt,$op3:tt,$op4:tt,$op5:tt) => ( + + pub struct $func_name {} + + impl MechFunctionCompiler for $func_name { + fn compile(&self, block: &mut Block, arguments: &Vec, out: &(TableId, TableIndex, TableIndex)) -> std::result::Result<(),MechError> { + let arg_shapes = block.get_arg_dims(&arguments)?; + // Now decide on the correct tfm based on the shape + match (&arg_shapes[0],&arg_shapes[1]) { + (TableShape::Scalar, TableShape::Scalar) => { + let mut argument_scalars = block.get_arg_columns(arguments)?; + resize_one(block,out); + match (&argument_scalars[0], &argument_scalars[1]) { + ((_,Column::U8(lhs),ColumnIndex::Index(lix)), (_,Column::U8(rhs),ColumnIndex::Index(rix))) => { + let mut out_column = block.get_out_column(out, 1, ValueKind::U8)?; + if let Column::U8(out) = out_column { + block.plan.push($op4{lhs: (lhs.clone(),*lix,*lix), rhs: (rhs.clone(),*rix,*rix), out: out.clone()}) + } + }, + ((_,Column::U8(lhs),ColumnIndex::Index(lix)), (_,Column::F32(rhs),ColumnIndex::Index(rix))) => { + let mut out_column = block.get_out_column(out, 1, ValueKind::U8)?; + if let Column::U8(out) = out_column { + block.plan.push($op4{lhs: (lhs.clone(),*lix,*lix), rhs: (rhs.clone(),*rix,*rix), out: out.clone()}) + } + }, + ((_,Column::U16(lhs),ColumnIndex::Index(lix)), (_,Column::U16(rhs),ColumnIndex::Index(rix))) => { + let mut out_column = block.get_out_column(out, 1, ValueKind::U16)?; + if let Column::U16(out) = out_column { + block.plan.push($op4{lhs: (lhs.clone(),*lix,*lix), rhs: (rhs.clone(),*rix,*rix), out: out.clone()}) + } + }, + ((_,Column::U32(lhs),ColumnIndex::Index(lix)), (_,Column::U32(rhs),ColumnIndex::Index(rix))) => { + let mut out_column = block.get_out_column(out, 1, ValueKind::U32)?; + if let Column::U32(out) = out_column { + block.plan.push($op4{lhs: (lhs.clone(),*lix,*lix), rhs: (rhs.clone(),*rix,*rix), out: out.clone()}) + } + }, + ((_,Column::U64(lhs),ColumnIndex::Index(lix)), (_,Column::U64(rhs),ColumnIndex::Index(rix))) => { + let mut out_column = block.get_out_column(out, 1, ValueKind::U64)?; + if let Column::U64(out) = out_column { + block.plan.push($op4{lhs: (lhs.clone(),*lix,*lix), rhs: (rhs.clone(),*rix,*rix), out: out.clone()}) + } + }, + ((_,Column::U128(lhs),ColumnIndex::Index(lix)), (_,Column::U128(rhs),ColumnIndex::Index(rix))) => { + let mut out_column = block.get_out_column(out, 1, ValueKind::U128)?; + if let Column::U128(out) = out_column { + block.plan.push($op4{lhs: (lhs.clone(),*lix,*lix), rhs: (rhs.clone(),*rix,*rix), out: out.clone()}) + } + }, + ((_,Column::I8(lhs),ColumnIndex::Index(lix)), (_,Column::I8(rhs),ColumnIndex::Index(rix))) => { + let mut out_column = block.get_out_column(out, 1, ValueKind::I8)?; + if let Column::I8(out) = out_column { + block.plan.push($op4{lhs: (lhs.clone(),*lix,*lix), rhs: (rhs.clone(),*rix,*rix), out: out.clone()}) + } + }, + ((_,Column::I16(lhs),ColumnIndex::Index(lix)), (_,Column::I16(rhs),ColumnIndex::Index(rix))) => { + let mut out_column = block.get_out_column(out, 1, ValueKind::I16)?; + if let Column::I16(out) = out_column { + block.plan.push($op4{lhs: (lhs.clone(),*lix,*lix), rhs: (rhs.clone(),*rix,*rix), out: out.clone()}) + } + }, + ((_,Column::I32(lhs),ColumnIndex::Index(lix)), (_,Column::I32(rhs),ColumnIndex::Index(rix))) => { + let mut out_column = block.get_out_column(out, 1, ValueKind::I32)?; + if let Column::I32(out) = out_column { + block.plan.push($op4{lhs: (lhs.clone(),*lix,*lix), rhs: (rhs.clone(),*rix,*rix), out: out.clone()}) + } + }, + ((_,Column::I64(lhs),ColumnIndex::Index(lix)), (_,Column::I64(rhs),ColumnIndex::Index(rix))) => { + let mut out_column = block.get_out_column(out, 1, ValueKind::I64)?; + if let Column::I64(out) = out_column { + block.plan.push($op4{lhs: (lhs.clone(),*lix,*lix), rhs: (rhs.clone(),*rix,*rix), out: out.clone()}) + } + }, + ((_,Column::I128(lhs),ColumnIndex::Index(lix)), (_,Column::I128(rhs),ColumnIndex::Index(rix))) => { + let mut out_column = block.get_out_column(out, 1, ValueKind::I128)?; + if let Column::I128(out) = out_column { + block.plan.push($op4{lhs: (lhs.clone(),*lix,*lix), rhs: (rhs.clone(),*rix,*rix), out: out.clone()}) + } + }, + ((_,Column::U64(lhs),ColumnIndex::Index(lix)), (_,Column::F32(rhs),ColumnIndex::Index(rix))) => { + let mut out_column = block.get_out_column(out, 1, ValueKind::F32)?; + if let Column::F32(out) = out_column { + block.plan.push($op4{lhs: (lhs.clone(),*lix,*lix), rhs: (rhs.clone(),*rix,*rix), out: out.clone()}) + } + }, + ((_,Column::Speed(lhs),ColumnIndex::Index(lix)), (_,Column::Time(rhs),ColumnIndex::Index(rix))) => { + let mut out_column = block.get_out_column(out, 1, ValueKind::Length)?; + if let Column::Length(out) = out_column { block.plan.push($op4{lhs: (lhs.clone(),*lix,*lix), rhs: (rhs.clone(),*rix,*rix), out: out.clone()}) } + } + ((_,Column::Length(lhs),ColumnIndex::Index(lix)), (_,Column::Length(rhs),ColumnIndex::Index(rix))) => { + let mut out_column = block.get_out_column(out, 1, ValueKind::Length)?; + if let Column::Length(out) = out_column { block.plan.push($op4{lhs: (lhs.clone(),*lix,*lix), rhs: (rhs.clone(),*rix,*rix), out: out.clone()}) } + } + ((_,Column::Time(lhs),ColumnIndex::Index(lix)), (_,Column::Time(rhs),ColumnIndex::Index(rix))) => { + let mut out_column = block.get_out_column(out, 1, ValueKind::Time)?; + if let Column::Time(out) = out_column { block.plan.push($op4{lhs: (lhs.clone(),*lix,*lix), rhs: (rhs.clone(),*rix,*rix), out: out.clone()}) } + } + ((_,Column::F32(lhs),ColumnIndex::Index(lix)), (_,Column::F32(rhs),ColumnIndex::Index(rix))) => { + let mut out_column = block.get_out_column(out, 1, ValueKind::F32)?; + if let Column::F32(out) = out_column { + block.plan.push($op4{lhs: (lhs.clone(),*lix,*lix), rhs: (rhs.clone(),*rix,*rix), out: out.clone()}) + } + }, + ((_,Column::F64(lhs),ColumnIndex::Index(lix)), (_,Column::F64(rhs),ColumnIndex::Index(rix))) => { + let mut out_column = block.get_out_column(out, 1, ValueKind::F64)?; + if let Column::F64(out) = out_column { + block.plan.push($op4{lhs: (lhs.clone(),*lix,*lix), rhs: (rhs.clone(),*rix,*rix), out: out.clone()}) + } + }, + ((_,Column::String(lhs),ColumnIndex::Index(lix)), (_,Column::F32(rhs),ColumnIndex::Index(rix))) => { + let mut out_column = block.get_out_column(out, 1, ValueKind::String)?; + if let Column::String(out) = out_column { + //block.plan.push(ConcatVV{lhs: (lhs.clone(),*lix,*lix), rhs: (rhs.clone(),*rix,*rix), out: out.clone()}) + } + }, + x => {return Err(MechError{msg: "".to_string(), id: 6004, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + (TableShape::Scalar, TableShape::Column(rows)) => { + let mut argument_columns = block.get_arg_columns(arguments)?; + let (_,col,_) = &argument_columns[0]; + let mut out_column = block.get_out_column(out, *rows, col.kind())?; + match (&argument_columns[0], &argument_columns[1], &out_column) { + ((_,Column::F32(lhs),_), (_,Column::F32(rhs),_), Column::F32(out)) => { block.plan.push($op2{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) } + ((_,Column::F64(lhs),_), (_,Column::F64(rhs),_), Column::F64(out)) => { block.plan.push($op2{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) } + ((_,Column::U8(lhs),_), (_,Column::U8(rhs),_), Column::U8(out)) => { block.plan.push($op2{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) } + ((_,Column::U16(lhs),_), (_,Column::U16(rhs),_), Column::U16(out)) => { block.plan.push($op2{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) } + ((_,Column::U32(lhs),_), (_,Column::U32(rhs),_), Column::U32(out)) => { block.plan.push($op2{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) } + ((_,Column::U64(lhs),_), (_,Column::U64(rhs),_), Column::U64(out)) => { block.plan.push($op2{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) } + ((_,Column::U128(lhs),_), (_,Column::U128(rhs),_), Column::U128(out)) => { block.plan.push($op2{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) } + ((_,Column::I8(lhs),_), (_,Column::I8(rhs),_), Column::I8(out)) => { block.plan.push($op2{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) } + ((_,Column::I16(lhs),_), (_,Column::I16(rhs),_), Column::I16(out)) => { block.plan.push($op2{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) } + ((_,Column::I32(lhs),_), (_,Column::I32(rhs),_), Column::I32(out)) => { block.plan.push($op2{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) } + ((_,Column::I64(lhs),_), (_,Column::I64(rhs),_), Column::I64(out)) => { block.plan.push($op2{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) } + ((_,Column::I128(lhs),_), (_,Column::I128(rhs),_), Column::I128(out)) => { block.plan.push($op2{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) } + x => {return Err(MechError{msg: "".to_string(), id: 6005, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + (TableShape::Column(rows), TableShape::Scalar) => { + let mut argument_columns = block.get_arg_columns(arguments)?; + let (_,col,_) = &argument_columns[0]; + match (&argument_columns[0], &argument_columns[1]) { + ((_,Column::U8(lhs),_), (_,Column::U8(rhs),_)) => { + let mut out_column = block.get_out_column(out, *rows, ValueKind::U8)?; + if let Column::U8(out) = out_column { + block.plan.push($op3{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + ((_,Column::U16(lhs),_), (_,Column::U16(rhs),_)) => { + let mut out_column = block.get_out_column(out, *rows, ValueKind::U16)?; + if let Column::U16(out) = out_column { + block.plan.push($op3{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + ((_,Column::U32(lhs),_), (_,Column::U32(rhs),_)) => { + let mut out_column = block.get_out_column(out, *rows, ValueKind::U32)?; + if let Column::U32(out) = out_column { + block.plan.push($op3{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + ((_,Column::U64(lhs),_), (_,Column::U64(rhs),_)) => { + let mut out_column = block.get_out_column(out, *rows, ValueKind::U64)?; + if let Column::U64(out) = out_column { + block.plan.push($op3{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + ((_,Column::U128(lhs),_), (_,Column::U128(rhs),_)) => { + let mut out_column = block.get_out_column(out, *rows, ValueKind::U128)?; + if let Column::U128(out) = out_column { + block.plan.push($op3{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + ((_,Column::I8(lhs),_), (_,Column::I8(rhs),_)) => { + let mut out_column = block.get_out_column(out, *rows, ValueKind::I8)?; + if let Column::I8(out) = out_column { + block.plan.push($op3{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + ((_,Column::I16(lhs),_), (_,Column::I16(rhs),_)) => { + let mut out_column = block.get_out_column(out, *rows, ValueKind::I16)?; + if let Column::I16(out) = out_column { + block.plan.push($op3{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + ((_,Column::I32(lhs),_), (_,Column::I32(rhs),_)) => { + let mut out_column = block.get_out_column(out, *rows, ValueKind::I32)?; + if let Column::I32(out) = out_column { + block.plan.push($op3{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + ((_,Column::I64(lhs),_), (_,Column::I64(rhs),_)) => { + let mut out_column = block.get_out_column(out, *rows, ValueKind::I64)?; + if let Column::I64(out) = out_column { + block.plan.push($op3{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + ((_,Column::I128(lhs),_), (_,Column::I128(rhs),_)) => { + let mut out_column = block.get_out_column(out, *rows, ValueKind::I128)?; + if let Column::I128(out) = out_column { + block.plan.push($op3{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + ((_,Column::F32(lhs),_), (_,Column::F32(rhs),_)) => { + let mut out_column = block.get_out_column(out, *rows, ValueKind::F32)?; + if let Column::F32(out) = out_column { + block.plan.push($op3{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + ((_,Column::F64(lhs),_), (_,Column::F64(rhs),_)) => { + let mut out_column = block.get_out_column(out, *rows, ValueKind::F64)?; + if let Column::F64(out) = out_column { + block.plan.push($op3{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + ((_,Column::Length(lhs),_), (_,Column::Length(rhs),_)) => { + let mut out_column = block.get_out_column(out, *rows, ValueKind::Length)?; + if let Column::Length(out) = out_column { + block.plan.push($op3{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + ((_,Column::Speed(lhs),_), (_,Column::Speed(rhs),_)) => { + let mut out_column = block.get_out_column(out, *rows, ValueKind::Speed)?; + if let Column::Speed(out) = out_column { + block.plan.push($op3{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + ((_,Column::Time(lhs),_), (_,Column::Time(rhs),_)) => { + let mut out_column = block.get_out_column(out, *rows, ValueKind::Time)?; + if let Column::Time(out) = out_column { + block.plan.push($op3{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + x => {return Err(MechError{msg: "".to_string(), id: 6006, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + (TableShape::Column(lhs_rows), TableShape::Column(rhs_rows)) => { + if lhs_rows != rhs_rows { + return Err(MechError{msg: "".to_string(), id: 6007, kind: MechErrorKind::DimensionMismatch(vec![(*lhs_rows,0),(*rhs_rows,0)])}); + } + let mut argument_columns = block.get_arg_columns(arguments)?; + let (_,col,_) = &argument_columns[0]; + let out_column = block.get_out_column(out, *lhs_rows, col.kind())?; + match (&argument_columns[0], &argument_columns[1], &out_column) { + ((_,Column::I8(lhs),_),(_,Column::I8(rhs),_),Column::I8(out)) => { block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) }, + ((_,Column::I16(lhs),_),(_,Column::I16(rhs),_),Column::I16(out)) => { block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) }, + ((_,Column::I32(lhs),_),(_,Column::I32(rhs),_),Column::I32(out)) => { block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) }, + ((_,Column::I64(lhs),_),(_,Column::I64(rhs),_),Column::I64(out)) => { block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) }, + ((_,Column::I128(lhs),_),(_,Column::I128(rhs),_),Column::I128(out)) => { block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) }, + ((_,Column::U8(lhs),_),(_,Column::U8(rhs),_),Column::U8(out)) => { block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) }, + ((_,Column::U16(lhs),_),(_,Column::U16(rhs),_),Column::U16(out)) => { block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) }, + ((_,Column::U32(lhs),_),(_,Column::U32(rhs),_),Column::U32(out)) => { block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) }, + ((_,Column::U64(lhs),_),(_,Column::U64(rhs),_),Column::U64(out)) => { block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) }, + ((_,Column::U128(lhs),_),(_,Column::U128(rhs),_),Column::U128(out)) => { block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) }, + ((_,Column::F32(lhs),_),(_,Column::F32(rhs),_),Column::F32(out)) => { block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) }, + ((_,Column::F64(lhs),_),(_,Column::F64(rhs),_),Column::F64(out)) => { block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) }, + ((_,Column::Length(lhs),_),(_,Column::Length(rhs),_),Column::Length(out)) => { block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) }, + ((_,Column::Speed(lhs),_),(_,Column::Speed(rhs),_),Column::Speed(out)) => { block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) }, + ((_,Column::Time(lhs),_),(_,Column::Time(rhs),_),Column::Time(out)) => { block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) }, + x => {return Err(MechError{msg: "".to_string(), id: 6008, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + (TableShape::Matrix(_,cols), TableShape::Scalar) | + (TableShape::Row(cols), TableShape::Scalar) => { + let lhs_columns = block.get_whole_table_arg_cols(&arguments[0])?; + let rhs_column = block.get_arg_column(&arguments[1])?; + + let rows: usize = match &arg_shapes[0] { + TableShape::Matrix(rows,_) => *rows, + _ => 1, + }; + + let (out_table_id, _, _) = out; + let out_table = block.get_table(out_table_id)?; + let mut out_brrw = out_table.borrow_mut(); + out_brrw.resize(rows,*cols); + + for (col_ix,(_,lhs_column,_)) in lhs_columns.iter().enumerate() { + match (lhs_column,&rhs_column) { + (Column::U8(lhs), (_,Column::U8(rhs),_)) => { + out_brrw.set_col_kind(col_ix, ValueKind::U8)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::U8(out) = out_col { + block.plan.push($op3::{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + (Column::U16(lhs), (_,Column::U16(rhs),_)) => { + out_brrw.set_col_kind(col_ix, ValueKind::U16)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::U16(out) = out_col { + block.plan.push($op3::{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + (Column::U32(lhs), (_,Column::U32(rhs),_)) => { + out_brrw.set_col_kind(col_ix, ValueKind::U32)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::U32(out) = out_col { + block.plan.push($op3::{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + (Column::U64(lhs), (_,Column::U64(rhs),_)) => { + out_brrw.set_col_kind(col_ix, ValueKind::U64)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::U64(out) = out_col { + block.plan.push($op3::{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + (Column::U128(lhs), (_,Column::U128(rhs),_)) => { + out_brrw.set_col_kind(col_ix, ValueKind::U128)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::U128(out) = out_col { + block.plan.push($op3::{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + (Column::I8(lhs), (_,Column::I8(rhs),_)) => { + out_brrw.set_col_kind(col_ix, ValueKind::I8)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::I8(out) = out_col { + block.plan.push($op3::{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + (Column::I16(lhs), (_,Column::I16(rhs),_)) => { + out_brrw.set_col_kind(col_ix, ValueKind::I16)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::I16(out) = out_col { + block.plan.push($op3::{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + (Column::I32(lhs), (_,Column::I32(rhs),_)) => { + out_brrw.set_col_kind(col_ix, ValueKind::I32)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::I32(out) = out_col { + block.plan.push($op3::{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + (Column::I64(lhs), (_,Column::I64(rhs),_)) => { + out_brrw.set_col_kind(col_ix, ValueKind::I64)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::I64(out) = out_col { + block.plan.push($op3::{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + (Column::I128(lhs), (_,Column::I128(rhs),_)) => { + out_brrw.set_col_kind(col_ix, ValueKind::I128)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::I128(out) = out_col { + block.plan.push($op3::{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + (Column::F32(lhs), (_,Column::F32(rhs),_)) => { + out_brrw.set_col_kind(col_ix, ValueKind::F32)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::F32(out) = out_col { + block.plan.push($op3::{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + (Column::F64(lhs), (_,Column::F64(rhs),_)) => { + out_brrw.set_col_kind(col_ix, ValueKind::F64)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::F64(out) = out_col { + block.plan.push($op3::{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + x => {return Err(MechError{msg: "".to_string(), id: 6009, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + (TableShape::Scalar, TableShape::Matrix(_, cols)) | + (TableShape::Scalar, TableShape::Row(cols)) => { + let rhs_columns = block.get_whole_table_arg_cols(&arguments[1])?; + let lhs_column = block.get_arg_column(&arguments[0])?; + + let rows: usize = match &arg_shapes[1] { + TableShape::Matrix(rows,_) => *rows, + _ => 1, + }; + + let (out_table_id, _, _) = out; + let out_table = block.get_table(out_table_id)?; + let mut out_brrw = out_table.borrow_mut(); + out_brrw.resize(rows,*cols); + + for (col_ix,(_,rhs_column,_)) in rhs_columns.iter().enumerate() { + match (rhs_column,&lhs_column) { + (Column::U8(rhs), (_,Column::U8(lhs),_)) => { + out_brrw.set_col_kind(col_ix, ValueKind::U8)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::U8(out) = out_col { + block.plan.push($op2{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + (Column::U16(rhs), (_,Column::U16(lhs),_)) => { + out_brrw.set_col_kind(col_ix, ValueKind::U16)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::U16(out) = out_col { + block.plan.push($op2{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + (Column::U32(rhs), (_,Column::U32(lhs),_)) => { + out_brrw.set_col_kind(col_ix, ValueKind::U32)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::U32(out) = out_col { + block.plan.push($op2{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + (Column::U64(rhs), (_,Column::U64(lhs),_)) => { + out_brrw.set_col_kind(col_ix, ValueKind::U64)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::U64(out) = out_col { + block.plan.push($op2{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + (Column::U128(rhs), (_,Column::U128(lhs),_)) => { + out_brrw.set_col_kind(col_ix, ValueKind::U128)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::U128(out) = out_col { + block.plan.push($op2{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + (Column::I8(rhs), (_,Column::I8(lhs),_)) => { + out_brrw.set_col_kind(col_ix, ValueKind::I8)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::I8(out) = out_col { + block.plan.push($op2{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + (Column::I16(rhs), (_,Column::I16(lhs),_)) => { + out_brrw.set_col_kind(col_ix, ValueKind::I16)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::I16(out) = out_col { + block.plan.push($op2{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + (Column::I32(rhs), (_,Column::I32(lhs),_)) => { + out_brrw.set_col_kind(col_ix, ValueKind::I32)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::I32(out) = out_col { + block.plan.push($op2{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + (Column::I64(rhs), (_,Column::I64(lhs),_)) => { + out_brrw.set_col_kind(col_ix, ValueKind::I64)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::I64(out) = out_col { + block.plan.push($op2{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + (Column::I128(rhs), (_,Column::I128(lhs),_)) => { + out_brrw.set_col_kind(col_ix, ValueKind::I128)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::I128(out) = out_col { + block.plan.push($op2{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + (Column::F32(rhs), (_,Column::F32(lhs),_)) => { + out_brrw.set_col_kind(col_ix, ValueKind::F32)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::F32(out) = out_col { + block.plan.push($op2{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + (Column::F64(rhs), (_,Column::F64(lhs),_)) => { + out_brrw.set_col_kind(col_ix, ValueKind::F64)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::F64(out) = out_col { + block.plan.push($op2{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + x => {return Err(MechError{msg: "".to_string(), id: 6010, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + (TableShape::Row(lhs_cols), TableShape::Row(rhs_cols)) => { + let lhs_rows = 1; + let rhs_rows = 1; + + if lhs_rows != rhs_rows || lhs_cols != rhs_cols { + return Err(MechError{msg: "".to_string(), id: 6011, kind: MechErrorKind::DimensionMismatch(vec![(lhs_rows,*lhs_cols),(rhs_rows,*rhs_cols)])}); + } + + let lhs_columns = block.get_whole_table_arg_cols(&arguments[0])?; + let rhs_columns = block.get_whole_table_arg_cols(&arguments[1])?; + + let (out_table_id, _, _) = out; + let out_table = block.get_table(out_table_id)?; + let mut out_brrw = out_table.borrow_mut(); + out_brrw.resize(lhs_rows,*lhs_cols); + + for (col_ix,lhs_rhs) in lhs_columns.iter().zip(rhs_columns).enumerate() { + match (lhs_rhs) { + (((_,Column::U8(lhs),_), (_,Column::U8(rhs),_))) => { + out_brrw.set_col_kind(col_ix, ValueKind::U8)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::U8(out) = out_col { + block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) + } + } + (((_,Column::U16(lhs),_), (_,Column::U16(rhs),_))) => { + out_brrw.set_col_kind(col_ix, ValueKind::U16)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::U16(out) = out_col { + block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) + } + } + (((_,Column::U32(lhs),_), (_,Column::U32(rhs),_))) => { + out_brrw.set_col_kind(col_ix, ValueKind::U32)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::U32(out) = out_col { + block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) + } + } + (((_,Column::U64(lhs),_), (_,Column::U64(rhs),_))) => { + out_brrw.set_col_kind(col_ix, ValueKind::U64)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::U64(out) = out_col { + block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) + } + } + (((_,Column::U128(lhs),_), (_,Column::U128(rhs),_))) => { + out_brrw.set_col_kind(col_ix, ValueKind::U128)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::U128(out) = out_col { + block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) + } + } + (((_,Column::I8(lhs),_), (_,Column::I8(rhs),_))) => { + out_brrw.set_col_kind(col_ix, ValueKind::I8)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::I8(out) = out_col { + block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) + } + } + (((_,Column::I16(lhs),_), (_,Column::I16(rhs),_))) => { + out_brrw.set_col_kind(col_ix, ValueKind::I16)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::I16(out) = out_col { + block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) + } + } + (((_,Column::I32(lhs),_), (_,Column::I32(rhs),_))) => { + out_brrw.set_col_kind(col_ix, ValueKind::I32)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::I32(out) = out_col { + block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) + } + } + (((_,Column::I64(lhs),_), (_,Column::I64(rhs),_))) => { + out_brrw.set_col_kind(col_ix, ValueKind::I64)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::I64(out) = out_col { + block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) + } + } + (((_,Column::I128(lhs),_), (_,Column::I128(rhs),_))) => { + out_brrw.set_col_kind(col_ix, ValueKind::I128)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::I128(out) = out_col { + block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) + } + } + (((_,Column::F32(lhs),_), (_,Column::F32(rhs),_))) => { + out_brrw.set_col_kind(col_ix, ValueKind::F32)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::F32(out) = out_col { + block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) + } + } + (((_,Column::F64(lhs),_), (_,Column::F64(rhs),_))) => { + out_brrw.set_col_kind(col_ix, ValueKind::F64)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::F64(out) = out_col { + block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) + } + } + x => {return Err(MechError{msg: "".to_string(), id: 6012, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + (TableShape::Matrix(lhs_rows,lhs_cols), TableShape::Matrix(rhs_rows,rhs_cols)) => { + + if lhs_rows != rhs_rows || lhs_cols != rhs_cols { + return Err(MechError{msg: "".to_string(), id: 6011, kind: MechErrorKind::DimensionMismatch(vec![(*lhs_rows,*lhs_cols),(*rhs_rows,*rhs_cols)])}); + } + + let lhs_columns = block.get_whole_table_arg_cols(&arguments[0])?; + let rhs_columns = block.get_whole_table_arg_cols(&arguments[1])?; + + let (out_table_id, _, _) = out; + let out_table = block.get_table(out_table_id)?; + let mut out_brrw = out_table.borrow_mut(); + out_brrw.resize(*lhs_rows,*lhs_cols); + + for (col_ix,lhs_rhs) in lhs_columns.iter().zip(rhs_columns).enumerate() { + match (lhs_rhs) { + (((_,Column::U8(lhs),_), (_,Column::U8(rhs),_))) => { + out_brrw.set_col_kind(col_ix, ValueKind::U8)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::U8(out) = out_col { + block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) + } + } + (((_,Column::U16(lhs),_), (_,Column::U16(rhs),_))) => { + out_brrw.set_col_kind(col_ix, ValueKind::U16)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::U16(out) = out_col { + block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) + } + } + (((_,Column::U32(lhs),_), (_,Column::U32(rhs),_))) => { + out_brrw.set_col_kind(col_ix, ValueKind::U32)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::U32(out) = out_col { + block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) + } + } + (((_,Column::U64(lhs),_), (_,Column::U64(rhs),_))) => { + out_brrw.set_col_kind(col_ix, ValueKind::U64)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::U64(out) = out_col { + block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) + } + } + (((_,Column::U128(lhs),_), (_,Column::U128(rhs),_))) => { + out_brrw.set_col_kind(col_ix, ValueKind::U128)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::U128(out) = out_col { + block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) + } + } + (((_,Column::I8(lhs),_), (_,Column::I8(rhs),_))) => { + out_brrw.set_col_kind(col_ix, ValueKind::I8)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::I8(out) = out_col { + block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) + } + } + (((_,Column::I16(lhs),_), (_,Column::I16(rhs),_))) => { + out_brrw.set_col_kind(col_ix, ValueKind::I16)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::I16(out) = out_col { + block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) + } + } + (((_,Column::I32(lhs),_), (_,Column::I32(rhs),_))) => { + out_brrw.set_col_kind(col_ix, ValueKind::I32)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::I32(out) = out_col { + block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) + } + } + (((_,Column::I64(lhs),_), (_,Column::I64(rhs),_))) => { + out_brrw.set_col_kind(col_ix, ValueKind::I64)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::I64(out) = out_col { + block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) + } + } + (((_,Column::I128(lhs),_), (_,Column::I128(rhs),_))) => { + out_brrw.set_col_kind(col_ix, ValueKind::I128)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::I128(out) = out_col { + block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) + } + } + (((_,Column::F32(lhs),_), (_,Column::F32(rhs),_))) => { + out_brrw.set_col_kind(col_ix, ValueKind::F32)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::F32(out) = out_col { + block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) + } + } + (((_,Column::F64(lhs),_), (_,Column::F64(rhs),_))) => { + out_brrw.set_col_kind(col_ix, ValueKind::F64)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::F64(out) = out_col { + block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) + } + } + x => {return Err(MechError{msg: "".to_string(), id: 6012, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + (TableShape::Dynamic(lhs_rows,1),TableShape::Dynamic(rhs_rows,1)) => { + if lhs_rows != rhs_rows { + return Err(MechError{msg: "".to_string(), id: 6013, kind: MechErrorKind::DimensionMismatch(vec![(*lhs_rows,0),(*rhs_rows,0)])}); + } + let mut argument_columns = block.get_arg_columns(arguments)?; + let (_,col,_) = &argument_columns[0]; + let (out_table_id,_,_) = out; + let out_table = block.get_table(out_table_id)?; + let out_column = block.get_out_column(out, *lhs_rows, col.kind())?; + match (&argument_columns[0], &argument_columns[1],out_column) { + ((_,Column::U8(lhs),_), (_,Column::U8(rhs),_),Column::U8(out)) => {block.plan.push($op5{lhs: lhs.clone(), rhs: rhs.clone(), out_col: out, out: out_table.clone()})} + ((_,Column::U16(lhs),_), (_,Column::U16(rhs),_),Column::U16(out)) => {block.plan.push($op5{lhs: lhs.clone(), rhs: rhs.clone(), out_col: out, out: out_table.clone()})} + ((_,Column::U32(lhs),_), (_,Column::U32(rhs),_),Column::U32(out)) => {block.plan.push($op5{lhs: lhs.clone(), rhs: rhs.clone(), out_col: out, out: out_table.clone()})} + ((_,Column::U64(lhs),_), (_,Column::U64(rhs),_),Column::U64(out)) => {block.plan.push($op5{lhs: lhs.clone(), rhs: rhs.clone(), out_col: out, out: out_table.clone()})} + ((_,Column::U128(lhs),_), (_,Column::U128(rhs),_),Column::U128(out)) => {block.plan.push($op5{lhs: lhs.clone(), rhs: rhs.clone(), out_col: out, out: out_table.clone()})} + ((_,Column::I8(lhs),_), (_,Column::I8(rhs),_),Column::I8(out)) => {block.plan.push($op5{lhs: lhs.clone(), rhs: rhs.clone(), out_col: out, out: out_table.clone()})} + ((_,Column::I16(lhs),_), (_,Column::I16(rhs),_),Column::I16(out)) => {block.plan.push($op5{lhs: lhs.clone(), rhs: rhs.clone(), out_col: out, out: out_table.clone()})} + ((_,Column::I32(lhs),_), (_,Column::I32(rhs),_),Column::I32(out)) => {block.plan.push($op5{lhs: lhs.clone(), rhs: rhs.clone(), out_col: out, out: out_table.clone()})} + ((_,Column::I64(lhs),_), (_,Column::I64(rhs),_),Column::I64(out)) => {block.plan.push($op5{lhs: lhs.clone(), rhs: rhs.clone(), out_col: out, out: out_table.clone()})} + ((_,Column::I128(lhs),_), (_,Column::I128(rhs),_),Column::I128(out)) => {block.plan.push($op5{lhs: lhs.clone(), rhs: rhs.clone(), out_col: out, out: out_table.clone()})} + ((_,Column::F32(lhs),_), (_,Column::F32(rhs),_),Column::F32(out)) => {block.plan.push($op5{lhs: lhs.clone(), rhs: rhs.clone(), out_col: out, out: out_table.clone()})} + ((_,Column::F64(lhs),_), (_,Column::F64(rhs),_),Column::F64(out)) => {block.plan.push($op5{lhs: lhs.clone(), rhs: rhs.clone(), out_col: out, out: out_table.clone()})} + ((_,Column::U8(lhs),_), (_,Column::F32(rhs),_),Column::U8(out)) => {block.plan.push($op5{lhs: lhs.clone(), rhs: rhs.clone(), out_col: out, out: out_table.clone()})} + x => {return Err(MechError{msg: "".to_string(), id: 6014, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + (TableShape::Pending(table_id),_) => { return Err(MechError{msg: "".to_string(), id: 6015, kind: MechErrorKind::PendingTable(*table_id)}); } + (_,TableShape::Pending(table_id)) => {return Err(MechError{msg: "".to_string(), id: 6016, kind: MechErrorKind::PendingTable(*table_id)}); }, + x => {return Err(MechError{msg: "".to_string(), id: 6017, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + Ok(()) + } + } + ) +} diff --git a/src/core/src/function/math_update.rs b/src/core/src/function/math_update.rs new file mode 100644 index 0000000..4613dcb --- /dev/null +++ b/src/core/src/function/math_update.rs @@ -0,0 +1,328 @@ +use crate::*; +use std::cell::RefCell; +use std::rc::Rc; +use std::fmt::*; +use num_traits::*; +use std::ops::*; +#[cfg(feature = "parallel")] +use rayon::prelude::*; +use std::thread; + +lazy_static! { + pub static ref MATH_ADD__UPDATE: u64 = hash_str("math/add-update"); + pub static ref MATH_SUBTRACT__UPDATE: u64 = hash_str("math/subtract-update"); + pub static ref MATH_MULTIPLY__UPDATE: u64 = hash_str("math/multiply-update"); + pub static ref MATH_DIVIDE__UPDATE: u64 = hash_str("math/divide-update"); + pub static ref MATH_EXPONENT__UPDATE: u64 = hash_str("math/exponent-update"); +} + +math_update_SIxSIx!(MathAddSIxSIx,+=); +math_update_SIxSIx!(MathSubtractSIxSIx,-=); +math_update_SIxSIx!(MathMultiplySIxSIx,*=); +math_update_SIxSIx!(MathDivideSIxSIx,/=); + +math_update_compiler!(MathAddUpdate,MathAddSIxSIx); +math_update_compiler!(MathSubtractUpdate,MathSubtractSIxSIx); +math_update_compiler!(MathMultiplyUpdate,MathMultiplySIxSIx); +math_update_compiler!(MathDivideUpdate,MathDivideSIxSIx); + +// Update Scalar{ix} : Scalar{ix} +#[macro_export] +macro_rules! math_update_SIxSIx { + ($func_name:ident, $op1:tt) => ( + #[derive(Debug)] + pub struct $func_name { + pub arg: ColumnV, pub ix: usize, pub out: ColumnV, pub oix: usize + } + impl MechFunction for $func_name + where T: Clone + Debug + Into + MechNumArithmetic, + U: Clone + Debug + Into + MechNumArithmetic + { + fn solve(&self) { + (self.out.borrow_mut())[self.oix] $op1 T::into((self.arg.borrow())[self.ix].clone()); + } + fn to_string(&self) -> String { format!("{:#?}", self)} + } + ) +} + +#[macro_export] +macro_rules! math_update_compiler { + ($func_name:ident, $op1:tt) => ( //,$op2:tt,$op3:tt,$op4:tt) => ( + + pub struct $func_name {} + + impl MechFunctionCompiler for $func_name { + fn compile(&self, block: &mut Block, arguments: &Vec, out: &(TableId, TableIndex, TableIndex)) -> std::result::Result<(),MechError> { + let (_,src_id,src_indices) = &arguments[0]; + let (dest_id,dest_row,dest_col) = out; + let arg_shapes = block.get_arg_dims(&arguments)?; + let out_arg = (0,*dest_id,vec![(dest_row.clone(),dest_col.clone())]); + let dest_shape = block.get_arg_dim(&out_arg)?; + let src_table = block.get_table(src_id)?; + let dest_table = block.get_table(dest_id)?; + let mut arguments = arguments.clone(); + // The destination is pushed into the arguments here in order to use the + // get_argument_column() machinery later. + arguments.push(out_arg); + // Now decide on the correct tfm based on the shape + match (&arg_shapes[0],&dest_shape) { + (TableShape::Scalar,TableShape::Scalar) => { + let arg_cols = block.get_arg_columns(&arguments)?; + match (&arg_cols[0],&arg_cols[1]) { + ((_,Column::U8(src),ColumnIndex::Index(in_ix)),(_,Column::U8(out),ColumnIndex::Index(out_ix))) => {block.plan.push($op1{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::U16(src),ColumnIndex::Index(in_ix)),(_,Column::U16(out),ColumnIndex::Index(out_ix))) => {block.plan.push($op1{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::U32(src),ColumnIndex::Index(in_ix)),(_,Column::U32(out),ColumnIndex::Index(out_ix))) => {block.plan.push($op1{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::U64(src),ColumnIndex::Index(in_ix)),(_,Column::U64(out),ColumnIndex::Index(out_ix))) => {block.plan.push($op1{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::U128(src),ColumnIndex::Index(in_ix)),(_,Column::U128(out),ColumnIndex::Index(out_ix))) => {block.plan.push($op1{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::I8(src),ColumnIndex::Index(in_ix)),(_,Column::I8(out),ColumnIndex::Index(out_ix))) => {block.plan.push($op1{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::I16(src),ColumnIndex::Index(in_ix)),(_,Column::I16(out),ColumnIndex::Index(out_ix))) => {block.plan.push($op1{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::I32(src),ColumnIndex::Index(in_ix)),(_,Column::I32(out),ColumnIndex::Index(out_ix))) => {block.plan.push($op1{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::I64(src),ColumnIndex::Index(in_ix)),(_,Column::I64(out),ColumnIndex::Index(out_ix))) => {block.plan.push($op1{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::I128(src),ColumnIndex::Index(in_ix)),(_,Column::I128(out),ColumnIndex::Index(out_ix))) => {block.plan.push($op1{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::F32(src),ColumnIndex::Index(in_ix)),(_,Column::F32(out),ColumnIndex::Index(out_ix))) => {block.plan.push($op1{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::F64(src),ColumnIndex::Index(in_ix)),(_,Column::F64(out),ColumnIndex::Index(out_ix))) => {block.plan.push($op1{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + /*((_,Column::F32(arg),ColumnIndex::Index(ix)),(_,Column::F32(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::F32(src),ColumnIndex::Index(in_ix)),(_,Column::U8(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::F32(src),ColumnIndex::Index(in_ix)),(_,Column::F32(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::U64(arg),ColumnIndex::Index(ix)),(_,Column::U64(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::U64(src),ColumnIndex::Index(in_ix)),(_,Column::U64(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::U128(arg),ColumnIndex::Index(ix)),(_,Column::U128(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::U128(src),ColumnIndex::Index(in_ix)),(_,Column::U128(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::Bool(src),ColumnIndex::Index(in_ix)),(_,Column::Bool(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::Bool(arg),ColumnIndex::Index(ix)),(_,Column::Bool(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::Ref(src),ColumnIndex::Index(in_ix)),(_,Column::Ref(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::String(src),ColumnIndex::Index(in_ix)),(_,Column::String(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});}*/ + x => {return Err(MechError{msg: "".to_string(), id: 6115, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + /* + (TableShape::Scalar, TableShape::Column(rows)) => { + let mut argument_columns = block.get_arg_columns(arguments)?; + let (_,col,_) = &argument_columns[0]; + let mut out_column = block.get_out_column(out, *rows, col.kind())?; + match (&argument_columns[0], &argument_columns[1], &out_column) { + ((_,Column::F32(lhs),_), (_,Column::F32(rhs),_), Column::F32(out)) => { block.plan.push($op2{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) } + ((_,Column::U8(lhs),_), (_,Column::U8(rhs),_), Column::U8(out)) => { block.plan.push($op2{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) } + ((_,Column::U16(lhs),_), (_,Column::U16(rhs),_), Column::U16(out)) => { block.plan.push($op2{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) } + ((_,Column::U32(lhs),_), (_,Column::U32(rhs),_), Column::U32(out)) => { block.plan.push($op2{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) } + ((_,Column::U64(lhs),_), (_,Column::U64(rhs),_), Column::U64(out)) => { block.plan.push($op2{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) } + ((_,Column::U128(lhs),_), (_,Column::U128(rhs),_), Column::U128(out)) => { block.plan.push($op2{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) } + /*((_,Column::I8(lhs),_), (_,Column::I8(rhs),_), Column::I8(out)) => { block.plan.push($op2{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) } + ((_,Column::I16(lhs),_), (_,Column::I16(rhs),_), Column::I16(out)) => { block.plan.push($op2{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) } + ((_,Column::I32(lhs),_), (_,Column::I32(rhs),_), Column::I32(out)) => { block.plan.push($op2{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) } + ((_,Column::I64(lhs),_), (_,Column::I64(rhs),_), Column::I64(out)) => { block.plan.push($op2{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) } + ((_,Column::I128(lhs),_), (_,Column::I128(rhs),_), Column::I128(out)) => { block.plan.push($op2{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) } + */ + x => {return Err(MechError{msg: "".to_string(), id: 6005, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + (TableShape::Column(rows), TableShape::Scalar) => { + let mut argument_columns = block.get_arg_columns(arguments)?; + let (_,col,_) = &argument_columns[0]; + match (&argument_columns[0], &argument_columns[1]) { + ((_,Column::U8(lhs),_), (_,Column::U8(rhs),_)) => { + let mut out_column = block.get_out_column(out, *rows, ValueKind::U8)?; + if let Column::U8(out) = out_column { + block.plan.push($op3{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + ((_,Column::F32(lhs),_), (_,Column::F32(rhs),_)) => { + let mut out_column = block.get_out_column(out, *rows, ValueKind::F32)?; + if let Column::F32(out) = out_column { + block.plan.push($op3{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + ((_,Column::Length(lhs),_), (_,Column::Length(rhs),_)) => { + let mut out_column = block.get_out_column(out, *rows, ValueKind::Length)?; + if let Column::Length(out) = out_column { + block.plan.push($op3{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + ((_,Column::Speed(lhs),_), (_,Column::Speed(rhs),_)) => { + let mut out_column = block.get_out_column(out, *rows, ValueKind::Speed)?; + if let Column::Speed(out) = out_column { + block.plan.push($op3{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + ((_,Column::Time(lhs),_), (_,Column::Time(rhs),_)) => { + let mut out_column = block.get_out_column(out, *rows, ValueKind::Time)?; + if let Column::Time(out) = out_column { + block.plan.push($op3{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + ((_,Column::Speed(lhs),_), (_,Column::Time(rhs),_)) => { + let mut out_column = block.get_out_column(out, *rows, ValueKind::Length)?; + if let Column::Length(out) = out_column { + block.plan.push($op3{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + x => {return Err(MechError{msg: "".to_string(), id: 6006, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + (TableShape::Column(lhs_rows), TableShape::Column(rhs_rows)) => { + if lhs_rows != rhs_rows { + return Err(MechError{msg: "".to_string(), id: 6007, kind: MechErrorKind::DimensionMismatch(((*lhs_rows,0),(*rhs_rows,0)))}); + } + let mut argument_columns = block.get_arg_columns(arguments)?; + let (_,col,_) = &argument_columns[0]; + let out_column = block.get_out_column(out, *lhs_rows, col.kind())?; + match (&argument_columns[0], &argument_columns[1], &out_column) { + ((_,Column::U8(lhs),_),(_,Column::U8(rhs),_),Column::U8(out)) => { block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) }, + ((_,Column::U16(lhs),_),(_,Column::U16(rhs),_),Column::U16(out)) => { block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) }, + ((_,Column::U32(lhs),_),(_,Column::U32(rhs),_),Column::U32(out)) => { block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) }, + ((_,Column::U64(lhs),_),(_,Column::U64(rhs),_),Column::U64(out)) => { block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) }, + ((_,Column::U128(lhs),_),(_,Column::U128(rhs),_),Column::U128(out)) => { block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) }, + ((_,Column::F32(lhs),_),(_,Column::F32(rhs),_),Column::F32(out)) => { block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) }, + ((_,Column::F64(lhs),_),(_,Column::F64(rhs),_),Column::F64(out)) => { block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) }, + ((_,Column::Length(lhs),_),(_,Column::Length(rhs),_),Column::Length(out)) => { block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) }, + ((_,Column::Speed(lhs),_),(_,Column::Speed(rhs),_),Column::Speed(out)) => { block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) }, + ((_,Column::Time(lhs),_),(_,Column::Time(rhs),_),Column::Time(out)) => { block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) }, + x => {return Err(MechError{msg: "".to_string(), id: 6008, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + (TableShape::Row(cols), TableShape::Scalar) => { + let lhs_columns = block.get_whole_table_arg_cols(&arguments[0])?; + let rhs_column = block.get_arg_column(&arguments[1])?; + + let (out_table_id, _, _) = out; + let out_table = block.get_table(out_table_id)?; + let mut out_brrw = out_table.borrow_mut(); + out_brrw.resize(1,*cols); + + for (col_ix,(_,lhs_column,_)) in lhs_columns.iter().enumerate() { + match (lhs_column,&rhs_column) { + (Column::U8(lhs), (_,Column::U8(rhs),_)) => { + out_brrw.set_col_kind(col_ix, ValueKind::U8)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::U8(out) = out_col { + block.plan.push($op3::{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + (Column::F32(lhs), (_,Column::F32(rhs),_)) => { + out_brrw.set_col_kind(col_ix, ValueKind::F32)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::F32(out) = out_col { + block.plan.push($op3::{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + x => {return Err(MechError{msg: "".to_string(), id: 6009, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + (TableShape::Scalar, TableShape::Row(cols)) => { + let rhs_columns = block.get_whole_table_arg_cols(&arguments[1])?; + let lhs_column = block.get_arg_column(&arguments[0])?; + + let (out_table_id, _, _) = out; + let out_table = block.get_table(out_table_id)?; + let mut out_brrw = out_table.borrow_mut(); + out_brrw.resize(1,*cols); + + for (col_ix,(_,rhs_column,_)) in rhs_columns.iter().enumerate() { + match (rhs_column,&lhs_column) { + (Column::U8(rhs), (_,Column::U8(lhs),_)) => { + out_brrw.set_col_kind(col_ix, ValueKind::U8)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::U8(out) = out_col { + block.plan.push($op2{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + (Column::F32(rhs), (_,Column::F32(lhs),_)) => { + out_brrw.set_col_kind(col_ix, ValueKind::F32)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::F32(out) = out_col { + block.plan.push($op2{lhs: lhs.clone(), rhs: rhs.clone(), out: out.clone() }) + } + } + x => {return Err(MechError{msg: "".to_string(), id: 6010, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + (TableShape::Row(lhs_cols), TableShape::Row(rhs_cols)) => { + let lhs_rows = 1; + let rhs_rows = 1; + + if lhs_rows != rhs_rows || lhs_cols != rhs_cols { + return Err(MechError{msg: "".to_string(), id: 6011, kind: MechErrorKind::DimensionMismatch(((lhs_rows,*lhs_cols),(rhs_rows,*rhs_cols)))}); + } + + let lhs_columns = block.get_whole_table_arg_cols(&arguments[0])?; + let rhs_columns = block.get_whole_table_arg_cols(&arguments[1])?; + + let (out_table_id, _, _) = out; + let out_table = block.get_table(out_table_id)?; + let mut out_brrw = out_table.borrow_mut(); + out_brrw.resize(lhs_rows,*lhs_cols); + + for (col_ix,lhs_rhs) in lhs_columns.iter().zip(rhs_columns).enumerate() { + match (lhs_rhs) { + (((_,Column::U8(lhs),_), (_,Column::U8(rhs),_))) => { + out_brrw.set_col_kind(col_ix, ValueKind::U8)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::U8(out) = out_col { + block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) + } + } + (((_,Column::U64(lhs),_), (_,Column::U64(rhs),_))) => { + out_brrw.set_col_kind(col_ix, ValueKind::U64)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::U64(out) = out_col { + block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) + } + } + (((_,Column::F32(lhs),_), (_,Column::F32(rhs),_))) => { + out_brrw.set_col_kind(col_ix, ValueKind::F32)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::F32(out) = out_col { + block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) + } + } + x => {return Err(MechError{msg: "".to_string(), id: 6012, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + (TableShape::Matrix(lhs_rows,lhs_cols), TableShape::Matrix(rhs_rows,rhs_cols)) => { + + if lhs_rows != rhs_rows || lhs_cols != rhs_cols { + return Err(MechError{msg: "".to_string(), id: 6011, kind: MechErrorKind::DimensionMismatch(((*lhs_rows,*lhs_cols),(*rhs_rows,*rhs_cols)))}); + } + + let lhs_columns = block.get_whole_table_arg_cols(&arguments[0])?; + let rhs_columns = block.get_whole_table_arg_cols(&arguments[1])?; + + let (out_table_id, _, _) = out; + let out_table = block.get_table(out_table_id)?; + let mut out_brrw = out_table.borrow_mut(); + out_brrw.resize(*lhs_rows,*lhs_cols); + + for (col_ix,lhs_rhs) in lhs_columns.iter().zip(rhs_columns).enumerate() { + match (lhs_rhs) { + (((_,Column::U8(lhs),_), (_,Column::U8(rhs),_))) => { + out_brrw.set_col_kind(col_ix, ValueKind::U8)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::U8(out) = out_col { + block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) + } + } + (((_,Column::F32(lhs),_), (_,Column::F32(rhs),_))) => { + out_brrw.set_col_kind(col_ix, ValueKind::F32)?; + let out_col = out_brrw.get_column(&TableIndex::Index(col_ix+1))?; + if let Column::F32(out) = out_col { + block.plan.push($op4{lhs: (lhs.clone(),0,lhs.len()-1), rhs: (rhs.clone(),0,rhs.len()-1), out: out.clone() }) + } + } + x => {return Err(MechError{msg: "".to_string(), id: 6012, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + (TableShape::Pending(table_id),_) => { return Err(MechError{msg: "".to_string(), id: 6013, kind: MechErrorKind::PendingTable(*table_id)}); } + (_,TableShape::Pending(table_id)) => {return Err(MechError{msg: "".to_string(), id: 6014, kind: MechErrorKind::PendingTable(*table_id)}); }, + */ + x => {return Err(MechError{msg: "".to_string(), id: 6115, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + Ok(()) + } + } + ) +} \ No newline at end of file diff --git a/src/core/src/function/matrix.rs b/src/core/src/function/matrix.rs new file mode 100644 index 0000000..68a58ea --- /dev/null +++ b/src/core/src/function/matrix.rs @@ -0,0 +1,335 @@ +use crate::*; +use std::cell::RefCell; +use std::rc::Rc; +use std::fmt::*; +use num_traits::*; +use std::ops::*; + +#[cfg(feature = "parallel")] +use rayon::prelude::*; +use std::thread; + +lazy_static! { + pub static ref MATRIX_MULTIPLY: u64 = hash_str("matrix/multiply"); + pub static ref MATRIX_TRANSPOSE: u64 = hash_str("matrix/transpose"); +} + +#[derive(Debug)] +pub struct MatrixMulRV { + pub lhs: Vec>, + pub rhs: ColumnV, + pub out: ColumnV +} + +impl MechFunction for MatrixMulRV +where T: Copy + Debug + Clone + MechNumArithmetic + Into + Sync + Send + Zero, + U: Copy + Debug + Clone + MechNumArithmetic + Into + Sync + Send + Zero, + V: Copy + Debug + Clone + MechNumArithmetic + Sync + Send + Zero, +{ + fn solve(&self) { + let result = self.lhs.iter() + .zip(self.rhs.borrow().iter()) + .fold(zero(),|sum: V, (lhs,rhs)| sum + T::into(lhs.borrow()[0]) * U::into(*rhs)); + self.out.borrow_mut()[0] = result + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + +#[derive(Debug)] +pub struct MatrixMulVR { + pub lhs: ColumnV, + pub rhs: Vec>, + pub out: Vec> +} + +impl MechFunction for MatrixMulVR +where T: Copy + Debug + Clone + MechNumArithmetic + Into + Sync + Send + Zero, + U: Copy + Debug + Clone + MechNumArithmetic + Into + Sync + Send + Zero, + V: Copy + Debug + Clone + MechNumArithmetic + Sync + Send + Zero, +{ + fn solve(&self) { + let lhs = self.lhs.borrow(); + for j in 0..self.rhs.len() { + let rhs = self.rhs[j].borrow(); + let mut out_brrw = self.out[j].borrow_mut(); + for i in 0..lhs.len() { + let result: V = U::into(lhs[i]) * T::into(rhs[0]); + out_brrw[i] = result; + } + } + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + +#[derive(Debug)] +pub struct MatrixMulMM { + pub lhs: Vec>, + pub rhs: Vec>, + pub out: Vec> +} + +impl MechFunction for MatrixMulMM +where T: Copy + Debug + Clone + MechNumArithmetic + Into + Sync + Send + Zero, + U: Copy + Debug + Clone + MechNumArithmetic + Into + Sync + Send + Zero, + V: Copy + Debug + Clone + MechNumArithmetic + Sync + Send + Zero, +{ + fn solve(&self) { + + for i in 0..self.out.len() { + let mut out_col = self.out[i].borrow_mut(); + for j in 0..out_col.len() { + let mut result: V = zero(); + for k in 0..self.lhs.len() { + let lhs = self.lhs[k].borrow()[j]; + let rhs = &self.rhs[i].borrow()[k]; + result += U::into(lhs) * T::into(*rhs); + } + out_col[j] = result; + } + } + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + +pub struct MatrixMul{} +impl MechFunctionCompiler for MatrixMul { + + fn compile(&self, block: &mut Block, arguments: &Vec, out: &(TableId, TableIndex, TableIndex)) -> std::result::Result<(),MechError> { + let arg_shapes = block.get_arg_dims(&arguments)?; + let (lhs_arg_name,lhs_arg_table_id,_) = arguments[0]; + let (rhs_arg_name,rhs_arg_table_id,_) = arguments[1]; + let (out_table_id, _, _) = out; + let out_table = block.get_table(out_table_id)?; + let mut out_brrw = out_table.borrow_mut(); + let lhs_kind = { block.get_table(&lhs_arg_table_id)?.borrow().kind() }; + let rhs_kind = { block.get_table(&rhs_arg_table_id)?.borrow().kind() }; + match (&lhs_kind, &rhs_kind) { + (_,ValueKind::Compound(_)) | + (ValueKind::Compound(_),_) => { + return Err(MechError{msg: "".to_string(), id: 9049, kind: MechErrorKind::GenericError("matrix/multiply doesn't support compound table kinds.".to_string())}); + } + (k,j) => { + if (*k != *j) { + return Err(MechError{msg: "".to_string(), id: 9050, kind: MechErrorKind::GenericError("matrix/multiply doesn't support disparate table kinds.".to_string())}); + } + } + } + match (&arg_shapes[0],&arg_shapes[1]) { + (TableShape::Row(columns), TableShape::Column(rows)) => { + if columns != rows { + return Err(MechError{msg: "".to_string(), id: 9403, kind: MechErrorKind::GenericError("Dimension mismatch".to_string())}); + } + out_brrw.resize(1,1); + out_brrw.set_kind(rhs_kind); + let arg_col = block.get_arg_column(&arguments[1])?; + match (arg_col,out_brrw.get_column_unchecked(0)) { + ((_,Column::F32(rhs),_),Column::F32(out_col)) => { + let (arg_name,arg_table_id,_) = arguments[0]; + let lhs = { block.get_table(&arg_table_id)?.borrow().collect_columns_f32() }; + block.plan.push(MatrixMulRV{lhs: lhs.clone(), rhs: rhs.clone(), out: out_col.clone()}); + } + ((_,Column::F64(rhs),_),Column::F64(out_col)) => { + let (arg_name,arg_table_id,_) = arguments[0]; + let lhs = { block.get_table(&arg_table_id)?.borrow().collect_columns_f64() }; + block.plan.push(MatrixMulRV{lhs: lhs.clone(), rhs: rhs.clone(), out: out_col.clone()}); + } + x => {return Err(MechError{msg: "".to_string(), id: 9044, kind: MechErrorKind::GenericError(format!("{:?}",x))})}, + } + } + (TableShape::Matrix(lhs_rows,lhs_columns), TableShape::Column(rows)) => { + if lhs_columns != rows { + return Err(MechError{msg: "".to_string(), id: 9403, kind: MechErrorKind::GenericError("Dimension mismatch".to_string())}); + } + out_brrw.resize(*rows,1); + out_brrw.set_kind(rhs_kind); + match lhs_kind { + ValueKind::F32 => { + let lhs = { block.get_table(&lhs_arg_table_id)?.borrow().collect_columns_f32() }; + let rhs = { block.get_table(&rhs_arg_table_id)?.borrow().collect_columns_f32() }; + let out_cols = out_brrw.collect_columns_f32(); + block.plan.push(MatrixMulMM{lhs: lhs.clone(), rhs: rhs.clone(), out: out_cols.clone()}); + } + ValueKind::F64 => { + let lhs = { block.get_table(&lhs_arg_table_id)?.borrow().collect_columns_f64() }; + let rhs = { block.get_table(&rhs_arg_table_id)?.borrow().collect_columns_f64() }; + let out_cols = out_brrw.collect_columns_f64(); + block.plan.push(MatrixMulMM{lhs: lhs.clone(), rhs: rhs.clone(), out: out_cols.clone()}); + } + x => {return Err(MechError{msg: "".to_string(), id: 9044, kind: MechErrorKind::GenericError(format!("{:?}",x))})}, + } + } + (TableShape::Column(rows),TableShape::Row(columns)) => { + out_brrw.resize(*rows,*columns); + out_brrw.set_kind(rhs_kind); + let arg_col = block.get_arg_column(&arguments[0])?; + match (arg_col,out_brrw.get_column_unchecked(0)) { + ((_,Column::F32(lhs),_),Column::F32(out_col)) => { + let (arg_name,arg_table_id,_) = arguments[1]; + let rhs = { block.get_table(&arg_table_id)?.borrow().collect_columns_f32() }; + let out_cols = out_brrw.collect_columns_f32(); + block.plan.push(MatrixMulVR{lhs: lhs.clone(), rhs: rhs.clone(), out: out_cols.clone()}); + } + ((_,Column::F64(lhs),_),Column::F64(out_col)) => { + let (arg_name,arg_table_id,_) = arguments[1]; + let rhs = { block.get_table(&arg_table_id)?.borrow().collect_columns_f64() }; + let out_cols = out_brrw.collect_columns_f64(); + block.plan.push(MatrixMulVR{lhs: lhs.clone(), rhs: rhs.clone(), out: out_cols.clone()}); + } + x => {return Err(MechError{msg: "".to_string(), id: 9047, kind: MechErrorKind::GenericError(format!("{:?}",x))})}, + } + } + (TableShape::Row(lhs_columns),TableShape::Matrix(rhs_rows,rhs_columns)) => { + if lhs_columns != rhs_rows { + return Err(MechError{msg: "".to_string(), id: 9048, kind: MechErrorKind::GenericError("Dimension mismatch".to_string())}); + } + out_brrw.resize(1,*rhs_columns); + out_brrw.set_kind(rhs_kind); + match lhs_kind { + ValueKind::F32 => { + let lhs = { block.get_table(&lhs_arg_table_id)?.borrow().collect_columns_f32() }; + let rhs = { block.get_table(&rhs_arg_table_id)?.borrow().collect_columns_f32() }; + let out_cols = out_brrw.collect_columns_f32(); + block.plan.push(MatrixMulMM{lhs: lhs.clone(), rhs: rhs.clone(), out: out_cols.clone()}); + } + ValueKind::F64 => { + let lhs = { block.get_table(&lhs_arg_table_id)?.borrow().collect_columns_f64() }; + let rhs = { block.get_table(&rhs_arg_table_id)?.borrow().collect_columns_f64() }; + let out_cols = out_brrw.collect_columns_f64(); + block.plan.push(MatrixMulMM{lhs: lhs.clone(), rhs: rhs.clone(), out: out_cols.clone()}); + } + x => {return Err(MechError{msg: "".to_string(), id: 9048, kind: MechErrorKind::GenericError(format!("{:?}",x))})}, + } + } + (TableShape::Matrix(lhs_rows,lhs_columns),TableShape::Matrix(rhs_rows,rhs_columns)) => { + if lhs_columns != rhs_rows { + return Err(MechError{msg: "".to_string(), id: 9048, kind: MechErrorKind::GenericError("Dimension mismatch".to_string())}); + } + out_brrw.resize(*lhs_rows,*rhs_columns); + out_brrw.set_kind(rhs_kind); + match lhs_kind { + ValueKind::F32 => { + let lhs = { block.get_table(&lhs_arg_table_id)?.borrow().collect_columns_f32() }; + let rhs = { block.get_table(&rhs_arg_table_id)?.borrow().collect_columns_f32() }; + let out_cols = out_brrw.collect_columns_f32(); + block.plan.push(MatrixMulMM{lhs: lhs.clone(), rhs: rhs.clone(), out: out_cols.clone()}); + } + ValueKind::F64 => { + let lhs = { block.get_table(&lhs_arg_table_id)?.borrow().collect_columns_f64() }; + let rhs = { block.get_table(&rhs_arg_table_id)?.borrow().collect_columns_f64() }; + let out_cols = out_brrw.collect_columns_f64(); + block.plan.push(MatrixMulMM{lhs: lhs.clone(), rhs: rhs.clone(), out: out_cols.clone()}); + } + x => {return Err(MechError{msg: "".to_string(), id: 9049, kind: MechErrorKind::GenericError(format!("{:?}",x))})}, + } + } + x => {return Err(MechError{msg: "".to_string(), id: 9051, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + Ok(()) + } +} + +#[derive(Debug)] +pub struct MatrixTransposeR { + pub arg: Vec>, + pub out: ColumnV +} + +impl MechFunction for MatrixTransposeR +where T: Copy + Debug + Clone + MechNumArithmetic + Into + Sync + Send + Zero, + V: Copy + Debug + Clone + MechNumArithmetic + Sync + Send + Zero, +{ + fn solve(&self) { + let mut out = self.out.borrow_mut(); + for i in 0..self.arg.len() { + out[i] = T::into(self.arg[i].borrow()[0]); + } + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + +#[derive(Debug)] +pub struct MatrixTransposeM { + pub arg: Vec>, + pub out: Vec>, +} + +impl MechFunction for MatrixTransposeM +where T: Copy + Debug + Clone + MechNumArithmetic + Into + Sync + Send + Zero, + V: Copy + Debug + Clone + MechNumArithmetic + Sync + Send + Zero, +{ + fn solve(&self) { + for i in 0..self.arg.len() { + let arg_brrw = self.arg[i].borrow(); + for j in 0..arg_brrw.len() { + let mut out_brrw = self.out[j].borrow_mut(); + out_brrw[i] = T::into(arg_brrw[j]); + } + } + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + +pub struct MatrixTranspose{} +impl MechFunctionCompiler for MatrixTranspose { + + fn compile(&self, block: &mut Block, arguments: &Vec, out: &(TableId, TableIndex, TableIndex)) -> std::result::Result<(),MechError> { + let arg_shape = block.get_arg_dim(&arguments[0])?; + let (arg_name,arg_table_id,_) = arguments[0]; + let (out_table_id,_,_) = out; + let (out_table_id, _, _) = out; + let out_table = block.get_table(out_table_id)?; + let mut out_brrw = out_table.borrow_mut(); + match arg_shape { + TableShape::Row(columns) => { + let (arg_name,arg_table_id,arg_indices) = &arguments[0]; + let arg_table = block.get_table(&arg_table_id)?; + let arg_kind = { arg_table.borrow().kind() }; + match arg_kind { + ValueKind::Compound(_) => { + return Err(MechError{msg: "".to_string(), id: 9152, kind: MechErrorKind::GenericError("matrix/transpose doesn't support compound table kinds.".to_string())}); + } + _ => (), + } + out_brrw.resize(columns,1); + out_brrw.set_kind(arg_kind); + match out_brrw.get_column_unchecked(0) { + Column::F32(out_col) => { + let arg = { block.get_table(&arg_table_id)?.borrow().collect_columns_f32() }; + block.plan.push(MatrixTransposeR{arg: arg.clone(), out: out_col.clone()}); + } + Column::F64(out_col) => { + let arg = { block.get_table(&arg_table_id)?.borrow().collect_columns_f64() }; + block.plan.push(MatrixTransposeR{arg: arg.clone(), out: out_col.clone()}); + } + x => {return Err(MechError{msg: "".to_string(), id: 9153, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + TableShape::Matrix(rows,columns) => { + let arg_kind = { block.get_table(&arg_table_id)?.borrow().kind() }; + match arg_kind { + ValueKind::Compound(_) => { + return Err(MechError{msg: "".to_string(), id: 9154, kind: MechErrorKind::GenericError("matrix/transpose doesn't support compound table kinds.".to_string())}); + } + _ => (), + } + out_brrw.resize(columns,rows); + out_brrw.set_kind(arg_kind.clone()); + match arg_kind { + ValueKind::F32 => { + let arg = { block.get_table(&arg_table_id)?.borrow().collect_columns_f32() }; + let out_cols = { out_brrw.collect_columns_f32() }; + block.plan.push(MatrixTransposeM{arg: arg.clone(), out: out_cols.clone()}); + } + ValueKind::F64 => { + let arg = { block.get_table(&arg_table_id)?.borrow().collect_columns_f64() }; + let out_cols = { out_brrw.collect_columns_f64() }; + block.plan.push(MatrixTransposeM{arg: arg.clone(), out: out_cols.clone()}); + } + x => {return Err(MechError{msg: "".to_string(), id: 9047, kind: MechErrorKind::GenericError(format!("{:?}",x))})}, + } + } + x => {return Err(MechError{msg: "".to_string(), id: 9156, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + Ok(()) + } +} \ No newline at end of file diff --git a/src/core/src/function/mod.rs b/src/core/src/function/mod.rs new file mode 100644 index 0000000..a3a3329 --- /dev/null +++ b/src/core/src/function/mod.rs @@ -0,0 +1,8 @@ +pub mod compare; +pub mod math_update; +pub mod math; +pub mod stats; +pub mod table; +pub mod set; +pub mod logic; +pub mod matrix; \ No newline at end of file diff --git a/src/core/src/function/set.rs b/src/core/src/function/set.rs new file mode 100644 index 0000000..1287d2e --- /dev/null +++ b/src/core/src/function/set.rs @@ -0,0 +1,233 @@ +use crate::*; +use std::cell::RefCell; +use std::rc::Rc; +use std::fmt::*; +use num_traits::*; +#[cfg(feature = "parallel")] +use rayon::prelude::*; +use std::thread; + +lazy_static! { + pub static ref COLUMN: u64 = hash_str("column"); + pub static ref ROW: u64 = hash_str("row"); + pub static ref TABLE: u64 = hash_str("table"); + pub static ref SET_ANY: u64 = hash_str("set/any"); + pub static ref SET_ALL: u64 = hash_str("set/all"); + pub static ref SET_CARTESIAN: u64 = hash_str("set/cartesian"); +} + +// set/any(column: x) +#[derive(Debug)] +pub struct SetAnyCol { + pub col: ColumnV, pub out: ColumnV +} + +impl MechFunction for SetAnyCol { + fn solve(&self) { + let result = self.col.borrow().iter().any(|x| *x == true); + self.out.borrow_mut()[0] = result + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + +// set/all(column: x) +#[derive(Debug)] +pub struct SetAllCol { + pub col: ColumnV, pub out: ColumnV +} + +impl MechFunction for SetAllCol { + fn solve(&self) { + let result = self.col.borrow().iter().all(|x| *x == true); + self.out.borrow_mut()[0] = result + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + +// set/all(row: x) +#[derive(Debug)] +pub struct SetAllRow { + pub arg: TableRef, pub out: ColumnV +} + +impl MechFunction for SetAllRow { + fn solve(&self) { + let arg_brrw = self.arg.borrow(); + for ix in 0..arg_brrw.rows { + let mut all = true; + for iy in 0..arg_brrw.cols { + let value = match (arg_brrw.get_raw(ix,iy), all) { + (Ok(Value::Bool(true)),true) => true, + _ => false, + }; + all = value; + } + self.out.borrow_mut()[ix] = all; + } + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + +// set/all(table: x) +#[derive(Debug)] +pub struct SetAllTable { + pub arg: TableRef, pub out: ColumnV +} + +impl MechFunction for SetAllTable { + fn solve(&self) { + let mut all = true; + let arg_brrw = self.arg.borrow(); + for ix in 0..arg_brrw.cols { + match arg_brrw.get_column_unchecked(ix) { + Column::Bool(col) => { + let result = col.borrow().iter().all(|x| *x == true); + if result == false { + all = false + } + } + _ => (), + } + } + self.out.borrow_mut()[0] = all; + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + +pub struct SetAll{} +impl MechFunctionCompiler for SetAll { + fn compile(&self, block: &mut Block, arguments: &Vec, out: &(TableId, TableIndex, TableIndex)) -> std::result::Result<(),MechError> { + let (arg_name, mut arg_column,_) = block.get_arg_columns(arguments)?[0].clone(); + let (out_table_id, _, _) = out; + let out_table = block.get_table(out_table_id)?; + let out_col = { + let mut out_brrw = out_table.borrow_mut(); + out_brrw.resize(1,1); + out_brrw.set_kind(ValueKind::Bool); + out_brrw.get_column_unchecked(0) + }; + if arg_name == *COLUMN { + match (arg_column,out_col) { + (Column::Bool(col),Column::Bool(out)) => block.plan.push(SetAllCol{col: col.clone(), out: out.clone()}), + x => {return Err(MechError{msg: "".to_string(), id: 4687, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } else if arg_name == *ROW { + let (_,arg_table_id,_) = &arguments[0]; + let arg_table = block.get_table(arg_table_id)?; + let arg_kind = { + let arg_table_brrw = arg_table.borrow(); + arg_table_brrw.kind() + }; + match (arg_kind,out_col) { + (ValueKind::Bool,Column::Bool(out)) => block.plan.push(SetAllRow{arg: arg_table.clone(), out: out.clone()}), + x => {return Err(MechError{msg: "".to_string(), id: 4688, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } else if arg_name == *TABLE { + let (_,arg_table_id,_) = &arguments[0]; + let arg_table = block.get_table(arg_table_id)?; + let arg_kind = { + let arg_table_brrw = arg_table.borrow(); + arg_table_brrw.kind() + }; + match (arg_kind,out_col) { + (ValueKind::Bool,Column::Bool(out)) => block.plan.push(SetAllTable{arg: arg_table.clone(), out: out.clone()}), + x => {return Err(MechError{msg: "".to_string(), id: 4689, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } else { + return Err(MechError{msg: "".to_string(), id: 4690, kind: MechErrorKind::GenericError(format!("{:?}", arg_name))}); + } + Ok(()) + } +} + +pub struct SetAny{} +impl MechFunctionCompiler for SetAny { + fn compile(&self, block: &mut Block, arguments: &Vec, out: &(TableId, TableIndex, TableIndex)) -> std::result::Result<(),MechError> { + let (arg_name, mut arg_column,_) = block.get_arg_columns(arguments)?[0].clone(); + let (out_table_id, _, _) = out; + let out_table = block.get_table(out_table_id)?; + let mut out_brrw = out_table.borrow_mut(); + out_brrw.resize(1,1); + out_brrw.set_col_kind(0,ValueKind::Bool); + let out_col = out_brrw.get_column_unchecked(0); + if arg_name == *COLUMN { + match (arg_column,out_col) { + (Column::Bool(col),Column::Bool(out)) => block.plan.push(SetAnyCol{col: col.clone(), out: out.clone()}), + x => {return Err(MechError{msg: "".to_string(), id: 4691, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } else { + return Err(MechError{msg: "".to_string(), id: 4692, kind: MechErrorKind::GenericError(format!("{:?}", arg_name))}); + } + Ok(()) + } +} + +// set/cartesian(column: x) +#[derive(Debug)] +pub struct SetCartLeftV { + pub col: (ColumnV,usize), + pub out: ColumnV +} + +impl MechFunction for SetCartLeftV +where T: Copy + Debug + Clone + Sync + Send, +{ + fn solve(&self) { + let (col,len) = &self.col; + let col_brrw = col.borrow(); + col_brrw.iter().flat_map(|n| std::iter::repeat(n).take(*len)) + .zip(self.out.borrow_mut().iter_mut()) + .for_each(|(c,o)| *o = *c); + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + +#[derive(Debug)] +pub struct SetCartRightV { + pub col: ColumnV, + pub out: ColumnV +} + +impl MechFunction for SetCartRightV +where T: Copy + Debug + Clone + Sync + Send, +{ + fn solve(&self) { + self.out.borrow_mut() + .iter_mut() + .zip(self.col.borrow().iter().cycle()) + .for_each(|(out,col)| *out = *col); + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + + +pub struct SetCartesian{} +impl MechFunctionCompiler for SetCartesian { + fn compile(&self, block: &mut Block, arguments: &Vec, out: &(TableId, TableIndex, TableIndex)) -> std::result::Result<(),MechError> { + let (_, mut lhs_arg_column,_) = block.get_arg_columns(arguments)?[0].clone(); + let (_, mut rhs_arg_column,_) = block.get_arg_columns(arguments)?[1].clone(); + let (out_table_id, _, _) = out; + let out_table = block.get_table(out_table_id)?; + let mut out_brrw = out_table.borrow_mut(); + let arg_dims = block.get_arg_dims(&arguments)?; + match (&arg_dims[0],&arg_dims[1]) { + (TableShape::Column(rows_left), TableShape::Column(rows_right)) => { + out_brrw.resize(rows_left * rows_right, 2); + out_brrw.set_col_kind(0,lhs_arg_column.kind()); + out_brrw.set_col_kind(1,rhs_arg_column.kind()); + let out_left_col = out_brrw.get_column_unchecked(0); + match (lhs_arg_column,out_left_col) { + (Column::F32(col),Column::F32(out)) => block.plan.push(SetCartLeftV{col: (col.clone(), *rows_right), out: out.clone()}), + x => {return Err(MechError{msg: "".to_string(), id: 4693, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + let out_right_col = out_brrw.get_column_unchecked(1); + match (rhs_arg_column,out_right_col) { + (Column::F32(col),Column::F32(out)) => block.plan.push(SetCartRightV{col: col.clone(), out: out.clone()}), + x => {return Err(MechError{msg: "".to_string(), id: 4694, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + x => {return Err(MechError{msg: "".to_string(), id: 4695, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + Ok(()) + } +} diff --git a/src/core/src/function/stats.rs b/src/core/src/function/stats.rs new file mode 100644 index 0000000..9c301c9 --- /dev/null +++ b/src/core/src/function/stats.rs @@ -0,0 +1,560 @@ +use crate::*; +use std::cell::RefCell; +use std::rc::Rc; +use std::fmt::*; +use num_traits::{Zero,zero}; +use std::ops::*; +#[cfg(feature = "parallel")] +use rayon::prelude::*; +use std::thread; + +lazy_static! { + pub static ref COLUMN: u64 = hash_str("column"); + pub static ref ROW: u64 = hash_str("row"); + pub static ref TABLE: u64 = hash_str("table"); + pub static ref STATS_SUM: u64 = hash_str("stats/sum"); +} + + +// stats/sum(column: x) +#[derive(Debug)] +pub struct StatsSumV { + pub col: (ColumnV,usize,usize), + pub out: ColumnV +} + +impl MechFunction for StatsSumV +where T: Copy + Debug + Clone + Add + Into + Sync + Send + Zero, + U: Copy + Debug + Clone + Add + Into + Sync + Send + Zero, +{ + fn solve(&self) { + let (col,six,eix) = &self.col; + let result = col.borrow()[*six..=*eix].iter().fold(zero(),|sum, n| sum + *n); + self.out.borrow_mut()[0] = T::into(result); + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + +// stats/sum(table) +#[derive(Debug)] +pub struct StatsSumTable { + pub cols: Vec>, + pub rows: usize, + pub out: ColumnV +} + +impl MechFunction for StatsSumTable +where T: Copy + Debug + Clone + Add + Into + Sync + Send + Zero, + U: Copy + Debug + Clone + Add + Into + Sync + Send + Zero, +{ + fn solve(&self) { + let mut sum: T = zero(); + for row in 0..self.rows { + for col in &self.cols { + let col_brrw = col.borrow(); + sum = sum + col_brrw[row]; + } + } + (*self.out.borrow_mut())[0] = T::into(sum); + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + +#[derive(Debug)] +pub struct StatsSumRow { + pub cols: Vec>, + pub rows: usize, + pub out: ColumnV +} + +impl MechFunction for StatsSumRow +where T: Copy + Debug + Clone + Add + Into + Sync + Send + Zero, + U: Copy + Debug + Clone + Add + Into + Sync + Send + Zero, +{ + fn solve(&self) { + for row in 0..self.rows { + let mut sum: T = zero(); + for col in &self.cols { + let col_brrw = col.borrow(); + sum = sum + col_brrw[row]; + } + (*self.out.borrow_mut())[row] = T::into(sum); + } + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + +// stats/sum(column: x) +#[derive(Debug)] +pub struct StatsSumVB { + pub col: ColumnV, pub ix: ColumnV, pub out: ColumnV +} + +impl MechFunction for StatsSumVB +where T: std::ops::Add + Debug + Copy + Into + Zero, + U: std::ops::Add + Debug + Copy + Into + Zero, +{ + fn solve(&self) { + let result = self.col.borrow() + .iter() + .zip(self.ix.borrow().iter()) + .fold(zero(),|sum, (n,ix)| if *ix {sum + T::into(*n)} else {sum}); + self.out.borrow_mut()[0] = result + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + + +// stats/sum(column: x{ix}) +#[derive(Debug)] +pub struct StatsSumTB { + pub col: ArgTable, pub ix: Arg, pub out: ColumnV +} + +impl MechFunction for StatsSumTB { + fn solve(&self) { + let mut sum = 0.0; + let table_brrw = self.col.borrow(); + let ix_brrw = self.ix.borrow(); + for i in 0..ix_brrw.len() { + match (table_brrw.get_linear(i),ix_brrw[i]) { + (Ok(Value::F32(val)),ix_value) => { + if ix_value { + sum = sum + val.unwrap() + } + }, + _ => (), + } + } + (*self.out.borrow_mut())[0] = F32::new(sum); + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + +pub struct StatsSum{} + +impl MechFunctionCompiler for StatsSum { + fn compile(&self, block: &mut Block, arguments: &Vec, out: &(TableId, TableIndex, TableIndex)) -> std::result::Result<(),MechError> { + if arguments.len() > 1 { + return Err(MechError{msg: "".to_string(), id: 3040, kind: MechErrorKind::GenericError("Too many function arguments".to_string())}); + } + let (out_table_id, _, _) = out; + let arg_col = block.get_arg_column(&arguments[0])?; + let arg_cols = vec![arg_col]; // This is a hack for now until it's fixed later + let out_table = block.get_table(out_table_id)?; + let mut out_brrw = out_table.borrow_mut(); + out_brrw.resize(1,arg_cols.len()); + for (col_ix,(arg_name,arg_col,row_index)) in arg_cols.iter().enumerate() { + if *arg_name == *COLUMN { + out_brrw.set_col_kind(col_ix,arg_col.kind()); + let mut out_col = out_brrw.get_col_raw(col_ix)?; + match (arg_col,row_index,out_col) { + (Column::Length(col),ColumnIndex::All,Column::Length(out)) => block.plan.push(StatsSumV{col: (col.clone(),0,col.len()-1), out: out.clone()}), + (Column::F32(col),ColumnIndex::All,Column::F32(out)) => block.plan.push(StatsSumV{col: (col.clone(),0,col.len()-1), out: out.clone()}), + (Column::F32(col),ColumnIndex::Bool(bix),Column::F32(out)) => block.plan.push(StatsSumVB{col: col.clone(), ix: bix.clone(), out: out.clone()}), + (Column::F32(col),ColumnIndex::Index(ix),Column::F32(out)) => block.plan.push(StatsSumV{col: (col.clone(),*ix,*ix), out: out.clone()}), + (Column::F64(col),ColumnIndex::All,Column::F64(out)) => block.plan.push(StatsSumV{col: (col.clone(),0,col.len()-1), out: out.clone()}), + (Column::F64(col),ColumnIndex::Bool(bix),Column::F64(out)) => block.plan.push(StatsSumVB{col: col.clone(), ix: bix.clone(), out: out.clone()}), + (Column::F64(col),ColumnIndex::Index(ix),Column::F64(out)) => block.plan.push(StatsSumV{col: (col.clone(),*ix,*ix), out: out.clone()}), + (Column::U8(col),ColumnIndex::All,Column::U8(out)) => block.plan.push(StatsSumV{col: (col.clone(),0,col.len()-1), out: out.clone()}), + (Column::U8(col),ColumnIndex::Bool(bix),Column::U8(out)) => block.plan.push(StatsSumVB{col: col.clone(), ix: bix.clone(), out: out.clone()}), + (Column::U8(col),ColumnIndex::Index(ix),Column::U8(out)) => block.plan.push(StatsSumV{col: (col.clone(),*ix,*ix), out: out.clone()}), + (Column::U16(col),ColumnIndex::All,Column::U16(out)) => block.plan.push(StatsSumV{col: (col.clone(),0,col.len()-1), out: out.clone()}), + (Column::U16(col),ColumnIndex::Bool(bix),Column::U16(out)) => block.plan.push(StatsSumVB{col: col.clone(), ix: bix.clone(), out: out.clone()}), + (Column::U16(col),ColumnIndex::Index(ix),Column::U16(out)) => block.plan.push(StatsSumV{col: (col.clone(),*ix,*ix), out: out.clone()}), + (Column::U32(col),ColumnIndex::All,Column::U32(out)) => block.plan.push(StatsSumV{col: (col.clone(),0,col.len()-1), out: out.clone()}), + (Column::U32(col),ColumnIndex::Bool(bix),Column::U32(out)) => block.plan.push(StatsSumVB{col: col.clone(), ix: bix.clone(), out: out.clone()}), + (Column::U32(col),ColumnIndex::Index(ix),Column::U32(out)) => block.plan.push(StatsSumV{col: (col.clone(),*ix,*ix), out: out.clone()}), + (Column::U64(col),ColumnIndex::All,Column::U64(out)) => block.plan.push(StatsSumV{col: (col.clone(),0,col.len()-1), out: out.clone()}), + (Column::U64(col),ColumnIndex::Bool(bix),Column::U64(out)) => block.plan.push(StatsSumVB{col: col.clone(), ix: bix.clone(), out: out.clone()}), + (Column::U64(col),ColumnIndex::Index(ix),Column::U64(out)) => block.plan.push(StatsSumV{col: (col.clone(),*ix,*ix), out: out.clone()}), + (Column::U128(col),ColumnIndex::All,Column::U128(out)) => block.plan.push(StatsSumV{col: (col.clone(),0,col.len()-1), out: out.clone()}), + (Column::U128(col),ColumnIndex::Bool(bix),Column::U128(out)) => block.plan.push(StatsSumVB{col: col.clone(), ix: bix.clone(), out: out.clone()}), + (Column::U128(col),ColumnIndex::Index(ix),Column::U128(out)) => block.plan.push(StatsSumV{col: (col.clone(),*ix,*ix), out: out.clone()}), + (Column::I8(col),ColumnIndex::All,Column::I8(out)) => block.plan.push(StatsSumV{col: (col.clone(),0,col.len()-1), out: out.clone()}), + (Column::I8(col),ColumnIndex::Bool(bix),Column::I8(out)) => block.plan.push(StatsSumVB{col: col.clone(), ix: bix.clone(), out: out.clone()}), + (Column::I8(col),ColumnIndex::Index(ix),Column::I8(out)) => block.plan.push(StatsSumV{col: (col.clone(),*ix,*ix), out: out.clone()}), + (Column::I16(col),ColumnIndex::All,Column::I16(out)) => block.plan.push(StatsSumV{col: (col.clone(),0,col.len()-1), out: out.clone()}), + (Column::I16(col),ColumnIndex::Bool(bix),Column::I16(out)) => block.plan.push(StatsSumVB{col: col.clone(), ix: bix.clone(), out: out.clone()}), + (Column::I16(col),ColumnIndex::Index(ix),Column::I16(out)) => block.plan.push(StatsSumV{col: (col.clone(),*ix,*ix), out: out.clone()}), + (Column::I32(col),ColumnIndex::All,Column::I32(out)) => block.plan.push(StatsSumV{col: (col.clone(),0,col.len()-1), out: out.clone()}), + (Column::I32(col),ColumnIndex::Bool(bix),Column::I32(out)) => block.plan.push(StatsSumVB{col: col.clone(), ix: bix.clone(), out: out.clone()}), + (Column::I32(col),ColumnIndex::Index(ix),Column::I32(out)) => block.plan.push(StatsSumV{col: (col.clone(),*ix,*ix), out: out.clone()}), + (Column::I64(col),ColumnIndex::All,Column::I64(out)) => block.plan.push(StatsSumV{col: (col.clone(),0,col.len()-1), out: out.clone()}), + (Column::I64(col),ColumnIndex::Bool(bix),Column::I64(out)) => block.plan.push(StatsSumVB{col: col.clone(), ix: bix.clone(), out: out.clone()}), + (Column::I128(col),ColumnIndex::All,Column::I128(out)) => block.plan.push(StatsSumV{col: (col.clone(),0,col.len()-1), out: out.clone()}), + (Column::I128(col),ColumnIndex::Bool(bix),Column::I128(out)) => block.plan.push(StatsSumVB{col: col.clone(), ix: bix.clone(), out: out.clone()}), + (Column::I128(col),ColumnIndex::Index(ix),Column::I128(out)) => block.plan.push(StatsSumV{col: (col.clone(),*ix,*ix), out: out.clone()}), + (Column::Reference((ref table, (ColumnIndex::All, ColumnIndex::All))),ColumnIndex::All,Column::F32(out)) => { + let table_brrw = table.borrow(); + out_brrw.resize(1,table_brrw.cols); + out_brrw.set_kind(table_brrw.kind()); + for i in 0..table_brrw.cols { + if let (Column::F32(col),Column::F32(out)) = (table_brrw.get_col_raw(i)?, out_brrw.get_col_raw(i)?) { + block.plan.push(StatsSumV{col: (col.clone(),0,col.len()-1), out: out.clone()}); + } + } + } + (Column::Reference((ref table, (ColumnIndex::Bool(ix_col), ColumnIndex::None))),_,Column::F32(out)) => block.plan.push(StatsSumTB{col: table.clone(), ix: ix_col.clone(), out: out.clone()}), + x => {return Err(MechError{msg: "".to_string(), id: 3041, kind: MechErrorKind::GenericError(format!("{:?}",x))})}, + } + } + else if *arg_name == *ROW { + let (arg_name,arg_table_id,_) = arguments[0]; + let arg_table = block.get_table(&arg_table_id)?; + let kind = { + let arg_table_brrw = arg_table.borrow(); + arg_table_brrw.kind() + }; + match kind { + ValueKind::Compound(_) => { + return Err(MechError{msg: "".to_string(), id: 3042, kind: MechErrorKind::GenericError("stat/sum(row) doesn't support compound table kinds.".to_string())}); + } + k => { + out_brrw.resize(arg_table.borrow().rows,1); + out_brrw.set_kind(k); + } + } + match out_brrw.get_column_unchecked(0) { + Column::U8(out_col) => { + let (cols,rows) = { + let mut cols: Vec> = vec![]; + let arg_table_brrw = arg_table.borrow(); + for col_ix in 0..arg_table_brrw.cols { + if let Column::U8(col) = arg_table_brrw.get_column_unchecked(col_ix) { + cols.push(col); + } + } + (cols,arg_table_brrw.rows) + }; + block.plan.push(StatsSumRow{cols: cols.clone(), rows: rows, out: out_col.clone()}); + } + Column::U16(out_col) => { + let (cols,rows) = { + let mut cols: Vec> = vec![]; + let arg_table_brrw = arg_table.borrow(); + for col_ix in 0..arg_table_brrw.cols { + if let Column::U16(col) = arg_table_brrw.get_column_unchecked(col_ix) { + cols.push(col); + } + } + (cols,arg_table_brrw.rows) + }; + block.plan.push(StatsSumRow{cols: cols.clone(), rows: rows, out: out_col.clone()}); + } + Column::U32(out_col) => { + let (cols,rows) = { + let mut cols: Vec> = vec![]; + let arg_table_brrw = arg_table.borrow(); + for col_ix in 0..arg_table_brrw.cols { + if let Column::U32(col) = arg_table_brrw.get_column_unchecked(col_ix) { + cols.push(col); + } + } + (cols,arg_table_brrw.rows) + }; + block.plan.push(StatsSumRow{cols: cols.clone(), rows: rows, out: out_col.clone()}); + } + Column::U64(out_col) => { + let (cols,rows) = { + let mut cols: Vec> = vec![]; + let arg_table_brrw = arg_table.borrow(); + for col_ix in 0..arg_table_brrw.cols { + if let Column::U64(col) = arg_table_brrw.get_column_unchecked(col_ix) { + cols.push(col); + } + } + (cols,arg_table_brrw.rows) + }; + block.plan.push(StatsSumRow{cols: cols.clone(), rows: rows, out: out_col.clone()}); + } + Column::U128(out_col) => { + let (cols,rows) = { + let mut cols: Vec> = vec![]; + let arg_table_brrw = arg_table.borrow(); + for col_ix in 0..arg_table_brrw.cols { + if let Column::U128(col) = arg_table_brrw.get_column_unchecked(col_ix) { + cols.push(col); + } + } + (cols,arg_table_brrw.rows) + }; + block.plan.push(StatsSumRow{cols: cols.clone(), rows: rows, out: out_col.clone()}); + } + Column::I8(out_col) => { + let (cols,rows) = { + let mut cols: Vec> = vec![]; + let arg_table_brrw = arg_table.borrow(); + for col_ix in 0..arg_table_brrw.cols { + if let Column::I8(col) = arg_table_brrw.get_column_unchecked(col_ix) { + cols.push(col); + } + } + (cols,arg_table_brrw.rows) + }; + block.plan.push(StatsSumRow{cols: cols.clone(), rows: rows, out: out_col.clone()}); + } + Column::I16(out_col) => { + let (cols,rows) = { + let mut cols: Vec> = vec![]; + let arg_table_brrw = arg_table.borrow(); + for col_ix in 0..arg_table_brrw.cols { + if let Column::I16(col) = arg_table_brrw.get_column_unchecked(col_ix) { + cols.push(col); + } + } + (cols,arg_table_brrw.rows) + }; + block.plan.push(StatsSumRow{cols: cols.clone(), rows: rows, out: out_col.clone()}); + } + Column::I32(out_col) => { + let (cols,rows) = { + let mut cols: Vec> = vec![]; + let arg_table_brrw = arg_table.borrow(); + for col_ix in 0..arg_table_brrw.cols { + if let Column::I32(col) = arg_table_brrw.get_column_unchecked(col_ix) { + cols.push(col); + } + } + (cols,arg_table_brrw.rows) + }; + block.plan.push(StatsSumRow{cols: cols.clone(), rows: rows, out: out_col.clone()}); + } + Column::I64(out_col) => { + let (cols,rows) = { + let mut cols: Vec> = vec![]; + let arg_table_brrw = arg_table.borrow(); + for col_ix in 0..arg_table_brrw.cols { + if let Column::I64(col) = arg_table_brrw.get_column_unchecked(col_ix) { + cols.push(col); + } + } + (cols,arg_table_brrw.rows) + }; + block.plan.push(StatsSumRow{cols: cols.clone(), rows: rows, out: out_col.clone()}); + } + Column::I128(out_col) => { + let (cols,rows) = { + let mut cols: Vec> = vec![]; + let arg_table_brrw = arg_table.borrow(); + for col_ix in 0..arg_table_brrw.cols { + if let Column::I128(col) = arg_table_brrw.get_column_unchecked(col_ix) { + cols.push(col); + } + } + (cols,arg_table_brrw.rows) + }; + block.plan.push(StatsSumRow{cols: cols.clone(), rows: rows, out: out_col.clone()}); + } + Column::F32(out_col) => { + let (cols,rows) = { + let mut cols: Vec> = vec![]; + let arg_table_brrw = arg_table.borrow(); + for col_ix in 0..arg_table_brrw.cols { + if let Column::F32(col) = arg_table_brrw.get_column_unchecked(col_ix) { + cols.push(col); + } + } + (cols,arg_table_brrw.rows) + }; + block.plan.push(StatsSumRow{cols: cols.clone(), rows: rows, out: out_col.clone()}); + } + Column::F64(out_col) => { + let (cols,rows) = { + let mut cols: Vec> = vec![]; + let arg_table_brrw = arg_table.borrow(); + for col_ix in 0..arg_table_brrw.cols { + if let Column::F64(col) = arg_table_brrw.get_column_unchecked(col_ix) { + cols.push(col); + } + } + (cols,arg_table_brrw.rows) + }; + block.plan.push(StatsSumRow{cols: cols.clone(), rows: rows, out: out_col.clone()}); + } + x => {return Err(MechError{msg: "".to_string(), id: 3043, kind: MechErrorKind::GenericError(format!("{:?}",x))})}, + } + } + else if *arg_name == *TABLE { + let (arg_name,arg_table_id,_) = arguments[0]; + let arg_table = block.get_table(&arg_table_id)?; + let kind = { + let arg_table_brrw = arg_table.borrow(); + arg_table_brrw.kind() + }; + match kind { + ValueKind::Compound(_) => { + return Err(MechError{msg: "".to_string(), id: 3044, kind: MechErrorKind::GenericError("stat/sum(row) doesn't support compound table kinds.".to_string())}); + } + k => { + out_brrw.resize(1,1); + out_brrw.set_kind(k); + } + } + match out_brrw.get_column_unchecked(0) { + Column::U8(out_col) => { + let (cols,rows) = { + let mut cols: Vec> = vec![]; + let arg_table_brrw = arg_table.borrow(); + for col_ix in 0..arg_table_brrw.cols { + if let Column::U8(col) = arg_table_brrw.get_column_unchecked(col_ix) { + cols.push(col); + } + } + (cols,arg_table_brrw.rows) + }; + block.plan.push(StatsSumTable{cols: cols.clone(), rows: rows, out: out_col.clone()}); + } + Column::U16(out_col) => { + let (cols,rows) = { + let mut cols: Vec> = vec![]; + let arg_table_brrw = arg_table.borrow(); + for col_ix in 0..arg_table_brrw.cols { + if let Column::U16(col) = arg_table_brrw.get_column_unchecked(col_ix) { + cols.push(col); + } + } + (cols,arg_table_brrw.rows) + }; + block.plan.push(StatsSumTable{cols: cols.clone(), rows: rows, out: out_col.clone()}); + } + Column::U32(out_col) => { + let (cols,rows) = { + let mut cols: Vec> = vec![]; + let arg_table_brrw = arg_table.borrow(); + for col_ix in 0..arg_table_brrw.cols { + if let Column::U32(col) = arg_table_brrw.get_column_unchecked(col_ix) { + cols.push(col); + } + } + (cols,arg_table_brrw.rows) + }; + block.plan.push(StatsSumTable{cols: cols.clone(), rows: rows, out: out_col.clone()}); + } + Column::U64(out_col) => { + let (cols,rows) = { + let mut cols: Vec> = vec![]; + let arg_table_brrw = arg_table.borrow(); + for col_ix in 0..arg_table_brrw.cols { + if let Column::U64(col) = arg_table_brrw.get_column_unchecked(col_ix) { + cols.push(col); + } + } + (cols,arg_table_brrw.rows) + }; + block.plan.push(StatsSumTable{cols: cols.clone(), rows: rows, out: out_col.clone()}); + } + Column::U128(out_col) => { + let (cols,rows) = { + let mut cols: Vec> = vec![]; + let arg_table_brrw = arg_table.borrow(); + for col_ix in 0..arg_table_brrw.cols { + if let Column::U128(col) = arg_table_brrw.get_column_unchecked(col_ix) { + cols.push(col); + } + } + (cols,arg_table_brrw.rows) + }; + block.plan.push(StatsSumTable{cols: cols.clone(), rows: rows, out: out_col.clone()}); + } + Column::I8(out_col) => { + let (cols,rows) = { + let mut cols: Vec> = vec![]; + let arg_table_brrw = arg_table.borrow(); + for col_ix in 0..arg_table_brrw.cols { + if let Column::I8(col) = arg_table_brrw.get_column_unchecked(col_ix) { + cols.push(col); + } + } + (cols,arg_table_brrw.rows) + }; + block.plan.push(StatsSumTable{cols: cols.clone(), rows: rows, out: out_col.clone()}); + } + Column::I16(out_col) => { + let (cols,rows) = { + let mut cols: Vec> = vec![]; + let arg_table_brrw = arg_table.borrow(); + for col_ix in 0..arg_table_brrw.cols { + if let Column::I16(col) = arg_table_brrw.get_column_unchecked(col_ix) { + cols.push(col); + } + } + (cols,arg_table_brrw.rows) + }; + block.plan.push(StatsSumTable{cols: cols.clone(), rows: rows, out: out_col.clone()}); + } + Column::I32(out_col) => { + let (cols,rows) = { + let mut cols: Vec> = vec![]; + let arg_table_brrw = arg_table.borrow(); + for col_ix in 0..arg_table_brrw.cols { + if let Column::I32(col) = arg_table_brrw.get_column_unchecked(col_ix) { + cols.push(col); + } + } + (cols,arg_table_brrw.rows) + }; + block.plan.push(StatsSumTable{cols: cols.clone(), rows: rows, out: out_col.clone()}); + } + Column::I64(out_col) => { + let (cols,rows) = { + let mut cols: Vec> = vec![]; + let arg_table_brrw = arg_table.borrow(); + for col_ix in 0..arg_table_brrw.cols { + if let Column::I64(col) = arg_table_brrw.get_column_unchecked(col_ix) { + cols.push(col); + } + } + (cols,arg_table_brrw.rows) + }; + block.plan.push(StatsSumTable{cols: cols.clone(), rows: rows, out: out_col.clone()}); + } + Column::I128(out_col) => { + let (cols,rows) = { + let mut cols: Vec> = vec![]; + let arg_table_brrw = arg_table.borrow(); + for col_ix in 0..arg_table_brrw.cols { + if let Column::I128(col) = arg_table_brrw.get_column_unchecked(col_ix) { + cols.push(col); + } + } + (cols,arg_table_brrw.rows) + }; + block.plan.push(StatsSumTable{cols: cols.clone(), rows: rows, out: out_col.clone()}); + } + Column::F32(out_col) => { + let (cols,rows) = { + let mut cols: Vec> = vec![]; + let arg_table_brrw = arg_table.borrow(); + for col_ix in 0..arg_table_brrw.cols { + if let Column::F32(col) = arg_table_brrw.get_column_unchecked(col_ix) { + cols.push(col); + } + } + (cols,arg_table_brrw.rows) + }; + block.plan.push(StatsSumTable{cols: cols.clone(), rows: rows, out: out_col.clone()}); + } + Column::F64(out_col) => { + let (cols,rows) = { + let mut cols: Vec> = vec![]; + let arg_table_brrw = arg_table.borrow(); + for col_ix in 0..arg_table_brrw.cols { + if let Column::F64(col) = arg_table_brrw.get_column_unchecked(col_ix) { + cols.push(col); + } + } + (cols,arg_table_brrw.rows) + }; + block.plan.push(StatsSumTable{cols: cols.clone(), rows: rows, out: out_col.clone()}); + } + x => {return Err(MechError{msg: "".to_string(), id: 3045, kind: MechErrorKind::GenericError(format!("{:?}",x))})}, + } + } + else { + return Err(MechError{msg: "".to_string(), id: 3046, kind: MechErrorKind::UnknownFunctionArgument(*arg_name)}); + } + } + Ok(()) + } +} \ No newline at end of file diff --git a/src/core/src/function/table.rs b/src/core/src/function/table.rs new file mode 100644 index 0000000..16c95e7 --- /dev/null +++ b/src/core/src/function/table.rs @@ -0,0 +1,3601 @@ +use crate::*; +use std::cell::RefCell; +use std::rc::Rc; +use std::fmt::*; +use num_traits::*; +use rust_core::iter::FromIterator; +#[cfg(feature = "parallel")] +use rayon::prelude::*; +use std::thread; +use hashbrown::HashSet; + + +lazy_static! { + pub static ref TABLE_RANGE: u64 = hash_str("table/range"); + pub static ref TABLE_SPLIT: u64 = hash_str("table/split"); + pub static ref TABLE_FLATTEN: u64 = hash_str("table/flatten"); + pub static ref TABLE_HORIZONTAL__CONCATENATE: u64 = hash_str("table/horizontal-concatenate"); + pub static ref TABLE_VERTICAL__CONCATENATE: u64 = hash_str("table/vertical-concatenate"); + pub static ref TABLE_APPEND: u64 = hash_str("table/append"); + pub static ref TABLE_SIZE: u64 = hash_str("table/size"); + pub static ref TABLE_DEFINE: u64 = hash_str("table/define"); + pub static ref TABLE_SET: u64 = hash_str("table/set"); + pub static ref TABLE_FOLLOWED__BY: u64 = hash_str("table/followed-by"); + pub static ref TABLE: u64 = hash_str("table"); +} + + +// Copy Vector : Vector +#[derive(Debug)] +pub struct CopyVV { + pub arg: (ColumnV, usize, usize), + pub out: (ColumnV, usize, usize), +} +impl MechFunction for CopyVV +where T: Debug + Clone + Into + Sync + Send, + U: Debug + Clone + Sync + Send, +{ + fn solve(&self) { + let (arg,asix,aeix) = &self.arg; + let (out,osix,oeix) = &self.out; + out.borrow_mut()[*osix..=*oeix] + .iter_mut() + .zip(arg.borrow()[*asix..=*aeix].iter()) + .for_each(|(out, arg)| *out = T::into(arg.clone())); + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + +// Copy SIx : S +#[derive(Debug)] +pub struct CopySIxS { + pub arg: (ColumnV, ArgTable), + pub out: ColumnV, +} +impl MechFunction for CopySIxS +where T: Debug + Clone + Into + Sync + Send, + U: Debug + Clone + Sync + Send, +{ + fn solve(&self) { + let (arg,ix_table) = &self.arg; + let out = &self.out; + if let Value::U8(ix) = ix_table.borrow().get_raw(0,0).unwrap() { + let mut out = &mut out.borrow_mut()[0]; + *out = T::into(arg.borrow()[ix.unwrap() as usize - 1].clone()); + } + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + +// Parallel Copy Vector : Vector +#[cfg(feature = "parallel")] +#[derive(Debug)] +pub struct ParCopyVV { + pub arg: (ColumnV, usize, usize), + pub out: (ColumnV, usize, usize), +} +#[cfg(feature = "parallel")] +impl MechFunction for ParCopyVV +where T: Debug + Clone + Into + Sync + Send, + U: Debug + Clone + Sync + Send, +{ + fn solve(&self) { + let (arg,asix,aeix) = &self.arg; + let (out,osix,oeix) = &self.out; + out.borrow_mut()[*osix..=*oeix] + .par_iter_mut() + .zip(arg.borrow()[*asix..=*aeix].par_iter()) + .for_each(|(out, arg)| *out = T::into(arg.clone())); + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + + +// Copy Dynamic : Dynamic +#[derive(Debug)] +pub struct CopyDD { + pub arg: ColumnV, + pub out: ColumnV, + pub out_table: OutTable, +} +impl MechFunction for CopyDD +where T: Debug + Clone + Into + Sync + Send, + U: Debug + Clone + Sync + Send, +{ + fn solve(&self) { + let arg = self.arg.borrow(); + let out = &self.out; + { + let mut out_table_brrw = self.out_table.borrow_mut(); + let cols = out_table_brrw.cols; + out_table_brrw.resize(arg.len(),cols); + } + out.borrow_mut() + .iter_mut() + .zip(arg.iter()) + .for_each(|(out, arg)| *out = T::into(arg.clone())); + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + +// Copy Vector : Vector +#[derive(Debug)] +pub struct CopyVIV { + pub arg: ColumnV, + pub ix: ColumnV, + pub out: ColumnV, +} +impl MechFunction for CopyVIV +where T: Debug + Clone + Into + Sync + Send, + U: Debug + Clone + Sync + Send, +{ + fn solve(&self) { + let arg_brrw = self.arg.borrow(); + self.out.borrow_mut() + .iter_mut() + .zip(self.ix.borrow().iter()) + .for_each(|(out, ix)| { + *out = T::into(arg_brrw[ix.unwrap() as usize - 1].clone()) + }); + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + + +// Copy Scalar : Vector +#[derive(Debug)] +pub struct CopySV { + pub arg: ColumnV, pub ix: usize, pub out: ColumnV +} +impl MechFunction for CopySV +where T: Clone + Debug + Into, + U: Clone + Debug +{ + fn solve(&self) { + let arg = self.arg.borrow()[self.ix].clone(); + self.out.borrow_mut().iter_mut().for_each(|out| *out = T::into(arg.clone())); + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + + +// Copy Vector : Vector Ref +#[derive(Debug)] +pub struct CopyVVRef { + pub arg: ColumnV, pub out: ColumnV +} +impl MechFunction for CopyVVRef { + fn solve(&self) { + self.out.borrow_mut().iter_mut().zip(self.arg.borrow().iter()).for_each(|(out, arg)| { + let id = TableId::Global(*arg.unwrap()); + *out = id; + }); + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + + +// Copy Reference +#[derive(Debug)] +pub struct CopySVRef { + pub arg: ColumnV, pub ix: usize , pub out: ColumnV +} +impl MechFunction for CopySVRef +{ + fn solve(&self) { + let id = TableId::Global(*self.arg.borrow()[self.ix].unwrap()); + self.out.borrow_mut().iter_mut().for_each(|out| *out = id.clone()); + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + + +// Copy Reference +#[derive(Debug)] +pub struct CopySSRef { + pub arg: ColumnV, pub ix: usize , pub out: ColumnV +} +impl MechFunction for CopySSRef +{ + fn solve(&self) { + (self.out.borrow_mut())[0] = self.arg.borrow()[self.ix] + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + + +// Copy Vector{Bool Ix} : Vector +#[derive(Debug)] +pub struct CopyVB { + pub arg: ColumnV, + pub bix: ColumnV, + pub out: ColumnV, + pub out_table: OutTable, +} +impl MechFunction for CopyVB +where T: Debug + Clone + Into + Sync + Send, + U: Debug + Clone + Sync + Send, + Vec: FromIterator, +{ + fn solve(&self) { + // Filter the column to include only elements with a "true" index + let filtered: Vec = + self.arg.borrow() + .iter() + .zip(self.bix.borrow().iter()) + .filter_map(|(x,ix)| if *ix {Some(x.clone())} else {None}) + .collect::>(); + let rows = filtered.len(); + { + let mut out_table_brrw = self.out_table.borrow_mut(); + if rows > out_table_brrw.rows { + let cols = out_table_brrw.cols; + out_table_brrw.resize(rows,cols); + } + } + let mut out_brrw = self.out.borrow_mut(); + for row in 0..filtered.len() { + out_brrw[row] = filtered[row].clone(); + } + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + +// Copy Vector{Bool Ix} : Vector +#[derive(Debug)] +pub struct CopyVBT { + pub arg: ColumnV, + pub bix: ColumnV, + pub out: ColumnV, + pub table: ArgTable, +} +impl MechFunction for CopyVBT +where T: Debug + Clone + Into + Sync + Send, + U: Debug + Clone + Sync + Send, + Vec: FromIterator, +{ + fn solve(&self) { + + // Filter the column to include only elements with a "true" index + let filtered: Vec = + self.arg.borrow() + .iter() + .zip(self.bix.borrow().iter()) + .filter_map(|(x,ix)| if *ix {Some(x.clone())} else {None}) + .collect::>(); + let rows = { + let mut out_brrw = self.out.borrow_mut(); + let rows = filtered.len(); + if rows == 0 { + 0 + } else { + if rows != out_brrw.len() { + out_brrw.resize(rows,filtered[0].clone()); + } + for row in 0..filtered.len() { + out_brrw[row] = filtered[row].clone(); + } + rows + } + }; + { + let mut table_brrw = self.table.borrow_mut(); + let cols = table_brrw.cols; + table_brrw.resize(rows,cols); + } + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + +// Copy Vector{Int Ix} : Vector +#[derive(Debug)] +pub struct CopyVI { + pub arg: ColumnV, pub ix: ColumnV, pub out: ColumnV +} +impl MechFunction for CopyVI +where T: Clone + Debug + Into, + U: Clone + Debug +{ + fn solve(&self) { + let mut out_brrw = self.out.borrow_mut(); + let arg_brrw = self.arg.borrow(); + let ix_brrw = self.ix.borrow(); + + let rows = ix_brrw.len(); + if rows > out_brrw.len() { + out_brrw.resize(rows,T::into(arg_brrw[0].clone())); + } + for (out_ix, row) in ix_brrw.iter().enumerate() { + out_brrw[out_ix] = T::into(arg_brrw[*row as usize - 1].clone()); + } + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + +#[derive(Debug)] +pub struct CopyVRV { + pub arg: ColumnV, pub ix: ColumnV, pub out: ColumnV +} +impl MechFunction for CopyVRV +where T: Clone + Debug + Into, + U: Clone + Debug + Into, + V: Clone + Debug +{ + fn solve(&self) { + let mut out_brrw = self.out.borrow_mut(); + let arg_brrw = self.arg.borrow(); + let ix_brrw = self.ix.borrow(); + + let rows = ix_brrw.len(); + if rows > out_brrw.len() { + out_brrw.resize(rows,T::into(arg_brrw[0].clone())); + } + for (out_ix, row) in ix_brrw.iter().enumerate() { + let urow:usize = U::into(row.clone()); + out_brrw[out_ix] = T::into(arg_brrw[urow - 1].clone()); + } + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + + +// Copy Vector{Int Ix} : Vector +#[derive(Debug)] +pub struct CopyTIV { + pub arg: ArgTable, pub ix: ColumnV, pub out: OutTable +} +impl MechFunction for CopyTIV +{ + fn solve(&self) { + let arg_brrw = self.arg.borrow(); + let mut out_brrw = self.out.borrow_mut(); + let arows = self.ix.len(); + let orows = out_brrw.rows; + let new_rows = orows + arows; + let ocols = out_brrw.cols; + out_brrw.resize(new_rows,ocols); + for ix_col_ix in 0..arows { + let ix = self.ix.get_unchecked(ix_col_ix); + let value = arg_brrw.get_linear_raw(ix.into()).unwrap(); + out_brrw.set_raw(orows+ix_col_ix,0,value); + } + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + + +// Set Scalar : Scalar +#[derive(Debug)] +pub struct SetSIxSIx { + pub arg: ColumnV, pub ix: usize, pub out: ColumnV, pub oix: usize +} +impl MechFunction for SetSIxSIx +where T: Clone + Debug + Into, + U: Clone + Debug +{ + fn solve(&self) { + (self.out.borrow_mut())[self.oix] = T::into((self.arg.borrow())[self.ix].clone()); + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + +// Set Scalar : Scalar +#[derive(Debug)] +pub struct SetSIxColSIx { + pub arg: ColumnV, pub ix: ColumnV, pub out: ColumnV, pub oix: usize +} +impl MechFunction for SetSIxColSIx +where T: Clone + Debug + Into, + U: Clone + Debug, +{ + fn solve(&self) { + let ix_col = self.ix.borrow(); + let ix: usize = ix_col[0].unwrap() as usize - 1; + (self.out.borrow_mut())[self.oix] = T::into((self.arg.borrow())[ix].clone()); + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + +// Set Scalar : Scalar +#[derive(Debug)] +pub struct SetSIxSIxCol { + pub arg: ColumnV, pub ix: usize, pub out: ColumnV, pub oix: ColumnV +} +impl MechFunction for SetSIxSIxCol +where T: Clone + Debug + Into, + U: Clone + Debug, +{ + fn solve(&self) { + let oix_col = self.oix.borrow(); + let oix: usize = oix_col[0].unwrap() as usize - 1; + (self.out.borrow_mut())[oix] = T::into((self.arg.borrow())[self.ix].clone()); + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + + +// Set Scalar : Vector {Bool} +#[derive(Debug)] +pub struct SetSIxVB { + pub arg: ColumnV, pub ix: usize, pub out: ColumnV, pub oix: ColumnV +} +impl MechFunction for SetSIxVB +where T: Clone + Debug + Into, + U: Clone + Debug +{ + fn solve(&self) { + let oix_brrw = self.oix.borrow(); + for row in 0..oix_brrw.len() { + if oix_brrw[row] { + (self.out.borrow_mut())[row] = T::into((self.arg.borrow())[self.ix].clone()); + } + } + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + + +// Set Scalar : Vector {Bool} +#[derive(Debug)] +pub struct CopyTB { + pub arg: ArgTable, pub bix: ColumnV, pub out: OutTable, +} +impl MechFunction for CopyTB +{ + fn solve(&self) { + let ix_brrw = self.bix.borrow(); + let rows = ix_brrw.iter().fold(0, |acc,x| if *x { acc + 1 } else { acc }); + + + let src_brrw = self.arg.borrow(); + let mut out_brrw = self.out.borrow_mut(); + out_brrw.resize(rows,1); + let mut i = 0; + for j in 0..ix_brrw.len() { + match ix_brrw[j] { + false => continue, + true => { + let value = src_brrw.get_linear(j).unwrap(); + out_brrw.set_linear(i,value).unwrap(); + i+=1; + } + } + } + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + + +// Set Vector : Vector {Bool} +#[derive(Debug)] +pub struct SetVVB { + pub arg: ColumnV, pub out: ColumnV, pub oix: ColumnV +} +impl MechFunction for SetVVB +where T: Clone + Debug + Into, + U: Clone + Debug + Into +{ + fn solve(&self) { + self.out.borrow_mut() + .iter_mut() + .zip(self.oix.borrow().iter()) + .zip(self.arg.borrow().iter()) + .for_each(|((out,oix),x)| if *oix == true { + *out = T::into(x.clone()) + }); + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + +// Set Vector : Vector {RealIndex} +#[derive(Debug)] +pub struct SetVVRIx { + pub arg: ColumnV, pub out: ColumnV, pub oix: ColumnV +} +impl MechFunction for SetVVRIx +where T: Clone + Debug + Into, + U: Clone + Debug + Into +{ + fn solve(&self) { + let arg_brrw = self.arg.borrow(); + self.out.borrow_mut() + .iter_mut() + .zip(self.oix.borrow().iter()) + .for_each(|(out,oix)| *out = T::into(arg_brrw[oix.unwrap() as usize].clone())); + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + +#[cfg(feature = "parallel")] +#[derive(Debug)] +pub struct ParSetVVB { + pub arg: ColumnV, pub out: ColumnV, pub oix: ColumnV +} +#[cfg(feature = "parallel")] +impl MechFunction for ParSetVVB +where T: Clone + Debug + Into + Sync + Send, + U: Clone + Debug + Into + Sync + Send +{ + fn solve(&self) { + self.out.borrow_mut() + .par_iter_mut() + .zip(self.oix.borrow().par_iter()) + .zip(self.arg.borrow().par_iter()) + .for_each(|((out,oix),x)| if *oix == true { + *out = T::into(x.clone()) + }); + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + + +// Set Vector : Vector +#[derive(Debug)] +pub struct SetVV { + pub arg: ColumnV, pub out: ColumnV +} +impl MechFunction for SetVV +where T: Clone + Debug + Into, + U: Clone + Debug +{ + fn solve(&self) { + self.out.borrow_mut() + .iter_mut() + .zip(self.arg.borrow().iter()) + .for_each(|(out, arg)| *out = T::into(arg.clone())); + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + + +// Set Vector : Vector +#[cfg(feature = "parallel")] +#[derive(Debug)] +pub struct ParSetVV { + pub arg: ColumnV, pub out: ColumnV +} +#[cfg(feature = "parallel")] +impl MechFunction for ParSetVV +where T: Clone + Debug + Into + Sync + Send, + U: Clone + Debug + Into + Sync + Send +{ + fn solve(&self) { + self.out.borrow_mut() + .par_iter_mut() + .zip(self.arg.borrow().par_iter()) + .for_each(|(out, arg)| *out = T::into(arg.clone())); + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + + +// Set Vector : Scalar +#[derive(Debug)] +pub struct SetVS { + pub arg: ColumnV, pub ix: usize, pub out: ColumnV +} +impl MechFunction for SetVS +where T: Clone + Debug + Into, + U: Clone + Debug + Into +{ + fn solve(&self) { + let arg = &self.arg.borrow()[self.ix]; + self.out.borrow_mut() + .iter_mut() + .zip(self.arg.borrow().iter()) + .for_each(|(out, arg)| *out = T::into(arg.clone())); + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + +#[cfg(feature = "parallel")] +#[derive(Debug)] +pub struct ParSetVS { + pub arg: ColumnV, pub ix: usize, pub out: ColumnV +} +#[cfg(feature = "parallel")] +impl MechFunction for ParSetVS +where T: Clone + Debug + Into + Sync + Send, + U: Clone + Debug + Into + Sync + Send +{ + fn solve(&self) { + let arg = &self.arg.borrow()[self.ix]; + self.out.borrow_mut() + .par_iter_mut() + .zip(self.arg.borrow().par_iter()) + .for_each(|(out, arg)| *out = T::into(arg.clone())); + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + +#[cfg(feature = "parallel")] +#[derive(Debug)] +pub struct ParSetVSB { + pub arg: ColumnV, pub ix: usize, pub out: ColumnV, pub oix: ColumnV +} +#[cfg(feature = "parallel")] +impl MechFunction for ParSetVSB +where T: Clone + Debug + Into + Sync + Send, + U: Clone + Debug + Into + Sync + Send +{ + fn solve(&self) { + let arg = &self.arg.borrow()[self.ix]; + self.out.borrow_mut() + .par_iter_mut() + .zip(self.oix.borrow().par_iter()) + .for_each(|(out, oix)| if *oix {*out = T::into(arg.clone())}); + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + +#[derive(Debug)] +pub struct SetVSB { + pub arg: ColumnV, pub ix: usize, pub out: ColumnV, pub oix: ColumnV +} + +impl MechFunction for SetVSB +where T: Clone + Debug + Into + Sync + Send, + U: Clone + Debug + Into + Sync + Send +{ + fn solve(&self) { + let arg = &self.arg.borrow()[self.ix]; + self.out.borrow_mut() + .iter_mut() + .zip(self.oix.borrow().iter()) + .for_each(|(out, oix)| if *oix {*out = T::into(arg.clone())}); + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + + +// Copy Table : Table +#[derive(Debug)] +pub struct CopyT { + pub arg: ArgTable, pub out: OutTable +} +impl MechFunction for CopyT { + fn solve(&self) { + let mut out_brrw = self.out.borrow_mut(); + let arg_brrw = self.arg.borrow(); + out_brrw.resize(arg_brrw.rows, arg_brrw.cols); + for (col, kind) in arg_brrw.col_kinds.iter().enumerate() { + out_brrw.set_col_kind(col, kind.clone()); + } + out_brrw.col_map = arg_brrw.col_map.clone(); + out_brrw.row_map = arg_brrw.row_map.clone(); + for col in 0..arg_brrw.cols { + for row in 0..arg_brrw.rows { + let value = match arg_brrw.get_raw(row,col).unwrap() { + Value::Reference(TableId::Local(table_id)) => { + Value::Reference(TableId::Global(table_id)) + } + value => value, + }; + out_brrw.set_raw(row,col,value); + } + } + } + fn to_string(&self) -> String { + let mut box_drawing = BoxPrinter::new(); + box_drawing.add_header("CopyT"); + box_drawing.add_header("arg"); + box_drawing.add_line(format!("{:#?}", &self.arg.borrow())); + box_drawing.add_header("out"); + box_drawing.add_line(format!("{:#?}", &self.out.borrow())); + box_drawing.print() + } +} + + +pub struct TableVerticalConcatenate{} +impl MechFunctionCompiler for TableVerticalConcatenate { + fn compile(&self, block: &mut Block, arguments: &Vec, out: &(TableId, TableIndex, TableIndex)) -> std::result::Result<(),MechError> { + // Get all of the tables + let mut arg_tables = vec![]; + let mut rows = 0; + let mut cols = 0; + for (_,table_id,_) in arguments { + let table = block.get_table(table_id)?; + arg_tables.push(table); + } + // Each table should have the same number of columns + let cols = arg_tables[0].borrow().cols; + let consistent_cols = arg_tables.iter().all(|arg| {arg.borrow().cols == cols}); + if consistent_cols == false { + return Err(MechError{msg: "".to_string(), id: 4886, kind: MechErrorKind::None}); + } + // Check to make sure column types are consistent + let col_kinds: Vec = arg_tables[0].borrow().col_kinds.clone(); + let consistent_col_kinds = arg_tables.iter().all(|arg| arg.borrow().col_kinds.iter().zip(&col_kinds).all(|(k1,k2)| *k1 == *k2)); + if consistent_cols == false { + return Err(MechError{msg: "".to_string(), id: 4887, kind: MechErrorKind::None}); + } + // Add up the rows + let rows = arg_tables.iter().fold(0, |acc, table| acc + table.borrow().rows); + // Resize out table to match dimensions + let (out_table_id, _, _) = out; + let out_table = block.get_table(out_table_id)?; + let mut out_brrw = out_table.borrow_mut(); + out_brrw.resize(rows,cols); + // Set out column kind and push a concat function + for (ix, kind) in (0..cols).zip(col_kinds.clone()) { + out_brrw.set_col_kind(ix, kind); + let out_col = out_brrw.get_column_unchecked(ix).clone(); + let mut arg_cols = vec![]; + for table in &arg_tables { + let table_brrw = table.borrow(); + let column = table_brrw.get_column(&TableIndex::Index(ix+1))?; + arg_cols.push(column.clone()); + } + match out_col { + Column::Length(out) | Column::Speed(out) | Column::Time(out) | + Column::F32(out) => { + let mut out_ix = 0; + for arg_col in arg_cols { + match arg_col { + Column::I128(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::I64(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::I32(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::I16(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::I8(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::U128(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::U64(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::U32(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::U16(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::U8(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::F32(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::F64(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + x => {return Err(MechError{msg: "".to_string(), id: 4888, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + Column::F64(out) => { + let mut out_ix = 0; + for arg_col in arg_cols { + match arg_col { + Column::I128(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::I64(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::I32(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::I16(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::I8(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::U128(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::U64(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::U32(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::U16(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::U8(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::F32(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::F64(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + x => {return Err(MechError{msg: "".to_string(), id: 4992, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + Column::U8(out) => { + let mut out_ix = 0; + for arg_col in arg_cols { + match arg_col { + Column::U8(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::F32(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::F64(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + x => {return Err(MechError{msg: "".to_string(), id: 4889, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + Column::U16(out) => { + let mut out_ix = 0; + for arg_col in arg_cols { + match arg_col { + Column::U16(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::U8(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::F32(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::F64(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + x => {return Err(MechError{msg: "".to_string(), id: 4989, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + Column::U32(out) => { + let mut out_ix = 0; + for arg_col in arg_cols { + match arg_col { + Column::U32(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::U16(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::U8(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::F32(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::F64(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + x => {return Err(MechError{msg: "".to_string(), id: 4999, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + Column::U64(out) => { + let mut out_ix = 0; + for arg_col in arg_cols { + match arg_col { + Column::U64(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::U32(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::U16(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::U8(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::F32(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::F64(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + x => {return Err(MechError{msg: "".to_string(), id: 4890, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + Column::U128(out) => { + let mut out_ix = 0; + for arg_col in arg_cols { + match arg_col { + Column::U128(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::U64(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::U32(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::U16(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::U8(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::F32(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::F64(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + x => {return Err(MechError{msg: "".to_string(), id: 4891, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + Column::I8(out) => { + let mut out_ix = 0; + for arg_col in arg_cols { + match arg_col { + Column::I8(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::F32(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::F64(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + x => {return Err(MechError{msg: "".to_string(), id: 4991, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + Column::I16(out) => { + let mut out_ix = 0; + for arg_col in arg_cols { + match arg_col { + Column::I8(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::I16(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::F32(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::F64(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + x => {return Err(MechError{msg: "".to_string(), id: 4992, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + Column::I32(out) => { + let mut out_ix = 0; + for arg_col in arg_cols { + match arg_col { + Column::I8(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::I16(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::I32(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::F32(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::F64(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + x => {return Err(MechError{msg: "".to_string(), id: 4993, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + Column::I64(out) => { + let mut out_ix = 0; + for arg_col in arg_cols { + match arg_col { + Column::I8(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::I16(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::I32(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::I64(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::F32(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::F64(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + x => {return Err(MechError{msg: "".to_string(), id: 4994, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + Column::I128(out) => { + let mut out_ix = 0; + for arg_col in arg_cols { + match arg_col { + Column::I8(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::I16(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::I32(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::I64(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::I128(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::F32(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + Column::F64(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + x => {return Err(MechError{msg: "".to_string(), id: 4995, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + Column::Bool(out) => { + let mut out_ix = 0; + for arg_col in arg_cols { + match arg_col { + Column::Bool(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + x => {return Err(MechError{msg: "".to_string(), id: 4892, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + Column::String(out) => { + let mut out_ix = 0; + for arg_col in arg_cols { + match arg_col { + Column::String(arg) => { + if arg.len() == 0 {continue;} + block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len(); + }, + x => {return Err(MechError{msg: "".to_string(), id: 4893, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + Column::Ref(out) => { + let mut out_ix = 0; + for arg_col in arg_cols { + match arg_col { + Column::Ref(arg) => {block.plan.push(CopyVV{arg:(arg.clone(),0,arg.len()-1), out: (out.clone(),out_ix,out_ix+arg.len()-1)});out_ix += arg.len();}, + x => {return Err(MechError{msg: "".to_string(), id: 4894, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + x => {return Err(MechError{msg: "".to_string(), id: 4895, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + Ok(()) + } +} + + +pub struct TableHorizontalConcatenate{} +impl MechFunctionCompiler for TableHorizontalConcatenate { + fn compile(&self, block: &mut Block, arguments: &Vec, out: &(TableId, TableIndex, TableIndex)) -> std::result::Result<(),MechError> { + // Get all of the tables + + let mut rows = 0; + let mut cols = 0; + let arg_shapes = block.get_arg_dims(&arguments)?; + + for shape in &arg_shapes { + match shape { + TableShape::Pending(table_id) => { + return Err(MechError{msg: "".to_string(), id: 4552, kind: MechErrorKind::PendingTable(table_id.clone())}); + } + _ => (), + } + } + + // Each table should have the same number of rows or be scalar + let arg_dims: Vec<(usize,usize)> = arg_shapes.iter().map(|shape| match shape { + TableShape::Scalar => (1,1), + TableShape::Column(rows) => (*rows,1), + TableShape::Row(cols) => (1,*cols), + TableShape::Matrix(rows,cols) => (*rows,*cols), + _ => (0,0), + }).collect(); + + let max_rows = arg_dims.iter().map(|(rows,_)| rows).max().unwrap(); + + let consistent_rows = arg_dims.iter().all(|(rows,_)| { + max_rows == rows || *rows == 1 + }); + + if consistent_rows == false { + return Err(MechError{msg: "".to_string(), id: 4532, kind: MechErrorKind::DimensionMismatch(arg_dims)}); + } + + // Add up the columns + let cols = arg_dims.iter().fold(0, |acc, (_,cols)| acc + cols); + let (out_table_id, _, _) = out; + let out_table = block.get_table(out_table_id)?.clone(); + let mut out_column_ix = 0; + for (argument, shape) in arguments.iter().zip(arg_shapes) { + let (_,table_id,indices) = argument; + match shape { + TableShape::Scalar => { + let (_, arg_col,arg_ix) = block.get_arg_column(&argument)?; + let mut out_col = { + let mut o = out_table.borrow_mut(); + o.resize(*max_rows,cols); + o.set_col_kind(out_column_ix, arg_col.kind()); + o.get_column_unchecked(out_column_ix) + }; + match out_col.len() { + // The input is scalar and the output is scalar + 1 => { + match (&arg_col, &arg_ix, &out_col) { + (Column::F32(arg), ColumnIndex::RealIndex(ix), Column::F32(out)) => { + block.plan.push(CopyVRV{arg: arg.clone(), ix: ix.clone(), out: out.clone()}); + }, + (Column::F32(arg), ColumnIndex::Index(ix), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::F64(arg), ColumnIndex::Index(ix), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U8(arg), ColumnIndex::Index(ix), Column::U8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U16(arg), ColumnIndex::Index(ix), Column::U16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U32(arg), ColumnIndex::Index(ix), Column::U32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U64(arg), ColumnIndex::Index(ix), Column::U64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U128(arg), ColumnIndex::Index(ix), Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I8(arg), ColumnIndex::Index(ix), Column::I8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I16(arg), ColumnIndex::Index(ix), Column::I16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I32(arg), ColumnIndex::Index(ix), Column::I32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I64(arg), ColumnIndex::Index(ix), Column::I64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I128(arg), ColumnIndex::Index(ix), Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::Speed(arg), ColumnIndex::Index(ix), Column::Speed(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::Time(arg), ColumnIndex::Index(ix), Column::Time(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::Length(arg), ColumnIndex::Index(ix), Column::Length(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::String(arg), ColumnIndex::Index(ix), Column::String(out)) => { + if indices.len() == 1 { + let (row_ix,col_ix) = &indices[0]; + match row_ix { + TableIndex::IxTable(ix_table_id) => { + let ix_table = block.get_table(&ix_table_id)?; + block.plan.push(CopySIxS{arg: (arg.clone(),ix_table.clone()), out: out.clone()}); + } + _ => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + } + } + } + (Column::String(arg), ColumnIndex::Bool(bix), Column::String(out)) => { + block.plan.push(CopyVBT{arg: arg.clone(), bix: bix.clone(), out: out.clone(), table: out_table.clone()}); + }, + (Column::Bool(arg), ColumnIndex::Index(ix), Column::Bool(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::Any(arg), ColumnIndex::Index(ix), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::Ref(arg), ColumnIndex::Index(ix), Column::Ref(out)) => block.plan.push(CopySSRef{arg: arg.clone(), ix: *ix, out: out.clone()}), + (Column::Empty, _, Column::Empty) => (), + x => {return Err(MechError{msg: "".to_string(), id: 4896, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + }; + out_column_ix += 1; + } + // The input is scalar but the output is a vector. Copy the scalar into each element of the vector. + _ => { + match (&arg_col, &arg_ix, &out_col) { + (Column::U8(arg), ColumnIndex::Index(ix), Column::U8(out)) => block.plan.push(CopySV{arg: arg.clone(), ix: *ix, out: out.clone()}), + (Column::U16(arg), ColumnIndex::Index(ix), Column::U16(out)) => block.plan.push(CopySV{arg: arg.clone(), ix: *ix, out: out.clone()}), + (Column::U32(arg), ColumnIndex::Index(ix), Column::U32(out)) => block.plan.push(CopySV{arg: arg.clone(), ix: *ix, out: out.clone()}), + (Column::U64(arg), ColumnIndex::Index(ix), Column::U64(out)) => block.plan.push(CopySV{arg: arg.clone(), ix: *ix, out: out.clone()}), + (Column::U128(arg), ColumnIndex::Index(ix), Column::U128(out)) => block.plan.push(CopySV{arg: arg.clone(), ix: *ix, out: out.clone()}), + (Column::I8(arg), ColumnIndex::Index(ix), Column::I8(out)) => block.plan.push(CopySV{arg: arg.clone(), ix: *ix, out: out.clone()}), + (Column::I16(arg), ColumnIndex::Index(ix), Column::I16(out)) => block.plan.push(CopySV{arg: arg.clone(), ix: *ix, out: out.clone()}), + (Column::I32(arg), ColumnIndex::Index(ix), Column::I32(out)) => block.plan.push(CopySV{arg: arg.clone(), ix: *ix, out: out.clone()}), + (Column::I64(arg), ColumnIndex::Index(ix), Column::I64(out)) => block.plan.push(CopySV{arg: arg.clone(), ix: *ix, out: out.clone()}), + (Column::I128(arg), ColumnIndex::Index(ix), Column::I128(out)) => block.plan.push(CopySV{arg: arg.clone(), ix: *ix, out: out.clone()}), + (Column::F32(arg), ColumnIndex::Index(ix), Column::F32(out)) => block.plan.push(CopySV{arg: arg.clone(), ix: *ix, out: out.clone()}), + (Column::F64(arg), ColumnIndex::Index(ix), Column::F64(out)) => block.plan.push(CopySV{arg: arg.clone(), ix: *ix, out: out.clone()}), + (Column::String(arg), ColumnIndex::Index(ix), Column::String(out)) => block.plan.push(CopySV{arg: arg.clone(), ix: *ix, out: out.clone()}), + (Column::Bool(arg), ColumnIndex::Index(ix), Column::Bool(out)) => block.plan.push(CopySV{arg: arg.clone(), ix: *ix, out: out.clone()}), + (Column::Ref(arg), ColumnIndex::Index(ix), Column::Ref(out)) => block.plan.push(CopySVRef{arg: arg.clone(), ix: *ix, out: out.clone()}), + (Column::Empty, _, Column::Empty) => (), + x => {return Err(MechError{msg: "".to_string(), id: 4897, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + }; + out_column_ix += 1; + } + } + } + TableShape::Column(rows) => { + match block.get_arg_column(&argument) { + // The usual case where we just have a regular column + Ok((_, arg_col,arg_ix)) => { + let mut out_col = { + let mut o = out_table.borrow_mut(); + o.resize(*max_rows,cols); + o.set_col_kind(out_column_ix, arg_col.kind()); + o.get_column_unchecked(out_column_ix) + }; + match (&arg_col, arg_ix, &out_col) { + (Column::Any(arg), ColumnIndex::All, Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::Any(arg), ColumnIndex::Bool(bix), Column::Any(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::Time(arg), ColumnIndex::All, Column::Time(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::Time(arg), ColumnIndex::Bool(bix), Column::Time(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::Speed(arg), ColumnIndex::All, Column::Speed(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::Speed(arg), ColumnIndex::Bool(bix), Column::Speed(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::Length(arg), ColumnIndex::All, Column::Length(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::Length(arg), ColumnIndex::Bool(bix), Column::Length(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::F32(arg), ColumnIndex::All, Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::F32(arg), ColumnIndex::Bool(bix), Column::F32(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::F64(arg), ColumnIndex::All, Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::F64(arg), ColumnIndex::Bool(bix), Column::F64(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::U8(arg), ColumnIndex::All, Column::U8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::U8(arg), ColumnIndex::Bool(bix), Column::U8(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::U16(arg), ColumnIndex::All, Column::U16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::U16(arg), ColumnIndex::Bool(bix), Column::U16(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::U32(arg), ColumnIndex::All, Column::U32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::U32(arg), ColumnIndex::Bool(bix), Column::U32(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::U64(arg), ColumnIndex::All, Column::U64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::U64(arg), ColumnIndex::Bool(bix), Column::U64(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::U128(arg), ColumnIndex::All, Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::I8(arg), ColumnIndex::All, Column::I8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::I8(arg), ColumnIndex::Bool(bix), Column::I8(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::I16(arg), ColumnIndex::All, Column::I16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::I16(arg), ColumnIndex::Bool(bix), Column::I16(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::I32(arg), ColumnIndex::All, Column::I32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::I32(arg), ColumnIndex::Bool(bix), Column::I32(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::I64(arg), ColumnIndex::All, Column::I64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::I64(arg), ColumnIndex::Bool(bix), Column::I64(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::I128(arg), ColumnIndex::All, Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::I128(arg), ColumnIndex::Bool(bix), Column::I128(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::I128(arg), ColumnIndex::Bool(bix), Column::I128(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::String(arg), ColumnIndex::All, Column::String(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::String(arg), ColumnIndex::Bool(bix), Column::String(out)) => { + block.plan.push(CopyVBT{arg: arg.clone(), bix: bix.clone(), out: out.clone(), table: out_table.clone()}); + }, + (Column::Bool(arg), ColumnIndex::All, Column::Bool(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::Bool(arg), ColumnIndex::Bool(bix), Column::Bool(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::Ref(arg), ColumnIndex::All, Column::Ref(out)) => block.plan.push(CopyVVRef{arg: arg.clone(), out: out.clone()}), + (Column::F32(arg), ColumnIndex::RealIndex(ix), Column::F32(out)) => { + let mut out_col = { + let mut o = out_table.borrow_mut(); + o.resize(ix.len(),1); + }; + block.plan.push(CopyVIV{arg: arg.clone(), ix: ix.clone(), out: out.clone()}) + }, + (Column::F64(arg), ColumnIndex::RealIndex(ix), Column::F64(out)) => { + let mut out_col = { + let mut o = out_table.borrow_mut(); + o.resize(ix.len(),1); + }; + block.plan.push(CopyVIV{arg: arg.clone(), ix: ix.clone(), out: out.clone()}) + }, + x => {return Err(MechError{msg: "".to_string(), id: 4898, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + }; + out_column_ix += 1; + } + x => {return Err(MechError{msg: "".to_string(), id: 4899, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + TableShape::Row(_) => { + for (_, arg_col,arg_ix) in block.get_whole_table_arg_cols(&argument)? { + let mut out_col = { + let mut o = out_table.borrow_mut(); + o.resize(*max_rows,cols); + o.set_col_kind(out_column_ix, arg_col.kind()); + o.get_column_unchecked(out_column_ix) + }; + match (&arg_col, &arg_ix, &out_col) { + (Column::U8(arg), ColumnIndex::Index(ix), Column::U8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U8(arg), ColumnIndex::Bool(bix), Column::U8(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::U8(arg), ColumnIndex::All, Column::U8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::U16(arg), ColumnIndex::Index(ix), Column::U16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U16(arg), ColumnIndex::Bool(bix), Column::U16(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::U16(arg), ColumnIndex::All, Column::U16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::U32(arg), ColumnIndex::Index(ix), Column::U32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U32(arg), ColumnIndex::Bool(bix), Column::U32(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::U32(arg), ColumnIndex::All, Column::U32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::U64(arg), ColumnIndex::Index(ix), Column::U64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U64(arg), ColumnIndex::Bool(bix), Column::U64(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::U64(arg), ColumnIndex::All, Column::U64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::U128(arg), ColumnIndex::Index(ix), Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U128(arg), ColumnIndex::Bool(bix), Column::U128(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::U128(arg), ColumnIndex::All, Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::I8(arg), ColumnIndex::Index(ix), Column::I8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I8(arg), ColumnIndex::Bool(bix), Column::I8(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::I8(arg), ColumnIndex::All, Column::I8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::I16(arg), ColumnIndex::Index(ix), Column::I16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I16(arg), ColumnIndex::Bool(bix), Column::I16(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::I16(arg), ColumnIndex::All, Column::I16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::I32(arg), ColumnIndex::Index(ix), Column::I32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I32(arg), ColumnIndex::Bool(bix), Column::I32(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::I32(arg), ColumnIndex::All, Column::I32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::I64(arg), ColumnIndex::Index(ix), Column::I64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I64(arg), ColumnIndex::Bool(bix), Column::I64(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::I64(arg), ColumnIndex::All, Column::I64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::I128(arg), ColumnIndex::Index(ix), Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I128(arg), ColumnIndex::Bool(bix), Column::I128(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::I128(arg), ColumnIndex::All, Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::F32(arg), ColumnIndex::Index(ix), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::F32(arg), ColumnIndex::Bool(bix), Column::F32(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::F32(arg), ColumnIndex::All, Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::F64(arg), ColumnIndex::Index(ix), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::F64(arg), ColumnIndex::Bool(bix), Column::F64(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::F64(arg), ColumnIndex::All, Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::String(arg), ColumnIndex::Index(ix), Column::String(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::String(arg), ColumnIndex::Bool(bix), Column::String(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::String(arg), ColumnIndex::All, Column::String(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::Bool(arg), ColumnIndex::Index(ix), Column::Bool(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::Bool(arg), ColumnIndex::Bool(bix), Column::Bool(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::Bool(arg), ColumnIndex::All, Column::Bool(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::Ref(arg), ColumnIndex::All, Column::Ref(out)) => block.plan.push(CopySSRef{arg: arg.clone(), ix: 0, out: out.clone()}), + (Column::Ref(arg), ColumnIndex::Index(ix), Column::Ref(out)) => block.plan.push(CopySSRef{arg: arg.clone(), ix: *ix, out: out.clone()}), + (Column::Empty, _, Column::Empty) => (), + x => {return Err(MechError{msg: "".to_string(), id: 4900, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + }; + out_column_ix += 1; + } + } + TableShape::Matrix(_,_) => { + for (_, arg_col,arg_ix) in block.get_whole_table_arg_cols(&argument)? { + let mut out_col = { + let mut o = out_table.borrow_mut(); + o.resize(*max_rows,cols); + o.set_col_kind(out_column_ix, arg_col.kind()); + o.get_column_unchecked(out_column_ix) + }; + match (&arg_col, &arg_ix, &out_col) { + (Column::U8(arg), ColumnIndex::Bool(bix), Column::U8(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::U8(arg), ColumnIndex::All, Column::U8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::U16(arg), ColumnIndex::Bool(bix), Column::U16(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::U16(arg), ColumnIndex::All, Column::U16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::U32(arg), ColumnIndex::Bool(bix), Column::U32(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::U32(arg), ColumnIndex::All, Column::U32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::U64(arg), ColumnIndex::Bool(bix), Column::U64(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::U64(arg), ColumnIndex::All, Column::U64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::U128(arg), ColumnIndex::Bool(bix), Column::U128(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::U128(arg), ColumnIndex::All, Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::I8(arg), ColumnIndex::Bool(bix), Column::I8(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::I8(arg), ColumnIndex::All, Column::I8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::I16(arg), ColumnIndex::Bool(bix), Column::I16(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::I16(arg), ColumnIndex::All, Column::I16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::I32(arg), ColumnIndex::Bool(bix), Column::I32(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::I32(arg), ColumnIndex::All, Column::I32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::I64(arg), ColumnIndex::Bool(bix), Column::I64(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::I64(arg), ColumnIndex::All, Column::I64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::I128(arg), ColumnIndex::Bool(bix), Column::I128(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::I128(arg), ColumnIndex::All, Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::F32(arg), ColumnIndex::Bool(bix), Column::F32(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::F32(arg), ColumnIndex::All, Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::F64(arg), ColumnIndex::Bool(bix), Column::F64(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::F64(arg), ColumnIndex::All, Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::String(arg), ColumnIndex::Bool(bix), Column::String(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::String(arg), ColumnIndex::All, Column::String(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::Bool(arg), ColumnIndex::Bool(bix), Column::Bool(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::Bool(arg), ColumnIndex::All, Column::Bool(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::Ref(arg), ColumnIndex::All, Column::Ref(out)) => block.plan.push(CopyVVRef{arg: arg.clone(), out: out.clone()}), + x => {return Err(MechError{msg: "".to_string(), id: 4901, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + }; + out_column_ix += 1; + } + } + TableShape::Dynamic(rows,cols) => { + match block.get_arg_column(&argument) { + Ok((_, arg_col,arg_ix)) => { + let mut out_col = { + let mut o = out_table.borrow_mut(); + o.resize(*max_rows,cols); + o.dynamic = true; + o.set_col_kind(out_column_ix, arg_col.kind()); + o.get_column_unchecked(out_column_ix) + }; + match (&arg_col, arg_ix, &out_col) { + (Column::U8(arg), ColumnIndex::Bool(bix), Column::U8(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::U8(arg), _, Column::U8(out)) => block.plan.push(CopyDD{arg: arg.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::U16(arg), ColumnIndex::Bool(bix), Column::U16(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::U16(arg), _, Column::U16(out)) => block.plan.push(CopyDD{arg: arg.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::U32(arg), ColumnIndex::Bool(bix), Column::U32(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::U32(arg), _, Column::U32(out)) => block.plan.push(CopyDD{arg: arg.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::U64(arg), ColumnIndex::Bool(bix), Column::U64(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::U64(arg), _, Column::U64(out)) => block.plan.push(CopyDD{arg: arg.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::U128(arg), ColumnIndex::Bool(bix), Column::U128(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::U128(arg), _, Column::U128(out)) => block.plan.push(CopyDD{arg: arg.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::I8(arg), ColumnIndex::Bool(bix), Column::I8(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::I8(arg), _, Column::I8(out)) => block.plan.push(CopyDD{arg: arg.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::I16(arg), ColumnIndex::Bool(bix), Column::I16(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::I16(arg), _, Column::I16(out)) => block.plan.push(CopyDD{arg: arg.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::I32(arg), ColumnIndex::Bool(bix), Column::I32(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::I32(arg), _, Column::I32(out)) => block.plan.push(CopyDD{arg: arg.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::I64(arg), ColumnIndex::Bool(bix), Column::I64(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::I64(arg), _, Column::I64(out)) => block.plan.push(CopyDD{arg: arg.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::I128(arg), ColumnIndex::Bool(bix), Column::I128(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::I128(arg), _, Column::I128(out)) => block.plan.push(CopyDD{arg: arg.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::F32(arg), ColumnIndex::Bool(bix), Column::F32(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::F32(arg), _, Column::F32(out)) => block.plan.push(CopyDD{arg: arg.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::F64(arg), ColumnIndex::Bool(bix), Column::F64(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::F64(arg), _, Column::F64(out)) => block.plan.push(CopyDD{arg: arg.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::String(arg), ColumnIndex::Index(ix), Column::String(out)) => { + if indices.len() == 1 { + let (row_ix,col_ix) = &indices[0]; + match row_ix { + TableIndex::IxTable(ix_table_id) => { + let ix_table = block.get_table(&ix_table_id)?; + { + let ix_table_brrw = ix_table.borrow(); + if ix_table_brrw.shape() == TableShape::Scalar && !ix_table_brrw.dynamic { + { + let mut o = out_table.borrow_mut(); + o.resize(1,cols); + o.dynamic = false; + o.set_col_kind(out_column_ix, arg_col.kind()); + }; + } else { + return Err(MechError{msg: "".to_string(), id: 4797, kind: MechErrorKind::None}); + } + } + block.plan.push(CopySIxS{arg: (arg.clone(),ix_table.clone()), out: out.clone()}); + } + _ => block.plan.push(CopyDD{arg: arg.clone(), out: out.clone(), out_table: out_table.clone()}), + } + } + } + (Column::String(arg), ColumnIndex::Bool(bix), Column::String(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::String(arg), _, Column::String(out)) => block.plan.push(CopyDD{arg: arg.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::Bool(arg), ColumnIndex::All, Column::Bool(out)) => block.plan.push(CopyDD{arg: arg.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::Bool(arg), _, Column::Bool(out)) => block.plan.push(CopyDD{arg: arg.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::Ref(arg), ColumnIndex::All, Column::Ref(out)) => block.plan.push(CopyDD{arg: arg.clone(), out: out.clone(), out_table: out_table.clone()}), + x => {return Err(MechError{msg: "".to_string(), id: 4997, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + }; + out_column_ix += 1; + } + x => {return Err(MechError{msg: "".to_string(), id: 4998, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + TableShape::Pending(table_id) => { return Err(MechError{msg: "".to_string(), id: 4903, kind: MechErrorKind::PendingTable(table_id)}); }, + x => {return Err(MechError{msg: "".to_string(), id: 4999, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + Ok(()) + } +} + + +pub struct TableSplit{} +impl MechFunctionCompiler for TableSplit { + fn compile(&self, block: &mut Block, arguments: &Vec, out: &(TableId, TableIndex, TableIndex)) -> std::result::Result<(),MechError> { + + let arg_shapes = block.get_arg_dims(&arguments)?; + let arg_cols = block.get_whole_table_arg_cols(&arguments[0])?; + + let (out_table_id, _, _) = out; + let out_table = block.get_table(out_table_id)?; + let mut out_brrw = out_table.borrow_mut(); + out_brrw.resize(1,1); + out_brrw.set_col_kind(0,ValueKind::Reference); + match arg_shapes[0] { + TableShape::Matrix(rows,cols) => { + out_brrw.resize(rows,1); + + // Initialize table + for row in 0..rows { + let split_id = hash_str(&format!("{:?}{:?}", out_table_id, row)); + + let mut dest_table = Table::new(split_id,1,cols); + for (col,arg_col) in arg_cols.iter().enumerate() { + + match arg_col { + (_,Column::F32(_),_) => { dest_table.set_col_kind(col,ValueKind::F32); } + (_,Column::U8(_),_) => { dest_table.set_col_kind(col,ValueKind::U8); } + (_,Column::U32(_),_) => { dest_table.set_col_kind(col,ValueKind::U32); } + (_,Column::U64(_),_) => { dest_table.set_col_kind(col,ValueKind::U64); } + (_,Column::U128(_),_) => { dest_table.set_col_kind(col,ValueKind::U128); } + (_,Column::I8(_),_) => { dest_table.set_col_kind(col,ValueKind::I8); } + (_,Column::I32(_),_) => { dest_table.set_col_kind(col,ValueKind::I32); } + (_,Column::I64(_),_) => { dest_table.set_col_kind(col,ValueKind::I64); } + (_,Column::I128(_),_) => { dest_table.set_col_kind(col,ValueKind::I128); } + (_,Column::String(_),_) => { dest_table.set_col_kind(col,ValueKind::String); } + (_,Column::Bool(_),_) => { dest_table.set_col_kind(col,ValueKind::Bool); } + x => {return Err(MechError{msg: "".to_string(), id: 4903, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + let mut db_brrw = block.global_database.borrow_mut(); + db_brrw.insert_table(dest_table); + out_brrw.set_raw(row,0,Value::Reference(TableId::Global(split_id))); + } + // Write functions + for (col_ix,arg_col) in arg_cols.iter().enumerate() { + match arg_col { + (_,Column::U8(src_col),ColumnIndex::All) => { + for row in 0..rows { + // get the destination table + let split_id = hash_str(&format!("{:?}{:?}", out_table_id, row)); + let dest_table = block.get_table(&TableId::Global(split_id))?; + let dest_col = dest_table.borrow().get_column(&TableIndex::Index(col_ix+1))?; + match dest_col { + Column::U8(dest_col) => { block.plan.push(SetSIxSIx{arg: src_col.clone(), ix: row, out: dest_col.clone(), oix: 0}); } + x => {return Err(MechError{msg: "".to_string(), id: 4933, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + (_,Column::U16(src_col),ColumnIndex::All) => { + for row in 0..rows { + // get the destination table + let split_id = hash_str(&format!("{:?}{:?}", out_table_id, row)); + let dest_table = block.get_table(&TableId::Global(split_id))?; + let dest_col = dest_table.borrow().get_column(&TableIndex::Index(col_ix+1))?; + match dest_col { + Column::U16(dest_col) => { block.plan.push(SetSIxSIx{arg: src_col.clone(), ix: row, out: dest_col.clone(), oix: 0}); } + x => {return Err(MechError{msg: "".to_string(), id: 4933, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + (_,Column::U32(src_col),ColumnIndex::All) => { + for row in 0..rows { + // get the destination table + let split_id = hash_str(&format!("{:?}{:?}", out_table_id, row)); + let dest_table = block.get_table(&TableId::Global(split_id))?; + let dest_col = dest_table.borrow().get_column(&TableIndex::Index(col_ix+1))?; + match dest_col { + Column::U32(dest_col) => { block.plan.push(SetSIxSIx{arg: src_col.clone(), ix: row, out: dest_col.clone(), oix: 0}); } + x => {return Err(MechError{msg: "".to_string(), id: 4933, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + (_,Column::U64(src_col),ColumnIndex::All) => { + for row in 0..rows { + // get the destination table + let split_id = hash_str(&format!("{:?}{:?}", out_table_id, row)); + let dest_table = block.get_table(&TableId::Global(split_id))?; + let dest_col = dest_table.borrow().get_column(&TableIndex::Index(col_ix+1))?; + match dest_col { + Column::U64(dest_col) => { block.plan.push(SetSIxSIx{arg: src_col.clone(), ix: row, out: dest_col.clone(), oix: 0}); } + x => {return Err(MechError{msg: "".to_string(), id: 4933, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + (_,Column::U128(src_col),ColumnIndex::All) => { + for row in 0..rows { + // get the destination table + let split_id = hash_str(&format!("{:?}{:?}", out_table_id, row)); + let dest_table = block.get_table(&TableId::Global(split_id))?; + let dest_col = dest_table.borrow().get_column(&TableIndex::Index(col_ix+1))?; + match dest_col { + Column::U128(dest_col) => { block.plan.push(SetSIxSIx{arg: src_col.clone(), ix: row, out: dest_col.clone(), oix: 0}); } + x => {return Err(MechError{msg: "".to_string(), id: 4933, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + (_,Column::I8(src_col),ColumnIndex::All) => { + for row in 0..rows { + // get the destination table + let split_id = hash_str(&format!("{:?}{:?}", out_table_id, row)); + let dest_table = block.get_table(&TableId::Global(split_id))?; + let dest_col = dest_table.borrow().get_column(&TableIndex::Index(col_ix+1))?; + match dest_col { + Column::I8(dest_col) => { block.plan.push(SetSIxSIx{arg: src_col.clone(), ix: row, out: dest_col.clone(), oix: 0}); } + x => {return Err(MechError{msg: "".to_string(), id: 4933, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + (_,Column::I16(src_col),ColumnIndex::All) => { + for row in 0..rows { + // get the destination table + let split_id = hash_str(&format!("{:?}{:?}", out_table_id, row)); + let dest_table = block.get_table(&TableId::Global(split_id))?; + let dest_col = dest_table.borrow().get_column(&TableIndex::Index(col_ix+1))?; + match dest_col { + Column::I16(dest_col) => { block.plan.push(SetSIxSIx{arg: src_col.clone(), ix: row, out: dest_col.clone(), oix: 0}); } + x => {return Err(MechError{msg: "".to_string(), id: 4933, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + (_,Column::I32(src_col),ColumnIndex::All) => { + for row in 0..rows { + // get the destination table + let split_id = hash_str(&format!("{:?}{:?}", out_table_id, row)); + let dest_table = block.get_table(&TableId::Global(split_id))?; + let dest_col = dest_table.borrow().get_column(&TableIndex::Index(col_ix+1))?; + match dest_col { + Column::I32(dest_col) => { block.plan.push(SetSIxSIx{arg: src_col.clone(), ix: row, out: dest_col.clone(), oix: 0}); } + x => {return Err(MechError{msg: "".to_string(), id: 4933, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + (_,Column::I64(src_col),ColumnIndex::All) => { + for row in 0..rows { + // get the destination table + let split_id = hash_str(&format!("{:?}{:?}", out_table_id, row)); + let dest_table = block.get_table(&TableId::Global(split_id))?; + let dest_col = dest_table.borrow().get_column(&TableIndex::Index(col_ix+1))?; + match dest_col { + Column::I64(dest_col) => { block.plan.push(SetSIxSIx{arg: src_col.clone(), ix: row, out: dest_col.clone(), oix: 0}); } + x => {return Err(MechError{msg: "".to_string(), id: 4933, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + (_,Column::I128(src_col),ColumnIndex::All) => { + for row in 0..rows { + // get the destination table + let split_id = hash_str(&format!("{:?}{:?}", out_table_id, row)); + let dest_table = block.get_table(&TableId::Global(split_id))?; + let dest_col = dest_table.borrow().get_column(&TableIndex::Index(col_ix+1))?; + match dest_col { + Column::I128(dest_col) => { block.plan.push(SetSIxSIx{arg: src_col.clone(), ix: row, out: dest_col.clone(), oix: 0}); } + x => {return Err(MechError{msg: "".to_string(), id: 4933, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + (_,Column::F32(src_col),ColumnIndex::All) => { + for row in 0..rows { + // get the destination table + let split_id = hash_str(&format!("{:?}{:?}", out_table_id, row)); + let dest_table = block.get_table(&TableId::Global(split_id))?; + let dest_col = dest_table.borrow().get_column(&TableIndex::Index(col_ix+1))?; + match dest_col { + Column::F32(dest_col) => { block.plan.push(SetSIxSIx{arg: src_col.clone(), ix: row, out: dest_col.clone(), oix: 0}); } + x => {return Err(MechError{msg: "".to_string(), id: 4933, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + (_,Column::F64(src_col),ColumnIndex::All) => { + for row in 0..rows { + // get the destination table + let split_id = hash_str(&format!("{:?}{:?}", out_table_id, row)); + let dest_table = block.get_table(&TableId::Global(split_id))?; + let dest_col = dest_table.borrow().get_column(&TableIndex::Index(col_ix+1))?; + match dest_col { + Column::F64(dest_col) => { block.plan.push(SetSIxSIx{arg: src_col.clone(), ix: row, out: dest_col.clone(), oix: 0}); } + x => {return Err(MechError{msg: "".to_string(), id: 4933, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + (_,Column::Speed(src_col),ColumnIndex::All) => { + for row in 0..rows { + // get the destination table + let split_id = hash_str(&format!("{:?}{:?}", out_table_id, row)); + let dest_table = block.get_table(&TableId::Global(split_id))?; + let dest_col = dest_table.borrow().get_column(&TableIndex::Index(col_ix+1))?; + match dest_col { + Column::Speed(dest_col) => { block.plan.push(SetSIxSIx{arg: src_col.clone(), ix: row, out: dest_col.clone(), oix: 0}); } + x => {return Err(MechError{msg: "".to_string(), id: 4934, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + (_,Column::Length(src_col),ColumnIndex::All) => { + for row in 0..rows { + // get the destination table + let split_id = hash_str(&format!("{:?}{:?}", out_table_id, row)); + let dest_table = block.get_table(&TableId::Global(split_id))?; + let dest_col = dest_table.borrow().get_column(&TableIndex::Index(col_ix+1))?; + match dest_col { + Column::Length(dest_col) => { block.plan.push(SetSIxSIx{arg: src_col.clone(), ix: row, out: dest_col.clone(), oix: 0}); } + x => {return Err(MechError{msg: "".to_string(), id: 4934, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + (_,Column::Time(src_col),ColumnIndex::All) => { + for row in 0..rows { + // get the destination table + let split_id = hash_str(&format!("{:?}{:?}", out_table_id, row)); + let dest_table = block.get_table(&TableId::Global(split_id))?; + let dest_col = dest_table.borrow().get_column(&TableIndex::Index(col_ix+1))?; + match dest_col { + Column::Time(dest_col) => { block.plan.push(SetSIxSIx{arg: src_col.clone(), ix: row, out: dest_col.clone(), oix: 0}); } + x => {return Err(MechError{msg: "".to_string(), id: 4934, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + (_,Column::String(src_col),ColumnIndex::All) => { + for row in 0..rows { + // get the destination table + let split_id = hash_str(&format!("{:?}{:?}", out_table_id, row)); + let dest_table = block.get_table(&TableId::Global(split_id))?; + let dest_col = dest_table.borrow().get_column(&TableIndex::Index(col_ix+1))?; + match dest_col { + Column::String(dest_col) => { block.plan.push(SetSIxSIx{arg: src_col.clone(), ix: row, out: dest_col.clone(), oix: 0}); } + x => {return Err(MechError{msg: "".to_string(), id: 4934, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + (_,Column::Bool(src_col),ColumnIndex::All) => { + for row in 0..rows { + // get the destination table + let split_id = hash_str(&format!("{:?}{:?}", out_table_id, row)); + let dest_table = block.get_table(&TableId::Global(split_id))?; + let dest_col = dest_table.borrow().get_column(&TableIndex::Index(col_ix+1))?; + match dest_col { + Column::Bool(dest_col) => { block.plan.push(SetSIxSIx{arg: src_col.clone(), ix: row, out: dest_col.clone(), oix: 0}); } + x => {return Err(MechError{msg: "".to_string(), id: 4935, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + x => {return Err(MechError{msg: "".to_string(), id: 4905, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + _ => (), + } + Ok(()) + } +} + +// Flattens a table of nested table, leverages vertcat +pub struct TableFlatten{} +impl MechFunctionCompiler for TableFlatten { + fn compile(&self, block: &mut Block, arguments: &Vec, out: &(TableId, TableIndex, TableIndex)) -> std::result::Result<(),MechError> { + + let arg_shapes = block.get_arg_dims(&arguments)?; + let arg_cols = block.get_whole_table_arg_cols(&arguments[0])?; + + match arg_shapes[0] { + TableShape::Column(rows) => { + let mut id_args = vec![]; + for (_,arg_col,_) in &arg_cols { + match arg_col { + Column::Ref(table_id_col) => { + let table_id_col_brrw = table_id_col.borrow(); + for i in 0..rows { + id_args.push((0,table_id_col_brrw[i].clone(),vec![(TableIndex::All, TableIndex::All)])); + } + } + x => {return Err(MechError{msg: "".to_string(), id: 4936, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + let vertcat = TableVerticalConcatenate{}; + vertcat.compile(block,&id_args,out); + } + x => {return Err(MechError{msg: "".to_string(), id: 4937, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + Ok(()) + } +} + +// A range of values from start to end +#[derive(Debug)] +pub struct Range { + pub start: ColumnV, pub end: ColumnV, pub out: OutTable +} + +impl MechFunction for Range +{ + fn solve(&self) { + let start_value = self.start.borrow()[0]; + let end_value = self.end.borrow()[0]; + let delta = end_value.unwrap() - start_value.unwrap() + 1.0; + let mut out_brrw = self.out.borrow_mut(); + out_brrw.resize(delta as usize,1); + out_brrw.set_col_kind(0,ValueKind::F32); + let mut value = start_value.unwrap(); + for row in 0..out_brrw.rows { + out_brrw.set_raw(row,0,Value::F32(F32::new(value))); + value += 1.0; + } + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + +pub struct TableRange{} +impl MechFunctionCompiler for TableRange { + + fn compile(&self, block: &mut Block, arguments: &Vec, out: &(TableId, TableIndex, TableIndex)) -> std::result::Result<(),MechError> { + + let mut argument_columns = block.get_arg_columns(arguments)?; + let (out_table_id, _, _) = out; + let out_table = block.get_table(out_table_id)?; + match (&argument_columns[0], &argument_columns[1]) { + ((_,Column::F32(start),_), (_,Column::F32(end),_)) => { + let fxn = Range{start: start.clone(), end: end.clone(), out: out_table.clone()}; + block.plan.push(fxn); + } + x => {return Err(MechError{msg: "".to_string(), id: 4906, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, } + Ok(()) + } +} + + +// AppendRow Table : Table +#[derive(Debug)] +pub struct AppendTable { + pub arg: ArgTable, pub out: OutTable +} + +impl MechFunction for AppendTable { + fn solve(&self) { + let mut out_brrw = self.out.borrow_mut(); + let arg_brrw = self.arg.borrow(); + if !arg_brrw.has_col_aliases() { + out_brrw.extend(&arg_brrw); + } else { + // map col to col + for (alias, ix) in arg_brrw.col_map.iter() { + // does the target table have this col? + let in_col = arg_brrw.get_column(&TableIndex::Alias(*alias)).unwrap(); + match out_brrw.get_column(&TableIndex::Alias(*alias)) { + Ok(out_col) => {out_col.extend(&in_col);}, + Err(_) => (), // no matching col in out table + } + } + let rows = out_brrw.rows + arg_brrw.rows; + let cols = out_brrw.cols; + out_brrw.resize(rows, cols); + } + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + + +pub struct TableAppend{} +impl MechFunctionCompiler for TableAppend { + + fn compile(&self, block: &mut Block, arguments: &Vec, out: &(TableId, TableIndex, TableIndex)) -> std::result::Result<(),MechError> { + let arg_shape = block.get_arg_dim(&arguments[0])?; + let (_,_,indices) = &arguments[0]; + let (arow_ix,_) = &indices[0]; + + let (_,src_table_id,src_indices) = &arguments[0]; + let (src_rows,src_cols) = &src_indices[0]; + let (out_table_id, _, _) = out; + + let src_table = block.get_table(&src_table_id)?; + let out_table = block.get_table(out_table_id)?; + + { + let mut out_table_brrw = out_table.borrow_mut(); + if !out_table_brrw.dynamic { + out_table_brrw.dynamic = true; + block.dynamic_tables.insert((out_table_id.clone(),RegisterIndex::All,RegisterIndex::All)); + } + } + + let dest_shape = {out_table.borrow().shape()}; + match (arg_shape,arow_ix,dest_shape) { + (TableShape::Scalar,TableIndex::All,TableShape::Pending(_)) | + (TableShape::Scalar,TableIndex::Index(_),TableShape::Column(_)) | + (TableShape::Scalar,TableIndex::All,TableShape::Scalar) => { + let arg_col = block.get_arg_column(&arguments[0])?; + let mut out_table_brrw = out_table.borrow_mut(); + let out_rows = out_table_brrw.rows; + let new_rows = out_rows + 1; + let ocols = out_table_brrw.cols; + let mut out_col = out_table_brrw.get_column_unchecked(0); + match (&arg_col, &out_col) { + ((_,Column::U8(arg), ColumnIndex::Index(ix)), Column::Any(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::U8(arg), ColumnIndex::Index(ix)), Column::U8(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::U8(arg), ColumnIndex::Index(ix)), Column::U16(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::U8(arg), ColumnIndex::Index(ix)), Column::U32(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::U8(arg), ColumnIndex::Index(ix)), Column::U64(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::U8(arg), ColumnIndex::Index(ix)), Column::U128(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::U8(arg), ColumnIndex::Index(ix)), Column::F32(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::U8(arg), ColumnIndex::Index(ix)), Column::F64(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::U16(arg), ColumnIndex::Index(ix)), Column::Any(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::U16(arg), ColumnIndex::Index(ix)), Column::U16(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::U16(arg), ColumnIndex::Index(ix)), Column::U32(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::U16(arg), ColumnIndex::Index(ix)), Column::U64(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::U16(arg), ColumnIndex::Index(ix)), Column::U128(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::U16(arg), ColumnIndex::Index(ix)), Column::F32(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::U16(arg), ColumnIndex::Index(ix)), Column::F64(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::U32(arg), ColumnIndex::Index(ix)), Column::Any(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::U32(arg), ColumnIndex::Index(ix)), Column::U32(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::U32(arg), ColumnIndex::Index(ix)), Column::U64(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::U32(arg), ColumnIndex::Index(ix)), Column::U128(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::U32(arg), ColumnIndex::Index(ix)), Column::F32(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::U32(arg), ColumnIndex::Index(ix)), Column::F64(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::U64(arg), ColumnIndex::Index(ix)), Column::Any(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::U64(arg), ColumnIndex::Index(ix)), Column::U64(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::U64(arg), ColumnIndex::Index(ix)), Column::U128(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::U64(arg), ColumnIndex::Index(ix)), Column::F32(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::U64(arg), ColumnIndex::Index(ix)), Column::F64(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::U128(arg), ColumnIndex::Index(ix)), Column::Any(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::U128(arg), ColumnIndex::Index(ix)), Column::U128(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::U128(arg), ColumnIndex::Index(ix)), Column::F32(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::U128(arg), ColumnIndex::Index(ix)), Column::F64(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::I8(arg), ColumnIndex::Index(ix)), Column::Any(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::I8(arg), ColumnIndex::Index(ix)), Column::I8(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::I8(arg), ColumnIndex::Index(ix)), Column::I16(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::I8(arg), ColumnIndex::Index(ix)), Column::I32(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::I8(arg), ColumnIndex::Index(ix)), Column::I64(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::I8(arg), ColumnIndex::Index(ix)), Column::I128(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::I8(arg), ColumnIndex::Index(ix)), Column::F32(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::I8(arg), ColumnIndex::Index(ix)), Column::F64(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::I16(arg), ColumnIndex::Index(ix)), Column::Any(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::I16(arg), ColumnIndex::Index(ix)), Column::I16(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::I16(arg), ColumnIndex::Index(ix)), Column::I32(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::I16(arg), ColumnIndex::Index(ix)), Column::I64(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::I16(arg), ColumnIndex::Index(ix)), Column::I128(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::I16(arg), ColumnIndex::Index(ix)), Column::F32(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::I16(arg), ColumnIndex::Index(ix)), Column::F64(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::I32(arg), ColumnIndex::Index(ix)), Column::Any(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::I32(arg), ColumnIndex::Index(ix)), Column::I32(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::I32(arg), ColumnIndex::Index(ix)), Column::I64(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::I32(arg), ColumnIndex::Index(ix)), Column::I128(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::I32(arg), ColumnIndex::Index(ix)), Column::F32(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::I32(arg), ColumnIndex::Index(ix)), Column::F64(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::I64(arg), ColumnIndex::Index(ix)), Column::Any(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::I64(arg), ColumnIndex::Index(ix)), Column::I64(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::I64(arg), ColumnIndex::Index(ix)), Column::I128(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::I64(arg), ColumnIndex::Index(ix)), Column::F32(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::I64(arg), ColumnIndex::Index(ix)), Column::F64(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::I128(arg), ColumnIndex::Index(ix)), Column::Any(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::I128(arg), ColumnIndex::Index(ix)), Column::I128(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::I128(arg), ColumnIndex::Index(ix)), Column::F32(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::I128(arg), ColumnIndex::Index(ix)), Column::F64(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::F64(arg), ColumnIndex::Index(ix)), Column::Any(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::F32(arg), ColumnIndex::Index(ix)), Column::Any(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::F32(arg), ColumnIndex::Index(ix)), Column::U8(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::F32(arg), ColumnIndex::Index(ix)), Column::U16(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::F32(arg), ColumnIndex::Index(ix)), Column::U32(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::F32(arg), ColumnIndex::Index(ix)), Column::U64(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::F32(arg), ColumnIndex::Index(ix)), Column::U128(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::F64(arg), ColumnIndex::Index(ix)), Column::Any(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::F32(arg), ColumnIndex::Index(ix)), Column::Any(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::F32(arg), ColumnIndex::Index(ix)), Column::I8(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::F32(arg), ColumnIndex::Index(ix)), Column::I16(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::F32(arg), ColumnIndex::Index(ix)), Column::I32(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::F32(arg), ColumnIndex::Index(ix)), Column::I64(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::F32(arg), ColumnIndex::Index(ix)), Column::I128(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::F32(arg), ColumnIndex::Index(ix)), Column::F32(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::F32(arg), ColumnIndex::Index(ix)), Column::F64(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::F64(arg), ColumnIndex::Index(ix)), Column::Any(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::F64(arg), ColumnIndex::Index(ix)), Column::U8(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::F64(arg), ColumnIndex::Index(ix)), Column::U16(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::F64(arg), ColumnIndex::Index(ix)), Column::U32(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::F64(arg), ColumnIndex::Index(ix)), Column::U64(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::F64(arg), ColumnIndex::Index(ix)), Column::U128(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::F64(arg), ColumnIndex::Index(ix)), Column::I8(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::F64(arg), ColumnIndex::Index(ix)), Column::I16(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::F64(arg), ColumnIndex::Index(ix)), Column::I32(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::F64(arg), ColumnIndex::Index(ix)), Column::I64(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::F64(arg), ColumnIndex::Index(ix)), Column::I128(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::F64(arg), ColumnIndex::Index(ix)), Column::F32(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::F64(arg), ColumnIndex::Index(ix)), Column::F64(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::Time(arg), ColumnIndex::Index(ix)), Column::Time(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::Length(arg), ColumnIndex::Index(ix)), Column::Length(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::Speed(arg), ColumnIndex::Index(ix)), Column::Speed(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::String(arg), ColumnIndex::Index(ix)), Column::String(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::Bool(arg), ColumnIndex::Index(ix)), Column::Bool(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + ((_,Column::Ref(arg), ColumnIndex::Index(ix)), Column::Ref(out)) => { out_table_brrw.resize(new_rows,ocols); block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),out_rows,out_rows)}) }, + x => {return Err(MechError{msg: "".to_string(), id: 4907, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + (TableShape::Scalar,TableIndex::All,TableShape::Column(rows)) => { + let arg_col = block.get_arg_column(&arguments[0])?; + let new_rows = rows + 1; + let mut out_table_brrw = out_table.borrow_mut(); + out_table_brrw.resize(new_rows,1); + let mut out_col = out_table_brrw.get_column_unchecked(0); + match (&arg_col, &out_col) { + ((_,Column::U8(arg), ColumnIndex::Index(ix)), Column::U8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::U8(arg), ColumnIndex::Index(ix)), Column::U16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::U8(arg), ColumnIndex::Index(ix)), Column::U32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::U8(arg), ColumnIndex::Index(ix)), Column::U64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::U8(arg), ColumnIndex::Index(ix)), Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::U8(arg), ColumnIndex::Index(ix)), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::U8(arg), ColumnIndex::Index(ix)), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::U16(arg), ColumnIndex::Index(ix)), Column::U16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::U16(arg), ColumnIndex::Index(ix)), Column::U32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::U16(arg), ColumnIndex::Index(ix)), Column::U64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::U16(arg), ColumnIndex::Index(ix)), Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::U16(arg), ColumnIndex::Index(ix)), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::U16(arg), ColumnIndex::Index(ix)), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::U32(arg), ColumnIndex::Index(ix)), Column::U32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::U32(arg), ColumnIndex::Index(ix)), Column::U64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::U32(arg), ColumnIndex::Index(ix)), Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::U32(arg), ColumnIndex::Index(ix)), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::U32(arg), ColumnIndex::Index(ix)), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::U64(arg), ColumnIndex::Index(ix)), Column::U64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::U64(arg), ColumnIndex::Index(ix)), Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::U64(arg), ColumnIndex::Index(ix)), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::U64(arg), ColumnIndex::Index(ix)), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::U128(arg), ColumnIndex::Index(ix)), Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::U128(arg), ColumnIndex::Index(ix)), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::U128(arg), ColumnIndex::Index(ix)), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::I8(arg), ColumnIndex::Index(ix)), Column::I8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::I8(arg), ColumnIndex::Index(ix)), Column::I16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::I8(arg), ColumnIndex::Index(ix)), Column::I32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::I8(arg), ColumnIndex::Index(ix)), Column::I64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::I8(arg), ColumnIndex::Index(ix)), Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::I8(arg), ColumnIndex::Index(ix)), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::I8(arg), ColumnIndex::Index(ix)), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::I16(arg), ColumnIndex::Index(ix)), Column::I16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::I16(arg), ColumnIndex::Index(ix)), Column::I32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::I16(arg), ColumnIndex::Index(ix)), Column::I64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::I16(arg), ColumnIndex::Index(ix)), Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::I16(arg), ColumnIndex::Index(ix)), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::I16(arg), ColumnIndex::Index(ix)), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::I32(arg), ColumnIndex::Index(ix)), Column::I32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::I32(arg), ColumnIndex::Index(ix)), Column::I64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::I32(arg), ColumnIndex::Index(ix)), Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::I32(arg), ColumnIndex::Index(ix)), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::I32(arg), ColumnIndex::Index(ix)), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::I64(arg), ColumnIndex::Index(ix)), Column::I64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::I64(arg), ColumnIndex::Index(ix)), Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::I64(arg), ColumnIndex::Index(ix)), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::I64(arg), ColumnIndex::Index(ix)), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::I128(arg), ColumnIndex::Index(ix)), Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::I128(arg), ColumnIndex::Index(ix)), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::I128(arg), ColumnIndex::Index(ix)), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::F32(arg), ColumnIndex::Index(ix)), Column::U8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::F32(arg), ColumnIndex::Index(ix)), Column::U16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::F32(arg), ColumnIndex::Index(ix)), Column::U32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::F32(arg), ColumnIndex::Index(ix)), Column::U64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::F32(arg), ColumnIndex::Index(ix)), Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::F32(arg), ColumnIndex::Index(ix)), Column::I8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::F32(arg), ColumnIndex::Index(ix)), Column::I16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::F32(arg), ColumnIndex::Index(ix)), Column::I32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::F32(arg), ColumnIndex::Index(ix)), Column::I64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::F32(arg), ColumnIndex::Index(ix)), Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::F32(arg), ColumnIndex::Index(ix)), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::F32(arg), ColumnIndex::Index(ix)), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::F64(arg), ColumnIndex::Index(ix)), Column::U8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::F64(arg), ColumnIndex::Index(ix)), Column::U16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::F64(arg), ColumnIndex::Index(ix)), Column::U32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::F64(arg), ColumnIndex::Index(ix)), Column::U64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::F64(arg), ColumnIndex::Index(ix)), Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::F64(arg), ColumnIndex::Index(ix)), Column::I8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::F64(arg), ColumnIndex::Index(ix)), Column::I16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::F64(arg), ColumnIndex::Index(ix)), Column::I32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::F64(arg), ColumnIndex::Index(ix)), Column::I64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::F64(arg), ColumnIndex::Index(ix)), Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::F64(arg), ColumnIndex::Index(ix)), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::F64(arg), ColumnIndex::Index(ix)), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::Time(arg), ColumnIndex::Index(ix)), Column::Time(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::Speed(arg), ColumnIndex::Index(ix)), Column::Speed(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::Length(arg), ColumnIndex::Index(ix)), Column::Length(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::String(arg), ColumnIndex::Index(ix)), Column::String(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + ((_,Column::Bool(arg), ColumnIndex::Index(ix)), Column::Bool(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),rows,rows)}), + x => {return Err(MechError{msg: "".to_string(), id: 4908, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + (TableShape::Column(src_rows),TableIndex::All,TableShape::Column(dest_rows)) => { + let arg_col = block.get_arg_column(&arguments[0])?; + let new_rows = src_rows + dest_rows; + let mut out_table_brrw = out_table.borrow_mut(); + out_table_brrw.resize(new_rows,1); + let mut out_col = out_table_brrw.get_column_unchecked(0); + match (&arg_col, &out_col) { + ((_,Column::U8(arg), ColumnIndex::All), Column::U8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::U8(arg), ColumnIndex::All), Column::U16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::U8(arg), ColumnIndex::All), Column::U32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::U8(arg), ColumnIndex::All), Column::U64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::U8(arg), ColumnIndex::All), Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::U8(arg), ColumnIndex::All), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::U8(arg), ColumnIndex::All), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::U16(arg), ColumnIndex::All), Column::U16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::U16(arg), ColumnIndex::All), Column::U32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::U16(arg), ColumnIndex::All), Column::U64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::U16(arg), ColumnIndex::All), Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::U16(arg), ColumnIndex::All), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::U16(arg), ColumnIndex::All), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::U32(arg), ColumnIndex::All), Column::U32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::U32(arg), ColumnIndex::All), Column::U64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::U32(arg), ColumnIndex::All), Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::U32(arg), ColumnIndex::All), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::U32(arg), ColumnIndex::All), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::U64(arg), ColumnIndex::All), Column::U64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::U64(arg), ColumnIndex::All), Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::U64(arg), ColumnIndex::All), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::U64(arg), ColumnIndex::All), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::U128(arg), ColumnIndex::All), Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::U128(arg), ColumnIndex::All), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::U128(arg), ColumnIndex::All), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::I8(arg), ColumnIndex::All), Column::I8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::I8(arg), ColumnIndex::All), Column::I16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::I8(arg), ColumnIndex::All), Column::I32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::I8(arg), ColumnIndex::All), Column::I64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::I8(arg), ColumnIndex::All), Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::I8(arg), ColumnIndex::All), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::I8(arg), ColumnIndex::All), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::I16(arg), ColumnIndex::All), Column::I16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::I16(arg), ColumnIndex::All), Column::I32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::I16(arg), ColumnIndex::All), Column::I64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::I16(arg), ColumnIndex::All), Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::I16(arg), ColumnIndex::All), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::I16(arg), ColumnIndex::All), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::I32(arg), ColumnIndex::All), Column::I32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::I32(arg), ColumnIndex::All), Column::I64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::I32(arg), ColumnIndex::All), Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::I32(arg), ColumnIndex::All), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::I32(arg), ColumnIndex::All), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::I64(arg), ColumnIndex::All), Column::I64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::I64(arg), ColumnIndex::All), Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::I64(arg), ColumnIndex::All), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::I64(arg), ColumnIndex::All), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::I128(arg), ColumnIndex::All), Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::I128(arg), ColumnIndex::All), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::I128(arg), ColumnIndex::All), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::F32(arg), ColumnIndex::All), Column::U8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::F32(arg), ColumnIndex::All), Column::U16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::F32(arg), ColumnIndex::All), Column::U32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::F32(arg), ColumnIndex::All), Column::U64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::F32(arg), ColumnIndex::All), Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::F32(arg), ColumnIndex::All), Column::I8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::F32(arg), ColumnIndex::All), Column::I16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::F32(arg), ColumnIndex::All), Column::I32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::F32(arg), ColumnIndex::All), Column::I64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::F32(arg), ColumnIndex::All), Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::F32(arg), ColumnIndex::All), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::F32(arg), ColumnIndex::All), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::F64(arg), ColumnIndex::All), Column::U8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::F64(arg), ColumnIndex::All), Column::U16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::F64(arg), ColumnIndex::All), Column::U32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::F64(arg), ColumnIndex::All), Column::U64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::F64(arg), ColumnIndex::All), Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::F64(arg), ColumnIndex::All), Column::I8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::F64(arg), ColumnIndex::All), Column::I16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::F64(arg), ColumnIndex::All), Column::I32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::F64(arg), ColumnIndex::All), Column::I64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::F64(arg), ColumnIndex::All), Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::F64(arg), ColumnIndex::All), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::F64(arg), ColumnIndex::All), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::Length(arg), ColumnIndex::All), Column::Length(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::Time(arg), ColumnIndex::All), Column::Time(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::Speed(arg), ColumnIndex::All), Column::Speed(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::String(arg), ColumnIndex::All), Column::String(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + ((_,Column::Bool(arg), ColumnIndex::All), Column::Bool(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,src_rows-1), out: (out.clone(),dest_rows,new_rows-1)}), + x => {return Err(MechError{msg: "".to_string(), id: 4909, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + (TableShape::Row(cols), TableIndex::All, TableShape::Pending(_)) => { + block.plan.push(AppendTable{arg: src_table.clone(), out: out_table.clone()}); + return Ok(()); + } + (TableShape::Row(cols), TableIndex::All, TableShape::Row(cols2)) => { + block.plan.push(AppendTable{arg: src_table.clone(), out: out_table.clone()}); + return Ok(()); + } + x => { + let arg_col2 = block.get_arg_column(&arguments[0])?; + match arg_col2 { + /*(_,Column::F32(_),ColumnIndex::All) => { + return Err(MechError{msg: "".to_string(), id: 4910, kind: MechErrorKind::Unhandled}); + }*/ + (_,Column::String(_),ColumnIndex::Index(_)) | + (_,Column::String(_),ColumnIndex::All) | + (_,Column::Bool(_),ColumnIndex::All) | + (_,Column::Bool(_),ColumnIndex::Index(_)) | + (_,Column::Time(_),ColumnIndex::Index(_)) | + (_,Column::F32(_),ColumnIndex::Index(_)) | + (_,Column::F32(_),ColumnIndex::All) | + (_,Column::Reference((_,(ColumnIndex::All,ColumnIndex::All))),ColumnIndex::All) => { + let (_,arg_table_id,_) = &arguments[0]; + let arg_table = block.get_table(arg_table_id)?; + let arg_brrw = arg_table.borrow(); + let mut out_table_brrw = out_table.borrow_mut(); + let orows = out_table_brrw.rows; + let ocols = if out_table_brrw.cols == 0 {1} else {out_table_brrw.cols}; + let arows = arg_brrw.rows; + let new_rows = orows + arows; + out_table_brrw.resize(orows + arows, ocols); + if arg_brrw.has_col_aliases() { + for (alias,src_col_ix) in arg_brrw.col_map.iter() { + let dest_col_ix = match out_table_brrw.col_map.get_index(&alias) { + Ok(col_ix) => col_ix, + _ => 0, + }; + let arg_col = arg_brrw.get_column_unchecked(*src_col_ix); + let out_col = out_table_brrw.get_column_unchecked(dest_col_ix); + match (&arg_col, &out_col) { + (Column::U8(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U8(arg), Column::U8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U8(arg), Column::U16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U8(arg), Column::U32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U8(arg), Column::U64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U8(arg), Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U8(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U8(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U16(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U16(arg), Column::U16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U16(arg), Column::U32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U16(arg), Column::U64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U16(arg), Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U16(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U16(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U32(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U32(arg), Column::U32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U32(arg), Column::U64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U32(arg), Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U32(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U32(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U64(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U64(arg), Column::U64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U64(arg), Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U64(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U64(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U128(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U128(arg), Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U128(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U128(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I8(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I8(arg), Column::I8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I8(arg), Column::I16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I8(arg), Column::I32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I8(arg), Column::I64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I8(arg), Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I8(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I8(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I16(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I16(arg), Column::I16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I16(arg), Column::I32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I16(arg), Column::I64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I16(arg), Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I16(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I16(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I32(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I32(arg), Column::I32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I32(arg), Column::I64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I32(arg), Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I32(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I32(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I64(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I64(arg), Column::I64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I64(arg), Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I64(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I64(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I128(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I128(arg), Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I128(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I128(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F32(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F32(arg), Column::U8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F32(arg), Column::U16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F32(arg), Column::U32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F32(arg), Column::U64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F32(arg), Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F32(arg), Column::I8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F32(arg), Column::I16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F32(arg), Column::I32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F32(arg), Column::I64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F32(arg), Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F32(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F32(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F64(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F64(arg), Column::U8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F64(arg), Column::U16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F64(arg), Column::U32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F64(arg), Column::U64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F64(arg), Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F64(arg), Column::I8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F64(arg), Column::I16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F64(arg), Column::I32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F64(arg), Column::I64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F64(arg), Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F64(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F64(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F64(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::Time(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::Time(arg), Column::Time(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::Length(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::Length(arg), Column::Length(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::Speed(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::Speed(arg), Column::Speed(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::String(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::String(arg), Column::String(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::Bool(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::Bool(arg), Column::Bool(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + x => {return Err(MechError{msg: "".to_string(), id: 4911, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } else { + for i in 0..arg_brrw.cols { + let arg_col = arg_brrw.get_column_unchecked(i); + let out_col = out_table_brrw.get_column_unchecked(i); + match (&arg_col, &out_col) { + (Column::U8(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U8(arg), Column::U8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U8(arg), Column::U16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U8(arg), Column::U32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U8(arg), Column::U64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U8(arg), Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U8(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U8(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U16(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U16(arg), Column::U16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U16(arg), Column::U32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U16(arg), Column::U64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U16(arg), Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U16(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U16(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U32(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U32(arg), Column::U32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U32(arg), Column::U64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U32(arg), Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U32(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U32(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U64(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U64(arg), Column::U64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U64(arg), Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U64(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U64(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U128(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U128(arg), Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U128(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::U128(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I8(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I8(arg), Column::I8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I8(arg), Column::I16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I8(arg), Column::I32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I8(arg), Column::I64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I8(arg), Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I8(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I8(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I16(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I16(arg), Column::I16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I16(arg), Column::I32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I16(arg), Column::I64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I16(arg), Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I16(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I16(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I32(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I32(arg), Column::I32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I32(arg), Column::I64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I32(arg), Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I32(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I32(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I64(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I64(arg), Column::I64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I64(arg), Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I64(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I64(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I128(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I128(arg), Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I128(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::I128(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F32(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F32(arg), Column::U8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F32(arg), Column::U16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F32(arg), Column::U32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F32(arg), Column::U64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F32(arg), Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F32(arg), Column::I8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F32(arg), Column::I16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F32(arg), Column::I32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F32(arg), Column::I64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F32(arg), Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F32(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F32(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F64(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F64(arg), Column::U8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F64(arg), Column::U16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F64(arg), Column::U32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F64(arg), Column::U64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F64(arg), Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F64(arg), Column::I8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F64(arg), Column::I16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F64(arg), Column::I32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F64(arg), Column::I64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F64(arg), Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F64(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F64(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::F64(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::Time(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::Time(arg), Column::Time(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::Length(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::Length(arg), Column::Length(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::Speed(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::Speed(arg), Column::Speed(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::String(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::String(arg), Column::String(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::Bool(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::Bool(arg), Column::Bool(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + (Column::Ref(arg), Column::Ref(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arows-1), out: (out.clone(),orows,new_rows-1)}), + x => {return Err(MechError{msg: "".to_string(), id: 4912, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + } + (_,Column::Reference((arg_table,(ColumnIndex::RealIndex(ix_col),ColumnIndex::None))),ColumnIndex::All) => { + block.plan.push(CopyTIV{arg: arg_table.clone(), ix: ix_col.clone(), out: out_table.clone()}); + } + x => {return Err(MechError{msg: "".to_string(), id: 4913, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + x => {return Err(MechError{msg: "".to_string(), id: 4914, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + Ok(()) + } +} + + +#[derive(Debug)] +pub struct Size { + pub arg: ArgTable, pub out: OutTable +} + +impl MechFunction for Size +{ + fn solve(&self) { + let arg_brrw = self.arg.borrow(); + let rows = arg_brrw.rows; + let cols = arg_brrw.cols; + let mut out_brrw = self.out.borrow_mut(); + out_brrw.set_raw(0,0,Value::U64(U64::new(rows as u64))); + out_brrw.set_raw(0,1,Value::U64(U64::new(cols as u64))); + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + + +pub struct TableSize{} +impl MechFunctionCompiler for TableSize { + fn compile(&self, block: &mut Block, arguments: &Vec, out: &(TableId, TableIndex, TableIndex)) -> std::result::Result<(),MechError> { + let (arg_name,arg_table_id,_) = arguments[0]; + if arg_name == *TABLE { + let (out_table_id, _, _) = out; + let arg_table = block.get_table(&arg_table_id)?; + let arg_table_brrw = arg_table.borrow(); + let out_table = block.get_table(out_table_id)?; + { + let mut out_brrw = out_table.borrow_mut(); + out_brrw.resize(1,2); + out_brrw.set_kind(ValueKind::U64); + } + block.plan.push(Size{arg: arg_table.clone(), out: out_table.clone()}); + } else { + return Err(MechError{msg: "".to_string(), id: 4915, kind: MechErrorKind::GenericError(format!("Unknown function argument {:?}", arg_name))}); + } + Ok(()) + } +} + + +pub struct TableSet{} +impl MechFunctionCompiler for TableSet { + fn compile(&self, block: &mut Block, arguments: &Vec, out: &(TableId, TableIndex, TableIndex)) -> std::result::Result<(),MechError> { + + let (_,src_id,src_indices) = &arguments[0]; + let (dest_id,dest_row,dest_col) = out; + let arg_shapes = block.get_arg_dims(&arguments)?; + let dest_shape = block.get_arg_dim(&(0,*dest_id,vec![(dest_row.clone(),dest_col.clone())]))?; + let src_table = block.get_table(src_id)?; + let dest_table = block.get_table(dest_id)?; + let mut arguments = arguments.clone(); + // The destination is pushed into the arguments here in order to use the + // get_argument_column() machinery later. + arguments.push((0,*dest_id,vec![(dest_row.clone(),dest_col.clone())])); + match (&arg_shapes[0], &dest_shape) { + (TableShape::Scalar, TableShape::Row(_)) | + (TableShape::Row(_), TableShape::Row(_)) => { + let src_table_brrw = src_table.borrow(); + let mut dest_table_brrw = dest_table.borrow_mut(); + // The source table has named columns, so we need to match them + // up with the destination columns if they are out of order or + // incomplete. + if src_table_brrw.has_col_aliases() { + for alias in src_table_brrw.col_map.aliases() { + let dest_column = dest_table_brrw.get_column(&TableIndex::Alias(*alias))?; + let src_column = src_table_brrw.get_column(&TableIndex::Alias(*alias))?; + match (src_column,dest_column) { + (Column::U8(src),Column::Any(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U8(src),Column::U8(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U8(src),Column::U16(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U8(src),Column::U32(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U8(src),Column::U64(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U8(src),Column::U128(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U8(src),Column::F32(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U8(src),Column::F64(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U16(src),Column::Any(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U16(src),Column::U16(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U16(src),Column::U32(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U16(src),Column::U64(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U16(src),Column::U128(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U16(src),Column::F32(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U16(src),Column::F64(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U32(src),Column::Any(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U32(src),Column::U32(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U32(src),Column::U64(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U32(src),Column::U128(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U32(src),Column::F32(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U32(src),Column::F64(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U64(src),Column::Any(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U64(src),Column::U64(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U64(src),Column::U128(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U64(src),Column::F32(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U64(src),Column::F64(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U128(src),Column::Any(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U128(src),Column::U128(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U128(src),Column::F32(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U128(src),Column::F64(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F32(src),Column::Any(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F32(src),Column::U8(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F32(src),Column::U16(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F32(src),Column::U32(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F32(src),Column::U64(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F32(src),Column::U128(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F32(src),Column::I8(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F32(src),Column::I16(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F32(src),Column::I32(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F32(src),Column::I64(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F32(src),Column::I128(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F32(src),Column::F32(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F32(src),Column::F64(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F64(src),Column::Any(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F64(src),Column::U8(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F64(src),Column::U16(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F64(src),Column::U32(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F64(src),Column::U64(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F64(src),Column::U128(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F64(src),Column::I8(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F64(src),Column::I16(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F64(src),Column::I32(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F64(src),Column::I64(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F64(src),Column::I128(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F64(src),Column::F32(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F64(src),Column::F64(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::Time(src),Column::Any(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::Time(src),Column::Time(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::Length(src),Column::Any(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::Length(src),Column::Length(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::Speed(src),Column::Any(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::Speed(src),Column::Speed(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::String(src),Column::Any(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::String(src),Column::String(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::Bool(src),Column::Any(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::Bool(src),Column::Bool(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::Ref(src),Column::Any(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::Ref(src),Column::Ref(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + x => {return Err(MechError{msg: "".to_string(), id: 4916, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + // No column aliases, use indices instead + } else { + if src_table_brrw.cols > dest_table_brrw.cols { + return Err(MechError{msg: "".to_string(), id: 4917, kind: MechErrorKind::GenericError("src table too big".to_string())}); + } + // Destination has aliases, need to use them instead + if dest_table_brrw.has_col_aliases() { + return Err(MechError{msg: "".to_string(), id: 4918, kind: MechErrorKind::GenericError("Destination has aliases, need to use them instead".to_string())}); + } + for col_ix in 1..=src_table_brrw.cols { + let src_column = src_table_brrw.get_column(&TableIndex::Index(col_ix))?; + dest_table_brrw.set_col_kind(col_ix-1,src_column.kind()); + let dest_column = dest_table_brrw.get_column(&TableIndex::Index(col_ix))?; + match (src_column,dest_column) { + (Column::U8(src),Column::Any(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U8(src),Column::U8(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U8(src),Column::U16(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U8(src),Column::U32(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U8(src),Column::U64(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U8(src),Column::U128(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U8(src),Column::F32(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U8(src),Column::F64(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U16(src),Column::Any(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U16(src),Column::U16(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U16(src),Column::U32(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U16(src),Column::U64(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U16(src),Column::U128(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U16(src),Column::F32(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U16(src),Column::F64(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U32(src),Column::Any(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U32(src),Column::U32(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U32(src),Column::U64(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U32(src),Column::U128(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U32(src),Column::F32(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U32(src),Column::F64(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U64(src),Column::Any(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U64(src),Column::U64(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U64(src),Column::U128(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U64(src),Column::F32(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U64(src),Column::F64(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U128(src),Column::Any(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U128(src),Column::U128(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U128(src),Column::F32(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::U128(src),Column::F64(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F32(src),Column::Any(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F32(src),Column::U8(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F32(src),Column::U16(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F32(src),Column::U32(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F32(src),Column::U64(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F32(src),Column::U128(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F32(src),Column::I8(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F32(src),Column::I16(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F32(src),Column::I32(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F32(src),Column::I64(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F32(src),Column::I128(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F32(src),Column::F32(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F32(src),Column::F64(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F64(src),Column::Any(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F64(src),Column::U8(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F64(src),Column::U16(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F64(src),Column::U32(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F64(src),Column::U64(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F64(src),Column::U128(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F64(src),Column::I8(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F64(src),Column::I16(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F64(src),Column::I32(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F64(src),Column::I64(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F64(src),Column::I128(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F64(src),Column::F32(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::F64(src),Column::F64(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::Time(src),Column::Any(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::Time(src),Column::Time(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::Length(src),Column::Any(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::Length(src),Column::Length(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::Speed(src),Column::Any(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::Speed(src),Column::Speed(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::String(src),Column::Any(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::String(src),Column::String(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::Bool(src),Column::Any(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::Bool(src),Column::Bool(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::Ref(src),Column::Any(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + (Column::Ref(src),Column::Ref(out)) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: 0, out: out.clone(), oix: 0});} + x => {return Err(MechError{msg: "".to_string(), id: 4919, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + } + } + (TableShape::Matrix(_,_),TableShape::Matrix(_,_)) | + (TableShape::Matrix(_,_),TableShape::Row(_)) | + (TableShape::Matrix(_,_),TableShape::Scalar) => { + let src_table_brrw = src_table.borrow(); + let mut dest_table_brrw = dest_table.borrow_mut(); + dest_table_brrw.resize(src_table_brrw.rows,src_table_brrw.cols); + dest_table_brrw.set_kind(src_table_brrw.kind()); + for col_ix in 1..=src_table_brrw.cols { + let dest_column = dest_table_brrw.get_column(&TableIndex::Index(col_ix))?; + let src_column = src_table_brrw.get_column(&TableIndex::Index(col_ix))?; + match (src_column,dest_column) { + (Column::U8(src),Column::Any(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U8(src),Column::U8(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U8(src),Column::U16(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U8(src),Column::U32(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U8(src),Column::U64(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U8(src),Column::U128(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U8(src),Column::F32(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U8(src),Column::F64(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U16(src),Column::Any(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U16(src),Column::U16(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U16(src),Column::U32(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U16(src),Column::U64(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U16(src),Column::U128(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U16(src),Column::F32(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U16(src),Column::F64(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U32(src),Column::Any(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U32(src),Column::U32(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U32(src),Column::U64(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U32(src),Column::U128(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U32(src),Column::F32(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U32(src),Column::F64(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U64(src),Column::Any(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U64(src),Column::U64(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U64(src),Column::U128(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U64(src),Column::F32(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U64(src),Column::F64(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U128(src),Column::Any(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U128(src),Column::U128(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U128(src),Column::F32(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U128(src),Column::F64(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F32(src),Column::Any(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F32(src),Column::U8(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F32(src),Column::U16(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F32(src),Column::U32(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F32(src),Column::U64(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F32(src),Column::U128(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F32(src),Column::I8(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F32(src),Column::I16(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F32(src),Column::I32(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F32(src),Column::I64(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F32(src),Column::I128(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F32(src),Column::F32(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F32(src),Column::F64(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F64(src),Column::Any(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F64(src),Column::U8(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F64(src),Column::U16(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F64(src),Column::U32(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F64(src),Column::U64(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F64(src),Column::U128(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F64(src),Column::I8(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F64(src),Column::I16(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F64(src),Column::I32(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F64(src),Column::I64(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F64(src),Column::I128(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F64(src),Column::F32(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F64(src),Column::F64(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::Time(src),Column::Any(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::Time(src),Column::Time(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::Length(src),Column::Any(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::Length(src),Column::Length(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::Speed(src),Column::Any(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::Speed(src),Column::Speed(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::String(src),Column::Any(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::String(src),Column::String(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::Bool(src),Column::Any(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::Bool(src),Column::Bool(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::Ref(src),Column::Any(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::Ref(src),Column::Ref(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + x => {return Err(MechError{msg: "".to_string(), id: 4919, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + x => {return Err(MechError{msg: "".to_string(), id: 4920, kind: MechErrorKind::GenericError(format!("{:?}", x))});} + } + } + } + (TableShape::Scalar,TableShape::Scalar) => { + let arg_cols = block.get_arg_columns(&arguments)?; + match (&arg_cols[0],&arg_cols[1]) { + ((_,Column::U8(src),ColumnIndex::Index(in_ix)),(_,Column::Any(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::U8(src),ColumnIndex::Index(in_ix)),(_,Column::U8(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::U8(src),ColumnIndex::Index(in_ix)),(_,Column::U16(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::U8(src),ColumnIndex::Index(in_ix)),(_,Column::U32(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::U8(src),ColumnIndex::Index(in_ix)),(_,Column::U64(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::U8(src),ColumnIndex::Index(in_ix)),(_,Column::U128(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::U8(src),ColumnIndex::Index(in_ix)),(_,Column::F32(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::U8(src),ColumnIndex::Index(in_ix)),(_,Column::F64(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::U16(src),ColumnIndex::Index(in_ix)),(_,Column::Any(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::U16(src),ColumnIndex::Index(in_ix)),(_,Column::U16(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::U16(src),ColumnIndex::Index(in_ix)),(_,Column::U32(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::U16(src),ColumnIndex::Index(in_ix)),(_,Column::U64(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::U16(src),ColumnIndex::Index(in_ix)),(_,Column::U128(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::U16(src),ColumnIndex::Index(in_ix)),(_,Column::F32(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::U16(src),ColumnIndex::Index(in_ix)),(_,Column::F64(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});}((_,Column::U32(src),ColumnIndex::Index(in_ix)),(_,Column::Any(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::U32(src),ColumnIndex::Index(in_ix)),(_,Column::U32(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::U32(src),ColumnIndex::Index(in_ix)),(_,Column::U64(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::U32(src),ColumnIndex::Index(in_ix)),(_,Column::U128(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::U32(src),ColumnIndex::Index(in_ix)),(_,Column::F32(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::U32(src),ColumnIndex::Index(in_ix)),(_,Column::F64(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});}((_,Column::U64(src),ColumnIndex::Index(in_ix)),(_,Column::Any(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::U64(src),ColumnIndex::Index(in_ix)),(_,Column::U64(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::U64(src),ColumnIndex::Index(in_ix)),(_,Column::U128(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::U64(src),ColumnIndex::Index(in_ix)),(_,Column::F32(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::U64(src),ColumnIndex::Index(in_ix)),(_,Column::F64(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});}((_,Column::U128(src),ColumnIndex::Index(in_ix)),(_,Column::Any(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::U128(src),ColumnIndex::Index(in_ix)),(_,Column::U128(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::U128(src),ColumnIndex::Index(in_ix)),(_,Column::F32(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::U128(src),ColumnIndex::Index(in_ix)),(_,Column::F64(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::F32(src),ColumnIndex::Index(in_ix)),(_,Column::Any(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::F32(src),ColumnIndex::Index(in_ix)),(_,Column::U8(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::F32(src),ColumnIndex::Index(in_ix)),(_,Column::U16(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::F32(src),ColumnIndex::Index(in_ix)),(_,Column::U32(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::F32(src),ColumnIndex::Index(in_ix)),(_,Column::U64(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::F32(src),ColumnIndex::Index(in_ix)),(_,Column::U128(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::F32(src),ColumnIndex::Index(in_ix)),(_,Column::F32(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::F32(src),ColumnIndex::Index(in_ix)),(_,Column::F64(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::F64(src),ColumnIndex::Index(in_ix)),(_,Column::Any(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::F64(src),ColumnIndex::Index(in_ix)),(_,Column::U8(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::F64(src),ColumnIndex::Index(in_ix)),(_,Column::U16(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::F64(src),ColumnIndex::Index(in_ix)),(_,Column::U32(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::F64(src),ColumnIndex::Index(in_ix)),(_,Column::U64(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::F64(src),ColumnIndex::Index(in_ix)),(_,Column::U128(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::F64(src),ColumnIndex::Index(in_ix)),(_,Column::F32(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::F64(src),ColumnIndex::Index(in_ix)),(_,Column::F64(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::Time(src),ColumnIndex::Index(in_ix)),(_,Column::Any(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::Time(src),ColumnIndex::Index(in_ix)),(_,Column::Time(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::Speed(src),ColumnIndex::Index(in_ix)),(_,Column::Any(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::Speed(src),ColumnIndex::Index(in_ix)),(_,Column::Speed(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::Length(src),ColumnIndex::Index(in_ix)),(_,Column::Any(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::Length(src),ColumnIndex::Index(in_ix)),(_,Column::Length(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::String(src),ColumnIndex::Index(in_ix)),(_,Column::Any(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::String(src),ColumnIndex::IndexColU8(in_ix)),(_,Column::String(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxColSIx{arg: src.clone(), ix: in_ix.clone(), out: out.clone(), oix: *out_ix});} + ((_,Column::String(src),ColumnIndex::Index(in_ix)),(_,Column::String(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: in_ix.clone(), out: out.clone(), oix: *out_ix});} + + ((_,Column::Bool(src),ColumnIndex::Index(in_ix)),(_,Column::Any(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::Bool(src),ColumnIndex::Index(in_ix)),(_,Column::Bool(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::Bool(src),ColumnIndex::Index(in_ix)),(_,Column::Any(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::Bool(src),ColumnIndex::Index(in_ix)),(_,Column::Bool(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::Ref(src),ColumnIndex::Index(in_ix)),(_,Column::Any(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + ((_,Column::Ref(src),ColumnIndex::Index(in_ix)),(_,Column::Ref(out),ColumnIndex::Index(out_ix))) => {block.plan.push(SetSIxSIx{arg: src.clone(), ix: *in_ix, out: out.clone(), oix: *out_ix});} + + ((_,Column::U8(arg),ColumnIndex::Index(ix)),(_,Column::Any(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::U8(arg),ColumnIndex::Index(ix)),(_,Column::U8(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::U8(arg),ColumnIndex::Index(ix)),(_,Column::U16(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::U8(arg),ColumnIndex::Index(ix)),(_,Column::U32(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::U8(arg),ColumnIndex::Index(ix)),(_,Column::U64(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::U8(arg),ColumnIndex::Index(ix)),(_,Column::U128(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::U8(arg),ColumnIndex::Index(ix)),(_,Column::F32(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::U8(arg),ColumnIndex::Index(ix)),(_,Column::F64(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::U16(arg),ColumnIndex::Index(ix)),(_,Column::Any(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::U16(arg),ColumnIndex::Index(ix)),(_,Column::U16(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::U16(arg),ColumnIndex::Index(ix)),(_,Column::U32(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::U16(arg),ColumnIndex::Index(ix)),(_,Column::U64(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::U16(arg),ColumnIndex::Index(ix)),(_,Column::U128(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::U16(arg),ColumnIndex::Index(ix)),(_,Column::F32(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::U16(arg),ColumnIndex::Index(ix)),(_,Column::F64(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::U32(arg),ColumnIndex::Index(ix)),(_,Column::Any(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::U32(arg),ColumnIndex::Index(ix)),(_,Column::U64(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::U32(arg),ColumnIndex::Index(ix)),(_,Column::U128(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::U32(arg),ColumnIndex::Index(ix)),(_,Column::F32(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::U32(arg),ColumnIndex::Index(ix)),(_,Column::F64(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::U64(arg),ColumnIndex::Index(ix)),(_,Column::Any(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::U64(arg),ColumnIndex::Index(ix)),(_,Column::U64(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::U64(arg),ColumnIndex::Index(ix)),(_,Column::U128(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::U64(arg),ColumnIndex::Index(ix)),(_,Column::F32(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::U64(arg),ColumnIndex::Index(ix)),(_,Column::F64(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::U64(arg),ColumnIndex::Index(ix)),(_,Column::Any(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::U128(arg),ColumnIndex::Index(ix)),(_,Column::U128(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::U128(arg),ColumnIndex::Index(ix)),(_,Column::F32(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::U128(arg),ColumnIndex::Index(ix)),(_,Column::F64(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::F32(arg),ColumnIndex::Index(ix)),(_,Column::Any(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::F32(arg),ColumnIndex::Index(ix)),(_,Column::U8(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::F32(arg),ColumnIndex::Index(ix)),(_,Column::U16(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::F32(arg),ColumnIndex::Index(ix)),(_,Column::U32(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::F32(arg),ColumnIndex::Index(ix)),(_,Column::U64(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::F32(arg),ColumnIndex::Index(ix)),(_,Column::U128(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::F32(arg),ColumnIndex::Index(ix)),(_,Column::F32(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::F32(arg),ColumnIndex::Index(ix)),(_,Column::F64(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::F64(arg),ColumnIndex::Index(ix)),(_,Column::Any(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::F64(arg),ColumnIndex::Index(ix)),(_,Column::U8(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::F64(arg),ColumnIndex::Index(ix)),(_,Column::U16(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::F64(arg),ColumnIndex::Index(ix)),(_,Column::U32(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::F64(arg),ColumnIndex::Index(ix)),(_,Column::U64(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::F64(arg),ColumnIndex::Index(ix)),(_,Column::U128(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::F64(arg),ColumnIndex::Index(ix)),(_,Column::F32(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::F64(arg),ColumnIndex::Index(ix)),(_,Column::F64(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::Time(arg),ColumnIndex::Index(ix)),(_,Column::Any(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::Time(arg),ColumnIndex::Index(ix)),(_,Column::Time(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::Length(arg),ColumnIndex::Index(ix)),(_,Column::Any(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::Length(arg),ColumnIndex::Index(ix)),(_,Column::Length(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::Speed(arg),ColumnIndex::Index(ix)),(_,Column::Any(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::Speed(arg),ColumnIndex::Index(ix)),(_,Column::Speed(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::String(arg),ColumnIndex::Index(ix)),(_,Column::Any(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::String(arg),ColumnIndex::Index(ix)),(_,Column::String(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::Bool(arg),ColumnIndex::Index(ix)),(_,Column::Any(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::Bool(arg),ColumnIndex::Index(ix)),(_,Column::Bool(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::Ref(arg),ColumnIndex::Index(ix)),(_,Column::Any(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::Ref(arg),ColumnIndex::Index(ix)),(_,Column::Ref(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + x => {return Err(MechError{msg: "".to_string(), id: 4921, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + (TableShape::Scalar,TableShape::Pending(_)) => { + /*println!("~~{:?}",src_table); + println!("~~{:?}",dest_table); + let arg_cols = block.get_arg_columns(&arguments)?; + println!("~~!{:?}",arguments);*/ + //let src_column = src_table_brrw.get_column()?; + //let dest_column = dest_table_brrw.get_column(&TableIndex::Index(col_ix))?; + } + /*(TableShape::Scalar,TableShape::Column(rows)) => { + println!("~~{:?}",src_table); + println!("~~{:?}",dest_table); + let arg_cols = block.get_arg_columns(&arguments)?; + println!("~~!{:?}",arguments); + //let src_column = src_table_brrw.get_column()?; + //let dest_column = dest_table_brrw.get_column(&TableIndex::Index(col_ix))?; + }*/ + (TableShape::Matrix(_,_),TableShape::Pending(_)) | + (TableShape::Row(_),TableShape::Pending(_)) => { + let src_table_brrw = src_table.borrow(); + let mut dest_table_brrw = dest_table.borrow_mut(); + dest_table_brrw.resize(src_table_brrw.rows,src_table_brrw.cols); + dest_table_brrw.set_kind(src_table_brrw.kind()); + for col_ix in 1..=src_table_brrw.cols { + let dest_column = dest_table_brrw.get_column(&TableIndex::Index(col_ix))?; + let src_column = src_table_brrw.get_column(&TableIndex::Index(col_ix))?; + match (src_column,dest_column) { + (Column::U8(src),Column::Any(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U8(src),Column::U8(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U8(src),Column::U16(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U8(src),Column::U32(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U8(src),Column::U64(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U8(src),Column::U128(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U8(src),Column::F32(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U8(src),Column::F64(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U16(src),Column::Any(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U16(src),Column::U16(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U16(src),Column::U32(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U16(src),Column::U64(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U16(src),Column::U128(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U16(src),Column::F32(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U16(src),Column::F64(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U32(src),Column::Any(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U32(src),Column::U32(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U32(src),Column::U64(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U32(src),Column::U128(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U32(src),Column::F32(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U32(src),Column::F64(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U64(src),Column::Any(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U64(src),Column::U64(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U64(src),Column::U128(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U64(src),Column::F32(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U64(src),Column::F64(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U128(src),Column::Any(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U128(src),Column::U128(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U128(src),Column::F32(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::U128(src),Column::F64(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F32(src),Column::Any(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F32(src),Column::U8(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F32(src),Column::U16(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F32(src),Column::U32(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F32(src),Column::U64(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F32(src),Column::U128(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F32(src),Column::I8(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F32(src),Column::I16(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F32(src),Column::I32(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F32(src),Column::I64(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F32(src),Column::I128(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F32(src),Column::F32(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F32(src),Column::F64(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F64(src),Column::Any(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F64(src),Column::U8(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F64(src),Column::U16(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F64(src),Column::U32(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F64(src),Column::U64(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F64(src),Column::U128(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F64(src),Column::I8(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F64(src),Column::I16(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F64(src),Column::I32(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F64(src),Column::I64(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F64(src),Column::I128(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F64(src),Column::F32(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::F64(src),Column::F64(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::Time(src),Column::Any(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::Time(src),Column::Time(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::Length(src),Column::Any(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::Length(src),Column::Length(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::Speed(src),Column::Any(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::Speed(src),Column::Speed(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::String(src),Column::Any(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::String(src),Column::String(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::Bool(src),Column::Any(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::Bool(src),Column::Bool(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::Ref(src),Column::Any(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + (Column::Ref(src),Column::Ref(out)) => {block.plan.push(SetVV{arg: src.clone(), out: out.clone()});} + x => {return Err(MechError{msg: "".to_string(), id: 4923, kind: MechErrorKind::GenericError(format!("{:?}", x))});} + } + } + } + // Everything Else!! + _ | + (TableShape::Column(_),TableShape::Column(_)) => { + let arg_cols = block.get_arg_columns(&arguments)?; + match (&arg_cols[0], &arg_cols[1]) { + ((_,Column::U8(arg),ColumnIndex::All),(_,Column::U8(out),ColumnIndex::All)) => block.plan.push(SetVV{arg: arg.clone(), out: out.clone()}), + ((_,Column::U8(arg),ColumnIndex::Index(ix)),(_,Column::U8(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::U8(arg),ColumnIndex::Index(ix)), (_,Column::U8(out),ColumnIndex::Index(oix))) => block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: *oix}), + ((_,Column::U8(arg),ColumnIndex::All), (_,Column::U8(out),ColumnIndex::Bool(oix))) => block.plan.push(SetVVB{arg: arg.clone(), out: out.clone(), oix: oix.clone()}), + ((_,Column::U8(arg),ColumnIndex::Index(ix)), (_,Column::Empty,ColumnIndex::All)) => { + let src_table_brrw = src_table.borrow(); + let mut dest_table_brrw = dest_table.borrow_mut(); + dest_table_brrw.resize(1,1); + dest_table_brrw.set_kind(ValueKind::U8); + if let Column::U8(out) = dest_table_brrw.get_column_unchecked(0) { + block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: 0}); + } + } + ((_,Column::U8(arg),ColumnIndex::Index(ix)), (_,Column::Empty,ColumnIndex::Index(oix))) => { + let src_table_brrw = src_table.borrow(); + let mut dest_table_brrw = dest_table.borrow_mut(); + dest_table_brrw.set_col_kind(1,ValueKind::U8); + if let Column::U8(out) = dest_table_brrw.get_column_unchecked(1) { + block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: *oix}); + } + } + ((_,Column::U16(arg),ColumnIndex::All),(_,Column::U16(out),ColumnIndex::All)) => block.plan.push(SetVV{arg: arg.clone(), out: out.clone()}), + ((_,Column::U16(arg),ColumnIndex::Index(ix)),(_,Column::U16(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::U16(arg),ColumnIndex::Index(ix)), (_,Column::U16(out),ColumnIndex::Index(oix))) => block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: *oix}), + ((_,Column::U16(arg),ColumnIndex::All), (_,Column::U16(out),ColumnIndex::Bool(oix))) => block.plan.push(SetVVB{arg: arg.clone(), out: out.clone(), oix: oix.clone()}), + ((_,Column::U16(arg),ColumnIndex::Index(ix)), (_,Column::Empty,ColumnIndex::All)) => { + let src_table_brrw = src_table.borrow(); + let mut dest_table_brrw = dest_table.borrow_mut(); + dest_table_brrw.resize(1,1); + dest_table_brrw.set_kind(ValueKind::U16); + if let Column::U16(out) = dest_table_brrw.get_column_unchecked(0) { + block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: 0}); + } + } + ((_,Column::U16(arg),ColumnIndex::Index(ix)), (_,Column::Empty,ColumnIndex::Index(oix))) => { + let src_table_brrw = src_table.borrow(); + let mut dest_table_brrw = dest_table.borrow_mut(); + dest_table_brrw.set_col_kind(1,ValueKind::U16); + if let Column::U16(out) = dest_table_brrw.get_column_unchecked(1) { + block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: *oix}); + } + } + ((_,Column::U32(arg),ColumnIndex::All),(_,Column::U32(out),ColumnIndex::All)) => block.plan.push(SetVV{arg: arg.clone(), out: out.clone()}), + ((_,Column::U32(arg),ColumnIndex::Index(ix)),(_,Column::U32(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::U32(arg),ColumnIndex::Index(ix)), (_,Column::U32(out),ColumnIndex::Index(oix))) => block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: *oix}), + ((_,Column::U32(arg),ColumnIndex::All), (_,Column::U32(out),ColumnIndex::Bool(oix))) => block.plan.push(SetVVB{arg: arg.clone(), out: out.clone(), oix: oix.clone()}), + ((_,Column::U32(arg),ColumnIndex::Index(ix)), (_,Column::Empty,ColumnIndex::All)) => { + let src_table_brrw = src_table.borrow(); + let mut dest_table_brrw = dest_table.borrow_mut(); + dest_table_brrw.resize(1,1); + dest_table_brrw.set_kind(ValueKind::U32); + if let Column::U32(out) = dest_table_brrw.get_column_unchecked(0) { + block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: 0}); + } + } + ((_,Column::U32(arg),ColumnIndex::Index(ix)), (_,Column::Empty,ColumnIndex::Index(oix))) => { + let src_table_brrw = src_table.borrow(); + let mut dest_table_brrw = dest_table.borrow_mut(); + dest_table_brrw.set_col_kind(1,ValueKind::U32); + if let Column::U32(out) = dest_table_brrw.get_column_unchecked(1) { + block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: *oix}); + } + } + ((_,Column::U64(arg),ColumnIndex::All),(_,Column::U64(out),ColumnIndex::All)) => block.plan.push(SetVV{arg: arg.clone(), out: out.clone()}), + ((_,Column::U64(arg),ColumnIndex::Index(ix)),(_,Column::U64(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::U64(arg),ColumnIndex::Index(ix)), (_,Column::U64(out),ColumnIndex::Index(oix))) => block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: *oix}), + ((_,Column::U64(arg),ColumnIndex::All), (_,Column::U64(out),ColumnIndex::Bool(oix))) => block.plan.push(SetVVB{arg: arg.clone(), out: out.clone(), oix: oix.clone()}), + ((_,Column::U64(arg),ColumnIndex::Index(ix)), (_,Column::Empty,ColumnIndex::All)) => { + let src_table_brrw = src_table.borrow(); + let mut dest_table_brrw = dest_table.borrow_mut(); + dest_table_brrw.resize(1,1); + dest_table_brrw.set_kind(ValueKind::U64); + if let Column::U64(out) = dest_table_brrw.get_column_unchecked(0) { + block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: 0}); + } + } + ((_,Column::U64(arg),ColumnIndex::Index(ix)), (_,Column::Empty,ColumnIndex::Index(oix))) => { + let src_table_brrw = src_table.borrow(); + let mut dest_table_brrw = dest_table.borrow_mut(); + dest_table_brrw.set_col_kind(1,ValueKind::U64); + if let Column::U64(out) = dest_table_brrw.get_column_unchecked(1) { + block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: *oix}); + } + } + ((_,Column::U128(arg),ColumnIndex::All),(_,Column::U128(out),ColumnIndex::All)) => block.plan.push(SetVV{arg: arg.clone(), out: out.clone()}), + ((_,Column::U128(arg),ColumnIndex::Index(ix)),(_,Column::U128(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::U128(arg),ColumnIndex::Index(ix)), (_,Column::U128(out),ColumnIndex::Index(oix))) => block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: *oix}), + ((_,Column::U128(arg),ColumnIndex::All), (_,Column::U128(out),ColumnIndex::Bool(oix))) => block.plan.push(SetVVB{arg: arg.clone(), out: out.clone(), oix: oix.clone()}), + ((_,Column::U128(arg),ColumnIndex::Index(ix)), (_,Column::Empty,ColumnIndex::All)) => { + let src_table_brrw = src_table.borrow(); + let mut dest_table_brrw = dest_table.borrow_mut(); + dest_table_brrw.resize(1,1); + dest_table_brrw.set_kind(ValueKind::U128); + if let Column::U128(out) = dest_table_brrw.get_column_unchecked(0) { + block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: 0}); + } + } + ((_,Column::U128(arg),ColumnIndex::Index(ix)), (_,Column::Empty,ColumnIndex::Index(oix))) => { + let src_table_brrw = src_table.borrow(); + let mut dest_table_brrw = dest_table.borrow_mut(); + dest_table_brrw.set_col_kind(1,ValueKind::Bool); + if let Column::U128(out) = dest_table_brrw.get_column_unchecked(1) { + block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: *oix}); + } + } + ((_,Column::I8(arg),ColumnIndex::All),(_,Column::I8(out),ColumnIndex::All)) => block.plan.push(SetVV{arg: arg.clone(), out: out.clone()}), + ((_,Column::I8(arg),ColumnIndex::Index(ix)),(_,Column::I8(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::I8(arg),ColumnIndex::Index(ix)), (_,Column::I8(out),ColumnIndex::Index(oix))) => block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: *oix}), + ((_,Column::I8(arg),ColumnIndex::All), (_,Column::I8(out),ColumnIndex::Bool(oix))) => block.plan.push(SetVVB{arg: arg.clone(), out: out.clone(), oix: oix.clone()}), + ((_,Column::I8(arg),ColumnIndex::Index(ix)), (_,Column::Empty,ColumnIndex::All)) => { + let src_table_brrw = src_table.borrow(); + let mut dest_table_brrw = dest_table.borrow_mut(); + dest_table_brrw.resize(1,1); + dest_table_brrw.set_kind(ValueKind::I8); + if let Column::I8(out) = dest_table_brrw.get_column_unchecked(0) { + block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: 0}); + } + } + ((_,Column::I8(arg),ColumnIndex::Index(ix)), (_,Column::Empty,ColumnIndex::Index(oix))) => { + let src_table_brrw = src_table.borrow(); + let mut dest_table_brrw = dest_table.borrow_mut(); + dest_table_brrw.set_col_kind(1,ValueKind::I8); + if let Column::I8(out) = dest_table_brrw.get_column_unchecked(1) { + block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: *oix}); + } + } + ((_,Column::I16(arg),ColumnIndex::All),(_,Column::I16(out),ColumnIndex::All)) => block.plan.push(SetVV{arg: arg.clone(), out: out.clone()}), + ((_,Column::I16(arg),ColumnIndex::Index(ix)),(_,Column::I16(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::I16(arg),ColumnIndex::Index(ix)), (_,Column::I16(out),ColumnIndex::Index(oix))) => block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: *oix}), + ((_,Column::I16(arg),ColumnIndex::All), (_,Column::I16(out),ColumnIndex::Bool(oix))) => block.plan.push(SetVVB{arg: arg.clone(), out: out.clone(), oix: oix.clone()}), + ((_,Column::I16(arg),ColumnIndex::Index(ix)), (_,Column::Empty,ColumnIndex::All)) => { + let src_table_brrw = src_table.borrow(); + let mut dest_table_brrw = dest_table.borrow_mut(); + dest_table_brrw.resize(1,1); + dest_table_brrw.set_kind(ValueKind::I16); + if let Column::I16(out) = dest_table_brrw.get_column_unchecked(0) { + block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: 0}); + } + } + ((_,Column::I16(arg),ColumnIndex::Index(ix)), (_,Column::Empty,ColumnIndex::Index(oix))) => { + let src_table_brrw = src_table.borrow(); + let mut dest_table_brrw = dest_table.borrow_mut(); + dest_table_brrw.set_col_kind(1,ValueKind::I16); + if let Column::I16(out) = dest_table_brrw.get_column_unchecked(1) { + block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: *oix}); + } + } + ((_,Column::I32(arg),ColumnIndex::All),(_,Column::I32(out),ColumnIndex::All)) => block.plan.push(SetVV{arg: arg.clone(), out: out.clone()}), + ((_,Column::I32(arg),ColumnIndex::Index(ix)),(_,Column::I32(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::I32(arg),ColumnIndex::Index(ix)), (_,Column::I32(out),ColumnIndex::Index(oix))) => block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: *oix}), + ((_,Column::I32(arg),ColumnIndex::All), (_,Column::I32(out),ColumnIndex::Bool(oix))) => block.plan.push(SetVVB{arg: arg.clone(), out: out.clone(), oix: oix.clone()}), + ((_,Column::I32(arg),ColumnIndex::Index(ix)), (_,Column::Empty,ColumnIndex::All)) => { + let src_table_brrw = src_table.borrow(); + let mut dest_table_brrw = dest_table.borrow_mut(); + dest_table_brrw.resize(1,1); + dest_table_brrw.set_kind(ValueKind::I32); + if let Column::I32(out) = dest_table_brrw.get_column_unchecked(0) { + block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: 0}); + } + } + ((_,Column::I32(arg),ColumnIndex::Index(ix)), (_,Column::Empty,ColumnIndex::Index(oix))) => { + let src_table_brrw = src_table.borrow(); + let mut dest_table_brrw = dest_table.borrow_mut(); + dest_table_brrw.set_col_kind(1,ValueKind::I32); + if let Column::I32(out) = dest_table_brrw.get_column_unchecked(1) { + block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: *oix}); + } + } + ((_,Column::I64(arg),ColumnIndex::All),(_,Column::I64(out),ColumnIndex::All)) => block.plan.push(SetVV{arg: arg.clone(), out: out.clone()}), + ((_,Column::I64(arg),ColumnIndex::Index(ix)),(_,Column::I64(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::I64(arg),ColumnIndex::Index(ix)), (_,Column::I64(out),ColumnIndex::Index(oix))) => block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: *oix}), + ((_,Column::I64(arg),ColumnIndex::All), (_,Column::I64(out),ColumnIndex::Bool(oix))) => block.plan.push(SetVVB{arg: arg.clone(), out: out.clone(), oix: oix.clone()}), + ((_,Column::I64(arg),ColumnIndex::Index(ix)), (_,Column::Empty,ColumnIndex::All)) => { + let src_table_brrw = src_table.borrow(); + let mut dest_table_brrw = dest_table.borrow_mut(); + dest_table_brrw.resize(1,1); + dest_table_brrw.set_kind(ValueKind::I64); + if let Column::I64(out) = dest_table_brrw.get_column_unchecked(0) { + block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: 0}); + } + } + ((_,Column::I64(arg),ColumnIndex::Index(ix)), (_,Column::Empty,ColumnIndex::Index(oix))) => { + let src_table_brrw = src_table.borrow(); + let mut dest_table_brrw = dest_table.borrow_mut(); + dest_table_brrw.set_col_kind(1,ValueKind::I64); + if let Column::I64(out) = dest_table_brrw.get_column_unchecked(1) { + block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: *oix}); + } + } + ((_,Column::I128(arg),ColumnIndex::All),(_,Column::I128(out),ColumnIndex::All)) => block.plan.push(SetVV{arg: arg.clone(), out: out.clone()}), + ((_,Column::I128(arg),ColumnIndex::Index(ix)),(_,Column::I128(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::I128(arg),ColumnIndex::Index(ix)), (_,Column::I128(out),ColumnIndex::Index(oix))) => block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: *oix}), + ((_,Column::I128(arg),ColumnIndex::All), (_,Column::I128(out),ColumnIndex::Bool(oix))) => block.plan.push(SetVVB{arg: arg.clone(), out: out.clone(), oix: oix.clone()}), + ((_,Column::I128(arg),ColumnIndex::Index(ix)), (_,Column::Empty,ColumnIndex::All)) => { + let src_table_brrw = src_table.borrow(); + let mut dest_table_brrw = dest_table.borrow_mut(); + dest_table_brrw.resize(1,1); + dest_table_brrw.set_kind(ValueKind::I128); + if let Column::I128(out) = dest_table_brrw.get_column_unchecked(0) { + block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: 0}); + } + } + ((_,Column::I128(arg),ColumnIndex::Index(ix)), (_,Column::Empty,ColumnIndex::Index(oix))) => { + let src_table_brrw = src_table.borrow(); + let mut dest_table_brrw = dest_table.borrow_mut(); + dest_table_brrw.set_col_kind(1,ValueKind::Bool); + if let Column::I128(out) = dest_table_brrw.get_column_unchecked(1) { + block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: *oix}); + } + } + ((_,Column::Time(arg),ColumnIndex::All),(_,Column::Time(out),ColumnIndex::All)) => block.plan.push(SetVV{arg: arg.clone(), out: out.clone()}), + ((_,Column::Time(arg),ColumnIndex::Index(ix)),(_,Column::Time(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::Time(arg),ColumnIndex::Index(ix)), (_,Column::Time(out),ColumnIndex::Index(oix))) => block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: *oix}), + ((_,Column::Time(arg),ColumnIndex::All), (_,Column::Time(out),ColumnIndex::Bool(oix))) => block.plan.push(SetVVB{arg: arg.clone(), out: out.clone(), oix: oix.clone()}), + ((_,Column::Time(arg),ColumnIndex::Index(ix)), (_,Column::Empty,ColumnIndex::All)) => { + let src_table_brrw = src_table.borrow(); + let mut dest_table_brrw = dest_table.borrow_mut(); + dest_table_brrw.resize(1,1); + dest_table_brrw.set_kind(ValueKind::Time); + if let Column::Time(out) = dest_table_brrw.get_column_unchecked(0) { + block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: 0}); + } + } + ((_,Column::Speed(arg),ColumnIndex::All),(_,Column::Speed(out),ColumnIndex::All)) => block.plan.push(SetVV{arg: arg.clone(), out: out.clone()}), + ((_,Column::Speed(arg),ColumnIndex::Index(ix)),(_,Column::Speed(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::Speed(arg),ColumnIndex::Index(ix)), (_,Column::Speed(out),ColumnIndex::Index(oix))) => block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: *oix}), + ((_,Column::Speed(arg),ColumnIndex::All), (_,Column::Speed(out),ColumnIndex::Bool(oix))) => block.plan.push(SetVVB{arg: arg.clone(), out: out.clone(), oix: oix.clone()}), + ((_,Column::Speed(arg),ColumnIndex::Index(ix)), (_,Column::Empty,ColumnIndex::All)) => { + let src_table_brrw = src_table.borrow(); + let mut dest_table_brrw = dest_table.borrow_mut(); + dest_table_brrw.resize(1,1); + dest_table_brrw.set_kind(ValueKind::Speed); + if let Column::Speed(out) = dest_table_brrw.get_column_unchecked(0) { + block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: 0}); + } + } + ((_,Column::Length(arg),ColumnIndex::Index(ix)), (_,Column::Empty,ColumnIndex::Index(oix))) => { + let src_table_brrw = src_table.borrow(); + let mut dest_table_brrw = dest_table.borrow_mut(); + dest_table_brrw.set_col_kind(1,ValueKind::Length); + if let Column::Length(out) = dest_table_brrw.get_column_unchecked(1) { + block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: *oix}); + } + } + ((_,Column::Length(arg),ColumnIndex::All),(_,Column::Length(out),ColumnIndex::All)) => block.plan.push(SetVV{arg: arg.clone(), out: out.clone()}), + ((_,Column::Length(arg),ColumnIndex::Index(ix)),(_,Column::Length(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::Length(arg),ColumnIndex::Index(ix)), (_,Column::Length(out),ColumnIndex::Index(oix))) => block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: *oix}), + ((_,Column::Length(arg),ColumnIndex::All), (_,Column::Length(out),ColumnIndex::Bool(oix))) => block.plan.push(SetVVB{arg: arg.clone(), out: out.clone(), oix: oix.clone()}), + ((_,Column::Length(arg),ColumnIndex::Index(ix)), (_,Column::Empty,ColumnIndex::All)) => { + let src_table_brrw = src_table.borrow(); + let mut dest_table_brrw = dest_table.borrow_mut(); + dest_table_brrw.resize(1,1); + dest_table_brrw.set_kind(ValueKind::Length); + if let Column::Length(out) = dest_table_brrw.get_column_unchecked(0) { + block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: 0}); + } + } + ((_,Column::Length(arg),ColumnIndex::Index(ix)), (_,Column::Empty,ColumnIndex::Index(oix))) => { + let src_table_brrw = src_table.borrow(); + let mut dest_table_brrw = dest_table.borrow_mut(); + dest_table_brrw.set_col_kind(1,ValueKind::Length); + if let Column::Length(out) = dest_table_brrw.get_column_unchecked(1) { + block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: *oix}); + } + } + ((_,Column::F32(arg),ColumnIndex::All),(_,Column::F32(out),ColumnIndex::All)) => block.plan.push(SetVV{arg: arg.clone(), out: out.clone()}), + ((_,Column::F32(arg),ColumnIndex::Index(ix)),(_,Column::F32(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::F32(arg),ColumnIndex::All), (_,Column::F32(out),ColumnIndex::RealIndex(oix))) => block.plan.push(SetVVRIx{arg: arg.clone(), out: out.clone(), oix: oix.clone()}), + ((_,Column::F32(arg),ColumnIndex::Index(ix)), (_,Column::F32(out),ColumnIndex::Index(oix))) => block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: *oix}), + ((_,Column::F32(arg),ColumnIndex::All), (_,Column::F32(out),ColumnIndex::Bool(oix))) => block.plan.push(SetVVB{arg: arg.clone(), out: out.clone(), oix: oix.clone()}), + ((_,Column::F32(arg),ColumnIndex::Index(ix)), (_,Column::Empty,ColumnIndex::All)) => { + let src_table_brrw = src_table.borrow(); + let mut dest_table_brrw = dest_table.borrow_mut(); + dest_table_brrw.resize(1,1); + dest_table_brrw.set_kind(ValueKind::F32); + if let Column::F32(out) = dest_table_brrw.get_column_unchecked(0) { + block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: 0}); + } + } + ((_,Column::F32(arg),ColumnIndex::Index(ix)), (_,Column::Empty,ColumnIndex::Index(oix))) => { + let src_table_brrw = src_table.borrow(); + let mut dest_table_brrw = dest_table.borrow_mut(); + dest_table_brrw.set_col_kind(1,ValueKind::F32); + if let Column::F32(out) = dest_table_brrw.get_column_unchecked(1) { + block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: *oix}); + } + } + ((_,Column::F64(arg),ColumnIndex::All),(_,Column::F64(out),ColumnIndex::All)) => block.plan.push(SetVV{arg: arg.clone(), out: out.clone()}), + ((_,Column::F64(arg),ColumnIndex::Index(ix)),(_,Column::F64(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::F64(arg),ColumnIndex::All), (_,Column::F64(out),ColumnIndex::RealIndex(oix))) => block.plan.push(SetVVRIx{arg: arg.clone(), out: out.clone(), oix: oix.clone()}), + ((_,Column::F64(arg),ColumnIndex::Index(ix)), (_,Column::F64(out),ColumnIndex::Index(oix))) => block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: *oix}), + ((_,Column::F64(arg),ColumnIndex::All), (_,Column::F64(out),ColumnIndex::Bool(oix))) => block.plan.push(SetVVB{arg: arg.clone(), out: out.clone(), oix: oix.clone()}), + ((_,Column::F64(arg),ColumnIndex::Index(ix)), (_,Column::Empty,ColumnIndex::All)) => { + let src_table_brrw = src_table.borrow(); + let mut dest_table_brrw = dest_table.borrow_mut(); + dest_table_brrw.resize(1,1); + dest_table_brrw.set_kind(ValueKind::F64); + if let Column::F64(out) = dest_table_brrw.get_column_unchecked(0) { + block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: 0}); + } + } + ((_,Column::F64(arg),ColumnIndex::Index(ix)), (_,Column::Empty,ColumnIndex::Index(oix))) => { + let src_table_brrw = src_table.borrow(); + let mut dest_table_brrw = dest_table.borrow_mut(); + dest_table_brrw.set_col_kind(1,ValueKind::F64); + if let Column::F64(out) = dest_table_brrw.get_column_unchecked(1) { + block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: *oix}); + } + } + ((_,Column::Bool(arg),ColumnIndex::All),(_,Column::Bool(out),ColumnIndex::All)) => block.plan.push(SetVV{arg: arg.clone(), out: out.clone()}), + ((_,Column::Bool(arg),ColumnIndex::Index(ix)),(_,Column::Bool(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::Bool(arg),ColumnIndex::Index(ix)), (_,Column::Bool(out),ColumnIndex::Index(oix))) => block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: *oix}), + ((_,Column::Bool(arg),ColumnIndex::All), (_,Column::Bool(out),ColumnIndex::Bool(oix))) => block.plan.push(SetVVB{arg: arg.clone(), out: out.clone(), oix: oix.clone()}), + ((_,Column::Bool(arg),ColumnIndex::Index(ix)), (_,Column::Empty,ColumnIndex::All)) => { + let src_table_brrw = src_table.borrow(); + let mut dest_table_brrw = dest_table.borrow_mut(); + dest_table_brrw.resize(1,1); + dest_table_brrw.set_kind(ValueKind::Bool); + if let Column::Bool(out) = dest_table_brrw.get_column_unchecked(0) { + block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: 0}); + } + } + ((_,Column::Bool(arg),ColumnIndex::Index(ix)), (_,Column::Empty,ColumnIndex::Index(oix))) => { + let src_table_brrw = src_table.borrow(); + let mut dest_table_brrw = dest_table.borrow_mut(); + dest_table_brrw.set_col_kind(1,ValueKind::Bool); + if let Column::Bool(out) = dest_table_brrw.get_column_unchecked(1) { + block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: *oix}); + } + } + ((_,Column::String(arg),ColumnIndex::All),(_,Column::String(out),ColumnIndex::All)) => block.plan.push(SetVV{arg: arg.clone(), out: out.clone()}), + ((_,Column::String(arg),ColumnIndex::Index(ix)),(_,Column::String(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::String(arg),ColumnIndex::Index(ix)), (_,Column::String(out),ColumnIndex::Index(oix))) => block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: *oix}), + ((_,Column::String(arg),ColumnIndex::Index(ix)), (_,Column::String(out),ColumnIndex::IndexColU8(oix))) => block.plan.push(SetSIxSIxCol{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::String(arg),ColumnIndex::IndexColU8(ix_col)), (_,Column::String(out),ColumnIndex::Index(oix))) => block.plan.push(SetSIxColSIx{arg: arg.clone(), ix: ix_col.clone(), out: out.clone(), oix: *oix}), + ((_,Column::String(arg),ColumnIndex::All), (_,Column::String(out),ColumnIndex::Bool(oix))) => block.plan.push(SetVVB{arg: arg.clone(), out: out.clone(), oix: oix.clone()}), + ((_,Column::String(arg),ColumnIndex::Index(ix)), (_,Column::Empty,ColumnIndex::All)) => { + let src_table_brrw = src_table.borrow(); + let mut dest_table_brrw = dest_table.borrow_mut(); + dest_table_brrw.resize(1,1); + dest_table_brrw.set_kind(ValueKind::String); + if let Column::String(out) = dest_table_brrw.get_column_unchecked(0) { + block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: 0}); + } + } + ((_,Column::String(arg),ColumnIndex::Index(ix)), (_,Column::Empty,ColumnIndex::Index(oix))) => { + let src_table_brrw = src_table.borrow(); + let mut dest_table_brrw = dest_table.borrow_mut(); + dest_table_brrw.set_col_kind(1,ValueKind::String); + if let Column::String(out) = dest_table_brrw.get_column_unchecked(1) { + block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: *oix}); + } + } + ((_,Column::Ref(arg),ColumnIndex::All),(_,Column::Ref(out),ColumnIndex::All)) => block.plan.push(SetVV{arg: arg.clone(), out: out.clone()}), + ((_,Column::Ref(arg),ColumnIndex::Index(ix)),(_,Column::Ref(out),ColumnIndex::Bool(oix))) => block.plan.push(SetSIxVB{arg: arg.clone(), ix: *ix, out: out.clone(), oix: oix.clone()}), + ((_,Column::Ref(arg),ColumnIndex::Index(ix)), (_,Column::Ref(out),ColumnIndex::Index(oix))) => block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: *oix}), + ((_,Column::Ref(arg),ColumnIndex::All), (_,Column::Ref(out),ColumnIndex::Bool(oix))) => block.plan.push(SetVVB{arg: arg.clone(), out: out.clone(), oix: oix.clone()}), + ((_,Column::Ref(arg),ColumnIndex::Index(ix)), (_,Column::Empty,ColumnIndex::All)) => { + let src_table_brrw = src_table.borrow(); + let mut dest_table_brrw = dest_table.borrow_mut(); + dest_table_brrw.resize(1,1); + dest_table_brrw.set_kind(ValueKind::Reference); + if let Column::Ref(out) = dest_table_brrw.get_column_unchecked(0) { + block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: 0}); + } + } + ((_,Column::Ref(arg),ColumnIndex::Index(ix)), (_,Column::Empty,ColumnIndex::Index(oix))) => { + let src_table_brrw = src_table.borrow(); + let mut dest_table_brrw = dest_table.borrow_mut(); + dest_table_brrw.set_col_kind(1,ValueKind::Reference); + if let Column::Ref(out) = dest_table_brrw.get_column_unchecked(1) { + block.plan.push(SetSIxSIx{arg: arg.clone(), ix: *ix, out: out.clone(), oix: *oix}); + } + } + x => {return Err(MechError{msg: "".to_string(), id: 4922, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + + x => {return Err(MechError{msg: "".to_string(), id: 4924, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + Ok(()) + } +} + + +pub struct TableDefine{} +impl MechFunctionCompiler for TableDefine { + fn compile(&self, block: &mut Block, arguments: &Vec, out: &(TableId, TableIndex, TableIndex)) -> std::result::Result<(),MechError> { + + //Transformation::TableDefine{table_id, indices, out}' + let (_,table_id,indices) = &arguments[0]; + let (out_table_id,_,_) = &out; + // Iterate through to the last index + let mut table_id = *table_id; + for (row,column) in indices.iter().take(indices.len()-1) { + let argument = (0,table_id,vec![(row.clone(),column.clone())]); + match block.get_arg_dim(&argument)? { + TableShape::Scalar => { + let arg_col = block.get_arg_column(&argument)?; + match arg_col { + (_,Column::Ref(ref_col),_) => { + table_id = ref_col.borrow()[0].clone(); + } + x => {return Err(MechError{msg: "".to_string(), id: 4924, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, } + } + x => {return Err(MechError{msg: "".to_string(), id: 4925, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, } + } + let src_table = block.get_table(&table_id)?; + let out_table = block.get_table(out_table_id)?; + + { + let src_table_brrw = src_table.borrow(); + let mut out_table_brrw = out_table.borrow_mut(); + if (src_table_brrw.dynamic && !out_table_brrw.dynamic) || (src_table_brrw.rows == 0) { + out_table_brrw.dynamic = true; + block.dynamic_tables.insert((out_table_id.clone(),RegisterIndex::All,RegisterIndex::All)); + } + } + + let (row, column) = indices.last().unwrap(); + let argument = (0,table_id,vec![(row.clone(),column.clone())]); + match (row,column) { + // Select an entire table + (TableIndex::All, TableIndex::All) => { + match out_table_id { + TableId::Global(gid) => { + block.plan.push(CopyT{arg: src_table.clone(), out: out_table.clone()}); + } + x => {return Err(MechError{msg: "".to_string(), id: 4945, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + // Select a column by row index + (TableIndex::All, TableIndex::Index(_)) | + // Select a column by alias + (TableIndex::All, TableIndex::Alias(_)) => { + let (_, arg_col,_) = block.get_arg_column(&(0,table_id,vec![(row.clone(),column.clone())]))?; + let out_col = block.get_out_column(&(*out_table_id,TableIndex::All,TableIndex::All),arg_col.len(),arg_col.kind())?; + match (&arg_col, &out_col) { + (Column::U8(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::U8(arg), Column::U8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::U8(arg), Column::U16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::U8(arg), Column::U32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::U8(arg), Column::U64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::U8(arg), Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::U8(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::U8(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::U16(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::U16(arg), Column::U16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::U16(arg), Column::U32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::U16(arg), Column::U64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::U16(arg), Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::U16(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::U16(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::U32(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::U32(arg), Column::U32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::U32(arg), Column::U64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::U32(arg), Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::U32(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::U32(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::U64(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::U64(arg), Column::U64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::U64(arg), Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::U64(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::U64(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::U128(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::U128(arg), Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::U128(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::U128(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::I8(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::I8(arg), Column::I8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::I8(arg), Column::I16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::I8(arg), Column::I32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::I8(arg), Column::I64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::I8(arg), Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::I8(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::I8(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::I16(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::I16(arg), Column::I16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::I16(arg), Column::I32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::I16(arg), Column::I64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::I16(arg), Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::I16(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::I16(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::I32(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::I32(arg), Column::I32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::I32(arg), Column::I64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::I32(arg), Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::I32(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::I32(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::I64(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::I64(arg), Column::I64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::I64(arg), Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::I64(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::I64(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::I128(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::I128(arg), Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::I128(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::I128(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::F32(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::F32(arg), Column::U8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::F32(arg), Column::U16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::F32(arg), Column::U32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::F32(arg), Column::U64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::F32(arg), Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::F32(arg), Column::I8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::F32(arg), Column::I16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::F32(arg), Column::I32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::F32(arg), Column::I64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::F32(arg), Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::F32(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::F32(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::F64(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::F64(arg), Column::U8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::F64(arg), Column::U16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::F64(arg), Column::U32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::F64(arg), Column::U64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::F64(arg), Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::F64(arg), Column::I8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::F64(arg), Column::I16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::F64(arg), Column::I32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::F64(arg), Column::I64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::F64(arg), Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::F64(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::F64(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::Time(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::Time(arg), Column::Time(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::Speed(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::Speed(arg), Column::Speed(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::Length(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::Length(arg), Column::Length(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::String(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::String(arg), Column::String(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::Bool(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::Bool(arg), Column::Bool(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::Ref(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + (Column::Ref(arg), Column::Ref(out)) => block.plan.push(CopyVV{arg: (arg.clone(),0,arg.len()-1), out: (out.clone(),0,arg.len()-1)}), + x => {return Err(MechError{msg: "".to_string(), id: 4926, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, } + } + // Select a specific element by numberical index + (TableIndex::Index(ix), TableIndex::None) => { + let src_brrw = src_table.borrow(); + let (row,col) = src_brrw.index_to_subscript(ix-1)?; + let mut arg_col = src_brrw.get_column_unchecked(col); + let out_col = block.get_out_column(&(*out_table_id,TableIndex::All,TableIndex::All),1,arg_col.kind())?; + match (&arg_col, &out_col) { + (Column::U8(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U8(arg), Column::U8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U8(arg), Column::U16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U8(arg), Column::U32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U8(arg), Column::U64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U8(arg), Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U8(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U8(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U16(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U16(arg), Column::U16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U16(arg), Column::U32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U16(arg), Column::U64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U16(arg), Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U16(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U16(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U32(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U32(arg), Column::U32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U32(arg), Column::U64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U32(arg), Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U32(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U32(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U64(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U64(arg), Column::U64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U64(arg), Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U64(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U64(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U128(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U128(arg), Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U128(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U128(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I8(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I8(arg), Column::I8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I8(arg), Column::I16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I8(arg), Column::I32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I8(arg), Column::I64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I8(arg), Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I8(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I8(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I16(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I16(arg), Column::I16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I16(arg), Column::I32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I16(arg), Column::I64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I16(arg), Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I16(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I16(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I32(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I32(arg), Column::I32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I32(arg), Column::I64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I32(arg), Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I32(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I32(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I64(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I64(arg), Column::I64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I64(arg), Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I64(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I64(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I128(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I128(arg), Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I128(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I128(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::F32(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::F32(arg), Column::U8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::F32(arg), Column::U16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::F32(arg), Column::U32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::F32(arg), Column::U64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::F32(arg), Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::F32(arg), Column::I8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::F32(arg), Column::I16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::F32(arg), Column::I32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::F32(arg), Column::I64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::F32(arg), Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::F32(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::F32(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::F64(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::F64(arg), Column::U8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::F64(arg), Column::U16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::F64(arg), Column::U32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::F64(arg), Column::U64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::F64(arg), Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::F64(arg), Column::I8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::F64(arg), Column::I16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::F64(arg), Column::I32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::F64(arg), Column::I64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::F64(arg), Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::F64(arg), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::F64(arg), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::Time(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::Time(arg), Column::Time(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::Speed(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::Speed(arg), Column::Speed(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::Length(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::Length(arg), Column::Length(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::String(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::String(arg), Column::String(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::Bool(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::Bool(arg), Column::Bool(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::Ref(arg), Column::Any(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::Ref(arg), Column::Ref(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + x => {return Err(MechError{msg: "".to_string(), id: 4927, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, } + } + // Select a number of specific elements by numerical index or lorgical index + (TableIndex::IxTable(ix_table_id), TableIndex::None) => { + let src_brrw = src_table.borrow(); + match src_brrw.shape() { + TableShape::Row(_) => { + { + let mut out_brrw = out_table.borrow_mut(); + out_brrw.set_kind(src_brrw.kind()); + } + let ix_table = block.get_table(&ix_table_id)?; + let ix_table_brrw = ix_table.borrow(); + match ix_table_brrw.get_column_unchecked(0) { + Column::Bool(bix) => { + block.plan.push(CopyTB{arg: src_table.clone(), bix: bix.clone(), out: out_table.clone()}); + } + x => { + return Err(MechError{msg: "".to_string(), id: 4928, kind: MechErrorKind::GenericError(format!("{:?}", x))}); + } + } + } + _ => { + let (_, arg_col,arg_ix) = block.get_arg_column(&argument)?; + let out_col = { + let mut out_brrw = out_table.borrow_mut(); + out_brrw.set_kind(arg_col.kind()); + out_brrw.get_column_unchecked(0) + }; + match (&arg_col, &arg_ix, &out_col) { + (Column::U8(arg), ColumnIndex::Bool(bix), Column::U8(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::U8(arg), ColumnIndex::Index(ix), Column::U8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U8(arg), ColumnIndex::IndexCol(ix_col), Column::U8(out)) => block.plan.push(CopyVI{arg: arg.clone(), ix: ix_col.clone(), out: out.clone()}), + (Column::U16(arg), ColumnIndex::Bool(bix), Column::U16(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::U16(arg), ColumnIndex::Index(ix), Column::U16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U16(arg), ColumnIndex::IndexCol(ix_col), Column::U16(out)) => block.plan.push(CopyVI{arg: arg.clone(), ix: ix_col.clone(), out: out.clone()}), + (Column::U32(arg), ColumnIndex::Bool(bix), Column::U32(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::U32(arg), ColumnIndex::Index(ix), Column::U32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U32(arg), ColumnIndex::IndexCol(ix_col), Column::U32(out)) => block.plan.push(CopyVI{arg: arg.clone(), ix: ix_col.clone(), out: out.clone()}), + (Column::U64(arg), ColumnIndex::Bool(bix), Column::U64(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::U64(arg), ColumnIndex::Index(ix), Column::U64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U64(arg), ColumnIndex::IndexCol(ix_col), Column::U64(out)) => block.plan.push(CopyVI{arg: arg.clone(), ix: ix_col.clone(), out: out.clone()}), + (Column::U128(arg), ColumnIndex::Bool(bix), Column::U128(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::U128(arg), ColumnIndex::Index(ix), Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U128(arg), ColumnIndex::IndexCol(ix_col), Column::U128(out)) => block.plan.push(CopyVI{arg: arg.clone(), ix: ix_col.clone(), out: out.clone()}), + (Column::I8(arg), ColumnIndex::Bool(bix), Column::I8(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::I8(arg), ColumnIndex::Index(ix), Column::I8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I8(arg), ColumnIndex::IndexCol(ix_col), Column::I8(out)) => block.plan.push(CopyVI{arg: arg.clone(), ix: ix_col.clone(), out: out.clone()}), + (Column::I16(arg), ColumnIndex::Bool(bix), Column::I16(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::I16(arg), ColumnIndex::Index(ix), Column::I16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I16(arg), ColumnIndex::IndexCol(ix_col), Column::I16(out)) => block.plan.push(CopyVI{arg: arg.clone(), ix: ix_col.clone(), out: out.clone()}), + (Column::I32(arg), ColumnIndex::Bool(bix), Column::I32(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::I32(arg), ColumnIndex::Index(ix), Column::I32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I32(arg), ColumnIndex::IndexCol(ix_col), Column::I32(out)) => block.plan.push(CopyVI{arg: arg.clone(), ix: ix_col.clone(), out: out.clone()}), + (Column::I64(arg), ColumnIndex::Bool(bix), Column::I64(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::I64(arg), ColumnIndex::Index(ix), Column::I64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I64(arg), ColumnIndex::IndexCol(ix_col), Column::I64(out)) => block.plan.push(CopyVI{arg: arg.clone(), ix: ix_col.clone(), out: out.clone()}), + (Column::I128(arg), ColumnIndex::Bool(bix), Column::I128(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::I128(arg), ColumnIndex::Index(ix), Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I128(arg), ColumnIndex::IndexCol(ix_col), Column::I128(out)) => block.plan.push(CopyVI{arg: arg.clone(), ix: ix_col.clone(), out: out.clone()}), + (Column::F32(arg), ColumnIndex::Bool(bix), Column::F32(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::F32(arg), ColumnIndex::Index(ix), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::F32(arg), ColumnIndex::IndexCol(ix_col), Column::F32(out)) => block.plan.push(CopyVI{arg: arg.clone(), ix: ix_col.clone(), out: out.clone()}), + (Column::F64(arg), ColumnIndex::Bool(bix), Column::F64(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::F64(arg), ColumnIndex::Index(ix), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::F64(arg), ColumnIndex::IndexCol(ix_col), Column::F64(out)) => block.plan.push(CopyVI{arg: arg.clone(), ix: ix_col.clone(), out: out.clone()}), + x => {return Err(MechError{msg: "".to_string(), id: 4929, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, } + } + } + } + (TableIndex::IxTable(ix_table_id), TableIndex::All) => { + let src_brrw = src_table.borrow(); + for col in 0..src_brrw.cols { + let (_, arg_col,arg_ix) = block.get_arg_column(&(0,table_id,vec![(row.clone(),TableIndex::Index(col+1))]))?; + let mut out_col = { + let mut out_brrw = out_table.borrow_mut(); + out_brrw.resize(1,src_brrw.cols); + out_brrw.set_kind(src_brrw.kind()); + out_brrw.get_column_unchecked(col) + }; + match (&arg_col, &arg_ix, &out_col) { + (Column::U8(arg), ColumnIndex::Bool(bix), Column::U8(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::U8(arg), ColumnIndex::IndexCol(ix_col), Column::U8(out)) => block.plan.push(CopyVI{arg: arg.clone(), ix: ix_col.clone(), out: out.clone()}), + (Column::U16(arg), ColumnIndex::Bool(bix), Column::U16(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::U16(arg), ColumnIndex::IndexCol(ix_col), Column::U16(out)) => block.plan.push(CopyVI{arg: arg.clone(), ix: ix_col.clone(), out: out.clone()}), + (Column::U32(arg), ColumnIndex::Bool(bix), Column::U32(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::U32(arg), ColumnIndex::IndexCol(ix_col), Column::U32(out)) => block.plan.push(CopyVI{arg: arg.clone(), ix: ix_col.clone(), out: out.clone()}), + (Column::U64(arg), ColumnIndex::Bool(bix), Column::U64(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::U64(arg), ColumnIndex::IndexCol(ix_col), Column::U64(out)) => block.plan.push(CopyVI{arg: arg.clone(), ix: ix_col.clone(), out: out.clone()}), + (Column::U128(arg), ColumnIndex::Bool(bix), Column::U128(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::U128(arg), ColumnIndex::IndexCol(ix_col), Column::U128(out)) => block.plan.push(CopyVI{arg: arg.clone(), ix: ix_col.clone(), out: out.clone()}), + (Column::I8(arg), ColumnIndex::Bool(bix), Column::I8(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::I8(arg), ColumnIndex::IndexCol(ix_col), Column::I8(out)) => block.plan.push(CopyVI{arg: arg.clone(), ix: ix_col.clone(), out: out.clone()}), + (Column::I16(arg), ColumnIndex::Bool(bix), Column::I16(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::I16(arg), ColumnIndex::IndexCol(ix_col), Column::I16(out)) => block.plan.push(CopyVI{arg: arg.clone(), ix: ix_col.clone(), out: out.clone()}), + (Column::I32(arg), ColumnIndex::Bool(bix), Column::I32(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::I32(arg), ColumnIndex::IndexCol(ix_col), Column::I32(out)) => block.plan.push(CopyVI{arg: arg.clone(), ix: ix_col.clone(), out: out.clone()}), + (Column::I64(arg), ColumnIndex::Bool(bix), Column::I64(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::I64(arg), ColumnIndex::IndexCol(ix_col), Column::I64(out)) => block.plan.push(CopyVI{arg: arg.clone(), ix: ix_col.clone(), out: out.clone()}), + (Column::I128(arg), ColumnIndex::Bool(bix), Column::I128(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::I128(arg), ColumnIndex::IndexCol(ix_col), Column::I128(out)) => block.plan.push(CopyVI{arg: arg.clone(), ix: ix_col.clone(), out: out.clone()}), + (Column::F64(arg), ColumnIndex::Bool(bix), Column::F64(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::F64(arg), ColumnIndex::IndexCol(ix_col), Column::F64(out)) => block.plan.push(CopyVI{arg: arg.clone(), ix: ix_col.clone(), out: out.clone()}), + (Column::F32(arg), ColumnIndex::Bool(bix), Column::F32(out)) => block.plan.push(CopyVB{arg: arg.clone(), bix: bix.clone(), out: out.clone(), out_table: out_table.clone()}), + (Column::F32(arg), ColumnIndex::IndexCol(ix_col), Column::F32(out)) => block.plan.push(CopyVI{arg: arg.clone(), ix: ix_col.clone(), out: out.clone()}), + x => {return Err(MechError{msg: "".to_string(), id: 4930, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, } + } + } + (TableIndex::Index(row_ix), TableIndex::Alias(column_alias)) => { + let (_, arg_col,arg_ix) = block.get_arg_column(&(0,table_id,vec![(row.clone(),column.clone())]))?; + let out_col = block.get_out_column(&(*out_table_id,TableIndex::All,TableIndex::All),1,arg_col.kind())?; + match (&arg_col, &arg_ix, &out_col) { + (Column::U8(arg), ColumnIndex::Index(ix), Column::U8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U16(arg), ColumnIndex::Index(ix), Column::U16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U32(arg), ColumnIndex::Index(ix), Column::U32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U64(arg), ColumnIndex::Index(ix), Column::U64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::U128(arg), ColumnIndex::Index(ix), Column::U128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I8(arg), ColumnIndex::Index(ix), Column::I8(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I16(arg), ColumnIndex::Index(ix), Column::I16(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I32(arg), ColumnIndex::Index(ix), Column::I32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I64(arg), ColumnIndex::Index(ix), Column::I64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::I128(arg), ColumnIndex::Index(ix), Column::I128(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::F32(arg), ColumnIndex::Index(ix), Column::F32(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + (Column::F64(arg), ColumnIndex::Index(ix), Column::F64(out)) => block.plan.push(CopyVV{arg: (arg.clone(),*ix,*ix), out: (out.clone(),0,0)}), + + x => {return Err(MechError{msg: "".to_string(), id: 4931, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + } + x => {return Err(MechError{msg: "".to_string(), id: 4932, kind: MechErrorKind::GenericError(format!("{:?}", x))});}, + } + Ok(()) + } +} + + +#[derive(Debug)] +pub struct FollowedBy { + pub arg: ArgTable, pub out: TableId, pub database: Rc>, +} + +impl MechFunction for FollowedBy +{ + fn solve(&self) { + let mut changes = vec![]; + let table_brrw = self.arg.borrow(); + let mut db_brrw = self.database.borrow_mut(); + for i in 1..=table_brrw.rows { + for j in 1..=table_brrw.cols { + let row = TableIndex::Index(i); + let col = TableIndex::Index(j); + let value = table_brrw.get(&row,&col).unwrap(); + changes.push((row, col, value)) + } + } + db_brrw.transaction_queue.push(vec![Change::Set((*self.out.unwrap(), changes))]) + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + +pub struct TableFollowedBy{} +impl MechFunctionCompiler for TableFollowedBy { + fn compile(&self, block: &mut Block, arguments: &Vec, out: &(TableId, TableIndex, TableIndex)) -> std::result::Result<(),MechError> { + let (_,src_id,src_indices) = &arguments[0]; + let (out_id,_,_) = out; + let src_table = block.get_table(src_id)?; + block.plan.push(FollowedBy{arg: src_table.clone(), out: out_id.clone(), database: block.global_database.clone()}); + Ok(()) + } +} \ No newline at end of file diff --git a/src/core/src/lib.rs b/src/core/src/lib.rs new file mode 100644 index 0000000..24b9bfc --- /dev/null +++ b/src/core/src/lib.rs @@ -0,0 +1,567 @@ +#![feature(get_mut_unchecked)] +#![feature(concat_idents)] +#![allow(warnings)] +#![feature(iter_intersperse)] +#![feature(drain_filter)] + +extern crate core as rust_core; +extern crate hashbrown; +#[macro_use] +extern crate serde_derive; +extern crate serde; +extern crate num_traits; +extern crate ed25519_dalek; +extern crate rand; + +#[macro_use] +extern crate lazy_static; +extern crate seahash; +extern crate indexmap; +use std::rc::Rc; +use std::cell::RefCell; +use std::fmt; +use num_traits::*; +use std::ops::*; + + +mod column; +mod value; +mod error; +mod table; +mod transformation; +mod database; +mod user_functions; +#[cfg(feature = "stdlib")] +pub mod function; +mod block; +mod core; +mod schedule; +pub mod nodes; +#[cfg(feature = "stdlib")] +mod capabilities; + +pub use self::core::Core; +pub use self::table::*; +pub use self::column::*; +pub use self::value::*; +pub use self::error::*; +pub use self::transformation::Transformation; +pub use self::database::*; +#[cfg(feature = "stdlib")] +pub use self::function::*; +pub use self::block::*; +pub use self::schedule::*; +pub use self::user_functions::*; +#[cfg(feature = "stdlib")] +pub use self::capabilities::*; + + +pub type BlockId = u64; +pub type ArgumentName = u64; +pub type Argument = (ArgumentName, TableId, Vec<(TableIndex, TableIndex)>); +pub type Out = (TableId, TableIndex, TableIndex); + + +pub type Arg = ColumnV; +pub type ArgTable = Rc>; +pub type OutTable = Rc>; + +pub trait MechNumArithmetic: Add + + Sub + + Div + + Mul + + Pow + + AddAssign + + SubAssign + + MulAssign + + DivAssign + + Sized {} + +#[derive(Debug, Clone)] +pub enum SectionElement { + Block(Block), + UserFunction(UserFunction), +} + +pub trait MechFunctionCompiler { + fn compile(&self, block: &mut Block, arguments: &Vec, out: &Out) -> std::result::Result<(),MechError>; +} + +pub trait MechFunction { + fn solve(&self); + fn to_string(&self) -> String; +} + +pub fn resize_one(block: &mut Block, out: &Out) -> std::result::Result<(),MechError> { + let (out_table_id,_,_) = out; + let out_table = block.get_table(out_table_id)?; + let mut out_brrw = out_table.borrow_mut(); + out_brrw.resize(1,1); + Ok(()) +} + +pub trait Machine { + fn name(&self) -> String; + fn id(&self) -> u64; + fn on_change(&mut self, table: &Table) -> Result<(), MechError>; +} + + +#[derive(Clone, PartialEq, PartialOrd, Serialize, Deserialize)] +pub struct MechString { + chars: Vec, +} + +impl MechString { + + pub fn new() -> MechString { + MechString { + chars: vec![], + } + } + + pub fn from_string(string: String) -> MechString { + MechString { + chars: string.chars().collect::>() + } + } + + pub fn from_str(string: &str) -> MechString { + MechString { + chars: string.chars().collect::>() + } + } + + pub fn from_chars(chars: &Vec) -> MechString { + MechString { + chars: chars.clone(), + } + } + + pub fn len(&self) -> usize { + self.chars.iter().count() + } + + pub fn to_string(&self) -> String { + self.chars.iter().collect::() + } + + pub fn hash(&self) -> u64 { + hash_chars(&self.chars) + } +} + +impl fmt::Debug for MechString { + #[inline] + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f,"{}",self.to_string())?; + Ok(()) + } +} + +pub fn hash_chars(input: &Vec) -> u64 { + seahash::hash(input.iter().map(|s| String::from(*s)).collect::().as_bytes()) & 0x00FFFFFFFFFFFFFF +} + +pub fn hash_bytes(input: &Vec) -> u64 { + seahash::hash(input) & 0x00FFFFFFFFFFFFFF +} + +pub fn hash_str(input: &str) -> u64 { + seahash::hash(input.to_string().as_bytes()) & 0x00FFFFFFFFFFFFFF +} + +pub fn humanize(hash: &u64) -> String { + let bytes: [u8; 8] = hash.to_be_bytes(); + let mut string = "".to_string(); + let mut ix = 0; + for byte in bytes.iter() { + if ix % 2 == 0 { + ix += 1; + continue; + } + string.push_str(&WORDLIST[*byte as usize]); + if ix < 7 { + string.push_str("-"); + } + ix += 1; + } + string +} + + +pub const WORDLIST: &[&str;256] = &[ + "nil", "ama", "ine", "ska", "pha", "gel", "art", + "ona", "sas", "ist", "aus", "pen", "ust", "umn", + "ado", "con", "loo", "man", "eer", "lin", "ium", + "ack", "som", "lue", "ird", "avo", "dog", "ger", + "ter", "nia", "bon", "nal", "ina", "pet", "cat", + "ing", "lie", "ken", "fee", "ola", "old", "rad", + "met", "cut", "azy", "cup", "ota", "dec", "del", + "elt", "iet", "don", "ble", "ear", "rth", "eas", + "war", "eig", "tee", "ele", "emm", "ene", "qua", + "tst", "fan", "fif", "fil", "fin", "fis", "fiv", + "flo", "for", "foo", "fou", "fot", "fox", "fre", + "fri", "fru", "gee", "gia", "glu", "fol", "gre", + "ham", "hap", "har", "haw", "hel", "hig", "hot", + "hyd", "ida", "ill", "ind", "ini", "ink", "iwa", + "and", "ite", "jer", "jig", "joh", "jul", "uly", + "kan", "ket", "kil", "kin", "kit", "lac", "lak", + "lem", "ard", "lim", "lio", "lit", "lon", "lou", + "low", "mag", "nes", "mai", "gam", "arc", "mar", + "mao", "mas", "may", "mex", "mic", "mik", "ril", + "min", "mir", "mis", "mio", "mob", "moc", "ech", + "moe", "tan", "oon", "ain", "mup", "sic", "neb", + "une", "net", "nev", "nin", "een", "nit", "nor", + "nov", "nut", "oct", "ohi", "okl", "one", "ora", + "ges", "ore", "osc", "ove", "oxy", "pap", "par", + "pey", "pip", "piz", "plu", "pot", "pri", "pur", + "que", "uqi", "qui", "red", "riv", "rob", "roi", + "rug", "sad", "sal", "sat", "sep", "sev", "eve", + "sha", "sie", "sin", "sik", "six", "sit", "sky", + "soc", "sod", "sol", "sot", "tir", "ker", "spr", + "sta", "ste", "mam", "mer", "swe", "tab", "tag", + "see", "nis", "tex", "thi", "the", "tim", "tri", + "twe", "ent", "two", "unc", "ess", "uni", "ura", + "veg", "ven", "ver", "vic", "vid", "vio", "vir", + "was", "est", "whi", "hit", "iam", "win", "his", + "wis", "olf", "wyo", "ray", "ank", "yel", "zeb", + "ulu", "fix", "gry", "hol", "jup", "lam", "pas", + "rom", "sne", "ten", "uta"]; + + +#[derive(Debug)] +pub enum LineKind { + Title((String,String)), + String(String), + Table(BoxTable), + Separator, +} + + +#[derive(Debug)] +pub struct BoxTable { + pub title: String, + pub rows: usize, + pub cols: usize, + pub column_aliases: Vec, + pub column_kinds: Vec, + pub strings: Vec>, + pub width: usize, + pub column_widths: Vec, +} + +impl BoxTable { + + pub fn new(table: &Table) -> BoxTable { + let table_name: String = if let Some(mstring) = table.dictionary.borrow().get(&table.id) { + format!("#{}", mstring.to_string()) + } else { + format!("{}", humanize(&table.id)) + }; + let dynamic = if table.dynamic { + "+" + } else { + "" + }; + let title = format!("{}{} ({} x {})", table_name,dynamic,table.rows,table.cols); + let mut strings: Vec> = vec![vec!["".to_string(); table.rows]; table.cols]; + let mut column_widths = vec![0; table.cols]; + let mut column_aliases = Vec::new(); + let mut column_kinds = Vec::new(); + for (col,(alias,ix)) in table.col_map.iter().enumerate() { + if let Some(alias_string) = table.dictionary.borrow().get(alias) { + let chars = alias_string.len(); + if chars > column_widths[col] { + column_widths[col] = chars; + } + let alias = format!("{}", alias_string.to_string()); + column_aliases.push(alias); + } else { + let alias = format!("{}", humanize(alias)); + let chars = alias.len(); + if chars > column_widths[col] { + column_widths[col] = chars; + } + column_aliases.push(alias); + } + } + + for (col,kind) in table.col_kinds.iter().enumerate() { + let kind_string = format!("{:?}", kind); + let chars = kind_string.len(); + if chars > column_widths[col] { + column_widths[col] = chars; + } + column_kinds.push(kind_string); + } + + for row in 0..table.rows { + for col in 0..table.cols { + let value_string = match table.get_raw(row,col) { + Ok(v) => format!("{:?}", v), + Err(x) => format!("{:?}",x), + }; + let chars = value_string.chars().count(); + if chars > column_widths[col] { + column_widths[col] = chars; + } + strings[col][row] = value_string; + } + } + let width = column_widths.iter().sum(); + if width == 0 {column_widths.push(0);} + BoxTable { + title, + width, + rows: table.rows, + cols: table.cols, + column_aliases, + column_kinds, + strings, + column_widths, + } + } + +} + + +pub struct BoxPrinter { + pub lines: Vec, + width: usize, + drawing: String, +} + +impl BoxPrinter { + + pub fn new() -> BoxPrinter { + BoxPrinter { + lines: Vec::new(), + width: 30, + drawing: "\n┌─┐\n│ │\n└─┘\n".to_string(), + } + } + + pub fn add_line(&mut self, lines: String) { + for line in lines.lines() { + let chars = line.chars().count(); + if chars > self.width { + self.width = chars; + } + self.lines.push(LineKind::String(line.to_string())); + } + self.render_box(); + } + + pub fn add_title(&mut self, icon: &str, lines: &str) { + self.add_separator(); + for line in lines.lines() { + let chars = line.chars().count() + 3; + if chars > self.width { + self.width = chars; + } + self.lines.push(LineKind::Title((icon.to_string(),line.to_string()))); + } + self.render_box(); + self.add_separator(); + } + + pub fn add_header(&mut self, text: &str) { + self.add_separator(); + self.add_line(text.to_string()); + self.add_separator(); + } + + pub fn add_separator(&mut self) { + if self.lines.len() > 0 { + self.lines.push(LineKind::Separator); + self.render_box(); + } + } + + pub fn add_table(&mut self, table: &Table) { + let bt = BoxTable::new(table); + self.width = if bt.width + bt.cols > self.width { + bt.width + bt.cols - 1 + } else { + self.width + }; + self.lines.push(LineKind::Table(bt)); + self.render_box(); + } + + fn render_box(&mut self) { + let top = "\n╭".to_string() + &BoxPrinter::format_repeated_char("─", self.width) + &"╮\n".to_string(); + let mut middle = "".to_string(); + let mut bottom = "╰".to_string() + &BoxPrinter::format_repeated_char("─", self.width) + &"╯\n".to_string(); + + for line in &self.lines { + + match line { + LineKind::Separator => { + let boxed_line = "├".to_string() + &BoxPrinter::format_repeated_char("─", self.width) + &"┤\n".to_string(); + middle += &boxed_line; + } + LineKind::Table(table) => { + let mut column_widths = table.column_widths.clone(); + if table.width + table.cols < self.width { + let mut diff = self.width - (table.width + table.cols) + 1; + let mut ix = 0; + while diff > 0 { + let c = column_widths.len(); + column_widths[ix % c] += 1; + ix += 1; + diff -= 1; + } + } + if self.width < table.title.chars().count() { + self.width = table.title.chars().count() + 10; + let col_width = self.width / table.cols; + for (ix,mut w) in column_widths.iter_mut().enumerate() { + *w = col_width; + } + } + // Print table header + middle += "│"; + middle += &table.title; + middle += &BoxPrinter::format_repeated_char(" ", self.width - table.title.chars().count()); + middle += "│\n"; + if table.column_aliases.len() > 0 { + middle += "├"; + for col in 0..table.cols-1 { + middle += &BoxPrinter::format_repeated_char("─", column_widths[col]); + middle += "┬"; + } + middle += &BoxPrinter::format_repeated_char("─", *column_widths.last().unwrap()); + middle += "┤\n"; + let mut boxed_line = "│".to_string(); + for col in 0..table.cols { + let cell = &table.column_aliases[col]; + let chars = cell.chars().count(); + boxed_line += &cell; + boxed_line += &BoxPrinter::format_repeated_char(" ", column_widths[col] - chars); + boxed_line += "│"; + } + boxed_line += &"\n".to_string(); + middle += &boxed_line; + } + if table.cols > 0 { + if table.column_kinds.len() > 0 { + middle += "├"; + for col in 0..table.cols-1 { + middle += &BoxPrinter::format_repeated_char("─", column_widths[col]); + middle += "┼"; + } + middle += &BoxPrinter::format_repeated_char("─", *column_widths.last().unwrap()); + middle += "┤\n"; + let mut boxed_line = "│".to_string(); + for col in 0..table.cols { + let cell = &table.column_kinds[col]; + let chars = cell.chars().count(); + boxed_line += &cell; + boxed_line += &BoxPrinter::format_repeated_char(" ", column_widths[col] - chars); + boxed_line += "│"; + } + boxed_line += &"\n".to_string(); + middle += &boxed_line; + } + middle += "├"; + for col in 0..table.cols-1 { + middle += &BoxPrinter::format_repeated_char("─", column_widths[col]); + middle += "┼"; + } + middle += &BoxPrinter::format_repeated_char("─", *column_widths.last().unwrap()); + middle += "┤\n"; + } + if table.cols == 0 { + continue; + } + // Print at most 10 rows + for row in (0..table.rows).take(10) { + let mut boxed_line = "│".to_string(); + for col in 0..table.cols { + let cell = &table.strings[col][row]; + let chars = cell.chars().count(); + boxed_line += &cell; + boxed_line += &BoxPrinter::format_repeated_char(" ", column_widths[col] - chars); + boxed_line += "│"; + } + boxed_line += &"\n".to_string(); + middle += &boxed_line; + } + if table.rows > 10 { + // Print ... + if table.rows > 11 { + let mut boxed_line = "│".to_string(); + for col in 0..table.cols { + boxed_line += "..."; + boxed_line += &BoxPrinter::format_repeated_char(" ", column_widths[col] - 3); + boxed_line += "│"; + } + boxed_line += &"\n".to_string(); + middle += &boxed_line; + } + // Print last row + let mut boxed_line = "│".to_string(); + for col in 0..table.cols { + let cell = &table.strings[col][table.rows - 1]; + let chars = cell.chars().count(); + boxed_line += &cell; + boxed_line += &BoxPrinter::format_repeated_char(" ", column_widths[col] - chars); + boxed_line += "│"; + } + boxed_line += &"\n".to_string(); + middle += &boxed_line; + } + bottom = "╰".to_string(); + for col in 0..table.cols-1 { + bottom += &BoxPrinter::format_repeated_char("─", column_widths[col]); + bottom += &"┴".to_string(); + } + bottom += &BoxPrinter::format_repeated_char("─", *column_widths.last().unwrap()); + bottom += &"╯\n".to_string(); + } + LineKind::String(line) => { + let chars = line.chars().count(); + if self.width >= chars { + let boxed_line = "│".to_string() + &line + &BoxPrinter::format_repeated_char(" ", self.width - chars) + &"│\n".to_string(); + middle += &boxed_line; + } else { + println!("Line too long: {:?}", line); + } + } + LineKind::Title((icon,line)) => { + let chars = line.chars().count() + 3; + if self.width >= chars { + let boxed_line = "│".to_string() + &icon + " " + &line + &BoxPrinter::format_repeated_char(" ", self.width - chars) + &"│\n".to_string(); + middle += &boxed_line; + } else { + println!("Line too long: {:?}", line); + } + } + } + } + self.drawing = top + &middle + ⊥ + } + + pub fn print(&self) -> String { + self.drawing.clone() + } + + fn format_repeated_char(to_print: &str, n: usize) -> String { + let mut s = "".to_string(); + for _ in 0..n { + s = format!("{}{}",s,to_print); + } + s + } + +} + +impl fmt::Debug for BoxPrinter { + #[inline] + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f,"{}",self.drawing)?; + Ok(()) + } +} diff --git a/src/core/src/nodes.rs b/src/core/src/nodes.rs new file mode 100644 index 0000000..a562c23 --- /dev/null +++ b/src/core/src/nodes.rs @@ -0,0 +1,692 @@ +use crate::*; + +use std::cmp::Ordering; + +#[derive(Clone, Copy, Ord, PartialEq, Eq, Hash, Serialize, Deserialize)] +pub struct SourceLocation { + pub row: usize, + pub col: usize, +} + +impl PartialOrd for SourceLocation { + fn partial_cmp(&self, other: &Self) -> Option { + if self.row < other.row { + Some(Ordering::Less) + } else if self.row > other.row { + Some(Ordering::Greater) + } else { + self.col.partial_cmp(&other.col) + } + } +} + +impl fmt::Debug for SourceLocation { + #[inline] + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{}:{}", self.row, self.col); + Ok(()) + } +} + +#[derive(Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)] +pub struct SourceRange { + pub start: SourceLocation, + pub end: SourceLocation, +} + +/// Coordinates in SourceRange are 1-indexed, i.e. they directly translate +/// human's view to line and column numbers. Having value 0 means the +/// range is not initialized. +impl Default for SourceRange { + fn default() -> Self { + SourceRange { + start: SourceLocation { row: 0, col: 0 }, + end: SourceLocation { row: 0, col: 0 }, + } + } +} + +impl fmt::Debug for SourceRange { + #[inline] + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "[{:?}, {:?})", self.start, self.end); + Ok(()) + } +} + +pub fn merge_src_range(r1: SourceRange, r2: SourceRange) -> SourceRange { + SourceRange { + start: r1.start.min(r2.start), + end: r2.end.max(r2.end), + } +} + +#[derive(Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] +pub enum AstNode { + Root { children: Vec }, + Fragment { children: Vec }, + Head { children: Vec }, + Body { children: Vec }, + Block { children: Vec, src_range: SourceRange }, + Statement { children: Vec, src_range: SourceRange }, + Expression { children: Vec }, + MathExpression { children: Vec }, + SelectExpression { children: Vec }, + Data { children: Vec }, + Whenever { children: Vec }, + Wait { children: Vec }, + Until { children: Vec }, + SetData { children: Vec }, + SplitData { children: Vec }, + FlattenData { children: Vec }, + Binding { children: Vec }, + FunctionBinding { children: Vec }, + UserFunction { children: Vec }, + FunctionBody { children: Vec }, + FunctionArgs { children: Vec }, + FunctionInput { children: Vec }, + FunctionOutput { children: Vec }, + DotIndex { children: Vec }, + Swizzle { children: Vec }, + SubscriptIndex { children: Vec }, + Range, + VariableDefine { children: Vec }, + TableDefine { children: Vec }, + FollowedBy { children: Vec }, + AsyncAssign { children: Vec }, + TableSelect { children: Vec }, + EmptyTable { children: Vec }, + InlineTable { children: Vec }, + TableHeader { children: Vec }, + Attribute { children: Vec }, + TableRow { children: Vec }, + Comment { children: Vec }, + KindAnnotation { children: Vec }, + AddRow { children: Vec }, + Transformation { children: Vec }, + Quantity { children: Vec }, + Token { token: Token, chars: Vec, src_range: SourceRange }, + Add, + Subtract, + Multiply, + MatrixMultiply, + Divide, + Exponent, + LessThan, + GreaterThan, + GreaterThanEqual, + LessThanEqual, + Equal, + NotEqual, + And, + Or, + Xor, + AddUpdate, + SubtractUpdate, + MultiplyUpdate, + DivideUpdate, + ExponentUpdate, + SelectAll, + Empty, + True, + False, + ReshapeColumn, + RationalNumber { children: Vec }, + Paragraph { children: Vec }, + UnorderedList { children: Vec }, + ListItem { children: Vec }, + InlineCode { children: Vec }, + CodeBlock { children: Vec }, + InlineMechCode { children: Vec }, + MechCodeBlock { children: Vec }, + Null, + Transpose, + Program { title: Option>, children: Vec }, + Section { title: Option>, level: usize, children: Vec }, + WheneverIndex { children: Vec }, + SelectData { name: Vec, id: TableId, children: Vec, src_range: SourceRange }, + UpdateData { name: Vec, children: Vec, src_range: SourceRange }, + TableColumn { children: Vec }, + Function { name: Vec, children: Vec, src_range: SourceRange }, + Define { name: Vec, id: u64, src_range: SourceRange }, + AnonymousTableDefine { children: Vec }, + AnonymousMatrixDefine { children: Vec }, + Identifier { name: Vec, id: u64, src_range: SourceRange }, + Table { name: Vec, id: u64, src_range: SourceRange }, + String { text: Vec, src_range: SourceRange }, + NumberLiteral { kind: u64, bytes: Vec, src_range: SourceRange }, + SectionTitle { text: Vec, src_range: SourceRange }, + Title { text: Vec, level: usize, src_range: SourceRange }, + ParagraphText { text: Vec, src_range: SourceRange }, + TransposeSelect { children: Vec }, + Incomplete { children: Vec, src_range: SourceRange }, + Error, +} + +impl fmt::Debug for AstNode { + #[inline] + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + print_ast_node(self, 1, f); + Ok(()) + } +} + +pub fn print_ast_node(node: &AstNode, level: usize, f: &mut fmt::Formatter) { + spacer(level, f); + let children: Option<&Vec> = match node { + AstNode::Root{children} => { write!(f, "Root\n").ok(); Some(children) }, + AstNode::Fragment{children} => { write!(f, "Fragment\n").ok(); Some(children) }, + AstNode::Program{title, children} => { write!(f, "Program({:?})\n", title).ok(); Some(children) }, + AstNode::Head{children} => { write!(f, "Head\n").ok(); Some(children) }, + AstNode::Body{children} => { write!(f, "Body\n").ok(); Some(children) }, + AstNode::VariableDefine{children} => { write!(f, "VariableDefine\n").ok(); Some(children) }, + AstNode::TableColumn{children} => { write!(f, "TableColumn\n").ok(); Some(children) }, + AstNode::Binding{children} => { write!(f, "Binding\n").ok(); Some(children) }, + AstNode::FunctionBinding{children} => { write!(f, "FunctionBinding\n").ok(); Some(children) }, + AstNode::TableDefine{children} => { write!(f, "TableDefine\n").ok(); Some(children) }, + AstNode::FollowedBy{children} => { write!(f, "FollowedBy\n").ok(); Some(children) }, + AstNode::AsyncAssign{children} => { write!(f, "AsyncAssign\n").ok(); Some(children) }, + AstNode::TableSelect{children} => { write!(f, "TableSelect\n").ok(); Some(children) }, + AstNode::AnonymousTableDefine{children} => { write!(f, "AnonymousTableDefine\n").ok(); Some(children) }, + AstNode::EmptyTable{children} => { write!(f, "EmptyTable\n").ok(); Some(children) }, + AstNode::InlineTable{children} => { write!(f, "InlineTable\n").ok(); Some(children) }, + AstNode::TableHeader{children} => { write!(f, "TableHeader\n").ok(); Some(children) }, + AstNode::Attribute{children} => { write!(f, "Attribute\n").ok(); Some(children) }, + AstNode::TableRow{children} => { write!(f, "TableRow\n").ok(); Some(children) }, + AstNode::AddRow{children} => { write!(f, "AddRow\n").ok(); Some(children) }, + AstNode::Section{title, level, children} => { write!(f, "Section({:?} {})\n", title, level).ok(); Some(children)}, + AstNode::Block{children, src_range} => { write!(f, "Block(@ {:?})\n", src_range).ok(); Some(children) }, + AstNode::Statement{children, src_range} => { write!(f, "Statement(@ {:?})\n", src_range).ok(); Some(children) }, + AstNode::SetData{children} => { write!(f, "SetData\n").ok(); Some(children) }, + AstNode::UpdateData{name, children, src_range} => { write!(f, "UpdateData({:?} @ {:?})\n", name, src_range).ok(); Some(children) }, + AstNode::SplitData{children} => { write!(f, "SplitData\n").ok(); Some(children) }, + AstNode::FlattenData{children} => { write!(f, "FlattenData\n").ok(); Some(children) }, + AstNode::Data{children} => { write!(f, "Data\n").ok(); Some(children) }, + AstNode::KindAnnotation{children} => { write!(f, "KindAnnotation\n").ok(); Some(children) }, + AstNode::Whenever{children} => { write!(f, "Whenever\n").ok(); Some(children) }, + AstNode::WheneverIndex{children} => { write!(f, "WheneverIndex\n").ok(); Some(children) }, + AstNode::Wait{children} => { write!(f, "Wait\n").ok(); Some(children) }, + AstNode::Until{children} => { write!(f, "Until\n").ok(); Some(children) }, + AstNode::SelectData{name, id, children, src_range} => { write!(f, "SelectData({:?} {:?} @ {:?}))\n", name, id, src_range).ok(); Some(children) }, + AstNode::DotIndex{children} => { write!(f, "DotIndex\n").ok(); Some(children) }, + AstNode::Swizzle{children} => { write!(f, "Swizzle\n").ok(); Some(children) }, + AstNode::SubscriptIndex{children} => { write!(f, "SubscriptIndex\n").ok(); Some(children) }, + AstNode::Range => { write!(f, "Range\n").ok(); None }, + AstNode::Expression{children} => { write!(f, "Expression\n").ok(); Some(children) }, + AstNode::Function{name, children, src_range} => { write!(f, "Function({:?} @ {:?})\n", name, src_range).ok(); Some(children) }, + AstNode::UserFunction{children} => { write!(f, "UserFunction\n").ok(); Some(children) }, + AstNode::FunctionBody{children} => { write!(f, "FunctionBody\n").ok(); Some(children) }, + AstNode::FunctionArgs{children} => { write!(f, "FunctionArgs\n").ok(); Some(children) }, + AstNode::UserFunction{children} => { write!(f, "Expression\n").ok(); Some(children) }, + AstNode::FunctionInput{children} => { write!(f, "FunctionInput\n").ok(); Some(children) }, + AstNode::FunctionOutput{children} => { write!(f, "FunctionOutput\n").ok(); Some(children) }, + AstNode::MathExpression{children} => { write!(f, "MathExpression\n").ok(); Some(children) }, + AstNode::Comment{children} => { write!(f, "Comment\n").ok(); Some(children) }, + AstNode::SelectExpression{children} => { write!(f, "SelectExpression\n").ok(); Some(children) }, + AstNode::Transformation{children} => { write!(f, "Transformation\n").ok(); Some(children) }, + AstNode::Identifier{name, id, src_range} => { write!(f, "Identifier({:?}({}) @ {:?})\n", name, humanize(id), src_range).ok(); None }, + AstNode::String{text, src_range} => { write!(f, "String({:?} @ {:?})\n", text, src_range).ok(); None }, + AstNode::RationalNumber{children} => { write!(f, "RationalNumber\n").ok(); Some(children) }, + AstNode::NumberLiteral{kind, bytes, src_range} => { write!(f, "NumberLiteral({:?} @ {:?})\n", bytes, src_range).ok(); None }, + AstNode::Quantity{children} => { write!(f, "Quantity\n").ok(); Some(children) }, + AstNode::Table{name, id, src_range} => { write!(f, "Table(#{:?}({:#x}) @ {:?})\n", name, id, src_range).ok(); None }, + AstNode::Define{name, id, src_range} => { write!(f, "Define(#{:?}({:?}) @ {:?})\n", name, id, src_range).ok(); None }, + AstNode::Token{token, chars, src_range} => { write!(f, "Token({:?} @ {:?})\n", token, src_range).ok(); None }, + AstNode::SelectAll => { write!(f, "SelectAll\n").ok(); None }, + AstNode::LessThan => { write!(f, "LessThan\n").ok(); None }, + AstNode::GreaterThan => { write!(f, "GreaterThan\n").ok(); None }, + AstNode::GreaterThanEqual => { write!(f, "GreaterThanEqual\n").ok(); None }, + AstNode::LessThanEqual => { write!(f, "LessThanEqual\n").ok(); None }, + AstNode::Equal => { write!(f, "Equal\n").ok(); None }, + AstNode::NotEqual => { write!(f, "NotEqual\n").ok(); None }, + AstNode::Empty => { write!(f, "Empty\n").ok(); None }, + AstNode::True => { write!(f, "True\n").ok(); None }, + AstNode::False => { write!(f, "False\n").ok(); None }, + AstNode::Null => { write!(f, "Null\n").ok(); None }, + AstNode::ReshapeColumn => { write!(f, "ReshapeColumn\n").ok(); None }, + AstNode::Add => { write!(f, "Add\n").ok(); None }, + AstNode::Subtract => { write!(f, "Subtract\n").ok(); None }, + AstNode::Multiply => { write!(f, "Multiply\n").ok(); None }, + AstNode::MatrixMultiply => { write!(f, "MatrixMultiply\n").ok(); None }, + AstNode::Divide => { write!(f, "Divide\n").ok(); None }, + AstNode::Exponent => { write!(f, "Exponent\n").ok(); None }, + AstNode::AddUpdate => { write!(f, "AddUpdate\n").ok(); None }, + AstNode::SubtractUpdate => { write!(f, "SubtractUpdate\n").ok(); None }, + AstNode::MultiplyUpdate => { write!(f, "MultiplyUpdate\n").ok(); None }, + AstNode::DivideUpdate => { write!(f, "DivideUpdate\n").ok(); None }, + AstNode::ExponentUpdate => { write!(f, "ExponentUpdate\n").ok(); None }, + AstNode::Transpose => { write!(f, "Transpose\n").ok(); None }, + AstNode::TransposeSelect{children} => { write!(f, "TransposeSelect\n").ok(); Some(children) }, + AstNode::Title{text, level, src_range} => { write!(f, "Title({:?} {} @ {:?})\n", text, level, src_range).ok(); None }, + AstNode::ParagraphText{text, src_range} => { write!(f, "ParagraphText({:?} @ {:?})\n", text, src_range).ok(); None }, + AstNode::UnorderedList{children} => { write!(f, "UnorderedList\n").ok(); Some(children) }, + AstNode::ListItem{children} => { write!(f, "ListItem\n").ok(); Some(children) }, + AstNode::Paragraph{children} => { write!(f, "Paragraph\n").ok(); Some(children) }, + AstNode::InlineCode{children} => { write!(f, "InlineCode\n").ok(); Some(children) }, + AstNode::CodeBlock{children} => { write!(f, "CodeBlock\n").ok(); Some(children) }, + AstNode::InlineMechCode{children} => { write!(f, "InlineMechCode\n").ok(); Some(children) }, + AstNode::MechCodeBlock{children} => { write!(f, "MechCodeBlock\n").ok(); Some(children) }, + AstNode::Incomplete{children, src_range} => { write!(f, "Incomplete(@ {:?})\n", src_range).ok(); Some(children) }, + AstNode::Error => { write!(f, "Error\n").ok(); None }, + _ => { write!(f, "Unhandled Compiler Node").ok(); None }, + }; + + match children { + Some(childs) => { + for child in childs { + print_ast_node(child, level + 1,f) + } + }, + _ => (), + } +} + +#[derive(Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] +pub enum ParserNode { + Root { children: Vec }, + Fragment { children: Vec }, + Head { children: Vec }, + Body { children: Vec }, + Block { children: Vec, src_range: SourceRange }, + Statement { children: Vec, src_range: SourceRange }, + Expression { children: Vec }, + MathExpression { children: Vec }, + SelectExpression { children: Vec }, + Data { children: Vec }, + Whenever { children: Vec }, + Wait { children: Vec }, + Until { children: Vec }, + SetData { children: Vec }, + SplitData { children: Vec }, + FlattenData { children: Vec }, + Binding { children: Vec }, + FunctionBinding { children: Vec }, + UserFunction { children: Vec }, + FunctionBody { children: Vec }, + FunctionArgs { children: Vec }, + FunctionInput { children: Vec }, + FunctionOutput { children: Vec }, + DotIndex { children: Vec }, + Swizzle { children: Vec }, + SubscriptIndex { children: Vec }, + Range, + VariableDefine { children: Vec }, + TableDefine { children: Vec }, + FollowedBy { children: Vec }, + AsyncAssign { children: Vec }, + TableSelect { children: Vec }, + EmptyTable { children: Vec }, + InlineTable { children: Vec }, + TableHeader { children: Vec }, + Attribute { children: Vec }, + TableRow { children: Vec }, + Comment { children: Vec }, + KindAnnotation { children: Vec }, + AddRow { children: Vec }, + Transformation { children: Vec }, + Quantity { children: Vec }, + Token { token: Token, chars: Vec, src_range: SourceRange }, + Add, + Subtract, + Multiply, + MatrixMultiply, + Divide, + Exponent, + LessThan, + GreaterThan, + GreaterThanEqual, + LessThanEqual, + Equal, + NotEqual, + And, + Or, + Xor, + AddUpdate, + SubtractUpdate, + MultiplyUpdate, + DivideUpdate, + ExponentUpdate, + SelectAll, + Empty, + True, + False, + ReshapeColumn, + RationalNumber { children: Vec }, + Paragraph { children: Vec }, + UnorderedList { children: Vec }, + ListItem { children: Vec }, + InlineCode { children: Vec }, + CodeBlock { children: Vec }, + InlineMechCode { children: Vec }, + MechCodeBlock { children: Vec }, + Null, + Transpose, + Select { children: Vec }, + Insert { children: Vec }, + Column { children: Vec }, + IdentifierOrConstant { children: Vec }, + Table { children: Vec }, + Number { children: Vec }, + DigitOrComma { children: Vec }, + FilterExpression { children: Vec }, + Comparator { children: Vec }, + InfixOperation { children: Vec }, + Repeat { children: Vec }, + TableIdentifier { children: Vec }, + Identifier { children: Vec }, + Alpha { children: Vec }, + SubscriptList { children: Vec }, + Subscript { children: Vec }, + LogicOperator { children: Vec }, + LogicExpression { children: Vec }, + Index { children: Vec }, + UpdateData { children: Vec }, + SetOperator { children: Vec }, + AddOperator { children: Vec }, + WatchOperator { children: Vec }, + Equality { children: Vec }, + AnonymousTable { children: Vec }, + AnonymousMatrix { children: Vec }, + Constant { children: Vec }, + Infix { children: Vec }, + Program { children: Vec }, + Title { children: Vec }, + Subtitle { children: Vec, level: usize }, + StatementOrExpression { children: Vec }, + DataOrConstant { children: Vec }, + IdentifierCharacter { children: Vec }, + Node { children: Vec }, + NewLineOrEnd { children: Vec }, + Alphanumeric { children: Vec }, + ParagraphText { children: Vec }, + FormattedText { children: Vec }, + Bold { children: Vec }, + Italic { children: Vec }, + Hyperlink { children: Vec }, + BlockQuote { children: Vec }, + String { children: Vec }, + StringInterpolation { children: Vec }, + Word { children: Vec }, + Emoji { children: Vec }, + Section { children: Vec, title: Option> }, + ProseOrCode { children: Vec }, + Whitespace { children: Vec }, + SpaceOrTab { children: Vec }, + NewLine { children: Vec }, + Text { children: Vec }, + Punctuation { children: Vec }, + L0Infix { children: Vec }, + L1Infix { children: Vec }, + L2Infix { children: Vec }, + L3Infix { children: Vec }, + L4Infix { children: Vec }, + L5Infix { children: Vec }, + L0 { children: Vec }, + L1 { children: Vec }, + L2 { children: Vec }, + L3 { children: Vec }, + L4 { children: Vec }, + L5 { children: Vec }, + L6 { children: Vec }, + Function { children: Vec }, + Negation { children: Vec }, + Not { children: Vec }, + ParentheticalExpression { children: Vec }, + CommentSigil { children: Vec }, + Any { children: Vec }, + Symbol { children: Vec }, + StateMachine { children: Vec }, + StateTransition { children: Vec }, + Value { children: Vec }, + BooleanLiteral { children: Vec }, + NumberLiteral { children: Vec }, + FloatLiteral { chars: Vec, src_range: SourceRange }, + DecimalLiteral { chars: Vec, src_range: SourceRange }, + HexadecimalLiteral { chars: Vec, src_range: SourceRange }, + OctalLiteral { chars: Vec, src_range: SourceRange }, + BinaryLiteral { chars: Vec, src_range: SourceRange }, + Incomplete { children: Vec, src_range: SourceRange }, + Error, +} + +impl fmt::Debug for ParserNode { + #[inline] + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + print_parser_node(self, 1, f); + Ok(()) + } +} + +fn print_parser_node(node: &ParserNode, level: usize, f: &mut fmt::Formatter) { + spacer(level, f); + let children: Option<&Vec> = match node { + ParserNode::Root{children} => { write!(f, "Root\n"); Some(children) }, + ParserNode::Block{children, src_range} => { write!(f, "Block(@ {:?})\n", src_range); Some(children) }, + ParserNode::Transformation{children} => { write!(f, "Transformation\n"); Some(children) }, + ParserNode::Select{children} => { write!(f, "Select\n"); Some(children) }, + ParserNode::Whenever{children} => { write!(f, "Whenever\n"); Some(children) }, + ParserNode::Insert{children} => { write!(f, "Insert\n"); Some(children) }, + ParserNode::MathExpression{children} => { write!(f, "MathExpression\n"); Some(children) }, + ParserNode::SelectExpression{children} => { write!(f, "SelectExpression\n"); Some(children) }, + ParserNode::Comparator{children} => { write!(f, "Comparator\n"); Some(children) }, + ParserNode::FilterExpression{children} => { write!(f, "FilterExpression\n"); Some(children) }, + ParserNode::AnonymousTable{children} => { write!(f, "AnonymousTable\n"); Some(children) }, + ParserNode::EmptyTable{children} => { write!(f, "EmptyTable\n"); Some(children) }, + ParserNode::AnonymousMatrix{children} => { write!(f, "AnonymousMatrix\n"); Some(children) }, + ParserNode::TableRow{children} => { write!(f, "TableRow\n"); Some(children) }, + ParserNode::Table{children} => { write!(f, "Table\n"); Some(children) }, + ParserNode::Number{children} => { write!(f, "Number\n"); Some(children) }, + ParserNode::DigitOrComma{children} => { write!(f, "DigitOrComma\n"); Some(children) }, + ParserNode::Alphanumeric{children} => { write!(f, "Alphanumeric\n"); Some(children) }, + ParserNode::Word{children} => { write!(f, "Word\n"); Some(children) }, + ParserNode::Emoji{children} => { write!(f, "Emoji\n"); Some(children) }, + ParserNode::Paragraph{children} => { write!(f, "Paragraph\n"); Some(children) }, + ParserNode::ParagraphText{children} => { write!(f, "ParagraphText\n"); Some(children) }, + ParserNode::FormattedText{children} => { write!(f, "FormattedText\n"); Some(children) }, + ParserNode::InlineMechCode{children} => { write!(f, "InlineMechCode\n"); Some(children) }, + ParserNode::InlineCode{children} => { write!(f, "InlineCode\n"); Some(children) }, + ParserNode::MechCodeBlock{children} => { write!(f, "MechCodeBlock\n"); Some(children) }, + ParserNode::Bold{children} => { write!(f, "Bold\n"); Some(children) }, + ParserNode::Italic{children} => { write!(f, "Italic\n"); Some(children) }, + ParserNode::Hyperlink{children} => { write!(f, "Hyperlink\n"); Some(children) }, + ParserNode::BlockQuote{children} => { write!(f, "BlockQuote\n"); Some(children) }, + ParserNode::CodeBlock{children} => { write!(f, "CodeBlock\n"); Some(children) }, + ParserNode::UnorderedList{children} => { write!(f, "UnorderedList\n"); Some(children) }, + ParserNode::ListItem{children} => { write!(f, "ListItem\n"); Some(children) }, + ParserNode::String{children} => { write!(f, "String\n"); Some(children) }, + ParserNode::StringInterpolation{children} => { write!(f, "StringInterpolation\n"); Some(children) }, + ParserNode::VariableDefine{children} => { write!(f, "VariableDefine\n"); Some(children) }, + ParserNode::TableDefine{children} => { write!(f, "TableDefine\n"); Some(children) }, + ParserNode::FollowedBy{children} => { write!(f, "FollowedBy\n"); Some(children) }, + ParserNode::AsyncAssign{children} => { write!(f, "AsyncAssign\n"); Some(children) }, + ParserNode::TableSelect{children} => { write!(f, "TableSelect\n"); Some(children) }, + ParserNode::AddRow{children} => { write!(f, "AddRow\n"); Some(children) }, + ParserNode::Column{children} => { write!(f, "Column\n"); Some(children) }, + ParserNode::Binding{children} => { write!(f, "Binding\n"); Some(children) }, + ParserNode::FunctionBinding{children} => { write!(f, "FunctionBinding\n"); Some(children) }, + ParserNode::InlineTable{children} => { write!(f, "InlineTable\n"); Some(children) }, + ParserNode::TableHeader{children} => { write!(f, "TableHeader\n"); Some(children) }, + ParserNode::Attribute{children} => { write!(f, "Attribute\n"); Some(children) }, + ParserNode::IdentifierOrConstant{children} => { write!(f, "IdentifierOrConstant\n"); Some(children) }, + ParserNode::InfixOperation{children} => { write!(f, "Infix\n"); Some(children) }, + ParserNode::Repeat{children} => { write!(f, "Repeat\n"); Some(children) }, + ParserNode::Identifier{children} => { write!(f, "Identifier\n"); Some(children) }, + ParserNode::TableIdentifier{children} => { write!(f, "TableIdentifier\n"); Some(children) }, + ParserNode::DotIndex{children} => { write!(f, "DotIndex\n"); Some(children) }, + ParserNode::Swizzle{children} => { write!(f, "Swizzle\n"); Some(children) }, + ParserNode::SubscriptIndex{children} => { write!(f, "SubscriptIndex\n"); Some(children) }, + ParserNode::SubscriptList{children} => { write!(f, "SubscriptList\n"); Some(children) }, + ParserNode::Subscript{children} => { write!(f, "Subscript\n"); Some(children) }, + ParserNode::LogicOperator{children} => { write!(f, "LogicOperator\n"); Some(children) }, + ParserNode::LogicExpression{children} => { write!(f, "LogicExpression\n"); Some(children) }, + ParserNode::Range => { write!(f, "Range\n"); None }, + ParserNode::SelectAll => { write!(f, "SelectAll\n"); None }, + ParserNode::Index{children} => { write!(f, "Index\n"); Some(children) }, + ParserNode::Equality{children} => { write!(f, "Equality\n"); Some(children) }, + ParserNode::Data{children} => { write!(f, "Data\n"); Some(children) }, + ParserNode::SetData{children} => { write!(f, "SetData\n"); Some(children) }, + ParserNode::UpdateData{children} => { write!(f, "UpdateData\n"); Some(children) }, + ParserNode::SplitData{children} => { write!(f, "SplitData\n"); Some(children) }, + ParserNode::FlattenData{children} => { write!(f, "FlattenData\n"); Some(children) }, + ParserNode::Wait{children} => { write!(f, "Wait\n"); Some(children) }, + ParserNode::Until{children} => { write!(f, "Until\n"); Some(children) }, + ParserNode::SetOperator{children} => { write!(f, "SetOperator\n"); Some(children) }, + ParserNode::AddOperator{children} => { write!(f, "AddOperator\n"); Some(children) }, + ParserNode::WatchOperator{children} => { write!(f, "WatchOperator\n"); Some(children) }, + ParserNode::Infix{children} => { write!(f, "Infix\n"); Some(children) }, + ParserNode::Expression{children} => { write!(f, "Expression\n"); Some(children) }, + ParserNode::Constant{children} => { write!(f, "Constant\n"); Some(children) }, + ParserNode::Program{children} => { write!(f, "Program\n"); Some(children) }, + ParserNode::IdentifierCharacter{children} => { write!(f, "IdentifierCharacter\n"); Some(children) }, + ParserNode::Title{children} => { write!(f, "Title\n"); Some(children) }, + ParserNode::Subtitle{children, level} => { write!(f, "Subtitle {}\n", level); Some(children) }, + ParserNode::Section{title, children} => { write!(f, "Section {:?}\n", title); Some(children) }, + ParserNode::Statement{children, src_range} => { write!(f, "Statement(@ {:?})\n", src_range); Some(children) }, + ParserNode::StatementOrExpression{children} => { write!(f, "StatementOrExpression\n"); Some(children) }, + ParserNode::DataOrConstant{children} => { write!(f, "DataOrConstant\n"); Some(children) }, + ParserNode::NewLineOrEnd{children} => { write!(f, "NewLineOrEnd\n"); Some(children) }, + ParserNode::Fragment{children} => { write!(f, "Fragment\n"); Some(children) }, + ParserNode::Body{children} => { write!(f, "Body\n"); Some(children) }, + ParserNode::Head{children} => { write!(f, "Head\n"); Some(children) }, + ParserNode::Node{children} => { write!(f, "Node\n"); Some(children) }, + ParserNode::Text{children} => { write!(f, "Text\n"); Some(children) }, + ParserNode::Punctuation{children} => { write!(f, "Punctuation\n"); Some(children) }, + ParserNode::L0Infix{children} => { write!(f, "L0Infix\n"); Some(children) }, + ParserNode::L1Infix{children} => { write!(f, "L1Infix\n"); Some(children) }, + ParserNode::L2Infix{children} => { write!(f, "L2Infix\n"); Some(children) }, + ParserNode::L3Infix{children} => { write!(f, "L3Infix\n"); Some(children) }, + ParserNode::L4Infix{children} => { write!(f, "L4Infix\n"); Some(children) }, + ParserNode::L5Infix{children} => { write!(f, "L5Infix\n"); Some(children) }, + ParserNode::L0{children} => { write!(f, "L0\n"); Some(children) }, + ParserNode::L1{children} => { write!(f, "L1\n"); Some(children) }, + ParserNode::L2{children} => { write!(f, "L2\n"); Some(children) }, + ParserNode::L3{children} => { write!(f, "L3\n"); Some(children) }, + ParserNode::L4{children} => { write!(f, "L4\n"); Some(children) }, + ParserNode::L5{children} => { write!(f, "L5\n"); Some(children) }, + ParserNode::L6{children} => { write!(f, "L6\n"); Some(children) }, + ParserNode::Function{children} => { write!(f, "Function\n"); Some(children) }, + ParserNode::UserFunction{children} => { write!(f, "UserFunction\n"); Some(children) }, + ParserNode::FunctionBody{children} => { write!(f, "FunctionBody\n"); Some(children) }, + ParserNode::FunctionArgs{children} => { write!(f, "FunctionArgs\n"); Some(children) }, + ParserNode::FunctionInput{children} => { write!(f, "FunctionInput\n"); Some(children) }, + ParserNode::FunctionOutput{children} => { write!(f, "FunctionOutput\n"); Some(children) }, + ParserNode::Negation{children} => { write!(f, "Negation\n"); Some(children) }, + ParserNode::Not{children} => { write!(f, "Not\n"); Some(children) }, + ParserNode::ParentheticalExpression{children} => { write!(f, "ParentheticalExpression\n"); Some(children) }, + ParserNode::ProseOrCode{children} => { write!(f, "ProseOrCode\n"); Some(children) }, + ParserNode::Whitespace{children} => { write!(f, "Whitespace\n"); Some(children) }, + ParserNode::SpaceOrTab{children} => { write!(f, "SpaceOrTab\n"); Some(children) }, + ParserNode::NewLine{children} => { write!(f, "NewLine\n"); Some(children) }, + ParserNode::Token{token, chars, src_range} => { write!(f, "Token({:?} ({:?}) @ {:?})\n", token, chars, src_range); None }, + ParserNode::CommentSigil{children} => { write!(f, "CommentSigil\n"); Some(children) }, + ParserNode::Comment{children} => { write!(f, "Comment\n"); Some(children) }, + ParserNode::Any{children} => { write!(f, "Any\n"); Some(children) }, + ParserNode::Symbol{children} => { write!(f, "Symbol\n"); Some(children) }, + ParserNode::Quantity{children} => { write!(f, "Quantity\n"); Some(children) }, + ParserNode::NumberLiteral{children} => { write!(f, "NumberLiteral\n"); Some(children) }, + ParserNode::FloatLiteral{chars, src_range} => { write!(f, "FloatLiteral({:?} @ {:?})\n", chars, src_range); None }, + ParserNode::DecimalLiteral{chars, src_range} => { write!(f, "DecimalLiteral({:?} @ {:?})\n", chars, src_range); None }, + ParserNode::HexadecimalLiteral{chars, src_range} => { write!(f, "HexadecimalLiteral({:?} @ {:?})\n", chars, src_range); None }, + ParserNode::OctalLiteral{chars, src_range} => { write!(f, "OctalLiteral({:?} @ {:?})\n", chars, src_range); None }, + ParserNode::BinaryLiteral{chars, src_range} => { write!(f, "BinaryLiteral({:?} @ {:?})\n", chars, src_range); None }, + ParserNode::RationalNumber{children} => { write!(f, "RationalNumber\n"); Some(children) }, + ParserNode::StateMachine{children} => { write!(f, "StateMachine\n"); Some(children) }, + ParserNode::StateTransition{children} => { write!(f, "StateTransition\n"); Some(children) }, + ParserNode::Value{children} => { write!(f, "Value\n"); Some(children) }, + ParserNode::KindAnnotation{children} => { write!(f, "KindAnnotation\n"); Some(children) }, + ParserNode::BooleanLiteral{children} => { write!(f, "BooleanLiteral\n"); Some(children) }, + ParserNode::Add => { write!(f, "Add\n",); None }, + ParserNode::Subtract => { write!(f, "Subtract\n",); None }, + ParserNode::Multiply => { write!(f, "Multiply\n",); None }, + ParserNode::Divide => { write!(f, "Divide\n",); None }, + ParserNode::Exponent => { write!(f, "Exponent\n",); None }, + ParserNode::LessThan => { write!(f, "LessThan\n",); None }, + ParserNode::GreaterThan => { write!(f, "GreaterThan\n",); None }, + ParserNode::GreaterThanEqual => { write!(f, "GreaterThanEqual\n",); None }, + ParserNode::LessThanEqual => { write!(f, "LessThanEqual\n",); None }, + ParserNode::Equal => { write!(f, "Equal\n",); None }, + ParserNode::NotEqual => { write!(f, "NotEqual\n",); None }, + ParserNode::And => { write!(f, "And\n",); None }, + ParserNode::Or => { write!(f, "Or\n",); None }, + ParserNode::Xor => { write!(f, "Xor\n",); None }, + ParserNode::AddUpdate => { write!(f, "AddUpdate\n",); None }, + ParserNode::SubtractUpdate => { write!(f, "SubtractUpdate\n",); None }, + ParserNode::MultiplyUpdate => { write!(f, "MultiplyUpdate\n",); None }, + ParserNode::DivideUpdate => { write!(f, "DivideUpdate\n",); None }, + ParserNode::ExponentUpdate => { write!(f, "ExponentUpdate\n",); None }, + ParserNode::Empty => { write!(f, "Empty\n",); None }, + ParserNode::Null => { write!(f, "Null\n",); None }, + ParserNode::ReshapeColumn => { write!(f, "ReshapeColumn\n",); None }, + ParserNode::False => { write!(f, "False\n",); None }, + ParserNode::True => { write!(f, "True\n",); None }, + ParserNode::Alpha{children} => { write!(f, "Alpha\n"); Some(children) }, + ParserNode::Transpose => { write!(f, "Transpose\n",); None }, + ParserNode::MatrixMultiply => { write!(f, "MatrixMultiply\n",); None }, + ParserNode::Incomplete{children, src_range} => { write!(f, "Incomplete(@ {:?})\n", src_range); Some(children) }, + ParserNode::Error => { write!(f, "Error\n"); None }, + }; + + match children { + Some(childs) => { + for child in childs { + print_parser_node(child, level + 1, f) + } + }, + _ => (), + } +} + +fn spacer(width: usize, f: &mut fmt::Formatter) { + let limit = if width > 0 { + width - 1 + } else { + width + }; + for _ in 0..limit { + write!(f,"│").ok(); + } + write!(f,"├").ok(); +} + +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] +pub enum Token { + Alpha, + Digit, + HashTag, + LeftBracket, + RightBracket, + LeftParenthesis, + RightParenthesis, + LeftBrace, + RightBrace, + Caret, + Semicolon, + Space, + Plus, + Dash, + Underscore, + At, + Asterisk, + Slash, + Apostrophe, + Equal, + LessThan, + GreaterThan, + Exclamation, + Question, + Period, + Colon, + Comma, + Tilde, + Grave, + Bar, + Backslash, + Quote, + Ampersand, + Percent, + Newline, + CarriageReturn, + Tab, + EndOfStream, + Emoji, +} diff --git a/src/core/src/schedule.rs b/src/core/src/schedule.rs new file mode 100644 index 0000000..1660ecf --- /dev/null +++ b/src/core/src/schedule.rs @@ -0,0 +1,307 @@ +/* + +This code defines a scheduling system for blocks in the Mech programming language. The Schedule struct maps triggers, inputs, and outputs to blocks and maintains schedules for output-producing blocks. The Node and BlockGraph structs represent the nodes and edges of the directed acyclic graph formed by the blocks, respectively. The scheduling algorithm determines when blocks can be scheduled for execution based on their input dependencies, and their outputs are aggregated and propagated to dependent blocks. Overall, this code is a crucial component of the Mech language, allowing for the efficient and reliable execution of complex programs. + +*/ + + +use hashbrown::{HashMap, HashSet}; +use crate::core::BlockRef; +use crate::*; + + +/* +The Schedule struct is used to manage the scheduling of Blocks in Mech. It contains several maps that relate registers (i.e. specific cells in a Table) to their corresponding Blocks. The Schedule struct also has methods for adding Blocks to the schedule, scheduling those Blocks, and running the scheduled Blocks. The Schedule struct manages the flow of data between Blocks and ensures that Blocks are only executed when their input data is available. Finally, the Schedule struct contains a BlockGraph struct, which is used to represent the graph of Blocks and their dependencies. +*/ + +#[derive(Clone)] +pub struct Schedule { + pub trigger_to_blocks: HashMap<(TableId,RegisterIndex,RegisterIndex),Vec>, + pub input_to_blocks: HashMap<(TableId,RegisterIndex,RegisterIndex),Vec>, + pub output_to_blocks: HashMap<(TableId,RegisterIndex,RegisterIndex),Vec>, + pub trigger_to_output: HashMap<(TableId,RegisterIndex,RegisterIndex),HashSet<(TableId,RegisterIndex,RegisterIndex)>>, + pub schedules: HashMap<(TableId,RegisterIndex,RegisterIndex),Vec>, // Block Graph is list of blocks that will trigger in order when the given register is set + unscheduled_blocks: Vec, +} + +impl Schedule { + + pub fn new() -> Schedule { + Schedule { + trigger_to_blocks: HashMap::new(), + input_to_blocks: HashMap::new(), + output_to_blocks: HashMap::new(), + trigger_to_output: HashMap::new(), + schedules: HashMap::new(), + unscheduled_blocks: Vec::new(), + } + } + + pub fn add_block(&mut self, block_ref: BlockRef) -> Result<(),MechError> { + + self.unscheduled_blocks.push(block_ref); + + Ok(()) + } + + + pub fn schedule_blocks(&mut self) -> Result<(),MechError> { + if self.unscheduled_blocks.len() == 0 { + return Ok(()) + } + let ready_blocks: Vec = self.unscheduled_blocks.drain_filter(|b| b.borrow().state == BlockState::Ready).collect(); + + for block_ref in &ready_blocks { + let mut graph = BlockGraph::new(block_ref.clone()); + let block_brrw = block_ref.borrow(); + + // Map trigger registers to blocks + for (trigger_table_id,row,col) in &block_brrw.triggers { + let ref mut dependent_blocks = self.trigger_to_blocks.entry((*trigger_table_id,*row,*col)).or_insert(vec![]); + dependent_blocks.push(graph.clone()); + let ref mut dependent_blocks = self.schedules.entry((*trigger_table_id,*row,*col)).or_insert(vec![]); + dependent_blocks.push(graph.clone()); + + for ((output_table_id,row,col),ref mut producing_blocks) in self.output_to_blocks.iter_mut() { + if output_table_id == trigger_table_id { + for ref mut pblock in producing_blocks.iter_mut() { + pblock.add_child(&mut graph); + } + } + } + } + + // Map input registers to blocks + for (input_table_id,row,col) in &block_brrw.input { + let ref mut consuming_blocks = self.input_to_blocks.entry((*input_table_id,*row,*col)).or_insert(vec![]); + consuming_blocks.push(graph.clone()); + } + + // Map output registers to blocks + for (output_table_id,row,col) in &block_brrw.output { + let ref mut producing_blocks = self.output_to_blocks.entry((*output_table_id,*row,*col)).or_insert(vec![]); + producing_blocks.push(graph.clone()); + // Map block outputs to triggers + if let Some(consuming_blocks) = self.trigger_to_blocks.get(&(*output_table_id,*row,*col)) { + for block in consuming_blocks { + graph.add_child(&block); + } + } + } + } + // This collects all of the output that would be changed given a trigger + // TODO I'd like to do this incrementally instead of redoing it + // every time blocks are scheduled. But I'm short on time now and + // this is all I can think of to do without changing too much. + for (register,block_graphs) in self.schedules.iter() { + let (table_id,row_ix,col_ix) = register; + let mut aggregate_output = HashSet::new(); + for graph in block_graphs { + let mut node = &graph.root; + let node_brrw = node.borrow(); + let mut output = node_brrw.aggregate_output(); + aggregate_output = aggregate_output.union(&mut output).cloned().collect(); + } + self.trigger_to_output.insert(register.clone(),aggregate_output); + } + Ok(()) + } + + pub fn run_schedule(&mut self, register: &(TableId,RegisterIndex,RegisterIndex)) -> Result<(),MechError> { + match self.schedules.get_mut(register) { + Some(ref mut block_graphs) => { + for ref mut block_graph in block_graphs.iter_mut() { + block_graph.solve(); + } + Ok(()) + } + None => { + Err(MechError{msg: "".to_string(), id: 5368, kind: MechErrorKind::GenericError(format!("No schedule assocaited with {:?}", register))}) + } + } + } +} + +impl fmt::Debug for Schedule { + #[inline] + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + let mut box_drawing = BoxPrinter::new(); + box_drawing.add_header("triggers"); + box_drawing.add_line(format!("{:#?}", &self.trigger_to_blocks)); + box_drawing.add_header("input"); + box_drawing.add_line(format!("{:#?}", &self.input_to_blocks)); + box_drawing.add_header("output"); + box_drawing.add_line(format!("{:#?}", &self.output_to_blocks)); + box_drawing.add_header("output schedule"); + box_drawing.add_line(format!("{:#?}", &self.trigger_to_output)); + box_drawing.add_header("schedules"); + box_drawing.add_line(format!("{:#?}", &self.schedules)); + if self.unscheduled_blocks.len() > 0 { + box_drawing.add_header("unscheduled blocks"); + box_drawing.add_line(format!("{:#?}", &self.unscheduled_blocks.iter().map(|b| humanize(&b.borrow().id)).collect::>())); + } + write!(f,"{:?}",box_drawing)?; + Ok(()) + } +} + + +/* +The Node struct is used in the BlockGraph to represent a single block in the graph. It contains a BlockRef which refers to the block represented by the node, a vector of parents which represent the nodes that depend on this node, and a vector of children which represent the nodes that this node depends on. The Node also contains several methods to manipulate and retrieve the inputs, outputs, and triggers of the block, and to solve the block and its children recursively. +*/ + +#[derive(Clone)] +pub struct Node { + block: BlockRef, + parents: Vec>>, + children: Vec>>, +} + +impl Node { + + pub fn new(block: BlockRef) -> Node { + Node { + block: block, + parents: Vec::new(), + children: Vec::new(), + } + } + + pub fn recompile(&self) -> Result<(),MechError> { + { + self.block.borrow_mut().recompile()?; + } + for child in &self.children { + let mut child_brrw = child.borrow_mut(); + child_brrw.recompile()?; + } + Ok(()) + } + + pub fn triggers(&self) -> HashSet<(TableId,RegisterIndex,RegisterIndex)> { + self.block.borrow().triggers.clone() + } + + pub fn input(&self) -> HashSet<(TableId,RegisterIndex,RegisterIndex)> { + self.block.borrow().input.clone() + } + + pub fn output(&self) -> HashSet<(TableId,RegisterIndex,RegisterIndex)> { + self.block.borrow().output.clone() + } + + pub fn aggregate_output(&self) -> HashSet<(TableId,RegisterIndex,RegisterIndex)> { + let mut aggregate_output = self.output(); + let mut child_output = self.output_recurse(); + aggregate_output = aggregate_output.union(&mut child_output).cloned().collect(); + aggregate_output + } + + pub fn output_recurse(&self) -> HashSet<(TableId,RegisterIndex,RegisterIndex)> { + let mut aggregate_output = HashSet::new(); + for child in &self.children { + let child_brrw = child.borrow(); + let mut output = child_brrw.output(); + let mut child_output = child_brrw.output_recurse(); + aggregate_output = aggregate_output.union(&mut output).cloned().collect(); + aggregate_output = aggregate_output.union(&mut child_output).cloned().collect(); + } + aggregate_output + } + + pub fn add_child(&mut self, child: Rc>) { + self.children.push(child); + } + + pub fn add_parent(&mut self, parent: Rc>) { + self.parents.push(parent); + } + + pub fn solve(&mut self) -> Result<(),MechError> { + self.block.borrow_mut().solve()?; + for ref mut child in &mut self.children { + child.borrow_mut().solve()?; + } + Ok(()) + } + +} + +impl fmt::Debug for Node { + #[inline] + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f,"[{}]",humanize(&self.block.borrow().id))?; + for child in &self.children { + write!(f,"->{:?}\n",&child.borrow())?; + } + Ok(()) + } +} + +/* +The BlockGraph structure represents a directed acyclic graph (DAG) of Node structures. The Node structures themselves contain BlockRef references, which are references to individual Block structures. Each Node also contains vectors of its parent and child Nodes within the BlockGraph. The BlockGraph provides methods for recompiling its associated Block structures, as well as for solving the BlockGraph in the proper order, with each Block solving its inputs before solving its outputs. +*/ + +#[derive(Clone)] +pub struct BlockGraph { + pub root: Rc>, +} + +impl BlockGraph { + + pub fn new(block: BlockRef) -> BlockGraph { + let node = Rc::new(RefCell::new(Node::new(block))); + BlockGraph { + root: node, + } + } + + pub fn id(&self) -> u64 { + self.root.borrow().block.borrow().id + } + + pub fn recompile_blocks(&self) -> Result<(),MechError> { + let root_brrw = self.root.borrow(); + root_brrw.recompile()?; + Ok(()) + } + + pub fn triggers(&self) -> HashSet<(TableId,RegisterIndex,RegisterIndex)> { + self.root.borrow().triggers() + } + + pub fn input(&self) -> HashSet<(TableId,RegisterIndex,RegisterIndex)> { + self.root.borrow().input() + } + + pub fn output(&self) -> HashSet<(TableId,RegisterIndex,RegisterIndex)> { + self.root.borrow().output() + } + + pub fn add_child(&mut self, block: &BlockGraph) -> Result<(),MechError> { + { + let mut root_block = self.root.borrow_mut(); + let rc = block.root.clone(); + root_block.add_child(rc); + } + { + let mut child_block = block.root.borrow_mut(); + child_block.add_parent(self.root.clone()); + } + Ok(()) + } + + pub fn solve(&mut self) -> Result<(),MechError> { + self.root.borrow_mut().solve() + } + + +} + +impl fmt::Debug for BlockGraph { + #[inline] + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f,"{:?}",self.root.borrow())?; + Ok(()) + } +} \ No newline at end of file diff --git a/src/core/src/table.rs b/src/core/src/table.rs new file mode 100644 index 0000000..174ecb8 --- /dev/null +++ b/src/core/src/table.rs @@ -0,0 +1,773 @@ +// # Table + +// A table starts with a tag, and has a matrix of memory available for data, +// where each column represents an attribute, and each row represents an entity. + +// ## Prelude + +use std::rc::Rc; +use std::cell::RefCell; +use std::fmt; +use crate::*; +use hashbrown::HashMap; +use indexmap::IndexMap; + +// ### Table Id + +#[derive(Clone, Copy, Eq, Hash, PartialEq, PartialOrd, Serialize, Deserialize)] +pub enum TableId { + Local(u64), + Global(u64), +} + +impl TableId { + pub fn unwrap(&self) -> &u64 { + match self { + TableId::Local(id) => id, + TableId::Global(id) => id, + } + } +} + +impl fmt::Debug for TableId { + #[inline] + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + &TableId::Local(ref id) => write!(f, "Local({:})", humanize(id)), + &TableId::Global(ref id) => write!(f, "Global({:})", humanize(id)), + } + } +} + +// ## Table Shape + +#[derive(Debug,Copy,Clone,PartialEq,Eq, Serialize, Deserialize, Hash)] +pub enum TableShape { + Scalar, + Column(usize), + Row(usize), + Matrix(usize,usize), + Dynamic(usize,usize), + Pending(TableId), +} + +// ### TableIndex + +#[derive(Clone, PartialEq, Eq, Serialize, Deserialize)] +pub enum TableIndex { + Index(usize), + Alias(u64), + Aliases(Vec), + IxTable(TableId), + ReshapeColumn, + All, + None, +} + +impl TableIndex { + pub fn unwrap(&self) -> usize { + match self { + TableIndex::Index(ix) => *ix, + TableIndex::Alias(alias) => { + alias.clone() as usize + }, + TableIndex::IxTable(table_id) => *table_id.unwrap() as usize, + TableIndex::Aliases(_) | + TableIndex::ReshapeColumn | + TableIndex::None | + TableIndex::All => 0, + } + } + +} + +impl fmt::Debug for TableIndex { + #[inline] + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + &TableIndex::Index(ref ix) => write!(f, "Ix({:?})", ix), + &TableIndex::Alias(ref alias) => write!(f, "IxAlias({})", humanize(alias)), + &TableIndex::Aliases(ref aliases) => write!(f, "IxAliases({:?})", aliases.iter().map(|alias| humanize(alias)).collect::>()), + &TableIndex::IxTable(ref table_id) => write!(f, "IxTable({:?})", table_id), + &TableIndex::ReshapeColumn => write!(f, "IxReshapeColumn"), + &TableIndex::All => write!(f, "IxAll"), + &TableIndex::None => write!(f, "IxNone"), + } + } +} + +// ## Table + + +/* +The Table struct in Mech represents a data table. A vector of ValueKind to identify the type of data in each column, and maps to store aliases for columns and rows. The data in the table is stored as a vector of Column structs, where each Column struct contains a vector of Values. The implication is that tables can have columns with different types of data and the elements of each column are contiguous in memory, allowing for efficient processing of large amounts of data. + + +The StringDictionary is used to store strings used in the table to reduce memory usage. This struct is essential in the representation and manipulation of tables in Mech. +*/ + +pub type StringDictionary = Rc>>; + +pub struct Table { + pub id: u64, + pub dynamic: bool, + pub rows: usize, + pub cols: usize, + pub col_kinds: Vec, + pub col_map: AliasMap, + pub row_map: AliasMap, + pub data: Vec, + pub dictionary: StringDictionary, +} + +impl Table { + pub fn new(id: u64, rows: usize, cols: usize) -> Table { + let mut table = Table { + id, + rows, + cols, + dynamic: false, + col_kinds: Vec::with_capacity(cols), + col_map: AliasMap::new(cols), + row_map: AliasMap::new(rows), + data: Vec::with_capacity(cols), + dictionary: Rc::new(RefCell::new(HashMap::new())), + }; + for col in 0..cols { + table.data.push(Column::Empty); + table.col_kinds.push(ValueKind::Empty); + } + table + } + + pub fn resize(&mut self, rows: usize, cols: usize) -> std::result::Result<(),MechError> { + self.rows = rows; + self.cols = cols; + self.col_kinds.resize(cols,ValueKind::Empty); + self.col_map.resize(cols); + self.row_map.resize(rows); + for col in &mut self.data { + col.resize(rows); + } + self.data.resize(cols,Column::Empty); + Ok(()) + } + + pub fn is_empty(&self) -> bool { + if self.rows == 0 || self.cols == 0 { + true + } else { + false + } + } + + pub fn get_col_raw(&self, col_ix: usize) -> std::result::Result { + if col_ix < self.cols { + Ok(self.data[col_ix].clone()) + } else { + Err(MechError{msg: "".to_string(), id: 7001, kind: MechErrorKind::None}) + } + } + + pub fn kind(&self) -> ValueKind { + if self.col_kinds.len() == 0 { + return ValueKind::Empty; + } + let first_col_kind = self.col_kinds[0].clone(); + if self.col_kinds.iter().all(|kind| *kind == first_col_kind) { + first_col_kind + } else { + ValueKind::Compound(self.col_kinds.clone()) + } + } + + pub fn name(&self) -> Option { + if let Some(mstring) = self.dictionary.borrow().get(&self.id) { + Some(format!("{}", mstring.to_string())) + } else { + None + } + } + + pub fn get_column(&self, col: &TableIndex) -> Result { + match col { + TableIndex::Alias(alias) => { + match self.col_map.get_index(&alias) { + Ok(ix) => Ok(self.data[ix as usize].clone()), + Err(x) => { + Err(x) + }, + } + } + TableIndex::Index(0) => { + Err(MechError{msg: "".to_string(), id: 7003, kind: MechErrorKind::None}) + } + TableIndex::Index(ix) => { + if *ix <= self.cols { + Ok(self.data[*ix-1].clone()) + } else { + Err(MechError{msg: "".to_string(), id: 7004, kind: MechErrorKind::None}) + } + } + TableIndex::All => { + if self.cols == 1 { + Ok(self.data[0].clone()) + } else { + Err(MechError{msg: "".to_string(), id: 7005, kind: MechErrorKind::None}) + } + } + TableIndex::Aliases(_) | + TableIndex::ReshapeColumn | + TableIndex::IxTable(_) | + TableIndex::None => Err(MechError{msg: "".to_string(), id: 7006, kind: MechErrorKind::None}), + } + } + + pub fn set_col_alias(&mut self, ix: usize, alias: u64) -> Result<(),MechError> { + if ix < self.cols { + self.col_map.insert(ix,alias); + Ok(()) + } else { + Err(MechError{msg: "".to_string(), id: 7008, kind: MechErrorKind::None}) + } + } + + pub fn set_kind(&mut self, kind: ValueKind) -> Result<(),MechError> { + match kind { + ValueKind::Compound(kinds) => { + for col in 0..self.cols { + self.set_col_kind(col,kinds[col].clone())?; + } + } + kind => { + for col in 0..self.cols { + self.set_col_kind(col,kind.clone())?; + } + } + } + Ok(()) + } + + pub fn extend(&mut self, other: &Table) -> Result<(),MechError> { + if self.kind() != other.kind() { + return Err(MechError{msg: "".to_string(), id: 7059, kind: MechErrorKind::None}); + } + if self.cols != other.cols { + return Err(MechError{msg: "".to_string(), id: 7060, kind: MechErrorKind::None}); + } + self.rows += other.rows; + for c in 0..self.cols { + let col = &self.data[c]; + let other_col = &other.data[c]; + col.extend(&other_col); + } + Ok(()) + } + + pub fn set_col_kind(&mut self, col: usize, kind: ValueKind) -> Result<(),MechError> { + if col < self.cols { + match (&mut self.data[col], kind) { + (Column::U8(_), ValueKind::U8) => (), + (Column::Empty, ValueKind::U8) => { + let column = ColumnV::::new(vec![U8::new(0);self.rows]); + self.data[col] = Column::U8(column); + self.col_kinds[col] = ValueKind::U8; + }, + (Column::U16(_), ValueKind::U16) => (), + (Column::Empty, ValueKind::U16) => { + let column = ColumnV::::new(vec![U16::new(0);self.rows]); + self.data[col] = Column::U16(column); + self.col_kinds[col] = ValueKind::U16; + }, + (Column::U32(_), ValueKind::U32) => (), + (Column::Empty, ValueKind::U32) => { + let column = ColumnV::::new(vec![U32::new(0);self.rows]); + self.data[col] = Column::U32(column); + self.col_kinds[col] = ValueKind::U32; + }, + (Column::U64(_), ValueKind::U64) => (), + (Column::Empty, ValueKind::U64) => { + let column = ColumnV::::new(vec![U64::new(0);self.rows]); + self.data[col] = Column::U64(column); + self.col_kinds[col] = ValueKind::U64; + }, + (Column::U128(_), ValueKind::U128) => (), + (Column::Empty, ValueKind::U128) => { + let column = ColumnV::::new(vec![U128::new(0);self.rows]); + self.data[col] = Column::U128(column); + self.col_kinds[col] = ValueKind::U128; + }, + (Column::I8(_), ValueKind::I8) => (), + (Column::Empty, ValueKind::I8) => { + let column = ColumnV::::new(vec![I8::new(0);self.rows]); + self.data[col] = Column::I8(column); + self.col_kinds[col] = ValueKind::I8; + }, + (Column::I16(_), ValueKind::I16) => (), + (Column::Empty, ValueKind::I16) => { + let column = ColumnV::::new(vec![I16::new(0);self.rows]); + self.data[col] = Column::I16(column); + self.col_kinds[col] = ValueKind::I16; + }, + (Column::I32(_), ValueKind::I32) => (), + (Column::Empty, ValueKind::I32) => { + let column = ColumnV::::new(vec![I32::new(0);self.rows]); + self.data[col] = Column::I32(column); + self.col_kinds[col] = ValueKind::I32; + }, + (Column::I64(_), ValueKind::I64) => (), + (Column::Empty, ValueKind::I64) => { + let column = ColumnV::::new(vec![I64::new(0);self.rows]); + self.data[col] = Column::I64(column); + self.col_kinds[col] = ValueKind::I64; + }, + (Column::I128(_), ValueKind::I128) => (), + (Column::Empty, ValueKind::I128) => { + let column = ColumnV::::new(vec![I128::new(0);self.rows]); + self.data[col] = Column::I128(column); + self.col_kinds[col] = ValueKind::I128; + }, + (Column::F32(_), ValueKind::F32) => (), + (Column::Empty, ValueKind::F32) => { + let column = ColumnV::::new(vec![F32::new(0.0);self.rows]); + self.data[col] = Column::F32(column); + self.col_kinds[col] = ValueKind::F32; + }, + (Column::F64(_), ValueKind::F64) => (), + (Column::Empty, ValueKind::F64) => { + let column = ColumnV::::new(vec![F64::new(0.0);self.rows]); + self.data[col] = Column::F64(column); + self.col_kinds[col] = ValueKind::F64; + }, + (Column::f32(_), ValueKind::f32) => (), + (Column::Empty, ValueKind::f32) => { + let column = ColumnV::::new(vec![0.0;self.rows]); + self.data[col] = Column::f32(column); + self.col_kinds[col] = ValueKind::f32; + }, + (Column::Time(_), ValueKind::Time) => (), + (Column::Empty, ValueKind::Time) => { + let column = ColumnV::::new(vec![F32::new(0.0);self.rows]); + self.data[col] = Column::Time(column); + self.col_kinds[col] = ValueKind::Time; + }, + (Column::Length(_), ValueKind::Length) => (), + (Column::Empty, ValueKind::Length) => { + let column = ColumnV::::new(vec![F32::new(0.0);self.rows]); + self.data[col] = Column::Length(column); + self.col_kinds[col] = ValueKind::Length; + }, + (Column::Speed(_), ValueKind::Speed) => (), + (Column::Empty, ValueKind::Speed) => { + let column = ColumnV::::new(vec![F32::new(0.0);self.rows]); + self.data[col] = Column::Speed(column); + self.col_kinds[col] = ValueKind::Speed; + }, + (Column::Bool(_), ValueKind::Bool) => (), + (Column::Empty, ValueKind::Bool) => { + let column = ColumnV::::new(vec![false;self.rows]); + self.data[col] = Column::Bool(column); + self.col_kinds[col] = ValueKind::Bool; + }, + (Column::String(_), ValueKind::String) => (), + (Column::Empty, ValueKind::String) => { + let column = ColumnV::::new(vec![MechString::new();self.rows]); + self.data[col] = Column::String(column); + self.col_kinds[col] = ValueKind::String; + }, + (Column::Reference(_), ValueKind::Reference) => (), + (Column::Empty, ValueKind::Reference) => { + let column = ColumnV::::new(vec![TableId::Local(0);self.rows]); + self.data[col] = Column::Ref(column); + self.col_kinds[col] = ValueKind::Reference; + }, + (Column::Any(_), ValueKind::Any) => (), + (Column::Empty, ValueKind::Any) => { + let column = ColumnV::::new(vec![Value::Empty; self.rows]); + self.data[col] = Column::Any(column); + self.col_kinds[col] = ValueKind::Any; + }, + x => { + return Err(MechError{msg: "".to_string(), id: 7009, kind: MechErrorKind::GenericError(format!("{:?}",x))}); + }, + } + Ok(()) + } else { + Err(MechError{msg: "".to_string(), id: 7010, kind: MechErrorKind::None}) + } + } + + pub fn get_by_index(&self, row: TableIndex, col: TableIndex) -> Result { + match (row, &self.get_column(&col)?) { + (TableIndex::Index(0),_) => Err(MechError{msg: "".to_string(), id: 7211, kind: MechErrorKind::None}), + (TableIndex::Index(row),Column::f32(c)) => Ok(Value::f32(c.borrow()[row-1])), + (TableIndex::Index(row),Column::F32(c)) => Ok(Value::F32(c.borrow()[row-1])), + (TableIndex::Index(row),Column::F64(c)) => Ok(Value::F64(c.borrow()[row-1])), + (TableIndex::Index(row),Column::U8(c)) => Ok(Value::U8(c.borrow()[row-1])), + (TableIndex::Index(row),Column::U16(c)) => Ok(Value::U16(c.borrow()[row-1])), + (TableIndex::Index(row),Column::U32(c)) => Ok(Value::U32(c.borrow()[row-1])), + (TableIndex::Index(row),Column::U64(c)) => Ok(Value::U64(c.borrow()[row-1])), + (TableIndex::Index(row),Column::U128(c)) => Ok(Value::U128(c.borrow()[row-1])), + (TableIndex::Index(row),Column::I8(c)) => Ok(Value::I8(c.borrow()[row-1])), + (TableIndex::Index(row),Column::I16(c)) => Ok(Value::I16(c.borrow()[row-1])), + (TableIndex::Index(row),Column::I32(c)) => Ok(Value::I32(c.borrow()[row-1])), + (TableIndex::Index(row),Column::I64(c)) => Ok(Value::I64(c.borrow()[row-1])), + (TableIndex::Index(row),Column::I128(c)) => Ok(Value::I128(c.borrow()[row-1])), + (TableIndex::Index(row),Column::Bool(c)) => Ok(Value::Bool(c.borrow()[row-1])), + (TableIndex::Index(row),Column::String(c)) => Ok(Value::String(c.borrow()[row-1].clone())), + (TableIndex::Index(row),Column::Ref(c)) => Ok(Value::Reference(c.borrow()[row-1].clone())), + (_,Column::Empty) => Ok(Value::Empty), + _ => Err(MechError{msg: "".to_string(), id: 7011, kind: MechErrorKind::None}), + } + } + + pub fn set_col(&mut self, col_ix: usize, column: Column) -> std::result::Result<(),MechError> { + if col_ix < self.cols { + if self.col_kinds[col_ix] == ValueKind::Empty { + self.col_kinds[col_ix] = column.kind(); + self.data[col_ix] = column; + Ok(()) + } else { + Err(MechError{msg: "".to_string(), id: 7012, kind: MechErrorKind::None}) + } + } else { + Err(MechError{msg: "".to_string(), id: 7013, kind: MechErrorKind::None}) + } + } + + pub fn get_columns(&self, col: &TableIndex) -> Result, MechError> { + match col { + TableIndex::All => { + Ok(self.data.iter().cloned().collect()) + }, + TableIndex::Aliases(aliases) => { + let mut ixes = vec![]; + for alias in aliases { + match self.col_map.alias_to_ix.get(alias) { + Some(ix) => ixes.push(ix), + None => {return Err(MechError{msg: "".to_string(), id: 7014, kind: MechErrorKind::None});} + } + } + let mut cols = vec![]; + for ix in ixes { + cols.push(self.data[*ix].clone()); + } + Ok(cols) + }, + x => {Err(MechError{msg: "".to_string(), id: 7044, kind: MechErrorKind::GenericError(format!("{:?}",x))})} + } + } + + pub fn set(&self, row: &TableIndex, col: &TableIndex, val: Value ) -> Result<(),MechError> { + let row_ix = match row { + TableIndex::Index(0) => {return Err(MechError{msg: "".to_string(), id: 0001, kind: MechErrorKind::None});}, + TableIndex::Index(ix) => ix - 1, + _ => 0, + }; + let col_ix = match col { + TableIndex::Index(0) => {return Err(MechError{msg: "".to_string(), id: 0001, kind: MechErrorKind::None})}, + TableIndex::Index(ix) => ix - 1, + TableIndex::Alias(alias) => { + match self.col_map.get_index(alias) { + Ok(ix) => ix, + Err(x) => {return Err(MechError{msg: "".to_string(), id: 7015, kind: MechErrorKind::None})} + } + } + _ => 0, + }; + self.set_raw(row_ix,col_ix,val) + } + + pub fn set_raw(&self, row: usize, col: usize, val: Value) -> Result<(),MechError> { + if col < self.cols && row < self.rows { + match (&self.data[col], val) { + (Column::Length(c), Value::Length(v)) | + (Column::Time(c), Value::Time(v)) | + (Column::Speed(c), Value::Speed(v)) | + (Column::F32(c), Value::F32(v)) => c.borrow_mut()[row] = v, + (Column::F32(c), Value::U64(v)) => c.borrow_mut()[row] = v.into(), + (Column::f32(c), Value::f32(v)) => c.borrow_mut()[row] = v, + (Column::F64(c), Value::F64(v)) => c.borrow_mut()[row] = v, + (Column::U8(c), Value::U8(v)) => c.borrow_mut()[row] = v, + (Column::U8(c), Value::U64(v)) => c.borrow_mut()[row] = v.into(), + (Column::U16(c), Value::U16(v)) => c.borrow_mut()[row] = v, + (Column::U32(c), Value::U32(v)) => c.borrow_mut()[row] = v, + (Column::U64(c), Value::U64(v)) => c.borrow_mut()[row] = v, + (Column::U128(c), Value::U128(v)) => c.borrow_mut()[row] = v, + (Column::I8(c), Value::I8(v)) => c.borrow_mut()[row] = v, + (Column::I16(c), Value::I16(v)) => c.borrow_mut()[row] = v, + (Column::I32(c), Value::I32(v)) => c.borrow_mut()[row] = v, + (Column::I64(c), Value::I64(v)) => c.borrow_mut()[row] = v, + (Column::I128(c), Value::I128(v)) => c.borrow_mut()[row] = v, + (Column::Bool(c), Value::Bool(v)) => c.borrow_mut()[row] = v, + (Column::String(c), Value::String(v)) => c.borrow_mut()[row] = v, + (Column::Any(c), v) => c.borrow_mut()[row] = v, + (Column::Ref(c), Value::Reference(v)) => c.borrow_mut()[row] = v, + (Column::Empty, Value::Empty) => (), + (x,y) => { + return Err(MechError{msg: "".to_string(), id: 7016, kind: MechErrorKind::GenericError(format!("{:?}",y))}); + }, + } + Ok(()) + } else { + Err(MechError{msg: "".to_string(), id: 7017, kind: MechErrorKind::None}) + } + } + + pub fn get(&self, row: &TableIndex, col: &TableIndex) -> Result { + let row_ix = match row { + TableIndex::Index(0) => {return Err(MechError{msg: "".to_string(), id: 7018, kind: MechErrorKind::None})}, + TableIndex::Index(ix) => ix - 1, + _ => 0, + }; + let col_ix = match col { + TableIndex::Index(0) => {return Err(MechError{msg: "".to_string(), id: 7019, kind: MechErrorKind::None})}, + TableIndex::Index(ix) => ix - 1, + TableIndex::Alias(alias) => { + match self.col_map.get_index(alias) { + Ok(ix) => ix, + Err(_) => {return Err(MechError{msg: "".to_string(), id: 7020, kind: MechErrorKind::None})} + } + } + _ => 0, + }; + self.get_raw(row_ix,col_ix) + } + + pub fn get_raw(&self, row: usize, col: usize) -> Result { + if col < self.cols && row < self.rows { + match &self.data[col] { + Column::Time(c) => Ok(Value::Time(c.borrow()[row])), + Column::Length(c) => Ok(Value::Length(c.borrow()[row])), + Column::Speed(c) => Ok(Value::Speed(c.borrow()[row])), + Column::F32(c) => Ok(Value::F32(c.borrow()[row])), + Column::f32(c) => Ok(Value::f32(c.borrow()[row])), + Column::F64(c) => Ok(Value::F64(c.borrow()[row])), + Column::U8(c) => Ok(Value::U8(c.borrow()[row])), + Column::U16(c) => Ok(Value::U16(c.borrow()[row])), + Column::U32(c) => Ok(Value::U32(c.borrow()[row])), + Column::U64(c) => Ok(Value::U64(c.borrow()[row])), + Column::U128(c) => Ok(Value::U128(c.borrow()[row])), + Column::I8(c) => Ok(Value::I8(c.borrow()[row])), + Column::I16(c) => Ok(Value::I16(c.borrow()[row])), + Column::I32(c) => Ok(Value::I32(c.borrow()[row])), + Column::I64(c) => Ok(Value::I64(c.borrow()[row])), + Column::I128(c) => Ok(Value::I128(c.borrow()[row])), + Column::Bool(c) => Ok(Value::Bool(c.borrow()[row])), + Column::String(c) => Ok(Value::String(c.borrow()[row].clone())), + Column::Ref(c) => Ok(Value::Reference(c.borrow()[row].clone())), + Column::Any(c) => Ok(c.borrow()[row].clone()), + Column::Empty => Ok(Value::Empty), + x => { + Err(MechError{msg: "".to_string(), id: 7021, kind: MechErrorKind::None}) + }, + } + } else { + Err(MechError{msg: "".to_string(), id: 7022, kind: MechErrorKind::None}) + } + } + + pub fn get_linear_raw(&self, ix: usize) -> Result { + self.get_linear(ix-1) + } + + pub fn get_linear(&self, ix: usize) -> Result { + if ix < self.rows * self.cols { + let row = ix / self.cols; + let col = ix % self.cols; + self.get_raw(row,col) + } else { + Err(MechError{msg: "".to_string(), id: 7023, kind: MechErrorKind::None}) + } + } + + pub fn len(&self) -> usize { + self.rows * self.cols + } + + pub fn get_column_unchecked(&self, col: usize) -> Column { + self.data[col].clone() + } + + pub fn has_col_aliases(&self) -> bool { + self.col_map.alias_to_ix.len() > 0 + } + + pub fn index_to_subscript(&self, ix: usize) -> Result<(usize, usize),MechError> { + let row = ix / self.cols; + let col = ix % self.cols; + if ix < self.rows * self.cols { + Ok((row,col)) + } else { + Err(MechError{msg: "".to_string(), id: 7024, kind: MechErrorKind::None}) + } + } + + pub fn set_linear(&self, ix: usize, val: Value) -> Result<(),MechError> { + if ix < self.rows * self.cols { + let row = ix / self.cols; + let col = ix % self.cols; + self.set_raw(row,col, val) + } else { + Err(MechError{msg: "".to_string(), id: 7025, kind: MechErrorKind::None}) + } + } + + pub fn shape(&self) -> TableShape { + match (self.rows, self.cols) { + (0,_) | + (_,0) => TableShape::Pending(TableId::Global(self.id)), + (1,1) => TableShape::Scalar, + (x,1) => TableShape::Column(x), + (1,x) => TableShape::Row(x), + (x,y) => TableShape::Matrix(x,y), + } + } + + pub fn logical_len(&self) -> usize { + match self.kind() { + ValueKind::Bool => { + let mut len = 0; + for i in 0..self.len() { + match self.get_linear(i) { + Ok(Value::Bool(x)) => if x == true { len += 1 }, + _ => (), + } + } + len + } + _ => self.len(), + } + } + + pub fn to_changes(&self) -> Vec { + let mut changes = vec![]; + changes.push(Change::NewTable{table_id: self.id, rows: self.rows, columns: self.cols}); + for ((alias,ix)) in self.col_map.iter() { + changes.push(Change::ColumnAlias{table_id: self.id, column_ix: *ix, column_alias: *alias}); + } + for (ix,kind) in self.col_kinds.iter().enumerate() { + changes.push(Change::ColumnKind{table_id: self.id, column_ix: ix, column_kind: kind.clone()}); + } + let mut data_changes = self.data_to_changes(); + changes.append(&mut data_changes); + changes + } + + pub fn data_to_changes(&self) -> Vec { + let mut changes = vec![]; + let mut values = vec![]; + for i in 0..self.rows { + for j in 0..self.cols { + match self.get_raw(i,j) { + Ok(value) => {values.push((TableIndex::Index(i+1), TableIndex::Index(j+1), value));} + _ => (), + } + } + } + changes.push(Change::Set((self.id, values))); + changes + } + + collect_columns!(collect_columns_u8,unwrap_u8,U8); + collect_columns!(collect_columns_u16,unwrap_u16,U16); + collect_columns!(collect_columns_u32,unwrap_u32,U32); + collect_columns!(collect_columns_u64,unwrap_u64,U64); + collect_columns!(collect_columns_u128,unwrap_u128,U128); + collect_columns!(collect_columns_i8,unwrap_i8,I8); + collect_columns!(collect_columns_i16,unwrap_i16,I16); + collect_columns!(collect_columns_i32,unwrap_i32,I32); + collect_columns!(collect_columns_i64,unwrap_i64,I64); + collect_columns!(collect_columns_i128,unwrap_i128,I128); + collect_columns!(collect_columns_f32,unwrap_f32,F32); + collect_columns!(collect_columns_f64,unwrap_f64,F64); + +} + +#[macro_export] +macro_rules! collect_columns { + ($function_name:tt,$unwrap:tt,$type:tt) => ( + pub fn $function_name(&self) -> Vec> { + let mut cols: Vec> = vec![]; + for col_ix in 0..self.cols { + let col = self.data[col_ix].$unwrap().unwrap(); + cols.push(col.clone()); + } + cols + } + ) +} + +pub type TableIx = usize; +pub type Alias = u64; + + +#[derive(Debug, Clone)] +pub struct AliasMap { + pub capacity: usize, + pub ix_to_alias: Vec, + pub alias_to_ix: IndexMap, +} + +impl AliasMap { + pub fn new(capacity: usize) -> Self { + AliasMap { + capacity, + ix_to_alias: vec![0;capacity], + alias_to_ix: IndexMap::new(), + } + } + + pub fn resize(&mut self, new_capacity: usize) { + self.capacity = new_capacity; + self.ix_to_alias.resize(new_capacity,0); + } + + pub fn insert(&mut self, ix: TableIx, alias: Alias) -> std::result::Result<(),MechError> { + if ix < self.capacity { + self.ix_to_alias[ix] = alias; + self.alias_to_ix.insert(alias,ix); + Ok(()) + } else { + Err(MechError{msg: "".to_string(), id: 7026, kind: MechErrorKind::None}) + } + } + + pub fn get_index(&self, alias: &Alias) -> std::result::Result { + match self.alias_to_ix.get(alias) { + Some(ix) => Ok(*ix), + None => Err(MechError{msg: "".to_string(), id: 7027, kind: MechErrorKind::GenericError(format!("{:?}", humanize(alias)))}), + } + } + + pub fn get_alias(&self, ix: &TableIx) -> std::result::Result { + if ix < &self.capacity { + Ok(self.ix_to_alias[*ix]) + } else { + Err(MechError{msg: "".to_string(), id: 7028, kind: MechErrorKind::None}) + } + } + + pub fn aliases(&self) -> std::slice::Iter { + self.ix_to_alias.iter() + } + + pub fn iter(&self) -> indexmap::map::Iter { + self.alias_to_ix.iter() + } + + pub fn len(&self) -> usize { + self.alias_to_ix.iter().len() + } + +} + +impl fmt::Debug for Table { + #[inline] + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + let mut table_drawing = BoxPrinter::new(); + table_drawing.add_table(self); + write!(f,"{:?}",table_drawing)?; + Ok(()) + } +} \ No newline at end of file diff --git a/src/core/src/transformation.rs b/src/core/src/transformation.rs new file mode 100644 index 0000000..3b801d2 --- /dev/null +++ b/src/core/src/transformation.rs @@ -0,0 +1,172 @@ + +/* + +Defines an enum type Transformation that represents a set of different transformations that can be applied to tables in Mech. The transformations include things like selecting rows and columns, setting values, defining new tables, and applying functions: + +- Identifier: refers to a named identifier or variable +- NumberLiteral: represents a numerical value +- TableAlias: refers to a table by its alias +- TableReference: refers to a table by its ID and a reference value +- NewTable: creates a new table with a given number of rows and columns +- Constant: sets a constant value for a table +- ColumnKind: sets the data type of a column in a table +- Set: copies the value from one cell in a table to another cell in a different table +- UpdateData: updates the value of a cell in a table +- ColumnAlias: refers to a column in a table by its alias +- RowAlias: refers to a row in a table by its alias +- Whenever: specifies a set of indices to be used for filtering tables +- Function: applies a function to the specified arguments and returns a new table +- TableDefine: creates a new table with specified indices and returns its ID +- Select: selects a subset of a table based on the specified indices +*/ + + +use crate::*; +use crate::Argument; +use std::cell::RefCell; +use std::rc::Rc; +use std::fmt; +use std::cmp::Ordering; + +#[derive(Clone, Serialize, Deserialize)] +pub enum Transformation { + Identifier{ name: Vec, id: u64 }, + NumberLiteral{kind: u64, bytes: Vec}, + TableAlias{table_id: TableId, alias: u64}, + TableReference{table_id: TableId, reference: Value}, + NewTable{table_id: TableId, rows: usize, columns: usize }, + Constant{table_id: TableId, value: Value}, + ColumnKind{table_id: TableId, column_ix: usize, kind: u64}, + Set{src_id: TableId, src_row: TableIndex, src_col: TableIndex, dest_id: TableId, dest_row: TableIndex, dest_col: TableIndex}, + UpdateData{name: u64, src_id: TableId, src_row: TableIndex, src_col: TableIndex, dest_id: TableId, dest_row: TableIndex, dest_col: TableIndex}, + ColumnAlias{table_id: TableId, column_ix: usize, column_alias: u64}, + RowAlias{table_id: TableId, row_ix: usize, row_alias: u64}, + Whenever{table_id: TableId, indices: Vec<(TableIndex, TableIndex)>}, + Function{name: u64, arguments: Vec, out: (TableId, TableIndex, TableIndex)}, + TableDefine{table_id: TableId, indices: Vec<(TableIndex, TableIndex)>, out: TableId}, + Select{table_id: TableId, indices: Vec<(TableIndex, TableIndex)>}, + FollowedBy{table_id: TableId, initial: TableId, subsequent: TableId}, +} + +impl fmt::Debug for Transformation { + #[inline] + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match &self { + Transformation::Identifier{name,id} => + write!(f,"👀 Identifier(name: {:?}, id: {})",name,humanize(id))?, + Transformation::Constant{table_id, value} => + write!(f,"🪨 Constant(table_id: {:?}, value: {:?})",table_id, value)?, + Transformation::Select{table_id,indices} => + write!(f,"✅ Select(table_id: {:#?}, indices: {:#?})",table_id,indices)?, + Transformation::NumberLiteral{kind,bytes} => + write!(f,"🐙 NumberLiteral(kind: {:?}, bytes: {:?})",humanize(kind),bytes)?, + Transformation::Whenever{table_id,indices} => + write!(f,"⏲️ Whenever(table_id: {:#?}, indices: {:#?})",table_id,indices)?, + Transformation::TableAlias{table_id,alias} => + write!(f,"🥸 TableAlias(table_id: {:?}, alias: {})",table_id,humanize(alias))?, + Transformation::NewTable{table_id, rows, columns} => + write!(f,"🌚 NewTable(table_id: {:?}, rows: {} cols: {})",table_id,rows,columns)?, + Transformation::TableReference{table_id, reference} => + write!(f,"📛 TableReference(table_id: {:?}, reference: {:?})",table_id, reference)?, + Transformation::Function{name,arguments,out} => { + write!(f,"🧮 Function(name: {}, args: {:#?}, out: {:#?})",humanize(name),arguments,out)? }, + Transformation::TableDefine{table_id, indices, out} => + write!(f,"📅 TableDefine(table_id: {:?}, indices: {:?}, out: {:?})",table_id, indices, out)?, + Transformation::ColumnKind{table_id, column_ix, kind} => + write!(f,"🎩 ColumnKind(table_id: {:?}, column_ix: {}, kind: {})",table_id,column_ix,humanize(kind))?, + Transformation::RowAlias{table_id, row_ix, row_alias} => + write!(f,"🥸 RowAlias(table_id: {:?}, row_ix: {}, row_alias: {})",table_id,row_ix,humanize(row_alias))?, + Transformation::ColumnAlias{table_id, column_ix, column_alias} => + write!(f,"🥸 ColumnAlias(table_id: {:?}, column_ix: {}, column_alias: {})",table_id,column_ix,humanize(column_alias))?, + Transformation::Set{src_id, src_row, src_col, dest_id, dest_row, dest_col} => + write!(f,"♟️ Set(src_id: {:?}, src_indices: ({:?},{:?}),\n dest_id: {:?}, dest_indices: ({:?},{:?}))",src_id,src_row,src_col,dest_id,dest_row,dest_col)?, + Transformation::UpdateData{name, src_id, src_row, src_col, dest_id, dest_row, dest_col} => + write!(f,"♻️ UpdateData(name: {}, src_id: {:?}, src_indices: ({:?},{:?}),\n dest_id: {:?}, dest_indices: ({:?},{:?}))",humanize(name),src_id,src_row,src_col,dest_id,dest_row,dest_col)?, + Transformation::FollowedBy{table_id, initial, subsequent} => + write!(f,"➡️ FollowedBy(table_id: {:?}, initial: {:?}, subsequent: {:?})", table_id, initial, subsequent)?, + } + Ok(()) + } +} + +impl Ord for Transformation { + fn cmp(&self, other: &Self) -> Ordering { + Ordering::Equal + } +} + +impl PartialOrd for Transformation { + fn partial_cmp(&self, other: &Self) -> Option { + match (self,other) { + (Transformation::Whenever{..},_) => { + return Some(Ordering::Greater); + } + (_,Transformation::Whenever{..}) => { + return Some(Ordering::Less); + } + (Transformation::UpdateData{..},_) => { + return Some(Ordering::Greater); + } + (_,Transformation::UpdateData{..}) => { + return Some(Ordering::Less); + } + (Transformation::Set{..},_) => { + return Some(Ordering::Greater); + } + (_,Transformation::Set{..}) => { + return Some(Ordering::Less); + } + (Transformation::TableDefine{..},_) => { + return Some(Ordering::Greater); + } + (_,Transformation::TableDefine{..}) => { + return Some(Ordering::Less); + } + (Transformation::FollowedBy{..},_) => { + return Some(Ordering::Greater); + } + (_,Transformation::FollowedBy{..}) => { + return Some(Ordering::Less); + } + (Transformation::Function{..},_) => { + return Some(Ordering::Greater); + } + (_,Transformation::Function{..}) => { + return Some(Ordering::Less); + } + (Transformation::TableReference{..}, + Transformation::TableReference{..}) => { + Some(Ordering::Less) + } + (Transformation::NewTable{table_id,..},Transformation::NewTable{table_id: table_id2, ..}) => { + if table_id.unwrap() > table_id2.unwrap() { + Some(Ordering::Greater) + } else { + Some(Ordering::Less) + } + }, + (Transformation::TableReference{..},Transformation::ColumnAlias{..}) => Some(Ordering::Greater), + (Transformation::ColumnAlias{..},Transformation::TableReference{..}) => Some(Ordering::Less), + (_,Transformation::NewTable{..}) => Some(Ordering::Greater), + (Transformation::NewTable{..},_) => Some(Ordering::Less), + (_,Transformation::Identifier{..}) => Some(Ordering::Greater), + (Transformation::Identifier{..},_) => Some(Ordering::Less), + (_,Transformation::TableAlias{..}) => Some(Ordering::Greater), + (Transformation::TableAlias{..},_) => Some(Ordering::Less), + (_,Transformation::NumberLiteral{..}) => Some(Ordering::Greater), + (Transformation::NumberLiteral{..},_) => Some(Ordering::Less), + (Transformation::Set{src_id,..},_) => Some(Ordering::Greater), + (_,Transformation::Set{src_id,..}) => Some(Ordering::Less), + x => { + None + } + } + } +} + +impl Eq for Transformation { } +impl PartialEq for Transformation { + fn eq(&self, other: &Self) -> bool { + hash_str(&format!("{:?}",self)) == hash_str(&format!("{:?}",other)) + } +} \ No newline at end of file diff --git a/src/core/src/user_functions.rs b/src/core/src/user_functions.rs new file mode 100644 index 0000000..7055883 --- /dev/null +++ b/src/core/src/user_functions.rs @@ -0,0 +1,115 @@ +use crate::*; + +#[cfg(feature = "stdlib")] +use crate::function::table::*; + +use hashbrown::{HashSet, HashMap}; + +// # User-defined Mech Functions + + +/* + +User defined functions are functions written in Mech that can use other user-defined functions or Rust functions in their body, but not machines as they are side-effectful. They are also idempotent and cannot use global tables or temporal operators. Inputs are passed as arguments and outputs must be explicitly defined. A user-defined function is compiled into a block and the input arguments are resolved, the steps are compiled and the output arguments are resolved. The compiled user function can then be used as a Mech function. + +In Mech, user-defined functions support both overloading and dynamic dispatch. + +- Overloading refers to defining multiple functions with the same name, but different parameter types or number of parameters. In Mech, the function name and its input arguments' types are used to identify which version of the function to call. This is useful when a function is used in multiple contexts, with different input types or parameter lists. + +- Dynamic dispatch refers to the ability to determine at runtime which version of a function to call based on the input types, rather than being determined at compile-time. This is important when working with polymorphic types or when using functions that have different versions for different types. + +Mech supports overloading and dynamic dispatch in user-defined functions by allowing the user to specify the input and output types for each function. When a user-defined function is called, Mech uses the input types to determine which version of the function to call. This allows for greater flexibility in the types of inputs that can be used with user-defined functions. +*/ + + +#[derive(Clone, Debug)] +pub struct UserFunction { + pub name: u64, + pub inputs: HashMap, + pub outputs: HashMap, + pub transformations: Vec, +} + +impl UserFunction { + pub fn new() -> UserFunction { + UserFunction { + name: 0, + inputs: HashMap::new(), + outputs: HashMap::new(), + transformations: Vec::new(), + } + } + + pub fn compile(&self, block: &mut Block, arguments: &Vec, out: &Out) -> Result { + let mut fxn_block = Block::new(); + fxn_block.functions = block.functions.clone(); + fxn_block.user_functions = block.user_functions.clone(); + + // Resolve input arguments + for (arg_name, arg_table_id, indices) in arguments { + match self.inputs.get(arg_name) { + Some(kind) => { + let table_ref = block.get_table(arg_table_id)?; + let block_id = {table_ref.borrow().id.clone()}; + fxn_block.tables.insert_table_ref(table_ref.clone()); + let tfm = Transformation::TableAlias{ + table_id: TableId::Local(block_id), + alias: *arg_name, + }; + fxn_block.add_tfm(tfm); + }, + _ => (), + } + } + + // Compile function steps + let mut tfms = self.transformations.clone(); + tfms.sort(); + tfms.dedup(); + for tfm in &tfms { + fxn_block.add_tfm(tfm.clone()); + } + + // Resolve output arguments + for (name,kind) in self.outputs.iter() { + let (out_table_id, _, _) = out; + let out_table_ref = block.get_table(out_table_id)?; + fxn_block.tables.insert_table_ref(out_table_ref.clone()); + #[cfg(feature = "stdlib")] + fxn_block.add_tfm(Transformation::Function{ + name: *TABLE_HORIZONTAL__CONCATENATE, + arguments: vec![(0,TableId::Local(*name),vec![(TableIndex::All,TableIndex::All)])], + out: (*out_table_id,TableIndex::All,TableIndex::All), + }); + } + fxn_block.id = hash_str(&format!("{:?}{:?}{:?}",block.id,self.name,self.inputs)); + + let compiled_fxn = CompiledUserFunction{ + name: self.name, + inputs: self.inputs.clone(), + outputs: self.outputs.clone(), + block: fxn_block + }; + Ok(compiled_fxn) + } + +} + +#[derive(Clone, Debug)] +pub struct CompiledUserFunction { + pub name: u64, + pub inputs: HashMap, + pub outputs: HashMap, + pub block: Block, +} + +impl MechFunction for CompiledUserFunction { + + fn solve(&self) { + self.block.solve(); + } + fn to_string(&self) -> String { + format!("{:?}", self.block) + } + +} \ No newline at end of file diff --git a/src/core/src/value.rs b/src/core/src/value.rs new file mode 100644 index 0000000..f996463 --- /dev/null +++ b/src/core/src/value.rs @@ -0,0 +1,324 @@ +// # Value + +/* +Implementation for the Value data type in Mech, The Value type contains various primitive types, such as integers, floats, and booleans, and can also represent strings and references to tables. Provides methods for converting between the Value type and other data types, as well as for retrieving information about the type of a given Value. By unifying all these values into an enum, Mech can treat them as a single type that can be used in a variety of contexts. +*/ + + +// ## Prelude + +#[cfg(feature = "no-std")] use alloc::fmt; +#[cfg(feature = "no-std")] use alloc::string::String; +#[cfg(feature = "no-std")] use alloc::vec::Vec; +use crate::*; +use std::fmt; +use std::mem::transmute; +use std::convert::TryInto; + +// ## Value structs and enums + +#[derive(Clone,PartialEq,PartialOrd,Serialize,Deserialize)] +pub enum Value { + U8(U8), + U16(U16), + U32(U32), + U64(U64), + U128(U128), + I8(I8), + I16(I16), + I32(I32), + I64(I64), + I128(I128), + f32(f32), + F32(F32), + F64(F64), + Bool(bool), + Time(F32), + Length(F32), + Speed(F32), + Angle(F32), + String(MechString), + Reference(TableId), + Empty, +} + +impl Value { + + pub fn as_table_reference(&self) -> Result { + match self { + Value::Reference(table_id) => Ok(*table_id), + _ => Err(MechError{msg: "".to_string(), id: 4020, kind: MechErrorKind::None}), + } + } + + pub fn as_string(&self) -> Result { + match self { + Value::String(string) => Ok(string.clone()), + _ => Err(MechError{msg: "".to_string(), id: 4021, kind: MechErrorKind::None}), + } + } + + pub fn from_string(string: &String) -> Value { + Value::String(MechString::from_string(string.clone())) + } + + pub fn from_str(string: &str) -> Value { + Value::String(MechString::from_string(string.to_string())) + } + + pub fn kind(&self) -> ValueKind { + match &self { + Value::U8(_) => ValueKind::U8, + Value::U16(_) => ValueKind::U16, + Value::U32(_) => ValueKind::U32, + Value::U64(_) => ValueKind::U64, + Value::U128(_) => ValueKind::U128, + Value::I8(_) => ValueKind::I8, + Value::I16(_) => ValueKind::I16, + Value::I32(_) => ValueKind::I32, + Value::I64(_) => ValueKind::I64, + Value::I128(_) => ValueKind::I128, + Value::Time(_) => ValueKind::Time, + Value::Length(_) => ValueKind::Length, + Value::Speed(_) => ValueKind::Speed, + Value::Angle(_) => ValueKind::Angle, + Value::F32(_) => ValueKind::F32, + Value::F64(_) => ValueKind::F64, + Value::f32(_) => ValueKind::f32, + Value::Bool(_) => ValueKind::Bool, + Value::Reference(_) => ValueKind::Reference, + Value::String(_) => ValueKind::String, + Value::Empty => ValueKind::Empty, + } + } + +} + +impl fmt::Debug for Value { + #[inline] + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match &self { + Value::U8(v) => write!(f,"{:?}",v)?, + Value::U16(v) => write!(f,"{:?}",v)?, + Value::U32(v) => write!(f,"{:?}",v)?, + Value::U64(v) => write!(f,"{:?}",v)?, + Value::U128(v) => write!(f,"{:?}",v)?, + Value::I8(v) => write!(f,"{:?}",v)?, + Value::I16(v) => write!(f,"{:?}",v)?, + Value::I32(v) => write!(f,"{:?}",v)?, + Value::I64(v) => write!(f,"{:?}",v)?, + Value::I128(v) => write!(f,"{:?}",v)?, + Value::Time(v) => write!(f,"{:?}",v)?, + Value::Length(v) => write!(f,"{:?}",v)?, + Value::Speed(v) => write!(f,"{:?}",v)?, + Value::Angle(v) => write!(f,"{:?}",v)?, + Value::f32(v) => write!(f,"{:?}",v)?, + Value::F32(v) => write!(f,"{:?}",v)?, + Value::F64(v) => write!(f,"{:?}",v)?, + Value::Bool(v) => write!(f,"{}",v)?, + Value::Reference(v) => write!(f,"{:?}",v)?, + Value::String(v) => { + write!(f,"\"{}\"",v.to_string())? + }, + Value::Empty => write!(f,"_")?, + } + Ok(()) + } +} + +#[derive(Debug, Clone, Hash, Eq, PartialEq, Serialize, Deserialize)] +pub enum ValueKind { + U8, + U16, + U32, + U64, + U128, + I8, + I16, + I32, + I64, + I128, + F32, + f32, + F64, + Index, + Quantity, + Bool, + Time, + Length, + Angle, + Speed, + String, + Reference, + NumberLiteral, + Any, + Compound(Vec), // Note: Not sure of the implications here, doing this to return a ValueKind for a table. + Empty +} + + +#[derive(Debug, Clone, Hash, Eq, PartialEq, Serialize, Deserialize)] +pub struct NumberLiteral { + pub kind: u64, + pub bytes: Vec, +} + +impl NumberLiteral { + + pub fn new(kind: u64, bytes: Vec) -> NumberLiteral { + NumberLiteral{kind,bytes} + } + + fn is_float(&self) -> bool { + if self.kind == *cF32 || self.kind == *cF32L { + true + } else { + false + } + } + + pub fn as_u8(&mut self) -> u8 { + if self.is_float() { + self.as_f32() as u8 + } else { + self.bytes.last().unwrap().clone() + } + } + + pub fn as_u16(&mut self) -> u16 { + if self.is_float() { + self.as_f32() as u16 + } else { + while self.bytes.len() < 2 { + self.bytes.insert(0,0); + } + let (fbytes, rest) = self.bytes.split_at(std::mem::size_of::()); + let x = u16::from_be_bytes(fbytes.try_into().unwrap()); + x + } + } + + pub fn as_u32(&mut self) -> u32 { + if self.is_float() { + self.as_f32() as u32 + } else { + while self.bytes.len() < 4 { + self.bytes.insert(0,0); + } + let (fbytes, rest) = self.bytes.split_at(std::mem::size_of::()); + let x = u32::from_be_bytes(fbytes.try_into().unwrap()); + x + } + } + + pub fn as_u64(&mut self) -> u64 { + if self.is_float() { + self.as_f32() as u64 + } else { + while self.bytes.len() < 8 { + self.bytes.insert(0,0); + } + let (fbytes, rest) = self.bytes.split_at(std::mem::size_of::()); + let x = u64::from_be_bytes(fbytes.try_into().unwrap()); + x + } + } + + pub fn as_u128(&mut self) -> u128 { + if self.is_float() { + self.as_f32() as u128 + } else { + while self.bytes.len() < 16 { + self.bytes.insert(0,0); + } + let (fbytes, rest) = self.bytes.split_at(std::mem::size_of::()); + let x = u128::from_be_bytes(fbytes.try_into().unwrap()); + x + } + } + + pub fn as_i8(&mut self) -> i8 { + if self.is_float() { + self.as_f32() as i8 + } else { + self.bytes.last().unwrap().clone() as i8 + } + } + + pub fn as_i16(&mut self) -> i16 { + if self.is_float() { + self.as_f32() as i16 + } else { + while self.bytes.len() < 2 { + self.bytes.insert(0,0); + } + let (fbytes, rest) = self.bytes.split_at(std::mem::size_of::()); + let x = i16::from_be_bytes(fbytes.try_into().unwrap()); + x + } + } + + pub fn as_i32(&mut self) -> i32 { + if self.is_float() { + self.as_f32() as i32 + } else { + while self.bytes.len() < 4 { + self.bytes.insert(0,0); + } + let (fbytes, rest) = self.bytes.split_at(std::mem::size_of::()); + let x = i32::from_be_bytes(fbytes.try_into().unwrap()); + x + } + } + + pub fn as_i64(&mut self) -> i64 { + if self.is_float() { + self.as_f32() as i64 + } else { + while self.bytes.len() < 8 { + self.bytes.insert(0,0); + } + let (fbytes, rest) = self.bytes.split_at(std::mem::size_of::()); + let x = i64::from_be_bytes(fbytes.try_into().unwrap()); + x + } + } + + pub fn as_i128(&mut self) -> i128 { + if self.is_float() { + self.as_f32() as i128 + } else { + while self.bytes.len() < 16 { + self.bytes.insert(0,0); + } + let (fbytes, rest) = self.bytes.split_at(std::mem::size_of::()); + let x = i128::from_be_bytes(fbytes.try_into().unwrap()); + x + } + } + + pub fn as_f32(&mut self) -> f32 { + while self.bytes.len() < 4 { + self.bytes.insert(0,0); + } + let (fbytes, rest) = self.bytes.split_at(std::mem::size_of::()); + f32::from_be_bytes(fbytes.try_into().unwrap()) + } + + pub fn as_f64(&mut self) -> f64 { + while self.bytes.len() < 8 { + self.bytes.insert(0,0); + } + let (fbytes, rest) = self.bytes.split_at(std::mem::size_of::()); + f64::from_be_bytes(fbytes.try_into().unwrap()) + } + + pub fn as_usize(&mut self) -> usize { + if self.is_float() { + self.as_f32() as usize + } else { + self.as_u64() as usize + } + } + +} \ No newline at end of file From 4c94fcb8e712aae7fb5884807de1015296368875 Mon Sep 17 00:00:00 2001 From: cmontella Date: Mon, 22 May 2023 21:15:26 -0400 Subject: [PATCH 68/84] add syntax --- src/program/Cargo.toml | 38 + src/program/LICENSE | 201 + src/program/README.md | 29 + src/program/src/lib.rs | 258 ++ src/program/src/persister.rs | 89 + src/program/src/program.rs | 482 +++ src/program/src/runloop.rs | 803 ++++ src/program/tests/program.rs | 32 + src/syntax/Cargo.toml | 38 + src/syntax/LICENSE | 201 + src/syntax/README.md | 36 + src/syntax/editor-modes/vscode/.gitignore | 3 + src/syntax/editor-modes/vscode/README.md | 17 + .../editor-modes/vscode/images/logo.png | Bin 0 -> 1893 bytes .../editor-modes/vscode/images/mech-m3.png | Bin 0 -> 5935 bytes .../vscode/language-configuration.json | 30 + .../editor-modes/vscode/package-lock.json | 3563 +++++++++++++++++ src/syntax/editor-modes/vscode/package.json | 85 + .../editor-modes/vscode/src/extension.ts | 76 + .../vscode/syntaxes/mech.tmLanguage.json | 275 ++ src/syntax/editor-modes/vscode/tsconfig.json | 12 + src/syntax/grammar.md | 249 ++ src/syntax/grammar.txt | 179 + src/syntax/src/ast.rs | 849 ++++ src/syntax/src/bin/main.rs | 133 + src/syntax/src/compiler.rs | 1241 ++++++ src/syntax/src/formatter.rs | 677 ++++ src/syntax/src/langserver/backend.rs | 290 ++ src/syntax/src/langserver/mod.rs | 29 + src/syntax/src/lib.rs | 24 + src/syntax/src/parser.rs | 2737 +++++++++++++ src/syntax/tests/compiler.rs | 1756 ++++++++ src/syntax/tests/parser.rs | 321 ++ 33 files changed, 14753 insertions(+) create mode 100644 src/program/Cargo.toml create mode 100644 src/program/LICENSE create mode 100644 src/program/README.md create mode 100644 src/program/src/lib.rs create mode 100644 src/program/src/persister.rs create mode 100644 src/program/src/program.rs create mode 100644 src/program/src/runloop.rs create mode 100644 src/program/tests/program.rs create mode 100644 src/syntax/Cargo.toml create mode 100644 src/syntax/LICENSE create mode 100644 src/syntax/README.md create mode 100644 src/syntax/editor-modes/vscode/.gitignore create mode 100644 src/syntax/editor-modes/vscode/README.md create mode 100644 src/syntax/editor-modes/vscode/images/logo.png create mode 100644 src/syntax/editor-modes/vscode/images/mech-m3.png create mode 100644 src/syntax/editor-modes/vscode/language-configuration.json create mode 100644 src/syntax/editor-modes/vscode/package-lock.json create mode 100644 src/syntax/editor-modes/vscode/package.json create mode 100644 src/syntax/editor-modes/vscode/src/extension.ts create mode 100644 src/syntax/editor-modes/vscode/syntaxes/mech.tmLanguage.json create mode 100644 src/syntax/editor-modes/vscode/tsconfig.json create mode 100644 src/syntax/grammar.md create mode 100644 src/syntax/grammar.txt create mode 100644 src/syntax/src/ast.rs create mode 100644 src/syntax/src/bin/main.rs create mode 100644 src/syntax/src/compiler.rs create mode 100644 src/syntax/src/formatter.rs create mode 100644 src/syntax/src/langserver/backend.rs create mode 100644 src/syntax/src/langserver/mod.rs create mode 100644 src/syntax/src/lib.rs create mode 100644 src/syntax/src/parser.rs create mode 100644 src/syntax/tests/compiler.rs create mode 100644 src/syntax/tests/parser.rs diff --git a/src/program/Cargo.toml b/src/program/Cargo.toml new file mode 100644 index 0000000..d2389e0 --- /dev/null +++ b/src/program/Cargo.toml @@ -0,0 +1,38 @@ +[package] +name = "mech-program" +version = "0.1.0" +authors = ["Corey Montella "] +description = "Organizes Mech cores into a coordinated program." +documentation = "http://docs.mech-lang.org" +homepage = "https://mech-lang.org" +repository = "https://github.com/mech-lang/program" +keywords = ["mech", "language", "programming", "dataflow", "runtime"] +categories = ["science::robotics", "science", "game-engines", "web-programming"] +license = "Apache-2.0" +readme = "README.md" +edition = "2021" + +[badges] +gitlab = { repository = "mech-lang/program", branch = "main" } +maintenance = { status = "actively-developed" } + +[dependencies] +mech-core = {git = "https://gitlab.com/mech-lang/core", branch = "v0.1-beta"} +mech-syntax = {git = "https://gitlab.com/mech-lang/syntax", branch = "v0.1-beta"} +mech-utilities = {git = "https://gitlab.com/mech-lang/utilities", branch = "v0.1-beta"} + +time = "0.3.17" +serde = "1.0.152" +serde_derive = "1.0.152" +serde_json = "1.0.91" +bincode = "1.3.3" +libloading = "0.7.4" +lazy_static = "1.4.0" +reqwest = "0.9.22" +colored = "2.0.0" +crossbeam-channel = "0.5.6" +url = "2.3.1" +hashbrown = "0.13.1" +websocket = "0.26.5" +miniz_oxide = "0.6.2" +indexmap = "1.9.2" \ No newline at end of file diff --git a/src/program/LICENSE b/src/program/LICENSE new file mode 100644 index 0000000..41c00c9 --- /dev/null +++ b/src/program/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2018 Corey Montella + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/src/program/README.md b/src/program/README.md new file mode 100644 index 0000000..d7215e0 --- /dev/null +++ b/src/program/README.md @@ -0,0 +1,29 @@ +

    + +

    + +Mech is a language for developing **data-driven**, **reactive** systems like robots, games, and animations. It makes **composing**, **transforming**, and **distributing** data easy, allowing you to focus on the essential complexity of your project. + +You can try Mech online at [https://mech-lang.org/try](https://mech-lang.org/try). + +Usage and installation instructions can be found in the [documentation](https://mech-lang.org/#/docs/index.mec) or the [main Mech repository](https://github.com/mech-lang/mech). + +Be sure to follow our [blog](https://mech-lang.org/blog/)([RSS](https://mech-lang.org/feed.xml))! + +## Program + +Organizes Mech cores into a coordinated program. Handles reading files, interfacing with libraries, and persisting changes top disk. + +## Contents + +- **program** - holds a Mech core and channels for communicating to a RunLoop. +- **runloop** - holds a handle to a thread on which a Mech program is running. It also holds channels for communicating between and editor, REPL, or remote core. +- **persister** - reads from and writes transactions to *.blx files. + +## Project Status + +Mech is currently in the **beta** stage of development. This means that the language is at a suitable stage for a wider audience. While most language feature implementations are started, none are finished, and some new features may, while others could be removed. Backwards and forwards compatibility of Mech programs is not guaranteed at this time. + +## License + +Apache 2.0 \ No newline at end of file diff --git a/src/program/src/lib.rs b/src/program/src/lib.rs new file mode 100644 index 0000000..bcbb305 --- /dev/null +++ b/src/program/src/lib.rs @@ -0,0 +1,258 @@ +// # Mech Program +#![allow(dead_code)] +#![allow(warnings)] + +// ## Prelude +#![feature(extern_prelude)] +#![feature(get_mut_unchecked)] +#![feature(hash_drain_filter)] + + +extern crate core; +extern crate libloading; +extern crate reqwest; +extern crate indexmap; + +#[macro_use] +extern crate serde_derive; +#[macro_use] +extern crate serde_json; +extern crate serde; +#[macro_use] +extern crate crossbeam_channel; +#[macro_use] +extern crate lazy_static; + +extern crate time; + +extern crate mech_core; +use mech_core::*; +extern crate mech_syntax; +use mech_syntax::formatter::Formatter; +extern crate mech_utilities; +extern crate colored; +extern crate websocket; + +use colored::*; +use libloading::Library; +use std::io::copy; +use std::fs::{OpenOptions, File, canonicalize, create_dir}; +use std::path::{Path, PathBuf}; +use crossbeam_channel::Sender; +use crossbeam_channel::Receiver; +use reqwest::StatusCode; +use mech_utilities::{RunLoopMessage, MechSocket, SocketMessage}; + +use std::io; +use std::io::prelude::*; +use std::time::{Duration, Instant, SystemTime}; +use std::thread::{self, JoinHandle}; +use std::sync::Mutex; +use websocket::sync::Server; +use std::net::{SocketAddr, UdpSocket, TcpListener, TcpStream}; +use std::collections::HashMap; + +// ## Modules + +pub mod program; +pub mod persister; +pub mod runloop; + +// ## Exported Modules + +pub use self::program::{Program}; +pub use self::runloop::{ProgramRunner, RunLoop, ClientMessage}; +pub use self::persister::{Persister}; + +lazy_static! { + static ref CORE_MAP: Mutex> = Mutex::new(HashMap::new()); +} + +pub fn start_maestro(mech_socket_address: String, formatted_address: String, maestro_address: String, websocket_address: String, mech_client_channel: Sender) -> Result,MechError> { + + mech_client_channel.send(RunLoopMessage::String((format!("Core socket started at: {}", mech_socket_address.clone()),None))); + + let mech_client_channel_ws = mech_client_channel.clone(); + let mech_client_channel_heartbeat = mech_client_channel.clone(); + + let core_thread = thread::Builder::new().name("Core socket".to_string()).spawn(move || { + // A socket bound to 3235 is the maestro. It will be the one other cores search for + 'socket_loop: loop { + match UdpSocket::bind(maestro_address.clone()) { + // The maestro core + Ok(socket) => { + mech_client_channel.send(RunLoopMessage::String((format!("{} Socket started at: {}", "[Maestro]".truecolor(246,192,78), maestro_address),None))); + let mut buf = [0; 16_383]; + // Heartbeat thread periodically checks to see how long it's been since we've last heard from each remote core + thread::Builder::new().name("Heartbeat".to_string()).spawn(move || { + loop { + thread::sleep(Duration::from_millis(500)); + let now = SystemTime::now(); + let mut core_map = CORE_MAP.lock().unwrap(); + // If a core hasn't been heard from since 1 second ago, disconnect it. + for (_, (remote_core_address, _)) in core_map.drain_filter(|_k,(_, last_seen)| now.duration_since(*last_seen).unwrap().as_secs_f32() > 1.0) { + mech_client_channel_heartbeat.send(RunLoopMessage::RemoteCoreDisconnect(hash_str(&remote_core_address.to_string()))); + } + } + }); + // TCP socket thread for websocket connections + thread::Builder::new().name("TCP Socket".to_string()).spawn(move || { + let server = Server::bind(websocket_address.clone()).unwrap(); + mech_client_channel_ws.send(RunLoopMessage::String((format!("{} Websocket server started at: {}","[Maestro]".truecolor(246,192,78), &websocket_address),None))); + for request in server.filter_map(Result::ok) { + let mut ws_stream = request.accept().unwrap(); + let address = ws_stream.peer_addr().unwrap(); + mech_client_channel_ws.send(RunLoopMessage::RemoteCoreConnect(MechSocket::WebSocket(ws_stream))); + } + }); + + // Loop to receive UDP messages from remote cores + loop { + let (amt, src) = socket.recv_from(&mut buf).unwrap(); + let now = SystemTime::now(); + let message: Result = bincode::deserialize(&buf); + match message { + // If a remote core connects, send a connection message back to it + Ok(SocketMessage::RemoteCoreConnect(remote_core_address)) => { + CORE_MAP.lock().unwrap().insert(src,(remote_core_address.clone(), SystemTime::now())); + mech_client_channel.send(RunLoopMessage::RemoteCoreConnect(MechSocket::UdpSocket(remote_core_address))); + let message = bincode::serialize(&SocketMessage::RemoteCoreConnect(mech_socket_address.clone())).unwrap(); + let len = socket.send_to(&message, src.clone()).unwrap(); + }, + Ok(SocketMessage::Ping) => { + let mut core_map = CORE_MAP.lock().unwrap(); + match core_map.get_mut(&src) { + Some((_, last_seen)) => { + *last_seen = now; + } + None => (), + } + let message = bincode::serialize(&SocketMessage::Pong).unwrap(); + let len = socket.send_to(&message, src).unwrap(); + }, + _ => (), + } + } + } + // Maestro port is already bound, start a remote core + Err(_) => { + let socket = UdpSocket::bind(formatted_address.clone()).unwrap(); + let message = bincode::serialize(&SocketMessage::RemoteCoreConnect(mech_socket_address.clone().to_string())).unwrap(); + // Send a remote core message to the maestro + let len = socket.send_to(&message, maestro_address.clone()).unwrap(); + let mut buf = [0; 16_383]; + loop { + let message = bincode::serialize(&SocketMessage::Ping).unwrap(); + let len = socket.send_to(&message, maestro_address.clone()).unwrap(); + match socket.recv_from(&mut buf) { + Ok((amt, src)) => { + let now = SystemTime::now(); + if src.to_string() == maestro_address { + let message: Result = bincode::deserialize(&buf); + match message { + Ok(SocketMessage::Pong) => { + thread::sleep(Duration::from_millis(500)); + // Maestro is still alive + }, + Ok(SocketMessage::RemoteCoreConnect(remote_core_address)) => { + CORE_MAP.lock().unwrap().insert(src,(remote_core_address.clone(), SystemTime::now())); + mech_client_channel.send(RunLoopMessage::RemoteCoreConnect(MechSocket::UdpSocket(remote_core_address))); + } + _ => (), + } + } + } + Err(_) => { + mech_client_channel_ws.send(RunLoopMessage::String(("Maestro has died.".to_string(),None))); + continue 'socket_loop; + } + } + } + } + } + } + }).unwrap(); + Ok(core_thread) +} + +pub fn format_errors(errors: &Vec) -> String { + let mut formatted_errors = "".to_string(); + let plural = if errors.len() == 1 { + "" + } else { + "s" + }; + let error_notice = format!("🐛 Found {} Error{}:\n", &errors.len(), plural); + formatted_errors = format!("{}\n{}\n\n", formatted_errors, error_notice); + for error in errors { + formatted_errors = format!("{}{}\n\n", formatted_errors, "───────────────────────────────────────────────────────────────────".truecolor(246,192,78)); + match &error.kind { + MechErrorKind::ParserError(ast,report,msg) => { formatted_errors = format!("{}{}", formatted_errors, msg);} + MechErrorKind::MissingTable(table_id) => { + formatted_errors = format!("{} Missing table: {}\n", formatted_errors, error.msg); + } + _ => { + formatted_errors = format!("{}\n{:?}\n", formatted_errors, error); + } + } + } + formatted_errors = format!("{}\n{}",formatted_errors, "───────────────────────────────────────────────────────────────────\n\n".truecolor(246,192,78)); + formatted_errors +} + +pub fn download_machine(machine_name: &str, name: &str, path_str: &str, ver: &str, outgoing: Option>) -> Result { + create_dir("machines"); + + let machine_file_path = format!("machines/{}",machine_name); + { + let path = Path::new(path_str); + // Download from the web + if path.to_str().unwrap().starts_with("https") { + match outgoing { + Some(ref sender) => {sender.send(ClientMessage::String(format!("{} {} v{}", "[Downloading]".truecolor(153,221,85), name, ver)));} + None => (), + } + let machine_url = format!("{}/{}", path_str, machine_name); + match reqwest::get(machine_url.as_str()) { + Ok(mut response) => { + match response.status() { + StatusCode::OK => { + let mut dest = File::create(machine_file_path.clone())?; + copy(&mut response, &mut dest)?; + }, + _ => { + match outgoing { + Some(sender) => {sender.send(ClientMessage::String(format!("{} Failed to download {} v{}", "[Error]".bright_red(), name, ver)));} + None => (), + } + }, + } + } + Err(_) => { + match outgoing { + Some(sender) => {sender.send(ClientMessage::String(format!("{} Failed to download {} v{}", "[Error]".bright_red(), name, ver)));} + None => (), + } + } + } + + // Load from a local directory + } else { + match outgoing { + Some(sender) => {sender.send(ClientMessage::String(format!("{} {} v{}", "[Loading]".truecolor(153,221,85), name, ver)));} + None => (), + } + let machine_path = format!("{}{}", path_str, machine_name); + let path = Path::new(&machine_path); + let mut dest = File::create(machine_file_path.clone())?; + let mut f = File::open(path)?; + copy(&mut f, &mut dest)?; + } + } + let machine_file_path = format!("machines/{}",machine_name); + let message = format!("Can't load library {:?}", machine_file_path); + match unsafe{Library::new(machine_file_path)} { + Ok(machine) => Ok(machine), + Err(err) => Err(MechError{msg: "".to_string(), id: 1273, kind: MechErrorKind::GenericError(format!("{:?}",message))}), + } +} diff --git a/src/program/src/persister.rs b/src/program/src/persister.rs new file mode 100644 index 0000000..dcc304f --- /dev/null +++ b/src/program/src/persister.rs @@ -0,0 +1,89 @@ +use mech_core::{Core, humanize, Register, Transaction, Change}; +use std::fs::{OpenOptions, File, canonicalize, create_dir}; +use std::io::{Write, BufReader, BufWriter}; +use crossbeam_channel::Sender; +use crossbeam_channel::Receiver; +use std::thread::{self, JoinHandle}; +use std::mem; + +// ## Persister + +pub enum PersisterMessage { + Stop, + Write(Vec), +} + +pub struct Persister { + thread: JoinHandle<()>, + outgoing: Sender, + loaded: Vec, +} + +impl Persister { + pub fn new(path_ref:&str) -> Persister { + let (outgoing, incoming) = crossbeam_channel::unbounded(); + let path = path_ref.to_string(); + let thread = thread::spawn(move || { + let file = OpenOptions::new().append(true).create(true).open(&path).unwrap(); + let mut writer = BufWriter::new(file); + loop { + match incoming.recv().unwrap() { + PersisterMessage::Stop => { break; } + PersisterMessage::Write(items) => { + for item in items { + let result = bincode::serialize(&item).unwrap(); + if let Err(e) = writer.write_all(&result) { + panic!("Can't persist! {:?}", e); + } + } + writer.flush().unwrap(); + } + } + } + }); + Persister { outgoing, thread, loaded: vec![] } + } + + pub fn load(&mut self, path: &str) { + let file = match File::open(path) { + Ok(f) => f, + Err(_) => { + ////println!("Unable to load db: {}", path); + return; + } + }; + let mut reader = BufReader::new(file); + loop { + let result:Result = bincode::deserialize_from(&mut reader); + match result { + Ok(change) => { + self.loaded.push(change); + }, + Err(info) => { + ////println!("ran out {:?}", info); + break; + } + } + } + } + + pub fn send(&self, changes: Vec) { + self.outgoing.send(PersisterMessage::Write(changes)).unwrap(); + } + + pub fn wait(self) { + self.thread.join().unwrap(); + } + + pub fn get_channel(&self) -> Sender { + self.outgoing.clone() + } + + pub fn get_changes(&mut self) -> Vec { + mem::replace(&mut self.loaded, vec![]) + } + + pub fn close(&self) { + self.outgoing.send(PersisterMessage::Stop).unwrap(); + } +} \ No newline at end of file diff --git a/src/program/src/program.rs b/src/program/src/program.rs new file mode 100644 index 0000000..a52f44d --- /dev/null +++ b/src/program/src/program.rs @@ -0,0 +1,482 @@ +// # Program + +// # Prelude +extern crate bincode; +extern crate libloading; +extern crate colored; +use colored::*; + +use std::thread::{self, JoinHandle}; +use std::collections::hash_map::Entry; +use std::mem; +use std::fs::{OpenOptions, File, canonicalize, create_dir}; +use std::io::{Write, BufReader, BufWriter, Read}; +use std::sync::Arc; +use std::rc::Rc; +use std::cell::RefCell; +use std::path::{Path, PathBuf}; +use std::time::{Instant}; + +use mech_core::*; +use mech_syntax::compiler::Compiler; +use mech_utilities::*; +use crossbeam_channel::Sender; +use crossbeam_channel::Receiver; +use hashbrown::{HashSet, HashMap}; +use indexmap::IndexSet; + +use super::download_machine; +use super::persister::Persister; +use super::runloop::ClientMessage; + +use libloading::Library; +use std::io::copy; +use std::io; +use std::net::{SocketAddr, UdpSocket}; +use std::fmt; + +use time; + +lazy_static! { + static ref MECH_CODE: u64 = hash_str("mech/code"); + static ref MECH_REGISTRY: u64 = hash_str("mech/registry"); + static ref NAME: u64 = hash_str("name"); + static ref VERSION: u64 = hash_str("version"); + static ref URL: u64 = hash_str("url"); +} + +// ## Program + +pub struct Program { + pub id: u64, + pub name: String, + pub mech: Core, + pub cores: HashMap, + pub remote_cores: HashMap, + pub input_map: HashMap<(TableId,RegisterIndex,RegisterIndex),HashSet>, + pub libraries: HashMap>, + pub machines: HashMap>, + pub mech_functions: HashMap>, + pub machine_repository: HashMap, // (name, (version, url)) + capacity: usize, + pub incoming: Receiver, + pub outgoing: Sender, + pub errors: HashSet, + programs: usize, + loaded_machines: HashSet, + pub listeners: HashMap<(TableId,RegisterIndex,RegisterIndex),HashSet>, + pub trigger_to_listener: HashMap<(TableId,RegisterIndex,RegisterIndex),((TableId, RegisterIndex, RegisterIndex),HashSet)>, + pub registry: String, + pub capability_token: CapabilityToken, +} + +impl Program { + pub fn new(name:&str, capacity: usize, recursion_limit: u64, outgoing: Sender, incoming: Receiver, registry: String, default_caps: HashSet) -> Program { + + let program_id = generate_uuid(); + + let mut capability_token = CapabilityToken::new(name.into(),default_caps,program_id,None); + let keypair = generate_keypair(); + capability_token.sign(&keypair); + + + let mut mech = Core::new(); + Program { + id: program_id, + name: name.to_owned(), + capacity, + machine_repository: HashMap::new(), + mech, + remote_cores: HashMap::new(), + cores: HashMap::new(), + libraries: HashMap::new(), + machines: HashMap::new(), + mech_functions: HashMap::new(), + loaded_machines: HashSet::new(), + input_map: HashMap::new(), + incoming, + outgoing, + errors: HashSet::new(), + programs: 0, + listeners: HashMap::new(), + trigger_to_listener: HashMap::new(), + registry, + capability_token, + } + } + + pub fn trigger_machine(&mut self, register: &(TableId,RegisterIndex,RegisterIndex)) -> Result<(),MechError> { + let (table_id,_,_) = register; + match self.machines.get_mut(table_id.unwrap()) { + Some(mut machine) => { + let table_ref = self.mech.get_table_by_id(*table_id.unwrap())?; + let table_ref_brrw = table_ref.borrow(); + machine.on_change(&table_ref_brrw); + }, + _ => (), // Warn user that the machine is not loaded? Or is it okay to just try? + } + Ok(()) + } + + pub fn compile_program(&mut self, input: String) -> Result,Vec,Vec))>,MechError> { + let mut compiler = Compiler::new(); + let sections = compiler.compile_str(&input.clone())?; + let result = self.mech.load_sections(sections); + + //self.errors.append(&mut self.mech.runtime.errors.clone()); + /*let mech_code = *MECH_CODE; + self.programs += 1; + let txn = vec![Change::Set((mech_code, vec![(TableIndex::Index(self.programs),TableIndex::Index(1),Value::from_str(&input.clone()))]))]; + self.outgoing.send(RunLoopMessage::Transaction(txn));*/ + Ok(result) + } + + pub fn compile_fragment(&mut self, input: String) { + /* + let mut compiler = Compiler::new(); + let programs = compiler.compile_string(input.clone()); + for p in programs { + for mut block in p.blocks { + block.id = (self.mech.runtime.blocks.len() + 1) as u64; + self.mech.runtime.ready_blocks.insert(block.id); + self.mech.register_blocks(vec![block]); + } + } + //self.errors.append(&mut self.mech.runtime.errors.clone()); + let mech_code = *MECH_CODE; + self.programs += 1; + //let txn = Transaction::from_change(Change::Set{table: mech_code, row: TableIndex::Index(self.programs), column: TableIndex::Index(1), value: Value::from_str(&input.clone())}); + //self.outgoing.send(RunLoopMessage::Transaction(txn)); + */ + } + + pub fn download_dependencies(&mut self, outgoing: Option>) -> Result,MechError> { + // Create the machines directory. If it's already there this does nothing. + create_dir("machines"); + // If the machine repository is not populated, we need to fill it by loading the registry + if self.machine_repository.len() == 0 { + let mut registry_file = match std::fs::File::open("machines/registry.mec") { + Ok(mut file) => { + // Loading machine_repository index + match &outgoing { + Some(sender) => {sender.send(ClientMessage::String(format!("{} Machine registry.", "[Loading]".truecolor(153,221,85))));} + None => {return Err(MechError{msg: "".to_string(), id: 1244, kind: MechErrorKind::None});}, + } + let mut contents = String::new(); + match file.read_to_string(&mut contents) { + Err(_) => {return Err(MechError{msg: "".to_string(), id: 1445, kind: MechErrorKind::None});}, + _ => (), + } + contents + } + Err(_) => { + // Download machine_repository index + match &outgoing { + Some(sender) => {sender.send(ClientMessage::String(format!("{} Updating machine registry from:\n{}", "[Downloading]".truecolor(153,221,85),self.registry)));} + None => {return Err(MechError{msg: "".to_string(), id: 1246, kind: MechErrorKind::None});}, + } + // Download registry + let registry_url = &self.registry; + let mut response_text = match reqwest::get(registry_url) { + Ok(mut response) => { + match response.text() { + Ok(text) => { + text + }, + Err(_) => {return Err(MechError{msg: "".to_string(), id: 1235, kind: MechErrorKind::None});}, + } + } + Err(_) => {return Err(MechError{msg: "".to_string(), id: 1236, kind: MechErrorKind::None});}, + }; + // Save registry + let mut dest = match File::create("machines/registry.mec") { + Ok(dest) => dest, + Err(_) => {return Err(MechError{msg: "".to_string(), id: 1237, kind: MechErrorKind::None});}, + }; + match dest.write_all(response_text.as_bytes()) { + Ok(dest) => dest, + Err(_) => {return Err(MechError{msg: "".to_string(), id: 1238, kind: MechErrorKind::None});}, + } + response_text + } + }; + + // Compile machine registry + let mut registry_compiler = Compiler::new(); + let sections = registry_compiler.compile_str(®istry_file)?; + let mut registry_core = Core::new(); + registry_core.load_sections(sections); + + // Convert the machine listing into a hash map + let registry_table = registry_core.get_table("mech/registry")?; + let registry_table_brrw = registry_table.borrow(); + for row in 0..registry_table_brrw.rows { + let row_index = TableIndex::Index(row+1); + let name = registry_table_brrw.get_by_index(row_index.clone(), TableIndex::Alias(*NAME))?.as_string().unwrap().to_string(); + let version = registry_table_brrw.get_by_index(row_index.clone(), TableIndex::Alias(*VERSION))?.as_string().unwrap().to_string(); + let url = registry_table_brrw.get_by_index(row_index.clone(), TableIndex::Alias(*URL))?.as_string().unwrap().to_string(); + self.machine_repository.insert(name, (version, url)); + } + } + // Resolve missing function errors + let mut resolved_errors = vec![]; + { + let mut missing_functions: HashSet = HashSet::new(); + for (error,eblocks) in &self.mech.errors { + match error { + MechErrorKind::MissingFunction(fxn_id) => { + missing_functions.insert(*fxn_id); + } + _ => (), // Other error, do nothing + } + } + for fxn_id in &self.mech.required_functions { + missing_functions.insert(*fxn_id); + } + + for fxn_id in self.mech.functions.borrow().functions.keys() { + missing_functions.remove(fxn_id); + } + + // Iterate over the missing_functions + for fxn_id in missing_functions { + // Look up the function name using the Mech runtime's dictionary and the function ID + let fun_name = self.mech.dictionary.borrow().get(&fxn_id).unwrap().to_string(); + let m: Vec<_> = fun_name.split('/').collect(); + let m = m[0]; + // Replace hyphens with underscores in the function name + let underscore_name = m.replace("-","_"); + // Define the library file name based on the target operating system + #[cfg(target_os = "macos")] + let machine_name = format!("libmech_{}.dylib", underscore_name); + #[cfg(target_os = "linux")] + let machine_name = format!("libmech_{}.so", underscore_name); + #[cfg(target_os = "windows")] + let machine_name = format!("mech_{}.dll", underscore_name); + // Check if the machine exists in the machine_repository + match self.machine_repository.get(&m.to_string()) { + Some((ver, path)) => { + // Attempt to load the machine from an existing library file + let library = self.libraries.entry(m.to_string()).or_insert_with(||{ + match File::open(format!("machines/{}",machine_name)) { + Ok(_) => { + // Notify that the machine is loading + match &outgoing { + Some(sender) => {sender.send(ClientMessage::String(format!("{} {} v{}", "[Loading]".truecolor(153,221,85), m, ver)));} + None => (), + } + let message = format!("Can't load library {:?}", machine_name); + unsafe{Some(Library::new(format!("machines/{}",machine_name)).expect(&message))} + } + _ => Some(download_machine(&machine_name, m, path, ver, outgoing.clone()).unwrap()) + } + }); + // Replace slashes with underscores in the function name and add a null terminator to the string + let mut s = format!("{}\0", fun_name.replace("-","__").replace("/","_")); + let error_msg = format!("Symbol {} not found",s); + // Create a new MechFunctions struct to act as a registrar for the custom function + let mut registrar = MechFunctions::new(); + // Use the library object to load the custom function + unsafe { + match library { + Some(lib) => { + // Register the custom function with the registrar + match lib.get::<*mut MechFunctionDeclaration>(s.as_bytes()) { + Ok(good) => { + let declaration = good.read(); + (declaration.register)(&mut registrar); + } + Err(_) => { + println!("Couldn't find the specified machine: {}", fun_name); + } + } + } + None => (), + } + } + // Extend the runtime's functions collection with the new function and add a MechErrorKind::MissingFunction error to the resolved_errors list + self.mech.functions.borrow_mut().extend(registrar.mech_functions); + resolved_errors.push(MechErrorKind::MissingFunction(fxn_id)); + } + _ => (), + } + } + } + + // Dedupe needed ids + let needed_registers = self.mech.needed_registers(); + let mut needed_tables = IndexSet::new(); + for (needed_table_id,_,_) in needed_registers { + needed_tables.insert(needed_table_id.clone()); + } + for (error,_) in &self.mech.errors { + match error { + MechErrorKind::MissingTable(table_id) => { + needed_tables.insert(table_id.clone()); + } + _ => (), + } + } + + let mut machine_init_code = vec![]; + + // Iterate over the needed_tables, which represent the required custom functions. + for needed_table_id in needed_tables.iter() { + // Borrow the dictionary from the Mech runtime to look up the table name using the table ID. + let dictionary = self.mech.dictionary.borrow(); + let needed_table_name = dictionary.get(needed_table_id.unwrap()).unwrap().to_string(); + // Split the table name into a vector of strings and compute the needed machine ID. + let m: Vec<_> = needed_table_name.split('/').collect(); + let needed_machine_id = hash_str(&m[0]); + // Check if the machine is already loaded by looking it up in the loaded_machines set. + match self.loaded_machines.contains(&needed_machine_id) { + false => { + // If the machine is not loaded, insert the machine ID into loaded_machines. + self.loaded_machines.insert(needed_machine_id); + // Define the library file name based on the target operating system. + #[cfg(target_os = "macos")] + let machine_name = format!("libmech_{}.dylib", m[0]); + #[cfg(target_os = "linux")] + let machine_name = format!("libmech_{}.so", m[0]); + #[cfg(target_os = "windows")] + let machine_name = format!("mech_{}.dll", m[0]); + // Check if the machine exists in the machine_repository. If it does, proceed with loading the machine. + match self.machine_repository.get(m[0]) { + Some((ver, path)) => { + // Attempt to load the machine from an existing library file. If the file doesn't exist, download the machine using the download_machine function. + let library = self.libraries.entry(m[0].to_string()).or_insert_with(||{ + match File::open(format!("machines/{}",machine_name)) { + Ok(_) => { + // If the library file exists, send a loading message to the outgoing client if it exists. + match &outgoing { + Some(sender) => {sender.send(ClientMessage::String(format!("{} {} v{}", "[Loading]".truecolor(153,221,85), m[0], ver)));} + None => (), + } + let message = format!("Can't load library {:?}", machine_name); + unsafe{Some(Library::new(format!("machines/{}",machine_name)).expect(&message))} + } + _ => { + // If the library file doesn't exist, download the machine and return it as an Option. + match download_machine(&machine_name, m[0], path, ver, outgoing.clone()) { + Ok(library) => Some(library), + Err(err) => None, + } + } + } + }); + // Replace slashes with underscores in the table name and add a null terminator to the string. + let mut s = format!("{}\0", needed_table_name.replace("-","__").replace("/","_")); + let error_msg = format!("Symbol {} not found",s); + // Create a new Machines struct to act as a registrar for the custom function. + let mut registrar = Machines::new(); + // Use the library object to load the custom function, register it with the registrar, and store the initialization code in machine_init_code. + unsafe{ + match library { + Some(lib) => { + // Load the custom function using the library object. + match lib.get::<*mut MachineDeclaration>(s.as_bytes()) { + Ok(good) => { + let declaration = good.read(); + // Register the custom function with the registrar. + match (declaration.register)(&mut registrar, self.outgoing.clone(), &self.capability_token) { + Ok(init_code) => machine_init_code.push(init_code), + Err(mech_error) => {return Err(mech_error)}, + } + } + Err(_) => { + // If the custom function cannot be loaded, print an error message. + println!("Couldn't find the specified machine: {}", needed_table_name); + } + } + } + None => (), + } + } + // If the custom function is successfully loaded, extend the runtime's machines collection with the new machine. + self.machines.extend(registrar.machines); + }, + _ => (), + } + } + _ => (), + } + } + + // Load init code and trigger machines + let mut already_triggered = HashSet::new(); + for mic in &machine_init_code { + let result = self.compile_program(mic.to_string())?; + self.mech.schedule_blocks(); + for (new_block_ids,_,block_error) in result { + for block_id in new_block_ids { + let block = self.mech.blocks.get(&block_id); + let output = self.mech.get_output_by_block_id(block_id)?; + for register in output.iter() { + if !already_triggered.contains(register) { + self.trigger_machine(register); + } + already_triggered.insert(register.clone()); + } + } + } + } + + //self.mech.step(); + //self.trigger_machines(); + + /* + // Do it for the the other core + for core in self.cores.values_mut() { + for (fun_name, fun) in core.runtime.functions.iter_mut() { + let m: Vec<_> = fun_name.split('/').collect(); + #[cfg(unix)] + let machine_name = format!("libmech_{}.so", m[0]); + #[cfg(windows)] + let machine_name = format!("mech_{}.dll", m[0]); + match (&fun, self.machine_repository.get(m[0])) { + (None, Some((ver, path))) => { + let library = self.libraries.entry(m[0].to_string()).or_insert_with(||{ + match File::open(format!("machines/{}",machine_name)) { + Ok(_) => { + Library::new(format!("machines/{}",machine_name)).expect("Can't load library") + } + _ => download_machine(&machine_name, m[0], path, ver, outgoing.clone()).unwrap() + } + }); + let native_rust = unsafe { + // Replace slashes with underscores and then add a null terminator + let mut s = format!("{}\0", fun_name.replace("/","_")); + let error_msg = format!("Symbol {} not found",s); + let m = library.get::>)>, Rc>)>(s.as_bytes()).expect(&error_msg); + m.into_raw() + }; + *fun = Some(*native_rust); + }, + _ => (), + } + } + }*/ + + Ok(resolved_errors) + } + + /*pub fn clear(&mut self) { + self.mech.clear(); + }*/ + +} + +impl fmt::Debug for Program { + #[inline] + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + let mut box_drawing = BoxPrinter::new(); + box_drawing.add_title("🤖","Program"); + box_drawing.add_title(" ","cores"); + box_drawing.add_line(format!(" 1. (b {:?}, t {:?})", self.mech.blocks.len() , self.mech.database.borrow().tables.len())); + for (ix, core) in self.cores.iter() { + box_drawing.add_line(format!(" {:?}. (b {:?}, t {:?})", ix, core.blocks.len() , core.database.borrow().tables.len() )); + } + write!(f,"{:?}",box_drawing)?; + Ok(()) + } +} \ No newline at end of file diff --git a/src/program/src/runloop.rs b/src/program/src/runloop.rs new file mode 100644 index 0000000..e8cb344 --- /dev/null +++ b/src/program/src/runloop.rs @@ -0,0 +1,803 @@ +use mech_core::*; +use mech_syntax::compiler::Compiler; +use mech_utilities::*; + +use std::thread::{self, JoinHandle}; +use std::sync::Arc; +use std::cell::RefCell; +use hashbrown::{HashSet, HashMap}; +use hashbrown::hash_map::Entry; +use crossbeam_channel::Sender; +use crossbeam_channel::Receiver; +use colored::*; + +use super::program::Program; +use super::persister::Persister; + +use std::net::{SocketAddr, UdpSocket}; +extern crate websocket; +use websocket::OwnedMessage; + +use std::io; +use std::time::Instant; +use std::sync::Mutex; + +extern crate miniz_oxide; +extern crate bincode; +use std::io::{Write, BufReader, BufWriter, stdout}; +use std::fs::{OpenOptions, File, canonicalize, create_dir}; + +use miniz_oxide::inflate::decompress_to_vec; +use miniz_oxide::deflate::compress_to_vec; + +// ## Run Loop + +// Client messages are sent to the client from the run loop + +/*pub enum MechChannel { + Crossbeam(crossbeam_channel::Sender), + UdpSocket(UdpSocket), +} + +impl MechChannel { + + pub fn send(&mut self, message: ClientMessage) { + match &self { + MechChannel::Crossbeam(sender) => { + sender.send(message); + } + MechChannel::UdpSocket(socket) => { + let msg: Vec = bincode::serialize(&message).unwrap(); + socket.send(&msg); + } + } + } +}*/ + +#[derive(Debug, Clone)] +pub enum ClientMessage { + Stop, + Pause, + Resume, + Reset, + Exit(i32), + Time(usize), + NewBlocks(usize), + Value(Value), + Transaction(Transaction), + String(String), + Error(MechError), + Timing(f64), + //Block(Block), + StepDone, + Done, + Ready, +} + +pub struct RunLoop { + pub name: String, + pub socket_address: Option, + thread: JoinHandle<()>, + pub outgoing: Sender, + pub incoming: Receiver, +} + +impl RunLoop { + + pub fn wait(self) { + self.thread.join().unwrap(); + } + + pub fn close(&self) { + match self.outgoing.send(RunLoopMessage::Stop) { + Ok(..) => (), + Err(..) => (), + } + } + + pub fn send(&self, msg: RunLoopMessage) -> Result<(),&str> { + match self.outgoing.send(msg) { + Ok(_) => Ok(()), + Err(_) => Err("Failed to send message"), + } + } + + pub fn receive(&self) -> Result { + match self.incoming.recv() { + Ok(message) => Ok(message), + Err(_) => Err("Failed to send message"), + } + } + + pub fn is_empty(&self) -> bool { + self.incoming.is_empty() + } + + pub fn channel(&self) -> Sender { + self.outgoing.clone() + } + +} + +// ## Program Runner + +pub struct ProgramRunner { + pub name: String, + pub socket: Option>, + pub registry: String, + pub capabilities: HashSet, + //pub persistence_channel: Option>, +} + +impl ProgramRunner { + + pub fn new(name:&str, capabilities: HashSet) -> ProgramRunner { + // Start a persister + /* + let persist_name = format!("{}.mdb", name); + let mut persister = Persister::new(&persist_name); + persister.load(&persist_name); + let changes = persister.get_changes(); + + // Load database + ////println!("{} Applying {} stored changes...", BrightCyan.paint(format!("[{}]", name)), changes.len()); + for change in changes { + program.mech.process_transaction(&Transaction::from_change(change)); + }*/ + + let socket = match UdpSocket::bind("127.0.0.1:0") { + Ok(socket) => Some(Arc::new(socket)), + _ => None, + }; + + ProgramRunner { + name: name.to_owned(), + socket, + registry: "https://gitlab.com/mech-lang/machines/mech/-/raw/v0.1-beta/src/registry.mec".to_string(), + capabilities, + //program, + // TODO Use the persistence file specified by the user + //persistence_channel: Some(persister.get_channel()), + //persistence_channel: None, + } + } + + /*pub fn load_program(&mut self, input: String) -> Result<(),Box> { + self.program.compile_program(input); + Ok(()) + } + + pub fn load_core(&mut self, mut core: Core) { + core.id = (self.program.cores.len() + 1) as u64; + for input_register in &core.input { + let input = self.program.input_map.entry(input_register.clone()).or_insert(HashSet::new()); + input.insert(core.id); + } + + let table = core.get_table("#data".to_string()).unwrap(); + self.program.mech.remote_tables.push(table.clone()); + + self.program.cores.insert(core.id, core); + }*/ + + pub fn add_persist_channel(&mut self, persister:&mut Persister) { + //self.persistence_channel = Some(persister.get_channel()); + } + + pub fn run(self) -> Result { + //let name = self.name; + //let outgoing = self.program.outgoing.clone(); + let (outgoing, program_incoming) = crossbeam_channel::unbounded(); + let runloop_outgoing = outgoing.clone(); + let (client_outgoing, incoming) = crossbeam_channel::unbounded(); + //let mut program = self.program; + //let persistence_channel = self.persistence_channel; + + let name = format!("{}", &self.name.clone()); + let socket_address = match self.socket { + Some(ref socket) => Some(socket.local_addr().unwrap().to_string()), + None => None, + }; + + // Start a channel receiving thread + let thread = thread::Builder::new().name(name.clone()).spawn(move || { + + let mut program = Program::new("new program", 100, 1000, outgoing.clone(), program_incoming, self.registry, self.capabilities); + + let program_channel_udpsocket = program.outgoing.clone(); + let program_channel_udpsocket = program.outgoing.clone(); + + match &self.socket { + Some(ref socket) => { + let socket_receiver = socket.clone(); + // Start a socket receiving thread + let thread = thread::Builder::new().name("remote core listener".to_string()).spawn(move || { + let mut compressed_message = [0; 16_383]; + loop { + match socket_receiver.recv_from(&mut compressed_message) { + Ok((amt, src)) => { + let serialized_message = decompress_to_vec(&compressed_message).expect("Failed to decompress!"); + let message: Result = bincode::deserialize(&serialized_message); + match message { + Ok(SocketMessage::RemoteCoreConnect(remote_core_address)) => { + program_channel_udpsocket.send(RunLoopMessage::RemoteCoreConnect(MechSocket::UdpSocket(remote_core_address))); + } + Ok(SocketMessage::RemoteCoreDisconnect(remote_core_address)) => { + program_channel_udpsocket.send(RunLoopMessage::RemoteCoreDisconnect(remote_core_address)); + } + Ok(SocketMessage::Listening(register)) => { + program_channel_udpsocket.send(RunLoopMessage::Listening((hash_str(&src.to_string()), register))); + } + Ok(SocketMessage::Ping) => { + println!("Got a ping from: {:?}", src); + let message = bincode::serialize(&SocketMessage::Pong).unwrap(); + let compressed_message = compress_to_vec(&message,6); + socket_receiver.send_to(&compressed_message, src); + } + Ok(SocketMessage::Pong) => { + println!("Got a pong from: {:?}", src); + } + Ok(SocketMessage::Transaction(txn)) => { + program_channel_udpsocket.send(RunLoopMessage::String((format!("Received Txn: {:?}", txn),None))); + program_channel_udpsocket.send(RunLoopMessage::Transaction(txn)); + } + Ok(x) => println!("Unhandled Message {:?}", x), + Err(error) => println!("{:?}", error), + } + } + Err(error) => { + + } + } + } + }).unwrap(); + } + None => (), + } + + match program.download_dependencies(Some(client_outgoing.clone())) { + Ok(resolved_errors) => { + let (_,_,nbo) = program.mech.resolve_errors(&resolved_errors); + program.mech.schedule_blocks(); + for output in nbo { + program.mech.step(&output); + } + } + Err(err) => { + client_outgoing.send(ClientMessage::Error(err.clone())); + } + } + + // Step cores + /*program.mech.step(); + for core in program.cores.values_mut() { + core.step(); + }*/ + + // Send the ready to the client to indicate that the program is initialized + client_outgoing.send(ClientMessage::Ready); + let mut paused = false; + let mut iteration: u64 = 0; + 'runloop: loop { + match (program.incoming.recv(), paused) { + (Ok(RunLoopMessage::Transaction(txn)), false) => { + // Process the transaction and calculate how long it took. + let now = Instant::now(); + match program.mech.process_transaction(&txn) { + Ok((new_block_ids,changed_registers)) => { + for trigger_register in &changed_registers { + // Handle machines first + let mut machine_triggers = vec![]; + match &program.mech.schedule.trigger_to_output.get(trigger_register) { + Some(ref output) => { + for register in output.iter() { + machine_triggers.push(register.clone()); + } + } + None => () + } + for register in machine_triggers { + program.trigger_machine(®ister); + } + + // We have a triggered register, and we need to get all of the + // blocks that it potentially updated. We already have that list. If this register + // has been triggered for the first time, then we need to get the list of + // output blocks + match program.trigger_to_listener.entry(trigger_register.clone()) { + // Already triggered in the past + Entry::Occupied(mut o) => { + // Here is the output that the triggered register will cause to update + match program.mech.schedule.trigger_to_output.get(trigger_register) { + Some(output) => { + // Is any of this being listened for? + for (register,remote_cores) in &program.listeners { + if output.contains(register) { + o.insert((register.clone(),remote_cores.clone())); + break; + } + } + } + None => () + } + // We have listeners, so let's send them the changes + let ((output_table_id,row_ix,col_ix),listeners) = o.get(); + let trigger = o.key(); + match program.mech.get_table_by_id(*output_table_id.unwrap()) { + Ok(table) =>{ + let table_brrw = table.borrow(); + let changes = table_brrw.data_to_changes(); + let message = bincode::serialize(&SocketMessage::Transaction(changes)).unwrap(); + let compressed_message = compress_to_vec(&message,6); + // Send the transaction to the remote core + for remote_core_id in listeners { + match (&self.socket,program.remote_cores.get_mut(remote_core_id)) { + (Some(ref socket),Some(MechSocket::UdpSocket(remote_core_address))) => { + let len = socket.send_to(&compressed_message, remote_core_address.clone()).unwrap(); + } + (Some(ref socket),Some(MechSocket::WebSocketSender(websocket))) => { + match websocket.send_message(&OwnedMessage::Binary(compressed_message.clone())) { + Ok(()) => (), + Err(x) => { + client_outgoing.send(ClientMessage::String(format!("Remote core disconnected: {}", humanize(&remote_core_id)))); + program.remote_cores.remove(remote_core_id); + for (core_id, core_address) in &program.remote_cores { + match core_address { + MechSocket::UdpSocket(core_address) => { + let message = bincode::serialize(&SocketMessage::RemoteCoreDisconnect(*remote_core_id)).unwrap(); + let compressed_message = compress_to_vec(&message,6); + let len = socket.send_to(&compressed_message, core_address.clone()).unwrap(); + } + MechSocket::WebSocket(_) => { + // TODO send disconnect message to websockets + } + _ => (), + } + } + }, + }; + } + _ => (), + } + } + } + Err(err) => { + client_outgoing.send(ClientMessage::Error(err)); + } + } + } + // Triggered for the first time + Entry::Vacant(mut v) => { + // Here is the output that the triggered register will cause to update + match program.mech.schedule.trigger_to_output.get(trigger_register) { + Some(output) => { + // Is any of this being listened for? + for (register,remote_cores) in &program.listeners { + if output.contains(register) { + v.insert((register.clone(),remote_cores.clone())); + break; + } + } + } + None => () + } + } + } + } + } + Err(err) => { + client_outgoing.send(ClientMessage::Error(err)); + } + }; + let elapsed_time = now.elapsed(); + let cycle_duration = elapsed_time.as_nanos() as f64; + client_outgoing.send(ClientMessage::Timing(1.0 / (cycle_duration / 1_000_000_000.0))); + client_outgoing.send(ClientMessage::StepDone); + }, + (Ok(RunLoopMessage::Listening((core_id, register))), _) => { + let (table_id,row,col) = ®ister; + let name = program.mech.get_name(*table_id.unwrap()).unwrap(); + match program.mech.output.contains(®ister.clone()) { + // We produce a table for which they're listening + true => { + client_outgoing.send(ClientMessage::String(format!("Sending #{} to {}", name, humanize(&core_id)))); + // Mark down that this register has a listener for future updates + let mut listeners = program.listeners.entry(register.clone()).or_insert(HashSet::new()); + listeners.insert(core_id); + // Send over the table we have now + match program.mech.get_table_by_id(*table_id.unwrap()) { + Ok(table) => { + // Decompose the table into changes for a transaction + let table_brrw = table.borrow(); + let changes = table_brrw.to_changes(); + let message = bincode::serialize(&SocketMessage::Transaction(changes)).unwrap(); + let compressed_message = compress_to_vec(&message,6); + // Send the transaction to the remote core + match (&self.socket,program.remote_cores.get_mut(&core_id)) { + (Some(ref socket),Some(MechSocket::UdpSocket(remote_core_address))) => { + let len = socket.send_to(&compressed_message, remote_core_address.clone()).unwrap(); + } + (_,Some(MechSocket::WebSocketSender(websocket))) => { + websocket.send_message(&OwnedMessage::Binary(compressed_message)).unwrap(); + } + _ => (), + } + } + Err(_) => (), + } + }, + false => (), + } + }, + (Ok(RunLoopMessage::RemoteCoreDisconnect(remote_core_id)), _) => { + match &self.socket { + Some(ref socket) => { + let socket_address = hash_str(&socket.local_addr().unwrap().to_string()); + if remote_core_id != socket_address { + match program.remote_cores.get(&remote_core_id) { + None => { + + } + Some(_) => { + client_outgoing.send(ClientMessage::String(format!("Remote core disconnected: {}", humanize(&remote_core_id)))); + program.remote_cores.remove(&remote_core_id); + for (core_id, core_address) in &program.remote_cores { + match core_address { + MechSocket::UdpSocket(core_address) => { + let message = bincode::serialize(&SocketMessage::RemoteCoreDisconnect(remote_core_id)).unwrap(); + let compressed_message = compress_to_vec(&message,6); + let len = socket.send_to(&compressed_message, core_address.clone()).unwrap(); + } + MechSocket::WebSocket(_) => { + // TODO send disconnect message to websockets + } + _ => (), + } + } + } + } + } + } + None => (), + } + } + (Ok(RunLoopMessage::RemoteCoreConnect(MechSocket::UdpSocket(remote_core_address))), _) => { + match &self.socket { + Some(ref socket) => { + let socket_address = socket.local_addr().unwrap().to_string(); + if remote_core_address != socket_address { + match program.remote_cores.get(&hash_str(&remote_core_address)) { + None => { + // We've got a new remote core. Let's ask it what it needs from us + // and tell it about all the other cores in our network. + program.remote_cores.insert(hash_str(&remote_core_address),MechSocket::UdpSocket(remote_core_address.clone())); + client_outgoing.send(ClientMessage::String(format!("Remote core connected: {}", humanize(&hash_str(&remote_core_address))))); + let message = bincode::serialize(&SocketMessage::RemoteCoreConnect(socket_address.clone())).unwrap(); + let compressed_message = compress_to_vec(&message,6); + let len = socket.send_to(&compressed_message, remote_core_address.clone()).unwrap(); + for (core_id, core_address) in &program.remote_cores { + match core_address { + MechSocket::UdpSocket(core_address) => { + let message = bincode::serialize(&SocketMessage::RemoteCoreConnect(core_address.to_string())).unwrap(); + let compressed_message = compress_to_vec(&message,6); + let len = socket.send_to(&compressed_message, remote_core_address.clone()).unwrap(); + } + MechSocket::WebSocket(_) => { + // TODO + } + _ => (), + } + } + } + Some(_) => { + for register in &program.mech.needed_registers() { + //println!("I'm listening for {:?}", register); + let message = bincode::serialize(&SocketMessage::Listening(register.clone())).unwrap(); + let compressed_message = compress_to_vec(&message,6); + let len = socket.send_to(&compressed_message, remote_core_address.clone()).unwrap(); + } + } + } + } + } + None => (), + } + } + (Ok(RunLoopMessage::RemoteCoreConnect(MechSocket::WebSocket(ws_stream))), _) => { + let remote_core_address = ws_stream.peer_addr().unwrap(); + let remote_core_id = hash_str(&remote_core_address.to_string()); + let (mut ws_incoming, mut ws_outgoing) = ws_stream.split().unwrap(); + // Tell the remote websocket what this core is listening for + for needed_register in &program.mech.needed_registers() { + let message = bincode::serialize(&SocketMessage::Listening(needed_register.clone())).unwrap(); + let compressed_message = compress_to_vec(&message,6); + ws_outgoing.send_message(&OwnedMessage::Binary(compressed_message)).unwrap(); + } + // Store the websocket sender + program.remote_cores.insert(remote_core_id, MechSocket::WebSocketSender(ws_outgoing)); + let program_channel_websocket = program.outgoing.clone(); + client_outgoing.send(ClientMessage::String(format!("Remote core connected: {}", humanize(&hash_str(&remote_core_address.to_string()))))); + thread::spawn(move || { + for message in ws_incoming.incoming_messages() { + let message = message.unwrap(); + match message { + OwnedMessage::Close(_) => { + return; + } + OwnedMessage::Binary(msg) => { + let message: Result = bincode::deserialize(&msg); + match message { + Ok(SocketMessage::Listening(register)) => { + program_channel_websocket.send(RunLoopMessage::Listening((remote_core_id, register))); + } + Ok(SocketMessage::Transaction(txn)) => { + program_channel_websocket.send(RunLoopMessage::Transaction(txn)); + }, + x => {println!("Unhandled Message: {:?}", x);}, + } + } + _ => (), + } + } + }); + } + (Ok(RunLoopMessage::String((string,color))), _) => { + let out_string = match color { + Some(color) => { + let r: u8 = (color >> 16) as u8; + let g: u8 = (color >> 8) as u8; + let b: u8 = color as u8; + format!("{}", string.truecolor(r,g,b)) + }, + None => string, + }; + client_outgoing.send(ClientMessage::String(out_string)); + } + (Ok(RunLoopMessage::Exit(exit_code)), _) => { + client_outgoing.send(ClientMessage::Exit(exit_code)); + } + (Ok(RunLoopMessage::DumpCore(core_ix)), _) => { + let result = match core_ix { + 0 => { + let core = &program.mech; + let mut minicores = vec![]; + for (_,core) in &program.cores { + let minicore = MiniCore::minify_core(&core); + minicores.push(minicore); + } + bincode::serialize(&minicores).unwrap() + } + 1 => { + let core = &program.mech; + let minicore = MiniCore::minify_core(&core); + let minicores = MechCode::MiniCores(vec![minicore]); + bincode::serialize(&minicores).unwrap() + } + _ => { + let core = program.cores.get_mut(&core_ix).unwrap(); + let minicore = MiniCore::minify_core(&core); + let minicores = MechCode::MiniCores(vec![minicore]); + bincode::serialize(&minicores).unwrap() + } + }; + let output_name = format!("core-{}.blx",core_ix); + let file = OpenOptions::new().write(true).create(true).open(&output_name).unwrap(); + let mut writer = BufWriter::new(file); + if let Err(e) = writer.write_all(&result) { + panic!("{} Failed to write core(s)! {:?}", "[Error]".truecolor(170,51,85), e); + std::process::exit(1); + } + writer.flush().unwrap(); + client_outgoing.send(ClientMessage::String(format!("Wrote {:?}", output_name))); + client_outgoing.send(ClientMessage::Done); + } + (Ok(RunLoopMessage::NewCore), _) => { + let new_core = Core::new(); + let new_core_ix = program.cores.len() as u64 + 2; + program.cores.insert(new_core_ix, new_core); + client_outgoing.send(ClientMessage::Done); + } + (Ok(RunLoopMessage::Code((core_ix,code))), _) => { + // Load the program + let sections: Vec> = match code { + MechCode::MiniCores(cores) => { + for mc in cores { + let core = MiniCore::maximize_core(&mc); + let ix = program.cores.len() + 2; + program.cores.insert(ix as u64,core); + } + continue 'runloop; + } + MechCode::String(code) => { + let mut compiler = Compiler::new(); + match compiler.compile_str(&code) { + Ok(sections) => sections, + Err(err) => { + client_outgoing.send(ClientMessage::Error(err)); + client_outgoing.send(ClientMessage::StepDone); + continue 'runloop; + } + } + }, + MechCode::MiniBlocks(mb_sections) => { + let mut sections: Vec> = vec![]; + for section in mb_sections { + let section: Vec = section.iter().map(|mb| SectionElement::Block(MiniBlock::maximize_block(mb))).collect(); + sections.push(section); + } + sections + } + }; + { + + let result = { + let mut core: &mut Core = match core_ix { + 1 => &mut program.mech, + _ => program.cores.get_mut(&core_ix).unwrap(), + }; + core.load_sections(sections) + }; + //println!("{:?}", program.mech); + for (new_block_ids,_,new_block_errors) in result { + if new_block_errors.len() > 0 { + match program.download_dependencies(Some(client_outgoing.clone())) { + Ok(resolved_errors) => { + let mut core: &mut Core = match core_ix { + 1 => &mut program.mech, + _ => program.cores.get_mut(&core_ix).unwrap(), + }; + let (_,_,nbo) = core.resolve_errors(&resolved_errors); + core.schedule_blocks(); + for output in nbo { + core.step(&output); + } + } + Err(err) => { + client_outgoing.send(ClientMessage::Error(err.clone())); + } + } + } + + if let Some(last_block_id) = new_block_ids.last() { + let mut core: &mut Core = match core_ix { + 1 => &mut program.mech, + _ => program.cores.get_mut(&core_ix).unwrap(), + }; + let block = core.blocks.get(last_block_id).unwrap().borrow(); + let out_id = match block.transformations.last() { + Some(Transformation::Function{name,arguments,out}) => { + let (out_id,_,_) = out; + *out_id + } + Some(Transformation::TableDefine{table_id,indices,out}) => { + *out + } + Some(Transformation::Set{src_id, src_row, src_col, dest_id, dest_row, dest_col}) => { + *dest_id + } + Some(Transformation::TableAlias{table_id, alias}) => { + *table_id + } + Some(Transformation::Whenever{table_id, ..}) => { + *table_id + } + _ => { + TableId::Local(0) + } + }; + if let Ok(out_table) = block.get_table(&out_id) { + client_outgoing.send(ClientMessage::String(format!("{:?}", out_table.borrow()))); + } + } + } + + // React to errors + let mut core: &mut Core = match core_ix { + 1 => &mut program.mech, + _ => program.cores.get_mut(&core_ix).unwrap(), + }; + for (error,_) in core.full_errors.iter() { + client_outgoing.send(ClientMessage::Error(error.clone())); + } + } + client_outgoing.send(ClientMessage::StepDone); + } + (Ok(RunLoopMessage::Reset(core_ix)), _) => { + let new_core = Core::new(); + match core_ix { + 1 => {program.mech = new_core;} + _ => {program.cores.insert(core_ix,new_core);}, + }; + client_outgoing.send(ClientMessage::Reset); + }, + (Ok(RunLoopMessage::PrintCore(core_id)), _) => { + match core_id { + None => {client_outgoing.send(ClientMessage::String(format!("There are {:?} cores running.", program.cores.len() + 1)));} + Some(0) => {client_outgoing.send(ClientMessage::String("Core indices start a 1.".to_string()));} + Some(1) => {client_outgoing.send(ClientMessage::String(format!("{:?}", program.mech)));} + Some(core_id) => { + if core_id < program.cores.len() as u64 + 1 { + client_outgoing.send(ClientMessage::String(format!("{:?}", program.cores.get(&core_id).unwrap()))); + } + } + } + }, + (Ok(RunLoopMessage::PrintInfo), _) => { + client_outgoing.send(ClientMessage::String(format!("{:?}", program))); + }, + (Ok(RunLoopMessage::PrintTable(table_id)), _) => { + let result = match program.mech.get_table_by_id(table_id) { + Ok(table_ref) => format!("{:?}", table_ref.borrow()), + Err(x) => format!("{:?}", x), + }; + client_outgoing.send(ClientMessage::String(result)); + }, + (Ok(RunLoopMessage::Blocks(miniblocks)), _) => { + /*let mut blocks: Vec = Vec::new(); + for miniblock in miniblocks { + let mut block = Block::new(100); + for tfms in miniblock.transformations { + block.register_transformations(tfms); + } + blocks.push(block); + } + program.mech.register_blocks(blocks); + program.mech.step();*/ + client_outgoing.send(ClientMessage::StepDone); + } + (Ok(RunLoopMessage::Stop), _) => { + client_outgoing.send(ClientMessage::Stop); + break 'runloop; + }, + (Ok(RunLoopMessage::GetValue((table_id,row,column))),_) => { + let msg = match program.mech.get_table_by_id(table_id) { + Ok(table) => { + match table.borrow().get(&row,&column) { + Ok(v) => ClientMessage::Value(v.clone()), + Err(error) => ClientMessage::Error(error.clone()), + } + } + Err(error) => ClientMessage::Error(error.clone()), + }; + client_outgoing.send(msg); + }, + (Ok(RunLoopMessage::Pause), false) => { + paused = true; + client_outgoing.send(ClientMessage::Pause); + }, + (Ok(RunLoopMessage::Resume), true) => { + paused = false; + //program.mech.resume(); + client_outgoing.send(ClientMessage::Resume); + }, + (Ok(RunLoopMessage::StepBack), _) => { + if !paused { + paused = true; + } + //program.mech.step_back_one(); + //client_outgoing.send(ClientMessage::Time(program.mech.offset)); + } + (Ok(RunLoopMessage::StepForward), true) => { + //program.mech.step_forward_one(); + //client_outgoing.send(ClientMessage::Time(program.mech.offset)); + } + (Err(_), _) => { + break 'runloop + }, + x => println!("qq {:?}", x), + } + client_outgoing.send(ClientMessage::Done); + } + /*if let Some(channel) = persistence_channel { + channel.send(PersisterMessage::Stop); + }*/ + }).unwrap(); + + Ok(RunLoop { name, socket_address, thread, outgoing: runloop_outgoing, incoming }) + } + + /*pub fn colored_name(&self) -> term_painter::Painted { + BrightCyan.paint(format!("[{}]", &self.name)) + }*/ + +} diff --git a/src/program/tests/program.rs b/src/program/tests/program.rs new file mode 100644 index 0000000..05c4c03 --- /dev/null +++ b/src/program/tests/program.rs @@ -0,0 +1,32 @@ +extern crate mech_program; +extern crate mech_utilities; +extern crate mech_core; +use mech_program::*; +use mech_utilities::*; +use mech_core::*; + +#[test] +fn program_test() { + let mut runner = ProgramRunner::new("test"); + let running = runner.run().unwrap(); + running.send(RunLoopMessage::Code(MechCode::String("#data = [1 2 3 4 5]".to_string()))); + running.send(RunLoopMessage::Stop); + +} + +#[test] +fn load_module_with_program() { + let mut runner = ProgramRunner::new("test"); + let running = runner.run().unwrap(); + running.send(RunLoopMessage::Code(MechCode::String("#test = math/sin(angle: 0)".to_string()))); + running.send(RunLoopMessage::GetValue((hash_str("test"),TableIndex::Index(1),TableIndex::Index(1)))); + loop { + match running.receive() { + Ok(ClientMessage::Value(value)) => { + assert_eq!(value, Value::F32(F32::new(0.0))); + break; + }, + message => (), + } + } +} \ No newline at end of file diff --git a/src/syntax/Cargo.toml b/src/syntax/Cargo.toml new file mode 100644 index 0000000..fcc5174 --- /dev/null +++ b/src/syntax/Cargo.toml @@ -0,0 +1,38 @@ +[package] +name = "mech-syntax" +version = "0.1.0" +authors = ["Corey Montella "] +description = "A toolchain for compiling textual syntax into Mech blocks." +documentation = "http://docs.mech-lang.org" +homepage = "https://mech-lang.org" +repository = "https://github.com/mech-lang/syntax" +keywords = ["mech", "language", "programming", "parser", "compiler"] +categories = ["no-std", "science::robotics", "science", "parser-implementations"] +license = "Apache-2.0" +readme = "README.md" +edition = "2021" + +[badges] +gitlab = { repository = "mech-lang/syntax", branch = "main" } +maintenance = { status = "actively-developed" } + +[features] +default = [] +no-std = ["mech-core/no-std", "rlibc"] +lang-server = ["tower-lsp", "tokio"] + +[dependencies] +mech-core = {git = "https://gitlab.com/mech-lang/core", branch = "v0.1-beta"} + +hashbrown = "0.13.1" +lazy_static = "1.4.0" +nom = "7.1.2" +nom-unicode = "0.3.0" +unicode-segmentation = "1.10.0" +rlibc = { version = "=1.0", optional = true } +serde = "1.0.152" +serde_derive = "1.0.152" +colored = "2.0.0" + +tower-lsp = {version = "0.17.0", optional = true} +tokio = { version = "1.23.0", features = ["full"], optional = true } \ No newline at end of file diff --git a/src/syntax/LICENSE b/src/syntax/LICENSE new file mode 100644 index 0000000..41c00c9 --- /dev/null +++ b/src/syntax/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2018 Corey Montella + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/src/syntax/README.md b/src/syntax/README.md new file mode 100644 index 0000000..1dd5b2e --- /dev/null +++ b/src/syntax/README.md @@ -0,0 +1,36 @@ +

    + +

    + +Mech is a language for developing **data-driven**, **reactive** systems like robots, games, and animations. It makes **composing**, **transforming**, and **distributing** data easy, allowing you to focus on the essential complexity of your project. + +You can try Mech online at [https://mech-lang.org/try](https://mech-lang.org/try). + +Usage and installation instructions can be found in the [documentation](https://mech-lang.org/#/docs/index.mec) or the [main Mech repository](https://github.com/mech-lang/mech). + +Be sure to follow our [blog](https://mech-lang.org/blog/)([RSS](https://mech-lang.org/feed.xml))! + +# Syntax + +A toolchain for compiling textual Mech source code. + +## Contents + +- **parser** - converts text into a parse tree. +- **ast** - converts parse tree into abstract syntax tree. +- **compiler** - converts abstract syntax tree into blocks. +- **formatter** - converts a parse tree into text. + +This branch also contains various editor modes that implement the language server protocol. Modes are available for: + +- [VS Code](https://marketplace.visualstudio.com/items?itemName=Mech.Mech) +- EMACS (Coming soon...) +- VIM (Coming soon...) + +## Project Status + +Mech is currently in the **beta** stage of development. This means that the language is at a suitable stage for a wider audience. While most language feature implementations are started, none are finished, and some new features may, while others could be removed. Backwards and forwards compatibility of Mech programs is not guaranteed at this time. + +## License + +Apache 2.0 \ No newline at end of file diff --git a/src/syntax/editor-modes/vscode/.gitignore b/src/syntax/editor-modes/vscode/.gitignore new file mode 100644 index 0000000..38b1ce8 --- /dev/null +++ b/src/syntax/editor-modes/vscode/.gitignore @@ -0,0 +1,3 @@ +node_modules +.vscode +out \ No newline at end of file diff --git a/src/syntax/editor-modes/vscode/README.md b/src/syntax/editor-modes/vscode/README.md new file mode 100644 index 0000000..45379ad --- /dev/null +++ b/src/syntax/editor-modes/vscode/README.md @@ -0,0 +1,17 @@ +# Mech Mode for Visual Studio Code + +Find out more at https://mech-lang.org + +## Installation + +In Visual Studio Code, run the command + +``` +ext install Mech +``` + +Or search for "Mech" in the marketplace browser and click "install". + +## Features + +- Syntax highlighting for *.mec documents. \ No newline at end of file diff --git a/src/syntax/editor-modes/vscode/images/logo.png b/src/syntax/editor-modes/vscode/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..62e5108123d2a8318e919d000155e9dfbe766568 GIT binary patch literal 1893 zcmeAS@N?(olHy`uVBq!ia0y~yVEh8Y9Be?5)7S2I0V%d5Z+91l{~)+v@AAn&5zYdS z$YKTtZeb8+WSBKa0w~B{;_2(k{*;lMN!#l3k-DisA=%83h!W@g+}zZ>5+Ij>!MP|k zu_QG`p**uBL&4qCHy}kXl^tlqNlzEYkcwMx?-*taCrTXnsGeK0V*Ub;#}C4|_|7#& z=XdUYprFTo?CiNZ=7Ww*Cm(1{TB~%)bK(Lg^_6>d)`oP=Ir?xz>!ScEarbtSo}Ih@ z)qR%!^sMszkIB+{Okj(L4bdqKhD7;{3 zSilTK2tGuJ;eXU+j#saLyj`22w{G4`WA&eH2MgEre(QVm>#jLlV?9_ONE1$TaF`2G z54Rex5m2XK*An7=nPbM*-hTFvZ;$IY|9Bkt+e`J^&o@u6N1dzB{{DRCHE~zLy>aWe zT~D61EYHia{iJQhpOXSgN_%USXLYX@UT=TWJZ;ZvO4tw+$tD)Z*&Dep*`b>qC_4y@UUs99_5I`V9AX&{%^8Jr#lyZUnZ3 zfIal#TF8$;xDjO7ilT+qDUDQz0@cH{kQzJ(wwMC5>f^i5{O;6$sd@Bu`SIVzw_iWk zZ|CD-k^M3IqMzL2xpx#Aj6a`{WnhtI5GY}AxWLHZ$PPkqK2WG()5llgGZy{)`SZos zD&EOJIV~OEU}uJZ-2HbLp;{p75k>&{a3io7iLioFE$4PF6TEW$(AlpY5#}5-7G1nI ov6}Zk#2fhBFl@?XxJS|+o0oW(u6&~MYY#}w)78&qol`;+0Q}wGFaQ7m literal 0 HcmV?d00001 diff --git a/src/syntax/editor-modes/vscode/images/mech-m3.png b/src/syntax/editor-modes/vscode/images/mech-m3.png new file mode 100644 index 0000000000000000000000000000000000000000..08e0c5764a9effff7cf5fb01ba395c94677b5ba9 GIT binary patch literal 5935 zcmeHLX;hQx75*>^E`>1842y!Ov^Z0UTNQ#xKoP+O6%aBYh!&J3kbn@`60k)!rWR;j@42y~cK|_F$q!1tygb+dqAzMG4j$`N4ADuIQn$sWe`ObUa_gn7! z-0$A!J{Jxh@G)JwVkrOsrh9yM1pvSTF*x2VHU=#`|0A~G#V9$zXD2{r+l+yeh0#0w zb^t(i;WEwfMc{l%qHjnt0GP4f4Wl;9{U`viXx_7H$KkZ26TFVXa0R|iCjHi0=ms^0 zlsm`ynjiAEXsizR^=Vg0dzOM-&VGv@^9jSb>{lM5H0KFo>MsJ`X4&!=aJ-HM21qGUm`djqfO zkUZ{1N9A_ncqe=ey)wWU1{*h;tn8hi~Zgg*UKbR~q}S5;wJ zQ$n#PgP6?dic$F}IzOREYFc#KiG0-O*7&(91R`Jfu41b$9b91QDHbSD)8Jhc|9RG3O3tdxWj3vlcI-Qjzww z{w4yX6me1Rk*14JctGI@;+=7M+8X$nBgZzq)H>`O;b~_hepk)Ox39()Y^>; zPdTC26?{2asuOEut^A2rS7yhIf3b&tpf6M^!a1;^%%Qu=q%5&)RN!h?$d%Y-&*jWF zGziIEX;uqxOY`A&B;f?46acR5EQSD{i<8U%U`?|t0Gu@k)2jLZzVZB|Li!rl3mN!A zt|Mj+0GG|AB@Jf3v2rfobFP44lRR>usR92_#hqesIAwXhBU!3a5hp6*XJ>c=<-*D$;&>hscX);6kIM$ zQ1MNuBrZK&B`L_wNgBD+-Ge`Y!8A-Zi3O7Sqh!T#0z8Bl=T=&h<1Zb$h%KdWFG3YQ{}q8np&<$c4!ziQ|pIM4W{0}7H}fI(y|!y3;=in!y?Q< zZuqq!rLd2pA;yJG)s=66DI-XbBb;z|CBQ6Dd3Oe(^uer-?hlo&?$HOXRHYx)p4i+( zWC)O!Cdg=0E6k<1=^uuN`p1y$-`SfnQR4A)3QmS7z)Qc~@@5)W*iOivj3-ejoOtJz zbe1lpc;>ofa=U<_u3vRmWRI%T%Ae(n0)_Zw5a<60FkMGF{)CRI4Y3&25}ZXis^l4E zd%(JbxaxXKq`MkJNAhi z;n{)uZ2h_86VhoE447*F;OWr2iuGF*r?)j-Z(dgApg#YV#g3V9f}R}PTUS1=|1<;n zccK;3axj;Y$Xos^-)LCX`J>P_5Wew$j|?>R{^s$?Y;%HPdv=h}-|X9`4P8aAubyXs ze6cYGK(9?Qo7%*4qt?-Ak+#kKArD$qcY0E`#l~@lPx(2xv4S9p@}HV!J~?ChLu(6W z`%I2)R#j6MA300jV8;A=VC(y~`QGgjdx5LT+$}zz*56lcb_zdatJvK$d@2)) zUrm663uNl_c=HYH1Sevh?%JYWs1^naG`_11Nw)YoV5Qd7!?b(lvD0hh0YRc#NBkAF*b|)U` z8;?tf4bINYB4%yA1P8!PYuV5{aK<8#n8hL}Ana5Ma|26}RRtQ#WpJgNnCbV2!*fna zG>A))Axlj^V`k8b+ArPY_nf;8RiE5n5ftrwu;=ChL}<;}?8Xxj9m-0oXi(Cs4C`}= zj10?^M$j9lpAw3#9e^!y<2YK~w#o`H-+X7p!{5`)dnq|CY(#j?MDEeF_EBmO@x8!S z%W=wa5aB2uodo?r*S6C$f-Iq652hO@$Ww&}?IY&r5NnJdP}XzH+ubY~v)zR)uAZXM zOLFgf19?@^i6)PswZf@SJ(CRQu3-~zyi5964@>( zt!(FEWrd80A)D`#VBnSqQdUU|s>jKs;)jze-7uP;Oi?t6=Ic ohYU?F{Ux~XRN=LUwRVUFgMS--^!rLs^IRF3v literal 0 HcmV?d00001 diff --git a/src/syntax/editor-modes/vscode/language-configuration.json b/src/syntax/editor-modes/vscode/language-configuration.json new file mode 100644 index 0000000..aa25710 --- /dev/null +++ b/src/syntax/editor-modes/vscode/language-configuration.json @@ -0,0 +1,30 @@ +{ + "comments": { + // symbol used for single line comment. Remove this entry if your language does not support line comments + "lineComment": "//", + // symbols used for start and end a block comment. Remove this entry if your language does not support block comments + "blockComment": [ "/*", "*/" ] + }, + // symbols used as brackets + "brackets": [ + ["{", "}"], + ["[", "]"], + ["(", ")"] + ], + // symbols that are auto closed when typing + "autoClosingPairs": [ + ["{", "}"], + ["[", "]"], + ["(", ")"], + ["\"", "\""], + ["'", "'"] + ], + // symbols that that can be used to surround a selection + "surroundingPairs": [ + ["{", "}"], + ["[", "]"], + ["(", ")"], + ["\"", "\""], + ["'", "'"] + ] +} \ No newline at end of file diff --git a/src/syntax/editor-modes/vscode/package-lock.json b/src/syntax/editor-modes/vscode/package-lock.json new file mode 100644 index 0000000..3cc2b13 --- /dev/null +++ b/src/syntax/editor-modes/vscode/package-lock.json @@ -0,0 +1,3563 @@ +{ + "name": "mech", + "version": "0.0.3", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "mech", + "version": "0.0.3", + "hasInstallScript": true, + "dependencies": { + "vscode-languageclient": "^7.0.0" + }, + "devDependencies": { + "@types/node": "^18.11.9", + "@types/vscode": "^1.63.0", + "@typescript-eslint/eslint-plugin": "^4.16.0", + "@typescript-eslint/parser": "^4.16.0", + "@vscode/test-electron": "^2.1.2", + "eslint": "^7.21.0", + "typescript": "^4.8.4" + }, + "engines": { + "vscode": "^1.13.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", + "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", + "dev": true + }, + "node_modules/@types/vscode": { + "version": "1.73.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.73.0.tgz", + "integrity": "sha512-FhkfF7V3fj7S3WqXu7AxFesBLO3uMkdCPJJPbwyZXezv2xJ6xBWHYM2CmkkbO8wT9Fr3KipwxGGOoQRrYq7mHg==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz", + "integrity": "sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==", + "dev": true, + "dependencies": { + "@typescript-eslint/experimental-utils": "4.33.0", + "@typescript-eslint/scope-manager": "4.33.0", + "debug": "^4.3.1", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.1.8", + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^4.0.0", + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/experimental-utils": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz", + "integrity": "sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.33.0", + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/typescript-estree": "4.33.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz", + "integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "4.33.0", + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/typescript-estree": "4.33.0", + "debug": "^4.3.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", + "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", + "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", + "dev": true, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", + "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", + "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.33.0", + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vscode/test-electron": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.2.0.tgz", + "integrity": "sha512-xk2xrOTMG75/hxO8OVVZ+GErv9gmdZwOD8rEHV3ty3n1Joav2yFcfrmqD6Ukref27U13LEL8gVvSHzauGAK5nQ==", + "dev": true, + "dependencies": { + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "rimraf": "^3.0.2", + "unzipper": "^0.10.11" + }, + "engines": { + "node": ">=8.9.3" + } + }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", + "dev": true, + "dependencies": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/bluebird": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer-indexof-polyfill": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", + "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", + "dev": true, + "engines": { + "node": ">=0.2.0" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", + "dev": true, + "dependencies": { + "traverse": ">=0.3.0 <0.4" + }, + "engines": { + "node": "*" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint/node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/fstream/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/listenercount": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", + "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/table": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/unzipper": { + "version": "0.10.11", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz", + "integrity": "sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==", + "dev": true, + "dependencies": { + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "^1.0.12", + "graceful-fs": "^4.2.2", + "listenercount": "~1.0.1", + "readable-stream": "~2.3.6", + "setimmediate": "~1.0.4" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "node_modules/vscode-jsonrpc": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz", + "integrity": "sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==", + "engines": { + "node": ">=8.0.0 || >=10.0.0" + } + }, + "node_modules/vscode-languageclient": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-7.0.0.tgz", + "integrity": "sha512-P9AXdAPlsCgslpP9pRxYPqkNYV7Xq8300/aZDpO35j1fJm/ncize8iGswzYlcvFw5DQUx4eVk+KvfXdL0rehNg==", + "dependencies": { + "minimatch": "^3.0.4", + "semver": "^7.3.4", + "vscode-languageserver-protocol": "3.16.0" + }, + "engines": { + "vscode": "^1.52.0" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz", + "integrity": "sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==", + "dependencies": { + "vscode-jsonrpc": "6.0.0", + "vscode-languageserver-types": "3.16.0" + } + }, + "node_modules/vscode-languageserver-types": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz", + "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==" + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + } + } + }, + "@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true + }, + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "@types/node": { + "version": "18.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", + "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", + "dev": true + }, + "@types/vscode": { + "version": "1.73.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.73.0.tgz", + "integrity": "sha512-FhkfF7V3fj7S3WqXu7AxFesBLO3uMkdCPJJPbwyZXezv2xJ6xBWHYM2CmkkbO8wT9Fr3KipwxGGOoQRrYq7mHg==", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz", + "integrity": "sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "4.33.0", + "@typescript-eslint/scope-manager": "4.33.0", + "debug": "^4.3.1", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.1.8", + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz", + "integrity": "sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.33.0", + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/typescript-estree": "4.33.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz", + "integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "4.33.0", + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/typescript-estree": "4.33.0", + "debug": "^4.3.1" + } + }, + "@typescript-eslint/scope-manager": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", + "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0" + } + }, + "@typescript-eslint/types": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", + "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", + "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", + "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.33.0", + "eslint-visitor-keys": "^2.0.0" + } + }, + "@vscode/test-electron": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.2.0.tgz", + "integrity": "sha512-xk2xrOTMG75/hxO8OVVZ+GErv9gmdZwOD8rEHV3ty3n1Joav2yFcfrmqD6Ukref27U13LEL8gVvSHzauGAK5nQ==", + "dev": true, + "requires": { + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "rimraf": "^3.0.2", + "unzipper": "^0.10.11" + } + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "dev": true + }, + "binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", + "dev": true, + "requires": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + } + }, + "bluebird": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "buffer-indexof-polyfill": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", + "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", + "dev": true + }, + "buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", + "dev": true + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", + "dev": true, + "requires": { + "traverse": ">=0.3.0 <0.4" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "dev": true, + "requires": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + } + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + } + }, + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "listenercount": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", + "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "dev": true + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "table": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "dev": true, + "requires": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", + "dev": true + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "typescript": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "dev": true + }, + "unzipper": { + "version": "0.10.11", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz", + "integrity": "sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==", + "dev": true, + "requires": { + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "^1.0.12", + "graceful-fs": "^4.2.2", + "listenercount": "~1.0.1", + "readable-stream": "~2.3.6", + "setimmediate": "~1.0.4" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "vscode-jsonrpc": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz", + "integrity": "sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==" + }, + "vscode-languageclient": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-7.0.0.tgz", + "integrity": "sha512-P9AXdAPlsCgslpP9pRxYPqkNYV7Xq8300/aZDpO35j1fJm/ncize8iGswzYlcvFw5DQUx4eVk+KvfXdL0rehNg==", + "requires": { + "minimatch": "^3.0.4", + "semver": "^7.3.4", + "vscode-languageserver-protocol": "3.16.0" + } + }, + "vscode-languageserver-protocol": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz", + "integrity": "sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==", + "requires": { + "vscode-jsonrpc": "6.0.0", + "vscode-languageserver-types": "3.16.0" + } + }, + "vscode-languageserver-types": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz", + "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==" + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } +} diff --git a/src/syntax/editor-modes/vscode/package.json b/src/syntax/editor-modes/vscode/package.json new file mode 100644 index 0000000..aa26a04 --- /dev/null +++ b/src/syntax/editor-modes/vscode/package.json @@ -0,0 +1,85 @@ +{ + "name": "mech", + "displayName": "Mech", + "description": "Support for the Mech programming language.", + "version": "0.0.3", + "publisher": "Mech", + "icon": "images/mech-m3.png", + "engines": { + "vscode": "^1.13.0" + }, + "categories": [ + "Programming Languages" + ], + "repository": { + "url": "https://github.com/mech-lang/mech.git" + }, + "main": "./out/extension", + "contributes": { + "languages": [ + { + "id": "Mech", + "aliases": [ + "Mech" + ], + "extensions": [ + "mec" + ], + "configuration": "./language-configuration.json" + } + ], + "grammars": [ + { + "language": "Mech", + "scopeName": "mech", + "path": "./syntaxes/mech.tmLanguage.json" + } + ], + "configuration": { + "type": "object", + "title": "Example configuration", + "properties": { + "languageServerExample.maxNumberOfProblems": { + "scope": "resource", + "type": "number", + "default": 100, + "description": "Controls the maximum number of problems produced by the server." + }, + "languageServerExample.trace.server": { + "scope": "window", + "type": "string", + "enum": [ + "off", + "messages", + "verbose" + ], + "default": "off", + "description": "Traces the communication between VS Code and the language server." + } + } + } + }, + "activationEvents": [ + "onLanguage:Mech" + ], + "dependencies": { + "vscode-languageclient": "^7.0.0" + }, + "scripts": { + "vscode:prepublish": "npm run compile", + "compile": "tsc -b", + "watch": "tsc -b -w", + "lint": "eslint ./src --ext .ts,.tsx", + "postinstall": "cd client && npm install && cd ../server && npm install && cd ..", + "test": "sh ./scripts/e2e.sh" + }, + "devDependencies": { + "@types/node": "^18.11.9", + "@types/vscode": "^1.63.0", + "@typescript-eslint/eslint-plugin": "^4.16.0", + "@typescript-eslint/parser": "^4.16.0", + "@vscode/test-electron": "^2.1.2", + "eslint": "^7.21.0", + "typescript": "^4.8.4" + } +} diff --git a/src/syntax/editor-modes/vscode/src/extension.ts b/src/syntax/editor-modes/vscode/src/extension.ts new file mode 100644 index 0000000..e5651e6 --- /dev/null +++ b/src/syntax/editor-modes/vscode/src/extension.ts @@ -0,0 +1,76 @@ +import * as path from 'path'; +import { workspace, ExtensionContext } from 'vscode'; +import * as net from 'net'; +import * as child_process from 'child_process'; +import { + LanguageClient, + LanguageClientOptions, + ServerOptions, + StreamInfo, + TransportKind +} from 'vscode-languageclient/node'; + +let client: LanguageClient; + +export function activate(context: ExtensionContext) { + // The server is implemented in node + const serverModule = context.asAbsolutePath( + path.join('langserver') + ); + // The debug options for the server + // --inspect=6009: runs the server in Node's Inspector mode so VS Code can attach to the server for debugging + const args = ['-p', '4041']; + child_process.execFile(serverModule, args) + const connection = new net.Socket(); + let retryCount = 0; + function onError(err: { message: string | string[]; }) { + if(err.message.indexOf('ECONNREFUSED') > -1 && retryCount <5) { + retryCount += 1; + console.log("Attempting to reconnect shortly") + setTimeout(()=>{ + connection.connect(4041, "localhost"); + connection.on('error', onError); + connection.on("close", onClose); + },1000) + } + } + function onClose() { + console.log("Removng all listeners") + connection.removeAllListeners("error") + } + connection.connect(4041, "localhost"); + connection.on('error', onError); + connection.on("close", onClose); + const serverOptions: ServerOptions = () => Promise.resolve({ + reader: connection, + writer: connection, + }); + + // Options to control the language client + const clientOptions: LanguageClientOptions = { + // Register the server for plain text documents + documentSelector: [{ scheme: 'file', language: 'Mech' }], + synchronize: { + // Notify the server about file changes to '.clientrc files contained in the workspace + fileEvents: workspace.createFileSystemWatcher('**/.clientrc') + } + }; + + // Create the language client and start the client. + client = new LanguageClient( + 'langServer', + 'Test language server', + serverOptions, + clientOptions + ); + + // Start the client. This will also launch the server + client.start(); +} + +export function deactivate(): Thenable | undefined { + if (!client) { + return undefined; + } + return client.stop(); +} diff --git a/src/syntax/editor-modes/vscode/syntaxes/mech.tmLanguage.json b/src/syntax/editor-modes/vscode/syntaxes/mech.tmLanguage.json new file mode 100644 index 0000000..1dbf2e2 --- /dev/null +++ b/src/syntax/editor-modes/vscode/syntaxes/mech.tmLanguage.json @@ -0,0 +1,275 @@ +{ + "$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json", + "name": "mech", + "patterns": [ + { + "include": "#block" + }, + { + "name": "markup.heading", + "match": ".+(\n=+)" + }, + { + "name": "markup.heading", + "match": ".+(\n-+)" + }, + { + "name": "markup.inserted", + "match": "//.+" + }, + { + "name": "string.regexp", + "match": "~" + }, + { + "name": "variable.function", + "match": "\\|([A-Z]|[a-z]|/|-| |[0-9])+\\||([A-Z]|[a-z]|/|-|[0-9])+: " + }, + { + "name": "variable.function", + "match": "\\S+(?=\\[)" + }, + {"name": "constant.regexp", + "match": "\\[|\\]|{|}" + }, + { + "name": "string.quoted.double.mech", + "begin": "\"", + "end": "\"", + "patterns": [ + { + "name": "constant.character.escape.mech", + "match": "\\\\." + }, + { + "name": "keyword.control.mech", + "begin": "{{", + "end": "}}", + "patterns": [ + { + "name": "constant.numeric.integer", + "match": "[^}]*" + } + ] + } + ] + }, + { + "name": "constant.language", + "match": "true|false|none" + }, + { + "name": "variable.function", + "match": "< |> |-> |-< " + }, + { + "name": "meta.block", + "begin": "<", + "end": ">", + "beginCaptures": { + "0": { "name": "keyword.control.mech" } + }, + "endCaptures": { + "0": { "name": "keyword.control.mech" } + }, + "patterns": [ + { + "name": "constant.numeric", + "match": "[0-9a-z/^]+" + } + ] + }, + + { + "name" : "constant.regexp", + "match": "#" + }, + + { + "name": "constant.numeric.integer", + "match": "0x[A-Z0-9]+" + }, + { + "name": "meta.block", + "begin": "[a-z]+ ", + "end": "[A-Za-z]| |\\.", + "patterns": [ + { + "name": "", + "match": "[0-9]+" + } + ] + }, + { + "name" : "constant.numeric.integer", + "match": "[0-9]+" + }, + { + "name": "meta.block", + "begin": "[a-z]+\\.", + "end": "\n| |{", + "patterns": [ + { + "name": "entity.name.tag.css", + "match": "[A-Za-z][0-9]*" + } + ] + }, + { + "name" : "constant.numeric.integer", + "match": "([0-9]+(\\.)[0-9]+)" + }, + { + "name" : "", + "match": "[a-z]+[0-9-]" + }, + { + "name": "meta.block", + "begin": "( |\n)[a-z]+\/", + "end": "\\(", + "beginCaptures": { + "0": { "name": "constant.language" } + }, + "patterns": [ + { + "name": "constant.language", + "match": "[a-z]+" + } + ] + } + ], + "repository": { + "block": { + "name": "meta.block", + "begin": " |~~~|```|`", + "end": "\n|~~~|```|`", + "patterns": [ + { + "name": "markup.inserted", + "match": "//.+" + }, + { + "name": "string.regexp", + "match": "~" + }, + { + "name": "variable.function", + "match": "\\|([A-Z]|[a-z]|/|-| |[0-9])+\\||([A-Z]|[a-z]|/|-|[0-9])+: " + }, + { + "name": "variable.function", + "match": "\\S+(?=\\[)" + }, + {"name": "constant.regexp", + "match": "\\[|\\]|{|}" + }, + { + "name": "string.quoted.double.mech", + "begin": "\"", + "end": "\"", + "patterns": [ + { + "name": "constant.character.escape.mech", + "match": "\\\\." + }, + { + "name": "keyword.control.mech", + "begin": "{{", + "end": "}}", + "patterns": [ + { + "name": "constant.numeric.integer", + "match": "[^}]*" + } + ] + } + ] + }, + { + "name": "constant.language", + "match": "true|false|none" + }, + { + "name": "variable.function", + "match": "< |> |-> |-< " + }, + { + "name": "meta.block", + "begin": "<", + "end": ">", + "beginCaptures": { + "0": { "name": "keyword.control.mech" } + }, + "endCaptures": { + "0": { "name": "keyword.control.mech" } + }, + "patterns": [ + { + "name": "constant.numeric", + "match": "((u|i)(8|16|32|64|128))|(f)(32|64|128)|bool|string" + } + ] + }, + + { + "name" : "constant.regexp", + "match": "#" + }, + + + + { + "name": "constant.numeric.integer", + "match": "(0x[A-Z0-9]+)" + }, + { + "name" : "constant.numeric.integer", + "match": "([0-9]+)" + }, + + + { + "name": "meta.block", + "begin": "[a-z]+\\.", + "end": "\n| |{", + "patterns": [ + { + "name": "entity.name.tag.css", + "match": "[A-Za-z][0-9]*" + } + ] + }, + { + "name" : "constant.numeric.integer", + "match": "([0-9]+(\\.)[0-9]+)" + }, + { + "name" : "", + "match": "[a-z]+[0-9-]" + }, + { + "name": "meta.block", + "begin": "( |\n)[a-z]+\/", + "end": "\\(", + "beginCaptures": { + "0": { "name": "constant.language" } + }, + "patterns": [ + { + "name": "constant.language", + "match": "[a-z]+" + } + ] + } + + + + + + + + ] + } + }, + "scopeName": "mech" +} diff --git a/src/syntax/editor-modes/vscode/tsconfig.json b/src/syntax/editor-modes/vscode/tsconfig.json new file mode 100644 index 0000000..124d162 --- /dev/null +++ b/src/syntax/editor-modes/vscode/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "es2020", + "lib": ["es2020"], + "outDir": "out", + "rootDir": "src", + "sourceMap": true + }, + "include": ["src"], + "exclude": ["node_modules", ".vscode-test"] +} \ No newline at end of file diff --git a/src/syntax/grammar.md b/src/syntax/grammar.md new file mode 100644 index 0000000..564b54e --- /dev/null +++ b/src/syntax/grammar.md @@ -0,0 +1,249 @@ +# Mech Grammar (10/16/2022 01:11:35) + +| Symbol | Semantics | +|:------:|:----------------------------------------------------| +| "abc" | input matches string literal "abc" (terminal) | +| p* | input matches `p` for 0 or more times (repetition) | +| p+ | input mathces `p` for 1 or more times (repetition) | +| p? | input mathces `p` for 0 or 1 time (optional) | +| p1, p2 | input matches `p1` followed by `p2` (sequence) | +| p1\|p2 | input matches `p1` or `p2` (ordered choice) | +| !!p | input matches `p`; never consume input (peek) | +| !p | input doesn't match `p`; never consume input (peek) | +| (...) | common grouping | +| <...> | labeled grouping | + + +## The basics + +``` +emoji ::= emoji_grapheme+ ; +word ::= alpha+ ; +digit1 ::= digit+ ; +digit0 ::= digit* ; +bin_digit ::= "0" | "1" ; +hex_digit ::= digit | "a" | "b" | "c" | "d" | "e" | "f" | "A" | "B" | "C" | "D" | "E" | "F" ; +oct_digit ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" ; +number ::= digit1 ; +identifier ::= (word | emoji), (word | number | dash | slash | emoji)* ; +boolean_literal ::= true_literal | false_literal ; +true_literal ::= english_true_literal | true_symbol ; +false_literal ::= english_false_literal | false_symbol ; +true_symbol ::= "✓" ; +false_symbol ::= "✗" ; +english_true_literal ::= "true" ; +english_false_literal ::= "false" ; + +punctuation ::= period | exclamation | question | comma | colon | semicolon | dash | apostrophe | left_parenthesis | right_parenthesis | left_angle | right_angle | left_brace | right_brace | left_bracket | right_bracket ; +symbol ::= ampersand | bar | at | slash | backslash | hashtag | equal | tilde | plus | asterisk | asterisk | caret | underscore ; +paragraph_symbol ::= ampersand | at | slash | backslash | asterisk | caret | underscore ; +text ::= (word | space | number | punctuation | symbol | emoji)+ ; +paragraph_rest ::= (word | space | number | punctuation | paragraph_symbol | quote | emoij)+ ; +paragraph_starter ::= (word | number | quote | left_angle | right_angle | left_bracket | right_bracket | period | exclamation | question | comma | colon | semicolon | left_parenthesis | right_parenthesis | emoji)+ ; + +carriage_newline ::= "\r\n" ; +newline ::= new_line_char | carriage_newline ; +whitespace ::= space*, newline+ ; + +number_literal ::= (hexadecimal_literal | octal_literal | binary_literal | decimal_literal | float_literal), kind_annotation? ; +float_literal ::= "."?, digit1, "."?, digit0 ; +decimal_literal ::= "0d", ; +hexadecimal_literal ::= "0x", ; +octal_literal ::= "0o", ; +binary_literal ::= "0b", ; +value ::= empty | boolean_literal | number_literal | string ; +empty ::= underscore+ ; +``` + +## Blocks + + +### Data + +``` +select_all ::= colon ; +subscript ::= (select_all | expression | tilde), space*, comma?, space* ; +subscript_index ::= left_brace, , ; +single_subscript_index ::= left_brace, , ; +dot_index ::= period, , single_subscript_index? ; +swizzle ::= period, identifier, comma, !space, ; +reshape_column ::= left_brace, colon, right_brace ; +index ::= swizzle | dot_index | reshape_column | subscript_index ; +data ::= (table | identifier), index*, transpose? ; +kind_annotation ::= left_angle, <(identifier | underscore), (",", (identifier | underscore))*>, ; +``` + +### Tables + +``` +table ::= hashtag, ; +binding ::= s*, identifier, kind_annotation?, , colon, s+, + , ) | s+> ; + where s ::= space | newline | tab ; +binding_strict ::= s*, identifier, kind_annotation?, , colon, , + , ) | s+> ; + where s ::= space | newline | tab ; +function_binding ::= identifier, , , , space*, comma?, space* ; +table_column ::= (space | tab)*, (expression | value | data), comma?, (space | tab)* ; +table_row ::= (space | tab)*, table_column+, semicolon?, newline? ; +attribute ::= identifier, kind_annotation?, space*, comma?, space* ; +table_header ::= bar, , , space*, newline? ; +anonymous_table ::= left_bracket, (space | newline | tab)*, table_header?, + ((comment, newline) | table_row)*, (space | newline | tab)*, ; +empty_table ::= left_bracket, (space | newline | tab)*, table_header?, (space | newline | tab)*, right_bracket ; +inline_table ::= left_bracket, binding, , ; +``` + +### Statements + +``` +stmt_operator ::= split_operator | flatten_operator | set_operator | update_operator | add_row_operator | equal ; +comment_sigil ::= "--" ; +comment ::= (space | tab)*, comment_sigil, , ; +add_row_operator ::= "+=" ; +add_row ::= table, , space*, add_row_operator, , ; +add_update_operator ::= ":+=" ; +subtract_update_operator ::= ":-=" ; +multiply_update_operator ::= ":*=" ; +divide_update_operator ::= ":/=" ; +update_operator ::= add_update_operator | subtract_update_operator | multiply_update_operator | divide_update_operator ; +update_data ::= data, , space*, update_operator, , ; +set_operator ::= ":=" ; +set_data ::= data, , space*, set_operator, , ; +split_data ::= (identifier | table), , space*, split_operator, , ; +flatten_data ::= identifier, , space*, flatten_operator, , ; +variable_define ::= identifier, , space*, equal, , ; +table_define ::= table, kind_annotation?, , space*, equal, , ; +split_operator ::= ">-" ; +flatten_operator ::= "-<" ; +whenever_oeprator ::= "~" ; +until_operator ::= "~|" ; +wait_operator ::= "|~" ; +async_assign_operator ::= "<~" ; +whenever_data ::= whenever_operator, , , ; +wait_data ::= wait_operator, , , ; +until_data ::= until_operator, , , ; +statement ::= (table_define | variable_define | split_data | flatten_data | whenever_data | wait_data | until_data | set_data | update_data | add_row | comment ), space*, ; +``` + +### Expressions + + +#### Math expressions + +``` +parenthetical_expression ::= left_parenthesis, , ; +negation ::= dash, !(dash | space), ; +function ::= identifier, left_parenthesis, , ; +user_function ::= left_bracket, function_output*, , , , , , + , , , , ; +function_output ::= identifier, , space*, comma?, space* ; +function_input ::= identifier, , space*, comma?, space* ; +function_body ::= indented_tfm+, whitespace* ; +matrix_multiply ::= "**" ; +add ::= "+" ; +subtract ::= "-" ; +multiply ::= "*" ; +divide ::= "/" ; +exponent ::= "^" ; +range_op ::= colon ; +l0 ::= l1, l0_infix* ; +l0_infix ::= , range_op, , ; +l1 ::= l2, l1_infix* ; +l1_op ::= add | subtract ; +l1_infix ::= , space*, !negation, !comment_sigil, l1_op, , ; +l2 ::= l3, l2_infix* ; +l2_op ::= matrix_multiply | multiply | divide ; +l2_infix ::= , space*, l2_op, , ; +l3 ::= l4, l3_infix* ; +l3_op ::= exponent ; +l3_infix ::= , space*, l3_op, , ; +l4 ::= l5, l4_infix* ; +l4_op ::= and | or | xor ; +l4_infix ::= , space*, l4_op, , ; +l5 ::= l6, l5_infix* ; +l5_op ::= not_equal | equal_to | greater_than_equal | greater_than | less_than_equal | less_than ; +l5_infix ::= , space*, l5_op, , ; +l6 ::= empty_table | string | anonymous_table | function | value | not | data | negation | parenthetical_expression ; +math_expression ::= l0 ; +``` + +#### Filter expressions + +``` +not_equal ::= "!=" | "¬=" | "≠" ; +equal_to ::= "==" ; +greater_than ::= ">" ; +less_than ::= "<" ; +greater_than_equal ::= ">=" | "≥" ; +less_than_equal ::= "<=" | "≤" ; +``` + +#### Logic expressions + +``` +or ::= "|" ; +and ::= "&" ; +not ::= "!" | "¬" ; +xor ::= "xor" | "⊕" | "⊻" ; +``` + +#### Other expressions + +``` +string ::= quote, (!quote, )*, quote ; +transpose ::= "'" ; +expression ::= (empty_table | inline_table | math_expression | string | anonymous_table), transpose? ; +``` + +### Block basics + +``` +transformation ::= statement; +empty_line ::= space*, newline ; +indented_tfm ::= !empty_line, space, , , ; +block ::= indented_tfm+, whitespace* ; +``` + +## Markdown + +``` +ul_title ::= space*, text, space*, newline, equal+, space*, newline* ; +title ::= ul_title ; +ul_subtitle ::= space*, text, space*, newline, dash+, space*, newline* ; +subtitle ::= ul_subtitle ; +inline_code ::= grave, text, grave, space* ; +paragraph_text ::= paragraph_starter, paragraph_rest? ; +paragraph ::= (inline_code | paragraph_text)+, whitespace*, newline* ; +unordered_list ::= list_item+, newline?, whitespace* ; +list_item ::= dash, , , newline* ; +formatted_text ::= (!grave, !eof, )* ; +code_block ::= grave, , , , formatted_text, ; +``` + +## Mechdown + +``` +mech_code_block ::= grave{3}, !!"mec", <"mech:">, text?, , , , whitespace* ; +``` + +## Start here + +``` +section_element ::= user_function | block | mech_code_block | code_block | statement | subtitle | paragraph | unordered_list; +section ::= (!eof, , whitespace?)+ ; +body ::= whitespace*, section+ ; +program ::= whitespace?, title?, , whitespace?, space* ; +parse_mech_fragment ::= statement ; +parse_mech ::= program | statement ; +``` +## Table +```ebnf +table_title = "│#", identifier, ["+"], space, "(", number, space, "x", space, number, ")", {space}, "│", newline; +table_type = "U8"|"U16"|"U32"|"U64"|"U128"|"I8"|"I16"|"I32"|"I64"|"I128"|"F32"|"F64"|"Bool"|"String"; + +table_line = "╭" | "├" | "╰",{"-",["┼" | "┬" | "┴"],"-"},"╮" | "┤" | "╯",newline; + +table_label = "│" , [{identifier, {space}, "│"}], newline +table = table_line, table_title, table_line, [table_label],table_line, ["│", {table_type, {space}, "│"}, newline], {"│", {expressions, {space}, "│"}, newline},table_line; +``` \ No newline at end of file diff --git a/src/syntax/grammar.txt b/src/syntax/grammar.txt new file mode 100644 index 0000000..2d613b6 --- /dev/null +++ b/src/syntax/grammar.txt @@ -0,0 +1,179 @@ + +parse_mech ::= program | statement + +program ::= whitespace?, title?, body, whitespace? + +whitespace ::= space*, newline+ + +title ::= ul_title + +ul_title ::= space*, text, space?, newline, equal+, space*, newline* + +newline ::= new_line_char | carriage_newline + +text ::= (word | space | number | punctuation | symbol | emoji)+ + +body ::= whitespace*, section+ + +section ::= (block | code_block | mech_code_block | statement | subtitle | paragraph | unordered_list, whitespace?)+ + +mech_code_block ::= grave{3}, tag("mech:"), text?, newline, block, grave{3}, newline, whitespace* + +subtitle ::= ul_subtitle + +ul_subtitle ::= space*, text, space*, newline, dash+, space*, newline* + +block ::= (space{2}, transformation)+, whitespace* + +unordered_list ::= list_item+, newline? whitespace* + +list_item ::= dash, space+, paragraph, newline* + +code_block ::= grave{3}, newline, formatted_text, grave{3}, newline, whitespace* + +formatted_text ::= (paragraph_rest | carriage_return | new_line_char)* + +paragraph ::= (inline_code | paragraph_text)+, whitespace*, newline* + +paragraph_text ::= paragraph_starter, paragraph_rest? + +paragraph_starter ::= (word | number | quote | left_angle | right_angle | left_backet | right_bracket | period | exclamation | + question | comma | colon | semicolon | left_parenthesis | right_parenthesis | emoji)+ + +paragraph_rest ::= (word, space, number, punctuation, paragraph_symbol, quote, emoji)+ + +paragraph_symbol ::= ampersand | at | slash | backslash | asterisk | caret | underscore + +transformation ::= statement, space*, newline* + +statement ::= table_define | variable_define | split_data | flatten_data | whenever_data | + wait_data | until_data | set_data | update_data | add_row | comment + +split_data ::= identifier | table, space+, split_operator, space+, expression + +flatten_data ::= identifier, space+, flatten_operator, space+, expression + +whenever_data ::= whenever_operator, space, variable_define | expression | data + +wait_data ::= wait_operator, space, variable_define | expression | data + +until_data ::= until_operator, space, variable_define | expression | data + +set_data ::= data, space+, set_opeartor, space+, expression + +update_data ::= data, space+, add_update_operator | subtract_update_oeprator | multiply_update_operator | divide_update_operator, space+, expression + +add_row ::= talbe, space+, add_row_operator, space+, expression | inline_table | anonymous_table + +comment ::= (space | tab)*, comment_sigil, text, (space | tab | newline)* + +table_define ::= table, kind_annotation?, space+, equal, space+, expression + +table ::= hashtag, identifier + +kind_annotation ::= left_angle, (identifier | underscore), (tag(","), (identifier | underscore))*, right_angle + +expression ::= inline_table | math_expression | string | empty_table | anonymous_table + +math_expression ::= l0 + +l0 ::= l1, l0_infix* + +l0_infix ::= space*, range_op, space*, l1 + +l1 ::= l2, l1_infix* + +l1_infix ::= space*, add | subtract, space*, l2 + +l2 ::= l3, l2_infix* + +l2_infix ::= space*, multiply | divide | matrix_multiply, space*, l3 + +l3 ::= l4, l3_infix* + +l3_infix ::= space*, exponent, space*, l4 + +l4 ::= l5, l4_infix* + +l4_infix ::= space*, and | or | xor, space*, l5 + +l5 ::= l6, l5_infix* + +l5_infix ::= space*, not_equal | equal_to | greater_than_equal | greater_than | less_than_equal | less_than, space*, l6 + +l6 ::= empty_table | string | anonymous_table | function | value | not | data | negation | parenthetical_expression + +parenthetical_expression ::= left_parenthesis, l0, right_parenthesis + +function ::= identifier, left_parenthesis, function_binding+, right_parenthesis + +function_binding ::= identifier, colon, space*, expression | identifier | value, sapce*, comma?, space* + +identifier ::= space*, (word | emoji), (word | number | dash | slash | emoji)* + +number ::= digit+ + +word ::= alpha+ + +empty_table ::= left_bracket, s*, space*, table_header?, s*, right_bracket + WHERE s: (space | newline | tab) + +inline_table ::= left_bracket, binding+, right_bracket + +binding ::= s*, identifier, kind_annotation?, colon, s*, empty | expression | identifier | value, s*, comma?, s* + WHERE s: (space | newline | tab) + +variable_define ::= identifier, space+, equal, space+, expression + +anonymous_table ::= left_bracket, s*, table_header?, (comment | table_row)*, s*, right_bracket + WHERE s: (space | newline | tab) + +table_row ::= (space | tab)*, table_column+, semicolon?, newline? // "5; 7; 8 8" machiens to table row... + +table_column ::= (space | tab)*, expression | value | data, comma?, (space | tab)* + +table_header ::= bar, attribute+, bar, space*, newline? + +data ::= table | identifier, index* + +index ::= swizzle | dot_index | reshape_column | subscript_index + +swizzle ::= period, identifier, comma, identifier, (tag(","), identifier)* + +dot_index ::= period, identifier, single_subscript_index? + +reshape_column ::= left_brace, colon, right_brace + +subscript_index ::= left_brace, subscript+, right_brace + +single_subscript_index ::= left_brace, subscript, right_brace + +subscript ::= select_all | expression | tilde, space*, comma?, space* + +select_all ::= colon + +attribute ::= identifier, kind_annotation?, space*, comma?, space* + +value ::= empty | boolean_literal | number_literal | string + +empty ::= underscore+ + +string ::= quote, text*, quote + +boolean_literal = true_literal | false_literal + +true_literal ::= english_true_literal | true_symbol + +false_literal ::= english_false_literal | false_symbol + +number_literal ::= hexadecimal_literal | octal_literal | binary_literal | decimal_literal | float_literal + +hexadecimal_literal ::= tag("0x"), hex_digit+ + +ocatal_literal ::= tag("0o"), oct_digit+ + +binary_literal ::= tag("0b"), bin_digit+ + +decimal_literal ::= tag("0d"), digit+ + +float_literal ::= tag(".")?, digit+, tag(".")?, digit* // ".5.7" matches a float literal? diff --git a/src/syntax/src/ast.rs b/src/syntax/src/ast.rs new file mode 100644 index 0000000..47dca55 --- /dev/null +++ b/src/syntax/src/ast.rs @@ -0,0 +1,849 @@ +// # AST + +// Takes a parse tree, produces an abstract syntax tree. + +// ## Prelude + +#[cfg(not(feature = "no-std"))] use core::fmt; +#[cfg(feature = "no-std")] use alloc::fmt; + +use mech_core::*; +use mech_core::nodes::*; + +lazy_static! { + pub static ref U16: u64 = hash_str("u16"); + pub static ref HEX: u64 = hash_str("hex"); + pub static ref OCT: u64 = hash_str("oct"); + pub static ref DEC: u64 = hash_str("dec"); + pub static ref BIN: u64 = hash_str("bin"); +} + +pub struct Ast { + depth: usize, + last_src_range: SourceRange, + pub syntax_tree: AstNode, +} + +impl Ast { + + pub fn new() -> Ast { + Ast { + depth: 0, + syntax_tree: AstNode::Null, + last_src_range: SourceRange::default(), + } + } + + pub fn compile_nodes(&mut self, nodes: &Vec) -> Vec { + let mut compiled = Vec::new(); + let mut iter = nodes.iter(); + if let Some(node) = iter.nth(0) { + compiled.append(&mut self.build_syntax_tree(node)); + let r1 = self.last_src_range; + for node in iter { + compiled.append(&mut self.build_syntax_tree(node)); + } + let r2 = self.last_src_range; + self.last_src_range = merge_src_range(r1, r2); + } + compiled + } + + pub fn build_syntax_tree(&mut self, node: &ParserNode) -> Vec { + let mut compiled = Vec::new(); + self.depth += 1; + match node { + ParserNode::Root{children} => self.syntax_tree = AstNode::Root{children: self.compile_nodes(children)}, + ParserNode::Fragment{children} => self.syntax_tree = AstNode::Root{children: self.compile_nodes(children)}, + ParserNode::Program{children} => { + let result = self.compile_nodes(children); + let mut children = vec![]; + let mut title = None; + for node in result { + match node { + AstNode::Title{text, ..} => title = Some(text), + _ => children.push(node), + } + } + compiled.push(AstNode::Program{title, children}); + }, + ParserNode::Head{children} => compiled.push(AstNode::Head{children: self.compile_nodes(children)}), + ParserNode::Section{children, title} => { + let result = self.compile_nodes(children); + let (title, level): (Option>, usize) = match title { + Some(title) => { + let result = self.compile_nodes(title); + if result.len() == 1 { + match &result[0] { + AstNode::Title{text, level, ..} => (Some(text.clone()),*level), + _ => (None, 1), + } + }else { + (None,1) + } + } + None => (None,1), + }; + compiled.push(AstNode::Section{title, level, children: result.clone()}); + }, + ParserNode::Block{children, src_range} => compiled.push(AstNode::Block{children: self.compile_nodes(children), src_range: *src_range}), + ParserNode::Data{children} => { + let result = self.compile_nodes(children); + let mut reversed = result.clone(); + reversed.reverse(); + let mut select_data_children: Vec = vec![]; + + let mut transpose = false; + + for node in reversed { + match node { + AstNode::Table{name, id, src_range} => { + if select_data_children.is_empty() { + select_data_children = vec![AstNode::Null; 1]; + } + select_data_children.reverse(); + compiled.push(AstNode::SelectData{name, id: TableId::Global(id), children: select_data_children.clone(), src_range}); + }, + AstNode::Identifier{name, id, src_range} => { + if select_data_children.is_empty() { + select_data_children = vec![AstNode::Null; 1]; + } + select_data_children.reverse(); + let select = AstNode::SelectData{name, id: TableId::Local(id), children: select_data_children.clone(), src_range}; + if transpose { + compiled.push(AstNode::TransposeSelect{children: vec![select]}); + } else { + compiled.push(select); + } + }, + AstNode::DotIndex{children} => { + let mut reversed = children.clone(); + if children.len() == 1 { + reversed.push(AstNode::Null); + reversed.reverse(); + } + select_data_children.push(AstNode::DotIndex{children: reversed}); + }, + AstNode::Swizzle{..} => { + select_data_children.push(node.clone()); + }, + AstNode::SubscriptIndex{..} => { + select_data_children.push(node.clone()); + } + AstNode::ReshapeColumn => { + select_data_children.push(AstNode::ReshapeColumn); + } + AstNode::Transpose => { + transpose = true; + } + _ => (), + } + } + }, + ParserNode::Statement{children, src_range} => compiled.push(AstNode::Statement{children: self.compile_nodes(children), src_range: *src_range}), + ParserNode::Expression{children} => { + let result = self.compile_nodes(children); + for node in result { + match node { + // If the node is a naked expression, modify the graph + // TODO this is hacky... maybe change the parser? + AstNode::SelectData{..} => { + compiled.push(node); + }, + _ => compiled.push(AstNode::Expression{children: vec![node]}), + } + } + }, + ParserNode::Attribute{children} => { + let result = self.compile_nodes(children); + let mut children: Vec = Vec::new(); + for node in result { + match node { + AstNode::Token{..} => (), + _ => children.push(node), + } + } + compiled.push(AstNode::Attribute{children}); + }, + ParserNode::Whenever{children} => compiled.push(AstNode::Whenever{children: self.compile_nodes(children)}), + ParserNode::Wait{children} => compiled.push(AstNode::Wait{children: self.compile_nodes(children)}), + ParserNode::Until{children} => compiled.push(AstNode::Until{children: self.compile_nodes(children)}), + ParserNode::SelectAll => compiled.push(AstNode::SelectAll), + ParserNode::SetData{children} => { + let result = self.compile_nodes(children); + let mut children: Vec = Vec::new(); + for node in result { + match node { + AstNode::Token{..} => (), + _ => children.push(node), + } + } + compiled.push(AstNode::SetData{children}); + }, + ParserNode::UpdateData{children} => { + let result = self.compile_nodes(children); + let operator = &result[0].clone(); + let dest = &result[2].clone(); + let src = &result[1].clone(); + let name: Vec = match operator { + AstNode::AddUpdate => "math/add-update".chars().collect(), + AstNode::SubtractUpdate => "math/subtract-update".chars().collect(), + AstNode::MultiplyUpdate => "math/multiply-update".chars().collect(), + AstNode::DivideUpdate => "math/divide-update".chars().collect(), + AstNode::ExponentUpdate => "math/exponent-update".chars().collect(), + _ => Vec::new(), + }; + compiled.push(AstNode::UpdateData{name, children: vec![src.clone(), dest.clone()], src_range: SourceRange::default()}); + }, + ParserNode::SplitData{children} => { + let result = self.compile_nodes(children); + let mut children: Vec = Vec::new(); + for node in result { + match node { + AstNode::Token{..} => (), + _ => children.push(node), + } + } + compiled.push(AstNode::SplitData{children}); + }, + ParserNode::FlattenData{children} => { + let result = self.compile_nodes(children); + let mut children: Vec = Vec::new(); + for node in result { + match node { + AstNode::Token{..} => (), + _ => children.push(node), + } + } + compiled.push(AstNode::FlattenData{children}); + }, + ParserNode::Column{children} => { + let result = self.compile_nodes(children); + let mut children: Vec = Vec::new(); + for node in result { + match node { + AstNode::Token{..} => (), + _ => children.push(node), + } + } + compiled.push(AstNode::TableColumn{children}); + }, + ParserNode::Empty => compiled.push(AstNode::Empty), + ParserNode::Binding{children} => { + let result = self.compile_nodes(children); + let mut children: Vec = Vec::new(); + for node in result { + match node { + AstNode::Token{..} => (), + _ => children.push(node), + } + } + compiled.push(AstNode::Binding{children}); + }, + ParserNode::FunctionBinding{children} => { + let result = self.compile_nodes(children); + let mut children: Vec = Vec::new(); + for node in result { + match node { + AstNode::Token{..} => (), + _ => children.push(node), + } + } + compiled.push(AstNode::FunctionBinding{children}); + }, + ParserNode::Transformation{children} => { + let result = self.compile_nodes(children); + let mut children: Vec = Vec::new(); + for node in result { + match node { + // Ignore irrelevant nodes like spaces and operators + AstNode::Token{..} => (), + _ => children.push(node), + } + } + if !children.is_empty() { + compiled.push(AstNode::Transformation{children}); + } + }, + ParserNode::SelectExpression{children} => compiled.push(AstNode::SelectExpression{children: self.compile_nodes(children)}), + ParserNode::InlineTable{children} => { + let result = self.compile_nodes(children); + let mut children: Vec = Vec::new(); + for node in result { + match node { + AstNode::Token{..} => (), + _ => children.push(node), + } + } + compiled.push(AstNode::InlineTable{children}); + }, + ParserNode::AnonymousTable{children} => { + let result = self.compile_nodes(children); + let mut children: Vec = Vec::new(); + for node in result { + match node { + AstNode::Token{..} => (), + _ => children.push(node), + } + } + compiled.push(AstNode::AnonymousTableDefine{children}); + }, + ParserNode::EmptyTable{children} => { + let result = self.compile_nodes(children); + let mut children: Vec = Vec::new(); + for node in result { + match node { + AstNode::Token{..} => (), + _ => children.push(node), + } + } + compiled.push(AstNode::EmptyTable{children}); + }, + ParserNode::TableHeader{children} => { + let result = self.compile_nodes(children); + let mut children: Vec = Vec::new(); + for node in result { + match node { + AstNode::Token{..} => (), + _ => children.push(node), + } + } + compiled.push(AstNode::TableHeader{children}); + }, + ParserNode::TableRow{children} => { + let result = self.compile_nodes(children); + let mut children: Vec = Vec::new(); + for node in result { + match node { + AstNode::Token{..} => (), + _ => children.push(node), + } + } + compiled.push(AstNode::TableRow{children}); + }, + ParserNode::MathExpression{children} => { + let result = self.compile_nodes(children); + let mut children: Vec = Vec::new(); + let mut new_node = false; + for node in result { + match node { + // Ignore irrelevant nodes like spaces and operators + AstNode::Token{..} => (), + AstNode::Function{..} => { + new_node = true; + children.push(node); + }, + /*AstNode::Quantity{..} => { + new_node = false; + children.push(node); + }*/ + _ => children.push(node), + } + } + // TODO I might be able to simplify this now. This doesn't seem to be necessary + if new_node { + compiled.push(AstNode::MathExpression{children}); + } else { + compiled.append(&mut children); + } + }, + ParserNode::Infix{children} => { + let result = self.compile_nodes(children); + let operator = &result[0]; + let (name, range): (Vec, SourceRange) = match operator { + AstNode::Token{token, chars, src_range} => (chars.to_vec(), *src_range), + _ => (Vec::new(), SourceRange::default()), + }; + compiled.push(AstNode::Function{name, children: vec![], src_range: range}); + }, + ParserNode::VariableDefine{children} => { + let result = self.compile_nodes(children); + let mut children: Vec = Vec::new(); + for node in result { + // If the node is a naked expression, modify the + // graph to put it into an anonymous table + match node { + AstNode::Token{..} => (), + AstNode::SelectData{..} => { + children.push(AstNode::Expression{ + children: vec![AstNode::AnonymousTableDefine{ + children: vec![AstNode::TableRow{ + children: vec![AstNode::TableColumn{ + children: vec![node]}]}]}]}); + }, + _ => children.push(node), + } + } + compiled.push(AstNode::VariableDefine{children}); + }, + ParserNode::TableDefine{children} => { + let result = self.compile_nodes(children); + let mut children: Vec = Vec::new(); + for node in result { + match node { + AstNode::Token{..} => (), + AstNode::SelectData{..} => { + children.push(AstNode::Expression{ + children: vec![AstNode::AnonymousTableDefine{ + children: vec![AstNode::TableRow{ + children: vec![AstNode::TableColumn{ + children: vec![node]}]}]}]}); + }, + _ => children.push(node), + } + } + compiled.push(AstNode::TableDefine{children}); + }, + ParserNode::FollowedBy{children} => { + let result = self.compile_nodes(children); + let mut children: Vec = Vec::new(); + for node in result { + match node { + AstNode::Token{..} => (), + AstNode::SelectData{..} => { + children.push(AstNode::Expression{ + children: vec![AstNode::AnonymousTableDefine{ + children: vec![AstNode::TableRow{ + children: vec![AstNode::TableColumn{ + children: vec![node]}]}]}]}); + }, + _ => children.push(node), + } + } + compiled.push(AstNode::FollowedBy{children}); + }, + ParserNode::TableSelect{children} => { + let result = self.compile_nodes(children); + let mut children: Vec = Vec::new(); + for node in result { + match node { + AstNode::Token{..} => (), + AstNode::SelectData{..} => { + children.push(AstNode::Expression{ + children: vec![AstNode::AnonymousTableDefine{ + children: vec![AstNode::TableRow{ + children: vec![AstNode::TableColumn{ + children: vec![node]}]}]}]}); + }, + _ => children.push(node), + } + } + compiled.push(AstNode::TableSelect{children}); + }, + ParserNode::AddRow{children} => { + let result = self.compile_nodes(children); + let mut children: Vec = Vec::new(); + for node in result { + match node { + AstNode::Token{..} => (), + _ => children.push(node), + } + } + compiled.push(AstNode::AddRow{children}); + }, + ParserNode::Index{children} => compiled.append(&mut self.compile_nodes(children)), + ParserNode::ReshapeColumn => compiled.push(AstNode::ReshapeColumn), + ParserNode::DotIndex{children} => compiled.push(AstNode::DotIndex{children: self.compile_nodes(children)}), + ParserNode::Swizzle{children} => compiled.push(AstNode::Swizzle{children: self.compile_nodes(children)}), + ParserNode::SubscriptIndex{children} => { + let result = self.compile_nodes(children); + let mut children: Vec = Vec::new(); + for node in result { + match node { + AstNode::Token{token, ..} => { + match token { + Token::Tilde => { + children.push(AstNode::WheneverIndex{children: vec![AstNode::Null]}); + } + _ => (), + } + }, + _ => children.push(node), + } + } + compiled.push(AstNode::SubscriptIndex{children}); + }, + ParserNode::Table{children} => { + let result = self.compile_nodes(children); + match &result[0] { + AstNode::Identifier{name, id, src_range} => { + compiled.push(AstNode::Table{name: name.to_vec(), id: *id, src_range: *src_range}); + }, + _ => (), + }; + }, + // Quantities + ParserNode::Quantity{children} => compiled.push(AstNode::Quantity{children: self.compile_nodes(children)}), + ParserNode::Number{children} => { + let mut word = Vec::new(); + let result = self.compile_nodes(children); + for node in result { + match node { + AstNode::Token{token, mut chars, ..} => word.append(&mut chars), + _ => (), + } + } + compiled.push(AstNode::String{text: word, src_range: self.last_src_range}); + }, + // String-like nodes + ParserNode::ParagraphText{children} => { + let mut result = self.compile_nodes(children); + let mut paragraph = Vec::new(); + for ref mut node in &mut result { + match node { + AstNode::String{ref mut text, ..} => paragraph.append(text), + _ => (), + }; + } + + let node = AstNode::ParagraphText{text: paragraph, src_range: self.last_src_range}; + compiled.push(node); + }, + ParserNode::InlineCode{children} => compiled.push(AstNode::InlineCode{children: self.compile_nodes(children)}), + ParserNode::CodeBlock{children} => compiled.push(AstNode::CodeBlock{children: self.compile_nodes(children)}), + ParserNode::MechCodeBlock{children} => compiled.push(AstNode::MechCodeBlock{children: self.compile_nodes(children)}), + ParserNode::Comment{children} => compiled.push(AstNode::Comment{children: self.compile_nodes(children)}), + ParserNode::InlineMechCode{children} => compiled.push(AstNode::InlineMechCode{children: self.compile_nodes(children)}), + ParserNode::Paragraph{children} => compiled.push(AstNode::Paragraph{children: self.compile_nodes(children)}), + ParserNode::UnorderedList{children} => compiled.push(AstNode::UnorderedList{children: self.compile_nodes(children)}), + ParserNode::ListItem{children} => compiled.push(AstNode::ListItem{children: self.compile_nodes(children)}), + ParserNode::Title{children} => { + let result = self.compile_nodes(children); + let node = match &result[0] { + AstNode::String{text, src_range} => AstNode::Title{text: text.clone(), src_range: *src_range, level: 0}, + _ => AstNode::Null, + }; + compiled.push(node); + }, + ParserNode::Subtitle{children, level} => { + let result = self.compile_nodes(children); + let node = match &result[0] { + AstNode::String{text, src_range} => AstNode::Title{text: text.clone(), src_range: *src_range, level: *level}, + _ => AstNode::Null, + }; + compiled.push(node); + }, + ParserNode::FormattedText{children} | + ParserNode::Text{children} => { + let result = self.compile_nodes(children); + let mut text_node = Vec::new(); + for node in result { + match node { + AstNode::String{mut text, ..} => { + text_node.append(&mut text) + }, + AstNode::Token{token, mut chars, ..} => { + text_node.append(&mut chars) + }, + _ => (), + } + } + compiled.push(AstNode::String{text: text_node, src_range: self.last_src_range}); + }, + ParserNode::Word{children} => { + let mut word = Vec::new(); + let result = self.compile_nodes(children); + for node in result { + match node { + AstNode::Token{token, mut chars, ..} => word.append(&mut chars), + _ => (), + } + } + compiled.push(AstNode::String{text: word, src_range: self.last_src_range}); + }, + ParserNode::TableIdentifier{children} | + ParserNode::Identifier{children} => { + let mut word = Vec::new(); + let result = self.compile_nodes(children); + for node in result { + match node { + AstNode::Token{token, mut chars, ..} => word.append(&mut chars), + AstNode::String{mut text, ..} => word.append(&mut text), + //AstNode::Quantity{value, unit} => word.push_str(&format!("{}", value.to_f32())), + _ => compiled.push(node), + } + } + let id = hash_chars(&word); + compiled.push(AstNode::Identifier{name: word, id, src_range: self.last_src_range}); + }, + // Math + ParserNode::L0{children} | + ParserNode::L1{children} | + ParserNode::L2{children} | + ParserNode::L3{children} | + ParserNode::L4{children} | + ParserNode::L5{children} | + ParserNode::L6{children} => { + let result = self.compile_nodes(children); + let mut last = AstNode::Null; + for node in result { + match last { + AstNode::Null => last = node, + _ => { + let (name, mut children, src_range) = match node { + AstNode::Function{name, children, src_range} => (name.clone(), children.clone(), src_range), + _ => (Vec::new(), vec![], SourceRange::default()), + }; + children.push(last); + children.reverse(); + last = AstNode::Function{name, children, src_range}; + }, + }; + } + compiled.push(last); + }, + ParserNode::L0Infix{children} | + ParserNode::L1Infix{children} | + ParserNode::L2Infix{children} | + ParserNode::L3Infix{children} | + ParserNode::L4Infix{children} | + ParserNode::L5Infix{children} => { + let result = self.compile_nodes(children); + let operator = &result[0].clone(); + let input = &result[1].clone(); + let name: Vec = match operator { + AstNode::Add => "math/add".chars().collect(), + AstNode::Subtract => "math/subtract".chars().collect(), + AstNode::Multiply => "math/multiply".chars().collect(), + AstNode::MatrixMultiply => "matrix/multiply".chars().collect(), + AstNode::Divide => "math/divide".chars().collect(), + AstNode::Exponent => "math/exponent".chars().collect(), + AstNode::GreaterThan => "compare/greater-than".chars().collect(), + AstNode::GreaterThanEqual => "compare/greater-than-equal".chars().collect(), + AstNode::LessThanEqual => "compare/less-than-equal".chars().collect(), + AstNode::LessThan => "compare/less-than".chars().collect(), + AstNode::Equal => "compare/equal".chars().collect(), + AstNode::NotEqual => "compare/not-equal".chars().collect(), + AstNode::Range => "table/range".chars().collect(), + AstNode::And => "logic/and".chars().collect(), + AstNode::Or => "logic/or".chars().collect(), + AstNode::Xor => "logic/xor".chars().collect(), + AstNode::Token{token, chars, ..} => chars.to_vec(), + _ => Vec::new(), + }; + compiled.push(AstNode::Function{name, children: vec![input.clone()], src_range: SourceRange::default()}); + }, + ParserNode::Not{children} => { + let result = self.compile_nodes(children); + compiled.push(AstNode::Function{name: "logic/not".chars().collect(), children: result, src_range: SourceRange::default()}); + }, + ParserNode::Negation{children} => { + let result = self.compile_nodes(children); + compiled.push(AstNode::Function{name: "math/negate".chars().collect(), children: result, src_range: SourceRange::default()}); + }, + ParserNode::UserFunction{children} => { + let result = self.compile_nodes(children); + compiled.push(AstNode::UserFunction{children: result.clone()}); + } + ParserNode::FunctionArgs{children} => { + let result = self.compile_nodes(children); + compiled.push(AstNode::FunctionArgs{children: result.clone()}); + } + ParserNode::FunctionInput{children} => { + let result = self.compile_nodes(children); + compiled.push(AstNode::FunctionInput{children: result.clone()}); + } + ParserNode::FunctionOutput{children} => { + let result = self.compile_nodes(children); + compiled.push(AstNode::FunctionOutput{children: result.clone()}); + } + ParserNode::FunctionBody{children} => { + let result = self.compile_nodes(children); + compiled.push(AstNode::FunctionBody{children: result.clone()}); + } + ParserNode::Function{children} => { + let result = self.compile_nodes(children); + let mut children: Vec = Vec::new(); + let mut function_name = Vec::new(); + let mut range = SourceRange::default(); + for node in result { + match node { + AstNode::Token{..} => (), + AstNode::Identifier{name, id, src_range} => { + function_name = name; + range = src_range; + }, + _ => children.push(node), + } + } + compiled.push(AstNode::Function{name: function_name, children: children.clone(), src_range: range}); + }, + /*ParserNode::Negation{children} => { + let result = self.compile_nodes(children); + let mut input = vec![AstNode::Quantity{value: 0, unit: None}]; + input.push(result[0].clone()); + compiled.push(AstNode::Function{ name: "math/subtract".chars().collect(), children: input }); + },*/ + /*ParserNode::Not{children} => { + let result = self.compile_nodes(children); + let mut input = vec![AstNode::Quantity{value: Value::from_bool(true), unit: None}]; + input.push(result[0].clone()); + compiled.push(AstNode::Function{ name: "logic/xor".chars().collect(), children: input }); + },*/ + ParserNode::String{children} => { + let result = self.compile_nodes(children); + let string = if result.len() > 0 { + result[0].clone() + } else { + AstNode::String{text: Vec::new(), src_range: SourceRange::default()} + }; + compiled.push(string); + }, + ParserNode::NumberLiteral{children} => { + let mut result = self.compile_nodes(children); + // There's a type annotation + if result.len() > 1 { + match (&result[0], &result[1]) { + (AstNode::NumberLiteral{kind,bytes,src_range}, AstNode::KindAnnotation{children}) => { + if let AstNode::Identifier{name, id, ..} = &children[0] { + result[0] = AstNode::NumberLiteral{kind: *id, bytes: bytes.clone(), src_range: *src_range}; + } + } + _ => (), + } + } + compiled.push(result[0].clone()); + }, + ParserNode::True => { + compiled.push(AstNode::True); + }, + ParserNode::Transpose => { + compiled.push(AstNode::Transpose); + }, + ParserNode::False => { + compiled.push(AstNode::False); + }, + ParserNode::RationalNumber{children} => { + let result = self.compile_nodes(children); + compiled.push(AstNode::RationalNumber{children: result}); + }, + ParserNode::KindAnnotation{children} => { + let result = self.compile_nodes(children); + compiled.push(AstNode::KindAnnotation{children: result}); + }, + ParserNode::FloatLiteral{chars, src_range} => { + /*let string = chars.iter().cloned().collect::(); + let float = string.parse::().unwrap(); + let bytes = float.to_be_bytes();*/ + self.last_src_range = *src_range; + compiled.push(AstNode::NumberLiteral{kind: hash_str("f32-literal"), bytes: chars.to_vec(), src_range: *src_range}); + } + ParserNode::DecimalLiteral{chars, src_range} => { + /*let mut dec_bytes = chars.iter().map(|c| c.to_digit(10).unwrap() as u8).collect::>(); + let mut dec_number: u128 = 0; + dec_bytes.reverse(); + for (i,byte) in dec_bytes.iter().enumerate() { + dec_number += *byte as u128 * 10_u128.pow(i as u32); + } + use std::mem::transmute; + let mut bytes: [u8; 16] = unsafe { transmute(dec_number.to_be()) }; + let mut bytes = bytes.to_vec(); + // Remove leading zeros + while bytes.len() > 1 && bytes[0] == 0 { + bytes.remove(0); + }*/ + self.last_src_range = *src_range; + compiled.push(AstNode::NumberLiteral{kind: *DEC, bytes: chars.to_vec(), src_range: *src_range}); + }, + ParserNode::BinaryLiteral{chars, src_range} => { + //let bin_bytes = chars.iter().map(|c| c.to_digit(2).unwrap() as u8).collect::>(); + self.last_src_range = *src_range; + compiled.push(AstNode::NumberLiteral{kind: *BIN, bytes: chars.to_vec(), src_range: *src_range}); + } + ParserNode::OctalLiteral{chars, src_range} => { + //let oct_bytes = chars.iter().map(|c| c.to_digit(8).unwrap() as u8).collect::>(); + self.last_src_range = *src_range; + compiled.push(AstNode::NumberLiteral{kind: *OCT, bytes: chars.to_vec(), src_range: *src_range}); + }, + ParserNode::HexadecimalLiteral{chars, src_range} => { + //let hex_bytes = chars.iter().map(|c| c.to_digit(16).unwrap() as u8).collect::>(); + self.last_src_range = *src_range; + compiled.push(AstNode::NumberLiteral{kind: *HEX, bytes: chars.to_vec(), src_range: *src_range}); + }, + ParserNode::True => compiled.push(AstNode::True), + ParserNode::False => compiled.push(AstNode::False), + ParserNode::ParentheticalExpression{children} => { + let result = self.compile_nodes(children); + compiled.push(result[0].clone()); + }, + ParserNode::GreaterThan => compiled.push(AstNode::GreaterThan), + ParserNode::LessThan => compiled.push(AstNode::LessThan), + ParserNode::GreaterThanEqual => compiled.push(AstNode::GreaterThanEqual), + ParserNode::LessThanEqual => compiled.push(AstNode::LessThanEqual), + ParserNode::Equal => compiled.push(AstNode::Equal), + ParserNode::NotEqual => compiled.push(AstNode::NotEqual), + ParserNode::Range => compiled.push(AstNode::Range), + ParserNode::Add => compiled.push(AstNode::Add), + ParserNode::Subtract => compiled.push(AstNode::Subtract), + ParserNode::Multiply => compiled.push(AstNode::Multiply), + ParserNode::MatrixMultiply => compiled.push(AstNode::MatrixMultiply), + ParserNode::Divide => compiled.push(AstNode::Divide), + ParserNode::Exponent => compiled.push(AstNode::Exponent), + ParserNode::And => compiled.push(AstNode::And), + ParserNode::Or => compiled.push(AstNode::Or), + ParserNode::Xor => compiled.push(AstNode::Xor), + ParserNode::AddUpdate => compiled.push(AstNode::AddUpdate), + ParserNode::SubtractUpdate => compiled.push(AstNode::SubtractUpdate), + ParserNode::MultiplyUpdate => compiled.push(AstNode::MultiplyUpdate), + ParserNode::DivideUpdate => compiled.push(AstNode::DivideUpdate), + ParserNode::ExponentUpdate => compiled.push(AstNode::ExponentUpdate), + ParserNode::Comparator{children} => { + match children[0] { + ParserNode::LessThan => compiled.push(AstNode::LessThan), + ParserNode::LessThanEqual => compiled.push(AstNode::LessThanEqual), + ParserNode::GreaterThanEqual => compiled.push(AstNode::GreaterThanEqual), + ParserNode::Equal => compiled.push(AstNode::Equal), + ParserNode::NotEqual => compiled.push(AstNode::NotEqual), + ParserNode::GreaterThan => compiled.push(AstNode::GreaterThan), + _ => (), + } + }, + ParserNode::LogicOperator{children} => { + match children[0] { + ParserNode::And => compiled.push(AstNode::And), + ParserNode::Or => compiled.push(AstNode::Or), + ParserNode::Xor => compiled.push(AstNode::Xor), + _ => (), + } + }, + // Pass through nodes. These will just be omitted + ParserNode::Value{children} | + ParserNode::Emoji{children} | + ParserNode::Constant{children} | + ParserNode::StateMachine{children} | + ParserNode::StateTransition{children} | + ParserNode::Body{children} | + ParserNode::Punctuation{children} | + ParserNode::DigitOrComma{children} | + ParserNode::Any{children} | + ParserNode::Symbol{children} | + ParserNode::AddOperator{children} | + ParserNode::Subscript{children} | + ParserNode::DataOrConstant{children} | + ParserNode::SpaceOrTab{children} | + ParserNode::Whitespace{children} | + ParserNode::NewLine{children} | + ParserNode::IdentifierOrConstant{children} | + ParserNode::ProseOrCode{children}| + ParserNode::StatementOrExpression{children} | + ParserNode::WatchOperator{children} | + ParserNode::SetOperator{children} | + ParserNode::Repeat{children} | + ParserNode::Alphanumeric{children} | + ParserNode::BooleanLiteral{children} | + ParserNode::IdentifierCharacter{children} => { + compiled.append(&mut self.compile_nodes(children)); + }, + ParserNode::Token{token, chars, src_range} => { + self.last_src_range = *src_range; + compiled.push(AstNode::Token{token: *token, chars: chars.to_vec(), src_range: *src_range}); + }, + ParserNode::Null => (), + _ => println!("Unhandled Parser AstNode in AST Compiler: {:?}", node), + } + + //self.constraints = constraints.clone(); + compiled + } + +} diff --git a/src/syntax/src/bin/main.rs b/src/syntax/src/bin/main.rs new file mode 100644 index 0000000..25a3b31 --- /dev/null +++ b/src/syntax/src/bin/main.rs @@ -0,0 +1,133 @@ +use mech_syntax::parser; +use mech_syntax::ast::Ast; +use mech_syntax::compiler::Compiler; +use mech_core::*; + +use std::rc::Rc; + +use std::fs; +fn main() -> Result<(),MechError> { + // ---------------------------------------------------------------- + let s = fs::read_to_string("test.mec").unwrap(); + match parser::parse(&s) { + Ok(tree) => { + println!("----------- SYNTAX TREE ---------"); + println!("{:#?}", tree); + let mut ast = Ast::new(); + ast.build_syntax_tree(&tree); + println!("----------- AST ---------"); + println!("{:#?}", ast.syntax_tree); + let mut compiler = Compiler::new(); + let sections = compiler.compile_sections(&vec![ast.syntax_tree.clone()]).unwrap(); + let mut core = Core::new(); + core.load_sections(sections); // + let changes = vec![ //active-tab-ix + Change::Set((hash_str("active-tab-ix"), vec![(TableIndex::Index(1), TableIndex::Index(1), Value::U64(U64::new(2)))])) + ]; + core.process_transaction(&changes)?; + println!("{:#?}", core.blocks); + println!("{:?}", core); + }, + Err(err) => if let MechErrorKind::ParserError(node, report, _) = err.kind { + println!("----- TREE -----"); + println!("{:?}", node); + println!("----- MESSAGE -----"); + parser::print_err_report(&s, &report); + } else { + panic!("Unexpected error type"); + }, + } + return Ok(()); + // ---------------------------------------------------------------- + +let input = r#" +[a] = foo(x) + y = 3 + z = x * 2 + a = z + y * 3 +y = foo(x: 10) +#test = y"#; + let input = String::from(input); + + let mut ast = Ast::new(); + let mut compiler = Compiler::new(); + let mut core = Core::new(); + let parse_tree = parser::parse(&input)?; + println!("{:#?}", parse_tree); + + ast.build_syntax_tree(&parse_tree); + + println!("{:?}", ast.syntax_tree); + + let sections = compiler.compile_sections(&vec![ast.syntax_tree.clone()]).unwrap(); + //println!("{:?}",sections); + core.load_sections(sections); + println!("{:#?}", core.blocks); + println!("{:?}", core); + +/* + let mut code = r#" +Next + #mech/tables = [|name| + "other-a" + "other-b" + "other-c"] +block + #q = 123 +"#; + + let mut compiler = Compiler::new(); + let blocks = compiler.compile_str(&code).unwrap(); + core.load_blocks(blocks); + + core.schedule_blocks()?; + //println!("Done"); + + let ticks = 30; + // println!("{:#?}", core.get_table("balls").unwrap().borrow()); + + let changes = vec![ + Change::Set((hash_str("button"), vec![(TableIndex::Index(1), TableIndex::Index(1), Value::Bool(true))])) + ]; + + //core.process_transaction(&changes)?; + + let changes = vec![ + Change::Set((hash_str("y"), vec![(TableIndex::Index(1), TableIndex::Index(1), Value::Bool(true))])) + ]; + + let changes = vec![ + Change::Set((hash_str("x"), vec![(TableIndex::Index(1), TableIndex::Index(1), Value::Bool(true))])) + ];*/ + + + //core.process_transaction(&changes)?; + + + + /*for i in 1..=ticks { + let txn = vec![ + Change::Set((hash_str("time/timer"), vec![(TableIndex::Index(1), TableIndex::Index(2), Value::U64(U64::new(i as u64)))])), + ]; + core.process_transaction(&txn)?; + println!("{:#?}", core.get_table("balls").unwrap().borrow()); + }*/ + //let txn: Vec = vec![ + //Change::Set((hash_str("time/timer"), vec![(TableIndex::Index(1), TableIndex::Alias(hash_str("ticks")), Value::U64(U64::new(1)))])), + //Change::Set((hash_str("time/timer"), vec![(TableIndex::Index(1), TableIndex::Alias(hash_str("ticks")), Value::U64(U64::new(2)))])), + //]; + //println!("Processing Txn..."); + //core.process_transaction(&txn); + //println!("Done Txn."); + //println!("{:#?}", core.blocks); + + //println!("Core:"); + //println!("{:#?}", core); + + + /*if let Ok(table) = core.get_table("container") { + println!("Answer:"); + println!("{:#?}", table.borrow()); + }*/ + Ok(()) +} diff --git a/src/syntax/src/compiler.rs b/src/syntax/src/compiler.rs new file mode 100644 index 0000000..54ebd31 --- /dev/null +++ b/src/syntax/src/compiler.rs @@ -0,0 +1,1241 @@ +// # Mech Syntax Compiler + +// ## Preamble + +use mech_core::*; +use mech_core::nodes::*; +use mech_core::function::table::*; +use mech_core::function::matrix::*; + +use crate::ast::Ast; +use crate::parser::{parse, parse_fragment}; +//use super::formatter::Formatter; + +#[cfg(not(feature = "no-std"))] use core::fmt; +#[cfg(feature = "no-std")] use alloc::fmt; +#[cfg(feature = "no-std")] use alloc::string::String; +#[cfg(feature = "no-std")] use alloc::vec::Vec; +use hashbrown::hash_set::{HashSet}; +use hashbrown::hash_map::{HashMap}; +use std::sync::Arc; +use std::mem; + +fn get_sections(nodes: &Vec) -> Vec> { + let mut sections: Vec> = Vec::new(); + let mut statements = Vec::new(); + let mut blocks = vec![]; + for n in nodes { + match n { + AstNode::Section{children,..} => { + let mut bblocks = vec![]; + for child in children { + match child { + AstNode::Section{children, ..} => { + sections.append(&mut get_sections(children)); + } + AstNode::Block{children, ..} => { + bblocks.push(child.clone()); + } + AstNode::UserFunction{children} => { + bblocks.push(child.clone()); + } + AstNode::Statement{children, ..} => { + statements.append(&mut children.clone()); + } + _ => (), + } + } + sections.push(bblocks.clone()); + }, + AstNode::Block{children, ..} => { + blocks.push(n.clone()); + } + AstNode::Statement{children, ..} => { + statements.append(&mut children.clone()); + } + AstNode::Root{children} | + AstNode::Body{children} | + AstNode::Program{children,..} | + AstNode::Fragment{children} => { + sections.append(&mut get_sections(children)); + } + _ => (), + } + } + sections.push(blocks); + if statements.len() > 0 { + sections.push(vec![AstNode::Block{children: statements, src_range: SourceRange::default()}]); + } + sections +} + +fn get_blocks(nodes: &Vec) -> Vec { + let mut blocks = Vec::new(); + let mut statements = Vec::new(); + for n in nodes { + match n { + AstNode::Block{..} => blocks.push(n.clone()), + AstNode::MechCodeBlock{children} => { + // Do something with the block state string. + // ```mech: disabled + match &children[0] { + AstNode::String{text, ..} => { + let block_state = text.iter().collect::(); + if block_state != "disabled".to_string() { + blocks.append(&mut get_blocks(children)); + } + } + _ => (), + } + } + _ => (), + } + } + if statements.len() > 0 { + blocks.push(AstNode::Block{children: statements, src_range: SourceRange::default()}); + } + blocks +} + +pub struct Compiler { + +} + +impl Compiler { + + pub fn new() -> Compiler { + Compiler{} + } + + pub fn compile_str(&mut self, code: &str) -> Result>,MechError> { + let parse_tree = parse(code)?; + let mut ast = Ast::new(); + ast.build_syntax_tree(&parse_tree); + let mut compiler = Compiler::new(); + compiler.compile_sections(&vec![ast.syntax_tree.clone()]) + } + + pub fn compile_fragment(&mut self, code: &str) -> Result>,MechError> { + let parse_tree = parse_fragment(code)?; + let mut ast = Ast::new(); + ast.build_syntax_tree(&parse_tree); + let mut compiler = Compiler::new(); + compiler.compile_sections(&vec![ast.syntax_tree.clone()]) + } + + pub fn compile_fragment_from_parse_tree(&mut self, parse_tree: ParserNode) -> Result>,MechError> { + let mut ast = Ast::new(); + ast.build_syntax_tree(&parse_tree); + let mut compiler = Compiler::new(); + compiler.compile_sections(&vec![ast.syntax_tree.clone()]) + } + + pub fn compile_sections(&mut self, nodes: &Vec) -> Result>,MechError> { + let mut sections: Vec> = Vec::new(); + for section in get_sections(nodes) { + let mut elements: Vec = Vec::new(); + for node in section { + match node { + AstNode::Block{..} => { + let mut block = Block::new(); + let mut tfms = self.compile_node(&node)?; + let tfms_before = tfms.clone(); + tfms.sort(); + tfms.dedup(); + for tfm in tfms { + block.add_tfm(tfm); + } + block.ast = node.clone(); + elements.push(SectionElement::Block(block)); + } + AstNode::UserFunction{children} => { + let mut user_function = UserFunction::new(); + + + let mut out_args = self.compile_node(&children[0])?; + let mut name = self.compile_node(&children[1])?; + let mut in_args = self.compile_node(&children[2])?; + let mut body = self.compile_node(&children[3])?; + + // TODO Check that all arguments are used + // TODO Check that output arguments are created in body + // TODO Check that all variables used in body are sourced in body or inargs + + match &name[0] { + Transformation::Identifier{name,id} => { + user_function.name = *id; + } + _ => (), + } + + let mut i = 0; + while i < out_args.len() { + match (&out_args[i],&out_args[i+1]) { + (Transformation::Identifier{name,id},Transformation::ColumnKind{table_id,column_ix,kind}) => { + user_function.outputs.insert(*id,ValueKind::F32); + } + _ => (), + } + i += 3; + } + + let mut i = 0; + while i < in_args.len() { + match (&in_args[i],&in_args[i+1]) { + (Transformation::Identifier{name,id},Transformation::ColumnKind{table_id,column_ix,kind}) => { + user_function.inputs.insert(*id,ValueKind::F32); + } + _ => (), + } + i += 3; + } + + user_function.transformations = body; + elements.push(SectionElement::UserFunction(user_function)); + } + _ => (), + } + } + sections.push(elements); + } + if sections.len() > 0 { + Ok(sections) + } else { + Err(MechError{msg: "".to_string(), id: 3749, kind: MechErrorKind::None}) + } + } + + pub fn compile_nodes(&mut self, nodes: &Vec) -> Result,MechError> { + let mut compiled = Vec::new(); + for node in nodes { + let mut result = self.compile_node(node)?; + compiled.append(&mut result); + } + Ok(compiled) + } + + pub fn compile_node(&mut self, node: &AstNode) -> Result,MechError> { + let mut tfms = vec![]; + match node { + AstNode::Identifier{name, id, ..} => { + tfms.push(Transformation::Identifier{name: name.to_vec(), id: *id}); + }, + AstNode::Empty => { + let table_id = TableId::Local(hash_str("_")); + tfms.push(Transformation::NewTable{table_id: table_id.clone(), rows: 1, columns: 1 }); + tfms.push(Transformation::Constant{table_id: table_id, value: Value::Empty}); + }, + AstNode::True => { + let table_id = TableId::Local(hash_str("true")); + tfms.push(Transformation::NewTable{table_id: table_id.clone(), rows: 1, columns: 1 }); + tfms.push(Transformation::Constant{table_id: table_id, value: Value::Bool(true)}); + }, + AstNode::False => { + let table_id = TableId::Local(hash_str("false")); + tfms.push(Transformation::NewTable{table_id: table_id.clone(), rows: 1, columns: 1 }); + tfms.push(Transformation::Constant{table_id: table_id, value: Value::Bool(false)}); + }, + AstNode::String{text, ..} => { + let table_id = TableId::Local(hash_str(&format!("string: {:?}", text))); + tfms.push(Transformation::NewTable{table_id: table_id.clone(), rows: 1, columns: 1 }); + tfms.push(Transformation::Constant{table_id: table_id, value: Value::String(MechString::from_chars(text))}); + }, + AstNode::NumberLiteral{kind, bytes, ..} => { + let string = bytes.iter().cloned().collect::(); + let bytes = if *kind == *cU8 { string.parse::().unwrap().to_be_bytes().to_vec() } + else if *kind == *cU16 { string.parse::().unwrap().to_be_bytes().to_vec() } + else if *kind == *cU32 { string.parse::().unwrap().to_be_bytes().to_vec() } + else if *kind == *cU64 { string.parse::().unwrap().to_be_bytes().to_vec() } + else if *kind == *cU128 { string.parse::().unwrap().to_be_bytes().to_vec() } + else if *kind == *cI8 { string.parse::().unwrap().to_be_bytes().to_vec() } + else if *kind == *cI16 { string.parse::().unwrap().to_be_bytes().to_vec() } + else if *kind == *cI32 { string.parse::().unwrap().to_be_bytes().to_vec() } + else if *kind == *cI64 { string.parse::().unwrap().to_be_bytes().to_vec() } + else if *kind == *cI128 { string.parse::().unwrap().to_be_bytes().to_vec() } + else if *kind == *cF32 { string.parse::().unwrap().to_be_bytes().to_vec() } + else if *kind == *cF64 { string.parse::().unwrap().to_be_bytes().to_vec() } + else if *kind == *cHEX { + bytes.iter().map(|c| c.to_digit(16).unwrap() as u8).collect::>() + } + else { string.parse::().unwrap().to_be_bytes().to_vec() }; + let table_id = TableId::Local(hash_str(&format!("{:?}{:?}", kind, bytes))); + tfms.push(Transformation::NewTable{table_id: table_id, rows: 1, columns: 1 }); + tfms.push(Transformation::NumberLiteral{kind: *kind, bytes: bytes.to_vec()}); + }, + AstNode::Table{name, id, ..} => { + tfms.push(Transformation::NewTable{table_id: TableId::Global(*id), rows: 1, columns: 1}); + tfms.push(Transformation::Identifier{name: name.clone(), id: *id}); + } + // dest := src + // dest{ix} := src + AstNode::SetData{children} => { + let mut src = self.compile_node(&children[1])?; + let mut dest = self.compile_node(&children[0])?.clone(); + + let (src_table_id, src_indices) = match &mut src[0] { + Transformation::NewTable{table_id,..} => { + Some((table_id.clone(),vec![(TableIndex::All, TableIndex::All)])) + }, + Transformation::Select{table_id,ref indices} => { + let table_id = table_id.clone(); + let indices = indices.clone(); + src.remove(0); + Some((table_id,indices)) + }, + Transformation::TableReference{table_id, reference: Value::Reference(id)} => { + let table_id = id.clone(); + src.remove(0); + src.remove(0); + src.remove(0); + Some((table_id.clone(),vec![(TableIndex::All, TableIndex::All)])) + }, + _ => None, + }.unwrap(); + let mut first = dest[0].clone(); + match first { + Transformation::Select{table_id, indices} => { + let dest_id = table_id.clone(); + let (dest_row, dest_col) = &indices[0]; + dest.remove(0); + let (src_row,src_col) = &src_indices[0]; + tfms.push(Transformation::Set{ + src_id: src_table_id, + src_row: src_row.clone(), + src_col: src_col.clone(), + dest_id, + dest_row: dest_row.clone(), + dest_col: dest_col.clone() + }); + } + _ => (), + } + + tfms.append(&mut dest); + tfms.append(&mut src); + } + // dest :+= src + // dest{ix} :+= src + AstNode::UpdateData{name, children, ..} => { + let mut src = self.compile_node(&children[1])?; + let mut dest = self.compile_node(&children[0])?.clone(); + + let (src_table_id, src_indices) = match &mut src[0] { + Transformation::NewTable{table_id,..} => { + Some((table_id.clone(),vec![(TableIndex::All, TableIndex::All)])) + }, + Transformation::Select{table_id,ref indices} => { + let table_id = table_id.clone(); + let indices = indices.clone(); + src.remove(0); + Some((table_id,indices)) + }, + Transformation::TableReference{table_id, reference: Value::Reference(id)} => { + let table_id = id.clone(); + src.remove(0); + src.remove(0); + src.remove(0); + Some((table_id.clone(),vec![(TableIndex::All, TableIndex::All)])) + }, + _ => None, + }.unwrap(); + let mut first = dest[0].clone(); + match first { + Transformation::Select{table_id, indices} => { + let dest_id = table_id.clone(); + let (dest_row, dest_col) = &indices[0]; + dest.remove(0); + let (src_row,src_col) = &src_indices[0]; + let name_hash = hash_chars(name); + tfms.push(Transformation::UpdateData{ + name: name_hash, + src_id: src_table_id, + src_row: src_row.clone(), + src_col: src_col.clone(), + dest_id, + dest_row: dest_row.clone(), + dest_col: dest_col.clone() + }); + } + _ => (), + } + tfms.append(&mut dest); + tfms.append(&mut src); + } + AstNode::TableDefine{children} => { + let mut output = self.compile_node(&children[0])?; + // Get the output table id + let output_table_id = match &output[0] { + Transformation::NewTable{table_id, ..} => { + Some(table_id.clone()) + }, + _ => None, + }.unwrap(); + + tfms.append(&mut output); + let mut input = self.compile_node(&children[1])?; + let mut rhs = vec![]; + if input.len() > 0 { + loop { + match &mut input[0] { + Transformation::NewTable{table_id,..} => { + rhs.push((table_id.clone(),vec![(TableIndex::All, TableIndex::All)])); + break; + }, + Transformation::Select{table_id,ref indices} => { + let table_id = table_id.clone(); + let indices = indices.clone(); + input.remove(0); + rhs.push((table_id,indices)); + break; + }, + Transformation::TableReference{table_id, reference: Value::Reference(id)} => { + input.remove(0); + input.remove(0); + if let Transformation::Select{table_id,indices} = input.remove(0) { + rhs.push((table_id,indices)); + } + continue; + }, + _ => break, + } + } + let (input_table_id, input_indices) = &rhs[0]; + if *input_table_id != output_table_id { + tfms.push(Transformation::NewTable{table_id: output_table_id, rows: 1, columns: 1}); + tfms.append(&mut input); + tfms.push(Transformation::TableDefine{ + table_id: input_table_id.clone(), + indices: input_indices.clone(), + out: output_table_id + }); + } else { + tfms.append(&mut input); + } + } + } + AstNode::TableSelect{children} => { + let output_table_id = TableId::Local(hash_str(&format!("{:?}", children))); + + let mut input = self.compile_node(&children[0])?; + let mut rhs = vec![]; + if input.len() > 0 { + loop { + match &mut input[0] { + Transformation::NewTable{table_id,..} => { + rhs.push((table_id.clone(),vec![(TableIndex::All, TableIndex::All)])); + break; + }, + Transformation::Select{table_id,ref indices} => { + let table_id = table_id.clone(); + let indices = indices.clone(); + input.remove(0); + rhs.push((table_id,indices)); + break; + }, + Transformation::TableReference{table_id, reference: Value::Reference(id)} => { + input.remove(0); + input.remove(0); + if let Transformation::Select{table_id,indices} = input.remove(0) { + rhs.push((table_id,indices)); + } + continue; + }, + _ => break, + } + } + let (input_table_id, input_indices) = &rhs[0]; + + match input_indices[0] { + (TableIndex::All,TableIndex::All) => { + tfms.push(Transformation::TableAlias{table_id: *input_table_id, alias: *output_table_id.unwrap()}); + tfms.append(&mut input); + } + _ => { + if *input_table_id != output_table_id { + tfms.push(Transformation::NewTable{table_id: output_table_id, rows: 1, columns: 1}); + tfms.append(&mut input); + tfms.push(Transformation::TableDefine{ + table_id: input_table_id.clone(), + indices: input_indices.clone(), + out: output_table_id + }); + } + } + } + } + } + AstNode::VariableDefine{children} => { + let mut output = self.compile_node(&children[0])?; + // Get the output table id + let output_table_id = match &output[0] { + Transformation::Identifier{name, id} => { + let name_hash = hash_chars(name); + Some(TableId::Local(name_hash)) + }, + _ => None, + }.unwrap(); + + tfms.append(&mut output); + let mut input = self.compile_node(&children[1])?; + let mut rhs = vec![]; + if input.len() > 0 { + loop { + match &mut input[0] { + Transformation::NewTable{table_id,..} => { + rhs.push((table_id.clone(),vec![(TableIndex::All, TableIndex::All)])); + break; + }, + Transformation::Select{table_id,ref indices} => { + let table_id = table_id.clone(); + let indices = indices.clone(); + input.remove(0); + rhs.push((table_id,indices)); + break; + }, + Transformation::TableReference{table_id, reference: Value::Reference(id)} => { + input.remove(0); + input.remove(0); + if let Transformation::Select{table_id,indices} = input.remove(0) { + rhs.push((table_id,indices)); + } + continue; + }, + _ => break, + } + } + let (input_table_id, input_indices) = &rhs[0]; + match input_indices[0] { + (TableIndex::All,TableIndex::All) => { + tfms.push(Transformation::TableAlias{table_id: *input_table_id, alias: *output_table_id.unwrap()}); + tfms.append(&mut input); + } + _ => { + if *input_table_id != output_table_id { + tfms.push(Transformation::NewTable{table_id: output_table_id, rows: 1, columns: 1}); + tfms.append(&mut input); + /*tfms.push(Transformation::Function{ + name: *TABLE_DEFINE, + arguments: vec![(0,input_table_id.clone(),input_indices.clone())], + out: (output_table_id, TableIndex::All, TableIndex::All), + });*/ + tfms.push(Transformation::TableDefine{ + table_id: input_table_id.clone(), + indices: input_indices.clone(), + out: output_table_id + }); + } + } + } + } + } + AstNode::UserFunction{children} => { + let output_args = &children[0]; + let function_name = &children[1]; + let input_args = &children[2]; + if let AstNode::FunctionBody{children} = &children[3] { + let mut result = self.compile_nodes(children)?; + tfms.append(&mut result); + }; + } + AstNode::Function{name, children, ..} => { + let mut args: Vec = vec![]; + let mut arg_tfms = vec![]; + let mut identifiers = vec![]; + for child in children { + // get the argument identifier off the function binding. Default to 0 if there is no named arg + let mut result = self.compile_node(&child)?; + let arg: u64 = match &result[0] { + Transformation::Identifier{name, id} => { + let arg_id = id.clone(); + result.remove(0); + arg_id + }, + _ => 0, + }; + match &result[0] { + Transformation::NewTable{table_id,..} => { + args.push((arg, *table_id, vec![(TableIndex::All, TableIndex::All)])); + }, + Transformation::Select{table_id, indices} => { + args.push((arg, *table_id, indices.to_vec())); + result.remove(0); + } + Transformation::TableReference{table_id, reference: Value::Reference(id)} => { + let table_id = id.clone(); + result.remove(0); + result.remove(0); + result.remove(0); + args.push((arg, table_id, vec![(TableIndex::All, TableIndex::All)])); + }, + _ => (), + } + let mut string_identifiers = result.drain_filter(|x| if let Transformation::Identifier{..} = x {true} else {false}).collect::>(); + identifiers.append(&mut string_identifiers); + arg_tfms.append(&mut result); + } + let name_hash = hash_chars(name); + identifiers.push(Transformation::Identifier{name: name.clone(), id: name_hash}); + let id = hash_str(&format!("{:?}{:?}", name, args)); + tfms.push(Transformation::NewTable{table_id: TableId::Local(id), rows: 1, columns: 1}); + tfms.append(&mut arg_tfms); + tfms.push(Transformation::Function{ + name: name_hash, + arguments: args, + out: (TableId::Local(id), TableIndex::All, TableIndex::All), + }); + tfms.append(&mut identifiers); + }, + AstNode::InlineTable{children} => { + let columns = children.len(); + let mut table_row_children = vec![]; + let mut aliases = vec![]; + let mut kinds = vec![]; + let mut identifiers = vec![]; + // Compile bindings + for (ix, binding) in children.iter().enumerate() { + match binding { + AstNode::Binding{children} => { + let mut identifier = self.compile_node(&children[0])?; + match &identifier[0] { + Transformation::Identifier{name,id} => { + let column_alias = id.clone(); + let column_ix = ix.clone(); + let alias_tfm = move |x| Transformation::ColumnAlias{table_id: x, column_ix, column_alias}; + identifiers.push(identifier[0].clone()); + aliases.push(alias_tfm); + } + _ => (), + } + table_row_children.push(children[1].clone()); + if children.len() == 3 { + let mut kind = self.compile_node(&children[2])?; + match &kind[0] { + Transformation::ColumnKind{table_id,column_ix,kind} => { + let column_ix = ix.clone(); + let kind = kind.clone(); + let kind_tfm = move |x| Transformation::ColumnKind{table_id: x, column_ix, kind}; + kinds.push(kind_tfm); + } + _ => (), + } + } + } + _ => (), + } + } + let table_row = AstNode::TableRow{children: table_row_children}; + let mut compiled_row_tfms = self.compile_node(&table_row)?; + let mut a_tfms = vec![]; + loop { + match &compiled_row_tfms[0] { + Transformation::NewTable{table_id,..} => { + let mut alias_tfms = aliases.iter().map(|a| a(*table_id)).collect(); + let mut kind_tfms = kinds.iter().map(|a| a(*table_id)).collect(); + a_tfms.append(&mut alias_tfms); + a_tfms.append(&mut kind_tfms); + break; + } + Transformation::TableReference{..} => { + compiled_row_tfms.remove(0); + compiled_row_tfms.remove(0); + compiled_row_tfms.remove(0); + }, + _ => break, + } + } + tfms.append(&mut compiled_row_tfms); + tfms.append(&mut a_tfms); + match &tfms[0] { + Transformation::NewTable{table_id,..} | + Transformation::Select{table_id, ..} => { + let reference_table_id = TableId::Local(hash_str(&format!("reference:{:?}", tfms[0]))); + let value = Value::Reference(table_id.clone()); + let out = TableId::Global(*table_id.unwrap()); + let in_t = table_id.clone(); + tfms.insert(0,Transformation::NewTable{table_id: reference_table_id, rows: 1, columns: 1}); + /*tfms.insert(0,Transformation::Function{ + name: *TABLE_DEFINE, + arguments: vec![(0,in_t,vec![(TableIndex::All, TableIndex::All)])], + out: (out,TableIndex::All, TableIndex::All), + });*/ + tfms.insert(0,Transformation::TableDefine{table_id: in_t, indices: vec![(TableIndex::All, TableIndex::All)], out}); + tfms.insert(0,Transformation::TableReference{table_id: reference_table_id, reference: value}); + } + _ => (), + } + tfms.append(&mut identifiers); + } + AstNode::EmptyTable{children} => { + let anon_table_id = hash_str(&format!("anonymous-table: {:?}",children)); + let mut table_children = children.clone(); + let mut column_aliases = Vec::new(); + let mut header_tfms = Vec::new(); + let mut columns = 1; + match table_children.first() { + Some(AstNode::TableHeader{children}) => { + let mut ix = 0; + for child in children { + let mut result = self.compile_node(child)?; + columns = result.len(); + // Get the column ID + match &result[0] { + Transformation::Identifier{name,id} => { + let alias_tfm = Transformation::ColumnAlias{table_id: TableId::Local(anon_table_id), column_ix: ix, column_alias: id.clone()}; + column_aliases.push(alias_tfm); + column_aliases.push(result[0].clone()); + ix+=1; + result.remove(0); + } + _ => (), + } + // Process the optional kind annotation + if result.len() > 0 { + match &result[0] { + Transformation::ColumnKind{table_id,column_ix,kind} => { + let kind_tfm = Transformation::ColumnKind{table_id: TableId::Local(anon_table_id), column_ix: ix - 1, kind: *kind}; + result.remove(0); + column_aliases.append(&mut result); + column_aliases.push(kind_tfm); + } + _ => (), + } + } + } + header_tfms.append(&mut column_aliases); + table_children.remove(0); + } + _ => (), + }; + header_tfms.insert(0,Transformation::NewTable{table_id: TableId::Local(anon_table_id), rows: 1, columns: 1}); + tfms.append(&mut header_tfms); + } + AstNode::KindAnnotation{children} => { + let mut result = self.compile_nodes(&children)?; + for (ix,tfm) in result.iter().enumerate() { + match tfm { + Transformation::Identifier{name,id} => { + let alias_tfm = Transformation::ColumnKind{table_id: TableId::Local(0), column_ix: ix.clone(), kind: id.clone()}; + tfms.push(alias_tfm); + tfms.push(tfm.clone()); + } + _ => (), + } + } + } + AstNode::Token{token, chars, ..} => { + tfms.push(Transformation::Identifier{name: chars.to_vec(), id: hash_chars(chars)}); + } + AstNode::AnonymousTableDefine{children} => { + let anon_table_id = hash_str(&format!("anonymous-table: {:?}",children)); + let mut table_children = children.clone(); + let mut header_tfms = Vec::new(); + let mut column_aliases = Vec::new(); + let mut body_tfms = Vec::new(); + let mut columns = 0; + match table_children.first() { + Some(AstNode::TableHeader{children}) => { + let mut ix = 0; + for child in children { + let mut result = self.compile_node(child)?; + columns = result.len(); + // Get the column ID + match &result[0] { + Transformation::Identifier{name,id} => { + let alias_tfm = Transformation::ColumnAlias{table_id: TableId::Local(anon_table_id), column_ix: ix, column_alias: id.clone()}; + column_aliases.push(alias_tfm); + column_aliases.push(result[0].clone()); + ix+=1; + result.remove(0); + } + _ => (), + } + // Process the optional kind annotation + if result.len() > 0 { + match &result[0] { + Transformation::ColumnKind{table_id,column_ix,kind} => { + let kind_tfm = Transformation::ColumnKind{table_id: TableId::Local(anon_table_id), column_ix: ix - 1, kind: *kind}; + result.remove(0); + column_aliases.append(&mut result); + column_aliases.push(kind_tfm); + } + _ => (), + } + } + } + header_tfms.append(&mut column_aliases); + table_children.remove(0); + } + _ => (), + }; + if header_tfms.len() > 1 || table_children.len() > 1 { + let mut args: Vec = vec![]; + let mut result_tfms = vec![]; + for child in table_children { + let mut result = self.compile_node(&child)?; + match &result[0] { + Transformation::NewTable{table_id,..} => { + args.push((0,table_id.clone(),vec![(TableIndex::All, TableIndex::All)])); + } + Transformation::Select{table_id, indices} => { + args.push((0,table_id.clone(),indices.to_vec())); + result.remove(0); + } + _ => (), + } + result_tfms.append(&mut result); + } + header_tfms.insert(0,Transformation::NewTable{table_id: TableId::Local(anon_table_id), rows: 1, columns: 1}); + body_tfms.append(&mut result_tfms); + body_tfms.push(Transformation::Function{ + name: *TABLE_VERTICAL__CONCATENATE, + arguments: args, + out: (TableId::Local(anon_table_id), TableIndex::All, TableIndex::All), + }); + tfms.append(&mut header_tfms); + tfms.append(&mut body_tfms); + } else { + let mut result = self.compile_nodes(&table_children)?; + tfms.append(&mut result); + } + match &tfms[0] { + Transformation::NewTable{table_id,..} | + Transformation::Select{table_id, ..} => { + let reference_table_id = TableId::Local(hash_str(&format!("reference:{:?}", tfms[0]))); + let value = Value::Reference(table_id.clone()); + let out = TableId::Global(*table_id.unwrap()); + let in_t = table_id.clone(); + if in_t != out { + tfms.insert(0,Transformation::NewTable{table_id: reference_table_id, rows: 1, columns: 1}); + /*tfms.insert(0,Transformation::Function{ + name: *TABLE_DEFINE, + arguments: vec![(0,in_t,vec![(TableIndex::All, TableIndex::All)])], + out: (out,TableIndex::All, TableIndex::All), + });*/ + tfms.insert(0,Transformation::TableDefine{table_id: in_t, indices: vec![(TableIndex::All, TableIndex::All)], out}); + tfms.insert(0,Transformation::TableReference{table_id: reference_table_id, reference: value}); + } else { + tfms.insert(0,Transformation::NewTable{table_id: reference_table_id, rows: 1, columns: 1}); + tfms.insert(0,Transformation::TableReference{table_id: reference_table_id, reference: value}); + } + + } + _ => (), + } + }, + AstNode::TableColumn{children} => { + let mut result = self.compile_nodes(children)?; + tfms.append(&mut result); + }, + AstNode::TableRow{children} => { + let mut row_id = hash_str(&format!("horzcat:{:?}", children)); + let mut args: Vec = vec![]; + let mut result_tfms = vec![]; + let mut all = false; + let mut all_arg = vec![]; + for child in children { + let mut result = self.compile_node(child)?; + match &result[0] { + Transformation::NewTable{table_id,..} => { + args.push((0,table_id.clone(),vec![(TableIndex::All, TableIndex::All)])); + } + Transformation::Select{table_id, indices} => { + if indices.len() == 1 { + match (table_id, indices[0].clone()) { + (TableId::Global(table_id2), (TableIndex::All, TableIndex::All)) => { + all = true; + all_arg.push(result[0].clone()); + } + _ => () + } + } + args.push((0,table_id.clone(),indices.to_vec())); + result.remove(0); + } + Transformation::TableReference{table_id,..} => { + let table_id = table_id.clone(); + args.push((0,table_id.clone(),vec![(TableIndex::All, TableIndex::All)])); + } + _ => (), + } + result_tfms.append(&mut result); + } + if args.len() == 1 && all { + tfms.append(&mut all_arg); + tfms.append(&mut result_tfms); + } else { + tfms.push(Transformation::NewTable{table_id: TableId::Local(row_id), rows: 1, columns: 1}); + tfms.append(&mut result_tfms); + tfms.push(Transformation::Function{ + name: *TABLE_HORIZONTAL__CONCATENATE, + arguments: args, + out: (TableId::Local(row_id), TableIndex::All, TableIndex::All), + }); + } + }, + AstNode::AddRow{children} => { + let mut result_tfms = Vec::new(); + let mut args: Vec = Vec::new(); + + let mut result = self.compile_node(&children[0])?; + match &result[0] { + Transformation::NewTable{table_id,..} => { + args.push((0,table_id.clone(),vec![(TableIndex::All, TableIndex::All)])); + result.remove(0); + } + Transformation::Select{table_id, indices} => { + args.push((0,table_id.clone(),indices.to_vec())); + result.remove(0); + } + _ => (), + } + result_tfms.append(&mut result); + + let mut result = self.compile_node(&children[1])?; + loop { + match &result[0] { + Transformation::NewTable{table_id,..} => { + args.push((0,table_id.clone(),vec![(TableIndex::All, TableIndex::All)])); + break; + } + Transformation::Select{table_id, indices} => { + args.push((0,table_id.clone(),indices.to_vec())); + result.remove(0); + break; + } + Transformation::TableReference{table_id,..} => { + result.remove(0); + result.remove(0); + result.remove(0); + continue; + } + _ => (), + } + } + result_tfms.append(&mut result); + + let (_,o,oi) = &args[0]; + let (or,oc) = &oi[0]; + tfms.append(&mut result_tfms); + tfms.push(Transformation::Function{ + name: *TABLE_APPEND, + arguments: vec![args[1].clone()], + out: (*o,or.clone(),oc.clone()), + }); + }, + AstNode::SplitData{children} => { + let mut result_tfms = Vec::new(); + let mut args: Vec = Vec::new(); + let mut out = self.compile_node(&children[0])?; + let mut out_id = TableId::Local(0); + match &out[0] { + Transformation::NewTable{table_id,..} => { + out_id = *table_id; + result_tfms.append(&mut out); + } + Transformation::Identifier{name, id} => { + out_id = TableId::Local(*id); + result_tfms.append(&mut out); + result_tfms.push(Transformation::NewTable{table_id: out_id, rows: 1, columns: 1}); + } + _ => (), + } + let mut result = self.compile_node(&children[1])?; + match &result[0] { + Transformation::NewTable{table_id,..} => { + args.push((0,table_id.clone(),vec![(TableIndex::All, TableIndex::All)])); + result.remove(0); + } + Transformation::Select{table_id, indices} => { + args.push((0,table_id.clone(),indices.to_vec())); + result.remove(0); + } + _ => (), + } + result_tfms.append(&mut result); + tfms.append(&mut result_tfms); + tfms.push(Transformation::Function{ + name: *TABLE_SPLIT, + arguments: vec![args[0].clone()], + out: (out_id,TableIndex::All,TableIndex::All), + }); + } + AstNode::FlattenData{children} => { + let mut result_tfms = Vec::new(); + let mut args: Vec = Vec::new(); + let mut out = self.compile_node(&children[0])?; + let mut out_id = TableId::Local(0); + match &out[0] { + Transformation::NewTable{table_id,..} => { + out_id = *table_id; + result_tfms.append(&mut out); + } + Transformation::Identifier{name, id} => { + out_id = TableId::Local(*id); + result_tfms.append(&mut out); + result_tfms.push(Transformation::NewTable{table_id: out_id, rows: 1, columns: 1}); + } + _ => (), + } + let mut result = self.compile_node(&children[1])?; + match &result[0] { + Transformation::NewTable{table_id,..} => { + args.push((0,table_id.clone(),vec![(TableIndex::All, TableIndex::All)])); + result.remove(0); + } + Transformation::Select{table_id, indices} => { + args.push((0,table_id.clone(),indices.to_vec())); + result.remove(0); + } + _ => (), + } + result_tfms.append(&mut result); + tfms.append(&mut result_tfms); + tfms.push(Transformation::Function{ + name: *TABLE_FLATTEN, + arguments: vec![args[0].clone()], + out: (out_id,TableIndex::All,TableIndex::All), + }); + } + AstNode::TransposeSelect{children} => { + let mut result = self.compile_node(&children[0])?; + let mut args = vec![]; + match &result[0] { + Transformation::Select{table_id, indices} => { + args.push((0, *table_id, indices.to_vec())); + result.remove(0); + } + _=>(), + } + let id = hash_str(&format!("transpose{:?}",args)); + tfms.push(Transformation::NewTable{table_id: TableId::Local(id), rows: 1, columns: 1}); + tfms.append(&mut result); + tfms.push(Transformation::Function{ + name: *MATRIX_TRANSPOSE, + arguments: args, + out: (TableId::Local(id),TableIndex::All,TableIndex::All), + }); + } + AstNode::SelectData{name, id, children, ..} => { + let mut indices = vec![]; + let mut all_indices = vec![]; + let mut local_tfms = vec![]; + for child in children { + match child { + AstNode::ReshapeColumn => { + indices.push(TableIndex::ReshapeColumn); + indices.push(TableIndex::All); + } + AstNode::Swizzle{children} => { + let mut aliases = vec![]; + for child in children { + match child { + AstNode::Identifier{name,id,..} => { + aliases.push(*id); + } + _ => (), + } + } + indices.push(TableIndex::All); + indices.push(TableIndex::Aliases(aliases)); + } + AstNode::DotIndex{children} => { + for child in children { + match child { + AstNode::Null => { + indices.push(TableIndex::All); + } + AstNode::Identifier{name, id, ..} => { + indices.push(TableIndex::Alias(*id)); + } + AstNode::SubscriptIndex{children} => { + for child in children { + match child { + AstNode::SelectAll => { + indices.push(TableIndex::All); + } + AstNode::WheneverIndex{..} => { + let id = hash_str("~"); + if indices.len() == 2 && indices[0] == TableIndex::All { + indices[0] = TableIndex::IxTable(TableId::Local(id)); + } else { + indices.push(TableIndex::IxTable(TableId::Local(id))); + } + } + AstNode::SelectData{name, id, children, ..} => { + if indices.len() == 2 && indices[0] == TableIndex::All { + indices[0] = TableIndex::IxTable(*id); + } else { + indices.push(TableIndex::IxTable(*id)); + } + } + AstNode::Expression{..} => { + let mut result = self.compile_node(child)?; + match &result[1] { + Transformation::NewTable{table_id, ..} => { + indices.push(TableIndex::IxTable(*table_id)); + } + Transformation::NumberLiteral{kind, bytes} => { + let mut value = NumberLiteral::new(*kind, bytes.clone()); + if indices.len() == 2 && indices[0] == TableIndex::All { + indices[0] = TableIndex::Index(value.as_usize()); + } else { + indices.push(TableIndex::Index(value.as_usize())); + } + } + Transformation::Function{name, arguments, out} => { + let (output_table_id, output_row, output_col) = out; + if indices.len() == 2 && indices[0] == TableIndex::All { + indices[0] = TableIndex::IxTable(*output_table_id); + } else { + indices.push(TableIndex::IxTable(*output_table_id)); + } + } + _ => (), + } + local_tfms.append(&mut result); + } + _ => (), + } + } + } + _ => (), + } + } + } + AstNode::SubscriptIndex{children} => { + for child in children { + match child { + AstNode::SelectAll => { + indices.push(TableIndex::All); + } + AstNode::WheneverIndex{..} => { + let id = hash_str("~"); + if indices.len() == 2 && indices[0] == TableIndex::All { + indices[0] = TableIndex::IxTable(TableId::Local(id)); + } else { + indices.push(TableIndex::IxTable(TableId::Local(id))); + } + } + AstNode::SelectData{name, id, children, ..} => { + if indices.len() == 2 && indices[0] == TableIndex::All { + indices[0] = TableIndex::IxTable(*id); + } else { + indices.push(TableIndex::IxTable(*id)); + } + } + AstNode::Expression{..} => { + let mut result = self.compile_node(child)?; + match &result[1] { + Transformation::NewTable{table_id, ..} => { + indices.push(TableIndex::IxTable(*table_id)); + } + Transformation::NumberLiteral{kind, bytes} => { + let mut value = NumberLiteral::new(*kind, bytes.clone()); + if indices.len() == 2 && indices[0] == TableIndex::All { + indices[0] = TableIndex::Index(value.as_usize()); + } else { + indices.push(TableIndex::Index(value.as_usize())); + } + } + Transformation::Function{name, arguments, out} => { + let (output_table_id, output_row, output_col) = out; + if indices.len() == 2 && indices[0] == TableIndex::All { + indices[0] = TableIndex::IxTable(*output_table_id); + } else { + indices.push(TableIndex::IxTable(*output_table_id)); + } + } + _ => (), + } + local_tfms.append(&mut result); + } + _ => (), + } + } + if children.len() == 1 { + indices.push(TableIndex::None); + } + } + _ => { + indices.push(TableIndex::All); + indices.push(TableIndex::All); + }, + } + if indices.len() == 2 { + all_indices.push((indices[0].clone(),indices[1].clone())); + indices.clear(); + } + } + tfms.push(Transformation::Select{table_id: *id, indices: all_indices}); + tfms.append(&mut local_tfms); + tfms.push(Transformation::Identifier{name: name.clone(), id: *id.unwrap()}); + } + AstNode::Whenever{children} => { + let mut result = self.compile_nodes(children)?; + match &result[0] { + Transformation::Select{table_id, indices} => { + tfms.push(Transformation::Whenever{table_id:*table_id, indices: indices.to_vec()}); + } + _ => (), + } + tfms.append(&mut result); + } + AstNode::FollowedBy{children} => { + let mut out = self.compile_node(&children[0])?; + let mut initial = self.compile_node(&children[1])?; + let mut subsequent = self.compile_node(&children[2])?; + match (&out[0],&initial[0],&subsequent[0]) { + (Transformation::NewTable{table_id: out, ..}, + Transformation::NewTable{table_id: init, ..}, + Transformation::NewTable{table_id: sub, ..}, + ) => { + tfms.push(Transformation::FollowedBy{ + table_id: *out, + initial: *init, + subsequent: *sub, + }); + } + _ => (), + } + tfms.append(&mut out); + tfms.append(&mut initial); + tfms.append(&mut subsequent); + } + AstNode::FunctionBody{children} | + AstNode::FunctionInput{children} | + AstNode::FunctionOutput{children} | + AstNode::FunctionArgs{children} | + AstNode::Comment{children} | + AstNode::Program{children, ..} | + AstNode::Section{children, ..} | + AstNode::Attribute{children} | + AstNode::Transformation{children} | + AstNode::Statement{children, ..} | + AstNode::Fragment{children} | + AstNode::Block{children, ..} | + AstNode::MathExpression{children} | + AstNode::Expression{children} | + AstNode::TableRow{children} | + AstNode::TableColumn{children} | + AstNode::Binding{children} | + AstNode::FunctionBinding{children} | + AstNode::Root{children} => { + let mut result = self.compile_nodes(children)?; + tfms.append(&mut result); + } + AstNode::Null => (), + x => println!("Unhandled AstNode in Compiler {:?}", x), + } + Ok(tfms) + } +} + +pub fn compile_text(node: &ParserNode) -> Result { + let mut ast = Ast::new(); + match &ast.build_syntax_tree(node)[0] { + AstNode::String{text,..} => { + Ok(MechString::from_chars(text).to_string()) + } + x => Err(MechError{msg: "".to_string(), id: 7392, kind: MechErrorKind::GenericError(format!("Unhandled Node: {:?}", x))}) + } +} \ No newline at end of file diff --git a/src/syntax/src/formatter.rs b/src/syntax/src/formatter.rs new file mode 100644 index 0000000..23aed81 --- /dev/null +++ b/src/syntax/src/formatter.rs @@ -0,0 +1,677 @@ +use mech_core::*; +use mech_core::nodes::AstNode; +use crate::compiler::Compiler; +use hashbrown::hash_map::{HashMap}; + +// # Formatter + +// Formats a block as text syntax + +#[derive(Debug, Clone, PartialEq)] +pub struct Formatter{ + code: String, + identifiers: HashMap, + rows: usize, + cols: usize, + indent: usize, + html: bool, + nested: bool, +} + +impl Formatter { + + pub fn new() -> Formatter { + Formatter { + code: String::new(), + identifiers: HashMap::new(), + rows: 0, + cols: 0, + indent: 0, + html: false, + nested: false, + } + } + + pub fn format(&mut self, block_ast: &AstNode) -> String { + self.html = false; + let code = self.write_node(block_ast); + code + } + + pub fn format_html(&mut self, block_ast: &AstNode) -> String { + self.html = true; + let header = r#""#; + let code = self.write_node(block_ast); + format!("{}{}",header,code) + } + + pub fn write_node(&mut self, node: &AstNode) -> String { + if self.html { + self.indent += 1; + } + let mut code = String::new(); + let mut node_type = ""; + match node { + AstNode::Empty => { + node_type = "empty"; + code = "_".to_string(); + }, + AstNode::True => { + node_type = "true"; + code = "true".to_string(); + }, + AstNode::False => { + node_type = "false"; + code = "false".to_string(); + }, + AstNode::Function{name, children,..} => { + match MechString::from_chars(name).to_string().as_ref() + { + "table/range" => { + let lhs = self.write_node(&children[0]); + let rhs = self.write_node(&children[1]); + code = format!("{} : {}", lhs, rhs); + }, + "math/add" => { + let lhs = self.write_node(&children[0]); + let rhs = self.write_node(&children[1]); + code = format!("{} + {}", lhs, rhs); + }, + "math/multiply" => { + let lhs = self.write_node(&children[0]); + let rhs = self.write_node(&children[1]); + code = format!("{} * {}", lhs, rhs); + }, + "math/divide" => { + let lhs = self.write_node(&children[0]); + let rhs = self.write_node(&children[1]); + code = format!("{} / {}", lhs, rhs); + }, + "math/subtract" => { + let lhs = self.write_node(&children[0]); + let rhs = self.write_node(&children[1]); + if lhs == "0" || lhs == "0" { + code = format!("-{}", rhs); + } else { + code = format!("{} - {}", lhs, rhs); + } + } + "logic/and" => { + let lhs = self.write_node(&children[0]); + let rhs = self.write_node(&children[1]); + code = format!("{} & {}", lhs, rhs); + }, + "logic/or" => { + let lhs = self.write_node(&children[0]); + let rhs = self.write_node(&children[1]); + code = format!("{} | {}", lhs, rhs); + }, + "compare/less-than" => { + let lhs = self.write_node(&children[0]); + let rhs = self.write_node(&children[1]); + code = format!("{} < {}", lhs, rhs); + }, + "compare/less-than-equal" => { + let lhs = self.write_node(&children[0]); + let rhs = self.write_node(&children[1]); + code = format!("{} <= {}", lhs, rhs); + }, + "compare/greater-than" => { + let lhs = self.write_node(&children[0]); + let rhs = self.write_node(&children[1]); + code = format!("{} > {}", lhs, rhs); + }, + "compare/greater-than-equal" => { + let lhs = self.write_node(&children[0]); + let rhs = self.write_node(&children[1]); + code = format!("{} >= {}", lhs, rhs); + }, + "compare/equal" => { + let lhs = self.write_node(&children[0]); + let rhs = self.write_node(&children[1]); + code = format!("{} == {}", lhs, rhs); + }, + "compare/not-equal" => { + let lhs = self.write_node(&children[0]); + let rhs = self.write_node(&children[1]); + code = format!("{} != {}", lhs, rhs); + }, + "matrix/multiply" => { + let lhs = self.write_node(&children[0]); + let rhs = self.write_node(&children[1]); + code = format!("{} ** {}", lhs, rhs); + }, + _ => { + //node_type = "function"; + for (ix, child) in children.iter().enumerate() { + let binding = self.write_node(&child); + if ix == children.len() - 1 { + code = format!("{}{}",code, binding); + } else { + if self.html { + code = format!("{}{}, ",code, binding); + } else { + code = format!("{}{}, ",code, binding); + } + + } + } + code = if self.html { + format!("{}({})",MechString::from_chars(name).to_string(), code) + } else { + format!("{}({})", MechString::from_chars(name).to_string(), code) + } + } + } + }, + AstNode::Table{name, id: _,..} => { + code = MechString::from_chars(name).to_string(); + if self.html { + code = format!("#{}", code) + } else { + code = format!("#{}", code) + } + }, + AstNode::Identifier{name, id: _,..} => { + code = MechString::from_chars(name).to_string(); + }, + AstNode::TableDefine{children} => { + let lhs = self.write_node(&children[0]); + /*self.indent = if self.html { + lhs.len() + 3 - 37 - 47 + } else { + lhs.len() + 3 + };*/ + let rhs = self.write_node(&children[1]); + let lhs = if self.html { + format!("{}", lhs) + } else { + format!("{}", lhs) + }; + code = if self.html { + format!("{}{} = \n{}", self.tab(), lhs, rhs) + } else { + format!("{} = {}", lhs, rhs) + }; + }, + AstNode::SetData{children} => { + let lhs = self.write_node(&children[0]); + let rhs = self.write_node(&children[1]); + code = format!("{} := {}", lhs, rhs); + }, + AstNode::SplitData{children} => { + let lhs = self.write_node(&children[0]); + /*self.indent = if self.html { + lhs.len() + 4 + } else { + lhs.len() + 2 + };*/ + let rhs = self.write_node(&children[1]); + let lhs = if self.html { + format!("{}", lhs) + } else { + format!("{}", lhs) + }; + code = format!("{} >- {}", lhs, rhs); + }, + AstNode::AddRow{children} => { + let lhs = self.write_node(&children[0]); + let rhs = self.write_node(&children[1]); + code = format!("{} += {}", lhs, rhs); + }, + AstNode::VariableDefine{children} => { + let lhs = self.write_node(&children[0]); + /*self.indent = if self.html { + lhs.len() + 4 + } else { + lhs.len() + 2 + };*/ + let rhs = self.write_node(&children[1]); + let lhs = if self.html { + format!("{}", lhs) + } else { + format!("{}", lhs) + }; + code = format!("{} = {}", lhs, rhs); + }, + AstNode::String{text,..} => { + let string = MechString::from_chars(text).to_string(); + code = if self.html { + format!("{}{}\n",self.tab(),string) + } else { + format!("{}", string) + } + }, + AstNode::SelectData{name, id, children,..} => { + let name = MechString::from_chars(name).to_string(); + for child in children { + let written_child = self.write_node(child); + code = format!("{}{}",code, written_child); + } + let formatted_name = match id { + TableId::Local(..) => { + if self.html { + format!("{}", name) + } else { + format!("{}", name) + } + }, + TableId::Global(..) => { + if self.html { + format!("#{}", name) + } else { + format!("#{}", name) + } + }, + }; + code = format!("{}{}",formatted_name, code); + } + AstNode::SubscriptIndex{children} => { + for (ix, child) in children.iter().enumerate() { + let written_child = self.write_node(child); + if ix == children.len() - 1 { + code = format!("{}{}",code, written_child); + } else { + if self.html { + code = format!("{}{}, ",code, written_child); + } else { + code = format!("{}{}, ",code, written_child); + } + } + } + if self.html { + code = format!("{{{}}}", code); + } else { + code = format!("{{{}}}", code); + } + } + AstNode::DotIndex{children} => { + let mut reversed = children.clone(); + reversed.reverse(); + for child in reversed { + let written_child = self.write_node(&child); + code = format!("{}{}", code, written_child); + } + code = format!(".{}", code); + } + AstNode::AnonymousTableDefine{children} => { + let nested = self.nested; + let rows = self.rows; + let cols = self.cols; + self.rows = 0; + self.cols = 0; + self.nested = true; + for (ix, child) in children.iter().enumerate() { + let mut newline = ""; + let written_child = self.write_node(&child); + if ix != children.len() - 1 { + newline = "\n"; + } + code = format!("{}{}{}", code, written_child, newline); + } + self.nested = nested; + if self.rows == 1 && self.cols == 1 && !self.nested { + code = format!("{}", code); + } else { + if self.html { + code = format!("[{}]", code); + } else { + code = format!("[{}]", code); + } + } + self.rows = rows; + self.cols = cols; + } + AstNode::SelectAll => { + node_type = "function"; + code = ":".to_string(); + } + AstNode::InlineTable{children} => { + let nested = self.nested; + self.nested = true; + for (ix, child) in children.iter().enumerate() { + let binding = self.write_node(&child); + if ix == children.len() - 1 { + code = format!("{}{}",code, binding); + } else { + if self.html { + code = format!("{}{}, ",code, binding); + } else { + code = format!("{}{}, ",code, binding); + } + } + } + self.nested = nested; + if self.html { + code = format!("[{}]", code); + } else { + code = format!("[{}]", code); + }; + } + AstNode::Binding{children} => { + let lhs = self.write_node(&children[0]); + let rhs = self.write_node(&children[1]); + if self.html { + code = format!("{}: {}", lhs, rhs); + } else { + code = format!("{}: {}", lhs, rhs); + }; + } + AstNode::Whenever{children} => { + let table = self.write_node(&children[0]); + if self.html { + code = format!("~ {}", table); + } else { + code = format!("~ {}", table); + }; + } + AstNode::Wait{children} => { + let table = self.write_node(&children[0]); + if self.html { + code = format!("|~ {}", table); + } else { + code = format!("|~ {}", table); + }; + } + AstNode::Until{children} => { + let table = self.write_node(&children[0]); + if self.html { + code = format!("~| {}", table); + } else { + code = format!("~| {}", table); + }; + } + AstNode::TableHeader{children} => { + self.rows += 1; + node_type = "parameter"; + for child in children { + let written_child = self.write_node(child); + code = format!("{}{} ",code, written_child); + } + code = format!("|{}|",code); + } + AstNode::TableRow{children} => { + self.rows += 1; + self.cols = 0; + for (ix, child) in children.iter().enumerate() { + let mut space = ""; + let written_child = self.write_node(child); + if ix != children.len() - 1 { + space = " "; + } + code = format!("{}{}{}", code, written_child, space) + } + let indent = if self.rows != 1 { + repeat_char(" ", self.indent) + } else { + "".to_string() + }; + code = format!("{}{}", indent, code) + } + AstNode::TableColumn{children,..} => { + self.cols += 1; + for child in children { + code = self.write_node(child); + } + } + AstNode::ParagraphText{text, src_range} => { + let paragraph = MechString::from_chars(text).to_string(); + if self.html { + code = format!("{}{}{}\n",code,self.tab(),paragraph); + } else { + code = format!("{}{}\n\n",code,paragraph); + }; + } + AstNode::NumberLiteral{kind, bytes, ..} => { + let mut compiler = Compiler::new(); + let tfms = compiler.compile_node(&node).unwrap(); + match &tfms[1] { + Transformation::NumberLiteral{kind,bytes} => { + let mut num = NumberLiteral::new(*kind, bytes.to_vec()); + if self.html { + code = format!("{}{}",code,num.as_f32()); + } else { + code = format!("{}{}",code,num.as_f32()); + }; + } + _ => (), + } + } + AstNode::Program{title,children} => { + match title { + Some(title) => { + let title = MechString::from_chars(title).to_string(); + if self.html { + code = format!("{}{}

    {}

    \n",code,self.tab(),title); + } else { + let underline = repeat_char("=", title.len() + 2); + code = format!("{}{}\n{}\n\n",code,title,underline); + }; + } + _ => (), + } + for child in children { + code = format!("{}{}",code,self.write_node(child)); + } + } + AstNode::Section{title, children, level} => { + if self.html { + code = format!("{}{}\n",code, self.tab(), "section"); + } + match title { + Some(title) => { + let title = MechString::from_chars(title).to_string(); + if self.html { + let (tag,class) = match level { + 1 => ("h2","level-1-title"), + 2 => ("h3","level-2-title"), + 3 => ("h4","level-3-title"), + _ => ("ERROR","ERROR") + }; + code = format!("{}{}<{} class=\"{}\">{}\n",code,self.tab(),tag,class,title,tag); + } else { + let underline = repeat_char("-", title.len() + 2); + code = format!("{}{}\n{}\n\n",code,title,underline); + }; + } + _ => (), + } + for child in children { + code = format!("{}{}",code,self.write_node(child)); + } + if self.html { + code = format!("{}{}\n",code,self.tab()); + } + } + AstNode::Paragraph{children,..} => { + if self.html { + code = format!("{}{}

    \n",code, self.tab()); + } + for child in children { + code = format!("{}{}",code,self.write_node(child)); + } + if self.html { + code = format!("{}{}

    \n",code,self.tab()); + } + }, + AstNode::UnorderedList{children,..} => { + if self.html { + code = format!("{}{}
      \n",code, self.tab()); + } + for child in children { + code = format!("{}{}",code,self.write_node(child)); + } + if self.html { + code = format!("{}{}
    \n",code,self.tab()); + } + }, + AstNode::ListItem{children,..} => { + if self.html { + code = format!("{}{}
  • \n",code, self.tab()); + } + for child in children { + code = format!("{}{}",code,self.write_node(child)); + } + if self.html { + code = format!("{}{}
  • \n",code,self.tab()); + } + }, + AstNode::CodeBlock{children,..} => { + if self.html { + code = format!("{}{}
    \n",code, self.tab());
    +        }
    +        for child in children {
    +          code = format!("{}{}",code,self.write_node(child));
    +        }
    +        if self.html {
    +          code = format!("{}{}
    \n",code,self.tab()); + } + }, + AstNode::UserFunction{children, ..} => {code = self.write_nodes(children,code,"user-function");}, + AstNode::FunctionArgs{children, ..} => {code = self.write_nodes(children,code,"function-args");}, + AstNode::FunctionOutput{children, ..} => {code = self.write_nodes(children,code,"function-output");}, + AstNode::FunctionInput{children, ..} => {code = self.write_nodes(children,code,"function-input");}, + AstNode::FunctionBody{children, ..} => {code = self.write_nodes(children,code,"function-body");}, + AstNode::FunctionBinding{children, ..} => {code = self.write_nodes(children,code,"function-binding");}, + + AstNode::KindAnnotation{children, ..} => {code = self.write_nodes(children,code,"kind-annotation");}, + AstNode::InlineCode{children, ..} => {code = self.write_nodes(children,code,"inline-code");}, + AstNode::Swizzle{children, ..} => {code = self.write_nodes(children,code,"inline-code");}, + AstNode::FlattenData{children, ..} => {code = self.write_nodes(children,code,"inline-code");}, + AstNode::Comment{children, ..} => {code = self.write_nodes(children,code,"inline-code");}, + AstNode::UpdateData{children, ..} => {code = self.write_nodes(children,code,"inline-code");}, + + + AstNode::Transformation{children, ..} => {code = self.write_nodes(children,code,"transformation");}, + AstNode::Root{children,..} => { + code = self.write_style(code); + code = self.write_nodes(children,code,"root"); + }, + AstNode::Paragraph{children,..} => {code = self.write_nodes(children,code,"paragraph");}, + AstNode::Attribute{children,..} => {code = self.write_nodes(children,code,"attribute");}, + AstNode::MathExpression{children,..} => {code = self.write_nodes(children,code,"math-expression");}, + AstNode::Expression{children,..} => {code = self.write_nodes(children,code,"expression");}, + AstNode::Statement{children,..} => {code = self.write_nodes(children,code,"statement");}, + AstNode::Block{children, ..} => {code = self.write_nodes(children,code,"block");}, + AstNode::Null => (), + x => println!("Unhandled Node {:?}", x), + } + if self.html && node_type != "" { + code = format!("{}", node_type, code); + } + if self.html { + self.indent -= 1; + } + code + } + + fn tab(&mut self) -> String { + let mut result = "".to_string(); + if self.indent > 100 { + self.indent = 0; + } + for _ in 0..self.indent { + result = format!("{}{}", result, " "); + } + result + } + + fn write_style(&self, code: String) -> String { + let mut code = code; + let mut style = r#" +"#; + format!("{}{}\n",code, style) + } + + fn write_nodes(&mut self, children: &Vec, code: String, class: &str) -> String { + let mut code = code; + if self.html { + code = format!("{}{}\n",code, self.tab(), class); + } + for child in children { + code = format!("{}{}",code,self.write_node(child)); + } + if self.html { + code = format!("{}{}\n",code,self.tab()); + } + code + } + + +} + +fn repeat_char(to_print: &str, n: usize) -> String { + let mut result = "".to_string(); + for _ in 0..n { + result = format!("{}{}", result, to_print); + } + result +} diff --git a/src/syntax/src/langserver/backend.rs b/src/syntax/src/langserver/backend.rs new file mode 100644 index 0000000..8c4e854 --- /dev/null +++ b/src/syntax/src/langserver/backend.rs @@ -0,0 +1,290 @@ +use std::collections::HashSet; +use std::sync::Mutex; +use std::sync::Arc; +use std::rc::Rc; + +use tower_lsp::jsonrpc; +use tower_lsp::lsp_types::*; +use tower_lsp::{Client, LanguageServer}; + +use mech_core::*; +use mech_core::nodes::*; + +use crate::parser; +use crate::ast::Ast; +use crate::compiler::Compiler; + +/// +/// TODO +/// +/// Current: +/// +/// Hover -- ok +/// Goto definition +/// +/// Run mech instance +/// +/// +/// 1. Integrate langserver into `mech` executable -- ok +/// 2. Let parser track location information -- ok +/// 3. (Include location information in parser nodes)? -- ok +/// +/// +/// Long run: +/// 1. Implement syntax highlighting with lsp +/// 2. Use delta to improve server's performance +/// +/// Long term goals: +/// Running value +/// Debuger +/// + +fn location_in_range(loc: SourceLocation, rng: SourceRange) -> bool { + loc >= rng.start && loc < rng.end +} + +fn identifier_at_location(ast_node: &AstNode, loc: SourceLocation) -> Option { + match ast_node { + AstNode::Root{children} | + AstNode::Program{children, ..} | + AstNode::Transformation{children} | + AstNode::VariableDefine{children} | + AstNode::Expression{children} | + AstNode::MathExpression{children} | + AstNode::AnonymousTableDefine{children} | + AstNode::TableDefine{children} | + AstNode::TableRow{children} | + AstNode::TableColumn{children} | + AstNode::Function{children, ..} | + AstNode::Section{children, ..} => { + for node in children { + if let Some(name) = identifier_at_location(node, loc) { + return Some(name); + } + } + return None; + }, + AstNode::Statement{children, src_range} | + AstNode::Block{children, src_range} => { + if location_in_range(loc, *src_range) { + for node in children { + if let Some(name) = identifier_at_location(node, loc) { + return Some(name); + } + } + } + return None; + }, + AstNode::Table{name, src_range, ..} | + AstNode::SelectData{name, src_range, ..} | + AstNode::Identifier{name, src_range, ..} => { + if location_in_range(loc, *src_range) { + return Some(name.iter().collect::()) + } + return None; + }, + _ => return None, + } +} + +fn collect_global_table_symbols(ast_node: &AstNode, set: &mut HashSet) { + match ast_node { + AstNode::TableDefine{children} => { + for node in children { + match node { + AstNode::Table{name, id: _, ..} => { + let table_name = name.into_iter().collect(); + set.insert(table_name); + break; + }, + _ => (), + } + } + }, + AstNode::Root{children} | + AstNode::Block{children, ..} | + AstNode::Statement{children, ..} | + AstNode::Fragment{children} | + AstNode::Program{children, ..} | + AstNode::Section{children, ..} | + AstNode::Transformation{children} => { + for node in children { + collect_global_table_symbols(node, set); + } + }, + _ => (), + } +} + +unsafe impl Send for SharedState {} +unsafe impl Sync for SharedState {} + +struct SharedState { + global_table_symbols: Vec, + mech_core: Core, + mech_ast: Ast, +} + +pub struct Backend { + client: Client, + shared_state: Mutex, +} + +impl Backend { + pub fn new(client: Client) -> Self { + Self { + client, + shared_state: Mutex::new(SharedState { + global_table_symbols: vec![], + mech_core: Core::new(), + mech_ast: Ast::new(), + }), + } + } + + fn with_shared_state(&self, f: F) + where + F: FnOnce(&mut SharedState) + { + f(&mut self.shared_state.lock().unwrap()) + } +} + +#[tower_lsp::async_trait] +impl LanguageServer for Backend { + async fn initialize(&self, _: InitializeParams) -> jsonrpc::Result { + println!("[INITIALIZE]"); + Ok(InitializeResult { + capabilities: ServerCapabilities { + text_document_sync: Some(TextDocumentSyncCapability::Kind(TextDocumentSyncKind::FULL)), + hover_provider: Some(HoverProviderCapability::Simple(true)), + completion_provider: Some(CompletionOptions::default()), + ..Default::default() + }, + ..Default::default() + }) + } + + async fn did_change(&self, params: DidChangeTextDocumentParams) { + let uri = params.text_document.uri; + println!("[DID_CHANGE] @ {}", uri.path()); + let source_code_ref: &String = if params.content_changes.len() != 0 { + ¶ms.content_changes[0].text + } else { + return; + }; + match parser::parse(source_code_ref) { + Ok(tree) => { + println!("source code ok!"); + self.client.publish_diagnostics(uri, vec![], None).await; + let mut ast = Ast::new(); + ast.build_syntax_tree(&tree); + let mut set = HashSet::new(); + collect_global_table_symbols(&ast.syntax_tree, &mut set); + let mut symbols: Vec = set.into_iter().collect(); + let mut compiler = Compiler::new(); + let sections = compiler.compile_sections(&vec![ast.syntax_tree.clone()]).unwrap(); + self.with_shared_state(move |shared_state| { + // refresh table symbols + shared_state.global_table_symbols.clear(); + shared_state.global_table_symbols.append(&mut symbols); + // refresh core + shared_state.mech_core = Core::new(); + shared_state.mech_core.load_sections(sections); + // refresh ast + shared_state.mech_ast = ast; + }); + }, + Err(err) => if let MechErrorKind::ParserError(node, report, msg) = err.kind { + println!("source code err!"); + println!("--------------------------------------------------------------"); + parser::print_err_report(source_code_ref, &report); + println!("--------------------------------------------------------------"); + let mut diags = vec![]; + for err in report { + let range = Range { + start: Position { + line: (err.cause_rng.start.row - 1) as u32, + character: (err.cause_rng.start.col - 1) as u32, + }, + end: Position { + line: (err.cause_rng.end.row - 1) as u32, + character: (err.cause_rng.end.col - 1) as u32, + }, + }; + diags.push(Diagnostic { + range, + severity: None, + code: None, + code_description: None, + source: None, + message: err.err_message.clone(), + related_information: None, + tags: None, + data: None, + }); + } + self.client.publish_diagnostics(uri, diags, None).await; + } else { + return; + }, + } + } + + async fn initialized(&self, _: InitializedParams) { + println!("[INITIALIZED]"); + self.client + .log_message(MessageType::INFO, "server initialized!") + .await; + } + + async fn shutdown(&self) -> jsonrpc::Result<()> { + println!("[SHUTDOWN]"); + Ok(()) + } + + async fn completion(&self, _: CompletionParams) -> jsonrpc::Result> { + println!("[COMPLETION]"); + let mut items = vec![]; + let symbols = self.shared_state.lock().unwrap().global_table_symbols.clone(); + for symbol in symbols { + items.push( + CompletionItem::new_simple(symbol, "Global table".to_string()), + ); + } + Ok(Some(CompletionResponse::Array(items))) + } + + async fn hover(&self, params: HoverParams) -> jsonrpc::Result> { + println!("[HOVER]"); + let req_pos = params.text_document_position_params.position; + let req_loc = SourceLocation { + row: req_pos.line as usize + 1, + col: req_pos.character as usize + 1, + }; + + let mut response = None; + + self.with_shared_state(|shared_state| { + let name = match identifier_at_location(&shared_state.mech_ast.syntax_tree, req_loc) { + Some(identifier) => identifier, + None => return, + }; + match shared_state.mech_core.get_table(&name) { + Ok(table) => { + let mut printer = BoxPrinter::new(); + printer.add_table(&table.borrow()); + response = Some(Hover { + contents: HoverContents::Scalar( + MarkedString::String(format!("```text{}```", printer.print())) + ), + range: None, + }) + }, + Err(_) => return, + }; + }); + + Ok(response) + } +} diff --git a/src/syntax/src/langserver/mod.rs b/src/syntax/src/langserver/mod.rs new file mode 100644 index 0000000..777877a --- /dev/null +++ b/src/syntax/src/langserver/mod.rs @@ -0,0 +1,29 @@ +mod backend; + +use tokio::net::TcpListener; + +use mech_core::{MechError, MechErrorKind}; +use tower_lsp::{LspService, Server}; + +use backend::Backend; + +pub async fn run_langserver(addr: &str, port: &str) -> Result<(), MechError> { + let addr_port = format!("{}:{}", addr, port); + + // bind to address and port + let listener = match TcpListener::bind(&addr_port).await { + Ok(listener) => listener, + Err(_) => return Err(MechError{msg: "".to_string(), id: 8923, kind: MechErrorKind::GenericError(format!("Unable to bind to {}", addr_port)),}), + }; + + // accept one client, then quit + match listener.accept().await { + Ok((conn_sk, client_addr)) => { + let (service, client_sk) = LspService::new(|client| Backend::new(client)); + let (conn_sk_in, conn_sk_out) = conn_sk.into_split(); + Server::new(conn_sk_in, conn_sk_out, client_sk).serve(service).await; + Ok(()) + }, + Err(e) => Err(MechError{msg: "".to_string(), id: 8924, kind: MechErrorKind::GenericError(format!("Unable to get client: {}", e))}), + } +} diff --git a/src/syntax/src/lib.rs b/src/syntax/src/lib.rs new file mode 100644 index 0000000..f9e16c5 --- /dev/null +++ b/src/syntax/src/lib.rs @@ -0,0 +1,24 @@ +// # Syntax + +#![cfg_attr(feature = "no-std", no_std)] +#![cfg_attr(feature = "no-std", alloc)] +#![feature(drain_filter)] +#![feature(get_mut_unchecked)] +#![allow(dead_code)] +#![allow(warnings)] + +extern crate mech_core; +#[cfg(feature="no-std")] #[macro_use] extern crate alloc; +#[cfg(not(feature = "no-std"))] extern crate core; +extern crate hashbrown; +extern crate nom; +extern crate nom_unicode; +#[macro_use] +extern crate lazy_static; + +pub mod parser; +pub mod ast; +pub mod compiler; +#[cfg(feature="lang-server")] +pub mod langserver; +pub mod formatter; diff --git a/src/syntax/src/parser.rs b/src/syntax/src/parser.rs new file mode 100644 index 0000000..b14f0ee --- /dev/null +++ b/src/syntax/src/parser.rs @@ -0,0 +1,2737 @@ +// # Parser + +/// Sections: +/// 1. Prelude +/// 2. Parser utilities +/// 3. Parser combinators +/// 4. Recovery functions +/// 5. Primitive parsers +/// 6. Parsers +/// 7. Reporting errors +/// 8. Public interface + +// ## Prelude + +use mech_core::*; +use mech_core::nodes::*; + +#[cfg(not(feature = "no-std"))] use core::fmt; +#[cfg(feature = "no-std")] use alloc::fmt; +#[cfg(feature = "no-std")] use alloc::string::String; +#[cfg(feature = "no-std")] use alloc::vec::Vec; +use nom::{ + IResult, + branch::alt, + sequence::tuple, + combinator::{opt, eof}, + multi::{many1, many_till, many0, separated_list1}, + Err, +}; + +use std::collections::HashMap; +use colored::*; + +// ## Parser utilities + +/// Unicode grapheme group utilities. +/// Current implementation does not guarantee correct behavior for +/// all possible unicode characters. +pub mod graphemes { + use unicode_segmentation::UnicodeSegmentation; + + /// Obtain unicode grapheme groups from input source, then make sure + /// it ends with newline. Many functions in the parser assume input + /// ends with newline. + pub fn init_source(text: &str) -> Vec<&str> { + let mut graphemes = UnicodeSegmentation::graphemes(text, true).collect::>(); + if let Some(g) = graphemes.last() { + if !is_newline(g) { + graphemes.push("\n"); + } + } else { + graphemes.push("\n"); + } + graphemes + } + + pub fn init_tag(tag: &str) -> Vec<&str> { + UnicodeSegmentation::graphemes(tag, true).collect::>() + } + + pub fn is_newline(grapheme: &str) -> bool { + match grapheme { + "\r" | "\n" | "\r\n" => true, + _ => false, + } + } + + pub fn is_numeric(grapheme: &str) -> bool { + grapheme.chars().next().unwrap().is_numeric() + } + + pub fn is_alpha(grapheme: &str) -> bool { + grapheme.chars().next().unwrap().is_alphabetic() + } + + pub fn is_emoji(grapheme: &str) -> bool { + let ch = grapheme.chars().next().unwrap(); + !(ch.is_alphanumeric() || ch.is_ascii()) + } + + pub fn width(grapheme: &str) -> usize { + // TODO: uniode width? + let ch = grapheme.chars().next().unwrap(); + if ch == '\t' { + 1 + } else if ch.is_control() { + 0 + } else { + 1 + } + } +} + +/// Just alias +pub type ParseResult<'a, O> = IResult, O, ParseError<'a>>; + +/// The input type for nom parsers. Instead of holding the actual input +/// string, this struct only holds a reference to that string so that it +/// can be cloned at much lower cost. +#[derive(Clone, Debug)] +pub struct ParseString<'a> { + /// Source code + pub graphemes: &'a Vec<&'a str>, + /// Error report, a list of (error_location, error_context) + pub error_log: Vec<(SourceRange, ParseErrorDetail)>, + /// Point at the next grapheme to consume + pub cursor: usize, + /// Location of the grapheme pointed by cursor + pub location: SourceLocation, +} + +impl<'a> ParseString<'a> { + /// Must always point a an actual string + pub fn new(graphemes: &'a Vec<&'a str>) -> Self { + ParseString { + graphemes, + error_log: vec![], + cursor: 0, + location: SourceLocation { row: 1, col: 1 }, + } + } + + /// If current location matches the tag, consume the matched string. + fn consume_tag(&mut self, tag: &str) -> Option { + let gs = graphemes::init_tag(tag); + let gs_len = gs.len(); + + // Must have enough remaining characters + if self.len() < gs_len { + return None; + } + + // Try to match the tag + let mut tmp_location = self.location; + for i in 0..gs_len { + let c = self.cursor + i; + let g = self.graphemes[c]; + if g != gs[i] { + return None; + } + + if graphemes::is_newline(g) { + if !self.is_last_grapheme(c) { + tmp_location.row += 1; + tmp_location.col = 1; + } + } else { + tmp_location.col += graphemes::width(g); + } + } + + // Tag matched, commit change + self.cursor += gs_len; + self.location = tmp_location; + Some(tag.to_string()) + } + + /// Mutate self by consuming one grapheme + fn consume_one(&mut self) -> Option { + if self.len() == 0 { + return None; + } + let g = self.graphemes[self.cursor]; + if graphemes::is_newline(g) { + if !self.is_last_grapheme(self.cursor) { + self.location.row += 1; + self.location.col = 1; + } + } else { + self.location.col += graphemes::width(g); + } + self.cursor += 1; + Some(g.to_string()) + } + + + /// If current location matches any emoji, consume the matched string. + fn consume_emoji(&mut self) -> Option { + if self.len() == 0 { + return None; + } + let g = self.graphemes[self.cursor]; + if graphemes::is_emoji(g) { + self.cursor += 1; + self.location.col += graphemes::width(g); + Some(g.to_string()) + } else { + None + } + } + + /// If current location matches any alpha char, consume the matched string. + fn consume_alpha(&mut self) -> Option { + if self.len() == 0 { + return None; + } + let g = self.graphemes[self.cursor]; + if graphemes::is_alpha(g) { + self.cursor += 1; + self.location.col += graphemes::width(g); + Some(g.to_string()) + } else { + None + } + } + + /// If current location matches any digit, consume the matched string. + fn consume_digit(&mut self) -> Option { + if self.len() == 0 { + return None; + } + let g = self.graphemes[self.cursor]; + if graphemes::is_numeric(g) { + self.cursor += 1; + self.location.col += graphemes::width(g); + Some(g.to_string()) + } else { + None + } + } + + /// Get cursor's location in source code + fn loc(&self) -> SourceLocation { + self.location + } + + /// Test whether the grapheme pointed by cursor is the last grapheme + fn is_last_grapheme(&self, c: usize) -> bool { + (self.graphemes.len() - 1 - c) == 0 + } + + /// Get remaining (unparsed) length + pub fn len(&self) -> usize { + self.graphemes.len() - self.cursor + } + + /// For debug purpose + fn output(&self) { + + println!("───────────────────{}", self.len()); + for i in self.cursor..self.graphemes.len() { + print!("{}", self.graphemes[i]); + } + println!(); + println!("───────────────────"); + } +} + +/// Required by nom +impl<'a> nom::InputLength for ParseString<'a> { + fn input_len(&self) -> usize { + self.len() + } +} + +/// The part of error context that's independent to its cause location. +#[derive(Clone, Debug)] +pub struct ParseErrorDetail { + pub message: &'static str, + pub annotation_rngs: Vec, +} + +/// The error type for the nom parser, which handles full error context +/// (location + detail) and ownership of the input ParseString. +/// +/// Eventually error context will be logged and ownership will be moved out. +#[derive(Clone, Debug)] +pub struct ParseError<'a> { + /// Cause range is defined as [start, end), where `start` points at the first + /// character that's catched by a label, and `end` points at the next + /// character of the character that didn't match. + /// + /// Example: + /// index: 1234567 + /// input: abcdefg + /// error: ~~~^ + /// range: | | + /// [2, 5) + /// + pub cause_range: SourceRange, + /// Hold ownership to the input ParseString + pub remaining_input: ParseString<'a>, + /// Detailed information about this error + pub error_detail: ParseErrorDetail, +} + +impl<'a> ParseError<'a> { + /// Create a new error at current location of the input, with given message + /// and empty annotations. Ownership of the input is also passed into this + /// error object. + pub fn new(input: ParseString<'a>, msg: &'static str) -> Self { + let start = input.loc(); + let mut end = start; + end.col += 1; + ParseError { + cause_range: SourceRange { start, end }, + remaining_input: input, + error_detail: ParseErrorDetail { + message: msg, + annotation_rngs: vec![], + } + } + } + + /// Add self to the error log of input string. + fn log(&mut self) { + self.remaining_input.error_log.push((self.cause_range, self.error_detail.clone())); + } +} + +/// Required by nom +impl<'a> nom::error::ParseError> for ParseError<'a> { + /// Not used, unless we have logical error + fn from_error_kind(input: ParseString<'a>, + _kind: nom::error::ErrorKind) -> Self { + ParseError::new(input, "Unexpected error") + } + + /// Probably not used + fn append(_input: ParseString<'a>, + _kind: nom::error::ErrorKind, + other: Self) -> Self { + other + } + + /// Barely used, but we do want to keep the error with larger depth. + fn or(self, other: Self) -> Self { + let self_start = self.cause_range.start; + let other_start = other.cause_range.start; + if self_start > other_start { + self + } else { + other + } + } +} + +// ## Parser combinators + +/// Convert output of any parser into ParserNode::Null. +/// Useful for working with `alt` combinator and error recovery functions. +fn null<'a, F, O>(mut parser: F) -> + impl FnMut(ParseString<'a>) -> ParseResult +where + F: FnMut(ParseString<'a>) -> ParseResult +{ + move |input: ParseString| match parser(input) { + Ok((remaining, _)) => Ok((remaining, ParserNode::Null)), + Err(Err::Error(e)) => Err(Err::Error(e)), + Err(Err::Failure(e)) => Err(Err::Failure(e)), + x => panic!("Err::Incomplete is not supported"), + } +} + +/// For parser p, run p and also output the range that p has matched +/// upon success. +fn range<'a, F, O>(mut parser: F) -> + impl FnMut(ParseString<'a>) -> ParseResult<(O, SourceRange)> +where + F: FnMut(ParseString<'a>) -> ParseResult +{ + move |input: ParseString| { + let start = input.loc(); + match parser(input) { + Ok((remaining, o)) => { + let rng = SourceRange { start, end: remaining.loc(), }; + Ok((remaining, (o, rng))) + }, + Err(e) => Err(e), + } + } +} + +macro_rules! label { + ($parser:expr, $msg:expr) => { + (label_without_recovery($parser, ParseErrorDetail { + message: $msg, annotation_rngs: vec![] + })) + }; + + ($parser:expr, $msg:expr, $($rngs:expr),+) => { + (label_without_recovery($parser, ParseErrorDetail { + message: $msg, annotation_rngs: vec![$($rngs),+] + })) + }; +} + +macro_rules! labelr { + ($parser:expr, $recovery_fn:expr, $msg:expr) => { + (label_with_recovery($parser, $recovery_fn, ParseErrorDetail { + message: $msg, annotation_rngs: vec![] + })) + }; + + ($parser:expr, $recovery_fn:expr, $msg:expr, $($rngs:expr),+) => { + (label_with_recovery($parser, $recovery_fn, ParseErrorDetail { + message: $msg, annotation_rngs: vec![$($rngs),+] + })) + }; +} + +/// Label without recovery function. Upgrade Err::Error to Err:Failure +/// and override its context information. +fn label_without_recovery<'a, F, O>( + mut parser: F, + error_detail: ParseErrorDetail, +) -> + impl FnMut(ParseString<'a>) -> ParseResult +where + F: FnMut(ParseString<'a>) -> ParseResult +{ + move |mut input: ParseString| { + let start = input.loc(); + match parser(input) { + Err(Err::Error(mut e)) => { + e.cause_range = SourceRange { start, end: e.cause_range.end }; + e.error_detail = error_detail.clone(); + Err(Err::Failure(e)) + } + x => x, + } + } +} + +/// Label with recovery function. In addition to upgrading errors, the +/// error is logged and recovery function will be run as an attempt to +/// synchronize parser state. +fn label_with_recovery<'a, F, O>( + mut parser: F, + mut recovery_fn: fn(ParseString<'a>) -> ParseResult, + error_detail: ParseErrorDetail, +) -> + impl FnMut(ParseString<'a>) -> ParseResult +where + F: FnMut(ParseString<'a>) -> ParseResult +{ + move |mut input: ParseString| { + let start = input.loc(); + match parser(input) { + Err(Err::Error(mut e)) => { + e.cause_range = SourceRange { start, end: e.cause_range.end }; + e.error_detail = error_detail.clone(); + e.log(); + recovery_fn(e.remaining_input) + } + Err(Err::Failure(mut e)) => { + e.log(); + recovery_fn(e.remaining_input) + }, + x => x, + } + } +} + +/// For parser p, return the `!!p` peek parsing expression. +fn is<'a, F, O>(mut parser: F) -> + impl FnMut(ParseString<'a>) -> ParseResult +where + F: FnMut(ParseString<'a>) -> ParseResult +{ + move |input: ParseString| { + let input_clone = input.clone(); + match parser(input_clone) { + Ok((_, o)) => Ok((input, o)), + _ => Err(Err::Error(ParseError::new(input, "Unexpected character"))), + } + } +} + +/// For parser p, return the `!p` peek parsing expression. +fn is_not<'a, F, E>(mut parser: F) -> + impl FnMut(ParseString<'a>) -> ParseResult<()> +where + F: FnMut(ParseString<'a>) -> ParseResult +{ + move |input: ParseString| { + let input_clone = input.clone(); + match parser(input_clone) { + Err(Err::Failure(_)) | + Err(Err::Error(_)) => Ok((input, ())), + _ => Err(Err::Error(ParseError::new(input, "Unexpected character"))) + } + } +} + +/// Return a terminal parsing expression that consumes `tag` from input. +pub fn tag(tag: &'static str) -> impl Fn(ParseString) -> ParseResult { + move |mut input: ParseString| { + if let Some(matched) = input.consume_tag(tag) { + Ok((input, matched)) + } else { + Err(nom::Err::Error(ParseError::new(input, "Unexpected character"))) + } + } +} + +// ## Recovery functions + +pub fn skip_till_eol(input: ParseString) -> ParseResult { + let (input, _) = many0(tuple(( + is_not(newline), + any, + )))(input)?; + Ok((input, ParserNode::Null)) +} + +fn skip_pass_eol(input: ParseString) -> ParseResult { + let (input, _) = skip_till_eol(input)?; + let (input, _) = newline(input)?; + Ok((input, ParserNode::Null)) +} + +fn skip_till_section_element(input: ParseString) -> ParseResult { + if input.len() == 0 { + return Ok((input, ParserNode::Error)); + } + let (input, _) = skip_pass_eol(input)?; + let (input, _) = many0(tuple(( + is_not(section_element), + skip_pass_eol, + )))(input)?; + Ok((input, ParserNode::Error)) +} + +fn skip_till_section_element2(input: ParseString) -> ParseResult { + if input.len() == 0 { + return Ok((input, ParserNode::Error)); + } + let (input, _) = skip_pass_eol(input)?; + let (input, _) = many0(tuple(( + is_not(section_element2), + skip_pass_eol, + )))(input)?; + Ok((input, ParserNode::Error)) +} + +fn skip_till_section_element3(input: ParseString) -> ParseResult { + if input.len() == 0 { + return Ok((input, ParserNode::Error)); + } + let (input, _) = skip_pass_eol(input)?; + let (input, _) = many0(tuple(( + is_not(section_element3), + skip_pass_eol, + )))(input)?; + Ok((input, ParserNode::Error)) +} + +pub fn skip_spaces(input: ParseString) -> ParseResult<()> { + let (input, _) = many0(space)(input)?; + Ok((input, ())) +} + +pub fn skip_nil(input: ParseString) -> ParseResult { + Ok((input, ParserNode::Error)) +} + +pub fn skip_empty_mech_directive(input: ParseString) -> ParseResult { + Ok((input, String::from("mech:"))) +} + +// ## Primitive parsers + +pub fn emoji_grapheme(mut input: ParseString) -> ParseResult { + if let Some(matched) = input.consume_emoji() { + Ok((input, matched)) + } else { + Err(nom::Err::Error(ParseError::new(input, "Unexpected character"))) + } +} + +pub fn alpha(mut input: ParseString) -> ParseResult { + if let Some(matched) = input.consume_alpha() { + Ok((input, matched)) + } else { + Err(nom::Err::Error(ParseError::new(input, "Unexpected character"))) + } +} + +pub fn digit(mut input: ParseString) -> ParseResult { + if let Some(matched) = input.consume_digit() { + Ok((input, matched)) + } else { + Err(nom::Err::Error(ParseError::new(input, "Unexpected character"))) + } +} + +pub fn any(mut input: ParseString) -> ParseResult { + if let Some(matched) = input.consume_one() { + Ok((input, matched)) + } else { + Err(nom::Err::Error(ParseError::new(input, "Unexpected eof"))) + } +} + +// ## Parsers + +// ### The basics + +macro_rules! leaf { + ($name:ident, $byte:expr, $token:expr) => ( + fn $name(input: ParseString) -> ParseResult { + let start = input.loc(); + let (input, _) = tag($byte)(input)?; + let end = input.loc(); + let src_range = SourceRange { start, end }; + Ok((input, ParserNode::Token{token: $token, chars: $byte.chars().collect::>(), src_range})) + } + ) +} + +leaf!{at, "@", Token::At} +leaf!{hashtag, "#", Token::HashTag} +leaf!{period, ".", Token::Period} +leaf!{colon, ":", Token::Colon} +leaf!{comma, ",", Token::Comma} +leaf!{percent, "%", Token::Percent} +leaf!{apostrophe, "'", Token::Apostrophe} +leaf!{left_bracket, "[", Token::LeftBracket} +leaf!{right_bracket, "]", Token::RightBracket} +leaf!{left_parenthesis, "(", Token::LeftParenthesis} +leaf!{right_parenthesis, ")", Token::RightParenthesis} +leaf!{left_brace, "{", Token::LeftBrace} +leaf!{right_brace, "}", Token::RightBrace} +leaf!{equal, "=", Token::Equal} +leaf!{left_angle, "<", Token::LessThan} +leaf!{right_angle, ">", Token::GreaterThan} +leaf!{exclamation, "!", Token::Exclamation} +leaf!{question, "?", Token::Question} +leaf!{plus, "+", Token::Plus} +leaf!{dash, "-", Token::Dash} +leaf!{underscore, "_", Token::Underscore} +leaf!{asterisk, "*", Token::Asterisk} +leaf!{slash, "/", Token::Slash} +leaf!{backslash, "\\", Token::Backslash} +leaf!{caret, "^", Token::Caret} +leaf!{space, " ", Token::Space} +leaf!{tab, "\t", Token::Tab} +leaf!{tilde, "~", Token::Tilde} +leaf!{grave, "`", Token::Grave} +leaf!{bar, "|", Token::Bar} +leaf!{quote, "\"", Token::Quote} +leaf!{ampersand, "&", Token::Ampersand} +leaf!{semicolon, ";", Token::Semicolon} +leaf!{new_line_char, "\n", Token::Newline} +leaf!{carriage_return, "\r", Token::CarriageReturn} + +// emoji ::= emoji_grapheme+ ; +fn emoji<'a>(input: ParseString<'a>) -> ParseResult { + let emoji_token = |input: ParseString<'a>| { + let start = input.loc(); + let (input, g) = emoji_grapheme(input)?; + let end = input.loc(); + let src_range = SourceRange { start, end }; + Ok((input, ParserNode::Token{token: Token::Emoji, chars: g.chars().collect::>(), src_range})) + }; + let (input, tokens) = many1(emoji_token)(input)?; + // let chars: Vec = matching.iter().map(|b| ParserNode::Token{token: Token::Emoji, chars: b.chars().collect::>()}).collect(); + Ok((input, ParserNode::Emoji{children: tokens})) +} + +// word ::= alpha+ ; +pub fn word<'a>(input: ParseString<'a>) -> ParseResult { + let alpha_token = |input: ParseString<'a>| { + let (input, (g, src_range)) = range(alpha)(input)?; + Ok((input, ParserNode::Token{token: Token::Alpha, chars: g.chars().collect::>(), src_range})) + }; + let (input, tokens) = many1(alpha_token)(input)?; + // let chars: Vec = matching.iter().map(|b| ParserNode::Token{token: Token::Alpha, chars: b.chars().collect::>()}).collect(); + Ok((input, ParserNode::Word{children: tokens})) +} + +// digit1 ::= digit+ ; +pub fn digit1(input: ParseString) -> ParseResult> { + let result = many1(digit)(input)?; + Ok(result) +} + +// digit0 ::= digit* ; +pub fn digit0(input: ParseString) -> ParseResult> { + let result = many0(digit)(input)?; + Ok(result) +} + +// bin_digit ::= "0" | "1" ; +pub fn bin_digit(input: ParseString) -> ParseResult { + let result = alt((tag("1"),tag("0")))(input)?; + Ok(result) +} + +// hex_digit ::= digit | "a" | "b" | "c" | "d" | "e" | "f" | "A" | "B" | "C" | "D" | "E" | "F" ; +pub fn hex_digit(input: ParseString) -> ParseResult { + let result = alt((digit, tag("a"), tag("b"), tag("c"), tag("d"), tag("e"), tag("f"), + tag("A"), tag("B"), tag("C"), tag("D"), tag("E"), tag("F")))(input)?; + Ok(result) +} + +// oct_digit ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" ; +pub fn oct_digit(input: ParseString) -> ParseResult { + let result = alt((tag("0"),tag("1"),tag("2"),tag("3"),tag("4"),tag("5"),tag("6"),tag("7")))(input)?; + Ok(result) +} + +// number ::= digit1 ; +pub fn number<'a>(input: ParseString<'a>) -> ParseResult { + let digit_token = |input: ParseString<'a>| { + let (input, (g, src_range)) = range(digit)(input)?; + Ok((input, ParserNode::Token{token: Token::Digit, chars: g.chars().collect::>(), src_range})) + }; + let (input, tokens) = many1(digit_token)(input)?; + // let chars: Vec = matching.iter().map(|b| ParserNode::Token{token: Token::Digit, chars: b.chars().collect::>()}).collect(); + Ok((input, ParserNode::Number{children: tokens})) +} + +// punctuation ::= period | exclamation | question | comma | colon | semicolon | dash | apostrophe | left_parenthesis | right_parenthesis | left_angle | right_angle | left_brace | right_brace | left_bracket | right_bracket ; +pub fn punctuation(input: ParseString) -> ParseResult { + let (input, punctuation) = alt((period, exclamation, question, comma, colon, semicolon, dash, apostrophe, left_parenthesis, right_parenthesis, left_angle, right_angle, left_brace, right_brace, left_bracket, right_bracket))(input)?; + Ok((input, ParserNode::Punctuation{children: vec![punctuation]})) +} + +// symbol ::= ampersand | bar | at | slash | backslash | hashtag | equal | tilde | plus | asterisk | asterisk | caret | underscore ; +pub fn symbol(input: ParseString) -> ParseResult { + let (input, symbol) = alt((ampersand, bar, at, slash, backslash, hashtag, equal, tilde, plus, asterisk, caret, underscore))(input)?; + Ok((input, ParserNode::Symbol{children: vec![symbol]})) +} + +// paragraph_symbol ::= ampersand | at | slash | backslash | asterisk | caret | hashtag | underscore ; +pub fn paragraph_symbol(input: ParseString) -> ParseResult { + let (input, symbol) = alt((ampersand, at, slash, backslash, asterisk, caret, hashtag, underscore, equal, tilde, plus, percent))(input)?; + Ok((input, ParserNode::Symbol{children: vec![symbol]})) +} + +// text ::= (word | space | number | punctuation | symbol | emoji)+ ; +pub fn text(input: ParseString) -> ParseResult { + let (input, word) = many1(alt((word, space, number, punctuation, symbol, emoji)))(input)?; + Ok((input, ParserNode::Text{children: word})) +} + +// paragraph_rest ::= (word | space | number | punctuation | paragraph_symbol | quote | emoij)+ ; +pub fn paragraph_rest(input: ParseString) -> ParseResult { + let (input, word) = many1(alt((word, space, number, punctuation, paragraph_symbol, quote, emoji)))(input)?; + Ok((input, ParserNode::Text{children: word})) +} + +// paragraph_starter ::= (word | number | quote | left_angle | right_angle | left_bracket | right_bracket | period | exclamation | question | comma | colon | semicolon | left_parenthesis | right_parenthesis | emoji)+ ; +pub fn paragraph_starter(input: ParseString) -> ParseResult { + let (input, word) = many1(alt((word, number, quote, left_angle, right_angle, left_bracket, right_bracket, period, exclamation, question, comma, colon, semicolon, right_parenthesis, emoji)))(input)?; + Ok((input, ParserNode::Text{children: word})) +} + +// identifier ::= (word | emoji), (word | number | dash | slash | emoji)* ; +pub fn identifier(input: ParseString) -> ParseResult { + let (input, (word, mut rest)) = tuple((alt((word,emoji)), many0(alt((word, number, dash, slash, emoji)))))(input)?; + let mut id = vec![word]; + id.append(&mut rest); + Ok((input, ParserNode::Identifier{children: id})) +} + +// boolean_literal ::= true_literal | false_literal ; +pub fn boolean_literal(input: ParseString) -> ParseResult { + let (input, boolean) = alt((true_literal, false_literal))(input)?; + Ok((input, ParserNode::BooleanLiteral{children: vec![boolean]})) +} + +// true_literal ::= english_true_literal | true_symbol ; +pub fn true_literal(input: ParseString) -> ParseResult { + let (input, _) = alt((english_true_literal, true_symbol))(input)?; + Ok((input, ParserNode::True)) +} + +// false_literal ::= english_false_literal | false_symbol ; +pub fn false_literal(input: ParseString) -> ParseResult { + let (input, _) = alt((english_false_literal, false_symbol))(input)?; + Ok((input, ParserNode::False)) +} + +// true_symbol ::= "✓" ; +pub fn true_symbol(input: ParseString) -> ParseResult { + let (input, _) = tag("✓")(input)?; + Ok((input, ParserNode::False)) +} + +// false_symbol ::= "✗" ; +pub fn false_symbol(input: ParseString) -> ParseResult { + let (input, _) = tag("✗")(input)?; + Ok((input, ParserNode::False)) +} + +// english_true_literal ::= "true" ; +pub fn english_true_literal(input: ParseString) -> ParseResult { + let (input, _) = tag("true")(input)?; + Ok((input, ParserNode::True)) +} + +// english_false_literal ::= "false" ; +pub fn english_false_literal(input: ParseString) -> ParseResult { + let (input, _) = tag("false")(input)?; + Ok((input, ParserNode::False)) +} + +// carriage_newline ::= "\r\n" ; +pub fn carriage_newline(input: ParseString) -> ParseResult { + let (input, _) = tag("\r\n")(input)?; + Ok((input, ParserNode::Null)) +} + +// newline ::= new_line_char | carriage_newline ; +pub fn newline(input: ParseString) -> ParseResult { + let (input, _) = alt((new_line_char, carriage_newline))(input)?; + Ok((input, ParserNode::Null)) +} + +// whitespace ::= space*, newline+ ; +pub fn whitespace(input: ParseString) -> ParseResult { + let (input, _) = many0(space)(input)?; + let (input, _) = many1(newline)(input)?; + Ok((input, ParserNode::Null)) +} + +// pub fn floating_point(input: ParseString) -> ParseResult { +// let (input,_) = period(input)?; +// let (input, chars) = digit1(input)?; +// Ok((input, ParserNode::Null)) +// } + +// pub fn quantity(input: ParseString) -> IResult { +// let (input, number) = number(input)?; +// let (input, float) = opt(floating_point)(input)?; +// let (input, unit) = identifier(input)?; +// let mut quantity = vec![number]; +// match float { +// Some(fp) => quantity.push(fp), +// _ => (), +// }; +// quantity.push(unit); +// Ok((input, ParserNode::Quantity{children: quantity})) +// } + +// number_literal ::= (hexadecimal_literal | octal_literal | binary_literal | decimal_literal | float_literal), kind_annotation? ; +pub fn number_literal(input: ParseString) -> ParseResult { + let (input, number_variant) = alt((hexadecimal_literal, octal_literal, binary_literal, decimal_literal, float_literal))(input)?; + let (input, kind_id) = opt(kind_annotation)(input)?; + let mut children = vec![number_variant]; + match kind_id { + Some(kind_id) => children.push(kind_id), + _ => (), + } + Ok((input, ParserNode::NumberLiteral{children})) +} + +// pub fn rational_number(input: ParseString) -> IResult { +// let (input, numerator) = alt((quantity, number_literal))(input)?; +// let (input, _) = tag("/")(input)?; +// let (input, denominator) = alt((quantity, number_literal))(input)?; +// Ok((input, ParserNode::Null)) +// } + +// float_literal ::= "."?, digit1, "."?, digit0 ; +pub fn float_literal(input: ParseString) -> ParseResult { + let start = input.loc(); + let (input, p1) = opt(tag("."))(input)?; + let (input, p2) = digit1(input)?; + let (input, p3) = opt(tag("."))(input)?; + let (input, p4) = digit0(input)?; + let mut whole: Vec = vec![]; + if let Some(_) = p1 { + whole.push('.'); + } + let mut digits = p2.iter().flat_map(|c| c.chars()).collect::>(); + whole.append(&mut digits); + if let Some(_) = p3 { + whole.push('.'); + } + let mut digits = p4.iter().flat_map(|c| c.chars()).collect::>(); + whole.append(&mut digits); + let end = input.loc(); + let src_range = SourceRange { start, end }; + Ok((input, ParserNode::FloatLiteral{chars: whole, src_range})) +} + +// decimal_literal ::= "0d", ; +pub fn decimal_literal(input: ParseString) -> ParseResult { + let msg = "Expect decimal digits after \"0d\""; + let start = input.loc(); + let (input, _) = tag("0d")(input)?; + let (input, chars) = label!(digit1, msg)(input)?; + let end = input.loc(); + let src_range = SourceRange { start, end }; + Ok((input, ParserNode::DecimalLiteral{chars: chars.iter().flat_map(|c| c.chars()).collect(), src_range})) +} + +// hexadecimal_literal ::= "0x", ; +pub fn hexadecimal_literal(input: ParseString) -> ParseResult { + let msg = "Expect hexadecimal digits after \"0x\""; + let start = input.loc(); + let (input, _) = tag("0x")(input)?; + let (input, chars) = label!(many1(hex_digit), msg)(input)?; + let end = input.loc(); + let src_range = SourceRange { start, end }; + Ok((input, ParserNode::HexadecimalLiteral{chars: chars.iter().flat_map(|c| c.chars()).collect(), src_range})) +} + +// octal_literal ::= "0o", ; +pub fn octal_literal(input: ParseString) -> ParseResult { + let msg = "Expect octal digits after \"0o\""; + let start = input.loc(); + let (input, _) = tag("0o")(input)?; + let (input, chars) = label!(many1(oct_digit), msg)(input)?; + let end = input.loc(); + let src_range = SourceRange { start, end }; + Ok((input, ParserNode::OctalLiteral{chars: chars.iter().flat_map(|c| c.chars()).collect(), src_range})) +} + +// binary_literal ::= "0b", ; +pub fn binary_literal(input: ParseString) -> ParseResult { + let msg = "Expect binary digits after \"0b\""; + let start = input.loc(); + let (input, _) = tag("0b")(input)?; + let (input, chars) = label!(many1(bin_digit), msg)(input)?; + let end = input.loc(); + let src_range = SourceRange { start, end }; + Ok((input, ParserNode::BinaryLiteral{chars: chars.iter().flat_map(|c| c.chars()).collect(), src_range})) +} + +// value ::= empty | boolean_literal | number_literal | string ; +pub fn value(input: ParseString) -> ParseResult { + let (input, value) = alt((empty, boolean_literal, number_literal, string))(input)?; + Ok((input, ParserNode::Value{children: vec![value]})) +} + +// empty ::= underscore+ ; +pub fn empty(input: ParseString) -> ParseResult { + let (input, _) = many1(underscore)(input)?; + Ok((input, ParserNode::Empty)) +} + +// ### Blocks + +// #### Data + +// select_all ::= colon ; +pub fn select_all(input: ParseString) -> ParseResult { + let (input, _) = colon(input)?; + Ok((input, ParserNode::SelectAll)) +} + +// subscript ::= (select_all | expression | tilde), space*, comma?, space* ; +pub fn subscript(input: ParseString) -> ParseResult { + let (input, subscript) = alt((select_all, expression, tilde))(input)?; + let (input, _) = tuple((many0(space), opt(comma), many0(space)))(input)?; + Ok((input, ParserNode::Subscript{children: vec![subscript]})) +} + +// subscript_index ::= left_brace, , ; +pub fn subscript_index(input: ParseString) -> ParseResult { + let msg1 = "Expect subscript"; + let msg2 = "Expect right brace '}'"; + let (input, (_, r)) = range(left_brace)(input)?; + let (input, subscripts) = label!(many1(subscript), msg1)(input)?; + let (input, _) = label!(right_brace, msg2, r)(input)?; + Ok((input, ParserNode::SubscriptIndex{children: subscripts})) +} + +// single_subscript_index ::= left_brace, , ; +pub fn single_subscript_index(input: ParseString) -> ParseResult { + let msg1 = "Expect subscript"; + let msg2 = "Expect right brace '}'"; + let (input, _) = left_brace(input)?; + let (input, subscript) = label!(subscript, msg1)(input)?; + let (input, _) = label!(right_brace, msg2)(input)?; + Ok((input, ParserNode::SubscriptIndex{children: vec![subscript]})) +} + +// dot_index ::= period, , single_subscript_index? ; +pub fn dot_index(input: ParseString) -> ParseResult { + let msg = "Expect identifier"; + let (input, _) = period(input)?; + let (input, identifier) = label!(identifier, msg)(input)?; + let (input, subscript) = opt(single_subscript_index)(input)?; + let index = match subscript { + Some(subscript) => vec![subscript, identifier], + None => vec![ParserNode::Null, identifier], + }; + Ok((input, ParserNode::DotIndex{children: index})) +} + +// swizzle ::= period, identifier, comma, !space, ; +pub fn swizzle(input: ParseString) -> ParseResult { + let msg = "Expect identifier for swizzling"; + let (input, _) = period(input)?; + let (input, first) = identifier(input)?; + let (input, _) = comma(input)?; + let (input, _) = is_not(space)(input)?; // so that it's not a binding + let (input, mut rest) = label!(separated_list1(tag(","), identifier), msg)(input)?; + let mut cols = vec![first]; + cols.append(&mut rest); + Ok((input, ParserNode::Swizzle{children: cols})) +} + +// reshape_column ::= left_brace, colon, right_brace ; +pub fn reshape_column(input: ParseString) -> ParseResult { + let (input, _) = left_brace(input)?; + let (input, _) = colon(input)?; + let (input, _) = right_brace(input)?; + Ok((input, ParserNode::ReshapeColumn)) +} + +// index ::= swizzle | dot_index | reshape_column | subscript_index ; +pub fn index(input: ParseString) -> ParseResult { + let (input, index) = alt((swizzle, dot_index, reshape_column, subscript_index))(input)?; + Ok((input, ParserNode::Index{children: vec![index]})) +} + +// data ::= (table | identifier), index*, transpose? ; +pub fn data(input: ParseString) -> ParseResult { + let (input, source) = alt((table, identifier))(input)?; + let (input, mut indices) = many0(index)(input)?; + let (input, transpose) = opt(transpose)(input)?; + let mut data = vec![source]; + data.append(&mut indices); + match transpose { + Some(transpose) => { + data.push(transpose); + } + _ => (), + } + Ok((input, ParserNode::Data{children: data})) +} + +// kind_annotation ::= left_angle, <(identifier | underscore), (",", (identifier | underscore))*>, ; +pub fn kind_annotation(input: ParseString) -> ParseResult { + let msg2 = "Expect at least one unit in kind annotation"; + let msg3 = "Expect right angle"; + let (input, (_, r)) = range(left_angle)(input)?; + let (input, kind_id) = label!(separated_list1(tag(","), alt((identifier, underscore))), msg2)(input)?; + let (input, _) = label!(right_angle, msg3, r)(input)?; + Ok((input, ParserNode::KindAnnotation{children: kind_id})) +} + +// #### Tables + +// table ::= hashtag, ; +pub fn table(input: ParseString) -> ParseResult { + let msg = "Expect identifier after hashtag"; + let (input, _) = hashtag(input)?; + let (input, table_identifier) = label!(identifier, msg)(input)?; + Ok((input, ParserNode::Table{children: vec![table_identifier]})) +} + +// binding ::= s*, identifier, kind_annotation?, , colon, s+, +// >> , ) | s+> ; +// >> where s ::= space | newline | tab ; +pub fn binding(input: ParseString) -> ParseResult { + let msg1 = "Unexpected space before colon ':'"; + let msg2 = "Expect a value"; + let msg3 = "Expect whitespace or comma followed by whitespace"; + let msg4 = "Expect whitespace"; + let mut children = vec![]; + let (input, _) = many0(alt((space, newline, tab)))(input)?; + let (input, binding_id) = identifier(input)?; + let (input, kind) = opt(kind_annotation)(input)?; + let (input, _) = label!(is_not(tuple((many1(space), colon))), msg1)(input)?; + let (input, _) = colon(input)?; + let (input, _) = many1(alt((space, newline, tab)))(input)?; + let (input, bound) = label!(alt((empty, expression, identifier, value)), msg2)(input)?; + let (input, _) = label!(alt(( + is(right_bracket), + null(tuple(( + many0(alt((space, newline, tab))), + comma, + label!(many1(alt((space, newline, tab))), msg4), + ))), + null(many1(alt((space, newline, tab)))), + )), msg3)(input)?; + children.push(binding_id); + children.push(bound); + if let Some(kind) = kind { children.push(kind); } + Ok((input, ParserNode::Binding{children})) +} + +// binding_strict ::= s*, identifier, kind_annotation?, , colon, , +// >> , ) | s+> ; +// >> where s ::= space | newline | tab ; +pub fn binding_strict(input: ParseString) -> ParseResult { + let msg1 = "Unexpected space before colon ':' for binding"; + let msg2 = "Expect space after ':' for binding"; + let msg3 = "Expect a value"; + let msg4 = "Expect whitespace or comma followed by whitespace"; + let msg5 = "Expect whitespace"; + let mut children = vec![]; + let (input, _) = many0(alt((space, newline, tab)))(input)?; + let (input, binding_id) = identifier(input)?; + let (input, _) = label!(is_not(tuple((many1(space), colon))), msg1)(input)?; + let (input, kind) = opt(kind_annotation)(input)?; + let (input, _) = label!(is_not(tuple((many1(space), colon))), msg1)(input)?; + let (input, _) = colon(input)?; + let (input, _) = label!(many1(alt((space, newline, tab))), msg2)(input)?; + let (input, bound) = label!(alt((empty, expression, identifier, value)), msg3)(input)?; + let (input, _) = label!(alt(( + is(right_bracket), + null(tuple(( + many0(alt((space, newline, tab))), + comma, + label!(many1(alt((space, newline, tab))), msg5), + ))), + null(many1(alt((space, newline, tab)))), + )), msg4)(input)?; + children.push(binding_id); + children.push(bound); + if let Some(kind) = kind { children.push(kind); } + Ok((input, ParserNode::Binding{children})) +} + +// function_binding ::= identifier, , , , space*, comma?, space* ; +pub fn function_binding(input: ParseString) -> ParseResult { + let msg1 = "Expect colon ':' for function binding"; + let msg2 = "Expect space after colon for function binding"; + let msg3 = "Expect expression, identifier, or value to bind"; + let (input, (binding_id, r)) = range(identifier)(input)?; + let (input, _) = label!(colon, msg1)(input)?; + let (input, _) = label!(many1(space), msg2)(input)?; + let (input, bound) = label!(alt((expression, identifier, value)), msg3, r)(input)?; + let (input, _) = tuple((many0(space), opt(comma), many0(space)))(input)?; + Ok((input, ParserNode::FunctionBinding{children: vec![binding_id, bound]})) +} + +// table_column ::= (space | tab)*, (expression | value | data), comma?, (space | tab)* ; +pub fn table_column(input: ParseString) -> ParseResult { + let (input, _) = many0(alt((space, tab)))(input)?; + let (input, item) = alt((expression, value, data))(input)?; + let (input, _) = tuple((opt(comma), many0(alt((space, tab)))))(input)?; + Ok((input, ParserNode::Column{children: vec![item]})) +} + +// table_row ::= (space | tab)*, table_column+, semicolon?, newline? ; +pub fn table_row(input: ParseString) -> ParseResult { + let (input, _) = many0(alt((space, tab)))(input)?; + let (input, columns) = many1(table_column)(input)?; + let (input, _) = tuple((opt(semicolon), opt(newline)))(input)?; + Ok((input, ParserNode::TableRow{children: columns})) +} + +// attribute ::= identifier, kind_annotation?, space*, comma?, space* ; +pub fn attribute(input: ParseString) -> ParseResult { + let mut children = vec![]; + let (input, identifier) = identifier(input)?; + children.push(identifier); + let (input, kind) = opt(kind_annotation)(input)?; + let (input, _) = tuple((many0(space), opt(comma), many0(space)))(input)?; + if let Some(kind) = kind { children.push(kind); } + Ok((input, ParserNode::Attribute{children})) +} + +// table_header ::= bar, , , space*, newline? ; +pub fn table_header(input: ParseString) -> ParseResult { + let msg1 = "Expect at least one attribute for table header"; + let msg2 = "Expect vertical bar to terminate table header"; + let (input, (_, r)) = range(bar)(input)?; + let (input, attributes) = label!(many1(attribute), msg1)(input)?; + let (input, _) = tuple((label!(bar, msg2, r), many0(space), opt(newline)))(input)?; + Ok((input, ParserNode::TableHeader{children: attributes})) +} + +// anonymous_table ::= left_bracket, (space | newline | tab)*, table_header?, +// >> ((comment, newline) | table_row)*, (space | newline | tab)*, ; +pub fn anonymous_table(input: ParseString) -> ParseResult { + let msg = "Expect right bracket ']' to finish the table"; + let (input, (_, r)) = range(left_bracket)(input)?; + let (input, _) = many0(alt((space, newline, tab)))(input)?; + let (mut input, table_header) = opt(table_header)(input)?; + let mut table_rows = vec![]; + loop { + let (i, mut rows) = many0(table_row)(input)?; + let (i, comments) = many0(tuple((comment, newline)))(i)?; + table_rows.append(&mut rows); + input = i; + if comments.is_empty() { + break; + } + } + let (input, _) = many0(alt((space, newline, tab)))(input)?; + let (input, _) = label!(right_bracket, msg, r)(input)?; + let mut table = vec![]; + match table_header { + Some(table_header) => table.push(table_header), + _ => (), + }; + table.append(&mut table_rows); + Ok((input, ParserNode::AnonymousTable{children: table})) +} + +// empty_table ::= left_bracket, (space | newline | tab)*, table_header?, (space | newline | tab)*, right_bracket ; +pub fn empty_table(input: ParseString) -> ParseResult { + let (input, _) = left_bracket(input)?; + let (input, _) = many0(alt((space, newline, tab)))(input)?; + let (input, table_header) = opt(table_header)(input)?; + let (input, _) = many0(alt((space, newline, tab)))(input)?; + let (input, _) = right_bracket(input)?; + let mut table = vec![]; + match table_header { + Some(table_header) => table.push(table_header), + _ => (), + }; + Ok((input, ParserNode::EmptyTable{children: table})) +} + +// pub fn anonymous_matrix(input: ParseString) -> ParseResult { +// let (input, _) = left_angle(input)?; +// let (input, _) = many0(alt((space, newline, tab)))(input)?; +// let (input, _) = many0(space)(input)?; +// let (input, table_header) = opt(table_header)(input)?; +// let (input, mut table_rows) = many0(table_row)(input)?; +// let (input, _) = many0(alt((space, newline, tab)))(input)?; +// let (input, _) = right_angle(input)?; +// let mut table = vec![]; +// match table_header { +// Some(table_header) => table.push(table_header), +// _ => (), +// }; +// table.append(&mut table_rows); +// Ok((input, ParserNode::AnonymousMatrix{children: table})) +// } + +// inline_table ::= left_bracket, binding, , ; +pub fn inline_table(input: ParseString) -> ParseResult { + let msg = "Expect right bracket ']' to terminate inline table"; + let (input, (_, r)) = range(left_bracket)(input)?; + let (input, first_binding) = binding(input)?; + let (input, mut other_bindings) = many0(binding_strict)(input)?; + let (input, _) = label!(right_bracket, msg, r)(input)?; + let mut bindings = vec![first_binding]; + bindings.append(&mut other_bindings); + Ok((input, ParserNode::InlineTable{children: bindings})) +} + +// #### Statements + +// stmt_operator ::= split_operator | flatten_operator | set_operator | update_operator | add_row_operator | equal ; +pub fn stmt_operator(input: ParseString) -> ParseResult { + let (input, _) = alt((split_operator, flatten_operator, set_operator, update_operator, add_row_operator, equal, async_assign_operator))(input)?; + Ok((input, ParserNode::Null)) +} + +// comment_sigil ::= "--" ; +pub fn comment_sigil(input: ParseString) -> ParseResult { + let (input, _) = tag("--")(input)?; + Ok((input, ParserNode::Null)) +} + +// comment ::= (space | tab)*, comment_sigil, , ; +pub fn comment(input: ParseString) -> ParseResult { + let msg1 = "Expect comment text"; + let msg2 = "Character not allowed in comment text"; + let (input, _) = many0(alt((space, tab)))(input)?; + let (input, _) = comment_sigil(input)?; + let (input, comment) = labelr!(text, skip_nil, msg1)(input)?; + let (input, _) = labelr!(is(newline), skip_till_eol, msg2)(input)?; + Ok((input, ParserNode::Comment{children: vec![comment]})) +} + +// add_row_operator ::= "+=" ; +pub fn add_row_operator(input: ParseString) -> ParseResult { + let (input, _) = tag("+=")(input)?; + Ok((input, ParserNode::Null)) +} + +// async_assign_operator ::= "<~" ; +pub fn async_assign_operator(input: ParseString) -> ParseResult { + let (input, _) = tag("<~")(input)?; + Ok((input, ParserNode::Null)) +} + +// add_row ::= table, , space*, add_row_operator, , ; +pub fn add_row(input: ParseString) -> ParseResult { + let msg1 = "Expect spaces around operator"; + let msg2 = "Expect expression, inline table, or anonymous table"; + let (input, table_id) = table(input)?; + let (input, _) = labelr!(null(is_not(stmt_operator)), skip_nil, msg1)(input)?; + let (input, _) = many0(space)(input)?; + let (input, _) = add_row_operator(input)?; + let (input, _) = labelr!(null(many1(space)), skip_nil, msg1)(input)?; + let (input, table) = label!(alt((expression, inline_table, anonymous_table)), msg2)(input)?; + Ok((input, ParserNode::AddRow{children: vec![table_id, table]})) +} + +// add_update_operator ::= ":+=" ; +pub fn add_update_operator(input: ParseString) -> ParseResult { + let (input, _) = tag(":+=")(input)?; + Ok((input, ParserNode::AddUpdate)) +} + +// subtract_update_operator ::= ":-=" ; +pub fn subtract_update_operator(input: ParseString) -> ParseResult { + let (input, _) = tag(":-=")(input)?; + Ok((input, ParserNode::SubtractUpdate)) +} + +// multiply_update_operator ::= ":*=" ; +pub fn multiply_update_operator(input: ParseString) -> ParseResult { + let (input, _) = tag(":*=")(input)?; + Ok((input, ParserNode::MultiplyUpdate)) +} + +// divide_update_operator ::= ":/=" ; +pub fn divide_update_operator(input: ParseString) -> ParseResult { + let (input, _) = tag(":/=")(input)?; + Ok((input, ParserNode::DivideUpdate)) +} + +// pub fn update_exponent_operator(input: ParseString) -> ParseResult { +// let (input, _) = tag(":^=")(input)?; +// Ok((input, ParserNode::ExponentUpdate)) +// } + +// pub fn update_matrix_multiply_operator(input: ParseString) -> ParseResult { +// let (input, _) = tag(":**=")(input)?; +// Ok((input, ParserNode::Null)) +// } + +// update_operator ::= add_update_operator | subtract_update_operator | multiply_update_operator | divide_update_operator ; +pub fn update_operator(input: ParseString) -> ParseResult { + alt((add_update_operator,subtract_update_operator,multiply_update_operator,divide_update_operator))(input) +} + +// update_data ::= data, , space*, update_operator, , ; +pub fn update_data(input: ParseString) -> ParseResult { + let msg1 = "Expect spaces around operator"; + let msg2 = "Expect expression"; + let (input, table) = data(input)?; + let (input, _) = labelr!(null(is_not(stmt_operator)), skip_nil, msg1)(input)?; + let (input, _) = many0(space)(input)?; + let (input, op) = update_operator(input)?; + let (input, _) = labelr!(null(many1(space)), skip_nil, msg1)(input)?; + let (input, expression) = label!(expression, msg2)(input)?; + Ok((input, ParserNode::UpdateData{children: vec![op, table, expression]})) +} + +// async_assign ::= (identifier | table), , space*, async_assign_operator, , ; +pub fn async_assign(input: ParseString) -> ParseResult { + let msg1 = "Expect spaces around operator"; + let msg2 = "Expect expression"; + let (input, table) = alt((identifier, table))(input)?; + let (input, _) = labelr!(null(is_not(stmt_operator)), skip_nil, msg1)(input)?; + let (input, _) = many0(space)(input)?; + let (input, _) = async_assign_operator(input)?; + let (input, _) = labelr!(null(many1(space)), skip_nil, msg1)(input)?; + let (input, expression) = label!(expression, msg2)(input)?; + Ok((input, ParserNode::AsyncAssign{children: vec![table, expression]})) +} + +// set_operator ::= ":=" ; +pub fn set_operator(input: ParseString) -> ParseResult { + let (input, _) = tag(":=")(input)?; + Ok((input, ParserNode::Null)) +} + +// set_data ::= data, , space*, set_operator, , ; +pub fn set_data(input: ParseString) -> ParseResult { + let msg1 = "Expect spaces around operator"; + let msg2 = "Expect expression"; + let (input, table) = data(input)?; + let (input, _) = labelr!(null(is_not(stmt_operator)), skip_nil, msg1)(input)?; + let (input, _) = many0(space)(input)?; + let (input, _) = set_operator(input)?; + let (input, _) = labelr!(null(many1(space)), skip_nil, msg1)(input)?; + let (input, expression) = label!(expression, msg2)(input)?; + Ok((input, ParserNode::SetData{children: vec![table, expression]})) +} + +// split_data ::= (identifier | table), , space*, split_operator, , ; +pub fn split_data(input: ParseString) -> ParseResult { + let msg1 = "Expect spaces around operator"; + let msg2 = "Expect expression"; + let (input, table) = alt((identifier, table))(input)?; + let (input, _) = labelr!(null(is_not(stmt_operator)), skip_nil, msg1)(input)?; + let (input, _) = many0(space)(input)?; + let (input, _) = split_operator(input)?; + let (input, _) = labelr!(null(many1(space)), skip_nil, msg1)(input)?; + let (input, expression) = label!(expression, msg2)(input)?; + Ok((input, ParserNode::SplitData{children: vec![table, expression]})) +} + +// flatten_data ::= identifier, , space*, flatten_operator, , ; +pub fn flatten_data(input: ParseString) -> ParseResult { + let msg1 = "Expect spaces around operator"; + let msg2 = "Expect expression"; + let (input, table) = identifier(input)?; + let (input, _) = labelr!(null(is_not(stmt_operator)), skip_nil, msg1)(input)?; + let (input, _) = many0(space)(input)?; + let (input, _) = flatten_operator(input)?; + let (input, _) = labelr!(null(many1(space)), skip_nil, msg1)(input)?; + let (input, expression) = label!(expression, msg2)(input)?; + Ok((input, ParserNode::FlattenData{children: vec![table, expression]})) +} + +// variable_define ::= identifier, , space*, equal, , ; +pub fn variable_define(input: ParseString) -> ParseResult { + let msg1 = "Expect spaces around operator"; + let msg2 = "Expect expression"; + let (input, variable) = identifier(input)?; + let (input, _) = labelr!(null(is_not(stmt_operator)), skip_nil, msg1)(input)?; + let (input, _) = many0(space)(input)?; + let (input, _) = equal(input)?; + let (input, _) = labelr!(null(many1(space)), skip_nil, msg1)(input)?; + let (input, expression) = label!(expression, msg2)(input)?; + Ok((input, ParserNode::VariableDefine{children: vec![variable, expression]})) +} + +pub fn table_define(input: ParseString) -> ParseResult { + alt((raw_table_define, formatted_table_define))(input) +} + +pub fn raw_table_define(input: ParseString) -> ParseResult { + let msg1 = "Expect spaces around operator"; + let msg2 = "Expect expression"; + let mut children = vec![]; + let (input, table) = table(input)?; + children.push(table); + let (input, kind_id) = opt(kind_annotation)(input)?; + if let Some(kind_id) = kind_id { children.push(kind_id); } + let (input, _) = labelr!(null(is_not(stmt_operator)), skip_nil, msg1)(input)?; + let (input, _) = many0(space)(input)?; + let (input, _) = equal(input)?; + let (input, _) = labelr!(null(many1(space)), skip_nil, msg1)(input)?; + let (input, expression) = label!(expression, msg2)(input)?; + children.push(expression); + Ok((input, ParserNode::TableDefine{children})) +} +// parser for table in output format +pub fn formatted_table_define(input: ParseString) -> ParseResult { + let (input, _) = table_line(input)?; + let (input, name) = table_name(input)?; + let (input, _) = table_line(input)?; + let (input, table) = alt((table_with_column, table_no_column))(input)?; + let mut children = vec![]; + children.push(name); + children.push(table); + Ok((input, ParserNode::TableDefine{children})) +} +pub fn table_with_column(input: ParseString) -> ParseResult { + let (input, table_header) = formatted_table_columns(input)?; + let (input, _) = table_line(input)?; + let (input, _) = table_kinds(input)?; + let (input, _) = table_line(input)?; + let (input, mut items) = many1(table_items)(input)?; + let (input, _) = table_line(input)?; + let mut table = vec![]; + table.push(table_header); + table.append(&mut items); + Ok((input,ParserNode::AnonymousTable { children: table })) +} +pub fn table_no_column(input: ParseString) -> ParseResult { + let (input, _) = table_kinds(input)?; + let (input, _) = table_line(input)?; + let (input, mut items) = many1(table_items)(input)?; + let (input, _) = table_line(input)?; + let mut table = vec![]; + table.append(&mut items); + Ok((input,ParserNode::AnonymousTable { children: table })) +} +// parser for any line in the output table +pub fn table_line(input: ParseString) -> ParseResult { + let(input, _) = alt((tag("╭"), tag("├"), tag("╰")))(input)?; + let(input, _) = many1(alt((tag("┼"),tag("─"),tag("┬"),tag("┴"))))(input)?; + let(input, _) = alt((tag("╮"), tag("┤"), tag("╯")))(input)?; + let(input, _) = newline(input)?; + Ok((input, ParserNode::Null)) +} +pub fn formatted_table_columns(input: ParseString) -> ParseResult { + let(input, _) = tag("│")(input)?; + let (input, attr) = many1(formatted_table_column)(input)?; + let(input, _) = newline(input)?; + Ok((input, ParserNode::TableHeader { children: attr })) +} +pub fn formatted_table_column(input: ParseString) -> ParseResult { + let (input, _) = many0(space)(input)?; + let (input, item) = identifier(input)?; + let (input, _) = many1(space)(input)?; + let (input, _) = tag("│")(input)?; + Ok((input, ParserNode::Attribute { children: vec![item] })) +} +// parser for the second line of the output table, generate the +// var name if there is one. +pub fn table_name(input: ParseString) -> ParseResult { + let(input, _) = tag("│")(input)?; + let(input, table_name) = table(input)?; + let(input, s) = many0(alt((space, left_parenthesis, right_parenthesis, word, number)))(input)?; + let(input, _) = tag("│")(input)?; + let(input, _) = newline(input)?; + Ok((input,table_name)) +} +pub fn table_kinds(input: ParseString) -> ParseResult { + let(input, _) = tag("│")(input)?; + let (input, _) = many1(table_kind)(input)?; + let(input, _) = newline(input)?; + Ok((input, ParserNode::Null)) +} +pub fn table_kind(input: ParseString) -> ParseResult { + let (input, _) = many0(space)(input)?; + let (input, kind_id) = identifier(input)?; + let (input, _) = many1(space)(input)?; + let (input, _) = tag("│")(input)?; + Ok((input, ParserNode::KindAnnotation { children: (vec![kind_id]) })) +} +pub fn table_items(input: ParseString) -> ParseResult { + let(input, _) = tag("│")(input)?; + let (input, mut table_items) = many1(table_item)(input)?; + let(input, _) = newline(input)?; + Ok((input, ParserNode::TableRow{children:table_items})) +} +pub fn table_item(input: ParseString) -> ParseResult { + let (input, _) = many0(space)(input)?; + let (input, item) = expression(input)?; + let (input, _) = many1(space)(input)?; + let (input, _) = tag("│")(input)?; + Ok((input, ParserNode::Column { children: vec![item] })) +} +pub fn table_select(input: ParseString) -> ParseResult { + let (input, expression) = expression(input)?; + Ok((input, ParserNode::TableSelect{children: vec![expression]})) +} + +// split_operator ::= ">-" ; +pub fn split_operator(input: ParseString) -> ParseResult { + let (input, _) = tag(">-")(input)?; + Ok((input, ParserNode::Null)) +} + +// flatten_operator ::= "-<" ; +pub fn flatten_operator(input: ParseString) -> ParseResult { + let (input, _) = tag("-<")(input)?; + Ok((input, ParserNode::Null)) +} + +// whenever_operator ::= "~" ; +pub fn whenever_operator(input: ParseString) -> ParseResult { + let (input, _) = tag("~")(input)?; + Ok((input, ParserNode::Null)) +} + +// until_operator ::= "~|" ; +pub fn until_operator(input: ParseString) -> ParseResult { + let (input, _) = tag("~|")(input)?; + Ok((input, ParserNode::Null)) +} + +// wait_operator ::= "|~" ; +pub fn wait_operator(input: ParseString) -> ParseResult { + let (input, _) = tag("|~")(input)?; + Ok((input, ParserNode::Null)) +} + +// followed_by_operator ::= "~>" ; +pub fn followed_by_operator(input: ParseString) -> ParseResult { + let (input, _) = tag("~>")(input)?; + Ok((input, ParserNode::Null)) +} + +// followed_by ::= table, kind_annotation?, , space*, equal, , , space*, , space*, ; +pub fn followed_by(input: ParseString) -> ParseResult { + let msg1 = "Expect spaces around operator"; + let msg2 = "Expect expression"; + let mut children = vec![]; + let (input, table) = table(input)?; + children.push(table); + let (input, kind_id) = opt(kind_annotation)(input)?; + if let Some(kind_id) = kind_id { children.push(kind_id); } + let (input, _) = labelr!(null(is_not(stmt_operator)), skip_nil, msg1)(input)?; + let (input, _) = many0(space)(input)?; + let (input, _) = equal(input)?; + let (input, _) = labelr!(null(many1(space)), skip_nil, msg1)(input)?; + let (input, nexpression) = label!(expression, msg2)(input)?; + children.push(nexpression); + let (input, _) = labelr!(null(many1(space)), skip_nil, msg1)(input)?; + let (input, _) = followed_by_operator(input)?; + let (input, _) = labelr!(null(many1(space)), skip_nil, msg1)(input)?; + let (input, nexpression) = label!(expression, msg2)(input)?; + children.push(nexpression); + Ok((input, ParserNode::FollowedBy{children})) +} + +// whenever_data ::= whenever_operator, , , ; +pub fn whenever_data(input: ParseString) -> ParseResult { + let msg1 = "Expect exactly 1 space after \"whenever\" operator"; + let msg2 = "Expect variable define, expression, or data"; + let (input, _) = whenever_operator(input)?; + let (input, _) = labelr!(space, skip_nil, msg1)(input)?; + let (input, _) = labelr!(is_not(space), skip_spaces, msg1)(input)?; + let (input, watch) = label!(alt((variable_define, expression, data)), msg2)(input)?; + Ok((input, ParserNode::Whenever{children: vec![watch]})) +} + +// wait_data ::= wait_operator, , , ; +pub fn wait_data(input: ParseString) -> ParseResult { + let msg1 = "Expect exactly 1 space after \"wait\" operator"; + let msg2 = "Expect variable define, expression, or data"; + let (input, _) = wait_operator(input)?; + let (input, _) = labelr!(space, skip_nil, msg1)(input)?; + let (input, _) = labelr!(is_not(space), skip_spaces, msg1)(input)?; + let (input, watch) = label!(alt((variable_define, expression, data)), msg2)(input)?; + Ok((input, ParserNode::Wait{children: vec![watch]})) +} + +// until_data ::= until_operator, , , ; +pub fn until_data(input: ParseString) -> ParseResult { + let msg1 = "Expect exactly 1 space after \"until\" operator"; + let msg2 = "Expect variable define, expression, or data"; + let (input, _) = until_operator(input)?; + let (input, _) = labelr!(space, skip_nil, msg1)(input)?; + let (input, _) = labelr!(is_not(space), skip_spaces, msg1)(input)?; + let (input, watch) = label!(alt((variable_define, expression, data)), msg2)(input)?; + Ok((input, ParserNode::Until{children: vec![watch]})) +} + +// statement ::= (followed_by | async_assign | table_define | variable_define | split_data | flatten_data | whenever_data | wait_data | +// >> until_data | set_data | update_data | add_row | comment ), space*, ; +pub fn statement(input: ParseString) -> ParseResult { + let msg = "Expect newline to terminate statement"; + let (input, (statement, src_range)) = range(alt((followed_by, async_assign, table_define, variable_define, split_data, flatten_data, whenever_data, wait_data, until_data, set_data, update_data, add_row, comment)))(input)?; + let (input, _) = many0(space)(input)?; + let (input, _) = label!(many1(newline), msg)(input)?; + Ok((input, ParserNode::Statement{children: vec![statement], src_range})) +} + +// #### Expressions + +// ##### Math expressions + +// parenthetical_expression ::= left_parenthesis, , ; +pub fn parenthetical_expression(input: ParseString) -> ParseResult { + let msg1 = "Expect expression"; + let msg2 = "Expect right parenthesis ')'"; + let (input, (_, r)) = range(left_parenthesis)(input)?; + let (input, l0) = label!(l0, msg1)(input)?; + let (input, _) = label!(right_parenthesis, msg2, r)(input)?; + Ok((input, l0)) +} + +// TODO: This won't parse -(5 - 3) +// negation ::= dash, !(dash | space), ; +pub fn negation(input: ParseString) -> ParseResult { + let msg = "Expect a value to immediately follow the negation sign"; + let (input, (_, r)) = range(dash)(input)?; + let (input, _) = is_not(alt((dash, space)))(input)?; // so it's not comment sigil + let (input, negated) = label!(alt((data, value)), msg, r)(input)?; + Ok((input, ParserNode::Negation { children: vec![negated] })) +} + +// function ::= identifier, left_parenthesis, , ; +pub fn function(input: ParseString) -> ParseResult { + let msg1 = "Expect function binding"; + let msg2 = "Expect right parenthesis ')'"; + let (input, identifier) = identifier(input)?; + let (input, (_, r)) = range(left_parenthesis)(input)?; + let (input, mut bindings) = label!(many1(function_binding), msg1)(input)?; + let (input, _) = label!(right_parenthesis, msg2, r)(input)?; + let mut function = vec![identifier]; + function.append(&mut bindings); + Ok((input, ParserNode::Function { children: function })) +} + +// user_function ::= left_bracket, function_output*, , , , , , +// >> , , , , ; +pub fn user_function(input: ParseString) -> ParseResult { + let msg1 = "Expect right bracket for user function definition"; + let msg2 = "Expect space after output declaration"; + let msg3 = "Expect equal sign '='"; + let msg4 = "Expect space after equal sign"; + let msg5 = "Expect identifier for function name"; + let msg6 = "Expect left parenthesis '('"; + let msg7 = "Expect right parenthesis ')'"; + let msg8 = "Expect newline after user function header"; + let msg9 = "Expect indented transformations for function body"; + let start = input.loc(); + let (input, (_, r1)) = range(left_bracket)(input)?; + let (input, mut output_args) = many0(function_output)(input)?; + let (input, _) = label!(right_bracket, msg1, r1)(input)?; + let (input, _) = label!(many1(space), msg2)(input)?; + let (input, _) = label!(equal, msg3)(input)?; + let (input, _) = label!(many1(space), msg4)(input)?; + let (input, function_name) = label!(identifier, msg5)(input)?; + let (input, (_, r2)) = label!(range(left_parenthesis), msg6)(input)?; + let (input, mut input_args) = many0(function_input)(input)?; + let (input, _) = label!(right_parenthesis, msg7, r2)(input)?; + let (input, _) = label!(newline, msg8)(input)?; + let end = input.loc(); + let (input, function_body) = label!(function_body, msg9, SourceRange {start, end})(input)?; + Ok((input, ParserNode::UserFunction { children: vec![ParserNode::FunctionArgs{children: output_args}, function_name, ParserNode::FunctionArgs{children: input_args}, function_body] })) +} + +// function_output ::= identifier, , space*, comma?, space* ; +pub fn function_output(input: ParseString) -> ParseResult { + let msg = "Expect kind annotation"; + let (input, arg_id) = identifier(input)?; + let (input, kind) = label!(kind_annotation, msg)(input)?; + let (input, _) = tuple((many0(space), opt(comma), many0(space)))(input)?; + Ok((input, ParserNode::FunctionOutput{children: vec![arg_id, kind]})) +} + +// function_input ::= identifier, , space*, comma?, space* ; +pub fn function_input(input: ParseString) -> ParseResult { + let msg = "Expect kind annotation"; + let (input, arg_id) = identifier(input)?; + let (input, kind) = label!(kind_annotation, msg)(input)?; + let (input, _) = tuple((many0(space), opt(comma), many0(space)))(input)?; + Ok((input, ParserNode::FunctionInput{children: vec![arg_id, kind]})) +} + +// function_body ::= indented_tfm+, whitespace* ; +pub fn function_body(input: ParseString) -> ParseResult { + let (input, transformations) = many1(indented_tfm)(input)?; + let (input, _) = many0(whitespace)(input)?; + Ok((input, ParserNode::FunctionBody { children: transformations })) +} + +// matrix_multiply ::= "**" ; +pub fn matrix_multiply(input: ParseString) -> ParseResult { + let (input, _) = tag("**")(input)?; + Ok((input, ParserNode::MatrixMultiply)) +} + +// add ::= "+" ; +pub fn add(input: ParseString) -> ParseResult { + let (input, _) = tag("+")(input)?; + Ok((input, ParserNode::Add)) +} + +// subtract ::= "-" ; +pub fn subtract(input: ParseString) -> ParseResult { + let (input, _) = tag("-")(input)?; + Ok((input, ParserNode::Subtract)) +} + +// multiply ::= "*" ; +pub fn multiply(input: ParseString) -> ParseResult { + let (input, _) = tag("*")(input)?; + Ok((input, ParserNode::Multiply)) +} + +// divide ::= "/" ; +pub fn divide(input: ParseString) -> ParseResult { + let (input, _) = tag("/")(input)?; + Ok((input, ParserNode::Divide)) +} + +// exponent ::= "^" ; +pub fn exponent(input: ParseString) -> ParseResult { + let (input, _) = tag("^")(input)?; + Ok((input, ParserNode::Exponent)) +} + +// range_op ::= colon ; +pub fn range_op(input: ParseString) -> ParseResult { + let (input, _) = colon(input)?; + Ok((input, ParserNode::Range)) +} + +// l0 ::= l1, l0_infix* ; +pub fn l0(input: ParseString) -> ParseResult { + let (input, l1) = l1(input)?; + let (input, mut infix) = many0(l0_infix)(input)?; + let mut math = vec![l1]; + math.append(&mut infix); + Ok((input, ParserNode::L0 { children: math })) +} + +// l0_infix ::= , range_op, , ; +pub fn l0_infix(input: ParseString) -> ParseResult { + let msg1 = "Unexpected space around range operator"; + let msg2 = "Expect expression after range operator"; + let (input, _) = labelr!(is_not(tuple((many1(space), colon))), skip_spaces, msg1)(input)?; + let (input, (op, r)) = range(range_op)(input)?; + let (input, _) = labelr!(is_not(space), skip_spaces, msg1)(input)?; + let (input, l1) = label!(l1, msg2, r)(input)?; + Ok((input, ParserNode::L0Infix { children: vec![op, l1] })) +} + +// l1 ::= l2, l1_infix* ; +pub fn l1(input: ParseString) -> ParseResult { + let (input, l2) = l2(input)?; + let (input, mut infix) = many0(l1_infix)(input)?; + let mut math = vec![l2]; + math.append(&mut infix); + Ok((input, ParserNode::L1 { children: math })) +} + +// l1_op ::= add | subtract ; +pub fn l1_op(input: ParseString) -> ParseResult { + alt((add, subtract))(input) +} + +// l1_infix ::= , space*, !negation, !comment_sigil, l1_op, , ; +pub fn l1_infix(input: ParseString) -> ParseResult { + let msg1 = "Expect spaces around opeartor"; + let msg2 = "Expect expression after operator"; + let (input, _) = labelr!(null(is_not(l1_op)), skip_nil, msg1)(input)?; + let (input, _) = many0(space)(input)?; + let (input, _) = is_not(negation)(input)?; + let (input, _) = is_not(comment_sigil)(input)?; + let (input, op) = l1_op(input)?; + let (input, _) = labelr!(null(many1(space)), skip_nil, msg1)(input)?; + let (input, l2) = label!(l2, msg2)(input)?; + Ok((input, ParserNode::L1Infix { children: vec![op, l2] })) +} + +// l2 ::= l3, l2_infix* ; +pub fn l2(input: ParseString) -> ParseResult { + let (input, l3) = l3(input)?; + let (input, mut infix) = many0(l2_infix)(input)?; + let mut math = vec![l3]; + math.append(&mut infix); + Ok((input, ParserNode::L2 { children: math })) +} + +// l2_op ::= matrix_multiply | multiply | divide ; +pub fn l2_op(input: ParseString) -> ParseResult { + alt((matrix_multiply, multiply, divide))(input) +} + +// l2_infix ::= , space*, l2_op, , ; +pub fn l2_infix(input: ParseString) -> ParseResult { + let msg1 = "Expect spaces around opeartor"; + let msg2 = "Expect expression after operator"; + let (input, _) = labelr!(null(is_not(l2_op)), skip_nil, msg1)(input)?; + let (input, _) = many0(space)(input)?; + let (input, op) = l2_op(input)?; + let (input, _) = labelr!(null(many1(space)), skip_nil, msg1)(input)?; + let (input, l3) = label!(l3, msg2)(input)?; + Ok((input, ParserNode::L2Infix { children: vec![op, l3] })) +} + +// l3 ::= l4, l3_infix* ; +pub fn l3(input: ParseString) -> ParseResult { + let (input, l4) = l4(input)?; + let (input, mut infix) = many0(l3_infix)(input)?; + let mut math = vec![l4]; + math.append(&mut infix); + Ok((input, ParserNode::L3 { children: math })) +} + +// l3_op ::= exponent ; +pub fn l3_op(input: ParseString) -> ParseResult { + exponent(input) +} + +// l3_infix ::= , space*, l3_op, , ; +pub fn l3_infix(input: ParseString) -> ParseResult { + let msg1 = "Expect spaces around opeartor"; + let msg2 = "Expect expression after operator"; + let (input, _) = labelr!(null(is_not(l3_op)), skip_nil, msg1)(input)?; + let (input, _) = many0(space)(input)?; + let (input, op) = l3_op(input)?; + let (input, _) = labelr!(null(many1(space)), skip_nil, msg1)(input)?; + let (input, l4) = label!(l4, msg2)(input)?; + Ok((input, ParserNode::L3Infix { children: vec![op, l4] })) +} + +// l4 ::= l5, l4_infix* ; +pub fn l4(input: ParseString) -> ParseResult { + let (input, l5) = l5(input)?; + let (input, mut infix) = many0(l4_infix)(input)?; + let mut math = vec![l5]; + math.append(&mut infix); + Ok((input, ParserNode::L4 { children: math })) +} + +// l4_op ::= and | or | xor ; +pub fn l4_op(input: ParseString) -> ParseResult { + alt((and, or, xor))(input) +} + +// l4_infix ::= , space*, l4_op, , ; +pub fn l4_infix(input: ParseString) -> ParseResult { + let msg1 = "Expect spaces around opeartor"; + let msg2 = "Expect expression after operator"; + let (input, _) = labelr!(null(is_not(l4_op)), skip_nil, msg1)(input)?; + let (input, _) = many0(space)(input)?; + let (input, op) = l4_op(input)?; + let (input, _) = labelr!(null(many1(space)), skip_nil, msg1)(input)?; + let (input, l5) = label!(l5, msg2)(input)?; + Ok((input, ParserNode::L4Infix { children: vec![op, l5] })) +} + +// l5 ::= l6, l5_infix* ; +pub fn l5(input: ParseString) -> ParseResult { + let (input, l6) = l6(input)?; + let (input, mut infix) = many0(l5_infix)(input)?; + let mut math = vec![l6]; + math.append(&mut infix); + Ok((input, ParserNode::L5 { children: math })) +} + +// l5_op ::= not_equal | equal_to | greater_than_equal | greater_than | less_than_equal | less_than ; +pub fn l5_op(input: ParseString) -> ParseResult { + alt((not_equal, equal_to, greater_than_equal, greater_than, less_than_equal, less_than))(input) +} + +// l5_infix ::= , space*, l5_op, , ; +pub fn l5_infix(input: ParseString) -> ParseResult { + let msg1 = "Expect spaces around opeartor"; + let msg2 = "Expect expression after operator"; + let (input, _) = labelr!(null(is_not(l5_op)), skip_nil, msg1)(input)?; + let (input, _) = many0(space)(input)?; + let (input, op) = l5_op(input)?; + let (input, _) = labelr!(null(many1(space)), skip_nil, msg1)(input)?; + let (input, l6) = label!(l6, msg2)(input)?; + Ok((input, ParserNode::L5Infix { children: vec![op, l6] })) +} + +// l6 ::= empty_table | string | anonymous_table | function | value | not | data | negation | parenthetical_expression ; +pub fn l6(input: ParseString) -> ParseResult { + let (input, l6) = alt((empty_table, string, anonymous_table, function, value, not, data, negation, parenthetical_expression))(input)?; + Ok((input, ParserNode::L6 { children: vec![l6] })) +} + +// math_expression ::= l0 ; +pub fn math_expression(input: ParseString) -> ParseResult { + let (input, l0) = l0(input)?; + Ok((input, ParserNode::MathExpression { children: vec![l0] })) +} + +// ##### Filter expressions + +// not_equal ::= "!=" | "¬=" | "≠" ; +pub fn not_equal(input: ParseString) -> ParseResult { + let (input, _) = alt((tag("!="),tag("¬="),tag("≠")))(input)?; + Ok((input, ParserNode::NotEqual)) +} + +// equal_to ::= "==" ; +pub fn equal_to(input: ParseString) -> ParseResult { + let (input, _) = tag("==")(input)?; + Ok((input, ParserNode::Equal)) +} + +// greater_than ::= ">" ; +pub fn greater_than(input: ParseString) -> ParseResult { + let (input, _) = tag(">")(input)?; + Ok((input, ParserNode::GreaterThan)) +} + +// less_than ::= "<" ; +pub fn less_than(input: ParseString) -> ParseResult { + let (input, _) = tag("<")(input)?; + Ok((input, ParserNode::LessThan)) +} + +// greater_than_equal ::= ">=" | "≥" ; +pub fn greater_than_equal(input: ParseString) -> ParseResult { + let (input, _) = alt((tag(">="),tag("≥")))(input)?; + Ok((input, ParserNode::GreaterThanEqual)) +} + +// less_than_equal ::= "<=" | "≤" ; +pub fn less_than_equal(input: ParseString) -> ParseResult { + let (input, _) = alt((tag("<="),tag("≤")))(input)?; + Ok((input, ParserNode::LessThanEqual)) +} + +// ##### Logic expressions + +// or ::= "|" ; +pub fn or(input: ParseString) -> ParseResult { + let (input, _) = tag("|")(input)?; + Ok((input, ParserNode::Or)) +} + +// and ::= "&" ; +pub fn and(input: ParseString) -> ParseResult { + let (input, _) = tag("&")(input)?; + Ok((input, ParserNode::And)) +} + +// not ::= "!" | "¬" ; +pub fn not(input: ParseString) -> ParseResult { + let (input, _) = alt((tag("!"), tag("¬")))(input)?; + let (input, negated) = alt((data, true_literal, false_literal))(input)?; + Ok((input, ParserNode::Not { children: vec![negated] })) +} + +// xor ::= "xor" | "⊕" | "⊻" ; +pub fn xor(input: ParseString) -> ParseResult { + let (input, _) = alt((tag("xor"), tag("⊕"), tag("⊻")))(input)?; + Ok((input, ParserNode::Xor)) +} + +// ##### Other expressions + +// pub fn string_interpolation(input: ParseString) -> IResult { +// let (input, _) = tag("{{")(input)?; +// let (input, expression) = expression(input)?; +// let (input, _) = tag("}}")(input)?; +// Ok((input, ParserNode::StringInterpolation { children: vec![expression] })) +// } + +// string ::= quote, (!quote, )*, quote ; +pub fn string(input: ParseString) -> ParseResult { + let msg = "Character not allowed in string"; + let (input, _) = quote(input)?; + let (input, matched) = many0(tuple((is_not(quote), label!(text, msg))))(input)?; + let (input, _) = quote(input)?; + let (_, text): ((), Vec<_>) = matched.into_iter().unzip(); + Ok((input, ParserNode::String { children: text })) +} + +// transpose ::= "'" ; +pub fn transpose(input: ParseString) -> ParseResult { + let (input, _) = tag("'")(input)?; + Ok((input, ParserNode::Transpose)) +} + +// expression ::= (empty_table | inline_table | math_expression | string | anonymous_table), transpose? ; +pub fn expression(input: ParseString) -> ParseResult { + let (input, expression) = alt((inline_table, math_expression, string, empty_table, anonymous_table))(input)?; + let (input, transpose) = opt(transpose)(input)?; + let mut children = vec![expression]; + match transpose { + Some(transpose) => children.push(transpose), + _ => (), + } + Ok((input, ParserNode::Expression { children })) +} + +// #### Block basics + +// transformation ::= statement; +pub fn transformation(input: ParseString) -> ParseResult { + let (input, statement) = statement(input)?; + Ok((input, ParserNode::Transformation { children: vec![statement] })) +} + +// empty_line ::= space*, newline ; +pub fn empty_line(input: ParseString) -> ParseResult { + let (input, _) = tuple((many0(space), newline))(input)?; + Ok((input, ParserNode::Null)) +} + +// indented_tfm ::= !empty_line, space, , , ; +pub fn indented_tfm(input: ParseString) -> ParseResult { + let msg1 = "Indentation has to be exactly 2 spaces"; + let msg2 = "Expect transformation"; + let (input, _) = tuple(( + is_not(empty_line), + space, + labelr!(space, skip_nil, msg1), + labelr!(is_not(space), skip_spaces, msg1), + ))(input)?; + label!(transformation, msg2)(input) +} + +// block ::= indented_tfm+, whitespace* ; +pub fn block(input: ParseString) -> ParseResult { + let (input, (transformations, src_range)) = range(many1(indented_tfm))(input)?; + let (input, _) = many0(whitespace)(input)?; + Ok((input, ParserNode::Block { children: transformations, src_range })) +} + +// ### Markdown + +// ul_title ::= space*, text, space*, newline, equal+, space*, newline* ; +pub fn ul_title(input: ParseString) -> ParseResult { + let (input, _) = many0(space)(input)?; + let (input, text) = text(input)?; + let (input, _) = many0(space)(input)?; + let (input, _) = newline(input)?; + let (input, _) = many1(equal)(input)?; + let (input, _) = many0(space)(input)?; + let (input, _) = many0(newline)(input)?; + Ok((input, ParserNode::Title { children: vec![text] })) +} + +// title ::= ul_title ; +pub fn title(input: ParseString) -> ParseResult { + let (input,title) = ul_title(input)?; + Ok((input, title)) +} + +// ul_subtitle ::= space*, text, space*, newline, dash+, space*, newline* ; +pub fn ul_subtitle(input: ParseString) -> ParseResult { + let (input, _) = many0(space)(input)?; + let (input, text) = text(input)?; + let (input, _) = many0(space)(input)?; + let (input, _) = newline(input)?; + let (input, _) = dash(input)?; + let (input, _) = dash(input)?; + let (input, _) = dash(input)?; + let (input, _) = many1(dash)(input)?; + let (input, _) = many0(space)(input)?; + let (input, _) = many0(newline)(input)?; + Ok((input, ParserNode::Subtitle { level: 1, children: vec![text] })) +} + +// number_subtitle ::= space*, number, period, space+, text, space*, newline* ; +pub fn number_subtitle(input: ParseString) -> ParseResult { + let (input, _) = many0(space)(input)?; + let (input, _) = left_parenthesis(input)?; + let (input, _) = number(input)?; + let (input, _) = right_parenthesis(input)?; + let (input, _) = many1(space)(input)?; + let (input, title) = text(input)?; + let (input, _) = many0(space)(input)?; + let (input, _) = many0(newline)(input)?; + Ok((input, ParserNode::Subtitle {level: 2, children: vec![title] })) +} + +// alpha_subtitle ::= space*, alpha, right_parenthesis, space+, text, space*, newline* ; +pub fn alpha_subtitle(input: ParseString) -> ParseResult { + let (input, _) = many0(space)(input)?; + let (input, _) = left_parenthesis(input)?; + let (input, _) = alpha(input)?; + let (input, _) = right_parenthesis(input)?; + let (input, _) = many1(space)(input)?; + let (input, title) = text(input)?; + let (input, _) = many0(space)(input)?; + let (input, _) = many0(newline)(input)?; + Ok((input, ParserNode::Subtitle { level: 3, children: vec![title] })) +} + +// subtitle ::= ul_subtitle | number_subtitle | alpha_subtitle; +pub fn subtitle(input: ParseString) -> ParseResult { + let (input,title) = alt((ul_subtitle,alpha_subtitle,number_subtitle))(input)?; + Ok((input, title)) +} + +// inline_code ::= grave, text, grave, space* ; +pub fn inline_code(input: ParseString) -> ParseResult { + let (input, _) = grave(input)?; + let (input, text) = text(input)?; + let (input, _) = grave(input)?; + let (input, _) = many0(space)(input)?; + Ok((input, ParserNode::InlineCode { children: vec![text] })) +} + +// paragraph_text ::= paragraph_starter, paragraph_rest? ; +pub fn paragraph_text(input: ParseString) -> ParseResult { + let (input, word) = paragraph_starter(input)?; + let (input, text) = opt(paragraph_rest)(input)?; + let mut paragraph = vec![word]; + match text { + Some(text) => paragraph.push(text), + _ => (), + }; + Ok((input, ParserNode::ParagraphText { children: paragraph })) +} + +// paragraph ::= (inline_code | paragraph_text)+, whitespace*, newline* ; +pub fn paragraph(input: ParseString) -> ParseResult { + let (input, paragraph_elements) = many1( + alt((inline_code, paragraph_text)) + )(input)?; + let (input, _) = many0(whitespace)(input)?; + let (input, _) = many0(newline)(input)?; + Ok((input, ParserNode::Paragraph { children: paragraph_elements })) +} + +// unordered_list ::= list_item+, newline?, whitespace* ; +pub fn unordered_list(input: ParseString) -> ParseResult { + let (input, list_items) = many1(list_item)(input)?; + let (input, _) = opt(newline)(input)?; + let (input, _) = many0(whitespace)(input)?; + Ok((input, ParserNode::UnorderedList { children: list_items })) +} + +// list_item ::= dash, , , newline* ; +pub fn list_item(input: ParseString) -> ParseResult { + let msg1 = "Expect space after dash"; + let msg2 = "Expect paragraph as list item"; + let (input, _) = dash(input)?; + let (input, _) = labelr!(null(many1(space)), skip_nil, msg1)(input)?; + let (input, list_item) = label!(paragraph, msg2)(input)?; + let (input, _) = many0(newline)(input)?; + Ok((input, ParserNode::ListItem { children: vec![list_item] })) +} + +// formatted_text ::= (!grave, !eof, )* ; +pub fn formatted_text(input: ParseString) -> ParseResult { + let msg = "Character not permitted in formatted text"; + let (input, result) = many0(tuple(( + tuple((is_not(grave), is_not(eof))), + label!(alt((paragraph_rest, newline)), msg) + )))(input)?; + let (_, formatted): (((), ()), Vec<_>) = result.into_iter().unzip(); + Ok((input, ParserNode::FormattedText { children: formatted })) +} + +// code_block ::= grave, , , , formatted_text, ; +pub fn code_block(input: ParseString) -> ParseResult { + let msg1 = "Expect 3 graves to start a code block"; + let msg2 = "Expect newline"; + let msg3 = "Expect 3 graves followed by newline to terminate a code block"; + let (input, (_, r)) = range(tuple(( + grave, + label!(grave, msg1), + label!(grave, msg1), + )))(input)?; + let (input, _) = label!(newline, msg2)(input)?; + let (input, text) = formatted_text(input)?; + let (input, _) = label!(tuple((grave, grave, grave, newline, many0(whitespace))), msg3, r)(input)?; + Ok((input, ParserNode::CodeBlock { children: vec![text] })) +} + +// ### Mechdown + +// pub fn inline_mech_code(input: ParseString) -> ParseResult { +// let (input, _) = tuple((left_bracket,left_bracket))(input)?; +// let (input, expression) = expression(input)?; +// let (input, _) = tuple((right_bracket,right_bracket,opt(space)))(input)?; +// Ok((input, ParserNode::InlineMechCode{ children: vec![expression] })) +// } + +// mech_code_block ::= grave{3}, !!"mec", <"mech:">, text?, , , , whitespace* ; +pub fn mech_code_block(input: ParseString) -> ParseResult { + let msg1 = "Expect newline"; + let msg2 = "Expect mech code block"; + let msg3 = "Expect the \"mech:\" tag"; + let msg4 = "Expect 3 graves followed by newline to terminate the mech code block"; + let (input, (_, r)) = range(tuple((grave, grave, grave)))(input)?; + let (input, _) = tuple((is(tag("mec")), labelr!(tag("mech:"), skip_empty_mech_directive, msg3)))(input)?; + let (input, directive) = opt(text)(input)?; + let (input, _) = label!(newline, msg1)(input)?; + let (input, mech_block) = label!(block, msg2)(input)?; + let (input, _) = label!(tuple((grave, grave, grave, newline)), msg4, r)(input)?; + let (input, _) = many0(whitespace)(input)?; + let mut elements = vec![]; + match directive { + Some(directive) => elements.push(directive), + _ => (), + } + elements.push(mech_block); + Ok((input, ParserNode::MechCodeBlock{ children: elements })) +} + +// ### Start here + +// section_element ::= user_function | block | mech_code_block | code_block | statement | paragraph | unordered_list; +pub fn section_element(input: ParseString) -> ParseResult { + let (input, element) = alt(( + section2, comment, user_function, block, mech_code_block, code_block, statement, paragraph, unordered_list, + ))(input)?; + Ok((input, element)) +} + +// section ::= (!eof, , whitespace?)+ ; +pub fn section(input: ParseString) -> ParseResult { + let msg = "Expect user function, block, mech code block, code block, statement, paragraph, or unordered list"; + let (input, title) = opt(ul_subtitle)(input)?; + let (input, mut section_elements) = many1( + tuple(( + is_not(eof), + is_not(ul_subtitle), + labelr!(section_element, skip_till_section_element, msg), + opt(whitespace), + )) + )(input)?; + let mut section = vec![]; + section.append(&mut section_elements.iter().map(|(_,_,x,_)|x).cloned().collect()); + let title = match title { + Some(t) => Some(vec![t]), + None => None, + }; + Ok((input, ParserNode::Section{title, children: section })) +} + +pub fn section_element2(input: ParseString) -> ParseResult { + let (input, element) = alt(( + section3, user_function, block, mech_code_block, code_block, statement, paragraph, unordered_list, + ))(input)?; + Ok((input, element)) +} + +pub fn section2(input: ParseString) -> ParseResult { + let msg = "Expect user function, block, mech code block, code block, statement, paragraph, or unordered list"; + let (input, title) = number_subtitle(input)?; + let (input, mut section_elements) = many1( + tuple(( + is_not(eof), + is_not(ul_subtitle), + is_not(number_subtitle), + labelr!(section_element2, skip_till_section_element2, msg), + opt(whitespace), + )) + )(input)?; + let mut section = vec![]; + section.append(&mut section_elements.iter().map(|(_,_,_,x,_)|x).cloned().collect()); + Ok((input, ParserNode::Section{title: Some(vec![title]), children: section })) +} + +pub fn section_element3(input: ParseString) -> ParseResult { + let (input, element) = alt(( + user_function, block, mech_code_block, code_block, statement, paragraph, unordered_list, + ))(input)?; + Ok((input, element)) +} + +pub fn section3(input: ParseString) -> ParseResult { + let msg = "Expect user function, block, mech code block, code block, statement, paragraph, or unordered list"; + let (input, title) = alpha_subtitle(input)?; + let (input, mut section_elements) = many1( + tuple(( + is_not(eof), + is_not(ul_subtitle), + is_not(alpha_subtitle), + is_not(number_subtitle), + labelr!(section_element3, skip_till_section_element3, msg), + opt(whitespace), + )) + )(input)?; + let mut section = vec![]; + section.append(&mut section_elements.iter().map(|(_,_,_,_,x,_)|x).cloned().collect()); + Ok((input, ParserNode::Section{title: Some(vec![title]), children: section })) +} + + +// body ::= whitespace*, section+ ; +pub fn body(input: ParseString) -> ParseResult { + let (input, _) = many0(whitespace)(input)?; + let (input, sections) = many1(section)(input)?; + Ok((input, ParserNode::Body { children: sections })) +} + +// pub fn fragment(input: ParseString) -> ParseResult { +// let (input, statement) = statement(input)?; +// Ok((input, ParserNode::Fragment { children: vec![statement] })) +// } + +// program ::= whitespace?, title?, , whitespace?, space* ; +pub fn program(input: ParseString) -> ParseResult { + let msg = "Expect program body"; + let mut program = vec![]; + let (input, _) = opt(whitespace)(input)?; + let (input, title) = opt(title)(input)?; + match title { + Some(title) => program.push(title), + None => (), + }; + let (input, body) = labelr!(body, skip_nil, msg)(input)?; + program.push(body); + let (input, _) = opt(whitespace)(input)?; + let (input, _) = many0(space)(input)?; + Ok((input, ParserNode::Program { children: program })) +} + +// pub fn raw_transformation(input: ParseString) -> ParseResult { +// let (input, statement) = statement(input)?; +// let (input, _) = many0(alt((space,newline,tab)))(input)?; +// Ok((input, ParserNode::Transformation { children: vec![statement] })) +// } + +// pub fn parse_block(input: ParseString) -> ParseResult { +// let (input, transformations) = many1(raw_transformation)(input)?; +// let (input, _) = many0(whitespace)(input)?; +// Ok((input, ParserNode::Block { children: transformations })) +// } + +// parse_mech_fragment ::= statement ; +pub fn parse_mech_fragment(input: ParseString) -> ParseResult { + let (input, statement) = statement(input)?; + Ok((input, ParserNode::Root { children: vec![ + ParserNode::Program { children: vec![ + ParserNode::Body { children: vec![ + ParserNode::Section { title: None, children: vec![ + statement + ]} + ]} + ]} + ]})) +} + +// parse_mech ::= program | statement ; +pub fn parse_mech(input: ParseString) -> ParseResult { + let (input, mech) = alt((program, statement))(input)?; + Ok((input, ParserNode::Root { children: vec![mech] })) +} + +// ## Reporting errors + +/// This struct is responsible for analysing text, interpreting indices +/// and ranges, and producing formatted messages. +pub struct TextFormatter<'a> { + graphemes: Vec<&'a str>, + line_beginnings: Vec, + end_index: usize, +} + +impl<'a> TextFormatter<'a> { + pub fn new(text: &'a str) -> Self { + let graphemes = graphemes::init_source(text); + let mut line_beginnings = vec![0]; + for i in 0..graphemes.len() { + if graphemes::is_newline(graphemes[i]) { + line_beginnings.push(i + 1); + } + } + line_beginnings.pop(); + TextFormatter { + end_index: graphemes.len(), + graphemes, + line_beginnings, + } + } + + // Index interpreter + + fn get_line_range(&self, linenum: usize) -> Option<(usize, usize)> { + let line_index = linenum - 1; + if line_index >= self.line_beginnings.len() { + return None; + } + if linenum == self.line_beginnings.len() { // asking for the last line + return Some((self.line_beginnings[line_index], self.end_index)); + } + Some((self.line_beginnings[line_index], self.line_beginnings[linenum])) + } + + fn get_text_by_linenum(&self, linenum: usize) -> String { + let (start, end) = match self.get_line_range(linenum) { + Some(v) => v, + None => return "\n".to_string(), + }; + let mut s = self.graphemes[start..end].iter().map(|s| *s).collect::(); + if !s.ends_with("\n") { + s.push('\n'); + } + s + } + + fn get_textlen_by_linenum(&self, linenum: usize) -> usize { + let (start, end) = match self.get_line_range(linenum) { + Some(v) => v, + None => return 1, + }; + let mut len = 0; + for i in start..end { + len += graphemes::width(self.graphemes[i]); + } + len + 1 + } + + // FormattedString printer + + fn heading_color(s: &str) -> String { + s.truecolor(246, 192, 78).bold().to_string() + } + + fn location_color(s: &str) -> String { + s.truecolor(0,187,204).bold().to_string() + } + + fn linenum_color(s: &str) -> String { + s.truecolor(0,187,204).bold().to_string() + } + + fn text_color(s: &str) -> String { + s.to_string() + } + + fn annotation_color(s: &str) -> String { + s.truecolor(102,51,153).bold().to_string() + } + + fn error_color(s: &str) -> String { + s.truecolor(170,51,85).bold().to_string() + } + + fn ending_color(s: &str) -> String { + s.truecolor(246, 192, 78).bold().to_string() + } + + fn err_heading(index: usize) -> String { + let n = index + 1; + let d = "────────────────────────"; + let s = format!("{} syntax error #{} {}\n", d, n, d); + Self::heading_color(&s) + } + + fn err_location(&self, ctx: &ParserErrorContext) -> String { + let err_end = ctx.cause_rng.end; + // error range will not ends at first column, so `minus 1` here is safe + let (row, col) = (err_end.row, err_end.col - 1); + let s = format!("@location:{}:{}\n", row, col); + Self::location_color(&s) + } + + fn err_context(&self, ctx: &ParserErrorContext) -> String { + let mut result = String::new(); + + let mut annotation_rngs = ctx.annotation_rngs.clone(); + annotation_rngs.push(ctx.cause_rng); + + // the lines to print (1-indexed) + let mut lines_to_print: Vec = vec![]; + for rng in &annotation_rngs { + let r1 = rng.start.row; + // if range ends at first column, it doesn't reach that row + let r2 = if rng.end.col == 1 { + usize::max(rng.start.row, rng.end.row - 1) + } else { + rng.end.row + }; + for i in r1..=r2 { + lines_to_print.push(i); + } + } + lines_to_print.sort(); + lines_to_print.dedup(); + + // the annotations on each line + // > + let mut range_table: HashMap> = HashMap::new(); + for linenum in &lines_to_print { + range_table.insert(*linenum, vec![]); + } + let n = annotation_rngs.len() - 1; // if i == n, it's the last rng, i.e. the cause rng + for (i, rng) in annotation_rngs.iter().enumerate() { + // c2 might be 0 + let (r1, c1) = (rng.start.row, rng.start.col); + let (r2, c2) = (rng.end.row, rng.end.col - 1); + if r1 == r2 { // the entire range is on one line + if c2 >= c1 { // and the range has non-zero length + range_table.get_mut(&r1).unwrap().push((c1, c2 - c1 + 1, true, i == n)); + } + } else { // the range spans over multiple lines + range_table.get_mut(&r1).unwrap().push((c1, usize::MAX, i != n, i == n)); + for r in r1+1..r2 { + range_table.get_mut(&r).unwrap().push((1, usize::MAX, false, i == n)); + } + if c2 != 0 { // only add the last line if it has non-zero length + range_table.get_mut(&r2).unwrap().push((1, c2, i == n, i == n)); + } + } + } + + // other data for printing + let dots = "..."; + let indentation = " "; + let vert_split1 = " │"; + let vert_split2 = " "; + let arrow = "^"; + let tilde = "~"; + let lines_str: Vec = lines_to_print.iter().map(|i| i.to_string()).collect(); + let row_str_len = usize::max(lines_str.last().unwrap().len(), dots.len()); + + // print source code + for i in 0..lines_to_print.len() { + // [... | ] + if i != 0 && (lines_to_print[i] - lines_to_print[i-1] != 1) { + result.push_str(indentation); + for _ in 3..row_str_len { result.push(' '); } + result.push_str(&Self::linenum_color(dots)); + result.push_str(&Self::linenum_color(vert_split1)); + result.push('\n'); + } + + // [ | ] + result.push_str(indentation); + for _ in 0..row_str_len { result.push(' '); } + result.push_str(&Self::linenum_color(vert_split1)); + result.push('\n'); + + // [row | program text...] + let text = self.get_text_by_linenum(lines_to_print[i]); + result.push_str(indentation); + for _ in 0..row_str_len-lines_str[i].len() { result.push(' '); } + result.push_str(&Self::linenum_color(&lines_str[i])); + result.push_str(&Self::linenum_color(vert_split1)); + result.push_str(&Self::text_color(&text)); + + // [ | ^~~~] + result.push_str(indentation); + for _ in 0..row_str_len { result.push(' '); } + result.push_str(&Self::linenum_color(vert_split1)); + let mut curr_col = 1; + let line_len = self.get_textlen_by_linenum(lines_to_print[i]); + let rngs = range_table.get(&lines_to_print[i]).unwrap(); + for (start, len, major, cause) in rngs { + let max_len = usize::max(1, usize::min(*len, line_len - curr_col + 1)); + for _ in curr_col..*start { result.push(' '); } + if *cause { + for _ in 0..max_len-1 { + result.push_str(&Self::error_color(tilde)); + } + if *major { + result.push_str(&Self::error_color(arrow)); + } else { + result.push_str(&Self::error_color(tilde)); + } + } else { + if *major { + result.push_str(&Self::annotation_color(arrow)); + } else { + result.push_str(&Self::annotation_color(tilde)); + } + for _ in 0..max_len-1 { + result.push_str(&Self::annotation_color(tilde)); + } + } + curr_col = start + max_len; + } + result.push('\n'); + } + + // print error message; + // error range never ends at first column, so it's safe to `minus 1` here + let cause_col = ctx.cause_rng.end.col - 1; + result.push_str(indentation); + for _ in 0..row_str_len { result.push(' '); } + result.push_str(vert_split2); + for _ in 0..cause_col-1 { result.push(' '); } + result.push_str(&Self::error_color(&ctx.err_message)); + result.push('\n'); + + result + } + + fn err_ending(d: usize) -> String { + let s = format!("... and {} other error{} not shown\n", d, if d == 1 {""} else {"s"}); + Self::heading_color(&s) + } + + /// Get formatted error message. + pub fn format_error(&self, errors: &ParserErrorReport) -> String { + let n = usize::min(errors.len(), 10); + let mut result = String::new(); + result.push('\n'); + for i in 0..n { + let ctx = &errors[i]; + result.push_str(&Self::err_heading(i)); + result.push_str(&self.err_location(ctx)); + result.push_str(&self.err_context(ctx)); + result.push_str("\n\n"); + } + let d = errors.len() - n; + if d != 0 { + result.push_str(&Self::err_ending(d)); + } + result + } +} + +// ## Public interface + +/// Print formatted error message. +pub fn print_err_report(text: &str, report: &ParserErrorReport) { + let msg = TextFormatter::new(text).format_error(report); + println!("{}", msg); +} + +pub fn parse(text: &str) -> Result { + let graphemes = graphemes::init_source(text); + let mut result_node = ParserNode::Error; + let mut error_log: Vec<(SourceRange, ParseErrorDetail)> = vec![]; + let remaining: ParseString; + + // Do parse + match parse_mech(ParseString::new(&graphemes)) { + // Got a parse tree, however there may be errors + Ok((mut remaining_input, parse_tree)) => { + error_log.append(&mut remaining_input.error_log); + result_node = parse_tree; + remaining = remaining_input; + }, + // Parsing failed and could not be recovered. No parse tree was created in this case + Err(err) => match err { + Err::Error(mut e) | Err::Failure(mut e) => { + error_log.append(&mut e.remaining_input.error_log); + error_log.push((e.cause_range, e.error_detail)); + remaining = e.remaining_input; + }, + Err::Incomplete(_) => panic!("nom::Err::Incomplete is not supported!"), + }, + } + + // Check if all inputs were parsed + if remaining.len() != 0 { + let e = ParseError::new(remaining, "Inputs since here are not parsed"); + error_log.push((e.cause_range, e.error_detail)); + } + + // Construct result + if error_log.is_empty() { + Ok(result_node) + } else { + let report: ParserErrorReport = error_log.into_iter().map(|e| ParserErrorContext { + cause_rng: e.0, + err_message: String::from(e.1.message), + annotation_rngs: e.1.annotation_rngs, + }).collect(); + let msg = TextFormatter::new(text).format_error(&report); + Err(MechError{msg: "".to_string(), id: 3202, kind: MechErrorKind::ParserError(result_node, report, msg)}) + } +} + +pub fn parse_fragment(text: &str) -> Result { + let graphemes = graphemes::init_source(text); + let mut result_node = ParserNode::Error; + let mut error_log: Vec<(SourceRange, ParseErrorDetail)> = vec![]; + let remaining: ParseString; + + // Do parse + match parse_mech_fragment(ParseString::new(&graphemes)) { + // Got a parse tree, however there may be errors + Ok((mut remaining_input, parse_tree)) => { + error_log.append(&mut remaining_input.error_log); + result_node = parse_tree; + remaining = remaining_input; + }, + // Parsing failed and could not be recovered. No parse tree was created in this case + Err(err) => match err { + Err::Error(mut e) | Err::Failure(mut e) => { + error_log.append(&mut e.remaining_input.error_log); + error_log.push((e.cause_range, e.error_detail)); + remaining = e.remaining_input; + }, + Err::Incomplete(_) => panic!("nom::Err::Incomplete is not supported!"), + }, + } + + // Check if all inputs were parsed + if remaining.len() != 0 { + let e = ParseError::new(remaining, "Inputs since here are not parsed"); + error_log.push((e.cause_range, e.error_detail)); + } + + // Construct result + if error_log.is_empty() { + Ok(result_node) + } else { + println!("{:?}", error_log); + let report = error_log.into_iter().map(|e| ParserErrorContext { + cause_rng: e.0, + err_message: String::from(e.1.message), + annotation_rngs: e.1.annotation_rngs, + }).collect(); + let msg = TextFormatter::new(text).format_error(&report); + Err(MechError{msg: "".to_string(), id: 3202, kind: MechErrorKind::ParserError(result_node, report, msg)}) + } +} \ No newline at end of file diff --git a/src/syntax/tests/compiler.rs b/src/syntax/tests/compiler.rs new file mode 100644 index 0000000..d4eed56 --- /dev/null +++ b/src/syntax/tests/compiler.rs @@ -0,0 +1,1756 @@ +#![allow(warnings)] +extern crate mech_syntax; +extern crate mech_core; +#[macro_use] +extern crate lazy_static; +use mech_syntax::compiler::Compiler; +use std::cell::RefCell; +use std::rc::Rc; +use mech_core::*; + +lazy_static! { + static ref TXN: Vec = vec![Change::Set((hash_str("x"), vec![(TableIndex::Index(1), TableIndex::Index(1), Value::F32(F32::new(9.0)))]))]; + static ref TXN2: Vec = vec![ + Change::Set((hash_str("x"), vec![(TableIndex::Index(1), TableIndex::Index(2), Value::F32(F32::new(9.0)))])) + ]; + static ref TXN3: Vec = vec![ + Change::Set((hash_str("x"), vec![(TableIndex::Index(1), TableIndex::Index(2), Value::F32(F32::new(9.0)))])), + Change::Set((hash_str("time/timer"), vec![(TableIndex::Index(1), TableIndex::Index(2), Value::U64(U64::new(1)))])), + ]; + static ref TXN4: Vec = vec![ + Change::Set((hash_str("time/timer"), vec![(TableIndex::Index(1), TableIndex::Index(2), Value::U64(U64::new(1)))])), + Change::Set((hash_str("time/timer"), vec![(TableIndex::Index(1), TableIndex::Index(2), Value::U64(U64::new(2)))])), + ]; + static ref TXN5: Vec = vec![ + Change::NewTable{table_id: hash_str("x"), rows: 1, columns: 1}, + Change::ColumnKind{table_id: hash_str("x"), column_ix: 0, column_kind: ValueKind::F32}, + Change::Set((hash_str("x"), vec![(TableIndex::Index(1), TableIndex::Index(1), Value::F32(F32::new(42.0)))])), + ]; + static ref TXN6: Vec = vec![ + Change::NewTable{table_id: hash_str("radius"), rows: 1, columns:1 }, + Change::ColumnKind{table_id: hash_str("radius"), column_ix: 0, column_kind: ValueKind::F32}, + Change::Set((hash_str("radius"), vec![(TableIndex::Index(1), TableIndex::Index(1), Value::F32(F32::new(10.0)))])), + ]; +} + +macro_rules! test_mech { + ($func:ident, $input:tt, $test:expr) => ( + #[test] + fn $func() -> Result<(),MechError> { + let mut compiler = Compiler::new(); + let mut core = Core::new(); + + let input = String::from($input); + let sections = compiler.compile_str(&input)?; + + for section in sections { + for element in section { + match element { + SectionElement::Block(block) => { + let (_,errors,new_block_output) = core.load_block(Rc::new(RefCell::new(block))); + for register in new_block_output.iter() { + core.step(register); + } + core.schedule_blocks(); + assert!(errors.len() == 0); + } + SectionElement::UserFunction(fxn) => { + core.load_user_function(&fxn); + } + } + } + } + + let test: Value = $test; + let actual = core.get_table("test")?.borrow().get_raw(0, 0); + match actual { + Ok(value) => { + assert_eq!(value,test); + }, + _ => {assert!(false)}, + } + Ok(()) + } + ) +} + +macro_rules! test_mech_txn { + ($func:ident, $input:tt, $txn:tt, $test:expr) => ( + #[test] + fn $func() -> Result<(),MechError> { + let mut compiler = Compiler::new(); + let mut core = Core::new(); + + let input = String::from($input); + let sections = compiler.compile_str(&input)?; + + core.load_sections(sections); + + core.schedule_blocks()?; + + core.process_transaction(&$txn)?; + + let test: Value = $test; + let actual = core.get_table("test")?.borrow().get_raw(0, 0); + match actual { + Ok(value) => { + assert_eq!(value,test); + }, + _ => {assert!(false)}, + } + Ok(()) + } + ) +} + +// ## Constant + +test_mech!(constant_float_basic, "#test = 5.5",Value::F32(F32::new(5.5))); + +test_mech!(constant_float_leading_zero, "#test = 0.5",Value::F32(F32::new(0.5))); +test_mech!(constant_float_leading_decimal, "#test = .5",Value::F32(F32::new(0.5))); + +test_mech!(constant_basic, "block + #test = 5",Value::F32(F32::new(5.0))); + + test_mech!(constant_empty_table, " +block + #test = _", Value::Empty); + +test_mech!(constant_inline_empty, "#test = [first: 12, second: _, third: 45]",Value::F32(F32::new(12.0))); + +test_mech!(constant_hex, "#test = 0xABC123",Value::U128(U128::new(11256099))); + +// ## Unicode + +test_mech!(unicode, " +block + 😃 = 1 + 🤦🏼‍♂️ = 2 + y̆és = 🤦🏼‍♂️ + 😃 + #test = y̆és",Value::F32(F32::new(3.0))); + +// ## Table + +test_mech!(table_define_inline_expressions, " +block + #x = [x: 1 + 2, y: 2 + 2] +block + #test = #x.x + #x.y", Value::F32(F32::new(7.0))); + +test_mech!(table_inline_multirow, r#" +block + #x = [x: 1 + y: 2 + z: 3] +block + #test = #x.x + #x.y + #x.z"#, Value::F32(F32::new(6.0))); + +test_mech!(table_inline_multirow_nested, r#" +block + #x = [ + root: "mech-root" + contains: [ + type: "a", + href: "foo.bar", + contains: 10 + ] + ] +block + #test = #x.contains.contains"#, Value::F32(F32::new(10.0))); + +test_mech!(table_anonymous_table_trailing_whitespace, " +block + #test = [|d| + 5 ]", Value::F32(F32::new(5.0))); + +test_mech!(table_anonymous_table_trailing_newline, " +block + #test = [|d| + 5 + ]", Value::F32(F32::new(5.0))); + +test_mech!(table_define_empty_table, " +block + #bots = [|x y|] +block + #bots += [y: 4 x: 2] +block + #test = #bots.y / #bots.x", Value::F32(F32::new(2.0))); + +test_mech!(table_define_program, " +A Working Program +================== + +Section Two +------------ + + #test = 9", Value::F32(F32::new(9.0))); + +test_mech!(table_multi_line_inline, " +block + #x = [ + x: 1 + y: 2 + z: 3 + ] +block + #test = #x.x + #x.y + #x.z", Value::F32(F32::new(6.0))); + +test_mech!(table_size, " +block + #x = [1 2 + 3 4 + 5 6] +block + #y = table/size(table: #x) + +block + #test = #y{1} + #y{2}", Value::U64(U64::new(5))); + +test_mech!(table_swizzle, " +x = [a: 1, b: 2, c: 3, d: 4] +y = x.a,c +#test = stats/sum(row: y)", Value::F32(F32::new(4.0))); + +// ## Select + +test_mech!(select_table," +block + #x = 123 +block + #test = #x", Value::F32(F32::new(123.0))); + +test_mech!(select_table_horzcat," +block + #x = 123 +block + #test = stats/sum(row: [#x 2 3])", Value::F32(F32::new(128.0))); + +// ## Math + +test_mech!(math_constant,"#test = 10", Value::F32(F32::new(10.0))); + +test_mech!(math_add,"#test = 1 + 1", Value::F32(F32::new(2.0))); + +test_mech!(math_add_u16,"#test = 10 + 400", Value::U16(U16::new(410))); + +//test_mech!(math_add_u8_u16,"#test = 10 + 400", Value::U16(410))); + +test_mech!(math_add_f32,"#test = 123.456 + 456.123", Value::F32(F32::new(579.579))); + +test_mech!(math_subtract,"#test = 3 - 1", Value::F32(F32::new(2.0))); + +test_mech!(math_multiply,"#test = 2 * 2", Value::F32(F32::new(4.0))); + +test_mech!(math_matrix_multiply_row_col,"#test = [1 2] ** [3;4]", Value::F32(F32::new(11.0))); + +test_mech!(math_matrix_multiply_col_row," +x = [1; 2] ** [3 4] +#test = stats/sum(table: x)", Value::F32(F32::new(21.0))); + +test_mech!(math_matrix_multiply_mat_mat," +x = [1 2; 3 4] ** [5 6; 7 8] +#test = stats/sum(table: x)", Value::F32(F32::new(134.0))); + +test_mech!(math_matrix_multiply_mat_mat_2," +x = [1 2; 3 4] ** [5 6 7; 8 9 10] +#test = stats/sum(table: x)", Value::F32(F32::new(234.0))); + +test_mech!(math_matrix_multiply_row_mat," +x = [1 2 3] +y = [4 5; 6 7; 8 9] +z = x ** y +#test = stats/sum(row: z)", Value::F32(F32::new(86.0))); + +test_mech!(math_matrix_multiply_mat_col," +x = [1 2 3; 4 5 6; 7 8 9] ** [1;2;3] +#test = stats/sum(column: x)", Value::F32(F32::new(96.0))); + +test_mech!(math_matrix_transpose_row," +x = [1 2 3] +#test = x ** x'", Value::F32(F32::new(14.0))); + +test_mech!(math_matrix_transpose_matrix," +x = [1 2; 3 4] +y = x ** x' +#test = stats/sum(table: y)", Value::F32(F32::new(52.0))); + +test_mech!(math_divide,"#test = 4 / 2", Value::F32(F32::new(2.0))); + +test_mech!(math_power,"#test = 3 ^ 2", Value::F32(F32::new(9.0))); + +test_mech!(math_two_terms,"#test = 1 + 2 * 9", Value::F32(F32::new(19.0))); + +test_mech!(math_constant_collision,"#test = 123 + 1", Value::F32(F32::new(124.0))); + +test_mech!(math_subtract_columns,"#test = stats/sum(column: [5;6;7] - [1;2;3])", Value::F32(F32::new(12.0))); + +test_mech!(math_multiple_variable_graph,"block + a = z * 5 + d = 9 * z + z = 5 + #test = d * z + a", Value::F32(F32::new(250.0))); + +test_mech!(math_multiple_variable_graph_new_ordering,"block + a = z * 5 + z = 5 + d = 9 * z + #test = d * z + a", Value::F32(F32::new(250.0))); + + test_mech!(math_add_columns_alias," +block + x = 1:10 + y = 1:10 + #ball = [|x y| + x y] +block + #test = stats/sum(column: #ball.x + #ball.y)", Value::F32(F32::new(110.0))); + + test_mech!(math_add_columns_indices," +block + x = 1:10 + y = 1:10 + #ball = [|x y| + x y] +block + #test = stats/sum(column: #ball{:,1} + #ball{:,2})", Value::F32(F32::new(110.0))); + +test_mech!(math_on_whole_table," +block + #x = 200 +block + #test = #x + 5", Value::F32(F32::new(205.0))); + +test_mech!(math_on_scalar_and_table," +x = [1 2 + 3 4] +y = 10 +#test = stats/sum(table: x + y)", Value::F32(F32::new(50.0))); + +test_mech!(math_on_table_and_scalar," +x = [1 2 + 3 4] +y = 10 +#test = stats/sum(table: y + x)", Value::F32(F32::new(50.0))); + +test_mech!(select_column_by_id," +block + #ball = [x: 56 y: 2 vx: 3 vy: 4] +block + #test = #ball.y", Value::F32(F32::new(2.0))); + +test_mech!(math_multiple_rows_select," +block + #ball = [x: 15 y: 9 vx: 18 vy: 0] +block + #test = #ball.x + #ball.y * #ball.vx", Value::F32(F32::new(177.0))); + +test_mech!(math_const_and_select," +block + #ball = [x: 15 y: 9 vx: 18 vy: 0] +block + #test = 9 + #ball.x", Value::F32(F32::new(24.0))); + +test_mech!(math_select_and_const," +block + #ball = [x: 15 y: 9 vx: 18 vy: 0] +block + #test = #ball.x + 9", Value::F32(F32::new(24.0))); + +test_mech!(partial_bouncing_ball,"Bouncing Balls +=============== +Define the environment + #ball = [x: 15 y: 9 vx: 18 vy: 9] + #time/timer = [period: 10] + #gravity = 10 + +Now update the block positions + x = #ball.x + #ball.vx + y = #ball.y + #ball.vy + dt = #time/timer.period + #test = x + y * dt", Value::F32(F32::new(213.0))); + +test_mech!(math_add_columns," +block + #ball = [|x y| + 1 2 + 3 4 + 5 6] +block + #test = stats/sum(column: #ball.x + #ball.y)", Value::F32(F32::new(21.0))); + +test_mech!(math_add_matrices," +block + x = [1 2 + 4 5] + y = [10 11 + 13 14] + z = x + y + #test = z{1} + z{2} + z{3} + z{4}", Value::F32(F32::new(60.0))); + +test_mech!(math_scalar_plus_vector," +block + x = 3:6 + y = 5 + x + #test = y{1} + y{2} + y{3} + y{4}", Value::F32(F32::new(38.0))); + +test_mech!(math_vector_plus_scalar_inline," +block + #x = [1 2 3] + 1 + +block + #test = #x{1} + #x{2} + #x{3}", Value::F32(F32::new(9.0))); + +test_mech!(math_vector_plus_scalar_inline_reverse," +block + #x = 1 + [1 2 3] + +block + #test = #x{1} + #x{2} + #x{3}", Value::F32(F32::new(9.0))); + +test_mech!(math_vector_plus_scalar," +block + x = [1 2 3] + #x = x + 1 + +block + #test = #x{1} + #x{2} + #x{3}", Value::F32(F32::new(9.0))); + +test_mech!(math_parenthetical_expression_constants," +block + #test = (1 + 2) * 3", Value::F32(F32::new(9.0))); + +test_mech!(math_add_update_scalar," +block + #test = 7 +block + #test :+= 5", Value::F32(F32::new(12.0))); + +test_mech!(math_subtract_update_scalar," +block + #test = 10 +block + #test :-= 3", Value::F32(F32::new(7.0))); + +test_mech!(math_multiply_update_scalar," +block + #test = 10 +block + #test :*= 3", Value::F32(F32::new(30.0))); + +test_mech!(math_divide_update_scalar," +block + #test = 30 +block + #test :/= 3", Value::F32(F32::new(10.0))); + +// Quantities + +test_mech!(quantitiy_add_m_km,"#test = 400 + 1", Value::Length(F32::new(1400.0))); + +test_mech!(quantitiy_add_ms_s,"#test = 4 + 100", Value::Time(F32::new(4.10))); + +// ## Ranges + +test_mech!(range_basic,r#" +block + #range = 5:14 +block + #test = stats/sum(column: #range)"#, Value::F32(F32::new(95.0))); + +test_mech!(range_and_cat,r#" +block + x = 1:4 + y = 1:4 + #ball = [x y] +block + #test = stats/sum(table: #ball)"#, Value::F32(F32::new(20.0))); + +// ## Subscripts + +test_mech!(subscript_scalar_math," +block + x = 3:6 + y = 10:12 + #test = x{1,1} + y{3,1}", Value::F32(F32::new(15.0))); + +test_mech!(subscript_scan," +block + x = 10:20 + z = 3 + #test = x{z}", Value::F32(F32::new(12.0))); + +test_mech!(subscript_single_horz," +block + x = [1 2 3] + #test = x{2}", Value::F32(F32::new(2.0))); + +test_mech!(subscript_single_vert," +block + x = [1; 2; 3] + #test = x{2}", Value::F32(F32::new(2.0))); + +// ## Comparators + +test_mech!(compare_greater_than,"#test = 16 > 15", Value::Bool(true)); +test_mech!(compare_less_than,"#test = 16 < 15", Value::Bool(false)); + +test_mech!(compare_greater_than_equal," +block + #x = [1; 2; 3] + #y = [2; 1; 3] + +block + ix = #x >= #y + #test = stats/sum(column: #x{ix})", Value::F32(F32::new(5.0))); + +test_mech!(compare_scalar_table," +x = 15 +y = [11 12; 13 14] +#test = set/all(table: x > y)", Value::Bool(true)); + +test_mech!(compare_table_scalar," +x = 15 +y = [11 12; 13 14] +#test = set/all(table: y < x)", Value::Bool(true)); + +test_mech!(compare_greater_than_equal_alt," +block + #x = [1; 2; 3] + #y = [2; 1; 3] + +block + ix = #x ≥ #y + #test = stats/sum(column: #x{ix})", Value::F32(F32::new(5.0))); + +test_mech!(compare_less_than_equal," +block + #x = [1; 2; 3] + #y = [2; 1; 3] + +block + ix = #x <= #y + #test = stats/sum(column: #x{ix})", Value::F32(F32::new(4.0))); + +test_mech!(compare_less_than_equal_alt," +block + #x = [1; 2; 3] + #y = [2; 1; 3] + +block + ix = #x ≤ #y + #test = stats/sum(column: #x{ix})", Value::F32(F32::new(4.0))); + + +test_mech!(compare_equal," +block + #x = [1; 2; 3; 2] + #y = [2; 1; 3; 2] + +block + ix = #x == #y + #test = stats/sum(column: #x{ix})", Value::F32(F32::new(5.0))); + +test_mech!(compare_equal_boolean," +block + #x = [true; true; true; true] + #y = [true; true; true; true] + +block + ix = #x == #y + #test = set/all(column: ix)", Value::Bool(true)); + +test_mech!(compare_not_equal_boolean," +block + #x = [true; true; true; true] + #y = [false; false; false; false] + +block + ix = #x != #y + #test = set/all(column: ix)", Value::Bool(true)); + +test_mech!(compare_not_equal_boolean_alt_syntax," +block + #x = [true; true; true; true] + #y = [false; false; false; false] + +block + ix = #x ¬= #y + #test = set/all(column: ix)", Value::Bool(true)); + +test_mech!(compare_not_equal_boolean_alt_syntax2," +block + #x = [true; true; true; true] + #y = [false; false; false; false] + +block + ix = #x ≠ #y + #test = set/all(column: ix)", Value::Bool(true)); + +test_mech!(compare_equal_string,r#" +block + #x = [1; 2; 3; 4] + #y = ["a"; "b"; "a"; "b"] + +block + ix = #y == "a" + #test = stats/sum(column: #x{ix})"#, Value::F32(F32::new(4.0))); + +test_mech!(compare_not_equal," +block + #x = [1; 2; 3; 2] + #y = [2; 1; 3; 2] + +block + ix = #x != #y + #test = stats/sum(column: #x{ix})", Value::F32(F32::new(3.0))); + +// ## Set + +test_mech!(set_cartesian_product," +x = 1:4 +y = 1:4 +prod = set/cartesian(a: x, b: y) +#test = stats/sum(table: prod)", Value::F32(F32::new(80.0))); + +test_mech!(set_column_simple," +block + #test = [|x| + 9] +block + #test.x := 77", Value::F32(F32::new(77.0))); + +test_mech!(set_empty_with_index," +block + #foo = [|x y|] + #x = true + +block + #foo += [true 1 + false 2 + true 3] +block + ~ #x + ix = #foo.x + #foo.y{ix} := 10 + +block + #test = stats/sum(column: #foo.y)", Value::F32(F32::new(22.0))); + +test_mech!(set_column_alias," +block + #ball = [x: 0 y: 0] + +block + #foo = [x: 100 y: 120] + #z = 100 + +block + #foo.x := 200 + +block + #ball.x := #foo.x + +block + #test = #ball.x", Value::F32(F32::new(200.0))); + + +test_mech!(set_single_index," +block + #x = [200; 0; 0] + +block + #x{3} := 7 + +block + #test = stats/sum(column: #x)", Value::F32(F32::new(207.0))); + + +test_mech!(set_single_index_math," +block + #x = [1;2;3] + +block + #x{2,1} := 10 + +block + y = #x * 2 + #test = stats/sum(column: y)", Value::F32(F32::new(28.0))); + +test_mech!(set_logical_false," +block + #x = [1; 2; 3] + #clicked = [false; false; false] + +block + #ball = [x: #x] + +block + #ball{#clicked} := 10 + +block + #test = stats/sum(column: #ball)", Value::F32(F32::new(6.0))); + +test_mech!(set_column_logical," +block + #q = [|x| + 1 + 4 + 7] + #x = true + +block + ~ #x + x = #q.x + ix = x > 1 + #q.x{ix} := 10 + +block + #test = #q.x{1} + #q.x{2} + #q.x{3}", Value::F32(F32::new(21.0))); + +test_mech!(set_second_column_logical," +block + #ball = [|x y z| + 1 2 3 + 4 5 6 + 7 8 9] + #x = true + +block + ~ #x + x = #ball.y + ix = x > 5 + #ball.y{ix} := 3 +block + #test = #ball.y{1} + #ball.y{2} + #ball.y{3}", Value::F32(F32::new(10.0))); + +test_mech!(set_second_omit_row_subscript," +block + #ball = [x: 15 y: 9 vx: 40 vy: 9] + #time/timer = [period: 15 tick: 0] + #gravity = 2 + +block + ~ #time/timer.tick + #ball.y := #ball.vy + #gravity + +block + #test = #ball.y", Value::F32(F32::new(11.0))); + +test_mech!(set_rhs_math_filters_logic," +block + #ball = [|x y vx vy| + 1 2 3 4 + 5 6 7 8 + 9 10 11 12] + #x = true + +block + ~ #x + ix = #ball.vy > 10 + iy = #ball.vy < 5 + ixx = ix | iy + #ball.y{ixx} := #ball.vy * 2 + +block + #test = #ball{1,2} + #ball{3,2}", Value::F32(F32::new(32.0))); + +test_mech!(set_implicit_logic," +block + #ball = [|x y vx vy| + 1 2 3 4 + 5 6 7 8 + 9 10 11 12] + #time/timer = [period: 15 tick: 0] + #gravity = 2 + #x = true + +block + ~ #x + ix = #ball.vy > 10 + iy = #ball.vy < 5 + #ball.y{ix | iy} := #ball.vy * 2 + +block + #test = #ball{1,2} + #ball{3,2}", Value::F32(F32::new(32.0))); + +test_mech!(set_inline_row," +block + #launch-point = [x: 0 y: 0] +block + #launch-point := [x: 10 y: 20] +block + #test = #launch-point.x + #launch-point.y", Value::F32(F32::new(30.0))); + +test_mech!(set_empty_table," +block + #x = [] +block + #x := [10 20; 30 40] +block + #test = stats/sum(table: #x)", Value::F32(F32::new(100.0))); + +test_mech!(set_table_index_row_dependency," +block + #x = [x: 3] + +block + #balls = [x: 10] + +block + #clicked = true + +block + ~ #x + #balls.x{#clicked} := #x.x + +block + #test = #balls.x", Value::F32(F32::new(3.0))); + +// ## Concat + +test_mech!(concat_horzcat_data," +block + x = 1:10 + y = 11:20 + #z = [x y] + +block + #test = #z{1,1} + #z{1,2} + #z{2,1} + #z{1,1}", Value::F32(F32::new(15.0))); + +test_mech!(concat_horzcat_autofill,r#" +block + x = ["a"; "b"; "c"; "d"] + #y = [type: 1 class: "table" result: x] + +block + #test = stats/sum(column: #y.type)"#, Value::F32(F32::new(4.0))); + +// ## Append + +test_mech!(append_row_empty," +block + #robot = [|name position|] + +block + #robot += [name: 10 position: 20] + +block + #test = #robot.name + #robot.position", Value::F32(F32::new(30.0))); + +test_mech!(append_row_inline," +block + #foo = [|x y z| + 5 6 7] + +block + #foo += [x: 100 y: 110 z: 120] + +block + ix = #foo.x > 50 + #test = #foo.x{ix}", Value::F32(F32::new(100.0))); + +test_mech!(append_row_expression," +block + #x = 20 +block + #x += 10 +block + #test = stats/sum(column: #x)", Value::F32(F32::new(30.0))); + +test_mech!(append_row_math," +block + #x = 20 +block + #x += 5 * 2 +block + #test = stats/sum(column: #x)", Value::F32(F32::new(30.0))); + +test_mech!(append_row_math_empty_named," +block + #x = [|x|] +block + #x += 5 * 2 +block + #test = stats/sum(column: #x)", Value::F32(F32::new(10.0))); + +test_mech!(append_row_select_linear_range," +block + #x = [10 20; 30 40;] +block + x = [10 20 30] + ix = 1:2 + #x += x{ix} +block + #test = stats/sum(table: #x)", Value::F32(F32::new(130.0))); + +test_mech!(append_row_select_linear," +block + #x = [10; 30] +block + x = [10; 20; 30] + #x += x{2} +block + #test = stats/sum(column: #x)", Value::F32(F32::new(60.0))); + +test_mech!(append_multiple_rows," +block + #x = [|x y| + 1 2] +block + #x += [|x y| + 3 4 + 5 6] +block + #test = stats/sum(table: #x)", Value::F32(F32::new(21.0))); + +test_mech!(append_multirow_empty," +block + #x = [|x y|] + +Define the environment + #x += [|x y| 1 2; 3 4] + +block + #test = #x.x{1} + #x.x{2} + #x.y{1} + #x.y{2}", Value::F32(F32::new(10.0))); + + +test_mech!(append_arbitrary_kinds_x," +block + #x = [|x y z|] + +block + #x += [y: 10, x: 99] + +block + #test = #x.x", Value::U64(U64::new(99))); + +test_mech!(append_arbitrary_types_y," +block + #x = [|x y z|] + +block + #x += [y: 10, x: 99] + +block + #test = #x.y", Value::F32(F32::new(10.0))); + +test_mech!(append_inline_row_singleton," +block + #x = [|x y|] +block + #x += [x: 10] +block + #test = stats/sum(table: #x)", Value::F32(F32::new(10.0))); + +test_mech!(append_inline_row_two_rows," +block + #x = [|x y|] +block + #x += [x: 10] +block + #x += [y: 20] +block + #test = stats/sum(table: #x)", Value::F32(F32::new(30.0))); + +test_mech!(append_inline_two_rows_set," +block + #x = [|x y|] +block + #x += [x: 10] +block + #x += [y: 20] +block + #x{1,2} := 123 + #x{2,1} := 456 +block + #test = stats/sum(table: #x)", Value::F32(F32::new(609.0))); + +test_mech!(append_any_column,r#" +block + #x = [|x y<_> z<_>|] +block + #x += [x: 123 y: "Hello" z: "Hello"] +block + #x += [x: 456 y: 10, z: 10] +block + #test = set/all(column: #x.y == #x.z)"#, Value::Bool(true)); + +test_mech!(append_unordered,r#" +block + #x = 1 +block + #y = #x +block + #x += 2 +block + #test = stats/sum(column: #y)"#, Value::F32(F32::new(3.0))); + +// ## Logic + +test_mech!(logic_and," +block + #foo = [|x| + 5 + 8 + 11] +block + ix1 = #foo.x > 5 + ix2 = #foo.x <= 11 + ix3 = ix1 & ix2 + #test = stats/sum(column: #foo{ix3})", Value::F32(F32::new(19.0))); + +test_mech!(logic_and_filter_inline," +block + #foo = [|x| + 5 + 8 + 11] +block + ix = #foo.x > 5 & #foo.x <= 11 + #test = stats/sum(column: #foo{ix})", Value::F32(F32::new(19.0))); + +test_mech!(logic_and_composed," +block + #foo = [|x| + 5 + 8 + 9 + 11] +block + ix = #foo.x > 5 & #foo.x <= 11 & #foo.x >= 9 + #test = stats/sum(column: #foo{ix})", Value::F32(F32::new(20.0))); + +test_mech!(logic_or," +block + #foo = [|x| + 5 + 8 + 11] +block + ix1 = #foo.x < 7 + ix2 = #foo.x > 9 + ix3 = ix1 | ix2 + #test = stats/sum(column: #foo{ix3})", Value::F32(F32::new(16.0))); + +test_mech!(logic_xor," +block + x = [true; false; true; false] + y = [false; true; true; false] + ix = x xor y + z = [1;2;3;4] + #test = stats/sum(column: z{ix})", Value::F32(F32::new(3.0))); + +test_mech!(logic_xor2," +block + x = [true; false; true; false] + y = [false; true; true; false] + ix = x ⊕ y + z = [1;2;3;4] + #test = stats/sum(column: z{ix})", Value::F32(F32::new(3.0))); + +test_mech!(logic_xor3," +block + x = [true; false; true; false] + y = [false; true; true; false] + ix = x ⊻ y + z = [1;2;3;4] + #test = stats/sum(column: z{ix})", Value::F32(F32::new(3.0))); + +test_mech!(logic_not," +block + x = [true; false; true; false] + #y = ¬x + +block + x = [1;2;3;4] + #test = stats/sum(column: x{#y})", Value::F32(F32::new(6.0))); + +test_mech!(logic_not2," +block + x = [true; false; true; false] + #y = !x + +block + x = [1;2;3;4] + #test = stats/sum(column: x{#y})", Value::F32(F32::new(6.0))); + +// ## Strings + +test_mech!(string_basic,r#" +block + #test = "Hello World""#, Value::from_str("Hello World")); + +test_mech!(string_table,r#" +block + #test = ["Hello" "World"]"#, Value::from_str("Hello")); + +test_mech!(string_typed_col,r#" +block + #test = [|x| + "Hello" ]"#, Value::from_str("Hello")); + +test_mech!(string_backslash,r#" +block + #test = ["Hi\n"]"#, Value::from_str("Hi\\n")); + +test_mech!(string_empty,r#" +block + #test = ["" "World"]"#, Value::from_str("")); + +test_mech!(string_named_attributes, r#"#test = [type: "h1" text: "An App"]"#, Value::from_str("h1")); + +// ## Nesting + +test_mech!(nesting_basic,r#" +block + #app = [2 [5 7]] + +block + #test = #app{2}{2}"#, Value::F32(F32::new(7.0))); + + +test_mech!(nesting_triple,r#" +block + #app = [1 [2 [31 3]]] + +block + #test = #app{2}{2}{1}"#, Value::F32(F32::new(31.0))); + +test_mech!(nesting_concat,r#" +block + ball = [1 [2 3]] + line = [4 [5 6]] + #out = [ball; line] + +block + #test = #out{2,2}{2} + #out{1,2}{1}"#, Value::F32(F32::new(8.0))); + +test_mech!(nesting_math,r#" +block + #app = [1 [2 [31 3]]] + +block + #test = #app{2}{2}{1} * 2"#, Value::F32(F32::new(62.0))); + +test_mech!(nesting_math_select_range,r#" +block + #app = [1 [2 [3 4 5]]] + +block + x = #app{2}{2}{1,:} + #test = stats/sum(row: x)"#, Value::F32(F32::new(12.0))); + +test_mech!(nesting_inline_table,r#" +block + #robot = [x: 20 y: [x: 30 y: 50]] + +block + #test = #robot.y{:}{1} + #robot.y{:}{2}"#, Value::F32(F32::new(80.0))); + + test_mech!(nesting_chained_dot_indexing,r#" +block + #app2 = [x: [a: 1 b: 2 c: 3] y: [x: 7 z: 8]] + +block + #test = #app2.y.z + #app2.x.b"#, Value::F32(F32::new(10.0))); + +test_mech!(nesting_chained_dot_indexing_first_col,r#" +block + #app2 = [x: [a: 1 b: 2]] + +block + #test = #app2.x.b"#, Value::F32(F32::new(2.0))); + +test_mech!(nesting_column_table_select,r#" +block + #x = [[|x y z | + 1 2 3 + 4 5 6 + 7 8 9], + [|x y z | + 2 3 4 + 5 6 7 + 8 9 10], + ] +block + #test = #x{1}{3,3} + #x{2}{1,3}"#, Value::F32(F32::new(13.0))); + +test_mech!(nesting_select_local_nested_column,r#" +block + y = [[1234]] + #test = y{1}{1}"#, Value::F32(F32::new(1234.0))); + +test_mech!(nesting_access_matrix," +block + x = [[|x y z | + 1 2 3 + 4 5 6 + 7 8 9], + [|x y z | + 2 3 4 + 5 6 7 + 8 9 10], + ] + #test = x{1}{2, 3}", Value::F32(F32::new(6.0))); + +test_mech!(nesting_math_add3by3_matrices," +block + x = [[|x y z | + 1 2 3 + 4 5 6 + 7 8 9], + [|x y z | + 2 3 4 + 5 6 7 + 8 9 10], + ] + #test = x{1}{3, 3} + x{2}{1, 3}", Value::F32(F32::new(13.0))); + +test_mech!(nesting_math_dot_index," +block + x = [[|x y z | + 1 2 3 + 4 5 6 + 7 8 9], + [|x y z | + 2 3 4 + 5 6 7 + 8 9 10], + ] + #test = x{1}.z{3} + x{2}.z{1}", Value::F32(F32::new(13.0))); + +// ## Indexing + +test_mech!(indexing_global,r#" +block + x = [true; false; true; false] + y = [false; true; true; false] + #y = x xor y + +block + x = [1;2;3;4] + #test = stats/sum(column: x{#y})"#, Value::F32(F32::new(3.0))); + + +test_mech!(indexing_real_indices,r#" +block + ix = [2; 1; 2; 2; 3; 3; 1] + b = [47; 93; 38] + q = b{ix} + #test = stats/sum(column: q)"#, Value::F32(F32::new(449.0))); + +// ## Functions + +test_mech!(function_stats_sum,r#" +block + x = [1;2;3;4;5] + #test = stats/sum(column: x)"#, Value::F32(F32::new(15.0))); + +test_mech!(function_stats_sum_row,r#" +block + x = [1 2 3 4 5] + #test = stats/sum(row: x)"#, Value::F32(F32::new(15.0))); + +test_mech!(function_stats_sum_row_neg,r#" +block + x = [-1 -2 -3 -4 -5] + #test = stats/sum(row: x)"#, Value::F32(F32::new(-15.0))); + +test_mech!(function_stats_sum_row_col,r#" +block + x = [1;2;3;4;5] + y = stats/sum(row: x) + #test = y{1} + y{2} + y{3} + y{4} + y{5}"#, Value::F32(F32::new(15.0))); + +test_mech!(function_stats_sum_row_col_neg,r#" +block + x = [-1;-2;-3;-4;-5] + y = stats/sum(row: x) + #test = y{1} + y{2} + y{3} + y{4} + y{5}"#, Value::F32(F32::new(-15.0))); + +test_mech!(function_stats_sum_table,r#" +block + x = [1 2 3; 4 5 6] + #test = stats/sum(table: x)"#, Value::F32(F32::new(21.0))); + +test_mech!(function_stats_sum_table_neg,r#" +block + x = [-1 -2 -3; -4 -5 -6] + #test = stats/sum(table: x)"#, Value::F32(F32::new(-21.0))); + +test_mech!(function_add_functions,r#" +block + x = [1 2 + 4 0 + 0 7] + #test = stats/sum(column: x{:,1}) + stats/sum(column: x{:,2})"#, Value::F32(F32::new(14.0))); + +test_mech!(function_set_any,r#" +block + x = [1; 2; 3; 4; 5] + y = x > 4 + #test = set/any(column: y)"#, Value::Bool(true)); + +test_mech!(function_set_any_false,r#" +block + x = [1; 2; 3; 4; 5] + y = x > 5 + #test = set/any(column: y)"#, Value::Bool(false)); + +test_mech!(function_inline_args,r#" +block + #test = stats/sum(row: [1 2 3 4])"#, Value::F32(F32::new(10.0))); + +test_mech!(function_inline_colum_args,r#" +block + #test = stats/sum(column: [1; 2; 3; 4])"#, Value::F32(F32::new(10.0))); + +test_mech!(function_inside_anonymous_table,r#" +block + #mech/test = ["foo", 3, stats/sum(column: 1:2)] +block + #test = #mech/test{2} == #mech/test{3}"#, Value::Bool(true)); + +test_mech!(function_user_defined,r#" +[a] = foo(x) + y = 3 + z = x * 2 + a = z + y * 3 +y = foo(x: 10) +#test = y"#, Value::F32(F32::new(29.0))); + +test_mech!(function_user_defined_multiple,r#" +[a] = foo(x) + a = x * 2 +y = foo(x: 20) +z = foo(x: 10) +#test = y + z"#, Value::F32(F32::new(60.0))); + +test_mech!(function_user_defined_nested,r#" +[a] = foo(y) + a = y * 3 +[a] = bar(b) + a = foo(y: b) + 2 +y = bar(b: 20) +#test = y"#, Value::F32(F32::new(62.0))); + + + +// ## Markdown + +test_mech!(markdown_program_title, r#" +Title +====== + #test = 123"#, Value::F32(F32::new(123.0))); + +test_mech!(markdown_program_title_underline, r#" +Title +====== +#test = 123"#, Value::F32(F32::new(123.0))); + +test_mech!(markdown_program_subtitle_underline, r#" +Title +====== +SubTitle +--------- +#test = 123"#, Value::F32(F32::new(123.0))); + +test_mech!(markdown_no_program_title, r#"paragraph + #test = 123"#, Value::F32(F32::new(123.0))); + +test_mech!(markdown_section_title, r#" +Title +====== + +Paragraph + +Section +-------- + + #test = 123"#, Value::F32(F32::new(123.0))); + +test_mech!(markdown_inline_code, r#" +Title +====== + +Paragraph including `inline code` + +Section +-------- + + #test = 123"#, Value::F32(F32::new(123.0))); + +test_mech!(markdown_list, r#" +Title +====== + +Paragraph including `inline code` + +Section +-------- + +- Item 1 +- Item 2 +- Item 3 + + #test = 123"#, Value::F32(F32::new(123.0))); + +test_mech!(markdown_list_inline_code, r#" +Title +====== + +Paragraph including `inline code` + +Section +-------- + +- Item `some code` +- Item `some code` +- Item `some code` + + #test = 123"#, Value::F32(F32::new(123.0))); + +test_mech!(markdown_code_block, r#" +Title +====== + +Paragraph including `inline code` + +Section +-------- + +``` +A regular code block +``` + + #test = 123"#, Value::F32(F32::new(123.0))); + +// ## Mechdown (Markdown extensions for Mech) + +test_mech!(mechdown_inline_mech_code, r#" +Title +====== + +Paragraph including `inline mech code` is `#test` + +Section +-------- + + #test = 123"#, Value::F32(F32::new(123.0))); + +test_mech!(mechdown_block_directives, r#" +block + #test = 1 + +```mech:disabled + #test := 2 +``` +"#, Value::F32(F32::new(1.0))); + +test_mech!(mechdown_sub_sub_titles, r#" +Title +====== + +block + #x = 1 + +Subtitle +--------- + +block + #y = 2 + +Subsubtitle +------------ + +block + #test = #x + #y"#, Value::F32(F32::new(3.0))); + +test_mech!(mechdown_flat, r#" +Hello World +============ + +x = 10 + 15 +y = 20 +z = [1 2 3 4] +q = z + y + x +#test = stats/sum(row: q)"#, Value::F32(F32::new(190.0))); + +test_mech!(mechdown_flat_newlines, r#" +Hello World +============ + +x = 10 + 15 + +y = 20 + + +z = [1 2 3 4] + +q = z + y + x + +#test = stats/sum(row: q)"#, Value::F32(F32::new(190.0))); + +// ## Comments + +test_mech!(comment_line, r#" +block + -- This is a comment + #test = 123"#, Value::F32(F32::new(123.0))); + +test_mech!(comment_table_row, r#" +x = [1 + --2 + 3] +#test = stats/sum(column: x)"#, Value::F32(F32::new(4.0))); + +test_mech!(comment_table_start_row, r#" +x = [1 +--2 + 3] +#test = stats/sum(column: x)"#, Value::F32(F32::new(4.0))); + +// ## Table split + +test_mech!(table_split, r#" +block + x = [7 8;9 6] + #q >- x +block + x = #q{1}{1,:} + y = #q{2}{1,:} + #test = stats/sum(row: [x y])"#, Value::F32(F32::new(30.0))); + +test_mech!(table_split_global, r#" +block + z = [7 8;9 6] + q >- z + #x = q +block + x = #x{1}{1,:} + y = #x{2}{1,:} + #test = stats/sum(row: [x y])"#, Value::F32(F32::new(30.0))); + +// ## Table flatten + +test_mech!(table_flatten, r#" +block + #y = [[1;2];[3]] +block + x -< #y + #test = stats/sum(column: x)"#, Value::F32(F32::new(6.0))); + +// ## Boolean values + +test_mech!(boolean_anonymous_table, r#" +block + #y = [1; 2; 3] + +block + #x = [true; false; true] + +block + #z = #y{#x} + +block + #test = #z{1} + #z{2}"#, Value::F32(F32::new(4.0))); + +test_mech!(boolean_literal_true, r#"#test = true"#, Value::Bool(true)); + +test_mech!(boolean_literal_true_check, r#"#test = ✓"#, Value::Bool(true)); + +test_mech!(boolean_literal_false, r#"#test = false"#, Value::Bool(false)); + +test_mech!(boolean_literal_false_x, r#"#test = ✗"#, Value::Bool(false)); + +test_mech!(boolean_literals_and_operator, r#" +block + x = true + y = false + #test = x & y"#, Value::Bool(false)); + +test_mech!(boolean_bug, r#" +block + t = false + f = true + #test = f | t"#, Value::Bool(true)); + +// ## Scheduler + +test_mech_txn!(scheduler_base_linear,r#" +block + #x = [1 2 3] +block + #y = #x + 10 +block + #z = #y + 2 +block + #test = #z{1}"#, TXN, Value::F32(F32::new(21.0))); + +// ## Temporal Operators + +test_mech_txn!(temporal_whenever_basic_no_trigger,r#" +block + #time/timer = [period: 16, ticks: 0] + +block + #x = [x: 1 y: 2] + #y = 3 + +block + ~ #time/timer.ticks + #q = #x.y + #x.x := #x.x + #y + +block + #test = #x.x"#, TXN2, Value::F32(F32::new(4.0))); + +test_mech_txn!(temporal_whenever_basic_with_trigger,r#" +block + #time/timer = [period: 16, ticks: 0] + +block + #x = [x: 1 y: 2] + #y = 3 + +block + ~ #time/timer.ticks + #q = #x.y + #x.x := #x.x + #y + +block + #test = #x.x"#, TXN3, Value::F32(F32::new(7.0))); + +test_mech_txn!(temporal_whenever_blocks,r#" +block + #time/timer = [period: 1000, ticks: 0] + #balls = [|x y vx vy| + 1.0 1.0 1.0 1.0 + 50.0 80.0 2.0 10.0] + #gravity = 1.0 + +block + ~ #time/timer.ticks + #balls.x := #balls.x + #balls.vx + #balls.y := #balls.y + #balls.vy + #balls.vy := #balls.vy + #gravity + +Keep the balls within the boundary height + ~ #time/timer.ticks + iy = #balls.y > 100.0 + #balls.y{iy} := 100.0 + #balls.vy{iy} := #balls.vy * -0.80 +block + #test = #balls.y{2} + #balls.vy{2}"#, TXN4, Value::F32(F32::new(90.4))); + +test_mech_txn!(bouncing_balls,r#" +block + #time/timer = [|period ticks|] + +block + #time/timer += [period: 16] + #balls = [|x y vy| + 20 10 2 + 100 50 1 + 300 100 3 ] + #gravity = 1 + +block + ~ #time/timer.ticks + #balls.y := #balls.y + #balls.vy + #balls.vy := #balls.vy + #gravity + +block + ~ #time/timer.ticks + iy = #balls.y > 500 + #balls.y{iy} := 500 + #balls.vy{iy} := #balls.vy * -0.8 + +Define the shapes + #circle = [ + shape: "circle" + parameters: [ + center-x: #balls.x + center-y: #balls.y + radius: 10 + fill: 0xFF0000 + line-width: 2 + ] + ] + +Draw a shape to the canvas + shape = #circle + canvas = [ + type: "canvas" + contains: [|shape parameters| shape] + parameters: [width: 500.0 height: 500.0] + ] + #html/app = [ + root: "mech-root" + contains: [|type contains parameters| canvas] + ] + +block + #test = stats/sum(table: #balls)"#, TXN4, Value::F32(F32::new(607.0))); + +test_mech_txn!(bouncing_balls_out_of_order,r#" +Two moc-kin-flo-his + #parameters = [ + center-y: #balls.y + ] + +One nes-sta-mas-lac + #balls = [|y vy | + 10 1 + 100 30 ] + #time/timer = [period: 1 ticks: 0] + +Three was-lue-neb-kit + ~ #time/timer.ticks + #balls.y := #balls.y + #balls.vy + +block + #test = stats/sum(table: #parameters)"#, TXN4, Value::F32(F32::new(172.0))); + +// ## Async + +test_mech_txn!(async_satisfy_blocks,r#" +block + #z = 123 + #y = 456 +block + #b = #z + #y +block + #test = #b + #x"#,TXN5,Value::F32(F32::new(621.0))); + +test_mech_txn!(async_late_resolved,r#" +Set up drawing elements + #circle = [ + shape: "circle" + parameters: [ + center-x: 100 + center-y: 200 + radius: #radius + fill: 0xAA00AA + line-width: 3 + ] + ] + +Draw to canvas + #canvas = [ + type: "canvas" + contains: [|shape parameters| #circle] + parameters: [width: 1000 height: 500] + ] + +Attach game to root + #html/app = [ + root: 12.34 + contains: [|type contains parameters| #canvas] + ] + +block + #test = #html/app.root"#, TXN6, Value::F32(F32::new(12.34))); + diff --git a/src/syntax/tests/parser.rs b/src/syntax/tests/parser.rs new file mode 100644 index 0000000..8b382d3 --- /dev/null +++ b/src/syntax/tests/parser.rs @@ -0,0 +1,321 @@ +#![allow(warnings)] +extern crate mech_syntax; +extern crate mech_core; +#[macro_use] +extern crate lazy_static; +use mech_syntax::parser::{TextFormatter, parse}; +use std::cell::RefCell; +use std::rc::Rc; +use mech_core::*; + + /// Compare error locations (the reported row and col numbers). + macro_rules! test_parser { + ($func:ident, $input:tt, $($expected_err_loc:expr),*) => ( + #[test] + fn $func() { + let text = $input; + let err_locations_exp = vec![$($expected_err_loc),*]; + let parse_result = parse($input); + + // Parsing should succeed + if (err_locations_exp.is_empty()) { + assert!(parse_result.is_ok()); + return; + } + + // Parsing should fail + let error_report = match(parse_result) { + Err(e) => match e.kind { + MechErrorKind::ParserError(_, report, _) => report, + _ => panic!("Expect mech error kind: ParserError"), + } + _ => panic!("Expect parser error"), + }; + + // Parser error should match with expected + assert_eq!(error_report.len(), err_locations_exp.len()); + for i in 0..error_report.len() { + let rng = error_report[i].cause_rng; + // error range never ends at first column, so it's safe to `minus 1` here + let reported_location = (rng.end.row, rng.end.col - 1); + let expected_location = err_locations_exp[i]; + assert_eq!(reported_location, expected_location); + } + + // Formatting function doesn't crash + let tf = TextFormatter::new(text); + let msg = tf.format_error(&error_report); + assert_ne!(msg.len(), 0); + } + ) + } + +///////////////////////////////////////////////////////////////////////////////// +test_parser!(err_empty_1, "", (1, 1)); +test_parser!(err_empty_2, "\n", (1, 1)); +test_parser!(err_empty_3, "\n\n \n\n\n", (5, 1)); +test_parser!(ok_simple_text, "Paragraph text", ); + +/////// LITERALS /////// +test_parser!(err_decimal_literal, r#"x = 0d0f1"#, (1, 8)); +test_parser!(err_hexadecimal_literal, r#"x = 0x0g1"#, (1, 8)); +test_parser!(err_octal_literal, r#"x = 0o081"#, (1, 8)); +test_parser!(err_binary_literal, r#"x = 0b021"#, (1, 8)); + +///////// SUBSCRIPTS /////// +test_parser!(err_subscript_missing_index, r#" +block + x = y{ + z = 7 +"#, (3, 9)); +test_parser!(err_subscript_missing_rbrace, r#" +block + x = y{5 + 3 + z = 7 +"#, (3, 14)); +test_parser!(err_subscript_illegal_index, r#" +block + x = y{$} + z = 7 +"#, (3, 9)); + +///////// DOT INDEX /////// +test_parser!(err_dot_index_missing_value, r#" +block + x = y. + z = 7 +"#, (3, 9)); +test_parser!(err_dot_index_illegal_value, r#" +block + x = y.$ + z = 7 +"#, (3, 9)); + +///////// SWIZZLE /////// +test_parser!(err_swizzle_missing_value_1, r#" +block + x = a.b, + z = 7 +"#, (3, 11)); +test_parser!(err_swizzle_missing_value_2, r#" +block + x = a.b,c, + z = 7 +"#, (3, 12)); +test_parser!(err_swizzle_illegal_value_1, r#" +block + x = a.b,$ + z = 7 +"#, (3, 11)); +test_parser!(err_swizzle_illegal_value_2, r#" +block + x = a.b,c,$ + z = 7 +"#, (3, 12)); + +///////// KIND ANNOTATION /////// +test_parser!(err_kind_annotation_missing_value_1, r#" +block + #x<> = 7 + z = 7 +"#, (3, 6)); +test_parser!(err_kind_annotation_missing_value_2, r#" +block + #x = 7 + z = 7 +"#, (3, 13)); + +///////// TABLE /////// +test_parser!(err_table_missing_name, r#" +block + # = 7 + z = 7 +"#, (3, 4)); + +///////// TABLE BINDING /////// +test_parser!(err_binding_extra_space_before_colon, r#" +block + x = [a : 7, b: 8] + z = 7 +"#, (3, 9)); +test_parser!(err_binding_missing_value, r#" +block + x = [a: , b: 8] + z = 7 +"#, (3, 11)); +test_parser!(err_binding_missing_separater, r#" +block + x = [a: 8b: 8] + z = 7 +"#, (3, 12)); +test_parser!(err_binding_missing_space_after_comma, r#" +block + x = [a: 8,b: 8] + z = 7 +"#, (3, 13)); +test_parser!(err_binding_missing_space_after_comma_sp, r#" +block + x = [a: u.u1,b: 8] + z = 7 +"#, (3, 18)); +test_parser!(err_binding_missing_after_second_colon, r#" +block + x = [a: u.u1, b:8] + z = 7 +"#, (3, 19)); + +///////// FUNCTION BINDING /////// +test_parser!(err_function_binding_missing_colon, r#" +block + x = math/sin(angle 90) + z = 7 +"#, (3, 21)); +test_parser!(err_function_binding_missing_space, r#" +block + x = math/sin(angle:90) + z = 7 +"#, (3, 22)); +test_parser!(err_function_binding_missing_value, r#" +block + x = math/sin(angle: ) + z = 7 +"#, (3, 23)); + +///////// FUNCTION /////// +test_parser!(err_function_no_args, r#" +block + x = math/sin() + z = 7 +"#, (3, 16)); +test_parser!(err_function_unmatched_paren, r#" +block + x = math/sin(angle: (((1 + 3) * 2)) + z = 7 +"#, (3, 38)); + +///////// AMBIGIOUS TABLE /////// +test_parser!(ok_indexing_complex, r#" +block + u = [u1: 1, u2: 2, u3: 3] + t = [t1: u.u1, u2: 2, t3: u.u3] + x = t.t1,t2,t3 + z = 7 +"#,); +test_parser!(err_ambigious_table_as_annonymous, r#" +block + u = [u1:1, u2: 2, u3: 3] + z = 7 +"#, (3, 17), (3, 24)); +test_parser!(err_ambigious_table_as_inline, r#" +block + u = [u1: 1, u2:2, u3: 3] + z = 7 +"#, (3, 18)); +test_parser!(ok_ambigious_table_as_anonymous_ranges, r#" +block + t = [ta:u.ua,tb:u.ub,tc:u.uc] +"#,); +test_parser!(ok_ambigious_table_as_inline_ranges, r#" +block + t = [ta: u.ua,tb:u.ub,tc:u.uc] +"#,); +// NOTE: This test justifies a bad parser behavior. Intuitively, the test input should +// be interpreted as inline table with 3 bindings (ta, tb, tc) and the error should be +// the missing space after each comma. However by our grammar this is recongnized as +// inline table with a single binding (ta), and it prompts user to remove spaces after +// the colons. +test_parser!(err_ambigious_table_as_inline_range_err, r#" +block + t = [ta: u.ua,tb: u.ub,tc: u.uc] +"#, (3, 20), (3, 29)); + +///////// COMMENT /////// +test_parser!(err_comment_missing_content, r#" +block + x = 1 + -- + z =2 +"#, (4, 5), (5, 6)); +test_parser!(err_comment_illegal_content, r#" +block + x = 1 + --abc$def + z =2 +"#, (4, 8), (5, 6)); + +///////// USER FUNCTION /////// +test_parser!(ok_user_function, r#" +[a] = foo(y) + a = y * 3 + +[a] = bar(b) + a = foo(y: b) + 2 + +block + #y = bar(b: 20) +"#, ); +test_parser!(err_user_function_missing_output_kind, r#" +[a,b] = foo(y) + a = y * 3 +"#, (2, 10)); +test_parser!(err_user_function_missing_right_bracket, r#" +[a = foo(y) + a = y * 3 +"#, (2, 9)); +test_parser!(err_user_function_no_space, r#" +[a]=foo(y) + a = y * 3 +"#, (2, 9)); +test_parser!(err_user_function_missing_name, r#" +[a] = (y) + a = y * 3 +"#, (2, 12)); +test_parser!(err_user_function_missing_paren, r#" +[a] = foo y + a = y * 3 +"#, (2, 15)); +test_parser!(err_user_function_one_line_1, r#" +[a] = foo(y) a = y * 3 +"#, (2, 23)); +test_parser!(err_user_function_one_line_2, r#" +[a] bar() = foo(y: b) + 2 +"#, (2, 10)); +test_parser!(err_user_function_missing_body, r#" +[a] = foo(y) + +block + #y = bar(b: 20) +"#, (3, 1)); +test_parser!(err_user_function_error_in_body, r#" +[a] = foo(y) + a = y + 1 + +block + #y = bar(b: 20) +"#, (3, 3)); + +///////// ERROR RECOVERY /////// +test_parser!(err_section_recovery_too_many_titles_1, r#" +Title +=========== + +block + #x = 5 + +Title2 +=========== +"#, (9, 1)); +test_parser!(err_section_recovery_too_many_titles_2, r#" +Title +=========== + +block + #x = 5 + +Title2 +=========== + +block + #y = () +"#, (9, 1), (12, 9)); +///////////////////////////////////////////////////////////////////////////////// \ No newline at end of file From 669b8bd797971877c051cbd05d6ae76e5663ce29 Mon Sep 17 00:00:00 2001 From: cmontella Date: Mon, 22 May 2023 21:18:00 -0400 Subject: [PATCH 69/84] add wasm --- src/utilities/Cargo.toml | 32 +++ src/utilities/LICENSE | 201 ++++++++++++++++ src/utilities/README.md | 23 ++ src/utilities/src/lib.rs | 344 ++++++++++++++++++++++++++ src/wasm/.appveyor.yml | 11 + src/wasm/.cargo-ok | 0 src/wasm/Cargo.toml | 75 ++++++ src/wasm/LICENSE | 201 ++++++++++++++++ src/wasm/README.md | 23 ++ src/wasm/src/lib.rs | 493 ++++++++++++++++++++++++++++++++++++++ src/wasm/src/websocket.rs | 141 +++++++++++ src/wasm/tests/web.rs | 13 + 12 files changed, 1557 insertions(+) create mode 100644 src/utilities/Cargo.toml create mode 100644 src/utilities/LICENSE create mode 100644 src/utilities/README.md create mode 100644 src/utilities/src/lib.rs create mode 100644 src/wasm/.appveyor.yml create mode 100644 src/wasm/.cargo-ok create mode 100644 src/wasm/Cargo.toml create mode 100644 src/wasm/LICENSE create mode 100644 src/wasm/README.md create mode 100644 src/wasm/src/lib.rs create mode 100644 src/wasm/src/websocket.rs create mode 100644 src/wasm/tests/web.rs diff --git a/src/utilities/Cargo.toml b/src/utilities/Cargo.toml new file mode 100644 index 0000000..d8f41fa --- /dev/null +++ b/src/utilities/Cargo.toml @@ -0,0 +1,32 @@ +[package] +name = "mech-utilities" +version = "0.1.0" +authors = ["Corey Montella "] +description = "Shared components and utilities for Mech" +documentation = "http://docs.mech-lang.org" +homepage = "https://mech-lang.org" +repository = "https://github.com/mech-lang/utilities" +keywords = ["mech"] +categories = ["science::robotics", "science"] +license = "Apache-2.0" +readme = "README.md" +edition = "2021" + +[badges] +gitlab = { repository = "mech-lang/utilities", branch = "main" } +maintenance = { status = "actively-developed" } + +[features] +default = ["web"] +web = ["websocket"] + +[dependencies] +mech-core = {git = "https://gitlab.com/mech-lang/core", branch = "v0.1-beta"} + +serde = {version = "1.0.152", default-features = false, features = ["alloc"] } +serde_derive = "1.0.152" +hashbrown = "0.13.1" +crossbeam-channel = "0.5.6" + +[target.'cfg(not(target_arch = "wasm32"))'.dependencies] +websocket = {version = "0.26.5", optional = true, default-features = false, features = ["sync"]} \ No newline at end of file diff --git a/src/utilities/LICENSE b/src/utilities/LICENSE new file mode 100644 index 0000000..a04baa3 --- /dev/null +++ b/src/utilities/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2018 Corey Montella + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/src/utilities/README.md b/src/utilities/README.md new file mode 100644 index 0000000..bdf554a --- /dev/null +++ b/src/utilities/README.md @@ -0,0 +1,23 @@ +

    + +

    + +Mech is a language for developing **data-driven**, **reactive** systems like robots, games, and animations. It makes **composing**, **transforming**, and **distributing** data easy, allowing you to focus on the essential complexity of your project. + +You can try Mech online at [https://mech-lang.org/try](https://mech-lang.org/try). + +Usage and installation instructions can be found in the [documentation](https://mech-lang.org/#/docs/index.mec) or the [main Mech repository](https://github.com/mech-lang/mech). + +Be sure to follow on our [blog](https://mech-lang.org/blog/)([RSS](https://mech-lang.org/feed.xml))! + +# Mech Utilities + +General utilities for Mech. + +## Project Status + +Mech is currently in the **beta** stage of development. This means that the language is at a suitable stage for a wider audience. While most language feature implementations are started, none are finished, and some new features may, while others could be removed. Backwards and forwards compatibility of Mech programs is not guaranteed at this time. + +## License + +Apache 2.0 \ No newline at end of file diff --git a/src/utilities/src/lib.rs b/src/utilities/src/lib.rs new file mode 100644 index 0000000..63f997b --- /dev/null +++ b/src/utilities/src/lib.rs @@ -0,0 +1,344 @@ +#![allow(warnings)] +#![allow(dead_code)] +#![feature(get_mut_unchecked)] +#[macro_use] +extern crate serde_derive; +extern crate serde; +extern crate mech_core; +extern crate hashbrown; +extern crate crossbeam_channel; +extern crate core as rust_core; + +use rust_core::fmt; +use std::sync::Arc; +use hashbrown::{HashMap, HashSet}; +use mech_core::*; +use crossbeam_channel::Sender; +use std::rc::Rc; +use std::cell::RefCell; + +// ## Client Message + +#[derive(Serialize, Deserialize, Debug)] +pub enum SocketMessage { + Ping, + Pong, + RemoteCoreConnect(String), + RemoteCoreDisconnect(u64), + Listening((TableId,RegisterIndex,RegisterIndex)), + Producing((TableId,RegisterIndex,RegisterIndex)), + Code(MechCode), + RemoveBlock(usize), + Transaction(Transaction), +} + +// Run loop messages are sent to the run loop from the client + +// This is dumb that I need to put this on every line :( +#[cfg(not(target_arch = "wasm32"))] +#[cfg(feature = "web")] +extern crate websocket; + +#[cfg(not(target_arch = "wasm32"))] +#[cfg(feature = "web")] +pub enum MechSocket { + UdpSocket(String), + WebSocket(websocket::sync::Client), + WebSocketSender(websocket::sender::Writer), +} + +#[cfg(not(target_arch = "wasm32"))] +#[cfg(feature = "web")] +impl fmt::Debug for MechSocket { + #[inline] + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + &MechSocket::UdpSocket(ref address) => write!(f, "MechSocket::UdpSocket({})", address), + &MechSocket::WebSocket(ref ws) => write!(f, "MechSocket::WebSocket({})", ws.peer_addr().unwrap()), + &MechSocket::WebSocketSender(_) => write!(f, "MechSocket::WebSocketSender()"), + } + } +} + +type CoreIndex = u64; + +#[cfg(not(target_arch = "wasm32"))] +#[cfg(feature = "web")] +#[repr(C)] +#[derive(Debug)] +pub enum RunLoopMessage { + Ping, + Pong, + Stop, + StepBack, + StepForward, + Pause, + Resume, + Reset(CoreIndex), + PrintDebug, + //Table(Table), + String((String, Option)), + Exit(i32), + PrintCore(Option), + DumpCore(CoreIndex), + NewCore, + PrintTable(u64), + PrintInfo, + PrintRuntime, + Listening((u64,(TableId,RegisterIndex,RegisterIndex))), + GetTable(u64), + GetValue((u64,TableIndex,TableIndex)), + Transaction(Transaction), + ProcessTransactionQueue, + Code((CoreIndex,MechCode)), + Blocks(Vec), + RemoteCoreConnect(MechSocket), + RemoteCoreDisconnect(CoreIndex), +} + +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +pub struct MiniTable { + pub id: u64, + pub dynamic: bool, + pub rows: usize, + pub cols: usize, + pub col_kinds: Vec, + pub col_map: (usize,Vec,Vec<(Alias,TableIx)>), + pub row_map: (usize,Vec,Vec<(Alias,TableIx)>), + pub data: Vec>, + pub dictionary: Vec<(u64,String)>, +} + +impl MiniTable { + + fn minify_table(table: &Table) -> MiniTable { + let mut data = vec![]; + for i in 1..=table.cols { + let mut col = vec![]; + for j in 1..=table.rows { + let value = table.get_by_index(TableIndex::Index(j),TableIndex::Index(i)).unwrap(); + col.push(value); + } + data.push(col); + } + let dictionary = table.dictionary.borrow().iter().map(|(k,v)| (*k,v.to_string())).collect::>(); + MiniTable { + id: table.id, + dynamic: table.dynamic, + rows: table.rows, + cols: table.cols, + col_kinds: table.col_kinds.clone(), + col_map: (table.col_map.capacity,table.col_map.ix_to_alias.clone(),table.col_map.alias_to_ix.iter().map(|(k,v)| (*k,*v)).collect::>()), + row_map: (table.row_map.capacity,table.row_map.ix_to_alias.clone(),table.row_map.alias_to_ix.iter().map(|(k,v)| (*k,*v)).collect::>()), + data, + dictionary, + } + } + + fn maximize_table(mt: &MiniTable) -> Table { + let mut table = Table::new(mt.id,mt.rows,mt.cols); + for (ix,kind) in mt.col_kinds.iter().enumerate() { + table.set_col_kind(ix,kind.clone()); + } + for i in 0..mt.cols { + for j in 0..mt.rows { + table.set_raw(j,i,mt.data[i][j].clone()); + } + } + let (_,_,ixes) = &mt.col_map; + for (alias,ix) in ixes { + table.set_col_alias(*ix,*alias); + } + table + } +} + +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +pub struct MiniCore { + //pub sections: Vec>>>, + pub blocks: Vec, + pub unsatisfied_blocks: Vec, + pub database: Vec, + //pub functions: Rc>, + //pub user_functions: Rc>>, + pub required_functions: Vec, + pub errors: Vec<(MechErrorKind,Vec)>, + pub input: Vec<(TableId,RegisterIndex,RegisterIndex)>, + pub output: Vec<(TableId,RegisterIndex,RegisterIndex)>, + pub defined_tables: Vec<(TableId,RegisterIndex,RegisterIndex)>, + //pub schedule: Schedule, + pub dictionary: Vec<(u64,String)>, +} + +impl MiniCore { + + pub fn minify_core(core: &Core) -> MiniCore { + + let blocks: Vec = core.blocks.iter().map(|(block_id,block_ref)| MiniBlock::minify_block(&block_ref.borrow()) ).collect::>(); + let unsatisfied_blocks: Vec = core.unsatisfied_blocks.iter().map(|(block_id,block_ref)| MiniBlock::minify_block(&block_ref.borrow()) ).collect::>(); + let database: Vec = core.database.borrow().tables.iter().map(|(table_id,table)| MiniTable::minify_table(&table.borrow())).collect::>(); + let required_functions: Vec = core.required_functions.iter().map(|fxn_id| *fxn_id).collect::>(); + let errors: Vec<(MechErrorKind,Vec)> = core.errors.iter().map(|(kind,blocks)| (kind.clone(),blocks.iter().map(|b| b.borrow().id ).collect::>()) ).collect::)>>(); + let input: Vec<(TableId,RegisterIndex,RegisterIndex)> = core.input.iter().map(|register| *register).collect::>(); + let output: Vec<(TableId,RegisterIndex,RegisterIndex)> = core.output.iter().map(|register| *register).collect::>(); + let defined_tables: Vec<(TableId,RegisterIndex,RegisterIndex)> = core.defined_tables.iter().map(|register| *register).collect::>(); + let dictionary: Vec<(u64,String)> = core.dictionary.borrow().iter().map(|(k,s)| (*k,s.to_string())).collect::>(); + + MiniCore { + blocks, + unsatisfied_blocks, + database, + required_functions, + errors, + input, + output, + defined_tables, + dictionary, + } + } + + pub fn maximize_core(minicore: &MiniCore) -> Core { + let mut core = Core::new(); + let blocks: Vec = minicore.blocks.iter().map(|b| MiniBlock::maximize_block(b)).collect(); + core.load_blocks(&blocks); + let tables: Vec
    = minicore.database.iter().map(|t| MiniTable::maximize_table(t)).collect(); + core.overwrite_tables(&tables); + core + } +} + +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +pub struct MiniBlock { + pub id: u64, + pub ast: nodes::AstNode, + pub transformations: Vec, + pub strings: Vec<(u64, String)>, + pub number_literals: Vec<(u64, NumberLiteral)>, +} + +impl MiniBlock { + pub fn new() -> MiniBlock { + MiniBlock { + id: 0, + ast: nodes::AstNode::Null, + transformations: Vec::with_capacity(1), + strings: Vec::with_capacity(1), + number_literals: Vec::with_capacity(1), + } + } + + pub fn minify_block(block: &Block) -> MiniBlock { + let mut miniblock = MiniBlock::new(); + miniblock.transformations = block.transformations.clone(); + match &block.unsatisfied_transformation { + Some((_,tfm)) => miniblock.transformations.push(tfm.clone()), + _ => (), + } + miniblock.transformations.append(&mut block.pending_transformations.clone()); + /*for (k,v) in block.store.number_literals.iter() { + miniblock.number_literals.push((k.clone(), v.clone())); + } + for error in &block.errors { + miniblock.errors.push(error.clone()); + }*/ + miniblock.id = block.id; + miniblock.ast = block.ast.clone(); + miniblock + } + + pub fn maximize_block(miniblock: &MiniBlock) -> Block { + let mut block = Block::new(); + for tfms in &miniblock.transformations { + block.add_tfm(tfms.clone()); + } + block.ast = miniblock.ast.clone(); + block + } +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub enum MechCode { + String(String), + MiniBlocks(Vec>), + MiniCores(Vec), +} + +#[cfg(not(target_arch = "wasm32"))] +#[cfg(feature = "web")] +#[derive(Copy, Clone)] +pub struct MachineDeclaration { + pub register: unsafe extern "C" fn(&mut dyn MachineRegistrar, outgoing: Sender, capability_token: &CapabilityToken) -> Result +} + +pub trait MachineRegistrar { + fn register_machine(&mut self, machine: Box); +} + +#[macro_export] +macro_rules! export_machine { + ($name:ident, $register:expr) => { + #[doc(hidden)] + #[no_mangle] + pub static $name: $crate::MachineDeclaration = + $crate::MachineDeclaration { + register: $register, + }; + }; +} + +#[derive(Copy, Clone)] +pub struct MechFunctionDeclaration { + pub register: unsafe extern "C" fn(&mut dyn MechFunctionRegistrar), +} + +pub trait MechFunctionRegistrar { + fn register_mech_function(&mut self, function_id: u64, mech_function_compiler: Box); +} + +#[macro_export] +macro_rules! export_mech_function { + ($name:ident, $register:expr) => { + #[doc(hidden)] + #[no_mangle] + pub static $name: $crate::MechFunctionDeclaration = + $crate::MechFunctionDeclaration { + register: $register, + }; + }; +} + +pub struct Machines { + pub machines: HashMap>, +} + +impl Machines { + pub fn new() -> Machines { + Machines { + machines: HashMap::default(), + } + } +} + +impl MachineRegistrar for Machines { + fn register_machine(&mut self, machine: Box) { + self.machines.insert(machine.id(), machine); + } +} + +pub struct MechFunctions { + pub mech_functions: HashMap>, +} + +impl MechFunctions { + pub fn new() -> MechFunctions { + MechFunctions { + mech_functions: HashMap::default(), + } + } +} + +impl MechFunctionRegistrar for MechFunctions { + fn register_mech_function(&mut self, function_id: u64, mech_function_compiler: Box) { + self.mech_functions.insert(function_id, mech_function_compiler); + } +} \ No newline at end of file diff --git a/src/wasm/.appveyor.yml b/src/wasm/.appveyor.yml new file mode 100644 index 0000000..50910bd --- /dev/null +++ b/src/wasm/.appveyor.yml @@ -0,0 +1,11 @@ +install: + - appveyor-retry appveyor DownloadFile https://win.rustup.rs/ -FileName rustup-init.exe + - if not defined RUSTFLAGS rustup-init.exe -y --default-host x86_64-pc-windows-msvc --default-toolchain nightly + - set PATH=%PATH%;C:\Users\appveyor\.cargo\bin + - rustc -V + - cargo -V + +build: false + +test_script: + - cargo test --locked diff --git a/src/wasm/.cargo-ok b/src/wasm/.cargo-ok new file mode 100644 index 0000000..e69de29 diff --git a/src/wasm/Cargo.toml b/src/wasm/Cargo.toml new file mode 100644 index 0000000..50b9098 --- /dev/null +++ b/src/wasm/Cargo.toml @@ -0,0 +1,75 @@ +[package] +name = "mech-wasm" +version = "0.1.0" +authors = ["Corey Montella "] +description = "A web assembly wrapper for Mech core and syntax. Allows Mech to be embedded in the browser." +documentation = "http://docs.mech-lang.org" +homepage = "https://mech-lang.org" +repository = "https://github.com/mech-lang/wasm" +keywords = ["mech", "language", "programming", "wasm", "reactive"] +categories = ["science::robotics", "science", "wasm", "web-programming"] +license = "Apache-2.0" +readme = "README.md" +edition = "2021" + +[badges] +gitlab = { repository = "mech-lang/wasm", branch = "main" } +maintenance = { status = "actively-developed" } + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +mech-core = {git = "https://gitlab.com/mech-lang/core", branch = "v0.1-beta"} +mech-syntax = {git = "https://gitlab.com/mech-lang/syntax", branch = "v0.1-beta"} +mech-utilities = {git = "https://gitlab.com/mech-lang/utilities", branch = "v0.1-beta"} +mech-math = {git = "https://gitlab.com/mech-lang/machines/math", branch = "v0.1-beta"} +mech-html = {git = "https://gitlab.com/mech-lang/machines/html", branch = "v0.1-beta"} + +hashbrown = "0.13.1" +wasm-bindgen = "0.2.83" +bincode = "1.3.3" +js-sys = "0.3.60" +lazy_static = "1.4.0" +miniz_oxide = "0.6.2" +base64 = "0.20.0" + +[dev-dependencies] +wasm-bindgen-test = "0.3.33" + +[dependencies.web-sys] +version = "0.3.60" +features = [ + 'Document', + 'Element', + 'HtmlElement', + 'HtmlDivElement', + 'HtmlImageElement', + 'HtmlCanvasElement', + 'HtmlInputElement', + 'InputEvent', + 'MouseEvent', + 'KeyboardEvent', + 'TouchEvent', + 'Event', + 'EventTarget', + 'CanvasRenderingContext2d', + 'Node', + 'Window', + 'Selection', + 'Range', + 'HtmlCollection', + 'WebSocket', + 'MessageEvent', + 'BinaryType', + 'Blob', + 'ErrorEvent', + 'ProgressEvent', + 'HashChangeEvent', + 'FileReader', + 'Location', + 'console', + 'XmlHttpRequest', +] + +[workspace] \ No newline at end of file diff --git a/src/wasm/LICENSE b/src/wasm/LICENSE new file mode 100644 index 0000000..41c00c9 --- /dev/null +++ b/src/wasm/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2018 Corey Montella + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/src/wasm/README.md b/src/wasm/README.md new file mode 100644 index 0000000..49020d9 --- /dev/null +++ b/src/wasm/README.md @@ -0,0 +1,23 @@ +

    + +

    + +Mech is a language for developing **data-driven**, **reactive** systems like robots, games, and animations. It makes **composing**, **transforming**, and **distributing** data easy, allowing you to focus on the essential complexity of your project. + +You can try Mech online at [https://mech-lang.org/try](https://mech-lang.org/try). + +Usage and installation instructions can be found in the [documentation](https://mech-lang.org/#/docs/index.mec) or the [main Mech repository](https://github.com/mech-lang/mech). + +Be sure to follow our [blog](https://mech-lang.org/blog/)([RSS](https://mech-lang.org/feed.xml))! + +# Wasm + +A web assembly wrapper for Mech core and syntax. Allows Mech to be embedded in the browser. + +## Project Status + +Mech is currently in the **beta** stage of development. This means that the language is at a suitable stage for a wider audience. While most language feature implementations are started, none are finished, and some new features may, while others could be removed. Backwards and forwards compatibility of Mech programs is not guaranteed at this time. + +## License + +Apache 2.0 \ No newline at end of file diff --git a/src/wasm/src/lib.rs b/src/wasm/src/lib.rs new file mode 100644 index 0000000..e6f296e --- /dev/null +++ b/src/wasm/src/lib.rs @@ -0,0 +1,493 @@ +#![recursion_limit="256"] +#![feature(alloc)] +#![feature(drain_filter)] +#![feature(get_mut_unchecked)] +#![allow(warnings)] +extern crate wasm_bindgen; +extern crate hashbrown; +#[macro_use] +extern crate alloc; +extern crate core; +extern crate web_sys; +extern crate mech_core; +extern crate mech_syntax; +extern crate mech_utilities; +extern crate mech_math; +extern crate mech_html; +extern crate bincode; +#[macro_use] +extern crate lazy_static; +extern crate miniz_oxide; +extern crate base64; + +use base64::{encode, decode}; +use miniz_oxide::inflate::decompress_to_vec; +use miniz_oxide::deflate::compress_to_vec; +use std::collections::HashMap; +use std::collections::hash_map::Entry; +use std::cell::Cell; +use std::cell::RefCell; +use std::rc::Rc; +use wasm_bindgen::prelude::*; +use wasm_bindgen::JsCast; +use hashbrown::hash_set::HashSet; +use alloc::vec::Vec; +use core::fmt; +//use mech_syntax::formatter::Formatter; +use mech_syntax::compiler::{Compiler}; +use mech_core::*; +use mech_utilities::{SocketMessage, MiniBlock}; +use mech_math::{ + sin::*, + cos::*, + tan::*, + atan::*, + atan2::*, +}; +use mech_html::*; +use mech_html::{ + elements::*, + shapes::*, +}; +use web_sys::{ErrorEvent, MessageEvent, WebSocket, FileReader}; +use std::sync::Arc; + +mod websocket; + +static PI: f64 = 3.141592654; + +pub use self::websocket::*; + +#[macro_export] +macro_rules! log { + ( $( $t:tt )* ) => { + web_sys::console::log_1(&format!( $( $t )* ).into()); + } +} + +#[wasm_bindgen] +pub struct WasmCore { + core: mech_core::Core, + //programs: Vec, + changes: Vec, + images: HashMap, + canvases: HashSet, + /*nodes: HashMap>,*/ + websocket: Option, + remote_tables: HashSet<(TableId,RegisterIndex,RegisterIndex)>, + event_id: u64, + timers: HashMap>, + apps: HashSet, + window: web_sys::Window, + document: web_sys::Document, +} + +#[wasm_bindgen] +impl WasmCore { + + + pub fn new(capacity: usize, recursion_limit: u64) -> WasmCore { + let mut mech = mech_core::Core::new(); + + mech.load_function("math/sin",Box::new(MathSin{})); + mech.load_function("math/cos",Box::new(MathCos{})); + mech.load_function("math/tan",Box::new(MathTan{})); + mech.load_function("math/atan",Box::new(MathAtan{})); + mech.load_function("math/atan2",Box::new(MathAtan2{})); + + let html_code = r#" +HTML +===== + +This is the HTML machine. It's inside of the wasm crate right now, but I'll move it soon. to its proper crate in the machines directory. + +Timers + #time/timer = [|period ticks|] + +Pointer events + #html/event/pointer-move = [|x y target event-id| 0 0 "" 0] + #html/event/pointer-down = [|x y target event-id| 0 0 "" 0] + #html/event/pointer-up = [|x y target event-id| 0 0 "" 0] + +Keyboard events + #html/event/key-up = [|key event-id| "" 0] + #html/event/key-down = [|key event-id| "" 0]"#; + + let mut compiler = Compiler::new(); + let sections = compiler.compile_str(&html_code).unwrap(); + mech.load_sections(sections); + + WasmCore { + core: mech, + //programs: Vec::new(), + changes: Vec::new(), + images: HashMap::new(), + canvases: HashSet::new(), + /*nodes: HashMap::new(),*/ + websocket: None, + remote_tables: HashSet::new(), + event_id: 0, + timers: HashMap::new(), + apps: HashSet::new(), + window: web_sys::window().unwrap(), + document: web_sys::window().unwrap().document().unwrap(), + } + } + + pub fn connect_remote_core(&mut self, address: String) -> Result<(),JsValue> { + connect_remote_core(self,address) + } + + pub fn add_timers(&mut self) -> Result<(),JsValue> { + + let window = web_sys::window().expect("no global `window` exists"); + + match self.core.get_table("time/timer") { + Ok(timers_table) => { + let timers_table_brrw = timers_table.borrow(); + for row in 1..=timers_table_brrw.rows { + match self.timers.entry(row) { + Entry::Occupied(timer) => { + // TODO Do something here to alert that the timer was already added + }, + Entry::Vacant(v) => { + self.changes.push(Change::Set(( + *TIME_TIMER, vec![ + (TableIndex::Index(1), + TableIndex::Alias(*TICKS), + Value::U64(U64::new(0)))], + ))); + self.process_transaction(); + match timers_table_brrw.get(&TableIndex::Index(row), &TableIndex::Alias(*PERIOD)) { + Ok(Value::Time(period)) => { + let wasm_core = self as *mut WasmCore; + let closure = || { + Closure::wrap(Box::new(move || { + unsafe{ + let timer_table = (*wasm_core).core.get_table("time/timer").unwrap(); + let timer_table_brrw = timer_table.borrow(); + match timer_table_brrw.get(&TableIndex::Index(row), &TableIndex::Alias(*TICKS)) { + Ok(Value::U64(ticks)) => { + (*wasm_core).changes.push(Change::Set(( + *TIME_TIMER, vec![ + (TableIndex::Index(row), + TableIndex::Alias(*TICKS), + Value::U64(U64::new(ticks.unwrap()+1)))], + ))); + (*wasm_core).process_transaction(); + (*wasm_core).render(); + //let table = (*wasm_core).core.get_table("circle").unwrap(); + //log!("{:?}",(*wasm_core).core); + } + x => {log!("6868 {:?}", x);}, + } + } + }) as Box) + }; + let timer_callback = closure(); + let id = window.set_interval_with_callback_and_timeout_and_arguments_0( + timer_callback.as_ref().unchecked_ref(), + (period.unwrap() * 1000.0) as i32 + ).unwrap(); + self.timers.insert(row,timer_callback); + } + x => {log!("6869 {:?}", x);}, + } + } + } + } + } + x => {log!("6870 {:?}", x);}, + } + Ok(()) + } + + pub fn load_compressed_blocks(&mut self, encoded_miniblocks: String) { + let compressed_miniblocks = decode(encoded_miniblocks).unwrap(); + let serialized_miniblocks = decompress_to_vec(compressed_miniblocks.as_slice()).expect("Failed to decompress!"); + self.load_sections(serialized_miniblocks); + } + + pub fn load_sections(&mut self, serialized_miniblocks: Vec) -> Result<(),JsValue> { + let miniblocks: Vec> = match bincode::deserialize(&serialized_miniblocks) { + Ok(miniblocks) => miniblocks, + Err(x) => { + return Err(JsValue::from_str("5239")); + } + }; + let mut len = 0; + let mut sections = vec![]; + for section in miniblocks { + let blocks = section.iter().map(|b| SectionElement::Block(MiniBlock::maximize_block(&b))).collect::>(); + len += blocks.len(); + sections.push(blocks); + } + self.core.load_sections(sections); + self.core.schedule_blocks(); + self.add_timers(); + self.add_apps(); + self.render(); + log!("Loaded {} blocks.", len); + Ok(()) + } + + pub fn process_transaction(&mut self) { + // Collect the new table messages + let mut set_tables: Vec<(TableId,RegisterIndex,RegisterIndex)> = vec![]; + for change in self.changes.iter() { + match change { + // If any new tables are sent, mark them as remote tables + // Remote tables are any tables that are not defined in the + // current core, but may be used (written to or read from). + Change::NewTable{table_id,..} => { + self.remote_tables.insert((TableId::Global(*table_id),RegisterIndex::All,RegisterIndex::All)); + } + Change::Set((table_id,data)) => { + set_tables.push((TableId::Global(*table_id),RegisterIndex::All,RegisterIndex::All)); + } + _ => (), + } + } + self.core.process_transaction(&self.changes); + // For any tables that have changed which are remote, + // send a record of those changes back to the sender. + for register in set_tables { + match self.core.schedule.trigger_to_output.get(®ister) { + Some(out_registers) => { + for (table_id,_,_) in self.remote_tables.intersection(out_registers) { + let table = self.core.get_table_by_id(*table_id.unwrap()).unwrap(); + let changes = table.borrow().data_to_changes(); + match &self.websocket { + Some(ws) => { + let message = bincode::serialize(&SocketMessage::Transaction(changes)).unwrap(); + ws.send_with_u8_array(&message); + } + _ => (), + } + } + } + _ => (), + } + } + // TODO Send changes to remote cores via websocket + self.changes.clear(); + } + + pub fn init(&mut self) -> Result<(), JsValue> { + let wasm_core = self as *mut WasmCore; + + // Set up some callbacks for events. + { + let key_closure = |table_id| { + Closure::wrap(Box::new(move |event: web_sys::KeyboardEvent| { + let key = event.key(); + // TODO Make this safe + unsafe { + (*wasm_core).changes.push(Change::Set(( + table_id, vec![ + (TableIndex::Index(1), + TableIndex::Alias(*KEY), + Value::from_string(&key))]))); + (*wasm_core).event_id += 1; + let eid = (*wasm_core).event_id; + (*wasm_core).changes.push(Change::Set(( + table_id, vec![ + (TableIndex::Index(1), + TableIndex::Alias(*EVENT__ID), + Value::U64(U64::new(eid)))]))); + (*wasm_core).process_transaction(); + (*wasm_core).render(); + //log!("Keydown"); + //let table = (*wasm_core).core.get_table("balls"); + //log!("{:?}", table); + } + }) as Box) + }; + let keydown_callback = key_closure(*HTML_EVENT_KEY__DOWN); + self.document.add_event_listener_with_callback("keydown", keydown_callback.as_ref().unchecked_ref())?; + let keyup_callback = key_closure(*HTML_EVENT_KEY__UP); + self.document.add_event_listener_with_callback("keyup", keyup_callback.as_ref().unchecked_ref())?; + keydown_callback.forget(); + keyup_callback.forget(); + } + + { + let pointer_closure = |table_id| { + Closure::wrap(Box::new(move |event: web_sys::MouseEvent| { + //let target = event.target().unwrap(); + //let target_element = target.dyn_ref::().unwrap(); + //let target_table_id = target_element.id().parse::().unwrap(); + //log!("{:?}", target_element.id().parse::().unwrap()); + + let x = event.offset_x(); + let y = event.offset_y(); + //log!("event: {:?} {:?}", x, y); + // TODO Make this safe + unsafe { + (*wasm_core).changes.push(Change::Set(( + table_id, vec![( + TableIndex::Index(1), + TableIndex::Alias(*X), + Value::F32(F32::new(x as f32)))]))); + (*wasm_core).changes.push(Change::Set(( + table_id, vec![( + TableIndex::Index(1), + TableIndex::Alias(*Y), + Value::F32(F32::new(y as f32)))]))); + /*(*wasm_core).changes.push(Change::Set{ + table_id: table_id, values: vec![ + (TableIndex::Index(1), + TableIndex::Alias(*TARGET), + Value::from_id(target_table_id))], + });*/ + (*wasm_core).event_id += 1; + let eid = (*wasm_core).event_id; + (*wasm_core).changes.push(Change::Set(( + table_id, vec![( + TableIndex::Index(1), + TableIndex::Alias(*EVENT__ID), + Value::U64(U64::new(eid)))]))); + (*wasm_core).process_transaction(); + (*wasm_core).render(); + //let table = (*wasm_core).core.get_table_by_id(hash_str("balls")); + //log!("{:?}", table); + } + }) as Box) + }; + let move_callback = pointer_closure(*HTML_EVENT_POINTER__MOVE); + self.document.add_event_listener_with_callback("pointermove", move_callback.as_ref().unchecked_ref())?; + let down_callback = pointer_closure(*HTML_EVENT_POINTER__DOWN); + self.document.add_event_listener_with_callback("pointerdown", down_callback.as_ref().unchecked_ref())?; + let up_callback = pointer_closure(*HTML_EVENT_POINTER__UP); + self.document.add_event_listener_with_callback("pointerup", up_callback.as_ref().unchecked_ref())?; + move_callback.forget(); + down_callback.forget(); + up_callback.forget(); + } + + { + let onhashchange_closure = Closure::wrap(Box::new(move |event: web_sys::HashChangeEvent| { + unsafe { + let location = (*wasm_core).window.location(); + let mut hash = location.hash().unwrap(); + if hash.len() > 1 { + hash = hash[1..].to_string(); + } + if hash.len() > 6 && hash[0..6].to_string()=="debug=".to_string() { + let table = (*wasm_core).core.get_table_by_id(hash_str(&hash[6..])); + log!("{:?}", table); + } + + (*wasm_core).changes.push(Change::Set(( + *HTML_LOCATION, vec![( + TableIndex::Index(1), + TableIndex::Alias(*HASH), + Value::from_string(&hash))]))); + //(*wasm_core).changes.push(Change::InternString{string: hash}); + (*wasm_core).process_transaction(); + (*wasm_core).render(); + } + }) as Box); + self.window.set_onhashchange(Some(onhashchange_closure.as_ref().unchecked_ref())); + onhashchange_closure.forget(); + } + + let location = self.window.location(); + let hash = location.hash()?; + if hash.len() > 1 { + let hash = hash[1..].to_string(); + } + let host = location.host()?; + let hostname = location.hostname()?; + let href = location.href()?; + let origin = location.origin()?; + let pathname = location.pathname()?; + let port = location.port()?; + let protocol = location.protocol()?; + let mut search = location.search()?; + if search.len() > 1 { + search = search[1..].to_string(); + } + let mut changes = vec![Change::Set(( + *HTML_LOCATION, vec![ + (TableIndex::Index(1), TableIndex::Alias(*HASH), Value::from_string(&hash)), + (TableIndex::Index(1), TableIndex::Alias(*HOST), Value::from_string(&host)), + (TableIndex::Index(1), TableIndex::Alias(*HOST__NAME), Value::from_string(&hostname)), + (TableIndex::Index(1), TableIndex::Alias(*HREF), Value::from_string(&href)), + (TableIndex::Index(1), TableIndex::Alias(*ORIGIN), Value::from_string(&origin)), + (TableIndex::Index(1), TableIndex::Alias(*PATH__NAME), Value::from_string(&pathname)), + (TableIndex::Index(1), TableIndex::Alias(*PORT), Value::from_string(&port)), + (TableIndex::Index(1), TableIndex::Alias(*PROTOCOL), Value::from_string(&protocol)), + (TableIndex::Index(1), TableIndex::Alias(*SEARCH), Value::from_string(&search))] + )), + /*Change::InternString{string: hash}, + Change::InternString{string: host}, + Change::InternString{string: hostname}, + Change::InternString{string: href}, + Change::InternString{string: origin}, + Change::InternString{string: pathname}, + Change::InternString{string: port}, + Change::InternString{string: protocol}, + Change::InternString{string: search}*/ + ]; + self.changes.append(&mut changes); + self.process_transaction(); + + Ok(()) + } + + pub fn add_apps(&mut self) -> Result<(), JsValue> { + let wasm_core = self as *mut WasmCore; + match self.core.get_table("html/app") { + Ok(app_table) => { + let app_table_brrw = app_table.borrow(); + for row in 1..=app_table_brrw.rows as usize { + match (app_table_brrw.get(&TableIndex::Index(row), &TableIndex::Alias(*ROOT)), + app_table_brrw.get(&TableIndex::Index(row), &TableIndex::Alias(*CONTAINS))) { + (Ok(Value::String(root)), Ok(contents)) => { + let root_id = root.hash(); + match self.apps.contains(&root_id) { + true => continue, // app already added + false => { + self.apps.insert(root_id.clone()); + match self.document.get_element_by_id(&root.to_string()) { + Some(drawing_area) => { + let app = render_value(contents,&self.document,&self.core)?; + drawing_area.append_child(&app)?; + } + x => log!("4845 {:?}",x), + } + } + } + } + x => log!("4846 {:?}",x), + } + } + } + x => { + log!("4847 {:?}",x); + }, + } + Ok(()) + } + + pub fn render(&mut self) -> Result<(), JsValue> { + let wasm_core = self as *mut WasmCore; + self.draw_canvases(); + Ok(()) + } + + pub fn draw_canvases(&mut self) -> Result<(), JsValue> { + let canvases = self.document.get_elements_by_tag_name("canvas"); + for i in 0..canvases.length() { + let canvas = canvases.get_with_index(i).unwrap(); + let canvas: web_sys::HtmlCanvasElement = canvas + .dyn_into::() + .map_err(|_| ()) + .unwrap(); + draw_canvas(&canvas,&self.core); + } + Ok(()) + } + +} \ No newline at end of file diff --git a/src/wasm/src/websocket.rs b/src/wasm/src/websocket.rs new file mode 100644 index 0000000..c4c4622 --- /dev/null +++ b/src/wasm/src/websocket.rs @@ -0,0 +1,141 @@ +use mech_core::*; +use wasm_bindgen::JsValue; +use web_sys::*; +use web_sys::console; + +use crate::*; + +/*pub struct Timer<'a> { + name: &'a str, +} + +impl<'a> Timer<'a> { + pub fn new(name: &'a str) -> Timer<'a> { + console::time_with_label(name); + Timer { name } + } +} + +impl<'a> Drop for Timer<'a> { + fn drop(&mut self) { + console::time_end_with_label(self.name); + } +}*/ + +pub fn connect_remote_core(wasm_core: *mut WasmCore, address: String) -> Result<(), JsValue> { + + let ws = WebSocket::new(&address)?; + ws.set_binary_type(web_sys::BinaryType::Arraybuffer); + + // OnMessage + { + let cloned_ws = ws.clone(); + let onmessage_callback = Closure::wrap(Box::new(move |e: MessageEvent| { + //let _timer = Timer::new("Universe::tick"); + //log!("Got a message"); + if let Ok(abuf) = e.data().dyn_into::() { + let compressed_message = js_sys::Uint8Array::new(&abuf).to_vec(); + let serialized_message = decompress_to_vec(&compressed_message).expect("Failed to decompress!"); + let msg: Result = bincode::deserialize(&serialized_message.to_vec()); + match msg { + Ok(SocketMessage::Transaction(txn)) => { + unsafe { + (*wasm_core).changes = txn; + (*wasm_core).process_transaction(); + (*wasm_core).add_apps(); + (*wasm_core).render(); + } + } + Ok(SocketMessage::Listening(register)) => { + unsafe { + (*wasm_core).remote_tables.insert(register); + let (table_id,_,_) = register; + // Send over the table we have now + match (*wasm_core).core.get_table_by_id(*table_id.unwrap()) { + Ok(table) => { + // Decompose the table into changes for a transaction + let changes = table.borrow().to_changes(); + // Send the transaction to the remote core + let message = bincode::serialize(&SocketMessage::Transaction(changes)).unwrap(); + cloned_ws.send_with_u8_array(&message); + } + Err(_) => (), + } + } + } + msg => (), //log!("{:?}", msg), + } + } else { + log!("Unhandled Message {:?}", e.data()); + } + }) as Box); + ws.set_onmessage(Some(onmessage_callback.as_ref().unchecked_ref())); + onmessage_callback.forget(); + } + + // OnError + let onerror_callback = Closure::wrap(Box::new(move |e: ErrorEvent| { + log!("error event: {:?}", e); + }) as Box); + ws.set_onerror(Some(onerror_callback.as_ref().unchecked_ref())); + onerror_callback.forget(); + + // OnOpen + { + let cloned_ws = ws.clone(); + let onopen_callback = Closure::wrap(Box::new(move |_| { + log!("Websocket Opened."); + // Upon an open connection, send the server a list of tables to which we are listening + unsafe { + for input_table_id in (*wasm_core).core.needed_registers().iter() { + let result = bincode::serialize(&SocketMessage::Listening(input_table_id.clone())).unwrap(); + cloned_ws.send_with_u8_array(&result); + } + } + }) as Box); + ws.set_onopen(Some(onopen_callback.as_ref().unchecked_ref())); + onopen_callback.forget(); + } + + // On Close + { + let onclose_callback = Closure::wrap(Box::new(move |event: web_sys::Event| { + log!("Websocket Closed."); + }) as Box); + ws.set_onclose(Some(&onclose_callback.as_ref().unchecked_ref())); + onclose_callback.forget(); + } + + // Todo, make sef.websocket into a vector of websockets. + unsafe { + (*wasm_core).websocket = Some(ws); + } + Ok(()) +} + + + /*match &self.websocket { + Some(ws) => { + for changed_register in &self.core.runtime.aggregate_changed_this_round { + match (self.remote_tables.get(&changed_register),self.core.get_table(*changed_register.table_id.unwrap())) { + (Some(listeners),Some(table)) => { + let mut changes = vec![]; + let mut values = vec![]; + for i in 1..=table.rows { + for j in 1..=table.columns { + let (value, _) = table.get_unchecked(i,j); + values.push((TableIndex::Index(i), TableIndex::Index(j), value)); + } + } + changes.push(Change::Set{table_id: table.id, values}); + let txn = Transaction{changes}; + let message = bincode::serialize(&SocketMessage::Transaction(txn)).unwrap(); + // Send the transaction over the websocket to the remote core + ws.send_with_u8_array(&message); + } + _ => (), + } + } + } + _ => (), + }*/ \ No newline at end of file diff --git a/src/wasm/tests/web.rs b/src/wasm/tests/web.rs new file mode 100644 index 0000000..de5c1da --- /dev/null +++ b/src/wasm/tests/web.rs @@ -0,0 +1,13 @@ +//! Test suite for the Web and headless browsers. + +#![cfg(target_arch = "wasm32")] + +extern crate wasm_bindgen_test; +use wasm_bindgen_test::*; + +wasm_bindgen_test_configure!(run_in_browser); + +#[wasm_bindgen_test] +fn pass() { + assert_eq!(1 + 1, 2); +} From ec739ea26bbdb580a7cd3091e834f3ab2961f7b7 Mon Sep 17 00:00:00 2001 From: cmontella Date: Mon, 22 May 2023 21:40:27 -0400 Subject: [PATCH 70/84] update project --- .gitlab-ci.yml | 8 +--- src/bin/mech-exe.rs | 93 ------------------------------------------ src/program/Cargo.toml | 6 +-- src/wasm/Cargo.toml | 4 +- 4 files changed, 5 insertions(+), 106 deletions(-) delete mode 100644 src/bin/mech-exe.rs diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 613f46a..7d7536d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,12 +1,6 @@ -variables: - GIT_SUBMODULE_STRATEGY: recursive - test:cargo: script: - rustup show - rustup default nightly-2023-05-19 - wasm-pack build wasm-notebook --target web - - cargo build --bin mech --release - - ./target/release/mech test tests - - cd src/syntax - - cargo test --release \ No newline at end of file + - cargo build --bin mech --release \ No newline at end of file diff --git a/src/bin/mech-exe.rs b/src/bin/mech-exe.rs deleted file mode 100644 index c9adfc8..0000000 --- a/src/bin/mech-exe.rs +++ /dev/null @@ -1,93 +0,0 @@ -//const SOURCE_FILES: &[(&str, &[u8])] = &include!(concat!(env!("OUT_DIR"), "/mech_app_files.rs")); - -extern crate mech; -extern crate hashbrown; -use mech::core::Core; -use mech::syntax::compiler::Compiler; -use mech::*; -use hashbrown::HashSet; - -fn main() { - - let mut compiler = Compiler::new(); - - let mut caps = HashSet::new(); - caps.insert(Capability::StdIn); - caps.insert(Capability::StdOut); - caps.insert(Capability::StdErr); - caps.insert(Capability::FileSystemRead); - caps.insert(Capability::FileSystemWrite); - caps.insert(Capability::NetworkRead); - caps.insert(Capability::NetworkWrite); - caps.insert(Capability::CoreNetworkRead); - caps.insert(Capability::CoreNetworkWrite); - caps.insert(Capability::DownloadDependencies); - - let runner = ProgramRunner::new("Mech Executable", caps); - let mech_client = runner.run().unwrap(); - - /*for (name, data) in SOURCE_FILES { - println!("File {} is {} bytes", name, data.len()); - let mech_code = String::from_utf8(data.to_vec()).unwrap(); - let blocks = compiler.compile_str(&mech_code).unwrap(); - mech_client.send(RunLoopMessage::Code(MechCode::MiniBlocks(mech::minify_blocks(&blocks)))); - }*/ - - let mech_code = include_str!("../../project/main.mec"); - let blocks = compiler.compile_str(&mech_code).unwrap(); - mech_client.send(RunLoopMessage::Code((1,MechCode::MiniBlocks(mech::minify_blocks(&blocks))))); - - let thread_receiver = mech_client.incoming.clone(); - // Some state variables to control receive loop - let mut skip_receive = false; - let mut to_exit = false; - let mut exit_code = 0; - - // Get all responses from the thread - 'run_receive_loop: loop { - match thread_receiver.recv() { - Ok(ClientMessage::Timing(freqeuncy)) => { - - }, - Ok(ClientMessage::String(message)) => { - println!("{:?}", message); - }, - Ok(ClientMessage::Error(error)) => { - - }, - Ok(ClientMessage::Transaction(txn)) => { - - }, - Ok(ClientMessage::Done) => { - - }, - Ok(ClientMessage::Exit(this_code)) => { - - } - Ok(ClientMessage::StepDone) => { - /*if debug_flag{ - mech_client.send(RunLoopMessage::PrintDebug); - } - if out_tables.len() > 0 { - for table_name in &out_tables { - mech_client.send(RunLoopMessage::PrintTable(hash_str(table_name))); - } - } - if repl_flag { - break 'run_receive_loop; - }*/ - //let output_id: u64 = hash_str("mech/output"); - //mech_client.send(RunLoopMessage::GetTable(output_id)); - //std::process::exit(0); - }, - Err(x) => { - //println!("{} {}", "[Error]".bright_red(), x); - //io::stdout().flush().unwrap(); - //std::process::exit(1); - } - q => { - println!("else: {:?}", q); - }, - }; - } -} \ No newline at end of file diff --git a/src/program/Cargo.toml b/src/program/Cargo.toml index d2389e0..8424819 100644 --- a/src/program/Cargo.toml +++ b/src/program/Cargo.toml @@ -17,9 +17,9 @@ gitlab = { repository = "mech-lang/program", branch = "main" } maintenance = { status = "actively-developed" } [dependencies] -mech-core = {git = "https://gitlab.com/mech-lang/core", branch = "v0.1-beta"} -mech-syntax = {git = "https://gitlab.com/mech-lang/syntax", branch = "v0.1-beta"} -mech-utilities = {git = "https://gitlab.com/mech-lang/utilities", branch = "v0.1-beta"} +mech-core = {path = "../core"} +mech-syntax = {path = "../syntax"} +mech-utilities = {path = "../utilities"} time = "0.3.17" serde = "1.0.152" diff --git a/src/wasm/Cargo.toml b/src/wasm/Cargo.toml index 50b9098..e205016 100644 --- a/src/wasm/Cargo.toml +++ b/src/wasm/Cargo.toml @@ -70,6 +70,4 @@ features = [ 'Location', 'console', 'XmlHttpRequest', -] - -[workspace] \ No newline at end of file +] \ No newline at end of file From 5fa31d5437d321dcc0c5e55f678c76946146e1df Mon Sep 17 00:00:00 2001 From: cmontella Date: Mon, 22 May 2023 21:45:25 -0400 Subject: [PATCH 71/84] update cargo --- src/syntax/Cargo.toml | 2 +- src/utilities/Cargo.toml | 2 +- src/wasm/Cargo.toml | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/syntax/Cargo.toml b/src/syntax/Cargo.toml index fcc5174..a32ed00 100644 --- a/src/syntax/Cargo.toml +++ b/src/syntax/Cargo.toml @@ -22,7 +22,7 @@ no-std = ["mech-core/no-std", "rlibc"] lang-server = ["tower-lsp", "tokio"] [dependencies] -mech-core = {git = "https://gitlab.com/mech-lang/core", branch = "v0.1-beta"} +mech-core = {path = "../core"} hashbrown = "0.13.1" lazy_static = "1.4.0" diff --git a/src/utilities/Cargo.toml b/src/utilities/Cargo.toml index d8f41fa..d12019c 100644 --- a/src/utilities/Cargo.toml +++ b/src/utilities/Cargo.toml @@ -21,7 +21,7 @@ default = ["web"] web = ["websocket"] [dependencies] -mech-core = {git = "https://gitlab.com/mech-lang/core", branch = "v0.1-beta"} +mech-core = {path = "../core"} serde = {version = "1.0.152", default-features = false, features = ["alloc"] } serde_derive = "1.0.152" diff --git a/src/wasm/Cargo.toml b/src/wasm/Cargo.toml index e205016..f0349f7 100644 --- a/src/wasm/Cargo.toml +++ b/src/wasm/Cargo.toml @@ -20,11 +20,11 @@ maintenance = { status = "actively-developed" } crate-type = ["cdylib", "rlib"] [dependencies] -mech-core = {git = "https://gitlab.com/mech-lang/core", branch = "v0.1-beta"} -mech-syntax = {git = "https://gitlab.com/mech-lang/syntax", branch = "v0.1-beta"} -mech-utilities = {git = "https://gitlab.com/mech-lang/utilities", branch = "v0.1-beta"} -mech-math = {git = "https://gitlab.com/mech-lang/machines/math", branch = "v0.1-beta"} -mech-html = {git = "https://gitlab.com/mech-lang/machines/html", branch = "v0.1-beta"} +mech-core = {path = "../core"} +mech-syntax = {path = "../syntax"} +mech-utilities = {path = "../utilities"} +mech-math = {path = "../../machines/math"} +mech-html = {path = "../../html"} hashbrown = "0.13.1" wasm-bindgen = "0.2.83" From 850f2e0a94d0c07fe1373739f725e2e027f77987 Mon Sep 17 00:00:00 2001 From: cmontella Date: Mon, 22 May 2023 21:46:14 -0400 Subject: [PATCH 72/84] revert cargo change --- src/wasm/Cargo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wasm/Cargo.toml b/src/wasm/Cargo.toml index f0349f7..05bebf6 100644 --- a/src/wasm/Cargo.toml +++ b/src/wasm/Cargo.toml @@ -23,8 +23,8 @@ crate-type = ["cdylib", "rlib"] mech-core = {path = "../core"} mech-syntax = {path = "../syntax"} mech-utilities = {path = "../utilities"} -mech-math = {path = "../../machines/math"} -mech-html = {path = "../../html"} +mech-math = {git = "https://gitlab.com/mech-lang/machines/math", branch = "v0.1-beta"} +mech-html = {git = "https://gitlab.com/mech-lang/machines/html", branch = "v0.1-beta"} hashbrown = "0.13.1" wasm-bindgen = "0.2.83" From c0d1fc023dc220134359e94e0531ee5e81f342ac Mon Sep 17 00:00:00 2001 From: cmontella Date: Mon, 22 May 2023 22:12:58 -0400 Subject: [PATCH 73/84] Add machines to monorepo --- src/machines/html/Cargo.toml | 71 +++++ src/machines/html/LICENSE | 201 ++++++++++++ src/machines/html/README.md | 15 + src/machines/html/examples/button.mec | 8 + src/machines/html/examples/div.mec | 8 + src/machines/html/examples/img.mec | 8 + src/machines/html/examples/link.mec | 9 + src/machines/html/examples/shapes.mec | 156 +++++++++ src/machines/html/examples/slider.mec | 19 ++ src/machines/html/index.mec | 79 +++++ src/machines/html/src/elements.rs | 172 ++++++++++ src/machines/html/src/lib.rs | 274 ++++++++++++++++ src/machines/html/src/shapes.rs | 435 ++++++++++++++++++++++++++ src/machines/http/Cargo.toml | 27 ++ src/machines/http/LICENSE | 201 ++++++++++++ src/machines/http/README.md | 13 + src/machines/http/index.mec | 22 ++ src/machines/http/src/lib.rs | 8 + src/machines/http/src/request.rs | 69 ++++ src/machines/math/Cargo.toml | 26 ++ src/machines/math/LICENSE | 201 ++++++++++++ src/machines/math/README.md | 15 + src/machines/math/index.mec | 32 ++ src/machines/math/src/atan.rs | 8 + src/machines/math/src/atan2.rs | 81 +++++ src/machines/math/src/cos.rs | 8 + src/machines/math/src/lib.rs | 24 ++ src/machines/math/src/macros.rs | 130 ++++++++ src/machines/math/src/sin.rs | 8 + src/machines/math/src/tan.rs | 8 + src/machines/math/tests/math.mec | 46 +++ src/wasm/Cargo.toml | 4 +- 32 files changed, 2384 insertions(+), 2 deletions(-) create mode 100644 src/machines/html/Cargo.toml create mode 100644 src/machines/html/LICENSE create mode 100644 src/machines/html/README.md create mode 100644 src/machines/html/examples/button.mec create mode 100644 src/machines/html/examples/div.mec create mode 100644 src/machines/html/examples/img.mec create mode 100644 src/machines/html/examples/link.mec create mode 100644 src/machines/html/examples/shapes.mec create mode 100644 src/machines/html/examples/slider.mec create mode 100644 src/machines/html/index.mec create mode 100644 src/machines/html/src/elements.rs create mode 100644 src/machines/html/src/lib.rs create mode 100644 src/machines/html/src/shapes.rs create mode 100644 src/machines/http/Cargo.toml create mode 100644 src/machines/http/LICENSE create mode 100644 src/machines/http/README.md create mode 100644 src/machines/http/index.mec create mode 100644 src/machines/http/src/lib.rs create mode 100644 src/machines/http/src/request.rs create mode 100644 src/machines/math/Cargo.toml create mode 100644 src/machines/math/LICENSE create mode 100644 src/machines/math/README.md create mode 100644 src/machines/math/index.mec create mode 100644 src/machines/math/src/atan.rs create mode 100644 src/machines/math/src/atan2.rs create mode 100644 src/machines/math/src/cos.rs create mode 100644 src/machines/math/src/lib.rs create mode 100644 src/machines/math/src/macros.rs create mode 100644 src/machines/math/src/sin.rs create mode 100644 src/machines/math/src/tan.rs create mode 100644 src/machines/math/tests/math.mec diff --git a/src/machines/html/Cargo.toml b/src/machines/html/Cargo.toml new file mode 100644 index 0000000..d9647bf --- /dev/null +++ b/src/machines/html/Cargo.toml @@ -0,0 +1,71 @@ +[package] +name = "mech-html" +version = "0.1.0" +authors = ["Corey Montella "] +description = "HTML library for the Mech language" +documentation = "http://docs.mech-lang.org" +homepage = "https://mech-lang.org" +repository = "https://github.com/mech-machines/html" +keywords = ["mech", "language", "programming"] +license = "Apache-2.0" +readme = "README.md" +edition = "2021" + +[badges] +gitlab = { repository = "mech-lang/machines/html", branch = "main" } +maintenance = { status = "actively-developed" } + +[lib] +crate-type = ["dylib", "rlib"] + +[dependencies] +mech-core = {git = "https://gitlab.com/mech-lang/core", branch = "v0.1-beta", default-features = false} +mech-utilities = {git = "https://gitlab.com/mech-lang/utilities", branch = "v0.1-beta", default-features = false} + +crossbeam-channel = "0.5.6" +lazy_static = "1.4.0" + +hashbrown = "0.13.1" +wasm-bindgen = "0.2.83" +bincode = "1.3.3" +js-sys = "0.3.60" +miniz_oxide = "0.6.2" +base64 = "0.20.0" + +[dev-dependencies] +wasm-bindgen-test = "0.3.33" + +[dependencies.web-sys] +version = "0.3.60" +features = [ + 'Document', + 'Element', + 'HtmlElement', + 'HtmlDivElement', + 'HtmlImageElement', + 'HtmlCanvasElement', + 'HtmlInputElement', + 'InputEvent', + 'MouseEvent', + 'KeyboardEvent', + 'TouchEvent', + 'Event', + 'EventTarget', + 'CanvasRenderingContext2d', + 'Node', + 'Window', + 'Selection', + 'Range', + 'HtmlCollection', + 'WebSocket', + 'MessageEvent', + 'BinaryType', + 'Blob', + 'ErrorEvent', + 'ProgressEvent', + 'HashChangeEvent', + 'FileReader', + 'Location', + 'console', + 'XmlHttpRequest', +] diff --git a/src/machines/html/LICENSE b/src/machines/html/LICENSE new file mode 100644 index 0000000..41c00c9 --- /dev/null +++ b/src/machines/html/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2018 Corey Montella + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/src/machines/html/README.md b/src/machines/html/README.md new file mode 100644 index 0000000..47a5ba1 --- /dev/null +++ b/src/machines/html/README.md @@ -0,0 +1,15 @@ +

    + +

    + +Mech is a language for developing **data-driven**, **reactive** systems like robots, games, and animations. It makes **composing**, **transforming**, and **distributing** data easy, allowing you to focus on the essential complexity of your project. + +You can try Mech online at [https://mech-lang.org/try](https://mech-lang.org/try). + +Usage and installation instructions can be found in the [documentation](https://mech-lang.org/#/docs/index.mec) or the [main Mech repository](https://github.com/mech-lang/mech). + +Be sure to follow our [blog](https://mech-lang.org/blog/)([RSS](https://mech-lang.org/feed.xml))! + +## License + +Apache 2.0 \ No newline at end of file diff --git a/src/machines/html/examples/button.mec b/src/machines/html/examples/button.mec new file mode 100644 index 0000000..cf9c8cc --- /dev/null +++ b/src/machines/html/examples/button.mec @@ -0,0 +1,8 @@ +Button Example + #html/app = [ + root: "mech-root" + contains: [ + kind: "button" + contains: "Click Me!" + ] + ] \ No newline at end of file diff --git a/src/machines/html/examples/div.mec b/src/machines/html/examples/div.mec new file mode 100644 index 0000000..3aba816 --- /dev/null +++ b/src/machines/html/examples/div.mec @@ -0,0 +1,8 @@ +Div text example + #html/app = [ + root: "mech-root" + contains: [ + kind: "div" + contains: "Hello World!" + ] + ] \ No newline at end of file diff --git a/src/machines/html/examples/img.mec b/src/machines/html/examples/img.mec new file mode 100644 index 0000000..8df0b3f --- /dev/null +++ b/src/machines/html/examples/img.mec @@ -0,0 +1,8 @@ +Img Example + #html/app = [ + root: "mech-root" + contains: [ + kind: "img" + src: "https://mech-lang.org/img/logo.png" + ] + ] \ No newline at end of file diff --git a/src/machines/html/examples/link.mec b/src/machines/html/examples/link.mec new file mode 100644 index 0000000..e9043a3 --- /dev/null +++ b/src/machines/html/examples/link.mec @@ -0,0 +1,9 @@ +Link Example + #html/app = [ + root: "mech-root" + contains: [ + kind: "a" + href: "https://mech-lang.org" + contains: "Link!" + ] + ] \ No newline at end of file diff --git a/src/machines/html/examples/shapes.mec b/src/machines/html/examples/shapes.mec new file mode 100644 index 0000000..0458187 --- /dev/null +++ b/src/machines/html/examples/shapes.mec @@ -0,0 +1,156 @@ +Canvas Shapes +============== + +1. Basic shapes +---------------- + +Define the shapes + #circle = [ + shape: "circle" + parameters: [ + center-x: 250.0 + center-y: 250.0 + radius: 35.0 + fill: 0xFF0000 + line-width: 5.0 + ] + ] + #ellipse = [ + shape: "ellipse" + parameters: [ + center-x: 250.0 + center-y: 250.0 + major-axis: 30.0 + minor-axis: 50.0 + radius: 35.0 + fill: 0xFF0000 + line-width: 5.0 + ] + ] + #arc = [ + shape: "arc" + parameters: [ + center-x: 250.0 + center-y: 250.0 + starting-angle: 30.0 + ending-angle: 250.0 + radius: 35.0 + fill: 0xFF0000 + line-width: 5.0 + ] + ] + #rectangle = [ + shape: "rectangle" + parameters: [ + x: 250.0 + y: 250.0 + width: 200.0 + height: 150.0 + fill: 0xFF0000 + line-width: 5.0 + ] + ] + #text = [ + shape: "text" + parameters: [ + x: 150.0 + y: 250.0 + text: "Hello World!" + fill: 0xFF0000 + font: [size: 50.0 face: "Arial"] + ] + ] + #image = [ + shape: "image" + parameters: [ + x: 200.0 + y: 100.0 + source: "https://mech-lang.org/img/logo.png" + scale: [x: 0.10 y: 0.10] + rotate: 15 + ] + ] + +2. Path Elements +----------------- + +Line + x = 250.0 + y = 250.0 + path = [100.0 100.0 + 20.0 20.0] + shapes = [|shape parameters| + "line" [|x y| path]] + #line = [ + shape: "path" + parameters: [ + start-point: [x: 0.0 y: 0.0] + contains: [|shape parameters| shapes] + stroke: 0xFF0000 + line-width: 3.0 + translate: [x: x y: y] + rotate: 0.0 + ] + ] + +Quadratic + control-point = [x: 20.0 y: 100.0] + end-point = [x: 200.0 y: 20.0] + shapes = [|shape parameters| + "quadratic" [|control-point end-point| [|x y| control-point] [|x y| end-point]]] + #quadratic = [ + shape: "path" + parameters: [ + start-point: [x: 0.0 y: 0.0] + contains: [|shape parameters| shapes] + stroke: 0xFF0000 + line-width: 3.0 + translate: [x: x y: y] + rotate: 0.0 + ] + ] + +Bezier + control-points = [|x y| 20.0 100.0; 200.0 100.0] + shapes = [|shape parameters| + "bezier" [|control-points end-point| [|x y| control-points] [|x y| end-point]]] + #bezier = [ + shape: "path" + parameters: [ + start-point: [x: 0.0 y: 0.0] + contains: [|shape parameters| shapes] + stroke: 0xFF0000 + line-width: 3.0 + translate: [x: x y: y] + rotate: 0.0 + ] + ] + +Arc + shapes = [|shape parameters| + "arc" [center-x: 0.0 center-y: 0.0 starting-angle: 30.0 ending-angle: -30.0 radius: 35.0] + "line" [x: 0.0 y: 0.0]] + #arc = [ + shape: "path" + parameters: [ + start-point: [x: 0.0 y: 0.0] + contains: [|shape parameters| shapes] + stroke: 0x000000 + fill: 0xFFFF00 + line-width: 3 + translate: [x: x y: y] + rotate: 0.0 + ] + ] + +Draw a shape to the canvas + shape = #circle + canvas = [ + kind: "canvas" + contains: [|shape parameters| shape] + parameters: [width: 500.0 height: 500.0] + ] + #html/app = [ + root: "mech-root" + contains: [|kind contains parameters| canvas] + ] \ No newline at end of file diff --git a/src/machines/html/examples/slider.mec b/src/machines/html/examples/slider.mec new file mode 100644 index 0000000..407d39e --- /dev/null +++ b/src/machines/html/examples/slider.mec @@ -0,0 +1,19 @@ +Default + #x = 80 + +Label + #message = [kind: "div" contains: #x] + +Button Example + #html/app = [ + root: "mech-root" + contains: [ + [kind: "div" contains: [ + [#message] + [type: "slider" + min: 0.0 + max: 100.0 + value: [#x]] + ]] + ] + ] \ No newline at end of file diff --git a/src/machines/html/index.mec b/src/machines/html/index.mec new file mode 100644 index 0000000..6f280d8 --- /dev/null +++ b/src/machines/html/index.mec @@ -0,0 +1,79 @@ +html +===== + +1. Description +--------------- + +React to HTML events, render HTML elements, draw shapes on HTML Canvas + +2. Provided Tables +------------------- + +A. App + +All HTML elements should be nested in the `#html/app` table. The root column is the ID of the HTML element to which the rendered HTML elements should be attached. The HTML elements themselves should be added to the contains column. + +- `#html/app[|root contains|]` + +B. HTML Elements + +Every HTML element has the following three columns. + +- `[|type parameters contains|]` + +- type - a required column that specifieds the type of the element as a String. +- parameters - an optional column depening on the type. Allows for the configuration of certain elements. +- contains - an optional column that allows for the nesting of elements. + +The available elements and parameters are: + +- "div" - `[]` +- "a" - `[|href|]` +- "img" - `[|src|]` +- "button" - `[]` +- "slider" - `[|min max value|]` +- "canvas" - `[|height width|]` + +C. Canvas + +The available elements and parameters are: + +- "circle" - `[|center-x center-y radius|]` +- "rectangle" - `[|x y height width|]` +- "path" - `[|start-point contains|]` +- "line" - `[|x y|]` +- "quadratic" - `[|control-point end-point|]` +- "image" - `[|x y source|]` + +All elements have the following optional columns: + +`[|fill stroke line-width transform|]` + +- fill - a 3 byte hexadecimal Number Literal representing a color +- stroke - a 3 byte hexadecimal Number Literal representing a color +- line-width - a quantity in pixels specying the width of the stroke or line + +D. Events + +- `#html/event/pointer-move[|x y target event-id|]` +- `#html/event/pointer-down[|x y target event-id|]` +- `#html/event/pointer-click[|x y target event-id|]` +- `#html/event/pointer-keydown[|key event-id|]` +- `#html/event/pointer-keyup[|key event-id|]` + +E. Location + +- `#html/location[|hash host host-name href origin path-name port protocol search|]` + +3. Examples +------------ + +4. Info +-------- + +#html/machine = [ + name: "html" + version: "v0.1" + authors: "Corey Montella" + url: "https://gitlab.com/mech-lang/machines/html" + license: "Apache-2.0"] \ No newline at end of file diff --git a/src/machines/html/src/elements.rs b/src/machines/html/src/elements.rs new file mode 100644 index 0000000..314f9f8 --- /dev/null +++ b/src/machines/html/src/elements.rs @@ -0,0 +1,172 @@ +use mech_core::*; +use wasm_bindgen::JsValue; +use web_sys::*; + +use crate::*; + +pub fn render_div(table: &Table, container: &mut web_sys::Element, document: &web_sys::Document, core: &mech_core::Core) -> Result<(),JsValue> { + for row in 1..=table.rows { + // Get contents + match table.get(&TableIndex::Index(row), &TableIndex::Alias(*CONTAINS)) { + Ok(contents) => { + let element_id = hash_str(&format!("div-{:?}-{:?}", table.id, row)); + let rendered = render_value(contents,document,core)?; + rendered.set_id(&format!("{:?}",element_id)); + container.append_child(&rendered)?; + } + x => {log!("4733 {:?}",x);}, + } + } + Ok(()) +} + +pub fn render_link(table: &Table, container: &mut web_sys::Element, document: &web_sys::Document, core: &mech_core::Core) -> Result<(),JsValue> { + for row in 1..=table.rows { + match (table.get(&TableIndex::Index(row), &TableIndex::Alias(*HREF)), + table.get(&TableIndex::Index(row), &TableIndex::Alias(*CONTAINS))) { + (Ok(Value::String(href)), Ok(contents)) => { + let element_id = hash_str(&format!("div-{:?}-{:?}", table.id, row)); + let rendered = render_value(contents,document,core)?; + rendered.set_id(&format!("{:?}",element_id)); + let mut link: web_sys::Element = document.create_element("a")?; + link.set_attribute("href",&href.to_string())?; + let element_id = href.hash(); + link.set_id(&format!("{:?}",element_id)); + link.append_child(&rendered)?; + container.append_child(&link)?; + } + x => {log!("4734 {:?}", x);}, + } + } + Ok(()) +} + +pub fn render_img(table: &Table, container: &mut web_sys::Element, document: &web_sys::Document, core: &mech_core::Core) -> Result<(),JsValue> { + for row in 1..=table.rows { + match table.get(&TableIndex::Index(row), &TableIndex::Alias(*SRC)) { + Ok(Value::String(src)) => { + let mut img: web_sys::Element = document.create_element("img")?; + let element_id = hash_str(&format!("img-{:?}-{:?}", table.id, row)); + img.set_attribute("src", &src.to_string())?; + img.set_id(&format!("{:?}",element_id)); + container.append_child(&img)?; + } + x => {log!("4735 {:?}", x);}, + } + } + Ok(()) +} + +pub fn render_button(table: &Table, container: &mut web_sys::Element, document: &web_sys::Document, core: &mech_core::Core) -> Result<(),JsValue> { + for row in 1..=table.rows { + match table.get(&TableIndex::Index(row), &TableIndex::Alias(*CONTAINS)) { + Ok(contents) => { + let element_id = hash_str(&format!("div-{:?}-{:?}", table.id, row)); + let rendered = render_value(contents,document,core)?; + rendered.set_id(&format!("{:?}",element_id)); + let mut button: web_sys::Element = document.create_element("button")?; + let element_id = hash_str(&format!("button-{:?}-{:?}", table.id, row)); + button.set_id(&format!("{:?}",element_id)); + button.append_child(&rendered)?; + container.append_child(&button)?; + } + x => {log!("4736 {:?}", x);}, + } + } + Ok(()) +} + +pub fn render_slider(table: &Table, container: &mut web_sys::Element, document: &web_sys::Document, core: &mech_core::Core) -> Result<(),JsValue> { + for row in 1..=table.rows { + match (table.get(&TableIndex::Index(row), &TableIndex::Alias(*MIN)), + table.get(&TableIndex::Index(row), &TableIndex::Alias(*MAX)), + table.get(&TableIndex::Index(row), &TableIndex::Alias(*VALUE))) { + (Ok(Value::F32(min)), Ok(Value::F32(max)), Ok(Value::F32(value))) => { + let mut slider: web_sys::Element = document.create_element("input")?; + let mut slider: web_sys::HtmlInputElement = slider + .dyn_into::() + .map_err(|_| ()) + .unwrap(); + let element_id = hash_str(&format!("slider-{:?}-{:?}", table.id, row)); + slider.set_attribute("type","range"); + slider.set_attribute("min", &format!("{:?}", min)); + slider.set_attribute("max", &format!("{:?}", max)); + slider.set_attribute("value", &format!("{:?}", value)); + slider.set_attribute("row", &format!("{:?}", row)); + slider.set_attribute("table", &format!("{:?}", table.id)); + slider.set_id(&format!("{:?}",element_id)); + // Changes to the slider update its own table + { + let closure = Closure::wrap(Box::new(move |event: web_sys::InputEvent| { + match event.target() { + Some(target) => { + let slider = target.dyn_ref::().unwrap(); + let slider_value = slider.value().parse::().unwrap(); + let table_id = slider.get_attribute("table").unwrap().parse::().unwrap(); + + let row = slider.get_attribute("row").unwrap().parse::().unwrap(); + let change = Change::Set(( + table_id, vec![ + (TableIndex::Index(row), + TableIndex::Alias(*VALUE), + Value::F32(F32::new(slider_value as f32)))])); + // TODO Make this safe + /*unsafe { + let table = (*wasm_core).core.get_table_by_id(table_id).unwrap(); + (*wasm_core).changes.push(change); + (*wasm_core).process_transaction(); + (*wasm_core).render(); + }*/ + }, + _ => (), + } + }) as Box); + slider.set_oninput(Some(closure.as_ref().unchecked_ref())); + closure.forget(); + } + container.append_child(&slider)?; + } + x => {log!("4739 {:?}", x);}, + } + } + Ok(()) +} + +pub fn render_canvas(table: &Table, container: &mut web_sys::Element, document: &web_sys::Document, core: &mech_core::Core) -> Result<(),JsValue> { + for row in 1..=table.rows { + match table.get(&TableIndex::Index(row), &TableIndex::Alias(*CONTAINS)) { + Ok(contents) => { + let mut canvas: web_sys::Element = document.create_element("canvas")?; + let element_id = hash_str(&format!("canvas-{:?}-{:?}", table.id, row)); + canvas.set_id(&format!("{:?}",element_id)); + //unsafe{(*wasm_core).canvases.insert(element_id)}; + // Is there a parameters field? + match table.get(&TableIndex::Index(row), &TableIndex::Alias(*PARAMETERS)) { + Ok(Value::Reference(parameters_table_id)) => { + let parameters_table = core.get_table_by_id(*parameters_table_id.unwrap()).unwrap(); + let parameters_table_brrw = parameters_table.borrow(); + match (parameters_table_brrw.get(&TableIndex::Index(1), &TableIndex::Alias(*HEIGHT)), + parameters_table_brrw.get(&TableIndex::Index(1), &TableIndex::Alias(*WIDTH))) { + (Ok(Value::F32(height)),Ok(Value::F32(width))) => { + canvas.set_attribute("height", &format!("{:?}",height)); + canvas.set_attribute("width", &format!("{:?}",width)); + } + x => {log!("4740 {:?}", x);}, + } + } + x => {log!("4741 {:?}", x);}, + } + // Add the contents + match table.get(&TableIndex::Index(row), &TableIndex::Alias(*CONTAINS)) { + Ok(Value::Reference(contains_table_id)) => { + canvas.set_attribute("elements", &format!("{}",contains_table_id.unwrap())); + } + x => {log!("4742 {:?}", x);}, + } + container.append_child(&canvas)?; + } + x => {log!("4743 {:?}", x);}, + } + } + Ok(()) +} \ No newline at end of file diff --git a/src/machines/html/src/lib.rs b/src/machines/html/src/lib.rs new file mode 100644 index 0000000..0b41188 --- /dev/null +++ b/src/machines/html/src/lib.rs @@ -0,0 +1,274 @@ +#![recursion_limit="256"] +#![feature(alloc)] +#![feature(drain_filter)] +#![feature(get_mut_unchecked)] +#![allow(warnings)] +extern crate wasm_bindgen; +extern crate hashbrown; +#[macro_use] +extern crate alloc; +extern crate core; +extern crate web_sys; +extern crate mech_core; +extern crate mech_utilities; +extern crate bincode; +#[macro_use] +extern crate lazy_static; +extern crate miniz_oxide; +extern crate base64; +//use mech_core::{Interner, Transaction}; +//use mech_core::Value; + +use base64::{encode, decode}; +use miniz_oxide::inflate::decompress_to_vec; +use miniz_oxide::deflate::compress_to_vec; +use std::collections::HashMap; +use std::collections::hash_map::Entry; +use std::cell::Cell; +use std::cell::RefCell; +use std::rc::Rc; +use wasm_bindgen::prelude::*; +use wasm_bindgen::JsCast; +use hashbrown::hash_set::HashSet; +use alloc::vec::Vec; +use core::fmt; +//use mech_syntax::formatter::Formatter; +use mech_core::*; +use mech_utilities::{SocketMessage, MiniBlock}; +use web_sys::{ErrorEvent, MessageEvent, WebSocket, FileReader}; +use std::sync::Arc; + +pub mod shapes; +pub mod elements; + +pub use self::shapes::*; +pub use self::elements::*; + +static PI: f64 = 3.14159265358979323846264338327950288; + +#[macro_export] +macro_rules! log { + ( $( $t:tt )* ) => { + web_sys::console::log_1(&format!( $( $t )* ).into()); + } +} + +lazy_static! { + pub static ref HTML_APP: u64 = hash_str("html/app"); + pub static ref DIV: u64 = hash_str("div"); + pub static ref A: u64 = hash_str("a"); + pub static ref IMG: u64 = hash_str("img"); + pub static ref SRC: u64 = hash_str("src"); + pub static ref CONTAINS: u64 = hash_str("contains"); + pub static ref ROOT: u64 = hash_str("root"); + pub static ref TYPE: u64 = hash_str("type"); + pub static ref KIND: u64 = hash_str("kind"); + pub static ref HREF: u64 = hash_str("href"); + pub static ref BUTTON: u64 = hash_str("button"); + pub static ref SLIDER: u64 = hash_str("slider"); + pub static ref MIN: u64 = hash_str("min"); + pub static ref MAX: u64 = hash_str("max"); + pub static ref VALUE: u64 = hash_str("value"); + pub static ref CANVAS: u64 = hash_str("canvas"); + pub static ref PARAMETERS: u64 = hash_str("parameters"); + pub static ref HEIGHT: u64 = hash_str("height"); + pub static ref WIDTH: u64 = hash_str("width"); + pub static ref SHAPE: u64 = hash_str("shape"); + pub static ref CIRCLE: u64 = hash_str("circle"); + pub static ref RECTANGLE: u64 = hash_str("rectangle"); + pub static ref LINE: u64 = hash_str("line"); + pub static ref PATH: u64 = hash_str("path"); + pub static ref START__POINT: u64 = hash_str("start-point"); + pub static ref LINE__WIDTH: u64 = hash_str("line-width"); + pub static ref START__ANGLE: u64 = hash_str("start-angle"); + pub static ref END__ANGLE: u64 = hash_str("end-angle"); + pub static ref QUADRATIC: u64 = hash_str("quadratic"); + pub static ref CONTROL__POINT: u64 = hash_str("control-point"); + pub static ref CONTROL__POINTS: u64 = hash_str("control-points"); + pub static ref END__POINT: u64 = hash_str("end-point"); + pub static ref X1: u64 = hash_str("x1"); + pub static ref X2: u64 = hash_str("x2"); + pub static ref Y1: u64 = hash_str("y1"); + pub static ref Y2: u64 = hash_str("y2"); + pub static ref RADIUS: u64 = hash_str("radius"); + pub static ref STROKE: u64 = hash_str("stroke"); + pub static ref FILL: u64 = hash_str("fill"); + pub static ref CENTER__X: u64 = hash_str("center-x"); + pub static ref CENTER__Y: u64 = hash_str("center-y"); + pub static ref IMAGE: u64 = hash_str("image"); + pub static ref X: u64 = hash_str("x"); + pub static ref Y: u64 = hash_str("y"); + pub static ref ROTATE: u64 = hash_str("rotate"); + pub static ref TRANSLATE: u64 = hash_str("translate"); + pub static ref SOURCE: u64 = hash_str("source"); + pub static ref TIME_TIMER: u64 = hash_str("time/timer"); + pub static ref PERIOD: u64 = hash_str("period"); + pub static ref TICKS: u64 = hash_str("ticks"); + pub static ref HTML_EVENT_POINTER__MOVE: u64 = hash_str("html/event/pointer-move"); + pub static ref HTML_EVENT_POINTER__DOWN: u64 = hash_str("html/event/pointer-down"); + pub static ref HTML_EVENT_POINTER__UP: u64 = hash_str("html/event/pointer-up"); + pub static ref HTML_EVENT_KEY__DOWN: u64 = hash_str("html/event/key-down"); + pub static ref HTML_EVENT_KEY__UP: u64 = hash_str("html/event/key-up"); + pub static ref TARGET: u64 = hash_str("target"); + pub static ref KEY: u64 = hash_str("key"); + pub static ref EVENT__ID: u64 = hash_str("event-id"); + pub static ref ARC: u64 = hash_str("arc"); + pub static ref ELLIPSE: u64 = hash_str("ellipse"); + pub static ref MAJOR__AXIS: u64 = hash_str("major-axis"); + pub static ref MINOR__AXIS: u64 = hash_str("minor-axis"); + pub static ref STARTING__ANGLE: u64 = hash_str("starting-angle"); + pub static ref ENDING__ANGLE: u64 = hash_str("ending-angle"); + pub static ref TEXT: u64 = hash_str("text"); + pub static ref FONT: u64 = hash_str("font"); + pub static ref SIZE: u64 = hash_str("size"); + pub static ref FACE: u64 = hash_str("face"); + pub static ref STYLE: u64 = hash_str("style"); + pub static ref WEIGHT: u64 = hash_str("weight"); + pub static ref BOLD: u64 = hash_str("bold"); + pub static ref NORMAL: u64 = hash_str("normal"); + pub static ref ITALIC: u64 = hash_str("italic"); + pub static ref FAMILY: u64 = hash_str("family"); + pub static ref DIRECTION: u64 = hash_str("direction"); + pub static ref ALIGNMENT: u64 = hash_str("alignment"); + pub static ref START: u64 = hash_str("start"); + pub static ref END: u64 = hash_str("end"); + pub static ref LEFT: u64 = hash_str("left"); + pub static ref RIGHT: u64 = hash_str("right"); + pub static ref CENTER: u64 = hash_str("center"); + pub static ref BEZIER: u64 = hash_str("bezier"); + pub static ref HTML_LOCATION: u64 = hash_str("html/location"); + pub static ref HASH: u64 = hash_str("hash"); + pub static ref HOST: u64 = hash_str("host"); + pub static ref HOST__NAME: u64 = hash_str("host-name"); + pub static ref ORIGIN: u64 = hash_str("origin"); + pub static ref PATH__NAME: u64 = hash_str("path-name"); + pub static ref PORT: u64 = hash_str("port"); + pub static ref PROTOCOL: u64 = hash_str("protocol"); + pub static ref SEARCH: u64 = hash_str("search"); + pub static ref SCALE: u64 = hash_str("scale"); +} + +pub fn render_value(value: Value, document: &web_sys::Document, core: &mech_core::Core) -> Result { + let mut div = document.create_element("div")?; + match value { + Value::String(chars) => { + let contents_string = chars.to_string(); + div.set_inner_html(&contents_string); + }, + Value::F32(x) => div.set_inner_html(&format!("{:.2?}", x)), + Value::F64(x) => div.set_inner_html(&format!("{:?}", x)), + Value::U128(x) => div.set_inner_html(&format!("{:?}", x)), + Value::U64(x) => div.set_inner_html(&format!("{:?}", x)), + Value::U32(x) => div.set_inner_html(&format!("{:?}", x)), + Value::U16(x) => div.set_inner_html(&format!("{:?}", x)), + Value::U8(x) => div.set_inner_html(&format!("{:?}", x)), + Value::I128(x) => div.set_inner_html(&format!("{:?}", x)), + Value::I64(x) => div.set_inner_html(&format!("{:?}", x)), + Value::I32(x) => div.set_inner_html(&format!("{:?}", x)), + Value::I16(x) => div.set_inner_html(&format!("{:?}", x)), + Value::I8(x) => div.set_inner_html(&format!("{:?}", x)), + Value::Reference(TableId::Global(table_id)) => { + let table = core.get_table_by_id(table_id).unwrap(); + let rendered_ref = make_element(&table.borrow(), document, core)?; + div.append_child(&rendered_ref)?; + } + x => log!("4745 {:?}",x), + } + Ok(div) +} + +pub fn draw_canvas(canvas: &web_sys::HtmlCanvasElement, core: &mech_core::Core) -> Result<(), JsValue> { + + let context = canvas + .get_context("2d") + .unwrap() + .unwrap() + .dyn_into::() + .unwrap(); + + // Get the elements table for this canvas + let elements_table_id_string = canvas.get_attribute("elements").unwrap(); + let elements_table_id: u64 = elements_table_id_string.parse::().unwrap(); + let elements_table = core.get_table_by_id(elements_table_id).unwrap(); + let elements_table_brrw = elements_table.borrow(); + let context = Rc::new(context); + context.clear_rect(0.0, 0.0, canvas.width().into(), canvas.height().into()); + for row in 1..=elements_table_brrw.rows as usize { + match (elements_table_brrw.get(&TableIndex::Index(row), &TableIndex::Alias(*SHAPE)), + elements_table_brrw.get(&TableIndex::Index(row), &TableIndex::Alias(*PARAMETERS))) { + (Ok(Value::String(shape)), Ok(Value::Reference(parameters_table_id))) => { + let shape = shape.hash(); + let parameters_table = core.get_table_by_id(*parameters_table_id.unwrap()).unwrap(); + // Render a shape + if shape == *CIRCLE { render_circle(parameters_table,&context)?; } + else if shape == *ELLIPSE { render_ellipse(parameters_table,&context)?; } + else if shape == *ARC { render_arc(parameters_table,&context)?; } + else if shape == *RECTANGLE { render_rectangle(parameters_table,&context)?; } + else if shape == *TEXT { render_text(parameters_table,&context,core)?; } + else if shape == *PATH { render_path(parameters_table,&context,core)?; } + else if shape == *IMAGE { render_image(parameters_table,&context,core)?; } + else { + log!("5869"); + } + }, + x => {log!("5870 {:?}", x);}, + } + } + Ok(()) +} + +pub fn make_element(table: &Table, document: &web_sys::Document, core: &mech_core::Core) -> Result { + let mut container: web_sys::Element = document.create_element("div")?; + let element_id = hash_str(&format!("div-{:?}", table.id)); + container.set_id(&format!("{:?}",element_id)); + container.set_attribute("table-id", &format!("{}", table.id))?; + // First check to see if the table has a "type" column. If it doesn't, just render the table + match table.col_map.get_index(&*KIND) { + Ok(_) => { + for row in 1..=table.rows { + match table.get(&TableIndex::Index(row), &TableIndex::Alias(*KIND)) { + Ok(Value::String(kind)) => { + let raw_kind = kind.hash(); + // Render an HTML element + if raw_kind == *DIV { render_div(table,&mut container, document, core)?; } + else if raw_kind == *A { render_link(table,&mut container, document, core)?; } + else if raw_kind == *IMG { render_img(table,&mut container,document, core)?; } + else if raw_kind == *BUTTON { render_button(table, &mut container, document, core)?; } + else if raw_kind == *SLIDER { render_slider(table, &mut container, document, core)?; } + else if raw_kind == *CANVAS { render_canvas(table, &mut container, document, core)?; } + else { + log!("4744 {:?}", raw_kind); + } + } + x => log!("4745 {:?}",x), + Err(x) => log!("4746 {:?}",x), + } + } + } + // There's no Type column, so we are going to treat the table as a generic thing and just turn it into divs + Err(_) => { + // Make a div for each row + for row in 1..=table.rows { + let mut row_div = document.create_element("div")?; + let element_id = hash_str(&format!("div-{:?}-{:?}", table.id, row)); + row_div.set_id(&format!("{:?}",element_id)); + // Make an internal div for each cell + for column in 1..=table.cols { + // Get contents + match table.get(&TableIndex::Index(row), &TableIndex::Index(column)) { + Ok(contents) => { + let mut cell_div = document.create_element("div")?; + let element_id = hash_str(&format!("div-{:?}-{:?}-{:?}", table.id, row, column)); + let rendered = render_value(contents, document, core)?; + rendered.set_id(&format!("{:?}",element_id)); + row_div.append_child(&rendered)?; + } + x => log!("4747 {:?}",x), + } + } + container.append_child(&row_div)?; + } + } + } + Ok(container) +} \ No newline at end of file diff --git a/src/machines/html/src/shapes.rs b/src/machines/html/src/shapes.rs new file mode 100644 index 0000000..ba1a30b --- /dev/null +++ b/src/machines/html/src/shapes.rs @@ -0,0 +1,435 @@ + +use mech_core::*; +use std::cell::RefCell; +use std::rc::Rc; +use web_sys::CanvasRenderingContext2d; +use wasm_bindgen::JsValue; +use crate::*; + +// Define a function to make this a lot easier +fn get_stroke_string(parameters_table: &Table, row: usize, alias: u64) -> String { + match parameters_table.get(&TableIndex::Index(row), &TableIndex::Alias(alias)) { + Ok(Value::U128(stroke)) => { + let mut color_string: String = "#".to_string(); + color_string = format!("{}{:06x}", color_string, stroke.unwrap()); + color_string + } + _ => "#000000".to_string(), + } +} + +fn get_line_width(parameters_table: &Table, row: usize) -> f64 { + match parameters_table.get(&TableIndex::Index(row), &TableIndex::Alias(*LINE__WIDTH)) { + Ok(Value::F32(line_width)) => f64::from(line_width), + _ => 1.0, + } +} + +fn get_rotation(parameters_table: &Table, row: usize) -> f64 { + match parameters_table.get(&TableIndex::Index(row), &TableIndex::Alias(*ROTATE)) { + Ok(Value::F32(line_width)) => f64::from(line_width), + _ => 0.0, + } +} + +fn get_property(parameters_table: &Table, row: usize, alias: u64) -> String { + match parameters_table.get(&TableIndex::Index(row), &TableIndex::Alias(alias)) { + Ok(Value::F32(property)) => { + format!("{:?}", property) + }, + Ok(Value::String(property)) => property.to_string(), + x => "error".to_string() + } +} + +pub fn render_circle(parameters_table: Rc>, context: &Rc) -> Result<(),JsValue> { + let parameters_table_brrw = parameters_table.borrow(); + for row in 1..=parameters_table_brrw.rows { + match (parameters_table_brrw.get(&TableIndex::Index(row), &TableIndex::Alias(*CENTER__X)), + parameters_table_brrw.get(&TableIndex::Index(row), &TableIndex::Alias(*CENTER__Y)), + parameters_table_brrw.get(&TableIndex::Index(row), &TableIndex::Alias(*RADIUS))) { + (Ok(Value::F32(cx)), Ok(Value::F32(cy)), Ok(Value::F32(radius))) => { + let stroke = get_stroke_string(¶meters_table_brrw,row, *STROKE); + let fill = get_stroke_string(¶meters_table_brrw,row, *FILL); + let line_width = get_line_width(¶meters_table_brrw,row); + context.save(); + context.begin_path(); + context.arc(cx.into(), cy.into(), radius.into(), 0.0, 2.0 * PI); + context.set_fill_style(&JsValue::from_str(&fill)); + context.fill(); + context.set_stroke_style(&JsValue::from_str(&stroke)); + context.set_line_width(line_width.into()); + context.stroke(); + context.restore(); + } + (Ok(Value::U64(cx)), Ok(Value::U64(cy)), Ok(Value::F32(radius))) => { + let stroke = get_stroke_string(¶meters_table_brrw,row, *STROKE); + let fill = get_stroke_string(¶meters_table_brrw,row, *FILL); + let line_width = get_line_width(¶meters_table_brrw,row); + context.save(); + context.begin_path(); + context.arc(cx.into(), cy.into(), radius.into(), 0.0, 2.0 * PI); + context.set_fill_style(&JsValue::from_str(&fill)); + context.fill(); + context.set_stroke_style(&JsValue::from_str(&stroke)); + context.set_line_width(line_width.into()); + context.stroke(); + context.restore(); + } + x => {log!("5854 {:?}", x);}, + } + } + Ok(()) +} + +pub fn render_ellipse(parameters_table: Rc>, context: &Rc) -> Result<(),JsValue> { + let parameters_table_brrw = parameters_table.borrow(); + for row in 1..=parameters_table_brrw.rows { + match (parameters_table_brrw.get(&TableIndex::Index(row), &TableIndex::Alias(*CENTER__X)), + parameters_table_brrw.get(&TableIndex::Index(row), &TableIndex::Alias(*CENTER__Y)), + parameters_table_brrw.get(&TableIndex::Index(row), &TableIndex::Alias(*MAJOR__AXIS)), + parameters_table_brrw.get(&TableIndex::Index(row), &TableIndex::Alias(*MINOR__AXIS))) { + (Ok(Value::F32(cx)), Ok(Value::F32(cy)), Ok(Value::F32(maja)), Ok(Value::F32(mina))) => { + let stroke = get_stroke_string(¶meters_table_brrw,row, *STROKE); + let fill = get_stroke_string(¶meters_table_brrw,row, *FILL); + let rotation = get_rotation(¶meters_table_brrw,row); + let line_width = get_line_width(¶meters_table_brrw,row); + context.save(); + context.begin_path(); + context.ellipse(cx.into(), cy.into(), maja.into(), mina.into(), rotation, 0.0, 2.0 * PI); + context.set_fill_style(&JsValue::from_str(&fill)); + context.fill(); + context.set_stroke_style(&JsValue::from_str(&stroke)); + context.set_line_width(line_width.into()); + context.stroke(); + context.restore(); + } + x => {log!("5855 {:?}", x);}, + } + } + Ok(()) +} + +pub fn render_arc(parameters_table: Rc>, context: &Rc) -> Result<(),JsValue> { + let parameters_table_brrw = parameters_table.borrow(); + for row in 1..=parameters_table_brrw.rows { + match (parameters_table_brrw.get(&TableIndex::Index(row), &TableIndex::Alias(*CENTER__X)), + parameters_table_brrw.get(&TableIndex::Index(row), &TableIndex::Alias(*CENTER__Y)), + parameters_table_brrw.get(&TableIndex::Index(row), &TableIndex::Alias(*STARTING__ANGLE)), + parameters_table_brrw.get(&TableIndex::Index(row), &TableIndex::Alias(*ENDING__ANGLE)), + parameters_table_brrw.get(&TableIndex::Index(row), &TableIndex::Alias(*RADIUS))) { + (Ok(Value::F32(cx)), Ok(Value::F32(cy)), Ok(Value::F32(sa)), Ok(Value::F32(ea)), Ok(Value::F32(radius))) => { + let stroke = get_stroke_string(¶meters_table_brrw,row, *STROKE); + let fill = get_stroke_string(¶meters_table_brrw,row, *FILL); + let line_width = get_line_width(¶meters_table_brrw,row); + context.save(); + context.begin_path(); + context.arc(cx.into(), cy.into(), radius.into(), f64::from(sa) * PI / 180.0, f64::from(ea) * PI / 180.0); + context.set_fill_style(&JsValue::from_str(&fill)); + context.fill(); + context.set_stroke_style(&JsValue::from_str(&stroke)); + context.set_line_width(line_width); + context.stroke(); + context.restore(); + } + x => {log!("5856 {:?}", x);}, + } + } + Ok(()) +} + +pub fn render_rectangle(parameters_table: Rc>, context: &Rc) -> Result<(),JsValue> { + let parameters_table_brrw = parameters_table.borrow(); + for row in 1..=parameters_table_brrw.rows { + match (parameters_table_brrw.get(&TableIndex::Index(row), &TableIndex::Alias(*X)), + parameters_table_brrw.get(&TableIndex::Index(row), &TableIndex::Alias(*Y)), + parameters_table_brrw.get(&TableIndex::Index(row), &TableIndex::Alias(*WIDTH)), + parameters_table_brrw.get(&TableIndex::Index(row), &TableIndex::Alias(*HEIGHT))) { + (Ok(Value::F32(x)), Ok(Value::F32(y)), Ok(Value::F32(width)), Ok(Value::F32(height))) => { + let stroke = get_stroke_string(¶meters_table_brrw,row, *STROKE); + let fill = get_stroke_string(¶meters_table_brrw,row, *FILL); + let line_width = get_line_width(¶meters_table_brrw,row); + context.save(); + context.set_fill_style(&JsValue::from_str(&fill)); + context.fill_rect(x.into(),y.into(),width.into(),height.into()); + context.set_stroke_style(&JsValue::from_str(&stroke)); + context.set_line_width(line_width); + context.stroke_rect(x.into(),y.into(),width.into(),height.into()); + context.restore(); + } + x => {log!("5857 {:?}", x);}, + } + } + Ok(()) +} + +pub fn render_text(parameters_table: Rc>, context: &Rc, core: &mech_core::Core) -> Result<(),JsValue> { + let parameters_table_brrw = parameters_table.borrow(); + for row in 1..=parameters_table_brrw.rows { + let values = match (parameters_table_brrw.get(&TableIndex::Index(row), &TableIndex::Alias(*TEXT)), + parameters_table_brrw.get(&TableIndex::Index(row), &TableIndex::Alias(*X)), + parameters_table_brrw.get(&TableIndex::Index(row), &TableIndex::Alias(*Y))) { + (Ok(Value::String(text_value)), Ok(Value::F32(x)), Ok(Value::F32(y))) => Ok((text_value.to_string(),x,y)), + (Ok(Value::U8(number)), Ok(Value::F32(x)), Ok(Value::F32(y))) => Ok((format!("{:?}",number),x,y)), + (Ok(Value::U16(number)), Ok(Value::F32(x)), Ok(Value::F32(y))) => Ok((format!("{:?}",number),x,y)), + (Ok(Value::U32(number)), Ok(Value::F32(x)), Ok(Value::F32(y))) => Ok((format!("{:?}",number),x,y)), + (Ok(Value::U64(number)), Ok(Value::F32(x)), Ok(Value::F32(y))) => Ok((format!("{:?}",number),x,y)), + (Ok(Value::U128(number)), Ok(Value::F32(x)), Ok(Value::F32(y))) => Ok((format!("{:?}",number),x,y)), + (Ok(Value::I8(number)), Ok(Value::F32(x)), Ok(Value::F32(y))) => Ok((format!("{:?}",number),x,y)), + (Ok(Value::I16(number)), Ok(Value::F32(x)), Ok(Value::F32(y))) => Ok((format!("{:?}",number),x,y)), + (Ok(Value::I32(number)), Ok(Value::F32(x)), Ok(Value::F32(y))) => Ok((format!("{:?}",number),x,y)), + (Ok(Value::I64(number)), Ok(Value::F32(x)), Ok(Value::F32(y))) => Ok((format!("{:?}",number),x,y)), + (Ok(Value::I128(number)), Ok(Value::F32(x)), Ok(Value::F32(y))) => Ok((format!("{:?}",number),x,y)), + (Ok(Value::F32(number)), Ok(Value::F32(x)), Ok(Value::F32(y))) => Ok((format!("{:?}",number),x,y)), + (Ok(Value::F64(number)), Ok(Value::F32(x)), Ok(Value::F32(y))) => Ok((format!("{:?}",number),x,y)), + x => { + log!("5858 {:?}", x); + Err(()) + }, + }; + match values { + Ok((text,x,y)) => { + let stroke = get_stroke_string(¶meters_table_brrw,row, *STROKE); + let fill = get_stroke_string(¶meters_table_brrw,row, *FILL); + let line_width = get_line_width(¶meters_table_brrw,row); + + context.save(); + context.set_fill_style(&JsValue::from_str(&fill)); + context.set_line_width(line_width); + match parameters_table_brrw.get(&TableIndex::Index(row), &TableIndex::Alias(*FONT)) { + Ok(Value::Reference(font_table_id)) => { + let font_table = core.get_table_by_id(*font_table_id.unwrap()).unwrap(); + let font_table_brrw = font_table.borrow(); + let size = get_property(&font_table_brrw, row, *SIZE); + let face = match &*get_property(&font_table_brrw, row, *FACE) { + "" => "sans-serif".to_string(), + x => x.to_string(), + }; + let font_string = format!("{}px {}", size, face); + context.set_font(&*font_string); + } + _ => (), + } + context.fill_text(&text,x.into(),y.into()); + context.restore(); + } + _ => (), + } + } + Ok(()) +} + +pub fn render_line(parameters_table: Rc>, context: &Rc) -> Result<(),JsValue> { + let parameters_table_brrw = parameters_table.borrow(); + for row in 1..=parameters_table_brrw.rows { + match (parameters_table_brrw.get(&TableIndex::Index(row), &TableIndex::Alias(*X)), + parameters_table_brrw.get(&TableIndex::Index(row), &TableIndex::Alias(*Y))) { + (Ok(Value::F32(x)),Ok(Value::F32(y))) => { + context.line_to(x.into(), y.into()); + } + x => {log!("5859 {:?}", x);}, + } + } + Ok(()) +} + +pub fn render_quadratic(parameters_table: Rc>, context: &Rc, core: &mech_core::Core) -> Result<(),JsValue> { + let parameters_table_brrw = parameters_table.borrow(); + for row in 1..=parameters_table_brrw.rows { + let parameters_table_brrw = parameters_table.borrow(); + match (parameters_table_brrw.get(&TableIndex::Index(1), &TableIndex::Alias(*CONTROL__POINT)), + parameters_table_brrw.get(&TableIndex::Index(1), &TableIndex::Alias(*END__POINT))) { + (Ok(Value::Reference(TableId::Global(control__point_table_id))),Ok(Value::Reference(TableId::Global(end__point_table_id)))) => { + let control__point_table = core.get_table_by_id(control__point_table_id).unwrap(); + let end__point_table = core.get_table_by_id(end__point_table_id).unwrap(); + let control__point_table_brrw = control__point_table.borrow(); + let end__point_table_brrw = end__point_table.borrow(); + match (control__point_table_brrw.get(&TableIndex::Index(1), &TableIndex::Alias(*X)), + control__point_table_brrw.get(&TableIndex::Index(1), &TableIndex::Alias(*Y)), + end__point_table_brrw.get(&TableIndex::Index(1), &TableIndex::Alias(*X)), + end__point_table_brrw.get(&TableIndex::Index(1), &TableIndex::Alias(*Y))) { + (Ok(Value::F32(cx)),Ok(Value::F32(cy)),Ok(Value::F32(ex)),Ok(Value::F32(ey))) => { + context.quadratic_curve_to(cx.into(), cy.into(), ex.into(), ey.into()); + } + x => {log!("5860 {:?}", x);}, + } + } + x => {log!("5861 {:?}", x);}, + } + } + Ok(()) +} + +pub fn render_bezier(parameters_table: Rc>, context: &Rc, core: &mech_core::Core) -> Result<(),JsValue> { + let parameters_table_brrw = parameters_table.borrow(); + match (parameters_table_brrw.get(&TableIndex::Index(1), &TableIndex::Alias(*CONTROL__POINTS)), + parameters_table_brrw.get(&TableIndex::Index(1), &TableIndex::Alias(*END__POINT))) { + (Ok(Value::Reference(TableId::Global(control__point_table_id))),Ok(Value::Reference(TableId::Global(end__point_table_id)))) => { + let control__point_table = core.get_table_by_id(control__point_table_id).unwrap(); + let end__point_table = core.get_table_by_id(end__point_table_id).unwrap(); + let control__point_table_brrw = control__point_table.borrow(); + let end__point_table_brrw = end__point_table.borrow(); + match (control__point_table_brrw.get(&TableIndex::Index(1), &TableIndex::Alias(*X)), + control__point_table_brrw.get(&TableIndex::Index(1), &TableIndex::Alias(*Y)), + control__point_table_brrw.get(&TableIndex::Index(2), &TableIndex::Alias(*X)), + control__point_table_brrw.get(&TableIndex::Index(2), &TableIndex::Alias(*Y)), + end__point_table_brrw.get(&TableIndex::Index(1), &TableIndex::Alias(*X)), + end__point_table_brrw.get(&TableIndex::Index(1), &TableIndex::Alias(*Y))) { + (Ok(Value::F32(cx1)),Ok(Value::F32(cy1)),Ok(Value::F32(cx2)),Ok(Value::F32(cy2)),Ok(Value::F32(ex)),Ok(Value::F32(ey))) => { + context.bezier_curve_to(cx1.into(), cy1.into(), cx2.into(), cy2.into(), ex.into(), ey.into()); + } + x => {log!("5862 {:?}", x);}, + } + } + x => {log!("5863 {:?}", x);}, + } + Ok(()) +} + +pub fn render_arc_path(parameters_table: Rc>, context: &Rc, core: &mech_core::Core) -> Result<(),JsValue> { + let parameters_table_brrw = parameters_table.borrow(); + match (parameters_table_brrw.get(&TableIndex::Index(1), &TableIndex::Alias(*CENTER__X)), + parameters_table_brrw.get(&TableIndex::Index(1), &TableIndex::Alias(*CENTER__Y)), + parameters_table_brrw.get(&TableIndex::Index(1), &TableIndex::Alias(*STARTING__ANGLE)), + parameters_table_brrw.get(&TableIndex::Index(1), &TableIndex::Alias(*ENDING__ANGLE)), + parameters_table_brrw.get(&TableIndex::Index(1), &TableIndex::Alias(*RADIUS))) { + (Ok(Value::F32(cx)),Ok(Value::F32(cy)),Ok(Value::F32(sa)),Ok(Value::F32(ea)),Ok(Value::F32(radius))) => { + context.arc(cx.into(), cy.into(), radius.into(), f64::from(sa) * PI / 180.0, f64::from(ea) * PI / 180.0); + } + x => {log!("5864 {:?}", x);}, + } + Ok(()) +} + +pub fn render_path(parameters_table: Rc>, context: &Rc, core: &mech_core::Core) -> Result<(),JsValue> { + let parameters_table_brrw = parameters_table.borrow(); + context.save(); + let rotate = match parameters_table_brrw.get(&TableIndex::Index(1), &TableIndex::Alias(*ROTATE)) { + Ok(Value::F32(rotate)) => rotate, + _ => F32::new(0.0), + }; + let (tx,ty) = match parameters_table_brrw.get(&TableIndex::Index(1), &TableIndex::Alias(*TRANSLATE)) { + Ok(Value::Reference(TableId::Global(translate_table_id))) => { + let translate_table = core.get_table_by_id(translate_table_id).unwrap(); + let translate_table_brrw = translate_table.borrow(); + match (translate_table_brrw.get(&TableIndex::Index(1), &TableIndex::Alias(*X)), + translate_table_brrw.get(&TableIndex::Index(1), &TableIndex::Alias(*Y))) { + (Ok(Value::F32(tx)),Ok(Value::F32(ty))) => (tx,ty), + _ => (F32::new(0.0),F32::new(0.0)), + } + }, + _ => (F32::new(0.0),F32::new(0.0)), + }; + context.translate(tx.into(),ty.into()); + context.rotate(f64::from(rotate) * PI / 180.0); + context.begin_path(); + + match (parameters_table_brrw.get(&TableIndex::Index(1), &TableIndex::Alias(*START__POINT)), + parameters_table_brrw.get(&TableIndex::Index(1), &TableIndex::Alias(*CONTAINS))) { + (Ok(Value::Reference(start_point_id)), Ok(Value::Reference(TableId::Global(contains_table_id)))) => { + let start_point_table = core.get_table_by_id(*start_point_id.unwrap()).unwrap(); + let start_point_table_brrw = start_point_table.borrow(); + match (start_point_table_brrw.get(&TableIndex::Index(1), &TableIndex::Alias(*X)), + start_point_table_brrw.get(&TableIndex::Index(1), &TableIndex::Alias(*Y))) { + (Ok(Value::F32(x)),Ok(Value::F32(y))) => { + context.move_to(x.into(), y.into()); + // Get the contained shapes + let contains_table = core.get_table_by_id(contains_table_id).unwrap(); + let contains_table_brrw = contains_table.borrow(); + for i in 1..=contains_table_brrw.rows { + match (contains_table_brrw.get(&TableIndex::Index(i), &TableIndex::Alias(*SHAPE)), + contains_table_brrw.get(&TableIndex::Index(i), &TableIndex::Alias(*PARAMETERS))) { + (Ok(Value::String(shape)),Ok(Value::Reference(TableId::Global(parameters_table_id)))) => { + let shape = shape.hash(); + let parameters_table = core.get_table_by_id(parameters_table_id).unwrap(); + // Render a path element + if shape == *LINE { render_line(parameters_table,&context)?; } + else if shape == *QUADRATIC { render_quadratic(parameters_table,&context,core)?; } + else if shape == *BEZIER { render_bezier(parameters_table,&context,core)?; } + else if shape == *ARC { render_arc_path(parameters_table,&context,core)?; } + } + x => {log!("5865 {:?}", x);}, + } + } + } + x => {log!("5866 {:?}", x);}, + } + let stroke = get_stroke_string(¶meters_table_brrw,1, *STROKE); + let line_width = get_line_width(¶meters_table_brrw,1); + + // Only set the stroke if it's included as a field + match parameters_table_brrw.get(&TableIndex::Index(1), &TableIndex::Alias(*FILL)) { + Ok(_) => { + let fill = get_stroke_string(¶meters_table_brrw,1, *FILL); + context.set_fill_style(&JsValue::from_str(&fill)); + context.fill(); + } + _ => (), + } + context.set_stroke_style(&JsValue::from_str(&stroke)); + context.set_line_width(line_width); + context.stroke(); + } + x => {log!("5867 {:?}", x);}, + } + //context.close_path(); + context.restore(); + Ok(()) +} + +pub fn render_image(parameters_table: Rc>, context: &Rc, core: &mech_core::Core) -> Result<(),JsValue> { + let parameters_table_brrw = parameters_table.borrow(); + for row in 1..=parameters_table_brrw.rows { + match (parameters_table_brrw.get(&TableIndex::Index(row), &TableIndex::Alias(*SOURCE)), + parameters_table_brrw.get(&TableIndex::Index(row), &TableIndex::Alias(*X)), + parameters_table_brrw.get(&TableIndex::Index(row), &TableIndex::Alias(*Y)), + parameters_table_brrw.get(&TableIndex::Index(row), &TableIndex::Alias(*ROTATE)), + parameters_table_brrw.get(&TableIndex::Index(row), &TableIndex::Alias(*SCALE))) { + (Ok(Value::String(source)), Ok(Value::F32(x)), Ok(Value::F32(y)), rotation, scale) => { + let source_hash = source.hash(); + /*match unsafe{(*wasm_core).images.entry(source_hash)} { + Entry::Occupied(img_entry) => { + let img = img_entry.get(); + let ix = img.width() as f64 / 2.0; + let iy = img.height() as f64 / 2.0; + context.save(); + context.translate(x.into(), y.into()); + if let Ok(Value::F32(rotation)) = rotation { + context.rotate(rotation.unwrap() as f64 * PI / 180.0); + } // TODO Else warn user it's the wrong type + if let Ok(Value::Reference(scale_table_id)) = scale { + let scale_table = core.get_table_by_id(*scale_table_id.unwrap()).unwrap(); + let scale_table_brrw = scale_table.borrow(); + match (scale_table_brrw.get(&TableIndex::Index(1), &TableIndex::Alias(*X)), + scale_table_brrw.get(&TableIndex::Index(1), &TableIndex::Alias(*Y))) { + (Ok(Value::F32(x)),Ok(Value::F32(y))) => { + context.scale(x.unwrap() as f64, y.unwrap() as f64); + } + _ => (), + } + //context.rotate(rotation.unwrap() as f64 * PI / 180.0); + } // TODO Else warn user it's the wrong type + context.draw_image_with_html_image_element(&img, -ix as f64, -iy as f64); + context.restore(); + }, + Entry::Vacant(v) => { + let mut img = web_sys::HtmlImageElement::new().unwrap(); + img.set_src(&source.to_string()); + { + let closure = Closure::wrap(Box::new(move || { + unsafe { + (*wasm_core).render(); + } + }) as Box); + img.set_onload(Some(closure.as_ref().unchecked_ref())); + v.insert(img); + closure.forget(); + } + } + }*/ + } + x => {log!("5868 {:?}", x);}, + } + } + Ok(()) +} \ No newline at end of file diff --git a/src/machines/http/Cargo.toml b/src/machines/http/Cargo.toml new file mode 100644 index 0000000..fa577a7 --- /dev/null +++ b/src/machines/http/Cargo.toml @@ -0,0 +1,27 @@ +[package] +name = "mech-http" +version = "0.0.1" +authors = ["Corey Montella "] +description = "HTTP library for the Mech language" +documentation = "http://docs.mech-lang.org" +homepage = "https://mech-lang.org" +repository = "https://github.com/mech-machines/http" +keywords = ["mech", "language", "programming"] +license = "Apache-2.0" +readme = "README.md" +edition = "2021" + +[badges] +gitlab = { repository = "mech-lang/machines/http", branch = "main" } +maintenance = { status = "actively-developed" } + +[lib] +crate-type = ["dylib", "rlib"] + +[dependencies] +mech-core = {git = "https://gitlab.com/mech-lang/core", branch= "v0.1-beta"} +mech-utilities = {git = "https://gitlab.com/mech-lang/utilities", branch= "v0.1-beta"} + +crossbeam-channel = "0.5.6" +lazy_static = "1.4.0" +reqwest = { version = "0.11", features = ["blocking"] } \ No newline at end of file diff --git a/src/machines/http/LICENSE b/src/machines/http/LICENSE new file mode 100644 index 0000000..41c00c9 --- /dev/null +++ b/src/machines/http/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2018 Corey Montella + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/src/machines/http/README.md b/src/machines/http/README.md new file mode 100644 index 0000000..150c130 --- /dev/null +++ b/src/machines/http/README.md @@ -0,0 +1,13 @@ + + +Mech is a language for developing **data-driven**, **reactive** systems like animations, games, and robots. It makes **composing**, **transforming**, and **distributing** data easy, allowing you to focus on the essential complexity of your project. + +Read about progress on our [blog](https://mech-lang.org/blog/), follow us on Twitter [@MechLang](https://twitter.com/MechLang), or join the mailing list: [talk@mech-lang.org](https://mech-lang.org/page/community/). + +## Provided Tables + +- `#http/request[|uri header response|]` + +## License + +Apache 2.0 \ No newline at end of file diff --git a/src/machines/http/index.mec b/src/machines/http/index.mec new file mode 100644 index 0000000..ccfb500 --- /dev/null +++ b/src/machines/http/index.mec @@ -0,0 +1,22 @@ +http +===== + +1. Description +--------------- + +Send and receive HTTP messages. + +2. Provided Tables +------------------- + +- `#http/request[|uri header response|]` + +3. Info +-------- + +#http/machine = [ + name: "http" + version: "v0.0.1" + authors: "Corey Montella" + url: "https://gitlab.com/mech-lang/machines/http" + license: "Apache-2.0"] \ No newline at end of file diff --git a/src/machines/http/src/lib.rs b/src/machines/http/src/lib.rs new file mode 100644 index 0000000..d7cbd0e --- /dev/null +++ b/src/machines/http/src/lib.rs @@ -0,0 +1,8 @@ +extern crate mech_core; +#[macro_use] +extern crate mech_utilities; +extern crate crossbeam_channel; +#[macro_use] +extern crate lazy_static; + +pub mod request; \ No newline at end of file diff --git a/src/machines/http/src/request.rs b/src/machines/http/src/request.rs new file mode 100644 index 0000000..a5ff654 --- /dev/null +++ b/src/machines/http/src/request.rs @@ -0,0 +1,69 @@ +extern crate crossbeam_channel; +extern crate reqwest; +use mech_core::*; +use mech_utilities::*; +use std::thread::{self}; +use crossbeam_channel::Sender; +use std::collections::HashMap; + +lazy_static! { + static ref HTTP_REQUEST: u64 = hash_str("http/request"); + static ref URI: u64 = hash_str("uri"); + static ref HEADER: u64 = hash_str("header"); + static ref RESPONSE: u64 = hash_str("response"); +} + +export_machine!(http_request, http_request_reg); + +extern "C" fn http_request_reg(registrar: &mut dyn MachineRegistrar, outgoing: Sender) -> String { + registrar.register_machine(Box::new(Request{outgoing})); + "#http/request = [|uri header response|]".to_string() +} + +#[derive(Debug)] +pub struct Request { + outgoing: Sender, +} + +impl Machine for Request { + + fn name(&self) -> String { + "http/request".to_string() + } + + fn id(&self) -> u64 { + hash_str(&self.name()) + } + + fn on_change(&mut self, table: &Table) -> Result<(), MechError> { + for i in 1..=table.rows { + let row = TableIndex::Index(i); + let uri = table.get(&row,&TableIndex::Alias(*URI))?; + match uri { + Value::String(uri) => { + let outgoing = self.outgoing.clone(); + let uri = uri.clone(); + let request_handle = thread::spawn(move || { + match reqwest::blocking::get(uri.to_string()) { + Ok(response) => { + if response.status().is_success() { + let text = response.text().unwrap(); + outgoing.send(RunLoopMessage::Transaction(vec![ + Change::Set((*HTTP_REQUEST, vec![(row, TableIndex::Alias(*RESPONSE), Value::from_string(&text))])), + ])); + } else if response.status().is_server_error() { + // TODO Handle Error + } else { + // TODO Handle Error + } + } + Err(_) => (), // TODO Handle errors + } + }); + } + _ => (), // TODO Send error + } + } + Ok(()) + } +} \ No newline at end of file diff --git a/src/machines/math/Cargo.toml b/src/machines/math/Cargo.toml new file mode 100644 index 0000000..0e4ccde --- /dev/null +++ b/src/machines/math/Cargo.toml @@ -0,0 +1,26 @@ +[package] +name = "mech-math" +version = "0.1.0" +authors = ["Corey Montella "] +description = "Math library for the Mech language" +documentation = "http://docs.mech-lang.org" +homepage = "https://mech-lang.org" +repository = "https://github.com/mech-machines/math" +keywords = ["mech", "language", "programming"] +license = "Apache-2.0" +readme = "README.md" +edition = "2021" + +[badges] +gitlab = { repository = "mech-lang/machines/math", branch = "main" } +maintenance = { status = "actively-developed" } + +[lib] +crate-type = ["dylib", "rlib"] + +[dependencies] +mech-core = {path = "../core", default-features = false} +mech-utilities = {path = "../utilities", default-features = false} + +libm = "0.2.6" +lazy_static = "1.4.0" \ No newline at end of file diff --git a/src/machines/math/LICENSE b/src/machines/math/LICENSE new file mode 100644 index 0000000..41c00c9 --- /dev/null +++ b/src/machines/math/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2018 Corey Montella + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/src/machines/math/README.md b/src/machines/math/README.md new file mode 100644 index 0000000..27a1e1e --- /dev/null +++ b/src/machines/math/README.md @@ -0,0 +1,15 @@ +

    + +

    + +Mech is a language for developing **data-driven**, **reactive** systems like robots, games, and animations. It makes **composing**, **transforming**, and **distributing** data easy, allowing you to focus on the essential complexity of your project. + +You can try Mech online at [https://mech-lang.org/try](https://mech-lang.org/try). + +Usage and installation instructions can be found in the [documentation](https://mech-lang.org/#/docs/index.mec) or the [main Mech repository](https://github.com/mech-lang/mech). + +Be sure to follow our [blog](https://mech-lang.org/blog/)([RSS](https://mech-lang.org/feed.xml))! + +## License + +Apache 2.0 diff --git a/src/machines/math/index.mec b/src/machines/math/index.mec new file mode 100644 index 0000000..0314b3d --- /dev/null +++ b/src/machines/math/index.mec @@ -0,0 +1,32 @@ +math +===== + +1. Description +--------------- + +Provides standard mathematical functions. + +2. Provided Functions +---------------------- + +- math/sin(angle) +- math/sin(angle) + +- math/cos(angle) +- math/cos(angle) + +- math/tan(angle) +- math/tan(angle) + +- math/atan(angle) +- math/atan(angle) + +3. Info +-------- + +#math/machine = [ + name: "math" + version: "v0.1.0" + authors: ["Corey Montella", "Haocheng Gao"] + machine-url: "https://gitlab.com/mech-lang/machines/math" + license: "Apache-2.0"] \ No newline at end of file diff --git a/src/machines/math/src/atan.rs b/src/machines/math/src/atan.rs new file mode 100644 index 0000000..b9971f7 --- /dev/null +++ b/src/machines/math/src/atan.rs @@ -0,0 +1,8 @@ +trigonometry_rad_vv!( + MathAtanRadVV, // MechFunction + MathAtan, // MechFunctionCompiler + atanf, // libm function call + math_atan_reg, // registry function name + math_atan, // export name + "math/atan", // function name in Mech +); diff --git a/src/machines/math/src/atan2.rs b/src/machines/math/src/atan2.rs new file mode 100644 index 0000000..3b880d0 --- /dev/null +++ b/src/machines/math/src/atan2.rs @@ -0,0 +1,81 @@ +use libm::atan2f; + +use std::cell::RefCell; +use std::rc::Rc; +use mech_core::*; +use mech_utilities::*; + +lazy_static! { + static ref Y: u64 = hash_str("y"); + static ref X: u64 = hash_str("x"); +} + +#[derive(Debug)] +pub struct MathAtan2VV { + pub y_col: (ColumnV, usize, usize), + pub x_col: (ColumnV, usize, usize), + pub out: ColumnV, +} + +impl MechFunction for MathAtan2VV { + fn solve(&self) { + let (y_col,siy,eiy) = &self.y_col; + let (x_col,six,eix) = &self.x_col; + self.out.borrow_mut() + .iter_mut() + .zip(y_col.borrow()[*siy..=*eiy].iter()) + .zip(x_col.borrow()[*six..=*eix].iter()) + .for_each(|((out,y), x)| *out = F32::new(atan2f(y.unwrap(),x.unwrap()))); + } + fn to_string(&self) -> String { format!("{:#?}", self)} +} + +pub struct MathAtan2 {} + +impl MechFunctionCompiler for MathAtan2 { + fn compile( + &self, + block: &mut Block, + arguments: &Vec, + out: &(TableId, TableIndex, TableIndex) + ) -> std::result::Result<(),MechError> + { + if arguments.len() > 2 { + return Err(MechError{msg: "".to_string(), id: 1347, kind: MechErrorKind::TooManyInputArguments(arguments.len(),1)}); + } + let arg_dims = block.get_arg_dims(&arguments)?; + let (arg_name1,arg_table_id1,_) = arguments[0]; + let (arg_name2,arg_table_id2,_) = arguments[1]; + let (out_table_id, _, _) = out; + let out_table = block.get_table(out_table_id)?; + let mut out_brrw = out_table.borrow_mut(); + if (arg_name1 == *Y && arg_name2 == *X) { + match (arg_dims[0],arg_dims[1]) { + (TableShape::Scalar,TableShape::Scalar) => { + let arg1 = block.get_arg_columns(arguments)?[0].clone(); + let arg2 = block.get_arg_columns(arguments)?[0].clone(); + out_brrw.resize(1,1); + out_brrw.set_kind(ValueKind::F32); + if let Column::F32(out_col) = out_brrw.get_column_unchecked(0) { + match (arg1,arg2) { + ((_,Column::F32(y_col),ColumnIndex::Index(_)),(_,Column::F32(x_col),ColumnIndex::Index(_))) | + ((_,Column::F32(y_col),ColumnIndex::All),(_,Column::F32(x_col),ColumnIndex::All)) => block.plan.push(MathAtan2VV{y_col: (y_col.clone(),0,0), x_col: (x_col.clone(),0,0), out: out_col.clone()}), + ((_,col,_),_) => { return Err(MechError{msg: "".to_string(), id: 1348, kind: MechErrorKind::UnhandledFunctionArgumentKind(col.kind())}); } + } + } + } + x => {return Err(MechError{msg: "".to_string(), id: 1350, kind: MechErrorKind::UnhandledTableShape(arg_dims[0])});}, + } + } else { + return Err(MechError{msg: "".to_string(), id: 1351, kind: MechErrorKind::UnknownFunctionArgument(arg_name1)}); + } + Ok(()) + } +} + + +export_mech_function!(math_atan2, math_atan2_reg); + +extern "C" fn math_atan2_reg(registrar: &mut dyn MechFunctionRegistrar) { + registrar.register_mech_function(hash_str("math/atan2"),Box::new(MathAtan2{})); +} \ No newline at end of file diff --git a/src/machines/math/src/cos.rs b/src/machines/math/src/cos.rs new file mode 100644 index 0000000..d0a71ab --- /dev/null +++ b/src/machines/math/src/cos.rs @@ -0,0 +1,8 @@ +trigonometry_rad_vv!( + MathCosRadVV, // MechFunction + MathCos, // MechFunctionCompiler + cosf, // libm function call + math_cos_reg, // registry function name + math_cos, // export name + "math/cos", // function name in Mech +); diff --git a/src/machines/math/src/lib.rs b/src/machines/math/src/lib.rs new file mode 100644 index 0000000..3465b81 --- /dev/null +++ b/src/machines/math/src/lib.rs @@ -0,0 +1,24 @@ +#![no_main] +#![allow(warnings)] +extern crate mech_core; +extern crate mech_utilities; +extern crate libm; +#[macro_use] +extern crate lazy_static; + +static PI: f32 = 3.14159265358979323846264338327950288; + +#[macro_use] +mod macros; + +pub mod sin; +pub mod cos; +pub mod tan; +pub mod atan; +pub mod atan2; + +pub use self::sin::*; +pub use self::cos::*; +pub use self::tan::*; +pub use self::atan::*; +pub use self::atan2::*; \ No newline at end of file diff --git a/src/machines/math/src/macros.rs b/src/machines/math/src/macros.rs new file mode 100644 index 0000000..8ab79f3 --- /dev/null +++ b/src/machines/math/src/macros.rs @@ -0,0 +1,130 @@ + +#[macro_export] +macro_rules! trigonometry_rad_vv { + ( + $function_type: ident, + $function_compiler_type: ident, + $libm_function_call: tt, + $registry_function_name: ident, + $export_name: tt, + $mech_function_name: expr, + ) => + { + use libm::$libm_function_call; + + use std::cell::RefCell; + use std::rc::Rc; + use mech_core::*; + use mech_utilities::*; + + lazy_static! { + static ref ANGLE: u64 = hash_str("angle"); + } + + #[derive(Debug)] + pub struct $function_type { + pub col: (ColumnV, usize, usize), + pub out: ColumnV, + } + + impl MechFunction for $function_type { + fn solve(&self) { + let (col,six,eix) = &self.col; + self.out.borrow_mut() + .iter_mut() + .zip(col.borrow()[*six..=*eix].iter()) + .for_each(|(out, rhs)| *out = F32::new($libm_function_call(rhs.unwrap()))); + } + fn to_string(&self) -> String { format!("{:#?}", self)} + } + + pub struct $function_compiler_type {} + + impl MechFunctionCompiler for $function_compiler_type { + fn compile( + &self, + block: &mut Block, + arguments: &Vec, + out: &(TableId, TableIndex, TableIndex) + ) -> std::result::Result<(),MechError> + { + if arguments.len() > 1 { + return Err(MechError{msg: "".to_string(), id: 1347, kind: MechErrorKind::TooManyInputArguments(arguments.len(),1)}); + } + let arg_dims = block.get_arg_dims(&arguments)?; + let (arg_name,arg_table_id,_) = arguments[0]; + let (out_table_id, _, _) = out; + let out_table = block.get_table(out_table_id)?; + let mut out_brrw = out_table.borrow_mut(); + if arg_name == *ANGLE { + match arg_dims[0] { + TableShape::Scalar => { + let arg = block.get_arg_columns(arguments)?[0].clone(); + out_brrw.resize(1,1); + out_brrw.set_kind(ValueKind::F32); + if let Column::F32(out_col) = out_brrw.get_column_unchecked(0) { + match arg { + (_,Column::F32(col),ColumnIndex::Index(_)) | + (_,Column::F32(col),ColumnIndex::All) => block.plan.push($function_type{col: (col.clone(),0,0), out: out_col.clone()}), + (_,Column::Angle(col),ColumnIndex::All) => block.plan.push($function_type{col: (col.clone(),0,0), out: out_col.clone()}), + (_,col,_) => { return Err(MechError{msg: "".to_string(), id: 1348, kind: MechErrorKind::UnhandledFunctionArgumentKind(col.kind())}); } + } + } + } + TableShape::Column(rows) => { + let arg = block.get_arg_columns(arguments)?[0].clone(); + out_brrw.resize(rows,1); + out_brrw.set_kind(ValueKind::F32); + if let Column::F32(out_col) = out_brrw.get_column_unchecked(0) { + match arg { + (_,Column::F32(col),ColumnIndex::All) => block.plan.push($function_type{col: (col.clone(),0,col.len()-1), out: out_col.clone()}), + (_,Column::Angle(col),ColumnIndex::All) => block.plan.push($function_type{col: (col.clone(),0,col.len()-1), out: out_col.clone()}), + (_,col,_) => { return Err(MechError{msg: "".to_string(), id: 1349, kind: MechErrorKind::UnhandledFunctionArgumentKind(col.kind())}); } + } + } + } + TableShape::Row(cols) => { + let arg_cols = block.get_whole_table_arg_cols(&arguments[0])?; + out_brrw.resize(1,cols); + out_brrw.set_kind(ValueKind::F32); + for col_ix in 0..cols { + if let Column::F32(out_col) = out_brrw.get_column_unchecked(col_ix) { + match &arg_cols[col_ix] { + (_,Column::F32(col),ColumnIndex::All) => block.plan.push($function_type{col: (col.clone(),0,col.len()-1), out: out_col.clone()}), + (_,Column::Angle(col),ColumnIndex::All) => block.plan.push($function_type{col: (col.clone(),0,col.len()-1), out: out_col.clone()}), + (_,col,_) => { return Err(MechError{msg: "".to_string(), id: 1349, kind: MechErrorKind::UnhandledFunctionArgumentKind(col.kind())}); } + } + } + } + } + TableShape::Matrix(rows,cols) => { + let arg_cols = block.get_whole_table_arg_cols(&arguments[0])?; + out_brrw.resize(rows,cols); + out_brrw.set_kind(ValueKind::F32); + for col_ix in 0..cols { + if let Column::F32(out_col) = out_brrw.get_column_unchecked(col_ix) { + match &arg_cols[col_ix] { + (_,Column::F32(col),ColumnIndex::All) => block.plan.push($function_type{col: (col.clone(),0,col.len()-1), out: out_col.clone()}), + (_,Column::Angle(col),ColumnIndex::All) => block.plan.push($function_type{col: (col.clone(),0,col.len()-1), out: out_col.clone()}), + (_,col,_) => { return Err(MechError{msg: "".to_string(), id: 1349, kind: MechErrorKind::UnhandledFunctionArgumentKind(col.kind())}); } + } + } + } + } + x => {return Err(MechError{msg: "".to_string(), id: 1350, kind: MechErrorKind::UnhandledTableShape(arg_dims[0])});}, + } + } else { + return Err(MechError{msg: "".to_string(), id: 1351, kind: MechErrorKind::UnknownFunctionArgument(arg_name)}); + } + Ok(()) + } + } + + extern "C" fn $registry_function_name(registrar: &mut dyn MechFunctionRegistrar) { + registrar.register_mech_function( + hash_str($mech_function_name), Box::new($function_compiler_type{})); + } + + export_mech_function!($export_name, $registry_function_name); + } // end macro pattern +} // end macro trigonometry_rad_vv diff --git a/src/machines/math/src/sin.rs b/src/machines/math/src/sin.rs new file mode 100644 index 0000000..11e5b9a --- /dev/null +++ b/src/machines/math/src/sin.rs @@ -0,0 +1,8 @@ +trigonometry_rad_vv!( + MathSinRadVV, // MechFunction + MathSin, // MechFunctionCompiler + sinf, // libm function call + math_sin_reg, // registry function name + math_sin, // export name + "math/sin", // function name in Mech +); diff --git a/src/machines/math/src/tan.rs b/src/machines/math/src/tan.rs new file mode 100644 index 0000000..8c92cdb --- /dev/null +++ b/src/machines/math/src/tan.rs @@ -0,0 +1,8 @@ +trigonometry_rad_vv!( + MathTanRadVV, // MechFunction + MathTan, // MechFunctionCompiler + tanf, // libm function call + math_tan_reg, // registry function name + math_tan, // export name + "math/tan", // function name in Mech +); diff --git a/src/machines/math/tests/math.mec b/src/machines/math/tests/math.mec new file mode 100644 index 0000000..8402222 --- /dev/null +++ b/src/machines/math/tests/math.mec @@ -0,0 +1,46 @@ +# Math Tests + +## Basic Arithmatic + +Test the following basic build-in arithmetical operations: + +- Addition +- Subtraction +- Multiplication +- Division +- Exponentiation + +The operations need to be tested on all numeric types (quantities, number literals) to show they work, as well as on other types (string, boolean, reference) to show they don't work. + +Test addition + #mech/test += ["Add quantities", 2, 1 + 1] + +Test subtraction + #mech/test += ["Subtract quantities", 0, 1 - 1] + +Test multiplication + #mech/test += ["Multiply quantities", 8, 2 * 4] + +Test division + #mech/test += ["Divide quantities", 2, 4 / 2] + +Test exponentiation + #mech/test += ["Exponentiate quantities", 16, 2 ^ 4] + +## Trigonometry + +These functions come from the standalone math machine. + +Test math/sin() + #mech/test += ["math/sin()", 0, math/sin(angle: 0)] + +Test math/cos() + #mech/test += ["math/cos()", 1, math/cos(angle: 0)] + +## Rounding + +Test math/round() + #mech/test += ["math/round()", 2, math/round(table: 1.51)] + +Test math/floor() + #mech/test += ["math/floor()", 1, math/floor(table: 1.5)] \ No newline at end of file diff --git a/src/wasm/Cargo.toml b/src/wasm/Cargo.toml index 05bebf6..fde82fe 100644 --- a/src/wasm/Cargo.toml +++ b/src/wasm/Cargo.toml @@ -23,8 +23,8 @@ crate-type = ["cdylib", "rlib"] mech-core = {path = "../core"} mech-syntax = {path = "../syntax"} mech-utilities = {path = "../utilities"} -mech-math = {git = "https://gitlab.com/mech-lang/machines/math", branch = "v0.1-beta"} -mech-html = {git = "https://gitlab.com/mech-lang/machines/html", branch = "v0.1-beta"} +mech-math = {path = "../machines/math"} +mech-html = {path = "../machines/html"} hashbrown = "0.13.1" wasm-bindgen = "0.2.83" From b377b850d0e4aeb85a9cebe902fdbd39c6a35691 Mon Sep 17 00:00:00 2001 From: cmontella Date: Tue, 23 May 2023 07:31:29 -0400 Subject: [PATCH 74/84] fix cargo --- src/machines/html/Cargo.toml | 4 ++-- src/machines/math/Cargo.toml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/machines/html/Cargo.toml b/src/machines/html/Cargo.toml index d9647bf..49f8932 100644 --- a/src/machines/html/Cargo.toml +++ b/src/machines/html/Cargo.toml @@ -19,8 +19,8 @@ maintenance = { status = "actively-developed" } crate-type = ["dylib", "rlib"] [dependencies] -mech-core = {git = "https://gitlab.com/mech-lang/core", branch = "v0.1-beta", default-features = false} -mech-utilities = {git = "https://gitlab.com/mech-lang/utilities", branch = "v0.1-beta", default-features = false} +mech-core = {path = "../../core", default-features = false} +mech-utilities = {path = "../../utilities", default-features = false} crossbeam-channel = "0.5.6" lazy_static = "1.4.0" diff --git a/src/machines/math/Cargo.toml b/src/machines/math/Cargo.toml index 0e4ccde..b07558c 100644 --- a/src/machines/math/Cargo.toml +++ b/src/machines/math/Cargo.toml @@ -19,8 +19,8 @@ maintenance = { status = "actively-developed" } crate-type = ["dylib", "rlib"] [dependencies] -mech-core = {path = "../core", default-features = false} -mech-utilities = {path = "../utilities", default-features = false} +mech-core = {path = "../../core", default-features = false} +mech-utilities = {path = "../../utilities", default-features = false} libm = "0.2.6" lazy_static = "1.4.0" \ No newline at end of file From 04def18c81603aa6c36701dd37cf9e6034eece2e Mon Sep 17 00:00:00 2001 From: cmontella Date: Tue, 23 May 2023 07:32:18 -0400 Subject: [PATCH 75/84] fix cargo --- src/machines/http/Cargo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/machines/http/Cargo.toml b/src/machines/http/Cargo.toml index fa577a7..decf05d 100644 --- a/src/machines/http/Cargo.toml +++ b/src/machines/http/Cargo.toml @@ -19,8 +19,8 @@ maintenance = { status = "actively-developed" } crate-type = ["dylib", "rlib"] [dependencies] -mech-core = {git = "https://gitlab.com/mech-lang/core", branch= "v0.1-beta"} -mech-utilities = {git = "https://gitlab.com/mech-lang/utilities", branch= "v0.1-beta"} +mech-core = {path = "../../core", default-features = false} +mech-utilities = {path = "../../utilities", default-features = false} crossbeam-channel = "0.5.6" lazy_static = "1.4.0" From f641a3947d0c0a7463b93491c3c6a72b00b9a357 Mon Sep 17 00:00:00 2001 From: cmontella Date: Tue, 23 May 2023 21:00:17 -0400 Subject: [PATCH 76/84] break types and traits into its own thing --- src/core/src/column.rs | 2 -- src/core/src/core.rs | 2 -- src/core/src/database.rs | 3 --- src/core/src/error.rs | 2 -- src/core/src/lib.rs | 33 ++---------------------- src/core/src/schedule.rs | 3 --- src/core/src/table.rs | 5 ---- src/core/src/types.rs | 54 ++++++++++++++++++++++++++++++++++++++++ 8 files changed, 56 insertions(+), 48 deletions(-) create mode 100644 src/core/src/types.rs diff --git a/src/core/src/column.rs b/src/core/src/column.rs index d94da4e..e017a59 100644 --- a/src/core/src/column.rs +++ b/src/core/src/column.rs @@ -17,8 +17,6 @@ use std::fmt::*; use num_traits::identities::Zero; use std::ops::*; -pub type TableRef = Rc>; - #[derive(Clone, Debug)] pub enum Column { f32(ColumnV), diff --git a/src/core/src/core.rs b/src/core/src/core.rs index 38b1660..f8efcf1 100644 --- a/src/core/src/core.rs +++ b/src/core/src/core.rs @@ -19,8 +19,6 @@ use rand::rngs::OsRng; use rand::RngCore; use ed25519_dalek::PublicKey; -pub type BlockRef = Rc>; - /* The Functions struct serves as a container for managing custom functions implemented as MechFunctionCompiler objects. Stored in a HashMap, these custom functions can be accessed, inserted, and extended during the execution diff --git a/src/core/src/database.rs b/src/core/src/database.rs index d01bd40..cb1c411 100644 --- a/src/core/src/database.rs +++ b/src/core/src/database.rs @@ -26,9 +26,6 @@ impl fmt::Debug for Change { } } -pub type Transaction = Vec; -pub type Register = (TableId,RegisterIndex,RegisterIndex); - #[derive(Clone)] pub struct Database { pub transaction_queue: Vec>, diff --git a/src/core/src/error.rs b/src/core/src/error.rs index 9e73ad2..20d584b 100644 --- a/src/core/src/error.rs +++ b/src/core/src/error.rs @@ -17,8 +17,6 @@ pub struct MechError { pub msg: String, } -pub type ParserErrorReport = Vec; - #[derive(Clone, Debug, Eq, PartialEq, Hash, Serialize, Deserialize)] pub struct ParserErrorContext { pub cause_rng: SourceRange, diff --git a/src/core/src/lib.rs b/src/core/src/lib.rs index 24b9bfc..932369e 100644 --- a/src/core/src/lib.rs +++ b/src/core/src/lib.rs @@ -39,6 +39,7 @@ mod schedule; pub mod nodes; #[cfg(feature = "stdlib")] mod capabilities; +mod types; pub use self::core::Core; pub use self::table::*; @@ -54,28 +55,7 @@ pub use self::schedule::*; pub use self::user_functions::*; #[cfg(feature = "stdlib")] pub use self::capabilities::*; - - -pub type BlockId = u64; -pub type ArgumentName = u64; -pub type Argument = (ArgumentName, TableId, Vec<(TableIndex, TableIndex)>); -pub type Out = (TableId, TableIndex, TableIndex); - - -pub type Arg = ColumnV; -pub type ArgTable = Rc>; -pub type OutTable = Rc>; - -pub trait MechNumArithmetic: Add + - Sub + - Div + - Mul + - Pow + - AddAssign + - SubAssign + - MulAssign + - DivAssign + - Sized {} +pub use self::types::*; #[derive(Debug, Clone)] pub enum SectionElement { @@ -83,15 +63,6 @@ pub enum SectionElement { UserFunction(UserFunction), } -pub trait MechFunctionCompiler { - fn compile(&self, block: &mut Block, arguments: &Vec, out: &Out) -> std::result::Result<(),MechError>; -} - -pub trait MechFunction { - fn solve(&self); - fn to_string(&self) -> String; -} - pub fn resize_one(block: &mut Block, out: &Out) -> std::result::Result<(),MechError> { let (out_table_id,_,_) = out; let out_table = block.get_table(out_table_id)?; diff --git a/src/core/src/schedule.rs b/src/core/src/schedule.rs index 1660ecf..4b34330 100644 --- a/src/core/src/schedule.rs +++ b/src/core/src/schedule.rs @@ -4,12 +4,9 @@ This code defines a scheduling system for blocks in the Mech programming languag */ - use hashbrown::{HashMap, HashSet}; -use crate::core::BlockRef; use crate::*; - /* The Schedule struct is used to manage the scheduling of Blocks in Mech. It contains several maps that relate registers (i.e. specific cells in a Table) to their corresponding Blocks. The Schedule struct also has methods for adding Blocks to the schedule, scheduling those Blocks, and running the scheduled Blocks. The Schedule struct manages the flow of data between Blocks and ensures that Blocks are only executed when their input data is available. Finally, the Schedule struct contains a BlockGraph struct, which is used to represent the graph of Blocks and their dependencies. */ diff --git a/src/core/src/table.rs b/src/core/src/table.rs index 174ecb8..dff2597 100644 --- a/src/core/src/table.rs +++ b/src/core/src/table.rs @@ -106,8 +106,6 @@ The Table struct in Mech represents a data table. A vector of ValueKind to ident The StringDictionary is used to store strings used in the table to reduce memory usage. This struct is essential in the representation and manipulation of tables in Mech. */ -pub type StringDictionary = Rc>>; - pub struct Table { pub id: u64, pub dynamic: bool, @@ -698,9 +696,6 @@ macro_rules! collect_columns { ) } -pub type TableIx = usize; -pub type Alias = u64; - #[derive(Debug, Clone)] pub struct AliasMap { diff --git a/src/core/src/types.rs b/src/core/src/types.rs new file mode 100644 index 0000000..b9bbd10 --- /dev/null +++ b/src/core/src/types.rs @@ -0,0 +1,54 @@ +use crate::*; + +use hashbrown::HashMap; +use std::rc::Rc; +use std::cell::RefCell; + +// Types +// ------- + +pub type TableRef = Rc>; +pub type BlockRef = Rc>; + +pub type Transaction = Vec; +pub type Register = (TableId,RegisterIndex,RegisterIndex); +pub type ParserErrorReport = Vec; + + +pub type BlockId = u64; +pub type ArgumentName = u64; +pub type Argument = (ArgumentName, TableId, Vec<(TableIndex, TableIndex)>); +pub type Out = (TableId, TableIndex, TableIndex); + + +pub type Arg = ColumnV; +pub type ArgTable = Rc>; +pub type OutTable = Rc>; + +pub type StringDictionary = Rc>>; + +pub type TableIx = usize; +pub type Alias = u64; + +// Traits +// ----------- + +pub trait MechNumArithmetic: Add + + Sub + + Div + + Mul + + Pow + + AddAssign + + SubAssign + + MulAssign + + DivAssign + + Sized {} + +pub trait MechFunctionCompiler { + fn compile(&self, block: &mut Block, arguments: &Vec, out: &Out) -> std::result::Result<(),MechError>; +} + +pub trait MechFunction { + fn solve(&self); + fn to_string(&self) -> String; +} \ No newline at end of file From 3d4421964528f2b4ec7592a2f5a7889c6c28a4fa Mon Sep 17 00:00:00 2001 From: cmontella Date: Fri, 6 Oct 2023 17:40:25 -0400 Subject: [PATCH 77/84] remove dead code --- src/syntax/src/parser.rs | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/src/syntax/src/parser.rs b/src/syntax/src/parser.rs index b14f0ee..f3598a0 100644 --- a/src/syntax/src/parser.rs +++ b/src/syntax/src/parser.rs @@ -817,25 +817,6 @@ pub fn whitespace(input: ParseString) -> ParseResult { Ok((input, ParserNode::Null)) } -// pub fn floating_point(input: ParseString) -> ParseResult { -// let (input,_) = period(input)?; -// let (input, chars) = digit1(input)?; -// Ok((input, ParserNode::Null)) -// } - -// pub fn quantity(input: ParseString) -> IResult { -// let (input, number) = number(input)?; -// let (input, float) = opt(floating_point)(input)?; -// let (input, unit) = identifier(input)?; -// let mut quantity = vec![number]; -// match float { -// Some(fp) => quantity.push(fp), -// _ => (), -// }; -// quantity.push(unit); -// Ok((input, ParserNode::Quantity{children: quantity})) -// } - // number_literal ::= (hexadecimal_literal | octal_literal | binary_literal | decimal_literal | float_literal), kind_annotation? ; pub fn number_literal(input: ParseString) -> ParseResult { let (input, number_variant) = alt((hexadecimal_literal, octal_literal, binary_literal, decimal_literal, float_literal))(input)?; From 5cdb63fa03de868b456b89da860cd9025236b7d3 Mon Sep 17 00:00:00 2001 From: cmontella Date: Fri, 6 Oct 2023 17:41:23 -0400 Subject: [PATCH 78/84] drain_filter -> extract_if --- src/bin/mech.rs | 2 +- src/core/src/lib.rs | 2 +- src/core/src/schedule.rs | 2 +- src/machines/html/index.mec | 2 +- src/program/src/lib.rs | 4 ++-- src/syntax/src/compiler.rs | 2 +- src/syntax/src/lib.rs | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/bin/mech.rs b/src/bin/mech.rs index 08cf0fa..8bc1766 100644 --- a/src/bin/mech.rs +++ b/src/bin/mech.rs @@ -1,4 +1,4 @@ -#![feature(hash_drain_filter)] +#![feature(hash_extract_if)] #![allow(warnings)] // # Mech diff --git a/src/core/src/lib.rs b/src/core/src/lib.rs index 932369e..956db8b 100644 --- a/src/core/src/lib.rs +++ b/src/core/src/lib.rs @@ -2,7 +2,7 @@ #![feature(concat_idents)] #![allow(warnings)] #![feature(iter_intersperse)] -#![feature(drain_filter)] +#![feature(extract_if)] extern crate core as rust_core; extern crate hashbrown; diff --git a/src/core/src/schedule.rs b/src/core/src/schedule.rs index 4b34330..dd08af7 100644 --- a/src/core/src/schedule.rs +++ b/src/core/src/schedule.rs @@ -46,7 +46,7 @@ impl Schedule { if self.unscheduled_blocks.len() == 0 { return Ok(()) } - let ready_blocks: Vec = self.unscheduled_blocks.drain_filter(|b| b.borrow().state == BlockState::Ready).collect(); + let ready_blocks: Vec = self.unscheduled_blocks.extract_if(|b| b.borrow().state == BlockState::Ready).collect(); for block_ref in &ready_blocks { let mut graph = BlockGraph::new(block_ref.clone()); diff --git a/src/machines/html/index.mec b/src/machines/html/index.mec index 6f280d8..df02c64 100644 --- a/src/machines/html/index.mec +++ b/src/machines/html/index.mec @@ -73,7 +73,7 @@ E. Location #html/machine = [ name: "html" - version: "v0.1" + version: "v0.2" authors: "Corey Montella" url: "https://gitlab.com/mech-lang/machines/html" license: "Apache-2.0"] \ No newline at end of file diff --git a/src/program/src/lib.rs b/src/program/src/lib.rs index bcbb305..059284e 100644 --- a/src/program/src/lib.rs +++ b/src/program/src/lib.rs @@ -5,7 +5,7 @@ // ## Prelude #![feature(extern_prelude)] #![feature(get_mut_unchecked)] -#![feature(hash_drain_filter)] +#![feature(hash_extract_if)] extern crate core; @@ -90,7 +90,7 @@ pub fn start_maestro(mech_socket_address: String, formatted_address: String, mae let now = SystemTime::now(); let mut core_map = CORE_MAP.lock().unwrap(); // If a core hasn't been heard from since 1 second ago, disconnect it. - for (_, (remote_core_address, _)) in core_map.drain_filter(|_k,(_, last_seen)| now.duration_since(*last_seen).unwrap().as_secs_f32() > 1.0) { + for (_, (remote_core_address, _)) in core_map.extract_if(|_k,(_, last_seen)| now.duration_since(*last_seen).unwrap().as_secs_f32() > 1.0) { mech_client_channel_heartbeat.send(RunLoopMessage::RemoteCoreDisconnect(hash_str(&remote_core_address.to_string()))); } } diff --git a/src/syntax/src/compiler.rs b/src/syntax/src/compiler.rs index 54ebd31..201fe2f 100644 --- a/src/syntax/src/compiler.rs +++ b/src/syntax/src/compiler.rs @@ -569,7 +569,7 @@ impl Compiler { }, _ => (), } - let mut string_identifiers = result.drain_filter(|x| if let Transformation::Identifier{..} = x {true} else {false}).collect::>(); + let mut string_identifiers = result.extract_if(|x| if let Transformation::Identifier{..} = x {true} else {false}).collect::>(); identifiers.append(&mut string_identifiers); arg_tfms.append(&mut result); } diff --git a/src/syntax/src/lib.rs b/src/syntax/src/lib.rs index f9e16c5..aea7da7 100644 --- a/src/syntax/src/lib.rs +++ b/src/syntax/src/lib.rs @@ -2,7 +2,7 @@ #![cfg_attr(feature = "no-std", no_std)] #![cfg_attr(feature = "no-std", alloc)] -#![feature(drain_filter)] +#![feature(extract_if)] #![feature(get_mut_unchecked)] #![allow(dead_code)] #![allow(warnings)] From d2ed5c4af1cf5076bdad8e5dbb428746f13d6bf9 Mon Sep 17 00:00:00 2001 From: cmontella Date: Fri, 6 Oct 2023 17:46:07 -0400 Subject: [PATCH 79/84] remove more instances of drain_filter --- src/lib.rs | 1 - src/machines/html/src/lib.rs | 1 - src/wasm/src/lib.rs | 1 - 3 files changed, 3 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 8c1a005..a3bb295 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,5 +1,4 @@ #![allow(warnings)] -#![feature(hash_drain_filter)] // # Mech // ## Prelude diff --git a/src/machines/html/src/lib.rs b/src/machines/html/src/lib.rs index 0b41188..a38a952 100644 --- a/src/machines/html/src/lib.rs +++ b/src/machines/html/src/lib.rs @@ -1,6 +1,5 @@ #![recursion_limit="256"] #![feature(alloc)] -#![feature(drain_filter)] #![feature(get_mut_unchecked)] #![allow(warnings)] extern crate wasm_bindgen; diff --git a/src/wasm/src/lib.rs b/src/wasm/src/lib.rs index e6f296e..d608970 100644 --- a/src/wasm/src/lib.rs +++ b/src/wasm/src/lib.rs @@ -1,6 +1,5 @@ #![recursion_limit="256"] #![feature(alloc)] -#![feature(drain_filter)] #![feature(get_mut_unchecked)] #![allow(warnings)] extern crate wasm_bindgen; From e6664e9d857b17a0f2d344fc94b92ac27b11698f Mon Sep 17 00:00:00 2001 From: cmontella Date: Fri, 6 Oct 2023 17:46:29 -0400 Subject: [PATCH 80/84] upgrade rust version --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7d7536d..4538e97 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,6 +1,6 @@ test:cargo: script: - rustup show - - rustup default nightly-2023-05-19 + - rustup default nightly-2023-08-25 - wasm-pack build wasm-notebook --target web - cargo build --bin mech --release \ No newline at end of file From cf1a01f0f5ab2f68c92df84aed96579fcd1e5353 Mon Sep 17 00:00:00 2001 From: cmontella Date: Fri, 6 Oct 2023 18:11:18 -0400 Subject: [PATCH 81/84] Add in syntax tests --- .gitlab-ci.yml | 3 ++- src/program/tests/program.rs | 4 ++-- src/wasm/tests/web.rs | 13 ------------- 3 files changed, 4 insertions(+), 16 deletions(-) delete mode 100644 src/wasm/tests/web.rs diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4538e97..59dfc18 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -3,4 +3,5 @@ test:cargo: - rustup show - rustup default nightly-2023-08-25 - wasm-pack build wasm-notebook --target web - - cargo build --bin mech --release \ No newline at end of file + - cargo build --bin mech --release + - cargo test --package mech-syntax --release \ No newline at end of file diff --git a/src/program/tests/program.rs b/src/program/tests/program.rs index 05c4c03..6b8ea25 100644 --- a/src/program/tests/program.rs +++ b/src/program/tests/program.rs @@ -4,7 +4,7 @@ extern crate mech_core; use mech_program::*; use mech_utilities::*; use mech_core::*; - +/* #[test] fn program_test() { let mut runner = ProgramRunner::new("test"); @@ -29,4 +29,4 @@ fn load_module_with_program() { message => (), } } -} \ No newline at end of file +}*/ \ No newline at end of file diff --git a/src/wasm/tests/web.rs b/src/wasm/tests/web.rs deleted file mode 100644 index de5c1da..0000000 --- a/src/wasm/tests/web.rs +++ /dev/null @@ -1,13 +0,0 @@ -//! Test suite for the Web and headless browsers. - -#![cfg(target_arch = "wasm32")] - -extern crate wasm_bindgen_test; -use wasm_bindgen_test::*; - -wasm_bindgen_test_configure!(run_in_browser); - -#[wasm_bindgen_test] -fn pass() { - assert_eq!(1 + 1, 2); -} From bc3f9f3bd1b9cac8df0e9bbc7564228c2d71ea04 Mon Sep 17 00:00:00 2001 From: cmontella Date: Fri, 6 Oct 2023 21:44:26 -0400 Subject: [PATCH 82/84] bump version number --- src/bin/mech.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/mech.rs b/src/bin/mech.rs index 8bc1766..cfec844 100644 --- a/src/bin/mech.rs +++ b/src/bin/mech.rs @@ -106,7 +106,7 @@ async fn main() -> Result<(), MechError> { #[cfg(windows)] control::set_virtual_terminal(true).unwrap(); - let version = "0.1.0"; + let version = "0.2.0"; let matches = App::new("Mech") .version(version) .author("Corey Montella corey@mech-lang.org") From cbad07b357490bfdab07c07e21c1a330cf6cd3a6 Mon Sep 17 00:00:00 2001 From: cmontella Date: Fri, 6 Oct 2023 21:45:00 -0400 Subject: [PATCH 83/84] patch wasm clients for now to get around RNG issues on wasm --- src/core/Cargo.toml | 4 +++- src/core/src/core.rs | 35 ++++++++++++++++++++++------------- src/core/src/lib.rs | 1 + src/wasm/Cargo.toml | 6 ++++++ 4 files changed, 32 insertions(+), 14 deletions(-) diff --git a/src/core/Cargo.toml b/src/core/Cargo.toml index 7c09b85..af60604 100644 --- a/src/core/Cargo.toml +++ b/src/core/Cargo.toml @@ -18,7 +18,7 @@ maintenance = { status = "actively-developed" } [features] default = ["stdlib", "parallel"] -stdlib = ["time", "rand", "ed25519-dalek"] +stdlib = ["time", "rand", "rand_core", "ed25519-dalek", "getrandom"] parallel = ["rayon"] no-std = ["rlibc"] @@ -33,7 +33,9 @@ indexmap = "1.9.2" rayon = {version = "1.6.1", optional = true} time = {version = "0.3.17", optional = true} ed25519-dalek = {version = "1.0.1", optional = true} +getrandom = { version = "0.2.9", features = ["js"], optional = true} rand = {version = "0.7", optional = true} +rand_core = {version = "0.5", optional = true} [dependencies.num-traits] version = "0.2.15" diff --git a/src/core/src/core.rs b/src/core/src/core.rs index f8efcf1..62ce5d0 100644 --- a/src/core/src/core.rs +++ b/src/core/src/core.rs @@ -16,6 +16,7 @@ use hashbrown::{HashMap, HashSet}; use std::rc::Rc; use std::cell::RefCell; use rand::rngs::OsRng; +use getrandom::getrandom; use rand::RngCore; use ed25519_dalek::PublicKey; @@ -71,7 +72,7 @@ program, making it useful for large and complex programs. pub struct Core { pub id: u64, - pub public_key: PublicKey, + pub public_key: Option, pub sections: Vec>, pub blocks: HashMap, pub unsatisfied_blocks: HashMap, @@ -152,21 +153,29 @@ impl Core { functions.insert(*SET_CARTESIAN, Box::new(SetCartesian{})); } - let mut key = [0u8; 16]; - OsRng.fill_bytes(&mut key); - let core_id = OsRng.next_u64(); - let name = format!("core-{:?}",core_id); - let mut default_caps = HashSet::new(); - default_caps.insert(Capability::CoreDatabaseRead); - default_caps.insert(Capability::CoreDatabaseWrite); + let mut core_id = 0; + let mut public_key = None; + let mut capabilities = vec![]; - let mut core_cap_token = CapabilityToken::new(name,default_caps,core_id,None); - let keypair = generate_keypair(); - core_cap_token.sign(&keypair); + #[cfg(not(target_arch = "wasm32"))] + { + let mut key = [0u8; 8]; + OsRng.fill_bytes(&mut key); + core_id = OsRng.next_u64(); + let name = format!("core-{:?}",core_id); + let mut default_caps = HashSet::new(); + default_caps.insert(Capability::CoreDatabaseRead); + default_caps.insert(Capability::CoreDatabaseWrite); + let mut core_cap_token = CapabilityToken::new(name,default_caps,core_id,None); + let keypair = generate_keypair(); + core_cap_token.sign(&keypair); + public_key = Some(keypair.public); + capabilities.push(core_cap_token); + } Core { id: core_id, - public_key: keypair.public, + public_key, sections: Vec::new(), blocks: HashMap::new(), unsatisfied_blocks: HashMap::new(), @@ -181,7 +190,7 @@ impl Core { output: HashSet::new(), defined_tables: HashSet::new(), dictionary: dictionary, - capabilities: vec![core_cap_token], + capabilities, } } diff --git a/src/core/src/lib.rs b/src/core/src/lib.rs index 956db8b..784e24a 100644 --- a/src/core/src/lib.rs +++ b/src/core/src/lib.rs @@ -12,6 +12,7 @@ extern crate serde; extern crate num_traits; extern crate ed25519_dalek; extern crate rand; +extern crate getrandom; #[macro_use] extern crate lazy_static; diff --git a/src/wasm/Cargo.toml b/src/wasm/Cargo.toml index fde82fe..9550482 100644 --- a/src/wasm/Cargo.toml +++ b/src/wasm/Cargo.toml @@ -34,6 +34,11 @@ lazy_static = "1.4.0" miniz_oxide = "0.6.2" base64 = "0.20.0" +ed25519-dalek = {version = "1.0.1"} +getrandom = { version = "0.2.9", features = ["js"]} +rand = {version = "0.7"} +rand_core = {version = "0.5"} + [dev-dependencies] wasm-bindgen-test = "0.3.33" @@ -70,4 +75,5 @@ features = [ 'Location', 'console', 'XmlHttpRequest', + 'Crypto', ] \ No newline at end of file From 36172356c417c195436b858ee4ccbe764512f2bc Mon Sep 17 00:00:00 2001 From: cmontella Date: Sat, 7 Oct 2023 00:02:27 -0400 Subject: [PATCH 84/84] Get capabilities working for wasm --- src/core/Cargo.toml | 18 +++++++++- src/core/src/capabilities.rs | 67 ++++++++++++++++++++++++++++++++++-- src/core/src/core.rs | 50 ++++++++++++++------------- src/wasm/Cargo.toml | 7 +--- src/wasm/src/lib.rs | 1 + wasm-notebook/Cargo.toml | 2 +- 6 files changed, 112 insertions(+), 33 deletions(-) diff --git a/src/core/Cargo.toml b/src/core/Cargo.toml index af60604..1d6892f 100644 --- a/src/core/Cargo.toml +++ b/src/core/Cargo.toml @@ -18,9 +18,11 @@ maintenance = { status = "actively-developed" } [features] default = ["stdlib", "parallel"] -stdlib = ["time", "rand", "rand_core", "ed25519-dalek", "getrandom"] +stdlib = ["time", "crypto"] parallel = ["rayon"] no-std = ["rlibc"] +crypto = ["rand", "rand_core", "ed25519-dalek", "getrandom",] +wasm = ["crypto", "web-sys", "wasm-bindgen"] [dependencies] hashbrown = "0.13.1" @@ -36,6 +38,20 @@ ed25519-dalek = {version = "1.0.1", optional = true} getrandom = { version = "0.2.9", features = ["js"], optional = true} rand = {version = "0.7", optional = true} rand_core = {version = "0.5", optional = true} +wasm-bindgen = {version = "0.2.82", optional = true} + +[dependencies.web-sys] +version = "0.3.61" +features = [ + 'Document', + 'Element', + 'HtmlElement', + 'Node', + 'Window', + 'Crypto', + 'console' +] +optional = true [dependencies.num-traits] version = "0.2.15" diff --git a/src/core/src/capabilities.rs b/src/core/src/capabilities.rs index 283fab3..f6034d8 100644 --- a/src/core/src/capabilities.rs +++ b/src/core/src/capabilities.rs @@ -12,6 +12,15 @@ use crate::hash_str; use hashbrown::HashSet; use crate::*; +#[cfg(feature = "wasm")] +use web_sys; +#[cfg(feature = "wasm")] +use wasm_bindgen::prelude::*; +#[cfg(feature = "wasm")] +use wasm_bindgen::JsValue; +#[cfg(feature = "wasm")] +use web_sys::{Crypto, Window,console}; + #[derive(Debug, Clone, Eq, PartialEq, Hash, Serialize, Deserialize)] pub enum Capability { PinCPUCore(u64) , // Pin Mech program to a particular CPU core @@ -137,15 +146,69 @@ impl fmt::Debug for CapabilityToken { } // Generate a new id for creating unique owner ids +#[cfg(not(feature = "wasm"))] pub fn generate_uuid() -> u64 { - let mut key = [0u8; 16]; - OsRng.fill_bytes(&mut key); OsRng.next_u64() } +#[cfg(feature = "wasm")] +pub fn generate_uuid() -> u64 { + let mut rng = WebCryptoRng{}; + rng.next_u64() +} // Generate a new keypair for signing and verifying tokens +#[cfg(not(feature = "wasm"))] pub fn generate_keypair() -> Keypair { let mut csprng = OsRng{}; Keypair::generate(&mut csprng) +} + +#[cfg(feature = "wasm")] +pub fn generate_keypair() -> Keypair { + let window = web_sys::window(); + let mut csprng = WebCryptoRng{}; + Keypair::generate(&mut csprng) +} + +// This is to handle RNG on wasm + +#[cfg(feature = "wasm")] +pub fn pubkey_from_bytes(pubkey: Vec) -> Vec { + PublicKey::from_bytes(pubkey.as_slice()).unwrap().as_bytes().to_vec() +} + +#[cfg(feature = "wasm")] +struct WebCryptoRng{} + +#[cfg(feature = "wasm")] +impl rand_core::CryptoRng for WebCryptoRng{} + +#[cfg(feature = "wasm")] +impl rand_core::RngCore for WebCryptoRng { + + fn next_u32(&mut self) -> u32{ + let mut buf:[u8;4] = [0u8;4]; + self.fill_bytes(&mut buf); + u32::from_le_bytes(buf) + } + + fn next_u64(&mut self) -> u64{ + let mut buf:[u8;8] = [0u8;8]; + self.fill_bytes(&mut buf); + u64::from_le_bytes(buf) + } + + fn fill_bytes(&mut self, dest: &mut [u8]){ + let window = web_sys::window().unwrap(); + let crypto = window.crypto().unwrap(); + crypto.get_random_values_with_u8_array(dest); + } + + fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), rand::Error>{ + let window = web_sys::window().unwrap(); + let crypto = window.crypto().unwrap(); + crypto.get_random_values_with_u8_array(dest).unwrap(); + Ok(()) + } } \ No newline at end of file diff --git a/src/core/src/core.rs b/src/core/src/core.rs index 62ce5d0..719d9f3 100644 --- a/src/core/src/core.rs +++ b/src/core/src/core.rs @@ -15,10 +15,24 @@ use crate::capabilities::*; use hashbrown::{HashMap, HashSet}; use std::rc::Rc; use std::cell::RefCell; + +#[cfg(feature = "crypto")] use rand::rngs::OsRng; +#[cfg(feature = "crypto")] use getrandom::getrandom; +#[cfg(feature = "crypto")] use rand::RngCore; -use ed25519_dalek::PublicKey; +#[cfg(feature = "crypto")] +use ed25519_dalek::{self, Keypair, PublicKey, SecretKey, Signature, Signer, Verifier}; +#[cfg(feature = "crypto")] +use rand::Error; +#[cfg(feature = "wasm")] +use wasm_bindgen::prelude::*; +#[cfg(feature = "wasm")] +use wasm_bindgen::JsValue; +#[cfg(feature = "wasm")] +use web_sys::{Crypto, Window,console}; + /* The Functions struct serves as a container for managing custom functions implemented as MechFunctionCompiler @@ -72,7 +86,7 @@ program, making it useful for large and complex programs. pub struct Core { pub id: u64, - pub public_key: Option, + pub public_key: PublicKey, pub sections: Vec>, pub blocks: HashMap, pub unsatisfied_blocks: HashMap, @@ -153,26 +167,16 @@ impl Core { functions.insert(*SET_CARTESIAN, Box::new(SetCartesian{})); } - let mut core_id = 0; - let mut public_key = None; - let mut capabilities = vec![]; - - #[cfg(not(target_arch = "wasm32"))] - { - let mut key = [0u8; 8]; - OsRng.fill_bytes(&mut key); - core_id = OsRng.next_u64(); - let name = format!("core-{:?}",core_id); - let mut default_caps = HashSet::new(); - default_caps.insert(Capability::CoreDatabaseRead); - default_caps.insert(Capability::CoreDatabaseWrite); - let mut core_cap_token = CapabilityToken::new(name,default_caps,core_id,None); - let keypair = generate_keypair(); - core_cap_token.sign(&keypair); - public_key = Some(keypair.public); - capabilities.push(core_cap_token); - } - + let core_id = generate_uuid(); + let name = format!("core-{:?}",core_id); + let mut default_caps = HashSet::new(); + default_caps.insert(Capability::CoreDatabaseRead); + default_caps.insert(Capability::CoreDatabaseWrite); + let mut core_cap_token = CapabilityToken::new(name,default_caps,core_id,None); + let keypair = generate_keypair(); + core_cap_token.sign(&keypair); + let public_key = keypair.public; + Core { id: core_id, public_key, @@ -190,7 +194,7 @@ impl Core { output: HashSet::new(), defined_tables: HashSet::new(), dictionary: dictionary, - capabilities, + capabilities: vec![core_cap_token], } } diff --git a/src/wasm/Cargo.toml b/src/wasm/Cargo.toml index 9550482..0879183 100644 --- a/src/wasm/Cargo.toml +++ b/src/wasm/Cargo.toml @@ -20,7 +20,7 @@ maintenance = { status = "actively-developed" } crate-type = ["cdylib", "rlib"] [dependencies] -mech-core = {path = "../core"} +mech-core = {path = "../core", features = ["wasm"]} mech-syntax = {path = "../syntax"} mech-utilities = {path = "../utilities"} mech-math = {path = "../machines/math"} @@ -34,11 +34,6 @@ lazy_static = "1.4.0" miniz_oxide = "0.6.2" base64 = "0.20.0" -ed25519-dalek = {version = "1.0.1"} -getrandom = { version = "0.2.9", features = ["js"]} -rand = {version = "0.7"} -rand_core = {version = "0.5"} - [dev-dependencies] wasm-bindgen-test = "0.3.33" diff --git a/src/wasm/src/lib.rs b/src/wasm/src/lib.rs index d608970..11020e2 100644 --- a/src/wasm/src/lib.rs +++ b/src/wasm/src/lib.rs @@ -87,6 +87,7 @@ impl WasmCore { pub fn new(capacity: usize, recursion_limit: u64) -> WasmCore { let mut mech = mech_core::Core::new(); + log!("{:?}", mech.id); mech.load_function("math/sin",Box::new(MathSin{})); mech.load_function("math/cos",Box::new(MathCos{})); diff --git a/wasm-notebook/Cargo.toml b/wasm-notebook/Cargo.toml index f9562ca..4273a86 100644 --- a/wasm-notebook/Cargo.toml +++ b/wasm-notebook/Cargo.toml @@ -16,6 +16,6 @@ edition = "2021" crate-type = ["cdylib", "rlib"] [dependencies] -mech-wasm = {git = "https://gitlab.com/mech-lang/wasm", branch = "v0.1-beta"} +mech-wasm = {path = "../src/wasm"} wasm-bindgen = "0.2.83"

    CZfLKWRk|KE^tsbl zj=j5g9DeWoz%+}#y1gFXid}h|>w45T0Qa92cME8OC?ryXMj3S+Fm&$-p&#o;7|{YP z7;H)O3qVz$R1|*W(l1B9k}x9X0nvw4?TT`b51d%-7$9}c4COWHGU~l~UHJzW^A|IW zt&xlJEpA<2RlV2FYW!!eayy*PlKHlMS1{@P8=lpzW~VoDAFHds?y8oK zkB!xW?M^Iixvu!`T-(Uzst&B96+ECA>o5vWAq@LGG#GPS4AFa3D}s8@!v%)PLCzu} zi|anx(5YFm579=ccs3>PGdG@V?`ZFOJN(3UB(PzkXFK2fMPKQfpUn_ZY+ zVKf`!^eok6Y>C{)w|8=sJ@?Alb3Kmk^!n?sW(H-CX+C+%e9W3n!arr#pvE=W0*cy- zC=W$lN5sYg>7jgM-4_7j9%zCT6fo_NN8T}h=^&v(XHiz58i*Bo#hr>R9o#V7Ja+kx z9hdJg8MB>{+nK-f%vF=4_iz*BFPW9*Jhri+1N>L*i;QSkj#IijC^p8(ZL8oD2;e$S z%BzY^oFnCSrxtBGSl{3}!DP75LS`XYH&A>{Or*YUp|)?!gX|Xxk2MukL@u-1#_3CI zwrpS@pPQ2>w~Wo#wE=HbAKVW)Dwn*Lzzg^8+Hp3hiaW)egMD2z5Q=&(zzLxU8L*VO z$;gNOL_WNd?<_3+xo*B&ab_l)`)d;97SChqJQ9_d;d@fTk;Fmkkcp|@?Q zX}L>!How51lT%(&RzBU(P}|zkSW;HGsj+uDHm;{0rFeldOfFKLic7wHE zdTQ%Q=9YiTmVf)w+1q>7W1!W(_n!O}!iU6TP{%Nj6wCx&36c|F4#8KWB!qWIVWLq` z;!&`SS2ck512tmEA&?4RZK^4iLPb(EDaZu^Yet}t7L=uQ8>G8Prx9W!6r|T~whRX2J`ZKl zs?;Y<$S+jwIC|n>{azHhNqFkqxxKcUrrOe?$w?8JRCCI|P(JyC$ycQ)e^XNv&ZFA1 zkaz#ZzY)~H=PdC)N=yR-o8s3&tPmBJO+o`)cy@^MffQkI6Ff#SbMbr`*wzrPuXuH! z$Wq!W(wSj3XG{NfhWoGv_qq?ZUb|z!b1S=8}77lYg}gTvsl;bs`xAd)W|&-+Sc*b){0#6T=?wP z#laAgWU1Z?_Ko2d`HuccZ*zQnC)?4UC4W|$d*$YH0qPXK43i?W*)@ayJ}Y(`cGVD{ zF?@1RR%79FiH4m%I)b+^r^JV~OR#I`5`)YH&kOnK*7%Nto)4^> z#$8Et8}a-D>InnSyB@tSs8JIPpCG_U1e!qd(tvfN;1S6IB&Kh}VPBOXCK|gqadzxF zP6N2~QDH(o=7y*$a3CCW3I~(Q%L;o3Yb)w_chO&)#|QnE4^B?8k8H@gd}9hV8QpVz z)D274=F{>!q~q|uOA>-8L_a3z5${MD$jPI*ZP-oIW%au{_8xak4mNb< z7TEi%iz=;A=F##Le`UF+Bcri~{h@AO-`FMfcYOH32j?^OIhh0L4t)xW2<8{b)BT$# z`w-_k1Dhrs>>4Q>>qvq%#Y(y3kluNmY7%G`cD-;7)xnD(^T1+=^d?hsvdL=7$+jeC zBpbbUhz!V#CXvA*Ow5q8+^GE|ghE;bknfYSuUh=!()6|?<<<9i=1P5)=mm0c>m*A( zG&mr|>APDBYLY$^b)&=Mw#%n&#UuZO?Y#x_OhbNqq{ie=$1TG{+*LOKJReHt4q_-! zD~p{k$;o z16*B&%XQT_>cFnaLA-A_zP-%SrH|Y=Bllp&h(YCgEaep%$zzw60Qs6~K;V^uR7A`F zFcr}!xu;X)ucS=7(Y7NxfoA%qz z#6dn5Zk0f!k1?b#2=4MqlIj&vhs!uz*#F=61#!U!@DM&LML86kf#?^ag$R2uAGgss z_K#vj2Y_7zowgKI3C7I?4jP)nXz7iMg^Z+xJn(#6&P(Y^Mf_j|?2c4$g9nC+sv8ai zV}+ZRjvm}ORWwnwVcWr@OPdScew$g|{V{&ME5G^n+w|>xob?2p85hO1sMfelT<#RR z&g0b)D?pY=#CPM?518kGQA7zXz;b}NdZuyO>84LhO+?1H#>EgEq|aw`Qpf?~5$+JZ zNNQ9K=9~*Ss#tnS)jsd2qbzT^e$(X#8%C~QzH!!?7Rn!{4io!5)&0T#6bZ8w<{$7^l4z z;||(F(BcTrMGN35e-Y8OtMeB{VM(OxAwVHo+5}gFF!!n9Y9#I=sLSlft%Zk?h^1Cx zA!kKe)J#WIG*P7A+;W{f z$10l?xqM$tY)(y8NtVqRlZ>hiPw%_zL|ay8TJer8-xBY)<71V0f4T;>c=T~mh%um5 zQAr-naoP`y8tIdkYBVZBzlYpgkX^M7vIpSEQ2`ODa(fC;v0;82E}8gkt}|PvuYI$= zsmLTh!Uj#{4K;5d#_tnsR(w~b*LaP`k6r{=Dq@=`*Np0z2%#Q;YEUv^5r>gSWg7dqk{w)qD>{g1}8D9UE-_VLSOqC$H;wLV)_f!8i zi5i`)(XM%gEb zyGwz1iSH1#3FQ#`zxF#!#1d6VuEfWdzaXVd;=bCXYA{?Z?Zr4L)y4x-wXR7 zUf_s!v8O;MUi?@Ie_tRMlwO9Tv{B3!zlWaARk@%g=l{C(z=i`#(J#D^zm(6@i+Q5X zIqoSs_prl_@LW)w`uCj+TH?oiZS;Yyff*|wpt@{Z_&pd;_@?)ZTu_kq`^yDoEB8*P z+_Ucmnmckq1v)^R%fLrA<{c+?GBg(y?_QM)s*6usCl}P9O3c3;Kf3SoP5-hyS6)@# z#P)2M-Z&$ryz|YX>hcnNCllYv=Xe)&K*+!lngz)hqUM4oBqZn)PzNN{VI>a9d}TsR zhg~%AIn7GtpO5c<=uvjpFxnr^WOM_eZl6rYO> z=7A<9#lN;=FeDmYA#0w)Dsx zE;v)JNz7~g zyid&K0(qYfE6@83>;$>w4RmFxXkmvFURvI^@6h7np)HBkzS1f-aNp!GL$_8b<+ZY5r8EZBF{Op%Weo#>v_AQo9lT|eg&SKq3fPjpIx-#88CefU#F zOkgnI2zn{89B$nFN?%!1TYZ1*uYMIZ(CBKimO3|=9YtHxK`FbTEx)I0aH!vq-j;3s z;BmC VRC)cY!f=7xyONW|1%EZ-AzQ-nX^>qUwS%p&XMdqRHmxnUEbQXe;;xcX?t zf~!2+@4hPWS8pU<(NpIe+((t^PuyY4X*C+|9=tWbwGp`6js2sZHMhNHpbOHFp}oW{NKrVNIk10&BFwzDTZFqgnKv*^m&oIOAth8Dy8ttxKz_Uw!spT zcZs!!0{cVrF2mqdL%t%vP~Ig^i_6w!nT(heSALu#?^4Jy9z{xmuCYp-d2@DVerhVJ zesQrrdU~SJW-BbR+6$!YTh5%m^~8S2X0Pl$GBUGs+uYpt?MQ~Dwc`$8f5I6c&VVR2 z*gO$^31>F88~Ib@EJa{Qh=fQr#squ7k0fAfWH~^52x(=)aPBjz-Z1v3y{TGJLlEKOIpUKNF!cB?~CG)-vf6zG4a~U0Yw2~RLF7+VhOVdTg zW|8?q1+dX44CKV)RG{iBp|QX-(p#uTS|(hpfFPf5_(OQT;EE_l^G@=5=_qDYsA({+ zLuI3GO(Ds;=qC2!J@@2Hp#7Prhj(vqd8l~<8j49D>%YoHjnFqWP*jx=rqK^WN$%EP8 z45jhE*$`a9b27OZ)~VV)LJkl$X9nv*$upjn$-bXwD9`S7Z`>DCvweGA{NB02CSQ79 zW?5y-=N{G8m2~LRYO}2;m+3Gq9j~cNP3`R+9HjtLNdwa$?64%Ct&@+r4Ri`)(S`Fd zX-?d>A@VW5*WsHiYv1+lYriEwbXCjO@QY3l(?5w%;ag<*ox`^-mWyfmhq;*QH&N}4 z-(gka+bb20ft-rDn(57(mwQfrSpMUp@2mV5WF;AsNc%jWLki~5&F|0mm4gY{5~3wZ z!57ZKR3{XYgZYbHo4fpr{?0AC#tyT44nMtVffdL<`Z<2Ff=^dhfBHio`VjB|L!Y!8 zbD{jpet(aWe`yNMzoZtDA_3E~CIK@8X%`up8NAY8ND^ie3{G&2sIyYhq~?c8sk8I7 zj#+2j#D=ze|%Rxp;9`RcA za@N9dg_s1G#Sx0zm6r?ENEj^Ps|m@zv`Brp(~Hx1ybKES!#^X@HC`n$^a7cdJUR^0 z5sb~oX!g;<>$ZY%1V7sj!T4O$Lg(SM^4YjCr3Ws)78_T5}TZwl$xD_8G)xcq2Ez|FG+fx|6A3?C5aB2sFyn^ zHNiCp8v|MMkSq^HNcGKb2M~@nx18u4PNmA04h4FY67^BhT1WnoW7|_}%B{KPgp`!D z=o_yFxec(L&6OzwQ97gCO7kGyYY?G3c7}PtT9+c(>CY7z^IHJFiic0prMcZ7hn#QR zWC)>9dUsIcDHKOUr!`E3GL@lmsyUNNh=nkP5FA~_j&LYH+D~)769C|RN4yIcC!@?t zq*i7^zRz@JI<46TJvDa3oY2;hQY&fC6fHJ1of2WwikpDE1pR|U1H=6TL#Nx?lJX|z zYHDXDQ}@p7%g%PW@L%EwPMs43Xc5P}ibU`WseE!|VT?tILuy^k~{fDVzKagRH z_zSw%p@Xf>tyK4dtBc}VqzZ#-G6j-1?DBg@k1oRzd5S%8dhm@m24S*n z9P;j1;N$xTd6nWr0YOl>x6uiPLIVPMm0YR`2`vUU20tQqDd>ZJW@NIzts+0&Y^ZlR zTs4+uHk16btifWoVXXgmBa`0N_}H%B7kJ%{FH0%o57;2lV4kVaLFX~gf1Fpz)l%** zxL{tTdj3Pr&XTjPH`O&;Fi|+Oba4052n^5T+jc`)eH*`2%d^;veB@J--ML!x&;Fc3 z)FLfFPGtt`llE=^Zw%>L$*a_h09@cBE8w^rTjjGY^;}~85)!+s`G{0yQPFZ z8&+p%9vcl>x97ub-{X_9VfmRYs(mI5%Yf<$0O$2ml}xJ8ls~k3}tlhr^N)4I3sg5!3@g zKw%`s$5CFUh>#Ob3T_RCf*!C4<7PL^?aeL8IJW%3PhECnMhVJy|LEYsAHg>K){!G` z2|6M9p$;}QJykqGx1NYD#Me+%9wlZ*0}0U(ZDV2r)>?d0WM;+&uPKUERJ!5fV|e-Sug0!X-Vf8m5BR&gv1cR?T`11|BD)o|1G7KCbT!6J!PqHb z4aU5?Fz*d`_XTn=Exg5`NSa-ngBf_cv?1yE@&n7u4{!sj@^Wkj(+p$o?Rfusd5x>* z9W=Hnd5!EZ1DG+He=%WU0T%n40p3aWh8&8I$U;u19%nn4lfEXW)3R=C0cV~NYXdo* zq1;onNCfkw|4~}Hl-xDm-CB{S%TBMim~*W=PwiwAc@1pCV2eC7fq;m(b{1{5XZ;8J zf{gXP;sTAABmc4l{K}~*CQTom5gA27xRHMu4G9kUm!d>qSpFrr5klz{EjHJsceuPt z{v{7N&arO(O%XmCb2Qc~-m2hJ74G&SfIj z;ug6tTFGre&SgAI_sFrP2=xo3Tsn|)>Bw_)#%PRweGI}4apF6nYa)69Vz`9B zT4M#JPWrTlKfQ3-b=Mz!;U{lO5%L22==s0Dj5(=4&ovt4X2NnuzMD?`M(hEKpoXFR zp6a0B*_mKU+*HYvGou5^nfZ?lEbd(#cm!X8;8NZ9jl>`Iu@~r5_)b37PB!&4l8jT6 z;vo;CJP$+-NRSfa2_e7$4n1-q)qHQ77$6RGljds%<-mQU@W zqyOyCkbEaB?XUNg-4rP2a0hNi_WQ=(5}8s>@tnwm=?ybE02EvMzX?zW3kYtgQ>2fMLndUU4av`fhgyLK*CliYTp)KH^c)vNB4xW?g^ZBZM)mVRq znv)rVfUulQs>=U9@!=^9W@UOk!y7J&8f$W(*^Z|!Bl*~-_3;E9RqaO9*6)>u+ZHET`E$Q1rWc5$XqoqQ*eH+LM>n)0(qGTXXYi|LhpZ` zn5o)wqS;gJ0o5tD1ZC1%PVc{oxkfs_sHjcPm3Us0QeJzF?37HCrSK>nKPO0ufKDQk zq|vDn3>jx-6K53IzYr!BTCkr&F@jObD7-G!BKo5Fn%J0}n(AVUEh9RG&2D@T_mhZH z&=ny{0f86%`_n5P?$^6mZsuBK;72c(n<RAN`%)%oKu>L8mpKKie zO?j1vp9JC-*l)(MV*kU-%MUMOp`kJ*^1(R|R&pXDspty&xM8o+(?z=jCk$8JCZ2*C z!iB+y_!Yo&B4BB!mJMre0rr=nlqT@(1!6-&LPO99esI)To*daT zKZ@<$t=HuM18=UNQF zk0WvuQJ3)@%$;I4Z{=_z#*AVSMC{p646RYbiDUv!kCWy1H&AEqRPa)6jEcb8pvOsC zbX?JDm8eKXW;MWwXs{T}8Akl5&aQXzs7S0)h_1mrOoVm9_lPh9_R*tP9@vfihwTxq zO}VYsvf<_Cric~Bn$b%6wo@nWxZw&*`cPkbW_z=o+cg~B(MRhe+gT<=WxE8#1Ai*)P+3;k*t9vOed|E-zimrIEsLQk==T%=|E5aQeM5Y+vo4@?b`S~v3Kp9upDta=}_!l@l zABPWHwKvAY0$`+i;p95O#T|)sBC3A|MV)bTh^l~~+92F9sm4^JL6?w{kc^s%svVB! znF?*h2fM%9fnYs~zzBo`9f*B5e(&W`_0`q&QNfnj6X(voKGNGe!q*j;C%1oMuOPC} zUWtBGH2?35`JWf#A|{9MAmV0JJcyoK1plmn$M5tWF-~?)F|PKi<8mCw8}1gO9VO@T z7MyE}vt2LeQt-_6b1oz0_egOdE1&!^iVeZHOYmYZ|Hik(H}E^%552grNKS@m_C9ki z@#XiKb7`PZMa1@SqN{+;KwJ(vmsv-T_HxdRgIV88=Ey{{N8Wgi!o6!@n4H1fY?zx5 zb9*28mZY_CpDWZLI{Cqrn+xSz1~m$!Rd|~BH#H1ctAlJP8v^%gdWdxA}Jb+lB;~u z==?}QyFR1ZF))$WS5ocTVac#LBA4V-9$kvv;L2@h{+8=b=jRuAKX`KJL{~9m3Fn{4 z%OBfP-64P5?q=~O)54bLuoU1k25W)c8@37VL174iy-?yKCqB&reheN#z4sqyJtECO zVR^`rYh9XYnf2sunJO=@uDhnQn8&SD1Um_c(if&*iYsE)T@?jz^K!c2u42VuF7Ytk|)`7vWUrSQ@_uJK`3 z_dl@jP+9o|bdG1oatjN*m`Zu4@f6`{rJ}oRAx3AJ0h2WlWVS?9AVZ|%SW5CTGNWR&AuWZ$#y@9BIha7p1#&Ry%Hvz=soPvPwBn&*+ zJy5+c&UBNL^1l@n3{5rQ!%Wi$xup;|aZ|pD1-EY&d~B%opg}KLjuUhS)oRG=KskJi z;3XU(95vDcgf3JTa=2W2C$%*&=eramAkRn;*Kw5yPEzZ$kzLKl{%J>DL#w}HGS@eE zkrm$ZK~gwSLPV;E?1Ro|E=5YEi#*1yC#QgTC|plf>x(3r^%4sY4c#tIk*=h zL3deX+cBocfb}E3pDMnP#Y0tO)O)~;xlxH%n`6~&gq-tW%o&PW2QDPGI`+Cmxs>YI zQ>%lpk@tWYIK%)#cA(n3{9SL~ z)#;AbgG61XHwQ1D0X@DNtL-ybE^hFFr!{)#m}33sCMO-)>! z`pK}Ln}%oGV6_$%`){KM7zl_h2qGlt~jPe z;%a$;wa{9UGg>;hHOVu*W7~$(4NceD9Ah(^C6~*cANgu&v0lonEv@*gez-r)SZ{Ie z-}LpL=4~zQ%TK!T3e(VF|4357?w%5am_p`hSnS<3B|pZ z@`Lu0#9*wB`=d)>s?^_^D^4Mk(YV2@=eiLs%aR$WHGK?e)-8W+}%GfPWn zcC6>aB4f)duW%n0#r9?a=V_2QF4&8J0@A{I5oGF2$l|_OF9Jj*@U%|Kh-9BUbmhU1 z_xCTKjX&L9)VRC7j!jGsO;4~7bXQh(*U9JeeB)g2g-BoH@_=7XFVbq^=jUm)_8>D&Ra0yEi8ZAABtua_=U_#8&ZrMP-E#&CpZ!_d zBc0uyySzA?Xa7qb(Y}_~A*;YXWZ(vN zXnOr!dc;4(U#u4^HYFY|9+V zwP7_<7gnECF_9wwFl8do;z{Ui-)u6oBv$Z}bYN-eSVFG(J7aI(efQhOj*f&4J=?eC z6~`ugQEp>#Syz7F-)%rl(Yui2w_@%VXd7M)dazn365t{|SS{f_SiK%nn6k6Xya{Wn zU@2-3R^ln-uc9?jmr5Q(&O-*!gB9t+q6h2NnZb;vuEggPyG+Tc$x(?vEFLj+jZVnl zEslyzG^QUqRb2cQvKa3E&$QyL8^8D?{CfA3+vhe{8SlN9&aMS(sKXlm7dBm9ohc}S zz@}R_oihG`P?PQ=`8`&dbm4Pa`SglAXwSVs4_44Cd_6pzcL5^V`aM`HP%vK$askZCxd1N;~Q+-+wk!M9yCx$ zr6%Cxi;RKa2b+V$HwQJS_{5(}E=6~Y%jG{lzvaIBc$qs5}Au5S$&}EOrp8}q-Mrk&M)$>oi z+VKHqqc2IHo0ZA9`H%XM^4D^)wvd;%3S{qKEjpN390s(1LSWUe{`NOkD$lZe6Q!B& zPyP(euck0>99hZ2*KvY>3+4n~LvT(0UV+Hp1Ev5M`VC4B!9B_UN8Jh0d@fiy8!ZY$ zYpEGwN22^46vE^6;~`ScgRPYZq6jKbfD%DsPFqwARdH4fc5rMdh6S#`(BTOdP`jkP zx3|5cr?8I7&Y1f`Uecd&uPhV?=6N}3MyeAaT9ilj%NCdh>MvATHHEarbnc>h? zF@E>ksPt3?`}?_b^1``uz}Wef>1hcRz~v46!E47$ghhOZ}BrkD}7B<><02>S?hWEX`w6dp~KS)yrRZA5Ezq|S}4X6SkutdjWl z0)C_ZmQ+K`;kPQMmq+|l$4ndmq=K_P8-n3&bb>X(vJq~o7Xh7DD!=6zuNHCSgJa_z z{cLd`m5JDWN`A*r%!p}P@QrkQBSBN(&rOJq!bjk)#~woM*K!)cX9&CEThv;cmJ0L% zaaCG0J+T?thhJjDa={<|z;5}4VRrJ(^ zuN(9o8z*4_(L11of$zZ2L#1^%n*g0tBh5?`wbJDM!SyNeF^KO%uLWd{!__aUA+6I* z^T-vKEgZT0vMUxo(d_S?==HaBOIspOoxJkuh~eRgGpA0TiX8mVRwZVr)q;l^P9!o&l5A7?(%$G^e zYOGX!E))6lKr8{lDXpm7FWeppF6Q63K;79^Ttq_4r zZ+2GIyn4x%O_vN0U((dveCf}st2(=+#UrN=p3WMZYWeQcM@C0Kvb6nb$JAKX>4R4t zrL!#d>jfyhIFX2Du3LfBifp-OFwb;}#?4|}{#QPJJH}J_c)l|JBp-hei~BntFH*+8 z&Bwn4UABym_bB79@o`Wc=#AcgR2e_R$AKmRFOfqQ^O1i^;}`6k$LUs!`j7lQs6h$T z5uSJ9x8Gx*qlunD%{=cr@IsN|Ob82gO2CO`CX)+wY*X z9*QtPvO40==I{}fKIo=Kp>|vlR1gYs0{&-kWJx)5M-E*!hoZy3e;j=U#*lBnikE;A zI3FwL^pFG{q4x=dgitXGk(t9wm5A$zg1-4TOR3DBj)GLMrcD8^C!uI`LUM9)X0plS z)933sRrlru|*9h=TD^A{BwtE%@d zb>DUHqsce!U(V@n+c4Zeacg>hw$5xe7T$bp&&i>+UjAh@9hI}vVr?# z>by>j548u$Vum?U9uj$nxs0K*5j;Tab!7J8rbcg6SNf!;F2je|6@eh)${JlvP=o3->@@@Q#^7#`_;p5;b*dsc-Y7JgVYUKZ(#?O-+AZaE6K>lx0BhW-W8>vK3 z5*UUCMfYKzqYuD*rYwSU`wA}PnKT)YQ|QQQ!uw}H+7z6gJ-AR%-!wF~bH`*^r=xo8 z^z@B`Xr>`OYj<|}uDt%*D|0NJBWV4B_8Bx!6Xq3=*Dx=to9x7XWYD}&8(FI-pFA&j z!%fh^d2!n(WM0e`iL$VdhIS5W->4-_9{bff0PW zRZImFTChCASj8P`VDNOuT$KCbMG#v}FxT>$v=@cjvc<@>Wf?8*X%RrU$*<@*#08@gX%uzbHR z0DB?~mhamIV6Wt`%Kl*veE%*0yToCYeFQAu$1vEyesWl4KLN}4^8&ChVsp|Z!Y}k- z2D+Dj&S{zj>3#(f(W_vZlJFH}S1j`OY;kk8>EJOCgi@k$|y|tlqE4>h}UZmE!>t4#&fzYu0#k7)+D=&*3og zA2|%sm3WU|o)4cJRWHT2f-ueNz?=_*X_0rXc@K^h-a~j0-)fcju7P=t!w}sFm^OKl zpKaO~gLQX@`u7{Yb7rXrdhsg4NO`XOpAPC4GhYv z;ah|^@vT<*s&E+jT@FL|5-@G@(Qq22vxoN(o&-$0d^j9t<#QZ{=ve69ee%nkE*}gV z@0YnwuISQqkKvsm_t*x4=l7TxSMITuZ*U!+=(`;d#7}?5aT_8>to&0LOp^>5WA$Ao zzr$gk4ZO#XGZ`jF$Zv)v4zs1Mz2eQgJ9l`<%JT%E)3SZ+2$uIpJ2JhrBcZAcS{A&(FXH~#7%M)v8<2xLN z=tsb`%JpktKFeW%-!_g?^9j z7~nk=Hsp@^Ll`W_|N5{iX<@K@A1(l^4}<0VaRFG8se|~TI|lm_2CK@9QDLxrf7XMA zj#q}*s66<_4H~Ov(Vvu+2!A;BkcX#Lt=^D9*~prCve9XZ$(X{(I9EX~a7c<6;{8MB zseedS=;LX>ERvx?(LuiJ6N{ znUU$~?$PA9g3C5++cod-ZS=J0(`t&O?B0>H^1CNZrs(OU;i}tjJahab6I&O)IJR$T z4D0DfpY=THkBBw#YS6Jj53Sz~ofUCsk=h<~s)G|p_-LqmD_=+v=C4$hfCT_XZ?D1Q zwB@^~ep6L{TU_^WZ&6%s zQB7s>VrdsU@ww)$l_kGRmHunXa?x02=SYJ5SVv1&?`VB}Rn_J4pci;#8Y^lsRZCg0 zA4NTy6vayNv1bN7&_vDdBnrZIzIGvcSs2G_xc<Y47p2Hdk;Q_S@u;Sv&>hogyly~S3t^YRMsY(T z@6nKM%tm1o9&k*S8Ku}13Q$mNDq+LzVIS|Q%&D<^3v>lV-BShi`+9o!){S>p7VO?I zQ{GbF&}^!!mfmjg8+BGn^GM6?SnTP#q^PDvEnd!%iX`j5kw^ME(vn^@*gm%@N#I1`4ErEm-?tW?~wrJqLxn662#I zsakM!j6UDR7lf2yqZ&W0tcDv-MROZpG%K&KY-`*+R8??!&#p7AZ8f!5EY$AHEw7(G zP+7Jm;kPc2x2U{5$2Bof*A$!BP|(_Iw)hvP-19XKy&#P*~~Ir`t+gwbSmNjDnnG zeQHux^?2*HuU?XfG9?VPt-UCMkqrY4{4xgkx-^t{1`44HtGMnJ(N0r+Sv-ZC0w=W!e#)q_xi$OWDJH=O0UyY^4<@s@TQ$bWJBG zmZs+x;5dr>lDBc!QWgF6^GiUd#Dp**98zlXrO}|xm&wT6d?hF0XHn+`cHC9@C6r*| zMy3=IX%+kE<;M;jyyDowrUvcbwe^iBA{rVR>LaALpMUc4Z@>8D<1bELdfj!G%8%Y~ zIY&$6ecLZualrx-HurH4~MW|7{jg zu~aEP$tLG#@FuLyi*MF}PwF(V%~MH%E|kkjOi&Wki@7Nj$%UK_i@FR8xY2E8M^v zWN;zw8_wyJ<0e`>3kCtY{@HkWPLHd$rJ-hj;;z;KNB2Noi)~~)KflCUI={1Fi@&zD zaj8jqyS_=UFDWP~ndqoSH`7eLqs&9+&roVJW~A7vr#c6x6AaCjzJ6Fgu>ZmQDkFKl zDH4)_IWvY+hf7x>`taJyYluC-j2(ewDiApSUyp>i+fSZ6ciXAscTR5Hw0Umh=1uUQ zqc_ew;F46E8n;6#@Rx$192|YPojO4h?0W1m6~cIR}-4!a2iCPCj5^| z`QhZ-4D8p2OlMQwy?ae|L%OLZmpzW62(KY=Wg@AgjTKR)WEL4c93L}@rDN@5;6EnN zLL&Ttb^dB{kl?PCBym??02RCtVrG)bprb;F&L~0!l@mk`lenl+nUPWi`PJl*OvQ68 zW4`76`x?u1mDbw&>KZ9q{@uXw9t6*^-<-aFe9Mj_S=kF47oiB!*_eY2L346aq!KWK zvuM!c%o96Afh5G15^*)>S#&dI#;oLaYkG_$d(y4g86Sy)t*R#4VD zR?u>|SIV|nI}Ezn$&zYshTiG()Qq}&bh$Y?Gzxv4J$G=m zbp4*<9_Pt@pZkV^waZ^jW5+JPsn%0|W{Fu-Y3K`{sGI^#UM^qQkr?b~wSFuTVgyJf8e`Z z=H}zy6XO+PoXd%P{0Cy3R2IOXjKb#}cJmBBDp(l7Co#B41k9`H6EsqDY>CP!m!TGYQB+Y=Y{y(5Pl2_wn9 zt?uVM@+Ne#s5xL{ACbWx@U214|FUtT!S9SZD^fC8F^MJMfA}odPH?rWVo3!L7tPd| zT*B|19@>MK^FBEE=?q0VzB}ddIVzoPeXXtD23vX2Wc8(2H60pA%*pOF=qBg4Y|!c3 zt(H5k8oRs&+o0BrCO!rKZ4#!C3|$z4EZy@cCB^->2msv<*2p<=6?9=-bc)2GvZ!ne zF)4?O`<|Ua#R=2G#fJ@`163L7dA_67=h$3+1SPG5MVRv8b0)v@U}0CbZq>!YKKiFM`of zuk!`48?Q`!JuI`?z~o7e^P)Bq^@YmhkyB8iBBV}S1WY=O*>bd2u|6eUDUWn03Re;= zpYL%L@p%QIl6hfj@AUkM{Rgi297H%0s;GV`+5vVo)->6&+FGkyU4s(^#RZuKRsQj^O>^eT z5|dP4-C|Ek%BmZ;!B4`OQOWexhL+STu_dU+i40B$|x#hX( z-zUAqp7Q2j8lTvgB;T7N)s4Jg1QU)gtNn3C+H_9**2xbUGJmxA z-p~y$=_dL4cX~hVPrUWcp3b+~wsN=Zmy$+%Nb$j1s(?QmXva(U8)Zqd9Tuhi!J*6GoH!nsXoXvb(MFJsw8_^z?S{ zH68RVgC<8)Ks87+bRh6tDg}X9PSN#jyC?~P*%tB8XO)*&tz-+d7Fc0eOV3FsgQMQ% ziX{vR)}|Jy;}fs+xuc@7gLE3wlrw=uIb;}qZLoT&^T?jw%R2{pr^d~O$>BK5)S%gv z-cVR=D$KSp^n7^q(42p7^OK)F`Sko?m4B-_`gfO|ig%6IXIajFYN)+;AR#&N>XYC# zomfvc){}#}Q1$*AjKKP#Jq{}&3bWu2#T`Z|gb3PQWhJv(t+`gOBh6Lj&^uD%Vl4Sg zq^x2GcqR;&GK3^er`qVFfIPt^r7Zj5D@uk-_PT8KwOf{!%O6I)mADX#Oe z+t~NNmpfed#G|F9w?8Uv>@OWDx$!vLI9cW`;yy0)j`!l+{sD5W3G+t1-<)h?Iw}^E zi7817g8?cDtTGvx(ui1`I0-7FLD{e>Dl!^@fZixW1aRz0l`5(h8g?!ms$Qtyx#^%h zRa3Rh8fq#(f3PXydx@{cTzhcnU}MC~32($)b8u=yB-x+^)?j_bQRafCD!M6_vM@Ix(p;Lf9JAv`E|Y7ZZ*xC>^3udcH5pyud1r9 zsy=yi|0WjK8yn3Y-NNSgj7^O6Z%JAn85kGmoa*4vxif)>puJK_=;iOxtvX8VUA@WK zSVPB#K^ADJO^^A-=7V+;1DbOm_lBMu?;{2L+|b!39ard+)aP)_pKOJWYlIje^-wA= zv<4%rg6Uj}rHhv<{ronD_=KQWyZ|@Imf&+O1-)ivQ76O#S0V9G>|`{IG(>-Dkz4BYGSejD+)y7bohHxkK~E$|Ijl#=U?jqs zhpK#>^arjZA~rvrIut@F=6$zNf}AumtwRe&uZk8t8|v_ zKmXP%O?~A#uxwshyVobr#N(|V{!LIW(BcLl~9x$jJjQ(O%9SpuIJ*Q(#OM|A^Ud8({?_4A%} zpR4;}kD~op`}4u)v@dI)tN6A@(f(ZQIqlQMp3{D`}CTYoDw8 zXpf?OT>D(zA4gQR)PfCFAV4=lN2T=(9kroU?05Khld?}@obVyw{Yjzl!SUw5u0P&V z8#+$w7Vl}z2^}Z;6XTAQ&~c&zF>X=Dg)U9=7rJzVQ^1FhH~l6J3mvEZ660-<)PnG|Phz|snsjiS)+@#xuoMT!X}x0HvT8gb zFy0$Fj=NXDV}IG7)_D)k58#!j>pt&U_qmE+oFCwK?av3F6Q0*TSMiGT1AJfXIpO_c z&k6r)pR4B#hZiMZM)-P;V4LY%Z z;p0u;4jm_a2zdWn>yJ18bp7!b3KIx?m)0%b)2h(1_%5wijJHLG!qYm%c>AA2$BF*L zxZ{tZ<3xXA+_Gw%@FB)~SB(?D7vou>rk9>Gg}R7CYzEGa1{^O$eR_qy%Y?5q@XN@lt~ zA~_<-8xK>k4(;Dpnd24ln4~)v=34xhqlIVdTrRW4<+A(*|7E&eX8FNTf1~#1yS%5i zJI!W5nVssN^7mJHA^*Rwk70dqTm~`~xOGd-S_oSo+ud@u&=ayiT1NN+n@)KX)rF~l zhA%L6bhvNE@u zay`nL%bFYOt1HWW?oxM2L7r%40`(*V-8fSqIcq56Of`B!xfITASUMb06q+F{g^se2 zzek2+v?E8Ctcy=ICN}A7T?SiPk}f_uBdJMW=lY7rMPK%%``tws^WQB7tY}3SVUcot%q8e=CyoQfADf~l>6TcDg zemN9AINq$to#F5;d7<#cZ^V0AlS9Xee~57hhKWCk_YnUO z#bjY3{>mF|hx1jKt|M{sqM{-e5ExPs(MJrmxG2x-cG;~V>@@Bluv0SML01+T&WZ={ zm+P?9;~`GL3oz6Vt#K9pKU~wrSm=6dVn^3uqpKISE)!k5sNg;cKH9Fi$Da`7qmsfu zOV;qg)%+86XkxK}ad9yVV4@W7y>G60MJTPjAD;QIVU&ZjBm8#6L*BsI2=b8dag~RNapEBYUgaU-<0=mc zA6I#Z7$+Vg-lOsmF-|;0jH^6Ej1vzL<0=mku%j)32lr|UlNS@*e$Upv2(*8Y6(IpKNja~0pv5pYLc z>^b56V$TWxYoDw80388$*V^amen3Y6Phb07-52Nx;O%RltN11zVJe6r?9-Q58rg?e ze!_o-p3vT{8G|H@TAhfqcowm1h_uku`m0Rv_)_d3cg~A2rmmn@u^WC9Jw-C<&HBs) zT|ycU+>4G458Ol8t4^5yJz7}(@4f7@g9q_nLsQ~c%{7e;anG8|rDvah=%LSl{-KAS zo;Y>$t~z$J_xvwT-7;S-UuFXz8OEVWL(Wp1#^JY8jG2;p?nml5+SZo+9M;?6{S_#R==>dBYRxR#N3l8-V8o26a#?h9YJ0-5R9l)fe@x34ymIJHTR;q zq74WNJJ>2vpb4F?3{vLEZu#}+H-7fP_=P`D-h1x=`=Lvoed;N~5%o`v!`^36EGcrV z8Fe_}#r`9-sI`0?AXJKeJFpQo2N43LXW*QqnBi`z59RS3ZhJ~}EUK|k6Q?p2J3vkl zCn&DK-jM%NQC~G#+PK_vVyvZZ*x%Jqo>7=J%C3?&f9C?J(KllSd$~ z!{v?%Qdq#{B)sy`m7-Q2s14i7Zk#Hw+um};q2?>b2AlGWDmum@n&vZVm%QyJskWIt zU$(Wgd%5A!4hxKswR>cpD(e)&-^ zDou(-M4sm8{LJ8PpIAk5ULV- zfMw4-9NWS}2)lP0f|yiKk)*AzZSStz*W0(J`s(Vk zhAmZfo9g5*XIGXKxU133a)6Q>PGW&hibfe z=2UZ~r?{%JRQ{>YnqIt6+0axb_OEv3H&Tl94B|+vqQbORLN6zyB^@;c$-ii%c?9i&xORgz*y!4&My%ZBd1$#lc5asJur z8DGQB*6c=$RMl47P+K8AbIb7?A6aq?JFnQ$%__IHcJHi~Z*tlXZ|UplgrQWcDFUwZ zBtOnsI_j684z|Ut*Ku59N|E3dOhV5c1=*~8ww{^s`5mpf`4!IG>dGpbL)pr8s9Eg?b+`LlT;R)2g)bxW zpZGFzOn9xe?EwZ&*U+TGn-MdFIikoYShKT$_mAgfA0YkQTbS=mh^gc+R8 z52A)1(F^KUh45uem_>}Q<<1eTA3qmh&Z0-tD(38+*(Ja9{Kki$jGsR;e#~{W4-QRa`9I*# zwjh7TSz61VgLL-)l0T2EoMAG~6#5(cJ>blwH6z}Y!rOpQ*eUVn9Bnpj9jf2ywK(C- zfbdV$oRi<%{+9f_R5^71Uet1cxc7eewJpG}v24z-aajM?{JP2qeqFnHeSZCFmoi|0xjC&G)@aQ+KW>62Omp(^N zK3FtD%R~5t5~&jHaU%WZ0$h9efg4OLC$?@&)wHi+S4&P)CaY<#X{_~0{f*+l$4=Qqeyrcbvh2j(*(G-dM-Fi5k%-?AHN37d*EQhHJAE_hWzwjreepF{2#s^ z{JZn&S@7?zd-iPKzGu(Y+k{y)(*@cH%KQ{r2pKCdLlOLgsWVUq$dANM%r+x~ME(p! zJ7-%Gj0x#!)MrujWnP`HLwBDD+FvzSRs64SY^_(H(ZGD2+RxL%ZD=vJT(V(_Ls#rz2u=xAffliyNz&qAcFk-35ud~^5tfjH8$_jI_si=91 zb(VT9w&-ZPqp-@7Rp?6B8FW6oJ4IJa>Z|5v{PrU2#mx=)gJtV=EI+iG4VBD*rru}hL;N0l|2GFGuJUWO(JJqU1^>DGp&yBXv)|7iIa;%n2 zv$gSWG50#G<;|7#l|^=wG2NK-L`zjtl@ACIXW#|UmL3ud?hhSgeLW_I8eR-KTO?Pw zNpryHs7ir#HmqaIQBok*FvfNIm9Zff&ZaeJI$wHl7h@a-l8Sy*^Tgn}ZDy;Ff zk2epDZ5V4P_U!k@{ z$b0j0J>v8PXjRqAXlYR)N*Thgp)+t!@I_=)=TG+ajSl8y5BggMUdVQ57_uxD%ZdEb zvJSiZC2LfoJEyR!qOe9EXU}q#lsM858iA?Z;o)H!;^VkSH`8 z>f#K_h5nV63TX!j;nz7y{u=Eh{!p)Tola-gW#%IB5Av833AA*D2mEC?`&DkPd-)*o z8nO$`?~5ObnB06=hyF0RbjPqg>>JYO#T~;A ziaUlKq-tDzf1Y9c*!r>wi%LqXRpZLGZ2&Jbk%m~2;fzKDEFM_>6-wEM^AR~=-d@VQB za-lht8KNrn1(+fGWRM#YPR;>`&td;FHCOz%_@Oz34+`AE^*jdzXGQ{{_5eFXjICgU z;XtdoAxbg-H@P9Ze=R%Y^uCL|AUy?ohfKouEA+lUK=1dk9qbDiwi9J?I}unBTg8gl z4$h14{u_X=@9_6SW)bh#KE;&x^Y1UQZ}R7mS;D{1pF`}BPATWHPMKewm>-@$!|HGz zufTK2e2hP5PqEXWS=c)`uu+d9@VF%3<6*|X*(Iax@kUg|g`7w=aUMs1m(OV&+J{z1Owekd&V=GnANbl~{NpfBC@?<(%$49h4(-D$ zJqnCNfgx#@@EZx3F=aj-3XF%tJfOKzfsp_+$zdK@*{#5c`8=RGD_}UDcPj5u@r?8+ z%;!PP-61f$lsPY8jP^_H#et$Ocu)tgmZ zWLdW5Zp${!#uNj#F(n2zHt55=GPlc5@tKScvi*+#3iU9c7l)+gAktHf8YEDBjuvpQO2KT3+*=2Us zyXu4WL38~-tPl7e+q+`>_7!^{^F3e{`=9EcuDY)MmRs7dtD5eAiU1(H(zivY1ilEm zh2vEPLNG9McM&^OBqgQIT#-s;ek%NfeTCf*`gMmeE)b6BurRr*3v4vtCG&NvPCol- zLqTCfLt#M!+t;9cMZxb0N7x`GkSpKMDEpBv07S90*XMLby!4R$oEJX+8FKhDhYijcI zYHIR=)z!hg8uoH+ZC)N;@)Nj5_fRDho|)}t7Yp|S#W>SW(OVfsxyPLeO&C#3Looh2 z34ET4){N|zit(2%txZfBo~W=nYV+@{$#<6c@A|2=z?BcZLK4yuOQKyk!297BaNZhc zya}&3`@z@%qduS)CQC*!H{CFO{#7`ToB(u*- z0VSXPN?1>7xU!v2K}SV`EWpkV=P-%Jh_p`qlIM9FN9o3h4>adBPzn0f~V zXr{D3cuL8h<4Chpuy^I3B?|}b5PhFgqbli9p;bUDB+U@ljmVwDe(f0?cT73Xb*ypp zFUi99HBNkY4#@YOo3)=kd1UNH{2M#67|ChI zr>34>B2#mZHZy5lhVlFi_L#DTB0A6I$wV*7n1CHX!GK*qoVYj^6ue!%01grUW90p_UWYR%PbrX8BwvWEJM-`I^cCeV(Be zUy8$^Z~}U~WUvULj?0l8q{CtG0MC3m&fZ2j*s!&*We@40p zeHorKL|fU=d2zT-+{aM@d6g*~VjUQ84^F%y3YS^{_uxmxeHKMYy^T-2nHmFaSz z^7z198nV+lQ6q<-cbZpdhZ}~+Xyw}CWCqxNOenZ!}#%ZL1@Q!;ir!KwvVdIX`9&N?~p4Hw9(7SosC7T7T60iUebp}NQqS#{O<^bJB64z5rJZMXou!v9F3~Rbwac`K5 za!x=x-nux#z^%!{%PSB$C|`_Mn0Q{Te5fYhQR+SXoVCD7>=u11nLQ|$NEA6qmC>;2 z>iW_oJG5eZfpjwGeTcaeU`OFMbDaHJ0IBWQVgtbIIJ)&8@^kEauldBClh_oZ{j32o zfA+g*BmXYbrfzku)8k8rth-D?w+ppYvA;jCdNs#Y70%Ccxew#rz-uVgcpZ`$(58-_ z*DWxH(L>K8Xc3*K~w5fGds> z%+Cl*9Hp5sNU+GkG(?q!Vy|4RF5;xC?}iP#bJ@2ILhH5@GU|6gx4GY5?Tp zXd_wPTyb#S71_VRuGEhqlz#vA{1VoTrND@o}8E}nl||Gc1t z!XcUn!c&XwES?xtDj1q5Vvk(8w@<5~f8XU0)j`WggqPVl;$Jx}8`yk%!fUvH0l$B2 zc4mS5I|0LUQZwf1Uxoit=jnf`^Ym-D_b$Kp{=9p)&+f;V6yUiJ=H2@S?tP!%`*7a9 z(`GjUXFYiCqj~qfi+gYLdmqQ%1Fl}0{RU*-yP!V+*D>d$Noc^q)1be!rn$jWUQko& zU$eR^uXopy#+8HRdEKk~Xx!hx^B2WDk1dX9s5MrB#|z3m4b6D`udBQB$_H0AF4@(a z*F}#Lo>?M0M+&HT=5|)tZB#oe?!Sin7x4Rp=lS<@Shd*5zJ^SnG?C)K4-Xe8Mj;}- z1aSpTxrk18oORBIH4Y^c_!`HA96Za4fgSy#?X6+gYwcZz=YIM{pSz5;@#lb30XSPhIFo2S(cujDj*Cy+TLT-@QI2bI z-gB4X-cR{GY2Ljx!XNQmJH|+yw`OTLqirNwv-*TW#AeKbe3K}|-Iovtt8GPbo;gT6 zR7T~4)pg!}d*^<(s`Jh}JNGXsJhJFW;V*und@N9h6_IaIhaFjl9p+%3^6~V!R0o^f zPjxWA`n2-F`PpHikR9T1nC^jq6M=yp>c02h?hD6D&}#9|Q555+FN^&)#4Ax6VKo<0 zVdnpNF-nt?DGHls2iYgsu}g#w76^IM6G$|M%1%-%RCZK1MY1y+cIG*`fk0D_xLg@g zu9aV>RQmiC@rfftMY(^d^!e!PU{UVc@^Wvg&vWyA?x2^x1~TX?watFP{w6teZKG8j zZsSZEA23r8Ai}8DHd&Wxp+p{4v(w>>`NiVVczJx{@K9mS>-5#a;SdEhnUa@z^L?%Y zYTXvVSF}!j-^7lfeHU-P<$ks6iWHw1X7#fM2{h2CQ|TsDIQ-<+Dhk{Po#v@n_w9e|&D5(iUjyLQYd0erjxPy-KaIv_vFR3G@JbA{m=6iv|tz zyiZt;IXH;<8ZVR*e-ICsa-JG>s`&o&~<) zAWImK*$?9eL_!K-2dkuFleD96f^eFPL3p<_2dga=tIgmnIJXEF1kBnT_JBOVmdoFh z?>-^%gPgy8d*af4E3W=8-}~ZO^2h7t4^RF1i#z2Nn>rrtc-WkvC4;{)YajtZf9SaX2oHQlX|oWQ0Fo zI{f(vUN}}Go+zu9-)Hvl0r714z(MghkRGK&Gl#`b!xll3JJH4mXd_4P3qfIXXahV+ zE!KF;W`{k^W}xMRHi0)I50p91ygrFptrCba-Gq5ey8nql$s>rGy&L<(Rvvlou#I=rxlu@9C;O<(VlzzYBF^oaRu zd6xVM`&rh0k7fgt|C5AS`Hy4>lYd7kq=ClSS@{pJWqDy6_DL^;h9&7`*-F=EzJcqB zxbBx;KK3k%;uADabK&KS;n+8m3F+c#v61U?Wb-Q)>IGzu2b%=vG(fSiGI*1jjfTxg zzizU`O(Zh2V6vD^^gGV77DmB1%c#fWcGp&ymlg*7UQdn(cyVXCGZC&Q;7uY&2Au&q zp!-g`I=u|KYx?^$nVPklU9NpIWQI41*M~RFd>pZ01;Ol^^4QA3k!A8h%Q1iG#ZQ>HP-53IEZbvDjiIB*=<&s zTGImFcyig)bpdB&W4c7Y<^2fA3A;^xjdV`4!#0{O5RDcmere*o_V&v}-+j_4@)w_MYr! zm_70;4bu^HK@786b;hV&-w}(rl`1Y9xr2X5Lj)@!COWOh79Yq(erq9Dg z2LLAUw0-tEwoZH*sxY^tz=k+ZJew=IxUcYP0FuJT5LvCkO1%G^o(}I6zb3vs^CUZ! z+t1_?$n1A>ncXbFqgN4g<`_ojTFtOnF=!0cc;Werm$8dUk|*6kI`%izcb{5cf`GWZ zv_}Kd8&~#frs5C_mJcPkGSxdjNwuzaY5_GqJivZ90PiE-h@ul6dj{IqJK`CT-O&F; z7+nz$L2=B9QSfaJ@<(D2fDz@Z)=Qzx>)AWZ3=ySn_I?jFo}+NvSi5 z`ji+C#)x{8;xIba1O%x(Ue$K3YB){7r}7}xKeJQ%+9&Kk@Kyd3%ZxUJ4s@|r)=GU4 ze$W2It{1%IXGlJgkTbFLz&j2Ju(AIHvlf?PHX|Yi$+$)Vwnex>VtXZ{m~qc6HO2wH zqi5Kc;1a1ziFLsKlsnwwugP_L?P;0zw15X&U5C^C&h&gwUX3?BJJnO>U|Tx|vpo)n zH8Cl9bz)*tVs@6(UQ|FdB+03&{jg4G61s)`p}lb|)eabwoGdv$DS4V4zRmX3X@|=u znYlD!hBSfE5!gm6i;vG3N=w0JnPn<5L9|#R(nNi|Aar+icC@#(w$wM(H#Ig0bpnit z-!Ds$Bc1Z7nJ8WLXCh1_1HUhBl0Xtx2?DDx5 z$|U*V0y}W5DH$fq@NS48VncUNM|ZsZu!n6tjt%ny?9yr5beC}ZU|2qK#Fw+ulSOh0 z$E9K$RAjMrp((7tLPD~zIW-M=)6F>9XNZ%?z6Un2J`pi9GKTCaz*_uNl2we4_wc>A zOv9qwTtd(1ieU~ehQX)^v1>uhP&#WMrP^ETXOG@`tNfw-?gAKikJ-W(p!>gPNuO}Z zk~wv~WLe=y6(P(ZH(|(kt9z#;X-j9M*FI82F{AgmoZzb%yeqYso_(xzbfV) zupiI_Ol_0(SM0}f+Yz~iuTzHbD_{(?FI+5?<2+uyaAxSV?98lmk1N5<;^R#4VWp)s zEj2|-O3E0@a67G76cVQ#c3ZL`G0}r~ibhG2GNnZ|H5C;lB{lUmFq>CYS5#M3B8n_X zej$pVBUk6lm8%yXR-KIPH$!;9%WoEobaJ-*)&k?qax|%X=657;AI*~AqW7rmtsC~J z_{{}y(=lwea{M$4?Lrs$;}A}0eK&MdNw7Gt$Y1C!$VpCMNmjxXJg9*w4^Wh5Oij%g z%7?dac8W<5Y*Sg8NKj%o*=(L61WqvtBZuROF zE0!%A8(Xw!)AXk4Et}VET(@z<`qgV!uU#{>V%3UOD<_vtESp$9KDKmh>5|3DXksY) zF_5$nglHxBZ;WE|zZ%6aHkzM1s$Xz)zu+)O$NRJ5pdu zuw?bYWb@|FeK6EO&v3?{ghue7kYrCz+U#Ty8JInFv$j6WYZKl)WjJ5ufvYn&IFKNq zD4q*02(EvzAdm`5jy9xiUz##F?wWF)>ssULTVfkrma``3-0U?u17f;dE1$a0cCJ(* z*RXwi$L_+vvAtt&>2qA4Vk}^>0!o{R zxO9HA0ZMknk8Yl4ROPme!wbtUThhiiSIRDoq`2c>I8ODgjPV_78TQE)M~-ZXcv4}B zfP4?%74V2GXdsJ11F-oSlR&}<0ijCq>lH#yi6LYd*}(Rr;`yAV)du8{3B$gS&l^Wg z5cBaX;@vZEm(Fv0BU$B_kjz%CW*|>ZBs(%T28tAq{cv^wcHvPji>(e#Lf21XgTZ{! z42{z&84}4~&w#U8I4F@MtcNwroG}DJ6X67>;t{Ld1lf}dnk6NQ=oQg0&;@M<+Lajy zsBGC=Uw{vp3nJ+(rlgDRiCoG(@-q!EnQehFo~yM!SI9PJlaNRB-~!BLl}Z z=;f?k}s%TI7OM6e(0Gnci^Zh?C9gjPejLSVRED6 zwftm-5oV%LfXs1J5cVWqkPZ{_=zqFmlc5ZXHYNxu_7o^_6t+=yD5dka3@lmDLyO<+ z7;J>UP$8B|!_Tv4SFe^o*1#TsaS%4&zrePe2LDID^gGq|_B+_#49AY@`a`zOy-JVr zvFC}sfCyG>)3uKkEYh%bnlX%V!?aM(4{~rymJl&O7}Vt<&1)=&Dt)YySp) z4~dh4->`2MhtdcKGjuRWl71IHgH%nFc^kILrxg5zar%ME%#zRWlgzC>Q z=jvGC%M1I4%DYS9911?i?)(?bF4jv_$Kwq0spzLS($7v|DAbRhVll>+9u{oDsQ9~D zcu#R`h#$uC@K6ONgcvuOd?qNSp|+-mnyRuAibATmzfy0-&+V<=xUaX8>n+hc7VbIA z(QMK3DYe{mpI^hSh}fk+$5-|*v9@X$zIC>L#6-fG8ya(;kS|mTYeK7l3$PO4!elf7 z7xA#$NhX7YDT1GICLA+`nR=~)9V?_7^IAk<_n8+3gML4eL9i-VSz7GR_roZW|PDfuf8ePaxNZ)yJFo%sdwxg`29aLGL^_@$L=oiF4%LDsKKIlIlk@1MUSp$tw#cqt4_}3ZXUS zSMXV;eMG3RTr(f`0+v|oBNjB`{Bexgsgu~*L6VRbKBl1(V{9QQLe zW6g&5D{$P8dDBO$G@WKxz>}AD52AYq4hoxLgm*F)MVb}$@>+6JW<+YfEYc>e-`KrW+BNj?pvn*$XnjsF$0KtUmU8|DD>$6`v4p3jSgizu zvNY3%UQ(hC9$LUOcp%KxngJ7i&X^-`87>b$u?V0UJ_^!s}5L_rK+1 z^5)MlCdb~u^=EP2C%uV1UyKZSF<^Cjlkf1d88_s_%lY1tHhtdbNa*oZ;U_{JP--f^nz)DSW6t@YEbRz!R1rWQBig zSVRup*cN;NXQwX1*(p)_6{FuTg03zFU4fop>SDsW*-h*-@eaWwK(fn#Tp~zGkXwZ` z8YQv;M!6!F5`$S6i9n;6fwrX0TJClJh7ViiFY=MVPu*41QJXSH^on^m1% zQ`V|!ss7%Y<*i@tX>0H9 zZg1=1gVa2`N%ToeAr0mWCA2470wZ&lD-F3Qp~WVOQX;^GPc%GpFQDs>XHxmd3udTeq$q=sGFb(!X^5)aJ>7 zQ;L1%1IzO(#79lVIqj8kKhN2?Y;>pfs>=;E`Q1Inqq%E(dpB7Q{;kBHTby=Z_`TGX z`L%R-5IaI=&Q`EDp{L;-1L7;>3L~MRZ0si|A?>+H8MCno4yO$`18#}K`b}XUrY%^% zC6lxfyHPB}5MaS<)}pJK)6Dk71e1|da6CD9+r1PlP+f@C%&@7{86q|ZqO7gBL_Tce6VhaS3?$l85 z10;l@jyy64A+#06uSm^H#0e`wn-w_2?|0y(?0q>%y$)g*pdK%5im@LJ1u8r>*=@r~ z@7VtEg6+P9fv&>-%&xH$FR)M9y4iBui0jf#;^S^NJYa^FbT8{!Hk|3$9N2$$&$8~* z&!cf*!s^*V?5%$c31?LZ(aLZ@41M7d6)2}Ed84^eP6;R334;&j06$yTMQ8h+6xocd zL(?%glwt#r~UZK3_>$k#B$EuHax>L9p1l z3_&o&kCT&!(*nWvrSh(^4b2&gQ~hlHJI>K+#U$NlLF3=0RN|?L+g?JV9VpU+zx;tt-W7Sz>r(Nf{ z|GKREJ3@=IuOAutvAZR2z}=e19IyAaE*rq>>y?x_4ADZw8o)sj_YhS8bP9zL(&se% zpMXxX2O`$7c?x1C2L@;CvOVdpfLBq_QxY)d2&_UeE(s%e+0;lO_{zhB_}{li+tkLPm0;^g)Z(>Z!~C8%dH|^8%KU zk;>YZTmo3AW;3x_>8PVbqY^VRQZ*7oiLF1{ap|R(?z-fXOHTUH zIoBAj0nhke*I3tq19-#w{}PVGW1ZC2MbR)xI&5TZ5)B|={MPumXjsL6Ydldjz-u%xpM_-}7T=-NE*=+r&=gKARg)fPxA2fVa?DHIgCYAF#y14M31U zlaNnHPoftbfi|!kl$Th-Wi5z=d>q?m3y?MWJ$~*0i#2iM{qhv*l} z(C^Yv5wS_p2-Azk4sgLpj*v!?j?N?q37qVRQ!*X7vDME!v*D?y#IolnpT{4^$ux^+ zAH$bI5^_Qwa5yv$5fGms5#LoRJPXfKjH3YiSX_)}$;XbLVM5!`1K^Gdj}DwGCaW1_a+suGQ(H@h zh*1*AVJYJYP84w*&m;C57HGZtCn##LWl9ap2#oL9?^)X2B7iF$dzIJx-eKU@4E*aBDrx!pis zA3*)^F-7Dk9*V(4-dYMBVSpEz&E|M>yqmNEwRJ+&MQo@1wF1^AKf$h*&lCr4KJkX- z`!1BX62AWJdYMaslIZlM0#w;nfNXk~%4diJ%MR>Wal?u7{Yt&lfcIn3$7yeq5_QNM zol98VjZ;K)T|;CZ=TV(IOps1;qGf137U7VxSzlr@M!{&a8F0j(A~+Fm+#tWow!VKQXjhv3OgJ6!WJF-xi@lhWLzX~x8cYdB zI+H;vVmeF==#xR%7;m;96_B_VsmVprLlK#B=_|jCP@RabOiX419|mD9e+2rX$LFJ= z^%eWze&F`H5qwS^+yovYR@plXa{o6HiOIxNS8d=C)NrEH?^Hs?AyS;^7#v(&GvLYW zt6e;VZ~a-G-dg$EPJfZpSr|B0>~t3SJ3B@3q?IdAY-+A=91PJb6dQs>0qv{H^NP(J7ANO@54Z6!sM2 zkG^&8=peLXz2<9fI{E&AAfyy>U8I1B5+@B93@}!T7R|D?Ncr$%rnqd;^*Lsd*Dux4 z)jqmrhi%%rFMgn{-SF-Z#~}ZSBD}Z&S0>;hc`!i;guHQPI0aK|T&S1)_^O1sR49f; z*lxEGBp?sUEl;mnv31djhff+7@1C4_Em5lEZxH4f{7+yELY-Dx8*m;-iie?rL``n+ zh*Uj9wq^?X!F|C{+6u2|r4cWVnt8!o>=J_T%C9~25DUmtzy7s&_sT!CzqxV}1|0z{ zQCrlXC$LEtNA!)zIcSIH#lbxs*g^|RsLVJa4)jf~wGK%7Qa$|8p7`N!&ONkw-;2`b zl{5cf&*#b)h%oq3onttoZ$XTJERs($0kstyLV$D7mI8wb5|lC}(gZCQls&*6aPy$- zd1)lGD})*Zxj4+WY9yM5KvoAuiv7(wZL*5)-n>AeBR>A59r3xoycXw#MwV1=GD`Xf|3!- zEgzg7eiAr#j{oogLlAou5{2n_X2gaX4jaHy0a}3m1C!|xr740mL^?(=n3+kNhr#k7 z+>n$^^(h%C>1y^jE7>hvET}iLb2E&h1L`FvrE?TF@^>BbiqIV+BVApiqg`3qIUY}T z6I-kPZqD&EHHlCA!@Yj--jzK)t5)@Nuj(oy6j!s*7r)iH}NtQNX zSQHA?)D#rZX$wIJ4TT1KyKCBOu=!L_U4ZQ;GNbu&b&-Knfrf=qkncCTj6`%1M+5yX zgh6L$tI~b{bANwR^Wb1}w$quNji8)tpF8}v`_}{g&CLS?&1{MKMSdRlbJEgsj#4?i z#K#x4g$4&hZHrn9^74v{@&kpZw?5Mr8sb-57ipg@2rOArl%H2n7|1Iw2H|u4;clGY zz6GaY&4#NN)F19<+t@AQO6C3n`a^V0Q)NJiUs$#v(7(EYZC!Qc`#7)hneZ*FSw%SX z^d;pytrR`ie78`>Zb3A!e@p+MgIId~W7(1=qf3{voaMda!8h&{&WB#~%oor< zkhG(g-FEbu9vCe};ST76w?XzHUGU$N(IJ7-g6-nf9Xoc6nR|Qp^!7qWs}<6rW0}zZ zGv}QdzMK6A@O!z6UmmLv`dKuV;GOJm(BI%e!1cHJ_wQi$u zRWw|}e{1WZX!tV!t*u$2;Zpuv5GX7iRsiNVl{I|w;M8nsJ&SpOW(QFZK=K6b* ziF8#ngxesNWmvMzK_+hL+?Sr6c%n7OeQqafVh8%qa0T4qe~M;Tp6iT$mJM3<2qCdW zTm`Oex+j_HsAncW4x1S5s0+q<1Uo#nJjZjFiQVqp8qciq<(IG>7G_!Rlt)Z=S!{)6 z@)bn$NrDxdjR$b9#dHr$>wqQZyoWfboL!MOv+I?!B?I%$t^gJ}4D;*y@y*n(p%CmdRfoc%i(&X1UuWk2u%G!=SulK*7uG8^Ftj950E~ zr#w2@iInp7&;wjpfj1;(r|;{OpO&BQJlCCLJ#nu)0DQ=AvF!dcodLIKMl~EaI(RsK zSzWcuWzLgO5w9* z+c;4n)`K&5W%}LhdU|3Vv=90^=KV^ z6ij?mK<=FtQV5cx9kC7&6WM?`1&nOyezKO>{LEp7x!8ti4Yy^wZgP5VVjEJmWiQ;~7vszzjqLpGNFjkAR!Z<37^TA-W7&%A1xL0*mY<@4CNkKo|ak;5M6)vnCLC!KQRDUV_B3BH@e70BnPz-LQ@d_cA~2PlzM zlcBBJ<+u4=IKFUo=56v3`N(Y^=S|X~6CQi)1o4ARmz*NM!iv~OuFR6~?;m-D=xHvD z$%*j01&rP*NSo+3Vpv1XN64vKFT~bG1fhH{)l&M%BkWv2dS9mNYNzKgD`6!kJ@(is zH=<6a!=vdQYy!@~p$>U^#PR2}{+aGE5)EneS;Sm5u5tEz=hMnMfvftsdd%{4z(wsUU}F8FpW^3{&f2_svXD3|p-pap(Lp;?85= zQ|Irl(y!U z0X6H&&=?*MKhZH%;lUo9Vm~Du5*ArW_>lBoI5nIKiqPolJxHW6<&=`dt5DV+wuv8b zf{vD-Q!hct%g(Kr$|-Y@x385u8sIfD!pHG&tM&!_HG*3lZMcv2Ply-Vyy+rMTMbC@ zed<)qyu+ByYd?I5aHqE4B2@9ZzlAwN`!nQkLpq;wnom0$rauFvKX-G2a0>Pl&J@lO z&J`{YE)p(9+tPA zxb4t)Z~pd;-@5*~YrlT=6_;Q3l}j%E(uL>k-@E6m-KU?nbH_<1Zri$f)B1H&t0z~C zFIzk|yl9}mr@JH6+S1riTT@w4T2fe$7x3n0dD7iD1djDn*@S9=fB}U9TYK|f#s#iX zx&Oak-&A!l@?UO?d_7q8f9i+yts&jNgSziS|EGR{eURl&om2la>iwJWsc=k~g%QY% z^YzJyvFCyzE{FNy3RcX@5$mcR@!;E87wcm~Y?Li!6KoY*%QmuU#JN9(?LthobJ)4; z0>nnU6j8CRV%M;5LTmjFyOn*P-O27@58!}Tu+WX5=wJ`Hby`zm5%e;FYI4zLT^`PkLn$M&$Z*=}|QJB^(R$^T?_ zBHPZkvMp>A+rZYbHEcCo$yTuCY#Cd^#@Gm3#0KFX*vqzLQ0?fy9Vczqw4CY1}l{A*hQWy@&U|$oi$*}doa4g8e4Az0q5Q*;Z!Y9H< z!Uw`%h5r=Z6W$Tt7Tyxx5dI*%Cj1sU|0{^W_e>6fQ?xq^}5H7A{5{ z>kEbRh5f=lVUKXOup9O-q8AdP$O+&JylS}<2e?Jdr{dI63tsbiFGn?aQS8fzM(gLi z{ANdW@C#h?qFg<_bY&N+kIK!hZ=rJkFI^)Xp<>soYjr_~e%F1W?7v=q6W#u#cmhw|>i!H4_jS7@M^|w+Om*(A9 zo}XJj`ul(3exxg?wF)2{(SQR~1P^`S8a~tuC>MEVUIFR7!A0}`>)8MNyF-JKf6=cj za!vnjNc*9E4i5gG`LypmaG7w0@O9xj@7Ty;=7S@N>eDuLz|MR_f-hS(iKfLzaS6?~u%a?xk!t>8Q{p1smKl-B|K6wAV zcOSmv2j4q%%gs04c*FJIxc1=HS6=?ruYCF90~emZf8U<7cb{?EsXIMUl zvwG!<<;#|gjVv1M@9pjkwFQMT;(eH0U*I)|=P5kU=9)80X{IhTEB{}*Ca##z4D?qv zRaNQ#0fwQfwr#J96ywJp%)K1_t-^ z_wN}LJ&~{YLN=u6^EuFQoQR*mZAh_o;3$T&%}7qX*wWKiSu;^xJyBD=q8eXfs~=M? z(%lJipZmYm7EV{(=UTX5HiYJz-=l^4B2yoDH+20-ffW*U+srzgnIl`FD$;C(t)4Uc z5|j~8(8UqefA)ZcF~LBnn8JoE{^{{Vu;W0zu6}*>-h~E(?OAXj=E9zgH0H;xThc~5 zW~3h_6s(vt$nqyjk5pP@C7{JP=-%+OsVL?_5VnF9T%zpi@c1-IEX)FAow4g&~H=jVUEcJK(Amr7a~EWMU}3qC^46FrUEYFjzf6Q7?qgVZ0h}i8foJH8pjC z;ZeIXQ4;}jEY+$MkC_V+EKz>oE+Y+*-MPOo>}Sr%ASnpr@x!A|A7WGZ?U%N1xr$DXGy!2HY5CkVRwwziIDwNrxypaG}cy~BywKrCFr$EsRH~#V^-@_ zE5tgh!f4a%mBb^WAaW)LrZ5IP<8Mq`YZaEs*IIS02250knS81Ps^?4;D6t7;!7Im< z2gjb|%eFFj7$*(~=dl*lf#BN^5q%gOzrtkIme~s+S*1um9G! z=($F`A$=6=uL*)bl$&4ylCXEgDC-tOfG`18R&qImLt?5#?hSUhYuR0RRomGK_ujkb z{`=bv`}Z66<569|AI? ze(L+j%P9TRY|Azyb^wVa*$eW8umtfZ#!g1PA}l2WQ`(;M47T~I35FNf=3|fjDD0SsQ}U-{?7-N}D-!%6s2r<9=upLGt(4;dfni^=$hX1{e*-!6 zVNdNCvcW7<>r-v(6h@OR8R102!41NAB1GlE4at-`|Fh?b=`)cV6WsFhR2 zD!u?Wm5qT%g++yf_AeA%sAYAyAh=bSj|LQgIX?I}MCpO{wWiSe0R#f#?Q(oY?_-ou zPh=}d*B;?Y-(IcK7v83VD{L|Rc5G}+OeLD(aNf+}Ou#&{;4BW`!@#~Uophph3}X*H z^bv21!>jCtDbE4N#0Mhn;VC@FZbtPFDFe<&B}yBw#Fhta_^)CF(7iHK$60zR~;P+}?p7#^8<1vOz#+^g23@QKJC4JL%r zH>GFB*Lb%ye6UwIe~7z}+Enp@6ERxvh)mHzKr5X+cB9e~$EEO&3Nzs{@+^%2%>!ge zzgeDOlNbxYIwND&(A1%EQ04^nSBFn}g8tJ}4~=02_{0d`K(sh}3~kXIiYd?Wsm>#1 zu+fS-)H?bl8sX<|_TBKPkc_Hr4R5}IG^v$avbtGB7tXuMznn{!Xb)K|t0b3z*ji~1~w z6q`M06Lb02F?QQSW9*eNu$Jd<1iVrao(1jb+9le-#!@Wp@U}6>zyU!!Xr5WZH>l*p zK>((SRVj4H;gD21OpGTQB09wL3Pr&8kHbUUV(cMt0|!Z^3l%7d=upL>LeGiuW=(!l z@Ca-~aY+zG@JToUKx+4hMyY?mO)O0lJa`e`K=~Vhma!YD7Y3S3k#VqL9}%*q1KuTs z6v&#|gd(IUQ%dPj1UZ;m)TvnfaH^jRla7x>$GVn!Mzfrd3}>lHj%pB?n99+t@;^LF zbg8Z{0475H4~1_~$o~dBgPwsxINwrnz~`DulL`(n8X6vy6@sH8oKGAfvaW!4Mcd<; zr%{Ag`4k!>_Qlr-jeiOEs%s$4wti{RI~yA(Cb%U*lzWmQwj=BIdk{P1qCPXUN++Kj4V^$p`d7&&pf4I zEOH%p^?D`2r<|oUX>;2PdClgPU~rAfY-6uQAY~=5k^74#H_nv_NoLc@gj~K`NG2ph zt}5R}1;Qu}=Hm@4M}g;2SU(8YBoN}?7kMV>bDl9_eTb~F=sR0@cw*Y2X9!=)+Cccy zP!$C&Y8TOPOc7o+c>soNTeV&7(>n(b;xF6O%H>A=+QQc& z;-X_H%rzYT0Lgw4z902> z#+1jAJoO0`mZ-Lcc2u0aa(sR3m5*rg{YWi~wn?tj=nn8`IsljdQEXwH5afy!J*J7! zyjn=m(X~^D6K&mugoyUBVjc%4B=}I>>}E)Ud>#LQ!;57(x@PKdqLf!4p(nUFA6B0E zh>P>blhN#02OwP4-b(@%pu#^@*5%``@aYKu^y4@hL4{HzD2S;uGW9nyww$(Nb;6rL z0H70P{1+M*J*`GYC4%p{<3hR|$S*Q18cnI?bTS8|rjMd%CcH&tRBfD9*_67i+~;%< zg`dlaP^}{OxqKJZwG~;2%aQV@R1Q)Krxiuk;_`4zTUuQtyQ%oq?kji&R!7Kk!TYbu zYdSlCB7=e|Ab-*Te54F6@0+UUMe0+i0eTuKc51nZ?y0Mj;~!%R*r|0Athnt&rz^$C zmqe2jym2lh^0|MUz9<^3I+k4CkD*y*mK;toilJys>4w&Zs&_>A9q|Iv*oi|bt!VZo6#=oZ>E-~r5YarqX;IE_ ziWD7^(+kI!p1*_I$-=_NR~-$~ZWLOa&xbXP%^km3n-}^LgJ*~}yf?~ID%S+ZhXSGE zS!fWpi@D+wt_!L033PEM-fevNVeL;`qJ6_9f-~|g&0%$IHzP;TosIHhaf!URk=@DX z*8FmGl9IiPVvVR2@5C=jzrtD>%L9QW8beY=#SKs)U=QO+MZOoZHKM<<<#L+V(;VY)kR4NfMn~h^j;7-SREEQ$mC^VTx5Y*HT6CTejQCIX2vTw|_6m$xlOlc6 z)kWo~AIh3Fr!C@3%b>PJc=$p*ge+GWQAh^7k5rZjCw8ty=vkfjL~DG_=XM&tT7h=P z=FK&gp4C}Ey;5wfQIcMep7~7EW(~&!X9Frp>tNIIBs{~ZbM9QDl{A*FWBGtK7ZgrL z>wv-pl)0nRyHy;ZJjO_w1Dr$C3{ZJlL?_n4rPZ%Iq3}wwFUQV*b*@F);4(yHPD75+ z@mP+A==j96rQm?K6_F)$)@(kms_j9yj?7t`xMf7?ziRK)@tP2!U*1n+7BJ>N(5KV5EaIxSBrCxmgt_>^3hX*=Zs|s9pL|{<& z)y)V_h@+;pN<;z^jvqQA!9D6JGGtvfon1HM(54#t!(3ZW5kGVX*Y$_k;r)RCbrj10 z5pHPLn_^4SJHj0}UG+u^d%$a=7?eDs3UaEg94zu=6rWd|o>eqh_J+;qskS*15>ir= z6XS3k?Jw52#H7@e_yk94wZ~{nmG5`CQfw}l?R>ma-0qac6mZa#7I#vwl#*;sGA1TD zk`pbi%6qRkp_jZ3gqr)1&}=p!qi#|D}I}K1Q>GIt87se811^ z=lFERIAS!fYiL;4+_b)-VSQ6;W~Re|*L~`z!#O52^t$W57RAMg7;cA&9Rn zEUb+$HZN&vS~6!4zNX<@`}}rcMMYu5@Nfg>wq}n^2AtKf6CxmbD%lA!tq{?b$4=xy zU3rjH9@iCt6RYbe6L4L9ZM7bB)*Z-Q99W!gI^`6TYcw#Ln_p3ojZe1`7u;ikF>j!v zzqPfZqOGlh-E43z35?|wmKS7=1jZbulTS7|#sVYAl3kEH7FgmkoN!I30!ch7Dnft} zr|6OAI1?Uo0l=7*&izvqA2ImCL;6r+N2(!EVt|?$EFNxNx2|H{y5^DMfszUp05P+u zzocb6ZfU``Z3Ro>mbaAj7nMa?B)qiX&BNYBjF>{S>C4Wt5?&B7F26p=`3x}{g~L_3 za0y52^$m-*gc79S6tB)J9xN#tC`Q|*Mb|Qydz0a78WLW6Mcn9ivujElOZo~5`bq#p z`ZaKqFciI}0|je+FJMVU|1+?jWYC#wrSAYB=&E)h-4UARY>`~XE?Qn&Tbf_*NV&d1 zt|_=a#ZjMMT3fq(6?M3v728uo5``-aKM4ejluO{XPlhekmsNv+V99 z^5vlw$s9z~-yj8QRd9-!I`Hl|uQZUF<@UL98~v3H14zPH!9L2a3l`*Cn;V_U^7&~+ zo`5gECXrpN)a}OEb+_07`Z3*;m5RFaVk$Jp)}JT3BNhK8@{JAck5pUVEMFJ-v1vK) zXEShC4r!3b%A<4AdG=~}(^NCp_fI@|^;;8sIVx`njyy5&j zQ8YM_L!_!QUNV^xr&>frHj`+cMr{nSA1TTr{x%|dj}g&)jK+S$qC$9!71k6YKQgKb z<_7}#c@!}Yr^3|`L_vgFjUo;CwKWevC0?7TF7Sv;pvUcPD3qH^Eg6RDpSh^N#pK89#YrIZ^22dWGd)i)hSt4ff)S2Q3jZk$m> z&k{oeXlxKU~&H!ew7RHu( zPGRkcZzxij5~-B?D0**X3$qBah*?BAXe^g*l?pfLKCC ziIUDDf)(O=BBYfWfjrFy;lUfC!D}CE5?fQfdf!CD@1&+dpN&$&^pJUrXb-O zc&6V8odsK*Tx+%4tHlANj4?=MeKiI!#eu}B(beqK%HnOT@FxXD0mMu(*K|C|`s9aL zUzhw3mVo+2p$lhCuSPs^lKbj8eoGKH5fPV_2yU^|L#WeHjOjS2(s&9*Z)dKN^74`5 z;*pAqkz#*&xu0I*$HBqM%7LKr-d|o+Tv1+JTu%M{3^}>iN(G>NR|sJ_!7(lXoTuT% z zl_wpE65xZYl0J_}&Q&_11_XZuqago#I`8t0Vo&|z(TRTVwiV-Di>9Z?s5^uS7HPVmYz4}^x zyLJIlTd7@NH25|`8X@*JMF$cPyp==1W8`J(3+Zpu16m;Q$xtdfW*4H-x+#Qu^pI{O zjyi{nLq@QDYxVuBzxhqP!AqCM!U6fDPkaPCF$-hib|#X402VpeOK91y2dg6avK9*) zM#Ia8;r2^x@>t{g?u{9hxo56E=Q6wPl5^MBv10c~srblwTMx*`%B#!T2F{t5x1JX) z`t-l-ZfXnJDAC|B+KNXcr~+`Gi$n2=4C@55AfTR-$1(u1L$H_xo|cPE84d9mi;N*F zIxbG}Xrq+BGE|@ygKTZc7@{0rY%Q1;L+YEDqDbjgSeTUsd8MQfNvN|5vVwjujzAzx zz7;Mcf+dg$=VLCpaDj#7CTLm|0Tc@l)+<}JK6!;5Du!rpYU$}~KL6^|Pcj&jmhRqW zFj<%GNlkU9r>3T#^AGWn(@r?y^wUm!J=`TWd2SkzUxcsHleyQ9v6{BtvBkZ;i^qDy zZ!B8|nrs!5#Y|}ceF<_d;XzPKQHg3PUI3!tQxrlSQmi3jE3G5U?hk@Lu{DqE+I!Bf zN2CGy>DOOpO^8@{*X+mQt>Rz6bDS8-0MBIEfc3l^kqZ|i4DA|Wldv6UEpeVZ6xh9M z=PBDaZ`!ze#rTquMSVTp9SB8OTZssM0iVa^z@ZeIrd;UOEHj46RSShLKbTLk^bwvF z*)r&-!3AY)BHV4>dR|yCTZQst)+B$l>Q!|!qx-4~kls)($8(Wsj%3Q%ZYul2MPHSDz zX`{JUfVT?hCk9x1;m3;jnWS4%Frqw~YKWj<41dO?N7x=Q^IiD`R`ZqbBafgV635Ae zT_}oH0=ojTFQ>$tk-ifZATkz=-FZq#EJ+QLRg0Xta9%?Am)qo{YJ98~9xRKQ$`2iq zLWp$rXXg6PN91={M);2uHtY1F#hgdX9u_>}A@SRMJtH5lNPH`bL&43ukScs4g{2a&ei9i0v_J9Nxc)j-E_z*=r(JYW&zF>&2(Ty4o~E`F4;qfU z&z2C=4(9f}CgdgZ4`92z<20>)G^90wC=4Aj4T!uSZ=)Yt{c%d%uZ6qtw)_Km2@m~s zN13jAwod-hLePV2&E6;Ei$5060-kaZAGKXrE^HCbKs<$mwC-MZ(cUvpnx2{%4%JoU z<3JP~u4#@rD2iDG0wcsgk^?E)DXsL?U+^~%3l@Fs->pU~?^T->Z=vy9!N>1V_>4HD zlp3VB4GVlbfv(Z3j^4tLEKnr+n0z(eX7|#&cou?|*?4@m4_%oAPtJA(ZqHn58w+`lQe3QE(VNr5C)ob!0XQ|p#%s{RZ&vyN?Ix$2t!C6qiPCu zBrmv@K6EFNgK3zOuZ< z=j(1dYYBLLeRghW9B|jpe#~aXyC4fAA}L}xGlVe*9~z`iO#xVh7e{P!uJl1C##O{H z587N5!(4$9fd!F4j7#z)FOaqJwT(3m`*z9CSlR98@2_d8DQ(Z~FWf$mT(hFSb=Rd^ zSB~$!Y*Teji#OO%TTA|Ln*J#oZ{ogfn*1ypZ{fcYxLh38ToHnRNt>(K=X$&3~`~=0iqnv+;XP7 zX2d;3&#S9P%A?44F;OuMwC&Pc2ust9VMFy?OG3oP zP|y#%Lgd$&W?xW03E#8s+3SRNp)dH2x5~K~a?yAztXYPmzneWId@4Q*t-*|yCq>v0 zicd*Sinm~Ii$cUxqNG#vId{VV~uOXqBThG(-eMs%^LPwIbVEs<_#&AUh+-r<^Pa! z!;4ui^9bThKlC2T7e_IxTSHB7!#7j9Hyjg}%&_`kwL}t}&A1GJjd3s$QHXrx%hR$a zA!jC%!4VinasQM*XGt)j`rzY~&_i^3FvL>NltIXf%{=;0hBNa9>& z^J-WLuUo_3pNo=MbRhrmi?e%>XE}r^Tts#r4_FbhLm8pA})R!QXgbHClk__XpAMq^m7*nc$ zGZp~K1!$0ldFGoGlQ{$MMv07F6W$?S9^NrMjTp{IkfIWoDE|bswFh+ksAQE&8b64NE~puDCPVQkgQJ&r36vyhRP?%@g62>Uje`q0W}XxOiB_#N zpUAHp^n*Ea0aiCsUG`DS@NPoakpE_!Ryd@kL{5)ki^XEKSW|7O%CJc2rUXT%+77>? z6!x3&dq03Wv*|3+jU36W3Mx(b4oWT}$!*B<7bh)+-KrE8>rki_@$9frW;l_L5 z!}K7=$!B<3ocz6m%hv6$-_kYEy|Qy?ea-r*(&fzq`?t$4=9T!$A8M(o2(j(!|Lfu# zUR+~2l5_gv))RW;RxW4hfn6n85XzAVuxweQ>EeqMdlJnR0b~Pwqst{9jqkz+9FvoU z4&-+!gF=s73S=r0q;Z_K72_>tt`$XnLwiTFIMr#(j=*yU)*6u-3)skiIX<4 zD>op65=)@$N%)618l+=?MthH;y-boG;1~0)XX$3Q%(C+(;}rQNvTw{sfi?noD({P zkRyZ;LI~O8=kxh|zkmF`@tXU7uKQZv*S=p@ zswo|~w^VYKa#2uJBYuv2(m#mn%kKZ@!GmY~{IfdW|J@}2H}l?neO%+%M*inU<%UPa z8S+QvC2yPaA_HedatmUV?bU=F;;N}JkxFUFXT6mS3i<&CfSOre1G; zQ9id;`tp2vt#Y$6=y)fX`_#=XQHlAvvF1XM&cP)O^saI=W$^as0jKhh^x!l+$e3IMa|@Q1SaSa^#^`+)tm`ALq55v7O;S_L^TS}B>VoQmE z#G0GxD1<5KO+q`37crFLHp%jE#cb%T_R1mxxR5z&mCAYT6=^xY++*KSTKdcB_PC6! ziea*nL)*J$CZ1YRF+Mh@TVKkh^#2`q8~u7vX=&q=S{>J2W&A6@aQ&NN+A7HjoKJwC zS(U@=let`q`)hv7+X=^bJJ*Cn(W?Q!H~eUgEG=z#$cl7j$dVbT@7Z&7Ao%}6p!~uq z&y8`-+vNx9Rtm#N;-PbOStR#9(ex#AXi;NY!j>Lra)v3GsN=O7Z8}fX@k$R(NJ*du zA}(@SQjzQ4Iw$R1782w(#_26D412FJ%wCN191h=byFT#VuooJu+%;iiU~0vlpY8;+3_ zav8UNk{Dc!Kn+bLy>vq3ljo0~*fc}E(W~(X-EYasXR2FG(_>rPJGh(eoi^)@`~I}% zM)`?4mv#Vmjv6Nk0-7K-+<$2<6*{`Lff;ixk7;UxC@O1k<{yhU0wQbYz z%y-72@2mk_Ot5GGM}_~T>hjVo|M#w=-^b=;U(O;A)4qAXxr^+{Io#$>IQCzAEHh3} zz@>9s-RW-}bjHR7Ej`P45@BJ>~V+Px*2Dnv;Jt)9}c?EtqDL+_d55(WJzf zXiFcG{RH_mAwHpHJ~c5zPGxb8n^)x*!Swpt&BHfZkC0@CZybKJ)wyNPd9d%x6%{Y{ zUGL^v{L=J`$frIXhF_xaiy0bp#}>Imubm3qq~|Y?&-webk&FC)P&tQRhkZWr^HDFp zbaLQf!lmKGV0_!mJeOB@j5G~n;ylXBElf2L;aa(ONgW;Sj^ji-(J3a{!xfQE2^WZ- z#+YDEb9{~G1QLNdH<-(|9Zn3Iw6I;?bSS^|tL`1)A*0E`k>;AIn%Ef56#3P=*xj4$ z;=FOuQKqdM=k}VCOt6}($}5XVjD)njsWFVq=C26~Wxv)~MQ)_X|EAB|>w{wX|9(=zismY#)eIM zC`p(b-K3z@bMN*I^iKm97ABA%m?lV(rXo$UZJIN(%tHZl=t|3MbNiuxkoxo4QD5i$ zaL1UdE~;DkQ>%Zg^UrznjrlTel8o}#P3ir7@9nSkdb-aPmaS3F*|f#hx^71?Q$s$a z$1G|x54HVhO9%SM0U^=?LS!2uXkWWRn1)q5b)+aw&jw`CdqZt3|Dz|8DkjwII_GHd z$ftMH|LGCz|8#ZxKXfrnUp6oX5gDuiMY^O($n+{DQs9zzLQxJKyOAQ3A|rvd$plxN z{CL8IroXbm(j7^VlP38e=H8Dzgu}&*ciiK;WBTybZXf;#m!iy&k=soVxW!dnu493& zJs*v8Pf+d#O8$U@{4I!+{-=zq`qc>&{O25USx#u&eU9rm@nHQj7WWqf-8bVcHST!J z5fa33>8KIG9d>d3o9vFO;A27(@tnYk)v6^N=LmPhq5Kyxx`Odqz~YO_y6b#3$0^F%)lT7I|ds?KDf`Wt7X8CWF zXZbtpNDkX6muLHLP;WPG(N!bP`QW|zGINs2nUnmVowLi`lc)U&+^4rjO(t)|vj(F;)MmyudWB3urVKm6a70l&i_pUwU!IFB9v6ZEF8{!Ouh+eb$ubDe{v; zeb%b#uBOjgSdiySOC;+kNsraE;2313VZc`#?TP?Ri73YWoP|*@BH|FKC+9>*)7L((SO71 z$M373AOMc(v6DX!I`o-7ar;bhl+wA3@(pLRw2Y+#7!$1=R@0FP!%3GUxbOW#o|@i~dt*=FCZTXe2gwSo zta6iV!*cpZce$4fdHp|zE*FwJ?Y#%DIij0%@e$Vz`EM9M{*uEt2%C0(piLJgm>;HN zM`;>Gox}a$tT8*P1dU5H<)>~TmXsG75p+@G`ymlj*%1z!_R&lKWjBtzM5(E*am2p( zmrGCNNWhIRXg{Wyddtjb&}T^I#vs#BId1zgqh|dfEQFy2yVFuOQ zwzs*CxlR`i5P@1OG*Vw*nR@u>V{*0s^! z#fa(enz08ZhQ=qQx9rojkiv{V&s5NzWbCOcF^6=?QLt zneKQCNlj1PlOl`hZZ*7igovH#iZu)`EtTr!z7MvPY`y7-x%uyN`d`cGc$l>vBmvX^ z;(#Wu8IuJCwtUCm#v}r{z<-thDz)7I(Io#anLo+@^(UWxYSK^}?r?Js_1_``eNi2_ zExaJ`NNa1_CvE(F^dq4+HSFY>2ayST^55FB1`k_cL zY1FT&3m&5`=q&CZvZ0VM?DRY)AF~;*PBXn(Rvi0sl*L8XCP^I5B&^LeoA#Ld4qSlDyUZWl)msPDNM*IG4J$N*=Y1f>1qCX=kr%Q*@u33q^XC`EKEp4gZp*%A&JLzx}t5tNX zHmM0|aTv_$S{h7183|e4I`VFkOGusfw2rZItgoujB$$LGUn^f0y{!1m?9gv^bjGTb z!%eh&ubr9{7n6_>NMrGdS-HOK#Q4DP#Q65DOuA`0*nEcEs!JFN44%1Q&QhqPE0RJS z%&qhH8r$06N?umZkj8zwq;=!z#iz*DlfF6WO@Fg7<)X^o>fWjh)A0J*+WjmenpQ zFau9POH#(lCjXL3=9;?tZ)#zioL#5x_P;#on-Ooy#HOUf_Nx8tyP8!`E!Mr9eA3V%T+vaJUyxty?&^tRZtwT(>MaPwUzMAXRgyf=H?*ptJU1;nKC^w26PH?)F>;Ge&+HP|8uTk0 zgZgC-F3*gt9+I7zl*DEpUb2!C+7w5$={7w3RR3L3fh|Ln&l%z!`H8%NUL5l)xh&ga zW}7K;O3P_1i?Af~$?gKKsq`q!UFOna6d^Z1pB+ui+8^Ot7DFcGqTVt*{2BNl;GM*b zgv9(zxy3&sEiXB(F!PYVWJK@5Mow>3bj*#I3YVVt5e=_vS@sEa#mTv;bc8MkgOAvGqaD# zhKWg;Il&|@8!n}u9&GAqu{)3!QqHI-*D{P@J>gM<&zwpn?ap;(R3H9AJ=fyP|E=oR ztX1%+VD&3lDru^Bs^8?(P8~D)q~Svb_3!H@DMGz%v{^-X;#3t3{$rx$1gWiM%4_-V zrozyb+)3GqG_yK%$w>;;o26Z|O@k~mF^jsjg?iqgZjoaSHQPej5!+GeII&Ca9}PRyb@PNG`Q_L)@Ns(q+oXP&v#)1lunaY?DR zH{Xn#G&eWB*Zfaato}-y?&_v(6j$7jzRRrpJlS36nax<~c6VLqYupleHREr}$uNbQ zc&+&Yc{S^;Pq5D^EU9gQX7j|=qvqEC!QHIY+{{4t(&kIdz_F9tv<_QLxpb8}r8!%D zMqL@)mk}7y9>c?3yzA~J;%h{{KD1kla*6_*~P`#*{!kj z6m@>{NZl6M4z(vdMgGfQ&;3BRJ+Hf&cai=&^o(k$N7Enupu-2by6xDp-O+-)t<`|$ zi*+UgWBE<%nzxJaM}*qcynRC%%i@e3MQUX8C9KhMM6SE1B-v(GmKtFoqKEdAsPM$L z?rxI6ERp}To0vc4Ik^{WzgHmm&bJ4 z10~C9u57nNeN$GC4FNeit0B$v)Q8NQv~$h33TO9@YaT(y7$+!?=!vo~3q6sCL((Mm z&_ZJWwWFQ>NqzI$Mf7)0>8pke>Kn!t?_q}1jNLF#XoLTQUh_|p zqW8=(>PFxFB~N5O(AwBJS7oy{&&JM#=3UG_5GQhz9(*WHu2p5t2|68rmbhV&OE;E2 zIAIVRyE!5#k`5&*l2c`6SzsTn|A~V5PCc{I^D|UgUPflY^aTmI=~QVZu2%YYG$%Jd zb2zM7=6YxvCXi|a>p{>>SRZo0j3cw%F>n-%|GSU_{g1F8|BY`}&BKJ*7oJ0y9Sr!d z`QRb{Wy_T2E94Zy%;)-#J(Y;nave&n3T|N1EIByOe*>3)rkGW1vT3_YyxJp zn&zl$gJxU!n;FvI@-u_!zstYKzDFg=De7Bh&Vy-}Rd*)}&nV$dJ``bQT>emi%3cND zn4%u(83h^Y+r0GX+?)|J5`Au*QI;*F?E09ptCf@S5G9ru5VfP zm@_Wqg)Isn?%Ysw{w0WsEElWUtW(bU^|A-~OxYvXx4WX|iuOx%PN$16?qmio zrFg74T;9!mX@cnDhC@3uIUGa#H##^wNMIaqR7JBHC>xe0fl42G)qn;qKao6mN2TtXmOYq^^`7Kh2)EwT35V-F z($#D_$OWXnP`zg&?T_!4zpQ4THf}M&qQoWYT>0+NWo`n4ua$7gDPv|%9)HSwb>kDQ zAIN^9utPgwta^jD`}rp_+-Xki+xx zLxonZnO$XXz9(44SITSpmvza^iO9|BK6ug@nH9cL&rnbI(jLRjUSlO5Ra4~MtOPT0 z_?!E`PY{uZx1=6$ssL?or;wC`wS`a$lK z3)rV~I4zhmCT>cvzUqajzeeD=DTlt759rlL>AA4|$C-NdxDnl4J=duH@-_Vj>N3jx z-)dJ-?z`nrs7>+DQBJ?)KA|SX{=-cQQ|^36n5{DF3aXE6@0gj`V0rUkiOIA}^r}!} zr)7D=9;*LBS;PGPf1{k)kF2*KYg+Yj+jwTNd!T(MM_ggrcUS0J4z=$Ter=NP>&0#w zZBzaG${05&gX<)YDqrqCx_oImPWkegYL@5f<+zzs%{aFy&yLro#+jC>Uk(kGE6ZDy zE02;+?$fs&PA3U?_VX>-@9Ep-b#vRGN?fYGkvsLv=xNcG3zaLE2Fn#4b40mvyH1u* zYcoEUT7A5Bj9F`F>fNVJy{nTcPn38}eJJnIo87QvMdXRkdN?|-ALUbb5r^42W6pS( zd~`nFeB69~F_Q=H>&wZutjzl_=5aH^f8zW-@`U+Y>*MF|*Hs^Rl}}e9W@W zI;G34?zpOWUG0*~^?gU_sTgxbXMJDSm98H8WLMHB`(G@({0C3yw-c0I{xh3LDQXQI3Cb_9c0rd+%1m=9yC&1oUD zA6q4aw)b0w73`a!s&O}W`q%ax+d3{aI=@}FmwJ@7DQ@iv@0@4s`b3>17wXER!qAyF zc&M&SdDH8bksry=EQn z8fyY=4Kk_wLf6-{M8xpeSj!5WSYpLk(Zvq^>QHa8u*J%hmIn&T{OQ&GJJS9zZI31} zZ4rG((uPQB+8+fOfp&;_;=(>PM9yZv*P*`SZ?)}%5|~osaPxams6V4S2*e@1+T`!id*&ydcE+W&5Us-^p!U*opBWdHp1te&0X z@n@&}bYD{aw4w~R@vp@7ioG|?4R~pRl)0f^92?ClQrw7$e5niErsore=!1 z4SDsscKwFvlEdEB@5a4JR8vM>dptLpKm0Gb8S3X_TphTjX$6HU-9SC zGluj(!k=kx#vS(OGrHZ8Vf#Pg&t=BVc8C3G9ddIK<=)$jE2puEyT*;r9!HeKhuT?; z!87|e&D|Y0#@!vqysb?~xVR`cC)o1xg#A{_%j51;W4tfW+mu63SeT7Yh$E}zd*hO- zRO7K__TtF&g!KIU^q5xJMJA10sQOZ0UW_0`;w0A}0}lJ6kO5`0vNF_WJk~FaGUFL{ z2B9dusFg41p|Icf5N*s*vx4OoBTnd_K}m7myv)o3ZY66v);muZ=H$khf+Rnor(3>V zNcr}@zWT`W&FxJMHf8gFv3xTPj8KO#ByDKSZ}*~h*K`jSZ$DGKr5BRzufDnX(rL#O zZ%A_ya((bWCYPyXTW**-qTIcp&o%AXz~Gj#Zkuyrs;=Gmb;KEO%yPv zFxE{0!w#na`VEI-KP-@vnQ5@?z(k9EdW0ujlLCep7Me6r*s-v*q)mE3dcH3^m=Yp? zGbK2O(!r74S2^m0Y2wABTAtc_Y|6Orn8qmSLyCtO^SHm|n1_kt4_ge$qUZOFi~M){ zTE7`A|3P2t1M2_tj;a4g77QP%w(g8Fm4Xz%-A0h2r1?fwLK$w_5lkwTwoRy%o{~Db zZmia=8?P%i_FSVD(H{$={oCV-Fg8Om%o~`K^oB;vMXp(jPZ3QMspa5rU?Z|SlJ0gc z+<_MN3<=XsOXxo+&K>w&G_Y%Qj~>xo%_s`)U9Ao<4rT6@qyHCl@EEJnc|3dfwzT&^ zOM7k6ruiCco%&hKmc8X@IZs|7GJ1RE`Ldqj%1Lsl>?6C2HKH#k@YtfXZG2@<#hIYV zWoCNJEsL{NikT@je-e3`9r9+#pvX+;6w%N&Cq8(hm50CRGG#|md$Ti!*|ti@WB&5T zrQH36>41Vc8;v1|6iz|qXiX0%?F5#4o1M65a!(GV$%xe{m7Ld`TxK>kSK}U3&`6^lDME5z83hFTse% zlaM1|w7@YTRhg2qczE|y=XCLnYv**xFYL(Vw@NC`$g1qtg)~Ql+mn(R=0wFgiQQvk z3t|(xrN(5X*!g)e5jvWQZkd@^zO=fiSH4x=N_nzkT9sIKig$>WSh+xF_B&rE4N7el zUO`e{ay^U8(q&ez$BKwzZqL$ogyI}u70+_E;%(OS=(irgIwd1qSCcByfigOhP98%U}iWkM%sB9+S4I1 zvz_C}souDR{N#8}&+_$b-?LqIOmu#SxNxu13F+Rbgruy*@B)w5iEm|lx>vA1Ew&ZM zdBk|5R6;?!(zp^&M6zRL6{b|Sb~2SGJSieFIV`?)RJo_BtSYR!hw2uV--k7#32~mT z6AHq{X*;QZab~g=mXe^O(^wxL?WC8*Td5u589PsoVPl`Nyg5nQPOu9*l&gs1Sj(Gg z>6nO^&T-nCm6(#QWI_ZR>0|9!UDz>EXLfXCmKBw+Wvq?}v!mm)irBZF630q7PeeTD zA-1dZIoV!Ml2fIVdd`Uo_ez}}6PuNw6Z7LdEXegb5y^4kS)FBtou8f&X{n_2vkQ^W4;Vs00mx5GR+jv}*oly`W3 z#rh$gbcN%Mwi0YRnj_X(DX3GUq)r)G);TG`YiE1o&PWYk6xY5sHG)(3i!uuwZ|evd z=ka!nvFwsWj(_nK#93i!;T5-Zsn(}BPWSeXnv?D$7$@vL!Ub|Qg z>s1~TX2m9O)KXShs}y$FCufAEB&R1Sb|RYs-e3k7u_%oh8ktE+__CywC#Yfv=5t{uc`B7GubUJ40#EylUT$7(B zBUtjAo|2g5)p4E4S=vhVTCv3us=PxX`A%nKn5FfeFp7|5Z+wSTE50nf1dij}&m4LfC7g&~&9FOXqYdocv$9jWlD37pnQ18rG2xD7&PFqdys(HG zmfDl!WJtr65SeE=5mAv5 z*^VbhXUno^naZggRwQ+Xmc3P6m~0ypAvq&TwYDgataw{@)%ZlKeqN8Zya`+(W=A^_ zF&}!utmJ62eTtPz@vW%Sb!vo_q*jx;b(7Ja)=g0Y89v-8ij0bItY{T#>!fDu z7?0DId>`$}*HKPbq*WLer_zg+3XhhQiLJFAPtI3Xhd4{e>i@a6QE~MD-`hsB61FWEE5vU3W{jL6y1vy|i_&pVaTI zx6Ihs%H}uZi@KPeU!plrAIkyfT)Qe$#++xxF* zm&?C)9R_sG>^h)*`&|E%7j^Y^m7G@Wzbh^+El!>mpY~KqLfr89#CATpu$}+wfB_lL z^UJOS26X+BXSZ(tJK|GQC<+L&NJL5vlo#lSw#M~Rq1cKS? zB;|g;m+*bB={>Zx&|~i93hAi`Xpw8H&Wz6o>|_L37?}$LM`$*bVscvCLWF7 zjX#Zi=3AHF2Rkn746dI~=6O82qHaiqGU)R=8H2ux<6y$q_}M&X{swK2`fk#Gh)~)w z_H;S{ZBRGgq1k`EmdB4oA&kLt5~=NvB4i$!jL>06!p; z(UTs0&*mBOPbl9Sy95|nLVm(8ZulC%7@3Xz#($xwi6f&oF{p;RTV|W^&I=NfsXM=o zSwqWm&V)xOOwH5SXX4Mu-V4IP$W|15Pv+SdB$)6v<+w3t@;hx9;5QQ+x@45Dw^kVEbei{d(z{Hoq z$YjFK*lp}J{;UI|*T`xYed8u_H4~rB z7sDkm1E#}1zU#yKLi&Hz%&VB&1V#qZcyke$uzVbh-)@JiX_Zozb8mf}zX_V*WB8D7 zR{{Pv{`*b68`1M5kUpE+Ks+R35AkN~Z+;XAM>p&UzvfrqPQLvB-|42EJD0feWU@60!oZ%4stV164rOgx)7H~LLEV9E+(M+oyhgfSB;ON_fFT~38q zF!l}ylMl?(=o+zu?&gj9FvOlsV>U+>3%D==6U8Bj2xK{Q18{ zD4hS(rwQj@!-TCN6o>!m)5QD#7N)E+nDlZIl!J+TQ%>~)Qy!YM(G^UZZx7?Z=r`%Z zs2e?ok-^^~eMZj;cmZyLYk;yu+z3YfHlX}CRKNdU(C6QS`=*@u5ls280}jAJpj>ID zTxs47JJDzIu;Sh5GyDSRbMvq9|KGrrCI5g|APq3NFQ(lDf z+b6smJ*HeR=8S#Y!PsT;^fep@_aM(dLp|IL$Srn3;CtOM-$Uj@`f|`~$^i3h1ry*; z5K;^MHc#_?V2}+w4W{fdOaWu(TS1Q0x47w_s;&XKnsC2qKV@(cJO$)w|3|8>5kEB2 zmh>-yiG(Na`w8a;{O3OlhVlLb5T1TyJ^Ja7N8Lc0YkG(87pb~~l;xaJ6i^R-Z+M#D zguS1##{Vz${ervbX(ayrcfdR_vaN-&fPeh?KpoNW5YH~b_uZID#s2s4?>2ZHkU79n zV=3mR`8E-9!L&Wj0~4OqZ*E>I<7x6&PcUujUrU*d zo)hVBsjuaG$ljx$p+1@0FALgh><;NWUYLcx{nqnnKZNuf^_Fh5l+*Q>Nk`=b`v%&H@~rO4=jY+jNL#yxp@|Uv;U}${akgdE3Oltg86m{7`@K{VeNkV zfv5R)4YV|8-aiAQ4}XZ;A!H}vFJ4Cmdah^+p9iymTSaJFR%_g9Agt>vX9jZD&*z0PbOmi>UR zGdrFoVW-&EsV2fgIKWH}$3g2gEYM=%s#Oidi#-Zv!cy4Hd=Bpp?+)?ce9Kf&82F$I zjDYE|1XjTY4!2(n+gap-xp2&duZE4VO^680MXZC(EJsa+Wv~V|0cIlinl1UjH*YC? z%a))pz^*9lib78mdZLS=8YaR*z>Vkw+*XCYn9Z;gFdK{6*j2EBgCH}Z9BN?-AZHwY zidzp`gos}O>j3i!`?#=U1fZV8GifXA2HZ%Fg$;mOGHNO4Pr<#EZ-q$h0=SpT_p}P%xd9?8Q(kL=pBC;bw6d_y9MHakCgb#YsjXk|l>y28USU_K&Y9ad01oZdA&VH+f=)Vd!2r-}vMgiXk zECs#|*a)~YV2=<3*8%bm+$ltj50(ICYcN~06?O|Ts1%mNT6h+Az&;@cR|B#So(s!h zJ#2wpuwRHFUZ@eGHdTnB)(CM@KJe`%%$|hZCp8K&G7-=-axX`v z^@H(H4+n%8wUKKBv3E4)MpwbNLYz_yQ(z11fIUKt83FiX%sSWvTZO2@&AMv9-a70W zJ018oE*9{^IP{!a3TuTJkKXaygg9*!VD|(IP@jPN6HuS9ONi6?HW4`|@;+&%5N9L; zeww@#_6sp(i4aqvvvq^b~S7kVkUZKu7*Y- zW=#}gb{LEoVh-wa_6jk#3h?*bjY6E02}^{SX92(G=ffJ#LBQMs++45{)(deiX3oXG z=kYv`?+dYOA%0o72O5Pq-wT*Me>3caZ-rQdyNlMsv#w9{gt&@0Tpk9vv%Cvn=b!3f8}R*4jY3?#Q;2KI zp%&H)u_7PPvtpkR*P?!HKNtn8;eZg=5r5ZV?s_kv@A@r5tjvVPutSI&ssMX#ECIgV zR0DOeUx-ypVI}Z=)w8foh?|l9&$U9_f*rSD=9b+;+?ojZ=Qayg2yuHk5cX>X;QpG0 zfchOM+<{DY^1KVPYv;mFA?_Xp*n3YtEP>rZ+>0Ie?h<0%Iw9`k`+erQSBU#Z0CGG~ z3LAu2-v!nS@gTn++%Lq#$n`LGKim&?2(baP8+bla4x5B{6!k~PLp>~o)j~X01?YQh zCae%*V=+`i9n2NtaRI4-8;{q(L|6#ueS8<}7vc%tpTyjg*!LvzY~uSZ&;8C69N5iY!TwkDX>e3?KQ9t8in}#Dk1(+4RtUV zmcR-j-b#gHSTDp5_7LX5Bfc+oOgr%?!w!ybT>`nyi-#s3dz*=|~uz&YH zAwEfket_MdtcI(g2xKFfriLhLDqy+VAxMu;y^|6;okUrq;}dojOv18f%J zpJ9O7S2chP|C$H~gxH6jce#X87D}*>$3&{BkZZ=qe znTC8Qhjl_Uj)3WajE&gYh~CDnup180mx_gAsD?V23(Ejmnl=Oa`~rMX4HIDrtbxt2 zn^kTCQlS)TU?MDp6|fG_$0-4#`CB1b>n?>4y1)pS4ohGaY=Et>+iZyg^vPq1Djww>=m4E1gTI8H82qt3Ta`+?!pZzxar`gvl|Ww>4}A6 zs0Q?S=E5>q1Djww>=iOhKq{0%4NQcEumaY>X4olY_P|MNNUFuokw!9wDPG$cKI~1#mkWdty+F!Oj@mirpk+oDZ-! z9<}(5LMAMxTZmdB@+HN>N^Z9v0q98?FJx*WU|$+CrtJ_i9oaLA0Y7F;hh?x1w!&T^ zGsB=5YG68S6EX{Xvz7^&-33+)nKM&JpBHe)*C=G}a##=F3fT%XdDX!0{KbI&{9S;) zf=sA_@vsGz?f@fj3ki`}hLoLh&!k~Dg zkgXE|nOiT0twOdbhZRD$MZGQdmtbGXP9fW+!VV$ZZxpfv;oV^&Yb*uuUOENV3fa+u znL>6#ty481N2krOTgWo>mTh9)C2p4^Qw6eC)WC9B58Gg`ke#ukvk$7E4(b6nJMR~= zG7-uFdn=a#c2^z{vP&sUho!Ivu)oVrz)V-{>xw&Fai=Tpcikgow~4S@$nFaPcdNPp z_EoI~?5x@a2ZZbq3&_y}b3IV&xmw6x0wq;v4y+ck2AKvS_uzg)4w)ikEp84&?+E;N65mhu!FC}>;r?je zNAHAhg*;^kpm$8Bkad=jV`GIJ7Y2MAUjo=S9(%{*-f2rE97}4fK2D1PW2%d*1$^O z`}sat3dHN8YQV3H2!ji{z+6}l*s&OWi}}8I3M>QE7jK9CLSC2(gyV%1VF|2(&9Ga@ zi!3OHTEM=GaQ7nQxM-J<7YoP-zFoW+*1|UUR>&o&FG2mXenMWcUdZK`TfRfcKUD+2 zuMUIhutmsge1P6-u;UtJT7j7rxN&U>tP%1$p4Z{t^>u*R>l=k!i9IWq!baF5a{)VU z+bbmfC3!n;-@Y6U2)PC~)=Y#IfV*o@yQ2ig!)n+qL zK<@@**nkWh*1--TA3^UUU0@2-3;9?W>=be%-ya_Z2ZVeAd!FF=WF27treYWY>xFy@ zS)ZyB^67j)&oih$TP@^ss6Ef~`87hmPzu=p!e${iBiClky;uvIgnVhMkbg-OatqIw z1TS|x*c}Iw?Z*MU&q|*e18Mk z-{AL~=zEjzZ|)Ov`wk)h-Vb=vHJ0cA$P+kxbw*-AwSK8bwYlI zJ)dnCau0g;V8`dvh5Q1)e6bez{bdQP7jkbcY!vb3ZUoT*#9+l($A3JY!&jm zFxVmF54+)jko)<)KNT>)eCOz{5%)< z{qr^<51{V=_8iy(yM#Q5-3M|1;6lL7Uwp6{_|{Md>tVZ)jTThH8X=qVVH2RoF93ah z>~BU-b3fQ5%)W0WieWsg5K4Ms6+8>Og;Mo`QyL*3Y5+B>8YaSKq3m*4CzO*3n5XTo z!muxlZ{fU0U?yTF@GTNMBKaN3?@03-yaLb{yH==#jY1`E5-J_FblgqfB2>moK#ex9 z%0#xzF7#7`a~iUpDkgFxh7#wBKMH2H#Ga^R!5LD#WlN4e<7xioLEv3-`%zx-ot;5~ z*mZSikb}OeDK}jRI(YtcaJC+3xn@rs1x$8{&3!(3BE^S&uhVV zbF$X^!S^W9O?(x6kLI?Rd?T?Hj`;zyXYieVnl$^#jJo2O*tNlTEy|_26Wyp===mb} z&aE@b3BEhb+4_R-9_D64c7~yTPf$Ia_btKqNY*TV8hrN(A9p4P?2i)lx>fLpN%4)S*+S%vdn1WBX2}72W%e>er{c`C>k_3w$}G(HHoA%G7!DXUv)Hb4?si z@6b83=lEvK_f7KE&zm%5>a0og&i2hY(>H4RRNv4!i)PH6Y22MRch0;?_1M$?D7lXM zIlaDqZnq8{>gUX!fA;z9XH7l&ckPVHQ)kbgI>onO_LQmfeDydoeD2iQz5#P)*ZYDW zOMK@ZlDVUA&OG1DN%d3b1#Ox?dESh<_4C`$pE0xjoO#na3?ER-`7LwATyegbN9vkJ zpS)i9#C_07lyd4(1#f5Y)yK5J3~@Hpi%I+%f&MxCHfHCL{s-`7p8LhvH$_ZE&rtqO zL4ARkB}Vc-jklTTnTNgYUHdCUcibN(`iVZgh3p8~(C!EuLSKEZ#K*dD3NFkO^Kowu z#}4{hxDhh>TlNlhP0qpW4D9i_zNvS8Wn7!(N`5x#bGVhkht$(iHNKo97GYwh>$iY( z^W0D|;ZYxyr~Pk)->-+RiIsZn>?S(!U%e~md_wPaimQ1ao?n{x!5`% zsZBi1`bZe3F8ou5%Lr=0!C9`D?=b4amq)+C` zRx*#Y(n)Nml>IyYd`lL{LUFAu5)U)tRVMyTIbI=)Woy|+be3(!9?>96WIItQ+sh8J zRCZ*nY=`V5-X@0Lk!7-++wwZgN^Y0!CcDV4vKuEbbr)6QU$RO(BYTJ*l;B^;Ub31K zoBGJUvL88XhU`yDnJLba1LQzrb(UBoYeav-+Ao=;l7l#Tf1vnE4q@P}M$DD9a;S-4 zIZT`*hszOMfHYVflqboN@?&XAMEXOtBu$tiNGJX21iL%Wc&;CwklTp$*UMe;0pwzxyi6c>s|#L41o za@A-#OU{;a#3^#F_*^u~bL2d6g&4#64)t<@JXf$@LY~LC;U(f?xscPS7Rd|bVlh^X z;}nRC_!vXQ@GpAR)B>%!G7B9=c%2&9d z=2iKc{F~e+UzcylH|2Kucli(bmfXSZhwsRD(W$?uYt=@zRVAvOYOgwQD|<)PNtLN`RiQeoO4UVmRozr~Ri%2Uo~oCs zR=rgp)mQaX{nY?9P}QhGYOorjYSmCRObu5f)JbZjI$4cUqtz*D4C@@ns&VR6HC~;j zCaBZZL^VmBp(d*-YN|R@O;gj=40V<|Tg_Cn)ND0J%~j{9d1}6@R}0j+>O8ejov#+D z3)EtDp}I(2td^)t)TQb&wNzcM{-FM-mZ>Y$m5Mti)t}VW>Ke5|U8}BB*Q=H426dyl zNv%>ht3Rt-)M|CBx=r1#)~Gwwo$4;NR^6@cQTM8K>OOV9dO)pL52}aM!)k+iL_Mk= zQybOe>IwCv+N7RRPpfCtv+6nZym~=xRxhfT)L+yV^|Jb_dPQwjud3J7-_$nsx_U#s zskW=XtAD7s)DHEwdPlvhcB=Q(`|1O=OMR$5QXi|`>J#;;`b_OnpQ|s_muj#2r}|3$ zOYKwtR$r@c)VJz8^*!r@_NyP&PwHoNKpj-Ss0P)jnv`EPbIpO|D09u30k(FuM~87} zO@xlrULB>Qbqwb^#OZj=QBXQbC+ifQs?&73&d`}UOK0mG?bErs71u83>jGVKZ*r57t9;tsbg}>EU{WxJ93&N9vRHC_P%AqQ~euJyws?r|R+gG(AC|t|#hA`V2i; zPtjBLnR=R@u4m}8^x1l*o~38&IeM->N6*vqb-iAo&(-JYh5CHGNME2A>kIWo`eMCA zU!pJ7?5Ee4>p$o}>Sg*0eWkuiFV}z4SLKpWp`X;?f->mpK^e+9O{z!kUck55|r}{I!M}Mxr&|m7k`k(qM{V%;w|66~pztP|7 z@AUWj2fbhasDIKwbI(H}cfTf!6p_kFlj)pgoT(4!gZdZUpc{3Q=JHMM%9Nbzp)F2= zvmDD~g<0WNgcZqYA5m5`=NQLYaaO#QU?p8M4pynv(duNCS>;xR)!C}Fy3nKPCH_Kx zDT}_!1N0*9q8}6|T8TS_OB>DEMRl68hP*_vWawa&DrS<|f<)>+os)=X=b zHQSnF&9%<4=2`QtdTW7ou63TZ&^q5*WL;n_wl1_TvM#okSeICrT9;W%t;?-HSbwyZ zSyxzBT31=itv^{;Th~}CtZS|7tn00n)(zH;)=kzb>t^fE)-7VGcush%)z+=z9_u#i zc598eT-<2gVclunWv#XDw(ha+rv}5ZXWqYd@DB5 z?z%?ga*EUqVx{0_JldUW#dX$3vD$iE{8`*A?zWx~t3;UitM#O{$$H9q+Iq%%)_Tr* z-g?2>Y`ti`Wc|h3V!dqr)q2I+YQ1W`X8q0DX1#8`VZCW>xBhPZ!+OiwVZCj=W4&wb zwBEDcw?43TSsz*-Ssz=wtxv2^tz~$F*1xQM*1xT!9_E)nGMRO_twkwuLQiWou4KwQa}t*kN|K9bre>UOUQ;wqxvA zJI;>hNUlUX$xgOY>{L6=PPa4cOgqcYwsUNsoolzU^Xz=_lwDvK+C_G;-P&$rx3x>` zc6NKagI#KOv^&{lcDY?)ceX3-E_PSDo88^6vU}J)?Ot}Z-P`VC_qF@k{p|tvK)c2s zWDmB7*tPahdzd}k9$}wkkF-y=N7oUS?lmUuj=uFSq|>Uu|DwuduJRud}bWSK2q&H`+JZtL&TY zKijw1tL&&hu%EOy*-zO|+t1j~+Rxd~+b`Ig?HBEr?7!Gs7@G(e%eXP@DsiP)E-n+Ni@o;C z;!^RF{a5=H(c9i?ziPi`|IOZJziz)_ziDr`|8D=oe#_orziq!`ziaQb-?QJhKd^V% zAKD+;AKSa_PwY?a&+I++=k^!&m-b%!pY~VwzwCYXzwNK>Z|raF@9gjGAME}1kM>XY z&-MZPp#6*8U^m)Lw%=~%u3qUVM?02dI}Ydkg*o9)gcHe0a8XXQ6XV1>aZbFG;3PUp zPBK>`r#fj)x|88#I$2J(ljHcDT&I9waz;8QJENS@&MD3qr_LGcjB`$P#yh7u z6P(kXiOwYF3}>=4#hL1y=}dE`TeBC;oayvFW8Tzrr+RwNnlyRdoY|hjA?-?GDA#(WqnUm&E4_GiV_z2iDvV}d)$?m7flUs;*a*OZQD17UT zat(SG%$`x&v2!Q)*{Nf1XLP{*(MPyHIv56{17To~o;L$gN4p{6j0w0l=CEtwW2VfQ zI&bRy8S|Yn)8$=Va zNpJv1krFM7t^)>^>xv));NlWwtvJG{ILbiFa!NQ&Ne}=@L=Zs}fF-$8IwWb zic7ieO8X;AKl?gac>wj>dw=)hLXw*{@e0q`^WNv|Gu}h$-n=zb0RCv0YB2^>)8>N{ zHS4=YEARCK5!>i4;+|iXp>AdRd}MQP^=lyCvoqk`PyV=9S_vZ9)}t@b{xoz zpGan%3>YU`s(repzCO5rZ?yHZ$rcs2m}4z%S?d!gH}kWB`0T@wo!N)S=gsD6yLQ@W z)hF5-+eF(Eq8;KJZ^NI7Q;YqycGl_k&O2u(&52XvJq_`WHPN#jOM=c&5_HVTnNBDP z&&}q!={XPSndq9iZpim;h(6wvB;zdvNZ&qnGq3HzFaeM`c}X6^C7 z+VtZf2_IV$J{=Gzo>~%qp<=Nwg8rJXE5=Wxd26%)>9 z#vbqEzs+{*xF#`XQn`x8>Sl^8^DN6Ox3$csQ!LXgZJ=h;)>hdR%N?IDOFq}i6!9rv zev9-ROW)28`Ab%An?Kn!%ar+@%{7l(|(5jW$0JR=kxvc+rhU(e^b<-qP-ODq^Kw3`$u~z`oG1v zIALbDsCSF{wy0-|_P6Ng7WL&QpQFAU<#UwJQGSQ?9nyD5-|^|xzeD{y)SsvRJmvG0 z&zrpKw|Aa;^3;>3o;>vwsHZ?Z1?nl#j{@ZjChz+FRiK^%^%SY6$UG>r|BLLGBHO>n zek-#5i|nToWQ@%|3GUdyZuTZ{1`3mJL zl&?^}Liq~iD<-zHx z``KZ;x%A8N@jgs`$M=`xF-yBy+Rf7MtnWAZv-CGhf3x%}OFy&pFYEi~>!M78V0_6*oFPOaRuL}k0DNs+*FWG)Y_Ct~FUu3%%*Jd zce$>)Tn}BYYi`Qq-4x~1X5Zz0!c9{?ZT8)?*>}0_yJ^aEop-suyZ*YqP5-v3KSO@5 z&u+%Yn_eeZiRRm9C$;fHvsa7Wt>JK{iR)nDE1%)}ZRd3SQ;^2WAmeLuuQvW6&V$i= zwX?Gtj#`fn8@16N^hbZ#AKh!=nADQ}`RHzI?EXn7`f=;{QElu&tv~sRsT$ioX^j=} z|J`oO%;a}sY9HUCJKb4YRA34gwK6RRjZXarP^SX1A3bUwlS$b9o#z6XeAtX~6X0+Y z;BfJGxR^Oy%p5Le4i__ri545z zD7AA?>YzcX$%j%04@&J+lsbq|YNw_vwi!T4e%mAfras#oq$}GxC{Yq`n@zx!vqcIp z?bu=kn09Q@OIIv8QPNLKQo!`nk~LkiNdP77*`_jGu}vjP%3G2Gro1IDV8&_53q9nw z%?e=h+vY4?u}Ksq`F0qWZPtKiT()Tg%(!f^Ojm5NL`ivD6amwYLwQ>ifv3FXO}b)} z6-u_VO=9VaEp{l`4z{=frhi%L&r-i_ZqoQ$z>>G=ifxY46O;>F3K}kMagaG?|jL$Z^ zz*nL*orDfCzeJB^5{fpO?OtuN$tmay5XOXvw9$* zUxH17E-4UGYgX03jfKG~FoiI+!Wqk!35VMXhuaA!r#+lt$fI^5G+vp+i=WO8V5?< zE}+z97o~0+Q0nrBQnwE%bs0=oY{o`Oc{>JSX47pbN*_;sc5DKkdbi29O}=f~-zNXI z&qw>)w7*UJwk^WUMm@G{1EwBZz5!E@E#vT)bn7?FWR$mM8!+j%d;_MuZRY^f58Hl0 zAL+KO#LP#!9qRy7pKZf1v(erT24c-eP7XY#XwnG5ScfFzws%12Fa5F$D2(CbjX78JKh%kASJqb|RQzY0r)ifJwJw1Yp{;;{;&p zv*QHx`QyO0?M^N~{YCS7!2noVC{HwuiwP2J{gVCA>bJ~A&t~RtHHl#uuQZ*Y^ z6C27WHk8k7Xw_^equP*~wF|emDW2g{yhBRaSr2!gY!{nE0JB|eZ~|t#*x<>eZCioT z+BI#11F*Gg+6D(;YuB`$wE^pP17&_1DWd+K%xY>_y*qP+2w9)i&dkiZsHavI6x4^m3NH%$u-OY3t`IR`nLn$Y;S5 zz7E~|tY2%ZL5dF$OC}!neaTXI-wGAG;-dmZZ-g=X1APnDTR|{Og#Av0$8Qdy_Cu5# z!<4X7%Or(ytHZecFl~{vcC*{n5Uzy~`vG=^*c!e-+4nSMesj?3`$4ZMW%VVBKghHz zLbOoh-3XxvRn>NL0Eap{R8_9j@8fz|;95vv&^6(p27_N5zaHZE=PR`wc6~6-De0Y% z%z(5%ta#}RGhL?<>Vdx-o!XCQa8)J3TBet(s2SPL9iu9dt4&eve4mh7E8b);+^=w0VS8C#Kt; zRBp3(B-1#ksA2~usw!o>Marb|mGN@l-y_+TP$p&fwkUU|u$#Gj5632D4eppCak~3 z8T44|^I97oHDj&QUK3x4+lRfN+B>6!o_Qfrm=&(`ZnG|%08`KJIw`x)#`3Nkbuj1W z@ZzQ2Id0W!ZFIq0>-4B~+Uh;Eb?~g+@7gZzQR~#NS_a9IJgM|{eOgP5&hwb@Y1R0o zYINxm(xp1*e}vZNm}#^=Z#8Tq95YE}lC;njK%iMaDFv9;ktnq*L=PC}g%$$EKl4oZ z7jZ*!-gz>hFNEe|VOSV6i1l31DndmYStlrM7OEQkx~0y1w~tF2{Z%93oW<`XNy94R zBIc=HtJZF`j*ckVJP(p?5u?3#(&=~cW*9{~ zyceR|Nj>A*Ngbtm?b_WZV2jSRyHCJ2T3oyP1Z?|U*X}+6S0>v%JZWk)qxy5Q@z6?{ zVBBJ5Lf&k&n-;2lHOaVkY)5G)FV~LkfbE3f+VLJRowMttjBCeHls5QXJGKHQpIs2c zYGG%;r`<-#^HaNp4B!KN$#ZSP%6SliA=(FRgYiIt9YiIt9%j1*F z&gkeOh>z|0Zjkw)(Ac8 z_dI*hZsX9SY$8g9oX|t5GTP4_~A9lM4d!*Yf zYR2V3-Q_02&9UcsaChyy1u~cIW{;i#vz_hs74}KD?=SF=cI`F|F#WUJJ^1CrY!CZR z0zI^Ew{q~0dh8Yyupc)w*gnDoPk(qZ;o9vM@XT0VRJc5&;~!bHyt3~?@Q1K{j{!_O z_8kX)vHk6q5HS1GzV{$L%G-A=w2$Af#M^fp=%t_by$XEPYqz+7nMZaz3B7ia!bc#G zXaCvlF8E8c?ami??`PWq4Qk7-h%;Nx&NP;CEOFTVVWabT0E~6}rxQnb3fXRs%a15F zh>hlWz1=^Io;0!cPBvP#N4OQ4dDQQ6yVINx)p3=grgF@yblRDgixe#A&4yCa>8*)A zZgJD8s4Ues`=>b!@lWn5lf!gz*nAGdb?n=ICe5WRy`9J9j_%QP!JlbhXUFTonMUpS z80UJ~M9f><{9*|+W6CR2P0 zzya=x;)e9AZ98R!^uJ-~@EwA>yGVR+&9D+egygS>(P4W_MhK&B455ZXx@siZpN6gk z3~9$Ht*dLx)EREw)nVL_?j@f#P;p}jHN<_@C$UtMfqI`9>exV+PaBwd%SXLbs?H@1 z*1w%n)Qut3kXv&~LeePX6(0&R`&t_E-TwE!3Wsuw}D*Z}^TUdkEH(d&c64qQYY}oQuRciRa zu(flT&0Gl>%!Z1F!Zuw4g&M@N!od&48Dr>}C9VIK@(hqeJ@Ac}i37e+-wv)MELMKKBsc{tkdDMO^3&SCzYSputO5M zn@u@rH_oGkj&6;p^KBU(aUbc137C2vYI$1YrFBSBsY4Dv3UMS#8yY6jJ>fR7v40R8M zFVckVUrkoE_BgrIh^k02p-L%K=Y5dpiYuO8Q0c>XHGKk^&2IRodG;#CIAU zCu86L@b0AcLH+40OJ$Tu%PBjcp;S{Sbz6&4x36X1#i1nKjxptwJw8B5ynSZ_jK97( zg1>wddGP|jd;0(R-{<&S2S3KYr}PYef?^SW&GbF_7qCa4zxdtg+b@1+5I6=rza3rl z@yhkvujdPE8(V&rZ{+7MzJuTL4y=y+^2N^U_(uOV@;-hOJm3TDhWWgaWZWD1WUpL} z$M5}mWd5Uj-o(eB?s?f&@4f25QT*bQJ#X}8?LVjRYohgf;&63s%^RtDBgI7N8QQFP zP}uMyNiTkIwBd~=}) z?o?Of-nP`XtJV0Wan~B&dq5G2dnuu(g!B3CUL4+B)Z$)jckck0xX@x!+mhPW!RkS^ zT3z)b>(y$)8`<4!R;wG{STbIYd*e52@GM%~-SeV}f;W*UAdadRIoR;VlL`10Z(K$X z3vr={$E)Un{Pdy+<+?X^YYoI={33n<1DC1jO$7PT-ofr_?S6GHQC+LXy*nT8fwn54 z(f)=PO?s2X^=J6oBid3E0274-T0Bvxd83C%UZf5$yy&eBZ!#GdSMkeyzaAes1Ph$K zb5IqQgOa*Bm3%fiGg2%UZmk7vKb;)zil@v-8p3TI@(Alerwd$?44R0=aIXYVQ8nx1fH=jfR z@whiz{GP;xN}^Ep<^;MAXb#YZw*WPZ+9YwbKpk#-^TmVs#X;PgN26_ci^+Qr_AbX8 zrRqE0Tr=@x!@H8a_tDv!_TWbl3`E_K2&_x78L8w(kau@#J1$MZrzNP~&@o$GD z(8NV=Vn9D-rxEccE}`aJe+G z?)_?g^_ys>tB7rReZ#w!yo^Y>f_9ejjpXH+l-HA&<5Iqvyo^eDBY8O?6|CL8i37B7BEIQGekucG!@CtCt^~x-jJO^mz8etFjrewQ#G70H z1LFGz;(Hr@#Sx#BYlu(EZz4V^6NpdBcMzYHHxZwd?;<`a{}}N}`5xkvGMS9u*5R{} zM6+Hwh!@ef2a*dllwMMDbu;O0ta}?6h2O#exQk4E?J!K#wi7ZV{;wQJ!woMLbZunC z`_`??XyjUX4-=VmU^?6~uaYy#xU2p;;ER-BoeeO_yw*LzkF5NgE?}h(65E%V$TbNr ziw1zlua!B#sHkmkcy4m@joTaE*6(9Q2G_x!L!XSS+>CF=@5;zWTYh+PaW`=nGtC~B z2+XXQ4z?nZYgf^v+nAzOyhX5$W7fQ>Y~FNny?L>jh{tbVK;O#!7et?N$ zQ(Cd&Ef)87SFvQqZ&x=jHzQXuK)*9Yy}!CUM7=Xa^<~5QUY5uwz3ufdgD>P8EF`_1 z^$Vn)rGDY1^Y_G0`GGwhvAIq3qx7Yo4r~ukoUz1*vmS7}7(038^H5=gAZeT1gZ+cmb z=kI!Kk;;#f z&mxN1MMW_m2~QcM`@$oYkA+7n4}?c5pCrG+yq8Dq$EZcL_Gihj@R!U4w}+bHs=^l$ z+^52)wVw!|*8W`hwDwc6Sp?f(h)t>Ni%qEQ@1^ zBlSya$Lg2VPSh`{wbU=E{Y?Fm+C%kAYHjsPYLC#ye;Rb)sY2cdAatzy9aPVx(S^;s z1L!j>qo@kcxmAUyt2{ywo*snX5483bQi;#4DiV*aD(p|7=Y3Q8)T+Ypg;j;&FTr~| z(DzpgslLCqs<8i!RfYX;A$i;M{oJa;@OM@fhQ9~zw*!6uppfeON2?0^FRUu;zl7ws zP2WFRRT#dssxbU2`PKCJsJ~e)tb0>UZ|t4jC;l?Mfn362=)dn{XBhbxtY&unIlCO0 zEc{1z|6VQ;9l0gIo!O(Q`%@oG-I}_NzfeQe8UC8bcPFwFYf(kb7Jl>Q^Q+Gnp2wa~ z+`%6+ng-jI!f!_I1pg^+Y@~GgPUOpvu<8GD?{chBx_nol|C;(a{;cYqFYDO(f(0j> s>Ydq>sRvVcrjk=PCZn^rejR!73vc|Nu^^YeiZ&)jN+o!Y#2*>?A62*+7ytkO literal 0 HcmV?d00001 diff --git a/wasm-notebook/fonts/FiraCode-Regular.ttf b/wasm-notebook/fonts/FiraCode-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8c367dcd55f35349b239934852a2f1db73919787 GIT binary patch literal 225332 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

    *#B|)9>{IfV z_0}$E>F*K=#-=s0@@KV18ZYuD@S+8CZ|uHmYlLA_T{-7XYVFnPA}!|MD&JDt0=^aW z0!?&YLVkrb@qH>y63GIbf!ufXoN~1OF3}lLi8LIXVi$q!+ttAm56;?8=+QyNt>)#q&1Io?a?kFs?j8$Vla8-E;+V?PJ z`ZV^0Te(1Cz2+Y8K(?seckIhkg+-368GOre{9F|IZfd0H`ht3@Wmc3^KcAsY!Lk9d zqd$PMQw7yTVQU88bZnm+?^4w_Vg;NJdbjk z2M3#5(&?5$913LIh?=5#5S!IJ9fg+I!lqTvxW6-aByvJ0!3oG1@7?d6YXM9d*2^&%}~ z<%s&>$g^VDMvnN6b`p398EZuz2nL4sp`C(ZQGSzFGJhWZQ7w~dB4|tL#XjjQ-a?=d zzJghhKQ`f{Ad%u1f8!hXJo@NL!}jfl?KlH-H|@vdN1glTTW^W_UIQZCFY1wJkLLF)Z>t?6 zM-$Y$aQy^qNp#7lhe)H+L$^h{jaV@x7Us_@m%wr)z8E=0&@fl_v~RF1m>?Yf{k-#3 zG)9z5KqCWe((CzU!geiq1?yK>VUgA=2S@m2Ba<)7*grw(co#x*s5Wjj9U@`Ea=)5e zm3v^fzikAY2e1Y=fwhv=T7H@>p2Ae{)g#J5e%a(@a)a30l9_<5YV|amInI3Z)yh5G ziu{(1NSn3%M7eZ^L#zivHVF)|9I2LmkaDI^ZX;|P^1lNfxwQuED^WATMNKWr(CU^; zOJ!*JPu-?vP8nFwznZz&FPav<|i& zrC)}S#iCq6uiSgI67tC|9p#lrw8}3psn$i5snQBd60eSoj7W4)SrT~OCGadlzr(t} zkj2O!1~e>nqa4G?lTYp!WeI%MwKMfQ;7oEOTOPi`cl<77|D@XBqE&Ld@p55$;D-M- ziU7NpC%Xi0*eyxCM0gqTg%jgbk}S~KHoqFOpV_{&0`SRSJ?#TpRtu~Dxbu_-DDY~@`ecc>)^TC#UF zoQam%Z>a_7`-Gd{rHt}%v;}aTRM2av>rgug9uVK=(UZQQ|LLnIM~J(qV@%yfyqK9l zS=5IL(hGWO{YY(Wl%h3t9{&=LSjBoZ@jCraw4mOM&V;^?lKz0trs~96uArglhcaX= zctl?pBO1b3q0#ZlCpCT)eGy;cJNB+7H^g@)99a+Z63Or16(+AL7g_(DTU zCO*_?sPc2M4V#}-epcxSYUF517-i{6Gyy_d^@vBQexOYuPZK@>!h^U3WEr`GYGI(h zlx+t$)*Ydn`mh^?hyvXdLRDon5LfL|YK5}ILD!;671Bp={dAo20Q1jm&v;~@jcj>{8@P*fSS6vr=$OF9wKxL`p%R` zUOiBET9eG;puQeBS(-2Xi)HR~3EKv0~UPBWtwc{ZP z_917}7zbwl#)^|)>P(J4oA%A@L%xwn=kRh~skRP%c}N;fm*hl5N+za5>O57O)z4vvpF%1LZU0doQoia6y8ZzUP7$Rdhuestkq9&CM6ov4h5q{radObO#}C zu?Ik%U*&XU=*N^$pAM<=G^_jRV~ZGzNQ#aiv6$hA4@mdR%KhBlC`|)-a=$9^Y1*cz z({#k_e1&8^bV^8Pq1CH1r(LQ}sf`abE*7N6QBLg(4VT<(3*~4uc{!gZs>Z9&w_e^) zgYSMVEy^anPUkz|qt5|^{*Poc(}XZrwdfIDg%;UDgU*eec{It*WvP6On1`VWX@itE zzYCh67{~u0@Wrs48#D80qNZ0dp)Z6wKc#-NU#Rnk)6u*b2cTRfA0>r~zq}v+X}Ydx ze^pNB%~5E-Be-S%eo_=9&!j^2&9<%Jt-?9sU0?w4iQ4`%wTn8^tGt?Rl`Ordw+qeX zz<$|g(RoTsm#1@3j;N4EW};hGN7dU|(@m+`>U+TlIsAo=h^bZfz0mJ+b8S@@5_+U^ zkkUa*5xk=6T0$Q#C`-?abT^H@`g@hGpz1QRT!{K>`dY4E(+ow-*+~DS2H3AQuBe;H zFOP@Sl$fW{#7;|>oqOixDd>+j1@2TjDOSREk~dc>&@YK6M@8X6NfdqmFm+L9uv%LR zeZPQb)t0B(B&PFEsuj|^PhNi`T=QfVr5CBmYLHhik$p`aYOY$;n z10&s5mx0uNBo{DGmo}p*U=I^S#c^4(HKM*V%S;3j67yA>I8z@Jc#s`a`zDXag&i$V z4p175*@wy{VT;SkwOl_T9PvNdBZyhh_9~7Tld^Tv%R^d9NA*z0tZ8MDTw0B3TULh8 zBtyt@1wMdgAnHhIiE#@1T9%)+eowq6#(ZI?5u+6`=plVg<7cfG5Vop~HOJC3^0Vk^ zdS4TC5Mn@M={(%>WD>p++&R6k(MVdz*M)LG?+dCVqj5kL0&3sMn|Et8Kzh(!?Kwh1 zL+8+Iz+ZlLyyRlv4RYTDNCh+C@ZT=)owGo{%JE)wn>`a3HvSW!DGxKOdeMr@6 zb^ZDeWP8@qYqr$_nh-YVxyV-=;AfYjnG@(8~{Zg!>{9!*0 z@`vFQl_t}9GQXdQI_Bh(s3E1-#&0cYURzSyEdOdPDaLPVM`8P&5tmQvxA}cU$l3yY z)X`WQQ+16()7`;adHASh2+FATXvhTPYnYSj>wS_z0bjzq8w=n}Tp9CV|1hE_vDI)T zxr1H7d}+@W7wyvyS0dEU9i)G2ytPFY68_MUHK|5_IO> zj6b~)`1W3j{MEVc%mLwt=hXtg^_91fGy?sUoXLsD6ML1RyI zr)S9$PiIqaYt3OnPq>T7+vnD|vAcU?U+<>w?oGY@Wo14e;4$s$ z^A8XEo6O64dzYD|vLStI+@d{0oqbz+`?mDqU+i5uQJHZ#Wz_eoQ2UUVj3liGw8yK(#-thc zs^o7-$!B}bEta}Vs&MPjNgCaX9v<#S z-`4GsPT-kMt%7Ed-o6~J=vuC%prGX<(-Sg)mgMusq94ku2ein648TQUY`%qo8 zYJ21I>B&bIHxBo0+}O5pW8bpIMNJ4iCJ>Oy8itx?t+A|%AAfv&rDg4`rlE$GY>7md zS@=`V--A!7dX!mPSz#x-z{6o(DkkI%v6d>~Is$lvW7zoxOYWj3BR5DlMjID5H7#mH z+06~N@IY{j;aZ&tue~fC8w~QBn|qoT#^Vc{fJ5oc@cCtEcr6bVj3*0#iwE@&VLS=Z z8Ev)hKp+-K1Zq+V6fMLeZ85uiZ8F(hm-4yx#+APj&6( zgM*jXR`;|ut{q(s7RbxL0r|tn59JR*YR<~lL(3t-D{7zMThisBl2U(bM_+TKvm{$; zXSlhqqt#zp5-Lx3OJ!}Xk!GLO*x%jKr(@99(%o;g`kEuHZNQ-eb*w`jY3)SYzeszc z%q@~8=Yb7>Z}#lX_jfeYkTGZ-;cbq z^CoOC!LFERpM6#;Q~pSt57Z9c<(KE4$z?$KKcDcPbZ^G?Yhb>pF}16>8o=oY4+SgWw<2w<1Dow*s?SC`R~_{xu#+ai%dWcN z>3{yx-rJ#{3{M;;cCM1&??v3E>PxZnaVG>0q zlg!(YFJ~q={e!17nH?*f{gJE9A@ZctKrRg7B+dX|P+tpNdHPE7f~`iSEc<8 zm?1WFH6+_xfj}Jb>7!BdS19;Q$Y{7g)~OB855mKdx;3uWWF}{U2+^i_kV|5}^iQrW zn?KOiXEu0-I#w?`@r3%(xYy_P7;8tDb)V2Zd)}2R$1Ci<@`|9rQzHHNmp{2|-`H?} zednI-pS#BIS6=FB={kMqsaG#Io`?e8{_*suZq)(yge6nTr67aU^vcFTj=t z3S^M|K=mmvQl$}qZH5Hodmiqhbl3CnP93ggtUgxT6m9}~)nRu8E|r5IBD{gsL0cgL zk$x;lNumiZweYtq;Z@(k{a%u35HAncCF;3pPUQ5J!>9BtUwl?_LtlA!U!pY_ zw@W{YG%gC3G(=;Gt;#2L?WxTJBkMhes-skQ zLc+L=dtlr|NL;&-If?$(irJZZJl%4isZa>w87PpT)Lz=+S|2xaGSq- zcA39-K>BfI=;*pqzuWJ31sC?$4+feRv@Wji-qaZKx&1*`a6x}O9cY=?y0}5PyVhS; z>W^0VLLnb|m6aV0Ut9-;j?ux66@DzoD&ab$z6zbP0YL#|xbGy#WpJkpUuR~x$2Fs~ zVr~T2p6Ik7YMysF@0uWqVtY(OyEx~QwlRT=aP5;zV+g6Z3giB|$)96*Et37QGq!-x5<^A;{VZ+O}H zLqq2;>si;?xvr;sT}Q{d?$fKvhF1*)hDM!%&ZKm3==|ZOv^RC>@cBb?QyY4F*LQWT z@9o`?>KQAK+s@jyjhA=Lk5*H^%KU}Lq?OVWLLcx8n_@U7qUWM$at9d3TCJFV2T}<* zW|6Ii#ud#5tF*aj;YlO>f~JN&Ja&0aI{C|ACI)LS=Y7f#dEeRt2avbK7UInA0~%kY z1Z|t(EtH&^3%7rTTtj5b;}p|j$du11ylzz@v8uTVe^)kFN9(Gp>*}hdgZ0CS#IlBl zWr@Ua{ZS2(aARXQf-!@$w=y^LGhtx-3?J1fnUksH%p0(q;$-;-QJ37ef2*%9EjzJ3 zbmk2=AXDW=e$v!`(qCi^I(1^4kU*y(M6uj!54di&1h3s+t?`_4Y8zBYPW zd{qlHQP80ug_cS8z>a*K>MuJ;e!tTqMl`}QL%_~m0;x8b4POx?pOg9<-AB0go?K%3 zX?Y&9knybrZ`JS?hx0H_&hSWJ9^z(PwT2}5S$E%k@0UTiEaQCvO zRorWHuJ~=7Jn@rfCAJ=$BdHeoegX4R=BJ^rro}9%&idm=ec(!0IQlP0m#)K4X0ReQ zs1_1nhLlzcTri&YppIVV)q+5{-9_ZOU(7Xf^9@>$p!$j$Q=PB-+~pTucin}Tf9^Vb z4Ic492V5vUgI)L);E|xenD$^`xQ0!N4ojpke}XiPB{4*UOKOAz%x`?&t&H?+ns;od zz548L4n+?rf=+OOH*x z(|h~yU)OanTGZV$v^b@>PZIKgvlzU#x64aGwwREb@ zEEFFaPq{Z7gQ(^^pZW4h+xI>rFIE2K$3N!%%$<28^C#&Z>30}<{AkSx;(D}Wjb{Ku z@DiN59fbvM3p)YlZE>bQ9XV&m>8GBsb<43wkF8m`Z0W-J^9JFTGTGkLP#38!5BP8} z$*oTq^Tuv7l$t;ilX$2y6n+E|>rw=DF@qWNd%9ryFMcKKVtx!}bupuwAVC-GqM-}; zmM)YSxuxhsJi*)$-(xb0!$&tfc-(OhZrdjQR>%vZv%BNz?#M!;<<{}qn)cehH>)}; z;Ye-0;Ud|ej7z3ufM0CrQ)bJz&Yt^D@0YnxDKYdmwfp6$TrzuZd|-i(M|q&Vu@9k0 z2f~Yr;>APZf!;rbYu6?EYWYBaV!XDxL;Bsehqh(^#re`Pm;A&NvTJmh`@8D=o)zhN z!(QL=&@Yc&FwYwddgssIvSR1p@v_&)k5A9O^Vn5o?m0tqXL;lkPT(a2gA3+)LMyji z?OC&&Kk)<~S?%F1fmoM)VCAwo_O6)UO?_Rpo0g#`TG7|x+Fk6oB8OB_>e`q*7^gns z@-uvoRQ8_oJny{f{+C`tYTcKY30gFHtbwg46!g1nW&}XRgcP2=uz(R&-J;2wqqJm= z8QYJro2cnt<{`0X>wyF4`YHn~navtb3v2`Te1E0^|3 zUjuKI0Z+dx>*I{Pk--W`Zq91V<`~RAffNiIDd}oBC7U{lT$4#RK6}|^bM=4H*YNzm zD08VMP`2~(%jaLJzJ!xSDYH{6#|9p@JmxMcD2MYyi%?c755OM%;7&b%6r>jcPaJ~< z1*r9S2ldeNx2V3~X0F0J$^*(u;r{Kxmb~owM&;?5u!oe)JjUvzA4undPF1WGeuLJs z8{JgVI-nM>pINjA&heL7LL@$gc)IB|r( zg=@InXMbxpdiolzSn2E3eq*Bj_D!8-K@`Nr^k?%7cPG*_f-d?q^~?-Oa-S(T(rf-G z{guvz<2twS(f7wd*%GY?QO;riTtpupu-NbW^wf9fUK3xvg*X*w!8w#0+Aqdbk3}6* zeS-AxrsvB!>PwPiJ?SX&srM7|skg1%f4gDd58zqvc;VkJ;V*v>o?IFqf+0oQ# zKIxw7d^>0NfGH6zhKQU6@6vD=u0KZ9B$|VY4<&@xQ$5rp%0kQ?pePG!ExS@R2*oMp zTBJ1vpf&yUq*UkGCo8YG`SZJXrP`Zfz2zJ0cZ~SEj_T?;;o?o_o_6-7>+2iZYod#K z27n{hwRHP|Wc(-bTc77h#;=RtUBIaX`n6=d?_)}z`+fh%FeOZ7pzph27fNFcUdw)v z4t3RHrkM&$CSwp*vb9U3B8E8t+`ntqp*n|EGQry;4s}4~QbW{`g{WppF=FxY4Wype zBK)ArBN4np8j4R?@Lgfrbi?73Va7X}Oz@`L?BjJgXB{DmL`xJx~Vv zG|Lk|kiC0EH$AOwn{I>3TBl+QVUf!I+NxQm)C;v~M#|jGrZ9I58}Cu7!3L7?9$04$ zpFE$rk9`bV676j%W-hilZF4ytHY?U@>0Dzu^jVJq9`3>0h-VFhAJks5B9&{u@M4Yr z0y8Y6M6@K3o5IUt&9vB3Y%emH4e%|GB4oFfjyPg|Bz7X84~5;{Xmn!1E(!lSq}HjQ z?b^lfQO2boPrfZz5GW6vq1-E1OzrykPlWYk2j;*O-<5pZ_osVtti+7ibwFN{&C*sp zhIPw;xeOs}w4ldPs1T%sSvf6m;;8wIVbIQzRYZ9}FeV;-fPD38jO$xbTB6cG1BB=sQ$ zpin8~A^I4s24E#n!mLN7j82uQlXk(%H;p8Pi=Ne){q6qwk9$*0RquFP@5fiNTF-^$?(~xbg+? z$^GCHGmEFAs4=n?c25yyBbz&tnwc4yYq2$uE12T`sWWc4fuFTY`3ls>+o|ny`4zFI zbUo~cvSAJEhZOm8E83It--=O+0`?l@VKG&9nam;Jn`1D_SGtDsmad_YQyODQ%A??` z_24Tb%yM(mHn6FLe6#%z{s+KR6pT!;)XV{)kOoJHy)w8+);Z|KeC{dW97*Bqi~QHp zBucbXKN1Fz#l(mgV`Qf3+WAx}=F+GZhTt_c1S5Jh#`|Hb)oQoeJ#LTMBr>WfWAc{p zV*i|l|M%37Zo?Grx;0WSe|-;+U>Y~|rQL9bE-Q-=Z`Ui2VSTj)E5VD>3*wO)blCQm zke?1nSP)tm!D=OhXzYOZJ-CpeurBiXG@}OsIOPR4p*Ty#8U{XG>T{R+jl#b@Po<)D zS_ocrBno>ROM-=QC9A)fqWJ?xVSEetkrHRfC9g8l@uBkcoxR6joIG*qilLRsflX~E z9@BpGtQG0?Y30QVgyg-iwV}F)?>IyG@Ud&3JjU=)?dOJPowdrmY@xBV`m5n8`D4W8 zO>G)9?K;<3Q$Ncng7Z$Le6N`MYd}B5lAd5KhArNPrBfNV|+a^pKU%mVVrGw8`o_cBCxkt zhpWT2h$aP_h1Z3MwiMs2BvRv|SW5a1A52hVm`$ViB@Ht?Q%)LaZ0hfCY8*Io>T%Pu zsmGP4`kUxMQ@{3r|9W7cv9Z6uv1t$fJ2-0=(hoF_?8bk@OQwliq31cVrbW7ePLo$u zdbDC2kf4Vd^l(|7vKdYuacp`kRd+qbHVG|pL$|YSK+M`&o37e5=YNJ&FrGpu&i}sP zqjX}%^hjf}6^+jHS&@yDy^fL+J;Xg@B~>MePo1Nqqc|7pUeiiEBsF0qBkKgwlg_r% zHGgl=DVnzCtPn0zg^iEj5(95us3d|rNV6KszQ*{Zs zc=EnoJIAKZl3q$oek`xJ@Qe-87fEG$q4!2a>3pU84yv7E%lw9aAblP>OlulDj7Vc5 z)oI9pQFb8+LQF_%Q!a)p#WEum2^~vD1EjqCgQ@clQf&{CzV~~opz?dF+e2F39@6)$ zB5#ko2!4x(EM~RQr|~!fMpBG4wW-z2wTKiSC_mdU+}|_t+XGb40Yeb6D26w{z5l~2 zSIvzp`$eJq5r<;cN>mH_@r#)1AU(dMVw1YbY-YUQP1Yd~$=__$M400Cl!}L+F$D7|rsa4QRvAIq3 zQ~sgKs}obVY=6q|FxYkEsqMEI!3XzY z9-;TOdFer$8J&zTE~3zXLoO$L07(leh9njc87Xr#&mx^pn`cpwEW6w8b`+C-?iRB= zAdw10g$Mv6A{Gk2f6|SPrua3ajFXdV(Gy93wv7Mxy&7K1>$~3@#~K#?lP8`7Z6DHT zTY@vjZU@nqd`0Bwt5bQ>m?Lc-mGf>337$uHr5ds1x}JnLH1H4TqPmhbh+z|`rqDi^7*Hoa@B9*Z%WtR z{N3+-l~w9?QhtG`M+kYOmj-rmAK!1El=#RySDTscESw0&o&+4kcLY>#E zNR+BbR0E1PUXL&7#xP`VR}1{E(%M53;KVFLmJ;t?4`2qBn+tU~gu zv*Iikh$TaqOkO51c@Nf~=XdRz+*5!J8G-~xM342D*Dn$FADgO!WI0h-cN`=XW)%Ho zeIhv^V~!ul=Z?2;ILMz6eq=m(z=tch6AXz2&LL_ulfIZ|~)y z(^0-+&V07nNOx}bq!R#X)V2-AWM=0ez%&^)OlvMhu?)v|Dy>KB?9_(Q_H z@YFx$%nLKoV7Bt}&$2TdjvCX<4Tg^niZPPrYi>yE8uqKS2aXH43+5c!{~#}Raua6T zG0bOcz@ivd*I12cYDgst_!(M)t#M}425hvfMFehjqF0NAR;FiEiJjxdvI*=7@FaO3Gpzu$w6C;l3Lb$Q6+^I*^+3ohy=yNgJJlQCVx z5g0^x55rVxwn~_><;Sp}xC;}uQz=5(OE2p2$@u%m|N8g~1+%tG3nG>&J9h0F%g)|F z81yGq$1G;pUqCZf=o}aWi)<3dkcZ!SQr%rbGF>LDpw|*soNpiuWZUFNIu24>L5av? z;#+@n8Q7GZSH{#LD#WwsC- zsH$S(4RAjc>WSa>^bc=Pe#Toj4A%mO;DPPD2NM-neC{d=VllFERW#w{E)*^aeI_OJ z8DWz`0~$$s)BZ2rCPmWwf7d3Zt3>%WDOL55%T$w8Rt=K#O;Xczpi*{fy2^r0zD79I zf+Y>mcQ_oSj#4tFRgp1`OvyPlDi8fbbSS+dhpJBbHIkG^ zFt=&R&TYsrDdq%5b2J&{DWe%0@M``5<~35o)Z+=MzC*G-{qz|hp7GbIFP(N^2iOPv zb0OyBpNKhmPrAznK_>IX_996dLhO3nC+eeztXFDil=ZjYAwj9q+lW8-djFfIZbj>pT2_Ye*e;UMfFK3H12)5)?Rs1G!J zCDZy8v>ymgA!{)Qr%_d6!yaEKf3B77U5H@_n+T_gmsz)rOuUhgkfEApTocC{_G1d> zit9Fld<1FwrCi$Bh;m?BP$#N*ul{P=zOnB7YgMD)R`%qy4|egzXE z+8+cKpm`x2w;^1iF&Z`UH(BbU zvPhjD%K@WcBK1<$NBUE@(kDNz-%0CEedLiHzdPeS^@29k<*pGH3`j+fkOO?N7aTPN zbs6T~Lq&W@lSGj1(E=en`KD?#kt-HJ2+6Nb#(Vm;sFy`AwaF;f|ovMVSKU24W$`&9879Ig`F|C4VVHUcTi(z41tI6^wc6@$U&SQ7LOZ3 zlgsiOO8%zQA`CiwMETXBTrN+1j5+4(d2>vUgJ?~2%mP|R)n8Lj>6FgVJa;#Z`g$W! zdro~9MWQD;4Fc5U;z9?dtk)@7UHd( zT=4n3=u|K^9jKx0ac}7GCCxm#JncB6xXJJIyDJ7#seuZ&-|6%@LdlNW7M1&Glnzyu zl=r4m{Z-DOLrpn#BNV>-qVpO$tD9Y(s&Kf<<8nAd<-DR@WltKuOC_f}7>d?-Je1@S zK9~mfnaso|%!zsVRu(p#Kk+CY)f&#*3q9PJQC`9?KCwLW8)+Tdb31!jYpd;jlG)OQ z_@3=;ut~~`yHk>7DA@@!U0FJGxR=sGG!->JE90^)AWGw4@UDB1vWmt1ZFfwro6R-56~M8CozW9mSk18VNhhWsUG?ooj;p z`~0TSpJTyM=y)`Kpb@i8liy4;-b?Eo>5)jPztS0WIs&c|2>h;D74D$R>35d(&nkG4 z>MeKroH;G4tv1#eaCx2hw6Y&9Ug`2X@vn4XR`)=K$LGj@9%w4&M>WighO023d;I0T zNVV7Fa#M3_4?@A>VmX-8({KVj6mY?JyUG&O?vW~wQ~%vujrN`TeP$K^rQ8ndq~?o- ze5|Cf>IOl;*Y8qh?~W@C{E7uoaW0eFdnS+SUdbb;|K;TG{x{eI{P8iqe+b``uX2|e zXZ4_F7-8PbWfGXj|Dx;~g2m`)<&M1E_@-UbJ<9WE{Q0EseK-}#W-GmhMSqeb>bbtf zY?K?8JnR7L1pM44E#VehstZSbMzJLcr+~08sZ6{v&+rC3M;~@Dn?Zs&9Ra90rpPourh|ai4YWVI1_uGv8B+oyJbk+jOldNjkL=TQ4>G|SLaSlh zVLvA&bu?Fg_DCVl6f(AE)v~2*F3Hlq$du~`7^puoo z2NOT#SfVjh85l}LhgVis_)6;H@x`mF%IT)7dqt?LTDjV)9atp3QXK4A{sF&()zI2h z4fZEuCk)oW_$b~QWroI6HyvWf1~+WLDzpLCn3_lg=PI#NBfruJnGNj_&-1&z;s~$S z>f|kR`=V9+-;|L+ZE0y!wN|-$s4yz3#lp@`<(#W(OH+X_%msC(Lh-HkEa5^Nv-0X-)Io=16;4 z^Zb&rnlqM5?kR^*r`=_p55x@ne{l4d^vk zfLe@w76x^3P#aUlThpO$)7cjwNZw~OUQ>rGhf$q60PSp|9R%CR$j&yA4isT# zg4Sk|&)3q5vmn!xrg8Q|O+~MvVo^@S8IqPIb!=Kiw$TV3!5&i@7a*HxKVTt82vXMJ zD5Re@V-_+HHvD6KDb-e+l;)^&lcLPZoLvoI=7d?QF`WMr45aj;e_%;ob){(XUD$geN|MYeBv zu-@JtnW67{DtwjgSi}-?0A1yDwX66_Dk=+lcZsi}QtLH*Vj1{rT<8+})HV)mNp)ej zfyO}Fw?UB*YtNAA**C;Nxi^2W79r_M2Gj;-ma+;5lnSUDkh&YzkB_ceF}!5qeDH}- zA{rgEomAx&NL7tLbcHV0?+$%&7%s}m;e2XCBolW@<0@l8KY)6N1-lYgKpX#O^_M}H za0T5Jv$_giL`HP57&z)XZpfOh4wgC1N)u0oUi;IIH zU%8+5+Xywn7=J(JnZ_ae6EXPkkw_!^@!4ixQO zam`uR(*Y3VtvICfGGCS}pq1B5?L%(VSI(AJW;&qJ7wKn})Ww5Qv2KiQ?3^t}IyzJ( zXHRruqa>P=jP{Ds*@->8$$HsY$W6Bk;Hhv(_y<`P# zDCf!oq&X%(jg0yA8w0;@l;@s(%nBp{zU9)A%++!yjD3-*do#ac)<>B1MCMlyCunMq zJOa|<%=I$7@Ua?k&dM()OE`Fr-mRaplB^}-gcW6Pj-@89?!NTWo@?adiw4)M8N5i( zXBhdokWWbD@vKieIdih~D!z$M?NjN;bM%uy-_tm^4DmMc~N%BOXXVFn6L*M$@2>!(>PpFsV=9KgL(mj z1^I(!%auw-8$cTB97S7$#Wr_jj5SWJzk1>SGB4+k-XuLXac7-ebrTIAv@VU$|vyT;)2z#ThIarXc+=^%gmvzz(RwYY2_8$ z-3@ROLVRkd3#V{w6Adb~;S?0OBu_WBIS^}d<=onSf26iDdA{R~FV`P4UoWuo! zQavxgmy3NP0lVMh5`&NKPQatD6$9^%y!)Hl+G@jXZQ&oax7XITwT7khT5D@sT54)r z^(*N9f^;_jyj=fxj&*#EKGxOe#yWNLh0_-^U#62svoN%7>rDxl}UH8w4$5lGtAYIRYC}sY}zH-)&rjPNIiJL;2bIv&YSSUNmVKf8A6 zKuIuI;tK|S@}{M!)Urr_q-%I(X|Obe?b@Xv6!oRu{9TNDK{iX&wH%Qj0tcE68} zFi3Nc^hfZ_lhe|CuJ8AC@{?z+9ua9SK$=(NTOo%a`#(#cfb5?pfAUm`(Ph#fbyZ^C zT9syhg#7s??cqol>N>QrJWcL=Q&)6=cUJDS(V_h#mN_u;{tx8M2f+0q;98oVQNJ^n z2v=;-SoqPJa`#YHxs%w5(kJ|&{AD3;8q!B5YXmv9Jt@=V%vYw%nNM{2qF>RzKbH>h zYviw^%&Igj_9WM4(x*|3-UFyG4u>$RF8%d9`Em%acp+Hd{$=zJ@{_wpR)bZ*HR&grib?RQxECuuOFtb?~p#?zmva&u8SRze`7zVlLLqC zk3S>L=X>RzY5li$*9}YMo@HNe6aDuY>20KWex@|f5APLevO4=eN_HuKJ#4*Zl3mJC zna<4e%*$xsbwZZfu)m#QeHqq-B@cVZnhZ{c$c5ENf>9B>s5a8B0coU+EU=tie8`LO zGE{>p)>g%x^P|Y;-(j)73PL(7Ly71A za_iVOd3p6aw1R{*FYur9FGw#Hra5ra=vL{as<+5v3*L;ua>C^A;Ep^T%ocU(#3lh? zz8JQpA^mLPsCG7yjA@wfx?Bc>>dDC9G&tfW%%z2o4j@sdDNNK~tMl%8=|v02I$B$6 z!YwUfUffp=ud5pX; zezA@}EcZG-*t}RGX(=s?XEduTlQ4{PJPd`P6w-e);fgCHgTRZmupHX%95j z$_tyT>&kX)YKhh~p@I@SSDJ_MYd-4dVr_!*QEZvT^68Nj;>n+AV2LUATfLs|)sK$K z^K*6OA9!CA<()HQc{uKI#O3LgqVnF?>-8H^UaoH0^8P{fyYkX$^$Wk|{YTdCYEfQZ z{q*uSLB{>3{5WK79UBtu*IyuUvpN-Q@>qbxu|$~Qg`Q$@s6+tggs5Evj?wh8+7L7Db8=E*WKb0WV&f2%AbfvQjbrpvPTFP`<) zxsYD9P<6PkwKZG=xh6k$U-GIGRS{OxqF?{l@uCTN{-Lu18M|ZcZGGh=V}TPPR$JTJ z5|$rZbyc!tCK)SZuDJ$t%?HtL5qNbR7aXuG#{rlhWLw{&axpm#1RLW5&mA_iRR#wv zk4A|HqHR%ZS}2W_hO=y4^jVx>%CU99Y?ZG#9E1OCntmx`$MUpE#?!i{sb9hC{LpzQ zHSrsHCRe0668p#hbUyW2BsqL{n0Y?+EXMf@^T&B%vpK46>zMS?A3bl0x_`DVK>kav zllrjcPC5lve-Ilj#myDF`JKC^k9sC==^+}bwjT%PT>X!0Q!aH~QjKB_YdEW+;|x$i zpa$g|cGVcx!nP|W5BicA%^?44%sgsts;zCpg=|6V2Avhv*poiEPA&5-jFVUWo%6hD zdB2sPw~;kut~Km~UHTM0$k*^Q_-mBuu7H^Q|T1u z(*inaVvT3?6c5NZBG%Fa@aP;1WAQy^7Mtc#4i&4fvImfLAO+v!{sf(8$0}oh7JgJi zTURm#Jm8-htCA=+NqFLIHVx22*4TagVuALUbeetr2RBty9GD5jF2g)s`Vz;TJ&*h4` zyuCqZMZg#dJ8iN9;)$1sJ1Z}|v6N?!jW!8B$t4f=b30%wX}23J-K{3mS~=bQm87-QVt}7A>@zB9 zG8&w{cC(w?>g}dzdCXWHvIUp6xOZ8Do89(GquuN4N~{dX+~bvbprWL_+F>+$4Gz00 zDR(S+AQ@S1$F?VvMKV>HEk>(3(NVfOZD^9_E^U$|hp(>0?(kaqu++P?y0qBnF0WZI z+a#Cpz?{m?v2L4m;ZaV%Y)r^D+2r;Whh)R@wqO;vv=oH?{HQ@Lce`fNphi>JQ0(>yCN%aZPwdM%MT*w^ZHn|qFlTGq)%-~4#F z-(U%NWk)H_7dT9zgvStU_1OKg-wETBWUyEHWTV$u*V-xB;x2nv%mqgrVY$CRsY<{=3q6-^HBcZY)gX9bO1C}zsTx<-~S}J^gjzg~& zXXoq^dDOtoA#C@xJM5uSgU?`C?l;J81Gh*x>QLl&8Mw*NE=y)?3h*Kt1~0)zA4rIa z%;SdL(ht~+h}R->I|~frzycP@{>naJZ?RX{ZP2$2kRpsa3ATk%zo70C7Cdhbpc5q2 z(GZ=1oKj)E7Rk^FsmD{-q1QrZGNGfObH&gLRXG&Xd$K=}QhTyr6-?-9NT>ddQCAQ6 zkQEAs)F?p@hIf9*C6S2keAMk?=GcHlvO_FkqKhUw(cwvBOQpzbVFH+nRU)Jj{TQct z1m?3P>c7BAR4@fsohe`gB;h;8jK3%+5JfSV*`{KApnI&da!vr`GtFL5Q|>kvmsW4> zm4><1># !G)F7v~;f2WJs?r?MRrdMvJ-1B%!mICHwM7@_{8Ca?)gX7`#TK1K}bn z0$dIjb2+dw(dF~njg@xy=Ad<#yJcz6h6p0D@~FvPZ{u#Wz1L|lHkH8jk2&f#SW2zQ zuXLy7wI)+vi^*Vbhig0sw?{luksCfZFz-eGFSZ!WH5EKmC7m8B_PI^ya0w&$_^49D zqUQ3FRCv&SFty6wiev}|^#(_(OWx!+e|sSUs}g1^iX z@P~Yop{OhrF(!Feh1Ko1flDnmvpZ5Edn;Vd5V*)%eCmKto@Mfx?UknLRC74o>cRO^ zu&*EIOJfxthtXn_;b%QkY^dO-_HwzTy-r52iIj31wkd}KB^7qr-G!bd8-jL&D{hlI zTkFv8c_%sKqu2gIhNE?Q)W1XEMCBz$c*e7xt=Qo3seq;@r?Lt5^)DuaYbc zGdp|&E*u<4bu>3M*44m~xYubl8OSFfF*z2=1AdI2a3%yEPSL;->%t!lK7RBE@KB8Y zq;$Sbs@#S?QkO((8XjYEkrl_zy+vVz$yQust2CLNawShVc#!k3p$KD!%m*d6g*Q5F z93I4^dIRK2lC!@JZD+ z?7;S#Z9YRWcFY*O5~Ah6&40j92NE!c^83uS@`?HS1;2z}&2Qvi;dkSemuX6e~s_uU*>`iW->S=UDpX#%1*PX5&hm_j>yF(OOc_@;+8^jI8AnN z$i#Zt=t0ky46Sa1?2`ZYbfdWA|L?ld$zHobHru6Ao5=xpZLO-R^fM@h=3+w-qSVwX zJLqtQAu9O{Mu*R4hG>;TcFBt+NP}DxFiNT%l~{eIRC+_c1as4B?8B*Y34g&*Hr*Uu z5u*X-Snyqqz6p(EKuW@+eAM{8tE7`J4))JF);v^pQ`M3MpZB=ri_+Y|i{(qEu4k58Z%_jK7h3(kgnd(X;P$PK6MN!ZbqxcoZ zRE$G*VB@jymP>AHg~eSxc1^-b8ih4o`FwK?{%dYs&{N*C0IU4UQ)hMAy0|&$R-U9V zYJ8zPcyCLIXN|`XQ_(ri${*AZxChtwdKN6`d9SACjjk@`4i{p*?WaEm$*yGhaVR6TPD;!ZCqdX_RDaF)s^)!?xsERb$R}FuwW6EvF6G?AZ&QZ>}9m#TeaKhs)ijKM&G6k|GMK9t6e2o4|}fOP|E4+EWeZUyMq^|(J0I0@+xh42ud zd?Wx}mjEoT=A%PF&_t&VU8xZ;!N%kdE3STQ+?+ zop;;tY$lk6=hJzKe$P~o!#%4&dU*yQzAK*rhVU#OsBI~4!kciUcO%l+#2vV<1}p>I z4Dg_yf6{pF3S1#qSPy{Y#kw41{)+qjen|b>44A18;+c>+dOsyTrF7KSh<8zk%!CTW z^8!k7r8GJp(|rnQ&`+2TSKuh>P5e%IH~@Nkfd55X5$^#nabJXc8-U89IuS1uJ&k~V z0KF%?C=Ec=uMYP_ujzH8G$eZoC*nE1KGYU^eYAcn>OyI$K6;(-UADf2Gv!auh^CZh zBY@IUJ%Ou$1Ncq!F3~{8sUE-S8v?>Z2hc+=gRUY!YCq&D>Pt8gt%Crnj|4@&c(Lut) z_w-!^KxGl%(r@sJs6W+{$|v5y3O<35p@jQN0Pz&nO|J{po#@>Gp!`T4pq~jk>GdHR z5>QXS&V-P+Fpw)?WlZE%;410EbtBiuH3qa4P97?|!&)>(D>P~nNJ%Dp& zKd$u6mvN=O`ysB~fOXnE@jZ=cI*%{GJ;vzF$GGY;C5e0DSxQ6gL%aZdMc*erCny3S z4dIZv9B>TaOu+R3)G_lVyhq;Rn~k{F^QL^M-H2D30n`qJJK8lfTfK_1fs^R}^c|H& zvH(}nf8WCuG|ZR*)X#JPo|(r1F9A^R0{FCVZbI72pmn|s_yyn<6*A}HIo0iC0O+QC z1MmRgAr1E73dpPmp#Gu{e^%N{kQR9={|Wdt;71yK4_APoA?T>f-^|zW40tFH10DqY z6!0H-2Kr^r2W$hZz%!&%DBb7qdk8>n@R0_0;kpy=?giWf_&MN3z<;SA^12XZQhR8P)OcSV1t zdn zg1jq@2^9b;>mLnNmrnz#=RXQ`I{&>_qVuN#(Uw4O!@u`R?f#E~Zy|32l0&_KIDmMP zcq0a&=Tryccj6(P|5|Wg31|iA>4*>W)6uur0KN(MBH(fj=-C$lB&X>a-Tz-or@Vo( zW%P#+0Pg}`0Q?c~XTWQK9|0f}Gmt%*Nx%f)J;3{bzW_eO_vHZUch3NB1N;l%X@CRp zq6S1adQam~Kj1>Zn*hi?(btIfL@xsRhSE^J^d05*6aaXz;{lff_5!W|Yz07uAMtxV zpE7*I0CcSetO8J5=+E@ubfxzs*9g9erYXfOb>Q0YEdHM-$_Q z(uV7QNMn;%0_?cI05A;rGtxmeP27t6H2~0I;#UCBQz<$0s+jSd0DL$F942;1V;`eV zQ)tKRJG`HG2)`l!6yQf=&%_^4F49lZxOXjJJ;0;ggWnarQ+&whAkyBB`+DvEXZR+F z`&UutX8=C{5X}S>+ERp(g`O`5Q~^jY zA>$@MqdcH@`tSUE{TW@^qq#Ktb4p9kb4L~@Msru@28n1Wo$NYdCR&qJ02ugO0{mXbUr z_<{zgx55FCms4oNiC^IQueg2#fU!v*qb43i8k6>XN`0r;aD52RUsSJC`*HoIdOz_T zo>$}k6I|~^+2;X|QC!#Kw;2HWH5rh`KEk*|_Y>dJfW|-lJJfpuGED&9D;PrvvS~jC ze&5A!lre$vWa{_0YR}*wU`)9TFaT)8bI@k$HPD6T0H{BEhB5eBd!8znHL@po0xnMQ_+i<-Aa0=ia z?Rp%pF91LfwgW(E^>KsJQCm{l>EE4*XFu28orCKwfUg5654|pg=TZ3m?*J-e4Dh-J zzsB`k0DY@pH{qVjq$>g8MtBk4^!!->G*0K(}4jP&H0cmhxU0=oVlajMSIR$I2P zEvg=XzjqY^Ph*h=x$x5fR{-t+JOTJA@_8BnPh-*t*cguAwB}=Y9xi@v0Xz)&38Fex z1G)ht0KB*0z2zOi0c>7DSytp>MIKh+agZ3pa!?^_E1_3(Ey7Qi$ zFW^zY^MH2%lZ@4u0Ga^v07rv`wgWBz+yZzQ@DsorfR7klHv+~0r!m$794Jb7>lVh^ z+5oEo=P=fe-|bfb9$>8F3C0q)0G?)8rUkrDKKTGa0KVxO0&E1}yRPd1`xr~z#aK7; z@3jD`0o{zv!gUs1Ut_HQ`+zqX8+eDY+4ycYzMGBjX5;znR{;ANOXJ%?;4!#|u{n4) z2hZlB-t)=lJYS0EOFv+2*Z?R8bTYOKc`idf%eFH%vXQYB=P{Q&Jwh{0?LvU$8kg+pn0g%rb2N>IN6<{v_W$auHcnJV} zcjDcd2EaLh>liz$6962~`iQZ!A7$*ErHq|h4tSceU8ga&8}Ikn0h5fK_Ywekoc{`A zpL-tg8sGq97a+e2fa66L0G?lb7h{*)!q}x(F?Jc=U%rpAD{%jL;QfV57`qbrUWxlF zQT|o9zv@QDuKp=w*8rz$_b_%H%DTQ9@CIWyJk8jRS1|UaS%CeF-E;?IHzU7Wh8Vkb zCu3h80pR&p7~oOH_HJS9t7*n=D`D*RF~;t&0A6G4Ye;iv5D*98{av`;jc@M8yRQS^ zd#+$?AIjf%9bg~e3BXSoyBFo(i!}EhVC+6SWB0oN`1XF}aX<2ZU>0CC0N*}@u^n zvlm=-?|`5zH``T|9d-wHW!PDFXAuw;6%~<`lFEt_3l+<1)>~v`WR#R-RAg#YvFBjxxg)?y#=eg_-nWFY zAJhXTME(!q@AFN-A>bHe`(f`#;>3+0lpvDz}Qb10DC|20XrFc5k9=Q zh_RpU0FsOyL|G0VXY6P2;pe5mVa9&3m9azM`DK8ymmv4jDaL-42b^H+<)Z+6dnF%0 z-YejFwVknFL-z0_0O4=o&u=#}_PYwkj*MpP_lmLC3?Ta&WM9t$b^`|)dlP!!OfvR| zCmDNdJ7a&W24L?`$on(sWA(rZ#{L3-|BAe~XEAoXnX$jY&fg9(_V-Buc>l41u@eEt z-hrKWkp6CrvG;t8odnlx201x_(O6c~oDLx#69p1+szkp|E;@(AOjb}&AA5964p`B?CcgI>(L zd_3|BATwbDu$A$%{6G}|{bxb;Y^0x!^mCAY&Pm2G?{eQx#wShykTwy#=R)VXj{$oa zFNEKdKx4k;leREEc@uCy34qM`DF68}U?Z>{fG_7C0N!AH3UuHSLViI$ zaENitr+k_Z*vGhk7UMAUC5OfXx}OIb$CHn-}H*uz4YDUKj&50=s|%z;VW_MgtW< z69D~H8-V+PJ-`vhFH*o10QxWL2DSmafr9|_<8K}L#eSd}fbNTvz+uKO$pYZlC9RBC zLuU(A5CBh7*iqt-xni0nj^hKjX6|0MIcT>6gOp9MD)R@VQ%YYY^zm z;Me8god@6MZDPEs1AvVt@HfGJ6Ld6zr|Bf)^YeizKsC?|!0vqHEocIcF~0Cg#ux2n z9BT)DMGQEKyB{_I2%Fm(Z^>f(%F&Ep;m=zF9XLJZwFty52yf|fDT{-a6ga)_5(+NllZx{d|(PN3jkkq6R-=| z4;*EDc@{7Qm<4nIn}8j_Zr~tr)cjN=Fb)U+;9JoOtO2$HyMVoncfi)Q$X|(eU5Pf2 zp$=n{fGS`SfVz)u1hxZclh^^^4FL7L3iZFr57YxofCR7w*a_?b4gtp)?^2A%OR)v( zV7w3D^Pb1`Yy88SiDlH~_x&HUZ%4-3laugTQgd6Zt>@Xac%{tpIE% zpr;T1u7;h}Cm6pTzOF&uTKKjOc5Z;~_3&x^0mg5H?Hf-re$y_-Z|(qIW_-hX#%}@t zEk_u?^$o^vgWSd?jNfj6yxX?}dw|2hDaP-Z08{}>fc3z3#_xpfJE42iB*yQ8t-GLa zGwS1R*uNV(x4_4b&jn(@LB{Vvcy9uL%}+q)6ZHUiKd~1;+9w&{1FC^mU<0rN*b5wC z{5}Tw0Lb0f3Ty;Wruz;6#~I%?8mIu^B-l8k@u1mmBd%lLNK!a9zB0cl@Uj6VQf4}kxHt-wLXcLabVj6VoF zU&;c;0h<8m`_g{Kzr2C*o#5YT!UK#ylm|fXLor|r0KSLz0nqUfe0mu24};+CTz6-W@LD#Mh0QIqJ2LPE}2N-`eA6Nvy?xT+}{*@^JY+=2~ zzq$>8&c`787-S!V>|>C946=_MV*G0iSPvlW>q~&Wj3>K+O#pN}j(T|f2;)yc?uqS; zKRE%|$M{ou0QjFm{OL&m^1rEoW?(;#C1C5B`x)O;&G>f?GXC8s8Go*n@gFQ={CR}? zVdsT<#t%T}izwTR;QeV60J($ffgQj;#(xewzu3U|p%aY1RKfVK4gtp)e>oq3%~z%X zka-0>uR!LNHyD2vKECP)s{StkUB5oS_~C7g{|5Sg`y}JP+sgQnMU4M`7O;!)*LE`g z`W67bzWx}n2Y}4$hk;|jDaPN(1111|pbD4^#DFcp0mk1{KsC?`z}GilX8aGM0hIYI zgl~cOE%<&E@uT&?9>)Jz3LIh_>r4LUb^yK{GdRikU)BJd0NDO3(%y#cw;_LgC*yz5 zV*DTAIWZ2X0ATaPdH}lK$pfJ49r*Ch4qz{E1USz4y9~$&d_VxG2AY6Ypc~i#Yz1}z zNnkH<5I6!HXZ$?|0L%p- zKOQ#5pJ1Y33ILr2@TCAe6QFOx5&$w2jx%wV57-Dm?^)o-8JRe{9oPo!2Tn3^4s@K; z4eSA6+cz560KkUtC=(OM0kAs}X%n9W-eBU~Nk9ki7yvtkr9d-)v_h1-a615-h2Wi( z1xx{E0Wko+PD0)!$W4as$w;3J-IJkf@*yV9Q-B{pInLV#fcLx;Oq>ti^XmcVI3MZf zKM5RSVhRI%0P?1w98;iw%0A#26W9|7oU@4wkbVJt!u~)^RX_!Rw5dCQgG@|A+O#TQ z4S+Q49mKQ~O!(oqe=Y!4 zs{nQ~(J%?a)Fc{r03SaXZZ z4>B_8`O|Ut?9za>=LuSDuU_TQJtC(060Cq63*bf|L;tKfIjI`!WOtdgy4RD-^ zD>pK6RUQD_R~=j6nwG8}i+n8wI z&O{V^%i#ysr(y+s!`f4HfWNaEfURpGe{GV9mB?EOdgTEoVsioLTLrne0wytW9m4DC z0qE=n5>-s}QH~xCwf0g3X&CcN28q1fHAgfsIUTU_dp1^jq?QQlJCa z$;7QF->qAjxXlNE|2CxGwhuVP#KvwQ$;9oG0K{+K2J8orcgK1r?o_}OU@mZ&iB0Xm zCICL)H4E4U>}O*06aZzpI}3n+cOPY93wS<`_&xam;`bu|-aP>P-U?e=VQcGd0D28R z(FB0+Qzx1DEcARXkBJ8s0SB1aF#$Nn#DmcFAji#tex-L7#Wn8sNa-=Z z1l&gHLs%)pjAnIa;Z`5aPBxy6_!AV*W%=wmikq9XeopbBYzF@7-tiB^@19OD9;95-R}QxqS9ceA!epeGCOP4Qcq zR%bTi+bN!l?^et`YsOX{;;&MCC`*VBD30GPmR)u6?zKIgD>@RsM|~xMVA!{8t?%;A zm7R%*uc;@#GTt3u-PqX^@zurKqqXr^d$7195WcW(QGM-&Cfy_#ne;T1&rnxHdwM(L zT|UeGQNGLKU2$J$uP@?D^hDaDt0FxseevbKMIBM!W$|^Lv6!*f(;e@LB%r1EL;ie- z>_{ZKXH1`-huQho_!2NOuRGf1Ym9d#e3a?;txkI! z^u>F8u}C7?Lz;TqdOEuky~VwqvEq2ois|zj=i-i*IQq(3*26mSgGwDN!F=pdpaeZG zh?h7%whXyGb~*A_0tprY)dc=HXd@d(|87K1kIgaq+F6vjM(}TL9wHIC+`4~bYwE|_D2b*&-R@nbeKZPEV8uMI|{nxu1i2_^_ zYv>>0(&^{X_rAsz*Uapl1<~I_-N+mW7q*c7B2{1WFN4f;+K`i@iSQwAJ2+;0h`Y8 z3tjwdehx-I^nC8)6ZyHk5PhM99psbP&rptE@X7o<{L;+%>>DhJTaf>PaW>4S@C*1< zR>r5XH`qV9pBJ%m{3_gZ9^gS%!4B~f_Di(DOFYC&@$-b`xA{fvA{0~S{B|nq=5zUFsPkTaIlGR}<4tTfe!A#=KA$h(3)vjLh%ZJv{E8(o|Ey-$ z-Y_rOIp~KxT)bLely>IS#t?H#&2QI@LSo{{5JL$?tZu(cRAdN zKXtu}Z^r%8UtnM4TW}x5J^Wt26?Z*+lHZ5BAwI=Fjhi3t=byz55TD0A5MRLk><{oA zxD(<_xHV!Ye~3TKAHgjVk8=F(Jb#RTjenhg12;$X^T%<6#FP9f{xtt4Zj<;He};b> zH%xqoKg++%_u__$=lJ(=)5H(>5Bc+aKmQT`F@J#{;6K5A%s=G^`Oo;zag*2~{4UH( z{8#*C{tADU|C%4>zu~{-zvD;nYm2Y(*ZCX#P5uY|7C*}W$p6Iuj9*jw3;!#Bn;++Y z;3xPy{9XPYKgr+cAMk(jQ~Y22-~2Ql2QF~Cw7~5c!ozQ@Wr=K&BXUI^zV{o3 zzunIlBg9BCN{kj`#8`2L7$?pY<3#~}>EkSMwm3)l#6)o}eh*}lm@Ll2?`lpF7l^51 zn(&JvQ7op5fC!2b5fY^$j9;TK7ZsvX%n%ofDshpxSX?5iMUAKxb)sH0h(<9}%o4N3 zrDBelD=rh4i+Q3+%ohv9La|6J7FP&-QzTl%mEtO~L|iSd5lcm@h=^sPO|*-sST0tG z4$&#D6)QzdtP))!F1p2aqDSweV#Jysx_=NbRxKC^opAw%IpAq+q&x+59&x`Hi3*w970kK0o zD83}VEOv^A#KYndu}eHEz9POV9ur>^Ul-pHNzpGJ7f*;M#Z%&G@lCN?d`mndzAg5M z?}%r`cg0@uJ@K6QzSt*zAbu#G7yHGJ#E-=b;(+*xcv1XR927qjKNr6chr}<%OX64J zW$}u5Rs32U7QYd{6~7Zl#P7vx;&t(ccvJjAyd{o`KZ-wzKZ|4HFXFG_ZE;-uP5d3- z@0<|th%Q9ImD{z&|40)lfk{8K~*Nh`y}VK0ByW}*`q zl3$iP{xaNR{dwP@wi`jf;=hTmmkP~%2V=R^560_eu16i?hUDMTbuIK z5S68}RgTKVjT}SOFx)MiuSTemYLps{Yq-YZ%7}65Of_B=s0r#Ub+$T3`P4*pt}0ZM z)MRy@I$upu7pSRf8r!4%?1U;(#q1sSu9~g_DyT|SNR_IvDpTdE0=tY$*!QuYISYG< zuVRn#W#-|YqI21oaMwc)JDZJEm8@3HP#3Byb&rU<7ytuS50cZTA&uHMQX9S0;|!luxHtK*$>#0>?!s% z`zG6myOf$$i@H)>rIx6x)ir9VYE==nOtq$I(36uuWnQ~shiaXb&I-H-KI9G+tnTFPPIwhr8cX()fV+}b&tAN zZB?I8pH%m$ZR%6%)9N$oe)U=PIrVwA5#KHjQQOrQ*u(0J>H)Qb-OfI(9#mgaUsgNS zL+WAm2<}LDRDDH#RXwJ@roOJep^~a!J+7X>PVQ}XobATC>RvVxH$8odZDaSbN3gEk z$v&x`WZTtK>~rk1>>>3uyB|BGAF6Mv-RfKF8TD(>ahBa`mOq%I--8B zUQ@5DH`JTz59%#-RQ*x?N&Q(JQ-4u^Rd1`~>Tl}r>L2QadPlvh-cu*l`|1PrPjyQD zOZ{7&)=YCPw8U+u8b9|vL}%%2ouhMgo*t@)>ESwGkI*A=ZPsW#Mvv8J=yCc?Jzf{+ z3HmI3wmwJu^hABGF4U9QxAbIvo<3hs(HH2cdYbm@B3-Pf>wpgG5*^Z|I;_idxvtQa zdWODGSLuuN#rhImt!s3xuG96pK{x7|dX}E8FV%DOTz#3oT+h=@dcIzu7wScNvA#lo zOgHNmeWkuiFVR=)YxGjxsv~-tZqw~Ls+a2(x7fWH|q`h7JaL}O>fk<>pS$FdXv6OZ`OC~E&Aj79(}Lgsz0GW zsqfR<^r!Tv^=I_``m_3T`ty3b{(}CZen9Wg59%-JFYBH9A^os^MDNm%>aXap>c{lg z^w;$_bW->0$MqBXN&S?5T7OgT*5A_4=x^&i`aAkr{aw9Re@{QBzpwY<>>!(MVt3%I zVKdu;JJXl4qxuKzR`#6!p?;p#=>7Uf`p5bOeL(+2zo>tz59*)kpX*=fL;9EcCH*V? zvVKLss(-By>)+_#>fh-j`uF-Z{kncbzp4MA-_l3*AN8N~pY<{Q7yVcLwmz=^rvI-0 zp-<>{^t<{!eNw-#KhXcwr}V${zx8R4dE678^pvMP&l}=pdD&i$my6rlhI+%i;a5F_prm*qy3J(%8sz#uvfgWSLT&_6<(z`!@JO{ z@-Ff&_Ac?Ny&A99tMlr;2CvbZ>CN(HdzX51yt&?G-sRprugRP5E$|k4i@e3&72e0Z zX0OG&(!0uA;$7`s<1O`Cy@9UW4$D$>>y?;27Q zUlH$$t{hU+5NYd6M04xfI(ypsRxOW3*W}c-#}kn@Z0HkSeOmTg26><7O)oFEM1E^C5R$Z!FT=;S?;O!0B0#p~qWjvvL<^xVSJQUoApuy+u}VNMBcHAXrvn z!;)Z)x7gWVJjniHs)NO@4)o%lPPn?*)`a&lXYFGH*0Mj=-WlzQ_ICDqA6wBASsl%7 z8OZcnY?61S70bCY-3Y_#Y)Ww~-WF?`J7<`ys5CimaIPz3I@f7SkzT~LU4;COPzQ@d zov&>J?&P$k9q`(1m3UDr>_sh=6HVt2!MT;~uTkn*D+bi$t;ne0oE2#q)nR&8#{i?( zX|-o}T3;6}m?Ju`9nwjPJE@O#+M0E35-QKVc0fFDWrm%+l`DFp(XLpetG%<$i`lYy zG1nnt8GI@Rf4nYN_O3{Gyf@Jk@9v0tU5>XagI7k;vT@f5;)6Ot+&P&W&*+3b&SsC( z)03gc>viUOGkovO$X5x|2@_V3I$?-9VXfEa?Dq|_-$#|yN1d?GcEUc_39on7t{LG|W|6nv4(5b!ANFI&CR3XHD^{zF4BO zJGM6G`la~4IM%r$V#-(&C~vf74VTnWSVLh0g%vg|4F)I-Qs^Gk(x9uW(g1~(DZWzT z3%f8t>4B7d8ReH#n6gtz{PixZaQ>7ADGWG2OM|r}m!gS3==?4Xx^k74klhlpTS9*0 zo>ep8lm>{ug#0Zbe@n=(67sWz{3}WMm(ox6OUS=E*daP%Sdk-=_?~WWn{mM{467VRhNAw4yur-t;@ke*u7Q%ibkNlz{LQA_f*PClG! zuUgVmOM2=^PaXAxI%@wqYL_~y|2k^7I;#IVYNvXVuO~n1$&Y&Sqn`Yzr*hPj{d%(B zK=KVF-$3#WB;P>t4J6+{@(m>4Nb-#&-$?R}B;QE#jU?Yl@{LYDOwV7K`cF9E90sKTFBK(v*KG{bawC{3|8D!YRI#->G^? z*&%8~XHHKf0W zp8TjMKkBI*^<=-E>^6{m1Iag#d;`fhkbDElH;{Y-$v2XGBgr?Cd?U#>l6)h{HNG_QqeJ`B^m77jT1aDe24&VHEI6X77q2c7+J(Af{uydMsdJk9fA zn%~2zdA)-Ct04U)#82~cxFnVC^oGhCbxo|hBcf`fiHM#V!RE|%+z=+dhHkunjd!Ul zktG|Djkm>#h?-y?v7xqwQ5;=L|oPXZvQ;(B4{id7N0 zDAG4%u~Q|RIyz+?(A3-M%+yroSo?UF9PiB|iZRbO1A0C9ZQ4!jQ2%&A%V53_MAS8ab zNB~Xx+~OeESYaPZgp}?Uo1jU~O;VuAj+?ANlN~qd1sh%GL`Z(RP70d*be%QW=mr6V zWX~-sgN<%ciIC)7Ck0LNuJeMXa=Ok7J;d)8E1-$rEzW|CZV*LCe3eu#w^&0umCG&K zKvTKgWEpI9lO;lucatJ$vJ)bCHz^{Wq)Lb6r~}y86VL&LMF(4#}R5xXY<4(Yf15q0QQpe5sk!|$4!NtT#XkB&w38s0ERkcaxu`9; zW1+%YA`8W|5gM`FG!dd@MTnLYp>o^8fl#@vS%kJ`10k9=Lo{uMXxa?Xv>BplGepyD zh?e;wnvO#>4Tor%AEIS=h^EUBEyqJNZH8#t4AF8tMAKy`)ic~O93z!22SU4CKxn63 zgm&40&`y5{?eYPkod$!AZp21N@@^Z1kx10k_ez@fq z^ijTBR$}C%e7CIwP5Rt23?m!atE6(fZ7tHN+-`ddn#%3AxuB`sZhMFkj`X-~3TU$9 zwke>=FSjiLO@6s;2>d46^;?XLM7w?mn*4J!DroZ0^-qkDWZ!K!K$Cs9-2hGY-8KXE zXykRvZH#=B@0N!cDM_E(Hi0I6Zo37V_;Jy^9eLe$0_my#NF$qj{-B@A<5mcusXT7m z3!2K~mZca`$-diefF}EH+X0&FyX^;P((kq*C?Aca?s>-uO!@A41Wo$fN(3V;*>l?m z(3J1C5unMQ+fINceQrAeeW~ZbE!#uoHQDQ;J@Mj1ymxsPULCkd;(C{oljy*)s7=dW z9`Ea+Sm$cu>+M`)lX80T5~9mRqvnf9$Jo_L3Wud_6q}ecX=0{PN&@boMrbP=p)C|b zTiFP0p%B_eL}&|z&=v-v?IZ{*o#ytg_$pf%8!?435h{#{y27}aDU9Vag|U3DFgEH6 zV;OB>Y|Iv>t8Z10wP7R1hKZ036LmIR%-FDe#)jo{Hf+?{u#DD*iMe{Acu^rps8Nm!&4G;%L;_9UW4x80PX5E=pGKxu3m#~uMOHRHxSlj zql;L7JMwJTaPi*U2Qt z>-wU-=5y6_N^YbVACY$Ut}KqV4M&A6GoP5Qa6K%mEso7habFvC9y?Q_@okSrp@}YU z7`6d{zqdBR#5Zb|#WuBG!0y)v3eGmM~w0hVFiksiDiNNcd zhj8SIK714$T@@cF=cshjKv67PFWyCgm+H&1*`xusv8i@hnu^$?_;XTJIyoJ&`D4=g zc+Fxy54NeJ(y8`6h)o-rZnLF$t6`HyXS7o~aYANWEzRg5=FLF9?IBBDKQReoGZOw= za`d{sNX!}}@qvVqPCV21k**6bb%7NdkxEJ{IwLb>>43iBuC>yI8A)`i5#jNfgOZkJ z_}{obEHEZRV4!I-3pMcY8^_0G@TbNr zYdO>Pfnm;OP0ElN$XYsB@yKqBbn*7gHXcDq1Ae8LT!vLXj+j2ed&c05bUU6oINecJ z)o98YRIX7eD&vV6NE>i%beb(lx>5>QaY?oyJwfaf)!^vl7v5SMxJ5)~7kK5>! z1n7N4z%AH7*XHzgV>&8cj#($iE_(vy#fjx+7)LImSb-T;jScP;sU%R-s2ciGYb19h zR1$FKwg@Y;&8HkzY-n3w59X=1wU)|lkK?aE+*-|PuW7Uy*+!dgkQPnMHt8Pw#aC?mQdQyIrV*xn?N7c!|YVbhbreXo8`gUCTSWIumQ% zJlGxU>vgNRRh?a_sOv#yN*-eKV{O?s#M9Z6Zl_)nb~|;1&g-x{`vmPu7j|c#pxx6Fc4wcU-8why&OSjm4v8i3NmF}N+kc0& zuXLdqV8V5cp7~}Y7Ij5+Z%sv0-X0lY%fb}yL zt?fM+JzU}3E3%TXdqq|fcBkzn^vV}u!11}$?~<@P4KATiNI<)76}Czp46~A&qiYtpF532w;{dmv;%Z#NTR1RvVsPaFir_AO(Q`V zA46EWC*i`FojIYGx}!U-0Zsn7QzNu&s^zH#-DwPPN$5_;W13Vj3ud1^m*x(ojLyjXl4zV~y> z0b8gtcSKxL7OKp~RE{YQt3NDsR;LNs+t=kS$ET37s51X(ED+nHsx8*HOm{>v_YP_A zjI6?`Nbah>URv%%hh@ZZlwwVlQ@;uZL)qpa1rvI--R1;?WnLdnaf1PErfN6(2k9}y z&*EC95OtRjRbPmT8*=aVOM*0&1uJTBxMSC7cEZnX$I6b52XosaD^_4%Zx#{5TpZq6 za$IB;mI`K>urwXBtLr?o;!f@I#}Q!?25nMDrZU{>$85z$r;<{uE0Z|NCYlo;cU)o8 z#-!4)106^mZc^Qz*7`Bb&;#1@4VkGKhaTAYx=$W6_(r*P_8`__X5F^bEi#QyX>uTK zgiRZy-`aM&tPK5Uxa7<;1nX`-rKgV>#%3gB$dAiR&a^kuWn?CeACxqxNTXerS)XPc z3AjYJow9N3+9=YQS-S;;(+24tnaUebF@8|eAnwtrEDEj3wE9$LM#H9crSb;MOh_et zD6~39+QOzzr)<*rK}mz$8fvr9X)NQ26qWATV=`0zLn?V-rH5PIfrG1jOVftVo+IPAv zozY>POD;9j@@T8nrKb(Mdd_5XuA~{94J(>aY^Q5Lp)JHHOQ-*_X^t^tn`LT$g5?=V z9Ml5md^mG}FQaV-jwD=h-6ND)j*$a$OCt#@>P8^@eRk%fg=5v!iCktiW~6579iNdt z5ViWx9iVXplh&CjZH|b{-ft;|R?bWxfe?Md8KO^cL-eU!h>k!)f%0tojX1tpUzTk@ z`!+ErOP^DP=(ElceYP2*?SCjxlWmKgAz@dufe?Lo6`~KWLi9l=O=1C>+yeMzW@jl> zW>3tKZ%+zrVhMd^TS8yomeAL;CFXR+{E19)B$mi=U#goI6*=~6dMlsf@=a=9TeRI= zykXOa4}2PL>7l8w2`n`%{dv4oV(Z05M`V7XZ&PyJSNb-dZNAWVBDOkgbm*W@=tmB? znfh+t6`a2443&np`%=OF>olaCOMjt&H|=(9gV3%G@y5`uq3}kUXtyx~P3dlf2AbsD zMh$ODiQjzyjC{M6Lpt%fZ>NwRFzsT}txJw*thdB)b5xorUWWHH_BoMrXU`mB+n{Z2 z9)*_Cl(Zq>HfRW~DTH=ei_k7#8|W+!A?3SmOhdqZe1MSB-Fr6BA#+Ove%bo;Y5eW! z|I2@0#$T!8h7Iu)!xd_{>G)jp3)SLz{9@1K({DQp90NS>iczU_%k|!W;d^heHhIBE z`Pc^h#v=5ktg<^!SN}JE}&q;aw@wG}Qam^d-XT9T};u>Nt>SzT*wQIh+UzSiYMN#Xak z`;vQ`lIpxGAD_Z=>KfV_l3qje#H5_uvf!%biG>pjHaGi{O-)FuZYl63D@?4SrN!6p zxFhY!DM%v9mkgNvfZ^QR)a-*dnq12+LChWL}b?aHv2ZiKz~3_Mj_`nw>A|-7PK@MwoGjCC94-UBd@>|jqDdCwLdwe zZrbCxd&Jh12ePoX5H(&{8%c^~%agnfUL^I@qT~?2&$x;|=G(2ed#+(pqm_ z&GJ7!B$w4S)J~n4uKR5N;I_zdTKF`$P=|82`WiMDMohcd`eFs9PLsX@IGOSity37O zcP4WGi+FMpq#&FwTBcB*=|Y9IkLTt{G`Jg-Bs-OLC~87JwQGswg=eYVvKB_)r6Fa637yuGP1>)t4NGN-Ij{`{yib?pN*g zEt8T%qlIgVk|X?c<~Pq-=n@MiB7KxiAL;LB!|N6|_YWUlm*kP!x&!Q*S_UD;@ zhT@+jAB&cdlbf3RO-Dv$)ow=n8naU;7D6l)M{h9sMg)(7$!$SNX2SoONFCf%|D^%@ z85>oIDy~biiy!Bl+und*6zRu(bc>pk!wYMD4ar<|zMMjIxLRK;%s(|^1jnCp*Vb-s z?H}n)OWrlD;9OMGXq0W#w4&q~e?K?jSk$u#&+zw46OQxuD-)jS@7E?A@9+0aSm5s; zV!{dj{wx!oyN>0tl9GlL(&Sg%^$UHBd+2b4)u@DxtR127Xk^*=s_g^`LvGa~+v z9O#Bc$w0bk`Pk(2sr{OdX=uhkW*RVJK0z4n`xeW z)aC5Wn`aiz#7NVODFP!ahJ!NB$BagmR$z!4o6HBB!l*gfvL&Y=a-RdiuGE18AS!slx& zoN0`j)~ib8*}_l_vqjCtzA8+)#(Uusp>&`Lyvd+uBP%_-yT_C2fh>3k{EnEHXSM zve^Fw#=RQEu0V|2*vI@&;3hMZ){K}-YcYJ>q+MzFZ0st-XJbnYpN(B@Y}SG88e`K$ zmKvKT(rRp)NW}0oBC^czm`I!9F_Ct|V$HBE*tOO# z6I*HhGO?KT%fwcpj%TDBu**`(i;)p`(Mu5RHkEGJlGUKD!!(Mh;puTv!_#YdOorh} zK={J6);>#FiPbJ@B(8T+!@dT3E_5o_x~O4T=c0z;2Jlv;^{uy*)pw(d8upu9)Ue+S z$ttIBgNqu5TU^vI+zQ@{()w<*l-0MXM7&f`6VYtixM79#C z#cJ)eWL7jOCpE1}P18l_OV|wUUx1Y%zX!9K+x~R-vmv!l_b#1NUZ~krLsaK2&svam zan{tVak!y|lDcu5$1JbZo2YG4UhT7I?j5~%_}-koUNtT=$_Cqr+GkmH`hS}yS$+Q` zzG*%d{hONmWqW=9d4_r>YXhz*t=`mzl`mMZ!)d9`>&RM^Rh{L}8b3tmP2J5;-=0(- U$Anz}gl_j(eLcKK$7k&S05mmr^#A|> diff --git a/wasm-notebook/fonts/FiraCode-Light.ttf b/wasm-notebook/fonts/FiraCode-Light.ttf deleted file mode 100644 index 88204eb19b1f5063d5efa78c7039d91fe0107afb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 225992 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 {_ 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

    cCe(7t*t?iZ!rJc_y%L% zXzVN$NF#K*3Oxl@kD9q6D%PQSZ9~J_=B9NG4eOc~Wo0>?c-^OcI@5-R(#ot$nwpka zrL0~()U9t!_}{d#d2Oa6H7hICk*R;qPEIxs4K*ICKZ_dw`~4B8Ui$+e zqL9k*PE#JNV$d8apjnRi)+W!pB3YpHi> zeqmKnE1t*R;n7_oz%KMNj|&b)vzCqu-is4-%Qg@^Q^=C#yf-J*aR?=Kx{ zUc0tx?b_xgrF~^p8URvONpD%pSj=%nC!A0;60^Lethb~h+#=zn1#j8>J>*y^Mw zIX1!zveXsU`vspNMx%1L8W(;7&oMSE+2hM_u&8vM4+%%g`byDudC6C~D}AHsN*xJr zydrH#Pv_T{HhK%cxE6P;zh5;0;CrB(MrJ(R9u z0Ym*Is6SPWVFgdHhWYCJc8Kwc-Us-`PPJFiKP8b>af++}i0;^3?oG)_FL32Ida4`x zYV*^p_{X_*{-Q!#b7NYPazScIwzr_LHi2KN)}4;M>&Tb@`mx-TlY+W^Q59OF>-S0N z;fg;Df8zt^hpVk`R&EGiY+Nq-iDY3CQVFa1`DmZC&k;a0O@KQeUjDmvH;%87MrM|B zGQdbIcJ_9uAGvIbSsmp;F7!zfQVCn7+CZFau_AZ2gp_m^$+{V}ac1FknmPV&K;}|2 z(gvB$y{5qu=y@e|CBdo+R8xdg3w%DxQiomPTGpd_PZ(#&0w5M}HDVcghA9)Aq^;`6 z&xByQ|2i){)a8nHy z1s=Q47mGCFA}3fOWp}11Hj+gJkq{f8bju~$#T+?KpD~x ze5<0Tuw_|R#$Uylm(G?+Wf=1$mLJL?Qznv&W595FFh-eDdm-z2p(BNo5S!JcVLF>~ zOJze}7+U&;hNjb(artNQa@+K?@%(SKD;klNV_IrqetK?JN>*p1zdfxi)Ul+lG0o}6L9dzi?2e|w_O$ZQ;$h|I70&GZ z43LTBC{N4I&&&gn=dg36X6ZvAPt~&xB9Gui0XJF8J(Af}frQ&K9j=QMTF5bqoLW{S z6}95j6X+R8tB7=9KptgnN0J$QUz(qvoXl8$eSTeaCFM^{&P&csPebjAh4DZUr5l_Z z;5;w>6p77LGK1(MGA#<);=9idh0Y!w-Pzv0bF_P1b@jUL?sZjF>$;0;v%P+QNo`G8 zRiQiB)wiOozfAh@xV_`!SB#A8T|U0|xSFmV{rzWjcAnASzoV-+#aWr#-Wh85R8?-A zY#Bo^ILR#)>`zj$hKDl911AYgtn+en3`g>1lNs2MaLx&~dcJ6{p!ZXH4UM$ z+@jbsPd=GvmMt$wC@dyY0xvT&iquM3TDLro^qS8~6#erE7S}`)Pp;{mPAe!^|u6j;ev5ah%0+82HHm?}faV zi9;R`tEnzB}xUT>r6zO)@X$J=mmQY%H%8nco zM;J1sWn@gGAZ(|!^y!q5Q2$X+qKxcFIG>LepKv-cJ%g*D7i^3ez4OlDJMWZkzp)2L zQUACH@v@P29qh{k2R&%FAd);hj#KV%${@s$SXMwF@`xj8A3>NOPB^}4?lWq>amohD zwVdR0is&iRk)kgJAUjwjDLG|}kL>vkr;Hciiw;m1ZtMAZ&n>s$?KX^;6S7W^^e`g5 zb1+`%X$cf-fVC3#DAM8Up(l{68pP@dRo+dSJpbNhc4fG6UFU|(>iiw6c3$DIUv}QQ zI$oN-q+EJ<_m+#5qm_Y**1nyal`XsdCI9%lgN_LRkAf>&v=u8d@|CblLvc2aT6rvz z@u_E`c_G5ESPK)UmGLRFDGuY6IbZ`er74jqmCpIZDOOrB$myoc0Xo`@uK{!8INc|z zD6$w*%09-_(<{{^eVG|_8bEv;94IlK1OzgZ6yzx&!W67RBrZiBccdu_7?0*~Kv|LE z7G1EXt?T-ePBBTbZKs@Mif=pH<;uxPOUv2$H|gQiPJHXFEoaP7((Y?ImD{DeXAXXG z7hhSiWNi78q4BXLGe7BuMgZFBmy)DJEW#G%7hEJ8$vAN$2W8`wE(FntDU9UJIG+xg zW@+8w4v!xkj4yk5<)xRbcv$XLp8Dt`-pK5;ch7zz-642?8b;A8PWx;?9-K~`g1HQ- zb62yC$gy@R?F$ci&pQ3oZCf{O+^}k5Y-Gt`PgiF<&iD$7WWfd5E+;m(*mWg^MqU++ zELICt${-X+2mo|e0G5252tt=8D|AZwfXXSZf`$GxF!@5iSuGHt4@7Rz2WW^ss4!}) zrw8#1^btG{1qd5huD$E{ zIW1TuS%NNpp{ZGElW%D2INbC#?o?7uO=Z<-vQJKJ>nLjNc5)wgRhKrKl&MxvUwlzQ zucx)?6Hmd4Kyv|aT@;us$ghz;-2DB`;r~T^a3WcL@Ig6we2Ayj6{e*u3v~`ToJ%u* zwV}Jyk)H18>e{$$d;1Bp!^uwwwS9BLaas1oy&Wwn^46_9wY9ywGbM9m;}t1mOZkHj z^5M}GUg7fB*;+@IEVkA8)9l12i||$jJ;y{ucpuVAix?kDYUHD7hD;3RnSXNmVZKYs zdQW+l*IxdemtRI{J+GDp-Ym*`0{a9`s7{Wv;y5=fc*qU~qq$E_ttG=aM0!vVC$l05 z3Tb4%t$eEG*=i9Vy~?aJDI z$t7JEsW&g8cD8Hn#35g2%zgIwsCF=~=QW{>DBpz*^seoC{b)#U0@)neqZ&~AaTxv3 z>yJ_Mhb`QN!^(G+5s^adt_nl-e64b5A?U%eX76K#(vPJt0#A9+TH4rhc04;1c^UT6 zx_reY=j=Fn^VIlIsIICI8>@ji+0eoen4y}G@Hq&TElgEb`cYT8&=b ztu-rsi^gw4jNgHoGh=XMRzJP1U*Ow`^c%hE=xyfV1&Tx-Q?8@i{9byOzKG;!c9G}p zPp+&1tqIZ2G2bqr2mcylyYsV4-yXS5boD!yB%O%_Lw2k=Sl?1&)b&k8Ju^#;h>_FfYsvgAagD4u z$S-|6Qo!CR&J~MXe+P@CtR%x$V1uoo182vtq|utIb zVr%U@Yed9S;U9o;B68WGTPd_pjLU4{?AO?@p;vg!cPRN7ddYkTtYfB6e?NN%`@2MW z`m9)ilG*Z5Tyj!kTr7NLl;S=OvTce9RK(ey7_(Kjm?6G#NNma474#Fj&9>tdUOI~p zeyW6+1Y10vz^9$hB~Iam+%3GnNMnh(14=Vl9m7d;Bu&dE zoBdm-V*$63q>FtZTR zuo-p{gU+4A8&m`xya^>{u9@#Pd5xt-)-Ua%&Oq`Wi8Y-e5Ux*Rm zd(aX%3eMO;;`%AlpXsm%E3=}0EzdqG202_d^M!!{KGmySgfYKNtM5ywPlXtV)*wx# zB=3QZiOxUU1Xv|LhWSD0x=I?hF-D8k8eps5w0 zDKktpO`*6L*m_ZKc)r=t4BG?jsN@tEu>wqn;?MQ||Bt)A(9*8#wkw3zwkt#}?FvatOU%rf-{bW@=hRFW?C0|R z{_*?9V_xs`e%+q0*ZXz9;vdVQCNYxcm{V zflR?|e`#bJE)@s~VS`Idw!3bzq}ZQnuXr=wR7z{7wxpyqe1Rd^r>NRP7uJqpGI;Hl z&2EPzJ%hX6s8ci2Ih?tsTFKyT9PAbR<&rZ`zpC!sJ_GxoHROcxT@s^1*BRC?=pKB% zV^xRh-yh%eDmiiVXVX`{cUJ5dc^8iAb57srb0(;)vT>dBr994FYdEaRbH|;YE`bDZ zT}SRVe0xY{@S|)lXb$Fx;f#+I&}%;}bmxd;S-mrsu>o=ByO?-=0MoI)`%c&^4vhg&pG@ zA9W0+6_;Bj#K!Arj*Ig~M@>R#`qbx=i``aXj;#nP+ZwjHjOiTabfUeUG3~8->~+*0 zFZaQe7Z=-6TA#1DthlVSBv2G6Dr6ppete3(+umN7m0DboXzxS`kGk0oVHrJ4GG}$$ ztGXlag4cFsDz~DjuxnA~8BadpS2R*6XpeIPwg8--3T=678{=v$znk zFlJb4YUI9NAyV^G^Zc2I!qoQO-f*iS+18Q_-`L)>4Vx2I+pd>rmC-|ECbi7-RJF_t zZVjoINAA{sCfHrR^_>j`S9diw9=b>y`BX5OGI6hb(GAmo;SPY1JaTVyvEJTXO!*hO zA51sBDB9kEH#KxKRW6k=Nj7vJn!N?>Y&VX$E={`GuQ+mX+N8DyDTq(CvwgNj!)?ch z8dwLfIBwg(3P+KRCb{?f&7P_d?XK9PY~_N2$9dJ`5&}g{FM#qSGMu? zjSXIqs~Tj}4&2^>+sUGHLx*VBZ96<{WFr@nxgY$n^i4n6UXK*|%pu1^C-ci4!F{!N z7v(lRxYv5L*PN4@mT`A2N1eZ2@km)paKG#6{i%{5QeZ0Oy4 zL(NlejujkDajO`k_l(^7gk%dwpbZ zjJh<~Ja*LauhwmQr|ORbPaXIDxc5F7C!@#M^36v(?t!qsIif>DY0kkGBQ5&2{c_ES z`5^)1Q3YU3&$i)$tBx*+-W_Ss9ZMwXi8S#@(~r^j>JjdHb$9z-^mHg9!ebq=RCn(B z4K9AmZipsFa;mtLbH=TujHHZ6VKKF=mPzu{VZ&NpR{cW57IO0F-~;Ny;OjOI>*o24 zsVsB-uww>w?wCP4U*Z@lz#BV0;QABmjv-uU$F1g!d!8~jRKkb+;%`Zk48CGL)LVuP z3tn{4Q#rAD$7vCN%@3#H@3gSLb}Xl_JC@VV=L8xd)@ygn#`QbSJ`zf+f$t5`ZXqA) z&K?wiD>SSS&G)-Pe9wT*=3&E{=d}~Wj@?9r(akgIllOGTY+|V6IyRKG|M2lP^V?#+ z{q(ji-szNkLrE|4<-Z>~J9s6Ri&m><`DU<(ygqn^+S>dl-RqQbUww6&%o`(ff}e~I z{{6IlU)lH%`njX^7iu)+Rx;~z>G4{B7-*oIMMY-EaJhMnHoRS|!yE1$bVp1WJW^-b z;e!!ezgTYDJKD-oQeA8(&cf5&iEW-^gL5ePO7s=9u)B7pg&k4V=#w^YKI!XIC(@`c zsHi9i&av7Rl?8742$Z?C+T5w<3ze zdc|ZFuj3r0Yn;}uZ!AY0>J!r)nx7DSSDt;W&at|veYcow{^i8yJ~*OtJZ?(+-m%RK z9SQ3LgtaScZ+nXY4Gk<1tLRi-5b)E53=Ib)D{b$A{ISq>?2w=PP2pI7CK7szz2X6l#pc|B(dkEhTxEImD$#R2IB>46-7a#}KFd2CE{6fIYs6l-&h?J2P$KXTJi zw4&2w>|(%h(rvnuuF~(_%a6JS--%p)B;Rtr`u>h~J*F$$U56BWva#{LvYgyfd%Lo2 zx3LPuZMVe<=AP-~QF6vf(a7EEtbHS2aj-B7<9R|3PfE2#rfwsal($5c!`kM@^5wPaaOoI8G)aV$?letbwfEyK1E?OX|cf^=>*vW=0Wwh^=2wh{juJ zKP683tl!FQBcvZT=3>ibs)NXwi!CYtgE1Gk&?Gyy8FMKKw;A?^hg`yKg}vbs7h6t* z+6;E=Cyr^UVGSq5MY-eJ3_VE^8_kfq6^Fror!j^a>qiBOkB`ra&$5F+`R+J!yV|7f zSWwGzA;Au{AtHl9VF?d49U`McHqJKF#xFS7#T2iVAMPmj_jNBf>)SV{(3v4;(GO40J>I?GtY%<- znmewenvlUA3rJ&3udbmwJ2RFJrW}%%dRRWNYvJgJ5_H=SwPONG3{Ot;x9xAVk;0A( z&^s+F@J2=lnmV@?$ZWN}j;30t7b6CLs*ZG&+X`sAAi*WQd-rzp#~Z}e>%>)>o&8CT zriQkI7Ke4{kX+GeJ<5=Onn+9Wr`QOiw_MgXzHATL%WWBSg_@phC*rAelbTLsWP$!r zTfy8ulACW@zoc(;Eu8|p-h(7y`$io8#1&?;q=a$IU^hGdByS8}7Q9?t8~k{5aEB}y z6a4sV_Z);^H_@4~_ekF=Hq=klq1(?(LP{F#2DzvpI7mMgc~XOHx9a0lKM5)Ht0HA3 zx6#^?ESXxwmdPoks79KR3{@UkEc@Nwt~+v2(ynlBem^vDpsu`~s>7V!^k9C$?R{)f zqRtPE9yBfE2D%}srQyr+tpA~O>`;>ObrL!0i`h0gBsqx^gs}`dc0ZDw>EC6rZa673 zoSfZ4_3%X9lI4zO$b?1J)n<0nhISvSL3MYBHDtGMkCMoBb1Z$Wx7zfzlH+Y$+rC!2 zxDH2o%O4{#eJIWkJslSNk&j^0Xs|P7_$tbT8gXA}q&T~XCEH|uBeHB))94|Ae8$;w zbI9J=4OZ7VhVHnq1GdFV;b-i{*bKv%F-*#>a-!AyeCj?iN$m#q=!NF(DKSgeXT z)!iyObto<_<*GV6`4?V+z-Omnz~XNvu5A)Hlzr`4$1DzHPS7?Y-Dg=es3vA`a#eO} zPG(+hr%ttbnK`K`d8rxYxzWj?TNL|J_hl8NXLsv}Zboiu$fUfZwANo#+%-8pH$Oi& zopJfp3@0irlz41~n4y!B($Wj^GE%J(=BcR%3g|nYEQ-ukO?ITH&|JBU`oU=pZgtB7 zmNzRe@jO|^hGwVzlY1!{Rnt{@soMl?sk&Mf)mUA{FcNDs?U?-`6Z!}f$JSJX$MGTT z{C5dU4WexKhym`&ak0_b%QWH`_rWX9Vk*aui;oC<){zMd9VN$DJAxr`{UbISIvw3G zlQhaJLKeM>r6q)T1gk?cC!KrN8RN#Ba?r zWa&eVA%9+njMTi8P`c{ud2X+kR$oU;;5d2nm2sEEdud>USFB{$q?y>2v*@yiHuy4;RcJFUx_SGqK z2Z6$lWSpmTa6uOaM~Z`Yv~f*dIzT-Vd}Z{PecqR)Epdn3)h2+`Lbd!QydP)?Yda@2 zoME>D4V9jl+8X6VjfqjQjI_l#FtJ*Izb9=N9!3Z!`Ll zO-9*W@`hIxdFlpnc6(Zv^1NPy?AJb3cd0wMpm%ZbnfUPbBm3Rxul$|cs%{ejJKqtY z7-r_1xlc-8R&Y@}vRA}i&&901G-pxH8hZZ)#l;kh%;z5pv>RYrTW)a~i573L=wOgi zvr|)x{PLCHi0s0&^y2JD*koczP@gX@zA=t}uCVsI2k&PNYLfhx_HM2i)G&aSpVIbr zdzNgm;LHl9Cfh);Hh@(fj-3xeiOdK2nT+-4`g3!#?K&>LaTF!IiezWIcI#jPZ$F-$ z7@9VuxKcTv;CaYp-dVTJB!x*|BDZdQ_vNF0A=XM*OpP!jkSDsUM z$`7GAKp7lE{kGMu-);?;s@-#0<7^O=-4YC)3}M3Egr5g$H!OtS>nxeEJr>(9V4vBX&erYJz3GQ)UYqvp zzb^51C1EK2m8Bgm1%|)W5nu2aDYI=VZTnnHf>q&5y>+OS)vng8$q&`Rc{QEdz7M73 zYJa$TugEJJVVWIZPdBQcCbC+EekH#=>N0Mo!P}51Ph*vnG@TZ(eyvJmHyeU za~n_Xf|tnKO$}_lRL3)bRot?&^>qA+e)9?jSBb6ABqZ}h)p{b6&#jQ+at6GH~3;8p-1=J^!yA} znV+6kIPK!3oD2>VvETf@;K!};t-rzja9n$FJ~UktNwuMM8JKSCfgSH8@@CU2hQgl;GlSkgE4;}5Pn9gkvxo6u z+GSPVvEq}on||l-lFU( z^klE2g!5#(V{B49s-9#m-WNY7E+z3HpACK^X!`JEYo|*V$6bW_&yJ zACZ*(ulgN|L4+{DW^3#vHD5l~w(PNmgPh-{@R8zfb&1@dW0@a5n5P*qvSq@Nc{*Oi zwaL>qQ@c9^=y!_Nh7!{&t6x!9Ur$rouaml@L!W}UQ@fPM74+#~(}cK5T`b?$X+K`} zAfGLJ8%pYnM+t;404c3>wc_FrsGmJcwWnIh`kc<4e?f{Sjoh!4-^5gA9D#Vbu> zvt6cJG@8<)TDGi(Cq!K7*+ki~b5yUc6@z=^)l##S)Xz@7=mb*{sOS+FTbXD@Kep@) zs@q+NC)CpwUDvP{nRcQqPr`78ErfpzbF)%;kDu; z+;s*SzVzfow<3ycEl!TiJ2H{ez0LEl0)dQ-{QQh{kioNBn4g|Wt34wxFT<)NOUVxM z+vOC7iT-Q#o*Wde_q21U-V^K8h4Mk2Lh6gud-kJU_eNJV&S<>U4f9Rva=!OrWo`;3 zZY|t&;?T1%7&BzLy8Ef(75=Bn9*9Iijc}QfL)~_ifaAZI^+G-CB8PW0gNIyD+L_dR_n1C*;@UW@dT^dTKjW zkIc35De+r1P2R8T-0%34`^1m&G2O0r$jA1_^^CWt>p)g+Zk9hMH%r&mck0x;cc)JE z6?y*byu55bHG>oj)m`$>WY8>8?}oFR-QUBee>-vL?n_c*Fcr!RbS3Sv5K7w$In+P2 z`+VHSO=R4!T@S)m&+?S~l!Ua{#LT$rl5uk zUy~MZqU=d-Xy4|sv!>xP=ZR2*N8i+G`t(kAqh#AMht;9~L3zWJ{C}gYIe@IUA!}B{ zQQLWTEj-an%SE0LYUAnK4z}@>SfpCzYkHcSMp<$3v&tDaDi3bqZ&${wKD>-+JxUp~ zS93m%o`;|L4GeADGVN&XYP@Ni`sMMFvSnVovgI53OU^Vnn3hrq>_30we^cK&z3a(* z7V_aj^)LCBehD*e+H;YzWns8%(Q)m{mK8c%KBG^^PG-Z=+A?(ueAvJ%7Ke`pIkT!kKpYyKnz%I%wVL9*)o;ue__a$!qmphnZ>Ue{BbSSLfSZ zGr>xASL6l?VM%fj-pmktted~L)3r};)(-=-1U@(>O3s!^0GxEF%d23O?RzXvgHt zgn}+r>uW12x^#?+?ow#o+N(y%X}bKdI7}YbuU?lY{lRYgkz%*}QqEMb9A+l&+`;|S zD~TJe87*#Cv*jjjZ@RQ6n)G$URppih_ACO~7;0~jN!)pFD-2V7DTvq5iQy!02v`OsygW$v0>O^^-F8TR=ny>`6 z)Hu`x9~9}+=#u>O)S^hIiS~EcecNYKWA*fKpKW@iPZQBUABr|Bm^>aNnS=y(#6w?Qr!-K63bN|xrX+(k9KMgH`dD&<5|^-9|cP9|r{_D6#HNM+A~I`>d;o!1jz{2cWunpjp2xK-i4V537yx&-gWJt>c81nDL)g7@LX?#T^1>}IZ`4nM_f*lk)?a8Tq~>4m|q&$P#;6GDCrR8F2-9Ma0{Usz3F}csC3uxnUS|C=8_xK5JG& zM%s%{)8J&}Z4IFXOwF zh;Cw>n*vTelmh589Q^uGp;T-S79$y>aHK(uH(HYdMwFJ?G*H^Dw6b$Ye~G{NV6u+= z$&}zZm=4-^U*+gyCh&EKwK{dwktySWBO0Ql4=J8w%wu`mF%SERx3?LR#mvtc7y0k@ zvwkvK{tNxAz^I->3$R?=^5CcKF~>b09_9_5a^;JRn6pTON|0v>?co^v*Z;byPr>9Cg;d$@@zR=_LsfIaxs88M@Lk4O0Mmr zIA=7yhn+QaM*#CwhMiWme^OBy6!h4UgE9hDSVm*p9{%8sS6=>N%9bHzUF~ia`q#A{ zd)Q_ze_X2EU)T=4u;-{Tfu7;Tco8FwW!}*CWxKf+Ly_Y_a5|%wGl0|Cz3L99XW(S$ zsYgw9Epl*9DwCl2T5aV-H}n@X_P-+Ql3n>@4OB5yg$ep2WsKbL+BIssCxu8-WHW3n z+E~RVyFu`7cSGyNGw2+DjbF~i|dcIgn|Ds!hJIS|msSB71L?7CBG=VZ&$tytCq ze~Cr{o`xJDt0f*AQ?(fx^G5VOeMVj2v@V{C;?izRfUC6f?A+R3b!>>E(e2I1iSooH zc~W~PCYB_o^vX=g&2Wl~5@K{b#gxn`s#?%c*0ndc<=@*H1ET1}6WGqg-j(UQea zIe~b`Nip$0Pqpqobaizxcf@<6JW$E;I;-Y<0`x6p#Q*>%^l9z?JK2J<~Qgm*Otagh1*|A2Y z`O`C^veR{(lTjFzo0cxwJQXeY{> z?@?qHukwv3u3kN~yRP>5;!TR<#B*$WZidvEaZ+cT+@mHf#pmStlFrGDzC5Yxu*?`v z@-NFN@%TE#$Rw|?SAuamr*cY+w4~KModX_n%OHOKqS7#SFGNCBT$n3bTQ8GWXGTtM- z$?3%@Nj|4so!GZ3A<87CaO_fURAC0Y{BH9rn676EH^pciHgze7b%W2xzf`u zN2hix)#RGuEE&U6Uw=kwu1_b`kh8SO^qIu+7*$nKO1{(C*><_SH;N)8-IrXEX_9;R zJ@Mq#ta#10GU++x$EP_uTI)2E_LmauGJ<7jl8TRW6bD%SYr&`HWmIH;TUf^5jPOid-juE!W5=dA~wFB$vti?2ww@sua(|Fuf~&$LR4i#Wd0HiFX27iZN$9s!)oF^*Qltv{ff4Nf8@scvJgLab1`N~uz8J(#A=h{Z)@&A8s z8(om%GurD@Suvh?j`FGqHI@EMqtF{?GAT+u6*``i9gHbaX~v09i}6ylYQImVFg zL58D3<){`zT6?Ki^aA>(1)`XJ@x_IKBo=?tM@^#fO?LEnIAm9)amWy-``1z;R#!6@ zmQmKD?BP?@s7DiPdY+qH+97*XprOxA*%{8Gfv>*WPvyR#Wl=ZvXs}}1?;0BGa=S;T zOqEw9{05aUIyHF7`S$lguNzHz(fNy_~}ACdfC%X>Bs51Fxde?`nxhm6VF zg0n(KXLIoS+K~B)tu>6Yj%Q;2_iDWT~5grLu?H1;$rb`-icT)8#3 z`H=|j_&%X&tXUa;Z!Nq3JfqcEdp0>H#vUY<=br(ma*wr$3DEZ#oDy~`qF%-CpTo_V z>v9yVI|{5i8Dhh#ef}{{K;JSo%tF)#uxf;Ip7X%EeKaa~|1)WA#q1oI1~we$9Y!a9 z9}O$R;WYB@=aPk4=P2a!j+@qw;Ba^CceG)*;k5Eu{o{Wgtv`?+Kum!JN3t)M_AvQA(y&l?Q?`k8v7Y)Yw$38 zk#reRhoFBnth`5yvxp2oN44QgJ_>cb>vI$iPrLTpT7PUft&CRxY&DjGE%a<z55v36z43)04saYt83` ziAJ?)cN9dzX2W5zc4NWHG!U}G&o=yh!TJ%&w^mjwvki~M+OgQQXt6R|_wBosu-b^) zBmCRS3T~Ng<2zEmMr5-2(b~0G`6Jl)h{UN?t$Pc>%420r2tRj2wPCeo5b@@gL-w8Z z$C~LKRt;(`M1j?FU>tINk80hw-*yfh4?|%lJlF;sM#Jr zq*<$4PKSQbCrmD?%>$>xnP6qNShH6F-`_P$dUngjA*j|3OQh_vX*&h1JEVX2*@meX z41;2*f^@LocqDWH8(%%c*l%q8xA`g)Y}g`UvE`HY z82)X)i_M2twt)~0Ru&sK4%qZy-LP?N)1j3s2|9xZte(whQ;_RBR2z1iZf)8pUABIU zN*uR7k7~_YS#6kYdbQ72K_ghVE5O>D3O1hez`h?2R?j}q0qagV*nDVZwdp<%tQp*F z{RGy*X4nQdgjCmUYiAbN?;i2frW-5AV8{X+ho#uLJ*2ws+HYd>mX#?GezvL&gY|PU z+zOAwui(ZIu3TX=5wj8XSaw=J#qPUczcq2$%J*XbK`1OXZ0lh)kd9lkfp5}EUD`^S z6KqAb{u6#1zMnL^1v6XWOd$QX_5spCYZ|10m4kS6<8Cs~+rh>y@#OkXUT8fIY`8bV zoA4lDHy8x_`(EH1M9NLqjoAMpkxBE?J zpxQKIvEOVA5ImdH2!ud4RD|8Ma}+_nsbv%r4yDzN3GO)ECdoDKcJwqvZ`R2T-4 zc(Y}^H8&pGnzL@+0k6V+a2MPO_rnrc4!41Q|9{C`@SpgdNZxOP{b0+WAhf_<_%rMR z$|ASjM?QAVeT{1EfSccKeEkKUg%99Ou=#&?7|I=2|1?w^e=FcScmu4SO()&Me2!|( z*mA_`S@%8!5n}^KVm;(j`GiKA6T^rCc@%2 z?;^jgYV}VJvmVuQL73^N@58n*?akfM@-O-Z_}Q`*nkl0xSArXXv=#hRjctAeig}(7 z(}>R~)MV_uhki~&I8hcD{BI7zQ8l?2krA`*vZ6w8)m}fB2Zlp8%uFVScDOmxnwxfQTgPJU5vPJU7Rc*j^XnY2X~e45 zjDst;n}*E3fV9Ta>3di2PwdJa{adcN9@^W>%Ud4|A+s!e*IVE zv9h$4qm2x1Khwrt2B04C8yVbpd?VXNv)?MBMxNXL4t>jzx&QQ8cIHO=xR71@d^G#* z-gj?fCXeSI!L|1z`p2>xu@_NYa|7_pmc0@8cxDdJB~q@nRjpp+ciZR4JFAMdhs;FY zTeJ3kgvk4&nQf~Vk)^G5^4S?%`CY<^w?lr66M z9O}pD^#UuObsP60?c<=W?@QI#AO1mEKAN)JM_KxA80ylXHt3 z!p-ogbsJuSyWu8yF|6K-`W37T|F&icFMAY2efJ>h^RN`!+FQi$y9AL3HTL<)V z7HkzmJ&fXv70Yy30J}Ij0lOaTdX@ohds6|oy}0egZ7=#>^t~%!JqOV99JP~0FZdC? z7*@gt*d{~_@fL%bn5`Tnfg7>QU@dG0{EBU6t3K}g(DUJboPive4@-eLs(1knFcxOQ zLRig3Rz8>qxSgtG~I0o+T%y(ILKtlmx`l2^h8*v7>hm4JR4 zZl*2cK-o;-U3w!-5F!J&GjKbjN{CGS&fEyw*+E(i3jjNQ^!&pBcm25Q$6fzEE{2JM z0Mx-qA#(5|2YWg7Fc)?~vk02-?&b16m-l(R&*Oa_@AH@aDa3CaK8q-HT#9AO$F@Kjs)DQTOmYG ze)q(UUSk1wdf`rQ-u32P@Aa@1_6SjLAP1^o7)%u6xB%1v?)AZZ-zY%dhVer5v&?}- zutJFb==bMcf8GsP3@c%S5Cd`h_$kmV#Go7@1{1cym9P%Bz;13z6u|pN-rHlP8Yc+O zCWCqy1CL$VAvK#7QfKI2rd&w(2?|PN@R?J7obZgWVjTh8v@{0MDliKyNhek6sFEV3QDI z<^%4H*)PP{Q7{qaz%FhdBn;!~VHk{u^{`cl({T4R?47nxh|>qcGH4cJJZ8q@<{9;{ zL5MT?eJ1XliQ8u_7Ggp<)WJxY0NaE(dyNq1;LkaP;atq0iqQQem?YvjV{H zS=gD4f3qjTZq7tlF2u!{xfnMt87ai2b73Lyer`Ri6XLQ4K!(ff068w-2?vC@A_@Yq z7Pi4YA?ERJ9(LzpZ{8NzEyR`cU*et}uRe;$?Dq$hjGU^KS z9$PEK<2kTYh?PE=0)&4RVO=#>h$m2=I3UE6YlK*Bpb>cf74LtAJ5NQy5+R;O@970X ztU>>onJ^!4^VxD(F2t`1=dXFU7ISMczZTinZiKC{M~LSZ!3sd8=Xm%0bilpmm%&;g zUKj=wVIE-rh1G!l7q$zr4nNj40MEaf1G@p4U)&_bOH+W~>lX|0+f+dI-<1pTGVfpB zC&UK)c?EfYzaBONZv0`a5F2w~s}O(0&p%BN;#K5-b(avE#)DP&3-KB{xcxfee8T{GZ=mp1l-;-2XO1pKFEO$LcCK4xcANhA^tK9_6V^RKen!hjj$DP@2^u}F5vFp z)(Y|NbXW}bc^mM48)4ptU)wOdZ4uz^w)KD;+i>?i1BBtd@vsoE``%6=-uD4=ygw0m z|Nd&&0{eydAQS3g6if&F`~Z6&;O7VUxg9^ZTZ7T7Pu$C*$M6JP`H|O zK(1X&h4=^V|FaV23-RedK(^g$g!l}*pKTT5bNu*xwGdz6-xuY8`8~YbLs-7V%$NAN z7eBsAgoS_~`<4swuPB%&#MeG32JC!23h?*q1+WZo<7@1Hy$hO!_$C!_>znmL?8naj z)k6Gxf)L;40J46E|KDNny8}WTm?FgY`0@RAA%0jymjJz{Jwh}OqfdnS7R0jL9J|HWKb3hQ7S9AFz;Ce*=L zm1}X8NRtV5 zFc#**QdkGuU?0bRMnM4TU?fa|`G7fR4Qzs)a6m{;qLAJkA)`7A8ND3V!4}vpBnJb? zm`tdIMwkF|VKJxE1i2+ec>CkmM+ zU>zI~G9CXiCJ33yy1-1U?h-O2*28Wg`%VGWh6S)q$bJK1Dd0~( zWbL;{$o|;t9{}w3-vqoHfZGFkKM=deBj@qx4?=%%Ibde+P9f>D$POxPskIRdbA4t|`oM#ytV!4g;v_&qTdhQWB4{xd+n zN!x`y5C0~Q6>>@d_&s$ZAoKaSe?DfW&4Rmfjd!Xm)z zFL2{-WV#zW_u$7pONCtO1Jrx*@7|3<-iO`$rU35HFOl~LU?j{3?A^aj$YqHz6Oen^ zI@lxR1354drUUOESP%P!d=UE&4uiR{0`TKOoNw0&Xl9Pzl&yz7nteu-UoQmS{d%8}YjI;O@76AYjljF-c=uc*%!TEEyU!b_0{nX(v(F>L z^T_Z*Dl`CQUswTKV5gAu>Ew$8g?tJ9mo^Bwej?z`Z&81{QOMun{_mE+dLduV1Y~`A zrH~tz3i--R*evAlG4}`5jkx*8D&Y4Y4+#0EQLstKSMhg~0nERK{nvQ+1}c3wxw#mS zbMqb{-yA07Tf2mO8$Y)QSOECFWd&e%%SIvJ$$=_B#=ndL!ayHPZpFX9V(+gjh5TD4 zEEMwHIYMrW0>bqkdhd@F@`KKRyW5LlnUEi*0(L&){YR^X+=2NW=J4eW`QemEu`|x|;E+N0kf$@MF|3>fMYlQrk-`_0}^1uWkf55LF zc=rS0`(cZaO$IUncbgW&TG%RNGww8FuNiaAJ7K?&Eve85$kc+Y!E)etZ~{kKkdF=Bp zp}d)Zo_CW_QKMikEE6gk|Dv%QjaxAWco)+wRBR5+gMC8z@Y}ads5tD$BTGDHX=|%Q zo|Et=sTdkzyHLsePUd$qzg^Y~m4e?HxZy{hZ0rR#2vsl;mIzhI`$EE1xDK#i6h&W1 zc+Q}|bGn$xO&LmDB5oA72)dYY>4I~mc*>EZU6n^s1ooZ%8_loKGv}v^&f#ax8Du@e z&xResCx)LL&iUXb8`rLf6SMfD?z2}^3BHQ^93>J2U*CO>=K1CDb1dfH3P0P^wmu3! z$BABIZ}>T$Gl=b3YSKhwe~|1SewHFxE(|{_j*q=B{H#TdTp4~gqELPmes)+#W=|fn z?s!{cB(=d!?wQ>RUxb9P|ltQpg0%$#w_psBOY4h)zvani|?CSN@L>{;Eq zcCW1NJz&(p{=Kc1)#(z}I%qTyeldE|tl3j%To`ce9M$yj85hn7Or0G#J1}R~*%K#S zaQ3Weff?roMopO%7(V0jsne%hzh}*yG3)F(IMnqp*$(?TWzL+Ly(%i^%(!s&w9C3) zFzN8$!=|1)>B8BQCI&9PaN?v{fjM|GV&>Rk{pwQg{GiC**pFL;N ztguV7&z&`O=A7AGXHT8pb;hj86(eY)4-hj*v6qQiVyc)drieKrAXY(l@^m-$-37!s z=mtoCQ^hoxBhKd6NX*aRx3xQiv_1%(S+0(CZz2QfC&OfMG3oPcbh>eirFGH0$x@6G z14V!Cw2at_*y(bZt%!cWmD0KzILyRo-pyhdeJZ|Qi0&bOB6fe;?cuK78Q7kRO93|& zbKKBaA1`p_pT_$c;ynJ2B95#a*4E|NnC^x!B;hPKHf%i12}{)VC*tkLW7U3*Ik?$N zRPf&%SI*hQ`enrC1xWEz`ooaoT+CfaxF+#c0(_4P-LEr?=Q-h!jKBwLCcyWwv1n63 zdz+nka|vb+kLhl_pTXOJ8wYb-6YXW1jsG@f&BWE&NNvB=bX03=GGQ8lpOnvTNhMmJ zb0_y?=+~jYo--&W6{fT(7Oyc#^eSnRraWr+__#NN<|ApTN61^B#M(1K9kW5 z-js_;GFJM;Ch@wA6K}|PnIJldj^Y4^I3&qr(MhJrRBky-6Pr1E{Y}coAH>_-Zj>pr zL>K87U1heYkU26}=E;1{C?QA4fGm)OvWT?MU2KuX;?IQRFS10IiaTVPc$#vzhxn4R zxLTIW4zeSqV<)joG|A4gi>Q@dWreJi-9(+(D!Yrn@&*1Td&nwozN?Y7qNnI3>ts*a zi_U&;Q7^ub_2MOYoH$PQ;mnl2vVl{W`pW@wAo*viJf4&=U7Rlm$-#WJ3&e8SD2^vS zgGAsAc><^E4;G)xp^`gB#Y{O&4!7S=o+vJoBjiYN0xJi;mnX@SI zhdSyKaVbZ3UM$DTaq={Ix)?6U%QM7@@=R_}8zCof?$bH)T=5BIz)5lxCrn)~uaNV^IB^;$J6t8Nmh-7u$BRAk8u6mMR-D1*$DeXm z#Pyv0aHCu(Z<065Tf_t6LAi+YBW{zo%f*}xai_eCvm|~Y@8+b4rSe`*jJTh3BOZ_s z%3sRmoFVZrr%bGnkIKj7B1s zDoG`)6qTydRJzJgnJP>9Rkq4exhhZPtAHv{g{nvus}fbJ%2c`PpgO8f+ZN+CdUc%Yqxz}_)lcsR(Gg7)m>_d`h~h%-J_POd)0mFeziS6VW zTA?0QkEzGiO0`Nop`KK$)vwf3>S?t`J)@pgzgBD2bLx5Zf?B73qh3@msrBl&>UZj8 zwL!h2ey{$ZHmX0WKdD#MCiR+nUA>_;t2fnK>TR_}{aL-E{-U<3zpB3}&iPgEsrS_f zYPNqtf%Oy`g}c2PuCad3-t^= zQ(vTK>DhXYzF1$PFV%DPW%_b`g`TIc)K}@N^?ZGezE)qS7wGHt4f;mCP~W6)*0<Bsd- zy-Gi!pVX`Muk=&;X}v~2qo38k)@${1`g#3=UZ;PfU(_$@_4>E^clu?$LBFDZum7Mo z>Obl~=~wk8{hEGVzo9qlH}zZkZM{YRS-+$IqPOb5>c8oC^)~&UeqVo}x9bn}M|y|e zssFA&)}QEI`XBnA`cu7If2KdzU+6vhOTAZrrT6K7>96%SdcXd+{#Jj-9S*4?O{9wq zk;%D~e)(_GvN^?!GN+o+v{IiCzoT#SN3m8sC!QBCh>e`RG}eqWrKWNtOLncK}`bBDRp++~)SUzoeiJ!Yx7*W73B z7YoF1h1V=I4~WOigXWiJxwu~3Z5}cYn@7wF^Qd{uJkB`^tIQMTNweDg$~@Yjc-_6J76SK?w!~D~HYId8?%;)9{v&VdC_L{HE zKJzd0wfV;EH~%)@n(xd3^S$}OG?`}8VuGgC5sq|}qd5iDaXgOKiE^Ty7$?^8IdM+B zli(yeNlr4yY^6GBPP&ufWI9=n-^q4zoLnc*$#()yfm7%dImO~PPKi_MlsV;22dAUc z$?5ELak@GcPNmb$>F)G!s+?-4#;JAcoSsfEr?*q@9Ov|L`Z^6xKc~Mlz!~Tq?+kJV zJB`i>&Jbs)Gt3$8oal^jMmi@sCp)J&qnuNn(asoWtTWCz%{ko}@0{VB>73j%y4Ep7df+>+0Gp2V&@X)QfIDnnRB^wg)`5& z(z(jH+L`ZM<6P@p=PYopcW!WQbQU@{IX64EIE$QHo!gw-oyE=_&YjL(&JyPr&fU&E z&Qj-I=RW6tXPNVW^PuxfXSwr`^RV-Xv%-1QdCYm-S?R2Do^YOYRy)6Po^qac);P~N z&pN+$);iBQ&pR(T>zv;>FFG$d>z&^^zjI!8HaM?1zjyxNY-D^PS}YVdFdlKUSj5@u zXNld;AH}ue_s*Z3S4BT(lk=MMy7Pv!*?H4>%X!<`;{4fp$N7u1)%mOQH|JevoAaLY zzVm^z-TBb@$l2lSbpGyq?0n+va{l4`)A`id?R@5Z?tJ0walUl+I$t^aoPRlAJKs3_ zoqs#uI^Q`5obR0o#1EB9_mkMd}b@i-oj$LopmM0;X9v7GJ}=ZW_ucoIEH zo@7soC)JbYN#~m5Oiz}_@5%P$cyc{?o_tThQ{XA|6nTn0C7x1GnWx;-!PC*x$ z#naVO;i>d=^K|$0@KpVOon2XXTi104NaB(NCrOlKS#%RHuv}LJ82}fTLoD0ENXt?z zT0>0ONytk8BoToGjX{Gur9)CjYbEdf7ngF|m3DPy`LREt(^_qRK=YPo^*eii_u@j9 zn>O(Z&)M_d=j=1yLn`v~$iGGY3-=uV9Qj4$-*JlkkI279{u56c{>5^vRcp;!w>GTr zSZ`U^thcRqtaq*JR^BRDMXO|$t%|j2y=UF9-nVXAx2*44A6U1oE$c(;j&;|%XWh5H zXMJRCTUG00>l5qy)(@;7T07RRoguV#`8yRt2~ z*v8A$T2`%7n*(jro3-}Qk*oURn}N*OdwXtY>b(Ku$c^`{8|vf@s=J};tQ);%tKOJ; zf51F_Go;nJB{5jH#INaFA=20_7_>f6`Ugt?AVeQ6A0Jq^#p=xM!~XGs+vy**+^-i>!X8?`>-)p9T2UmpsbHYEdFuO z3A07PthCy-*4C|?v)WJrczc+tF$PrC=7W~2edp3|mkH)J)Ysa;op>#9z^Y4=SPc=j z8Un=|0eu|zS(2{}X4b(#&GbR2f#U~(%-EsHtiu7L)fDZMP4V^Kotq=gAB{JuxXB!A zO3P}W*lSZi8i-Fn2-%r_aL{Qqj$7_=y;-wb5}Vc1glL8M##->lI@Z{a-II2=*J+;| zHmqaiJr41XHqf(eO@j7N613IHsdgv{J8H9|dO9IJR#(k+L%w%I^s$~v!k!2+32i1} z!Ro91{*e7X8>!DE>`M~%H3=W7wMPSMlaGQVe56VEWI(i@XcB%VV)4&{{+g``#!sYK zZL|Pv4^uV9fU4SjF#dSusNd=}Pg+mnk9P3iN~?L`ni#X`wTi^*WQ#2GEXyp{rOaj0 zEHf;1pyo2#R=G6G4WBPZK1a(m@o8UvmGm{1zMT#7m$Y10e{va?Y4tOgDNxRb$)8cb za~X{*m!;h-?PlpW{w}MTaB^w#XX$U2{$}Y{mVRdGU)J}}*H8Od`j@3&X`j#c+iwTo z4*gA2f138vw3DWutnVM~rRo1FRY9rRoY*rpR3fjM)@`BTci9M<<}^` zLHY*i8>Daebn4%r{tfESQ-7ZFdCKQi-tpTzPd$0+$x~0BdJ5E2pq>Kt6zE5R@&%Q5 z{QfFXPl0-h)Kg?06xshp_DhlNUu3@(+5ScLQ;G5=`ca}ECHhgKA0@_7qWu!>mnmPS ze3|lP%9kl$rhJ+5Wy)75U!i=3@)gQgC|{v`h4K}ZcR2nW=8uzBd58JuFz=i++mYkU z;rMVk{+*24cQTaEsC_4+_8pE>C!_Wqjz@>%(DBFLI{jN`d^Y2=**`YpwAoLNKfm~N z#&5I#9LhUBo$X??Uv0LJ&Hi=#`Gx&#v)vr}W&3y^Cco|b%kh|_-5l-a=y%TdoBTQY zo1?!u`jw-fIr^9L{qyzHevba-=$GU3`F{KD;M<|U4)r^<=g^KrJvrY$+H>gtD&tvY z9IMoizxglo<|^&4QqL;wty0e#3dK2K8@Hf1djD zl+UZYd8}2o_g}slc$~n^%SV5KtBqUFHpXq@{YeQ6sV^_Jw?A{`xV&_MYeyD z?OtSm71^&vwttC!l;}r^ew64(iGGwAM~U`Jv|FZpnet`ImnmPSe3|lP%9kl$p?rn% z70OpAU!i=3@)gQgRNmpb?r-swVTc`dk`MEwjSs$-@?X^lQ-#R&T#|n*}8{2eoIFrP+vGA2o z@LjfjJoYh2qh*ls6}jh*-N1P;cGEpMadFf-+N--G-|dfl&>z`u;+WJl`}2{l=IEWn zcIy(oerT+D1Hz0F0@X7bux9BnRA zHj~I^64_j&Y$lP-MatG>%2aeQLMfetQU(o5Nj{V^cu-2GqLe{|QaUwL(aiu#^6Mr6 zF!kx?AX8bFL5Y%h-E0D;oGwy;X-5|;z_g=_UZ$eSiIRS5k^-imnyi_MP68-tPdAmB zif$@VQeKl3Fy%FQ0W(fbUg#meZdL%3UpHr&icX>^$+y9{bh8FLe~$WfbCbc}^EG*! zsp#e?Q_)2bCFOKc2TVV7GX;Lqb&~~{dUTVVspw*cl5y&y2AF>6;s%)QuZtY~A-_(F zfXT0$+Dt_kAC%CZSlp(dxP54NgIyfiP-_cw>So zsA;C42QmejM*#=BKx_kqs9$m)aFX`HE zn8_%w%Qj%rb@>KNdEL$drXRZffPf4aTj`S%tyLz4>40xpB|e4Q=cBU0FxholwM|DJx&1c=Obq} z9e>czcyxyVnDOYb7ck?|Z7F6{+SlU-VA|JX2VmOQ;|E~s*JB9c<4mgK9WyZLIvxR2 zpYB93!_uA}9{`iC#|Xf*r^gAv)ThS@=<~;cZrkm({N!hiPJ5--?(R?E(}7lcj}#N{ z9pYM4aFhG(euuT@L-KW-j|CO);v>YdRvYHkq%s~isc<&1v0`d!($q|+WYapRQA%T@ zl%P;bW22OyP)aAFl%P;bFeoKSP;RK^`f>Y6f{}^|##9)LscJA50xV=sD4438|Qd-Y? zxcg+g=p+J|?V^JdFxy23Pd2053Y6Ne866yewOunhH~?$AX7sELShgD|^OHys@%M0A zQbX(AseMGq`m}^bK;y{eXXIfiZmm0w`d(|U@wkTNzTSRxyi#+!jkBNj8(s5^HNZ@{ zT|6#rb|0*?YIA6iJ@fSRKr?Kj*2ZCGrC($6$V!RMmyAZxgxAWmd$?3@v>N+8u`(y1 zJn9wrjDa6CdI7^(A_gq8CvFE{1p*BMzLabdV=hECa7fzpX_!3dClptT0tWDuS^=;N_)& zpliZG4F!cN;j-nfZGss0m?SrhwsD z_DJ?XWT-oBZ}K}8iiFr%tc)?1`(I$s$p_x(MR zUI}H>dT)zzW70h35V4tBzk_wE_C%nmdKo(3)jOjsb_D{b^{xr)Z*dAe)_mx;;87#qJnl8{g}AlX3#z>nO30ZP z5`}5Q)#)~BW)q<5`CTWi_t{w9Wup$}{0v^awAu&Fn%hDb%ruYpo5#)G6I};STK%r> z;*OffepNHbEXm_SZ`CHH#OUnAl~1b5XR1m!T|&C4&iEgpr8%bR&4FYXf8GkbAtxao(o#VP|-%( z2|}BOs(QbssWaQ{xg~)JD<9Cfr!wTaW%u~Il+p0JB_bJ)v1W9)WqrG?7?sxHK zLa5_zr_+Aa*Urssti=VEy@PaVW@CL)P-d4$%!Xpjo`aZG#q70vhg$2O)XA-9u53nc z!BBErs%N%rK~n~$ZeI&}2a#RVvr^XK@xtNp!ol&Pe!PcAG7rSI!{dd+j}Zp<2_(Hr`JhYM~|Z@b?`fSYz0g{y!@?`V)Vc4=>twJNi(Svr@(StVdav(;@ z@btO1N}!pR@@4Fwv1zS$Fnefl`iU&-=qIwQqqpr@e)2_`RzAJ`&N_M)jXh>G9OjGk@06Gk@0M@yX$F%F#Oj;Mur5Rylgh3p_*B+h4%UBp%Zo zhnd4;nxnV8u&2j7NADgW$9VL%7j!m_-VOt%|9S@jer6VrcaGkf0MAa>+hfS(C$(w! z+K<_?j6`o8(883^`(eO-r_uwCREHzg(fe$4Hu>~65@|!ddfNfm9`ALU?g1wg2e*U* zb0%=`7((DqPs^69oY2d3)Y}@s^iOY%(6fHevj_Dy4n4}2*N<^oM{lRl^GrIuB?Qct z)9*Hb>9>9iha8hOM>)M!f?fKdw~Mexy56E@9UjyjZX%pD_B;>nj()d5=Ca-N(Gy^{ zv);bKKI!`X1^&^l-lhSje|ozIzkHbOq2EcMhxYYW4*pS(-hu-5<7NiyM|j}r4=*Mh zz1;$y8Ow_bhi7#ByNa4u`dtYA5Z3Q8fN4j+hm^{f>q9@%xo{ z{cZ!j^i#iAfscCi78fw{NN*>hS1(fd2n6!%KfT=re`&ha{tWN^bUPqHt?CtVcGcdP z#8QqW4!b{WbRGu4Xt#fC?c*tAt1)JN#IQlEH^yqM{$A{`fwgzM-gJ*}D>8M|?{d4- zm<`o&l_I9rm{*yMJ!vjdu%I{ULdj%Stv+sXGwGOFs&)3ya2VpB(G@0}>0-0_Y=&#= zxBYB}OIc<;kINm|qsf9lRmaYb*Mn1a_uv5Mdb5d`)jGTr@RECkt%BJm>;yI0T~C`G zw|~mNM8F`14yosSg6@9IQS7{r@^@DTIWI_am~;t*5Mz{#O(ozC#dq&k!G6 zGh7TILh_fw=&-$WN(iGa521!aIS3ope_%ghTNJF5|Tz3&-zf1*%!i? zmtg6ENY4rH;Nt3xz&y~&Ekp=0XxOG0U|6Yr-=?4)wq{UnCCrLVY{9lF)E<2!-P~H;~(Ldm^ecki5?h4=r4)`Zsdn zW(;A&dM}6YgR1EN)&Ry8OrSF?ZLWyS*>8uX$eHCMZSx7I%_q1vpUT<10&jrMmf05trBWA|F?}!A{p2b@K-~ z1V1-;8ZYpS|C&Ic+2DD+Dv@@P>e=uMeZfrWD}AX?niu*iBF!PynV~22=LT;2@8&gd zzUZ`bPE21a$WPVaI~TlAz?XK}+n|)aA-)*O9tvNi3G2ZOF!6do157zRsNqW~`Sk%X z=(3jso_zXt3i!0?7lRj<6sVL0m@`+Uy_G$Dr;%|odh5pKxb#8o$uvu0G?A9mdO$-d zrclbZ7Nu-o%e;$2NxB|m%4vOkfRcFq&IZ^ve<}k1`t|eY_}$b0&;LHb-xMh0-%2{g zpZ|g6^OX5ltVjOw`EN!pKmUzF;27}ydSuSW3)io|hVQ?JwT;HU$`|?Z^LO#v-htJ~ zPoHnRjBn(xqi^9i!UI0QPMFV&q!M1_{&u;VNZkBoWcI_Go^|)*Z7;Xry;WzQ;aFM6X_s&_uwUQ8}7Jl#%sTU$U~uP!9KbyHifRuiYn?bf|Ffg+Uf(uSTk zoL_EjC*aLfH{r#%ws(O^7+T!aR!wbncVV|$tuA=crD`?lMYgsZ)#|c0no5)t-q;lv zp2dn=+g>bL@T_D3aa6tN?y@(QO2V&1{WP{$NEnLoctJfdKfTy)x#o>tT?Db1c$#<$ z1E=ZO6$JU=_U_h#d#AdctS(j)-u1iNpe>ltXn)y@rM&Ut(lh++5osw4V6u=zizf@N zH?p_yMQiZFi(Osz##0I7Dt?*omt&DVu)x{tyH&%oTM}0%QqRVxBE@py>SECLld0jp zh^v<95?m-E?%hQBY0@?QBJCAfFm3837T~1sC3+|6mej=5*NA(sLkhw{XknpglS0YD zv#IzfI(s3xSiQQq?9HT3M@GtC-7PJ9vnd3SNO;r5_f1@=Bnwq<#z1!f%>Y{V=Ah<` zG)V$2P=njvY;ia7bT{G6qS2PUGpU>Rwok|ErRwY6Oe6Vt**lxM`Qi4>yNX;`1b$xd z=TfJUx#Iop)492#7j+BX+>*&zWOCtj+WeTo4=;KVJu!M^Yx~qBG8(J!6#Z+=UR_K= z%&#LG4Bd!eC>UxLk!-^MO<;$+>T5a>GsJunOvh}qmm8tDg1Slk@CH5Z!TF# zl)Wh=Up$F~DG!b@r{7kQQ|jJ5pQPccZlzsi0>QlD}ne-xrq2o`7Oj}$|T}5 zmEG4jUf+pEQ#P48XvX%Y-uIC5`$C2-7_#5J?_i=>F|Anf&J?$|7O-R{u2ok~SEA=J zK;Ipr-dWfhqFx`O`m$ktFG}Q7-uhCQ!58uk7E<2E(o>|K$*-pv(qHErI&{Tbfr~{6 z*`%-ECnhbE7*{J8XBtKc^A45}lk1Y_|Mw)`d|68UE_rKO*i2E^lIshLp$u89(#JC9 z*7YU79V&n}mKIGfnU-KALC~8B`hpH{Y&S5L=U2QO#`Ak$gTDcF(ev}31D^L&-WrOV zrrpYD;6w%Ms^3z#QYMAHn`qeYrk+J2B~(5@C2A_SQ_rG;*+NAy9~z!ANOug6soXU@ zrgG2ln9BXs7nt|*sC^H$sMJ16eSyDZW^mi6DXwbxq6YV|;gi}YhEHnWH+)k2fw5Tx z+YgORQ`s>#O=Z{EG!@tIR8ZM7Jf>1JJf>1NJf_kRzY3`Bi(jU8Aby$Jq4;HLP4Uar zek6XG+5_>+)LP<~sU4w>zY}!eu|VECAhfmmE~+P{(G8n-9nhy(Mo~399jzLkuJ9Ow z;psv6tw3vEAdz^eRU`38tA_nC^t`1ipJ>%Ee5O^y@Q2{N7U=sUfkfXQYt^v-iB=8! zpF;AQ>ie-)4a1*l)iC@yc;626{e?iH?=Q7#*ngr`!~Ro9zODNHN~?z9bFCVNpQXN- z92@aBtA!lM4jNTdAw)kti_n1rVGD%^~>{L&V3pG(z=d6W;6-5vxQ$pt_S}K zZZuLleLed5huHLgzI{4cFP*+&pnsV7G5!SV_0MbA`GN%}oa*)I!-;zn*C$dFm&aq% dSAQ9O{u6KP=U9+SU&QKGq*Q|UNc>3Te*ng;l63$8 diff --git a/wasm-notebook/fonts/FiraCode-Retina.ttf b/wasm-notebook/fonts/FiraCode-Retina.ttf deleted file mode 100644 index 7710c659fad7a9a12471d862b11da80ff7fe3588..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 226328 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 O#7Mae?~(W;BmV9u>m3?a4o2ah$uxs zMQn&*MXn+$A|OGri(OH|_g^#noSY!{z3=nh?|q-|`3S#Rb7s%pd-j^PX3ahcNw0+ zjG8if;_;-9&*Jk+#;V*idg!z%NRMN(+V7ANqbJN6^=kf4Z5f-C#6+96V@3`gp{J#d zU}8%@94{P$1pT3yfzQkFIeW~+>9YrneXKP;?_eyo$%M(nhkAa`smsLvFYvkP#G$jN zc-O{6GjZIH{QgNpCypGxP@lo)0ArqJQzlQF-fh{L(@dP6&sf2{DN{#InfN7p5c;6! zUkA-F77ZBdzyynAipMd|<9PxTJW(`aTr?I1Oo&2xJ>$x!uVq{>(6=+Gm+9pQx9V+7 z(wRtIh-265>zUAt^bLsLsBc94CgkSGy$s=UoFj0~R>ZgAOkwUH#SV);OtkCJwS>h? z7&?6ttBJb9zY71vMmRQ*DE zgXh#%gONs5Tqis}LXE>crr`KYmtem6slbS*lE@-K4b63C@)yy6+c@8`yG zwUwcKwbfe0*QpI^bLhG4vs9Fuo|n!gSyAR-SxKV2hVZnCbL@TR8+|rZON`!XtL-@F z8L&k4R4+hMetHHX7~h9DJ?9&)JY?#C@*Gje)G76ao44Y=!LrgdzEeN{?YO;mF#q66 z^=*%xgYKF3=;$D-rcOXwnoBxlg3i`;NrurFaUwj;#C4%=N$L8y1=nM4zP7p()otjU z@VGs|Mm)g`{%rCyCD=lFlhl#WhVjJ*$0QTNj~cL%NM$D&2h+lP4I5WW4+^jke|QoA53Z z9u^o$%HKEPRVF+{;e{$D{xpTW{)H?G#ZC(8EMAX7w%NqHn)HB)2W(t+K^~t;$uKGH zOjv4C#+rCN6Be2<-GnJ(8(rU=TWV6Oo3Jj0>|=Qj;j88fqfC0X*oFMrvKV28IV(kC zl;edao=zeA!Q@|I^4B);+9qynFW$w(9s7*pbL4;Ba0?E;nu&o=QR5+gM$Gx;Z&oS7z`Y2wKy zbWDmvCFH|RoSC>|u32RA6q$H^6Q+wdkh6h_`zXXYsIR!v_>_v-Loa}>L)^%io?s-` zw<10j@#SC@u*a>ux6)^O&I070%{%H6wCqwn3UZX5pr;y1eXRtx7NrG2Pjlm|LTSNc zBuml1!aoP&bZvXRifaXrm7qsjDvoW`qar5YoG0~;(DgP(OhDRhmzP5671yaazZ5;Q zRKEq@1s}T57<3wZ1*ohQoJIUB&N+*7&f=W2ILC4v@-+Ag<^L7@rDuBthyXDl$vl^N zHcxe3;_-tVP#@%hrl2)w7c8%*iyr0a;;9b&AP3Y3d7vq14UpH<1M~rdz%VcdOajxv z+~Bn;q-P=07lYfu3a}d7A9j2_K5qhB!7i|;;uxOY=+Ltl>92u<;4nA}PJ+)ZHlJJm zy(s5v;2<~*j)IfmbHg{DAN5Ah@1Pv#{_a)YDEjP;^QO>eUE-|?X^y#h%1wTohPXE~ zlpab$e!3n}O6SrwytON?WU_r-W;qC7Lb^T8s}0dxgDK|e4Ui~!@n6tDzkUkX-& zwO}3C05*dtL!5Uzp6wa%0@w%M0EfU4a15k`IEDBr?-$@ZupK-DUI6>R8{iN)0*-;7 zq0@7^B!U4Ch{orAkO?3S@o`q?M*ma?7ZH(;eA%EbXpG~7Aqzpv3f)Gu)f*!^A?;t} z^B%)7+>7e@UlGwwm*V_V+@}=xDaCzCai3D$rxfRx;(Tf+LCzw6*88148&LwXL0!-o zX@emPK}*DsL8gHL5v3SuN+L%6&u3jT(%YHP%(r$1{+F|EGc%jnnWuq?+u7C5w02%K zGdbI6uH4DwX=Fn)TecVbFjust@WN!V8{xa+8HC@P_%9~?XA1f33s`SlIBilsHDNQ8 zXPwDE#e{d5l;_ORXG|DpQf8T>9ZfjGq>L~}M^eb=m@B_)Qcjt$g~_wg@`O>n{a|j&ok*QP0EiZe8+^*CVi^OGtPuJo0NO$ zC@(PDOEa@>eKQZ&H}T6&dJBp(%&Ev(XwvOWZfEJtuvyyJ0{jYNTXi!zo6Gh%_nZme zrjS>cS0HR?!a61;TRv^lDO^Ol;?>O2SQGlhH%PhK~+jtnwq;COA4BWZoMlbW>?rUYA#l`#6qlQ#~8^K zd}V49;;^;U3Sf_0xw_J4d(K?spUyq1hw5_?gD(1Pj}KF0l%r6O20IN{zdwFq_0<-)K)x9px z*GC;jdBeH%^$$Y7NB_p(pYy+e-(l)ser|E{eiC(LlUyQjA-OGTZYjxlvI$ZQQc)Tmp z4HehWJ#{}l_)?%eJ=G@NoX{imxM18!I#!t};h%Azo;f`vpG-?;9pV{(e&E4+m)~=xk zo0+$iMl){L#6FYK%%lWtXi@@ZMH{|mwN^p+T;GcFvn?h+{DFwSVB*#WC^T2ImVmVr z?5fwUARC(5$IfNpD_Zi7a<0uBN81RPk4!v#O*Uf6k|+TKKq;VOltyyY zMV~vt+uD#dVa?&ghhK#5_+NWL%J1H;S?Osv^~ ziAQR6p2Aa6an*P$?A=_>JF;BfnHRIh{7T-J<@5f0Fl)_+@(HXRpTwuK9(+2V&U*8i zd?xF|XY&QDFJH)4vB7*bU(aUn4SXA0#Gm53*i!xs-_KU?*Z4{HAV0;+*lzwAKg0I$ zulcX+Mg9l>lfB6=@C)pq;KIw^5s{)6J0g6-$G#RBq5=B`<@1U{5nxQT6+f^l;wSMF zdrtf!&apk>FYy=KE6U|U_KKdT=W*JJia;$>k8Xh0Qyaeff3UjjKK3kI#hzpDu&3BR z*)jGSJI=mhhuJqgj(v)AwAq7VX7@>&eJ5@9ovNB0rx@s4>BahHy+%K3;@87#vK+fm z93B_ii&7>Z(>pahVftzPJoc(y(tEKh2DO4Hel{wPiLiaDJku6w*9bdHXdh`T8)a?D zdZKlWLkn8Oma?^>-K)|zw0pJ4>|U)myI1?o?$sBxd&Q$@_lno2-7DUWcCYvp+P&f{ z%+69(l%OiB#vFDTYsGr8A#6OG#cp8Bpc%S<49XwFs$<6^53RHl`e!Mdz-GfjUe4}y zbI@K_4VKID+2yP=>&=F;iEIwLiQNg!+H24rSWW1=3Ci3Bt$Y|-_*}M_tzh@NIcRUJ z7OTSwSQ}Q%`m*6{GMmS4W_Pg%+#IxLmX6vgWNlej^r#W&S@YQvwvw%LbI@Lz54Bsw zu3%TP{%j<>hF!~UVRvI+(w2kv*!-+MYl{BX4dcuxHkB=4x1#nRa&yq$TLxN3GuEDU zX9L-2HjQ1!Ze#bbhus{sCzpxV(;PdSJGE?EerLj8O;}E$@|ZBjgefLWH(`zm8=A1tgsq2D{thPW zX2L!u9Bjf-CY)r#nI>Fd!o?IP%{&HOc-s#1QVv2Fx`aNCai11#v>+8o~R2=*wTb; zP1wnV-Aq_w!T}~MHQ^`|PB7tA6V4trb?9)tz=TUoxWa_@ns9>&x0-Ob3HO=spb0-T z;VBb-gPrjS`d1VFMWIKSFv5f}CQLG6brbqcm}A2FlV(hu>d7-uG zrwRL+aIgtSOq(%fns=NDr2i( zFyTHEzG1>cCOl%oVP!1mc z6Be4VCB|$4Xl(!AlhrZi()Is$B*z#=Pw=0IY34frc}UhGH#Xyc5=zWO@$~iu-dy;< zjB(5gRQ?DP+L=Gf#62cdCiI%n*zIo1ktPLimEhd}JS3}@Y})@U6qsl6t_n){zawdN zKqdUoL$aRC+d2PXi1%@Dh5tOPX0G#}h3T-vI>37A16yzu?5LTrU>3s~TMavCBiqWJ zVK2dgJ;aW()3A?!W`A+Tqj?ff=k+=KjZ^}8+`hM?;a@W)`p%W`KAO*8x$>+le|6>0 zR`Li&tyXXkukNN~8;g~5S~KAeys0aDy3)N9zt#N=kD|$kw`0te9^yOP*dBh+z19&o z&nZ`)v{JOS$Hk5A=T-Jhv07|0F@-heK5;~RW%KFTHlJR~xMwbMaL;sv0-=H>IvTeA zS$v}RcY>d|r>Ds=7`^re*t$1C!#6{VRe21L<#GB+T%$2^Q129;J|3(fJ$=kwYPxCN zJe`o%%}wKY6^QQJ9DODVeFrNB_BP^ghQ)*@o5jfIP1$vyI%{1aZatJPrSIf6Wo$xZTcxmi9TpOjnVR=G`Xm%qzDRDU%<4a7R-@CEpd z^EkV;tX%x3~nt zJbAmkLoSueZ=BL6Q_}CtS(b|DqjszrD`ZVVZ-rm z&qy^&jfOvWEZ$5SuO_I8@a9g&8%o!xscM><4$svr?940>J^TM=ZMtJ=U(r``Wv)bK-&l|$d zg68R}*biSH$|dwVv(vvYluzgt>~)?R^4Fy7pA6?SI|6sBHyXRzEaTeR-3-1MwHp?{}ilE=Bw$i~zgPdzT^pGRA_Z(T|rSz89my zGw9KGBK``-hiB2ZS0KI*BgJm?^1Bd!6=TM8=)Cn6E#MpE*MP)sBws2rF!9g!GUTDTIiGdA?(f| zUudLjgWm8S^?J-p6cef|n}s%+MEw7-9bRH&#na=xA)|v*%-UbD?-8$pHqjp5j=}IB ztU?QTkA2P~(aR|>b}BJXlh!!=GI+yQo=~ySsgjH2Z7^QHli#x_)k$??(b#$E0Ur+h zRF#f3Q_XOUa#S@rV$2oEpT%uH^Le%T{FK~-F@%mhCbyf>1b2dO1^0!&=3UAOj|oDR ziZBo7-ym<4H_65FX1PS(B5#$q$)oauN>x7PR~dMRF-tirN9E$Zy*haJu|O56W~!BH ztuDt~lAo2 z%k#2a;Z<_wRS_yuMXAf-X^~-v%K48lJ7(#(k z-;U?eqPysUhwUXw@c#LDaWhlmQSl_p5L?C5@Ic`y#pTGSLisSOntama^P3!9kV7Cx zZ(M0S-q-S)&qboI`#Hnhm)>9}UmjWa3Haft@AgRRf?AiT_raL^O7Y`Cn;3;_EW}R) z^u7eX!BzN)LYvu+cJdZ}qEQd;p`Jg-Pb^x{7g)c1kDquR$s<_;jjSw@#!Z%F%9U)& zRTJaL?QA|qls)WP=<_JM89M!h-6B7gpR!w_-EY}#^1R|~8MGS3R-y*8*lN^X9d;kp z9D4|LSH#v+?XgEtdja++YOn*_i2Cc!9!JgfWLv5B*f!K(U-p#RtM;-TsK-%kC+czx z+hywWY1Gw?>{-;-eQY+3u)f3yV51_7S228kQ>q70Lbu~l#>7;s?J|fUB zFxS#|3ygldK&#y7PC!%dGHEoTj7F%=d*gjmAnw`zRD@xk6g|%Jv!Ug$g`ER(;qdc;dk*5;b6R~f@m>=~E zS2}T;rM|tS{fB#R)59M)r6n(Cn9wtwi zUh+@XLmp8~evCT4R8M_hoe$Hv|bk2d__B!;(cjdQwf-KYjfW}wC!}B0sRd*m*9v!SWmQ< zo)~RfV-)I$v8Jyo5l2OmY*w;-M!f-vK)OQ zT2)msDi-}mo93J0o8_D1o9DaMce8Jq?;hU+zDIpqd^>#meDC<)^L^|);Vbif@B7(T?vLH{!D+4zp=l$zn#B}e~N#O|2qFI{-yrS{w@C9{^v6iGg2}#Ga6=;WDL$2 zlCdV^^NcSuzRDDtv6%^($(hwN(=+R2*30aaIW%)*mdJ|B%E+pnRWIwHBb^D(LT8Dy z(s{sn*m>O9;%s+zJA0gc&H?95=N;!g=L6?s=Y;dAbK3dL`P%v3`N{b$$Dh+OCy>)N zr!;4H&ZwO6xewO!o|J!z@(bAAV9>Z9_0^oMgU0_7Y0&ty(D;66{6op4M@B*8i84nP z7>!SX#^=cenEP(WO65-ZFf6mpu&}nl8ape0MoUOiDbRQgw5P@xJqw}n7U*lYrY}tY z(Z_rdzBpf+&+n`4YwT<43-~(udW1Ay>Ko&m;+yK5?wjeG?VIbH?_20w;#=-p?OW&D z=-cYs<=gK&{H*gcG~PU<@sT;>pmBYY{mDt=7k5_(~)I;%lee{E-OK-N7(~qJIeNy{j=K(ByU~6+9d{b{EPK1`S95IJXC=rQ89U(t>O}VwogurP=y2kS6RnP)qa(+Ug5$?e9zS{_<3z0!F~@hGh&ulK ziTo4QPo$nmIsV7--;V!!{HJ4|G3LDPiPJusWB4R+tANK7D}#3t9tk2(!s166FlU^V zKhpK(SreX{DeON5AGV=kFa@6ngvCdxLwKK==D7dyKfGW4qX+&?Pr9cz!n&S- zryX6)14|8IPfs6`75_Y4ky=8ZJv4Jy`se9V@ezI;oE`k^=?aew{)J>WPl-1PjjXZF z;SE?xp|>S{3Qwsxc5%$>52gIO`S|}cbFZp~nGZ83?Dab4UHCP61W&{a*g7n z`y;SGk7CCEk>-4^*a^(TQP>0buv=jrFN0;h3f|c@@NBPzPx>D0XWxf?k^8X=`zZV= z4`N665$vFE#QyO^*oEGVz3RuY8h;Yj{u9{i-3EJXE7s=EV{iF6_`7yu2YC-`g0}%0 zvE7&(Uc%1%UiJ$7uCKBHJAhs8{n({`4g1iq!C=tr#kXiQ(eBC>Q6%K)i7= zNc<|U7QczX;&(Ab{2@k2sppB2Qi)MwwA9ig#)z?E9M9xgycpi-D|lPpo_F9Kd4RX! zop?Q7n-}nwypR|1X1pnH&Rg)-c;BQIZ-@6yy6_kIOMEYXnZLsK@dJ2gWIunKzsuj_ zkMqs^Fn^T4#oy!y`8)g&f1SU<|H*goZTtoPD(}kQ$D1lgcsKq5@6JEuJ@`lbDt?sr z*hY@-OlB%UAe5^JRP(|Avp?-|~_CJ3fkk&qwpKd<_4AkL5p#Jdw}G z@t^p3{xhGzf5E#lzwycZci4W{@N;}B|C3MSf8pJk^Lz#`$J;X(_$(~Q|KPI)-l`Tt zG!X@Su8@45P<+17{957R3xteg@ym+ao*6ZsHNKK|Czh>u2?I`gz$`_LIZq7_mz{Ep~{VVvBx3zo=i9 zGvstRQ%;lDi6_L9;wAC2*b8sK)A9mY^ztub(^sK&sXPqdRTtHQeCRwGo~+KQIp)PL z;k$6uJT*hjQghU`Y5~3{I#bQY`@ns%0xiUfp{r_XRu*kl8$BK0nVO*v;k%aq)EVl4 zj@6MmRlTmOYOhXFujyjlUi;M>y0gAQr>ledD%}q6lXk-!rCoHkdPn!rZFPjcQpezX zm09X7ouiwX?{T)&b#$_NTj$~(&W^f`Zl&w$TIx+*Ter~N@!n_^yboGmU#=b9RLAQM zy0xySGj(HpH}Nu^sLIp_>TC6lI-%ajTf85tuhf_7xcV6H>VAZ8p?-qzp}wo$!#7gT z;QOebs?YGg>`8q0^jmdWH^SSi4Rk)f0a~E*bTwU5*U(9LpS4I=*FLpO-J@2iyYX$@ zyVMGGC*E>iuO7iSahI!o>Q(iM+OKxP2e1)uDnE+%mY-Bx)J^IJbtC2p{HuT1&Xw{x zNZOwxU}0e9u+X|U!y-R~%(P(7ieWrAz>C2!o*NY9bu5Zz_Z*8J2AOM-Cm>;0V7!O5 z16kK1{|QNNg8}%^XkBg~8wvA*K|x?mY`}g6!<=A%_k>}lV_2^-xd^hkMZOQ&!Xi&X z(%S$)kv&6ic>;Lm7-kcLqO{8`@)%^mf|WVLEMuWUv;|jyI6&7TQbBtcvRONTj)3&h z$%UQ|mZX86gRCQh%24b=<%LCMpz_eVm2^q>>+VA5kd6ql#;yWnS&{ukZ=DiX1G379 z;h?w67)Uw?b~3yO_MHBZa{yVA#C2exg{)G{nFg|1&2@2Y_^LwhSLz9f53$HH$WjYD z5)5;!WeFs;11if(Fv5lMjC6SbaugU19s^WXVhb4SvK?}q%L|a>U0#NyauEB#L@)`w z0Vcap`KP#08@>ii1t$UNg7^$fccEvW;qn9IOh9X(zrbt&opAv<*MhxR28+rdzk-}^ z(WIMeE%Ix~1s3CVS%)})r-RYEafJK`@*#`zK|X9zwISDAlppdD3;cr&Hk(10LOyDN z*N>TRC~buMYYpP0Q=m!rn=II&Vz9sr$_u&K0pr(AA>EOWUN^0dqCke|6Mhy2`S1>_l*)sSDfY=HdIWgR5-H@ZLdm2X_A z?R@L91M)lYJ)m}X*5zJE>e~eA_(vDg(@!p>-=AGbufMpEUVe2U9sg#*3W;I$U?E-p z;X--OxzK(71b+d#_IV3dRB*4jkX|oXu*xDAf`R;TWj)C4*!kWi`)g9yL0|eH2j90Z_ z#m9Jz1#3TsJ#GWNf6U`7SPwGn(i`ZlV@~A&WK+<1WX7aNA(JdvH{zGKSZI9YR1QG4 z2~V}qSjf>&2(m{w-5b#Ohc{ykSaUL7!$RXLuW2EBgws6$jenf-0kT=>cP|h$MsmM} zY!*)U1~e{m^mBr28cxpuXzb)v4nXz`cPunU@*E4 z0j!A`uVtx319)QMI-q3=zGvkdcG)D5q7ObZkr*i;}(LB#W_7u;z&{)eU zA0T^*7g*R!kW>ypwiKs(pu9A8@@5vYr#PJhXuRYtEGz&?=KvZnc`FOqT(rwW(3r~U zGa#Fb(>Z{~Q%;`&*M=7P7hcl@=N|c{dB$ZM?gM#$(>YLbe*Ga{!IIyr+fiGTzHVV=FJQ zkR8V97@)C}_py*IhVOb9Xzb+uEM%|o{uUZvIh_yS=U|+U0UA>|oe#(^<5yc~9K}wX zft5lIvCvq{=`$evj?+1S#$!IrLiQRTZlST2kFbzU$6aXL<&+PQ-N#2;Xl&+VEM$lA zu@)K^`8W&NZhX9j##BDRLN*|uXrXc1_*N(3`qv;%=KvaO`4kJ;f}D;48mBqk50E{` zr&(y6=F=@?>+u;D8iP4~24vImSuPrKwuS6FKF7iqLe6!Ggq&x=cSRVd^NA{e&H?Ot z$OSG@kSi=I8}cs;y=}|STi|bEyxc;zKE9P>pt)M4S;*EF)hskOis}}!twjwB&4B{_ zmmvE{JZsUozSwQicS7#5=>3o`dNtw)EP55>>lTf&iw`aOZpe=;dM)Hpi+%u-$_n)T zkjE@~9pon#eJ|`b6pPTeKyr(Qo}{p7=u;vCp_f4_i@pugW6{?^dM$bhWQ0ZE3<+Hm z`gTav2cd6;jJD{7kkC7!7egjm^bL?n7JUiLjpn}iquiS|i|A0X$tP5$^-J89a&jH;`K_;xyz|i}(_98=yA#Cgd9y z@fjq22I33Iw=8)3l*zX(;tb?Li})Jy9g8T1JOuuUbN_^V7aT@>DCGO#2;%5}@&k)F z2Z?r0h=Gu3=Y;qL678H2gCNny3Gpi=+BqSvhD19j#BY$tEn+a_35)n0@}xx!f&A1W z{(w9Se!{sIAb+-q5s-9mg8BsA59oQ2bPpg#Leg~!1?XCM4lxSyPw*GefSwcA7GqGy z=zp~SBl{+}`$Y4h!aWGGlN2%$G!HABPtg2K`&P6*qd8bbf+)lTkX0-+_o`?M*)^)F zg=`=dV=;G&u7h}UNID-w8?Af}Z$`kR2?1FJwmxe;JbWh5PVVAiDt613v)S)x!5fUTNWP zLv{n*kq2#=d}`_{#2<(3Y2j$!s+Wa73Rz;|Z$b99@HZj*fPOd^{YLc%0}y{5a-fBy z&!|Bbz60`V3%*^-6xuYwUw}kACitt6r53WM6#5v!--jG#A=^p~x9}s7BP?WRsgV|r zzNki7$mUX`E&M~sF&47F)L0Au2y&c->@YRn!jD2uu#jD*CR+H%kdrKAqp8Ujjy{a{ zD-C3?scS48{aH=5klm)HS@?0t=@zo%)C>zh0Xfq`Hl3Pf;U^(yTgbjsb1eK*$XhM6 zHc+=&_;$$KE&M^qJ1m0Q?@|kY2y&T4)Pr1Zp|y>=)514GuCS0TsqV7yQ;;hyWK*iU zExZhJm4)m}b&rLghFonSTT`vE@XsLETFCZP|FH1SA@8-29jflL@H3G2TgWC=4_NpY zkn1d*+7Uf7;9o-0a{{tc)x#G4736yG2*$L=kQ*#y!zya`fPVu?&kx9kRgYQtw~(7G zWY4O{E&Myk%@(q2)e{!}J>-)XvUAlI3qK3F)j~F}qP_w650F%Ufb3uOl!gBYNquQ2 z%A5ze%R+XsdfLK&f_%n8HnMuw!heR`Z6SMEJ!j#+K<=@Sy{w+M@ZTV*e*&_b)r%JX zJLF5?Wu#Am+-u?IAZZK&WJ9Zc7XByXs}{1U)qV@vu}&O!h3r}Nx`k|Q^@fFP zTlJ=eY;N_Ih3s7QwuNkPb7QrFkwUC{z-m?gttPX?sq30%$ zM=WH&s}C$fLVjo=TV8!+5eo9Cg=~8Du|;UeV-~XS)h8C=fjn*@dtaTf2ruMG3%?HX zQ;UdzJZ0evAelsMsX&~YtsT~8p1d`e-5b==IMghMClG-H@ z36Q^9_^puCE`dmdq_zn7ZID#QKqNs@TLk=eNNRsTBtuf01N;t1YG**CKvLTRd?_Tg zCm>Q`C!q}yd>JI#3PEcrjrKwC<&bCx1g)zy>Ym_tLgGY%)>s;KOwbxmqh1MGZ)wye z!S8}Z{Sl%jBABaYfbuHva)b%W)0c3p(`585R27=NWTFB3+>3krN zmcG!!W95me44kc~kR(l3W>3LpjQ)E5Blk=`A$6SxxT zk3#kUeUaWD(nV}Ve4s^agS^@zwnGlFh^HV+!DyU27IF-jjB7pvIR#vUbUcG^Dwu{i z>dZGCKu?m&I1@lOvLhsP>YIajZ^*e|9^ykG=Ywkz$F+R)%r_&R3Q5no4ELh*mV<6w073QhjYXhdecyub&{s*v-&-{4@<$8#P<%gG$fx4_ z*&=5`{%Rq=i|;oJ`AU4hgFkSuCm_#(zYwQ-Id9QaKjjwvG-G}*h`@Z43R%TMYgB)N zh1T2tM2p0E{v->n#r??^TA%yrd?2A4e;U9wXszt832Gr84ViACb++FRGVtsZAu}!V zFeLgLAwPg@Y@xNHzZqzb>qJ7fv&hwusBc1^f}CQJXj6XZ%RdL{Z$i$s(3;Xe&qC`| z|9lIrcm3Cb1;~FE5_%*!J>Nob3(}v5ywyVMRsU@kTKD>Ix6u08e+O8K{HTBbW(%$J z{itt3(X*nR5h@pQw}saKe!2%BA3z3lPUvxvDHc5*66X_oG-N}I9t(+Q%P7Hp{{h(> z3`YC`$RQTF26DMYK?fOkT4>FevBE;@yo|dnw6@Dw3GPODpqq?U76qMU++(3NVg~Af zpmkve-2*7-I|KcKP>UeXfG-h;PBXr;=xZ3u6c+LgWX4)(t)Gc8i%@+b(GCgnF=V1X z2-Os_nne{tR=1FEAQNqjP?tm2v5+q#vz|o-An95_HGwR(kgpUxe-qiTWZm>cy#H zA=}HrSV7SG$*E=0S3%M-pwaIgpM`8whwcG%H%NMZK(?lnY0+IE(f0_l$s8A2lQ~c> zp?g50eh7`ab5K77*~AX&h|p-C4%!kyHm+0GqB}vN-Uzb)ocb187dj0rWb-)Y&{dn)0Gw5xP5Mz@kagJpio}9MU7uT_LHC z0okoiJBy}kP+I|HA3Gf^n#xP%2DDCaNWVbSacVa}Q(359fhOG-TgVo7=zc(xUa8Ii ztuY*GA3&3isoa3p8xGYyp!KUm?F`V`+UW^;A^tUFiG|k0PH&5PAF_{y*62=O3$4YS zeimB4I{huQu5|`j)N#mx7Fw4(gDkXOcdoY3I^G!!hM)|`AWJRk6y#7a4C(Je4!4kR zz!?EXBK-{HC=0FEozY+n(m#V7Yf&d5$609I?2Nb2TH2Xlp>@1-jfK_{&QuGnGn{D_ zT6;LtEt=Zt42!1rIMbr3ozAl8JjmG=T@7-Mh1O%vTnnw!oOu?V1UcWLn?PP`(bUEl zSafyB>nyZpa~4|2r|4V{mf+cMhP=h1?t#43LOw$0HVgR zSk4xU+7G$iLOud#w?#9^Jr;EVlFkR@BXH=P1Gwf(kgr?RPRKVbLw2*JnIcOn& zp7V}{{EyBd@E)#1<$d2m{zB&n_yFltUTUvs%jExasJ)&*oXT|)e2O@g_Y^pdvPnp4 zi-7zW&KdAE^85lxdI99)bj||khI}Z_&)_%2w=tIEx9DDw%|T0Crvx%!(S0G?S~U7% zPN_xrha7Iv10Y8N^bkjip|{_iQfpsyA*G&*P~w`#lw}x`&&v5W1KfD7I@_5tZR+p ztqtfXL)NJkS%OCcPy!C%qh!-?SW49!LdgNRmXh82_YWjQMBv@UsE8=s)Egfk?~O>U zSLDq~%ume9&6V=i?9GP{9NwB;qqun0DzWo?@v50Tzx-|c4MBW&1#si4S8!p3e27Z6Q5T;bKVyHqkmqAtHPtSSO)Qd9)^8|9uVSL1|6_9L7 zSU%1fnmxTsgDZE3W@D>Wt5&004d^r_D?1{hdOhVyPD;toD+;!%qTDR2=qiFA&hyns zOOLLV-nRGUEq!kqt#@BnT%1yvnO4nvbwr!yMV+cGG&O+VZ-g2M)9LY$E;d)v(cPi+ zCtMw&592#PJ6SACU{CCf=lIHstD4$qA^6gm8XCnTBDq&bc!x3}cz@H_$bs44Q>n$} z;3@GX7cuk_=Y{7E)cdb8qHFdJUR<*)p|q4ZbcDEsxCE3j7OJCvRU&GbCYj;QO3hCu zGN@@jQS-hnd`0}OjQeiMURnNIwfOwPHEYDq$y+BqJ9*6%-nx9R(UEy((@tZko#=-e zLZH-5@u3BD5yMiMpIx`J3c5#78}z$Qdq4oAfth!ZP1T@ClihKDkTWeNEI zeiTpJ*S(Bp)IuUNvNP&tWO&dvvOQT@@$N8_l9DWPva*u%^9l=6f)UZ;zJ;G3o3)}- zQQLv96n!Y}RJbAhEO8;1*qDs$AKXU*$ZQTmReoyK|aQ3(v&gl({F%n@c>OI&cQb-pA6}mth`U6j5AfC9b2zG`f9KdxX8ywv&7VDI&J2J0kijL7OuuG*AF46tWEQYUX;j3>@8vfJ3AO~XL zfKs&f3}hZpTMsFPhT?3Sl~4IMd1+wI4CM_rDEIndR}IwuTPBU)fuTK6ItoMDrIyF3 z$@C9IC1q#lCT3@Q(J2(oN>FHS5r!3-u!>yW=3T6HZ!+K3q~{fxtx~cx(+lc1t}^pB z=(G<;t-d#qzC-o1A(Xz6>W2w> zpH#Fqb6Om`+G;R4tXoNWQMbZx2sa}Ox>d!YKw3pA8f;(pm?WL-LND^Gh_rhC4BLfr z&}Yz>3JXN*@@>y;x$lL?dUVOkD()_J-nH-gA?3|RFQjrsA}B_=s-U&5wB^dsXc?S) z1;?-3Km&+Cw`f+3;m~_g8GSf{H(oG6RGd*MTfn(=4#vEFgBiVM3`mPchl#EhotBEq zOpHfyqT=JTqD8jW739a~Cy+g2hJs{_3;d23@L)}wZW-1+w{7FB*|W3g(O};+ z8o@Kq?;Ul0|6$JKBc8GKV)QSmf22}<==Ct@sJ?>FFIXB9ID_3KGL1fFTW!>$WPG)8 zD7t{^Z>CDr8+`rY(`60J{`k{*dT1zfSeAhQ??0SDR$1Fa+`9Rai9k7iE$tnB9u;chfRMtDLkE?-=?px zluqr~rf;Z}PWFgRf3(u|seRk@jg`{LPO<5aRZ1s2#il<_>7-}aDWvC`?BShJ=-R~MH^PH?7wwD^e;t>qD`PT2S*;w1gOw%)M4E>E-7A9IDnujK!6q;M{K3aJ5qN9OYq@!sSN1@2x zq+S>-c=ft}|EK98;&enc)2QN2nR)z=KR&__#Fc-?Z<$&CEwv})PQ@JA6mw)vwla`_ zX#v0HUGZctWOc5Ea?K<9qXQDZeGpnRgE7OzAcP+1;Tm5F4NjLesRW8)+cB6sJWn9w z?}xP(eS;Sgnx;=OQfjgq@d??E<3;gP>}+X9^w30FRFIXM5%0;`{*RKo26h}!q(P^W*b>a(t0JSq8sspT6xppTemg%>)L<={3#Kb#H` zN~gYH(>Dau%U>|MvFTFZDBytz<)^-2^KYz%>p+(@)?}M8WMpupxAwzOh1N!NpFmBM{>4Q{)T+nn5zJ3PenEb+!HY3o^eI|@|N0^me0=}?{O9s$ zUZ?y6{_~)b_&2DlsRyHPN%dCG)Tdcfp&sbLtD1TkZJ#(5t6YZVx7PL%MgL0OEE%sW zpx;0n^jM*Tfg0iI7%qAT4|DPNnt)l3sVb`=LsVV1ti1KIWqhw_Ro-&W9KLTh$`o;- zv!K6in#3mVNJPgwm-W+4P5zT#-)oVbe{0g!0pzV$&b3 zbRFtPHhp8IbedCay1Vvu%R_UDO}A@b)Hmi7s_&ZY&YjU=t2#egzZ7yvWQ6c|y#1Ni zOMMWXu0K2rVLdUOc_|C?da&vUmJM{u$kvjrw|8otO>7LrDsrooFZ>{4@%-^@Y#_>u(qXa6 zg*$eWwHcgS+|j#j$a9j2K?bWK5gOR(5UkBmDwI{p0^b#%=wy<$=>$!0*xuB_(C%aJ zx-l@caqH~XwTs#x=Cl8pyVRdCGA*fN2i|_RX&+S1TBg4?Gwo>uIxyN5Yk{B?<(HTl zuih2u!6Gea7Q`UV&}kLc>J>w$NyQ)(ObsN_DVPH(w@o+GAWbI`Uc8HhUy>ECBa-XU zP??x76SHKC^?Nt(`{4N($*F_!^7ZmXd@AX<1;%_TOD2_yNxdAy0j_E6F8X_inq6gk zE*9!27_I#VR2oc>&e_!P^gyzkL_>&sfD3q^c482eFm)62$)>n^J+B{E9zcQKUW99- zEDrS2!1O;_WJvwc1$dm1PBvfz@g~ZMbT0IReH4q>#`#vYHNPGm$1_k_&2jS#V?*b` zAaT!=dM(>fzKuoV%xB8C;Z!On*~Kl9rz#s4s2W`*D$=9zE8QwQCGmIw8btAOAY7PX zCK(P0KDE+;0DcXpO~XYoc-nIWBgb16oLrSvO^#O)DfJw0Mu9iC2wkNp)tf9@#+SEg zSTKD3{KD;v7JXK;Z!6yK$F996zfR>t7ZV*(z9cr`>4Ye+#4qX#HFQj-uiL&Buk`7X33OfuOtUyV!r6O z9J8P5HotcjuJ6cw?8?rM@j59vc|)3%cjY^#4Js%^c{zC|nnJhjj4-=?LQ#*^g~tE7M=jxp*xPi`ZSThmWpU%iu9WYk7Bc z4W<5VEf2R*2GuD1VeqkA&pQ^rK?hQSXtQkb%}a@m`OTZ>=QnSWxBZouAAbxioIZUa zfx0y1G~-4WDtBn!w&^r)+w|bPZPRJqw&}rn+osdJZPSDE_Qlr^&d)aeNGSiNT&qu; zPV=_Cj-9t9%6XS)BePgCtA(-djzG=i1PqaxHL7D`jq+k9mR(>f@lKeWS%tlXEaa1H zV?5W!Gf|;&baQJx!!r?99n{S$(n;&V!^VXYh)+*XNlACovr}rN)U1>3!H~qPb14_Y zlJP3#=cQt7qQzipVonx0Bywd+zL2e#Ev{Ch=H$%gh@{o1H97NWVe0&(=+*@(^P&^P zms4r@VR&TB!n?<1= z_C`BQh1R|=-Wp>acvvS2IkZY7jTHk)eVCpiu-jpmY0b?tjU0ISWaF5uJTlTdFbe)1 zG+r85aC6LPID;%@blHfAFy9~f^BN&@75pM!Z{%>~<<<(a7rXRnfxQ3Xj0o+C=o?z0 z+nYsrjGHel4NK!RCoLQAY^Ji5%=iTQiH6fJAte=#@D%cdd%Un}J*KC`<;MuKyI>tf z=jztvNpZU}JacAya^EUHQ!_Vh%IFVjWyECFt(O&(nJx}QMow-!Y0~5_lOrRZeTq+* zk~d-SEz_snS~{UIw9^`$2Jp%N-q>e%MN;+DFyATP0*`YS9F`jhvhR9gGmeD35sts)QD(-~QC_|Qt7dEoRW&s|EgadnXgFL2j&UDqF7zIx-e&Du0= z#RtziBX(YM&BU_i*mAUX6O}U>J!pZoO0WjUq8!c2y`YW>;iAzj@Q%mp1nso0mVf@1m*sV`*x{Ght5{zh{nYs1!D1C;Fof&i2({KXPo2 zTL-JDnxH9Sw=z?qe7p7HW(*z3ugkd;m=4*Vgs0}~qSu|Nr>;vSV3DB1P0%mO8wMh3GrKx0B~aBBejG46bt zl1e*GP1{}9ck`%T-6u4;yr9$EQSE1SUNhv%tgGrZE~?hN`MA-yjwl*2s6&I=IrUPU z5#3u4YCNESty)B*)Wdy4ddeHrq%6|o6{YIV?6 z>!t~*Q?Y;)vMMa7XlO>e7A@`8)9TFbgkW0+KGA^~JlbF^4;bgNROsm8nZk7uh|I3% zBxcvP8*JWWJZ{if3htNuH}tb$N`Cm(N!0Cq{-v_6nHiPg3EM;&8r|o=p*ylWtd2HB z*|rpownRFz=@m97cI%Ao?`6I0Xcr%J$k1>cZb0L25a1A$H`GnWI|8Qnpfkd=1`~oj zSjM5Yi(FAOB$&+x%q{%d^{Xnw575l)EnEg08p2=SZZyA={ zUViP28SAG{r}B!T2M3k!=gkK_xL^U=r75%7_n@g7`yO~H#5@byAFZEiu!jRNcm#2U>Ljv}JWrfg{A9=5{6Rb3rjs3S(}VuEy70e|4zpOFT}jb2G`j;BW;20C!lvMUXkw+9*I_x) z21ZSaO8C>I`SlHG@uoWHZyfU;{R35TLKe%)PRpv}ff8wzXKZgMF!=rmndRY16%G6J zY+66`8cC~RBVF}k37+3?L263A-+h&&OTE}dBPwY-q-%PY#6Fw*E{R(QWP{uEpwEpe zq(7e7!`kn}rfJAw6-^U1noqd9iqfo4hz!O+ROsW_3Lg;9hif4}k#F1h+8YO+yxzK{ z&c8{DyKo-&qW4y!*|4W!*h6JO1t-{z1ghI_T*zC9xiks7?7zpD13F)@*4(<}!Y^JPrl>fPYk;E9#(Vc;CsC&9u?!q>|uT z(@m$gXw%)c=%!O!wCQeJ{M&U*TZGnNPGhY@`_w}Mkx^d!Rh0@|$6#C`Ws_T^!W6fu z96lb`1W%@H&`xiY-5jvvE4`~xg;hyNNT7E$5>tzeXAsUExo^z)C!TqI+uYet?%OGL z9zR~bxBM0!QBJ=Gw>?fmo&1h+k)JSvb$mKPqfSB|9n`jYVy~%NEum|3PowL(NT|@YO($L3^q{V7 zI_cV`2X%e%b%MIaavi__m-Z*81)|8E15c9-`jPRHo!uH~R&1SQC_=@CY!Ze&nl&)j zp;?h>XxwYn!;&%Ty6!c^%-c?+|40^zr5)*?oPa!|AS0QJy!dht?_B;dKT-a|4L8i= z&s{gaoR+}or>2ZX2iGA1I*15QCwt4Lucsj-l%Mt(Z2Cqwzj-%EzJ+vh+6%pfrUm4; zelSXJXVV+obnC;Qbh{Scl4H}Yok!``hS}ogx8^Qk&C*EDeN`RY}u*}Oi?TTr;HDm8+`FeQB3YaCv$#H?--ro&vLHr(q~9w&)BMC z6O;EGYUZoaw}&qix;DCyS3pNgNH==rA6BO}JtLHUcct`3q4d?2(rbm%*HlWcxc)!F z(*@qCa_@T|rBmIM|7_}}A>NML6i9RM&S^GY6m81Ao`y*Yc$qR1CS}k#&xUF}UWwO~ z%-lxrOyNadt=ko2pGj1Hkt~y55`lq4wtA&=!gAt0sEaevUu*IT+yJ9R<(Dg~WKm_+ z$;yeqOA7k3i{4QvEc%y~mz0v4Yb!6Wut<2rHlI4QO^g3qMaCsQM-^G4C?>XIN2+<} z>TxwLs?=IFy{l2Fz8chrZ2b)l>Gy$fz00&v`Z}X`dEp%TL_hS2It+h3p36XTjvw!T z`Jn#hG*`w}fxS-MA`UL79JsV%qA=LN7gIHoZ0~{5UTp8RD~2J97x=JP6!r~1@^#h6 z7XWz_e!I?a4AkbmkN^4{a&pzB>rpo4Auq~B=U2W>u#wT~@a) zewAV2Wi9hs)@@w3QG@z;_S&e?tn7@WSlGSfeT0__=AwCL@X}o|B^4bK8=Lu9(Rza} z;-Z`a;k`=!P_-nrPHM|5`j0D2Z+%(&9wSE8>7SOHo?W-C)1+-u;^p-npSqT(Wgcu? zH!US8GfoTVmL=8GZi|cS-mIiS?%?7+{ZmI)iRqgd?__4=3~$}FOW;slw6}DBUVSqc znL0Cl7vD&rzKfZd`cMbdWn=LhM%5bZZR?v%iszD5OT#K4nq!^NB`#L5PBjAI$v9?{ z``c4sING=0+QG}K6dy=)YFqQ_#Q#Ixo4{9jmU+X^{hTd(a`q%A+gY=(C&@_&Ax}sM zkOT-JEP(_FfkInoS<6;v!9o|iw@@f8U8LGYyVz2-`Z{i7N9%m!tDTvuGwN8aj-ysb zt&Ssy?|HE$2eZP;ECHHfk=iKYH{;%t%WepgQ$)Zwea7+XVtzr>+V?p3= zdM1GqlHeGFF+yr7r@?n%hruaKUq!BB?u5*RVi0f@SGuFXs20|`!2QUACUw3N_D90$ z5-54EFMerZ)$~-$#=fe4zx~eh&(u^mN6Q=8<=BHKSKPcfRNf@N<4nGjJn^x~!FfL< z0l}mNn5Po#`6B6nl21@%xW2*vA#e?BD)tU}y8DH|O?8aW?W`b|r@6q@o+)(Et=5de zt=66jKQ{?n0;k5JByc0Nxo9*djE&$8>}W^DKx}i@%ER;fkBoJ#ukN4Iy?BK)qX4YjTl}ugUD=bDw$!9Bjpf@ znSPNOGr|udV5Aq!zL4xq*PExO43oBSa|(*oecujat}uJu85Oh4#hLWE&}mBa`Fc2= z24}4bd&q^eRsiI~3yLQnyBNm|nGJjw6=3HtQjZhuY%Y@^o#+Mm~>&CtKnezowACv zYXdivU3X>_4mNL`Zr!LXYC70dTiFtIMhoS4E)~xSRiC+K^yWn^%$j^{`KpPb?w|O` z`A&0DXDOA+fCXBu_=<6&Dxi?cgJq>984kP6g1aX$8^juBKy3euu-vPW>R1EW@@|3} zQy7SQ(o#+iI6|dV88aevpRS6Ruk2pDylunU?){^S_RjCxG^ci6NpNw;X54NY>#lEU zX^1z;`|~rm<`fMNw0D2?_7x|W%-y|Y(XO7N;!SOx4axWXwf%hy`<5)H^TRN{i}Ihb zAI^OTb835ng{3w`{blxIn>b{$V623 zqsfMx1_DGuT~YN*1bhUi6~+{8jo1|^VOmjqC|%FN8}R`P;mVL`lwon;c&1STl*uvx zK9_gSLX2jFgv5I@2u}|{eI(>|y0B{sGF7}-%D#acEZ*k##x45XC*+ZlJ2Q&Z?X$S) z@Zs|#zY5pZHrH0QMCIj|UeLGD`iVhjXY#E&zKyVl8Zdt~;6FZ`r#qD_I!2f}Nwa`B z3KDwU6wRAI#O&TdQc=|rpT%kt!=x>cddg*T0j92@FA zyfRq$!=B!oX)p0{T1YQ`41EK?cHl3)o%C+eek!G%^ls69`U>r5Qrbx$7xZUS+N<^U zhf~^({+u(nb3I+W=TU0s>tx~U6vbKJujG*XrP$?w^{K5?n4};i5l>J;mIJmUyi&4d zqvk>HCl5MZqROe@WFRo{G^I1C)Cfs%Xx9XN3=XOMSS(f>tBux#Yl2S7W{Nn1P|vU` zNQ+BD2BZQYG>i#YiZkw&ZdC|Bjc5u+p(@7#1cgMLn>L+&9R_6YB5rOZcok`bM1)+Y z6$DC<2D`^h01ad%0aIll<}kg4dL$gTSMqQtZJ1_4Qd3;KaVSN?H4U4QB}eMw^BSu^ z;X3!|&YgR%mj4ji>cMWjE_oxn<+|a~t(f}q%OU9M+oVp|+HWb@jYtH`V1u2^0X9X< zrvv!{nGPv)C$i3Hfp$WPr@WQvEFQTAY7cAT0*s5yW~h;> z#u00a3#TwCk|GqT<*@kL6KcX7!dGE=e(RRjc*j+J!P1OOe|XK@iI)35JiV*_PIqg| zKwD*OY;?4|q@`}|_5~w5=OlkzTNkaYStZ23@GKTvww;2sFxrU^i1sto4n{BN zSHeFzAT4KBC1(IRB+^`{B3asr?3Lt9KohceQp^J|f2iIt1~Mf!jVQatnq`^JW!c%8 z>!i#~tf|$Su?|uIYwB=tqk5hWGRK|AS9(zh*C^fpCvT84?ADBFQ#Y{6 zp@j=2Y2osPBTI(*=O=JS{We~ci7FrQEqOCfz{y9 zz%7M;B!1jCJ}`XVS6WzK2(b9~7p@pi9%5^oV!?{!eeyfVgC_Hz_pw;IU&${-mQyx7 zu=1eWC0o@#mf7LDv;v1upf!ke2NIx&!=QU6M`tmfgU|uFj>mYhgH3A`N(lc#j6Q_~ zFIr76A{D^FGh+)d=3=SH=|-3! zc&;A>GUvkHR58OsZV)dn2Ms|&Bw~3y-Z_Jebn8-s%#P%G9{e=DO9{{R9Ksf!VL`^T zqQ(^ugp9}Sau($0<>E|9Sx6zqsZ#kSA>-USq@9hmwpLfSwN-DpE!ltiKGtZdj>jrn z;1-Er>f64Zb#2F@@Uf#>Vy3i7Y)RzSV70*`=JFNhxxPja!2_LuD{r*6`ZJij&%PNninG>QVA=Tw;f?S?MIGrY)6?W5bfM8_AnAdU-Non9-VXO^Iw4Wu%TYuCpMlGT zQc($$VzF{#jW0t^EQc>au%f)IxX|m)%hi{G#3JY30HV0Bm=^(e7$&_Mr~0S2ne^q6 zkI>a?T+O_M{c+o+3$A%&1-;Pegzlt${kL617 zS4=QDg41(0HJ4EBB=7(ihY+Js9D&7OaTd!2v`_i!w~ViRIOTgtmVhTTT8QWT6<#gd z&Oo@}Z!TkoVSiAr#;B4Fz&AE7#!s#$+KV}uqq##gGe&Tb+N5!yEi2j*=l<6#&%f{#`A(aYZ?W*Nxr_sjgT6l`eG&bkoIEm}wSG}P zOC}KZghSV2p+`lAfo{%2p{v~9U2>%k%VD4$0{5^c`@7CXcN^8gaA7(kp7u39x z7x)(#bL5kDD0x1T>oCOZnV4^Vp2*C^rr-u^T9}hyfW#ufbVOW0b=m2y*b2mo=wl)) zKIZg`c_KGm8)cUeV9H7PB{Xw#0nJr?Vl$?zx8oot&xILV7+BMt+@AbH)%f6NyGTuA zQUIH)8$O|O;H7d({qQEcDEdUJOSo$S05RJ-48>xzK_kLOH#t_}q(&o=*g?XhR3-{y z#f8)i0%%sGSV`mhbL98}C23nZ8v!pCBJfh>Qd!vP3cJ!3Nm7eRKc>Iq6evOpZF^kK zXuCB#za+4e{ z^dQ35K>tF=@%QC-@kb12AXlnDQXya8Jj&H6K%Air8j58wprFBGYEa`MgIUD8C~+Jkrv?6qDZ2cwYWNG11si zRL=yi1??eCAV~|b6)x8e9iPC(M*20)DLvy@(eYP9PIoPZ0<4(|vuYO8g5vmFXqZ-u)M$rqM1Qh&8nI0;|=61|J$0~wX%Df1ND;Hpy+`?Qx3UI*K zLjFsN!a_l2J-H&xp1S?ELx*nb-Z#?R(9lf3<>=XCCr_U`x$>rk`|0m?oHP7M>nz&I&Jpd18k*Wk=Me2@QrgMR5$$JF+Ku<0OKBh1=^v>#y`Ssi z;ysTNJ@!D&<^8}fJ_M_{REkJ65|W;Sgbg+`2`SEgH|MrP<Bjf9%xXC{GiIH^^q2xb`HNhP4n80^2 zC+TZNdsEEW<1}Ts0_l&?dDi1hmLUfz&ejjT=*EG{FJTTV&<;{T4kn1$rP`9AwW$0u z0^B6`wC7}ITO1DSx-7~S?1y~`CBTH?pqDmkwAt{Y=#)8d0qZ}ce~g%DCw(jfuKz24 zj0c*CQ_m;9VE$g>4$b&rrq!{Ux`uDFTj4fVUwNeuzW--Rdd1)}-42|Ng_*I2B) zT#{n(SWA6vd9*wd3SweQ0S5_raw#5fNSSp%^Hn5&Qk-4v^A+U;D&**Gw-*;K>dSX7>l~@9 zzW?@H9;&S#1MXv}$2GK0SyW!WsCO+G4(G)USa*s!e@^k_VynZ4WueY=v~R8;VB?5WLhDn4Ne~iJUPtCE*qKSU6Y4RNr({BA>;wTp%qjeAB2q%L zJ*ShUQgKyqT!Euak|_A>_oCnV9#j@l6a1hYR(c&mK|&;l&oE6M`{w%QiJm3R=kIis zFR7fS;B#Gl6>xhG+&X$}apJd5`8Qpav3>J?SmF+e%a<;%a&ezHA?-E6dz%opvawRY%&G_Rtabir(VfJse|J6I1XMz|@&8Kg)) zL~R&{%)m{d6}kEPwDxt=dmX49Cn%H;;=8TV(&)HAVJ?i=s8(iF}zM`yIT!@i<95_4zR7;~|&df``Ul|Cm-iY$U_P-D~| zpeqdO2u0Xh5L{L(j5*qH@DHlejm~xe%vpbo@VcPEDj8~G5k3s(nN=p4mP()m$=!%; z3I?dr(55vb*kHJk)zd1)n;PqCieS9iGd$1~$hqy{JWcFJNI2|9BoiYEvO$I|mk{~^ z_AI#w5MkQ1uBo`#?Jg@1*9Uiw4|KLv6qS~R!+~VPQCzW1E3)_u>IrE;1ZHriV(gxt;Lr>Ql9@Xc(b2cLj&`ap#X3 zPeWZPUVzrmzB7H**6Xi7|6IYjNL5R1t8?4>-|X1qKDpyJm7&5d;w))>FO^O!*`>&N zXM_29daMwccfcVq(IW0WI97~}M`80Etc(>TkUwyj@2-OWeZJ-r-b#W~^Q zv?w?azaS21dqO%X9TdL7gWPpT>j=I=>sTdSR7xU1l|`LEl~rLp1}d|-NS~aTgn^=D zj8-8uWrh%$pwRyO46O_r>WKvgT5fzz9=8!UE2cq*to^mvl95?L& zFA9YcXl&L(p?u~LWz}~DL>v1|3cRzo*R)9%jGK|2+niHFrae<&ZQv+f;<3A1r3R?=!-{B}; z(>%1~{L|6$@&Ma+>6i0j)vK4Xn@INXv2dC68@$-C6GeLvV;Ak3O)uI>R*81arWfsG z(~I`Ac-w66*KB%0Pd2@v*KB&;&TV?pE^K=886m!gIS<2UR1kvg;C4Z!wo(R%rYMl6 zfyLMW<<(-r;e|#z0k&=E3Ptq9YT2#QnF*9~?HTwpYN2k%tI}Ncyp|!77{l(Wa7@&y z(Ns-`s(dDZ2;v@mN)F|#A-hZgulgEwA^5V$?n}Qk;$00&;T*9l$x~vP%=0&;&(mXQ zHs+P=crj0pQ#*!Fs&*IViSif`y3nI0Jd2Ghn?}&&{j=CaEvq19F}maIj@Mp(ZtM2P zWq0x__AtH&o;Kw1x#3^B_EVYQ2oyFFE-ebZkc9|?VJ$_pOo1bMq^8^&kCZ~Km0qcT zOq7)(DW4jDr>+8!3|w1-8zwujT-!}l=e0M2miE;oXL>(yLFcpBANAXS#U=M+j4 zEP%9m-U`pS)~a~uRKqt;)S{hx#g!a%*hpoJyDQ_ca!>=J(&2mcsh3ucKK;n2UcPz@ z^Z)tTXWvV{{rc;C?Mp5PQR|Chi5rwGxNRV7N!=04f^=stl;JQX{$kW^q6%PhLO2NE}mOY?$Y-5gt|FC9JzbHYk09Q@$|>G?tJpv9gdw@ zO>J0=QT9CTRo*XJ2W%7bI*4|xgW9gGgJ{P(sO{Q1q`ya7hedd44#xfdd5#pyfU{v7 zT`-Qo|5TnMVo`81=Hw@bSjNAzXOe$Da9}5^+kbuXO^l!SkB=XyCEAA${H3?k_(i*h z!xi+vd#LRiu2$q+)M0;$yo~2ZXXa%L;0s)qPSCu;zw7x*@m<14OYOq%_k2vW3)_R* zh3)Zt+}t;`t9^LB9_`rkS$IET(gV`hm8=5P3UvZMrNu_!2DEd0Ul$LOS;rmFr{}^8 zh!2gEnrM=SltTv$sGTFlu1HCTrb45{+rTQ|GyzmA<&8i8)0@s#XXbV8E#X?$O1o zVaW*o@I#A=$$&FRlCU<&Ai<3Vvr-~fL_mI%+Dc9u6uiWV2DFVl*!o*%($aK?G+KN& z$TMWi6eMNpTcN&LGcX!d0#ILUB1SU@{Zk(@NY{mFlM{{5WV<63T!G_4lH1uSC}W!X z1Q(qNzueG1xXfEr9bVy_e`evrmJNNa?c3e1JYTtU`BL^9d!#CMomhpou_kB1rH>Z- zGIr4(wMb*w95U9S99ekv(q|P<3ET+*@WUzq`Lht(6gTjYV^A- z9H~=_rbGY7c1%qGrJ3XDyMFRikfPD%My55pZEapbSzTLx(SoY}vE5tSq7B}jV6bj& zq`bAR#aEsGcybdvFaKe9$px>^w#HT*C@o(yZ^6=>P*G0y+Wdk)mz2kgd_74U;S4a3 zOEHgGn8!TCt4gE~3olnW^dq`v2k3fo&H=2?c#M=|??iBvW~vkqK!G{HjEWDysMCp* z&}`4)6Qc_>h{{I6OvRTEKxs*!xG29c9~Losl8Y2sie`~ntZH3w`EetOfYp2&c5ZHO z-`u}-fBTlc6*bk>H7ov3jJs=VZ{N1gBU^j7c5OP=-`(AR?9#P_C47h-VqcWM4ZQ0y zB@3}g3)N2{o>qi`z$s`U>wPE0A)=1ZXe^dqUi7dUPZ0wWPl?3B@q@xm&@1xR)Tgk8 zfXIS7lZc@98zm_f(r{do6ES~OdMc#QfHzDo>yU$rhf$=T-5uYPnd2?qbCu2AP$GZ3 zz4_n&vCtd(5nC26f@|3#xh{{&gUItQ!p@0GuPHgjK99wbfy!VyU=u-7Z16-YxZM=BTkT;%r?Ysj@1*G6Hx;1U^JeS(x{pgiKV`P&nTpwoiXn6|LH z4GK2Kbj0)To+I_8HTmO9j~53m2-pzdRn=&Rd*9|q&&B8D zl(c>M(qFUPiLw`y@uykKXcY0T-(b$RVa@_l7@7NDxCr)uTm_*j)#26{B(*Yo2Acv0 zv|E--IXRATVC5VR_YmCvcDoAf@aWYqYv`$zli|prJ7-cqo&E`>VOC-yBe;kKK`#Cg z3vhw>b~*@Us3ch#0TePEDlI7{D4G}5Liw)(ryUY3Ox3}>#`M7_&i_OG2~^h1lO1u` z#%=Ppt@DZomgIasZ)vI5pOyD!^}52jQ;U+H4B>jAV&C@3YNjN=@I2-(zv?5;e=qsZ zEX;p@_3b-$-#!-k!4G}_9RRVyQP>z%gZySCi*kSk_F7C{A#Dh_tS5<)QVo1J`O1u) zMK$o@K9MoADxG)=xq}7>xt%5g2z%tKpu8TmHY=|&LB|D_Hx(7K+fj~(c8rq`5U5Yu zDRS2lPv5fag8HS4dt)`_xn6dhc7)t<{WCAG4{tA-|G>Tfbm_107Iyiz%cZdIFG_yY zs>C=f66|=6fgzDu4wVA#Ej9&*zSW9BNRo#_THL1eb1)(Cxl}T)U8a%|?#Fl$j;mFg zGQ9?C3l@hi_)&=&8c7C@0V7o;wGb*_OgVDl>8m%^_NWz5FFZ|EWl$jgOPjW;^-tx0 zrb_Y9E%m#%V9et6GIDYx)Zh}e1#cEBg^CnBWe+$LbW2?-HLuj850ENS5R;oSs7*9V zaF)k#l~PSa8UA)F_qXfS1tY-%haFX3ap3~66#$LmCIi&K;@-?K`)9Z#PTc$8!GCA3 zB!AuA)z#H4cO1EP`}O-!^5?!cniDO}=qU8&4vdBNpN!}q>7;A%Gu1(cyHJdbnz<__ zZSUogC}J{=h3`lO^+iQBM-9J-&vE!7RdTlb(NQc!P%cmY-~#)5x%JXF~j4_>6+#V*`Empgb8q3pYu=eU>{s2>H!D->|G08XR+kW5!@#Xnm;#Zki ze>$~M;`8FjS_FfVdyjgO-|-x+@|PE8d)V=ZHaW72Yl3g#_k>Ex@p;tI)Es$c@_M}`@NIwFoKWI!|K9?GzT+7LrC zD5PYtY0xqZ{E z!-36#;afLtzk6xPW)dFkFq>n@jpPa5rr@PWt$}^if;xbe(iz1Uh1wlKH5M2S7AH427G1s6V=duuLS<7SXx?$QZJ)Ayc*TbPTPDU%G>i>x=^p4;_PRH=ch7BK z-@ojtN95NV$J%?AYZwfH;whQH?_9zt*frAZC`<7O!Lu-btd_fCyl(ETC;?WPTyKtkICb+DF0|}Z+>Y-MQMKT+Doq{UwfWU zq&}~2YimpO#B!v)xcL$hFZBqcwgK%+*)|1N2F@>8^~Ui{eF`O0eX5jznoe%Yr}=Yn zYH1&npOiQ(?PE92r+!%9x^SWU>|-x}`Q_8BA^9x`(|4IO`Bfav24kH!a(PyR2FNov z{(^q=yUV}e`!io!r)0s?4remlDJtXzISB&PAXFp$RFaIv#$;1?1q}=`7C)n6GRTRI z>fpjZe%WFrT2r3qVUMRMZg?m5r4yZ8h`E)eK4YKqpKC$z z{&n5KNML@!GXb8fg{)>2kl_5|{qAUkHXfuy_TQ-MZaV)){Zr~bVdm-Vn*}lIpJEoF zxM`C0 z3=#|549@~BJU(IYgVcw@x}Y;9%59R;YW^@i=jtnWDmW!)*d5|l5)2A~k0SO4u9tA) zn02qXYS)GO);U$QD}Gyla1XO2dlL~h%KJ<_ehhuimd*^lSP4U?kY<0Bkh1O}9$_!YBc9|gT$sgey^ELLklV<}W7s2-+{VYTL1?~iRdJ$j@+(h_+2)TBpGtY8 z6mhMIx6-<54}~7CUH6B*71a8I9^u=6b$scbCC4$hpOqKTZ|V!?bPM{DFFh%IOT~On z$>_(V;$j=pzzshP&1!&>lHr1xREfxcYa*d}4bUTpyj!D8A%UMwe~Jn&Fs8+Z*+ePK zG`9{icSP!msWh=Yz;$%fh@A2k%m09f$k z0y6Dv0=`oymWZI`8IQ5I%}-$WuhgDfx#?q`a_;dETR@Jyc*OGpcEIz`W74ty*ey5> z3H+g;Us>=P>=ix3afD9+tOTA(I&hd#)TuR@Jw^B&T@9yEnFw$Nb=or=We!usD=a8= zi(0qY+1c)FR|u8#$wQ%6(nmKnOZR*IA3lBR*l#cN&z;-d%ig$t=f3@r%1{0vF*nf$ zdkxV?ewQcR1EAaLdij3Cts<(MnL5s^M;D)USlGjdaKjC9_krY7KWXdjNZ@-Q z_2oW3?|G0X9}+VUGY2q6gld4+<5O?5Av-cf(gjmU7+_df8G;fSgh~*fhBREMlVYXR z;`#J88()Te{PN{{aiakSLS7YPAaRJsxaxKYpUXV_p%eS>JIS6tc`~^sFOk^7{;yp- z55VWZFOqupSBZWoFYp)s0yPaUVq9fZO9)OSJj5fj2Zt+ua6H`oA^pY0cS+` zQZz?O*rF;??x4O*Z2Rs*H(r0VGuK|yP~TPH$+vk}V}3nqgV3(Sk}XNTz58HS+4{Wt z>9uT6@`XRm@0r_;rGvj;;^QrV^io$32NOCxS)b71xl0UH5Ym<}luDzopP7<;|5j`_ zFeB}K*cK?OfS?F}pMx)84&6q9U*UpGn4ny8!(BxG36}4LmzY3sZ1;|XzurG~?AX{b zTfC;OnSGL7we4*-AK;yf$x9Gw_rA&6y4vc&ejuB*`wL`V-<9dQPbuA(2^M9;29gL` z;s%Q_*KUQ-rgH^UFNr0tM)KnQ0iF*=jF{V_Fk%ryf&$FRMKZOOXoNkQ_BcJ`S|J%% zDwRZVLrPTGqZIt1a1Wden!$qTnJ8$-K5bc<;#A z1C#RWm9cSu;hNP)CMHXY*Q_18u#aw^W>OyXxhB}*{EpBf*x`lXxX2)<^cY^4lO&I3 zgH!NNA2a4ARdt?WgHM5z>NGQLa6E=oo@s;Qj!>*N?g-^JxEk9LCRzfKEina9A>-_U zN0;5balyXY;mAP!eHqEiIPZ%W)DMJ)TlOrLU;oSt2cH_PuN@B*e}2!#vC^VdH59kT zx}5aIuZG%WAvP#XEb*9>BD(&Lj*Kmq4%*+RfKZ*H+i$Yg^j+VfHNc^x55qf;*kn zo%I*At&P3Sq-@CLC0Lsp=^*?pI5?`G1zuj9E~^Dq2}#o+Jye=Nw@f<~nJtJ%ayUl zk(PLKZuyeYO`fvCTXKE=;=)|#q5Oj8qQcA%$tym3>Tx*H;tp+sp}U6=jLhKoTNqn1 z0-j|dBPaa>DYSriT$v2cyww_Y2A>bV8%`s4z+GJAN58n>c1E(X+@ewjtuMa}818a$ z{X4FfinG`5yJzp$_wK!L_;5)>qO-+U!ald->YX>pjt$F}Z5T>^F45l9@^`e`Bp-O# zM)0sQ=1}s0JA%*HYA*u_gV3Lpp9TmwU0Ik3o(49CK)tX$2*GV|G=h9YXD8&`OvQT( zZpPW4iCE>39N+}`Kl1~m1XO|}a9C5y2Q~I*dOzlOCMDAC029~PpP=S&aqPIfQe2}Q z<~mU@3mOpt#wqBlvOE>EggexDVqrqw*tO)Ru7-2x8gp*h*Wca}jJCDOk3PzpJL*F2 z2y0J%PyTfBC- zR013+3P2cfU2q4xb+$XFT&ceba!7HdB?=>eqAnHg;RvHJ;ui|GI9m=U792ggX2I)s-_+OAjQc45fP1_C zh`-;HKb3rujnD|0J^3dZqXmDg#2B5hq3?Y)KS$2c2N@)r2PP0A=eTr_Dt;lH$6Y6U z^v1z2Hwf(#-PVU32E9fFktxyHD99ya5OQaX0z|GDCRfgb7@s=IcqNdKjyU}3^2%F= zN^UG0I=-`iFMDJ6f>)=$ie2}0{`d}4m_e3oSUd8G_~Flc@FFgZ%+|uDA--cW z;PcMTc8rsrqH?owxHK>w#<(i*P|D75Wb>dHY>JhfH<{>^kWPX}>Wc}eks%4H3=S@E zfqVHpl#{`K@%1x}OG0Jjkl zdW!s1h-btn2uJ}Mvf}ZVZpJHKcy}a6m7|hsXH}HpE0ILxsdZN-DB~Q7YE(E#WEDBc zmPnBMGaPOsWgE-)^Se7woane~>owi07Ia0*>N{Q;81Lu|Zaeas^+{mZ*qe&QsZ^{3Y>*S>lbfr?&pK1X_YHU>`eS(cY@y_?^=0X{CX z4{^RuvTT+7HAM2y551TJ28uuf_{1R8Y@}Mk&Xz6I!1J`|F|jF;*$s77JH^DQz4!|5 zJ>_Z`__OwqxH94@fN9AbTS8z4SZKl}QmQ{7=0qgin?q`+NH%^og482&^-E-g3G_J> zOmJJdGb1O@dha(r@rkQf<`4JR`n~c zr~_V@jU`6C5uo(4ec4`TK8BGQ$wZ9JCyIj+kVQ{XgZCMbHWfDxP}kxWE0#U6bVW&F z5pp651J5pg9Jt^4g^xe;<>Z4O|H9_OcinaP(A{?({#Va@MZn50{qnQa zLna|IDKEnQ%9ReQJ|;Z^0PY4jG9}q!UzinH+}cQD$Y!51XjK9wC{$S!0d^ln70eg8 z5n>0IT?;P35j#}fkt?xu^*8h1bI*k(OW5BR$gLmRlzfRT+r+HL@EP>C2AHFE^tVEK z5*Mv7*-oY6V0&Yi8@4y9D%!Cz?J@;1G*uiiP(29l*JD>?$Wbj_8m#(}bV95p*b5vI zsJoj^i@}jWkM}{tpkY-=<<6ih8jaGhpu45PkT@`rbdDe#60pX)hzT{;cnZ)vX+ha*YppHDyO!FYaUp$R@D3Ts~wJ;YBY)xbb z$#`UPwnLuEVc1&P(qvW!5O*^ajw=zeaYOZ}N_iQqg_ZO!&j0O<-k(iA@NCZf5%ofE zAOO4w7pXElm-H-xnCbG(41Lo9c&2y*kpNDqrRsXH=*Iy=eo4J;#d|qiCZ-AWyr^K~;>?aS`yk34Q_+06<=EcTjNeGyVI|eT$zfB&=C_D z8O0MQeqJDb7+NSKoH`Mux>Et@Oo!buDfE0&@ePGwRw7Xyj;lFg<0Yt;5$`3?CBeuFqylv>WWv(3sXGB)2ExI_o$PH-=yZ>Wuiw%G+@v|cemVITUvI)! z&|Rt?>7I*uCL0yWq!t9!GwF-1D6(nIge)g1M%>!atgk@EkX@llu_&3VaEQP^hAL zCWV{Eq$zBMy@{og*S&na=R#-ag|V^j6OTQ@m&vz5Q8w%*C||3!k`|H7Ea$;w-;pZoU?rmuj)veCdRcfdn~~9X1)lT8$oZ ze?63Y)3%zGh~HK!RHKOLB{&_l5O{&ezA?oP`6-zhI^@z&_0-D<&h|ZhL5N>2%Averydyt#1H;YUd@h|eBrSZKEH<7nBbhm z!mzj+wF#!9(Cnl?CZ`-+T)L{RRadVK6dk$PpygTY!GGz<*^@`A~@(PJgSGWWNz3lYyU>i&apn`jBQxFqOTr~312;Y}_Ta>#Z4DzmLkm~0 z8fusy8ywm`cerDI(XzaNudBiN+4G1T#bQ(O0|yW8t0>zr43#C7lg9dJQS6Bx!%K}&sLNM zg55|tTu?hug$UiZ+DPA_*(H6)<#Ka?4YZwvg+qVoDpfzUowqze#xGHQi7r&Vtru7e zIH>qFs&uL9B~o~RcS64jJLILj3Kzr%G9cmQ5PO6$<&@{LnWQE7w5q_V2Dx?%<}5Ti zHeDh0O?w4Ah&rf+8+^pu>|CKIu?i$JMbJcE1=r-$fKYM4=5#O=2N0RjP+UkE7_LI; zH%gY@>jJVB3<+Z*rv&Z@f_sMVdhV6rTi-i`?-y%AHawM@=h8EUR-^EKfVYsB+^MW|z8g5QV03;(fPAvQ^<}PJ%&}x03CGWW>L}FkWH^I8*b`1^uRu>| zId1q<# z?~7QRz^J$pN>sd3qLPhxM!*#fA?vB6R>BQT6tY!s z#;U|#gI^NxY@P&&aXJMGATBGmmME{ho{k!+CkD7(!_od#?KS9pM;m z7<`!Z1h=mBd6z|E51(B=zr3*!!4h9_F*|o5dH(Fg#0`8tEHceUqtq@PR-BQrY;(|j z1l+)}>oXF;Zh&l(cOqO(?49r(5W})%BPH>!!z>j$Fk)PTCdj~j95%ZH7bY0w5aub@ zPvy|Sec_rA(qT%?BiF))#;xcdY#y3AI%@U1()&;4z2A(~yL>I$-RZ-PHJ4|do!KxG z6bE0$^8|!k0LgiF2h; zac{TK?KLW}S>rVj!lXoCwbaKXX2~H3*OeNR<%*Do^XGwP(rkt4&VIY#>J7Dunn@R{ z*?!?d?}Lv&!A@>k`{Su?YBt@k8|%5L@)H(F{s4Ld8C`D$D|BN*I|NoVXviMM?l=ooCQhw3uY9(Q{IGxg|200 zB>nL-$W%x{(_eZUuTj^J@C|seXZEAW>tzY)nctyV@&zdX`y$7VGCk?9NPL|E0KjP zMwQCC--p!1!K+hWh!;foG$UE8nKm}3yn6c9s=0SuxNye>S|}Du zejj!rqJgwZLZ_lN@)G(Gwb#fgg4%1EPG!R;u~{~A4#Xx+DXaSFqQf(T#!w81VH=NE z(i`x#R;Y-klnw47hDyaXDlJu&^7zt}Dmk*kb41Z~D$)y(zjrVlWA4Qo-GDI_N~b>M z&CRkHvE~X$K`W$_tRE&VT|ITB%2MgD05~-;hczmtN+&=Qkh>Hl#gPIb21vStl|u7Y z{U$u9Juasg3F$ltO-p3qVhDjBpBLdDL~rrGe8cqKs#XMrtz9=N@D|-!`AlcqGi7|; zP@uPYQzALQUOT+DE%{xnp~Aj^HPmu)iGM;l11r_?tVFIZ$D)b$kEvKRp5Ms%ZBWny z0EN#<9$+CzZh3*=gNCgYZPRuGu&99INLJ#GTq2985s!-n^fXB5tk_mEo7Sjd28iUB;4sMzVl&q?)`_xM>{ncwv|6=WyEo(^z@v&OYA%1ok z`w=+3-@>Q(k}SW-5Iw_lA(MdPV?rirbH{THX-*j+GlcK^HU7eYtAQ7yT;USw8O2o$ ziyLKoNM5C2AK_0$i~#2gscYmUx(?R3X3nY-$8cSQXApzIA)>1bCn8mfGUbyW#KMi+-1)R!LSKsIk>D)&fLya`V{KuxM@XL9hVXA`H-&$TOAj4< z{;yws>FR4g@tNC3i%p} z2CC8-#$`xU3Cb6L?tzDI?Z5E5k$K9zxpQ~#-ErXOmxc~}KhZg-6@AZw-av7dGT8qg zQL=(ig0Q{xlLwcCjN;{X2tC>#2qP2X5%**uJu3}58^-cjcBj*)k*WyN*{GnPtTw2v z96?%8US3{RUK#O(ow0D3hgpOxn?q}9tnG0cEJjK7LMr1D%3kqd$K{1<*N)Wq+9Gv} z>e?qeV>i0;iVAH5)$9u~w;#VzPbWO*fF8xDM;m}B5U-AcT-?!#1 zIDqBD4HuXj!jXif4_z$6xzqftgan4o4_qzj0Js^CO2Ht4LRP0C&B&=qXk)CcMs1=| zg0nm(S*E_oCJ@D*s$eAO<`$6TEg%c161!8>MxlQYXv^W}J`x(fyy%Ug4HW~6h7yT6 zUE|~T+`Vw_;w)c5pvd+R>+MaxJHPML_3=c!ao4tM`zHdYea`;noqc?)osb)ZLGeqc za8n_GA*vZs0hun_Ei%WFz>P6U?%{RlBzI~W0ckP`^|}iw^lCgBz7PP;NY|c8NX{-O zIhd>GtpghX=n{b8q#cV~YpiVAdcskz5@9*Po@nuP z5}eo>Pr(6rFbdm(QRRDE)DLsKNB`$R{a@_eA=1aKhmA+MNnHl9Bi8+A^Uq&8_ zxbmBAN3da&|FL=*yZFr6Cssw*`xiWL=dWqkp6kN`GM>*dg7qtrz9g{EAqkKfhzkPv z@T?9BcVf{n%M;+O>P96`YwQY?;8ub>Wn0fm%_l9D8d)M~9l$;2NaR2_z)P^9cu&Zu zNi~a=Y#ed?@`SnDPe@Qy`_k=v66YJ|1*NxtC%jgMyrf>^nr{gv@tuYSx^p@t2^#s!kZW<^<3WATZ*rHmSuvY>*`3PDs_eG?51 z^UTM@&r~A8%rYr?jV{Clh)N6)KEC?>H*8*gEj!14;d~@g7O=}sr(xTd(BQj1d<{wH~(slFI^(7WJ4>p73zrsVlOxi-REvO$C!)wsBe z_Y#Z*2Nk_EsW@~wB1#U?BU9|oi=V||(jV|h$EREYm#cs{O^_=zD4?eo(;&S@UVnVy z!kf1DHDzU%b+&in7J!U=W}Q3l=IfX%`75^byBd#q@Wa3U+0T++!go;p2a1>G<6rkF z*?HLrRG^Ez%quaG5_mqaf$VUEYj@)TvjjGoiY|dJft#{bN~{q|f9OOCu;?nU+!qQYFU=;)w zwm-l=xXRv04JH?*`V*Y&ei&X3%A z=e?fl#)eA&o;{QjR-9vX9~1Rx-wI3f6D ze3m~JF}zG(FpL-Oz}{BHLxLdeafjbg>5w2KD8|0Fw_#TPdnHrg~f&5qq(~^ zE+SYcWB}n5#H~EyBk6=n1cz9lZfDRMTnW;U!qnAL72G}1NX$UpsxEMn6$ZY@INF3V z%IT~bY^dofYptlD3qRc6Bkg8gB1(v(kp;<;wvwG~#@SJ`VIk#21}O;+Boo_k zYG7f0fDe$hUzz>^h;X=8Z9MQUzDc}aX_!GN%ZQxm)L`;(9m3v4oen$I7r?9O>{}dEx$J)PpqI$=c8!Q<{q63Iw3##{$t{Io@6rL(m*&f@k@J zD{v_gT@pm0bmAX434BZ;+??!-v$KQolS$uYkNnR_4Oz#R$!i&;e60Nf>dL&9H_uN z#HSeDDGX&pzoA3(4Z}=UeZwV&Z`hEkGkn8XZkW@=TR4nqhHsdj&*B>{EG#G}EH5l8 z4HWnbd{vO~Y zJ$VSGNFCx;{BYqkq{JRHr(@mV@xdEyPNx;V9`Y%Morl;HuHVS+L&>dtfAR0N^hqK1 zQQBX&2V?k4@6U6y)gdLT5Ts=H0-t17*#3v=kdl-Rw#fn4Z_YEP{M;GzRd%1De#ufU z{0`lir#$SD+3S#c|MGQ60kr0YleIdeG_O=|8l{8LcRC<(xqH7S`Hp9QO-X5H9{bP( zTdWRGdEj&VlK%{Ve>kvt-?OME-qb!e*$NLg#?^pxU4y;v1D`~67I+u{IdNK5rLv5? zKLmM%W{In$G4&<12s}0-vbX5qBOZt6Rw%?8xtT@@&hi-Fk(yKfE*r}NPj#aP=y ztZhtsRPkwXLKoOg0D3>g4|UrcCMcwhg!O}OL0x6lc$g*XYEYYKXqEAu2+Eos!|W#C z0?AV=54yUU6b+Mgke7oC3t}urnVn4d36Y~nRZ_@TNC`SB6j*pn;Yv%e%<8&^+Ug}0 z{SEtiues%>;iV5AI5pW{GuqVF*4(rwll7OEl$3bfV->-r1FM6XbLWhX53DQl~d7oIsXo!l?GpF4OJy94`>_ra0}zV`y(Z?DsK)7$&>_H)#Z zujmEe*#P=nNT!d8dZi@@GNjcjn3y4~V~(`_B7zMl=_o`ORm27W&^kpH zoR`;q3ey??=Z z+5Ppeyespx5QWfyY)y5&hNI^L;bz; zODcShJb3FK>pgt?(u&QV=FJ;EEBeLboamQd+WskT7IKGlMu!QrfbB^;X$yI0SjDD? zW~??ATPYj|w~BeDkOk+k5Z%^Z5VGH)Z!5Z(KrDo9-okm+O%^@Y-H4dW4W4X^YsS z41!b5gf?O?q%ng6#{9JTp@LG_Mmt_j08G*$Why76xN;HB&MnOKyPY@#*%6^JtFBtp zHNsp~W>4LI+o40Z;X3x_hK6SPEl1BDJ9+xlN!-A`Z`tZK%SP6$f(DE|s`1B}HC;&; zG|%OKtETI|`yXZBc$A$_ZlY`Ci1*<>XVSlA>HC})^1Gt=&!>35YBBIQ_NdV>I^f(* znx+Wmliz|bvZ@~{bT2YPay;mfHoyxVf{qvt<~iyhG~c77kt2fwom-+Sdd z$;8)_Mr1%iNrCoo-Pv&8&b*V1$EwAhWaJlwd1ERv`+@ExBN>8WfyZzef+6N%9tXLN zRxKrvk5*a)EP_;D7mLCtgt8m(whtC#mKWiM4y{&0S*9by0w)i|KOzgbu!aYL8A31S zr27CK*`(c^)@q~54pxIi3C?&551XjzK<}~gl6bzFnn0i?QPbYs7^n_Z)r3*qfl6R8 zFPHf~3N_(+a6;qJO|Wo~!epnoFev~D!cVu@9ZofZh@aRNPh(kor}v)L(5^`9-91Z6 zYTffZ85tgTjx!Iz=Fj^8uE{O(*qu)K=kFE!=O5abe5c`8xqqr>#dqD~$J8Xh6dLTG zKNQMyvXC=3uORt-XWsC1|4@+lIQfz1W9?z!@IBaspY!muOWH2#;9_8U9b6A4A1sb- z7JLUEFbu+!X9i}GirvE}uGNd>pQNW;sXzn{mD7Y@T)-2Nv%q7=sQN4Cou9XM`ReoG zU{Tz4{;Mr(mVEcCkqURgPkBER&=&^L&unRz;6MoatF>>vGiu+Gj47m!P{mMC@pKBk zM5|IF9#JbF-X{K>3eVzxCGes2jHZ;LwuAfK$^DPs|0r1=VA(iR$xV0*;emR1|59q& zdU@@+zg$h*o=e|7xnl3=ty)jmdFl)1YB%~)ARQ8O1vCWBf>7&c)U>79D&`8jI$dcL zxQCOpdsMTfYPe#?1c@RW(rh z7h5CvBg*|{RI657Bh~w63Q`)2bu@FwRo6~F*k!Yo%;}8#15Oll>&U7M1*_S0){c{}pI^{t%U^E&z}w|1<&QRzQ2Do6X)RPEY)xN2QlXyE9I6~_lt#>wmQ7Q@$4 z1Yb)wJS&tpsKujZ)~LleRpZ?-5dNoX)S@nL5J5V)TL|w!8(EFfaqS8)r5NI{-2K9~ z?w{9tWOeuY%7M~Eq^;ZWl`rLP33ZnB)lVpLbkVV~6*nymg~vRuIlY^Ax!kKm<$SGI zVIR9J)!5OWH2q9|HDL#zMc|tIIWC9TTb%Cm{O1h%octa>_aX>n#B|?KKZSRNYRyms8tbjvNx8RKib{)`MHDflz|WpXt6&K>vf-~E>C{^qs& zw?&5g`iCNs;r@-Im@~K-P#>7=6t8qEVFL85@BjrDaL^dRfGnu~JX1eFod!5~2?n6k zl6A#{6+tqlI3QK0z{@#|opc3J=hefns`0`z&9A6|ETB*Y<=w(@DX=qfzXo>9JwLMf zW5;V7Z$8?VXsiX}yY$P~Ui+T6zhU{t|2Q3uEaB%T19lAUi6HK%=dOL!d4{eXtbpl~ zpC?;Y6bkaua9)rCPWKIA$qmP)N3Uy*I;j{viLxn7l&C*|%3@U08l@dAR)B4d=US#C zyp^(6!`R&rqUyB)x|2w)VvIH9M@7W8VU)o4j)E2<#^kQPvb{y~=CMV=l3+#hK6&{>C)7dkNy6ik&MwPu^D_YUDL2bc z@_6mtueh8T_RxzZkPH

    {FySIZ%V1h7Pt4KNn5{4_F$$F68q8&Y+H3{e+oHA?Y!b zz+yrDV(~INAAbP?^C*jo>u_p!FmYa|6-TCvLp7R}~ zw8)XkRqH0!ZD6lYURRLZ`bf04iev*eRV~KcgL58ac7X$Qc@Zx6QEn4MVN}Q~x^6hF zQAVS7+pwudsa7)83!F=8%~awFH6}{h{um(#hN@gad<1re{H+_4(lz4uy&SLNsRmxXTJK`dhH;W-02 zIbFS*Z^c#u2ckN2WD};>MJ=MEu4er62(wXtOvqUjy&xWdT)MQ!N+}PRQ}Xu=0y|F| z{4eXG-c)*hS^M3ee*M$;tnFxh6~BlZu)s?%QJ+aazYcwV|GKE&|8MG|Y874+e5t6O zmZ9l7B)A&%zwe~NHQ6NbAI--7@G}a8^hQ>P(4(H6)Au` z4%5=?R`?6nL!}KU>em|8LdQ-tHyv+kIk9c=4)%rZBVS(m+}H7o)ju*g_{d!t4!D>k zAHbNX7V4>2sTQhU6)(hV)|rc;(m~bBmzsPfJdE*|D~75KOe~w%RPOb_{$Tm;Q1C!} z_{JL_-M}7LKmX&4?*A75CA)ugW^nM#U0Anyz!?=;8UY2a0S3Yc7m|u411Q)K=o2}0aVtZC-D7H{Zrz?DVLah3gr?So#gsqjxfQ+01*@wP7wlY z!%c5g;*|4W0z|+mgwn?Ua@R(xd73=6WTIn^KT!U}3x8xUz8GCL-ngu(+Ii_foi=DG^9bKKeMNfwnr_V!~PW%);3HfcU> zS*B|{8P21G`boWTVqC9eQ3w;hYoI`cZ7G8CSBkHAqZa29K1z6XC{Fmo8^c5_eS5;k{m6uy!KlmDs*;Q=ru#&UOTHr|n z7>)7p{=!upVn0CtsfH=6X569tC)6$74Ed7-k5p9p3gsmOC_0Gr31}Ch<_SM_sHzGP zOHeVk4xum2DN2GRBmyHau(_jGl_!D}N?2OWQX7hPLTp3FAOHi^ETva!bU@r80!t)l zN91EQC@~Y*Av&F1tyx-(0Tf4zBNb&nFUrRiPzV5(z0{hevs)H!uCAY25_sTaWo2}!b;x<@n5+= z0WS`ZakXKOyl>r72wDw3MUJz-P~B4ER8T^K4%V`F@A;u2fK1rgsp-G}`|0l;;`?3nZjkvJ{=49TkZ52~mbr|3o^SLit4$QPL}x z>ZDNF$o^2%)R0GjTBSkKEv+VFOubbAktU!!gl`-*Qi`{%ubo$hQl+lq;-ccln)B?K z{~Lkf+QrLm#Qn+RfKEof9SXF*B)j*VEDNm~{RW*?8~lVS<5avZC!pLwD`mar+?P4ogpL?<2qH&+tnFJUq?Ux)`-d3GdL!WF_3d z92xbfPudPhbRleTKWuPtD%paHoHAVmm;t6m1(1+`iKwT%4a)?0A3-2!?l!>ZlCchX zn>f}cl!M@Nb>bsf;t%#2Isi5LXEG#*Jp(t4q@OcG2&Ahduh zCL{r3LIMK}lQ2nUl9|k;G9d}+iLd^@ea^kF>B*1`-&+5*zAr0A(mDIyd+Of%?D9K? ztm%d#Q}#-IrxtV(ACG}nPsf^EfHj#b-E@+mi8SARLPW=Sw_`%0C|C@=0axzFAFD`>s_=ttbqPfLyZ0Xax92!tUDc%^U*0_kO7 z*-(z@zzLKN{WySkAVLU9)SRs0#Y{n#46JxT7V_aSc<&HylIVS$P!h;zz(wUj3J6o+ zxTxGi9TloTCcNo)xf@K&?%i|r(G{i!_g%8-U$$=j7X&T*V*B=A@czJ~%zcOG4|1Gv zqZJ#%Edfb5c#^0ifEd^bI5Mgpz1K4!q^8CP1tg}5aysDH8GcQwUP_%0m#+3QP9~u2 zGtnOoWUm7B^LgP%Y>~H&`H_ddu(R&?$jI?Mdm0gkfw>7Too`sX^!?ZWAm#`E#T{T2 zueS%dwGoR*_|_Y;7s7Usloa0!pr%5dBQO+hI3bd#E)zA;1=LazVn8j$wP?@-$j)9&IIX~W(p$ju<8uTio4x~0Tb3$-e@b>2FYXRIimVvu-h^0N znhzf@!ULkfPaRn1wAT4mliUdgQ5bC|v0+$MRbC?$)j-3-1ae&-!E(sZ3!C0Sr%R#` zmMlPBRlybK@s|)DLjt%{q2|*8ho_1|IQgN!LaoI($X$(fo?tI7&@Gy`uLp+s!S)8P zuPM}ApFgv=d-M^5$!2#wyxLXY+dQLFFD&z}ji!+Wvj&seYeUngPiwSWDyy<<3M*)B z^aJNKA7jFCPGPH;y?Kza0beR&$$-TWHrY>wbDB?aWY7#h3g^@VoKr6y?UJ~P?#3N) zTolIvovNOG!a0395C%FOSiht1nt5%@OZ!?oc6K%wHWyFpSmE3BOO^Xp_ zW5nM4F5jZt5o&|C+Hvm0c>{6ZzSF7t6eK^W$%dz(HN&nw!}&b@vSEzup$IB(;s~TV zi~fffzI4Ur&tAAcNzPGrvZEJ&`wq-qk@saw8~DA?@FHSu)8VcV^2~&V2*ytVFAO*N zXeuv>x?B{JUy3c~G-N48L~oLmv;`F?hd@>z68Na(Do1V^Wy|`=M69O+iGWAFePHGN zEBc?L_6;t2(eUOX_AP26`b#*(b7YDy$$}fV}*q zc~gXAAfRWr6z??s)2TQX2T%W|ysYDwPchry9)BE4!}d9I_?-FChw12pm5`k1 z&dHC&O2tx(?nFX7)qe;p6}g5KGZU4AKPhg;AWz?69*YW{ArTQ3J|pCW7UyG^4uvv+ zm5K{@fVQP+sRI8;6o!ZbuNH30H5o7{2ur6dZ1 z6b2;lOM?glaul>1&4>i5X)m&o?erVw%=y!F6c5yzdgx%9`KM^ZAQoFLd?`k0ZYT$S zbe=UR4Pa2hIP7~LFJtMlU(I&ksB|-%PFpT6z#G~ z>!@8a?(jr<7PX6XPFmrbo`87rkJ1x}BwkP8BZ+0TC$tOJ+GMZp9LZ%_uG+h;d=sML3R!rz1 z#4Mt4NFh3L?4-#02o5PhQE=ZuG<_5mED4DSkizF|X zI8ut5<0apHV{IUb#!B{32z z2I<1O$(4VC?!Q7dNs(K^a{!*Cb*08{BK{USY8CitK4FoohJ@fp7|&!pOPHoaejz{2Ac{aP zhFMBLC9zWi>^R9zU?HoP{CaK<6n%a!!nm>gJf}@nk#~Z}v16JrPd%8Yx#-Ww!5@u3-Fae>MQNpJ zP^D3Znok0MH2Q!#7qiv3_4x6v$7zz(6Y6g2OAY#xjlO(*?9n)Z{z+nwx=BNsj6F(H zo!B*G`U>;T8SP6U)B7BCCX(q$+PkuL(aiH->@(%Qj{Xqt=z8?W3fxgsy8dI}j>gZ> zCyqM`A!{^Pk(e099S!&c9CXyIN9vkD9bLbAW1t20qv|aUNME|a^LVxQc_&TQ$puGo z*HoymabQSI?ND}uXY%}G;*lc%IQhb#u{6Ww6jyX33gqPb)N+yEM=|jtzwd&c)^a2# z!wjx^HzE4VxP280wJNKNFrjWIJ=dwVXd;TUn_Lft zJ09`TV!>G^-{Q2}plCtG!%bysRxelY8UzF>;;?YfEWDJ6c4vFi#3ZF5lfUAeJ=(m0Uic>WvFq698N4t&i-)zTRu*%-&El?CGy+3iY;ZIIsMcoqt9D-8C!wHg#2$EzHkv zZEmhx`K|3&yp2AKT$c&-S>)k8q>hEi&!aIC<=Pm9$CRA`CB}&8;lq z0~{)mf5m9 z3DsD#aY;n0D!*_+7){_c!kt4{4`lN(NFR+I8lR2)Nn(eh7YHP&7sejgtmK~O)@*p< z;VW0)@btWepFeQ<#<$=8-GXnPKK;!FSgzQYB{;trkyj>551>Fs*$2Q``aN)E%B0VQ zY$lxC-SDuw;9-Ti6p`E(vn;EgBbY^T-3&n%hVcUsz=-siI8;sm4XAWDXA_b@9977d zhyWaTVT4fJZl8nWa9L5Q&+J2n8HYwu?dUw@nL}~b*@Ct(lpUZr0oo~0-{d80my`|I z%(cE*iz{bT))XA`*zGBwQubQ2%ywtKBad}=A3Ngr`TX}B8a+7O{o9<2j|E2-hT4^X zx7t}=-rVJDW{5qm!x#-zS(7fqX29@xgN-m|Z=!d>Vu%u6Ah&SOV9h8wP)=5}vdGPkkc-qAR;Ak>a^PCi}- z`u?#oI=OlfNwJ{=ER2b8Jm}&uJ=J60CxOwKpx3fvr@4I9r>>k=7I=u=zk8prypya! zPw*}-o>w!?xdLM@@bM^quMn17-13a$*btC9)u`l27@g=GEq8Ucgy8?*V|1E5c_w~m zng-FRf^;@=G>|aPtUPb^g2AONsrusD^4`2+*xg$V*>+pXQB2>_8<)*vy8Y{RbQUbM zuU+>`WwY5jYY}FUc$EX|m-^_8!s$c+g+3_;rxSfkh|`&nl5=b#j~NQ!bWWyLW2E@Y zRcZh*#SwlSoK90TPA6b2wWDwpOy|6H3kH|WJ91>+jXBwQj+7fQGB+MwHm~tJvgyq? zW5%Rm;#c5DG`nANH;SDCa;T zp}P~L3(?eZdoBFR`-q$^+ytblr{SS)^iaa*^ z;%SR!w}nzNo2x7P1KslifJ31JZZ`BQ!k#E1%u$Cu4ayUb+*ErV#vJ8rIIK{GrobGv z_`HNU>hi?7rvc?1f%ubiS(L4b#llcT^rH%PJO+`1O(@9!TZy(>;kV1NnzB-X>kUJ9 zLh#Xe9qI1{AI%Gck8-_EG@mn2@`A}Lj}G=8-ql&34(3@Vn5Vw2`MPza)7^Ug`t2&) zgi8!!ITz>SWmscYNc>-k2vS=nyb{Gl79j56W@{k6>4sp-mIj=mxSAxbM$K(Nj7l<$ zWmq>%gq})E06wa@-g)RLb`I*IbSjt)MNDbj5wjR=<4~paL=vuDoalrS~lK2UJV_N>O`ZPwLvp;?giSq5x z1T{{2fp*~<9%t$4JOd@+)8zW9Bi~0l?qQRXL7bYLzH0L8XdWRB!ru+GLN37F0?qQH zA0{Juj1vj7>j(sjivu-*>dNwBf3e@^3h?}tEbdaFJ8(1}1(aSjuM42|G~Jp*i2^im zH!Unz@*>?&nb%_rIJ%~djjYbG4c@e}s;Xv1{{e65{N>j%yTg%}e5O3$G3p9RKD76= z=bC2rZCZZrJJx9p)g#r$+YY#=^@WBGlm-GN%e(0eQilCSvR9UV#LpyH5x9qecKk)G z4<;e=QjN#k6(WDUhV=?L9lj(W2Ff))>?@`+D&Xty!Fde_5Jus=4u6415qhV4M|}4U z4tZx6^FYEb*Gyl}F82&y5Y2~9`7`in!W#<^&Z`f;`yvaV1Par!uG7essPbwLW!;ES zWfkWYi%4@8#2$qqXFpM#*MQ{DKDU3IOgbKa9Fg*=<(_whm#Nk`CK@-Ef zCZ?w?nV9~62L~(gV7(GYl;=aM;=v{y+KBQ>0~;Uwb!6F%H!eGpXh6Ti63xDxT1z(W`|~Q zo!|%=)&uoUMTSKXn}!ljc~}C1RZZ-mBoQx>s-Uo!qU9?tmX>0A@N%BHNj`^|chibP zE;Vi{!(~FT&qZKiIUX!;OsM*!Xfa!H5VF9KwOA}(i^pg7m<5I`qVPC|EaC8IqTHg_ zaAXlNKn@An*-+CnQe!jEtULZ`ec{ZK)ysb}eWc!0R_!b^83RS9Zg6iLO>X+oApfQ< z;J@R@W4q@1maZ5qD*BNF=2z~&YQg$*;PmX3o(*N>nPq)y1_MT-%HjeD3Qp7M)5dYa z0vZeAjK%$VSdSSgI-M?zPa{rJJ_^oC)hDHn$37QF94ebc$0@*GbnG%gEFlyOpCo7- zC^}wGF~IHeooK4VhFkRvhD?g_qS#m!b`y#^$K|o{Gq+A(AN1I8Z2~|zTQ-^BH*cyo z+ERyycbRQ65Dr3bB`ugWYfV~#{gEq_p8|~2VQVPOUekBY0bfaKcK#E}BBpD;?%({i z4y;+-#IIF9pA-6|U;64vCxwBlBUFLylbeGqp;Qi8o}!yAWoGKfGQj%umSKd@;E)}k zFIYykQf8_?6S=8zPscwIs!B*qWR!)dOOeL;Bb@uCaG1P8kH_Qp_|EgT%=vXnT zoGsBMoNF2UW9)`zP|D>yZ5nadnwcadAcsV@(x7tmEj4s6ND{ zQ4k2&GpPXbQgqA~zT`NTOyEw%kRkCd>P1*`$nlMO4Z4(rSL1FQac>w2eV)@FE1NhR zo@_jRtFVQeZLozOzm*)YZ;CjE~bdj2{?A9*j>n zgGJAZ6GoIIfHSIe6de&2M!$hohNplII)ve%MBO5 z9l5cT+F6cv(i!v;?TmM-f5Pny%X*hQcqO75j&EgN_K>nlL^eWu@C?b(8L@r(xdUNgeix^T{T{ARvuZx26JW}y^Zcf zl7}z9TnWlSy1ZWWvk7yNBOO#zQR4cE6S7{O)B)Jnv<`6kSQ_B)hO4PYZ92V&pt_Q| z2>2LHZ@Sv7oLIp6?7i3C$v5+pYu75T37{_c+kc03B<`btsSbbtMLomH((U{V6PWmo zoP#-(r4|g6Ebdap-+CZv?KznSE1AaetyuVg>Vjf>8K%?6!8rZl>v4f`n8XN_PbGmA zgUoVh|?jNX{9NhK(x(Q`7NLJ!VO-x0N^XpbbwTpwqqT z{nEP^-hIaF93H;=Zn_Hh?j5XNc?0LMW;D2sw;khzzcFn5K1Z36&K~KD4yVyYKxu_7 zLzP~+ya!-b^bBvO5acMAanW2}kc;F-7FqZ`W@Li0s%VYMFl8GTPP8>xN zDxO>mzDq5m*T@=PEQT>RMGtmK;ovSH^t<#f#(w>4=2F_&s|MxQ?7l6}?vPJzr*R9Q zoppR1_w#l);BUGsIWeZGk7JtpnU+SD0MnEzKQ5*zHIld@?L(OF*a3bq^$F(H?xVg4 z@e+Mkstx{tz1luZq9_g;D;TN>BdwC;3pYPig_mYNrUKD=@+urfRq7}jL?TXAT`JAM z^31l|?M}PX?DcwGdc7m&a#S9~Ds0_BJ@l~1^{Ag~Zfk39ZfkFP=^pKB)C1eL9;AOI zOX!e{ucBkX%%O2!C;DTfG(CQEijT`6?t<`#<*5Z?2Iuf(X`BR9xH9C7F2_Jnz8A{{Yc7A&J&keL)jAFa+OP1>870=vo=*hP($ZZ#2 zl~3Zkgby;nzuU|AvbF|gsSoYYA+lGJJ*d}#Nkr`@s6!+msHp%00$0*@mOl)?B~~{dk%WpT*TSd)QNlN9auVrP(F5oTx^(zw!aq4z@v&cZDL1igU5b(YO0K_7 zxpI%P3W}f{b+@lgyVbyQsYM!rEr?#5lS=uLJVi?}Nlz(D6p+u6N-fb#F|rIFt8ZL3)ZYy-hG$-QhEJ_J$rWk`_Fgo{6;s% zm0~Q!T3$sjnfMd_rahG^4V;EA0htb(90DFLU$oIOh|0umr(Ax*`lkL#y9nL_E_6Hw zk$c3hJ@KEonCAd+ zfSsSn%()qQz&LRTIAjwB{j`RGD$AjEq3ctAoj<_V?Ap0&=axO&x9#2X*{X`RzK*lxEIIg$g5SGXNA~cs0;}oh~ARMPXPjhs;ETeL0^KQ#l7_KLz83iLVNO5V8wt zg7_~QPrt)Z;rXwB{gkJ1U%mHJ8#mp0y6_#At^BI9EuGz^Y|Low!0mCrUA;H=4BCf- zzTAyF#EPVyryR);`C8+E9HvIBRC0NM6E%2QgyCZMfdV@6D&qK&TFA7h3Jd|42)v&0 zlOnloi=;w>#b>aROf!P)&I;>uVLKx(8;rXz^U-7}V{lMf~cun_#?H^S7 z8d~I8>o;xLlecwy&)3KAS+L-q@vru6-|E=2b<=vx!Nkwdr`7ViupD4E;ADPoB9Hj` z1TjZ9FUN6(%9XRcd^yU!yu4g3zm=D7M|l=6uTsmuz{_uk9^1{!3Ga~J^9nDo0R2i{ zzDF&`oAKSdP|oS)S!($ODi<=C?$|~yDoB#Q@K^i*J>RpuoZh3BW3EcVTREnVpMUw5c5uB8I$PvHsuWX0VU0o$PKI`g<1SWHJrac#1kP194(j9h-b^t;iuLT$6mvbiL{55G?JHjNS2VubwCZD>Wi8YAFQF1k{DkgHC z`B7J(?9r;pkZ=h!SJHtFMEH7WAVoCDgS%&+7~PHLegBIWFUT!lWIjH=5gFsBafDo~ z!aQ7%vJt6z3E=wYjJdHG|^yTP?-%mj8eE2SB<&qUOWEa_*%Nx{(E&oWWIUM z`K@o|ow=1?YAm2=kokOMbmmaja zET&>t!SJrJHOI%Uzj}51U{k)MqOG)Tae&%{Fge_fMQ8DAL+O}2K-7X+smC1$H3NKQ z71@h8TZ?1(HtZlsd0i5hh(xKai$c!gqpIV2C9F>Tcz^TVTEh; zs9CxD0L38Oo$P z(L|A~`PRV;VdS82Tr3rIh96CdXOPCtR}c4a;B2T>l6?v624Y<1HdVT=VU=2o-fI>3 zELIa(6u+B#39%IlLOA6$nu}>UNtD8lnM?p2@6y42Cd{dS? z`QJF5$sw!s#>lgh}(>;KaK(PlDpo$r%8=}~M)@_f@TfVHIX#4JKw>lgv0~9e3nIE5YFOS@V z7b%${_mXImG~ap=CEQbF+A2O<;D`xli{}C%_D=#ls79~GVbGLv+bJvwiR#7tnIi~p z>O7`iavqJ`3n~tqQ_N|7ZEe6`SLaVOx61o9UT+Qk!?KNcC|Chv#v)84#)7N_lk3Hto1IWaBbPs7?!{P4IrlMxF~vGCghwO6 zdWaql@PglCP*%&|z@Ep+7N~G1Cma*|rL<>dc4lJ#Gxg=9kNz}{=JZ7RBpNJUyysl_ zJ!h0VCbrXit(VSIonMBhXM{`d3+9VpXy+(iQg#hGtx5NV{-i<4NbppN9##48ncqerCN3fS7<@>_r zPpG>7?CrR~EJI5697*R=yZdqkMiez{8jbry9wo9J`Nq~INTE7#|iQ!MAMvB z4#d+aPjVU>2l1XWO2ee~KM_ZBHUSN?4)LwXd(J71lim~mtrrr|JjUNc>qfNayfVP| zHqDE=UKBw?>qXGKsI{Z%|L3v8YKS(e<#NOS@}Lr zzloRAe#W=3Hcx{0?dNL~^>OQNSsX1N@5Hpqlblu^FT9tJdo*p-I(#CImXH4wv`@#; z@_CqoHogsfKBl03jK5c%7m4;W<|U3cJU^UPogdKh`AJMWaRcTli?3s7x1c$xd_I1S za{Es-&1vQFcpBwj`Fm(Q#e2>uD<`eLAH>m|Rn|VgIc4S~8d#0c=E%2RNI>%v zr=jr@?K!V3k6)vTprLURG%qT%<7x2iSXpHX7NtjE&5QGh_N}w({*R`4 zD~{%zvT)LS-i)JpVKU9c0!~BwU)cIyQMm7V;@Y_KSCwb@c&@`>h4?xg;Nx&wITqi? ziP@l8$!YLTtku)Xwn^*oGn|IjhM+mClulYdd*f(cP?9Fm?B_JJHpF{gR1A~W#vrGm zJ_@_#D++cKbdZX;@>dmM&-@dWa~+4qB%`Lmr=USwm4co z-ic|U^+bP!7NL-HM z0w)@4t1#(d{Dq-}^0slGj^6JNh@2H}2PR;wI%HjWSjR}Jihc&va4LOZ$|(AKW%e4lXs>Ds)NIWciu4Px}j~4Kl<1h`88xI2s>e;{5SZz z%8?;xvch6ginBFxt&(*^2u!B{V+vL0DS~t;M(!LRp8!S#p+`&bmPqKtB&zCIs>!d3 zB2dF8Y&KiDt<38x5BSK{#N(;qx2E{su&W6`U?QeE0taoOl$~#GYFyLT8+y2HL+`Zp zP2GL&*6s#Zy1Cfrb-DeeRqW=4YkD`dmi@a^m)bjC->|qTG-^=3-QL;Su{l^%T~k@1 z%)~5!;Ym3YUfAqCuq&oKmz~0D%7JPH96LSCR2X)$@7PT8^mm-;`|`~t>w6!poR)hH z`425sv*0N%$sM3>6YbBg}r#c77+0Q+t{J-@wUo$jp@RdG2GF;d0 zc4wCah8I_KZJ#x|y<=p!x$NpIM%^oFYD_hi@*levcDv+VD0pgT|J@gvu187 zF6gT1pRe3Lx8v^VGwVAm%rsV7t|IcrLr5u4(m7y|GGGNE%}Js(CoNYINzy5>#8C#R znyiSu6lI4JBSE(ns>zBPbrcPJl~Yv z&E4F%$Y38n<#rVp$Y>+N>CqC+vjd|cd9}IUrwPewo+g(Z{LJmP#$aE6(bzKheVnBW z$7}C-+%$jI1_Qf8KC<=v{6Mwaoae9hcC9E`VfE(am~&jMW7F23UzwJ?RkXDUc?Eku9M{M7Or^~kTVi`$zV4+|L z;>Ks{w^g#30!f^aSq#{}+#Cw~H#*j2wZSU-?HR`{g>>swX4>u9X#*={-`p7&pESsg zb$+^Uie2lQSzvb5kK$b#Zp|OzW1$@H^b_{iS9M~>{Ruh+dJJ1X3l zC)L-xD;%=?$5&r`@tYUE^1^Fd*6d%ns!Vxl|LW4!P#S2x_`wSb5FeT?Z3?9mULGMa zYQ8rsS=_lV6S633-HYC0zo8!H`tj(x(B$HX**#mz#`VNxo;EeP2th*K0|tKeBI^&cz3?ns^maZp{z+(UBDzwM*R> zp-d{lTG0*VJ7swQBv>~q@M7W5sFr5n_iCxi<%L9mnf`;!fhgv}#RK-@e=X{3 zo>tx3(mI}vE8zWr4`(&l;nvleGt`kU)!;_8SfoGH6>xnM0(cgusf2zC*rKP0$Yp6}oUb#>*CbsT$^~AAoSg}0E%+pS@;Z%?Ikq>JHlfi-%-8G z!v1QuSKV{PJ-&jxre^jg`|PiZeHq*G?qWJ+1$$VRvC+DP_G}+`JKaf7u@ZYjIfNSr zJx-Q2J&t($Cq4l=Sost*VIh8&{6j;Jj@a28A%ezLZkMG%C<14DJtSYOJ zeYbpS_Q9d%-x=6%4t;vt{MBo#XU|^--Y3n%`Y%C$Tv8v`n81HbM)+FQ@uzXa1xIj4 z*ASOS)+~wEg;YRNh-7Oh9W*Yf*rTIng||Z@8H)|@ojHB=q1L{<)|OzGdu&--AmD51 znO8e)KQ2w}S?-@cTp9FR&Awm>R{Xfx>#*io9c`Bl&)7>WKwa-Waz4hvDQ!4~k;jG& zJ5$vtloGhv!QW%mW;5+%NY7OQmp#bVJ@n2Iwe&)VSQ3nmcdYpb(y#W=vP*{YX& zR*f9pz30Yb`&WJGCshtxT}NS6Eqgq*Yx^~~-*M=`T^Y)pSqlb7Ev#U;ZvmYL2&?e} z&ezP+j!;f6R!|NC%y6Uu_fflI1E(eb8qPPI_eY(UNRLH$HxYnYkxMdMnW&tfe0Ua; zSu%S(X;f8YD9jCwM01vcB63bKph6AY*D6ABWqhblnLQ>i_uM1chV*F>x2GWu1qSyF zU$*nO$5Ykle30F6!;-yiYge!p%HuU0Hia zu?utcfOe-7iyA6PDlhFuu3F;k`0E8f-u+(ipu_I19$iqFQ(LOHm}K9lZkmvsuV%h& z|L=9#~Ghqh)nHO>|<+(I8u{>F?gA~<{MmC*1 z_~3QdKJ=PvZP&e3y_U^)o%&iiYgAtMvK^N_+S1s1Xd$z>lqdMSY4^7|rLs_(BR3~I z3-Kgklb=TSFc{e1h$hEx8^%sr@@*8->gz;Als`~Ui=THh5>v@Gc)i&f8T<3s?AX0^ z{04v7?j@<7p7zdNV~1|O<{Hyi4R2>&wTula=Ng*y92ya8N4w9oR9YL#D8S7UbOa73 zumO9Ym^|N}90V+~l&A`kM6p!_)*o9cc5a#l7++olmT7syxGF=eD{YRjv>JoKCOQZR zsRga5vS8M5V|Pw&XWh)v;69VdoNqMfx9W|ie1plfkG*_z?}6)Unwx5`JGkSCS%>@P zOv`HyZZz+0Zq4hR-*Xts67&_WbLvJUw+u@f?0;XTc?_2m?xrZe?+?-CWXlxg&#UEp zkMZ}wN=EOg6!fB;-XqHILovNyl+$}e`SWVIz@|idq<2sfc@Lil{{A1wlyf@{FaMS( zr*k^q&(EH`{GUX5yC~=999|BqAicj4KQPZwLuHHXLM(Xu^T2rM0bae}hjPnTkIxDD z?d7xBN%qjiyAAT*jH`%iFyJ76z`tjb=7lnI)9@uoO(-s!%p~a;r?T^)@`%o^%2C8F zqXnAQe$s5nqh06amMA(u>kw#)m|sM5$=OCn)wJoh^mCuR%lZ8A+dP?Db7uB?AFooj z$)+cEuVu%S&+xXjqix_XA~q)%>??;WNjO<(vISXT0v!a(p{CVVg)^NH9*Z8zj0B6& zc&QFzGQPM}M?q(#A0Rfz=jCG38orb!5|o3ePGaldSnZ!yjN3^%>ss9%p1zv#u7ihr z_Rcr>i&tB119Qh_n9VEPu6vKny>=R2DGTgS^n-3;L_7*2%oy-;z^##>2Br}ko5L~T zRN-F(YuF^=Pni#ZCQ!poh&+afXGTm>FPKVvY>wYY@hIWDdCAZLO9xGyz}aey(ihmZ zxRb@dx^4bmTuBqTsU=uh>Gf7udpF`vmSVqp8I8E5<(HLiS7oKkP5T~W5t&mSo5N=n z!N3>?z_q|oqbdy|HV1h}6jsGmW_5C>_j0m|-5K#K~!@H6jYNo2p*Sd0cD` z=AOpl5_2CNn={2aNK*$R(RyI(!^1)69ie~cK>r&&1prBygw=fq`*;%E@vaX>g3qmdJi%OPT zJ$6%p!`3*zXVtpG>?}heX)e+dd^;a}&_aBPZdzbNS(&)3NF5&&78A-=kQn95ql9+0 z1Lr6#B3XwWA3sR6yDgI0uO4-w)u?Nn_$00PdR*vG;5}S|XyUTEYmV0}@A*yco9w|7 z-~6ncb-Bv3Ho2~8VciZgci_`);7x_{pP)UZJeQM1V?zo47>=f<wPx4 zV6mqt?IyXQHBWgzuuT2EkXZw4?+b%tHLk|J%PL2&_}ai&E&W?G}sFQ@?X&8 zicq%2Y|P0@Pmu<3)e3QDNFaV?5ZMW|D}&5VGLuL~F)P6ag8TAQ=r8yf>-@RHw5cd_ zeCo>3c{m7@Q$3-Xm!WSJ$j!$w3wfJ?5UvZu zP!0t=ZkIC;Q=Xfa!3MQuiRgKsmp+SIfnx6QB5P?A)H`ms;|m403!GCC6uovyTwjhS$)+nmNApPvTr!g`im9J|uT5C4Anz^r-mpK&?Yb);JRS}exgs*;jim)*?DD%jJPFCVx% z#5U|dzj|K#k=C?-U9&kgZ)TIte(`%fouR(8^wewlTA@3eKft;7kH{A&rKn~LdQRpP z+6bEg$;ENFs-cVmXg)@)b*Rrgc z-N~AlwYDs8y0dwC%h5S+RQOBEUf9y1f5-6Sl=jWDXK(3D`EKq{>DPxJejrnMdeNK| zHkv$p9&*EfgE{F1|FRK1 ziq@RmrjqG%tBQ)9`CZ-Y)E&9M$}!okxf@dq27501;>z(|2Wy)e>kjN*wu+^%$V_Li zEoTcC%pPc)vBh~Iv`oZTAU z`I8udpJLvyWcwf|$cB}VLmw;<#n|vRXbkd@4muQAr4374n8?Y5!flA$#t;eOr$h<} zTP{ktoux*I5;B})6Rm;*$+(J5&&hN_btto-prE86P~od2gGv&51@kaOE_V^BOdvo< zG8>#|1SmxIL=Ss(F#D+9Qdzxp@t$2f57sa5m|2Ued4b%3qoiied|2*s4H^2Z@m0S% z^y#B}r|%u?>ML@Y^z5&5mh|W6&76Ka#+2jG^D#xdI@cs&TY)VI8&q9X;WVcjasH%! zM~PJsq&0q_6NZnbs$neVhM{ zddw+danl(PtO$RTZPhGY7Rt=YBrhl%GPAI*guY8-koV+`mwEcAVE;xO$R*u;s*x#G zmnW9u-dFGil#grWNZv%wg$)VhWVsP{d3XXO!Ek8N+01&Ke&Feb&M#Ho1W<1_bVDmk zcHW44*q>x`FaFQ1fxgfTm+}C+?8s=3@)_6lH8t9*v$ zCCl3kGnTV~L!ahm*hjeWb^dBPTZ=RI0M72>%zcv1vje?7XqKTLn-H;K#7em8OX zIYdcB-XD3-3xAC+KOKJmd3|*GnQ-}wA4He;hRYv#KXLh;G3E9!{mU`su5kHX(d9Dk zicrVrp>TNvk2w+L6i@m&wO=ULY3*?*e+~3%ZNmDmC#=`z!<|g?G5PsOJfl%M|Z=yDnlL4O8%V8o^rDL?y{#O3EgiOXLoj4r477Vm!`Cvo|mYPqmk zQ9Fgr>STqWk1s#{qv&#Kr=UNh?oUA z-$U~x%3nkzN~E0nE6N`r?@O3IQhsMlInAe_e>u7w{8p4>e%Wslya)RS^lELw`mZOf z*Txt72je^W`A9vD^W=JMT(N(|{-f4KeLqr9<9?~AI!((dTm~? ze=skT>$UNw{c{-_u2Nv0gpHW`FKoUi?V?}t<)^Gm21SU8>3%+fMiSbCafc@0A0CO9LUdjQLr zB$7x#D}q%uDJd|V!!j~b$ADOh6_}QmzC=n-uS(ZeVEv?rrBpnSmYOjh`9v{`mXjUw?|C$0Kq^cn{b6Min@ss9RI zAt#@73tkmpe)>Dn<-|J${TY=P3i?R-*KkpR%73CyDMEQ%l=yDn#QLc@TppTSm<0HyRh6wtX)o~N$Btt~`UD4%ShKTZq zs2nmx&}%ZJM*3`s!ZOKshmEbuj-psG03S&*HZ5SEm%`vw6$UVKlk+46p|+c2>7yw_ zA4OD}L|ZbCghmavpdUgbN@S#egvcPPH5sX5!X?<{i3G>>(J>TL2#!xrj;#2olyq^z_uF5FAyhVR3^?&bErKz+wy+T;@_k}v!AS@DyikyE$RH){@xTQP$;|h!;F;nv~1jgG5 z);9RDh=U+L`eX2ih}?)T*Z8O?Cq63ZH9i_&uJO_Ma*dD1muq}floKBn@7MUKC?`HD z$~8VJ%86f!a*dD1muq}floKBn^e+=z(L|Ejf- z=c4Li3Q16}jW5oEkjs;wkJQsRPp;R-8)ret=}XnqxL>NC#{W|FG!K*OwfVqV5OQsD zy*4j63+fWpYvWC4!9|e~!ni*-(ZIei@g4q7s-d}E2(TY`3@yk+szILJPSN{z zkKJ9EpJ~gq8goVTerkO5KDnVpFfjLblZb+n$iA?D|K7d$S65wKS6^9O>-78c^L@U2 z`NCJ8eCnl_o_g{tTeluMx@F7JBUhjEJM&TN^wXd)2}gMNbx%s^(uUIr?bE@dpxW(? z=t&E3pU5h_7__b7Zli`FVl1YHeBEjxUOPWri6~g`I&=2%H zD4k!prT0fS?b@}AeQxol8!z&WgD`Ql%Y=Dxz>C6tsTSC$Nu`K(D~KQ(%nUwB87i$j z=Z(CF0tN?m^;OYzAt1uR3n_~6uK8*u$Gqf?gl{2Wuu&r=KENq@00{?qsGg>*oE(EjE4H*YtDtdw#ZeE zq8hEBtB2@C6jlt7U-aB30an%HE!U?~mKw*n?})~w%HT@k2kpSPSo z4AomM#W-XmBO?P@7;s+T$d{ysuvxH6pzvXW#?k%oe1`JS8Aj0makYdtPf)d3RJkds zxFrIxd;wPwj{W*3Ty!9p_TR&l|M=?RNA?*H_uqc|?d#bab;{N+d;vX2TLPGq0<8N2 z>9e71;1RK0BwzxWDD1ZKA$kWcdU&kiDg{^^Eu@q&=%6j+tmZKuJz+E{Pnb9bFUMUC z;fJC~;iuMKIf)8RGs4`W*Xm@NAfV`be13PXJ{8EJ9t#}=qb5h49XBp^aIxQ9tPM7f zHT3NpoxZ(fiKE-s)U&+2^a}QQx$kaU)7rjio4cB7=N7wr8+Y2+HY|VQd1ZWW`K03^ zBci040i$b0=9?SQ3fjrL2w_WVA{%sgLYwY}Q&`QJj4(kS{{_B5VPAqghA8C0Sinye zTMw|N_fowZf zR$dWEN(EwDWKWZ%2;Xyv#RNC82n0cJgAsAhn)h8c);Aw+-#&Nt*4EzkrpopWJ-zE& zmDg*6uDp^!pzJwkV|@>>uWH#3rxo|@Zd%^lw4|wZEYCC0+`6#3a&B`)joDsP6sRgM zRo*KvGM0^027}<{Sa%f@{|Q-h0kID*30Ga@VYj7YZE!!NHq-(}P+EbWGDL@C&2jHH zegoHL~(vb+hven%8s>UEQVpQ*+7iqRQ@GK9}TI z49e3WqNyi9jwXro$>;*1Jgb#d0jtYeoS&Cz$ut{s5~~85CV*SwB4$taMc5$Cl))HZ%vW*vK++mA?JkODjrCItrJT?HHA()y}K0o3W^S=jKIA+uhz$w|}sW z;X;QMc{9h7!laxZS1Y9;4+YX z`!-wC>hAt4Ap=JXT|Eu0%{F!wjm7_ygNfu|&%|Ef1GP&jk|$J*d4wFK#1+cbRMWo4 zXnJQFOeFCbVk+rofUJwRy{~+ieT%(w@ryOGa|ey@|C4#N#wsSRh0L4AV{ckQjrovy z8C>Q;^OXjs6l+pAN~TiCG|n7&Ja3#(YlKvz_(Zm6YwOtAJ6(rv&T$QtkyP6{u&l

    urq6;1) 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 hv^sBC-hf%fH|bDOGoRN+122`{|Bk)!3zKY diff --git a/wasm-notebook/fonts/FiraMono-Regular.ttf b/wasm-notebook/fonts/FiraMono-Regular.ttf deleted file mode 100644 index 59e1e1a1d3b8894fcd446cdc031b6caef0fc4716..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 174632 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≥3+F=kmf3Kn4KK6d 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�jLKD1Nk$BT;k3E;mbrN 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 diff --git a/wasm-notebook/fonts/Monoid-Bold-Large-Dollar-0-1-l.ttf b/wasm-notebook/fonts/Monoid-Bold-Large-Dollar-0-1-l.ttf deleted file mode 100644 index 0369ae30f16f82b03119e18c05fb80596faf4097..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73052 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 diff --git a/wasm-notebook/fonts/Monoid-Italic-Large-Dollar-0-1-l.ttf b/wasm-notebook/fonts/Monoid-Italic-Large-Dollar-0-1-l.ttf deleted file mode 100644 index cc733e19cb2505e28cea8b3c0565652e238ce1ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95128 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%0AN$v(MQ-*ca?eu+3kw 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 Z*AX`Odv!+g2hyDkYf - - - - - - -

    You can find the readme on this page

    - - diff --git a/wasm-notebook/fonts/ionicons.ttf b/wasm-notebook/fonts/ionicons.ttf deleted file mode 100644 index c4e4632486d863337c1c73478ddb3c20726c55a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 188508 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

    8E#xmG!w{$tO5=<$!EHPzZXo}IBc1_sqA&q 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 diff --git a/wasm-notebook/index.html b/wasm-notebook/index.html deleted file mode 100644 index 355b1f9..0000000 --- a/wasm-notebook/index.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - -

    - - - \ No newline at end of file diff --git a/wasm-notebook/src/lib.rs b/wasm-notebook/src/lib.rs deleted file mode 100644 index 304ee6e..0000000 --- a/wasm-notebook/src/lib.rs +++ /dev/null @@ -1,15 +0,0 @@ -#[macro_use] -extern crate mech_wasm; -use mech_wasm::WasmCore; - -use wasm_bindgen::prelude::*; - -#[wasm_bindgen(start)] -pub fn main() -> Result<(), JsValue> { - Ok(()) -} - -#[wasm_bindgen] -pub fn new_core() -> WasmCore { - WasmCore::new(1000, 1000) -} diff --git a/wasm-notebook/website/images/logo.png b/wasm-notebook/website/images/logo.png deleted file mode 100644 index 1ab2087ebb3828f2c615db6b912871bb972c25dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12509 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 HUcLQ)s$P-W diff --git a/wasm-notebook/website/index.mec b/wasm-notebook/website/index.mec deleted file mode 100644 index dfebc3d..0000000 --- a/wasm-notebook/website/index.mec +++ /dev/null @@ -1,14 +0,0 @@ -# Mech Website - -## Homepage - -A one sentence description of the mech language - #mech-website/headline = "Mech is a language for developing data-driven, reactive systems like animations, games, and robots. It makes composing, transforming, and distributing data easy, allowing you to focus on the essential complexity of your work." - #mech-website/logo = "https://mech-lang.org/img/logo.png" - -This is where the drawing is added to the DOM - logo = [type: "img" class: "logo" contains: #mech-website/logo] - headline = [type: "div" class: "well" contains: #mech-website/headline] - container = [type: "div" class: "container" contains: [logo; headline; #robot]] - #app/main = [|root direction contains| - "mech-root" "column" [container]] \ No newline at end of file diff --git a/wasm-notebook/website/robot-drawing.mec b/wasm-notebook/website/robot-drawing.mec deleted file mode 100644 index c136fd8..0000000 --- a/wasm-notebook/website/robot-drawing.mec +++ /dev/null @@ -1,39 +0,0 @@ -# Robot Arm Drawing - -## Logic - -Set up the parameters - #x = [400; 0; 0; 0; 0; 0] - #y = [450; 0; 0; 0; 0; 0] - #angle = [#slider1{4}{3}; #slider2{4}{3}; #slider3{4}{3}] - -Calculate the robot arm link coordiantes - i = 2:6 - j = math/floor(column: i / 2) - link-length = [53; 100; 85] - #x{i} := #x{i - 1} + link-length{j} * math/sin(degrees: #angle{j}) - #y{i} := #y{i - 1} - link-length{j} * math/cos(degrees: #angle{j}) - -## Layout - -Use the linkage coordinates to define image position and rotation - #robot-arm = [|shape parameters| - "image" [x: #x{4} y: #y{4} rotation: #angle{2} image: "https://mech-lang.org/img/robotarm/link2.png"] - "image" [x: #x{2} y: #y{2} rotation: #angle{1} image: "https://mech-lang.org/img/robotarm/link1.png"] - "image" [x: #x{1} y: #y{1} + 50 rotation: 0 image: "https://mech-lang.org/img/robotarm/link0.png"] - "image" [x: #x{6} y: #y{6} rotation: #angle{3} image: "https://mech-lang.org/img/robotarm/gripper.png"]] - -Embed arm link images in canvas - #drawing = [type: "canvas" class: _ contains: [#robot-arm] parameters: [width: 800 height: 650]] - -Animation controls - #slider1 = [type: "slider" class: _ contains: _ parameters: [min: -120 max: 120 value: -45]] - #slider2 = [type: "slider" class: _ contains: _ parameters: [min: -120 max: 120 value: 60]] - #slider3 = [type: "slider" class: _ contains: _ parameters: [min: -90 max: 200 value: 170]] - -Compose animation and controls - #robot-controls = [type: "div" class: _ contains: [#slider1; #slider2; #slider3]] - #robot-animation = [type: "div" class: _ contains: [#drawing]] - -Package for attachment into webpage - #robot = [#robot-controls; #robot-animation] \ No newline at end of file diff --git a/wasm-notebook/wstest.html b/wasm-notebook/wstest.html deleted file mode 100644 index c3155ef..0000000 --- a/wasm-notebook/wstest.html +++ /dev/null @@ -1,190 +0,0 @@ - - - - - - HTML5 Chat - - - -
    - -
    -

    HTML5 Chat

    -
    - - - -
    - -
    - -
    - -

    Not connected

    -

    Users connected: 0 -

    -
      - -
      - - - -
      - - - - - - \ No newline at end of file From b4450ad616b78e4461a056dfea06c59fe0dabdc1 Mon Sep 17 00:00:00 2001 From: cmontella Date: Mon, 22 May 2023 14:23:02 -0400 Subject: [PATCH 65/84] update --- .gitmodules | 36 ---- Cargo.toml | 17 +- notebook | 1 - wasm-notebook/Cargo.toml | 21 ++ wasm-notebook/README.md | 33 +++ wasm-notebook/editor/editor.mec | 16 ++ wasm-notebook/fonts/FiraCode-Bold.ttf | Bin 0 -> 257712 bytes wasm-notebook/fonts/FiraCode-Light.ttf | Bin 0 -> 225992 bytes wasm-notebook/fonts/FiraCode-Medium.ttf | Bin 0 -> 223652 bytes wasm-notebook/fonts/FiraCode-Regular.ttf | Bin 0 -> 225332 bytes wasm-notebook/fonts/FiraCode-Retina.ttf | Bin 0 -> 226328 bytes wasm-notebook/fonts/FiraMono-Bold.ttf | Bin 0 -> 206548 bytes wasm-notebook/fonts/FiraMono-Regular.ttf | Bin 0 -> 174632 bytes .../fonts/Monoid-Bold-Large-Dollar-0-1-l.ttf | Bin 0 -> 73052 bytes .../Monoid-Italic-Large-Dollar-0-1-l.ttf | Bin 0 -> 95128 bytes .../Monoid-Regular-Large-Dollar-0-1-l.ttf | Bin 0 -> 79248 bytes .../Monoid-Retina-Large-Dollar-0-1-l.ttf | Bin 0 -> 81928 bytes wasm-notebook/fonts/Readme+License.html | 10 + wasm-notebook/fonts/ionicons.ttf | Bin 0 -> 188508 bytes wasm-notebook/index.html | 35 ++++ wasm-notebook/src/lib.rs | 15 ++ wasm-notebook/website/images/logo.png | Bin 0 -> 12509 bytes wasm-notebook/website/index.mec | 14 ++ wasm-notebook/website/robot-drawing.mec | 39 ++++ wasm-notebook/wstest.html | 190 ++++++++++++++++++ 25 files changed, 384 insertions(+), 43 deletions(-) delete mode 100644 .gitmodules delete mode 160000 notebook create mode 100644 wasm-notebook/Cargo.toml create mode 100644 wasm-notebook/README.md create mode 100644 wasm-notebook/editor/editor.mec create mode 100644 wasm-notebook/fonts/FiraCode-Bold.ttf create mode 100644 wasm-notebook/fonts/FiraCode-Light.ttf create mode 100644 wasm-notebook/fonts/FiraCode-Medium.ttf create mode 100644 wasm-notebook/fonts/FiraCode-Regular.ttf create mode 100644 wasm-notebook/fonts/FiraCode-Retina.ttf create mode 100644 wasm-notebook/fonts/FiraMono-Bold.ttf create mode 100644 wasm-notebook/fonts/FiraMono-Regular.ttf create mode 100644 wasm-notebook/fonts/Monoid-Bold-Large-Dollar-0-1-l.ttf create mode 100644 wasm-notebook/fonts/Monoid-Italic-Large-Dollar-0-1-l.ttf create mode 100644 wasm-notebook/fonts/Monoid-Regular-Large-Dollar-0-1-l.ttf create mode 100644 wasm-notebook/fonts/Monoid-Retina-Large-Dollar-0-1-l.ttf create mode 100644 wasm-notebook/fonts/Readme+License.html create mode 100644 wasm-notebook/fonts/ionicons.ttf create mode 100644 wasm-notebook/index.html create mode 100644 wasm-notebook/src/lib.rs create mode 100644 wasm-notebook/website/images/logo.png create mode 100644 wasm-notebook/website/index.mec create mode 100644 wasm-notebook/website/robot-drawing.mec create mode 100644 wasm-notebook/wstest.html diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 4915a65..0000000 --- a/.gitmodules +++ /dev/null @@ -1,36 +0,0 @@ -[submodule "assets"] - path = assets - url = https://gitlab.com/mech-lang/assets.git - branch = v0.1-beta -[submodule "examples"] - path = examples - url = https://gitlab.com/mech-lang/examples.git - branch = v0.1-beta -[submodule "docs"] - path = docs - url = https://gitlab.com/mech-lang/docs.git - branch = v0.1-beta -[submodule "core"] - path = src/core - url = https://gitlab.com/mech-lang/core.git - branch = v0.1-beta -[submodule "syntax"] - path = src/syntax - url = https://gitlab.com/mech-lang/syntax.git - branch = v0.1-beta -[submodule "program"] - path = src/program - url = https://gitlab.com/mech-lang/program.git - branch = v0.1-beta -[submodule "utilities"] - path = src/utilities - url = https://gitlab.com/mech-lang/utilities.git - branch = v0.1-beta -[submodule "wasm"] - path = src/wasm - url = https://gitlab.com/mech-lang/wasm.git - branch = v0.1-beta -[submodule "notebook"] - path = notebook - url = https://gitlab.com/mech-lang/notebook.git - branch = v0.1-beta \ No newline at end of file diff --git a/Cargo.toml b/Cargo.toml index eb7b1a9..9eee8ff 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mech" -version = "0.1.0" +version = "0.2.0" authors = ["Corey Montella "] description = "Toolchain for the Mech programming language." documentation = "http://docs.mech-lang.org" @@ -17,10 +17,10 @@ gitlab = { repository = "mech-lang/mech", branch = "main" } maintenance = { status = "actively-developed" } [dependencies] -mech-core = {path = "src/core", version = '0.1' } -mech-syntax = {path = "src/syntax", features = ["lang-server"], version = '0.1' } -mech-program = {path = "src/program", version = '0.1' } -mech-utilities = {path = "src/utilities", version = '0.1' } +mech-core = {path = "src/core" } +mech-syntax = {path = "src/syntax", features = ["lang-server"]} +mech-program = {path = "src/program"} +mech-utilities = {path = "src/utilities"} clap = "2.34.0" colored = "2.0.0" @@ -45,7 +45,12 @@ base64 = "0.13.0" [workspace] members = [ - "wasm-notebook", + "src/core", + "src/syntax", + "src/program", + "src/utilities", + "src/wasm", + "wasm-notebook" ] [build-dependencies] diff --git a/notebook b/notebook deleted file mode 160000 index 9b90468..0000000 --- a/notebook +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 9b90468c66488bfdd00e763cbd898c8cb31bd1c7 diff --git a/wasm-notebook/Cargo.toml b/wasm-notebook/Cargo.toml new file mode 100644 index 0000000..f9562ca --- /dev/null +++ b/wasm-notebook/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "mech-wasm-notebook" +version = "0.1.0" +authors = ["Corey Montella "] +description = "A notebook writing Mech in the browser" +documentation = "http://docs.mech-lang.org" +homepage = "https://mech-lang.org" +repository = "https://github.com/mech-lang/mech" +keywords = ["mech", "language", "programming", "dataflow", "runtime"] +categories = ["science::robotics", "science", "game-engines", "web-programming"] +license = "Apache-2.0" +readme = "README.md" +edition = "2021" + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +mech-wasm = {git = "https://gitlab.com/mech-lang/wasm", branch = "v0.1-beta"} + +wasm-bindgen = "0.2.83" diff --git a/wasm-notebook/README.md b/wasm-notebook/README.md new file mode 100644 index 0000000..0704f1d --- /dev/null +++ b/wasm-notebook/README.md @@ -0,0 +1,33 @@ +

      + +

      + +Mech is a language for developing **data-driven**, **reactive** systems like animations, games, and robots. It makes **composing**, **transforming**, and **distributing** data easy, allowing you to focus on the essential complexity of your project. + +You can try Mech online at [try.mech-lang.org](http://try.mech-lang.org). + +Usage and installation instructions can be found in the [documentation](https://mech-lang.org/page/learn/) or the [main Mech repository](https://github.com/mech-lang/mech). + +Read about progress on our [blog](https://mech-lang.org/blog/), and follow us on Twitter [@MechLang](https://twitter.com/MechLang). + +## Documentation + +Right now, most Mech features and syntax are undocumented. You can find some minimal documentation [here](http://docs.mech-lang.org), and also the beginning of a tutorial [here](http://docs.mech-lang.org/#/docs/tutorial.mec). + +## Build Instructions + +To build the Mech Notebook, you'll need [wasm-pack](https://github.com/rustwasm/wasm-pack), which requires Rust 1.30.0 or later. + +```bash +wasm-pack build --target web +``` + +## Project Status + +Mech is currently in the **v0.0.5 alpha** stage of development. This means that while some features work and are tested, programs are still likely to crash and produce incorrect results. We've implemented some language features, but many are not yet implemented. + +Feel free to use the language for your own satisfaction, but please don't use it for anything important. + +## License + +Apache 2.0 \ No newline at end of file diff --git a/wasm-notebook/editor/editor.mec b/wasm-notebook/editor/editor.mec new file mode 100644 index 0000000..8b3e74d --- /dev/null +++ b/wasm-notebook/editor/editor.mec @@ -0,0 +1,16 @@ +# Mech Homepage + +Messages + #messages = [|name content| + "Corey" "One" + "Rachel" "Two" + "Corey" "Three" + "Corey" "Four"] +block + name-tag >- [type: "div" class: _ content: #messages.name] + message-tag >- [type: "div" class: _ content: #messages.content] + boo >- [name-tag message-tag] + #baz = [type: "div" class: _ contains: boo] + +block + #app/main = [root: "mech-root" class: _ contains: [type: "div" class: _ contains: [#baz]]] \ No newline at end of file diff --git a/wasm-notebook/fonts/FiraCode-Bold.ttf b/wasm-notebook/fonts/FiraCode-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..6124d186345a9af5895bd074087b3e98616221e3 GIT binary patch literal 257712 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
      afXoH+AZA$ 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�KT)Hy-dy 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

      CZfLKWRk|KE^tsbl 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 z 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 diff --git a/wasm-notebook/fonts/FiraCode-Regular.ttf b/wasm-notebook/fonts/FiraCode-Regular.ttf deleted file mode 100644 index 8c367dcd55f35349b239934852a2f1db73919787..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 225332 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