From 08bec88dc13f6c7eb832ec3c02678bf626db6ed1 Mon Sep 17 00:00:00 2001 From: RoBoT_095 Date: Fri, 5 Sep 2025 23:56:17 -0400 Subject: [PATCH 1/4] Added BSON support --- README.md | 89 ++++++++++----- example/lib/main.dart | 32 ++++++ example/lib/test_data_bson.dart | 5 + example/pubspec.lock | 108 +++++++++++++++--- example/pubspec.yaml | 1 + lib/src/controller/sketch_controller.dart | 22 ++++ .../dataConverter/sketch_data_converter.dart | 47 ++++++++ lib/src/model/content/blank.dart | 7 ++ lib/src/model/content/draw/brush.dart | 4 + lib/src/model/content/draw/eraser.dart | 4 + lib/src/model/content/draw/highlighter.dart | 4 + lib/src/model/content/draw/pencil.dart | 4 + lib/src/model/content/shape/circle.dart | 4 + lib/src/model/content/shape/line.dart | 4 + lib/src/model/content/shape/rectangle.dart | 4 + lib/src/model/content/sketch_content.dart | 6 +- lib/src/view/topBar/sketch_top_bar.dart | 24 ++++ pubspec.yaml | 1 + 18 files changed, 328 insertions(+), 42 deletions(-) create mode 100644 example/lib/test_data_bson.dart diff --git a/README.md b/README.md index bcb72d4..09283fc 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,33 @@ # Sketch Flow +

