diff options
48 files changed, 17323 insertions, 689 deletions
diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..5a53dc7 --- /dev/null +++ b/.vscode/c_cpp_properties.json @@ -0,0 +1,22 @@ +{ + "configurations": [ + { + "name": "Win32", + "includePath": [ + "${workspaceFolder}/**" + ], + "defines": [ + "_DEBUG", + "UNICODE", + "_UNICODE" + ], + "windowsSdkVersion": "10.0.19041.0", + "compilerPath": "cl.exe", + "cStandard": "c17", + "cppStandard": "c++20", + "intelliSenseMode": "windows-msvc-x64", + "compilerArgs": [] + } + ], + "version": 4 +}
\ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..c2985e2 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,63 @@ +{ + "files.associations": { + "algorithm": "cpp", + "atomic": "cpp", + "bit": "cpp", + "cctype": "cpp", + "charconv": "cpp", + "chrono": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "compare": "cpp", + "concepts": "cpp", + "cstddef": "cpp", + "cstdint": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cstring": "cpp", + "ctime": "cpp", + "cwchar": "cpp", + "exception": "cpp", + "format": "cpp", + "forward_list": "cpp", + "initializer_list": "cpp", + "iomanip": "cpp", + "ios": "cpp", + "iosfwd": "cpp", + "istream": "cpp", + "iterator": "cpp", + "limits": "cpp", + "locale": "cpp", + "map": "cpp", + "memory": "cpp", + "new": "cpp", + "optional": "cpp", + "ostream": "cpp", + "ratio": "cpp", + "sstream": "cpp", + "stdexcept": "cpp", + "streambuf": "cpp", + "string": "cpp", + "system_error": "cpp", + "tuple": "cpp", + "type_traits": "cpp", + "typeinfo": "cpp", + "utility": "cpp", + "vector": "cpp", + "xfacet": "cpp", + "xiosbase": "cpp", + "xlocale": "cpp", + "xlocbuf": "cpp", + "xlocinfo": "cpp", + "xlocmes": "cpp", + "xlocmon": "cpp", + "xlocnum": "cpp", + "xloctime": "cpp", + "xmemory": "cpp", + "xstddef": "cpp", + "xstring": "cpp", + "xtr1common": "cpp", + "xtree": "cpp", + "xutility": "cpp" + } +}
\ No newline at end of file @@ -1,5 +1,5 @@ [workspace] -members = ["render", "resources", "tvg"] +members = ["packer", "textures", "tvg", "scripts", "sprites", "sys", "console"] resolver = "2" [package] @@ -10,7 +10,19 @@ rust-version = "1.65" publish = false [dependencies] -alligator_render = { path = "render" } +alligator_scripts = { path = "scripts" } +alligator_sprites = { path = "sprites" } +alligator_sys = { path = "sys" } +alligator_textures = { path = "textures" } -[lib] -crate-type = ["cdylib", "lib"] +clap = "4" +serde = "1" +serde_json = "1" +sha3 = "0.10" + +[profile.release] +#strip = "symbols" +opt-level = 'z' +#lto = true +panic = 'abort' +#codegen-units = 1 diff --git a/book/.gitignore b/book/.gitignore new file mode 100644 index 0000000..7585238 --- /dev/null +++ b/book/.gitignore @@ -0,0 +1 @@ +book diff --git a/book/book.toml b/book/book.toml new file mode 100644 index 0000000..8185223 --- /dev/null +++ b/book/book.toml @@ -0,0 +1,6 @@ +[book] +authors = ["Mica White"] +language = "en" +multilingual = false +src = "src" +title = "The Alligator Book" diff --git a/book/src/SUMMARY.md b/book/src/SUMMARY.md new file mode 100644 index 0000000..570263b --- /dev/null +++ b/book/src/SUMMARY.md @@ -0,0 +1,4 @@ +# Summary + +- [Chapter 1](./chapter_1.md) +- [Performance](./performance.md) diff --git a/book/src/chapter_1.md b/book/src/chapter_1.md new file mode 100644 index 0000000..b743fda --- /dev/null +++ b/book/src/chapter_1.md @@ -0,0 +1 @@ +# Chapter 1 diff --git a/book/src/performance.md b/book/src/performance.md new file mode 100644 index 0000000..d769a6f --- /dev/null +++ b/book/src/performance.md @@ -0,0 +1,10 @@ +# Performance + +Here are some tips to make your game perform more quickly + +## Scripts + +Generally, one large WebAssembly script will perform better than many small +scripts. There is overhead that comes from calling a script, and more scripts +will result in more overhead. Try to have as few scripts as possible. Ideally, +you should have no more than 20 scripts enabled at the same time. diff --git a/console/Cargo.toml b/console/Cargo.toml new file mode 100644 index 0000000..0d23054 --- /dev/null +++ b/console/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "alligator_console" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +smol = "2" +log = "0.4" +pollster = "0.3"
\ No newline at end of file diff --git a/console/src/lib.rs b/console/src/lib.rs new file mode 100644 index 0000000..afab4af --- /dev/null +++ b/console/src/lib.rs @@ -0,0 +1,100 @@ +use std::net::Ipv6Addr; + +use log::Level; +use pollster::FutureExt; +use smol::channel::{Receiver, Sender}; +use smol::io::AsyncWriteExt; +use smol::net::{TcpListener, TcpStream}; + +pub struct Console { + tcp_socket: TcpStream, + messages: Receiver<ConsoleMessage>, + sender: Sender<ConsoleMessage>, +} + +pub enum ConsoleMessage { + RuntimeLog { + message: String, + level: Level, + file: String, + line: u32, + }, + ScriptLog { + message: String, + level: Level, + file: String, + line: u32, + }, +} + +pub struct ConsoleLogger(Sender<ConsoleMessage>); + +impl Console { + pub async fn new(port: u16) -> Result<Self, std::io::Error> { + let tcp_listener = TcpListener::bind((Ipv6Addr::LOCALHOST, port)).await?; + let tcp_socket = tcp_listener.accept().await?.0; + let (sender, reciever) = smol::channel::unbounded(); + Ok(Self { + tcp_socket, + messages: reciever, + sender, + }) + } + + pub fn sender(&self) -> Sender<ConsoleMessage> { + self.sender.clone() + } + + pub fn logger(&self) -> ConsoleLogger { + ConsoleLogger(self.sender()) + } + + pub async fn flush(&mut self) -> std::io::Result<()> { + while let Ok(message) = self.messages.try_recv() { + match message { + ConsoleMessage::RuntimeLog { + message, + level, + file, + line, + } => { + let msg = format!("runtimelog {level} {file}:{line} {message}\n"); + self.tcp_socket.write(msg.as_bytes()).await?; + } + ConsoleMessage::ScriptLog { + message, + level, + file, + line, + } => { + let msg = format!("scriptlog {level} {file}:{line} {message}\n"); + self.tcp_socket.write(msg.as_bytes()).await?; + } + } + } + + self.tcp_socket.flush().await?; + + Ok(()) + } +} + +impl log::Log for ConsoleLogger { + fn enabled(&self, _: &log::Metadata) -> bool { + true + } + + fn log(&self, record: &log::Record) { + let _ = self + .0 + .send(ConsoleMessage::RuntimeLog { + message: record.args().to_string(), + level: record.level(), + file: record.file().map(str::to_string).unwrap_or_default(), + line: record.line().unwrap_or_default(), + }) + .block_on(); + } + + fn flush(&self) {} +} diff --git a/game.json b/game.json new file mode 100644 index 0000000..9014385 --- /dev/null +++ b/game.json @@ -0,0 +1,21 @@ +{ + "alligator_version": 0, + "scenes": { + "black": { + "initial_sprites": {}, + "initial_scripts": [] + } + }, + "textures": {}, + "scripts": {}, + "default_scene": "black", + "default_textures_size_target": 0, + "sprite_manager_capacity": 0, + "default_window_width": 640, + "default_window_height": 480, + "default_atlas_width": 640, + "default_atlas_height": 480, + "default_window_mode": "Windowed", + "window_title": "Black.exe", + "vsync": true +}
\ No newline at end of file diff --git a/packer/packed.png b/packer/packed.png Binary files differindex 1a913a2..9602cdb 100644 --- a/packer/packed.png +++ b/packer/packed.png diff --git a/packer/src/bin/benchmark.rs b/packer/src/bin/benchmark.rs index bb83992..4d898d5 100644 --- a/packer/src/bin/benchmark.rs +++ b/packer/src/bin/benchmark.rs @@ -10,17 +10,19 @@ fn main() -> Result<(), exun::RawUnexpected> { let start = Instant::now(); let mut packer = RectanglePacker::new(); - packer.add_texture("gator".into(), Arc::new(img1.to_rgb8())); - packer.add_texture("bunny".into(), Arc::new(img2.to_rgb8())); - packer.add_texture("ghost".into(), Arc::new(img3.to_rgb8())); + packer.add_texture("gator".into(), Arc::new(img1.to_rgba8())); + packer.add_texture("bunny".into(), Arc::new(img2.to_rgba8())); + packer.add_texture("ghost".into(), Arc::new(img3.to_rgba8())); println!("{} milliseconds", start.elapsed().as_secs_f32() * 1000.0); let start = Instant::now(); - let packed = packer.output(); + let packed = packer.output(1, 1); println!("{} milliseconds", start.elapsed().as_secs_f32() * 1000.0); let mut file = File::create("packed.png")?; - packed?.0.write_to(&mut file, ImageOutputFormat::Bmp)?; + packed? + .get_full_atlas() + .write_to(&mut file, ImageOutputFormat::Bmp)?; Ok(()) } diff --git a/packer/src/lib.rs b/packer/src/lib.rs index 328f90e..6715a9e 100644 --- a/packer/src/lib.rs +++ b/packer/src/lib.rs @@ -3,7 +3,7 @@ use std::ops::Deref; use std::sync::Arc; use exun::RawUnexpected; -use image::{GenericImage, RgbImage}; +use image::{GenericImage, RgbaImage}; #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub struct Rectangle { @@ -15,14 +15,14 @@ pub struct Rectangle { #[derive(Debug, Clone, PartialEq, Eq)] struct Texture { - id: Box<str>, + id: Arc<str>, x: u32, y: u32, - texture: Arc<RgbImage>, + texture: Arc<RgbaImage>, } #[derive(Debug, Clone, PartialEq, Eq)] -struct ImageRect(Arc<RgbImage>, Box<str>); +struct ImageRect(Arc<RgbaImage>, Arc<str>); #[derive(Debug, Default, Clone)] pub struct RectanglePacker { @@ -30,6 +30,12 @@ pub struct RectanglePacker { textures: Vec<ImageRect>, } +#[derive(Debug, Clone)] +pub struct TextureAtlas { + atlas: RgbaImage, + ids: HashMap<Arc<str>, Rectangle>, +} + impl PartialOrd for ImageRect { fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> { Some(self.cmp(other)) @@ -77,15 +83,19 @@ impl RectanglePacker { self.textures.shrink_to_fit() } - pub fn add_texture(&mut self, name: Box<str>, texture: Arc<RgbImage>) { + pub fn add_texture(&mut self, name: Arc<str>, texture: Arc<RgbaImage>) { if texture.width() > self.min_width { self.min_width = texture.width() + 1; } self.textures.push(ImageRect(texture, name)); } - fn pack(&mut self) -> (Vec<Texture>, u32, u32) { - let image_width = self.min_width; + fn pack(&mut self, min_width: u32) -> (Vec<Texture>, u32, u32) { + let image_width = self.min_width.max(min_width); + + // to make sure padding is rounded up and not down, 64 is added + // to make sure some padding is always present, minimum is 1 pixel + let horizontal_padding = ((image_width + 64) / 128).max(1); let mut x_position = 0; let mut y_position = 0; @@ -97,7 +107,9 @@ impl RectanglePacker { for texture in &self.textures { // loop to the next row if we've gone off the edge if (x_position + texture.0.width()) > image_width { - y_position += largest_row_height; + let vertical_padding = ((largest_row_height + 64) / 128).max(1); + + y_position += largest_row_height + vertical_padding; x_position = 0; largest_row_height = 0; } @@ -106,7 +118,7 @@ impl RectanglePacker { let x = x_position; let y = y_position; - x_position += texture.0.width(); + x_position += texture.0.width() + horizontal_padding; if texture.0.height() > largest_row_height { largest_row_height = texture.0.height(); @@ -120,17 +132,23 @@ impl RectanglePacker { }); } - let total_height = y_position + largest_row_height; + let vertical_padding = ((largest_row_height + 64) / 128).max(1); + let total_height = y_position + largest_row_height + vertical_padding; (rectangles, image_width, total_height) } - pub fn output(&mut self) -> Result<(RgbImage, HashMap<Box<str>, Rectangle>), RawUnexpected> { - let (rectangles, image_width, image_height) = self.pack(); - let mut image = RgbImage::new(image_width, image_height); + pub fn output( + &mut self, + min_width: u32, + min_height: u32, + ) -> Result<TextureAtlas, RawUnexpected> { + let (rectangles, image_width, image_height) = self.pack(min_width); + let image_height = image_height.max(min_height); + let mut atlas = RgbaImage::new(image_width, image_height); let mut ids = HashMap::with_capacity(rectangles.len()); for rectangle in rectangles { - image.copy_from(rectangle.texture.deref(), rectangle.x, rectangle.y)?; + atlas.copy_from(rectangle.texture.deref(), rectangle.x, rectangle.y)?; ids.insert( rectangle.id, Rectangle { @@ -142,6 +160,16 @@ impl RectanglePacker { ); } - Ok((image, ids)) + Ok(TextureAtlas { atlas, ids }) + } +} + +impl TextureAtlas { + pub fn get_full_atlas(&self) -> &RgbaImage { + &self.atlas + } + + pub fn get_texture_rect(&self, id: &str) -> Option<Rectangle> { + self.ids.get(id).cloned() } } diff --git a/render/Cargo.toml b/render/Cargo.toml index 086a993..1cb523c 100644 --- a/render/Cargo.toml +++ b/render/Cargo.toml @@ -8,30 +8,22 @@ publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -alligator_resources = { path = "../resources" } - bytemuck = { version = "1", features = ["derive"] } thiserror = "1" profiling = "1" -wgpu = "0.15" +wgpu = "0.18" winit = "0.28" image = "0.24" cgmath = "0.18" pollster = "0.2" log = "0.4" -parking_lot = "0.12" -texture_packer = { git="https://github.com/botahamec/piston_texture_packer", branch="u16" } -tracy-client = { version = "0.15", optional = true } -dhat = { version = "0.3", optional = true } +[dev-dependencies] +tracy-client = "0.15" [lib] crate-type = ["cdylib", "lib"] -[features] -dhat = ["dep:dhat"] -profile-with-tracy = ["tracy-client", "profiling/profile-with-tracy"] - [[example]] name = "black" diff --git a/render/dhat-heap.json b/render/dhat-heap.json new file mode 100644 index 0000000..2b694d3 --- /dev/null +++ b/render/dhat-heap.json @@ -0,0 +1,15424 @@ +{ +"dhatFileVersion": 2, +"mode": "rust-heap", +"verb": "Allocated", +"bklt": true, +"bkacc": false, +"tu": "µs", +"Mtu": "s", +"tuth": 10, +"cmd": "C:\\Users\\epice\\Projects\\alligator\\target\\release\\examples\\black.exe", +"pid": 7632, +"tg": 397502, +"te": 405798, +"pps": [ +{ +"tb": 30, +"tbk": 1, +"tl": 6, +"mb": 30, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 33, +"tbk": 1, +"tl": 8, +"mb": 33, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 5, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 8, +"tbk": 1, +"tl": 30739, +"mb": 8, +"mbk": 1, +"gb": 8, +"gbk": 1, +"eb": 8, +"ebk": 1, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 18, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 15, +"tbk": 1, +"tl": 5, +"mb": 15, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 3, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 32, +"tbk": 2, +"tl": 2893, +"mb": 32, +"mbk": 2, +"gb": 32, +"gbk": 2, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 131, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 32, +"tbk": 2, +"tl": 1352, +"mb": 32, +"mbk": 2, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 3, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 7, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 65, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 5, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 28, +"tbk": 1, +"tl": 9, +"mb": 28, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 8, +"tbk": 1, +"tl": 30352, +"mb": 8, +"mbk": 1, +"gb": 8, +"gbk": 1, +"eb": 8, +"ebk": 1, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 0, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 6, +"mb": 24, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 128, +"tbk": 1, +"tl": 29391, +"mb": 128, +"mbk": 1, +"gb": 128, +"gbk": 1, +"eb": 128, +"ebk": 1, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 18, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 7, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 2327, +"mb": 16, +"mbk": 1, +"gb": 16, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 84, +"tbk": 2, +"tl": 68, +"mb": 56, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 8, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 3, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 32, +"tbk": 1, +"tl": 344, +"mb": 32, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 6879, +"mb": 16, +"mbk": 1, +"gb": 16, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 5, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 3168, +"tbk": 1, +"tl": 30799, +"mb": 3168, +"mbk": 1, +"gb": 3168, +"gbk": 1, +"eb": 3168, +"ebk": 1, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 14, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 15, +"tbk": 1, +"tl": 2, +"mb": 15, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 5, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 84, +"tbk": 3, +"tl": 400412, +"mb": 48, +"mbk": 1, +"gb": 48, +"gbk": 1, +"eb": 48, +"ebk": 1, +"fs": [ +1, +2 +] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 7, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 9, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 3, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 128, +"tbk": 1, +"tl": 101153, +"mb": 128, +"mbk": 1, +"gb": 128, +"gbk": 1, +"eb": 128, +"ebk": 1, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 1023, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 75, +"tbk": 1, +"tl": 0, +"mb": 75, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 11, +"tbk": 1, +"tl": 2, +"mb": 11, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 15, +"tbk": 1, +"tl": 10, +"mb": 15, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 1084, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [ +1, +2, +3, +4, +5, +6, +7, +8 +] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 37387, +"mb": 16, +"mbk": 1, +"gb": 16, +"gbk": 1, +"eb": 16, +"ebk": 1, +"fs": [] +}, +{ +"tb": 32, +"tbk": 1, +"tl": 30618, +"mb": 32, +"mbk": 1, +"gb": 32, +"gbk": 1, +"eb": 32, +"ebk": 1, +"fs": [] +}, +{ +"tb": 128, +"tbk": 1, +"tl": 35722, +"mb": 128, +"mbk": 1, +"gb": 128, +"gbk": 1, +"eb": 128, +"ebk": 1, +"fs": [] +}, +{ +"tb": 80, +"tbk": 5, +"tl": 26753, +"mb": 80, +"mbk": 5, +"gb": 80, +"gbk": 5, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 8, +"tbk": 1, +"tl": 54, +"mb": 8, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 25, +"tbk": 1, +"tl": 6, +"mb": 25, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 5, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 12, +"tbk": 1, +"tl": 2, +"mb": 12, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 1, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 52, +"tbk": 1, +"tl": 17915, +"mb": 52, +"mbk": 1, +"gb": 52, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 8, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 6618, +"mb": 16, +"mbk": 1, +"gb": 16, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 4, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 22, +"tbk": 1, +"tl": 19, +"mb": 22, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 4, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 25, +"tbk": 1, +"tl": 6, +"mb": 25, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 32, +"tbk": 2, +"tl": 1, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 6, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 5, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 320, +"tbk": 2, +"tl": 10855, +"mb": 320, +"mbk": 2, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 7, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 4, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 13, +"tbk": 1, +"tl": 5, +"mb": 13, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 0, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 6, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 3, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 10, +"tbk": 1, +"tl": 2, +"mb": 10, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 320, +"tbk": 4, +"tl": 1382, +"mb": 128, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 14, +"tbk": 1, +"tl": 6, +"mb": 14, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 1564, +"tbk": 4, +"tl": 79158, +"mb": 1232, +"mbk": 2, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 10, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 13, +"tbk": 1, +"tl": 7, +"mb": 13, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 3, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 8, +"tbk": 1, +"tl": 1016, +"mb": 8, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 14, +"tbk": 1, +"tl": 19, +"mb": 14, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 23, +"tbk": 1, +"tl": 8, +"mb": 23, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 3, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 8, +"tbk": 1, +"tl": 157, +"mb": 8, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 9, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 13, +"tbk": 1, +"tl": 5, +"mb": 13, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 5, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 30, +"tbk": 1, +"tl": 2, +"mb": 30, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 12, +"tbk": 1, +"tl": 8, +"mb": 12, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 52, +"tbk": 1, +"tl": 31340, +"mb": 52, +"mbk": 1, +"gb": 52, +"gbk": 1, +"eb": 52, +"ebk": 1, +"fs": [] +}, +{ +"tb": 128, +"tbk": 1, +"tl": 259, +"mb": 128, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 32, +"tbk": 2, +"tl": 0, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 7, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 43, +"tbk": 1, +"tl": 10, +"mb": 43, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 620, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 32, +"tbk": 1, +"tl": 18074, +"mb": 32, +"mbk": 1, +"gb": 32, +"gbk": 1, +"eb": 32, +"ebk": 1, +"fs": [] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 5, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 15, +"tbk": 1, +"tl": 10, +"mb": 15, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 23, +"tbk": 1, +"tl": 6, +"mb": 23, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 16754, +"mb": 24, +"mbk": 1, +"gb": 24, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 6, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 48, +"tbk": 3, +"tl": 0, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 13, +"tbk": 1, +"tl": 5, +"mb": 13, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 12, +"tbk": 1, +"tl": 2, +"mb": 12, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 96, +"tbk": 1, +"tl": 9404, +"mb": 96, +"mbk": 1, +"gb": 96, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 22, +"tbk": 1, +"tl": 7, +"mb": 22, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 25, +"tbk": 1, +"tl": 6, +"mb": 25, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 3, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 28, +"tbk": 3, +"tl": 696, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 79, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 4321, +"mb": 16, +"mbk": 1, +"gb": 16, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 12, +"tbk": 1, +"tl": 3, +"mb": 12, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 64, +"tbk": 1, +"tl": 34510, +"mb": 64, +"mbk": 1, +"gb": 64, +"gbk": 1, +"eb": 64, +"ebk": 1, +"fs": [] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 6, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 4, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 15, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 4, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 28, +"tbk": 1, +"tl": 5, +"mb": 28, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 7, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 97968, +"mb": 16, +"mbk": 1, +"gb": 16, +"gbk": 1, +"eb": 16, +"ebk": 1, +"fs": [] +}, +{ +"tb": 12, +"tbk": 1, +"tl": 5, +"mb": 12, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 28, +"tbk": 1, +"tl": 7, +"mb": 28, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 5, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 775, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 992, +"tbk": 5, +"tl": 5570, +"mb": 512, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 0, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 9, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 33, +"tbk": 1, +"tl": 7, +"mb": 33, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 48, +"tbk": 1, +"tl": 101391, +"mb": 48, +"mbk": 1, +"gb": 48, +"gbk": 1, +"eb": 48, +"ebk": 1, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 36502, +"mb": 16, +"mbk": 1, +"gb": 16, +"gbk": 1, +"eb": 16, +"ebk": 1, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 2025, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 17, +"tbk": 1, +"tl": 8, +"mb": 17, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 96, +"tbk": 1, +"tl": 99087, +"mb": 96, +"mbk": 1, +"gb": 96, +"gbk": 1, +"eb": 96, +"ebk": 1, +"fs": [] +}, +{ +"tb": 56, +"tbk": 3, +"tl": 1, +"mb": 32, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 1024, +"tbk": 1, +"tl": 195, +"mb": 1024, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 1024, +"ebk": 1, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 9, +"mb": 24, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 10, +"tbk": 1, +"tl": 3, +"mb": 10, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 15, +"tbk": 1, +"tl": 10, +"mb": 15, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 88, +"tbk": 1, +"tl": 581, +"mb": 88, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 9, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 896, +"tbk": 3, +"tl": 6164, +"mb": 512, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 17, +"tbk": 1, +"tl": 5, +"mb": 17, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 14, +"tbk": 1, +"tl": 4, +"mb": 14, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 23, +"tbk": 1, +"tl": 7, +"mb": 23, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 5, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 13, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 30064, +"mb": 16, +"mbk": 1, +"gb": 16, +"gbk": 1, +"eb": 16, +"ebk": 1, +"fs": [] +}, +{ +"tb": 40, +"tbk": 1, +"tl": 1863, +"mb": 40, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 2, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 11, +"mb": 24, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 6, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 8, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 11, +"tbk": 1, +"tl": 5, +"mb": 11, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 1, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 14, +"tbk": 1, +"tl": 12, +"mb": 14, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 31, +"tbk": 1, +"tl": 10, +"mb": 31, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 23, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 0, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 3409, +"mb": 16, +"mbk": 1, +"gb": 16, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 11, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 8, +"tbk": 1, +"tl": 397524, +"mb": 8, +"mbk": 1, +"gb": 8, +"gbk": 1, +"eb": 8, +"ebk": 1, +"fs": [ +1, +2, +3, +4, +5, +6, +7, +8 +] +}, +{ +"tb": 9, +"tbk": 1, +"tl": 2, +"mb": 9, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 4, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 6, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 14, +"tbk": 1, +"tl": 3, +"mb": 14, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 3, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 88, +"tbk": 1, +"tl": 2600, +"mb": 88, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 2859, +"mb": 16, +"mbk": 1, +"gb": 16, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 5, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 512, +"tbk": 1, +"tl": 402132, +"mb": 512, +"mbk": 1, +"gb": 512, +"gbk": 1, +"eb": 512, +"ebk": 1, +"fs": [] +}, +{ +"tb": 52, +"tbk": 1, +"tl": 5950, +"mb": 52, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 25, +"tbk": 1, +"tl": 9, +"mb": 25, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 2, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 52, +"tbk": 1, +"tl": 18964, +"mb": 52, +"mbk": 1, +"gb": 52, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 30, +"tbk": 1, +"tl": 8, +"mb": 30, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 25, +"tbk": 1, +"tl": 9, +"mb": 25, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 4, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 64, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 70, +"tbk": 3, +"tl": 826, +"mb": 40, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 50, +"tbk": 1, +"tl": 3271, +"mb": 50, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 11, +"mb": 24, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 14, +"tbk": 1, +"tl": 1, +"mb": 14, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 8, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 13, +"tbk": 1, +"tl": 5, +"mb": 13, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 13, +"tbk": 1, +"tl": 4, +"mb": 13, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 7, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 11, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 100876, +"mb": 16, +"mbk": 1, +"gb": 16, +"gbk": 1, +"eb": 16, +"ebk": 1, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 3, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 6, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 5, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 3, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 68, +"tbk": 1, +"tl": 108, +"mb": 68, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 32, +"tbk": 2, +"tl": 305, +"mb": 32, +"mbk": 2, +"gb": 32, +"gbk": 2, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 13, +"tbk": 1, +"tl": 6, +"mb": 13, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 30, +"tbk": 1, +"tl": 7, +"mb": 30, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 5, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 7, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 36, +"tbk": 2, +"tl": 87, +"mb": 24, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 33, +"tbk": 1, +"tl": 7, +"mb": 33, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 37444, +"mb": 24, +"mbk": 1, +"gb": 24, +"gbk": 1, +"eb": 24, +"ebk": 1, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 30410, +"mb": 16, +"mbk": 1, +"gb": 16, +"gbk": 1, +"eb": 16, +"ebk": 1, +"fs": [] +}, +{ +"tb": 112, +"tbk": 7, +"tl": 32233, +"mb": 112, +"mbk": 7, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 513, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 52, +"tbk": 1, +"tl": 4042, +"mb": 52, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 17, +"tbk": 1, +"tl": 5, +"mb": 17, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 22, +"tbk": 1, +"tl": 5, +"mb": 22, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 32, +"tbk": 1, +"tl": 28641, +"mb": 32, +"mbk": 1, +"gb": 32, +"gbk": 1, +"eb": 32, +"ebk": 1, +"fs": [] +}, +{ +"tb": 32, +"tbk": 1, +"tl": 22824, +"mb": 32, +"mbk": 1, +"gb": 32, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 28, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 22, +"tbk": 1, +"tl": 11, +"mb": 22, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 6, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 80, +"tbk": 5, +"tl": 0, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 9, +"mb": 24, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 3389, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 32, +"tbk": 2, +"tl": 3077, +"mb": 32, +"mbk": 2, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 15, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 12, +"tbk": 1, +"tl": 59996, +"mb": 12, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 32, +"tbk": 1, +"tl": 36447, +"mb": 32, +"mbk": 1, +"gb": 32, +"gbk": 1, +"eb": 32, +"ebk": 1, +"fs": [] +}, +{ +"tb": 32, +"tbk": 1, +"tl": 530, +"mb": 32, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 26043, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 7, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 5, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 27, +"tbk": 1, +"tl": 6, +"mb": 27, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 40, +"tbk": 1, +"tl": 105, +"mb": 40, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 60, +"tbk": 2, +"tl": 97053, +"mb": 48, +"mbk": 1, +"gb": 48, +"gbk": 1, +"eb": 48, +"ebk": 1, +"fs": [] +}, +{ +"tb": 32, +"tbk": 2, +"tl": 2055, +"mb": 32, +"mbk": 2, +"gb": 32, +"gbk": 2, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 6, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 25, +"tbk": 1, +"tl": 9, +"mb": 25, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 6682, +"mb": 16, +"mbk": 1, +"gb": 16, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 373, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 16, +"ebk": 1, +"fs": [] +}, +{ +"tb": 32, +"tbk": 1, +"tl": 80, +"mb": 32, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 624, +"tbk": 3, +"tl": 1086, +"mb": 336, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 14, +"tbk": 2, +"tl": 43976, +"mb": 14, +"mbk": 2, +"gb": 14, +"gbk": 2, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 32, +"tbk": 2, +"tl": 0, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 31, +"tbk": 1, +"tl": 5, +"mb": 31, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 48, +"tbk": 1, +"tl": 18240, +"mb": 48, +"mbk": 1, +"gb": 48, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 2, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 27, +"tbk": 1, +"tl": 7, +"mb": 27, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 4, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 180, +"tbk": 1, +"tl": 3925, +"mb": 180, +"mbk": 1, +"gb": 180, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 6, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 224, +"tbk": 3, +"tl": 21624, +"mb": 128, +"mbk": 1, +"gb": 128, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 27, +"tbk": 1, +"tl": 4, +"mb": 27, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 7, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 5, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 32, +"tbk": 1, +"tl": 532, +"mb": 32, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 32, +"ebk": 1, +"fs": [] +}, +{ +"tb": 3456, +"tbk": 6, +"tl": 1066, +"mb": 1536, +"mbk": 1, +"gb": 1536, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 3380, +"tbk": 1, +"tl": 1883, +"mb": 3380, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 14, +"tbk": 1, +"tl": 3, +"mb": 14, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 14, +"tbk": 1, +"tl": 6, +"mb": 14, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 8, +"tbk": 1, +"tl": 36775, +"mb": 8, +"mbk": 1, +"gb": 8, +"gbk": 1, +"eb": 8, +"ebk": 1, +"fs": [] +}, +{ +"tb": 112, +"tbk": 3, +"tl": 405518, +"mb": 64, +"mbk": 1, +"gb": 64, +"gbk": 1, +"eb": 64, +"ebk": 1, +"fs": [] +}, +{ +"tb": 27, +"tbk": 1, +"tl": 5, +"mb": 27, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 12, +"tbk": 1, +"tl": 1, +"mb": 12, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 22, +"tbk": 1, +"tl": 5, +"mb": 22, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 12, +"tbk": 1, +"tl": 2, +"mb": 12, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 6, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 6, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 6, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 13, +"tbk": 1, +"tl": 2, +"mb": 13, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 25, +"tbk": 1, +"tl": 15, +"mb": 25, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 7, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 23, +"tbk": 1, +"tl": 19, +"mb": 23, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 48, +"tbk": 2, +"tl": 29631, +"mb": 32, +"mbk": 1, +"gb": 16, +"gbk": 1, +"eb": 16, +"ebk": 1, +"fs": [] +}, +{ +"tb": 8, +"tbk": 1, +"tl": 4, +"mb": 8, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 48, +"tbk": 2, +"tl": 68, +"mb": 32, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 22, +"tbk": 1, +"tl": 17, +"mb": 22, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 17, +"tbk": 1, +"tl": 10, +"mb": 17, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 8, +"tbk": 1, +"tl": 31216, +"mb": 8, +"mbk": 1, +"gb": 8, +"gbk": 1, +"eb": 8, +"ebk": 1, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 30162, +"mb": 16, +"mbk": 1, +"gb": 16, +"gbk": 1, +"eb": 16, +"ebk": 1, +"fs": [] +}, +{ +"tb": 32, +"tbk": 2, +"tl": 44310, +"mb": 32, +"mbk": 2, +"gb": 32, +"gbk": 2, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 1564, +"tbk": 4, +"tl": 1776, +"mb": 1232, +"mbk": 2, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 10, +"mb": 24, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 5, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 17, +"tbk": 1, +"tl": 5, +"mb": 17, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 17, +"tbk": 1, +"tl": 6, +"mb": 17, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 48, +"tbk": 1, +"tl": 18019, +"mb": 48, +"mbk": 1, +"gb": 48, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 3, +"tl": 55546, +"mb": 24, +"mbk": 3, +"gb": 24, +"gbk": 3, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 10, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 6816, +"mb": 16, +"mbk": 1, +"gb": 16, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 11, +"mb": 24, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 23, +"tbk": 1, +"tl": 5, +"mb": 23, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 7, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 17, +"tbk": 1, +"tl": 11, +"mb": 17, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 13, +"tbk": 1, +"tl": 8, +"mb": 13, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 5, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 14, +"tbk": 1, +"tl": 4, +"mb": 14, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 84, +"tbk": 1, +"tl": 17114, +"mb": 84, +"mbk": 1, +"gb": 84, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 15, +"tbk": 1, +"tl": 2, +"mb": 15, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 48, +"tbk": 1, +"tl": 1, +"mb": 48, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 11, +"mb": 24, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 7, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 214223, +"mb": 24, +"mbk": 1, +"gb": 24, +"gbk": 1, +"eb": 24, +"ebk": 1, +"fs": [] +}, +{ +"tb": 32, +"tbk": 2, +"tl": 0, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 14, +"tbk": 1, +"tl": 8, +"mb": 14, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 10, +"tbk": 1, +"tl": 4, +"mb": 10, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 115103, +"mb": 16, +"mbk": 1, +"gb": 16, +"gbk": 1, +"eb": 16, +"ebk": 1, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 6749, +"mb": 16, +"mbk": 1, +"gb": 16, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 22, +"tbk": 1, +"tl": 7, +"mb": 22, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 5, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 69, +"tbk": 2, +"tl": 37242, +"mb": 38, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 12, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 27, +"tbk": 1, +"tl": 6, +"mb": 27, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 6, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 22, +"tbk": 1, +"tl": 9, +"mb": 22, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 9, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 224, +"tbk": 1, +"tl": 24610, +"mb": 224, +"mbk": 1, +"gb": 224, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 8, +"tbk": 1, +"tl": 127, +"mb": 8, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 29, +"tbk": 1, +"tl": 73, +"mb": 29, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 15, +"tbk": 1, +"tl": 26, +"mb": 15, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 8, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 416, +"tbk": 1, +"tl": 20854, +"mb": 416, +"mbk": 1, +"gb": 416, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 13, +"tbk": 1, +"tl": 5, +"mb": 13, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 3, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 1280, +"tbk": 1, +"tl": 101034, +"mb": 1280, +"mbk": 1, +"gb": 1280, +"gbk": 1, +"eb": 1280, +"ebk": 1, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 8, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 5, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 29, +"tbk": 1, +"tl": 0, +"mb": 29, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 62, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 5, +"mb": 24, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 8, +"tbk": 1, +"tl": 6864, +"mb": 8, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 48, +"tbk": 1, +"tl": 3387, +"mb": 48, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 620, +"tbk": 2, +"tl": 3774, +"mb": 620, +"mbk": 2, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 0, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 7, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 576, +"tbk": 3, +"tl": 19663, +"mb": 576, +"mbk": 3, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 48, +"tbk": 1, +"tl": 6340, +"mb": 48, +"mbk": 1, +"gb": 48, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 48, +"tbk": 1, +"tl": 397469, +"mb": 48, +"mbk": 1, +"gb": 48, +"gbk": 1, +"eb": 48, +"ebk": 1, +"fs": [ +1, +2, +3, +4, +5, +6, +7, +8 +] +}, +{ +"tb": 13, +"tbk": 1, +"tl": 2, +"mb": 13, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 13, +"tbk": 1, +"tl": 2, +"mb": 13, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 8, +"tbk": 1, +"tl": 77299, +"mb": 8, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 21, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 644, +"mb": 24, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 13, +"tbk": 1, +"tl": 5, +"mb": 13, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 32, +"tbk": 2, +"tl": 433, +"mb": 32, +"mbk": 2, +"gb": 32, +"gbk": 2, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 96, +"tbk": 1, +"tl": 101445, +"mb": 96, +"mbk": 1, +"gb": 96, +"gbk": 1, +"eb": 96, +"ebk": 1, +"fs": [] +}, +{ +"tb": 50, +"tbk": 1, +"tl": 12512, +"mb": 50, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 17, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 7, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 8, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 128, +"tbk": 1, +"tl": 71615, +"mb": 128, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 96, +"tbk": 2, +"tl": 23824, +"mb": 64, +"mbk": 1, +"gb": 64, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 54, +"tbk": 1, +"tl": 6, +"mb": 54, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 22, +"tbk": 1, +"tl": 20, +"mb": 22, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 0, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 11, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 12, +"tbk": 1, +"tl": 5, +"mb": 12, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 160, +"tbk": 10, +"tl": 13879, +"mb": 144, +"mbk": 9, +"gb": 144, +"gbk": 9, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 96, +"tbk": 1, +"tl": 5822, +"mb": 96, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 32, +"tbk": 1, +"tl": 574, +"mb": 32, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 4, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 4, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 31120, +"mb": 16, +"mbk": 1, +"gb": 16, +"gbk": 1, +"eb": 16, +"ebk": 1, +"fs": [] +}, +{ +"tb": 17, +"tbk": 1, +"tl": 8, +"mb": 17, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 320, +"tbk": 1, +"tl": 195, +"mb": 320, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 7, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 64, +"tbk": 1, +"tl": 98, +"mb": 64, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 32, +"tbk": 1, +"tl": 92, +"mb": 32, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 34, +"tbk": 1, +"tl": 7, +"mb": 34, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 34, +"tbk": 1, +"tl": 5, +"mb": 34, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 12, +"tbk": 1, +"tl": 10, +"mb": 12, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 2, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 13, +"tbk": 1, +"tl": 4, +"mb": 13, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 14, +"tbk": 1, +"tl": 4, +"mb": 14, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 10, +"mb": 24, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 8, +"tbk": 1, +"tl": 30311, +"mb": 8, +"mbk": 1, +"gb": 8, +"gbk": 1, +"eb": 8, +"ebk": 1, +"fs": [] +}, +{ +"tb": 1274, +"tbk": 1, +"tl": 1844, +"mb": 1274, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 32, +"tbk": 2, +"tl": 9338, +"mb": 32, +"mbk": 2, +"gb": 32, +"gbk": 2, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 1, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 62, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 13, +"tbk": 1, +"tl": 6, +"mb": 13, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 64, +"tbk": 1, +"tl": 402337, +"mb": 64, +"mbk": 1, +"gb": 64, +"gbk": 1, +"eb": 64, +"ebk": 1, +"fs": [] +}, +{ +"tb": 12, +"tbk": 1, +"tl": 4, +"mb": 12, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 7512, +"tbk": 1, +"tl": 214497, +"mb": 7512, +"mbk": 1, +"gb": 7512, +"gbk": 1, +"eb": 7512, +"ebk": 1, +"fs": [] +}, +{ +"tb": 32, +"tbk": 1, +"tl": 30208, +"mb": 32, +"mbk": 1, +"gb": 32, +"gbk": 1, +"eb": 32, +"ebk": 1, +"fs": [] +}, +{ +"tb": 8, +"tbk": 1, +"tl": 23047, +"mb": 8, +"mbk": 1, +"gb": 8, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 32, +"tbk": 2, +"tl": 0, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 1008, +"tbk": 6, +"tl": 3449, +"mb": 512, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 17, +"tbk": 1, +"tl": 5, +"mb": 17, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 11, +"tbk": 1, +"tl": 8, +"mb": 11, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 960, +"tbk": 4, +"tl": 5569, +"mb": 512, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 30, +"tbk": 1, +"tl": 9, +"mb": 30, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 8, +"tbk": 1, +"tl": 646, +"mb": 8, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 8, +"ebk": 1, +"fs": [] +}, +{ +"tb": 216, +"tbk": 1, +"tl": 3030, +"mb": 216, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 136, +"tbk": 1, +"tl": 145, +"mb": 136, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 29, +"tbk": 1, +"tl": 5, +"mb": 29, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 15, +"tbk": 1, +"tl": 7, +"mb": 15, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 6, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 30, +"tbk": 1, +"tl": 6, +"mb": 30, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 672, +"tbk": 3, +"tl": 296686, +"mb": 672, +"mbk": 3, +"gb": 672, +"gbk": 3, +"eb": 672, +"ebk": 3, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 241, +"mb": 24, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 8, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 48, +"tbk": 2, +"tl": 4451, +"mb": 32, +"mbk": 1, +"gb": 32, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 2461, +"mb": 16, +"mbk": 1, +"gb": 16, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 536, +"tbk": 23, +"tl": 1806645, +"mb": 536, +"mbk": 23, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 1228800, +"tbk": 1, +"tl": 28871, +"mb": 1228800, +"mbk": 1, +"gb": 1228800, +"gbk": 1, +"eb": 1228800, +"ebk": 1, +"fs": [] +}, +{ +"tb": 224, +"tbk": 1, +"tl": 20344, +"mb": 224, +"mbk": 1, +"gb": 224, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 483, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 16, +"ebk": 1, +"fs": [] +}, +{ +"tb": 48, +"tbk": 3, +"tl": 0, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 80, +"tbk": 5, +"tl": 0, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 32, +"tbk": 1, +"tl": 36555, +"mb": 32, +"mbk": 1, +"gb": 32, +"gbk": 1, +"eb": 32, +"ebk": 1, +"fs": [] +}, +{ +"tb": 22, +"tbk": 1, +"tl": 5, +"mb": 22, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 17, +"tbk": 1, +"tl": 6, +"mb": 17, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 7, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 3, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 30, +"tbk": 1, +"tl": 6, +"mb": 30, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 96, +"tbk": 1, +"tl": 35837, +"mb": 96, +"mbk": 1, +"gb": 96, +"gbk": 1, +"eb": 96, +"ebk": 1, +"fs": [] +}, +{ +"tb": 32, +"tbk": 2, +"tl": 6267, +"mb": 32, +"mbk": 2, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 1076, +"tbk": 1, +"tl": 1205, +"mb": 1076, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 1076, +"ebk": 1, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 11, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 29, +"tbk": 1, +"tl": 6, +"mb": 29, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 95, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 32, +"tbk": 1, +"tl": 34221, +"mb": 32, +"mbk": 1, +"gb": 32, +"gbk": 1, +"eb": 32, +"ebk": 1, +"fs": [] +}, +{ +"tb": 32, +"tbk": 1, +"tl": 65, +"mb": 32, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 7, +"tbk": 1, +"tl": 1, +"mb": 7, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 2923, +"mb": 16, +"mbk": 1, +"gb": 16, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 23, +"tbk": 1, +"tl": 11, +"mb": 23, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 136, +"tbk": 1, +"tl": 3380, +"mb": 136, +"mbk": 1, +"gb": 136, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 14, +"tbk": 1, +"tl": 1, +"mb": 14, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 2080, +"tbk": 1, +"tl": 587, +"mb": 2080, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 2080, +"ebk": 1, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 6, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 30, +"tbk": 1, +"tl": 9, +"mb": 30, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 23, +"tbk": 1, +"tl": 6, +"mb": 23, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 128, +"tbk": 1, +"tl": 22885, +"mb": 128, +"mbk": 1, +"gb": 128, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 13, +"tbk": 1, +"tl": 7, +"mb": 13, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 7, +"tbk": 1, +"tl": 6114, +"mb": 7, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 14, +"tbk": 1, +"tl": 6, +"mb": 14, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 28, +"tbk": 1, +"tl": 7, +"mb": 28, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 11, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 25, +"tbk": 1, +"tl": 14, +"mb": 25, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 8, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 3, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 5, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 3, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 32, +"tbk": 2, +"tl": 36154, +"mb": 32, +"mbk": 2, +"gb": 32, +"gbk": 2, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 25, +"tbk": 1, +"tl": 5, +"mb": 25, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 136, +"tbk": 2, +"tl": 1500, +"mb": 68, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 12, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 15, +"tbk": 1, +"tl": 4, +"mb": 15, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 64, +"tbk": 1, +"tl": 100810, +"mb": 64, +"mbk": 1, +"gb": 64, +"gbk": 1, +"eb": 64, +"ebk": 1, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 4, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 8, +"mb": 24, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 11, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 2407, +"mb": 16, +"mbk": 1, +"gb": 16, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 5, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 13, +"tbk": 1, +"tl": 4, +"mb": 13, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 15, +"tbk": 1, +"tl": 4, +"mb": 15, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 536, +"tbk": 2, +"tl": 1236, +"mb": 536, +"mbk": 2, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 7, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 5, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 32, +"tbk": 1, +"tl": 34326, +"mb": 32, +"mbk": 1, +"gb": 32, +"gbk": 1, +"eb": 32, +"ebk": 1, +"fs": [] +}, +{ +"tb": 17, +"tbk": 1, +"tl": 3, +"mb": 17, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 18, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 39, +"tbk": 1, +"tl": 7, +"mb": 39, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 9, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 4, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 25, +"tbk": 1, +"tl": 2, +"mb": 25, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 3, +"mb": 24, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 6, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 12, +"tbk": 1, +"tl": 4, +"mb": 12, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 2, +"tl": 97589, +"mb": 12, +"mbk": 1, +"gb": 8, +"gbk": 1, +"eb": 8, +"ebk": 1, +"fs": [] +}, +{ +"tb": 992, +"tbk": 1, +"tl": 36025, +"mb": 992, +"mbk": 1, +"gb": 992, +"gbk": 1, +"eb": 992, +"ebk": 1, +"fs": [] +}, +{ +"tb": 33, +"tbk": 1, +"tl": 12, +"mb": 33, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 30, +"tbk": 1, +"tl": 15, +"mb": 30, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 27, +"tbk": 1, +"tl": 0, +"mb": 27, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 17, +"tbk": 1, +"tl": 6, +"mb": 17, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 1, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 13, +"tbk": 1, +"tl": 8, +"mb": 13, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 3050, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 46, +"mb": 24, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 48, +"tbk": 1, +"tl": 402614, +"mb": 48, +"mbk": 1, +"gb": 48, +"gbk": 1, +"eb": 48, +"ebk": 1, +"fs": [] +}, +{ +"tb": 56, +"tbk": 3, +"tl": 588, +"mb": 32, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 14, +"tbk": 1, +"tl": 3, +"mb": 14, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 0, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 280, +"tbk": 3, +"tl": 72430, +"mb": 280, +"mbk": 3, +"gb": 280, +"gbk": 3, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 13, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 160, +"tbk": 1, +"tl": 31615, +"mb": 160, +"mbk": 1, +"gb": 160, +"gbk": 1, +"eb": 160, +"ebk": 1, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 11, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 22, +"tbk": 1, +"tl": 8, +"mb": 22, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 5, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 17, +"tbk": 1, +"tl": 15, +"mb": 17, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 6, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 23, +"tbk": 1, +"tl": 7, +"mb": 23, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 35, +"tbk": 2, +"tl": 402676, +"mb": 18, +"mbk": 1, +"gb": 18, +"gbk": 1, +"eb": 18, +"ebk": 1, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 10, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 44, +"tbk": 5, +"tl": 110998, +"mb": 44, +"mbk": 5, +"gb": 44, +"gbk": 5, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 8, +"tbk": 1, +"tl": 98307, +"mb": 8, +"mbk": 1, +"gb": 8, +"gbk": 1, +"eb": 8, +"ebk": 1, +"fs": [] +}, +{ +"tb": 1344, +"tbk": 3, +"tl": 2923, +"mb": 768, +"mbk": 1, +"gb": 768, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 2152, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 13, +"tbk": 1, +"tl": 4, +"mb": 13, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 17, +"tbk": 1, +"tl": 3, +"mb": 17, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 7, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 5, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 23, +"tbk": 1, +"tl": 3, +"mb": 23, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 13, +"tbk": 1, +"tl": 5, +"mb": 13, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 212, +"tbk": 1, +"tl": 29768, +"mb": 212, +"mbk": 1, +"gb": 212, +"gbk": 1, +"eb": 212, +"ebk": 1, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 6, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 30, +"tbk": 1, +"tl": 12, +"mb": 30, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 20, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 22, +"tbk": 1, +"tl": 7, +"mb": 22, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 13, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 5, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 70, +"tbk": 3, +"tl": 12198, +"mb": 40, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 48, +"tbk": 4, +"tl": 203, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 0, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 5090, +"mb": 16, +"mbk": 1, +"gb": 16, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 4, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 17, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 12, +"tbk": 1, +"tl": 5, +"mb": 12, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 112, +"tbk": 3, +"tl": 62, +"mb": 64, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 33, +"tbk": 1, +"tl": 4, +"mb": 33, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 7, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 15, +"tbk": 1, +"tl": 35, +"mb": 15, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 20, +"mb": 24, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 8, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 5, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 1, +"mb": 24, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 30, +"tbk": 1, +"tl": 10, +"mb": 30, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 7, +"mb": 24, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 8, +"mb": 24, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 8, +"tbk": 1, +"tl": 2, +"mb": 8, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 104, +"tbk": 2, +"tl": 1307, +"mb": 52, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 38, +"tbk": 1, +"tl": 5, +"mb": 38, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 9, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 12, +"tbk": 1, +"tl": 2, +"mb": 12, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 2880, +"tbk": 4, +"tl": 5092, +"mb": 1536, +"mbk": 1, +"gb": 1536, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 10, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 8, +"tbk": 1, +"tl": 134611, +"mb": 8, +"mbk": 1, +"gb": 8, +"gbk": 1, +"eb": 8, +"ebk": 1, +"fs": [] +}, +{ +"tb": 14, +"tbk": 1, +"tl": 1, +"mb": 14, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 80, +"tbk": 1, +"tl": 682, +"mb": 80, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 4, +"mb": 24, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 44, +"tbk": 1, +"tl": 2, +"mb": 44, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 5200, +"tbk": 1, +"tl": 27649, +"mb": 5200, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 7, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 8, +"tbk": 1, +"tl": 712, +"mb": 8, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 232, +"tbk": 2, +"tl": 580, +"mb": 116, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 11, +"tbk": 1, +"tl": 4, +"mb": 11, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 13, +"tbk": 1, +"tl": 3, +"mb": 13, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 8, +"tbk": 1, +"tl": 100928, +"mb": 8, +"mbk": 1, +"gb": 8, +"gbk": 1, +"eb": 8, +"ebk": 1, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 5, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 128, +"tbk": 1, +"tl": 98604, +"mb": 128, +"mbk": 1, +"gb": 128, +"gbk": 1, +"eb": 128, +"ebk": 1, +"fs": [] +}, +{ +"tb": 128, +"tbk": 8, +"tl": 10794, +"mb": 128, +"mbk": 8, +"gb": 128, +"gbk": 8, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 10, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 8, +"tbk": 1, +"tl": 621, +"mb": 8, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 2, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 22, +"tbk": 1, +"tl": 26, +"mb": 22, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 1088, +"tbk": 7, +"tl": 42730, +"mb": 576, +"mbk": 2, +"gb": 576, +"gbk": 2, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 38, +"tbk": 1, +"tl": 6, +"mb": 38, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 17, +"tbk": 1, +"tl": 3, +"mb": 17, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 8, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 6, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 3, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 11, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 4, +"tbk": 1, +"tl": 1, +"mb": 4, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 416, +"tbk": 1, +"tl": 205, +"mb": 416, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 64, +"tbk": 1, +"tl": 378478, +"mb": 64, +"mbk": 1, +"gb": 64, +"gbk": 1, +"eb": 64, +"ebk": 1, +"fs": [] +}, +{ +"tb": 17, +"tbk": 1, +"tl": 4, +"mb": 17, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 12, +"tbk": 1, +"tl": 8, +"mb": 12, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 8, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 13, +"tbk": 1, +"tl": 5, +"mb": 13, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 10, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 8, +"tbk": 1, +"tl": 6267, +"mb": 8, +"mbk": 1, +"gb": 8, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 22, +"tbk": 1, +"tl": 5, +"mb": 22, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 2, +"tl": 1291, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 6, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 10, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 48, +"tbk": 1, +"tl": 59725, +"mb": 48, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 5440, +"tbk": 7, +"tl": 42730, +"mb": 2880, +"mbk": 2, +"gb": 2880, +"gbk": 2, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 22, +"tbk": 1, +"tl": 14, +"mb": 22, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 22, +"tbk": 1, +"tl": 5, +"mb": 22, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 14, +"tbk": 1, +"tl": 5, +"mb": 14, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 5, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 17, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 28, +"tbk": 1, +"tl": 5, +"mb": 28, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 8, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 23, +"tbk": 1, +"tl": 3, +"mb": 23, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 11, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 5, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 5, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 3012, +"tbk": 7, +"tl": 92, +"mb": 1608, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 11, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 8, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 13, +"tbk": 1, +"tl": 5, +"mb": 13, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 27, +"tbk": 1, +"tl": 6, +"mb": 27, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 3, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 13, +"tbk": 1, +"tl": 2, +"mb": 13, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 30, +"tbk": 2, +"tl": 182, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 30, +"tbk": 1, +"tl": 30, +"mb": 30, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 10, +"tbk": 1, +"tl": 2, +"mb": 10, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 3, +"tbk": 1, +"tl": 22946, +"mb": 3, +"mbk": 1, +"gb": 3, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 28, +"tbk": 1, +"tl": 7, +"mb": 28, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 11, +"tbk": 1, +"tl": 2, +"mb": 11, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 7, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 8, +"tbk": 1, +"tl": 31250, +"mb": 8, +"mbk": 1, +"gb": 8, +"gbk": 1, +"eb": 8, +"ebk": 1, +"fs": [] +}, +{ +"tb": 27, +"tbk": 1, +"tl": 8, +"mb": 27, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 3, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 192, +"tbk": 3, +"tl": 36379, +"mb": 144, +"mbk": 2, +"gb": 144, +"gbk": 2, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 4, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 96, +"tbk": 2, +"tl": 5479, +"mb": 64, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 1344, +"tbk": 3, +"tl": 3261, +"mb": 768, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 1243, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 6, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 84, +"tbk": 1, +"tl": 1522, +"mb": 84, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 23, +"tbk": 1, +"tl": 5, +"mb": 23, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 48, +"tbk": 1, +"tl": 78, +"mb": 48, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 8, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 26, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 11, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 4, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 8, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 17, +"tbk": 1, +"tl": 20, +"mb": 17, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 14, +"tbk": 1, +"tl": 5, +"mb": 14, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 23, +"tbk": 1, +"tl": 13, +"mb": 23, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 27, +"tbk": 1, +"tl": 7, +"mb": 27, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 347380, +"mb": 24, +"mbk": 1, +"gb": 24, +"gbk": 1, +"eb": 24, +"ebk": 1, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 13, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 5, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 184, +"tbk": 1, +"tl": 402161, +"mb": 184, +"mbk": 1, +"gb": 184, +"gbk": 1, +"eb": 184, +"ebk": 1, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 14087, +"mb": 24, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 48, +"tbk": 1, +"tl": 59835, +"mb": 48, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 83, +"tbk": 7, +"tl": 167785, +"mb": 83, +"mbk": 7, +"gb": 83, +"gbk": 7, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 48, +"tbk": 2, +"tl": 0, +"mb": 32, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 8, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 576, +"tbk": 2, +"tl": 643, +"mb": 384, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 4, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 7, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 64, +"tbk": 1, +"tl": 304, +"mb": 64, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 64, +"ebk": 1, +"fs": [] +}, +{ +"tb": 7, +"tbk": 2, +"tl": 44624, +"mb": 7, +"mbk": 2, +"gb": 7, +"gbk": 2, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 18118, +"mb": 16, +"mbk": 1, +"gb": 16, +"gbk": 1, +"eb": 16, +"ebk": 1, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 7, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 144, +"tbk": 2, +"tl": 101, +"mb": 72, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 212819, +"mb": 21, +"mbk": 1, +"gb": 21, +"gbk": 1, +"eb": 21, +"ebk": 1, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 7, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 8, +"tbk": 1, +"tl": 20388, +"mb": 8, +"mbk": 1, +"gb": 8, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 13, +"tbk": 1, +"tl": 5, +"mb": 13, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 17, +"tbk": 1, +"tl": 7, +"mb": 17, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 3, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 15, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 48, +"tbk": 1, +"tl": 207, +"mb": 48, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 34175, +"mb": 16, +"mbk": 1, +"gb": 16, +"gbk": 1, +"eb": 16, +"ebk": 1, +"fs": [] +}, +{ +"tb": 32, +"tbk": 1, +"tl": 29908, +"mb": 32, +"mbk": 1, +"gb": 32, +"gbk": 1, +"eb": 32, +"ebk": 1, +"fs": [] +}, +{ +"tb": 25, +"tbk": 1, +"tl": 5, +"mb": 25, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 15, +"tbk": 1, +"tl": 8, +"mb": 15, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 12, +"tbk": 1, +"tl": 2, +"mb": 12, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 15, +"tbk": 1, +"tl": 14, +"mb": 15, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 22, +"tbk": 1, +"tl": 12, +"mb": 22, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 22, +"tbk": 1, +"tl": 4, +"mb": 22, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 13, +"tbk": 1, +"tl": 5, +"mb": 13, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 5, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 25, +"tbk": 1, +"tl": 22, +"mb": 25, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 2, +"tl": 59569, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 29, +"tbk": 1, +"tl": 7, +"mb": 29, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 0, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 62, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 2545, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 15, +"tbk": 1, +"tl": 4, +"mb": 15, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 17, +"tbk": 1, +"tl": 3, +"mb": 17, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 5, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 6, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 320, +"tbk": 1, +"tl": 156, +"mb": 320, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 28, +"tbk": 1, +"tl": 7, +"mb": 28, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 8, +"tbk": 1, +"tl": 73, +"mb": 8, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 4, +"tbk": 1, +"tl": 389670, +"mb": 4, +"mbk": 1, +"gb": 4, +"gbk": 1, +"eb": 4, +"ebk": 1, +"fs": [] +}, +{ +"tb": 25, +"tbk": 1, +"tl": 10, +"mb": 25, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 32, +"tbk": 2, +"tl": 1, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 23, +"tbk": 1, +"tl": 10, +"mb": 23, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 4, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 23, +"tbk": 1, +"tl": 5, +"mb": 23, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 23, +"tbk": 1, +"tl": 3, +"mb": 23, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 25, +"tbk": 1, +"tl": 4, +"mb": 25, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 9, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 29, +"tbk": 1, +"tl": 5, +"mb": 29, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 5, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 128, +"tbk": 1, +"tl": 292, +"mb": 128, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 2496, +"tbk": 2, +"tl": 5480, +"mb": 1664, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 3, +"tl": 67711, +"mb": 24, +"mbk": 3, +"gb": 24, +"gbk": 3, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 48, +"tbk": 1, +"tl": 9474, +"mb": 48, +"mbk": 1, +"gb": 48, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 37591, +"mb": 24, +"mbk": 1, +"gb": 24, +"gbk": 1, +"eb": 24, +"ebk": 1, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 6, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 1280, +"tbk": 1, +"tl": 100983, +"mb": 1280, +"mbk": 1, +"gb": 1280, +"gbk": 1, +"eb": 1280, +"ebk": 1, +"fs": [] +}, +{ +"tb": 320, +"tbk": 2, +"tl": 42430, +"mb": 320, +"mbk": 2, +"gb": 320, +"gbk": 2, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 144, +"tbk": 1, +"tl": 10, +"mb": 144, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 688, +"tbk": 1, +"tl": 7540, +"mb": 688, +"mbk": 1, +"gb": 688, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 12, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 4, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 2, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 5656, +"tbk": 1, +"tl": 218257, +"mb": 5656, +"mbk": 1, +"gb": 5656, +"gbk": 1, +"eb": 5656, +"ebk": 1, +"fs": [] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 8, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 32, +"tbk": 1, +"tl": 18560, +"mb": 32, +"mbk": 1, +"gb": 32, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 25, +"tbk": 1, +"tl": 9, +"mb": 25, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 724, +"tbk": 1, +"tl": 18366, +"mb": 724, +"mbk": 1, +"gb": 724, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 0, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 13, +"tbk": 1, +"tl": 4, +"mb": 13, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 212, +"tbk": 1, +"tl": 36223, +"mb": 212, +"mbk": 1, +"gb": 212, +"gbk": 1, +"eb": 212, +"ebk": 1, +"fs": [] +}, +{ +"tb": 12, +"tbk": 1, +"tl": 4, +"mb": 12, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 9, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 80, +"tbk": 5, +"tl": 23436, +"mb": 80, +"mbk": 5, +"gb": 80, +"gbk": 5, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 22, +"tbk": 1, +"tl": 0, +"mb": 22, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 30, +"tbk": 1, +"tl": 10, +"mb": 30, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 6, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 27, +"tbk": 1, +"tl": 7, +"mb": 27, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 32, +"tbk": 2, +"tl": 0, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 224, +"tbk": 1, +"tl": 98404, +"mb": 224, +"mbk": 1, +"gb": 224, +"gbk": 1, +"eb": 224, +"ebk": 1, +"fs": [] +}, +{ +"tb": 32, +"tbk": 1, +"tl": 4510, +"mb": 32, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 32, +"tbk": 2, +"tl": 1, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 5, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 48, +"tbk": 1, +"tl": 97401, +"mb": 48, +"mbk": 1, +"gb": 48, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 25, +"tbk": 1, +"tl": 11, +"mb": 25, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 32, +"tbk": 2, +"tl": 2, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 4, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 3, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 1280, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 22, +"tbk": 1, +"tl": 10, +"mb": 22, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 137, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 10, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 23, +"tbk": 1, +"tl": 10, +"mb": 23, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 192, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 144, +"tbk": 1, +"tl": 101087, +"mb": 144, +"mbk": 1, +"gb": 144, +"gbk": 1, +"eb": 144, +"ebk": 1, +"fs": [] +}, +{ +"tb": 8, +"tbk": 1, +"tl": 30679, +"mb": 8, +"mbk": 1, +"gb": 8, +"gbk": 1, +"eb": 8, +"ebk": 1, +"fs": [] +}, +{ +"tb": 212, +"tbk": 2, +"tl": 22362, +"mb": 160, +"mbk": 1, +"gb": 160, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 5, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 13, +"tbk": 1, +"tl": 4, +"mb": 13, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 4, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 7, +"tbk": 1, +"tl": 0, +"mb": 7, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 17, +"tbk": 1, +"tl": 3, +"mb": 17, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 32, +"tbk": 1, +"tl": 30112, +"mb": 32, +"mbk": 1, +"gb": 32, +"gbk": 1, +"eb": 32, +"ebk": 1, +"fs": [] +}, +{ +"tb": 7051, +"tbk": 291, +"tl": 66269446, +"mb": 7051, +"mbk": 291, +"gb": 7051, +"gbk": 291, +"eb": 7051, +"ebk": 291, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 9, +"mb": 24, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 6, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 16, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 32, +"tbk": 1, +"tl": 28684, +"mb": 32, +"mbk": 1, +"gb": 32, +"gbk": 1, +"eb": 32, +"ebk": 1, +"fs": [] +}, +{ +"tb": 23, +"tbk": 1, +"tl": 24, +"mb": 23, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 257, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 32, +"tbk": 2, +"tl": 0, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 62, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 134547, +"mb": 16, +"mbk": 1, +"gb": 16, +"gbk": 1, +"eb": 16, +"ebk": 1, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 20, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 536, +"tbk": 23, +"tl": 21101, +"mb": 536, +"mbk": 23, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 28, +"tbk": 1, +"tl": 10, +"mb": 28, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 5, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 8, +"tbk": 1, +"tl": 28910, +"mb": 8, +"mbk": 1, +"gb": 8, +"gbk": 1, +"eb": 8, +"ebk": 1, +"fs": [] +}, +{ +"tb": 12, +"tbk": 1, +"tl": 2, +"mb": 12, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 48, +"tbk": 2, +"tl": 0, +"mb": 32, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 8, +"tbk": 1, +"tl": 31530, +"mb": 8, +"mbk": 1, +"gb": 8, +"gbk": 1, +"eb": 8, +"ebk": 1, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 5, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 22, +"tbk": 1, +"tl": 7, +"mb": 22, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 96, +"tbk": 1, +"tl": 594, +"mb": 96, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 9, +"tbk": 1, +"tl": 2, +"mb": 9, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 15, +"tbk": 1, +"tl": 3, +"mb": 15, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 224, +"tbk": 7, +"tl": 1715, +"mb": 32, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 48, +"tbk": 1, +"tl": 402642, +"mb": 48, +"mbk": 1, +"gb": 48, +"gbk": 1, +"eb": 48, +"ebk": 1, +"fs": [] +}, +{ +"tb": 17, +"tbk": 1, +"tl": 2, +"mb": 17, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 7, +"mb": 24, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 4, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 3, +"mb": 24, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 288, +"tbk": 1, +"tl": 390299, +"mb": 288, +"mbk": 1, +"gb": 288, +"gbk": 1, +"eb": 288, +"ebk": 1, +"fs": [ +1, +9, +10 +] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 5, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 9, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 12269, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 18, +"mb": 24, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 31683, +"mb": 24, +"mbk": 1, +"gb": 24, +"gbk": 1, +"eb": 24, +"ebk": 1, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 6941, +"mb": 16, +"mbk": 1, +"gb": 16, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 276, +"tbk": 1, +"tl": 2391, +"mb": 276, +"mbk": 1, +"gb": 276, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 29, +"tbk": 1, +"tl": 0, +"mb": 29, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 3, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 98019, +"mb": 24, +"mbk": 1, +"gb": 24, +"gbk": 1, +"eb": 24, +"ebk": 1, +"fs": [] +}, +{ +"tb": 256, +"tbk": 1, +"tl": 373, +"mb": 256, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 4216, +"tbk": 7, +"tl": 89, +"mb": 2328, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 5, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 4, +"tbk": 1, +"tl": 2805, +"mb": 4, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 800, +"tbk": 1, +"tl": 3242, +"mb": 800, +"mbk": 1, +"gb": 800, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 7, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 37484, +"mb": 24, +"mbk": 1, +"gb": 24, +"gbk": 1, +"eb": 24, +"ebk": 1, +"fs": [] +}, +{ +"tb": 31, +"tbk": 1, +"tl": 9, +"mb": 31, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 128, +"tbk": 1, +"tl": 181, +"mb": 128, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 84, +"tbk": 3, +"tl": 12234, +"mb": 48, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 7, +"tbk": 2, +"tl": 44264, +"mb": 7, +"mbk": 2, +"gb": 7, +"gbk": 2, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 2976, +"tbk": 1, +"tl": 18173, +"mb": 2976, +"mbk": 1, +"gb": 2976, +"gbk": 1, +"eb": 2976, +"ebk": 1, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 4835, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 48, +"tbk": 2, +"tl": 5563, +"mb": 32, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 6, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 17, +"tbk": 1, +"tl": 10, +"mb": 17, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 34, +"tbk": 1, +"tl": 8, +"mb": 34, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 17, +"tbk": 1, +"tl": 4, +"mb": 17, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 32, +"tbk": 2, +"tl": 0, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 130, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 320, +"tbk": 2, +"tl": 44174, +"mb": 320, +"mbk": 2, +"gb": 320, +"gbk": 2, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 31, +"tbk": 1, +"tl": 6, +"mb": 31, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 98, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 6, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 13, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 2400, +"tbk": 1, +"tl": 214276, +"mb": 2400, +"mbk": 1, +"gb": 2400, +"gbk": 1, +"eb": 2400, +"ebk": 1, +"fs": [] +}, +{ +"tb": 1920, +"tbk": 4, +"tl": 441, +"mb": 1024, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 20, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 2032, +"tbk": 7, +"tl": 586, +"mb": 1024, +"mbk": 1, +"gb": 1024, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 30, +"tbk": 1, +"tl": 9, +"mb": 30, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 12, +"tbk": 1, +"tl": 674, +"mb": 12, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 12, +"tbk": 1, +"tl": 2, +"mb": 12, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 64, +"tbk": 1, +"tl": 17388, +"mb": 64, +"mbk": 1, +"gb": 64, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 8, +"tbk": 1, +"tl": 0, +"mb": 8, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 8, +"tbk": 1, +"tl": 36414, +"mb": 8, +"mbk": 1, +"gb": 8, +"gbk": 1, +"eb": 8, +"ebk": 1, +"fs": [] +}, +{ +"tb": 11, +"tbk": 1, +"tl": 5, +"mb": 11, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 12, +"tbk": 1, +"tl": 7, +"mb": 12, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 6, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 2, +"tl": 97343, +"mb": 16, +"mbk": 1, +"gb": 4, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 25, +"tbk": 1, +"tl": 8, +"mb": 25, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 0, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 12, +"tbk": 1, +"tl": 4, +"mb": 12, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 14, +"tbk": 1, +"tl": 9, +"mb": 14, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 52, +"tbk": 1, +"tl": 7609, +"mb": 52, +"mbk": 1, +"gb": 52, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 4125, +"mb": 16, +"mbk": 1, +"gb": 16, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 8, +"tbk": 1, +"tl": 36614, +"mb": 8, +"mbk": 1, +"gb": 8, +"gbk": 1, +"eb": 8, +"ebk": 1, +"fs": [] +}, +{ +"tb": 36, +"tbk": 2, +"tl": 64, +"mb": 24, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 17, +"tbk": 1, +"tl": 5, +"mb": 17, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 9, +"mb": 24, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 14, +"tbk": 1, +"tl": 2, +"mb": 14, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 17, +"tbk": 1, +"tl": 5, +"mb": 17, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 13, +"tbk": 1, +"tl": 9, +"mb": 13, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 5, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 12048, +"tbk": 1, +"tl": 98216, +"mb": 12048, +"mbk": 1, +"gb": 12048, +"gbk": 1, +"eb": 12048, +"ebk": 1, +"fs": [] +}, +{ +"tb": 22, +"tbk": 1, +"tl": 6, +"mb": 22, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 14, +"mb": 24, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 27, +"tbk": 1, +"tl": 1, +"mb": 27, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 64, +"tbk": 1, +"tl": 29508, +"mb": 64, +"mbk": 1, +"gb": 64, +"gbk": 1, +"eb": 64, +"ebk": 1, +"fs": [] +}, +{ +"tb": 13, +"tbk": 1, +"tl": 2, +"mb": 13, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 3, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 30, +"tbk": 1, +"tl": 8, +"mb": 30, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 7, +"tbk": 1, +"tl": 0, +"mb": 7, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 30462, +"mb": 16, +"mbk": 1, +"gb": 16, +"gbk": 1, +"eb": 16, +"ebk": 1, +"fs": [] +}, +{ +"tb": 36, +"tbk": 1, +"tl": 63, +"mb": 36, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 10, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 22, +"tbk": 1, +"tl": 20, +"mb": 22, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 5, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 17, +"tbk": 1, +"tl": 3, +"mb": 17, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 14, +"tbk": 1, +"tl": 5, +"mb": 14, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 17, +"tbk": 1, +"tl": 5, +"mb": 17, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 5, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 5, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 48, +"tbk": 1, +"tl": 2, +"mb": 48, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 2048, +"tbk": 4, +"tl": 10181, +"mb": 1280, +"mbk": 2, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 32, +"tbk": 1, +"tl": 24557, +"mb": 32, +"mbk": 1, +"gb": 32, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 4, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 27, +"tbk": 1, +"tl": 6, +"mb": 27, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 13, +"tbk": 1, +"tl": 10, +"mb": 13, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 29, +"tbk": 1, +"tl": 24964, +"mb": 29, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 240, +"tbk": 4, +"tl": 1210, +"mb": 128, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 3, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 13, +"tbk": 1, +"tl": 3, +"mb": 13, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 12, +"tbk": 1, +"tl": 7, +"mb": 12, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 68, +"tbk": 2, +"tl": 383, +"mb": 52, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 128, +"tbk": 3, +"tl": 10748, +"mb": 96, +"mbk": 2, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 17, +"tbk": 1, +"tl": 32, +"mb": 17, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 6, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 36274, +"mb": 16, +"mbk": 1, +"gb": 16, +"gbk": 1, +"eb": 16, +"ebk": 1, +"fs": [] +}, +{ +"tb": 25, +"tbk": 1, +"tl": 4, +"mb": 25, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 224, +"tbk": 3, +"tl": 22003, +"mb": 128, +"mbk": 1, +"gb": 128, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 0, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 15, +"tbk": 1, +"tl": 65, +"mb": 15, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 25, +"tbk": 1, +"tl": 2, +"mb": 25, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 27, +"tbk": 1, +"tl": 6, +"mb": 27, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 33, +"tbk": 1, +"tl": 8, +"mb": 33, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 48, +"tbk": 2, +"tl": 9115, +"mb": 32, +"mbk": 1, +"gb": 32, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 688, +"tbk": 1, +"tl": 3970, +"mb": 688, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 7, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 14, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 7, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 31, +"tbk": 1, +"tl": 5, +"mb": 31, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 36, +"tbk": 1, +"tl": 1, +"mb": 36, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 13, +"tbk": 1, +"tl": 2, +"mb": 13, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 8, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 7, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 28, +"tbk": 1, +"tl": 5, +"mb": 28, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 12, +"tbk": 1, +"tl": 5, +"mb": 12, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 12, +"tbk": 1, +"tl": 1, +"mb": 12, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 8, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 22, +"tbk": 1, +"tl": 27, +"mb": 22, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 25, +"tbk": 1, +"tl": 7, +"mb": 25, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 41, +"tbk": 1, +"tl": 212665, +"mb": 41, +"mbk": 1, +"gb": 41, +"gbk": 1, +"eb": 41, +"ebk": 1, +"fs": [] +}, +{ +"tb": 90, +"tbk": 6, +"tl": 551, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 88, +"tbk": 1, +"tl": 4767, +"mb": 88, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 0, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 13, +"tbk": 1, +"tl": 4, +"mb": 13, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 25628, +"tbk": 8, +"tl": 234396, +"mb": 19232, +"mbk": 2, +"gb": 12816, +"gbk": 1, +"eb": 12816, +"ebk": 1, +"fs": [] +}, +{ +"tb": 7, +"tbk": 1, +"tl": 9708, +"mb": 7, +"mbk": 1, +"gb": 7, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 6, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 28, +"tbk": 1, +"tl": 5, +"mb": 28, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 29, +"tbk": 1, +"tl": 1, +"mb": 29, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 3, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 15, +"tbk": 1, +"tl": 7, +"mb": 15, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 12, +"tbk": 1, +"tl": 8, +"mb": 12, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 620, +"tbk": 2, +"tl": 4100, +"mb": 620, +"mbk": 2, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 28, +"tbk": 1, +"tl": 5, +"mb": 28, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 8, +"tbk": 1, +"tl": 2, +"mb": 8, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 9, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 736, +"tbk": 1, +"tl": 28405, +"mb": 736, +"mbk": 1, +"gb": 736, +"gbk": 1, +"eb": 736, +"ebk": 1, +"fs": [] +}, +{ +"tb": 32, +"tbk": 2, +"tl": 11217, +"mb": 32, +"mbk": 2, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 10, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 14, +"tbk": 1, +"tl": 2, +"mb": 14, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 4, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 9, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 8, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 96, +"tbk": 2, +"tl": 3234, +"mb": 64, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 130, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 28351, +"mb": 16, +"mbk": 1, +"gb": 16, +"gbk": 1, +"eb": 16, +"ebk": 1, +"fs": [] +}, +{ +"tb": 32, +"tbk": 1, +"tl": 425, +"mb": 32, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 32, +"ebk": 1, +"fs": [] +}, +{ +"tb": 14, +"tbk": 1, +"tl": 6, +"mb": 14, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 257, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 8, +"tbk": 1, +"tl": 0, +"mb": 8, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 14, +"tbk": 1, +"tl": 5, +"mb": 14, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 4, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 3, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 8, +"tbk": 1, +"tl": 34371, +"mb": 8, +"mbk": 1, +"gb": 8, +"gbk": 1, +"eb": 8, +"ebk": 1, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 11, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 12, +"mb": 24, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 40, +"tbk": 1, +"tl": 9, +"mb": 40, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 6, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 2912, +"tbk": 3, +"tl": 22004, +"mb": 1664, +"mbk": 1, +"gb": 1664, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 34, +"tbk": 1, +"tl": 6, +"mb": 34, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 15, +"mb": 24, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 640, +"tbk": 4, +"tl": 10402, +"mb": 448, +"mbk": 2, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 57, +"tbk": 1, +"tl": 100759, +"mb": 57, +"mbk": 1, +"gb": 57, +"gbk": 1, +"eb": 57, +"ebk": 1, +"fs": [] +}, +{ +"tb": 64, +"tbk": 1, +"tl": 98155, +"mb": 64, +"mbk": 1, +"gb": 64, +"gbk": 1, +"eb": 64, +"ebk": 1, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 586, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 12, +"tbk": 1, +"tl": 5, +"mb": 12, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 5, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 24, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 8, +"tbk": 1, +"tl": 36666, +"mb": 8, +"mbk": 1, +"gb": 8, +"gbk": 1, +"eb": 8, +"ebk": 1, +"fs": [] +}, +{ +"tb": 14, +"tbk": 1, +"tl": 4, +"mb": 14, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 52, +"tbk": 1, +"tl": 392590, +"mb": 52, +"mbk": 1, +"gb": 52, +"gbk": 1, +"eb": 52, +"ebk": 1, +"fs": [ +1, +2, +3, +4, +5, +6 +] +}, +{ +"tb": 22, +"tbk": 1, +"tl": 4, +"mb": 22, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 13, +"tbk": 1, +"tl": 3, +"mb": 13, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 64, +"tbk": 1, +"tl": 29300, +"mb": 64, +"mbk": 1, +"gb": 64, +"gbk": 1, +"eb": 64, +"ebk": 1, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 0, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 64, +"tbk": 1, +"tl": 29089, +"mb": 64, +"mbk": 1, +"gb": 64, +"gbk": 1, +"eb": 64, +"ebk": 1, +"fs": [] +}, +{ +"tb": 100, +"tbk": 1, +"tl": 277, +"mb": 100, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 11, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 9, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 2, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 5, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 8, +"tbk": 2, +"tl": 0, +"mb": 4, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 40, +"tbk": 2, +"tl": 36076, +"mb": 32, +"mbk": 1, +"gb": 8, +"gbk": 1, +"eb": 8, +"ebk": 1, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 6, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 64, +"tbk": 1, +"tl": 31494, +"mb": 64, +"mbk": 1, +"gb": 64, +"gbk": 1, +"eb": 64, +"ebk": 1, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 4, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 6944, +"tbk": 5, +"tl": 5570, +"mb": 3584, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 140, +"tbk": 2, +"tl": 42518, +"mb": 140, +"mbk": 2, +"gb": 140, +"gbk": 2, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 12, +"tbk": 1, +"tl": 3, +"mb": 12, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 6, +"mb": 24, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 15, +"tbk": 1, +"tl": 8, +"mb": 15, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 22, +"tbk": 1, +"tl": 212742, +"mb": 22, +"mbk": 1, +"gb": 22, +"gbk": 1, +"eb": 22, +"ebk": 1, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 4, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 8, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 532, +"tbk": 2, +"tl": 877, +"mb": 416, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 3206, +"mb": 16, +"mbk": 1, +"gb": 16, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 496, +"tbk": 1, +"tl": 349047, +"mb": 496, +"mbk": 1, +"gb": 496, +"gbk": 1, +"eb": 496, +"ebk": 1, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 13, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 23, +"tbk": 1, +"tl": 5, +"mb": 23, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 23, +"tbk": 1, +"tl": 4, +"mb": 23, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 6, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 17, +"tbk": 1, +"tl": 21, +"mb": 17, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 928, +"tbk": 1, +"tl": 31393, +"mb": 928, +"mbk": 1, +"gb": 928, +"gbk": 1, +"eb": 928, +"ebk": 1, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 7, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 22, +"tbk": 1, +"tl": 11, +"mb": 22, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 80, +"tbk": 5, +"tl": 3, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 7, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 13, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 5, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 99158, +"mb": 24, +"mbk": 1, +"gb": 24, +"gbk": 1, +"eb": 24, +"ebk": 1, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 5, +"mb": 24, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 8, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 7, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 8, +"tbk": 1, +"tl": 268, +"mb": 8, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 9, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 23, +"tbk": 1, +"tl": 23, +"mb": 23, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 17, +"tbk": 1, +"tl": 10, +"mb": 17, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 4576, +"mb": 16, +"mbk": 1, +"gb": 16, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 536, +"tbk": 2, +"tl": 1247, +"mb": 536, +"mbk": 2, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 1, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 32, +"tbk": 1, +"tl": 25584, +"mb": 32, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 23, +"tbk": 1, +"tl": 6, +"mb": 23, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 8, +"tbk": 1, +"tl": 34074, +"mb": 8, +"mbk": 1, +"gb": 8, +"gbk": 1, +"eb": 8, +"ebk": 1, +"fs": [] +}, +{ +"tb": 29, +"tbk": 1, +"tl": 6, +"mb": 29, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 15, +"tbk": 1, +"tl": 25, +"mb": 15, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 6, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 0, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 32, +"tbk": 2, +"tl": 0, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 48, +"tbk": 1, +"tl": 986, +"mb": 48, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 6, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 4, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 6, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 5, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 7, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 4, +"mb": 24, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 1216, +"tbk": 1, +"tl": 21632, +"mb": 1216, +"mbk": 1, +"gb": 1216, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 40, +"tbk": 2, +"tl": 3, +"mb": 24, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 27, +"tbk": 1, +"tl": 14, +"mb": 27, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 84, +"tbk": 1, +"tl": 1456, +"mb": 84, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 96, +"tbk": 1, +"tl": 1351, +"mb": 96, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 15, +"tbk": 1, +"tl": 5, +"mb": 15, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 28, +"tbk": 1, +"tl": 7, +"mb": 28, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 17, +"tbk": 1, +"tl": 2, +"mb": 17, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 6, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 6, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 59779, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 12, +"tbk": 1, +"tl": 1566, +"mb": 12, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 160, +"tbk": 1, +"tl": 29452, +"mb": 160, +"mbk": 1, +"gb": 160, +"gbk": 1, +"eb": 160, +"ebk": 1, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 4, +"mb": 24, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 14, +"tbk": 1, +"tl": 10, +"mb": 14, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 632, +"tbk": 2, +"tl": 232, +"mb": 632, +"mbk": 2, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 13, +"tbk": 1, +"tl": 5, +"mb": 13, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 25, +"tbk": 1, +"tl": 6, +"mb": 25, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 8, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 12, +"tbk": 1, +"tl": 30903, +"mb": 12, +"mbk": 1, +"gb": 12, +"gbk": 1, +"eb": 12, +"ebk": 1, +"fs": [] +}, +{ +"tb": 28, +"tbk": 1, +"tl": 9, +"mb": 28, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 12, +"tbk": 1, +"tl": 270, +"mb": 12, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 7, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 15, +"tbk": 1, +"tl": 3, +"mb": 15, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 5, +"mb": 24, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 128, +"tbk": 1, +"tl": 449, +"mb": 128, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 192, +"tbk": 2, +"tl": 16687, +"mb": 128, +"mbk": 1, +"gb": 128, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 120, +"tbk": 1, +"tl": 5, +"mb": 120, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 0, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 8, +"tbk": 1, +"tl": 23101, +"mb": 8, +"mbk": 1, +"gb": 8, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 52, +"tbk": 1, +"tl": 638, +"mb": 52, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 128, +"tbk": 1, +"tl": 94, +"mb": 128, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 40, +"tbk": 1, +"tl": 392531, +"mb": 40, +"mbk": 1, +"gb": 40, +"gbk": 1, +"eb": 40, +"ebk": 1, +"fs": [ +1, +2, +3, +4, +5, +6, +7, +8 +] +}, +{ +"tb": 248, +"tbk": 1, +"tl": 398749, +"mb": 248, +"mbk": 1, +"gb": 248, +"gbk": 1, +"eb": 248, +"ebk": 1, +"fs": [ +1, +2, +3, +4, +5, +6, +7, +8 +] +}, +{ +"tb": 210, +"tbk": 14, +"tl": 129, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 13, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 23, +"tbk": 1, +"tl": 5, +"mb": 23, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 11, +"tbk": 1, +"tl": 3, +"mb": 11, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 22, +"tbk": 1, +"tl": 9, +"mb": 22, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 1008, +"tbk": 6, +"tl": 68, +"mb": 512, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 48, +"tbk": 1, +"tl": 5882, +"mb": 48, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 1248, +"tbk": 1, +"tl": 36719, +"mb": 1248, +"mbk": 1, +"gb": 1248, +"gbk": 1, +"eb": 1248, +"ebk": 1, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 5, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 496, +"tbk": 5, +"tl": 67, +"mb": 256, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 32, +"tbk": 2, +"tl": 1356, +"mb": 32, +"mbk": 2, +"gb": 32, +"gbk": 2, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 10, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 17, +"tbk": 1, +"tl": 3, +"mb": 17, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 8, +"tbk": 1, +"tl": 51, +"mb": 8, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 2016, +"tbk": 9, +"tl": 333634, +"mb": 2016, +"mbk": 9, +"gb": 2016, +"gbk": 9, +"eb": 2016, +"ebk": 9, +"fs": [] +}, +{ +"tb": 48, +"tbk": 2, +"tl": 386, +"mb": 32, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 8, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 9, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 32, +"tbk": 1, +"tl": 17501, +"mb": 32, +"mbk": 1, +"gb": 32, +"gbk": 1, +"eb": 32, +"ebk": 1, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 4, +"mb": 24, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 5, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 8, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 13, +"tbk": 1, +"tl": 5, +"mb": 13, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 40, +"tbk": 1, +"tl": 402585, +"mb": 40, +"mbk": 1, +"gb": 40, +"gbk": 1, +"eb": 40, +"ebk": 1, +"fs": [] +}, +{ +"tb": 14, +"tbk": 1, +"tl": 7, +"mb": 14, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 17, +"tbk": 1, +"tl": 7, +"mb": 17, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 6, +"mb": 24, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 28, +"tbk": 1, +"tl": 6, +"mb": 28, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 214345, +"mb": 16, +"mbk": 1, +"gb": 16, +"gbk": 1, +"eb": 16, +"ebk": 1, +"fs": [] +}, +{ +"tb": 44, +"tbk": 1, +"tl": 234509, +"mb": 44, +"mbk": 1, +"gb": 44, +"gbk": 1, +"eb": 44, +"ebk": 1, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 35931, +"mb": 16, +"mbk": 1, +"gb": 16, +"gbk": 1, +"eb": 16, +"ebk": 1, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 2, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 68, +"tbk": 1, +"tl": 16952, +"mb": 68, +"mbk": 1, +"gb": 68, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 6, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 2032, +"tbk": 7, +"tl": 3857, +"mb": 1024, +"mbk": 1, +"gb": 1024, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 32, +"tbk": 2, +"tl": 6392, +"mb": 32, +"mbk": 2, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 0, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 27, +"tbk": 1, +"tl": 9, +"mb": 27, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 0, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 36, +"tbk": 1, +"tl": 7, +"mb": 36, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 8, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 14, +"tbk": 2, +"tl": 36012, +"mb": 14, +"mbk": 2, +"gb": 14, +"gbk": 2, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 52, +"tbk": 1, +"tl": 427, +"mb": 52, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 388753, +"mb": 24, +"mbk": 1, +"gb": 24, +"gbk": 1, +"eb": 24, +"ebk": 1, +"fs": [] +}, +{ +"tb": 17, +"tbk": 1, +"tl": 10, +"mb": 17, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 62, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 3, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 8, +"tbk": 1, +"tl": 53, +"mb": 8, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 17, +"tbk": 1, +"tl": 14, +"mb": 17, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 4, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 112, +"tbk": 7, +"tl": 57138, +"mb": 112, +"mbk": 7, +"gb": 112, +"gbk": 7, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 27, +"tbk": 1, +"tl": 10, +"mb": 27, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 4, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 5, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 28, +"tbk": 1, +"tl": 10, +"mb": 28, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 13, +"tbk": 1, +"tl": 3, +"mb": 13, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 17, +"tbk": 1, +"tl": 1, +"mb": 17, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 5, +"mb": 24, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 4, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 23, +"tbk": 1, +"tl": 12, +"mb": 23, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 7, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 5, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 12, +"tbk": 1, +"tl": 37539, +"mb": 12, +"mbk": 1, +"gb": 12, +"gbk": 1, +"eb": 12, +"ebk": 1, +"fs": [] +}, +{ +"tb": 20, +"tbk": 2, +"tl": 15, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 29863, +"mb": 16, +"mbk": 1, +"gb": 16, +"gbk": 1, +"eb": 16, +"ebk": 1, +"fs": [] +}, +{ +"tb": 15, +"tbk": 1, +"tl": 3, +"mb": 15, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 14, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 7, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 168, +"tbk": 3, +"tl": 117, +"mb": 96, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 412, +"tbk": 3, +"tl": 276, +"mb": 344, +"mbk": 2, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 27, +"tbk": 1, +"tl": 8, +"mb": 27, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 1504, +"tbk": 1, +"tl": 30033, +"mb": 1504, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 28, +"tbk": 1, +"tl": 7, +"mb": 28, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 4, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 6, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 9, +"tbk": 1, +"tl": 4, +"mb": 9, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 5, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 42640, +"tbk": 1, +"tl": 213048, +"mb": 42640, +"mbk": 1, +"gb": 42640, +"gbk": 1, +"eb": 42640, +"ebk": 1, +"fs": [] +}, +{ +"tb": 22, +"tbk": 1, +"tl": 1, +"mb": 22, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 15, +"tbk": 1, +"tl": 4, +"mb": 15, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 23, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 26, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 1310, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 30, +"tbk": 1, +"tl": 5, +"mb": 30, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 23, +"tbk": 1, +"tl": 4, +"mb": 23, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 31, +"tbk": 1, +"tl": 11, +"mb": 31, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 40, +"tbk": 1, +"tl": 47, +"mb": 40, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 32, +"tbk": 2, +"tl": 1490, +"mb": 32, +"mbk": 2, +"gb": 32, +"gbk": 2, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 17, +"tbk": 1, +"tl": 3, +"mb": 17, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 28, +"tbk": 1, +"tl": 5, +"mb": 28, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 13, +"tbk": 1, +"tl": 6, +"mb": 13, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 7, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 224, +"tbk": 1, +"tl": 18613, +"mb": 224, +"mbk": 1, +"gb": 224, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 402557, +"mb": 16, +"mbk": 1, +"gb": 16, +"gbk": 1, +"eb": 16, +"ebk": 1, +"fs": [] +}, +{ +"tb": 15, +"tbk": 1, +"tl": 7, +"mb": 15, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 8, +"tbk": 1, +"tl": 30856, +"mb": 8, +"mbk": 1, +"gb": 8, +"gbk": 1, +"eb": 8, +"ebk": 1, +"fs": [] +}, +{ +"tb": 1536, +"tbk": 3, +"tl": 21512, +"mb": 896, +"mbk": 1, +"gb": 896, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 28, +"tbk": 3, +"tl": 697, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 29, +"tbk": 1, +"tl": 0, +"mb": 29, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 60, +"tbk": 4, +"tl": 65, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 32, +"tbk": 1, +"tl": 20793, +"mb": 32, +"mbk": 1, +"gb": 32, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 496, +"tbk": 5, +"tl": 711, +"mb": 256, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 7, +"tbk": 1, +"tl": 0, +"mb": 7, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 29, +"tbk": 1, +"tl": 8, +"mb": 29, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 25, +"tbk": 1, +"tl": 5, +"mb": 25, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 3, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 17, +"tbk": 1, +"tl": 6, +"mb": 17, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 8, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 1, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 13, +"tbk": 1, +"tl": 6, +"mb": 13, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 3, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 12, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 28, +"tbk": 1, +"tl": 10, +"mb": 28, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 344, +"tbk": 2, +"tl": 944, +"mb": 344, +"mbk": 2, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 46, +"tbk": 1, +"tl": 7, +"mb": 46, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 104, +"tbk": 2, +"tl": 768, +"mb": 52, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 416, +"tbk": 1, +"tl": 20298, +"mb": 416, +"mbk": 1, +"gb": 416, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 32, +"tbk": 1, +"tl": 246, +"mb": 32, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 32, +"ebk": 1, +"fs": [] +}, +{ +"tb": 14, +"tbk": 1, +"tl": 1, +"mb": 14, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 8, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 28, +"tbk": 1, +"tl": 7, +"mb": 28, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 5, +"tbk": 1, +"tl": 38631, +"mb": 5, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 0, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 3, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 97560, +"mb": 24, +"mbk": 1, +"gb": 24, +"gbk": 1, +"eb": 24, +"ebk": 1, +"fs": [] +}, +{ +"tb": 11, +"tbk": 1, +"tl": 1, +"mb": 11, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 23, +"tbk": 1, +"tl": 5, +"mb": 23, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 88, +"tbk": 1, +"tl": 5878, +"mb": 88, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 224, +"tbk": 1, +"tl": 99021, +"mb": 224, +"mbk": 1, +"gb": 224, +"gbk": 1, +"eb": 224, +"ebk": 1, +"fs": [] +}, +{ +"tb": 10, +"tbk": 1, +"tl": 1, +"mb": 10, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 60, +"tbk": 2, +"tl": 31015, +"mb": 48, +"mbk": 1, +"gb": 48, +"gbk": 1, +"eb": 48, +"ebk": 1, +"fs": [] +}, +{ +"tb": 25, +"tbk": 1, +"tl": 9, +"mb": 25, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 18, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 4, +"tbk": 1, +"tl": 0, +"mb": 4, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 4, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 28, +"tbk": 1, +"tl": 9, +"mb": 28, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 31, +"tbk": 1, +"tl": 6, +"mb": 31, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 12, +"tbk": 1, +"tl": 5, +"mb": 12, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 4, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 224, +"tbk": 3, +"tl": 6164, +"mb": 128, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 12, +"tbk": 1, +"tl": 6, +"mb": 12, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 8, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 96, +"tbk": 2, +"tl": 1721, +"mb": 64, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 520, +"tbk": 1, +"tl": 100676, +"mb": 520, +"mbk": 1, +"gb": 520, +"gbk": 1, +"eb": 520, +"ebk": 1, +"fs": [] +}, +{ +"tb": 128, +"tbk": 1, +"tl": 2264, +"mb": 128, +"mbk": 1, +"gb": 128, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 30560, +"mb": 16, +"mbk": 1, +"gb": 16, +"gbk": 1, +"eb": 16, +"ebk": 1, +"fs": [] +}, +{ +"tb": 17, +"tbk": 1, +"tl": 12, +"mb": 17, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 6, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 160, +"tbk": 1, +"tl": 90, +"mb": 160, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 36, +"tbk": 1, +"tl": 7, +"mb": 36, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 64, +"tbk": 1, +"tl": 14162, +"mb": 64, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 864, +"tbk": 1, +"tl": 30258, +"mb": 864, +"mbk": 1, +"gb": 864, +"gbk": 1, +"eb": 864, +"ebk": 1, +"fs": [] +}, +{ +"tb": 8, +"tbk": 1, +"tl": 111, +"mb": 8, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 1763, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 30, +"tbk": 1, +"tl": 8, +"mb": 30, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 22, +"tbk": 1, +"tl": 25, +"mb": 22, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 28, +"tbk": 1, +"tl": 7, +"mb": 28, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 28595, +"mb": 16, +"mbk": 1, +"gb": 16, +"gbk": 1, +"eb": 16, +"ebk": 1, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 0, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 17, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 17, +"tbk": 1, +"tl": 8, +"mb": 17, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 29, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 14, +"tbk": 1, +"tl": 2, +"mb": 14, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 23, +"tbk": 1, +"tl": 4, +"mb": 23, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 5, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 52, +"tbk": 1, +"tl": 9548, +"mb": 52, +"mbk": 1, +"gb": 52, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 6, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 10, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 5, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 36, +"tbk": 3, +"tl": 71825, +"mb": 36, +"mbk": 3, +"gb": 36, +"gbk": 3, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 5, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 724, +"tbk": 1, +"tl": 35618, +"mb": 724, +"mbk": 1, +"gb": 724, +"gbk": 1, +"eb": 724, +"ebk": 1, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 31, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 13, +"tbk": 1, +"tl": 4, +"mb": 13, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 4, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 8, +"mb": 24, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 22, +"tbk": 1, +"tl": 5, +"mb": 22, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 64, +"tbk": 1, +"tl": 52, +"mb": 64, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 9, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 21, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 23, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 28, +"tbk": 1, +"tl": 5, +"mb": 28, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 8, +"tbk": 1, +"tl": 28455, +"mb": 8, +"mbk": 1, +"gb": 8, +"gbk": 1, +"eb": 8, +"ebk": 1, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 5, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 14, +"tbk": 2, +"tl": 42335, +"mb": 14, +"mbk": 2, +"gb": 14, +"gbk": 2, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 14, +"tbk": 1, +"tl": 3, +"mb": 14, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 23, +"tbk": 1, +"tl": 9, +"mb": 23, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 8, +"tbk": 1, +"tl": 30011, +"mb": 8, +"mbk": 1, +"gb": 8, +"gbk": 1, +"eb": 8, +"ebk": 1, +"fs": [] +}, +{ +"tb": 48, +"tbk": 1, +"tl": 3929, +"mb": 48, +"mbk": 1, +"gb": 48, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 22, +"tbk": 1, +"tl": 7, +"mb": 22, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 29, +"tbk": 1, +"tl": 4, +"mb": 29, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 32, +"tbk": 1, +"tl": 29814, +"mb": 32, +"mbk": 1, +"gb": 32, +"gbk": 1, +"eb": 32, +"ebk": 1, +"fs": [] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 7, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16000, +"tbk": 1, +"tl": 31309, +"mb": 16000, +"mbk": 1, +"gb": 16000, +"gbk": 1, +"eb": 16000, +"ebk": 1, +"fs": [] +}, +{ +"tb": 15, +"tbk": 1, +"tl": 9, +"mb": 15, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 352, +"tbk": 1, +"tl": 1787, +"mb": 352, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 5, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 1864, +"tbk": 1, +"tl": 78022, +"mb": 1864, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 5, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 1, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 22, +"tbk": 1, +"tl": 11, +"mb": 22, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 17, +"tbk": 1, +"tl": 4, +"mb": 17, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 36, +"tbk": 1, +"tl": 59, +"mb": 36, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 19, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 23, +"tbk": 1, +"tl": 5, +"mb": 23, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 2184, +"tbk": 2, +"tl": 39166, +"mb": 2184, +"mbk": 2, +"gb": 2184, +"gbk": 2, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 28, +"tbk": 1, +"tl": 7, +"mb": 28, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 18, +"tbk": 1, +"tl": 5, +"mb": 18, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 4, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 25, +"tbk": 1, +"tl": 6, +"mb": 25, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 8, +"mb": 24, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 1888, +"tbk": 1, +"tl": 134477, +"mb": 1888, +"mbk": 1, +"gb": 1888, +"gbk": 1, +"eb": 1888, +"ebk": 1, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 4, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 4, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 25, +"tbk": 1, +"tl": 7, +"mb": 25, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 9, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 0, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 22, +"tbk": 1, +"tl": 11, +"mb": 22, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 6, +"mb": 24, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 21, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 1736, +"tbk": 1, +"tl": 101339, +"mb": 1736, +"mbk": 1, +"gb": 1736, +"gbk": 1, +"eb": 1736, +"ebk": 1, +"fs": [] +}, +{ +"tb": 22, +"tbk": 1, +"tl": 4, +"mb": 22, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 1280, +"tbk": 1, +"tl": 34272, +"mb": 1280, +"mbk": 1, +"gb": 1280, +"gbk": 1, +"eb": 1280, +"ebk": 1, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 4, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 100, +"tbk": 1, +"tl": 270, +"mb": 100, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 26, +"tbk": 1, +"tl": 8, +"mb": 26, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 33, +"tbk": 1, +"tl": 6, +"mb": 33, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 28, +"tbk": 1, +"tl": 6, +"mb": 28, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 2, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 10, +"mb": 24, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 60, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 12, +"tbk": 1, +"tl": 3, +"mb": 12, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 12, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 23, +"tbk": 1, +"tl": 8, +"mb": 23, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 14, +"tbk": 1, +"tl": 5, +"mb": 14, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 24, +"tbk": 1, +"tl": 402101, +"mb": 24, +"mbk": 1, +"gb": 24, +"gbk": 1, +"eb": 24, +"ebk": 1, +"fs": [] +}, +{ +"tb": 19, +"tbk": 1, +"tl": 5, +"mb": 19, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 224, +"tbk": 1, +"tl": 29956, +"mb": 224, +"mbk": 1, +"gb": 224, +"gbk": 1, +"eb": 224, +"ebk": 1, +"fs": [] +}, +{ +"tb": 180, +"tbk": 1, +"tl": 1628, +"mb": 180, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 17, +"tbk": 1, +"tl": 6, +"mb": 17, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 30, +"tbk": 1, +"tl": 12, +"mb": 30, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 16, +"tbk": 1, +"tl": 4, +"mb": 16, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 6, +"tbk": 2, +"tl": 39270, +"mb": 6, +"mbk": 2, +"gb": 6, +"gbk": 2, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 17, +"tbk": 1, +"tl": 5, +"mb": 17, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 22, +"tbk": 1, +"tl": 4, +"mb": 22, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 20, +"tbk": 1, +"tl": 1291, +"mb": 20, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 64, +"tbk": 1, +"tl": 436, +"mb": 64, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 14, +"tbk": 1, +"tl": 7, +"mb": 14, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 32, +"tbk": 1, +"tl": 34124, +"mb": 32, +"mbk": 1, +"gb": 32, +"gbk": 1, +"eb": 32, +"ebk": 1, +"fs": [] +}, +{ +"tb": 32, +"tbk": 1, +"tl": 30499, +"mb": 32, +"mbk": 1, +"gb": 32, +"gbk": 1, +"eb": 32, +"ebk": 1, +"fs": [] +}, +{ +"tb": 160, +"tbk": 1, +"tl": 98, +"mb": 160, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 1120, +"tbk": 3, +"tl": 21624, +"mb": 640, +"mbk": 1, +"gb": 640, +"gbk": 1, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 21, +"tbk": 1, +"tl": 3759, +"mb": 21, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +}, +{ +"tb": 12, +"tbk": 1, +"tl": 1, +"mb": 12, +"mbk": 1, +"gb": 0, +"gbk": 0, +"eb": 0, +"ebk": 0, +"fs": [] +} +], +"ftbl": [ +"[root]", +"0x7ffe9a1ae858: CallWindowProcW (???:0:0)", +"0x7ffe9a1ae3dc: DispatchMessageW (???:0:0)", +"0x7ffe9a1c2cc7: InitDManipHook (???:0:0)", +"0x7ffe9bd10e64: KiUserCallbackDispatcher (???:0:0)", +"0x7ffe99581ec4: NtUserCreateWindowEx (???:0:0)", +"0x7ffe9a1a7d8b: CreateWindowExW (???:0:0)", +"0x7ffe9a1a7958: CreateWindowExW (???:0:0)", +"0x7ffe9a1a77a2: CreateWindowExW (???:0:0)", +"0x7ffe9a1ade1b: SendMessageW (???:0:0)", +"0x7ffe9a1acbc3: GetWindowTextW (???:0:0)" +] +}
\ No newline at end of file diff --git a/render/examples/black.rs b/render/examples/black.rs index 655cbde..c1cc538 100644 --- a/render/examples/black.rs +++ b/render/examples/black.rs @@ -1,31 +1,28 @@ -#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] +//#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] -use std::sync::Arc; +//#[global_allocator] +//static ALLOC: dhat::Alloc = dhat::Alloc; use alligator_render::{RenderWindowConfig, Renderer}; -use alligator_resources::texture::{TextureManager, TextureManagerConfig}; fn update(_renderer: &mut Renderer) {} fn main() { + //let _profiler = dhat::Profiler::new_heap(); let start = std::time::Instant::now(); // configure the render window let render_config = RenderWindowConfig { - //vsync: false, + vsync: false, //mode: alligator_render::config::WindowMode::BorderlessFullscreen, title: "Black Screen.exe", ..Default::default() }; - let texture_config = TextureManagerConfig { - initial_capacity: 0, - max_size: 0, - }; - - let texture_manager = Arc::new(TextureManager::new(&texture_config)); - let renderer = Renderer::new(&render_config, texture_manager).unwrap(); + let renderer = Renderer::new(&render_config).unwrap(); println!("Startup time: {:?}", start.elapsed()); + //drop(_profiler); + renderer.run(update); } diff --git a/render/examples/bmp.rs b/render/examples/bmp.rs index 9d864d0..373a68c 100644 --- a/render/examples/bmp.rs +++ b/render/examples/bmp.rs @@ -3,7 +3,6 @@ use std::{num::NonZeroU32, sync::Arc}; use alligator_render::{Instance, RenderWindowConfig, Renderer}; -use alligator_resources::texture::{ImageFormat, TextureManager, TextureManagerConfig}; #[profiling::function] fn update(renderer: &mut Renderer) { @@ -29,7 +28,7 @@ fn main() { }; let texture_manager = Arc::new(TextureManager::new(&texture_config)); - let mut renderer = Renderer::new(&render_config, texture_manager.clone()).unwrap(); + let mut renderer = Renderer::new(&render_config).unwrap(); // render the alligator let gator = include_bytes!("res/gator.ff"); diff --git a/render/examples/res/bunny.png b/render/examples/res/bunny.png Binary files differnew file mode 100644 index 0000000..87ba72d --- /dev/null +++ b/render/examples/res/bunny.png diff --git a/render/shaders/sprite.wgsl b/render/shaders/sprite.wgsl index 276a8ef..1e7f1a2 100644 --- a/render/shaders/sprite.wgsl +++ b/render/shaders/sprite.wgsl @@ -11,42 +11,30 @@ struct InstanceInput { @location(2) size: vec2<f32>, @location(3) texture_coordinates: vec2<f32>, @location(4) texture_size: vec2<f32>, - @location(5) texture_atlas_index: u32, - @location(6) rotation: f32, - @location(7) z_index: f32, } struct VertexOutput { @builtin(position) clip_position: vec4<f32>, @location(0) texture_coordinates: vec2<f32>, - @location(1) texture_atlas_index: u32 } @vertex fn vs_main(model: VertexInput, instance: InstanceInput) -> VertexOutput { var out: VertexOutput; - // rotate the sprite - let rotation = -instance.rotation; - let a = vec2<f32>(cos(rotation), sin(rotation)); - let b = vec2<f32>(-a[1], a[0]); - let rotation_mat = mat2x2<f32>(a, b); - let rotated = rotation_mat * model.position; - // scale the sprite - let scaled = rotated * instance.size; + let scaled = model.position * instance.size; // move the sprite let position2d = scaled + instance.position; // camera stuff - let position4d = vec4<f32>(position2d, instance.z_index, 1.0); + let position4d = vec4<f32>(position2d, 0.0, 1.0); let position = camera * position4d; let tex_coords = vec2<f32>(model.position[0] + 0.5, 1.0 - (model.position[1] + 0.5)); out.clip_position = position; - out.texture_atlas_index = instance.texture_atlas_index; out.texture_coordinates = tex_coords * instance.texture_size + instance.texture_coordinates; return out; } diff --git a/render/src/instance.rs b/render/src/instance.rs index e346cae..15317c7 100644 --- a/render/src/instance.rs +++ b/render/src/instance.rs @@ -18,12 +18,6 @@ pub struct Instance { pub texture_coordinates: [f32; 2], /// The size of the sprite's texture pub texture_size: [f32; 2], - /// The index of the texture atlas to use - pub texture_atlas_index: u32, - /// Rotation, in radians - pub rotation: f32, - /// z-index - pub z_index: f32, } impl Default for Instance { @@ -31,11 +25,8 @@ impl Default for Instance { Self { position: [0.0; 2], size: [1.0; 2], - rotation: 0.0, - z_index: 0.0, texture_coordinates: [0.0; 2], texture_size: [1.0; 2], - texture_atlas_index: 0, } } } @@ -150,18 +141,10 @@ impl InstanceBuffer { self.expand_buffer(device); } - // the instances must be sorted by z-index before being handed to the GPU - let sorted = { - profiling::scope!("depth sorting"); - let mut sorted = self.instances.clone(); - sorted.sort_by(|a, b| a.z_index.total_cmp(&b.z_index)); - sorted - }; - queue.write_buffer( &self.instance_buffer, 0 as wgpu::BufferAddress, - bytemuck::cast_slice(&sorted), + bytemuck::cast_slice(&self.instances), ); } } diff --git a/render/src/lib.rs b/render/src/lib.rs index 0d76cc8..6f96fc2 100644 --- a/render/src/lib.rs +++ b/render/src/lib.rs @@ -1,4 +1,3 @@ -#![feature(nonzero_min_max)] #![feature(type_alias_impl_trait)] #![warn(clippy::pedantic)] #![warn(clippy::nursery)] diff --git a/render/src/renderer.rs b/render/src/renderer.rs index f5b486d..4b4f60d 100644 --- a/render/src/renderer.rs +++ b/render/src/renderer.rs @@ -4,7 +4,6 @@ use std::{convert::TryInto, sync::Arc}; use crate::{ vertex::SQUARE, Camera, Instance, InstanceBuffer, RenderWindowConfig, TextureAtlas, Vertex, }; -use alligator_resources::texture::TextureManager; use pollster::FutureExt; use thiserror::Error; use wgpu::{include_wgsl, util::DeviceExt}; @@ -90,7 +89,7 @@ fn get_adapter( let adapter = adapter.or_else(|| { instance - .enumerate_adapters(wgpu::Backends::PRIMARY) + .enumerate_adapters(wgpu::Backends::VULKAN) .find(|adapter| !surface.get_capabilities(adapter).formats.is_empty()) }); @@ -148,20 +147,14 @@ impl Renderer { /// panic on some platforms. // TODO make it possible to use without a window (ie, use a bitmap in memory as a surface) // TODO this function needs to be smaller - pub fn new( - config: &RenderWindowConfig, - textures: Arc<TextureManager>, - ) -> Result<Self, NewRendererError> { + pub fn new(config: &RenderWindowConfig) -> Result<Self, NewRendererError> { // build the window let event_loop = EventLoop::new(); let window = config.to_window().build(&event_loop)?; let event_loop = Some(event_loop); // the instance's main purpose is to create an adapter and a surface - let instance = wgpu::Instance::new(wgpu::InstanceDescriptor { - backends: wgpu::Backends::VULKAN, - dx12_shader_compiler: wgpu::Dx12Compiler::Fxc, // TODO support DXC - }); + let instance = wgpu::Instance::new(wgpu::InstanceDescriptor::default()); // the surface is the part of the screen we'll draw to let surface = @@ -220,7 +213,6 @@ impl Renderer { // TODO make this configurable let (textures, texture_layout) = TextureAtlas::new( &device, - textures, window.inner_size().width, window.inner_size().height, ); @@ -311,7 +303,7 @@ impl Renderer { } /// Get a reference to the texture atlas - pub const fn textures(&self) -> &TextureAtlas { + pub const fn texture_atlas(&self) -> &TextureAtlas { &self.textures } @@ -358,10 +350,12 @@ impl Renderer { resolve_target: None, ops: wgpu::Operations { load: wgpu::LoadOp::Clear(wgpu::Color::BLACK), - store: true, + store: wgpu::StoreOp::Discard, }, })], depth_stencil_attachment: None, + timestamp_writes: None, + occlusion_query_set: None, }); render_pass.set_pipeline(&self.render_pipeline); @@ -421,7 +415,7 @@ impl Renderer { // https://github.com/gfx-rs/wgpu/issues/1783#issuecomment-1328463201 if self.window.inner_size().width != 0 && self.window.inner_size().height != 0 { match self.render() { - Ok(_) => {} + Ok(()) => {} // reconfigure the surface if it's been lost Err(wgpu::SurfaceError::Lost) => { self.reconfigure(); diff --git a/render/src/texture.rs b/render/src/texture.rs index 76e77a8..90d23d1 100644 --- a/render/src/texture.rs +++ b/render/src/texture.rs @@ -1,30 +1,10 @@ use std::error::Error; -use std::num::NonZeroU32; -use std::sync::Arc; -use alligator_resources::texture::{LoadError, Rgba16Texture, TextureId, TextureManager}; -use image::{EncodableLayout, GenericImage, RgbaImage}; -use texture_packer::TexturePacker; -use texture_packer::{ - exporter::{ExportResult, ImageExporter}, - TexturePackerConfig, -}; +use image::{EncodableLayout, RgbaImage}; use thiserror::Error; -/// The texture did not fit in the texture atlas -#[derive(Debug, Error)] -#[error("{:?}", .0)] -pub struct PackError(PackErrorInternal); - -// TODO this can be removed when a new texture packer is made -type PackErrorInternal = impl std::fmt::Debug; - #[derive(Error, Debug)] pub enum TextureError { - #[error("{:?}", .0)] - TextureTooLarge(#[from] PackError), - #[error("{}", .0)] - BadImage(#[from] LoadError), #[error("Unexpected Error (this is a bug in alligator_render): {}", .0)] Unexpected(#[source] Box<dyn Error>), } @@ -39,46 +19,18 @@ const fn extent_3d(width: u32, height: u32) -> wgpu::Extent3d { } /// A texture atlas, usable by the renderer -// TODO make this Debug // TODO make these resizable +#[derive(Debug)] pub struct TextureAtlas { - textures: Arc<TextureManager>, - packer: TexturePacker<'static, Rgba16Texture, TextureId>, diffuse_texture: wgpu::Texture, diffuse_bind_group: wgpu::BindGroup, image: RgbaImage, - width: u32, - height: u32, - changed: bool, -} - -macro_rules! texture_info { - ($name: ident, $prop: ident, $divisor: ident) => { - pub fn $name(&mut self, id: TextureId) -> Result<f32, TextureError> { - let frame = match self.texture_frame(id) { - Some(frame) => frame, - None => { - self.load_texture(id)?; - self.texture_frame(id).unwrap() - } - }; - let property = frame.frame.$prop; - let value = property as f32 / self.$divisor as f32; - Ok(value) - } - }; } impl TextureAtlas { /// Creates a new texture atlas, with the given size - // TODO why is this u32? // TODO this is still too large - pub fn new( - device: &wgpu::Device, - textures: Arc<TextureManager>, - width: u32, - height: u32, - ) -> (Self, wgpu::BindGroupLayout) { + pub fn new(device: &wgpu::Device, width: u32, height: u32) -> (Self, wgpu::BindGroupLayout) { let atlas_size = extent_3d(width, height); let diffuse_texture = device.create_texture(&wgpu::TextureDescriptor { label: Some("Diffuse Texture"), @@ -137,26 +89,14 @@ impl TextureAtlas { ( Self { - textures, - packer: TexturePacker::new_skyline(TexturePackerConfig { - max_width: width, - max_height: height, - allow_rotation: false, - trim: false, - texture_padding: 0, - ..Default::default() - }), diffuse_texture, diffuse_bind_group, - width, - height, image: RgbaImage::from_raw( width, height, vec![0; 4 * width as usize * height as usize], ) .unwrap(), - changed: true, }, texture_bind_group_layout, ) @@ -167,68 +107,7 @@ impl TextureAtlas { &self.diffuse_bind_group } - /// Load a new subtexture from memory - pub fn load_texture(&mut self, id: TextureId) -> Result<TextureId, TextureError> { - self.changed = true; - let img = self.textures.load_texture(id)?; - self.packer.pack_own(id, img).map_err(PackError)?; - Ok(id) - } - - /// Get the frame for s particular subtexture - fn texture_frame(&self, id: TextureId) -> Option<&texture_packer::Frame<TextureId>> { - self.packer.get_frame(&id) - } - - texture_info!(texture_width, w, width); - texture_info!(texture_height, h, height); - texture_info!(texture_x, x, width); - texture_info!(texture_y, y, height); - - /// Fill the cached image - fn fill_image(&mut self) -> ExportResult<()> { - let atlas = { - profiling::scope!("export atlas"); - ImageExporter::export(&self.packer)? - }; - profiling::scope!("copy image"); - self.image - .copy_from(&atlas, 0, 0) - .expect("image cache is too small"); - Ok(()) - } - - /// Clear the texture atlas, and give it a new size - pub fn clear(&mut self, width: u32, height: u32) { - self.changed = true; - self.width = width; - self.height = height; - self.packer = TexturePacker::new_skyline(TexturePackerConfig { - max_width: self.width, - max_height: self.height, - ..Default::default() - }); - } - - /// Fill the GPU texture atlas - #[profiling::function] - pub(crate) fn fill_textures(&mut self, queue: &wgpu::Queue) { - // saves time if nothing changed since the last time we did this - // FIXME This doesn't do much good once we get procedurally generated animation - // We'll have to create our own texture packer, with mutable subtextures, - // and more efficient algorithms. This'll also make frame times more consistent - if !self.changed { - return; - } - - let atlas_size = extent_3d(self.width, self.height); - - // put the packed texture into the base image - if let Err(e) = self.fill_image() { - log::error!("{}", e); - } - - // copy that to the gpu + pub(crate) fn fill_textures(&self, queue: &wgpu::Queue) { queue.write_texture( wgpu::ImageCopyTexture { texture: &self.diffuse_texture, @@ -239,12 +118,10 @@ impl TextureAtlas { self.image.as_bytes(), wgpu::ImageDataLayout { offset: 0, - bytes_per_row: NonZeroU32::new(atlas_size.width * 4), - rows_per_image: NonZeroU32::new(atlas_size.height), + bytes_per_row: Some(self.image.width() * 4), + rows_per_image: Some(self.image.height()), }, - atlas_size, + extent_3d(self.image.width(), self.image.height()), ); - - self.changed = false; } } diff --git a/resources/Cargo.toml b/resources/Cargo.toml deleted file mode 100644 index fea7f39..0000000 --- a/resources/Cargo.toml +++ /dev/null @@ -1,18 +0,0 @@ -[package] -name = "alligator_resources" -version = "0.1.0" -edition = "2021" -publish = false - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -image = "0.24" -thiserror = "1" -exun = "0.1" -texture_packer = { git = "https://github.com/botahamec/piston_texture_packer", branch = "u16" } -profiling = "1" -bytemuck = { version = "1", features = ["extern_crate_alloc"] } -parking_lot = "0.12" -log = "0.4" -dashmap = "5" diff --git a/resources/src/lib.rs b/resources/src/lib.rs deleted file mode 100644 index 9cbbba0..0000000 --- a/resources/src/lib.rs +++ /dev/null @@ -1,13 +0,0 @@ -#![feature(new_uninit, let_chains)] -#![warn(clippy::nursery, clippy::pedantic)] -#![allow(clippy::module_name_repetitions)] - -pub mod texture; - -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] -pub enum Priority { - Unnecessary, - Possible(u8), - Eventual(u8), - Urgent, -} diff --git a/resources/src/texture.rs b/resources/src/texture.rs deleted file mode 100644 index 3a5bf3e..0000000 --- a/resources/src/texture.rs +++ /dev/null @@ -1,394 +0,0 @@ -use std::cmp::Reverse; -use std::mem; -use std::path::Path; -use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; -use std::sync::Arc; - -use dashmap::DashMap; -use image::ImageBuffer; -use parking_lot::Mutex; -use thiserror::Error; - -use crate::Priority; - -/// The next texture ID -static NEXT_TEXTURE_ID: AtomicUsize = AtomicUsize::new(0); - -/// A unique identifier for a texture -#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] -pub struct TextureId(usize); - -impl TextureId { - fn new() -> Self { - Self(NEXT_TEXTURE_ID.fetch_add(1, Ordering::Relaxed)) - } -} - -/// These are the formats supported by the renderer. -// TODO make these feature-enabled -#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] -#[non_exhaustive] -pub enum ImageFormat { - Bmp, - Ico, - Farbfeld, -} - -impl From<ImageFormat> for image::ImageFormat { - fn from(format: ImageFormat) -> Self { - match format { - ImageFormat::Bmp => Self::Bmp, - ImageFormat::Ico => Self::Ico, - ImageFormat::Farbfeld => Self::Farbfeld, - } - } -} - -#[derive(Debug, Error)] -#[error("{}", .0)] -pub struct DecodingError(#[from] image::error::DecodingError); - -#[allow(clippy::missing_const_for_fn)] -fn convert_image_decoding(e: image::ImageError) -> DecodingError { - if let image::ImageError::Decoding(de) = e { - de.into() - } else { - unreachable!("No other error should be possible") - } -} - -#[derive(Debug, Error)] -pub enum LoadError { - #[error("{}", .0)] - Decoding(#[from] DecodingError), - #[error("{}", .0)] - Io(#[from] std::io::Error), -} - -fn convert_image_load_error(e: image::ImageError) -> LoadError { - match e { - image::ImageError::Decoding(de) => LoadError::Decoding(de.into()), - image::ImageError::IoError(ioe) => ioe.into(), - _ => unreachable!("No other error should be possible"), - } -} - -pub type Rgba16Texture = image::ImageBuffer<image::Rgba<u16>, Box<[u16]>>; - -fn vec_image_to_box(vec_image: image::ImageBuffer<image::Rgba<u16>, Vec<u16>>) -> Rgba16Texture { - let width = vec_image.width(); - let height = vec_image.height(); - let buf = vec_image.into_raw().into_boxed_slice(); - ImageBuffer::from_raw(width, height, buf).expect("image buffer is too small") -} - -/// Get the size, in bytes, of the texture -#[allow(clippy::missing_const_for_fn)] -fn texture_size(image: &Rgba16Texture) -> usize { - image.len() * mem::size_of::<image::Rgba<u16>>() -} - -/// A texture from disk -struct TextureFile { - path: Box<Path>, - texture: Option<Arc<Rgba16Texture>>, -} - -impl TextureFile { - /// This doesn't load the texture - #[allow(clippy::missing_const_for_fn)] - fn new(path: impl AsRef<Path>) -> Self { - Self { - path: path.as_ref().into(), - texture: None, - } - } - - const fn is_loaded(&self) -> bool { - self.texture.is_some() - } - - fn load(&mut self) -> Result<&Rgba16Texture, LoadError> { - if self.texture.is_none() { - log::warn!("{} was not pre-loaded", self.path.to_string_lossy()); - let texture = image::open(&self.path).map_err(convert_image_load_error)?; - let texture = texture.to_rgba16(); - let texture = Arc::new(vec_image_to_box(texture)); - self.texture = Some(texture); - } - - Ok(self.texture.as_ref().expect("the texture wasn't loaded")) - } - - fn loaded_texture(&self) -> Option<&Rgba16Texture> { - self.texture.as_deref() - } - - fn is_used(&self) -> bool { - let Some(arc) = &self.texture else { return false }; - Arc::strong_count(arc) > 1 - } - - /// Unloads the texture from memory if it isn't being used - fn unload(&mut self) { - if !self.is_used() { - self.texture = None; - } - } - - /// The amount of heap memory used, in bytes. This returns 0 if the texture - /// hasn't been loaded yet. - fn allocated_size(&self) -> usize { - self.texture.as_ref().map_or(0, |t| texture_size(t)) - } -} - -enum TextureBuffer { - Memory(Arc<Rgba16Texture>), - Disk(TextureFile), -} - -struct Texture { - priority: Priority, - queued_priority: Arc<Mutex<Option<Priority>>>, - buffer: TextureBuffer, -} - -impl Texture { - fn from_buffer(texture: Rgba16Texture) -> Self { - Self { - priority: Priority::Urgent, // indicates that it can't be unloaded - queued_priority: Arc::new(Mutex::new(None)), - buffer: TextureBuffer::Memory(Arc::new(texture)), - } - } - - fn from_path(path: impl AsRef<Path>, priority: Priority) -> Self { - Self { - priority, - queued_priority: Arc::new(Mutex::new(None)), - buffer: TextureBuffer::Disk(TextureFile::new(path)), - } - } - - const fn priority(&self) -> Priority { - self.priority - } - - fn _set_priority(buffer: &TextureBuffer, src: &mut Priority, priority: Priority) -> bool { - // memory textures and textures in use should always be urgent - if let TextureBuffer::Disk(disk) = buffer && !disk.is_used() { - *src = priority; - true - } else { - false - } - } - - fn unqueue_priority(&mut self) { - let mut queued_priority = self.queued_priority.lock(); - let unqueued_priority = queued_priority.unwrap_or(Priority::Unnecessary); - - if Self::_set_priority(&self.buffer, &mut self.priority, unqueued_priority) { - *queued_priority = None; - } - } - - fn set_priority(&mut self, priority: Priority) { - Self::_set_priority(&self.buffer, &mut self.priority, priority); - } - - fn load_texture(&mut self) -> Result<&Rgba16Texture, LoadError> { - match &mut self.buffer { - TextureBuffer::Memory(ref texture) => Ok(texture), - TextureBuffer::Disk(file) => file.load(), - } - } - - /// If the texture is loaded, return it. - fn loaded_texture(&self) -> Option<&Rgba16Texture> { - match &self.buffer { - TextureBuffer::Memory(ref texture) => Some(texture), - TextureBuffer::Disk(file) => file.loaded_texture(), - } - } - - fn unload(&mut self) { - if let TextureBuffer::Disk(file) = &mut self.buffer { - file.unload(); - } - } - - /// The amount of heap memory used for the texture, if any - fn allocated_size(&self) -> usize { - match &self.buffer { - TextureBuffer::Memory(texture) => texture_size(texture), - TextureBuffer::Disk(file) => file.allocated_size(), - } - } - - const fn is_loaded(&self) -> bool { - match &self.buffer { - TextureBuffer::Memory(_) => true, - TextureBuffer::Disk(file) => file.is_loaded(), - } - } -} - -pub struct TextureManager { - textures: DashMap<TextureId, Texture>, - max_size: usize, - needs_atlas_update: AtomicBool, -} - -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] -pub struct TextureManagerConfig { - /// The initial capacity of the texture manager. This defaults to 500 textures. - pub initial_capacity: usize, - /// The maximum amount of heap usage acceptable. Defaults to 10 MiB. - pub max_size: usize, -} - -impl Default for TextureManagerConfig { - fn default() -> Self { - Self { - initial_capacity: 500, - max_size: 10 * 1024 * 1024, // 10 MiB - } - } -} - -impl TextureManager { - /// Create a new `TextureManager` with the given config options. - #[must_use] - pub fn new(config: &TextureManagerConfig) -> Self { - let textures = DashMap::with_capacity(config.initial_capacity); - - Self { - textures, - max_size: config.max_size, - needs_atlas_update: AtomicBool::new(false), - } - } - - /// Load textures into memory that will be needed soon. Unload unnecessary textures - pub fn cache_files(&self) { - let mut textures: Vec<_> = self - .textures - .iter_mut() - .map(|mut t| { - t.value_mut().unqueue_priority(); - t - }) - .collect(); - textures.sort_by_key(|t2| Reverse(t2.priority())); - - let max_size = self.max_size; - let mut total_size = 0; - - for texture in &mut textures { - drop(texture.load_texture()); - total_size += texture.allocated_size(); - if total_size > max_size && texture.priority() != Priority::Urgent { - texture.unload(); - return; - } - } - } - - /// Loads a texture from memory in the given format. - /// - /// # Errors - /// - /// This returns `Expected(DecodingError)` if the given buffer was invalid - /// for the given format. - pub fn load_from_memory( - &self, - buf: &[u8], - format: ImageFormat, - ) -> Result<TextureId, DecodingError> { - let id = TextureId::new(); - let texture = image::load_from_memory_with_format(buf, format.into()); - let texture = texture.map_err(convert_image_decoding)?; - let texture = texture.into_rgba16(); - let texture = vec_image_to_box(texture); - let texture = Texture::from_buffer(texture); - - self.textures.insert(id, texture); - self.needs_atlas_update.store(true, Ordering::Release); - - Ok(id) - } - - /// Loads a texture from disk. - /// - /// # Errors - /// - /// This returns an error if `priority` is set to [`Priority::Urgent`] but - /// there was an error in loading the file to a texture. - pub fn load_from_file( - &self, - path: impl AsRef<Path>, - priority: Priority, - ) -> Result<TextureId, LoadError> { - let id = TextureId::new(); - let mut texture = Texture::from_path(path, priority); - - if priority == Priority::Urgent { - match texture.load_texture() { - Ok(_) => { - self.textures.insert(id, texture); - self.needs_atlas_update.store(true, Ordering::Release); - } - Err(e) => { - self.textures.insert(id, texture); - return Err(e); - } - } - } else { - self.textures.insert(id, texture); - } - - Ok(id) - } - - /// Loads a texture from disk. - /// - /// # Errors - /// - /// This returns an error if `priority` is set to [`Priority::Urgent`] but - /// there was an error in loading the file to a texture. - pub fn set_priority(&self, id: TextureId, priority: Priority) -> Result<(), LoadError> { - let mut texture = self.textures.get_mut(&id).expect("invalid texture id"); - texture.set_priority(priority); - - if !texture.is_loaded() && priority == Priority::Urgent { - let mut texture = self.textures.get_mut(&id).expect("invalid texture id"); - texture.load_texture()?; - self.needs_atlas_update.store(true, Ordering::Release); - } - - Ok(()) - } - - /// This returns `true` if a texture has been set to have an urgent - /// priority since the last time this function was called. - pub fn needs_atlas_update(&self) -> bool { - self.needs_atlas_update.fetch_and(false, Ordering::AcqRel) - } - - /// Load a texture into memory, if it hasn't been already. Then return a - /// copy of the texture. - /// - /// # Errors - /// - /// This returns an error if an error occurs in loading the texture from - /// disk, such as the file not existing, or not being a valid texture. - pub fn load_texture(&self, id: TextureId) -> Result<Rgba16Texture, LoadError> { - self.textures - .get_mut(&id) - .expect("the TextureId was invalid") - .load_texture() - .cloned() - } -} diff --git a/scripts/Cargo.toml b/scripts/Cargo.toml index 45dbd47..88aa2c7 100644 --- a/scripts/Cargo.toml +++ b/scripts/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "scripts" +name = "alligator_scripts" version = "0.1.0" edition = "2021" diff --git a/scripts/src/libs/system.rs b/scripts/src/libs/system.rs index e2d0ddb..9c5a50c 100644 --- a/scripts/src/libs/system.rs +++ b/scripts/src/libs/system.rs @@ -1,5 +1,5 @@ +use std::borrow::Cow; use std::mem::align_of; -use std::{borrow::Cow, process::Command}; use chrono::Offset; use wasmtime::{Caller, Memory}; diff --git a/shell-spec.txt b/shell-spec.txt new file mode 100644 index 0000000..dda23c7 --- /dev/null +++ b/shell-spec.txt @@ -0,0 +1,13 @@ +# Alligator Shell Specification + +Default Port Number: 26009 +Using TCP Protocol + +## Runtime to Editor + +runtimelog [trace|debug|info|warn|error] FILE:LINE MSG +scriptlog [trace|debug|info|warn|error] FILE:LINE MSG + +## Editor to Runtime + +stop diff --git a/sprites/Cargo.toml b/sprites/Cargo.toml new file mode 100644 index 0000000..df780e9 --- /dev/null +++ b/sprites/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "alligator_sprites" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/sprites/src/lib.rs b/sprites/src/lib.rs new file mode 100644 index 0000000..40a5fe6 --- /dev/null +++ b/sprites/src/lib.rs @@ -0,0 +1,150 @@ +use std::collections::HashMap; +use std::sync::Arc; + +#[derive(Debug, Default, Clone)] +pub struct SpriteManager { + sprites: HashMap<Arc<str>, Sprite>, + sprite_list: Vec<(u8, Arc<str>)>, +} + +#[derive(Debug, Clone)] +pub struct Sprite { + texture: Arc<str>, + x: f32, + y: f32, + z: u8, + width: f32, + height: f32, +} + +impl SpriteManager { + pub fn new() -> Self { + Self { + sprites: HashMap::new(), + sprite_list: Vec::new(), + } + } + + pub fn with_capacity(capacity: usize) -> Self { + Self { + sprites: HashMap::with_capacity(capacity), + sprite_list: Vec::with_capacity(capacity), + } + } + + pub fn add_sprite(&mut self, name: Arc<str>, sprite: Sprite) { + let z = sprite.z; + self.sprites.insert(name.clone(), sprite); + self.sprite_list.push((z, name)); + } + + pub fn clear(&mut self) { + self.sprites.clear(); + self.sprite_list.clear(); + } + + pub fn remove_sprite(&mut self, name: Arc<str>) { + self.sprites.remove(&name); + self.sprite_list.retain(|(_, n)| name != n.clone()); + } + + pub fn get_mut_sprite(&mut self, name: &str) -> Option<&mut Sprite> { + self.sprites.get_mut(name) + } + + pub fn set_sprite_z(&mut self, name: Arc<str>, new_z: u8) -> Option<()> { + let sprite = self.sprites.get_mut(&name)?; + sprite.z = new_z; + + for (depth, n) in &mut self.sprite_list { + if n.clone() == name { + *depth = new_z; + } + } + Some(()) + } + + fn sort(&mut self) { + // in case it's unclear, this is insertion sort + // the list is usually already sorted, so this is the most efficient algorithm + for i in 0..self.sprite_list.len() { + let t = self.sprite_list[i].clone(); + let mut j = i; + while j > 0 && self.sprite_list[j - 1].0 > t.0 { + self.sprite_list[j] = self.sprite_list[j - 1].clone(); + j -= 1; + } + + self.sprite_list[j] = t; + } + } + + pub fn sorted_sprites(&mut self) -> Vec<Sprite> { + self.sort(); + let mut sprites = Vec::new(); + for (_, sprite) in &self.sprite_list { + // i don't like accessing the hashmap every time, but i can't think + // of anything better + sprites.push(self.sprites[sprite].clone()); + } + + sprites + } +} + +impl Sprite { + pub fn new(x: f32, y: f32, z: u8, width: f32, height: f32, texture: Arc<str>) -> Self { + Self { + texture, + x, + y, + z, + width, + height, + } + } + + pub fn x(&self) -> f32 { + self.x + } + + pub fn y(&self) -> f32 { + self.y + } + + pub fn z(&self) -> u8 { + self.z + } + + pub fn width(&self) -> f32 { + self.width + } + + pub fn height(&self) -> f32 { + self.height + } + + pub fn texture_name(&self) -> &Arc<str> { + &self.texture + } + + pub fn set_x(&mut self, x: f32) { + self.x = x; + } + + pub fn set_y(&mut self, y: f32) { + self.y = y; + } + + pub fn set_width(&mut self, width: f32) { + self.width = width; + } + + pub fn set_height(&mut self, height: f32) { + self.height = height; + } + + pub fn set_texture(&mut self, texture_name: Arc<str>) { + self.texture = texture_name; + } +} diff --git a/src/lib.rs b/src/lib.rs deleted file mode 100644 index cdfa927..0000000 --- a/src/lib.rs +++ /dev/null @@ -1 +0,0 @@ -pub use alligator_render as render; diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..717599d --- /dev/null +++ b/src/main.rs @@ -0,0 +1,160 @@ +use std::collections::HashMap; +use std::fs::File; +use std::io::Read; +use std::num::NonZeroU32; +use std::path::Path; + +use alligator_scripts::ScriptManager; +use alligator_sprites::SpriteManager; +use alligator_sys::{Renderer, RendererConfig, Window, WindowConfig, WindowEvent}; +use alligator_textures::TextureManager; + +use serde::Deserialize; +use sha3::{Digest, Sha3_256}; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize)] +enum ScriptType { + Wasm, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize)] +enum ConfigWindowMode { + Windowed, + BorderlessFullscreen, +} + +#[derive(Debug, Clone, Deserialize)] +struct ConfigScript { + path: Box<Path>, + script_type: ScriptType, + hash: Option<String>, +} + +#[derive(Debug, Clone, Deserialize)] +struct ConfigSprite { + texture: String, + x: f32, + y: f32, + z: f32, +} + +#[derive(Debug, Clone, Deserialize)] +struct ConfigTexture { + size: usize, + path: Box<Path>, +} + +#[derive(Debug, Clone, Deserialize)] +struct Scene { + initial_sprites: HashMap<String, ConfigSprite>, + initial_scripts: Vec<String>, +} + +#[derive(Debug, Clone, Deserialize)] +pub struct Config { + alligator_version: usize, + scenes: HashMap<String, Scene>, + textures: HashMap<String, ConfigTexture>, + scripts: HashMap<String, ConfigScript>, + default_scene: String, + sprite_manager_capacity: u32, + default_window_width: NonZeroU32, + default_window_height: NonZeroU32, + default_window_mode: ConfigWindowMode, + window_title: String, + vsync: bool, +} + +fn texture_manager(config: &Config) -> TextureManager { + let mut textures = TextureManager::new(config.default_textures_size_target); + for (key, texture) in config.textures.iter() { + textures.add_texture( + key.clone().into(), + texture.path.clone().into(), + texture.size, + ); + } + + textures +} + +fn sprite_manager(config: &Config) -> SpriteManager { + SpriteManager::with_capacity(config.sprite_manager_capacity as usize) +} + +fn script_manager(config: &Config) -> ScriptManager { + let mut scripts = ScriptManager::new(); + for (key, script) in config.scripts.iter() { + let path = script.path.clone(); + let trusted = if let Some(hash) = &script.hash { + let mut bytes = Vec::new(); + let mut msg = File::open(&path).unwrap(); + msg.read_to_end(&mut bytes).unwrap(); + let mut hasher = Sha3_256::new(); + hasher.update(bytes); + let result = hasher.finalize(); + hash.as_bytes() == &result[..] + } else { + false + }; + + scripts + .add_wasm_script(key.clone().into_boxed_str(), path, trusted) + .unwrap(); + } + + scripts +} + +fn window(config: &Config) -> Window { + let config = WindowConfig { + title: config.window_title.clone(), + default_width: config.default_window_width.get(), + default_height: config.default_window_height.get(), + default_x: 100, + default_y: 100, + borderless_fullscreen: config.default_window_mode == ConfigWindowMode::BorderlessFullscreen, + visible: false, + }; + + Window::new(config) +} + +fn renderer(config: &Config, window: &Window) -> Renderer { + let config = RendererConfig { + width: config.default_window_width.get(), + height: config.default_window_height.get(), + instance_capacity: config.sprite_manager_capacity, + fullscreen: false, + vsync: config.vsync, + }; + + Renderer::new(window, config) +} + +fn main() { + std::env::set_current_dir(std::env::current_exe().unwrap().parent().unwrap()).unwrap(); + let config = File::open("game.json").unwrap(); + let config: Config = serde_json::from_reader(config).unwrap(); + + let textures = texture_manager(&config); + let sprites = sprite_manager(&config); + let scripts = script_manager(&config); + let mut window = window(&config); + + window.wait_for_resume(); + + let mut renderer = renderer(&config, &window); + window.set_visible(true); + + window.run(move |window, event| match event { + Some(WindowEvent::RedrawRequest) => { + renderer.render_frame(); + } + Some(WindowEvent::CloseRequest) => { + std::process::exit(0); + } + Some(_) => (), + None => window.request_redraw(), + }) +} diff --git a/sys/Cargo.toml b/sys/Cargo.toml new file mode 100644 index 0000000..bb1a70d --- /dev/null +++ b/sys/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "alligator_sys" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/sys/build.rs b/sys/build.rs new file mode 100644 index 0000000..c33a20f --- /dev/null +++ b/sys/build.rs @@ -0,0 +1,8 @@ +fn main() { + let out_dir = std::env::var("OUT_DIR").unwrap(); + eprintln!("{out_dir}"); + println!("cargo:rustc-link-lib=d3d11"); + println!("cargo:rustc-link-search=native=./"); + println!("cargo:rustc-link-lib-static=alligator_backend"); + println!("cargo:rerun-if-changed=alligator_backend.lib"); +} diff --git a/sys/src/lib.rs b/sys/src/lib.rs new file mode 100644 index 0000000..f3fae9c --- /dev/null +++ b/sys/src/lib.rs @@ -0,0 +1,98 @@ +use std::ffi::{c_uchar, c_uint, c_void}; +use std::os::raw::c_char; + +mod renderer; +mod window; + +pub use renderer::Renderer; +pub use window::{Window, WindowConfig, WindowEvent}; + +type CRenderer = *mut (); +type CWindow = *mut (); + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(C)] +pub struct RendererConfig { + pub width: c_uint, + pub height: c_uint, + pub instance_capacity: c_uint, + pub fullscreen: bool, + pub vsync: bool, +} + +#[repr(C)] +pub struct Vertex { + x: f32, + y: f32, + z: f32, + curve_a: f32, + curve_b: f32, + color1_r: f32, + color1_g: f32, + color1_b: f32, + color1_a: f32, + normal_x: f32, + normal_y: f32, + normal_z: f32, +} + +#[derive(Debug, Clone, Copy)] +#[repr(C)] +struct CWindowConfig { + default_width: c_uint, + default_height: c_uint, + default_x: c_uint, + default_y: c_uint, + title: *const c_char, + visible: bool, + borderless_fullscreen: bool, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(C)] +pub enum CWindowEvent { + AboutToWait, + Other, + CloseRequest, + ScaleFactorChange, + Resume, + RedrawRequest, +} + +#[link(name = "alligator_backend", kind = "static")] +extern "C" { + fn new_renderer(config: RendererConfig, window: CWindow) -> CRenderer; + fn resize_renderer(renderer: CRenderer, width: c_uint, height: c_uint); + fn set_vsync(renderer: CRenderer, vsync: bool); + fn create_vertex_buffer(renderer: CRenderer, count: c_uint, instances: *const Vertex); + fn set_camera( + renderer: CRenderer, + x: f32, + y: f32, + zoom: f32, + rotation: f32, + width: f32, + height: f32, + ); + fn render_frame(renderer: CRenderer); + fn destroy_renderer(renderer: CRenderer); + + fn create_window(config: CWindowConfig) -> CWindow; + fn set_visible(window: CWindow, visible: bool); + fn resize_window(window: CWindow, width: c_uint, height: c_uint); + fn set_fullscreen(window: CWindow, fullscreen: bool); + fn set_title(window: CWindow, title: *const c_char); + fn wait_for_event(window: CWindow); + fn pop_event(window: CWindow) -> bool; + fn wait_for_resume(window: CWindow); + fn set_event_handler(window: CWindow, closure: *mut c_void); + fn run_event_handler(window: CWindow, event: CWindowEvent); + fn request_redraw(window: CWindow); + fn destroy_window(window: CWindow); +} + +#[no_mangle] +unsafe extern "C" fn alligator_run_closure(closure: *mut c_void, event: CWindowEvent) { + let closure: &mut &mut dyn FnMut(CWindowEvent) = unsafe { &mut *closure.cast() }; + closure(event) +} diff --git a/sys/src/renderer.rs b/sys/src/renderer.rs new file mode 100644 index 0000000..05d111b --- /dev/null +++ b/sys/src/renderer.rs @@ -0,0 +1,49 @@ +use crate::{RendererConfig, Vertex, Window}; + +pub struct Renderer { + ptr: *mut (), +} + +impl Drop for Renderer { + fn drop(&mut self) { + unsafe { crate::destroy_renderer(self.ptr) } + } +} + +impl Renderer { + pub fn new(window: &Window, config: RendererConfig) -> Self { + let ptr = unsafe { crate::new_renderer(config, window.ptr) }; + Self { ptr } + } + + pub fn resize(&mut self, width: u32, height: u32) { + unsafe { crate::resize_renderer(self.ptr, width, height) } + } + + pub fn set_vsync(&mut self, vsync: bool) { + unsafe { crate::set_vsync(self.ptr, vsync) } + } + + pub fn create_vertex_buffer(&mut self, vertices: &[Vertex]) { + assert!(vertices.len() < (u32::MAX as usize), "Too many triangles!"); + let ptr = vertices.as_ptr(); + let len = vertices.len(); + unsafe { crate::create_vertex_buffer(self.ptr, len as u32, ptr) } + } + + pub fn set_camera( + &mut self, + x: f32, + y: f32, + zoom: f32, + rotation: f32, + width: f32, + height: f32, + ) { + unsafe { crate::set_camera(self.ptr, x, y, zoom, rotation, width, height) } + } + + pub fn render_frame(&mut self) { + unsafe { crate::render_frame(self.ptr) } + } +} diff --git a/sys/src/window.rs b/sys/src/window.rs new file mode 100644 index 0000000..19de5e7 --- /dev/null +++ b/sys/src/window.rs @@ -0,0 +1,116 @@ +use std::ffi::{c_void, CString}; +use std::ops::ControlFlow; + +use crate::{CWindowConfig, CWindowEvent}; + +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct WindowConfig { + pub title: String, + pub default_width: u32, + pub default_height: u32, + pub default_x: u32, + pub default_y: u32, + pub visible: bool, + pub borderless_fullscreen: bool, +} + +pub struct Window { + pub(crate) ptr: *mut (), +} + +pub enum WindowEvent { + Other = 1, + CloseRequest, + ScaleFactorChange, + Resume, + RedrawRequest, +} + +impl Drop for Window { + fn drop(&mut self) { + unsafe { crate::destroy_window(self.ptr) } + } +} + +impl Window { + pub fn new(config: WindowConfig) -> Self { + let title = CString::new(config.title.as_bytes()).unwrap(); + let config = CWindowConfig { + default_width: config.default_width, + default_height: config.default_height, + default_x: config.default_x, + default_y: config.default_y, + visible: config.visible, + borderless_fullscreen: config.borderless_fullscreen, + title: title.as_ptr(), + }; + + let window = unsafe { crate::create_window(config) }; + + Self { ptr: window } + } + + pub fn set_visible(&mut self, visible: bool) { + unsafe { crate::set_visible(self.ptr, visible) } + } + + pub fn set_title(&mut self, title: &str) { + let string = CString::new(title.to_string().as_bytes()).unwrap(); + let bytes = string.as_ptr(); + unsafe { crate::set_title(self.ptr, bytes) } + } + + pub fn resize(&mut self, width: u32, height: u32) { + unsafe { crate::resize_window(self.ptr, width, height) } + } + + pub fn set_fullscreen(&mut self, fullscreen: bool) { + unsafe { crate::set_fullscreen(self.ptr, fullscreen) } + } + + fn translate_event(event: CWindowEvent) -> Option<WindowEvent> { + let event = match event { + CWindowEvent::AboutToWait => return None, + CWindowEvent::Other => WindowEvent::Other, + CWindowEvent::CloseRequest => WindowEvent::CloseRequest, + CWindowEvent::ScaleFactorChange => WindowEvent::ScaleFactorChange, + CWindowEvent::Resume => WindowEvent::Resume, + CWindowEvent::RedrawRequest => WindowEvent::RedrawRequest, + }; + Some(event) + } + + pub fn wait_for_event(&self) { + unsafe { crate::wait_for_event(self.ptr) } + } + + pub fn pop_event(&self) -> bool { + unsafe { crate::pop_event(self.ptr) } + } + + pub fn wait_for_resume(&mut self) { + unsafe { crate::wait_for_resume(self.ptr) } + } + + pub fn run(&mut self, mut handler: impl FnMut(&mut Window, Option<WindowEvent>)) -> ! { + let window_ptr = self.ptr; + + unsafe { + let closure = |c_event: CWindowEvent| { + handler(self, Self::translate_event(c_event)); + }; + let closure_data: Box<Box<dyn FnMut(CWindowEvent)>> = Box::new(Box::new(closure)); + crate::set_event_handler(window_ptr, Box::into_raw(closure_data) as *mut _); + } + + loop { + if !self.pop_event() { + unsafe { crate::run_event_handler(window_ptr, CWindowEvent::AboutToWait) }; + } + } + } + + pub fn request_redraw(&mut self) { + unsafe { crate::request_redraw(self.ptr) } + } +} diff --git a/textures/Cargo.toml b/textures/Cargo.toml new file mode 100644 index 0000000..e550a92 --- /dev/null +++ b/textures/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "alligator_textures" +version = "0.1.0" +edition = "2021" +publish = false + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +packer = { path = "../packer" } + +image = "0.24" +exun = "0.2" diff --git a/textures/src/lib.rs b/textures/src/lib.rs new file mode 100644 index 0000000..c1b56a8 --- /dev/null +++ b/textures/src/lib.rs @@ -0,0 +1,96 @@ +use std::collections::HashMap; +use std::path::Path; +use std::sync::Arc; + +use exun::{RawUnexpected, ResultErrorExt}; +use image::RgbaImage; +use packer::{RectanglePacker, TextureAtlas}; + +type ExunResult<T> = Result<T, RawUnexpected>; + +pub struct TextureManager { + textures: HashMap<Arc<str>, TextureMetadata>, + loaded_textures: HashMap<Arc<str>, Arc<RgbaImage>>, + packer: RectanglePacker, + target_size: usize, + current_size: usize, +} + +struct TextureMetadata { + path: Arc<Path>, + size: usize, +} + +impl TextureManager { + pub fn new(target_size: usize) -> Self { + Self { + textures: HashMap::new(), + loaded_textures: HashMap::new(), + packer: RectanglePacker::new(), + target_size, + current_size: 0, + } + } + + pub fn add_texture(&mut self, name: Arc<str>, path: Arc<Path>, size: usize) { + self.textures.insert(name, TextureMetadata { path, size }); + } + + pub fn try_preload(&mut self, name: Arc<str>) -> ExunResult<Option<bool>> { + let Some(metadata) = self.textures.get(&name) else { + return Ok(None); + }; + + if self.current_size + metadata.size < self.target_size { + self.load(name)?; + Ok(Some(true)) + } else { + Ok(Some(false)) + } + } + + pub fn load(&mut self, name: Arc<str>) -> ExunResult<Option<()>> { + let Some(metadata) = self.textures.get(&name) else { + return Ok(None); + }; + + self.current_size += metadata.size; + let texture = image::open(&metadata.path).unexpect()?.to_rgba8(); + self.loaded_textures.insert(name, Arc::new(texture)); + + Ok(Some(())) + } + + pub fn unload(&mut self, name: Arc<str>) -> Option<()> { + self.loaded_textures.remove(&name)?; + Some(()) + } + + pub fn pack_texture(&mut self, name: Arc<str>) -> ExunResult<()> { + if !self.loaded_textures.contains_key(&name) { + self.load(name.clone())?; + } + + self.packer.add_texture( + name.clone(), + self.loaded_textures + .get(&name) + .expect("we checked to make sure it was loaded") + .clone(), + ); + + Ok(()) + } + + pub fn reset_packer(&mut self) { + self.packer = RectanglePacker::new(); + } + + pub fn reload_texture_atlas( + &mut self, + min_width: u32, + min_height: u32, + ) -> ExunResult<TextureAtlas> { + self.packer.output(min_width, min_height) + } +} diff --git a/todos.txt b/todos.txt new file mode 100644 index 0000000..8880a50 --- /dev/null +++ b/todos.txt @@ -0,0 +1,2 @@ +Use DirectX12 directly +GPU accelerated vector graphics diff --git a/tvg/src/colors.rs b/tvg/src/colors.rs index 494e6aa..0dd8831 100644 --- a/tvg/src/colors.rs +++ b/tvg/src/colors.rs @@ -5,13 +5,16 @@ use num_enum::TryFromPrimitive; use crate::TvgError; +const GAMMA: f32 = 2.2; +const INVERT_GAMMA: f32 = 1.0 / GAMMA; + /// The color table encodes the palette for this file. /// /// It’s binary content is defined by the `color_encoding` field in the header. /// For the three defined color encodings, each will yield a list of /// `color_count` RGBA tuples. #[derive(Debug, Clone, PartialEq, Eq, Hash)] -pub(crate) struct ColorTable<C: Color> { +pub struct ColorTable<C: Color> { colors: Box<[C]>, } @@ -59,12 +62,17 @@ impl<C: Color> ColorTable<C> { } /// Returns the number of colors in the table. - fn len(&self) -> usize { + pub fn len(&self) -> usize { self.colors.len() } + /// Returns `true` if the color table has no colors in it + pub fn is_empty(&self) -> bool { + self.colors.is_empty() + } + /// Returns a reference to a color, or `None` if out-of-bounds. - fn get(&self, index: usize) -> Option<&C> { + pub fn get(&self, index: usize) -> Option<&C> { self.colors.get(index) } @@ -128,10 +136,68 @@ pub trait Color: Sized { /// Convert from the RGBA16 format to this format. This may be lossy. fn from_rgba16_lossy(red: u16, green: u16, blue: u16, alpha: u16) -> Self; + /// Convert from the RGBAF32 format to this format. This may be lossy. + fn from_rgbaf32_lossy(red: f32, green: f32, blue: f32, alpha: f32) -> Self; + fn red_u16(&self) -> u16; fn blue_u16(&self) -> u16; fn green_u16(&self) -> u16; fn alpha_u16(&self) -> u16; + + fn red_f32(&self) -> f32; + fn green_f32(&self) -> f32; + fn blue_f32(&self) -> f32; + fn alpha_f32(&self) -> f32; +} + +fn to_color_space(val: f32) -> f32 { + val.powf(INVERT_GAMMA) +} + +fn to_linear(val: f32) -> f32 { + val.powf(GAMMA) +} + +pub(crate) fn blend<C: Color + Clone>(dest: &mut C, src: &C) { + fn lerp_color(src: f32, dst: f32, src_alpha: f32, dst_alpha: f32, alpha: f32) -> f32 { + let src = to_linear(src); + let dst = to_linear(dst); + + let val = (1.0 / alpha) * (src_alpha * src + (1.0 - src_alpha) * dst_alpha * dst); + + to_color_space(val) + } + + if src.alpha_f32() == 1.0 || dest.alpha_u16() == 0 { + *dest = src.clone(); + return; + } else if src.alpha_u16() == 0 { + return; + } + + let src_a = src.alpha_f32(); + let dst_a = dest.alpha_f32(); + let alpha = src_a + (1.0 - src_a) * dst_a; + let red = lerp_color(src.red_f32(), dest.red_f32(), src_a, dst_a, alpha); + let green = lerp_color(src.green_f32(), dest.green_f32(), src_a, dst_a, alpha); + let blue = lerp_color(src.blue_f32(), dest.blue_f32(), src_a, dst_a, alpha); + + *dest = C::from_rgbaf32_lossy(red, green, blue, alpha); +} + +pub(crate) fn lerp<C: Color>(first: &C, second: &C, f: f64) -> C { + fn lerp_color(a: f32, b: f32, f: f64) -> f32 { + a + (b - a) * f as f32 + } + + let f = f.clamp(0.0, 1.0); + + let red = to_color_space(lerp_color(first.red_f32(), second.red_f32(), f)); + let green = to_color_space(lerp_color(first.green_f32(), second.green_f32(), f)); + let blue = to_color_space(lerp_color(first.blue_f32(), second.blue_f32(), f)); + let alpha = lerp_color(first.alpha_f32(), second.alpha_f32(), f); + + C::from_rgbaf32_lossy(red, green, blue, alpha) } /// Each color value is encoded as a sequence of four bytes. @@ -172,6 +238,15 @@ impl Color for Rgba8888 { } } + fn from_rgbaf32_lossy(red: f32, green: f32, blue: f32, alpha: f32) -> Self { + Self { + red: (red * u8::MAX as f32) as u8, + green: (green * u8::MAX as f32) as u8, + blue: (blue * u8::MAX as f32) as u8, + alpha: (alpha * u8::MAX as f32) as u8, + } + } + fn red_u16(&self) -> u16 { (self.red as u16) << 8 } @@ -187,6 +262,22 @@ impl Color for Rgba8888 { fn alpha_u16(&self) -> u16 { (self.alpha as u16) << 8 } + + fn red_f32(&self) -> f32 { + self.red as f32 / u8::MAX as f32 + } + + fn green_f32(&self) -> f32 { + self.green as f32 / u8::MAX as f32 + } + + fn blue_f32(&self) -> f32 { + self.blue as f32 / u8::MAX as f32 + } + + fn alpha_f32(&self) -> f32 { + self.alpha as f32 / u8::MAX as f32 + } } /// Each color value is encoded as a sequence of 2 bytes. @@ -224,6 +315,14 @@ impl Color for Rgb565 { } } + fn from_rgbaf32_lossy(red: f32, green: f32, blue: f32, alpha: f32) -> Self { + Self { + red: (red * (0b011111) as f32) as u8, + green: (green * (0b111111) as f32) as u8, + blue: (blue * (0b011111) as f32) as u8, + } + } + fn red_u16(&self) -> u16 { (self.red as u16) << 11 } @@ -239,6 +338,22 @@ impl Color for Rgb565 { fn alpha_u16(&self) -> u16 { 0 } + + fn red_f32(&self) -> f32 { + self.red as f32 / (0b011111) as f32 + } + + fn green_f32(&self) -> f32 { + self.green as f32 / (0b111111) as f32 + } + + fn blue_f32(&self) -> f32 { + self.blue as f32 / (0b011111) as f32 + } + + fn alpha_f32(&self) -> f32 { + 0.0 + } } /// Each color value is encoded as a sequence of 16 bytes. @@ -279,6 +394,15 @@ impl Color for RgbaF32 { } } + fn from_rgbaf32_lossy(red: f32, green: f32, blue: f32, alpha: f32) -> Self { + Self { + red, + green, + blue, + alpha, + } + } + fn red_u16(&self) -> u16 { (self.red * (u16::MAX as f32)) as u16 } @@ -294,6 +418,22 @@ impl Color for RgbaF32 { fn alpha_u16(&self) -> u16 { (self.alpha * (u16::MAX as f32)) as u16 } + + fn red_f32(&self) -> f32 { + self.red + } + + fn green_f32(&self) -> f32 { + self.green + } + + fn blue_f32(&self) -> f32 { + self.blue + } + + fn alpha_f32(&self) -> f32 { + self.alpha + } } /// Each color value is encoded as a sequence of 8 bytes. @@ -334,6 +474,15 @@ impl Color for Rgba16 { } } + fn from_rgbaf32_lossy(red: f32, green: f32, blue: f32, alpha: f32) -> Self { + Self { + red: (red * u16::MAX as f32) as u16, + green: (green * u16::MAX as f32) as u16, + blue: (blue * u16::MAX as f32) as u16, + alpha: (alpha * u16::MAX as f32) as u16, + } + } + fn red_u16(&self) -> u16 { self.red } @@ -349,4 +498,20 @@ impl Color for Rgba16 { fn alpha_u16(&self) -> u16 { self.alpha } + + fn red_f32(&self) -> f32 { + self.red as f32 / u16::MAX as f32 + } + + fn green_f32(&self) -> f32 { + self.green as f32 / u16::MAX as f32 + } + + fn blue_f32(&self) -> f32 { + self.blue as f32 / u16::MAX as f32 + } + + fn alpha_f32(&self) -> f32 { + self.alpha as f32 / u16::MAX as f32 + } } diff --git a/tvg/src/commands.rs b/tvg/src/commands.rs index f316a53..c21099b 100644 --- a/tvg/src/commands.rs +++ b/tvg/src/commands.rs @@ -1,24 +1,101 @@ use std::io::{self, Read}; +use std::ops::{Add, Mul, Sub}; use byteorder::ReadBytesExt; use raise::yeet; -use crate::{header::TvgHeader, path::Path, read_unit, read_varuint, Decode, Point, TvgError}; +use crate::{ + colors::{self, Color, ColorTable}, + header::TvgHeader, + path::Path, + read_unit, read_varuint, Decode, TvgError, +}; + +/// A X and Y coordinate pair. +#[derive(Debug, Clone, Copy)] +pub struct Vector { + /// Horizontal distance of the point to the origin. + pub x: f64, + /// Vertical distance of the point to the origin. + pub y: f64, +} + +impl Vector { + pub fn magnitude(&self) -> f64 { + (self.x * self.x + self.y * self.y).sqrt() + } + + pub fn scale(&self, scale: f64) -> Vector { + Vector { + x: self.x * scale, + y: self.y * scale, + } + } +} + +impl Mul for Vector { + type Output = f64; + + fn mul(self, rhs: Self) -> Self::Output { + self.x * rhs.x + self.y * rhs.y + } +} + +/// A X and Y coordinate pair. +#[derive(Debug, Clone, Copy)] +pub struct Point { + /// Horizontal distance of the point to the origin. + pub x: f64, + /// Vertical distance of the point to the origin. + pub y: f64, +} + +impl Sub for Point { + type Output = Vector; + + fn sub(self, rhs: Self) -> Self::Output { + Vector { + x: self.x - rhs.x, + y: self.y - rhs.y, + } + } +} + +impl Add<Vector> for Point { + type Output = Self; + + fn add(self, vector: Vector) -> Self::Output { + Self { + x: self.x + vector.x, + y: self.y + vector.y, + } + } +} + +impl Decode for Point { + fn read(reader: &mut impl Read, header: &TvgHeader) -> io::Result<Self> { + Ok(Self { + x: read_unit(reader, header)?, + y: read_unit(reader, header)?, + }) + } +} #[derive(Debug, Clone, Copy, PartialEq)] pub struct Rectangle { /// Horizontal distance of the left side to the origin. - x: f64, + pub x: f64, /// Vertical distance of the upper side to the origin. - y: f64, + pub y: f64, /// Horizontal extent of the rectangle. - width: f64, + pub width: f64, /// Vertical extent of the rectangle. - height: f64, + pub height: f64, } impl Decode for Rectangle { fn read(reader: &mut impl Read, header: &TvgHeader) -> io::Result<Self> { + let x = 5; Ok(Self { x: read_unit(reader, header)?, y: read_unit(reader, header)?, @@ -203,6 +280,72 @@ impl Style { color_index_1: read_varuint(reader)?, }) } + + fn linear_get_color_at<C: Color + Clone>( + &self, + color_table: &ColorTable<C>, + point: Point, + ) -> Option<C> { + let Self::LinearGradient { + point_0, + point_1, + color_index_0, + color_index_1 } = self else { panic!() }; + + // TODO remove these unwraps + let color_0 = color_table.get(*color_index_0 as usize)?; + let color_1 = color_table.get(*color_index_1 as usize)?; + + let direction = *point_1 - *point_0; + let delta = point - *point_0; + + if direction * delta <= 0.0 { + return Some(color_0.clone()); + } else if direction * (point - *point_1) >= 0.0 { + return Some(color_1.clone()); + } + + let gradient_length = direction.magnitude(); + let proj = (direction * delta) / (direction * direction); + let gradient_position = direction.scale(proj).magnitude(); + let f = gradient_position / gradient_length; + + Some(colors::lerp(color_0, color_1, f)) + } + + fn radial_get_color_at<C: Color>( + &self, + color_table: &ColorTable<C>, + point: Point, + ) -> Option<C> { + let Self::RadialGradient { + point_0, + point_1, + color_index_0, + color_index_1 } = self else { panic!() }; + + // TODO remove these unwraps + let color_0 = color_table.get(*color_index_0 as usize)?; + let color_1 = color_table.get(*color_index_1 as usize)?; + + let distance_max = (*point_1 - *point_0).magnitude(); + let distance_is = (point - *point_0).magnitude(); + let f = distance_is / distance_max; + + Some(colors::lerp(color_0, color_1, f)) + } + + pub fn get_color_at<C: Color + Clone>( + &self, + color_table: &ColorTable<C>, + point: Point, + ) -> Option<C> { + match self { + Self::FlatColored { color_index } => color_table.get(*color_index as usize).cloned(), + Self::LinearGradient { .. } => self.linear_get_color_at(color_table, point), + Self::RadialGradient { .. } => self.radial_get_color_at(color_table, point), + } + } } /// TinyVG files contain a sequence of draw commands that must be executed in diff --git a/tvg/src/header.rs b/tvg/src/header.rs index b3be494..d444f66 100644 --- a/tvg/src/header.rs +++ b/tvg/src/header.rs @@ -135,6 +135,14 @@ impl TvgHeader { pub fn color_count(&self) -> u32 { self.color_count } + + pub fn width(&self) -> u32 { + self.width + } + + pub fn height(&self) -> u32 { + self.height + } } fn read_unsigned_unit<R: Read>( diff --git a/tvg/src/lib.rs b/tvg/src/lib.rs index 5c9e1d2..16a95bd 100644 --- a/tvg/src/lib.rs +++ b/tvg/src/lib.rs @@ -10,6 +10,7 @@ pub mod colors; mod commands; mod header; mod path; +mod render; pub use header::SUPPORTED_VERSION; @@ -146,24 +147,6 @@ fn read_unit(reader: &mut impl Read, header: &TvgHeader) -> io::Result<f64> { Ok((value as f64) / fractional) } -/// A X and Y coordinate pair. -#[derive(Debug, Clone, Copy)] -pub struct Point { - /// Horizontal distance of the point to the origin. - x: f64, - /// Vertical distance of the point to the origin. - y: f64, -} - -impl Decode for Point { - fn read(reader: &mut impl Read, header: &TvgHeader) -> io::Result<Self> { - Ok(Self { - x: read_unit(reader, header)?, - y: read_unit(reader, header)?, - }) - } -} - fn read_varuint(reader: &mut impl Read) -> io::Result<u32> { let mut count = 0; let mut result = 0; diff --git a/tvg/src/path.rs b/tvg/src/path.rs index 2bc0448..a576eb8 100644 --- a/tvg/src/path.rs +++ b/tvg/src/path.rs @@ -4,7 +4,7 @@ use byteorder::ReadBytesExt; use num_enum::TryFromPrimitive; use raise::yeet; -use crate::{header::TvgHeader, read_unit, read_varuint, Decode, Point, TvgError}; +use crate::{commands::Point, header::TvgHeader, read_unit, read_varuint, Decode, TvgError}; /// Returns an error if the padding isn't zero fn check_padding(padding: u8) -> Result<(), TvgError> { @@ -17,7 +17,7 @@ fn check_padding(padding: u8) -> Result<(), TvgError> { #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive)] #[repr(u8)] -enum Sweep { +pub(crate) enum Sweep { Right = 0, Left = 1, } @@ -47,7 +47,7 @@ enum InstructionKind { } #[derive(Debug, Clone, Copy)] -enum InstructionData { +pub(crate) enum InstructionData { /// The line instruction draws a straight line to the position. Line { /// The end point of the line. @@ -231,11 +231,11 @@ impl InstructionData { } #[derive(Debug, Clone)] -struct Instruction { +pub(crate) struct Instruction { /// The width of the line the "pen" makes, if it makes one at all. - line_width: Option<f64>, + pub(crate) line_width: Option<f64>, /// The arguments to the instruction. - data: InstructionData, + pub(crate) data: InstructionData, } impl Instruction { @@ -258,11 +258,11 @@ impl Instruction { } #[derive(Debug, Clone)] -struct Segment { +pub(crate) struct Segment { /// The starting point of the segment. - start: Point, + pub(crate) start: Point, /// The list of instructions for tha segment. - instructions: Box<[Instruction]>, + pub(crate) instructions: Box<[Instruction]>, } impl Segment { @@ -294,7 +294,7 @@ impl Segment { /// outline of the shape. #[derive(Debug, Clone)] pub struct Path { - segments: Box<[Segment]>, + pub(crate) segments: Box<[Segment]>, } impl Path { diff --git a/tvg/src/render.rs b/tvg/src/render.rs new file mode 100644 index 0000000..f8c15a1 --- /dev/null +++ b/tvg/src/render.rs @@ -0,0 +1,506 @@ +use crate::{ + colors::{self, blend, lerp, Color, ColorTable}, + commands::{Command, Point, Rectangle, Style, Vector}, + header::TvgHeader, + path::{Instruction, InstructionData, Path, Sweep}, + TvgFile, +}; + +fn distance(p0: Point, p1: Point) -> f64 { + (p0 - p1).magnitude().abs() +} + +fn rotation_matrix(angle: f64) -> [[f64; 2]; 2] { + let s = angle.sin(); + let c = angle.cos(); + [[c, -s], [s, c]] +} + +fn apply_matrix(matrix: [[f64; 2]; 2], vector: Vector) -> Vector { + Vector { + x: vector.x * matrix[0][0] + vector.y * matrix[0][1], + y: vector.x * matrix[1][0] + vector.y * matrix[1][1], + } +} + +fn apply_matrix_point(matrix: [[f64; 2]; 2], point: Point) -> Point { + Point { + x: point.x * matrix[0][0] + point.y * matrix[0][1], + y: point.x * matrix[1][0] + point.y * matrix[1][1], + } +} + +fn lerp_f64(a: f64, b: f64, x: f64) -> f64 { + a + (b - a) * x +} + +fn lerp_and_reduce(vals: &[f64], f: f64) -> Vec<f64> { + let mut result = Vec::with_capacity(vals.len() - 1); + for i in 0..(vals.len() - 1) { + result.push(lerp_f64(vals[i], vals[i + 1], f)); + } + result +} + +fn lerp_and_reduce_to_one(vals: &[f64], f: f64) -> f64 { + if vals.len() == 1 { + vals[0] + } else { + lerp_and_reduce_to_one(&lerp_and_reduce(vals, f), f) + } +} + +/// A version of [`Point`] that uses usizes for a PixMap +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +struct UPoint { + x: usize, + y: usize, +} + +impl UPoint { + fn new(x: usize, y: usize) -> UPoint { + Self { x, y } + } +} + +struct FrameBuffer<C: Color> { + width: usize, + height: usize, + pixels: Box<[C]>, + scale_x: f64, + scale_y: f64, +} + +impl<C: Color + Clone + Default> FrameBuffer<C> { + fn new(width: usize, height: usize, scale_x: f64, scale_y: f64) -> Self { + let pixel_count = width * height; + Self { + width, + height, + pixels: vec![C::default(); pixel_count].into_boxed_slice(), + scale_x, + scale_y, + } + } + + fn point_to_upoint(&self, point: Point) -> UPoint { + todo!() + } + + fn upoint_to_point(&self, upoint: UPoint) -> Point { + todo!() + } + + /// Blends the new color with the given pixel. Returns `None` if the destination is invalid + fn set_pixel(&mut self, x: usize, y: usize, color: C) -> Option<()> { + if x >= self.width || y >= self.height { + return None; + } + + let offset = y * self.width + x; + let destination_pixel = self.pixels.get_mut(offset)?; + + blend(destination_pixel, &color); + + Some(()) + } + + fn draw_line( + &mut self, + color_table: ColorTable<C>, + style: Style, + width_start: f64, + width_end: f64, + line_start: Point, + line_end: Point, + ) -> Option<()> { + let mut min_x = usize::MAX; + let mut min_y = usize::MAX; + let mut max_x = usize::MIN; + let mut max_y = usize::MIN; + + let max_width = f64::max(width_start, width_end); + + let points = [line_start, line_end]; + for pt in points { + min_x = usize::min(min_x, (self.scale_x * (pt.x - max_width)).floor() as usize); + min_y = usize::min(min_y, (self.scale_y * (pt.y - max_width)).floor() as usize); + max_x = usize::max(max_x, (self.scale_x * (pt.x - max_width)).floor() as usize); + max_y = usize::max(max_y, (self.scale_y * (pt.y - max_width)).floor() as usize); + } + + // limit to framebuffer size + min_x = usize::min(min_x, self.width); + min_y = usize::min(min_y, self.height); + max_x = usize::min(max_x, self.width); + max_y = usize::min(max_y, self.height); + + for y in min_y..=max_y { + for x in min_x..=max_x { + let point = self.upoint_to_point(UPoint { x, y }); + let dist = todo!() as f64; + + if dist >= 0.0 { + self.set_pixel(x, y, style.get_color_at(&color_table, point)?); + } + } + } + + Some(()) + } +} + +#[derive(Debug, Default)] +struct PathMaker { + points: Vec<Point>, + width: Vec<f64>, +} + +impl PathMaker { + fn new(width: f64, start: Point) -> Self { + let points = vec![start]; + let width = vec![width]; + + Self { points, width } + } + + fn render_line(&mut self, width: f64, to_point: Point) { + self.points.push(to_point); + self.width.push(width); + } + + fn render_horizontal_line(&mut self, width: f64, x: f64) { + self.points.push(Point { + x, + y: self.points.last().unwrap().y, + }); + self.width.push(width); + } + + fn render_vertical_line(&mut self, width: f64, y: f64) { + self.points.push(Point { + x: self.points.last().unwrap().x, + y, + }); + self.width.push(width); + } + + fn render_cubic_bezier( + &mut self, + control_0: Point, + control_1: Point, + point: Point, + start_width: f64, + end_width: f64, + ) { + const BEZIER_POLY_COUNT: usize = 16; + + let previous = self.points.last().unwrap(); + let oct0x = [previous.x, control_0.x, control_1.x, point.x]; + let oct0y = [previous.y, control_0.y, control_1.y, point.y]; + + for i in 1..BEZIER_POLY_COUNT { + let f = i as f64 / BEZIER_POLY_COUNT as f64; + let x = lerp_and_reduce_to_one(&oct0x, f); + let y = lerp_and_reduce_to_one(&oct0y, f); + + self.points.push(Point { x, y }); + self.width.push(lerp_f64(start_width, end_width, f)); + } + + self.points.push(point); + self.width.push(end_width); + } + + fn render_quadratic_bezier( + &mut self, + control: Point, + target: Point, + start_width: f64, + end_width: f64, + ) { + const BEZIER_POLY_COUNT: usize = 16; + + let previous = self.points.last().unwrap(); + let oct0x = [previous.x, control.x, target.x]; + let oct0y = [previous.y, control.y, target.y]; + + for i in 1..BEZIER_POLY_COUNT { + let f = i as f64 / BEZIER_POLY_COUNT as f64; + let x = lerp_and_reduce_to_one(&oct0x, f); + let y = lerp_and_reduce_to_one(&oct0y, f); + + self.points.push(Point { x, y }); + self.width.push(lerp_f64(start_width, end_width, f)); + } + + self.points.push(target); + self.width.push(end_width); + } + + fn render_circle( + &mut self, + p0: Point, + p1: Point, + mut radius: f64, + large_arc: bool, + turn_left: bool, + end_width: f64, + ) { + const CIRCLE_POLY_COUNT: usize = 100; + + let start_width = *self.width.last().unwrap(); + let left_side = turn_left == large_arc; + let delta = (p1 - p0).scale(0.5); + let midpoint = p0 + delta; + + let radius_vec = if left_side { + Vector { + x: -delta.y, + y: delta.x, + } + } else { + Vector { + x: delta.y, + y: -delta.x, + } + }; + + let len_squared = radius_vec.x * radius_vec.x + radius_vec.y * radius_vec.y; + if (len_squared - 0.03 > radius * radius) || radius < 0.0 { + radius = len_squared.sqrt(); + } + + let to_center = radius_vec.scale(f64::max(0.0, radius * radius / len_squared - 1.0).sqrt()); + let center = midpoint + to_center; + let angle = len_squared.sqrt().clamp(-1.0, 1.0).asin() * 2.0; + let arc = if large_arc { + std::f64::consts::TAU - angle + } else { + angle + }; + + let position = p0 - center; + for i in 0..CIRCLE_POLY_COUNT { + let arc = if turn_left { -arc } else { arc }; + let step_matrix = rotation_matrix(i as f64 * arc / CIRCLE_POLY_COUNT as f64); + let point = center + apply_matrix(step_matrix, position); + self.points.push(point); + self.width.push(lerp_f64( + start_width, + end_width, + i as f64 / CIRCLE_POLY_COUNT as f64, + )); + } + + self.points.push(p1); + } + + fn render_ellipse( + &mut self, + p0: Point, + p1: Point, + radius_x: f64, + radius_y: f64, + rotation: f64, + large_arc: bool, + turn_left: bool, + end_width: f64, + ) { + let radius_min = distance(p0, p1) / 2.0; + let radius_max = (radius_x * radius_x + radius_y * radius_y).sqrt(); + let upscale = if radius_max < radius_min { + radius_min / radius_max + } else { + 1.0 + }; + + let ratio = radius_x / radius_y; + let rotation = rotation_matrix(-rotation.to_radians()); + let transform = [ + [rotation[0][0] / upscale, rotation[0][1] / upscale], + [ + rotation[1][0] / upscale * ratio, + rotation[1][1] / upscale * ratio, + ], + ]; + let transform_back = [ + [rotation[1][1] * upscale, -rotation[0][1] / ratio * upscale], + [-rotation[1][0] * upscale, rotation[0][0] / ratio * upscale], + ]; + + let mut tmp = PathMaker::default(); + tmp.render_circle( + apply_matrix_point(transform, p0), + apply_matrix_point(transform, p1), + radius_x * upscale, + large_arc, + turn_left, + end_width, + ); + + for i in 0..tmp.points.len() { + let point = tmp.points[i]; + self.points.push(apply_matrix_point(transform_back, point)); + self.width.push(tmp.width[i]); + } + } + + fn close(&mut self, width: f64) { + self.points.push(self.points[0]); + self.width.push(width) + } +} + +fn render_path(path: Path, width: f64) { + for segment in path.segments.iter() { + let mut path_maker = PathMaker::new(width, segment.start); + for instruction in segment.instructions.iter() { + let line_width = instruction + .line_width + .unwrap_or(*path_maker.width.last().unwrap()); + let data = instruction.data; + match data { + InstructionData::Line { position } => path_maker.render_line(line_width, position), + InstructionData::HorizontalLine { x } => { + path_maker.render_horizontal_line(line_width, x) + } + InstructionData::VerticalLine { y } => { + path_maker.render_vertical_line(line_width, y) + } + InstructionData::CubicBezier { + control_0, + control_1, + point_1, + } => path_maker.render_cubic_bezier( + control_0, + control_1, + point_1, + *path_maker.width.last().unwrap(), + line_width, + ), + InstructionData::ArcCircle { + large_arc, + sweep, + radius, + target, + } => path_maker.render_circle( + *path_maker.points.last().unwrap(), + target, + radius, + large_arc, + sweep == Sweep::Left, + line_width, + ), + InstructionData::ArcEllipse { + large_arc, + sweep, + radius_x, + radius_y, + rotation, + target, + } => path_maker.render_ellipse( + *path_maker.points.last().unwrap(), + target, + radius_x, + radius_y, + rotation, + large_arc, + sweep == Sweep::Left, + line_width, + ), + InstructionData::ClosePath => path_maker.close(line_width), + InstructionData::QuadraticBezier { control, target } => path_maker + .render_quadratic_bezier( + control, + target, + *path_maker.width.last().unwrap(), + line_width, + ), + } + } + } +} + +pub enum AntiAliasing { + X1 = 1, + X4 = 2, + X9 = 3, + X16 = 4, + X25 = 6, + X49 = 7, + X64 = 8, +} + +pub fn render<C: Color + Clone + Default>( + file: &TvgFile<C>, + width: u32, + height: u32, + scale_x: f32, + scale_y: f32, + anti_alias: AntiAliasing, +) { + let mut framebuffer: FrameBuffer<C> = FrameBuffer::new( + width as usize, + height as usize, + scale_x.into(), + scale_y.into(), + ); + let header = &file.header; + let color_table = &file.color_table; + + for command in file.commands.iter() { + match command { + Command::EndOfDocument => break, + Command::FillPolygon { + fill_style, + polygon, + } => { + todo!() + } + Command::FillRectangles { + fill_style, + rectangles, + } => todo!(), + Command::FillPath { fill_style, path } => todo!(), + Command::DrawLines { + line_style, + line_width, + lines, + } => todo!(), + Command::DrawLineLoop { + line_style, + line_width, + points, + } => todo!(), + Command::DrawLineStrip { + line_style, + line_width, + points, + } => todo!(), + Command::DrawLinePath { + line_style, + line_width, + path, + } => todo!(), + Command::OutlineFillPolygon { + fill_style, + line_style, + line_width, + points, + } => todo!(), + Command::OutlineFillRectangles { + fill_style, + line_style, + line_width, + rectangles, + } => todo!(), + Command::OutlineFillPath { + fill_style, + line_style, + line_width, + path, + } => todo!(), + } + } +} |
