From 142c6e0ef11a5dcb6941bd0c4660a059531e4ab7 Mon Sep 17 00:00:00 2001 From: harehare Date: Sat, 20 Jun 2026 20:50:24 +0900 Subject: [PATCH 1/3] feat(highlighter): expand syntax highlighting to 29+ languages Fix unwired lang-clojure/lang-toml feature flags and add YAML, Ruby, PHP, Lua, Kotlin, Scala, Make, SQL, and Dockerfile support. Several tree-sitter grammar crates were swapped for actively-maintained forks (tree-sitter-toml-ng, tree-sitter-sequel, tree-sitter-containerfile, tree-sitter-kotlin-ng) since the originals pin an incompatible tree-sitter version. Kotlin's highlight query is vendored locally since tree-sitter-kotlin-ng doesn't publish one. --- Cargo.lock | 126 ++++++++++++++++++++++++----- Cargo.toml | 34 +++++++- queries/clojure_highlights.scm | 29 +++++++ queries/kotlin_highlights.scm | 144 +++++++++++++++++++++++++++++++++ src/highlighter.rs | 99 +++++++++++++++++++++++ 5 files changed, 411 insertions(+), 21 deletions(-) create mode 100644 queries/clojure_highlights.scm create mode 100644 queries/kotlin_highlights.scm diff --git a/Cargo.lock b/Cargo.lock index c90b5d5..0dd6518 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -963,10 +963,11 @@ dependencies = [ "mq-markdown", "rstest", "terminal_size", - "tree-sitter 0.25.10", + "tree-sitter", "tree-sitter-bash", "tree-sitter-c", "tree-sitter-clojure", + "tree-sitter-containerfile", "tree-sitter-cpp", "tree-sitter-css", "tree-sitter-elixir", @@ -978,13 +979,22 @@ dependencies = [ "tree-sitter-java", "tree-sitter-javascript", "tree-sitter-json", + "tree-sitter-kotlin-ng", + "tree-sitter-lua", + "tree-sitter-make", "tree-sitter-mq", "tree-sitter-ocaml", + "tree-sitter-php", "tree-sitter-python", + "tree-sitter-ruby", "tree-sitter-rust", + "tree-sitter-scala", + "tree-sitter-sequel", "tree-sitter-swift", - "tree-sitter-toml", + "tree-sitter-toml-ng", "tree-sitter-typescript", + "tree-sitter-yaml", + "unicode-width 0.2.2", "viuer", ] @@ -1710,16 +1720,6 @@ dependencies = [ "winnow", ] -[[package]] -name = "tree-sitter" -version = "0.20.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e747b1f9b7b931ed39a548c1fae149101497de3c1fc8d9e18c62c1a66c683d3d" -dependencies = [ - "cc", - "regex", -] - [[package]] name = "tree-sitter" version = "0.25.10" @@ -1761,7 +1761,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4004884cc509449a1d78fa3e1f02b4e953d0a8065984445304795e72e885338c" dependencies = [ "cc", - "tree-sitter 0.25.10", + "tree-sitter", + "tree-sitter-language", +] + +[[package]] +name = "tree-sitter-containerfile" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1555ef425ecf06d7f65d58b3f9d3db3bb7fbd4ad135b4e7e40f194b0859ea16f" +dependencies = [ + "cc", "tree-sitter-language", ] @@ -1834,7 +1844,7 @@ dependencies = [ "regex", "streaming-iterator", "thiserror", - "tree-sitter 0.25.10", + "tree-sitter", ] [[package]] @@ -1877,12 +1887,42 @@ dependencies = [ "tree-sitter-language", ] +[[package]] +name = "tree-sitter-kotlin-ng" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e800ebbda938acfbf224f4d2c34947a31994b1295ee6e819b65226c7b51b4450" +dependencies = [ + "cc", + "tree-sitter-language", +] + [[package]] name = "tree-sitter-language" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "009994f150cc0cd50ff54917d5bc8bffe8cad10ca10d81c34da2ec421ae61782" +[[package]] +name = "tree-sitter-lua" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8daaf5f4235188a58603c39760d5fa5d4b920d36a299c934adddae757f32a10c" +dependencies = [ + "cc", + "tree-sitter-language", +] + +[[package]] +name = "tree-sitter-make" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5998dc7cbcbdab19fae8aefef982bf2d6544513d8d2e69cc44aec4c63810104" +dependencies = [ + "cc", + "tree-sitter-language", +] + [[package]] name = "tree-sitter-mq" version = "0.1.11" @@ -1903,6 +1943,16 @@ dependencies = [ "tree-sitter-language", ] +[[package]] +name = "tree-sitter-php" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c17c3ab69052c5eeaa7ff5cd972dd1bc25d1b97ee779fec391ad3b5df5592" +dependencies = [ + "cc", + "tree-sitter-language", +] + [[package]] name = "tree-sitter-python" version = "0.25.0" @@ -1913,6 +1963,16 @@ dependencies = [ "tree-sitter-language", ] +[[package]] +name = "tree-sitter-ruby" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be0484ea4ef6bb9c575b4fdabde7e31340a8d2dbc7d52b321ac83da703249f95" +dependencies = [ + "cc", + "tree-sitter-language", +] + [[package]] name = "tree-sitter-rust" version = "0.24.2" @@ -1923,6 +1983,26 @@ dependencies = [ "tree-sitter-language", ] +[[package]] +name = "tree-sitter-scala" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de5a4a7ff23a55474ce6a741d52aaeca7a82fe9421bb982b86e98c6ac8629397" +dependencies = [ + "cc", + "tree-sitter-language", +] + +[[package]] +name = "tree-sitter-sequel" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d198ad3c319c02e43c21efa1ec796b837afcb96ffaef1a40c1978fbdcec7d17" +dependencies = [ + "cc", + "tree-sitter-language", +] + [[package]] name = "tree-sitter-swift" version = "0.7.3" @@ -1934,13 +2014,13 @@ dependencies = [ ] [[package]] -name = "tree-sitter-toml" -version = "0.20.0" +name = "tree-sitter-toml-ng" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca517f578a98b23d20780247cc2688407fa81effad5b627a5a364ec3339b53e8" +checksum = "e9adc2c898ae49730e857d75be403da3f92bb81d8e37a2f918a08dd10de5ebb1" dependencies = [ "cc", - "tree-sitter 0.20.10", + "tree-sitter-language", ] [[package]] @@ -1953,6 +2033,16 @@ dependencies = [ "tree-sitter-language", ] +[[package]] +name = "tree-sitter-yaml" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53c223db85f05e34794f065454843b0668ebc15d240ada63e2b5939f43ce7c97" +dependencies = [ + "cc", + "tree-sitter-language", +] + [[package]] name = "unicode-id" version = "0.3.6" diff --git a/Cargo.toml b/Cargo.toml index f8e328b..d430c52 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,6 +27,7 @@ all-languages = [ "lang-clojure", "lang-cpp", "lang-css", + "lang-dockerfile", "lang-elm", "lang-go", "lang-haskell", @@ -34,21 +35,30 @@ all-languages = [ "lang-java", "lang-javascript", "lang-json", + "lang-kotlin", + "lang-lua", + "lang-make", "lang-mq", "lang-ocaml", + "lang-php", "lang-python", + "lang-ruby", "lang-rust", + "lang-scala", + "lang-sql", "lang-swift", "lang-toml", "lang-typescript", + "lang-yaml", "lang-elixir", ] -default = ["lang-rust", "lang-javascript", "lang-typescript", "lang-python", "lang-json", "lang-bash", "lang-html", "lang-css", "lang-mq", "lang-elixir"] +default = ["lang-rust", "lang-javascript", "lang-typescript", "lang-python", "lang-json", "lang-bash", "lang-html", "lang-css", "lang-mq", "lang-elixir", "lang-yaml", "lang-toml", "lang-ruby", "lang-sql"] lang-bash = ["dep:tree-sitter-bash"] lang-c = ["dep:tree-sitter-c"] lang-clojure = ["dep:tree-sitter-clojure"] lang-cpp = ["dep:tree-sitter-cpp"] lang-css = ["dep:tree-sitter-css"] +lang-dockerfile = ["dep:tree-sitter-containerfile"] lang-elixir = ["dep:tree-sitter-elixir"] lang-elm = ["dep:tree-sitter-elm"] lang-go = ["dep:tree-sitter-go"] @@ -57,13 +67,21 @@ lang-html = ["dep:tree-sitter-html"] lang-java = ["dep:tree-sitter-java"] lang-javascript = ["dep:tree-sitter-javascript"] lang-json = ["dep:tree-sitter-json"] +lang-kotlin = ["dep:tree-sitter-kotlin-ng"] +lang-lua = ["dep:tree-sitter-lua"] +lang-make = ["dep:tree-sitter-make"] lang-mq = ["dep:tree-sitter-mq"] lang-ocaml = ["dep:tree-sitter-ocaml"] +lang-php = ["dep:tree-sitter-php"] lang-python = ["dep:tree-sitter-python"] +lang-ruby = ["dep:tree-sitter-ruby"] lang-rust = ["dep:tree-sitter-rust"] +lang-scala = ["dep:tree-sitter-scala"] +lang-sql = ["dep:tree-sitter-sequel"] lang-swift = ["dep:tree-sitter-swift"] -lang-toml = ["dep:tree-sitter-toml"] +lang-toml = ["dep:tree-sitter-toml-ng"] lang-typescript = ["dep:tree-sitter-typescript"] +lang-yaml = ["dep:tree-sitter-yaml"] [dependencies] clap = {version = "4.6.1", features = ["derive"]} @@ -77,6 +95,7 @@ tree-sitter = "0.25.10" tree-sitter-bash = {version = "0.25", optional = true} tree-sitter-c = {version = "0.24", optional = true} tree-sitter-clojure = {version = "0.1.0", optional = true} +tree-sitter-containerfile = {version = "0.8", optional = true} tree-sitter-cpp = {version = "0.23.4", optional = true} tree-sitter-css = {version = "0.25", optional = true} tree-sitter-elixir = {version = "0.3.5", optional = true} @@ -88,13 +107,22 @@ tree-sitter-html = {version = "0.23", optional = true} tree-sitter-java = {version = "0.23", optional = true} tree-sitter-javascript = {version = "0.25", optional = true} tree-sitter-json = {version = "0.24", optional = true} +tree-sitter-kotlin-ng = {version = "1.1", optional = true} +tree-sitter-lua = {version = "0.5", optional = true} +tree-sitter-make = {version = "1.1", optional = true} tree-sitter-mq = {version = "0.1.10", optional = true} tree-sitter-ocaml = {version = "0.25.0", optional = true} +tree-sitter-php = {version = "0.24", optional = true} tree-sitter-python = {version = "0.25.0", optional = true} +tree-sitter-ruby = {version = "0.23", optional = true} tree-sitter-rust = {version = "0.24", optional = true} +tree-sitter-scala = {version = "0.26", optional = true} +tree-sitter-sequel = {version = "0.3", optional = true} tree-sitter-swift = {version = "0.7.3", optional = true} -tree-sitter-toml = {version = "0.20.0", optional = true} +tree-sitter-toml-ng = {version = "0.7", optional = true} tree-sitter-typescript = {version = "0.23.2", optional = true} +tree-sitter-yaml = {version = "0.7", optional = true} +unicode-width = "0.2.2" viuer = {version = "0.11"} [dev-dependencies] diff --git a/queries/clojure_highlights.scm b/queries/clojure_highlights.scm new file mode 100644 index 0000000..d27587a --- /dev/null +++ b/queries/clojure_highlights.scm @@ -0,0 +1,29 @@ +;; Literals + +(num_lit) @number + +[ + (char_lit) + (str_lit) +] @string + +[ + (bool_lit) + (nil_lit) +] @constant.builtin + +(kwd_lit) @constant + +;; Comments + +(comment) @comment + +;; Treat quasiquotation as operators for the purpose of highlighting. + +[ + "'" + "`" + "~" + "@" + "~@" +] @operator diff --git a/queries/kotlin_highlights.scm b/queries/kotlin_highlights.scm new file mode 100644 index 0000000..750c4af --- /dev/null +++ b/queries/kotlin_highlights.scm @@ -0,0 +1,144 @@ +; Custom highlights query for the tree-sitter-kotlin-ng grammar +; (node names differ from the older fwcd/tree-sitter-kotlin grammar, +; so this cannot be reused as-is from upstream). + +[ + (line_comment) + (block_comment) +] @comment + +(string_content) @string +(character_literal) @string +(number_literal) @number +(float_literal) @number + +(this_expression) @variable.builtin +(super_expression) @variable.builtin + +(class_declaration name: (identifier) @type) +(object_declaration name: (identifier) @type) +(user_type (identifier) @type) + +(function_declaration name: (identifier) @function) + +(parameter (identifier) @variable.parameter) + +(import (identifier) @namespace) +(import (qualified_identifier) @namespace) +(package_header (qualified_identifier) @namespace) + +(annotation "@" @attribute) + +[ + "fun" + "val" + "var" + "class" + "object" + "interface" + "enum" + "companion" + "constructor" + "init" + "typealias" + "package" + "import" + "return" + "throw" + "if" + "else" + "when" + "for" + "do" + "while" + "try" + "catch" + "finally" + "is" + "in" + "!in" + "!is" + "as" + "as?" + "by" + "out" + "public" + "private" + "protected" + "internal" + "open" + "final" + "abstract" + "override" + "sealed" + "data" + "inline" + "noinline" + "crossinline" + "suspend" + "operator" + "infix" + "tailrec" + "vararg" + "lateinit" + "const" + "external" + "annotation" + "actual" + "expect" + "value" + "inner" + "get" + "set" + "where" + "dynamic" +] @keyword + +[ + "(" + ")" + "[" + "]" + "{" + "}" +] @punctuation.bracket + +[ + "." + "," + ";" + ":" + "::" +] @punctuation.delimiter + +[ + "=" + "==" + "===" + "!=" + "!==" + "<" + "<=" + ">" + ">=" + "&&" + "||" + "!" + "+" + "-" + "*" + "/" + "%" + "+=" + "-=" + "*=" + "/=" + "%=" + "++" + "--" + "->" + "?." + "?:" + ".." + "..<" +] @operator diff --git a/src/highlighter.rs b/src/highlighter.rs index 884e67e..e29ff30 100644 --- a/src/highlighter.rs +++ b/src/highlighter.rs @@ -124,6 +124,61 @@ impl SyntaxHighlighter { tree_sitter_elixir::LANGUAGE.into(), tree_sitter_elixir::HIGHLIGHTS_QUERY, ), + #[cfg(feature = "lang-toml")] + "toml" => ( + tree_sitter_toml_ng::LANGUAGE.into(), + tree_sitter_toml_ng::HIGHLIGHTS_QUERY, + ), + #[cfg(feature = "lang-clojure")] + "clojure" | "clj" => ( + tree_sitter_clojure::LANGUAGE.into(), + include_str!("../queries/clojure_highlights.scm"), + ), + #[cfg(feature = "lang-yaml")] + "yaml" | "yml" => ( + tree_sitter_yaml::LANGUAGE.into(), + tree_sitter_yaml::HIGHLIGHTS_QUERY, + ), + #[cfg(feature = "lang-ruby")] + "ruby" | "rb" => ( + tree_sitter_ruby::LANGUAGE.into(), + tree_sitter_ruby::HIGHLIGHTS_QUERY, + ), + #[cfg(feature = "lang-php")] + "php" => ( + tree_sitter_php::LANGUAGE_PHP.into(), + tree_sitter_php::HIGHLIGHTS_QUERY, + ), + #[cfg(feature = "lang-lua")] + "lua" => ( + tree_sitter_lua::LANGUAGE.into(), + tree_sitter_lua::HIGHLIGHTS_QUERY, + ), + #[cfg(feature = "lang-kotlin")] + "kotlin" | "kt" | "kts" => ( + tree_sitter_kotlin_ng::LANGUAGE.into(), + include_str!("../queries/kotlin_highlights.scm"), + ), + #[cfg(feature = "lang-scala")] + "scala" => ( + tree_sitter_scala::LANGUAGE.into(), + tree_sitter_scala::HIGHLIGHTS_QUERY, + ), + #[cfg(feature = "lang-make")] + "make" | "makefile" => ( + tree_sitter_make::LANGUAGE.into(), + tree_sitter_make::HIGHLIGHTS_QUERY, + ), + #[cfg(feature = "lang-sql")] + "sql" => ( + tree_sitter_sequel::LANGUAGE.into(), + tree_sitter_sequel::HIGHLIGHTS_QUERY, + ), + #[cfg(feature = "lang-dockerfile")] + "dockerfile" | "docker" => ( + tree_sitter_containerfile::LANGUAGE.into(), + tree_sitter_containerfile::HIGHLIGHTS_QUERY, + ), _ => return None, }; @@ -303,6 +358,50 @@ mod tests { #[cfg_attr(feature = "lang-mq", case::mq("mq", r#"fn(): "Hello, world!""#))] #[cfg_attr(feature = "lang-mq", case::bool("mq", r#"fn(): true"#))] #[cfg_attr(feature = "lang-mq", case::number("mq", r#"fn(): 42"#))] + #[cfg_attr( + feature = "lang-toml", + case::toml("toml", "[package]\nname = \"hello\"\nversion = \"1.0.0\"") + )] + #[cfg_attr( + feature = "lang-clojure", + case::clojure("clojure", r#"(defn main [] (println "Hello, world!"))"#) + )] + #[cfg_attr( + feature = "lang-yaml", + case::yaml("yaml", "name: hello\nversion: 1.0.0") + )] + #[cfg_attr( + feature = "lang-ruby", + case::ruby("ruby", r#"def main; puts "Hello, world!"; end"#) + )] + #[cfg_attr( + feature = "lang-php", + case::php("php", r#" Date: Sat, 20 Jun 2026 20:50:56 +0900 Subject: [PATCH 2/3] feat(renderer): render mermaid diagrams and box callouts/code blocks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add a best-effort ASCII-art renderer for simple mermaid graph/flowchart blocks (nodes, shapes, labeled edges), with a safe layered layout that never stalls on cycles and falls back to a plain code block for unsupported diagram types. - Render GitHub-style callouts and fenced code blocks as closed, word-wrapped boxes instead of open dashes/backticks. - Replace the circled-digit heading markers (โ‘ โ‘กโ‘ข) with a repeated โ–ถ marker, since circled digits render illegibly small in many monospace fonts. - Fix width/alignment bugs across headings, tables, and callouts: box and padding math used raw char counts, which undercounts emoji (๐Ÿ’กโ—๐Ÿ”ฅ) and CJK text and gets thrown off by embedded OSC 8 hyperlink escapes. Introduce a visible_width() helper (backed by unicode-width) used everywhere boxes are drawn. - Fix the CLI's -H/--header-highlight flag, which had inverted semantics versus its own help text and the library default, so full-width header highlighting was silently off unless passed. --- src/lib.rs | 5 +- src/main.rs | 6 +- src/mermaid.rs | 649 ++++++++++++++++++++++++++++++++++++++++++++++++ src/renderer.rs | 394 +++++++++++++++++++---------- 4 files changed, 916 insertions(+), 138 deletions(-) create mode 100644 src/mermaid.rs diff --git a/src/lib.rs b/src/lib.rs index 3a37ead..0d77b5b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -15,7 +15,10 @@ //! ``` mod highlighter; +mod mermaid; mod renderer; pub use highlighter::SyntaxHighlighter; -pub use renderer::{render_markdown, render_markdown_to_string, render_markdown_with_config, RenderConfig}; +pub use renderer::{ + RenderConfig, render_markdown, render_markdown_to_string, render_markdown_with_config, +}; diff --git a/src/main.rs b/src/main.rs index 141620a..52bcebb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -14,8 +14,8 @@ use std::path::PathBuf; #[command(about = "A CLI markdown viewer with rich text rendering")] pub struct Args { /// Disable full-width background highlighting for headers - #[arg(short = 'H', long = "header-highlight")] - header_highlight: bool, + #[arg(short = 'H', long = "no-header-highlight")] + no_header_highlight: bool, /// Markdown file to view file: Option, @@ -37,7 +37,7 @@ fn main() -> Result<()> { let markdown: Markdown = content.parse().map_err(|e| miette::miette!("{}", e))?; let config = RenderConfig { - header_full_width_highlight: args.header_highlight, + header_full_width_highlight: !args.no_header_highlight, }; let stdout = io::stdout(); diff --git a/src/mermaid.rs b/src/mermaid.rs new file mode 100644 index 0000000..a988a6a --- /dev/null +++ b/src/mermaid.rs @@ -0,0 +1,649 @@ +//! Best-effort ASCII-art rendering of simple mermaid flowcharts. +//! +//! This only understands a small subset of mermaid `graph`/`flowchart` syntax +//! (nodes, shapes, and edges with optional labels). Other diagram types +//! (sequenceDiagram, classDiagram, gantt, ...) and advanced flowchart syntax +//! (subgraph styling, click handlers, complex multi-label edges, ...) are not +//! laid out; callers should fall back to rendering the raw source when `render` +//! returns `None`. +use crate::renderer::visible_width; +use colored::*; +use std::collections::{HashMap, VecDeque}; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] +enum Direction { + #[default] + TopDown, + LeftRight, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +enum Shape { + Rectangle, + Rounded, + Diamond, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +enum EdgeStyle { + Solid, + Dotted, + Thick, +} + +#[derive(Debug, Clone)] +struct MNode { + label: String, + shape: Shape, +} + +#[derive(Debug, Clone)] +struct MEdge { + from: String, + to: String, + label: Option, + style: EdgeStyle, +} + +#[derive(Debug, Default)] +struct MermaidGraph { + direction: Direction, + order: Vec, + nodes: HashMap, + edges: Vec, +} + +const ARROWS: &[(&str, EdgeStyle)] = &[ + ("-.->", EdgeStyle::Dotted), + ("-.-", EdgeStyle::Dotted), + ("==>", EdgeStyle::Thick), + ("===", EdgeStyle::Thick), + ("-->", EdgeStyle::Solid), + ("---", EdgeStyle::Solid), + ("--x", EdgeStyle::Solid), + ("--o", EdgeStyle::Solid), +]; + +/// Render mermaid source as ASCII art, returning `None` for unsupported +/// diagram types or syntax this module can't make sense of. +pub fn render(source: &str, max_width: usize) -> Option { + let graph = parse(source)?; + if graph.order.is_empty() { + return None; + } + Some(layout(&graph, max_width)) +} + +fn parse(source: &str) -> Option { + let mut lines = source.lines().map(str::trim).filter(|l| !l.is_empty()); + + let header = lines.next()?; + let mut header_parts = header.split_whitespace(); + let kind = header_parts.next()?.to_lowercase(); + if kind != "graph" && kind != "flowchart" { + return None; + } + let direction = match header_parts.next().map(str::to_uppercase).as_deref() { + Some("LR") | Some("RL") => Direction::LeftRight, + _ => Direction::TopDown, + }; + + let mut graph = MermaidGraph { + direction, + ..Default::default() + }; + + for line in lines { + if line.starts_with("%%") + || line == "end" + || line.starts_with("subgraph") + || line.starts_with("classDef") + || line.starts_with("class ") + || line.starts_with("style ") + || line.starts_with("click ") + || line.starts_with("linkStyle") + { + continue; + } + parse_line(line, &mut graph); + } + + Some(graph) +} + +fn parse_line(line: &str, graph: &mut MermaidGraph) { + let mut rest = line; + let mut pending_from: Option = None; + + loop { + let found = ARROWS + .iter() + .filter_map(|(pat, style)| rest.find(pat).map(|pos| (pos, *pat, *style))) + .min_by_key(|(pos, pat, _)| (*pos, std::cmp::Reverse(pat.len()))); + + let Some((pos, pat, style)) = found else { + let text = rest.trim(); + if !text.is_empty() { + let id = register_node(graph, text); + if let Some(from) = pending_from.take() { + graph.edges.push(MEdge { + from, + to: id, + label: None, + style: EdgeStyle::Solid, + }); + } + } + break; + }; + + let before = rest[..pos].trim(); + let from_id = if let Some(from) = pending_from.take() { + from + } else { + register_node(graph, before) + }; + + let mut after = &rest[pos + pat.len()..]; + let mut label = None; + let after_trimmed = after.trim_start(); + if after_trimmed.starts_with('|') + && let Some(end) = after_trimmed[1..].find('|') + { + label = Some(after_trimmed[1..1 + end].trim().to_string()); + after = &after_trimmed[1 + end + 1..]; + } + + let next_arrow_pos = ARROWS.iter().filter_map(|(p, _)| after.find(p)).min(); + + let node_text = match next_arrow_pos { + Some(p) => after[..p].trim(), + None => after.trim(), + }; + let to_id = register_node(graph, node_text); + + graph.edges.push(MEdge { + from: from_id, + to: to_id.clone(), + label, + style, + }); + + if next_arrow_pos.is_some() { + pending_from = Some(to_id); + rest = after; + } else { + break; + } + } +} + +/// Parse a single node token like `A`, `A[Label]`, `A(Label)`, `A((Label))`, +/// `A{Label}`, registering (or updating) it in the graph and returning its id. +fn register_node(graph: &mut MermaidGraph, text: &str) -> String { + let text = text.trim(); + let id_len = text + .chars() + .take_while(|c| c.is_alphanumeric() || *c == '_') + .count(); + let id: String = text.chars().take(id_len).collect(); + let id = if id.is_empty() { text.to_string() } else { id }; + let remainder = text[id_len.min(text.len())..].trim(); + + let (shape, label) = if remainder.is_empty() { + (Shape::Rectangle, None) + } else if let Some(inner) = strip_pair(remainder, "((", "))") { + (Shape::Rounded, Some(inner)) + } else if let Some(inner) = strip_pair(remainder, "([", "])") { + (Shape::Rounded, Some(inner)) + } else if let Some(inner) = strip_pair(remainder, "(", ")") { + (Shape::Rounded, Some(inner)) + } else if let Some(inner) = strip_pair(remainder, "{", "}") { + (Shape::Diamond, Some(inner)) + } else if let Some(inner) = strip_pair(remainder, "[", "]") { + (Shape::Rectangle, Some(inner)) + } else if let Some(inner) = strip_pair(remainder, ">", "]") { + (Shape::Rectangle, Some(inner)) + } else { + (Shape::Rectangle, Some(remainder.to_string())) + }; + + let label = label + .map(|l| l.trim().trim_matches('"').to_string()) + .unwrap_or_else(|| id.clone()); + + if !graph.order.iter().any(|existing| existing == &id) { + graph.order.push(id.clone()); + } + graph + .nodes + .entry(id.clone()) + .and_modify(|n| { + // Prefer a richer label/shape over a bare id-only reference. + if label != id { + n.label = label.clone(); + n.shape = shape; + } + }) + .or_insert(MNode { label, shape }); + + id +} + +fn strip_pair(text: &str, open: &str, close: &str) -> Option { + if text.starts_with(open) && text.ends_with(close) && text.len() >= open.len() + close.len() { + Some(text[open.len()..text.len() - close.len()].to_string()) + } else { + None + } +} + +fn box_chars(shape: Shape) -> (char, char, char, char, char, char) { + match shape { + Shape::Rectangle => ('โ”Œ', 'โ”', 'โ””', 'โ”˜', 'โ”€', 'โ”‚'), + Shape::Rounded => ('โ•ญ', 'โ•ฎ', 'โ•ฐ', 'โ•ฏ', 'โ”€', 'โ”‚'), + Shape::Diamond => ('โ•”', 'โ•—', 'โ•š', 'โ•', 'โ•', 'โ•‘'), + } +} + +fn shape_color(s: &str, shape: Shape) -> ColoredString { + match shape { + Shape::Rectangle => s.cyan(), + Shape::Rounded => s.green(), + Shape::Diamond => s.yellow(), + } +} + +/// Render a single node as a 3-line box, returning the lines and their +/// (unstyled) display width. +fn render_box(node: &MNode) -> (Vec, usize) { + let (tl, tr, bl, br, h, v) = box_chars(node.shape); + let width = visible_width(&node.label) + 2; + let top = format!("{}{}{}", tl, h.to_string().repeat(width), tr); + let bottom = format!("{}{}{}", bl, h.to_string().repeat(width), br); + let total_width = width + 2; + let vbar = shape_color(&v.to_string(), node.shape).to_string(); + ( + vec![ + shape_color(&top, node.shape).to_string(), + format!("{} {} {}", vbar, node.label, vbar), + shape_color(&bottom, node.shape).to_string(), + ], + total_width, + ) +} + +fn arrow_label(label: &Option) -> String { + label.clone().unwrap_or_default() +} + +fn edge_style_arrow(style: EdgeStyle, horizontal: bool) -> &'static str { + match (style, horizontal) { + (EdgeStyle::Solid, true) => "โ”€โ”€โ–ถ", + (EdgeStyle::Dotted, true) => "โ”„โ”„โ–ถ", + (EdgeStyle::Thick, true) => "โ•โ•โ–ถ", + (EdgeStyle::Solid, false) => "โ”‚", + (EdgeStyle::Dotted, false) => "โ”Š", + (EdgeStyle::Thick, false) => "โ•‘", + } +} + +fn rank_of(graph: &MermaidGraph) -> HashMap { + let mut indegree: HashMap<&str, usize> = graph.order.iter().map(|n| (n.as_str(), 0)).collect(); + for edge in &graph.edges { + if let Some(d) = indegree.get_mut(edge.to.as_str()) { + *d += 1; + } + } + + let mut remaining = indegree.clone(); + let mut rank: HashMap = HashMap::new(); + // Tracks nodes that have been assigned a final rank and enqueued exactly + // once. Edges pointing back into a `settled` node are cycle back-edges; + // they're ignored for layering so Kahn's algorithm can never stall or + // re-enqueue the same node forever. + let mut settled: std::collections::HashSet = std::collections::HashSet::new(); + let mut queue: VecDeque = VecDeque::new(); + + for id in &graph.order { + if indegree[id.as_str()] == 0 { + rank.insert(id.clone(), 0); + settled.insert(id.clone()); + queue.push_back(id.clone()); + } + } + + loop { + while let Some(id) = queue.pop_front() { + let r = rank[&id]; + for edge in graph.edges.iter().filter(|e| e.from == id) { + if settled.contains(&edge.to) { + continue; + } + let entry = rank.entry(edge.to.clone()).or_insert(0); + if r + 1 > *entry { + *entry = r + 1; + } + if let Some(d) = remaining.get_mut(edge.to.as_str()) { + *d = d.saturating_sub(1); + if *d == 0 { + settled.insert(edge.to.clone()); + queue.push_back(edge.to.clone()); + } + } + } + } + + // Anything left unsettled is part of a cycle: every remaining node + // still has an unsettled predecessor. Break the deadlock by ranking + // the next such node from whichever predecessors are already + // settled (ignoring the back-edge), then resume. + let next = graph.order.iter().find(|id| !settled.contains(id.as_str())); + let Some(next) = next else { break }; + + let predecessor_rank = graph + .edges + .iter() + .filter(|e| &e.to == next && settled.contains(&e.from)) + .filter_map(|e| rank.get(&e.from)) + .max() + .copied(); + let r = predecessor_rank.map(|p| p + 1).unwrap_or(0); + rank.insert(next.clone(), r); + settled.insert(next.clone()); + queue.push_back(next.clone()); + } + + rank +} + +fn simple_chain(graph: &MermaidGraph) -> Option> { + if graph.order.is_empty() || graph.edges.len() != graph.order.len().saturating_sub(1) { + return None; + } + let mut outdeg: HashMap<&str, usize> = HashMap::new(); + let mut indeg: HashMap<&str, usize> = HashMap::new(); + for edge in &graph.edges { + *outdeg.entry(edge.from.as_str()).or_insert(0) += 1; + *indeg.entry(edge.to.as_str()).or_insert(0) += 1; + } + if outdeg.values().any(|&d| d > 1) || indeg.values().any(|&d| d > 1) { + return None; + } + + let start = graph + .order + .iter() + .find(|id| indeg.get(id.as_str()).copied().unwrap_or(0) == 0)?; + + let mut chain = vec![start.clone()]; + let mut current = start.clone(); + let next_of: HashMap<&str, &str> = graph + .edges + .iter() + .map(|e| (e.from.as_str(), e.to.as_str())) + .collect(); + while let Some(next) = next_of.get(current.as_str()) { + chain.push(next.to_string()); + current = next.to_string(); + if chain.len() > graph.order.len() { + return None; // cycle guard + } + } + + if chain.len() == graph.order.len() { + Some(chain) + } else { + None + } +} + +fn edge_between<'a>(graph: &'a MermaidGraph, from: &str, to: &str) -> Option<&'a MEdge> { + graph.edges.iter().find(|e| e.from == from && e.to == to) +} + +fn layout(graph: &MermaidGraph, max_width: usize) -> String { + let mut out = String::new(); + + if graph.direction == Direction::LeftRight + && let Some(chain) = simple_chain(graph) + { + render_horizontal_chain(graph, &chain, max_width, &mut out); + return out; + } + + let rank = rank_of(graph); + let max_rank = rank.values().copied().max().unwrap_or(0); + let mut ranks: Vec> = vec![Vec::new(); max_rank + 1]; + for id in &graph.order { + ranks[rank[id]].push(id.clone()); + } + + let mut rendered_edges = vec![false; graph.edges.len()]; + + for (r, row) in ranks.iter().enumerate() { + render_row(graph, row, &mut out); + + if r + 1 >= ranks.len() { + continue; + } + let next = &ranks[r + 1]; + let edge_indices: Vec = graph + .edges + .iter() + .enumerate() + .filter(|(_, e)| row.contains(&e.from) && next.contains(&e.to)) + .map(|(i, _)| i) + .collect(); + for &i in &edge_indices { + rendered_edges[i] = true; + } + + if row.len() == 1 && next.len() == 1 && edge_indices.len() == 1 { + let edge = &graph.edges[edge_indices[0]]; + let label = arrow_label(&edge.label); + let width = box_display_width(&graph.nodes[&row[0]]); + let pad = width / 2; + out.push_str(&" ".repeat(pad)); + out.push_str(edge_style_arrow(edge.style, false)); + out.push('\n'); + if !label.is_empty() { + out.push_str(&" ".repeat(pad.saturating_sub(visible_width(&label) / 2))); + out.push_str(&label.italic().to_string()); + out.push('\n'); + } + out.push_str(&" ".repeat(pad)); + out.push('โ–ผ'); + out.push('\n'); + } else if !edge_indices.is_empty() { + for &i in &edge_indices { + render_edge_line(&mut out, graph, &graph.edges[i]); + } + out.push('\n'); + } + } + + let leftover: Vec = (0..graph.edges.len()) + .filter(|&i| !rendered_edges[i]) + .collect(); + if !leftover.is_empty() { + out.push_str(&"(other connections)\n".bright_black().to_string()); + for i in leftover { + render_edge_line(&mut out, graph, &graph.edges[i]); + } + } + + out +} + +fn render_edge_line(out: &mut String, graph: &MermaidGraph, edge: &MEdge) { + let from_label = &graph.nodes[&edge.from].label; + let to_label = &graph.nodes[&edge.to].label; + let arrow = edge_style_arrow(edge.style, true); + let label = arrow_label(&edge.label); + if label.is_empty() { + out.push_str(&format!( + " {} {} {}\n", + from_label.bright_black(), + arrow.bright_black(), + to_label.bright_black() + )); + } else { + out.push_str(&format!( + " {} {}[{}]{} {}\n", + from_label.bright_black(), + arrow.bright_black(), + label.italic(), + arrow.bright_black(), + to_label.bright_black() + )); + } +} + +fn box_display_width(node: &MNode) -> usize { + visible_width(&node.label) + 4 +} + +fn render_row(graph: &MermaidGraph, row: &[String], out: &mut String) { + if row.is_empty() { + return; + } + let boxes: Vec> = row + .iter() + .map(|id| render_box(&graph.nodes[id]).0) + .collect(); + + for line_idx in 0..3 { + let mut line = String::new(); + for (i, b) in boxes.iter().enumerate() { + if i > 0 { + line.push_str(" "); + } + line.push_str(&b[line_idx]); + } + out.push_str(&line); + out.push('\n'); + } +} + +fn render_horizontal_chain( + graph: &MermaidGraph, + chain: &[String], + max_width: usize, + out: &mut String, +) { + let mut lines = vec![String::new(), String::new(), String::new()]; + let mut current_width = 0usize; + + for (i, id) in chain.iter().enumerate() { + let (b, w) = render_box(&graph.nodes[id]); + + let mut segment_width = w; + let mut connector: Option<(String, usize)> = None; + if i > 0 { + let prev = &chain[i - 1]; + if let Some(edge) = edge_between(graph, prev, id) { + let arrow = edge_style_arrow(edge.style, true); + let label = arrow_label(&edge.label); + let text = if label.is_empty() { + format!(" {} ", arrow) + } else { + format!(" {}[{}] ", arrow, label) + }; + segment_width += visible_width(&text); + connector = Some((text, w)); + } + } + + if current_width > 0 && current_width + segment_width > max_width { + for l in lines.iter() { + out.push_str(l); + out.push('\n'); + } + out.push('\n'); + lines = vec![String::new(), String::new(), String::new()]; + current_width = 0; + } + + if let Some((text, _)) = connector { + let text_width = visible_width(&text); + lines[1].push_str(&text); + lines[0].push_str(&" ".repeat(text_width)); + lines[2].push_str(&" ".repeat(text_width)); + current_width += text_width; + } + + for (idx, l) in b.iter().enumerate() { + lines[idx].push_str(l); + } + current_width += w; + } + + for l in lines { + out.push_str(&l); + out.push('\n'); + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_render_simple_chain_td() { + let result = render("graph TD\nA-->B-->C", 80).unwrap(); + assert!(result.contains('A')); + assert!(result.contains('B')); + assert!(result.contains('C')); + assert!(result.contains('โ–ผ')); + } + + #[test] + fn test_render_simple_chain_lr() { + let result = render("graph LR\nA-->B-->C", 80).unwrap(); + assert!(result.contains('A')); + assert!(result.contains("โ”€โ”€โ–ถ")); + } + + #[test] + fn test_render_labeled_edge() { + let result = render("graph TD\nA-->|yes|B", 80).unwrap(); + assert!(result.contains("yes")); + } + + #[test] + fn test_render_node_shapes_and_labels() { + let result = render("graph TD\nA[Start]-->B{Decision}-->C(End)", 80).unwrap(); + assert!(result.contains("Start")); + assert!(result.contains("Decision")); + assert!(result.contains("End")); + } + + #[test] + fn test_render_branching_falls_back_to_list() { + let result = render("graph TD\nA-->B\nA-->C", 80).unwrap(); + assert!(result.contains('B')); + assert!(result.contains('C')); + } + + #[test] + fn test_render_graph_with_cycle_terminates_and_keeps_all_edges() { + // A regression test for a deadlock in the rank-layering algorithm: + // the back-edge D-->B previously caused Kahn's algorithm to stall + // forever once a node was re-queued infinitely. + let result = render("graph TD\nA-->B\nB-->|Yes|C\nB-->|No|D\nD-->B\nC-->E", 80).unwrap(); + for label in ["A", "B", "C", "D", "E"] { + assert!(result.contains(label), "missing node {label}"); + } + } + + #[test] + fn test_unsupported_diagram_returns_none() { + assert!(render("sequenceDiagram\nAlice->>Bob: Hello", 80).is_none()); + } + + #[test] + fn test_empty_returns_none() { + assert!(render("", 80).is_none()); + } +} diff --git a/src/renderer.rs b/src/renderer.rs index 9b7e758..70a08f4 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -5,6 +5,7 @@ use std::io::{self, Write}; use std::path::Path; use std::sync::LazyLock; use terminal_size::{Height, Width, terminal_size}; +use unicode_width::UnicodeWidthStr; /// Configuration for rendering markdown #[derive(Debug, Clone)] @@ -21,9 +22,6 @@ impl Default for RenderConfig { } } -/// Unicode header symbols (โ‘ โ‘กโ‘ขโ‘ฃโ‘คโ‘ฅ) -const HEADER_SYMBOLS: &[&str] = &["โ‘ ", "โ‘ก", "โ‘ข", "โ‘ฃ", "โ‘ค", "โ‘ฅ"]; - /// Unicode bullet symbols for lists const LIST_BULLETS: &[&str] = &["โ—", "โ—‹", "โ—†", "โ—‡"]; @@ -173,6 +171,133 @@ pub fn render_markdown_to_string(markdown: &Markdown) -> io::Result { String::from_utf8(output).map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e)) } +/// Visible column width of a string, ignoring ANSI escape sequences +/// (SGR color codes and OSC 8 hyperlinks) so that box borders and wrapping +/// stay aligned even when the content contains colored or clickable text. +/// Visible runs are measured with their real terminal column width (not a +/// raw `char` count), so wide CJK text and emoji - including multi-codepoint +/// sequences like an emoji + variation selector - line up correctly too. +pub(crate) fn visible_width(s: &str) -> usize { + let mut width = 0; + let mut run = String::new(); + let mut chars = s.chars().peekable(); + while let Some(c) = chars.next() { + if c == '\x1b' { + width += UnicodeWidthStr::width(run.as_str()); + run.clear(); + match chars.peek() { + Some('[') => { + chars.next(); + for c2 in chars.by_ref() { + if c2.is_ascii_alphabetic() { + break; + } + } + } + Some(']') => { + chars.next(); + while let Some(c2) = chars.next() { + if c2 == '\x07' { + break; + } + if c2 == '\x1b' && chars.peek() == Some(&'\\') { + chars.next(); + break; + } + } + } + _ => {} + } + continue; + } + run.push(c); + } + width += UnicodeWidthStr::width(run.as_str()); + width +} + +/// Greedily word-wrap `s` so each line's visible width fits within `width` +/// columns (ANSI escapes don't count toward the width). +fn wrap_visible(s: &str, width: usize) -> Vec { + if width == 0 || s.trim().is_empty() { + return vec![s.to_string()]; + } + let mut lines = Vec::new(); + let mut current = String::new(); + let mut current_width = 0; + + for word in s.split(' ').filter(|w| !w.is_empty()) { + let word_width = visible_width(word); + if current.is_empty() { + current = word.to_string(); + current_width = word_width; + } else if current_width + 1 + word_width <= width { + current.push(' '); + current.push_str(word); + current_width += 1 + word_width; + } else { + lines.push(current); + current = word.to_string(); + current_width = word_width; + } + } + if !current.is_empty() { + lines.push(current); + } + if lines.is_empty() { + lines.push(String::new()); + } + lines +} + +/// Render `lines` inside a bordered box. Lines are never wrapped (so +/// syntax-highlighted code keeps its original structure); a line wider than +/// the box just overflows past the right border instead of being cut. +fn box_inner_width(header_width: usize) -> usize { + WIDTH.saturating_sub(4).max(header_width + 2) +} + +fn render_boxed_lines( + writer: &mut W, + header: Option<&str>, + color: colored::Color, + lines: &[String], +) -> io::Result<()> { + let header_width = header.map(visible_width).unwrap_or(0); + let inner_width = box_inner_width(header_width); + let border = "โ”€".repeat(inner_width + 2); + + let top = match header { + Some(h) if !h.is_empty() => format!( + "โ”Œโ”€ {} {}โ”", + h, + "โ”€".repeat(inner_width.saturating_sub(header_width + 1)) + ), + _ => format!("โ”Œ{}โ”", border), + }; + writeln!(writer, "{}", top.color(color))?; + + for line in lines { + let w = visible_width(line); + if w <= inner_width { + let pad = inner_width - w; + writeln!( + writer, + "{} {}{} {}", + "โ”‚".color(color), + line, + " ".repeat(pad), + "โ”‚".color(color) + )?; + } else { + writeln!(writer, "{} {}", "โ”‚".color(color), line)?; + } + } + + writeln!(writer, "{}", format!("โ””{}โ”˜", border).color(color))?; + Ok(()) +} + fn detect_callout(text: &str) -> Option<&'static Callout> { let trimmed = text.trim(); if trimmed.starts_with("[!") @@ -212,14 +337,16 @@ fn render_node_inline( writeln!(writer)?; } - let symbol = HEADER_SYMBOLS - .get((heading.depth - 1) as usize) - .unwrap_or(&"โ‘ฅ"); + // Repeat the marker once per heading level (โ–ถ, โ–ถโ–ถ, โ–ถโ–ถโ–ถ, ...) so + // depth stays legible even in fonts that render circled digits + // (โ‘ โ‘กโ‘ข) too small to read at a glance. + let symbol = "โ–ถ".repeat(heading.depth.clamp(1, 6) as usize); let text = render_inline_content(&heading.values); if config.header_full_width_highlight { - let padding = WIDTH.saturating_sub(text.chars().count() + 3); + let padding = + WIDTH.saturating_sub(visible_width(&text) + visible_width(&symbol) + 2); let line = format!("{}{}", text, " ".repeat(padding)); // Full-width background highlighting @@ -329,19 +456,38 @@ fn render_node_inline( } Node::Code(code) => { - write!(writer, "{}", "\n```".bright_black())?; - if let Some(lang) = &code.lang { - write!(writer, "{}", lang.bright_black())?; - } - writeln!(writer)?; + let is_mermaid = code + .lang + .as_deref() + .is_some_and(|lang| lang.eq_ignore_ascii_case("mermaid")); - // Apply syntax highlighting if language is specified - let highlighted = highlighter.highlight(&code.value, code.lang.as_deref()); - write!(writer, "{}", highlighted)?; + let mermaid_diagram = is_mermaid + .then(|| crate::mermaid::render(&code.value, *WIDTH)) + .flatten(); - writeln!(writer)?; - writeln!(writer, "{}", "```".bright_black())?; - writeln!(writer)?; + if let Some(diagram) = mermaid_diagram { + writeln!(writer)?; + write!(writer, "{}", diagram)?; + writeln!(writer)?; + } else { + // Apply syntax highlighting if language is specified + let highlighted = highlighter.highlight(&code.value, code.lang.as_deref()); + let lines: Vec = highlighted + .strip_suffix('\n') + .unwrap_or(&highlighted) + .split('\n') + .map(str::to_string) + .collect(); + + writeln!(writer)?; + render_boxed_lines( + writer, + code.lang.as_deref(), + colored::Color::BrightBlack, + &lines, + )?; + writeln!(writer)?; + } } Node::CodeInline(code) => { @@ -434,11 +580,9 @@ fn render_node_inline( } } } - Node::Text(text) => { - if detect_callout(&text.value).is_some() { - found_callout = true; - break; - } + Node::Text(text) if detect_callout(&text.value).is_some() => { + found_callout = true; + break; } _ => {} } @@ -450,7 +594,7 @@ fn render_node_inline( }; if is_callout { - render_callout_blockquote(blockquote, depth, highlighter, config, writer)?; + render_callout_blockquote(blockquote, writer)?; } else { render_regular_blockquote(blockquote, depth, highlighter, config, writer)?; } @@ -559,121 +703,90 @@ fn render_list( Ok(()) } +/// mq-markdown doesn't consistently wrap inline blockquote content in a +/// `Fragment`: a single-line callout comes through as flat `Text`/`Link`/... +/// nodes directly under `Blockquote`, while other inputs nest them inside a +/// `Fragment`. Flatten one level so callers can treat both shapes the same. +fn flatten_inline(values: &[Node]) -> Vec<&Node> { + let mut out = Vec::new(); + for value in values { + if let Node::Fragment(para) = value { + out.extend(para.values.iter()); + } else { + out.push(value); + } + } + out +} + +/// Render a single inline node's textual content for use inside a callout +/// box (where everything gets re-wrapped to the box width, so embedded +/// line breaks from the original markdown source are normalized to spaces). +fn inline_node_to_text(node: &Node) -> String { + match node { + Node::Text(text) => text.value.replace('\n', " "), + Node::Link(link) => { + let text = render_inline_content(&link.values); + let url = link.url.as_str(); + if text.trim().is_empty() { + format!(" ๐Ÿ”— {}", make_clickable_link(url, url)) + } else { + format!(" ๐Ÿ”— {}", make_clickable_link(url, &text)) + } + } + Node::Break(_) => "\n".to_string(), + other => render_inline_content(std::slice::from_ref(other)), + } +} + fn render_callout_blockquote( blockquote: &mq_markdown::Blockquote, - _depth: usize, - highlighter: &mut SyntaxHighlighter, - config: &RenderConfig, writer: &mut W, ) -> io::Result<()> { - // Find the callout type from any text node in the blockquote - let mut callout_info = None; - let mut callout_text = String::new(); + let inline_nodes = flatten_inline(&blockquote.values); - for value in &blockquote.values { - match value { - Node::Fragment(para) => { - for child in ¶.values { - if let Node::Text(text) = child - && let Some(callout) = detect_callout(&text.value) - { - callout_info = Some(callout); - // Extract content after the callout marker - if let Some(end) = text.value.find(']') { - callout_text = text.value[end + 1..].trim_start().to_string(); - } - break; - } - } - } - Node::Text(text) => { - if let Some(callout) = detect_callout(&text.value) { - callout_info = Some(callout); - if let Some(end) = text.value.find(']') { - callout_text = text.value[end + 1..].trim_start().to_string(); - } - break; - } - } - _ => {} - } - if callout_info.is_some() { - break; - } - } + // Find the marker node and the callout type it declares. + let marker_idx = inline_nodes + .iter() + .position(|n| matches!(n, Node::Text(t) if detect_callout(&t.value).is_some())); + let Some(marker_idx) = marker_idx else { + return Ok(()); + }; + let Node::Text(marker_text) = inline_nodes[marker_idx] else { + unreachable!() + }; + let Some(callout) = detect_callout(&marker_text.value) else { + unreachable!() + }; - if let Some(callout) = callout_info { - // Print the callout header - let header = format!("{} {}", callout.icon, callout.name) - .color(callout.color) - .bold(); - writeln!(writer, "โ”Œโ”€ {}", header)?; + // Build one continuous string for the body: the part of the marker text + // after `]`, followed by every later inline node's text. Soft line + // breaks inside source text are normalized to spaces; explicit `Break` + // nodes become paragraph separators (kept as `\n`) for re-wrapping. + let mut body = String::new(); + if let Some(end) = marker_text.value.find(']') { + body.push_str(&marker_text.value[end + 1..].replace('\n', " ")); + } + for node in &inline_nodes[marker_idx + 1..] { + body.push_str(&inline_node_to_text(node)); + } - // Print the content - if !callout_text.is_empty() { - writeln!(writer, "โ”‚ {}", callout_text)?; + let mut content_lines: Vec = Vec::new(); + for paragraph in body.split('\n') { + if paragraph.trim().is_empty() { + continue; } + content_lines.push(paragraph.trim().to_string()); + } - // Print remaining content from blockquote - let mut found_callout_marker = false; - for value in &blockquote.values { - match value { - Node::Fragment(para) => { - let mut line_content = String::new(); - for child in ¶.values { - match child { - Node::Text(text) => { - if !found_callout_marker && detect_callout(&text.value).is_some() { - found_callout_marker = true; - // Skip the callout marker part - if let Some(end) = text.value.find(']') { - let remaining = text.value[end + 1..].trim_start(); - if !remaining.is_empty() { - line_content.push_str(remaining); - } - } - } else { - line_content.push_str(&text.value); - } - } - Node::Link(link) => { - let text = render_inline_content(&link.values); - let url = link.url.as_str(); - if text.trim().is_empty() { - line_content.push_str(&format!( - " ๐Ÿ”— {}", - make_clickable_link(url, url) - )); - } else { - line_content.push_str(&format!( - " ๐Ÿ”— {}", - make_clickable_link(url, &text) - )); - } - } - _ => { - // Handle all other inline formatting - line_content - .push_str(&render_inline_content(std::slice::from_ref(child))); - } - } - } - if !line_content.trim().is_empty() && found_callout_marker { - writeln!(writer, "โ”‚ {}", line_content)?; - } - } - _ => { - if found_callout_marker { - write!(writer, "โ”‚ ")?; - render_node_inline(value, 0, false, highlighter, config, writer)?; - } - } - } - } + let header_text = format!("{} {}", callout.icon, callout.name); + let inner_width = box_inner_width(visible_width(&header_text)); + let wrapped_lines: Vec = content_lines + .iter() + .flat_map(|line| wrap_visible(line, inner_width)) + .collect(); - writeln!(writer, "โ””โ”€")?; - } - Ok(()) + render_boxed_lines(writer, Some(&header_text), callout.color, &wrapped_lines) } fn render_regular_blockquote( @@ -782,7 +895,7 @@ fn render_table( } // Pad with spaces to align columns - let content_width = content.chars().count(); + let content_width = visible_width(&content); if content_width < width { write!(writer, "{}", " ".repeat(width - content_width))?; } @@ -841,7 +954,7 @@ fn calculate_column_widths(nodes: &[Node]) -> Vec { for (col_idx, cell_node) in row.values.iter().enumerate() { if let Node::TableCell(cell) = cell_node { let content = render_inline_content(&cell.values); - let width = content.chars().count(); + let width = visible_width(&content); if col_idx >= column_widths.len() { column_widths.resize(col_idx + 1, 0); @@ -852,7 +965,7 @@ fn calculate_column_widths(nodes: &[Node]) -> Vec { } Node::TableCell(cell) => { let content = render_inline_content(&cell.values); - let width = content.chars().count(); + let width = visible_width(&content); if cell.column >= column_widths.len() { column_widths.resize(cell.column + 1, 0); @@ -949,7 +1062,7 @@ fn render_table_row( } // Pad with spaces to align columns - let content_width = content.chars().count(); + let content_width = visible_width(&content); if content_width < width { write!(writer, "{}", " ".repeat(width - content_width))?; } @@ -979,7 +1092,7 @@ fn render_table_cell( } // Pad with spaces to align columns - let content_width = content.chars().count(); + let content_width = visible_width(&content); if content_width < width { write!(writer, "{}", " ".repeat(width - content_width))?; } @@ -1044,6 +1157,19 @@ mod tests { assert!(result.contains("Heading 6")); } + #[test] + fn test_heading_full_width_highlight_padding_accounts_for_symbol_and_links() { + // Regression test: the full-width background bar must reach exactly + // `WIDTH` visible columns regardless of heading depth (the "โ–ถ" + // marker is repeated per level, so its width isn't always 1) and + // regardless of embedded OSC 8 hyperlink escapes inflating the raw + // string length without affecting what's actually printed. + let markdown: Markdown = "## [Linked Heading](https://example.com)".parse().unwrap(); + let result = render_markdown_to_string(&markdown).unwrap(); + let line = result.lines().find(|l| !l.trim().is_empty()).unwrap(); + assert_eq!(visible_width(line), *WIDTH); + } + #[test] fn test_render_markdown_to_string_list() { let markdown: Markdown = "- Item 1\n- Item 2\n- Item 3".parse().unwrap(); From 798bcd72422fba9c8b8d83944ed05ba05d0f1137 Mon Sep 17 00:00:00 2001 From: harehare Date: Sat, 20 Jun 2026 20:51:09 +0900 Subject: [PATCH 3/3] docs: update README and demo for new rendering features Document the expanded language list and mermaid rendering, and refresh the demo content/gif to showcase boxed callouts, a syntax-highlighted code block, and a mermaid flowchart. --- README.md | 45 +++++++++++++++++++++++++++++++++++++-------- assets/demo.gif | Bin 83144 -> 82695 bytes assets/demo.md | 37 +++++++++++++++++-------------------- 3 files changed, 54 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index d33f3bd..1a9fd25 100644 --- a/README.md +++ b/README.md @@ -9,9 +9,10 @@ Built with [mq](https://github.com/harehare/mq) - jq-like command-line tool for ## Features -- ๐ŸŽจ **Syntax Highlighting**: Tree-sitter powered syntax highlighting for 13+ programming languages -- ๐Ÿ“ **Rich Markdown Rendering**: Support for headers, lists, code blocks, links, images, and more -- ๐Ÿ”” **GitHub-style Callouts**: NOTE, TIP, IMPORTANT, WARNING, CAUTION +- ๐ŸŽจ **Syntax Highlighting**: Tree-sitter powered syntax highlighting for 29+ programming and config languages +- ๐Ÿ“ **Rich Markdown Rendering**: Support for headers, lists, code blocks, links, images, tables, and more +- ๐Ÿงœ **Mermaid Diagrams**: Best-effort ASCII-art rendering of simple `graph`/`flowchart` blocks +- ๐Ÿ”” **GitHub-style Callouts**: NOTE, TIP, IMPORTANT, WARNING, CAUTION, rendered as wrapped, bordered boxes - ๐Ÿ”— **Clickable Links**: Terminal hyperlinks using OSC 8 ## Installation @@ -43,11 +44,22 @@ cargo install --git https://github.com/harehare/mq-view.git ## Supported Languages -- Rust, JavaScript, TypeScript (+ TSX) -- Python, Go, Java -- C, C++ -- HTML, CSS, JSON -- Bash/Shell +Enabled by default: + +- Rust, JavaScript, TypeScript (+ TSX), Python +- HTML, CSS, JSON, YAML, TOML +- Bash/Shell, Ruby, SQL +- Elixir, mq + +Available with the `all-languages` feature: + +- Go, Java, Kotlin, Scala +- C, C++, Swift +- PHP, Lua, Clojure, Haskell, OCaml, Elm +- Dockerfile, Makefile + +See `Cargo.toml` for the full list of `lang-*` feature flags if you only need +one or two extra languages instead of all of them. ## Usage @@ -65,6 +77,23 @@ Pipe markdown content: echo "# Hello\n\n\`\`\`rust\nfn main() {}\n\`\`\`" | mq-view ``` +### Mermaid Diagrams + +Fenced code blocks tagged ` ```mermaid ` are rendered as ASCII art instead of +plain text when the diagram is a simple `graph`/`flowchart`: + +```mermaid +graph TD + A[Start] --> B{Is it working?} + B -->|Yes| C[Great success] + B -->|No| D[Debug it] +``` + +This only understands a small subset of mermaid flowchart syntax (nodes, +shapes, and edges with optional labels). Other diagram types (sequence, +class, gantt, ...) and advanced flowchart syntax fall back to a regular, +syntax-highlighted code block. + ## License MIT diff --git a/assets/demo.gif b/assets/demo.gif index ec5690befc829cc28d519f94775e6379ddc1b525..02ffe842be68dc245a097a15bc4bb6b9bd105ab5 100644 GIT binary patch delta 77873 zcmagFi96Kq|Mxws8H_RZWd>u(mKaO+okB^YR3fq^S+W%)G{Z1sZ!FnqEZNgo%3dSe zgoI>iMM9F0Y%O#7e16yc{a*KRT=#K5j`tsMKHsnN`8r?6^L)QqiBKv9O0=>$uB+$H zfGmS|*y?}-#CZT1G(bWUfQ10C(g3+b08J#ozz|?;1elruOiuycy#;Ek0gWVplheSN zH=qMF)IldsfF~y*5C~M57kV=cI>5_uKu-^hg98Q!z#8DNml*f~Q!`xm5nR(#+z0UU zbI;8Y5g1{F1PW1kpNEH&hX;x55afj^^YZfY9Uv;mH#No2rN}QP%r7P;ARr*f!y_mt zD1;Ig5)=^<5)wwL2@4C0@NQaixO26xI-U503)p`oFvsi}3qixKSu zC=?wX9X-YCdU|?>n#T+e7`Hb3WMM>dHa)=0%QWk**{M_JXoz`srlqCj@s3XG1A2OG zPMX{Jqiq_SPwFR}jPbTL^|L*B@>D_asrGg|>kFst?ChN`+TXb0aKNKS=e=wkGcz3* zU5OX%LodE`bFvF}c5=FumE&?iUW98+?PbRp4|y364-d}+3U7OzuJrQLxN_x+kB^V9 zudm<8$n_hBfdOfOfq}sno`t!!5eS5c#hP0rQuGGt_U+q54?3AlPRJils3#^RC8eaC zN=;3r(P)`rUosEK&AEH`Zg#}u9HO3V&S~@f2zEh1K`~{axbFPDxbI~#?6L!Df~%{m z>+0$rJb3W%;X_8uJcGe#Zf<(q`VZ~x?aX5R?(XiMo}T^#UeQ>-msu}*hlYkmMn+z~ zd^vi+Y}xn$)AXsSsdw+*y?_7y<95&d{QUCL(#p!px6RbGeZw!`pJ{&o{(WQmH2c&^ z_UTgqHb9!qZFkJ!tc4l=n1(723_LJ}^xnbV21o%^{&C1ZW&yz2fS62e4hr;YkZlGe zvztSdSQL}1VJ>AH>w}CHo69}|GC3)Es=fKktE#hQ&4{>1X2S(~zt$1r2|lk|L%)7_ z(b3}eB=wR}?O{Fi!nGvmE5~F+^!X|~4v#|*6}BI9CWV2Y)pl0g7yKJ8JHJEqw5Uvwz|EjP^f=UMFZX_w?yxrvb#~ni$ZP0B(AXH( zn(_~IJOS9~5!U)mn)WjSaJgQEMQ`_vJbGWZHEyf(V4_@HX>n`9;X=Sq_sE#2Oc-Y{ zv3ctHuWzkO^}p6ScZ$z)yqMN}x!(J|YzY2D;o%X=dyEi8;e59jT=3Vwb zURn@4f6h|XB)6@Iz0o`UvTA?#S1T(l1gw`yD%)J&Ond%lkItGS!Jp~GzuLMVf0XKU zZHujw?r_Fpandje)+}txB7xgf8hNw#6H)v#jjB39BlAGW5}P!NZVE8&if$n3qXnJo zf}*JOa*0p}E&fpcy74-u7url1(3w!b<6kE$naCm?VNaIy+fw~LPL4pxi2hXU#Vu?kz^%(9i|}T+h2T`VVg_NHT#6wsv4rov zn2kP{QUXlD8^_KDNk)zyGuj_bj<5s)-r%idv}v57&Gw1QC#5A6Y-}1O9j1@ zc*KC$hh_Nyq&@@JHcQatCNXa`We}+{#%0EIPXgo2&0}o_%_Yx>Z__xG9|v1%nDWOr zrc~%pUCa`}#^gY8F$kwPn(*|zWb|mC5yu!iInvSt5{{y-&)f4}%N5AB&5|<^8N?S4 zGvU^`W~lvKnnctb(m|Ju(MTFwC@&ExBE;$DCO*;C-YQpo#CgmS-3b2sXyW{D0c&I$ z1FTK@Bn}IxFh4u^s<_7MzE}wm%}VD{v-Xtw)k-~cH~)@X6tfbaT4TSq&Vgmk@kX(H z&;MG7Ay53Qb^B(6+|2=_bAQ%(-@oeEG|YV!3S?($@rC;)lA3<=4&R*YD*s#0nbq3Ysq# zJdP-6%`0ecE9jglc(PZ(6f1nDSJ->8us@=Zl~*{}RyaIUIFf0nf>seLo>$Z>UbtAi z7*V{OSG>|zygF07wpY9^c5hSf-qyu?+Y$G6^X~2E5rDv)1|y&$Q4gRB5CZT60PqGt z3>>2y)WeAU!LQtT)gRnV<=|7cWsT1D#KIKL_!IcbdJ}~VxKgTuUHf#j^)n_MgL!%G zie1$1wCJHE3+p?>Z0kfL@r|KiXLekfsXR9)3dObf8 z!o??bS|N>P{uhZ@H=U&D2=xax_xz>%SKEXu&OFjG@Wy2ae(ZWm{BiWH=@qL1jQ{@n z#m?53_jGjsCPHGt)YPHefQ4NV)IY}q6moEKsF?pp#^nFVh3cPTXTn7FHKaQ_ca{b|KVnPb+9Xow|(^|h-OpNEc__w z`i*Is^j1Gd-}l@criWM*)v(npnBR1}9bf0-FaykjJ8d%4Ewp9sJCtE!T9-3l6dSt8 z$_Vo)1z9qpK1)7Ab!w>5FuvQJB{Ju~Im8+eLlzYM#UA#hS^xOfVU@pS9B@y~963R~ z<7XVb-}`*yVHs0G*Lp?X#sK?Yu_yl{cIaQR3~1FqV(WGSz-Cy3Ft}C%-rbynR0z}1 zSp}n#gw?b$RiJZSSCD3u-dqbh4;pgLskiEI5888+I1T-w80v1}Ap7J-dzi-OZrTr= z$F(mYhfeR~he!OEH#{pV?bAK{)yI@3?pR&W&e~Of)!_{Yse&6El|_k%ly|-ATY@{^ zyB?zzeKqj9Ts47njmf_>BGExQwiusVw(+Ld#>!YOQTgMO$XxaBvN`UXObIWJjW0cw zH@+BX|0PBUw}J`a%Wf^%%IeFDg)xI2v=LyG;5pSNB&<$Ex zIr8?$jZbj2FXgpB&V$uQ7s%~3DJ!7YMxIBWMCo~y$+IZe9K7~h>Zc?ep6lN~b+KWJ zilMK(P9DHB-XvWOvrav`d`?c=bk$s*?ew~IcY=VD zezPLVvp>neX93$<7LQ33K&S1t*u6fE4xiwu%}FoeJ{rGr6z$#SL6I;0VPwB{M*koI%g8isL~r4FVW1o{}tx0ijg#_E{| z+O?&Zbw}--seN+cq1J#Zad&IZqF}pNf~|{e?(PWxP6Pt~TUzh`ls5XG(ps;d?23R3 zjMOg0(}@;X4k3B3UB;|gA~*WHpeUcLg}9z}SQaa&NL570O4)0dS1>h8#OBuCl)2aN zT}`X$-dy{9yIe!DNpsGLvK$@hn!X5|_8%za9Mf;Yl7oW?k%L z_Uh9nd_a{;$M$8@|1K%;U`fIUJ&*{1j{w*}F>4waL-Kltt38E{$>$&&J0#C-BLjgEv07B(ox(cy{_&h#m3o=S zO&r|Ic`=mZuMjzoiGWnp$F!HqbXlK!{nSaoUE0-m1J8RcZ?Fzu}8qoQ>+CJU)aLzUj!6X)XQa@GeX$d#me=lBoxwHAc z+uh*@(E_lbWk6%^NY>p_i6YHF-W`ctS*y1g1E1_ixic+kcxDy`g-2+Y)}zJ^r;3I`)6p5&(boKQh6s|H_1&=*y&|MTk+kWQq-1J~Xae zcO0r5vN&&ZR^;@BWHNdwwb}h}am!71;{(5e#kZE(5>Kc1!>>9T8M7Ap)bm3Z^6m%T zdY!4cdJj`0V{oRs=A0ewp)K=QBZo8g+`eA)#6&^QS zBzqNE*`^7)I-P6~0!Tb#c=5jHBS{l)Y|B4|+rwAGH|^ch3?g@{&i_$Bn4{1lku&L?y$q+y#D~&7@)g)3KUlTU<#JYgRuY?Nu{I_|Rf26RmTF(k8V_}Dp zLJK{9&;j1A>MLSrk*#{^1f6no&|LCm$AD!UFf5#D#)y#WnNur)HNWG2W$$eKvPruWmY@s{# z$8q5h_t5$0X^8~TOu8qGRUl)4oNwznDXp!2Ugpo2^^=1coI0l|}ph9OE zW^Ed25_gDT(0`X&^dCcw{kzn4i--R%wMFIsbL229lj9N5mhmmTFm|leZ*@N6mwe!i zh|90@=l#JV*>7b?pT7A>rmN}owJ$~WP7XTW zt-goP7}UFVuQazeug=t8?rHQInmE{eegk2*@@*iB{~+5r>)&u}PwAh8f2 zb1)pT0c=i;HG|$wh6^ZPVlhg3s3<;Ao^``~Z-S_%?>kn5tXZ-^_$qz5q5OHKqJ&d( zxBNwIJuOmsp-q##RkGHCHTS?kylsIgnd^uyzco_)$cNR{z0j&xm5QHRgUr4b83r$O zs>csL`g+_M;P6M5y870L7~tGhqATuE#Y0uvr~tYIm8j9`sne$h>n&c-~5~Ji=OH}eDY_1d!qBsOZM!aUwhxCK9WFxu3jcV0xd85{rm7(tq{eoa@Jx)Gs>O_)x!_Mi&iCU}I&*Rwp5WZU6yjkPAN zJ&pYprDenDTg$SFRqFKlzO?B_ZVTzhYf!T3rT?cc!59n0p= zG~v*Io=Sy<%49yo3K6fJDbg!CQFP)_&FfmnCg1mik7}nL9xjoDoP1n2)8zB2#%1X7 zgSRc5ed2K^Tk79;5Pqz@A8H9a)n@RAOVYNLG1rqIa5#)plr=v`X^a-%^k|%@chwvP6Sh1@#ZnaK6Xdw6@LY-&Rr5(Ij}HP8wHoZF z6x^iGK}4}w^(oD8dpYx+w2Z{XGV_ibUq0u!QIr;Qy|S+@=J`}qFXsC{{<2sQl!=zX z5`Bue&V5=gqa9cNQhtzgR3FXt_We>(7`F1Il1@=xsVdL*U8%0Bs9CA0d%Utz`@eIJ zN#CyzS{G}+)^~2Ne0`X$Eck-aE9|%0z>=@6YkaNvX}D=bw|%vF;=JFtN7LT5-yXjU z`}(bAmU4Klbs^htt!=rYcCCH&@z*tC$9n(a@16hV9D{2#)RO__reu{$*7%_6;JV*> zH(a4^{TV`Mb-f2=rLyr)&Jop2XhxdjVvi% z=S`NpfI)~B^m5&g5yPF;A1_T|N47>SMFN`JFD?Fl@U(OF8Mj)aVrJ;8(?pZ#MwP;5 ze%r&jSu#Hvr-q&lG0qqSXsex|8f}mHw|v`v8#Hia=iQB|fSp#Z;L;@A7=_&#aI~}V z8K=U1#Pvi?#hk_vr4(Xnoo1)o_=%$zerA4a4Jnu$^ja<>{H^j*FW-<3v z+d@dIW;go7V(0lLPqPvJkx$|uL&hGt#+@dN`1C0Obj|D>J;V{V5*u<;M3tS0but!F z0=Ke$#_!90yC^sAw~VyjXM66TT-0$@yRoODAe2DD$%~sAeTKF-zDH=s6%VpG6xyy? z2N5epk24F?yT=m)J>^qM1uL!ll$|z`1kbYM9CSHH5?{o>G8f|!%T0c>J(&Li zD_(<(aO6*Vy5CFw1qA0(t7nM{-+dpbqEkY5{pZ-k)3O{)T2=3a9yv6)aM!lp$4CEzw zuX3K$_01iZn^qmL841b%QMi2RLcffjjobB;V&PlwUS*A`xU=x7TMKhPR+ZS#^G{ib zX=EK!4YO~oG_xySD62GbmQJy$_)&sNt+G_88A?&=Df$4CuSj~NuU@Zy5#6`UINvgs zew*N>f3sDg+x5kyDQv7TGmZPGs6%{Vso>Qsg-%n0 zlaJe9Kd96_tN^!9Xvuubtu4}_90#TIJn*qP`DQ#ntXaLao5vJQewFDiuP&Zif1}dC znF60{pMFsv)-v>d?eA>63H+H!duE+HPGy$~w`0T(IhO!<<)pzE8F31>b6n25&qPNU z6rJHYWaMrS7TJ(sWqWxkH}fUpKKPX`XC_0z1oFvAdL*-*M_l@dZ+y_)yJfqU_Nfy!C@~@rZ3V&r0frj zGd*q=c6#?2`tN#zRHu|&!)~8KCKIVej2u#smPWV%AXscHbnEs`$M@*(W~RUA(d^y6 zkI{m^=|F2;DK2q302*>S`n?5q$KKIcu#PusB?r4BgNkAAJpBIaJ@F&&XinT#?Y&>K zYHq(La*X$zUXu7%CAsjUv2ua{(Cp=V`+o;+BXCiy3nUH#37$*hY9%42NyyAlUS;BP zjM%H&CrO;c~T5@W?OqyJU{xMlg)$)| z02E7$US5J--UZm30_#W|*>LEJ6>z398qbJ2nj5{VkbuGx?cHD^co>NhRY^#;r$^b7 zh_}}h1+kpzEJzrDvv`>thD}lgfOr{^<1lC;9ICdQSTGGswg-T@XA?3@QF_G9DpZ$l zLi}{%R8GQtYvgS=7zq!{g2NSOVHF9tJF60AsGw3fJcAB2u1Z|41Xjbrd7@BBG1^0G z;O+odQ!BjCI(5h@b#Nd`oS8Td<5a}Mo;h-&*<#SUBoK+og<_-}N+j-zq;@E#clo6L z&CNQ|mSsDWWw)1w7rUG3#D^gM%|)rE8F08!6|{*3&vVOEq$Q<0!fw*I4l%NsI2NsWIo%$Wc^zhvHu3C1rm4W$G!gO}s`61uAbV{7 zO(tA;u()cEuDA}sngUS_xClP6qB@Rwt14us&hYJJ&>j3Z+ z5=Yo;VQ%DIY|c$w%C1#rD6aCZTV}H9Jp){^(5vUp$yo5m$p>f&I!Ufj3>KO2dpnJnrUlLSZy3m53>3P7-=IOzxj{Ix zp(n3)qp2bGTE$I9ZMRdRuTx>lboF+174K->Bp0*{P;ra}2=;wIoE`*R^-Zi`JAw`c z`M}79=!)n?g&p2AR&$@<>%b07s%(j zjjg${mvfI^)lO~ja(?U``Pir6v2Vv?e{`)ln%=#_8Q0D!LgTCla1}8cQ%@8oi$aTh z8JqcyBkgb}92fCr{(}&)inmrxA~W|7xm70NIU@!kk>bsDOfJq_i5Y;ZI(*^@Zq85p zoSW?o)OvGzJLeg0ApLOD$Uz(M%_i(sm+0rv-sT|QK5i}OXz%FgeB1HlSI6Ug)CDFy zygg5OzaF&$rx0lO(J5Kh$+v@YvTA_|*I+w2`65AySR$P^Q;;~_Qm@Uf&gV;dgt%6a z%!ta*WAxrCopYvSwI_dV%bRY2FLJ`gzm$e6Cw|i_aMO>AuxWP^V}cBskV{OCC?>p+ z$<@h3ykoL+QJlZ-T5y6^o33?|VAYeHxZiKcW3`mO;r%{{sHE1!>SY*?kkpqO z?c>;f#0D7sm26s_JUW%^+?p(@_YjLukeMO&8&@SKwMQ{UG9IvVlhqVKT~+s$YXHMb zDT&s=LdO(HUVnb)^TKz}i+?|-V+KnN2g@%FRzwX}6%N*P4%WRJtp7d8zzj7S4mDpI zdK@*>S~%3+In?=X=t;`Zr7tN@E=0FDMpq1{|5)nh1`M=VN5R_?$HSA8mJco%A3DQ{ z;Fs2^y#q;yBNA@C>z}xkRlnOm`nwp%%)?*G5JL<^{2p5SJ+h8@xoP-v>(a~ZsF%Bi zFZVlN{(krJ@9@wcyB)^fprG(3T_b zoZUG3y51~LzU@i9-Y@a)>5DhZ@*K4f-e4}gpNxJ#UG)A<*ZYIp`48+r?`I`G%o}~U zwBYh#+57rpQIH1%I+PmJ{rDNEf&rk)4&k5Tt8{w z{-j&{N&m?w!w;XBb713jzJq(o`Olw@-(DC7E|}XbSbtcsLt^;kA#D5tI>u%0*yq#5 zpPkmk!Ra7F+=7HO#BdZuqJDP1z377!H(`KV84wE`~{QOg*$1mN`p zELo;4-E>{(M=mG@A-1qwN;t?(RlXwtt{FNPT~c72fxxJP`iUsyM+PF?4a{8vYNqp~ zl*aXX%S^N z?l&~J)OX@n99t5iJIb*egtVYR%y6i{4?lu#e>OIOnB$i$XdFwk$V?_!4X}*Z0JbxD z`)NS+V93vPBxVfMj^+8zK*q0cplOI-0B(>8=nav93BMwdHv5@sUJMu9FFTe-vB>eJ_UM>!n|nevToeoCLnG6N}=l?F*mkA0~j#o zVL{=M{VOrN;od{x)kbnT=*E^L6IG2ZFIhK~K1(q`rUBX*@dIRKZNRhzQVdOnxk$b< z>mOo7G$Wp28p>W4U{tR~5k)tod*I@#q1MCeW}i-0m~g))KVp0~Nff(${yjaIDy}v= z$>TJ*b%h(y?fbWEe%ymnV#Mp@FYQo0P1asZXu6sg z5a`-LC{qsntUVrrw;<*O_5v&OOwWX-CHZx>dFSOAi}n`;-gwR-s8&2w5*zSF$x>E) z+mTY>CpqQ=ab6ia1ky{{8;j@TxX6JCPHD5S824w+-}N^|EP{I(RX9t%5T^NE|Hc`4 zQJBCCFiX9QvmYHGqxXyhU(cz42{6?IG2AI;i|FgFd}+$OM2n~a(d@#v(rmKpN<+1( z_CM3h@xv$L^4#lzuslA#U!`Wj~)9>)BdVtu&Z3pBTF2#Qba=)d?oL~a+W;5y-Oo^;jM|W`>4nX^{Wsy|2g?W zYk@B+{a1by>psIp1U)_DtQ*xUriH~JSH&W--j{%!8i7k_v5T0+vKb)WTAafbXwIq`q~=yImM24SN`bbhYK8nIq)aPF@Y&I zJ!L#TiF;@-NJR;+_v1EszElS~R4o4Km(M&@V}cxU(L2SAGPPAv(a!d*eb}$>_n>95 z-S6SkHC1>+yr@Tl)NBt_Dtx_rsqisa@Jhg=jgmzk$*6UAxFiKN@4w`~Ov6Mr8YWN- z$`h{^_`eZ5escVl`~c=!XSG7X;Pto4;G5UU=+L^uX>P-9R(Ijm z;u+aQweq~HqRLJzN6Emtqm-mE*EikC7v>X}@&kwM$sF4G)k_lHO^LJIo-5Lo5y6Yk z7w@@M-CHX9`gFs?8H6~JEW7Hix{)!Fip{E=|U$bU|^y%`|*GuO(H6@2H4C0*uDD^raHzjXQx==;iiZ0oH}e3kby&Rgrg-YMTR3UD@i+6)ynN|r8v0H0vO4jt@o zZa1)0lMh(8x`86S1qqxeiB(-O)1AK|BRS6K7UO83{%-SvT^8*{|K)>u^~&-i%ZAWv zxa0Q{dg#&gOE~?6yD>D@4PB=}zABv2RCKTKruA`+c|L^NZ!hca-2oz>DO`HI)eW_X zg-NY3sFqn-yv_?f4GTan6;WA9@@)UF&PH&PSDhqz`nX}XP=djwbYaW=XRywOI~S_z zC97Cw+?{;9_(GuAPn^SfSR)N#eT{fjPsYhd`py*uqj(2E#mGn_gWuJoezf+BR0XkI zZNDCJ(496Em51GFCAuY~PxoB7$@h9CW**s-dzJm-@7Ob!_;^(V>mHG8K3*q=`$foG zD~%5%uFwQoD_Q(8}D5O2ZpR%y69x4cRp zRbRSrN+u^!VwJ@4+0jaF8k>4cu@*GLfE}5qCr43V^W@bcO&brZCrtkBhK5&J>Fv|cI*iV8zoSw8zON@}Vkyp%%vj8V zbgEjjsra^NFW>Ul_$}!k$>F;eGD&yOs6^e($voO`j5wA|Kzx#dc*>zo`Pu|7yz1BK z4^F$;=_$EG6gBebL4TkGA)@Mlg)q^pTqEqcH0^RX;TxWn2GLmUFHxpKKj@X*e@SlF zAhIYvT~KM-I{aD?*zr3({z{(*St5ZP${S&&n??t@uw+Grko~#+Td7v4#T)K3%u;=> zj_}?x$zfeGx1k3ja#=;}qbNo?Z$8#~+CrR<0VLiwI`hTb3w!FPb-zi<22uoj-Q_!W z#n6Y860raXzB=8F7F?mwZe&J2{Qz4bt*PZOl?^-AD{v}P{;T=XUgUiyx0Z(7G= z#UUe-D)sGJ$;Vz`pHVpwV8L$#RVDNijq5koY3xsY*&mpd1#_{QrZmNdEtbS$cbd1B ztk@4nEAdO~6M=GN!j{#nk-i3mORMP#F+e>fYDORMt{XkmY5|E&cfrY$C5~z z^y_@sxMRip0Yu`yRTsm`9bRB++q}{ii+k72hqu4u-i(EXFq*6M6nI8n+eiM`h1K3+A|hxd(4^Xb79V+X{HAju;vy@XwsyS!$&##r%54L>eL%j;4atONY2ai zHE#i#R|r&uw5S<~(XN^H(TMy4rHZN&ulXcxc5??N2#6=d zrJw1rCctt}g6ErZ*fs;F~k9?!Sai0(u z(Vn<&Q0^WS!%;)^W0l=n=ZM=hx{2*Rtt6~LhjvF${oTkIxa2uza&Ozib3nDOPgT4G z^4tB!ZxQjltU_YXD^ympE~}}}xwr4qM4!uoxD-BC`mlzKAK8;m)n>(p&Qi6fNzE4( z#$>w=b8`UPno_Z*YmJ3-fMOy58p$Zq)Gd3Hj8tZIk#|8_ClXwDyMBC9`>PC5!6x#I zQtpkXig26ZtDbB%KvkR%y^=|CXHd(<;*4ozzB29;#3rgA?f9YKhn9GK04rw0g5&2e z*!C~jj%G4@w*aP0H_@;r6IdL^1Qx-O@MVNW64i@#oXKMHtTJukme<_KX1inqJlMaSTWBI)*oRZiR2HKQxnl@M z6Ww54yCh>rYO7N|eV-hmB0=ilF=~K00!V78>UcCz_$*W~ic>MJRG0qj-3bWv1XyLZ z-W63Jk-*BaPPt_bVVP58afM+tinC|KARc&Vg^Wl5&zy+kYUPjwQ3<~(mMFvHa~8IH zJzVdo_d|i_XfP*2yG6>0GR3$^Qz8q)GObUBg;oK?cN2>VVAD6?zwO|dQm!o9ICelQ z)p|XF4-d@Gx5!Z%=`J(Y{zdv?20b^-aeWuu{T4>=0PpLm58nb~7y7(lzncRmBDtdLlGDr$idxZjGxbBr7t(R`i~=HCYzLZ#D=Z+EO&D04}XmosHOH zG$d{_(HKA_FreCsajtl<$Sm2>@-6WaW3@NESsi0TP-E^PGJa0YBR9kfOF5OZ?iMDU5?fEJO50DMUFkf~o3d z9p}Z668KXSMu%R*H>fcUUV4E?4ckq%U{1M*g0a$7viwR7$+sM-5{IY}2@rIy#AXNh zbsMPkR>{92!9qlUrczt-k@;*v37vM-fX)v(JB4akq%eN1+8hOoAW+?yHaq(@gmsE_0_pg- zc&^=8ziFy#P>hx-C33x(fPx)-{Bew!Rn98WL1W3Tt+0rydtS`RD-0MKpF*6b+}fqO zPg99*lxW>pJwviE!1=;_ue(5@i4Rc3pQ4lS*!(axe46U5E4YNitlWZmFN2dz_2ezf zoDxX885EwlIy;}3zy_Gs8EQBQ`rQx|Sal>s6yk3lZ=yksp5@RsMMSm}v!mfuBP^%5 zbzI>oi^3ae2p^8jNC}Z?vYuhdt4<#2HY$6vAj1ep4HKnf637=Gna^c82mWXsE7ZFA zZN!8Ii(sXXx==@FsP2TfR)n&Bb*d!;c)5)l;8+}mE9EhDc3}auQD+wgk}E9ApNLX` zrOnZBitN6^gU?RKWr&GpOzsdYECMf78wp#fE_Pp!{Z#iD^1ZUD>0Y>8-#x zQWiHjMlMmJ6Owd;GR%B{8g9)25iqY67bg}hR1pHXGA$f7CqkJM%}(>X6=Q;mSMdR# zW5t^1#;eQ%C3E9Ebtwvd{bLF$Z68Tv&$8JOXOtJsbe;dZzIhy;xHKw3rdobqne_8t)jb zRzY7lwEcp(3~?6aaDYRINpT9d;}JdmmZtF++&s0?QmwMd)hwU^lEWkn-Vs!1*;k>) zinCKpnzdQNOkZ(;b2yC7+hG$`Ixh zvQlL??KfV~B^E0v-DpOjBc7oRzD9!|7l)Z@=cr`-1@cM|s zGQ z>LAj8XwttIAH&sT@WKc90zgC@>ya0NYl`gpeS!NoNv76md@W@Gdyl7d_sh3kXEddy zy{rge?kcd`wky-u{r&wBYVrZgjEx zF~j|Cax#;geA;PdhgEnBbc$zw7GV?xkhRJySI~t9f^J~Sl2aLB?h$v z<{h~vCKcPl24741Z}!V`{giU>@o^$huZ*TTZepvm*EuWKxh@z=O#?4GfDYqhk@p&j zxLC>A7=s{~zgy+j2y(|fxZTIEVz)kwM0ZFE%wIenTPQB{Fl{G9?Yqy$kW=s$pl@wD zxIr}J2RuZUohGZGLp%iI6*7&FM$siNZ}N&8GD8mvjsbAXH?{R6k*GXx<6rub}(RJi;^_P3$I8#YT@F3mB-Q{je(fQj>KTW55Bp4GXz zw*_>#`tyAF&kNL_jyX4-%NsAY{B$1pd1>mW%hJy;RX<%}+ioJ;?h4x;I@_LB+g=y8 zuUy^s4&S~?-S)}ZzE-*I+p_I9u6RfZkqO%ifwR7Xb&dsYk zVc|RB)Ez?3P6V-X=T^&3i z#EH>E#|bea41fR}Ai&xy$RQLz-OCY;NIbn)s-=i6iuB(BVpy@B3~EJq1R)oyxr}bN28m-q zmZQILqmieWWC3d**eJwa7br$Z6hp;|?ZWy_|LPC_J#ZmRD)*pl9IfFIkxXd&y<0if zL=YMa(i#2bF$#IY{w2nU0W-;lSkm4NRdFnkpAI}p{XJ9p=gl48(y6pZQXsYq9X3RT zIpD}jyRft?Nk^(;0H`R-Spc^WP(e3_LoxOcjU*5hdjuDw;s}yajFrhHfv16D%;>iw z>cLcFPm;Kdo&r%mQG{A9zVNBY={>=#jDPRFIqYz6tVC7@13LwF-_Ix52<4Q6o zXO8N%q(@wLpwc!OziWLqWcpLYbwXB`H)L5f8LNy;+Lja%pC_Ql!9dL_j+a}74^N9O zNbzb8tc(ri+>taQv{P(12&qW|^@t0agE9+&sHCNksGd>aO|%D?{OIz5kxZ;&8rB=-TR@=JIH%RihxK z&L-pfxBR2TJSn?-lcHK{zUOXz+FH-u%=**~2;{r3*l~;kg?XID$gQ6jhykC}ijfZL zOZp%uFWYU~TKc!E5&Wak|h2T?OHbClni? zNF+9d6L^{Ds#!=ws~Jhi4)OD)rGn+IEX|BdPcHqKc!XSrjdGh@<|+L>xh(q=dWY_w zbBf4xvlS$^-Is@TV#%>KxT-`jgr%oY6jFb&gxAnkBh6@+shM_|FL63u=zQz_^TEp3 z)#Jh3eXUTSyR>;3xM9|e#IG-(Yl%{D#4A*lBrJ+wea<#qz69gg_2>m3)HeSJK9eEUgTd)^t2npda z{5hOCEbhTtv`d2SxJySKCTh2pPnvYhwo5(`e*-_8WYHEi0g); zqj1kS4|n2vcnp5ydihQos`m*wN2&LV`E{xfNJRctXGtd;HukzGM#gdm6a&5i+0NE) zA3h>V8ufwE19hK}hFw}7VC#5E{c29TI`|j<25bfuv*;_6?F6KUsU6?TFg*JDoOATi z$%}qnN2gpO{~VomPd3t?0UrF)BA}?#R~9C(Sg>|NudpOpcY}78Tg)X|YmD1ZG1iJ( z&9?Uo!fQ78xk3cI<%Vc}lsV+30mo6j&v%`PxAhkD{GRA76-EBlTP{g9*8d`R(Y>)l z$)HwZD5$o%N9f@t0XyxgsFD_|$gZF)ga%@5kvl~4=6os)V#-{(fB324j~51P!>zHC zCPqJBJDarg`)~(63yf@wCVf>N3!*ANriWOGeTvoMbIoXqrZu}gn5S@CU~U-wW$%4` zN;F~r`NcK?fE7(&TzTkPr1JnF;SP+D? zUtW}r=*7OvOUJCb7xa3S5;0sQ6tg#`$UCEpmTDPfExCE*k6sq?2|mHdG8D$1U}2xk zv|$)?rHKg^f^V14+uN>~d&N>v8S+u|!L} zbdr>Hzme%!?D#j+uw02Xe8 zj8NQ?QUwectV$!b1t(>t;Qa>^8i*EmR!HkgnRui99cycC1u4^hBYeY~%vLPlB6dJ> ze=l9P(*t#->kHAu6v(B4Iwv2lxE5?b4hqgKs}$Q~9$ig`&s|>t_t2=WY9Z5v30cX9 z(*egE07JE8GpfW zzQTY7QLKBL&d2mPi0YWfoM?#zmW5=uHE!t=0~Vr1B=fMxir#q}BoA5-_XuD8oxuH< zj`S>dPyBG|NW#4x;I((29Tk66m4&%SB;-IsA-ciGZW-_fv`*DYG z!t_?s-x7y|!8an~fv=z)k2^pW zeS=&n-Qgo)#>jz$Rnm$cp753>b1GHZJ_UQ+ zsaQQdU`=oj*2s|m_Hg7z_$flhje1V%8=EU;Lhh$*tE1x3`VPB)ns)0G7R72xunHoc zk+vE~gKCWmb;Q0$`>28zOTxu1vW8_!(TROL2*n|^ATZ?trX%p5q1uO7JM;)pn#X#l zum1;m`_XQC`Gf;qROzCcx5Tg!zRfziERgP8^x_O4(R53nULbNePPH`NI@+Cf>nm2A zCFfwBR<=?4pM2g$hvb&Kce(kJF~YIfRrLEyt%g5~JKrmvdrG^t@L2Ekd|V~4%JUD> z_%g*z=~d*ak|0o@PAmY)Yh*;|1nBs4>vmTCb;HJYZY>o_Dt*g&^ZTIh;~>Wp84RN! z@iLX1~Xuth9&<(q@=~UT2L~INV z-a^D7>@;FXCOqJSEDl)4?r1|l7R9gRlqy7W1gEje1>}PmBCdYWbcCZ6Nu(TL(GahJ z4ow0A>s&oIN(V9)CGIe!hmA93>y}UwAHNHpg7*i<0&+aZKL7MVj$9l-R6L zwPzggffQ7n&N?!xBt>@os|q72@6khL1FT zPehy;ru-k+F5Qo#v_Skd1whyg%m3lXXtXMAlbykgsVgcNMWTJ+G1Y98JZxakkpZRf zxYjC?8+^bZz8||l#IR0i`SO+i5dWSYv6{6b6-vN|008W59>pm~`909@Bw9vTfIT`^ zE{bTiY9y;5=n71xf*M^HR-l-ovgbWV+b&z?f~4|s`*YWDp5_uV%(J+dQCXwhf7i$Q z&a+fyoRwm9RF=bT01WXm4_kI6?3N0R2KR{A`yBO2Pm%AP3^o^)N<(g9I zn!4X)S7;`b4lL&G=@IZTq^`So5J9c&+ent1;?_BJyZdH1>6*Yc@e^2xi-N=&O|hM5 z?&%>CA;gc(^%(HOo$x!zahDf4ucD@&&ml`e=n8*G_V>y9d04oyDt?%6iyc!`o2-OS zVVf&ct))JuPo*^g#nSlFPfogtPyK#;ZihCmgrM*-_lel9^XcwDO%XvUT#1OO%tbuF z3M~;lR0a-Cva!uTZw+bFXjLVOtNlf=(4D? z{dU&9^!xW|7AywEyBL%WGP4(=enfYn;Tm9m`er2f*e(@2h8+ zBIqJ4py43NI&#>U2UMMFwHo14tottt54Kw2kBeJnX>|!eT9|-u{alM)yJvptXt@*A z7SIJxVLTpx(a&DAfMjlk%a0`*0tT&pKu*`?S2KuQADlmtPouLbb?76 zNrlD6Mv`tGN5eN;V^WT**|YVVNqbrBEP8-d)5ACC-BtWJ`*OXgL+RJ0=@ui57mh5= z297D8W!l9x=pU5T2Nn8qE530|!wamKUOM;z{31cGnY(*$ST?spnmNV=T-8Q`XsMmG z8VKM&*9v^3MM=W4fd#a588P-TYpc>JcY(VKk7P2dp*_geKcQ;wF`Ib-Wb~1s;$IlC z`6+n5&^nG}6~M*XQ};JBEV`=9-A)~dAzL?3Ot#SW4}y|Swtmh*~UwgG?P+dETwnR{zfcQOYhn*|b1kj-7E<_u2>LPKHdTN5u6eqmSnCBa zWzg6MZ?mi5rv)TWv!VVV^8x`kN$ZDH3$Zu&xPh?JeGMVjFxN5{bobVeUBS$JW5J?X zNc9vBC&ZLl`3L0fR)_(>I3K&JeH1U85sO5)lCwT+U@{aaxyqCwk_Z@P@X z-6s{y?pphkayYVdEj;6B?Exy?dR9oSBk)%X(TtD(Br|2o;y!r|dN56(K$1u)wX@sT z#J4{7dVkA~{M@a2M*!5SVVG?Ich0vKeO8DWWmq6UnP8G=8da+qWIjmOZ6*zt)r(5C z8ViH8JocG0iK20pRz9SpB9iDJ0NqbAt2us5g>=%GZ{AKaDPRP}&g$!fv{`hM1rQ!T z0EuBpsgevGx!9%v%GoL*OC}eaM!hjavN}&Hd{2aU6qw6_GM%_kmQY_68_fbjib?u& zwMJM~b82zf?GNjZ=vpxn*YX%vsN4hLbNRn|VOXw}4?}AsSpN>qBHrWbFyoSEklqN_ zLXNb1-q)n*x&d4ZVeUS+;!o{dOEnTC6;u>2EQ8=~Qrd&{c{38dLwc&9C@{!$jM;P7 zO_(Y;j%{QsvBxW7iE1@f!JcifK|3odNGERAI0krj&Q6rak>zoW5q?)_ZHoP^20V}f zOGs;EFFLZ;2*Hi%8FOeN+&vG{@h>!@o-z1ipru9{?)Kk1D`XkN(Cwv*hQ>u}?$@4e zHKurMKn7c_g-KvHj(&lcFe}8$h+%dUl(0zC(P!*#8m(DRLnp@mQo8P8>|sUV$Y!fj zKf^4o#Nn`)bqMI&0!byUS3aC>Dy3};<*v`ugJMZIvxU4(JLzfw{G@h!kq1tWYh^@& zsGU@?ui3vr=g-qSZhIMe{IGEQi0-A(ef1dHlq^gy{b8W{!Yd>55m5JYfMJZ_`Ydri zE6e`sfY>oTl0K6I3l~B&=)M<8r~i@$ZVetF>-2AqS@1xHf5NS1A1Gk)s^4mL{*V-! z?euvJBesyXn*4}5_v>j!Tyh-Y09}_n>9p z``2!3oHVbg(XC-v+h3*p95`tZH)>7R6XSB*}yjHEupSlqm*C(Q%pC%=LU?r(Z` z%9u58>W_fTg}FWg2H_UN{KV5(jqK~L=oUg9V0` zJzK(uvFOQek7$xLQ}hdK+w+#FuS2qg`8d)+05XUBZ@2vVZ0W|44SIyp$FA=7Q{+i^ zH?u`q97PI`_AB@oZkeQ-$sUv_YDo#grm-C!2?fvCCX*)l(V7JjbCxyZyis2jPrzCA zb=w$h%R#m>m1|rerz#IJS8Hv5X`;0NGN53s4E$BR81`oG7$S}&t46@B@q!+a1B zQ@bDwIHvpu*!KndVl!AR2rxox-P7_bRb&VnWTF$pks#j*jrCTJWa$36ZeUMvn(TF^ zw?YX;7~w$SCP0=7*ZL)4I3Z>)FJFO0wWw!k|6`cdGuoa}6_^DIY2V^nCiP<|GzE_r zmoK(jP@lw|0ZB{kSUZ9M^)w?Ux1vQsr%gcGd&gSM_>W}P2t>XnRsiyoIQadG>_omf~DkPIeSa?K)*tc2`Zhtu47Ptt~0RZ?ikHp-F z2G&9|M;9)iSyc63oD^%d@h1tp?IU!dr|ph3hv@#hUgUN8ow#iL-Sg_v z>r8JmEJ^sb+Gd=FveEzCO#$o$f zuY1=yLXSxh_UG4rzC6||)1WxfilLAUx77rBbJ?M;mu}VL_tH&oY;P1jy!`GBMyKiR z`q699;>e+Y=jD!nxSijlLJ4z|I2eqidatEbH8fPvYoi+-V*KX}`b-NY!WTs$RI#Tw z9(gnZ@?5=zrB(4JX<-+c4UvzUwU0dn~*HsH>Utq`2vxj`Ndbakr`{-#O)@X-$SiDTud zCrVKKIIPwo6}aT#q$z-ME_(%ZZGL|u=2|pPwHA3C6kkp;AxxKeIk4CTQ3Uq}rHFp_ znY)qUG^84OobO60iJWvln1>YEwNE1JOAjcyp;9W9{QFo?%=_B+#G>d7o`#Z*Njewo z)+KLL5?vIfnkdHhyT}ww{+PNO4Kd6~uzvmVL8gSzjz+Or(27f*M8NF*67NBtLy^nY zSiDm(zC4h!uxMrnmk>j0wf!DJ}Epy2sv<>yVwTN60jA ztxEJ_!+DTNrNl#&Z0NR7Vdx*h?}vup!{u>Mj|KU5SM>(`>b>*hJ2OR*8Krh5LG|@S z=_vY6dHm(c!grH54H{-8BADiO#gThd6sSPgxeM2S?~Nb zIB&DS$To9TsKIE~G{RG2PIK$ zW#Cjys9Cwao3N+`Xs)z}pXxi@(H5^*U$0&gB=+y7(y^ViA7VKS+U6q}UesQ31xVDz z0z(V5Ut!w6PD1gGv!g^bMOFVn3F$j8q1YBxo=w;Pk8=8sc$vbXO&nuSrb!)!$!G}$AOt;p1K zqL@uMm~5{o%OdP9u9|t8sYn35je{%dr9k~SS z;jD)dZ6v%dugyA*_#ejT9Y)6RokWu#B}0N-7VseZpk6q>_G9D&$r~GX$SJ>6y;=R( z_@*(m#|kVg@__o2r-J+g5Mmqgq}Col?}67+8vAA&0n-2d<|%kha3Y&Y!Q%}D7XQk` z)-h$0KL!gW^Nf^3+i3K)Yo|DXjf{hhWayAt?~YBc#Z`6>XY;@9el2d&mVT2R$0uQsY)a15KV%$rox@tadU zZoq*zwyEnSPblvCv7wPW5=H|cse((Nti?Bh{+J%oeXrW})BMuNji0poh7wH;++lvW zN2iom=oQ#!4kcA*mFfz{_nJ;o;tBeC9$F#!x)5MWEjSP~zS6EVX-xMee?tH4jTiF? zfnJTQuwww;)d}dEiqv0_$QJ!~4_-HjJ@vruS!cFGUYDjuhTDaz3>|;*C{RC`Hvx;& z&Nruf6cQ&jklHu~p%xN3dEkSIs56-6SvyJU{C`Dr-Q)vY7&O&L< zrS-_CK(~o0G%Moh?-mBe|Aa;(uO4^3(YX8-EPJSEJE7kDE%+cc-eZ|)yTdA1>eGjq zpKUkw-`0`)f!cMiKBQ=XA>&GufVbH2hQg-OawXGWcG>tB;!_ub!|sNm4;+9#l^DTc zSjQB#=yL*#!M_!?D?1&F2EFp%3P+(wB~7L6yx+!De>yW0eJ%H(nw`Qt^`5JcCF0^Rl0s>&hPg4z^lkbX^1zrx zGyGbL(D6y?D>hyH^a|u0m87)A2c<-;fTj0!(1&^amOcGx_G&8VN!S>SaqXVumRh`> z(}?<;Yr}p;NCh`B3g zuRrd7$io+uH>96=;8!mq6rn|1mFHO0W+g~x@^4eh);-j0LZBgkLX~Pd6HJB1=x0r) zd!4;C68HS+3hw?G+21c?K0ao7I(MLWXxmOah%Fw%3_Ez!ji@%5)q|i;Jm`#{>G-bs z0e__G(Eq3JrS9pytw44v5~BlGGga$5SS<$57U1LwCXEm>l6>FZM_>YEbAZ5c{E9WYrFjo|0P4!(Pu`| zpJB}#0~;gGDREfme|7E8B*qYT`rNqF-&eI1BK!%k7f!T~;>m+v{Cw?t8^_t5oSd&6ccVGyX%$`@Hlysp zJ~8h4jHzK_8@RLp0bregw5%Px{RhSo`Ra#Ja@gQXLe=$w}j5y?b;#1pxqSrLmn6Azh7h zOf5e3IbI$>&`%iql_9QU(=GGazTdICzpE@|-Ve*e$_vwD3jCBb>T3G1N=-!1?FwU? z2E*1eOd7t0YEMyjV7rHx{rN|e@5k-geI9u@NtIHWEkF4bJIrUloO-ci7K~TFCdG9f zWLfN7-lB3>y2>CyEP!AzJtl7Ragm=cXIl=2Yn>akhj`+k0UU@V5I}V*5YmO#W97Tb zB(28P<0}YlI1{OiNQItBf=bJ0qSEX8;8EH^R%rm`_87u}aB&X~I_Nsd9z%zSOm(eI zPR;>ltEQGT@0|_y#nw*S3(dYJD$>g&2eBX~N9onLf?%mk#)JU&@KYS+$Ps|@wYWW@ zNHuRVs0Aoh#G!3yxIgM~FKRdJp~hCyR$m1l_au17DQX!C1UF$gGK^cHfd;Z^;iYSfI@^Y}}* z_w5-6VlLtKWcPsSz~UgH_=%9RE{;s7q3*NnRo4Jeb;nh>9)a4-Zvmr2~E zN%n3`^b8wC!p|tWg`mdEUMGzsc^pi1nPgM8%*d3&d(Q8WmA%jW3Q*c3w4bc>nIl8Mt=p(bj*p=O%3M#gxvUwgeGRxh zM6t3=k>wC$LO>TCpy*Ca;9%kM7Bu-Zj;IM+ra(x#mZL=8XJ#^s#`Ytx@Ws0%rC5NM za;X=(h+;w)TyAsZCW%VeEWBXLUe<$#&^{~wn&#~cwp#*Ym?6e_YM?ZlrY{Z^K?aeZ z%Ddsv3mi89Rc478W~3UU8wdGEc&fDl3vk8AiAqItC?_rS(TzYEL?R{|E;{LV^lb8( zD@0izC*yqt^dwP1RYzQlpISteX8S2;6VX%Um;}Ga+E)~B6TQ2}A_#tRjliQm0DM}% z;r9J>>;&xJ5=i7M>FK9Oyn_~R$}BQV!Oebq1I84WILb5X@(X1L-*Pm<8F)wMFaj}& z941e3Bcg{rr46uq4u!Eij;PMyzS^8Ev=f#ZnLd0lR8bpp#WPv0mUA-UxT2kh&ES}V zf2evv(vfc)*oj<>VAcrwcM%Oa{F|w7v-$MLlSi*k93e@?yO$g-bWulVXFzKGl$wdh zQ+O(fnX*|`(>OH@yG;9oL3pA4RAts=S1)M0bdXjl{E zR)(>6Qt+M9>Vn9R5|!Hgn<#8~0w zFEEfne9)6IB6D*3Gx3ND^+Gri-vYYK11196WzO;MM*QX zJqzvOCp_SRlhzcU)1q@4+H2o=S1tP=)RfCLcCx|Vd;yozc2e{m1N8yqpWyh|Di3*Q z^&9NOtx2>Xc;Rk6yDEY#*94d6`OS<{@6}HeNK%q@dmjs@P`;O8R5)NQstjg3Vw)_i zG={Fk=`SVyxGj7%o#^_0?EOCqEqSXF69Ci#Ka%gFc})53iDKZbXBFuM`9!+18JkHovqsT%)5Z zuF(tA^d3A;NXSg94%J8)1!8=VY7vJN#j(LFn-YcHdDiIAjx z)@hP>;}`0eG3m%|t>@Ec4F)i+atAa{-0Y-@OLDeM9`sXZR(QmT*Jb$BOb>wvu5de2 zZnzL%h=V5(F&YpI>IYUqr1EW9Nsc`@!E5w$z3f?2UxSm&pUZOgVY7%F&B`%i>Bi%) zL?uc=S>XOQ@D@4zGso{2Am0-p8u3yR_Nwl+pVHB3)jlfvY=B}k$N2e_Lc62FpvOsD zzCxQ2>dbMHvKe!tr*X;obxYyo5pw)7QJUeRO2rWD4tN>3QuFvR|`XR|4BBFzBv zE00~PWR2`}yny9LPq6V?6uXiPW4rLT;@^0xmUM|FMin=D*dM%<*~E zT^-mbHo{$|ibYDOZ4BI-c&@^H+G_Y$%u^Ak;L|xl{(SmxyTCA(CgP(m9E)svQpBQ) zP5MdZ*uVbX1YS7BX-01uHNX9ieGq76Bd$oU)%zCztzr)i(fpr*%^wQo{@1mv;4O~M>1K=+AgE7C6V&?bzG1ZY`k zkB=_iP00vwcr2%O>yOsTh-v|5tAHiDZ3$~Ro#@a!ndje@zVy+nl~Xq^I!IOgOk5g_Z8~|ckHAuTTC||_*hB~uK?jZp0pI3tH<_o^ z)cMYJX9x32oVxxk*mgi_HT~OtpV#;7-5gTjrUYWo!SuY)=bz(k)*eDJ>~L&*$8_u%htWPgQ)-FKhVJpO3bG z2Pl8JSCIaoBDni&AJ?dH}MFxMa*^x zRK|N%#P{ntPG={9miw# z58Q~=Tc#HlGv~Sb?TMLuvc(kM&HF$EOxi~M(Azr}fx5Mn=$1#7&NX|5T!c>+s3pTC z8^pKWLI)0rR_{L|^sTJ?z?Zt1-@pEfo|wpxF$JM-n>WReKcHRFwpqBI==0WS!RC6+ zVElP@va;cbyZn=Yq-@hnnWA&ca|1Qk`rK;1gkLVm_Dd{j*>4#9(eG>R`GU`F$!L5tW!NWYQ?3B# z6`vq2!rG#|8VWD1{Q3P`fFx6e#2v{rh*A>&Sc~Gysi;;BtTr8=zB_`}4@>vhiZtXY5Ah6<=Hr7oN0hai zX@{-X!<*bhDTM_U=@y$wpOQtlj165MO;V2zieF6{x={0^=g{TH&qq^!6dGmA&UmAO zg;jL8ZR6h8FX;#y@8=2Mh(;^{kAqw(v2nV8!_*AR`*gI2)*)?oh z@O+wjA;Y}&BvG`_x{I2QfBj*b#xycXT*vCHi(Yc`Cug-~1nHj0-L_AMU;P-(5d(z! zkb2PaLwOGRtEGK;Z`4)N!ut;Cb%%d)x$&Yp-ONJUuT65F8p>?FfYft$EqrZ%Gi$q2 z_q|rNB;~NmqFfH`mEo5W&HwuRL;5WX8&~3WmI)RgET2jJo&V^Hbcq~GP|h$L7cu;U zz3XQS}pgCVeY{C7|0jH%Gw84%HOT;%LC)$Jyog)m6LK_JF3lqcm;`O zZdtH%at!3%oc0a-8wP!a;x`5L9Q198%*F=dh40nH3ws(^b{pkNt8x(M2qxr88%Z{c zjG#!5Gs|iLmWnxzgn#MQhBXt64x}V)MZw?BHn#&Olgw>HZ^(Vx|gcXHViLb6# zUb$k@8OIv`m4SPRV4MzdbDWA|+BmIgL&WYqOWBhp%gDXj@sE({- zYv)MKs3eP&(A-Mx`+?t^K`_90fY2WsnMWx->xtiSRGjBkwGC~eSz`MvI zVFhiNZf*4Q_h+@j3cG?H7%KNUpHW{g?5}xXTzB&QIg?t-;KBpbH*lA+1M60&2JM8r zdvX+_tqoU4=qKbF>;FExe@AMOb% zE9r>O^qiDvYozoe#1npT+ETra43-8S&G{T{Bi+3ZeksL0k;ez;pNJ21O&#uk6!9!a z^QNizvz9hs=n7-^6F^)rn-hFfe!uAV?e{lcZ#=GxT~7V}Xa2^UKZ|t~f#`0+Ad)St zTTer#@rCylv_Q=O;@CaH>U?re(@ibE&d7G7+J^L9u@3Vi@}1RELnZ~`FY%KNM>{#A zGSVj1_C<9Z4t|nz4>5&zj(YD=`y{U}ZA$xcRHx64s*M@qxCg+f1_M&PV1^4yR=MGOJ5ASeDmwb((@N@#Fj!*Z;njrzIgc|eJQ;9=C_657yo@1TaN6!Il8fn zkX%k*j`?x(`=6y3Zv?Rg`64lVVZ9~}GGirfU(6WdY7;OsCd)Z?-lOi-KwZXW&1LH!h$`BbH{x6Msj&zi-PKKbv=F7sM?8_gx^q%@)12LW$FB9z$ks zx9z*Nns(Ldt9&Sp=X`4|x2}0gPdUmc;MRJ<8!H8i?>ir^`fil!walptc0N_#+N`NAcT)as)V=w; zoGJM8gCh8|{6-)^Qh|6XXg9GGK!qj=sBjillt&etr6OSzuX+@M4N$2Eh)`)F03aF$ zl%J(3!{}H?TK7AV8Zxw)0NllDq6jo8m=KmqQ)dH^d?=nRLUH3mcT-(DO*AZCNTr_U zw#yoHgR8T^OaMrVKtnghVFu~yY?|dD-C{QG7!U9@QK+gk-VFuT-e$P+=yJR`t3etr zAmL(CLLe*QGB4rEY{FGo;x&9?m}BDgfW#X~iBYV?o4mx>*+dE~iH1*NI3~phBqb&# zC9{%ZCS9`0i!eJ z;!**yy6qG^Rv>i9G5&~If`MH8amV<(gLHR7%Jp3?BN^&WpfO`)eIOwHOH%p}EBz}koz6pjrMyU$3y9SmjMFD)%p_&Z6~sx^({7=_RDI}S zKw1C*jNBzR0>Ih5F_3BaH?CeLg+1`ApzFUS}AssCTjzDDv@L{R-uuYiI)nuXFH1bcFkZ36| zf+~~&NCO4ZA^-&swXb2bOFOzuhud{04r9qj`txbmwj0 zop;H1I;!q;cHHUK%sX2M+GT*6z%me6_}nhYGDC+`jl8Pz=bVQg)*;SOyXW zmSsXy`OvG;zznuXz)AtLx8!dX@SfYfDt$x>yL9*k;OPmL@O%NSC|Q9`zf%NF>%E7> z3Kg5@zdv z1yZ7FVEgJ7sM$*$!YQS-hxJ9MMIzK_#*hfS#;NFaWP=-ul7go~(wOj5UyCB#N;2J` z4`!izPd&}r_cF)%W!~kN`Kd1pt6vtQO9E(5&78~7^EK^7@VraVxT1>1S=eT>P%#!B z00)Qe_9vMl9DL#IE;^MdQX>jq@`m06z;fncH(nP16ak`6Lc6eVCO_-5tO%9dbUlP& zd;;26_=0k=y6G@K}^crS9E{+GQ43qKy3&B73! zB85fu!aKhbQjw6`Z~-k$1u zdwSumt|hyy8hi)_{1Uj!b;=B^X}{dnE{ZBm<(HXu0rKUt)|#@VdJC>&(gJE4_Q~#@R{VF46}K0b1AvznhJD(ozd=}LCBCYdfP3M1Ioh=KUZxCG^?Jn-& zuD3y5@6x(DYPveRy1Ey-J|Mb3YIlF49PS=KbOo&b_iU%>d<{!!?(u(!WYdn4Yroj{ z;NaVLlFbUTLSlgI;zzkv4cRmIMKyWJRkX@G(f63is6$Nw0QkH`l>!#Ny3q5$u?b%f zlm3-b3D3Nz{|x=>u4rjfY7lgI23GZx{k00ba3{I4it!oIhtug(J<_LsrEhOKrBCy5 z-@fiXoy9&qu}@uTG75zDBPU*eGml5_GDo^US^s6!z<}VwtSj(16oIkdBH_kPliuK6 zY$@aG-g+tiCrdG)3LEg_ry$lrvBHBzM@MGvg02S-(tesTj(2BRz`)*?B1U*2eN?=Q z&gX>_0~&{z3udL#fdiWs12?;KDiYKwc~^$=(}xNl4;6P0-CZ2Ir#NI-53*f}mBKT= z4fj8MoLb#ITnCSva7>ljF2t??jzwk;LqX5J(Q(7^$G;5+&pp1US%2m6ZNv)w3=c4P zBi5Gn$=aHZHy7Dol{Tk2A{9WZUrffye|_Bj?c3tF?_#54I-?UuMyIZf&ZLjdQ67)} z=pJ2M99NLCbIVwZ~fj}Noqi}~^;Y{ukW@+Dr6Dc%}W2_BQ`5hky|WnS|um}A1X z##DXBF)kCv!4sw#6XvxOmOT^Jl%)w<@kyfYB*|s+K=9Be4R_^qhPSl%G^WW z`O<%L&tCty=Mws&2i(vT+A=y{-4l9<4|=ORukvF4h4_5UDEQ9kkJBp)Ueq5skCRL( zOG~)jsX)5nruoAAFM#8(mWzWxR+x;l{537pH ztIEhVoZgzM>zW{LRUH|+H*;;@hc%t$H9h3|e!X=7IK=qsx@qRRdEL6@hjr`abz9^H zQE!9fx^dv@#=*=Dr@9U24;x38H(ZgFO?SP`W3HQ?R|T71nVTo;Hcx%nJiWYm2D#;@ zw{^~S>-^QNi(A>~f8NOa8CCc5=7*oL%Rec|ZJOS0 z3A!DBbvrS0JGpM#w+@rKy!|Nxn#|VAblqvX4YFi{Oxz4aX*&^Fpm5qw5oJd-i?VZb z1?E8jg}d)mBQKkvV4Y;YoAb)+>E^qrq9qPskEQ<-xT!B&8 zzd8k%b^)I4_h9k*Fnb*WYH zqJ_@=Q(u-&H%DzQO?~~ce1=T}BQ<;mSNwM8BI;cj8C*Tb%TjlJ;4`##zN^sq>U8r) z=BaW^gZsF!_Km>)i=z%lJXnj|n#`tX@b8Vzl7odxE%HSni$4Yg8I>BoBiq*|JM#1{ zj*jev&3?S^`q1~=uj>m#UeB)1jDGulV`c1Z=H4@c(LYfea|3l3Gm8!v9WGT}n%!8Q zkNxwL;j9=3ZcMjSiQ>lVc~^`-+U1d}X4{Iar9U2}cV4v<+1I#YhcN69A&FaVtdLM7 zsr*C6Kn02eCanM3yFdTt>|d8#5bvvY}N7VtI>W@&a( zT;;!wHD`UURM=sIPNVh1MxQ*wj+lH6Uq7-t4mQli;z#4Ui`9C6n5)h2jdfQ7*J}LT zi&^xO!wO1Hla5XQ2Sb)W_m-g|#0fh2w1iJaH~hx?Dh{6eO_F|T0rWI#n;g!iTD zXItJuPX{7Sd0y6$`r>ot*$11y{8qij(3hS!PDgyb{_}L?MBWYGXyB%d7Kw9*2*Yjt z8T+n0Pmzu!@9Kx!@fjx3_i77NH9%1ONX6g%aP+j9dy@)05d*B1T|CF)NGDQ**BB_h!w9B+I72+#>LuJX58 zh>^Z~f&zJ5>H{jl&}VJd(JM8rGu!u#nzCF!XPO zs8`KGbp8ZcVf}gQ{>c#8|9F1;gs*|D`780Q_4XqFXu{S!y6i(T2Q`4@VJK^>5C@cy z^lqfPwWCb(#OzUVpB2Z4A?`WFlm2_H<)6WaAJQduIAX8J=HVyKBF;Av#d<#yiB=Wp zhXM8o?JX1BES9M|asZ*jq3>sx!8dZ=>V{+6RAJ@$N90;j;pPX;*kuLpr0irM57}|M zLuiAred2xC#KXdLk$Y+vDdyc#F5$KNa(6^}5Vh2IoqNp%O z&`=waS9*>k9Iu}V!*8Kd>maLfaPMXzp`g|ZOF_|XuSTartV;ayer zK&K@D-$&FcPvxO<7j}CzXlhfeZNY*z!P+YVk2}pVa|LAO0ubb^zRC0AvU@ zg9Xh$mb}E8q^L^*?=&VHZ>&&%tnp=7UD9XlzJ@>N@MSE50xO3^&z35kbxRQ3T3dLi zA0%|ON-L?#&alcVKu9CP&r{9F4-wPP@!x#Jz?!W|IHV@2y*t^VNq^q>bt?EqOL5bu z-P^{Ny3c~|22nU%2I;B4jPMyl_%)S3d-OZe_6FMHB!x^bXm$%g6`Ok!Z_`n)Flzdm zoriHFILTZ@w`v8xN%)pmtK@@_cv%_WqLXEa0<$rxX>X7h`Rq-{khdf6vG=H(RFSxP z<A6m+lUI=8VfVpFmcA0^!>EjAv1}J+W?B`CTU+-XswD zs3C-s_c-Rf_Bm0m##f?zaIxLKM)A1wa-co$slrIog4;@_V8C;OWD-~u(aWAJ@~N#jGW`2fqC9{>I&Ha?CGiQ9|u9bC$x ze4B4Ep?*V<>();q`4>%Z-T&$nVc05$&>Bj#j2X4rE|g$mB+!64ut1M*(kb~QRK7F_ zs;AF6rZFSD7yngQ21Wn`l!X1>Xr5WujocG*OXJ+co$n4G%-Ltizd%_pvv;|w_ya-SjlK3o=rfdK{KUXbb|3RxUSleO$eeuAi>U4R4p%yi^WRHJrtiYLy_M@- zTNgmQ-YZQ28?ivSnECI_j>qqOx1I`)eOb?a^(9O9I?`2f&i7p%WvyH~yE~GCikxAL zw*0zByrQ^b?tb{B(b)M0!`B^Im>MHhNsLgTLTwmiFp~|} zc7xe#(}a=9I~{kZ3`nn?WD&jo#sp8NSYQG0I~a!_pvVeqNh_k1kK|XbnCo&}bTJw4_IQS5q3VV3_NMRy(z z)&Ir;d^YeM=ION)p4UC}k~MWh^0N zEfh7s`Tc#*y=Tt7_nf((=kq+Tw^dZmmORO%JzWt8vr2$KV=1RSq5DCwe=kVLNw65p z8Hyr_MM1P#9qjPzm^45Z<7%hS37X)qxGxa|X1ngc3-iQB)0Q zupv{0-4FvRcOgsAD5p`~_EeC}7G9>8Z?cHf!ok8--CEeU$7D_n{nkPZ(j>*Wt&M4v z7lN6skWjdKDJi|SY-`Dw>YyF44&%SGMm1vt~v5Q)+>oJNOU# zj-)G&Dzk@dBWP$`I*$=i)re&#!O$oohz9+K07)c}xuT$ko@6MEgj@lOgh5#flX3}3 z!;X{36M8C&0y3g0U`S#pb3+vf)QChLd!~>;(o-S-@*$(6DC{UADhkZ{`&9G<$Tw%m zl2K5ND2j4@hems!{mN^tJ0vk@vO+&tKOy~i6gAU`4Ar(S>l_favNmBN(Uy#6V|_isMqY)h?JJ6UqR*_vE-rb^zT7pBniBCxbpY89g3-1wDSRYDLV+fH)pm-7;2 z_gaC-Q&nnP)0gJOKyX2;all4Mg=`-MG8D{!R*~d!uv1Y)Wg~EGER-Ju#!zn>FM|Y@|C)+7px@Qzr zD}iJiOA&ESPx%bazhS@gfC6m+lRksB5)^8Gzp!9XO8ZXCNjUdKny0KP)~|!*z?O)>6l^re~&?E6pkYb^fDG?+6hj!GFO{?17N^F zER=@|R*WJ8P;nX>1$nt>_Y7lHQ*sA^B9G_wUHWVfIe4e3fP-R48ew2;7TZsJmck0y zfK|PC2}P*n$aAI-MdwN-K;5&_ofRDA&0J6DIvN+KoXhD7`^;w6PNK{=2k6wdA@52R zHinq=hPf&kZIPs_DtlXX6*(bk-yg1Axcd{Uxdp&9l{6Z~8OPN!(38aA$z-?fPgb1T}MuA+;l23<0A*j1u6?$T^(BK^-i&=VcRzjFPW`GA29)!#t~f$aApq)} z;K$<_Y~4lBVs?~r-9_+Stv-@~N(z!?hM|tbP$^>NvjMPd(i|8Md2TGNuaco{L^gXz zLejtJ*h?-V(%p>M1iQeNjPy_NbCOHN;=phhs>x7I-L-~Fk_ADr2~Y%zWLedJtQ`#9 zN>6*mDmtG~-crKiU@l>x4=2b-49ErtGi--G`vWoDvfPt|1lNK&+TTp}`6H=N7YqpP zoX(>BoU%fMJk2AIzu)@%wx^GRP$|0;V3`Q7LtoBRk;YVZI z^(e-o#~QLOyvgvwhfmKxd^zMWMNC*Mh>eVpOfQrhzBp$H?P~t@L8{Dxlm%V+%W?a= zaVfJ1EWt@caEkBCgVs-(lk_}ectH@Ar)n$bAyv;+6~fo0Aqbp-y5MPu5&7`TI4K2O zejHrR52|=z3EBFttm4Jo1;9V`LAkyR$KTKdo>9AD&5X1Q?S3*>LlEO^Cq-A@dM}81 z$#)Rv#LiIkX^v<?~6A$<(qg58m~cAKL#Uk#^mmWVJ&tabH(xhiJDzYL_5se=?69 zfD>lAhpRzA*&(@fJ zl0BlPg$85WN+yye-^p%}VNHWXjf=_$5rgdQLy4Q2m>(LrAL-PIq4O6(Ft10|>k8D! z$08g5UX!lW^$`mufKPsm8*XaG2NZ_yCGO@Z=kVZu7m0M|NSzbXl40O+MA5hxUrkW4 zVOp+OJ81yBtvyAu`Mhp0K;n27CDFW{ul+%O5_&v=VyjssWF#pYjW$#+|9Q&c z`~=!RS}8L6jJBhG3gvzDCFSO5weB6G^Otn8(z|=2wV2Tu06=Ig?_B1J(KV0J+bmpq zP41DS$T-Cq$TV^6%c;QO5;Pv#kvD= zp7);0?~^UO#9<$D;(UkV9=eU@M8%zD#u0|RobOc`3d9GQ@7a}I2=d1U73*6oRHg{kT;ZYZ8qWh=0WNkvQ}2UWuma%vBV`X4ol-ygr+$h|od8lN^HZlPQ>U9#XS!2A52b#YP5ru=I?GID2&B!)rp;@mEtsb* zI;DN{Pg{yiTL#ir^3%RormZ%ot#zlZ52gK>P21Q^+hj7+wgiA}Szt#C*fj@!Isrdt z4fj|w0RSB21HUVQKh3~lH*hor2>+c0{%rz8J9HGPhs-X3cBqe%D{82e1DdXYEC_f*O+;FX}0&8TJdUDNBrje`v+IFX1mgu5PtOp%v|qP0eQ#9 z1nq^_*Jbh7)f08Ty}hLs^q~<*)Ls5iVNT)K=+Jf%zUx%$_%KO-?Gr1Q{JKW6!H?;u zkqgWZ50ecyzjgso0nHSn?fKXF@=i@D#=A=&D)IT6sU4e0(|D_arc~4Yjj!FdiCZ{R z*fGXXEe99^N#32Y$g`C_-W9*S^U{rKId`1-?;jH?UPXioc~+4)&?P_>nMY@`iXvbs zUY(9`^{mbi3oNO=DjBUp5K@11j|iF1epA7Trk2#?sNL*w7el+ z=gsP`NK$O&AZ2M-3TDW%cIdg)8mkzYvL+`3ZHr9)*`bqdJ|)N}W5Q7b*G+ToeJ$p_ zA;`w50wVV+DPm|cRG3M}KuwWDwH8n)Br>0M#xe?BC5QoK$cI&d$f9AO8u0b1jY)af zY4&4_cX2k=J#1mV&Tk%iTUE=K=He_AQ|^RhHr(Q^$|kc1=?E%u2HoOaeS>he{G7@4)$_?zHIZQ$r%EK6Ok)5 zU?r_{97R?r9OQ(uId0rr=uFE~u6W6#&gy9q^Bv}rf7ZawCfq&fVynXChSFx!v~l4; zc-sXowq36e$MiZAt8fX9Cn2x$3~PE|sQ6&R+5|%x-VBAut7S#rHL}3d$)KXMPp3j_ z%b!kPc>Lw*Ou*wdDEBA!V}ZhNPr7W5AN_gJ4~^$kmxraPL$c)K??iA63a{AJwjOir z#Ko)B>0~PBwiK32=Z?c$=e#E`=+x^jss7hGRs-UKN(f&kOY8fjc&|A-Gqg};VWeJk zd}jl=v{K-Z##)>DcWwi3Sd`<=JKfpN-66c}%b#P<-n;VWsX#c@wsb%PY&j``914f` zm7iRvf^>S6@2AWU(5@W5>x0Erp$5=QOE?=_tca2mIm{>>egOsi|VK=FH;~ zi?ZUfvwA5xkI6LoEGLk>LYIYTXIVf)762(SyeB6^(>*SwkO+YUsZfX(YEZobMx>?o=Wz{Ni7naDDF zb+2Y|1_vLEpF861_3q)Sju5U*Kc?`Q>~ilU*J+@>QK-@RHdu_LeP%d|%c0)?@eznp zQQgXaU!~`%%|UkMwaD9bpOwuIzYhTry();bia>VZN%wFEj|GQwN_u-%rop@Cm+^F| zwq@(>vqZQ`0*G0Env1nSt|14*S}Tl=&{3xbP@^sul`u zqyVfsHtx@FaDhX8I?Koc{q503IM`X2)qpb2pJHUI&_b-Z!aqI;)PLapMb+bli4`Rp zax>;Yj9c|G>1qfhJ8beljl+0_edHEGSr%HebGWUAZhwgf!PC}qjf+7uLTw@Q6*@`(so~(+9_sU?w3c&2qHeXNg9DMT=s_TqhJ8{xu^9f)J8X=) z15@QY;9+wWzbh(Jm2og27?ydXdc&`w!DxiLbk%+N5ErK!XX2c2c@@s7d4{8eO^6`e zf*%^szIr4r6r?li(#+gjd4U5i2^Vw(YNx1tYEla_e&_vFr})MCH!X_sAS=tNCJSPH zqL*-bkEf}qZ!7@&=*^X;Fl4c zhTVrhHUTJ>0g*N8;km@zq5$&PIc|R=y5z=ICLTL4RB7}|?b3E`kS|#MHu(0fmF;{A zb`dRWJYfEHyRi1oDSK?;ce8>u$+Flvp2!2b{PFD^f9!&!?18}F zAW&f?_M2Md?{`7RcZ;-eVD{m}_Y}XKJNupAY?;4@gVKK1PoylL?*21DKfc#mY4+nn zG?d>p5KTH$R-&{I^dx|F=_V{&y{sdAMNC{4;CLJY;;vm=Dxko!8t6)cP~81qosWAunKrg0v+Tw9!F2stY-@^aFzo!WRspgA9`v49P)8ISWRGLB^#E#x+4E4GSi%L8cuGroBPfw+qg3SLcm_veb+>1D&U<-*w3v{rh>Y}AiFy3SlZy9WLa?#2)*xGv$ zunr7n+JrCKMAsQ`!}zDGa7R_VISK-43U&=Bi`d1JN{c6I6i!(B3G@aFbS&DJR-J4O zcH|B|@d4-bXVD3A&YAn0v(PygiEl3GbI$A*CpM~ZgE&EjbMEMGu+m^5?0@co=gx#H zp3(d!yt3%=uhwpZcBb&0SLuH)OCYz^Dgc+K$bU!ijO#f!r5?|&b7!Z&IWN(89Y`MJ zbN=(SZXbv+Jt9mnBtT**038yj${OGc2{Ksv?e6HVJRr>F4)&Xj36cz{MO7jSpXr55I>N#);7GM&#Tx zQ!dStZl2o<%t#^Fni) zYH`9uu5?R?FevTqO5SMLwds{>^I_LlSFZ2W=S5e*#BnNmIH!$oKA@EhQ6enLFJI^T zwbx-__g)x-h;R<$xe-Y%S`CI>Tvuo;e$oGwvdPIbYAa_gX4Zs4K)l=Gfo>|uM zy{z~AowwibjGix_zAs*P{&p)F_OlL=z6^LPaviOFFJeRzYoC+Gx{R(kb(!*%&wZXD|lBX9InE3Gz; zhCiGRui&Ru?0v7a0ake(RJlrs)zhjqn&GudG}qS|cK^bwdskab)*gQdzpvSQKZn%d zy=K_D!s`x!lz^MB29%oAr|ks`9fUUjTfLI>z!RjBezKn5``CY?L~&mWF>jibgIa^% zg{~xp+fN%{ol3|Ltlyzl>23R5DYWXJ{eR?Tug0}UIZHlNBJk212llk+@D5-KQi=DY zEuO4ic;g-P^wI-y&qgush$b}a))IRfUKO~mg47$m8ZV?fuJ}5v_MK4|V<&;a)ZZjU z4B0G{+`9kZpBnO3W0PoO0XpJcSA>_Idh2N8%R(YJs;A#|j(>dZTI%dU{YSJ#6{p-9;^c?oOu+*Kd_ z6W+U|G05IfYx2<7Y8^e<__^j4r#Qt#fy|R-J-ZRX09H4&LoTSGi2bS=Om1F0cASn% zA!;6*s3cVEp^XpY@&8eC;GpVU~dc*S8y zF~dUk(yTu$ZEW;5V_L%%57a(35Via0W}Us9zId~B`ky5bUpoyXsq8YzV*XqB)``28 zn;gJ8k#86`%^t;5Z}H1-(|nx>dVzxlVfYqtF2P$IV;~r-M@!3kwZ;SnL3n;&Zb!hB(#2Flh2XDPL|AR-;ns*4p@i?6i-@>JA%_)iD2yGESSc4E- zQ+rXY6NM!+K2ERAzK#?-4BSk5_;()IG-U~>Srn5=JPV~`su1zm_H9fH>GCC2A+b|~nmN1qB+$pi7#_nP)YjkEAZFfvaY4Mn9$hSFu)aOg&gDyEt5bC1cS zr9>7*kAj zB~X>csDn=$9w{`8)sCvI^?TRGR~sNC%PFjfnodR=2a~yy@z@rM)`Q+TGTEdGBC3u- z&Gsnd(oGxja)eEeVX{#l1*<@pwgTzg(B4hMX=SmLSfVRK^Hb7g^Ue9APmx;^6s$VM z7(+2mz?)fF0&Ki2!H;D^Qp`HZkWd;^XPl0u(hXtJFl?k&C&{3nqS;2|CR$=kSi6yQ zvlKik4~Nd8W3%W6lmB-E(c^gCJR)B^QEb=}ON2Cx$@7_@Ke_dyNYXn+{Ye7r$7?5AKSEis1;s~cOVBWRe=S36=^P7Ke@cW!Mf9)uUrkZP-DIrWDDwon}JBOFbZ&gi)5eNE%i@ z|Fp8kkjX4fSUU`F2BUMLC|Dwyn{!LjmtyD}<+}cOJmjJIi#>Jnws6*EGoU?|rK>VE zwM3mQ`0H`#5(-l<;ga<-MUz1jqk=_@BC((MSo0q|i$tCkOS6?;&R`a#xWmC>9qsTu zTRr-nP}Sg8!$q7H3MyhpH_5|E_0vt(i4rJ0cAey2w6lU{lYd4_UAU6AW(X3en+;O1 zM!#eR<6NEfc^_No0wr{00>!w_!iY-etOv9BRCo)?FuhIaSu18J!gcalTC!0Z6o*-- z1N1mq-UC;Ma6#P|2?e@I3dx{_&U$lP0Fp@wMeGjAKq@})%0X)7MV=_US$_}bPfIgm zFZ`(8+Go!^n5N&4S8AiN+d)lvEn^>8%Ie{jop(aDfQ&=OwbxzoCG>cqlF6|1`XzW7|6( zyaVW_7<@S*VYK(5ppQT`lZ8ss;p#@|6BNC68q3lTpd`7hw75p#LhmI#ZtiG!@aF+@ zpB3+l5`W^_wy}n`_ETnwl{Ec&x;cx5O^Gw}rCeU^y}k@;Z^pmq#-ooYJi}z{uq97P zlB_T$Y=UxbhDe@(8nfJP7N%V93YgZDH9q6D>JGnYW{B=SF2Q%Ikt3MU&k?SlBh8L1 z(6nugiXO<0^87)sS_#F#H;*@3d$!1))0T;I{f46LY#ze>KC`a<|z877fBPd;6oX<-(TZI zA1Aa^4$Xt;Hd)=1DHHLgG}Etz)@q;?f|-0cDZA zhzoE@D3Z%I&V_mQ9Youf2Cx1*;j^zb(;<3(HRD1-&=mG8clRCb3%9CsF6`8OR9lRm z%L>>Nx)1a}TEH75-i}Y{vHUih8NB`V{5yk9AGDYqQ;hu)Evx{n87S`YGzA$G^1jUY z%H9z&Hf*H!M6p4tL>#Lw;q@&3uS9&r)MGPqbxf@gMAIp<0kd@LHUINHG2&qQ zyfLK5e^eAM z*|`RF`T1pM{>P*HwnYeI$JyJ)M^w#H(W-aeR^roOO}l-KD$G$mKiPBgf!5dTH+@%@ zzMsnkfTX}IcIWAW<#MwKLVt$crz!RurY)0%+euyDnd$j{SEp*pgjFwFk>EY;rPpuC zf*_p%m0G?b?61#7tiH@6#4wIc`o^#&pT>`BFnhffSuJJIj?GZyFcfB}`@2b++;#q* zjB~|{kaD~FT%KFWSEpzhgdMNfZ2GsJXP(@L0O#j;&MGu2%lLS=%w3P#n+}qVvFW$C zp48_;;&$JtX0yG@jirikiAHSooZFMThtN@PQ>SOEcGS}i>&`FBUYsJmn%~L zAy+IemdOc!0fpExOhGX^*GxNCa<4fGxybY1yE3W5uU^V~kZby(y)@5s(sL!(%H+HJ zb;J6wQ65$vQ2I5kQtUjRu~5gtwdddZ4=aJD?)r5vm`Lz&&xm`y^-bNUFB@n0daQH! zjQ<75Uk6q%73P>a55R;UmBw+Rg}hTn+C=@TGxAb($6D^ciOflf9?)VgbG|ngTT^+R z^-}&?vHnT?b<;)KysYGC0#w+Y-DM%GYf;?inpywB9l1BFjm9hMPi89)H(oMjj`*30|-tL4fh%Mnsx>aw?Huo2Y@W9e80x2o)`^5Dmm~OE{6wcVLU*5CO^vhIa z+U8g#-+^*BM08l^Q|@4J-vnOvpI{bXAv`ab9adj0a*^8>5y%kId)RwTNxAI&=Vv#v zZYx>O%V>;LIruKVVEYrPD}nCm#*Nik1&?Ih1J{Nwxhu3nSLw|SoSX1z-vt@5 z=L4rVqHoXmE+6-BIYknMM6lxPumuJJT;%KgR=z7~hR@kl{2{niW#xL}Ee^>v3 zVkF7ng{lxU|K5OsIT^#5nm?Wp?%*qt$nR)@x|2y7HI|v6onY z8&CoI-4dT3-THNI#f#l%tf<1b|5wxdsx`me>4_fpy%yjs5D_3*Hu>gEeCy?lYZ^b@ zoY^|`n=ZeM2=6ZN3(xl)1 z{cL3NtmN$PPy1cJzig)9O`ZS#+^2EyZ<)WxF<>4Cy~qzylsA&|@ZyBjHIwZtwPW+h ziG$b1UoYnaQj4B)V!!)O_(d00N_{)#@%ydU*XZJIsU_{=--GAGdM1 zm*T+T=kI=3Ud&2wCQclF{r&YyH&c3xBzDB$@=u`4%4}zQ9L*zV6W*B1>=YCqEgthv zeCIE-dwb%Dxnw+>I0VT2tQPyba>74ptWxIJeUHDZUbBCIb>Y27#edh&`zO!L%IrU% z_`8ufn>@>uIp`7lx0UUmvLGw_dqAwq=;mw+uxu{-XQcSw&-?zVYyPr_QxpI8p3kOU z(ODds6Js6>_^0hA@3${2H~p!7khb3~`)|9LdGy^MIGmMb{+?j|`#lRVnXFb8XAlP! z#4`*M5CkKf!K`J8l_PnW0}$k-ICEwWvmt9>*9EzXoVkjr zTxHBHPGl9VN|3u;kPAuRE*j>3NacP;<#{p8(=EtLcjkRV<$X8IJ0!?A=FB%i<(nDi zn-%0=aOPj8@~;i^Zwd0EZ)7;0SH*8k)cnh+Aev zpoR#kBM53;7L<13sbb~*f?&c7a19QMvS2N)1q9&;j%`8h%W$6&5r4R7kc((&f#`)1 z(MY&hjEmTn07je?M&nvu7W>gZh?)_-AlQIoAR$Otp^97;3hD~80>KD{YA;6Bx`ou~uIg_J)!&V( z4+&|ExoS)lYRrtHk-hw=YWPFAWHpXQ4+jY09w9DXR;i}(i-P%yPZKoRRp#DXbCqreUBo2 zpD}%Zgh7y-L1>Y|g)xIjgkj8M1LQp9--tknE9?lw=ZsQ027<^CwbXXO24Fx?d=9aW z6OsY3uY&|vX(n1Y9uJFrY0dcMptOapHbakPvi2FrcB_Kg(knvv}&v2FL8UgOG zD;YO-d=p{5>t?=RWPUhi&P3p#?zrf8X-3aks-lBaw2HBUO|y)wX=|D zwM;e52nk~QiGw}cx^w3bf2G*`?I9F#z`g`f7ga?>OEqX!`3NxA8PtU=tm zfw7$=tf(F-{TnS`H|yLmz+z(|B4 zsx6|U3}>%mxPb!@X#xC6V*<`q4nTnL@VEdDAVT&Y@q1S5=`&7wkwh$e_#H+xf1re2 z!NT>z#Q z06eisI)LW;O+sez~HdI@~6)aFqh7Cj_`A0|JtZl%?5#=b|!;z!8PsKS0MP zb`kdxmq#AC>NBKt4OK*#IM`>`Sli-Q`-xa5u{bx6I1g5~@kHFmLOEvwVndtf?`W9m zqsSN`hzy+DK%X0;BP1v1^i4?U6$0Q!RqGjVU%4`2Ry2W-g`ZQjfJ$6;%MeSHhD-W; zBtI)oeld~UEtW#}NO@D7@*-NU3CE3l44)_#k}OJ{6-!$XOT)v{#89ap#m+wz2ByS} zm#+X8j|I70(l|&lB^|8(ezR4^AoJIa z%nK!1xszG>;@L$^&+Ouo?6S%1O7Wap&zyTDIS(dtn#FS;d*(hX$$c@I+by0)_sn}! zlJ{;hZ%F*wn0R)X0@{vt4VV?bzTkO%x#arVMQ{9Vud{gV8{$$X|b73xLhxJ~7m zq6#1j5MBjhw+kev3S^Om@?M3?w+q##3bl|$x?V+w&#A~ji{r=}c&{6_w{O@_-EczQ zbo09Dar>sv)J=cntst*kp|@{cn7S2-EROLizH+-bd8!ydmQcJ(GFc#4?o>%W@^+Ee z?c(3J3hpXbAWLh#O7Gn+eK1wpj4XTXRrc(5*^8;NZsZ-h*PS=F@4TD3GlVQ3^D3XX zT|P5aK8vha@Typ5-mX}is$fX~L)pJO^D7UhDw)VCsCN}dX%)|Om4HNb+|V!4(rU@+ zYFUXIdG8wK(i*kt8ZAJgR@b}Mu(Z~6y4GBx4)0xOTUuv7UFRh6pPTo89;N^JO#kOE zaW}~OZfNP<3)6QaCGN#|-@8(JFM0YNAW={8uFov3&z-K%m$+Z#eZRQ$e%bW>N{NPA z?}mG&4G*Rpnk61Q_I~iJ^udei2i+2lbnnJDrH${V8;2wwj(I_$1@SyO|eLD0t)IGmS_NlQ|%mvunYpYq_jzZKi8evU|6z z>pTjfZq?0{q(OaY9Cv6upJ@V8J&2U9UwCcd&pn9GY!ErYFv3fK6;nJGc0C$}xb=E1 zOA)Rjl@f*${Kq({nz9p5plg(66@oYnq}H)geciTwCqDN%VPE~odUf__jet!F>Fm28 zwd0&}al?*o+_{#(#P-=9y&-+xj%UCzzSr-3?tiYy@s%KWt1~%*ATVAwfYi#bQEXnS z$FbV2{0Qu6w2wgJhBl}N)Kpc|dJo5rvdJe{h(CPCH)P<)5G{PmrA}w}1`R{czKR^U z`7d~ojUg&QV0WN#ji$(XA3~CFLL=wL1_!3|?1P>j{ zG2JiEENXEug7EP%{yBr7eSXuo$XaRS^pt$K+lAQoY3NH-Dz9C^p{R6-*J1L zA8yvOp~1o?0Ro`%Q71b4B1$|~Q8${%tMFYhR!;oxQP=S={AU_@23;2RtUzKp!S0I1G_KoeNlJ(%NDk4z_ROaljh{e}1K zS#l>xm=+*YZzW;#O%~F#_{f*s_f4ctNk8HtXruf?v;8bj{_NkE+_B}_DYY_%B(vBa z(RrGpF9T|Tg02V3g%Mx|p!Mf6TD~}m{yBgjgkuwhtRcGCj)OGA7|`i7=yB9s3}bEi z_?)Ty{LL>gJFbuWG^z1wvEFp4nzKJ1r>$|o)_VRy1F;w$9ZgjZ7YU_dmi zTCA01(sEqLt{d|C-^gQ`O|f2fohr|yIb+&1B%GG=g+0Ba zHO?(|8uhWOzh1Lnvv`SSvlnd?1o$Lv!;wCsdHJ~j3ZEl&Y%~uEg ztX+I<5FWHgE|}Vub7>A9a8Iq?j)YlNy<|^~wP62f6I||o6f>tg)>o(5MYR0H^YIN6 zFrNI`s-HJsA!W<0_`<-cOgktVr=;`AUQDDw*6*gY0cRbL_mfyT-CG0i0RECJgqq)A z`=f<7RA~-4W8iwa&N<;L9htl|PO*$(CGVNNAClDaw@M2yg5Hz|j4qP!w;DJ7&qhSl zeg8P{u3O+tvD}#Ao2&CWA>1HHFyn2WsvFwA((z@-ueHg?7iK@ae6hdDpy$dub#?yU zU3uel+Z9K92s_=baz=a5PYI9^JG%~gc&frE@dvTDNOP?OdL6q-9PJhBp^iCX7qiCf z`Q>S@P8cLLAkQSfZ5X1mmlZT*x&zwF(r1(n1qRo4mGYxXD<8Bc%S?qQ-9 z({;1BDZ$VH>}FN#tn?@@%n{p`M}>+$rK&h$C)ROuYQI{a_;LWeK zRB{`IEoU--h`cTL6tA!!Tx186Z`&Gz7xWp2mWSu52H*J=^%x;LLzT}rVPuU>a56d{ zXY!YeC8V~(?R!!~L^+Q!dZ`0->iGvUcC2 zki$9xI+4OPC*?HTs9X=rg(2K3{_9m_)!!iXZF$-I1)C-3_DFYC%lqPO`TZ3F-(h=r zU9&DTsV@CM>c25a?o%uDd$T7A+a$w%UfpT4s>R_SU-H-jEY1~&gx5;VugibHv?T;w z`Q&ruufAOs5Q}~zZA97;5TR5FIq768>Zv686r9-p3LD6`iYzL%6n1E519RU(QroHo zR*BvYbxPOwMCL6u`@wu@?R<|ml$UW>kHNf)fqGx9l&E^2Y3KIUXH$57k%T_e*g(VC zix&W$6x|bn@x%-(UcA+g`0Ie+l5B|vlvi+7rS_x{uj)D@-B)KOAnHFgv7-R#*91Ce zgc2WD15WkLG3evKeRbtO+xbM^Iuyr=e#;z=ggFVBz!f(E@1NBIB&Hpd?;l1n#?w`L zKFbQ`*TWwlydbf5V1xE0P;~9^QdsDT9sm>D^^?RRjAuTJ#a1iXvnCk_1WyO!3~CFe z!jz0hhYZK%Fj0MY>0)79_s%Wu=t+5*Q9CQ1PWQ{GAmn?FXt_E{_WmMN~2yZK!O#*;DN-Eo?liGbh)Uav5eTeNu)MxOCP!v`tifT=LNQ)j0&^&V=?dC)2KX z{nERydmZ~Px2|n|5j@s;d8!tX$#nuIF`cV-Bo8kLTh;%{B+dHa>hY#kV4X!59v$Z% zcD@J8(h+mASF=Bg7V>>E1A5`5hOvQy7cUO_{NA^R^6^RSC%iI8qpsbl58wcW;9H#G zS@6kunb%RWD)VwDwG?U)*6;3O{p6-}zJPCJ+d)ObP)|T?fyiwJ9svyyINwj=75-v@ zS*^}7I1vul!6^B?ABiBxAbAeK*{`||GHv}ifT z@A)q?x_K_cG%QGFAZvsF14`f$FPbmjtw*Q5GxMqh)UyDWA!S3zOYJ1H|IXkF*;{G+ z)%$zA-tkF;$NO+>&y#B)euR#N^W0Xx4>|XOvN~x zs4uZDx0RK&p|fTH;0vMpeuj9y$w{M zX?<-4-LqA52`-RPMiIaUxS+fVk3u@<-akxpuvm_`+Bb{>;J-0%^!qLgT(A0wW7h#I~?>1dA(D>PhtvQdw%^! z#la}&(bZrPAc>S0!70=Cy9n-ks9Y#jXCX%KKT@mTy2)#2B{9XBBjL?J#L7WM!drZJ z<_Wpye4)s~87DOPavZa~M>H}!LUzgGI>EPA>~>YXN#?d_&J{P2zD>3yW*4 z6)zhlj&-?MUFa_#X4v)3g11CGI{ui3M<}|V-M=aWec48qk)iYxe0~e8I!qBS$uw*? zmZhc3_g_UOz#K}*x!SCOUZ~#3t3aVq_6^VMh9#n)Cxqb4j!=;{!1&$FOw9{WEGQtT zEML?q1S!}^8-sGjuXL6$ zCjV8DiDzer4pY+>VU8$J3K4Xim=FJ5fI=3cjioJyxjY16o8MqYRIam_!ku%_Xey^6 z#!gR=Go1i6XB3(M&x^3gf{$Zt&_tgTErnM`iq>yJwT+9&?nSJ=Q=8v6oRK%Do714bj2A2S1-X)pPd9==tQ}3#p$yV~(8*%DBK>K5wguSl`)yf#Fn< zTi_6=x#4j|MPWxp@n}UUb*+Mbx&Q{jW zb=1xm)KXv8N;NMnIbB)~zVsvG(rV?UUj?;g%5uNgF0EI}W$|i01ao1T+|$Ey*13Af zH(b;&uCi90s&n1OkUI5W+^v*Kjm|pEn>yWJby%%>1Lu09kb0HQ%mOZGeRF61rZ*s} zxC)_l**b)qA$RzM6ZP`D$qPH=DjDaHoB**OT*sS{8m)=v}|A?3BOa+Ib~1q|q?g?Ev6#u-4h=LS0AYGp@AL zg{{!!kgKWNuVU*U+woUHnidYydbc-?vb8T{yXmp*4UWok2RLV_xw4H^5@Ijqia`SS zY)JF@?aj9Mz_XoDbxl)8DLk77j(yYA5OVF%CmOr}rpkxz;)g}P*1d!UT8mYm$6R}- z51^9Zg8``q`VfzCfR}QM%oyAg0zpwgL}kc!sY#>*APEO-ebIc+`NsN)*?aJq zj|E2aS_;F#)UV0KqZ7)*OV_^Y0|(Ist*Zs|@XGC@9Sx@Us+<@i_Q> zp>E_+;C}#wjWT2+=!V&Y+izzf%B#Bj`PU80!3k6j%%lSx&xak8s}1DCsknyn)69v@ zl*7vKdl~R}T*JZ2Om7+5mxSP?ve#))mj^mNI7ANl)^K@!V&5tX7^3|~=Ar3C3O)cs#k&&+>bq@24 zRyc|wJ9P9o$otn(h;W^b-kgMs)G$9OC{`JyLjz7f0HMi`w(vj=c%@~sygm=a{N2hv zp<8eQP!xK-?BajF9=OP&GRupA$P4J`CDa%Rqlw$p+{V=?KU~qvy=g);8}Ila-g9wE zS>eyFr#afImQk7t-nG;s?qe;HW355 zYJ6z&ZCIrb;{EEFo{Pjjs{kH(sAq5aexJMDZ?*tnUPleB?x(msn$CJWy#qcUiu|PT zAA|yW^2=o9Iwa)&e^ges=>CiU&B^k^!CB)c2U2&(jm3k8zReFCz1n7=5 zK0HkQxGex+&?3LO_vzn6#Tl;rI+F*NvZ42@5!vD=)JTeDD+XcNXzFf`O5-4Ydc@&~ z&(dx?#VS9&T>Xrk0Kc4lV7oanmL}`!qOA!RTL+$0q`-b){I2@;4gj80@vs>G?0pE8M0e%A}v8jJF$yiMOlqdYi71vSsN3B(~6aY{e=iiayFBGmY|kbzOs4CBu4!J&TBsI3>(|q}LCt5B3=k zyP`lIti39TF_O|xn*6%gJ>b*gZJl)F3KgsL$zEw-9NGtzKYU2(3%PWMgVMs1ew z^hx*;e{zL`Bpbs2TD=reVC#7B_Q6*_D90-9!iSRrR>X&8Qo22lN8a)rHKiRHhmsJj z;7%#(J1v&SePFn#|6Pn)qHWd@VwY(0^)F>1DeBQq)iC8D$xoQ2>&vHHn7x=PcRdbm zp^RGK!)?c*ubz&KO5r=t0*!W#z949h?NCj+2%S9fC>am`{1(WBdig<4gd_U(bzjv-+4?dta}5vfL$fO< z1+{6bp4u6E@%!OUK(at8uQLoP2TXL56=uk&?er7B#p*(7R{Y;x$CZ_qD2koZm&Bjl z3HR-9Q6O8%$U&+6HL2onv7FaX5+V|%nGDmzO^lKz>Lb9KVkGr9A2m3hSHduKPTX%ip{JHW2cFSyI^wJ~&aT_)+<8;o_L8 zj;aqoD^VGKSc;m)Wm@cy=qD+a@tvme__X@y1E1!2yH3A#_+mhKEO-QB^B=A2aOFm1 z*B_sR>~f#iR|Y`DHymnGoZrnC{;kuzU{S zNyf9NoWHN-cfp?GQ3u#|0*catl=^Gdn^DQv9NekuqWo;DG`LNwR8GTw;jK;MHa784 zpHd(6bL_s6kvq@H?O2A=43#FR3G+NzWkPA}=6F0-qM_#r{#`->d%fC~dU|fMb;tDN zVc4-n>$_rf;Ou``kn5-wxv#j-$SN&$9kh6)uSDnQ+0g$#^+eun z^*MCUVXGM}RAaWZJ&ih0T=O-Bebp_pKsQIh!FT69N}l_liH{49WO67-3UwTjTxxysEesz|cRrEnL5?x2Q%G06&|?3J~TI27-@jB2qe-teVVU&9`*SNf1+;C*&ul*0Y@B zc_?YWaczt9ER}rimIs0c*wT_7i@oa~^OR=z&+o`hyzJTt@X^b&-Q#C`rA?N%-?hEn zZ}z~yX~6!Bkfn&<0-?oz{M-Q5Xp&A|j-CDu*qGGg=LwCR4A}HarkTGC3W*6MT(v}5 zp!kfYbY`*odz?>=<@v4?opU!Y>OWX`0-n)}foloQQ#00M*FK3CGn;)hwA=m~!_7I( zOJh`T(u{6|xAOTy>aX8QCO|n`Wdbx!B=EC7$emCyPfa(}J@$xKr;*X%G?gE`M$xax zVCWly;-(8c_w9!tu`*_)u1+eNnQ=@iF+DG4xmmXp!r}WiYw5%7zh?PVBWAljbdp4l ztMAjP1K~`vB@f+{7d5@sSc^-OH?CbfD4i@?KHm&KS9b5=7KB3SX)e;<=J;Hmd3}`` zWY1E#i@NK|*)u2*LIM)wd!rSU!8a@FxQilG@^M|{+g%y39{3Ste39gU z_*COzJ-bOaC7Cc&75y)N+&v<2txq?}xq!+&pSj)^FjJLtdvuDqD|S2VY zR2~768Sp5*M~F^93k+`uh)zTjb(+vXbw+@1Vm?tT{1@Kn$s#JF$57izuG~3n$X$C( zUt29xCPCM4?820Vypk`J&#WumMTv9e0kBR_mQ@Z_5OrUpb9WsirD_SRuugIHyKX?v{W0aO!icZTiMu?(lZRo5h&?+89`(cv;RK1tH8qH8EM~NM6(80A7bWy>CYbAwhsxs#4KvB16nX z*AyehUs2fiMS2i7B7IT%;xUcasIL0<*AE=q+4dN?~Cq{W* z&ze2H?@XVh*yy`L8p+_P>x#s1Yy#|6?_sq60`P&O`W?UT^E!e1IM@4Hupu)s|qfu!(<#>9v9fni+Jk2~geDE3fzC%4Z;J+=O~}dch*W%Is81SA_0Q$>VLcXHP9& zB>x9m+att;;Jh6lS5&2&csSC)-FUd!fsQA8QQ%FOahkq}_Rzx)T(_LsScAb{?U8c^Is)WE^xUw?aOjo@KfijnXzlHK*i zu?pw)yAOgm!+0LemO-9S=s;c2$aRaglzc(-xW5Ubl*}Kr%#uJfe+Z)8Hk!A+dHGa6K33M5)B~crXWY^%ltvOc7k+xH6F22+r zTyAM`)UrWET5B+F{k;2fB+?KSB<>w4A#lQxZs_BVc43jn6zuY^LOaD?m{{fdsHScO z3E0c#+CPLDDIEScob~JUKZM$B_UEVKJcU?3J6h5Wb;_5y5GHQ+tfMy0yB|C=ljC)@ zWuho-ar=QsM+&oJqOR&Y(l050t)SM0bT+B_*y4giqAVR09G4`oe8^ogH0HOsSHl`G?3unFvl8>zl?9=ZllSPZ z%tpFZOh7{=m(MI>>&?RQ)wP%FIC{6>zh0K-+ejjHWk44!%vx!I`k&5m5w!>jfTu{V zQq#-gmDxGJ)@jiac)~0?uBW5{B0732SuzbL|Rri0tVRnv;5D7eK zmZ^@;&El|B92vU+|D`l3??an+18o;n+cL6%U=vHERG_y^*a=`|o3I8H6qwo%`Nd{pHfgYYeS)f~Kgx1I1CilOjH7+pj{D`!fJhE|OjC2989x3Lv3KfjNzB~{ z!+cvF^q}cohV<^?xA(Y|j*n-+iB0enG^FGh+cTerXvsq=*D3+akleh)et_V+u2um+ z$_1W3V>U?!C*s)N4fL|0bJY3^n-WyD(wQeJ;Bkltoe~-~mIGg01ZkP%CX!)JB)V_= z`lF2Wyea|cSP-G_?u-0d1m@4@p6@l=z^~ivOrVJ?XRC zlJ}f;kh0R7*tBa8i$%gWZ-nXXY+nE%4&kXmzUqsn+lpC-AcZF@5yi9Tv)V=fiRf;& z>@#nH)~m*h#M6cn*&C`$Zx<l|1k`cR=J?oNb=3gk`6sH!;Rbf z>SHvSh0k&}FKx9Hk6`@{haJLo={Pc@E7)&GV6j?-XU!3^34IcWl_p|Yidd;85GQ4L z0-_N~W@TWBHU3Z2)^v}FAS8UAhhu*yV!OZ5_RGca1|xWuA1B_?tCL)tiH01Lu)}BF z14(qn7#5(D6_2Los*8G40C`9nG=o-Sh=(OfU@4OIXUYu3`-mNJ{l0mv92ZJHhEl;- zxZq-2tv$B2%K0J+2O$Gsd&Ot;yX3oj076&bR$q_4pza-K1~l@9(B}eNKzDZ*T$3{d zCt=w}TDaGlkfe6jRh7Y9jK+&;_0at12nq9uhwNLaf+(4hj=Rz}Pb7Ohz*mgbAD!^SC9!FyS7O9yB!Lm%?N#aK#62N;bJF;Ch*LMeOkaaIx zOby4u;rgKoJra4Lr+O5q)-lgtbv~y1H0XG&X8A8x{B)_dK%no&?cZIQAKdeM0lnY zdQ-e%<0b{%2Aj>UucBVQxiPc;CjZ2%MF1B+dq>fi8#N0F9%2nY*`GVM-*BI4*@Iq1 z`8tHjYa0a1bm!|Wn@r4RbK^O1V}g6h>hSxH1D5SDfC1kY0AGs%)?!Dh+n|oUGW9xu z+w-E}CN(?-eihxll93KEJlC$?j+$eQ+y9^PLgJ79NUGTx@rJ3kmj3eD2 z2@aBgGnCoq>w)o~^D4rbAhS1uAu*<*>ng9gnaj@hWxEvoPtL~eyl5@bZiySX`SSh3 zOqky9H)+9xzNFLZdoEB`S=;i}QlzY_Zvnn;9p!h}H(d9;E}_y~9CrnYXq!7=fN^k| z$AQVc%G05zZC8!$)7S3^?D$zb!9gUpyFUcb&dQw4RYK=}+Nhc9w&&6SZJnXcvWA5s z+`$jV%GVf|bI%XHL}+pIqS4KFB!IYfHYB-5wj5_3)X?|^I*dJivxVk~fVcjErxxUH zGpR}UeX8D04Gwr2tW`Lk-tH}@$ga{1i>H(uiaL)a-E|N_u3``u3vzGoK-uL(?tW1S zo*}iZz0{AqNHURm9Gg3uFQ&y7X`gxg_3o5Q-;`-fK!A;cR(@kmNp2*iSzg4-xe}@^iiZz%&*a865a|@^1He z=+=J#v@Xk*T&YNV9*LcL=onJ<0YEs|D^C zw$2XpyWl8$U~F)+m%^NC*eTq+^qQHBoK2zNy`+BH?;v*dDxl@_=N(6`oD2{zilJH9 z6Vl%!1d-d1jA$nlcnZF3-zj#!>!H8D;qd;T*HuRGIP#r}FFAOfh<3II)svOuSehnB ziX=0q%;)}zhy2m7@{~Qx-|^_c`Ah^Hu&h4*7W^rOkUI*y9StW1shZ6mJ=RpDf@Nok z^Y;6d#ZeAflQnB4aIyD^PRFo@ltS~MFkC&n`pKCurP{3&M)hp@b)oJr9f?ZT2mgEu5YUODCIZ&aD+qL zls(xcp|)C2A5$Y%5|6A({TjNwJDgbQo-ta4zgA@;se-@KUs&H z;-=F#aC4>BmP-t)>g|^LTw7b~R~5S7w*FkQbSPd5GlQH&HoiX*9c0}r0d6RVJJDYD zeCDL!LTnRmb60^1K_JukRTYfp@NKBK7kk~7A_~nK@ z%Y8BNzIw&}mo7&LSGnb^%T|tEO_lx& z)8^7+U;pr%k9c#<;+>PL^WGC5735=|{|NKBcK31*^+D3s#}zhh0NDX2E%|2=Cw1wL zRUQ!s$@%c}ltb(;3p&@+0>^`r^Nk8t;$nZ+T?jT=eUFmDxOs$p*%( zdTJ0m9=pd!KS_g>$G+9#u=|>NQ(odMx{eFHWzVvS`Px0ptjvn`+_a=lF-ie=pHV9Q z^flR@Dlr}W{!$H>+k%5SV;x&fR&yg(EDo<;W&d*d_eKSMLTcEbDOqQS;lFYneWzSH z)Nyf?d^Rh4qxCv1j`m-jX)gcVtsm3J`IBHu%;-1sVvSh%KJM>{<;s<0;2|6<%>?d1 zEk10Ve_P)t>5riL2|E<$;ppu@{33C_wqouNcIq>!12QTE$mpS@= zDxkHhDw#E*4NG{}t^dBMZ`qB}e6OVb`rF^+ z4zp`!r|*Drf;Z=PXa0S0WYZ`1sgKq-b|+^EUevVgp(8oqjtgKb)0W4HH$M+sXyaSl zWG0$;y~5AOl>=7+BZ(GbpO*KFl^DksgGG>bQ=ovV@(Pa7aQUawus-CGSE%lUu#TOT zPW-2%zEL(JZ5$B(--vVw2o`a+;412U;$Ie?)kjqO)_A2W39 zZD;CSW^-#RFxWNW<9my@Q;czT*vjz|a?=s<-IQ-P)s8PdhhB=Edqcl7BWc#Ofx*T+ za1q|8&2SF1A_r0Lh4}9VcUO6_6|IR24J&o!1htNoFN`a#i$TwL55FYmtiGOnZkO_n zdV5pi{N%30)X8M0d*vUiI#MSYe@oR%hr{V!#&{|CX;P3s1#>A9vrTQS-gox=1!^a-9QP8tY!N|&USQ|}P>O630 zf1t8@`VlrHiagEn#taP+wkM0NhJDwjiQ5s_8@yq;yA+FTObqd>Y(YHciw=@FQb*k~?7CJ3u zM?7=8Cle59izLKSt8vboZtSQisl@hstf6XC8xvf6h$Wy_Is%-6S+(UI(-|te8G_(i5sXZn3gY8)SI;~a~wRIwA&^j8?e1~ z+`nZ9q;rILP{D#@RqV|4lsVo%M(!=M)fU-`tVahfmskmT=d{|MiteDa*ZC&9U4B3L zjvzXHl|(4CwOroSzQXs&3!SN87DsZMD1pi#*JDFx757!<`Je${B#df$126CPRTi@O z>a=+B)%W)Vzo?>RFKQk*HTTfrL(cEN4&!u%b@%iSv{P!Yf^5_>W71rz3ErXQ6%k}; z-~8Sw?f$4qNn@^xEy&_RDQDUB$>ya}`>odnefS$EUyUBED{0iSmK`>C<07XyblWwF zN1t{=dO3Zj^AA|wX`E`5_}29)CZSI|-l(w9O=#5cCb78_JBLI4o{DR%$Amy@`9)5U-+#hkm_b#SwJJwH2Ku)e7MO$DGuy~MgK;? z6rBmE1SDu9P{t3E<+R84aX0)F_o3tkiV3q@H~Wy8X43=(swKV@8!PShh_zA*S@qXh zk$^Sj3C-$SB|eaTzQg-Ebu}5V3Z}5mawFA&%)5Y8pK^p(`}uOC3anx>LLg5ox3?G) z7}fdujrPeb&J_Z9(jB>rrP4B^t^&%*Y(vbH$z!MC*3#5J1rv~Sj+N%90Q+=e`&pZ7 z?w$aPYg9C$VJ<;LO}>e9a`eD`C7|MBn3xruH*AtuoR!biG5r5CS>3heI-&hKw&T+ZU*2MWhozp^ISbFzXp`X2Hw`~7vb+XnwISLo<^cJ zvTe!b^vZ^KxTxasw#eoO?guYp7@po*OBza4_m(LA!a}xddZnq>7!dPjRtQ(szv3Py+Hgh(BVb%pMi5m6CBL{fXuE8m#)CXm zQWMbKc`3X@6y6fo9v`EZp6fI@p%~FKaXctV^=yM}uLkV~SVu~8dE^PV_+@~MriRkr z26gAz)cNg$}ana?Aqjs(gA>o{;k2@U7>{6+U`zHwEr>>%t)s+Y+o~& z{X{j{9n&p#$n=uk3G$e!PU(K& z^tmupfF!gH`0%Wki*rH=n=y~sO3!E zetlzbn`-%u%%+H>pcf%tTdjM|!mKtmO1<2B2xZxTm8&PUFRM+%j5~E+?hN>g%O{#o zs+?)>@vfZXZan((ziFEM1j2`66OK9wF#w$>dcgo(y-n78aQB+{9wEG^#kpC5zsObm6V{Q%|JoNsu2B6}wLh3jubW9i> zpRcF>uN+&Z2~pw6n(GF{<0gG@;9T*4Yc{`!|cQ zb9CgIdo0@SEL$;_L{H@yR{xB8tc`hbp0){;esmQ?I4EXVRs+L3O^O1z72`Lprcdbe zCo5y^Vh z?nJR8GuCGyqX5;rK=}v>QR_IGU<7I`a%ig8IEn_E%m<)?y7Z^YNdn#Cp(2+c4n|KT z&_4T~?b{Qfb0^yOIQ+&=t**L4S zfdtDiGYb9gnm>8Wl@XugYhT<eODk*%b^LYShERTS z=CXlG;y?Zq$7FWctOshN56onwQz`VnWxs$)dxGr|khLwkNf#%FyLVRA9H{orxCs<+ z_edZ$Eo=3C-!}K9Gq?WCI2e7%J>upYhu{R|gJPw+@uUKA!E? zU0Fw~IEiZ!+Dj*Ncx_ zn}o4ek`E}w>sK(3_6l7_80QL}L;9FoDVkJIq|p5jb4*8IHzw3ClLOhA$8wi2R?i0J^qs!8y!4a2BHCI*+QXmr2~D%6zF8mXgT=(8Hx zGWr7%lTQ&I!$@A4pwGoZB(#e=&*hq~2IhtLzu|eRItnyj4!#?}zsFrNTHj@`X@C8u z&hqbro~SW`zGHyR0^KaRTW48-tp+NJ1lT`7*-Kr~ZX!>BHR{$ISHi$Nj3uBgPo8V| zzuPiBxpsEUWKqq38lXo-GK{ZH=q?MaynD1gLFRz-8c0u6wm>(TVdmQFr^^80$|Iu4}d$f_=+qje4#^^3z0oo9dg%QIQ)m=Wr*P9oVTX~{H z1bzIoBqNXKU4~Z_yRl>R5^;o47l=IZ95p|wi=k_c8=@SkyY#!rE}$xZM5F=QkkCcY z7k5u8dSI13u@Kp3rgU5(#*>$|Qg&eZAPcgg8vdOgt=n$>3BA^B$TL>kzYCyF>OLnq zyE7cHXY0%xk_P}uP$qp~-Mt8GQqewSus{0B{*#*y?DE=t+(7ZqBuY#xfrJJ<(Ns)+ z9Bl825>o++68x9qnQfxi!KG0}B{PPT2+WM34|baSTDWOuEvC|d4J>#0~@X;)L&)W zdS$9Y?-4w6x(l*~uae&z?}^;0*BwUe0st|1bS_W_ZNku+kuM=NuuZ#4z+R-37XgLR|)&+XP25^hsBh|KM}?%sj|3 zDgD?~`n731)`WZy;CVOCBgRYEzR|Ot51)@FC7V2P%WVUG&PMg3n)nD$)4*atzh<6% zEFWfMx)=Ky7HGPj@EOj(w5OOKY2k&U@~`Z{9`y&B5Q6*)YfWnEoAj%hmH?({kI9Zd zL}^s7G{LxQ(WFlOTAl8-eXAz;uYxU+j16><#d;V0%s!~%AG+{>0P}jG}E?eD4-ZGgMiu_33Vya_oxea19PDR zlBm_jH(b78+r+5U^+I8pR(~$<;nzunn*CR=l00(HCDTkR2Ja-LQm1{ zr8~mVObmq_P(5i!0}I2cy{HzZo9J~w6F<8P>@s~KpdD`j3D}lFP(TDZLP(9)d5Ro( zn`y7DHCWhpjg;G@mpSO&LXf26eb;k)cFiy?D-8s;6UNS7k-MwL+G!0*(Bj?QXgK?6?%?)kd66bm1 zxCj;r*kGM2OW$rAH_gFSil#)r&Y+uRS)H?BG7Dgf{zMWKpsg9eZA z;hkEj_00?QW>mQBlytCf?zVh!1yg}+@!1_V_3!K2+2--{y|!u^nx6dAkZ*jC+>4Li z`=|8yH z4rrpDBTR84!`M#<-Cf6)(128-9a@Rt>0$3nwEh!;N@mz%D3%zCF@7fwDYTAd+Ebet z8)onj3~3GoQ;67aN!j7gx#qwTy0$39^Ll0H-Axnc6gYz9IAPB62fJjDjLmGv_uxf= zY{;*y&3m4#R}rl_XU#+x6l1KSqlm^`KJ{3p8H8w00UzSgtsp8c?Ju{?j>0`b{}PGT z>GQ;(>-lfYebRHc=gOgH0>4rV}5pVMWuK zjsvp$Baf6XCFYJe@aS7xi$8mHJBW&$n@Hh`OxK2ie7;9zw1-m<73?6nWG|)5j|uMQ z3r+2a-cj9dzT;tN;uC9#deEh7%}mE-Ujq!smE58zKJPRDeuzh&I?HmK9(PQ642uNM zt*5dTTp12MLi>$Hi|DJN2ZgRhMEhmX#ZIr47U_l z9|y=FDCS(ykPioh`!k|H4R&kU`L=84ShdQK{2Xq#ebj*;`D%9>d`SvnU>h*aycwik zEpW&eo)6#WZbUTq?$$K&aKeJkdzdF43vrS7OT7Z>w(LTczj+$8ZsFZKik=L&gG5Xu zL&m;!+b|zyZ;HPLbm9rE&51iMccTLN)&t7w9Kxne9^eI`^%&5i3oL_LBG&Qh@e+nB z1+3Q|;$|*`o&w{JomcSecCR2BZ1gZfG6tM?9jo|?b@lj?PH^cLZo8T6=IWv0?s02O zK!s%!Z{x1H&U)CY%I&(906Tcbf=oDaPH1@W9SU7VM##0O=7!EEv~BA4hkF=Nh^~>{ z+A(Ye8ecujKs9#xa}1GDtQ@fbslUMNK^{%5qC8cJ6*i6dJLR7%rM?4O0QfpF z;0B$WPM#hRNVh{a^Dy8&PfLinxjow@9D@0E{=}R{;00S5Ukm^sHdPj0Z+lFlpGv1& z4G4A3+uh~`vm7wb;r-4}ZPkClM-LMRgH8uq1eT95Z#!1*Q6gTQ2bhe3tv&hM#b;KVy0yb=$q-L%5~&E%S&G@pF2JO+4cOBU(I*A zS)@>B_OanS;ikWGdO9tF?;wshNl~0=b~U0Q1TuC91Ghc_N~^wDHbyT$d1V znqVnfXnOA1d}mYA1>u(L8Yig${)gZwE^?$jcJO4BIt{{jge%L0k0dby4|g0BXyzVv z8p~OV2UuF#J8cNzm+Rc7OA8azm2ocF6d}Cl*?98Km4a&Hn6h2 zVQY{L(r9(?arA5?yH_a)cC3M<^WIz!Xu zbl}>WC0i@;!!%%aUp!h<>+N*&9+C7ZD|{s^E-S)0^ zFa>?xIdi@!<2+Q@+*L{D_xICZ z_w*`wPwj9`(u|QvF=N#omdu%z`lXqg`vfOE_2C&-8q@J)eb$?F!>?7<>MmyY(E6WL zth0nM{IYvkb7>Ds?up6NRio4C`bEkfd@|IT*8jLW6nl^$RCDGs0ib(4#yu53b1MM| z0PLY{iEcVls2W}z(5HE=jgG%FB#3DzHKb?Zh0x+ny9yAY>sMOh2idGw=2_EOq^5aWm{+tCwy{*y2-` z%S}RoqIpdEv~Jvckx^|*@-?fbx!X>n=zM`{-n8zf}*1^#`?dS1Fm3B9I6l~h! zY}IR7dR+DM)wQn6=LW-!!nq2eN zN!l|RcPZ?TK?2*RyV3`fI2RmkTl?PRs%~OMoxzN4@u*Kp>zdfSc4Xlgm0ebI&}4cc zg%N%^&*iq?UvAuO+XEM-w&j{`qpgtxkg?5GOeXn?r?Fm;( z$dAxvB6hh>F6t1VLItxR7G#is%3AMn{ z_7)q{T8q7h`?@H9iCLTneOg5jDcQ* zJ00B7BccM;?ve6hQu(kTh+(-@;9(RffXOVk8(-|0+QO<+*vAosRJeNJ_gUqaF96k4 zN+4!|2`rsJK`MeR*2 zB%H@rPNmp3oD(3yzU9EC**4s+bJzCWo!dukt=f0vq?&g`@o7z;X@<&3(x!+T`9ZBx zs0J@~lLdCm-pO-dHOJ_iltFWHMR#kR+FOc4xFE}UJoMMJ-*GpEpm+Jy zlmVH*FoC+Mb?%8fyU`A z-0r27TcN)g5ei$dkLzvRf33xN-D?BC(@izq%B&n<@HT38aS^Wjj_h7^8L1tvLjchX z)w7*OjrG1>9u@S!jw&+LvO=JkDibVe4{(8aIp9IckwJGl%p#yU$%PVp$-_s1!6G z$>3wR#aF$k`LTSJ@V5;+J+5+Kwrzs}J#RN7WE&o}QkqHwcb)|f7$!0lk8?l@Qu1qc zaf zA}@}GqSHEt4%ulzCY7E}|9CK=6QA+?!Eu+_+-8TG+!K5C$CiJj?M}sC(C$I-p$_e; z+3O_f^&6p;>#3_kecgltbp|GS+@HQ%Z~xjmkI8WEOo$>r@-0U%?4f_w56%bL$SHBLWF z!-Jc5*Uas^|LbLIZOV=KnlFd$cZLDJq_mdR%ttx=9v!Mpy?d)>;XoPz^Y3+P$DM~z zDxznorZ(;2x0-J*`H%(z{Qmr)4;m?H1rSx9Q+Qr;&L}S=cdjIa)rE~ZH%vfE@ z7>uv|&OYF4v?|URN_wPJW}^Qg;8NyGrN4@F%HJ>HdRe2-Yk%Cm|92tbQr4Sqgr5(8 z{{2SR%U+*Qy0qHs@Ne;iUWPjov^Kcy(V^%&nV)xG`la+-FxGl0XCaG!*z|9%Se zPA%Tb>3r$1zBY8})XJ?(e;3l$e^2O9*PdVcw{m~|@8Tuu-*1=J|NdNG2jT!w3P6qr zP?Q2xa6mN*P?HDLkplH`GFdmsln1hqf~;_0I||r|2X>Q!2{?!s1>(np?36+RaL|1e zXfO|YND2+d!J;Ts*fAa~P6|uF!BZ&k3?4j33a8@`c@$aA5>X;Wl;h;iQRFIlay3%9 zI-L9!ihMIq{)SY(6{m2QqR_!pcqmm6;E=r(WIs<06kk#lM|q0xq>2-`b<_+6 z^_hoSkfLN2#ubXv8c*r349IMy3{6m$YgJZUq$;aesi-BWXf6Vo<0@0vRb)G=P-Rua za#bs<4GZ5?@?`svcto4xaovCoeytlnmu$F$RlE)O;JK)}b5SjP@ult%;v{}!A6>7n zPH})NpFMuexphN?6*_O|xo#`Ga~!>@uX$8}yf&^{Mw34U`Y2n&;?d;s3FuZUZT$fR zwU`EvCg}BrWB3WG=`?tI0>Trhkxzr4?S>YPqhF2xmrd6F)M`9iuB*4G`(;rtn+tyh z(B|nY`~#}4v}$D3WA9q&t1T54(;#og)sNO8PcEXhCZNS!xZ^l_oUp#paa=xeT%mLV zgQvqOc)f)Hz3)RtYgX`AhNDYC}pc&c02|7RwCc*|w$E!$eR{5QOX z$%i{9nBQH}$ir?CCL+9BAEw^ky0El$(b{q)(Q@s!<=-VspbZY1gp;G*!6|;nsn}Sl zC0S|SvC{c&rEg=sDaqROj(qZr&PC(HFr5^YWQm|Ad66Y3Os zgpInY+O;&hiE#VYI>q#I_~r==Wdbu!z(mu*|Hd(ZVV!66bxayo!4s&Pn}qlnfVd67 zw$dGsPQ>KWU^0_PGnI}h)mI23Z>2J91U9a{Nv{2OTnE3q4%xW9OmdTn3*LQqoA_=W zH@)HEZTE#c?mp87cgE4n|F5|B3~K5N`*xE+3WPL}9zrOB0wOhZ2pt5GrlL|3KmkPw zJqVJ74pKr3$TiuG*-AYZ|FC@5EwYpcYyVscPyOFT(cI&>o>-+ATc(f&WJZkmmUiaYc z@Qkf+vBtPDn$)z(ChiX~qY2nCmJqu}G?S^&*_cr<=Sj4XU@#ViO#!Kmv|FT=R|+^Hvjz_ z{ywG$4<;Tw(snRt;~?4e&~e#A&sv>uv9Mse5;dNX(sp=;s{&#`9qy~omqJ^J*z!`7 zpc*@|9r8*H=*=>npWGc-Qz;tDNYm8cagF650H`h|z?c9D$wY^mGCyYqG>ruRC%}Su z*z25~e;Z*up!}-8`3F4w(*>p45eca>84JASIa3lii6qfZLTr*S1hQ-rS+Sk0vPo7W zgziiV-Q6C#XEW50APh523bSYrv)K%@CxkmEg}b+h@81k}-Ne$0XLM3Icxb(D3J*I5 z(2pYMKHw=GFai@9N5pm>=01{OSpiIeYe{W5UA0H*aj*u zj|Qf&M2bE@pb>bw&F=w8nn#wamBz8vaH0n^7ccS46qdzuzwG7>{Bsq5nH-^{3(j_NqB?*8eo%ID}h&tR{`!Cv1NB6tj?=1r`Vn)CY&OI?4x zAYb3F7lL!?&R;O{+x8(}-)fIY&vaZ$=zf^W-Ae5@OM9N2_Ud8U+pRR(d$V&B$>%;k zJU6p-?yFh)f63`f57Px(=^JLWpUJep4{5+{8rYmJLH!?}5oVh%YtB%lGE_PkYTJyR z<{7)G8Lr8aV|bOWvUvMWU^Udm*zDZ1DR?y)JJ z0v|}V0GOfH8w!bmQ<@})lC8kDB)^X{3X{CxHQ58SWVzKH%FXh}ZqJC1jU7*M&~hwq zkHOKXMH3yuqL14}Gv>u#sm1?w6fbQT3(QM4s3kwCxN3ank&6ZYjbvWuNQzfE;bqM> z$fb&k^4Gb$LXu0L)nHC+%d69+r_~g5=unWFWxk(7$&8p}f`)GE@mv;qC`r79B*!C5 z-we#qBiJ6PW5;!23QRA;x&V{YF{U1$5P2TwTVI%Abld`HIZztm9UfnD8*Nm~DcdTvQ))1fU*l1{%QZ{j5^-)f&@dEY0?^i45t%B7WCcomi}E2Z{O<9Pga7Arz?CWj-XG;_Pg^3IJ;ObZ@f5sFJW`l<}S zC)rXurBi)=M0&}vr|YQpb5YIor@iHM{GKP1w?6(tXL2B80Gu11bz4EJP5$W!lMcD_|Nk{DKEO^4h@@1MfCRvxB zLa@CL+&K^ZSy#YWQ9Dg7Dc% z&Gx&H7Cv$;?TX9Um+TIm2L(?3qs|Wo^d8%-qHVIC9M6(mcpTkuLY!oe^{?rq_CYpz$~ol2p>qf(13RRKX}=TS zGNa`5$2A&{+yubI!^JZg>DXzm3rP`VoeE_GlMS7C^uqF&Q~J4Z6o9%o5@m`ZzUr>tmC>5? zbSJR4nuRpf_2M_>Pcs8g+`6L~SZQY$HcPJW>QL#Nn2WXsPho=#mKxtkUzr66@zb z%Ad#3-ap^EOjsSnF3zYdxN@WL$|Aw1?~l8%mz8O!#H|}kY8$T+&+nfrn0RyE$@7QU zQJyTMTm7Od|SGGY~7kDtHz$^{dQ|k!Xv`1Z7+6rmg|0Ub$Y9)0$A)0 zqx2A5cq)C2fPkJae^c)s`qwn6@&jwJf112q{iye2SMhnL^ivaC`&PF0 zH6cG8?V&?D>_7JQX!q%ejpLOMeKcGTe$f0_-qQvYkn`oLhKptYmNu`CnzY;VARKIE&KjOb=zP1zuS7r}_r)Yw` zwSD=jh54c^=CQp-R<`562$Zm5OmC&TMnto`va-;Y{^F)r^?h^we?{LfG+i=J{2*Pl z{a|R?GXCXe>vrw=AgdIyd)3eF9rqi@EwnqI6vX6WnRCtkKPtj%1FrbJ0>f`fdYnK0 z;m`}gp&u`wAX>Zn7ZY>7<{szf_yi5mT>Di{%=gv!s>M3ho^rUdA>>YmdK2Ooy1E^# z3F<}mtAmVn$Q>=GF#ldgtzZRa5w|v5s(WeIEHr%A^W(MBu}*|z$8)=%-=C3vSjin_ zy}qh^%PVn2`ZVC{{`auG-OWpinB7w?G2$|h#+&v`5U!O(F7iQ*Y?G!VPr^M2w4chm z@^#95R5tg^%gqrsBaOA+SUJ=uj0UgoO2>Z_}^c$LNpMMl$&X>Uv?S|M_> zuLj>C%{ChRWDxU}YyRq@Ok_W7c2MSx(c-AszT)`P?}{riZ2(D&B?ApFn@%d`zW_o5 z+0$lDQ{%O1NE&^g&1zn6kbw&vqudI^C>BCkUq zy(@k3B%2ZTThN{#4dsOvv^7>-AN0eZ#vAHJc*aTXxh@Taxo~4W!x^b49=2k+iz^M> zHBTw`v3X8$mgei#^V%nAP5<@d&GcHJLX-WdAlH@Nxe8Wg&EV=E4Q*e5W^e=#f@rU+)AGf z7@>=kcRYpY9xF0&xYX)_3a z3K!RGk2LhLM{=pqT|JyqPE;YpLPQzOG0d7!cc+1DV5b-SxOm(qD)_n#@sk`SMgb>UN~M^r`{gk zQTo=f=tlBSgB-^d3Z!HxS}cm_Vu33KdQXRCRL>=+Twf@J-38pFd-5&hupf>up(56AnRhcC_uHpZ zgj=^7f-dH4ol%;@9vyZoP3vuYS8(3h;{Usy^=MYIO%7 zD*$BgIdtQE%J)#Q@ZoIpUB;+br%>@2{1Co*cM)coh#cy8W_IyyK8&5$+u!O8Z$KA% zF40kA8c}LWgJRsbh_}AHuCzQzYLz_A4Fm0eRHQ>h99Sn*Nz_iV@%s~E&5noLM_;WBZ{_gTU64# zWUDtXthLN!93JW&5(c=fd8jCq#9+DL_Da|Nq66Bb?;BEcfN@q>z-?}Gw75k>ZFHW9 z|0Rm-4tBU6HqdE@P0uK8@?DJ7eSihGN0pUXT->3B47c$xm7Y5|3-7umYNR9Y2-(q^ zBLK_OrfaS)`~_G9KW}Ca!QfLiqYm?v4`7%woFGSA854f@QAzLHH#udK>9jzjM@;XADWkU4JAnUvHPvecr% z>3n%5uZV^$C$;%IrxR2!T*x`p8NK?NMCp=YYe zOtl4BOh0WW%1;X_h|8MBqY&GO&rC##H!S{e^0|s+hzr>LCj9CuY*Prxkeka0Ai`JC zN^TC|fxh&^H;`9grYHHp_Zo;!lHm}^eQE@mZZ4q=a~A3=yI_2E_|^08NNuf8@MY@X%MLQV+NHETK^W zY@obnRsXhOxDTHRz#^6iC5;xlY zt4Zgs{e(o|?_;yk8dOcNxet2aQvBrTYa!6+{c)65a$=h9!xziuK8Q)H{ zudtA6Z1I_Rq!%hL7@|h_z+iwOuu3e3 zEwd$IJIj$Cjf5Y4hSWCz{aa7e8`--cWJ{gofzWEjeo4?7o}=e~fgzO22%=aCpk#rR ztZ+X_RzmVONeVzZeM6kuy$bvXV>VaWtkI=HXTa6Knm85&8w-K8K&?Q=Rj!qp=t|E8 zaA7HohCxes#X&`Uy%m078bC%fst|VYB--#$HxHyHhic=Oh4Z15g7O-jJ9Yc++$adO zvSY3Ny@U3$;IVA$=qlZ05^9cey!os94DB6UKMYmP_P-DYw>35vMxdM-#?dlz8pM6Q zOqeT4Opz_MIb0k=f_Do!c+fs|O%P@eT4IikY{!e{2-fi4TY0-mmE=3`4Ua}ka1Bn! za89u;VS^-hL>(y3`&5+yi{8s@XL%_<0KWFKOJ>1c4w^Z3BqehK*Oeq1^R#KV$Z-4s8=5u@Zv`B+u7qXd zjq9IDFJ3;JPjt}p#cUZ!#gU|J)*ZXiRna`Fd6r}z=FD$^g2SomAr9orc9S|zF{SI*k+9>W#?o)&4LUvQ6F!E zSfpqgs1{k8udAE3H))6Yz(t25P&Q;B;Wr;CABJL~ z66#nJqP-Fr`P|N3S|WD}`7#cb^3CZh1*L9g>gv7s^kPH6H2n84(so*c^ep{l`N_~V zFu@!4!vG}_elrR!`{3j=X(x~Kwa5-ljAiYy<)?N5%(-DY+sR#X@YNhls)kPN>?ws@1X| z8B&`DsNLbn%C8TG9U;92sCPeMpW1+)TfJdVp#uXV9407&qG#%J)A<)_vf`D=!+Jdj z>37B`Ha=j2g1TJ0e}c3#m^LhRBRYDT4b5j08cn1=cS*gvtY|@jh@gt^!u0idPQe%J z+SwhH0#TQ1|9t&x#&YmP`R{qnoSff?U*sFbQo-hr-+c= zt2;3wc5Epcc4`ok&$CG8x0nMe(&&*IXAAWxkRy_=FARYcV1a15%k&Q2Kpc?SScIqQhgGhyVjv8f7|`3A@LhK8M!)TLwE2J9I_!VU;$`+H4hJ_iqP<}|^g~2AXo=v{nZwX$ufB;RB|py{i{t;d zFZi2X6{HjZZ#951K^6IYs2=xQx|bF+sPyt(cq>|BwM~o}Jb&S}*OK2f4dCS#2W{X> zS|WM06BGA%JoGhLX|I`V(FK1Bv>q|hgp>P*kxrns9Shf-VlALXge%58u8MYh_k~RJE?s1)lkOy8uuKd{ayZ8NF z>#rdCS!1Qwco3|^&R{gSRk5|raHC6Lr?>|6c zCE(a3s@+aaxhGcZ3E~*LwViea@VzV7I>hWYRFn^hsR)-rP?|_?clI0Tw*V^ax3!Gh zXZJOKeRNfBFXrZ>B^SGO1tDrNY}wL?qVQyC`=3exk&h9Gpw(xNuBj~h$*9VepSq{7 zPXq^$#H8QUyFQ`$qXjDP5<%`Qf!bND0?pl)hNY}*U<_dcOo<6HYAH}FKy^3m^P2R5 zweO)gn-J$8!JC6XSy!RAPid_N!*1QJ<>$czIkJfY_n6B1$_B)j~1GV1S}>sl{L zw8r10$CQa>@{X?XdK%6Ry?>KFXIC&E^6xF}??=`2F6Y1B?F8?hXiYW$4fhouj}u0N zgz;stHYqfh{YN8Um}j3Qfmj}|8Ln~2LGAR?R1lCH3uN{L_f-l)T(j^t#hOP(=G-fG zA8Zbv7@>Xj5MfVW*Z(vcl&3l-NUAAl=6O*MG>hN1c$;(8t7Nug*W~E#S9?p0ju-UJ z|MxyWMExUo^8JqwW#K~g{Y43o#Urgz@0*WLjV&GPi2Z8WRTUrc=DK4Ba{rayY`Ahf z`0=!0E2fxh2#0!2kH?aG^HdJp44ha!K2&Au*W4ISgT0~IG9-6)POL|b-adHm#K*~v zQ{(rK_b#QGC4B0>5wSA=acV1u$IV7*2Tz|~dP8;9HJt6uJ@EbQjRUuWKmJNwoM?;r z_UYsAWd2NliFU}RKPl_~y}uXn`P1LjZNb+!w?aPuJNM`3#>%&tkB>_97xyixK!b~ zz!jglBhF3zyveGYX1RZyyVjM2)#viroP0pFB;G1&xf2e|3_u(2OS`@9Z9IwLop zU7Fy#Pq%H|*VFiYf*;MxYC|N8c9c!@_w_K{@b~u)h$crRWxxsBq%0ZX zAu2gXIcb}mr*V-QTAr+T0FfI?APlmw6C=hFACA~39 zQ_YVzf1P6Y%B3#W+I^wPt0CSUNo|d-y(oC4P{_ZgC+~!oW@Z9#7OSJS~KOPFx|EztW z(f;nUK2CQ6SLX2M;}^7 zGVo*xr~v%Pqz@k4LE|~j0VEr*YC@A0vW_@V9kKIF^O5ZVv)0lgT#kmcE7LC4RBL_b7w^!{i@2^cEcR{i}v_Da=zV94e}@>0A~R2PddY2aMYzivgbAo)6TlSPohNkDhtq zb5PylG-vHkM09;@ZZHG01!M$-WtqA*~yETVa4)uB-~Zpa=MJf+VOw?fS& z^pM2#SPrJT)$ySR*wvJ ziv@-YQVuqqNYt_z*0z(V1tm`RDt8;?7>=VEF{7ENJsp`At+7xyrFw9+_cPNRouZma zbr3r**Zgd0QEGTaJ?v4YPCcfC6#k$vGw+#I&Rh7!n_Nh8L#|~o!L!pnR0-Os>LPQ!#{LNTnZBVZH_;4wf z%D~Q2d(A!><}HFcWR|@9W21nQ-&{Bf0zf}>lUelRLkSZ^?bO&_7)$R#TQxt8;oLY*EpoPJQQ#cRBx{P$Uvb9pq~jJs)HQ*}DpmzX(9 zqGrOHg$$Kml9;}P(P3n&LSJX3y|G&$!!}x@KW5$GdsO zVTwX#o(0j_de*RHq`3o?nOAeO`|lEZo}|1Pz?PhiEi%c|1bu-#!%1FcJ{qX&U8RF} z&Ao*K8Zri7Zo818mY8z8+OXZke!EBtlrpNJ4Ejfd$cY+W;NuaF_2QQupCz^O0=R`4K1+!KD%vJYG`?Bd&A`s#E; zsJJB|*OEgnKGN8McU8IJtgN@$>Z9d3V zMMTqnPl-*-9WXt$Xfu0hugMny<2ua^dB+odTf6>+1q@=bjEK+N-dWyyD}Cd+8Ei4a z?)PceL0J7vBB9G_Ck8oS`j7ahcATR;8;}FOD@@;hvV!}~-}U#~lM=I5iumJ=Zug_! zUs}iQUYxfB=@HkepyHlH@mAxoi}L>ek<49lNYZ?Thvz}ecIS)4e_nZCtTG!dF<)z1$P!$DuVb=E@ z8NOe0i&y6*WIOlzozHa0`My{si0EcHep@;}H;b26u`OKOu}TYL9boy~@U<~N;du$? zo|x1>z9U-nt0t7t+1cP;Zs^AB;!kcy1$0=$s_)}8%gY?Dria`|psjEGKPy7swL^Eq$r)i= z&S&1kj;u8+iSLuqa@Y@n83-H%%L51F`^F4UxRl6S|7D@ps0u7Mz#I8!i#8JR|8ArU zK-k9KdFGlS!GgZ)&lYMB7ByFYzov#A>X@tQqS-WfzwX(2oJEGzBWAr@xtz~Me~Ys4 zm(0C(cf_S1guN=)i!gF}Zh(Jy-v)T#f5uj%{qNYB0AbPp-W$P6NU_=6LTPGWgovRP zqL3aCaUi%mb!+qEOXxmlCJOWQ)v-r$AvfiO-eZ2x<39Dc>4)BIijukYy2?6czQVoy z#_)CLW4|<&68?LA*|o|cQ8Hm+_?F9Ut)-Nr-2((#{XY)arDFg9 delta 78193 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 aW&Qu%H$MOj2U7n(Dhu&HWuXy({r?BDK4)|Q diff --git a/assets/demo.md b/assets/demo.md index b841c1f..09b0ed2 100644 --- a/assets/demo.md +++ b/assets/demo.md @@ -4,39 +4,36 @@ `mq` is a jq-like command-line tool for Markdown processing. -## Features - -### 1. Filter Headers - -You can filter headers by level and content. - -### 2. Extract Content +> [!TIP] +> Pipe any Markdown file into `mq-view` to get syntax highlighting, +> callouts, tables, and mermaid diagrams right in your terminal. ## Code Examples -```mq -def main(): - print("Hello, mq!") -end +```rust +fn main() { + println!("Hello, mq!"); +} ``` -## Notes +## How It Works -- Simple to use -- Written in Rust -- Fast and efficient +```mermaid +graph LR + A[Markdown] --> B[mq] + B --> C[mq-view] +``` ## Tables -mq can also process tables in markdown files: - | Feature | Description | Status | | ----------- | ------------------------ | ------ | | Headers | Filter headers by level | โœ… | -| Content | Extract specific content | โœ… | +| Callouts | NOTE, TIP, WARNING, ... | โœ… | | Tables | Process markdown tables | โœ… | -| Code blocks | Handle code snippets | โœ… | +| Mermaid | Render simple flowcharts | โœ… | -You can query and transform table data just like other markdown elements. +> [!WARNING] +> Always double-check generated queries before running them on real data. Try mq today!