[English](https://github.com/JunYeong0314/sketch_flow/edit/main/README.md) / [한국어](https://github.com/JunYeong0314/sketch_flow/blob/main/README-KO.md) **A powerful and flexible Flutter sketching plugin** -Easily build drawing applications with elegant UI and comprehensive export features. +Easily build drawing applications with elegant UI and comprehensive export features. ## Features -#### Easy-to-use SketchController - - Integrate sketching functionality with just a few lines using `SketchController`. Manage tools, undo/redo, and export effortlessly. +#### Easy-to-use SketchController + +- Integrate sketching functionality with just a few lines using `SketchController`. Manage tools, undo/redo, and export effortlessly. #### Export Support + - `PNG`: For high-resolution image rendering - `SVG`: For scalable vector graphics - `JSON`: For precise stroke data and replaying paths +- `BSON`: Wrapper for `JSON` that converts it into Bson bytes #### Built-in Stylish UI + - Comes with ready-made top/bottom bars that offer a **clean, user-friendly design**. - Use directly without extra customization for quick prototyping. -## Preview +## Preview + Test it live!: [Try it](https://fasoo-digitalpage.github.io/sketch_flow/) View example code: [main.dart](https://github.com/fasoo-digitalpage/sketch_flow/blob/main/example/lib/main.dart) Check out an example project using sketch_flow: [sketch_flow_example](https://github.com/JunYeong0314/sketch_flow_example) @@ -35,11 +41,12 @@ Check out an example project using sketch_flow: [sketch_flow_example](https://gi

## Core components at a glance -| Components | Description | -| ---------------------------------- | --------------------------------------------------------- | + +| Components | Description | +| ---------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | | `SketchController` | **(Required)** Key controller that manages drawing status and can be extracted in various formats such as JSON/SVG/PNG | -| `SketchBoard` | **(Required)** Main canvas widget to handle user input (draw/er, etc.) | -| `SketchTopBar` / `SketchBottomBar` | **(Optional)** Preferred UI components | +| `SketchBoard` | **(Required)** Main canvas widget to handle user input (draw/er, etc.) | +| `SketchTopBar` / `SketchBottomBar` | **(Optional)** Preferred UI components | ## Architecture @@ -48,36 +55,45 @@ Check out an example project using sketch_flow: [sketch_flow_example](https://gi

## How to Use `sketch_flow` + #### Install the package - Add this to your `pubspec.yaml`: [Check latest version](https://pub.dev/packages/sketch_flow/versions) + ```dart dependencies: sketch_flow: ^latest_version ``` #### `SketchController` and `SketchBoard` + - SketchController is a key class that manages drawing data. -By passing this controller to SketchBoard, you can process user input, extract or reload the information you need. + By passing this controller to SketchBoard, you can process user input, extract or reload the information you need. + ```dart final SketchController _controller = SketchController(); ``` - And if you want to extract images with PNG or save the screen, you need to set GlobalKey on SketchBoard. -This key is internally connected to RepaintBoundary and is used to capture images. + This key is internally connected to RepaintBoundary and is used to capture images. + ```dart final GlobalKey _repaintKey = GlobalKey(); ``` - After this definition, pass it along to `SketchBoard`: + ```dart SketchBoard( controller: _controller, repaintKey: _repaintKey, ) ``` -#### (Optional) Use `SketchTopBar` and `SketchBottomBar` + +#### (Optional) Use `SketchTopBar` and `SketchBottomBar` + - It's easy to use, and you can customize it in your own style through a variety of parameters. + ```dart Scaffold( appBar: SketchTopBar(controller: _controller), @@ -85,29 +101,51 @@ Scaffold( bottomNavigationBar: SketchBottomBar(controller: _sketchController), ) ``` + > 💡 Of course, you can freely configure the UI. > If you connect the Sketch Controller properly, you can design the UI any way you want without the top and bottom bars. ## Export & Import Drawings + #### JSON (Serialization / Deserialization) + - You can easily **serialize (export)** your sketch data to JSON and **deserialize (import)** it back using the controller: + ```dart final json = _controller.toJson(); // Serialization _controller.fromJson(json: json); // Deserialization ``` + +#### BSON (Serialization / Deserialization) + +- Used the same way as **JSON**, but it works differently, sketch data is converted into JSON and then into BSON, and vice vera. This isn't a full integration, but is a wrapper to give support for `.bson` files, here is an example of its usage: + +```dart +final bson = _controller.toBson(); // Serialization + +_controller.fromBson(bson: bson); // Deserialization +``` + +There is also `.fromBsonToJson()` and `.fromJsonToBson()` that can be used to migrate/test between different formats without converting it into sketch data first. + #### PNG + - You can easily export your drawing as a PNG using `SketchController`. -Customize the image resolution with the `pixelRatio` parameter: + Customize the image resolution with the `pixelRatio` parameter: + ```dart final Uint8List? image = await _controller.extractPNG( repaintKey: _repaintKey, pixelRatio: 2.0, // Customize resolution ); ``` + #### SVG + - Easily export your drawing as an SVG with `SketchController`. -You can define the canvas width and height to match your needs. + You can define the canvas width and height to match your needs. + ```dart final String svgCode = await _controller.extractSVG( width: 300.0, // Define canvas width @@ -116,18 +154,15 @@ final String svgCode = await _controller.extractSVG( ``` ## Tools Overview -| Tool Type | Description | -| ----------- | ------------------------------------------------------------------------------------------------ | -| **Move** | Enables panning and zooming of the canvas without affecting the drawings. | -| **Pencil** | Draws a continuous line based on user input. Configurable stroke thickness, color, and opacity. | -| **Brush** | Simulates a brush-like stroke with smooth edges. Supports color and thickness customization. | -| **Highlighter** | Draws semi-transparent strokes resembling a highlighter. Comes with predefined low opacity and medium thickness to simulate real highlighter effects. | -| **Palette** | Allows users to select colors for drawing tools. | -| **Eraser** | Erases drawings either by stroke or by area. | -| **Line** | Draws a straight line between the first and last touch point. Line color and thickness are customizable. | -| **Rectangle** | Draws a rectangle defined by the first and last touch points. | -| **Circle** | Draws a circle or ellipse bounded by the first and last touch points. | - - - +| Tool Type | Description | +| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Move** | Enables panning and zooming of the canvas without affecting the drawings. | +| **Pencil** | Draws a continuous line based on user input. Configurable stroke thickness, color, and opacity. | +| **Brush** | Simulates a brush-like stroke with smooth edges. Supports color and thickness customization. | +| **Highlighter** | Draws semi-transparent strokes resembling a highlighter. Comes with predefined low opacity and medium thickness to simulate real highlighter effects. | +| **Palette** | Allows users to select colors for drawing tools. | +| **Eraser** | Erases drawings either by stroke or by area. | +| **Line** | Draws a straight line between the first and last touch point. Line color and thickness are customizable. | +| **Rectangle** | Draws a rectangle defined by the first and last touch points. | +| **Circle** | Draws a circle or ellipse bounded by the first and last touch points. | diff --git a/example/lib/main.dart b/example/lib/main.dart index 8715120..eaf3a0a 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -1,8 +1,12 @@ import 'dart:convert'; import 'dart:typed_data'; + import 'package:example/test_data.dart'; +import 'package:example/test_data_bson.dart'; + import 'package:flutter/material.dart'; import 'package:jovial_svg/jovial_svg.dart'; +import 'package:bson/bson.dart'; import 'package:sketch_flow/sketch_flow.dart'; void main() { @@ -39,6 +43,7 @@ class _DemoPageState extends State { appBar: SketchTopBar( controller: _sketchController, showJsonDialogIcon: true, + showBsonDialogIcon: true, exportSVGIcon: Image.asset('assets/images/svg.png'), exportPNGIcon: Image.asset('assets/images/png.png'), exportJSONIcon: Image.asset('assets/images/json.png'), @@ -49,8 +54,13 @@ class _DemoPageState extends State { }, showInputTestDataIcon: true, onClickInputTestButton: () { + // _sketchController.fromBson(bson: testDataBson); _sketchController.fromJson(json: testData); }, + onClickToBsonButton: () { + final bson = _sketchController.toBson(); + _showBsonDialog(bson: bson); + }, onClickExtractPNG: () async { final image = await _sketchController.extractPNG( repaintKey: _repaintKey, @@ -105,6 +115,28 @@ class _DemoPageState extends State { ); } + void _showBsonDialog({required BsonBinary bson}) { + showDialog( + context: context, + builder: + (context) => AlertDialog( + title: const Text("Sketch BSON Hex"), + content: SingleChildScrollView( + child: SelectableText( + bson.hexString.toString(), + style: const TextStyle(fontSize: 12), + ), + ), + actions: [ + TextButton( + onPressed: () => Navigator.of(context).pop(), + child: const Text("Close"), + ), + ], + ), + ); + } + void _showPNGDialog({required Uint8List image}) { showDialog( context: context, diff --git a/example/lib/test_data_bson.dart b/example/lib/test_data_bson.dart new file mode 100644 index 0000000..c2e0c4c --- /dev/null +++ b/example/lib/test_data_bson.dart @@ -0,0 +1,5 @@ +import 'package:bson/bson.dart'; + +final BsonBinary testDataBson = BsonBinary.fromHexString( + '178500000330008c0900000274797065000700000070656e63696c00046f66667365747300220900000330001d0000000164780000000040e0955b400164790000000000e3124e40000331001d000000016478000000000091945b400164790000000000ea0a4e40000332001d0000000164780000000000cc705b400164790000000000b8cc4d40000333001d000000016478000000000076fe5a4001647900000000002f264d40000334001d00000001647800000000007c515a400164790000000000324f4c40000335001d0000000164780000000000fe8959400164790000000000737e4b40000336001d000000016478000000000043c45840016479000000000061bb4a40000337001d00000001647800000000000cd1574001647900000000006ee84940000338001d000000016478000000000019f556400164790000000000b4364940000339001d000000016478000000000061f055400164790000000000c281484000033130001d0000000164780000000000ebe35440016479000000000076ee474000033131001d0000000164780000000000265f54400164790000000000f0cc474000033132001d000000016478000000000086ec53400164790000000000a8c0474000033133001d0000000164780000000000ed7d53400164790000000000c5bf474000033134001d0000000164780000000000ea2b53400164790000000000fccb474000033135001d00000001647800000000007bee524001647900000000006ffb474000033136001d000000016478000000000020a7524001647900000000000e51484000033137001d000000016478000000000063525240016479000000000060cd484000033138001d00000001647800000000001bee514001647900000000005e7b494000033139001d00000001647800000000001a8751400164790000000000614c4a4000033230001d00000001647800000000002931514001647900000000006b244b4000033231001d0000000164780000000000edfe5040016479000000000015db4b4000033232001d0000000164780000000000eaef5040016479000000000092664c4000033233001d0000000164780000000000a4ed5040016479000000000086f94c4000033234001d00000001647800000000001def50400164790000000000e2c34d4000033235001d0000000164780000000000810251400164790000000000c8de4e4000033236001d0000000164780000000000ca32514001647900000000004efe4f4000033237001d0000000164780000000000ea8e514001647900000000804a89504000033238001d00000001647800000000002825524001647900000000009623514000033239001d0000000164780000000000b0ca5240016479000000008055ab514000033330001d0000000164780000000000b06e534001647900000000005621524000033331001d00000001647800000000006a10544001647900000000004d98524000033332001d000000016478000000000028b854400164790000000080c615534000033333001d0000000164780000000000988c5540016479000000000012b2534000033334001d0000000164780000000000867c564001647900000000007453544000033335001d00000001647800000000007d4957400164790000000080e0d6544000033336001d00000001647800000000004fd7574001647900000000006c3e554000033337001d00000001647800000000000533584001647900000000006298554000033338001d00000001647800000000004875584001647900000000007c02564000033339001d00000001647800000000004fa7584001647900000000006977564000033430001d00000001647800000000006fd158400164790000000000811c574000033431001d0000000164780000000000efee58400164790000000000f80f584000033432001d000000016478000000000078f4584001647900000000807824594000033433001d000000016478000000000078f45840016479000000000085465a4000033434001d000000016478000000000078f4584001647900000000003f435b4000033435001d000000016478000000000038f9584001647900000000008f095c4000033436001d0000000164780000000000f8fd584001647900000000808fa85c4000033437001d000000016478000000000062f158400164790000000080ea1f5d4000033438001d00000001647800000000000ec358400164790000000000b0a95d4000033439001d0000000164780000000000a98658400164790000000000af3a5e4000033530001d0000000164780000000000495158400164790000000000bea05e4000033531001d0000000164780000000000351758400164790000000080e3e25e4000033532001d000000016478000000000069c457400164790000000000291c5f4000033533001d0000000164780000000000433857400164790000000000ff675f4000033534001d00000001647800000000004d9856400164790000000000aaad5f4000033535001d0000000164780000000000dd1a564001647900000000002ace5f4000033536001d00000001647800000000007d88554001647900000000801dd25f4000033537001d0000000164780000000000439e54400164790000000000f2b95f4000033538001d00000001647800000000001e8753400164790000000000328c5f4000033539001d0000000164780000000000bec252400164790000000000586b5f4000033630001d00000001647800000000004b60524001647900000000001e575f4000033631001d0000000164780000000000ae0f52400164790000000000ad365f4000033632001d00000001647800000000009aa35140016479000000008022fe5e4000033633001d0000000164780000000000c91751400164790000000080ffaf5e4000033634001d00000001647800000000001db2504001647900000000000d785e4000033635001d00000001647800000000001c8750400164790000000000bf5f5e4000033636001d0000000164780000000000866d5040016479000000008087515e4000033637001d000000016478000000000078505040016479000000000010435e4000033638001d000000016478000000000043295040016479000000008005315e4000033639001d00000001647800000000000b0e50400164790000000000c2275e4000033730001d0000000164780000000000e1075040016479000000000026265e4000001270656e63696c436f6c6f7200000000ff000000000170656e63696c5374726f6b65546869636b6e657373000000000000001c400170656e63696c4f70616369747900000000000000f03f000331001a0300000274797065000700000070656e63696c00046f66667365747300b00200000330001d00000001647800000000a068e460400164790000000080ac944940000331001d000000016478000000008068e460400164790000000000fda14940000332001d000000016478000000008068e46040016479000000000078cb4940000333001d0000000164780000000000eee5604001647900000000007d784a40000334001d0000000164780000000000b1f7604001647900000000003e904c40000335001d0000000164780000000080ea1561400164790000000000fcd34f40000336001d0000000164780000000080c82b61400164790000000000139e5140000337001d000000016478000000008072356140016479000000000072815340000338001d00000001647800000000803a31614001647900000000808c815540000339001d0000000164780000000080df1b61400164790000000000cd68574000033130001d0000000164780000000080dceb604001647900000000009f40594000033131001d00000001647800000000809a9a60400164790000000000980a5b4000033132001d0000000164780000000000e52060400164790000000080d6bc5c4000033133001d00000001647800000000004e2c5f400164790000000080090e5e4000033134001d000000016478000000000074355e40016479000000000023035f4000033135001d00000001647800000000004d975d400164790000000000e3965f4000033136001d000000016478000000000073595d400164790000000000e9c55f4000033137001d000000016478000000000061305d40016479000000008080d25f4000033138001d00000001647800000000001e135d400164790000000080b0d45f4000033139001d000000016478000000000053085d400164790000000080b0d45f4000033230001d00000001647800000000001d035d400164790000000080b0d45f4000001270656e63696c436f6c6f72000084ffff000000000170656e63696c5374726f6b65546869636b6e657373000000000000001c400170656e63696c4f70616369747900000000000000f03f000332001a0300000274797065000700000070656e63696c00046f66667365747300b00200000330001d00000001647800000000c0a51b6340016479000000008031c85640000331001d0000000164780000000080671b6340016479000000000070c85640000332001d00000001647800000000807b0363400164790000000080efe25640000333001d000000016478000000008069ad62400164790000000000a1405740000334001d0000000164780000000080c54062400164790000000000f8b65740000335001d0000000164780000000080ccea6140016479000000008021165840000336001d00000001647800000000803391614001647900000000007a645840000337001d00000001647800000000804b33614001647900000000806ba35840000338001d00000001647800000000800800614001647900000000004cc45840000339001d000000016478000000008067f360400164790000000000c0ce584000033130001d0000000164780000000080cbd46040016479000000008056ee584000033131001d00000001647800000000809bb3604001647900000000000810594000033132001d0000000164780000000080fcac60400164790000000000041e594000033133001d0000000164780000000080e3d5604001647900000000000a60594000033134001d0000000164780000000000b04a61400164790000000000910d5a4000033135001d00000001647800000000805215624001647900000000004f4d5b4000033136001d00000001647800000000001607634001647900000000003be85c4000033137001d0000000164780000000080edee63400164790000000000ff7b5e4000033138001d0000000164780000000080079d64400164790000000000a2a55f4000033139001d00000001647800000000007ade64400164790000000080bd09604000033230001d000000016478000000008025e664400164790000000040aa0f604000001270656e63696c436f6c6f72000084ffff000000000170656e63696c5374726f6b65546869636b6e657373000000000000001c400170656e63696c4f70616369747900000000000000f03f000333000d06000002747970650006000000627275736800046f66667365747300a70500000330001d00000001647800000000201b3e64400164790000000000b87f5840000331001d00000001647800000000001b3e64400164790000000000a9825840000332001d0000000164780000000080b4406440016479000000000033885840000333001d0000000164780000000000795d6440016479000000008079965840000334001d00000001647800000000007aac6440016479000000000072b35840000335001d0000000164780000000000552e65400164790000000080a9cc5840000336001d0000000164780000000080efcd6540016479000000008095d45840000337001d00000001647800000000803f6866400164790000000080bad25840000338001d0000000164780000000000a4d666400164790000000000abc15840000339001d0000000164780000000080340f67400164790000000080e09d584000033130001d0000000164780000000080aa2f674001647900000000009b67584000033131001d0000000164780000000000a250674001647900000000008b14584000033132001d0000000164780000000000dc6e6740016479000000000059b0574000033133001d0000000164780000000000fe8067400164790000000000fb41574000033134001d0000000164780000000000e7886740016479000000000057d0564000033135001d00000001647800000000806a8467400164790000000000855d564000033136001d00000001647800000000003b7767400164790000000000d602564000033137001d00000001647800000000008e696740016479000000000003db554000033138001d0000000164780000000000ff5a67400164790000000000f7c9554000033139001d000000016478000000008071466740016479000000008054c1554000033230001d0000000164780000000000a0236740016479000000000021be554000033231001d00000001647800000000000ce666400164790000000080bebe554000033232001d0000000164780000000080e39f6640016479000000000040ca554000033233001d0000000164780000000000e262664001647900000000808eec554000033234001d0000000164780000000000912766400164790000000000fe2a564000033235001d000000016478000000000023e9654001647900000000006f95564000033236001d000000016478000000000057a8654001647900000000002541574000033237001d0000000164780000000000617165400164790000000000c31b584000033238001d00000001647800000000009755654001647900000000004802594000033239001d00000001647800000000803f516540016479000000000054d4594000033330001d00000001647800000000005a5865400164790000000000977c5a4000033331001d0000000164780000000000b9826540016479000000000092415b4000033332001d000000016478000000000010e365400164790000000000295c5c4000033333001d0000000164780000000080096f66400164790000000000d4995d4000033334001d0000000164780000000080f4f3664001647900000000007b7c5e4000033335001d0000000164780000000080c34f6740016479000000000020d65e4000033336001d000000016478000000008080906740016479000000000083ec5e4000033337001d000000016478000000008042c067400164790000000000f6e75e4000033338001d000000016478000000008081f26740016479000000008055ca5e4000033339001d00000001647800000000004d2268400164790000000000159a5e4000033430001d0000000164780000000000253e68400164790000000000aa725e4000033431001d0000000164780000000080424a684001647900000000806d5b5e4000033432001d0000000164780000000000ae4d6840016479000000000037535e4000033433001d0000000164780000000000264f6840016479000000000000525e400000126272757368436f6c6f7200f39621ff000000000162727573685374726f6b65546869636b6e6573730000000000000014400162727573684f70616369747900000000000000f03f00033400cb0200000274797065000c000000686967686c69676874657200046f666673657473004d0200000330001d000000016478000000004005aa6a40016479000000000096005240000331001d000000016478000000000005aa6a40016479000000000071405240000332001d000000016478000000000005aa6a400164790000000080b8e95240000333001d000000016478000000008076a66a4001647900000000008bef5340000334001d0000000164780000000080dea06a40016479000000000064675540000335001d0000000164780000000000d59e6a4001647900000000000f155740000336001d0000000164780000000080a4a06a400164790000000080bc925840000337001d00000001647800000000001aa36a4001647900000000007a9c5940000338001d000000016478000000008033a26a40016479000000000075605a40000339001d000000016478000000000008a06a400164790000000080f5245b4000033130001d00000001647800000000004b9e6a400164790000000000c0b25b4000033131001d0000000164780000000080a09c6a40016479000000000015f95b4000033132001d0000000164780000000000139c6a40016479000000000040175c4000033133001d0000000164780000000000439a6a400164790000000080102a5c4000033134001d00000001647800000000005e926a400164790000000000cd5c5c4000033135001d000000016478000000000099836a4001647900000000001ac35c4000033136001d00000001647800000000806d756a4001647900000000004e3a5d4000033137001d00000001647800000000009a6e6a400164790000000000ed7f5d40000012686967686c696768746572436f6c6f7200ff4d7cff0000000001686967686c6967687465725374726f6b65546869636b6e65737300000000000000204001686967686c6967687465724f70616369747900333333333333e33f00033500f40300000274797065000c000000686967686c69676874657200046f66667365747300760300000330001d00000001647800000000e0c3146940016479000000000050555540000331001d00000001647800000000801b166940016479000000000050555540000332001d00000001647800000000803e196940016479000000000050555540000333001d0000000164780000000080a9216940016479000000000050555540000334001d000000016478000000008099376940016479000000000050555540000335001d0000000164780000000080886b6940016479000000008048535540000336001d0000000164780000000000b8b469400164790000000000294b5540000337001d0000000164780000000000b8fd6940016479000000000045435540000338001d0000000164780000000000073b6a400164790000000000763f5540000339001d000000016478000000008052646a4001647900000000002f3c554000033130001d0000000164780000000000597f6a4001647900000000802639554000033131001d0000000164780000000080968e6a4001647900000000804436554000033132001d00000001647800000000002f9a6a4001647900000000005433554000033133001d000000016478000000000022ae6a4001647900000000008131554000033134001d000000016478000000008023ce6a400164790000000000bc2e554000033135001d0000000164780000000080dcf66a400164790000000000682b554000033136001d00000001647800000000005c236b400164790000000000aa2d554000033137001d0000000164780000000080ec5b6b4001647900000000809c36554000033138001d0000000164780000000000ad946b400164790000000000513f554000033139001d000000016478000000008003bb6b400164790000000000ec44554000033230001d0000000164780000000000b9d96b4001647900000000005c4a554000033231001d000000016478000000000073fd6b4001647900000000803e51554000033232001d0000000164780000000000ce266c4001647900000000002558554000033233001d0000000164780000000000bc556c400164790000000000b35b554000033234001d0000000164780000000080f47d6c400164790000000000d55c554000033235001d000000016478000000008024956c400164790000000000d55c554000033236001d0000000164780000000000a0a06c400164790000000000d55c5540000012686967686c696768746572436f6c6f7200ff4d7cff0000000001686967686c6967687465725374726f6b65546869636b6e65737300000000000000204001686967686c6967687465724f70616369747900333333333333e33f00033600cf0500000274797065000700000070656e63696c00046f66667365747300650500000330001d000000016478000000002041bf6f400164790000000000c82a5540000331001d00000001647800000000006cbd6f4001647900000000801d275540000332001d0000000164780000000000e1b06f400164790000000000a5195540000333001d000000016478000000008024986f400164790000000000a4065540000334001d0000000164780000000080597f6f400164790000000000c1f65440000335001d0000000164780000000000cf616f4001647900000000007feb5440000336001d00000001647800000000004c356f400164790000000000eee65440000337001d0000000164780000000080a8016f400164790000000000f7ea5440000338001d0000000164780000000080e8dc6e4001647900000000000cf55440000339001d00000001647800000000000eca6e400164790000000000d903554000033130001d0000000164780000000080c8b56e4001647900000000804f19554000033131001d00000001647800000000008f9b6e400164790000000000a732554000033132001d000000016478000000000023806e400164790000000000fb53554000033133001d000000016478000000008086646e4001647900000000001582554000033134001d00000001647800000000800d426e400164790000000000b5be554000033135001d0000000164780000000080811d6e400164790000000080eb07564000033136001d00000001647800000000806b016e400164790000000000534c564000033137001d000000016478000000000040e96d4001647900000000005891564000033138001d000000016478000000000087ce6d40016479000000008030e3564000033139001d000000016478000000008002b46d400164790000000080e043574000033230001d0000000164780000000080519b6d40016479000000008038b2574000033231001d000000016478000000008079836d400164790000000000123a584000033232001d0000000164780000000080a86c6d4001647900000000000aec584000033233001d0000000164780000000000cf5d6d40016479000000000018a8594000033234001d0000000164780000000000175a6d400164790000000080703f5a4000033235001d0000000164780000000080a7596d400164790000000000dcb65a4000033236001d0000000164780000000080a7596d4001647900000000001f1b5b4000033237001d0000000164780000000080bb5a6d40016479000000000045605b4000033238001d00000001647800000000807f5c6d400164790000000080608a5b4000033239001d00000001647800000000805f5f6d40016479000000008037a35b4000033330001d0000000164780000000080b8656d400164790000000080b2b45b4000033331001d000000016478000000000077706d40016479000000000041c45b4000033332001d0000000164780000000000537f6d4001647900000000006dcc5b4000033333001d0000000164780000000000a2986d400164790000000000b5d25b4000033334001d000000016478000000000048c96d40016479000000000084d95b4000033335001d00000001647800000000000e296e40016479000000008073df5b4000033336001d0000000164780000000000ecb46e400164790000000080dde35b4000033337001d00000001647800000000800c4d6f400164790000000000a5e95b4000033338001d00000001647800000000807cca6f40016479000000000010ef5b4000033339001d0000000164780000000080c00d704001647900000000007ded5b4000033430001d0000000164780000000040f01f7040016479000000000075ea5b4000033431001d00000001647800000000801f227040016479000000000018e65b4000001270656e63696c436f6c6f7200ff00f7ff000000000170656e63696c5374726f6b65546869636b6e657373000000000000001c400170656e63696c4f70616369747900000000000000f03f00033700950600000274797065000700000070656e63696c00046f666673657473002b0600000330001d0000000164780000000060dd3f71400164790000000000090d4240000331001d0000000164780000000080dd3f7140016479000000000060504240000332001d00000001647800000000008b3d714001647900000000002e1a4340000333001d00000001647800000000c0c63871400164790000000000c2474440000334001d00000001647800000000802032714001647900000000002f094640000335001d00000001647800000000008f2771400164790000000000998a4840000336001d00000001647800000000802519714001647900000000005a734b40000337001d0000000164780000000080bc0871400164790000000000d2d34e40000338001d000000016478000000004095f770400164790000000080de3d5140000339001d00000001647800000000005add70400164790000000000d350534000033130001d000000016478000000004095be70400164790000000000a459554000033131001d00000001647800000000c0b6aa7040016479000000000087f2564000033132001d00000001647800000000405a9c70400164790000000000e64d584000033133001d00000001647800000000c09489704001647900000000008275594000033134001d0000000164780000000040ee7370400164790000000000c07a5a4000033135001d00000001647800000000405e5d70400164790000000000816a5b4000033136001d00000001647800000000c06d4770400164790000000000344a5c4000033137001d0000000164780000000000473770400164790000000080a7015d4000033138001d00000001647800000000c0482f70400164790000000000d66e5d4000033139001d0000000164780000000040932c70400164790000000000709b5d4000033230001d00000001647800000000c0db2e7040016479000000008067955d4000033231001d0000000164780000000000fc4270400164790000000080d82f5d4000033232001d0000000164780000000000bd9370400164790000000000a2dc5b4000033233001d0000000164780000000000be0a71400164790000000000d8145a4000033234001d0000000164780000000000b4697140016479000000000099bb584000033235001d00000001647800000000c019a5714001647900000000006ce5574000033236001d0000000164780000000080adc4714001647900000000808c7e574000033237001d00000001647800000000c088e1714001647900000000006f3d574000033238001d00000001647800000000c0f60772400164790000000000f0f8564000033239001d00000001647800000000c0c93172400164790000000080f5b5564000033330001d0000000164780000000000385172400164790000000000038c564000033331001d0000000164780000000040315f72400164790000000000ef7c564000033332001d00000001647800000000406b6272400164790000000000717a564000033333001d0000000164780000000040d96372400164790000000000717a564000033334001d00000001647800000000809866724001647900000000808b7f564000033335001d00000001647800000000c03f6a72400164790000000080e197564000033336001d0000000164780000000080916c72400164790000000000d3d2564000033337001d00000001647800000000001a6972400164790000000000b64a574000033338001d0000000164780000000040df6272400164790000000000baea574000033339001d00000001647800000000000060724001647900000000006f7f584000033430001d00000001647800000000800a5e72400164790000000000540e594000033431001d0000000164780000000080ef5672400164790000000000c6a0594000033432001d0000000164780000000040fc46724001647900000000006b4c5a4000033433001d00000001647800000000007431724001647900000000003d015b4000033434001d00000001647800000000402a227240016479000000008070745b4000033435001d0000000164780000000080d21d724001647900000000002e975b4000033436001d0000000164780000000080ae1d724001647900000000002b9b5b4000033437001d0000000164780000000080ae1d724001647900000000001c9e5b4000001270656e63696c436f6c6f7200ff00f7ff000000000170656e63696c5374726f6b65546869636b6e657373000000000000001c400170656e63696c4f70616369747900000000000000f03f000338005803000002747970650006000000627275736800046f66667365747300f20200000330001d0000000164780000000040edbd58400164790000000080afac6240000331001d0000000164780000000000edbd58400164790000000080afb26240000332001d0000000164780000000000edbd584001647900000000c071b86240000333001d0000000164780000000000edbd5840016479000000000022c16240000334001d0000000164780000000000edbd5840016479000000008047c56240000335001d000000016478000000000023c258400164790000000000c4c66240000336001d00000001647800000000003dd75840016479000000008027c76240000337001d0000000164780000000000a7255940016479000000008027c76240000338001d000000016478000000000095eb5940016479000000008027c76240000339001d000000016478000000000025fd5a40016479000000004014c5624000033130001d00000001647800000000009f035c4001647900000000c04bbf624000033131001d0000000164780000000000cbd35c400164790000000080aab6624000033132001d000000016478000000000007865d4001647900000000008fa5624000033133001d000000016478000000000062305e400164790000000000c58a624000033134001d000000016478000000000085b35e400164790000000000de68624000033135001d000000016478000000000001245f400164790000000000a543624000033136001d00000001647800000000007c715f400164790000000080ea28624000033137001d0000000164780000000000c4935f400164790000000000a91a624000033138001d0000000164780000000000d5ad5f4001647900000000c03410624000033139001d000000016478000000000033cc5f4001647900000000008303624000033230001d0000000164780000000000a1e75f4001647900000000000ef6614000033231001d00000001647800000000000ff45f400164790000000040ccef614000033232001d00000001647800000000007cf65f40016479000000000054ee61400000126272757368436f6c6f7200ff0026ff000000000162727573685374726f6b65546869636b6e6573730000000000000024400162727573684f70616369747900000000000000f03f000339001603000002747970650006000000627275736800046f66667365747300b00200000330001d000000016478000000008082d259400164790000000000c7f56240000331001d0000000164780000000000a4ce594001647900000000001d096340000332001d0000000164780000000000c6ca594001647900000000000f2f6340000333001d0000000164780000000000c6ca59400164790000000080ee746340000334001d0000000164780000000000c6ca5940016479000000004014e36340000335001d0000000164780000000000c6ca5940016479000000004017786440000336001d00000001647800000000004cc35940016479000000008052216540000337001d00000001647800000000007da85940016479000000008002a76540000338001d00000001647800000000006977594001647900000000c0ec0c6640000339001d0000000164780000000000883659400164790000000000a469664000033130001d000000016478000000000090ef58400164790000000080f3c2664000033131001d0000000164780000000000069558400164790000000000c116674000033132001d000000016478000000000054f9574001647900000000400f79674000033133001d00000001647800000000007ef056400164790000000080c8f7674000033134001d000000016478000000000087c4554001647900000000803b66684000033135001d000000016478000000000092f1544001647900000000809ba9684000033136001d00000001647800000000002f98544001647900000000402bc7684000033137001d0000000164780000000000137e54400164790000000080dfcf684000033138001d000000016478000000000025575440016479000000000095dc684000033139001d00000001647800000000002f285440016479000000008001f2684000033230001d0000000164780000000000090e54400164790000000080a30569400000126272757368436f6c6f7200ff0026ff000000000162727573685374726f6b65546869636b6e6573730000000000000024400162727573684f70616369747900000000000000f03f00033130000e02000002747970650006000000627275736800046f66667365747300a80100000330001d0000000164780000000040bca45a40016479000000000097a66540000331001d00000001647800000000008daa5a40016479000000000097a66540000332001d000000016478000000000043c75a40016479000000000097a66540000333001d0000000164780000000000ea075b400164790000000080d4a46540000334001d0000000164780000000000834c5b40016479000000000073a16540000335001d0000000164780000000000b27a5b400164790000000080829e6540000336001d00000001647800000000005a995b400164790000000000799c6540000337001d0000000164780000000000a8c45b40016479000000000036966540000338001d00000001647800000000008a395c4001647900000000c0f6866540000339001d000000016478000000000059de5c4001647900000000802174654000033130001d00000001647800000000002e855d400164790000000000f261654000033131001d0000000164780000000000c8f05d4001647900000000809856654000033132001d0000000164780000000000c1065e4001647900000000c0f95365400000126272757368436f6c6f7200ff0026ff000000000162727573685374726f6b65546869636b6e6573730000000000000024400162727573684f70616369747900000000000000f03f0003313100210f000002747970650006000000627275736800046f66667365747300bb0e00000330001d0000000164780000000080740c5d40016479000000000067cf6940000331001d000000016478000000000084095d400164790000000080eecd6940000332001d0000000164780000000000fb085d4001647900000000c00dca6940000333001d000000016478000000000054345d4001647900000000c0e8b26940000334001d000000016478000000000002bc5d400164790000000040fb6c6940000335001d00000001647800000000005f845e40016479000000000025086940000336001d000000016478000000000013885f400164790000000000b3866840000337001d0000000164780000000000c06e60400164790000000000c9db6740000338001d00000001647800000000809c3c614001647900000000004f016740000339001d0000000164780000000080bb2f6240016479000000004082e5654000033130001d00000001647800000000800506634001647900000000005acd644000033131001d00000001647800000000802db5634001647900000000008bc7634000033132001d00000001647800000000801e3b6440016479000000008080e8624000033133001d0000000164780000000000ce82644001647900000000c0035e624000033134001d00000001647800000000001cbe6440016479000000000070f8614000033135001d0000000164780000000080b1ec6440016479000000004087a7614000033136001d00000001647800000000001f0765400164790000000080736b614000033137001d0000000164780000000000fc1365400164790000000080dc48614000033138001d00000001647800000000805c1765400164790000000000303d614000033139001d00000001647800000000007b1765400164790000000080023a614000033230001d00000001647800000000800e1265400164790000000040fb41614000033231001d0000000164780000000080a7ef64400164790000000080076b614000033232001d00000001647800000000001cb2644001647900000000804ba6614000033233001d0000000164780000000000ad7d6440016479000000008079d9614000033234001d00000001647800000000800e5164400164790000000080e310624000033235001d0000000164780000000000471764400164790000000080675d624000033236001d000000016478000000000019cd6340016479000000008057c6624000033237001d00000001647800000000002f6b634001647900000000803268634000033238001d0000000164780000000080b20863400164790000000080d31f644000033239001d0000000164780000000000b0c862400164790000000040bab9644000033330001d0000000164780000000080f8a462400164790000000080eb3d654000033331001d0000000164780000000080739162400164790000000000439e654000033332001d0000000164780000000000bd84624001647900000000402bf2654000033333001d00000001647800000000001e7e624001647900000000c0075e664000033334001d00000001647800000000001e7e6240016479000000000093f1664000033335001d0000000164780000000080d99062400164790000000000fdab674000033336001d00000001647800000000007fb5624001647900000000801c47684000033337001d000000016478000000000007d2624001647900000000c083a1684000033338001d00000001647800000000800be06240016479000000008067d5684000033339001d00000001647800000000801ce7624001647900000000c051f1684000033430001d0000000164780000000000f8ec624001647900000000807503694000033431001d000000016478000000000054ef624001647900000000c0690d694000033432001d00000001647800000000007fef624001647900000000401612694000033433001d00000001647800000000007fef624001647900000000408314694000033434001d00000001647800000000007fef624001647900000000800b16694000033435001d0000000164780000000080aff362400164790000000080a51e694000033436001d000000016478000000008066fe624001647900000000407b2c694000033437001d0000000164780000000000720763400164790000000080ff36694000033438001d0000000164780000000080330b63400164790000000080393c694000033439001d00000001647800000000006717634001647900000000c07b3f694000033530001d0000000164780000000000ad3163400164790000000000b442694000033531001d0000000164780000000080994b634001647900000000c0e643694000033532001d0000000164780000000000a466634001647900000000c0e643694000033533001d0000000164780000000000309e634001647900000000c01a41694000033534001d0000000164780000000000d9ec63400164790000000080f937694000033535001d0000000164780000000000f72f644001647900000000c0122a694000033536001d0000000164780000000000125964400164790000000000e21e694000033537001d00000001647800000000000a7464400164790000000040db15694000033538001d00000001647800000000003b8d64400164790000000040150c694000033539001d0000000164780000000000bba4644001647900000000404a03694000033630001d00000001647800000000808cba64400164790000000000ccf9684000033631001d0000000164780000000080c4ce6440016479000000008033ee684000033632001d00000001647800000000806aeb644001647900000000c040dc684000033633001d0000000164780000000080a30b6540016479000000008067c6684000033634001d0000000164780000000080c0286540016479000000000004b5684000033635001d0000000164780000000080a54b6540016479000000000093a2684000033636001d0000000164780000000000476f65400164790000000080c689684000033637001d0000000164780000000000e490654001647900000000001c6c684000033638001d00000001647800000000800eb0654001647900000000800b4b684000033639001d000000016478000000008033cb65400164790000000080dc25684000033730001d0000000164780000000000a4e565400164790000000080c4fa674000033731001d000000016478000000000031fe654001647900000000807ad3674000033732001d00000001647800000000003a1a664001647900000000c07fa7674000033733001d0000000164780000000000ac3b66400164790000000000946b674000033734001d0000000164780000000000595e664001647900000000007b2a674000033735001d00000001647800000000800280664001647900000000800ce2664000033736001d00000001647800000000801799664001647900000000808ba0664000033737001d000000016478000000008024a666400164790000000000af74664000033738001d00000001647800000000804bac66400164790000000080c556664000033739001d0000000164780000000000ddaf66400164790000000080dc39664000033830001d000000016478000000000001b3664001647900000000802915664000033831001d0000000164780000000000c8b46640016479000000008033f4654000033832001d0000000164780000000000c8b4664001647900000000005dd4654000033833001d000000016478000000008000b46640016479000000000015b9654000033834001d000000016478000000008088b2664001647900000000008bac654000033835001d000000016478000000000062b066400164790000000080ffa8654000033836001d000000016478000000000064a1664001647900000000c026b0654000033837001d00000001647800000000801e7d6640016479000000008015c2654000033838001d00000001647800000000001f5466400164790000000040f3d1654000033839001d00000001647800000000805b3a6640016479000000008004d8654000033930001d0000000164780000000080142f6640016479000000000078da654000033931001d00000001647800000000004f286640016479000000000069dd654000033932001d00000001647800000000003a1a664001647900000000803ee2654000033933001d00000001647800000000804ef86540016479000000008034ed654000033934001d0000000164780000000000cfc86540016479000000000048fa654000033935001d00000001647800000000009b9465400164790000000000c905664000033936001d0000000164780000000080c86165400164790000000000c712664000033937001d0000000164780000000080b635654001647900000000801823664000033938001d0000000164780000000000c70a65400164790000000000c73c664000033939001d00000001647800000000009ad964400164790000000080b86266400003313030001d0000000164780000000000ac9b64400164790000000000fb9266400003313031001d0000000164780000000000c956644001647900000000005ec966400003313032001d0000000164780000000080911764400164790000000080530067400003313033001d000000016478000000000077e0634001647900000000807f3567400003313034001d000000016478000000008011b563400164790000000040a76467400003313035001d0000000164780000000000579163400164790000000080c09167400003313036001d000000016478000000000054736340016479000000008076ba67400003313037001d0000000164780000000080eb60634001647900000000002dd567400003313038001d0000000164780000000000305a6340016479000000000037e267400003313039001d00000001647800000000009558634001647900000000008ee667400003313130001d00000001647800000000801c57634001647900000000c025ec67400003313131001d00000001647800000000801c57634001647900000000805bfa67400003313132001d00000001647800000000801c5763400164790000000080610a68400003313133001d00000001647800000000801c5763400164790000000080721568400000126272757368436f6c6f7200ff0026ff000000000162727573685374726f6b65546869636b6e6573730000000000000024400162727573684f70616369747900000000000000f03f00033132004f06000002747970650006000000627275736800046f66667365747300e90500000330001d00000001647800000000204b0b6940016479000000000064876540000331001d00000001647800000000004b0b69400164790000000000b4886540000332001d000000016478000000008001ff68400164790000000000bc9d6540000333001d00000001647800000000005ad8684001647900000000807ad76540000334001d0000000164780000000000ad9d68400164790000000040c82c6640000335001d0000000164780000000000d45e684001647900000000c0ab8a6640000336001d00000001647800000000004828684001647900000000804ddc6640000337001d00000001647800000000005e00684001647900000000c0621a6740000338001d0000000164780000000000f4bd6740016479000000000091876740000339001d0000000164780000000080a370674001647900000000c0030c684000033130001d0000000164780000000000a24367400164790000000040315e684000033131001d0000000164780000000080f41a67400164790000000080baa4684000033132001d0000000164780000000080d4f8664001647900000000401fe0684000033133001d0000000164780000000080e1eb664001647900000000c06bf7684000033134001d00000001647800000000008fed664001647900000000000af7684000033135001d000000016478000000000035056740016479000000000066e1684000033136001d00000001647800000000804e336740016479000000000024bb684000033137001d00000001647800000000005b73674001647900000000c0cc8a684000033138001d00000001647800000000809fc0674001647900000000807355684000033139001d0000000164780000000080bd18684001647900000000405f21684000033230001d0000000164780000000000097468400164790000000000dceb674000033231001d0000000164780000000000d9b868400164790000000000ffbf674000033232001d000000016478000000000083f068400164790000000080af98674000033233001d0000000164780000000000f21e694001647900000000001377674000033234001d00000001647800000000008a35694001647900000000c00169674000033235001d0000000164780000000000a23b694001647900000000005668674000033236001d00000001647800000000001a3d694001647900000000806374674000033237001d0000000164780000000080523e694001647900000000c004ad674000033238001d0000000164780000000000f647694001647900000000c0c30c684000033239001d0000000164780000000080705a69400164790000000040e462684000033330001d00000001647800000000001b746940016479000000000032a1684000033331001d0000000164780000000080b08d69400164790000000000e0c6684000033332001d0000000164780000000080b29869400164790000000080b5d3684000033333001d000000016478000000008089a569400164790000000080a1ca684000033334001d000000016478000000000012c969400164790000000080feab684000033335001d0000000164780000000080f3226a4001647900000000004a61684000033336001d0000000164780000000080a3a56a4001647900000000406af3674000033337001d0000000164780000000000c82d6b4001647900000000804678674000033338001d000000016478000000008068a46b40016479000000000058f5664000033339001d000000016478000000008092fb6b400164790000000040527c664000033430001d0000000164780000000000d7486c4001647900000000c0b508664000033431001d000000016478000000008015856c4001647900000000c0a2a8654000033432001d000000016478000000008049a56c400164790000000000816d654000033433001d0000000164780000000000f8b26c400164790000000000f84e654000033434001d0000000164780000000080fcb86c4001647900000000008341654000033435001d00000001647800000000009bba6c400164790000000080cd3c65400000126272757368436f6c6f7200ff0026ff000000000162727573685374726f6b65546869636b6e6573730000000000000024400162727573684f70616369747900000000000000f03f000331330001050000027479706500050000006c696e6500046f666673657473009f0400000330001d00000001647800000000808a4350400164790000000000b1d13540000331001d0000000164780000000000ec1550400164790000000000689a3640000332001d000000016478000000000094804f40016479000000000004153840000333001d000000016478000000000004c34e40016479000000000018bb3940000334001d000000016478000000000078f44d400164790000000000607a3b40000335001d00000001647800000000009e4e4d400164790000000000a6de3c40000336001d000000016478000000000062d04c400164790000000000e0dd3d40000337001d0000000164780000000000804d4c400164790000000000d0dc3e40000338001d000000016478000000000020974b400164790000000000ec2b4040000339001d00000001647800000000002ce24a4001647900000000008cee404000033130001d000000016478000000000028624a4001647900000000000c82414000033131001d000000016478000000000050fd4940016479000000000012f8414000033132001d000000016478000000000082b049400164790000000000a24f424000033133001d0000000164780000000000346c494001647900000000009896424000033134001d00000001647800000000004afd484001647900000000009004434000033135001d00000001647800000000004a50484001647900000000004dd0434000033136001d0000000164780000000000f29247400164790000000000eeca444000033137001d000000016478000000000068ee464001647900000000002aa8454000033138001d0000000164780000000000188a46400164790000000000f43c464000033139001d0000000164780000000000684f46400164790000000000ad93464000033230001d0000000164780000000000fc0e464001647900000000004cec464000033231001d0000000164780000000000489f45400164790000000000c978474000033232001d0000000164780000000000e2d1444001647900000000003b4e484000033233001d0000000164780000000000ec0e44400164790000000000a612494000033234001d000000016478000000000034aa43400164790000000000af7c494000033235001d00000001647800000000000a704340016479000000000052b0494000033236001d0000000164780000000000d8344340016479000000000086dc494000033237001d00000001647800000000007ae742400164790000000000ed164a4000033238001d00000001647800000000008e9242400164790000000000fe4b4a4000033239001d0000000164780000000000a05942400164790000000000866e4a4000033330001d00000001647800000000009e4342400164790000000000657c4a4000033331001d0000000164780000000000f01e4240016479000000000059a14a4000033332001d000000016478000000000096eb4140016479000000000014d54a4000033333001d000000016478000000000026d241400164790000000000dce34a4000033334001d0000000164780000000000b2c2414001647900000000004ada4a4000033335001d0000000164780000000000b6fd414001647900000000005d724a400000126c696e65436f6c6f720050af4cff00000000016c696e655374726f6b65546869636b6e657373000000000000001c40016c696e654f70616369747900000000000000f03f0003313400d0020000027479706500050000006c696e6500046f666673657473006e0200000330001d0000000164780000000000884f454001647900000000006e943340000331001d0000000164780000000000784a454001647900000000008e9e3340000332001d0000000164780000000000983e454001647900000000004cbc3340000333001d00000001647800000000001226454001647900000000004cf93340000334001d00000001647800000000005e01454001647900000000003c543440000335001d0000000164780000000000b8bd4440016479000000000080cd3440000336001d00000001647800000000001a444440016479000000000018a63540000337001d00000001647800000000006ea74340016479000000000078d03640000338001d00000001647800000000008a0243400164790000000000f0043840000339001d0000000164780000000000dc6842400164790000000000ca1b394000033130001d0000000164780000000000d2ca41400164790000000000522c3a4000033131001d0000000164780000000000ce29414001647900000000000c363b4000033132001d000000016478000000000052b04040016479000000000048ff3b4000033133001d0000000164780000000000fa71404001647900000000006e6c3c4000033134001d0000000164780000000000e45840400164790000000000ea963c4000033135001d0000000164780000000000403e4040016479000000000032cc3c4000033136001d0000000164780000000000b8194040016479000000000040153d4000033137001d0000000164780000000000d8f33f400164790000000000dc543d4000033138001d00000001647800000000009cd63f40016479000000000018723d400000126c696e65436f6c6f720050af4cff00000000016c696e655374726f6b65546869636b6e657373000000000000001c40016c696e654f70616369747900000000000000f03f00033135003b040000027479706500050000006c696e6500046f66667365747300d90300000330001d0000000164780000000000fe595440016479000000000040073a40000331001d00000001647800000000001035544001647900000000008c8a3a40000332001d00000001647800000000006ff453400164790000000000a87c3b40000333001d000000016478000000000069b8534001647900000000008a7f3c40000334001d0000000164780000000000dd65534001647900000000008ce73d40000335001d0000000164780000000000dded5240016479000000000008d73f40000336001d0000000164780000000000266352400164790000000000ca104140000337001d00000001647800000000002cd251400164790000000000f6464240000338001d0000000164780000000000362e51400164790000000000e8b34340000339001d0000000164780000000000776b504001647900000000009e78454000033130001d000000016478000000000034874f40016479000000000074fe464000033131001d000000016478000000000088b14e40016479000000000078ec474000033132001d000000016478000000000098154e400164790000000000667e484000033133001d0000000164780000000000d2824d400164790000000000c2f2484000033134001d0000000164780000000000b2a94c4001647900000000005ead494000033135001d0000000164780000000000168d4b40016479000000000024cc4a4000033136001d0000000164780000000000247e4a40016479000000000016054c4000033137001d0000000164780000000000e0b2494001647900000000008c024d4000033138001d0000000164780000000000ec13494001647900000000007abf4d4000033139001d0000000164780000000000409e48400164790000000000e5564e4000033230001d0000000164780000000000a8574840016479000000000027c84e4000033231001d0000000164780000000000ae13484001647900000000004e2b4f4000033232001d000000016478000000000078bf47400164790000000000268a4f4000033233001d000000016478000000000006694740016479000000000036d64f4000033234001d00000001647800000000004209474001647900000000000c18504000033235001d0000000164780000000000e88c46400164790000000000e755504000033236001d000000016478000000000056e345400164790000000000cba2504000033237001d00000001647800000000007e3f45400164790000000000a1e0504000033238001d00000001647800000000003ae7444001647900000000008cfc504000033239001d000000016478000000000046ca44400164790000000080ff0651400000126c696e65436f6c6f720050af4cff00000000016c696e655374726f6b65546869636b6e657373000000000000001c40016c696e654f70616369747900000000000000f03f00033136000008000002747970650007000000636972636c6500046f66667365747300960700000330001d00000001647800000000802d96704001647900000000000db36140000331001d00000001647800000000007297704001647900000000801eb86140000332001d0000000164780000000040919b704001647900000000009cc86140000333001d000000016478000000000088aa70400164790000000040e3fc6140000334001d0000000164780000000000ffcb70400164790000000040e2576240000335001d00000001647800000000c0dcfa7040016479000000000073d06240000336001d00000001647800000000c0123371400164790000000040df686340000337001d0000000164780000000080cb7971400164790000000040e21f6440000338001d0000000164780000000040b9cd7140016479000000000039e96440000339001d0000000164780000000080f214724001647900000000804288654000033130001d00000001647800000000c0364d724001647900000000c028fc654000033131001d0000000164780000000000a883724001647900000000007964664000033132001d000000016478000000008068a8724001647900000000805ba8664000033133001d0000000164780000000000cdb8724001647900000000001dc7664000033134001d00000001647800000000c064c172400164790000000080b9dc664000033135001d000000016478000000008003ca72400164790000000000c9f3664000033136001d00000001647800000000802fd2724001647900000000802407674000033137001d000000016478000000004049d6724001647900000000806913674000033138001d000000016478000000000085d9724001647900000000805820674000033139001d00000001647800000000005cdf724001647900000000808d3b674000033230001d00000001647800000000c05cec724001647900000000404270674000033231001d00000001647800000000c077fd724001647900000000c037ad674000033232001d0000000164780000000080150e734001647900000000006ae5674000033233001d0000000164780000000080af1c734001647900000000002013684000033234001d00000001647800000000406725734001647900000000c03b2e684000033235001d00000001647800000000409d2973400164790000000080f33b684000033236001d00000001647800000000c0f42a734001647900000000003b40684000033237001d00000001647800000000c01b2c73400164790000000080dd45684000033238001d00000001647800000000000a2f734001647900000000402a53684000033239001d00000001647800000000005a32734001647900000000802564684000033330001d00000001647800000000c03c3773400164790000000000207e684000033331001d0000000164780000000000153d73400164790000000000689b684000033332001d00000001647800000000c0434473400164790000000040dbb7684000033333001d00000001647800000000007a527340016479000000000048e7684000033334001d0000000164780000000080b760734001647900000000807013694000033335001d00000001647800000000c0ed71734001647900000000000b41694000033336001d0000000164780000000000bc92734001647900000000004090694000033337001d00000001647800000000407bbf73400164790000000000a00b6a4000033338001d00000001647800000000402aeb73400164790000000000e7a06a4000033339001d0000000164780000000000d807744001647900000000000b226b4000033430001d0000000164780000000000261674400164790000000080568b6b4000033431001d0000000164780000000000561c74400164790000000000f5d16b4000033432001d00000001647800000000802b1e744001647900000000004aec6b4000033433001d0000000164780000000080e71e744001647900000000001df46b4000033434001d00000001647800000000800e1f744001647900000000800efb6b4000033435001d00000001647800000000800e1f74400164790000000080f3056c4000033436001d00000001647800000000800e1f744001647900000000008d176c4000033437001d00000001647800000000800e1f7440016479000000000043396c4000033438001d00000001647800000000c0432074400164790000000000fb666c4000033439001d00000001647800000000800a2274400164790000000080b7886c4000033530001d00000001647800000000409c2274400164790000000000a0946c4000033531001d00000001647800000000409c2274400164790000000000c6966c4000033532001d00000001647800000000409c227440016479000000008025996c4000033533001d00000001647800000000008123744001647900000000809ea36c4000033534001d0000000164780000000040b7267440016479000000008041bb6c4000033535001d0000000164780000000080462c7440016479000000008026d96c4000033536001d0000000164780000000040b131744001647900000000005bf06c4000033537001d00000001647800000000004e35744001647900000000004cfd6c4000033538001d00000001647800000000c0743774400164790000000000c0036d40000012636972636c65436f6c6f7200f39621ff0000000001636972636c655374726f6b65546869636b6e657373000000000000001c4001636972636c654f706163697479007a0b1def7a75e13f0003313700e003000002747970650007000000636972636c6500046f66667365747300760300000330001d0000000164780000000080cfe3714001647900000000005a736140000331001d0000000164780000000080cfe371400164790000000040c5736140000332001d0000000164780000000080cfe3714001647900000000c05c766140000333001d000000016478000000004013e371400164790000000080b47a6140000334001d000000016478000000000057e27140016479000000004061866140000335001d00000001647800000000408ae471400164790000000000e4ad6140000336001d00000001647800000000c0eaf1714001647900000000802afd6140000337001d0000000164780000000040e60b72400164790000000080fb5d6240000338001d0000000164780000000040b12d724001647900000000c0dac46240000339001d00000001647800000000c05d5972400164790000000000e636634000033130001d0000000164780000000080187e72400164790000000000b68b634000033131001d00000001647800000000c021a972400164790000000080ece9634000033132001d000000016478000000008085d572400164790000000000344f644000033133001d00000001647800000000c06cf0724001647900000000003194644000033134001d00000001647800000000c0f40d73400164790000000000e8e3644000033135001d00000001647800000000802631734001647900000000007842654000033136001d00000001647800000000805b52734001647900000000803799654000033137001d0000000164780000000000b2647340016479000000004032cb654000033138001d0000000164780000000000ba6d73400164790000000080a4e6654000033139001d00000001647800000000002e77734001647900000000803d04664000033230001d00000001647800000000003186734001647900000000803c36664000033231001d00000001647800000000002496734001647900000000800070664000033232001d00000001647800000000402ca073400164790000000000dd97664000033233001d000000016478000000000089aa7340016479000000000002bc664000033234001d000000016478000000000017b973400164790000000080eaec664000033235001d00000001647800000000c076cd73400164790000000080482c674000033236001d000000016478000000004078dd73400164790000000000c2596740000012636972636c65436f6c6f7200f39621ff0000000001636972636c655374726f6b65546869636b6e657373000000000000001c4001636972636c654f706163697479007a0b1def7a75e13f00033138007502000002747970650007000000636972636c6500046f666673657473000b0200000330001d000000016478000000000060f6654001647900000000000eb62940000331001d000000016478000000000060f66540016479000000000030d62940000332001d000000016478000000000060f665400164790000000000c0552a40000333001d0000000164780000000000220d66400164790000000000fcc52c40000334001d0000000164780000000000a95666400164790000000000c60d3140000335001d0000000164780000000000d4c166400164790000000000ec2f3440000336001d00000001647800000000001d3d674001647900000000006c673740000337001d000000016478000000000042bb67400164790000000000f4993a40000338001d000000016478000000008067326840016479000000000004843d40000339001d00000001647800000000005e9468400164790000000000d0d73f4000033130001d0000000164780000000080ced2684001647900000000007ca9404000033131001d000000016478000000008061f0684001647900000000001c00414000033132001d000000016478000000008095f568400164790000000000da10414000033133001d000000016478000000008005f9684001647900000000005e2a414000033134001d00000001647800000000001e02694001647900000000001455414000033135001d0000000164780000000080710a6940016479000000000063764140000012636972636c65436f6c6f7200f39621ff0000000001636972636c655374726f6b65546869636b6e657373000000000000001c4001636972636c654f706163697479007a0b1def7a75e13f0003313900f101000002747970650007000000636972636c6500046f66667365747300870100000330001d000000016478000000006028a761400164790000000000772a3f40000331001d000000016478000000000092b7614001647900000000002cbe3f40000332001d000000016478000000000038dc61400164790000000000ea7b4040000333001d0000000164780000000080380c62400164790000000000d84b4140000334001d00000001647800000000805d5062400164790000000000e85b4240000335001d000000016478000000008058c362400164790000000000c0b84340000336001d0000000164780000000080e04863400164790000000000e2044540000337001d000000016478000000000026ab63400164790000000000fce94540000338001d000000016478000000008055ea6340016479000000000090914640000339001d0000000164780000000080871064400164790000000000d708474000033130001d0000000164780000000000da2a64400164790000000000e963474000033131001d0000000164780000000080ff396440016479000000000062934740000012636972636c65436f6c6f7200f39621ff0000000001636972636c655374726f6b65546869636b6e657373000000000000001c4001636972636c654f706163697479007a0b1def7a75e13f0003323000400400000274797065000a00000072656374616e676c6500046f66667365747300d90300000330001d0000000164780000000000d5d43740016479000000008004b66a40000331001d000000016478000000000028d9374001647900000000000aba6a40000332001d000000016478000000000024293840016479000000000016c46a40000333001d0000000164780000000000e0e43940016479000000008026e96a40000334001d000000016478000000000034d73d40016479000000008016376b40000335001d000000016478000000000034b741400164790000000000cb9b6b40000336001d0000000164780000000000d80c454001647900000000806efe6b40000337001d00000001647800000000007c02494001647900000000808e676c40000338001d000000016478000000000028c14c4001647900000000000fc36c40000339001d000000016478000000000020784f400164790000000080f0fc6c4000033130001d0000000164780000000000e6c6504001647900000000003a256d4000033131001d00000001647800000000001898514001647900000000800c416d4000033132001d0000000164780000000000803e524001647900000000005a546d4000033133001d00000001647800000000008ed752400164790000000000db626d4000033134001d0000000164780000000000d26d5340016479000000008065716d4000033135001d00000001647800000000009bfe534001647900000000803c7f6d4000033136001d00000001647800000000002b7854400164790000000000ef886d4000033137001d0000000164780000000000e8ff5440016479000000008052936d4000033138001d0000000164780000000000ef9355400164790000000000caa06d4000033139001d0000000164780000000000e40f5640016479000000000073ae6d4000033230001d0000000164780000000000646d5640016479000000000028b96d4000033231001d0000000164780000000000feac5640016479000000008082bf6d4000033232001d000000016478000000000071e55640016479000000008098c56d4000033233001d00000001647800000000009715574001647900000000002bca6d4000033234001d00000001647800000000001439574001647900000000806acc6d4000033235001d0000000164780000000000024b57400164790000000000e3cd6d4000033236001d0000000164780000000000065157400164790000000000e3cd6d4000033237001d0000000164780000000000ea5a57400164790000000000e3cd6d4000033238001d0000000164780000000000836d57400164790000000000e3cd6d4000033239001d0000000164780000000000267b57400164790000000000e3cd6d400000126c696e65436f6c6f7200000000ff00000000016c696e655374726f6b65546869636b6e65737300000000000000f03f016c696e654f70616369747900000000000000f03f0003323100060500000274797065000a00000072656374616e676c6500046f666673657473009f0400000330001d0000000164780000000000216d49400164790000000000e8ef6640000331001d0000000164780000000000206d4940016479000000004060f16640000332001d0000000164780000000000087249400164790000000080d8f26640000333001d0000000164780000000000e877494001647900000000002af46640000334001d0000000164780000000000448549400164790000000040baf86640000335001d0000000164780000000000a4e249400164790000000080bb0c6740000336001d0000000164780000000000725b4b400164790000000080924d6740000337001d000000016478000000000038b94e400164790000000000d7ce6740000338001d00000001647800000000004ac651400164790000000040216c6840000339001d00000001647800000000004c8a544001647900000000809cfc684000033130001d0000000164780000000000be0a57400164790000000000796c694000033131001d000000016478000000000096765840016479000000000055a9694000033132001d00000001647800000000000419594001647900000000403ec9694000033133001d000000016478000000000046875940016479000000008086e5694000033134001d00000001647800000000001bd459400164790000000080a7ff694000033135001d0000000164780000000000e91f5a40016479000000008095196a4000033136001d0000000164780000000000977a5a40016479000000008070356a4000033137001d00000001647800000000003adf5a400164790000000000e74e6a4000033138001d0000000164780000000000f0415b40016479000000000058656a4000033139001d0000000164780000000000a1a05b400164790000000080e4816a4000033230001d000000016478000000000068215c4001647900000000009cb06a4000033231001d0000000164780000000000ffd65c400164790000000000d2f06a4000033232001d000000016478000000000074b95d4001647900000000006a366b4000033233001d0000000164780000000000085f5e4001647900000000008b636b4000033234001d000000016478000000000099955e40016479000000000084706b4000033235001d0000000164780000000000b5a55e400164790000000000ab746b4000033236001d000000016478000000000075b55e400164790000000000357d6b4000033237001d0000000164780000000000a6df5e40016479000000000005926b4000033238001d000000016478000000000006385f4001647900000000802bb96b4000033239001d00000001647800000000005dad5f40016479000000000004ee6b4000033330001d0000000164780000000080d90360400164790000000000c11b6c4000033331001d0000000164780000000000dd1c60400164790000000080ad3a6c4000033332001d00000001647800000000805929604001647900000000002a4a6c4000033333001d0000000164780000000080d32c60400164790000000080ff4d6c4000033334001d00000001647800000000803d2e6040016479000000008061506c4000033335001d0000000164780000000000b62f6040016479000000000052536c400000126c696e65436f6c6f7200000000ff00000000016c696e655374726f6b65546869636b6e65737300000000000000f03f016c696e654f70616369747900000000000000f03f0003323200bf03000002747970650007000000636972636c6500046f66667365747300550300000330001d00000001647800000000c01a427240016479000000004057d46740000331001d00000001647800000000c01a4272400164790000000080cfd56740000332001d00000001647800000000c01a427240016479000000004093da6740000333001d00000001647800000000809244724001647900000000c064e56740000334001d00000001647800000000c06754724001647900000000809a026840000335001d00000001647800000000800e8772400164790000000040984b6840000336001d0000000164780000000040bff1724001647900000000c0e2d96840000337001d00000001647800000000c0138473400164790000000080cd976940000338001d00000001647800000000c0b6047440016479000000008036376a40000339001d00000001647800000000803a697440016479000000000029ae6a4000033130001d000000016478000000008025bb74400164790000000000090f6b4000033131001d00000001647800000000c0a4e57440016479000000008075416b4000033132001d000000016478000000004053f17440016479000000000045516b4000033133001d0000000164780000000000acf37440016479000000000028556b4000033134001d000000016478000000004074f4744001647900000000805c566b4000033135001d00000001647800000000c010f7744001647900000000000e5d6b4000033136001d0000000164780000000080fdfa74400164790000000000bc666b4000033137001d00000001647800000000401ffe74400164790000000000ce6b6b4000033138001d000000016478000000008090ff74400164790000000000216f6b4000033139001d0000000164780000000040ae027540016479000000008006786b4000033230001d00000001647800000000c0160d75400164790000000000bd8f6b4000033231001d0000000164780000000000ca197540016479000000000014ac6b4000033232001d00000001647800000000003b1f754001647900000000006fb86b4000033233001d00000001647800000000c09f1f7540016479000000000015bb6b4000033234001d00000001647800000000c09f1f754001647900000000006dbb6b4000033235001d00000001647800000000c09f1f75400164790000000080f4b96b40000012636972636c65436f6c6f7200f39621ff0000000001636972636c655374726f6b65546869636b6e657373000000000000001c4001636972636c654f70616369747900000000000000f03f000332330095070000027479706500050000006c696e6500046f66667365747300330700000330001d00000001647800000000207140664001647900000000008b926f40000331001d0000000164780000000000714066400164790000000080308b6f40000332001d0000000164780000000080434466400164790000000000eb7a6f40000333001d00000001647800000000006d5f66400164790000000000ae516f40000334001d0000000164780000000080feac66400164790000000000f5e26e40000335001d0000000164780000000000622d6740016479000000000059296e40000336001d00000001647800000000004cb867400164790000000000cc676d40000337001d00000001647800000000007aba68400164790000000080bc206c40000338001d000000016478000000008099326a4001647900000000005d3f6a40000339001d00000001647800000000808a516b40016479000000000080aa684000033130001d00000001647800000000002b2a6c400164790000000000f465674000033131001d00000001647800000000800fed6c400164790000000040f759664000033132001d00000001647800000000803b836d400164790000000000fe99654000033133001d0000000164780000000080d20c6e4001647900000000801ee2644000033134001d00000001647800000000000c896e4001647900000000808b3b644000033135001d00000001647800000000007dfb6e4001647900000000c09bbc634000033136001d0000000164780000000080f77a6f4001647900000000c0003c634000033137001d0000000164780000000000d606704001647900000000c0ee9b624000033138001d00000001647800000000c0cc4f7040016479000000008050ef614000033139001d00000001647800000000805188704001647900000000c0966f614000033230001d000000016478000000000098b8704001647900000000c0930e614000033231001d00000001647800000000405ce270400164790000000080dfb8604000033232001d0000000164780000000000fbfe70400164790000000080eb7d604000033233001d00000001647800000000c0c01a71400164790000000000ce42604000033234001d00000001647800000000001d3f7140016479000000008078e65f4000033235001d00000001647800000000c0356b714001647900000000008c325f4000033236001d00000001647800000000c0099771400164790000000000d98d5e4000033237001d0000000164780000000040e5c271400164790000000080aaf45d4000033238001d0000000164780000000000eaec71400164790000000000b6685d4000033239001d0000000164780000000000220e724001647900000000002e025d4000033330001d00000001647800000000c0da37724001647900000000805b945c4000033331001d00000001647800000000c0896f72400164790000000080840b5c4000033332001d00000001647800000000c05baa72400164790000000000a0855b4000033333001d00000001647800000000c072e072400164790000000000c4195b4000033334001d00000001647800000000c0730f7340016479000000008066cc5a4000033335001d00000001647800000000008135734001647900000000003b935a4000033336001d0000000164780000000080d8537340016479000000000076605a4000033337001d00000001647800000000c04a7d73400164790000000080a4255a4000033338001d00000001647800000000803db17340016479000000000038ed594000033339001d000000016478000000000024dd73400164790000000000cfbf594000033430001d000000016478000000000072fc734001647900000000005c98594000033431001d0000000164780000000040c20e74400164790000000000527e594000033432001d00000001647800000000c0c41f744001647900000000008d70594000033433001d0000000164780000000040022e74400164790000000000f168594000033434001d00000001647800000000408931744001647900000000803d65594000033435001d0000000164780000000040d134744001647900000000002660594000033436001d0000000164780000000000573974400164790000000000915c594000033437001d00000001647800000000c0f33f74400164790000000000ce56594000033438001d0000000164780000000040b34a74400164790000000000004e594000033439001d00000001647800000000805957744001647900000000802943594000033530001d0000000164780000000080e16274400164790000000000d737594000033531001d00000001647800000000001d6c744001647900000000801331594000033532001d0000000164780000000000a67174400164790000000000232e594000033533001d0000000164780000000080d374744001647900000000004a2b594000033534001d0000000164780000000080f279744001647900000000807722594000033535001d00000001647800000000403d7e744001647900000000805a1b59400000126c696e65436f6c6f720050af4cff00000000016c696e655374726f6b65546869636b6e657373000000000000001c40016c696e654f70616369747900083aa3f1e5dfde3f000332340012030000027479706500050000006c696e6500046f66667365747300b00200000330001d00000001647800000000e097396d4001647900000000006a0e6f40000331001d000000016478000000000085426d4001647900000000007d056f40000332001d000000016478000000008089526d4001647900000000807ff76e40000333001d0000000164780000000080b68c6d40016479000000008054c66e40000334001d000000016478000000000090466e400164790000000080121a6e40000335001d000000016478000000000008706f40016479000000008035e46c40000336001d000000016478000000004043787040016479000000000005636b40000337001d000000016478000000000075447140016479000000008068fc6940000338001d0000000164780000000040e8e371400164790000000000bd016940000339001d0000000164780000000040f98f72400164790000000040a502684000033130001d0000000164780000000080d65073400164790000000000a6d4664000033131001d000000016478000000008097007440016479000000008069a0654000033132001d00000001647800000000005e8e74400164790000000000be94644000033133001d00000001647800000000c07bf27440016479000000008046da634000033134001d0000000164780000000080d430754001647900000000804864634000033135001d0000000164780000000040914d754001647900000000808f23634000033136001d00000001647800000000c0e35e75400164790000000040d3fa624000033137001d00000001647800000000c0bb7075400164790000000080b7d6624000033138001d0000000164780000000040be847540016479000000000065b0624000033139001d0000000164780000000080fc91754001647900000000406596624000033230001d00000001647800000000801b9575400164790000000080e08f62400000126c696e65436f6c6f720050af4cff00000000016c696e655374726f6b65546869636b6e657373000000000000001c40016c696e654f70616369747900083aa3f1e5dfde3f00033235000a020000027479706500050000006c696e6500046f66667365747300a80100000330001d0000000164780000000020059973400164790000000000a6816d40000331001d00000001647800000000c0c69873400164790000000000ac806d40000332001d00000001647800000000800a9873400164790000000080fa786d40000333001d000000016478000000008007a0734001647900000000801b4a6d40000334001d0000000164780000000040e9c173400164790000000000ecc96c40000335001d00000001647800000000009b0574400164790000000080380b6c40000336001d00000001647800000000401e757440016479000000008087116b40000337001d0000000164780000000000c9f87440016479000000008056016a40000338001d0000000164780000000040577475400164790000000040cb0a6940000339001d000000016478000000008064d4754001647900000000401044684000033130001d0000000164780000000000760c7640016479000000008073cb674000033131001d00000001647800000000c07f2676400164790000000080c295674000033132001d00000001647800000000800a2c76400164790000000080538b67400000126c696e65436f6c6f720050af4cff00000000016c696e655374726f6b65546869636b6e657373000000000000001c40016c696e654f70616369747900083aa3f1e5dfde3f0003323600160500000274797065000700000065726173657200046f66667365747300e10400000330001d00000001647800000000a092cf7040016479000000000020846340000331001d00000001647800000000c092cf7040016479000000000084856340000332001d00000001647800000000802cd1704001647900000000801f8a6340000333001d00000001647800000000c06cd8704001647900000000003c976340000334001d00000001647800000000006fe870400164790000000080dfb16340000335001d00000001647800000000807a06714001647900000000008edb6340000336001d0000000164780000000000b83471400164790000000040b2146440000337001d00000001647800000000c06273714001647900000000c0e1546440000338001d00000001647800000000c0f3b271400164790000000000ab926440000339001d000000016478000000004089e6714001647900000000807ed0644000033130001d0000000164780000000000870b72400164790000000000ab01654000033131001d00000001647800000000c0cc25724001647900000000002d24654000033132001d0000000164780000000040b943724001647900000000001c4a654000033133001d00000001647800000000803d6472400164790000000080d871654000033134001d00000001647800000000c0fe85724001647900000000805097654000033135001d000000016478000000008083a87240016479000000000052bd654000033136001d00000001647800000000c032ce7240016479000000000061e8654000033137001d00000001647800000000c070f2724001647900000000c0f413664000033138001d0000000164780000000080ab0e734001647900000000006039664000033139001d00000001647800000000801032734001647900000000803967664000033230001d000000016478000000008052617340016479000000000001a2664000033231001d00000001647800000000c01d8e7340016479000000008055dc664000033232001d00000001647800000000806eb3734001647900000000c04813674000033233001d0000000164780000000040b2d4734001647900000000c0d644674000033234001d00000001647800000000c0edf473400164790000000040c575674000033235001d0000000164780000000080471174400164790000000000b7a2674000033236001d0000000164780000000040822574400164790000000000ebc0674000033237001d00000001647800000000003e447440016479000000004093eb674000033238001d00000001647800000000802c7074400164790000000040d629684000033239001d0000000164780000000040f396744001647900000000803161684000033330001d000000016478000000004091b3744001647900000000008f88684000033331001d00000001647800000000c099cc7440016479000000000062a9684000033332001d0000000164780000000000b3e774400164790000000000d2d0684000033333001d000000016478000000000006fe7440016479000000000020f3684000033334001d00000001647800000000408c10754001647900000000400a0d694000033335001d00000001647800000000808532754001647900000000802c38694000033336001d00000001647800000000c0497c75400164790000000080be8a694000033337001d0000000164780000000040e0d175400164790000000000a5e2694000000165726173657252616469757300000000000000244000033237001f0200000274797065000700000065726173657200046f66667365747300ea0100000330001d00000001647800000000603228704001647900000000009cbf6840000331001d0000000164780000000080ee28704001647900000000009cbf6840000332001d0000000164780000000040c829704001647900000000000cbe6840000333001d00000001647800000000c0962e7040016479000000000060b76840000334001d00000001647800000000404837704001647900000000c0b9ab6840000335001d0000000164780000000080414170400164790000000080809e6840000336001d0000000164780000000080db4a704001647900000000c0ed8f6840000337001d00000001647800000000401f537040016479000000000002856840000338001d00000001647800000000c07d5e7040016479000000008091786840000339001d00000001647800000000c0256a704001647900000000c05f68684000033130001d0000000164780000000080627070400164790000000080a45d684000033131001d0000000164780000000000b371704001647900000000008b59684000033132001d00000001647800000000806a72704001647900000000c0d25a684000033133001d00000001647800000000c02a7270400164790000000080bf5e684000033134001d00000001647800000000c0536170400164790000000080026d684000000165726173657252616469757300000000000000244000033238008f00000002747970650007000000636972636c6500046f66667365747300250000000330001d000000016478002fbae8a24bcb7440016479005c74d14517283a40000012636972636c65436f6c6f7200000000ff0000000001636972636c655374726f6b65546869636b6e65737300000000000000f03f01636972636c654f70616369747900000000000000f03f0000', +); diff --git a/example/pubspec.lock b/example/pubspec.lock index 0d6a8e8..4c3eb6a 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -25,6 +25,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.2" + bson: + dependency: "direct main" + description: + name: bson + sha256: f8c80be7a62a88f4add7c48cc83567c36a77532de107224df8328ef71f125045 + url: "https://pub.dev" + source: hosted + version: "5.0.7" characters: dependency: transitive description: @@ -57,6 +65,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.2" + crypto: + dependency: transitive + description: + name: crypto + sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" + url: "https://pub.dev" + source: hosted + version: "3.0.6" cupertino_icons: dependency: "direct main" description: @@ -65,14 +81,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.8" + decimal: + dependency: transitive + description: + name: decimal + sha256: fc706a5618b81e5b367b01dd62621def37abc096f2b46a9bd9068b64c1fa36d0 + url: "https://pub.dev" + source: hosted + version: "3.2.4" fake_async: dependency: transitive description: name: fake_async - sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" url: "https://pub.dev" source: hosted - version: "1.3.2" + version: "1.3.3" file: dependency: transitive description: @@ -81,6 +105,14 @@ packages: url: "https://pub.dev" source: hosted version: "7.0.1" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be + url: "https://pub.dev" + source: hosted + version: "1.1.1" flutter: dependency: "direct main" description: flutter @@ -130,6 +162,14 @@ packages: description: flutter source: sdk version: "0.0.0" + intl: + dependency: transitive + description: + name: intl + sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" + url: "https://pub.dev" + source: hosted + version: "0.20.2" jovial_misc: dependency: transitive description: @@ -150,26 +190,26 @@ packages: dependency: transitive description: name: leak_tracker - sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec + sha256: "8dcda04c3fc16c14f48a7bb586d4be1f0d1572731b6d81d51772ef47c02081e0" url: "https://pub.dev" source: hosted - version: "10.0.8" + version: "11.0.1" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" url: "https://pub.dev" source: hosted - version: "3.0.9" + version: "3.0.10" leak_tracker_testing: dependency: transitive description: name: leak_tracker_testing - sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.2" lints: dependency: transitive description: @@ -202,6 +242,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.16.0" + packages_extensions: + dependency: transitive + description: + name: packages_extensions + sha256: "1fb328695a9828c80d275ce1650a2bb5947690070de082dfa1dfac7429378daf" + url: "https://pub.dev" + source: hosted + version: "0.1.1" path: dependency: transitive description: @@ -226,6 +274,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.6" + power_extensions: + dependency: transitive + description: + name: power_extensions + sha256: ad0e8b2420090d996fe8b7fd32cdf02b9b924b6d4fc0fb0b559ff6aa5e24d5b0 + url: "https://pub.dev" + source: hosted + version: "0.2.3" process: dependency: transitive description: @@ -234,13 +290,21 @@ packages: url: "https://pub.dev" source: hosted version: "5.0.3" + rational: + dependency: transitive + description: + name: rational + sha256: cb808fb6f1a839e6fc5f7d8cb3b0a10e1db48b3be102de73938c627f0b636336 + url: "https://pub.dev" + source: hosted + version: "2.2.3" sketch_flow: dependency: "direct main" description: path: ".." relative: true source: path - version: "1.0.0" + version: "1.0.0+2" sky_engine: dependency: transitive description: flutter @@ -254,6 +318,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.10.1" + sprintf: + dependency: transitive + description: + name: sprintf + sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" + url: "https://pub.dev" + source: hosted + version: "7.0.0" stack_trace: dependency: transitive description: @@ -298,10 +370,10 @@ packages: dependency: transitive description: name: test_api - sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd + sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00" url: "https://pub.dev" source: hosted - version: "0.7.4" + version: "0.7.6" typed_data: dependency: transitive description: @@ -310,14 +382,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.0" + uuid: + dependency: transitive + description: + name: uuid + sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff + url: "https://pub.dev" + source: hosted + version: "4.5.1" vector_math: dependency: transitive description: name: vector_math - sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.2.0" vm_service: dependency: transitive description: @@ -351,5 +431,5 @@ packages: source: hosted version: "6.5.0" sdks: - dart: ">=3.7.2 <4.0.0" + dart: ">=3.8.0-0 <4.0.0" flutter: ">=3.27.0" diff --git a/example/pubspec.yaml b/example/pubspec.yaml index 2c31705..ae6bd2b 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -33,6 +33,7 @@ dependencies: sketch_flow: path: ../ jovial_svg: ^1.1.25 + bson: ^5.0.7 # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. diff --git a/lib/src/controller/sketch_controller.dart b/lib/src/controller/sketch_controller.dart index 0624b43..aa4b7f3 100644 --- a/lib/src/controller/sketch_controller.dart +++ b/lib/src/controller/sketch_controller.dart @@ -1,4 +1,5 @@ import 'dart:typed_data'; +import 'package:bson/bson.dart'; import 'package:flutter/material.dart'; import 'package:sketch_flow/sketch_flow.dart'; @@ -191,6 +192,27 @@ class SketchController extends ChangeNotifier { notifyListeners(); } + BsonBinary toBson() { + return SketchDataConverter.toBson(_contents); + } + + void fromBson({required BsonBinary bson}) { + final data = SketchDataConverter.fromBson(bson); + + _contents + ..clear() + ..addAll(data); + notifyListeners(); + } + + List> fromBsonToJson(BsonBinary bson) { + return SketchDataConverter.fromBsonToJson(bson); + } + + BsonBinary fromJsonToBson({required List> json}) { + return SketchDataConverter.fromJsonToBson(json); + } + Future extractPNG({ required GlobalKey repaintKey, double? pixelRatio, diff --git a/lib/src/helper/dataConverter/sketch_data_converter.dart b/lib/src/helper/dataConverter/sketch_data_converter.dart index 2b3e635..fd6539d 100644 --- a/lib/src/helper/dataConverter/sketch_data_converter.dart +++ b/lib/src/helper/dataConverter/sketch_data_converter.dart @@ -1,4 +1,6 @@ import 'dart:ui'; +import 'package:fixnum/fixnum.dart'; +import 'package:bson/bson.dart'; import 'package:sketch_flow/sketch_model.dart'; /// A utility class responsible for converting sketch data to and from JSON format. @@ -119,4 +121,49 @@ class SketchDataConverter { return result; } + + /// Converts a list of [SketchContent] objects into BSON bytes. + /// + /// Wrapper for [toJson] + static BsonBinary toBson(List contents) { + final jsonList = toJson(contents); + print( + 'Decode: ${BsonCodec.deserialize(BsonBinary.fromHexString('0500000000'))}'); + print('Encode: ${BsonCodec.serialize([{}])}'); + return BsonCodec.serialize(jsonList); + } + + /// Converts BSON bytes into a list of [SketchContent] objects. + static List fromBson(BsonBinary bytes) { + final content = BsonCodec.deserialize(bytes); + + return fromJson(content.entries + .map((e) => _normalizeForJson(e.value) as Map) + .toList()); + } + + /// Converts BSON bytes into a list of JSON maps. + static List> fromBsonToJson(BsonBinary bson) { + final output = BsonCodec.deserialize(bson); + return output.entries + .map((e) => _normalizeForJson(e.value) as Map) + .toList(); + } + + /// Converts a list of JSON maps into BSON bytes. + static BsonBinary fromJsonToBson(List> content) { + return BsonCodec.serialize(content); + } + + /// Recursively normalizes a BSON-decoded object into pure JSON-safe values. + static dynamic _normalizeForJson(dynamic value) { + if (value is Int64) { + return value.toInt(); + } else if (value is Map) { + return value.map((k, v) => MapEntry(k.toString(), _normalizeForJson(v))); + } else if (value is List) { + return value.map(_normalizeForJson).toList(); + } + return value; + } } diff --git a/lib/src/model/content/blank.dart b/lib/src/model/content/blank.dart index cfccb35..ce36715 100644 --- a/lib/src/model/content/blank.dart +++ b/lib/src/model/content/blank.dart @@ -1,4 +1,5 @@ import 'dart:ui'; +import 'package:bson/bson.dart'; import 'package:sketch_flow/sketch_model.dart'; class Blank extends SketchContent { @@ -12,6 +13,12 @@ class Blank extends SketchContent { return {}; } + @override + BsonBinary toBson() { + return BsonBinary.fromHexString('0500000000'); + // Hex string is same as '0x05 0x00 0x00 0x00 0x00' + } + @override String? toSvg() { return null; diff --git a/lib/src/model/content/draw/brush.dart b/lib/src/model/content/draw/brush.dart index 14f9f26..04a8a54 100644 --- a/lib/src/model/content/draw/brush.dart +++ b/lib/src/model/content/draw/brush.dart @@ -1,4 +1,5 @@ import 'dart:ui'; +import 'package:bson/bson.dart'; import 'package:sketch_flow/sketch_model.dart'; class Brush extends SketchContent { @@ -48,6 +49,9 @@ class Brush extends SketchContent { }; } + @override + BsonBinary toBson() => BsonCodec.serialize(toJson()); + @override String? toSvg() { final config = sketchConfig.brushConfig; diff --git a/lib/src/model/content/draw/eraser.dart b/lib/src/model/content/draw/eraser.dart index ae2d91d..61a1748 100644 --- a/lib/src/model/content/draw/eraser.dart +++ b/lib/src/model/content/draw/eraser.dart @@ -1,3 +1,4 @@ +import 'package:bson/bson.dart'; import 'package:flutter/material.dart'; import 'package:sketch_flow/sketch_model.dart'; @@ -41,6 +42,9 @@ class Eraser extends SketchContent { }; } + @override + BsonBinary toBson() => BsonCodec.serialize(toJson()); + @override String? toSvg() { final radius = sketchConfig.eraserRadius; diff --git a/lib/src/model/content/draw/highlighter.dart b/lib/src/model/content/draw/highlighter.dart index 3c609fa..71d2e4d 100644 --- a/lib/src/model/content/draw/highlighter.dart +++ b/lib/src/model/content/draw/highlighter.dart @@ -1,4 +1,5 @@ import 'dart:ui'; +import 'package:bson/bson.dart'; import 'package:sketch_flow/sketch_model.dart'; /// Represents a highlighter tool for drawing semi-transparent strokes. @@ -40,6 +41,9 @@ class Highlighter extends SketchContent { }; } + @override + BsonBinary toBson() => BsonCodec.serialize(toJson()); + @override String? toSvg() { final pathData = StringBuffer(); diff --git a/lib/src/model/content/draw/pencil.dart b/lib/src/model/content/draw/pencil.dart index 8acdc14..f899da7 100644 --- a/lib/src/model/content/draw/pencil.dart +++ b/lib/src/model/content/draw/pencil.dart @@ -1,4 +1,5 @@ import 'dart:ui'; +import 'package:bson/bson.dart'; import 'package:sketch_flow/sketch_model.dart'; /// Represents a pencil tool for freehand drawing. @@ -38,6 +39,9 @@ class Pencil extends SketchContent { }; } + @override + BsonBinary toBson() => BsonCodec.serialize(toJson()); + @override String? toSvg() { final pathData = StringBuffer(); diff --git a/lib/src/model/content/shape/circle.dart b/lib/src/model/content/shape/circle.dart index 79c15f1..894842e 100644 --- a/lib/src/model/content/shape/circle.dart +++ b/lib/src/model/content/shape/circle.dart @@ -1,4 +1,5 @@ import 'dart:ui'; +import 'package:bson/bson.dart'; import 'package:sketch_flow/sketch_model.dart'; /// Represents a circle drawing tool. @@ -49,6 +50,9 @@ class Circle extends SketchContent { 'circleOpacity': sketchConfig.circleConfig.opacity, }; + @override + BsonBinary toBson() => BsonCodec.serialize(toJson()); + @override String? toSvg() { final start = offsets.first; diff --git a/lib/src/model/content/shape/line.dart b/lib/src/model/content/shape/line.dart index 62dec2c..ebb53a4 100644 --- a/lib/src/model/content/shape/line.dart +++ b/lib/src/model/content/shape/line.dart @@ -1,4 +1,5 @@ import 'dart:ui'; +import 'package:bson/bson.dart'; import 'package:sketch_flow/sketch_model.dart'; /// Represents a straight line drawing tool. @@ -35,6 +36,9 @@ class Line extends SketchContent { 'lineOpacity': sketchConfig.lineConfig.opacity, }; + @override + BsonBinary toBson() => BsonCodec.serialize(toJson()); + @override String? toSvg() { final start = offsets.first; diff --git a/lib/src/model/content/shape/rectangle.dart b/lib/src/model/content/shape/rectangle.dart index 36fb122..bdc7686 100644 --- a/lib/src/model/content/shape/rectangle.dart +++ b/lib/src/model/content/shape/rectangle.dart @@ -1,4 +1,5 @@ import 'dart:ui'; +import 'package:bson/bson.dart'; import 'package:sketch_flow/sketch_model.dart'; /// Represents a rectangular shape drawing tool. @@ -40,6 +41,9 @@ class Rectangle extends SketchContent { 'lineOpacity': sketchConfig.rectangleConfig.opacity, }; + @override + BsonBinary toBson() => BsonCodec.serialize(toJson()); + @override String? toSvg() { final start = offsets.first; diff --git a/lib/src/model/content/sketch_content.dart b/lib/src/model/content/sketch_content.dart index 82a678f..2d1ccda 100644 --- a/lib/src/model/content/sketch_content.dart +++ b/lib/src/model/content/sketch_content.dart @@ -1,9 +1,10 @@ import 'dart:ui'; +import 'package:bson/bson.dart'; import 'package:sketch_flow/sketch_model.dart'; /// This class defines a common interface and structure for various types of /// drawing tools and shapes (e.g., pencil, brush, eraser, line, rectangle, etc.). -/// It enforces the implementation of drawing, serialization to JSON, and SVG export. +/// It enforces the implementation of drawing, serialization to JSON, BSON, and SVG export. abstract class SketchContent { /// A list of offset points that define the shape or path of the drawing. final List offsets; @@ -54,6 +55,9 @@ abstract class SketchContent { /// Serializes the content into a JSON-compatible map. Map toJson(); + /// Serializes the content into a BSON binary + BsonBinary toBson(); + /// Converts the content to an SVG string representation. /// /// Returns `null` if the shape does not support SVG export. diff --git a/lib/src/view/topBar/sketch_top_bar.dart b/lib/src/view/topBar/sketch_top_bar.dart index 0871070..3610f3e 100644 --- a/lib/src/view/topBar/sketch_top_bar.dart +++ b/lib/src/view/topBar/sketch_top_bar.dart @@ -41,6 +41,12 @@ class SketchTopBar extends StatelessWidget implements PreferredSizeWidget { /// /// [showJsonDialogIcon] Whether to show the JSON dialog icon (default: false) /// + /// [exportBSONIcon] Export BSON Icon + /// + /// [onClickToBsonButton] Callback function invoked when the BSON button is pressed + /// + /// [showBsonDialogIcon] Whether to show the BSON dialog icon (default: false) + /// /// [exportTestDataIcon] Export test data icon /// /// [showInputTestDataIcon] Whether to show the input test data icon (default: false) @@ -68,6 +74,9 @@ class SketchTopBar extends StatelessWidget implements PreferredSizeWidget { this.exportJSONIcon, this.onClickToJsonButton, this.showJsonDialogIcon, + this.exportBSONIcon, + this.onClickToBsonButton, + this.showBsonDialogIcon, this.exportTestDataIcon, this.showInputTestDataIcon, this.onClickInputTestButton, @@ -99,6 +108,10 @@ class SketchTopBar extends StatelessWidget implements PreferredSizeWidget { final Function()? onClickToJsonButton; final bool? showJsonDialogIcon; + final Widget? exportBSONIcon; + final Function()? onClickToBsonButton; + final bool? showBsonDialogIcon; + final Widget? exportTestDataIcon; final bool? showInputTestDataIcon; final Function()? onClickInputTestButton; @@ -210,6 +223,17 @@ class SketchTopBar extends StatelessWidget implements PreferredSizeWidget { }, ), + /// Button for BSON data debugging + if (showBsonDialogIcon ?? false) + IconButton( + icon: exportBSONIcon ?? Icon(Icons.data_array), + onPressed: () { + if (onClickToBsonButton != null) { + onClickToBsonButton!(); + } + }, + ), + if (showInputTestDataIcon ?? false) IconButton( icon: exportTestDataIcon ?? Icon(Icons.input), diff --git a/pubspec.yaml b/pubspec.yaml index 58f3869..be014e1 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -10,6 +10,7 @@ environment: dependencies: flutter: sdk: flutter + bson: ^5.0.7 dev_dependencies: flutter_test: From 42df8800ab1e7dbbb98ba9c5f79974ccef3cf4df Mon Sep 17 00:00:00 2001 From: RoBoT_095 Date: Fri, 5 Sep 2025 23:58:22 -0400 Subject: [PATCH 2/4] Removed print() from SketchDataConverter --- lib/src/helper/dataConverter/sketch_data_converter.dart | 3 --- 1 file changed, 3 deletions(-) diff --git a/lib/src/helper/dataConverter/sketch_data_converter.dart b/lib/src/helper/dataConverter/sketch_data_converter.dart index fd6539d..92b0806 100644 --- a/lib/src/helper/dataConverter/sketch_data_converter.dart +++ b/lib/src/helper/dataConverter/sketch_data_converter.dart @@ -127,9 +127,6 @@ class SketchDataConverter { /// Wrapper for [toJson] static BsonBinary toBson(List contents) { final jsonList = toJson(contents); - print( - 'Decode: ${BsonCodec.deserialize(BsonBinary.fromHexString('0500000000'))}'); - print('Encode: ${BsonCodec.serialize([{}])}'); return BsonCodec.serialize(jsonList); } From 82b4b103b67b13f0dae396e93f6084bd4e70f734 Mon Sep 17 00:00:00 2001 From: RoBoT_095 Date: Sat, 6 Sep 2025 11:10:45 -0400 Subject: [PATCH 3/4] Converted BsonBinary into List --- README.md | 12 +++++- example/lib/main.dart | 5 +-- example/pubspec.lock | 2 +- example/pubspec.yaml | 1 - lib/src/controller/sketch_controller.dart | 8 ++-- .../dataConverter/sketch_data_converter.dart | 38 +++++++++++-------- 6 files changed, 40 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 09283fc..b4dc1ff 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ Easily build drawing applications with elegant UI and comprehensive export featu - `PNG`: For high-resolution image rendering - `SVG`: For scalable vector graphics - `JSON`: For precise stroke data and replaying paths -- `BSON`: Wrapper for `JSON` that converts it into Bson bytes +- `BSON`: Wrapper for `JSON` that converts it into `List` #### Built-in Stylish UI @@ -122,11 +122,19 @@ _controller.fromJson(json: json); // Deserialization - Used the same way as **JSON**, but it works differently, sketch data is converted into JSON and then into BSON, and vice vera. This isn't a full integration, but is a wrapper to give support for `.bson` files, here is an example of its usage: ```dart -final bson = _controller.toBson(); // Serialization +final List bson = _controller.toBson(); // Serialization _controller.fromBson(bson: bson); // Deserialization ``` +To read bytes from a file: + +```dart +final data = await File(filePath).readAsBytes(); + +_controller.fromBson(bson: data); +``` + There is also `.fromBsonToJson()` and `.fromJsonToBson()` that can be used to migrate/test between different formats without converting it into sketch data first. #### PNG diff --git a/example/lib/main.dart b/example/lib/main.dart index eaf3a0a..d221f22 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -6,7 +6,6 @@ import 'package:example/test_data_bson.dart'; import 'package:flutter/material.dart'; import 'package:jovial_svg/jovial_svg.dart'; -import 'package:bson/bson.dart'; import 'package:sketch_flow/sketch_flow.dart'; void main() { @@ -115,7 +114,7 @@ class _DemoPageState extends State { ); } - void _showBsonDialog({required BsonBinary bson}) { + void _showBsonDialog({required List bson}) { showDialog( context: context, builder: @@ -123,7 +122,7 @@ class _DemoPageState extends State { title: const Text("Sketch BSON Hex"), content: SingleChildScrollView( child: SelectableText( - bson.hexString.toString(), + bson.toString(), style: const TextStyle(fontSize: 12), ), ), diff --git a/example/pubspec.lock b/example/pubspec.lock index 4c3eb6a..4397546 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -26,7 +26,7 @@ packages: source: hosted version: "2.1.2" bson: - dependency: "direct main" + dependency: transitive description: name: bson sha256: f8c80be7a62a88f4add7c48cc83567c36a77532de107224df8328ef71f125045 diff --git a/example/pubspec.yaml b/example/pubspec.yaml index ae6bd2b..2c31705 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -33,7 +33,6 @@ dependencies: sketch_flow: path: ../ jovial_svg: ^1.1.25 - bson: ^5.0.7 # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. diff --git a/lib/src/controller/sketch_controller.dart b/lib/src/controller/sketch_controller.dart index aa4b7f3..a7398c3 100644 --- a/lib/src/controller/sketch_controller.dart +++ b/lib/src/controller/sketch_controller.dart @@ -192,11 +192,11 @@ class SketchController extends ChangeNotifier { notifyListeners(); } - BsonBinary toBson() { + List toBson() { return SketchDataConverter.toBson(_contents); } - void fromBson({required BsonBinary bson}) { + void fromBson({required List bson}) { final data = SketchDataConverter.fromBson(bson); _contents @@ -205,11 +205,11 @@ class SketchController extends ChangeNotifier { notifyListeners(); } - List> fromBsonToJson(BsonBinary bson) { + List> fromBsonToJson(List bson) { return SketchDataConverter.fromBsonToJson(bson); } - BsonBinary fromJsonToBson({required List> json}) { + List fromJsonToBson({required List> json}) { return SketchDataConverter.fromJsonToBson(json); } diff --git a/lib/src/helper/dataConverter/sketch_data_converter.dart b/lib/src/helper/dataConverter/sketch_data_converter.dart index 92b0806..9158c91 100644 --- a/lib/src/helper/dataConverter/sketch_data_converter.dart +++ b/lib/src/helper/dataConverter/sketch_data_converter.dart @@ -125,31 +125,39 @@ class SketchDataConverter { /// Converts a list of [SketchContent] objects into BSON bytes. /// /// Wrapper for [toJson] - static BsonBinary toBson(List contents) { + static List toBson(List contents) { final jsonList = toJson(contents); - return BsonCodec.serialize(jsonList); + return BsonCodec.serialize(jsonList).byteList; } /// Converts BSON bytes into a list of [SketchContent] objects. - static List fromBson(BsonBinary bytes) { - final content = BsonCodec.deserialize(bytes); - - return fromJson(content.entries - .map((e) => _normalizeForJson(e.value) as Map) - .toList()); + static List fromBson(List byteList) { + // If empty, error: corrupt bson message < 5 bytes long + if (byteList.isNotEmpty) { + final content = BsonCodec.deserialize(BsonBinary.from(byteList)); + + return fromJson(content.entries + .map((e) => _normalizeForJson(e.value) as Map) + .toList()); + } + return []; } /// Converts BSON bytes into a list of JSON maps. - static List> fromBsonToJson(BsonBinary bson) { - final output = BsonCodec.deserialize(bson); - return output.entries - .map((e) => _normalizeForJson(e.value) as Map) - .toList(); + static List> fromBsonToJson(List byteList) { + // If empty, error: corrupt bson message < 5 bytes long + if (byteList.isNotEmpty) { + final output = BsonCodec.deserialize(BsonBinary.from(byteList)); + return output.entries + .map((e) => _normalizeForJson(e.value) as Map) + .toList(); + } + return []; } /// Converts a list of JSON maps into BSON bytes. - static BsonBinary fromJsonToBson(List> content) { - return BsonCodec.serialize(content); + static List fromJsonToBson(List> content) { + return BsonCodec.serialize(content).byteList; } /// Recursively normalizes a BSON-decoded object into pure JSON-safe values. From 8a905d802c48f6697e4bb73d911adef949bca5ac Mon Sep 17 00:00:00 2001 From: RoBoT_095 Date: Wed, 8 Oct 2025 23:56:03 -0400 Subject: [PATCH 4/4] Revert "Merge branch 'Fasoo-DigitalPage:main' into main" This reverts commit 7d3c1d7775ce31691cf80eab408ed660a17d4915, reversing changes made to 82b4b103b67b13f0dae396e93f6084bd4e70f734. --- lib/src/view/bottomBar/sketch_bottom_bar.dart | 6 ------ 1 file changed, 6 deletions(-) diff --git a/lib/src/view/bottomBar/sketch_bottom_bar.dart b/lib/src/view/bottomBar/sketch_bottom_bar.dart index a0afdcd..93c4b57 100644 --- a/lib/src/view/bottomBar/sketch_bottom_bar.dart +++ b/lib/src/view/bottomBar/sketch_bottom_bar.dart @@ -54,7 +54,6 @@ class SketchBottomBar extends StatefulWidget { const SketchBottomBar({ super.key, required this.controller, - this.scrollController, this.bottomBarHeight, this.bottomBarColor = Colors.white, this.bottomBarBorderColor = Colors.grey, @@ -81,7 +80,6 @@ class SketchBottomBar extends StatefulWidget { }); final SketchController controller; - final ScrollController? scrollController; final double? bottomBarHeight; final Color bottomBarColor; @@ -121,7 +119,6 @@ class SketchBottomBar extends StatefulWidget { class _SketchBottomBarState extends State with TickerProviderStateMixin { late final _controller = widget.controller; - late ScrollController _scrollController; late AnimationController _fadeAnimationController; late Animation _fadeAnimation; @@ -153,7 +150,6 @@ class _SketchBottomBarState extends State parent: _fadeAnimationController, curve: Curves.easeInOut, ); - _scrollController = widget.scrollController ?? ScrollController(); } @override @@ -173,7 +169,6 @@ class _SketchBottomBarState extends State void dispose() { super.dispose(); _fadeAnimationController.dispose(); - if (widget.scrollController == null) _scrollController.dispose(); } /// Handles tool selection. @@ -341,7 +336,6 @@ class _SketchBottomBarState extends State ), child: Center( child: SingleChildScrollView( - controller: _scrollController, scrollDirection: Axis.horizontal, child: Row( children: [