`) with some modification.
+In addition to "normal" styles, objects can also store local styles. This concept is similar to inline styles in CSS (e.g. `
`) with some modification.
Local styles are like normal styles, but they can't be shared among other objects. If used, local styles are allocated automatically, and freed when the object is deleted.
They are useful to add local customization to an object.
@@ -244,15 +257,15 @@ In the documentation of the widgets you will see sentences like "The widget uses
By default, when an object changes state (e.g. it's pressed) the new properties from the new state are set immediately. However, with transitions it's possible to play an animation on state change.
For example, on pressing a button its background color can be animated to the pressed color over 300 ms.
-The parameters of the transitions are stored in the styles. It's possible to set
+The parameters of the transitions are stored in the styles. It's possible to set
- the time of the transition
-- the delay before starting the transition
+- the delay before starting the transition
- the animation path (also known as the timing or easing function)
-- the properties to animate
+- the properties to animate
-The transition properties can be defined for each state. For example, setting a 500 ms transition time in the default state means that when the object goes to the default state a 500 ms transition time is applied.
+The transition properties can be defined for each state. For example, setting a 500 ms transition time in the default state means that when the object goes to the default state a 500 ms transition time is applied.
Setting a 100 ms transition time in the pressed state causes a 100 ms transition when going to the pressed state.
-This example configuration results in going to the pressed state quickly and then going back to default slowly.
+This example configuration results in going to the pressed state quickly and then going back to default slowly.
To describe a transition an `lv_transition_dsc_t` variable needs to be initialized and added to a style:
```c
@@ -268,6 +281,22 @@ lv_style_transition_dsc_init(&trans1, trans_props, lv_anim_path_ease_out, durati
lv_style_set_transition(&style1, &trans1);
```
+## Opacity, Blend modes and Transformations
+If the `opa`, `blend_mode`, `transform_angle`, or `transform_zoom` properties are set to their non-default value LVGL creates a snapshot about the widget and all its children in order to blend the whole widget with the set opacity, blend mode and transformation properties.
+
+These properties have this effect only on the `MAIN` part of the widget.
+
+The created snapshot is called "intermediate layer" or simply "layer". If only `opa` and/or `blend_mode` is set to a non-default value LVGL can build the layer from smaller chunks. The size of these chunks can be configured by the following properties in `lv_conf.h`:
+ - `LV_LAYER_SIMPLE_BUF_SIZE`: [bytes] the optimal target buffer size. LVGL will try to allocate this size of memory.
+ - `LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE`: [bytes] used if `LV_LAYER_SIMPLE_BUF_SIZE` couldn't be allocated.
+
+If transformation properties were also used the layer can not be rendered in chunks, but one larger memory needs to be allocated. The required memory depends on the angle, zoom and pivot parameters, and the size of the area to redraw, but it's never larger than the size of the widget (including the extra draw size used for shadow, outline, etc).
+
+If the widget can fully cover the area to redraw, LVGL creates an RGB layer (which is faster to render and uses less memory). If the opposite case ARGB rendering needs to be used. A widget might not cover its area if it has radius, `bg_opa != 255`, has shadow, outline, etc.
+
+The click area of the widget is also transformed accordingly.
+
+
## Color filter
TODO
@@ -284,11 +313,11 @@ To set a theme for a display, two steps are required:
Theme initialization functions can have different prototypes. This example shows how to set the "default" theme:
```c
-lv_theme_t * th = lv_theme_default_init(display, /*Use the DPI, size, etc from this display*/
+lv_theme_t * th = lv_theme_default_init(display, /*Use the DPI, size, etc from this display*/
LV_COLOR_PALETTE_BLUE, LV_COLOR_PALETTE_CYAN, /*Primary and secondary palette*/
- false, /*Light or dark mode*/
+ false, /*Light or dark mode*/
&lv_font_montserrat_10, &lv_font_montserrat_14, &lv_font_montserrat_18); /*Small, normal, large fonts*/
-
+
lv_disp_set_theme(display, th); /*Assign the theme to the display*/
```
@@ -297,8 +326,8 @@ The included themes are enabled in `lv_conf.h`. If the default theme is enabled
### Extending themes
-Built-in themes can be extended.
-If a custom theme is created, a parent theme can be selected. The parent theme's styles will be added before the custom theme's styles.
+Built-in themes can be extended.
+If a custom theme is created, a parent theme can be selected. The parent theme's styles will be added before the custom theme's styles.
Any number of themes can be chained this way. E.g. default theme -> custom theme -> dark theme.
`lv_theme_set_parent(new_theme, base_theme)` extends the `base_theme` with the `new_theme`.
@@ -324,9 +353,9 @@ There is an example for it below.
.. doxygenfile:: lv_obj_style_gen.h
:project: lvgl
-
+
.. doxygenfile:: lv_style_gen.h
:project: lvgl
-
+
```
diff --git a/docs/overview/timer.md b/docs/overview/timer.md
index 82ef07d31..ca014c7e3 100644
--- a/docs/overview/timer.md
+++ b/docs/overview/timer.md
@@ -1,11 +1,7 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/overview/timer.md
-```
# Timers
LVGL has a built-in timer system. You can register a function to have it be called periodically. The timers are handled and called in `lv_timer_handler()`, which needs to be called every few milliseconds.
-See [Porting](/porting/task-handler) for more information.
+See [Porting](/porting/timer-handler) for more information.
Timers are non-preemptive, which means a timer cannot interrupt another timer. Therefore, you can call any LVGL related function in a timer.
@@ -52,7 +48,7 @@ You can modify some timer parameters later:
## Repeat count
-You can make a timer repeat only a given number of times with `lv_timer_set_repeat_count(timer, count)`. The timer will automatically be deleted after it's called the defined number of times. Set the count to `-1` to repeat indefinitely.
+You can make a timer repeat only a given number of times with `lv_timer_set_repeat_count(timer, count)`. The timer will automatically be deleted after it's called the defined number of times. Set the count to `-1` to repeat indefinitely.
## Measure idle time
@@ -65,6 +61,7 @@ It can be misleading if you use an operating system and call `lv_timer_handler`
In some cases, you can't perform an action immediately. For example, you can't delete an object because something else is still using it, or you don't want to block the execution now.
For these cases, `lv_async_call(my_function, data_p)` can be used to call `my_function` on the next invocation of `lv_timer_handler`. `data_p` will be passed to the function when it's called.
Note that only the data pointer is saved, so you need to ensure that the variable will be "alive" while the function is called. It can be *static*, global or dynamically allocated data.
+If you want to cancel an asynchronous call, call `lv_async_call_cancel(my_function, data_p)`, which will clear all asynchronous calls matching `my_function` and `data_p`.
For example:
```c
@@ -73,7 +70,7 @@ void my_screen_clean_up(void * scr)
/*Free some resources related to `scr`*/
/*Finally delete the screen*/
- lv_obj_del(scr);
+ lv_obj_del(scr);
}
...
diff --git a/docs/porting/display.md b/docs/porting/display.md
index 63b126451..f06d48d08 100644
--- a/docs/porting/display.md
+++ b/docs/porting/display.md
@@ -1,7 +1,3 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/porting/display.md
-```
# Display interface
To register a display for LVGL, a `lv_disp_draw_buf_t` and a `lv_disp_drv_t` variable have to be initialized.
@@ -10,7 +6,7 @@ To register a display for LVGL, a `lv_disp_draw_buf_t` and a `lv_disp_drv_t` var
## Draw buffer
-Draw buffer(s) are simple array(s) that LVGL uses to render the screen content.
+Draw buffer(s) are simple array(s) that LVGL uses to render the screen content.
Once rendering is ready the content of the draw buffer is sent to the display using the `flush_cb` function set in the display driver (see below).
A draw buffer can be initialized via a `lv_disp_draw_buf_t` variable like this:
@@ -31,35 +27,35 @@ Note that `lv_disp_draw_buf_t` must be a static, global or dynamically allocated
As you can see above, the draw buffer may be smaller than the screen. In this case, larger areas are redrawn in smaller segments that fit into the draw buffer(s).
If only a small area changes (e.g. a button is pressed) then only that area will be refreshed.
-A larger buffer results in better performance but above 1/10 screen sized buffer(s) there is no significant performance improvement.
+A larger buffer results in better performance but above 1/10 screen sized buffer(s) there is no significant performance improvement.
Therefore it's recommended to choose the size of the draw buffer(s) to be at least 1/10 screen sized.
## Buffering modes
There are several settings to adjust the number draw buffers and buffering/refreshing modes.
-You can measure the performance of different configurations using the [benchmark example](https://github.com/lvgl/lv_demos/tree/master/src/lv_demo_benchmark).
+You can measure the performance of different configurations using the [benchmark example](https://github.com/lvgl/lvgl/tree/master/demos/benchmark).
### One buffer
-If only one buffer is used LVGL draws the content of the screen into that draw buffer and sends it to the display.
+If only one buffer is used LVGL draws the content of the screen into that draw buffer and sends it to the display.
LVGL then needs to wait until the content of the buffer is sent to the display before drawing something new in it.
### Two buffers
-If two buffers are used LVGL can draw into one buffer while the content of the other buffer is sent to the display in the background.
+If two buffers are used LVGL can draw into one buffer while the content of the other buffer is sent to the display in the background.
DMA or other hardware should be used to transfer data to the display so the MCU can continue drawing.
-This way, the rendering and refreshing of the display become parallel operations.
+This way, the rendering and refreshing of the display become parallel operations.
### Full refresh
In the display driver (`lv_disp_drv_t`) enabling the `full_refresh` bit will force LVGL to always redraw the whole screen. This works in both *one buffer* and *two buffers* modes.
-If `full_refresh` is enabled and two screen sized draw buffers are provided, LVGL's display handling works like "traditional" double buffering.
+If `full_refresh` is enabled and two screen sized draw buffers are provided, LVGL's display handling works like "traditional" double buffering.
This means the `flush_cb` callback only has to update the address of the framebuffer (`color_p` parameter).
This configuration should be used if the MCU has an LCD controller peripheral and not with an external display controller (e.g. ILI9341 or SSD1963) accessed via serial link. The latter will generally be too slow to maintain high frame rates with full screen redraws.
### Direct mode
-If the `direct_mode` flag is enabled in the display driver LVGL will draw directly into a **screen sized frame buffer**. That is the draw buffer(s) needs to be screen sized.
+If the `direct_mode` flag is enabled in the display driver LVGL will draw directly into a **screen sized frame buffer**. That is the draw buffer(s) needs to be screen sized.
It this case `flush_cb` will be called only once when all dirty areas are redrawn.
-With `direct_mode` the frame buffer always contains the current frame as it should be displayed on the screen.
-If 2 frame buffers are provided as draw buffers LVGL will alter the buffers but always draw only the dirty areas.
+With `direct_mode` the frame buffer always contains the current frame as it should be displayed on the screen.
+If 2 frame buffers are provided as draw buffers LVGL will alter the buffers but always draw only the dirty areas.
Therefore the 2 buffers needs to synchronized in `flush_cb` like this:
1. Display the frame buffer pointed by `color_p`
2. Copy the redrawn areas from `color_p` to the other buffer.
@@ -77,18 +73,18 @@ Once the buffer initialization is ready a `lv_disp_drv_t` display driver needs t
2. its fields need to be set
3. it needs to be registered in LVGL with `lv_disp_drv_register(&disp_drv)`
-Note that `lv_disp_drv_t` also needs to be a static, global or dynamically allocated variable.
+Note that `lv_disp_drv_t` also needs to be a static, global or dynamically allocated variable.
### Mandatory fields
In the most simple case only the following fields of `lv_disp_drv_t` need to be set:
- `draw_buf` pointer to an initialized `lv_disp_draw_buf_t` variable.
-- `hor_res` horizontal resolution of the display in pixels.
+- `hor_res` horizontal resolution of the display in pixels.
- `ver_res` vertical resolution of the display in pixels.
-- `flush_cb` a callback function to copy a buffer's content to a specific area of the display.
-`lv_disp_flush_ready(&disp_drv)` needs to be called when flushing is ready.
+- `flush_cb` a callback function to copy a buffer's content to a specific area of the display.
+`lv_disp_flush_ready(&disp_drv)` needs to be called when flushing is ready.
LVGL might render the screen in multiple chunks and therefore call `flush_cb` multiple times. To see if the current one is the last chunk of rendering use `lv_disp_flush_is_last(&disp_drv)`.
-### Optional fields
+### Optional fields
There are some optional display driver data fields:
- `physical_hor_res` horizontal resolution of the full / physical display in pixels. Only set this when _not_ using the full screen (defaults to -1 / same as `hor_res`).
- `physical_ver_res` vertical resolution of the full / physical display in pixels. Only set this when _not_ using the full screen (defaults to -1 / same as `ver_res`).
@@ -107,8 +103,9 @@ Some other optional callbacks to make it easier and more optimal to work with mo
It can be used if the display controller can refresh only areas with specific height or width (usually 8 px height with monochrome displays).
- `set_px_cb` a custom function to write the draw buffer. It can be used to store the pixels more compactly in the draw buffer if the display has a special color format. (e.g. 1-bit monochrome, 2-bit grayscale etc.)
This way the buffers used in `lv_disp_draw_buf_t` can be smaller to hold only the required number of bits for the given area size. Note that rendering with `set_px_cb` is slower than normal rendering.
-- `monitor_cb` A callback function that tells how many pixels were refreshed and in how much time. Called when the last chunk is rendered and sent to the display.
+- `monitor_cb` A callback function that tells how many pixels were refreshed and in how much time. Called when the last chunk is rendered and sent to the display.
- `clean_dcache_cb` A callback for cleaning any caches related to the display.
+- `render_start_cb` A callback function that notifies the display driver that rendering has started. It also could be used to wait for VSYNC to start rendering. It's useful if rendering is faster than a VSYNC period.
LVGL has built-in support to several GPUs (see `lv_conf.h`) but if something else is required these functions can be used to make LVGL use a GPU:
- `gpu_fill_cb` fill an area in the memory with a color.
@@ -191,13 +188,15 @@ void my_clean_dcache_cb(lv_disp_drv_t * disp_drv, uint32)
}
```
-## Rotation
+## Other options
+
+### Rotation
LVGL supports rotation of the display in 90 degree increments. You can select whether you'd like software rotation or hardware rotation.
If you select software rotation (`sw_rotate` flag set to 1), LVGL will perform the rotation for you. Your driver can and should assume that the screen width and height have not changed. Simply flush pixels to the display as normal. Software rotation requires no additional logic in your `flush_cb` callback.
-There is a noticeable amount of overhead to performing rotation in software. Hardware rotation is available to avoid unwanted slowdowns. In this mode, LVGL draws into the buffer as if your screen width and height were swapped. You are responsible for rotating the provided pixels yourself.
+There is a noticeable amount of overhead to performing rotation in software. Hardware rotation is available to avoid unwanted slowdowns. In this mode, LVGL draws into the buffer as if your screen width and height were swapped. You are responsible for rotating the provided pixels yourself.
The default rotation of your display when it is initialized can be set using the `rotated` flag. The available options are `LV_DISP_ROT_NONE`, `LV_DISP_ROT_90`, `LV_DISP_ROT_180`, or `LV_DISP_ROT_270`. The rotation values are relative to how you would rotate the physical display in the clockwise direction. Thus, `LV_DISP_ROT_90` means you rotate the hardware 90 degrees clockwise, and the display rotates 90 degrees counterclockwise to compensate.
@@ -207,6 +206,27 @@ Display rotation can also be changed at runtime using the `lv_disp_set_rotation(
Support for software rotation is a new feature, so there may be some glitches/bugs depending on your configuration. If you encounter a problem please open an issue on [GitHub](https://github.com/lvgl/lvgl/issues).
+### Decoupling the display refresh timer
+Normally the dirty (a.k.a invalid) areas are checked and redrawn in every `LV_DISP_DEF_REFR_PERIOD` milliseconds (set in `lv_conf.h`).
+However, in some cases you might need more control on when the display refreshing happen, for example to synchronize rendering with VSYNC or the TE signal.
+
+You can do this in the following way:
+```c
+/*Delete the original display refresh timer*/
+lv_timer_del(disp->refr_timer);
+disp->refr_timer = NULL;
+
+
+/*Call this anywhere you want to refresh the dirty areas*/
+_lv_disp_refr_timer(NULL);
+```
+
+If you have multiple displays call `lv_disp_set_deafult(disp1);` to select the display to refresh before `_lv_disp_refr_timer(NULL);`.
+
+Note that `lv_timer_handler()` and `_lv_disp_refr_timer()` can not run at the same time.
+
+If the performance monitor is enabled, the value of `LV_DISP_DEF_REFR_PERIOD` needs to be set to be consistent with the refresh period of the display to ensure that the statistical results are correct.
+
## Further reading
- [lv_port_disp_template.c](https://github.com/lvgl/lvgl/blob/master/examples/porting/lv_port_disp_template.c) for a template for your own driver.
diff --git a/docs/porting/gpu.md b/docs/porting/gpu.md
index 83d0a7565..d09613adf 100644
--- a/docs/porting/gpu.md
+++ b/docs/porting/gpu.md
@@ -1,22 +1,18 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/porting/gpu.md
-```
# Add custom GPU
LVGL has a flexible and extendable draw pipeline. You can hook it to do some rendering with a GPU or even completely replace the built-in software renderer.
## Draw context
-The core structure of drawing is `lv_draw_ctx_t`.
-It contains a pointer to a buffer where drawing should happen and a couple of callbacks to draw rectangles, texts, and other primitives.
+The core structure of drawing is `lv_draw_ctx_t`.
+It contains a pointer to a buffer where drawing should happen and a couple of callbacks to draw rectangles, texts, and other primitives.
### Fields
`lv_draw_ctx_t` has the following fields:
- `void * buf` Pointer to a buffer to draw into
- `lv_area_t * buf_area` The position and size of `buf` (absolute coordinates)
- `const lv_area_t * clip_area` The current clip area with absolute coordinates, always the same or smaller than `buf_area`. All drawings should be clipped to this area.
-- `void (*draw_rect)()` Draw a rectangle with shadow, gradient, border, etc.
+- `void (*draw_rect)()` Draw a rectangle with shadow, gradient, border, etc.
- `void (*draw_arc)()` Draw an arc
-- `void (*draw_img_decoded)()` Draw an (A)RGB image that is already decoded by LVGL.
+- `void (*draw_img_decoded)()` Draw an (A)RGB image that is already decoded by LVGL.
- `lv_res_t (*draw_img)()` Draw an image before decoding it (it bypasses LVGL's internal image decoders)
- `void (*draw_letter)()` Draw a letter
- `void (*draw_line)()` Draw a line
@@ -28,22 +24,22 @@ It contains a pointer to a buffer where drawing should happen and a couple of ca
(For the sake of simplicity the parameters of the callbacks are not shown here.)
All `draw_*` callbacks receive a pointer to the current `draw_ctx` as their first parameter. Among the other parameters there is a descriptor that tells what to draw,
-e.g. for `draw_rect` it's called [lv_draw_rect_dsc_t](https://github.com/lvgl/lvgl/blob/master/src/draw/lv_draw_rect.h),
-for `lv_draw_line` it's called [lv_draw_line_dsc_t](https://github.com/lvgl/lvgl/blob/master/src/draw/lv_draw_line.h), etc.
+e.g. for `draw_rect` it's called [lv_draw_rect_dsc_t](https://github.com/lvgl/lvgl/blob/master/src/draw/lv_draw_rect.h),
+for `lv_draw_line` it's called [lv_draw_line_dsc_t](https://github.com/lvgl/lvgl/blob/master/src/draw/lv_draw_line.h), etc.
To correctly render according to a `draw_dsc` you need to be familiar with the [Boxing model](https://docs.lvgl.io/master/overview/coords.html#boxing-model) of LVGL and the meanings of the fields. The name and meaning of the fields are identical to name and meaning of the [Style properties](https://docs.lvgl.io/master/overview/style-props.html).
### Initialization
The `lv_disp_drv_t` has 4 fields related to the draw context:
-- `lv_draw_ctx_t * draw_ctx` Pointer to the `draw_ctx` of this display
-- `void (*draw_ctx_init)(struct _lv_disp_drv_t * disp_drv, lv_draw_ctx_t * draw_ctx)` Callback to initialize a `draw_ctx`
+- `lv_draw_ctx_t * draw_ctx` Pointer to the `draw_ctx` of this display
+- `void (*draw_ctx_init)(struct _lv_disp_drv_t * disp_drv, lv_draw_ctx_t * draw_ctx)` Callback to initialize a `draw_ctx`
- `void (*draw_ctx_deinit)(struct _lv_disp_drv_t * disp_drv, lv_draw_ctx_t * draw_ctx)` Callback to de-initialize a `draw_ctx`
- `size_t draw_ctx_size` Size of the draw context structure. E.g. `sizeof(lv_draw_sw_ctx_t)`
When you ignore these fields, LVGL will set default values for callbacks and size in `lv_disp_drv_init()` based on the configuration in `lv_conf.h`.
`lv_disp_drv_register()` will allocate a `draw_ctx` based on `draw_ctx_size` and call `draw_ctx_init()` on it.
-However, you can overwrite the callbacks and the size values before calling `lv_disp_drv_register()`.
+However, you can overwrite the callbacks and the size values before calling `lv_disp_drv_register()`.
It makes it possible to use your own `draw_ctx` with your own callbacks.
@@ -67,7 +63,7 @@ draw_sw_ctx->base_draw.draw_letter = lv_draw_sw_letter;
```
### Blend callback
-As you saw above the software renderer adds the `blend` callback field. It's a special callback related to how the software renderer works.
+As you saw above the software renderer adds the `blend` callback field. It's a special callback related to how the software renderer works.
All draw operations end up in the `blend` callback which can either fill an area or copy an image to an area by considering an optional mask.
The `lv_draw_sw_blend_dsc_t` parameter describes what and how to blend. It has the following fields:
@@ -81,11 +77,11 @@ The `lv_draw_sw_blend_dsc_t` parameter describes what and how to blend. It has t
- `lv_blend_mode_t blend_mode` E.g. `LV_BLEND_MODE_ADDITIVE`
-## Extend the software renderer
+## Extend the software renderer
### New blend callback
-Let's take a practical example: you would like to use your MCUs GPU for color fill operations only.
+Let's take a practical example: you would like to use your MCUs GPU for color fill operations only.
As all draw callbacks call `blend` callback to fill an area in the end only the `blend` callback needs to be overwritten.
@@ -142,10 +138,10 @@ void my_draw_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc)
/*Make the blend area relative to the buffer*/
lv_area_move(&blend_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1);
-
+
/*Call your custom gou fill function to fill blend_area, on dest_buf with dsc->color*/
my_gpu_fill(dest_buf, dest_stride, &blend_area, dsc->color);
- }
+ }
/*Fallback: the GPU doesn't support these settings. Call the SW renderer.*/
else {
lv_draw_sw_blend_basic(draw_ctx, dsc);
@@ -158,7 +154,7 @@ The implementation of wait callback is much simpler:
void my_gpu_wait(lv_draw_ctx_t * draw_ctx)
{
while(my_gpu_is_working());
-
+
/*Call SW renderer's wait callback too*/
lv_draw_sw_wait_for_finish(draw_ctx);
}
@@ -171,21 +167,21 @@ A custom `draw_rect` callback might look like this:
void my_draw_rect(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords)
{
if(lv_draw_mask_is_any(coords) == false && dsc->grad == NULL && dsc->bg_img_src == NULL &&
- dsc->shadow_width == 0 && dsc->blend_mode = LV_BLEND_MODE_NORMAL)
+ dsc->shadow_width == 0 && dsc->blend_mode = LV_BLEND_MODE_NORMAL)
{
/*Draw the background*/
my_bg_drawer(draw_ctx, coords, dsc->bg_color, dsc->radius);
-
+
/*Draw the border if any*/
if(dsc->border_width) {
my_border_drawer(draw_ctx, coords, dsc->border_width, dsc->border_color, dsc->border_opa)
}
-
+
/*Draw the outline if any*/
if(dsc->outline_width) {
my_outline_drawer(draw_ctx, coords, dsc->outline_width, dsc->outline_color, dsc->outline_opa, dsc->outline_pad)
}
- }
+ }
/*Fallback*/
else {
lv_draw_sw_rect(draw_ctx, dsc, coords);
@@ -197,6 +193,6 @@ void my_draw_rect(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, cons
## Fully custom draw engine
-For example if your MCU/MPU supports a powerful vector graphics engine you might use only that instead of LVGL's SW renderer.
+For example if your MCU/MPU supports a powerful vector graphics engine you might use only that instead of LVGL's SW renderer.
In this case, you need to base the renderer on the basic `lv_draw_ctx_t` (instead of `lv_draw_sw_ctx_t`) and extend/initialize it as you wish.
diff --git a/docs/porting/indev.md b/docs/porting/indev.md
index d06c421fa..0066f56d2 100644
--- a/docs/porting/indev.md
+++ b/docs/porting/indev.md
@@ -1,7 +1,3 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/porting/indev.md
-```
# Input device interface
## Types of input devices
@@ -9,6 +5,7 @@
To register an input device an `lv_indev_drv_t` variable has to be initialized. **Be sure to register at least one display before you register any input devices.**
```c
+/*Register at least one display before you register any input devices*/
lv_disp_drv_register(&disp_drv);
static lv_indev_drv_t indev_drv;
@@ -45,7 +42,7 @@ void my_input_read(lv_indev_drv_t * drv, lv_indev_data_t*data)
data->point.y = touchpad_y;
data->state = LV_INDEV_STATE_PRESSED;
} else {
- data->state = LV_INDEV_STATE_RELEASED;
+ data->state = LV_INDEV_STATE_RELEASED;
}
}
```
@@ -108,7 +105,7 @@ void encoder_read(lv_indev_drv_t * drv, lv_indev_data_t*data){
```
#### Using buttons with Encoder logic
-In addition to standard encoder behavior, you can also utilize its logic to navigate(focus) and edit widgets using buttons.
+In addition to standard encoder behavior, you can also utilize its logic to navigate(focus) and edit widgets using buttons.
This is especially handy if you have only few buttons available, or you want to use other buttons in addition to encoder wheel.
You need to have 3 buttons available:
@@ -141,7 +138,7 @@ void encoder_with_keys_read(lv_indev_drv_t * drv, lv_indev_data_t*data){
*Buttons* mean external "hardware" buttons next to the screen which are assigned to specific coordinates of the screen.
If a button is pressed it will simulate the pressing on the assigned coordinate. (Similarly to a touchpad)
-To assign buttons to coordinates use `lv_indev_set_button_points(my_indev, points_array)`.
+To assign buttons to coordinates use `lv_indev_set_button_points(my_indev, points_array)`.
`points_array` should look like `const lv_point_t points_array[] = { {12,30},{60,90}, ...}`
``` important:: The points_array can't go out of scope. Either declare it as a global variable or as a static variable inside a function.
@@ -189,9 +186,9 @@ Every input device is associated with a display. By default, a new input device
The associated display is stored and can be changed in `disp` field of the driver.
### Buffered reading
-By default, LVGL calls `read_cb` periodically. Because of this intermittent polling there is a chance that some user gestures are missed.
+By default, LVGL calls `read_cb` periodically. Because of this intermittent polling there is a chance that some user gestures are missed.
-To solve this you can write an event driven driver for your input device that buffers measured data. In `read_cb` you can report the buffered data instead of directly reading the input device.
+To solve this you can write an event driven driver for your input device that buffers measured data. In `read_cb` you can report the buffered data instead of directly reading the input device.
Setting the `data->continue_reading` flag will tell LVGL there is more data to read and it should call `read_cb` again.
## Further reading
diff --git a/docs/porting/index.md b/docs/porting/index.md
index 70f926ecf..2bf1dce91 100644
--- a/docs/porting/index.md
+++ b/docs/porting/index.md
@@ -1,7 +1,3 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/porting/index.md
-```
# Porting
@@ -14,11 +10,11 @@
display
indev
tick
- task-handler
+ timer-handler
sleep
os
log
gpu
-
+
```
diff --git a/docs/porting/log.md b/docs/porting/log.md
index fac928d21..9264ebbbf 100644
--- a/docs/porting/log.md
+++ b/docs/porting/log.md
@@ -1,7 +1,3 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/porting/log.md
-```
# Logging
LVGL has a built-in *Log* module to inform the user about what is happening in the library.
@@ -24,7 +20,7 @@ If your system supports `printf`, you just need to enable `LV_LOG_PRINTF` in `lv
### Custom log function
-If you can't use `printf` or want to use a custom function to log, you can register a "logger" callback with `lv_log_register_print_cb()`.
+If you can't use `printf` or want to use a custom function to log, you can register a "logger" callback with `lv_log_register_print_cb()`.
For example:
@@ -43,4 +39,11 @@ lv_log_register_print_cb(my_log_cb);
## Add logs
-You can also use the log module via the `LV_LOG_TRACE/INFO/WARN/ERROR/USER(text)` functions.
+You can also use the log module via the `LV_LOG_TRACE/INFO/WARN/ERROR/USER(text)` or `LV_LOG(text)` functions. Here:
+
+- `LV_LOG_TRACE/INFO/WARN/ERROR/USER(text)` append following information to your `text`
+ - Log Level
+ - \_\_FILE\_\_
+ - \_\_LINE\_\_
+ - \_\_func\_\_
+- `LV_LOG(text)` is similar to `LV_LOG_USER` but has no extra information attached.
diff --git a/docs/porting/os.md b/docs/porting/os.md
index cf82f792a..2dc416619 100644
--- a/docs/porting/os.md
+++ b/docs/porting/os.md
@@ -1,7 +1,3 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/porting/os.md
-```
# Operating system and interrupts
LVGL is **not thread-safe** by default.
@@ -37,7 +33,7 @@ void other_thread(void)
mutex_lock(&lvgl_mutex);
lv_obj_t *img = lv_img_create(lv_scr_act());
mutex_unlock(&lvgl_mutex);
-
+
while(1) {
mutex_lock(&lvgl_mutex);
/* change to the next image */
diff --git a/docs/porting/project.md b/docs/porting/project.md
index c11cbf2cb..6d025b90c 100644
--- a/docs/porting/project.md
+++ b/docs/porting/project.md
@@ -1,7 +1,3 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/porting/project.md
-```
# Set up a project
@@ -16,7 +12,7 @@ You can clone it or [Download](https://github.com/lvgl/lvgl/archive/refs/heads/m
The graphics library itself is the `lvgl` directory. It contains a couple of folders but to use `lvgl` you only need `.c` and `.h` files from the `src` folder.
### Automatically add files
-If your IDE automatically adds the files from the folders copied to the project folder (as Eclipse or VSCode does), you can simply copy the `lvgl` folder as it is into your project.
+If your IDE automatically adds the files from the folders copied to the project folder (as Eclipse or VSCode does), you can simply copy the `lvgl` folder as it is into your project.
### Make and CMake
LVGL also supports `make` and `CMake` build systems out of the box. To add LVGL to your Makefile based build system add these lines to your main Makefile:
@@ -26,7 +22,7 @@ LVGL_DIR ?= ${shell pwd} #The path where the lvgl folder is
include $(LVGL_DIR)/$(LVGL_DIR_NAME)/lvgl.mk
```
-For integration with CMake take a look this section of the [Documentation](/get-started/cmake).
+For integration with CMake take a look this section of the [Documentation](/get-started/platforms/cmake).
### Other platforms and tools
The [Get started](/get-started/index.html) section contains many platform specific descriptions e.g. for ESP32, Arduino, NXP, RT-Thread, NuttX, etc.
@@ -48,13 +44,13 @@ To get `lv_conf.h` **copy lvgl/lv_conf_template.h** next to the `lvgl` directory
Comments in the config file explain the meaning of the options. Be sure to set at least `LV_COLOR_DEPTH` according to your display's color depth. Note that, the examples and demos explicitly need to be enabled in `lv_conf.h`.
-Alternatively, `lv_conf.h` can be copied to another place but then you should add the `LV_CONF_INCLUDE_SIMPLE` define to your compiler options (e.g. `-DLV_CONF_INCLUDE_SIMPLE` for GCC compiler) and set the include path manually (e.g. `-I../include/gui`).
+Alternatively, `lv_conf.h` can be copied to another place but then you should add the `LV_CONF_INCLUDE_SIMPLE` define to your compiler options (e.g. `-DLV_CONF_INCLUDE_SIMPLE` for GCC compiler) and set the include path manually (e.g. `-I../include/gui`).
In this case LVGL will attempt to include `lv_conf.h` simply with `#include "lv_conf.h"`.
You can even use a different name for `lv_conf.h`. The custom path can be set via the `LV_CONF_PATH` define.
For example `-DLV_CONF_PATH="/home/joe/my_project/my_custom_conf.h"`
-If `LV_CONF_SKIP` is defined, LVGL will not try to include `lv_conf.h`. Instead you can pass the config defines using build options. For example `"-DLV_COLOR_DEPTH=32 -DLV_USE_BTN 1"`. The unset options will get a default value which is the same as the ones in `lv_conf_template.h`.
+If `LV_CONF_SKIP` is defined, LVGL will not try to include `lv_conf.h`. Instead you can pass the config defines using build options. For example `"-DLV_COLOR_DEPTH=32 -DLV_USE_BTN=1"`. The unset options will get a default value which is the same as the ones in `lv_conf_template.h`.
LVGL also can be used via `Kconfig` and `menuconfig`. You can use `lv_conf.h` together with Kconfig, but keep in mind that the value from `lv_conf.h` or build settings (`-D...`) overwrite the values set in Kconfig. To ignore the configs from `lv_conf.h` simply remove its content, or define `LV_CONF_SKIP`.
@@ -67,4 +63,4 @@ To use the graphics library you have to initialize it and setup required compone
2. Initialize your drivers.
3. Register the display and input devices drivers in LVGL. Learn more about [Display](/porting/display) and [Input device](/porting/indev) registration.
4. Call `lv_tick_inc(x)` every `x` milliseconds in an interrupt to report the elapsed time to LVGL. [Learn more](/porting/tick).
-5. Call `lv_timer_handler()` every few milliseconds to handle LVGL related tasks. [Learn more](/porting/task-handler).
+5. Call `lv_timer_handler()` every few milliseconds to handle LVGL related tasks. [Learn more](/porting/timer-handler).
diff --git a/docs/porting/sleep.md b/docs/porting/sleep.md
index a209cc0ec..b0a877c72 100644
--- a/docs/porting/sleep.md
+++ b/docs/porting/sleep.md
@@ -1,7 +1,3 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/porting/sleep.md
-```
# Sleep management
The MCU can go to sleep when no user input happens. In this case, the main `while(1)` should look like this:
diff --git a/docs/porting/task-handler.md b/docs/porting/task-handler.md
deleted file mode 100644
index 576c5f509..000000000
--- a/docs/porting/task-handler.md
+++ /dev/null
@@ -1,23 +0,0 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/porting/task-handler.md
-```
-# Task Handler
-
-To handle the tasks of LVGL you need to call `lv_timer_handler()` periodically in one of the following:
-- *while(1)* of *main()* function
-- timer interrupt periodically (lower priority than `lv_tick_inc()`)
-- an OS task periodically
-
-The timing is not critical but it should be about 5 milliseconds to keep the system responsive.
-
-Example:
-```c
-while(1) {
- lv_timer_handler();
- my_delay_ms(5);
-}
-```
-
-To learn more about timers visit the [Timer](/overview/timer) section.
-
diff --git a/docs/porting/tick.md b/docs/porting/tick.md
index 7de2db0ad..a3e8e94ef 100644
--- a/docs/porting/tick.md
+++ b/docs/porting/tick.md
@@ -1,7 +1,3 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/porting/tick.md
-```
# Tick interface
LVGL needs a system tick to know elapsed time for animations and other tasks.
diff --git a/docs/porting/timer-handler.md b/docs/porting/timer-handler.md
new file mode 100644
index 000000000..2f086b597
--- /dev/null
+++ b/docs/porting/timer-handler.md
@@ -0,0 +1,38 @@
+# Timer Handler
+
+To handle the tasks of LVGL you need to call `lv_timer_handler()` periodically in one of the following:
+- *while(1)* of *main()* function
+- timer interrupt periodically (lower priority than `lv_tick_inc()`)
+- an OS task periodically
+
+The timing is not critical but it should be about 5 milliseconds to keep the system responsive.
+
+Example:
+```c
+while(1) {
+ lv_timer_handler();
+ my_delay_ms(5);
+}
+```
+
+If you want to use `lv_timer_handler()` in a super-loop, a helper function`lv_timer_handler_run_in_period()` is provided to simplify the porting:
+
+```c
+while(1) {
+ ...
+ lv_timer_handler_run_in_period(5); /* run lv_timer_handler() every 5ms */
+ ...
+}
+```
+
+ In an OS environment, you can use it together with the **delay** or **sleep** provided by OS to release CPU whenever possible:
+
+```c
+while (1) {
+ lv_timer_handler_run_in_period(5); /* run lv_timer_handler() every 5ms */
+ my_delay_ms(5); /* delay 5ms to avoid unnecessary polling */
+}
+```
+
+To learn more about timers visit the [Timer](/overview/timer) section.
+
diff --git a/docs/requirements.txt b/docs/requirements.txt
index 06400084d..0ce269828 100644
--- a/docs/requirements.txt
+++ b/docs/requirements.txt
@@ -7,7 +7,7 @@ commonmark==0.9.1
docutils==0.16
idna==2.10
imagesize==1.2.0
-importlib-metadata==4.0.1
+importlib-metadata==4.8.1
Jinja2==2.11.3
Markdown==3.3.4
MarkupSafe==1.1.1
@@ -19,16 +19,16 @@ recommonmark==0.6.0
requests==2.25.1
six==1.16.0
snowballstemmer==2.1.0
-Sphinx==4.0.1
+Sphinx==4.5.0
sphinx-markdown-tables==0.0.15
sphinx-rtd-theme==0.5.2
sphinx-sitemap==2.2.0
sphinxcontrib-applehelp==1.0.2
sphinxcontrib-devhelp==1.0.2
-sphinxcontrib-htmlhelp==1.0.3
+sphinxcontrib-htmlhelp==2.0.0
sphinxcontrib-jsmath==1.0.1
sphinxcontrib-qthelp==1.0.3
-sphinxcontrib-serializinghtml==1.1.4
+sphinxcontrib-serializinghtml==1.1.5
typing-extensions==3.10.0.0
urllib3==1.26.5
zipp==3.4.1
diff --git a/docs/widgets/core/arc.md b/docs/widgets/core/arc.md
index 245c723d0..5b5027147 100644
--- a/docs/widgets/core/arc.md
+++ b/docs/widgets/core/arc.md
@@ -1,7 +1,3 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/widgets/core/arc.md
-```
# Arc (lv_arc)
## Overview
@@ -10,20 +6,20 @@ The Arc consists of a background and a foreground arc. The foreground (indicator
## Parts and Styles
- `LV_PART_MAIN` Draws a background using the typical background style properties and an arc using the arc style properties. The arc's size and position will respect the *padding* style properties.
-- `LV_PART_INDICATOR` Draws another arc using the *arc* style properties. Its padding values are interpreted relative to the background arc.
-- `LV_PART_KNOB` Draws a handle on the end of the indicator using all background properties and padding values. With zero padding the knob size is the same as the indicator's width.
-Larger padding makes it larger, smaller padding makes it smaller.
+- `LV_PART_INDICATOR` Draws another arc using the *arc* style properties. Its padding values are interpreted relative to the background arc.
+- `LV_PART_KNOB` Draws a handle on the end of the indicator using all background properties and padding values. With zero padding the knob size is the same as the indicator's width.
+Larger padding makes it larger, smaller padding makes it smaller.
## Usage
### Value and range
-A new value can be set using `lv_arc_set_value(arc, new_value)`.
+A new value can be set using `lv_arc_set_value(arc, new_value)`.
The value is interpreted in a range (minimum and maximum values) which can be modified with `lv_arc_set_range(arc, min, max)`.
The default range is 0..100.
The indicator arc is drawn on the main part's arc. This if the value is set to maximum the indicator arc will cover the entire "background" arc.
-To set the start and end angle of the background arc use the `lv_arc_set_bg_angles(arc, start_angle, end_angle)` functions or `lv_arc_set_bg_start/end_angle(arc, angle)`.
+To set the start and end angle of the background arc use the `lv_arc_set_bg_angles(arc, start_angle, end_angle)` functions or `lv_arc_set_bg_start/end_angle(arc, angle)`.
Zero degrees is at the middle right (3 o'clock) of the object and the degrees are increasing in clockwise direction.
The angles should be in the [0;360] range.
@@ -42,7 +38,7 @@ The arc can be one of the following modes:
The mode can be set by `lv_arc_set_mode(arc, LV_ARC_MODE_...)` and used only if the angle is set by `lv_arc_set_value()` or the arc is adjusted by finger.
### Change rate
-If the arc is pressed the current value will set with a limited speed according to the set *change rate*.
+If the arc is pressed the current value will set with a limited speed according to the set *change rate*.
The change rate is defined in degree/second unit and can be set with `lv_arc_set_change_rage(arc, rate)`
@@ -60,20 +56,27 @@ lv_obj_clear_flag(arc, LV_OBJ_FLAG_CLICKABLE);
### Advanced hit test
-If the `LV_OBJ_FLAG_ADV_HITTEST` flag is enabled the arc can be clicked through in the middle. Clicks are recognized only on the ring of the background arc. `lv_obj_set_ext_click_size()` makes the sensitive area larger inside and outside with the given number of pixels.
+If the `LV_OBJ_FLAG_ADV_HITTEST` flag is enabled the arc can be clicked through in the middle. Clicks are recognized only on the ring of the background arc. `lv_obj_set_ext_click_size()` makes the sensitive area larger inside and outside with the given number of pixels.
+
+### Place another object to the knob
+Another object can be positioned according to the current position of the arc in order to follow the arc's current value (angle).
+To do this use `lv_arc_align_obj_to_angle(arc, obj_to_align, radius_offset)`.
+Similarly `lv_arc_rotate_obj_to_angle(arc, obj_to_rotate, radius_offset)` can be used to rotate the object to the current value of the arc.
+
+It's a typical use case to call these functions in the `VALUE_CHANGED` event of the arc.
## Events
- `LV_EVENT_VALUE_CHANGED` sent when the arc is pressed/dragged to set a new value.
- `LV_EVENT_DRAW_PART_BEGIN` and `LV_EVENT_DRAW_PART_END` are sent with the following types:
- - `LV_ARC_DRAW_PART_BACKGROUND` The background arc.
+ - `LV_ARC_DRAW_PART_BACKGROUND` The background arc.
- `part`: `LV_PART_MAIN`
- `p1`: center of the arc
- `radius`: radius of the arc
- `arc_dsc`
- - `LV_ARC_DRAW_PART_FOREGROUND` The foreground arc.
+ - `LV_ARC_DRAW_PART_FOREGROUND` The foreground arc.
- `part`: `LV_PART_INDICATOR`
- `p1`: center of the arc
- `radius`: radius of the arc
@@ -82,9 +85,9 @@ If the `LV_OBJ_FLAG_ADV_HITTEST` flag is enabled the arc can be clicked through
- `part`: `LV_PART_KNOB`
- `draw_area`: the area of the knob
- `rect_dsc`:
-
+
See the events of the [Base object](/widgets/obj) too.
-
+
Learn more about [Events](/overview/event).
## Keys
diff --git a/docs/widgets/core/bar.md b/docs/widgets/core/bar.md
index 838d8cdd1..a18f7d74b 100644
--- a/docs/widgets/core/bar.md
+++ b/docs/widgets/core/bar.md
@@ -1,12 +1,8 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/widgets/core/bar.md
-```
# Bar (lv_bar)
## Overview
-The bar object has a background and an indicator on it. The width of the indicator is set according to the current value of the bar.
+The bar object has a background and an indicator on it. The width of the indicator is set according to the current value of the bar.
Vertical bars can be created if the width of the object is smaller than its height.
@@ -16,7 +12,7 @@ Not only the end, but also the start value of the bar can be set, which changes
## Parts and Styles
- `LV_PART_MAIN` The background of the bar and it uses the typical background style properties. Adding padding makes the indicator smaller or larger. The `anim_time` style property sets the animation time if the values set with `LV_ANIM_ON`.
- `LV_PART_INDICATOR` The indicator itself; also uses all the typical background properties.
-
+
## Usage
### Value and range
@@ -35,10 +31,10 @@ The bar can be one of the following modes:
## Events
- `LV_EVENT_DRAW_PART_BEGIN` and `LV_EVENT_DRAW_PART_END` are sent for the following parts:
- `LV_BAR_DRAW_PART_INDICATOR` The indicator of the bar
- - `part`: `LV_PART_INDICATOR`
+ - `part`: `LV_PART_INDICATOR`
- `draw_area`: area of the indicator
- `rect_dsc`
-
+
See the events of the [Base object](/widgets/obj) too.
Learn more about [Events](/overview/event).
diff --git a/docs/widgets/core/btn.md b/docs/widgets/core/btn.md
index a8e797d87..5a055d991 100644
--- a/docs/widgets/core/btn.md
+++ b/docs/widgets/core/btn.md
@@ -1,7 +1,3 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/widgets/core/btn.md
-```
# Button (lv_btn)
## Overview
diff --git a/docs/widgets/core/btnmatrix.md b/docs/widgets/core/btnmatrix.md
index 6824d19a3..a9ca82e91 100644
--- a/docs/widgets/core/btnmatrix.md
+++ b/docs/widgets/core/btnmatrix.md
@@ -1,7 +1,3 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/widgets/core/btnmatrix.md
-```
# Button matrix (lv_btnmatrix)
## Overview
@@ -12,7 +8,7 @@ The Button matrix is added to the default group (if one is set). Besides the But
## Parts and Styles
- `LV_PART_MAIN` The background of the button matrix, uses the typical background style properties. `pad_row` and `pad_column` sets the space between the buttons.
-- `LV_PART_ITEMS` The buttons all use the text and typical background style properties except translations and transformations.
+- `LV_PART_ITEMS` The buttons all use the text and typical background style properties except translations and transformations.
## Usage
@@ -27,7 +23,7 @@ So in the example the first row will have 2 buttons each with 50% width and a se
### Control buttons
The buttons' width can be set relative to the other button in the same row with `lv_btnmatrix_set_btn_width(btnm, btn_id, width)`
-E.g. in a line with two buttons: *btnA, width = 1* and *btnB, width = 2*, *btnA* will have 33 % width and *btnB* will have 66 % width.
+E.g. in a line with two buttons: *btnA, width = 1* and *btnB, width = 2*, *btnA* will have 33 % width and *btnB* will have 66 % width.
It's similar to how the [`flex-grow`](https://developer.mozilla.org/en-US/docs/Web/CSS/flex-grow) property works in CSS.
The width must be in the \[1..7\] range and the default width is 1.
@@ -45,14 +41,14 @@ In addition to the width, each button can be customized with the following param
By default, all flags are disabled.
-To set or clear a button's control attribute, use `lv_btnmatrix_set_btn_ctrl(btnm, btn_id, LV_BTNM_CTRL_...)` and
+To set or clear a button's control attribute, use `lv_btnmatrix_set_btn_ctrl(btnm, btn_id, LV_BTNM_CTRL_...)` and
`lv_btnmatrix_clear_btn_ctrl(btnm, btn_id, LV_BTNMATRIX_CTRL_...)` respectively. More `LV_BTNM_CTRL_...` values can be OR-ed
-To set/clear the same control attribute for all buttons of a button matrix, use `lv_btnmatrix_set_btn_ctrl_all(btnm, LV_BTNM_CTRL_...)` and
+To set/clear the same control attribute for all buttons of a button matrix, use `lv_btnmatrix_set_btn_ctrl_all(btnm, LV_BTNM_CTRL_...)` and
`lv_btnmatrix_clear_btn_ctrl_all(btnm, LV_BTNMATRIX_CTRL_...)`.
The set a control map for a button matrix (similarly to the map for the text), use `lv_btnmatrix_set_ctrl_map(btnm, ctrl_map)`.
-An element of `ctrl_map` should look like `ctrl_map[0] = width | LV_BTNM_CTRL_NO_REPEAT | LV_BTNM_CTRL_CHECHKABLE`.
+An element of `ctrl_map` should look like `ctrl_map[0] = width | LV_BTNM_CTRL_NO_REPEAT | LV_BTNM_CTRL_CHECHKABLE`.
The number of elements should be equal to the number of buttons (excluding newlines characters).
### One check
@@ -63,7 +59,7 @@ The "One check" feature can be enabled with `lv_btnmatrix_set_one_checked(btnm,
- `LV_EVENT_DRAW_PART_BEGIN` and `LV_EVENT_DRAW_PART_END` are sent for the following types:
- `LV_BTNMATRIX_DRAW_PART_BTN` The individual buttons.
- `part`: `LV_PART_ITEMS`
- - `id`:index of the button being drawn
+ - `id`:index of the button being drawn
- `draw_area`: the area of teh button
- `rect_dsc`
diff --git a/docs/widgets/core/canvas.md b/docs/widgets/core/canvas.md
index 04f9bbc08..27f62361e 100644
--- a/docs/widgets/core/canvas.md
+++ b/docs/widgets/core/canvas.md
@@ -1,14 +1,10 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/widgets/core/canvas.md
-```
# Canvas (lv_canvas)
## Overview
-A Canvas inherits from [Image](/widgets/core/img) where the user can draw anything.
-Rectangles, texts, images, lines, arcs can be drawn here using lvgl's drawing engine.
+A Canvas inherits from [Image](/widgets/core/img) where the user can draw anything.
+Rectangles, texts, images, lines, arcs can be drawn here using lvgl's drawing engine.
Additionally "effects" can be applied, such as rotation, zoom and blur.
@@ -19,31 +15,31 @@ Additionally "effects" can be applied, such as rotation, zoom and blur.
### Buffer
The Canvas needs a buffer in which stores the drawn image.
-To assign a buffer to a Canvas, use `lv_canvas_set_buffer(canvas, buffer, width, height, LV_IMG_CF_...)`.
+To assign a buffer to a Canvas, use `lv_canvas_set_buffer(canvas, buffer, width, height, LV_IMG_CF_...)`.
Where `buffer` is a static buffer (not just a local variable) to hold the image of the canvas.
For example,
-`static lv_color_t buffer[LV_CANVAS_BUF_SIZE_TRUE_COLOR(width, height)]`.
+`static lv_color_t buffer[LV_CANVAS_BUF_SIZE_TRUE_COLOR(width, height)]`.
`LV_CANVAS_BUF_SIZE_...` macros help to determine the size of the buffer with different color formats.
-The canvas supports all the built-in color formats like `LV_IMG_CF_TRUE_COLOR` or `LV_IMG_CF_INDEXED_2BIT`.
+The canvas supports all the built-in color formats like `LV_IMG_CF_TRUE_COLOR` or `LV_IMG_CF_INDEXED_2BIT`.
See the full list in the [Color formats](/overview/image.html#color-formats) section.
### Indexed colors
-For `LV_IMG_CF_INDEXED_1/2/4/8` color formats a palette needs to be
+For `LV_IMG_CF_INDEXED_1/2/4/8` color formats a palette needs to be
initialized with `lv_canvas_set_palette(canvas, 3, LV_COLOR_RED)`. It sets pixels with *index=3* to red.
### Drawing
To set a pixel's color on the canvas, use `lv_canvas_set_px_color(canvas, x, y, LV_COLOR_RED)`.
-With `LV_IMG_CF_INDEXED_...` the index of the color needs to be passed as color.
+With `LV_IMG_CF_INDEXED_...` the index of the color needs to be passed as color.
E.g. `lv_color_t c; c.full = 3;`
To set a pixel's opacity with `LV_IMG_CF_TRUE_COLOR_ALPHA` or `LV_IMG_CF_ALPHA_...` format on the canvas, use `lv_canvas_set_px_opa(canvas, x, y, opa)`.
-`lv_canvas_fill_bg(canvas, LV_COLOR_BLUE, LV_OPA_50)` fills the whole canvas to blue with 50% opacity. Note that if the current color format doesn't support colors (e.g. `LV_IMG_CF_ALPHA_2BIT`) the color will be ignored.
+`lv_canvas_fill_bg(canvas, LV_COLOR_BLUE, LV_OPA_50)` fills the whole canvas to blue with 50% opacity. Note that if the current color format doesn't support colors (e.g. `LV_IMG_CF_ALPHA_2BIT`) the color will be ignored.
Similarly, if opacity is not supported (e.g. `LV_IMG_CF_TRUE_COLOR`) it will be ignored.
-An array of pixels can be copied to the canvas with `lv_canvas_copy_buf(canvas, buffer_to_copy, x, y, width, height)`.
+An array of pixels can be copied to the canvas with `lv_canvas_copy_buf(canvas, buffer_to_copy, x, y, width, height)`.
The color format of the buffer and the canvas need to match.
To draw something to the canvas use
@@ -59,7 +55,7 @@ To draw something to the canvas use
The draw function can draw to any color format. For example, it's possible to draw a text to an `LV_IMG_VF_ALPHA_8BIT` canvas and use the result image as a [draw mask](/overview/drawing) later.
### Transformations
-`lv_canvas_transform()` can be used to rotate and/or scale the image of an image and store the result on the canvas.
+`lv_canvas_transform()` can be used to rotate and/or scale the image of an image and store the result on the canvas.
The function needs the following parameters:
- `canvas` pointer to a canvas object to store the result of the transformation.
- `img pointer` to an image descriptor to transform. Can be the image descriptor of another canvas too (`lv_canvas_get_img()`).
@@ -70,16 +66,16 @@ The function needs the following parameters:
- `pivot_x` pivot X of rotation. Relative to the source canvas. Set to `source width / 2` to rotate around the center
- `pivot_y` pivot Y of rotation. Relative to the source canvas. Set to `source height / 2` to rotate around the center
- `antialias` true: apply anti-aliasing during the transformation. Looks better but slower.
-
+
Note that a canvas can't be rotated on itself. You need a source and destination canvas or image.
### Blur
-A given area of the canvas can be blurred horizontally with `lv_canvas_blur_hor(canvas, &area, r)` or vertically with `lv_canvas_blur_ver(canvas, &area, r)`.
+A given area of the canvas can be blurred horizontally with `lv_canvas_blur_hor(canvas, &area, r)` or vertically with `lv_canvas_blur_ver(canvas, &area, r)`.
`r` is the radius of the blur (greater value means more intensive burring). `area` is the area where the blur should be applied (interpreted relative to the canvas).
## Events
No special events are sent by canvas objects.
-The same events are sent as for the
+The same events are sent as for the
See the events of the [Images](/widgets/core/img) too.
diff --git a/docs/widgets/core/checkbox.md b/docs/widgets/core/checkbox.md
index 46c6795e6..99a54fcdb 100644
--- a/docs/widgets/core/checkbox.md
+++ b/docs/widgets/core/checkbox.md
@@ -1,7 +1,3 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/widgets/core/checkbox.md
-```
# Checkbox (lv_checkbox)
@@ -10,12 +6,12 @@
The Checkbox object is created from a "tick box" and a label. When the Checkbox is clicked the tick box is toggled.
## Parts and Styles
-- `LV_PART_MAIN` The is the background of the Checkbox and it uses the text and all the typical background style properties.
+- `LV_PART_MAIN` The is the background of the Checkbox and it uses the text and all the typical background style properties.
`pad_column` adjusts the spacing between the tickbox and the label
-- `LV_PART_INDICATOR` The "tick box" is a square that uses all the typical background style properties.
+- `LV_PART_INDICATOR` The "tick box" is a square that uses all the typical background style properties.
By default, its size is equal to the height of the main part's font. Padding properties make the tick box larger in the respective directions.
-The Checkbox is added to the default group (if it is set).
+The Checkbox is added to the default group (if it is set).
## Usage
@@ -23,7 +19,7 @@ The Checkbox is added to the default group (if it is set).
### Text
The text can be modified with the `lv_checkbox_set_text(cb, "New text")` function and will be dynamically allocated.
-To set a static text,
+To set a static text,
use `lv_checkbox_set_static_text(cb, txt)`. This way, only a pointer to `txt` will be stored. The text then shouldn't be deallocated while the checkbox exists.
### Check, uncheck, disable
@@ -38,7 +34,7 @@ lv_obj_add_state(cb, LV_STATE_CHECKED | LV_STATE_DISABLED); /*Make the checkbox
- `LV_EVENT_VALUE_CHANGED` Sent when the checkbox is toggled.
- `LV_EVENT_DRAW_PART_BEGIN` and `LV_EVENT_DRAW_PART_END` are sent for the following types:
- `LV_CHECKBOX_DRAW_PART_BOX` The tickbox of the checkbox
- - `part`: `LV_PART_INDICATOR`
+ - `part`: `LV_PART_INDICATOR`
- `draw_area`: the area of the tickbox
- `rect_dsc`
diff --git a/docs/widgets/core/dropdown.md b/docs/widgets/core/dropdown.md
index 7ed20dcf1..c14b9331e 100644
--- a/docs/widgets/core/dropdown.md
+++ b/docs/widgets/core/dropdown.md
@@ -1,16 +1,12 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/widgets/core/dropdown.md
-```
# Drop-down list (lv_dropdown)
## Overview
-The drop-down list allows the user to select one value from a list.
+The drop-down list allows the user to select one value from a list.
-The drop-down list is closed by default and displays a single value or a predefined text.
-When activated (by click on the drop-down list), a list is created from which the user may select one option.
+The drop-down list is closed by default and displays a single value or a predefined text.
+When activated (by click on the drop-down list), a list is created from which the user may select one option.
When the user selects a new value, the list is deleted again.
The Drop-down list is added to the default group (if it is set). Besides the Drop-down list is an editable object to allow selecting an option with encoder navigation too.
@@ -25,9 +21,9 @@ The Dropdown widget is built from the elements: "button" and "list" (both not re
The button goes to `LV_STATE_CHECKED` when it's opened.
### List
-- `LV_PART_MAIN` The list itself. Uses the typical background properties. `max_height` can be used to limit the height of the list.
+- `LV_PART_MAIN` The list itself. Uses the typical background properties. `max_height` can be used to limit the height of the list.
- `LV_PART_SCROLLBAR` The scrollbar background, border, shadow properties and width (for its own width) and right padding for the spacing on the right.
-- `LV_PART_SELECTED` Refers to the currently pressed, checked or pressed+checked option. Also uses the typical background properties.
+- `LV_PART_SELECTED` Refers to the currently pressed, checked or pressed+checked option. Also uses the typical background properties.
The list is hidden/shown on open/close. To add styles to it use `lv_dropdown_get_list(dropdown)` to get the list object. For example:
@@ -36,8 +32,8 @@ lv_obj_t * list = lv_dropdown_get_list(dropdown) /*Get the list*/
lv_obj_add_style(list, &my_style, ...) /*Add the styles to the list*/}`
```
-Alternatively the theme can be extended with the new styles.
-
+Alternatively the theme can be extended with the new styles.
+
## Usage
## Overview
@@ -47,7 +43,7 @@ Options are passed to the drop-down list as a string with `lv_dropdown_set_optio
The `lv_dropdown_add_option(dropdown, "New option", pos)` function inserts a new option to `pos` index.
-To save memory the options can set from a static(constant) string too with `lv_dropdown_set_static_options(dropdown, options)`.
+To save memory the options can set from a static(constant) string too with `lv_dropdown_set_static_options(dropdown, options)`.
In this case the options string should be alive while the drop-down list exists and `lv_dropdown_add_option` can't be used
You can select an option manually with `lv_dropdown_set_selected(dropdown, id)`, where `id` is the index of an option.
diff --git a/docs/widgets/core/img.md b/docs/widgets/core/img.md
index da98e9d58..ee1e6acba 100644
--- a/docs/widgets/core/img.md
+++ b/docs/widgets/core/img.md
@@ -1,7 +1,3 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/widgets/core/img.md
-```
# Image (lv_img)
@@ -35,7 +31,7 @@ To set an image sourced from a file, use `lv_img_set_src(img, "S:folder1/my_img.
You can also set a symbol similarly to [Labels](/widgets/core/label). In this case, the image will be rendered as text according to the *font* specified in the style. It enables to use of light-weight monochrome "letters" instead of real images. You can set symbol like `lv_img_set_src(img1, LV_SYMBOL_OK)`.
### Label as an image
-Images and labels are sometimes used to convey the same thing. For example, to describe what a button does.
+Images and labels are sometimes used to convey the same thing. For example, to describe what a button does.
Therefore, images and labels are somewhat interchangeable, that is the images can display texts by using `LV_SYMBOL_DUMMY` as the prefix of the text. For example, `lv_img_set_src(img, LV_SYMBOL_DUMMY "Some text")`.
@@ -75,7 +71,7 @@ Using the offset parameter a [Texture atlas](https://en.wikipedia.org/wiki/Textu
## Transformations
-Using the `lv_img_set_zoom(img, factor)` the images will be zoomed. Set `factor` to `256` or `LV_IMG_ZOOM_NONE` to disable zooming.
+Using the `lv_img_set_zoom(img, factor)` the images will be zoomed. Set `factor` to `256` or `LV_IMG_ZOOM_NONE` to disable zooming.
A larger value enlarges the images (e.g. `512` double size), a smaller value shrinks it (e.g. `128` half size).
Fractional scale works as well. E.g. `281` for 10% enlargement.
@@ -87,16 +83,21 @@ By default, the pivot point of the rotation is the center of the image. It can b
The quality of the transformation can be adjusted with `lv_img_set_antialias(img, true/false)`. With enabled anti-aliasing the transformations are higher quality but slower.
-The transformations require the whole image to be available. Therefore indexed images (`LV_IMG_CF_INDEXED_...`), alpha only images (`LV_IMG_CF_ALPHA_...`) or images from files can not be transformed.
+The transformations require the whole image to be available. Therefore indexed images (`LV_IMG_CF_INDEXED_...`), alpha only images (`LV_IMG_CF_ALPHA_...`) or images from files can not be transformed.
In other words transformations work only on true color images stored as C array, or if a custom [Image decoder](/overview/images#image-edecoder) returns the whole image.
Note that the real coordinates of image objects won't change during transformation. That is `lv_obj_get_width/height/x/y()` will return the original, non-zoomed coordinates.
+**IMPORTANT**
+The transformation of the image is independent of the transformation properties coming from styles. (See [here](/overview/style#opacity-and-transformations)). The main differences are that pure image widget transformation
+- doesn't transform the children of the image widget
+- image is transformed directly without creating an intermediate layer (buffer) to snapshot the widget
+
### Size mode
-By default, when the image is zoomed or rotated the real coordinates of the image object are not changed.
-The larger content simply overflows the object's boundaries.
-It also means the layouts are not affected the by the transformations.
+By default, when the image is zoomed or rotated the real coordinates of the image object are not changed.
+The larger content simply overflows the object's boundaries.
+It also means the layouts are not affected the by the transformations.
If you need the object size to be updated to the transformed size set `lv_img_set_size_mode(img, LV_IMG_SIZE_MODE_REAL)`. (The previous mode is the default and called `LV_IMG_SIZE_MODE_VIRTUAL`).
In this case if the width/height of the object is set to `LV_SIZE_CONTENT` the object's size will be set to the zoomed and rotated size.
@@ -104,8 +105,8 @@ If an explicit size is set then the overflowing content will be cropped.
### Rounded image
-You can use `lv_obj_set_style_radius` to set radius to an image, and enable `lv_obj_set_style_clip_corner` to clip the
-content to rounded rectangle or circular shape. Please note this will have some negative performance impact to CPU
+You can use `lv_obj_set_style_radius` to set radius to an image, and enable `lv_obj_set_style_clip_corner` to clip the
+content to rounded rectangle or circular shape. Please note this will have some negative performance impact to CPU
based renderers.
## Events
diff --git a/docs/widgets/core/index.md b/docs/widgets/core/index.md
index 852b02c9c..be6bd8ad3 100644
--- a/docs/widgets/core/index.md
+++ b/docs/widgets/core/index.md
@@ -1,14 +1,10 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/object-types/index.md
-```
# Core widgets
```eval_rst
.. toctree::
:maxdepth: 1
-
+
arc
bar
btn
@@ -24,7 +20,7 @@
switch
table
textarea
-
+
```
diff --git a/docs/widgets/core/label.md b/docs/widgets/core/label.md
index 591174848..cf2b3c8dc 100644
--- a/docs/widgets/core/label.md
+++ b/docs/widgets/core/label.md
@@ -1,29 +1,25 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/widgets/core/core/label.md
-```
# Label (lv_label)
## Overview
-A label is the basic object type that is used to display text.
+A label is the basic object type that is used to display text.
## Parts and Styles
- `LV_PART_MAIN` Uses all the typical background properties and the text properties. The padding values can be used to add space between the text and the background.
- `LV_PART_SCROLLBAR` The scrollbar that is shown when the text is larger than the widget's size.
-- `LV_PART_SELECTED` Tells the style of the [selected text](#text-selection). Only `text_color` and `bg_color` style properties can be used.
+- `LV_PART_SELECTED` Tells the style of the [selected text](#text-selection). Only `text_color` and `bg_color` style properties can be used.
## Usage
### Set text
-You can set the text on a label at runtime with `lv_label_set_text(label, "New text")`.
-This will allocate a buffer dynamically, and the provided string will be copied into that buffer.
+You can set the text on a label at runtime with `lv_label_set_text(label, "New text")`.
+This will allocate a buffer dynamically, and the provided string will be copied into that buffer.
Therefore, you don't need to keep the text you pass to `lv_label_set_text` in scope after that function returns.
With `lv_label_set_text_fmt(label, "Value: %d", 15)` printf formatting can be used to set the text.
-Labels are able to show text from a static character buffer. To do so, use `lv_label_set_text_static(label, "Text")`.
-In this case, the text is not stored in the dynamic memory and the given buffer is used directly instead.
-This means that the array can't be a local variable which goes out of scope when the function exits.
+Labels are able to show text from a static character buffer. To do so, use `lv_label_set_text_static(label, "Text")`.
+In this case, the text is not stored in the dynamic memory and the given buffer is used directly instead.
+This means that the array can't be a local variable which goes out of scope when the function exits.
Constant strings are safe to use with `lv_label_set_text_static` (except when used with `LV_LABEL_LONG_DOT`, as it modifies the buffer in-place), as they are stored in ROM memory, which is always accessible.
### Newline
@@ -31,33 +27,37 @@ Constant strings are safe to use with `lv_label_set_text_static` (except when us
Newline characters are handled automatically by the label object. You can use `\n` to make a line break. For example: `"line1\nline2\n\nline4"`
### Long modes
-By default, the width and height of the label is set to `LV_SIZE_CONTENT`. Therefore, the size of the label is automatically expanded to the text size.
-Otherwise, if the width or height are explicitly set (using e.g.`lv_obj_set_width` or a layout), the lines wider than the label's width can be manipulated according to several long mode policies.
+By default, the width and height of the label is set to `LV_SIZE_CONTENT`. Therefore, the size of the label is automatically expanded to the text size.
+Otherwise, if the width or height are explicitly set (using e.g.`lv_obj_set_width` or a layout), the lines wider than the label's width can be manipulated according to several long mode policies.
Similarly, the policies can be applied if the height of the text is greater than the height of the label.
- `LV_LABEL_LONG_WRAP` Wrap too long lines. If the height is `LV_SIZE_CONTENT` the label's height will be expanded, otherwise the text will be clipped. (Default)
-- `LV_LABEL_LONG_DOT` Replaces the last 3 characters from bottom right corner of the label with dots (`.`)
+- `LV_LABEL_LONG_DOT` Replaces the last 3 characters from bottom right corner of the label with dots (`.`)
- `LV_LABEL_LONG_SCROLL` If the text is wider than the label scroll it horizontally back and forth. If it's higher, scroll vertically. Only one direction is scrolled and horizontal scrolling has higher precedence.
- `LV_LABEL_LONG_SCROLL_CIRCULAR` If the text is wider than the label scroll it horizontally continuously. If it's higher, scroll vertically. Only one direction is scrolled and horizontal scrolling has higher precedence.
- `LV_LABEL_LONG_CLIP` Simply clip the parts of the text outside the label.
You can specify the long mode with `lv_label_set_long_mode(label, LV_LABEL_LONG_...)`
-Note that `LV_LABEL_LONG_DOT` manipulates the text buffer in-place in order to add/remove the dots.
-When `lv_label_set_text` or `lv_label_set_array_text` are used, a separate buffer is allocated and this implementation detail is unnoticed.
+Note that `LV_LABEL_LONG_DOT` manipulates the text buffer in-place in order to add/remove the dots.
+When `lv_label_set_text` or `lv_label_set_array_text` are used, a separate buffer is allocated and this implementation detail is unnoticed.
This is not the case with `lv_label_set_text_static`. The buffer you pass to `lv_label_set_text_static` must be writable if you plan to use `LV_LABEL_LONG_DOT`.
### Text recolor
-In the text, you can use commands to recolor parts of the text. For example: `"Write a #ff0000 red# word"`.
-This feature can be enabled individually for each label by `lv_label_set_recolor()` function.
+In the text, you can use commands to recolor parts of the text. For example: `"Write a #ff0000 red# word"`.
+This feature can be enabled individually for each label by `lv_label_set_recolor()` function.
### Text selection
-If enabled by `LV_LABEL_TEXT_SELECTION` part of the text can be selected. It's similar to when you use your mouse on a PC to select a text.
+If enabled by `LV_LABEL_TEXT_SELECTION` part of the text can be selected. It's similar to when you use your mouse on a PC to select a text.
The whole mechanism (click and select the text as you drag your finger/mouse) is implemented in [Text area](/widgets/core/textarea) and the Label widget only allows manual text selection with
`lv_label_get_text_selection_start(label, start_char_index)` and `lv_label_get_text_selection_start(label, end_char_index)`.
-
+
### Very long texts
LVGL can efficiently handle very long (e.g. > 40k characters) labels by saving some extra data (~12 bytes) to speed up drawing. To enable this feature, set `LV_LABEL_LONG_TXT_HINT 1` in `lv_conf.h`.
+### Custom scrolling animations
+Some aspects of the scrolling animations in long modes `LV_LABEL_LONG_SCROLL` and `LV_LABEL_LONG_SCROLL_CIRCULAR` can be customized by setting the animation property of a style, using `lv_style_set_anim()`.
+Currently, only the start and repeat delay of the circular scrolling animation can be customized. If you need to customize another aspect of the scrolling animation, feel free to open an [issue on Github](https://github.com/lvgl/lvgl/issues) to request the feature.
+
### Symbols
The labels can display symbols alongside letters (or on their own). Read the [Font](/overview/font) section to learn more about the symbols.
@@ -81,12 +81,12 @@ Learn more about [Keys](/overview/indev).
```
-## API
+## API
```eval_rst
.. doxygenfile:: lv_label.h
:project: lvgl
-
+
```
diff --git a/docs/widgets/core/line.md b/docs/widgets/core/line.md
index 078b6fff5..31ae3c113 100644
--- a/docs/widgets/core/line.md
+++ b/docs/widgets/core/line.md
@@ -1,7 +1,3 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/widgets/core/line.md
-```
# Line (lv_line)
## Overview
@@ -12,14 +8,14 @@ The Line object is capable of drawing straight lines between a set of points.
## Usage
-### Set points
-The points have to be stored in an `lv_point_t` array and passed to the object by the `lv_line_set_points(lines, point_array, point_cnt)` function.
+### Set points
+The points have to be stored in an `lv_point_t` array and passed to the object by the `lv_line_set_points(lines, point_array, point_cnt)` function.
### Auto-size
By default, the Line's width and height are set to `LV_SIZE_CONTENT`. This means it will automatically set its size to fit all the points. If the size is set explicitly, parts on the line may not be visible.
### Invert y
-By default, the *y == 0* point is in the top of the object. It might be counter-intuitive in some cases so the y coordinates can be inverted with `lv_line_set_y_invert(line, true)`. In this case, *y == 0* will be the bottom of the object.
+By default, the *y == 0* point is in the top of the object. It might be counter-intuitive in some cases so the y coordinates can be inverted with `lv_line_set_y_invert(line, true)`. In this case, *y == 0* will be the bottom of the object.
*y invert* is disabled by default.
## Events
@@ -42,11 +38,11 @@ Learn more about [Keys](/overview/indev).
```
-## API
+## API
```eval_rst
.. doxygenfile:: lv_line.h
:project: lvgl
-
+
```
diff --git a/docs/widgets/core/roller.md b/docs/widgets/core/roller.md
index 9e01c4a3a..491d9d23f 100644
--- a/docs/widgets/core/roller.md
+++ b/docs/widgets/core/roller.md
@@ -1,15 +1,11 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/widgets/core/roller.md
-```
# Roller (lv_roller)
## Overview
-Roller allows you to simply select one option from a list by scrolling.
+Roller allows you to simply select one option from a list by scrolling.
## Parts and Styles
-- `LV_PART_MAIN` The background of the roller uses all the typical background properties and text style properties. `style_text_line_space` adjusts the space between the options.
+- `LV_PART_MAIN` The background of the roller uses all the typical background properties and text style properties. `style_text_line_space` adjusts the space between the options.
When the Roller is scrolled and doesn't stop exactly on an option it will scroll to the nearest valid option automatically in `anim_time` milliseconds as specified in the style.
- `LV_PART_SELECTED` The selected option in the middle. Besides the typical background properties it uses the text style properties to change the appearance of the text in the selected area.
@@ -30,7 +26,7 @@ To get the *index* of the currently selected option use `lv_roller_get_selected(
### Visible rows
The number of visible rows can be adjusted with `lv_roller_set_visible_row_count(roller, num)`.
-This function calculates the height with the current style. If the font, line space, border width, etc. of the roller changes this function needs to be called again.
+This function calculates the height with the current style. If the font, line space, border width, etc. of the roller changes this function needs to be called again.
## Events
- `LV_EVENT_VALUE_CHANGED` Sent when a new option is selected.
@@ -42,7 +38,7 @@ Learn more about [Events](/overview/event).
## Keys
- `LV_KEY_RIGHT/DOWN` Select the next option
- `LV_KEY_LEFT/UP` Select the previous option
-- `LY_KEY_ENTER` Apply the selected option (Send `LV_EVENT_VALUE_CHANGED` event)
+- `LY_KEY_ENTER` Apply the selected option (Send `LV_EVENT_VALUE_CHANGED` event)
## Example
@@ -52,11 +48,11 @@ Learn more about [Events](/overview/event).
```
-## API
+## API
```eval_rst
.. doxygenfile:: lv_roller.h
:project: lvgl
-
+
```
diff --git a/docs/widgets/core/slider.md b/docs/widgets/core/slider.md
index 101eb91eb..d45a4ea7c 100644
--- a/docs/widgets/core/slider.md
+++ b/docs/widgets/core/slider.md
@@ -1,7 +1,3 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/widgets/core/slider.md
-```
# Slider (lv_slider)
## Overview
@@ -9,10 +5,10 @@
The Slider object looks like a [Bar](/widgets/core/bar) supplemented with a knob. The knob can be dragged to set a value. Just like Bar, Slider can be vertical or horizontal.
-## Parts and Styles
+## Parts and Styles
- `LV_PART_MAIN` The background of the slider. Uses all the typical background style properties. `padding` makes the indicator smaller in the respective direction.
- `LV_PART_INDICATOR` The indicator that shows the current state of the slider. Also uses all the typical background style properties.
-- `LV_PART_KNOB` A rectangle (or circle) drawn at the current value. Also uses all the typical background properties to describe the knob(s). By default, the knob is square (with an optional corner radius) with side length equal to the smaller side of the slider. The knob can be made larger with the `padding` values. Padding values can be asymmetric too.
+- `LV_PART_KNOB` A rectangle (or circle) drawn at the current value. Also uses all the typical background properties to describe the knob(s). By default, the knob is square (with an optional corner radius) with side length equal to the smaller side of the slider. The knob can be made larger with the `padding` values. Padding values can be asymmetric too.
## Usage
@@ -30,22 +26,22 @@ The slider can be one of the following modes:
The mode can be changed with `lv_slider_set_mode(slider, LV_SLIDER_MODE_...)`
### Knob-only mode
-Normally, the slider can be adjusted either by dragging the knob, or by clicking on the slider bar.
+Normally, the slider can be adjusted either by dragging the knob, or by clicking on the slider bar.
In the latter case the knob moves to the point clicked and slider value changes accordingly. In some cases it is desirable to set the slider to react on dragging the knob only. This feature is enabled by adding the `LV_OBJ_FLAG_ADV_HITTEST`: `lv_obj_add_flag(slider, LV_OBJ_FLAG_ADV_HITTEST)`.
The extended click area (set by `lv_obj_set_ext_click_area(slider, value)`) increases to knob's click area.
## Events
-- `LV_EVENT_VALUE_CHANGED` Sent while the slider is being dragged or changed with keys.
-The event is sent continuously while the slider is dragged and once when released. Use `lv_slider_is_dragged` to determine whether the Slider is still being dragged or has just been released.
-- `LV_EVENT_DRAW_PART_BEGIN` and `LV_EVENT_DRAW_PART_END` are sent for the following parts.
+- `LV_EVENT_VALUE_CHANGED` Sent while the slider is being dragged or changed with keys. The event is sent continuously while the slider is being dragged.
+- `LV_EVENT_RELEASED` Sent when the slider has just been released.
+- `LV_EVENT_DRAW_PART_BEGIN` and `LV_EVENT_DRAW_PART_END` are sent for the following parts.
- `LV_SLIDER_DRAW_PART_KNOB` The main (right) knob of the slider
- - `part`: `LV_PART_KNOB`
+ - `part`: `LV_PART_KNOB`
- `draw_area`: area of the indicator
- `rect_dsc`
- `id`: 0
- `LV_SLIDER_DRAW_PART_KNOB` The left knob of the slider
- - `part`: `LV_PART_KNOB`
+ - `part`: `LV_PART_KNOB`
- `draw_area`: area of the indicator
- `rect_dsc`
- `id`: 1
@@ -68,11 +64,11 @@ Learn more about [Keys](/overview/indev).
```
-## API
+## API
```eval_rst
.. doxygenfile:: lv_slider.h
:project: lvgl
-
+
```
diff --git a/docs/widgets/core/switch.md b/docs/widgets/core/switch.md
index 2c7a74765..f08dd8b39 100644
--- a/docs/widgets/core/switch.md
+++ b/docs/widgets/core/switch.md
@@ -1,26 +1,22 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/widgets/core/switch.md
-```
# Switch (lv_switch)
## Overview
-The Switch looks like a little slider and can be used to turn something on and off.
+The Switch looks like a little slider and can be used to turn something on and off.
## Parts and Styles
- `LV_PART_MAIN` The background of the switch uses all the typical background style properties. `padding` makes the indicator smaller in the respective direction.
- `LV_PART_INDICATOR` The indicator that shows the current state of the switch. Also uses all the typical background style properties.
-- `LV_PART_KNOB` A rectangle (or circle) drawn at left or right side of the indicator. Also uses all the typical background properties to describe the knob(s). By default, the knob is square (with an optional corner radius) with side length equal to the smaller side of the slider. The knob can be made larger with the `padding` values. Padding values can be asymmetric too.
+- `LV_PART_KNOB` A rectangle (or circle) drawn at left or right side of the indicator. Also uses all the typical background properties to describe the knob(s). By default, the knob is square (with an optional corner radius) with side length equal to the smaller side of the slider. The knob can be made larger with the `padding` values. Padding values can be asymmetric too.
## Usage
### Change state
The switch uses the standard `LV_STATE_CHECKED` state.
-To get the current state of the switch (with `true` being on), use `lv_obj_has_state(switch, LV_STATE_CHECKED)`.
+To get the current state of the switch (with `true` being on), use `lv_obj_has_state(switch, LV_STATE_CHECKED)`.
Call `lv_obj_add_state(switch, LV_STATE_CHECKED)` to turn it on, or `lv_obj_clear_state(switch, LV_STATE_CHECKED)` to turn it off.
@@ -35,7 +31,7 @@ Learn more about [Events](/overview/event).
## Keys
- `LV_KEY_UP/RIGHT` Turns on the slider
- `LV_KEY_DOWN/LEFT` Turns off the slider
-- `LV_KEY_ENTER` Toggles the switch
+- `LV_KEY_ENTER` Toggles the switch
Learn more about [Keys](/overview/indev).
@@ -47,11 +43,11 @@ Learn more about [Keys](/overview/indev).
```
-## API
+## API
```eval_rst
.. doxygenfile:: lv_switch.h
:project: lvgl
-
+
```
diff --git a/docs/widgets/core/table.md b/docs/widgets/core/table.md
index dc86a7cd8..df42c8ef9 100644
--- a/docs/widgets/core/table.md
+++ b/docs/widgets/core/table.md
@@ -1,7 +1,3 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/widgets/core/table.md
-```
# Table (lv_table)
## Overview
@@ -27,7 +23,7 @@ The cells can store only text so numbers need to be converted to text before dis
Line breaks can be used in the text like `"Value\n60.3"`.
-New rows and columns are automatically added is required
+New rows and columns are automatically added is required
### Rows and Columns
@@ -44,7 +40,7 @@ The height is calculated automatically from the cell styles (font, padding etc)
Cells can be merged horizontally with `lv_table_add_cell_ctrl(table, row, col, LV_TABLE_CELL_CTRL_MERGE_RIGHT)`. To merge more adjacent cells call this function for each cell.
### Scroll
-If the label's width or height is set to `LV_SIZE_CONTENT` that size will be used to show the whole table in the respective direction.
+If the label's width or height is set to `LV_SIZE_CONTENT` that size will be used to show the whole table in the respective direction.
E.g. `lv_obj_set_size(table, LV_SIZE_CONTENT, LV_SIZE_CONTENT)` automatically sets the table size to show all the columns and rows.
If the width or height is set to a smaller number than the "intrinsic" size then the table becomes scrollable.
@@ -53,11 +49,11 @@ If the width or height is set to a smaller number than the "intrinsic" size then
- `LV_EVENT_VALUE_CHANGED` Sent when a new cell is selected with keys.
- `LV_EVENT_DRAW_PART_BEGIN` and `LV_EVENT_DRAW_PART_END` are sent for the following types:
- `LV_TABLE_DRAW_PART_CELL` The individual cells of the table
- - `part`: `LV_PART_ITEMS`
+ - `part`: `LV_PART_ITEMS`
- `draw_area`: area of the indicator
- `rect_dsc`
- `label_dsc`
- - `id`: current row × col count + current column
+ - `id`: current row × col count + current column
See the events of the [Base object](/widgets/obj) too.
@@ -85,11 +81,11 @@ Learn more about [Keys](/overview/indev).
### MicroPython
No examples yet.
-## API
+## API
```eval_rst
.. doxygenfile:: lv_table.h
:project: lvgl
-
+
```
diff --git a/docs/widgets/core/textarea.md b/docs/widgets/core/textarea.md
index deb64c2dd..3beadd5c6 100644
--- a/docs/widgets/core/textarea.md
+++ b/docs/widgets/core/textarea.md
@@ -1,13 +1,9 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/widgets/core/textarea.md
-```
# Text area (lv_textarea)
## Overview
-The Text Area is a [Base object](widgets/obj) with a [Label](/widgets/core/label) and a cursor on it.
-Texts or characters can be added to it.
+The Text Area is a [Base object](widgets/obj) with a [Label](/widgets/core/label) and a cursor on it.
+Texts or characters can be added to it.
Long lines are wrapped and when the text becomes long enough the Text area can be scrolled.
One line mode and password modes are supported.
@@ -16,9 +12,9 @@ One line mode and password modes are supported.
- `LV_PART_MAIN` The background of the text area. Uses all the typical background style properties and the text related style properties including `text_align` to align the text to the left, right or center.
- `LV_PART_SCROLLBAR` The scrollbar that is shown when the text is too long.
- `LV_PART_SELECTED` Determines the style of the [selected text](/widgets/core/label.html#text-selection). Only `text_color` and `bg_color` style properties can be used. `bg_color` should be set directly on the label of the text area.
-- `LV_PART_CURSOR` Marks the position where the characters are inserted. The cursor's area is always the bounding box of the current character.
-A block cursor can be created by adding a background color and background opacity to `LV_PART_CURSOR`'s style. The create line cursor leave the cursor transparent and set a left border.
-The `anim_time` style property sets the cursor's blink time.
+- `LV_PART_CURSOR` Marks the position where the characters are inserted. The cursor's area is always the bounding box of the current character.
+A block cursor can be created by adding a background color and background opacity to `LV_PART_CURSOR`'s style. The create line cursor leave the cursor transparent and set a left border.
+The `anim_time` style property sets the cursor's blink time.
- `LV_PART_TEXTAREA_PLACEHOLDER` Unique to Text Area, allows styling the placeholder text.
## Usage
@@ -40,13 +36,13 @@ A placeholder text can be specified - which is displayed when the Text area is e
### Delete character
-To delete a character from the left of the current cursor position use `lv_textarea_del_char(textarea)`.
+To delete a character from the left of the current cursor position use `lv_textarea_del_char(textarea)`.
To delete from the right use `lv_textarea_del_char_forward(textarea)`
### Move the cursor
-The cursor position can be modified directly like `lv_textarea_set_cursor_pos(textarea, 10)`.
-The `0` position means "before the first characters",
+The cursor position can be modified directly like `lv_textarea_set_cursor_pos(textarea, 10)`.
+The `0` position means "before the first characters",
`LV_TA_CURSOR_LAST` means "after the last character"
You can step the cursor with
@@ -58,45 +54,44 @@ You can step the cursor with
If `lv_textarea_set_cursor_click_pos(textarea, true)` is applied the cursor will jump to the position where the Text area was clicked.
### Hide the cursor
-The cursor is always visible, however it can be a good idea to style it to be visible only in `LV_STATE_FOCUSED` state.
+The cursor is always visible, however it can be a good idea to style it to be visible only in `LV_STATE_FOCUSED` state.
### One line mode
-The Text area can be configured to be on a single line with `lv_textarea_set_one_line(textarea, true)`.
-In this mode the height is set automatically to show only one line, line break characters are ignored, and word wrap is disabled.
+The Text area can be configured to be on a single line with `lv_textarea_set_one_line(textarea, true)`.
+In this mode the height is set automatically to show only one line, line break characters are ignored, and word wrap is disabled.
### Password mode
-The text area supports password mode which can be enabled with `lv_textarea_set_password_mode(textarea, true)`.
+The text area supports password mode which can be enabled with `lv_textarea_set_password_mode(textarea, true)`.
-If the `•` ([Bullet, U+2022](http://www.fileformat.info/info/unicode/char/2022/index.htm)) character exists in the font, the entered characters are converted to it after some time or when a new character is entered.
-If `•` not exists, `*` will be used.
+By default, if the `•` ([Bullet, U+2022](http://www.fileformat.info/info/unicode/char/2022/index.htm)) character exists in the font, the entered characters are converted to it after some time or when a new character is entered. If `•` does not exist in the font, `*` will be used. You can override the default character with `lv_textarea_set_password_bullet(textarea, "x")`.
In password mode `lv_textarea_get_text(textarea)` returns the actual text entered, not the bullet characters.
The visibility time can be adjusted with `LV_TEXTAREA_DEF_PWD_SHOW_TIME)` in `lv_conf.h`.
### Accepted characters
-You can set a list of accepted characters with `lv_textarea_set_accepted_chars(textarea, "0123456789.+-")`.
-Other characters will be ignored.
+You can set a list of accepted characters with `lv_textarea_set_accepted_chars(textarea, "0123456789.+-")`.
+Other characters will be ignored.
### Max text length
The maximum number of characters can be limited with `lv_textarea_set_max_length(textarea, max_char_num)`
### Very long texts
-If there is a very long text in the Text area (e.g. > 20k characters), scrolling and drawing might be slow.
-However, by enabling `LV_LABEL_LONG_TXT_HINT 1` in `lv_conf.h` the performance can be hugely improved.
-This will save some additional information about the label to speed up its drawing.
+If there is a very long text in the Text area (e.g. > 20k characters), scrolling and drawing might be slow.
+However, by enabling `LV_LABEL_LONG_TXT_HINT 1` in `lv_conf.h` the performance can be hugely improved.
+This will save some additional information about the label to speed up its drawing.
Using `LV_LABEL_LONG_TXT_HINT` the scrolling and drawing will as fast as with "normal" short texts.
### Select text
-Any part of the text can be selected if enabled with `lv_textarea_set_text_selection(textarea, true)`.
-This works much like when you select text on your PC with your mouse.
+Any part of the text can be selected if enabled with `lv_textarea_set_text_selection(textarea, true)`.
+This works much like when you select text on your PC with your mouse.
## Events
-- `LV_EVENT_INSERT` Sent right before a character or text is inserted.
-The event parameter is the text about to be inserted. `lv_textarea_set_insert_replace(textarea, "New text")` replaces the text to insert.
+- `LV_EVENT_INSERT` Sent right before a character or text is inserted.
+The event parameter is the text about to be inserted. `lv_textarea_set_insert_replace(textarea, "New text")` replaces the text to insert.
The new text cannot be in a local variable which is destroyed when the event callback exists. `""` means do not insert anything.
-- `LV_EVENT_VALUE_CHANGED` Sent when the content of the text area has been changed.
+- `LV_EVENT_VALUE_CHANGED` Sent when the content of the text area has been changed.
- `LV_EVENT_READY` Sent when `LV_KEY_ENTER` is pressed (or sent) to a one line text area.
See the events of the [Base object](/widgets/obj) too.
@@ -117,11 +112,11 @@ Learn more about [Keys](/overview/indev).
```
-## API
+## API
```eval_rst
.. doxygenfile:: lv_textarea.h
:project: lvgl
-
+
```
diff --git a/docs/widgets/extra/animimg.md b/docs/widgets/extra/animimg.md
index e36adf0e8..4727033ce 100644
--- a/docs/widgets/extra/animimg.md
+++ b/docs/widgets/extra/animimg.md
@@ -1,7 +1,3 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/widgets/extra/animimg.md
-```
# Animation Image (lv_animimg)
## Overview
@@ -13,13 +9,13 @@ You can specify a duration and repeat count.
## Parts and Styles
- `LV_PART_MAIN` A background rectangle that uses the typical background style properties and the image itself using the image style properties.
-
+
## Usage
### Image sources
To set the image in a state, use the `lv_animimg_set_src(imgbtn, dsc[], num)`.
-
+
## Events
No special events are sent by image objects.
diff --git a/docs/widgets/extra/calendar.md b/docs/widgets/extra/calendar.md
index 6ce18b2a0..5dd601d17 100644
--- a/docs/widgets/extra/calendar.md
+++ b/docs/widgets/extra/calendar.md
@@ -1,14 +1,10 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/widgets/extra/calendar.md
-```
# Calendar (lv_calendar)
## Overview
The Calendar object is a classic calendar which can:
-- show the days of any month in a 7x7 matrix
-- Show the name of the days
+- show the days of any month in a 7x7 matrix
+- Show the name of the days
- highlight the current day (today)
- highlight any user-defined dates
@@ -45,7 +41,7 @@ The name of the days can be adjusted with `lv_calendar_set_day_names(calendar, d
Only the pointer of the day names is saved so the elements should be static, global or constant variables.
## Events
-- `LV_EVENT_VALUE_CHANGED` Sent if a date is clicked. `lv_calendar_get_pressed_date(calendar, &date)` set `date` to the date currently being pressed. Returns `LV_RES_OK` if there is a valid pressed date, else `LV_RES_INV`.
+- `LV_EVENT_VALUE_CHANGED` Sent if a date is clicked. `lv_calendar_get_pressed_date(calendar, &date)` set `date` to the date currently being pressed. Returns `LV_RES_OK` if there is a valid pressed date, else `LV_RES_INV`.
Learn more about [Events](/overview/event).
@@ -66,7 +62,7 @@ Learn more about [Keys](/overview/indev).
### Drop-down
`lv_calendar_header_dropdown_create(calendar)` creates a header that contains 2 drop-drown lists: one for the year and another for the month.
-
+
## Example
diff --git a/docs/widgets/extra/chart.md b/docs/widgets/extra/chart.md
index e6924ac8e..4123fbc70 100644
--- a/docs/widgets/extra/chart.md
+++ b/docs/widgets/extra/chart.md
@@ -1,7 +1,3 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/widgets/extra/chart.md
-```
# Chart (lv_chart)
## Overview
@@ -16,11 +12,11 @@ Charts can have:
- scrolling and zooming
## Parts and Styles
-- `LV_PART_MAIN` The background of the chart. Uses all the typical background and *line* (for the division lines) related style properties. *Padding* makes the series area smaller.
+- `LV_PART_MAIN` The background of the chart. Uses all the typical background and *line* (for the division lines) related style properties. *Padding* makes the series area smaller. For column charts `pad_column` sets the space between the columns of the adjacent indices.
- `LV_PART_SCROLLBAR` The scrollbar used if the chart is zoomed. See the [Base object](/widgets/obj)'s documentation for details.
- `LV_PART_ITEMS` Refers to the line or bar series.
- Line chart: The *line* properties are used by the lines. `width`, `height`, `bg_color` and `radius` is used to set the appearance of points.
- - Bar chart: The typical background properties are used to style the bars.
+ - Bar chart: The typical background properties are used to style the bars. `pad_column` sets the space between the columns on the same index.
- `LV_PART_INDICATOR` Refers to the points on line and scatter chart (small circles or squares).
- `LV_PART_CURSOR` *Line* properties are used to style the cursors. `width`, `height`, `bg_color` and `radius` are used to set the appearance of points.
- `LV_PART_TICKS` *Line* and *Text* style properties are used to style the ticks
@@ -35,7 +31,7 @@ The following data display types exist:
- `LV_CHART_TYPE_BAR` - Draw bars.
- `LV_CHART_TYPE_SCATTER` - X/Y chart drawing point's and lines between the points. .
-You can specify the display type with `lv_chart_set_type(chart, LV_CHART_TYPE_...)`.
+You can specify the display type with `lv_chart_set_type(chart, LV_CHART_TYPE_...)`.
### Data series
@@ -49,9 +45,9 @@ You can add any number of series to the charts by `lv_chart_add_series(chart, co
`axis` tells which axis's range should be used te scale the values.
-`lv_chart_set_ext_y_array(chart, ser, value_array)` makes the chart use an external array for the given series.
+`lv_chart_set_ext_y_array(chart, ser, value_array)` makes the chart use an external array for the given series.
`value_array` should look like this: `lv_coord_t * value_array[num_points]`. The array size needs to be large enough to hold all the points of that series.
-The array's pointer will be saved in the chart so it needs to be global, static or dynamically allocated.
+The array's pointer will be saved in the chart so it needs to be global, static or dynamically allocated.
Note: you should call `lv_chart_refresh(chart)` after the external data source has been updated to update the chart.
The value array of a series can be obtained with `lv_chart_get_y_array(chart, ser)`, which can be used with `ext_array` or *normal array*s.
@@ -79,22 +75,22 @@ The update mode can be changed with `lv_chart_set_update_mode(chart, LV_CHART_UP
### Number of points
The number of points in the series can be modified by `lv_chart_set_point_count(chart, point_num)`. The default value is 10.
-Note: this also affects the number of points processed when an external buffer is assigned to a series, so you need to be sure the external array is large enough.
+Note: this also affects the number of points processed when an external buffer is assigned to a series, so you need to be sure the external array is large enough.
#### Handling large number of points
-On line charts, if the number of points is greater than the pixels horizontally, the Chart will draw only vertical lines to make the drawing of large amount of data effective.
+On line charts, if the number of points is greater than the pixels horizontally, the Chart will draw only vertical lines to make the drawing of large amount of data effective.
If there are, let's say, 10 points to a pixel, LVGL searches the smallest and the largest value and draws a vertical lines between them to ensure no peaks are missed.
### Vertical range
-You can specify the minimum and maximum values in y-direction with `lv_chart_set_range(chart, axis, min, max)`.
+You can specify the minimum and maximum values in y-direction with `lv_chart_set_range(chart, axis, min, max)`.
`axis` can be `LV_CHART_AXIS_PRIMARY` (left axis) or `LV_CHART_AXIS_SECONDARY` (right axis).
The value of the points will be scaled proportionally. The default range is: 0..100.
### Division lines
-The number of horizontal and vertical division lines can be modified by `lv_chart_set_div_line_count(chart, hdiv_num, vdiv_num)`.
-The default settings are 3 horizontal and 5 vertical division lines.
-If there is a visible border on a side and no padding on that side, the division line would be drawn on top of the border and therefore it won't be drawn.
+The number of horizontal and vertical division lines can be modified by `lv_chart_set_div_line_count(chart, hdiv_num, vdiv_num)`.
+The default settings are 3 horizontal and 5 vertical division lines.
+If there is a visible border on a side and no padding on that side, the division line would be drawn on top of the border and therefore it won't be drawn.
### Override default start point for series
If you want a plot to start from a point other than the default which is `point[0]` of the series, you can set an alternative
@@ -119,15 +115,15 @@ If `factor` is 256 there is no zoom. 512 means double zoom, etc. Fractional valu
### Cursor
-A cursor can be added with `lv_chart_cursor_t * c1 = lv_chart_add_cursor(chart, color, dir);`.
-The possible values of `dir` `LV_DIR_NONE/RIGHT/UP/LEFT/DOWN/HOR/VER/ALL` or their OR-ed values to tell in which direction(s) should the cursor be drawn.
+A cursor can be added with `lv_chart_cursor_t * c1 = lv_chart_add_cursor(chart, color, dir);`.
+The possible values of `dir` `LV_DIR_NONE/RIGHT/UP/LEFT/DOWN/HOR/VER/ALL` or their OR-ed values to tell in which direction(s) should the cursor be drawn.
-`lv_chart_set_cursor_pos(chart, cursor, &point)` sets the position of the cursor.
+`lv_chart_set_cursor_pos(chart, cursor, &point)` sets the position of the cursor.
`pos` is a pointer to an `lv_point_t` variable. E.g. `lv_point_t point = {10, 20};`. If the chart is scrolled the cursor will remain in the same place.
`lv_chart_get_point_pos_by_id(chart, series, id, &point_out)` gets the coordinate of a given point. It's useful to place the cursor at a given point.
-`lv_chart_set_cursor_point(chart, cursor, series, point_id)` sticks the cursor at a point. If the point's position changes (new value or scrolling) the cursor will move with the point.
+`lv_chart_set_cursor_point(chart, cursor, series, point_id)` sticks the cursor at a point. If the point's position changes (new value or scrolling) the cursor will move with the point.
## Events
- `LV_EVENT_VALUE_CHANGED` Sent when a new point is clicked pressed. `lv_chart_get_pressed_point(chart)` returns the zero-based index of the pressed point.
@@ -135,12 +131,12 @@ The possible values of `dir` `LV_DIR_NONE/RIGHT/UP/LEFT/DOWN/HOR/VER/ALL` or th
- `LV_CHART_DRAW_PART_DIV_LINE_INIT` Used before/after drawn the div lines to add masks to any extra drawings. The following fields are set:
- `part`: `LV_PART_MAIN`
- `line_dsc`
- - `LV_CHART_DRAW_PART_DIV_LINE_HOR`, `LV_CHART_DRAW_PART_DIV_LINE_VER` Used for each horizontal and vertical division lines.
- - `part`: `LV_PART_MAIN`
+ - `LV_CHART_DRAW_PART_DIV_LINE_HOR`, `LV_CHART_DRAW_PART_DIV_LINE_VER` Used for each horizontal and vertical division lines.
+ - `part`: `LV_PART_MAIN`
- `id`: index of the line
- `p1`, `p2`: points of the line
- `line_dsc`
- - `LV_CHART_DRAW_PART_LINE_AND_POINT` Used on line and scatter charts for lines and points.
+ - `LV_CHART_DRAW_PART_LINE_AND_POINT` Used on line and scatter charts for lines and points.
- `part`: `LV_PART_ITEMS`
- `id`: index of the point
- `value`: value of `id`th point
@@ -149,29 +145,29 @@ The possible values of `dir` `LV_DIR_NONE/RIGHT/UP/LEFT/DOWN/HOR/VER/ALL` or th
- `line_dsc`
- `rect_dsc`
- `sub_part_ptr`: pointer to the series
- - `LV_CHART_DRAW_PART_BAR` Used on bar charts for the rectangles.
+ - `LV_CHART_DRAW_PART_BAR` Used on bar charts for the rectangles.
- `part`: `LV_PART_ITEMS`
- `id`: index of the point
- - `value`: value of `id`th point
+ - `value`: value of `id`th point
- `draw_area`: area of the point
- `rect_dsc`:
- `sub_part_ptr`: pointer to the series
- `LV_CHART_DRAW_PART_CURSOR` Used on cursor lines and points.
- - `part`: `LV_PART_CURSOR`
+ - `part`: `LV_PART_CURSOR`
- `p1`, `p2`: points of the line
- `line_dsc`
- `rect_dsc`
- `draw_area`: area of the points
- `LV_CHART_DRAW_PART_TICK_LABEL` Used on tick lines and labels.
- - `part`: `LV_PART_TICKS`
+ - `part`: `LV_PART_TICKS`
- `id`: axis
- `value`: value of the tick
- `text`: `value` converted to decimal or `NULL` for minor ticks
- `line_dsc`,
- `label_dsc`,
-
+
See the events of the [Base object](/widgets/obj) too.
-
+
Learn more about [Events](/overview/event).
## Keys
diff --git a/docs/widgets/extra/colorwheel.md b/docs/widgets/extra/colorwheel.md
index e0132b777..4c8d7c6fe 100644
--- a/docs/widgets/extra/colorwheel.md
+++ b/docs/widgets/extra/colorwheel.md
@@ -1,11 +1,7 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/widgets/extra/colorwheel.md
-```
# Color wheel (lv_colorwheel)
## Overview
-As its name implies *Color wheel* allows the user to select a color. The Hue, Saturation and Value of the color can be selected separately.
+As its name implies *Color wheel* allows the user to select a color. The Hue, Saturation and Value of the color can be selected separately.
Long pressing the object, the color wheel will change to the next parameter of the color (hue, saturation or value). A double click will reset the current parameter.
@@ -17,7 +13,7 @@ Long pressing the object, the color wheel will change to the next parameter of t
### Create a color wheel
-`lv_colorwheel_create(parent, knob_recolor)` creates a new color wheel. With `knob_recolor=true` the knob's background color will be set to the current color.
+`lv_colorwheel_create(parent, knob_recolor)` creates a new color wheel. With `knob_recolor=true` the knob's background color will be set to the current color.
### Set color
diff --git a/docs/widgets/extra/imgbtn.md b/docs/widgets/extra/imgbtn.md
index 11c5f2ccb..2df401095 100644
--- a/docs/widgets/extra/imgbtn.md
+++ b/docs/widgets/extra/imgbtn.md
@@ -1,7 +1,3 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/widgets/extra/imgbtn.md
-```
# Image button (lv_imgbtn)
## Overview
@@ -19,7 +15,7 @@ You can set a left, right and center image, and the center image will be repeate
### Image sources
To set the image in a state, use the `lv_imgbtn_set_src(imgbtn, LV_IMGBTN_STATE_..., src_left, src_center, src_right)`.
-
+
The image sources work the same as described in the [Image object](/widgets/core/img) except that "Symbols" are not supported by the Image button.
Any of the sources can `NULL`.
@@ -31,7 +27,7 @@ The possible states are:
- `LV_IMGBTN_STATE_CHECKED_PRESSED`
- `LV_IMGBTN_STATE_CHECKED_DISABLED`
-If you set sources only in `LV_IMGBTN_STATE_RELEASED`, these sources will be used in other states too.
+If you set sources only in `LV_IMGBTN_STATE_RELEASED`, these sources will be used in other states too.
If you set e.g. `LV_IMGBTN_STATE_PRESSED` they will be used in pressed state instead of the released images.
diff --git a/docs/widgets/extra/index.md b/docs/widgets/extra/index.md
index 5e539c1a0..cb5cf298f 100644
--- a/docs/widgets/extra/index.md
+++ b/docs/widgets/extra/index.md
@@ -1,14 +1,10 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/object-types/index.md
-```
# Extra widgets
```eval_rst
.. toctree::
:maxdepth: 1
-
+
animimg
calendar
chart
diff --git a/docs/widgets/extra/keyboard.md b/docs/widgets/extra/keyboard.md
index f03255ab8..037c0e9ec 100644
--- a/docs/widgets/extra/keyboard.md
+++ b/docs/widgets/extra/keyboard.md
@@ -1,7 +1,3 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/widgets/extra/keyboard.md
-```
# Keyboard (lv_keyboard)
@@ -11,7 +7,7 @@
The Keyboard object is a special [Button matrix](/widgets/core/btnmatrix) with predefined keymaps and other features to realize a virtual keyboard to write texts into a [Text area](/widgets/core/textarea).
## Parts and Styles
-Similarly to Button matrices Keyboards consist of 2 part:
+Similarly to Button matrices Keyboards consist of 2 part:
- `LV_PART_MAIN` The main part. Uses all the typical background properties
- `LV_PART_ITEMS` The buttons. Also uses all typical background properties as well as the *text* properties.
@@ -43,7 +39,7 @@ The popovers currently are merely a visual effect and don't allow selecting addi
### New Keymap
You can specify a new map (layout) for the keyboard with `lv_keyboard_set_map(kb, map)` and `lv_keyboard_set_ctrl_map(kb, ctrl_map)`.
Learn more about the [Button matrix](/widgets/core/btnmatrix) object.
-Keep in mind that using following keywords will have the same effect as with the original map:
+Keep in mind that using following keywords will have the same effect as with the original map:
- `LV_SYMBOL_OK` Apply.
- `LV_SYMBOL_CLOSE` or `LV_SYMBOL_KEYBOARD` Close.
- `LV_SYMBOL_BACKSPACE` Delete on the left.
diff --git a/docs/widgets/extra/led.md b/docs/widgets/extra/led.md
index c4b5d7555..586c70c05 100644
--- a/docs/widgets/extra/led.md
+++ b/docs/widgets/extra/led.md
@@ -1,7 +1,3 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/widgets/extra/led.md
-```
# LED (lv_led)
## Overview
@@ -25,11 +21,11 @@ Use `lv_led_on(led)` and `lv_led_off(led)` to set the brightness to a predefined
## Events
- `LV_EVENT_DRAW_PART_BEGIN` and `LV_EVENT_DRAW_PART_END` is sent for the following types:
- - `LV_LED_DRAW_PART_RECTANGLE` The main rectangle. `LV_OBJ_DRAW_PART_RECTANGLE` is not sent by the base object.
+ - `LV_LED_DRAW_PART_RECTANGLE` The main rectangle. `LV_OBJ_DRAW_PART_RECTANGLE` is not sent by the base object.
- `part`: `LV_PART_MAIN`
- `rect_dsc`
- `draw_area`: the area of the rectangle
-
+
See the events of the [Base object](/widgets/obj) too.
@@ -48,11 +44,11 @@ Learn more about [Keys](/overview/indev).
```
-## API
+## API
```eval_rst
.. doxygenfile:: lv_led.h
:project: lvgl
-
+
```
diff --git a/docs/widgets/extra/list.md b/docs/widgets/extra/list.md
index c77a526f0..0742b2a0e 100644
--- a/docs/widgets/extra/list.md
+++ b/docs/widgets/extra/list.md
@@ -1,11 +1,7 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/widgets/extra/list.md
-```
# List (lv_list)
## Overview
-The List is basically a rectangle with vertical layout to which Buttons and Texts can be added
+The List is basically a rectangle with vertical layout to which Buttons and Texts can be added
## Parts and Styles
@@ -45,11 +41,11 @@ Learn more about [Keys](/overview/indev).
```
-## API
+## API
```eval_rst
.. doxygenfile:: lv_list.h
:project: lvgl
-
+
```
diff --git a/docs/widgets/extra/menu.md b/docs/widgets/extra/menu.md
index e73768471..bb8992b49 100644
--- a/docs/widgets/extra/menu.md
+++ b/docs/widgets/extra/menu.md
@@ -1,7 +1,3 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/widgets/extra/menu.md
-```
# Menu (lv_menu)
## Overview
@@ -31,7 +27,7 @@ The following header modes exist:
- `LV_MENU_HEADER_TOP_UNFIXED` Header is positioned at the top and can be scrolled out of view.
- `LV_MENU_HEADER_BOTTOM_FIXED` Header is positioned at the bottom.
-You can set header modes with `lv_menu_set_mode_header(menu, LV_MENU_HEADER...)`.
+You can set header modes with `lv_menu_set_mode_header(menu, LV_MENU_HEADER...)`.
### Root back button mode
The following root back button modes exist:
@@ -66,7 +62,7 @@ The following objects can be created so that it is easier to style the menu:
- `LV_EVENT_VALUE_CHANGED` Sent when a page is shown.
- `lv_menu_get_cur_main_page(menu)` returns a pointer to menu page that is currently displayed in main.
- `lv_menu_get_cur_sidebar_page(menu)` returns a pointer to menu page that is currently displayed in sidebar.
-- `LV_EVENT_CLICKED` Sent when a back btn in a header from either main or sidebar is clicked. `LV_OBJ_FLAG_EVENT_BUBBLE` is enabled on the buttons so you can add events to the menu itself.
+- `LV_EVENT_CLICKED` Sent when a back btn in a header from either main or sidebar is clicked. `LV_OBJ_FLAG_EVENT_BUBBLE` is enabled on the buttons so you can add events to the menu itself.
- `lv_menu_back_btn_is_root(menu, btn)` to check if btn is root back btn
See the events of the [Base object](/widgets/obj) too.
@@ -85,10 +81,10 @@ Learn more about [Keys](/overview/indev).
.. include:: ../../../examples/widgets/menu/index.rst
```
-## API
+## API
```eval_rst
.. doxygenfile:: lv_menu.h
:project: lvgl
-
+
```
\ No newline at end of file
diff --git a/docs/widgets/extra/meter.md b/docs/widgets/extra/meter.md
index c831d7c8a..2d9a0f9d7 100644
--- a/docs/widgets/extra/meter.md
+++ b/docs/widgets/extra/meter.md
@@ -1,14 +1,10 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/widgets/extra/meter.md
-```
# Meter (lv_meter)
## Overview
The Meter widget can visualize data in very flexible ways. In can show arcs, needles, ticks lines and labels.
## Parts and Styles
-- `LV_PART_MAIN` The background of the Meter. Uses the typical background properties.
+- `LV_PART_MAIN` The background of the Meter. Uses the typical background properties.
- `LV_PART_TICK` The tick lines a labels using the *line* and *text* style properties.
- `LV_PART_INDICATOR` The needle line or image using the *line* and *img* style properties, as well as the background properties to draw a square (or circle) on the pivot of the needles. Padding makes the square larger.
- `LV_PART_ITEMS` The arcs using the *arc* properties.
@@ -17,7 +13,7 @@ The Meter widget can visualize data in very flexible ways. In can show arcs, nee
### Add a scale
-First a *Scale* needs to be added to the Meter with `lv_meter_scale_t * scale = lv_meter_add_scale(meter)`.
+First a *Scale* needs to be added to the Meter with `lv_meter_scale_t * scale = lv_meter_add_scale(meter)`.
The Scale has minor and major ticks and labels on the major ticks. Later indicators (needles, arcs, tick modifiers) can be added to the meter
Any number of scales can be added to Meter.
@@ -45,22 +41,22 @@ All the indicator add functions return `lv_meter_indicator_t *`.
#### Needle image
`indic = lv_meter_add_needle_img(meter, scale, img_src, pivot_x, pivot_y)` sets an image that will be used as a needle. `img_src` should be a needle pointing to the right like this `-O--->`.
-`pivot_x` and `pivot_y` sets the pivot point of the rotation relative to the top left corner of the image.
+`pivot_x` and `pivot_y` sets the pivot point of the rotation relative to the top left corner of the image.
`lv_meter_set_indicator_value(meter, inidicator, value)` sets the value of the indicator.
#### Arc
`indic = lv_meter_add_arc(meter, scale, arc_width, arc_color, r_mod)` adds and arc indicator. . By default, the radius of the arc is the same as the scale's radius but `r_mod` changes the radius.
-`lv_meter_set_indicator_start_value(meter, indic, value)` and `lv_meter_set_indicator_end_value(meter, inidicator, value)` sets the value of the indicator.
+`lv_meter_set_indicator_start_value(meter, indic, value)` and `lv_meter_set_indicator_end_value(meter, inidicator, value)` sets the value of the indicator.
#### Scale lines (ticks)
-`indic = lv_meter_add_scale_lines(meter, scale, color_start, color_end, local, width_mod)` adds an indicator that modifies the ticks lines.
-If `local` is `true` the ticks' color will be faded from `color_start` to `color_end` in the indicator's start and end value range.
+`indic = lv_meter_add_scale_lines(meter, scale, color_start, color_end, local, width_mod)` adds an indicator that modifies the ticks lines.
+If `local` is `true` the ticks' color will be faded from `color_start` to `color_end` in the indicator's start and end value range.
If `local` is `false` `color_start` and `color_end` will be mapped to the start and end value of the scale and only a "slice" of that color gradient will be visible in the indicator's start and end value range.
`width_mod` modifies the width of the tick lines.
-`lv_meter_set_indicator_start_value(meter, inidicator, value)` and `lv_meter_set_indicator_end_value(meter, inidicator, value)` sets the value of the indicator.
+`lv_meter_set_indicator_start_value(meter, inidicator, value)` and `lv_meter_set_indicator_end_value(meter, inidicator, value)` sets the value of the indicator.
## Events
- `LV_EVENT_DRAW_PART_BEGIN` and `LV_EVENT_DRAW_PART_END` is sent for the following types:
@@ -85,12 +81,12 @@ If `local` is `false` `color_start` and `color_end` will be mapped to the start
- `value`: the value of the line
- `text`: `value` converted to decimal or `NULL` on minor lines
- `label_dsc`: label draw descriptor or `NULL` on minor lines
- - `line_dsc`:
- - `id`: the index of the line
-
-
+ - `line_dsc`:
+ - `id`: the index of the line
+
+
See the events of the [Base object](/widgets/obj) too.
-
+
Learn more about [Events](/overview/event).
## Keys
@@ -107,11 +103,11 @@ Learn more about [Keys](/overview/indev).
```
-## API
+## API
```eval_rst
.. doxygenfile:: lv_meter.h
:project: lvgl
-
+
```
diff --git a/docs/widgets/extra/msgbox.md b/docs/widgets/extra/msgbox.md
index 3ff67849c..a0bdbf38a 100644
--- a/docs/widgets/extra/msgbox.md
+++ b/docs/widgets/extra/msgbox.md
@@ -1,11 +1,7 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/widgets/extra/msgbox.md
-```
# Message box (lv_msgbox)
## Overview
-The Message boxes act as pop-ups.
+The Message boxes act as pop-ups.
They are built from a background container, a title, an optional close button, a text and optional buttons.
The text will be broken into multiple lines automatically and the height will be set automatically to include the text and the buttons.
@@ -25,13 +21,13 @@ The message box is built from other widgets, so you can check these widgets' doc
`lv_msgbox_create(parent, title, txt, btn_txts[], add_close_btn)` creates a message box.
-If `parent` is `NULL` the message box will be modal. `title` and `txt` are strings for the title and the text.
+If `parent` is `NULL` the message box will be modal. `title` and `txt` are strings for the title and the text.
`btn_txts[]` is an array with the buttons' text. E.g. `const char * btn_txts[] = {"Ok", "Cancel", NULL}`.
-`add_colse_btn` can be `true` or `false` to add/don't add a close button.
+`add_close_btn` can be `true` or `false` to add/don't add a close button.
### Get the parts
The building blocks of the message box can be obtained using the following functions:
-```c
+```c
lv_obj_t * lv_msgbox_get_title(lv_obj_t * mbox);
lv_obj_t * lv_msgbox_get_close_btn(lv_obj_t * mbox);
lv_obj_t * lv_msgbox_get_text(lv_obj_t * mbox);
@@ -42,7 +38,7 @@ lv_obj_t * lv_msgbox_get_btns(lv_obj_t * mbox);
`lv_msgbox_close(msgbox)` closes (deletes) the message box.
## Events
-- `LV_EVENT_VALUE_CHANGED` is sent by the buttons if one of them is clicked. `LV_OBJ_FLAG_EVENT_BUBBLE` is enabled on the buttons so you can add events to the message box itself.
+- `LV_EVENT_VALUE_CHANGED` is sent by the buttons if one of them is clicked. `LV_OBJ_FLAG_EVENT_BUBBLE` is enabled on the buttons so you can add events to the message box itself.
In the event handler, `lv_event_get_target(e)` will return the button matrix and `lv_event_get_current_target(e)` will return the message box. `lv_msgbox_get_active_btn(msgbox)` and `lv_msgbox_get_active_btn_text(msgbox)` can be used to get the index and text of the clicked button.
Learn more about [Events](/overview/event).
@@ -61,11 +57,11 @@ Learn more about [Keys](/overview/indev).
```
-## API
+## API
```eval_rst
.. doxygenfile:: lv_msgbox.h
:project: lvgl
-
+
```
diff --git a/docs/widgets/extra/span.md b/docs/widgets/extra/span.md
index f3ddb4486..fb18a6079 100644
--- a/docs/widgets/extra/span.md
+++ b/docs/widgets/extra/span.md
@@ -1,7 +1,3 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/widgets/extra/span.md
-```
# Span (lv_span)
## Overview
@@ -10,7 +6,7 @@ A spangroup is the object that is used to display rich text. Different from the
## Parts and Styles
- `LV_PART_MAIN` The spangroup has only one part.
-
+
## Usage
### Set text and style
@@ -58,8 +54,11 @@ Use `lv_spangroup_set_overflow(spangroup, LV_SPAN_OVERFLOW_CLIP)` to set object
### first line indent
Use `lv_spangroup_set_indent(spangroup, 20)` to set the indent of the first line. all modes support pixel units, in addition to LV_SPAN_MODE_FIXED and LV_SPAN_MODE_BREAK mode supports percentage units too.
+### lines
+Use `lv_spangroup_set_lines(spangroup, 10)` to set the maximum number of lines to be displayed in LV_SPAN_MODE_BREAK mode, negative values indicate no limit.
+
## Events
-No special events are sent by this widget.
+No special events are sent by this widget.
Learn more about [Events](/overview/event).
diff --git a/docs/widgets/extra/spinbox.md b/docs/widgets/extra/spinbox.md
index 1b4444e21..425b2c353 100644
--- a/docs/widgets/extra/spinbox.md
+++ b/docs/widgets/extra/spinbox.md
@@ -1,11 +1,7 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/widgets/extra/spinbox.md
-```
# Spinbox (lv_spinbox)
## Overview
-The Spinbox contains a number as text which can be increased or decreased by *Keys* or API functions.
+The Spinbox contains a number as text which can be increased or decreased by *Keys* or API functions.
Under the hood the Spinbox is a modified [Text area](/widgets/core/textarea).
## Parts and Styles
@@ -14,13 +10,13 @@ The parts of the Spinbox are identical to the [Text area](/widgets/core/textarea
### Value, range and step
`lv_spinbox_set_value(spinbox, 1234)` sets a new value on the Spinbox.
-`lv_spinbox_increment(spinbox)` and `lv_spinbox_decrement(spinbox)` increments/decrements the value of the Spinbox according to the currently selected digit.
+`lv_spinbox_increment(spinbox)` and `lv_spinbox_decrement(spinbox)` increments/decrements the value of the Spinbox according to the currently selected digit.
`lv_spinbox_set_range(spinbox, -1000, 2500)` sets a range. If the value is changed by `lv_spinbox_set_value`, by *Keys*,`lv_spinbox_increment/decrement` this range will be respected.
-`lv_spinbox_set_step(spinbox, 100)` sets which digits to change on increment/decrement. Only multiples of ten can be set, and not for example 3.
+`lv_spinbox_set_step(spinbox, 100)` sets which digits to change on increment/decrement. Only multiples of ten can be set, and not for example 3.
-`lv_spinbox_set_pos(spinbox, 1)` sets the cursor to a specific digit to change on increment/decrement. For example position '0' sets the cursor to the least significant digit.
+`lv_spinbox_set_cursor_pos(spinbox, 1)` sets the cursor to a specific digit to change on increment/decrement. For example position '0' sets the cursor to the least significant digit.
If an encoder is used as input device, the selected digit is shifted to the right by default whenever the encoder button is clicked. To change this behaviour to shifting to the left, the `lv_spinbox_set_digit_step_direction(spinbox, LV_DIR_LEFT)` can be used
@@ -30,7 +26,7 @@ If an encoder is used as input device, the selected digit is shifted to the righ
`separator_position` is the number of digits before the decimal point. If 0, no decimal point is displayed.
### Rollover
-`lv_spinbox_set_rollover(spinbox, true/false)` enables/disabled rollover mode. If either the minimum or maximum value is reached with rollover enabled, the value will change to the other limit. If rollover is disabled the value will remain at the minimum or maximum value.
+`lv_spinbox_set_rollover(spinbox, true/false)` enables/disabled rollover mode. If either the minimum or maximum value is reached with rollover enabled, the value will change to the other limit. If rollover is disabled the value will remain at the minimum or maximum value.
## Events
- `LV_EVENT_VALUE_CHANGED` Sent when the value has changed.
@@ -40,9 +36,9 @@ See the events of the [Text area](/widgets/core/textarea) too.
Learn more about [Events](/overview/event).
## Keys
-- `LV_KEY_LEFT/RIGHT` With *Keypad* move the cursor left/right. With *Encoder* decrement/increment the selected digit.
-- `LV_KEY_UP/DOWN` With *Keypad* and *Encoder* increment/decrement the value.
-- `LV_KEY_ENTER` With *Encoder* got the net digit. Jump to the first after the last.
+- `LV_KEY_LEFT/RIGHT` With *Keypad* move the cursor left/right. With *Encoder* decrement/increment the selected digit.
+- `LV_KEY_UP/DOWN` With *Keypad* and *Encoder* increment/decrement the value.
+- `LV_KEY_ENTER` With *Encoder* got the net digit. Jump to the first after the last.
## Example
@@ -52,12 +48,12 @@ Learn more about [Events](/overview/event).
```
-## API
+## API
```eval_rst
.. doxygenfile:: lv_spinbox.h
:project: lvgl
-
+
```
## Example
diff --git a/docs/widgets/extra/spinner.md b/docs/widgets/extra/spinner.md
index 520e3d905..8c9b37c9c 100644
--- a/docs/widgets/extra/spinner.md
+++ b/docs/widgets/extra/spinner.md
@@ -1,11 +1,7 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/widgets/extra/spinner.md
-```
# Spinner (lv_spinner)
## Overview
-The Spinner object is a spinning arc over a ring.
+The Spinner object is a spinning arc over a ring.
## Parts and Styles
The parts are identical to the parts of [lv_arc](/widgets/core/arc).
@@ -38,11 +34,11 @@ Learn more about [Keys](/overview/indev).
```
-## API
+## API
```eval_rst
.. doxygenfile:: lv_spinner.h
:project: lvgl
-
+
```
diff --git a/docs/widgets/extra/tabview.md b/docs/widgets/extra/tabview.md
index b08b88ca5..51466cf36 100644
--- a/docs/widgets/extra/tabview.md
+++ b/docs/widgets/extra/tabview.md
@@ -1,7 +1,3 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/widgets/extra/tabview.md
-```
# Tabview (lv_tabview)
@@ -14,7 +10,7 @@ The Tab view is built from other widgets:
- Container for the tabs: [lv_obj](/widgets/obj)
- Content of the tabs: [lv_obj](/widgets/obj)
-The tab buttons can be positioned on the top, bottom, left and right side of the Tab view.
+The tab buttons can be positioned on the top, bottom, left and right side of the Tab view.
A new tab can be selected either by clicking on a tab button or by sliding horizontally on the content.
@@ -25,13 +21,17 @@ There are no special parts on the Tab view but the `lv_obj` and `lv_btnnmatrix`
### Create a Tab view
-`lv_tabview_create(parent, tab_pos, tab_size);` creates a new empty Tab view. `tab_pos` can be `LV_DIR_TOP/BOTTOM/LEFT/RIGHT` to position the tab buttons to a side.
+`lv_tabview_create(parent, tab_pos, tab_size);` creates a new empty Tab view. `tab_pos` can be `LV_DIR_TOP/BOTTOM/LEFT/RIGHT` to position the tab buttons to a side.
`tab_size` is the height (in case of `LV_DIR_TOP/BOTTOM`) or width (in case of `LV_DIR_LEFT/RIGHT`) tab buttons.
### Add tabs
New tabs can be added with `lv_tabview_add_tab(tabview, "Tab name")`. This will return a pointer to an [lv_obj](/widgets/obj) object where the tab's content can be created.
+### Rename tabs
+
+A tab can be renamed with `lv_tabview_rename_tab(tabview, tab_id, "New Name")`.
+
### Change tab
To select a new tab you can:
diff --git a/docs/widgets/extra/tileview.md b/docs/widgets/extra/tileview.md
index 9d8feb452..efe3bc6bc 100644
--- a/docs/widgets/extra/tileview.md
+++ b/docs/widgets/extra/tileview.md
@@ -1,14 +1,10 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/widgets/extra/tileview.md
-```
# Tile view (lv_tileview)
## Overview
-The Tile view is a container object whose elements (called *tiles*) can be arranged in grid form.
-A user can navigate between the tiles by swiping.
-Any direction of swiping can be disabled on the tiles individually to not allow moving from one tile to another.
+The Tile view is a container object whose elements (called *tiles*) can be arranged in grid form.
+A user can navigate between the tiles by swiping.
+Any direction of swiping can be disabled on the tiles individually to not allow moving from one tile to another.
If the Tile view is screen sized, the user interface resembles what you may have seen on smartwatches.
@@ -21,8 +17,8 @@ The parts and styles work the same as for [lv_obj](/widgets/obj).
### Add a tile
-`lv_tileview_add_tile(tileview, row_id, col_id, dir)` creates a new tile on the `row_id`th row and `col_id`th column.
-`dir` can be `LV_DIR_LEFT/RIGHT/TOP/BOTTOM/HOR/VER/ALL` or OR-ed values to enable moving to the adjacent tiles into the given direction by swiping.
+`lv_tileview_add_tile(tileview, row_id, col_id, dir)` creates a new tile on the `row_id`th row and `col_id`th column.
+`dir` can be `LV_DIR_LEFT/RIGHT/TOP/BOTTOM/HOR/VER/ALL` or OR-ed values to enable moving to the adjacent tiles into the given direction by swiping.
The returned value is an `lv_obj_t *` on which the content of the tab can be created.
@@ -48,11 +44,11 @@ Learn more about [Keys](/overview/indev).
```
-## API
+## API
```eval_rst
.. doxygenfile:: lv_tileview.h
:project: lvgl
-
+
```
diff --git a/docs/widgets/extra/win.md b/docs/widgets/extra/win.md
index 0262adcce..1db641e5d 100644
--- a/docs/widgets/extra/win.md
+++ b/docs/widgets/extra/win.md
@@ -1,13 +1,9 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/widgets/extra/win.md
-```
# Window (lv_win)
## Overview
-The Window is container-like object built from a header with title and buttons and a content area.
-
+The Window is container-like object built from a header with title and buttons and a content area.
+
## Parts and Styles
The Window is built from other widgets so you can check their documentation for details:
- Background: [lv_obj](/widgets/obj)
@@ -25,12 +21,12 @@ The Window is built from other widgets so you can check their documentation for
### Title and buttons
-Any number of texts (but typically only one) can be added to the header with `lv_win_add_title(win, "The title")`.
+Any number of texts (but typically only one) can be added to the header with `lv_win_add_title(win, "The title")`.
Control buttons can be added to the window's header with `lv_win_add_btn(win, icon, btn_width)`. `icon` can be any image source, and `btn_width` is the width of the button.
The title and the buttons will be added in the order the functions are called. So adding a button, a text and two other buttons will result in a button on the left, a title, and 2 buttons on the right.
-The width of the title is set to take all the remaining space on the header. In other words: it pushes to the right all the buttons that are added after the title.
+The width of the title is set to take all the remaining space on the header. In other words: it pushes to the right all the buttons that are added after the title.
## Get the parts
`lv_win_get_header(win)` returns a pointer to the header, `lv_win_get_content(win)` returns a pointer to the content container to which the content of the window can be added.
@@ -41,7 +37,7 @@ No special events are sent by the windows, however events can be added manually
Learn more about [Events](/overview/event).
## Keys
-No *Keys* are handled by the window.
+No *Keys* are handled by the window.
Learn more about [Keys](/overview/indev).
@@ -55,11 +51,11 @@ Learn more about [Keys](/overview/indev).
```
-## API
+## API
```eval_rst
.. doxygenfile:: lv_win.h
:project: lvgl
-
+
```
diff --git a/docs/widgets/index.md b/docs/widgets/index.md
index 4bff9163f..0d716c276 100644
--- a/docs/widgets/index.md
+++ b/docs/widgets/index.md
@@ -1,14 +1,10 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/object-types/index.md
-```
# Widgets
```eval_rst
.. toctree::
:maxdepth: 1
-
+
obj
core/index
extra/index
diff --git a/docs/widgets/obj.md b/docs/widgets/obj.md
index f8540bc8e..c6354682c 100644
--- a/docs/widgets/obj.md
+++ b/docs/widgets/obj.md
@@ -1,7 +1,3 @@
-```eval_rst
-.. include:: /header.rst
-:github_url: |github_link_base|/widgets/obj.md
-```
# Base object (lv_obj)
## Overview
@@ -13,7 +9,7 @@ The 'Base Object' implements the basic properties of widgets on a screen, such a
- contains the styles
- attributes like *Clickable*, *Scrollable*, etc.
-In object-oriented thinking, it is the base class from which all other objects in LVGL are inherited.
+In object-oriented thinking, it is the base class from which all other objects in LVGL are inherited.
The functions and functionalities of the Base object can be used with other widgets too. For example `lv_obj_set_width(slider, 100)`
@@ -69,7 +65,7 @@ for(i = 0; i < lv_obj_get_child_cnt(parent); i++) {
You can bring an object to the foreground or send it to the background with `lv_obj_move_foreground(obj)` and `lv_obj_move_background(obj)`.
-You can change the index of an object in its parent using `lv_obj_move_to_index(obj, index)`.
+You can change the index of an object in its parent using `lv_obj_move_to_index(obj, index)`.
You can swap the position of two objects with `lv_obj_swap(obj1, obj2)`.
@@ -95,10 +91,10 @@ Read the [Event overview](/overview/event) to learn more about events.
### Styles
Be sure to read the [Style overview](/overview/style). Here only the most essential functions are described.
-A new style can be added to an object with the `lv_obj_add_style(obj, &new_style, selector)` function.
+A new style can be added to an object with the `lv_obj_add_style(obj, &new_style, selector)` function.
`selector` is an ORed combination of part and state(s). E.g. `LV_PART_SCROLLBAR | LV_STATE_PRESSED`.
-The base objects use `LV_PART_MAIN` style properties and `LV_PART_SCROLLBAR` with the typical background style properties.
+The base objects use `LV_PART_MAIN` style properties and `LV_PART_SCROLLBAR` with the typical background style properties.
### Flags
diff --git a/env_support/cmake/custom.cmake b/env_support/cmake/custom.cmake
index cf6f8430c..561698211 100644
--- a/env_support/cmake/custom.cmake
+++ b/env_support/cmake/custom.cmake
@@ -11,11 +11,19 @@ option(LV_CONF_INCLUDE_SIMPLE
option(LV_CONF_PATH "Path defined for lv_conf.h")
get_filename_component(LV_CONF_DIR ${LV_CONF_PATH} DIRECTORY)
+# Option to build shared libraries (as opposed to static), default: OFF
+option(BUILD_SHARED_LIBS "Build shared libraries" OFF)
+
file(GLOB_RECURSE SOURCES ${LVGL_ROOT_DIR}/src/*.c)
file(GLOB_RECURSE EXAMPLE_SOURCES ${LVGL_ROOT_DIR}/examples/*.c)
file(GLOB_RECURSE DEMO_SOURCES ${LVGL_ROOT_DIR}/demos/*.c)
-add_library(lvgl STATIC ${SOURCES})
+if (BUILD_SHARED_LIBS)
+ add_library(lvgl SHARED ${SOURCES})
+else()
+ add_library(lvgl STATIC ${SOURCES})
+endif()
+
add_library(lvgl::lvgl ALIAS lvgl)
add_library(lvgl_examples STATIC ${EXAMPLE_SOURCES})
add_library(lvgl::examples ALIAS lvgl_examples)
@@ -59,9 +67,13 @@ set_target_properties(
lvgl
PROPERTIES OUTPUT_NAME lvgl
ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
+ LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
+ RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
PUBLIC_HEADER "${LVGL_PUBLIC_HEADERS}")
install(
TARGETS lvgl
ARCHIVE DESTINATION "${LIB_INSTALL_DIR}"
+ LIBRARY DESTINATION "${LIB_INSTALL_DIR}"
+ RUNTIME DESTINATION "${LIB_INSTALL_DIR}"
PUBLIC_HEADER DESTINATION "${INC_INSTALL_DIR}")
diff --git a/env_support/cmsis-pack/LVGL.lvgl.1.0.0.pack b/env_support/cmsis-pack/LVGL.lvgl.1.0.6.pack
similarity index 81%
rename from env_support/cmsis-pack/LVGL.lvgl.1.0.0.pack
rename to env_support/cmsis-pack/LVGL.lvgl.1.0.6.pack
index e267e5d11..049a44ea6 100644
Binary files a/env_support/cmsis-pack/LVGL.lvgl.1.0.0.pack and b/env_support/cmsis-pack/LVGL.lvgl.1.0.6.pack differ
diff --git a/env_support/cmsis-pack/LVGL.lvgl.pdsc b/env_support/cmsis-pack/LVGL.lvgl.pdsc
index 9f3699abd..e5033f37a 100644
--- a/env_support/cmsis-pack/LVGL.lvgl.pdsc
+++ b/env_support/cmsis-pack/LVGL.lvgl.pdsc
@@ -28,15 +28,52 @@
https://github.com/lvgl/lvgl/issues/new/choose
LICENCE.txt
-
-
+
https://github.com/lvgl/lvgl.git
-
+
-
+
+ - LVGL 8.3.0 release
+ - Apply patch for memory leaking issue
+ - Apply patch to speed up non normal blend mode
+ - Add 9-key input mode to pinyin
+ - Other minor changes
+
+
+ - LVGL 8.3.0-dev
+ - Monthly update for June
+ - Add Pinyin as input method
+ - Update benchmark to support RGB565-A8
+ - Update support for layers
+
+
+ - LVGL 8.3.0-dev
+ - Monthly update for May
+ - Update drawing service
+ - Update GPU support for Arm-2D library
+ - Update GPU support for NXP PXP/VGLite
+ - Improving the accuracy of benchmark.
+ - Add new colour support for RGB565A8
+
+
+ - LVGL 8.3.0-dev
+ - Monthly update for April
+ - Add GPU support for SWM341-DMA2D
+
+
+ - LVGL 8.3.0-dev
+ - Monthly update for March
+ - Add GPU support for Arm-2D library
+
+
+ - LVGL 8.3.0-dev
+ - Monthly update for February
+
+
- LVGL 8.2.0
- Enable LV_TICK_CUSTOM when perf_counter is detected.
- Celebrate Spring Festival
@@ -49,8 +86,8 @@
SysTick
Performance Analaysis
-
-
+
+
-
+
Require LVGL Essential Service
-
+
+
+ Require Arm-2D Support
+
+
+
-
-
@@ -141,7 +183,7 @@
-->
-
+
-
+
LVGL (Light and Versatile Graphics Library) is a free and open-source graphics library providing everything you need to create an embedded GUI with easy-to-use graphical elements, beautiful visual effects and a low memory footprint.
@@ -171,20 +213,22 @@
-
+
+
+
-
+
@@ -192,11 +236,14 @@
+
+
+
@@ -228,12 +275,12 @@
-
+
-
+
@@ -257,7 +304,7 @@
-
+
@@ -275,35 +322,36 @@
-
+
-
+
-
+
-
+
-
+
/*! \brief use lv_config_cmsis.h which will be pre-included */
#define LV_CONF_SKIP
+#define LV_LVGL_H_INCLUDE_SIMPLE 1
-
+
-
+
/*! \brief Enable LVGL */
-#define RTE_GRAPHICS_LVGL
+#define RTE_GRAPHICS_LVGL
-
+
Porting Templates
-
-
-
+
+
+
@@ -312,59 +360,94 @@
+
+ A 2D image processing library from Arm (i.e. Arm-2D) for All Cortex-M processors including Cortex-M0
+
+
+
+
+
+
+/*! \brief enable Arm-2D support*/
+#define LV_USE_GPU_ARM2D 1
+
+
+
+
+
An hardware acceleration from STM32-DMA2D
-
+
-
+
/*! \brief enable STM32 DMA2D */
#define LV_USE_GPU_STM32_DMA2D 1
-
+
-
- An hardware acceleration from NXP-PXP
+
+ An hardware acceleration from SWM341-DMA2D
-
-
+
+/*! \brief enable SWM341 DMA2D */
+#define LV_USE_GPU_SWM341_DMA2D 1
+
+
+
+
+
+ An hardware acceleration from NXP-PXP
+
+
+
+
+
+
+
+
+
/*! \brief enable NXP PXP */
#define LV_USE_GPU_NXP_PXP 1
-
+
An hardware acceleration from NXP-VGLite
-
+
+
+
+
+
-
+
-
+
/*! \brief enable NXP VGLite */
#define LV_USE_GPU_NXP_VG_LITE 1
-
+
-
+
Extra Themes, Widgets and Layouts
-
+
-
+
@@ -385,20 +468,20 @@
-
+
-
+
-
+
/*! \brief use extra themes, widgets and layouts */
-#define RTE_GRAPHICS_LVGL_USE_EXTRA_THEMES
+#define RTE_GRAPHICS_LVGL_USE_EXTRA_THEMES
-
+
-
+
Add PNG support
@@ -406,13 +489,13 @@
-
+
-
+
/*! \brief enable PNG support */
#define LV_USE_PNG 1
-
+
@@ -421,13 +504,13 @@
-
+
-
+
/*! \brief enable BMP support */
#define LV_USE_BMP 1
-
+
@@ -436,13 +519,13 @@
-
+
-
+
/*! \brief enable freetype support */
#define LV_USE_FREETYPE 1
-
+
@@ -452,13 +535,13 @@
-
+
-
+
/*! \brief enable gif support */
#define LV_USE_GIF 1
-
+
@@ -468,13 +551,13 @@
-
+
-
+
/*! \brief enable sJPG support */
#define LV_USE_SJPG 1
-
+
@@ -484,13 +567,13 @@
-
+
-
+
/*! \brief enable QRCode support */
#define LV_USE_QRCODE 1
-
+
@@ -501,92 +584,109 @@
-
+
-
+
Add RLOTTIE support, an extra librbary is required.
-
+
-
+
/*! \brief enable RLOTTIE support */
#define LV_USE_RLOTTIE 1
-
+
-
+
Add ffmpeg support, an extra librbary is required.
-
+
-
+
/*! \brief enable ffmpeg support */
#define LV_USE_FFMPEG 1
-
+
-
+
+
+ Add Pinyin input method
+
+
+
+
+
+
+
+/*! \brief enable ffmpeg support */
+#define LV_USE_IME_PINYIN 1
+
+
+
+
Add the official benchmark.
-
+
+
+
-
+
-
+
-
+
/*! \brief enable demo:bencharmk */
#define LV_USE_DEMO_BENCHMARK 1
-
+
-
+
Add the demo:widgets
-
+
-
+
-
+
/*! \brief enable demo:widgets support */
#define LV_USE_DEMO_WIDGETS 1
-
+
-
+
-
+
diff --git a/env_support/cmsis-pack/LVGL.pidx b/env_support/cmsis-pack/LVGL.pidx
new file mode 100644
index 000000000..ddfc00895
--- /dev/null
+++ b/env_support/cmsis-pack/LVGL.pidx
@@ -0,0 +1,9 @@
+
+
+ LVGL
+ https://raw.githubusercontent.com/lvgl/lvgl/master/env_support/cmsis-pack/
+ 2022-07-06T00:09:27
+
+
+
+
\ No newline at end of file
diff --git a/env_support/cmsis-pack/README.md b/env_support/cmsis-pack/README.md
index df2074b58..5a73e4e6b 100644
--- a/env_support/cmsis-pack/README.md
+++ b/env_support/cmsis-pack/README.md
@@ -6,7 +6,7 @@
1. Copy the **lv_conf_template.h** to '**cmsis-pack**' directory
-2. Set the macro protector to '1'
+2. Set the macro protector to '1'
```c
...
@@ -15,6 +15,18 @@
...
```
+remove the misleading guide above this code segment.
+
+```c
+/*
+ * Copy this file as `lv_conf.h`
+ * 1. simply next to the `lvgl` folder
+ * 2. or any other places and
+ * - define `LV_CONF_INCLUDE_SIMPLE`
+ * - add the path as include path
+ */
+```
+
3. Add including for '**RTE_Components.h**'
@@ -27,14 +39,19 @@
...
```
-4. Remove macro definitions for
+4. Remove macro definitions for
- LV_USE_GPU_STM32_DMA2D
- LV_USE_GPU_NXP_PXP
- LV_USE_GPU_NXP_VG_LITE
-5. Update macro LV_ATTRIBUTE_MEM_ALIGN to force a WORD alignment.
+ - LV_USE_GPU_SWM341_DMA2D
+ - LV_USE_GPU_ARM2D
+ - LV_USE_IME_PINYIN
+5. Update macro `LV_ATTRIBUTE_MEM_ALIGN` and `LV_ATTRIBUTE_MEM_ALIGN_SIZE` to force a WORD alignment.
```c
-#define LV_ATTRIBUTE_MEM_ALIGN __attribute__((aligned(4)))
+#define LV_ATTRIBUTE_MEM_ALIGN_SIZE 4
+#define LV_ATTRIBUTE_MEM_ALIGN __attribute__((aligned(4)))
```
+Update macro `LV_MEM_SIZE` to `(64*1024U)`.
6. Update Theme related macros:
```c
@@ -64,7 +81,7 @@
#define LV_USE_THEME_MONO 0
#endif
```
-7. Update LV_TICK_CUSTOM related macros:
+7. Update `LV_TICK_CUSTOM` related macros:
```c
/*Use a custom tick source that tells the elapsed time in milliseconds.
*It removes the need to manually update the tick with `lv_tick_inc()`)*/
@@ -72,8 +89,13 @@
#define LV_TICK_CUSTOM 1
#if LV_TICK_CUSTOM
extern uint32_t SystemCoreClock;
- #define LV_TICK_CUSTOM_INCLUDE "perf_counter.h"
- #define LV_TICK_CUSTOM_SYS_TIME_EXPR (get_system_ticks() / (SystemCoreClock / 1000ul))
+ #define LV_TICK_CUSTOM_INCLUDE "perf_counter.h"
+
+ #if __PER_COUNTER_VER__ < 10902ul
+ #define LV_TICK_CUSTOM_SYS_TIME_EXPR ((uint32_t)get_system_ticks() / (SystemCoreClock / 1000ul))
+ #else
+ #define LV_TICK_CUSTOM_SYS_TIME_EXPR get_system_ms()
+ #endif
#endif /*LV_TICK_CUSTOM*/
#else
#define LV_TICK_CUSTOM 0
@@ -83,7 +105,7 @@
#endif /*LV_TICK_CUSTOM*/
#endif /*__PERF_COUNTER__*/
```
-9. Thoroughly remove the 'DEMO USAGE' section.
+9. Thoroughly remove the `DEMO USAGE` section.
10. Thoroughly remove the '3rd party libraries' section.
10. rename '**lv_conf_template.h**' to '**lv_conf_cmsis.h**'.
@@ -111,9 +133,9 @@ echo " "
Update the '**CMSIS_PACK_PATH**' accordingly (Usually just replace the name gabriel with your own windows account name is sufficient.).
-Update the '**PATH_TO_ADD**' to point to the installation folders of **7Zip** and **xmllint**.
+Update the '**PATH_TO_ADD**' to point to the installation folders of **7Zip** and **xmllint**.
-Launch the git-bash and go to the cmsis-pack folder.
+Launch the git-bash and go to the cmsis-pack folder.
enter the following command:
@@ -125,9 +147,9 @@ enter the following command:
### B. For Linux Users
-Update '**PATH_TO_ADD**' if necessary.
+Update '**PATH_TO_ADD**' if necessary.
-go to the cmsis-pack folder.
+go to the **cmsis-pack** folder.
enter the following command:
diff --git a/env_support/cmsis-pack/gen_pack.sh b/env_support/cmsis-pack/gen_pack.sh
index 148e6af69..dedba347c 100644
--- a/env_support/cmsis-pack/gen_pack.sh
+++ b/env_support/cmsis-pack/gen_pack.sh
@@ -1,12 +1,12 @@
#!/bin/bash
-# Version: 1.1
+# Version: 1.1
# Date: 2022-01-11
# This bash script generates a CMSIS Software Pack:
#
# Pre-requisites:
# - bash shell (for Windows: install git for Windows)
# - 7z in path (zip archiving utility)
-# e.g. Ubuntu: sudo apt-get install p7zip-full p7zip-rar)
+# e.g. Ubuntu: sudo apt-get install p7zip-full p7zip-rar)
# - PackChk in path with execute permission
# (see CMSIS-Pack: CMSIS/Utilities//PackChk)
# - xmllint in path (XML schema validation)
@@ -28,7 +28,7 @@ fi
echo $PATH_TO_ADD appended to PATH
echo " "
-# Pack warehouse directory - destination
+# Pack warehouse directory - destination
PACK_WAREHOUSE=./
# Temporary pack build directory
@@ -48,7 +48,7 @@ PACK_DIRS="
../../demos
"
-
+
# Specify file names to be added to pack base directory
PACK_BASE_FILES="
../../LICENCE.txt
@@ -61,7 +61,7 @@ PACK_BASE_FILES="
############ DO NOT EDIT BELOW ###########
echo Starting CMSIS-Pack Generation: `date`
-# Zip utility check
+# Zip utility check
ZIP=7z
type -a $ZIP
errorlevel=$?
@@ -158,11 +158,11 @@ echo Adding files to pack:
echo $PACK_BASE_FILES
echo " "
for f in $PACK_BASE_FILES
-do
- cp -f "$f" $PACK_BUILD/
+do
+ cp -f "$f" $PACK_BUILD/
done
-mv "${PACK_BUILD}/lv_cmsis_pack.txt" "${PACK_BUILD}/lv_cmsis_pack.c"
+mv "${PACK_BUILD}/lv_cmsis_pack.txt" "${PACK_BUILD}/lv_cmsis_pack.c"
# Run Schema Check (for Linux only):
# sudo apt-get install libxml2-utils
diff --git a/env_support/cmsis-pack/lv_cmsis_pack.txt b/env_support/cmsis-pack/lv_cmsis_pack.txt
index 72d7ce79d..e8d58e87e 100644
--- a/env_support/cmsis-pack/lv_cmsis_pack.txt
+++ b/env_support/cmsis-pack/lv_cmsis_pack.txt
@@ -30,7 +30,7 @@
/*********************
* DEFINES
*********************/
-
+
/**********************
* TYPEDEFS
**********************/
@@ -38,15 +38,15 @@
/**********************
* STATIC PROTOTYPES
**********************/
-
+
/**********************
* STATIC VARIABLES
**********************/
-
+
/**********************
* MACROS
**********************/
-
+
/*! \name The macros to identify the compiler */
/*! @{ */
@@ -92,8 +92,8 @@
/*! @} */
#endif
/*! @} */
-
-
+
+
/**********************
* GLOBAL FUNCTIONS
**********************/
diff --git a/env_support/cmsis-pack/lv_conf_cmsis.h b/env_support/cmsis-pack/lv_conf_cmsis.h
index 6a48b420f..cec0fc8e7 100644
--- a/env_support/cmsis-pack/lv_conf_cmsis.h
+++ b/env_support/cmsis-pack/lv_conf_cmsis.h
@@ -1,14 +1,6 @@
/**
* @file lv_conf.h
- * Configuration file for v8.2.0
- */
-
-/*
- * Copy this file as `lv_conf.h`
- * 1. simply next to the `lvgl` folder
- * 2. or any other places and
- * - define `LV_CONF_INCLUDE_SIMPLE`
- * - add the path as include path
+ * Configuration file for v8.3.0
*/
/* clang-format off */
@@ -30,14 +22,14 @@
/*Swap the 2 bytes of RGB565 color. Useful if the display has an 8-bit interface (e.g. SPI)*/
#define LV_COLOR_16_SWAP 0
-/*Enable more complex drawing routines to manage screens transparency.
- *Can be used if the UI is above another layer, e.g. an OSD menu or video player.
- *Requires `LV_COLOR_DEPTH = 32` colors and the screen's `bg_opa` should be set to non LV_OPA_COVER value*/
+/*Enable features to draw on transparent background.
+ *It's required if opa, and transform_* style properties are used.
+ *Can be also used if the UI is above another layer, e.g. an OSD menu or video player.*/
#define LV_COLOR_SCREEN_TRANSP 0
/* Adjust color mix functions rounding. GPUs might calculate color mix (blending) differently.
* 0: round down, 64: round up from x.75, 128: round up from half, 192: round up from x.25, 254: round up */
-#define LV_COLOR_MIX_ROUND_OFS (LV_COLOR_DEPTH == 32 ? 0: 128)
+#define LV_COLOR_MIX_ROUND_OFS 0
/*Images pixels with this color will not be drawn if they are chroma keyed)*/
#define LV_COLOR_CHROMA_KEY lv_color_hex(0x00ff00) /*pure green*/
@@ -50,14 +42,14 @@
#define LV_MEM_CUSTOM 0
#if LV_MEM_CUSTOM == 0
/*Size of the memory available for `lv_mem_alloc()` in bytes (>= 2kB)*/
- #define LV_MEM_SIZE (48U * 1024U) /*[bytes]*/
+ #define LV_MEM_SIZE (64U * 1024U) /*[bytes]*/
/*Set an address for the memory pool instead of allocating it as a normal array. Can be in external SRAM too.*/
#define LV_MEM_ADR 0 /*0: unused*/
/*Instead of an address give a memory allocator that will be called to get a memory pool for LVGL. E.g. my_malloc*/
#if LV_MEM_ADR == 0
- //#define LV_MEM_POOL_INCLUDE your_alloc_library /* Uncomment if using an external allocator*/
- //#define LV_MEM_POOL_ALLOC your_alloc /* Uncomment if using an external allocator*/
+ #undef LV_MEM_POOL_INCLUDE
+ #undef LV_MEM_POOL_ALLOC
#endif
#else /*LV_MEM_CUSTOM*/
@@ -90,8 +82,13 @@
#define LV_TICK_CUSTOM 1
#if LV_TICK_CUSTOM
extern uint32_t SystemCoreClock;
- #define LV_TICK_CUSTOM_INCLUDE "perf_counter.h"
- #define LV_TICK_CUSTOM_SYS_TIME_EXPR (get_system_ticks() / (SystemCoreClock / 1000ul))
+ #define LV_TICK_CUSTOM_INCLUDE "perf_counter.h"
+
+ #if __PER_COUNTER_VER__ < 10902ul
+ #define LV_TICK_CUSTOM_SYS_TIME_EXPR ((uint32_t)get_system_ticks() / (SystemCoreClock / 1000ul))
+ #else
+ #define LV_TICK_CUSTOM_SYS_TIME_EXPR get_system_ms()
+ #endif
#endif /*LV_TICK_CUSTOM*/
#else
#define LV_TICK_CUSTOM 0
@@ -121,42 +118,58 @@
/*Allow buffering some shadow calculation.
*LV_SHADOW_CACHE_SIZE is the max. shadow size to buffer, where shadow size is `shadow_width + radius`
*Caching has LV_SHADOW_CACHE_SIZE^2 RAM cost*/
- #define LV_SHADOW_CACHE_SIZE 0
+ #define LV_SHADOW_CACHE_SIZE 0
/* Set number of maximally cached circle data.
* The circumference of 1/4 circle are saved for anti-aliasing
* radius * 4 bytes are used per circle (the most often used radiuses are saved)
* 0: to disable caching */
- #define LV_CIRCLE_CACHE_SIZE 4
+ #define LV_CIRCLE_CACHE_SIZE 4
#endif /*LV_DRAW_COMPLEX*/
+/**
+ * "Simple layers" are used when a widget has `style_opa < 255` to buffer the widget into a layer
+ * and blend it as an image with the given opacity.
+ * Note that `bg_opa`, `text_opa` etc don't require buffering into layer)
+ * The widget can be buffered in smaller chunks to avoid using large buffers.
+ *
+ * - LV_LAYER_SIMPLE_BUF_SIZE: [bytes] the optimal target buffer size. LVGL will try to allocate it
+ * - LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE: [bytes] used if `LV_LAYER_SIMPLE_BUF_SIZE` couldn't be allocated.
+ *
+ * Both buffer sizes are in bytes.
+ * "Transformed layers" (where transform_angle/zoom properties are used) use larger buffers
+ * and can't be drawn in chunks. So these settings affects only widgets with opacity.
+ */
+#define LV_LAYER_SIMPLE_BUF_SIZE (24 * 1024)
+#define LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE (3 * 1024)
+
/*Default image cache size. Image caching keeps the images opened.
*If only the built-in image formats are used there is no real advantage of caching. (I.e. if no new image decoder is added)
*With complex image decoders (e.g. PNG or JPG) caching can save the continuous open/decode of images.
*However the opened images might consume additional RAM.
*0: to disable caching*/
-#define LV_IMG_CACHE_DEF_SIZE 0
+#define LV_IMG_CACHE_DEF_SIZE 0
/*Number of stops allowed per gradient. Increase this to allow more stops.
*This adds (sizeof(lv_color_t) + 1) bytes per additional stop*/
-#define LV_GRADIENT_MAX_STOPS 2
+#define LV_GRADIENT_MAX_STOPS 2
/*Default gradient buffer size.
*When LVGL calculates the gradient "maps" it can save them into a cache to avoid calculating them again.
*LV_GRAD_CACHE_DEF_SIZE sets the size of this cache in bytes.
*If the cache is too small the map will be allocated only while it's required for the drawing.
*0 mean no caching.*/
-#define LV_GRAD_CACHE_DEF_SIZE 0
+#define LV_GRAD_CACHE_DEF_SIZE 0
/*Allow dithering the gradients (to achieve visual smooth color gradients on limited color depth display)
*LV_DITHER_GRADIENT implies allocating one or two more lines of the object's rendering surface
*The increase in memory consumption is (32 bits * object width) plus 24 bits * object width if using error diffusion */
-#define LV_DITHER_GRADIENT 0
+#define LV_DITHER_GRADIENT 0
#if LV_DITHER_GRADIENT
/*Add support for error diffusion dithering.
*Error diffusion dithering gets a much better visual result, but implies more CPU consumption and memory when drawing.
*The increase in memory consumption is (24 bits * object's width)*/
- #define LV_DITHER_ERROR_DIFFUSION 0
+ #define LV_DITHER_ERROR_DIFFUSION 0
#endif
/*Maximum buffer size to allocate for rotation.
@@ -174,6 +187,11 @@
#define LV_GPU_DMA2D_CMSIS_INCLUDE
#endif
+/*Use SWM341's DMA2D GPU*/
+#if LV_USE_GPU_SWM341_DMA2D
+ #define LV_GPU_SWM341_DMA2D_INCLUDE "SWM341.h"
+#endif
+
/*Use NXP's PXP GPU iMX RTxxx platforms*/
#if LV_USE_GPU_NXP_PXP
/*1: Add default bare metal and FreeRTOS interrupt handling routines for PXP (lv_gpu_nxp_pxp_osa.c)
@@ -184,7 +202,6 @@
#define LV_USE_GPU_NXP_PXP_AUTO_INIT 0
#endif
-
/*Use SDL renderer API*/
#define LV_USE_GPU_SDL 0
#if LV_USE_GPU_SDL
@@ -300,11 +317,11 @@
#define LV_ATTRIBUTE_FLUSH_READY
/*Required alignment size for buffers*/
-#define LV_ATTRIBUTE_MEM_ALIGN_SIZE 1
+#define LV_ATTRIBUTE_MEM_ALIGN_SIZE 4
/*Will be added where memories needs to be aligned (with -Os data might not be aligned to boundary by default).
* E.g. __attribute__((aligned(4)))*/
-#define LV_ATTRIBUTE_MEM_ALIGN __attribute__((aligned(4)))
+#define LV_ATTRIBUTE_MEM_ALIGN __attribute__((aligned(4)))
/*Attribute to mark large constant arrays for example font's bitmaps*/
#define LV_ATTRIBUTE_LARGE_CONST
@@ -386,6 +403,9 @@
#define LV_FONT_SUBPX_BGR 0 /*0: RGB; 1:BGR order*/
#endif
+/*Enable drawing placeholders when glyph dsc is not found*/
+#define LV_USE_FONT_PLACEHOLDER 1
+
/*=================
* TEXT SETTINGS
*=================*/
@@ -440,8 +460,6 @@
#define LV_USE_ARC 1
-#define LV_USE_ANIMIMG 1
-
#define LV_USE_BAR 1
#define LV_USE_BTN 1
@@ -487,6 +505,8 @@
/*-----------
* Widgets
*----------*/
+#define LV_USE_ANIMIMG 1
+
#define LV_USE_CALENDAR 1
#if LV_USE_CALENDAR
#define LV_CALENDAR_WEEK_STARTS_MONDAY 0
@@ -519,6 +539,12 @@
#define LV_USE_MSGBOX 1
+#define LV_USE_SPAN 1
+#if LV_USE_SPAN
+ /*A line text can contain maximum num of span descriptor */
+ #define LV_SPAN_SNIPPET_STACK_SIZE 64
+#endif
+
#define LV_USE_SPINBOX 1
#define LV_USE_SPINNER 1
@@ -529,12 +555,6 @@
#define LV_USE_WIN 1
-#define LV_USE_SPAN 1
-#if LV_USE_SPAN
- /*A line text can contain maximum num of span descriptor */
- #define LV_SPAN_SNIPPET_STACK_SIZE 64
-#endif
-
/*-----------
* Themes
*----------*/
@@ -583,10 +603,36 @@
#define LV_USE_SNAPSHOT 0
/*1: Enable Monkey test*/
-#define LV_USE_MONKEY 0
+#define LV_USE_MONKEY 0
/*1: Enable grid navigation*/
-#define LV_USE_GRIDNAV 0
+#define LV_USE_GRIDNAV 0
+
+/*1: Enable lv_obj fragment*/
+#define LV_USE_FRAGMENT 0
+
+/*1: Support using images as font in label or span widgets */
+#define LV_USE_IMGFONT 0
+
+/*1: Enable a published subscriber based messaging system */
+#define LV_USE_MSG 0
+
+/*1: Enable Pinyin input method*/
+/*Requires: lv_keyboard*/
+#if LV_USE_IME_PINYIN
+ /*1: Use default thesaurus*/
+ /*If you do not use the default thesaurus, be sure to use `lv_ime_pinyin` after setting the thesauruss*/
+ #define LV_IME_PINYIN_USE_DEFAULT_DICT 1
+ /*Set the maximum number of candidate panels that can be displayed*/
+ /*This needs to be adjusted according to the size of the screen*/
+ #define LV_IME_PINYIN_CAND_TEXT_NUM 6
+
+ /*Use 9 key input(k9)*/
+ #define LV_IME_PINYIN_USE_K9_MODE 1
+ #if LV_IME_PINYIN_USE_K9_MODE == 1
+ #define LV_IME_PINYIN_K9_CAND_TEXT_NUM 3
+ #endif // LV_IME_PINYIN_USE_K9_MODE
+#endif
/*==================
* EXAMPLES
diff --git a/env_support/rt-thread/SConscript b/env_support/rt-thread/SConscript
index 7f6048404..378c36f3b 100644
--- a/env_support/rt-thread/SConscript
+++ b/env_support/rt-thread/SConscript
@@ -1,13 +1,24 @@
from building import *
import rtconfig
import os
-import shutil
-
-# get current dir path
-cwd = GetCurrentDir()
src = []
inc = []
+group = []
+
+cwd = GetCurrentDir() # get current dir path
+
+port_src = Glob('*.c')
+port_inc = [cwd]
+group = group + DefineGroup('LVGL-port', port_src, depend = ['PKG_USING_LVGL'], CPPPATH = port_inc)
+
+# check if .h or .hpp files exsit
+def check_h_hpp_exsit(path):
+ file_dirs = os.listdir(path)
+ for file_dir in file_dirs:
+ if os.path.splitext(file_dir)[1] in ['.h', '.hpp']:
+ return True
+ return False
lvgl_cwd = cwd + '/../../'
@@ -15,38 +26,39 @@ lvgl_src_cwd = lvgl_cwd + 'src/'
inc = inc + [lvgl_src_cwd]
for root, dirs, files in os.walk(lvgl_src_cwd):
for dir in dirs:
- src = src + Glob(os.path.join(root,dir,'*.c'))
- inc = inc + [os.path.join(root,dir)]
+ current_path = os.path.join(root, dir)
+ src = src + Glob(os.path.join(current_path,'*.c')) # add all .c files
+ if check_h_hpp_exsit(current_path): # add .h and .hpp path
+ inc = inc + [current_path]
-if GetDepend('PKG_USING_LVGL_EXAMPLES'):
+
+if GetDepend('PKG_LVGL_USING_EXAMPLES'):
lvgl_src_cwd = lvgl_cwd + 'examples/'
inc = inc + [lvgl_src_cwd]
for root, dirs, files in os.walk(lvgl_src_cwd):
for dir in dirs:
- src = src + Glob(os.path.join(root,dir,'*.c'))
- inc = inc + [os.path.join(root,dir)]
+ current_path = os.path.join(root, dir)
+ src = src + Glob(os.path.join(current_path,'*.c'))
+ if check_h_hpp_exsit(current_path):
+ inc = inc + [current_path]
-if GetDepend('PKG_USING_LVGL_DEMOS'):
+if GetDepend('PKG_LVGL_USING_DEMOS'):
lvgl_src_cwd = lvgl_cwd + 'demos/'
inc = inc + [lvgl_src_cwd]
for root, dirs, files in os.walk(lvgl_src_cwd):
for dir in dirs:
- src = src + Glob(os.path.join(root,dir,'*.c'))
- inc = inc + [os.path.join(root,dir)]
+ current_path = os.path.join(root, dir)
+ src = src + Glob(os.path.join(current_path,'*.c'))
+ if check_h_hpp_exsit(current_path):
+ inc = inc + [current_path]
-LOCAL_CCFLAGS = ''
-if rtconfig.PLATFORM == 'gcc': # GCC
- LOCAL_CCFLAGS += ' -std=c99'
+LOCAL_CFLAGS = ''
+if rtconfig.PLATFORM == 'gcc' or rtconfig.PLATFORM == 'armclang': # GCC or Keil AC6
+ LOCAL_CFLAGS += ' -std=c99'
elif rtconfig.PLATFORM == 'armcc': # Keil AC5
- LOCAL_CCFLAGS += ' --c99 --gnu -g -W'
-elif rtconfig.PLATFORM == 'armclang': # Keil AC6
- LOCAL_CCFLAGS += ' -std=c99 -g -w'
-
-group = DefineGroup('LVGL', src, depend = ['PKG_USING_LVGL'], CPPPATH = inc, LOCAL_CCFLAGS = LOCAL_CCFLAGS)
+ LOCAL_CFLAGS += ' --c99 --gnu'
-port_src = Glob('*.c')
-port_inc = [cwd]
-group = group + DefineGroup('LVGL-port', port_src, depend = ['PKG_USING_LVGL'], CPPPATH = port_inc)
+group = group + DefineGroup('LVGL', src, depend = ['PKG_USING_LVGL'], CPPPATH = inc, LOCAL_CFLAGS = LOCAL_CFLAGS)
list = os.listdir(cwd)
for d in list:
@@ -54,27 +66,4 @@ for d in list:
if os.path.isfile(os.path.join(path, 'SConscript')):
group = group + SConscript(os.path.join(d, 'SConscript'))
-#
-# try:
-# shutil.rmtree(os.path.join(lvgl_cwd, '.github'))
-# shutil.rmtree(os.path.join(lvgl_cwd, 'docs'))
-# shutil.rmtree(os.path.join(lvgl_cwd, 'scripts'))
-# shutil.rmtree(os.path.join(lvgl_cwd, 'tests'))
-# shutil.rmtree(os.path.join(lvgl_cwd, 'zephyr'))
-# os.remove(os.path.join(lvgl_cwd, '.codecov.yml'))
-# os.remove(os.path.join(lvgl_cwd, '.editorconfig'))
-# os.remove(os.path.join(lvgl_cwd, '.gitignore'))
-# os.remove(os.path.join(lvgl_cwd, '.gitmodules'))
-# os.remove(os.path.join(lvgl_cwd, 'CMakeLists.txt'))
-# os.remove(os.path.join(lvgl_cwd, 'component.mk'))
-# os.remove(os.path.join(lvgl_cwd, 'idf_component.yml'))
-# os.remove(os.path.join(lvgl_cwd, 'Kconfig'))
-# os.remove(os.path.join(lvgl_cwd, 'library.json'))
-# os.remove(os.path.join(lvgl_cwd, 'library.properties'))
-# os.remove(os.path.join(lvgl_cwd, 'lv_conf_template.h'))
-# os.remove(os.path.join(lvgl_cwd, 'lvgl.mk'))
-# except:
-# pass
-#
-
Return('group')
diff --git a/env_support/rt-thread/lv_rt_thread_conf.h b/env_support/rt-thread/lv_rt_thread_conf.h
index d18bfb479..92da372dd 100644
--- a/env_support/rt-thread/lv_rt_thread_conf.h
+++ b/env_support/rt-thread/lv_rt_thread_conf.h
@@ -36,20 +36,14 @@
#define LV_TICK_CUSTOM_INCLUDE LV_RTTHREAD_INCLUDE
#define LV_TICK_CUSTOM_SYS_TIME_EXPR (rt_tick_get_millisecond()) /*Expression evaluating to current system time in ms*/
+#ifdef PKG_LVGL_DISP_REFR_PERIOD
+#define LV_DISP_DEF_REFR_PERIOD PKG_LVGL_DISP_REFR_PERIOD
+#endif
+
/*=======================
* FEATURE CONFIGURATION
*=======================*/
-/*-------------
- * Logging
- *-----------*/
-
-#ifdef PKG_LVGL_ENABLE_LOG
-# define LV_USE_LOG 1
-#else
-# define LV_USE_LOG 0
-#endif
-
/*-------------
* Asserts
*-----------*/
@@ -83,7 +77,7 @@
* EXAMPLES
*==================*/
-#ifdef PKG_USING_LVGL_EXAMPLES
+#ifdef PKG_LVGL_USING_EXAMPLES
# define LV_BUILD_EXAMPLES 1
#endif
diff --git a/env_support/rt-thread/lv_rt_thread_port.c b/env_support/rt-thread/lv_rt_thread_port.c
index a438a4111..98a1439b5 100644
--- a/env_support/rt-thread/lv_rt_thread_port.c
+++ b/env_support/rt-thread/lv_rt_thread_port.c
@@ -5,40 +5,74 @@
*
* Change Logs:
* Date Author Notes
- * 2021-10-18 Meco Man The first version
+ * 2021-10-18 Meco Man the first version
+ * 2022-05-10 Meco Man improve rt-thread initialization process
*/
#ifdef __RTTHREAD__
+#include
#include
+
#define DBG_TAG "LVGL"
#define DBG_LVL DBG_INFO
#include
-#include
-#include
-#include
+#ifndef PKG_LVGL_THREAD_STACK_SIZE
+#define PKG_LVGL_THREAD_STACK_SIZE 4096
+#endif /* PKG_LVGL_THREAD_STACK_SIZE */
+
+#ifndef PKG_LVGL_THREAD_PRIO
+#define PKG_LVGL_THREAD_PRIO (RT_THREAD_PRIORITY_MAX*2/3)
+#endif /* PKG_LVGL_THREAD_PRIO */
+
+extern void lv_port_disp_init(void);
+extern void lv_port_indev_init(void);
+extern void lv_user_gui_init(void);
+
+static struct rt_thread lvgl_thread;
+static ALIGN(8) rt_uint8_t lvgl_thread_stack[PKG_LVGL_THREAD_STACK_SIZE];
#if LV_USE_LOG
static void lv_rt_log(const char *buf)
{
LOG_I(buf);
}
-#endif
+#endif /* LV_USE_LOG */
-static int lv_port_init(void)
+static void lvgl_thread_entry(void *parameter)
{
#if LV_USE_LOG
lv_log_register_print_cb(lv_rt_log);
-#endif
-
+#endif /* LV_USE_LOG */
lv_init();
-
lv_port_disp_init();
lv_port_indev_init();
+ lv_user_gui_init();
+
+ /* handle the tasks of LVGL */
+ while(1)
+ {
+ lv_task_handler();
+ rt_thread_mdelay(LV_DISP_DEF_REFR_PERIOD);
+ }
+}
+
+static int lvgl_thread_init(void)
+{
+ rt_err_t err;
+
+ err = rt_thread_init(&lvgl_thread, "LVGL", lvgl_thread_entry, RT_NULL,
+ &lvgl_thread_stack[0], sizeof(lvgl_thread_stack), PKG_LVGL_THREAD_PRIO, 0);
+ if(err != RT_EOK)
+ {
+ LOG_E("Failed to create LVGL thread");
+ return -1;
+ }
+ rt_thread_startup(&lvgl_thread);
return 0;
}
-INIT_COMPONENT_EXPORT(lv_port_init);
+INIT_ENV_EXPORT(lvgl_thread_init);
#endif /*__RTTHREAD__*/
diff --git a/env_support/rt-thread/squareline/README.md b/env_support/rt-thread/squareline/README.md
new file mode 100644
index 000000000..e55796b6c
--- /dev/null
+++ b/env_support/rt-thread/squareline/README.md
@@ -0,0 +1,4 @@
+This folder is for LVGL SquareLine Studio
+
+SquareLine Studio can automatically put the generated C files into `ui` folder, so that rt-thread will automatically detect them; or, as a user, you can move the generated C files into `ui` folder manually.
+
diff --git a/env_support/rt-thread/squareline/SConscript b/env_support/rt-thread/squareline/SConscript
new file mode 100644
index 000000000..89a509973
--- /dev/null
+++ b/env_support/rt-thread/squareline/SConscript
@@ -0,0 +1,13 @@
+from building import *
+
+cwd = GetCurrentDir()
+group = []
+src = []
+CPPPATH =[]
+
+src += Glob(cwd + '/ui/*.c')
+CPPPATH += [cwd+'/ui']
+
+group = group + DefineGroup('LVGL-SquareLine', src, depend = ['PKG_USING_LVGL_SQUARELINE'], CPPPATH = CPPPATH)
+
+Return('group')
diff --git a/env_support/rt-thread/squareline/ui/lv_ui_entry.c b/env_support/rt-thread/squareline/ui/lv_ui_entry.c
new file mode 100644
index 000000000..838b53c9f
--- /dev/null
+++ b/env_support/rt-thread/squareline/ui/lv_ui_entry.c
@@ -0,0 +1,19 @@
+/*
+ * Copyright (c) 2006-2022, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2022-05-13 Meco Man First version
+ */
+
+#ifdef __RTTHREAD__
+
+void lv_user_gui_init(void)
+{
+ extern void ui_init(void);
+ ui_init();
+}
+
+#endif /* __RTTHREAD__ */
diff --git a/examples/anim/index.rst b/examples/anim/index.rst
index 6dfbeceef..3eda55515 100644
--- a/examples/anim/index.rst
+++ b/examples/anim/index.rst
@@ -1,5 +1,5 @@
-Start animation on an event
+Start animation on an event
""""""""""""""""""""""""""""
.. lv_example:: anim/lv_example_anim_1
@@ -14,4 +14,4 @@ Animation timeline
"""""""""""""""""""
.. lv_example:: anim/lv_example_anim_timeline_1
:language: c
-
+
diff --git a/examples/anim/lv_example_anim_1.c b/examples/anim/lv_example_anim_1.c
index 8e18c1ec2..6c16a9180 100644
--- a/examples/anim/lv_example_anim_1.c
+++ b/examples/anim/lv_example_anim_1.c
@@ -20,7 +20,8 @@ static void sw_event_cb(lv_event_t * e)
lv_anim_set_exec_cb(&a, anim_x_cb);
lv_anim_set_path_cb(&a, lv_anim_path_overshoot);
lv_anim_start(&a);
- } else {
+ }
+ else {
lv_anim_t a;
lv_anim_init(&a);
lv_anim_set_var(&a, label);
diff --git a/examples/anim/lv_example_anim_1.py b/examples/anim/lv_example_anim_1.py
index e0f8cf576..64ee1ce6f 100644
--- a/examples/anim/lv_example_anim_1.py
+++ b/examples/anim/lv_example_anim_1.py
@@ -4,7 +4,7 @@ def anim_x_cb(label, v):
def sw_event_cb(e,label):
sw = e.get_target()
- if sw.has_state(lv.STATE.CHECKED):
+ if sw.has_state(lv.STATE.CHECKED):
a = lv.anim_t()
a.init()
a.set_var(label)
diff --git a/examples/anim/lv_example_anim_3.c b/examples/anim/lv_example_anim_3.c
index 536ee409b..dedcad99e 100644
--- a/examples/anim/lv_example_anim_3.c
+++ b/examples/anim/lv_example_anim_3.c
@@ -1,5 +1,5 @@
#include "../lv_examples.h"
-#if LV_BUILD_EXAMPLES && LV_USE_SLIDER && LV_USE_CHART && LV_USE_BTN
+#if LV_BUILD_EXAMPLES && LV_USE_SLIDER && LV_USE_CHART && LV_USE_BTN && LV_USE_GRID
/**
* the example show the use of cubic-bezier3 in animation.
@@ -36,8 +36,8 @@ static void anim_x_cb(void * var, int32_t v);
*/
void lv_example_anim_3(void)
{
- static lv_coord_t col_dsc[] = {LV_GRID_FR(1), 200, LV_GRID_FR(1),LV_GRID_TEMPLATE_LAST};
- static lv_coord_t row_dsc[] = {30, 10, 10, LV_GRID_FR(1),LV_GRID_TEMPLATE_LAST};
+ static lv_coord_t col_dsc[] = {LV_GRID_FR(1), 200, LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST};
+ static lv_coord_t row_dsc[] = {30, 10, 10, LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST};
/*Create a container with grid*/
lv_obj_t * cont = lv_obj_create(lv_scr_act());
@@ -53,7 +53,7 @@ void lv_example_anim_3(void)
lv_anim_init(&ginfo.a);
lv_anim_set_var(&ginfo.a, ginfo.anim_obj);
int32_t end = lv_obj_get_style_width(cont, LV_PART_MAIN) -
- lv_obj_get_style_width(ginfo.anim_obj, LV_PART_MAIN) - 10;
+ lv_obj_get_style_width(ginfo.anim_obj, LV_PART_MAIN) - 10;
lv_anim_set_values(&ginfo.a, 5, end);
lv_anim_set_time(&ginfo.a, 2000);
lv_anim_set_exec_cb(&ginfo.a, anim_x_cb);
@@ -124,14 +124,14 @@ static void page_obj_init(lv_obj_t * par)
lv_obj_set_align(ginfo.anim_obj, LV_ALIGN_TOP_LEFT);
lv_obj_clear_flag(ginfo.anim_obj, LV_OBJ_FLAG_SCROLLABLE);
lv_obj_set_style_bg_color(ginfo.anim_obj, lv_palette_main(LV_PALETTE_RED), LV_PART_MAIN);
- lv_obj_set_grid_cell(ginfo.anim_obj, LV_GRID_ALIGN_START, 0, 1,LV_GRID_ALIGN_START, 0, 1);
+ lv_obj_set_grid_cell(ginfo.anim_obj, LV_GRID_ALIGN_START, 0, 1, LV_GRID_ALIGN_START, 0, 1);
ginfo.p1_label = lv_label_create(par);
ginfo.p2_label = lv_label_create(par);
lv_label_set_text(ginfo.p1_label, "p1:0");
lv_label_set_text(ginfo.p2_label, "p2:0");
- lv_obj_set_grid_cell(ginfo.p1_label, LV_GRID_ALIGN_START, 0, 1,LV_GRID_ALIGN_START, 1, 1);
- lv_obj_set_grid_cell(ginfo.p2_label, LV_GRID_ALIGN_START, 0, 1,LV_GRID_ALIGN_START, 2, 1);
+ lv_obj_set_grid_cell(ginfo.p1_label, LV_GRID_ALIGN_START, 0, 1, LV_GRID_ALIGN_START, 1, 1);
+ lv_obj_set_grid_cell(ginfo.p2_label, LV_GRID_ALIGN_START, 0, 1, LV_GRID_ALIGN_START, 2, 1);
ginfo.p1_slider = lv_slider_create(par);
ginfo.p2_slider = lv_slider_create(par);
@@ -141,15 +141,15 @@ static void page_obj_init(lv_obj_t * par)
lv_obj_set_style_pad_all(ginfo.p2_slider, 2, LV_PART_KNOB);
lv_obj_add_event_cb(ginfo.p1_slider, slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL);
lv_obj_add_event_cb(ginfo.p2_slider, slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL);
- lv_obj_set_grid_cell(ginfo.p1_slider, LV_GRID_ALIGN_STRETCH, 1, 1,LV_GRID_ALIGN_START, 1, 1);
- lv_obj_set_grid_cell(ginfo.p2_slider, LV_GRID_ALIGN_STRETCH, 1, 1,LV_GRID_ALIGN_START, 2, 1);
+ lv_obj_set_grid_cell(ginfo.p1_slider, LV_GRID_ALIGN_STRETCH, 1, 1, LV_GRID_ALIGN_START, 1, 1);
+ lv_obj_set_grid_cell(ginfo.p2_slider, LV_GRID_ALIGN_STRETCH, 1, 1, LV_GRID_ALIGN_START, 2, 1);
ginfo.run_btn = lv_btn_create(par);
lv_obj_add_event_cb(ginfo.run_btn, run_btn_event_handler, LV_EVENT_CLICKED, NULL);
lv_obj_t * btn_label = lv_label_create(ginfo.run_btn);
lv_label_set_text(btn_label, LV_SYMBOL_PLAY);
lv_obj_center(btn_label);
- lv_obj_set_grid_cell(ginfo.run_btn, LV_GRID_ALIGN_STRETCH, 2, 1,LV_GRID_ALIGN_STRETCH, 1, 2);
+ lv_obj_set_grid_cell(ginfo.run_btn, LV_GRID_ALIGN_STRETCH, 2, 1, LV_GRID_ALIGN_STRETCH, 1, 2);
ginfo.chart = lv_chart_create(par);
lv_obj_set_style_pad_all(ginfo.chart, 0, LV_PART_MAIN);
@@ -159,7 +159,7 @@ static void page_obj_init(lv_obj_t * par)
lv_chart_set_range(ginfo.chart, LV_CHART_AXIS_PRIMARY_Y, 0, 1024);
lv_chart_set_range(ginfo.chart, LV_CHART_AXIS_PRIMARY_X, 0, 1024);
lv_chart_set_point_count(ginfo.chart, CHART_POINTS_NUM);
- lv_obj_set_grid_cell(ginfo.chart, LV_GRID_ALIGN_STRETCH, 0, 3,LV_GRID_ALIGN_STRETCH, 3, 1);
+ lv_obj_set_grid_cell(ginfo.chart, LV_GRID_ALIGN_STRETCH, 0, 3, LV_GRID_ALIGN_STRETCH, 3, 1);
}
#endif
diff --git a/examples/anim/lv_example_anim_3.py b/examples/anim/lv_example_anim_3.py
index fc69e1055..ef7ebb2fb 100644
--- a/examples/anim/lv_example_anim_3.py
+++ b/examples/anim/lv_example_anim_3.py
@@ -37,7 +37,7 @@ def __init__(self):
self.a.set_custom_exec_cb(lambda a,val: self.anim_x_cb(self.anim_obj,val))
self.a.set_path_cb(self.anim_path_bezier3_cb)
self.refer_chart_cubic_bezier()
-
+
def page_obj_init(self,par):
self.anim_obj = lv.obj(par)
self.anim_obj.set_size(30, 30)
@@ -45,14 +45,14 @@ def page_obj_init(self,par):
self.anim_obj.clear_flag(lv.obj.FLAG.SCROLLABLE)
self.anim_obj.set_style_bg_color(lv.palette_main(lv.PALETTE.RED), lv.PART.MAIN)
self.anim_obj.set_grid_cell(lv.GRID_ALIGN.START, 0, 1,lv.GRID_ALIGN.START, 0, 1)
-
+
self.p1_label = lv.label(par)
self.p2_label = lv.label(par)
self.p1_label.set_text("p1:0")
self.p2_label.set_text("p2:0")
self.p1_label.set_grid_cell(lv.GRID_ALIGN.START, 0, 1,lv.GRID_ALIGN.START, 1, 1)
self.p2_label.set_grid_cell(lv.GRID_ALIGN.START, 0, 1,lv.GRID_ALIGN.START, 2, 1)
-
+
self.p1_slider = lv.slider(par)
self.p2_slider = lv.slider(par)
self.p1_slider.set_range(0, 1024)
@@ -63,14 +63,14 @@ def page_obj_init(self,par):
self.p2_slider.add_event_cb(self.slider_event_cb, lv.EVENT.VALUE_CHANGED, None)
self.p1_slider.set_grid_cell(lv.GRID_ALIGN.STRETCH, 1, 1,lv.GRID_ALIGN.START, 1, 1)
self.p2_slider.set_grid_cell(lv.GRID_ALIGN.STRETCH, 1, 1,lv.GRID_ALIGN.START, 2, 1)
-
+
self.run_btn = lv.btn(par)
self.run_btn.add_event_cb(self.run_btn_event_handler, lv.EVENT.CLICKED, None)
btn_label = lv.label(self.run_btn)
btn_label.set_text(lv.SYMBOL.PLAY)
btn_label.center()
self.run_btn.set_grid_cell(lv.GRID_ALIGN.STRETCH, 2, 1,lv.GRID_ALIGN.STRETCH, 1, 2)
-
+
self.chart = lv.chart(par)
self.chart.set_style_pad_all(0, lv.PART.MAIN)
self.chart.set_style_size(0, lv.PART.INDICATOR)
@@ -80,7 +80,7 @@ def page_obj_init(self,par):
self.chart.set_range(lv.chart.AXIS.PRIMARY_X, 0, 1024)
self.chart.set_point_count(CHART_POINTS_NUM)
self.chart.set_grid_cell(lv.GRID_ALIGN.STRETCH, 0, 3,lv.GRID_ALIGN.STRETCH, 3, 1)
-
+
def refer_chart_cubic_bezier(self):
for i in range(CHART_POINTS_NUM+1):
t = i * (1024 // CHART_POINTS_NUM)
@@ -90,7 +90,7 @@ def refer_chart_cubic_bezier(self):
def slider_event_cb(self,e):
slider = e.get_target()
-
+
if slider == self.p1_slider:
label = self.p1_label
self.p1 = slider.get_value()
@@ -101,7 +101,7 @@ def slider_event_cb(self,e):
label.set_text("p1: {:d}".format(self.p2))
self.refer_chart_cubic_bezier()
-
+
def run_btn_event_handler(self,e):
diff --git a/examples/anim/lv_example_anim_timeline_1.c b/examples/anim/lv_example_anim_timeline_1.c
index 15c35ed19..d2d4e81b2 100644
--- a/examples/anim/lv_example_anim_timeline_1.c
+++ b/examples/anim/lv_example_anim_timeline_1.c
@@ -93,7 +93,7 @@ static void btn_start_event_handler(lv_event_t * e)
{
lv_obj_t * btn = lv_event_get_target(e);
- if (!anim_timeline) {
+ if(!anim_timeline) {
anim_timeline_create();
}
@@ -105,7 +105,7 @@ static void btn_start_event_handler(lv_event_t * e)
static void btn_del_event_handler(lv_event_t * e)
{
LV_UNUSED(e);
- if (anim_timeline) {
+ if(anim_timeline) {
lv_anim_timeline_del(anim_timeline);
anim_timeline = NULL;
}
@@ -114,7 +114,7 @@ static void btn_del_event_handler(lv_event_t * e)
static void btn_stop_event_handler(lv_event_t * e)
{
LV_UNUSED(e);
- if (anim_timeline) {
+ if(anim_timeline) {
lv_anim_timeline_stop(anim_timeline);
}
}
@@ -123,7 +123,7 @@ static void slider_prg_event_handler(lv_event_t * e)
{
lv_obj_t * slider = lv_event_get_target(e);
- if (!anim_timeline) {
+ if(!anim_timeline) {
anim_timeline_create();
}
diff --git a/examples/anim/lv_example_anim_timeline_1.py b/examples/anim/lv_example_anim_timeline_1.py
index 4a50f264f..b5ed3e540 100644
--- a/examples/anim/lv_example_anim_timeline_1.py
+++ b/examples/anim/lv_example_anim_timeline_1.py
@@ -10,41 +10,41 @@ def __init__(self):
self.par = lv.scr_act()
self.par.set_flex_flow(lv.FLEX_FLOW.ROW)
self.par.set_flex_align(lv.FLEX_ALIGN.SPACE_AROUND, lv.FLEX_ALIGN.CENTER, lv.FLEX_ALIGN.CENTER)
-
+
self.btn_run = lv.btn(self.par)
self.btn_run.add_event_cb(self.btn_run_event_handler, lv.EVENT.VALUE_CHANGED, None)
self.btn_run.add_flag(lv.obj.FLAG.IGNORE_LAYOUT)
self.btn_run.add_flag(lv.obj.FLAG.CHECKABLE)
self.btn_run.align(lv.ALIGN.TOP_MID, -50, 20)
-
+
self.label_run = lv.label(self.btn_run)
self.label_run.set_text("Run")
self.label_run.center()
-
+
self.btn_del = lv.btn(self.par)
self.btn_del.add_event_cb(self.btn_del_event_handler, lv.EVENT.CLICKED, None)
self.btn_del.add_flag(lv.obj.FLAG.IGNORE_LAYOUT)
self.btn_del.align(lv.ALIGN.TOP_MID, 50, 20)
-
+
self.label_del = lv.label(self.btn_del)
self.label_del.set_text("Stop")
self.label_del.center()
-
+
self.slider = lv.slider(self.par)
self.slider.add_event_cb(self.slider_prg_event_handler, lv.EVENT.VALUE_CHANGED, None)
self.slider.add_flag(lv.obj.FLAG.IGNORE_LAYOUT)
self.slider.align(lv.ALIGN.BOTTOM_RIGHT, -20, -20)
self.slider.set_range(0, 65535)
-
+
self.obj1 = lv.obj(self.par)
self.obj1.set_size(self.obj_width, self.obj_height)
-
+
self.obj2 = lv.obj(self.par)
self.obj2.set_size(self.obj_width, self.obj_height)
-
+
self.obj3 = lv.obj(self.par)
self.obj3.set_size(self.obj_width, self.obj_height)
-
+
self.anim_timeline = None
def set_width(self,obj, v):
@@ -54,7 +54,7 @@ def set_height(self,obj, v):
obj.set_height(v)
def anim_timeline_create(self):
- # obj1
+ # obj1
self.a1 = lv.anim_t()
self.a1.init()
self.a1.set_values(0, self.obj_width)
@@ -62,7 +62,7 @@ def anim_timeline_create(self):
self.a1.set_custom_exec_cb(lambda a,v: self.set_width(self.obj1,v))
self.a1.set_path_cb(lv.anim_t.path_overshoot)
self.a1.set_time(300)
-
+
self.a2 = lv.anim_t()
self.a2.init()
self.a2.set_values(0, self.obj_height)
@@ -70,8 +70,8 @@ def anim_timeline_create(self):
self.a2.set_custom_exec_cb(lambda a,v: self.set_height(self.obj1,v))
self.a2.set_path_cb(lv.anim_t.path_ease_out)
self.a2.set_time(300)
-
- # obj2
+
+ # obj2
self.a3=lv.anim_t()
self.a3.init()
self.a3.set_values(0, self.obj_width)
@@ -79,7 +79,7 @@ def anim_timeline_create(self):
self.a3.set_custom_exec_cb(lambda a,v: self.set_width(self.obj2,v))
self.a3.set_path_cb(lv.anim_t.path_overshoot)
self.a3.set_time(300)
-
+
self.a4 = lv.anim_t()
self.a4.init()
self.a4.set_values(0, self.obj_height)
@@ -87,8 +87,8 @@ def anim_timeline_create(self):
self.a4.set_custom_exec_cb(lambda a,v: self.set_height(self.obj2,v))
self.a4.set_path_cb(lv.anim_t.path_ease_out)
self.a4.set_time(300)
-
- # obj3
+
+ # obj3
self.a5 = lv.anim_t()
self.a5.init()
self.a5.set_values(0, self.obj_width)
@@ -96,7 +96,7 @@ def anim_timeline_create(self):
self.a5.set_custom_exec_cb(lambda a,v: self.set_width(self.obj3,v))
self.a5.set_path_cb(lv.anim_t.path_overshoot)
self.a5.set_time(300)
-
+
self.a6 = lv.anim_t()
self.a6.init()
self.a6.set_values(0, self.obj_height)
@@ -104,7 +104,7 @@ def anim_timeline_create(self):
self.a6.set_custom_exec_cb(lambda a,v: self.set_height(self.obj3,v))
self.a6.set_path_cb(lv.anim_t.path_ease_out)
self.a6.set_time(300)
-
+
# Create anim timeline
print("Create new anim_timeline")
self.anim_timeline = lv.anim_timeline_create()
@@ -114,7 +114,7 @@ def anim_timeline_create(self):
lv.anim_timeline_add(self.anim_timeline, 200, self.a4)
lv.anim_timeline_add(self.anim_timeline, 400, self.a5)
lv.anim_timeline_add(self.anim_timeline, 400, self.a6)
-
+
def slider_prg_event_handler(self,e):
slider = e.get_target()
@@ -129,7 +129,7 @@ def btn_run_event_handler(self,e):
btn = e.get_target()
if not self.anim_timeline:
self.anim_timeline_create()
-
+
reverse = btn.has_state(lv.STATE.CHECKED)
lv.anim_timeline_set_reverse(self.anim_timeline,reverse)
lv.anim_timeline_start(self.anim_timeline)
diff --git a/examples/assets/emoji/F600.png b/examples/assets/emoji/F600.png
new file mode 100644
index 000000000..c31a1f791
Binary files /dev/null and b/examples/assets/emoji/F600.png differ
diff --git a/examples/assets/emoji/img_emoji_F617.c b/examples/assets/emoji/img_emoji_F617.c
new file mode 100644
index 000000000..29fd2fa5d
--- /dev/null
+++ b/examples/assets/emoji/img_emoji_F617.c
@@ -0,0 +1,324 @@
+#ifdef LV_LVGL_H_INCLUDE_SIMPLE
+#include "lvgl.h"
+#else
+#include "../../../lvgl.h"
+#endif
+
+#ifndef LV_ATTRIBUTE_MEM_ALIGN
+#define LV_ATTRIBUTE_MEM_ALIGN
+#endif
+#ifndef LV_ATTRIBUTE_IMG_1F617
+#define LV_ATTRIBUTE_IMG_1F617
+#endif
+const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_1F617 uint8_t emoji_F617_map[] = {
+#if LV_COLOR_DEPTH == 1 || LV_COLOR_DEPTH == 8
+ /*Pixel format: Red: 3 bit, Green: 3 bit, Blue: 2 bit*/
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xd1, 0xd0, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xd0, 0xd1, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xd1, 0xf1, 0xf1, 0xf0, 0xf4, 0xf4, 0xf4, 0xf9, 0xf8, 0xf8, 0xf8, 0xf9, 0xf8, 0xf9, 0xf4, 0xf4, 0xf0, 0xf1, 0xf1, 0xd1, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xf1, 0xf0, 0xf4, 0xf4, 0xf8, 0xf8, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xf8, 0xf8, 0xf4, 0xf4, 0xf0, 0xf1, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xf1, 0xf0, 0xf4, 0xf8, 0xf8, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfc, 0xfc, 0xfc, 0xf8, 0xf8, 0xf4, 0xf4, 0xf1, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xf1, 0xf4, 0xf4, 0xf8, 0xf8, 0xfc, 0xfc, 0xfd, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfd, 0xfd, 0xfc, 0xf8, 0xf8, 0xf4, 0xf4, 0xf1, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xf1, 0xf0, 0xf4, 0xf8, 0xf8, 0xfc, 0xfd, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfd, 0xfc, 0xf8, 0xf8, 0xf4, 0xf0, 0xf1, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xf0, 0xf4, 0xf4, 0xf8, 0xf8, 0xfd, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfd, 0xfc, 0xf8, 0xf4, 0xf4, 0xf0, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xf0, 0xf4, 0xf4, 0xf8, 0xfc, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfd, 0xf8, 0xf4, 0xf4, 0xf0, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf1, 0xf0, 0xf4, 0xf8, 0xf8, 0xfd, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xf8, 0xf8, 0xf4, 0xf0, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xf0, 0xf4, 0xf8, 0xf8, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xf9, 0xf8, 0xf4, 0xf0, 0xf1, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf1, 0xf0, 0xf4, 0xf4, 0xf8, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xf9, 0xf8, 0xf4, 0xf0, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf1, 0xf0, 0xf4, 0xf4, 0xf9, 0xfe, 0xff, 0xfe, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xfe, 0xf9, 0xf4, 0xf4, 0xf0, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xf0, 0xf4, 0xf4, 0xf8, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xf9, 0xf4, 0xf4, 0xf0, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xf0, 0xf4, 0xf4, 0xf8, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xf9, 0xf4, 0xf4, 0xf0, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xf0, 0xf4, 0xf4, 0xf8, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xf8, 0xf4, 0xf4, 0xf0, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf1, 0xf0, 0xf4, 0xf4, 0xf9, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xf4, 0xf4, 0xf0, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xf0, 0xf4, 0xf4, 0xf9, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xf9, 0xf4, 0xf4, 0xf0, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf1, 0xf0, 0xf4, 0xf4, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xf4, 0xf4, 0xf0, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xf0, 0xf4, 0xf4, 0xf9, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xf9, 0xf4, 0xf4, 0xf0, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xf0, 0xf4, 0xf4, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xf4, 0xf0, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xf0, 0xf0, 0xf4, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfe, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xf4, 0xf4, 0xf0, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xf1, 0xf0, 0xf4, 0xf4, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfe, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xf4, 0xf4, 0xf0, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd1, 0xf0, 0xf0, 0xf4, 0xf4, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xb0, 0x88, 0xac, 0xf9, 0xfd, 0xfe, 0xfd, 0xfe, 0xfd, 0xfe, 0xfe, 0xfe, 0xfd, 0xfe, 0xfe, 0xfd, 0xfe, 0xfd, 0xd5, 0xac, 0x88, 0xd0, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xf9, 0xf4, 0xf0, 0xf0, 0xd1, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd1, 0xf0, 0xf0, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0x88, 0x64, 0x64, 0x64, 0x68, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xd0, 0x64, 0x64, 0x64, 0x64, 0xac, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf0, 0xf0, 0xd1, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf1, 0xf0, 0xf0, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xb0, 0x64, 0x88, 0x88, 0x88, 0x64, 0xac, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0x88, 0x68, 0x88, 0x88, 0x88, 0x64, 0xd5, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xfd, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf0, 0xf0, 0xf1, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xcc, 0xf0, 0xf0, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0x88, 0x88, 0xac, 0xac, 0xac, 0x88, 0x88, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xd5, 0x68, 0x88, 0xac, 0xac, 0xac, 0x68, 0xb0, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf0, 0xf0, 0xd0, 0xd1, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xd1, 0xcc, 0xf0, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0x88, 0x88, 0xac, 0xac, 0xac, 0xac, 0x88, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xd5, 0x88, 0xac, 0xac, 0xac, 0xac, 0x88, 0xac, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf0, 0xcc, 0xd1, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xd1, 0xf0, 0xf0, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0x88, 0x88, 0xac, 0xac, 0xac, 0xac, 0x88, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xd5, 0x88, 0xac, 0xac, 0xac, 0xac, 0x88, 0xac, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf0, 0xf0, 0xd1, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xd1, 0xf0, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xb0, 0x88, 0xac, 0xac, 0xac, 0x88, 0xac, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0x88, 0xac, 0xac, 0xac, 0xac, 0x88, 0xd0, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf0, 0xd0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xd0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0x88, 0x88, 0xac, 0x88, 0x88, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xd5, 0x88, 0xac, 0xac, 0x88, 0xac, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf0, 0xf1, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xcc, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfd, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xb0, 0xac, 0xb0, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xd5, 0xac, 0xac, 0xd0, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xcc, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xcc, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xcc, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xcc, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xcc, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xcc, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xcc, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xcc, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xfd, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xcc, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xf1, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfd, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xfd, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xcc, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xd0, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xf1, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xd0, 0xcc, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xd0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xd1, 0xcc, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xcc, 0xd1, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xd1, 0xcc, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfd, 0xf9, 0xf9, 0xfd, 0xf9, 0xfd, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xcc, 0xd1, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xcc, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfd, 0xf9, 0xd5, 0xd0, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xd0, 0xd1, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf1, 0xf0, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xb0, 0x68, 0x64, 0x88, 0xac, 0xd0, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xf0, 0xf1, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd1, 0xcc, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfd, 0xf9, 0xd5, 0xac, 0x68, 0x64, 0x88, 0xcc, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xcc, 0xd1, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd1, 0xcc, 0xf0, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfd, 0xfd, 0xfd, 0xf9, 0xb0, 0x64, 0x64, 0xac, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xcc, 0xd1, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfd, 0xf9, 0x88, 0x64, 0x68, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xf0, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xcc, 0xf0, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xd0, 0x88, 0x68, 0xac, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xcc, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xf0, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xb0, 0x68, 0x88, 0xb0, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xf0, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xcc, 0xf0, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xb0, 0x88, 0x64, 0x88, 0xd0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xf0, 0xcc, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xf0, 0xf0, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xac, 0x64, 0x64, 0xb0, 0xf9, 0xf4, 0xf0, 0xf0, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xf0, 0xd0, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xcc, 0xf0, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xb0, 0x64, 0x68, 0xb0, 0xf4, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xf0, 0xcc, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xf0, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfd, 0xd5, 0xac, 0x68, 0x88, 0xac, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xf0, 0xcc, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xcc, 0xcc, 0xf0, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfd, 0xfd, 0xd0, 0x68, 0x64, 0x88, 0xcc, 0xf4, 0xf4, 0xf4, 0xf9, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xf0, 0xf0, 0xcc, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xcc, 0xf0, 0xf0, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xd5, 0x88, 0x64, 0x68, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xf0, 0xf0, 0xcc, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xcc, 0xf0, 0xf0, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0x88, 0x68, 0x88, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xf0, 0xf0, 0xcc, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xf0, 0xf0, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xcc, 0x88, 0x68, 0x88, 0xd0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xf0, 0xf0, 0xcc, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xcc, 0xcc, 0xf0, 0xf0, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xac, 0x88, 0x68, 0x68, 0xac, 0xd0, 0xf4, 0xf9, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xf0, 0xf0, 0xcc, 0xcc, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xcc, 0xcc, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xd0, 0xac, 0xac, 0xd0, 0xf4, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xf0, 0xf0, 0xcc, 0xcc, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xcc, 0xcc, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xcc, 0xcc, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xcc, 0xcc, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xcc, 0xcc, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xcc, 0xcc, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xcc, 0xcc, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xcc, 0xcc, 0xcc, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xcc, 0xcc, 0xcc, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xcc, 0xcc, 0xcc, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf4, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xcc, 0xcc, 0xd0, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xd1, 0xcc, 0xcc, 0xcc, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xcc, 0xcc, 0xd0, 0xd0, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xd1, 0xf1, 0xd0, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xd0, 0xf1, 0xd1, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xd1, 0xd1, 0xd0, 0xf1, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xf1, 0xd0, 0xd1, 0xd1, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+#endif
+#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP == 0
+ /*Pixel format: Red: 5 bit, Green: 6 bit, Blue: 5 bit*/
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0xcc,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0xcc, 0xe4, 0xcb, 0xc4, 0xd3, 0x04, 0xdc, 0x04, 0xdc, 0x84, 0xec, 0x84, 0xec, 0x84, 0xec, 0x84, 0xec, 0x04, 0xdc, 0x04, 0xdc, 0xc4, 0xd3, 0xe4, 0xcb, 0x25, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0xcc, 0xe4, 0xcb, 0x04, 0xdc, 0x84, 0xec, 0x83, 0xf4, 0x03, 0xf5, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0x01, 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0xc5, 0xfd, 0x01, 0xfe, 0xa4, 0xfd, 0x83, 0xfd, 0x03, 0xf5, 0x83, 0xf4, 0x84, 0xec, 0x04, 0xdc, 0xe4, 0xcb, 0x25, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0xcb, 0x04, 0xdc, 0x83, 0xf4, 0x03, 0xf5, 0x83, 0xfd, 0x01, 0xfe, 0x01, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0x83, 0xfd, 0x03, 0xf5, 0x83, 0xf4, 0x84, 0xec, 0xe4, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0xcb, 0x84, 0xec, 0x42, 0xf4, 0x83, 0xfd, 0x01, 0xfe, 0x01, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0x06, 0xff, 0x67, 0xff, 0x8a, 0xff, 0xac, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xac, 0xff, 0x8a, 0xff, 0x09, 0xff, 0x06, 0xff, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0x83, 0xfd, 0x03, 0xf5, 0x84, 0xec, 0xe4, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0xcb, 0x84, 0xec, 0x03, 0xf5, 0x61, 0xfd, 0x01, 0xfe, 0x01, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0x09, 0xff, 0x4e, 0xff, 0xd3, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xd3, 0xff, 0xcf, 0xff, 0x09, 0xff, 0xa6, 0xfe, 0xa1, 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0x61, 0xfd, 0x03, 0xf5, 0x84, 0xec, 0xe4, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0xcc, 0x04, 0xdc, 0x42, 0xf4, 0x61, 0xfd, 0x01, 0xfe, 0x01, 0xfe, 0xa1, 0xfe, 0xe6, 0xfe, 0x4e, 0xff, 0xf6, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0x70, 0xff, 0x09, 0xff, 0xa1, 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0x61, 0xfd, 0x42, 0xf4, 0x84, 0xec, 0x25, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0xcb, 0x83, 0xf4, 0x01, 0xfd, 0x61, 0xfd, 0x01, 0xfe, 0x01, 0xfe, 0xa6, 0xfe, 0x70, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xd1, 0xff, 0x09, 0xff, 0xa1, 0xfe, 0x01, 0xfe, 0x61, 0xfd, 0x01, 0xfd, 0x83, 0xf4, 0xe4, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xd3, 0x42, 0xf4, 0x61, 0xfd, 0x61, 0xfd, 0x01, 0xfe, 0xa1, 0xfe, 0x4e, 0xff, 0xf6, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0x70, 0xff, 0xa6, 0xfe, 0x01, 0xfe, 0x61, 0xfd, 0x61, 0xfd, 0x42, 0xf4, 0xc4, 0xd3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xdc, 0x81, 0xfc, 0x61, 0xfd, 0x01, 0xfe, 0x01, 0xfe, 0xa9, 0xfe, 0xd3, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0x0b, 0xff, 0x01, 0xfe, 0x01, 0xfe, 0x61, 0xfd, 0x81, 0xfc, 0x84, 0xec, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0xcb, 0x81, 0xfc, 0x61, 0xfd, 0x01, 0xfe, 0x01, 0xfe, 0x0b, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0x70, 0xff, 0x25, 0xfe, 0x01, 0xfe, 0x61, 0xfd, 0x81, 0xfc, 0x84, 0xec, 0x25, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xdc, 0x81, 0xfc, 0x61, 0xfd, 0x61, 0xfd, 0x01, 0xfe, 0x4e, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0x70, 0xff, 0x66, 0xfe, 0x01, 0xfe, 0x61, 0xfd, 0x81, 0xfc, 0x84, 0xec, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xdc, 0x81, 0xfc, 0x61, 0xfd, 0x61, 0xfd, 0x25, 0xfe, 0x4e, 0xff, 0xf6, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xf6, 0xff, 0xd3, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xd3, 0xff, 0xf6, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xf6, 0xff, 0x70, 0xff, 0x87, 0xfe, 0x61, 0xfd, 0x61, 0xfd, 0x81, 0xfc, 0x84, 0xec, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xd3, 0x81, 0xfc, 0x01, 0xfd, 0x61, 0xfd, 0x01, 0xfe, 0x4e, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xd3, 0xff, 0xf6, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0x70, 0xff, 0x46, 0xfe, 0x61, 0xfd, 0x01, 0xfd, 0x81, 0xfc, 0xc4, 0xd3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0xcb, 0x42, 0xf4, 0x01, 0xfd, 0x61, 0xfd, 0x01, 0xfe, 0x4e, 0xff, 0xd3, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd3, 0xff, 0xd1, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xf6, 0xff, 0xd3, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xd3, 0xff, 0xf6, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd1, 0xff, 0xd3, 0xff, 0xd1, 0xff, 0x70, 0xff, 0xd3, 0xff, 0x70, 0xff, 0x25, 0xfe, 0x61, 0xfd, 0x01, 0xfd, 0x42, 0xf4, 0xe4, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0xcc, 0x83, 0xf4, 0x01, 0xfd, 0x61, 0xfd, 0x01, 0xfe, 0xa9, 0xfe, 0x70, 0xff, 0x70, 0xff, 0x70, 0xff, 0x70, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd3, 0xff, 0xd1, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd1, 0xff, 0xd3, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0x70, 0xff, 0xd1, 0xff, 0x70, 0xff, 0x70, 0xff, 0x70, 0xff, 0x4e, 0xff, 0x01, 0xfe, 0x61, 0xfd, 0x01, 0xfd, 0x83, 0xf4, 0x25, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xdc, 0x81, 0xfc, 0x01, 0xfd, 0x61, 0xfd, 0x47, 0xfe, 0x70, 0xff, 0x70, 0xff, 0x70, 0xff, 0x70, 0xff, 0xd1, 0xff, 0x70, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd3, 0xff, 0xd1, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd1, 0xff, 0xd3, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0x70, 0xff, 0x70, 0xff, 0x70, 0xff, 0x70, 0xff, 0x70, 0xff, 0xa9, 0xfe, 0x61, 0xfd, 0x01, 0xfd, 0x81, 0xfc, 0x84, 0xec, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0xcb, 0x42, 0xf4, 0x01, 0xfd, 0x61, 0xfd, 0xc5, 0xfd, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x70, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xd1, 0xff, 0xcf, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xcf, 0xff, 0xd1, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0x70, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x07, 0xfe, 0x61, 0xfd, 0x01, 0xfd, 0x42, 0xf4, 0xe4, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0xec, 0x81, 0xfc, 0x01, 0xfd, 0x61, 0xfd, 0xa9, 0xfe, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xd1, 0xff, 0xcf, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xcf, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xcf, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xcf, 0xff, 0xd1, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xd1, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x0b, 0xff, 0x83, 0xfd, 0x01, 0xfd, 0x81, 0xfc, 0x82, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0xcb, 0x42, 0xf4, 0x01, 0xfd, 0x61, 0xfd, 0xc5, 0xfd, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0xac, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xac, 0xff, 0xcf, 0xff, 0x4e, 0xff, 0xac, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x47, 0xfe, 0x61, 0xfd, 0x01, 0xfd, 0x61, 0xe4, 0xe4, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0xcb, 0x81, 0xfc, 0x01, 0xfd, 0x61, 0xfd, 0x47, 0xfe, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x4e, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xcf, 0xff, 0xac, 0xff, 0xcf, 0xff, 0xac, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xac, 0xff, 0xcf, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0x4e, 0xff, 0xac, 0xff, 0x4e, 0xff, 0xac, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0xa9, 0xfe, 0xa4, 0xfd, 0x01, 0xfd, 0x81, 0xfc, 0x82, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0xcb, 0x42, 0xf4, 0x81, 0xfc, 0x01, 0xfd, 0xc5, 0xfd, 0xa9, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0xac, 0xff, 0x4e, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0x0b, 0xff, 0xac, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0xa9, 0xfe, 0xa9, 0xfe, 0x07, 0xfe, 0x61, 0xfd, 0x01, 0xfd, 0x42, 0xf4, 0xe4, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xdc, 0x81, 0xfc, 0x01, 0xfd, 0x61, 0xfd, 0x07, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0x0b, 0xff, 0xa9, 0xfe, 0x0b, 0xff, 0x09, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x8a, 0xff, 0x0b, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0xac, 0xff, 0xac, 0xff, 0x8a, 0xff, 0xa9, 0xfe, 0x09, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0x09, 0xff, 0xa9, 0xfe, 0x8a, 0xff, 0xac, 0xff, 0x8a, 0xff, 0x0b, 0xff, 0x8a, 0xff, 0x0b, 0xff, 0x8a, 0xff, 0x0b, 0xff, 0x8a, 0xff, 0x0b, 0xff, 0x09, 0xff, 0x0b, 0xff, 0xa9, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0x07, 0xfe, 0x83, 0xfd, 0x01, 0xfd, 0x81, 0xfc, 0x84, 0xec, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0xcc, 0x83, 0xf4, 0x81, 0xfc, 0x01, 0xfd, 0x83, 0xfd, 0x47, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0x0b, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x8a, 0xff, 0x0b, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x47, 0xe6, 0xa3, 0xab, 0x61, 0x8a, 0x21, 0xa3, 0x47, 0xe6, 0x8a, 0xff, 0xac, 0xff, 0x8a, 0xff, 0xac, 0xff, 0x8a, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0x8a, 0xff, 0xac, 0xff, 0xac, 0xff, 0x8a, 0xff, 0xac, 0xff, 0x8a, 0xff, 0x25, 0xcd, 0xe1, 0x9a, 0x61, 0x8a, 0x64, 0xc4, 0xa9, 0xfe, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x0b, 0xff, 0x8a, 0xff, 0x09, 0xff, 0x09, 0xff, 0x0b, 0xff, 0x09, 0xff, 0xa9, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0x47, 0xfe, 0xa4, 0xfd, 0x01, 0xfd, 0x81, 0xfc, 0x83, 0xf4, 0x25, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0xcb, 0x42, 0xf4, 0x81, 0xfc, 0x01, 0xfd, 0xa4, 0xfd, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x47, 0xe6, 0x61, 0x8a, 0x40, 0x61, 0x80, 0x69, 0x40, 0x61, 0xc0, 0x71, 0x47, 0xe6, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x64, 0xc4, 0x80, 0x69, 0x40, 0x61, 0x80, 0x69, 0x40, 0x61, 0x21, 0xa3, 0xa9, 0xfe, 0x8a, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0xa9, 0xfe, 0x09, 0xff, 0xa9, 0xfe, 0xa9, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0xe6, 0xfd, 0x01, 0xfd, 0x81, 0xfc, 0x21, 0xe4, 0xe4, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xdc, 0x81, 0xfc, 0x81, 0xfc, 0x01, 0xfd, 0xc5, 0xfd, 0x07, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0xa9, 0xfe, 0xe6, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0xa3, 0xab, 0x80, 0x69, 0x61, 0x8a, 0x61, 0x8a, 0x61, 0x8a, 0x80, 0x69, 0xe1, 0x9a, 0x09, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x47, 0xe6, 0x00, 0x7a, 0xc0, 0x71, 0x61, 0x8a, 0x61, 0x8a, 0x00, 0x7a, 0x80, 0x69, 0x25, 0xcd, 0x67, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0xa9, 0xfe, 0xa9, 0xfe, 0x87, 0xfe, 0xa9, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x07, 0xfe, 0xe6, 0xfd, 0x43, 0xfd, 0x81, 0xfc, 0x81, 0xfc, 0x04, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0xcb, 0x81, 0xfc, 0x81, 0xfc, 0x43, 0xfd, 0xc5, 0xfd, 0x07, 0xfe, 0x46, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0xe6, 0xfe, 0x09, 0xff, 0xe6, 0xfe, 0x09, 0xff, 0x09, 0xff, 0x67, 0xff, 0x67, 0xff, 0xe6, 0xfe, 0x61, 0x8a, 0x00, 0x7a, 0xe1, 0x9a, 0x21, 0xa3, 0xe1, 0x9a, 0x61, 0x8a, 0x00, 0x7a, 0x47, 0xe6, 0x8a, 0xff, 0x67, 0xff, 0x67, 0xff, 0x8a, 0xff, 0x67, 0xff, 0x67, 0xff, 0x8a, 0xff, 0x67, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x25, 0xcd, 0xc0, 0x71, 0x61, 0x8a, 0x21, 0xa3, 0x21, 0xa3, 0xe1, 0x9a, 0xc0, 0x71, 0xa3, 0xab, 0x09, 0xff, 0x67, 0xff, 0x09, 0xff, 0x09, 0xff, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xa9, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x47, 0xfe, 0x46, 0xfe, 0x07, 0xfe, 0xe6, 0xfd, 0x43, 0xfd, 0x81, 0xfc, 0x81, 0xfc, 0x82, 0xcb, 0x25, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0xcc, 0x61, 0xcb, 0x81, 0xfc, 0x01, 0xfd, 0x43, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0x46, 0xfe, 0x46, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0x67, 0xff, 0x47, 0xe6, 0x61, 0x8a, 0x61, 0x8a, 0x21, 0xa3, 0x21, 0xa3, 0x21, 0xa3, 0xe1, 0x9a, 0x00, 0x7a, 0x47, 0xe6, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x25, 0xcd, 0x00, 0x7a, 0xe1, 0x9a, 0x21, 0xa3, 0x21, 0xa3, 0x21, 0xa3, 0x00, 0x7a, 0xe1, 0x9a, 0x06, 0xff, 0x67, 0xff, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xa9, 0xfe, 0xe6, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x47, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0xe6, 0xfd, 0xc5, 0xfd, 0x43, 0xfd, 0x01, 0xfd, 0x81, 0xfc, 0x61, 0xcb, 0x25, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0xcb, 0xc0, 0xdb, 0x81, 0xfc, 0x01, 0xfd, 0x43, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0x25, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0x67, 0xff, 0xe6, 0xfe, 0x61, 0x8a, 0x61, 0x8a, 0x21, 0xa3, 0x21, 0xa3, 0x21, 0xa3, 0xe1, 0x9a, 0x61, 0x8a, 0x47, 0xe6, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x25, 0xcd, 0x00, 0x7a, 0xe1, 0x9a, 0x21, 0xa3, 0x21, 0xa3, 0x21, 0xa3, 0x61, 0x8a, 0x21, 0xa3, 0x06, 0xff, 0x06, 0xff, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x25, 0xfe, 0xc5, 0xfd, 0xc5, 0xfd, 0x43, 0xfd, 0x01, 0xfd, 0x81, 0xfc, 0xc0, 0xdb, 0xe4, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0xcb, 0xc0, 0xdb, 0xa2, 0xec, 0xe2, 0xf4, 0x43, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0x25, 0xfe, 0x25, 0xfe, 0x46, 0xfe, 0x66, 0xfe, 0x87, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0x67, 0xff, 0xa3, 0xab, 0x61, 0x8a, 0x21, 0xa3, 0x21, 0xa3, 0x21, 0xa3, 0x61, 0x8a, 0x21, 0xa3, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x47, 0xe6, 0x61, 0x8a, 0xe1, 0x9a, 0x21, 0xa3, 0x21, 0xa3, 0x21, 0xa3, 0x00, 0x7a, 0x64, 0xc4, 0x67, 0xff, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x46, 0xfe, 0x25, 0xfe, 0xe6, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0xa2, 0xec, 0x21, 0xe4, 0xc4, 0xd3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xd3, 0x21, 0xe4, 0xa2, 0xec, 0xe2, 0xf4, 0x43, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x46, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0x06, 0xff, 0x47, 0xe6, 0x61, 0x8a, 0x61, 0x8a, 0xe1, 0x9a, 0x61, 0x8a, 0x61, 0x8a, 0x47, 0xe6, 0x67, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x67, 0xff, 0x67, 0xff, 0x25, 0xcd, 0x61, 0x8a, 0xe1, 0x9a, 0xe1, 0x9a, 0x61, 0x8a, 0x21, 0xa3, 0xe6, 0xfe, 0x06, 0xff, 0xe6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0xc5, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0xa2, 0xec, 0x21, 0xe4, 0x04, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0xcb, 0x21, 0xe4, 0xa2, 0xec, 0xe2, 0xf4, 0x43, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0x67, 0xff, 0x47, 0xe6, 0xa3, 0xab, 0x21, 0xa3, 0xa3, 0xab, 0x47, 0xe6, 0x67, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x67, 0xff, 0x67, 0xff, 0x25, 0xcd, 0x21, 0xa3, 0x21, 0xa3, 0x64, 0xc4, 0x47, 0xe6, 0x06, 0xff, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0xe2, 0xf4, 0xa2, 0xec, 0x21, 0xe4, 0x82, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0xcb, 0x21, 0xe4, 0x61, 0xe4, 0xe2, 0xf4, 0x43, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x67, 0xff, 0x67, 0xff, 0x09, 0xff, 0x67, 0xff, 0x67, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x67, 0xff, 0x09, 0xff, 0xe6, 0xfe, 0x67, 0xff, 0x06, 0xff, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0xc5, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0xe2, 0xf4, 0xa2, 0xec, 0x21, 0xe4, 0x82, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0xcb, 0x21, 0xe4, 0x61, 0xe4, 0xe2, 0xf4, 0x03, 0xf5, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0x06, 0xff, 0x06, 0xff, 0xe6, 0xfe, 0xe6, 0xfe, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0xe6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0xc5, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0xe2, 0xf4, 0x61, 0xe4, 0x21, 0xe4, 0x82, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0xcb, 0xc0, 0xdb, 0x61, 0xe4, 0xe2, 0xf4, 0x03, 0xf5, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x66, 0xfe, 0x25, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x06, 0xff, 0xa6, 0xfe, 0x06, 0xff, 0xe6, 0xfe, 0xe6, 0xfe, 0x06, 0xff, 0xe6, 0xfe, 0x06, 0xff, 0xe6, 0xfe, 0x06, 0xff, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0x06, 0xff, 0xa6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0xc5, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x03, 0xf5, 0xe2, 0xf4, 0x61, 0xe4, 0x21, 0xe4, 0x82, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0xcb, 0xc0, 0xdb, 0x61, 0xe4, 0xe2, 0xf4, 0x03, 0xf5, 0x43, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0x06, 0xff, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0x06, 0xff, 0xe6, 0xfe, 0x06, 0xff, 0xa6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x25, 0xfe, 0x66, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0xe6, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x03, 0xf5, 0xe2, 0xf4, 0x61, 0xe4, 0xc0, 0xdb, 0x82, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xdc, 0xc0, 0xdb, 0x61, 0xe4, 0xa2, 0xec, 0x03, 0xf5, 0x43, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0x25, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0x06, 0xff, 0xa6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0xe6, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0xe2, 0xf4, 0x61, 0xe4, 0xc0, 0xdb, 0x82, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xd3, 0xc0, 0xdb, 0x21, 0xe4, 0xa2, 0xec, 0xe2, 0xf4, 0x43, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0x07, 0xfe, 0x25, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x46, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0xe6, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0xa2, 0xec, 0x61, 0xe4, 0xc0, 0xdb, 0x04, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xd3, 0x60, 0xcb, 0x21, 0xe4, 0xa2, 0xec, 0xe2, 0xf4, 0x03, 0xf5, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0x25, 0xfe, 0x07, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x03, 0xf5, 0xe2, 0xf4, 0xa2, 0xec, 0x21, 0xe4, 0xc0, 0xdb, 0xc4, 0xd3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0xcb, 0x41, 0xcb, 0x21, 0xe4, 0x61, 0xe4, 0xe2, 0xf4, 0x03, 0xf5, 0x43, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x66, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x66, 0xfe, 0x87, 0xfe, 0x46, 0xfe, 0x87, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x07, 0xfe, 0xe6, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0xe2, 0xf4, 0x61, 0xe4, 0x21, 0xe4, 0x60, 0xcb, 0xe4, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0xcc, 0x61, 0xcb, 0xc0, 0xdb, 0x61, 0xe4, 0xa2, 0xec, 0x03, 0xf5, 0x43, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0x07, 0xfe, 0x07, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x66, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0xa6, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0xa6, 0xfe, 0x87, 0xfe, 0xa6, 0xfe, 0x87, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x46, 0xfe, 0x87, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x07, 0xfe, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0xa2, 0xec, 0x61, 0xe4, 0x21, 0xe4, 0x61, 0xcb, 0x25, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0xcb, 0xc0, 0xdb, 0x21, 0xe4, 0xa2, 0xec, 0xe2, 0xf4, 0x03, 0xf5, 0x43, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0x07, 0xfe, 0x07, 0xfe, 0x46, 0xfe, 0x47, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x87, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0xe6, 0xfe, 0x46, 0xfe, 0x25, 0xcd, 0x64, 0xc4, 0xa2, 0xec, 0x43, 0xfd, 0xe6, 0xfd, 0x46, 0xfe, 0x46, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x46, 0xfe, 0x87, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x07, 0xfe, 0x46, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0xe6, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0xe2, 0xf4, 0xa2, 0xec, 0x21, 0xe4, 0xc0, 0xdb, 0x82, 0xcb, 0x25, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xdc, 0xc0, 0xdb, 0x21, 0xe4, 0x61, 0xe4, 0xe2, 0xf4, 0x03, 0xf5, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x47, 0xfe, 0xa3, 0xab, 0xc0, 0x71, 0x80, 0x69, 0x00, 0x7a, 0xe1, 0x9a, 0x64, 0xc4, 0x03, 0xf5, 0xe6, 0xfd, 0x46, 0xfe, 0x46, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x46, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0xe6, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0xe2, 0xf4, 0x61, 0xe4, 0x21, 0xe4, 0xc0, 0xdb, 0x04, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0xcb, 0x41, 0xcb, 0xc0, 0xdb, 0x61, 0xe4, 0xa2, 0xec, 0xe2, 0xf4, 0x03, 0xf5, 0x43, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0x07, 0xfe, 0x46, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x87, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0xa9, 0xfe, 0x47, 0xe6, 0x25, 0xcd, 0x21, 0xa3, 0xc0, 0x71, 0x40, 0x61, 0x00, 0x7a, 0x60, 0xcb, 0xa4, 0xfd, 0x46, 0xfe, 0x46, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x46, 0xfe, 0x47, 0xfe, 0x46, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0xe6, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0x03, 0xf5, 0xa2, 0xec, 0x61, 0xe4, 0xc0, 0xdb, 0x60, 0xcb, 0xe4, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0xcc, 0x61, 0xcb, 0xc0, 0xdb, 0x21, 0xe4, 0x61, 0xe4, 0xe2, 0xf4, 0x03, 0xf5, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0xa9, 0xfe, 0x09, 0xff, 0x09, 0xff, 0x47, 0xe6, 0xa3, 0xab, 0x80, 0x69, 0x40, 0x61, 0xe1, 0x9a, 0xa4, 0xfd, 0x07, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0xe6, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0xe2, 0xf4, 0xa2, 0xec, 0x21, 0xe4, 0xc0, 0xdb, 0x61, 0xcb, 0x25, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0xcb, 0x60, 0xcb, 0xc0, 0xdb, 0x61, 0xe4, 0xa2, 0xec, 0xe2, 0xf4, 0x03, 0xf5, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x09, 0xff, 0x07, 0xfe, 0x61, 0x8a, 0x80, 0x69, 0xc0, 0x71, 0xa2, 0xec, 0xe6, 0xfd, 0xe6, 0xfd, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0xe6, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0xe2, 0xf4, 0xa2, 0xec, 0x61, 0xe4, 0xc0, 0xdb, 0xc0, 0xdb, 0x82, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0xcb, 0x41, 0xcb, 0xc0, 0xdb, 0x21, 0xe4, 0x61, 0xe4, 0xe2, 0xf4, 0x03, 0xf5, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x47, 0xfe, 0x07, 0xfe, 0x64, 0xc4, 0x00, 0x7a, 0xc0, 0x71, 0xe1, 0x9a, 0x43, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0xe6, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0xe2, 0xf4, 0xa2, 0xec, 0x21, 0xe4, 0xc0, 0xdb, 0x41, 0xcb, 0xe4, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0xcb, 0xc0, 0xdb, 0xc0, 0xdb, 0x21, 0xe4, 0xa2, 0xec, 0xe2, 0xf4, 0x03, 0xf5, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x07, 0xfe, 0x03, 0xf5, 0xa3, 0xab, 0xc0, 0x71, 0x00, 0x7a, 0xa3, 0xab, 0x03, 0xf5, 0x43, 0xfd, 0x43, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0x07, 0xfe, 0xe6, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0xe2, 0xf4, 0xa2, 0xec, 0x61, 0xe4, 0xc0, 0xdb, 0xc0, 0xdb, 0x82, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0xcb, 0x41, 0xcb, 0xc0, 0xdb, 0x21, 0xe4, 0x61, 0xe4, 0xa2, 0xec, 0xe2, 0xf4, 0x03, 0xf5, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x07, 0xfe, 0x03, 0xf5, 0xa3, 0xab, 0x00, 0x7a, 0x80, 0x69, 0x61, 0x8a, 0x64, 0xc4, 0x43, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0x43, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0xe2, 0xf4, 0xe2, 0xf4, 0x61, 0xe4, 0x21, 0xe4, 0xc0, 0xdb, 0x60, 0xcb, 0xe4, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0xcb, 0xc0, 0xdb, 0xc0, 0xdb, 0x21, 0xe4, 0x61, 0xe4, 0xe2, 0xf4, 0x03, 0xf5, 0x03, 0xf5, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0x07, 0xfe, 0xe1, 0x9a, 0x40, 0x61, 0x40, 0x61, 0xa3, 0xab, 0xa4, 0xfd, 0x43, 0xfd, 0x81, 0xfc, 0x81, 0xfc, 0x03, 0xf5, 0x43, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0x03, 0xf5, 0xe2, 0xf4, 0xa2, 0xec, 0x21, 0xe4, 0xc0, 0xdb, 0xc0, 0xdb, 0x82, 0xcb, 0x25, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0xcb, 0x41, 0xcb, 0xc0, 0xdb, 0xc0, 0xdb, 0x61, 0xe4, 0xa2, 0xec, 0xe2, 0xf4, 0x03, 0xf5, 0x03, 0xf5, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0xa3, 0xab, 0x80, 0x69, 0xc0, 0x71, 0xa3, 0xab, 0xa2, 0xec, 0x81, 0xfc, 0x81, 0xfc, 0x03, 0xf5, 0x03, 0xf5, 0x43, 0xfd, 0x43, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0x03, 0xf5, 0xe2, 0xf4, 0xa2, 0xec, 0x61, 0xe4, 0x21, 0xe4, 0xc0, 0xdb, 0x41, 0xcb, 0xe4, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0xcb, 0x60, 0xcb, 0xc0, 0xdb, 0x21, 0xe4, 0x61, 0xe4, 0xa2, 0xec, 0xe2, 0xf4, 0x03, 0xf5, 0x03, 0xf5, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0xa9, 0xfe, 0x25, 0xcd, 0x21, 0xa3, 0xc0, 0x71, 0x00, 0x7a, 0x21, 0xa3, 0xc0, 0xdb, 0x81, 0xfc, 0x03, 0xf5, 0x43, 0xfd, 0x43, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0x03, 0xf5, 0xe2, 0xf4, 0xa2, 0xec, 0x61, 0xe4, 0x21, 0xe4, 0xc0, 0xdb, 0x60, 0xcb, 0x82, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0xcc, 0x61, 0xcb, 0x60, 0xcb, 0xc0, 0xdb, 0x21, 0xe4, 0x61, 0xe4, 0xa2, 0xec, 0xe2, 0xf4, 0x03, 0xf5, 0x03, 0xf5, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xa9, 0xfe, 0xa9, 0xfe, 0x64, 0xc4, 0xc0, 0x71, 0x40, 0x61, 0x00, 0x7a, 0x60, 0xcb, 0x03, 0xf5, 0x43, 0xfd, 0x43, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0x03, 0xf5, 0xe2, 0xf4, 0xa2, 0xec, 0x61, 0xe4, 0x21, 0xe4, 0xc0, 0xdb, 0xc0, 0xdb, 0x61, 0xcb, 0x25, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0xcb, 0x41, 0xcb, 0xc0, 0xdb, 0xc0, 0xdb, 0x21, 0xe4, 0x61, 0xe4, 0xa2, 0xec, 0xe2, 0xf4, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0x87, 0xfe, 0x25, 0xcd, 0x00, 0x7a, 0x80, 0x69, 0xc0, 0x71, 0x61, 0xe4, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0x03, 0xf5, 0xe2, 0xf4, 0xa2, 0xec, 0x61, 0xe4, 0x21, 0xe4, 0xc0, 0xdb, 0xc0, 0xdb, 0x41, 0xcb, 0xe4, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xd3, 0x60, 0xcb, 0xc0, 0xdb, 0xc0, 0xdb, 0x21, 0xe4, 0x61, 0xe4, 0xa2, 0xec, 0xe2, 0xf4, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0xa2, 0xec, 0x61, 0x8a, 0xc0, 0x71, 0x00, 0x7a, 0xa2, 0xec, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0xe2, 0xf4, 0xa2, 0xec, 0x61, 0xe4, 0x21, 0xe4, 0xc0, 0xdb, 0xc0, 0xdb, 0x60, 0xcb, 0x04, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0xcb, 0x60, 0xcb, 0xc0, 0xdb, 0xc0, 0xdb, 0x21, 0xe4, 0x61, 0xe4, 0xa2, 0xec, 0xe2, 0xf4, 0xe2, 0xf4, 0x03, 0xf5, 0x03, 0xf5, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0xa2, 0xec, 0x60, 0xcb, 0x00, 0x7a, 0xc0, 0x71, 0x61, 0x8a, 0x64, 0xc4, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0x03, 0xf5, 0xe2, 0xf4, 0xe2, 0xf4, 0xa2, 0xec, 0x61, 0xe4, 0x21, 0xe4, 0x21, 0xe4, 0xc0, 0xdb, 0x60, 0xcb, 0x82, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0xcc, 0x82, 0xcb, 0x60, 0xcb, 0xc0, 0xdb, 0xc0, 0xdb, 0x21, 0xe4, 0x61, 0xe4, 0xa2, 0xec, 0xa2, 0xec, 0xe2, 0xf4, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x61, 0xe4, 0x21, 0xa3, 0x61, 0x8a, 0xc0, 0x71, 0xc0, 0x71, 0xe1, 0x9a, 0x64, 0xc4, 0x43, 0xfd, 0xa4, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0xe2, 0xf4, 0xa2, 0xec, 0xa2, 0xec, 0x61, 0xe4, 0x21, 0xe4, 0x21, 0xe4, 0xc0, 0xdb, 0x60, 0xcb, 0x82, 0xcb, 0x25, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0xcc, 0x82, 0xcb, 0x60, 0xcb, 0xc0, 0xdb, 0xc0, 0xdb, 0x21, 0xe4, 0x61, 0xe4, 0x61, 0xe4, 0xa2, 0xec, 0xe2, 0xf4, 0xe2, 0xf4, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x64, 0xc4, 0xe1, 0x9a, 0x21, 0xa3, 0x64, 0xc4, 0x03, 0xf5, 0xa4, 0xfd, 0xa4, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0xe2, 0xf4, 0xe2, 0xf4, 0xa2, 0xec, 0xa2, 0xec, 0x61, 0xe4, 0x21, 0xe4, 0xc0, 0xdb, 0xc0, 0xdb, 0x60, 0xcb, 0x82, 0xcb, 0x25, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0xcc, 0x82, 0xcb, 0x60, 0xcb, 0xc0, 0xdb, 0xc0, 0xdb, 0x21, 0xe4, 0x21, 0xe4, 0x61, 0xe4, 0xa2, 0xec, 0xa2, 0xec, 0xe2, 0xf4, 0xe2, 0xf4, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0xe2, 0xf4, 0xe2, 0xf4, 0xa2, 0xec, 0xa2, 0xec, 0x61, 0xe4, 0x21, 0xe4, 0x21, 0xe4, 0xc0, 0xdb, 0xc0, 0xdb, 0x60, 0xcb, 0x82, 0xcb, 0x25, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xd3, 0x41, 0xcb, 0x60, 0xcb, 0xc0, 0xdb, 0x21, 0xe4, 0x21, 0xe4, 0x61, 0xe4, 0x61, 0xe4, 0xa2, 0xec, 0xa2, 0xec, 0xe2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf4, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x43, 0xfd, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0xe2, 0xf4, 0xe2, 0xf4, 0xa2, 0xec, 0xa2, 0xec, 0x61, 0xe4, 0x61, 0xe4, 0x21, 0xe4, 0x21, 0xe4, 0xc0, 0xdb, 0x60, 0xcb, 0x41, 0xcb, 0xc4, 0xd3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0xcb, 0x61, 0xcb, 0x60, 0xcb, 0xc0, 0xdb, 0xc0, 0xdb, 0x21, 0xe4, 0x21, 0xe4, 0x61, 0xe4, 0x61, 0xe4, 0xa2, 0xec, 0xa2, 0xec, 0xe2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf4, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0xe2, 0xf4, 0x03, 0xf5, 0x03, 0xf5, 0xe2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf4, 0xa2, 0xec, 0xa2, 0xec, 0xa2, 0xec, 0x61, 0xe4, 0x61, 0xe4, 0x21, 0xe4, 0x21, 0xe4, 0xc0, 0xdb, 0xc0, 0xdb, 0x60, 0xcb, 0x61, 0xcb, 0xe4, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0xcc, 0x82, 0xcb, 0x41, 0xcb, 0x60, 0xcb, 0xc0, 0xdb, 0xc0, 0xdb, 0x21, 0xe4, 0x21, 0xe4, 0x61, 0xe4, 0x61, 0xe4, 0xa2, 0xec, 0xa2, 0xec, 0xa2, 0xec, 0xa2, 0xec, 0xe2, 0xf4, 0xe2, 0xf4, 0xa2, 0xec, 0xe2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf4, 0xa2, 0xec, 0xe2, 0xf4, 0xa2, 0xec, 0xa2, 0xec, 0xa2, 0xec, 0x61, 0xe4, 0x61, 0xe4, 0x21, 0xe4, 0x21, 0xe4, 0xc0, 0xdb, 0xc0, 0xdb, 0x60, 0xcb, 0x41, 0xcb, 0x82, 0xcb, 0x25, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0xcb, 0x82, 0xcb, 0x41, 0xcb, 0x60, 0xcb, 0xc0, 0xdb, 0xc0, 0xdb, 0x21, 0xe4, 0x21, 0xe4, 0x21, 0xe4, 0x61, 0xe4, 0x61, 0xe4, 0x61, 0xe4, 0xa2, 0xec, 0x61, 0xe4, 0xa2, 0xec, 0xa2, 0xec, 0xa2, 0xec, 0xa2, 0xec, 0xa2, 0xec, 0xa2, 0xec, 0xa2, 0xec, 0x61, 0xe4, 0x61, 0xe4, 0x61, 0xe4, 0x61, 0xe4, 0x61, 0xe4, 0x21, 0xe4, 0x21, 0xe4, 0xc0, 0xdb, 0xc0, 0xdb, 0x60, 0xcb, 0x41, 0xcb, 0x82, 0xcb, 0xe4, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0xcc, 0xe4, 0xcb, 0x82, 0xcb, 0x41, 0xcb, 0x60, 0xcb, 0xc0, 0xdb, 0xc0, 0xdb, 0xc0, 0xdb, 0x21, 0xe4, 0x21, 0xe4, 0x21, 0xe4, 0x21, 0xe4, 0x61, 0xe4, 0x21, 0xe4, 0x61, 0xe4, 0x61, 0xe4, 0x61, 0xe4, 0x21, 0xe4, 0x61, 0xe4, 0x21, 0xe4, 0x61, 0xe4, 0x21, 0xe4, 0x21, 0xe4, 0x21, 0xe4, 0xc0, 0xdb, 0xc0, 0xdb, 0xc0, 0xdb, 0x60, 0xcb, 0x41, 0xcb, 0x82, 0xcb, 0xc4, 0xd3, 0x25, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0xcb, 0x82, 0xcb, 0x61, 0xcb, 0x41, 0xcb, 0x60, 0xcb, 0x60, 0xcb, 0xc0, 0xdb, 0xc0, 0xdb, 0xc0, 0xdb, 0xc0, 0xdb, 0xc0, 0xdb, 0x21, 0xe4, 0xc0, 0xdb, 0x21, 0xe4, 0xc0, 0xdb, 0x21, 0xe4, 0xc0, 0xdb, 0xc0, 0xdb, 0xc0, 0xdb, 0xc0, 0xdb, 0x60, 0xcb, 0x60, 0xcb, 0x41, 0xcb, 0x61, 0xcb, 0x82, 0xcb, 0xe4, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0xcc, 0xe4, 0xcb, 0x04, 0xdc, 0x82, 0xcb, 0x61, 0xcb, 0x41, 0xcb, 0x60, 0xcb, 0x60, 0xcb, 0x60, 0xcb, 0x60, 0xcb, 0x60, 0xcb, 0x60, 0xcb, 0x60, 0xcb, 0x60, 0xcb, 0x60, 0xcb, 0x60, 0xcb, 0x41, 0xcb, 0x61, 0xcb, 0x82, 0xcb, 0x04, 0xdc, 0xe4, 0xcb, 0x25, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0xcc, 0x25, 0xcc, 0xe4, 0xcb, 0xc4, 0xd3, 0x04, 0xdc, 0x82, 0xcb, 0x82, 0xcb, 0x82, 0xcb, 0x82, 0xcb, 0x82, 0xcb, 0x82, 0xcb, 0x04, 0xdc, 0xc4, 0xd3, 0xe4, 0xcb, 0x25, 0xcc, 0x25, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x25, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+#endif
+#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP != 0
+ /*Pixel format: Red: 5 bit, Green: 6 bit, Blue: 5 bit BUT the 2 bytes are swapped*/
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x25,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x25, 0xcb, 0xe4, 0xd3, 0xc4, 0xdc, 0x04, 0xdc, 0x04, 0xec, 0x84, 0xec, 0x84, 0xec, 0x84, 0xec, 0x84, 0xdc, 0x04, 0xdc, 0x04, 0xd3, 0xc4, 0xcb, 0xe4, 0xcc, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x25, 0xcb, 0xe4, 0xdc, 0x04, 0xec, 0x84, 0xf4, 0x83, 0xf5, 0x03, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0x01, 0xfd, 0xc5, 0xfe, 0x01, 0xfd, 0xa4, 0xfd, 0x83, 0xf5, 0x03, 0xf4, 0x83, 0xec, 0x84, 0xdc, 0x04, 0xcb, 0xe4, 0xcc, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0xe4, 0xdc, 0x04, 0xf4, 0x83, 0xf5, 0x03, 0xfd, 0x83, 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0x01, 0xfe, 0x01, 0xfd, 0x83, 0xf5, 0x03, 0xf4, 0x83, 0xec, 0x84, 0xcb, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0xe4, 0xec, 0x84, 0xf4, 0x42, 0xfd, 0x83, 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xff, 0x06, 0xff, 0x67, 0xff, 0x8a, 0xff, 0xac, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xac, 0xff, 0x8a, 0xff, 0x09, 0xff, 0x06, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0x01, 0xfe, 0x01, 0xfd, 0x83, 0xf5, 0x03, 0xec, 0x84, 0xcb, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0xe4, 0xec, 0x84, 0xf5, 0x03, 0xfd, 0x61, 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0xa1, 0xfe, 0xa1, 0xff, 0x09, 0xff, 0x4e, 0xff, 0xd3, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xd3, 0xff, 0xcf, 0xff, 0x09, 0xfe, 0xa6, 0xfe, 0xa1, 0xfe, 0x01, 0xfe, 0x01, 0xfd, 0x61, 0xf5, 0x03, 0xec, 0x84, 0xcb, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x25, 0xdc, 0x04, 0xf4, 0x42, 0xfd, 0x61, 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0xa1, 0xfe, 0xe6, 0xff, 0x4e, 0xff, 0xf6, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0x70, 0xff, 0x09, 0xfe, 0xa1, 0xfe, 0x01, 0xfe, 0x01, 0xfd, 0x61, 0xf4, 0x42, 0xec, 0x84, 0xcc, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0xe4, 0xf4, 0x83, 0xfd, 0x01, 0xfd, 0x61, 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0xa6, 0xff, 0x70, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xd1, 0xff, 0x09, 0xfe, 0xa1, 0xfe, 0x01, 0xfd, 0x61, 0xfd, 0x01, 0xf4, 0x83, 0xcb, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd3, 0xc4, 0xf4, 0x42, 0xfd, 0x61, 0xfd, 0x61, 0xfe, 0x01, 0xfe, 0xa1, 0xff, 0x4e, 0xff, 0xf6, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0x70, 0xfe, 0xa6, 0xfe, 0x01, 0xfd, 0x61, 0xfd, 0x61, 0xf4, 0x42, 0xd3, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x04, 0xfc, 0x81, 0xfd, 0x61, 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0xa9, 0xff, 0xd3, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0x0b, 0xfe, 0x01, 0xfe, 0x01, 0xfd, 0x61, 0xfc, 0x81, 0xec, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0x82, 0xfc, 0x81, 0xfd, 0x61, 0xfe, 0x01, 0xfe, 0x01, 0xff, 0x0b, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0x70, 0xfe, 0x25, 0xfe, 0x01, 0xfd, 0x61, 0xfc, 0x81, 0xec, 0x84, 0xcc, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x04, 0xfc, 0x81, 0xfd, 0x61, 0xfd, 0x61, 0xfe, 0x01, 0xff, 0x4e, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0x70, 0xfe, 0x66, 0xfe, 0x01, 0xfd, 0x61, 0xfc, 0x81, 0xec, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x04, 0xfc, 0x81, 0xfd, 0x61, 0xfd, 0x61, 0xfe, 0x25, 0xff, 0x4e, 0xff, 0xf6, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xf6, 0xff, 0xd3, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xd3, 0xff, 0xf6, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xf6, 0xff, 0x70, 0xfe, 0x87, 0xfd, 0x61, 0xfd, 0x61, 0xfc, 0x81, 0xec, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd3, 0xc4, 0xfc, 0x81, 0xfd, 0x01, 0xfd, 0x61, 0xfe, 0x01, 0xff, 0x4e, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xd3, 0xff, 0xf6, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0x70, 0xfe, 0x46, 0xfd, 0x61, 0xfd, 0x01, 0xfc, 0x81, 0xd3, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0xe4, 0xf4, 0x42, 0xfd, 0x01, 0xfd, 0x61, 0xfe, 0x01, 0xff, 0x4e, 0xff, 0xd3, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd3, 0xff, 0xd1, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xf6, 0xff, 0xd3, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xd3, 0xff, 0xf6, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd1, 0xff, 0xd3, 0xff, 0xd1, 0xff, 0x70, 0xff, 0xd3, 0xff, 0x70, 0xfe, 0x25, 0xfd, 0x61, 0xfd, 0x01, 0xf4, 0x42, 0xcb, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x25, 0xf4, 0x83, 0xfd, 0x01, 0xfd, 0x61, 0xfe, 0x01, 0xfe, 0xa9, 0xff, 0x70, 0xff, 0x70, 0xff, 0x70, 0xff, 0x70, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd3, 0xff, 0xd1, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd1, 0xff, 0xd3, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0x70, 0xff, 0xd1, 0xff, 0x70, 0xff, 0x70, 0xff, 0x70, 0xff, 0x4e, 0xfe, 0x01, 0xfd, 0x61, 0xfd, 0x01, 0xf4, 0x83, 0xcc, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x04, 0xfc, 0x81, 0xfd, 0x01, 0xfd, 0x61, 0xfe, 0x47, 0xff, 0x70, 0xff, 0x70, 0xff, 0x70, 0xff, 0x70, 0xff, 0xd1, 0xff, 0x70, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd3, 0xff, 0xd1, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd1, 0xff, 0xd3, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0x70, 0xff, 0x70, 0xff, 0x70, 0xff, 0x70, 0xff, 0x70, 0xfe, 0xa9, 0xfd, 0x61, 0xfd, 0x01, 0xfc, 0x81, 0xec, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0xe4, 0xf4, 0x42, 0xfd, 0x01, 0xfd, 0x61, 0xfd, 0xc5, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x70, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xd1, 0xff, 0xcf, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xcf, 0xff, 0xd1, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0x70, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xfe, 0x07, 0xfd, 0x61, 0xfd, 0x01, 0xf4, 0x42, 0xcb, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0x84, 0xfc, 0x81, 0xfd, 0x01, 0xfd, 0x61, 0xfe, 0xa9, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xd1, 0xff, 0xcf, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xcf, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xcf, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xcf, 0xff, 0xd1, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xd1, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x0b, 0xfd, 0x83, 0xfd, 0x01, 0xfc, 0x81, 0xcb, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0xe4, 0xf4, 0x42, 0xfd, 0x01, 0xfd, 0x61, 0xfd, 0xc5, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0xac, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xac, 0xff, 0xcf, 0xff, 0x4e, 0xff, 0xac, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x0b, 0xff, 0x0b, 0xfe, 0x47, 0xfd, 0x61, 0xfd, 0x01, 0xe4, 0x61, 0xcb, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0x82, 0xfc, 0x81, 0xfd, 0x01, 0xfd, 0x61, 0xfe, 0x47, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x4e, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xcf, 0xff, 0xac, 0xff, 0xcf, 0xff, 0xac, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xac, 0xff, 0xcf, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0x4e, 0xff, 0xac, 0xff, 0x4e, 0xff, 0xac, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xfe, 0xa9, 0xfd, 0xa4, 0xfd, 0x01, 0xfc, 0x81, 0xcb, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0xe4, 0xf4, 0x42, 0xfc, 0x81, 0xfd, 0x01, 0xfd, 0xc5, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0xa9, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0xac, 0xff, 0x4e, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0x0b, 0xff, 0xac, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0x07, 0xfd, 0x61, 0xfd, 0x01, 0xf4, 0x42, 0xcb, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x04, 0xfc, 0x81, 0xfd, 0x01, 0xfd, 0x61, 0xfe, 0x07, 0xfe, 0xa9, 0xfe, 0xa9, 0xff, 0x0b, 0xfe, 0xa9, 0xff, 0x0b, 0xff, 0x09, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x8a, 0xff, 0x0b, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0xac, 0xff, 0xac, 0xff, 0x8a, 0xfe, 0xa9, 0xff, 0x09, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0x09, 0xfe, 0xa9, 0xff, 0x8a, 0xff, 0xac, 0xff, 0x8a, 0xff, 0x0b, 0xff, 0x8a, 0xff, 0x0b, 0xff, 0x8a, 0xff, 0x0b, 0xff, 0x8a, 0xff, 0x0b, 0xff, 0x09, 0xff, 0x0b, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0x07, 0xfd, 0x83, 0xfd, 0x01, 0xfc, 0x81, 0xec, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x25, 0xf4, 0x83, 0xfc, 0x81, 0xfd, 0x01, 0xfd, 0x83, 0xfe, 0x47, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0xa9, 0xff, 0x0b, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x8a, 0xff, 0x0b, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xe6, 0x47, 0xab, 0xa3, 0x8a, 0x61, 0xa3, 0x21, 0xe6, 0x47, 0xff, 0x8a, 0xff, 0xac, 0xff, 0x8a, 0xff, 0xac, 0xff, 0x8a, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0x8a, 0xff, 0xac, 0xff, 0xac, 0xff, 0x8a, 0xff, 0xac, 0xff, 0x8a, 0xcd, 0x25, 0x9a, 0xe1, 0x8a, 0x61, 0xc4, 0x64, 0xfe, 0xa9, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x0b, 0xff, 0x8a, 0xff, 0x09, 0xff, 0x09, 0xff, 0x0b, 0xff, 0x09, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0x47, 0xfd, 0xa4, 0xfd, 0x01, 0xfc, 0x81, 0xf4, 0x83, 0xcc, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0xe4, 0xf4, 0x42, 0xfc, 0x81, 0xfd, 0x01, 0xfd, 0xa4, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0xa9, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x8a, 0xff, 0x8a, 0xe6, 0x47, 0x8a, 0x61, 0x61, 0x40, 0x69, 0x80, 0x61, 0x40, 0x71, 0xc0, 0xe6, 0x47, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xc4, 0x64, 0x69, 0x80, 0x61, 0x40, 0x69, 0x80, 0x61, 0x40, 0xa3, 0x21, 0xfe, 0xa9, 0xff, 0x8a, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xfe, 0xa9, 0xff, 0x09, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfd, 0xe6, 0xfd, 0x01, 0xfc, 0x81, 0xe4, 0x21, 0xcb, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x04, 0xfc, 0x81, 0xfc, 0x81, 0xfd, 0x01, 0xfd, 0xc5, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0xa9, 0xfe, 0xe6, 0xfe, 0xa9, 0xfe, 0xa9, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xab, 0xa3, 0x69, 0x80, 0x8a, 0x61, 0x8a, 0x61, 0x8a, 0x61, 0x69, 0x80, 0x9a, 0xe1, 0xff, 0x09, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xe6, 0x47, 0x7a, 0x00, 0x71, 0xc0, 0x8a, 0x61, 0x8a, 0x61, 0x7a, 0x00, 0x69, 0x80, 0xcd, 0x25, 0xff, 0x67, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0x87, 0xfe, 0xa9, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x07, 0xfd, 0xe6, 0xfd, 0x43, 0xfc, 0x81, 0xfc, 0x81, 0xdc, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0x82, 0xfc, 0x81, 0xfc, 0x81, 0xfd, 0x43, 0xfd, 0xc5, 0xfe, 0x07, 0xfe, 0x46, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0xe6, 0xff, 0x09, 0xfe, 0xe6, 0xff, 0x09, 0xff, 0x09, 0xff, 0x67, 0xff, 0x67, 0xfe, 0xe6, 0x8a, 0x61, 0x7a, 0x00, 0x9a, 0xe1, 0xa3, 0x21, 0x9a, 0xe1, 0x8a, 0x61, 0x7a, 0x00, 0xe6, 0x47, 0xff, 0x8a, 0xff, 0x67, 0xff, 0x67, 0xff, 0x8a, 0xff, 0x67, 0xff, 0x67, 0xff, 0x8a, 0xff, 0x67, 0xff, 0x8a, 0xff, 0x8a, 0xcd, 0x25, 0x71, 0xc0, 0x8a, 0x61, 0xa3, 0x21, 0xa3, 0x21, 0x9a, 0xe1, 0x71, 0xc0, 0xab, 0xa3, 0xff, 0x09, 0xff, 0x67, 0xff, 0x09, 0xff, 0x09, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xa9, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x47, 0xfe, 0x46, 0xfe, 0x07, 0xfd, 0xe6, 0xfd, 0x43, 0xfc, 0x81, 0xfc, 0x81, 0xcb, 0x82, 0xcc, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x25, 0xcb, 0x61, 0xfc, 0x81, 0xfd, 0x01, 0xfd, 0x43, 0xfd, 0xc5, 0xfd, 0xe6, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xff, 0x67, 0xe6, 0x47, 0x8a, 0x61, 0x8a, 0x61, 0xa3, 0x21, 0xa3, 0x21, 0xa3, 0x21, 0x9a, 0xe1, 0x7a, 0x00, 0xe6, 0x47, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xcd, 0x25, 0x7a, 0x00, 0x9a, 0xe1, 0xa3, 0x21, 0xa3, 0x21, 0xa3, 0x21, 0x7a, 0x00, 0x9a, 0xe1, 0xff, 0x06, 0xff, 0x67, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xa9, 0xfe, 0xe6, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x47, 0xfe, 0x46, 0xfe, 0x46, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0x43, 0xfd, 0x01, 0xfc, 0x81, 0xcb, 0x61, 0xcc, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0xe4, 0xdb, 0xc0, 0xfc, 0x81, 0xfd, 0x01, 0xfd, 0x43, 0xfd, 0xa4, 0xfd, 0xc5, 0xfe, 0x25, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xff, 0x67, 0xfe, 0xe6, 0x8a, 0x61, 0x8a, 0x61, 0xa3, 0x21, 0xa3, 0x21, 0xa3, 0x21, 0x9a, 0xe1, 0x8a, 0x61, 0xe6, 0x47, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xcd, 0x25, 0x7a, 0x00, 0x9a, 0xe1, 0xa3, 0x21, 0xa3, 0x21, 0xa3, 0x21, 0x8a, 0x61, 0xa3, 0x21, 0xff, 0x06, 0xff, 0x06, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x25, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0x43, 0xfd, 0x01, 0xfc, 0x81, 0xdb, 0xc0, 0xcb, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0xe4, 0xdb, 0xc0, 0xec, 0xa2, 0xf4, 0xe2, 0xfd, 0x43, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xe6, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x46, 0xfe, 0x66, 0xfe, 0x87, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xff, 0x67, 0xab, 0xa3, 0x8a, 0x61, 0xa3, 0x21, 0xa3, 0x21, 0xa3, 0x21, 0x8a, 0x61, 0xa3, 0x21, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xe6, 0x47, 0x8a, 0x61, 0x9a, 0xe1, 0xa3, 0x21, 0xa3, 0x21, 0xa3, 0x21, 0x7a, 0x00, 0xc4, 0x64, 0xff, 0x67, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x46, 0xfe, 0x25, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x43, 0xf5, 0x03, 0xec, 0xa2, 0xe4, 0x21, 0xd3, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd3, 0xc4, 0xe4, 0x21, 0xec, 0xa2, 0xf4, 0xe2, 0xfd, 0x43, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x46, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xe6, 0xff, 0x06, 0xe6, 0x47, 0x8a, 0x61, 0x8a, 0x61, 0x9a, 0xe1, 0x8a, 0x61, 0x8a, 0x61, 0xe6, 0x47, 0xff, 0x67, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x67, 0xff, 0x67, 0xcd, 0x25, 0x8a, 0x61, 0x9a, 0xe1, 0x9a, 0xe1, 0x8a, 0x61, 0xa3, 0x21, 0xfe, 0xe6, 0xff, 0x06, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x43, 0xf5, 0x03, 0xec, 0xa2, 0xe4, 0x21, 0xdc, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0x82, 0xe4, 0x21, 0xec, 0xa2, 0xf4, 0xe2, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xff, 0x67, 0xe6, 0x47, 0xab, 0xa3, 0xa3, 0x21, 0xab, 0xa3, 0xe6, 0x47, 0xff, 0x67, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x67, 0xff, 0x67, 0xcd, 0x25, 0xa3, 0x21, 0xa3, 0x21, 0xc4, 0x64, 0xe6, 0x47, 0xff, 0x06, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x43, 0xf4, 0xe2, 0xec, 0xa2, 0xe4, 0x21, 0xcb, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0x82, 0xe4, 0x21, 0xe4, 0x61, 0xf4, 0xe2, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xff, 0x67, 0xff, 0x67, 0xff, 0x09, 0xff, 0x67, 0xff, 0x67, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x67, 0xff, 0x09, 0xfe, 0xe6, 0xff, 0x67, 0xff, 0x06, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x43, 0xf4, 0xe2, 0xec, 0xa2, 0xe4, 0x21, 0xcb, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0x82, 0xe4, 0x21, 0xe4, 0x61, 0xf4, 0xe2, 0xf5, 0x03, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xe6, 0xff, 0x06, 0xff, 0x06, 0xfe, 0xe6, 0xfe, 0xe6, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x43, 0xf4, 0xe2, 0xe4, 0x61, 0xe4, 0x21, 0xcb, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0x82, 0xdb, 0xc0, 0xe4, 0x61, 0xf4, 0xe2, 0xf5, 0x03, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x66, 0xfe, 0x25, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xff, 0x06, 0xfe, 0xa6, 0xff, 0x06, 0xfe, 0xe6, 0xfe, 0xe6, 0xff, 0x06, 0xfe, 0xe6, 0xff, 0x06, 0xfe, 0xe6, 0xff, 0x06, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xa6, 0xff, 0x06, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xf5, 0x03, 0xf4, 0xe2, 0xe4, 0x61, 0xe4, 0x21, 0xcb, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0x82, 0xdb, 0xc0, 0xe4, 0x61, 0xf4, 0xe2, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xe6, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xff, 0x06, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xff, 0x06, 0xfe, 0xe6, 0xff, 0x06, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x25, 0xfe, 0x66, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0x83, 0xfd, 0x83, 0xf5, 0x03, 0xf4, 0xe2, 0xe4, 0x61, 0xdb, 0xc0, 0xcb, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x04, 0xdb, 0xc0, 0xe4, 0x61, 0xec, 0xa2, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfe, 0x25, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xff, 0x06, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x25, 0xfe, 0x25, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x43, 0xf5, 0x03, 0xf4, 0xe2, 0xe4, 0x61, 0xdb, 0xc0, 0xcb, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd3, 0xc4, 0xdb, 0xc0, 0xe4, 0x21, 0xec, 0xa2, 0xf4, 0xe2, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfe, 0x07, 0xfe, 0x25, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x46, 0xfe, 0x25, 0xfe, 0x25, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x43, 0xf5, 0x03, 0xec, 0xa2, 0xe4, 0x61, 0xdb, 0xc0, 0xdc, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd3, 0xc4, 0xcb, 0x60, 0xe4, 0x21, 0xec, 0xa2, 0xf4, 0xe2, 0xf5, 0x03, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xe6, 0xfd, 0xe6, 0xfe, 0x25, 0xfe, 0x07, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x83, 0xf5, 0x03, 0xf4, 0xe2, 0xec, 0xa2, 0xe4, 0x21, 0xdb, 0xc0, 0xd3, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0xe4, 0xcb, 0x41, 0xe4, 0x21, 0xe4, 0x61, 0xf4, 0xe2, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x66, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x66, 0xfe, 0x87, 0xfe, 0x46, 0xfe, 0x87, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x07, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x43, 0xf5, 0x03, 0xf4, 0xe2, 0xe4, 0x61, 0xe4, 0x21, 0xcb, 0x60, 0xcb, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x25, 0xcb, 0x61, 0xdb, 0xc0, 0xe4, 0x61, 0xec, 0xa2, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xe6, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x66, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0xa6, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0xa6, 0xfe, 0x87, 0xfe, 0xa6, 0xfe, 0x87, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x46, 0xfe, 0x87, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x07, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x43, 0xf5, 0x03, 0xec, 0xa2, 0xe4, 0x61, 0xe4, 0x21, 0xcb, 0x61, 0xcc, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0x82, 0xdb, 0xc0, 0xe4, 0x21, 0xec, 0xa2, 0xf4, 0xe2, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x46, 0xfe, 0x47, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x87, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0xe6, 0xfe, 0x46, 0xcd, 0x25, 0xc4, 0x64, 0xec, 0xa2, 0xfd, 0x43, 0xfd, 0xe6, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x46, 0xfe, 0x87, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x07, 0xfe, 0x46, 0xfe, 0x07, 0xfe, 0x07, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x43, 0xf5, 0x03, 0xf4, 0xe2, 0xec, 0xa2, 0xe4, 0x21, 0xdb, 0xc0, 0xcb, 0x82, 0xcc, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x04, 0xdb, 0xc0, 0xe4, 0x21, 0xe4, 0x61, 0xf4, 0xe2, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x47, 0xab, 0xa3, 0x71, 0xc0, 0x69, 0x80, 0x7a, 0x00, 0x9a, 0xe1, 0xc4, 0x64, 0xf5, 0x03, 0xfd, 0xe6, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x46, 0xfe, 0x07, 0xfe, 0x07, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x43, 0xf5, 0x03, 0xf4, 0xe2, 0xe4, 0x61, 0xe4, 0x21, 0xdb, 0xc0, 0xdc, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0xe4, 0xcb, 0x41, 0xdb, 0xc0, 0xe4, 0x61, 0xec, 0xa2, 0xf4, 0xe2, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfe, 0x07, 0xfe, 0x46, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x87, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0xa9, 0xe6, 0x47, 0xcd, 0x25, 0xa3, 0x21, 0x71, 0xc0, 0x61, 0x40, 0x7a, 0x00, 0xcb, 0x60, 0xfd, 0xa4, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x46, 0xfe, 0x47, 0xfe, 0x46, 0xfe, 0x07, 0xfe, 0x07, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x43, 0xf5, 0x03, 0xf5, 0x03, 0xec, 0xa2, 0xe4, 0x61, 0xdb, 0xc0, 0xcb, 0x60, 0xcb, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x25, 0xcb, 0x61, 0xdb, 0xc0, 0xe4, 0x21, 0xe4, 0x61, 0xf4, 0xe2, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xe6, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0xa9, 0xff, 0x09, 0xff, 0x09, 0xe6, 0x47, 0xab, 0xa3, 0x69, 0x80, 0x61, 0x40, 0x9a, 0xe1, 0xfd, 0xa4, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x43, 0xf5, 0x03, 0xf4, 0xe2, 0xec, 0xa2, 0xe4, 0x21, 0xdb, 0xc0, 0xcb, 0x61, 0xcc, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0x82, 0xcb, 0x60, 0xdb, 0xc0, 0xe4, 0x61, 0xec, 0xa2, 0xf4, 0xe2, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xe6, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x87, 0xff, 0x09, 0xfe, 0x07, 0x8a, 0x61, 0x69, 0x80, 0x71, 0xc0, 0xec, 0xa2, 0xfd, 0xe6, 0xfd, 0xe6, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x43, 0xf5, 0x03, 0xf4, 0xe2, 0xec, 0xa2, 0xe4, 0x61, 0xdb, 0xc0, 0xdb, 0xc0, 0xcb, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0xe4, 0xcb, 0x41, 0xdb, 0xc0, 0xe4, 0x21, 0xe4, 0x61, 0xf4, 0xe2, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xe6, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x47, 0xfe, 0x07, 0xc4, 0x64, 0x7a, 0x00, 0x71, 0xc0, 0x9a, 0xe1, 0xfd, 0x43, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x43, 0xf5, 0x03, 0xf4, 0xe2, 0xec, 0xa2, 0xe4, 0x21, 0xdb, 0xc0, 0xcb, 0x41, 0xcb, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0x82, 0xdb, 0xc0, 0xdb, 0xc0, 0xe4, 0x21, 0xec, 0xa2, 0xf4, 0xe2, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x07, 0xf5, 0x03, 0xab, 0xa3, 0x71, 0xc0, 0x7a, 0x00, 0xab, 0xa3, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0xe6, 0xfd, 0xe6, 0xfe, 0x07, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x43, 0xf5, 0x03, 0xf4, 0xe2, 0xec, 0xa2, 0xe4, 0x61, 0xdb, 0xc0, 0xdb, 0xc0, 0xcb, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0xe4, 0xcb, 0x41, 0xdb, 0xc0, 0xe4, 0x21, 0xe4, 0x61, 0xec, 0xa2, 0xf4, 0xe2, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x07, 0xf5, 0x03, 0xab, 0xa3, 0x7a, 0x00, 0x69, 0x80, 0x8a, 0x61, 0xc4, 0x64, 0xfd, 0x43, 0xfd, 0x43, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x43, 0xf5, 0x03, 0xf4, 0xe2, 0xf4, 0xe2, 0xe4, 0x61, 0xe4, 0x21, 0xdb, 0xc0, 0xcb, 0x60, 0xcb, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0x82, 0xdb, 0xc0, 0xdb, 0xc0, 0xe4, 0x21, 0xe4, 0x61, 0xf4, 0xe2, 0xf5, 0x03, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0x07, 0x9a, 0xe1, 0x61, 0x40, 0x61, 0x40, 0xab, 0xa3, 0xfd, 0xa4, 0xfd, 0x43, 0xfc, 0x81, 0xfc, 0x81, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x43, 0xf5, 0x03, 0xf5, 0x03, 0xf4, 0xe2, 0xec, 0xa2, 0xe4, 0x21, 0xdb, 0xc0, 0xdb, 0xc0, 0xcb, 0x82, 0xcc, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0xe4, 0xcb, 0x41, 0xdb, 0xc0, 0xdb, 0xc0, 0xe4, 0x61, 0xec, 0xa2, 0xf4, 0xe2, 0xf5, 0x03, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x47, 0xab, 0xa3, 0x69, 0x80, 0x71, 0xc0, 0xab, 0xa3, 0xec, 0xa2, 0xfc, 0x81, 0xfc, 0x81, 0xf5, 0x03, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x43, 0xf5, 0x03, 0xf5, 0x03, 0xf4, 0xe2, 0xec, 0xa2, 0xe4, 0x61, 0xe4, 0x21, 0xdb, 0xc0, 0xcb, 0x41, 0xcb, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0x82, 0xcb, 0x60, 0xdb, 0xc0, 0xe4, 0x21, 0xe4, 0x61, 0xec, 0xa2, 0xf4, 0xe2, 0xf5, 0x03, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0xa9, 0xcd, 0x25, 0xa3, 0x21, 0x71, 0xc0, 0x7a, 0x00, 0xa3, 0x21, 0xdb, 0xc0, 0xfc, 0x81, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x43, 0xf5, 0x03, 0xf5, 0x03, 0xf4, 0xe2, 0xec, 0xa2, 0xe4, 0x61, 0xe4, 0x21, 0xdb, 0xc0, 0xcb, 0x60, 0xcb, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x25, 0xcb, 0x61, 0xcb, 0x60, 0xdb, 0xc0, 0xe4, 0x21, 0xe4, 0x61, 0xec, 0xa2, 0xf4, 0xe2, 0xf5, 0x03, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfe, 0xa9, 0xfe, 0xa9, 0xc4, 0x64, 0x71, 0xc0, 0x61, 0x40, 0x7a, 0x00, 0xcb, 0x60, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x43, 0xf5, 0x03, 0xf5, 0x03, 0xf4, 0xe2, 0xec, 0xa2, 0xe4, 0x61, 0xe4, 0x21, 0xdb, 0xc0, 0xdb, 0xc0, 0xcb, 0x61, 0xcc, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0xe4, 0xcb, 0x41, 0xdb, 0xc0, 0xdb, 0xc0, 0xe4, 0x21, 0xe4, 0x61, 0xec, 0xa2, 0xf4, 0xe2, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0xc5, 0xfe, 0x87, 0xcd, 0x25, 0x7a, 0x00, 0x69, 0x80, 0x71, 0xc0, 0xe4, 0x61, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xf5, 0x03, 0xf5, 0x03, 0xf4, 0xe2, 0xec, 0xa2, 0xe4, 0x61, 0xe4, 0x21, 0xdb, 0xc0, 0xdb, 0xc0, 0xcb, 0x41, 0xcb, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd3, 0xc4, 0xcb, 0x60, 0xdb, 0xc0, 0xdb, 0xc0, 0xe4, 0x21, 0xe4, 0x61, 0xec, 0xa2, 0xf4, 0xe2, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xec, 0xa2, 0x8a, 0x61, 0x71, 0xc0, 0x7a, 0x00, 0xec, 0xa2, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf4, 0xe2, 0xec, 0xa2, 0xe4, 0x61, 0xe4, 0x21, 0xdb, 0xc0, 0xdb, 0xc0, 0xcb, 0x60, 0xdc, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0x82, 0xcb, 0x60, 0xdb, 0xc0, 0xdb, 0xc0, 0xe4, 0x21, 0xe4, 0x61, 0xec, 0xa2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf5, 0x03, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x43, 0xec, 0xa2, 0xcb, 0x60, 0x7a, 0x00, 0x71, 0xc0, 0x8a, 0x61, 0xc4, 0x64, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xf5, 0x03, 0xf5, 0x03, 0xf4, 0xe2, 0xf4, 0xe2, 0xec, 0xa2, 0xe4, 0x61, 0xe4, 0x21, 0xe4, 0x21, 0xdb, 0xc0, 0xcb, 0x60, 0xcb, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x25, 0xcb, 0x82, 0xcb, 0x60, 0xdb, 0xc0, 0xdb, 0xc0, 0xe4, 0x21, 0xe4, 0x61, 0xec, 0xa2, 0xec, 0xa2, 0xf4, 0xe2, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x43, 0xe4, 0x61, 0xa3, 0x21, 0x8a, 0x61, 0x71, 0xc0, 0x71, 0xc0, 0x9a, 0xe1, 0xc4, 0x64, 0xfd, 0x43, 0xfd, 0xa4, 0xfd, 0x43, 0xfd, 0x43, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf4, 0xe2, 0xec, 0xa2, 0xec, 0xa2, 0xe4, 0x61, 0xe4, 0x21, 0xe4, 0x21, 0xdb, 0xc0, 0xcb, 0x60, 0xcb, 0x82, 0xcc, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x25, 0xcb, 0x82, 0xcb, 0x60, 0xdb, 0xc0, 0xdb, 0xc0, 0xe4, 0x21, 0xe4, 0x61, 0xe4, 0x61, 0xec, 0xa2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x43, 0xc4, 0x64, 0x9a, 0xe1, 0xa3, 0x21, 0xc4, 0x64, 0xf5, 0x03, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0x43, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf4, 0xe2, 0xf4, 0xe2, 0xec, 0xa2, 0xec, 0xa2, 0xe4, 0x61, 0xe4, 0x21, 0xdb, 0xc0, 0xdb, 0xc0, 0xcb, 0x60, 0xcb, 0x82, 0xcc, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x25, 0xcb, 0x82, 0xcb, 0x60, 0xdb, 0xc0, 0xdb, 0xc0, 0xe4, 0x21, 0xe4, 0x21, 0xe4, 0x61, 0xec, 0xa2, 0xec, 0xa2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x43, 0xfd, 0x43, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf4, 0xe2, 0xf4, 0xe2, 0xec, 0xa2, 0xec, 0xa2, 0xe4, 0x61, 0xe4, 0x21, 0xe4, 0x21, 0xdb, 0xc0, 0xdb, 0xc0, 0xcb, 0x60, 0xcb, 0x82, 0xcc, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd3, 0xc4, 0xcb, 0x41, 0xcb, 0x60, 0xdb, 0xc0, 0xe4, 0x21, 0xe4, 0x21, 0xe4, 0x61, 0xe4, 0x61, 0xec, 0xa2, 0xec, 0xa2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xfd, 0x43, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf4, 0xe2, 0xf4, 0xe2, 0xec, 0xa2, 0xec, 0xa2, 0xe4, 0x61, 0xe4, 0x61, 0xe4, 0x21, 0xe4, 0x21, 0xdb, 0xc0, 0xcb, 0x60, 0xcb, 0x41, 0xd3, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0xe4, 0xcb, 0x61, 0xcb, 0x60, 0xdb, 0xc0, 0xdb, 0xc0, 0xe4, 0x21, 0xe4, 0x21, 0xe4, 0x61, 0xe4, 0x61, 0xec, 0xa2, 0xec, 0xa2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf4, 0xe2, 0xf5, 0x03, 0xf5, 0x03, 0xf4, 0xe2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf4, 0xe2, 0xec, 0xa2, 0xec, 0xa2, 0xec, 0xa2, 0xe4, 0x61, 0xe4, 0x61, 0xe4, 0x21, 0xe4, 0x21, 0xdb, 0xc0, 0xdb, 0xc0, 0xcb, 0x60, 0xcb, 0x61, 0xcb, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x25, 0xcb, 0x82, 0xcb, 0x41, 0xcb, 0x60, 0xdb, 0xc0, 0xdb, 0xc0, 0xe4, 0x21, 0xe4, 0x21, 0xe4, 0x61, 0xe4, 0x61, 0xec, 0xa2, 0xec, 0xa2, 0xec, 0xa2, 0xec, 0xa2, 0xf4, 0xe2, 0xf4, 0xe2, 0xec, 0xa2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf4, 0xe2, 0xec, 0xa2, 0xf4, 0xe2, 0xec, 0xa2, 0xec, 0xa2, 0xec, 0xa2, 0xe4, 0x61, 0xe4, 0x61, 0xe4, 0x21, 0xe4, 0x21, 0xdb, 0xc0, 0xdb, 0xc0, 0xcb, 0x60, 0xcb, 0x41, 0xcb, 0x82, 0xcc, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0xe4, 0xcb, 0x82, 0xcb, 0x41, 0xcb, 0x60, 0xdb, 0xc0, 0xdb, 0xc0, 0xe4, 0x21, 0xe4, 0x21, 0xe4, 0x21, 0xe4, 0x61, 0xe4, 0x61, 0xe4, 0x61, 0xec, 0xa2, 0xe4, 0x61, 0xec, 0xa2, 0xec, 0xa2, 0xec, 0xa2, 0xec, 0xa2, 0xec, 0xa2, 0xec, 0xa2, 0xec, 0xa2, 0xe4, 0x61, 0xe4, 0x61, 0xe4, 0x61, 0xe4, 0x61, 0xe4, 0x61, 0xe4, 0x21, 0xe4, 0x21, 0xdb, 0xc0, 0xdb, 0xc0, 0xcb, 0x60, 0xcb, 0x41, 0xcb, 0x82, 0xcb, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x25, 0xcb, 0xe4, 0xcb, 0x82, 0xcb, 0x41, 0xcb, 0x60, 0xdb, 0xc0, 0xdb, 0xc0, 0xdb, 0xc0, 0xe4, 0x21, 0xe4, 0x21, 0xe4, 0x21, 0xe4, 0x21, 0xe4, 0x61, 0xe4, 0x21, 0xe4, 0x61, 0xe4, 0x61, 0xe4, 0x61, 0xe4, 0x21, 0xe4, 0x61, 0xe4, 0x21, 0xe4, 0x61, 0xe4, 0x21, 0xe4, 0x21, 0xe4, 0x21, 0xdb, 0xc0, 0xdb, 0xc0, 0xdb, 0xc0, 0xcb, 0x60, 0xcb, 0x41, 0xcb, 0x82, 0xd3, 0xc4, 0xcc, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0xe4, 0xcb, 0x82, 0xcb, 0x61, 0xcb, 0x41, 0xcb, 0x60, 0xcb, 0x60, 0xdb, 0xc0, 0xdb, 0xc0, 0xdb, 0xc0, 0xdb, 0xc0, 0xdb, 0xc0, 0xe4, 0x21, 0xdb, 0xc0, 0xe4, 0x21, 0xdb, 0xc0, 0xe4, 0x21, 0xdb, 0xc0, 0xdb, 0xc0, 0xdb, 0xc0, 0xdb, 0xc0, 0xcb, 0x60, 0xcb, 0x60, 0xcb, 0x41, 0xcb, 0x61, 0xcb, 0x82, 0xcb, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x25, 0xcb, 0xe4, 0xdc, 0x04, 0xcb, 0x82, 0xcb, 0x61, 0xcb, 0x41, 0xcb, 0x60, 0xcb, 0x60, 0xcb, 0x60, 0xcb, 0x60, 0xcb, 0x60, 0xcb, 0x60, 0xcb, 0x60, 0xcb, 0x60, 0xcb, 0x60, 0xcb, 0x60, 0xcb, 0x41, 0xcb, 0x61, 0xcb, 0x82, 0xdc, 0x04, 0xcb, 0xe4, 0xcc, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x25, 0xcc, 0x25, 0xcb, 0xe4, 0xd3, 0xc4, 0xdc, 0x04, 0xcb, 0x82, 0xcb, 0x82, 0xcb, 0x82, 0xcb, 0x82, 0xcb, 0x82, 0xcb, 0x82, 0xdc, 0x04, 0xd3, 0xc4, 0xcb, 0xe4, 0xcc, 0x25, 0xcc, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xcc, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+#endif
+#if LV_COLOR_DEPTH == 32
+ /*Pixel format: Fix 0xFF: 8 bit, Red: 8 bit, Green: 8 bit, Blue: 8 bit*/
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x28, 0x86, 0xc9, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x1e, 0x79, 0xce, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x22, 0x8f, 0xe6, 0xff, 0x22, 0x8f, 0xe6, 0xff, 0x22, 0x8f, 0xe6, 0xff, 0x22, 0x8f, 0xe6, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x1e, 0x79, 0xce, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x22, 0x8f, 0xe6, 0xff, 0x18, 0x8f, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x18, 0x8f, 0xed, 0xff, 0x22, 0x8f, 0xe6, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x18, 0x8f, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x18, 0x8f, 0xed, 0xff, 0x22, 0x8f, 0xe6, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x22, 0x8f, 0xe6, 0xff, 0x0e, 0x8a, 0xf1, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x22, 0x8f, 0xe6, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x22, 0x8f, 0xe6, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x05, 0xae, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x05, 0xae, 0xff, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x22, 0x8f, 0xe6, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x0e, 0x8a, 0xf1, 0xff, 0x05, 0xae, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x05, 0xae, 0xff, 0xff, 0x0e, 0x8a, 0xf1, 0xff, 0x22, 0x8f, 0xe6, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x18, 0x8f, 0xed, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x05, 0xae, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x05, 0xae, 0xff, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x18, 0x8f, 0xed, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x1e, 0x79, 0xce, 0xff, 0x0e, 0x8a, 0xf1, 0xff, 0x05, 0xae, 0xff, 0xff, 0x05, 0xae, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x05, 0xae, 0xff, 0xff, 0x05, 0xae, 0xff, 0xff, 0x0e, 0x8a, 0xf1, 0xff, 0x1e, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x05, 0xae, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x05, 0xae, 0xff, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x22, 0x8f, 0xe6, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x14, 0x70, 0xc5, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x05, 0xae, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x05, 0xae, 0xff, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x22, 0x8f, 0xe6, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x05, 0xae, 0xff, 0xff, 0x05, 0xae, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x05, 0xae, 0xff, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x22, 0x8f, 0xe6, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x05, 0xae, 0xff, 0xff, 0x05, 0xae, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x05, 0xae, 0xff, 0xff, 0x05, 0xae, 0xff, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x22, 0x8f, 0xe6, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x1e, 0x79, 0xce, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x05, 0xae, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x05, 0xae, 0xff, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x1e, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x0e, 0x8a, 0xf1, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x05, 0xae, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x05, 0xae, 0xff, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x0e, 0x8a, 0xf1, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x18, 0x8f, 0xed, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x05, 0xae, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x82, 0xec, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x05, 0xae, 0xff, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x18, 0x8f, 0xed, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x05, 0xae, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x05, 0xae, 0xff, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x22, 0x8f, 0xe6, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x0e, 0x8a, 0xf1, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x05, 0xae, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x05, 0xae, 0xff, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x0e, 0x8a, 0xf1, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x22, 0x8f, 0xe6, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x05, 0xae, 0xff, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x13, 0x71, 0xcc, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x0e, 0x8a, 0xf1, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x05, 0xae, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x05, 0xae, 0xff, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x13, 0x6f, 0xc7, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x05, 0xae, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x13, 0x71, 0xcc, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x0e, 0x8a, 0xf1, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x05, 0xae, 0xff, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x0e, 0x8a, 0xf1, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x05, 0xae, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x22, 0x8f, 0xe6, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x18, 0x8f, 0xed, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x36, 0xc8, 0xe0, 0xff, 0x1a, 0x74, 0xaa, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x36, 0xc8, 0xe0, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x2a, 0xa5, 0xca, 0xff, 0x0a, 0x5b, 0x96, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x1f, 0x8c, 0xc3, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x18, 0x8f, 0xed, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x0e, 0x8a, 0xf1, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x36, 0xc8, 0xe0, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x00, 0x27, 0x5d, 0xff, 0x01, 0x2f, 0x66, 0xff, 0x00, 0x27, 0x5d, 0xff, 0x03, 0x38, 0x70, 0xff, 0x36, 0xc8, 0xe0, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x1f, 0x8c, 0xc3, 0xff, 0x01, 0x2f, 0x66, 0xff, 0x00, 0x27, 0x5d, 0xff, 0x01, 0x2f, 0x66, 0xff, 0x00, 0x27, 0x5d, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x1a, 0x74, 0xaa, 0xff, 0x01, 0x2f, 0x66, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x01, 0x2f, 0x66, 0xff, 0x0a, 0x5b, 0x96, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x36, 0xc8, 0xe0, 0xff, 0x03, 0x41, 0x7c, 0xff, 0x03, 0x38, 0x70, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x03, 0x41, 0x7c, 0xff, 0x01, 0x2f, 0x66, 0xff, 0x2a, 0xa5, 0xca, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x13, 0x6f, 0xc7, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x28, 0xba, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x03, 0x41, 0x7c, 0xff, 0x0a, 0x5b, 0x96, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x0a, 0x5b, 0x96, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x03, 0x41, 0x7c, 0xff, 0x36, 0xc8, 0xe0, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x2a, 0xa5, 0xca, 0xff, 0x03, 0x38, 0x70, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x0a, 0x5b, 0x96, 0xff, 0x03, 0x38, 0x70, 0xff, 0x1a, 0x74, 0xaa, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x13, 0x71, 0xcc, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x0b, 0x6c, 0xca, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x28, 0xba, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x36, 0xc8, 0xe0, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x0a, 0x5b, 0x96, 0xff, 0x03, 0x41, 0x7c, 0xff, 0x36, 0xc8, 0xe0, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x2a, 0xa5, 0xca, 0xff, 0x03, 0x41, 0x7c, 0xff, 0x0a, 0x5b, 0x96, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x03, 0x41, 0x7c, 0xff, 0x0a, 0x5b, 0x96, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x0b, 0x6c, 0xca, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x0a, 0x5b, 0x96, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x36, 0xc8, 0xe0, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x2a, 0xa5, 0xca, 0xff, 0x03, 0x41, 0x7c, 0xff, 0x0a, 0x5b, 0x96, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x1a, 0x74, 0xaa, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x36, 0xc8, 0xe0, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x0a, 0x5b, 0x96, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x03, 0x41, 0x7c, 0xff, 0x1f, 0x8c, 0xc3, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x1e, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x1e, 0x79, 0xce, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x36, 0xc8, 0xe0, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x0a, 0x5b, 0x96, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x36, 0xc8, 0xe0, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x2a, 0xa5, 0xca, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x0a, 0x5b, 0x96, 0xff, 0x0a, 0x5b, 0x96, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x14, 0x70, 0xc5, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x36, 0xc8, 0xe0, 0xff, 0x1a, 0x74, 0xaa, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x1a, 0x74, 0xaa, 0xff, 0x36, 0xc8, 0xe0, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x2a, 0xa5, 0xca, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x1f, 0x8c, 0xc3, 0xff, 0x36, 0xc8, 0xe0, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x14, 0x70, 0xc5, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x14, 0x70, 0xc5, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x13, 0x6f, 0xc7, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x14, 0x70, 0xc5, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x13, 0x6f, 0xc7, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x14, 0x70, 0xc5, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x13, 0x6f, 0xc7, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x14, 0x70, 0xc5, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x13, 0x6f, 0xc7, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x14, 0x70, 0xc5, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x1e, 0x79, 0xce, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x1e, 0x79, 0xce, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x1e, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x07, 0x67, 0xc6, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x0b, 0x6c, 0xca, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0b, 0x6c, 0xca, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x13, 0x6f, 0xc7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x2a, 0xa5, 0xca, 0xff, 0x1f, 0x8c, 0xc3, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x13, 0x71, 0xcc, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x1a, 0x74, 0xaa, 0xff, 0x03, 0x38, 0x70, 0xff, 0x01, 0x2f, 0x66, 0xff, 0x03, 0x41, 0x7c, 0xff, 0x0a, 0x5b, 0x96, 0xff, 0x1f, 0x8c, 0xc3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x07, 0x67, 0xc6, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x36, 0xc8, 0xe0, 0xff, 0x2a, 0xa5, 0xca, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x03, 0x38, 0x70, 0xff, 0x00, 0x27, 0x5d, 0xff, 0x03, 0x41, 0x7c, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x0b, 0x6c, 0xca, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x36, 0xc8, 0xe0, 0xff, 0x1a, 0x74, 0xaa, 0xff, 0x01, 0x2f, 0x66, 0xff, 0x00, 0x27, 0x5d, 0xff, 0x0a, 0x5b, 0x96, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x0b, 0x6c, 0xca, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x14, 0x70, 0xc5, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x01, 0x2f, 0x66, 0xff, 0x03, 0x38, 0x70, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x13, 0x6f, 0xc7, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x07, 0x67, 0xc6, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x1f, 0x8c, 0xc3, 0xff, 0x03, 0x41, 0x7c, 0xff, 0x03, 0x38, 0x70, 0xff, 0x0a, 0x5b, 0x96, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x28, 0xba, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x67, 0xc6, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x13, 0x6f, 0xc7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x1a, 0x74, 0xaa, 0xff, 0x03, 0x38, 0x70, 0xff, 0x03, 0x41, 0x7c, 0xff, 0x1a, 0x74, 0xaa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x13, 0x71, 0xcc, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x07, 0x67, 0xc6, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x1a, 0x74, 0xaa, 0xff, 0x03, 0x41, 0x7c, 0xff, 0x01, 0x2f, 0x66, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x1f, 0x8c, 0xc3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x28, 0xba, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x13, 0x6f, 0xc7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x0a, 0x5b, 0x96, 0xff, 0x00, 0x27, 0x5d, 0xff, 0x00, 0x27, 0x5d, 0xff, 0x1a, 0x74, 0xaa, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x13, 0x71, 0xcc, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x07, 0x67, 0xc6, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x1a, 0x74, 0xaa, 0xff, 0x01, 0x2f, 0x66, 0xff, 0x03, 0x38, 0x70, 0xff, 0x1a, 0x74, 0xaa, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x67, 0xc6, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x14, 0x70, 0xc5, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x2a, 0xa5, 0xca, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x03, 0x38, 0x70, 0xff, 0x03, 0x41, 0x7c, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x13, 0x6f, 0xc7, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x0b, 0x6c, 0xca, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x1f, 0x8c, 0xc3, 0xff, 0x03, 0x38, 0x70, 0xff, 0x00, 0x27, 0x5d, 0xff, 0x03, 0x41, 0x7c, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x0b, 0x6c, 0xca, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x07, 0x67, 0xc6, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x2a, 0xa5, 0xca, 0xff, 0x03, 0x41, 0x7c, 0xff, 0x01, 0x2f, 0x66, 0xff, 0x03, 0x38, 0x70, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x67, 0xc6, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x1e, 0x79, 0xce, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x03, 0x38, 0x70, 0xff, 0x03, 0x41, 0x7c, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x14, 0x70, 0xc5, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x03, 0x41, 0x7c, 0xff, 0x03, 0x38, 0x70, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x1f, 0x8c, 0xc3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x13, 0x6f, 0xc7, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x14, 0x70, 0xc5, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x03, 0x38, 0x70, 0xff, 0x03, 0x38, 0x70, 0xff, 0x0a, 0x5b, 0x96, 0xff, 0x1f, 0x8c, 0xc3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x13, 0x6f, 0xc7, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x14, 0x70, 0xc5, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x1f, 0x8c, 0xc3, 0xff, 0x0a, 0x5b, 0x96, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x1f, 0x8c, 0xc3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x13, 0x6f, 0xc7, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x14, 0x70, 0xc5, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x13, 0x6f, 0xc7, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x1e, 0x79, 0xce, 0xff, 0x07, 0x67, 0xc6, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x07, 0x67, 0xc6, 0xff, 0x1e, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x0b, 0x6c, 0xca, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x0b, 0x6c, 0xca, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x14, 0x70, 0xc5, 0xff, 0x07, 0x67, 0xc6, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x07, 0x67, 0xc6, 0xff, 0x14, 0x70, 0xc5, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x13, 0x6f, 0xc7, 0xff, 0x07, 0x67, 0xc6, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x07, 0x67, 0xc6, 0xff, 0x13, 0x71, 0xcc, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x13, 0x6f, 0xc7, 0xff, 0x07, 0x67, 0xc6, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x07, 0x67, 0xc6, 0xff, 0x13, 0x71, 0xcc, 0xff, 0x1e, 0x79, 0xce, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x14, 0x70, 0xc5, 0xff, 0x0b, 0x6c, 0xca, 0xff, 0x07, 0x67, 0xc6, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x07, 0x67, 0xc6, 0xff, 0x0b, 0x6c, 0xca, 0xff, 0x14, 0x70, 0xc5, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x13, 0x71, 0xcc, 0xff, 0x0b, 0x6c, 0xca, 0xff, 0x07, 0x67, 0xc6, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x07, 0x67, 0xc6, 0xff, 0x0b, 0x6c, 0xca, 0xff, 0x13, 0x71, 0xcc, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x1e, 0x79, 0xce, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x14, 0x70, 0xc5, 0xff, 0x13, 0x6f, 0xc7, 0xff, 0x13, 0x6f, 0xc7, 0xff, 0x13, 0x6f, 0xc7, 0xff, 0x13, 0x6f, 0xc7, 0xff, 0x14, 0x70, 0xc5, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x1e, 0x79, 0xce, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x28, 0x86, 0xc9, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+#endif
+};
+
+const lv_img_dsc_t emoji_F617 = {
+ .header.cf = LV_IMG_CF_TRUE_COLOR,
+ .header.always_zero = 0,
+ .header.reserved = 0,
+ .header.w = 72,
+ .header.h = 72,
+ .data_size = 5184 * LV_COLOR_SIZE / 8,
+ .data = emoji_F617_map,
+};
diff --git a/examples/event/index.rst b/examples/event/index.rst
index 79f9d0f94..a556ac8ce 100644
--- a/examples/event/index.rst
+++ b/examples/event/index.rst
@@ -16,4 +16,4 @@ Event bubbling
.. lv_example:: event/lv_example_event_3
:language: c
-
+
diff --git a/examples/event/lv_example_event_1.py b/examples/event/lv_example_event_1.py
index f8ae9b8f6..93376cf36 100644
--- a/examples/event/lv_example_event_1.py
+++ b/examples/event/lv_example_event_1.py
@@ -9,14 +9,14 @@ def __init__(self):
btn.set_size(100, 50)
btn.center()
btn.add_event_cb(self.event_cb, lv.EVENT.CLICKED, None)
-
+
label = lv.label(btn)
label.set_text("Click me!")
label.center()
def event_cb(self,e):
print("Clicked")
-
+
btn = e.get_target()
label = btn.get_child(0)
label.set_text(str(self.cnt))
diff --git a/examples/event/lv_example_event_2.c b/examples/event/lv_example_event_2.c
index 64b21474e..249914259 100644
--- a/examples/event/lv_example_event_2.c
+++ b/examples/event/lv_example_event_2.c
@@ -7,20 +7,20 @@ static void event_cb(lv_event_t * e)
lv_obj_t * label = lv_event_get_user_data(e);
switch(code) {
- case LV_EVENT_PRESSED:
- lv_label_set_text(label, "The last button event:\nLV_EVENT_PRESSED");
- break;
- case LV_EVENT_CLICKED:
- lv_label_set_text(label, "The last button event:\nLV_EVENT_CLICKED");
- break;
- case LV_EVENT_LONG_PRESSED:
- lv_label_set_text(label, "The last button event:\nLV_EVENT_LONG_PRESSED");
- break;
- case LV_EVENT_LONG_PRESSED_REPEAT:
- lv_label_set_text(label, "The last button event:\nLV_EVENT_LONG_PRESSED_REPEAT");
- break;
- default:
- break;
+ case LV_EVENT_PRESSED:
+ lv_label_set_text(label, "The last button event:\nLV_EVENT_PRESSED");
+ break;
+ case LV_EVENT_CLICKED:
+ lv_label_set_text(label, "The last button event:\nLV_EVENT_CLICKED");
+ break;
+ case LV_EVENT_LONG_PRESSED:
+ lv_label_set_text(label, "The last button event:\nLV_EVENT_LONG_PRESSED");
+ break;
+ case LV_EVENT_LONG_PRESSED_REPEAT:
+ lv_label_set_text(label, "The last button event:\nLV_EVENT_LONG_PRESSED_REPEAT");
+ break;
+ default:
+ break;
}
}
diff --git a/examples/event/lv_example_event_2.py b/examples/event/lv_example_event_2.py
index 2da431c43..313926914 100644
--- a/examples/event/lv_example_event_2.py
+++ b/examples/event/lv_example_event_2.py
@@ -7,7 +7,7 @@ def event_cb(e,label):
elif code == lv.EVENT.LONG_PRESSED:
label.set_text("The last button event:\nLV_EVENT_LONG_PRESSED")
elif code == lv.EVENT.LONG_PRESSED_REPEAT:
- label.set_text("The last button event:\nLV_EVENT_LONG_PRESSED_REPEAT")
+ label.set_text("The last button event:\nLV_EVENT_LONG_PRESSED_REPEAT")
btn = lv.btn(lv.scr_act())
btn.set_size(100, 50)
btn.center()
diff --git a/examples/event/lv_example_event_3.py b/examples/event/lv_example_event_3.py
index 278fc62eb..197b9b2e7 100644
--- a/examples/event/lv_example_event_3.py
+++ b/examples/event/lv_example_event_3.py
@@ -28,5 +28,5 @@ def event_cb(e):
label = lv.label(btn)
label.set_text(str(i))
label.center()
-
+
cont.add_event_cb(event_cb, lv.EVENT.CLICKED, None)
diff --git a/examples/event/lv_example_event_4.c b/examples/event/lv_example_event_4.c
index 8094dedf7..7d459b81d 100644
--- a/examples/event/lv_example_event_4.c
+++ b/examples/event/lv_example_event_4.c
@@ -7,15 +7,16 @@ static lv_obj_t * label = NULL;
static void timer_cb(lv_timer_t * timer)
{
- if (n < 3 || n > 32) {
+ if(n < 3 || n > 32) {
n = 3;
- } else {
+ }
+ else {
static uint32_t old_tick = 0;
uint32_t tick = lv_tick_get();
- if (!old_tick) {
+ if(!old_tick) {
old_tick = tick;
}
- if (tick - old_tick > 3000) {
+ if(tick - old_tick > 3000) {
n++;
lv_label_set_text_fmt(label, "%d sides", n);
old_tick = tick;
@@ -35,10 +36,10 @@ static void event_cb(lv_event_t * e)
lv_point_t points[32];
int i, r = 150;
uint32_t tick = lv_tick_get();
- for (i = 0; i < n; i++) {
+ for(i = 0; i < n; i++) {
int angle = i * 360 / n + ((tick % 36000) / 100);
lv_coord_t x = 150 + (r * lv_trigo_cos(angle) >> LV_TRIGO_SHIFT), y =
- 150 + (r * lv_trigo_sin(angle) >> LV_TRIGO_SHIFT);
+ 150 + (r * lv_trigo_sin(angle) >> LV_TRIGO_SHIFT);
points[i].x = x;
points[i].y = y;
}
diff --git a/examples/get_started/index.rst b/examples/get_started/index.rst
index 15e784266..f1faccbf5 100644
--- a/examples/get_started/index.rst
+++ b/examples/get_started/index.rst
@@ -15,4 +15,4 @@ Create a slider and write its value on a label
.. lv_example:: get_started/lv_example_get_started_3
:language: c
-
+
diff --git a/examples/get_started/lv_example_get_started_3.c b/examples/get_started/lv_example_get_started_3.c
index 09a870ce0..2f6d61674 100644
--- a/examples/get_started/lv_example_get_started_3.c
+++ b/examples/get_started/lv_example_get_started_3.c
@@ -23,7 +23,7 @@ void lv_example_get_started_3(void)
lv_obj_center(slider); /*Align to the center of the parent (screen)*/
lv_obj_add_event_cb(slider, slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL); /*Assign an event function*/
- /*Create a label below the slider*/
+ /*Create a label above the slider*/
label = lv_label_create(lv_scr_act());
lv_label_set_text(label, "0");
lv_obj_align_to(label, slider, LV_ALIGN_OUT_TOP_MID, 0, -15); /*Align top of the slider*/
diff --git a/examples/get_started/lv_example_get_started_3.py b/examples/get_started/lv_example_get_started_3.py
index d0d7cba5b..b41a1c06e 100644
--- a/examples/get_started/lv_example_get_started_3.py
+++ b/examples/get_started/lv_example_get_started_3.py
@@ -7,14 +7,14 @@ def slider_event_cb(evt):
#
# Create a slider and write its value on a label.
#
-
+
# Create a slider in the center of the display
slider = lv.slider(lv.scr_act())
slider.set_width(200) # Set the width
slider.center() # Align to the center of the parent (screen)
slider.add_event_cb(slider_event_cb, lv.EVENT.VALUE_CHANGED, None) # Assign an event function
-# Create a label below the slider
+# Create a label above the slider
label = lv.label(lv.scr_act())
label.set_text("0")
label.align_to(slider, lv.ALIGN.OUT_TOP_MID, 0, -15) # Align below the slider
diff --git a/examples/layouts/flex/index.rst b/examples/layouts/flex/index.rst
index 86661a612..2ff931c02 100644
--- a/examples/layouts/flex/index.rst
+++ b/examples/layouts/flex/index.rst
@@ -9,29 +9,29 @@ Arrange items in rows with wrap and even spacing
.. lv_example:: layouts/flex/lv_example_flex_2
:language: c
-
+
Demonstrate flex grow
"""""""""""""""""""""""
.. lv_example:: layouts/flex/lv_example_flex_3
:language: c
-
+
Demonstrate flex grow.
"""""""""""""""""""""""
.. lv_example:: layouts/flex/lv_example_flex_4
:language: c
-
+
Demonstrate column and row gap style properties
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
.. lv_example:: layouts/flex/lv_example_flex_5
:language: c
-
+
RTL base direction changes order of the items
"""""""""""""""""""""""""""""""""""""""""""""""
.. lv_example:: layouts/flex/lv_example_flex_6
:language: c
-
+
diff --git a/examples/layouts/flex/lv_example_flex_1.c b/examples/layouts/flex/lv_example_flex_1.c
index 691c28116..6363d37e6 100644
--- a/examples/layouts/flex/lv_example_flex_1.c
+++ b/examples/layouts/flex/lv_example_flex_1.c
@@ -24,7 +24,7 @@ void lv_example_flex_1(void)
lv_obj_t * label;
/*Add items to the row*/
- obj= lv_btn_create(cont_row);
+ obj = lv_btn_create(cont_row);
lv_obj_set_size(obj, 100, LV_PCT(100));
label = lv_label_create(obj);
diff --git a/examples/layouts/flex/lv_example_flex_6.py b/examples/layouts/flex/lv_example_flex_6.py
index b29cf7050..1f50433da 100644
--- a/examples/layouts/flex/lv_example_flex_6.py
+++ b/examples/layouts/flex/lv_example_flex_6.py
@@ -12,7 +12,7 @@
for i in range(20):
obj = lv.obj(cont)
obj.set_size(70, lv.SIZE.CONTENT)
-
+
label = lv.label(obj)
label.set_text(str(i))
label.center()
diff --git a/examples/layouts/grid/index.rst b/examples/layouts/grid/index.rst
index e455d2010..fca021890 100644
--- a/examples/layouts/grid/index.rst
+++ b/examples/layouts/grid/index.rst
@@ -9,29 +9,29 @@ Demonstrate cell placement and span
.. lv_example:: layouts/grid/lv_example_grid_2
:language: c
-
+
Demonstrate grid's "free unit"
""""""""""""""""""""""""""""""
.. lv_example:: layouts/grid/lv_example_grid_3
:language: c
-
+
Demonstrate track placement
"""""""""""""""""""""""""""
.. lv_example:: layouts/grid/lv_example_grid_4
:language: c
-
+
Demonstrate column and row gap
""""""""""""""""""""""""""""""
.. lv_example:: layouts/grid/lv_example_grid_5
:language: c
-
+
Demonstrate RTL direction on grid
""""""""""""""""""""""""""""""""""
.. lv_example:: layouts/grid/lv_example_grid_6
:language: c
-
+
diff --git a/examples/layouts/grid/lv_example_grid_1.c b/examples/layouts/grid/lv_example_grid_1.c
index cb161880c..47fbf74a0 100644
--- a/examples/layouts/grid/lv_example_grid_1.c
+++ b/examples/layouts/grid/lv_example_grid_1.c
@@ -29,7 +29,7 @@ void lv_example_grid_1(void)
/*Stretch the cell horizontally and vertically too
*Set span to 1 to make the cell 1 column/row sized*/
lv_obj_set_grid_cell(obj, LV_GRID_ALIGN_STRETCH, col, 1,
- LV_GRID_ALIGN_STRETCH, row, 1);
+ LV_GRID_ALIGN_STRETCH, row, 1);
label = lv_label_create(obj);
lv_label_set_text_fmt(label, "c%d, r%d", col, row);
diff --git a/examples/layouts/grid/lv_example_grid_2.c b/examples/layouts/grid/lv_example_grid_2.c
index 7e13a4007..f992c57a5 100644
--- a/examples/layouts/grid/lv_example_grid_2.c
+++ b/examples/layouts/grid/lv_example_grid_2.c
@@ -23,7 +23,7 @@ void lv_example_grid_2(void)
obj = lv_obj_create(cont);
lv_obj_set_size(obj, LV_SIZE_CONTENT, LV_SIZE_CONTENT);
lv_obj_set_grid_cell(obj, LV_GRID_ALIGN_START, 0, 1,
- LV_GRID_ALIGN_START, 0, 1);
+ LV_GRID_ALIGN_START, 0, 1);
label = lv_label_create(obj);
lv_label_set_text(label, "c0, r0");
@@ -31,7 +31,7 @@ void lv_example_grid_2(void)
obj = lv_obj_create(cont);
lv_obj_set_size(obj, LV_SIZE_CONTENT, LV_SIZE_CONTENT);
lv_obj_set_grid_cell(obj, LV_GRID_ALIGN_START, 1, 1,
- LV_GRID_ALIGN_CENTER, 0, 1);
+ LV_GRID_ALIGN_CENTER, 0, 1);
label = lv_label_create(obj);
lv_label_set_text(label, "c1, r0");
@@ -39,7 +39,7 @@ void lv_example_grid_2(void)
obj = lv_obj_create(cont);
lv_obj_set_size(obj, LV_SIZE_CONTENT, LV_SIZE_CONTENT);
lv_obj_set_grid_cell(obj, LV_GRID_ALIGN_START, 2, 1,
- LV_GRID_ALIGN_END, 0, 1);
+ LV_GRID_ALIGN_END, 0, 1);
label = lv_label_create(obj);
lv_label_set_text(label, "c2, r0");
@@ -47,7 +47,7 @@ void lv_example_grid_2(void)
obj = lv_obj_create(cont);
lv_obj_set_size(obj, LV_SIZE_CONTENT, LV_SIZE_CONTENT);
lv_obj_set_grid_cell(obj, LV_GRID_ALIGN_STRETCH, 1, 2,
- LV_GRID_ALIGN_STRETCH, 1, 1);
+ LV_GRID_ALIGN_STRETCH, 1, 1);
label = lv_label_create(obj);
lv_label_set_text(label, "c1-2, r1");
@@ -55,7 +55,7 @@ void lv_example_grid_2(void)
obj = lv_obj_create(cont);
lv_obj_set_size(obj, LV_SIZE_CONTENT, LV_SIZE_CONTENT);
lv_obj_set_grid_cell(obj, LV_GRID_ALIGN_STRETCH, 0, 1,
- LV_GRID_ALIGN_STRETCH, 1, 2);
+ LV_GRID_ALIGN_STRETCH, 1, 2);
label = lv_label_create(obj);
lv_label_set_text(label, "c0\nr1-2");
}
diff --git a/examples/layouts/grid/lv_example_grid_3.c b/examples/layouts/grid/lv_example_grid_3.c
index 4b77886aa..17e4dd907 100644
--- a/examples/layouts/grid/lv_example_grid_3.c
+++ b/examples/layouts/grid/lv_example_grid_3.c
@@ -33,7 +33,7 @@ void lv_example_grid_3(void)
/*Stretch the cell horizontally and vertically too
*Set span to 1 to make the cell 1 column/row sized*/
lv_obj_set_grid_cell(obj, LV_GRID_ALIGN_STRETCH, col, 1,
- LV_GRID_ALIGN_STRETCH, row, 1);
+ LV_GRID_ALIGN_STRETCH, row, 1);
label = lv_label_create(obj);
lv_label_set_text_fmt(label, "%d,%d", col, row);
diff --git a/examples/layouts/grid/lv_example_grid_4.c b/examples/layouts/grid/lv_example_grid_4.c
index 2349c41f8..514147791 100644
--- a/examples/layouts/grid/lv_example_grid_4.c
+++ b/examples/layouts/grid/lv_example_grid_4.c
@@ -30,7 +30,7 @@ void lv_example_grid_4(void)
/*Stretch the cell horizontally and vertically too
*Set span to 1 to make the cell 1 column/row sized*/
lv_obj_set_grid_cell(obj, LV_GRID_ALIGN_STRETCH, col, 1,
- LV_GRID_ALIGN_STRETCH, row, 1);
+ LV_GRID_ALIGN_STRETCH, row, 1);
label = lv_label_create(obj);
lv_label_set_text_fmt(label, "%d,%d", col, row);
diff --git a/examples/layouts/grid/lv_example_grid_5.c b/examples/layouts/grid/lv_example_grid_5.c
index 1719ee1bb..af96ff825 100644
--- a/examples/layouts/grid/lv_example_grid_5.c
+++ b/examples/layouts/grid/lv_example_grid_5.c
@@ -36,7 +36,7 @@ void lv_example_grid_5(void)
obj = lv_obj_create(cont);
lv_obj_set_grid_cell(obj, LV_GRID_ALIGN_STRETCH, col, 1,
- LV_GRID_ALIGN_STRETCH, row, 1);
+ LV_GRID_ALIGN_STRETCH, row, 1);
label = lv_label_create(obj);
lv_label_set_text_fmt(label, "%d,%d", col, row);
lv_obj_center(label);
diff --git a/examples/layouts/grid/lv_example_grid_6.c b/examples/layouts/grid/lv_example_grid_6.c
index c9fc34d6a..1c06c980e 100644
--- a/examples/layouts/grid/lv_example_grid_6.c
+++ b/examples/layouts/grid/lv_example_grid_6.c
@@ -28,7 +28,7 @@ void lv_example_grid_6(void)
/*Stretch the cell horizontally and vertically too
*Set span to 1 to make the cell 1 column/row sized*/
lv_obj_set_grid_cell(obj, LV_GRID_ALIGN_STRETCH, col, 1,
- LV_GRID_ALIGN_STRETCH, row, 1);
+ LV_GRID_ALIGN_STRETCH, row, 1);
label = lv_label_create(obj);
lv_label_set_text_fmt(label, "%d,%d", col, row);
diff --git a/examples/layouts/grid/lv_example_grid_6.py b/examples/layouts/grid/lv_example_grid_6.py
index 1730cde98..436c6e4c7 100644
--- a/examples/layouts/grid/lv_example_grid_6.py
+++ b/examples/layouts/grid/lv_example_grid_6.py
@@ -20,7 +20,7 @@
# Set span to 1 to make the cell 1 column/row sized
obj.set_grid_cell(lv.GRID_ALIGN.STRETCH, col, 1,
lv.GRID_ALIGN.STRETCH, row, 1)
-
+
label = lv.label(obj)
label.set_text("{:d},{:d}".format(col, row))
label.center()
diff --git a/examples/libs/gif/img_bulb_gif.c b/examples/libs/gif/img_bulb_gif.c
index df3ffb07a..ec21413c0 100644
--- a/examples/libs/gif/img_bulb_gif.c
+++ b/examples/libs/gif/img_bulb_gif.c
@@ -2,1127 +2,1127 @@
#ifndef LV_ATTRIBUTE_MEM_ALIGN
-#define LV_ATTRIBUTE_MEM_ALIGN
+ #define LV_ATTRIBUTE_MEM_ALIGN
#endif
#ifndef LV_ATTRIBUTE_IMG_BULB_GIF
-#define LV_ATTRIBUTE_IMG_BULB_GIF
+ #define LV_ATTRIBUTE_IMG_BULB_GIF
#endif
static const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BULB_GIF uint8_t img_blub_gif_map[] = {
- 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x3c, 0x00, 0x50, 0x00, 0xf7, 0x00, 0x00, 0xfa, 0xfb, 0xfb,
- 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xd9, 0xec, 0xfe, 0x1e, 0x93, 0xfe, 0x23, 0x95, 0xfd, 0x5f,
- 0xb2, 0xff, 0x52, 0xac, 0xfe, 0xb1, 0xd8, 0xff, 0xce, 0xe7, 0xff, 0xa3, 0xd2, 0xff, 0x80, 0xc0,
- 0xfe, 0xe2, 0xf1, 0xfe, 0xca, 0xe5, 0xff, 0xf4, 0xf7, 0xf9, 0x8b, 0xc4, 0xff, 0x7e, 0xbe, 0xff,
- 0xe0, 0xee, 0xff, 0xc6, 0xe4, 0xff, 0xbc, 0xde, 0xff, 0xec, 0xf5, 0xff, 0x1d, 0x92, 0xfd, 0x3f,
- 0x9f, 0xfe, 0x71, 0xbb, 0xff, 0x9f, 0xcf, 0xfe, 0xf2, 0xf9, 0xff, 0x31, 0x9c, 0xfe, 0x98, 0xcb,
- 0xff, 0x49, 0xa8, 0xfe, 0xbe, 0xe0, 0xff, 0x6d, 0xb3, 0xfe, 0x4c, 0xa9, 0xfe, 0xc4, 0xe2, 0xff,
- 0x4a, 0xa8, 0xfe, 0x45, 0xa3, 0xfa, 0xd2, 0xe7, 0xfc, 0xbd, 0xde, 0xff, 0xf9, 0xf9, 0xf9, 0xf7,
- 0xf8, 0xf8, 0xe2, 0xe2, 0xe2, 0xdd, 0xde, 0xdd, 0xe5, 0xea, 0xef, 0xff, 0xb7, 0x50, 0xff, 0xba,
- 0x56, 0xfd, 0xb7, 0x51, 0xff, 0xb7, 0x4f, 0xff, 0xb8, 0x50, 0xc5, 0xc4, 0xc1, 0xfa, 0xb7, 0x55,
- 0xee, 0xb3, 0x5b, 0xf7, 0xb5, 0x57, 0xf1, 0xb5, 0x5e, 0xf5, 0xb6, 0x5b, 0xfd, 0xb7, 0x54, 0xcd,
- 0xcd, 0xcc, 0xe5, 0xe8, 0xea, 0xcf, 0xb2, 0x85, 0xf5, 0xb8, 0x5f, 0xee, 0xef, 0xf0, 0xc0, 0xbf,
- 0xbe, 0xe4, 0xb1, 0x66, 0xff, 0xb7, 0x51, 0xda, 0xda, 0xda, 0xec, 0xed, 0xee, 0xdf, 0xdf, 0xdf,
- 0xd1, 0xd2, 0xd1, 0xe4, 0xe5, 0xe5, 0xff, 0xe5, 0xbf, 0xff, 0xc5, 0x73, 0xff, 0xeb, 0xce, 0xf0,
- 0xf3, 0xf5, 0xc8, 0xc8, 0xc8, 0xed, 0xb4, 0x61, 0xd8, 0xd8, 0xd7, 0xff, 0xdb, 0xa7, 0xff, 0xe1,
- 0xb7, 0xff, 0xc1, 0x68, 0xfc, 0xf7, 0xee, 0xff, 0xc9, 0x7c, 0xff, 0xd2, 0x92, 0xfa, 0xba, 0x5e,
- 0xff, 0xcc, 0x84, 0xff, 0xe8, 0xc6, 0xff, 0xfb, 0xf6, 0xff, 0xf5, 0xe8, 0xff, 0xf9, 0xf1, 0xff,
- 0xed, 0xd5, 0xc9, 0xba, 0xa0, 0xf1, 0xf1, 0xf1, 0xf6, 0xf6, 0xf6, 0xeb, 0xb7, 0x6a, 0xe3, 0xb5,
- 0x6f, 0xff, 0xbd, 0x5f, 0xa9, 0xa9, 0xa9, 0xd6, 0xd6, 0xd6, 0xb2, 0xb2, 0xb2, 0xb9, 0xb9, 0xb9,
- 0x97, 0x98, 0x96, 0x9e, 0x9e, 0x9e, 0xa5, 0xa5, 0xa5, 0x45, 0x45, 0x45, 0x46, 0x46, 0x46, 0x47,
- 0x47, 0x47, 0x4a, 0x4a, 0x4a, 0x4d, 0x4d, 0x4d, 0x50, 0x50, 0x50, 0x53, 0x53, 0x53, 0x58, 0x58,
- 0x58, 0x5a, 0x5a, 0x5a, 0x5d, 0x5d, 0x5d, 0x5f, 0x5f, 0x5f, 0x63, 0x63, 0x63, 0x66, 0x66, 0x66,
- 0x6a, 0x6a, 0x6a, 0x6d, 0x6d, 0x6d, 0x70, 0x70, 0x70, 0x75, 0x75, 0x75, 0x79, 0x79, 0x79, 0x7c,
- 0x7c, 0x7c, 0x80, 0x80, 0x80, 0x84, 0x84, 0x84, 0x88, 0x88, 0x88, 0x8b, 0x8b, 0x8b, 0x8f, 0x8f,
- 0x8f, 0xd5, 0xd5, 0xd5, 0xe7, 0xe7, 0xe7, 0xea, 0xea, 0xea, 0xf4, 0xf4, 0xf4, 0xf2, 0xf4, 0xf5,
- 0xff, 0xd6, 0x9b, 0xff, 0xde, 0xaf, 0xff, 0xfe, 0xfc, 0xff, 0xf1, 0xde, 0xff, 0xd6, 0x9c, 0xff,
- 0xcf, 0x8b, 0xfa, 0xd6, 0xa1, 0xf7, 0xc4, 0x7b, 0xf8, 0xbd, 0x67, 0xeb, 0xb5, 0x65, 0xf9, 0xf9,
- 0xf8, 0xf1, 0xdb, 0xbb, 0xdb, 0xd7, 0xce, 0xe3, 0xdb, 0xcc, 0xda, 0xd2, 0xc3, 0xe3, 0xd6, 0xc0,
- 0xae, 0xae, 0xae, 0xe4, 0xcb, 0xa6, 0xe5, 0xe2, 0xdc, 0xd0, 0xb8, 0x90, 0x56, 0x56, 0x56, 0xcd,
- 0xcb, 0xc6, 0xcf, 0xc4, 0xaf, 0xcf, 0xc9, 0xbc, 0xd0, 0xbe, 0xa0, 0xd8, 0xbb, 0x8e, 0xd8, 0xbf,
- 0x98, 0xd8, 0xc5, 0xa5, 0xd8, 0xd4, 0xcb, 0xda, 0xb7, 0x82, 0xdb, 0xca, 0xaf, 0xdb, 0xcd, 0xb6,
- 0xdd, 0xbe, 0x8e, 0xdd, 0xc3, 0x9b, 0xdd, 0xdb, 0xd5, 0xde, 0xc8, 0xa5, 0xe0, 0xbb, 0x82, 0xe2,
- 0xb8, 0x79, 0xe4, 0xc2, 0x8e, 0xe4, 0xc6, 0x99, 0xe4, 0xd1, 0xb3, 0xe5, 0xbe, 0x84, 0xe5, 0xdf,
- 0xd4, 0xe9, 0xdb, 0xc5, 0xe9, 0xde, 0xce, 0xea, 0xbe, 0x7b, 0xea, 0xc1, 0x85, 0xea, 0xd3, 0xb0,
- 0xea, 0xd8, 0xbc, 0xeb, 0xba, 0x71, 0xeb, 0xc5, 0x8e, 0xeb, 0xcb, 0x9a, 0xeb, 0xe4, 0xd9, 0xec,
- 0xd0, 0xa5, 0xec, 0xe9, 0xe3, 0xed, 0xec, 0xea, 0xef, 0xe7, 0xd9, 0xf0, 0xbc, 0x71, 0xf0, 0xc0,
- 0x7a, 0xf1, 0xb9, 0x68, 0xf3, 0xf0, 0xea, 0xf4, 0xc7, 0x86, 0xf4, 0xcb, 0x8e, 0xf7, 0xc0, 0x71,
- 0xf9, 0xf7, 0xf4, 0xfd, 0xf5, 0xeb, 0xf5, 0xd0, 0x99, 0xda, 0xcf, 0xbd, 0xdc, 0xb1, 0x6f, 0xf2,
- 0xd7, 0xb0, 0xed, 0xdf, 0xca, 0xc8, 0xb3, 0x8f, 0xd9, 0xb3, 0x78, 0xd2, 0xb0, 0x7c, 0xf3, 0xed,
- 0xe4, 0xf4, 0xf3, 0xf1, 0xf5, 0xea, 0xd8, 0xf5, 0xe3, 0xc9, 0xc1, 0xb7, 0xa3, 0xc5, 0xbe, 0xaf,
- 0xd7, 0xac, 0x6b, 0xc1, 0xb2, 0x95, 0xd2, 0xd6, 0xd6, 0xcf, 0xa9, 0x70, 0xbc, 0xb9, 0xb1, 0xc7,
- 0xa8, 0x76, 0x41, 0x84, 0xd5, 0xb0, 0xa2, 0x86, 0x39, 0x81, 0xd9, 0x78, 0x92, 0xad, 0x88, 0xa0,
- 0xb5, 0xb9, 0xcf, 0xe9, 0xbf, 0xa5, 0x7b, 0x40, 0x83, 0xd4, 0x80, 0x95, 0xa8, 0x80, 0x96, 0xa9,
- 0x49, 0x86, 0xcf, 0x87, 0x96, 0xa2, 0x48, 0x85, 0xcd, 0x60, 0x8c, 0xbe, 0x2e, 0x7e, 0xdf, 0x18,
- 0x78, 0xee, 0x9e, 0xbd, 0xe1, 0x06, 0x74, 0xfc, 0x00, 0x72, 0xff, 0x01, 0x73, 0xff, 0x47, 0xa1,
- 0xfe, 0x0e, 0x76, 0xf7, 0x16, 0x7d, 0xfc, 0x32, 0x8d, 0xfe, 0x61, 0xa7, 0xfe, 0x24, 0x85, 0xfc,
- 0x55, 0xa1, 0xff, 0x54, 0xa1, 0xff, 0x1e, 0x88, 0xfa, 0x20, 0x7b, 0xea, 0x9e, 0x9c, 0x93, 0x61,
- 0x9c, 0xdc, 0x6f, 0x90, 0xb3, 0x84, 0xaf, 0xe1, 0x54, 0x89, 0xc6, 0x24, 0x7c, 0xe7, 0xa7, 0x9f,
- 0x8c, 0x68, 0x8e, 0xb7, 0x8f, 0x98, 0x9d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xff, 0x0b,
- 0x4e, 0x45, 0x54, 0x53, 0x43, 0x41, 0x50, 0x45, 0x32, 0x2e, 0x30, 0x03, 0x01, 0x00, 0x00, 0x00,
- 0x21, 0xf9, 0x04, 0x05, 0x25, 0x00, 0x04, 0x00, 0x21, 0xfe, 0x23, 0x52, 0x65, 0x73, 0x69, 0x7a,
- 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x65, 0x7a,
- 0x67, 0x69, 0x66, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x00, 0x2c,
- 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x50, 0x00, 0x00, 0x08, 0xff, 0x00, 0x03, 0x08, 0x1c, 0x48,
- 0xb0, 0xa0, 0xc1, 0x83, 0x08, 0x13, 0x2a, 0x5c, 0xc8, 0xb0, 0xa1, 0xc3, 0x87, 0x10, 0x23, 0x4a,
- 0x9c, 0x48, 0xb1, 0xa2, 0xc5, 0x8b, 0x18, 0x33, 0x6a, 0xdc, 0xc8, 0xb1, 0xa3, 0xc7, 0x8f, 0x20,
- 0x43, 0x8a, 0x1c, 0x49, 0xb2, 0xa4, 0xc9, 0x93, 0x28, 0x53, 0xaa, 0x5c, 0xc9, 0xb2, 0xa5, 0xcb,
- 0x97, 0x30, 0x63, 0xca, 0x9c, 0x49, 0xb3, 0xa6, 0xcd, 0x9b, 0x38, 0x63, 0x52, 0x50, 0xf0, 0xae,
- 0x5d, 0x3a, 0x75, 0xf1, 0x36, 0x44, 0x88, 0x99, 0xe1, 0x81, 0xba, 0x74, 0x48, 0x93, 0x22, 0x7d,
- 0xc7, 0xc0, 0x65, 0x04, 0x77, 0x48, 0xdd, 0x61, 0x18, 0x81, 0x41, 0x69, 0xba, 0x76, 0x0d, 0x58,
- 0x46, 0x80, 0xf7, 0x13, 0x41, 0x86, 0x06, 0x0f, 0xe2, 0x59, 0xfd, 0x99, 0x35, 0x65, 0x06, 0xa8,
- 0xed, 0x06, 0x8c, 0x80, 0x3a, 0x36, 0x69, 0xbb, 0xa6, 0x28, 0x37, 0x20, 0x8d, 0x47, 0xe2, 0x68,
- 0x5b, 0xa5, 0x1e, 0x50, 0x52, 0x38, 0xea, 0xce, 0xee, 0x5d, 0xab, 0x43, 0x4d, 0x22, 0x40, 0x1a,
- 0xc1, 0xc3, 0xdf, 0xb1, 0x18, 0x4e, 0x1a, 0x4e, 0x17, 0xcf, 0xef, 0xe1, 0xa5, 0x27, 0xd9, 0x3e,
- 0x1e, 0x0b, 0xef, 0xa4, 0xcf, 0xc9, 0x63, 0xd5, 0x45, 0xc6, 0x4c, 0x59, 0x31, 0x67, 0xab, 0xef,
- 0x4e, 0x0e, 0xfe, 0x9c, 0x54, 0xc1, 0xc9, 0xbd, 0xa4, 0x7f, 0xc2, 0x35, 0xf9, 0x20, 0x35, 0x04,
- 0xb3, 0x92, 0x27, 0xc3, 0xa3, 0xa0, 0x32, 0xc2, 0xe5, 0xc7, 0xea, 0x06, 0xb0, 0x1c, 0xe1, 0xb8,
- 0xad, 0xba, 0xb2, 0x2c, 0xe5, 0x1e, 0xde, 0xf0, 0x32, 0x03, 0xd7, 0xbb, 0xed, 0x32, 0xc0, 0x14,
- 0xde, 0xf6, 0x41, 0xcc, 0x11, 0x7f, 0x47, 0x10, 0xed, 0x8d, 0x54, 0x9d, 0xf2, 0x98, 0x08, 0x7a,
- 0xab, 0x43, 0x40, 0x93, 0xc2, 0x88, 0xef, 0xdf, 0x57, 0xe7, 0x9c, 0xa4, 0xf9, 0xe7, 0x8b, 0xf9,
- 0xf3, 0xe6, 0xb3, 0xc8, 0xec, 0xc3, 0xa6, 0xbd, 0xfb, 0xf6, 0x7d, 0x64, 0x9a, 0x78, 0xff, 0x1e,
- 0xcb, 0xcc, 0x3d, 0xf4, 0xd9, 0xe4, 0xa1, 0x29, 0x44, 0x4d, 0x99, 0xff, 0x65, 0xa4, 0x01, 0x44,
- 0x4d, 0x7d, 0xec, 0x71, 0x86, 0x19, 0x7a, 0x9c, 0x80, 0x13, 0x00, 0x00, 0x8c, 0xe7, 0xe0, 0x83,
- 0x30, 0x99, 0xf0, 0x07, 0x16, 0x3a, 0xfc, 0x80, 0x8b, 0x1f, 0x7e, 0xf4, 0xa1, 0xe1, 0x86, 0x1c,
- 0xf6, 0x81, 0xa1, 0x1f, 0xb8, 0xfc, 0xa0, 0x03, 0x16, 0x7f, 0x98, 0xf0, 0xd1, 0x0f, 0x7d, 0x08,
- 0x71, 0x02, 0x10, 0x28, 0xf8, 0xe0, 0x43, 0x12, 0x49, 0x78, 0xc1, 0xc7, 0x8c, 0x34, 0xce, 0xe8,
- 0x05, 0x8c, 0x2e, 0xa2, 0x00, 0xc4, 0x09, 0x42, 0xf4, 0xf1, 0x03, 0x84, 0x40, 0x06, 0x29, 0xe4,
- 0x90, 0x44, 0x16, 0x69, 0xe4, 0x91, 0x48, 0x56, 0x74, 0x5d, 0x00, 0x4b, 0xce, 0x94, 0x01, 0x03,
- 0x14, 0x30, 0x00, 0x00, 0x94, 0x51, 0x52, 0x40, 0x1b, 0x4c, 0x03, 0x50, 0x99, 0xc1, 0x00, 0x19,
- 0x58, 0x49, 0x41, 0x93, 0x2d, 0x05, 0x04, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x06, 0x00, 0x00, 0x00,
- 0x2c, 0x19, 0x00, 0x33, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x08, 0x0c, 0x00, 0xb9, 0xd9, 0x43,
- 0x07, 0x00, 0x80, 0xb0, 0x5b, 0x00, 0x02, 0x02, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00, 0x00,
- 0x00, 0x2c, 0x19, 0x00, 0x32, 0x00, 0x07, 0x00, 0x03, 0x00, 0x00, 0x08, 0x16, 0x00, 0xe9, 0xa9,
- 0x03, 0x40, 0x90, 0xa0, 0xb3, 0x19, 0x57, 0xf0, 0xb1, 0x2b, 0x08, 0xc0, 0x8a, 0x95, 0x66, 0x29,
- 0x00, 0x04, 0x04, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x02, 0x00, 0x2c, 0x18, 0x00, 0x32,
- 0x00, 0x09, 0x00, 0x03, 0x00, 0x00, 0x08, 0x19, 0x00, 0x4b, 0x94, 0xba, 0xb2, 0xcd, 0x9c, 0x80,
- 0x83, 0x08, 0x55, 0xb4, 0xe8, 0x61, 0xea, 0x8b, 0x3d, 0x74, 0x08, 0x0f, 0x5a, 0x99, 0x28, 0x2c,
- 0x20, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x00, 0x00, 0x2c, 0x18, 0x00, 0x31, 0x00, 0x0a,
- 0x00, 0x04, 0x00, 0x00, 0x08, 0x20, 0x00, 0x53, 0x6c, 0xb3, 0x47, 0x4f, 0x1d, 0x80, 0x83, 0x07,
- 0x17, 0xd5, 0x68, 0xd1, 0x42, 0xcb, 0x33, 0x7b, 0xec, 0x10, 0x22, 0x64, 0xd8, 0x42, 0x86, 0x26,
- 0x6e, 0x12, 0x33, 0x02, 0x08, 0x08, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x07, 0x00, 0x00, 0x00, 0x2c,
- 0x18, 0x00, 0x30, 0x00, 0x0a, 0x00, 0x04, 0x00, 0x00, 0x08, 0x20, 0x00, 0x01, 0xa0, 0x53, 0x07,
- 0xa0, 0xa0, 0x41, 0x00, 0xcb, 0x64, 0xc8, 0xd0, 0x42, 0x69, 0x9b, 0xb9, 0x83, 0x06, 0x5b, 0x48,
- 0x34, 0xf5, 0xc5, 0x1e, 0xc4, 0x82, 0x2d, 0x54, 0x30, 0x0a, 0x08, 0x00, 0x21, 0xf9, 0x04, 0x05,
- 0x03, 0x00, 0x00, 0x00, 0x2c, 0x18, 0x00, 0x30, 0x00, 0x0b, 0x00, 0x03, 0x00, 0x00, 0x08, 0x1d,
- 0x00, 0xb9, 0x7d, 0x19, 0x18, 0xc9, 0x1e, 0x3a, 0x00, 0x08, 0x01, 0x10, 0x6a, 0xc1, 0x90, 0xa1,
- 0x0c, 0x4a, 0xdb, 0xcc, 0x25, 0x9c, 0x08, 0x80, 0x61, 0x8d, 0x60, 0x01, 0x01, 0x00, 0x21, 0xf9,
- 0x04, 0x05, 0x04, 0x00, 0x00, 0x00, 0x2c, 0x18, 0x00, 0x2f, 0x00, 0x0b, 0x00, 0x04, 0x00, 0x00,
- 0x08, 0x22, 0x00, 0x01, 0xb0, 0xd3, 0x67, 0xcf, 0x1e, 0x3b, 0x00, 0x08, 0x11, 0xc6, 0xaa, 0xd1,
- 0xa2, 0x21, 0x0b, 0x2d, 0x5f, 0xec, 0xa1, 0x4b, 0x48, 0xb1, 0x61, 0x0b, 0x1a, 0xb7, 0x28, 0x6a,
- 0xec, 0x01, 0x20, 0x20, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x00, 0x00, 0x2c, 0x18, 0x00,
- 0x2f, 0x00, 0x0b, 0x00, 0x03, 0x00, 0x00, 0x08, 0x1f, 0x00, 0xed, 0x7d, 0xd1, 0xa4, 0x45, 0x91,
- 0x16, 0x4a, 0x91, 0xec, 0xa9, 0x03, 0x60, 0xac, 0x05, 0x80, 0x87, 0x2d, 0x22, 0xb6, 0x40, 0x12,
- 0xe4, 0xa1, 0xc5, 0x8b, 0x2d, 0x9a, 0x05, 0x04, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x07, 0x00, 0x00,
- 0x00, 0x2c, 0x17, 0x00, 0x2e, 0x00, 0x0d, 0x00, 0x03, 0x00, 0x00, 0x08, 0x20, 0x00, 0x01, 0x00,
- 0x40, 0x67, 0x2f, 0xd2, 0x97, 0x83, 0xdb, 0xe8, 0xa9, 0x13, 0x08, 0xe0, 0x8a, 0x8c, 0x16, 0x10,
- 0x23, 0xb6, 0xd8, 0xf2, 0x85, 0xa1, 0x45, 0x8b, 0x2d, 0x0e, 0x01, 0x08, 0x08, 0x00, 0x21, 0xf9,
- 0x04, 0x05, 0x03, 0x00, 0x00, 0x00, 0x2c, 0x17, 0x00, 0x2d, 0x00, 0x0d, 0x00, 0x03, 0x00, 0x00,
- 0x08, 0x23, 0x00, 0x01, 0x08, 0x04, 0xc0, 0xce, 0x9e, 0x41, 0x7b, 0xec, 0x06, 0x02, 0xa0, 0x17,
- 0xc9, 0x13, 0x8c, 0x16, 0x10, 0x5b, 0xb0, 0x30, 0xf5, 0x85, 0xdb, 0x22, 0x28, 0x2d, 0x14, 0x0e,
- 0x6c, 0xc1, 0x25, 0x58, 0x40, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x00, 0x00, 0x2c, 0x17,
- 0x00, 0x2c, 0x00, 0x0d, 0x00, 0x04, 0x00, 0x00, 0x08, 0x27, 0x00, 0x01, 0x08, 0x1c, 0xa8, 0x8e,
- 0x1d, 0xbb, 0x81, 0x03, 0xd1, 0xd9, 0xfb, 0x62, 0x0a, 0x46, 0x8b, 0x16, 0x32, 0x3c, 0x7d, 0xb1,
- 0xc7, 0xed, 0x4a, 0x8e, 0x87, 0x08, 0x1f, 0xb6, 0x30, 0x06, 0x80, 0x0b, 0xc2, 0x8f, 0x02, 0x03,
- 0x02, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00, 0x00, 0x00, 0x2c, 0x17, 0x00, 0x2c, 0x00, 0x0e,
- 0x00, 0x03, 0x00, 0x00, 0x08, 0x24, 0x00, 0x01, 0x08, 0x04, 0xc0, 0x0e, 0xdf, 0x33, 0x4f, 0xa6,
- 0x4c, 0x51, 0xfa, 0x62, 0xaf, 0x1d, 0x3a, 0x7b, 0x91, 0x3c, 0xd5, 0x68, 0xd1, 0x42, 0x20, 0xc5,
- 0x16, 0x2a, 0x9a, 0x19, 0xa3, 0x38, 0xb0, 0x63, 0xc7, 0x80, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x06,
- 0x00, 0x00, 0x00, 0x2c, 0x16, 0x00, 0x2b, 0x00, 0x10, 0x00, 0x04, 0x00, 0x00, 0x08, 0x2b, 0x00,
- 0x01, 0x08, 0x1c, 0xa8, 0x4e, 0xdf, 0xb6, 0x2f, 0xcf, 0xbe, 0x44, 0xb2, 0x87, 0x6e, 0x20, 0x00,
- 0x76, 0xf6, 0x9e, 0x69, 0x69, 0x41, 0xb1, 0x62, 0x8b, 0x1c, 0x29, 0x52, 0x5c, 0x31, 0x05, 0x83,
- 0xa2, 0xc3, 0x8f, 0x02, 0x05, 0x81, 0x1c, 0x09, 0x20, 0x20, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04,
- 0x00, 0x00, 0x00, 0x2c, 0x15, 0x00, 0x2a, 0x00, 0x12, 0x00, 0x04, 0x00, 0x00, 0x08, 0x31, 0x00,
- 0x01, 0x08, 0x1c, 0x38, 0x90, 0x9d, 0xbd, 0x6d, 0xdb, 0xf0, 0xd9, 0x43, 0x47, 0x70, 0xa0, 0x3a,
- 0x7a, 0x91, 0x3c, 0xc1, 0x68, 0x41, 0x91, 0xa2, 0x8c, 0x4c, 0x02, 0xbf, 0x44, 0x8a, 0xf4, 0x4c,
- 0x8b, 0x8a, 0x16, 0x0d, 0x05, 0xae, 0x20, 0x24, 0xb0, 0x59, 0x0f, 0x8a, 0x21, 0x53, 0x06, 0x04,
- 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x01, 0x00, 0x2c, 0x14, 0x00, 0x29, 0x00, 0x13, 0x00,
- 0x04, 0x00, 0x00, 0x08, 0x32, 0x00, 0x03, 0x08, 0x1c, 0x48, 0x30, 0x80, 0x3a, 0x76, 0xf6, 0xec,
- 0xe9, 0x43, 0x57, 0xb0, 0x20, 0xc2, 0x67, 0x5a, 0x54, 0xb4, 0x98, 0x08, 0xc3, 0xd3, 0x11, 0x07,
- 0x60, 0xb6, 0x25, 0xb4, 0x17, 0x89, 0x92, 0x8c, 0x89, 0x05, 0x5b, 0x70, 0x69, 0x12, 0x80, 0xd0,
- 0x8a, 0x89, 0x28, 0x1b, 0x16, 0x0c, 0x08, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x00, 0x00,
- 0x2c, 0x14, 0x00, 0x28, 0x00, 0x14, 0x00, 0x04, 0x00, 0x00, 0x08, 0x35, 0x00, 0x01, 0x08, 0x1c,
- 0x48, 0x90, 0x20, 0x3b, 0x76, 0xea, 0x06, 0xa2, 0x2b, 0x38, 0x50, 0x9d, 0xbe, 0x2f, 0x9e, 0x68,
- 0xa8, 0x50, 0x01, 0xc3, 0xd4, 0x17, 0x0a, 0xc6, 0xae, 0x6c, 0xb3, 0x77, 0x50, 0x1f, 0xbe, 0x67,
- 0x5a, 0x5a, 0x88, 0x1c, 0x28, 0xf2, 0x10, 0x80, 0x60, 0x4c, 0x44, 0xaa, 0x1c, 0xc9, 0x90, 0x60,
- 0x40, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x07, 0x00, 0x00, 0x00, 0x2c, 0x13, 0x00, 0x28, 0x00, 0x15,
- 0x00, 0x03, 0x00, 0x00, 0x08, 0x34, 0x00, 0xb9, 0xb1, 0x03, 0x40, 0xb0, 0xa0, 0x41, 0x76, 0xdb,
- 0x9e, 0x99, 0x52, 0xa4, 0xc5, 0xd3, 0x33, 0x6e, 0x4d, 0x60, 0x68, 0x8a, 0xa4, 0x0f, 0x1d, 0x00,
- 0x75, 0xec, 0xec, 0x45, 0xf2, 0x54, 0xa3, 0x85, 0xc7, 0x8f, 0x3d, 0x84, 0x01, 0x38, 0xf4, 0xb1,
- 0x06, 0x0d, 0x1a, 0x2c, 0x3c, 0x1a, 0x5c, 0x09, 0x20, 0x20, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03,
- 0x00, 0x01, 0x00, 0x2c, 0x13, 0x00, 0x27, 0x00, 0x15, 0x00, 0x04, 0x00, 0x00, 0x08, 0x38, 0x00,
- 0xcf, 0x99, 0x0b, 0x40, 0xb0, 0xa0, 0xc1, 0x00, 0xe8, 0xec, 0x7d, 0xb9, 0xa2, 0x89, 0xd2, 0xb3,
- 0x73, 0x43, 0x54, 0x98, 0xfa, 0x62, 0x0f, 0x9d, 0x41, 0x73, 0xf8, 0x28, 0xd1, 0x68, 0xc1, 0xb1,
- 0xe3, 0x92, 0x00, 0x3d, 0x3a, 0xc2, 0x30, 0xe5, 0xc9, 0x14, 0x2f, 0x15, 0x1c, 0x0f, 0xaa, 0x24,
- 0xd8, 0xb1, 0xc5, 0xca, 0x83, 0x01, 0x01, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00, 0x00, 0x00,
- 0x2c, 0x13, 0x00, 0x26, 0x00, 0x15, 0x00, 0x04, 0x00, 0x00, 0x08, 0x36, 0x00, 0xcf, 0xd9, 0x43,
- 0x07, 0xa0, 0xa0, 0xc1, 0x83, 0x00, 0xd4, 0xd1, 0xdb, 0xf6, 0xa5, 0xe1, 0x97, 0x61, 0x2d, 0x78,
- 0x3d, 0xc3, 0xc7, 0x0e, 0x21, 0x3a, 0x7b, 0x5f, 0xb4, 0xb4, 0xd8, 0xb8, 0xd1, 0x10, 0x00, 0x8e,
- 0x2d, 0x6a, 0x98, 0xba, 0x42, 0xd2, 0x93, 0x8c, 0x8d, 0x08, 0x53, 0x7e, 0x04, 0xd9, 0x42, 0xa5,
- 0xc1, 0x80, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x00, 0x00, 0x2c, 0x13, 0x00, 0x25, 0x00,
- 0x15, 0x00, 0x04, 0x00, 0x00, 0x08, 0x35, 0x00, 0xf1, 0xd9, 0x43, 0x07, 0xa0, 0xa0, 0xc1, 0x83,
- 0x06, 0xd9, 0xd9, 0xfb, 0xf2, 0x65, 0x1b, 0xb0, 0x16, 0x30, 0x34, 0x7d, 0xa1, 0x87, 0x10, 0x80,
- 0x3a, 0x7d, 0x5f, 0x4a, 0xb1, 0x68, 0xc1, 0x31, 0x51, 0x41, 0x8e, 0x1c, 0xb5, 0x5c, 0x61, 0xf8,
- 0xe5, 0x0a, 0x2f, 0x8e, 0x15, 0x11, 0x82, 0x5c, 0x99, 0xb2, 0x60, 0x40, 0x00, 0x21, 0xf9, 0x04,
- 0x05, 0x07, 0x00, 0x00, 0x00, 0x2c, 0x13, 0x00, 0x24, 0x00, 0x15, 0x00, 0x04, 0x00, 0x00, 0x08,
- 0x38, 0x00, 0xf1, 0xd9, 0x63, 0x07, 0xa0, 0xa0, 0xc1, 0x83, 0x07, 0xd1, 0xe9, 0xb3, 0x87, 0x0f,
- 0x4a, 0x0b, 0x16, 0xa6, 0xbe, 0xd8, 0x43, 0x87, 0xb0, 0xa0, 0xb9, 0x6d, 0x94, 0x64, 0xb4, 0x68,
- 0x01, 0xa3, 0xe0, 0xc6, 0x8d, 0x34, 0x28, 0x45, 0xda, 0x86, 0x6f, 0xdb, 0x17, 0x53, 0x2c, 0x36,
- 0x56, 0x3c, 0xf8, 0xb1, 0xe5, 0x4a, 0x00, 0x01, 0x01, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00,
- 0x00, 0x00, 0x2c, 0x13, 0x00, 0x23, 0x00, 0x15, 0x00, 0x04, 0x00, 0x00, 0x08, 0x35, 0x00, 0xcf,
- 0xe9, 0x63, 0x07, 0xa0, 0xa0, 0xc1, 0x83, 0x08, 0xd5, 0xb1, 0xc3, 0x07, 0xac, 0x45, 0x0b, 0x5e,
- 0x57, 0xf0, 0x11, 0x44, 0x58, 0x90, 0x9d, 0xbd, 0x67, 0x5a, 0x54, 0x40, 0x29, 0xe8, 0xd0, 0x61,
- 0x0d, 0x4f, 0x5f, 0xf0, 0xd9, 0x1b, 0x19, 0x89, 0x12, 0x0c, 0x87, 0x14, 0x0d, 0x76, 0x5c, 0x89,
- 0x12, 0x61, 0x40, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x00, 0x00, 0x2c, 0x13, 0x00, 0x22,
- 0x00, 0x15, 0x00, 0x04, 0x00, 0x00, 0x08, 0x34, 0x00, 0x01, 0xb0, 0x43, 0x07, 0xa0, 0xa0, 0xc1,
- 0x83, 0x08, 0x0d, 0x0e, 0x53, 0xa1, 0xc2, 0x89, 0xa6, 0x2f, 0xfa, 0xd4, 0x25, 0x2c, 0x88, 0xce,
- 0xde, 0x17, 0x4f, 0xbf, 0x0c, 0xb6, 0xd8, 0xd8, 0x82, 0xd7, 0x33, 0x7c, 0xfa, 0xd8, 0xb1, 0xd3,
- 0x87, 0xef, 0x59, 0x0e, 0x8e, 0x13, 0x39, 0xaa, 0x44, 0x79, 0x30, 0x20, 0x00, 0x21, 0xf9, 0x04,
- 0x05, 0x04, 0x00, 0x00, 0x00, 0x2c, 0x13, 0x00, 0x22, 0x00, 0x15, 0x00, 0x03, 0x00, 0x00, 0x08,
- 0x34, 0x00, 0x8f, 0x69, 0x41, 0xb2, 0x2c, 0xd5, 0x17, 0x7b, 0xe8, 0x00, 0x28, 0x5c, 0xc8, 0x90,
- 0xde, 0x36, 0x47, 0x00, 0x5a, 0xb4, 0x00, 0xe0, 0x42, 0xa2, 0x0c, 0x4a, 0xdb, 0xf4, 0x25, 0x54,
- 0xc7, 0xce, 0xde, 0x97, 0x2d, 0x2a, 0x5a, 0x44, 0x61, 0xb8, 0x50, 0xa2, 0x44, 0x18, 0x34, 0x64,
- 0xb0, 0x90, 0xc8, 0x30, 0x20, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x06, 0x00, 0x00, 0x00, 0x2c, 0x13,
- 0x00, 0x21, 0x00, 0x15, 0x00, 0x04, 0x00, 0x00, 0x08, 0x39, 0x00, 0x83, 0x55, 0xd3, 0xb4, 0x49,
- 0x53, 0x35, 0x7c, 0xec, 0x00, 0x28, 0x5c, 0xc8, 0x10, 0x00, 0x3b, 0x1d, 0xce, 0x5a, 0xb4, 0x20,
- 0xf4, 0x44, 0x22, 0x0b, 0x53, 0x5f, 0xec, 0xa1, 0x5b, 0xa8, 0x8e, 0xde, 0x17, 0x4d, 0x35, 0x04,
- 0x35, 0x54, 0x28, 0x51, 0x22, 0x0c, 0x59, 0xa6, 0x4c, 0xc9, 0x28, 0x39, 0xb2, 0x65, 0xc9, 0x16,
- 0x23, 0x03, 0x02, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00, 0x00, 0x00, 0x2c, 0x13, 0x00, 0x20,
- 0x00, 0x15, 0x00, 0x04, 0x00, 0x00, 0x08, 0x38, 0x00, 0x01, 0x70, 0x8b, 0xf4, 0xe5, 0x92, 0xb3,
- 0x6d, 0xfa, 0xd4, 0x01, 0x58, 0xc8, 0xb0, 0xe1, 0xc2, 0x26, 0x35, 0x5a, 0x30, 0x59, 0xd1, 0xa2,
- 0xa2, 0x96, 0x67, 0xf6, 0xd8, 0x39, 0x64, 0x87, 0xef, 0x4a, 0x2f, 0x87, 0x0b, 0x2b, 0x56, 0x84,
- 0x61, 0x0a, 0xd9, 0x15, 0x4a, 0xa6, 0x22, 0xb6, 0x00, 0x09, 0x52, 0x64, 0x45, 0x87, 0x01, 0x01,
- 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x01, 0x00, 0x2c, 0x14, 0x00, 0x1f, 0x00, 0x14, 0x00,
- 0x04, 0x00, 0x00, 0x08, 0x38, 0x00, 0x03, 0xe0, 0xc3, 0xf7, 0x25, 0xc0, 0x32, 0x7c, 0xe8, 0x02,
- 0x28, 0x5c, 0xc8, 0x50, 0xa1, 0x31, 0x15, 0x2d, 0x88, 0x48, 0x71, 0xd1, 0x42, 0xc6, 0x95, 0x6d,
- 0xe6, 0x1a, 0x06, 0x40, 0x77, 0x4e, 0xa3, 0xc2, 0x16, 0x20, 0x7b, 0x98, 0x7a, 0xf6, 0xa5, 0x24,
- 0xa5, 0x1c, 0x2a, 0x96, 0x79, 0x5c, 0x08, 0xb2, 0x25, 0xc8, 0x85, 0x01, 0x01, 0x00, 0x21, 0xf9,
- 0x04, 0x05, 0x03, 0x00, 0x01, 0x00, 0x2c, 0x14, 0x00, 0x1e, 0x00, 0x13, 0x00, 0x04, 0x00, 0x00,
- 0x08, 0x33, 0x00, 0x03, 0x08, 0xd4, 0x67, 0x2f, 0x00, 0x80, 0x11, 0x02, 0x13, 0x2a, 0x14, 0xb8,
- 0xe8, 0x14, 0x0c, 0x2e, 0x84, 0x08, 0x11, 0x81, 0xe1, 0x29, 0x92, 0x3e, 0x75, 0x0b, 0x13, 0xb6,
- 0x58, 0xd8, 0xa2, 0x63, 0x0b, 0x2d, 0xcf, 0xb6, 0xe1, 0xc3, 0xb7, 0xed, 0x8b, 0xa4, 0x8c, 0x0a,
- 0x3d, 0xaa, 0xdc, 0x18, 0x10, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x07, 0x00, 0x00, 0x00, 0x2c, 0x15,
- 0x00, 0x1d, 0x00, 0x12, 0x00, 0x04, 0x00, 0x00, 0x08, 0x30, 0x00, 0x01, 0x08, 0x44, 0x67, 0x4e,
- 0xa0, 0xc1, 0x83, 0x07, 0x85, 0x5d, 0xd1, 0x02, 0x65, 0xc8, 0x14, 0x2b, 0x4a, 0xa0, 0xd9, 0x43,
- 0x87, 0x50, 0x20, 0x91, 0x16, 0x07, 0x5b, 0x68, 0x6c, 0x31, 0xe3, 0xca, 0x36, 0x7b, 0xf4, 0xe8,
- 0xd9, 0x63, 0x56, 0x31, 0xe3, 0xc6, 0x8d, 0xc3, 0x02, 0x02, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03,
- 0x00, 0x00, 0x00, 0x2c, 0x15, 0x00, 0x1d, 0x00, 0x12, 0x00, 0x03, 0x00, 0x00, 0x08, 0x2b, 0x00,
- 0x01, 0x60, 0x01, 0x43, 0x69, 0xcb, 0x2b, 0x56, 0x29, 0xb8, 0xd9, 0x43, 0x07, 0xa0, 0xa1, 0xc3,
- 0x86, 0x5c, 0x5a, 0xac, 0x78, 0xe8, 0xa4, 0x85, 0x0c, 0x4a, 0xdb, 0xe8, 0x31, 0x7c, 0xc8, 0xd1,
- 0x61, 0x8b, 0x8f, 0x2d, 0x60, 0xd0, 0xc8, 0x21, 0x2c, 0x20, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04,
- 0x00, 0x02, 0x00, 0x2c, 0x16, 0x00, 0x1c, 0x00, 0x10, 0x00, 0x04, 0x00, 0x00, 0x08, 0x2f, 0x00,
- 0x05, 0x98, 0x08, 0xf2, 0xe5, 0x0a, 0xb2, 0x2b, 0x5f, 0xec, 0xb1, 0x13, 0xc0, 0xb0, 0xa1, 0x30,
- 0x22, 0x2d, 0x5a, 0x10, 0x59, 0x62, 0x45, 0x50, 0x0b, 0x18, 0x94, 0xb6, 0xd1, 0x6b, 0xc8, 0xb1,
- 0x63, 0xc4, 0x88, 0x33, 0x3c, 0x35, 0xeb, 0x48, 0x92, 0x61, 0xc4, 0x15, 0x01, 0x01, 0x00, 0x21,
- 0xf9, 0x04, 0x05, 0x03, 0x00, 0x00, 0x00, 0x2c, 0x17, 0x00, 0x1b, 0x00, 0x0f, 0x00, 0x04, 0x00,
- 0x00, 0x08, 0x29, 0x00, 0x01, 0x00, 0xf8, 0xe3, 0x63, 0xc7, 0x97, 0x6d, 0xf6, 0xde, 0x09, 0x5c,
- 0x08, 0x60, 0xca, 0xa1, 0x1a, 0x2d, 0x22, 0x46, 0x84, 0xa1, 0xe9, 0xcb, 0x39, 0x86, 0x18, 0x05,
- 0x4a, 0x54, 0xa1, 0xab, 0x59, 0xc6, 0x8f, 0x2d, 0x7a, 0x00, 0x08, 0x08, 0x00, 0x21, 0xf9, 0x04,
- 0x05, 0x07, 0x00, 0x03, 0x00, 0x2c, 0x0e, 0x00, 0x1a, 0x00, 0x20, 0x00, 0x29, 0x00, 0x00, 0x08,
- 0xff, 0x00, 0x07, 0x08, 0x1c, 0x48, 0x70, 0x20, 0xa1, 0x22, 0x52, 0x8a, 0x10, 0x02, 0x50, 0xb0,
- 0xa1, 0xc3, 0x82, 0x4d, 0x04, 0x41, 0x69, 0x41, 0x91, 0xe2, 0x8a, 0x43, 0xc2, 0x1e, 0x6a, 0x1c,
- 0xe8, 0x8c, 0x4b, 0x0b, 0x81, 0x5c, 0xb8, 0x0c, 0xa8, 0xd8, 0xc3, 0x18, 0xc3, 0x8d, 0x0d, 0x0f,
- 0x7d, 0xe4, 0xb2, 0x44, 0xd8, 0xa0, 0x21, 0x04, 0x29, 0x46, 0x99, 0x82, 0x92, 0xa0, 0xb1, 0x8f,
- 0x86, 0xaa, 0x58, 0x79, 0xb2, 0xe2, 0x63, 0xc1, 0x16, 0x86, 0x6a, 0x0a, 0x6c, 0xa6, 0x62, 0xc0,
- 0xcc, 0x42, 0x3e, 0x1f, 0xb6, 0x58, 0x52, 0x13, 0x00, 0x30, 0x81, 0x4c, 0xa2, 0x24, 0xd5, 0xb8,
- 0x22, 0x18, 0x4a, 0x67, 0x1f, 0x0b, 0x89, 0x14, 0xda, 0x02, 0xe6, 0xc6, 0x61, 0x03, 0x5c, 0x08,
- 0x23, 0x22, 0x54, 0x60, 0x14, 0x94, 0x50, 0x04, 0xba, 0x98, 0x8a, 0xb2, 0xc6, 0x49, 0x87, 0xc1,
- 0x8a, 0x96, 0x25, 0xa8, 0xa2, 0x89, 0xc6, 0xb8, 0x73, 0xe9, 0xda, 0x7d, 0xb8, 0xc8, 0x45, 0xde,
- 0x81, 0x3d, 0x16, 0x6d, 0x7c, 0xfa, 0x77, 0x00, 0x61, 0x8d, 0xc6, 0x0a, 0x0f, 0x38, 0x84, 0x72,
- 0x99, 0xdc, 0xb9, 0x2a, 0x96, 0xd5, 0x04, 0x9b, 0x97, 0x32, 0xca, 0xbd, 0x8a, 0x33, 0x6b, 0xde,
- 0x5c, 0x36, 0xf1, 0x46, 0xc6, 0x85, 0x83, 0xad, 0xa0, 0xaa, 0x19, 0x34, 0xe7, 0x86, 0xcd, 0x34,
- 0x16, 0xd1, 0xdc, 0xc4, 0x6f, 0x43, 0x17, 0x98, 0x15, 0x33, 0xea, 0x51, 0xd0, 0xf5, 0xe9, 0xdb,
- 0xb8, 0x51, 0x62, 0x79, 0xb8, 0x5b, 0x33, 0x8a, 0x87, 0x40, 0x36, 0xeb, 0x78, 0xe8, 0x87, 0xf3,
- 0x9d, 0x86, 0x74, 0xde, 0x66, 0x4e, 0x72, 0x86, 0xa0, 0x99, 0x20, 0xb7, 0x7d, 0xd4, 0x29, 0x53,
- 0x66, 0x0e, 0x9f, 0xdc, 0x03, 0xb0, 0xf4, 0xc6, 0xce, 0xbd, 0x3b, 0x67, 0x00, 0x59, 0x08, 0x16,
- 0x23, 0xaf, 0xd9, 0x47, 0xe0, 0x78, 0x81, 0x59, 0x18, 0x96, 0xc0, 0x35, 0xe0, 0x04, 0x90, 0xdf,
- 0x03, 0x92, 0x0c, 0xf0, 0xb2, 0x91, 0xbe, 0xfc, 0x01, 0x28, 0x80, 0x9c, 0x18, 0x80, 0xab, 0x84,
- 0xf7, 0x01, 0x01, 0x01, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x2c, 0x0e, 0x00,
- 0x19, 0x00, 0x20, 0x00, 0x2a, 0x00, 0x00, 0x08, 0xff, 0x00, 0x07, 0x08, 0x1c, 0x48, 0x50, 0x20,
- 0x00, 0x42, 0x45, 0xa4, 0x14, 0x21, 0x04, 0xa0, 0xa0, 0xc3, 0x87, 0x05, 0x85, 0x1d, 0x82, 0xd2,
- 0xa2, 0x62, 0xc5, 0x1a, 0x87, 0x08, 0x41, 0xdc, 0x38, 0x90, 0x51, 0x8d, 0x8a, 0x03, 0x5c, 0xb8,
- 0x10, 0x58, 0x51, 0xc5, 0xa1, 0x45, 0x1c, 0x1d, 0x02, 0x18, 0x56, 0x91, 0x8b, 0x20, 0x42, 0x53,
- 0x86, 0x10, 0xac, 0x88, 0xa8, 0x49, 0x4a, 0x82, 0x2c, 0x07, 0x18, 0x6a, 0x42, 0x45, 0x09, 0x91,
- 0x15, 0x0e, 0x5b, 0x10, 0x99, 0x72, 0x73, 0x00, 0xa3, 0x16, 0x03, 0x9e, 0x4c, 0x51, 0xe2, 0x02,
- 0xe4, 0xc3, 0x16, 0x87, 0x6e, 0x0a, 0xfb, 0x38, 0xa0, 0xd0, 0x13, 0xa4, 0x29, 0x55, 0x34, 0x4b,
- 0x79, 0xa8, 0x85, 0x0a, 0x22, 0x4e, 0x53, 0xb6, 0x18, 0xc6, 0x71, 0x51, 0x8d, 0x01, 0x51, 0xaa,
- 0x8c, 0x2c, 0x3a, 0xa0, 0x46, 0xb0, 0x8d, 0xcd, 0x54, 0x0c, 0x58, 0xe1, 0x04, 0x6b, 0xd1, 0x16,
- 0x5b, 0x21, 0x3a, 0xc3, 0x6a, 0xf7, 0xae, 0xb3, 0x8d, 0x47, 0xd9, 0x16, 0x6c, 0xb1, 0x64, 0xe3,
- 0x90, 0xbe, 0x82, 0x5b, 0xfc, 0x85, 0xd8, 0x0c, 0x31, 0x5b, 0xbc, 0x1b, 0x9b, 0xc8, 0x15, 0x3c,
- 0x50, 0x85, 0xcd, 0x8d, 0x88, 0x28, 0x0f, 0xf4, 0x95, 0x72, 0xaf, 0xe6, 0x01, 0x79, 0x39, 0x46,
- 0xd1, 0x6c, 0xa8, 0xa8, 0x30, 0x2e, 0x82, 0x99, 0x50, 0x46, 0x7d, 0x93, 0x35, 0xe5, 0xc9, 0x9f,
- 0x53, 0x92, 0x8d, 0x9d, 0x52, 0x18, 0x6c, 0x87, 0x2e, 0x84, 0xd1, 0xfe, 0xb5, 0x91, 0x37, 0xed,
- 0xc2, 0x10, 0x65, 0xd2, 0x26, 0x74, 0xbb, 0xf2, 0x32, 0xda, 0x02, 0x8d, 0x15, 0xef, 0x61, 0x0c,
- 0xf9, 0xc0, 0x26, 0x84, 0xa2, 0x47, 0xbf, 0xec, 0xbc, 0xfa, 0xc6, 0x3e, 0x10, 0xfd, 0x38, 0x3f,
- 0x02, 0xd1, 0x86, 0x73, 0x14, 0x10, 0xbd, 0x38, 0x58, 0xff, 0xf3, 0xc6, 0x61, 0x1b, 0x2c, 0xd5,
- 0xbf, 0x94, 0x21, 0x58, 0x26, 0x92, 0xf5, 0x01, 0x5f, 0xce, 0x08, 0x3c, 0x13, 0xa9, 0xe1, 0x7b,
- 0x1d, 0x41, 0x82, 0xfc, 0x78, 0xcf, 0xbf, 0xbf, 0xff, 0x82, 0x26, 0xfc, 0x81, 0x85, 0x0e, 0x3f,
- 0x68, 0x37, 0x00, 0x76, 0x03, 0x08, 0xa1, 0xe0, 0x82, 0x0a, 0x0a, 0x84, 0xa0, 0x1f, 0x3f, 0xe8,
- 0x80, 0xc5, 0x1f, 0x26, 0x0c, 0x80, 0x45, 0x1f, 0x42, 0x0c, 0xe4, 0x43, 0x12, 0x03, 0x78, 0xc1,
- 0x07, 0x1f, 0x10, 0x7d, 0x28, 0x5e, 0x12, 0x3e, 0x0c, 0x24, 0x44, 0x1f, 0x3a, 0xfc, 0x37, 0x50,
- 0x40, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x2c, 0x0d, 0x00, 0x18, 0x00, 0x22,
- 0x00, 0x2b, 0x00, 0x00, 0x08, 0xff, 0x00, 0x07, 0x08, 0x1c, 0x48, 0x70, 0xa0, 0x30, 0x67, 0x82,
- 0x94, 0x08, 0x72, 0xb6, 0xac, 0xa0, 0xc3, 0x87, 0x0f, 0x9d, 0x21, 0x52, 0xd1, 0xa2, 0xa2, 0x45,
- 0x60, 0xce, 0x00, 0x40, 0xdc, 0x68, 0x30, 0x8a, 0x45, 0x17, 0x5c, 0xb8, 0x08, 0xb4, 0x48, 0xa4,
- 0x21, 0xc7, 0x87, 0x84, 0xb8, 0x54, 0x64, 0x32, 0xa4, 0x49, 0x80, 0x21, 0x04, 0x2b, 0xae, 0x68,
- 0x76, 0xb2, 0xa0, 0x30, 0x95, 0x2a, 0x04, 0x4d, 0xb1, 0x52, 0x88, 0x89, 0x0b, 0x87, 0x2d, 0x5c,
- 0xd0, 0xac, 0x39, 0x60, 0x11, 0x91, 0x16, 0x03, 0x96, 0x4c, 0x79, 0x62, 0x11, 0x29, 0x50, 0x2e,
- 0xc1, 0x88, 0x1a, 0x73, 0x3a, 0xc4, 0x49, 0xc5, 0x93, 0x2d, 0x0e, 0xd5, 0x0c, 0x56, 0x23, 0xe8,
- 0x8a, 0xab, 0x35, 0x5b, 0xd4, 0x68, 0x72, 0xd2, 0x19, 0xd2, 0x25, 0x45, 0x88, 0x0e, 0x6c, 0xe1,
- 0xec, 0xe4, 0x30, 0xa4, 0x86, 0x3c, 0xaa, 0x1d, 0xd0, 0x62, 0xd8, 0x49, 0x28, 0x48, 0xc1, 0xce,
- 0x05, 0xc6, 0x11, 0x40, 0x8d, 0xb9, 0x0e, 0xa1, 0xf4, 0xfd, 0x0b, 0x98, 0xa0, 0x60, 0x8e, 0x89,
- 0x0a, 0x13, 0x44, 0xe4, 0x56, 0xf1, 0x40, 0xad, 0x1c, 0xcd, 0x3a, 0x6e, 0x91, 0x96, 0x63, 0xb0,
- 0xc3, 0x85, 0xb9, 0x68, 0x3c, 0xb9, 0x44, 0x31, 0x5b, 0xa2, 0x00, 0x18, 0x03, 0x8e, 0xe2, 0xb8,
- 0x74, 0xcd, 0x15, 0x6a, 0x85, 0x29, 0x96, 0x6c, 0xfa, 0x24, 0x69, 0x8e, 0x76, 0x4b, 0x37, 0x73,
- 0xfa, 0x50, 0x05, 0x21, 0xd3, 0x00, 0x30, 0x3b, 0xe4, 0xdb, 0x1a, 0xf2, 0x43, 0xdf, 0xa5, 0x59,
- 0x17, 0xa4, 0xdc, 0x5a, 0xe0, 0xa1, 0x1e, 0x0e, 0x81, 0x17, 0x17, 0xc6, 0x9c, 0x79, 0xd4, 0xe2,
- 0xd0, 0x6b, 0x02, 0x01, 0x43, 0xbd, 0x3a, 0x75, 0x20, 0xd0, 0xbb, 0x40, 0x8c, 0x04, 0xfd, 0x05,
- 0x44, 0x30, 0xd0, 0x51, 0xb0, 0x65, 0x71, 0xc8, 0xc6, 0x4b, 0xf4, 0x3b, 0x0e, 0xe9, 0x6c, 0x2e,
- 0xae, 0xa3, 0x4e, 0x19, 0x81, 0x65, 0xe6, 0xf8, 0x89, 0x2e, 0xb0, 0x84, 0x8d, 0x31, 0x63, 0x8e,
- 0x98, 0xa0, 0xcf, 0xbf, 0xbf, 0xff, 0x87, 0x25, 0x64, 0x81, 0x85, 0x0e, 0x3f, 0xcc, 0xd7, 0x47,
- 0x1f, 0x03, 0x08, 0x21, 0xc4, 0x00, 0x27, 0x34, 0xe8, 0x60, 0x82, 0x0b, 0x1e, 0x38, 0x80, 0x1f,
- 0x3f, 0xe8, 0x80, 0x45, 0x16, 0x25, 0x0c, 0x90, 0x85, 0x1f, 0x42, 0x9c, 0x00, 0x04, 0x0a, 0x3e,
- 0x24, 0xe1, 0x05, 0x1f, 0x7c, 0xd4, 0x44, 0xa2, 0x17, 0x49, 0xf8, 0x80, 0x02, 0x10, 0x27, 0x08,
- 0xe1, 0x47, 0x16, 0xa0, 0x01, 0x20, 0xe3, 0x8c, 0x6a, 0x05, 0x04, 0x00, 0x21, 0xf9, 0x04, 0x05,
- 0x04, 0x00, 0x03, 0x00, 0x2c, 0x0c, 0x00, 0x17, 0x00, 0x24, 0x00, 0x2c, 0x00, 0x00, 0x08, 0xff,
- 0x00, 0x07, 0x08, 0x1c, 0x48, 0x90, 0xe0, 0x32, 0x67, 0x82, 0x12, 0x3a, 0x5b, 0x56, 0xb0, 0xa1,
- 0xc3, 0x87, 0x00, 0x9c, 0x21, 0x6a, 0x41, 0xb1, 0xa2, 0x0a, 0x60, 0x43, 0x16, 0x3d, 0xdc, 0x58,
- 0x70, 0xd9, 0x44, 0x8a, 0x03, 0x5c, 0xb8, 0x18, 0x48, 0x91, 0x49, 0x33, 0x8e, 0x1c, 0x9b, 0xad,
- 0x68, 0x31, 0x80, 0xc9, 0x12, 0x2a, 0x53, 0x86, 0x14, 0x6c, 0xd1, 0xc3, 0x19, 0x4a, 0x87, 0xcd,
- 0x5c, 0xb4, 0x70, 0xa1, 0x64, 0x0a, 0x15, 0x41, 0x51, 0xb8, 0x34, 0x6c, 0xa1, 0xc2, 0xe6, 0xcd,
- 0x81, 0xc2, 0x56, 0xba, 0x90, 0x32, 0xa5, 0x90, 0x4e, 0x90, 0x43, 0x6b, 0x30, 0x3c, 0x3a, 0x20,
- 0x0a, 0x4b, 0x2e, 0x54, 0x9c, 0xb0, 0x44, 0xd9, 0x02, 0x11, 0xd5, 0x66, 0x5b, 0x07, 0x40, 0xbd,
- 0xd9, 0xe2, 0xe4, 0xcd, 0x61, 0x2c, 0xa5, 0x14, 0xa2, 0x2a, 0xb0, 0xc5, 0xb0, 0x9b, 0xc1, 0x6a,
- 0x08, 0x2c, 0xe2, 0x84, 0xad, 0xc0, 0x1a, 0x00, 0x50, 0x82, 0x6d, 0x1b, 0x96, 0xaa, 0x0b, 0x61,
- 0x28, 0x9d, 0xf5, 0xb5, 0x2b, 0xd6, 0xec, 0xc6, 0x63, 0x83, 0xed, 0xaa, 0x30, 0xec, 0x90, 0x02,
- 0xbe, 0xc4, 0x6c, 0x55, 0x10, 0x42, 0xb9, 0x4c, 0x05, 0x61, 0x82, 0x2e, 0x9a, 0xa0, 0x04, 0x00,
- 0xe5, 0xf2, 0x40, 0x60, 0x47, 0x0f, 0x79, 0x16, 0xb8, 0xe4, 0xe8, 0xb2, 0x1e, 0x9e, 0x6b, 0x68,
- 0x0e, 0xed, 0xd9, 0x18, 0xdb, 0x60, 0x44, 0x08, 0x23, 0xca, 0x6b, 0x97, 0x09, 0xdb, 0xd8, 0xa9,
- 0x47, 0xeb, 0x76, 0xd8, 0xc2, 0xa8, 0x67, 0x00, 0xa0, 0x39, 0x46, 0xd9, 0x3d, 0xc0, 0x37, 0x6f,
- 0xc6, 0x9e, 0x9b, 0xa0, 0x7e, 0x88, 0x97, 0xf8, 0x00, 0xaf, 0x0f, 0x7f, 0x39, 0x1f, 0xe0, 0xfa,
- 0xa1, 0x71, 0xdd, 0x8b, 0xde, 0x4e, 0xe7, 0x18, 0xac, 0x89, 0x77, 0xef, 0x1a, 0xb7, 0x8b, 0x78,
- 0xe7, 0x98, 0x64, 0x87, 0xf9, 0xf3, 0xe6, 0x93, 0x6c, 0xdf, 0xd3, 0xa6, 0xbd, 0xfb, 0xf6, 0x61,
- 0xb6, 0x77, 0x79, 0xff, 0x5e, 0xcc, 0xf6, 0x17, 0xf4, 0xdd, 0x83, 0xd9, 0x8e, 0x65, 0x4d, 0xc3,
- 0x34, 0x3f, 0x88, 0xe7, 0x45, 0x1a, 0x04, 0xa1, 0x11, 0xc4, 0x78, 0x03, 0xf4, 0x31, 0xc6, 0x1c,
- 0x72, 0x88, 0x21, 0x04, 0x82, 0x10, 0x46, 0x28, 0xa1, 0x40, 0x00, 0x64, 0xf1, 0x87, 0x0e, 0x3f,
- 0xf8, 0x91, 0xe0, 0x00, 0x42, 0x3c, 0x78, 0xc2, 0x09, 0x0d, 0x7d, 0xc8, 0xe1, 0x83, 0x7d, 0x0c,
- 0x80, 0x4b, 0x80, 0x7f, 0x64, 0x41, 0xdb, 0x0f, 0x7d, 0x9c, 0x00, 0x04, 0x0a, 0x3e, 0x24, 0xe1,
- 0x05, 0x1f, 0x76, 0xf1, 0xe1, 0x45, 0x12, 0x3e, 0xa0, 0x00, 0xc4, 0x09, 0x7d, 0x04, 0x78, 0x13,
- 0x00, 0xb4, 0x15, 0x04, 0xe4, 0x51, 0x01, 0x01, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x06, 0x00, 0x07,
- 0x00, 0x2c, 0x0c, 0x00, 0x16, 0x00, 0x24, 0x00, 0x2d, 0x00, 0x00, 0x08, 0xff, 0x00, 0x0f, 0x08,
- 0x1c, 0x48, 0xb0, 0xa0, 0x40, 0x00, 0x06, 0x13, 0x2a, 0x5c, 0x78, 0xa0, 0xd9, 0x21, 0x44, 0x30,
- 0x54, 0xc0, 0x40, 0x74, 0xa8, 0x19, 0xc3, 0x8b, 0x04, 0x9b, 0x21, 0x6a, 0x61, 0xb0, 0x45, 0x0b,
- 0x60, 0xce, 0x30, 0x2e, 0x04, 0x70, 0x48, 0x85, 0x40, 0x17, 0x4e, 0x94, 0x38, 0x29, 0xd8, 0x62,
- 0x58, 0x30, 0x91, 0x05, 0x17, 0xfd, 0xe2, 0xb8, 0x42, 0x50, 0x93, 0x00, 0xc2, 0x94, 0x74, 0x44,
- 0xd4, 0x04, 0xe6, 0xc0, 0x99, 0x07, 0x88, 0x50, 0xa9, 0x22, 0x88, 0x89, 0xc7, 0x84, 0x2d, 0x10,
- 0x21, 0x84, 0xc9, 0x88, 0x23, 0x93, 0x26, 0x56, 0xb8, 0x70, 0x64, 0xd8, 0xc2, 0x18, 0x4c, 0x61,
- 0x35, 0x06, 0x2e, 0x59, 0x01, 0xb3, 0x86, 0x30, 0x91, 0x87, 0x04, 0x32, 0x71, 0xe1, 0x53, 0x60,
- 0xd8, 0x8b, 0x8b, 0xa0, 0x1c, 0x70, 0x51, 0xe5, 0x49, 0xd9, 0x03, 0x50, 0x96, 0x2e, 0x6c, 0xc6,
- 0xd1, 0x85, 0x20, 0xae, 0x65, 0x55, 0x2c, 0xbb, 0x38, 0xe4, 0x2d, 0xcb, 0x90, 0x0c, 0xad, 0xfa,
- 0x25, 0x08, 0x58, 0x21, 0x00, 0xc1, 0x83, 0x0f, 0xb4, 0x28, 0x9c, 0x90, 0x44, 0xe2, 0x81, 0x8b,
- 0x2f, 0xd2, 0x7d, 0xac, 0xf7, 0x62, 0xb0, 0xac, 0x89, 0xe3, 0x62, 0x1c, 0xf6, 0xf8, 0xac, 0x64,
- 0x93, 0x83, 0xbf, 0x8a, 0xe4, 0xfc, 0xb8, 0xb4, 0x69, 0xd3, 0x2f, 0x4f, 0xab, 0x2e, 0xc8, 0x68,
- 0x35, 0x43, 0x26, 0x17, 0x11, 0x99, 0x5e, 0x72, 0x91, 0x71, 0x68, 0xd0, 0x0a, 0x53, 0x97, 0x4e,
- 0xb4, 0x50, 0xf6, 0x69, 0xcf, 0x06, 0x5b, 0xaf, 0x26, 0x4b, 0x30, 0xab, 0xdc, 0xd3, 0x8b, 0x82,
- 0x29, 0x57, 0xee, 0xba, 0x39, 0x43, 0x3e, 0x0a, 0xbd, 0xac, 0xb6, 0xa3, 0x10, 0xcf, 0x6a, 0x31,
- 0x0a, 0xf7, 0xac, 0x06, 0xa3, 0xf0, 0xcb, 0x6a, 0x3f, 0x68, 0x0c, 0x9a, 0x3c, 0x11, 0xe2, 0xfa,
- 0x88, 0x19, 0x82, 0x65, 0x76, 0x38, 0x47, 0xb1, 0x47, 0x8d, 0x1a, 0x3d, 0x49, 0x9c, 0x0f, 0x04,
- 0x70, 0x5c, 0xbe, 0x7d, 0xd7, 0x58, 0x14, 0x9e, 0x60, 0xb8, 0x9f, 0xa0, 0x9f, 0x03, 0x3a, 0xe4,
- 0x27, 0x50, 0x09, 0x7e, 0x90, 0x77, 0x80, 0x0f, 0xa7, 0x21, 0x78, 0x80, 0x10, 0x7e, 0x94, 0x50,
- 0x56, 0x09, 0x10, 0x42, 0x78, 0x10, 0x46, 0x01, 0x01, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00,
- 0x0d, 0x00, 0x2c, 0x0c, 0x00, 0x16, 0x00, 0x24, 0x00, 0x2d, 0x00, 0x00, 0x08, 0xff, 0x00, 0x1b,
- 0x08, 0x1c, 0x48, 0xb0, 0xa0, 0xc0, 0x00, 0x06, 0x13, 0x2a, 0x5c, 0xd8, 0x20, 0x40, 0x09, 0x42,
- 0x45, 0x8a, 0x34, 0x23, 0xb4, 0x08, 0x21, 0xc3, 0x8b, 0x03, 0x03, 0x2c, 0x3b, 0x54, 0xa3, 0x60,
- 0x8d, 0x61, 0xcd, 0x2c, 0x62, 0x4c, 0x18, 0x20, 0xd8, 0x21, 0x15, 0x0d, 0x5a, 0xa8, 0x6c, 0x41,
- 0x50, 0xc5, 0x2f, 0x61, 0x22, 0x47, 0x1e, 0x14, 0x46, 0x24, 0xa5, 0x8b, 0x27, 0x45, 0xa8, 0x08,
- 0x32, 0xc8, 0x25, 0xa4, 0xcc, 0x81, 0xc2, 0xb8, 0xa4, 0x34, 0x44, 0x65, 0x4a, 0x11, 0x25, 0x35,
- 0x0d, 0xae, 0x20, 0x14, 0x93, 0x61, 0x06, 0x1d, 0x35, 0x5b, 0x28, 0x19, 0x34, 0x44, 0x28, 0x43,
- 0x2e, 0x4d, 0x64, 0x0e, 0x00, 0x23, 0x70, 0xc5, 0x94, 0x42, 0x32, 0x87, 0x35, 0x55, 0x28, 0xcc,
- 0x45, 0xca, 0x16, 0x2b, 0x7e, 0xaa, 0x58, 0x86, 0x31, 0xc0, 0xa1, 0x94, 0x3b, 0x7f, 0x0a, 0x34,
- 0x36, 0xb6, 0x60, 0x00, 0x28, 0x29, 0xad, 0x3c, 0x91, 0xdb, 0x20, 0x51, 0x5d, 0x82, 0xc2, 0x50,
- 0xf2, 0x1d, 0xa8, 0x22, 0x2b, 0xc3, 0x66, 0x83, 0x09, 0xba, 0x60, 0xbb, 0x30, 0x43, 0xae, 0xc4,
- 0x03, 0x5d, 0x10, 0x5a, 0x08, 0xe0, 0x1d, 0xe4, 0xc8, 0xbd, 0x2e, 0x06, 0xbe, 0xcc, 0x22, 0xd8,
- 0xc5, 0x00, 0x89, 0x2e, 0x23, 0xfa, 0x4b, 0xd0, 0xd8, 0xe5, 0x25, 0x23, 0x85, 0xf5, 0x48, 0xbc,
- 0xc2, 0x30, 0xc6, 0xb7, 0x83, 0x51, 0xcb, 0x5c, 0x74, 0xb9, 0xf6, 0x45, 0xd7, 0xb6, 0x73, 0x17,
- 0x74, 0x86, 0x51, 0x30, 0xe4, 0x00, 0x88, 0x2e, 0x46, 0xb1, 0xcd, 0xfb, 0xb0, 0xed, 0x60, 0x1d,
- 0x15, 0x42, 0x01, 0x90, 0x3b, 0xb8, 0xc2, 0x5f, 0xba, 0x65, 0x27, 0x2c, 0x6e, 0x9b, 0xb9, 0x6f,
- 0x81, 0xab, 0x49, 0x0f, 0x0e, 0xd6, 0xa4, 0x7b, 0x77, 0xcf, 0xba, 0xc3, 0x63, 0x5c, 0x4c, 0xa2,
- 0xd0, 0x47, 0xf8, 0x30, 0x0a, 0xd1, 0xeb, 0x8e, 0xa4, 0x70, 0x4c, 0xf8, 0x23, 0x0a, 0x5f, 0x84,
- 0xff, 0xe3, 0xc6, 0xe0, 0x1a, 0x2c, 0xe2, 0x7d, 0x54, 0x22, 0x98, 0xc6, 0x8b, 0x78, 0x81, 0x3f,
- 0x44, 0x62, 0x87, 0x1d, 0x5d, 0xf8, 0xf1, 0x1f, 0x41, 0x01, 0x68, 0x77, 0xe0, 0x82, 0x97, 0x05,
- 0x60, 0xc2, 0x1f, 0xf8, 0xe1, 0x52, 0x90, 0x10, 0x0c, 0x51, 0x48, 0x90, 0x84, 0x58, 0xfc, 0x61,
- 0x02, 0x42, 0x01, 0xfc, 0xd0, 0x87, 0x40, 0x28, 0xe4, 0x16, 0x62, 0x03, 0x7d, 0xfc, 0xa0, 0x60,
- 0x43, 0x03, 0x01, 0xa0, 0xa2, 0x8a, 0x07, 0x61, 0x14, 0x10, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03,
- 0x00, 0x06, 0x00, 0x2c, 0x0c, 0x00, 0x17, 0x00, 0x24, 0x00, 0x2c, 0x00, 0x00, 0x08, 0xff, 0x00,
- 0x0d, 0x08, 0x1c, 0x48, 0x90, 0x60, 0x80, 0x83, 0x08, 0x03, 0x14, 0x5c, 0xc8, 0xb0, 0xa1, 0x81,
- 0x84, 0x10, 0x0f, 0x3a, 0x9c, 0x68, 0xf0, 0xa0, 0xb0, 0x25, 0x86, 0x12, 0x71, 0x49, 0x64, 0x68,
- 0xc9, 0x32, 0x84, 0x14, 0x1d, 0x1e, 0x6c, 0x32, 0xcc, 0x40, 0x8b, 0x93, 0x2d, 0x06, 0xaa, 0xf8,
- 0xf5, 0x51, 0x61, 0xc8, 0x82, 0x07, 0x9b, 0x71, 0x39, 0xb9, 0xe2, 0xc9, 0x92, 0x27, 0x05, 0x7b,
- 0x30, 0x92, 0xf8, 0xd2, 0xc0, 0x08, 0x0a, 0x01, 0x9c, 0xf5, 0x68, 0xe1, 0x42, 0x50, 0x95, 0x2a,
- 0x56, 0x0a, 0x2d, 0x54, 0x61, 0x8c, 0x67, 0x48, 0x10, 0x24, 0x9a, 0x0d, 0xe5, 0x42, 0x48, 0x58,
- 0x21, 0x17, 0x0e, 0x55, 0x38, 0x73, 0x19, 0x32, 0x40, 0x30, 0x26, 0x02, 0x8b, 0x58, 0xe1, 0x12,
- 0x72, 0x85, 0x30, 0xae, 0x13, 0x03, 0x18, 0x33, 0xd9, 0x82, 0xc9, 0x8a, 0x9e, 0x87, 0xd0, 0x3a,
- 0x5c, 0xf4, 0x96, 0xc9, 0x92, 0x9e, 0x02, 0x6b, 0x04, 0xeb, 0xda, 0x4c, 0x60, 0xa1, 0x22, 0x78,
- 0x05, 0x36, 0x93, 0xbb, 0x50, 0x6d, 0xe0, 0x82, 0x82, 0x08, 0x0f, 0x04, 0x60, 0x20, 0x43, 0xc9,
- 0xc3, 0x03, 0x87, 0x29, 0x16, 0xb8, 0x21, 0x1e, 0x84, 0x5f, 0x90, 0x23, 0x4f, 0x1e, 0x18, 0xe0,
- 0x50, 0x66, 0x81, 0x71, 0x43, 0xde, 0xfd, 0x3c, 0xe4, 0x25, 0xa1, 0xcf, 0x2a, 0x96, 0xbd, 0x0c,
- 0x00, 0x16, 0x32, 0xa2, 0xcd, 0x05, 0x9d, 0x65, 0x96, 0xdd, 0x33, 0x00, 0xa2, 0xc3, 0x51, 0x60,
- 0x33, 0x24, 0xdb, 0xb3, 0x35, 0xe4, 0xb7, 0x9f, 0xf1, 0xaa, 0x08, 0xd9, 0x37, 0xf8, 0x63, 0x87,
- 0xc7, 0x3f, 0xab, 0xce, 0x4a, 0x25, 0xb8, 0x40, 0xdb, 0x0e, 0x5f, 0x3b, 0x17, 0x28, 0xc8, 0x61,
- 0xf5, 0xe9, 0x06, 0x8a, 0x33, 0xd4, 0xee, 0xbc, 0xf3, 0x42, 0x17, 0x6b, 0xb1, 0x0f, 0x7f, 0x6c,
- 0x42, 0xa5, 0x7c, 0xf9, 0x26, 0xe2, 0xd3, 0xbf, 0x14, 0x02, 0xa6, 0xbd, 0xfb, 0xf6, 0x42, 0xd2,
- 0xef, 0x68, 0x38, 0x5f, 0x7c, 0x10, 0x36, 0xf8, 0xf3, 0xe3, 0xb7, 0x91, 0xde, 0x8f, 0x01, 0xfd,
- 0xf9, 0xc5, 0x27, 0x5e, 0x00, 0x62, 0x2c, 0x14, 0x86, 0x6e, 0x81, 0x99, 0x10, 0x06, 0x41, 0x7b,
- 0x64, 0xa1, 0xde, 0x73, 0x27, 0xec, 0xb0, 0x03, 0x10, 0x08, 0x3e, 0x68, 0xe1, 0x85, 0xe9, 0x01,
- 0x90, 0xc5, 0x1f, 0x58, 0xe8, 0xf0, 0x83, 0x1f, 0x7e, 0xf4, 0x21, 0xa2, 0x10, 0x24, 0x96, 0x68,
- 0xa2, 0x88, 0x7d, 0x80, 0xf8, 0x83, 0x0e, 0x58, 0xfc, 0x91, 0x05, 0x63, 0x02, 0x01, 0xf0, 0x43,
- 0x1f, 0x27, 0x00, 0x81, 0x82, 0x0f, 0x3e, 0x24, 0xe1, 0x45, 0x4f, 0x5e, 0x24, 0x81, 0x23, 0x0a,
- 0x40, 0x9c, 0xd0, 0xc7, 0x0f, 0x30, 0x76, 0x95, 0xd0, 0x43, 0x20, 0x85, 0x14, 0x10, 0x00, 0x21,
- 0xf9, 0x04, 0x05, 0x03, 0x00, 0x10, 0x00, 0x2c, 0x0d, 0x00, 0x17, 0x00, 0x22, 0x00, 0x2c, 0x00,
- 0x00, 0x08, 0xff, 0x00, 0x21, 0x08, 0x1c, 0x48, 0x90, 0x02, 0x08, 0x82, 0x08, 0x13, 0x2a, 0x5c,
- 0x28, 0x30, 0xc3, 0x00, 0x86, 0x10, 0x23, 0x12, 0x0c, 0x40, 0xb1, 0x62, 0x45, 0x89, 0x11, 0x2d,
- 0x02, 0x10, 0x46, 0x45, 0x18, 0x00, 0x8b, 0x18, 0x15, 0x56, 0x6c, 0x36, 0xac, 0x46, 0x8b, 0x16,
- 0x10, 0x6a, 0x44, 0x71, 0xb6, 0x88, 0x62, 0x48, 0x0a, 0x1b, 0x04, 0x52, 0xa4, 0x82, 0xe8, 0xa4,
- 0x4d, 0x82, 0x4c, 0x9a, 0xb9, 0xc4, 0x48, 0x02, 0x02, 0xc5, 0x22, 0x2b, 0x5a, 0xb8, 0x78, 0x52,
- 0x44, 0xd8, 0x10, 0x84, 0x2a, 0x8c, 0xed, 0x94, 0x48, 0xb1, 0x99, 0x8b, 0x16, 0x4c, 0x08, 0x35,
- 0x59, 0x12, 0x85, 0x8b, 0x42, 0x41, 0x4b, 0x21, 0x06, 0x10, 0xb6, 0x42, 0x60, 0x93, 0x21, 0x5d,
- 0x19, 0xaa, 0xd0, 0xc9, 0x34, 0xc0, 0xaf, 0x93, 0x44, 0x94, 0x60, 0x24, 0x92, 0x55, 0x24, 0x21,
- 0x15, 0x2d, 0x9c, 0x58, 0xc5, 0x38, 0x36, 0x40, 0x46, 0xb5, 0x10, 0x84, 0x45, 0x09, 0x09, 0xe1,
- 0x90, 0xdd, 0x84, 0x00, 0x32, 0xc8, 0x44, 0x24, 0x70, 0x6e, 0xc8, 0x44, 0x7f, 0x11, 0x22, 0x88,
- 0x27, 0xb3, 0x06, 0x5f, 0x82, 0x35, 0x4a, 0x44, 0x2c, 0xc1, 0xe2, 0xf1, 0x40, 0x16, 0x8b, 0x32,
- 0x3a, 0xb6, 0x9c, 0x12, 0x40, 0xc6, 0xbd, 0x9c, 0x11, 0x25, 0x66, 0xb8, 0x84, 0x33, 0x04, 0x41,
- 0x18, 0x85, 0xf5, 0xb0, 0xec, 0x42, 0x58, 0xc8, 0x43, 0x96, 0x87, 0xf1, 0x6d, 0xc2, 0x84, 0xaf,
- 0x61, 0xd3, 0x10, 0x57, 0x10, 0xe2, 0xdc, 0x6c, 0x35, 0x44, 0xdf, 0xa6, 0x8d, 0x45, 0x84, 0x8d,
- 0x3b, 0xd8, 0x6d, 0x84, 0x2b, 0x82, 0xe1, 0x16, 0x48, 0x5c, 0x61, 0x73, 0xdc, 0xcd, 0x18, 0x46,
- 0x5f, 0x0e, 0x21, 0xd8, 0x66, 0x84, 0x3d, 0x9a, 0x50, 0x17, 0xb8, 0x04, 0xb8, 0x40, 0x15, 0x8c,
- 0xb6, 0x0f, 0x83, 0x14, 0x66, 0xa5, 0x7c, 0x79, 0xd7, 0xe2, 0xd3, 0x43, 0xc4, 0xf2, 0xa5, 0xbd,
- 0xfb, 0xf6, 0x7f, 0xc4, 0x9f, 0x60, 0x43, 0xbf, 0x3e, 0xfd, 0x13, 0xe2, 0xe3, 0x2b, 0xfc, 0x21,
- 0x3e, 0x40, 0x9e, 0x84, 0x77, 0x8c, 0xb6, 0x1c, 0x10, 0x68, 0x10, 0x74, 0x86, 0x0f, 0xea, 0x05,
- 0x00, 0x04, 0x1e, 0x66, 0x98, 0x71, 0x87, 0x0f, 0x02, 0x6e, 0x17, 0xc0, 0x1f, 0x7f, 0x44, 0xa8,
- 0xde, 0x85, 0x18, 0x66, 0x28, 0x13, 0x00, 0x26, 0xfc, 0x81, 0x85, 0x0e, 0x3f, 0xe0, 0xe2, 0x87,
- 0x1f, 0x10, 0xf4, 0x61, 0xe2, 0x89, 0x28, 0x42, 0x30, 0x22, 0x2e, 0x3f, 0xe8, 0x80, 0xc5, 0x1f,
- 0x26, 0x7c, 0xe4, 0x13, 0x00, 0x3f, 0xf4, 0x21, 0xc4, 0x09, 0x40, 0xa0, 0xe0, 0x83, 0x0f, 0x49,
- 0x78, 0xe1, 0xc5, 0x42, 0x3e, 0x26, 0xb1, 0x23, 0x0a, 0x40, 0x00, 0x21, 0x44, 0x1f, 0x3f, 0xc8,
- 0xf8, 0x98, 0x85, 0x0c, 0x05, 0x04, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x07, 0x00, 0x0d, 0x00, 0x2c,
- 0x0d, 0x00, 0x17, 0x00, 0x21, 0x00, 0x2c, 0x00, 0x00, 0x08, 0xff, 0x00, 0x1b, 0x08, 0x1c, 0x48,
- 0x10, 0x04, 0x02, 0x82, 0x08, 0x13, 0x2a, 0x5c, 0xc8, 0xb0, 0xa1, 0xc3, 0x87, 0x10, 0x23, 0x0a,
- 0x0c, 0x40, 0x91, 0xa2, 0xc4, 0x81, 0x00, 0x14, 0x56, 0xdc, 0x58, 0x51, 0xe2, 0x83, 0x07, 0x04,
- 0x2b, 0x12, 0x5a, 0x72, 0xc8, 0xd0, 0x30, 0x41, 0xcd, 0x00, 0x58, 0x84, 0x98, 0x71, 0x20, 0xc5,
- 0x66, 0x88, 0x5a, 0xc8, 0x6c, 0x31, 0x90, 0x89, 0xb3, 0x95, 0x12, 0x29, 0x1a, 0x53, 0xd1, 0x62,
- 0xc5, 0x93, 0x21, 0x87, 0x10, 0x1a, 0x0a, 0x16, 0x20, 0x67, 0x80, 0x43, 0x32, 0x0b, 0x35, 0x19,
- 0x69, 0x28, 0x21, 0x22, 0xa2, 0x11, 0x03, 0x0c, 0x69, 0xd0, 0x62, 0x89, 0xb0, 0xa6, 0x0c, 0x87,
- 0x15, 0x7d, 0x18, 0x40, 0xd8, 0x8a, 0x16, 0x2a, 0xa4, 0x30, 0x79, 0xd8, 0x6c, 0x6b, 0xc3, 0xa3,
- 0x0d, 0x56, 0x10, 0x89, 0x18, 0xc5, 0x2c, 0xc1, 0x0c, 0x04, 0x01, 0xd4, 0x68, 0x20, 0x48, 0x4a,
- 0x44, 0x15, 0xc2, 0x12, 0x82, 0x88, 0x47, 0x90, 0x90, 0xc0, 0x15, 0x2b, 0x24, 0x16, 0x71, 0x9b,
- 0x30, 0x80, 0xb3, 0x8b, 0x03, 0x87, 0x10, 0x4e, 0x78, 0x18, 0x71, 0x83, 0x25, 0x8b, 0x11, 0x5a,
- 0x71, 0xdc, 0xa0, 0x71, 0x43, 0x61, 0x2a, 0x10, 0xab, 0xf0, 0xeb, 0x30, 0x00, 0x30, 0xc4, 0x5c,
- 0x5a, 0x3a, 0xb4, 0x1c, 0x71, 0x49, 0x44, 0x00, 0x6b, 0x23, 0x32, 0x59, 0x44, 0xd9, 0x61, 0x8d,
- 0x66, 0x8e, 0x5d, 0x3c, 0x2c, 0x42, 0xd9, 0x74, 0x43, 0x41, 0xad, 0x03, 0xa4, 0x56, 0xc8, 0x64,
- 0x4a, 0xeb, 0xca, 0x0c, 0x6d, 0xb7, 0x0e, 0x26, 0x3b, 0x21, 0xde, 0xdf, 0x0d, 0x02, 0x20, 0x52,
- 0x98, 0x28, 0xf2, 0x45, 0xd8, 0x8c, 0x91, 0x13, 0x2c, 0x42, 0x9d, 0x3a, 0x15, 0xe9, 0xd8, 0x3b,
- 0x47, 0xea, 0xc2, 0xbd, 0x7b, 0x72, 0xe9, 0x00, 0xde, 0xb4, 0x6a, 0x19, 0x4f, 0xde, 0x8d, 0xf3,
- 0x9c, 0x78, 0xc8, 0x93, 0xaf, 0x73, 0x5e, 0xe2, 0x8e, 0x34, 0xf0, 0xe3, 0x7f, 0xc9, 0x6e, 0x22,
- 0x0f, 0xc1, 0x3b, 0x59, 0xb2, 0x37, 0x00, 0x70, 0x24, 0x4c, 0x98, 0x17, 0x25, 0xe8, 0xe7, 0x52,
- 0x7b, 0x02, 0x16, 0x68, 0x20, 0x72, 0x01, 0x00, 0x60, 0xc2, 0x1f, 0x58, 0xe8, 0xf0, 0xc3, 0x0f,
- 0x0d, 0xf8, 0x21, 0x61, 0x42, 0x12, 0xfa, 0xd1, 0xc0, 0x83, 0x3a, 0x60, 0xf1, 0x87, 0x09, 0x2a,
- 0x4d, 0x54, 0x02, 0x2e, 0x7d, 0x08, 0x71, 0x02, 0x10, 0x28, 0x34, 0xe0, 0x83, 0x0f, 0x49, 0x24,
- 0xe1, 0xc5, 0x8a, 0x2c, 0xa6, 0x78, 0x62, 0x03, 0x28, 0x00, 0x71, 0x82, 0x10, 0x7d, 0xe0, 0x52,
- 0x02, 0x81, 0xc8, 0x05, 0x04, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x0a, 0x00, 0x2c, 0x0c,
- 0x00, 0x15, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x00, 0x08, 0xff, 0x00, 0x15, 0x08, 0x1c, 0x48, 0xb0,
- 0xe0, 0xc0, 0x0c, 0x08, 0x0c, 0x2a, 0x5c, 0x38, 0x70, 0x00, 0x80, 0x82, 0x00, 0x06, 0x30, 0x9c,
- 0x58, 0x10, 0x03, 0xc5, 0x8b, 0x18, 0x33, 0x6a, 0xdc, 0xc8, 0xb1, 0xe3, 0xc2, 0x08, 0x12, 0x3d,
- 0x52, 0x8c, 0xf0, 0x6e, 0x61, 0x80, 0x00, 0xc1, 0x9a, 0x04, 0x3b, 0x19, 0x40, 0xe4, 0xc0, 0x00,
- 0xc2, 0x0e, 0x25, 0x52, 0x21, 0x10, 0xca, 0xa1, 0x66, 0x2d, 0x45, 0x4e, 0x39, 0xd4, 0xa3, 0x45,
- 0x0b, 0x17, 0x2e, 0x08, 0x46, 0x11, 0x96, 0x73, 0x63, 0x30, 0x27, 0x0a, 0x5c, 0x14, 0x52, 0x30,
- 0x65, 0x48, 0x41, 0x2e, 0x84, 0x8a, 0x62, 0x9c, 0x82, 0x48, 0x01, 0x17, 0x2b, 0x54, 0x0a, 0x71,
- 0x51, 0xc8, 0x45, 0x98, 0xc6, 0x00, 0x87, 0x14, 0xb4, 0xb0, 0x32, 0x24, 0x28, 0x43, 0x44, 0x52,
- 0x27, 0x0a, 0xeb, 0xd9, 0x82, 0x09, 0x4d, 0x8a, 0xce, 0x14, 0x66, 0x28, 0x08, 0x56, 0x01, 0x11,
- 0x8d, 0x51, 0xd2, 0x8e, 0x88, 0x37, 0xf0, 0x81, 0x82, 0x00, 0x89, 0xec, 0x2e, 0xc5, 0xd8, 0x23,
- 0xd8, 0xc5, 0x26, 0x1d, 0x55, 0x2c, 0xbb, 0xe8, 0xb5, 0x23, 0xa1, 0xc3, 0x89, 0x1f, 0x53, 0x04,
- 0x50, 0xa3, 0xa3, 0xe1, 0x8b, 0x4f, 0x38, 0xa2, 0xc5, 0xd8, 0x8c, 0x63, 0x5c, 0x8c, 0x01, 0xaa,
- 0x6a, 0x7c, 0x98, 0x91, 0x4a, 0x46, 0xb3, 0x2e, 0x17, 0xaa, 0xf8, 0xec, 0x39, 0x35, 0xc5, 0x28,
- 0x0c, 0x89, 0x90, 0xf6, 0xd8, 0x79, 0x21, 0x6b, 0x8f, 0x00, 0xa0, 0x28, 0x2c, 0xec, 0xda, 0x90,
- 0x42, 0xd1, 0xae, 0x2b, 0x13, 0xec, 0xe1, 0xba, 0xa0, 0x94, 0xe3, 0xc5, 0x93, 0x5f, 0xfc, 0x32,
- 0xa6, 0xb9, 0x73, 0x30, 0xc5, 0x03, 0xd8, 0x71, 0xf3, 0x86, 0x3a, 0x75, 0x3b, 0xc9, 0xc5, 0x18,
- 0xdc, 0x93, 0xdc, 0xc6, 0x99, 0xef, 0xe0, 0x8f, 0x24, 0x42, 0x0f, 0x30, 0x86, 0xa0, 0x98, 0xd9,
- 0xae, 0x03, 0xf8, 0xf8, 0xf2, 0xc5, 0x47, 0x5a, 0xe5, 0xf0, 0xe3, 0xcb, 0x9f, 0xff, 0xb2, 0x84,
- 0x02, 0x66, 0x58, 0x74, 0x28, 0xf8, 0x31, 0xd0, 0x8f, 0xff, 0xff, 0x03, 0xf1, 0xa7, 0x03, 0x16,
- 0xcc, 0x64, 0xb1, 0x88, 0x54, 0x01, 0xe8, 0x47, 0x10, 0x0a, 0x02, 0xf9, 0xa0, 0x40, 0x12, 0x10,
- 0x46, 0xa8, 0x80, 0x83, 0x0a, 0x30, 0xd8, 0x9f, 0x0e, 0x01, 0x04, 0x04, 0x00, 0x21, 0xf9, 0x04,
- 0x05, 0x04, 0x00, 0x07, 0x00, 0x2c, 0x0b, 0x00, 0x14, 0x00, 0x22, 0x00, 0x2e, 0x00, 0x00, 0x08,
- 0xff, 0x00, 0x0f, 0x08, 0x1c, 0x48, 0xb0, 0x60, 0x41, 0x00, 0x06, 0x13, 0x2a, 0x5c, 0x28, 0x90,
- 0x82, 0x07, 0x86, 0x10, 0x07, 0x02, 0x88, 0x97, 0x21, 0xa2, 0x45, 0x85, 0x0a, 0x2e, 0x6a, 0xdc,
- 0xc8, 0xb1, 0xa3, 0xc7, 0x8f, 0x09, 0x23, 0x3c, 0x04, 0x09, 0x71, 0x04, 0xc3, 0x26, 0xcd, 0xac,
- 0x58, 0x11, 0x46, 0xb2, 0xa0, 0x33, 0x44, 0x2a, 0x5a, 0x08, 0x6c, 0xc1, 0x64, 0x49, 0x30, 0x92,
- 0xc2, 0x9c, 0xc8, 0x74, 0xe1, 0x84, 0x08, 0x41, 0x2e, 0xcd, 0x3e, 0x12, 0xe2, 0x72, 0x80, 0xcb,
- 0x90, 0x2a, 0xc2, 0x96, 0x14, 0x54, 0x31, 0xa4, 0xa3, 0x30, 0xa2, 0x4e, 0x84, 0x15, 0x21, 0x22,
- 0xd3, 0xa0, 0x8a, 0xa0, 0x1b, 0xa3, 0x08, 0x24, 0x54, 0xa8, 0xaa, 0x42, 0x2e, 0x37, 0x2f, 0x36,
- 0xab, 0xea, 0xc2, 0xeb, 0x42, 0xa5, 0x06, 0x2b, 0x4a, 0x14, 0x68, 0xe8, 0x40, 0x94, 0x22, 0x17,
- 0x99, 0x18, 0x1c, 0x11, 0x8f, 0x20, 0x89, 0x03, 0x8b, 0x6a, 0x1c, 0x60, 0xa2, 0xd5, 0x62, 0x0b,
- 0x96, 0x11, 0x09, 0x79, 0xc4, 0x0a, 0x91, 0xf0, 0x46, 0xb8, 0x11, 0xa9, 0x0c, 0xb6, 0xb8, 0xa8,
- 0x07, 0xc7, 0xbf, 0x17, 0xfb, 0x6a, 0xf4, 0x79, 0xd1, 0x19, 0xc7, 0xa6, 0x2d, 0x17, 0x2e, 0xca,
- 0x9c, 0x50, 0xaf, 0x47, 0xcf, 0x9c, 0x43, 0x6b, 0x44, 0x24, 0xda, 0x20, 0xe2, 0xd2, 0x03, 0xf3,
- 0x2a, 0x6c, 0x92, 0x59, 0x32, 0x41, 0x60, 0xa1, 0x5d, 0x2c, 0x45, 0x5d, 0xa4, 0x36, 0xea, 0xdb,
- 0x10, 0xbf, 0x84, 0x9e, 0x73, 0xc0, 0x4d, 0xef, 0xde, 0xbc, 0x39, 0xef, 0x31, 0x98, 0x27, 0xf4,
- 0x11, 0x34, 0xc8, 0x93, 0xef, 0x10, 0x2d, 0x86, 0x60, 0x18, 0xd4, 0x7c, 0xba, 0x74, 0x09, 0x82,
- 0xbb, 0xba, 0xf5, 0xeb, 0x9c, 0x4d, 0x1c, 0xc0, 0x32, 0x10, 0x57, 0xc1, 0x3e, 0x7d, 0x0a, 0x7a,
- 0x14, 0x17, 0x88, 0xe5, 0x8f, 0x76, 0x83, 0x3f, 0x14, 0x26, 0x19, 0xe8, 0xc5, 0xcb, 0xc0, 0xf5,
- 0x06, 0xfb, 0xa4, 0x0f, 0x08, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x1f, 0x00, 0x2c, 0x0a,
- 0x00, 0x14, 0x00, 0x23, 0x00, 0x2e, 0x00, 0x00, 0x08, 0xff, 0x00, 0x3f, 0x08, 0x1c, 0x48, 0xb0,
- 0x60, 0xc1, 0x0c, 0x24, 0x0c, 0x2a, 0x5c, 0x48, 0x70, 0xc4, 0x08, 0x83, 0x0c, 0x18, 0x4a, 0x54,
- 0x18, 0x71, 0xa2, 0xc5, 0x8b, 0x17, 0x3d, 0x60, 0xdc, 0x78, 0x90, 0xa3, 0xc7, 0x8b, 0x0f, 0x3f,
- 0x62, 0x04, 0x00, 0xe1, 0x9d, 0xc8, 0x93, 0x04, 0x01, 0x34, 0x3b, 0x14, 0x85, 0x08, 0xa2, 0x43,
- 0xce, 0x82, 0x9d, 0x04, 0x41, 0xd0, 0x19, 0x93, 0x16, 0x2d, 0x08, 0xb6, 0x58, 0xb1, 0x64, 0x11,
- 0x4a, 0x00, 0x87, 0x72, 0x72, 0x51, 0x52, 0x44, 0x90, 0x4e, 0x44, 0xc2, 0x4e, 0x3e, 0x69, 0xe1,
- 0x42, 0x50, 0x15, 0x2b, 0x82, 0x9c, 0x14, 0x6c, 0xc1, 0xa4, 0xc9, 0x47, 0x63, 0x4c, 0xa5, 0x50,
- 0x71, 0x92, 0x53, 0x61, 0x8b, 0x28, 0x1e, 0x09, 0xf5, 0xf8, 0xe0, 0x62, 0x08, 0x97, 0x89, 0x2d,
- 0x9c, 0x71, 0x1c, 0xf6, 0x81, 0x0b, 0xd7, 0x8b, 0x88, 0x14, 0x66, 0x28, 0x18, 0xe0, 0x43, 0xb0,
- 0x1a, 0x1f, 0x04, 0x0d, 0xc1, 0xa8, 0x22, 0x29, 0xc1, 0x01, 0xf1, 0x08, 0x7a, 0xa8, 0xdb, 0x2c,
- 0xa7, 0x0b, 0x17, 0x1b, 0xd5, 0x5e, 0x54, 0xcc, 0xb1, 0xc5, 0x12, 0x8c, 0x8c, 0x39, 0x3e, 0xbe,
- 0x58, 0xe4, 0x63, 0x5a, 0x8c, 0xc2, 0xba, 0x6e, 0x54, 0x41, 0x68, 0x23, 0x30, 0x8f, 0x5c, 0x00,
- 0x6c, 0xdc, 0x2b, 0x99, 0x23, 0x00, 0x22, 0x1c, 0x65, 0x72, 0xec, 0x8c, 0x12, 0x23, 0x62, 0x89,
- 0x3d, 0x2a, 0x9f, 0x9c, 0xdc, 0x7a, 0x22, 0xea, 0x85, 0x4c, 0x7c, 0xb6, 0x8e, 0x5c, 0x90, 0x36,
- 0xca, 0x60, 0xaf, 0xa7, 0xfa, 0xad, 0x1d, 0xd7, 0x20, 0x94, 0xda, 0x03, 0x65, 0x23, 0xdf, 0x38,
- 0x7c, 0xb9, 0x73, 0x86, 0x91, 0xba, 0x48, 0x9f, 0xfe, 0xbc, 0x84, 0x9b, 0x36, 0xd8, 0xb3, 0xb7,
- 0x11, 0xbd, 0xfc, 0x8e, 0x41, 0x3a, 0xcf, 0xc1, 0xa8, 0x4c, 0x19, 0x4f, 0xfe, 0xcb, 0x73, 0x13,
- 0x78, 0x08, 0xda, 0xf9, 0xf3, 0xfc, 0x43, 0x89, 0x17, 0x7b, 0xf6, 0xec, 0x30, 0xd1, 0xbe, 0xbe,
- 0xfd, 0xfb, 0xf8, 0x17, 0x02, 0xc8, 0x22, 0x50, 0xc7, 0x8f, 0x0f, 0x7e, 0x0c, 0xd4, 0x47, 0x1f,
- 0x02, 0x0d, 0x38, 0x50, 0x80, 0x3f, 0xe8, 0x20, 0x50, 0x16, 0xdc, 0x11, 0xb4, 0x48, 0x80, 0x27,
- 0x0c, 0xe4, 0xc3, 0x07, 0x49, 0x08, 0xe4, 0x85, 0x17, 0x16, 0x62, 0x48, 0xe1, 0x07, 0x13, 0x0a,
- 0x14, 0xa1, 0x1f, 0x8b, 0x04, 0x04, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x07, 0x00, 0x0c, 0x00, 0x2c,
- 0x09, 0x00, 0x13, 0x00, 0x24, 0x00, 0x2f, 0x00, 0x00, 0x08, 0xff, 0x00, 0x19, 0x08, 0x1c, 0x48,
- 0xb0, 0xa0, 0x41, 0x06, 0x11, 0x0e, 0x2a, 0x5c, 0x28, 0x10, 0xc4, 0xc1, 0x08, 0x1e, 0x18, 0x4a,
- 0x2c, 0x08, 0xc1, 0xe1, 0xc4, 0x8b, 0x18, 0x19, 0x52, 0xc8, 0xc8, 0x91, 0xe0, 0xba, 0x0c, 0x1d,
- 0x43, 0x8a, 0x1c, 0xa9, 0xd0, 0x03, 0x09, 0x92, 0x17, 0x37, 0x4a, 0x5c, 0x56, 0x44, 0x8a, 0x33,
- 0x42, 0x00, 0x50, 0x82, 0x1c, 0x18, 0x6c, 0x09, 0x97, 0x16, 0x38, 0x71, 0xae, 0x38, 0x24, 0x6c,
- 0xa4, 0x4a, 0x06, 0xcd, 0x6e, 0x32, 0x70, 0x41, 0x84, 0xc9, 0xc0, 0x16, 0x35, 0x96, 0xa0, 0x74,
- 0xe6, 0x82, 0x01, 0x93, 0x21, 0x55, 0xaa, 0x28, 0x25, 0xd8, 0xe2, 0xd0, 0x48, 0x67, 0x2a, 0x18,
- 0x18, 0xaa, 0x52, 0xc4, 0x09, 0x4e, 0x83, 0x55, 0x43, 0x36, 0x59, 0xc1, 0x80, 0x4b, 0x95, 0x27,
- 0x2d, 0x18, 0xaa, 0x68, 0xd6, 0xf1, 0x50, 0x5a, 0x15, 0x4c, 0xd2, 0x4a, 0x44, 0xc4, 0xb1, 0x49,
- 0x0d, 0x06, 0x4a, 0x0a, 0x61, 0x6c, 0xb1, 0xcc, 0xe0, 0xcc, 0x81, 0x01, 0x04, 0x3a, 0x4b, 0xab,
- 0x24, 0xca, 0xde, 0xa9, 0x03, 0x23, 0xc4, 0x23, 0xf8, 0x6e, 0xa6, 0x55, 0x06, 0x5f, 0x31, 0x3e,
- 0xbe, 0x38, 0x4c, 0xa4, 0xa1, 0x8c, 0x93, 0x39, 0x56, 0xc6, 0x28, 0x48, 0x64, 0x66, 0x89, 0x6c,
- 0x3b, 0xb6, 0x70, 0x96, 0x71, 0x11, 0x97, 0x8e, 0x35, 0x82, 0x71, 0xec, 0xcc, 0xf1, 0xf3, 0xc4,
- 0x45, 0x46, 0x31, 0x9e, 0x46, 0x29, 0x71, 0x05, 0x21, 0xda, 0x0c, 0x5d, 0x84, 0xc6, 0xad, 0xd0,
- 0x18, 0x6d, 0x00, 0xb1, 0x0f, 0xce, 0xa6, 0x8d, 0xd8, 0x20, 0x6b, 0xda, 0xc2, 0xb2, 0x1e, 0xbc,
- 0xcd, 0x1b, 0xca, 0xc1, 0x15, 0x31, 0x79, 0x93, 0x36, 0x38, 0x84, 0x37, 0x41, 0x2b, 0xd8, 0xb1,
- 0x5b, 0xdf, 0x3e, 0xb1, 0x04, 0x83, 0x48, 0xe0, 0xc3, 0x33, 0x58, 0xf0, 0xce, 0x1b, 0x0b, 0x9b,
- 0xf3, 0xe8, 0xcf, 0x63, 0xd9, 0x0e, 0x27, 0xfd, 0x79, 0x37, 0xd1, 0x79, 0x8f, 0x59, 0x43, 0xbf,
- 0xbe, 0x18, 0xee, 0x3a, 0xe2, 0x10, 0x7c, 0x83, 0x8b, 0x3b, 0x03, 0x2c, 0x5d, 0xcc, 0x21, 0x47,
- 0x17, 0x3a, 0xf8, 0x67, 0xe0, 0x81, 0x08, 0x26, 0xa8, 0x90, 0x77, 0xcc, 0x0c, 0xd4, 0x9f, 0x40,
- 0x7d, 0x18, 0x14, 0xa1, 0x40, 0x0f, 0x32, 0xd0, 0x20, 0x79, 0x05, 0x35, 0x28, 0x04, 0x03, 0x40,
- 0xa0, 0x50, 0x90, 0x17, 0x02, 0xf1, 0x21, 0x22, 0x03, 0x20, 0x12, 0x84, 0x02, 0x10, 0x0c, 0x6c,
- 0xc8, 0x4c, 0x40, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x1d, 0x00, 0x2c, 0x08, 0x00, 0x12,
- 0x00, 0x26, 0x00, 0x30, 0x00, 0x00, 0x08, 0xff, 0x00, 0x3b, 0x08, 0x1c, 0x48, 0xb0, 0xa0, 0x41,
- 0x81, 0x00, 0x0e, 0x2a, 0x5c, 0x38, 0x30, 0x03, 0x85, 0x83, 0x0c, 0x3c, 0x30, 0x9c, 0x68, 0x70,
- 0x84, 0x44, 0x83, 0x0c, 0x28, 0x6a, 0xdc, 0xc8, 0xb1, 0xa3, 0x46, 0x10, 0x03, 0x3c, 0x16, 0x44,
- 0xb0, 0xf1, 0xa1, 0xc8, 0x93, 0x13, 0x23, 0x64, 0x40, 0xd9, 0x11, 0x81, 0x3c, 0x96, 0x1d, 0x33,
- 0x2e, 0x5c, 0xe4, 0xec, 0x10, 0x22, 0x22, 0x88, 0x86, 0x39, 0x6b, 0x02, 0x13, 0x43, 0x00, 0x82,
- 0x4b, 0xb8, 0xb4, 0x28, 0xd8, 0xa2, 0xc6, 0xa1, 0x60, 0x07, 0x11, 0x44, 0x98, 0xc8, 0xe0, 0x67,
- 0x87, 0x26, 0x51, 0x86, 0x72, 0x29, 0x24, 0x45, 0x09, 0xc1, 0x16, 0x4c, 0x08, 0x19, 0x34, 0xa9,
- 0xb1, 0x09, 0x91, 0x16, 0x2e, 0x04, 0x4d, 0x21, 0xb4, 0x24, 0x8a, 0xc1, 0x15, 0x5a, 0x51, 0x46,
- 0x5d, 0x61, 0x85, 0x4a, 0xd4, 0x85, 0x4c, 0x90, 0x8a, 0x1c, 0x32, 0x94, 0x88, 0x15, 0x2e, 0x13,
- 0x5b, 0x1c, 0x12, 0xb9, 0x08, 0xef, 0x0a, 0x17, 0x43, 0x29, 0xf6, 0x10, 0xe6, 0xd1, 0xd9, 0x50,
- 0x2b, 0x1d, 0x97, 0x1c, 0x5c, 0x49, 0xd0, 0x69, 0x87, 0xbd, 0x1d, 0x0c, 0xad, 0xe0, 0x68, 0xc8,
- 0x20, 0x80, 0x77, 0x04, 0xdf, 0x01, 0x70, 0x8a, 0xe8, 0x24, 0x30, 0x8f, 0x89, 0x4e, 0x42, 0xf1,
- 0xd8, 0x59, 0xe4, 0xe7, 0x8e, 0xc3, 0x4e, 0x56, 0xee, 0xe8, 0xec, 0xa4, 0xe2, 0x8e, 0x4d, 0x6a,
- 0x78, 0x74, 0x41, 0xd8, 0x23, 0x64, 0x98, 0x1a, 0xe5, 0x72, 0xe4, 0x89, 0xbb, 0xb7, 0xe0, 0x89,
- 0x3d, 0x7c, 0x1b, 0xf3, 0x4d, 0xb1, 0x2f, 0x43, 0xdd, 0xb8, 0x05, 0x2d, 0xbc, 0xdd, 0x3b, 0xed,
- 0xc1, 0x66, 0xc4, 0x3b, 0x2c, 0x92, 0x6d, 0xb0, 0x06, 0x72, 0xdf, 0xc1, 0x0b, 0x32, 0x8a, 0xce,
- 0xbd, 0x3b, 0xcb, 0x3f, 0x5f, 0x0e, 0x66, 0x60, 0xe1, 0xde, 0x47, 0xa1, 0x1f, 0xee, 0x25, 0xda,
- 0x18, 0x64, 0xf3, 0xa7, 0x7b, 0x18, 0x36, 0xf0, 0xe3, 0xeb, 0xf1, 0xde, 0x67, 0x0d, 0x41, 0x35,
- 0x27, 0xbc, 0x77, 0xe8, 0x13, 0x26, 0x4d, 0x9a, 0x3d, 0x42, 0xe8, 0x37, 0x10, 0x00, 0x09, 0x09,
- 0x68, 0xe0, 0x81, 0x08, 0x0a, 0x64, 0xc2, 0x1f, 0x58, 0xe8, 0xf0, 0x03, 0x2e, 0xe7, 0xed, 0xa7,
- 0x50, 0x79, 0x1d, 0xf8, 0x81, 0xcb, 0x0f, 0x3a, 0x60, 0xf1, 0x87, 0x09, 0x0b, 0xe9, 0x40, 0xa1,
- 0x40, 0x3e, 0x74, 0x90, 0x44, 0x07, 0x5e, 0x74, 0xc0, 0x07, 0x1f, 0x03, 0xa1, 0x58, 0xe2, 0x88,
- 0x21, 0x0e, 0xd4, 0x87, 0x0e, 0x1d, 0x04, 0x04, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x24,
- 0x00, 0x2c, 0x08, 0x00, 0x11, 0x00, 0x26, 0x00, 0x31, 0x00, 0x00, 0x08, 0xff, 0x00, 0x49, 0x08,
- 0x1c, 0x48, 0xb0, 0xa0, 0xc1, 0x83, 0x08, 0x13, 0x1a, 0xcc, 0x80, 0x90, 0x02, 0x04, 0x85, 0x10,
- 0x0d, 0xbe, 0x1b, 0x10, 0xb1, 0xa2, 0xc5, 0x8b, 0x18, 0x33, 0x16, 0x64, 0xa0, 0x51, 0x23, 0x82,
- 0x0d, 0x1d, 0x43, 0x86, 0x04, 0x00, 0x40, 0x24, 0x41, 0x10, 0x18, 0x4c, 0x5a, 0xcc, 0x90, 0x52,
- 0xa5, 0x4b, 0x12, 0xc2, 0x96, 0x44, 0x81, 0xd2, 0xa2, 0x06, 0x22, 0x41, 0xcb, 0x44, 0x7a, 0x28,
- 0x39, 0x70, 0xca, 0xa1, 0x1e, 0x07, 0x5b, 0xfc, 0x12, 0x76, 0x50, 0x81, 0x02, 0x85, 0x01, 0x02,
- 0x0c, 0x14, 0x46, 0x44, 0x20, 0x91, 0x25, 0x56, 0x04, 0x15, 0x5c, 0xd1, 0xec, 0x20, 0xcf, 0x88,
- 0xc2, 0xb8, 0x90, 0x58, 0x31, 0x84, 0x84, 0x15, 0x25, 0x4e, 0x0c, 0xf6, 0xa8, 0xda, 0x71, 0x51,
- 0x53, 0x2e, 0x84, 0x08, 0x35, 0x4d, 0xb8, 0x82, 0xa8, 0x46, 0x63, 0x03, 0xa5, 0xb8, 0x88, 0x38,
- 0x4c, 0x63, 0x93, 0x1a, 0x24, 0x98, 0xac, 0xb0, 0xa8, 0x22, 0x67, 0x47, 0x42, 0x4f, 0x2e, 0x4a,
- 0x2d, 0x78, 0x55, 0xa0, 0xd2, 0x81, 0x75, 0x49, 0x38, 0x99, 0x6b, 0x31, 0x8a, 0xc1, 0x0d, 0xf1,
- 0x06, 0x7a, 0x48, 0x3a, 0x10, 0x58, 0x47, 0x28, 0x19, 0x31, 0x6b, 0x84, 0x91, 0xd1, 0xb2, 0xc6,
- 0x44, 0x2f, 0x43, 0x13, 0xec, 0x2a, 0x5a, 0x21, 0x50, 0x8c, 0xa7, 0x4b, 0xab, 0x5e, 0xcd, 0xba,
- 0xb4, 0x8a, 0x97, 0x83, 0x5b, 0xcb, 0x4e, 0x08, 0x77, 0xf6, 0xc0, 0x16, 0xb6, 0x4d, 0xaf, 0x7e,
- 0x9d, 0xbb, 0xb7, 0x6f, 0x81, 0x5f, 0x82, 0x0b, 0xff, 0xdd, 0xa7, 0xb4, 0x09, 0x36, 0x07, 0xb1,
- 0xa8, 0xde, 0x63, 0x30, 0xcf, 0x6a, 0x21, 0x6a, 0x08, 0xa6, 0x01, 0xd2, 0x7a, 0xcf, 0x19, 0x33,
- 0x7a, 0x4e, 0xfc, 0xde, 0xce, 0xbd, 0x7b, 0xc7, 0xe2, 0xa2, 0x7f, 0x28, 0x08, 0xe4, 0x63, 0x90,
- 0x7c, 0x42, 0xf1, 0x01, 0x01, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00, 0x26, 0x00, 0x2c, 0x07,
- 0x00, 0x11, 0x00, 0x28, 0x00, 0x14, 0x00, 0x00, 0x08, 0x67, 0x00, 0x4d, 0x08, 0x1c, 0x48, 0xb0,
- 0xa0, 0x41, 0x81, 0x14, 0x1e, 0x1c, 0x5c, 0xc8, 0x90, 0xe0, 0x88, 0x0d, 0x0b, 0x19, 0x78, 0x68,
- 0x48, 0xf1, 0x20, 0x80, 0x8a, 0x18, 0x33, 0x6a, 0xdc, 0xc8, 0xb1, 0x21, 0x80, 0x77, 0x14, 0x3a,
- 0x56, 0x8c, 0x70, 0x50, 0xa1, 0xc8, 0x81, 0x24, 0x42, 0x9e, 0x34, 0xa8, 0x72, 0x61, 0x80, 0x00,
- 0x2b, 0x0b, 0x52, 0x90, 0x17, 0xb3, 0xa6, 0x4d, 0x8d, 0x19, 0x6e, 0x9a, 0x60, 0x40, 0x71, 0x00,
- 0x00, 0x98, 0x36, 0xdf, 0x5d, 0xd4, 0x49, 0xb4, 0xa8, 0xd1, 0xa3, 0x48, 0x93, 0x2a, 0x2d, 0x98,
- 0x53, 0xe0, 0x4f, 0xa4, 0x24, 0x22, 0x44, 0x88, 0x37, 0xf0, 0x01, 0x50, 0xa3, 0x14, 0x32, 0x04,
- 0x04, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x06, 0x00, 0x24, 0x00, 0x2c, 0x07, 0x00, 0x10, 0x00, 0x28,
- 0x00, 0x15, 0x00, 0x00, 0x06, 0x54, 0x40, 0x92, 0x70, 0x48, 0x2c, 0x1a, 0x85, 0x94, 0xc7, 0x71,
- 0xc9, 0x24, 0x62, 0x28, 0x4b, 0x86, 0xa7, 0x49, 0x3d, 0x22, 0x94, 0xd5, 0xac, 0x76, 0xcb, 0xed,
- 0x32, 0x47, 0x13, 0x2f, 0x95, 0x02, 0x59, 0x0e, 0xc4, 0xc3, 0x47, 0xa0, 0x18, 0x58, 0xa3, 0x9b,
- 0xed, 0x77, 0x71, 0xc2, 0x90, 0x73, 0x41, 0xf6, 0xbc, 0x9e, 0xfa, 0xa0, 0xb8, 0xf3, 0x03, 0x78,
- 0x4c, 0x71, 0x7b, 0x67, 0x7b, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x44, 0x00, 0x43, 0x00,
- 0x7f, 0x8a, 0x08, 0x08, 0x43, 0x08, 0x93, 0x89, 0x0c, 0x41, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04,
- 0x00, 0x25, 0x00, 0x2c, 0x07, 0x00, 0x0f, 0x00, 0x29, 0x00, 0x16, 0x00, 0x00, 0x08, 0x67, 0x00,
- 0x4b, 0x08, 0x1c, 0x48, 0xb0, 0xa0, 0x41, 0x81, 0x14, 0x36, 0x1c, 0x5c, 0xc8, 0x90, 0x60, 0x86,
- 0x11, 0x0c, 0x19, 0x78, 0x68, 0x48, 0xf1, 0x60, 0x86, 0x75, 0x15, 0x33, 0x6a, 0xdc, 0xc8, 0xb1,
- 0xa3, 0x46, 0x04, 0x00, 0x3c, 0x8a, 0x14, 0x38, 0x71, 0xa4, 0xc0, 0x01, 0x06, 0x01, 0x40, 0x34,
- 0xc9, 0x30, 0x40, 0x00, 0x96, 0x30, 0x1b, 0xca, 0xab, 0x18, 0xe1, 0x41, 0x4c, 0x8e, 0x24, 0x6e,
- 0x8a, 0xa4, 0xa0, 0x33, 0x23, 0x05, 0x97, 0x3d, 0x4b, 0xbc, 0x5b, 0x19, 0x94, 0x21, 0xd1, 0xa2,
- 0x48, 0x93, 0x2a, 0x5d, 0xca, 0xb4, 0x69, 0x4c, 0x00, 0x2f, 0x97, 0x3e, 0x48, 0x28, 0x90, 0x44,
- 0x54, 0xa5, 0x03, 0x00, 0x04, 0x04, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x26, 0x00, 0x2c,
- 0x09, 0x00, 0x0e, 0x00, 0x28, 0x00, 0x17, 0x00, 0x00, 0x06, 0x57, 0x40, 0x93, 0x70, 0x48, 0x2c,
- 0x1a, 0x29, 0x0a, 0xa3, 0x72, 0xc9, 0x5c, 0x32, 0x3c, 0xcd, 0xa8, 0x11, 0x81, 0x90, 0x5a, 0xad,
- 0x94, 0xab, 0x76, 0xab, 0xa5, 0x44, 0xb8, 0xe0, 0x21, 0x04, 0x14, 0x36, 0x3d, 0x94, 0x19, 0x52,
- 0xb9, 0x09, 0x08, 0x18, 0x03, 0xee, 0xb5, 0x7c, 0x1e, 0x3e, 0x37, 0x11, 0x10, 0xba, 0x30, 0x6e,
- 0x05, 0xe8, 0xad, 0x08, 0x14, 0x7c, 0x7f, 0x26, 0x0d, 0x7e, 0x45, 0x83, 0x84, 0x10, 0x19, 0x84,
- 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x42, 0x6d, 0x95, 0x1b, 0x26, 0x08, 0x89, 0x90,
- 0x5f, 0x41, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x26, 0x00, 0x2c, 0x08, 0x00, 0x0d, 0x00,
- 0x29, 0x00, 0x18, 0x00, 0x00, 0x08, 0x6e, 0x00, 0x4d, 0x08, 0x1c, 0x48, 0xb0, 0xa0, 0x41, 0x13,
- 0x19, 0x48, 0x1c, 0x5c, 0xc8, 0xb0, 0x61, 0x41, 0x06, 0x1e, 0x1c, 0x4a, 0x2c, 0x08, 0x02, 0xc0,
- 0xc4, 0x8b, 0x12, 0x37, 0x60, 0xdc, 0xc8, 0xf1, 0x22, 0x83, 0x8e, 0x20, 0x05, 0x32, 0x90, 0x67,
- 0x11, 0x24, 0x85, 0x83, 0x09, 0x19, 0x2a, 0x04, 0x19, 0x20, 0xc0, 0xc1, 0x96, 0x21, 0x1d, 0xba,
- 0x8c, 0x49, 0x53, 0xe2, 0xca, 0x86, 0x25, 0x6b, 0x0a, 0xa4, 0x90, 0xc1, 0xa1, 0x46, 0x9d, 0x1d,
- 0x23, 0xcc, 0x04, 0xea, 0x10, 0x00, 0x4c, 0xa2, 0x04, 0x49, 0xbc, 0x43, 0x3a, 0xf1, 0x23, 0xd3,
- 0xa7, 0x50, 0xa3, 0x4a, 0x9d, 0x4a, 0xb5, 0xaa, 0xd5, 0xa1, 0x54, 0x1f, 0x20, 0x78, 0x80, 0x75,
- 0xea, 0x00, 0x06, 0x01, 0x01, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x07, 0x00, 0x24, 0x00, 0x2c, 0x07,
- 0x00, 0x0c, 0x00, 0x2b, 0x00, 0x19, 0x00, 0x00, 0x08, 0x69, 0x00, 0x49, 0x08, 0x1c, 0x48, 0xb0,
- 0xa0, 0xc1, 0x81, 0x0c, 0x0e, 0x2a, 0x5c, 0xc8, 0xf0, 0x20, 0x03, 0x0f, 0x0d, 0x23, 0x4a, 0x9c,
- 0x48, 0x51, 0x21, 0x84, 0x8a, 0x18, 0x33, 0x6a, 0xdc, 0x88, 0x11, 0xc3, 0x04, 0x8e, 0x08, 0x14,
- 0x02, 0x18, 0xc1, 0x30, 0xc3, 0xc6, 0x00, 0x28, 0x0f, 0xa6, 0xe4, 0xc8, 0xb2, 0xa5, 0xcb, 0x97,
- 0x1a, 0x33, 0x7c, 0x84, 0x39, 0x71, 0xa5, 0x44, 0x0a, 0x34, 0x27, 0x82, 0x18, 0x10, 0x20, 0x67,
- 0xc1, 0x0c, 0x24, 0x0b, 0xf6, 0xf4, 0x49, 0x50, 0x5e, 0x48, 0xa2, 0x48, 0x33, 0x36, 0x48, 0xca,
- 0xd0, 0x26, 0xd3, 0xa7, 0x50, 0xa3, 0x4a, 0x9d, 0x2a, 0x94, 0xea, 0x83, 0x8f, 0x03, 0xa8, 0x0e,
- 0xa0, 0x10, 0x10, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x25, 0x00, 0x2c, 0x07, 0x00, 0x0c,
- 0x00, 0x2c, 0x00, 0x19, 0x00, 0x00, 0x06, 0x56, 0xc0, 0x92, 0x70, 0x48, 0x2c, 0x1a, 0x85, 0x14,
- 0xcc, 0x71, 0xc9, 0x6c, 0x3a, 0x9f, 0xd0, 0xa8, 0x74, 0x3a, 0x04, 0x78, 0xa8, 0xd8, 0xac, 0x33,
- 0xb3, 0xd1, 0x0a, 0x01, 0xcb, 0x40, 0xa4, 0xa9, 0xf0, 0x02, 0x02, 0x61, 0xb4, 0x77, 0xcd, 0x6e,
- 0xbb, 0xd7, 0x01, 0xd2, 0xf8, 0x1d, 0x0d, 0xa8, 0xe9, 0x78, 0xe1, 0xe6, 0x9e, 0x6f, 0x52, 0xf8,
- 0x7d, 0x25, 0x18, 0x65, 0x81, 0x4d, 0x18, 0x19, 0x85, 0x89, 0x53, 0x01, 0x5d, 0x8a, 0x8e, 0x8f,
- 0x90, 0x91, 0x92, 0x93, 0x4d, 0x80, 0x8f, 0x0f, 0x20, 0x76, 0x93, 0x03, 0x14, 0x41, 0x00, 0x21,
- 0xf9, 0x04, 0x05, 0x04, 0x00, 0x1c, 0x00, 0x2c, 0x0a, 0x00, 0x0b, 0x00, 0x2a, 0x00, 0x1a, 0x00,
- 0x00, 0x08, 0x69, 0x00, 0x39, 0x08, 0x1c, 0x48, 0xb0, 0xa0, 0xc1, 0x0c, 0x06, 0x13, 0x2a, 0x5c,
- 0xc8, 0x90, 0x81, 0x07, 0x86, 0x10, 0x23, 0x4a, 0x9c, 0x48, 0xb1, 0xa2, 0xc5, 0x8b, 0x0c, 0x23,
- 0x20, 0xc4, 0xa8, 0x30, 0xc0, 0x46, 0x85, 0xf2, 0x28, 0x58, 0xcc, 0x40, 0x21, 0xc0, 0x42, 0x93,
- 0x1c, 0x4f, 0xa6, 0x5c, 0xc9, 0xb2, 0x65, 0x44, 0x00, 0x1b, 0x5c, 0x52, 0x0c, 0x80, 0x52, 0xa6,
- 0xcd, 0x9b, 0x12, 0x47, 0xe0, 0x54, 0x48, 0x41, 0x24, 0x87, 0x9a, 0x3b, 0x09, 0xca, 0x1b, 0x10,
- 0xb4, 0xe8, 0xc4, 0x8f, 0x46, 0x0b, 0x02, 0x20, 0x9a, 0xb4, 0xa9, 0xd3, 0xa7, 0x50, 0xa3, 0x4a,
- 0x35, 0x1a, 0x81, 0xe0, 0x03, 0x10, 0x4d, 0x91, 0x0e, 0xa0, 0x10, 0x10, 0x00, 0x21, 0xf9, 0x04,
- 0x05, 0x03, 0x00, 0x1d, 0x00, 0x2c, 0x0a, 0x00, 0x0b, 0x00, 0x2b, 0x00, 0x1a, 0x00, 0x00, 0x06,
- 0x54, 0xc0, 0x8e, 0x70, 0x48, 0x2c, 0x1a, 0x19, 0xc6, 0xa4, 0x72, 0xc9, 0x6c, 0x3a, 0x9f, 0xd0,
- 0xa8, 0xd4, 0x48, 0x99, 0x5a, 0x93, 0x01, 0x00, 0x13, 0x04, 0xb2, 0x92, 0x32, 0xcc, 0xc0, 0xb5,
- 0x19, 0x10, 0x8f, 0xcf, 0xe8, 0xb4, 0x75, 0xd4, 0x50, 0x4b, 0xcb, 0xee, 0xb8, 0x7c, 0x6c, 0x9e,
- 0x3b, 0xe1, 0xf6, 0x24, 0xe3, 0x01, 0xce, 0x33, 0x49, 0x7e, 0x81, 0x6f, 0x11, 0x0f, 0x82, 0x58,
- 0x75, 0x86, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8c, 0x01, 0x08, 0x44, 0x0f, 0x6d, 0x86, 0x01,
- 0x48, 0x43, 0x03, 0x14, 0x41, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x07, 0x00, 0x12, 0x00, 0x2c, 0x13,
- 0x00, 0x0d, 0x00, 0x23, 0x00, 0x18, 0x00, 0x00, 0x06, 0x47, 0x40, 0x89, 0x70, 0x48, 0x2c, 0x1a,
- 0x8f, 0xc8, 0xa4, 0x24, 0x90, 0x51, 0x4a, 0x9a, 0xca, 0x40, 0x54, 0x49, 0xda, 0x28, 0x29, 0x52,
- 0xa7, 0x76, 0xcb, 0xed, 0x7a, 0x8f, 0x01, 0xeb, 0xb7, 0x1b, 0xc8, 0x8e, 0xcf, 0xe8, 0xb4, 0x7a,
- 0xcd, 0x06, 0xb0, 0x93, 0x10, 0xf1, 0x7b, 0xee, 0x8c, 0xd0, 0x8d, 0x4c, 0xca, 0x7d, 0xcf, 0xef,
- 0xfb, 0xff, 0x80, 0x81, 0x73, 0x01, 0x18, 0x44, 0x0f, 0x03, 0x74, 0x01, 0x76, 0x43, 0x03, 0x19,
- 0x41, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x1d, 0x00, 0x2c, 0x12, 0x00, 0x0c, 0x00, 0x25,
- 0x00, 0x19, 0x00, 0x00, 0x05, 0x42, 0x60, 0x27, 0x8e, 0x64, 0x69, 0x9e, 0x68, 0x4a, 0x02, 0x91,
- 0xea, 0xbe, 0x63, 0xe0, 0x52, 0x6e, 0x20, 0xc3, 0xe9, 0xf3, 0xde, 0x78, 0xef, 0xbb, 0x03, 0xc4,
- 0x6f, 0x68, 0x1b, 0x1a, 0x8f, 0xc8, 0xa4, 0x72, 0xc9, 0x44, 0x0e, 0x00, 0xcd, 0x94, 0x27, 0x13,
- 0xad, 0xee, 0x18, 0x0a, 0x6b, 0xa9, 0xa8, 0xed, 0x7a, 0xbf, 0xe0, 0xb0, 0x78, 0xdc, 0x0c, 0x60,
- 0x48, 0x0f, 0x5a, 0x35, 0xd0, 0x1a, 0x3d, 0x43, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x0c,
- 0x00, 0x2c, 0x1e, 0x00, 0x0c, 0x00, 0x19, 0x00, 0x19, 0x00, 0x00, 0x06, 0x38, 0x40, 0xca, 0x86,
- 0x41, 0x2c, 0x1a, 0x8f, 0x48, 0x62, 0x20, 0x90, 0x6c, 0x3a, 0x9f, 0xd0, 0xa8, 0x74, 0x1a, 0xf0,
- 0x4c, 0x9d, 0xcb, 0xab, 0x76, 0xcb, 0xed, 0x7a, 0xbf, 0xe0, 0xe7, 0x28, 0x12, 0x66, 0x90, 0xb9,
- 0x81, 0xf3, 0x77, 0x09, 0x28, 0xbb, 0xdf, 0xf0, 0xb8, 0x7c, 0x4e, 0x2f, 0x06, 0x10, 0xc6, 0xe1,
- 0x36, 0x6d, 0x8c, 0x04, 0x01, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00, 0x0e, 0x00, 0x2c, 0x1e,
- 0x00, 0x0b, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0x00, 0x06, 0x39, 0x40, 0x47, 0xc0, 0x41, 0x2c, 0x1a,
- 0x8f, 0xc8, 0x62, 0x60, 0x98, 0x6c, 0x3a, 0x9f, 0xd0, 0xa8, 0x74, 0x5a, 0x04, 0x51, 0x9f, 0x94,
- 0xcc, 0x75, 0xcb, 0xed, 0x7a, 0xbf, 0xe0, 0xb0, 0xf8, 0x39, 0x02, 0x53, 0xc4, 0x01, 0x86, 0x35,
- 0xcc, 0x1c, 0xbb, 0xdf, 0xf0, 0xb8, 0x7c, 0x4e, 0x57, 0xae, 0x1d, 0x8f, 0x32, 0x37, 0x70, 0x26,
- 0x0e, 0x32, 0x41, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x06, 0x00, 0x0f, 0x00, 0x2c, 0x2a, 0x00, 0x0e,
- 0x00, 0x0e, 0x00, 0x17, 0x00, 0x00, 0x06, 0x29, 0xc0, 0x87, 0x70, 0x48, 0x24, 0x46, 0x36, 0xc5,
- 0xe4, 0x23, 0x10, 0x50, 0x3a, 0x9f, 0xd0, 0xa8, 0x74, 0x4a, 0xad, 0x5a, 0x85, 0x01, 0x92, 0x34,
- 0x00, 0xb8, 0x7a, 0xbf, 0xe0, 0xb0, 0x58, 0x1c, 0x18, 0x0c, 0x15, 0xce, 0x40, 0x66, 0x18, 0x09,
- 0x02, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00, 0x0c, 0x00, 0x2c, 0x2a, 0x00, 0x0e, 0x00, 0x0e,
- 0x00, 0x17, 0x00, 0x00, 0x05, 0x22, 0x20, 0x13, 0x30, 0x64, 0x69, 0x92, 0xc1, 0x78, 0xae, 0x6c,
- 0xeb, 0xbe, 0x70, 0x2c, 0xcf, 0x74, 0x7d, 0x06, 0x58, 0xac, 0xda, 0x7c, 0xef, 0xff, 0xc0, 0x5f,
- 0x20, 0x42, 0xda, 0xb8, 0x02, 0x99, 0x52, 0x08, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x08,
- 0x00, 0x2c, 0x33, 0x00, 0x17, 0x00, 0x05, 0x00, 0x0e, 0x00, 0x00, 0x05, 0x11, 0x60, 0x84, 0x8c,
- 0x08, 0x43, 0x9e, 0x68, 0xaa, 0xae, 0x6c, 0x4b, 0x06, 0xe2, 0x18, 0x64, 0x63, 0x08, 0x00, 0x21,
- 0xf9, 0x04, 0x05, 0x03, 0x00, 0x10, 0x00, 0x2c, 0x33, 0x00, 0x17, 0x00, 0x04, 0x00, 0x0e, 0x00,
- 0x00, 0x06, 0x12, 0xc0, 0x40, 0x00, 0x02, 0x11, 0x12, 0x8f, 0xc8, 0xa4, 0x72, 0xc9, 0x6c, 0x06,
- 0x48, 0xc4, 0x00, 0x25, 0x08, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x07, 0x00, 0x0b, 0x00, 0x2c, 0x36,
- 0x00, 0x23, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x05, 0x05, 0x60, 0xb6, 0x04, 0x4b, 0x08, 0x00,
- 0x21, 0xf9, 0x04, 0x05, 0xed, 0x00, 0x03, 0x00, 0x2c, 0x36, 0x00, 0x23, 0x00, 0x02, 0x00, 0x02,
- 0x00, 0x00, 0x02, 0x03, 0x4c, 0x16, 0x05, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00,
- 0x2c, 0x13, 0x00, 0x1a, 0x00, 0x16, 0x00, 0x23, 0x00, 0x00, 0x08, 0xff, 0x00, 0x07, 0x08, 0x1c,
- 0x48, 0xb0, 0xa0, 0xc1, 0x83, 0x00, 0x9a, 0x1d, 0x4a, 0x54, 0xc3, 0x45, 0xa2, 0x61, 0xce, 0x16,
- 0x1d, 0x1c, 0x18, 0xa0, 0x19, 0xb0, 0x89, 0x5c, 0x9c, 0x4d, 0x0c, 0x60, 0x4c, 0xc5, 0x00, 0x17,
- 0x85, 0xa4, 0x10, 0x8a, 0x42, 0xb0, 0xc5, 0xb0, 0x29, 0x05, 0x03, 0x1c, 0x1a, 0xd0, 0xc2, 0x90,
- 0x30, 0x2a, 0x4b, 0x0a, 0x71, 0x29, 0xd8, 0x22, 0x0a, 0x00, 0x8a, 0x1a, 0x5b, 0x14, 0x9a, 0xa2,
- 0xc4, 0xc5, 0x44, 0x96, 0x2b, 0x05, 0x0a, 0x5b, 0xc1, 0xb2, 0x10, 0xc9, 0x9f, 0x02, 0x7b, 0x10,
- 0x1a, 0xa0, 0xf2, 0xe3, 0x13, 0xa4, 0x25, 0x57, 0x2e, 0xaa, 0x31, 0xc0, 0x10, 0x15, 0xa8, 0x04,
- 0x6b, 0x2c, 0x6a, 0x26, 0x50, 0x05, 0x51, 0xac, 0x02, 0x5b, 0x34, 0xd3, 0x08, 0x96, 0xa6, 0x33,
- 0xb2, 0x65, 0x07, 0xb6, 0x38, 0x9b, 0xb6, 0xa4, 0xb3, 0xa5, 0x6d, 0xc3, 0x12, 0x9a, 0x1a, 0x77,
- 0x00, 0x17, 0x00, 0x4d, 0xdb, 0xb6, 0x08, 0x2a, 0x8c, 0x6a, 0xda, 0x1a, 0xc2, 0x04, 0x06, 0x58,
- 0x92, 0xb6, 0x05, 0x61, 0x8a, 0xc3, 0xc0, 0xee, 0x35, 0x38, 0x05, 0x11, 0x54, 0x93, 0x13, 0x09,
- 0x79, 0xfc, 0x49, 0x44, 0xe2, 0xc1, 0x00, 0xbf, 0x7e, 0xaa, 0xe0, 0xfa, 0x13, 0xad, 0x41, 0xc7,
- 0x48, 0x9b, 0x4c, 0x36, 0xe8, 0xf9, 0xf2, 0x45, 0x83, 0x2a, 0xae, 0x42, 0x6d, 0xf6, 0x55, 0x6d,
- 0x50, 0xac, 0xc1, 0x08, 0xc1, 0x2d, 0x02, 0xb7, 0x6e, 0x5b, 0x1d, 0x62, 0xc6, 0x8c, 0x89, 0x34,
- 0x00, 0x0c, 0x98, 0x17, 0x25, 0xb0, 0x9e, 0x68, 0xd3, 0xc6, 0x20, 0x2e, 0xac, 0x58, 0x0e, 0xb6,
- 0x31, 0x01, 0x16, 0xcf, 0x9a, 0x35, 0x04, 0xc3, 0x94, 0x45, 0x81, 0x86, 0x60, 0x25, 0x21, 0x69,
- 0x81, 0xe4, 0x19, 0x80, 0x66, 0x0f, 0xf6, 0xb8, 0xc1, 0x91, 0x06, 0x01, 0x04, 0x00, 0x21, 0xf9,
- 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x2c, 0x13, 0x00, 0x1a, 0x00, 0x17, 0x00, 0x23, 0x00, 0x00,
- 0x08, 0xff, 0x00, 0x07, 0x08, 0x1c, 0x48, 0xb0, 0xa0, 0xc1, 0x83, 0x03, 0x02, 0x04, 0x20, 0xa4,
- 0x04, 0x11, 0x94, 0x1a, 0x44, 0x86, 0x39, 0x5b, 0x84, 0x70, 0x60, 0x00, 0x2a, 0x51, 0x0e, 0xb6,
- 0xe0, 0xb2, 0xa4, 0x62, 0x00, 0x67, 0x35, 0x5a, 0xb4, 0x70, 0xb2, 0xc4, 0x8a, 0x15, 0x17, 0x03,
- 0x5b, 0x44, 0x09, 0x66, 0x30, 0x00, 0xa3, 0x01, 0x2d, 0x88, 0x58, 0xa9, 0x22, 0x45, 0xc9, 0x13,
- 0x15, 0x04, 0x5b, 0x20, 0x62, 0x69, 0xb1, 0x99, 0x8a, 0x8d, 0x55, 0x86, 0xac, 0xa8, 0xd8, 0x62,
- 0x98, 0xc5, 0x60, 0x5c, 0x60, 0xba, 0x70, 0x52, 0x51, 0x60, 0x0b, 0x15, 0xcd, 0x04, 0x06, 0x58,
- 0x22, 0x52, 0x0a, 0xd3, 0xa6, 0x4e, 0x33, 0x2a, 0x04, 0xf6, 0x74, 0x48, 0x52, 0xac, 0x30, 0x55,
- 0x08, 0x0b, 0x20, 0x0c, 0x66, 0x0b, 0xb0, 0x39, 0x9d, 0x05, 0x88, 0x8a, 0xb6, 0x60, 0x8b, 0x25,
- 0x6b, 0xdb, 0xba, 0x15, 0x14, 0x57, 0x6e, 0x4a, 0xb8, 0xc2, 0x70, 0xda, 0x85, 0xa9, 0x36, 0x00,
- 0x93, 0xbd, 0x4f, 0x9b, 0x24, 0xec, 0x68, 0xb7, 0xc5, 0x2f, 0xa9, 0x48, 0xe5, 0x8a, 0x64, 0x9b,
- 0xd0, 0x99, 0xe2, 0x43, 0x05, 0x03, 0x40, 0x06, 0xab, 0x72, 0x4a, 0xe4, 0xc4, 0x4d, 0x5b, 0x18,
- 0xb2, 0xdc, 0x52, 0x50, 0x66, 0x43, 0x00, 0x2a, 0xe6, 0x45, 0xd8, 0x82, 0x09, 0x4f, 0x84, 0x01,
- 0xa0, 0x20, 0x84, 0x8a, 0x35, 0x80, 0x21, 0x84, 0x44, 0xd0, 0x7a, 0x36, 0xf8, 0x16, 0xed, 0xa2,
- 0x61, 0x7a, 0x07, 0x32, 0x11, 0x8c, 0x36, 0xc0, 0x14, 0x61, 0x84, 0x8a, 0x0c, 0x71, 0xc6, 0x7b,
- 0xaf, 0x71, 0x20, 0x72, 0xf0, 0x84, 0x19, 0x03, 0xe6, 0x08, 0x1f, 0x21, 0x01, 0xd0, 0x7a, 0x61,
- 0x33, 0xa0, 0x4d, 0x41, 0x13, 0x68, 0x51, 0x1c, 0xa4, 0x13, 0x1d, 0xac, 0x09, 0x36, 0x68, 0x2a,
- 0x11, 0x14, 0x8c, 0x24, 0xd7, 0x86, 0x19, 0x82, 0x71, 0xb0, 0xd8, 0xe5, 0x73, 0x67, 0x80, 0x1a,
- 0x31, 0x3a, 0x8c, 0xb7, 0x0d, 0x08, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x07, 0x00, 0x03, 0x00, 0x2c,
- 0x14, 0x00, 0x1a, 0x00, 0x17, 0x00, 0x23, 0x00, 0x00, 0x08, 0xff, 0x00, 0x07, 0x08, 0x1c, 0x48,
- 0xb0, 0xa0, 0xc1, 0x83, 0x02, 0x03, 0x00, 0x68, 0x26, 0xc8, 0x10, 0xa2, 0x28, 0x4a, 0x8a, 0x2c,
- 0x42, 0x38, 0x30, 0x40, 0x00, 0x67, 0x4c, 0x0c, 0xb6, 0xe0, 0xb2, 0x64, 0xe2, 0xc1, 0x00, 0x4d,
- 0xa2, 0x0c, 0x68, 0xe1, 0xc2, 0xd0, 0x12, 0x29, 0x4b, 0x54, 0x08, 0x6c, 0x41, 0x44, 0x98, 0xc1,
- 0x00, 0xc2, 0x98, 0xb4, 0x50, 0x51, 0x48, 0x98, 0xb0, 0x22, 0x4b, 0x52, 0x0e, 0xdc, 0xe8, 0xb2,
- 0xe2, 0x22, 0x22, 0x2d, 0x5a, 0x44, 0x69, 0xf2, 0xc4, 0x05, 0x42, 0x96, 0x1e, 0x2d, 0x1e, 0x1a,
- 0x99, 0xd1, 0x28, 0xc5, 0xa0, 0x82, 0x12, 0x0a, 0xab, 0x21, 0xb4, 0x27, 0xc5, 0x95, 0x35, 0x82,
- 0x0d, 0x08, 0xb0, 0x24, 0xe8, 0x0a, 0x22, 0x57, 0x77, 0xb6, 0x70, 0x66, 0xd1, 0x57, 0xd8, 0x83,
- 0x2d, 0x86, 0x59, 0x84, 0x72, 0x56, 0x23, 0x22, 0x85, 0x2c, 0xda, 0x16, 0x6c, 0x91, 0xc8, 0x62,
- 0x0d, 0xb9, 0x04, 0x5b, 0x00, 0xb3, 0x88, 0x08, 0xef, 0x4e, 0x43, 0x5b, 0x97, 0xfa, 0x0d, 0xba,
- 0x64, 0x2b, 0x21, 0x95, 0x78, 0x67, 0xba, 0xb4, 0x28, 0x32, 0xf1, 0xb0, 0x8a, 0x84, 0x9c, 0x9e,
- 0xe5, 0x49, 0x30, 0x80, 0xe0, 0xb0, 0x24, 0x9b, 0x15, 0x84, 0xd9, 0x03, 0xf3, 0x0a, 0xcd, 0x2f,
- 0x1b, 0x1f, 0x6d, 0x89, 0x30, 0x40, 0xd4, 0xa3, 0x88, 0xb4, 0x52, 0x74, 0x76, 0x94, 0x4b, 0x93,
- 0xb0, 0xac, 0xd1, 0xc6, 0xbe, 0x3a, 0xf5, 0x20, 0x13, 0x00, 0x67, 0x03, 0x34, 0x73, 0xb2, 0x22,
- 0xef, 0xec, 0xdc, 0x00, 0xa8, 0x0c, 0x10, 0x74, 0xe8, 0xf7, 0x55, 0x13, 0x42, 0x4c, 0xf8, 0x25,
- 0x78, 0x84, 0x4d, 0x9b, 0x3b, 0x62, 0x76, 0xf8, 0xd0, 0x11, 0x40, 0xee, 0x8b, 0x01, 0x6c, 0x06,
- 0xb4, 0x19, 0x98, 0xa7, 0xfa, 0xd9, 0x23, 0x02, 0xd7, 0x10, 0x1f, 0x0c, 0x23, 0xd7, 0x8f, 0x99,
- 0x32, 0x68, 0x08, 0xda, 0xc0, 0xfb, 0xa5, 0x0c, 0xc1, 0x3c, 0xb8, 0xf1, 0x1e, 0xa1, 0x33, 0xe0,
- 0xcd, 0x17, 0xe5, 0xcb, 0x07, 0x00, 0xf0, 0x7e, 0x35, 0x20, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03,
- 0x00, 0x03, 0x00, 0x2c, 0x15, 0x00, 0x1b, 0x00, 0x18, 0x00, 0x22, 0x00, 0x00, 0x08, 0xff, 0x00,
- 0x07, 0x08, 0x1c, 0x38, 0x20, 0x40, 0x80, 0x60, 0xcd, 0x96, 0x28, 0x11, 0xe4, 0x8c, 0x0a, 0xc1,
- 0x87, 0x0f, 0x03, 0x08, 0x3b, 0x54, 0xe3, 0xa1, 0x0a, 0x44, 0xce, 0x20, 0x12, 0x34, 0xb8, 0xc4,
- 0x45, 0x8b, 0x16, 0x2b, 0xa2, 0x14, 0x2a, 0xc4, 0x44, 0x60, 0x0b, 0x43, 0x4d, 0x34, 0x06, 0x00,
- 0x30, 0xec, 0x23, 0x13, 0x29, 0x53, 0x84, 0x11, 0x22, 0x24, 0x68, 0x60, 0x0b, 0x22, 0x29, 0x37,
- 0x06, 0x38, 0x34, 0xe0, 0x63, 0x11, 0x29, 0x44, 0x34, 0xf6, 0x44, 0x34, 0x65, 0x63, 0xc6, 0x16,
- 0x4e, 0x98, 0xa8, 0x10, 0x6a, 0xb3, 0xa6, 0xc0, 0x95, 0x4c, 0x3e, 0x52, 0x31, 0xc4, 0xd4, 0xe6,
- 0x8a, 0x9c, 0x01, 0x8a, 0xf4, 0x04, 0x59, 0x95, 0x60, 0x8b, 0x21, 0x4f, 0x79, 0x76, 0x85, 0x78,
- 0xf2, 0x29, 0xa2, 0xb1, 0x64, 0xa1, 0x14, 0x0c, 0x90, 0x08, 0xed, 0xc3, 0x16, 0x2c, 0x00, 0x14,
- 0x04, 0xe6, 0xd6, 0x6b, 0x0d, 0xb9, 0x01, 0xa2, 0xd4, 0xb5, 0x49, 0xb7, 0xa0, 0xd3, 0xbd, 0x2d,
- 0xc4, 0x06, 0x20, 0xb4, 0xb4, 0xee, 0xc7, 0x66, 0x03, 0xf3, 0x02, 0xee, 0xfb, 0x94, 0xb0, 0xdb,
- 0x16, 0x2a, 0x10, 0x6f, 0xd4, 0x3b, 0xf6, 0xa3, 0x58, 0xa3, 0x95, 0x03, 0x0b, 0x25, 0xd4, 0xb5,
- 0x05, 0x97, 0x8c, 0x42, 0x83, 0x55, 0x6d, 0x11, 0x25, 0x67, 0xe8, 0xc2, 0x64, 0x0d, 0x15, 0xad,
- 0x1a, 0x0c, 0xf5, 0x43, 0x26, 0xa2, 0xbb, 0x06, 0xf8, 0xa5, 0x31, 0xb2, 0xdb, 0x60, 0x82, 0x82,
- 0x12, 0xa4, 0x5c, 0x57, 0xe2, 0x80, 0x43, 0x88, 0x0e, 0x99, 0xee, 0xea, 0xe7, 0x85, 0x90, 0xbd,
- 0x0f, 0xc1, 0x0c, 0x60, 0x13, 0x67, 0xc0, 0x91, 0x3e, 0x01, 0xf6, 0x46, 0x12, 0xc8, 0x86, 0x8d,
- 0xc0, 0x39, 0xca, 0xdd, 0x7e, 0xa1, 0x4e, 0x70, 0xba, 0xdb, 0x24, 0x65, 0x06, 0x9c, 0x17, 0x19,
- 0xb8, 0xe6, 0xc4, 0x5e, 0x31, 0x0f, 0xbb, 0x44, 0xaf, 0x0b, 0x60, 0xc7, 0x00, 0x34, 0x74, 0x5e,
- 0xac, 0x47, 0x5e, 0xb0, 0x6e, 0x40, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00, 0x03, 0x00, 0x2c,
- 0x17, 0x00, 0x1b, 0x00, 0x16, 0x00, 0x22, 0x00, 0x00, 0x08, 0xf8, 0x00, 0x07, 0x08, 0x1c, 0x38,
- 0x20, 0x40, 0x93, 0x66, 0xce, 0x86, 0x10, 0x5c, 0xc8, 0x30, 0x40, 0xb3, 0x28, 0x2a, 0x08, 0xb6,
- 0x60, 0xb2, 0x64, 0x11, 0xc3, 0x81, 0xc2, 0xa2, 0x08, 0x6c, 0xb1, 0xc2, 0x49, 0x14, 0x22, 0x2e,
- 0x04, 0x32, 0x69, 0xd6, 0x90, 0x10, 0x97, 0x01, 0x2d, 0x0c, 0x59, 0x99, 0xd2, 0x44, 0xd8, 0x14,
- 0x8d, 0x02, 0x6b, 0x38, 0x5b, 0x28, 0xec, 0xe4, 0x00, 0x2e, 0xc2, 0x04, 0x31, 0x11, 0x18, 0x92,
- 0x60, 0x0d, 0x92, 0x02, 0x01, 0x20, 0x1a, 0xe0, 0xa2, 0x50, 0x8b, 0x88, 0x17, 0x07, 0x32, 0xb1,
- 0x18, 0x60, 0xe6, 0x00, 0x43, 0x84, 0x90, 0x26, 0xdd, 0xb8, 0xa4, 0xe0, 0x50, 0x94, 0x3d, 0xa7,
- 0x2a, 0x1d, 0x20, 0x4c, 0xaa, 0xd6, 0x85, 0x2a, 0x84, 0x59, 0xf9, 0x9a, 0xb4, 0x85, 0x33, 0xa7,
- 0x64, 0x17, 0xb6, 0x18, 0x82, 0x36, 0xed, 0xc0, 0xb5, 0x40, 0xdd, 0xbe, 0x2d, 0xd2, 0xc4, 0xab,
- 0xdb, 0xb0, 0x01, 0xae, 0xca, 0x1d, 0x70, 0xb5, 0x6d, 0x5a, 0xb3, 0x02, 0x03, 0x10, 0x91, 0xdb,
- 0x02, 0x11, 0x80, 0x81, 0x0a, 0xdd, 0xae, 0xa0, 0x42, 0x50, 0x98, 0x5b, 0x2e, 0x71, 0x83, 0xd6,
- 0xf8, 0x5a, 0xd8, 0xf1, 0xc2, 0x00, 0x89, 0xb4, 0xae, 0xf0, 0x3b, 0x30, 0x00, 0x94, 0xa9, 0x5c,
- 0x08, 0x4d, 0xf5, 0x9c, 0xb4, 0x86, 0x68, 0xad, 0x87, 0x2e, 0xb6, 0xa8, 0xfa, 0x15, 0xc0, 0x12,
- 0x27, 0x59, 0x07, 0x30, 0x99, 0x22, 0xb7, 0xc9, 0xcc, 0x44, 0x51, 0x18, 0x7f, 0x3d, 0xf1, 0x05,
- 0x45, 0x89, 0xbd, 0x0b, 0xe1, 0x08, 0xfc, 0x21, 0x57, 0x0c, 0xc3, 0x3b, 0x36, 0xd2, 0x76, 0xb9,
- 0x08, 0x26, 0x6d, 0x10, 0x86, 0x6c, 0xfa, 0xb8, 0x0d, 0xb3, 0xb0, 0x39, 0x70, 0x35, 0xc8, 0x81,
- 0x6b, 0x0f, 0x08, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x2c, 0x16, 0x00, 0x1b,
- 0x00, 0x17, 0x00, 0x22, 0x00, 0x00, 0x08, 0xff, 0x00, 0x07, 0x08, 0x1c, 0x28, 0x50, 0x98, 0x33,
- 0x41, 0x87, 0x0e, 0x49, 0x11, 0x46, 0xb0, 0x61, 0xc3, 0x66, 0x51, 0x54, 0xb4, 0x20, 0xa8, 0xc2,
- 0x49, 0xb3, 0x00, 0x0e, 0x07, 0x06, 0x1b, 0xa6, 0x42, 0x20, 0x93, 0x27, 0x4a, 0x0a, 0x71, 0x99,
- 0xa8, 0xe2, 0xd0, 0x94, 0x8c, 0x4d, 0x88, 0x4c, 0x8c, 0x42, 0x68, 0x0a, 0x21, 0x2b, 0x84, 0xa2,
- 0x4c, 0x14, 0x18, 0x65, 0x51, 0xc3, 0x29, 0x88, 0x26, 0xae, 0x10, 0x26, 0x68, 0xa4, 0xc0, 0x99,
- 0x03, 0x87, 0x61, 0x1c, 0x78, 0x68, 0xa5, 0x0b, 0x89, 0x19, 0x09, 0x3a, 0x1b, 0x2a, 0xac, 0xc6,
- 0x00, 0x26, 0x55, 0x7c, 0x26, 0x1d, 0x08, 0x6c, 0xa8, 0xa0, 0x99, 0x2b, 0x80, 0x4e, 0x15, 0xd8,
- 0x4c, 0x60, 0xce, 0xad, 0x49, 0x05, 0x05, 0x00, 0xe0, 0x14, 0x6c, 0x46, 0x43, 0x01, 0x82, 0x75,
- 0x34, 0xeb, 0x10, 0x51, 0xda, 0xb5, 0x6c, 0x09, 0x46, 0xc1, 0x08, 0x25, 0x6e, 0xc3, 0x43, 0x18,
- 0x0d, 0x69, 0x8d, 0xbb, 0x74, 0x80, 0xb3, 0xbd, 0x66, 0x5d, 0x30, 0x1c, 0xb0, 0x88, 0x8b, 0x5d,
- 0x81, 0x42, 0x07, 0xfe, 0xb5, 0xbb, 0x73, 0xe8, 0x00, 0x00, 0x4c, 0xe2, 0xaa, 0xe8, 0x4b, 0x50,
- 0x10, 0xdb, 0x1e, 0x94, 0x09, 0x36, 0x03, 0xdc, 0x90, 0x08, 0x21, 0xc7, 0x04, 0x85, 0x71, 0x26,
- 0x6a, 0x33, 0x69, 0x93, 0xd1, 0x03, 0xf0, 0x6e, 0x3d, 0x9d, 0x14, 0x11, 0x00, 0xb3, 0x88, 0x32,
- 0xaa, 0x20, 0xc4, 0xb6, 0xc9, 0x21, 0x26, 0x5a, 0xd1, 0x1e, 0x16, 0x56, 0x64, 0x40, 0x94, 0x43,
- 0xc1, 0xd8, 0xfe, 0x38, 0xe2, 0x07, 0xb4, 0xdd, 0x1d, 0x02, 0xe5, 0x0c, 0x78, 0x21, 0xe4, 0x75,
- 0xdc, 0x2f, 0x0e, 0xe3, 0x40, 0x67, 0x0b, 0x26, 0x63, 0xa4, 0xb8, 0x3e, 0x32, 0xa2, 0xb0, 0x2b,
- 0xa6, 0xe1, 0x98, 0xc3, 0x01, 0x5e, 0x0c, 0x09, 0x40, 0x33, 0x47, 0xfc, 0xe1, 0xf3, 0x02, 0x03,
- 0x02, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x07, 0x00, 0x03, 0x00, 0x2c, 0x15, 0x00, 0x1a, 0x00, 0x17,
- 0x00, 0x23, 0x00, 0x00, 0x08, 0xff, 0x00, 0x07, 0x08, 0x1c, 0x48, 0xb0, 0xa0, 0xc1, 0x83, 0x03,
- 0x00, 0x34, 0x3b, 0x84, 0x28, 0x11, 0x13, 0x43, 0x82, 0x08, 0x05, 0x40, 0x48, 0xd0, 0x19, 0x93,
- 0x16, 0x18, 0x09, 0xaa, 0xf8, 0x25, 0x6c, 0xe2, 0xc1, 0x29, 0xc3, 0x30, 0xba, 0x78, 0x32, 0xc4,
- 0xca, 0x10, 0x8c, 0x2d, 0x06, 0xac, 0x70, 0x16, 0xc0, 0xe3, 0xc0, 0x45, 0x51, 0x30, 0x3e, 0x11,
- 0x26, 0x6c, 0x88, 0x92, 0x27, 0x28, 0x05, 0xaa, 0x60, 0xe9, 0x72, 0x40, 0xc8, 0x16, 0x86, 0xaa,
- 0x14, 0x72, 0x91, 0xd1, 0xa0, 0x0b, 0x89, 0x03, 0x9d, 0x65, 0x74, 0xc1, 0xa5, 0x28, 0x42, 0x22,
- 0x2d, 0x05, 0x5e, 0x64, 0x42, 0x85, 0x68, 0x4a, 0x8a, 0x03, 0x54, 0x14, 0x99, 0xd8, 0x0c, 0x23,
- 0x97, 0x42, 0x03, 0xae, 0x62, 0xf5, 0xd9, 0x52, 0x90, 0xd3, 0xb1, 0x03, 0xa1, 0xb4, 0xfc, 0x89,
- 0xb6, 0xa0, 0x8b, 0x26, 0x01, 0x0c, 0x9d, 0x6d, 0xab, 0xa2, 0x23, 0xdb, 0xb6, 0x03, 0xdf, 0x06,
- 0x30, 0x2b, 0x16, 0xaf, 0xda, 0x00, 0x5d, 0xfb, 0xb6, 0x7d, 0xd2, 0x12, 0x40, 0x53, 0xbc, 0x49,
- 0xa3, 0x2e, 0x99, 0x8b, 0x95, 0x08, 0x00, 0x8f, 0x00, 0x10, 0x09, 0xa6, 0xd8, 0xa3, 0x59, 0x54,
- 0x81, 0x55, 0x27, 0x1b, 0x54, 0xb1, 0xe4, 0xf2, 0xc0, 0x43, 0x9a, 0x09, 0xba, 0xe0, 0x69, 0x70,
- 0x99, 0x0a, 0xac, 0x2b, 0x2c, 0xf7, 0x24, 0x98, 0x88, 0xe2, 0x4e, 0xcf, 0x06, 0x87, 0x51, 0x3c,
- 0xb4, 0xda, 0xa0, 0x12, 0x84, 0x35, 0xe0, 0x8e, 0x55, 0x7a, 0x70, 0x58, 0xed, 0x83, 0x82, 0x0e,
- 0x0f, 0xac, 0x41, 0x08, 0xf1, 0x80, 0x60, 0xc5, 0x97, 0x2c, 0xa1, 0xf2, 0xdb, 0x60, 0x80, 0x2c,
- 0xcd, 0xd1, 0xf2, 0x19, 0x30, 0x47, 0xcf, 0x18, 0x30, 0x36, 0x4e, 0x30, 0xc3, 0x6b, 0x43, 0x60,
- 0x9b, 0x81, 0x6c, 0xe0, 0xe0, 0x21, 0x9d, 0x3e, 0x60, 0x0d, 0xc1, 0x3c, 0x78, 0xb1, 0xa4, 0x31,
- 0xa3, 0x86, 0xe0, 0x0e, 0xc4, 0xef, 0x09, 0xd2, 0xc9, 0x62, 0x3c, 0x48, 0x9d, 0x33, 0x6b, 0xba,
- 0xfc, 0x31, 0x3e, 0xb0, 0x04, 0xde, 0x80, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00,
- 0x2c, 0x13, 0x00, 0x1a, 0x00, 0x18, 0x00, 0x23, 0x00, 0x00, 0x08, 0xff, 0x00, 0x07, 0x08, 0x1c,
- 0x48, 0xb0, 0xa0, 0xc1, 0x83, 0x02, 0x85, 0x2d, 0x89, 0x02, 0xa5, 0x45, 0x0d, 0x44, 0x82, 0x96,
- 0x05, 0x08, 0x80, 0x70, 0xe0, 0x94, 0x43, 0x3d, 0x5a, 0xb4, 0x30, 0xf8, 0x4b, 0xd8, 0x44, 0x84,
- 0xc2, 0x88, 0x68, 0x24, 0xb2, 0xc4, 0x8a, 0x20, 0x8d, 0x1b, 0x07, 0xac, 0x68, 0xf6, 0xb1, 0xa0,
- 0x30, 0x2e, 0x2d, 0x56, 0x0c, 0x99, 0x62, 0x45, 0x89, 0x13, 0x94, 0x03, 0x7b, 0xb0, 0xa4, 0x38,
- 0x70, 0x91, 0x48, 0x2e, 0x84, 0x08, 0x89, 0xd4, 0x78, 0x70, 0x85, 0x47, 0x9e, 0x03, 0x8c, 0x8d,
- 0x94, 0xe2, 0x82, 0x68, 0xc5, 0x61, 0x2d, 0x9b, 0xd4, 0xd8, 0xb8, 0x02, 0x67, 0xc5, 0x01, 0x2a,
- 0x24, 0x52, 0x74, 0xa6, 0x91, 0xd0, 0x13, 0xa7, 0x57, 0x07, 0x08, 0xfa, 0x38, 0x4c, 0xa3, 0x13,
- 0x17, 0x61, 0x09, 0x46, 0xf9, 0x08, 0x0c, 0x6c, 0x5a, 0x81, 0x50, 0x26, 0x06, 0x68, 0x98, 0xf2,
- 0xad, 0x40, 0x18, 0x72, 0xdb, 0xd6, 0xb5, 0x9b, 0x48, 0x6e, 0xd9, 0xbd, 0x6f, 0x0d, 0x7d, 0x1c,
- 0xe2, 0xf6, 0xed, 0x92, 0x8f, 0x4d, 0x32, 0x02, 0xbe, 0xda, 0xe3, 0xa8, 0xc0, 0x43, 0x85, 0xaf,
- 0x1e, 0x92, 0x2b, 0x30, 0x18, 0x93, 0xc8, 0x07, 0xb9, 0x34, 0x69, 0x29, 0x90, 0x50, 0xd5, 0xc5,
- 0x05, 0x57, 0x10, 0xe2, 0x3c, 0xb0, 0x59, 0xc6, 0xab, 0x2a, 0x76, 0x22, 0x3c, 0x09, 0x5a, 0xa0,
- 0x31, 0xd2, 0x05, 0x17, 0xc1, 0x44, 0xc8, 0x25, 0x18, 0x52, 0x84, 0x4a, 0x11, 0x4e, 0x4e, 0x4b,
- 0xa8, 0x35, 0xcb, 0xb4, 0x8b, 0x6a, 0x1c, 0xec, 0x11, 0xcc, 0xae, 0x33, 0x15, 0x7b, 0x55, 0x30,
- 0xba, 0x1d, 0x56, 0x98, 0x95, 0xe7, 0xcf, 0x3d, 0xda, 0x15, 0xc8, 0x7c, 0xba, 0xc0, 0x3f, 0x5f,
- 0xb2, 0x6b, 0xcf, 0x9e, 0xc5, 0x6e, 0x1f, 0x81, 0x6c, 0x08, 0xb2, 0x26, 0xf9, 0xfe, 0xd6, 0x04,
- 0x78, 0xf1, 0x58, 0xec, 0x06, 0xd8, 0xc3, 0x26, 0xfc, 0xc0, 0x3c, 0xd6, 0x85, 0xa8, 0x21, 0x98,
- 0x06, 0x88, 0xf5, 0x01, 0x7d, 0xf6, 0x0c, 0x30, 0xa3, 0xe7, 0xc4, 0xfd, 0x81, 0x00, 0x00, 0x90,
- 0x56, 0x40, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x2c, 0x10, 0x00, 0x1a, 0x00,
- 0x18, 0x00, 0x23, 0x00, 0x00, 0x08, 0xff, 0x00, 0x07, 0x08, 0x1c, 0x48, 0xb0, 0xa0, 0xc1, 0x83,
- 0x03, 0x83, 0x39, 0x3b, 0x64, 0x08, 0xd1, 0x13, 0x41, 0xcd, 0x00, 0x04, 0x08, 0x80, 0x70, 0xe0,
- 0x22, 0x41, 0x2b, 0x5a, 0xb4, 0x28, 0xc8, 0xc4, 0xd9, 0x44, 0x8a, 0x07, 0x85, 0x11, 0xd1, 0xc8,
- 0xa5, 0xd0, 0x00, 0x8d, 0x1b, 0x05, 0x46, 0x09, 0x36, 0xd1, 0xa0, 0x30, 0x2e, 0x2d, 0x56, 0x2c,
- 0x99, 0x42, 0xc8, 0x10, 0x4a, 0x82, 0x44, 0x9a, 0xb4, 0xb4, 0x38, 0x92, 0x0b, 0x21, 0x42, 0x4e,
- 0x34, 0x22, 0x8c, 0xf2, 0x71, 0xe0, 0xa1, 0x16, 0x2e, 0x08, 0x15, 0x71, 0x21, 0xb4, 0xa2, 0x47,
- 0x90, 0xc2, 0x6a, 0xc4, 0x94, 0x92, 0xb1, 0xe2, 0x40, 0x26, 0x12, 0x29, 0x2e, 0xd1, 0xe8, 0xe2,
- 0x64, 0x4a, 0xab, 0x03, 0x9a, 0xb5, 0x44, 0xd4, 0xc2, 0x10, 0x21, 0xaf, 0x60, 0x05, 0x1a, 0x9b,
- 0x08, 0x40, 0x2a, 0x13, 0x43, 0x69, 0x09, 0x0e, 0x9b, 0x18, 0x4c, 0x45, 0xd3, 0xb8, 0x02, 0x11,
- 0xd1, 0xb5, 0xfb, 0x15, 0xaf, 0xa1, 0x96, 0x50, 0xee, 0xe2, 0x3d, 0xd4, 0xf2, 0x89, 0xe0, 0xb8,
- 0x4f, 0x07, 0x38, 0xbb, 0x89, 0xb7, 0x06, 0x4b, 0x8a, 0x00, 0x98, 0x1c, 0xb6, 0x4a, 0x18, 0x64,
- 0x58, 0xbe, 0x71, 0x99, 0x3c, 0x26, 0x68, 0x8c, 0x71, 0x45, 0x15, 0x62, 0x2d, 0x0f, 0x34, 0x86,
- 0xb9, 0xe2, 0x5c, 0xd1, 0x04, 0x9d, 0xf5, 0xe8, 0x6b, 0x50, 0xac, 0x55, 0x67, 0x76, 0x11, 0x42,
- 0x91, 0x08, 0x76, 0x18, 0xeb, 0x81, 0x7f, 0xd3, 0x36, 0xa9, 0x81, 0x90, 0x70, 0xdc, 0xa3, 0x07,
- 0x87, 0xa0, 0x46, 0x48, 0x88, 0x29, 0x41, 0x15, 0xc3, 0x00, 0xe0, 0x0d, 0x7b, 0xe8, 0xd0, 0x92,
- 0x22, 0x84, 0x58, 0x2e, 0xaf, 0x98, 0x65, 0x79, 0x00, 0x2c, 0x27, 0x6c, 0x80, 0x19, 0xa3, 0x67,
- 0x0e, 0x1b, 0x2f, 0x78, 0x01, 0xbc, 0x2d, 0x21, 0xd8, 0x46, 0xe0, 0x11, 0xbc, 0x01, 0xf4, 0x10,
- 0x5c, 0x23, 0xd0, 0xc6, 0xf2, 0x17, 0x04, 0xd5, 0x98, 0x39, 0xf3, 0x63, 0xf9, 0xa2, 0x3b, 0x04,
- 0xcb, 0x80, 0x99, 0x3e, 0x20, 0x4b, 0xa4, 0x36, 0x67, 0xd4, 0xe1, 0x1e, 0x7f, 0x02, 0x05, 0x50,
- 0x42, 0x45, 0x01, 0x01, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00, 0x03, 0x00, 0x2c, 0x0f, 0x00,
- 0x1b, 0x00, 0x17, 0x00, 0x22, 0x00, 0x00, 0x08, 0xff, 0x00, 0x07, 0x08, 0x1c, 0x28, 0x90, 0x4a,
- 0x11, 0x67, 0xce, 0x9a, 0x05, 0x0b, 0xc0, 0x90, 0xa0, 0x43, 0x81, 0xc1, 0x96, 0x40, 0x69, 0x41,
- 0xb0, 0xc6, 0xb0, 0x66, 0x0d, 0x1f, 0x0a, 0x6c, 0xc6, 0x85, 0xe2, 0x80, 0x16, 0x20, 0x09, 0x0e,
- 0x5b, 0x18, 0xe0, 0xa1, 0xb3, 0x1e, 0x2d, 0xb8, 0x0c, 0xa1, 0xb2, 0x22, 0x24, 0x41, 0x22, 0x4d,
- 0x32, 0x6e, 0x44, 0x19, 0xa5, 0x8a, 0x95, 0x28, 0x1e, 0x1f, 0x22, 0x9a, 0x52, 0x12, 0x62, 0xc7,
- 0x28, 0x53, 0x0a, 0xb9, 0xd4, 0x38, 0xc0, 0x58, 0x46, 0x63, 0x2d, 0x56, 0x08, 0x53, 0x32, 0x94,
- 0x68, 0x0d, 0x61, 0x0c, 0x17, 0xb5, 0x64, 0x32, 0x44, 0x05, 0xd1, 0x87, 0x82, 0x18, 0x36, 0x0b,
- 0xd9, 0xf4, 0xea, 0x00, 0x44, 0x0c, 0x05, 0xa5, 0xa4, 0xe2, 0x22, 0xa7, 0xd7, 0x01, 0x2c, 0x16,
- 0x05, 0x18, 0x96, 0x54, 0xd0, 0xd9, 0x87, 0x50, 0x9f, 0x74, 0x7d, 0xab, 0x02, 0xea, 0xa1, 0xb9,
- 0x67, 0x7b, 0xa8, 0x75, 0x86, 0xd7, 0x2b, 0xd8, 0x00, 0xc2, 0x54, 0x98, 0x7d, 0x3b, 0x20, 0x6b,
- 0x49, 0x43, 0x7d, 0x35, 0x3e, 0xed, 0x49, 0x08, 0xe5, 0xe0, 0xab, 0x87, 0x64, 0x2e, 0x49, 0x5c,
- 0x31, 0xa6, 0x43, 0xa4, 0x94, 0x07, 0x0c, 0xeb, 0xe9, 0xd0, 0x59, 0xcb, 0xc7, 0x04, 0x9d, 0x71,
- 0x76, 0x28, 0xcc, 0x49, 0x62, 0x42, 0xa3, 0x1d, 0x2e, 0xc2, 0x49, 0x54, 0x05, 0x95, 0xb3, 0xc1,
- 0x98, 0x80, 0x56, 0x41, 0xe8, 0xed, 0x56, 0x8d, 0x5c, 0x16, 0x11, 0x66, 0xfd, 0x12, 0x23, 0x61,
- 0x61, 0x88, 0x54, 0x10, 0x39, 0x34, 0x00, 0x2a, 0x61, 0x82, 0x00, 0x1c, 0xfa, 0x39, 0xf2, 0xe3,
- 0x78, 0x00, 0x00, 0x42, 0x5e, 0x88, 0x91, 0xc3, 0x66, 0xc0, 0x0e, 0xc2, 0x01, 0xbe, 0xc4, 0x11,
- 0xd8, 0xa6, 0xfa, 0x80, 0x2e, 0xc7, 0x23, 0x11, 0x1f, 0xf4, 0x2e, 0x9e, 0xb0, 0x10, 0x82, 0x67,
- 0xca, 0x94, 0xf1, 0xe2, 0xbc, 0xfc, 0x40, 0x31, 0xc7, 0x05, 0x06, 0x38, 0x52, 0x07, 0xcd, 0x9c,
- 0x1d, 0xc9, 0xe3, 0x0f, 0x4c, 0x2d, 0x30, 0x20, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x06, 0x00, 0x03,
- 0x00, 0x2c, 0x0e, 0x00, 0x1b, 0x00, 0x17, 0x00, 0x22, 0x00, 0x00, 0x08, 0xff, 0x00, 0x07, 0x08,
- 0x1c, 0x38, 0xb0, 0x09, 0x21, 0x42, 0xc2, 0x02, 0x04, 0x20, 0xc8, 0x90, 0x21, 0x95, 0x43, 0x4c,
- 0x54, 0x0c, 0x84, 0x72, 0x88, 0xd0, 0xc2, 0x86, 0x03, 0x01, 0x1c, 0xea, 0x81, 0x51, 0xe0, 0xb0,
- 0x26, 0x17, 0x19, 0x06, 0x8b, 0xd2, 0x62, 0x80, 0x93, 0x01, 0x2b, 0x4a, 0x32, 0x64, 0x62, 0x91,
- 0x21, 0x00, 0x92, 0x2e, 0x86, 0x4c, 0x19, 0xb2, 0xa2, 0x23, 0x97, 0x84, 0x04, 0x05, 0xb5, 0x70,
- 0x51, 0x84, 0x10, 0x91, 0x8e, 0x03, 0x9d, 0x84, 0x14, 0x56, 0x63, 0x80, 0x20, 0x2a, 0x5c, 0x80,
- 0x12, 0x74, 0x76, 0x51, 0xa7, 0x8b, 0x26, 0x24, 0x95, 0x0e, 0x44, 0x74, 0x31, 0x91, 0xc0, 0xa4,
- 0x52, 0x07, 0xaa, 0x10, 0x36, 0x40, 0x98, 0xc4, 0x27, 0x4c, 0x54, 0x66, 0x1d, 0xc0, 0xb4, 0x59,
- 0x49, 0x42, 0x86, 0xc6, 0x0e, 0x5c, 0x12, 0xa0, 0x48, 0x49, 0x17, 0x6a, 0xd7, 0x06, 0x30, 0x1b,
- 0x77, 0x69, 0x00, 0xaf, 0x75, 0x07, 0x12, 0x12, 0x08, 0x4c, 0xac, 0x5a, 0x28, 0x00, 0x04, 0x0e,
- 0xf1, 0x3b, 0x56, 0xd0, 0xc5, 0x45, 0x61, 0xe3, 0xae, 0x68, 0x42, 0xb0, 0x19, 0x47, 0xb5, 0x87,
- 0x42, 0x0a, 0x74, 0x26, 0x71, 0x6c, 0x33, 0x8c, 0x45, 0xb8, 0x10, 0x6e, 0xa8, 0x82, 0x31, 0xc6,
- 0x26, 0x87, 0x2a, 0x77, 0xac, 0x11, 0x18, 0xa8, 0x33, 0xb8, 0xa3, 0x25, 0x63, 0xa4, 0xdc, 0xb1,
- 0xc7, 0xa2, 0xac, 0x87, 0x3a, 0x52, 0xcd, 0x1a, 0x0c, 0xeb, 0x40, 0x17, 0x51, 0xb8, 0x5a, 0x4e,
- 0x99, 0xd4, 0x99, 0xe7, 0xb8, 0x8b, 0x84, 0x95, 0x1e, 0x50, 0x02, 0xc5, 0x17, 0x21, 0x71, 0x03,
- 0xfc, 0x38, 0x32, 0x00, 0x8e, 0xc0, 0x2f, 0x6a, 0x8f, 0xdc, 0x11, 0xc8, 0x66, 0x60, 0x18, 0xb5,
- 0xd0, 0x1b, 0x8a, 0x51, 0xab, 0x03, 0xa3, 0x8d, 0xb8, 0x3b, 0x18, 0xee, 0x0c, 0x19, 0x3e, 0x36,
- 0x08, 0x9e, 0x4a, 0x74, 0x88, 0xe7, 0x05, 0x1a, 0x10, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00,
- 0x03, 0x00, 0x2c, 0x0e, 0x00, 0x1b, 0x00, 0x17, 0x00, 0x22, 0x00, 0x00, 0x08, 0xff, 0x00, 0x07,
- 0x08, 0x1c, 0x38, 0x90, 0x8a, 0xb3, 0x21, 0x43, 0x8a, 0x08, 0x23, 0xc8, 0x90, 0xe1, 0x94, 0x25,
- 0x89, 0x5a, 0x0c, 0x6c, 0xa1, 0x02, 0x91, 0x33, 0x00, 0x0d, 0x07, 0x06, 0x20, 0x44, 0x44, 0xa0,
- 0x8a, 0x86, 0x2d, 0x88, 0x50, 0xc9, 0x18, 0xa0, 0xd9, 0x8a, 0x01, 0x2b, 0x96, 0x34, 0x31, 0x04,
- 0x72, 0x45, 0x33, 0x86, 0x01, 0x84, 0xad, 0x08, 0x29, 0x8c, 0x90, 0x21, 0x17, 0x19, 0x5b, 0xac,
- 0x58, 0xa8, 0x11, 0x51, 0x0b, 0x26, 0x55, 0x96, 0xe0, 0xcc, 0x28, 0xb0, 0x05, 0x22, 0x8d, 0xce,
- 0x06, 0xb4, 0xb0, 0x22, 0x85, 0x28, 0xc3, 0x16, 0x49, 0x07, 0x04, 0xf0, 0xd9, 0x42, 0xd0, 0x49,
- 0xa7, 0x13, 0x7d, 0x09, 0x14, 0xf6, 0xf1, 0x2a, 0xd6, 0x89, 0x2c, 0x82, 0x05, 0x48, 0xda, 0x82,
- 0x8a, 0x93, 0xaf, 0x04, 0x55, 0x34, 0x0b, 0xb0, 0x44, 0xe9, 0x13, 0xaf, 0x68, 0x5b, 0x14, 0x61,
- 0xab, 0x14, 0xed, 0xd3, 0xb9, 0x51, 0xed, 0x12, 0x6c, 0x41, 0x28, 0xc0, 0x32, 0xbd, 0x0c, 0x6b,
- 0x04, 0x93, 0x9a, 0x08, 0x70, 0xd1, 0x5f, 0x02, 0xe9, 0x1a, 0x56, 0x9b, 0x78, 0x11, 0x13, 0xc0,
- 0x2d, 0x58, 0x6a, 0x6c, 0x36, 0x14, 0xad, 0x0a, 0x42, 0x30, 0x8b, 0xc0, 0x75, 0x7a, 0xb4, 0xe1,
- 0xc6, 0x8e, 0x58, 0x5b, 0xb4, 0x25, 0x39, 0xe5, 0x50, 0xe8, 0x22, 0x58, 0x03, 0x98, 0x26, 0xda,
- 0xe2, 0x25, 0x56, 0x00, 0x9d, 0x41, 0x62, 0xfe, 0x4a, 0xa8, 0x32, 0xc1, 0x15, 0x83, 0xbf, 0x06,
- 0x18, 0xf6, 0x94, 0x89, 0x6b, 0xb4, 0x4d, 0x7e, 0xd5, 0xe8, 0xa8, 0xd0, 0xb0, 0xd4, 0x00, 0x01,
- 0x34, 0xfe, 0x08, 0x82, 0x05, 0x30, 0x80, 0x13, 0x2f, 0x06, 0xcc, 0x11, 0x18, 0xdd, 0x6e, 0x97,
- 0x37, 0x0d, 0x23, 0xe9, 0xed, 0x92, 0xf1, 0x8b, 0x5e, 0x20, 0x19, 0x7d, 0x00, 0x0f, 0x1e, 0xc3,
- 0x50, 0x4c, 0x72, 0xc0, 0x2f, 0xe8, 0xa0, 0x99, 0x8e, 0xd1, 0x38, 0xd1, 0x80, 0x00, 0x21, 0xf9,
- 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x2c, 0x0f, 0x00, 0x1b, 0x00, 0x18, 0x00, 0x22, 0x00, 0x00,
- 0x08, 0xff, 0x00, 0x07, 0x08, 0x1c, 0x28, 0x30, 0x40, 0xb3, 0x43, 0x51, 0x88, 0x20, 0x1a, 0xb6,
- 0x84, 0x0a, 0xc1, 0x87, 0x03, 0x03, 0x18, 0x24, 0x42, 0xb0, 0x85, 0x45, 0x15, 0x51, 0x08, 0x41,
- 0x8c, 0x18, 0xe0, 0xd0, 0x80, 0x16, 0x2e, 0x0c, 0x2d, 0xe1, 0x32, 0xd0, 0xa2, 0x0b, 0x67, 0x1b,
- 0x25, 0x1e, 0xb2, 0xf8, 0x44, 0x98, 0x30, 0x29, 0x24, 0x4b, 0xb6, 0x50, 0xc1, 0xe8, 0xa1, 0x44,
- 0x46, 0x16, 0x05, 0x55, 0x39, 0xe4, 0x62, 0xe3, 0xc5, 0x66, 0x04, 0x03, 0x08, 0x73, 0xd1, 0xe2,
- 0x49, 0x15, 0x27, 0x1b, 0x65, 0x32, 0x59, 0x54, 0x30, 0xc0, 0x30, 0x8b, 0x4e, 0xa2, 0x24, 0xad,
- 0xd8, 0x02, 0xe5, 0x80, 0x00, 0xc1, 0x6a, 0xb4, 0x70, 0x12, 0x73, 0xaa, 0x40, 0x8b, 0x88, 0xae,
- 0x06, 0x70, 0xd6, 0x62, 0x00, 0xa1, 0x27, 0x5e, 0x65, 0xaa, 0x08, 0x26, 0x51, 0x90, 0x45, 0x2e,
- 0x3d, 0xd3, 0x7e, 0x9c, 0x49, 0x48, 0xa5, 0x45, 0xb9, 0x54, 0x9b, 0x49, 0x34, 0x86, 0xf7, 0xa1,
- 0xc5, 0xba, 0x63, 0xfb, 0x56, 0x5c, 0x2b, 0x51, 0xa3, 0xe0, 0xb9, 0x61, 0xc5, 0x02, 0x3b, 0x6c,
- 0x71, 0x49, 0x53, 0xab, 0x78, 0xdf, 0x06, 0x6b, 0x1a, 0x40, 0x6a, 0xe4, 0xaa, 0x41, 0x03, 0x34,
- 0x61, 0x22, 0xd7, 0xe2, 0x30, 0x88, 0x12, 0x85, 0x51, 0xf4, 0xda, 0x82, 0xcb, 0x64, 0xd0, 0x58,
- 0x13, 0x27, 0x6d, 0x21, 0x68, 0xaa, 0xc4, 0x26, 0x5d, 0x21, 0xb6, 0x70, 0xe8, 0x35, 0x70, 0x52,
- 0x28, 0x72, 0x25, 0x72, 0xde, 0x68, 0x39, 0x6d, 0x00, 0xc7, 0xb2, 0x3d, 0xe2, 0x15, 0x16, 0xfb,
- 0x23, 0xa2, 0x26, 0x7d, 0x85, 0x0a, 0x12, 0x34, 0xc4, 0x2c, 0xf2, 0xc3, 0x29, 0x25, 0x0a, 0xee,
- 0xe3, 0xe5, 0x08, 0x98, 0x31, 0x61, 0xee, 0xc0, 0x01, 0xd2, 0x37, 0x0b, 0x1b, 0x36, 0x03, 0xdb,
- 0xb4, 0x24, 0x19, 0x10, 0x44, 0xf0, 0x9d, 0x8d, 0x5e, 0x04, 0x83, 0x21, 0x58, 0xe9, 0x8c, 0x9a,
- 0x3f, 0x82, 0xff, 0xd0, 0x79, 0xf8, 0x02, 0x3a, 0xb3, 0x31, 0x6b, 0xce, 0xd8, 0x09, 0x12, 0x00,
- 0xfa, 0xc0, 0x12, 0x49, 0x05, 0x04, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x2c,
- 0x11, 0x00, 0x1a, 0x00, 0x18, 0x00, 0x23, 0x00, 0x00, 0x08, 0xff, 0x00, 0x07, 0x08, 0x1c, 0x48,
- 0xb0, 0xa0, 0xc1, 0x83, 0x03, 0x03, 0x04, 0x73, 0x66, 0x08, 0x8a, 0x8a, 0x1a, 0xc0, 0x0e, 0x35,
- 0x43, 0x48, 0x30, 0x40, 0x00, 0x67, 0x5c, 0x0a, 0xb6, 0xd8, 0x48, 0x64, 0x22, 0x42, 0x85, 0x86,
- 0x36, 0x72, 0x51, 0x52, 0xc4, 0x8a, 0x0b, 0x81, 0x1b, 0x55, 0x18, 0x3b, 0x18, 0x60, 0x8a, 0x93,
- 0x16, 0x2a, 0x94, 0x54, 0x21, 0x24, 0xc8, 0x10, 0xc1, 0x8d, 0x2d, 0x56, 0x56, 0x0c, 0x30, 0x6c,
- 0xe3, 0x10, 0x61, 0x36, 0x0f, 0xa6, 0x74, 0x96, 0x30, 0x40, 0x33, 0x15, 0x3e, 0x99, 0x50, 0x1c,
- 0x20, 0x72, 0x91, 0x40, 0x8b, 0x88, 0x5a, 0x70, 0x21, 0xb2, 0x74, 0xe0, 0x46, 0xa2, 0x16, 0x09,
- 0x6d, 0x5c, 0x22, 0xa5, 0x2a, 0xca, 0x16, 0x88, 0x06, 0x58, 0x5c, 0x22, 0x72, 0x85, 0x57, 0xa6,
- 0x2d, 0x7a, 0x2c, 0xb2, 0x78, 0x68, 0xe3, 0xd9, 0xaf, 0x2a, 0x84, 0x59, 0x1c, 0xf6, 0xf6, 0xa6,
- 0x0a, 0x42, 0x6c, 0xeb, 0x5a, 0x8d, 0x6b, 0x71, 0x88, 0x5e, 0xb4, 0x35, 0x4a, 0x64, 0xfd, 0xbb,
- 0x31, 0xa8, 0x45, 0xaa, 0x75, 0xaf, 0x3e, 0xbd, 0x98, 0xb8, 0x05, 0x11, 0x00, 0x45, 0x83, 0x7a,
- 0x4d, 0xeb, 0x71, 0x71, 0x30, 0xc4, 0x4b, 0x61, 0x12, 0x2d, 0x68, 0x51, 0x58, 0x46, 0x8a, 0x5b,
- 0x3f, 0x32, 0x06, 0x2d, 0x99, 0x65, 0x80, 0xb0, 0x08, 0x7b, 0x08, 0xab, 0x1a, 0xc0, 0xaf, 0x50,
- 0xba, 0x5e, 0x85, 0xa9, 0x10, 0xba, 0xb9, 0x2a, 0x00, 0x28, 0x07, 0xe3, 0x9e, 0xbd, 0x58, 0xa3,
- 0xa0, 0xca, 0xba, 0x01, 0x9a, 0x10, 0xb2, 0x42, 0xdc, 0xca, 0xb2, 0xbf, 0xc8, 0x0b, 0x62, 0x19,
- 0xd3, 0xa5, 0x4b, 0xa4, 0x2f, 0xd0, 0xc1, 0x98, 0x78, 0x2b, 0xa4, 0x20, 0x1b, 0x36, 0x03, 0xfc,
- 0xbc, 0xfd, 0x83, 0xdd, 0xe0, 0x9f, 0xba, 0x7a, 0xd6, 0x0c, 0x18, 0xbc, 0xbe, 0x27, 0x40, 0x5d,
- 0x20, 0x69, 0x08, 0xaa, 0x39, 0xf1, 0xf7, 0x84, 0x9e, 0x33, 0x03, 0xf6, 0x54, 0x4f, 0x0e, 0x00,
- 0x32, 0xc5, 0x80, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x07, 0x00, 0x03, 0x00, 0x2c, 0x13, 0x00, 0x1a,
- 0x00, 0x17, 0x00, 0x23, 0x00, 0x00, 0x08, 0xff, 0x00, 0x07, 0x08, 0x1c, 0x48, 0xb0, 0xa0, 0xc1,
- 0x83, 0x03, 0x02, 0x04, 0x73, 0x66, 0x08, 0xca, 0x80, 0x15, 0x88, 0x0e, 0x35, 0x43, 0x48, 0x10,
- 0xc0, 0x92, 0x15, 0x07, 0x5b, 0x20, 0x22, 0x84, 0x30, 0x40, 0x93, 0x28, 0x03, 0x5a, 0x70, 0x51,
- 0x52, 0x84, 0x10, 0x48, 0x81, 0x2d, 0x5c, 0x38, 0x33, 0xe8, 0x91, 0x48, 0x4a, 0x41, 0x53, 0x08,
- 0x09, 0x2a, 0xc4, 0xa5, 0xa0, 0x8a, 0x95, 0x04, 0x03, 0x80, 0x6c, 0x31, 0x44, 0xd8, 0xc9, 0x8c,
- 0x2e, 0x38, 0x0a, 0x0c, 0x80, 0xb3, 0x45, 0x94, 0x9a, 0x14, 0x43, 0x22, 0x1a, 0xb8, 0x88, 0x4b,
- 0x0b, 0x27, 0x4a, 0x92, 0x12, 0x54, 0x31, 0x31, 0xc0, 0xc4, 0x16, 0x87, 0x04, 0x49, 0x1d, 0xd8,
- 0x62, 0x58, 0xc2, 0x43, 0x21, 0x5b, 0x6c, 0xe5, 0xea, 0x30, 0xc0, 0xaf, 0xb1, 0x05, 0x53, 0x06,
- 0x0b, 0xb0, 0x14, 0x2d, 0x57, 0x17, 0x4d, 0xcc, 0xba, 0xe5, 0xda, 0x63, 0x2d, 0xd8, 0xb9, 0x21,
- 0x13, 0x25, 0x2c, 0x82, 0x37, 0xe4, 0xdd, 0xa6, 0x78, 0x5b, 0x4c, 0x4c, 0xb8, 0x64, 0xae, 0xd1,
- 0x8a, 0x6d, 0xb7, 0xb6, 0x58, 0x41, 0x25, 0xa7, 0x30, 0xa4, 0x49, 0x5b, 0xf4, 0xc0, 0x99, 0x93,
- 0x32, 0xc5, 0x1a, 0x7c, 0x0f, 0xb2, 0x4d, 0x7a, 0x33, 0xa9, 0xe5, 0xb4, 0x77, 0x29, 0x36, 0x71,
- 0x81, 0xb0, 0x86, 0x30, 0xa9, 0x01, 0xf4, 0x1e, 0xf4, 0x8a, 0x9a, 0x75, 0xda, 0xcf, 0x08, 0x85,
- 0x25, 0x46, 0x89, 0x68, 0x11, 0x5a, 0x8f, 0x54, 0x38, 0x4a, 0x29, 0x32, 0xa5, 0xaf, 0x6f, 0x21,
- 0x78, 0xf6, 0x88, 0xe9, 0x32, 0x60, 0x87, 0x0d, 0x2f, 0x01, 0xc6, 0xfa, 0x68, 0xc3, 0xbc, 0xe0,
- 0x9f, 0xb1, 0x42, 0x0e, 0xc6, 0x49, 0xbe, 0x15, 0x40, 0x1c, 0x35, 0x6b, 0x08, 0x8e, 0x71, 0xcb,
- 0xc7, 0x0c, 0x41, 0x37, 0x3f, 0xe6, 0xfa, 0x0b, 0xc0, 0x33, 0x20, 0x4d, 0x18, 0x5c, 0xbe, 0x4b,
- 0x6c, 0x0d, 0x08, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x2c, 0x13, 0x00, 0x1a,
- 0x00, 0x17, 0x00, 0x23, 0x00, 0x00, 0x08, 0xdf, 0x00, 0x07, 0x08, 0x1c, 0x48, 0xb0, 0xa0, 0xc1,
- 0x83, 0x02, 0x9b, 0x2c, 0x89, 0x32, 0x80, 0x85, 0x40, 0x41, 0x84, 0x10, 0x12, 0x5c, 0x64, 0xac,
- 0xc6, 0x41, 0x15, 0xbf, 0x84, 0x49, 0x14, 0x46, 0x44, 0x20, 0x13, 0x41, 0x56, 0x06, 0x30, 0x21,
- 0xb8, 0xa2, 0xc8, 0x41, 0x61, 0x5c, 0x06, 0xac, 0x58, 0x32, 0x20, 0xe4, 0x13, 0x17, 0x05, 0x5d,
- 0x98, 0x24, 0x38, 0xa5, 0x63, 0x4b, 0x42, 0x36, 0x11, 0xae, 0xd0, 0x38, 0xd0, 0xd8, 0xc0, 0x27,
- 0x2b, 0x24, 0x0e, 0xfc, 0x35, 0xb0, 0x89, 0x45, 0x43, 0x4f, 0x84, 0x16, 0x5c, 0x26, 0x70, 0x88,
- 0xc0, 0x25, 0x85, 0x94, 0x12, 0x14, 0x24, 0x30, 0xa9, 0x54, 0x83, 0x88, 0x04, 0x02, 0xbb, 0x6a,
- 0x10, 0x4a, 0x80, 0x01, 0x50, 0xb8, 0x16, 0xac, 0x01, 0x60, 0xc0, 0x56, 0xb1, 0x03, 0xbd, 0x0e,
- 0x18, 0x86, 0x76, 0x20, 0xc3, 0x01, 0x4e, 0xdb, 0x0e, 0x60, 0x39, 0xc0, 0x68, 0xdb, 0x1e, 0x3c,
- 0x07, 0x1c, 0x6a, 0xcb, 0x76, 0x60, 0xb0, 0x91, 0x5c, 0xb9, 0x34, 0x29, 0x48, 0x28, 0xa8, 0xd4,
- 0x15, 0x11, 0xe5, 0xaa, 0x6c, 0x26, 0x31, 0xe7, 0x41, 0x17, 0x8c, 0x15, 0x5f, 0x15, 0xa6, 0x42,
- 0x67, 0x30, 0xa9, 0x61, 0x0f, 0xee, 0x95, 0x3c, 0x20, 0xb2, 0x54, 0xc7, 0x02, 0x9d, 0x94, 0xe5,
- 0x9a, 0xb7, 0x48, 0xb3, 0xd1, 0x9c, 0xb9, 0xf6, 0xd1, 0x53, 0xf0, 0x48, 0x10, 0xae, 0x28, 0x10,
- 0x62, 0xb9, 0xda, 0xe7, 0x20, 0x1c, 0xd4, 0x4a, 0xe5, 0xa4, 0xf6, 0x72, 0xa6, 0x20, 0x2e, 0xc5,
- 0x68, 0x06, 0xf8, 0x49, 0x2d, 0x34, 0x20, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00, 0x03, 0x00,
- 0x2c, 0x13, 0x00, 0x1a, 0x00, 0x17, 0x00, 0x23, 0x00, 0x00, 0x08, 0xf6, 0x00, 0x07, 0x08, 0x1c,
- 0x48, 0xb0, 0xa0, 0xc1, 0x83, 0x02, 0x09, 0x1d, 0x42, 0x54, 0xc3, 0x05, 0x14, 0x43, 0x4b, 0x9a,
- 0x20, 0x24, 0x28, 0xec, 0x57, 0x8b, 0x83, 0x35, 0x0e, 0x05, 0x9b, 0xe8, 0x6c, 0x85, 0xc0, 0x28,
- 0x43, 0x06, 0x0c, 0xb9, 0x38, 0x90, 0x88, 0xb0, 0x83, 0xce, 0x7a, 0x0c, 0x60, 0x62, 0xa5, 0x8a,
- 0x94, 0x42, 0x4e, 0x48, 0x0e, 0xe4, 0x72, 0x92, 0x20, 0xa1, 0x1a, 0x03, 0x88, 0xb8, 0xe4, 0x32,
- 0x71, 0x00, 0x22, 0x00, 0x04, 0x11, 0x09, 0x64, 0x52, 0x48, 0xe6, 0xc4, 0x90, 0x02, 0x8b, 0x5c,
- 0x2c, 0xc4, 0xb3, 0xe7, 0x40, 0x26, 0x40, 0x07, 0x18, 0x1a, 0xe0, 0x82, 0x0a, 0x13, 0xa7, 0x04,
- 0x9b, 0x0d, 0x00, 0x80, 0x13, 0xab, 0xc1, 0x25, 0x03, 0x84, 0x19, 0xf5, 0x2a, 0xf0, 0xd0, 0x80,
- 0x65, 0x63, 0xc9, 0x0e, 0x0b, 0x20, 0x96, 0x6c, 0x41, 0xb3, 0x5c, 0xdd, 0x12, 0x04, 0x2b, 0x55,
- 0xee, 0x40, 0x42, 0x02, 0x9d, 0xa5, 0x75, 0x0a, 0x2c, 0x80, 0x40, 0x00, 0x44, 0xe4, 0xaa, 0x70,
- 0x96, 0x55, 0x25, 0x59, 0x43, 0x7e, 0x09, 0xea, 0xf5, 0x4a, 0x64, 0xa3, 0xc1, 0x61, 0x58, 0x89,
- 0x48, 0x3c, 0xd8, 0xc4, 0xe3, 0x44, 0x9a, 0x3d, 0xcd, 0x72, 0x74, 0x4a, 0x68, 0xef, 0xca, 0xa8,
- 0x13, 0x17, 0x75, 0x35, 0x28, 0xc8, 0xab, 0x50, 0xbb, 0x36, 0x9b, 0x12, 0x44, 0x4c, 0x16, 0x00,
- 0x15, 0x42, 0x56, 0x06, 0x26, 0x46, 0x6d, 0xd7, 0x4f, 0x18, 0x31, 0x63, 0x04, 0x82, 0x79, 0x71,
- 0x04, 0x74, 0x4f, 0x20, 0x08, 0x75, 0x78, 0xc5, 0xb5, 0xc6, 0xa0, 0x9b, 0x12, 0x5e, 0x03, 0xd4,
- 0x29, 0x4e, 0x30, 0x8c, 0x5b, 0x1f, 0x05, 0xd9, 0xf4, 0x91, 0x8b, 0x82, 0xe0, 0x74, 0xda, 0x58,
- 0x03, 0x02, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x2c, 0x13, 0x00, 0x1a, 0x00,
- 0x16, 0x00, 0x23, 0x00, 0x00, 0x08, 0xf8, 0x00, 0x07, 0x08, 0x1c, 0x48, 0xb0, 0xa0, 0xc1, 0x83,
- 0x00, 0x9c, 0x0d, 0x4b, 0xc4, 0x62, 0x40, 0xa2, 0x61, 0xce, 0x00, 0x1c, 0x24, 0xe8, 0x8c, 0xc9,
- 0x44, 0x26, 0xce, 0x02, 0x4c, 0x3c, 0xd4, 0x62, 0xc0, 0x8a, 0x42, 0x45, 0x08, 0x11, 0x29, 0x78,
- 0x48, 0x62, 0xc1, 0x61, 0x1d, 0x9f, 0x34, 0xa1, 0xb2, 0xc4, 0xa3, 0xc1, 0x61, 0x1a, 0x07, 0x1a,
- 0xeb, 0xa8, 0x64, 0x40, 0x21, 0x15, 0x13, 0x05, 0x2e, 0x89, 0x49, 0xc5, 0x85, 0x40, 0x25, 0x4e,
- 0x72, 0x0e, 0xac, 0x21, 0x4c, 0xe0, 0x30, 0x8f, 0x86, 0x3a, 0x0a, 0x1d, 0x78, 0x28, 0x40, 0xb0,
- 0x1a, 0x36, 0x09, 0x29, 0x5d, 0x3a, 0x00, 0x4a, 0x80, 0x66, 0x1d, 0x5d, 0xac, 0xa0, 0x4a, 0x90,
- 0x25, 0xd7, 0x83, 0xcd, 0x18, 0x7d, 0x35, 0x58, 0x64, 0xc8, 0xd8, 0x82, 0xcd, 0xb0, 0x9e, 0x15,
- 0xa8, 0x42, 0x58, 0xb0, 0x1e, 0x6b, 0x07, 0x30, 0xd1, 0x78, 0x74, 0xad, 0x20, 0x81, 0x84, 0xe0,
- 0x8e, 0x5d, 0xd1, 0x84, 0xe9, 0x54, 0xaa, 0xce, 0x08, 0x02, 0x30, 0xf4, 0xb5, 0x69, 0xc1, 0x60,
- 0x23, 0x97, 0x1a, 0x36, 0xd8, 0x0c, 0x67, 0x4e, 0x44, 0x26, 0x0f, 0x46, 0xc9, 0xa9, 0x82, 0x90,
- 0xd0, 0xc0, 0x13, 0xa3, 0xc4, 0x9c, 0xd8, 0xc4, 0xb1, 0x41, 0xcc, 0x42, 0x13, 0x1d, 0x6c, 0x4b,
- 0xb5, 0xd9, 0x56, 0x82, 0x2a, 0x0e, 0x7d, 0x0d, 0x66, 0x59, 0xa0, 0x95, 0xd6, 0x71, 0xcf, 0xea,
- 0x10, 0x33, 0xa6, 0x4b, 0xa4, 0x01, 0x5f, 0xc0, 0xec, 0x58, 0x44, 0xf5, 0xc4, 0x00, 0x36, 0x6c,
- 0x0a, 0xfa, 0xa1, 0x8a, 0x25, 0x78, 0xc1, 0x36, 0x59, 0xb8, 0xe6, 0xf9, 0x1d, 0x1b, 0x48, 0x1a,
- 0x82, 0x6a, 0x84, 0x8c, 0x3d, 0xa1, 0x67, 0xc0, 0x99, 0x3d, 0xd2, 0x63, 0x0b, 0x0d, 0x08, 0x00,
- 0x21, 0xf9, 0x04, 0x05, 0x07, 0x00, 0x03, 0x00, 0x2c, 0x13, 0x00, 0x1a, 0x00, 0x16, 0x00, 0x23,
- 0x00, 0x00, 0x08, 0xf8, 0x00, 0x07, 0x08, 0x1c, 0x48, 0xb0, 0xa0, 0xc1, 0x83, 0x4d, 0x86, 0xfc,
- 0x82, 0xa2, 0xa2, 0x06, 0xa2, 0x43, 0xcd, 0x02, 0x1c, 0x1c, 0x08, 0x40, 0x50, 0x8d, 0x89, 0x88,
- 0x08, 0x4d, 0x6c, 0x82, 0x48, 0x20, 0x13, 0x41, 0x56, 0xa4, 0xb4, 0x20, 0xe8, 0xc2, 0x99, 0x44,
- 0x82, 0x4d, 0x88, 0x0c, 0x70, 0xb1, 0x64, 0x8a, 0x15, 0x41, 0x51, 0x46, 0x12, 0x54, 0xe1, 0xac,
- 0x60, 0x94, 0x95, 0x56, 0xa8, 0x38, 0x91, 0x79, 0xd0, 0x85, 0x46, 0x81, 0xce, 0x46, 0x72, 0x91,
- 0xc2, 0x65, 0x22, 0x41, 0x44, 0x12, 0x17, 0x15, 0x65, 0x52, 0xd4, 0xe8, 0xcc, 0x66, 0x03, 0x8a,
- 0x8c, 0x2c, 0x22, 0xc8, 0x69, 0xc1, 0x43, 0x03, 0xb0, 0x0e, 0x60, 0x62, 0xb5, 0x60, 0xa2, 0x00,
- 0x37, 0xbb, 0x1a, 0x54, 0xb1, 0xa8, 0xa3, 0xd8, 0x82, 0x2a, 0x82, 0x85, 0x3d, 0x3b, 0x90, 0xac,
- 0x56, 0xb6, 0x02, 0x81, 0x05, 0x90, 0x0a, 0x57, 0x20, 0x56, 0xa5, 0x75, 0x55, 0x40, 0x1d, 0xb0,
- 0x84, 0xa7, 0xd8, 0x28, 0x27, 0x01, 0x98, 0x15, 0xbb, 0x42, 0x18, 0x41, 0x61, 0x5c, 0xbb, 0xba,
- 0xd8, 0x4b, 0x90, 0xd0, 0x0a, 0xab, 0x34, 0x27, 0xf6, 0x75, 0x7a, 0xe8, 0xa4, 0x41, 0x00, 0x89,
- 0x0f, 0xd6, 0x68, 0xe2, 0x74, 0x89, 0xd1, 0xb7, 0x13, 0x7f, 0x1e, 0x64, 0x3c, 0x11, 0xc0, 0x63,
- 0x83, 0x3d, 0x38, 0x5b, 0x75, 0xd6, 0xc3, 0xa0, 0xb1, 0xb3, 0x4d, 0xac, 0x58, 0x19, 0x68, 0xb8,
- 0xae, 0xed, 0x3f, 0x91, 0x72, 0x0f, 0xfc, 0xf2, 0x25, 0x4b, 0x57, 0x21, 0x6c, 0x6c, 0x0b, 0xf4,
- 0x6d, 0x90, 0x0d, 0x33, 0xb1, 0x7b, 0x82, 0x13, 0xd4, 0x73, 0xf6, 0x84, 0x1a, 0x82, 0x69, 0x80,
- 0xb0, 0x15, 0xb2, 0x47, 0xa0, 0x9e, 0x13, 0xb6, 0x01, 0x58, 0x0d, 0x08, 0x00, 0x21, 0xf9, 0x04,
- 0x05, 0x35, 0x00, 0x03, 0x00, 0x2c, 0x13, 0x00, 0x1a, 0x00, 0x16, 0x00, 0x23, 0x00, 0x00, 0x08,
- 0xd2, 0x00, 0x07, 0x08, 0x1c, 0x48, 0xb0, 0xa0, 0xc1, 0x83, 0xc2, 0x96, 0x44, 0x19, 0xd0, 0x42,
- 0xa0, 0xa0, 0x65, 0x07, 0x09, 0x4e, 0x39, 0xd4, 0x23, 0xe2, 0x2f, 0x61, 0x11, 0x85, 0x11, 0x11,
- 0x48, 0x64, 0xc9, 0x00, 0x41, 0x05, 0x57, 0x34, 0x33, 0x28, 0x8c, 0xcb, 0x80, 0x15, 0x43, 0x04,
- 0x2a, 0x71, 0x62, 0xb0, 0xc7, 0xc8, 0x81, 0x8b, 0x36, 0x72, 0x21, 0x44, 0x68, 0x63, 0xc4, 0x93,
- 0x18, 0x05, 0x1a, 0xe3, 0x38, 0xc0, 0xc5, 0xcd, 0x81, 0xc3, 0x04, 0x36, 0xa9, 0x21, 0x70, 0xc5,
- 0xcf, 0x82, 0x10, 0x9d, 0x09, 0x24, 0xf4, 0xe4, 0x28, 0x41, 0x90, 0x41, 0x07, 0x38, 0xf1, 0xe9,
- 0x54, 0xe0, 0x42, 0x60, 0x55, 0x0d, 0x42, 0x09, 0x00, 0x25, 0x6b, 0x41, 0x18, 0x01, 0xb0, 0x7a,
- 0x1d, 0x98, 0x28, 0x40, 0xd4, 0xb1, 0x03, 0x0c, 0x0d, 0x48, 0x89, 0x76, 0x80, 0xc7, 0x26, 0x15,
- 0xc7, 0xf6, 0xc8, 0x79, 0x08, 0x6d, 0x5d, 0x81, 0xc1, 0x98, 0x78, 0xe5, 0xd2, 0x84, 0x20, 0x21,
- 0xa3, 0x4e, 0x57, 0x10, 0x32, 0xd8, 0x2c, 0xee, 0xcf, 0x97, 0x06, 0x41, 0xfe, 0xdc, 0x19, 0x71,
- 0x91, 0xc9, 0x88, 0x5c, 0x82, 0x2d, 0x6e, 0x4b, 0xb0, 0x21, 0xe5, 0x45, 0x44, 0x0f, 0x4a, 0x76,
- 0xaa, 0xc2, 0x20, 0xa3, 0xac, 0x39, 0x29, 0x8b, 0x16, 0xf8, 0xa5, 0xf4, 0x17, 0xb4, 0x7d, 0x22,
- 0xa6, 0x3e, 0x6a, 0x22, 0x22, 0x16, 0xd1, 0x79, 0xb2, 0x0a, 0x19, 0x3d, 0x60, 0xb5, 0x19, 0xda,
- 0x3f, 0x03, 0x02, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x00, 0x00, 0x2c, 0x1a, 0x00, 0x1b,
- 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x02, 0x02, 0x04, 0x0a, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04,
- 0x00, 0x04, 0x00, 0x2c, 0x16, 0x00, 0x1a, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x00, 0x08, 0x23, 0x00,
- 0x09, 0x08, 0x1c, 0x48, 0xb0, 0x20, 0x05, 0x05, 0xef, 0xda, 0x99, 0xb3, 0x77, 0x8e, 0x0f, 0x2e,
- 0x02, 0x19, 0x1e, 0xa0, 0xb3, 0xf7, 0x45, 0x8b, 0x0a, 0x82, 0xbd, 0xc0, 0x50, 0xa2, 0x51, 0x70,
- 0x60, 0x40, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x06, 0x00, 0x03, 0x00, 0x2c, 0x15, 0x00, 0x1b, 0x00,
- 0x10, 0x00, 0x04, 0x00, 0x00, 0x08, 0x32, 0x00, 0x07, 0x08, 0x1c, 0x28, 0x30, 0x9d, 0xba, 0x78,
- 0x1b, 0x22, 0x10, 0x1c, 0xa8, 0x2e, 0x9d, 0xc3, 0x74, 0xe8, 0xe8, 0xe9, 0xa3, 0xe7, 0x81, 0x81,
- 0xc0, 0x08, 0xee, 0x1c, 0xba, 0xc3, 0x30, 0xa2, 0x11, 0x8c, 0x81, 0x30, 0x4a, 0x0d, 0xc0, 0x82,
- 0xcf, 0x1e, 0x3e, 0x6e, 0x00, 0x16, 0x2e, 0x0c, 0x08, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00,
- 0x04, 0x00, 0x2c, 0x14, 0x00, 0x1c, 0x00, 0x12, 0x00, 0x04, 0x00, 0x00, 0x08, 0x38, 0x00, 0x09,
- 0x08, 0x1c, 0x48, 0x30, 0x9d, 0xc1, 0x74, 0xef, 0x08, 0x2a, 0x1c, 0x88, 0xc1, 0x20, 0x3a, 0x74,
- 0xea, 0xda, 0x35, 0x10, 0x18, 0x01, 0x5e, 0x3a, 0x75, 0x08, 0x32, 0x34, 0xc0, 0x00, 0xe6, 0xd9,
- 0x16, 0x19, 0x30, 0x68, 0x98, 0xfa, 0xd2, 0x87, 0x00, 0x3e, 0x76, 0xed, 0x06, 0xe0, 0x02, 0xe3,
- 0xa9, 0xc6, 0xc2, 0x81, 0x01, 0x01, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x02, 0x00, 0x2c,
- 0x14, 0x00, 0x1d, 0x00, 0x13, 0x00, 0x05, 0x00, 0x00, 0x08, 0x3e, 0x00, 0x05, 0x08, 0x1c, 0x48,
- 0x50, 0x60, 0xba, 0x83, 0x05, 0x13, 0x0a, 0x78, 0x10, 0xef, 0xa0, 0xc3, 0x74, 0xea, 0x1a, 0x08,
- 0xc8, 0xe0, 0x2e, 0x9d, 0xc0, 0x11, 0x15, 0x21, 0xda, 0x8b, 0x74, 0xc5, 0x93, 0x27, 0x4a, 0x5f,
- 0xf0, 0x19, 0x99, 0x66, 0x4e, 0x5d, 0x3c, 0x12, 0xea, 0xd8, 0xd9, 0x7b, 0xa6, 0x45, 0x21, 0x41,
- 0x5d, 0xa6, 0x4c, 0x69, 0x61, 0xe1, 0x92, 0x60, 0x40, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00,
- 0x00, 0x00, 0x2c, 0x13, 0x00, 0x1f, 0x00, 0x15, 0x00, 0x04, 0x00, 0x00, 0x08, 0x39, 0x00, 0x01,
- 0x08, 0x1c, 0x48, 0x30, 0x9d, 0xc1, 0x83, 0x06, 0xdb, 0x31, 0x10, 0xb8, 0xc1, 0xe0, 0x40, 0x84,
- 0xe9, 0xd0, 0xd9, 0xfb, 0x42, 0xf1, 0x8b, 0x3d, 0x0f, 0x00, 0x82, 0x7d, 0x31, 0xe7, 0x4e, 0x1d,
- 0x42, 0x73, 0xdb, 0x28, 0xc1, 0x20, 0x28, 0xb0, 0xc6, 0x40, 0x15, 0xcb, 0x88, 0x3d, 0x7b, 0x46,
- 0x49, 0x96, 0x0a, 0x92, 0x30, 0x03, 0x02, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x07, 0x00, 0x01, 0x00,
- 0x2c, 0x13, 0x00, 0x20, 0x00, 0x15, 0x00, 0x04, 0x00, 0x00, 0x08, 0x39, 0x00, 0x03, 0x08, 0x1c,
- 0x48, 0x50, 0x60, 0xba, 0x83, 0x08, 0xd3, 0x09, 0xa4, 0xa0, 0x4e, 0x61, 0xc1, 0x84, 0xe9, 0xd8,
- 0xd9, 0x9b, 0xa8, 0x0f, 0x5d, 0x84, 0x55, 0xdb, 0xcc, 0x45, 0xf0, 0x00, 0x51, 0x9d, 0xbd, 0x2f,
- 0xa6, 0x6a, 0x10, 0x94, 0x11, 0x4b, 0x20, 0x0b, 0x5f, 0x5f, 0xb6, 0xe1, 0xc3, 0x17, 0xe9, 0x19,
- 0x92, 0x82, 0x05, 0x03, 0x02, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x00, 0x00, 0x2c, 0x13,
- 0x00, 0x21, 0x00, 0x15, 0x00, 0x04, 0x00, 0x00, 0x08, 0x3b, 0x00, 0x01, 0x08, 0x1c, 0x48, 0x90,
- 0x60, 0xba, 0x83, 0x08, 0x01, 0x20, 0x38, 0x58, 0x50, 0x20, 0x42, 0x84, 0xea, 0xd8, 0xa1, 0x4b,
- 0x87, 0x01, 0xd3, 0x36, 0x73, 0xf1, 0xd4, 0x3d, 0x44, 0x88, 0xce, 0xde, 0x17, 0x53, 0x32, 0x6a,
- 0xc0, 0xd0, 0xf2, 0x49, 0x20, 0x0b, 0x4f, 0x5f, 0xec, 0x99, 0x63, 0xc7, 0xce, 0xde, 0x36, 0x4a,
- 0x32, 0x1a, 0x0a, 0x0c, 0x08, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00, 0x00, 0x00, 0x2c, 0x13,
- 0x00, 0x22, 0x00, 0x15, 0x00, 0x05, 0x00, 0x00, 0x08, 0x3c, 0x00, 0x01, 0x08, 0x1c, 0x48, 0xb0,
- 0x20, 0x80, 0x74, 0x08, 0x05, 0x7a, 0x48, 0x68, 0x50, 0x20, 0xc2, 0x87, 0x0f, 0xdf, 0x81, 0xc1,
- 0xc7, 0x0e, 0xa2, 0x45, 0x84, 0xec, 0xf0, 0x7d, 0xa1, 0xe4, 0x49, 0x53, 0x35, 0x81, 0x2c, 0x3c,
- 0x7d, 0xb1, 0xa7, 0xee, 0xa1, 0x3a, 0x7d, 0x5f, 0x3c, 0xd5, 0x68, 0x58, 0x50, 0x86, 0xa9, 0x52,
- 0xa6, 0x64, 0xb0, 0x14, 0x18, 0x10, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x00, 0x00, 0x2c,
- 0x13, 0x00, 0x24, 0x00, 0x15, 0x00, 0x04, 0x00, 0x00, 0x08, 0x36, 0x00, 0xdd, 0xa5, 0x4b, 0x07,
- 0xa0, 0xa0, 0xc1, 0x83, 0x00, 0x06, 0x2a, 0x4c, 0x07, 0x6f, 0x9b, 0x3d, 0x76, 0x0b, 0x0d, 0x2e,
- 0x1c, 0x68, 0x0e, 0x5f, 0xa4, 0x48, 0xdb, 0x0a, 0xd6, 0xf0, 0x14, 0x89, 0xde, 0xc4, 0x74, 0xe8,
- 0xec, 0x7d, 0x31, 0xa5, 0x02, 0x21, 0x42, 0x2d, 0x57, 0xbe, 0xa8, 0xa4, 0x94, 0xc3, 0x64, 0xc1,
- 0x80, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x07, 0x00, 0x01, 0x00, 0x2c, 0x13, 0x00, 0x25, 0x00, 0x15,
- 0x00, 0x04, 0x00, 0x00, 0x08, 0x36, 0x00, 0xdb, 0xa5, 0x4b, 0x17, 0xa0, 0xa0, 0xc1, 0x83, 0x06,
- 0x07, 0x0e, 0x54, 0x87, 0x8f, 0x1e, 0x3a, 0x85, 0x08, 0x03, 0x28, 0x5c, 0xc8, 0x4e, 0x9f, 0xbd,
- 0x82, 0x32, 0x34, 0x6d, 0xa3, 0x37, 0x71, 0x22, 0x3b, 0x7b, 0xcf, 0xb4, 0xa8, 0x88, 0x18, 0x40,
- 0x85, 0xa9, 0x2f, 0xdb, 0xec, 0xa9, 0x8c, 0x44, 0x49, 0x46, 0xc4, 0x80, 0x00, 0x21, 0xf9, 0x04,
- 0x05, 0x03, 0x00, 0x01, 0x00, 0x2c, 0x13, 0x00, 0x26, 0x00, 0x15, 0x00, 0x04, 0x00, 0x00, 0x08,
- 0x34, 0x00, 0xdd, 0xa5, 0x4b, 0x17, 0xa0, 0xa0, 0xc1, 0x83, 0x07, 0x07, 0xa6, 0x83, 0xe7, 0x41,
- 0xe1, 0x40, 0x84, 0x06, 0x1d, 0x0e, 0x7c, 0xe7, 0x4c, 0x86, 0x2c, 0x4a, 0x5f, 0xcc, 0x49, 0x94,
- 0x68, 0x6e, 0xdb, 0x15, 0x59, 0x8c, 0x20, 0x9a, 0xfa, 0x62, 0x8f, 0x9d, 0xba, 0x74, 0xec, 0xec,
- 0x7d, 0x31, 0x85, 0x30, 0x20, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x00, 0x00, 0x2c, 0x13,
- 0x00, 0x28, 0x00, 0x15, 0x00, 0x04, 0x00, 0x00, 0x08, 0x38, 0x00, 0x11, 0xa4, 0x1b, 0x38, 0x10,
- 0x80, 0xc1, 0x83, 0x08, 0x09, 0xa6, 0x53, 0x60, 0x84, 0x12, 0xa5, 0x67, 0xdb, 0xe8, 0x29, 0x4c,
- 0x07, 0x60, 0x22, 0x3a, 0x7b, 0x91, 0x8c, 0x20, 0x04, 0xa0, 0x62, 0xcb, 0x17, 0x7b, 0xe8, 0x14,
- 0xb2, 0xb3, 0xf7, 0x6c, 0xc6, 0xc6, 0x93, 0x00, 0x60, 0x98, 0xf2, 0xe4, 0x49, 0x0b, 0x8b, 0x93,
- 0x01, 0x01, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00, 0x01, 0x00, 0x2c, 0x13, 0x00, 0x29, 0x00,
- 0x15, 0x00, 0x04, 0x00, 0x00, 0x08, 0x3a, 0x00, 0x29, 0xa8, 0x4b, 0x47, 0x30, 0x5d, 0x80, 0x83,
- 0x08, 0x13, 0x06, 0x20, 0xa8, 0x8e, 0x41, 0x00, 0x6e, 0x91, 0x22, 0x6d, 0xa3, 0x37, 0x90, 0x60,
- 0xc2, 0x82, 0x04, 0x21, 0x28, 0x3c, 0xa8, 0xe5, 0x8b, 0x3d, 0x74, 0x18, 0xd3, 0xa9, 0xa3, 0x17,
- 0x49, 0x53, 0xb0, 0x8d, 0x09, 0x65, 0x78, 0x7a, 0xf6, 0xe5, 0x0b, 0x25, 0x2d, 0x2a, 0x12, 0x06,
- 0x04, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x06, 0x00, 0x04, 0x00, 0x2c, 0x14, 0x00, 0x2a, 0x00, 0x13,
- 0x00, 0x04, 0x00, 0x00, 0x08, 0x30, 0x00, 0x1f, 0xa4, 0x1b, 0x38, 0x90, 0x80, 0xc1, 0x83, 0x08,
- 0x0f, 0x66, 0xc0, 0x87, 0xcf, 0x1e, 0x3d, 0x74, 0x04, 0x13, 0x12, 0x84, 0x47, 0x21, 0x21, 0x8d,
- 0x2b, 0xf8, 0xd8, 0x11, 0xdc, 0xd8, 0x6e, 0x40, 0x42, 0x84, 0x30, 0x3c, 0x7d, 0xd9, 0x86, 0x6f,
- 0xdb, 0x17, 0x4f, 0x07, 0x03, 0x02, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00, 0x01, 0x00, 0x2c,
- 0x15, 0x00, 0x2b, 0x00, 0x11, 0x00, 0x04, 0x00, 0x00, 0x08, 0x2c, 0x00, 0xdd, 0xa5, 0x1b, 0x98,
- 0x2e, 0x80, 0xc1, 0x83, 0x08, 0x0d, 0x46, 0xa0, 0xa7, 0x8f, 0x1e, 0x3a, 0x82, 0x09, 0x0d, 0xaa,
- 0x4b, 0x08, 0xc3, 0x53, 0x24, 0x7d, 0xea, 0x08, 0x0e, 0x54, 0xd7, 0x20, 0xe2, 0x41, 0x2d, 0xcf,
- 0xb6, 0xd9, 0x1b, 0xc9, 0xcd, 0x60, 0x40, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x00, 0x00,
- 0x2c, 0x16, 0x00, 0x2c, 0x00, 0x0e, 0x00, 0x04, 0x00, 0x00, 0x08, 0x27, 0x00, 0xdb, 0xa5, 0x1b,
- 0x08, 0xa0, 0xa0, 0xc1, 0x83, 0x23, 0xd8, 0x99, 0x43, 0x37, 0x90, 0xe0, 0xc1, 0x83, 0x35, 0xb4,
- 0x3c, 0xb3, 0xc7, 0xae, 0xe1, 0xc0, 0x0d, 0x0f, 0x0b, 0xc2, 0xa0, 0x14, 0xc9, 0x1e, 0x3d, 0x73,
- 0x19, 0x02, 0x02, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x00, 0x00, 0x2c, 0x17, 0x00, 0x2d,
- 0x00, 0x0c, 0x00, 0x04, 0x00, 0x00, 0x08, 0x24, 0x00, 0xd5, 0xa5, 0x4b, 0x07, 0xa0, 0xa0, 0x41,
- 0x83, 0x1b, 0xd8, 0xb1, 0x1b, 0x38, 0xf0, 0x60, 0x41, 0x28, 0x2a, 0x64, 0x78, 0xfa, 0x62, 0x0f,
- 0x1d, 0xc3, 0x76, 0x0e, 0x0b, 0xe6, 0x78, 0x86, 0x4f, 0xdf, 0x86, 0x80, 0x00, 0x21, 0xf9, 0x04,
- 0x05, 0x07, 0x00, 0x00, 0x00, 0x2c, 0x17, 0x00, 0x2e, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x00, 0x08,
- 0x23, 0x00, 0x01, 0xa4, 0x4b, 0x07, 0xa0, 0xa0, 0x41, 0x83, 0x19, 0xe0, 0xb1, 0x63, 0xa7, 0x6e,
- 0x20, 0xc1, 0x83, 0x06, 0x69, 0x78, 0xfa, 0xa2, 0xaf, 0x61, 0xba, 0x07, 0x10, 0x0d, 0x6a, 0x79,
- 0x86, 0x6f, 0x44, 0x40, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x00, 0x00, 0x2c, 0x18, 0x00,
- 0x2f, 0x00, 0x0b, 0x00, 0x04, 0x00, 0x00, 0x08, 0x23, 0x00, 0x01, 0xa4, 0x1b, 0x08, 0xa0, 0xa0,
- 0x41, 0x00, 0x1b, 0xd8, 0xd1, 0x33, 0x87, 0x6e, 0x60, 0x3a, 0x83, 0xcd, 0x54, 0x14, 0x84, 0x61,
- 0xea, 0x8b, 0x3d, 0x75, 0x0f, 0x0f, 0x1e, 0xe4, 0xf5, 0xcc, 0x41, 0x40, 0x00, 0x21, 0xf9, 0x04,
- 0x05, 0x04, 0x00, 0x00, 0x00, 0x2c, 0x18, 0x00, 0x30, 0x00, 0x0b, 0x00, 0x04, 0x00, 0x00, 0x08,
- 0x1e, 0x00, 0x01, 0xa4, 0x1b, 0x98, 0x0e, 0x80, 0xc1, 0x83, 0x23, 0xcc, 0xd9, 0x5b, 0x68, 0x4e,
- 0xdd, 0xc0, 0x83, 0x10, 0x01, 0x20, 0x79, 0x66, 0x8f, 0x5d, 0x86, 0x88, 0x18, 0x03, 0x02, 0x00,
- 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x00, 0x00, 0x2c, 0x18, 0x00, 0x31, 0x00, 0x0a, 0x00, 0x03,
- 0x00, 0x00, 0x08, 0x1a, 0x00, 0x01, 0xa4, 0x1b, 0x48, 0x10, 0x80, 0xc1, 0x0c, 0xf4, 0xf0, 0x45,
- 0x5a, 0x68, 0x8f, 0x5d, 0x3a, 0x75, 0x06, 0x23, 0x1a, 0x64, 0x61, 0x8a, 0x5b, 0x40, 0x00, 0x21,
- 0xf9, 0x04, 0x05, 0x07, 0x00, 0x00, 0x00, 0x2c, 0x19, 0x00, 0x32, 0x00, 0x09, 0x00, 0x02, 0x00,
- 0x00, 0x08, 0x14, 0x00, 0xd5, 0xa5, 0x1b, 0x48, 0x10, 0x00, 0x00, 0x12, 0x91, 0x28, 0x99, 0x32,
- 0xe5, 0xe9, 0x0b, 0x3e, 0x04, 0x01, 0x01, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x00, 0x00,
- 0x2c, 0x19, 0x00, 0x33, 0x00, 0x09, 0x00, 0x02, 0x00, 0x00, 0x08, 0x15, 0x00, 0x11, 0xa8, 0x53,
- 0x67, 0xce, 0x9e, 0x3d, 0x73, 0xe8, 0x00, 0x00, 0xa0, 0x70, 0x4b, 0xa1, 0x42, 0x66, 0x00, 0x02,
- 0x02, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x00, 0x00, 0x2c, 0x1a, 0x00, 0x33, 0x00, 0x07,
- 0x00, 0x02, 0x00, 0x00, 0x08, 0x0e, 0x00, 0x01, 0xa4, 0x1b, 0x38, 0x50, 0x1d, 0x80, 0x11, 0x08,
- 0x11, 0x32, 0x08, 0x08, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x21, 0x00, 0x00, 0x00, 0x2c, 0x1d, 0x00,
- 0x34, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x02, 0x02, 0x84, 0x0b, 0x00, 0x3b,
+ 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x3c, 0x00, 0x50, 0x00, 0xf7, 0x00, 0x00, 0xfa, 0xfb, 0xfb,
+ 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xd9, 0xec, 0xfe, 0x1e, 0x93, 0xfe, 0x23, 0x95, 0xfd, 0x5f,
+ 0xb2, 0xff, 0x52, 0xac, 0xfe, 0xb1, 0xd8, 0xff, 0xce, 0xe7, 0xff, 0xa3, 0xd2, 0xff, 0x80, 0xc0,
+ 0xfe, 0xe2, 0xf1, 0xfe, 0xca, 0xe5, 0xff, 0xf4, 0xf7, 0xf9, 0x8b, 0xc4, 0xff, 0x7e, 0xbe, 0xff,
+ 0xe0, 0xee, 0xff, 0xc6, 0xe4, 0xff, 0xbc, 0xde, 0xff, 0xec, 0xf5, 0xff, 0x1d, 0x92, 0xfd, 0x3f,
+ 0x9f, 0xfe, 0x71, 0xbb, 0xff, 0x9f, 0xcf, 0xfe, 0xf2, 0xf9, 0xff, 0x31, 0x9c, 0xfe, 0x98, 0xcb,
+ 0xff, 0x49, 0xa8, 0xfe, 0xbe, 0xe0, 0xff, 0x6d, 0xb3, 0xfe, 0x4c, 0xa9, 0xfe, 0xc4, 0xe2, 0xff,
+ 0x4a, 0xa8, 0xfe, 0x45, 0xa3, 0xfa, 0xd2, 0xe7, 0xfc, 0xbd, 0xde, 0xff, 0xf9, 0xf9, 0xf9, 0xf7,
+ 0xf8, 0xf8, 0xe2, 0xe2, 0xe2, 0xdd, 0xde, 0xdd, 0xe5, 0xea, 0xef, 0xff, 0xb7, 0x50, 0xff, 0xba,
+ 0x56, 0xfd, 0xb7, 0x51, 0xff, 0xb7, 0x4f, 0xff, 0xb8, 0x50, 0xc5, 0xc4, 0xc1, 0xfa, 0xb7, 0x55,
+ 0xee, 0xb3, 0x5b, 0xf7, 0xb5, 0x57, 0xf1, 0xb5, 0x5e, 0xf5, 0xb6, 0x5b, 0xfd, 0xb7, 0x54, 0xcd,
+ 0xcd, 0xcc, 0xe5, 0xe8, 0xea, 0xcf, 0xb2, 0x85, 0xf5, 0xb8, 0x5f, 0xee, 0xef, 0xf0, 0xc0, 0xbf,
+ 0xbe, 0xe4, 0xb1, 0x66, 0xff, 0xb7, 0x51, 0xda, 0xda, 0xda, 0xec, 0xed, 0xee, 0xdf, 0xdf, 0xdf,
+ 0xd1, 0xd2, 0xd1, 0xe4, 0xe5, 0xe5, 0xff, 0xe5, 0xbf, 0xff, 0xc5, 0x73, 0xff, 0xeb, 0xce, 0xf0,
+ 0xf3, 0xf5, 0xc8, 0xc8, 0xc8, 0xed, 0xb4, 0x61, 0xd8, 0xd8, 0xd7, 0xff, 0xdb, 0xa7, 0xff, 0xe1,
+ 0xb7, 0xff, 0xc1, 0x68, 0xfc, 0xf7, 0xee, 0xff, 0xc9, 0x7c, 0xff, 0xd2, 0x92, 0xfa, 0xba, 0x5e,
+ 0xff, 0xcc, 0x84, 0xff, 0xe8, 0xc6, 0xff, 0xfb, 0xf6, 0xff, 0xf5, 0xe8, 0xff, 0xf9, 0xf1, 0xff,
+ 0xed, 0xd5, 0xc9, 0xba, 0xa0, 0xf1, 0xf1, 0xf1, 0xf6, 0xf6, 0xf6, 0xeb, 0xb7, 0x6a, 0xe3, 0xb5,
+ 0x6f, 0xff, 0xbd, 0x5f, 0xa9, 0xa9, 0xa9, 0xd6, 0xd6, 0xd6, 0xb2, 0xb2, 0xb2, 0xb9, 0xb9, 0xb9,
+ 0x97, 0x98, 0x96, 0x9e, 0x9e, 0x9e, 0xa5, 0xa5, 0xa5, 0x45, 0x45, 0x45, 0x46, 0x46, 0x46, 0x47,
+ 0x47, 0x47, 0x4a, 0x4a, 0x4a, 0x4d, 0x4d, 0x4d, 0x50, 0x50, 0x50, 0x53, 0x53, 0x53, 0x58, 0x58,
+ 0x58, 0x5a, 0x5a, 0x5a, 0x5d, 0x5d, 0x5d, 0x5f, 0x5f, 0x5f, 0x63, 0x63, 0x63, 0x66, 0x66, 0x66,
+ 0x6a, 0x6a, 0x6a, 0x6d, 0x6d, 0x6d, 0x70, 0x70, 0x70, 0x75, 0x75, 0x75, 0x79, 0x79, 0x79, 0x7c,
+ 0x7c, 0x7c, 0x80, 0x80, 0x80, 0x84, 0x84, 0x84, 0x88, 0x88, 0x88, 0x8b, 0x8b, 0x8b, 0x8f, 0x8f,
+ 0x8f, 0xd5, 0xd5, 0xd5, 0xe7, 0xe7, 0xe7, 0xea, 0xea, 0xea, 0xf4, 0xf4, 0xf4, 0xf2, 0xf4, 0xf5,
+ 0xff, 0xd6, 0x9b, 0xff, 0xde, 0xaf, 0xff, 0xfe, 0xfc, 0xff, 0xf1, 0xde, 0xff, 0xd6, 0x9c, 0xff,
+ 0xcf, 0x8b, 0xfa, 0xd6, 0xa1, 0xf7, 0xc4, 0x7b, 0xf8, 0xbd, 0x67, 0xeb, 0xb5, 0x65, 0xf9, 0xf9,
+ 0xf8, 0xf1, 0xdb, 0xbb, 0xdb, 0xd7, 0xce, 0xe3, 0xdb, 0xcc, 0xda, 0xd2, 0xc3, 0xe3, 0xd6, 0xc0,
+ 0xae, 0xae, 0xae, 0xe4, 0xcb, 0xa6, 0xe5, 0xe2, 0xdc, 0xd0, 0xb8, 0x90, 0x56, 0x56, 0x56, 0xcd,
+ 0xcb, 0xc6, 0xcf, 0xc4, 0xaf, 0xcf, 0xc9, 0xbc, 0xd0, 0xbe, 0xa0, 0xd8, 0xbb, 0x8e, 0xd8, 0xbf,
+ 0x98, 0xd8, 0xc5, 0xa5, 0xd8, 0xd4, 0xcb, 0xda, 0xb7, 0x82, 0xdb, 0xca, 0xaf, 0xdb, 0xcd, 0xb6,
+ 0xdd, 0xbe, 0x8e, 0xdd, 0xc3, 0x9b, 0xdd, 0xdb, 0xd5, 0xde, 0xc8, 0xa5, 0xe0, 0xbb, 0x82, 0xe2,
+ 0xb8, 0x79, 0xe4, 0xc2, 0x8e, 0xe4, 0xc6, 0x99, 0xe4, 0xd1, 0xb3, 0xe5, 0xbe, 0x84, 0xe5, 0xdf,
+ 0xd4, 0xe9, 0xdb, 0xc5, 0xe9, 0xde, 0xce, 0xea, 0xbe, 0x7b, 0xea, 0xc1, 0x85, 0xea, 0xd3, 0xb0,
+ 0xea, 0xd8, 0xbc, 0xeb, 0xba, 0x71, 0xeb, 0xc5, 0x8e, 0xeb, 0xcb, 0x9a, 0xeb, 0xe4, 0xd9, 0xec,
+ 0xd0, 0xa5, 0xec, 0xe9, 0xe3, 0xed, 0xec, 0xea, 0xef, 0xe7, 0xd9, 0xf0, 0xbc, 0x71, 0xf0, 0xc0,
+ 0x7a, 0xf1, 0xb9, 0x68, 0xf3, 0xf0, 0xea, 0xf4, 0xc7, 0x86, 0xf4, 0xcb, 0x8e, 0xf7, 0xc0, 0x71,
+ 0xf9, 0xf7, 0xf4, 0xfd, 0xf5, 0xeb, 0xf5, 0xd0, 0x99, 0xda, 0xcf, 0xbd, 0xdc, 0xb1, 0x6f, 0xf2,
+ 0xd7, 0xb0, 0xed, 0xdf, 0xca, 0xc8, 0xb3, 0x8f, 0xd9, 0xb3, 0x78, 0xd2, 0xb0, 0x7c, 0xf3, 0xed,
+ 0xe4, 0xf4, 0xf3, 0xf1, 0xf5, 0xea, 0xd8, 0xf5, 0xe3, 0xc9, 0xc1, 0xb7, 0xa3, 0xc5, 0xbe, 0xaf,
+ 0xd7, 0xac, 0x6b, 0xc1, 0xb2, 0x95, 0xd2, 0xd6, 0xd6, 0xcf, 0xa9, 0x70, 0xbc, 0xb9, 0xb1, 0xc7,
+ 0xa8, 0x76, 0x41, 0x84, 0xd5, 0xb0, 0xa2, 0x86, 0x39, 0x81, 0xd9, 0x78, 0x92, 0xad, 0x88, 0xa0,
+ 0xb5, 0xb9, 0xcf, 0xe9, 0xbf, 0xa5, 0x7b, 0x40, 0x83, 0xd4, 0x80, 0x95, 0xa8, 0x80, 0x96, 0xa9,
+ 0x49, 0x86, 0xcf, 0x87, 0x96, 0xa2, 0x48, 0x85, 0xcd, 0x60, 0x8c, 0xbe, 0x2e, 0x7e, 0xdf, 0x18,
+ 0x78, 0xee, 0x9e, 0xbd, 0xe1, 0x06, 0x74, 0xfc, 0x00, 0x72, 0xff, 0x01, 0x73, 0xff, 0x47, 0xa1,
+ 0xfe, 0x0e, 0x76, 0xf7, 0x16, 0x7d, 0xfc, 0x32, 0x8d, 0xfe, 0x61, 0xa7, 0xfe, 0x24, 0x85, 0xfc,
+ 0x55, 0xa1, 0xff, 0x54, 0xa1, 0xff, 0x1e, 0x88, 0xfa, 0x20, 0x7b, 0xea, 0x9e, 0x9c, 0x93, 0x61,
+ 0x9c, 0xdc, 0x6f, 0x90, 0xb3, 0x84, 0xaf, 0xe1, 0x54, 0x89, 0xc6, 0x24, 0x7c, 0xe7, 0xa7, 0x9f,
+ 0x8c, 0x68, 0x8e, 0xb7, 0x8f, 0x98, 0x9d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xff, 0x0b,
+ 0x4e, 0x45, 0x54, 0x53, 0x43, 0x41, 0x50, 0x45, 0x32, 0x2e, 0x30, 0x03, 0x01, 0x00, 0x00, 0x00,
+ 0x21, 0xf9, 0x04, 0x05, 0x25, 0x00, 0x04, 0x00, 0x21, 0xfe, 0x23, 0x52, 0x65, 0x73, 0x69, 0x7a,
+ 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x65, 0x7a,
+ 0x67, 0x69, 0x66, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x00, 0x2c,
+ 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x50, 0x00, 0x00, 0x08, 0xff, 0x00, 0x03, 0x08, 0x1c, 0x48,
+ 0xb0, 0xa0, 0xc1, 0x83, 0x08, 0x13, 0x2a, 0x5c, 0xc8, 0xb0, 0xa1, 0xc3, 0x87, 0x10, 0x23, 0x4a,
+ 0x9c, 0x48, 0xb1, 0xa2, 0xc5, 0x8b, 0x18, 0x33, 0x6a, 0xdc, 0xc8, 0xb1, 0xa3, 0xc7, 0x8f, 0x20,
+ 0x43, 0x8a, 0x1c, 0x49, 0xb2, 0xa4, 0xc9, 0x93, 0x28, 0x53, 0xaa, 0x5c, 0xc9, 0xb2, 0xa5, 0xcb,
+ 0x97, 0x30, 0x63, 0xca, 0x9c, 0x49, 0xb3, 0xa6, 0xcd, 0x9b, 0x38, 0x63, 0x52, 0x50, 0xf0, 0xae,
+ 0x5d, 0x3a, 0x75, 0xf1, 0x36, 0x44, 0x88, 0x99, 0xe1, 0x81, 0xba, 0x74, 0x48, 0x93, 0x22, 0x7d,
+ 0xc7, 0xc0, 0x65, 0x04, 0x77, 0x48, 0xdd, 0x61, 0x18, 0x81, 0x41, 0x69, 0xba, 0x76, 0x0d, 0x58,
+ 0x46, 0x80, 0xf7, 0x13, 0x41, 0x86, 0x06, 0x0f, 0xe2, 0x59, 0xfd, 0x99, 0x35, 0x65, 0x06, 0xa8,
+ 0xed, 0x06, 0x8c, 0x80, 0x3a, 0x36, 0x69, 0xbb, 0xa6, 0x28, 0x37, 0x20, 0x8d, 0x47, 0xe2, 0x68,
+ 0x5b, 0xa5, 0x1e, 0x50, 0x52, 0x38, 0xea, 0xce, 0xee, 0x5d, 0xab, 0x43, 0x4d, 0x22, 0x40, 0x1a,
+ 0xc1, 0xc3, 0xdf, 0xb1, 0x18, 0x4e, 0x1a, 0x4e, 0x17, 0xcf, 0xef, 0xe1, 0xa5, 0x27, 0xd9, 0x3e,
+ 0x1e, 0x0b, 0xef, 0xa4, 0xcf, 0xc9, 0x63, 0xd5, 0x45, 0xc6, 0x4c, 0x59, 0x31, 0x67, 0xab, 0xef,
+ 0x4e, 0x0e, 0xfe, 0x9c, 0x54, 0xc1, 0xc9, 0xbd, 0xa4, 0x7f, 0xc2, 0x35, 0xf9, 0x20, 0x35, 0x04,
+ 0xb3, 0x92, 0x27, 0xc3, 0xa3, 0xa0, 0x32, 0xc2, 0xe5, 0xc7, 0xea, 0x06, 0xb0, 0x1c, 0xe1, 0xb8,
+ 0xad, 0xba, 0xb2, 0x2c, 0xe5, 0x1e, 0xde, 0xf0, 0x32, 0x03, 0xd7, 0xbb, 0xed, 0x32, 0xc0, 0x14,
+ 0xde, 0xf6, 0x41, 0xcc, 0x11, 0x7f, 0x47, 0x10, 0xed, 0x8d, 0x54, 0x9d, 0xf2, 0x98, 0x08, 0x7a,
+ 0xab, 0x43, 0x40, 0x93, 0xc2, 0x88, 0xef, 0xdf, 0x57, 0xe7, 0x9c, 0xa4, 0xf9, 0xe7, 0x8b, 0xf9,
+ 0xf3, 0xe6, 0xb3, 0xc8, 0xec, 0xc3, 0xa6, 0xbd, 0xfb, 0xf6, 0x7d, 0x64, 0x9a, 0x78, 0xff, 0x1e,
+ 0xcb, 0xcc, 0x3d, 0xf4, 0xd9, 0xe4, 0xa1, 0x29, 0x44, 0x4d, 0x99, 0xff, 0x65, 0xa4, 0x01, 0x44,
+ 0x4d, 0x7d, 0xec, 0x71, 0x86, 0x19, 0x7a, 0x9c, 0x80, 0x13, 0x00, 0x00, 0x8c, 0xe7, 0xe0, 0x83,
+ 0x30, 0x99, 0xf0, 0x07, 0x16, 0x3a, 0xfc, 0x80, 0x8b, 0x1f, 0x7e, 0xf4, 0xa1, 0xe1, 0x86, 0x1c,
+ 0xf6, 0x81, 0xa1, 0x1f, 0xb8, 0xfc, 0xa0, 0x03, 0x16, 0x7f, 0x98, 0xf0, 0xd1, 0x0f, 0x7d, 0x08,
+ 0x71, 0x02, 0x10, 0x28, 0xf8, 0xe0, 0x43, 0x12, 0x49, 0x78, 0xc1, 0xc7, 0x8c, 0x34, 0xce, 0xe8,
+ 0x05, 0x8c, 0x2e, 0xa2, 0x00, 0xc4, 0x09, 0x42, 0xf4, 0xf1, 0x03, 0x84, 0x40, 0x06, 0x29, 0xe4,
+ 0x90, 0x44, 0x16, 0x69, 0xe4, 0x91, 0x48, 0x56, 0x74, 0x5d, 0x00, 0x4b, 0xce, 0x94, 0x01, 0x03,
+ 0x14, 0x30, 0x00, 0x00, 0x94, 0x51, 0x52, 0x40, 0x1b, 0x4c, 0x03, 0x50, 0x99, 0xc1, 0x00, 0x19,
+ 0x58, 0x49, 0x41, 0x93, 0x2d, 0x05, 0x04, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x06, 0x00, 0x00, 0x00,
+ 0x2c, 0x19, 0x00, 0x33, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x08, 0x0c, 0x00, 0xb9, 0xd9, 0x43,
+ 0x07, 0x00, 0x80, 0xb0, 0x5b, 0x00, 0x02, 0x02, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00, 0x00,
+ 0x00, 0x2c, 0x19, 0x00, 0x32, 0x00, 0x07, 0x00, 0x03, 0x00, 0x00, 0x08, 0x16, 0x00, 0xe9, 0xa9,
+ 0x03, 0x40, 0x90, 0xa0, 0xb3, 0x19, 0x57, 0xf0, 0xb1, 0x2b, 0x08, 0xc0, 0x8a, 0x95, 0x66, 0x29,
+ 0x00, 0x04, 0x04, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x02, 0x00, 0x2c, 0x18, 0x00, 0x32,
+ 0x00, 0x09, 0x00, 0x03, 0x00, 0x00, 0x08, 0x19, 0x00, 0x4b, 0x94, 0xba, 0xb2, 0xcd, 0x9c, 0x80,
+ 0x83, 0x08, 0x55, 0xb4, 0xe8, 0x61, 0xea, 0x8b, 0x3d, 0x74, 0x08, 0x0f, 0x5a, 0x99, 0x28, 0x2c,
+ 0x20, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x00, 0x00, 0x2c, 0x18, 0x00, 0x31, 0x00, 0x0a,
+ 0x00, 0x04, 0x00, 0x00, 0x08, 0x20, 0x00, 0x53, 0x6c, 0xb3, 0x47, 0x4f, 0x1d, 0x80, 0x83, 0x07,
+ 0x17, 0xd5, 0x68, 0xd1, 0x42, 0xcb, 0x33, 0x7b, 0xec, 0x10, 0x22, 0x64, 0xd8, 0x42, 0x86, 0x26,
+ 0x6e, 0x12, 0x33, 0x02, 0x08, 0x08, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x07, 0x00, 0x00, 0x00, 0x2c,
+ 0x18, 0x00, 0x30, 0x00, 0x0a, 0x00, 0x04, 0x00, 0x00, 0x08, 0x20, 0x00, 0x01, 0xa0, 0x53, 0x07,
+ 0xa0, 0xa0, 0x41, 0x00, 0xcb, 0x64, 0xc8, 0xd0, 0x42, 0x69, 0x9b, 0xb9, 0x83, 0x06, 0x5b, 0x48,
+ 0x34, 0xf5, 0xc5, 0x1e, 0xc4, 0x82, 0x2d, 0x54, 0x30, 0x0a, 0x08, 0x00, 0x21, 0xf9, 0x04, 0x05,
+ 0x03, 0x00, 0x00, 0x00, 0x2c, 0x18, 0x00, 0x30, 0x00, 0x0b, 0x00, 0x03, 0x00, 0x00, 0x08, 0x1d,
+ 0x00, 0xb9, 0x7d, 0x19, 0x18, 0xc9, 0x1e, 0x3a, 0x00, 0x08, 0x01, 0x10, 0x6a, 0xc1, 0x90, 0xa1,
+ 0x0c, 0x4a, 0xdb, 0xcc, 0x25, 0x9c, 0x08, 0x80, 0x61, 0x8d, 0x60, 0x01, 0x01, 0x00, 0x21, 0xf9,
+ 0x04, 0x05, 0x04, 0x00, 0x00, 0x00, 0x2c, 0x18, 0x00, 0x2f, 0x00, 0x0b, 0x00, 0x04, 0x00, 0x00,
+ 0x08, 0x22, 0x00, 0x01, 0xb0, 0xd3, 0x67, 0xcf, 0x1e, 0x3b, 0x00, 0x08, 0x11, 0xc6, 0xaa, 0xd1,
+ 0xa2, 0x21, 0x0b, 0x2d, 0x5f, 0xec, 0xa1, 0x4b, 0x48, 0xb1, 0x61, 0x0b, 0x1a, 0xb7, 0x28, 0x6a,
+ 0xec, 0x01, 0x20, 0x20, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x00, 0x00, 0x2c, 0x18, 0x00,
+ 0x2f, 0x00, 0x0b, 0x00, 0x03, 0x00, 0x00, 0x08, 0x1f, 0x00, 0xed, 0x7d, 0xd1, 0xa4, 0x45, 0x91,
+ 0x16, 0x4a, 0x91, 0xec, 0xa9, 0x03, 0x60, 0xac, 0x05, 0x80, 0x87, 0x2d, 0x22, 0xb6, 0x40, 0x12,
+ 0xe4, 0xa1, 0xc5, 0x8b, 0x2d, 0x9a, 0x05, 0x04, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x07, 0x00, 0x00,
+ 0x00, 0x2c, 0x17, 0x00, 0x2e, 0x00, 0x0d, 0x00, 0x03, 0x00, 0x00, 0x08, 0x20, 0x00, 0x01, 0x00,
+ 0x40, 0x67, 0x2f, 0xd2, 0x97, 0x83, 0xdb, 0xe8, 0xa9, 0x13, 0x08, 0xe0, 0x8a, 0x8c, 0x16, 0x10,
+ 0x23, 0xb6, 0xd8, 0xf2, 0x85, 0xa1, 0x45, 0x8b, 0x2d, 0x0e, 0x01, 0x08, 0x08, 0x00, 0x21, 0xf9,
+ 0x04, 0x05, 0x03, 0x00, 0x00, 0x00, 0x2c, 0x17, 0x00, 0x2d, 0x00, 0x0d, 0x00, 0x03, 0x00, 0x00,
+ 0x08, 0x23, 0x00, 0x01, 0x08, 0x04, 0xc0, 0xce, 0x9e, 0x41, 0x7b, 0xec, 0x06, 0x02, 0xa0, 0x17,
+ 0xc9, 0x13, 0x8c, 0x16, 0x10, 0x5b, 0xb0, 0x30, 0xf5, 0x85, 0xdb, 0x22, 0x28, 0x2d, 0x14, 0x0e,
+ 0x6c, 0xc1, 0x25, 0x58, 0x40, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x00, 0x00, 0x2c, 0x17,
+ 0x00, 0x2c, 0x00, 0x0d, 0x00, 0x04, 0x00, 0x00, 0x08, 0x27, 0x00, 0x01, 0x08, 0x1c, 0xa8, 0x8e,
+ 0x1d, 0xbb, 0x81, 0x03, 0xd1, 0xd9, 0xfb, 0x62, 0x0a, 0x46, 0x8b, 0x16, 0x32, 0x3c, 0x7d, 0xb1,
+ 0xc7, 0xed, 0x4a, 0x8e, 0x87, 0x08, 0x1f, 0xb6, 0x30, 0x06, 0x80, 0x0b, 0xc2, 0x8f, 0x02, 0x03,
+ 0x02, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00, 0x00, 0x00, 0x2c, 0x17, 0x00, 0x2c, 0x00, 0x0e,
+ 0x00, 0x03, 0x00, 0x00, 0x08, 0x24, 0x00, 0x01, 0x08, 0x04, 0xc0, 0x0e, 0xdf, 0x33, 0x4f, 0xa6,
+ 0x4c, 0x51, 0xfa, 0x62, 0xaf, 0x1d, 0x3a, 0x7b, 0x91, 0x3c, 0xd5, 0x68, 0xd1, 0x42, 0x20, 0xc5,
+ 0x16, 0x2a, 0x9a, 0x19, 0xa3, 0x38, 0xb0, 0x63, 0xc7, 0x80, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x06,
+ 0x00, 0x00, 0x00, 0x2c, 0x16, 0x00, 0x2b, 0x00, 0x10, 0x00, 0x04, 0x00, 0x00, 0x08, 0x2b, 0x00,
+ 0x01, 0x08, 0x1c, 0xa8, 0x4e, 0xdf, 0xb6, 0x2f, 0xcf, 0xbe, 0x44, 0xb2, 0x87, 0x6e, 0x20, 0x00,
+ 0x76, 0xf6, 0x9e, 0x69, 0x69, 0x41, 0xb1, 0x62, 0x8b, 0x1c, 0x29, 0x52, 0x5c, 0x31, 0x05, 0x83,
+ 0xa2, 0xc3, 0x8f, 0x02, 0x05, 0x81, 0x1c, 0x09, 0x20, 0x20, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04,
+ 0x00, 0x00, 0x00, 0x2c, 0x15, 0x00, 0x2a, 0x00, 0x12, 0x00, 0x04, 0x00, 0x00, 0x08, 0x31, 0x00,
+ 0x01, 0x08, 0x1c, 0x38, 0x90, 0x9d, 0xbd, 0x6d, 0xdb, 0xf0, 0xd9, 0x43, 0x47, 0x70, 0xa0, 0x3a,
+ 0x7a, 0x91, 0x3c, 0xc1, 0x68, 0x41, 0x91, 0xa2, 0x8c, 0x4c, 0x02, 0xbf, 0x44, 0x8a, 0xf4, 0x4c,
+ 0x8b, 0x8a, 0x16, 0x0d, 0x05, 0xae, 0x20, 0x24, 0xb0, 0x59, 0x0f, 0x8a, 0x21, 0x53, 0x06, 0x04,
+ 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x01, 0x00, 0x2c, 0x14, 0x00, 0x29, 0x00, 0x13, 0x00,
+ 0x04, 0x00, 0x00, 0x08, 0x32, 0x00, 0x03, 0x08, 0x1c, 0x48, 0x30, 0x80, 0x3a, 0x76, 0xf6, 0xec,
+ 0xe9, 0x43, 0x57, 0xb0, 0x20, 0xc2, 0x67, 0x5a, 0x54, 0xb4, 0x98, 0x08, 0xc3, 0xd3, 0x11, 0x07,
+ 0x60, 0xb6, 0x25, 0xb4, 0x17, 0x89, 0x92, 0x8c, 0x89, 0x05, 0x5b, 0x70, 0x69, 0x12, 0x80, 0xd0,
+ 0x8a, 0x89, 0x28, 0x1b, 0x16, 0x0c, 0x08, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x00, 0x00,
+ 0x2c, 0x14, 0x00, 0x28, 0x00, 0x14, 0x00, 0x04, 0x00, 0x00, 0x08, 0x35, 0x00, 0x01, 0x08, 0x1c,
+ 0x48, 0x90, 0x20, 0x3b, 0x76, 0xea, 0x06, 0xa2, 0x2b, 0x38, 0x50, 0x9d, 0xbe, 0x2f, 0x9e, 0x68,
+ 0xa8, 0x50, 0x01, 0xc3, 0xd4, 0x17, 0x0a, 0xc6, 0xae, 0x6c, 0xb3, 0x77, 0x50, 0x1f, 0xbe, 0x67,
+ 0x5a, 0x5a, 0x88, 0x1c, 0x28, 0xf2, 0x10, 0x80, 0x60, 0x4c, 0x44, 0xaa, 0x1c, 0xc9, 0x90, 0x60,
+ 0x40, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x07, 0x00, 0x00, 0x00, 0x2c, 0x13, 0x00, 0x28, 0x00, 0x15,
+ 0x00, 0x03, 0x00, 0x00, 0x08, 0x34, 0x00, 0xb9, 0xb1, 0x03, 0x40, 0xb0, 0xa0, 0x41, 0x76, 0xdb,
+ 0x9e, 0x99, 0x52, 0xa4, 0xc5, 0xd3, 0x33, 0x6e, 0x4d, 0x60, 0x68, 0x8a, 0xa4, 0x0f, 0x1d, 0x00,
+ 0x75, 0xec, 0xec, 0x45, 0xf2, 0x54, 0xa3, 0x85, 0xc7, 0x8f, 0x3d, 0x84, 0x01, 0x38, 0xf4, 0xb1,
+ 0x06, 0x0d, 0x1a, 0x2c, 0x3c, 0x1a, 0x5c, 0x09, 0x20, 0x20, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03,
+ 0x00, 0x01, 0x00, 0x2c, 0x13, 0x00, 0x27, 0x00, 0x15, 0x00, 0x04, 0x00, 0x00, 0x08, 0x38, 0x00,
+ 0xcf, 0x99, 0x0b, 0x40, 0xb0, 0xa0, 0xc1, 0x00, 0xe8, 0xec, 0x7d, 0xb9, 0xa2, 0x89, 0xd2, 0xb3,
+ 0x73, 0x43, 0x54, 0x98, 0xfa, 0x62, 0x0f, 0x9d, 0x41, 0x73, 0xf8, 0x28, 0xd1, 0x68, 0xc1, 0xb1,
+ 0xe3, 0x92, 0x00, 0x3d, 0x3a, 0xc2, 0x30, 0xe5, 0xc9, 0x14, 0x2f, 0x15, 0x1c, 0x0f, 0xaa, 0x24,
+ 0xd8, 0xb1, 0xc5, 0xca, 0x83, 0x01, 0x01, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00, 0x00, 0x00,
+ 0x2c, 0x13, 0x00, 0x26, 0x00, 0x15, 0x00, 0x04, 0x00, 0x00, 0x08, 0x36, 0x00, 0xcf, 0xd9, 0x43,
+ 0x07, 0xa0, 0xa0, 0xc1, 0x83, 0x00, 0xd4, 0xd1, 0xdb, 0xf6, 0xa5, 0xe1, 0x97, 0x61, 0x2d, 0x78,
+ 0x3d, 0xc3, 0xc7, 0x0e, 0x21, 0x3a, 0x7b, 0x5f, 0xb4, 0xb4, 0xd8, 0xb8, 0xd1, 0x10, 0x00, 0x8e,
+ 0x2d, 0x6a, 0x98, 0xba, 0x42, 0xd2, 0x93, 0x8c, 0x8d, 0x08, 0x53, 0x7e, 0x04, 0xd9, 0x42, 0xa5,
+ 0xc1, 0x80, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x00, 0x00, 0x2c, 0x13, 0x00, 0x25, 0x00,
+ 0x15, 0x00, 0x04, 0x00, 0x00, 0x08, 0x35, 0x00, 0xf1, 0xd9, 0x43, 0x07, 0xa0, 0xa0, 0xc1, 0x83,
+ 0x06, 0xd9, 0xd9, 0xfb, 0xf2, 0x65, 0x1b, 0xb0, 0x16, 0x30, 0x34, 0x7d, 0xa1, 0x87, 0x10, 0x80,
+ 0x3a, 0x7d, 0x5f, 0x4a, 0xb1, 0x68, 0xc1, 0x31, 0x51, 0x41, 0x8e, 0x1c, 0xb5, 0x5c, 0x61, 0xf8,
+ 0xe5, 0x0a, 0x2f, 0x8e, 0x15, 0x11, 0x82, 0x5c, 0x99, 0xb2, 0x60, 0x40, 0x00, 0x21, 0xf9, 0x04,
+ 0x05, 0x07, 0x00, 0x00, 0x00, 0x2c, 0x13, 0x00, 0x24, 0x00, 0x15, 0x00, 0x04, 0x00, 0x00, 0x08,
+ 0x38, 0x00, 0xf1, 0xd9, 0x63, 0x07, 0xa0, 0xa0, 0xc1, 0x83, 0x07, 0xd1, 0xe9, 0xb3, 0x87, 0x0f,
+ 0x4a, 0x0b, 0x16, 0xa6, 0xbe, 0xd8, 0x43, 0x87, 0xb0, 0xa0, 0xb9, 0x6d, 0x94, 0x64, 0xb4, 0x68,
+ 0x01, 0xa3, 0xe0, 0xc6, 0x8d, 0x34, 0x28, 0x45, 0xda, 0x86, 0x6f, 0xdb, 0x17, 0x53, 0x2c, 0x36,
+ 0x56, 0x3c, 0xf8, 0xb1, 0xe5, 0x4a, 0x00, 0x01, 0x01, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00,
+ 0x00, 0x00, 0x2c, 0x13, 0x00, 0x23, 0x00, 0x15, 0x00, 0x04, 0x00, 0x00, 0x08, 0x35, 0x00, 0xcf,
+ 0xe9, 0x63, 0x07, 0xa0, 0xa0, 0xc1, 0x83, 0x08, 0xd5, 0xb1, 0xc3, 0x07, 0xac, 0x45, 0x0b, 0x5e,
+ 0x57, 0xf0, 0x11, 0x44, 0x58, 0x90, 0x9d, 0xbd, 0x67, 0x5a, 0x54, 0x40, 0x29, 0xe8, 0xd0, 0x61,
+ 0x0d, 0x4f, 0x5f, 0xf0, 0xd9, 0x1b, 0x19, 0x89, 0x12, 0x0c, 0x87, 0x14, 0x0d, 0x76, 0x5c, 0x89,
+ 0x12, 0x61, 0x40, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x00, 0x00, 0x2c, 0x13, 0x00, 0x22,
+ 0x00, 0x15, 0x00, 0x04, 0x00, 0x00, 0x08, 0x34, 0x00, 0x01, 0xb0, 0x43, 0x07, 0xa0, 0xa0, 0xc1,
+ 0x83, 0x08, 0x0d, 0x0e, 0x53, 0xa1, 0xc2, 0x89, 0xa6, 0x2f, 0xfa, 0xd4, 0x25, 0x2c, 0x88, 0xce,
+ 0xde, 0x17, 0x4f, 0xbf, 0x0c, 0xb6, 0xd8, 0xd8, 0x82, 0xd7, 0x33, 0x7c, 0xfa, 0xd8, 0xb1, 0xd3,
+ 0x87, 0xef, 0x59, 0x0e, 0x8e, 0x13, 0x39, 0xaa, 0x44, 0x79, 0x30, 0x20, 0x00, 0x21, 0xf9, 0x04,
+ 0x05, 0x04, 0x00, 0x00, 0x00, 0x2c, 0x13, 0x00, 0x22, 0x00, 0x15, 0x00, 0x03, 0x00, 0x00, 0x08,
+ 0x34, 0x00, 0x8f, 0x69, 0x41, 0xb2, 0x2c, 0xd5, 0x17, 0x7b, 0xe8, 0x00, 0x28, 0x5c, 0xc8, 0x90,
+ 0xde, 0x36, 0x47, 0x00, 0x5a, 0xb4, 0x00, 0xe0, 0x42, 0xa2, 0x0c, 0x4a, 0xdb, 0xf4, 0x25, 0x54,
+ 0xc7, 0xce, 0xde, 0x97, 0x2d, 0x2a, 0x5a, 0x44, 0x61, 0xb8, 0x50, 0xa2, 0x44, 0x18, 0x34, 0x64,
+ 0xb0, 0x90, 0xc8, 0x30, 0x20, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x06, 0x00, 0x00, 0x00, 0x2c, 0x13,
+ 0x00, 0x21, 0x00, 0x15, 0x00, 0x04, 0x00, 0x00, 0x08, 0x39, 0x00, 0x83, 0x55, 0xd3, 0xb4, 0x49,
+ 0x53, 0x35, 0x7c, 0xec, 0x00, 0x28, 0x5c, 0xc8, 0x10, 0x00, 0x3b, 0x1d, 0xce, 0x5a, 0xb4, 0x20,
+ 0xf4, 0x44, 0x22, 0x0b, 0x53, 0x5f, 0xec, 0xa1, 0x5b, 0xa8, 0x8e, 0xde, 0x17, 0x4d, 0x35, 0x04,
+ 0x35, 0x54, 0x28, 0x51, 0x22, 0x0c, 0x59, 0xa6, 0x4c, 0xc9, 0x28, 0x39, 0xb2, 0x65, 0xc9, 0x16,
+ 0x23, 0x03, 0x02, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00, 0x00, 0x00, 0x2c, 0x13, 0x00, 0x20,
+ 0x00, 0x15, 0x00, 0x04, 0x00, 0x00, 0x08, 0x38, 0x00, 0x01, 0x70, 0x8b, 0xf4, 0xe5, 0x92, 0xb3,
+ 0x6d, 0xfa, 0xd4, 0x01, 0x58, 0xc8, 0xb0, 0xe1, 0xc2, 0x26, 0x35, 0x5a, 0x30, 0x59, 0xd1, 0xa2,
+ 0xa2, 0x96, 0x67, 0xf6, 0xd8, 0x39, 0x64, 0x87, 0xef, 0x4a, 0x2f, 0x87, 0x0b, 0x2b, 0x56, 0x84,
+ 0x61, 0x0a, 0xd9, 0x15, 0x4a, 0xa6, 0x22, 0xb6, 0x00, 0x09, 0x52, 0x64, 0x45, 0x87, 0x01, 0x01,
+ 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x01, 0x00, 0x2c, 0x14, 0x00, 0x1f, 0x00, 0x14, 0x00,
+ 0x04, 0x00, 0x00, 0x08, 0x38, 0x00, 0x03, 0xe0, 0xc3, 0xf7, 0x25, 0xc0, 0x32, 0x7c, 0xe8, 0x02,
+ 0x28, 0x5c, 0xc8, 0x50, 0xa1, 0x31, 0x15, 0x2d, 0x88, 0x48, 0x71, 0xd1, 0x42, 0xc6, 0x95, 0x6d,
+ 0xe6, 0x1a, 0x06, 0x40, 0x77, 0x4e, 0xa3, 0xc2, 0x16, 0x20, 0x7b, 0x98, 0x7a, 0xf6, 0xa5, 0x24,
+ 0xa5, 0x1c, 0x2a, 0x96, 0x79, 0x5c, 0x08, 0xb2, 0x25, 0xc8, 0x85, 0x01, 0x01, 0x00, 0x21, 0xf9,
+ 0x04, 0x05, 0x03, 0x00, 0x01, 0x00, 0x2c, 0x14, 0x00, 0x1e, 0x00, 0x13, 0x00, 0x04, 0x00, 0x00,
+ 0x08, 0x33, 0x00, 0x03, 0x08, 0xd4, 0x67, 0x2f, 0x00, 0x80, 0x11, 0x02, 0x13, 0x2a, 0x14, 0xb8,
+ 0xe8, 0x14, 0x0c, 0x2e, 0x84, 0x08, 0x11, 0x81, 0xe1, 0x29, 0x92, 0x3e, 0x75, 0x0b, 0x13, 0xb6,
+ 0x58, 0xd8, 0xa2, 0x63, 0x0b, 0x2d, 0xcf, 0xb6, 0xe1, 0xc3, 0xb7, 0xed, 0x8b, 0xa4, 0x8c, 0x0a,
+ 0x3d, 0xaa, 0xdc, 0x18, 0x10, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x07, 0x00, 0x00, 0x00, 0x2c, 0x15,
+ 0x00, 0x1d, 0x00, 0x12, 0x00, 0x04, 0x00, 0x00, 0x08, 0x30, 0x00, 0x01, 0x08, 0x44, 0x67, 0x4e,
+ 0xa0, 0xc1, 0x83, 0x07, 0x85, 0x5d, 0xd1, 0x02, 0x65, 0xc8, 0x14, 0x2b, 0x4a, 0xa0, 0xd9, 0x43,
+ 0x87, 0x50, 0x20, 0x91, 0x16, 0x07, 0x5b, 0x68, 0x6c, 0x31, 0xe3, 0xca, 0x36, 0x7b, 0xf4, 0xe8,
+ 0xd9, 0x63, 0x56, 0x31, 0xe3, 0xc6, 0x8d, 0xc3, 0x02, 0x02, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03,
+ 0x00, 0x00, 0x00, 0x2c, 0x15, 0x00, 0x1d, 0x00, 0x12, 0x00, 0x03, 0x00, 0x00, 0x08, 0x2b, 0x00,
+ 0x01, 0x60, 0x01, 0x43, 0x69, 0xcb, 0x2b, 0x56, 0x29, 0xb8, 0xd9, 0x43, 0x07, 0xa0, 0xa1, 0xc3,
+ 0x86, 0x5c, 0x5a, 0xac, 0x78, 0xe8, 0xa4, 0x85, 0x0c, 0x4a, 0xdb, 0xe8, 0x31, 0x7c, 0xc8, 0xd1,
+ 0x61, 0x8b, 0x8f, 0x2d, 0x60, 0xd0, 0xc8, 0x21, 0x2c, 0x20, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04,
+ 0x00, 0x02, 0x00, 0x2c, 0x16, 0x00, 0x1c, 0x00, 0x10, 0x00, 0x04, 0x00, 0x00, 0x08, 0x2f, 0x00,
+ 0x05, 0x98, 0x08, 0xf2, 0xe5, 0x0a, 0xb2, 0x2b, 0x5f, 0xec, 0xb1, 0x13, 0xc0, 0xb0, 0xa1, 0x30,
+ 0x22, 0x2d, 0x5a, 0x10, 0x59, 0x62, 0x45, 0x50, 0x0b, 0x18, 0x94, 0xb6, 0xd1, 0x6b, 0xc8, 0xb1,
+ 0x63, 0xc4, 0x88, 0x33, 0x3c, 0x35, 0xeb, 0x48, 0x92, 0x61, 0xc4, 0x15, 0x01, 0x01, 0x00, 0x21,
+ 0xf9, 0x04, 0x05, 0x03, 0x00, 0x00, 0x00, 0x2c, 0x17, 0x00, 0x1b, 0x00, 0x0f, 0x00, 0x04, 0x00,
+ 0x00, 0x08, 0x29, 0x00, 0x01, 0x00, 0xf8, 0xe3, 0x63, 0xc7, 0x97, 0x6d, 0xf6, 0xde, 0x09, 0x5c,
+ 0x08, 0x60, 0xca, 0xa1, 0x1a, 0x2d, 0x22, 0x46, 0x84, 0xa1, 0xe9, 0xcb, 0x39, 0x86, 0x18, 0x05,
+ 0x4a, 0x54, 0xa1, 0xab, 0x59, 0xc6, 0x8f, 0x2d, 0x7a, 0x00, 0x08, 0x08, 0x00, 0x21, 0xf9, 0x04,
+ 0x05, 0x07, 0x00, 0x03, 0x00, 0x2c, 0x0e, 0x00, 0x1a, 0x00, 0x20, 0x00, 0x29, 0x00, 0x00, 0x08,
+ 0xff, 0x00, 0x07, 0x08, 0x1c, 0x48, 0x70, 0x20, 0xa1, 0x22, 0x52, 0x8a, 0x10, 0x02, 0x50, 0xb0,
+ 0xa1, 0xc3, 0x82, 0x4d, 0x04, 0x41, 0x69, 0x41, 0x91, 0xe2, 0x8a, 0x43, 0xc2, 0x1e, 0x6a, 0x1c,
+ 0xe8, 0x8c, 0x4b, 0x0b, 0x81, 0x5c, 0xb8, 0x0c, 0xa8, 0xd8, 0xc3, 0x18, 0xc3, 0x8d, 0x0d, 0x0f,
+ 0x7d, 0xe4, 0xb2, 0x44, 0xd8, 0xa0, 0x21, 0x04, 0x29, 0x46, 0x99, 0x82, 0x92, 0xa0, 0xb1, 0x8f,
+ 0x86, 0xaa, 0x58, 0x79, 0xb2, 0xe2, 0x63, 0xc1, 0x16, 0x86, 0x6a, 0x0a, 0x6c, 0xa6, 0x62, 0xc0,
+ 0xcc, 0x42, 0x3e, 0x1f, 0xb6, 0x58, 0x52, 0x13, 0x00, 0x30, 0x81, 0x4c, 0xa2, 0x24, 0xd5, 0xb8,
+ 0x22, 0x18, 0x4a, 0x67, 0x1f, 0x0b, 0x89, 0x14, 0xda, 0x02, 0xe6, 0xc6, 0x61, 0x03, 0x5c, 0x08,
+ 0x23, 0x22, 0x54, 0x60, 0x14, 0x94, 0x50, 0x04, 0xba, 0x98, 0x8a, 0xb2, 0xc6, 0x49, 0x87, 0xc1,
+ 0x8a, 0x96, 0x25, 0xa8, 0xa2, 0x89, 0xc6, 0xb8, 0x73, 0xe9, 0xda, 0x7d, 0xb8, 0xc8, 0x45, 0xde,
+ 0x81, 0x3d, 0x16, 0x6d, 0x7c, 0xfa, 0x77, 0x00, 0x61, 0x8d, 0xc6, 0x0a, 0x0f, 0x38, 0x84, 0x72,
+ 0x99, 0xdc, 0xb9, 0x2a, 0x96, 0xd5, 0x04, 0x9b, 0x97, 0x32, 0xca, 0xbd, 0x8a, 0x33, 0x6b, 0xde,
+ 0x5c, 0x36, 0xf1, 0x46, 0xc6, 0x85, 0x83, 0xad, 0xa0, 0xaa, 0x19, 0x34, 0xe7, 0x86, 0xcd, 0x34,
+ 0x16, 0xd1, 0xdc, 0xc4, 0x6f, 0x43, 0x17, 0x98, 0x15, 0x33, 0xea, 0x51, 0xd0, 0xf5, 0xe9, 0xdb,
+ 0xb8, 0x51, 0x62, 0x79, 0xb8, 0x5b, 0x33, 0x8a, 0x87, 0x40, 0x36, 0xeb, 0x78, 0xe8, 0x87, 0xf3,
+ 0x9d, 0x86, 0x74, 0xde, 0x66, 0x4e, 0x72, 0x86, 0xa0, 0x99, 0x20, 0xb7, 0x7d, 0xd4, 0x29, 0x53,
+ 0x66, 0x0e, 0x9f, 0xdc, 0x03, 0xb0, 0xf4, 0xc6, 0xce, 0xbd, 0x3b, 0x67, 0x00, 0x59, 0x08, 0x16,
+ 0x23, 0xaf, 0xd9, 0x47, 0xe0, 0x78, 0x81, 0x59, 0x18, 0x96, 0xc0, 0x35, 0xe0, 0x04, 0x90, 0xdf,
+ 0x03, 0x92, 0x0c, 0xf0, 0xb2, 0x91, 0xbe, 0xfc, 0x01, 0x28, 0x80, 0x9c, 0x18, 0x80, 0xab, 0x84,
+ 0xf7, 0x01, 0x01, 0x01, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x2c, 0x0e, 0x00,
+ 0x19, 0x00, 0x20, 0x00, 0x2a, 0x00, 0x00, 0x08, 0xff, 0x00, 0x07, 0x08, 0x1c, 0x48, 0x50, 0x20,
+ 0x00, 0x42, 0x45, 0xa4, 0x14, 0x21, 0x04, 0xa0, 0xa0, 0xc3, 0x87, 0x05, 0x85, 0x1d, 0x82, 0xd2,
+ 0xa2, 0x62, 0xc5, 0x1a, 0x87, 0x08, 0x41, 0xdc, 0x38, 0x90, 0x51, 0x8d, 0x8a, 0x03, 0x5c, 0xb8,
+ 0x10, 0x58, 0x51, 0xc5, 0xa1, 0x45, 0x1c, 0x1d, 0x02, 0x18, 0x56, 0x91, 0x8b, 0x20, 0x42, 0x53,
+ 0x86, 0x10, 0xac, 0x88, 0xa8, 0x49, 0x4a, 0x82, 0x2c, 0x07, 0x18, 0x6a, 0x42, 0x45, 0x09, 0x91,
+ 0x15, 0x0e, 0x5b, 0x10, 0x99, 0x72, 0x73, 0x00, 0xa3, 0x16, 0x03, 0x9e, 0x4c, 0x51, 0xe2, 0x02,
+ 0xe4, 0xc3, 0x16, 0x87, 0x6e, 0x0a, 0xfb, 0x38, 0xa0, 0xd0, 0x13, 0xa4, 0x29, 0x55, 0x34, 0x4b,
+ 0x79, 0xa8, 0x85, 0x0a, 0x22, 0x4e, 0x53, 0xb6, 0x18, 0xc6, 0x71, 0x51, 0x8d, 0x01, 0x51, 0xaa,
+ 0x8c, 0x2c, 0x3a, 0xa0, 0x46, 0xb0, 0x8d, 0xcd, 0x54, 0x0c, 0x58, 0xe1, 0x04, 0x6b, 0xd1, 0x16,
+ 0x5b, 0x21, 0x3a, 0xc3, 0x6a, 0xf7, 0xae, 0xb3, 0x8d, 0x47, 0xd9, 0x16, 0x6c, 0xb1, 0x64, 0xe3,
+ 0x90, 0xbe, 0x82, 0x5b, 0xfc, 0x85, 0xd8, 0x0c, 0x31, 0x5b, 0xbc, 0x1b, 0x9b, 0xc8, 0x15, 0x3c,
+ 0x50, 0x85, 0xcd, 0x8d, 0x88, 0x28, 0x0f, 0xf4, 0x95, 0x72, 0xaf, 0xe6, 0x01, 0x79, 0x39, 0x46,
+ 0xd1, 0x6c, 0xa8, 0xa8, 0x30, 0x2e, 0x82, 0x99, 0x50, 0x46, 0x7d, 0x93, 0x35, 0xe5, 0xc9, 0x9f,
+ 0x53, 0x92, 0x8d, 0x9d, 0x52, 0x18, 0x6c, 0x87, 0x2e, 0x84, 0xd1, 0xfe, 0xb5, 0x91, 0x37, 0xed,
+ 0xc2, 0x10, 0x65, 0xd2, 0x26, 0x74, 0xbb, 0xf2, 0x32, 0xda, 0x02, 0x8d, 0x15, 0xef, 0x61, 0x0c,
+ 0xf9, 0xc0, 0x26, 0x84, 0xa2, 0x47, 0xbf, 0xec, 0xbc, 0xfa, 0xc6, 0x3e, 0x10, 0xfd, 0x38, 0x3f,
+ 0x02, 0xd1, 0x86, 0x73, 0x14, 0x10, 0xbd, 0x38, 0x58, 0xff, 0xf3, 0xc6, 0x61, 0x1b, 0x2c, 0xd5,
+ 0xbf, 0x94, 0x21, 0x58, 0x26, 0x92, 0xf5, 0x01, 0x5f, 0xce, 0x08, 0x3c, 0x13, 0xa9, 0xe1, 0x7b,
+ 0x1d, 0x41, 0x82, 0xfc, 0x78, 0xcf, 0xbf, 0xbf, 0xff, 0x82, 0x26, 0xfc, 0x81, 0x85, 0x0e, 0x3f,
+ 0x68, 0x37, 0x00, 0x76, 0x03, 0x08, 0xa1, 0xe0, 0x82, 0x0a, 0x0a, 0x84, 0xa0, 0x1f, 0x3f, 0xe8,
+ 0x80, 0xc5, 0x1f, 0x26, 0x0c, 0x80, 0x45, 0x1f, 0x42, 0x0c, 0xe4, 0x43, 0x12, 0x03, 0x78, 0xc1,
+ 0x07, 0x1f, 0x10, 0x7d, 0x28, 0x5e, 0x12, 0x3e, 0x0c, 0x24, 0x44, 0x1f, 0x3a, 0xfc, 0x37, 0x50,
+ 0x40, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x2c, 0x0d, 0x00, 0x18, 0x00, 0x22,
+ 0x00, 0x2b, 0x00, 0x00, 0x08, 0xff, 0x00, 0x07, 0x08, 0x1c, 0x48, 0x70, 0xa0, 0x30, 0x67, 0x82,
+ 0x94, 0x08, 0x72, 0xb6, 0xac, 0xa0, 0xc3, 0x87, 0x0f, 0x9d, 0x21, 0x52, 0xd1, 0xa2, 0xa2, 0x45,
+ 0x60, 0xce, 0x00, 0x40, 0xdc, 0x68, 0x30, 0x8a, 0x45, 0x17, 0x5c, 0xb8, 0x08, 0xb4, 0x48, 0xa4,
+ 0x21, 0xc7, 0x87, 0x84, 0xb8, 0x54, 0x64, 0x32, 0xa4, 0x49, 0x80, 0x21, 0x04, 0x2b, 0xae, 0x68,
+ 0x76, 0xb2, 0xa0, 0x30, 0x95, 0x2a, 0x04, 0x4d, 0xb1, 0x52, 0x88, 0x89, 0x0b, 0x87, 0x2d, 0x5c,
+ 0xd0, 0xac, 0x39, 0x60, 0x11, 0x91, 0x16, 0x03, 0x96, 0x4c, 0x79, 0x62, 0x11, 0x29, 0x50, 0x2e,
+ 0xc1, 0x88, 0x1a, 0x73, 0x3a, 0xc4, 0x49, 0xc5, 0x93, 0x2d, 0x0e, 0xd5, 0x0c, 0x56, 0x23, 0xe8,
+ 0x8a, 0xab, 0x35, 0x5b, 0xd4, 0x68, 0x72, 0xd2, 0x19, 0xd2, 0x25, 0x45, 0x88, 0x0e, 0x6c, 0xe1,
+ 0xec, 0xe4, 0x30, 0xa4, 0x86, 0x3c, 0xaa, 0x1d, 0xd0, 0x62, 0xd8, 0x49, 0x28, 0x48, 0xc1, 0xce,
+ 0x05, 0xc6, 0x11, 0x40, 0x8d, 0xb9, 0x0e, 0xa1, 0xf4, 0xfd, 0x0b, 0x98, 0xa0, 0x60, 0x8e, 0x89,
+ 0x0a, 0x13, 0x44, 0xe4, 0x56, 0xf1, 0x40, 0xad, 0x1c, 0xcd, 0x3a, 0x6e, 0x91, 0x96, 0x63, 0xb0,
+ 0xc3, 0x85, 0xb9, 0x68, 0x3c, 0xb9, 0x44, 0x31, 0x5b, 0xa2, 0x00, 0x18, 0x03, 0x8e, 0xe2, 0xb8,
+ 0x74, 0xcd, 0x15, 0x6a, 0x85, 0x29, 0x96, 0x6c, 0xfa, 0x24, 0x69, 0x8e, 0x76, 0x4b, 0x37, 0x73,
+ 0xfa, 0x50, 0x05, 0x21, 0xd3, 0x00, 0x30, 0x3b, 0xe4, 0xdb, 0x1a, 0xf2, 0x43, 0xdf, 0xa5, 0x59,
+ 0x17, 0xa4, 0xdc, 0x5a, 0xe0, 0xa1, 0x1e, 0x0e, 0x81, 0x17, 0x17, 0xc6, 0x9c, 0x79, 0xd4, 0xe2,
+ 0xd0, 0x6b, 0x02, 0x01, 0x43, 0xbd, 0x3a, 0x75, 0x20, 0xd0, 0xbb, 0x40, 0x8c, 0x04, 0xfd, 0x05,
+ 0x44, 0x30, 0xd0, 0x51, 0xb0, 0x65, 0x71, 0xc8, 0xc6, 0x4b, 0xf4, 0x3b, 0x0e, 0xe9, 0x6c, 0x2e,
+ 0xae, 0xa3, 0x4e, 0x19, 0x81, 0x65, 0xe6, 0xf8, 0x89, 0x2e, 0xb0, 0x84, 0x8d, 0x31, 0x63, 0x8e,
+ 0x98, 0xa0, 0xcf, 0xbf, 0xbf, 0xff, 0x87, 0x25, 0x64, 0x81, 0x85, 0x0e, 0x3f, 0xcc, 0xd7, 0x47,
+ 0x1f, 0x03, 0x08, 0x21, 0xc4, 0x00, 0x27, 0x34, 0xe8, 0x60, 0x82, 0x0b, 0x1e, 0x38, 0x80, 0x1f,
+ 0x3f, 0xe8, 0x80, 0x45, 0x16, 0x25, 0x0c, 0x90, 0x85, 0x1f, 0x42, 0x9c, 0x00, 0x04, 0x0a, 0x3e,
+ 0x24, 0xe1, 0x05, 0x1f, 0x7c, 0xd4, 0x44, 0xa2, 0x17, 0x49, 0xf8, 0x80, 0x02, 0x10, 0x27, 0x08,
+ 0xe1, 0x47, 0x16, 0xa0, 0x01, 0x20, 0xe3, 0x8c, 0x6a, 0x05, 0x04, 0x00, 0x21, 0xf9, 0x04, 0x05,
+ 0x04, 0x00, 0x03, 0x00, 0x2c, 0x0c, 0x00, 0x17, 0x00, 0x24, 0x00, 0x2c, 0x00, 0x00, 0x08, 0xff,
+ 0x00, 0x07, 0x08, 0x1c, 0x48, 0x90, 0xe0, 0x32, 0x67, 0x82, 0x12, 0x3a, 0x5b, 0x56, 0xb0, 0xa1,
+ 0xc3, 0x87, 0x00, 0x9c, 0x21, 0x6a, 0x41, 0xb1, 0xa2, 0x0a, 0x60, 0x43, 0x16, 0x3d, 0xdc, 0x58,
+ 0x70, 0xd9, 0x44, 0x8a, 0x03, 0x5c, 0xb8, 0x18, 0x48, 0x91, 0x49, 0x33, 0x8e, 0x1c, 0x9b, 0xad,
+ 0x68, 0x31, 0x80, 0xc9, 0x12, 0x2a, 0x53, 0x86, 0x14, 0x6c, 0xd1, 0xc3, 0x19, 0x4a, 0x87, 0xcd,
+ 0x5c, 0xb4, 0x70, 0xa1, 0x64, 0x0a, 0x15, 0x41, 0x51, 0xb8, 0x34, 0x6c, 0xa1, 0xc2, 0xe6, 0xcd,
+ 0x81, 0xc2, 0x56, 0xba, 0x90, 0x32, 0xa5, 0x90, 0x4e, 0x90, 0x43, 0x6b, 0x30, 0x3c, 0x3a, 0x20,
+ 0x0a, 0x4b, 0x2e, 0x54, 0x9c, 0xb0, 0x44, 0xd9, 0x02, 0x11, 0xd5, 0x66, 0x5b, 0x07, 0x40, 0xbd,
+ 0xd9, 0xe2, 0xe4, 0xcd, 0x61, 0x2c, 0xa5, 0x14, 0xa2, 0x2a, 0xb0, 0xc5, 0xb0, 0x9b, 0xc1, 0x6a,
+ 0x08, 0x2c, 0xe2, 0x84, 0xad, 0xc0, 0x1a, 0x00, 0x50, 0x82, 0x6d, 0x1b, 0x96, 0xaa, 0x0b, 0x61,
+ 0x28, 0x9d, 0xf5, 0xb5, 0x2b, 0xd6, 0xec, 0xc6, 0x63, 0x83, 0xed, 0xaa, 0x30, 0xec, 0x90, 0x02,
+ 0xbe, 0xc4, 0x6c, 0x55, 0x10, 0x42, 0xb9, 0x4c, 0x05, 0x61, 0x82, 0x2e, 0x9a, 0xa0, 0x04, 0x00,
+ 0xe5, 0xf2, 0x40, 0x60, 0x47, 0x0f, 0x79, 0x16, 0xb8, 0xe4, 0xe8, 0xb2, 0x1e, 0x9e, 0x6b, 0x68,
+ 0x0e, 0xed, 0xd9, 0x18, 0xdb, 0x60, 0x44, 0x08, 0x23, 0xca, 0x6b, 0x97, 0x09, 0xdb, 0xd8, 0xa9,
+ 0x47, 0xeb, 0x76, 0xd8, 0xc2, 0xa8, 0x67, 0x00, 0xa0, 0x39, 0x46, 0xd9, 0x3d, 0xc0, 0x37, 0x6f,
+ 0xc6, 0x9e, 0x9b, 0xa0, 0x7e, 0x88, 0x97, 0xf8, 0x00, 0xaf, 0x0f, 0x7f, 0x39, 0x1f, 0xe0, 0xfa,
+ 0xa1, 0x71, 0xdd, 0x8b, 0xde, 0x4e, 0xe7, 0x18, 0xac, 0x89, 0x77, 0xef, 0x1a, 0xb7, 0x8b, 0x78,
+ 0xe7, 0x98, 0x64, 0x87, 0xf9, 0xf3, 0xe6, 0x93, 0x6c, 0xdf, 0xd3, 0xa6, 0xbd, 0xfb, 0xf6, 0x61,
+ 0xb6, 0x77, 0x79, 0xff, 0x5e, 0xcc, 0xf6, 0x17, 0xf4, 0xdd, 0x83, 0xd9, 0x8e, 0x65, 0x4d, 0xc3,
+ 0x34, 0x3f, 0x88, 0xe7, 0x45, 0x1a, 0x04, 0xa1, 0x11, 0xc4, 0x78, 0x03, 0xf4, 0x31, 0xc6, 0x1c,
+ 0x72, 0x88, 0x21, 0x04, 0x82, 0x10, 0x46, 0x28, 0xa1, 0x40, 0x00, 0x64, 0xf1, 0x87, 0x0e, 0x3f,
+ 0xf8, 0x91, 0xe0, 0x00, 0x42, 0x3c, 0x78, 0xc2, 0x09, 0x0d, 0x7d, 0xc8, 0xe1, 0x83, 0x7d, 0x0c,
+ 0x80, 0x4b, 0x80, 0x7f, 0x64, 0x41, 0xdb, 0x0f, 0x7d, 0x9c, 0x00, 0x04, 0x0a, 0x3e, 0x24, 0xe1,
+ 0x05, 0x1f, 0x76, 0xf1, 0xe1, 0x45, 0x12, 0x3e, 0xa0, 0x00, 0xc4, 0x09, 0x7d, 0x04, 0x78, 0x13,
+ 0x00, 0xb4, 0x15, 0x04, 0xe4, 0x51, 0x01, 0x01, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x06, 0x00, 0x07,
+ 0x00, 0x2c, 0x0c, 0x00, 0x16, 0x00, 0x24, 0x00, 0x2d, 0x00, 0x00, 0x08, 0xff, 0x00, 0x0f, 0x08,
+ 0x1c, 0x48, 0xb0, 0xa0, 0x40, 0x00, 0x06, 0x13, 0x2a, 0x5c, 0x78, 0xa0, 0xd9, 0x21, 0x44, 0x30,
+ 0x54, 0xc0, 0x40, 0x74, 0xa8, 0x19, 0xc3, 0x8b, 0x04, 0x9b, 0x21, 0x6a, 0x61, 0xb0, 0x45, 0x0b,
+ 0x60, 0xce, 0x30, 0x2e, 0x04, 0x70, 0x48, 0x85, 0x40, 0x17, 0x4e, 0x94, 0x38, 0x29, 0xd8, 0x62,
+ 0x58, 0x30, 0x91, 0x05, 0x17, 0xfd, 0xe2, 0xb8, 0x42, 0x50, 0x93, 0x00, 0xc2, 0x94, 0x74, 0x44,
+ 0xd4, 0x04, 0xe6, 0xc0, 0x99, 0x07, 0x88, 0x50, 0xa9, 0x22, 0x88, 0x89, 0xc7, 0x84, 0x2d, 0x10,
+ 0x21, 0x84, 0xc9, 0x88, 0x23, 0x93, 0x26, 0x56, 0xb8, 0x70, 0x64, 0xd8, 0xc2, 0x18, 0x4c, 0x61,
+ 0x35, 0x06, 0x2e, 0x59, 0x01, 0xb3, 0x86, 0x30, 0x91, 0x87, 0x04, 0x32, 0x71, 0xe1, 0x53, 0x60,
+ 0xd8, 0x8b, 0x8b, 0xa0, 0x1c, 0x70, 0x51, 0xe5, 0x49, 0xd9, 0x03, 0x50, 0x96, 0x2e, 0x6c, 0xc6,
+ 0xd1, 0x85, 0x20, 0xae, 0x65, 0x55, 0x2c, 0xbb, 0x38, 0xe4, 0x2d, 0xcb, 0x90, 0x0c, 0xad, 0xfa,
+ 0x25, 0x08, 0x58, 0x21, 0x00, 0xc1, 0x83, 0x0f, 0xb4, 0x28, 0x9c, 0x90, 0x44, 0xe2, 0x81, 0x8b,
+ 0x2f, 0xd2, 0x7d, 0xac, 0xf7, 0x62, 0xb0, 0xac, 0x89, 0xe3, 0x62, 0x1c, 0xf6, 0xf8, 0xac, 0x64,
+ 0x93, 0x83, 0xbf, 0x8a, 0xe4, 0xfc, 0xb8, 0xb4, 0x69, 0xd3, 0x2f, 0x4f, 0xab, 0x2e, 0xc8, 0x68,
+ 0x35, 0x43, 0x26, 0x17, 0x11, 0x99, 0x5e, 0x72, 0x91, 0x71, 0x68, 0xd0, 0x0a, 0x53, 0x97, 0x4e,
+ 0xb4, 0x50, 0xf6, 0x69, 0xcf, 0x06, 0x5b, 0xaf, 0x26, 0x4b, 0x30, 0xab, 0xdc, 0xd3, 0x8b, 0x82,
+ 0x29, 0x57, 0xee, 0xba, 0x39, 0x43, 0x3e, 0x0a, 0xbd, 0xac, 0xb6, 0xa3, 0x10, 0xcf, 0x6a, 0x31,
+ 0x0a, 0xf7, 0xac, 0x06, 0xa3, 0xf0, 0xcb, 0x6a, 0x3f, 0x68, 0x0c, 0x9a, 0x3c, 0x11, 0xe2, 0xfa,
+ 0x88, 0x19, 0x82, 0x65, 0x76, 0x38, 0x47, 0xb1, 0x47, 0x8d, 0x1a, 0x3d, 0x49, 0x9c, 0x0f, 0x04,
+ 0x70, 0x5c, 0xbe, 0x7d, 0xd7, 0x58, 0x14, 0x9e, 0x60, 0xb8, 0x9f, 0xa0, 0x9f, 0x03, 0x3a, 0xe4,
+ 0x27, 0x50, 0x09, 0x7e, 0x90, 0x77, 0x80, 0x0f, 0xa7, 0x21, 0x78, 0x80, 0x10, 0x7e, 0x94, 0x50,
+ 0x56, 0x09, 0x10, 0x42, 0x78, 0x10, 0x46, 0x01, 0x01, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00,
+ 0x0d, 0x00, 0x2c, 0x0c, 0x00, 0x16, 0x00, 0x24, 0x00, 0x2d, 0x00, 0x00, 0x08, 0xff, 0x00, 0x1b,
+ 0x08, 0x1c, 0x48, 0xb0, 0xa0, 0xc0, 0x00, 0x06, 0x13, 0x2a, 0x5c, 0xd8, 0x20, 0x40, 0x09, 0x42,
+ 0x45, 0x8a, 0x34, 0x23, 0xb4, 0x08, 0x21, 0xc3, 0x8b, 0x03, 0x03, 0x2c, 0x3b, 0x54, 0xa3, 0x60,
+ 0x8d, 0x61, 0xcd, 0x2c, 0x62, 0x4c, 0x18, 0x20, 0xd8, 0x21, 0x15, 0x0d, 0x5a, 0xa8, 0x6c, 0x41,
+ 0x50, 0xc5, 0x2f, 0x61, 0x22, 0x47, 0x1e, 0x14, 0x46, 0x24, 0xa5, 0x8b, 0x27, 0x45, 0xa8, 0x08,
+ 0x32, 0xc8, 0x25, 0xa4, 0xcc, 0x81, 0xc2, 0xb8, 0xa4, 0x34, 0x44, 0x65, 0x4a, 0x11, 0x25, 0x35,
+ 0x0d, 0xae, 0x20, 0x14, 0x93, 0x61, 0x06, 0x1d, 0x35, 0x5b, 0x28, 0x19, 0x34, 0x44, 0x28, 0x43,
+ 0x2e, 0x4d, 0x64, 0x0e, 0x00, 0x23, 0x70, 0xc5, 0x94, 0x42, 0x32, 0x87, 0x35, 0x55, 0x28, 0xcc,
+ 0x45, 0xca, 0x16, 0x2b, 0x7e, 0xaa, 0x58, 0x86, 0x31, 0xc0, 0xa1, 0x94, 0x3b, 0x7f, 0x0a, 0x34,
+ 0x36, 0xb6, 0x60, 0x00, 0x28, 0x29, 0xad, 0x3c, 0x91, 0xdb, 0x20, 0x51, 0x5d, 0x82, 0xc2, 0x50,
+ 0xf2, 0x1d, 0xa8, 0x22, 0x2b, 0xc3, 0x66, 0x83, 0x09, 0xba, 0x60, 0xbb, 0x30, 0x43, 0xae, 0xc4,
+ 0x03, 0x5d, 0x10, 0x5a, 0x08, 0xe0, 0x1d, 0xe4, 0xc8, 0xbd, 0x2e, 0x06, 0xbe, 0xcc, 0x22, 0xd8,
+ 0xc5, 0x00, 0x89, 0x2e, 0x23, 0xfa, 0x4b, 0xd0, 0xd8, 0xe5, 0x25, 0x23, 0x85, 0xf5, 0x48, 0xbc,
+ 0xc2, 0x30, 0xc6, 0xb7, 0x83, 0x51, 0xcb, 0x5c, 0x74, 0xb9, 0xf6, 0x45, 0xd7, 0xb6, 0x73, 0x17,
+ 0x74, 0x86, 0x51, 0x30, 0xe4, 0x00, 0x88, 0x2e, 0x46, 0xb1, 0xcd, 0xfb, 0xb0, 0xed, 0x60, 0x1d,
+ 0x15, 0x42, 0x01, 0x90, 0x3b, 0xb8, 0xc2, 0x5f, 0xba, 0x65, 0x27, 0x2c, 0x6e, 0x9b, 0xb9, 0x6f,
+ 0x81, 0xab, 0x49, 0x0f, 0x0e, 0xd6, 0xa4, 0x7b, 0x77, 0xcf, 0xba, 0xc3, 0x63, 0x5c, 0x4c, 0xa2,
+ 0xd0, 0x47, 0xf8, 0x30, 0x0a, 0xd1, 0xeb, 0x8e, 0xa4, 0x70, 0x4c, 0xf8, 0x23, 0x0a, 0x5f, 0x84,
+ 0xff, 0xe3, 0xc6, 0xe0, 0x1a, 0x2c, 0xe2, 0x7d, 0x54, 0x22, 0x98, 0xc6, 0x8b, 0x78, 0x81, 0x3f,
+ 0x44, 0x62, 0x87, 0x1d, 0x5d, 0xf8, 0xf1, 0x1f, 0x41, 0x01, 0x68, 0x77, 0xe0, 0x82, 0x97, 0x05,
+ 0x60, 0xc2, 0x1f, 0xf8, 0xe1, 0x52, 0x90, 0x10, 0x0c, 0x51, 0x48, 0x90, 0x84, 0x58, 0xfc, 0x61,
+ 0x02, 0x42, 0x01, 0xfc, 0xd0, 0x87, 0x40, 0x28, 0xe4, 0x16, 0x62, 0x03, 0x7d, 0xfc, 0xa0, 0x60,
+ 0x43, 0x03, 0x01, 0xa0, 0xa2, 0x8a, 0x07, 0x61, 0x14, 0x10, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03,
+ 0x00, 0x06, 0x00, 0x2c, 0x0c, 0x00, 0x17, 0x00, 0x24, 0x00, 0x2c, 0x00, 0x00, 0x08, 0xff, 0x00,
+ 0x0d, 0x08, 0x1c, 0x48, 0x90, 0x60, 0x80, 0x83, 0x08, 0x03, 0x14, 0x5c, 0xc8, 0xb0, 0xa1, 0x81,
+ 0x84, 0x10, 0x0f, 0x3a, 0x9c, 0x68, 0xf0, 0xa0, 0xb0, 0x25, 0x86, 0x12, 0x71, 0x49, 0x64, 0x68,
+ 0xc9, 0x32, 0x84, 0x14, 0x1d, 0x1e, 0x6c, 0x32, 0xcc, 0x40, 0x8b, 0x93, 0x2d, 0x06, 0xaa, 0xf8,
+ 0xf5, 0x51, 0x61, 0xc8, 0x82, 0x07, 0x9b, 0x71, 0x39, 0xb9, 0xe2, 0xc9, 0x92, 0x27, 0x05, 0x7b,
+ 0x30, 0x92, 0xf8, 0xd2, 0xc0, 0x08, 0x0a, 0x01, 0x9c, 0xf5, 0x68, 0xe1, 0x42, 0x50, 0x95, 0x2a,
+ 0x56, 0x0a, 0x2d, 0x54, 0x61, 0x8c, 0x67, 0x48, 0x10, 0x24, 0x9a, 0x0d, 0xe5, 0x42, 0x48, 0x58,
+ 0x21, 0x17, 0x0e, 0x55, 0x38, 0x73, 0x19, 0x32, 0x40, 0x30, 0x26, 0x02, 0x8b, 0x58, 0xe1, 0x12,
+ 0x72, 0x85, 0x30, 0xae, 0x13, 0x03, 0x18, 0x33, 0xd9, 0x82, 0xc9, 0x8a, 0x9e, 0x87, 0xd0, 0x3a,
+ 0x5c, 0xf4, 0x96, 0xc9, 0x92, 0x9e, 0x02, 0x6b, 0x04, 0xeb, 0xda, 0x4c, 0x60, 0xa1, 0x22, 0x78,
+ 0x05, 0x36, 0x93, 0xbb, 0x50, 0x6d, 0xe0, 0x82, 0x82, 0x08, 0x0f, 0x04, 0x60, 0x20, 0x43, 0xc9,
+ 0xc3, 0x03, 0x87, 0x29, 0x16, 0xb8, 0x21, 0x1e, 0x84, 0x5f, 0x90, 0x23, 0x4f, 0x1e, 0x18, 0xe0,
+ 0x50, 0x66, 0x81, 0x71, 0x43, 0xde, 0xfd, 0x3c, 0xe4, 0x25, 0xa1, 0xcf, 0x2a, 0x96, 0xbd, 0x0c,
+ 0x00, 0x16, 0x32, 0xa2, 0xcd, 0x05, 0x9d, 0x65, 0x96, 0xdd, 0x33, 0x00, 0xa2, 0xc3, 0x51, 0x60,
+ 0x33, 0x24, 0xdb, 0xb3, 0x35, 0xe4, 0xb7, 0x9f, 0xf1, 0xaa, 0x08, 0xd9, 0x37, 0xf8, 0x63, 0x87,
+ 0xc7, 0x3f, 0xab, 0xce, 0x4a, 0x25, 0xb8, 0x40, 0xdb, 0x0e, 0x5f, 0x3b, 0x17, 0x28, 0xc8, 0x61,
+ 0xf5, 0xe9, 0x06, 0x8a, 0x33, 0xd4, 0xee, 0xbc, 0xf3, 0x42, 0x17, 0x6b, 0xb1, 0x0f, 0x7f, 0x6c,
+ 0x42, 0xa5, 0x7c, 0xf9, 0x26, 0xe2, 0xd3, 0xbf, 0x14, 0x02, 0xa6, 0xbd, 0xfb, 0xf6, 0x42, 0xd2,
+ 0xef, 0x68, 0x38, 0x5f, 0x7c, 0x10, 0x36, 0xf8, 0xf3, 0xe3, 0xb7, 0x91, 0xde, 0x8f, 0x01, 0xfd,
+ 0xf9, 0xc5, 0x27, 0x5e, 0x00, 0x62, 0x2c, 0x14, 0x86, 0x6e, 0x81, 0x99, 0x10, 0x06, 0x41, 0x7b,
+ 0x64, 0xa1, 0xde, 0x73, 0x27, 0xec, 0xb0, 0x03, 0x10, 0x08, 0x3e, 0x68, 0xe1, 0x85, 0xe9, 0x01,
+ 0x90, 0xc5, 0x1f, 0x58, 0xe8, 0xf0, 0x83, 0x1f, 0x7e, 0xf4, 0x21, 0xa2, 0x10, 0x24, 0x96, 0x68,
+ 0xa2, 0x88, 0x7d, 0x80, 0xf8, 0x83, 0x0e, 0x58, 0xfc, 0x91, 0x05, 0x63, 0x02, 0x01, 0xf0, 0x43,
+ 0x1f, 0x27, 0x00, 0x81, 0x82, 0x0f, 0x3e, 0x24, 0xe1, 0x45, 0x4f, 0x5e, 0x24, 0x81, 0x23, 0x0a,
+ 0x40, 0x9c, 0xd0, 0xc7, 0x0f, 0x30, 0x76, 0x95, 0xd0, 0x43, 0x20, 0x85, 0x14, 0x10, 0x00, 0x21,
+ 0xf9, 0x04, 0x05, 0x03, 0x00, 0x10, 0x00, 0x2c, 0x0d, 0x00, 0x17, 0x00, 0x22, 0x00, 0x2c, 0x00,
+ 0x00, 0x08, 0xff, 0x00, 0x21, 0x08, 0x1c, 0x48, 0x90, 0x02, 0x08, 0x82, 0x08, 0x13, 0x2a, 0x5c,
+ 0x28, 0x30, 0xc3, 0x00, 0x86, 0x10, 0x23, 0x12, 0x0c, 0x40, 0xb1, 0x62, 0x45, 0x89, 0x11, 0x2d,
+ 0x02, 0x10, 0x46, 0x45, 0x18, 0x00, 0x8b, 0x18, 0x15, 0x56, 0x6c, 0x36, 0xac, 0x46, 0x8b, 0x16,
+ 0x10, 0x6a, 0x44, 0x71, 0xb6, 0x88, 0x62, 0x48, 0x0a, 0x1b, 0x04, 0x52, 0xa4, 0x82, 0xe8, 0xa4,
+ 0x4d, 0x82, 0x4c, 0x9a, 0xb9, 0xc4, 0x48, 0x02, 0x02, 0xc5, 0x22, 0x2b, 0x5a, 0xb8, 0x78, 0x52,
+ 0x44, 0xd8, 0x10, 0x84, 0x2a, 0x8c, 0xed, 0x94, 0x48, 0xb1, 0x99, 0x8b, 0x16, 0x4c, 0x08, 0x35,
+ 0x59, 0x12, 0x85, 0x8b, 0x42, 0x41, 0x4b, 0x21, 0x06, 0x10, 0xb6, 0x42, 0x60, 0x93, 0x21, 0x5d,
+ 0x19, 0xaa, 0xd0, 0xc9, 0x34, 0xc0, 0xaf, 0x93, 0x44, 0x94, 0x60, 0x24, 0x92, 0x55, 0x24, 0x21,
+ 0x15, 0x2d, 0x9c, 0x58, 0xc5, 0x38, 0x36, 0x40, 0x46, 0xb5, 0x10, 0x84, 0x45, 0x09, 0x09, 0xe1,
+ 0x90, 0xdd, 0x84, 0x00, 0x32, 0xc8, 0x44, 0x24, 0x70, 0x6e, 0xc8, 0x44, 0x7f, 0x11, 0x22, 0x88,
+ 0x27, 0xb3, 0x06, 0x5f, 0x82, 0x35, 0x4a, 0x44, 0x2c, 0xc1, 0xe2, 0xf1, 0x40, 0x16, 0x8b, 0x32,
+ 0x3a, 0xb6, 0x9c, 0x12, 0x40, 0xc6, 0xbd, 0x9c, 0x11, 0x25, 0x66, 0xb8, 0x84, 0x33, 0x04, 0x41,
+ 0x18, 0x85, 0xf5, 0xb0, 0xec, 0x42, 0x58, 0xc8, 0x43, 0x96, 0x87, 0xf1, 0x6d, 0xc2, 0x84, 0xaf,
+ 0x61, 0xd3, 0x10, 0x57, 0x10, 0xe2, 0xdc, 0x6c, 0x35, 0x44, 0xdf, 0xa6, 0x8d, 0x45, 0x84, 0x8d,
+ 0x3b, 0xd8, 0x6d, 0x84, 0x2b, 0x82, 0xe1, 0x16, 0x48, 0x5c, 0x61, 0x73, 0xdc, 0xcd, 0x18, 0x46,
+ 0x5f, 0x0e, 0x21, 0xd8, 0x66, 0x84, 0x3d, 0x9a, 0x50, 0x17, 0xb8, 0x04, 0xb8, 0x40, 0x15, 0x8c,
+ 0xb6, 0x0f, 0x83, 0x14, 0x66, 0xa5, 0x7c, 0x79, 0xd7, 0xe2, 0xd3, 0x43, 0xc4, 0xf2, 0xa5, 0xbd,
+ 0xfb, 0xf6, 0x7f, 0xc4, 0x9f, 0x60, 0x43, 0xbf, 0x3e, 0xfd, 0x13, 0xe2, 0xe3, 0x2b, 0xfc, 0x21,
+ 0x3e, 0x40, 0x9e, 0x84, 0x77, 0x8c, 0xb6, 0x1c, 0x10, 0x68, 0x10, 0x74, 0x86, 0x0f, 0xea, 0x05,
+ 0x00, 0x04, 0x1e, 0x66, 0x98, 0x71, 0x87, 0x0f, 0x02, 0x6e, 0x17, 0xc0, 0x1f, 0x7f, 0x44, 0xa8,
+ 0xde, 0x85, 0x18, 0x66, 0x28, 0x13, 0x00, 0x26, 0xfc, 0x81, 0x85, 0x0e, 0x3f, 0xe0, 0xe2, 0x87,
+ 0x1f, 0x10, 0xf4, 0x61, 0xe2, 0x89, 0x28, 0x42, 0x30, 0x22, 0x2e, 0x3f, 0xe8, 0x80, 0xc5, 0x1f,
+ 0x26, 0x7c, 0xe4, 0x13, 0x00, 0x3f, 0xf4, 0x21, 0xc4, 0x09, 0x40, 0xa0, 0xe0, 0x83, 0x0f, 0x49,
+ 0x78, 0xe1, 0xc5, 0x42, 0x3e, 0x26, 0xb1, 0x23, 0x0a, 0x40, 0x00, 0x21, 0x44, 0x1f, 0x3f, 0xc8,
+ 0xf8, 0x98, 0x85, 0x0c, 0x05, 0x04, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x07, 0x00, 0x0d, 0x00, 0x2c,
+ 0x0d, 0x00, 0x17, 0x00, 0x21, 0x00, 0x2c, 0x00, 0x00, 0x08, 0xff, 0x00, 0x1b, 0x08, 0x1c, 0x48,
+ 0x10, 0x04, 0x02, 0x82, 0x08, 0x13, 0x2a, 0x5c, 0xc8, 0xb0, 0xa1, 0xc3, 0x87, 0x10, 0x23, 0x0a,
+ 0x0c, 0x40, 0x91, 0xa2, 0xc4, 0x81, 0x00, 0x14, 0x56, 0xdc, 0x58, 0x51, 0xe2, 0x83, 0x07, 0x04,
+ 0x2b, 0x12, 0x5a, 0x72, 0xc8, 0xd0, 0x30, 0x41, 0xcd, 0x00, 0x58, 0x84, 0x98, 0x71, 0x20, 0xc5,
+ 0x66, 0x88, 0x5a, 0xc8, 0x6c, 0x31, 0x90, 0x89, 0xb3, 0x95, 0x12, 0x29, 0x1a, 0x53, 0xd1, 0x62,
+ 0xc5, 0x93, 0x21, 0x87, 0x10, 0x1a, 0x0a, 0x16, 0x20, 0x67, 0x80, 0x43, 0x32, 0x0b, 0x35, 0x19,
+ 0x69, 0x28, 0x21, 0x22, 0xa2, 0x11, 0x03, 0x0c, 0x69, 0xd0, 0x62, 0x89, 0xb0, 0xa6, 0x0c, 0x87,
+ 0x15, 0x7d, 0x18, 0x40, 0xd8, 0x8a, 0x16, 0x2a, 0xa4, 0x30, 0x79, 0xd8, 0x6c, 0x6b, 0xc3, 0xa3,
+ 0x0d, 0x56, 0x10, 0x89, 0x18, 0xc5, 0x2c, 0xc1, 0x0c, 0x04, 0x01, 0xd4, 0x68, 0x20, 0x48, 0x4a,
+ 0x44, 0x15, 0xc2, 0x12, 0x82, 0x88, 0x47, 0x90, 0x90, 0xc0, 0x15, 0x2b, 0x24, 0x16, 0x71, 0x9b,
+ 0x30, 0x80, 0xb3, 0x8b, 0x03, 0x87, 0x10, 0x4e, 0x78, 0x18, 0x71, 0x83, 0x25, 0x8b, 0x11, 0x5a,
+ 0x71, 0xdc, 0xa0, 0x71, 0x43, 0x61, 0x2a, 0x10, 0xab, 0xf0, 0xeb, 0x30, 0x00, 0x30, 0xc4, 0x5c,
+ 0x5a, 0x3a, 0xb4, 0x1c, 0x71, 0x49, 0x44, 0x00, 0x6b, 0x23, 0x32, 0x59, 0x44, 0xd9, 0x61, 0x8d,
+ 0x66, 0x8e, 0x5d, 0x3c, 0x2c, 0x42, 0xd9, 0x74, 0x43, 0x41, 0xad, 0x03, 0xa4, 0x56, 0xc8, 0x64,
+ 0x4a, 0xeb, 0xca, 0x0c, 0x6d, 0xb7, 0x0e, 0x26, 0x3b, 0x21, 0xde, 0xdf, 0x0d, 0x02, 0x20, 0x52,
+ 0x98, 0x28, 0xf2, 0x45, 0xd8, 0x8c, 0x91, 0x13, 0x2c, 0x42, 0x9d, 0x3a, 0x15, 0xe9, 0xd8, 0x3b,
+ 0x47, 0xea, 0xc2, 0xbd, 0x7b, 0x72, 0xe9, 0x00, 0xde, 0xb4, 0x6a, 0x19, 0x4f, 0xde, 0x8d, 0xf3,
+ 0x9c, 0x78, 0xc8, 0x93, 0xaf, 0x73, 0x5e, 0xe2, 0x8e, 0x34, 0xf0, 0xe3, 0x7f, 0xc9, 0x6e, 0x22,
+ 0x0f, 0xc1, 0x3b, 0x59, 0xb2, 0x37, 0x00, 0x70, 0x24, 0x4c, 0x98, 0x17, 0x25, 0xe8, 0xe7, 0x52,
+ 0x7b, 0x02, 0x16, 0x68, 0x20, 0x72, 0x01, 0x00, 0x60, 0xc2, 0x1f, 0x58, 0xe8, 0xf0, 0xc3, 0x0f,
+ 0x0d, 0xf8, 0x21, 0x61, 0x42, 0x12, 0xfa, 0xd1, 0xc0, 0x83, 0x3a, 0x60, 0xf1, 0x87, 0x09, 0x2a,
+ 0x4d, 0x54, 0x02, 0x2e, 0x7d, 0x08, 0x71, 0x02, 0x10, 0x28, 0x34, 0xe0, 0x83, 0x0f, 0x49, 0x24,
+ 0xe1, 0xc5, 0x8a, 0x2c, 0xa6, 0x78, 0x62, 0x03, 0x28, 0x00, 0x71, 0x82, 0x10, 0x7d, 0xe0, 0x52,
+ 0x02, 0x81, 0xc8, 0x05, 0x04, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x0a, 0x00, 0x2c, 0x0c,
+ 0x00, 0x15, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x00, 0x08, 0xff, 0x00, 0x15, 0x08, 0x1c, 0x48, 0xb0,
+ 0xe0, 0xc0, 0x0c, 0x08, 0x0c, 0x2a, 0x5c, 0x38, 0x70, 0x00, 0x80, 0x82, 0x00, 0x06, 0x30, 0x9c,
+ 0x58, 0x10, 0x03, 0xc5, 0x8b, 0x18, 0x33, 0x6a, 0xdc, 0xc8, 0xb1, 0xe3, 0xc2, 0x08, 0x12, 0x3d,
+ 0x52, 0x8c, 0xf0, 0x6e, 0x61, 0x80, 0x00, 0xc1, 0x9a, 0x04, 0x3b, 0x19, 0x40, 0xe4, 0xc0, 0x00,
+ 0xc2, 0x0e, 0x25, 0x52, 0x21, 0x10, 0xca, 0xa1, 0x66, 0x2d, 0x45, 0x4e, 0x39, 0xd4, 0xa3, 0x45,
+ 0x0b, 0x17, 0x2e, 0x08, 0x46, 0x11, 0x96, 0x73, 0x63, 0x30, 0x27, 0x0a, 0x5c, 0x14, 0x52, 0x30,
+ 0x65, 0x48, 0x41, 0x2e, 0x84, 0x8a, 0x62, 0x9c, 0x82, 0x48, 0x01, 0x17, 0x2b, 0x54, 0x0a, 0x71,
+ 0x51, 0xc8, 0x45, 0x98, 0xc6, 0x00, 0x87, 0x14, 0xb4, 0xb0, 0x32, 0x24, 0x28, 0x43, 0x44, 0x52,
+ 0x27, 0x0a, 0xeb, 0xd9, 0x82, 0x09, 0x4d, 0x8a, 0xce, 0x14, 0x66, 0x28, 0x08, 0x56, 0x01, 0x11,
+ 0x8d, 0x51, 0xd2, 0x8e, 0x88, 0x37, 0xf0, 0x81, 0x82, 0x00, 0x89, 0xec, 0x2e, 0xc5, 0xd8, 0x23,
+ 0xd8, 0xc5, 0x26, 0x1d, 0x55, 0x2c, 0xbb, 0xe8, 0xb5, 0x23, 0xa1, 0xc3, 0x89, 0x1f, 0x53, 0x04,
+ 0x50, 0xa3, 0xa3, 0xe1, 0x8b, 0x4f, 0x38, 0xa2, 0xc5, 0xd8, 0x8c, 0x63, 0x5c, 0x8c, 0x01, 0xaa,
+ 0x6a, 0x7c, 0x98, 0x91, 0x4a, 0x46, 0xb3, 0x2e, 0x17, 0xaa, 0xf8, 0xec, 0x39, 0x35, 0xc5, 0x28,
+ 0x0c, 0x89, 0x90, 0xf6, 0xd8, 0x79, 0x21, 0x6b, 0x8f, 0x00, 0xa0, 0x28, 0x2c, 0xec, 0xda, 0x90,
+ 0x42, 0xd1, 0xae, 0x2b, 0x13, 0xec, 0xe1, 0xba, 0xa0, 0x94, 0xe3, 0xc5, 0x93, 0x5f, 0xfc, 0x32,
+ 0xa6, 0xb9, 0x73, 0x30, 0xc5, 0x03, 0xd8, 0x71, 0xf3, 0x86, 0x3a, 0x75, 0x3b, 0xc9, 0xc5, 0x18,
+ 0xdc, 0x93, 0xdc, 0xc6, 0x99, 0xef, 0xe0, 0x8f, 0x24, 0x42, 0x0f, 0x30, 0x86, 0xa0, 0x98, 0xd9,
+ 0xae, 0x03, 0xf8, 0xf8, 0xf2, 0xc5, 0x47, 0x5a, 0xe5, 0xf0, 0xe3, 0xcb, 0x9f, 0xff, 0xb2, 0x84,
+ 0x02, 0x66, 0x58, 0x74, 0x28, 0xf8, 0x31, 0xd0, 0x8f, 0xff, 0xff, 0x03, 0xf1, 0xa7, 0x03, 0x16,
+ 0xcc, 0x64, 0xb1, 0x88, 0x54, 0x01, 0xe8, 0x47, 0x10, 0x0a, 0x02, 0xf9, 0xa0, 0x40, 0x12, 0x10,
+ 0x46, 0xa8, 0x80, 0x83, 0x0a, 0x30, 0xd8, 0x9f, 0x0e, 0x01, 0x04, 0x04, 0x00, 0x21, 0xf9, 0x04,
+ 0x05, 0x04, 0x00, 0x07, 0x00, 0x2c, 0x0b, 0x00, 0x14, 0x00, 0x22, 0x00, 0x2e, 0x00, 0x00, 0x08,
+ 0xff, 0x00, 0x0f, 0x08, 0x1c, 0x48, 0xb0, 0x60, 0x41, 0x00, 0x06, 0x13, 0x2a, 0x5c, 0x28, 0x90,
+ 0x82, 0x07, 0x86, 0x10, 0x07, 0x02, 0x88, 0x97, 0x21, 0xa2, 0x45, 0x85, 0x0a, 0x2e, 0x6a, 0xdc,
+ 0xc8, 0xb1, 0xa3, 0xc7, 0x8f, 0x09, 0x23, 0x3c, 0x04, 0x09, 0x71, 0x04, 0xc3, 0x26, 0xcd, 0xac,
+ 0x58, 0x11, 0x46, 0xb2, 0xa0, 0x33, 0x44, 0x2a, 0x5a, 0x08, 0x6c, 0xc1, 0x64, 0x49, 0x30, 0x92,
+ 0xc2, 0x9c, 0xc8, 0x74, 0xe1, 0x84, 0x08, 0x41, 0x2e, 0xcd, 0x3e, 0x12, 0xe2, 0x72, 0x80, 0xcb,
+ 0x90, 0x2a, 0xc2, 0x96, 0x14, 0x54, 0x31, 0xa4, 0xa3, 0x30, 0xa2, 0x4e, 0x84, 0x15, 0x21, 0x22,
+ 0xd3, 0xa0, 0x8a, 0xa0, 0x1b, 0xa3, 0x08, 0x24, 0x54, 0xa8, 0xaa, 0x42, 0x2e, 0x37, 0x2f, 0x36,
+ 0xab, 0xea, 0xc2, 0xeb, 0x42, 0xa5, 0x06, 0x2b, 0x4a, 0x14, 0x68, 0xe8, 0x40, 0x94, 0x22, 0x17,
+ 0x99, 0x18, 0x1c, 0x11, 0x8f, 0x20, 0x89, 0x03, 0x8b, 0x6a, 0x1c, 0x60, 0xa2, 0xd5, 0x62, 0x0b,
+ 0x96, 0x11, 0x09, 0x79, 0xc4, 0x0a, 0x91, 0xf0, 0x46, 0xb8, 0x11, 0xa9, 0x0c, 0xb6, 0xb8, 0xa8,
+ 0x07, 0xc7, 0xbf, 0x17, 0xfb, 0x6a, 0xf4, 0x79, 0xd1, 0x19, 0xc7, 0xa6, 0x2d, 0x17, 0x2e, 0xca,
+ 0x9c, 0x50, 0xaf, 0x47, 0xcf, 0x9c, 0x43, 0x6b, 0x44, 0x24, 0xda, 0x20, 0xe2, 0xd2, 0x03, 0xf3,
+ 0x2a, 0x6c, 0x92, 0x59, 0x32, 0x41, 0x60, 0xa1, 0x5d, 0x2c, 0x45, 0x5d, 0xa4, 0x36, 0xea, 0xdb,
+ 0x10, 0xbf, 0x84, 0x9e, 0x73, 0xc0, 0x4d, 0xef, 0xde, 0xbc, 0x39, 0xef, 0x31, 0x98, 0x27, 0xf4,
+ 0x11, 0x34, 0xc8, 0x93, 0xef, 0x10, 0x2d, 0x86, 0x60, 0x18, 0xd4, 0x7c, 0xba, 0x74, 0x09, 0x82,
+ 0xbb, 0xba, 0xf5, 0xeb, 0x9c, 0x4d, 0x1c, 0xc0, 0x32, 0x10, 0x57, 0xc1, 0x3e, 0x7d, 0x0a, 0x7a,
+ 0x14, 0x17, 0x88, 0xe5, 0x8f, 0x76, 0x83, 0x3f, 0x14, 0x26, 0x19, 0xe8, 0xc5, 0xcb, 0xc0, 0xf5,
+ 0x06, 0xfb, 0xa4, 0x0f, 0x08, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x1f, 0x00, 0x2c, 0x0a,
+ 0x00, 0x14, 0x00, 0x23, 0x00, 0x2e, 0x00, 0x00, 0x08, 0xff, 0x00, 0x3f, 0x08, 0x1c, 0x48, 0xb0,
+ 0x60, 0xc1, 0x0c, 0x24, 0x0c, 0x2a, 0x5c, 0x48, 0x70, 0xc4, 0x08, 0x83, 0x0c, 0x18, 0x4a, 0x54,
+ 0x18, 0x71, 0xa2, 0xc5, 0x8b, 0x17, 0x3d, 0x60, 0xdc, 0x78, 0x90, 0xa3, 0xc7, 0x8b, 0x0f, 0x3f,
+ 0x62, 0x04, 0x00, 0xe1, 0x9d, 0xc8, 0x93, 0x04, 0x01, 0x34, 0x3b, 0x14, 0x85, 0x08, 0xa2, 0x43,
+ 0xce, 0x82, 0x9d, 0x04, 0x41, 0xd0, 0x19, 0x93, 0x16, 0x2d, 0x08, 0xb6, 0x58, 0xb1, 0x64, 0x11,
+ 0x4a, 0x00, 0x87, 0x72, 0x72, 0x51, 0x52, 0x44, 0x90, 0x4e, 0x44, 0xc2, 0x4e, 0x3e, 0x69, 0xe1,
+ 0x42, 0x50, 0x15, 0x2b, 0x82, 0x9c, 0x14, 0x6c, 0xc1, 0xa4, 0xc9, 0x47, 0x63, 0x4c, 0xa5, 0x50,
+ 0x71, 0x92, 0x53, 0x61, 0x8b, 0x28, 0x1e, 0x09, 0xf5, 0xf8, 0xe0, 0x62, 0x08, 0x97, 0x89, 0x2d,
+ 0x9c, 0x71, 0x1c, 0xf6, 0x81, 0x0b, 0xd7, 0x8b, 0x88, 0x14, 0x66, 0x28, 0x18, 0xe0, 0x43, 0xb0,
+ 0x1a, 0x1f, 0x04, 0x0d, 0xc1, 0xa8, 0x22, 0x29, 0xc1, 0x01, 0xf1, 0x08, 0x7a, 0xa8, 0xdb, 0x2c,
+ 0xa7, 0x0b, 0x17, 0x1b, 0xd5, 0x5e, 0x54, 0xcc, 0xb1, 0xc5, 0x12, 0x8c, 0x8c, 0x39, 0x3e, 0xbe,
+ 0x58, 0xe4, 0x63, 0x5a, 0x8c, 0xc2, 0xba, 0x6e, 0x54, 0x41, 0x68, 0x23, 0x30, 0x8f, 0x5c, 0x00,
+ 0x6c, 0xdc, 0x2b, 0x99, 0x23, 0x00, 0x22, 0x1c, 0x65, 0x72, 0xec, 0x8c, 0x12, 0x23, 0x62, 0x89,
+ 0x3d, 0x2a, 0x9f, 0x9c, 0xdc, 0x7a, 0x22, 0xea, 0x85, 0x4c, 0x7c, 0xb6, 0x8e, 0x5c, 0x90, 0x36,
+ 0xca, 0x60, 0xaf, 0xa7, 0xfa, 0xad, 0x1d, 0xd7, 0x20, 0x94, 0xda, 0x03, 0x65, 0x23, 0xdf, 0x38,
+ 0x7c, 0xb9, 0x73, 0x86, 0x91, 0xba, 0x48, 0x9f, 0xfe, 0xbc, 0x84, 0x9b, 0x36, 0xd8, 0xb3, 0xb7,
+ 0x11, 0xbd, 0xfc, 0x8e, 0x41, 0x3a, 0xcf, 0xc1, 0xa8, 0x4c, 0x19, 0x4f, 0xfe, 0xcb, 0x73, 0x13,
+ 0x78, 0x08, 0xda, 0xf9, 0xf3, 0xfc, 0x43, 0x89, 0x17, 0x7b, 0xf6, 0xec, 0x30, 0xd1, 0xbe, 0xbe,
+ 0xfd, 0xfb, 0xf8, 0x17, 0x02, 0xc8, 0x22, 0x50, 0xc7, 0x8f, 0x0f, 0x7e, 0x0c, 0xd4, 0x47, 0x1f,
+ 0x02, 0x0d, 0x38, 0x50, 0x80, 0x3f, 0xe8, 0x20, 0x50, 0x16, 0xdc, 0x11, 0xb4, 0x48, 0x80, 0x27,
+ 0x0c, 0xe4, 0xc3, 0x07, 0x49, 0x08, 0xe4, 0x85, 0x17, 0x16, 0x62, 0x48, 0xe1, 0x07, 0x13, 0x0a,
+ 0x14, 0xa1, 0x1f, 0x8b, 0x04, 0x04, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x07, 0x00, 0x0c, 0x00, 0x2c,
+ 0x09, 0x00, 0x13, 0x00, 0x24, 0x00, 0x2f, 0x00, 0x00, 0x08, 0xff, 0x00, 0x19, 0x08, 0x1c, 0x48,
+ 0xb0, 0xa0, 0x41, 0x06, 0x11, 0x0e, 0x2a, 0x5c, 0x28, 0x10, 0xc4, 0xc1, 0x08, 0x1e, 0x18, 0x4a,
+ 0x2c, 0x08, 0xc1, 0xe1, 0xc4, 0x8b, 0x18, 0x19, 0x52, 0xc8, 0xc8, 0x91, 0xe0, 0xba, 0x0c, 0x1d,
+ 0x43, 0x8a, 0x1c, 0xa9, 0xd0, 0x03, 0x09, 0x92, 0x17, 0x37, 0x4a, 0x5c, 0x56, 0x44, 0x8a, 0x33,
+ 0x42, 0x00, 0x50, 0x82, 0x1c, 0x18, 0x6c, 0x09, 0x97, 0x16, 0x38, 0x71, 0xae, 0x38, 0x24, 0x6c,
+ 0xa4, 0x4a, 0x06, 0xcd, 0x6e, 0x32, 0x70, 0x41, 0x84, 0xc9, 0xc0, 0x16, 0x35, 0x96, 0xa0, 0x74,
+ 0xe6, 0x82, 0x01, 0x93, 0x21, 0x55, 0xaa, 0x28, 0x25, 0xd8, 0xe2, 0xd0, 0x48, 0x67, 0x2a, 0x18,
+ 0x18, 0xaa, 0x52, 0xc4, 0x09, 0x4e, 0x83, 0x55, 0x43, 0x36, 0x59, 0xc1, 0x80, 0x4b, 0x95, 0x27,
+ 0x2d, 0x18, 0xaa, 0x68, 0xd6, 0xf1, 0x50, 0x5a, 0x15, 0x4c, 0xd2, 0x4a, 0x44, 0xc4, 0xb1, 0x49,
+ 0x0d, 0x06, 0x4a, 0x0a, 0x61, 0x6c, 0xb1, 0xcc, 0xe0, 0xcc, 0x81, 0x01, 0x04, 0x3a, 0x4b, 0xab,
+ 0x24, 0xca, 0xde, 0xa9, 0x03, 0x23, 0xc4, 0x23, 0xf8, 0x6e, 0xa6, 0x55, 0x06, 0x5f, 0x31, 0x3e,
+ 0xbe, 0x38, 0x4c, 0xa4, 0xa1, 0x8c, 0x93, 0x39, 0x56, 0xc6, 0x28, 0x48, 0x64, 0x66, 0x89, 0x6c,
+ 0x3b, 0xb6, 0x70, 0x96, 0x71, 0x11, 0x97, 0x8e, 0x35, 0x82, 0x71, 0xec, 0xcc, 0xf1, 0xf3, 0xc4,
+ 0x45, 0x46, 0x31, 0x9e, 0x46, 0x29, 0x71, 0x05, 0x21, 0xda, 0x0c, 0x5d, 0x84, 0xc6, 0xad, 0xd0,
+ 0x18, 0x6d, 0x00, 0xb1, 0x0f, 0xce, 0xa6, 0x8d, 0xd8, 0x20, 0x6b, 0xda, 0xc2, 0xb2, 0x1e, 0xbc,
+ 0xcd, 0x1b, 0xca, 0xc1, 0x15, 0x31, 0x79, 0x93, 0x36, 0x38, 0x84, 0x37, 0x41, 0x2b, 0xd8, 0xb1,
+ 0x5b, 0xdf, 0x3e, 0xb1, 0x04, 0x83, 0x48, 0xe0, 0xc3, 0x33, 0x58, 0xf0, 0xce, 0x1b, 0x0b, 0x9b,
+ 0xf3, 0xe8, 0xcf, 0x63, 0xd9, 0x0e, 0x27, 0xfd, 0x79, 0x37, 0xd1, 0x79, 0x8f, 0x59, 0x43, 0xbf,
+ 0xbe, 0x18, 0xee, 0x3a, 0xe2, 0x10, 0x7c, 0x83, 0x8b, 0x3b, 0x03, 0x2c, 0x5d, 0xcc, 0x21, 0x47,
+ 0x17, 0x3a, 0xf8, 0x67, 0xe0, 0x81, 0x08, 0x26, 0xa8, 0x90, 0x77, 0xcc, 0x0c, 0xd4, 0x9f, 0x40,
+ 0x7d, 0x18, 0x14, 0xa1, 0x40, 0x0f, 0x32, 0xd0, 0x20, 0x79, 0x05, 0x35, 0x28, 0x04, 0x03, 0x40,
+ 0xa0, 0x50, 0x90, 0x17, 0x02, 0xf1, 0x21, 0x22, 0x03, 0x20, 0x12, 0x84, 0x02, 0x10, 0x0c, 0x6c,
+ 0xc8, 0x4c, 0x40, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x1d, 0x00, 0x2c, 0x08, 0x00, 0x12,
+ 0x00, 0x26, 0x00, 0x30, 0x00, 0x00, 0x08, 0xff, 0x00, 0x3b, 0x08, 0x1c, 0x48, 0xb0, 0xa0, 0x41,
+ 0x81, 0x00, 0x0e, 0x2a, 0x5c, 0x38, 0x30, 0x03, 0x85, 0x83, 0x0c, 0x3c, 0x30, 0x9c, 0x68, 0x70,
+ 0x84, 0x44, 0x83, 0x0c, 0x28, 0x6a, 0xdc, 0xc8, 0xb1, 0xa3, 0x46, 0x10, 0x03, 0x3c, 0x16, 0x44,
+ 0xb0, 0xf1, 0xa1, 0xc8, 0x93, 0x13, 0x23, 0x64, 0x40, 0xd9, 0x11, 0x81, 0x3c, 0x96, 0x1d, 0x33,
+ 0x2e, 0x5c, 0xe4, 0xec, 0x10, 0x22, 0x22, 0x88, 0x86, 0x39, 0x6b, 0x02, 0x13, 0x43, 0x00, 0x82,
+ 0x4b, 0xb8, 0xb4, 0x28, 0xd8, 0xa2, 0xc6, 0xa1, 0x60, 0x07, 0x11, 0x44, 0x98, 0xc8, 0xe0, 0x67,
+ 0x87, 0x26, 0x51, 0x86, 0x72, 0x29, 0x24, 0x45, 0x09, 0xc1, 0x16, 0x4c, 0x08, 0x19, 0x34, 0xa9,
+ 0xb1, 0x09, 0x91, 0x16, 0x2e, 0x04, 0x4d, 0x21, 0xb4, 0x24, 0x8a, 0xc1, 0x15, 0x5a, 0x51, 0x46,
+ 0x5d, 0x61, 0x85, 0x4a, 0xd4, 0x85, 0x4c, 0x90, 0x8a, 0x1c, 0x32, 0x94, 0x88, 0x15, 0x2e, 0x13,
+ 0x5b, 0x1c, 0x12, 0xb9, 0x08, 0xef, 0x0a, 0x17, 0x43, 0x29, 0xf6, 0x10, 0xe6, 0xd1, 0xd9, 0x50,
+ 0x2b, 0x1d, 0x97, 0x1c, 0x5c, 0x49, 0xd0, 0x69, 0x87, 0xbd, 0x1d, 0x0c, 0xad, 0xe0, 0x68, 0xc8,
+ 0x20, 0x80, 0x77, 0x04, 0xdf, 0x01, 0x70, 0x8a, 0xe8, 0x24, 0x30, 0x8f, 0x89, 0x4e, 0x42, 0xf1,
+ 0xd8, 0x59, 0xe4, 0xe7, 0x8e, 0xc3, 0x4e, 0x56, 0xee, 0xe8, 0xec, 0xa4, 0xe2, 0x8e, 0x4d, 0x6a,
+ 0x78, 0x74, 0x41, 0xd8, 0x23, 0x64, 0x98, 0x1a, 0xe5, 0x72, 0xe4, 0x89, 0xbb, 0xb7, 0xe0, 0x89,
+ 0x3d, 0x7c, 0x1b, 0xf3, 0x4d, 0xb1, 0x2f, 0x43, 0xdd, 0xb8, 0x05, 0x2d, 0xbc, 0xdd, 0x3b, 0xed,
+ 0xc1, 0x66, 0xc4, 0x3b, 0x2c, 0x92, 0x6d, 0xb0, 0x06, 0x72, 0xdf, 0xc1, 0x0b, 0x32, 0x8a, 0xce,
+ 0xbd, 0x3b, 0xcb, 0x3f, 0x5f, 0x0e, 0x66, 0x60, 0xe1, 0xde, 0x47, 0xa1, 0x1f, 0xee, 0x25, 0xda,
+ 0x18, 0x64, 0xf3, 0xa7, 0x7b, 0x18, 0x36, 0xf0, 0xe3, 0xeb, 0xf1, 0xde, 0x67, 0x0d, 0x41, 0x35,
+ 0x27, 0xbc, 0x77, 0xe8, 0x13, 0x26, 0x4d, 0x9a, 0x3d, 0x42, 0xe8, 0x37, 0x10, 0x00, 0x09, 0x09,
+ 0x68, 0xe0, 0x81, 0x08, 0x0a, 0x64, 0xc2, 0x1f, 0x58, 0xe8, 0xf0, 0x03, 0x2e, 0xe7, 0xed, 0xa7,
+ 0x50, 0x79, 0x1d, 0xf8, 0x81, 0xcb, 0x0f, 0x3a, 0x60, 0xf1, 0x87, 0x09, 0x0b, 0xe9, 0x40, 0xa1,
+ 0x40, 0x3e, 0x74, 0x90, 0x44, 0x07, 0x5e, 0x74, 0xc0, 0x07, 0x1f, 0x03, 0xa1, 0x58, 0xe2, 0x88,
+ 0x21, 0x0e, 0xd4, 0x87, 0x0e, 0x1d, 0x04, 0x04, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x24,
+ 0x00, 0x2c, 0x08, 0x00, 0x11, 0x00, 0x26, 0x00, 0x31, 0x00, 0x00, 0x08, 0xff, 0x00, 0x49, 0x08,
+ 0x1c, 0x48, 0xb0, 0xa0, 0xc1, 0x83, 0x08, 0x13, 0x1a, 0xcc, 0x80, 0x90, 0x02, 0x04, 0x85, 0x10,
+ 0x0d, 0xbe, 0x1b, 0x10, 0xb1, 0xa2, 0xc5, 0x8b, 0x18, 0x33, 0x16, 0x64, 0xa0, 0x51, 0x23, 0x82,
+ 0x0d, 0x1d, 0x43, 0x86, 0x04, 0x00, 0x40, 0x24, 0x41, 0x10, 0x18, 0x4c, 0x5a, 0xcc, 0x90, 0x52,
+ 0xa5, 0x4b, 0x12, 0xc2, 0x96, 0x44, 0x81, 0xd2, 0xa2, 0x06, 0x22, 0x41, 0xcb, 0x44, 0x7a, 0x28,
+ 0x39, 0x70, 0xca, 0xa1, 0x1e, 0x07, 0x5b, 0xfc, 0x12, 0x76, 0x50, 0x81, 0x02, 0x85, 0x01, 0x02,
+ 0x0c, 0x14, 0x46, 0x44, 0x20, 0x91, 0x25, 0x56, 0x04, 0x15, 0x5c, 0xd1, 0xec, 0x20, 0xcf, 0x88,
+ 0xc2, 0xb8, 0x90, 0x58, 0x31, 0x84, 0x84, 0x15, 0x25, 0x4e, 0x0c, 0xf6, 0xa8, 0xda, 0x71, 0x51,
+ 0x53, 0x2e, 0x84, 0x08, 0x35, 0x4d, 0xb8, 0x82, 0xa8, 0x46, 0x63, 0x03, 0xa5, 0xb8, 0x88, 0x38,
+ 0x4c, 0x63, 0x93, 0x1a, 0x24, 0x98, 0xac, 0xb0, 0xa8, 0x22, 0x67, 0x47, 0x42, 0x4f, 0x2e, 0x4a,
+ 0x2d, 0x78, 0x55, 0xa0, 0xd2, 0x81, 0x75, 0x49, 0x38, 0x99, 0x6b, 0x31, 0x8a, 0xc1, 0x0d, 0xf1,
+ 0x06, 0x7a, 0x48, 0x3a, 0x10, 0x58, 0x47, 0x28, 0x19, 0x31, 0x6b, 0x84, 0x91, 0xd1, 0xb2, 0xc6,
+ 0x44, 0x2f, 0x43, 0x13, 0xec, 0x2a, 0x5a, 0x21, 0x50, 0x8c, 0xa7, 0x4b, 0xab, 0x5e, 0xcd, 0xba,
+ 0xb4, 0x8a, 0x97, 0x83, 0x5b, 0xcb, 0x4e, 0x08, 0x77, 0xf6, 0xc0, 0x16, 0xb6, 0x4d, 0xaf, 0x7e,
+ 0x9d, 0xbb, 0xb7, 0x6f, 0x81, 0x5f, 0x82, 0x0b, 0xff, 0xdd, 0xa7, 0xb4, 0x09, 0x36, 0x07, 0xb1,
+ 0xa8, 0xde, 0x63, 0x30, 0xcf, 0x6a, 0x21, 0x6a, 0x08, 0xa6, 0x01, 0xd2, 0x7a, 0xcf, 0x19, 0x33,
+ 0x7a, 0x4e, 0xfc, 0xde, 0xce, 0xbd, 0x7b, 0xc7, 0xe2, 0xa2, 0x7f, 0x28, 0x08, 0xe4, 0x63, 0x90,
+ 0x7c, 0x42, 0xf1, 0x01, 0x01, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00, 0x26, 0x00, 0x2c, 0x07,
+ 0x00, 0x11, 0x00, 0x28, 0x00, 0x14, 0x00, 0x00, 0x08, 0x67, 0x00, 0x4d, 0x08, 0x1c, 0x48, 0xb0,
+ 0xa0, 0x41, 0x81, 0x14, 0x1e, 0x1c, 0x5c, 0xc8, 0x90, 0xe0, 0x88, 0x0d, 0x0b, 0x19, 0x78, 0x68,
+ 0x48, 0xf1, 0x20, 0x80, 0x8a, 0x18, 0x33, 0x6a, 0xdc, 0xc8, 0xb1, 0x21, 0x80, 0x77, 0x14, 0x3a,
+ 0x56, 0x8c, 0x70, 0x50, 0xa1, 0xc8, 0x81, 0x24, 0x42, 0x9e, 0x34, 0xa8, 0x72, 0x61, 0x80, 0x00,
+ 0x2b, 0x0b, 0x52, 0x90, 0x17, 0xb3, 0xa6, 0x4d, 0x8d, 0x19, 0x6e, 0x9a, 0x60, 0x40, 0x71, 0x00,
+ 0x00, 0x98, 0x36, 0xdf, 0x5d, 0xd4, 0x49, 0xb4, 0xa8, 0xd1, 0xa3, 0x48, 0x93, 0x2a, 0x2d, 0x98,
+ 0x53, 0xe0, 0x4f, 0xa4, 0x24, 0x22, 0x44, 0x88, 0x37, 0xf0, 0x01, 0x50, 0xa3, 0x14, 0x32, 0x04,
+ 0x04, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x06, 0x00, 0x24, 0x00, 0x2c, 0x07, 0x00, 0x10, 0x00, 0x28,
+ 0x00, 0x15, 0x00, 0x00, 0x06, 0x54, 0x40, 0x92, 0x70, 0x48, 0x2c, 0x1a, 0x85, 0x94, 0xc7, 0x71,
+ 0xc9, 0x24, 0x62, 0x28, 0x4b, 0x86, 0xa7, 0x49, 0x3d, 0x22, 0x94, 0xd5, 0xac, 0x76, 0xcb, 0xed,
+ 0x32, 0x47, 0x13, 0x2f, 0x95, 0x02, 0x59, 0x0e, 0xc4, 0xc3, 0x47, 0xa0, 0x18, 0x58, 0xa3, 0x9b,
+ 0xed, 0x77, 0x71, 0xc2, 0x90, 0x73, 0x41, 0xf6, 0xbc, 0x9e, 0xfa, 0xa0, 0xb8, 0xf3, 0x03, 0x78,
+ 0x4c, 0x71, 0x7b, 0x67, 0x7b, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x44, 0x00, 0x43, 0x00,
+ 0x7f, 0x8a, 0x08, 0x08, 0x43, 0x08, 0x93, 0x89, 0x0c, 0x41, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04,
+ 0x00, 0x25, 0x00, 0x2c, 0x07, 0x00, 0x0f, 0x00, 0x29, 0x00, 0x16, 0x00, 0x00, 0x08, 0x67, 0x00,
+ 0x4b, 0x08, 0x1c, 0x48, 0xb0, 0xa0, 0x41, 0x81, 0x14, 0x36, 0x1c, 0x5c, 0xc8, 0x90, 0x60, 0x86,
+ 0x11, 0x0c, 0x19, 0x78, 0x68, 0x48, 0xf1, 0x60, 0x86, 0x75, 0x15, 0x33, 0x6a, 0xdc, 0xc8, 0xb1,
+ 0xa3, 0x46, 0x04, 0x00, 0x3c, 0x8a, 0x14, 0x38, 0x71, 0xa4, 0xc0, 0x01, 0x06, 0x01, 0x40, 0x34,
+ 0xc9, 0x30, 0x40, 0x00, 0x96, 0x30, 0x1b, 0xca, 0xab, 0x18, 0xe1, 0x41, 0x4c, 0x8e, 0x24, 0x6e,
+ 0x8a, 0xa4, 0xa0, 0x33, 0x23, 0x05, 0x97, 0x3d, 0x4b, 0xbc, 0x5b, 0x19, 0x94, 0x21, 0xd1, 0xa2,
+ 0x48, 0x93, 0x2a, 0x5d, 0xca, 0xb4, 0x69, 0x4c, 0x00, 0x2f, 0x97, 0x3e, 0x48, 0x28, 0x90, 0x44,
+ 0x54, 0xa5, 0x03, 0x00, 0x04, 0x04, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x26, 0x00, 0x2c,
+ 0x09, 0x00, 0x0e, 0x00, 0x28, 0x00, 0x17, 0x00, 0x00, 0x06, 0x57, 0x40, 0x93, 0x70, 0x48, 0x2c,
+ 0x1a, 0x29, 0x0a, 0xa3, 0x72, 0xc9, 0x5c, 0x32, 0x3c, 0xcd, 0xa8, 0x11, 0x81, 0x90, 0x5a, 0xad,
+ 0x94, 0xab, 0x76, 0xab, 0xa5, 0x44, 0xb8, 0xe0, 0x21, 0x04, 0x14, 0x36, 0x3d, 0x94, 0x19, 0x52,
+ 0xb9, 0x09, 0x08, 0x18, 0x03, 0xee, 0xb5, 0x7c, 0x1e, 0x3e, 0x37, 0x11, 0x10, 0xba, 0x30, 0x6e,
+ 0x05, 0xe8, 0xad, 0x08, 0x14, 0x7c, 0x7f, 0x26, 0x0d, 0x7e, 0x45, 0x83, 0x84, 0x10, 0x19, 0x84,
+ 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x42, 0x6d, 0x95, 0x1b, 0x26, 0x08, 0x89, 0x90,
+ 0x5f, 0x41, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x26, 0x00, 0x2c, 0x08, 0x00, 0x0d, 0x00,
+ 0x29, 0x00, 0x18, 0x00, 0x00, 0x08, 0x6e, 0x00, 0x4d, 0x08, 0x1c, 0x48, 0xb0, 0xa0, 0x41, 0x13,
+ 0x19, 0x48, 0x1c, 0x5c, 0xc8, 0xb0, 0x61, 0x41, 0x06, 0x1e, 0x1c, 0x4a, 0x2c, 0x08, 0x02, 0xc0,
+ 0xc4, 0x8b, 0x12, 0x37, 0x60, 0xdc, 0xc8, 0xf1, 0x22, 0x83, 0x8e, 0x20, 0x05, 0x32, 0x90, 0x67,
+ 0x11, 0x24, 0x85, 0x83, 0x09, 0x19, 0x2a, 0x04, 0x19, 0x20, 0xc0, 0xc1, 0x96, 0x21, 0x1d, 0xba,
+ 0x8c, 0x49, 0x53, 0xe2, 0xca, 0x86, 0x25, 0x6b, 0x0a, 0xa4, 0x90, 0xc1, 0xa1, 0x46, 0x9d, 0x1d,
+ 0x23, 0xcc, 0x04, 0xea, 0x10, 0x00, 0x4c, 0xa2, 0x04, 0x49, 0xbc, 0x43, 0x3a, 0xf1, 0x23, 0xd3,
+ 0xa7, 0x50, 0xa3, 0x4a, 0x9d, 0x4a, 0xb5, 0xaa, 0xd5, 0xa1, 0x54, 0x1f, 0x20, 0x78, 0x80, 0x75,
+ 0xea, 0x00, 0x06, 0x01, 0x01, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x07, 0x00, 0x24, 0x00, 0x2c, 0x07,
+ 0x00, 0x0c, 0x00, 0x2b, 0x00, 0x19, 0x00, 0x00, 0x08, 0x69, 0x00, 0x49, 0x08, 0x1c, 0x48, 0xb0,
+ 0xa0, 0xc1, 0x81, 0x0c, 0x0e, 0x2a, 0x5c, 0xc8, 0xf0, 0x20, 0x03, 0x0f, 0x0d, 0x23, 0x4a, 0x9c,
+ 0x48, 0x51, 0x21, 0x84, 0x8a, 0x18, 0x33, 0x6a, 0xdc, 0x88, 0x11, 0xc3, 0x04, 0x8e, 0x08, 0x14,
+ 0x02, 0x18, 0xc1, 0x30, 0xc3, 0xc6, 0x00, 0x28, 0x0f, 0xa6, 0xe4, 0xc8, 0xb2, 0xa5, 0xcb, 0x97,
+ 0x1a, 0x33, 0x7c, 0x84, 0x39, 0x71, 0xa5, 0x44, 0x0a, 0x34, 0x27, 0x82, 0x18, 0x10, 0x20, 0x67,
+ 0xc1, 0x0c, 0x24, 0x0b, 0xf6, 0xf4, 0x49, 0x50, 0x5e, 0x48, 0xa2, 0x48, 0x33, 0x36, 0x48, 0xca,
+ 0xd0, 0x26, 0xd3, 0xa7, 0x50, 0xa3, 0x4a, 0x9d, 0x2a, 0x94, 0xea, 0x83, 0x8f, 0x03, 0xa8, 0x0e,
+ 0xa0, 0x10, 0x10, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x25, 0x00, 0x2c, 0x07, 0x00, 0x0c,
+ 0x00, 0x2c, 0x00, 0x19, 0x00, 0x00, 0x06, 0x56, 0xc0, 0x92, 0x70, 0x48, 0x2c, 0x1a, 0x85, 0x14,
+ 0xcc, 0x71, 0xc9, 0x6c, 0x3a, 0x9f, 0xd0, 0xa8, 0x74, 0x3a, 0x04, 0x78, 0xa8, 0xd8, 0xac, 0x33,
+ 0xb3, 0xd1, 0x0a, 0x01, 0xcb, 0x40, 0xa4, 0xa9, 0xf0, 0x02, 0x02, 0x61, 0xb4, 0x77, 0xcd, 0x6e,
+ 0xbb, 0xd7, 0x01, 0xd2, 0xf8, 0x1d, 0x0d, 0xa8, 0xe9, 0x78, 0xe1, 0xe6, 0x9e, 0x6f, 0x52, 0xf8,
+ 0x7d, 0x25, 0x18, 0x65, 0x81, 0x4d, 0x18, 0x19, 0x85, 0x89, 0x53, 0x01, 0x5d, 0x8a, 0x8e, 0x8f,
+ 0x90, 0x91, 0x92, 0x93, 0x4d, 0x80, 0x8f, 0x0f, 0x20, 0x76, 0x93, 0x03, 0x14, 0x41, 0x00, 0x21,
+ 0xf9, 0x04, 0x05, 0x04, 0x00, 0x1c, 0x00, 0x2c, 0x0a, 0x00, 0x0b, 0x00, 0x2a, 0x00, 0x1a, 0x00,
+ 0x00, 0x08, 0x69, 0x00, 0x39, 0x08, 0x1c, 0x48, 0xb0, 0xa0, 0xc1, 0x0c, 0x06, 0x13, 0x2a, 0x5c,
+ 0xc8, 0x90, 0x81, 0x07, 0x86, 0x10, 0x23, 0x4a, 0x9c, 0x48, 0xb1, 0xa2, 0xc5, 0x8b, 0x0c, 0x23,
+ 0x20, 0xc4, 0xa8, 0x30, 0xc0, 0x46, 0x85, 0xf2, 0x28, 0x58, 0xcc, 0x40, 0x21, 0xc0, 0x42, 0x93,
+ 0x1c, 0x4f, 0xa6, 0x5c, 0xc9, 0xb2, 0x65, 0x44, 0x00, 0x1b, 0x5c, 0x52, 0x0c, 0x80, 0x52, 0xa6,
+ 0xcd, 0x9b, 0x12, 0x47, 0xe0, 0x54, 0x48, 0x41, 0x24, 0x87, 0x9a, 0x3b, 0x09, 0xca, 0x1b, 0x10,
+ 0xb4, 0xe8, 0xc4, 0x8f, 0x46, 0x0b, 0x02, 0x20, 0x9a, 0xb4, 0xa9, 0xd3, 0xa7, 0x50, 0xa3, 0x4a,
+ 0x35, 0x1a, 0x81, 0xe0, 0x03, 0x10, 0x4d, 0x91, 0x0e, 0xa0, 0x10, 0x10, 0x00, 0x21, 0xf9, 0x04,
+ 0x05, 0x03, 0x00, 0x1d, 0x00, 0x2c, 0x0a, 0x00, 0x0b, 0x00, 0x2b, 0x00, 0x1a, 0x00, 0x00, 0x06,
+ 0x54, 0xc0, 0x8e, 0x70, 0x48, 0x2c, 0x1a, 0x19, 0xc6, 0xa4, 0x72, 0xc9, 0x6c, 0x3a, 0x9f, 0xd0,
+ 0xa8, 0xd4, 0x48, 0x99, 0x5a, 0x93, 0x01, 0x00, 0x13, 0x04, 0xb2, 0x92, 0x32, 0xcc, 0xc0, 0xb5,
+ 0x19, 0x10, 0x8f, 0xcf, 0xe8, 0xb4, 0x75, 0xd4, 0x50, 0x4b, 0xcb, 0xee, 0xb8, 0x7c, 0x6c, 0x9e,
+ 0x3b, 0xe1, 0xf6, 0x24, 0xe3, 0x01, 0xce, 0x33, 0x49, 0x7e, 0x81, 0x6f, 0x11, 0x0f, 0x82, 0x58,
+ 0x75, 0x86, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8c, 0x01, 0x08, 0x44, 0x0f, 0x6d, 0x86, 0x01,
+ 0x48, 0x43, 0x03, 0x14, 0x41, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x07, 0x00, 0x12, 0x00, 0x2c, 0x13,
+ 0x00, 0x0d, 0x00, 0x23, 0x00, 0x18, 0x00, 0x00, 0x06, 0x47, 0x40, 0x89, 0x70, 0x48, 0x2c, 0x1a,
+ 0x8f, 0xc8, 0xa4, 0x24, 0x90, 0x51, 0x4a, 0x9a, 0xca, 0x40, 0x54, 0x49, 0xda, 0x28, 0x29, 0x52,
+ 0xa7, 0x76, 0xcb, 0xed, 0x7a, 0x8f, 0x01, 0xeb, 0xb7, 0x1b, 0xc8, 0x8e, 0xcf, 0xe8, 0xb4, 0x7a,
+ 0xcd, 0x06, 0xb0, 0x93, 0x10, 0xf1, 0x7b, 0xee, 0x8c, 0xd0, 0x8d, 0x4c, 0xca, 0x7d, 0xcf, 0xef,
+ 0xfb, 0xff, 0x80, 0x81, 0x73, 0x01, 0x18, 0x44, 0x0f, 0x03, 0x74, 0x01, 0x76, 0x43, 0x03, 0x19,
+ 0x41, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x1d, 0x00, 0x2c, 0x12, 0x00, 0x0c, 0x00, 0x25,
+ 0x00, 0x19, 0x00, 0x00, 0x05, 0x42, 0x60, 0x27, 0x8e, 0x64, 0x69, 0x9e, 0x68, 0x4a, 0x02, 0x91,
+ 0xea, 0xbe, 0x63, 0xe0, 0x52, 0x6e, 0x20, 0xc3, 0xe9, 0xf3, 0xde, 0x78, 0xef, 0xbb, 0x03, 0xc4,
+ 0x6f, 0x68, 0x1b, 0x1a, 0x8f, 0xc8, 0xa4, 0x72, 0xc9, 0x44, 0x0e, 0x00, 0xcd, 0x94, 0x27, 0x13,
+ 0xad, 0xee, 0x18, 0x0a, 0x6b, 0xa9, 0xa8, 0xed, 0x7a, 0xbf, 0xe0, 0xb0, 0x78, 0xdc, 0x0c, 0x60,
+ 0x48, 0x0f, 0x5a, 0x35, 0xd0, 0x1a, 0x3d, 0x43, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x0c,
+ 0x00, 0x2c, 0x1e, 0x00, 0x0c, 0x00, 0x19, 0x00, 0x19, 0x00, 0x00, 0x06, 0x38, 0x40, 0xca, 0x86,
+ 0x41, 0x2c, 0x1a, 0x8f, 0x48, 0x62, 0x20, 0x90, 0x6c, 0x3a, 0x9f, 0xd0, 0xa8, 0x74, 0x1a, 0xf0,
+ 0x4c, 0x9d, 0xcb, 0xab, 0x76, 0xcb, 0xed, 0x7a, 0xbf, 0xe0, 0xe7, 0x28, 0x12, 0x66, 0x90, 0xb9,
+ 0x81, 0xf3, 0x77, 0x09, 0x28, 0xbb, 0xdf, 0xf0, 0xb8, 0x7c, 0x4e, 0x2f, 0x06, 0x10, 0xc6, 0xe1,
+ 0x36, 0x6d, 0x8c, 0x04, 0x01, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00, 0x0e, 0x00, 0x2c, 0x1e,
+ 0x00, 0x0b, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0x00, 0x06, 0x39, 0x40, 0x47, 0xc0, 0x41, 0x2c, 0x1a,
+ 0x8f, 0xc8, 0x62, 0x60, 0x98, 0x6c, 0x3a, 0x9f, 0xd0, 0xa8, 0x74, 0x5a, 0x04, 0x51, 0x9f, 0x94,
+ 0xcc, 0x75, 0xcb, 0xed, 0x7a, 0xbf, 0xe0, 0xb0, 0xf8, 0x39, 0x02, 0x53, 0xc4, 0x01, 0x86, 0x35,
+ 0xcc, 0x1c, 0xbb, 0xdf, 0xf0, 0xb8, 0x7c, 0x4e, 0x57, 0xae, 0x1d, 0x8f, 0x32, 0x37, 0x70, 0x26,
+ 0x0e, 0x32, 0x41, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x06, 0x00, 0x0f, 0x00, 0x2c, 0x2a, 0x00, 0x0e,
+ 0x00, 0x0e, 0x00, 0x17, 0x00, 0x00, 0x06, 0x29, 0xc0, 0x87, 0x70, 0x48, 0x24, 0x46, 0x36, 0xc5,
+ 0xe4, 0x23, 0x10, 0x50, 0x3a, 0x9f, 0xd0, 0xa8, 0x74, 0x4a, 0xad, 0x5a, 0x85, 0x01, 0x92, 0x34,
+ 0x00, 0xb8, 0x7a, 0xbf, 0xe0, 0xb0, 0x58, 0x1c, 0x18, 0x0c, 0x15, 0xce, 0x40, 0x66, 0x18, 0x09,
+ 0x02, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00, 0x0c, 0x00, 0x2c, 0x2a, 0x00, 0x0e, 0x00, 0x0e,
+ 0x00, 0x17, 0x00, 0x00, 0x05, 0x22, 0x20, 0x13, 0x30, 0x64, 0x69, 0x92, 0xc1, 0x78, 0xae, 0x6c,
+ 0xeb, 0xbe, 0x70, 0x2c, 0xcf, 0x74, 0x7d, 0x06, 0x58, 0xac, 0xda, 0x7c, 0xef, 0xff, 0xc0, 0x5f,
+ 0x20, 0x42, 0xda, 0xb8, 0x02, 0x99, 0x52, 0x08, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x08,
+ 0x00, 0x2c, 0x33, 0x00, 0x17, 0x00, 0x05, 0x00, 0x0e, 0x00, 0x00, 0x05, 0x11, 0x60, 0x84, 0x8c,
+ 0x08, 0x43, 0x9e, 0x68, 0xaa, 0xae, 0x6c, 0x4b, 0x06, 0xe2, 0x18, 0x64, 0x63, 0x08, 0x00, 0x21,
+ 0xf9, 0x04, 0x05, 0x03, 0x00, 0x10, 0x00, 0x2c, 0x33, 0x00, 0x17, 0x00, 0x04, 0x00, 0x0e, 0x00,
+ 0x00, 0x06, 0x12, 0xc0, 0x40, 0x00, 0x02, 0x11, 0x12, 0x8f, 0xc8, 0xa4, 0x72, 0xc9, 0x6c, 0x06,
+ 0x48, 0xc4, 0x00, 0x25, 0x08, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x07, 0x00, 0x0b, 0x00, 0x2c, 0x36,
+ 0x00, 0x23, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x05, 0x05, 0x60, 0xb6, 0x04, 0x4b, 0x08, 0x00,
+ 0x21, 0xf9, 0x04, 0x05, 0xed, 0x00, 0x03, 0x00, 0x2c, 0x36, 0x00, 0x23, 0x00, 0x02, 0x00, 0x02,
+ 0x00, 0x00, 0x02, 0x03, 0x4c, 0x16, 0x05, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00,
+ 0x2c, 0x13, 0x00, 0x1a, 0x00, 0x16, 0x00, 0x23, 0x00, 0x00, 0x08, 0xff, 0x00, 0x07, 0x08, 0x1c,
+ 0x48, 0xb0, 0xa0, 0xc1, 0x83, 0x00, 0x9a, 0x1d, 0x4a, 0x54, 0xc3, 0x45, 0xa2, 0x61, 0xce, 0x16,
+ 0x1d, 0x1c, 0x18, 0xa0, 0x19, 0xb0, 0x89, 0x5c, 0x9c, 0x4d, 0x0c, 0x60, 0x4c, 0xc5, 0x00, 0x17,
+ 0x85, 0xa4, 0x10, 0x8a, 0x42, 0xb0, 0xc5, 0xb0, 0x29, 0x05, 0x03, 0x1c, 0x1a, 0xd0, 0xc2, 0x90,
+ 0x30, 0x2a, 0x4b, 0x0a, 0x71, 0x29, 0xd8, 0x22, 0x0a, 0x00, 0x8a, 0x1a, 0x5b, 0x14, 0x9a, 0xa2,
+ 0xc4, 0xc5, 0x44, 0x96, 0x2b, 0x05, 0x0a, 0x5b, 0xc1, 0xb2, 0x10, 0xc9, 0x9f, 0x02, 0x7b, 0x10,
+ 0x1a, 0xa0, 0xf2, 0xe3, 0x13, 0xa4, 0x25, 0x57, 0x2e, 0xaa, 0x31, 0xc0, 0x10, 0x15, 0xa8, 0x04,
+ 0x6b, 0x2c, 0x6a, 0x26, 0x50, 0x05, 0x51, 0xac, 0x02, 0x5b, 0x34, 0xd3, 0x08, 0x96, 0xa6, 0x33,
+ 0xb2, 0x65, 0x07, 0xb6, 0x38, 0x9b, 0xb6, 0xa4, 0xb3, 0xa5, 0x6d, 0xc3, 0x12, 0x9a, 0x1a, 0x77,
+ 0x00, 0x17, 0x00, 0x4d, 0xdb, 0xb6, 0x08, 0x2a, 0x8c, 0x6a, 0xda, 0x1a, 0xc2, 0x04, 0x06, 0x58,
+ 0x92, 0xb6, 0x05, 0x61, 0x8a, 0xc3, 0xc0, 0xee, 0x35, 0x38, 0x05, 0x11, 0x54, 0x93, 0x13, 0x09,
+ 0x79, 0xfc, 0x49, 0x44, 0xe2, 0xc1, 0x00, 0xbf, 0x7e, 0xaa, 0xe0, 0xfa, 0x13, 0xad, 0x41, 0xc7,
+ 0x48, 0x9b, 0x4c, 0x36, 0xe8, 0xf9, 0xf2, 0x45, 0x83, 0x2a, 0xae, 0x42, 0x6d, 0xf6, 0x55, 0x6d,
+ 0x50, 0xac, 0xc1, 0x08, 0xc1, 0x2d, 0x02, 0xb7, 0x6e, 0x5b, 0x1d, 0x62, 0xc6, 0x8c, 0x89, 0x34,
+ 0x00, 0x0c, 0x98, 0x17, 0x25, 0xb0, 0x9e, 0x68, 0xd3, 0xc6, 0x20, 0x2e, 0xac, 0x58, 0x0e, 0xb6,
+ 0x31, 0x01, 0x16, 0xcf, 0x9a, 0x35, 0x04, 0xc3, 0x94, 0x45, 0x81, 0x86, 0x60, 0x25, 0x21, 0x69,
+ 0x81, 0xe4, 0x19, 0x80, 0x66, 0x0f, 0xf6, 0xb8, 0xc1, 0x91, 0x06, 0x01, 0x04, 0x00, 0x21, 0xf9,
+ 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x2c, 0x13, 0x00, 0x1a, 0x00, 0x17, 0x00, 0x23, 0x00, 0x00,
+ 0x08, 0xff, 0x00, 0x07, 0x08, 0x1c, 0x48, 0xb0, 0xa0, 0xc1, 0x83, 0x03, 0x02, 0x04, 0x20, 0xa4,
+ 0x04, 0x11, 0x94, 0x1a, 0x44, 0x86, 0x39, 0x5b, 0x84, 0x70, 0x60, 0x00, 0x2a, 0x51, 0x0e, 0xb6,
+ 0xe0, 0xb2, 0xa4, 0x62, 0x00, 0x67, 0x35, 0x5a, 0xb4, 0x70, 0xb2, 0xc4, 0x8a, 0x15, 0x17, 0x03,
+ 0x5b, 0x44, 0x09, 0x66, 0x30, 0x00, 0xa3, 0x01, 0x2d, 0x88, 0x58, 0xa9, 0x22, 0x45, 0xc9, 0x13,
+ 0x15, 0x04, 0x5b, 0x20, 0x62, 0x69, 0xb1, 0x99, 0x8a, 0x8d, 0x55, 0x86, 0xac, 0xa8, 0xd8, 0x62,
+ 0x98, 0xc5, 0x60, 0x5c, 0x60, 0xba, 0x70, 0x52, 0x51, 0x60, 0x0b, 0x15, 0xcd, 0x04, 0x06, 0x58,
+ 0x22, 0x52, 0x0a, 0xd3, 0xa6, 0x4e, 0x33, 0x2a, 0x04, 0xf6, 0x74, 0x48, 0x52, 0xac, 0x30, 0x55,
+ 0x08, 0x0b, 0x20, 0x0c, 0x66, 0x0b, 0xb0, 0x39, 0x9d, 0x05, 0x88, 0x8a, 0xb6, 0x60, 0x8b, 0x25,
+ 0x6b, 0xdb, 0xba, 0x15, 0x14, 0x57, 0x6e, 0x4a, 0xb8, 0xc2, 0x70, 0xda, 0x85, 0xa9, 0x36, 0x00,
+ 0x93, 0xbd, 0x4f, 0x9b, 0x24, 0xec, 0x68, 0xb7, 0xc5, 0x2f, 0xa9, 0x48, 0xe5, 0x8a, 0x64, 0x9b,
+ 0xd0, 0x99, 0xe2, 0x43, 0x05, 0x03, 0x40, 0x06, 0xab, 0x72, 0x4a, 0xe4, 0xc4, 0x4d, 0x5b, 0x18,
+ 0xb2, 0xdc, 0x52, 0x50, 0x66, 0x43, 0x00, 0x2a, 0xe6, 0x45, 0xd8, 0x82, 0x09, 0x4f, 0x84, 0x01,
+ 0xa0, 0x20, 0x84, 0x8a, 0x35, 0x80, 0x21, 0x84, 0x44, 0xd0, 0x7a, 0x36, 0xf8, 0x16, 0xed, 0xa2,
+ 0x61, 0x7a, 0x07, 0x32, 0x11, 0x8c, 0x36, 0xc0, 0x14, 0x61, 0x84, 0x8a, 0x0c, 0x71, 0xc6, 0x7b,
+ 0xaf, 0x71, 0x20, 0x72, 0xf0, 0x84, 0x19, 0x03, 0xe6, 0x08, 0x1f, 0x21, 0x01, 0xd0, 0x7a, 0x61,
+ 0x33, 0xa0, 0x4d, 0x41, 0x13, 0x68, 0x51, 0x1c, 0xa4, 0x13, 0x1d, 0xac, 0x09, 0x36, 0x68, 0x2a,
+ 0x11, 0x14, 0x8c, 0x24, 0xd7, 0x86, 0x19, 0x82, 0x71, 0xb0, 0xd8, 0xe5, 0x73, 0x67, 0x80, 0x1a,
+ 0x31, 0x3a, 0x8c, 0xb7, 0x0d, 0x08, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x07, 0x00, 0x03, 0x00, 0x2c,
+ 0x14, 0x00, 0x1a, 0x00, 0x17, 0x00, 0x23, 0x00, 0x00, 0x08, 0xff, 0x00, 0x07, 0x08, 0x1c, 0x48,
+ 0xb0, 0xa0, 0xc1, 0x83, 0x02, 0x03, 0x00, 0x68, 0x26, 0xc8, 0x10, 0xa2, 0x28, 0x4a, 0x8a, 0x2c,
+ 0x42, 0x38, 0x30, 0x40, 0x00, 0x67, 0x4c, 0x0c, 0xb6, 0xe0, 0xb2, 0x64, 0xe2, 0xc1, 0x00, 0x4d,
+ 0xa2, 0x0c, 0x68, 0xe1, 0xc2, 0xd0, 0x12, 0x29, 0x4b, 0x54, 0x08, 0x6c, 0x41, 0x44, 0x98, 0xc1,
+ 0x00, 0xc2, 0x98, 0xb4, 0x50, 0x51, 0x48, 0x98, 0xb0, 0x22, 0x4b, 0x52, 0x0e, 0xdc, 0xe8, 0xb2,
+ 0xe2, 0x22, 0x22, 0x2d, 0x5a, 0x44, 0x69, 0xf2, 0xc4, 0x05, 0x42, 0x96, 0x1e, 0x2d, 0x1e, 0x1a,
+ 0x99, 0xd1, 0x28, 0xc5, 0xa0, 0x82, 0x12, 0x0a, 0xab, 0x21, 0xb4, 0x27, 0xc5, 0x95, 0x35, 0x82,
+ 0x0d, 0x08, 0xb0, 0x24, 0xe8, 0x0a, 0x22, 0x57, 0x77, 0xb6, 0x70, 0x66, 0xd1, 0x57, 0xd8, 0x83,
+ 0x2d, 0x86, 0x59, 0x84, 0x72, 0x56, 0x23, 0x22, 0x85, 0x2c, 0xda, 0x16, 0x6c, 0x91, 0xc8, 0x62,
+ 0x0d, 0xb9, 0x04, 0x5b, 0x00, 0xb3, 0x88, 0x08, 0xef, 0x4e, 0x43, 0x5b, 0x97, 0xfa, 0x0d, 0xba,
+ 0x64, 0x2b, 0x21, 0x95, 0x78, 0x67, 0xba, 0xb4, 0x28, 0x32, 0xf1, 0xb0, 0x8a, 0x84, 0x9c, 0x9e,
+ 0xe5, 0x49, 0x30, 0x80, 0xe0, 0xb0, 0x24, 0x9b, 0x15, 0x84, 0xd9, 0x03, 0xf3, 0x0a, 0xcd, 0x2f,
+ 0x1b, 0x1f, 0x6d, 0x89, 0x30, 0x40, 0xd4, 0xa3, 0x88, 0xb4, 0x52, 0x74, 0x76, 0x94, 0x4b, 0x93,
+ 0xb0, 0xac, 0xd1, 0xc6, 0xbe, 0x3a, 0xf5, 0x20, 0x13, 0x00, 0x67, 0x03, 0x34, 0x73, 0xb2, 0x22,
+ 0xef, 0xec, 0xdc, 0x00, 0xa8, 0x0c, 0x10, 0x74, 0xe8, 0xf7, 0x55, 0x13, 0x42, 0x4c, 0xf8, 0x25,
+ 0x78, 0x84, 0x4d, 0x9b, 0x3b, 0x62, 0x76, 0xf8, 0xd0, 0x11, 0x40, 0xee, 0x8b, 0x01, 0x6c, 0x06,
+ 0xb4, 0x19, 0x98, 0xa7, 0xfa, 0xd9, 0x23, 0x02, 0xd7, 0x10, 0x1f, 0x0c, 0x23, 0xd7, 0x8f, 0x99,
+ 0x32, 0x68, 0x08, 0xda, 0xc0, 0xfb, 0xa5, 0x0c, 0xc1, 0x3c, 0xb8, 0xf1, 0x1e, 0xa1, 0x33, 0xe0,
+ 0xcd, 0x17, 0xe5, 0xcb, 0x07, 0x00, 0xf0, 0x7e, 0x35, 0x20, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03,
+ 0x00, 0x03, 0x00, 0x2c, 0x15, 0x00, 0x1b, 0x00, 0x18, 0x00, 0x22, 0x00, 0x00, 0x08, 0xff, 0x00,
+ 0x07, 0x08, 0x1c, 0x38, 0x20, 0x40, 0x80, 0x60, 0xcd, 0x96, 0x28, 0x11, 0xe4, 0x8c, 0x0a, 0xc1,
+ 0x87, 0x0f, 0x03, 0x08, 0x3b, 0x54, 0xe3, 0xa1, 0x0a, 0x44, 0xce, 0x20, 0x12, 0x34, 0xb8, 0xc4,
+ 0x45, 0x8b, 0x16, 0x2b, 0xa2, 0x14, 0x2a, 0xc4, 0x44, 0x60, 0x0b, 0x43, 0x4d, 0x34, 0x06, 0x00,
+ 0x30, 0xec, 0x23, 0x13, 0x29, 0x53, 0x84, 0x11, 0x22, 0x24, 0x68, 0x60, 0x0b, 0x22, 0x29, 0x37,
+ 0x06, 0x38, 0x34, 0xe0, 0x63, 0x11, 0x29, 0x44, 0x34, 0xf6, 0x44, 0x34, 0x65, 0x63, 0xc6, 0x16,
+ 0x4e, 0x98, 0xa8, 0x10, 0x6a, 0xb3, 0xa6, 0xc0, 0x95, 0x4c, 0x3e, 0x52, 0x31, 0xc4, 0xd4, 0xe6,
+ 0x8a, 0x9c, 0x01, 0x8a, 0xf4, 0x04, 0x59, 0x95, 0x60, 0x8b, 0x21, 0x4f, 0x79, 0x76, 0x85, 0x78,
+ 0xf2, 0x29, 0xa2, 0xb1, 0x64, 0xa1, 0x14, 0x0c, 0x90, 0x08, 0xed, 0xc3, 0x16, 0x2c, 0x00, 0x14,
+ 0x04, 0xe6, 0xd6, 0x6b, 0x0d, 0xb9, 0x01, 0xa2, 0xd4, 0xb5, 0x49, 0xb7, 0xa0, 0xd3, 0xbd, 0x2d,
+ 0xc4, 0x06, 0x20, 0xb4, 0xb4, 0xee, 0xc7, 0x66, 0x03, 0xf3, 0x02, 0xee, 0xfb, 0x94, 0xb0, 0xdb,
+ 0x16, 0x2a, 0x10, 0x6f, 0xd4, 0x3b, 0xf6, 0xa3, 0x58, 0xa3, 0x95, 0x03, 0x0b, 0x25, 0xd4, 0xb5,
+ 0x05, 0x97, 0x8c, 0x42, 0x83, 0x55, 0x6d, 0x11, 0x25, 0x67, 0xe8, 0xc2, 0x64, 0x0d, 0x15, 0xad,
+ 0x1a, 0x0c, 0xf5, 0x43, 0x26, 0xa2, 0xbb, 0x06, 0xf8, 0xa5, 0x31, 0xb2, 0xdb, 0x60, 0x82, 0x82,
+ 0x12, 0xa4, 0x5c, 0x57, 0xe2, 0x80, 0x43, 0x88, 0x0e, 0x99, 0xee, 0xea, 0xe7, 0x85, 0x90, 0xbd,
+ 0x0f, 0xc1, 0x0c, 0x60, 0x13, 0x67, 0xc0, 0x91, 0x3e, 0x01, 0xf6, 0x46, 0x12, 0xc8, 0x86, 0x8d,
+ 0xc0, 0x39, 0xca, 0xdd, 0x7e, 0xa1, 0x4e, 0x70, 0xba, 0xdb, 0x24, 0x65, 0x06, 0x9c, 0x17, 0x19,
+ 0xb8, 0xe6, 0xc4, 0x5e, 0x31, 0x0f, 0xbb, 0x44, 0xaf, 0x0b, 0x60, 0xc7, 0x00, 0x34, 0x74, 0x5e,
+ 0xac, 0x47, 0x5e, 0xb0, 0x6e, 0x40, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00, 0x03, 0x00, 0x2c,
+ 0x17, 0x00, 0x1b, 0x00, 0x16, 0x00, 0x22, 0x00, 0x00, 0x08, 0xf8, 0x00, 0x07, 0x08, 0x1c, 0x38,
+ 0x20, 0x40, 0x93, 0x66, 0xce, 0x86, 0x10, 0x5c, 0xc8, 0x30, 0x40, 0xb3, 0x28, 0x2a, 0x08, 0xb6,
+ 0x60, 0xb2, 0x64, 0x11, 0xc3, 0x81, 0xc2, 0xa2, 0x08, 0x6c, 0xb1, 0xc2, 0x49, 0x14, 0x22, 0x2e,
+ 0x04, 0x32, 0x69, 0xd6, 0x90, 0x10, 0x97, 0x01, 0x2d, 0x0c, 0x59, 0x99, 0xd2, 0x44, 0xd8, 0x14,
+ 0x8d, 0x02, 0x6b, 0x38, 0x5b, 0x28, 0xec, 0xe4, 0x00, 0x2e, 0xc2, 0x04, 0x31, 0x11, 0x18, 0x92,
+ 0x60, 0x0d, 0x92, 0x02, 0x01, 0x20, 0x1a, 0xe0, 0xa2, 0x50, 0x8b, 0x88, 0x17, 0x07, 0x32, 0xb1,
+ 0x18, 0x60, 0xe6, 0x00, 0x43, 0x84, 0x90, 0x26, 0xdd, 0xb8, 0xa4, 0xe0, 0x50, 0x94, 0x3d, 0xa7,
+ 0x2a, 0x1d, 0x20, 0x4c, 0xaa, 0xd6, 0x85, 0x2a, 0x84, 0x59, 0xf9, 0x9a, 0xb4, 0x85, 0x33, 0xa7,
+ 0x64, 0x17, 0xb6, 0x18, 0x82, 0x36, 0xed, 0xc0, 0xb5, 0x40, 0xdd, 0xbe, 0x2d, 0xd2, 0xc4, 0xab,
+ 0xdb, 0xb0, 0x01, 0xae, 0xca, 0x1d, 0x70, 0xb5, 0x6d, 0x5a, 0xb3, 0x02, 0x03, 0x10, 0x91, 0xdb,
+ 0x02, 0x11, 0x80, 0x81, 0x0a, 0xdd, 0xae, 0xa0, 0x42, 0x50, 0x98, 0x5b, 0x2e, 0x71, 0x83, 0xd6,
+ 0xf8, 0x5a, 0xd8, 0xf1, 0xc2, 0x00, 0x89, 0xb4, 0xae, 0xf0, 0x3b, 0x30, 0x00, 0x94, 0xa9, 0x5c,
+ 0x08, 0x4d, 0xf5, 0x9c, 0xb4, 0x86, 0x68, 0xad, 0x87, 0x2e, 0xb6, 0xa8, 0xfa, 0x15, 0xc0, 0x12,
+ 0x27, 0x59, 0x07, 0x30, 0x99, 0x22, 0xb7, 0xc9, 0xcc, 0x44, 0x51, 0x18, 0x7f, 0x3d, 0xf1, 0x05,
+ 0x45, 0x89, 0xbd, 0x0b, 0xe1, 0x08, 0xfc, 0x21, 0x57, 0x0c, 0xc3, 0x3b, 0x36, 0xd2, 0x76, 0xb9,
+ 0x08, 0x26, 0x6d, 0x10, 0x86, 0x6c, 0xfa, 0xb8, 0x0d, 0xb3, 0xb0, 0x39, 0x70, 0x35, 0xc8, 0x81,
+ 0x6b, 0x0f, 0x08, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x2c, 0x16, 0x00, 0x1b,
+ 0x00, 0x17, 0x00, 0x22, 0x00, 0x00, 0x08, 0xff, 0x00, 0x07, 0x08, 0x1c, 0x28, 0x50, 0x98, 0x33,
+ 0x41, 0x87, 0x0e, 0x49, 0x11, 0x46, 0xb0, 0x61, 0xc3, 0x66, 0x51, 0x54, 0xb4, 0x20, 0xa8, 0xc2,
+ 0x49, 0xb3, 0x00, 0x0e, 0x07, 0x06, 0x1b, 0xa6, 0x42, 0x20, 0x93, 0x27, 0x4a, 0x0a, 0x71, 0x99,
+ 0xa8, 0xe2, 0xd0, 0x94, 0x8c, 0x4d, 0x88, 0x4c, 0x8c, 0x42, 0x68, 0x0a, 0x21, 0x2b, 0x84, 0xa2,
+ 0x4c, 0x14, 0x18, 0x65, 0x51, 0xc3, 0x29, 0x88, 0x26, 0xae, 0x10, 0x26, 0x68, 0xa4, 0xc0, 0x99,
+ 0x03, 0x87, 0x61, 0x1c, 0x78, 0x68, 0xa5, 0x0b, 0x89, 0x19, 0x09, 0x3a, 0x1b, 0x2a, 0xac, 0xc6,
+ 0x00, 0x26, 0x55, 0x7c, 0x26, 0x1d, 0x08, 0x6c, 0xa8, 0xa0, 0x99, 0x2b, 0x80, 0x4e, 0x15, 0xd8,
+ 0x4c, 0x60, 0xce, 0xad, 0x49, 0x05, 0x05, 0x00, 0xe0, 0x14, 0x6c, 0x46, 0x43, 0x01, 0x82, 0x75,
+ 0x34, 0xeb, 0x10, 0x51, 0xda, 0xb5, 0x6c, 0x09, 0x46, 0xc1, 0x08, 0x25, 0x6e, 0xc3, 0x43, 0x18,
+ 0x0d, 0x69, 0x8d, 0xbb, 0x74, 0x80, 0xb3, 0xbd, 0x66, 0x5d, 0x30, 0x1c, 0xb0, 0x88, 0x8b, 0x5d,
+ 0x81, 0x42, 0x07, 0xfe, 0xb5, 0xbb, 0x73, 0xe8, 0x00, 0x00, 0x4c, 0xe2, 0xaa, 0xe8, 0x4b, 0x50,
+ 0x10, 0xdb, 0x1e, 0x94, 0x09, 0x36, 0x03, 0xdc, 0x90, 0x08, 0x21, 0xc7, 0x04, 0x85, 0x71, 0x26,
+ 0x6a, 0x33, 0x69, 0x93, 0xd1, 0x03, 0xf0, 0x6e, 0x3d, 0x9d, 0x14, 0x11, 0x00, 0xb3, 0x88, 0x32,
+ 0xaa, 0x20, 0xc4, 0xb6, 0xc9, 0x21, 0x26, 0x5a, 0xd1, 0x1e, 0x16, 0x56, 0x64, 0x40, 0x94, 0x43,
+ 0xc1, 0xd8, 0xfe, 0x38, 0xe2, 0x07, 0xb4, 0xdd, 0x1d, 0x02, 0xe5, 0x0c, 0x78, 0x21, 0xe4, 0x75,
+ 0xdc, 0x2f, 0x0e, 0xe3, 0x40, 0x67, 0x0b, 0x26, 0x63, 0xa4, 0xb8, 0x3e, 0x32, 0xa2, 0xb0, 0x2b,
+ 0xa6, 0xe1, 0x98, 0xc3, 0x01, 0x5e, 0x0c, 0x09, 0x40, 0x33, 0x47, 0xfc, 0xe1, 0xf3, 0x02, 0x03,
+ 0x02, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x07, 0x00, 0x03, 0x00, 0x2c, 0x15, 0x00, 0x1a, 0x00, 0x17,
+ 0x00, 0x23, 0x00, 0x00, 0x08, 0xff, 0x00, 0x07, 0x08, 0x1c, 0x48, 0xb0, 0xa0, 0xc1, 0x83, 0x03,
+ 0x00, 0x34, 0x3b, 0x84, 0x28, 0x11, 0x13, 0x43, 0x82, 0x08, 0x05, 0x40, 0x48, 0xd0, 0x19, 0x93,
+ 0x16, 0x18, 0x09, 0xaa, 0xf8, 0x25, 0x6c, 0xe2, 0xc1, 0x29, 0xc3, 0x30, 0xba, 0x78, 0x32, 0xc4,
+ 0xca, 0x10, 0x8c, 0x2d, 0x06, 0xac, 0x70, 0x16, 0xc0, 0xe3, 0xc0, 0x45, 0x51, 0x30, 0x3e, 0x11,
+ 0x26, 0x6c, 0x88, 0x92, 0x27, 0x28, 0x05, 0xaa, 0x60, 0xe9, 0x72, 0x40, 0xc8, 0x16, 0x86, 0xaa,
+ 0x14, 0x72, 0x91, 0xd1, 0xa0, 0x0b, 0x89, 0x03, 0x9d, 0x65, 0x74, 0xc1, 0xa5, 0x28, 0x42, 0x22,
+ 0x2d, 0x05, 0x5e, 0x64, 0x42, 0x85, 0x68, 0x4a, 0x8a, 0x03, 0x54, 0x14, 0x99, 0xd8, 0x0c, 0x23,
+ 0x97, 0x42, 0x03, 0xae, 0x62, 0xf5, 0xd9, 0x52, 0x90, 0xd3, 0xb1, 0x03, 0xa1, 0xb4, 0xfc, 0x89,
+ 0xb6, 0xa0, 0x8b, 0x26, 0x01, 0x0c, 0x9d, 0x6d, 0xab, 0xa2, 0x23, 0xdb, 0xb6, 0x03, 0xdf, 0x06,
+ 0x30, 0x2b, 0x16, 0xaf, 0xda, 0x00, 0x5d, 0xfb, 0xb6, 0x7d, 0xd2, 0x12, 0x40, 0x53, 0xbc, 0x49,
+ 0xa3, 0x2e, 0x99, 0x8b, 0x95, 0x08, 0x00, 0x8f, 0x00, 0x10, 0x09, 0xa6, 0xd8, 0xa3, 0x59, 0x54,
+ 0x81, 0x55, 0x27, 0x1b, 0x54, 0xb1, 0xe4, 0xf2, 0xc0, 0x43, 0x9a, 0x09, 0xba, 0xe0, 0x69, 0x70,
+ 0x99, 0x0a, 0xac, 0x2b, 0x2c, 0xf7, 0x24, 0x98, 0x88, 0xe2, 0x4e, 0xcf, 0x06, 0x87, 0x51, 0x3c,
+ 0xb4, 0xda, 0xa0, 0x12, 0x84, 0x35, 0xe0, 0x8e, 0x55, 0x7a, 0x70, 0x58, 0xed, 0x83, 0x82, 0x0e,
+ 0x0f, 0xac, 0x41, 0x08, 0xf1, 0x80, 0x60, 0xc5, 0x97, 0x2c, 0xa1, 0xf2, 0xdb, 0x60, 0x80, 0x2c,
+ 0xcd, 0xd1, 0xf2, 0x19, 0x30, 0x47, 0xcf, 0x18, 0x30, 0x36, 0x4e, 0x30, 0xc3, 0x6b, 0x43, 0x60,
+ 0x9b, 0x81, 0x6c, 0xe0, 0xe0, 0x21, 0x9d, 0x3e, 0x60, 0x0d, 0xc1, 0x3c, 0x78, 0xb1, 0xa4, 0x31,
+ 0xa3, 0x86, 0xe0, 0x0e, 0xc4, 0xef, 0x09, 0xd2, 0xc9, 0x62, 0x3c, 0x48, 0x9d, 0x33, 0x6b, 0xba,
+ 0xfc, 0x31, 0x3e, 0xb0, 0x04, 0xde, 0x80, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00,
+ 0x2c, 0x13, 0x00, 0x1a, 0x00, 0x18, 0x00, 0x23, 0x00, 0x00, 0x08, 0xff, 0x00, 0x07, 0x08, 0x1c,
+ 0x48, 0xb0, 0xa0, 0xc1, 0x83, 0x02, 0x85, 0x2d, 0x89, 0x02, 0xa5, 0x45, 0x0d, 0x44, 0x82, 0x96,
+ 0x05, 0x08, 0x80, 0x70, 0xe0, 0x94, 0x43, 0x3d, 0x5a, 0xb4, 0x30, 0xf8, 0x4b, 0xd8, 0x44, 0x84,
+ 0xc2, 0x88, 0x68, 0x24, 0xb2, 0xc4, 0x8a, 0x20, 0x8d, 0x1b, 0x07, 0xac, 0x68, 0xf6, 0xb1, 0xa0,
+ 0x30, 0x2e, 0x2d, 0x56, 0x0c, 0x99, 0x62, 0x45, 0x89, 0x13, 0x94, 0x03, 0x7b, 0xb0, 0xa4, 0x38,
+ 0x70, 0x91, 0x48, 0x2e, 0x84, 0x08, 0x89, 0xd4, 0x78, 0x70, 0x85, 0x47, 0x9e, 0x03, 0x8c, 0x8d,
+ 0x94, 0xe2, 0x82, 0x68, 0xc5, 0x61, 0x2d, 0x9b, 0xd4, 0xd8, 0xb8, 0x02, 0x67, 0xc5, 0x01, 0x2a,
+ 0x24, 0x52, 0x74, 0xa6, 0x91, 0xd0, 0x13, 0xa7, 0x57, 0x07, 0x08, 0xfa, 0x38, 0x4c, 0xa3, 0x13,
+ 0x17, 0x61, 0x09, 0x46, 0xf9, 0x08, 0x0c, 0x6c, 0x5a, 0x81, 0x50, 0x26, 0x06, 0x68, 0x98, 0xf2,
+ 0xad, 0x40, 0x18, 0x72, 0xdb, 0xd6, 0xb5, 0x9b, 0x48, 0x6e, 0xd9, 0xbd, 0x6f, 0x0d, 0x7d, 0x1c,
+ 0xe2, 0xf6, 0xed, 0x92, 0x8f, 0x4d, 0x32, 0x02, 0xbe, 0xda, 0xe3, 0xa8, 0xc0, 0x43, 0x85, 0xaf,
+ 0x1e, 0x92, 0x2b, 0x30, 0x18, 0x93, 0xc8, 0x07, 0xb9, 0x34, 0x69, 0x29, 0x90, 0x50, 0xd5, 0xc5,
+ 0x05, 0x57, 0x10, 0xe2, 0x3c, 0xb0, 0x59, 0xc6, 0xab, 0x2a, 0x76, 0x22, 0x3c, 0x09, 0x5a, 0xa0,
+ 0x31, 0xd2, 0x05, 0x17, 0xc1, 0x44, 0xc8, 0x25, 0x18, 0x52, 0x84, 0x4a, 0x11, 0x4e, 0x4e, 0x4b,
+ 0xa8, 0x35, 0xcb, 0xb4, 0x8b, 0x6a, 0x1c, 0xec, 0x11, 0xcc, 0xae, 0x33, 0x15, 0x7b, 0x55, 0x30,
+ 0xba, 0x1d, 0x56, 0x98, 0x95, 0xe7, 0xcf, 0x3d, 0xda, 0x15, 0xc8, 0x7c, 0xba, 0xc0, 0x3f, 0x5f,
+ 0xb2, 0x6b, 0xcf, 0x9e, 0xc5, 0x6e, 0x1f, 0x81, 0x6c, 0x08, 0xb2, 0x26, 0xf9, 0xfe, 0xd6, 0x04,
+ 0x78, 0xf1, 0x58, 0xec, 0x06, 0xd8, 0xc3, 0x26, 0xfc, 0xc0, 0x3c, 0xd6, 0x85, 0xa8, 0x21, 0x98,
+ 0x06, 0x88, 0xf5, 0x01, 0x7d, 0xf6, 0x0c, 0x30, 0xa3, 0xe7, 0xc4, 0xfd, 0x81, 0x00, 0x00, 0x90,
+ 0x56, 0x40, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x2c, 0x10, 0x00, 0x1a, 0x00,
+ 0x18, 0x00, 0x23, 0x00, 0x00, 0x08, 0xff, 0x00, 0x07, 0x08, 0x1c, 0x48, 0xb0, 0xa0, 0xc1, 0x83,
+ 0x03, 0x83, 0x39, 0x3b, 0x64, 0x08, 0xd1, 0x13, 0x41, 0xcd, 0x00, 0x04, 0x08, 0x80, 0x70, 0xe0,
+ 0x22, 0x41, 0x2b, 0x5a, 0xb4, 0x28, 0xc8, 0xc4, 0xd9, 0x44, 0x8a, 0x07, 0x85, 0x11, 0xd1, 0xc8,
+ 0xa5, 0xd0, 0x00, 0x8d, 0x1b, 0x05, 0x46, 0x09, 0x36, 0xd1, 0xa0, 0x30, 0x2e, 0x2d, 0x56, 0x2c,
+ 0x99, 0x42, 0xc8, 0x10, 0x4a, 0x82, 0x44, 0x9a, 0xb4, 0xb4, 0x38, 0x92, 0x0b, 0x21, 0x42, 0x4e,
+ 0x34, 0x22, 0x8c, 0xf2, 0x71, 0xe0, 0xa1, 0x16, 0x2e, 0x08, 0x15, 0x71, 0x21, 0xb4, 0xa2, 0x47,
+ 0x90, 0xc2, 0x6a, 0xc4, 0x94, 0x92, 0xb1, 0xe2, 0x40, 0x26, 0x12, 0x29, 0x2e, 0xd1, 0xe8, 0xe2,
+ 0x64, 0x4a, 0xab, 0x03, 0x9a, 0xb5, 0x44, 0xd4, 0xc2, 0x10, 0x21, 0xaf, 0x60, 0x05, 0x1a, 0x9b,
+ 0x08, 0x40, 0x2a, 0x13, 0x43, 0x69, 0x09, 0x0e, 0x9b, 0x18, 0x4c, 0x45, 0xd3, 0xb8, 0x02, 0x11,
+ 0xd1, 0xb5, 0xfb, 0x15, 0xaf, 0xa1, 0x96, 0x50, 0xee, 0xe2, 0x3d, 0xd4, 0xf2, 0x89, 0xe0, 0xb8,
+ 0x4f, 0x07, 0x38, 0xbb, 0x89, 0xb7, 0x06, 0x4b, 0x8a, 0x00, 0x98, 0x1c, 0xb6, 0x4a, 0x18, 0x64,
+ 0x58, 0xbe, 0x71, 0x99, 0x3c, 0x26, 0x68, 0x8c, 0x71, 0x45, 0x15, 0x62, 0x2d, 0x0f, 0x34, 0x86,
+ 0xb9, 0xe2, 0x5c, 0xd1, 0x04, 0x9d, 0xf5, 0xe8, 0x6b, 0x50, 0xac, 0x55, 0x67, 0x76, 0x11, 0x42,
+ 0x91, 0x08, 0x76, 0x18, 0xeb, 0x81, 0x7f, 0xd3, 0x36, 0xa9, 0x81, 0x90, 0x70, 0xdc, 0xa3, 0x07,
+ 0x87, 0xa0, 0x46, 0x48, 0x88, 0x29, 0x41, 0x15, 0xc3, 0x00, 0xe0, 0x0d, 0x7b, 0xe8, 0xd0, 0x92,
+ 0x22, 0x84, 0x58, 0x2e, 0xaf, 0x98, 0x65, 0x79, 0x00, 0x2c, 0x27, 0x6c, 0x80, 0x19, 0xa3, 0x67,
+ 0x0e, 0x1b, 0x2f, 0x78, 0x01, 0xbc, 0x2d, 0x21, 0xd8, 0x46, 0xe0, 0x11, 0xbc, 0x01, 0xf4, 0x10,
+ 0x5c, 0x23, 0xd0, 0xc6, 0xf2, 0x17, 0x04, 0xd5, 0x98, 0x39, 0xf3, 0x63, 0xf9, 0xa2, 0x3b, 0x04,
+ 0xcb, 0x80, 0x99, 0x3e, 0x20, 0x4b, 0xa4, 0x36, 0x67, 0xd4, 0xe1, 0x1e, 0x7f, 0x02, 0x05, 0x50,
+ 0x42, 0x45, 0x01, 0x01, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00, 0x03, 0x00, 0x2c, 0x0f, 0x00,
+ 0x1b, 0x00, 0x17, 0x00, 0x22, 0x00, 0x00, 0x08, 0xff, 0x00, 0x07, 0x08, 0x1c, 0x28, 0x90, 0x4a,
+ 0x11, 0x67, 0xce, 0x9a, 0x05, 0x0b, 0xc0, 0x90, 0xa0, 0x43, 0x81, 0xc1, 0x96, 0x40, 0x69, 0x41,
+ 0xb0, 0xc6, 0xb0, 0x66, 0x0d, 0x1f, 0x0a, 0x6c, 0xc6, 0x85, 0xe2, 0x80, 0x16, 0x20, 0x09, 0x0e,
+ 0x5b, 0x18, 0xe0, 0xa1, 0xb3, 0x1e, 0x2d, 0xb8, 0x0c, 0xa1, 0xb2, 0x22, 0x24, 0x41, 0x22, 0x4d,
+ 0x32, 0x6e, 0x44, 0x19, 0xa5, 0x8a, 0x95, 0x28, 0x1e, 0x1f, 0x22, 0x9a, 0x52, 0x12, 0x62, 0xc7,
+ 0x28, 0x53, 0x0a, 0xb9, 0xd4, 0x38, 0xc0, 0x58, 0x46, 0x63, 0x2d, 0x56, 0x08, 0x53, 0x32, 0x94,
+ 0x68, 0x0d, 0x61, 0x0c, 0x17, 0xb5, 0x64, 0x32, 0x44, 0x05, 0xd1, 0x87, 0x82, 0x18, 0x36, 0x0b,
+ 0xd9, 0xf4, 0xea, 0x00, 0x44, 0x0c, 0x05, 0xa5, 0xa4, 0xe2, 0x22, 0xa7, 0xd7, 0x01, 0x2c, 0x16,
+ 0x05, 0x18, 0x96, 0x54, 0xd0, 0xd9, 0x87, 0x50, 0x9f, 0x74, 0x7d, 0xab, 0x02, 0xea, 0xa1, 0xb9,
+ 0x67, 0x7b, 0xa8, 0x75, 0x86, 0xd7, 0x2b, 0xd8, 0x00, 0xc2, 0x54, 0x98, 0x7d, 0x3b, 0x20, 0x6b,
+ 0x49, 0x43, 0x7d, 0x35, 0x3e, 0xed, 0x49, 0x08, 0xe5, 0xe0, 0xab, 0x87, 0x64, 0x2e, 0x49, 0x5c,
+ 0x31, 0xa6, 0x43, 0xa4, 0x94, 0x07, 0x0c, 0xeb, 0xe9, 0xd0, 0x59, 0xcb, 0xc7, 0x04, 0x9d, 0x71,
+ 0x76, 0x28, 0xcc, 0x49, 0x62, 0x42, 0xa3, 0x1d, 0x2e, 0xc2, 0x49, 0x54, 0x05, 0x95, 0xb3, 0xc1,
+ 0x98, 0x80, 0x56, 0x41, 0xe8, 0xed, 0x56, 0x8d, 0x5c, 0x16, 0x11, 0x66, 0xfd, 0x12, 0x23, 0x61,
+ 0x61, 0x88, 0x54, 0x10, 0x39, 0x34, 0x00, 0x2a, 0x61, 0x82, 0x00, 0x1c, 0xfa, 0x39, 0xf2, 0xe3,
+ 0x78, 0x00, 0x00, 0x42, 0x5e, 0x88, 0x91, 0xc3, 0x66, 0xc0, 0x0e, 0xc2, 0x01, 0xbe, 0xc4, 0x11,
+ 0xd8, 0xa6, 0xfa, 0x80, 0x2e, 0xc7, 0x23, 0x11, 0x1f, 0xf4, 0x2e, 0x9e, 0xb0, 0x10, 0x82, 0x67,
+ 0xca, 0x94, 0xf1, 0xe2, 0xbc, 0xfc, 0x40, 0x31, 0xc7, 0x05, 0x06, 0x38, 0x52, 0x07, 0xcd, 0x9c,
+ 0x1d, 0xc9, 0xe3, 0x0f, 0x4c, 0x2d, 0x30, 0x20, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x06, 0x00, 0x03,
+ 0x00, 0x2c, 0x0e, 0x00, 0x1b, 0x00, 0x17, 0x00, 0x22, 0x00, 0x00, 0x08, 0xff, 0x00, 0x07, 0x08,
+ 0x1c, 0x38, 0xb0, 0x09, 0x21, 0x42, 0xc2, 0x02, 0x04, 0x20, 0xc8, 0x90, 0x21, 0x95, 0x43, 0x4c,
+ 0x54, 0x0c, 0x84, 0x72, 0x88, 0xd0, 0xc2, 0x86, 0x03, 0x01, 0x1c, 0xea, 0x81, 0x51, 0xe0, 0xb0,
+ 0x26, 0x17, 0x19, 0x06, 0x8b, 0xd2, 0x62, 0x80, 0x93, 0x01, 0x2b, 0x4a, 0x32, 0x64, 0x62, 0x91,
+ 0x21, 0x00, 0x92, 0x2e, 0x86, 0x4c, 0x19, 0xb2, 0xa2, 0x23, 0x97, 0x84, 0x04, 0x05, 0xb5, 0x70,
+ 0x51, 0x84, 0x10, 0x91, 0x8e, 0x03, 0x9d, 0x84, 0x14, 0x56, 0x63, 0x80, 0x20, 0x2a, 0x5c, 0x80,
+ 0x12, 0x74, 0x76, 0x51, 0xa7, 0x8b, 0x26, 0x24, 0x95, 0x0e, 0x44, 0x74, 0x31, 0x91, 0xc0, 0xa4,
+ 0x52, 0x07, 0xaa, 0x10, 0x36, 0x40, 0x98, 0xc4, 0x27, 0x4c, 0x54, 0x66, 0x1d, 0xc0, 0xb4, 0x59,
+ 0x49, 0x42, 0x86, 0xc6, 0x0e, 0x5c, 0x12, 0xa0, 0x48, 0x49, 0x17, 0x6a, 0xd7, 0x06, 0x30, 0x1b,
+ 0x77, 0x69, 0x00, 0xaf, 0x75, 0x07, 0x12, 0x12, 0x08, 0x4c, 0xac, 0x5a, 0x28, 0x00, 0x04, 0x0e,
+ 0xf1, 0x3b, 0x56, 0xd0, 0xc5, 0x45, 0x61, 0xe3, 0xae, 0x68, 0x42, 0xb0, 0x19, 0x47, 0xb5, 0x87,
+ 0x42, 0x0a, 0x74, 0x26, 0x71, 0x6c, 0x33, 0x8c, 0x45, 0xb8, 0x10, 0x6e, 0xa8, 0x82, 0x31, 0xc6,
+ 0x26, 0x87, 0x2a, 0x77, 0xac, 0x11, 0x18, 0xa8, 0x33, 0xb8, 0xa3, 0x25, 0x63, 0xa4, 0xdc, 0xb1,
+ 0xc7, 0xa2, 0xac, 0x87, 0x3a, 0x52, 0xcd, 0x1a, 0x0c, 0xeb, 0x40, 0x17, 0x51, 0xb8, 0x5a, 0x4e,
+ 0x99, 0xd4, 0x99, 0xe7, 0xb8, 0x8b, 0x84, 0x95, 0x1e, 0x50, 0x02, 0xc5, 0x17, 0x21, 0x71, 0x03,
+ 0xfc, 0x38, 0x32, 0x00, 0x8e, 0xc0, 0x2f, 0x6a, 0x8f, 0xdc, 0x11, 0xc8, 0x66, 0x60, 0x18, 0xb5,
+ 0xd0, 0x1b, 0x8a, 0x51, 0xab, 0x03, 0xa3, 0x8d, 0xb8, 0x3b, 0x18, 0xee, 0x0c, 0x19, 0x3e, 0x36,
+ 0x08, 0x9e, 0x4a, 0x74, 0x88, 0xe7, 0x05, 0x1a, 0x10, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00,
+ 0x03, 0x00, 0x2c, 0x0e, 0x00, 0x1b, 0x00, 0x17, 0x00, 0x22, 0x00, 0x00, 0x08, 0xff, 0x00, 0x07,
+ 0x08, 0x1c, 0x38, 0x90, 0x8a, 0xb3, 0x21, 0x43, 0x8a, 0x08, 0x23, 0xc8, 0x90, 0xe1, 0x94, 0x25,
+ 0x89, 0x5a, 0x0c, 0x6c, 0xa1, 0x02, 0x91, 0x33, 0x00, 0x0d, 0x07, 0x06, 0x20, 0x44, 0x44, 0xa0,
+ 0x8a, 0x86, 0x2d, 0x88, 0x50, 0xc9, 0x18, 0xa0, 0xd9, 0x8a, 0x01, 0x2b, 0x96, 0x34, 0x31, 0x04,
+ 0x72, 0x45, 0x33, 0x86, 0x01, 0x84, 0xad, 0x08, 0x29, 0x8c, 0x90, 0x21, 0x17, 0x19, 0x5b, 0xac,
+ 0x58, 0xa8, 0x11, 0x51, 0x0b, 0x26, 0x55, 0x96, 0xe0, 0xcc, 0x28, 0xb0, 0x05, 0x22, 0x8d, 0xce,
+ 0x06, 0xb4, 0xb0, 0x22, 0x85, 0x28, 0xc3, 0x16, 0x49, 0x07, 0x04, 0xf0, 0xd9, 0x42, 0xd0, 0x49,
+ 0xa7, 0x13, 0x7d, 0x09, 0x14, 0xf6, 0xf1, 0x2a, 0xd6, 0x89, 0x2c, 0x82, 0x05, 0x48, 0xda, 0x82,
+ 0x8a, 0x93, 0xaf, 0x04, 0x55, 0x34, 0x0b, 0xb0, 0x44, 0xe9, 0x13, 0xaf, 0x68, 0x5b, 0x14, 0x61,
+ 0xab, 0x14, 0xed, 0xd3, 0xb9, 0x51, 0xed, 0x12, 0x6c, 0x41, 0x28, 0xc0, 0x32, 0xbd, 0x0c, 0x6b,
+ 0x04, 0x93, 0x9a, 0x08, 0x70, 0xd1, 0x5f, 0x02, 0xe9, 0x1a, 0x56, 0x9b, 0x78, 0x11, 0x13, 0xc0,
+ 0x2d, 0x58, 0x6a, 0x6c, 0x36, 0x14, 0xad, 0x0a, 0x42, 0x30, 0x8b, 0xc0, 0x75, 0x7a, 0xb4, 0xe1,
+ 0xc6, 0x8e, 0x58, 0x5b, 0xb4, 0x25, 0x39, 0xe5, 0x50, 0xe8, 0x22, 0x58, 0x03, 0x98, 0x26, 0xda,
+ 0xe2, 0x25, 0x56, 0x00, 0x9d, 0x41, 0x62, 0xfe, 0x4a, 0xa8, 0x32, 0xc1, 0x15, 0x83, 0xbf, 0x06,
+ 0x18, 0xf6, 0x94, 0x89, 0x6b, 0xb4, 0x4d, 0x7e, 0xd5, 0xe8, 0xa8, 0xd0, 0xb0, 0xd4, 0x00, 0x01,
+ 0x34, 0xfe, 0x08, 0x82, 0x05, 0x30, 0x80, 0x13, 0x2f, 0x06, 0xcc, 0x11, 0x18, 0xdd, 0x6e, 0x97,
+ 0x37, 0x0d, 0x23, 0xe9, 0xed, 0x92, 0xf1, 0x8b, 0x5e, 0x20, 0x19, 0x7d, 0x00, 0x0f, 0x1e, 0xc3,
+ 0x50, 0x4c, 0x72, 0xc0, 0x2f, 0xe8, 0xa0, 0x99, 0x8e, 0xd1, 0x38, 0xd1, 0x80, 0x00, 0x21, 0xf9,
+ 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x2c, 0x0f, 0x00, 0x1b, 0x00, 0x18, 0x00, 0x22, 0x00, 0x00,
+ 0x08, 0xff, 0x00, 0x07, 0x08, 0x1c, 0x28, 0x30, 0x40, 0xb3, 0x43, 0x51, 0x88, 0x20, 0x1a, 0xb6,
+ 0x84, 0x0a, 0xc1, 0x87, 0x03, 0x03, 0x18, 0x24, 0x42, 0xb0, 0x85, 0x45, 0x15, 0x51, 0x08, 0x41,
+ 0x8c, 0x18, 0xe0, 0xd0, 0x80, 0x16, 0x2e, 0x0c, 0x2d, 0xe1, 0x32, 0xd0, 0xa2, 0x0b, 0x67, 0x1b,
+ 0x25, 0x1e, 0xb2, 0xf8, 0x44, 0x98, 0x30, 0x29, 0x24, 0x4b, 0xb6, 0x50, 0xc1, 0xe8, 0xa1, 0x44,
+ 0x46, 0x16, 0x05, 0x55, 0x39, 0xe4, 0x62, 0xe3, 0xc5, 0x66, 0x04, 0x03, 0x08, 0x73, 0xd1, 0xe2,
+ 0x49, 0x15, 0x27, 0x1b, 0x65, 0x32, 0x59, 0x54, 0x30, 0xc0, 0x30, 0x8b, 0x4e, 0xa2, 0x24, 0xad,
+ 0xd8, 0x02, 0xe5, 0x80, 0x00, 0xc1, 0x6a, 0xb4, 0x70, 0x12, 0x73, 0xaa, 0x40, 0x8b, 0x88, 0xae,
+ 0x06, 0x70, 0xd6, 0x62, 0x00, 0xa1, 0x27, 0x5e, 0x65, 0xaa, 0x08, 0x26, 0x51, 0x90, 0x45, 0x2e,
+ 0x3d, 0xd3, 0x7e, 0x9c, 0x49, 0x48, 0xa5, 0x45, 0xb9, 0x54, 0x9b, 0x49, 0x34, 0x86, 0xf7, 0xa1,
+ 0xc5, 0xba, 0x63, 0xfb, 0x56, 0x5c, 0x2b, 0x51, 0xa3, 0xe0, 0xb9, 0x61, 0xc5, 0x02, 0x3b, 0x6c,
+ 0x71, 0x49, 0x53, 0xab, 0x78, 0xdf, 0x06, 0x6b, 0x1a, 0x40, 0x6a, 0xe4, 0xaa, 0x41, 0x03, 0x34,
+ 0x61, 0x22, 0xd7, 0xe2, 0x30, 0x88, 0x12, 0x85, 0x51, 0xf4, 0xda, 0x82, 0xcb, 0x64, 0xd0, 0x58,
+ 0x13, 0x27, 0x6d, 0x21, 0x68, 0xaa, 0xc4, 0x26, 0x5d, 0x21, 0xb6, 0x70, 0xe8, 0x35, 0x70, 0x52,
+ 0x28, 0x72, 0x25, 0x72, 0xde, 0x68, 0x39, 0x6d, 0x00, 0xc7, 0xb2, 0x3d, 0xe2, 0x15, 0x16, 0xfb,
+ 0x23, 0xa2, 0x26, 0x7d, 0x85, 0x0a, 0x12, 0x34, 0xc4, 0x2c, 0xf2, 0xc3, 0x29, 0x25, 0x0a, 0xee,
+ 0xe3, 0xe5, 0x08, 0x98, 0x31, 0x61, 0xee, 0xc0, 0x01, 0xd2, 0x37, 0x0b, 0x1b, 0x36, 0x03, 0xdb,
+ 0xb4, 0x24, 0x19, 0x10, 0x44, 0xf0, 0x9d, 0x8d, 0x5e, 0x04, 0x83, 0x21, 0x58, 0xe9, 0x8c, 0x9a,
+ 0x3f, 0x82, 0xff, 0xd0, 0x79, 0xf8, 0x02, 0x3a, 0xb3, 0x31, 0x6b, 0xce, 0xd8, 0x09, 0x12, 0x00,
+ 0xfa, 0xc0, 0x12, 0x49, 0x05, 0x04, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x2c,
+ 0x11, 0x00, 0x1a, 0x00, 0x18, 0x00, 0x23, 0x00, 0x00, 0x08, 0xff, 0x00, 0x07, 0x08, 0x1c, 0x48,
+ 0xb0, 0xa0, 0xc1, 0x83, 0x03, 0x03, 0x04, 0x73, 0x66, 0x08, 0x8a, 0x8a, 0x1a, 0xc0, 0x0e, 0x35,
+ 0x43, 0x48, 0x30, 0x40, 0x00, 0x67, 0x5c, 0x0a, 0xb6, 0xd8, 0x48, 0x64, 0x22, 0x42, 0x85, 0x86,
+ 0x36, 0x72, 0x51, 0x52, 0xc4, 0x8a, 0x0b, 0x81, 0x1b, 0x55, 0x18, 0x3b, 0x18, 0x60, 0x8a, 0x93,
+ 0x16, 0x2a, 0x94, 0x54, 0x21, 0x24, 0xc8, 0x10, 0xc1, 0x8d, 0x2d, 0x56, 0x56, 0x0c, 0x30, 0x6c,
+ 0xe3, 0x10, 0x61, 0x36, 0x0f, 0xa6, 0x74, 0x96, 0x30, 0x40, 0x33, 0x15, 0x3e, 0x99, 0x50, 0x1c,
+ 0x20, 0x72, 0x91, 0x40, 0x8b, 0x88, 0x5a, 0x70, 0x21, 0xb2, 0x74, 0xe0, 0x46, 0xa2, 0x16, 0x09,
+ 0x6d, 0x5c, 0x22, 0xa5, 0x2a, 0xca, 0x16, 0x88, 0x06, 0x58, 0x5c, 0x22, 0x72, 0x85, 0x57, 0xa6,
+ 0x2d, 0x7a, 0x2c, 0xb2, 0x78, 0x68, 0xe3, 0xd9, 0xaf, 0x2a, 0x84, 0x59, 0x1c, 0xf6, 0xf6, 0xa6,
+ 0x0a, 0x42, 0x6c, 0xeb, 0x5a, 0x8d, 0x6b, 0x71, 0x88, 0x5e, 0xb4, 0x35, 0x4a, 0x64, 0xfd, 0xbb,
+ 0x31, 0xa8, 0x45, 0xaa, 0x75, 0xaf, 0x3e, 0xbd, 0x98, 0xb8, 0x05, 0x11, 0x00, 0x45, 0x83, 0x7a,
+ 0x4d, 0xeb, 0x71, 0x71, 0x30, 0xc4, 0x4b, 0x61, 0x12, 0x2d, 0x68, 0x51, 0x58, 0x46, 0x8a, 0x5b,
+ 0x3f, 0x32, 0x06, 0x2d, 0x99, 0x65, 0x80, 0xb0, 0x08, 0x7b, 0x08, 0xab, 0x1a, 0xc0, 0xaf, 0x50,
+ 0xba, 0x5e, 0x85, 0xa9, 0x10, 0xba, 0xb9, 0x2a, 0x00, 0x28, 0x07, 0xe3, 0x9e, 0xbd, 0x58, 0xa3,
+ 0xa0, 0xca, 0xba, 0x01, 0x9a, 0x10, 0xb2, 0x42, 0xdc, 0xca, 0xb2, 0xbf, 0xc8, 0x0b, 0x62, 0x19,
+ 0xd3, 0xa5, 0x4b, 0xa4, 0x2f, 0xd0, 0xc1, 0x98, 0x78, 0x2b, 0xa4, 0x20, 0x1b, 0x36, 0x03, 0xfc,
+ 0xbc, 0xfd, 0x83, 0xdd, 0xe0, 0x9f, 0xba, 0x7a, 0xd6, 0x0c, 0x18, 0xbc, 0xbe, 0x27, 0x40, 0x5d,
+ 0x20, 0x69, 0x08, 0xaa, 0x39, 0xf1, 0xf7, 0x84, 0x9e, 0x33, 0x03, 0xf6, 0x54, 0x4f, 0x0e, 0x00,
+ 0x32, 0xc5, 0x80, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x07, 0x00, 0x03, 0x00, 0x2c, 0x13, 0x00, 0x1a,
+ 0x00, 0x17, 0x00, 0x23, 0x00, 0x00, 0x08, 0xff, 0x00, 0x07, 0x08, 0x1c, 0x48, 0xb0, 0xa0, 0xc1,
+ 0x83, 0x03, 0x02, 0x04, 0x73, 0x66, 0x08, 0xca, 0x80, 0x15, 0x88, 0x0e, 0x35, 0x43, 0x48, 0x10,
+ 0xc0, 0x92, 0x15, 0x07, 0x5b, 0x20, 0x22, 0x84, 0x30, 0x40, 0x93, 0x28, 0x03, 0x5a, 0x70, 0x51,
+ 0x52, 0x84, 0x10, 0x48, 0x81, 0x2d, 0x5c, 0x38, 0x33, 0xe8, 0x91, 0x48, 0x4a, 0x41, 0x53, 0x08,
+ 0x09, 0x2a, 0xc4, 0xa5, 0xa0, 0x8a, 0x95, 0x04, 0x03, 0x80, 0x6c, 0x31, 0x44, 0xd8, 0xc9, 0x8c,
+ 0x2e, 0x38, 0x0a, 0x0c, 0x80, 0xb3, 0x45, 0x94, 0x9a, 0x14, 0x43, 0x22, 0x1a, 0xb8, 0x88, 0x4b,
+ 0x0b, 0x27, 0x4a, 0x92, 0x12, 0x54, 0x31, 0x31, 0xc0, 0xc4, 0x16, 0x87, 0x04, 0x49, 0x1d, 0xd8,
+ 0x62, 0x58, 0xc2, 0x43, 0x21, 0x5b, 0x6c, 0xe5, 0xea, 0x30, 0xc0, 0xaf, 0xb1, 0x05, 0x53, 0x06,
+ 0x0b, 0xb0, 0x14, 0x2d, 0x57, 0x17, 0x4d, 0xcc, 0xba, 0xe5, 0xda, 0x63, 0x2d, 0xd8, 0xb9, 0x21,
+ 0x13, 0x25, 0x2c, 0x82, 0x37, 0xe4, 0xdd, 0xa6, 0x78, 0x5b, 0x4c, 0x4c, 0xb8, 0x64, 0xae, 0xd1,
+ 0x8a, 0x6d, 0xb7, 0xb6, 0x58, 0x41, 0x25, 0xa7, 0x30, 0xa4, 0x49, 0x5b, 0xf4, 0xc0, 0x99, 0x93,
+ 0x32, 0xc5, 0x1a, 0x7c, 0x0f, 0xb2, 0x4d, 0x7a, 0x33, 0xa9, 0xe5, 0xb4, 0x77, 0x29, 0x36, 0x71,
+ 0x81, 0xb0, 0x86, 0x30, 0xa9, 0x01, 0xf4, 0x1e, 0xf4, 0x8a, 0x9a, 0x75, 0xda, 0xcf, 0x08, 0x85,
+ 0x25, 0x46, 0x89, 0x68, 0x11, 0x5a, 0x8f, 0x54, 0x38, 0x4a, 0x29, 0x32, 0xa5, 0xaf, 0x6f, 0x21,
+ 0x78, 0xf6, 0x88, 0xe9, 0x32, 0x60, 0x87, 0x0d, 0x2f, 0x01, 0xc6, 0xfa, 0x68, 0xc3, 0xbc, 0xe0,
+ 0x9f, 0xb1, 0x42, 0x0e, 0xc6, 0x49, 0xbe, 0x15, 0x40, 0x1c, 0x35, 0x6b, 0x08, 0x8e, 0x71, 0xcb,
+ 0xc7, 0x0c, 0x41, 0x37, 0x3f, 0xe6, 0xfa, 0x0b, 0xc0, 0x33, 0x20, 0x4d, 0x18, 0x5c, 0xbe, 0x4b,
+ 0x6c, 0x0d, 0x08, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x2c, 0x13, 0x00, 0x1a,
+ 0x00, 0x17, 0x00, 0x23, 0x00, 0x00, 0x08, 0xdf, 0x00, 0x07, 0x08, 0x1c, 0x48, 0xb0, 0xa0, 0xc1,
+ 0x83, 0x02, 0x9b, 0x2c, 0x89, 0x32, 0x80, 0x85, 0x40, 0x41, 0x84, 0x10, 0x12, 0x5c, 0x64, 0xac,
+ 0xc6, 0x41, 0x15, 0xbf, 0x84, 0x49, 0x14, 0x46, 0x44, 0x20, 0x13, 0x41, 0x56, 0x06, 0x30, 0x21,
+ 0xb8, 0xa2, 0xc8, 0x41, 0x61, 0x5c, 0x06, 0xac, 0x58, 0x32, 0x20, 0xe4, 0x13, 0x17, 0x05, 0x5d,
+ 0x98, 0x24, 0x38, 0xa5, 0x63, 0x4b, 0x42, 0x36, 0x11, 0xae, 0xd0, 0x38, 0xd0, 0xd8, 0xc0, 0x27,
+ 0x2b, 0x24, 0x0e, 0xfc, 0x35, 0xb0, 0x89, 0x45, 0x43, 0x4f, 0x84, 0x16, 0x5c, 0x26, 0x70, 0x88,
+ 0xc0, 0x25, 0x85, 0x94, 0x12, 0x14, 0x24, 0x30, 0xa9, 0x54, 0x83, 0x88, 0x04, 0x02, 0xbb, 0x6a,
+ 0x10, 0x4a, 0x80, 0x01, 0x50, 0xb8, 0x16, 0xac, 0x01, 0x60, 0xc0, 0x56, 0xb1, 0x03, 0xbd, 0x0e,
+ 0x18, 0x86, 0x76, 0x20, 0xc3, 0x01, 0x4e, 0xdb, 0x0e, 0x60, 0x39, 0xc0, 0x68, 0xdb, 0x1e, 0x3c,
+ 0x07, 0x1c, 0x6a, 0xcb, 0x76, 0x60, 0xb0, 0x91, 0x5c, 0xb9, 0x34, 0x29, 0x48, 0x28, 0xa8, 0xd4,
+ 0x15, 0x11, 0xe5, 0xaa, 0x6c, 0x26, 0x31, 0xe7, 0x41, 0x17, 0x8c, 0x15, 0x5f, 0x15, 0xa6, 0x42,
+ 0x67, 0x30, 0xa9, 0x61, 0x0f, 0xee, 0x95, 0x3c, 0x20, 0xb2, 0x54, 0xc7, 0x02, 0x9d, 0x94, 0xe5,
+ 0x9a, 0xb7, 0x48, 0xb3, 0xd1, 0x9c, 0xb9, 0xf6, 0xd1, 0x53, 0xf0, 0x48, 0x10, 0xae, 0x28, 0x10,
+ 0x62, 0xb9, 0xda, 0xe7, 0x20, 0x1c, 0xd4, 0x4a, 0xe5, 0xa4, 0xf6, 0x72, 0xa6, 0x20, 0x2e, 0xc5,
+ 0x68, 0x06, 0xf8, 0x49, 0x2d, 0x34, 0x20, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00, 0x03, 0x00,
+ 0x2c, 0x13, 0x00, 0x1a, 0x00, 0x17, 0x00, 0x23, 0x00, 0x00, 0x08, 0xf6, 0x00, 0x07, 0x08, 0x1c,
+ 0x48, 0xb0, 0xa0, 0xc1, 0x83, 0x02, 0x09, 0x1d, 0x42, 0x54, 0xc3, 0x05, 0x14, 0x43, 0x4b, 0x9a,
+ 0x20, 0x24, 0x28, 0xec, 0x57, 0x8b, 0x83, 0x35, 0x0e, 0x05, 0x9b, 0xe8, 0x6c, 0x85, 0xc0, 0x28,
+ 0x43, 0x06, 0x0c, 0xb9, 0x38, 0x90, 0x88, 0xb0, 0x83, 0xce, 0x7a, 0x0c, 0x60, 0x62, 0xa5, 0x8a,
+ 0x94, 0x42, 0x4e, 0x48, 0x0e, 0xe4, 0x72, 0x92, 0x20, 0xa1, 0x1a, 0x03, 0x88, 0xb8, 0xe4, 0x32,
+ 0x71, 0x00, 0x22, 0x00, 0x04, 0x11, 0x09, 0x64, 0x52, 0x48, 0xe6, 0xc4, 0x90, 0x02, 0x8b, 0x5c,
+ 0x2c, 0xc4, 0xb3, 0xe7, 0x40, 0x26, 0x40, 0x07, 0x18, 0x1a, 0xe0, 0x82, 0x0a, 0x13, 0xa7, 0x04,
+ 0x9b, 0x0d, 0x00, 0x80, 0x13, 0xab, 0xc1, 0x25, 0x03, 0x84, 0x19, 0xf5, 0x2a, 0xf0, 0xd0, 0x80,
+ 0x65, 0x63, 0xc9, 0x0e, 0x0b, 0x20, 0x96, 0x6c, 0x41, 0xb3, 0x5c, 0xdd, 0x12, 0x04, 0x2b, 0x55,
+ 0xee, 0x40, 0x42, 0x02, 0x9d, 0xa5, 0x75, 0x0a, 0x2c, 0x80, 0x40, 0x00, 0x44, 0xe4, 0xaa, 0x70,
+ 0x96, 0x55, 0x25, 0x59, 0x43, 0x7e, 0x09, 0xea, 0xf5, 0x4a, 0x64, 0xa3, 0xc1, 0x61, 0x58, 0x89,
+ 0x48, 0x3c, 0xd8, 0xc4, 0xe3, 0x44, 0x9a, 0x3d, 0xcd, 0x72, 0x74, 0x4a, 0x68, 0xef, 0xca, 0xa8,
+ 0x13, 0x17, 0x75, 0x35, 0x28, 0xc8, 0xab, 0x50, 0xbb, 0x36, 0x9b, 0x12, 0x44, 0x4c, 0x16, 0x00,
+ 0x15, 0x42, 0x56, 0x06, 0x26, 0x46, 0x6d, 0xd7, 0x4f, 0x18, 0x31, 0x63, 0x04, 0x82, 0x79, 0x71,
+ 0x04, 0x74, 0x4f, 0x20, 0x08, 0x75, 0x78, 0xc5, 0xb5, 0xc6, 0xa0, 0x9b, 0x12, 0x5e, 0x03, 0xd4,
+ 0x29, 0x4e, 0x30, 0x8c, 0x5b, 0x1f, 0x05, 0xd9, 0xf4, 0x91, 0x8b, 0x82, 0xe0, 0x74, 0xda, 0x58,
+ 0x03, 0x02, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x2c, 0x13, 0x00, 0x1a, 0x00,
+ 0x16, 0x00, 0x23, 0x00, 0x00, 0x08, 0xf8, 0x00, 0x07, 0x08, 0x1c, 0x48, 0xb0, 0xa0, 0xc1, 0x83,
+ 0x00, 0x9c, 0x0d, 0x4b, 0xc4, 0x62, 0x40, 0xa2, 0x61, 0xce, 0x00, 0x1c, 0x24, 0xe8, 0x8c, 0xc9,
+ 0x44, 0x26, 0xce, 0x02, 0x4c, 0x3c, 0xd4, 0x62, 0xc0, 0x8a, 0x42, 0x45, 0x08, 0x11, 0x29, 0x78,
+ 0x48, 0x62, 0xc1, 0x61, 0x1d, 0x9f, 0x34, 0xa1, 0xb2, 0xc4, 0xa3, 0xc1, 0x61, 0x1a, 0x07, 0x1a,
+ 0xeb, 0xa8, 0x64, 0x40, 0x21, 0x15, 0x13, 0x05, 0x2e, 0x89, 0x49, 0xc5, 0x85, 0x40, 0x25, 0x4e,
+ 0x72, 0x0e, 0xac, 0x21, 0x4c, 0xe0, 0x30, 0x8f, 0x86, 0x3a, 0x0a, 0x1d, 0x78, 0x28, 0x40, 0xb0,
+ 0x1a, 0x36, 0x09, 0x29, 0x5d, 0x3a, 0x00, 0x4a, 0x80, 0x66, 0x1d, 0x5d, 0xac, 0xa0, 0x4a, 0x90,
+ 0x25, 0xd7, 0x83, 0xcd, 0x18, 0x7d, 0x35, 0x58, 0x64, 0xc8, 0xd8, 0x82, 0xcd, 0xb0, 0x9e, 0x15,
+ 0xa8, 0x42, 0x58, 0xb0, 0x1e, 0x6b, 0x07, 0x30, 0xd1, 0x78, 0x74, 0xad, 0x20, 0x81, 0x84, 0xe0,
+ 0x8e, 0x5d, 0xd1, 0x84, 0xe9, 0x54, 0xaa, 0xce, 0x08, 0x02, 0x30, 0xf4, 0xb5, 0x69, 0xc1, 0x60,
+ 0x23, 0x97, 0x1a, 0x36, 0xd8, 0x0c, 0x67, 0x4e, 0x44, 0x26, 0x0f, 0x46, 0xc9, 0xa9, 0x82, 0x90,
+ 0xd0, 0xc0, 0x13, 0xa3, 0xc4, 0x9c, 0xd8, 0xc4, 0xb1, 0x41, 0xcc, 0x42, 0x13, 0x1d, 0x6c, 0x4b,
+ 0xb5, 0xd9, 0x56, 0x82, 0x2a, 0x0e, 0x7d, 0x0d, 0x66, 0x59, 0xa0, 0x95, 0xd6, 0x71, 0xcf, 0xea,
+ 0x10, 0x33, 0xa6, 0x4b, 0xa4, 0x01, 0x5f, 0xc0, 0xec, 0x58, 0x44, 0xf5, 0xc4, 0x00, 0x36, 0x6c,
+ 0x0a, 0xfa, 0xa1, 0x8a, 0x25, 0x78, 0xc1, 0x36, 0x59, 0xb8, 0xe6, 0xf9, 0x1d, 0x1b, 0x48, 0x1a,
+ 0x82, 0x6a, 0x84, 0x8c, 0x3d, 0xa1, 0x67, 0xc0, 0x99, 0x3d, 0xd2, 0x63, 0x0b, 0x0d, 0x08, 0x00,
+ 0x21, 0xf9, 0x04, 0x05, 0x07, 0x00, 0x03, 0x00, 0x2c, 0x13, 0x00, 0x1a, 0x00, 0x16, 0x00, 0x23,
+ 0x00, 0x00, 0x08, 0xf8, 0x00, 0x07, 0x08, 0x1c, 0x48, 0xb0, 0xa0, 0xc1, 0x83, 0x4d, 0x86, 0xfc,
+ 0x82, 0xa2, 0xa2, 0x06, 0xa2, 0x43, 0xcd, 0x02, 0x1c, 0x1c, 0x08, 0x40, 0x50, 0x8d, 0x89, 0x88,
+ 0x08, 0x4d, 0x6c, 0x82, 0x48, 0x20, 0x13, 0x41, 0x56, 0xa4, 0xb4, 0x20, 0xe8, 0xc2, 0x99, 0x44,
+ 0x82, 0x4d, 0x88, 0x0c, 0x70, 0xb1, 0x64, 0x8a, 0x15, 0x41, 0x51, 0x46, 0x12, 0x54, 0xe1, 0xac,
+ 0x60, 0x94, 0x95, 0x56, 0xa8, 0x38, 0x91, 0x79, 0xd0, 0x85, 0x46, 0x81, 0xce, 0x46, 0x72, 0x91,
+ 0xc2, 0x65, 0x22, 0x41, 0x44, 0x12, 0x17, 0x15, 0x65, 0x52, 0xd4, 0xe8, 0xcc, 0x66, 0x03, 0x8a,
+ 0x8c, 0x2c, 0x22, 0xc8, 0x69, 0xc1, 0x43, 0x03, 0xb0, 0x0e, 0x60, 0x62, 0xb5, 0x60, 0xa2, 0x00,
+ 0x37, 0xbb, 0x1a, 0x54, 0xb1, 0xa8, 0xa3, 0xd8, 0x82, 0x2a, 0x82, 0x85, 0x3d, 0x3b, 0x90, 0xac,
+ 0x56, 0xb6, 0x02, 0x81, 0x05, 0x90, 0x0a, 0x57, 0x20, 0x56, 0xa5, 0x75, 0x55, 0x40, 0x1d, 0xb0,
+ 0x84, 0xa7, 0xd8, 0x28, 0x27, 0x01, 0x98, 0x15, 0xbb, 0x42, 0x18, 0x41, 0x61, 0x5c, 0xbb, 0xba,
+ 0xd8, 0x4b, 0x90, 0xd0, 0x0a, 0xab, 0x34, 0x27, 0xf6, 0x75, 0x7a, 0xe8, 0xa4, 0x41, 0x00, 0x89,
+ 0x0f, 0xd6, 0x68, 0xe2, 0x74, 0x89, 0xd1, 0xb7, 0x13, 0x7f, 0x1e, 0x64, 0x3c, 0x11, 0xc0, 0x63,
+ 0x83, 0x3d, 0x38, 0x5b, 0x75, 0xd6, 0xc3, 0xa0, 0xb1, 0xb3, 0x4d, 0xac, 0x58, 0x19, 0x68, 0xb8,
+ 0xae, 0xed, 0x3f, 0x91, 0x72, 0x0f, 0xfc, 0xf2, 0x25, 0x4b, 0x57, 0x21, 0x6c, 0x6c, 0x0b, 0xf4,
+ 0x6d, 0x90, 0x0d, 0x33, 0xb1, 0x7b, 0x82, 0x13, 0xd4, 0x73, 0xf6, 0x84, 0x1a, 0x82, 0x69, 0x80,
+ 0xb0, 0x15, 0xb2, 0x47, 0xa0, 0x9e, 0x13, 0xb6, 0x01, 0x58, 0x0d, 0x08, 0x00, 0x21, 0xf9, 0x04,
+ 0x05, 0x35, 0x00, 0x03, 0x00, 0x2c, 0x13, 0x00, 0x1a, 0x00, 0x16, 0x00, 0x23, 0x00, 0x00, 0x08,
+ 0xd2, 0x00, 0x07, 0x08, 0x1c, 0x48, 0xb0, 0xa0, 0xc1, 0x83, 0xc2, 0x96, 0x44, 0x19, 0xd0, 0x42,
+ 0xa0, 0xa0, 0x65, 0x07, 0x09, 0x4e, 0x39, 0xd4, 0x23, 0xe2, 0x2f, 0x61, 0x11, 0x85, 0x11, 0x11,
+ 0x48, 0x64, 0xc9, 0x00, 0x41, 0x05, 0x57, 0x34, 0x33, 0x28, 0x8c, 0xcb, 0x80, 0x15, 0x43, 0x04,
+ 0x2a, 0x71, 0x62, 0xb0, 0xc7, 0xc8, 0x81, 0x8b, 0x36, 0x72, 0x21, 0x44, 0x68, 0x63, 0xc4, 0x93,
+ 0x18, 0x05, 0x1a, 0xe3, 0x38, 0xc0, 0xc5, 0xcd, 0x81, 0xc3, 0x04, 0x36, 0xa9, 0x21, 0x70, 0xc5,
+ 0xcf, 0x82, 0x10, 0x9d, 0x09, 0x24, 0xf4, 0xe4, 0x28, 0x41, 0x90, 0x41, 0x07, 0x38, 0xf1, 0xe9,
+ 0x54, 0xe0, 0x42, 0x60, 0x55, 0x0d, 0x42, 0x09, 0x00, 0x25, 0x6b, 0x41, 0x18, 0x01, 0xb0, 0x7a,
+ 0x1d, 0x98, 0x28, 0x40, 0xd4, 0xb1, 0x03, 0x0c, 0x0d, 0x48, 0x89, 0x76, 0x80, 0xc7, 0x26, 0x15,
+ 0xc7, 0xf6, 0xc8, 0x79, 0x08, 0x6d, 0x5d, 0x81, 0xc1, 0x98, 0x78, 0xe5, 0xd2, 0x84, 0x20, 0x21,
+ 0xa3, 0x4e, 0x57, 0x10, 0x32, 0xd8, 0x2c, 0xee, 0xcf, 0x97, 0x06, 0x41, 0xfe, 0xdc, 0x19, 0x71,
+ 0x91, 0xc9, 0x88, 0x5c, 0x82, 0x2d, 0x6e, 0x4b, 0xb0, 0x21, 0xe5, 0x45, 0x44, 0x0f, 0x4a, 0x76,
+ 0xaa, 0xc2, 0x20, 0xa3, 0xac, 0x39, 0x29, 0x8b, 0x16, 0xf8, 0xa5, 0xf4, 0x17, 0xb4, 0x7d, 0x22,
+ 0xa6, 0x3e, 0x6a, 0x22, 0x22, 0x16, 0xd1, 0x79, 0xb2, 0x0a, 0x19, 0x3d, 0x60, 0xb5, 0x19, 0xda,
+ 0x3f, 0x03, 0x02, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x00, 0x00, 0x2c, 0x1a, 0x00, 0x1b,
+ 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x02, 0x02, 0x04, 0x0a, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04,
+ 0x00, 0x04, 0x00, 0x2c, 0x16, 0x00, 0x1a, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x00, 0x08, 0x23, 0x00,
+ 0x09, 0x08, 0x1c, 0x48, 0xb0, 0x20, 0x05, 0x05, 0xef, 0xda, 0x99, 0xb3, 0x77, 0x8e, 0x0f, 0x2e,
+ 0x02, 0x19, 0x1e, 0xa0, 0xb3, 0xf7, 0x45, 0x8b, 0x0a, 0x82, 0xbd, 0xc0, 0x50, 0xa2, 0x51, 0x70,
+ 0x60, 0x40, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x06, 0x00, 0x03, 0x00, 0x2c, 0x15, 0x00, 0x1b, 0x00,
+ 0x10, 0x00, 0x04, 0x00, 0x00, 0x08, 0x32, 0x00, 0x07, 0x08, 0x1c, 0x28, 0x30, 0x9d, 0xba, 0x78,
+ 0x1b, 0x22, 0x10, 0x1c, 0xa8, 0x2e, 0x9d, 0xc3, 0x74, 0xe8, 0xe8, 0xe9, 0xa3, 0xe7, 0x81, 0x81,
+ 0xc0, 0x08, 0xee, 0x1c, 0xba, 0xc3, 0x30, 0xa2, 0x11, 0x8c, 0x81, 0x30, 0x4a, 0x0d, 0xc0, 0x82,
+ 0xcf, 0x1e, 0x3e, 0x6e, 0x00, 0x16, 0x2e, 0x0c, 0x08, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00,
+ 0x04, 0x00, 0x2c, 0x14, 0x00, 0x1c, 0x00, 0x12, 0x00, 0x04, 0x00, 0x00, 0x08, 0x38, 0x00, 0x09,
+ 0x08, 0x1c, 0x48, 0x30, 0x9d, 0xc1, 0x74, 0xef, 0x08, 0x2a, 0x1c, 0x88, 0xc1, 0x20, 0x3a, 0x74,
+ 0xea, 0xda, 0x35, 0x10, 0x18, 0x01, 0x5e, 0x3a, 0x75, 0x08, 0x32, 0x34, 0xc0, 0x00, 0xe6, 0xd9,
+ 0x16, 0x19, 0x30, 0x68, 0x98, 0xfa, 0xd2, 0x87, 0x00, 0x3e, 0x76, 0xed, 0x06, 0xe0, 0x02, 0xe3,
+ 0xa9, 0xc6, 0xc2, 0x81, 0x01, 0x01, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x02, 0x00, 0x2c,
+ 0x14, 0x00, 0x1d, 0x00, 0x13, 0x00, 0x05, 0x00, 0x00, 0x08, 0x3e, 0x00, 0x05, 0x08, 0x1c, 0x48,
+ 0x50, 0x60, 0xba, 0x83, 0x05, 0x13, 0x0a, 0x78, 0x10, 0xef, 0xa0, 0xc3, 0x74, 0xea, 0x1a, 0x08,
+ 0xc8, 0xe0, 0x2e, 0x9d, 0xc0, 0x11, 0x15, 0x21, 0xda, 0x8b, 0x74, 0xc5, 0x93, 0x27, 0x4a, 0x5f,
+ 0xf0, 0x19, 0x99, 0x66, 0x4e, 0x5d, 0x3c, 0x12, 0xea, 0xd8, 0xd9, 0x7b, 0xa6, 0x45, 0x21, 0x41,
+ 0x5d, 0xa6, 0x4c, 0x69, 0x61, 0xe1, 0x92, 0x60, 0x40, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00,
+ 0x00, 0x00, 0x2c, 0x13, 0x00, 0x1f, 0x00, 0x15, 0x00, 0x04, 0x00, 0x00, 0x08, 0x39, 0x00, 0x01,
+ 0x08, 0x1c, 0x48, 0x30, 0x9d, 0xc1, 0x83, 0x06, 0xdb, 0x31, 0x10, 0xb8, 0xc1, 0xe0, 0x40, 0x84,
+ 0xe9, 0xd0, 0xd9, 0xfb, 0x42, 0xf1, 0x8b, 0x3d, 0x0f, 0x00, 0x82, 0x7d, 0x31, 0xe7, 0x4e, 0x1d,
+ 0x42, 0x73, 0xdb, 0x28, 0xc1, 0x20, 0x28, 0xb0, 0xc6, 0x40, 0x15, 0xcb, 0x88, 0x3d, 0x7b, 0x46,
+ 0x49, 0x96, 0x0a, 0x92, 0x30, 0x03, 0x02, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x07, 0x00, 0x01, 0x00,
+ 0x2c, 0x13, 0x00, 0x20, 0x00, 0x15, 0x00, 0x04, 0x00, 0x00, 0x08, 0x39, 0x00, 0x03, 0x08, 0x1c,
+ 0x48, 0x50, 0x60, 0xba, 0x83, 0x08, 0xd3, 0x09, 0xa4, 0xa0, 0x4e, 0x61, 0xc1, 0x84, 0xe9, 0xd8,
+ 0xd9, 0x9b, 0xa8, 0x0f, 0x5d, 0x84, 0x55, 0xdb, 0xcc, 0x45, 0xf0, 0x00, 0x51, 0x9d, 0xbd, 0x2f,
+ 0xa6, 0x6a, 0x10, 0x94, 0x11, 0x4b, 0x20, 0x0b, 0x5f, 0x5f, 0xb6, 0xe1, 0xc3, 0x17, 0xe9, 0x19,
+ 0x92, 0x82, 0x05, 0x03, 0x02, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x00, 0x00, 0x2c, 0x13,
+ 0x00, 0x21, 0x00, 0x15, 0x00, 0x04, 0x00, 0x00, 0x08, 0x3b, 0x00, 0x01, 0x08, 0x1c, 0x48, 0x90,
+ 0x60, 0xba, 0x83, 0x08, 0x01, 0x20, 0x38, 0x58, 0x50, 0x20, 0x42, 0x84, 0xea, 0xd8, 0xa1, 0x4b,
+ 0x87, 0x01, 0xd3, 0x36, 0x73, 0xf1, 0xd4, 0x3d, 0x44, 0x88, 0xce, 0xde, 0x17, 0x53, 0x32, 0x6a,
+ 0xc0, 0xd0, 0xf2, 0x49, 0x20, 0x0b, 0x4f, 0x5f, 0xec, 0x99, 0x63, 0xc7, 0xce, 0xde, 0x36, 0x4a,
+ 0x32, 0x1a, 0x0a, 0x0c, 0x08, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00, 0x00, 0x00, 0x2c, 0x13,
+ 0x00, 0x22, 0x00, 0x15, 0x00, 0x05, 0x00, 0x00, 0x08, 0x3c, 0x00, 0x01, 0x08, 0x1c, 0x48, 0xb0,
+ 0x20, 0x80, 0x74, 0x08, 0x05, 0x7a, 0x48, 0x68, 0x50, 0x20, 0xc2, 0x87, 0x0f, 0xdf, 0x81, 0xc1,
+ 0xc7, 0x0e, 0xa2, 0x45, 0x84, 0xec, 0xf0, 0x7d, 0xa1, 0xe4, 0x49, 0x53, 0x35, 0x81, 0x2c, 0x3c,
+ 0x7d, 0xb1, 0xa7, 0xee, 0xa1, 0x3a, 0x7d, 0x5f, 0x3c, 0xd5, 0x68, 0x58, 0x50, 0x86, 0xa9, 0x52,
+ 0xa6, 0x64, 0xb0, 0x14, 0x18, 0x10, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x00, 0x00, 0x2c,
+ 0x13, 0x00, 0x24, 0x00, 0x15, 0x00, 0x04, 0x00, 0x00, 0x08, 0x36, 0x00, 0xdd, 0xa5, 0x4b, 0x07,
+ 0xa0, 0xa0, 0xc1, 0x83, 0x00, 0x06, 0x2a, 0x4c, 0x07, 0x6f, 0x9b, 0x3d, 0x76, 0x0b, 0x0d, 0x2e,
+ 0x1c, 0x68, 0x0e, 0x5f, 0xa4, 0x48, 0xdb, 0x0a, 0xd6, 0xf0, 0x14, 0x89, 0xde, 0xc4, 0x74, 0xe8,
+ 0xec, 0x7d, 0x31, 0xa5, 0x02, 0x21, 0x42, 0x2d, 0x57, 0xbe, 0xa8, 0xa4, 0x94, 0xc3, 0x64, 0xc1,
+ 0x80, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x07, 0x00, 0x01, 0x00, 0x2c, 0x13, 0x00, 0x25, 0x00, 0x15,
+ 0x00, 0x04, 0x00, 0x00, 0x08, 0x36, 0x00, 0xdb, 0xa5, 0x4b, 0x17, 0xa0, 0xa0, 0xc1, 0x83, 0x06,
+ 0x07, 0x0e, 0x54, 0x87, 0x8f, 0x1e, 0x3a, 0x85, 0x08, 0x03, 0x28, 0x5c, 0xc8, 0x4e, 0x9f, 0xbd,
+ 0x82, 0x32, 0x34, 0x6d, 0xa3, 0x37, 0x71, 0x22, 0x3b, 0x7b, 0xcf, 0xb4, 0xa8, 0x88, 0x18, 0x40,
+ 0x85, 0xa9, 0x2f, 0xdb, 0xec, 0xa9, 0x8c, 0x44, 0x49, 0x46, 0xc4, 0x80, 0x00, 0x21, 0xf9, 0x04,
+ 0x05, 0x03, 0x00, 0x01, 0x00, 0x2c, 0x13, 0x00, 0x26, 0x00, 0x15, 0x00, 0x04, 0x00, 0x00, 0x08,
+ 0x34, 0x00, 0xdd, 0xa5, 0x4b, 0x17, 0xa0, 0xa0, 0xc1, 0x83, 0x07, 0x07, 0xa6, 0x83, 0xe7, 0x41,
+ 0xe1, 0x40, 0x84, 0x06, 0x1d, 0x0e, 0x7c, 0xe7, 0x4c, 0x86, 0x2c, 0x4a, 0x5f, 0xcc, 0x49, 0x94,
+ 0x68, 0x6e, 0xdb, 0x15, 0x59, 0x8c, 0x20, 0x9a, 0xfa, 0x62, 0x8f, 0x9d, 0xba, 0x74, 0xec, 0xec,
+ 0x7d, 0x31, 0x85, 0x30, 0x20, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x00, 0x00, 0x2c, 0x13,
+ 0x00, 0x28, 0x00, 0x15, 0x00, 0x04, 0x00, 0x00, 0x08, 0x38, 0x00, 0x11, 0xa4, 0x1b, 0x38, 0x10,
+ 0x80, 0xc1, 0x83, 0x08, 0x09, 0xa6, 0x53, 0x60, 0x84, 0x12, 0xa5, 0x67, 0xdb, 0xe8, 0x29, 0x4c,
+ 0x07, 0x60, 0x22, 0x3a, 0x7b, 0x91, 0x8c, 0x20, 0x04, 0xa0, 0x62, 0xcb, 0x17, 0x7b, 0xe8, 0x14,
+ 0xb2, 0xb3, 0xf7, 0x6c, 0xc6, 0xc6, 0x93, 0x00, 0x60, 0x98, 0xf2, 0xe4, 0x49, 0x0b, 0x8b, 0x93,
+ 0x01, 0x01, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00, 0x01, 0x00, 0x2c, 0x13, 0x00, 0x29, 0x00,
+ 0x15, 0x00, 0x04, 0x00, 0x00, 0x08, 0x3a, 0x00, 0x29, 0xa8, 0x4b, 0x47, 0x30, 0x5d, 0x80, 0x83,
+ 0x08, 0x13, 0x06, 0x20, 0xa8, 0x8e, 0x41, 0x00, 0x6e, 0x91, 0x22, 0x6d, 0xa3, 0x37, 0x90, 0x60,
+ 0xc2, 0x82, 0x04, 0x21, 0x28, 0x3c, 0xa8, 0xe5, 0x8b, 0x3d, 0x74, 0x18, 0xd3, 0xa9, 0xa3, 0x17,
+ 0x49, 0x53, 0xb0, 0x8d, 0x09, 0x65, 0x78, 0x7a, 0xf6, 0xe5, 0x0b, 0x25, 0x2d, 0x2a, 0x12, 0x06,
+ 0x04, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x06, 0x00, 0x04, 0x00, 0x2c, 0x14, 0x00, 0x2a, 0x00, 0x13,
+ 0x00, 0x04, 0x00, 0x00, 0x08, 0x30, 0x00, 0x1f, 0xa4, 0x1b, 0x38, 0x90, 0x80, 0xc1, 0x83, 0x08,
+ 0x0f, 0x66, 0xc0, 0x87, 0xcf, 0x1e, 0x3d, 0x74, 0x04, 0x13, 0x12, 0x84, 0x47, 0x21, 0x21, 0x8d,
+ 0x2b, 0xf8, 0xd8, 0x11, 0xdc, 0xd8, 0x6e, 0x40, 0x42, 0x84, 0x30, 0x3c, 0x7d, 0xd9, 0x86, 0x6f,
+ 0xdb, 0x17, 0x4f, 0x07, 0x03, 0x02, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x04, 0x00, 0x01, 0x00, 0x2c,
+ 0x15, 0x00, 0x2b, 0x00, 0x11, 0x00, 0x04, 0x00, 0x00, 0x08, 0x2c, 0x00, 0xdd, 0xa5, 0x1b, 0x98,
+ 0x2e, 0x80, 0xc1, 0x83, 0x08, 0x0d, 0x46, 0xa0, 0xa7, 0x8f, 0x1e, 0x3a, 0x82, 0x09, 0x0d, 0xaa,
+ 0x4b, 0x08, 0xc3, 0x53, 0x24, 0x7d, 0xea, 0x08, 0x0e, 0x54, 0xd7, 0x20, 0xe2, 0x41, 0x2d, 0xcf,
+ 0xb6, 0xd9, 0x1b, 0xc9, 0xcd, 0x60, 0x40, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x00, 0x00,
+ 0x2c, 0x16, 0x00, 0x2c, 0x00, 0x0e, 0x00, 0x04, 0x00, 0x00, 0x08, 0x27, 0x00, 0xdb, 0xa5, 0x1b,
+ 0x08, 0xa0, 0xa0, 0xc1, 0x83, 0x23, 0xd8, 0x99, 0x43, 0x37, 0x90, 0xe0, 0xc1, 0x83, 0x35, 0xb4,
+ 0x3c, 0xb3, 0xc7, 0xae, 0xe1, 0xc0, 0x0d, 0x0f, 0x0b, 0xc2, 0xa0, 0x14, 0xc9, 0x1e, 0x3d, 0x73,
+ 0x19, 0x02, 0x02, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x00, 0x00, 0x2c, 0x17, 0x00, 0x2d,
+ 0x00, 0x0c, 0x00, 0x04, 0x00, 0x00, 0x08, 0x24, 0x00, 0xd5, 0xa5, 0x4b, 0x07, 0xa0, 0xa0, 0x41,
+ 0x83, 0x1b, 0xd8, 0xb1, 0x1b, 0x38, 0xf0, 0x60, 0x41, 0x28, 0x2a, 0x64, 0x78, 0xfa, 0x62, 0x0f,
+ 0x1d, 0xc3, 0x76, 0x0e, 0x0b, 0xe6, 0x78, 0x86, 0x4f, 0xdf, 0x86, 0x80, 0x00, 0x21, 0xf9, 0x04,
+ 0x05, 0x07, 0x00, 0x00, 0x00, 0x2c, 0x17, 0x00, 0x2e, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x00, 0x08,
+ 0x23, 0x00, 0x01, 0xa4, 0x4b, 0x07, 0xa0, 0xa0, 0x41, 0x83, 0x19, 0xe0, 0xb1, 0x63, 0xa7, 0x6e,
+ 0x20, 0xc1, 0x83, 0x06, 0x69, 0x78, 0xfa, 0xa2, 0xaf, 0x61, 0xba, 0x07, 0x10, 0x0d, 0x6a, 0x79,
+ 0x86, 0x6f, 0x44, 0x40, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x00, 0x00, 0x2c, 0x18, 0x00,
+ 0x2f, 0x00, 0x0b, 0x00, 0x04, 0x00, 0x00, 0x08, 0x23, 0x00, 0x01, 0xa4, 0x1b, 0x08, 0xa0, 0xa0,
+ 0x41, 0x00, 0x1b, 0xd8, 0xd1, 0x33, 0x87, 0x6e, 0x60, 0x3a, 0x83, 0xcd, 0x54, 0x14, 0x84, 0x61,
+ 0xea, 0x8b, 0x3d, 0x75, 0x0f, 0x0f, 0x1e, 0xe4, 0xf5, 0xcc, 0x41, 0x40, 0x00, 0x21, 0xf9, 0x04,
+ 0x05, 0x04, 0x00, 0x00, 0x00, 0x2c, 0x18, 0x00, 0x30, 0x00, 0x0b, 0x00, 0x04, 0x00, 0x00, 0x08,
+ 0x1e, 0x00, 0x01, 0xa4, 0x1b, 0x98, 0x0e, 0x80, 0xc1, 0x83, 0x23, 0xcc, 0xd9, 0x5b, 0x68, 0x4e,
+ 0xdd, 0xc0, 0x83, 0x10, 0x01, 0x20, 0x79, 0x66, 0x8f, 0x5d, 0x86, 0x88, 0x18, 0x03, 0x02, 0x00,
+ 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x00, 0x00, 0x2c, 0x18, 0x00, 0x31, 0x00, 0x0a, 0x00, 0x03,
+ 0x00, 0x00, 0x08, 0x1a, 0x00, 0x01, 0xa4, 0x1b, 0x48, 0x10, 0x80, 0xc1, 0x0c, 0xf4, 0xf0, 0x45,
+ 0x5a, 0x68, 0x8f, 0x5d, 0x3a, 0x75, 0x06, 0x23, 0x1a, 0x64, 0x61, 0x8a, 0x5b, 0x40, 0x00, 0x21,
+ 0xf9, 0x04, 0x05, 0x07, 0x00, 0x00, 0x00, 0x2c, 0x19, 0x00, 0x32, 0x00, 0x09, 0x00, 0x02, 0x00,
+ 0x00, 0x08, 0x14, 0x00, 0xd5, 0xa5, 0x1b, 0x48, 0x10, 0x00, 0x00, 0x12, 0x91, 0x28, 0x99, 0x32,
+ 0xe5, 0xe9, 0x0b, 0x3e, 0x04, 0x01, 0x01, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x00, 0x00,
+ 0x2c, 0x19, 0x00, 0x33, 0x00, 0x09, 0x00, 0x02, 0x00, 0x00, 0x08, 0x15, 0x00, 0x11, 0xa8, 0x53,
+ 0x67, 0xce, 0x9e, 0x3d, 0x73, 0xe8, 0x00, 0x00, 0xa0, 0x70, 0x4b, 0xa1, 0x42, 0x66, 0x00, 0x02,
+ 0x02, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x03, 0x00, 0x00, 0x00, 0x2c, 0x1a, 0x00, 0x33, 0x00, 0x07,
+ 0x00, 0x02, 0x00, 0x00, 0x08, 0x0e, 0x00, 0x01, 0xa4, 0x1b, 0x38, 0x50, 0x1d, 0x80, 0x11, 0x08,
+ 0x11, 0x32, 0x08, 0x08, 0x00, 0x21, 0xf9, 0x04, 0x05, 0x21, 0x00, 0x00, 0x00, 0x2c, 0x1d, 0x00,
+ 0x34, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x02, 0x02, 0x84, 0x0b, 0x00, 0x3b,
};
const lv_img_dsc_t img_bulb_gif = {
- .header.always_zero = 0,
- .header.w = 0,
- .header.h = 0,
- .data_size = 0,
- .header.cf = LV_IMG_CF_RAW,
- .data = img_blub_gif_map,
+ .header.always_zero = 0,
+ .header.w = 0,
+ .header.h = 0,
+ .data_size = 0,
+ .header.cf = LV_IMG_CF_RAW,
+ .data = img_blub_gif_map,
};
diff --git a/examples/libs/png/img_wink_png.c b/examples/libs/png/img_wink_png.c
index be69be1ee..bec3ed6ad 100644
--- a/examples/libs/png/img_wink_png.c
+++ b/examples/libs/png/img_wink_png.c
@@ -3,346 +3,346 @@
#ifndef LV_ATTRIBUTE_MEM_ALIGN
-#define LV_ATTRIBUTE_MEM_ALIGN
+ #define LV_ATTRIBUTE_MEM_ALIGN
#endif
#ifndef LV_ATTRIBUTE_IMG_PNG_DECODER_TEST
-#define LV_ATTRIBUTE_IMG_PNG_DECODER_TEST
+ #define LV_ATTRIBUTE_IMG_PNG_DECODER_TEST
#endif
const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_PNG_DECODER_TEST uint8_t img_wink_png_map[] = {
- 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
- 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x32, 0x08, 0x06, 0x00, 0x00, 0x00, 0x1e, 0x3f, 0x88,
- 0xb1, 0x00, 0x00, 0x00, 0x06, 0x62, 0x4b, 0x47, 0x44, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xa0,
- 0xbd, 0xa7, 0x93, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00,
- 0x00, 0x0b, 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, 0x45,
- 0x07, 0xe5, 0x05, 0x07, 0x0c, 0x1b, 0x26, 0xad, 0x4b, 0x20, 0x5b, 0x00, 0x00, 0x00, 0x1d, 0x69,
- 0x54, 0x58, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43,
- 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x47, 0x49, 0x4d, 0x50,
- 0x64, 0x2e, 0x65, 0x07, 0x00, 0x00, 0x13, 0x8a, 0x49, 0x44, 0x41, 0x54, 0x68, 0xde, 0xad, 0x9a,
- 0x69, 0x94, 0x5d, 0xd5, 0x75, 0xe7, 0x7f, 0xe7, 0xdc, 0x7b, 0xdf, 0x7d, 0x43, 0xd5, 0xab, 0xe9,
- 0x55, 0x49, 0x05, 0xaa, 0xd2, 0x80, 0x10, 0x12, 0x48, 0xa8, 0x24, 0x04, 0x66, 0x72, 0x6c, 0xec,
- 0xd8, 0xd0, 0x6e, 0x27, 0xc4, 0x6d, 0x4c, 0x08, 0x21, 0xdd, 0xed, 0x24, 0xbd, 0x1c, 0x67, 0x39,
- 0xcb, 0x6d, 0x33, 0xc7, 0x6e, 0x9b, 0xc6, 0x18, 0x64, 0x90, 0x43, 0xda, 0xb1, 0x1d, 0x7f, 0x31,
- 0x89, 0x93, 0xb8, 0x33, 0x38, 0x84, 0x15, 0x63, 0xe3, 0x38, 0x84, 0x80, 0x99, 0x67, 0x24, 0x10,
- 0x83, 0x06, 0x84, 0x84, 0x54, 0x52, 0x95, 0x6a, 0x7e, 0xf5, 0xa6, 0x3b, 0x9c, 0xb3, 0xfb, 0xc3,
- 0xbd, 0x6f, 0x28, 0xa1, 0xac, 0x0e, 0x8e, 0x6b, 0xad, 0xb3, 0x6e, 0xd5, 0x7b, 0xa7, 0xce, 0xd9,
- 0xff, 0xb3, 0xa7, 0xff, 0xde, 0xf7, 0x28, 0x7e, 0x8e, 0x9f, 0x97, 0x6f, 0x18, 0xe2, 0xec, 0x3b,
- 0x8f, 0x03, 0xf0, 0xe0, 0xd5, 0x5b, 0x19, 0x1e, 0xdd, 0xa7, 0x4b, 0xab, 0x95, 0x5a, 0x98, 0xee,
- 0xe9, 0x6d, 0xcc, 0x95, 0xcf, 0xcb, 0xf5, 0xc8, 0xe6, 0x6c, 0x97, 0x3e, 0x5d, 0x3b, 0x76, 0xd0,
- 0x51, 0xaa, 0x28, 0x56, 0x10, 0xc3, 0xa2, 0x89, 0xd5, 0x74, 0x58, 0xe3, 0x50, 0xa3, 0xa6, 0x5e,
- 0x15, 0xed, 0xbf, 0x30, 0x30, 0x5c, 0x38, 0x52, 0x9f, 0x1a, 0x8f, 0xe7, 0xaa, 0x3d, 0xb2, 0xed,
- 0xee, 0xe3, 0xd2, 0x5e, 0x7f, 0x19, 0x67, 0xdf, 0x39, 0xf9, 0xae, 0x64, 0x52, 0xef, 0x66, 0xf2,
- 0x4b, 0xd7, 0x0d, 0xb3, 0x65, 0xc7, 0x31, 0x00, 0x7e, 0x70, 0xee, 0x6a, 0xb5, 0xed, 0x13, 0xc7,
- 0xfd, 0x58, 0x7a, 0x46, 0x95, 0xa9, 0x7c, 0xa2, 0xab, 0xa4, 0xaf, 0xcc, 0xe4, 0xe3, 0xb3, 0xf3,
- 0xbd, 0x1a, 0x37, 0x23, 0x80, 0x80, 0xa8, 0xe4, 0x69, 0x01, 0x63, 0x51, 0x06, 0xc4, 0x28, 0x6c,
- 0x03, 0x1a, 0x65, 0xa1, 0x51, 0xd3, 0xc7, 0xeb, 0x55, 0x1e, 0x08, 0x43, 0xef, 0xaf, 0x5d, 0x47,
- 0xbf, 0x30, 0xb7, 0xa0, 0xcb, 0x5b, 0xef, 0x9e, 0x8a, 0x9a, 0xfb, 0xed, 0xba, 0x6e, 0x19, 0x9b,
- 0x77, 0x4c, 0xfe, 0xe2, 0x80, 0xec, 0xff, 0xf6, 0xc7, 0x88, 0x8f, 0xfd, 0x88, 0xf5, 0x5f, 0x49,
- 0xf6, 0x78, 0xe3, 0xcb, 0x5d, 0x5d, 0x5e, 0x2e, 0x7b, 0x6e, 0xb6, 0x18, 0x7f, 0x26, 0xdf, 0x6b,
- 0xff, 0x4b, 0xd7, 0xa0, 0x42, 0x39, 0x2e, 0x38, 0x59, 0x20, 0x83, 0x68, 0x0f, 0x94, 0x87, 0xd2,
- 0x39, 0x40, 0x83, 0x44, 0x88, 0xa9, 0x83, 0x09, 0xc0, 0x84, 0xa8, 0x30, 0x40, 0x05, 0x01, 0x84,
- 0x06, 0x22, 0x45, 0xa3, 0x6c, 0xa9, 0x2e, 0xea, 0xb7, 0xea, 0x81, 0xf7, 0x4d, 0x1b, 0xdb, 0xfb,
- 0x0e, 0x8e, 0x17, 0x0f, 0x5f, 0xf2, 0xdd, 0x23, 0x31, 0xc0, 0xab, 0x5f, 0x7b, 0x2f, 0x67, 0xdd,
- 0xf8, 0xd8, 0x7f, 0x1c, 0xc8, 0xae, 0x1b, 0x47, 0xd8, 0xfc, 0xb5, 0xc3, 0x00, 0xfc, 0xf4, 0xd2,
- 0x62, 0x66, 0xed, 0x07, 0x33, 0x9b, 0xb3, 0xdd, 0xe6, 0xf3, 0xdd, 0x83, 0x72, 0x55, 0xae, 0x17,
- 0x54, 0xa6, 0x1b, 0x71, 0xfb, 0x20, 0xbb, 0x12, 0xd5, 0xb3, 0x09, 0x95, 0x3f, 0x1d, 0x72, 0x23,
- 0xe0, 0xf5, 0x82, 0xd2, 0xed, 0x85, 0x24, 0x86, 0x60, 0x06, 0xea, 0x87, 0x91, 0xea, 0x5e, 0x98,
- 0x7f, 0x05, 0x16, 0x0f, 0x41, 0x75, 0x0e, 0x55, 0xab, 0xa0, 0x02, 0x4b, 0x54, 0x83, 0xc5, 0xb2,
- 0x3a, 0xdc, 0x08, 0xdd, 0xdb, 0xe6, 0xe6, 0xd5, 0x8f, 0x37, 0x7d, 0x7d, 0x61, 0x1c, 0xe0, 0xa5,
- 0xeb, 0x57, 0xb0, 0xe5, 0xae, 0x23, 0x3f, 0x3f, 0x90, 0x5d, 0xd7, 0x95, 0xd8, 0xbc, 0x63, 0x3a,
- 0xb5, 0xdb, 0x81, 0xc1, 0xbe, 0x11, 0xf9, 0xaf, 0x85, 0x12, 0x37, 0x15, 0x06, 0x28, 0x39, 0xd9,
- 0x02, 0xf8, 0xa3, 0xd0, 0x77, 0x1e, 0xaa, 0xff, 0x62, 0xc8, 0xad, 0x04, 0x31, 0xe9, 0xb0, 0x24,
- 0xf6, 0x74, 0x92, 0xed, 0x54, 0x3a, 0x50, 0x50, 0x3f, 0x02, 0x33, 0xcf, 0x20, 0x53, 0xcf, 0xc3,
- 0xec, 0x01, 0x58, 0x9c, 0x46, 0x87, 0x50, 0xaf, 0xc2, 0x62, 0xc5, 0xf9, 0x49, 0xad, 0xae, 0xef,
- 0x58, 0x73, 0x6b, 0xf9, 0x31, 0x80, 0x9d, 0x37, 0x0c, 0x33, 0x76, 0xe7, 0xb1, 0x77, 0x0f, 0x64,
- 0xd7, 0xf5, 0x7d, 0x6c, 0xbe, 0x6b, 0x0e, 0x80, 0x3d, 0xb7, 0x0e, 0x9c, 0xd5, 0x73, 0x8a, 0xfa,
- 0x52, 0xf7, 0x32, 0x75, 0xa5, 0xdf, 0x25, 0x90, 0x1d, 0x81, 0xbe, 0x8b, 0x50, 0x43, 0x97, 0x42,
- 0x66, 0x28, 0x39, 0x6d, 0x31, 0x27, 0x59, 0x45, 0xda, 0xcf, 0x14, 0xa0, 0x12, 0x83, 0x60, 0xdb,
- 0xf3, 0xb5, 0x87, 0x8a, 0xab, 0xc8, 0xec, 0x0b, 0xc8, 0xb1, 0xa7, 0x60, 0xe2, 0x15, 0x54, 0xb5,
- 0x82, 0xc4, 0x9a, 0x85, 0x05, 0xa6, 0x2a, 0x55, 0xe7, 0xe6, 0xaf, 0xfd, 0xf0, 0xb2, 0xef, 0x7d,
- 0xfb, 0xc5, 0x1f, 0xc4, 0x3b, 0x3f, 0xd7, 0xcb, 0xd8, 0xdd, 0xf3, 0xff, 0x7e, 0x20, 0x2f, 0xdf,
- 0x50, 0xe2, 0xec, 0x3b, 0x13, 0x4d, 0xec, 0xbb, 0xbd, 0xff, 0xe2, 0xbe, 0x11, 0xe7, 0xae, 0xc2,
- 0xa0, 0x3e, 0xdf, 0xcb, 0x6b, 0xe8, 0xda, 0x8c, 0x5a, 0x76, 0x39, 0x14, 0xcf, 0x4e, 0x65, 0x3c,
- 0x19, 0x00, 0x8b, 0x12, 0x69, 0x09, 0xac, 0xc4, 0x22, 0x62, 0x81, 0xb6, 0xb6, 0x94, 0x98, 0x44,
- 0x6b, 0x62, 0x12, 0xa0, 0xda, 0x43, 0xa2, 0x05, 0x98, 0x7c, 0x16, 0x79, 0xfb, 0x31, 0x98, 0x3c,
- 0x80, 0xb2, 0x0e, 0xd5, 0x2a, 0x71, 0xb9, 0xa2, 0xbf, 0xf2, 0xe1, 0xff, 0x75, 0xda, 0x57, 0x5f,
- 0x63, 0x97, 0xd9, 0x79, 0xfd, 0x72, 0xc6, 0xee, 0x9a, 0xf8, 0xff, 0x03, 0xd9, 0x79, 0xdd, 0x10,
- 0x63, 0x3b, 0x92, 0xd0, 0xba, 0xff, 0x8e, 0xfe, 0x4b, 0xfa, 0x56, 0x39, 0xdf, 0x28, 0x94, 0xdc,
- 0x8d, 0xae, 0xef, 0x42, 0xdf, 0xc5, 0xa8, 0xe1, 0x2b, 0xc0, 0x1f, 0x6e, 0x0b, 0xd0, 0x71, 0xfa,
- 0x0a, 0x0b, 0xa9, 0xd0, 0x4b, 0x4e, 0x5e, 0x92, 0xcf, 0x15, 0x6d, 0xe1, 0x45, 0x2c, 0x8a, 0x14,
- 0x60, 0x13, 0x14, 0x02, 0xca, 0x81, 0x85, 0x03, 0x70, 0xe8, 0x11, 0xe4, 0xd0, 0x73, 0x28, 0xeb,
- 0xd0, 0x68, 0x88, 0x99, 0x9d, 0x77, 0x76, 0x8c, 0x7c, 0xa9, 0x72, 0x13, 0xc0, 0xce, 0x9b, 0x4f,
- 0x63, 0xec, 0x8e, 0x37, 0xff, 0x6d, 0x20, 0xaf, 0x7c, 0x69, 0x3d, 0x9b, 0x6e, 0x7d, 0x23, 0xd1,
- 0xc4, 0xf6, 0xd2, 0x7b, 0xfa, 0x47, 0xf5, 0x9f, 0x77, 0x2d, 0xf3, 0xd6, 0x3b, 0x9e, 0x03, 0xfd,
- 0xef, 0x47, 0x9d, 0x72, 0x25, 0x78, 0xfd, 0x20, 0x31, 0xda, 0x71, 0x00, 0x41, 0x4c, 0x94, 0x0a,
- 0xd3, 0x71, 0xe2, 0x1d, 0xc2, 0xa9, 0xa6, 0xbf, 0x88, 0x41, 0x3a, 0xb5, 0xd0, 0xfa, 0xbc, 0x03,
- 0x88, 0x4d, 0xd7, 0x50, 0x1a, 0x82, 0x39, 0xe4, 0xd0, 0xa3, 0xb0, 0xff, 0x31, 0xb0, 0x2e, 0x41,
- 0x40, 0x70, 0x7c, 0x46, 0x6f, 0x5f, 0xfd, 0xbf, 0x2b, 0xb7, 0xc8, 0x93, 0xb0, 0xff, 0xe0, 0xe7,
- 0x38, 0xfd, 0xea, 0xbb, 0x4f, 0x0e, 0x44, 0x9e, 0x06, 0x75, 0x3e, 0xec, 0xbf, 0x63, 0x68, 0x4d,
- 0xf7, 0x72, 0xfe, 0xae, 0x6f, 0xa5, 0x7f, 0x8e, 0x76, 0x25, 0xf1, 0x87, 0x53, 0xaf, 0x49, 0x40,
- 0xd8, 0x08, 0x9d, 0xcd, 0x30, 0x77, 0xe8, 0x6d, 0x4c, 0x14, 0xd2, 0x37, 0x3c, 0x88, 0x52, 0xd2,
- 0x21, 0x98, 0x39, 0x41, 0xf8, 0x26, 0xc0, 0x7f, 0x43, 0x78, 0x39, 0x11, 0x4c, 0xf2, 0x14, 0x80,
- 0xb8, 0x06, 0x6f, 0xfd, 0x0c, 0xde, 0x7c, 0x0a, 0xf0, 0x68, 0x04, 0xcc, 0x1e, 0x3e, 0xea, 0x5d,
- 0xbf, 0x61, 0xfb, 0xc2, 0x3d, 0x6f, 0x5c, 0xeb, 0xa9, 0xf5, 0x5f, 0x8f, 0x5a, 0x26, 0xd1, 0x8a,
- 0x8f, 0xbb, 0x6f, 0x2e, 0xa1, 0xce, 0x87, 0xdd, 0x37, 0xf6, 0xf4, 0xe6, 0x7a, 0xf8, 0x4a, 0xdf,
- 0x68, 0x36, 0x01, 0xd1, 0x75, 0x26, 0x6a, 0xf9, 0xc7, 0x50, 0x6e, 0x2f, 0xd8, 0x06, 0xda, 0x85,
- 0xf1, 0x5d, 0x3b, 0xf9, 0xfe, 0x1f, 0x7e, 0x95, 0x3f, 0xbe, 0xe6, 0xb3, 0x4c, 0xee, 0x7f, 0x13,
- 0x4c, 0x80, 0xb2, 0x01, 0x2a, 0x7d, 0x62, 0x1b, 0x88, 0x69, 0x20, 0x36, 0x00, 0x69, 0x80, 0x0d,
- 0xc0, 0x86, 0x1d, 0x23, 0x48, 0x86, 0x49, 0x9f, 0x36, 0x99, 0x23, 0x26, 0x40, 0x6c, 0x88, 0x98,
- 0x10, 0xe2, 0x46, 0x22, 0xd8, 0xc8, 0x36, 0x18, 0x5c, 0x05, 0x62, 0xf1, 0x33, 0xf4, 0x9f, 0xb2,
- 0x2c, 0xba, 0xe1, 0xa9, 0x4f, 0x97, 0xc6, 0xd6, 0x7f, 0x3d, 0x92, 0x97, 0x3e, 0x37, 0xc0, 0x12,
- 0x20, 0xaf, 0x6f, 0xbf, 0x90, 0x8d, 0x77, 0x4c, 0xf3, 0xd3, 0x4b, 0xbb, 0xbd, 0xc2, 0x90, 0x7f,
- 0x79, 0xef, 0x4a, 0xef, 0x6a, 0x27, 0xa3, 0x21, 0xb3, 0x1c, 0x55, 0xfa, 0x00, 0x64, 0x96, 0x23,
- 0xa6, 0x86, 0x92, 0x64, 0xd3, 0x87, 0xee, 0xf9, 0x1b, 0x0e, 0xbc, 0xf0, 0x0a, 0xc3, 0x83, 0x73,
- 0x44, 0xf3, 0x7b, 0xc0, 0xd4, 0x11, 0xdb, 0x48, 0x47, 0x80, 0x48, 0x08, 0xd2, 0x21, 0x6c, 0x4b,
- 0xe0, 0xce, 0xbf, 0xc3, 0xb6, 0xf0, 0x26, 0x15, 0xde, 0x86, 0xe9, 0x77, 0x8d, 0xf6, 0x50, 0x0a,
- 0xd6, 0x5c, 0x08, 0x19, 0x8d, 0x52, 0x90, 0xf5, 0x39, 0x63, 0xf5, 0x68, 0xfd, 0x36, 0x80, 0x2d,
- 0x77, 0xcf, 0x2c, 0x05, 0xb2, 0xe1, 0xa6, 0x27, 0x01, 0xd8, 0xf0, 0xab, 0xbd, 0xc3, 0x85, 0x41,
- 0xbd, 0x23, 0xdb, 0xe3, 0x23, 0x78, 0xd0, 0xbd, 0x11, 0xba, 0xb7, 0x82, 0xa9, 0x82, 0x6d, 0xa0,
- 0x1c, 0x61, 0xdf, 0x53, 0xcf, 0x72, 0xf4, 0x8d, 0xfd, 0xfc, 0xca, 0x15, 0x9a, 0x2b, 0x3e, 0xbd,
- 0x8e, 0xe5, 0xab, 0x4a, 0x40, 0x08, 0x92, 0x0e, 0xdb, 0x00, 0xd3, 0xe8, 0x10, 0xbe, 0x53, 0xc0,
- 0xf6, 0x48, 0x34, 0x76, 0xc2, 0x77, 0xa6, 0x91, 0x1e, 0x40, 0x73, 0xad, 0x44, 0xa3, 0x2a, 0x9b,
- 0x85, 0xe5, 0xa7, 0x03, 0x06, 0xc7, 0x81, 0x62, 0xb7, 0x5c, 0xb0, 0xf7, 0x0b, 0xdd, 0xbf, 0xdf,
- 0xcc, 0x75, 0x00, 0xfa, 0xf5, 0x3b, 0xce, 0x4f, 0xf2, 0xc6, 0xb5, 0x3d, 0x59, 0x1b, 0x36, 0x3e,
- 0xdd, 0x37, 0x9a, 0x2d, 0x89, 0x08, 0xe4, 0x4e, 0x41, 0xf5, 0x5d, 0x90, 0x2e, 0xdc, 0x40, 0xd9,
- 0x10, 0x1c, 0xc3, 0x6b, 0x8f, 0xbf, 0xc4, 0x59, 0x1b, 0xa6, 0xd9, 0xf4, 0xc1, 0x8b, 0x29, 0x9d,
- 0xf7, 0x07, 0x78, 0x3d, 0x2b, 0x52, 0x61, 0x52, 0x00, 0x9d, 0x26, 0x74, 0x52, 0xd3, 0x09, 0x96,
- 0x9e, 0xbe, 0x09, 0xda, 0xda, 0x6b, 0x3d, 0x1b, 0x09, 0x00, 0x09, 0x50, 0x12, 0x02, 0x21, 0xaa,
- 0x74, 0x2a, 0xe8, 0xc4, 0x25, 0x5c, 0x87, 0xfe, 0xc1, 0x7e, 0x73, 0xcd, 0x7d, 0x57, 0xad, 0x1c,
- 0x68, 0x26, 0x6c, 0x77, 0xc3, 0xcd, 0x4f, 0x03, 0xd0, 0xbf, 0xba, 0xbb, 0x94, 0xef, 0x33, 0x9f,
- 0xd7, 0x9e, 0x83, 0xe0, 0x43, 0x7e, 0x2d, 0xf8, 0xa7, 0xa0, 0x4c, 0x2d, 0x71, 0x44, 0x25, 0x44,
- 0x0b, 0x55, 0xa4, 0x72, 0x80, 0xb5, 0xdb, 0xce, 0x64, 0x60, 0xe3, 0xaf, 0x22, 0xda, 0x4f, 0x4f,
- 0x51, 0x3a, 0x9c, 0xd9, 0xb4, 0x9d, 0xb7, 0x95, 0x3f, 0x52, 0x87, 0xb6, 0x16, 0x6b, 0x63, 0xac,
- 0x89, 0x40, 0x2c, 0x5a, 0x83, 0xd6, 0xd2, 0xfe, 0x3f, 0x3a, 0x02, 0x45, 0xcb, 0xf1, 0xd3, 0x40,
- 0xe1, 0x79, 0xe0, 0x29, 0x08, 0xc0, 0xd1, 0xe0, 0xfb, 0x9c, 0x35, 0xb6, 0x6e, 0xe6, 0x93, 0xc0,
- 0x0e, 0x00, 0x07, 0x60, 0xe7, 0xb5, 0x3d, 0xae, 0x93, 0x91, 0x4f, 0x2d, 0xdb, 0x50, 0xb8, 0x14,
- 0xad, 0xc1, 0x2f, 0xa1, 0x4a, 0xef, 0x47, 0x39, 0x99, 0xc4, 0x61, 0x89, 0xd1, 0x8e, 0xe5, 0xf0,
- 0xee, 0x37, 0xc9, 0x98, 0x43, 0xac, 0x7e, 0xcf, 0x2f, 0x93, 0xe9, 0x1e, 0x02, 0x13, 0x82, 0x8d,
- 0x41, 0xa2, 0x64, 0x10, 0x81, 0x8d, 0x11, 0x1b, 0xa7, 0xd9, 0xbe, 0x63, 0xd8, 0x88, 0xe9, 0xa3,
- 0xd3, 0x3c, 0xf3, 0xc0, 0x8b, 0x3c, 0x75, 0xff, 0xf3, 0xbc, 0xf1, 0xcc, 0x1e, 0x2a, 0xb3, 0x0b,
- 0x14, 0xba, 0x1c, 0x72, 0x79, 0x85, 0x52, 0x06, 0x4d, 0x8c, 0x22, 0x42, 0x49, 0x9c, 0xac, 0x23,
- 0x21, 0xd8, 0x28, 0xd9, 0xa7, 0x32, 0x0e, 0x8b, 0x53, 0x60, 0x54, 0x33, 0x7d, 0xf9, 0x5a, 0x8b,
- 0xda, 0xdc, 0x7d, 0xf6, 0x7d, 0xf7, 0xbe, 0x7e, 0x2c, 0x74, 0x13, 0x6d, 0x14, 0x7c, 0xbf, 0xcb,
- 0xfe, 0x8e, 0xce, 0x38, 0x88, 0x38, 0x90, 0x29, 0x81, 0xbf, 0x0c, 0x69, 0x6a, 0x43, 0x2c, 0x28,
- 0x85, 0x69, 0xcc, 0xb3, 0x62, 0xec, 0x42, 0xba, 0x4b, 0x43, 0xd8, 0xb8, 0xb6, 0x24, 0xd9, 0xc9,
- 0x92, 0x70, 0x6a, 0x96, 0x84, 0x54, 0xad, 0x85, 0xb9, 0xa9, 0x05, 0xfe, 0xf5, 0xff, 0x3e, 0xcc,
- 0xe4, 0xbe, 0x37, 0x39, 0x73, 0x4b, 0x0f, 0x5d, 0x3d, 0x1e, 0x8d, 0xd9, 0x79, 0x9e, 0xbb, 0x7f,
- 0x1f, 0xe7, 0x7e, 0x64, 0x1b, 0x83, 0x23, 0x7d, 0x2c, 0xcc, 0x87, 0xcc, 0x97, 0x03, 0x72, 0xbe,
- 0xd0, 0xdf, 0x2d, 0x29, 0xa0, 0x06, 0x34, 0x8e, 0x23, 0x0b, 0x87, 0x50, 0x19, 0x07, 0x22, 0x01,
- 0x23, 0xb8, 0x2e, 0xf8, 0x19, 0xb5, 0x7e, 0xcb, 0xda, 0xbd, 0x97, 0x02, 0xf7, 0xba, 0xcf, 0x7d,
- 0x66, 0x98, 0xfa, 0x3c, 0xeb, 0xfa, 0x46, 0xdc, 0xd3, 0x11, 0x05, 0x4e, 0x1e, 0x95, 0x5b, 0x09,
- 0xa6, 0x9e, 0x2c, 0x92, 0x0a, 0x6a, 0x03, 0xcb, 0xea, 0x4d, 0xab, 0x00, 0xc1, 0x5a, 0x83, 0xc2,
- 0x24, 0x7e, 0x83, 0xc5, 0x88, 0x4e, 0xcc, 0x40, 0xe2, 0x0e, 0xda, 0x61, 0x5b, 0x79, 0x43, 0x8c,
- 0xc5, 0xcf, 0x84, 0xbc, 0xef, 0x23, 0x25, 0x06, 0x4a, 0x7d, 0xf8, 0xc5, 0x65, 0x90, 0x29, 0x24,
- 0x59, 0x4c, 0x37, 0xa8, 0x4e, 0x2f, 0xf2, 0xf0, 0xcf, 0x8e, 0xf1, 0xd0, 0xb3, 0x65, 0x76, 0xef,
- 0x5b, 0xe4, 0x03, 0x5b, 0x35, 0x9f, 0xba, 0x3c, 0x87, 0x23, 0xb5, 0x54, 0x0e, 0x9b, 0xd8, 0x8e,
- 0x23, 0xe0, 0x28, 0x50, 0x92, 0x90, 0x00, 0xcd, 0x48, 0x5f, 0x2f, 0x17, 0x00, 0xf7, 0xba, 0x5d,
- 0xa5, 0x50, 0x3b, 0x9e, 0xfe, 0xb5, 0x7c, 0xa9, 0x88, 0xa0, 0x40, 0xfb, 0xe0, 0x2f, 0x03, 0x53,
- 0x4b, 0xcd, 0x66, 0xa9, 0x50, 0x00, 0x3a, 0x98, 0x62, 0x71, 0x62, 0x9c, 0xc9, 0x63, 0x53, 0x64,
- 0x33, 0x2e, 0x2b, 0x46, 0x06, 0x90, 0xae, 0x21, 0xac, 0x93, 0x49, 0xe7, 0x37, 0x35, 0x12, 0x03,
- 0x31, 0xd8, 0x90, 0x7c, 0x3e, 0xa4, 0x70, 0xc6, 0xa9, 0x88, 0x69, 0x60, 0xa2, 0x2a, 0x54, 0x66,
- 0x70, 0x1c, 0xc3, 0xf4, 0x74, 0x9d, 0xef, 0xde, 0x37, 0xc5, 0x4f, 0x9e, 0xb1, 0x6c, 0x5c, 0x57,
- 0xe4, 0xca, 0x8b, 0x84, 0x4d, 0x2b, 0x0d, 0xd1, 0x62, 0x15, 0xa7, 0x4b, 0x81, 0xf2, 0x40, 0x27,
- 0x72, 0x88, 0x23, 0x28, 0x27, 0x2d, 0x71, 0x0c, 0xb8, 0x8e, 0xe0, 0x67, 0xec, 0xfa, 0x7f, 0xf8,
- 0xf5, 0x95, 0xfd, 0x6e, 0x71, 0x59, 0x84, 0x72, 0xf3, 0x97, 0xb4, 0xa8, 0xb5, 0xe3, 0x83, 0x53,
- 0x48, 0x9d, 0xd8, 0x74, 0x38, 0xad, 0xa0, 0x94, 0xa0, 0x17, 0x0f, 0xf2, 0xc4, 0x03, 0x0f, 0xf3,
- 0x8f, 0x3f, 0x3b, 0xc2, 0xa4, 0x9c, 0x42, 0x57, 0x06, 0xce, 0xec, 0x1e, 0xe7, 0xaa, 0xcb, 0x37,
- 0xd0, 0xbf, 0xe1, 0x5c, 0x6c, 0x26, 0x07, 0x12, 0x27, 0x66, 0x21, 0x21, 0x22, 0x21, 0x22, 0x8d,
- 0xc4, 0xf4, 0x62, 0x83, 0x12, 0x83, 0x02, 0x94, 0xeb, 0x51, 0xad, 0x5a, 0xbe, 0xf5, 0xf7, 0x65,
- 0x0e, 0xcd, 0xaf, 0xe1, 0x1b, 0xb7, 0x6d, 0x61, 0x53, 0xdf, 0x01, 0xe2, 0x50, 0x13, 0xeb, 0x6e,
- 0xa2, 0xb9, 0x37, 0x80, 0xe3, 0x49, 0x1e, 0x91, 0x94, 0xfa, 0x6b, 0x95, 0x24, 0x0c, 0xa5, 0x40,
- 0x04, 0xc7, 0x01, 0xd7, 0x91, 0x15, 0x6b, 0x86, 0x67, 0xce, 0x70, 0x73, 0xa7, 0x9e, 0xa7, 0x4d,
- 0xf9, 0xd5, 0x73, 0x40, 0x27, 0x84, 0xcd, 0xc9, 0x27, 0x9a, 0x30, 0x01, 0x82, 0x49, 0xf9, 0x8f,
- 0x05, 0xa5, 0xd1, 0xf5, 0xc3, 0xfc, 0xe3, 0xf7, 0x7f, 0xc8, 0x9f, 0x3c, 0xd6, 0x83, 0xb7, 0xf5,
- 0xcb, 0xac, 0x1e, 0x7b, 0x0f, 0x91, 0x11, 0x1e, 0xdc, 0xf3, 0x1c, 0x6f, 0xfd, 0xcd, 0xb7, 0xf8,
- 0xd2, 0x55, 0x4f, 0xd2, 0xb5, 0xe9, 0xa2, 0x94, 0xb6, 0x47, 0x69, 0x24, 0x22, 0x39, 0xd5, 0x44,
- 0x7c, 0x04, 0x41, 0xa1, 0x51, 0x1e, 0xfc, 0xdd, 0x3f, 0xcf, 0x12, 0x66, 0xcf, 0x66, 0xfb, 0x6d,
- 0x57, 0xd2, 0xb7, 0xf8, 0x02, 0x8b, 0x0b, 0x45, 0x0a, 0xcb, 0x47, 0xc8, 0xd6, 0xde, 0xc6, 0xb7,
- 0x71, 0x12, 0xb4, 0x44, 0xb5, 0xfe, 0x17, 0x9d, 0x9a, 0x97, 0x6e, 0x93, 0x2b, 0xa5, 0xd5, 0xf2,
- 0xde, 0x5e, 0xbd, 0xca, 0x9d, 0x7c, 0x65, 0x7c, 0xf8, 0x94, 0xf5, 0x3a, 0x9f, 0x14, 0x3d, 0x1a,
- 0xb4, 0x9f, 0x94, 0xa5, 0x36, 0x5c, 0xc2, 0x4a, 0x1d, 0x15, 0xf0, 0xec, 0xbf, 0x3e, 0xc3, 0x77,
- 0x9f, 0x1d, 0xe0, 0xcc, 0xdf, 0xbc, 0x9d, 0xf7, 0xff, 0xda, 0xc7, 0xc9, 0xf9, 0xc9, 0xb7, 0xb5,
- 0xf0, 0xc3, 0x3c, 0xfe, 0xc0, 0x39, 0x7c, 0xe3, 0xfe, 0x4f, 0xf2, 0xc5, 0x55, 0x47, 0xb1, 0xc5,
- 0x15, 0x2d, 0x66, 0xac, 0x50, 0x88, 0x48, 0x5a, 0x2d, 0x5a, 0x40, 0xa3, 0x5d, 0x87, 0x57, 0x5e,
- 0x9d, 0x67, 0x31, 0x1a, 0xe4, 0xb7, 0x7f, 0xf3, 0x7d, 0x0c, 0x66, 0xea, 0x94, 0xe7, 0x0f, 0x53,
- 0x28, 0xe6, 0x61, 0xef, 0x3f, 0x63, 0xe7, 0xf6, 0x42, 0xb7, 0x86, 0xbe, 0xde, 0xb4, 0x10, 0x63,
- 0xe9, 0xd0, 0x4b, 0x88, 0xef, 0x40, 0xc6, 0x63, 0xb9, 0x8e, 0xca, 0xf3, 0x6b, 0xfd, 0x6e, 0xb7,
- 0xb5, 0x2d, 0xa2, 0x96, 0x64, 0x60, 0x6c, 0x80, 0x22, 0x22, 0x9e, 0x3a, 0xc4, 0xf7, 0x1f, 0x9a,
- 0x61, 0xe5, 0xa5, 0x9f, 0xe3, 0xe3, 0x9f, 0xf8, 0x38, 0xa7, 0x75, 0xc1, 0x4a, 0x0f, 0x46, 0x5d,
- 0x58, 0xdb, 0x0d, 0x57, 0xfc, 0xc6, 0x65, 0x54, 0x2f, 0xde, 0xce, 0xae, 0xa7, 0x5f, 0x45, 0x3b,
- 0x5e, 0xa2, 0x5d, 0x9c, 0x04, 0x8a, 0xd2, 0x9c, 0x28, 0xcd, 0xc1, 0x63, 0x96, 0xcd, 0x1b, 0x86,
- 0x38, 0xed, 0xd4, 0x90, 0xf2, 0xde, 0x07, 0xf1, 0x33, 0x35, 0xd4, 0x5b, 0x8f, 0x63, 0x8f, 0xec,
- 0x85, 0x48, 0x43, 0xa1, 0xa7, 0x5d, 0x49, 0xb6, 0x34, 0xd2, 0x04, 0xd5, 0xe6, 0xba, 0x4a, 0xe1,
- 0x3a, 0x8e, 0xed, 0x75, 0x91, 0x60, 0xb9, 0x9b, 0xcd, 0x75, 0x14, 0x73, 0x61, 0x9b, 0x5a, 0xd0,
- 0x0c, 0x9f, 0xf0, 0xe8, 0xd3, 0xfb, 0x31, 0xcb, 0xdf, 0xcb, 0x07, 0x2e, 0xfb, 0x28, 0x6b, 0x7a,
- 0xa0, 0xa8, 0xc0, 0xd3, 0x90, 0x77, 0xe0, 0xde, 0x07, 0xc7, 0x79, 0xee, 0x65, 0x4d, 0x39, 0x7a,
- 0x2f, 0x7f, 0xff, 0x7a, 0x89, 0xcd, 0x1f, 0xaa, 0x83, 0xca, 0xa4, 0x94, 0x5c, 0x2d, 0x31, 0x0f,
- 0xc7, 0xd1, 0x1c, 0x3c, 0x5c, 0x61, 0x59, 0xaf, 0xe2, 0x8c, 0xd5, 0x75, 0xe2, 0xe3, 0xbb, 0x50,
- 0xf6, 0x18, 0xba, 0x72, 0x14, 0xe2, 0xe3, 0xe8, 0x5e, 0x17, 0xfa, 0xbb, 0xc1, 0xd7, 0x69, 0x80,
- 0x69, 0x96, 0xc8, 0x27, 0xf0, 0xf5, 0xe6, 0x53, 0x04, 0xa5, 0x9c, 0x6e, 0xd7, 0x71, 0x29, 0x2a,
- 0xad, 0x12, 0x1c, 0x22, 0x49, 0xb4, 0x6a, 0x51, 0x03, 0x0b, 0xca, 0x42, 0x5c, 0x63, 0xe7, 0xbe,
- 0x32, 0x83, 0xeb, 0x2f, 0x61, 0xeb, 0xfa, 0x15, 0x94, 0xdc, 0x64, 0x1f, 0x0d, 0xfc, 0xd5, 0xdf,
- 0x1e, 0xe0, 0xc1, 0xfd, 0xfd, 0xbc, 0xbd, 0xff, 0x11, 0xf2, 0xf9, 0x5e, 0xe6, 0xb8, 0x1a, 0x6a,
- 0x8f, 0x40, 0xd7, 0x8a, 0x14, 0xc0, 0xd2, 0xea, 0x47, 0x04, 0xb2, 0xae, 0x61, 0xb4, 0x77, 0x81,
- 0xa2, 0xaa, 0x53, 0x3e, 0x78, 0x98, 0x4c, 0x21, 0xc6, 0xf1, 0x23, 0x18, 0xea, 0x05, 0xd7, 0x87,
- 0xdc, 0x08, 0x2a, 0xbf, 0x0a, 0x2a, 0x7b, 0x90, 0xda, 0xc1, 0xd4, 0xe7, 0x4e, 0x5e, 0x49, 0x2b,
- 0x25, 0xe0, 0x78, 0x59, 0xad, 0xb2, 0x5e, 0xbe, 0xb3, 0x44, 0x45, 0xea, 0x28, 0x5b, 0x69, 0x73,
- 0x2c, 0x13, 0x40, 0x65, 0x96, 0xd8, 0x1f, 0xa6, 0x67, 0xf9, 0x5a, 0xfa, 0x7c, 0xc8, 0xa4, 0x7e,
- 0x77, 0x64, 0x7c, 0x91, 0xe9, 0x28, 0xc7, 0x1f, 0x7d, 0xb6, 0x97, 0xb3, 0x7a, 0x9e, 0xe0, 0xa1,
- 0x3f, 0xbb, 0x9c, 0x89, 0x60, 0x82, 0xf2, 0x54, 0x39, 0xd5, 0xbe, 0x24, 0x92, 0x77, 0x6c, 0x6c,
- 0xad, 0xa5, 0x34, 0x90, 0xa7, 0xb4, 0x62, 0x05, 0xe2, 0x17, 0xc9, 0x14, 0x5d, 0x9c, 0x5c, 0x16,
- 0xb2, 0x03, 0x90, 0x2d, 0xa2, 0xfc, 0x6e, 0xb4, 0x6b, 0x51, 0x32, 0x0f, 0x85, 0xd1, 0xa5, 0x55,
- 0xa8, 0x9c, 0xa4, 0xbe, 0x15, 0x50, 0x26, 0xa8, 0x6b, 0xa9, 0xd5, 0x17, 0x97, 0xcc, 0x30, 0x21,
- 0x04, 0x53, 0x60, 0x42, 0xc4, 0x34, 0x40, 0x42, 0x2a, 0x73, 0x65, 0xdc, 0xc2, 0x20, 0x7d, 0xa5,
- 0xa1, 0x56, 0xf4, 0x03, 0x78, 0xf8, 0xf1, 0x69, 0x3e, 0xf8, 0x4b, 0x03, 0x0c, 0x74, 0xc1, 0x15,
- 0x1f, 0xfb, 0x28, 0x71, 0x58, 0xe5, 0xe0, 0xce, 0x7f, 0x61, 0x7e, 0xa1, 0xd1, 0x2e, 0x6b, 0x91,
- 0x8e, 0x67, 0xb2, 0x4f, 0xc2, 0xb1, 0x34, 0xa2, 0x32, 0x64, 0x8a, 0x79, 0x9c, 0x4c, 0x06, 0x14,
- 0x58, 0xa3, 0x98, 0xde, 0x3b, 0xc3, 0x9b, 0x0f, 0xed, 0xe6, 0xc8, 0xa3, 0x4f, 0x20, 0x33, 0x2f,
- 0xbe, 0xb3, 0x1a, 0x97, 0x25, 0x4b, 0x21, 0x4a, 0x63, 0x85, 0xba, 0x6b, 0x6c, 0xa6, 0x62, 0x8d,
- 0x45, 0xb9, 0xa9, 0xfa, 0x24, 0x46, 0xa2, 0x69, 0x5a, 0x31, 0x4e, 0x2c, 0x36, 0xac, 0xe0, 0xe7,
- 0x4e, 0xc5, 0xc9, 0x16, 0x08, 0x0c, 0xe4, 0x74, 0xe2, 0x77, 0x95, 0xc8, 0x72, 0x60, 0x41, 0x71,
- 0x26, 0x70, 0xdf, 0x7d, 0xf7, 0x21, 0x22, 0xe8, 0x8c, 0x8f, 0xb4, 0xba, 0x26, 0x69, 0xb5, 0x27,
- 0x36, 0xd5, 0x4c, 0x93, 0x40, 0x4a, 0x12, 0xc9, 0x9a, 0x12, 0x29, 0x01, 0x2b, 0x68, 0xad, 0x28,
- 0x0e, 0x67, 0x71, 0x7d, 0x8b, 0x76, 0x84, 0xc6, 0xdc, 0x3c, 0xd9, 0x1e, 0x67, 0x29, 0x02, 0x51,
- 0x4b, 0xb4, 0x2c, 0x02, 0x46, 0x54, 0x59, 0xa3, 0x33, 0x6f, 0x47, 0x35, 0xb3, 0x74, 0xb2, 0x69,
- 0x40, 0x78, 0x14, 0xe2, 0x29, 0xc4, 0x2e, 0xd0, 0x95, 0x37, 0xe4, 0x3c, 0x4b, 0xb9, 0x11, 0x33,
- 0x1b, 0x42, 0x35, 0x9d, 0x3e, 0x54, 0xd0, 0x3c, 0xb0, 0xc7, 0x63, 0xeb, 0x65, 0xff, 0x8d, 0x3f,
- 0xf9, 0xe6, 0x9f, 0xa2, 0xbd, 0x2c, 0x6b, 0xce, 0xb9, 0x84, 0xbe, 0x81, 0x7c, 0x42, 0x1c, 0xe9,
- 0xa8, 0xd3, 0x5b, 0xd9, 0xbe, 0x03, 0x80, 0x2c, 0x7d, 0x2a, 0x47, 0x98, 0x3f, 0x52, 0xa5, 0x7b,
- 0xc8, 0xa7, 0xd0, 0xe7, 0xe2, 0x75, 0x79, 0x29, 0xb3, 0x4e, 0x0f, 0xd9, 0xb4, 0xe2, 0x4f, 0xe7,
- 0xcf, 0x7c, 0x1c, 0xe9, 0x29, 0x37, 0x53, 0x1a, 0xde, 0x17, 0x2e, 0x8e, 0xe3, 0x17, 0x7d, 0xa4,
- 0x89, 0x56, 0x35, 0x37, 0x88, 0x11, 0xd1, 0x38, 0x85, 0x2c, 0x03, 0xde, 0x14, 0xe5, 0xfa, 0x34,
- 0x13, 0x01, 0xc4, 0x31, 0x04, 0x59, 0x18, 0xbb, 0x60, 0x88, 0x1f, 0x7f, 0x6b, 0x9c, 0x75, 0x1f,
- 0xb9, 0x0b, 0xaf, 0x6f, 0x03, 0xc5, 0x91, 0xb3, 0xd8, 0x96, 0x7f, 0x91, 0xe2, 0xf0, 0x00, 0x56,
- 0xc2, 0xa5, 0xf5, 0x7a, 0x53, 0x1b, 0x9d, 0x0d, 0x0a, 0xda, 0xc0, 0x94, 0x08, 0xb5, 0xb9, 0x00,
- 0xbf, 0xe0, 0x24, 0xa6, 0xeb, 0x24, 0xb4, 0x6a, 0x09, 0xd8, 0x4e, 0x2b, 0x6d, 0x6b, 0x64, 0xaa,
- 0x5a, 0xb3, 0xe3, 0xfa, 0x8c, 0xb1, 0x17, 0xa6, 0xc3, 0x9a, 0x4c, 0xb4, 0x66, 0x34, 0x4f, 0x2d,
- 0x1d, 0x36, 0x88, 0x88, 0xa2, 0x2c, 0xeb, 0xbb, 0x67, 0x58, 0x19, 0xbf, 0xc4, 0xc2, 0xf4, 0x24,
- 0x93, 0xb3, 0xd3, 0xec, 0x9b, 0x8d, 0xa8, 0x14, 0x0b, 0x6c, 0xdd, 0xa6, 0xc9, 0x1e, 0xb1, 0x6c,
- 0x39, 0xf7, 0x26, 0xfa, 0x2a, 0xa3, 0x7c, 0xb8, 0xf7, 0x27, 0x88, 0xe3, 0x22, 0x4d, 0x9e, 0xd5,
- 0xe4, 0x5e, 0x36, 0x46, 0x59, 0x83, 0xb2, 0x29, 0x53, 0xee, 0x04, 0x63, 0x0d, 0x41, 0x25, 0xa0,
- 0x3a, 0x55, 0xa7, 0x6b, 0x28, 0x93, 0x36, 0x33, 0x3a, 0xb5, 0x65, 0x9b, 0x36, 0x94, 0x6a, 0x44,
- 0x5a, 0x66, 0x25, 0x22, 0xc7, 0x8e, 0x1f, 0x57, 0x6f, 0x39, 0x9f, 0x1c, 0x2b, 0x69, 0x6b, 0x38,
- 0xb7, 0x7b, 0x38, 0x73, 0x16, 0xa2, 0xdb, 0x6d, 0x4d, 0xad, 0x31, 0xa1, 0xa1, 0x3e, 0x5d, 0x27,
- 0x8a, 0x72, 0x0c, 0xac, 0x58, 0xc3, 0x5a, 0xbd, 0x97, 0xc1, 0xa3, 0x0f, 0xe0, 0x4c, 0xbe, 0x40,
- 0x50, 0x99, 0x60, 0xb6, 0x6a, 0xe9, 0x1a, 0x1d, 0x24, 0xbf, 0x26, 0x4b, 0xed, 0xd8, 0xd3, 0x9c,
- 0x2b, 0xb7, 0xf3, 0x89, 0xff, 0xec, 0x63, 0x95, 0xea, 0x28, 0xb2, 0x4c, 0xda, 0x59, 0x31, 0xed,
- 0x96, 0x50, 0xab, 0x49, 0x17, 0x23, 0x51, 0x9d, 0x60, 0xbe, 0x4e, 0x65, 0xaa, 0x46, 0xff, 0x68,
- 0x1e, 0xc7, 0x11, 0xc4, 0x9a, 0x25, 0xcd, 0x3c, 0xac, 0x05, 0x2b, 0xa8, 0x40, 0x20, 0x48, 0xca,
- 0x1e, 0x48, 0x2c, 0xa3, 0x11, 0xe8, 0xc7, 0x36, 0xdc, 0x59, 0xfe, 0xae, 0x5b, 0x9e, 0x10, 0xf1,
- 0xbb, 0xd5, 0x0f, 0xa3, 0x5a, 0x7c, 0xa5, 0x9b, 0xd5, 0x09, 0x95, 0x68, 0xd6, 0x12, 0x56, 0xf0,
- 0xf3, 0x21, 0xbe, 0x3f, 0x89, 0xcc, 0x1e, 0x46, 0x2a, 0x01, 0x03, 0x51, 0xcc, 0xa0, 0xa7, 0x31,
- 0x95, 0x7b, 0x98, 0x9e, 0x18, 0xe1, 0x70, 0xe9, 0x6a, 0x82, 0xc6, 0x0a, 0x4e, 0x73, 0x7f, 0xc4,
- 0x2f, 0xff, 0xa7, 0x59, 0xac, 0xdb, 0x9f, 0x16, 0x53, 0xd2, 0xd1, 0x98, 0x6b, 0x6a, 0xa1, 0xdd,
- 0xd7, 0x52, 0xa6, 0x46, 0xb4, 0x38, 0x4f, 0xa3, 0x96, 0x25, 0x0a, 0x72, 0xf4, 0xae, 0xf0, 0x71,
- 0xdc, 0x08, 0x31, 0x1d, 0x16, 0xd1, 0xaa, 0x6f, 0x04, 0x8c, 0x4d, 0x8a, 0x2a, 0x63, 0x9b, 0x14,
- 0x1e, 0x63, 0x55, 0x50, 0x6b, 0xb0, 0x1b, 0x94, 0xb8, 0x47, 0x5e, 0x1d, 0x90, 0xd3, 0x2e, 0xaa,
- 0x3e, 0x54, 0x9d, 0x0a, 0x83, 0xde, 0x51, 0xd7, 0x4f, 0x9c, 0x53, 0x81, 0xb5, 0x38, 0x9e, 0xc5,
- 0x09, 0xe7, 0xb1, 0x13, 0x0b, 0xb0, 0x00, 0x36, 0x48, 0x42, 0xa1, 0xf8, 0x02, 0x7d, 0x9a, 0xc1,
- 0xae, 0xc3, 0x2c, 0x2b, 0x3d, 0xc7, 0xba, 0x89, 0x47, 0x29, 0x8c, 0x81, 0xf5, 0x73, 0x48, 0x1c,
- 0xa0, 0xb4, 0x4a, 0xc9, 0x66, 0x02, 0x46, 0x68, 0x97, 0xb3, 0xca, 0x54, 0x30, 0x95, 0x59, 0x1a,
- 0x0b, 0x31, 0xb1, 0x1e, 0x41, 0xe7, 0x87, 0x28, 0x16, 0xe7, 0x70, 0x64, 0x3e, 0x05, 0x61, 0xdb,
- 0x1e, 0x9d, 0x96, 0xc7, 0x88, 0x45, 0xc5, 0xa9, 0x26, 0x4c, 0x3b, 0xb1, 0x5a, 0x2b, 0xfb, 0x67,
- 0x66, 0xbd, 0x47, 0x01, 0xdc, 0x8f, 0xfc, 0x78, 0x2f, 0x07, 0x3f, 0x50, 0x9c, 0xae, 0x4e, 0x67,
- 0x7e, 0xd0, 0xb3, 0xc2, 0x5c, 0x93, 0x78, 0x5a, 0x47, 0x93, 0xd9, 0x2b, 0x40, 0xc1, 0x49, 0xa8,
- 0x79, 0x2c, 0x28, 0xcf, 0x85, 0x42, 0x06, 0x0a, 0x3e, 0xd2, 0xb5, 0x06, 0x72, 0xc3, 0x28, 0x7f,
- 0x9a, 0x6a, 0xbd, 0x8c, 0xaa, 0x96, 0xc9, 0x14, 0x32, 0x78, 0x05, 0xbf, 0x1d, 0x5a, 0x34, 0x28,
- 0x53, 0x87, 0x70, 0x81, 0xb8, 0x3c, 0x4f, 0x6d, 0xc1, 0x26, 0xaf, 0x20, 0x8a, 0xa3, 0x64, 0xf3,
- 0x19, 0xdc, 0xe8, 0x28, 0x04, 0x8b, 0xe0, 0x06, 0xed, 0x28, 0xd7, 0xa1, 0xcd, 0x96, 0x6f, 0x44,
- 0x0a, 0x62, 0x69, 0x2d, 0x1b, 0xc7, 0xd0, 0x68, 0xa8, 0xdd, 0x63, 0x77, 0xcf, 0x3d, 0x05, 0x0a,
- 0x17, 0xe0, 0xc0, 0x53, 0x9e, 0x19, 0xdd, 0xa6, 0xbe, 0x59, 0x9d, 0x0e, 0xaf, 0x29, 0x0c, 0xa6,
- 0xdc, 0x48, 0x00, 0xe5, 0x42, 0xa6, 0x0b, 0xbc, 0x2e, 0x28, 0x0a, 0x0a, 0x05, 0xda, 0x05, 0x2f,
- 0x03, 0x8e, 0x87, 0xf2, 0x8b, 0x94, 0x0f, 0xee, 0xa7, 0x36, 0x35, 0x89, 0x58, 0x8b, 0x97, 0xf7,
- 0x71, 0x32, 0xe0, 0xc6, 0x0a, 0x31, 0x01, 0x71, 0xb5, 0x4a, 0xb0, 0xb0, 0x88, 0x09, 0x2c, 0xb8,
- 0x3d, 0x38, 0xb9, 0x33, 0xf0, 0x96, 0xf5, 0xa3, 0x5c, 0x0f, 0x4f, 0x37, 0x50, 0x8d, 0x23, 0x48,
- 0x5c, 0x41, 0x7b, 0x89, 0xe1, 0x4b, 0xb3, 0x9f, 0x2c, 0x69, 0xe3, 0xa1, 0xa9, 0x8d, 0x28, 0xe9,
- 0x38, 0x11, 0xb7, 0xc3, 0x95, 0xb1, 0xea, 0xf8, 0xf4, 0x9c, 0x73, 0x3f, 0x28, 0x9e, 0xff, 0x5d,
- 0x70, 0xdf, 0xf8, 0x0c, 0xac, 0xff, 0xe6, 0x8c, 0xec, 0x1d, 0x5b, 0xb6, 0xbb, 0x7c, 0x34, 0xbe,
- 0xaf, 0x50, 0x72, 0x3f, 0x96, 0xe8, 0x2e, 0x0d, 0x73, 0xda, 0x49, 0x98, 0xac, 0xe7, 0x26, 0x86,
- 0xa9, 0x9c, 0x94, 0x6b, 0x18, 0xd4, 0xe2, 0xeb, 0xd4, 0x26, 0x6b, 0xf4, 0xac, 0x1c, 0x48, 0x6a,
- 0x0d, 0x2b, 0x44, 0x95, 0x06, 0xc1, 0x6c, 0x05, 0xc1, 0x26, 0x85, 0x4f, 0xbe, 0x17, 0xaf, 0xcb,
- 0x07, 0xeb, 0xa2, 0x1c, 0xc1, 0x55, 0x0b, 0x10, 0xd4, 0x92, 0x5e, 0x99, 0x13, 0xa1, 0x33, 0x51,
- 0x1a, 0xe6, 0x53, 0x1f, 0xb2, 0xcd, 0xca, 0x32, 0x15, 0x20, 0x16, 0x08, 0x15, 0x84, 0xd2, 0x2a,
- 0x6f, 0x8c, 0x81, 0x6a, 0x4d, 0x5e, 0xdc, 0x7e, 0xcf, 0x39, 0x7f, 0x0b, 0x0f, 0x53, 0x7a, 0xdf,
- 0xef, 0xa1, 0xe3, 0xd2, 0x46, 0x00, 0xfe, 0xfa, 0x8b, 0x23, 0x55, 0x13, 0x39, 0x77, 0x94, 0xc7,
- 0x43, 0x51, 0xca, 0x24, 0x91, 0x43, 0x4c, 0x5a, 0x8b, 0x27, 0xe1, 0x33, 0x29, 0xb8, 0xa2, 0xf4,
- 0xf7, 0x08, 0xab, 0x5c, 0x7a, 0x57, 0x14, 0xc9, 0xe4, 0x34, 0x99, 0xbc, 0xc6, 0x2f, 0x38, 0xe4,
- 0x7a, 0x5d, 0xf2, 0x25, 0x9f, 0xc2, 0x60, 0x8e, 0x7c, 0x29, 0x87, 0x5f, 0xf0, 0xf0, 0x5c, 0xc1,
- 0xf3, 0x02, 0x5c, 0x35, 0x8f, 0x8a, 0x27, 0x51, 0x7a, 0x1e, 0x9d, 0x09, 0x50, 0x6e, 0xd8, 0x06,
- 0x61, 0x6d, 0x1b, 0x44, 0xd3, 0x37, 0x8c, 0x41, 0x85, 0xef, 0xd4, 0x46, 0x1c, 0xcb, 0xc4, 0xe4,
- 0x94, 0xfb, 0xad, 0xef, 0x1d, 0x7f, 0x38, 0xde, 0xf7, 0xfb, 0xb0, 0xea, 0xb7, 0xbe, 0x83, 0xde,
- 0x78, 0xcb, 0x6e, 0x0e, 0xff, 0x0f, 0xf8, 0x32, 0xcf, 0x33, 0x7b, 0x48, 0x76, 0x57, 0xa7, 0xed,
- 0x2d, 0x61, 0x25, 0x4a, 0x5e, 0x0b, 0x48, 0xda, 0x50, 0xb0, 0x71, 0xaa, 0x6a, 0xb3, 0xa4, 0xbd,
- 0x03, 0xe0, 0xe5, 0x55, 0x0b, 0x18, 0x12, 0xe1, 0xb8, 0x09, 0x81, 0x75, 0x3d, 0xd0, 0xda, 0xa2,
- 0x74, 0x84, 0xce, 0x04, 0xe9, 0x08, 0x51, 0x5e, 0x84, 0x72, 0x62, 0x50, 0x69, 0xeb, 0xa8, 0xf3,
- 0xb0, 0x3a, 0x41, 0xd8, 0x14, 0x44, 0xa0, 0x20, 0xb0, 0x2d, 0xdf, 0x30, 0x86, 0x78, 0x66, 0xce,
- 0xfd, 0xf1, 0xa6, 0x1d, 0xe5, 0x1f, 0x01, 0x34, 0x4a, 0x1b, 0xda, 0x2d, 0xd3, 0x85, 0xb5, 0xbf,
- 0x04, 0xc0, 0xd6, 0x3f, 0x3e, 0x5e, 0xaf, 0xcd, 0x98, 0x3f, 0x9f, 0x3f, 0x12, 0x3f, 0x91, 0x24,
- 0xb3, 0xb8, 0x0d, 0xa6, 0xd9, 0xbb, 0x6a, 0x6a, 0x47, 0xe2, 0x0e, 0x60, 0x51, 0x5b, 0x63, 0x36,
- 0x4c, 0xb5, 0x16, 0xb6, 0xe7, 0x49, 0x94, 0x24, 0x47, 0x96, 0x1e, 0x8c, 0xb4, 0xd6, 0x32, 0x4b,
- 0x5a, 0x4b, 0x88, 0x4d, 0x4c, 0xa9, 0xa1, 0x20, 0x68, 0x9b, 0x94, 0xb5, 0x50, 0x5e, 0xe4, 0xb5,
- 0xd7, 0x0f, 0x9e, 0x72, 0x2d, 0xc0, 0xae, 0xdf, 0x83, 0x4d, 0xb7, 0xbe, 0xde, 0x06, 0xb2, 0xf1,
- 0xc6, 0x47, 0xd9, 0x7d, 0x73, 0xd2, 0x43, 0x3d, 0xe3, 0x96, 0xb9, 0xb7, 0x83, 0xb2, 0xbd, 0x6e,
- 0xfe, 0xed, 0x70, 0x4e, 0xa9, 0x64, 0x23, 0x31, 0xa6, 0xad, 0x11, 0x1b, 0x2d, 0x05, 0x61, 0x3b,
- 0xcc, 0xae, 0x25, 0x64, 0xe7, 0xf7, 0x71, 0x87, 0x69, 0x46, 0x2d, 0x8d, 0x4a, 0x6b, 0x4e, 0xc7,
- 0xb0, 0x36, 0x99, 0x17, 0x5a, 0x54, 0xa0, 0xa0, 0x21, 0x09, 0xa0, 0x34, 0xad, 0xd4, 0xeb, 0x32,
- 0xf9, 0xd6, 0x78, 0xee, 0x77, 0x2e, 0xfd, 0xb3, 0x3d, 0x0b, 0x00, 0xa5, 0x8f, 0xde, 0xc6, 0x3b,
- 0x5e, 0x2b, 0x6c, 0xbc, 0x63, 0x9a, 0x97, 0x6f, 0x5e, 0x05, 0xc0, 0xaa, 0x6b, 0x7f, 0xfd, 0x99,
- 0xea, 0xb4, 0x7c, 0xaa, 0x32, 0x11, 0xc6, 0x09, 0x1d, 0x6f, 0x6e, 0xfc, 0xef, 0x18, 0x9d, 0xfe,
- 0xf4, 0x8e, 0xef, 0x92, 0x43, 0x69, 0x1f, 0x4c, 0xdc, 0x36, 0xa9, 0xe6, 0x41, 0x45, 0x92, 0x80,
- 0xa8, 0xb7, 0x41, 0x00, 0x04, 0x81, 0xcc, 0x1f, 0x3a, 0x9a, 0xfb, 0x83, 0xf3, 0xbe, 0x31, 0xf3,
- 0xfc, 0xee, 0x1b, 0xfa, 0x00, 0x38, 0xf5, 0xa3, 0x5f, 0x6c, 0x01, 0x71, 0x3a, 0x69, 0xe4, 0x9f,
- 0x3e, 0x3e, 0xcf, 0xce, 0xeb, 0x96, 0xf1, 0x9d, 0x27, 0x1f, 0x61, 0xe0, 0xa7, 0xa5, 0xbd, 0x1b,
- 0x2e, 0x0e, 0xa7, 0x9d, 0x8c, 0xf9, 0x90, 0x97, 0x4d, 0xe7, 0x75, 0x30, 0x57, 0xd5, 0x34, 0x01,
- 0x75, 0x32, 0x32, 0xd8, 0xd9, 0x69, 0x34, 0xed, 0x17, 0x3e, 0x9d, 0x1d, 0x48, 0x89, 0x97, 0x6a,
- 0x42, 0x6c, 0x02, 0xa2, 0xde, 0x01, 0x22, 0x4d, 0x23, 0x41, 0x28, 0x73, 0x87, 0x8e, 0xe4, 0x6e,
- 0xd8, 0xb4, 0x63, 0xf6, 0xaf, 0xf6, 0xfc, 0x61, 0x2f, 0x67, 0x6e, 0x7f, 0xe7, 0x0b, 0x51, 0xe7,
- 0xc4, 0x0f, 0xbe, 0xf3, 0x64, 0x95, 0x97, 0x6f, 0x2c, 0x71, 0xe5, 0x13, 0x13, 0x36, 0xff, 0x4f,
- 0x63, 0x2f, 0x6d, 0xbc, 0x60, 0x7a, 0xde, 0xf5, 0xcc, 0x45, 0x9e, 0x8f, 0x9f, 0x74, 0xc3, 0xe5,
- 0x24, 0x54, 0xdc, 0x2e, 0xb5, 0xef, 0xce, 0x46, 0xf4, 0x12, 0xa6, 0x7b, 0x42, 0xa3, 0xbb, 0x09,
- 0xc0, 0x58, 0x08, 0x40, 0x35, 0x7d, 0x22, 0x90, 0x16, 0xc5, 0x6a, 0x34, 0xd4, 0xd1, 0x83, 0xe3,
- 0xd9, 0xff, 0xb9, 0xf1, 0xae, 0xd9, 0xbf, 0xd8, 0xf7, 0x85, 0x5e, 0xb5, 0xee, 0xf6, 0xf9, 0x77,
- 0xf7, 0x7a, 0x7a, 0xf7, 0x17, 0x96, 0xb3, 0xf1, 0xab, 0xc9, 0xdb, 0xd3, 0xb7, 0xee, 0xec, 0xfd,
- 0xef, 0x7d, 0x23, 0xdc, 0x92, 0xeb, 0x57, 0x2b, 0xb5, 0xab, 0xd3, 0x74, 0xad, 0xda, 0x04, 0xf3,
- 0xc4, 0x06, 0x41, 0x93, 0x72, 0x73, 0x32, 0xc0, 0xd2, 0xe4, 0x17, 0x69, 0x88, 0x15, 0x54, 0x90,
- 0x46, 0xa7, 0x50, 0x92, 0xde, 0xae, 0x4d, 0x32, 0x77, 0xb5, 0xaa, 0x5e, 0x3c, 0x38, 0x9e, 0xfd,
- 0xec, 0x39, 0xff, 0x67, 0xe6, 0xf1, 0xbd, 0x5f, 0xe8, 0x65, 0xdd, 0x57, 0xe7, 0x7f, 0xce, 0x0b,
- 0x03, 0xd7, 0x0f, 0xb0, 0xf9, 0xae, 0xe4, 0xad, 0xd0, 0x6b, 0x5f, 0xec, 0x79, 0xff, 0xe0, 0x69,
- 0x72, 0x73, 0xbe, 0x5f, 0x5d, 0xe2, 0xe5, 0x94, 0xa7, 0x1d, 0xdd, 0x6e, 0x21, 0x35, 0x8b, 0xe7,
- 0x13, 0x8b, 0x69, 0x78, 0x27, 0x1d, 0xb7, 0x92, 0x0e, 0x20, 0x14, 0x54, 0xa8, 0x92, 0x3c, 0x11,
- 0x25, 0x77, 0x55, 0x4c, 0x0c, 0x51, 0xa4, 0xa6, 0xe6, 0xcb, 0x3c, 0xf0, 0xda, 0x81, 0xbe, 0x9b,
- 0x3e, 0x74, 0xcf, 0x91, 0x89, 0xd7, 0x6f, 0xea, 0x63, 0xc3, 0xf6, 0xb9, 0xff, 0xe0, 0x15, 0x8e,
- 0xeb, 0x86, 0xd9, 0x9c, 0x5e, 0xa4, 0x79, 0xe4, 0xaa, 0xfe, 0xe1, 0xb5, 0x17, 0xc6, 0xbf, 0xdb,
- 0x55, 0x52, 0x57, 0x78, 0x79, 0x39, 0x3b, 0x93, 0x07, 0xa5, 0x75, 0xfb, 0xf0, 0x4f, 0xd6, 0xe6,
- 0x68, 0x6a, 0x47, 0x52, 0x00, 0x46, 0x52, 0x02, 0x98, 0x68, 0x40, 0x45, 0x80, 0x11, 0x6c, 0x24,
- 0x04, 0x91, 0x0e, 0xc3, 0x90, 0xc7, 0xa6, 0x67, 0xf5, 0xf7, 0xd6, 0xdd, 0xbe, 0xf8, 0x97, 0xc9,
- 0xfe, 0x83, 0x6c, 0xde, 0x31, 0xf5, 0x8b, 0xb9, 0x54, 0xf3, 0xc6, 0x9d, 0xef, 0x43, 0x55, 0x1e,
- 0xe5, 0x8c, 0x5b, 0x13, 0x69, 0x77, 0xdf, 0xd4, 0x77, 0xce, 0xc0, 0xca, 0xf8, 0x57, 0xb2, 0xdd,
- 0xea, 0x43, 0x8e, 0x6b, 0x2f, 0xf4, 0x0b, 0xe0, 0x64, 0xd4, 0xd2, 0x66, 0x87, 0x95, 0x56, 0xa1,
- 0x89, 0x11, 0xc4, 0x2a, 0x54, 0x2c, 0x10, 0x2b, 0x94, 0x91, 0x94, 0xc9, 0x0a, 0x51, 0x43, 0x08,
- 0x23, 0xbd, 0x18, 0xc7, 0x3c, 0x5a, 0xa9, 0xe9, 0x7f, 0x3a, 0x74, 0x34, 0x7f, 0xef, 0x7b, 0xbf,
- 0x33, 0x79, 0xec, 0xdd, 0x5e, 0xbd, 0x7a, 0x57, 0xd7, 0x9c, 0x76, 0x5d, 0xb7, 0x9c, 0xcd, 0x3b,
- 0xda, 0xb7, 0x0e, 0x5e, 0xbe, 0xbe, 0xef, 0xac, 0x81, 0xd1, 0x68, 0x8b, 0x9b, 0xd1, 0xe7, 0xbb,
- 0xae, 0xdd, 0xe6, 0x38, 0x6c, 0xd0, 0xda, 0x16, 0xbd, 0x0c, 0xb8, 0xae, 0x4a, 0x62, 0xbb, 0x55,
- 0xad, 0xca, 0x4e, 0x62, 0x88, 0x03, 0x21, 0x0a, 0x04, 0x13, 0xeb, 0xb2, 0x31, 0x6a, 0xa7, 0xb1,
- 0x3c, 0xd5, 0x08, 0xd4, 0xb3, 0xe3, 0x13, 0x99, 0x67, 0x2e, 0xf8, 0xf6, 0xcc, 0xf8, 0xc9, 0xee,
- 0xc1, 0xfc, 0xc2, 0x81, 0xb4, 0x6e, 0x47, 0x5c, 0x3b, 0xc4, 0xd8, 0xd7, 0x8f, 0xb7, 0xfe, 0xfe,
- 0xe1, 0x65, 0x23, 0xc5, 0xd3, 0xb7, 0x2c, 0x9c, 0x5a, 0xec, 0xb7, 0x43, 0x4e, 0xd6, 0x5d, 0xae,
- 0x2c, 0x23, 0x62, 0xed, 0x90, 0x42, 0x7a, 0x94, 0x98, 0x0c, 0xa2, 0xb5, 0x18, 0x09, 0xb0, 0x7a,
- 0x11, 0xd4, 0x04, 0xc2, 0xdb, 0x51, 0x64, 0x8e, 0xcd, 0x96, 0x9d, 0x89, 0xe7, 0xf7, 0xac, 0x3c,
- 0xf4, 0xdb, 0xf7, 0xbf, 0x12, 0xb4, 0xd6, 0xfe, 0x7c, 0x3f, 0x63, 0x7f, 0x34, 0xfb, 0xae, 0x65,
- 0xfa, 0x7f, 0x4c, 0xe8, 0x21, 0x04, 0x29, 0xb0, 0x36, 0x16, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45,
- 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82,
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
+ 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x32, 0x08, 0x06, 0x00, 0x00, 0x00, 0x1e, 0x3f, 0x88,
+ 0xb1, 0x00, 0x00, 0x00, 0x06, 0x62, 0x4b, 0x47, 0x44, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xa0,
+ 0xbd, 0xa7, 0x93, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00,
+ 0x00, 0x0b, 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, 0x45,
+ 0x07, 0xe5, 0x05, 0x07, 0x0c, 0x1b, 0x26, 0xad, 0x4b, 0x20, 0x5b, 0x00, 0x00, 0x00, 0x1d, 0x69,
+ 0x54, 0x58, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43,
+ 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x47, 0x49, 0x4d, 0x50,
+ 0x64, 0x2e, 0x65, 0x07, 0x00, 0x00, 0x13, 0x8a, 0x49, 0x44, 0x41, 0x54, 0x68, 0xde, 0xad, 0x9a,
+ 0x69, 0x94, 0x5d, 0xd5, 0x75, 0xe7, 0x7f, 0xe7, 0xdc, 0x7b, 0xdf, 0x7d, 0x43, 0xd5, 0xab, 0xe9,
+ 0x55, 0x49, 0x05, 0xaa, 0xd2, 0x80, 0x10, 0x12, 0x48, 0xa8, 0x24, 0x04, 0x66, 0x72, 0x6c, 0xec,
+ 0xd8, 0xd0, 0x6e, 0x27, 0xc4, 0x6d, 0x4c, 0x08, 0x21, 0xdd, 0xed, 0x24, 0xbd, 0x1c, 0x67, 0x39,
+ 0xcb, 0x6d, 0x33, 0xc7, 0x6e, 0x9b, 0xc6, 0x18, 0x64, 0x90, 0x43, 0xda, 0xb1, 0x1d, 0x7f, 0x31,
+ 0x89, 0x93, 0xb8, 0x33, 0x38, 0x84, 0x15, 0x63, 0xe3, 0x38, 0x84, 0x80, 0x99, 0x67, 0x24, 0x10,
+ 0x83, 0x06, 0x84, 0x84, 0x54, 0x52, 0x95, 0x6a, 0x7e, 0xf5, 0xa6, 0x3b, 0x9c, 0xb3, 0xfb, 0xc3,
+ 0xbd, 0x6f, 0x28, 0xa1, 0xac, 0x0e, 0x8e, 0x6b, 0xad, 0xb3, 0x6e, 0xd5, 0x7b, 0xa7, 0xce, 0xd9,
+ 0xff, 0xb3, 0xa7, 0xff, 0xde, 0xf7, 0x28, 0x7e, 0x8e, 0x9f, 0x97, 0x6f, 0x18, 0xe2, 0xec, 0x3b,
+ 0x8f, 0x03, 0xf0, 0xe0, 0xd5, 0x5b, 0x19, 0x1e, 0xdd, 0xa7, 0x4b, 0xab, 0x95, 0x5a, 0x98, 0xee,
+ 0xe9, 0x6d, 0xcc, 0x95, 0xcf, 0xcb, 0xf5, 0xc8, 0xe6, 0x6c, 0x97, 0x3e, 0x5d, 0x3b, 0x76, 0xd0,
+ 0x51, 0xaa, 0x28, 0x56, 0x10, 0xc3, 0xa2, 0x89, 0xd5, 0x74, 0x58, 0xe3, 0x50, 0xa3, 0xa6, 0x5e,
+ 0x15, 0xed, 0xbf, 0x30, 0x30, 0x5c, 0x38, 0x52, 0x9f, 0x1a, 0x8f, 0xe7, 0xaa, 0x3d, 0xb2, 0xed,
+ 0xee, 0xe3, 0xd2, 0x5e, 0x7f, 0x19, 0x67, 0xdf, 0x39, 0xf9, 0xae, 0x64, 0x52, 0xef, 0x66, 0xf2,
+ 0x4b, 0xd7, 0x0d, 0xb3, 0x65, 0xc7, 0x31, 0x00, 0x7e, 0x70, 0xee, 0x6a, 0xb5, 0xed, 0x13, 0xc7,
+ 0xfd, 0x58, 0x7a, 0x46, 0x95, 0xa9, 0x7c, 0xa2, 0xab, 0xa4, 0xaf, 0xcc, 0xe4, 0xe3, 0xb3, 0xf3,
+ 0xbd, 0x1a, 0x37, 0x23, 0x80, 0x80, 0xa8, 0xe4, 0x69, 0x01, 0x63, 0x51, 0x06, 0xc4, 0x28, 0x6c,
+ 0x03, 0x1a, 0x65, 0xa1, 0x51, 0xd3, 0xc7, 0xeb, 0x55, 0x1e, 0x08, 0x43, 0xef, 0xaf, 0x5d, 0x47,
+ 0xbf, 0x30, 0xb7, 0xa0, 0xcb, 0x5b, 0xef, 0x9e, 0x8a, 0x9a, 0xfb, 0xed, 0xba, 0x6e, 0x19, 0x9b,
+ 0x77, 0x4c, 0xfe, 0xe2, 0x80, 0xec, 0xff, 0xf6, 0xc7, 0x88, 0x8f, 0xfd, 0x88, 0xf5, 0x5f, 0x49,
+ 0xf6, 0x78, 0xe3, 0xcb, 0x5d, 0x5d, 0x5e, 0x2e, 0x7b, 0x6e, 0xb6, 0x18, 0x7f, 0x26, 0xdf, 0x6b,
+ 0xff, 0x4b, 0xd7, 0xa0, 0x42, 0x39, 0x2e, 0x38, 0x59, 0x20, 0x83, 0x68, 0x0f, 0x94, 0x87, 0xd2,
+ 0x39, 0x40, 0x83, 0x44, 0x88, 0xa9, 0x83, 0x09, 0xc0, 0x84, 0xa8, 0x30, 0x40, 0x05, 0x01, 0x84,
+ 0x06, 0x22, 0x45, 0xa3, 0x6c, 0xa9, 0x2e, 0xea, 0xb7, 0xea, 0x81, 0xf7, 0x4d, 0x1b, 0xdb, 0xfb,
+ 0x0e, 0x8e, 0x17, 0x0f, 0x5f, 0xf2, 0xdd, 0x23, 0x31, 0xc0, 0xab, 0x5f, 0x7b, 0x2f, 0x67, 0xdd,
+ 0xf8, 0xd8, 0x7f, 0x1c, 0xc8, 0xae, 0x1b, 0x47, 0xd8, 0xfc, 0xb5, 0xc3, 0x00, 0xfc, 0xf4, 0xd2,
+ 0x62, 0x66, 0xed, 0x07, 0x33, 0x9b, 0xb3, 0xdd, 0xe6, 0xf3, 0xdd, 0x83, 0x72, 0x55, 0xae, 0x17,
+ 0x54, 0xa6, 0x1b, 0x71, 0xfb, 0x20, 0xbb, 0x12, 0xd5, 0xb3, 0x09, 0x95, 0x3f, 0x1d, 0x72, 0x23,
+ 0xe0, 0xf5, 0x82, 0xd2, 0xed, 0x85, 0x24, 0x86, 0x60, 0x06, 0xea, 0x87, 0x91, 0xea, 0x5e, 0x98,
+ 0x7f, 0x05, 0x16, 0x0f, 0x41, 0x75, 0x0e, 0x55, 0xab, 0xa0, 0x02, 0x4b, 0x54, 0x83, 0xc5, 0xb2,
+ 0x3a, 0xdc, 0x08, 0xdd, 0xdb, 0xe6, 0xe6, 0xd5, 0x8f, 0x37, 0x7d, 0x7d, 0x61, 0x1c, 0xe0, 0xa5,
+ 0xeb, 0x57, 0xb0, 0xe5, 0xae, 0x23, 0x3f, 0x3f, 0x90, 0x5d, 0xd7, 0x95, 0xd8, 0xbc, 0x63, 0x3a,
+ 0xb5, 0xdb, 0x81, 0xc1, 0xbe, 0x11, 0xf9, 0xaf, 0x85, 0x12, 0x37, 0x15, 0x06, 0x28, 0x39, 0xd9,
+ 0x02, 0xf8, 0xa3, 0xd0, 0x77, 0x1e, 0xaa, 0xff, 0x62, 0xc8, 0xad, 0x04, 0x31, 0xe9, 0xb0, 0x24,
+ 0xf6, 0x74, 0x92, 0xed, 0x54, 0x3a, 0x50, 0x50, 0x3f, 0x02, 0x33, 0xcf, 0x20, 0x53, 0xcf, 0xc3,
+ 0xec, 0x01, 0x58, 0x9c, 0x46, 0x87, 0x50, 0xaf, 0xc2, 0x62, 0xc5, 0xf9, 0x49, 0xad, 0xae, 0xef,
+ 0x58, 0x73, 0x6b, 0xf9, 0x31, 0x80, 0x9d, 0x37, 0x0c, 0x33, 0x76, 0xe7, 0xb1, 0x77, 0x0f, 0x64,
+ 0xd7, 0xf5, 0x7d, 0x6c, 0xbe, 0x6b, 0x0e, 0x80, 0x3d, 0xb7, 0x0e, 0x9c, 0xd5, 0x73, 0x8a, 0xfa,
+ 0x52, 0xf7, 0x32, 0x75, 0xa5, 0xdf, 0x25, 0x90, 0x1d, 0x81, 0xbe, 0x8b, 0x50, 0x43, 0x97, 0x42,
+ 0x66, 0x28, 0x39, 0x6d, 0x31, 0x27, 0x59, 0x45, 0xda, 0xcf, 0x14, 0xa0, 0x12, 0x83, 0x60, 0xdb,
+ 0xf3, 0xb5, 0x87, 0x8a, 0xab, 0xc8, 0xec, 0x0b, 0xc8, 0xb1, 0xa7, 0x60, 0xe2, 0x15, 0x54, 0xb5,
+ 0x82, 0xc4, 0x9a, 0x85, 0x05, 0xa6, 0x2a, 0x55, 0xe7, 0xe6, 0xaf, 0xfd, 0xf0, 0xb2, 0xef, 0x7d,
+ 0xfb, 0xc5, 0x1f, 0xc4, 0x3b, 0x3f, 0xd7, 0xcb, 0xd8, 0xdd, 0xf3, 0xff, 0x7e, 0x20, 0x2f, 0xdf,
+ 0x50, 0xe2, 0xec, 0x3b, 0x13, 0x4d, 0xec, 0xbb, 0xbd, 0xff, 0xe2, 0xbe, 0x11, 0xe7, 0xae, 0xc2,
+ 0xa0, 0x3e, 0xdf, 0xcb, 0x6b, 0xe8, 0xda, 0x8c, 0x5a, 0x76, 0x39, 0x14, 0xcf, 0x4e, 0x65, 0x3c,
+ 0x19, 0x00, 0x8b, 0x12, 0x69, 0x09, 0xac, 0xc4, 0x22, 0x62, 0x81, 0xb6, 0xb6, 0x94, 0x98, 0x44,
+ 0x6b, 0x62, 0x12, 0xa0, 0xda, 0x43, 0xa2, 0x05, 0x98, 0x7c, 0x16, 0x79, 0xfb, 0x31, 0x98, 0x3c,
+ 0x80, 0xb2, 0x0e, 0xd5, 0x2a, 0x71, 0xb9, 0xa2, 0xbf, 0xf2, 0xe1, 0xff, 0x75, 0xda, 0x57, 0x5f,
+ 0x63, 0x97, 0xd9, 0x79, 0xfd, 0x72, 0xc6, 0xee, 0x9a, 0xf8, 0xff, 0x03, 0xd9, 0x79, 0xdd, 0x10,
+ 0x63, 0x3b, 0x92, 0xd0, 0xba, 0xff, 0x8e, 0xfe, 0x4b, 0xfa, 0x56, 0x39, 0xdf, 0x28, 0x94, 0xdc,
+ 0x8d, 0xae, 0xef, 0x42, 0xdf, 0xc5, 0xa8, 0xe1, 0x2b, 0xc0, 0x1f, 0x6e, 0x0b, 0xd0, 0x71, 0xfa,
+ 0x0a, 0x0b, 0xa9, 0xd0, 0x4b, 0x4e, 0x5e, 0x92, 0xcf, 0x15, 0x6d, 0xe1, 0x45, 0x2c, 0x8a, 0x14,
+ 0x60, 0x13, 0x14, 0x02, 0xca, 0x81, 0x85, 0x03, 0x70, 0xe8, 0x11, 0xe4, 0xd0, 0x73, 0x28, 0xeb,
+ 0xd0, 0x68, 0x88, 0x99, 0x9d, 0x77, 0x76, 0x8c, 0x7c, 0xa9, 0x72, 0x13, 0xc0, 0xce, 0x9b, 0x4f,
+ 0x63, 0xec, 0x8e, 0x37, 0xff, 0x6d, 0x20, 0xaf, 0x7c, 0x69, 0x3d, 0x9b, 0x6e, 0x7d, 0x23, 0xd1,
+ 0xc4, 0xf6, 0xd2, 0x7b, 0xfa, 0x47, 0xf5, 0x9f, 0x77, 0x2d, 0xf3, 0xd6, 0x3b, 0x9e, 0x03, 0xfd,
+ 0xef, 0x47, 0x9d, 0x72, 0x25, 0x78, 0xfd, 0x20, 0x31, 0xda, 0x71, 0x00, 0x41, 0x4c, 0x94, 0x0a,
+ 0xd3, 0x71, 0xe2, 0x1d, 0xc2, 0xa9, 0xa6, 0xbf, 0x88, 0x41, 0x3a, 0xb5, 0xd0, 0xfa, 0xbc, 0x03,
+ 0x88, 0x4d, 0xd7, 0x50, 0x1a, 0x82, 0x39, 0xe4, 0xd0, 0xa3, 0xb0, 0xff, 0x31, 0xb0, 0x2e, 0x41,
+ 0x40, 0x70, 0x7c, 0x46, 0x6f, 0x5f, 0xfd, 0xbf, 0x2b, 0xb7, 0xc8, 0x93, 0xb0, 0xff, 0xe0, 0xe7,
+ 0x38, 0xfd, 0xea, 0xbb, 0x4f, 0x0e, 0x44, 0x9e, 0x06, 0x75, 0x3e, 0xec, 0xbf, 0x63, 0x68, 0x4d,
+ 0xf7, 0x72, 0xfe, 0xae, 0x6f, 0xa5, 0x7f, 0x8e, 0x76, 0x25, 0xf1, 0x87, 0x53, 0xaf, 0x49, 0x40,
+ 0xd8, 0x08, 0x9d, 0xcd, 0x30, 0x77, 0xe8, 0x6d, 0x4c, 0x14, 0xd2, 0x37, 0x3c, 0x88, 0x52, 0xd2,
+ 0x21, 0x98, 0x39, 0x41, 0xf8, 0x26, 0xc0, 0x7f, 0x43, 0x78, 0x39, 0x11, 0x4c, 0xf2, 0x14, 0x80,
+ 0xb8, 0x06, 0x6f, 0xfd, 0x0c, 0xde, 0x7c, 0x0a, 0xf0, 0x68, 0x04, 0xcc, 0x1e, 0x3e, 0xea, 0x5d,
+ 0xbf, 0x61, 0xfb, 0xc2, 0x3d, 0x6f, 0x5c, 0xeb, 0xa9, 0xf5, 0x5f, 0x8f, 0x5a, 0x26, 0xd1, 0x8a,
+ 0x8f, 0xbb, 0x6f, 0x2e, 0xa1, 0xce, 0x87, 0xdd, 0x37, 0xf6, 0xf4, 0xe6, 0x7a, 0xf8, 0x4a, 0xdf,
+ 0x68, 0x36, 0x01, 0xd1, 0x75, 0x26, 0x6a, 0xf9, 0xc7, 0x50, 0x6e, 0x2f, 0xd8, 0x06, 0xda, 0x85,
+ 0xf1, 0x5d, 0x3b, 0xf9, 0xfe, 0x1f, 0x7e, 0x95, 0x3f, 0xbe, 0xe6, 0xb3, 0x4c, 0xee, 0x7f, 0x13,
+ 0x4c, 0x80, 0xb2, 0x01, 0x2a, 0x7d, 0x62, 0x1b, 0x88, 0x69, 0x20, 0x36, 0x00, 0x69, 0x80, 0x0d,
+ 0xc0, 0x86, 0x1d, 0x23, 0x48, 0x86, 0x49, 0x9f, 0x36, 0x99, 0x23, 0x26, 0x40, 0x6c, 0x88, 0x98,
+ 0x10, 0xe2, 0x46, 0x22, 0xd8, 0xc8, 0x36, 0x18, 0x5c, 0x05, 0x62, 0xf1, 0x33, 0xf4, 0x9f, 0xb2,
+ 0x2c, 0xba, 0xe1, 0xa9, 0x4f, 0x97, 0xc6, 0xd6, 0x7f, 0x3d, 0x92, 0x97, 0x3e, 0x37, 0xc0, 0x12,
+ 0x20, 0xaf, 0x6f, 0xbf, 0x90, 0x8d, 0x77, 0x4c, 0xf3, 0xd3, 0x4b, 0xbb, 0xbd, 0xc2, 0x90, 0x7f,
+ 0x79, 0xef, 0x4a, 0xef, 0x6a, 0x27, 0xa3, 0x21, 0xb3, 0x1c, 0x55, 0xfa, 0x00, 0x64, 0x96, 0x23,
+ 0xa6, 0x86, 0x92, 0x64, 0xd3, 0x87, 0xee, 0xf9, 0x1b, 0x0e, 0xbc, 0xf0, 0x0a, 0xc3, 0x83, 0x73,
+ 0x44, 0xf3, 0x7b, 0xc0, 0xd4, 0x11, 0xdb, 0x48, 0x47, 0x80, 0x48, 0x08, 0xd2, 0x21, 0x6c, 0x4b,
+ 0xe0, 0xce, 0xbf, 0xc3, 0xb6, 0xf0, 0x26, 0x15, 0xde, 0x86, 0xe9, 0x77, 0x8d, 0xf6, 0x50, 0x0a,
+ 0xd6, 0x5c, 0x08, 0x19, 0x8d, 0x52, 0x90, 0xf5, 0x39, 0x63, 0xf5, 0x68, 0xfd, 0x36, 0x80, 0x2d,
+ 0x77, 0xcf, 0x2c, 0x05, 0xb2, 0xe1, 0xa6, 0x27, 0x01, 0xd8, 0xf0, 0xab, 0xbd, 0xc3, 0x85, 0x41,
+ 0xbd, 0x23, 0xdb, 0xe3, 0x23, 0x78, 0xd0, 0xbd, 0x11, 0xba, 0xb7, 0x82, 0xa9, 0x82, 0x6d, 0xa0,
+ 0x1c, 0x61, 0xdf, 0x53, 0xcf, 0x72, 0xf4, 0x8d, 0xfd, 0xfc, 0xca, 0x15, 0x9a, 0x2b, 0x3e, 0xbd,
+ 0x8e, 0xe5, 0xab, 0x4a, 0x40, 0x08, 0x92, 0x0e, 0xdb, 0x00, 0xd3, 0xe8, 0x10, 0xbe, 0x53, 0xc0,
+ 0xf6, 0x48, 0x34, 0x76, 0xc2, 0x77, 0xa6, 0x91, 0x1e, 0x40, 0x73, 0xad, 0x44, 0xa3, 0x2a, 0x9b,
+ 0x85, 0xe5, 0xa7, 0x03, 0x06, 0xc7, 0x81, 0x62, 0xb7, 0x5c, 0xb0, 0xf7, 0x0b, 0xdd, 0xbf, 0xdf,
+ 0xcc, 0x75, 0x00, 0xfa, 0xf5, 0x3b, 0xce, 0x4f, 0xf2, 0xc6, 0xb5, 0x3d, 0x59, 0x1b, 0x36, 0x3e,
+ 0xdd, 0x37, 0x9a, 0x2d, 0x89, 0x08, 0xe4, 0x4e, 0x41, 0xf5, 0x5d, 0x90, 0x2e, 0xdc, 0x40, 0xd9,
+ 0x10, 0x1c, 0xc3, 0x6b, 0x8f, 0xbf, 0xc4, 0x59, 0x1b, 0xa6, 0xd9, 0xf4, 0xc1, 0x8b, 0x29, 0x9d,
+ 0xf7, 0x07, 0x78, 0x3d, 0x2b, 0x52, 0x61, 0x52, 0x00, 0x9d, 0x26, 0x74, 0x52, 0xd3, 0x09, 0x96,
+ 0x9e, 0xbe, 0x09, 0xda, 0xda, 0x6b, 0x3d, 0x1b, 0x09, 0x00, 0x09, 0x50, 0x12, 0x02, 0x21, 0xaa,
+ 0x74, 0x2a, 0xe8, 0xc4, 0x25, 0x5c, 0x87, 0xfe, 0xc1, 0x7e, 0x73, 0xcd, 0x7d, 0x57, 0xad, 0x1c,
+ 0x68, 0x26, 0x6c, 0x77, 0xc3, 0xcd, 0x4f, 0x03, 0xd0, 0xbf, 0xba, 0xbb, 0x94, 0xef, 0x33, 0x9f,
+ 0xd7, 0x9e, 0x83, 0xe0, 0x43, 0x7e, 0x2d, 0xf8, 0xa7, 0xa0, 0x4c, 0x2d, 0x71, 0x44, 0x25, 0x44,
+ 0x0b, 0x55, 0xa4, 0x72, 0x80, 0xb5, 0xdb, 0xce, 0x64, 0x60, 0xe3, 0xaf, 0x22, 0xda, 0x4f, 0x4f,
+ 0x51, 0x3a, 0x9c, 0xd9, 0xb4, 0x9d, 0xb7, 0x95, 0x3f, 0x52, 0x87, 0xb6, 0x16, 0x6b, 0x63, 0xac,
+ 0x89, 0x40, 0x2c, 0x5a, 0x83, 0xd6, 0xd2, 0xfe, 0x3f, 0x3a, 0x02, 0x45, 0xcb, 0xf1, 0xd3, 0x40,
+ 0xe1, 0x79, 0xe0, 0x29, 0x08, 0xc0, 0xd1, 0xe0, 0xfb, 0x9c, 0x35, 0xb6, 0x6e, 0xe6, 0x93, 0xc0,
+ 0x0e, 0x00, 0x07, 0x60, 0xe7, 0xb5, 0x3d, 0xae, 0x93, 0x91, 0x4f, 0x2d, 0xdb, 0x50, 0xb8, 0x14,
+ 0xad, 0xc1, 0x2f, 0xa1, 0x4a, 0xef, 0x47, 0x39, 0x99, 0xc4, 0x61, 0x89, 0xd1, 0x8e, 0xe5, 0xf0,
+ 0xee, 0x37, 0xc9, 0x98, 0x43, 0xac, 0x7e, 0xcf, 0x2f, 0x93, 0xe9, 0x1e, 0x02, 0x13, 0x82, 0x8d,
+ 0x41, 0xa2, 0x64, 0x10, 0x81, 0x8d, 0x11, 0x1b, 0xa7, 0xd9, 0xbe, 0x63, 0xd8, 0x88, 0xe9, 0xa3,
+ 0xd3, 0x3c, 0xf3, 0xc0, 0x8b, 0x3c, 0x75, 0xff, 0xf3, 0xbc, 0xf1, 0xcc, 0x1e, 0x2a, 0xb3, 0x0b,
+ 0x14, 0xba, 0x1c, 0x72, 0x79, 0x85, 0x52, 0x06, 0x4d, 0x8c, 0x22, 0x42, 0x49, 0x9c, 0xac, 0x23,
+ 0x21, 0xd8, 0x28, 0xd9, 0xa7, 0x32, 0x0e, 0x8b, 0x53, 0x60, 0x54, 0x33, 0x7d, 0xf9, 0x5a, 0x8b,
+ 0xda, 0xdc, 0x7d, 0xf6, 0x7d, 0xf7, 0xbe, 0x7e, 0x2c, 0x74, 0x13, 0x6d, 0x14, 0x7c, 0xbf, 0xcb,
+ 0xfe, 0x8e, 0xce, 0x38, 0x88, 0x38, 0x90, 0x29, 0x81, 0xbf, 0x0c, 0x69, 0x6a, 0x43, 0x2c, 0x28,
+ 0x85, 0x69, 0xcc, 0xb3, 0x62, 0xec, 0x42, 0xba, 0x4b, 0x43, 0xd8, 0xb8, 0xb6, 0x24, 0xd9, 0xc9,
+ 0x92, 0x70, 0x6a, 0x96, 0x84, 0x54, 0xad, 0x85, 0xb9, 0xa9, 0x05, 0xfe, 0xf5, 0xff, 0x3e, 0xcc,
+ 0xe4, 0xbe, 0x37, 0x39, 0x73, 0x4b, 0x0f, 0x5d, 0x3d, 0x1e, 0x8d, 0xd9, 0x79, 0x9e, 0xbb, 0x7f,
+ 0x1f, 0xe7, 0x7e, 0x64, 0x1b, 0x83, 0x23, 0x7d, 0x2c, 0xcc, 0x87, 0xcc, 0x97, 0x03, 0x72, 0xbe,
+ 0xd0, 0xdf, 0x2d, 0x29, 0xa0, 0x06, 0x34, 0x8e, 0x23, 0x0b, 0x87, 0x50, 0x19, 0x07, 0x22, 0x01,
+ 0x23, 0xb8, 0x2e, 0xf8, 0x19, 0xb5, 0x7e, 0xcb, 0xda, 0xbd, 0x97, 0x02, 0xf7, 0xba, 0xcf, 0x7d,
+ 0x66, 0x98, 0xfa, 0x3c, 0xeb, 0xfa, 0x46, 0xdc, 0xd3, 0x11, 0x05, 0x4e, 0x1e, 0x95, 0x5b, 0x09,
+ 0xa6, 0x9e, 0x2c, 0x92, 0x0a, 0x6a, 0x03, 0xcb, 0xea, 0x4d, 0xab, 0x00, 0xc1, 0x5a, 0x83, 0xc2,
+ 0x24, 0x7e, 0x83, 0xc5, 0x88, 0x4e, 0xcc, 0x40, 0xe2, 0x0e, 0xda, 0x61, 0x5b, 0x79, 0x43, 0x8c,
+ 0xc5, 0xcf, 0x84, 0xbc, 0xef, 0x23, 0x25, 0x06, 0x4a, 0x7d, 0xf8, 0xc5, 0x65, 0x90, 0x29, 0x24,
+ 0x59, 0x4c, 0x37, 0xa8, 0x4e, 0x2f, 0xf2, 0xf0, 0xcf, 0x8e, 0xf1, 0xd0, 0xb3, 0x65, 0x76, 0xef,
+ 0x5b, 0xe4, 0x03, 0x5b, 0x35, 0x9f, 0xba, 0x3c, 0x87, 0x23, 0xb5, 0x54, 0x0e, 0x9b, 0xd8, 0x8e,
+ 0x23, 0xe0, 0x28, 0x50, 0x92, 0x90, 0x00, 0xcd, 0x48, 0x5f, 0x2f, 0x17, 0x00, 0xf7, 0xba, 0x5d,
+ 0xa5, 0x50, 0x3b, 0x9e, 0xfe, 0xb5, 0x7c, 0xa9, 0x88, 0xa0, 0x40, 0xfb, 0xe0, 0x2f, 0x03, 0x53,
+ 0x4b, 0xcd, 0x66, 0xa9, 0x50, 0x00, 0x3a, 0x98, 0x62, 0x71, 0x62, 0x9c, 0xc9, 0x63, 0x53, 0x64,
+ 0x33, 0x2e, 0x2b, 0x46, 0x06, 0x90, 0xae, 0x21, 0xac, 0x93, 0x49, 0xe7, 0x37, 0x35, 0x12, 0x03,
+ 0x31, 0xd8, 0x90, 0x7c, 0x3e, 0xa4, 0x70, 0xc6, 0xa9, 0x88, 0x69, 0x60, 0xa2, 0x2a, 0x54, 0x66,
+ 0x70, 0x1c, 0xc3, 0xf4, 0x74, 0x9d, 0xef, 0xde, 0x37, 0xc5, 0x4f, 0x9e, 0xb1, 0x6c, 0x5c, 0x57,
+ 0xe4, 0xca, 0x8b, 0x84, 0x4d, 0x2b, 0x0d, 0xd1, 0x62, 0x15, 0xa7, 0x4b, 0x81, 0xf2, 0x40, 0x27,
+ 0x72, 0x88, 0x23, 0x28, 0x27, 0x2d, 0x71, 0x0c, 0xb8, 0x8e, 0xe0, 0x67, 0xec, 0xfa, 0x7f, 0xf8,
+ 0xf5, 0x95, 0xfd, 0x6e, 0x71, 0x59, 0x84, 0x72, 0xf3, 0x97, 0xb4, 0xa8, 0xb5, 0xe3, 0x83, 0x53,
+ 0x48, 0x9d, 0xd8, 0x74, 0x38, 0xad, 0xa0, 0x94, 0xa0, 0x17, 0x0f, 0xf2, 0xc4, 0x03, 0x0f, 0xf3,
+ 0x8f, 0x3f, 0x3b, 0xc2, 0xa4, 0x9c, 0x42, 0x57, 0x06, 0xce, 0xec, 0x1e, 0xe7, 0xaa, 0xcb, 0x37,
+ 0xd0, 0xbf, 0xe1, 0x5c, 0x6c, 0x26, 0x07, 0x12, 0x27, 0x66, 0x21, 0x21, 0x22, 0x21, 0x22, 0x8d,
+ 0xc4, 0xf4, 0x62, 0x83, 0x12, 0x83, 0x02, 0x94, 0xeb, 0x51, 0xad, 0x5a, 0xbe, 0xf5, 0xf7, 0x65,
+ 0x0e, 0xcd, 0xaf, 0xe1, 0x1b, 0xb7, 0x6d, 0x61, 0x53, 0xdf, 0x01, 0xe2, 0x50, 0x13, 0xeb, 0x6e,
+ 0xa2, 0xb9, 0x37, 0x80, 0xe3, 0x49, 0x1e, 0x91, 0x94, 0xfa, 0x6b, 0x95, 0x24, 0x0c, 0xa5, 0x40,
+ 0x04, 0xc7, 0x01, 0xd7, 0x91, 0x15, 0x6b, 0x86, 0x67, 0xce, 0x70, 0x73, 0xa7, 0x9e, 0xa7, 0x4d,
+ 0xf9, 0xd5, 0x73, 0x40, 0x27, 0x84, 0xcd, 0xc9, 0x27, 0x9a, 0x30, 0x01, 0x82, 0x49, 0xf9, 0x8f,
+ 0x05, 0xa5, 0xd1, 0xf5, 0xc3, 0xfc, 0xe3, 0xf7, 0x7f, 0xc8, 0x9f, 0x3c, 0xd6, 0x83, 0xb7, 0xf5,
+ 0xcb, 0xac, 0x1e, 0x7b, 0x0f, 0x91, 0x11, 0x1e, 0xdc, 0xf3, 0x1c, 0x6f, 0xfd, 0xcd, 0xb7, 0xf8,
+ 0xd2, 0x55, 0x4f, 0xd2, 0xb5, 0xe9, 0xa2, 0x94, 0xb6, 0x47, 0x69, 0x24, 0x22, 0x39, 0xd5, 0x44,
+ 0x7c, 0x04, 0x41, 0xa1, 0x51, 0x1e, 0xfc, 0xdd, 0x3f, 0xcf, 0x12, 0x66, 0xcf, 0x66, 0xfb, 0x6d,
+ 0x57, 0xd2, 0xb7, 0xf8, 0x02, 0x8b, 0x0b, 0x45, 0x0a, 0xcb, 0x47, 0xc8, 0xd6, 0xde, 0xc6, 0xb7,
+ 0x71, 0x12, 0xb4, 0x44, 0xb5, 0xfe, 0x17, 0x9d, 0x9a, 0x97, 0x6e, 0x93, 0x2b, 0xa5, 0xd5, 0xf2,
+ 0xde, 0x5e, 0xbd, 0xca, 0x9d, 0x7c, 0x65, 0x7c, 0xf8, 0x94, 0xf5, 0x3a, 0x9f, 0x14, 0x3d, 0x1a,
+ 0xb4, 0x9f, 0x94, 0xa5, 0x36, 0x5c, 0xc2, 0x4a, 0x1d, 0x15, 0xf0, 0xec, 0xbf, 0x3e, 0xc3, 0x77,
+ 0x9f, 0x1d, 0xe0, 0xcc, 0xdf, 0xbc, 0x9d, 0xf7, 0xff, 0xda, 0xc7, 0xc9, 0xf9, 0xc9, 0xb7, 0xb5,
+ 0xf0, 0xc3, 0x3c, 0xfe, 0xc0, 0x39, 0x7c, 0xe3, 0xfe, 0x4f, 0xf2, 0xc5, 0x55, 0x47, 0xb1, 0xc5,
+ 0x15, 0x2d, 0x66, 0xac, 0x50, 0x88, 0x48, 0x5a, 0x2d, 0x5a, 0x40, 0xa3, 0x5d, 0x87, 0x57, 0x5e,
+ 0x9d, 0x67, 0x31, 0x1a, 0xe4, 0xb7, 0x7f, 0xf3, 0x7d, 0x0c, 0x66, 0xea, 0x94, 0xe7, 0x0f, 0x53,
+ 0x28, 0xe6, 0x61, 0xef, 0x3f, 0x63, 0xe7, 0xf6, 0x42, 0xb7, 0x86, 0xbe, 0xde, 0xb4, 0x10, 0x63,
+ 0xe9, 0xd0, 0x4b, 0x88, 0xef, 0x40, 0xc6, 0x63, 0xb9, 0x8e, 0xca, 0xf3, 0x6b, 0xfd, 0x6e, 0xb7,
+ 0xb5, 0x2d, 0xa2, 0x96, 0x64, 0x60, 0x6c, 0x80, 0x22, 0x22, 0x9e, 0x3a, 0xc4, 0xf7, 0x1f, 0x9a,
+ 0x61, 0xe5, 0xa5, 0x9f, 0xe3, 0xe3, 0x9f, 0xf8, 0x38, 0xa7, 0x75, 0xc1, 0x4a, 0x0f, 0x46, 0x5d,
+ 0x58, 0xdb, 0x0d, 0x57, 0xfc, 0xc6, 0x65, 0x54, 0x2f, 0xde, 0xce, 0xae, 0xa7, 0x5f, 0x45, 0x3b,
+ 0x5e, 0xa2, 0x5d, 0x9c, 0x04, 0x8a, 0xd2, 0x9c, 0x28, 0xcd, 0xc1, 0x63, 0x96, 0xcd, 0x1b, 0x86,
+ 0x38, 0xed, 0xd4, 0x90, 0xf2, 0xde, 0x07, 0xf1, 0x33, 0x35, 0xd4, 0x5b, 0x8f, 0x63, 0x8f, 0xec,
+ 0x85, 0x48, 0x43, 0xa1, 0xa7, 0x5d, 0x49, 0xb6, 0x34, 0xd2, 0x04, 0xd5, 0xe6, 0xba, 0x4a, 0xe1,
+ 0x3a, 0x8e, 0xed, 0x75, 0x91, 0x60, 0xb9, 0x9b, 0xcd, 0x75, 0x14, 0x73, 0x61, 0x9b, 0x5a, 0xd0,
+ 0x0c, 0x9f, 0xf0, 0xe8, 0xd3, 0xfb, 0x31, 0xcb, 0xdf, 0xcb, 0x07, 0x2e, 0xfb, 0x28, 0x6b, 0x7a,
+ 0xa0, 0xa8, 0xc0, 0xd3, 0x90, 0x77, 0xe0, 0xde, 0x07, 0xc7, 0x79, 0xee, 0x65, 0x4d, 0x39, 0x7a,
+ 0x2f, 0x7f, 0xff, 0x7a, 0x89, 0xcd, 0x1f, 0xaa, 0x83, 0xca, 0xa4, 0x94, 0x5c, 0x2d, 0x31, 0x0f,
+ 0xc7, 0xd1, 0x1c, 0x3c, 0x5c, 0x61, 0x59, 0xaf, 0xe2, 0x8c, 0xd5, 0x75, 0xe2, 0xe3, 0xbb, 0x50,
+ 0xf6, 0x18, 0xba, 0x72, 0x14, 0xe2, 0xe3, 0xe8, 0x5e, 0x17, 0xfa, 0xbb, 0xc1, 0xd7, 0x69, 0x80,
+ 0x69, 0x96, 0xc8, 0x27, 0xf0, 0xf5, 0xe6, 0x53, 0x04, 0xa5, 0x9c, 0x6e, 0xd7, 0x71, 0x29, 0x2a,
+ 0xad, 0x12, 0x1c, 0x22, 0x49, 0xb4, 0x6a, 0x51, 0x03, 0x0b, 0xca, 0x42, 0x5c, 0x63, 0xe7, 0xbe,
+ 0x32, 0x83, 0xeb, 0x2f, 0x61, 0xeb, 0xfa, 0x15, 0x94, 0xdc, 0x64, 0x1f, 0x0d, 0xfc, 0xd5, 0xdf,
+ 0x1e, 0xe0, 0xc1, 0xfd, 0xfd, 0xbc, 0xbd, 0xff, 0x11, 0xf2, 0xf9, 0x5e, 0xe6, 0xb8, 0x1a, 0x6a,
+ 0x8f, 0x40, 0xd7, 0x8a, 0x14, 0xc0, 0xd2, 0xea, 0x47, 0x04, 0xb2, 0xae, 0x61, 0xb4, 0x77, 0x81,
+ 0xa2, 0xaa, 0x53, 0x3e, 0x78, 0x98, 0x4c, 0x21, 0xc6, 0xf1, 0x23, 0x18, 0xea, 0x05, 0xd7, 0x87,
+ 0xdc, 0x08, 0x2a, 0xbf, 0x0a, 0x2a, 0x7b, 0x90, 0xda, 0xc1, 0xd4, 0xe7, 0x4e, 0x5e, 0x49, 0x2b,
+ 0x25, 0xe0, 0x78, 0x59, 0xad, 0xb2, 0x5e, 0xbe, 0xb3, 0x44, 0x45, 0xea, 0x28, 0x5b, 0x69, 0x73,
+ 0x2c, 0x13, 0x40, 0x65, 0x96, 0xd8, 0x1f, 0xa6, 0x67, 0xf9, 0x5a, 0xfa, 0x7c, 0xc8, 0xa4, 0x7e,
+ 0x77, 0x64, 0x7c, 0x91, 0xe9, 0x28, 0xc7, 0x1f, 0x7d, 0xb6, 0x97, 0xb3, 0x7a, 0x9e, 0xe0, 0xa1,
+ 0x3f, 0xbb, 0x9c, 0x89, 0x60, 0x82, 0xf2, 0x54, 0x39, 0xd5, 0xbe, 0x24, 0x92, 0x77, 0x6c, 0x6c,
+ 0xad, 0xa5, 0x34, 0x90, 0xa7, 0xb4, 0x62, 0x05, 0xe2, 0x17, 0xc9, 0x14, 0x5d, 0x9c, 0x5c, 0x16,
+ 0xb2, 0x03, 0x90, 0x2d, 0xa2, 0xfc, 0x6e, 0xb4, 0x6b, 0x51, 0x32, 0x0f, 0x85, 0xd1, 0xa5, 0x55,
+ 0xa8, 0x9c, 0xa4, 0xbe, 0x15, 0x50, 0x26, 0xa8, 0x6b, 0xa9, 0xd5, 0x17, 0x97, 0xcc, 0x30, 0x21,
+ 0x04, 0x53, 0x60, 0x42, 0xc4, 0x34, 0x40, 0x42, 0x2a, 0x73, 0x65, 0xdc, 0xc2, 0x20, 0x7d, 0xa5,
+ 0xa1, 0x56, 0xf4, 0x03, 0x78, 0xf8, 0xf1, 0x69, 0x3e, 0xf8, 0x4b, 0x03, 0x0c, 0x74, 0xc1, 0x15,
+ 0x1f, 0xfb, 0x28, 0x71, 0x58, 0xe5, 0xe0, 0xce, 0x7f, 0x61, 0x7e, 0xa1, 0xd1, 0x2e, 0x6b, 0x91,
+ 0x8e, 0x67, 0xb2, 0x4f, 0xc2, 0xb1, 0x34, 0xa2, 0x32, 0x64, 0x8a, 0x79, 0x9c, 0x4c, 0x06, 0x14,
+ 0x58, 0xa3, 0x98, 0xde, 0x3b, 0xc3, 0x9b, 0x0f, 0xed, 0xe6, 0xc8, 0xa3, 0x4f, 0x20, 0x33, 0x2f,
+ 0xbe, 0xb3, 0x1a, 0x97, 0x25, 0x4b, 0x21, 0x4a, 0x63, 0x85, 0xba, 0x6b, 0x6c, 0xa6, 0x62, 0x8d,
+ 0x45, 0xb9, 0xa9, 0xfa, 0x24, 0x46, 0xa2, 0x69, 0x5a, 0x31, 0x4e, 0x2c, 0x36, 0xac, 0xe0, 0xe7,
+ 0x4e, 0xc5, 0xc9, 0x16, 0x08, 0x0c, 0xe4, 0x74, 0xe2, 0x77, 0x95, 0xc8, 0x72, 0x60, 0x41, 0x71,
+ 0x26, 0x70, 0xdf, 0x7d, 0xf7, 0x21, 0x22, 0xe8, 0x8c, 0x8f, 0xb4, 0xba, 0x26, 0x69, 0xb5, 0x27,
+ 0x36, 0xd5, 0x4c, 0x93, 0x40, 0x4a, 0x12, 0xc9, 0x9a, 0x12, 0x29, 0x01, 0x2b, 0x68, 0xad, 0x28,
+ 0x0e, 0x67, 0x71, 0x7d, 0x8b, 0x76, 0x84, 0xc6, 0xdc, 0x3c, 0xd9, 0x1e, 0x67, 0x29, 0x02, 0x51,
+ 0x4b, 0xb4, 0x2c, 0x02, 0x46, 0x54, 0x59, 0xa3, 0x33, 0x6f, 0x47, 0x35, 0xb3, 0x74, 0xb2, 0x69,
+ 0x40, 0x78, 0x14, 0xe2, 0x29, 0xc4, 0x2e, 0xd0, 0x95, 0x37, 0xe4, 0x3c, 0x4b, 0xb9, 0x11, 0x33,
+ 0x1b, 0x42, 0x35, 0x9d, 0x3e, 0x54, 0xd0, 0x3c, 0xb0, 0xc7, 0x63, 0xeb, 0x65, 0xff, 0x8d, 0x3f,
+ 0xf9, 0xe6, 0x9f, 0xa2, 0xbd, 0x2c, 0x6b, 0xce, 0xb9, 0x84, 0xbe, 0x81, 0x7c, 0x42, 0x1c, 0xe9,
+ 0xa8, 0xd3, 0x5b, 0xd9, 0xbe, 0x03, 0x80, 0x2c, 0x7d, 0x2a, 0x47, 0x98, 0x3f, 0x52, 0xa5, 0x7b,
+ 0xc8, 0xa7, 0xd0, 0xe7, 0xe2, 0x75, 0x79, 0x29, 0xb3, 0x4e, 0x0f, 0xd9, 0xb4, 0xe2, 0x4f, 0xe7,
+ 0xcf, 0x7c, 0x1c, 0xe9, 0x29, 0x37, 0x53, 0x1a, 0xde, 0x17, 0x2e, 0x8e, 0xe3, 0x17, 0x7d, 0xa4,
+ 0x89, 0x56, 0x35, 0x37, 0x88, 0x11, 0xd1, 0x38, 0x85, 0x2c, 0x03, 0xde, 0x14, 0xe5, 0xfa, 0x34,
+ 0x13, 0x01, 0xc4, 0x31, 0x04, 0x59, 0x18, 0xbb, 0x60, 0x88, 0x1f, 0x7f, 0x6b, 0x9c, 0x75, 0x1f,
+ 0xb9, 0x0b, 0xaf, 0x6f, 0x03, 0xc5, 0x91, 0xb3, 0xd8, 0x96, 0x7f, 0x91, 0xe2, 0xf0, 0x00, 0x56,
+ 0xc2, 0xa5, 0xf5, 0x7a, 0x53, 0x1b, 0x9d, 0x0d, 0x0a, 0xda, 0xc0, 0x94, 0x08, 0xb5, 0xb9, 0x00,
+ 0xbf, 0xe0, 0x24, 0xa6, 0xeb, 0x24, 0xb4, 0x6a, 0x09, 0xd8, 0x4e, 0x2b, 0x6d, 0x6b, 0x64, 0xaa,
+ 0x5a, 0xb3, 0xe3, 0xfa, 0x8c, 0xb1, 0x17, 0xa6, 0xc3, 0x9a, 0x4c, 0xb4, 0x66, 0x34, 0x4f, 0x2d,
+ 0x1d, 0x36, 0x88, 0x88, 0xa2, 0x2c, 0xeb, 0xbb, 0x67, 0x58, 0x19, 0xbf, 0xc4, 0xc2, 0xf4, 0x24,
+ 0x93, 0xb3, 0xd3, 0xec, 0x9b, 0x8d, 0xa8, 0x14, 0x0b, 0x6c, 0xdd, 0xa6, 0xc9, 0x1e, 0xb1, 0x6c,
+ 0x39, 0xf7, 0x26, 0xfa, 0x2a, 0xa3, 0x7c, 0xb8, 0xf7, 0x27, 0x88, 0xe3, 0x22, 0x4d, 0x9e, 0xd5,
+ 0xe4, 0x5e, 0x36, 0x46, 0x59, 0x83, 0xb2, 0x29, 0x53, 0xee, 0x04, 0x63, 0x0d, 0x41, 0x25, 0xa0,
+ 0x3a, 0x55, 0xa7, 0x6b, 0x28, 0x93, 0x36, 0x33, 0x3a, 0xb5, 0x65, 0x9b, 0x36, 0x94, 0x6a, 0x44,
+ 0x5a, 0x66, 0x25, 0x22, 0xc7, 0x8e, 0x1f, 0x57, 0x6f, 0x39, 0x9f, 0x1c, 0x2b, 0x69, 0x6b, 0x38,
+ 0xb7, 0x7b, 0x38, 0x73, 0x16, 0xa2, 0xdb, 0x6d, 0x4d, 0xad, 0x31, 0xa1, 0xa1, 0x3e, 0x5d, 0x27,
+ 0x8a, 0x72, 0x0c, 0xac, 0x58, 0xc3, 0x5a, 0xbd, 0x97, 0xc1, 0xa3, 0x0f, 0xe0, 0x4c, 0xbe, 0x40,
+ 0x50, 0x99, 0x60, 0xb6, 0x6a, 0xe9, 0x1a, 0x1d, 0x24, 0xbf, 0x26, 0x4b, 0xed, 0xd8, 0xd3, 0x9c,
+ 0x2b, 0xb7, 0xf3, 0x89, 0xff, 0xec, 0x63, 0x95, 0xea, 0x28, 0xb2, 0x4c, 0xda, 0x59, 0x31, 0xed,
+ 0x96, 0x50, 0xab, 0x49, 0x17, 0x23, 0x51, 0x9d, 0x60, 0xbe, 0x4e, 0x65, 0xaa, 0x46, 0xff, 0x68,
+ 0x1e, 0xc7, 0x11, 0xc4, 0x9a, 0x25, 0xcd, 0x3c, 0xac, 0x05, 0x2b, 0xa8, 0x40, 0x20, 0x48, 0xca,
+ 0x1e, 0x48, 0x2c, 0xa3, 0x11, 0xe8, 0xc7, 0x36, 0xdc, 0x59, 0xfe, 0xae, 0x5b, 0x9e, 0x10, 0xf1,
+ 0xbb, 0xd5, 0x0f, 0xa3, 0x5a, 0x7c, 0xa5, 0x9b, 0xd5, 0x09, 0x95, 0x68, 0xd6, 0x12, 0x56, 0xf0,
+ 0xf3, 0x21, 0xbe, 0x3f, 0x89, 0xcc, 0x1e, 0x46, 0x2a, 0x01, 0x03, 0x51, 0xcc, 0xa0, 0xa7, 0x31,
+ 0x95, 0x7b, 0x98, 0x9e, 0x18, 0xe1, 0x70, 0xe9, 0x6a, 0x82, 0xc6, 0x0a, 0x4e, 0x73, 0x7f, 0xc4,
+ 0x2f, 0xff, 0xa7, 0x59, 0xac, 0xdb, 0x9f, 0x16, 0x53, 0xd2, 0xd1, 0x98, 0x6b, 0x6a, 0xa1, 0xdd,
+ 0xd7, 0x52, 0xa6, 0x46, 0xb4, 0x38, 0x4f, 0xa3, 0x96, 0x25, 0x0a, 0x72, 0xf4, 0xae, 0xf0, 0x71,
+ 0xdc, 0x08, 0x31, 0x1d, 0x16, 0xd1, 0xaa, 0x6f, 0x04, 0x8c, 0x4d, 0x8a, 0x2a, 0x63, 0x9b, 0x14,
+ 0x1e, 0x63, 0x55, 0x50, 0x6b, 0xb0, 0x1b, 0x94, 0xb8, 0x47, 0x5e, 0x1d, 0x90, 0xd3, 0x2e, 0xaa,
+ 0x3e, 0x54, 0x9d, 0x0a, 0x83, 0xde, 0x51, 0xd7, 0x4f, 0x9c, 0x53, 0x81, 0xb5, 0x38, 0x9e, 0xc5,
+ 0x09, 0xe7, 0xb1, 0x13, 0x0b, 0xb0, 0x00, 0x36, 0x48, 0x42, 0xa1, 0xf8, 0x02, 0x7d, 0x9a, 0xc1,
+ 0xae, 0xc3, 0x2c, 0x2b, 0x3d, 0xc7, 0xba, 0x89, 0x47, 0x29, 0x8c, 0x81, 0xf5, 0x73, 0x48, 0x1c,
+ 0xa0, 0xb4, 0x4a, 0xc9, 0x66, 0x02, 0x46, 0x68, 0x97, 0xb3, 0xca, 0x54, 0x30, 0x95, 0x59, 0x1a,
+ 0x0b, 0x31, 0xb1, 0x1e, 0x41, 0xe7, 0x87, 0x28, 0x16, 0xe7, 0x70, 0x64, 0x3e, 0x05, 0x61, 0xdb,
+ 0x1e, 0x9d, 0x96, 0xc7, 0x88, 0x45, 0xc5, 0xa9, 0x26, 0x4c, 0x3b, 0xb1, 0x5a, 0x2b, 0xfb, 0x67,
+ 0x66, 0xbd, 0x47, 0x01, 0xdc, 0x8f, 0xfc, 0x78, 0x2f, 0x07, 0x3f, 0x50, 0x9c, 0xae, 0x4e, 0x67,
+ 0x7e, 0xd0, 0xb3, 0xc2, 0x5c, 0x93, 0x78, 0x5a, 0x47, 0x93, 0xd9, 0x2b, 0x40, 0xc1, 0x49, 0xa8,
+ 0x79, 0x2c, 0x28, 0xcf, 0x85, 0x42, 0x06, 0x0a, 0x3e, 0xd2, 0xb5, 0x06, 0x72, 0xc3, 0x28, 0x7f,
+ 0x9a, 0x6a, 0xbd, 0x8c, 0xaa, 0x96, 0xc9, 0x14, 0x32, 0x78, 0x05, 0xbf, 0x1d, 0x5a, 0x34, 0x28,
+ 0x53, 0x87, 0x70, 0x81, 0xb8, 0x3c, 0x4f, 0x6d, 0xc1, 0x26, 0xaf, 0x20, 0x8a, 0xa3, 0x64, 0xf3,
+ 0x19, 0xdc, 0xe8, 0x28, 0x04, 0x8b, 0xe0, 0x06, 0xed, 0x28, 0xd7, 0xa1, 0xcd, 0x96, 0x6f, 0x44,
+ 0x0a, 0x62, 0x69, 0x2d, 0x1b, 0xc7, 0xd0, 0x68, 0xa8, 0xdd, 0x63, 0x77, 0xcf, 0x3d, 0x05, 0x0a,
+ 0x17, 0xe0, 0xc0, 0x53, 0x9e, 0x19, 0xdd, 0xa6, 0xbe, 0x59, 0x9d, 0x0e, 0xaf, 0x29, 0x0c, 0xa6,
+ 0xdc, 0x48, 0x00, 0xe5, 0x42, 0xa6, 0x0b, 0xbc, 0x2e, 0x28, 0x0a, 0x0a, 0x05, 0xda, 0x05, 0x2f,
+ 0x03, 0x8e, 0x87, 0xf2, 0x8b, 0x94, 0x0f, 0xee, 0xa7, 0x36, 0x35, 0x89, 0x58, 0x8b, 0x97, 0xf7,
+ 0x71, 0x32, 0xe0, 0xc6, 0x0a, 0x31, 0x01, 0x71, 0xb5, 0x4a, 0xb0, 0xb0, 0x88, 0x09, 0x2c, 0xb8,
+ 0x3d, 0x38, 0xb9, 0x33, 0xf0, 0x96, 0xf5, 0xa3, 0x5c, 0x0f, 0x4f, 0x37, 0x50, 0x8d, 0x23, 0x48,
+ 0x5c, 0x41, 0x7b, 0x89, 0xe1, 0x4b, 0xb3, 0x9f, 0x2c, 0x69, 0xe3, 0xa1, 0xa9, 0x8d, 0x28, 0xe9,
+ 0x38, 0x11, 0xb7, 0xc3, 0x95, 0xb1, 0xea, 0xf8, 0xf4, 0x9c, 0x73, 0x3f, 0x28, 0x9e, 0xff, 0x5d,
+ 0x70, 0xdf, 0xf8, 0x0c, 0xac, 0xff, 0xe6, 0x8c, 0xec, 0x1d, 0x5b, 0xb6, 0xbb, 0x7c, 0x34, 0xbe,
+ 0xaf, 0x50, 0x72, 0x3f, 0x96, 0xe8, 0x2e, 0x0d, 0x73, 0xda, 0x49, 0x98, 0xac, 0xe7, 0x26, 0x86,
+ 0xa9, 0x9c, 0x94, 0x6b, 0x18, 0xd4, 0xe2, 0xeb, 0xd4, 0x26, 0x6b, 0xf4, 0xac, 0x1c, 0x48, 0x6a,
+ 0x0d, 0x2b, 0x44, 0x95, 0x06, 0xc1, 0x6c, 0x05, 0xc1, 0x26, 0x85, 0x4f, 0xbe, 0x17, 0xaf, 0xcb,
+ 0x07, 0xeb, 0xa2, 0x1c, 0xc1, 0x55, 0x0b, 0x10, 0xd4, 0x92, 0x5e, 0x99, 0x13, 0xa1, 0x33, 0x51,
+ 0x1a, 0xe6, 0x53, 0x1f, 0xb2, 0xcd, 0xca, 0x32, 0x15, 0x20, 0x16, 0x08, 0x15, 0x84, 0xd2, 0x2a,
+ 0x6f, 0x8c, 0x81, 0x6a, 0x4d, 0x5e, 0xdc, 0x7e, 0xcf, 0x39, 0x7f, 0x0b, 0x0f, 0x53, 0x7a, 0xdf,
+ 0xef, 0xa1, 0xe3, 0xd2, 0x46, 0x00, 0xfe, 0xfa, 0x8b, 0x23, 0x55, 0x13, 0x39, 0x77, 0x94, 0xc7,
+ 0x43, 0x51, 0xca, 0x24, 0x91, 0x43, 0x4c, 0x5a, 0x8b, 0x27, 0xe1, 0x33, 0x29, 0xb8, 0xa2, 0xf4,
+ 0xf7, 0x08, 0xab, 0x5c, 0x7a, 0x57, 0x14, 0xc9, 0xe4, 0x34, 0x99, 0xbc, 0xc6, 0x2f, 0x38, 0xe4,
+ 0x7a, 0x5d, 0xf2, 0x25, 0x9f, 0xc2, 0x60, 0x8e, 0x7c, 0x29, 0x87, 0x5f, 0xf0, 0xf0, 0x5c, 0xc1,
+ 0xf3, 0x02, 0x5c, 0x35, 0x8f, 0x8a, 0x27, 0x51, 0x7a, 0x1e, 0x9d, 0x09, 0x50, 0x6e, 0xd8, 0x06,
+ 0x61, 0x6d, 0x1b, 0x44, 0xd3, 0x37, 0x8c, 0x41, 0x85, 0xef, 0xd4, 0x46, 0x1c, 0xcb, 0xc4, 0xe4,
+ 0x94, 0xfb, 0xad, 0xef, 0x1d, 0x7f, 0x38, 0xde, 0xf7, 0xfb, 0xb0, 0xea, 0xb7, 0xbe, 0x83, 0xde,
+ 0x78, 0xcb, 0x6e, 0x0e, 0xff, 0x0f, 0xf8, 0x32, 0xcf, 0x33, 0x7b, 0x48, 0x76, 0x57, 0xa7, 0xed,
+ 0x2d, 0x61, 0x25, 0x4a, 0x5e, 0x0b, 0x48, 0xda, 0x50, 0xb0, 0x71, 0xaa, 0x6a, 0xb3, 0xa4, 0xbd,
+ 0x03, 0xe0, 0xe5, 0x55, 0x0b, 0x18, 0x12, 0xe1, 0xb8, 0x09, 0x81, 0x75, 0x3d, 0xd0, 0xda, 0xa2,
+ 0x74, 0x84, 0xce, 0x04, 0xe9, 0x08, 0x51, 0x5e, 0x84, 0x72, 0x62, 0x50, 0x69, 0xeb, 0xa8, 0xf3,
+ 0xb0, 0x3a, 0x41, 0xd8, 0x14, 0x44, 0xa0, 0x20, 0xb0, 0x2d, 0xdf, 0x30, 0x86, 0x78, 0x66, 0xce,
+ 0xfd, 0xf1, 0xa6, 0x1d, 0xe5, 0x1f, 0x01, 0x34, 0x4a, 0x1b, 0xda, 0x2d, 0xd3, 0x85, 0xb5, 0xbf,
+ 0x04, 0xc0, 0xd6, 0x3f, 0x3e, 0x5e, 0xaf, 0xcd, 0x98, 0x3f, 0x9f, 0x3f, 0x12, 0x3f, 0x91, 0x24,
+ 0xb3, 0xb8, 0x0d, 0xa6, 0xd9, 0xbb, 0x6a, 0x6a, 0x47, 0xe2, 0x0e, 0x60, 0x51, 0x5b, 0x63, 0x36,
+ 0x4c, 0xb5, 0x16, 0xb6, 0xe7, 0x49, 0x94, 0x24, 0x47, 0x96, 0x1e, 0x8c, 0xb4, 0xd6, 0x32, 0x4b,
+ 0x5a, 0x4b, 0x88, 0x4d, 0x4c, 0xa9, 0xa1, 0x20, 0x68, 0x9b, 0x94, 0xb5, 0x50, 0x5e, 0xe4, 0xb5,
+ 0xd7, 0x0f, 0x9e, 0x72, 0x2d, 0xc0, 0xae, 0xdf, 0x83, 0x4d, 0xb7, 0xbe, 0xde, 0x06, 0xb2, 0xf1,
+ 0xc6, 0x47, 0xd9, 0x7d, 0x73, 0xd2, 0x43, 0x3d, 0xe3, 0x96, 0xb9, 0xb7, 0x83, 0xb2, 0xbd, 0x6e,
+ 0xfe, 0xed, 0x70, 0x4e, 0xa9, 0x64, 0x23, 0x31, 0xa6, 0xad, 0x11, 0x1b, 0x2d, 0x05, 0x61, 0x3b,
+ 0xcc, 0xae, 0x25, 0x64, 0xe7, 0xf7, 0x71, 0x87, 0x69, 0x46, 0x2d, 0x8d, 0x4a, 0x6b, 0x4e, 0xc7,
+ 0xb0, 0x36, 0x99, 0x17, 0x5a, 0x54, 0xa0, 0xa0, 0x21, 0x09, 0xa0, 0x34, 0xad, 0xd4, 0xeb, 0x32,
+ 0xf9, 0xd6, 0x78, 0xee, 0x77, 0x2e, 0xfd, 0xb3, 0x3d, 0x0b, 0x00, 0xa5, 0x8f, 0xde, 0xc6, 0x3b,
+ 0x5e, 0x2b, 0x6c, 0xbc, 0x63, 0x9a, 0x97, 0x6f, 0x5e, 0x05, 0xc0, 0xaa, 0x6b, 0x7f, 0xfd, 0x99,
+ 0xea, 0xb4, 0x7c, 0xaa, 0x32, 0x11, 0xc6, 0x09, 0x1d, 0x6f, 0x6e, 0xfc, 0xef, 0x18, 0x9d, 0xfe,
+ 0xf4, 0x8e, 0xef, 0x92, 0x43, 0x69, 0x1f, 0x4c, 0xdc, 0x36, 0xa9, 0xe6, 0x41, 0x45, 0x92, 0x80,
+ 0xa8, 0xb7, 0x41, 0x00, 0x04, 0x81, 0xcc, 0x1f, 0x3a, 0x9a, 0xfb, 0x83, 0xf3, 0xbe, 0x31, 0xf3,
+ 0xfc, 0xee, 0x1b, 0xfa, 0x00, 0x38, 0xf5, 0xa3, 0x5f, 0x6c, 0x01, 0x71, 0x3a, 0x69, 0xe4, 0x9f,
+ 0x3e, 0x3e, 0xcf, 0xce, 0xeb, 0x96, 0xf1, 0x9d, 0x27, 0x1f, 0x61, 0xe0, 0xa7, 0xa5, 0xbd, 0x1b,
+ 0x2e, 0x0e, 0xa7, 0x9d, 0x8c, 0xf9, 0x90, 0x97, 0x4d, 0xe7, 0x75, 0x30, 0x57, 0xd5, 0x34, 0x01,
+ 0x75, 0x32, 0x32, 0xd8, 0xd9, 0x69, 0x34, 0xed, 0x17, 0x3e, 0x9d, 0x1d, 0x48, 0x89, 0x97, 0x6a,
+ 0x42, 0x6c, 0x02, 0xa2, 0xde, 0x01, 0x22, 0x4d, 0x23, 0x41, 0x28, 0x73, 0x87, 0x8e, 0xe4, 0x6e,
+ 0xd8, 0xb4, 0x63, 0xf6, 0xaf, 0xf6, 0xfc, 0x61, 0x2f, 0x67, 0x6e, 0x7f, 0xe7, 0x0b, 0x51, 0xe7,
+ 0xc4, 0x0f, 0xbe, 0xf3, 0x64, 0x95, 0x97, 0x6f, 0x2c, 0x71, 0xe5, 0x13, 0x13, 0x36, 0xff, 0x4f,
+ 0x63, 0x2f, 0x6d, 0xbc, 0x60, 0x7a, 0xde, 0xf5, 0xcc, 0x45, 0x9e, 0x8f, 0x9f, 0x74, 0xc3, 0xe5,
+ 0x24, 0x54, 0xdc, 0x2e, 0xb5, 0xef, 0xce, 0x46, 0xf4, 0x12, 0xa6, 0x7b, 0x42, 0xa3, 0xbb, 0x09,
+ 0xc0, 0x58, 0x08, 0x40, 0x35, 0x7d, 0x22, 0x90, 0x16, 0xc5, 0x6a, 0x34, 0xd4, 0xd1, 0x83, 0xe3,
+ 0xd9, 0xff, 0xb9, 0xf1, 0xae, 0xd9, 0xbf, 0xd8, 0xf7, 0x85, 0x5e, 0xb5, 0xee, 0xf6, 0xf9, 0x77,
+ 0xf7, 0x7a, 0x7a, 0xf7, 0x17, 0x96, 0xb3, 0xf1, 0xab, 0xc9, 0xdb, 0xd3, 0xb7, 0xee, 0xec, 0xfd,
+ 0xef, 0x7d, 0x23, 0xdc, 0x92, 0xeb, 0x57, 0x2b, 0xb5, 0xab, 0xd3, 0x74, 0xad, 0xda, 0x04, 0xf3,
+ 0xc4, 0x06, 0x41, 0x93, 0x72, 0x73, 0x32, 0xc0, 0xd2, 0xe4, 0x17, 0x69, 0x88, 0x15, 0x54, 0x90,
+ 0x46, 0xa7, 0x50, 0x92, 0xde, 0xae, 0x4d, 0x32, 0x77, 0xb5, 0xaa, 0x5e, 0x3c, 0x38, 0x9e, 0xfd,
+ 0xec, 0x39, 0xff, 0x67, 0xe6, 0xf1, 0xbd, 0x5f, 0xe8, 0x65, 0xdd, 0x57, 0xe7, 0x7f, 0xce, 0x0b,
+ 0x03, 0xd7, 0x0f, 0xb0, 0xf9, 0xae, 0xe4, 0xad, 0xd0, 0x6b, 0x5f, 0xec, 0x79, 0xff, 0xe0, 0x69,
+ 0x72, 0x73, 0xbe, 0x5f, 0x5d, 0xe2, 0xe5, 0x94, 0xa7, 0x1d, 0xdd, 0x6e, 0x21, 0x35, 0x8b, 0xe7,
+ 0x13, 0x8b, 0x69, 0x78, 0x27, 0x1d, 0xb7, 0x92, 0x0e, 0x20, 0x14, 0x54, 0xa8, 0x92, 0x3c, 0x11,
+ 0x25, 0x77, 0x55, 0x4c, 0x0c, 0x51, 0xa4, 0xa6, 0xe6, 0xcb, 0x3c, 0xf0, 0xda, 0x81, 0xbe, 0x9b,
+ 0x3e, 0x74, 0xcf, 0x91, 0x89, 0xd7, 0x6f, 0xea, 0x63, 0xc3, 0xf6, 0xb9, 0xff, 0xe0, 0x15, 0x8e,
+ 0xeb, 0x86, 0xd9, 0x9c, 0x5e, 0xa4, 0x79, 0xe4, 0xaa, 0xfe, 0xe1, 0xb5, 0x17, 0xc6, 0xbf, 0xdb,
+ 0x55, 0x52, 0x57, 0x78, 0x79, 0x39, 0x3b, 0x93, 0x07, 0xa5, 0x75, 0xfb, 0xf0, 0x4f, 0xd6, 0xe6,
+ 0x68, 0x6a, 0x47, 0x52, 0x00, 0x46, 0x52, 0x02, 0x98, 0x68, 0x40, 0x45, 0x80, 0x11, 0x6c, 0x24,
+ 0x04, 0x91, 0x0e, 0xc3, 0x90, 0xc7, 0xa6, 0x67, 0xf5, 0xf7, 0xd6, 0xdd, 0xbe, 0xf8, 0x97, 0xc9,
+ 0xfe, 0x83, 0x6c, 0xde, 0x31, 0xf5, 0x8b, 0xb9, 0x54, 0xf3, 0xc6, 0x9d, 0xef, 0x43, 0x55, 0x1e,
+ 0xe5, 0x8c, 0x5b, 0x13, 0x69, 0x77, 0xdf, 0xd4, 0x77, 0xce, 0xc0, 0xca, 0xf8, 0x57, 0xb2, 0xdd,
+ 0xea, 0x43, 0x8e, 0x6b, 0x2f, 0xf4, 0x0b, 0xe0, 0x64, 0xd4, 0xd2, 0x66, 0x87, 0x95, 0x56, 0xa1,
+ 0x89, 0x11, 0xc4, 0x2a, 0x54, 0x2c, 0x10, 0x2b, 0x94, 0x91, 0x94, 0xc9, 0x0a, 0x51, 0x43, 0x08,
+ 0x23, 0xbd, 0x18, 0xc7, 0x3c, 0x5a, 0xa9, 0xe9, 0x7f, 0x3a, 0x74, 0x34, 0x7f, 0xef, 0x7b, 0xbf,
+ 0x33, 0x79, 0xec, 0xdd, 0x5e, 0xbd, 0x7a, 0x57, 0xd7, 0x9c, 0x76, 0x5d, 0xb7, 0x9c, 0xcd, 0x3b,
+ 0xda, 0xb7, 0x0e, 0x5e, 0xbe, 0xbe, 0xef, 0xac, 0x81, 0xd1, 0x68, 0x8b, 0x9b, 0xd1, 0xe7, 0xbb,
+ 0xae, 0xdd, 0xe6, 0x38, 0x6c, 0xd0, 0xda, 0x16, 0xbd, 0x0c, 0xb8, 0xae, 0x4a, 0x62, 0xbb, 0x55,
+ 0xad, 0xca, 0x4e, 0x62, 0x88, 0x03, 0x21, 0x0a, 0x04, 0x13, 0xeb, 0xb2, 0x31, 0x6a, 0xa7, 0xb1,
+ 0x3c, 0xd5, 0x08, 0xd4, 0xb3, 0xe3, 0x13, 0x99, 0x67, 0x2e, 0xf8, 0xf6, 0xcc, 0xf8, 0xc9, 0xee,
+ 0xc1, 0xfc, 0xc2, 0x81, 0xb4, 0x6e, 0x47, 0x5c, 0x3b, 0xc4, 0xd8, 0xd7, 0x8f, 0xb7, 0xfe, 0xfe,
+ 0xe1, 0x65, 0x23, 0xc5, 0xd3, 0xb7, 0x2c, 0x9c, 0x5a, 0xec, 0xb7, 0x43, 0x4e, 0xd6, 0x5d, 0xae,
+ 0x2c, 0x23, 0x62, 0xed, 0x90, 0x42, 0x7a, 0x94, 0x98, 0x0c, 0xa2, 0xb5, 0x18, 0x09, 0xb0, 0x7a,
+ 0x11, 0xd4, 0x04, 0xc2, 0xdb, 0x51, 0x64, 0x8e, 0xcd, 0x96, 0x9d, 0x89, 0xe7, 0xf7, 0xac, 0x3c,
+ 0xf4, 0xdb, 0xf7, 0xbf, 0x12, 0xb4, 0xd6, 0xfe, 0x7c, 0x3f, 0x63, 0x7f, 0x34, 0xfb, 0xae, 0x65,
+ 0xfa, 0x7f, 0x4c, 0xe8, 0x21, 0x04, 0x29, 0xb0, 0x36, 0x16, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45,
+ 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82,
};
const lv_img_dsc_t img_wink_png = {
- .header.always_zero = 0,
- .header.w = 50,
- .header.h = 50,
- .data_size = 5158,
- .header.cf = LV_IMG_CF_RAW_ALPHA,
- .data = img_wink_png_map,
+ .header.always_zero = 0,
+ .header.w = 50,
+ .header.h = 50,
+ .data_size = 5158,
+ .header.cf = LV_IMG_CF_RAW_ALPHA,
+ .data = img_wink_png_map,
};
#endif /*LV_USE_PNG && LV_BUILD_EXAMPLES*/
diff --git a/examples/libs/png/lv_example_png_1.py b/examples/libs/png/lv_example_png_1.py
index a7fcdd6f2..96670f740 100755
--- a/examples/libs/png/lv_example_png_1.py
+++ b/examples/libs/png/lv_example_png_1.py
@@ -29,7 +29,7 @@
wink_argb = lv.img_dsc_t({
'data_size': len(png_data),
- 'data': png_data
+ 'data': png_data
})
img2 = lv.img(lv.scr_act())
diff --git a/examples/libs/rlottie/lv_example_rlottie_2.c b/examples/libs/rlottie/lv_example_rlottie_2.c
index 1fccdc071..6a6aa28e4 100644
--- a/examples/libs/rlottie/lv_example_rlottie_2.c
+++ b/examples/libs/rlottie/lv_example_rlottie_2.c
@@ -9,7 +9,7 @@ void lv_example_rlottie_2(void)
{
/*The rlottie library uses STDIO file API, so there is no driver letter for LVGL*/
lv_obj_t * lottie = lv_rlottie_create_from_file(lv_scr_act(), 100, 100,
- "lvgl/examples/libs/rlottie/lv_example_rlottie_approve.json");
+ "lvgl/examples/libs/rlottie/lv_example_rlottie_approve.json");
lv_obj_center(lottie);
}
diff --git a/examples/libs/rlottie/lv_example_rlottie_approve.c b/examples/libs/rlottie/lv_example_rlottie_approve.c
index a0ded8243..0c5f8f657 100644
--- a/examples/libs/rlottie/lv_example_rlottie_approve.c
+++ b/examples/libs/rlottie/lv_example_rlottie_approve.c
@@ -16,15 +16,15 @@
#if LV_BUILD_EXAMPLES && LV_USE_RLOTTIE
const uint8_t lv_example_rlottie_approve[] = {
- 0x7b, 0x22, 0x76, 0x22, 0x3a, 0x22, 0x34, 0x2e, 0x38, 0x2e, 0x30, 0x22, 0x2c, 0x22, 0x6d, 0x65, 0x74, 0x61, 0x22, 0x3a, 0x7b, 0x22, 0x67, 0x22, 0x3a, 0x22, 0x4c, 0x6f, 0x74, 0x74, 0x69, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x20, 0x41, 0x45, 0x20, 0x31, 0x2e, 0x30, 0x2e, 0x30, 0x22, 0x2c, 0x22, 0x61, 0x22, 0x3a, 0x22, 0x22, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x22, 0x22, 0x2c, 0x22, 0x64, 0x22, 0x3a, 0x22, 0x22, 0x2c, 0x22, 0x74, 0x63, 0x22, 0x3a, 0x22, 0x22, 0x7d, 0x2c, 0x22, 0x66, 0x72, 0x22, 0x3a, 0x36, 0x30, 0x2c, 0x22, 0x69, 0x70, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6f, 0x70, 0x22, 0x3a, 0x36, 0x30, 0x2c, 0x22, 0x77, 0x22, 0x3a, 0x37, 0x32, 0x30, 0x2c, 0x22, 0x68, 0x22, 0x3a, 0x37, 0x32, 0x30, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x2c, 0x22, 0x64, 0x64, 0x64, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x22, 0x3a, 0x5b, 0x5d, 0x2c, 0x22, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x64, 0x64, 0x64, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x34, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x53, 0x68, 0x61, 0x70, 0x65, 0x20, 0x4c, 0x61, 0x79, 0x65, 0x72, 0x20, 0x34, 0x22, 0x2c, 0x22, 0x73, 0x72, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x6b, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x31, 0x30, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x31, 0x7d, 0x2c, 0x22, 0x72, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x30, 0x7d, 0x2c, 0x22, 0x70, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x33, 0x33, 0x36, 0x2c, 0x33, 0x39, 0x36, 0x2c, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x7d, 0x2c, 0x22, 0x61, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x7d, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x31, 0x30, 0x30, 0x2c, 0x31, 0x30, 0x30, 0x2c, 0x31, 0x30, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x36, 0x7d, 0x7d, 0x2c, 0x22, 0x61, 0x6f, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x73, 0x68, 0x61, 0x70, 0x65, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x67, 0x72, 0x22, 0x2c, 0x22, 0x69, 0x74, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x73, 0x68, 0x22, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x6b, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x69, 0x22, 0x3a, 0x5b, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x5d, 0x2c, 0x22, 0x6f, 0x22, 0x3a, 0x5b, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x5d, 0x2c, 0x22, 0x76, 0x22, 0x3a, 0x5b, 0x5b, 0x2d, 0x31, 0x32, 0x33, 0x2c, 0x2d, 0x36, 0x36, 0x5d, 0x2c, 0x5b, 0x36, 0x2c, 0x34, 0x35, 0x5d, 0x2c, 0x5b, 0x33, 0x32, 0x31, 0x2c, 0x2d, 0x32, 0x36, 0x34, 0x5d, 0x5d, 0x2c, 0x22, 0x63, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x7d, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x50, 0x61, 0x74, 0x68, 0x20, 0x31, 0x22, 0x2c, 0x22, 0x6d, 0x6e, 0x22, 0x3a, 0x22, 0x41, 0x44, 0x42, 0x45, 0x20, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x53, 0x68, 0x61, 0x70, 0x65, 0x20, 0x2d, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x2c, 0x22, 0x68, 0x64, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x73, 0x74, 0x22, 0x2c, 0x22, 0x63, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x30, 0x2e, 0x32, 0x39, 0x38, 0x30, 0x33, 0x39, 0x32, 0x31, 0x35, 0x36, 0x38, 0x36, 0x2c, 0x30, 0x2e, 0x36, 0x38, 0x36, 0x32, 0x37, 0x34, 0x35, 0x30, 0x39, 0x38, 0x30, 0x34, 0x2c, 0x30, 0x2e, 0x33, 0x31, 0x33, 0x37, 0x32, 0x35,
- 0x34, 0x39, 0x30, 0x31, 0x39, 0x36, 0x2c, 0x31, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x33, 0x7d, 0x2c, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x31, 0x30, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x34, 0x7d, 0x2c, 0x22, 0x77, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x35, 0x32, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x35, 0x7d, 0x2c, 0x22, 0x6c, 0x63, 0x22, 0x3a, 0x32, 0x2c, 0x22, 0x6c, 0x6a, 0x22, 0x3a, 0x32, 0x2c, 0x22, 0x62, 0x6d, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x53, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x20, 0x31, 0x22, 0x2c, 0x22, 0x6d, 0x6e, 0x22, 0x3a, 0x22, 0x41, 0x44, 0x42, 0x45, 0x20, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x47, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x20, 0x2d, 0x20, 0x53, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x22, 0x2c, 0x22, 0x68, 0x64, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x74, 0x72, 0x22, 0x2c, 0x22, 0x70, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x7d, 0x2c, 0x22, 0x61, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x7d, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x31, 0x30, 0x30, 0x2c, 0x31, 0x30, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x33, 0x7d, 0x2c, 0x22, 0x72, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x36, 0x7d, 0x2c, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x31, 0x30, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x37, 0x7d, 0x2c, 0x22, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x34, 0x7d, 0x2c, 0x22, 0x73, 0x61, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x35, 0x7d, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x22, 0x7d, 0x5d, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x53, 0x68, 0x61, 0x70, 0x65, 0x20, 0x31, 0x22, 0x2c, 0x22, 0x6e, 0x70, 0x22, 0x3a, 0x33, 0x2c, 0x22, 0x63, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x2c, 0x22, 0x62, 0x6d, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x6d, 0x6e, 0x22, 0x3a, 0x22, 0x41, 0x44, 0x42, 0x45, 0x20, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x2c, 0x22, 0x68, 0x64, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x74, 0x6d, 0x22, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x7d, 0x2c, 0x22, 0x65, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x69, 0x22, 0x3a, 0x7b, 0x22, 0x78, 0x22, 0x3a, 0x5b, 0x30, 0x2e, 0x33, 0x36, 0x38, 0x5d, 0x2c, 0x22, 0x79, 0x22, 0x3a, 0x5b, 0x31, 0x5d, 0x7d, 0x2c, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x78, 0x22, 0x3a, 0x5b, 0x30, 0x2e, 0x32, 0x35, 0x31, 0x5d, 0x2c, 0x22, 0x79, 0x22, 0x3a, 0x5b, 0x30, 0x5d, 0x7d, 0x2c, 0x22, 0x74, 0x22, 0x3a, 0x31, 0x30, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x5b, 0x30, 0x5d, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x22, 0x3a, 0x34, 0x35, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x5b, 0x39, 0x32, 0x5d, 0x7d, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x7d, 0x2c, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x33, 0x7d, 0x2c, 0x22, 0x6d, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x54, 0x72, 0x69, 0x6d, 0x20, 0x50, 0x61, 0x74, 0x68, 0x73, 0x20, 0x31, 0x22, 0x2c, 0x22, 0x6d, 0x6e, 0x22, 0x3a, 0x22, 0x41, 0x44, 0x42, 0x45, 0x20, 0x56, 0x65,
- 0x63, 0x74, 0x6f, 0x72, 0x20, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x20, 0x2d, 0x20, 0x54, 0x72, 0x69, 0x6d, 0x22, 0x2c, 0x22, 0x68, 0x64, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x5d, 0x2c, 0x22, 0x69, 0x70, 0x22, 0x3a, 0x31, 0x30, 0x2c, 0x22, 0x6f, 0x70, 0x22, 0x3a, 0x36, 0x30, 0x2c, 0x22, 0x73, 0x74, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x62, 0x6d, 0x22, 0x3a, 0x30, 0x7d, 0x2c, 0x7b, 0x22, 0x64, 0x64, 0x64, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x32, 0x2c, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x34, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x53, 0x68, 0x61, 0x70, 0x65, 0x20, 0x4c, 0x61, 0x79, 0x65, 0x72, 0x20, 0x33, 0x22, 0x2c, 0x22, 0x73, 0x72, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x6b, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x31, 0x30, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x31, 0x7d, 0x2c, 0x22, 0x72, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x30, 0x7d, 0x2c, 0x22, 0x70, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x33, 0x33, 0x36, 0x2c, 0x33, 0x39, 0x36, 0x2c, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x7d, 0x2c, 0x22, 0x61, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x7d, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x31, 0x30, 0x30, 0x2c, 0x31, 0x30, 0x30, 0x2c, 0x31, 0x30, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x36, 0x7d, 0x7d, 0x2c, 0x22, 0x61, 0x6f, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x73, 0x68, 0x61, 0x70, 0x65, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x67, 0x72, 0x22, 0x2c, 0x22, 0x69, 0x74, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x73, 0x68, 0x22, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x6b, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x69, 0x22, 0x3a, 0x5b, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x5d, 0x2c, 0x22, 0x6f, 0x22, 0x3a, 0x5b, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x5d, 0x2c, 0x22, 0x76, 0x22, 0x3a, 0x5b, 0x5b, 0x2d, 0x31, 0x32, 0x33, 0x2c, 0x2d, 0x36, 0x36, 0x5d, 0x2c, 0x5b, 0x36, 0x2c, 0x34, 0x35, 0x5d, 0x2c, 0x5b, 0x33, 0x32, 0x31, 0x2c, 0x2d, 0x32, 0x36, 0x34, 0x5d, 0x5d, 0x2c, 0x22, 0x63, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x7d, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x50, 0x61, 0x74, 0x68, 0x20, 0x31, 0x22, 0x2c, 0x22, 0x6d, 0x6e, 0x22, 0x3a, 0x22, 0x41, 0x44, 0x42, 0x45, 0x20, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x53, 0x68, 0x61, 0x70, 0x65, 0x20, 0x2d, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x2c, 0x22, 0x68, 0x64, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x73, 0x74, 0x22, 0x2c, 0x22, 0x63, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x30, 0x2e, 0x32, 0x31, 0x39, 0x36, 0x30, 0x37, 0x38, 0x34, 0x33, 0x31, 0x33, 0x37, 0x2c, 0x30, 0x2e, 0x35, 0x35, 0x36, 0x38, 0x36, 0x32, 0x37, 0x34, 0x35, 0x30, 0x39, 0x38, 0x2c, 0x30, 0x2e, 0x32, 0x33, 0x35, 0x32, 0x39, 0x34, 0x31, 0x31, 0x37, 0x36, 0x34, 0x37, 0x2c, 0x31, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x33, 0x7d, 0x2c, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x31, 0x30, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x34, 0x7d, 0x2c, 0x22, 0x77, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x34, 0x38, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x35, 0x7d, 0x2c, 0x22, 0x6c, 0x63, 0x22, 0x3a, 0x32, 0x2c, 0x22, 0x6c, 0x6a, 0x22, 0x3a, 0x32, 0x2c, 0x22, 0x62, 0x6d, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22,
- 0x53, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x20, 0x31, 0x22, 0x2c, 0x22, 0x6d, 0x6e, 0x22, 0x3a, 0x22, 0x41, 0x44, 0x42, 0x45, 0x20, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x47, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x20, 0x2d, 0x20, 0x53, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x22, 0x2c, 0x22, 0x68, 0x64, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x74, 0x72, 0x22, 0x2c, 0x22, 0x70, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x7d, 0x2c, 0x22, 0x61, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x7d, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x31, 0x30, 0x30, 0x2c, 0x31, 0x30, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x33, 0x7d, 0x2c, 0x22, 0x72, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x36, 0x7d, 0x2c, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x31, 0x30, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x37, 0x7d, 0x2c, 0x22, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x34, 0x7d, 0x2c, 0x22, 0x73, 0x61, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x35, 0x7d, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x22, 0x7d, 0x5d, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x53, 0x68, 0x61, 0x70, 0x65, 0x20, 0x31, 0x22, 0x2c, 0x22, 0x6e, 0x70, 0x22, 0x3a, 0x33, 0x2c, 0x22, 0x63, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x2c, 0x22, 0x62, 0x6d, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x6d, 0x6e, 0x22, 0x3a, 0x22, 0x41, 0x44, 0x42, 0x45, 0x20, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x2c, 0x22, 0x68, 0x64, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x74, 0x6d, 0x22, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x7d, 0x2c, 0x22, 0x65, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x69, 0x22, 0x3a, 0x7b, 0x22, 0x78, 0x22, 0x3a, 0x5b, 0x30, 0x2e, 0x33, 0x36, 0x38, 0x5d, 0x2c, 0x22, 0x79, 0x22, 0x3a, 0x5b, 0x31, 0x5d, 0x7d, 0x2c, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x78, 0x22, 0x3a, 0x5b, 0x30, 0x2e, 0x32, 0x35, 0x31, 0x5d, 0x2c, 0x22, 0x79, 0x22, 0x3a, 0x5b, 0x30, 0x5d, 0x7d, 0x2c, 0x22, 0x74, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x5b, 0x30, 0x5d, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x22, 0x3a, 0x34, 0x30, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x5b, 0x31, 0x30, 0x30, 0x5d, 0x7d, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x7d, 0x2c, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x33, 0x7d, 0x2c, 0x22, 0x6d, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x54, 0x72, 0x69, 0x6d, 0x20, 0x50, 0x61, 0x74, 0x68, 0x73, 0x20, 0x31, 0x22, 0x2c, 0x22, 0x6d, 0x6e, 0x22, 0x3a, 0x22, 0x41, 0x44, 0x42, 0x45, 0x20, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x20, 0x2d, 0x20, 0x54, 0x72, 0x69, 0x6d, 0x22, 0x2c, 0x22, 0x68, 0x64, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x5d, 0x2c, 0x22, 0x69, 0x70, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6f, 0x70, 0x22, 0x3a, 0x36, 0x30, 0x2c, 0x22, 0x73, 0x74, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x62, 0x6d, 0x22, 0x3a, 0x30, 0x7d, 0x2c, 0x7b, 0x22, 0x64, 0x64, 0x64, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x33, 0x2c, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x34, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x53, 0x68, 0x61, 0x70, 0x65,
- 0x20, 0x4c, 0x61, 0x79, 0x65, 0x72, 0x20, 0x32, 0x22, 0x2c, 0x22, 0x73, 0x72, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x6b, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x31, 0x30, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x31, 0x7d, 0x2c, 0x22, 0x72, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x38, 0x37, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x30, 0x7d, 0x2c, 0x22, 0x70, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x33, 0x33, 0x36, 0x2c, 0x33, 0x36, 0x36, 0x2c, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x7d, 0x2c, 0x22, 0x61, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x7d, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x31, 0x30, 0x30, 0x2c, 0x31, 0x30, 0x30, 0x2c, 0x31, 0x30, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x36, 0x7d, 0x7d, 0x2c, 0x22, 0x61, 0x6f, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x73, 0x68, 0x61, 0x70, 0x65, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x67, 0x72, 0x22, 0x2c, 0x22, 0x69, 0x74, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x64, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x65, 0x6c, 0x22, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x35, 0x32, 0x30, 0x2c, 0x35, 0x32, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x7d, 0x2c, 0x22, 0x70, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x33, 0x7d, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x45, 0x6c, 0x6c, 0x69, 0x70, 0x73, 0x65, 0x20, 0x50, 0x61, 0x74, 0x68, 0x20, 0x31, 0x22, 0x2c, 0x22, 0x6d, 0x6e, 0x22, 0x3a, 0x22, 0x41, 0x44, 0x42, 0x45, 0x20, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x53, 0x68, 0x61, 0x70, 0x65, 0x20, 0x2d, 0x20, 0x45, 0x6c, 0x6c, 0x69, 0x70, 0x73, 0x65, 0x22, 0x2c, 0x22, 0x68, 0x64, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x73, 0x74, 0x22, 0x2c, 0x22, 0x63, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x30, 0x2e, 0x32, 0x39, 0x38, 0x30, 0x33, 0x39, 0x32, 0x31, 0x35, 0x36, 0x38, 0x36, 0x2c, 0x30, 0x2e, 0x36, 0x38, 0x36, 0x32, 0x37, 0x34, 0x35, 0x30, 0x39, 0x38, 0x30, 0x34, 0x2c, 0x30, 0x2e, 0x33, 0x31, 0x33, 0x37, 0x32, 0x35, 0x34, 0x39, 0x30, 0x31, 0x39, 0x36, 0x2c, 0x31, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x33, 0x7d, 0x2c, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x31, 0x30, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x34, 0x7d, 0x2c, 0x22, 0x77, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x35, 0x32, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x35, 0x7d, 0x2c, 0x22, 0x6c, 0x63, 0x22, 0x3a, 0x32, 0x2c, 0x22, 0x6c, 0x6a, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x6d, 0x6c, 0x22, 0x3a, 0x34, 0x2c, 0x22, 0x62, 0x6d, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x53, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x20, 0x31, 0x22, 0x2c, 0x22, 0x6d, 0x6e, 0x22, 0x3a, 0x22, 0x41, 0x44, 0x42, 0x45, 0x20, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x47, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x20, 0x2d, 0x20, 0x53, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x22, 0x2c, 0x22, 0x68, 0x64, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x74, 0x72, 0x22, 0x2c, 0x22, 0x70, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x7d, 0x2c, 0x22, 0x61, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x7d, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x31, 0x30, 0x30, 0x2c,
- 0x31, 0x30, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x33, 0x7d, 0x2c, 0x22, 0x72, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x36, 0x7d, 0x2c, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x31, 0x30, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x37, 0x7d, 0x2c, 0x22, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x34, 0x7d, 0x2c, 0x22, 0x73, 0x61, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x35, 0x7d, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x22, 0x7d, 0x5d, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x45, 0x6c, 0x6c, 0x69, 0x70, 0x73, 0x65, 0x20, 0x31, 0x22, 0x2c, 0x22, 0x6e, 0x70, 0x22, 0x3a, 0x33, 0x2c, 0x22, 0x63, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x2c, 0x22, 0x62, 0x6d, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x6d, 0x6e, 0x22, 0x3a, 0x22, 0x41, 0x44, 0x42, 0x45, 0x20, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x2c, 0x22, 0x68, 0x64, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x74, 0x6d, 0x22, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x7d, 0x2c, 0x22, 0x65, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x69, 0x22, 0x3a, 0x7b, 0x22, 0x78, 0x22, 0x3a, 0x5b, 0x30, 0x2e, 0x33, 0x33, 0x37, 0x5d, 0x2c, 0x22, 0x79, 0x22, 0x3a, 0x5b, 0x31, 0x5d, 0x7d, 0x2c, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x78, 0x22, 0x3a, 0x5b, 0x30, 0x2e, 0x33, 0x33, 0x34, 0x5d, 0x2c, 0x22, 0x79, 0x22, 0x3a, 0x5b, 0x30, 0x5d, 0x7d, 0x2c, 0x22, 0x74, 0x22, 0x3a, 0x31, 0x30, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x5b, 0x30, 0x5d, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x22, 0x3a, 0x34, 0x35, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x5b, 0x38, 0x30, 0x5d, 0x7d, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x7d, 0x2c, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x33, 0x7d, 0x2c, 0x22, 0x6d, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x54, 0x72, 0x69, 0x6d, 0x20, 0x50, 0x61, 0x74, 0x68, 0x73, 0x20, 0x31, 0x22, 0x2c, 0x22, 0x6d, 0x6e, 0x22, 0x3a, 0x22, 0x41, 0x44, 0x42, 0x45, 0x20, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x20, 0x2d, 0x20, 0x54, 0x72, 0x69, 0x6d, 0x22, 0x2c, 0x22, 0x68, 0x64, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x5d, 0x2c, 0x22, 0x69, 0x70, 0x22, 0x3a, 0x31, 0x30, 0x2c, 0x22, 0x6f, 0x70, 0x22, 0x3a, 0x36, 0x30, 0x2c, 0x22, 0x73, 0x74, 0x22, 0x3a, 0x31, 0x30, 0x2c, 0x22, 0x62, 0x6d, 0x22, 0x3a, 0x30, 0x7d, 0x2c, 0x7b, 0x22, 0x64, 0x64, 0x64, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x34, 0x2c, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x34, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x53, 0x68, 0x61, 0x70, 0x65, 0x20, 0x4c, 0x61, 0x79, 0x65, 0x72, 0x20, 0x31, 0x22, 0x2c, 0x22, 0x73, 0x72, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x6b, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x31, 0x30, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x31, 0x7d, 0x2c, 0x22, 0x72, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x38, 0x37, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x30, 0x7d, 0x2c, 0x22, 0x70, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x33, 0x33, 0x36, 0x2c, 0x33, 0x36, 0x36, 0x2c, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x7d, 0x2c, 0x22, 0x61, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x7d,
- 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x31, 0x30, 0x30, 0x2c, 0x31, 0x30, 0x30, 0x2c, 0x31, 0x30, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x36, 0x7d, 0x7d, 0x2c, 0x22, 0x61, 0x6f, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x73, 0x68, 0x61, 0x70, 0x65, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x67, 0x72, 0x22, 0x2c, 0x22, 0x69, 0x74, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x64, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x65, 0x6c, 0x22, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x35, 0x32, 0x30, 0x2c, 0x35, 0x32, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x7d, 0x2c, 0x22, 0x70, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x33, 0x7d, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x45, 0x6c, 0x6c, 0x69, 0x70, 0x73, 0x65, 0x20, 0x50, 0x61, 0x74, 0x68, 0x20, 0x31, 0x22, 0x2c, 0x22, 0x6d, 0x6e, 0x22, 0x3a, 0x22, 0x41, 0x44, 0x42, 0x45, 0x20, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x53, 0x68, 0x61, 0x70, 0x65, 0x20, 0x2d, 0x20, 0x45, 0x6c, 0x6c, 0x69, 0x70, 0x73, 0x65, 0x22, 0x2c, 0x22, 0x68, 0x64, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x73, 0x74, 0x22, 0x2c, 0x22, 0x63, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x30, 0x2e, 0x32, 0x31, 0x39, 0x36, 0x30, 0x37, 0x38, 0x34, 0x33, 0x31, 0x33, 0x37, 0x2c, 0x30, 0x2e, 0x35, 0x35, 0x36, 0x38, 0x36, 0x32, 0x37, 0x34, 0x35, 0x30, 0x39, 0x38, 0x2c, 0x30, 0x2e, 0x32, 0x33, 0x35, 0x32, 0x39, 0x34, 0x31, 0x31, 0x37, 0x36, 0x34, 0x37, 0x2c, 0x31, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x33, 0x7d, 0x2c, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x31, 0x30, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x34, 0x7d, 0x2c, 0x22, 0x77, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x34, 0x38, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x35, 0x7d, 0x2c, 0x22, 0x6c, 0x63, 0x22, 0x3a, 0x32, 0x2c, 0x22, 0x6c, 0x6a, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x6d, 0x6c, 0x22, 0x3a, 0x34, 0x2c, 0x22, 0x62, 0x6d, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x53, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x20, 0x31, 0x22, 0x2c, 0x22, 0x6d, 0x6e, 0x22, 0x3a, 0x22, 0x41, 0x44, 0x42, 0x45, 0x20, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x47, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x20, 0x2d, 0x20, 0x53, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x22, 0x2c, 0x22, 0x68, 0x64, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x74, 0x72, 0x22, 0x2c, 0x22, 0x70, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x7d, 0x2c, 0x22, 0x61, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x7d, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x31, 0x30, 0x30, 0x2c, 0x31, 0x30, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x33, 0x7d, 0x2c, 0x22, 0x72, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x36, 0x7d, 0x2c, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x31, 0x30, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x37, 0x7d, 0x2c, 0x22, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x34, 0x7d, 0x2c, 0x22, 0x73, 0x61, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x35, 0x7d, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x22, 0x7d, 0x5d, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x45,
- 0x6c, 0x6c, 0x69, 0x70, 0x73, 0x65, 0x20, 0x31, 0x22, 0x2c, 0x22, 0x6e, 0x70, 0x22, 0x3a, 0x33, 0x2c, 0x22, 0x63, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x2c, 0x22, 0x62, 0x6d, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x6d, 0x6e, 0x22, 0x3a, 0x22, 0x41, 0x44, 0x42, 0x45, 0x20, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x2c, 0x22, 0x68, 0x64, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x74, 0x6d, 0x22, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x7d, 0x2c, 0x22, 0x65, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x69, 0x22, 0x3a, 0x7b, 0x22, 0x78, 0x22, 0x3a, 0x5b, 0x30, 0x2e, 0x33, 0x36, 0x38, 0x5d, 0x2c, 0x22, 0x79, 0x22, 0x3a, 0x5b, 0x31, 0x5d, 0x7d, 0x2c, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x78, 0x22, 0x3a, 0x5b, 0x30, 0x2e, 0x32, 0x35, 0x31, 0x5d, 0x2c, 0x22, 0x79, 0x22, 0x3a, 0x5b, 0x30, 0x5d, 0x7d, 0x2c, 0x22, 0x74, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x5b, 0x30, 0x5d, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x22, 0x3a, 0x34, 0x30, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x5b, 0x38, 0x34, 0x5d, 0x7d, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x7d, 0x2c, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x33, 0x7d, 0x2c, 0x22, 0x6d, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x54, 0x72, 0x69, 0x6d, 0x20, 0x50, 0x61, 0x74, 0x68, 0x73, 0x20, 0x31, 0x22, 0x2c, 0x22, 0x6d, 0x6e, 0x22, 0x3a, 0x22, 0x41, 0x44, 0x42, 0x45, 0x20, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x20, 0x2d, 0x20, 0x54, 0x72, 0x69, 0x6d, 0x22, 0x2c, 0x22, 0x68, 0x64, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x5d, 0x2c, 0x22, 0x69, 0x70, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6f, 0x70, 0x22, 0x3a, 0x36, 0x30, 0x2c, 0x22, 0x73, 0x74, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x62, 0x6d, 0x22, 0x3a, 0x30, 0x7d, 0x5d, 0x2c, 0x22, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x5b, 0x5d, 0x7d,
- 0x00 /*Close the string*/
+ 0x7b, 0x22, 0x76, 0x22, 0x3a, 0x22, 0x34, 0x2e, 0x38, 0x2e, 0x30, 0x22, 0x2c, 0x22, 0x6d, 0x65, 0x74, 0x61, 0x22, 0x3a, 0x7b, 0x22, 0x67, 0x22, 0x3a, 0x22, 0x4c, 0x6f, 0x74, 0x74, 0x69, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x20, 0x41, 0x45, 0x20, 0x31, 0x2e, 0x30, 0x2e, 0x30, 0x22, 0x2c, 0x22, 0x61, 0x22, 0x3a, 0x22, 0x22, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x22, 0x22, 0x2c, 0x22, 0x64, 0x22, 0x3a, 0x22, 0x22, 0x2c, 0x22, 0x74, 0x63, 0x22, 0x3a, 0x22, 0x22, 0x7d, 0x2c, 0x22, 0x66, 0x72, 0x22, 0x3a, 0x36, 0x30, 0x2c, 0x22, 0x69, 0x70, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6f, 0x70, 0x22, 0x3a, 0x36, 0x30, 0x2c, 0x22, 0x77, 0x22, 0x3a, 0x37, 0x32, 0x30, 0x2c, 0x22, 0x68, 0x22, 0x3a, 0x37, 0x32, 0x30, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x2c, 0x22, 0x64, 0x64, 0x64, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x22, 0x3a, 0x5b, 0x5d, 0x2c, 0x22, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x64, 0x64, 0x64, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x34, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x53, 0x68, 0x61, 0x70, 0x65, 0x20, 0x4c, 0x61, 0x79, 0x65, 0x72, 0x20, 0x34, 0x22, 0x2c, 0x22, 0x73, 0x72, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x6b, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x31, 0x30, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x31, 0x7d, 0x2c, 0x22, 0x72, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x30, 0x7d, 0x2c, 0x22, 0x70, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x33, 0x33, 0x36, 0x2c, 0x33, 0x39, 0x36, 0x2c, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x7d, 0x2c, 0x22, 0x61, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x7d, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x31, 0x30, 0x30, 0x2c, 0x31, 0x30, 0x30, 0x2c, 0x31, 0x30, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x36, 0x7d, 0x7d, 0x2c, 0x22, 0x61, 0x6f, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x73, 0x68, 0x61, 0x70, 0x65, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x67, 0x72, 0x22, 0x2c, 0x22, 0x69, 0x74, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x73, 0x68, 0x22, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x6b, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x69, 0x22, 0x3a, 0x5b, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x5d, 0x2c, 0x22, 0x6f, 0x22, 0x3a, 0x5b, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x5d, 0x2c, 0x22, 0x76, 0x22, 0x3a, 0x5b, 0x5b, 0x2d, 0x31, 0x32, 0x33, 0x2c, 0x2d, 0x36, 0x36, 0x5d, 0x2c, 0x5b, 0x36, 0x2c, 0x34, 0x35, 0x5d, 0x2c, 0x5b, 0x33, 0x32, 0x31, 0x2c, 0x2d, 0x32, 0x36, 0x34, 0x5d, 0x5d, 0x2c, 0x22, 0x63, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x7d, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x50, 0x61, 0x74, 0x68, 0x20, 0x31, 0x22, 0x2c, 0x22, 0x6d, 0x6e, 0x22, 0x3a, 0x22, 0x41, 0x44, 0x42, 0x45, 0x20, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x53, 0x68, 0x61, 0x70, 0x65, 0x20, 0x2d, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x2c, 0x22, 0x68, 0x64, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x73, 0x74, 0x22, 0x2c, 0x22, 0x63, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x30, 0x2e, 0x32, 0x39, 0x38, 0x30, 0x33, 0x39, 0x32, 0x31, 0x35, 0x36, 0x38, 0x36, 0x2c, 0x30, 0x2e, 0x36, 0x38, 0x36, 0x32, 0x37, 0x34, 0x35, 0x30, 0x39, 0x38, 0x30, 0x34, 0x2c, 0x30, 0x2e, 0x33, 0x31, 0x33, 0x37, 0x32, 0x35,
+ 0x34, 0x39, 0x30, 0x31, 0x39, 0x36, 0x2c, 0x31, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x33, 0x7d, 0x2c, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x31, 0x30, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x34, 0x7d, 0x2c, 0x22, 0x77, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x35, 0x32, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x35, 0x7d, 0x2c, 0x22, 0x6c, 0x63, 0x22, 0x3a, 0x32, 0x2c, 0x22, 0x6c, 0x6a, 0x22, 0x3a, 0x32, 0x2c, 0x22, 0x62, 0x6d, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x53, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x20, 0x31, 0x22, 0x2c, 0x22, 0x6d, 0x6e, 0x22, 0x3a, 0x22, 0x41, 0x44, 0x42, 0x45, 0x20, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x47, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x20, 0x2d, 0x20, 0x53, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x22, 0x2c, 0x22, 0x68, 0x64, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x74, 0x72, 0x22, 0x2c, 0x22, 0x70, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x7d, 0x2c, 0x22, 0x61, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x7d, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x31, 0x30, 0x30, 0x2c, 0x31, 0x30, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x33, 0x7d, 0x2c, 0x22, 0x72, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x36, 0x7d, 0x2c, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x31, 0x30, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x37, 0x7d, 0x2c, 0x22, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x34, 0x7d, 0x2c, 0x22, 0x73, 0x61, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x35, 0x7d, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x22, 0x7d, 0x5d, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x53, 0x68, 0x61, 0x70, 0x65, 0x20, 0x31, 0x22, 0x2c, 0x22, 0x6e, 0x70, 0x22, 0x3a, 0x33, 0x2c, 0x22, 0x63, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x2c, 0x22, 0x62, 0x6d, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x6d, 0x6e, 0x22, 0x3a, 0x22, 0x41, 0x44, 0x42, 0x45, 0x20, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x2c, 0x22, 0x68, 0x64, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x74, 0x6d, 0x22, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x7d, 0x2c, 0x22, 0x65, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x69, 0x22, 0x3a, 0x7b, 0x22, 0x78, 0x22, 0x3a, 0x5b, 0x30, 0x2e, 0x33, 0x36, 0x38, 0x5d, 0x2c, 0x22, 0x79, 0x22, 0x3a, 0x5b, 0x31, 0x5d, 0x7d, 0x2c, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x78, 0x22, 0x3a, 0x5b, 0x30, 0x2e, 0x32, 0x35, 0x31, 0x5d, 0x2c, 0x22, 0x79, 0x22, 0x3a, 0x5b, 0x30, 0x5d, 0x7d, 0x2c, 0x22, 0x74, 0x22, 0x3a, 0x31, 0x30, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x5b, 0x30, 0x5d, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x22, 0x3a, 0x34, 0x35, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x5b, 0x39, 0x32, 0x5d, 0x7d, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x7d, 0x2c, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x33, 0x7d, 0x2c, 0x22, 0x6d, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x54, 0x72, 0x69, 0x6d, 0x20, 0x50, 0x61, 0x74, 0x68, 0x73, 0x20, 0x31, 0x22, 0x2c, 0x22, 0x6d, 0x6e, 0x22, 0x3a, 0x22, 0x41, 0x44, 0x42, 0x45, 0x20, 0x56, 0x65,
+ 0x63, 0x74, 0x6f, 0x72, 0x20, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x20, 0x2d, 0x20, 0x54, 0x72, 0x69, 0x6d, 0x22, 0x2c, 0x22, 0x68, 0x64, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x5d, 0x2c, 0x22, 0x69, 0x70, 0x22, 0x3a, 0x31, 0x30, 0x2c, 0x22, 0x6f, 0x70, 0x22, 0x3a, 0x36, 0x30, 0x2c, 0x22, 0x73, 0x74, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x62, 0x6d, 0x22, 0x3a, 0x30, 0x7d, 0x2c, 0x7b, 0x22, 0x64, 0x64, 0x64, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x32, 0x2c, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x34, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x53, 0x68, 0x61, 0x70, 0x65, 0x20, 0x4c, 0x61, 0x79, 0x65, 0x72, 0x20, 0x33, 0x22, 0x2c, 0x22, 0x73, 0x72, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x6b, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x31, 0x30, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x31, 0x7d, 0x2c, 0x22, 0x72, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x30, 0x7d, 0x2c, 0x22, 0x70, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x33, 0x33, 0x36, 0x2c, 0x33, 0x39, 0x36, 0x2c, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x7d, 0x2c, 0x22, 0x61, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x7d, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x31, 0x30, 0x30, 0x2c, 0x31, 0x30, 0x30, 0x2c, 0x31, 0x30, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x36, 0x7d, 0x7d, 0x2c, 0x22, 0x61, 0x6f, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x73, 0x68, 0x61, 0x70, 0x65, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x67, 0x72, 0x22, 0x2c, 0x22, 0x69, 0x74, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x73, 0x68, 0x22, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x6b, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x69, 0x22, 0x3a, 0x5b, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x5d, 0x2c, 0x22, 0x6f, 0x22, 0x3a, 0x5b, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x5d, 0x2c, 0x22, 0x76, 0x22, 0x3a, 0x5b, 0x5b, 0x2d, 0x31, 0x32, 0x33, 0x2c, 0x2d, 0x36, 0x36, 0x5d, 0x2c, 0x5b, 0x36, 0x2c, 0x34, 0x35, 0x5d, 0x2c, 0x5b, 0x33, 0x32, 0x31, 0x2c, 0x2d, 0x32, 0x36, 0x34, 0x5d, 0x5d, 0x2c, 0x22, 0x63, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x7d, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x50, 0x61, 0x74, 0x68, 0x20, 0x31, 0x22, 0x2c, 0x22, 0x6d, 0x6e, 0x22, 0x3a, 0x22, 0x41, 0x44, 0x42, 0x45, 0x20, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x53, 0x68, 0x61, 0x70, 0x65, 0x20, 0x2d, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x2c, 0x22, 0x68, 0x64, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x73, 0x74, 0x22, 0x2c, 0x22, 0x63, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x30, 0x2e, 0x32, 0x31, 0x39, 0x36, 0x30, 0x37, 0x38, 0x34, 0x33, 0x31, 0x33, 0x37, 0x2c, 0x30, 0x2e, 0x35, 0x35, 0x36, 0x38, 0x36, 0x32, 0x37, 0x34, 0x35, 0x30, 0x39, 0x38, 0x2c, 0x30, 0x2e, 0x32, 0x33, 0x35, 0x32, 0x39, 0x34, 0x31, 0x31, 0x37, 0x36, 0x34, 0x37, 0x2c, 0x31, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x33, 0x7d, 0x2c, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x31, 0x30, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x34, 0x7d, 0x2c, 0x22, 0x77, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x34, 0x38, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x35, 0x7d, 0x2c, 0x22, 0x6c, 0x63, 0x22, 0x3a, 0x32, 0x2c, 0x22, 0x6c, 0x6a, 0x22, 0x3a, 0x32, 0x2c, 0x22, 0x62, 0x6d, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22,
+ 0x53, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x20, 0x31, 0x22, 0x2c, 0x22, 0x6d, 0x6e, 0x22, 0x3a, 0x22, 0x41, 0x44, 0x42, 0x45, 0x20, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x47, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x20, 0x2d, 0x20, 0x53, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x22, 0x2c, 0x22, 0x68, 0x64, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x74, 0x72, 0x22, 0x2c, 0x22, 0x70, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x7d, 0x2c, 0x22, 0x61, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x7d, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x31, 0x30, 0x30, 0x2c, 0x31, 0x30, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x33, 0x7d, 0x2c, 0x22, 0x72, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x36, 0x7d, 0x2c, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x31, 0x30, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x37, 0x7d, 0x2c, 0x22, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x34, 0x7d, 0x2c, 0x22, 0x73, 0x61, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x35, 0x7d, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x22, 0x7d, 0x5d, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x53, 0x68, 0x61, 0x70, 0x65, 0x20, 0x31, 0x22, 0x2c, 0x22, 0x6e, 0x70, 0x22, 0x3a, 0x33, 0x2c, 0x22, 0x63, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x2c, 0x22, 0x62, 0x6d, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x6d, 0x6e, 0x22, 0x3a, 0x22, 0x41, 0x44, 0x42, 0x45, 0x20, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x2c, 0x22, 0x68, 0x64, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x74, 0x6d, 0x22, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x7d, 0x2c, 0x22, 0x65, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x69, 0x22, 0x3a, 0x7b, 0x22, 0x78, 0x22, 0x3a, 0x5b, 0x30, 0x2e, 0x33, 0x36, 0x38, 0x5d, 0x2c, 0x22, 0x79, 0x22, 0x3a, 0x5b, 0x31, 0x5d, 0x7d, 0x2c, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x78, 0x22, 0x3a, 0x5b, 0x30, 0x2e, 0x32, 0x35, 0x31, 0x5d, 0x2c, 0x22, 0x79, 0x22, 0x3a, 0x5b, 0x30, 0x5d, 0x7d, 0x2c, 0x22, 0x74, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x5b, 0x30, 0x5d, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x22, 0x3a, 0x34, 0x30, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x5b, 0x31, 0x30, 0x30, 0x5d, 0x7d, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x7d, 0x2c, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x33, 0x7d, 0x2c, 0x22, 0x6d, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x54, 0x72, 0x69, 0x6d, 0x20, 0x50, 0x61, 0x74, 0x68, 0x73, 0x20, 0x31, 0x22, 0x2c, 0x22, 0x6d, 0x6e, 0x22, 0x3a, 0x22, 0x41, 0x44, 0x42, 0x45, 0x20, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x20, 0x2d, 0x20, 0x54, 0x72, 0x69, 0x6d, 0x22, 0x2c, 0x22, 0x68, 0x64, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x5d, 0x2c, 0x22, 0x69, 0x70, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6f, 0x70, 0x22, 0x3a, 0x36, 0x30, 0x2c, 0x22, 0x73, 0x74, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x62, 0x6d, 0x22, 0x3a, 0x30, 0x7d, 0x2c, 0x7b, 0x22, 0x64, 0x64, 0x64, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x33, 0x2c, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x34, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x53, 0x68, 0x61, 0x70, 0x65,
+ 0x20, 0x4c, 0x61, 0x79, 0x65, 0x72, 0x20, 0x32, 0x22, 0x2c, 0x22, 0x73, 0x72, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x6b, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x31, 0x30, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x31, 0x7d, 0x2c, 0x22, 0x72, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x38, 0x37, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x30, 0x7d, 0x2c, 0x22, 0x70, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x33, 0x33, 0x36, 0x2c, 0x33, 0x36, 0x36, 0x2c, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x7d, 0x2c, 0x22, 0x61, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x7d, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x31, 0x30, 0x30, 0x2c, 0x31, 0x30, 0x30, 0x2c, 0x31, 0x30, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x36, 0x7d, 0x7d, 0x2c, 0x22, 0x61, 0x6f, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x73, 0x68, 0x61, 0x70, 0x65, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x67, 0x72, 0x22, 0x2c, 0x22, 0x69, 0x74, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x64, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x65, 0x6c, 0x22, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x35, 0x32, 0x30, 0x2c, 0x35, 0x32, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x7d, 0x2c, 0x22, 0x70, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x33, 0x7d, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x45, 0x6c, 0x6c, 0x69, 0x70, 0x73, 0x65, 0x20, 0x50, 0x61, 0x74, 0x68, 0x20, 0x31, 0x22, 0x2c, 0x22, 0x6d, 0x6e, 0x22, 0x3a, 0x22, 0x41, 0x44, 0x42, 0x45, 0x20, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x53, 0x68, 0x61, 0x70, 0x65, 0x20, 0x2d, 0x20, 0x45, 0x6c, 0x6c, 0x69, 0x70, 0x73, 0x65, 0x22, 0x2c, 0x22, 0x68, 0x64, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x73, 0x74, 0x22, 0x2c, 0x22, 0x63, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x30, 0x2e, 0x32, 0x39, 0x38, 0x30, 0x33, 0x39, 0x32, 0x31, 0x35, 0x36, 0x38, 0x36, 0x2c, 0x30, 0x2e, 0x36, 0x38, 0x36, 0x32, 0x37, 0x34, 0x35, 0x30, 0x39, 0x38, 0x30, 0x34, 0x2c, 0x30, 0x2e, 0x33, 0x31, 0x33, 0x37, 0x32, 0x35, 0x34, 0x39, 0x30, 0x31, 0x39, 0x36, 0x2c, 0x31, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x33, 0x7d, 0x2c, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x31, 0x30, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x34, 0x7d, 0x2c, 0x22, 0x77, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x35, 0x32, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x35, 0x7d, 0x2c, 0x22, 0x6c, 0x63, 0x22, 0x3a, 0x32, 0x2c, 0x22, 0x6c, 0x6a, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x6d, 0x6c, 0x22, 0x3a, 0x34, 0x2c, 0x22, 0x62, 0x6d, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x53, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x20, 0x31, 0x22, 0x2c, 0x22, 0x6d, 0x6e, 0x22, 0x3a, 0x22, 0x41, 0x44, 0x42, 0x45, 0x20, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x47, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x20, 0x2d, 0x20, 0x53, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x22, 0x2c, 0x22, 0x68, 0x64, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x74, 0x72, 0x22, 0x2c, 0x22, 0x70, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x7d, 0x2c, 0x22, 0x61, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x7d, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x31, 0x30, 0x30, 0x2c,
+ 0x31, 0x30, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x33, 0x7d, 0x2c, 0x22, 0x72, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x36, 0x7d, 0x2c, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x31, 0x30, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x37, 0x7d, 0x2c, 0x22, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x34, 0x7d, 0x2c, 0x22, 0x73, 0x61, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x35, 0x7d, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x22, 0x7d, 0x5d, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x45, 0x6c, 0x6c, 0x69, 0x70, 0x73, 0x65, 0x20, 0x31, 0x22, 0x2c, 0x22, 0x6e, 0x70, 0x22, 0x3a, 0x33, 0x2c, 0x22, 0x63, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x2c, 0x22, 0x62, 0x6d, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x6d, 0x6e, 0x22, 0x3a, 0x22, 0x41, 0x44, 0x42, 0x45, 0x20, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x2c, 0x22, 0x68, 0x64, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x74, 0x6d, 0x22, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x7d, 0x2c, 0x22, 0x65, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x69, 0x22, 0x3a, 0x7b, 0x22, 0x78, 0x22, 0x3a, 0x5b, 0x30, 0x2e, 0x33, 0x33, 0x37, 0x5d, 0x2c, 0x22, 0x79, 0x22, 0x3a, 0x5b, 0x31, 0x5d, 0x7d, 0x2c, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x78, 0x22, 0x3a, 0x5b, 0x30, 0x2e, 0x33, 0x33, 0x34, 0x5d, 0x2c, 0x22, 0x79, 0x22, 0x3a, 0x5b, 0x30, 0x5d, 0x7d, 0x2c, 0x22, 0x74, 0x22, 0x3a, 0x31, 0x30, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x5b, 0x30, 0x5d, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x22, 0x3a, 0x34, 0x35, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x5b, 0x38, 0x30, 0x5d, 0x7d, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x7d, 0x2c, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x33, 0x7d, 0x2c, 0x22, 0x6d, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x54, 0x72, 0x69, 0x6d, 0x20, 0x50, 0x61, 0x74, 0x68, 0x73, 0x20, 0x31, 0x22, 0x2c, 0x22, 0x6d, 0x6e, 0x22, 0x3a, 0x22, 0x41, 0x44, 0x42, 0x45, 0x20, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x20, 0x2d, 0x20, 0x54, 0x72, 0x69, 0x6d, 0x22, 0x2c, 0x22, 0x68, 0x64, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x5d, 0x2c, 0x22, 0x69, 0x70, 0x22, 0x3a, 0x31, 0x30, 0x2c, 0x22, 0x6f, 0x70, 0x22, 0x3a, 0x36, 0x30, 0x2c, 0x22, 0x73, 0x74, 0x22, 0x3a, 0x31, 0x30, 0x2c, 0x22, 0x62, 0x6d, 0x22, 0x3a, 0x30, 0x7d, 0x2c, 0x7b, 0x22, 0x64, 0x64, 0x64, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x34, 0x2c, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x34, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x53, 0x68, 0x61, 0x70, 0x65, 0x20, 0x4c, 0x61, 0x79, 0x65, 0x72, 0x20, 0x31, 0x22, 0x2c, 0x22, 0x73, 0x72, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x6b, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x31, 0x30, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x31, 0x7d, 0x2c, 0x22, 0x72, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x38, 0x37, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x30, 0x7d, 0x2c, 0x22, 0x70, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x33, 0x33, 0x36, 0x2c, 0x33, 0x36, 0x36, 0x2c, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x7d, 0x2c, 0x22, 0x61, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x7d,
+ 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x31, 0x30, 0x30, 0x2c, 0x31, 0x30, 0x30, 0x2c, 0x31, 0x30, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x36, 0x7d, 0x7d, 0x2c, 0x22, 0x61, 0x6f, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x73, 0x68, 0x61, 0x70, 0x65, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x67, 0x72, 0x22, 0x2c, 0x22, 0x69, 0x74, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x64, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x65, 0x6c, 0x22, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x35, 0x32, 0x30, 0x2c, 0x35, 0x32, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x7d, 0x2c, 0x22, 0x70, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x33, 0x7d, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x45, 0x6c, 0x6c, 0x69, 0x70, 0x73, 0x65, 0x20, 0x50, 0x61, 0x74, 0x68, 0x20, 0x31, 0x22, 0x2c, 0x22, 0x6d, 0x6e, 0x22, 0x3a, 0x22, 0x41, 0x44, 0x42, 0x45, 0x20, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x53, 0x68, 0x61, 0x70, 0x65, 0x20, 0x2d, 0x20, 0x45, 0x6c, 0x6c, 0x69, 0x70, 0x73, 0x65, 0x22, 0x2c, 0x22, 0x68, 0x64, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x73, 0x74, 0x22, 0x2c, 0x22, 0x63, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x30, 0x2e, 0x32, 0x31, 0x39, 0x36, 0x30, 0x37, 0x38, 0x34, 0x33, 0x31, 0x33, 0x37, 0x2c, 0x30, 0x2e, 0x35, 0x35, 0x36, 0x38, 0x36, 0x32, 0x37, 0x34, 0x35, 0x30, 0x39, 0x38, 0x2c, 0x30, 0x2e, 0x32, 0x33, 0x35, 0x32, 0x39, 0x34, 0x31, 0x31, 0x37, 0x36, 0x34, 0x37, 0x2c, 0x31, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x33, 0x7d, 0x2c, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x31, 0x30, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x34, 0x7d, 0x2c, 0x22, 0x77, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x34, 0x38, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x35, 0x7d, 0x2c, 0x22, 0x6c, 0x63, 0x22, 0x3a, 0x32, 0x2c, 0x22, 0x6c, 0x6a, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x6d, 0x6c, 0x22, 0x3a, 0x34, 0x2c, 0x22, 0x62, 0x6d, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x53, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x20, 0x31, 0x22, 0x2c, 0x22, 0x6d, 0x6e, 0x22, 0x3a, 0x22, 0x41, 0x44, 0x42, 0x45, 0x20, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x47, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x20, 0x2d, 0x20, 0x53, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x22, 0x2c, 0x22, 0x68, 0x64, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x74, 0x72, 0x22, 0x2c, 0x22, 0x70, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x7d, 0x2c, 0x22, 0x61, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x7d, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x31, 0x30, 0x30, 0x2c, 0x31, 0x30, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x33, 0x7d, 0x2c, 0x22, 0x72, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x36, 0x7d, 0x2c, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x31, 0x30, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x37, 0x7d, 0x2c, 0x22, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x34, 0x7d, 0x2c, 0x22, 0x73, 0x61, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x35, 0x7d, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x22, 0x7d, 0x5d, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x45,
+ 0x6c, 0x6c, 0x69, 0x70, 0x73, 0x65, 0x20, 0x31, 0x22, 0x2c, 0x22, 0x6e, 0x70, 0x22, 0x3a, 0x33, 0x2c, 0x22, 0x63, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x2c, 0x22, 0x62, 0x6d, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x6d, 0x6e, 0x22, 0x3a, 0x22, 0x41, 0x44, 0x42, 0x45, 0x20, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x2c, 0x22, 0x68, 0x64, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x74, 0x6d, 0x22, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x7d, 0x2c, 0x22, 0x65, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x69, 0x22, 0x3a, 0x7b, 0x22, 0x78, 0x22, 0x3a, 0x5b, 0x30, 0x2e, 0x33, 0x36, 0x38, 0x5d, 0x2c, 0x22, 0x79, 0x22, 0x3a, 0x5b, 0x31, 0x5d, 0x7d, 0x2c, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x78, 0x22, 0x3a, 0x5b, 0x30, 0x2e, 0x32, 0x35, 0x31, 0x5d, 0x2c, 0x22, 0x79, 0x22, 0x3a, 0x5b, 0x30, 0x5d, 0x7d, 0x2c, 0x22, 0x74, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x5b, 0x30, 0x5d, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x22, 0x3a, 0x34, 0x30, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x5b, 0x38, 0x34, 0x5d, 0x7d, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x7d, 0x2c, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x33, 0x7d, 0x2c, 0x22, 0x6d, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x54, 0x72, 0x69, 0x6d, 0x20, 0x50, 0x61, 0x74, 0x68, 0x73, 0x20, 0x31, 0x22, 0x2c, 0x22, 0x6d, 0x6e, 0x22, 0x3a, 0x22, 0x41, 0x44, 0x42, 0x45, 0x20, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x20, 0x2d, 0x20, 0x54, 0x72, 0x69, 0x6d, 0x22, 0x2c, 0x22, 0x68, 0x64, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x5d, 0x2c, 0x22, 0x69, 0x70, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6f, 0x70, 0x22, 0x3a, 0x36, 0x30, 0x2c, 0x22, 0x73, 0x74, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x62, 0x6d, 0x22, 0x3a, 0x30, 0x7d, 0x5d, 0x2c, 0x22, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x5b, 0x5d, 0x7d,
+ 0x00 /*Close the string*/
};
#endif
diff --git a/examples/libs/rlottie/lv_example_rlottie_approve.py b/examples/libs/rlottie/lv_example_rlottie_approve.py
index 6a7721f21..0291c1126 100644
--- a/examples/libs/rlottie/lv_example_rlottie_approve.py
+++ b/examples/libs/rlottie/lv_example_rlottie_approve.py
@@ -19,6 +19,6 @@
0x31, 0x30, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x33, 0x7d, 0x2c, 0x22, 0x72, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x36, 0x7d, 0x2c, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x31, 0x30, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x37, 0x7d, 0x2c, 0x22, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x34, 0x7d, 0x2c, 0x22, 0x73, 0x61, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x35, 0x7d, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x22, 0x7d, 0x5d, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x45, 0x6c, 0x6c, 0x69, 0x70, 0x73, 0x65, 0x20, 0x31, 0x22, 0x2c, 0x22, 0x6e, 0x70, 0x22, 0x3a, 0x33, 0x2c, 0x22, 0x63, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x2c, 0x22, 0x62, 0x6d, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x6d, 0x6e, 0x22, 0x3a, 0x22, 0x41, 0x44, 0x42, 0x45, 0x20, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x2c, 0x22, 0x68, 0x64, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x74, 0x6d, 0x22, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x7d, 0x2c, 0x22, 0x65, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x69, 0x22, 0x3a, 0x7b, 0x22, 0x78, 0x22, 0x3a, 0x5b, 0x30, 0x2e, 0x33, 0x33, 0x37, 0x5d, 0x2c, 0x22, 0x79, 0x22, 0x3a, 0x5b, 0x31, 0x5d, 0x7d, 0x2c, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x78, 0x22, 0x3a, 0x5b, 0x30, 0x2e, 0x33, 0x33, 0x34, 0x5d, 0x2c, 0x22, 0x79, 0x22, 0x3a, 0x5b, 0x30, 0x5d, 0x7d, 0x2c, 0x22, 0x74, 0x22, 0x3a, 0x31, 0x30, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x5b, 0x30, 0x5d, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x22, 0x3a, 0x34, 0x35, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x5b, 0x38, 0x30, 0x5d, 0x7d, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x7d, 0x2c, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x33, 0x7d, 0x2c, 0x22, 0x6d, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x54, 0x72, 0x69, 0x6d, 0x20, 0x50, 0x61, 0x74, 0x68, 0x73, 0x20, 0x31, 0x22, 0x2c, 0x22, 0x6d, 0x6e, 0x22, 0x3a, 0x22, 0x41, 0x44, 0x42, 0x45, 0x20, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x20, 0x2d, 0x20, 0x54, 0x72, 0x69, 0x6d, 0x22, 0x2c, 0x22, 0x68, 0x64, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x5d, 0x2c, 0x22, 0x69, 0x70, 0x22, 0x3a, 0x31, 0x30, 0x2c, 0x22, 0x6f, 0x70, 0x22, 0x3a, 0x36, 0x30, 0x2c, 0x22, 0x73, 0x74, 0x22, 0x3a, 0x31, 0x30, 0x2c, 0x22, 0x62, 0x6d, 0x22, 0x3a, 0x30, 0x7d, 0x2c, 0x7b, 0x22, 0x64, 0x64, 0x64, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x34, 0x2c, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x34, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x53, 0x68, 0x61, 0x70, 0x65, 0x20, 0x4c, 0x61, 0x79, 0x65, 0x72, 0x20, 0x31, 0x22, 0x2c, 0x22, 0x73, 0x72, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x6b, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x31, 0x30, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x31, 0x7d, 0x2c, 0x22, 0x72, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x38, 0x37, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x30, 0x7d, 0x2c, 0x22, 0x70, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x33, 0x33, 0x36, 0x2c, 0x33, 0x36, 0x36, 0x2c, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x7d, 0x2c, 0x22, 0x61, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x7d,
0x2c, 0x22, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x31, 0x30, 0x30, 0x2c, 0x31, 0x30, 0x30, 0x2c, 0x31, 0x30, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x36, 0x7d, 0x7d, 0x2c, 0x22, 0x61, 0x6f, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x73, 0x68, 0x61, 0x70, 0x65, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x67, 0x72, 0x22, 0x2c, 0x22, 0x69, 0x74, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x64, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x65, 0x6c, 0x22, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x35, 0x32, 0x30, 0x2c, 0x35, 0x32, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x7d, 0x2c, 0x22, 0x70, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x33, 0x7d, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x45, 0x6c, 0x6c, 0x69, 0x70, 0x73, 0x65, 0x20, 0x50, 0x61, 0x74, 0x68, 0x20, 0x31, 0x22, 0x2c, 0x22, 0x6d, 0x6e, 0x22, 0x3a, 0x22, 0x41, 0x44, 0x42, 0x45, 0x20, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x53, 0x68, 0x61, 0x70, 0x65, 0x20, 0x2d, 0x20, 0x45, 0x6c, 0x6c, 0x69, 0x70, 0x73, 0x65, 0x22, 0x2c, 0x22, 0x68, 0x64, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x73, 0x74, 0x22, 0x2c, 0x22, 0x63, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x30, 0x2e, 0x32, 0x31, 0x39, 0x36, 0x30, 0x37, 0x38, 0x34, 0x33, 0x31, 0x33, 0x37, 0x2c, 0x30, 0x2e, 0x35, 0x35, 0x36, 0x38, 0x36, 0x32, 0x37, 0x34, 0x35, 0x30, 0x39, 0x38, 0x2c, 0x30, 0x2e, 0x32, 0x33, 0x35, 0x32, 0x39, 0x34, 0x31, 0x31, 0x37, 0x36, 0x34, 0x37, 0x2c, 0x31, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x33, 0x7d, 0x2c, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x31, 0x30, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x34, 0x7d, 0x2c, 0x22, 0x77, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x34, 0x38, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x35, 0x7d, 0x2c, 0x22, 0x6c, 0x63, 0x22, 0x3a, 0x32, 0x2c, 0x22, 0x6c, 0x6a, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x6d, 0x6c, 0x22, 0x3a, 0x34, 0x2c, 0x22, 0x62, 0x6d, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x53, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x20, 0x31, 0x22, 0x2c, 0x22, 0x6d, 0x6e, 0x22, 0x3a, 0x22, 0x41, 0x44, 0x42, 0x45, 0x20, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x47, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x20, 0x2d, 0x20, 0x53, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x22, 0x2c, 0x22, 0x68, 0x64, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x74, 0x72, 0x22, 0x2c, 0x22, 0x70, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x7d, 0x2c, 0x22, 0x61, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x7d, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x31, 0x30, 0x30, 0x2c, 0x31, 0x30, 0x30, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x33, 0x7d, 0x2c, 0x22, 0x72, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x36, 0x7d, 0x2c, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x31, 0x30, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x37, 0x7d, 0x2c, 0x22, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x34, 0x7d, 0x2c, 0x22, 0x73, 0x61, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x35, 0x7d, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x22, 0x7d, 0x5d, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x45,
0x6c, 0x6c, 0x69, 0x70, 0x73, 0x65, 0x20, 0x31, 0x22, 0x2c, 0x22, 0x6e, 0x70, 0x22, 0x3a, 0x33, 0x2c, 0x22, 0x63, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x2c, 0x22, 0x62, 0x6d, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x6d, 0x6e, 0x22, 0x3a, 0x22, 0x41, 0x44, 0x42, 0x45, 0x20, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x2c, 0x22, 0x68, 0x64, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x74, 0x6d, 0x22, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x31, 0x7d, 0x2c, 0x22, 0x65, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x69, 0x22, 0x3a, 0x7b, 0x22, 0x78, 0x22, 0x3a, 0x5b, 0x30, 0x2e, 0x33, 0x36, 0x38, 0x5d, 0x2c, 0x22, 0x79, 0x22, 0x3a, 0x5b, 0x31, 0x5d, 0x7d, 0x2c, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x78, 0x22, 0x3a, 0x5b, 0x30, 0x2e, 0x32, 0x35, 0x31, 0x5d, 0x2c, 0x22, 0x79, 0x22, 0x3a, 0x5b, 0x30, 0x5d, 0x7d, 0x2c, 0x22, 0x74, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x5b, 0x30, 0x5d, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x22, 0x3a, 0x34, 0x30, 0x2c, 0x22, 0x73, 0x22, 0x3a, 0x5b, 0x38, 0x34, 0x5d, 0x7d, 0x5d, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x7d, 0x2c, 0x22, 0x6f, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x33, 0x7d, 0x2c, 0x22, 0x6d, 0x22, 0x3a, 0x31, 0x2c, 0x22, 0x69, 0x78, 0x22, 0x3a, 0x32, 0x2c, 0x22, 0x6e, 0x6d, 0x22, 0x3a, 0x22, 0x54, 0x72, 0x69, 0x6d, 0x20, 0x50, 0x61, 0x74, 0x68, 0x73, 0x20, 0x31, 0x22, 0x2c, 0x22, 0x6d, 0x6e, 0x22, 0x3a, 0x22, 0x41, 0x44, 0x42, 0x45, 0x20, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x20, 0x2d, 0x20, 0x54, 0x72, 0x69, 0x6d, 0x22, 0x2c, 0x22, 0x68, 0x64, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x5d, 0x2c, 0x22, 0x69, 0x70, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6f, 0x70, 0x22, 0x3a, 0x36, 0x30, 0x2c, 0x22, 0x73, 0x74, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x62, 0x6d, 0x22, 0x3a, 0x30, 0x7d, 0x5d, 0x2c, 0x22, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x5b, 0x5d, 0x7d,
- 0x00
+ 0x00
])
diff --git a/examples/libs/sjpg/lv_example_sjpg_1.c b/examples/libs/sjpg/lv_example_sjpg_1.c
index 3898b2d4f..0cdd6f2ab 100644
--- a/examples/libs/sjpg/lv_example_sjpg_1.c
+++ b/examples/libs/sjpg/lv_example_sjpg_1.c
@@ -6,12 +6,12 @@
*/
void lv_example_sjpg_1(void)
{
- lv_obj_t * wp;
+ lv_obj_t * wp;
- wp = lv_img_create(lv_scr_act());
- /* Assuming a File system is attached to letter 'A'
- * E.g. set LV_FS_STDIO_LETTER 'A' in lv_conf.h */
- lv_img_set_src(wp, "A:lvgl/examples/libs/sjpg/small_image.sjpg");
+ wp = lv_img_create(lv_scr_act());
+ /* Assuming a File system is attached to letter 'A'
+ * E.g. set LV_FS_STDIO_LETTER 'A' in lv_conf.h */
+ lv_img_set_src(wp, "A:lvgl/examples/libs/sjpg/small_image.sjpg");
}
#endif
diff --git a/examples/examples.mk b/examples/lv_examples.mk
similarity index 100%
rename from examples/examples.mk
rename to examples/lv_examples.mk
diff --git a/examples/others/fragment/index.rst b/examples/others/fragment/index.rst
new file mode 100644
index 000000000..cc821eac0
--- /dev/null
+++ b/examples/others/fragment/index.rst
@@ -0,0 +1,16 @@
+
+Basic fragment usage
+"""""""""""""""""""
+
+.. lv_example:: others/fragment/lv_example_fragment_1
+ :language: c
+
+
+
+Stack navigation example
+"""""""""""""""""""
+
+.. lv_example:: others/fragment/lv_example_fragment_2
+:language: c
+
+
diff --git a/examples/others/fragment/lv_example_fragment.h b/examples/others/fragment/lv_example_fragment.h
new file mode 100644
index 000000000..09b5b36bb
--- /dev/null
+++ b/examples/others/fragment/lv_example_fragment.h
@@ -0,0 +1,38 @@
+/**
+ * @file lv_example_fragment.h
+ */
+#ifndef LV_EXAMPLE_FRAGMENT_H
+#define LV_EXAMPLE_FRAGMENT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ * INCLUDES
+ *********************/
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+void lv_example_fragment_1(void);
+
+void lv_example_fragment_2(void);
+
+/**********************
+ * MACROS
+ **********************/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /*LV_EXAMPLE_fragment_H*/
diff --git a/examples/others/fragment/lv_example_fragment_1.c b/examples/others/fragment/lv_example_fragment_1.c
new file mode 100644
index 000000000..9e5912449
--- /dev/null
+++ b/examples/others/fragment/lv_example_fragment_1.c
@@ -0,0 +1,60 @@
+/**
+ * @file lv_example_fragment_1.c
+ * @brief Basic usage of obj fragment
+ */
+#include "../../lv_examples.h"
+
+#if LV_USE_FRAGMENT && LV_BUILD_EXAMPLES
+
+static void sample_fragment_ctor(lv_fragment_t * self, void * args);
+
+static lv_obj_t * sample_fragment_create_obj(lv_fragment_t * self, lv_obj_t * parent);
+
+static void sample_container_del(lv_event_t * e);
+
+static lv_obj_t * root = NULL;
+
+struct sample_fragment_t {
+ lv_fragment_t base;
+ const char * name;
+};
+
+static const lv_fragment_class_t sample_cls = {
+ .constructor_cb = sample_fragment_ctor,
+ .create_obj_cb = sample_fragment_create_obj,
+ .instance_size = sizeof(struct sample_fragment_t)
+};
+
+void lv_example_fragment_1(void)
+{
+ root = lv_obj_create(lv_scr_act());
+ lv_obj_set_size(root, LV_PCT(100), LV_PCT(100));
+ lv_fragment_manager_t * manager = lv_fragment_manager_create(NULL);
+ /* Clean up the fragment manager before objects in containers got deleted */
+ lv_obj_add_event_cb(root, sample_container_del, LV_EVENT_DELETE, manager);
+
+ lv_fragment_t * fragment = lv_fragment_create(&sample_cls, "Fragment");
+ lv_fragment_manager_replace(manager, fragment, &root);
+}
+
+
+static void sample_fragment_ctor(lv_fragment_t * self, void * args)
+{
+ ((struct sample_fragment_t *) self)->name = args;
+}
+
+static lv_obj_t * sample_fragment_create_obj(lv_fragment_t * self, lv_obj_t * parent)
+{
+ lv_obj_t * label = lv_label_create(parent);
+ lv_obj_set_style_bg_opa(label, LV_OPA_COVER, 0);;
+ lv_label_set_text_fmt(label, "Hello, %s!", ((struct sample_fragment_t *) self)->name);
+ return label;
+}
+
+static void sample_container_del(lv_event_t * e)
+{
+ lv_fragment_manager_t * manager = (lv_fragment_manager_t *) lv_event_get_user_data(e);
+ lv_fragment_manager_del(manager);
+}
+
+#endif
diff --git a/examples/others/fragment/lv_example_fragment_2.c b/examples/others/fragment/lv_example_fragment_2.c
new file mode 100644
index 000000000..c6a3e44c9
--- /dev/null
+++ b/examples/others/fragment/lv_example_fragment_2.c
@@ -0,0 +1,127 @@
+/**
+ * @file lv_example_fragment_2.c
+ * @brief Navigation stack using obj fragment
+ */
+#include "../../lv_examples.h"
+
+#if LV_USE_FRAGMENT && LV_USE_WIN && LV_BUILD_EXAMPLES
+
+static void sample_fragment_ctor(lv_fragment_t * self, void * args);
+
+static lv_obj_t * sample_fragment_create_obj(lv_fragment_t * self, lv_obj_t * parent);
+
+static void sample_push_click(lv_event_t * e);
+
+static void sample_pop_click(lv_event_t * e);
+
+static void sample_container_del(lv_event_t * e);
+
+static void sample_fragment_inc_click(lv_event_t * e);
+
+typedef struct sample_fragment_t {
+ lv_fragment_t base;
+ lv_obj_t * label;
+ int depth;
+ int counter;
+} sample_fragment_t;
+
+static const lv_fragment_class_t sample_cls = {
+ .constructor_cb = sample_fragment_ctor,
+ .create_obj_cb = sample_fragment_create_obj,
+ .instance_size = sizeof(sample_fragment_t)
+};
+
+static lv_obj_t * container = NULL;
+
+void lv_example_fragment_2(void)
+{
+ lv_obj_t * root = lv_obj_create(lv_scr_act());
+ lv_obj_set_size(root, LV_PCT(100), LV_PCT(100));
+ lv_obj_set_layout(root, LV_LAYOUT_GRID);
+ static const lv_coord_t col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST};
+ static const lv_coord_t row_dsc[] = {LV_GRID_FR(1), LV_GRID_CONTENT, LV_GRID_TEMPLATE_LAST};
+ lv_obj_set_grid_dsc_array(root, col_dsc, row_dsc);
+ container = lv_obj_create(root);
+ lv_obj_remove_style_all(container);
+ lv_obj_set_grid_cell(container, LV_GRID_ALIGN_STRETCH, 0, 2, LV_GRID_ALIGN_STRETCH, 0, 1);
+
+ lv_obj_t * push_btn = lv_btn_create(root);
+ lv_obj_t * push_label = lv_label_create(push_btn);
+ lv_label_set_text(push_label, "Push");
+
+ lv_obj_t * pop_btn = lv_btn_create(root);
+ lv_obj_t * pop_label = lv_label_create(pop_btn);
+ lv_label_set_text(pop_label, "Pop");
+ lv_obj_set_grid_cell(push_btn, LV_GRID_ALIGN_START, 0, 1, LV_GRID_ALIGN_CENTER, 1, 1);
+ lv_obj_set_grid_cell(pop_btn, LV_GRID_ALIGN_END, 1, 1, LV_GRID_ALIGN_CENTER, 1, 1);
+
+ lv_fragment_manager_t * manager = lv_fragment_manager_create(NULL);
+ /* Clean up the fragment manager before objects in containers got deleted */
+ lv_obj_add_event_cb(root, sample_container_del, LV_EVENT_DELETE, manager);
+
+ int depth = 0;
+ lv_fragment_t * fragment = lv_fragment_create(&sample_cls, &depth);
+ lv_fragment_manager_push(manager, fragment, &container);
+ lv_obj_add_event_cb(push_btn, sample_push_click, LV_EVENT_CLICKED, manager);
+ lv_obj_add_event_cb(pop_btn, sample_pop_click, LV_EVENT_CLICKED, manager);
+}
+
+
+static void sample_fragment_ctor(lv_fragment_t * self, void * args)
+{
+ LV_UNUSED(args);
+ ((sample_fragment_t *) self)->depth = *((int *) args);
+ ((sample_fragment_t *) self)->counter = 0;
+}
+
+static lv_obj_t * sample_fragment_create_obj(lv_fragment_t * self, lv_obj_t * parent)
+{
+ sample_fragment_t * fragment = (sample_fragment_t *) self;
+ lv_obj_t * content = lv_obj_create(parent);
+ lv_obj_remove_style_all(content);
+ lv_obj_set_style_bg_opa(content, LV_OPA_50, 0);
+ lv_obj_set_style_bg_color(content, lv_palette_main(LV_PALETTE_YELLOW), 0);
+ lv_obj_set_size(content, LV_PCT(100), LV_PCT(100));
+ lv_obj_set_flex_flow(content, LV_FLEX_FLOW_COLUMN);
+ lv_obj_t * depth = lv_label_create(content);
+ lv_label_set_text_fmt(depth, "Depth: %d", fragment->depth);
+ lv_obj_t * label = lv_label_create(content);
+ fragment->label = label;
+ lv_label_set_text_fmt(label, "The button has been pressed %d times", fragment->counter);
+
+ lv_obj_t * inc_btn = lv_btn_create(content);
+ lv_obj_t * inc_label = lv_label_create(inc_btn);
+ lv_label_set_text(inc_label, "+1");
+ lv_obj_add_event_cb(inc_btn, sample_fragment_inc_click, LV_EVENT_CLICKED, fragment);
+
+ return content;
+}
+
+static void sample_push_click(lv_event_t * e)
+{
+ lv_fragment_manager_t * manager = (lv_fragment_manager_t *) lv_event_get_user_data(e);
+ size_t stack_size = lv_fragment_manager_get_stack_size(manager);
+ lv_fragment_t * fragment = lv_fragment_create(&sample_cls, &stack_size);
+ lv_fragment_manager_push(manager, fragment, &container);
+}
+
+static void sample_pop_click(lv_event_t * e)
+{
+ lv_fragment_manager_t * manager = (lv_fragment_manager_t *) lv_event_get_user_data(e);
+ lv_fragment_manager_pop(manager);
+}
+
+static void sample_container_del(lv_event_t * e)
+{
+ lv_fragment_manager_t * manager = (lv_fragment_manager_t *) lv_event_get_user_data(e);
+ lv_fragment_manager_del(manager);
+}
+
+static void sample_fragment_inc_click(lv_event_t * e)
+{
+ sample_fragment_t * fragment = (sample_fragment_t *) lv_event_get_user_data(e);
+ fragment->counter++;
+ lv_label_set_text_fmt(fragment->label, "The button has been pressed %d times", fragment->counter);
+}
+
+#endif
diff --git a/examples/others/gridnav/index.rst b/examples/others/gridnav/index.rst
index 6f6909881..7b38fea26 100644
--- a/examples/others/gridnav/index.rst
+++ b/examples/others/gridnav/index.rst
@@ -2,17 +2,23 @@
Basic grid navigation
"""""""""""""""""""""
-.. lv_example:: others/monkey/lv_example_gridnav_1
+.. lv_example:: others/gridnav/lv_example_gridnav_1
:language: c
Grid navigation on a list
""""""""""""""""""""""""
-.. lv_example:: others/monkey/lv_example_gridnav_2
+.. lv_example:: others/gridnav/lv_example_gridnav_2
:language: c
Nested grid navigations
"""""""""""""""""""""""
-.. lv_example:: others/monkey/lv_example_gridanav_3
+.. lv_example:: others/gridnav/lv_example_gridnav_3
:language: c
+
+Simple navigation on a list widget
+"""""""""""""""""""""""
+
+.. lv_example:: others/gridnav/lv_example_gridnav_4
+ :language: c
\ No newline at end of file
diff --git a/examples/others/gridnav/lv_example_gridnav.h b/examples/others/gridnav/lv_example_gridnav.h
index efe5e2693..1389c9067 100644
--- a/examples/others/gridnav/lv_example_gridnav.h
+++ b/examples/others/gridnav/lv_example_gridnav.h
@@ -28,6 +28,7 @@ extern "C" {
void lv_example_gridnav_1(void);
void lv_example_gridnav_2(void);
void lv_example_gridnav_3(void);
+void lv_example_gridnav_4(void);
/**********************
* MACROS
diff --git a/examples/others/gridnav/lv_example_gridnav_3.c b/examples/others/gridnav/lv_example_gridnav_3.c
index b31f7f757..071f28a84 100644
--- a/examples/others/gridnav/lv_example_gridnav_3.c
+++ b/examples/others/gridnav/lv_example_gridnav_3.c
@@ -55,16 +55,16 @@ void lv_example_gridnav_3(void)
lv_obj_set_style_bg_color(cont_sub1, lv_palette_lighten(LV_PALETTE_RED, 5), LV_STATE_FOCUSED);
lv_obj_set_width(label, lv_pct(100));
lv_label_set_text(label,
- "I'm a very long text which is makes my container scrollable. "
- "As LV_GRIDNAV_FLAG_SCROLL_FIRST is enabled arrow will scroll me first "
- "and a new objects will be focused only when an edge is reached with the scrolling.\n\n"
- "This is only some placeholder text to be sure the parent will be scrollable. \n\n"
- "Hello world!\n"
- "Hello world!\n"
- "Hello world!\n"
- "Hello world!\n"
- "Hello world!\n"
- "Hello world!");
+ "I'm a very long text which is makes my container scrollable. "
+ "As LV_GRIDNAV_FLAG_SCROLL_FIRST is enabled arrow will scroll me first "
+ "and a new objects will be focused only when an edge is reached with the scrolling.\n\n"
+ "This is only some placeholder text to be sure the parent will be scrollable. \n\n"
+ "Hello world!\n"
+ "Hello world!\n"
+ "Hello world!\n"
+ "Hello world!\n"
+ "Hello world!\n"
+ "Hello world!");
/*Create a third container that can be focused with ENTER and contains an other grid nav*/
lv_obj_t * cont_sub2 = lv_obj_create(cont_main);
diff --git a/examples/others/ime/index.rst b/examples/others/ime/index.rst
new file mode 100644
index 000000000..e7cc1fb9a
--- /dev/null
+++ b/examples/others/ime/index.rst
@@ -0,0 +1,12 @@
+
+Pinyin IME 26 key input
+"""""""""""""""""""""""""
+
+.. lv_example:: others/ime/lv_example_ime_pinyin_1
+ :language: c
+
+Pinyin IME 9 key input
+"""""""""""""""""""""""""
+
+.. lv_example:: others/ime/lv_example_ime_pinyin_2
+ :language: c
diff --git a/examples/others/ime/lv_example_ime_pinyin.h b/examples/others/ime/lv_example_ime_pinyin.h
new file mode 100644
index 000000000..96991e3a3
--- /dev/null
+++ b/examples/others/ime/lv_example_ime_pinyin.h
@@ -0,0 +1,39 @@
+/**
+ * @file lv_example_ime_pinyin.h
+ *
+ */
+
+#ifndef LV_EX_IME_PINYIN_H
+#define LV_EX_IME_PINYIN_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ * INCLUDES
+ *********************/
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+void lv_example_ime_pinyin_1(void);
+void lv_example_ime_pinyin_2(void);
+
+/**********************
+ * MACROS
+ **********************/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /*LV_EX_IME_PINYIN_H*/
diff --git a/examples/others/ime/lv_example_ime_pinyin_1.c b/examples/others/ime/lv_example_ime_pinyin_1.c
new file mode 100644
index 000000000..b609ee614
--- /dev/null
+++ b/examples/others/ime/lv_example_ime_pinyin_1.c
@@ -0,0 +1,56 @@
+#include "../../lv_examples.h"
+#if LV_USE_LABEL && LV_USE_TEXTAREA && LV_FONT_SIMSUN_16_CJK && LV_USE_IME_PINYIN && LV_BUILD_EXAMPLES
+
+static void ta_event_cb(lv_event_t * e)
+{
+ lv_event_code_t code = lv_event_get_code(e);
+ lv_obj_t * ta = lv_event_get_target(e);
+ lv_obj_t * kb = lv_event_get_user_data(e);
+
+ if(code == LV_EVENT_FOCUSED) {
+ if(lv_indev_get_type(lv_indev_get_act()) != LV_INDEV_TYPE_KEYPAD) {
+ lv_keyboard_set_textarea(kb, ta);
+ lv_obj_clear_flag(kb, LV_OBJ_FLAG_HIDDEN);
+ }
+ }
+ else if(code == LV_EVENT_CANCEL) {
+ lv_obj_add_flag(kb, LV_OBJ_FLAG_HIDDEN);
+ lv_obj_clear_state(ta, LV_STATE_FOCUSED);
+ lv_indev_reset(NULL, ta); /*To forget the last clicked object to make it focusable again*/
+ }
+}
+
+void lv_example_ime_pinyin_1(void)
+{
+ lv_obj_t * pinyin_ime = lv_ime_pinyin_create(lv_scr_act());
+ lv_obj_set_style_text_font(pinyin_ime, &lv_font_simsun_16_cjk, 0);
+ //lv_ime_pinyin_set_dict(pinyin_ime, your_dict); // Use a custom dictionary. If it is not set, the built-in dictionary will be used.
+
+ /* ta1 */
+ lv_obj_t * ta1 = lv_textarea_create(lv_scr_act());
+ lv_textarea_set_one_line(ta1, true);
+ lv_obj_set_style_text_font(ta1, &lv_font_simsun_16_cjk, 0);
+ lv_obj_align(ta1, LV_ALIGN_TOP_LEFT, 0, 0);
+
+ /*Create a keyboard and add it to ime_pinyin*/
+ lv_obj_t * kb = lv_keyboard_create(lv_scr_act());
+ lv_ime_pinyin_set_keyboard(pinyin_ime, kb);
+ lv_keyboard_set_textarea(kb, ta1);
+
+ lv_obj_add_event_cb(ta1, ta_event_cb, LV_EVENT_ALL, kb);
+
+ /*Get the cand_panel, and adjust its size and position*/
+ lv_obj_t * cand_panel = lv_ime_pinyin_get_cand_panel(pinyin_ime);
+ lv_obj_set_size(cand_panel, LV_PCT(100), LV_PCT(10));
+ lv_obj_align_to(cand_panel, kb, LV_ALIGN_OUT_TOP_MID, 0, 0);
+
+ /*Try using ime_pinyin to output the Chinese below in the ta1 above*/
+ lv_obj_t * cz_label = lv_label_create(lv_scr_act());
+ lv_label_set_text(cz_label,
+ "嵌入式系统(Embedded System),\n是一种嵌入机械或电气系统内部、具有专一功能和实时计算性能的计算机系统。");
+ lv_obj_set_style_text_font(cz_label, &lv_font_simsun_16_cjk, 0);
+ lv_obj_set_width(cz_label, 310);
+ lv_obj_align_to(cz_label, ta1, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 0);
+}
+
+#endif
diff --git a/examples/others/ime/lv_example_ime_pinyin_2.c b/examples/others/ime/lv_example_ime_pinyin_2.c
new file mode 100644
index 000000000..af5a0589d
--- /dev/null
+++ b/examples/others/ime/lv_example_ime_pinyin_2.c
@@ -0,0 +1,58 @@
+#include "../../lv_examples.h"
+#if LV_USE_LABEL && LV_USE_TEXTAREA && LV_FONT_SIMSUN_16_CJK && LV_USE_IME_PINYIN && LV_IME_PINYIN_USE_K9_MODE && LV_BUILD_EXAMPLES
+
+static void ta_event_cb(lv_event_t * e)
+{
+ lv_event_code_t code = lv_event_get_code(e);
+ lv_obj_t * ta = lv_event_get_target(e);
+ lv_obj_t * kb = lv_event_get_user_data(e);
+
+ if(code == LV_EVENT_FOCUSED) {
+ if(lv_indev_get_type(lv_indev_get_act()) != LV_INDEV_TYPE_KEYPAD) {
+ lv_keyboard_set_textarea(kb, ta);
+ lv_obj_clear_flag(kb, LV_OBJ_FLAG_HIDDEN);
+ }
+ }
+ else if(code == LV_EVENT_READY) {
+ lv_obj_add_flag(kb, LV_OBJ_FLAG_HIDDEN);
+ lv_obj_clear_state(ta, LV_STATE_FOCUSED);
+ lv_indev_reset(NULL, ta); /*To forget the last clicked object to make it focusable again*/
+ }
+}
+
+void lv_example_ime_pinyin_2(void)
+{
+ lv_obj_t * pinyin_ime = lv_ime_pinyin_create(lv_scr_act());
+ lv_obj_set_style_text_font(pinyin_ime, &lv_font_simsun_16_cjk, 0);
+ //lv_ime_pinyin_set_dict(pinyin_ime, your_dict); // Use a custom dictionary. If it is not set, the built-in dictionary will be used.
+
+ /* ta1 */
+ lv_obj_t * ta1 = lv_textarea_create(lv_scr_act());
+ lv_textarea_set_one_line(ta1, true);
+ lv_obj_set_style_text_font(ta1, &lv_font_simsun_16_cjk, 0);
+ lv_obj_align(ta1, LV_ALIGN_TOP_LEFT, 0, 0);
+
+ /*Create a keyboard and add it to ime_pinyin*/
+ lv_obj_t * kb = lv_keyboard_create(lv_scr_act());
+ lv_keyboard_set_textarea(kb, ta1);
+
+ lv_ime_pinyin_set_keyboard(pinyin_ime, kb);
+ lv_ime_pinyin_set_mode(pinyin_ime,
+ LV_IME_PINYIN_MODE_K9); // Set to 9-key input mode. Default: 26-key input(k26) mode.
+ lv_obj_add_event_cb(ta1, ta_event_cb, LV_EVENT_ALL, kb);
+
+ /*Get the cand_panel, and adjust its size and position*/
+ lv_obj_t * cand_panel = lv_ime_pinyin_get_cand_panel(pinyin_ime);
+ lv_obj_set_size(cand_panel, LV_PCT(100), LV_PCT(10));
+ lv_obj_align_to(cand_panel, kb, LV_ALIGN_OUT_TOP_MID, 0, 0);
+
+ /*Try using ime_pinyin to output the Chinese below in the ta1 above*/
+ lv_obj_t * cz_label = lv_label_create(lv_scr_act());
+ lv_label_set_text(cz_label,
+ "嵌入式系统(Embedded System),\n是一种嵌入机械或电气系统内部、具有专一功能和实时计算性能的计算机系统。");
+ lv_obj_set_style_text_font(cz_label, &lv_font_simsun_16_cjk, 0);
+ lv_obj_set_width(cz_label, 310);
+ lv_obj_align_to(cz_label, ta1, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 0);
+}
+
+#endif
diff --git a/examples/others/imgfont/index.rst b/examples/others/imgfont/index.rst
new file mode 100644
index 000000000..101f9e236
--- /dev/null
+++ b/examples/others/imgfont/index.rst
@@ -0,0 +1,6 @@
+Use emojis in a text.
+"""""""""""""""""""""""""""""""""""""""""""""""
+
+.. lv_example:: others/imgfont/lv_example_imgfont_1
+ :language: c
+
diff --git a/examples/others/imgfont/lv_example_imgfont.h b/examples/others/imgfont/lv_example_imgfont.h
new file mode 100644
index 000000000..460a97654
--- /dev/null
+++ b/examples/others/imgfont/lv_example_imgfont.h
@@ -0,0 +1,38 @@
+/**
+ * @file lv_example_imgfont.h
+ *
+ */
+
+#ifndef LV_EXAMPLE_IMGFONT_H
+#define LV_EXAMPLE_IMGFONT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ * INCLUDES
+ *********************/
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+void lv_example_imgfont_1(void);
+
+/**********************
+ * MACROS
+ **********************/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /*LV_EXAMPLE_IMGFONT_H*/
diff --git a/examples/others/imgfont/lv_example_imgfont_1.c b/examples/others/imgfont/lv_example_imgfont_1.c
new file mode 100644
index 000000000..e98393284
--- /dev/null
+++ b/examples/others/imgfont/lv_example_imgfont_1.c
@@ -0,0 +1,54 @@
+#include "../../lv_examples.h"
+#include
+
+#if LV_BUILD_EXAMPLES
+#if LV_USE_IMGFONT
+
+LV_IMG_DECLARE(emoji_F617)
+static bool get_imgfont_path(const lv_font_t * font, void * img_src,
+ uint16_t len, uint32_t unicode, uint32_t unicode_next)
+{
+ LV_UNUSED(font);
+ LV_UNUSED(unicode_next);
+ LV_ASSERT_NULL(img_src);
+
+ if(unicode == 0xF617) {
+ memcpy(img_src, &emoji_F617, sizeof(lv_img_dsc_t));
+ }
+ else {
+ char * path = (char *)img_src;
+ snprintf(path, len, "%s/%04X.%s", "A:lvgl/examples/assets/emoji", unicode, "png");
+ path[len - 1] = '\0';
+ }
+
+ return true;
+}
+
+/**
+ * draw img in label or span obj
+ */
+void lv_example_imgfont_1(void)
+{
+ lv_font_t * imgfont = lv_imgfont_create(80, get_imgfont_path);
+ if(imgfont == NULL) {
+ LV_LOG_ERROR("imgfont init error");
+ }
+
+ imgfont->fallback = LV_FONT_DEFAULT;
+
+ lv_obj_t * label1 = lv_label_create(lv_scr_act());
+ lv_label_set_text(label1, "12\uF600\uF617AB");
+ lv_obj_set_style_text_font(label1, imgfont, LV_PART_MAIN);
+ lv_obj_center(label1);
+}
+#else
+
+void lv_example_imgfont_1(void)
+{
+ lv_obj_t * label = lv_label_create(lv_scr_act());
+ lv_label_set_text(label, "imgfont is not installed");
+ lv_obj_center(label);
+}
+
+#endif
+#endif
diff --git a/examples/others/lv_example_others.h b/examples/others/lv_example_others.h
index f054015fd..4b2719490 100644
--- a/examples/others/lv_example_others.h
+++ b/examples/others/lv_example_others.h
@@ -16,6 +16,10 @@ extern "C" {
#include "snapshot/lv_example_snapshot.h"
#include "monkey/lv_example_monkey.h"
#include "gridnav/lv_example_gridnav.h"
+#include "fragment/lv_example_fragment.h"
+#include "imgfont/lv_example_imgfont.h"
+#include "msg/lv_example_msg.h"
+#include "ime/lv_example_ime_pinyin.h"
/*********************
* DEFINES
@@ -37,4 +41,4 @@ extern "C" {
} /*extern "C"*/
#endif
-#endif /*LV_EX_OTHERS_H*/
+#endif /*LV_EXAMPLE_OTHERS_H*/
diff --git a/examples/others/monkey/index.rst b/examples/others/monkey/index.rst
index 603df81ce..e6fdfb7e7 100644
--- a/examples/others/monkey/index.rst
+++ b/examples/others/monkey/index.rst
@@ -1,17 +1,17 @@
-Touchpad monkey example
+Touchpad monkey example
"""""""""""""""""""
.. lv_example:: others/monkey/lv_example_monkey_1
:language: c
-Encoder monkey example
+Encoder monkey example
"""""""""""""""""""
.. lv_example:: others/monkey/lv_example_monkey_2
:language: c
-Button monkey example
+Button monkey example
"""""""""""""""""""
.. lv_example:: others/monkey/lv_example_monkey_3
diff --git a/examples/others/msg/index.rst b/examples/others/msg/index.rst
new file mode 100644
index 000000000..93d04dc52
--- /dev/null
+++ b/examples/others/msg/index.rst
@@ -0,0 +1,20 @@
+
+Slider to label messaging
+"""""""""""""""""""""""""
+
+.. lv_example:: others/msg/lv_example_msg_1
+ :language: c
+
+Handling login and its states
+"""""""""""""""""""""""""""""
+
+.. lv_example:: others/msg/lv_example_msg_2
+ :language: c
+
+Setting the same value from many sources
+""""""""""""""""""""""""""""""""""""""""
+
+.. lv_example:: others/msg/lv_example_msg_3
+ :language: c
+
+
diff --git a/examples/others/msg/lv_example_msg.h b/examples/others/msg/lv_example_msg.h
new file mode 100644
index 000000000..e7accc8df
--- /dev/null
+++ b/examples/others/msg/lv_example_msg.h
@@ -0,0 +1,40 @@
+/**
+ * @file lv_example_msg.h
+ *
+ */
+
+#ifndef LV_EXAMPLE_MSG_H
+#define LV_EXAMPLE_MSG_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ * INCLUDES
+ *********************/
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+void lv_example_msg_1(void);
+void lv_example_msg_2(void);
+void lv_example_msg_3(void);
+
+/**********************
+ * MACROS
+ **********************/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /*LV_EXAMPLE_MSG_H*/
diff --git a/examples/others/msg/lv_example_msg_1.c b/examples/others/msg/lv_example_msg_1.c
new file mode 100644
index 000000000..d2cb8a3df
--- /dev/null
+++ b/examples/others/msg/lv_example_msg_1.c
@@ -0,0 +1,49 @@
+#include "../../lv_examples.h"
+#if LV_USE_MSG && LV_USE_SLIDER && LV_USE_LABEL && LV_BUILD_EXAMPLES
+
+/*Define a message ID*/
+#define MSG_NEW_TEMPERATURE 1
+
+static void slider_event_cb(lv_event_t * e);
+static void label_event_cb(lv_event_t * e);
+
+/**
+ * A slider sends a message on value change and a label display's that value
+ */
+void lv_example_msg_1(void)
+{
+ /*Create a slider in the center of the display*/
+ lv_obj_t * slider = lv_slider_create(lv_scr_act());
+ lv_obj_center(slider);
+ lv_obj_add_event_cb(slider, slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL);
+
+ /*Create a label below the slider*/
+ lv_obj_t * label = lv_label_create(lv_scr_act());
+ lv_obj_add_event_cb(label, label_event_cb, LV_EVENT_MSG_RECEIVED, NULL);
+ lv_label_set_text(label, "0%");
+ lv_obj_align(label, LV_ALIGN_CENTER, 0, 30);
+
+ /*Subscribe the label to a message. Also use the user_data to set a format string here.*/
+ lv_msg_subsribe_obj(MSG_NEW_TEMPERATURE, label, "%d °C");
+}
+
+static void slider_event_cb(lv_event_t * e)
+{
+ /*Notify all subscribers (only the label now) that the slider value has been changed*/
+ lv_obj_t * slider = lv_event_get_target(e);
+ int32_t v = lv_slider_get_value(slider);
+ lv_msg_send(MSG_NEW_TEMPERATURE, &v);
+}
+
+static void label_event_cb(lv_event_t * e)
+{
+ lv_obj_t * label = lv_event_get_target(e);
+ lv_msg_t * m = lv_event_get_msg(e);
+
+ const char * fmt = lv_msg_get_user_data(m);
+ const int32_t * v = lv_msg_get_payload(m);
+
+ lv_label_set_text_fmt(label, fmt, *v);
+}
+
+#endif
diff --git a/examples/others/msg/lv_example_msg_2.c b/examples/others/msg/lv_example_msg_2.c
new file mode 100644
index 000000000..f9cf585eb
--- /dev/null
+++ b/examples/others/msg/lv_example_msg_2.c
@@ -0,0 +1,171 @@
+#include "../../lv_examples.h"
+#if LV_USE_MSG && LV_USE_SLIDER && LV_USE_LABEL && LV_BUILD_EXAMPLES
+
+/*Define a message ID*/
+#define MSG_LOGIN_ATTEMPT 1
+#define MSG_LOG_OUT 2
+#define MSG_LOGIN_ERROR 3
+#define MSG_LOGIN_OK 4
+
+static void auth_manager(void * s, lv_msg_t * m);
+static void textarea_event_cb(lv_event_t * e);
+static void log_out_event_cb(lv_event_t * e);
+static void start_engine_msg_event_cb(lv_event_t * e);
+static void info_label_msg_event_cb(lv_event_t * e);
+
+/**
+ * Simple PIN login screen.
+ * No global variables are used, all state changes are communicated via messages.
+ */
+void lv_example_msg_2(void)
+{
+ lv_msg_subsribe(MSG_LOGIN_ATTEMPT, auth_manager, "hello");
+
+ /*Create a slider in the center of the display*/
+ lv_obj_t * ta = lv_textarea_create(lv_scr_act());
+ lv_obj_set_pos(ta, 10, 10);
+ lv_obj_set_width(ta, 200);
+ lv_textarea_set_one_line(ta, true);
+ lv_textarea_set_password_mode(ta, true);
+ lv_textarea_set_placeholder_text(ta, "The password is: hello");
+ lv_obj_add_event_cb(ta, textarea_event_cb, LV_EVENT_ALL, NULL);
+ lv_msg_subsribe_obj(MSG_LOGIN_ERROR, ta, NULL);
+ lv_msg_subsribe_obj(MSG_LOGIN_OK, ta, NULL);
+ lv_msg_subsribe_obj(MSG_LOG_OUT, ta, NULL);
+
+ lv_obj_t * kb = lv_keyboard_create(lv_scr_act());
+ lv_keyboard_set_textarea(kb, ta);
+
+ lv_obj_t * btn;
+ lv_obj_t * label;
+
+ /*Create a log out button which will be active only when logged in*/
+ btn = lv_btn_create(lv_scr_act());
+ lv_obj_set_pos(btn, 240, 10);
+ lv_obj_add_event_cb(btn, log_out_event_cb, LV_EVENT_ALL, NULL);
+ lv_msg_subsribe_obj(MSG_LOGIN_OK, btn, NULL);
+ lv_msg_subsribe_obj(MSG_LOG_OUT, btn, NULL);
+
+ label = lv_label_create(btn);
+ lv_label_set_text(label, "LOG OUT");
+
+ /*Create a label to show info*/
+ label = lv_label_create(lv_scr_act());
+ lv_label_set_text(label, "");
+ lv_obj_add_event_cb(label, info_label_msg_event_cb, LV_EVENT_MSG_RECEIVED, NULL);
+ lv_obj_set_pos(label, 10, 60);
+ lv_msg_subsribe_obj(MSG_LOGIN_ERROR, label, NULL);
+ lv_msg_subsribe_obj(MSG_LOGIN_OK, label, NULL);
+ lv_msg_subsribe_obj(MSG_LOG_OUT, label, NULL);
+
+ /*Create button which will be active only when logged in*/
+ btn = lv_btn_create(lv_scr_act());
+ lv_obj_set_pos(btn, 10, 80);
+ lv_obj_add_event_cb(btn, start_engine_msg_event_cb, LV_EVENT_MSG_RECEIVED, NULL);
+ lv_obj_add_flag(btn, LV_OBJ_FLAG_CHECKABLE);
+ lv_msg_subsribe_obj(MSG_LOGIN_OK, btn, NULL);
+ lv_msg_subsribe_obj(MSG_LOG_OUT, btn, NULL);
+
+ label = lv_label_create(btn);
+ lv_label_set_text(label, "START ENGINE");
+
+ lv_msg_send(MSG_LOG_OUT, NULL);
+}
+
+static void auth_manager(void * s, lv_msg_t * m)
+{
+ LV_UNUSED(s);
+ const char * pin_act = lv_msg_get_payload(m);
+ const char * pin_expexted = lv_msg_get_user_data(m);
+ if(strcmp(pin_act, pin_expexted) == 0) {
+ lv_msg_send(MSG_LOGIN_OK, NULL);
+ }
+ else {
+ lv_msg_send(MSG_LOGIN_ERROR, "Incorrect PIN");
+ }
+
+}
+
+static void textarea_event_cb(lv_event_t * e)
+{
+ lv_obj_t * ta = lv_event_get_target(e);
+ lv_event_code_t code = lv_event_get_code(e);
+ if(code == LV_EVENT_READY) {
+ lv_msg_send(MSG_LOGIN_ATTEMPT, lv_textarea_get_text(ta));
+ }
+ else if(code == LV_EVENT_MSG_RECEIVED) {
+ lv_msg_t * m = lv_event_get_msg(e);
+ switch(lv_msg_get_id(m)) {
+ case MSG_LOGIN_ERROR:
+ /*If there was an error, clean the text area*/
+ if(strlen(lv_msg_get_payload(m))) lv_textarea_set_text(ta, "");
+ break;
+ case MSG_LOGIN_OK:
+ lv_obj_add_state(ta, LV_STATE_DISABLED);
+ lv_obj_clear_state(ta, LV_STATE_FOCUSED | LV_STATE_FOCUS_KEY);
+ break;
+ case MSG_LOG_OUT:
+ lv_textarea_set_text(ta, "");
+ lv_obj_clear_state(ta, LV_STATE_DISABLED);
+ break;
+ }
+ }
+}
+
+static void log_out_event_cb(lv_event_t * e)
+{
+ lv_event_code_t code = lv_event_get_code(e);
+ if(code == LV_EVENT_CLICKED) {
+ lv_msg_send(MSG_LOG_OUT, NULL);
+ }
+ else if(code == LV_EVENT_MSG_RECEIVED) {
+ lv_msg_t * m = lv_event_get_msg(e);
+ lv_obj_t * btn = lv_event_get_target(e);
+ switch(lv_msg_get_id(m)) {
+ case MSG_LOGIN_OK:
+ lv_obj_clear_state(btn, LV_STATE_DISABLED);
+ break;
+ case MSG_LOG_OUT:
+ lv_obj_add_state(btn, LV_STATE_DISABLED);
+ break;
+ }
+ }
+}
+
+static void start_engine_msg_event_cb(lv_event_t * e)
+{
+ lv_msg_t * m = lv_event_get_msg(e);
+ lv_obj_t * btn = lv_event_get_target(e);
+ switch(lv_msg_get_id(m)) {
+ case MSG_LOGIN_OK:
+ lv_obj_clear_state(btn, LV_STATE_DISABLED);
+ break;
+ case MSG_LOG_OUT:
+ lv_obj_add_state(btn, LV_STATE_DISABLED);
+ break;
+ }
+}
+
+static void info_label_msg_event_cb(lv_event_t * e)
+{
+ lv_obj_t * label = lv_event_get_target(e);
+ lv_msg_t * m = lv_event_get_msg(e);
+ switch(lv_msg_get_id(m)) {
+ case MSG_LOGIN_ERROR:
+ lv_label_set_text(label, lv_msg_get_payload(m));
+ lv_obj_set_style_text_color(label, lv_palette_main(LV_PALETTE_RED), 0);
+ break;
+ case MSG_LOGIN_OK:
+ lv_label_set_text(label, "Login successful");
+ lv_obj_set_style_text_color(label, lv_palette_main(LV_PALETTE_GREEN), 0);
+ break;
+ case MSG_LOG_OUT:
+ lv_label_set_text(label, "Logged out");
+ lv_obj_set_style_text_color(label, lv_palette_main(LV_PALETTE_GREY), 0);
+ break;
+ default:
+ break;
+ }
+}
+
+#endif
diff --git a/examples/others/msg/lv_example_msg_3.c b/examples/others/msg/lv_example_msg_3.c
new file mode 100644
index 000000000..dddb4a8c4
--- /dev/null
+++ b/examples/others/msg/lv_example_msg_3.c
@@ -0,0 +1,154 @@
+#include "../../lv_examples.h"
+#if LV_USE_MSG && LV_USE_SLIDER && LV_USE_LABEL && LV_BUILD_EXAMPLES
+
+/*Define a message ID*/
+#define MSG_INC 1
+#define MSG_DEC 2
+#define MSG_SET 3
+#define MSG_UPDATE 4
+#define MSG_UPDATE_REQUEST 5
+
+static void value_handler(void * s, lv_msg_t * m);
+static void value_handler(void * s, lv_msg_t * m);
+static void btn_event_cb(lv_event_t * e);
+static void label_event_cb(lv_event_t * e);
+static void slider_event_cb(lv_event_t * e);
+
+/**
+ * Show how an increment button, a decrement button, as slider can set a value
+ * and a label display it.
+ * The current value (i.e. the system's state) is stored only in one static variable in a function
+ * and no global variables are required.
+ */
+void lv_example_msg_3(void)
+{
+
+ lv_msg_subsribe(MSG_INC, value_handler, NULL);
+ lv_msg_subsribe(MSG_DEC, value_handler, NULL);
+ lv_msg_subsribe(MSG_SET, value_handler, NULL);
+ lv_msg_subsribe(MSG_UPDATE, value_handler, NULL);
+ lv_msg_subsribe(MSG_UPDATE_REQUEST, value_handler, NULL);
+
+ lv_obj_t * panel = lv_obj_create(lv_scr_act());
+ lv_obj_set_size(panel, 250, LV_SIZE_CONTENT);
+ lv_obj_center(panel);
+ lv_obj_set_flex_flow(panel, LV_FLEX_FLOW_ROW);
+ lv_obj_set_flex_align(panel, LV_FLEX_ALIGN_SPACE_BETWEEN, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_START);
+
+ lv_obj_t * btn;
+ lv_obj_t * label;
+
+ /*Up button*/
+ btn = lv_btn_create(panel);
+ lv_obj_set_flex_grow(btn, 1);
+ lv_obj_add_event_cb(btn, btn_event_cb, LV_EVENT_ALL, NULL);
+ label = lv_label_create(btn);
+ lv_label_set_text(label, LV_SYMBOL_LEFT);
+ lv_obj_center(label);
+
+ /*Current value*/
+ label = lv_label_create(panel);
+ lv_obj_set_flex_grow(label, 2);
+ lv_obj_set_style_text_align(label, LV_TEXT_ALIGN_CENTER, 0);
+ lv_label_set_text(label, "?");
+ lv_msg_subsribe_obj(MSG_UPDATE, label, NULL);
+ lv_obj_add_event_cb(label, label_event_cb, LV_EVENT_MSG_RECEIVED, NULL);
+
+ /*Down button*/
+ btn = lv_btn_create(panel);
+ lv_obj_set_flex_grow(btn, 1);
+ lv_obj_add_event_cb(btn, btn_event_cb, LV_EVENT_ALL, NULL);
+ label = lv_label_create(btn);
+ lv_label_set_text(label, LV_SYMBOL_RIGHT);
+ lv_obj_center(label);
+
+ /*Slider*/
+ lv_obj_t * slider = lv_slider_create(panel);
+ lv_obj_set_flex_grow(slider, 1);
+ lv_obj_add_flag(slider, LV_OBJ_FLAG_FLEX_IN_NEW_TRACK);
+ lv_obj_add_event_cb(slider, slider_event_cb, LV_EVENT_ALL, NULL);
+ lv_msg_subsribe_obj(MSG_UPDATE, slider, NULL);
+
+
+ /* As there are new UI elements that don't know the system's state
+ * send an UPDATE REQUEST message which will trigger an UPDATE message with the current value*/
+ lv_msg_send(MSG_UPDATE_REQUEST, NULL);
+}
+
+
+static void value_handler(void * s, lv_msg_t * m)
+{
+ LV_UNUSED(s);
+
+ static int32_t value = 10;
+ int32_t old_value = value;
+ switch(lv_msg_get_id(m)) {
+ case MSG_INC:
+ if(value < 100) value++;
+ break;
+ case MSG_DEC:
+ if(value > 0) value--;
+ break;
+ case MSG_SET: {
+ const int32_t * new_value = lv_msg_get_payload(m);
+ value = *new_value;
+ }
+ break;
+ case MSG_UPDATE_REQUEST:
+ lv_msg_send(MSG_UPDATE, &value);
+ break;
+ default:
+ break;
+ }
+
+ if(value != old_value) {
+ lv_msg_send(MSG_UPDATE, &value);
+ }
+}
+
+
+static void btn_event_cb(lv_event_t * e)
+{
+ lv_obj_t * btn = lv_event_get_target(e);
+ lv_event_code_t code = lv_event_get_code(e);
+ if(code == LV_EVENT_CLICKED || code == LV_EVENT_LONG_PRESSED_REPEAT) {
+ if(lv_obj_get_index(btn) == 0) { /*First object is the dec. button*/
+ lv_msg_send(MSG_DEC, NULL);
+ }
+ else {
+ lv_msg_send(MSG_INC, NULL);
+ }
+ }
+}
+
+static void label_event_cb(lv_event_t * e)
+{
+ lv_obj_t * label = lv_event_get_target(e);
+ lv_event_code_t code = lv_event_get_code(e);
+ if(code == LV_EVENT_MSG_RECEIVED) {
+ lv_msg_t * m = lv_event_get_msg(e);
+ if(lv_msg_get_id(m) == MSG_UPDATE) {
+ const int32_t * v = lv_msg_get_payload(m);
+ lv_label_set_text_fmt(label, "%d %%", *v);
+ }
+ }
+}
+
+static void slider_event_cb(lv_event_t * e)
+{
+ lv_obj_t * slider = lv_event_get_target(e);
+ lv_event_code_t code = lv_event_get_code(e);
+ if(code == LV_EVENT_VALUE_CHANGED) {
+ int32_t v = lv_slider_get_value(slider);
+ lv_msg_send(MSG_SET, &v);
+ }
+ else if(code == LV_EVENT_MSG_RECEIVED) {
+ lv_msg_t * m = lv_event_get_msg(e);
+ if(lv_msg_get_id(m) == MSG_UPDATE) {
+ const int32_t * v = lv_msg_get_payload(m);
+ lv_slider_set_value(slider, *v, LV_ANIM_OFF);
+ }
+ }
+}
+
+#endif
diff --git a/examples/others/snapshot/index.rst b/examples/others/snapshot/index.rst
index e6e54af8c..65f27c695 100644
--- a/examples/others/snapshot/index.rst
+++ b/examples/others/snapshot/index.rst
@@ -1,5 +1,5 @@
-Simple snapshot example
+Simple snapshot example
"""""""""""""""""""
.. lv_example:: others/snapshot/lv_example_snapshot_1
diff --git a/examples/others/snapshot/lv_example_snapshot_1.c b/examples/others/snapshot/lv_example_snapshot_1.c
index ec396b154..054138684 100644
--- a/examples/others/snapshot/lv_example_snapshot_1.c
+++ b/examples/others/snapshot/lv_example_snapshot_1.c
@@ -1,14 +1,14 @@
#include "../../lv_examples.h"
#if LV_USE_SNAPSHOT && LV_BUILD_EXAMPLES
-static void event_cb(lv_event_t* e)
+static void event_cb(lv_event_t * e)
{
lv_obj_t * snapshot_obj = lv_event_get_user_data(e);
lv_obj_t * img = lv_event_get_target(e);
if(snapshot_obj) {
- lv_img_dsc_t* snapshot = (void*)lv_img_get_src(snapshot_obj);
- if(snapshot){
+ lv_img_dsc_t * snapshot = (void *)lv_img_get_src(snapshot_obj);
+ if(snapshot) {
lv_snapshot_free(snapshot);
}
diff --git a/examples/porting/lv_port_disp_template.c b/examples/porting/lv_port_disp_template.c
index 55d52091b..db943faed 100644
--- a/examples/porting/lv_port_disp_template.c
+++ b/examples/porting/lv_port_disp_template.c
@@ -3,18 +3,27 @@
*
*/
- /*Copy this file as "lv_port_disp.c" and set this value to "1" to enable content*/
+/*Copy this file as "lv_port_disp.c" and set this value to "1" to enable content*/
#if 0
/*********************
* INCLUDES
*********************/
#include "lv_port_disp_template.h"
-#include "../../lvgl.h"
+#include
/*********************
* DEFINES
*********************/
+#ifndef MY_DISP_HOR_RES
+ #warning Please define or replace the macro MY_DISP_HOR_RES with the actual screen width, default value 320 is used for now.
+ #define MY_DISP_HOR_RES 320
+#endif
+
+#ifndef MY_DISP_VER_RES
+ #warning Please define or replace the macro MY_DISP_HOR_RES with the actual screen height, default value 240 is used for now.
+ #define MY_DISP_VER_RES 240
+#endif
/**********************
* TYPEDEFS
@@ -88,7 +97,8 @@ void lv_port_disp_init(void)
static lv_disp_draw_buf_t draw_buf_dsc_3;
static lv_color_t buf_3_1[MY_DISP_HOR_RES * MY_DISP_VER_RES]; /*A screen sized buffer*/
static lv_color_t buf_3_2[MY_DISP_HOR_RES * MY_DISP_VER_RES]; /*Another screen sized buffer*/
- lv_disp_draw_buf_init(&draw_buf_dsc_3, buf_3_1, buf_3_2, MY_DISP_VER_RES * LV_VER_RES_MAX); /*Initialize the display buffer*/
+ lv_disp_draw_buf_init(&draw_buf_dsc_3, buf_3_1, buf_3_2,
+ MY_DISP_VER_RES * LV_VER_RES_MAX); /*Initialize the display buffer*/
/*-----------------------------------
* Register the display in LVGL
@@ -100,8 +110,8 @@ void lv_port_disp_init(void)
/*Set up the functions to access to your display*/
/*Set the resolution of the display*/
- disp_drv.hor_res = 480;
- disp_drv.ver_res = 320;
+ disp_drv.hor_res = MY_DISP_HOR_RES;
+ disp_drv.ver_res = MY_DISP_VER_RES;
/*Used to copy the buffer's content to the display*/
disp_drv.flush_cb = disp_flush;
@@ -110,7 +120,7 @@ void lv_port_disp_init(void)
disp_drv.draw_buf = &draw_buf_dsc_1;
/*Required for Example 3)*/
- //disp_drv.full_refresh = 1
+ //disp_drv.full_refresh = 1;
/* Fill a memory array with a color if you have GPU.
* Note that, in lv_conf.h you can enable GPUs that has built-in support in LVGL.
@@ -131,20 +141,38 @@ static void disp_init(void)
/*You code here*/
}
+volatile bool disp_flush_enabled = true;
+
+/* Enable updating the screen (the flushing process) when disp_flush() is called by LVGL
+ */
+void disp_enable_update(void)
+{
+ disp_flush_enabled = true;
+}
+
+/* Disable updating the screen (the flushing process) when disp_flush() is called by LVGL
+ */
+void disp_disable_update(void)
+{
+ disp_flush_enabled = false;
+}
+
/*Flush the content of the internal buffer the specific area on the display
*You can use DMA or any hardware acceleration to do this operation in the background but
*'lv_disp_flush_ready()' has to be called when finished.*/
static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{
- /*The most simple case (but also the slowest) to put all pixels to the screen one-by-one*/
-
- int32_t x;
- int32_t y;
- for(y = area->y1; y <= area->y2; y++) {
- for(x = area->x1; x <= area->x2; x++) {
- /*Put a pixel to the display. For example:*/
- /*put_px(x, y, *color_p)*/
- color_p++;
+ if(disp_flush_enabled) {
+ /*The most simple case (but also the slowest) to put all pixels to the screen one-by-one*/
+
+ int32_t x;
+ int32_t y;
+ for(y = area->y1; y <= area->y2; y++) {
+ for(x = area->x1; x <= area->x2; x++) {
+ /*Put a pixel to the display. For example:*/
+ /*put_px(x, y, *color_p)*/
+ color_p++;
+ }
}
}
diff --git a/examples/porting/lv_port_disp_template.h b/examples/porting/lv_port_disp_template.h
index bf1e08d0e..b3328d5e4 100644
--- a/examples/porting/lv_port_disp_template.h
+++ b/examples/porting/lv_port_disp_template.h
@@ -3,7 +3,7 @@
*
*/
- /*Copy this file as "lv_port_disp.h" and set this value to "1" to enable content*/
+/*Copy this file as "lv_port_disp.h" and set this value to "1" to enable content*/
#if 0
#ifndef LV_PORT_DISP_TEMPL_H
@@ -16,7 +16,11 @@ extern "C" {
/*********************
* INCLUDES
*********************/
+#if defined(LV_LVGL_H_INCLUDE_SIMPLE)
+#include "lvgl.h"
+#else
#include "lvgl/lvgl.h"
+#endif
/*********************
* DEFINES
@@ -29,8 +33,17 @@ extern "C" {
/**********************
* GLOBAL PROTOTYPES
**********************/
+/* Initialize low level display driver */
void lv_port_disp_init(void);
+/* Enable updating the screen (the flushing process) when disp_flush() is called by LVGL
+ */
+void disp_enable_update(void);
+
+/* Disable updating the screen (the flushing process) when disp_flush() is called by LVGL
+ */
+void disp_disable_update(void);
+
/**********************
* MACROS
**********************/
diff --git a/examples/porting/lv_port_fs_template.c b/examples/porting/lv_port_fs_template.c
index 75a3d2770..842d7c3ba 100644
--- a/examples/porting/lv_port_fs_template.c
+++ b/examples/porting/lv_port_fs_template.c
@@ -3,7 +3,7 @@
*
*/
- /*Copy this file as "lv_port_fs.c" and set this value to "1" to enable content*/
+/*Copy this file as "lv_port_fs.c" and set this value to "1" to enable content*/
#if 0
/*********************
@@ -33,7 +33,7 @@ static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs
static lv_fs_res_t fs_size(lv_fs_drv_t * drv, void * file_p, uint32_t * size_p);
static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p);
-static void * fs_dir_open(lv_fs_drv_t * drv, const char *path);
+static void * fs_dir_open(lv_fs_drv_t * drv, const char * path);
static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * rddir_p, char * fn);
static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * rddir_p);
@@ -109,18 +109,15 @@ static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode)
void * f = NULL;
- if(mode == LV_FS_MODE_WR)
- {
+ if(mode == LV_FS_MODE_WR) {
/*Open a file for write*/
f = ... /*Add your code here*/
}
- else if(mode == LV_FS_MODE_RD)
- {
+ else if(mode == LV_FS_MODE_RD) {
/*Open a file for read*/
f = ... /*Add your code here*/
}
- else if(mode == (LV_FS_MODE_WR | LV_FS_MODE_RD))
- {
+ else if(mode == (LV_FS_MODE_WR | LV_FS_MODE_RD)) {
/*Open a file for read and write*/
f = ... /*Add your code here*/
}
@@ -166,8 +163,8 @@ static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_
* @param drv pointer to a driver where this function belongs
* @param file_p pointer to a file_t variable
* @param buf pointer to a buffer with the bytes to write
- * @param btr Bytes To Write
- * @param br the number of real written bytes (Bytes Written). NULL if unused.
+ * @param btw Bytes To Write
+ * @param bw the number of real written bytes (Bytes Written). NULL if unused.
* @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum
*/
static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw)
@@ -217,12 +214,12 @@ static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p)
* @param path path to a directory
* @return pointer to the directory read descriptor or NULL on error
*/
-static void * fs_dir_open(lv_fs_drv_t * drv, const char *path)
+static void * fs_dir_open(lv_fs_drv_t * drv, const char * path)
{
void * dir = NULL;
/*Add your code here*/
dir = ... /*Add your code here*/
- return dir;
+ return dir;
}
/**
@@ -233,7 +230,7 @@ static void * fs_dir_open(lv_fs_drv_t * drv, const char *path)
* @param fn pointer to a buffer to store the filename
* @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum
*/
-static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * rddir_p, char *fn)
+static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * rddir_p, char * fn)
{
lv_fs_res_t res = LV_FS_RES_NOT_IMP;
diff --git a/examples/porting/lv_port_fs_template.h b/examples/porting/lv_port_fs_template.h
index ef39d4f51..b34fd3c4a 100644
--- a/examples/porting/lv_port_fs_template.h
+++ b/examples/porting/lv_port_fs_template.h
@@ -3,7 +3,7 @@
*
*/
- /*Copy this file as "lv_port_fs.h" and set this value to "1" to enable content*/
+/*Copy this file as "lv_port_fs.h" and set this value to "1" to enable content*/
#if 0
#ifndef LV_PORT_FS_TEMPL_H
@@ -29,7 +29,7 @@ extern "C" {
/**********************
* GLOBAL PROTOTYPES
**********************/
- void lv_port_fs_init(void);
+void lv_port_fs_init(void);
/**********************
* MACROS
diff --git a/examples/porting/lv_port_indev_template.c b/examples/porting/lv_port_indev_template.c
index d90b0c8de..5971a182b 100644
--- a/examples/porting/lv_port_indev_template.c
+++ b/examples/porting/lv_port_indev_template.c
@@ -3,7 +3,7 @@
*
*/
- /*Copy this file as "lv_port_indev.c" and set this value to "1" to enable content*/
+/*Copy this file as "lv_port_indev.c" and set this value to "1" to enable content*/
#if 0
/*********************
@@ -165,8 +165,8 @@ void lv_port_indev_init(void)
/*Assign buttons to points on the screen*/
static const lv_point_t btn_points[2] = {
- {10, 10}, /*Button 0 -> x:10; y:10*/
- {40, 100}, /*Button 1 -> x:40; y:100*/
+ {10, 10}, /*Button 0 -> x:10; y:10*/
+ {40, 100}, /*Button 1 -> x:40; y:100*/
};
lv_indev_set_button_points(indev_button, btn_points);
}
@@ -195,7 +195,8 @@ static void touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
if(touchpad_is_pressed()) {
touchpad_get_xy(&last_x, &last_y);
data->state = LV_INDEV_STATE_PR;
- } else {
+ }
+ else {
data->state = LV_INDEV_STATE_REL;
}
@@ -240,7 +241,8 @@ static void mouse_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
/*Get whether the mouse button is pressed or released*/
if(mouse_is_pressed()) {
data->state = LV_INDEV_STATE_PR;
- } else {
+ }
+ else {
data->state = LV_INDEV_STATE_REL;
}
}
@@ -287,25 +289,26 @@ static void keypad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
/*Translate the keys to LVGL control characters according to your key definitions*/
switch(act_key) {
- case 1:
- act_key = LV_KEY_NEXT;
- break;
- case 2:
- act_key = LV_KEY_PREV;
- break;
- case 3:
- act_key = LV_KEY_LEFT;
- break;
- case 4:
- act_key = LV_KEY_RIGHT;
- break;
- case 5:
- act_key = LV_KEY_ENTER;
- break;
+ case 1:
+ act_key = LV_KEY_NEXT;
+ break;
+ case 2:
+ act_key = LV_KEY_PREV;
+ break;
+ case 3:
+ act_key = LV_KEY_LEFT;
+ break;
+ case 4:
+ act_key = LV_KEY_RIGHT;
+ break;
+ case 5:
+ act_key = LV_KEY_ENTER;
+ break;
}
last_key = act_key;
- } else {
+ }
+ else {
data->state = LV_INDEV_STATE_REL;
}
@@ -369,7 +372,8 @@ static void button_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
if(btn_act >= 0) {
data->state = LV_INDEV_STATE_PR;
last_btn = btn_act;
- } else {
+ }
+ else {
data->state = LV_INDEV_STATE_REL;
}
diff --git a/examples/porting/lv_port_indev_template.h b/examples/porting/lv_port_indev_template.h
index 00eac2559..8a142bac4 100644
--- a/examples/porting/lv_port_indev_template.h
+++ b/examples/porting/lv_port_indev_template.h
@@ -4,7 +4,7 @@
*
*/
- /*Copy this file as "lv_port_indev.h" and set this value to "1" to enable content*/
+/*Copy this file as "lv_port_indev.h" and set this value to "1" to enable content*/
#if 0
#ifndef LV_PORT_INDEV_TEMPL_H
diff --git a/examples/scroll/index.rst b/examples/scroll/index.rst
index 94011a1b8..0b3920511 100644
--- a/examples/scroll/index.rst
+++ b/examples/scroll/index.rst
@@ -1,5 +1,5 @@
-Nested scrolling
+Nested scrolling
""""""""""""""""
.. lv_example:: scroll/lv_example_scroll_1
@@ -19,15 +19,15 @@ Styling the scrollbars
""""""""""""""""""""""""
.. lv_example:: scroll/lv_example_scroll_4
:language: c
-
+
Right to left scrolling
""""""""""""""""""""""""
.. lv_example:: scroll/lv_example_scroll_5
:language: c
-
+
Translate on scroll
""""""""""""""""""""""""
.. lv_example:: scroll/lv_example_scroll_6
:language: c
-
-
+
+
diff --git a/examples/scroll/lv_example_scroll_2.c b/examples/scroll/lv_example_scroll_2.c
index fa62097a2..37d19f0b1 100644
--- a/examples/scroll/lv_example_scroll_2.c
+++ b/examples/scroll/lv_example_scroll_2.c
@@ -34,7 +34,8 @@ void lv_example_scroll_2(void)
if(i == 3) {
lv_label_set_text_fmt(label, "Panel %"LV_PRIu32"\nno snap", i);
lv_obj_clear_flag(btn, LV_OBJ_FLAG_SNAPPABLE);
- } else {
+ }
+ else {
lv_label_set_text_fmt(label, "Panel %"LV_PRIu32, i);
}
diff --git a/examples/scroll/lv_example_scroll_2.py b/examples/scroll/lv_example_scroll_2.py
index 7d49e5d1f..52e40e309 100644
--- a/examples/scroll/lv_example_scroll_2.py
+++ b/examples/scroll/lv_example_scroll_2.py
@@ -21,7 +21,7 @@ def sw_event_cb(e,panel):
panel.set_flex_flow(lv.FLEX_FLOW.ROW)
panel.center()
-for i in range(10):
+for i in range(10):
btn = lv.btn(panel)
btn.set_size(150, 100)
diff --git a/examples/scroll/lv_example_scroll_3.c b/examples/scroll/lv_example_scroll_3.c
index a48476b48..1d05e6905 100644
--- a/examples/scroll/lv_example_scroll_3.c
+++ b/examples/scroll/lv_example_scroll_3.c
@@ -22,7 +22,7 @@ static void float_btn_event_cb(lv_event_t * e)
}
/**
- * Create a list a with a floating button
+ * Create a list with a floating button
*/
void lv_example_scroll_3(void)
{
diff --git a/examples/scroll/lv_example_scroll_3.py b/examples/scroll/lv_example_scroll_3.py
index bb575edbc..aae306e0a 100644
--- a/examples/scroll/lv_example_scroll_3.py
+++ b/examples/scroll/lv_example_scroll_3.py
@@ -2,7 +2,7 @@ class ScrollExample_3():
def __init__(self):
self.btn_cnt = 1
#
- # Create a list a with a floating button
+ # Create a list with a floating button
#
list = lv.list(lv.scr_act())
@@ -20,7 +20,7 @@ def __init__(self):
float_btn.set_style_radius(lv.RADIUS.CIRCLE, 0)
float_btn.set_style_bg_img_src(lv.SYMBOL.PLUS, 0)
float_btn.set_style_text_font(lv.theme_get_font_large(float_btn), 0)
-
+
def float_btn_event_cb(self,e,list):
code = e.get_code()
float_btn = e.get_target()
@@ -32,7 +32,7 @@ def float_btn_event_cb(self,e,list):
float_btn.move_foreground()
list_btn.scroll_to_view(lv.ANIM.ON)
-
+
scroll_example_3 = ScrollExample_3()
diff --git a/examples/scroll/lv_example_scroll_4.c b/examples/scroll/lv_example_scroll_4.c
index 55fb12e9c..5bbff5c2f 100644
--- a/examples/scroll/lv_example_scroll_4.c
+++ b/examples/scroll/lv_example_scroll_4.c
@@ -13,20 +13,20 @@ void lv_example_scroll_4(void)
lv_obj_t * label = lv_label_create(obj);
lv_label_set_text(label,
- "Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n"
- "Etiam dictum, tortor vestibulum lacinia laoreet, mi neque consectetur neque, vel mattis odio dolor egestas ligula. \n"
- "Sed vestibulum sapien nulla, id convallis ex porttitor nec. \n"
- "Duis et massa eu libero accumsan faucibus a in arcu. \n"
- "Ut pulvinar odio lorem, vel tempus turpis condimentum quis. Nam consectetur condimentum sem in auctor. \n"
- "Sed nisl augue, venenatis in blandit et, gravida ac tortor. \n"
- "Etiam dapibus elementum suscipit. \n"
- "Proin mollis sollicitudin convallis. \n"
- "Integer dapibus tempus arcu nec viverra. \n"
- "Donec molestie nulla enim, eu interdum velit placerat quis. \n"
- "Donec id efficitur risus, at molestie turpis. \n"
- "Suspendisse vestibulum consectetur nunc ut commodo. \n"
- "Fusce molestie rhoncus nisi sit amet tincidunt. \n"
- "Suspendisse a nunc ut magna ornare volutpat.");
+ "Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n"
+ "Etiam dictum, tortor vestibulum lacinia laoreet, mi neque consectetur neque, vel mattis odio dolor egestas ligula. \n"
+ "Sed vestibulum sapien nulla, id convallis ex porttitor nec. \n"
+ "Duis et massa eu libero accumsan faucibus a in arcu. \n"
+ "Ut pulvinar odio lorem, vel tempus turpis condimentum quis. Nam consectetur condimentum sem in auctor. \n"
+ "Sed nisl augue, venenatis in blandit et, gravida ac tortor. \n"
+ "Etiam dapibus elementum suscipit. \n"
+ "Proin mollis sollicitudin convallis. \n"
+ "Integer dapibus tempus arcu nec viverra. \n"
+ "Donec molestie nulla enim, eu interdum velit placerat quis. \n"
+ "Donec id efficitur risus, at molestie turpis. \n"
+ "Suspendisse vestibulum consectetur nunc ut commodo. \n"
+ "Fusce molestie rhoncus nisi sit amet tincidunt. \n"
+ "Suspendisse a nunc ut magna ornare volutpat.");
/*Remove the style of scrollbar to have clean start*/
diff --git a/examples/scroll/lv_example_scroll_5.c b/examples/scroll/lv_example_scroll_5.c
index 7e48ef355..60e65ffa2 100644
--- a/examples/scroll/lv_example_scroll_5.c
+++ b/examples/scroll/lv_example_scroll_5.c
@@ -13,7 +13,8 @@ void lv_example_scroll_5(void)
lv_obj_center(obj);
lv_obj_t * label = lv_label_create(obj);
- lv_label_set_text(label,"میکروکُنترولر (به انگلیسی: Microcontroller) گونهای ریزپردازنده است که دارای حافظهٔ دسترسی تصادفی (RAM) و حافظهٔ فقطخواندنی (ROM)، تایمر، پورتهای ورودی و خروجی (I/O) و درگاه ترتیبی (Serial Port پورت سریال)، درون خود تراشه است، و میتواند به تنهایی ابزارهای دیگر را کنترل کند. به عبارت دیگر یک میکروکنترلر، مدار مجتمع کوچکی است که از یک CPU کوچک و اجزای دیگری مانند تایمر، درگاههای ورودی و خروجی آنالوگ و دیجیتال و حافظه تشکیل شدهاست.");
+ lv_label_set_text(label,
+ "میکروکُنترولر (به انگلیسی: Microcontroller) گونهای ریزپردازنده است که دارای حافظهٔ دسترسی تصادفی (RAM) و حافظهٔ فقطخواندنی (ROM)، تایمر، پورتهای ورودی و خروجی (I/O) و درگاه ترتیبی (Serial Port پورت سریال)، درون خود تراشه است، و میتواند به تنهایی ابزارهای دیگر را کنترل کند. به عبارت دیگر یک میکروکنترلر، مدار مجتمع کوچکی است که از یک CPU کوچک و اجزای دیگری مانند تایمر، درگاههای ورودی و خروجی آنالوگ و دیجیتال و حافظه تشکیل شدهاست.");
lv_obj_set_width(label, 400);
lv_obj_set_style_text_font(label, &lv_font_dejavu_16_persian_hebrew, 0);
diff --git a/examples/scroll/lv_example_scroll_6.c b/examples/scroll/lv_example_scroll_6.c
index 68bdcd3a5..5ce864ac2 100644
--- a/examples/scroll/lv_example_scroll_6.c
+++ b/examples/scroll/lv_example_scroll_6.c
@@ -27,7 +27,8 @@ static void scroll_event_cb(lv_event_t * e)
/*If diff_y is out of the circle use the last point of the circle (the radius)*/
if(diff_y >= r) {
x = r;
- } else {
+ }
+ else {
/*Use Pythagoras theorem to get x from radius and y*/
uint32_t x_sqr = r * r - diff_y * diff_y;
lv_sqrt_res_t res;
diff --git a/examples/scroll/lv_example_scroll_6.py b/examples/scroll/lv_example_scroll_6.py
index cf3894f3b..9b1e9b864 100644
--- a/examples/scroll/lv_example_scroll_6.py
+++ b/examples/scroll/lv_example_scroll_6.py
@@ -7,7 +7,7 @@ def scroll_event_cb(e):
cont_y_center = cont_a.y1 + cont_a.get_height() // 2
r = cont.get_height() * 7 // 10
-
+
child_cnt = cont.get_child_cnt()
for i in range(child_cnt):
child = cont.get_child(i)
@@ -20,7 +20,7 @@ def scroll_event_cb(e):
diff_y = abs(diff_y)
# Get the x of diff_y on a circle.
-
+
# If diff_y is out of the circle use the last point of the circle (the radius)
if diff_y >= r:
x = r
@@ -56,7 +56,7 @@ def scroll_event_cb(e):
for i in range(20):
btn = lv.btn(cont)
btn.set_width(lv.pct(100))
-
+
label = lv.label(btn)
label.set_text("Button " + str(i))
diff --git a/examples/styles/index.rst b/examples/styles/index.rst
index 5c84d95f0..a76ff1e73 100644
--- a/examples/styles/index.rst
+++ b/examples/styles/index.rst
@@ -28,64 +28,71 @@ Shadow styles
.. lv_example:: styles/lv_example_style_5
:language: c
-
+
Image styles
""""""""""""""""""""""""
.. lv_example:: styles/lv_example_style_6
:language: c
-
+
Arc styles
""""""""""""""""""""""""
.. lv_example:: style/lv_example_style_7
:language: c
-
+
Text styles
""""""""""""""""""""""""
.. lv_example:: styles/lv_example_style_8
:language: c
-
+
Line styles
""""""""""""""""""""""""
.. lv_example:: styles/lv_example_style_9
:language: c
-
-
+
+
Transition
""""""""""""""""""""""""
.. lv_example:: styles/lv_example_style_10
:language: c
-
-
+
+
Using multiple styles
""""""""""""""""""""""""
.. lv_example:: styles/lv_example_style_11
:language: c
-
-
+
+
Local styles
""""""""""""""""""""""""
.. lv_example:: styles/lv_example_style_12
:language: c
-
-
+
+
Add styles to parts and states
"""""""""""""""""""""""""""""""
.. lv_example:: styles/lv_example_style_13
:language: c
-
-
+
+
Extending the current theme
""""""""""""""""""""""""""""""""""
.. lv_example:: styles/lv_example_style_14
:language: c
-
-
+
+
+Opacity and Transformations
+""""""""""""""""""""""""""""""""""
+
+.. lv_example:: styles/lv_example_style_15
+ :language: c
+
+
diff --git a/examples/styles/lv_example_style.h b/examples/styles/lv_example_style.h
index 40d106b05..680443cc5 100644
--- a/examples/styles/lv_example_style.h
+++ b/examples/styles/lv_example_style.h
@@ -39,6 +39,7 @@ void lv_example_style_11(void);
void lv_example_style_12(void);
void lv_example_style_13(void);
void lv_example_style_14(void);
+void lv_example_style_15(void);
/**********************
* MACROS
diff --git a/examples/styles/lv_example_style_1.c b/examples/styles/lv_example_style_1.c
index ccfe3af0d..948c5d294 100644
--- a/examples/styles/lv_example_style_1.c
+++ b/examples/styles/lv_example_style_1.c
@@ -6,26 +6,26 @@
*/
void lv_example_style_1(void)
{
- static lv_style_t style;
- lv_style_init(&style);
- lv_style_set_radius(&style, 5);
+ static lv_style_t style;
+ lv_style_init(&style);
+ lv_style_set_radius(&style, 5);
- /*Make a gradient*/
- lv_style_set_width(&style, 150);
- lv_style_set_height(&style, LV_SIZE_CONTENT);
+ /*Make a gradient*/
+ lv_style_set_width(&style, 150);
+ lv_style_set_height(&style, LV_SIZE_CONTENT);
- lv_style_set_pad_ver(&style, 20);
- lv_style_set_pad_left(&style, 5);
+ lv_style_set_pad_ver(&style, 20);
+ lv_style_set_pad_left(&style, 5);
- lv_style_set_x(&style, lv_pct(50));
- lv_style_set_y(&style, 80);
+ lv_style_set_x(&style, lv_pct(50));
+ lv_style_set_y(&style, 80);
- /*Create an object with the new style*/
- lv_obj_t * obj = lv_obj_create(lv_scr_act());
- lv_obj_add_style(obj, &style, 0);
+ /*Create an object with the new style*/
+ lv_obj_t * obj = lv_obj_create(lv_scr_act());
+ lv_obj_add_style(obj, &style, 0);
- lv_obj_t * label = lv_label_create(obj);
- lv_label_set_text(label, "Hello");
+ lv_obj_t * label = lv_label_create(obj);
+ lv_label_set_text(label, "Hello");
}
#endif
diff --git a/examples/styles/lv_example_style_12.c b/examples/styles/lv_example_style_12.c
index a925d657b..5eb25e866 100644
--- a/examples/styles/lv_example_style_12.c
+++ b/examples/styles/lv_example_style_12.c
@@ -16,7 +16,7 @@ void lv_example_style_12(void)
lv_obj_add_style(obj, &style, 0);
/*Overwrite the background color locally*/
- lv_obj_set_style_bg_color(obj,lv_palette_main(LV_PALETTE_ORANGE), LV_PART_MAIN);
+ lv_obj_set_style_bg_color(obj, lv_palette_main(LV_PALETTE_ORANGE), LV_PART_MAIN);
lv_obj_center(obj);
}
diff --git a/examples/styles/lv_example_style_14.py b/examples/styles/lv_example_style_14.py
index 7a8043375..fbb5702d9 100644
--- a/examples/styles/lv_example_style_14.py
+++ b/examples/styles/lv_example_style_14.py
@@ -12,16 +12,16 @@ def __init__(self):
self.style_btn.set_border_color(lv.palette_darken(lv.PALETTE.GREEN, 3))
self.style_btn.set_border_width(3)
- # This theme is based on active theme
+ # This theme is based on active theme
th_act = lv.theme_get_from_obj(lv.scr_act())
# This theme will be applied only after base theme is applied
- self.set_parent(th_act)
+ self.set_parent(th_act)
class ExampleStyle_14:
-
+
def __init__(self):
- #
+ #
# Extending the current theme
#
@@ -30,23 +30,23 @@ def __init__(self):
label = lv.label(btn)
label.set_text("Original theme")
-
+
self.new_theme_init_and_set()
-
+
btn = lv.btn(lv.scr_act())
btn.align(lv.ALIGN.BOTTOM_MID, 0, -20)
-
+
label = lv.label(btn)
label.set_text("New theme")
-
+
def new_theme_apply_cb(self, th, obj):
print(th,obj)
if obj.get_class() == lv.btn_class:
obj.add_style(self.th_new.style_btn, 0)
-
+
def new_theme_init_and_set(self):
print("new_theme_init_and_set")
- # Initialize the new theme from the current theme
+ # Initialize the new theme from the current theme
self.th_new = NewTheme()
self.th_new.set_apply_cb(self.new_theme_apply_cb)
lv.disp_get_default().set_theme(self.th_new)
diff --git a/examples/styles/lv_example_style_15.c b/examples/styles/lv_example_style_15.c
new file mode 100644
index 000000000..cab321f71
--- /dev/null
+++ b/examples/styles/lv_example_style_15.c
@@ -0,0 +1,50 @@
+#include "../lv_examples.h"
+#if LV_BUILD_EXAMPLES && LV_USE_BTN && LV_USE_LABEL
+
+
+
+/**
+ * Opacity and Transformations
+ */
+void lv_example_style_15(void)
+{
+ lv_obj_t * btn;
+ lv_obj_t * label;
+
+ /*Normal button*/
+ btn = lv_btn_create(lv_scr_act());
+ lv_obj_set_size(btn, 100, 40);
+ lv_obj_align(btn, LV_ALIGN_CENTER, 0, -70);
+
+ label = lv_label_create(btn);
+ lv_label_set_text(label, "Normal");
+ lv_obj_center(label);
+
+ /*Set opacity
+ *The button and the label is rendered to a layer first and that layer is blended*/
+ btn = lv_btn_create(lv_scr_act());
+ lv_obj_set_size(btn, 100, 40);
+ lv_obj_set_style_opa(btn, LV_OPA_50, 0);
+ lv_obj_align(btn, LV_ALIGN_CENTER, 0, 0);
+
+ label = lv_label_create(btn);
+ lv_label_set_text(label, "Opa:50%");
+ lv_obj_center(label);
+
+ /*Set transformations
+ *The button and the label is rendered to a layer first and that layer is transformed*/
+ btn = lv_btn_create(lv_scr_act());
+ lv_obj_set_size(btn, 100, 40);
+ lv_obj_set_style_transform_angle(btn, 150, 0); /*15 deg*/
+ lv_obj_set_style_transform_zoom(btn, 256 + 64, 0); /*1.25x*/
+ lv_obj_set_style_transform_pivot_x(btn, 50, 0);
+ lv_obj_set_style_transform_pivot_y(btn, 20, 0);
+ lv_obj_set_style_opa(btn, LV_OPA_50, 0);
+ lv_obj_align(btn, LV_ALIGN_CENTER, 0, 70);
+
+ label = lv_label_create(btn);
+ lv_label_set_text(label, "Transf.");
+ lv_obj_center(label);
+}
+
+#endif
diff --git a/examples/styles/lv_example_style_5.c b/examples/styles/lv_example_style_5.c
index 7857fd249..8bc8afbe6 100644
--- a/examples/styles/lv_example_style_5.c
+++ b/examples/styles/lv_example_style_5.c
@@ -17,8 +17,8 @@ void lv_example_style_5(void)
/*Add a shadow*/
lv_style_set_shadow_width(&style, 55);
lv_style_set_shadow_color(&style, lv_palette_main(LV_PALETTE_BLUE));
-// lv_style_set_shadow_ofs_x(&style, 10);
-// lv_style_set_shadow_ofs_y(&style, 20);
+ // lv_style_set_shadow_ofs_x(&style, 10);
+ // lv_style_set_shadow_ofs_y(&style, 20);
/*Create an object with the new style*/
lv_obj_t * obj = lv_obj_create(lv_scr_act());
diff --git a/examples/styles/lv_example_style_6.py b/examples/styles/lv_example_style_6.py
index 91ea0c3fe..9efe14e45 100644
--- a/examples/styles/lv_example_style_6.py
+++ b/examples/styles/lv_example_style_6.py
@@ -11,10 +11,10 @@
except:
print("Could not find img_cogwheel_argb.png")
sys.exit()
-
+
img_cogwheel_argb = lv.img_dsc_t({
'data_size': len(png_data),
- 'data': png_data
+ 'data': png_data
})
#
diff --git a/examples/styles/lv_example_style_8.c b/examples/styles/lv_example_style_8.c
index 14bf89270..d816b02d7 100644
--- a/examples/styles/lv_example_style_8.c
+++ b/examples/styles/lv_example_style_8.c
@@ -25,7 +25,7 @@ void lv_example_style_8(void)
lv_obj_t * obj = lv_label_create(lv_scr_act());
lv_obj_add_style(obj, &style, 0);
lv_label_set_text(obj, "Text of\n"
- "a label");
+ "a label");
lv_obj_center(obj);
}
diff --git a/examples/styles/lv_example_style_9.py b/examples/styles/lv_example_style_9.py
index 00dadf730..7f54d3f3a 100644
--- a/examples/styles/lv_example_style_9.py
+++ b/examples/styles/lv_example_style_9.py
@@ -12,8 +12,8 @@
# Create an object with the new style
obj = lv.line(lv.scr_act())
obj.add_style(style, 0)
-p = [ {"x":10, "y":30},
- {"x":30, "y":50},
+p = [ {"x":10, "y":30},
+ {"x":30, "y":50},
{"x":100, "y":0}]
obj.set_points(p, 3)
diff --git a/examples/widgets/animimg/index.rst b/examples/widgets/animimg/index.rst
index 8dd3337b6..d36a9498f 100644
--- a/examples/widgets/animimg/index.rst
+++ b/examples/widgets/animimg/index.rst
@@ -1,5 +1,5 @@
-Simple Animation Image
+Simple Animation Image
""""""""""""""""
.. lv_example:: widgets/animimg/lv_example_animimg_1
diff --git a/examples/widgets/animimg/lv_example_animimg_1.c b/examples/widgets/animimg/lv_example_animimg_1.c
index 9f7045f58..84ea96501 100644
--- a/examples/widgets/animimg/lv_example_animimg_1.c
+++ b/examples/widgets/animimg/lv_example_animimg_1.c
@@ -4,7 +4,7 @@ LV_IMG_DECLARE(animimg001)
LV_IMG_DECLARE(animimg002)
LV_IMG_DECLARE(animimg003)
-static const lv_img_dsc_t* anim_imgs[3] = {
+static const lv_img_dsc_t * anim_imgs[3] = {
&animimg001,
&animimg002,
&animimg003,
@@ -14,7 +14,7 @@ void lv_example_animimg_1(void)
{
lv_obj_t * animimg0 = lv_animimg_create(lv_scr_act());
lv_obj_center(animimg0);
- lv_animimg_set_src(animimg0, (lv_img_dsc_t**) anim_imgs, 3);
+ lv_animimg_set_src(animimg0, (lv_img_dsc_t **) anim_imgs, 3);
lv_animimg_set_duration(animimg0, 1000);
lv_animimg_set_repeat_count(animimg0, LV_ANIM_REPEAT_INFINITE);
lv_animimg_start(animimg0);
diff --git a/examples/widgets/animimg/lv_example_animimg_1.py b/examples/widgets/animimg/lv_example_animimg_1.py
index 93938e7c7..f3a31fd02 100644
--- a/examples/widgets/animimg/lv_example_animimg_1.py
+++ b/examples/widgets/animimg/lv_example_animimg_1.py
@@ -13,10 +13,10 @@
except:
print("Could not find animimg001.png")
sys.exit()
-
+
anim_imgs[0] = lv.img_dsc_t({
'data_size': len(anim001_data),
- 'data': anim001_data
+ 'data': anim001_data
})
try:
@@ -25,10 +25,10 @@
except:
print("Could not find animimg002.png")
sys.exit()
-
+
anim_imgs[1] = lv.img_dsc_t({
'data_size': len(anim002_data),
- 'data': anim002_data
+ 'data': anim002_data
})
try:
@@ -37,10 +37,10 @@
except:
print("Could not find animimg003.png")
sys.exit()
-
+
anim_imgs[2] = lv.img_dsc_t({
'data_size': len(anim003_data),
- 'data': anim003_data
+ 'data': anim003_data
})
animimg0 = lv.animimg(lv.scr_act())
diff --git a/examples/widgets/arc/index.rst b/examples/widgets/arc/index.rst
index c257384ef..8dea69d50 100644
--- a/examples/widgets/arc/index.rst
+++ b/examples/widgets/arc/index.rst
@@ -1,12 +1,12 @@
-Simple Arc
+Simple Arc
""""""""""""""""
.. lv_example:: widgets/arc/lv_example_arc_1
:language: c
:description: A simple example to demonstrate the use of an arc.
-Loader with Arc
+Loader with Arc
""""""""""""""""
.. lv_example:: widgets/arc/lv_example_arc_2
diff --git a/examples/widgets/arc/lv_example_arc_1.c b/examples/widgets/arc/lv_example_arc_1.c
index 28ddaacd9..e1ff4e868 100644
--- a/examples/widgets/arc/lv_example_arc_1.c
+++ b/examples/widgets/arc/lv_example_arc_1.c
@@ -2,15 +2,34 @@
#if LV_USE_ARC && LV_BUILD_EXAMPLES
+static void value_changed_event_cb(lv_event_t * e);
+
void lv_example_arc_1(void)
{
- /*Create an Arc*/
- lv_obj_t * arc = lv_arc_create(lv_scr_act());
- lv_obj_set_size(arc, 150, 150);
- lv_arc_set_rotation(arc, 135);
- lv_arc_set_bg_angles(arc, 0, 270);
- lv_arc_set_value(arc, 40);
- lv_obj_center(arc);
+ lv_obj_t * label = lv_label_create(lv_scr_act());
+
+ /*Create an Arc*/
+ lv_obj_t * arc = lv_arc_create(lv_scr_act());
+ lv_obj_set_size(arc, 150, 150);
+ lv_arc_set_rotation(arc, 135);
+ lv_arc_set_bg_angles(arc, 0, 270);
+ lv_arc_set_value(arc, 10);
+ lv_obj_center(arc);
+ lv_obj_add_event_cb(arc, value_changed_event_cb, LV_EVENT_VALUE_CHANGED, label);
+
+ /*Manually update the label for the first time*/
+ lv_event_send(arc, LV_EVENT_VALUE_CHANGED, NULL);
+}
+
+static void value_changed_event_cb(lv_event_t * e)
+{
+ lv_obj_t * arc = lv_event_get_target(e);
+ lv_obj_t * label = lv_event_get_user_data(e);
+
+ lv_label_set_text_fmt(label, "%d%%", lv_arc_get_value(arc));
+
+ /*Rotate the label to the current position of the arc*/
+ lv_arc_rotate_obj_to_angle(arc, label, 25);
}
#endif
diff --git a/examples/widgets/arc/lv_example_arc_2.c b/examples/widgets/arc/lv_example_arc_2.c
index 438c44e61..3b94a75e2 100644
--- a/examples/widgets/arc/lv_example_arc_2.c
+++ b/examples/widgets/arc/lv_example_arc_2.c
@@ -12,23 +12,23 @@ static void set_angle(void * obj, int32_t v)
*/
void lv_example_arc_2(void)
{
- /*Create an Arc*/
- lv_obj_t * arc = lv_arc_create(lv_scr_act());
- lv_arc_set_rotation(arc, 270);
- lv_arc_set_bg_angles(arc, 0, 360);
- lv_obj_remove_style(arc, NULL, LV_PART_KNOB); /*Be sure the knob is not displayed*/
- lv_obj_clear_flag(arc, LV_OBJ_FLAG_CLICKABLE); /*To not allow adjusting by click*/
- lv_obj_center(arc);
-
- lv_anim_t a;
- lv_anim_init(&a);
- lv_anim_set_var(&a, arc);
- lv_anim_set_exec_cb(&a, set_angle);
- lv_anim_set_time(&a, 1000);
- lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); /*Just for the demo*/
- lv_anim_set_repeat_delay(&a, 500);
- lv_anim_set_values(&a, 0, 100);
- lv_anim_start(&a);
+ /*Create an Arc*/
+ lv_obj_t * arc = lv_arc_create(lv_scr_act());
+ lv_arc_set_rotation(arc, 270);
+ lv_arc_set_bg_angles(arc, 0, 360);
+ lv_obj_remove_style(arc, NULL, LV_PART_KNOB); /*Be sure the knob is not displayed*/
+ lv_obj_clear_flag(arc, LV_OBJ_FLAG_CLICKABLE); /*To not allow adjusting by click*/
+ lv_obj_center(arc);
+
+ lv_anim_t a;
+ lv_anim_init(&a);
+ lv_anim_set_var(&a, arc);
+ lv_anim_set_exec_cb(&a, set_angle);
+ lv_anim_set_time(&a, 1000);
+ lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); /*Just for the demo*/
+ lv_anim_set_repeat_delay(&a, 500);
+ lv_anim_set_values(&a, 0, 100);
+ lv_anim_start(&a);
diff --git a/examples/widgets/arc/lv_example_arc_2.py b/examples/widgets/arc/lv_example_arc_2.py
index a55058728..91336e2a1 100644
--- a/examples/widgets/arc/lv_example_arc_2.py
+++ b/examples/widgets/arc/lv_example_arc_2.py
@@ -4,7 +4,7 @@
class ArcLoader():
def __init__(self):
self.a = 270
-
+
def arc_loader_cb(self,tim,arc):
# print(tim,arc)
self.a += 5
@@ -33,5 +33,5 @@ def arc_loader_cb(self,tim,arc):
timer = lv.timer_create_basic()
timer.set_period(20)
timer.set_cb(lambda src: arc_loader.arc_loader_cb(timer,arc))
-
+
diff --git a/examples/widgets/bar/index.rst b/examples/widgets/bar/index.rst
index 5aba5a745..4c4bb850e 100644
--- a/examples/widgets/bar/index.rst
+++ b/examples/widgets/bar/index.rst
@@ -1,27 +1,27 @@
-Simple Bar
+Simple Bar
""""""""""""""""
.. lv_example:: widgets/bar/lv_example_bar_1
:language: c
-
+
Styling a bar
""""""""""""""""
.. lv_example:: widgets/bar/lv_example_bar_2
:language: c
-
+
Temperature meter
""""""""""""""""""
.. lv_example:: widgets/bar/lv_example_bar_3
:language: c
-
+
Stripe pattern and range value
""""""""""""""""""""""""""""""""
.. lv_example:: widgets/bar/lv_example_bar_4
:language: c
-
+
Bar with LTR and RTL base direction
""""""""""""""""""""""""""""""""""""
@@ -33,4 +33,4 @@ Custom drawer to show the current value
.. lv_example:: widgets/bar/lv_example_bar_6
:language: c
-
+
diff --git a/examples/widgets/bar/lv_example_bar_4.py b/examples/widgets/bar/lv_example_bar_4.py
index 3d534a4b3..dcfb19246 100644
--- a/examples/widgets/bar/lv_example_bar_4.py
+++ b/examples/widgets/bar/lv_example_bar_4.py
@@ -8,9 +8,9 @@ def get_icon(filename,xres,yres):
with open(sdl_filename,'rb') as f:
icon_data = f.read()
except:
- print("Could not find image file: " + filename)
+ print("Could not find image file: " + filename)
return None
-
+
icon_dsc = lv.img_dsc_t(
{
"header": {"always_zero": 0, "w": xres, "h": yres, "cf": lv.img.CF.TRUE_COLOR_ALPHA},
@@ -42,4 +42,4 @@ def get_icon(filename,xres,yres):
bar.set_start_value(20, lv.ANIM.OFF)
-
+
diff --git a/examples/widgets/bar/lv_example_bar_6.c b/examples/widgets/bar/lv_example_bar_6.c
index 8e50b8acd..2a159cc5a 100644
--- a/examples/widgets/bar/lv_example_bar_6.c
+++ b/examples/widgets/bar/lv_example_bar_6.c
@@ -1,17 +1,17 @@
#include "../../lv_examples.h"
#if LV_USE_BAR && LV_BUILD_EXAMPLES
-static void set_value(void *bar, int32_t v)
+static void set_value(void * bar, int32_t v)
{
lv_bar_set_value(bar, v, LV_ANIM_OFF);
}
static void event_cb(lv_event_t * e)
{
- lv_obj_draw_part_dsc_t * dsc = lv_event_get_param(e);
+ lv_obj_draw_part_dsc_t * dsc = lv_event_get_draw_part_dsc(e);
if(dsc->part != LV_PART_INDICATOR) return;
- lv_obj_t * obj= lv_event_get_target(e);
+ lv_obj_t * obj = lv_event_get_target(e);
lv_draw_label_dsc_t label_dsc;
lv_draw_label_dsc_init(&label_dsc);
@@ -21,7 +21,8 @@ static void event_cb(lv_event_t * e)
lv_snprintf(buf, sizeof(buf), "%d", (int)lv_bar_get_value(obj));
lv_point_t txt_size;
- lv_txt_get_size(&txt_size, buf, label_dsc.font, label_dsc.letter_space, label_dsc.line_space, LV_COORD_MAX, label_dsc.flag);
+ lv_txt_get_size(&txt_size, buf, label_dsc.font, label_dsc.letter_space, label_dsc.line_space, LV_COORD_MAX,
+ label_dsc.flag);
lv_area_t txt_area;
/*If the indicator is long enough put the text inside on the right*/
diff --git a/examples/widgets/btn/index.rst b/examples/widgets/btn/index.rst
index dc1ab0f85..de4adb111 100644
--- a/examples/widgets/btn/index.rst
+++ b/examples/widgets/btn/index.rst
@@ -1,5 +1,5 @@
-Simple Buttons
+Simple Buttons
""""""""""""""""
.. lv_example:: widgets/btn/lv_example_btn_1
@@ -11,7 +11,7 @@ Styling buttons
.. lv_example:: widgets/btn/lv_example_btn_2
:language: c
-
+
Gummy button
""""""""""""""""
diff --git a/examples/widgets/btn/lv_example_btn_1.py b/examples/widgets/btn/lv_example_btn_1.py
index ebf684488..19fdba1df 100644
--- a/examples/widgets/btn/lv_example_btn_1.py
+++ b/examples/widgets/btn/lv_example_btn_1.py
@@ -5,7 +5,7 @@ def event_handler(evt):
print("Clicked event seen")
elif code == lv.EVENT.VALUE_CHANGED:
print("Value changed seen")
-
+
# create a simple button
btn1 = lv.btn(lv.scr_act())
diff --git a/examples/widgets/btn/lv_example_btn_3.c b/examples/widgets/btn/lv_example_btn_3.c
index 1b8ef662a..24d76c340 100644
--- a/examples/widgets/btn/lv_example_btn_3.c
+++ b/examples/widgets/btn/lv_example_btn_3.c
@@ -8,7 +8,7 @@ void lv_example_btn_3(void)
{
/*Properties to transition*/
static lv_style_prop_t props[] = {
- LV_STYLE_TRANSFORM_WIDTH, LV_STYLE_TRANSFORM_HEIGHT, LV_STYLE_TEXT_LETTER_SPACE, 0
+ LV_STYLE_TRANSFORM_WIDTH, LV_STYLE_TRANSFORM_HEIGHT, LV_STYLE_TEXT_LETTER_SPACE, 0
};
/*Transition descriptor when going back to the default state.
diff --git a/examples/widgets/btnmatrix/index.rst b/examples/widgets/btnmatrix/index.rst
index 0a882b827..9f569eac6 100644
--- a/examples/widgets/btnmatrix/index.rst
+++ b/examples/widgets/btnmatrix/index.rst
@@ -1,19 +1,19 @@
-Simple Button matrix
+Simple Button matrix
""""""""""""""""""""""
.. lv_example:: widgets/btnmatrix/lv_example_btnmatrix_1
:language: c
-Custom buttons
+Custom buttons
""""""""""""""""""""""
.. lv_example:: widgets/btnmatrix/lv_example_btnmatrix_2
:language: c
-Pagination
+Pagination
""""""""""""""""""""""
.. lv_example:: widgets/btnmatrix/lv_example_btnmatrix_3
diff --git a/examples/widgets/btnmatrix/lv_example_btnmatrix_1.c b/examples/widgets/btnmatrix/lv_example_btnmatrix_1.c
index 3119ede17..262165ff3 100644
--- a/examples/widgets/btnmatrix/lv_example_btnmatrix_1.c
+++ b/examples/widgets/btnmatrix/lv_example_btnmatrix_1.c
@@ -16,7 +16,8 @@ static void event_handler(lv_event_t * e)
static const char * btnm_map[] = {"1", "2", "3", "4", "5", "\n",
"6", "7", "8", "9", "0", "\n",
- "Action1", "Action2", ""};
+ "Action1", "Action2", ""
+ };
void lv_example_btnmatrix_1(void)
{
diff --git a/examples/widgets/btnmatrix/lv_example_btnmatrix_2.c b/examples/widgets/btnmatrix/lv_example_btnmatrix_2.c
index 5f42d5dbe..985a3d1e1 100644
--- a/examples/widgets/btnmatrix/lv_example_btnmatrix_2.c
+++ b/examples/widgets/btnmatrix/lv_example_btnmatrix_2.c
@@ -7,54 +7,60 @@ static void event_cb(lv_event_t * e)
lv_event_code_t code = lv_event_get_code(e);
lv_obj_t * obj = lv_event_get_target(e);
if(code == LV_EVENT_DRAW_PART_BEGIN) {
- lv_obj_draw_part_dsc_t * dsc = lv_event_get_param(e);
+ lv_obj_draw_part_dsc_t * dsc = lv_event_get_draw_part_dsc(e);
- /*Change the draw descriptor the 2nd button*/
- if(dsc->id == 1) {
- dsc->rect_dsc->radius = 0;
- if(lv_btnmatrix_get_selected_btn(obj) == dsc->id) dsc->rect_dsc->bg_color = lv_palette_darken(LV_PALETTE_BLUE, 3);
- else dsc->rect_dsc->bg_color = lv_palette_main(LV_PALETTE_BLUE);
+ /*When the button matrix draws the buttons...*/
+ if(dsc->class_p == &lv_btnmatrix_class && dsc->type == LV_BTNMATRIX_DRAW_PART_BTN) {
+ /*Change the draw descriptor of the 2nd button*/
+ if(dsc->id == 1) {
+ dsc->rect_dsc->radius = 0;
+ if(lv_btnmatrix_get_selected_btn(obj) == dsc->id) dsc->rect_dsc->bg_color = lv_palette_darken(LV_PALETTE_BLUE, 3);
+ else dsc->rect_dsc->bg_color = lv_palette_main(LV_PALETTE_BLUE);
- dsc->rect_dsc->shadow_width = 6;
- dsc->rect_dsc->shadow_ofs_x = 3;
- dsc->rect_dsc->shadow_ofs_y = 3;
- dsc->label_dsc->color = lv_color_white();
- }
- /*Change the draw descriptor the 3rd button*/
- else if(dsc->id == 2) {
- dsc->rect_dsc->radius = LV_RADIUS_CIRCLE;
- if(lv_btnmatrix_get_selected_btn(obj) == dsc->id) dsc->rect_dsc->bg_color = lv_palette_darken(LV_PALETTE_RED, 3);
- else dsc->rect_dsc->bg_color = lv_palette_main(LV_PALETTE_RED);
+ dsc->rect_dsc->shadow_width = 6;
+ dsc->rect_dsc->shadow_ofs_x = 3;
+ dsc->rect_dsc->shadow_ofs_y = 3;
+ dsc->label_dsc->color = lv_color_white();
+ }
+ /*Change the draw descriptor of the 3rd button*/
+ else if(dsc->id == 2) {
+ dsc->rect_dsc->radius = LV_RADIUS_CIRCLE;
+ if(lv_btnmatrix_get_selected_btn(obj) == dsc->id) dsc->rect_dsc->bg_color = lv_palette_darken(LV_PALETTE_RED, 3);
+ else dsc->rect_dsc->bg_color = lv_palette_main(LV_PALETTE_RED);
- dsc->label_dsc->color = lv_color_white();
- }
- else if(dsc->id == 3) {
- dsc->label_dsc->opa = LV_OPA_TRANSP; /*Hide the text if any*/
+ dsc->label_dsc->color = lv_color_white();
+ }
+ else if(dsc->id == 3) {
+ dsc->label_dsc->opa = LV_OPA_TRANSP; /*Hide the text if any*/
+ }
}
}
if(code == LV_EVENT_DRAW_PART_END) {
- lv_obj_draw_part_dsc_t * dsc = lv_event_get_param(e);
+ lv_obj_draw_part_dsc_t * dsc = lv_event_get_draw_part_dsc(e);
- /*Add custom content to the 4th button when the button itself was drawn*/
- if(dsc->id == 3) {
- LV_IMG_DECLARE(img_star);
- lv_img_header_t header;
- lv_res_t res = lv_img_decoder_get_info(&img_star, &header);
- if(res != LV_RES_OK) return;
+ /*When the button matrix draws the buttons...*/
+ if(dsc->class_p == &lv_btnmatrix_class && dsc->type == LV_BTNMATRIX_DRAW_PART_BTN) {
+ /*Add custom content to the 4th button when the button itself was drawn*/
+ if(dsc->id == 3) {
+ LV_IMG_DECLARE(img_star);
+ lv_img_header_t header;
+ lv_res_t res = lv_img_decoder_get_info(&img_star, &header);
+ if(res != LV_RES_OK) return;
- lv_area_t a;
- a.x1 = dsc->draw_area->x1 + (lv_area_get_width(dsc->draw_area) - header.w) / 2;
- a.x2 = a.x1 + header.w - 1;
- a.y1 = dsc->draw_area->y1 + (lv_area_get_height(dsc->draw_area) - header.h) / 2;
- a.y2 = a.y1 + header.h - 1;
+ lv_area_t a;
+ a.x1 = dsc->draw_area->x1 + (lv_area_get_width(dsc->draw_area) - header.w) / 2;
+ a.x2 = a.x1 + header.w - 1;
+ a.y1 = dsc->draw_area->y1 + (lv_area_get_height(dsc->draw_area) - header.h) / 2;
+ a.y2 = a.y1 + header.h - 1;
- lv_draw_img_dsc_t img_draw_dsc;
- lv_draw_img_dsc_init(&img_draw_dsc);
- img_draw_dsc.recolor = lv_color_black();
- if(lv_btnmatrix_get_selected_btn(obj) == dsc->id) img_draw_dsc.recolor_opa = LV_OPA_30;
+ lv_draw_img_dsc_t img_draw_dsc;
+ lv_draw_img_dsc_init(&img_draw_dsc);
+ img_draw_dsc.recolor = lv_color_black();
+ if(lv_btnmatrix_get_selected_btn(obj) == dsc->id) img_draw_dsc.recolor_opa = LV_OPA_30;
- lv_draw_img(dsc->draw_ctx, &img_draw_dsc, &a, &img_star);
+ lv_draw_img(dsc->draw_ctx, &img_draw_dsc, &a, &img_star);
+ }
}
}
}
diff --git a/examples/widgets/btnmatrix/lv_example_btnmatrix_2.py b/examples/widgets/btnmatrix/lv_example_btnmatrix_2.py
index 438199002..21f7c71fa 100644
--- a/examples/widgets/btnmatrix/lv_example_btnmatrix_2.py
+++ b/examples/widgets/btnmatrix/lv_example_btnmatrix_2.py
@@ -12,10 +12,10 @@
except:
print("Could not find star.png")
sys.exit()
-
+
img_star_argb = lv.img_dsc_t({
'data_size': len(png_data),
- 'data': png_data
+ 'data': png_data
})
def event_cb(e):
@@ -44,7 +44,7 @@ def event_cb(e):
dsc.rect_dsc.bg_color = lv.palette_darken(lv.PALETTE.RED, 3)
else:
dsc.rect_dsc.bg_color = lv.palette_main(lv.PALETTE.RED)
-
+
dsc.label_dsc.color = lv.color_white()
elif dsc.id == 3:
dsc.label_dsc.opa = lv.OPA.TRANSP # Hide the text if any
diff --git a/examples/widgets/calendar/index.rst b/examples/widgets/calendar/index.rst
index c53bd2f5c..831fb1e40 100644
--- a/examples/widgets/calendar/index.rst
+++ b/examples/widgets/calendar/index.rst
@@ -1,5 +1,5 @@
-Calendar with header
+Calendar with header
""""""""""""""""""""""
.. lv_example:: widgets/calendar/lv_example_calendar_1
diff --git a/examples/widgets/calendar/lv_example_calendar_1.py b/examples/widgets/calendar/lv_example_calendar_1.py
index 65f1ea1b8..2df024d09 100644
--- a/examples/widgets/calendar/lv_example_calendar_1.py
+++ b/examples/widgets/calendar/lv_example_calendar_1.py
@@ -5,10 +5,10 @@ def event_handler(evt):
if code == lv.EVENT.VALUE_CHANGED:
source = evt.get_current_target()
date = lv.calendar_date_t()
- if source.get_pressed_date(date) == lv.RES.OK:
+ if source.get_pressed_date(date) == lv.RES.OK:
calendar.set_today_date(date.year, date.month, date.day)
print("Clicked date: %02d.%02d.%02d"%(date.day, date.month, date.year))
-
+
calendar = lv.calendar(lv.scr_act())
calendar.set_size(200, 200)
diff --git a/examples/widgets/canvas/index.rst b/examples/widgets/canvas/index.rst
index 93130e0ae..b2cd7d4d4 100644
--- a/examples/widgets/canvas/index.rst
+++ b/examples/widgets/canvas/index.rst
@@ -1,5 +1,5 @@
-Drawing on the Canvas and rotate
+Drawing on the Canvas and rotate
""""""""""""""""""""""""""""""""""
.. lv_example:: widgets/canvas/lv_example_canvas_1
diff --git a/examples/widgets/canvas/lv_example_canvas_2.c b/examples/widgets/canvas/lv_example_canvas_2.c
index 77a5401b8..a857c6685 100644
--- a/examples/widgets/canvas/lv_example_canvas_2.c
+++ b/examples/widgets/canvas/lv_example_canvas_2.c
@@ -34,8 +34,8 @@ void lv_example_canvas_2(void)
/*Create hole on the canvas*/
uint32_t x;
uint32_t y;
- for( y = 10; y < 30; y++) {
- for( x = 5; x < 20; x++) {
+ for(y = 10; y < 30; y++) {
+ for(x = 5; x < 20; x++) {
lv_canvas_set_px_color(canvas, x, y, c0);
}
}
diff --git a/examples/widgets/canvas/lv_example_canvas_2.py b/examples/widgets/canvas/lv_example_canvas_2.py
index 75a55c834..faefc8752 100644
--- a/examples/widgets/canvas/lv_example_canvas_2.py
+++ b/examples/widgets/canvas/lv_example_canvas_2.py
@@ -1,6 +1,6 @@
CANVAS_WIDTH = 50
CANVAS_HEIGHT = 50
-LV_COLOR_CHROMA_KEY = lv.color_hex(0x00ff00)
+LV_COLOR_CHROMA_KEY = lv.color_hex(0x00ff00)
def LV_IMG_BUF_SIZE_ALPHA_1BIT(w, h):
return int(((w / 8) + 1) * h)
@@ -13,7 +13,7 @@ def LV_CANVAS_BUF_SIZE_INDEXED_1BIT(w, h):
#
# Create a transparent canvas with Chroma keying and indexed color format (palette).
-#
+#
# Create a button to better see the transparency
btn=lv.btn(lv.scr_act())
diff --git a/examples/widgets/chart/index.rst b/examples/widgets/chart/index.rst
index 92492fec7..d07f0969c 100644
--- a/examples/widgets/chart/index.rst
+++ b/examples/widgets/chart/index.rst
@@ -1,41 +1,41 @@
-Line Chart
+Line Chart
""""""""""
.. lv_example:: widgets/chart/lv_example_chart_1
:language: c
-
-
-Faded area line chart with custom division lines
+
+
+Faded area line chart with custom division lines
"""""""""""""""""""""""""""""""""""""""""""""""""""
.. lv_example:: widgets/chart/lv_example_chart_2
:language: c
-
+
Axis ticks and labels with scrolling
""""""""""""""""""""""""""""""""""""
.. lv_example:: widgets/chart/lv_example_chart_3
:language: c
-
+
Show the value of the pressed points
""""""""""""""""""""""""""""""""""""""
.. lv_example:: widgets/chart/lv_example_chart_4
:language: c
-
+
Display 1000 data points with zooming and scrolling
""""""""""""""""""""""""""""""""""""""""""""""""""""
.. lv_example:: widgets/chart/lv_example_chart_5
:language: c
-
+
Show cursor on the clicked point
"""""""""""""""""""""""""""""""""""
.. lv_example:: widgets/chart/lv_example_chart_6
:language: c
-
+
Scatter chart
"""""""""""""""""""""""""""""""""""
diff --git a/examples/widgets/chart/lv_example_chart_2.c b/examples/widgets/chart/lv_example_chart_2.c
index 95963dd52..a10f6f9e9 100644
--- a/examples/widgets/chart/lv_example_chart_2.c
+++ b/examples/widgets/chart/lv_example_chart_2.c
@@ -16,13 +16,15 @@ static void draw_event_cb(lv_event_t * e)
/*Add a line mask that keeps the area below the line*/
lv_draw_mask_line_param_t line_mask_param;
- lv_draw_mask_line_points_init(&line_mask_param, dsc->p1->x, dsc->p1->y, dsc->p2->x, dsc->p2->y, LV_DRAW_MASK_LINE_SIDE_BOTTOM);
+ lv_draw_mask_line_points_init(&line_mask_param, dsc->p1->x, dsc->p1->y, dsc->p2->x, dsc->p2->y,
+ LV_DRAW_MASK_LINE_SIDE_BOTTOM);
int16_t line_mask_id = lv_draw_mask_add(&line_mask_param, NULL);
/*Add a fade effect: transparent bottom covering top*/
lv_coord_t h = lv_obj_get_height(obj);
lv_draw_mask_fade_param_t fade_mask_param;
- lv_draw_mask_fade_init(&fade_mask_param, &obj->coords, LV_OPA_COVER, obj->coords.y1 + h / 8, LV_OPA_TRANSP,obj->coords.y2);
+ lv_draw_mask_fade_init(&fade_mask_param, &obj->coords, LV_OPA_COVER, obj->coords.y1 + h / 8, LV_OPA_TRANSP,
+ obj->coords.y2);
int16_t fade_mask_id = lv_draw_mask_add(&fade_mask_param, NULL);
/*Draw a rectangle that will be affected by the mask*/
@@ -77,7 +79,8 @@ static void draw_event_cb(lv_event_t * e)
if(dsc->id == 1 || dsc->id == 3) {
dsc->line_dsc->color = lv_palette_main(LV_PALETTE_GREEN);
- } else {
+ }
+ else {
dsc->line_dsc->color = lv_palette_lighten(LV_PALETTE_GREY, 1);
}
}
diff --git a/examples/widgets/chart/lv_example_chart_3.c b/examples/widgets/chart/lv_example_chart_3.c
index 4a750b89e..b51115020 100644
--- a/examples/widgets/chart/lv_example_chart_3.c
+++ b/examples/widgets/chart/lv_example_chart_3.c
@@ -38,7 +38,8 @@ void lv_example_chart_3(void)
/*Add two data series*/
lv_chart_series_t * ser1 = lv_chart_add_series(chart, lv_palette_lighten(LV_PALETTE_GREEN, 2), LV_CHART_AXIS_PRIMARY_Y);
- lv_chart_series_t * ser2 = lv_chart_add_series(chart, lv_palette_darken(LV_PALETTE_GREEN, 2), LV_CHART_AXIS_SECONDARY_Y);
+ lv_chart_series_t * ser2 = lv_chart_add_series(chart, lv_palette_darken(LV_PALETTE_GREEN, 2),
+ LV_CHART_AXIS_SECONDARY_Y);
/*Set the next points on 'ser1'*/
lv_chart_set_next_value(chart, ser1, 31);
diff --git a/examples/widgets/chart/lv_example_chart_3.py b/examples/widgets/chart/lv_example_chart_3.py
index 6dc125961..0afe6fe13 100644
--- a/examples/widgets/chart/lv_example_chart_3.py
+++ b/examples/widgets/chart/lv_example_chart_3.py
@@ -1,10 +1,10 @@
def draw_event_cb(e):
dsc = lv.obj_draw_part_dsc_t.__cast__(e.get_param())
- if dsc.part == lv.PART.TICKS and dsc.id == lv.chart.AXIS.PRIMARY_X:
+ if dsc.part == lv.PART.TICKS and dsc.id == lv.chart.AXIS.PRIMARY_X:
month = ["Jan", "Febr", "March", "Apr", "May", "Jun", "July", "Aug", "Sept", "Oct", "Nov", "Dec"]
# dsc.text is defined char text[16], I must therefore convert the Python string to a byte_array
- dsc.text = bytes(month[dsc.value],"ascii")
+ dsc.text = bytes(month[dsc.value],"ascii")
#
# Add ticks and labels to the axis and demonstrate scrolling
#
diff --git a/examples/widgets/chart/lv_example_chart_4.c b/examples/widgets/chart/lv_example_chart_4.c
index 1d688d7ec..8508ef183 100644
--- a/examples/widgets/chart/lv_example_chart_4.c
+++ b/examples/widgets/chart/lv_example_chart_4.c
@@ -78,8 +78,8 @@ void lv_example_chart_4(void)
lv_chart_series_t * ser2 = lv_chart_add_series(chart, lv_palette_main(LV_PALETTE_GREEN), LV_CHART_AXIS_PRIMARY_Y);
uint32_t i;
for(i = 0; i < 10; i++) {
- lv_chart_set_next_value(chart, ser1, lv_rand(60,90));
- lv_chart_set_next_value(chart, ser2, lv_rand(10,40));
+ lv_chart_set_next_value(chart, ser1, lv_rand(60, 90));
+ lv_chart_set_next_value(chart, ser2, lv_rand(10, 40));
}
}
diff --git a/examples/widgets/chart/lv_example_chart_4.py b/examples/widgets/chart/lv_example_chart_4.py
index 5fe30672a..3b8d06338 100644
--- a/examples/widgets/chart/lv_example_chart_4.py
+++ b/examples/widgets/chart/lv_example_chart_4.py
@@ -18,7 +18,7 @@ def event_cb(e):
chart.get_point_pos_by_id(series[i], id, p)
value = series_points[i][id]
buf = lv.SYMBOL.DUMMY + "$" + str(value)
-
+
draw_rect_dsc = lv.draw_rect_dsc_t()
draw_rect_dsc.init()
draw_rect_dsc.bg_color = lv.color_black()
@@ -26,7 +26,7 @@ def event_cb(e):
draw_rect_dsc.radius = 3
draw_rect_dsc.bg_img_src = buf
draw_rect_dsc.bg_img_recolor = lv.color_white()
-
+
a = lv.area_t()
coords = lv.area_t()
chart.get_coords(coords)
@@ -34,14 +34,14 @@ def event_cb(e):
a.x2 = coords.x1 + p.x + 20
a.y1 = coords.y1 + p.y - 30
a.y2 = coords.y1 + p.y - 10
-
+
clip_area = lv.area_t.__cast__(e.get_param())
lv.draw_rect(a, clip_area, draw_rect_dsc)
-
+
elif code == lv.EVENT.RELEASED:
chart.invalidate()
-
-#
+
+#
# Add ticks and labels to the axis and demonstrate scrolling
#
diff --git a/examples/widgets/chart/lv_example_chart_5.c b/examples/widgets/chart/lv_example_chart_5.c
index f96069599..c175e37c9 100644
--- a/examples/widgets/chart/lv_example_chart_5.c
+++ b/examples/widgets/chart/lv_example_chart_5.c
@@ -5,46 +5,46 @@ static lv_obj_t * chart;
/* Source: https://github.com/ankur219/ECG-Arrhythmia-classification/blob/642230149583adfae1e4bd26c6f0e1fd8af2be0e/sample.csv*/
static const lv_coord_t ecg_sample[] = {
-2, 2, 0, -15, -39, -63, -71, -68, -67, -69, -84, -95, -104, -107, -108, -107, -107, -107, -107, -114, -118, -117,
- -112, -100, -89, -83, -71, -64, -58, -58, -62, -62, -58, -51, -46, -39, -27, -10, 4, 7, 1, -3, 0, 14, 24, 30, 25, 19,
- 13, 7, 12, 15, 18, 21, 13, 6, 9, 8, 17, 19, 13, 11, 11, 11, 23, 30, 37, 34, 25, 14, 15, 19, 28, 31, 26, 23, 25, 31,
- 39, 37, 37, 34, 30, 32, 22, 29, 31, 33, 37, 23, 13, 7, 2, 4, -2, 2, 11, 22, 33, 19, -1, -27, -55, -67, -72, -71, -63,
- -49, -18, 35, 113, 230, 369, 525, 651, 722, 730, 667, 563, 454, 357, 305, 288, 274, 255, 212, 173, 143, 117, 82, 39,
- -13, -53, -78, -91, -101, -113, -124, -131, -131, -131, -129, -128, -129, -125, -123, -123, -129, -139, -148, -153,
- -159, -166, -183, -205, -227, -243, -248, -246, -254, -280, -327, -381, -429, -473, -517, -556, -592, -612, -620,
- -620, -614, -604, -591, -574, -540, -497, -441, -389, -358, -336, -313, -284, -222, -167, -114, -70, -47, -28, -4, 12,
- 38, 52, 58, 56, 56, 57, 68, 77, 86, 86, 80, 69, 67, 70, 82, 85, 89, 90, 89, 89, 88, 91, 96, 97, 91, 83, 78, 82, 88, 95,
- 96, 105, 106, 110, 102, 100, 96, 98, 97, 101, 98, 99, 100, 107, 113, 119, 115, 110, 96, 85, 73, 64, 69, 76, 79,
- 78, 75, 85, 100, 114, 113, 105, 96, 84, 74, 66, 60, 75, 85, 89, 83, 67, 61, 67, 73, 79, 74, 63, 57, 56, 58, 61, 55,
- 48, 45, 46, 55, 62, 55, 49, 43, 50, 59, 63, 57, 40, 31, 23, 25, 27, 31, 35, 34, 30, 36, 34, 42, 38, 36, 40, 46, 50,
- 47, 32, 30, 32, 52, 67, 73, 71, 63, 54, 53, 45, 41, 28, 13, 3, 1, 4, 4, -8, -23, -32, -31, -19, -5, 3, 9, 13, 19,
- 24, 27, 29, 25, 22, 26, 32, 42, 51, 56, 60, 57, 55, 53, 53, 54, 59, 54, 49, 26, -3, -11, -20, -47, -100, -194, -236,
- -212, -123, 8, 103, 142, 147, 120, 105, 98, 93, 81, 61, 40, 26, 28, 30, 30, 27, 19, 17, 21, 20, 19, 19, 22, 36, 40,
- 35, 20, 7, 1, 10, 18, 27, 22, 6, -4, -2, 3, 6, -2, -13, -14, -10, -2, 3, 2, -1, -5, -10, -19, -32, -42, -55, -60,
- -68, -77, -86, -101, -110, -117, -115, -104, -92, -84, -85, -84, -73, -65, -52, -50, -45, -35, -20, -3, 12, 20, 25,
- 26, 28, 28, 30, 28, 25, 28, 33, 42, 42, 36, 23, 9, 0, 1, -4, 1, -4, -4, 1, 5, 9, 9, -3, -1, -18, -50, -108, -190,
- -272, -340, -408, -446, -537, -643, -777, -894, -920, -853, -697, -461, -251, -60, 58, 103, 129, 139, 155, 170, 173,
- 178, 185, 190, 193, 200, 208, 215, 225, 224, 232, 234, 240, 240, 236, 229, 226, 224, 232, 233, 232, 224, 219, 219,
- 223, 231, 226, 223, 219, 218, 223, 223, 223, 233, 245, 268, 286, 296, 295, 283, 271, 263, 252, 243, 226, 210, 197,
- 186, 171, 152, 133, 117, 114, 110, 107, 96, 80, 63, 48, 40, 38, 34, 28, 15, 2, -7, -11, -14, -18, -29, -37, -44, -50,
- -58, -63, -61, -52, -50, -48, -61, -59, -58, -54, -47, -52, -62, -61, -64, -54, -52, -59, -69, -76, -76, -69, -67,
- -74, -78, -81, -80, -73, -65, -57, -53, -51, -47, -35, -27, -22, -22, -24, -21, -17, -13, -10, -11, -13, -20, -20,
- -12, -2, 7, -1, -12, -16, -13, -2, 2, -4, -5, -2, 9, 19, 19, 14, 11, 13, 19, 21, 20, 18, 19, 19, 19, 16, 15, 13, 14,
- 9, 3, -5, -9, -5, -3, -2, -3, -3, 2, 8, 9, 9, 5, 6, 8, 8, 7, 4, 3, 4, 5, 3, 5, 5, 13, 13, 12, 10, 10, 15, 22, 17,
- 14, 7, 10, 15, 16, 11, 12, 10, 13, 9, -2, -4, -2, 7, 16, 16, 17, 16, 7, -1, -16, -18, -16, -9, -4, -5, -10, -9, -8,
- -3, -4, -10, -19, -20, -16, -9, -9, -23, -40, -48, -43, -33, -19, -21, -26, -31, -33, -19, 0, 17, 24, 9, -17, -47,
- -63, -67, -59, -52, -51, -50, -49, -42, -26, -21, -15, -20, -23, -22, -19, -12, -8, 5, 18, 27, 32, 26, 25, 26, 22,
- 23, 17, 14, 17, 21, 25, 2, -45, -121, -196, -226, -200, -118, -9, 73, 126, 131, 114, 87, 60, 42, 29, 26, 34, 35, 34,
- 25, 12, 9, 7, 3, 2, -8, -11, 2, 23, 38, 41, 23, 9, 10, 13, 16, 8, -8, -17, -23, -26, -25, -21, -15, -10, -13, -13,
- -19, -22, -29, -40, -48, -48, -54, -55, -66, -82, -85, -90, -92, -98, -114, -119, -124, -129, -132, -146, -146, -138,
- -124, -99, -85, -72, -65, -65, -65, -66, -63, -64, -64, -58, -46, -26, -9, 2, 2, 4, 0, 1, 4, 3, 10, 11, 10, 2, -4,
- 0, 10, 18, 20, 6, 2, -9, -7, -3, -3, -2, -7, -12, -5, 5, 24, 36, 31, 25, 6, 3, 7, 12, 17, 11, 0, -6, -9, -8, -7, -5,
- -6, -2, -2, -6, -2, 2, 14, 24, 22, 15, 8, 4, 6, 7, 12, 16, 25, 20, 7, -16, -41, -60, -67, -65, -54, -35, -11, 30,
- 84, 175, 302, 455, 603, 707, 743, 714, 625, 519, 414, 337, 300, 281, 263, 239, 197, 163, 136, 109, 77, 34, -18, -50,
- -66, -74, -79, -92, -107, -117, -127, -129, -135, -139, -141, -155, -159, -167, -171, -169, -174, -175, -178, -191,
- -202, -223, -235, -243, -237, -240, -256, -298, -345, -393, -432, -475, -518, -565, -596, -619, -623, -623, -614,
- -599, -583, -559, -524, -477, -425, -383, -357, -331, -301, -252, -198, -143, -96, -57, -29, -8, 10, 31, 45, 60, 65,
- 70, 74, 76, 79, 82, 79, 75, 62,
-};
+ -112, -100, -89, -83, -71, -64, -58, -58, -62, -62, -58, -51, -46, -39, -27, -10, 4, 7, 1, -3, 0, 14, 24, 30, 25, 19,
+ 13, 7, 12, 15, 18, 21, 13, 6, 9, 8, 17, 19, 13, 11, 11, 11, 23, 30, 37, 34, 25, 14, 15, 19, 28, 31, 26, 23, 25, 31,
+ 39, 37, 37, 34, 30, 32, 22, 29, 31, 33, 37, 23, 13, 7, 2, 4, -2, 2, 11, 22, 33, 19, -1, -27, -55, -67, -72, -71, -63,
+ -49, -18, 35, 113, 230, 369, 525, 651, 722, 730, 667, 563, 454, 357, 305, 288, 274, 255, 212, 173, 143, 117, 82, 39,
+ -13, -53, -78, -91, -101, -113, -124, -131, -131, -131, -129, -128, -129, -125, -123, -123, -129, -139, -148, -153,
+ -159, -166, -183, -205, -227, -243, -248, -246, -254, -280, -327, -381, -429, -473, -517, -556, -592, -612, -620,
+ -620, -614, -604, -591, -574, -540, -497, -441, -389, -358, -336, -313, -284, -222, -167, -114, -70, -47, -28, -4, 12,
+ 38, 52, 58, 56, 56, 57, 68, 77, 86, 86, 80, 69, 67, 70, 82, 85, 89, 90, 89, 89, 88, 91, 96, 97, 91, 83, 78, 82, 88, 95,
+ 96, 105, 106, 110, 102, 100, 96, 98, 97, 101, 98, 99, 100, 107, 113, 119, 115, 110, 96, 85, 73, 64, 69, 76, 79,
+ 78, 75, 85, 100, 114, 113, 105, 96, 84, 74, 66, 60, 75, 85, 89, 83, 67, 61, 67, 73, 79, 74, 63, 57, 56, 58, 61, 55,
+ 48, 45, 46, 55, 62, 55, 49, 43, 50, 59, 63, 57, 40, 31, 23, 25, 27, 31, 35, 34, 30, 36, 34, 42, 38, 36, 40, 46, 50,
+ 47, 32, 30, 32, 52, 67, 73, 71, 63, 54, 53, 45, 41, 28, 13, 3, 1, 4, 4, -8, -23, -32, -31, -19, -5, 3, 9, 13, 19,
+ 24, 27, 29, 25, 22, 26, 32, 42, 51, 56, 60, 57, 55, 53, 53, 54, 59, 54, 49, 26, -3, -11, -20, -47, -100, -194, -236,
+ -212, -123, 8, 103, 142, 147, 120, 105, 98, 93, 81, 61, 40, 26, 28, 30, 30, 27, 19, 17, 21, 20, 19, 19, 22, 36, 40,
+ 35, 20, 7, 1, 10, 18, 27, 22, 6, -4, -2, 3, 6, -2, -13, -14, -10, -2, 3, 2, -1, -5, -10, -19, -32, -42, -55, -60,
+ -68, -77, -86, -101, -110, -117, -115, -104, -92, -84, -85, -84, -73, -65, -52, -50, -45, -35, -20, -3, 12, 20, 25,
+ 26, 28, 28, 30, 28, 25, 28, 33, 42, 42, 36, 23, 9, 0, 1, -4, 1, -4, -4, 1, 5, 9, 9, -3, -1, -18, -50, -108, -190,
+ -272, -340, -408, -446, -537, -643, -777, -894, -920, -853, -697, -461, -251, -60, 58, 103, 129, 139, 155, 170, 173,
+ 178, 185, 190, 193, 200, 208, 215, 225, 224, 232, 234, 240, 240, 236, 229, 226, 224, 232, 233, 232, 224, 219, 219,
+ 223, 231, 226, 223, 219, 218, 223, 223, 223, 233, 245, 268, 286, 296, 295, 283, 271, 263, 252, 243, 226, 210, 197,
+ 186, 171, 152, 133, 117, 114, 110, 107, 96, 80, 63, 48, 40, 38, 34, 28, 15, 2, -7, -11, -14, -18, -29, -37, -44, -50,
+ -58, -63, -61, -52, -50, -48, -61, -59, -58, -54, -47, -52, -62, -61, -64, -54, -52, -59, -69, -76, -76, -69, -67,
+ -74, -78, -81, -80, -73, -65, -57, -53, -51, -47, -35, -27, -22, -22, -24, -21, -17, -13, -10, -11, -13, -20, -20,
+ -12, -2, 7, -1, -12, -16, -13, -2, 2, -4, -5, -2, 9, 19, 19, 14, 11, 13, 19, 21, 20, 18, 19, 19, 19, 16, 15, 13, 14,
+ 9, 3, -5, -9, -5, -3, -2, -3, -3, 2, 8, 9, 9, 5, 6, 8, 8, 7, 4, 3, 4, 5, 3, 5, 5, 13, 13, 12, 10, 10, 15, 22, 17,
+ 14, 7, 10, 15, 16, 11, 12, 10, 13, 9, -2, -4, -2, 7, 16, 16, 17, 16, 7, -1, -16, -18, -16, -9, -4, -5, -10, -9, -8,
+ -3, -4, -10, -19, -20, -16, -9, -9, -23, -40, -48, -43, -33, -19, -21, -26, -31, -33, -19, 0, 17, 24, 9, -17, -47,
+ -63, -67, -59, -52, -51, -50, -49, -42, -26, -21, -15, -20, -23, -22, -19, -12, -8, 5, 18, 27, 32, 26, 25, 26, 22,
+ 23, 17, 14, 17, 21, 25, 2, -45, -121, -196, -226, -200, -118, -9, 73, 126, 131, 114, 87, 60, 42, 29, 26, 34, 35, 34,
+ 25, 12, 9, 7, 3, 2, -8, -11, 2, 23, 38, 41, 23, 9, 10, 13, 16, 8, -8, -17, -23, -26, -25, -21, -15, -10, -13, -13,
+ -19, -22, -29, -40, -48, -48, -54, -55, -66, -82, -85, -90, -92, -98, -114, -119, -124, -129, -132, -146, -146, -138,
+ -124, -99, -85, -72, -65, -65, -65, -66, -63, -64, -64, -58, -46, -26, -9, 2, 2, 4, 0, 1, 4, 3, 10, 11, 10, 2, -4,
+ 0, 10, 18, 20, 6, 2, -9, -7, -3, -3, -2, -7, -12, -5, 5, 24, 36, 31, 25, 6, 3, 7, 12, 17, 11, 0, -6, -9, -8, -7, -5,
+ -6, -2, -2, -6, -2, 2, 14, 24, 22, 15, 8, 4, 6, 7, 12, 16, 25, 20, 7, -16, -41, -60, -67, -65, -54, -35, -11, 30,
+ 84, 175, 302, 455, 603, 707, 743, 714, 625, 519, 414, 337, 300, 281, 263, 239, 197, 163, 136, 109, 77, 34, -18, -50,
+ -66, -74, -79, -92, -107, -117, -127, -129, -135, -139, -141, -155, -159, -167, -171, -169, -174, -175, -178, -191,
+ -202, -223, -235, -243, -237, -240, -256, -298, -345, -393, -432, -475, -518, -565, -596, -619, -623, -623, -614,
+ -599, -583, -559, -524, -477, -425, -383, -357, -331, -301, -252, -198, -143, -96, -57, -29, -8, 10, 31, 45, 60, 65,
+ 70, 74, 76, 79, 82, 79, 75, 62,
+ };
static void slider_x_event_cb(lv_event_t * e)
{
diff --git a/examples/widgets/chart/lv_example_chart_5.py b/examples/widgets/chart/lv_example_chart_5.py
index 198cae146..f0d583239 100644
--- a/examples/widgets/chart/lv_example_chart_5.py
+++ b/examples/widgets/chart/lv_example_chart_5.py
@@ -59,7 +59,7 @@ def slider_y_event_cb(e):
# Display 1000 data points with zooming and scrolling.
# See how the chart changes drawing mode (draw only vertical lines) when
# the points get too crowded.
-
+
# Create a chart
chart = lv.chart(lv.scr_act())
chart.set_size(200, 150)
diff --git a/examples/widgets/chart/lv_example_chart_6.c b/examples/widgets/chart/lv_example_chart_6.c
index 90e2740e9..463ab6707 100644
--- a/examples/widgets/chart/lv_example_chart_6.c
+++ b/examples/widgets/chart/lv_example_chart_6.c
@@ -74,7 +74,7 @@ void lv_example_chart_6(void)
ser = lv_chart_add_series(chart, lv_palette_main(LV_PALETTE_RED), LV_CHART_AXIS_PRIMARY_Y);
uint32_t i;
for(i = 0; i < 10; i++) {
- lv_chart_set_next_value(chart, ser, lv_rand(10,90));
+ lv_chart_set_next_value(chart, ser, lv_rand(10, 90));
}
lv_chart_set_zoom_x(chart, 500);
diff --git a/examples/widgets/chart/lv_example_chart_6.py b/examples/widgets/chart/lv_example_chart_6.py
index cb110ca98..acc4e11c7 100644
--- a/examples/widgets/chart/lv_example_chart_6.py
+++ b/examples/widgets/chart/lv_example_chart_6.py
@@ -1,5 +1,5 @@
class ExampleChart_6():
-
+
def __init__(self):
self.last_id = -1
#
@@ -9,21 +9,21 @@ def __init__(self):
chart = lv.chart(lv.scr_act())
chart.set_size(200, 150)
chart.align(lv.ALIGN.CENTER, 0, -10)
-
+
chart.set_axis_tick(lv.chart.AXIS.PRIMARY_Y, 10, 5, 6, 5, True, 40)
chart.set_axis_tick(lv.chart.AXIS.PRIMARY_X, 10, 5, 10, 1, True, 30)
-
+
chart.add_event_cb(self.event_cb, lv.EVENT.ALL, None)
chart.refresh_ext_draw_size()
-
+
self.cursor = chart.add_cursor(lv.palette_main(lv.PALETTE.BLUE), lv.DIR.LEFT | lv.DIR.BOTTOM)
-
+
self.ser = chart.add_series(lv.palette_main(lv.PALETTE.RED), lv.chart.AXIS.PRIMARY_Y)
self.ser_p = []
for i in range(10):
self.ser_p.append(lv.rand(10,90))
- self.ser.y_points = self.ser_p
+ self.ser.y_points = self.ser_p
newser = chart.get_series_next(None)
# print("length of data points: ",len(newser.points))
@@ -32,8 +32,8 @@ def __init__(self):
label = lv.label(lv.scr_act())
label.set_text("Click on a point")
label.align_to(chart, lv.ALIGN.OUT_TOP_MID, 0, -5)
-
-
+
+
def event_cb(self,e):
code = e.get_code()
@@ -46,7 +46,7 @@ def event_cb(self,e):
p = lv.point_t()
chart.get_point_pos_by_id(self.ser, self.last_id, p)
chart.set_cursor_point(self.cursor, None, self.last_id)
-
+
elif code == lv.EVENT.DRAW_PART_END:
# print("EVENT.DRAW_PART_END")
dsc = lv.obj_draw_part_dsc_t.__cast__(e.get_param())
@@ -57,25 +57,25 @@ def event_cb(self,e):
if dsc.part == lv.PART.CURSOR and dsc.p1 and dsc.p2 and dsc.p1.y == dsc.p2.y and self.last_id >= 0:
v = self.ser_p[self.last_id]
-
+
# print("value: ",v)
value_txt = str(v)
size = lv.point_t()
lv.txt_get_size(size, value_txt, lv.font_default(), 0, 0, lv.COORD.MAX, lv.TEXT_FLAG.NONE)
-
+
a = lv.area_t()
a.y2 = dsc.p1.y - 5
a.y1 = a.y2 - size.y - 10
a.x1 = dsc.p1.x + 10
a.x2 = a.x1 + size.x + 10
-
+
draw_rect_dsc = lv.draw_rect_dsc_t()
draw_rect_dsc.init()
draw_rect_dsc.bg_color = lv.palette_main(lv.PALETTE.BLUE)
draw_rect_dsc.radius = 3
-
+
lv.draw_rect(a, dsc.clip_area, draw_rect_dsc)
-
+
draw_label_dsc = lv.draw_label_dsc_t()
draw_label_dsc.init()
draw_label_dsc.color = lv.color_white()
diff --git a/examples/widgets/chart/lv_example_chart_7.c b/examples/widgets/chart/lv_example_chart_7.c
index b65fc196e..506f88756 100644
--- a/examples/widgets/chart/lv_example_chart_7.c
+++ b/examples/widgets/chart/lv_example_chart_7.c
@@ -21,8 +21,8 @@ static void draw_event_cb(lv_event_t * e)
lv_opa_t y_opa = (y_array[p_act] * LV_OPA_50) / 1000;
dsc->rect_dsc->bg_color = lv_color_mix(lv_palette_main(LV_PALETTE_RED),
- lv_palette_main(LV_PALETTE_BLUE),
- x_opa + y_opa);
+ lv_palette_main(LV_PALETTE_BLUE),
+ x_opa + y_opa);
}
}
@@ -30,7 +30,7 @@ static void add_data(lv_timer_t * timer)
{
LV_UNUSED(timer);
lv_obj_t * chart = timer->user_data;
- lv_chart_set_next_value2(chart, lv_chart_get_series_next(chart, NULL), lv_rand(0,200), lv_rand(0,1000));
+ lv_chart_set_next_value2(chart, lv_chart_get_series_next(chart, NULL), lv_rand(0, 200), lv_rand(0, 1000));
}
/**
diff --git a/examples/widgets/chart/lv_example_chart_7.py b/examples/widgets/chart/lv_example_chart_7.py
index 8b7371750..23f17e145 100644
--- a/examples/widgets/chart/lv_example_chart_7.py
+++ b/examples/widgets/chart/lv_example_chart_7.py
@@ -12,7 +12,7 @@ def draw_event_cb(e):
# print("cnt: ",cnt)
# Make older value more transparent
dsc.rect_dsc.bg_opa = (lv.OPA.COVER * dsc.id) // (cnt - 1)
-
+
# Make smaller values blue, higher values red
# x_array = chart.get_x_array(ser)
# y_array = chart.get_y_array(ser)
@@ -23,11 +23,11 @@ def draw_event_cb(e):
# print("p_act", p_act)
x_opa = (x_array[p_act] * lv.OPA._50) // 200
y_opa = (y_array[p_act] * lv.OPA._50) // 1000
-
+
dsc.rect_dsc.bg_color = lv.palette_main(lv.PALETTE.RED).color_mix(
lv.palette_main(lv.PALETTE.BLUE),
x_opa + y_opa)
-
+
def add_data(timer,chart):
# print("add_data")
x = lv.rand(0,200)
@@ -38,7 +38,7 @@ def add_data(timer,chart):
x_array.append(x)
y_array.pop(0)
y_array.append(y)
-
+
#
# A scatter chart
#
@@ -66,7 +66,7 @@ def add_data(timer,chart):
for i in range(50):
x_array.append(lv.rand(0, 200))
y_array.append(lv.rand(0, 1000))
-
+
ser.x_points = x_array
ser.y_points = y_array
diff --git a/examples/widgets/chart/lv_example_chart_8.c b/examples/widgets/chart/lv_example_chart_8.c
index 6561da249..ca2c8f8cb 100644
--- a/examples/widgets/chart/lv_example_chart_8.c
+++ b/examples/widgets/chart/lv_example_chart_8.c
@@ -2,10 +2,9 @@
#if LV_USE_CHART && LV_DRAW_COMPLEX && LV_BUILD_EXAMPLES
/* A struct is used to keep track of the series list because later we need to draw to the series in the reverse order to which they were initialised. */
-typedef struct
-{
- lv_obj_t *obj;
- lv_chart_series_t *series_list[3];
+typedef struct {
+ lv_obj_t * obj;
+ lv_chart_series_t * series_list[3];
} stacked_area_chart_t;
static stacked_area_chart_t stacked_area_chart;
@@ -13,20 +12,20 @@ static stacked_area_chart_t stacked_area_chart;
/**
* Callback which draws the blocks of colour under the lines
**/
-static void draw_event_cb(lv_event_t *e)
+static void draw_event_cb(lv_event_t * e)
{
- lv_obj_t *obj = lv_event_get_target(e);
+ lv_obj_t * obj = lv_event_get_target(e);
/*Add the faded area before the lines are drawn*/
- lv_obj_draw_part_dsc_t *dsc = lv_event_get_draw_part_dsc(e);
- if (dsc->part == LV_PART_ITEMS)
- {
- if (!dsc->p1 || !dsc->p2)
+ lv_obj_draw_part_dsc_t * dsc = lv_event_get_draw_part_dsc(e);
+ if(dsc->part == LV_PART_ITEMS) {
+ if(!dsc->p1 || !dsc->p2)
return;
/*Add a line mask that keeps the area below the line*/
lv_draw_mask_line_param_t line_mask_param;
- lv_draw_mask_line_points_init(&line_mask_param, dsc->p1->x, dsc->p1->y, dsc->p2->x, dsc->p2->y, LV_DRAW_MASK_LINE_SIDE_BOTTOM);
+ lv_draw_mask_line_points_init(&line_mask_param, dsc->p1->x, dsc->p1->y, dsc->p2->x, dsc->p2->y,
+ LV_DRAW_MASK_LINE_SIDE_BOTTOM);
int16_t line_mask_id = lv_draw_mask_add(&line_mask_param, NULL);
/*Draw a rectangle that will be affected by the mask*/
@@ -39,7 +38,8 @@ static void draw_event_cb(lv_event_t *e)
a.x1 = dsc->p1->x;
a.x2 = dsc->p2->x;
a.y1 = LV_MIN(dsc->p1->y, dsc->p2->y);
- a.y2 = obj->coords.y2 - 13; /* -13 cuts off where the rectangle draws over the chart margin. Without this an area of 0 doesn't look like 0 */
+ a.y2 = obj->coords.y2 -
+ 13; /* -13 cuts off where the rectangle draws over the chart margin. Without this an area of 0 doesn't look like 0 */
lv_draw_rect(dsc->draw_ctx, &draw_rect_dsc, &a);
/*Remove the mask*/
@@ -55,8 +55,7 @@ static int32_t round_fixed_point(int32_t n, int8_t shift)
{
/* Create a bitmask to isolates the decimal part of the fixed point number */
int32_t mask = 1;
- for (int32_t bit_pos = 0; bit_pos < shift; bit_pos++)
- {
+ for(int32_t bit_pos = 0; bit_pos < shift; bit_pos++) {
mask = (mask << 1) + 1;
}
@@ -83,19 +82,21 @@ void lv_example_chart_8(void)
lv_obj_add_event_cb(stacked_area_chart.obj, draw_event_cb, LV_EVENT_DRAW_PART_BEGIN, NULL);
/* Set range to 0 to 100 for percentages. Draw ticks */
- lv_chart_set_range(stacked_area_chart.obj,LV_CHART_AXIS_PRIMARY_Y,0,100);
+ lv_chart_set_range(stacked_area_chart.obj, LV_CHART_AXIS_PRIMARY_Y, 0, 100);
lv_chart_set_axis_tick(stacked_area_chart.obj, LV_CHART_AXIS_PRIMARY_Y, 3, 0, 5, 1, true, 30);
/*Set point size to 0 so the lines are smooth */
lv_obj_set_style_size(stacked_area_chart.obj, 0, LV_PART_INDICATOR);
/*Add some data series*/
- stacked_area_chart.series_list[0] = lv_chart_add_series(stacked_area_chart.obj, lv_palette_main(LV_PALETTE_RED), LV_CHART_AXIS_PRIMARY_Y);
- stacked_area_chart.series_list[1] = lv_chart_add_series(stacked_area_chart.obj, lv_palette_main(LV_PALETTE_BLUE), LV_CHART_AXIS_PRIMARY_Y);
- stacked_area_chart.series_list[2] = lv_chart_add_series(stacked_area_chart.obj, lv_palette_main(LV_PALETTE_GREEN), LV_CHART_AXIS_PRIMARY_Y);
-
- for (int point = 0; point < 10; point++)
- {
+ stacked_area_chart.series_list[0] = lv_chart_add_series(stacked_area_chart.obj, lv_palette_main(LV_PALETTE_RED),
+ LV_CHART_AXIS_PRIMARY_Y);
+ stacked_area_chart.series_list[1] = lv_chart_add_series(stacked_area_chart.obj, lv_palette_main(LV_PALETTE_BLUE),
+ LV_CHART_AXIS_PRIMARY_Y);
+ stacked_area_chart.series_list[2] = lv_chart_add_series(stacked_area_chart.obj, lv_palette_main(LV_PALETTE_GREEN),
+ LV_CHART_AXIS_PRIMARY_Y);
+
+ for(int point = 0; point < 10; point++) {
/* Make some random data */
uint32_t vals[3] = {lv_rand(10, 20), lv_rand(20, 30), lv_rand(20, 30)};
@@ -106,8 +107,7 @@ void lv_example_chart_8(void)
uint32_t decimal_sum = 0;
/* Fixed point cascade rounding ensures percentages add to 100 */
- for (int32_t series_index = 0; series_index < 3; series_index++)
- {
+ for(int32_t series_index = 0; series_index < 3; series_index++) {
decimal_sum += (((vals[series_index] * 100) << fixed_point_shift) / total);
int_sum += (vals[series_index] * 100) / total;
@@ -120,7 +120,8 @@ void lv_example_chart_8(void)
/* Draw to the series in the reverse order to which they were initialised.
Without this the higher values will draw on top of the lower ones.
This is because the Z-height of a series matches the order it was initialised */
- lv_chart_set_next_value(stacked_area_chart.obj, stacked_area_chart.series_list[3 - series_index - 1], draw_heights[series_index]);
+ lv_chart_set_next_value(stacked_area_chart.obj, stacked_area_chart.series_list[3 - series_index - 1],
+ draw_heights[series_index]);
}
}
diff --git a/examples/widgets/chart/lv_example_chart_8.py b/examples/widgets/chart/lv_example_chart_8.py
index 2e94a5b88..20996b3aa 100644
--- a/examples/widgets/chart/lv_example_chart_8.py
+++ b/examples/widgets/chart/lv_example_chart_8.py
@@ -81,7 +81,7 @@ def lv_example_chart_8():
stacked_area_chart.obj.set_div_line_count(5, 7)
stacked_area_chart.obj.add_event_cb( draw_event_cb, lv.EVENT.DRAW_PART_BEGIN, None)
- # Set range to 0 to 100 for percentages. Draw ticks
+ # Set range to 0 to 100 for percentages. Draw ticks
stacked_area_chart.obj.set_range(lv.chart.AXIS.PRIMARY_Y,0,100)
stacked_area_chart.obj.set_axis_tick(lv.chart.AXIS.PRIMARY_Y, 3, 0, 5, 1, True, 30)
diff --git a/examples/widgets/checkbox/lv_example_checkbox_2.c b/examples/widgets/checkbox/lv_example_checkbox_2.c
index 46391ec53..02a572899 100644
--- a/examples/widgets/checkbox/lv_example_checkbox_2.c
+++ b/examples/widgets/checkbox/lv_example_checkbox_2.c
@@ -59,7 +59,7 @@ void lv_example_checkbox_2(void)
lv_obj_set_size(cont1, lv_pct(40), lv_pct(80));
lv_obj_add_event_cb(cont1, radio_event_handler, LV_EVENT_CLICKED, &active_index_1);
- for (i = 0;i < 5;i++) {
+ for(i = 0; i < 5; i++) {
lv_snprintf(buf, sizeof(buf), "A %d", (int)i + 1);
radiobutton_create(cont1, buf);
@@ -73,7 +73,7 @@ void lv_example_checkbox_2(void)
lv_obj_set_x(cont2, lv_pct(50));
lv_obj_add_event_cb(cont2, radio_event_handler, LV_EVENT_CLICKED, &active_index_2);
- for (i = 0;i < 3;i++) {
+ for(i = 0; i < 3; i++) {
lv_snprintf(buf, sizeof(buf), "B %d", (int)i + 1);
radiobutton_create(cont2, buf);
}
diff --git a/examples/widgets/dropdown/lv_example_dropdown_1.c b/examples/widgets/dropdown/lv_example_dropdown_1.c
index f35b337d3..275e6cf6e 100644
--- a/examples/widgets/dropdown/lv_example_dropdown_1.c
+++ b/examples/widgets/dropdown/lv_example_dropdown_1.c
@@ -18,15 +18,15 @@ void lv_example_dropdown_1(void)
/*Create a normal drop down list*/
lv_obj_t * dd = lv_dropdown_create(lv_scr_act());
lv_dropdown_set_options(dd, "Apple\n"
- "Banana\n"
- "Orange\n"
- "Cherry\n"
- "Grape\n"
- "Raspberry\n"
- "Melon\n"
- "Orange\n"
- "Lemon\n"
- "Nuts");
+ "Banana\n"
+ "Orange\n"
+ "Cherry\n"
+ "Grape\n"
+ "Raspberry\n"
+ "Melon\n"
+ "Orange\n"
+ "Lemon\n"
+ "Nuts");
lv_obj_align(dd, LV_ALIGN_TOP_MID, 0, 20);
lv_obj_add_event_cb(dd, event_handler, LV_EVENT_ALL, NULL);
diff --git a/examples/widgets/dropdown/lv_example_dropdown_1.py b/examples/widgets/dropdown/lv_example_dropdown_1.py
index 6592ad3f9..ad7621e1d 100644
--- a/examples/widgets/dropdown/lv_example_dropdown_1.py
+++ b/examples/widgets/dropdown/lv_example_dropdown_1.py
@@ -1,7 +1,7 @@
def event_handler(e):
code = e.get_code()
obj = e.get_target()
- if code == lv.EVENT.VALUE_CHANGED:
+ if code == lv.EVENT.VALUE_CHANGED:
option = " "*10 # should be large enough to store the option
obj.get_selected_str(option, len(option))
# .strip() removes trailing spaces
diff --git a/examples/widgets/dropdown/lv_example_dropdown_3.c b/examples/widgets/dropdown/lv_example_dropdown_3.c
index f158a19b3..123cb8dd2 100644
--- a/examples/widgets/dropdown/lv_example_dropdown_3.c
+++ b/examples/widgets/dropdown/lv_example_dropdown_3.c
@@ -18,13 +18,13 @@ void lv_example_dropdown_3(void)
lv_obj_t * dropdown = lv_dropdown_create(lv_scr_act());
lv_obj_align(dropdown, LV_ALIGN_TOP_LEFT, 10, 10);
lv_dropdown_set_options(dropdown, "New project\n"
- "New file\n"
- "Save\n"
- "Save as ...\n"
- "Open project\n"
- "Recent projects\n"
- "Preferences\n"
- "Exit");
+ "New file\n"
+ "Save\n"
+ "Save as ...\n"
+ "Open project\n"
+ "Recent projects\n"
+ "Preferences\n"
+ "Exit");
/*Set a fixed text to display on the button of the drop-down list*/
lv_dropdown_set_text(dropdown, "Menu");
diff --git a/examples/widgets/dropdown/lv_example_dropdown_3.py b/examples/widgets/dropdown/lv_example_dropdown_3.py
index 181c7c5c9..07ba07183 100644
--- a/examples/widgets/dropdown/lv_example_dropdown_3.py
+++ b/examples/widgets/dropdown/lv_example_dropdown_3.py
@@ -12,10 +12,10 @@
except:
print("Could not find img_caret_down.png")
sys.exit()
-
+
img_caret_down_argb = lv.img_dsc_t({
'data_size': len(png_data),
- 'data': png_data
+ 'data': png_data
})
def event_cb(e):
diff --git a/examples/widgets/img/index.rst b/examples/widgets/img/index.rst
index ede75e4ae..efba6b42b 100644
--- a/examples/widgets/img/index.rst
+++ b/examples/widgets/img/index.rst
@@ -1,24 +1,24 @@
-Image from variable and symbol
+Image from variable and symbol
"""""""""""""""""""""""""""""""
.. lv_example:: widgets/img/lv_example_img_1
:language: c
-Image recoloring
+Image recoloring
""""""""""""""""
.. lv_example:: widgets/img/lv_example_img_2
:language: c
-Rotate and zoom
+Rotate and zoom
""""""""""""""""
.. lv_example:: widgets/img/lv_example_img_3
:language: c
-
+
Image offset and styling
""""""""""""""""""""""""
diff --git a/examples/widgets/img/lv_example_img_1.py b/examples/widgets/img/lv_example_img_1.py
index 8f5e54154..b5242f658 100644
--- a/examples/widgets/img/lv_example_img_1.py
+++ b/examples/widgets/img/lv_example_img_1.py
@@ -16,10 +16,10 @@
except:
print("Could not find img_cogwheel_argb.png")
sys.exit()
-
+
img_cogwheel_argb = lv.img_dsc_t({
'data_size': len(png_data),
- 'data': png_data
+ 'data': png_data
})
img1 = lv.img(lv.scr_act())
diff --git a/examples/widgets/img/lv_example_img_2.c b/examples/widgets/img/lv_example_img_2.c
index 756ef0312..698ab9088 100644
--- a/examples/widgets/img/lv_example_img_2.c
+++ b/examples/widgets/img/lv_example_img_2.c
@@ -43,7 +43,8 @@ static void slider_event_cb(lv_event_t * e)
LV_UNUSED(e);
/*Recolor the image based on the sliders' values*/
- lv_color_t color = lv_color_make(lv_slider_get_value(red_slider), lv_slider_get_value(green_slider), lv_slider_get_value(blue_slider));
+ lv_color_t color = lv_color_make(lv_slider_get_value(red_slider), lv_slider_get_value(green_slider),
+ lv_slider_get_value(blue_slider));
lv_opa_t intense = lv_slider_get_value(intense_slider);
lv_obj_set_style_img_recolor_opa(img1, intense, 0);
lv_obj_set_style_img_recolor(img1, color, 0);
diff --git a/examples/widgets/img/lv_example_img_2.py b/examples/widgets/img/lv_example_img_2.py
index b69feddf7..7660dea0b 100644
--- a/examples/widgets/img/lv_example_img_2.py
+++ b/examples/widgets/img/lv_example_img_2.py
@@ -16,10 +16,10 @@
except:
print("Could not find img_cogwheel_argb.png")
sys.exit()
-
+
img_cogwheel_argb = lv.img_dsc_t({
'data_size': len(png_data),
- 'data': png_data
+ 'data': png_data
})
def create_slider(color):
@@ -37,7 +37,7 @@ def slider_event_cb(e):
intense = intense_slider.get_value()
img1.set_style_img_recolor_opa(intense, 0)
img1.set_style_img_recolor(color, 0)
-
+
#
# Demonstrate runtime image re-coloring
#
diff --git a/examples/widgets/img/lv_example_img_3.py b/examples/widgets/img/lv_example_img_3.py
index 6584d51f6..07f222dc7 100644
--- a/examples/widgets/img/lv_example_img_3.py
+++ b/examples/widgets/img/lv_example_img_3.py
@@ -16,10 +16,10 @@
except:
print("Could not find img_cogwheel_argb.png")
sys.exit()
-
+
img_cogwheel_argb = lv.img_dsc_t({
'data_size': len(png_data),
- 'data': png_data
+ 'data': png_data
})
def set_angle(img, v):
diff --git a/examples/widgets/img/lv_example_img_4.py b/examples/widgets/img/lv_example_img_4.py
index f40e74a87..37b24a0be 100644
--- a/examples/widgets/img/lv_example_img_4.py
+++ b/examples/widgets/img/lv_example_img_4.py
@@ -1,9 +1,9 @@
from imagetools import get_png_info, open_png
-def ofs_y_anim(img, v):
+def ofs_y_anim(img, v):
img.set_offset_y(v)
# print(img,v)
-
+
# Register PNG image decoder
decoder = lv.img.decoder_create()
decoder.info_cb = get_png_info
@@ -16,10 +16,10 @@ def ofs_y_anim(img, v):
except:
print("Could not find img_skew_strip.png")
sys.exit()
-
+
img_skew_strip = lv.img_dsc_t({
'data_size': len(png_data),
- 'data': png_data
+ 'data': png_data
})
#
diff --git a/examples/widgets/imgbtn/index.rst b/examples/widgets/imgbtn/index.rst
index 69810abbb..7a55e01a7 100644
--- a/examples/widgets/imgbtn/index.rst
+++ b/examples/widgets/imgbtn/index.rst
@@ -1,5 +1,5 @@
-Simple Image button
+Simple Image button
"""""""""""""""""""
.. lv_example:: widgets/imgbtn/lv_example_imgbtn_1
diff --git a/examples/widgets/imgbtn/lv_example_imgbtn_1.py b/examples/widgets/imgbtn/lv_example_imgbtn_1.py
index d1931a7ed..234105593 100644
--- a/examples/widgets/imgbtn/lv_example_imgbtn_1.py
+++ b/examples/widgets/imgbtn/lv_example_imgbtn_1.py
@@ -12,10 +12,10 @@
except:
print("Could not find imgbtn_left.png")
sys.exit()
-
+
imgbtn_left_dsc = lv.img_dsc_t({
'data_size': len(imgbtn_left_data),
- 'data': imgbtn_left_data
+ 'data': imgbtn_left_data
})
try:
@@ -24,10 +24,10 @@
except:
print("Could not find imgbtn_mid.png")
sys.exit()
-
+
imgbtn_mid_dsc = lv.img_dsc_t({
'data_size': len(imgbtn_mid_data),
- 'data': imgbtn_mid_data
+ 'data': imgbtn_mid_data
})
try:
@@ -36,10 +36,10 @@
except:
print("Could not find imgbtn_right.png")
sys.exit()
-
+
imgbtn_right_dsc = lv.img_dsc_t({
'data_size': len(imgbtn_right_data),
- 'data': imgbtn_right_data
+ 'data': imgbtn_right_data
})
# Create a transition animation on width transformation and recolor.
diff --git a/examples/widgets/keyboard/index.rst b/examples/widgets/keyboard/index.rst
index 7693623dd..7c54e0523 100644
--- a/examples/widgets/keyboard/index.rst
+++ b/examples/widgets/keyboard/index.rst
@@ -1,5 +1,5 @@
-Keyboard with text area
+Keyboard with text area
"""""""""""""""""""""""
.. lv_example:: widgets/keyboard/lv_example_keyboard_1
diff --git a/examples/widgets/keyboard/lv_example_keyboard_1.c b/examples/widgets/keyboard/lv_example_keyboard_1.c
index 04c05f330..710098fe6 100644
--- a/examples/widgets/keyboard/lv_example_keyboard_1.c
+++ b/examples/widgets/keyboard/lv_example_keyboard_1.c
@@ -20,7 +20,7 @@ static void ta_event_cb(lv_event_t * e)
void lv_example_keyboard_1(void)
{
/*Create a keyboard to use it with an of the text areas*/
- lv_obj_t *kb = lv_keyboard_create(lv_scr_act());
+ lv_obj_t * kb = lv_keyboard_create(lv_scr_act());
/*Create a text area. The keyboard will write here*/
lv_obj_t * ta;
diff --git a/examples/widgets/keyboard/lv_example_keyboard_1.py b/examples/widgets/keyboard/lv_example_keyboard_1.py
index 3fa387538..7b7591f73 100644
--- a/examples/widgets/keyboard/lv_example_keyboard_1.py
+++ b/examples/widgets/keyboard/lv_example_keyboard_1.py
@@ -8,7 +8,7 @@ def ta_event_cb(e,kb):
if code == lv.EVENT.DEFOCUSED:
kb.set_textarea(None)
kb.add_flag(lv.obj.FLAG.HIDDEN)
-
+
# Create a keyboard to use it with one of the text areas
kb = lv.keyboard(lv.scr_act())
diff --git a/examples/widgets/label/index.rst b/examples/widgets/label/index.rst
index 4060149a6..b2b564783 100644
--- a/examples/widgets/label/index.rst
+++ b/examples/widgets/label/index.rst
@@ -1,16 +1,16 @@
-
-Line wrap, recoloring and scrolling
+
+Line wrap, recoloring and scrolling
"""""""""""""""""""""""""""""""""""
.. lv_example:: widgets/label/lv_example_label_1
:language: c
-Text shadow
+Text shadow
""""""""""""
.. lv_example:: widgets/label/lv_example_label_2
:language: c
-
+
Show LTR, RTL and Chinese texts
""""""""""""""""""""""""""""""""""""
@@ -23,3 +23,9 @@ Draw label with gradient color
.. lv_example:: widgets/label/lv_example_label_4
:language: c
+Customize circular scrolling animation
+""""""""""""""""""""""""""""""""""""
+
+.. lv_example:: widgets/label/lv_example_label_5
+ :language: c
+
diff --git a/examples/widgets/label/lv_example_label_1.c b/examples/widgets/label/lv_example_label_1.c
index 88d910891..886cd4a7b 100644
--- a/examples/widgets/label/lv_example_label_1.c
+++ b/examples/widgets/label/lv_example_label_1.c
@@ -10,7 +10,7 @@ void lv_example_label_1(void)
lv_label_set_long_mode(label1, LV_LABEL_LONG_WRAP); /*Break the long lines*/
lv_label_set_recolor(label1, true); /*Enable re-coloring by commands in the text*/
lv_label_set_text(label1, "#0000ff Re-color# #ff00ff words# #ff0000 of a# label, align the lines to the center "
- "and wrap long text automatically.");
+ "and wrap long text automatically.");
lv_obj_set_width(label1, 150); /*Set smaller width to make the lines wrap*/
lv_obj_set_style_text_align(label1, LV_TEXT_ALIGN_CENTER, 0);
lv_obj_align(label1, LV_ALIGN_CENTER, 0, -40);
diff --git a/examples/widgets/label/lv_example_label_2.c b/examples/widgets/label/lv_example_label_2.c
index f708fa1f4..0b605cf2a 100644
--- a/examples/widgets/label/lv_example_label_2.c
+++ b/examples/widgets/label/lv_example_label_2.c
@@ -19,9 +19,9 @@ void lv_example_label_2(void)
/*Create the main label*/
lv_obj_t * main_label = lv_label_create(lv_scr_act());
lv_label_set_text(main_label, "A simple method to create\n"
- "shadows on a text.\n"
- "It even works with\n\n"
- "newlines and spaces.");
+ "shadows on a text.\n"
+ "It even works with\n\n"
+ "newlines and spaces.");
/*Set the same text for the shadow label*/
lv_label_set_text(shadow_label, lv_label_get_text(main_label));
diff --git a/examples/widgets/label/lv_example_label_3.c b/examples/widgets/label/lv_example_label_3.c
index d4e1f33ee..680d88fe3 100644
--- a/examples/widgets/label/lv_example_label_3.c
+++ b/examples/widgets/label/lv_example_label_3.c
@@ -13,14 +13,16 @@ void lv_example_label_3(void)
lv_obj_align(ltr_label, LV_ALIGN_TOP_LEFT, 5, 5);
lv_obj_t * rtl_label = lv_label_create(lv_scr_act());
- lv_label_set_text(rtl_label, "מעבד, או בשמו המלא יחידת עיבוד מרכזית (באנגלית: CPU - Central Processing Unit).");
+ lv_label_set_text(rtl_label,
+ "מעבד, או בשמו המלא יחידת עיבוד מרכזית (באנגלית: CPU - Central Processing Unit).");
lv_obj_set_style_base_dir(rtl_label, LV_BASE_DIR_RTL, 0);
lv_obj_set_style_text_font(rtl_label, &lv_font_dejavu_16_persian_hebrew, 0);
lv_obj_set_width(rtl_label, 310);
lv_obj_align(rtl_label, LV_ALIGN_LEFT_MID, 5, 0);
lv_obj_t * cz_label = lv_label_create(lv_scr_act());
- lv_label_set_text(cz_label, "嵌入式系统(Embedded System),\n是一种嵌入机械或电气系统内部、具有专一功能和实时计算性能的计算机系统。");
+ lv_label_set_text(cz_label,
+ "嵌入式系统(Embedded System),\n是一种嵌入机械或电气系统内部、具有专一功能和实时计算性能的计算机系统。");
lv_obj_set_style_text_font(cz_label, &lv_font_simsun_16_cjk, 0);
lv_obj_set_width(cz_label, 310);
lv_obj_align(cz_label, LV_ALIGN_BOTTOM_LEFT, 5, -5);
diff --git a/examples/widgets/label/lv_example_label_3.py b/examples/widgets/label/lv_example_label_3.py
index b785bf4bb..12c9034aa 100644
--- a/examples/widgets/label/lv_example_label_3.py
+++ b/examples/widgets/label/lv_example_label_3.py
@@ -15,7 +15,7 @@
except:
font_montserrat_16 = lv.font_load("S:../../assets/font/montserrat-16.fnt")
ltr_label.set_style_text_font(font_montserrat_16, 0)
-
+
ltr_label.set_width(310)
ltr_label.align(lv.ALIGN.TOP_LEFT, 5, 5)
@@ -30,7 +30,7 @@
cz_label = lv.label(lv.scr_act())
cz_label.set_style_text_font(font_simsun_16_cjk, 0)
-cz_label.set_text("嵌入式系统(Embedded System),\n是一种嵌入机械或电气系统内部、具有专一功能和实时计算性能的计算机系统。")
+cz_label.set_text("嵌入式系统(Embedded System),\n是一种嵌入机械或电气系统内部、具有专一功能和实时计算性能的计算机系统。")
cz_label.set_width(310)
cz_label.align(lv.ALIGN.BOTTOM_LEFT, 5, -5)
diff --git a/examples/widgets/label/lv_example_label_5.c b/examples/widgets/label/lv_example_label_5.c
new file mode 100644
index 000000000..c190df695
--- /dev/null
+++ b/examples/widgets/label/lv_example_label_5.c
@@ -0,0 +1,30 @@
+#include "../../lv_examples.h"
+#if LV_USE_LABEL && LV_BUILD_EXAMPLES
+
+/**
+ * Show customizing the circular scrolling animation of a label with `LV_LABEL_LONG_SCROLL_CIRCULAR`
+ * long mode.
+ */
+void lv_example_label_5(void)
+{
+ static lv_anim_t animation_template;
+ static lv_style_t label_style;
+
+ lv_anim_init(&animation_template);
+ lv_anim_set_delay(&animation_template, 1000); /*Wait 1 second to start the first scroll*/
+ lv_anim_set_repeat_delay(&animation_template,
+ 3000); /*Repeat the scroll 3 seconds after the label scrolls back to the initial position*/
+
+ /*Initialize the label style with the animation template*/
+ lv_style_init(&label_style);
+ lv_style_set_anim(&label_style, &animation_template);
+
+ lv_obj_t * label1 = lv_label_create(lv_scr_act());
+ lv_label_set_long_mode(label1, LV_LABEL_LONG_SCROLL_CIRCULAR); /*Circular scroll*/
+ lv_obj_set_width(label1, 150);
+ lv_label_set_text(label1, "It is a circularly scrolling text. ");
+ lv_obj_align(label1, LV_ALIGN_CENTER, 0, 40);
+ lv_obj_add_style(label1, &label_style, LV_STATE_DEFAULT); /*Add the style to the label*/
+}
+
+#endif
diff --git a/examples/widgets/label/lv_example_label_5.py b/examples/widgets/label/lv_example_label_5.py
new file mode 100644
index 000000000..817d53e32
--- /dev/null
+++ b/examples/widgets/label/lv_example_label_5.py
@@ -0,0 +1,10 @@
+#
+# Show customizing the circular scrolling animation of a label with `LV_LABEL_LONG_SCROLL_CIRCULAR` long mode.
+#
+
+label1 = lv.label(lv.scr_act())
+label1.set_long_mode(lv.label.LONG.SCROLL_CIRCULAR) # Circular scroll
+label1.set_width(150)
+label1.set_text("It is a circularly scrolling text. ")
+label1.align(lv.ALIGN.CENTER, 0, 40)
+
diff --git a/examples/widgets/line/index.rst b/examples/widgets/line/index.rst
index bbdaa478d..156359a73 100644
--- a/examples/widgets/line/index.rst
+++ b/examples/widgets/line/index.rst
@@ -1,5 +1,5 @@
-Simple Line
+Simple Line
""""""""""""""""
.. lv_example:: widgets/line/lv_example_line_1
diff --git a/examples/widgets/line/lv_example_line_1.py b/examples/widgets/line/lv_example_line_1.py
index 816f9db86..3a5822ffe 100644
--- a/examples/widgets/line/lv_example_line_1.py
+++ b/examples/widgets/line/lv_example_line_1.py
@@ -1,8 +1,8 @@
# Create an array for the points of the line
-line_points = [ {"x":5, "y":5},
- {"x":70, "y":70},
- {"x":120, "y":10},
- {"x":180, "y":60},
+line_points = [ {"x":5, "y":5},
+ {"x":70, "y":70},
+ {"x":120, "y":10},
+ {"x":180, "y":60},
{"x":240, "y":10}]
# Create style
diff --git a/examples/widgets/list/index.rst b/examples/widgets/list/index.rst
index 9b9affb6a..ca8a897d4 100644
--- a/examples/widgets/list/index.rst
+++ b/examples/widgets/list/index.rst
@@ -1,12 +1,12 @@
-Simple List
+Simple List
""""""""""""""""
.. lv_example:: widgets/list/lv_example_list_1
:language: c
-Sorting a List using up and down buttons
+Sorting a List using up and down buttons
""""""""""""""""
.. lv_example:: widgets/list/lv_example_list_2
diff --git a/examples/widgets/list/lv_example_list_2.c b/examples/widgets/list/lv_example_list_2.c
index 918b994b8..0def918e5 100644
--- a/examples/widgets/list/lv_example_list_2.c
+++ b/examples/widgets/list/lv_example_list_2.c
@@ -4,76 +4,67 @@
#include "../../lv_examples.h"
#if LV_USE_LIST && LV_BUILD_EXAMPLES
-static lv_obj_t* list1;
-static lv_obj_t* list2;
+static lv_obj_t * list1;
+static lv_obj_t * list2;
-static lv_obj_t* currentButton = NULL;
+static lv_obj_t * currentButton = NULL;
-static void event_handler(lv_event_t* e)
+static void event_handler(lv_event_t * e)
{
lv_event_code_t code = lv_event_get_code(e);
- lv_obj_t* obj = lv_event_get_target(e);
- if (code == LV_EVENT_CLICKED)
- {
+ lv_obj_t * obj = lv_event_get_target(e);
+ if(code == LV_EVENT_CLICKED) {
LV_LOG_USER("Clicked: %s", lv_list_get_btn_text(list1, obj));
- if (currentButton == obj)
- {
+ if(currentButton == obj) {
currentButton = NULL;
}
- else
- {
+ else {
currentButton = obj;
}
- lv_obj_t* parent = lv_obj_get_parent(obj);
+ lv_obj_t * parent = lv_obj_get_parent(obj);
uint32_t i;
- for (i = 0; i < lv_obj_get_child_cnt(parent); i++)
- {
- lv_obj_t* child = lv_obj_get_child(parent, i);
- if (child == currentButton)
- {
+ for(i = 0; i < lv_obj_get_child_cnt(parent); i++) {
+ lv_obj_t * child = lv_obj_get_child(parent, i);
+ if(child == currentButton) {
lv_obj_add_state(child, LV_STATE_CHECKED);
}
- else
- {
+ else {
lv_obj_clear_state(child, LV_STATE_CHECKED);
}
}
}
}
-static void event_handler_top(lv_event_t* e)
+static void event_handler_top(lv_event_t * e)
{
lv_event_code_t code = lv_event_get_code(e);
- if (code == LV_EVENT_CLICKED)
- {
- if (currentButton == NULL) return;
+ if(code == LV_EVENT_CLICKED) {
+ if(currentButton == NULL) return;
lv_obj_move_background(currentButton);
lv_obj_scroll_to_view(currentButton, LV_ANIM_ON);
}
}
-static void event_handler_up(lv_event_t* e)
+static void event_handler_up(lv_event_t * e)
{
lv_event_code_t code = lv_event_get_code(e);
- if ((code == LV_EVENT_CLICKED) || (code == LV_EVENT_LONG_PRESSED_REPEAT))
- {
- if (currentButton == NULL) return;
+ if((code == LV_EVENT_CLICKED) || (code == LV_EVENT_LONG_PRESSED_REPEAT)) {
+ if(currentButton == NULL) return;
uint32_t index = lv_obj_get_index(currentButton);
- if (index <= 0) return;
+ if(index <= 0) return;
lv_obj_move_to_index(currentButton, index - 1);
lv_obj_scroll_to_view(currentButton, LV_ANIM_ON);
}
}
-static void event_handler_center(lv_event_t* e)
+static void event_handler_center(lv_event_t * e)
{
const lv_event_code_t code = lv_event_get_code(e);
- if ((code == LV_EVENT_CLICKED) || (code == LV_EVENT_LONG_PRESSED_REPEAT))
- {
- if (currentButton == NULL) return;
+ if((code == LV_EVENT_CLICKED) || (code == LV_EVENT_LONG_PRESSED_REPEAT)) {
+ if(currentButton == NULL) return;
- lv_obj_t* parent = lv_obj_get_parent(currentButton);
+ lv_obj_t * parent = lv_obj_get_parent(currentButton);
const uint32_t pos = lv_obj_get_child_cnt(parent) / 2;
lv_obj_move_to_index(currentButton, pos);
@@ -82,12 +73,11 @@ static void event_handler_center(lv_event_t* e)
}
}
-static void event_handler_dn(lv_event_t* e)
+static void event_handler_dn(lv_event_t * e)
{
const lv_event_code_t code = lv_event_get_code(e);
- if ((code == LV_EVENT_CLICKED) || (code == LV_EVENT_LONG_PRESSED_REPEAT))
- {
- if (currentButton == NULL) return;
+ if((code == LV_EVENT_CLICKED) || (code == LV_EVENT_LONG_PRESSED_REPEAT)) {
+ if(currentButton == NULL) return;
const uint32_t index = lv_obj_get_index(currentButton);
lv_obj_move_to_index(currentButton, index + 1);
@@ -95,31 +85,27 @@ static void event_handler_dn(lv_event_t* e)
}
}
-static void event_handler_bottom(lv_event_t* e)
+static void event_handler_bottom(lv_event_t * e)
{
const lv_event_code_t code = lv_event_get_code(e);
- if (code == LV_EVENT_CLICKED)
- {
- if (currentButton == NULL) return;
+ if(code == LV_EVENT_CLICKED) {
+ if(currentButton == NULL) return;
lv_obj_move_foreground(currentButton);
lv_obj_scroll_to_view(currentButton, LV_ANIM_ON);
}
}
-static void event_handler_swap(lv_event_t* e)
+static void event_handler_swap(lv_event_t * e)
{
const lv_event_code_t code = lv_event_get_code(e);
// lv_obj_t* obj = lv_event_get_target(e);
- if ((code == LV_EVENT_CLICKED) || (code == LV_EVENT_LONG_PRESSED_REPEAT))
- {
+ if((code == LV_EVENT_CLICKED) || (code == LV_EVENT_LONG_PRESSED_REPEAT)) {
uint32_t cnt = lv_obj_get_child_cnt(list1);
- for (int i = 0; i < 100; i++)
- if (cnt > 1)
- {
- lv_obj_t* obj = lv_obj_get_child(list1, rand() % cnt);
+ for(int i = 0; i < 100; i++)
+ if(cnt > 1) {
+ lv_obj_t * obj = lv_obj_get_child(list1, rand() % cnt);
lv_obj_move_to_index(obj, rand() % cnt);
- if (currentButton != NULL)
- {
+ if(currentButton != NULL) {
lv_obj_scroll_to_view(currentButton, LV_ANIM_ON);
}
}
@@ -134,14 +120,14 @@ void lv_example_list_2(void)
lv_obj_set_style_pad_row(list1, 5, 0);
/*Add buttons to the list*/
- lv_obj_t* btn;
+ lv_obj_t * btn;
int i;
- for (i = 0; i < 15; i++) {
+ for(i = 0; i < 15; i++) {
btn = lv_btn_create(list1);
lv_obj_set_width(btn, lv_pct(50));
lv_obj_add_event_cb(btn, event_handler, LV_EVENT_CLICKED, NULL);
- lv_obj_t* lab = lv_label_create(btn);
+ lv_obj_t * lab = lv_label_create(btn);
lv_label_set_text_fmt(lab, "Item %d", i);
}
diff --git a/examples/widgets/list/lv_example_list_2.py b/examples/widgets/list/lv_example_list_2.py
index 254d1df37..bf553c37f 100644
--- a/examples/widgets/list/lv_example_list_2.py
+++ b/examples/widgets/list/lv_example_list_2.py
@@ -81,7 +81,7 @@ def event_handler_swap(evt):
global list1
code = evt.get_code()
obj = evt.get_target()
- if code == lv.EVENT.CLICKED:
+ if code == lv.EVENT.CLICKED:
cnt = list1.get_child_cnt()
for i in range(100):
if cnt > 1:
@@ -89,7 +89,7 @@ def event_handler_swap(evt):
obj.move_to_index(urandom.getrandbits(32) % cnt)
if currentButton != None:
currentButton.scroll_to_view(lv.ANIM.ON)
-
+
#Create a list with buttons that can be sorted
list1 = lv.list(lv.scr_act())
list1.set_size(lv.pct(60), lv.pct(100))
diff --git a/examples/widgets/lv_example_widgets.h b/examples/widgets/lv_example_widgets.h
index 17b6ac20e..1d1ae16b1 100644
--- a/examples/widgets/lv_example_widgets.h
+++ b/examples/widgets/lv_example_widgets.h
@@ -82,6 +82,7 @@ void lv_example_label_1(void);
void lv_example_label_2(void);
void lv_example_label_3(void);
void lv_example_label_4(void);
+void lv_example_label_5(void);
void lv_example_led_1(void);
diff --git a/examples/widgets/menu/index.rst b/examples/widgets/menu/index.rst
index 06e6a6cc5..4a5e7c8ce 100644
--- a/examples/widgets/menu/index.rst
+++ b/examples/widgets/menu/index.rst
@@ -1,16 +1,16 @@
-Simple Menu
+Simple Menu
""""""""""""""""
.. lv_example:: widgets/menu/lv_example_menu_1
:language: c
-
+
Simple Menu with root btn
""""""""""""""""""""""""""""
.. lv_example:: widgets/menu/lv_example_menu_2
:language: c
-
+
Simple Menu with custom header
""""""""""""""""""""""""""""
@@ -22,7 +22,7 @@ Simple Menu with floating btn to add new menu page
.. lv_example:: widgets/menu/lv_example_menu_4
:language: c
-
+
Complex Menu
""""""""""""""""""""""""""""
diff --git a/examples/widgets/menu/lv_example_menu_2.py b/examples/widgets/menu/lv_example_menu_2.py
index b28d6300e..5787f540b 100644
--- a/examples/widgets/menu/lv_example_menu_2.py
+++ b/examples/widgets/menu/lv_example_menu_2.py
@@ -3,7 +3,7 @@ def back_event_handler(e):
if menu.back_btn_is_root(obj):
mbox1 = lv.msgbox(lv.scr_act(), "Hello", "Root back btn click.", None, True)
mbox1.center()
-
+
# Create a menu object
menu = lv.menu(lv.scr_act())
menu.set_mode_root_back_btn(lv.menu.ROOT_BACK_BTN.ENABLED)
diff --git a/examples/widgets/menu/lv_example_menu_4.c b/examples/widgets/menu/lv_example_menu_4.c
index 836a913fb..5807e5d95 100644
--- a/examples/widgets/menu/lv_example_menu_4.c
+++ b/examples/widgets/menu/lv_example_menu_4.c
@@ -17,11 +17,11 @@ static void float_btn_event_cb(lv_event_t * e)
lv_obj_t * sub_page = lv_menu_page_create(menu, NULL);
cont = lv_menu_cont_create(sub_page);
- label= lv_label_create(cont);
+ label = lv_label_create(cont);
lv_label_set_text_fmt(label, "Hello, I am hiding inside %i", btn_cnt);
cont = lv_menu_cont_create(main_page);
- label= lv_label_create(cont);
+ label = lv_label_create(cont);
lv_label_set_text_fmt(label, "Item %i", btn_cnt);
lv_menu_set_load_page_event(menu, cont, sub_page);
diff --git a/examples/widgets/menu/lv_example_menu_5.c b/examples/widgets/menu/lv_example_menu_5.c
index dfd33185c..e8068acfa 100644
--- a/examples/widgets/menu/lv_example_menu_5.c
+++ b/examples/widgets/menu/lv_example_menu_5.c
@@ -11,11 +11,11 @@ static void back_event_handler(lv_event_t * e);
static void switch_handler(lv_event_t * e);
lv_obj_t * root_page;
static lv_obj_t * create_text(lv_obj_t * parent, const char * icon, const char * txt,
- lv_menu_builder_variant_t builder_variant);
+ lv_menu_builder_variant_t builder_variant);
static lv_obj_t * create_slider(lv_obj_t * parent,
- const char * icon, const char * txt, int32_t min, int32_t max, int32_t val);
+ const char * icon, const char * txt, int32_t min, int32_t max, int32_t val);
static lv_obj_t * create_switch(lv_obj_t * parent,
- const char * icon, const char * txt, bool chk);
+ const char * icon, const char * txt, bool chk);
void lv_example_menu_5(void)
{
@@ -24,7 +24,8 @@ void lv_example_menu_5(void)
lv_color_t bg_color = lv_obj_get_style_bg_color(menu, 0);
if(lv_color_brightness(bg_color) > 127) {
lv_obj_set_style_bg_color(menu, lv_color_darken(lv_obj_get_style_bg_color(menu, 0), 10), 0);
- }else{
+ }
+ else {
lv_obj_set_style_bg_color(menu, lv_color_darken(lv_obj_get_style_bg_color(menu, 0), 50), 0);
}
lv_menu_set_mode_root_back_btn(menu, LV_MENU_ROOT_BACK_BTN_ENABLED);
@@ -64,8 +65,10 @@ void lv_example_menu_5(void)
lv_obj_t * sub_legal_info_page = lv_menu_page_create(menu, NULL);
lv_obj_set_style_pad_hor(sub_legal_info_page, lv_obj_get_style_pad_left(lv_menu_get_main_header(menu), 0), 0);
section = lv_menu_section_create(sub_legal_info_page);
- for(uint32_t i=0; i<15; i++){
- create_text(section, NULL, "This is a long long long long long long long long long text, if it is long enough it may scroll.", LV_MENU_ITEM_BUILDER_VARIANT_1);
+ for(uint32_t i = 0; i < 15; i++) {
+ create_text(section, NULL,
+ "This is a long long long long long long long long long text, if it is long enough it may scroll.",
+ LV_MENU_ITEM_BUILDER_VARIANT_1);
}
lv_obj_t * sub_about_page = lv_menu_page_create(menu, NULL);
@@ -128,7 +131,8 @@ static void switch_handler(lv_event_t * e)
lv_menu_set_page(menu, NULL);
lv_menu_set_sidebar_page(menu, root_page);
lv_event_send(lv_obj_get_child(lv_obj_get_child(lv_menu_get_cur_sidebar_page(menu), 0), 0), LV_EVENT_CLICKED, NULL);
- }else {
+ }
+ else {
lv_menu_set_sidebar_page(menu, NULL);
lv_menu_clear_history(menu); /* Clear history because we will be showing the root page later */
lv_menu_set_page(menu, root_page);
@@ -137,7 +141,7 @@ static void switch_handler(lv_event_t * e)
}
static lv_obj_t * create_text(lv_obj_t * parent, const char * icon, const char * txt,
- lv_menu_builder_variant_t builder_variant)
+ lv_menu_builder_variant_t builder_variant)
{
lv_obj_t * obj = lv_menu_cont_create(parent);
@@ -164,7 +168,8 @@ static lv_obj_t * create_text(lv_obj_t * parent, const char * icon, const char *
return obj;
}
-static lv_obj_t * create_slider(lv_obj_t * parent, const char * icon, const char * txt, int32_t min, int32_t max, int32_t val)
+static lv_obj_t * create_slider(lv_obj_t * parent, const char * icon, const char * txt, int32_t min, int32_t max,
+ int32_t val)
{
lv_obj_t * obj = create_text(parent, icon, txt, LV_MENU_ITEM_BUILDER_VARIANT_2);
diff --git a/examples/widgets/meter/lv_example_meter_1.c b/examples/widgets/meter/lv_example_meter_1.c
index f453ced65..40686ca29 100644
--- a/examples/widgets/meter/lv_example_meter_1.c
+++ b/examples/widgets/meter/lv_example_meter_1.c
@@ -30,7 +30,8 @@ void lv_example_meter_1(void)
lv_meter_set_indicator_end_value(meter, indic, 20);
/*Make the tick lines blue at the start of the scale*/
- indic = lv_meter_add_scale_lines(meter, scale, lv_palette_main(LV_PALETTE_BLUE), lv_palette_main(LV_PALETTE_BLUE), false, 0);
+ indic = lv_meter_add_scale_lines(meter, scale, lv_palette_main(LV_PALETTE_BLUE), lv_palette_main(LV_PALETTE_BLUE),
+ false, 0);
lv_meter_set_indicator_start_value(meter, indic, 0);
lv_meter_set_indicator_end_value(meter, indic, 20);
@@ -40,7 +41,8 @@ void lv_example_meter_1(void)
lv_meter_set_indicator_end_value(meter, indic, 100);
/*Make the tick lines red at the end of the scale*/
- indic = lv_meter_add_scale_lines(meter, scale, lv_palette_main(LV_PALETTE_RED), lv_palette_main(LV_PALETTE_RED), false, 0);
+ indic = lv_meter_add_scale_lines(meter, scale, lv_palette_main(LV_PALETTE_RED), lv_palette_main(LV_PALETTE_RED), false,
+ 0);
lv_meter_set_indicator_start_value(meter, indic, 80);
lv_meter_set_indicator_end_value(meter, indic, 100);
diff --git a/examples/widgets/meter/lv_example_meter_3.py b/examples/widgets/meter/lv_example_meter_3.py
index 7f0e7f912..2d7c6daf4 100644
--- a/examples/widgets/meter/lv_example_meter_3.py
+++ b/examples/widgets/meter/lv_example_meter_3.py
@@ -16,10 +16,10 @@
except:
print("Could not find img_hand_min.png")
sys.exit()
-
+
img_hand_min_dsc = lv.img_dsc_t({
'data_size': len(img_hand_min_data),
- 'data': img_hand_min_data
+ 'data': img_hand_min_data
})
# Create an image from the png file
@@ -29,10 +29,10 @@
except:
print("Could not find img_hand_hour.png")
sys.exit()
-
+
img_hand_hour_dsc = lv.img_dsc_t({
'data_size': len(img_hand_hour_data),
- 'data': img_hand_hour_data
+ 'data': img_hand_hour_data
})
def set_value(indic, v):
@@ -78,6 +78,6 @@ def set_value(indic, v):
a2.set_var(indic_hour)
a2.set_time(24000) # 24 sec for 1 turn of the hour hand
a2.set_values(0, 60)
-a2.set_custom_exec_cb(lambda a2,val: set_value(indic_hour,val))
+a2.set_custom_exec_cb(lambda a2,val: set_value(indic_hour,val))
lv.anim_t.start(a2)
diff --git a/examples/widgets/meter/lv_example_meter_4.c b/examples/widgets/meter/lv_example_meter_4.c
index 8650e4e00..e16fd2aa4 100644
--- a/examples/widgets/meter/lv_example_meter_4.c
+++ b/examples/widgets/meter/lv_example_meter_4.c
@@ -22,7 +22,7 @@ void lv_example_meter_4(void)
/*Add a three arc indicator*/
lv_coord_t indic_w = 100;
- lv_meter_indicator_t * indic1 = lv_meter_add_arc(meter, scale, indic_w,lv_palette_main(LV_PALETTE_ORANGE), 0);
+ lv_meter_indicator_t * indic1 = lv_meter_add_arc(meter, scale, indic_w, lv_palette_main(LV_PALETTE_ORANGE), 0);
lv_meter_set_indicator_start_value(meter, indic1, 0);
lv_meter_set_indicator_end_value(meter, indic1, 40);
diff --git a/examples/widgets/msgbox/index.rst b/examples/widgets/msgbox/index.rst
index d21fb80e5..04c441a38 100644
--- a/examples/widgets/msgbox/index.rst
+++ b/examples/widgets/msgbox/index.rst
@@ -1,5 +1,5 @@
-Simple Message box
+Simple Message box
"""""""""""""""""""
.. lv_example:: widgets/msgbox/lv_example_msgbox_1
diff --git a/examples/widgets/msgbox/lv_example_msgbox_1.c b/examples/widgets/msgbox/lv_example_msgbox_1.c
index e3674a6e8..9ae86068b 100644
--- a/examples/widgets/msgbox/lv_example_msgbox_1.c
+++ b/examples/widgets/msgbox/lv_example_msgbox_1.c
@@ -9,7 +9,7 @@ static void event_cb(lv_event_t * e)
void lv_example_msgbox_1(void)
{
- static const char * btns[] ={"Apply", "Close", ""};
+ static const char * btns[] = {"Apply", "Close", ""};
lv_obj_t * mbox1 = lv_msgbox_create(NULL, "Hello", "This is a message box with two buttons.", btns, true);
lv_obj_add_event_cb(mbox1, event_cb, LV_EVENT_VALUE_CHANGED, NULL);
diff --git a/examples/widgets/obj/index.rst b/examples/widgets/obj/index.rst
index 6f9b081f3..2bf39db9f 100644
--- a/examples/widgets/obj/index.rst
+++ b/examples/widgets/obj/index.rst
@@ -1,11 +1,11 @@
-Base objects with custom styles
+Base objects with custom styles
""""""""""""""""""""""""""""""""
.. lv_example:: widgets/obj/lv_example_obj_1
:language: c
-
-Make an object draggable
+
+Make an object draggable
""""""""""""""""""""""""""""
.. lv_example:: widgets/obj/lv_example_obj_2
diff --git a/examples/widgets/roller/index.rst b/examples/widgets/roller/index.rst
index 5e154dc2c..23a81d689 100644
--- a/examples/widgets/roller/index.rst
+++ b/examples/widgets/roller/index.rst
@@ -1,10 +1,10 @@
-Simple Roller
+Simple Roller
""""""""""""""""
.. lv_example:: widgets/roller/lv_example_roller_1
:language: c
-
+
Styling the roller
""""""""""""""""""
diff --git a/examples/widgets/roller/lv_example_roller_1.c b/examples/widgets/roller/lv_example_roller_1.c
index 2aa3523a8..93dd0be1c 100644
--- a/examples/widgets/roller/lv_example_roller_1.c
+++ b/examples/widgets/roller/lv_example_roller_1.c
@@ -17,21 +17,21 @@ static void event_handler(lv_event_t * e)
*/
void lv_example_roller_1(void)
{
- lv_obj_t *roller1 = lv_roller_create(lv_scr_act());
+ lv_obj_t * roller1 = lv_roller_create(lv_scr_act());
lv_roller_set_options(roller1,
- "January\n"
- "February\n"
- "March\n"
- "April\n"
- "May\n"
- "June\n"
- "July\n"
- "August\n"
- "September\n"
- "October\n"
- "November\n"
- "December",
- LV_ROLLER_MODE_INFINITE);
+ "January\n"
+ "February\n"
+ "March\n"
+ "April\n"
+ "May\n"
+ "June\n"
+ "July\n"
+ "August\n"
+ "September\n"
+ "October\n"
+ "November\n"
+ "December",
+ LV_ROLLER_MODE_INFINITE);
lv_roller_set_visible_row_count(roller1, 4);
lv_obj_center(roller1);
diff --git a/examples/widgets/roller/lv_example_roller_2.c b/examples/widgets/roller/lv_example_roller_2.c
index 87388127f..8c4b6fd2a 100644
--- a/examples/widgets/roller/lv_example_roller_2.c
+++ b/examples/widgets/roller/lv_example_roller_2.c
@@ -23,7 +23,7 @@ void lv_example_roller_2(void)
lv_style_set_text_font(&style_sel, &lv_font_montserrat_22);
const char * opts = "1\n2\n3\n4\n5\n6\n7\n8\n9\n10";
- lv_obj_t *roller;
+ lv_obj_t * roller;
/*A roller on the left with left aligned text, and custom width*/
roller = lv_roller_create(lv_scr_act());
diff --git a/examples/widgets/roller/lv_example_roller_2.py b/examples/widgets/roller/lv_example_roller_2.py
index 08e5e2950..7f8f7b3b1 100644
--- a/examples/widgets/roller/lv_example_roller_2.py
+++ b/examples/widgets/roller/lv_example_roller_2.py
@@ -4,7 +4,7 @@
def event_handler(e):
code = e.get_code()
obj = e.get_target()
- if code == lv.EVENT.VALUE_CHANGED:
+ if code == lv.EVENT.VALUE_CHANGED:
option = " "*10
obj.get_selected_str(option, len(option))
print("Selected value: %s\n" + option.strip())
@@ -25,7 +25,7 @@ def event_handler(e):
print("montserrat-22 not enabled in lv_conf.h, dynamically loading the font")
font_montserrat_22 = lv.font_load("S:" + "../../assets/font/montserrat-22.fnt")
style_sel.set_text_font(font_montserrat_22)
-
+
opts = "\n".join(["1","2","3","4","5","6","7","8","9","10"])
# A roller on the left with left aligned text, and custom width
diff --git a/examples/widgets/roller/lv_example_roller_3.c b/examples/widgets/roller/lv_example_roller_3.c
index 02311af12..c1e70ff8f 100644
--- a/examples/widgets/roller/lv_example_roller_3.c
+++ b/examples/widgets/roller/lv_example_roller_3.c
@@ -9,10 +9,11 @@ static void mask_event_cb(lv_event_t * e)
static int16_t mask_top_id = -1;
static int16_t mask_bottom_id = -1;
- if (code == LV_EVENT_COVER_CHECK) {
+ if(code == LV_EVENT_COVER_CHECK) {
lv_event_set_cover_res(e, LV_COVER_RES_MASKED);
- } else if (code == LV_EVENT_DRAW_MAIN_BEGIN) {
+ }
+ else if(code == LV_EVENT_DRAW_MAIN_BEGIN) {
/* add mask */
const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN);
lv_coord_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN);
@@ -34,11 +35,12 @@ static void mask_event_cb(lv_event_t * e)
rect_area.y1 = rect_area.y2 + font_h + line_space - 1;
rect_area.y2 = roller_coords.y2;
- lv_draw_mask_fade_param_t * fade_mask_bottom =lv_mem_buf_get(sizeof(lv_draw_mask_fade_param_t));
+ lv_draw_mask_fade_param_t * fade_mask_bottom = lv_mem_buf_get(sizeof(lv_draw_mask_fade_param_t));
lv_draw_mask_fade_init(fade_mask_bottom, &rect_area, LV_OPA_COVER, rect_area.y1, LV_OPA_TRANSP, rect_area.y2);
mask_bottom_id = lv_draw_mask_add(fade_mask_bottom, NULL);
- } else if (code == LV_EVENT_DRAW_POST_END) {
+ }
+ else if(code == LV_EVENT_DRAW_POST_END) {
lv_draw_mask_fade_param_t * fade_mask_top = lv_draw_mask_remove_id(mask_top_id);
lv_draw_mask_fade_param_t * fade_mask_bottom = lv_draw_mask_remove_id(mask_bottom_id);
lv_draw_mask_free_param(fade_mask_top);
@@ -63,7 +65,7 @@ void lv_example_roller_3(void)
lv_style_set_pad_all(&style, 0);
lv_obj_add_style(lv_scr_act(), &style, 0);
- lv_obj_t *roller1 = lv_roller_create(lv_scr_act());
+ lv_obj_t * roller1 = lv_roller_create(lv_scr_act());
lv_obj_add_style(roller1, &style, 0);
lv_obj_set_style_bg_opa(roller1, LV_OPA_TRANSP, LV_PART_SELECTED);
@@ -72,19 +74,19 @@ void lv_example_roller_3(void)
#endif
lv_roller_set_options(roller1,
- "January\n"
- "February\n"
- "March\n"
- "April\n"
- "May\n"
- "June\n"
- "July\n"
- "August\n"
- "September\n"
- "October\n"
- "November\n"
- "December",
- LV_ROLLER_MODE_NORMAL);
+ "January\n"
+ "February\n"
+ "March\n"
+ "April\n"
+ "May\n"
+ "June\n"
+ "July\n"
+ "August\n"
+ "September\n"
+ "October\n"
+ "November\n"
+ "December",
+ LV_ROLLER_MODE_NORMAL);
lv_obj_center(roller1);
lv_roller_set_visible_row_count(roller1, 3);
diff --git a/examples/widgets/roller/lv_example_roller_3.py b/examples/widgets/roller/lv_example_roller_3.py
index be073dcbc..13c9e9fbd 100644
--- a/examples/widgets/roller/lv_example_roller_3.py
+++ b/examples/widgets/roller/lv_example_roller_3.py
@@ -6,23 +6,23 @@ class Lv_Roller_3():
def __init__(self):
self.mask_top_id = -1
self.mask_bottom_id = -1
-
- #
+
+ #
# Add a fade mask to roller.
#
style = lv.style_t()
style.init()
style.set_bg_color(lv.color_black())
style.set_text_color(lv.color_white())
-
+
lv.scr_act().add_style(style, 0)
-
+
roller1 = lv.roller(lv.scr_act())
roller1.add_style(style, 0)
roller1.set_style_border_width(0, 0)
roller1.set_style_pad_all(0, 0)
roller1.set_style_bg_opa(lv.OPA.TRANSP, lv.PART.SELECTED)
-
+
#if LV_FONT_MONTSERRAT_22
# lv_obj_set_style_text_font(roller1, &lv_font_montserrat_22, LV_PART_SELECTED);
#endif
@@ -34,7 +34,7 @@ def __init__(self):
print("montserrat-22 not enabled in lv_conf.h, dynamically loading the font")
font_montserrat_22 = lv.font_load("S:" + "../../assets/font/montserrat-22.fnt")
roller1.set_style_text_font(font_montserrat_22,lv.PART.SELECTED)
-
+
roller1.set_options("\n".join([
"January",
"February",
@@ -62,27 +62,27 @@ def mask_event_cb(self,e):
e.set_cover_res(lv.COVER_RES.MASKED)
elif code == lv.EVENT.DRAW_MAIN_BEGIN:
- # add mask
+ # add mask
font = obj.get_style_text_font(lv.PART.MAIN)
line_space = obj.get_style_text_line_space(lv.PART.MAIN)
font_h = font.get_line_height()
-
+
roller_coords = lv.area_t()
obj.get_coords(roller_coords)
-
+
rect_area = lv.area_t()
rect_area.x1 = roller_coords.x1
rect_area.x2 = roller_coords.x2
rect_area.y1 = roller_coords.y1
rect_area.y2 = roller_coords.y1 + (obj.get_height() - font_h - line_space) // 2
-
+
fade_mask_top = lv.draw_mask_fade_param_t()
fade_mask_top.init(rect_area, lv.OPA.TRANSP, rect_area.y1, lv.OPA.COVER, rect_area.y2)
self.mask_top_id = lv.draw_mask_add(fade_mask_top,None)
-
+
rect_area.y1 = rect_area.y2 + font_h + line_space - 1
rect_area.y2 = roller_coords.y2
-
+
fade_mask_bottom = lv.draw_mask_fade_param_t()
fade_mask_bottom.init(rect_area, lv.OPA.COVER, rect_area.y1, lv.OPA.TRANSP, rect_area.y2)
self.mask_bottom_id = lv.draw_mask_add(fade_mask_bottom, None)
@@ -95,5 +95,5 @@ def mask_event_cb(self,e):
lv.draw_mask_remove_id(self.mask_bottom_id)
self.mask_top_id = -1
self.mask_bottom_id = -1
-
+
roller3 = Lv_Roller_3()
diff --git a/examples/widgets/slider/index.rst b/examples/widgets/slider/index.rst
index 96dcf0f6b..b808de38f 100644
--- a/examples/widgets/slider/index.rst
+++ b/examples/widgets/slider/index.rst
@@ -10,11 +10,11 @@ Slider with custom style
.. lv_example:: widgets/slider/lv_example_slider_2
:language: c
-
+
Slider with extended drawer
""""""""""""""""""""""""""""
.. lv_example:: widgets/slider/lv_example_slider_3
:language: c
-
+
diff --git a/examples/widgets/slider/lv_example_slider_1.py b/examples/widgets/slider/lv_example_slider_1.py
index 30af17bab..c38172505 100644
--- a/examples/widgets/slider/lv_example_slider_1.py
+++ b/examples/widgets/slider/lv_example_slider_1.py
@@ -1,4 +1,4 @@
-#
+#
# A default slider with a label displaying the current value
#
def slider_event_cb(e):
diff --git a/examples/widgets/slider/lv_example_slider_3.c b/examples/widgets/slider/lv_example_slider_3.c
index d92b2f3ab..3194a1f88 100644
--- a/examples/widgets/slider/lv_example_slider_3.c
+++ b/examples/widgets/slider/lv_example_slider_3.c
@@ -29,11 +29,10 @@ static void slider_event_cb(lv_event_t * e)
/*Provide some extra space for the value*/
if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) {
- lv_coord_t * size = lv_event_get_param(e);
- *size = LV_MAX(*size, 50);
+ lv_event_set_ext_draw_size(e, 50);
}
else if(code == LV_EVENT_DRAW_PART_END) {
- lv_obj_draw_part_dsc_t * dsc = lv_event_get_param(e);
+ lv_obj_draw_part_dsc_t * dsc = lv_event_get_draw_part_dsc(e);
if(dsc->part == LV_PART_INDICATOR) {
char buf[16];
lv_snprintf(buf, sizeof(buf), "%d - %d", (int)lv_slider_get_left_value(obj), (int)lv_slider_get_value(obj));
@@ -48,7 +47,7 @@ static void slider_event_cb(lv_event_t * e)
lv_draw_label_dsc_t label_draw_dsc;
lv_draw_label_dsc_init(&label_draw_dsc);
-
+ label_draw_dsc.color = lv_color_hex3(0x888);
lv_draw_label(dsc->draw_ctx, &label_draw_dsc, &label_area, buf, NULL);
}
}
diff --git a/examples/widgets/slider/lv_example_slider_3.py b/examples/widgets/slider/lv_example_slider_3.py
index 654359c1c..b96135eab 100644
--- a/examples/widgets/slider/lv_example_slider_3.py
+++ b/examples/widgets/slider/lv_example_slider_3.py
@@ -5,7 +5,7 @@ def slider_event_cb(e):
# Provide some extra space for the value
if code == lv.EVENT.REFR_EXT_DRAW_SIZE:
e.set_ext_draw_size(50)
-
+
elif code == lv.EVENT.DRAW_PART_END:
# print("DRAW_PART_END")
dsc = lv.obj_draw_part_dsc_t.__cast__(e.get_param())
diff --git a/examples/widgets/span/lv_example_span_1.c b/examples/widgets/span/lv_example_span_1.c
index e465bce68..e09caed87 100644
--- a/examples/widgets/span/lv_example_span_1.c
+++ b/examples/widgets/span/lv_example_span_1.c
@@ -14,7 +14,7 @@ void lv_example_span_1(void)
lv_obj_t * spans = lv_spangroup_create(lv_scr_act());
lv_obj_set_width(spans, 300);
- lv_obj_set_height(spans,300);
+ lv_obj_set_height(spans, 300);
lv_obj_center(spans);
lv_obj_add_style(spans, &style, 0);
@@ -26,7 +26,7 @@ void lv_example_span_1(void)
lv_span_t * span = lv_spangroup_new_span(spans);
lv_span_set_text(span, "China is a beautiful country.");
lv_style_set_text_color(&span->style, lv_palette_main(LV_PALETTE_RED));
- lv_style_set_text_decor(&span->style, LV_TEXT_DECOR_STRIKETHROUGH | LV_TEXT_DECOR_UNDERLINE);
+ lv_style_set_text_decor(&span->style, LV_TEXT_DECOR_UNDERLINE);
lv_style_set_text_opa(&span->style, LV_OPA_50);
span = lv_spangroup_new_span(spans);
@@ -50,6 +50,7 @@ void lv_example_span_1(void)
span = lv_spangroup_new_span(spans);
lv_span_set_text(span, "I have a dream that hope to come true.");
+ lv_style_set_text_decor(&span->style, LV_TEXT_DECOR_STRIKETHROUGH);
lv_spangroup_refr_mode(spans);
}
diff --git a/examples/widgets/spinbox/index.rst b/examples/widgets/spinbox/index.rst
index ee4bcd8f8..4ccaddc0c 100644
--- a/examples/widgets/spinbox/index.rst
+++ b/examples/widgets/spinbox/index.rst
@@ -1,5 +1,5 @@
-Simple Spinbox
+Simple Spinbox
"""""""""""""""""""""""
.. lv_example:: widgets/spinbox/lv_example_spinbox_1
diff --git a/examples/widgets/spinner/index.rst b/examples/widgets/spinner/index.rst
index b999a737b..c3cf2e772 100644
--- a/examples/widgets/spinner/index.rst
+++ b/examples/widgets/spinner/index.rst
@@ -1,5 +1,5 @@
-Simple spinner
+Simple spinner
""""""""""""""""""""""""""""
.. lv_example:: widgets/spinner/lv_example_spinner_1
diff --git a/examples/widgets/switch/index.rst b/examples/widgets/switch/index.rst
index c2f294ca5..af97d218e 100644
--- a/examples/widgets/switch/index.rst
+++ b/examples/widgets/switch/index.rst
@@ -1,5 +1,5 @@
-Simple Switch
+Simple Switch
"""""""""""""""""""""""
.. lv_example:: widgets/switch/lv_example_switch_1
diff --git a/examples/widgets/table/index.rst b/examples/widgets/table/index.rst
index abd5c7474..0072bbb0e 100644
--- a/examples/widgets/table/index.rst
+++ b/examples/widgets/table/index.rst
@@ -1,11 +1,11 @@
-Simple table
+Simple table
"""""""""""""""""""""""
.. lv_example:: widgets/table/lv_example_table_1
:language: c
-
+
Lightweighted list from table
""""""""""""""""""""""""""""""
diff --git a/examples/widgets/table/lv_example_table_1.c b/examples/widgets/table/lv_example_table_1.c
index cf528c8ec..dc776370b 100644
--- a/examples/widgets/table/lv_example_table_1.c
+++ b/examples/widgets/table/lv_example_table_1.c
@@ -4,7 +4,7 @@
static void draw_part_event_cb(lv_event_t * e)
{
lv_obj_t * obj = lv_event_get_target(e);
- lv_obj_draw_part_dsc_t * dsc = lv_event_get_param(e);
+ lv_obj_draw_part_dsc_t * dsc = lv_event_get_draw_part_dsc(e);
/*If the cells are drawn...*/
if(dsc->part == LV_PART_ITEMS) {
uint32_t row = dsc->id / lv_table_get_col_cnt(obj);
diff --git a/examples/widgets/table/lv_example_table_2.c b/examples/widgets/table/lv_example_table_2.c
index 4e02c688e..bd1e933cb 100644
--- a/examples/widgets/table/lv_example_table_2.c
+++ b/examples/widgets/table/lv_example_table_2.c
@@ -27,7 +27,8 @@ static void draw_event_cb(lv_event_t * e)
if(chk) {
sw_area.x2 -= 2;
sw_area.x1 = sw_area.x2 - 16;
- } else {
+ }
+ else {
sw_area.x1 += 2;
sw_area.x2 = sw_area.x1 + 16;
}
@@ -92,8 +93,8 @@ void lv_example_table_2(void)
lv_obj_t * label = lv_label_create(lv_scr_act());
lv_label_set_text_fmt(label, "%"LV_PRIu32" items were created in %"LV_PRIu32" ms\n"
- "using %"LV_PRIu32" bytes of memory",
- ITEM_CNT, elaps, mem_used);
+ "using %"LV_PRIu32" bytes of memory",
+ ITEM_CNT, elaps, mem_used);
lv_obj_align(label, LV_ALIGN_BOTTOM_MID, 0, -10);
diff --git a/examples/widgets/table/lv_example_table_2.py b/examples/widgets/table/lv_example_table_2.py
index 794131a3a..2da216130 100644
--- a/examples/widgets/table/lv_example_table_2.py
+++ b/examples/widgets/table/lv_example_table_2.py
@@ -17,7 +17,7 @@ def draw_event_cb(e):
rect_dsc.bg_color = lv.theme_get_color_primary(obj)
else:
rect_dsc.bg_color = lv.palette_lighten(lv.PALETTE.GREY, 2)
-
+
rect_dsc.radius = lv.RADIUS.CIRCLE
sw_area = lv.area_t()
@@ -26,9 +26,9 @@ def draw_event_cb(e):
sw_area.y1 = dsc.draw_area.y1 + dsc.draw_area.get_height() // 2 - 10
sw_area.y2 = sw_area.y1 + 20
dsc.draw_ctx.rect(rect_dsc, sw_area)
-
+
rect_dsc.bg_color = lv.color_white()
-
+
if chk:
sw_area.x2 -= 2
sw_area.x1 = sw_area.x2 - 16
diff --git a/examples/widgets/tabview/index.rst b/examples/widgets/tabview/index.rst
index cf92a4117..468513556 100644
--- a/examples/widgets/tabview/index.rst
+++ b/examples/widgets/tabview/index.rst
@@ -1,5 +1,5 @@
-Simple Tabview
+Simple Tabview
"""""""""""""""""""""""
.. lv_example:: widgets/tabview/lv_example_tabview_1
diff --git a/examples/widgets/tabview/lv_example_tabview_1.c b/examples/widgets/tabview/lv_example_tabview_1.c
index 17fc82e48..570a7b821 100644
--- a/examples/widgets/tabview/lv_example_tabview_1.c
+++ b/examples/widgets/tabview/lv_example_tabview_1.c
@@ -4,31 +4,31 @@
void lv_example_tabview_1(void)
{
/*Create a Tab view object*/
- lv_obj_t *tabview;
+ lv_obj_t * tabview;
tabview = lv_tabview_create(lv_scr_act(), LV_DIR_TOP, 50);
/*Add 3 tabs (the tabs are page (lv_page) and can be scrolled*/
- lv_obj_t *tab1 = lv_tabview_add_tab(tabview, "Tab 1");
- lv_obj_t *tab2 = lv_tabview_add_tab(tabview, "Tab 2");
- lv_obj_t *tab3 = lv_tabview_add_tab(tabview, "Tab 3");
+ lv_obj_t * tab1 = lv_tabview_add_tab(tabview, "Tab 1");
+ lv_obj_t * tab2 = lv_tabview_add_tab(tabview, "Tab 2");
+ lv_obj_t * tab3 = lv_tabview_add_tab(tabview, "Tab 3");
/*Add content to the tabs*/
lv_obj_t * label = lv_label_create(tab1);
lv_label_set_text(label, "This the first tab\n\n"
- "If the content\n"
- "of a tab\n"
- "becomes too\n"
- "longer\n"
- "than the\n"
- "container\n"
- "then it\n"
- "automatically\n"
- "becomes\n"
- "scrollable.\n"
- "\n"
- "\n"
- "\n"
- "Can you see it?");
+ "If the content\n"
+ "of a tab\n"
+ "becomes too\n"
+ "longer\n"
+ "than the\n"
+ "container\n"
+ "then it\n"
+ "automatically\n"
+ "becomes\n"
+ "scrollable.\n"
+ "\n"
+ "\n"
+ "\n"
+ "Can you see it?");
label = lv_label_create(tab2);
lv_label_set_text(label, "Second tab");
diff --git a/examples/widgets/tabview/lv_example_tabview_2.c b/examples/widgets/tabview/lv_example_tabview_2.c
index e90a5638f..026604266 100644
--- a/examples/widgets/tabview/lv_example_tabview_2.c
+++ b/examples/widgets/tabview/lv_example_tabview_2.c
@@ -13,7 +13,7 @@ static void scroll_begin_event(lv_event_t * e)
void lv_example_tabview_2(void)
{
/*Create a Tab view object*/
- lv_obj_t *tabview;
+ lv_obj_t * tabview;
tabview = lv_tabview_create(lv_scr_act(), LV_DIR_LEFT, 80);
lv_obj_add_event_cb(lv_tabview_get_content(tabview), scroll_begin_event, LV_EVENT_SCROLL_BEGIN, NULL);
@@ -26,11 +26,11 @@ void lv_example_tabview_2(void)
/*Add 3 tabs (the tabs are page (lv_page) and can be scrolled*/
- lv_obj_t *tab1 = lv_tabview_add_tab(tabview, "Tab 1");
- lv_obj_t *tab2 = lv_tabview_add_tab(tabview, "Tab 2");
- lv_obj_t *tab3 = lv_tabview_add_tab(tabview, "Tab 3");
- lv_obj_t *tab4 = lv_tabview_add_tab(tabview, "Tab 4");
- lv_obj_t *tab5 = lv_tabview_add_tab(tabview, "Tab 5");
+ lv_obj_t * tab1 = lv_tabview_add_tab(tabview, "Tab 1");
+ lv_obj_t * tab2 = lv_tabview_add_tab(tabview, "Tab 2");
+ lv_obj_t * tab3 = lv_tabview_add_tab(tabview, "Tab 3");
+ lv_obj_t * tab4 = lv_tabview_add_tab(tabview, "Tab 4");
+ lv_obj_t * tab5 = lv_tabview_add_tab(tabview, "Tab 5");
lv_obj_set_style_bg_color(tab2, lv_palette_lighten(LV_PALETTE_AMBER, 3), 0);
lv_obj_set_style_bg_opa(tab2, LV_OPA_COVER, 0);
diff --git a/examples/widgets/textarea/index.rst b/examples/widgets/textarea/index.rst
index 5ea651c76..9bb7bb51e 100644
--- a/examples/widgets/textarea/index.rst
+++ b/examples/widgets/textarea/index.rst
@@ -4,14 +4,14 @@ Simple Text area
.. lv_example:: widgets/textarea/lv_example_textarea_1
:language: c
-
-
-Text area with password field
+
+
+Text area with password field
"""""""""""""""""""""""""""""
.. lv_example:: widgets/textarea/lv_example_textarea_2
:language: c
-
+
Text auto-formatting
"""""""""""""""""""""""""""""
diff --git a/examples/widgets/textarea/lv_example_textarea_1.c b/examples/widgets/textarea/lv_example_textarea_1.c
index cf7570972..d8689cb91 100644
--- a/examples/widgets/textarea/lv_example_textarea_1.c
+++ b/examples/widgets/textarea/lv_example_textarea_1.c
@@ -28,9 +28,10 @@ void lv_example_textarea_1(void)
lv_obj_add_state(ta, LV_STATE_FOCUSED); /*To be sure the cursor is visible*/
static const char * btnm_map[] = {"1", "2", "3", "\n",
- "4", "5", "6", "\n",
- "7", "8", "9", "\n",
- LV_SYMBOL_BACKSPACE, "0", LV_SYMBOL_NEW_LINE, ""};
+ "4", "5", "6", "\n",
+ "7", "8", "9", "\n",
+ LV_SYMBOL_BACKSPACE, "0", LV_SYMBOL_NEW_LINE, ""
+ };
lv_obj_t * btnm = lv_btnmatrix_create(lv_scr_act());
lv_obj_set_size(btnm, 200, 150);
diff --git a/examples/widgets/textarea/lv_example_textarea_1.py b/examples/widgets/textarea/lv_example_textarea_1.py
index 5363a0016..c5571889d 100644
--- a/examples/widgets/textarea/lv_example_textarea_1.py
+++ b/examples/widgets/textarea/lv_example_textarea_1.py
@@ -23,7 +23,7 @@ def btnm_event_handler(e, ta):
"4", "5", "6", "\n",
"7", "8", "9", "\n",
lv.SYMBOL.BACKSPACE, "0", lv.SYMBOL.NEW_LINE, ""]
-
+
btnm = lv.btnmatrix(lv.scr_act())
btnm.set_size(200, 150)
btnm.align(lv.ALIGN.BOTTOM_MID, 0, -10)
diff --git a/examples/widgets/textarea/lv_example_textarea_3.c b/examples/widgets/textarea/lv_example_textarea_3.c
index 21cb31bb1..d3a453a09 100644
--- a/examples/widgets/textarea/lv_example_textarea_3.c
+++ b/examples/widgets/textarea/lv_example_textarea_3.c
@@ -31,9 +31,8 @@ static void ta_event_cb(lv_event_t * e)
lv_obj_t * ta = lv_event_get_target(e);
const char * txt = lv_textarea_get_text(ta);
if(txt[0] >= '0' && txt[0] <= '9' &&
- txt[1] >= '0' && txt[1] <= '9' &&
- txt[2] != ':')
- {
+ txt[1] >= '0' && txt[1] <= '9' &&
+ txt[2] != ':') {
lv_textarea_set_cursor_pos(ta, 2);
lv_textarea_add_char(ta, ':');
}
diff --git a/examples/widgets/textarea/lv_example_textarea_3.py b/examples/widgets/textarea/lv_example_textarea_3.py
index 400596bc7..71d7c2d9e 100644
--- a/examples/widgets/textarea/lv_example_textarea_3.py
+++ b/examples/widgets/textarea/lv_example_textarea_3.py
@@ -14,7 +14,7 @@ def ta_event_cb(e):
rest = txt[colon_pos:]
if len(rest) > 3:
ta.del_char()
-
+
if len(txt) < 2:
return
if ":" in txt:
diff --git a/examples/widgets/tileview/index.rst b/examples/widgets/tileview/index.rst
index 75ade97b5..10910f4c7 100644
--- a/examples/widgets/tileview/index.rst
+++ b/examples/widgets/tileview/index.rst
@@ -1,5 +1,5 @@
-Tileview with content
+Tileview with content
"""""""""""""""""""""""""""
.. lv_example:: widgets/tileview/lv_example_tileview_1
diff --git a/examples/widgets/tileview/lv_example_tileview_1.c b/examples/widgets/tileview/lv_example_tileview_1.c
index c153d013b..8f91d2799 100644
--- a/examples/widgets/tileview/lv_example_tileview_1.c
+++ b/examples/widgets/tileview/lv_example_tileview_1.c
@@ -8,7 +8,7 @@
*/
void lv_example_tileview_1(void)
{
- lv_obj_t *tv = lv_tileview_create(lv_scr_act());
+ lv_obj_t * tv = lv_tileview_create(lv_scr_act());
/*Tile1: just a label*/
lv_obj_t * tile1 = lv_tileview_add_tile(tv, 0, 0, LV_DIR_BOTTOM);
diff --git a/examples/widgets/win/index.rst b/examples/widgets/win/index.rst
index 95017fa0c..2f6fc3a2a 100644
--- a/examples/widgets/win/index.rst
+++ b/examples/widgets/win/index.rst
@@ -1,5 +1,5 @@
-Simple window
+Simple window
"""""""""""""""
.. lv_example:: widgets/win/lv_example_win_1
diff --git a/examples/widgets/win/lv_example_win_1.c b/examples/widgets/win/lv_example_win_1.c
index bf49e54b9..4df0bff75 100644
--- a/examples/widgets/win/lv_example_win_1.c
+++ b/examples/widgets/win/lv_example_win_1.c
@@ -26,18 +26,18 @@ void lv_example_win_1(void)
lv_obj_t * cont = lv_win_get_content(win); /*Content can be added here*/
lv_obj_t * label = lv_label_create(cont);
lv_label_set_text(label, "This is\n"
- "a pretty\n"
- "long text\n"
- "to see how\n"
- "the window\n"
- "becomes\n"
- "scrollable.\n"
- "\n"
- "\n"
- "Some more\n"
- "text to be\n"
- "sure it\n"
- "overflows. :)");
+ "a pretty\n"
+ "long text\n"
+ "to see how\n"
+ "the window\n"
+ "becomes\n"
+ "scrollable.\n"
+ "\n"
+ "\n"
+ "Some more\n"
+ "text to be\n"
+ "sure it\n"
+ "overflows. :)");
}
diff --git a/examples/widgets/win/lv_example_win_1.py b/examples/widgets/win/lv_example_win_1.py
index 6d67191aa..2f5156cec 100644
--- a/examples/widgets/win/lv_example_win_1.py
+++ b/examples/widgets/win/lv_example_win_1.py
@@ -27,7 +27,7 @@ def event_handler(e):
We need
quite some text
-and we will
+and we will
even put
some more
text to be
diff --git a/library.json b/library.json
index 4118152a9..b5366b612 100644
--- a/library.json
+++ b/library.json
@@ -1,6 +1,6 @@
{
"name": "lvgl",
- "version": "8.2.0",
+ "version": "8.3.3",
"keywords": "graphics, gui, embedded, tft, lvgl",
"description": "Graphics library to create embedded GUI with easy-to-use graphical elements, beautiful visual effects and low memory footprint. It offers anti-aliasing, opacity, and animations using only one frame buffer.",
"repository": {
diff --git a/library.properties b/library.properties
index 99a97ed6e..816446a93 100644
--- a/library.properties
+++ b/library.properties
@@ -1,5 +1,5 @@
name=lvgl
-version=8.2.0
+version=8.3.3
author=kisvegabor
maintainer=kisvegabor,embeddedt,pete-pjb
sentence=Full-featured Graphics Library for Embedded Systems
diff --git a/lv_conf_template.h b/lv_conf_template.h
index c268d269b..3d087f0f3 100644
--- a/lv_conf_template.h
+++ b/lv_conf_template.h
@@ -1,6 +1,6 @@
/**
* @file lv_conf.h
- * Configuration file for v8.2.0
+ * Configuration file for v8.3.3
*/
/*
@@ -29,14 +29,14 @@
/*Swap the 2 bytes of RGB565 color. Useful if the display has an 8-bit interface (e.g. SPI)*/
#define LV_COLOR_16_SWAP 0
-/*Enable more complex drawing routines to manage screens transparency.
- *Can be used if the UI is above another layer, e.g. an OSD menu or video player.
- *Requires `LV_COLOR_DEPTH = 32` colors and the screen's `bg_opa` should be set to non LV_OPA_COVER value*/
+/*Enable features to draw on transparent background.
+ *It's required if opa, and transform_* style properties are used.
+ *Can be also used if the UI is above another layer, e.g. an OSD menu or video player.*/
#define LV_COLOR_SCREEN_TRANSP 0
/* Adjust color mix functions rounding. GPUs might calculate color mix (blending) differently.
* 0: round down, 64: round up from x.75, 128: round up from half, 192: round up from x.25, 254: round up */
-#define LV_COLOR_MIX_ROUND_OFS (LV_COLOR_DEPTH == 32 ? 0: 128)
+#define LV_COLOR_MIX_ROUND_OFS 0
/*Images pixels with this color will not be drawn if they are chroma keyed)*/
#define LV_COLOR_CHROMA_KEY lv_color_hex(0x00ff00) /*pure green*/
@@ -55,8 +55,8 @@
#define LV_MEM_ADR 0 /*0: unused*/
/*Instead of an address give a memory allocator that will be called to get a memory pool for LVGL. E.g. my_malloc*/
#if LV_MEM_ADR == 0
- //#define LV_MEM_POOL_INCLUDE your_alloc_library /* Uncomment if using an external allocator*/
- //#define LV_MEM_POOL_ALLOC your_alloc /* Uncomment if using an external allocator*/
+ #undef LV_MEM_POOL_INCLUDE
+ #undef LV_MEM_POOL_ALLOC
#endif
#else /*LV_MEM_CUSTOM*/
@@ -120,33 +120,49 @@
#define LV_CIRCLE_CACHE_SIZE 4
#endif /*LV_DRAW_COMPLEX*/
+/**
+ * "Simple layers" are used when a widget has `style_opa < 255` to buffer the widget into a layer
+ * and blend it as an image with the given opacity.
+ * Note that `bg_opa`, `text_opa` etc don't require buffering into layer)
+ * The widget can be buffered in smaller chunks to avoid using large buffers.
+ *
+ * - LV_LAYER_SIMPLE_BUF_SIZE: [bytes] the optimal target buffer size. LVGL will try to allocate it
+ * - LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE: [bytes] used if `LV_LAYER_SIMPLE_BUF_SIZE` couldn't be allocated.
+ *
+ * Both buffer sizes are in bytes.
+ * "Transformed layers" (where transform_angle/zoom properties are used) use larger buffers
+ * and can't be drawn in chunks. So these settings affects only widgets with opacity.
+ */
+#define LV_LAYER_SIMPLE_BUF_SIZE (24 * 1024)
+#define LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE (3 * 1024)
+
/*Default image cache size. Image caching keeps the images opened.
*If only the built-in image formats are used there is no real advantage of caching. (I.e. if no new image decoder is added)
*With complex image decoders (e.g. PNG or JPG) caching can save the continuous open/decode of images.
*However the opened images might consume additional RAM.
*0: to disable caching*/
-#define LV_IMG_CACHE_DEF_SIZE 0
+#define LV_IMG_CACHE_DEF_SIZE 0
/*Number of stops allowed per gradient. Increase this to allow more stops.
*This adds (sizeof(lv_color_t) + 1) bytes per additional stop*/
-#define LV_GRADIENT_MAX_STOPS 2
+#define LV_GRADIENT_MAX_STOPS 2
/*Default gradient buffer size.
*When LVGL calculates the gradient "maps" it can save them into a cache to avoid calculating them again.
*LV_GRAD_CACHE_DEF_SIZE sets the size of this cache in bytes.
*If the cache is too small the map will be allocated only while it's required for the drawing.
*0 mean no caching.*/
-#define LV_GRAD_CACHE_DEF_SIZE 0
+#define LV_GRAD_CACHE_DEF_SIZE 0
/*Allow dithering the gradients (to achieve visual smooth color gradients on limited color depth display)
*LV_DITHER_GRADIENT implies allocating one or two more lines of the object's rendering surface
*The increase in memory consumption is (32 bits * object width) plus 24 bits * object width if using error diffusion */
-#define LV_DITHER_GRADIENT 0
+#define LV_DITHER_GRADIENT 0
#if LV_DITHER_GRADIENT
/*Add support for error diffusion dithering.
*Error diffusion dithering gets a much better visual result, but implies more CPU consumption and memory when drawing.
*The increase in memory consumption is (24 bits * object's width)*/
- #define LV_DITHER_ERROR_DIFFUSION 0
+ #define LV_DITHER_ERROR_DIFFUSION 0
#endif
/*Maximum buffer size to allocate for rotation.
@@ -157,6 +173,9 @@
* GPU
*-----------*/
+/*Use Arm's 2D acceleration library Arm-2D */
+#define LV_USE_GPU_ARM2D 0
+
/*Use STM32's DMA2D (aka Chrom Art) GPU*/
#define LV_USE_GPU_STM32_DMA2D 0
#if LV_USE_GPU_STM32_DMA2D
@@ -165,6 +184,12 @@
#define LV_GPU_DMA2D_CMSIS_INCLUDE
#endif
+/*Use SWM341's DMA2D GPU*/
+#define LV_USE_GPU_SWM341_DMA2D 0
+#if LV_USE_GPU_SWM341_DMA2D
+ #define LV_GPU_SWM341_DMA2D_INCLUDE "SWM341.h"
+#endif
+
/*Use NXP's PXP GPU iMX RTxxx platforms*/
#define LV_USE_GPU_NXP_PXP 0
#if LV_USE_GPU_NXP_PXP
@@ -380,6 +405,9 @@
#define LV_FONT_SUBPX_BGR 0 /*0: RGB; 1:BGR order*/
#endif
+/*Enable drawing placeholders when glyph dsc is not found*/
+#define LV_USE_FONT_PLACEHOLDER 1
+
/*=================
* TEXT SETTINGS
*=================*/
@@ -434,8 +462,6 @@
#define LV_USE_ARC 1
-#define LV_USE_ANIMIMG 1
-
#define LV_USE_BAR 1
#define LV_USE_BTN 1
@@ -481,6 +507,8 @@
/*-----------
* Widgets
*----------*/
+#define LV_USE_ANIMIMG 1
+
#define LV_USE_CALENDAR 1
#if LV_USE_CALENDAR
#define LV_CALENDAR_WEEK_STARTS_MONDAY 0
@@ -513,6 +541,12 @@
#define LV_USE_MSGBOX 1
+#define LV_USE_SPAN 1
+#if LV_USE_SPAN
+ /*A line text can contain maximum num of span descriptor */
+ #define LV_SPAN_SNIPPET_STACK_SIZE 64
+#endif
+
#define LV_USE_SPINBOX 1
#define LV_USE_SPINNER 1
@@ -523,12 +557,6 @@
#define LV_USE_WIN 1
-#define LV_USE_SPAN 1
-#if LV_USE_SPAN
- /*A line text can contain maximum num of span descriptor */
- #define LV_SPAN_SNIPPET_STACK_SIZE 64
-#endif
-
/*-----------
* Themes
*----------*/
@@ -574,7 +602,7 @@
#if LV_USE_FS_STDIO
#define LV_FS_STDIO_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/
#define LV_FS_STDIO_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/
- #define LV_FS_STDIO_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/
+ #define LV_FS_STDIO_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/
#endif
/*API for open, read, etc*/
@@ -582,19 +610,19 @@
#if LV_USE_FS_POSIX
#define LV_FS_POSIX_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/
#define LV_FS_POSIX_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/
- #define LV_FS_POSIX_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/
+ #define LV_FS_POSIX_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/
#endif
/*API for CreateFile, ReadFile, etc*/
#define LV_USE_FS_WIN32 0
#if LV_USE_FS_WIN32
- #define LV_FS_WIN32_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/
+ #define LV_FS_WIN32_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/
#define LV_FS_WIN32_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/
#define LV_FS_WIN32_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/
#endif
/*API for FATFS (needs to be added separately). Uses f_open, f_read, etc*/
-#define LV_USE_FS_FATFS 0
+#define LV_USE_FS_FATFS 0
#if LV_USE_FS_FATFS
#define LV_FS_FATFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/
#define LV_FS_FATFS_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/
@@ -638,10 +666,10 @@
/*FFmpeg library for image decoding and playing videos
*Supports all major image formats so do not enable other image decoder with it*/
-#define LV_USE_FFMPEG 0
+#define LV_USE_FFMPEG 0
#if LV_USE_FFMPEG
/*Dump input information to stderr*/
- #define LV_FFMPEG_AV_DUMP_FORMAT 0
+ #define LV_FFMPEG_DUMP_FORMAT 0
#endif
/*-----------
@@ -652,10 +680,37 @@
#define LV_USE_SNAPSHOT 0
/*1: Enable Monkey test*/
-#define LV_USE_MONKEY 0
+#define LV_USE_MONKEY 0
/*1: Enable grid navigation*/
-#define LV_USE_GRIDNAV 0
+#define LV_USE_GRIDNAV 0
+
+/*1: Enable lv_obj fragment*/
+#define LV_USE_FRAGMENT 0
+
+/*1: Support using images as font in label or span widgets */
+#define LV_USE_IMGFONT 0
+
+/*1: Enable a published subscriber based messaging system */
+#define LV_USE_MSG 0
+
+/*1: Enable Pinyin input method*/
+/*Requires: lv_keyboard*/
+#define LV_USE_IME_PINYIN 0
+#if LV_USE_IME_PINYIN
+ /*1: Use default thesaurus*/
+ /*If you do not use the default thesaurus, be sure to use `lv_ime_pinyin` after setting the thesauruss*/
+ #define LV_IME_PINYIN_USE_DEFAULT_DICT 1
+ /*Set the maximum number of candidate panels that can be displayed*/
+ /*This needs to be adjusted according to the size of the screen*/
+ #define LV_IME_PINYIN_CAND_TEXT_NUM 6
+
+ /*Use 9 key input(k9)*/
+ #define LV_IME_PINYIN_USE_K9_MODE 1
+ #if LV_IME_PINYIN_USE_K9_MODE == 1
+ #define LV_IME_PINYIN_K9_CAND_TEXT_NUM 3
+ #endif // LV_IME_PINYIN_USE_K9_MODE
+#endif
/*==================
* EXAMPLES
@@ -669,28 +724,32 @@
====================*/
/*Show some widget. It might be required to increase `LV_MEM_SIZE` */
-#define LV_USE_DEMO_WIDGETS 0
+#define LV_USE_DEMO_WIDGETS 0
#if LV_USE_DEMO_WIDGETS
-#define LV_DEMO_WIDGETS_SLIDESHOW 0
+#define LV_DEMO_WIDGETS_SLIDESHOW 0
#endif
/*Demonstrate the usage of encoder and keyboard*/
-#define LV_USE_DEMO_KEYPAD_AND_ENCODER 0
+#define LV_USE_DEMO_KEYPAD_AND_ENCODER 0
/*Benchmark your system*/
-#define LV_USE_DEMO_BENCHMARK 0
+#define LV_USE_DEMO_BENCHMARK 0
+#if LV_USE_DEMO_BENCHMARK
+/*Use RGB565A8 images with 16 bit color depth instead of ARGB8565*/
+#define LV_DEMO_BENCHMARK_RGB565A8 0
+#endif
/*Stress test for LVGL*/
-#define LV_USE_DEMO_STRESS 0
+#define LV_USE_DEMO_STRESS 0
/*Music player demo*/
-#define LV_USE_DEMO_MUSIC 0
+#define LV_USE_DEMO_MUSIC 0
#if LV_USE_DEMO_MUSIC
-# define LV_DEMO_MUSIC_SQUARE 0
-# define LV_DEMO_MUSIC_LANDSCAPE 0
-# define LV_DEMO_MUSIC_ROUND 0
-# define LV_DEMO_MUSIC_LARGE 0
-# define LV_DEMO_MUSIC_AUTO_PLAY 0
+ #define LV_DEMO_MUSIC_SQUARE 0
+ #define LV_DEMO_MUSIC_LANDSCAPE 0
+ #define LV_DEMO_MUSIC_ROUND 0
+ #define LV_DEMO_MUSIC_LARGE 0
+ #define LV_DEMO_MUSIC_AUTO_PLAY 0
#endif
/*--END OF LV_CONF_H--*/
diff --git a/lvgl.h b/lvgl.h
index df96d213d..c0be411b2 100644
--- a/lvgl.h
+++ b/lvgl.h
@@ -14,8 +14,8 @@ extern "C" {
* CURRENT VERSION OF LVGL
***************************/
#define LVGL_VERSION_MAJOR 8
-#define LVGL_VERSION_MINOR 2
-#define LVGL_VERSION_PATCH 0
+#define LVGL_VERSION_MINOR 3
+#define LVGL_VERSION_PATCH 3
#define LVGL_VERSION_INFO ""
/*********************
@@ -67,11 +67,6 @@ extern "C" {
* EXTRAS
*----------------*/
#include "src/extra/lv_extra.h"
-#include "src/extra/widgets/lv_widgets.h"
-#include "src/extra/layouts/lv_layouts.h"
-#include "src/extra/themes/lv_themes.h"
-#include "src/extra/others/lv_others.h"
-#include "src/extra/libs/lv_libs.h"
/*********************
* DEFINES
diff --git a/lvgl.mk b/lvgl.mk
index a57c1d2bb..0ea126daa 100644
--- a/lvgl.mk
+++ b/lvgl.mk
@@ -1,9 +1,8 @@
include $(LVGL_DIR)/$(LVGL_DIR_NAME)/demos/lv_demos.mk
-include $(LVGL_DIR)/$(LVGL_DIR_NAME)/examples/examples.mk
-include $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/extra/extra.mk
+include $(LVGL_DIR)/$(LVGL_DIR_NAME)/examples/lv_examples.mk
include $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/core/lv_core.mk
include $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/lv_draw.mk
-include $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/sw/lv_draw_sw.mk
+include $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/extra/lv_extra.mk
include $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/font/lv_font.mk
include $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/hal/lv_hal.mk
include $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/misc/lv_misc.mk
diff --git a/scripts/changelog-template.hbs b/scripts/changelog-template.hbs
index 76fa1ff23..085e31c39 100644
--- a/scripts/changelog-template.hbs
+++ b/scripts/changelog-template.hbs
@@ -21,7 +21,7 @@
{{/commit-list}}
{{#commit-list fixes heading='' message='^arch' exclude='BREAKING CHANGE'}}
- {{commit.subject}} [`{{commit.shorthash}}`]({{commit.href}})
- {{/commit-list}}
+ {{/commit-list}}
### New Features
{{#commit-list merges heading='' message='^feat' exclude='BREAKING CHANGE'}}
@@ -33,8 +33,8 @@
{{#commit-list fixes heading='' message='^feat' exclude='BREAKING CHANGE'}}
- {{commit.subject}} [`{{commit.shorthash}}`]({{commit.href}})
{{/commit-list}}
-
-
+
+
### Performance
{{#commit-list merges heading='' message='^perf' exclude='BREAKING CHANGE'}}
- {{message}} [`{{id}}`]({{href}})
@@ -56,8 +56,8 @@
{{#commit-list fixes heading='' message='^fix' exclude='(^fix conflict|^fix warning|BREAKING CHANGE)'}}
- {{commit.subject}} [`{{commit.shorthash}}`]({{commit.href}})
{{/commit-list}}
-
-
+
+
### Examples
{{#commit-list merges heading='' message='^example'}}
- {{message}} [`{{id}}`]({{href}})
@@ -68,8 +68,8 @@
{{#commit-list fixes heading='' message='^example'}}
- {{commit.subject}} [`{{commit.shorthash}}`]({{commit.href}})
{{/commit-list}}
-
-
+
+
### Docs
{{#commit-list merges heading='' message='^docs'}}
- {{message}} [`{{id}}`]({{href}})
@@ -80,7 +80,7 @@
{{#commit-list fixes heading='' message='^docs'}}
- {{commit.subject}} [`{{commit.shorthash}}`]({{commit.href}})
{{/commit-list}}
-
+
### CI and tests
{{#commit-list merges heading='' message='(^ci|^test)'}}
- {{message}} [`{{id}}`]({{href}})
@@ -91,7 +91,7 @@
{{#commit-list fixes heading='' message='(^ci|^test)'}}
- {{commit.subject}} [`{{commit.shorthash}}`]({{commit.href}})
{{/commit-list}}
-
+
### Others
{{#commit-list merges heading='' exclude='(^fix|^feat|^perf|^docs|^example|^ci|^test)'}}
- {{message}} [`{{id}}`]({{href}})
@@ -102,5 +102,5 @@
{{#commit-list fixes heading='' exclude='(^fix|^feat|^perf|^docs|^example|^ci|^test)'}}
- {{commit.subject}} [`{{commit.shorthash}}`]({{commit.href}})
{{/commit-list}}
-
+
{{/each}}
diff --git a/scripts/changelog_gen.sh b/scripts/changelog_gen.sh
index 1a36e6d53..01d69ab0a 100755
--- a/scripts/changelog_gen.sh
+++ b/scripts/changelog_gen.sh
@@ -1,15 +1,15 @@
# Generate CHANGELOG_LAST.md from changes since the last version tag. (vx.y.z-dev tags are ignored)
# CHANGELOG_LAST.md can be edited manually if required and manually added to docs/CHANGELOG.md
#
-# Requirements:
+# Requirements:
# npm install -g auto-changelog
#
-# Usage:
+# Usage:
# changelog-gen
#
-# Example: if the latest verision is v5.6.7 the followings can be used for bugfix, minor or major versions:
-# changelog-gen v5.6.8
-# changelog-gen v5.7.0
-# changelog-gen v6.0.0
+# Example: if the latest verision is v5.6.7 the followings can be used for bugfix, minor or major versions:
+# changelog-gen v5.6.8
+# changelog-gen v5.7.0
+# changelog-gen v6.0.0
auto-changelog -t changelog-template.hbs -l false --latest-version $1 --unreleased-only --tag-pattern ^v[0-9]+.[0-9]+.[0-9]+$ -o CHANGELOG_LAST.md
diff --git a/scripts/code-format.cfg b/scripts/code-format.cfg
index d82d5c1b9..159ef46c8 100644
--- a/scripts/code-format.cfg
+++ b/scripts/code-format.cfg
@@ -19,10 +19,14 @@
--max-continuation-indent=120
--mode=c
--lineend=linux
---recursive
--suffix=none
--preserve-date
--formatted
+--ignore-exclude-errors
+--ignore-exclude-errors-x
+--exclude=assets
+--exclude=../src/core/lv_obj_style_gen.c
+--exclude=../src/core/lv_obj_style_gen.h
--exclude=../src/extra/libs/gif/gifdec.c
--exclude=../src/extra/libs/gif/gifdec.h
--exclude=../src/extra/libs/png/lodepng.c
@@ -32,4 +36,7 @@
--exclude=../src/extra/libs/sjpg/tjpgd.c
--exclude=../src/extra/libs/sjpg/tjpgd.h
--exclude=../src/extra/libs/sjpg/tjpgdcnf.h
+--exclude=../src/misc/lv_style_gen.c
+--exclude=../src/misc/lv_style_gen.h
--exclude=../src/lv_conf_internal.h
+--exclude=../tests/src/test_cases/_test_template.c
diff --git a/scripts/code-format.py b/scripts/code-format.py
index f7e65e7f4..fc126c8df 100755
--- a/scripts/code-format.py
+++ b/scripts/code-format.py
@@ -2,4 +2,14 @@
import os
-os.system('astyle --options=code-format.cfg "../src/*.c,*.h"')
+print("Formatting src")
+os.system('astyle --options=code-format.cfg --recursive "../src/*.c,*.h"')
+
+print("\nFormatting demos")
+os.system('astyle --options=code-format.cfg --recursive "../demos/*.c,*.h"')
+
+print("\nFormatting examples")
+os.system('astyle --options=code-format.cfg --recursive "../examples/*.c,*.h"')
+
+print("\nFormatting tests")
+os.system('astyle --options=code-format.cfg --recursive "../tests/src/test_cases/*.c"')
diff --git a/scripts/jpg_to_sjpg.py b/scripts/jpg_to_sjpg.py
index fc533f679..86fa38010 100755
--- a/scripts/jpg_to_sjpg.py
+++ b/scripts/jpg_to_sjpg.py
@@ -3,7 +3,7 @@
# Dependencies: (PYTHON-3)
##################################################################
SJPG_FILE_FORMAT_VERSION = "V1.00" #
-JPEG_SPLIT_HEIGHT = 16
+JPEG_SPLIT_HEIGHT = 16
##################################################################
import math, os, sys, time
from PIL import Image
diff --git a/scripts/lv_conf_internal_gen.py b/scripts/lv_conf_internal_gen.py
index 9a272a3ad..0347827af 100755
--- a/scripts/lv_conf_internal_gen.py
+++ b/scripts/lv_conf_internal_gen.py
@@ -62,6 +62,11 @@
#else
#include "../../lv_conf.h" /*Else assume lv_conf.h is next to the lvgl folder*/
#endif
+ #if !defined(LV_CONF_H) && !defined(LV_CONF_SUPPRESS_DEFINE_CHECK)
+ /* #include will sometimes silently fail when __has_include is used */
+ /* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80753 */
+ #pragma message("Possible failure to include lv_conf.h, please read the comment in this file if you get errors")
+ #endif
#endif
#ifdef CONFIG_LV_COLOR_DEPTH
@@ -87,19 +92,19 @@
if '/*--END OF LV_CONF_H--*/' in line: break
#Is there a #define in this line?
- r = re.search(r'^([\s]*)#[\s]*define[\s]+([^\s]+).*$', line) # \s means any white space character
+ r = re.search(r'^([\s]*)#[\s]*(undef|define)[\s]+([^\s]+).*$', line) # \s means any white space character
if r:
indent = r[1]
- name = r[2]
+ name = r[3]
name = re.sub('\(.*?\)', '', name, 1) #remove parentheses from macros. E.g. MY_FUNC(5) -> MY_FUNC
- name_and_value = re.sub('[\s]*#[\s]*define', '', line, 1)
+ line = re.sub('[\s]*', '', line, 1)
#If the value should be 1 (enabled) by default use a more complex structure for Kconfig checks because
#if a not defined CONFIG_... value should be interpreted as 0 and not the LVGL default
- is_one = re.search(r'[\s]*#[\s]*define[\s]*[A-Z0-9_]+[\s]+1([\s]*$|[\s]+)', line)
+ is_one = re.search(r'#[\s]*define[\s]*[A-Z0-9_]+[\s]+1([\s]*$|[\s]+)', line)
if is_one:
#1. Use the value if already set from lv_conf.h or anything else (i.e. do nothing)
#2. In Kconfig environment use the CONFIG_... value if set, else use 0
@@ -114,7 +119,7 @@
f'{indent} #define {name} 0\n'
f'{indent} #endif\n'
f'{indent} #else\n'
- f'{indent} #define{name_and_value}\n'
+ f'{indent} {line}\n'
f'{indent} #endif\n'
f'{indent}#endif\n'
)
@@ -128,7 +133,7 @@
f'{indent} #ifdef CONFIG_{name.upper()}\n'
f'{indent} #define {name} CONFIG_{name.upper()}\n'
f'{indent} #else\n'
- f'{indent} #define{name_and_value}\n'
+ f'{indent} {line}\n'
f'{indent} #endif\n'
f'{indent}#endif\n'
)
diff --git a/scripts/release/com.py b/scripts/release/com.py
index d03b19c5a..0cf8c6d77 100755
--- a/scripts/release/com.py
+++ b/scripts/release/com.py
@@ -66,7 +66,7 @@ def get_lvgl_version():
if m: ver[2] = m.group(1)
f.close()
-
+
print("Version found: " + ver_format(ver))
return ver
@@ -103,6 +103,6 @@ def update_version(ver):
define_set("./lvgl.h", "LVGL_VERSION_MINOR", str(ver[1]))
define_set("./lvgl.h", "LVGL_VERSION_PATCH", str(ver[2]))
define_set("./lvgl.h", "LVGL_VERSION_INFO", "\"" + ver[3] + "\"")
-
+
cmd("git commit -am 'Update versions to " + ver_str + "'")
-
+
diff --git a/scripts/release/patch.py b/scripts/release/patch.py
index 1100a38a3..9ccdc7351 100755
--- a/scripts/release/patch.py
+++ b/scripts/release/patch.py
@@ -3,8 +3,8 @@
# Applies a commit or commits on branch or branches
# USAGE:
# patch.py -c -b [-p] [-t]
-# - : list of commit SHAs to apply.
-# - : branches where the commit should be applied. * can be used as wildchar
+# - : list of commit SHAs to apply.
+# - : branches where the commit should be applied. * can be used as wildchar
# - p: push the changes to
# - t: increment version number and create a tag
@@ -20,7 +20,7 @@ def clone(repo):
com.cmd("git remote update origin --prune")
com.cmd("git pull origin --tags")
os.chdir("..")
-
+
# Get the list of related minor version branches
#clone("lvgl")
@@ -52,18 +52,18 @@ def clone(repo):
for c in commits:
h = c.split(" ")
com.cmd("git cherry-pick " + h[0])
-
+
ver = com.get_lvgl_version(br)
ver_new = ver.copy()
ver_new[2] = str(int(ver_new[2]) + 1)
print("Updating branch '" + br + "' from '" + com.ver_format(ver) + "' to '" + com.ver_format(ver_new) + "'")
com.update_version(ver_new)
com.cmd("git tag -a " + com.ver_format(ver_new) + "-m \"Release " + com.ver_format(ver_new) + "\"")
-
+
if push:
com.cmd("git push origin " + br + "--tags")
-
-com.cmd("git checkout master")
+
+com.cmd("git checkout master")
ver = com.get_lvgl_version("master")
ver = com.get_lvgl_version(br)
ver_new[2] = str(int(ver_new[2]) + 1)
diff --git a/scripts/release/release.py b/scripts/release/release.py
index 25ef0d504..7da8230bf 100644
--- a/scripts/release/release.py
+++ b/scripts/release/release.py
@@ -13,5 +13,5 @@
# - Update the simulator and lv_port projects
#
# USAGE:
-# release.py
+# release.py
# - : -minor or -major
diff --git a/scripts/style_api_gen.py b/scripts/style_api_gen.py
index 699fbe31b..5bcddede5 100755
--- a/scripts/style_api_gen.py
+++ b/scripts/style_api_gen.py
@@ -1,6 +1,8 @@
#!/usr/bin/env python3
-import sys, os, re
+import os
+import re
+import sys
props = [
{'section': 'Size and position', 'dsc':'Properties related to size, position, alignment and layout of the objects.' },
@@ -58,11 +60,19 @@
{'name': 'TRANSFORM_ZOOM',
'style_type': 'num', 'var_type': 'lv_coord_t', 'default':0, 'inherited': 0, 'layout': 1, 'ext_draw': 1,
- 'dsc': "Zoom image-like objects. Multiplied with the zoom set on the object. The value 256 (or `LV_IMG_ZOOM_NONE`) means normal size, 128 half size, 512 double size, and so on" },
+ 'dsc': "Zoom an objects. The value 256 (or `LV_IMG_ZOOM_NONE`) means normal size, 128 half size, 512 double size, and so on" },
{'name': 'TRANSFORM_ANGLE',
'style_type': 'num', 'var_type': 'lv_coord_t', 'default':0, 'inherited': 0, 'layout': 1, 'ext_draw': 1,
- 'dsc': "Rotate image-like objects. Added to the rotation set on the object. The value is interpreted in 0.1 degree units. E.g. 45 deg. = 450"},
+ 'dsc': "Rotate an objects. The value is interpreted in 0.1 degree units. E.g. 450 means 45 deg."},
+
+{'name': 'TRANSFORM_PIVOT_X',
+ 'style_type': 'num', 'var_type': 'lv_coord_t', 'default':0, 'inherited': 0, 'layout': 0, 'ext_draw': 0,
+ 'dsc': "Set the pivot point's X coordinate for transformations. Relative to the object's top left corner'"},
+
+{'name': 'TRANSFORM_PIVOT_Y',
+ 'style_type': 'num', 'var_type': 'lv_coord_t', 'default':0, 'inherited': 0, 'layout': 0, 'ext_draw': 0,
+ 'dsc': "Set the pivot point's Y coordinate for transformations. Relative to the object's top left corner'"},
{'section': 'Padding', 'dsc' : "Properties to describe spacing between the parent's sides and the children and among the children. Very similar to the padding properties in HTML."},
{'name': 'PAD_TOP',
@@ -91,23 +101,17 @@
{'section': 'Background', 'dsc':'Properties to describe the background color and image of the objects.' },
{'name': 'BG_COLOR',
- 'style_type': 'color', 'var_type': 'lv_color_t', 'default':'`0xffffff`', 'inherited': 0, 'layout': 0, 'ext_draw': 0,
+ 'style_type': 'color', 'var_type': 'lv_color_t', 'default':'`0xffffff`', 'inherited': 0, 'layout': 0, 'ext_draw': 0, 'filtered': 1,
'dsc': "Set the background color of the object."},
-{'name': 'BG_COLOR_FILTERED',
- 'style_type': 'color', 'var_type': 'lv_color_t' },
-
{'name': 'BG_OPA',
'style_type': 'num', 'var_type': 'lv_opa_t', 'default':'`LV_OPA_TRANSP`', 'inherited': 0, 'layout': 0, 'ext_draw': 0,
'dsc': "Set the opacity of the background. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means fully transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other values or LV_OPA_10, LV_OPA_20, etc means semi transparency."},
{'name': 'BG_GRAD_COLOR',
- 'style_type': 'color', 'var_type': 'lv_color_t', 'default':'`0x000000`', 'inherited': 0, 'layout': 0, 'ext_draw': 0,
+ 'style_type': 'color', 'var_type': 'lv_color_t', 'default':'`0x000000`', 'inherited': 0, 'layout': 0, 'ext_draw': 0, 'filtered': 1,
'dsc': "Set the gradient color of the background. Used only if `grad_dir` is not `LV_GRAD_DIR_NONE`"},
-{'name': 'BG_GRAD_COLOR_FILTERED',
- 'style_type': 'color', 'var_type': 'lv_color_t' },
-
{'name': 'BG_GRAD_DIR',
'style_type': 'num', 'var_type': 'lv_grad_dir_t', 'default':'`LV_GRAD_DIR_NONE`', 'inherited': 0, 'layout': 0, 'ext_draw': 0,
'dsc': "Set the direction of the gradient of the background. The possible values are `LV_GRAD_DIR_NONE/HOR/VER`."},
@@ -137,12 +141,9 @@
'dsc': "Set the opacity of the background image. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means fully transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other values or LV_OPA_10, LV_OPA_20, etc means semi transparency."},
{'name': 'BG_IMG_RECOLOR',
- 'style_type': 'color', 'var_type': 'lv_color_t', 'default':'`0x000000`', 'inherited': 0, 'layout': 0, 'ext_draw': 0,
+ 'style_type': 'color', 'var_type': 'lv_color_t', 'default':'`0x000000`', 'inherited': 0, 'layout': 0, 'ext_draw': 0, 'filtered': 1,
'dsc': "Set a color to mix to the background image."},
-{'name': 'BG_IMG_RECOLOR_FILTERED',
- 'style_type': 'color', 'var_type': 'lv_color_t'},
-
{'name': 'BG_IMG_RECOLOR_OPA',
'style_type': 'num', 'var_type': 'lv_opa_t', 'default':'`LV_OPA_TRANSP`', 'inherited': 0, 'layout': 0, 'ext_draw': 0,
'dsc': "Set the intensity of background image recoloring. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means no mixing, 255, `LV_OPA_100` or `LV_OPA_COVER` means full recoloring, other values or LV_OPA_10, LV_OPA_20, etc are interpreted proportionally."},
@@ -153,12 +154,9 @@
{'section': 'Border', 'dsc':'Properties to describe the borders' },
{'name': 'BORDER_COLOR',
- 'style_type': 'color', 'var_type': 'lv_color_t', 'default':'`0x000000`', 'inherited': 0, 'layout': 0, 'ext_draw': 0,
+ 'style_type': 'color', 'var_type': 'lv_color_t', 'default':'`0x000000`', 'inherited': 0, 'layout': 0, 'ext_draw': 0, 'filtered': 1,
'dsc': "Set the color of the border"},
-{'name': 'BORDER_COLOR_FILTERED',
- 'style_type': 'color', 'var_type': 'lv_color_t' },
-
{'name': 'BORDER_OPA',
'style_type': 'num', 'var_type': 'lv_opa_t' , 'default':'`LV_OPA_COVER`', 'inherited': 0, 'layout': 0, 'ext_draw': 0,
'dsc': "Set the opacity of the border. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means fully transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other values or LV_OPA_10, LV_OPA_20, etc means semi transparency."},
@@ -181,12 +179,9 @@
'dsc': "Set the width of the outline in pixels. "},
{'name': 'OUTLINE_COLOR',
- 'style_type': 'color', 'var_type': 'lv_color_t' , 'default':'`0x000000`', 'inherited': 0, 'layout': 0, 'ext_draw': 0,
+ 'style_type': 'color', 'var_type': 'lv_color_t' , 'default':'`0x000000`', 'inherited': 0, 'layout': 0, 'ext_draw': 0, 'filtered': 1,
'dsc': "Set the color of the outline."},
-{'name': 'OUTLINE_COLOR_FILTERED',
-'style_type': 'color', 'var_type': 'lv_color_t'},
-
{'name': 'OUTLINE_OPA',
'style_type': 'num', 'var_type': 'lv_opa_t' , 'default':'`LV_OPA_COVER`', 'inherited': 0, 'layout': 0, 'ext_draw': 1,
'dsc': "Set the opacity of the outline. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means fully transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other values or LV_OPA_10, LV_OPA_20, etc means semi transparency."},
@@ -213,12 +208,9 @@
'dsc': "Make the shadow calculation to use a larger or smaller rectangle as base. The value can be in pixel to make the area larger/smaller"},
{'name': 'SHADOW_COLOR',
- 'style_type': 'color', 'var_type': 'lv_color_t' , 'default':'`0x000000`', 'inherited': 0, 'layout': 0, 'ext_draw': 0,
+ 'style_type': 'color', 'var_type': 'lv_color_t' , 'default':'`0x000000`', 'inherited': 0, 'layout': 0, 'ext_draw': 0, 'filtered': 1,
'dsc': "Set the color of the shadow"},
-{'name': 'SHADOW_COLOR_FILTERED',
- 'style_type': 'color', 'var_type': 'lv_color_t'},
-
{'name': 'SHADOW_OPA',
'style_type': 'num', 'var_type': 'lv_opa_t' , 'default':'`LV_OPA_COVER`', 'inherited': 0, 'layout': 0, 'ext_draw': 1,
'dsc': "Set the opacity of the shadow. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means fully transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other values or LV_OPA_10, LV_OPA_20, etc means semi transparency."},
@@ -229,12 +221,9 @@
'dsc': "Set the opacity of an image. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means fully transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other values or LV_OPA_10, LV_OPA_20, etc means semi transparency."},
{'name': 'IMG_RECOLOR',
- 'style_type': 'color', 'var_type': 'lv_color_t', 'default':'`0x000000`', 'inherited': 0, 'layout': 0, 'ext_draw': 0,
+ 'style_type': 'color', 'var_type': 'lv_color_t', 'default':'`0x000000`', 'inherited': 0, 'layout': 0, 'ext_draw': 0, 'filtered': 1,
'dsc': "Set color to mixt to the image."},
-{'name': 'IMG_RECOLOR_FILTERED',
- 'style_type': 'color', 'var_type': 'lv_color_t'},
-
{'name': 'IMG_RECOLOR_OPA',
'style_type': 'num', 'var_type': 'lv_opa_t' , 'default':0, 'inherited': 0, 'layout': 0, 'ext_draw': 0,
'dsc': "Set the intensity of the color mixing. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means fully transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other values or LV_OPA_10, LV_OPA_20, etc means semi transparency."},
@@ -257,12 +246,9 @@
'dsc': "Make the end points of the lines rounded. `true`: rounded, `false`: perpendicular line ending "},
{'name': 'LINE_COLOR',
- 'style_type': 'color', 'var_type': 'lv_color_t' , 'default':'`0x000000`', 'inherited': 0, 'layout': 0, 'ext_draw': 0,
+ 'style_type': 'color', 'var_type': 'lv_color_t' , 'default':'`0x000000`', 'inherited': 0, 'layout': 0, 'ext_draw': 0, 'filtered': 1,
'dsc': "Set the color fo the lines."},
-{'name': 'LINE_COLOR_FILTERED',
- 'style_type': 'color', 'var_type': 'lv_color_t'},
-
{'name': 'LINE_OPA',
'style_type': 'num', 'var_type': 'lv_opa_t' , 'default':'`LV_OPA_COVER`', 'inherited': 0, 'layout': 0, 'ext_draw': 0,
'dsc': "Set the opacity of the lines."},
@@ -277,12 +263,9 @@
'dsc': "Make the end points of the arcs rounded. `true`: rounded, `false`: perpendicular line ending "},
{'name': 'ARC_COLOR',
- 'style_type': 'color', 'var_type': 'lv_color_t', 'default':'`0x000000`', 'inherited': 0, 'layout': 0, 'ext_draw': 0,
+ 'style_type': 'color', 'var_type': 'lv_color_t', 'default':'`0x000000`', 'inherited': 0, 'layout': 0, 'ext_draw': 0, 'filtered': 1,
'dsc': "Set the color of the arc."},
-{'name': 'ARC_COLOR_FILTERED',
- 'style_type': 'color', 'var_type': 'lv_color_t' },
-
{'name': 'ARC_OPA',
'style_type': 'num', 'var_type': 'lv_opa_t' , 'default':'`LV_OPA_COVER`', 'inherited': 0, 'layout': 0, 'ext_draw': 0,
'dsc': "Set the opacity of the arcs."},
@@ -293,12 +276,9 @@
{'section': 'Text', 'dsc':'Properties to describe the properties of text. All these properties are inherited.' },
{'name': 'TEXT_COLOR',
-'style_type': 'color', 'var_type': 'lv_color_t', 'default':'`0x000000`', 'inherited': 1, 'layout': 0, 'ext_draw': 0,
+'style_type': 'color', 'var_type': 'lv_color_t', 'default':'`0x000000`', 'inherited': 1, 'layout': 0, 'ext_draw': 0, 'filtered': 1,
'dsc': "Sets the color of the text."},
-{'name': 'TEXT_COLOR_FILTERED',
- 'style_type': 'color', 'var_type': 'lv_color_t'},
-
{'name': 'TEXT_OPA',
'style_type': 'num', 'var_type': 'lv_opa_t', 'default':'`LV_OPA_COVER`', 'inherited': 1, 'layout': 0, 'ext_draw': 0,
'dsc': "Set the opacity of the text. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means fully transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other values or LV_OPA_10, LV_OPA_20, etc means semi transparency."},
@@ -344,6 +324,10 @@
'style_type': 'num', 'var_type': 'lv_opa_t' , 'default':'`LV_OPA_TRANSP`', 'inherited': 0, 'layout': 0, 'ext_draw': 0,
'dsc': "The intensity of mixing of color filter."},
+ {'name': 'ANIM',
+ 'style_type': 'ptr', 'var_type': 'const lv_anim_t *', 'default':'`NULL`', 'inherited': 0, 'layout': 0, 'ext_draw': 0,
+ 'dsc': "The animation template for the object's animation. Should be a pointer to `lv_anim_t`. The animation parameters are widget specific, e.g. animation time could be the E.g. blink time of the cursor on the text area or scroll time of a roller. See the widgets' documentation to learn more."},
+
{'name': 'ANIM_TIME',
'style_type': 'num', 'var_type': 'uint32_t' , 'default':0, 'inherited': 0, 'layout': 0, 'ext_draw': 0,
'dsc': "The animation time in milliseconds. Its meaning is widget specific. E.g. blink time of the cursor on the text area or scroll time of a roller. See the widgets' documentation to learn more."},
@@ -388,6 +372,15 @@ def obj_style_get(p):
print("}")
print("")
+ if 'filtered' in p and p['filtered']:
+ print("static inline " + p['var_type'] + " lv_obj_get_style_" + p['name'].lower() +"_filtered(const struct _lv_obj_t * obj, uint32_t part)")
+ print("{")
+ print(" lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_" + p['name'] + "));")
+ print(" return " + cast + "v." + p['style_type'] + ";")
+ print("}")
+ print("")
+
+
def style_set_cast(style_type):
cast = ""
diff --git a/src/core/lv_disp.c b/src/core/lv_disp.c
index 2806c4e7b..a1022b56c 100644
--- a/src/core/lv_disp.c
+++ b/src/core/lv_disp.c
@@ -21,12 +21,13 @@
/**********************
* STATIC PROTOTYPES
**********************/
-
+static void scr_load_internal(lv_obj_t * scr);
static void scr_load_anim_start(lv_anim_t * a);
static void opa_scale_anim(void * obj, int32_t v);
static void set_x_anim(void * obj, int32_t v);
static void set_y_anim(void * obj, int32_t v);
static void scr_anim_ready(lv_anim_t * a);
+static bool is_out_anim(lv_scr_load_anim_t a);
/**********************
* STATIC VARIABLES
@@ -80,20 +81,7 @@ lv_obj_t * lv_disp_get_scr_prev(lv_disp_t * disp)
*/
void lv_disp_load_scr(lv_obj_t * scr)
{
- lv_disp_t * d = lv_obj_get_disp(scr);
- if(!d) return; /*Shouldn't happen, just to be sure*/
-
- lv_obj_t * old_scr = d->act_scr;
-
- if(d->act_scr) lv_event_send(old_scr, LV_EVENT_SCREEN_UNLOAD_START, NULL);
- if(d->act_scr) lv_event_send(scr, LV_EVENT_SCREEN_LOAD_START, NULL);
-
- d->act_scr = scr;
-
- if(d->act_scr) lv_event_send(scr, LV_EVENT_SCREEN_LOADED, NULL);
- if(d->act_scr) lv_event_send(old_scr, LV_EVENT_SCREEN_UNLOADED, NULL);
-
- lv_obj_invalidate(scr);
+ lv_scr_load_anim(scr, LV_SCR_LOAD_ANIM_NONE, 0, 0, false);
}
/**
@@ -135,7 +123,12 @@ lv_obj_t * lv_disp_get_layer_sys(lv_disp_t * disp)
*/
void lv_disp_set_theme(lv_disp_t * disp, lv_theme_t * th)
{
- if(disp == NULL) disp = lv_disp_get_default();
+ if(!disp) disp = lv_disp_get_default();
+ if(!disp) {
+ LV_LOG_WARN("no display registered");
+ return;
+ }
+
disp->theme = th;
if(disp->screen_cnt == 3 &&
@@ -220,7 +213,7 @@ void lv_disp_set_bg_opa(lv_disp_t * disp, lv_opa_t opa)
/**
* Switch screen with animation
* @param scr pointer to the new screen to load
- * @param anim_type type of the animation from `lv_scr_load_anim_t`. E.g. `LV_SCR_LOAD_ANIM_MOVE_LEFT`
+ * @param anim_type type of the animation from `lv_scr_load_anim_t`, e.g. `LV_SCR_LOAD_ANIM_MOVE_LEFT`
* @param time time of the animation
* @param delay delay before the transition
* @param auto_del true: automatically delete the old screen
@@ -234,7 +227,7 @@ void lv_scr_load_anim(lv_obj_t * new_scr, lv_scr_load_anim_t anim_type, uint32_t
/*If an other screen load animation is in progress
*make target screen loaded immediately. */
if(d->scr_to_load && act_scr != d->scr_to_load) {
- lv_disp_load_scr(d->scr_to_load);
+ scr_load_internal(d->scr_to_load);
lv_anim_del(d->scr_to_load, NULL);
lv_obj_set_pos(d->scr_to_load, 0, 0);
lv_obj_remove_local_style_prop(d->scr_to_load, LV_STYLE_OPA, 0);
@@ -252,6 +245,7 @@ void lv_scr_load_anim(lv_obj_t * new_scr, lv_scr_load_anim_t anim_type, uint32_t
d->prev_scr = NULL;
}
+ d->draw_prev_over_act = is_out_anim(anim_type);
d->del_prev = auto_del;
/*Be sure there is no other animation on the screens*/
@@ -264,6 +258,13 @@ void lv_scr_load_anim(lv_obj_t * new_scr, lv_scr_load_anim_t anim_type, uint32_t
lv_obj_remove_local_style_prop(new_scr, LV_STYLE_OPA, 0);
lv_obj_remove_local_style_prop(lv_scr_act(), LV_STYLE_OPA, 0);
+
+ /*Shortcut for immediate load*/
+ if(time == 0 && delay == 0) {
+ scr_load_internal(new_scr);
+ return;
+ }
+
lv_anim_t a_new;
lv_anim_init(&a_new);
lv_anim_set_var(&a_new, new_scr);
@@ -328,18 +329,36 @@ void lv_scr_load_anim(lv_obj_t * new_scr, lv_scr_load_anim_t anim_type, uint32_t
lv_anim_set_exec_cb(&a_old, set_y_anim);
lv_anim_set_values(&a_old, 0, lv_disp_get_ver_res(d));
break;
-
- case LV_SCR_LOAD_ANIM_FADE_ON:
+ case LV_SCR_LOAD_ANIM_FADE_IN:
lv_anim_set_exec_cb(&a_new, opa_scale_anim);
lv_anim_set_values(&a_new, LV_OPA_TRANSP, LV_OPA_COVER);
break;
+ case LV_SCR_LOAD_ANIM_FADE_OUT:
+ lv_anim_set_exec_cb(&a_old, opa_scale_anim);
+ lv_anim_set_values(&a_old, LV_OPA_COVER, LV_OPA_TRANSP);
+ break;
+ case LV_SCR_LOAD_ANIM_OUT_LEFT:
+ lv_anim_set_exec_cb(&a_old, set_x_anim);
+ lv_anim_set_values(&a_old, 0, -lv_disp_get_hor_res(d));
+ break;
+ case LV_SCR_LOAD_ANIM_OUT_RIGHT:
+ lv_anim_set_exec_cb(&a_old, set_x_anim);
+ lv_anim_set_values(&a_old, 0, lv_disp_get_hor_res(d));
+ break;
+ case LV_SCR_LOAD_ANIM_OUT_TOP:
+ lv_anim_set_exec_cb(&a_old, set_y_anim);
+ lv_anim_set_values(&a_old, 0, -lv_disp_get_ver_res(d));
+ break;
+ case LV_SCR_LOAD_ANIM_OUT_BOTTOM:
+ lv_anim_set_exec_cb(&a_old, set_y_anim);
+ lv_anim_set_values(&a_old, 0, lv_disp_get_ver_res(d));
+ break;
}
lv_event_send(act_scr, LV_EVENT_SCREEN_UNLOAD_START, NULL);
lv_anim_start(&a_new);
lv_anim_start(&a_old);
-
}
/**
@@ -394,6 +413,38 @@ void lv_disp_clean_dcache(lv_disp_t * disp)
disp->driver->clean_dcache_cb(disp->driver);
}
+/**
+ * Temporarily enable and disable the invalidation of the display.
+ * @param disp pointer to a display (NULL to use the default display)
+ * @param en true: enable invalidation; false: invalidation
+ */
+void lv_disp_enable_invalidation(lv_disp_t * disp, bool en)
+{
+ if(!disp) disp = lv_disp_get_default();
+ if(!disp) {
+ LV_LOG_WARN("no display registered");
+ return;
+ }
+
+ disp->inv_en_cnt += en ? 1 : -1;
+}
+
+/**
+ * Get display invalidation is enabled.
+ * @param disp pointer to a display (NULL to use the default display)
+ * @return return true if invalidation is enabled
+ */
+bool lv_disp_is_invalidation_enabled(lv_disp_t * disp)
+{
+ if(!disp) disp = lv_disp_get_default();
+ if(!disp) {
+ LV_LOG_WARN("no display registered");
+ return false;
+ }
+
+ return (disp->inv_en_cnt > 0);
+}
+
/**
* Get a pointer to the screen refresher timer to
* modify its parameters with `lv_timer_...` functions.
@@ -415,6 +466,24 @@ lv_timer_t * _lv_disp_get_refr_timer(lv_disp_t * disp)
* STATIC FUNCTIONS
**********************/
+static void scr_load_internal(lv_obj_t * scr)
+{
+ lv_disp_t * d = lv_obj_get_disp(scr);
+ if(!d) return; /*Shouldn't happen, just to be sure*/
+
+ lv_obj_t * old_scr = d->act_scr;
+
+ if(d->act_scr) lv_event_send(old_scr, LV_EVENT_SCREEN_UNLOAD_START, NULL);
+ if(d->act_scr) lv_event_send(scr, LV_EVENT_SCREEN_LOAD_START, NULL);
+
+ d->act_scr = scr;
+
+ if(d->act_scr) lv_event_send(scr, LV_EVENT_SCREEN_LOADED, NULL);
+ if(d->act_scr) lv_event_send(old_scr, LV_EVENT_SCREEN_UNLOADED, NULL);
+
+ lv_obj_invalidate(scr);
+}
+
static void scr_load_anim_start(lv_anim_t * a)
{
lv_disp_t * d = lv_obj_get_disp(a->var);
@@ -449,6 +518,17 @@ static void scr_anim_ready(lv_anim_t * a)
if(d->prev_scr && d->del_prev) lv_obj_del(d->prev_scr);
d->prev_scr = NULL;
+ d->draw_prev_over_act = false;
d->scr_to_load = NULL;
lv_obj_remove_local_style_prop(a->var, LV_STYLE_OPA, 0);
+ lv_obj_invalidate(d->act_scr);
+}
+
+static bool is_out_anim(lv_scr_load_anim_t anim_type)
+{
+ return anim_type == LV_SCR_LOAD_ANIM_FADE_OUT ||
+ anim_type == LV_SCR_LOAD_ANIM_OUT_LEFT ||
+ anim_type == LV_SCR_LOAD_ANIM_OUT_RIGHT ||
+ anim_type == LV_SCR_LOAD_ANIM_OUT_TOP ||
+ anim_type == LV_SCR_LOAD_ANIM_OUT_BOTTOM;
}
diff --git a/src/core/lv_disp.h b/src/core/lv_disp.h
index 01766b345..7854cb7f2 100644
--- a/src/core/lv_disp.h
+++ b/src/core/lv_disp.h
@@ -35,7 +35,13 @@ typedef enum {
LV_SCR_LOAD_ANIM_MOVE_RIGHT,
LV_SCR_LOAD_ANIM_MOVE_TOP,
LV_SCR_LOAD_ANIM_MOVE_BOTTOM,
- LV_SCR_LOAD_ANIM_FADE_ON,
+ LV_SCR_LOAD_ANIM_FADE_IN,
+ LV_SCR_LOAD_ANIM_FADE_ON = LV_SCR_LOAD_ANIM_FADE_IN, /*For backward compatibility*/
+ LV_SCR_LOAD_ANIM_FADE_OUT,
+ LV_SCR_LOAD_ANIM_OUT_LEFT,
+ LV_SCR_LOAD_ANIM_OUT_RIGHT,
+ LV_SCR_LOAD_ANIM_OUT_TOP,
+ LV_SCR_LOAD_ANIM_OUT_BOTTOM,
} lv_scr_load_anim_t;
/**********************
@@ -116,7 +122,7 @@ void lv_disp_set_bg_opa(lv_disp_t * disp, lv_opa_t opa);
/**
* Switch screen with animation
* @param scr pointer to the new screen to load
- * @param anim_type type of the animation from `lv_scr_load_anim_t`. E.g. `LV_SCR_LOAD_ANIM_MOVE_LEFT`
+ * @param anim_type type of the animation from `lv_scr_load_anim_t`, e.g. `LV_SCR_LOAD_ANIM_MOVE_LEFT`
* @param time time of the animation
* @param delay delay before the transition
* @param auto_del true: automatically delete the old screen
@@ -142,6 +148,20 @@ void lv_disp_trig_activity(lv_disp_t * disp);
*/
void lv_disp_clean_dcache(lv_disp_t * disp);
+/**
+ * Temporarily enable and disable the invalidation of the display.
+ * @param disp pointer to a display (NULL to use the default display)
+ * @param en true: enable invalidation; false: invalidation
+ */
+void lv_disp_enable_invalidation(lv_disp_t * disp, bool en);
+
+/**
+ * Get display invalidation is enabled.
+ * @param disp pointer to a display (NULL to use the default display)
+ * @return return true if invalidation is enabled
+ */
+bool lv_disp_is_invalidation_enabled(lv_disp_t * disp);
+
/**
* Get a pointer to the screen refresher timer to
* modify its parameters with `lv_timer_...` functions.
diff --git a/src/core/lv_event.c b/src/core/lv_event.c
index 143ff34b8..f53ceac1d 100644
--- a/src/core/lv_event.c
+++ b/src/core/lv_event.c
@@ -208,7 +208,7 @@ bool lv_obj_remove_event_cb_with_user_data(lv_obj_t * obj, lv_event_cb_t event_c
int32_t i = 0;
for(i = 0; i < obj->spec_attr->event_dsc_cnt; i++) {
- if((event_cb == NULL || obj->spec_attr->event_dsc[i].cb) &&
+ if((event_cb == NULL || obj->spec_attr->event_dsc[i].cb == event_cb) &&
obj->spec_attr->event_dsc[i].user_data == user_data) {
/*Shift the remaining event handlers forward*/
for(; i < (obj->spec_attr->event_dsc_cnt - 1); i++) {
@@ -254,7 +254,7 @@ bool lv_obj_remove_event_dsc(lv_obj_t * obj, struct _lv_event_dsc_t * event_dsc)
void * lv_obj_get_event_user_data(struct _lv_obj_t * obj, lv_event_cb_t event_cb)
{
LV_ASSERT_OBJ(obj, MY_CLASS);
- if(obj->spec_attr == NULL) return false;
+ if(obj->spec_attr == NULL) return NULL;
int32_t i = 0;
for(i = 0; i < obj->spec_attr->event_dsc_cnt; i++) {
@@ -436,7 +436,7 @@ static lv_res_t event_send_core(lv_event_t * e)
}
lv_res_t res = LV_RES_OK;
- lv_event_dsc_t * event_dsc = res == LV_RES_INV ? NULL : lv_obj_get_event_dsc(e->current_target, 0);
+ lv_event_dsc_t * event_dsc = lv_obj_get_event_dsc(e->current_target, 0);
uint32_t i = 0;
while(event_dsc && res == LV_RES_OK) {
diff --git a/src/core/lv_event.h b/src/core/lv_event.h
index 038570b72..d5a9eb6ba 100644
--- a/src/core/lv_event.h
+++ b/src/core/lv_event.h
@@ -41,7 +41,7 @@ typedef enum {
LV_EVENT_LONG_PRESSED_REPEAT, /**< Called after `long_press_time` in every `long_press_repeat_time` ms. Not called if scrolled.*/
LV_EVENT_CLICKED, /**< Called on release if not scrolled (regardless to long press)*/
LV_EVENT_RELEASED, /**< Called in every cases when the object has been released*/
- LV_EVENT_SCROLL_BEGIN, /**< Scrolling begins*/
+ LV_EVENT_SCROLL_BEGIN, /**< Scrolling begins. The event parameter is a pointer to the animation of the scroll. Can be modified*/
LV_EVENT_SCROLL_END, /**< Scrolling ends*/
LV_EVENT_SCROLL, /**< Scrolling*/
LV_EVENT_GESTURE, /**< A gesture is detected. Get the gesture with `lv_indev_get_gesture_dir(lv_indev_get_act());` */
diff --git a/src/core/lv_group.c b/src/core/lv_group.c
index 3e13b0b79..2c4fa93e9 100644
--- a/src/core/lv_group.c
+++ b/src/core/lv_group.c
@@ -24,7 +24,7 @@
/**********************
* STATIC PROTOTYPES
**********************/
-static void focus_next_core(lv_group_t * group, void * (*begin)(const lv_ll_t *),
+static bool focus_next_core(lv_group_t * group, void * (*begin)(const lv_ll_t *),
void * (*move)(const lv_ll_t *, const void *));
static void lv_group_refocus(lv_group_t * g);
static lv_indev_t * get_indev(const lv_group_t * g);
@@ -57,6 +57,7 @@ lv_group_t * lv_group_create(void)
group->obj_focus = NULL;
group->frozen = 0;
group->focus_cb = NULL;
+ group->edge_cb = NULL;
group->editing = 0;
group->refocus_policy = LV_GROUP_REFOCUS_POLICY_PREV;
group->wrap = 1;
@@ -112,6 +113,9 @@ void lv_group_add_obj(lv_group_t * group, lv_obj_t * obj)
LV_LOG_TRACE("begin");
+ /*Be sure the object is removed from its current group*/
+ lv_group_remove_obj(obj);
+
/*Do not add the object twice*/
lv_obj_t ** obj_i;
_LV_LL_READ(&group->obj_ll, obj_i) {
@@ -261,12 +265,20 @@ void lv_group_focus_obj(lv_obj_t * obj)
void lv_group_focus_next(lv_group_t * group)
{
- focus_next_core(group, _lv_ll_get_head, _lv_ll_get_next);
+ bool focus_changed = focus_next_core(group, _lv_ll_get_head, _lv_ll_get_next);
+ if(group->edge_cb) {
+ if(!focus_changed)
+ group->edge_cb(group, true);
+ }
}
void lv_group_focus_prev(lv_group_t * group)
{
- focus_next_core(group, _lv_ll_get_tail, _lv_ll_get_prev);
+ bool focus_changed = focus_next_core(group, _lv_ll_get_tail, _lv_ll_get_prev);
+ if(group->edge_cb) {
+ if(!focus_changed)
+ group->edge_cb(group, false);
+ }
}
void lv_group_focus_freeze(lv_group_t * group, bool en)
@@ -279,6 +291,9 @@ lv_res_t lv_group_send_data(lv_group_t * group, uint32_t c)
{
lv_obj_t * act = lv_group_get_focused(group);
if(act == NULL) return LV_RES_OK;
+
+ if(lv_obj_has_state(act, LV_STATE_DISABLED)) return LV_RES_OK;
+
return lv_event_send(act, LV_EVENT_KEY, &c);
}
@@ -287,6 +302,11 @@ void lv_group_set_focus_cb(lv_group_t * group, lv_group_focus_cb_t focus_cb)
group->focus_cb = focus_cb;
}
+void lv_group_set_edge_cb(lv_group_t * group, lv_group_edge_cb_t edge_cb)
+{
+ group->edge_cb = edge_cb;
+}
+
void lv_group_set_editing(lv_group_t * group, bool edit)
{
if(group == NULL) return;
@@ -329,6 +349,12 @@ lv_group_focus_cb_t lv_group_get_focus_cb(const lv_group_t * group)
return group->focus_cb;
}
+lv_group_edge_cb_t lv_group_get_edge_cb(const lv_group_t * group)
+{
+ if(!group) return NULL;
+ return group->edge_cb;
+}
+
bool lv_group_get_editing(const lv_group_t * group)
{
if(!group) return false;
@@ -363,10 +389,11 @@ static void lv_group_refocus(lv_group_t * g)
g->wrap = temp_wrap;
}
-static void focus_next_core(lv_group_t * group, void * (*begin)(const lv_ll_t *),
+static bool focus_next_core(lv_group_t * group, void * (*begin)(const lv_ll_t *),
void * (*move)(const lv_ll_t *, const void *))
{
- if(group->frozen) return;
+ bool focus_changed = false;
+ if(group->frozen) return focus_changed;
lv_obj_t ** obj_next = group->obj_focus;
lv_obj_t ** obj_sentinel = NULL;
@@ -376,27 +403,27 @@ static void focus_next_core(lv_group_t * group, void * (*begin)(const lv_ll_t *)
for(;;) {
if(obj_next == NULL) {
if(group->wrap || obj_sentinel == NULL) {
- if(!can_begin) return;
+ if(!can_begin) return focus_changed;
obj_next = begin(&group->obj_ll);
can_move = false;
can_begin = false;
}
else {
/*Currently focused object is the last/first in the group, keep it that way*/
- return;
+ return focus_changed;
}
}
if(obj_sentinel == NULL) {
obj_sentinel = obj_next;
- if(obj_sentinel == NULL) return; /*Group is empty*/
+ if(obj_sentinel == NULL) return focus_changed; /*Group is empty*/
}
if(can_move) {
obj_next = move(&group->obj_ll, obj_next);
/*Give up if we walked the entire list and haven't found another visible object*/
- if(obj_next == obj_sentinel) return;
+ if(obj_next == obj_sentinel) return focus_changed;
}
can_move = true;
@@ -418,22 +445,24 @@ static void focus_next_core(lv_group_t * group, void * (*begin)(const lv_ll_t *)
break;
}
- if(obj_next == group->obj_focus) return; /*There's only one visible object and it's already focused*/
+ if(obj_next == group->obj_focus) return focus_changed; /*There's only one visible object and it's already focused*/
if(group->obj_focus) {
lv_res_t res = lv_event_send(*group->obj_focus, LV_EVENT_DEFOCUSED, get_indev(group));
- if(res != LV_RES_OK) return;
+ if(res != LV_RES_OK) return focus_changed;
lv_obj_invalidate(*group->obj_focus);
}
group->obj_focus = obj_next;
lv_res_t res = lv_event_send(*group->obj_focus, LV_EVENT_FOCUSED, get_indev(group));
- if(res != LV_RES_OK) return;
+ if(res != LV_RES_OK) return focus_changed;
lv_obj_invalidate(*group->obj_focus);
if(group->focus_cb) group->focus_cb(group);
+ focus_changed = true;
+ return focus_changed;
}
/**
diff --git a/src/core/lv_group.h b/src/core/lv_group.h
index ecf88df6b..091059730 100644
--- a/src/core/lv_group.h
+++ b/src/core/lv_group.h
@@ -50,6 +50,7 @@ struct _lv_obj_t;
struct _lv_group_t;
typedef void (*lv_group_focus_cb_t)(struct _lv_group_t *);
+typedef void (*lv_group_edge_cb_t)(struct _lv_group_t *, bool);
/**
* Groups can be used to logically hold objects so that they can be individually focused.
@@ -60,6 +61,10 @@ typedef struct _lv_group_t {
struct _lv_obj_t ** obj_focus; /**< The object in focus*/
lv_group_focus_cb_t focus_cb; /**< A function to call when a new object is focused (optional)*/
+ lv_group_edge_cb_t edge_cb; /**< A function to call when an edge is reached, no more focus
+ targets are available in this direction (to allow edge feedback
+ like a sound or a scroll bounce) */
+
#if LV_USE_USER_DATA
void * user_data;
#endif
@@ -178,6 +183,14 @@ lv_res_t lv_group_send_data(lv_group_t * group, uint32_t c);
*/
void lv_group_set_focus_cb(lv_group_t * group, lv_group_focus_cb_t focus_cb);
+/**
+ * Set a function for a group which will be called when a focus edge is reached
+ * @param group pointer to a group
+ * @param edge_cb the call back function or NULL if unused
+ */
+void lv_group_set_edge_cb(lv_group_t * group, lv_group_edge_cb_t edge_cb);
+
+
/**
* Set whether the next or previous item in a group is focused if the currently focused obj is
* deleted.
@@ -214,6 +227,13 @@ struct _lv_obj_t * lv_group_get_focused(const lv_group_t * group);
*/
lv_group_focus_cb_t lv_group_get_focus_cb(const lv_group_t * group);
+/**
+ * Get the edge callback function of a group
+ * @param group pointer to a group
+ * @return the call back function or NULL if not set
+ */
+lv_group_edge_cb_t lv_group_get_edge_cb(const lv_group_t * group);
+
/**
* Get the current mode (edit or navigate).
* @param group pointer to group
diff --git a/src/core/lv_indev.c b/src/core/lv_indev.c
index 079aa943c..ab1265ec8 100644
--- a/src/core/lv_indev.c
+++ b/src/core/lv_indev.c
@@ -75,14 +75,15 @@ void lv_indev_read_timer_cb(lv_timer_t * timer)
/*Handle reset query before processing the point*/
indev_proc_reset_query_handler(indev_act);
- if(indev_act->proc.disabled) return;
+ if(indev_act->proc.disabled ||
+ indev_act->driver->disp->prev_scr != NULL) return; /*Input disabled or screen animation active*/
bool continue_reading;
do {
/*Read the data*/
_lv_indev_read(indev_act, &data);
continue_reading = data.continue_reading;
- /*The active object might deleted even in the read function*/
+ /*The active object might be deleted even in the read function*/
indev_proc_reset_query_handler(indev_act);
indev_obj_act = NULL;
@@ -121,9 +122,18 @@ void lv_indev_read_timer_cb(lv_timer_t * timer)
void lv_indev_enable(lv_indev_t * indev, bool en)
{
- if(!indev) return;
+ uint8_t enable = en ? 0 : 1;
- indev->proc.disabled = en ? 0 : 1;
+ if(indev) {
+ indev->proc.disabled = enable;
+ }
+ else {
+ lv_indev_t * i = lv_indev_get_next(NULL);
+ while(i) {
+ i->proc.disabled = enable;
+ i = lv_indev_get_next(i);
+ }
+ }
}
lv_indev_t * lv_indev_get_act(void)
@@ -286,6 +296,7 @@ lv_timer_t * lv_indev_get_read_timer(lv_disp_t * indev)
return indev->refr_timer;
}
+
lv_obj_t * lv_indev_search_obj(lv_obj_t * obj, lv_point_t * point)
{
lv_obj_t * found_p = NULL;
@@ -293,16 +304,20 @@ lv_obj_t * lv_indev_search_obj(lv_obj_t * obj, lv_point_t * point)
/*If this obj is hidden the children are hidden too so return immediately*/
if(lv_obj_has_flag(obj, LV_OBJ_FLAG_HIDDEN)) return NULL;
- bool hit_test_ok = lv_obj_hit_test(obj, point);
+ lv_point_t p_trans = *point;
+ lv_obj_transform_point(obj, &p_trans, false, true);
+
+ bool hit_test_ok = lv_obj_hit_test(obj, &p_trans);
/*If the point is on this object or has overflow visible check its children too*/
- if(_lv_area_is_point_on(&obj->coords, point, 0) || lv_obj_has_flag(obj, LV_OBJ_FLAG_OVERFLOW_VISIBLE)) {
+ if(_lv_area_is_point_on(&obj->coords, &p_trans, 0) || lv_obj_has_flag(obj, LV_OBJ_FLAG_OVERFLOW_VISIBLE)) {
int32_t i;
uint32_t child_cnt = lv_obj_get_child_cnt(obj);
+
/*If a child matches use it*/
for(i = child_cnt - 1; i >= 0; i--) {
lv_obj_t * child = obj->spec_attr->children[i];
- found_p = lv_indev_search_obj(child, point);
+ found_p = lv_indev_search_obj(child, &p_trans);
if(found_p) return found_p;
}
}
@@ -395,6 +410,8 @@ static void indev_keypad_proc(lv_indev_t * i, lv_indev_data_t * data)
indev_obj_act = lv_group_get_focused(g);
if(indev_obj_act == NULL) return;
+ bool dis = lv_obj_has_state(indev_obj_act, LV_STATE_DISABLED);
+
/*Save the last key to compare it with the current latter on RELEASE*/
uint32_t prev_key = i->proc.types.keypad.last_key;
@@ -410,26 +427,11 @@ static void indev_keypad_proc(lv_indev_t * i, lv_indev_data_t * data)
/*Key press happened*/
if(data->state == LV_INDEV_STATE_PRESSED && prev_state == LV_INDEV_STATE_RELEASED) {
- LV_LOG_INFO("%d key is pressed", data->key);
+ LV_LOG_INFO("%" LV_PRIu32 " key is pressed", data->key);
i->proc.pr_timestamp = lv_tick_get();
- /*Simulate a press on the object if ENTER was pressed*/
- if(data->key == LV_KEY_ENTER) {
- /*Send the ENTER as a normal KEY*/
- lv_group_send_data(g, LV_KEY_ENTER);
-
- lv_event_send(indev_obj_act, LV_EVENT_PRESSED, indev_act);
- if(indev_reset_check(&i->proc)) return;
- }
- else if(data->key == LV_KEY_ESC) {
- /*Send the ESC as a normal KEY*/
- lv_group_send_data(g, LV_KEY_ESC);
-
- lv_event_send(indev_obj_act, LV_EVENT_CANCEL, indev_act);
- if(indev_reset_check(&i->proc)) return;
- }
/*Move the focus on NEXT*/
- else if(data->key == LV_KEY_NEXT) {
+ if(data->key == LV_KEY_NEXT) {
lv_group_set_editing(g, false); /*Editing is not used by KEYPAD is be sure it is disabled*/
lv_group_focus_next(g);
if(indev_reset_check(&i->proc)) return;
@@ -440,13 +442,33 @@ static void indev_keypad_proc(lv_indev_t * i, lv_indev_data_t * data)
lv_group_focus_prev(g);
if(indev_reset_check(&i->proc)) return;
}
- /*Just send other keys to the object (e.g. 'A' or `LV_GROUP_KEY_RIGHT`)*/
- else {
- lv_group_send_data(g, data->key);
+ else if(!dis) {
+ /*Simulate a press on the object if ENTER was pressed*/
+ if(data->key == LV_KEY_ENTER) {
+ /*Send the ENTER as a normal KEY*/
+ lv_group_send_data(g, LV_KEY_ENTER);
+ if(indev_reset_check(&i->proc)) return;
+
+ if(!dis) lv_event_send(indev_obj_act, LV_EVENT_PRESSED, indev_act);
+ if(indev_reset_check(&i->proc)) return;
+ }
+ else if(data->key == LV_KEY_ESC) {
+ /*Send the ESC as a normal KEY*/
+ lv_group_send_data(g, LV_KEY_ESC);
+ if(indev_reset_check(&i->proc)) return;
+
+ lv_event_send(indev_obj_act, LV_EVENT_CANCEL, indev_act);
+ if(indev_reset_check(&i->proc)) return;
+ }
+ /*Just send other keys to the object (e.g. 'A' or `LV_GROUP_KEY_RIGHT`)*/
+ else {
+ lv_group_send_data(g, data->key);
+ if(indev_reset_check(&i->proc)) return;
+ }
}
}
/*Pressing*/
- else if(data->state == LV_INDEV_STATE_PRESSED && prev_state == LV_INDEV_STATE_PRESSED) {
+ else if(!dis && data->state == LV_INDEV_STATE_PRESSED && prev_state == LV_INDEV_STATE_PRESSED) {
if(data->key == LV_KEY_ENTER) {
lv_event_send(indev_obj_act, LV_EVENT_PRESSING, indev_act);
@@ -493,8 +515,8 @@ static void indev_keypad_proc(lv_indev_t * i, lv_indev_data_t * data)
}
}
/*Release happened*/
- else if(data->state == LV_INDEV_STATE_RELEASED && prev_state == LV_INDEV_STATE_PRESSED) {
- LV_LOG_INFO("%d key is released", data->key);
+ else if(!dis && data->state == LV_INDEV_STATE_RELEASED && prev_state == LV_INDEV_STATE_PRESSED) {
+ LV_LOG_INFO("%" LV_PRIu32 " key is released", data->key);
/*The user might clear the key when it was released. Always release the pressed key*/
data->key = prev_key;
if(data->key == LV_KEY_ENTER) {
@@ -579,6 +601,7 @@ static void indev_encoder_proc(lv_indev_t * i, lv_indev_data_t * data)
else if(data->key == LV_KEY_ESC) {
/*Send the ESC as a normal KEY*/
lv_group_send_data(g, LV_KEY_ESC);
+ if(indev_reset_check(&i->proc)) return;
lv_event_send(indev_obj_act, LV_EVENT_CANCEL, indev_act);
if(indev_reset_check(&i->proc)) return;
@@ -586,6 +609,7 @@ static void indev_encoder_proc(lv_indev_t * i, lv_indev_data_t * data)
/*Just send other keys to the object (e.g. 'A' or `LV_GROUP_KEY_RIGHT`)*/
else {
lv_group_send_data(g, data->key);
+ if(indev_reset_check(&i->proc)) return;
}
}
/*Pressing*/
@@ -676,8 +700,8 @@ static void indev_encoder_proc(lv_indev_t * i, lv_indev_data_t * data)
lv_event_send(indev_obj_act, LV_EVENT_CLICKED, indev_act);
if(indev_reset_check(&i->proc)) return;
-
lv_group_send_data(g, LV_KEY_ENTER);
+ if(indev_reset_check(&i->proc)) return;
}
else {
lv_obj_clear_state(indev_obj_act, LV_STATE_PRESSED); /*Remove the pressed state manually*/
@@ -703,10 +727,16 @@ static void indev_encoder_proc(lv_indev_t * i, lv_indev_data_t * data)
LV_LOG_INFO("rotated by %+d (edit)", data->enc_diff);
int32_t s;
if(data->enc_diff < 0) {
- for(s = 0; s < -data->enc_diff; s++) lv_group_send_data(g, LV_KEY_LEFT);
+ for(s = 0; s < -data->enc_diff; s++) {
+ lv_group_send_data(g, LV_KEY_LEFT);
+ if(indev_reset_check(&i->proc)) return;
+ }
}
else if(data->enc_diff > 0) {
- for(s = 0; s < data->enc_diff; s++) lv_group_send_data(g, LV_KEY_RIGHT);
+ for(s = 0; s < data->enc_diff; s++) {
+ lv_group_send_data(g, LV_KEY_RIGHT);
+ if(indev_reset_check(&i->proc)) return;
+ }
}
}
/*In navigate mode focus on the next/prev objects*/
@@ -714,10 +744,16 @@ static void indev_encoder_proc(lv_indev_t * i, lv_indev_data_t * data)
LV_LOG_INFO("rotated by %+d (nav)", data->enc_diff);
int32_t s;
if(data->enc_diff < 0) {
- for(s = 0; s < -data->enc_diff; s++) lv_group_focus_prev(g);
+ for(s = 0; s < -data->enc_diff; s++) {
+ lv_group_focus_prev(g);
+ if(indev_reset_check(&i->proc)) return;
+ }
}
else if(data->enc_diff > 0) {
- for(s = 0; s < data->enc_diff; s++) lv_group_focus_next(g);
+ for(s = 0; s < data->enc_diff; s++) {
+ lv_group_focus_next(g);
+ if(indev_reset_check(&i->proc)) return;
+ }
}
}
}
@@ -743,10 +779,10 @@ static void indev_button_proc(lv_indev_t * i, lv_indev_data_t * data)
static lv_indev_state_t prev_state = LV_INDEV_STATE_RELEASED;
if(prev_state != data->state) {
if(data->state == LV_INDEV_STATE_PRESSED) {
- LV_LOG_INFO("button %d is pressed (x:%d y:%d)", data->btn_id, x, y);
+ LV_LOG_INFO("button %" LV_PRIu32 " is pressed (x:%d y:%d)", data->btn_id, x, y);
}
else {
- LV_LOG_INFO("button %d is released (x:%d y:%d)", data->btn_id, x, y);
+ LV_LOG_INFO("button %" LV_PRIu32 " is released (x:%d y:%d)", data->btn_id, x, y);
}
}
@@ -816,7 +852,9 @@ static void indev_proc_press(_lv_indev_proc_t * proc)
if(indev_reset_check(proc)) return;
}
- /*If a new object was found reset some variables and send a pressed Call the ancestor's event handler*/
+ lv_obj_transform_point(indev_obj_act, &proc->types.pointer.act_point, true, true);
+
+ /*If a new object was found reset some variables and send a pressed event handler*/
if(indev_obj_act != proc->types.pointer.act_obj) {
proc->types.pointer.last_point.x = proc->types.pointer.act_point.x;
proc->types.pointer.last_point.y = proc->types.pointer.act_point.y;
@@ -864,11 +902,8 @@ static void indev_proc_press(_lv_indev_proc_t * proc)
proc->types.pointer.vect.x = proc->types.pointer.act_point.x - proc->types.pointer.last_point.x;
proc->types.pointer.vect.y = proc->types.pointer.act_point.y - proc->types.pointer.last_point.y;
- proc->types.pointer.scroll_throw_vect.x = (proc->types.pointer.scroll_throw_vect.x * 4) >> 3;
- proc->types.pointer.scroll_throw_vect.y = (proc->types.pointer.scroll_throw_vect.y * 4) >> 3;
-
- proc->types.pointer.scroll_throw_vect.x += (proc->types.pointer.vect.x * 4) >> 3;
- proc->types.pointer.scroll_throw_vect.y += (proc->types.pointer.vect.y * 4) >> 3;
+ proc->types.pointer.scroll_throw_vect.x = (proc->types.pointer.scroll_throw_vect.x + proc->types.pointer.vect.x) / 2;
+ proc->types.pointer.scroll_throw_vect.y = (proc->types.pointer.scroll_throw_vect.y + proc->types.pointer.vect.y) / 2;
proc->types.pointer.scroll_throw_vect_ori = proc->types.pointer.scroll_throw_vect;
@@ -917,6 +952,9 @@ static void indev_proc_press(_lv_indev_proc_t * proc)
static void indev_proc_release(_lv_indev_proc_t * proc)
{
if(proc->wait_until_release != 0) {
+ lv_event_send(proc->types.pointer.act_obj, LV_EVENT_PRESS_LOST, indev_act);
+ if(indev_reset_check(proc)) return;
+
proc->types.pointer.act_obj = NULL;
proc->types.pointer.last_obj = NULL;
proc->pr_timestamp = 0;
diff --git a/src/core/lv_indev.h b/src/core/lv_indev.h
index 80c793977..a98df86ef 100644
--- a/src/core/lv_indev.h
+++ b/src/core/lv_indev.h
@@ -35,7 +35,11 @@ extern "C" {
*/
void lv_indev_read_timer_cb(lv_timer_t * timer);
-
+/**
+ * Enable or disable one or all input devices (default enabled)
+ * @param indev pointer to an input device or NULL to enable/disable all of them
+ * @param en true to enable, false to disable
+ */
void lv_indev_enable(lv_indev_t * indev, bool en);
/**
diff --git a/src/core/lv_indev_scroll.c b/src/core/lv_indev_scroll.c
index 96fa2f66d..c05e3459f 100644
--- a/src/core/lv_indev_scroll.c
+++ b/src/core/lv_indev_scroll.c
@@ -85,7 +85,8 @@ void _lv_indev_scroll_handler(_lv_indev_proc_t * proc)
/*Respect the scroll limit area*/
scroll_limit_diff(proc, &diff_x, &diff_y);
- lv_obj_scroll_by(scroll_obj, diff_x, diff_y, LV_ANIM_OFF);
+ _lv_obj_scroll_by_raw(scroll_obj, diff_x, diff_y);
+ if(proc->reset_query) return;
proc->types.pointer.scroll_sum.x += diff_x;
proc->types.pointer.scroll_sum.y += diff_y;
}
diff --git a/src/core/lv_obj.c b/src/core/lv_obj.c
index 0b5f27a85..8890fcbe0 100644
--- a/src/core/lv_obj.c
+++ b/src/core/lv_obj.c
@@ -30,9 +30,12 @@
#include "../draw/stm32_dma2d/lv_gpu_stm32_dma2d.h"
#endif
+#if LV_USE_GPU_SWM341_DMA2D
+ #include "../draw/swm341_dma2d/lv_gpu_swm341_dma2d.h"
+#endif
+
#if LV_USE_GPU_NXP_PXP && LV_USE_GPU_NXP_PXP_AUTO_INIT
- #include "../gpu/lv_gpu_nxp_pxp.h"
- #include "../gpu/lv_gpu_nxp_pxp_osa.h"
+ #include "../draw/nxp/pxp/lv_gpu_nxp_pxp.h"
#endif
/*********************
@@ -41,7 +44,6 @@
#define MY_CLASS &lv_obj_class
#define LV_OBJ_DEF_WIDTH (LV_DPX(100))
#define LV_OBJ_DEF_HEIGHT (LV_DPX(50))
-#define GRID_DEBUG 0 /*Draw rectangles on grid cells*/
#define STYLE_TRANSITION_MAX 32
/**********************
@@ -117,11 +119,13 @@ void lv_init(void)
lv_draw_stm32_dma2d_init();
#endif
+#if LV_USE_GPU_SWM341_DMA2D
+ /*Initialize DMA2D GPU*/
+ lv_draw_swm341_dma2d_init();
+#endif
+
#if LV_USE_GPU_NXP_PXP && LV_USE_GPU_NXP_PXP_AUTO_INIT
- if(lv_gpu_nxp_pxp_init(&pxp_default_cfg) != LV_RES_OK) {
- LV_LOG_ERROR("PXP init error. STOP.\n");
- for(; ;) ;
- }
+ PXP_COND_STOP(!lv_gpu_nxp_pxp_init(), "PXP init failed.");
#endif
_lv_obj_style_init();
@@ -265,6 +269,7 @@ void lv_obj_clear_flag(lv_obj_t * obj, lv_obj_flag_t f)
if((was_on_layout != lv_obj_is_layout_positioned(obj)) || (f & (LV_OBJ_FLAG_LAYOUT_1 | LV_OBJ_FLAG_LAYOUT_2))) {
lv_obj_mark_layout_as_dirty(lv_obj_get_parent(obj));
}
+
}
void lv_obj_add_state(lv_obj_t * obj, lv_state_t state)
@@ -489,17 +494,6 @@ static void lv_obj_draw(lv_event_t * e)
return;
}
-#if LV_DRAW_COMPLEX
- if(lv_obj_get_style_blend_mode(obj, LV_PART_MAIN) != LV_BLEND_MODE_NORMAL) {
- info->res = LV_COVER_RES_NOT_COVER;
- return;
- }
-#endif
- if(lv_obj_get_style_opa(obj, LV_PART_MAIN) < LV_OPA_MAX) {
- info->res = LV_COVER_RES_NOT_COVER;
- return;
- }
-
info->res = LV_COVER_RES_COVER;
}
@@ -531,7 +525,6 @@ static void lv_obj_draw(lv_event_t * e)
part_dsc.part = LV_PART_MAIN;
lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_dsc);
-
#if LV_DRAW_COMPLEX
/*With clip corner enabled draw the bg img separately to make it clipped*/
bool clip_corner = (lv_obj_get_style_clip_corner(obj, LV_PART_MAIN) && draw_dsc.radius != 0) ? true : false;
@@ -846,9 +839,8 @@ static void lv_obj_event(const lv_obj_class_t * class_p, lv_event_t * e)
}
}
else if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) {
- lv_coord_t * s = lv_event_get_param(e);
lv_coord_t d = lv_obj_calculate_ext_draw_size(obj, LV_PART_MAIN);
- *s = LV_MAX(*s, d);
+ lv_event_set_ext_draw_size(e, d);
}
else if(code == LV_EVENT_DRAW_MAIN || code == LV_EVENT_DRAW_POST || code == LV_EVENT_COVER_CHECK) {
lv_obj_draw(e);
@@ -886,7 +878,7 @@ static void lv_obj_set_state(lv_obj_t * obj, lv_state_t new_state)
if(obj_style->is_trans) continue;
lv_style_value_t v;
- if(lv_style_get_prop_inlined(obj_style->style, LV_STYLE_TRANSITION, &v) == false) continue;
+ if(lv_style_get_prop_inlined(obj_style->style, LV_STYLE_TRANSITION, &v) != LV_STYLE_RES_FOUND) continue;
const lv_style_transition_dsc_t * tr = v.ptr;
/*Add the props to the set if not added yet or added but with smaller weight*/
diff --git a/src/core/lv_obj.h b/src/core/lv_obj.h
index 7bd89c8a4..c89e46099 100644
--- a/src/core/lv_obj.h
+++ b/src/core/lv_obj.h
@@ -63,7 +63,7 @@ typedef uint16_t lv_state_t;
* The possible parts of widgets.
* The parts can be considered as the internal building block of the widgets.
* E.g. slider = background + indicator + knob
- * Note every part is used by every widget
+ * Not all parts are used by every widget
*/
enum {
LV_PART_MAIN = 0x000000, /**< A background like rectangle*/
@@ -167,7 +167,8 @@ typedef struct {
lv_scroll_snap_t scroll_snap_x : 2; /**< Where to align the snappable children horizontally*/
lv_scroll_snap_t scroll_snap_y : 2; /**< Where to align the snappable children vertically*/
lv_dir_t scroll_dir : 4; /**< The allowed scroll direction(s)*/
- uint8_t event_dsc_cnt; /**< Number of event callbacks stored in `event_dsc` array*/
+ uint8_t event_dsc_cnt : 6; /**< Number of event callbacks stored in `event_dsc` array*/
+ uint8_t layer_type : 2; /**< Cache the layer type here. Element of @lv_intermediate_layer_type_t */
} _lv_obj_spec_attr_t;
typedef struct _lv_obj_t {
diff --git a/src/core/lv_obj_class.c b/src/core/lv_obj_class.c
index 174453e98..fe2044824 100644
--- a/src/core/lv_obj_class.c
+++ b/src/core/lv_obj_class.c
@@ -56,6 +56,7 @@ lv_obj_t * lv_obj_class_create_obj(const lv_obj_class_t * class_p, lv_obj_t * pa
lv_disp_t * disp = lv_disp_get_default();
if(!disp) {
LV_LOG_WARN("No display created yet. No place to assign the new screen");
+ lv_mem_free(obj);
return NULL;
}
diff --git a/src/core/lv_obj_draw.c b/src/core/lv_obj_draw.c
index db7c6ea54..f2428cddf 100644
--- a/src/core/lv_obj_draw.c
+++ b/src/core/lv_obj_draw.c
@@ -38,21 +38,23 @@
void lv_obj_init_draw_rect_dsc(lv_obj_t * obj, uint32_t part, lv_draw_rect_dsc_t * draw_dsc)
{
+ lv_opa_t opa = LV_OPA_COVER;
+ if(part != LV_PART_MAIN) {
+ opa = lv_obj_get_style_opa(obj, part);
+ if(opa <= LV_OPA_MIN) {
+ draw_dsc->bg_opa = LV_OPA_TRANSP;
+ draw_dsc->bg_img_opa = LV_OPA_TRANSP;
+ draw_dsc->border_opa = LV_OPA_TRANSP;
+ draw_dsc->outline_opa = LV_OPA_TRANSP;
+ draw_dsc->shadow_opa = LV_OPA_TRANSP;
+ return;
+ }
+ }
#if LV_DRAW_COMPLEX
- draw_dsc->radius = lv_obj_get_style_radius(obj, part);
-
- lv_opa_t main_opa = part != LV_PART_MAIN ? lv_obj_get_style_opa(obj, part) : LV_OPA_COVER;
- lv_opa_t opa = lv_obj_get_style_opa(obj, part);
- if(opa <= LV_OPA_MIN || main_opa <= LV_OPA_MIN) {
- draw_dsc->bg_opa = LV_OPA_TRANSP;
- draw_dsc->border_opa = LV_OPA_TRANSP;
- draw_dsc->shadow_opa = LV_OPA_TRANSP;
- draw_dsc->outline_opa = LV_OPA_TRANSP;
- return;
- }
+ if(part != LV_PART_MAIN) draw_dsc->blend_mode = lv_obj_get_style_blend_mode(obj, part);
- draw_dsc->blend_mode = lv_obj_get_style_blend_mode(obj, part);
+ draw_dsc->radius = lv_obj_get_style_radius(obj, part);
if(draw_dsc->bg_opa != LV_OPA_TRANSP) {
draw_dsc->bg_opa = lv_obj_get_style_bg_opa(obj, part);
@@ -130,17 +132,6 @@ void lv_obj_init_draw_rect_dsc(lv_obj_t * obj, uint32_t part, lv_draw_rect_dsc_t
}
}
- if(main_opa < LV_OPA_MAX) {
- opa = (uint16_t)((uint16_t) main_opa * opa) >> 8;
- }
-
- if(opa < LV_OPA_MAX) {
- draw_dsc->bg_opa = (uint16_t)((uint16_t)draw_dsc->bg_opa * opa) >> 8;
- draw_dsc->bg_img_opa = (uint16_t)((uint16_t)draw_dsc->bg_img_opa * opa) >> 8;
- draw_dsc->border_opa = (uint16_t)((uint16_t)draw_dsc->border_opa * opa) >> 8;
- draw_dsc->shadow_opa = (uint16_t)((uint16_t)draw_dsc->shadow_opa * opa) >> 8;
- draw_dsc->outline_opa = (uint16_t)((uint16_t)draw_dsc->outline_opa * opa) >> 8;
- }
#else /*LV_DRAW_COMPLEX*/
if(draw_dsc->bg_opa != LV_OPA_TRANSP) {
draw_dsc->bg_opa = lv_obj_get_style_bg_opa(obj, part);
@@ -189,6 +180,16 @@ void lv_obj_init_draw_rect_dsc(lv_obj_t * obj, uint32_t part, lv_draw_rect_dsc_t
}
}
#endif
+
+ if(part != LV_PART_MAIN) {
+ if(opa < LV_OPA_MAX) {
+ draw_dsc->bg_opa = (opa * draw_dsc->shadow_opa) >> 8;
+ draw_dsc->bg_img_opa = (opa * draw_dsc->shadow_opa) >> 8;
+ draw_dsc->border_opa = (opa * draw_dsc->shadow_opa) >> 8;
+ draw_dsc->outline_opa = (opa * draw_dsc->shadow_opa) >> 8;
+ draw_dsc->shadow_opa = (opa * draw_dsc->shadow_opa) >> 8;
+ }
+ }
}
void lv_obj_init_draw_label_dsc(lv_obj_t * obj, uint32_t part, lv_draw_label_dsc_t * draw_dsc)
@@ -196,18 +197,23 @@ void lv_obj_init_draw_label_dsc(lv_obj_t * obj, uint32_t part, lv_draw_label_dsc
draw_dsc->opa = lv_obj_get_style_text_opa(obj, part);
if(draw_dsc->opa <= LV_OPA_MIN) return;
- lv_opa_t opa = lv_obj_get_style_opa(obj, part);
- if(opa < LV_OPA_MAX) {
- draw_dsc->opa = (uint16_t)((uint16_t)draw_dsc->opa * opa) >> 8;
+ if(part != LV_PART_MAIN) {
+ lv_opa_t opa = lv_obj_get_style_opa(obj, part);
+ if(opa <= LV_OPA_MIN) {
+ draw_dsc->opa = LV_OPA_TRANSP;
+ return;
+ }
+ if(opa < LV_OPA_MAX) {
+ draw_dsc->opa = (opa * draw_dsc->opa) >> 8;
+ }
}
- if(draw_dsc->opa <= LV_OPA_MIN) return;
draw_dsc->color = lv_obj_get_style_text_color_filtered(obj, part);
draw_dsc->letter_space = lv_obj_get_style_text_letter_space(obj, part);
draw_dsc->line_space = lv_obj_get_style_text_line_space(obj, part);
draw_dsc->decor = lv_obj_get_style_text_decor(obj, part);
#if LV_DRAW_COMPLEX
- draw_dsc->blend_mode = lv_obj_get_style_blend_mode(obj, part);
+ if(part != LV_PART_MAIN) draw_dsc->blend_mode = lv_obj_get_style_blend_mode(obj, part);
#endif
draw_dsc->font = lv_obj_get_style_text_font(obj, part);
@@ -222,13 +228,18 @@ void lv_obj_init_draw_label_dsc(lv_obj_t * obj, uint32_t part, lv_draw_label_dsc
void lv_obj_init_draw_img_dsc(lv_obj_t * obj, uint32_t part, lv_draw_img_dsc_t * draw_dsc)
{
draw_dsc->opa = lv_obj_get_style_img_opa(obj, part);
- if(draw_dsc->opa <= LV_OPA_MIN) return;
+ if(draw_dsc->opa <= LV_OPA_MIN) return;
- lv_opa_t opa_scale = lv_obj_get_style_opa(obj, part);
- if(opa_scale < LV_OPA_MAX) {
- draw_dsc->opa = (uint16_t)((uint16_t)draw_dsc->opa * opa_scale) >> 8;
+ if(part != LV_PART_MAIN) {
+ lv_opa_t opa = lv_obj_get_style_opa(obj, part);
+ if(opa <= LV_OPA_MIN) {
+ draw_dsc->opa = LV_OPA_TRANSP;
+ return;
+ }
+ if(opa < LV_OPA_MAX) {
+ draw_dsc->opa = (opa * draw_dsc->opa) >> 8;
+ }
}
- if(draw_dsc->opa <= LV_OPA_MIN) return;
draw_dsc->angle = 0;
draw_dsc->zoom = LV_IMG_ZOOM_NONE;
@@ -240,23 +251,28 @@ void lv_obj_init_draw_img_dsc(lv_obj_t * obj, uint32_t part, lv_draw_img_dsc_t *
draw_dsc->recolor = lv_obj_get_style_img_recolor_filtered(obj, part);
}
#if LV_DRAW_COMPLEX
- draw_dsc->blend_mode = lv_obj_get_style_blend_mode(obj, part);
+ if(part != LV_PART_MAIN) draw_dsc->blend_mode = lv_obj_get_style_blend_mode(obj, part);
#endif
}
void lv_obj_init_draw_line_dsc(lv_obj_t * obj, uint32_t part, lv_draw_line_dsc_t * draw_dsc)
{
- draw_dsc->width = lv_obj_get_style_line_width(obj, part);
- if(draw_dsc->width == 0) return;
-
draw_dsc->opa = lv_obj_get_style_line_opa(obj, part);
if(draw_dsc->opa <= LV_OPA_MIN) return;
- lv_opa_t opa = lv_obj_get_style_opa(obj, part);
- if(opa < LV_OPA_MAX) {
- draw_dsc->opa = (uint16_t)((uint16_t)draw_dsc->opa * opa) >> 8;
+ if(part != LV_PART_MAIN) {
+ lv_opa_t opa = lv_obj_get_style_opa(obj, part);
+ if(opa <= LV_OPA_MIN) {
+ draw_dsc->opa = LV_OPA_TRANSP;
+ return;
+ }
+ if(opa < LV_OPA_MAX) {
+ draw_dsc->opa = (opa * draw_dsc->opa) >> 8;
+ }
}
- if(draw_dsc->opa <= LV_OPA_MIN) return;
+
+ draw_dsc->width = lv_obj_get_style_line_width(obj, part);
+ if(draw_dsc->width == 0) return;
draw_dsc->color = lv_obj_get_style_line_color_filtered(obj, part);
@@ -269,7 +285,7 @@ void lv_obj_init_draw_line_dsc(lv_obj_t * obj, uint32_t part, lv_draw_line_dsc_t
draw_dsc->round_end = draw_dsc->round_start;
#if LV_DRAW_COMPLEX
- draw_dsc->blend_mode = lv_obj_get_style_blend_mode(obj, part);
+ if(part != LV_PART_MAIN) draw_dsc->blend_mode = lv_obj_get_style_blend_mode(obj, part);
#endif
}
@@ -281,11 +297,16 @@ void lv_obj_init_draw_arc_dsc(lv_obj_t * obj, uint32_t part, lv_draw_arc_dsc_t *
draw_dsc->opa = lv_obj_get_style_arc_opa(obj, part);
if(draw_dsc->opa <= LV_OPA_MIN) return;
- lv_opa_t opa = lv_obj_get_style_opa(obj, part);
- if(opa < LV_OPA_MAX) {
- draw_dsc->opa = (uint16_t)((uint16_t)draw_dsc->opa * opa) >> 8;
+ if(part != LV_PART_MAIN) {
+ lv_opa_t opa = lv_obj_get_style_opa(obj, part);
+ if(opa <= LV_OPA_MIN) {
+ draw_dsc->opa = LV_OPA_TRANSP;
+ return;
+ }
+ if(opa < LV_OPA_MAX) {
+ draw_dsc->opa = (opa * draw_dsc->opa) >> 8;
+ }
}
- if(draw_dsc->opa <= LV_OPA_MIN) return;
draw_dsc->color = lv_obj_get_style_arc_color_filtered(obj, part);
draw_dsc->img_src = lv_obj_get_style_arc_img_src(obj, part);
@@ -293,7 +314,7 @@ void lv_obj_init_draw_arc_dsc(lv_obj_t * obj, uint32_t part, lv_draw_arc_dsc_t *
draw_dsc->rounded = lv_obj_get_style_arc_rounded(obj, part);
#if LV_DRAW_COMPLEX
- draw_dsc->blend_mode = lv_obj_get_style_blend_mode(obj, part);
+ if(part != LV_PART_MAIN) draw_dsc->blend_mode = lv_obj_get_style_blend_mode(obj, part);
#endif
}
@@ -373,6 +394,13 @@ lv_coord_t _lv_obj_get_ext_draw_size(const lv_obj_t * obj)
else return 0;
}
+lv_layer_type_t _lv_obj_get_layer_type(const lv_obj_t * obj)
+{
+
+ if(obj->spec_attr) return obj->spec_attr->layer_type;
+ else return LV_LAYER_TYPE_NONE;
+}
+
/**********************
* STATIC FUNCTIONS
**********************/
diff --git a/src/core/lv_obj_draw.h b/src/core/lv_obj_draw.h
index 063216540..3f9d0f30f 100644
--- a/src/core/lv_obj_draw.h
+++ b/src/core/lv_obj_draw.h
@@ -33,6 +33,12 @@ typedef enum {
LV_COVER_RES_MASKED = 2,
} lv_cover_res_t;
+typedef enum {
+ LV_LAYER_TYPE_NONE,
+ LV_LAYER_TYPE_SIMPLE,
+ LV_LAYER_TYPE_TRANSFORM,
+} lv_layer_type_t;
+
typedef struct {
lv_draw_ctx_t * draw_ctx; /**< Draw context*/
const struct _lv_obj_class_t * class_p; /**< The class that sent the event */
@@ -50,14 +56,14 @@ typedef struct {
arc_dsc; /**< A draw descriptor that can be modified to changed what LVGL will draw. Set only for arc-like parts*/
const lv_point_t *
p1; /**< A point calculated during drawing. E.g. a point of chart or the center of an arc.*/
- const lv_point_t * p2; /**< A point calculated during drawing. E.g. a point of chart.*/
+ const lv_point_t * p2; /**< A point calculated during drawing. E.g. a point of chart.*/
char * text; /**< A text calculated during drawing. Can be modified. E.g. tick labels on a chart axis.*/
- uint32_t text_length; /**< Size of the text buffer containing null-terminated text string calculated during drawing.*/
- uint32_t part; /**< The current part for which the event is sent*/
- uint32_t id; /**< The index of the part. E.g. a button's index on button matrix or table cell index.*/
- lv_coord_t radius; /**< E.g. the radius of an arc (not the corner radius).*/
- int32_t value; /**< A value calculated during drawing. E.g. Chart's tick line value.*/
- const void * sub_part_ptr; /**< A pointer the identifies something in the part. E.g. chart series. */
+ uint32_t text_length; /**< Size of the text buffer containing null-terminated text string calculated during drawing.*/
+ uint32_t part; /**< The current part for which the event is sent*/
+ uint32_t id; /**< The index of the part. E.g. a button's index on button matrix or table cell index.*/
+ lv_coord_t radius; /**< E.g. the radius of an arc (not the corner radius).*/
+ int32_t value; /**< A value calculated during drawing. E.g. Chart's tick line value.*/
+ const void * sub_part_ptr; /**< A pointer the identifies something in the part. E.g. chart series. */
} lv_obj_draw_part_dsc_t;
/**********************
@@ -66,11 +72,11 @@ typedef struct {
/**
* Initialize a rectangle draw descriptor from an object's styles in its current state
- * @param obj pointer to an object
- * @param part part of the object. E.g. `LV_PART_MAIN`, `LV_PART_SCROLLBAR`, `LV_PART_KNOB`, etc
- * @param draw_dsc the descriptor to initialize.
- * If an `..._opa` field is set to `LV_OPA_TRANSP` the related properties won't be initialized.
- * Should be initialized with `lv_draw_rect_dsc_init(draw_dsc)`.
+ * @param obj pointer to an object
+ * @param part part of the object, e.g. `LV_PART_MAIN`, `LV_PART_SCROLLBAR`, `LV_PART_KNOB`, etc
+ * @param draw_dsc the descriptor to initialize.
+ * If an `..._opa` field is set to `LV_OPA_TRANSP` the related properties won't be initialized.
+ * Should be initialized with `lv_draw_rect_dsc_init(draw_dsc)`.
* @note Only the relevant fields will be set.
* E.g. if `border width == 0` the other border properties won't be evaluated.
*/
@@ -78,20 +84,20 @@ void lv_obj_init_draw_rect_dsc(struct _lv_obj_t * obj, uint32_t part, lv_draw_re
/**
* Initialize a label draw descriptor from an object's styles in its current state
- * @param obj pointer to an object
- * @param part part of the object. E.g. `LV_PART_MAIN`, `LV_PART_SCROLLBAR`, `LV_PART_KNOB`, etc
- * @param draw_dsc the descriptor to initialize.
- * If the `opa` field is set to or the property is equal to `LV_OPA_TRANSP` the rest won't be initialized.
- * Should be initialized with `lv_draw_label_dsc_init(draw_dsc)`.
+ * @param obj pointer to an object
+ * @param part part of the object, e.g. `LV_PART_MAIN`, `LV_PART_SCROLLBAR`, `LV_PART_KNOB`, etc
+ * @param draw_dsc the descriptor to initialize.
+ * If the `opa` field is set to or the property is equal to `LV_OPA_TRANSP` the rest won't be initialized.
+ * Should be initialized with `lv_draw_label_dsc_init(draw_dsc)`.
*/
void lv_obj_init_draw_label_dsc(struct _lv_obj_t * obj, uint32_t part, lv_draw_label_dsc_t * draw_dsc);
/**
* Initialize an image draw descriptor from an object's styles in its current state
- * @param obj pointer to an object
- * @param part part of the object. E.g. `LV_PART_MAIN`, `LV_PART_SCROLLBAR`, `LV_PART_KNOB`, etc
- * @param draw_dsc the descriptor to initialize.
- * Should be initialized with `lv_draw_image_dsc_init(draw_dsc)`.
+ * @param obj pointer to an object
+ * @param part part of the object, e.g. `LV_PART_MAIN`, `LV_PART_SCROLLBAR`, `LV_PART_KNOB`, etc
+ * @param draw_dsc the descriptor to initialize.
+ * Should be initialized with `lv_draw_image_dsc_init(draw_dsc)`.
*/
void lv_obj_init_draw_img_dsc(struct _lv_obj_t * obj, uint32_t part, lv_draw_img_dsc_t * draw_dsc);
@@ -99,33 +105,33 @@ void lv_obj_init_draw_img_dsc(struct _lv_obj_t * obj, uint32_t part, lv_draw_img
/**
* Initialize a line draw descriptor from an object's styles in its current state
* @param obj pointer to an object
- * @param part part of the object. E.g. `LV_PART_MAIN`, `LV_PART_SCROLLBAR`, `LV_PART_KNOB`, etc
- * @param draw_dsc the descriptor to initialize.
- * Should be initialized with `lv_draw_line_dsc_init(draw_dsc)`.
+ * @param part part of the object, e.g. `LV_PART_MAIN`, `LV_PART_SCROLLBAR`, `LV_PART_KNOB`, etc
+ * @param draw_dsc the descriptor to initialize.
+ * Should be initialized with `lv_draw_line_dsc_init(draw_dsc)`.
*/
void lv_obj_init_draw_line_dsc(struct _lv_obj_t * obj, uint32_t part, lv_draw_line_dsc_t * draw_dsc);
/**
* Initialize an arc draw descriptor from an object's styles in its current state
- * @param obj pointer to an object
- * @param part part of the object. E.g. `LV_PART_MAIN`, `LV_PART_SCROLLBAR`, `LV_PART_KNOB`, etc
- * @param draw_dsc the descriptor to initialize.
- * Should be initialized with `lv_draw_arc_dsc_init(draw_dsc)`.
+ * @param obj pointer to an object
+ * @param part part of the object, e.g. `LV_PART_MAIN`, `LV_PART_SCROLLBAR`, `LV_PART_KNOB`, etc
+ * @param draw_dsc the descriptor to initialize.
+ * Should be initialized with `lv_draw_arc_dsc_init(draw_dsc)`.
*/
void lv_obj_init_draw_arc_dsc(struct _lv_obj_t * obj, uint32_t part, lv_draw_arc_dsc_t * draw_dsc);
/**
* Get the required extra size (around the object's part) to draw shadow, outline, value etc.
- * @param obj pointer to an object
- * @param part part of the object
- * @return the extra size required around the object
+ * @param obj pointer to an object
+ * @param part part of the object
+ * @return the extra size required around the object
*/
lv_coord_t lv_obj_calculate_ext_draw_size(struct _lv_obj_t * obj, uint32_t part);
/**
* Initialize a draw descriptor used in events.
- * @param dsc pointer to a descriptor. Later it should be passed as parameter to an `LV_EEVNT_DRAW_PART_BEGIN/END` event.
- * @param draw the current draw context. (usually returned by `lv_event_get_draw_ctx(e)`)
+ * @param dsc pointer to a descriptor. Later it should be passed as parameter to an `LV_EVENT_DRAW_PART_BEGIN/END` event.
+ * @param draw the current draw context. (usually returned by `lv_event_get_draw_ctx(e)`)
*/
void lv_obj_draw_dsc_init(lv_obj_draw_part_dsc_t * dsc, lv_draw_ctx_t * draw_ctx);
@@ -141,17 +147,20 @@ bool lv_obj_draw_part_check_type(lv_obj_draw_part_dsc_t * dsc, const struct _lv_
/**
* Send a 'LV_EVENT_REFR_EXT_DRAW_SIZE' Call the ancestor's event handler to the object to refresh the value of the extended draw size.
* The result will be saved in `obj`.
- * @param obj pointer to an object
+ * @param obj pointer to an object
*/
void lv_obj_refresh_ext_draw_size(struct _lv_obj_t * obj);
/**
* Get the extended draw area of an object.
- * @param obj pointer to an object
- * @return the size extended draw area around the real coordinates
+ * @param obj pointer to an object
+ * @return the size extended draw area around the real coordinates
*/
lv_coord_t _lv_obj_get_ext_draw_size(const struct _lv_obj_t * obj);
+
+lv_layer_type_t _lv_obj_get_layer_type(const struct _lv_obj_t * obj);
+
/**********************
* MACROS
**********************/
diff --git a/src/core/lv_obj_pos.c b/src/core/lv_obj_pos.c
index 92d4bc4d9..a31c11db8 100644
--- a/src/core/lv_obj_pos.c
+++ b/src/core/lv_obj_pos.c
@@ -26,6 +26,7 @@
static lv_coord_t calc_content_width(lv_obj_t * obj);
static lv_coord_t calc_content_height(lv_obj_t * obj);
static void layout_update_core(lv_obj_t * obj);
+static void transform_point(const lv_obj_t * obj, lv_point_t * p, bool inv);
/**********************
* STATIC VARIABLES
@@ -206,6 +207,8 @@ bool lv_obj_refr_size(lv_obj_t * obj)
bool on2 = _lv_area_is_in(&obj->coords, &parent_fit_area, 0);
if(on1 || (!on1 && on2)) lv_obj_scrollbar_invalidate(parent);
+ lv_obj_refresh_ext_draw_size(obj);
+
return true;
}
@@ -627,6 +630,7 @@ void lv_obj_refr_pos(lv_obj_t * obj)
{
if(lv_obj_is_layout_positioned(obj)) return;
+
lv_obj_t * parent = lv_obj_get_parent(obj);
lv_coord_t x = lv_obj_get_style_x(obj, LV_PART_MAIN);
lv_coord_t y = lv_obj_get_style_y(obj, LV_PART_MAIN);
@@ -791,28 +795,63 @@ void lv_obj_move_children_by(lv_obj_t * obj, lv_coord_t x_diff, lv_coord_t y_dif
}
}
+void lv_obj_transform_point(const lv_obj_t * obj, lv_point_t * p, bool recursive, bool inv)
+{
+ if(obj) {
+ lv_layer_type_t layer_type = _lv_obj_get_layer_type(obj);
+ bool do_tranf = layer_type == LV_LAYER_TYPE_TRANSFORM;
+ if(inv) {
+ if(recursive) lv_obj_transform_point(lv_obj_get_parent(obj), p, recursive, inv);
+ if(do_tranf) transform_point(obj, p, inv);
+ }
+ else {
+ if(do_tranf) transform_point(obj, p, inv);
+ if(recursive) lv_obj_transform_point(lv_obj_get_parent(obj), p, recursive, inv);
+ }
+ }
+}
+
+void lv_obj_get_transformed_area(const lv_obj_t * obj, lv_area_t * area, bool recursive,
+ bool inv)
+{
+ lv_point_t p[4] = {
+ {area->x1, area->y1},
+ {area->x1, area->y2},
+ {area->x2, area->y1},
+ {area->x2, area->y2},
+ };
+
+ lv_obj_transform_point(obj, &p[0], recursive, inv);
+ lv_obj_transform_point(obj, &p[1], recursive, inv);
+ lv_obj_transform_point(obj, &p[2], recursive, inv);
+ lv_obj_transform_point(obj, &p[3], recursive, inv);
+
+ area->x1 = LV_MIN4(p[0].x, p[1].x, p[2].x, p[3].x);
+ area->x2 = LV_MAX4(p[0].x, p[1].x, p[2].x, p[3].x);
+ area->y1 = LV_MIN4(p[0].y, p[1].y, p[2].y, p[3].y);
+ area->y2 = LV_MAX4(p[0].y, p[1].y, p[2].y, p[3].y);
+ lv_area_increase(area, 5, 5);
+}
+
void lv_obj_invalidate_area(const lv_obj_t * obj, const lv_area_t * area)
{
LV_ASSERT_OBJ(obj, MY_CLASS);
+ lv_disp_t * disp = lv_obj_get_disp(obj);
+ if(!lv_disp_is_invalidation_enabled(disp)) return;
+
lv_area_t area_tmp;
lv_area_copy(&area_tmp, area);
- bool visible = lv_obj_area_is_visible(obj, &area_tmp);
+ if(!lv_obj_area_is_visible(obj, &area_tmp)) return;
- if(visible) _lv_inv_area(lv_obj_get_disp(obj), &area_tmp);
+ _lv_inv_area(lv_obj_get_disp(obj), &area_tmp);
}
void lv_obj_invalidate(const lv_obj_t * obj)
{
LV_ASSERT_OBJ(obj, MY_CLASS);
- /*If the object has overflow visible it can be drawn anywhere on its parent
- *It needs to be checked recursively*/
- while(lv_obj_get_parent(obj) && lv_obj_has_flag(obj, LV_OBJ_FLAG_OVERFLOW_VISIBLE)) {
- obj = lv_obj_get_parent(obj);
- }
-
/*Truncate the area to the object*/
lv_area_t obj_coords;
lv_coord_t ext_size = _lv_obj_get_ext_draw_size(obj);
@@ -841,7 +880,7 @@ bool lv_obj_area_is_visible(const lv_obj_t * obj, lv_area_t * area)
}
/*Truncate the area to the object*/
- if(!lv_obj_has_flag(obj, LV_OBJ_FLAG_OVERFLOW_VISIBLE)) {
+ if(!lv_obj_has_flag_any(obj, LV_OBJ_FLAG_OVERFLOW_VISIBLE)) {
lv_area_t obj_coords;
lv_coord_t ext_size = _lv_obj_get_ext_draw_size(obj);
lv_area_copy(&obj_coords, &obj->coords);
@@ -854,6 +893,9 @@ bool lv_obj_area_is_visible(const lv_obj_t * obj, lv_area_t * area)
if(!_lv_area_intersect(area, area, &obj_coords)) return false;
}
+ lv_obj_get_transformed_area(obj, area, true, false);
+
+
/*Truncate recursively to the parents*/
lv_obj_t * par = lv_obj_get_parent(obj);
while(par != NULL) {
@@ -861,8 +903,10 @@ bool lv_obj_area_is_visible(const lv_obj_t * obj, lv_area_t * area)
if(lv_obj_has_flag(par, LV_OBJ_FLAG_HIDDEN)) return false;
/*Truncate to the parent and if no common parts break*/
- if(!lv_obj_has_flag(par, LV_OBJ_FLAG_OVERFLOW_VISIBLE)) {
- if(!_lv_area_intersect(area, area, &par->coords)) return false;
+ if(!lv_obj_has_flag_any(par, LV_OBJ_FLAG_OVERFLOW_VISIBLE)) {
+ lv_area_t par_area = par->coords;
+ lv_obj_get_transformed_area(par, &par_area, true, false);
+ if(!_lv_area_intersect(area, area, &par_area)) return false;
}
par = lv_obj_get_parent(par);
@@ -1108,3 +1152,21 @@ static void layout_update_core(lv_obj_t * obj)
}
}
}
+
+static void transform_point(const lv_obj_t * obj, lv_point_t * p, bool inv)
+{
+ int16_t angle = lv_obj_get_style_transform_angle(obj, 0);
+ int16_t zoom = lv_obj_get_style_transform_zoom(obj, 0);
+
+ if(angle == 0 && zoom == LV_IMG_ZOOM_NONE) return;
+
+ lv_point_t pivot;
+ pivot.x = obj->coords.x1 + lv_obj_get_style_transform_pivot_x(obj, 0);
+ pivot.y = obj->coords.y1 + lv_obj_get_style_transform_pivot_y(obj, 0);
+ if(inv) {
+ angle = -angle;
+ zoom = (256 * 256) / zoom;
+ }
+
+ lv_point_transform(p, angle, zoom, &pivot);
+}
diff --git a/src/core/lv_obj_pos.h b/src/core/lv_obj_pos.h
index 60130398e..d20ee9656 100644
--- a/src/core/lv_obj_pos.h
+++ b/src/core/lv_obj_pos.h
@@ -348,6 +348,24 @@ void lv_obj_move_to(struct _lv_obj_t * obj, lv_coord_t x, lv_coord_t y);
void lv_obj_move_children_by(struct _lv_obj_t * obj, lv_coord_t x_diff, lv_coord_t y_diff, bool ignore_floating);
+/**
+ * Transform a point using the angle and zoom style properties of an object
+ * @param obj pointer to an object whose style properties should be used
+ * @param p a point to transform, the result will be written back here too
+ * @param recursive consider the transformation properties of the parents too
+ * @param inv do the inverse of the transformation (-angle and 1/zoom)
+ */
+void lv_obj_transform_point(const struct _lv_obj_t * obj, lv_point_t * p, bool recursive, bool inv);
+
+/**
+ * Transform an area using the angle and zoom style properties of an object
+ * @param obj pointer to an object whose style properties should be used
+ * @param area an area to transform, the result will be written back here too
+ * @param recursive consider the transformation properties of the parents too
+ * @param inv do the inverse of the transformation (-angle and 1/zoom)
+ */
+void lv_obj_get_transformed_area(const struct _lv_obj_t * obj, lv_area_t * area, bool recursive, bool inv);
+
/**
* Mark an area of an object as invalid.
* The area will be truncated to the object's area and marked for redraw.
diff --git a/src/core/lv_obj_scroll.c b/src/core/lv_obj_scroll.c
index 6927acace..02b982614 100644
--- a/src/core/lv_obj_scroll.c
+++ b/src/core/lv_obj_scroll.c
@@ -31,7 +31,6 @@
/**********************
* STATIC PROTOTYPES
**********************/
-static void scroll_by_raw(lv_obj_t * obj, lv_coord_t x, lv_coord_t y);
static void scroll_x_anim(void * obj, int32_t v);
static void scroll_y_anim(void * obj, int32_t v);
static void scroll_anim_ready_cb(lv_anim_t * a);
@@ -345,14 +344,18 @@ void lv_obj_scroll_by(lv_obj_t * obj, lv_coord_t dx, lv_coord_t dy, lv_anim_enab
}
else {
/*Remove pending animations*/
- bool y_del = lv_anim_del(obj, scroll_y_anim);
- bool x_del = lv_anim_del(obj, scroll_x_anim);
- scroll_by_raw(obj, dx, dy);
- if(y_del || x_del) {
- lv_res_t res;
- res = lv_event_send(obj, LV_EVENT_SCROLL_END, NULL);
- if(res != LV_RES_OK) return;
- }
+ lv_anim_del(obj, scroll_y_anim);
+ lv_anim_del(obj, scroll_x_anim);
+
+ lv_res_t res;
+ res = lv_event_send(obj, LV_EVENT_SCROLL_BEGIN, NULL);
+ if(res != LV_RES_OK) return;
+
+ res = _lv_obj_scroll_by_raw(obj, dx, dy);
+ if(res != LV_RES_OK) return;
+
+ res = lv_event_send(obj, LV_EVENT_SCROLL_END, NULL);
+ if(res != LV_RES_OK) return;
}
}
@@ -406,6 +409,23 @@ void lv_obj_scroll_to_view_recursive(lv_obj_t * obj, lv_anim_enable_t anim_en)
}
}
+lv_res_t _lv_obj_scroll_by_raw(lv_obj_t * obj, lv_coord_t x, lv_coord_t y)
+{
+ if(x == 0 && y == 0) return LV_RES_OK;
+
+ lv_obj_allocate_spec_attr(obj);
+
+ obj->spec_attr->scroll.x += x;
+ obj->spec_attr->scroll.y += y;
+
+ lv_obj_move_children_by(obj, x, y, true);
+ lv_res_t res = lv_event_send(obj, LV_EVENT_SCROLL, NULL);
+ if(res != LV_RES_OK) return res;
+ lv_obj_invalidate(obj);
+ return LV_RES_OK;
+}
+
+
bool lv_obj_is_scrolling(const lv_obj_t * obj)
{
lv_indev_t * indev = lv_indev_get_next(NULL);
@@ -648,29 +668,15 @@ void lv_obj_readjust_scroll(lv_obj_t * obj, lv_anim_enable_t anim_en)
* STATIC FUNCTIONS
**********************/
-static void scroll_by_raw(lv_obj_t * obj, lv_coord_t x, lv_coord_t y)
-{
- if(x == 0 && y == 0) return;
-
- lv_obj_allocate_spec_attr(obj);
-
- obj->spec_attr->scroll.x += x;
- obj->spec_attr->scroll.y += y;
-
- lv_obj_move_children_by(obj, x, y, true);
- lv_res_t res = lv_event_send(obj, LV_EVENT_SCROLL, NULL);
- if(res != LV_RES_OK) return;
- lv_obj_invalidate(obj);
-}
static void scroll_x_anim(void * obj, int32_t v)
{
- scroll_by_raw(obj, v + lv_obj_get_scroll_x(obj), 0);
+ _lv_obj_scroll_by_raw(obj, v + lv_obj_get_scroll_x(obj), 0);
}
static void scroll_y_anim(void * obj, int32_t v)
{
- scroll_by_raw(obj, 0, v + lv_obj_get_scroll_y(obj));
+ _lv_obj_scroll_by_raw(obj, 0, v + lv_obj_get_scroll_y(obj));
}
static void scroll_anim_ready_cb(lv_anim_t * a)
@@ -746,7 +752,7 @@ static void scroll_area_into_view(const lv_area_t * area, lv_obj_t * child, lv_p
x_scroll = left_diff;
/*Do not let scrolling in*/
lv_coord_t sl = lv_obj_get_scroll_left(parent);
- if(sl + x_scroll > 0) x_scroll = 0;
+ if(sl - x_scroll < 0) x_scroll = 0;
}
else if(right_diff > 0) {
x_scroll = -right_diff;
diff --git a/src/core/lv_obj_scroll.h b/src/core/lv_obj_scroll.h
index c9fdd720d..e1da245b7 100644
--- a/src/core/lv_obj_scroll.h
+++ b/src/core/lv_obj_scroll.h
@@ -15,6 +15,7 @@ extern "C" {
*********************/
#include "../misc/lv_area.h"
#include "../misc/lv_anim.h"
+#include "../misc/lv_types.h"
/*********************
* DEFINES
@@ -248,6 +249,18 @@ void lv_obj_scroll_to_view(struct _lv_obj_t * obj, lv_anim_enable_t anim_en);
*/
void lv_obj_scroll_to_view_recursive(struct _lv_obj_t * obj, lv_anim_enable_t anim_en);
+
+/**
+ * Low level function to scroll by given x and y coordinates.
+ * `LV_EVENT_SCROLL` is sent.
+ * @param obj pointer to an object to scroll
+ * @param x pixels to scroll horizontally
+ * @param y pixels to scroll vertically
+ * @return `LV_RES_INV`: to object was deleted in `LV_EVENT_SCROLL`;
+ * `LV_RES_OK`: if the object is still valid
+ */
+lv_res_t _lv_obj_scroll_by_raw(struct _lv_obj_t * obj, lv_coord_t x, lv_coord_t y);
+
/**
* Tell whether an object is being scrolled or not at this moment
* @param obj pointer to an object
diff --git a/src/core/lv_obj_style.c b/src/core/lv_obj_style.c
index 82e1ebba2..c6cdf825c 100644
--- a/src/core/lv_obj_style.c
+++ b/src/core/lv_obj_style.c
@@ -44,14 +44,14 @@ typedef enum {
**********************/
static lv_style_t * get_local_style(lv_obj_t * obj, lv_style_selector_t selector);
static _lv_obj_style_t * get_trans_style(lv_obj_t * obj, uint32_t part);
-static bool get_prop_core(const lv_obj_t * obj, lv_part_t part, lv_style_prop_t prop, lv_style_value_t * v);
-static lv_style_value_t apply_color_filter(const lv_obj_t * obj, uint32_t part, lv_style_value_t v);
+static lv_style_res_t get_prop_core(const lv_obj_t * obj, lv_part_t part, lv_style_prop_t prop, lv_style_value_t * v);
static void report_style_change_core(void * style, lv_obj_t * obj);
static void refresh_children_style(lv_obj_t * obj);
static bool trans_del(lv_obj_t * obj, lv_part_t part, lv_style_prop_t prop, trans_t * tr_limit);
static void trans_anim_cb(void * _tr, int32_t v);
static void trans_anim_start_cb(lv_anim_t * a);
static void trans_anim_ready_cb(lv_anim_t * a);
+static lv_layer_type_t calculate_layer_type(lv_obj_t * obj);
static void fade_anim_cb(void * obj, int32_t v);
static void fade_in_anim_ready(lv_anim_t * a);
@@ -174,7 +174,12 @@ void lv_obj_refresh_style(lv_obj_t * obj, lv_style_selector_t selector, lv_style
lv_part_t part = lv_obj_style_get_selector_part(selector);
- if(prop & LV_STYLE_PROP_LAYOUT_REFR) {
+ bool is_layout_refr = lv_style_prop_has_flag(prop, LV_STYLE_PROP_LAYOUT_REFR);
+ bool is_ext_draw = lv_style_prop_has_flag(prop, LV_STYLE_PROP_EXT_DRAW);
+ bool is_inheritable = lv_style_prop_has_flag(prop, LV_STYLE_PROP_INHERIT);
+ bool is_layer_refr = lv_style_prop_has_flag(prop, LV_STYLE_PROP_LAYER_REFR);
+
+ if(is_layout_refr) {
if(part == LV_PART_ANY ||
part == LV_PART_MAIN ||
lv_obj_get_style_height(obj, 0) == LV_SIZE_CONTENT ||
@@ -183,19 +188,27 @@ void lv_obj_refresh_style(lv_obj_t * obj, lv_style_selector_t selector, lv_style
lv_obj_mark_layout_as_dirty(obj);
}
}
- if((part == LV_PART_ANY || part == LV_PART_MAIN) && (prop == LV_STYLE_PROP_ANY ||
- (prop & LV_STYLE_PROP_PARENT_LAYOUT_REFR))) {
+ if((part == LV_PART_ANY || part == LV_PART_MAIN) && (prop == LV_STYLE_PROP_ANY || is_layout_refr)) {
lv_obj_t * parent = lv_obj_get_parent(obj);
if(parent) lv_obj_mark_layout_as_dirty(parent);
}
- if(prop == LV_STYLE_PROP_ANY || (prop & LV_STYLE_PROP_EXT_DRAW)) {
+ /*Cache the layer type*/
+ if((part == LV_PART_ANY || part == LV_PART_MAIN) && is_layer_refr) {
+ lv_layer_type_t layer_type = calculate_layer_type(obj);
+ if(obj->spec_attr) obj->spec_attr->layer_type = layer_type;
+ else if(layer_type != LV_LAYER_TYPE_NONE) {
+ lv_obj_allocate_spec_attr(obj);
+ obj->spec_attr->layer_type = layer_type;
+ }
+ }
+
+ if(prop == LV_STYLE_PROP_ANY || is_ext_draw) {
lv_obj_refresh_ext_draw_size(obj);
}
lv_obj_invalidate(obj);
- if(prop == LV_STYLE_PROP_ANY ||
- ((prop & LV_STYLE_PROP_INHERIT) && ((prop & LV_STYLE_PROP_EXT_DRAW) || (prop & LV_STYLE_PROP_LAYOUT_REFR)))) {
+ if(prop == LV_STYLE_PROP_ANY || (is_inheritable && (is_ext_draw || is_layout_refr))) {
if(part != LV_PART_SCROLLBAR) {
refresh_children_style(obj);
}
@@ -210,19 +223,15 @@ void lv_obj_enable_style_refresh(bool en)
lv_style_value_t lv_obj_get_style_prop(const lv_obj_t * obj, lv_part_t part, lv_style_prop_t prop)
{
lv_style_value_t value_act;
- bool inherit = prop & LV_STYLE_PROP_INHERIT ? true : false;
- bool filter = prop & LV_STYLE_PROP_FILTER ? true : false;
- if(filter) {
- prop &= ~LV_STYLE_PROP_FILTER;
- }
- bool found = false;
+ bool inheritable = lv_style_prop_has_flag(prop, LV_STYLE_PROP_INHERIT);
+ lv_style_res_t found = LV_STYLE_RES_NOT_FOUND;
while(obj) {
found = get_prop_core(obj, part, prop, &value_act);
- if(found) break;
- if(!inherit) break;
+ if(found == LV_STYLE_RES_FOUND) break;
+ if(!inheritable) break;
/*If not found, check the `MAIN` style first*/
- if(part != LV_PART_MAIN) {
+ if(found != LV_STYLE_RES_INHERIT && part != LV_PART_MAIN) {
part = LV_PART_MAIN;
continue;
}
@@ -231,7 +240,7 @@ lv_style_value_t lv_obj_get_style_prop(const lv_obj_t * obj, lv_part_t part, lv_
obj = lv_obj_get_parent(obj);
}
- if(!found) {
+ if(found != LV_STYLE_RES_FOUND) {
if(part == LV_PART_MAIN && (prop == LV_STYLE_WIDTH || prop == LV_STYLE_HEIGHT)) {
const lv_obj_class_t * cls = obj->class_p;
while(cls) {
@@ -244,13 +253,17 @@ lv_style_value_t lv_obj_get_style_prop(const lv_obj_t * obj, lv_part_t part, lv_
cls = cls->base_class;
}
- value_act.num = prop == LV_STYLE_WIDTH ? cls->width_def : cls->height_def;
+ if(cls) {
+ value_act.num = prop == LV_STYLE_WIDTH ? cls->width_def : cls->height_def;
+ }
+ else {
+ value_act.num = 0;
+ }
}
else {
value_act = lv_style_prop_get_default(prop);
}
}
- if(filter) value_act = apply_color_filter(obj, part, value_act);
return value_act;
}
@@ -262,9 +275,17 @@ void lv_obj_set_local_style_prop(lv_obj_t * obj, lv_style_prop_t prop, lv_style_
lv_obj_refresh_style(obj, selector, prop);
}
+void lv_obj_set_local_style_prop_meta(lv_obj_t * obj, lv_style_prop_t prop, uint16_t meta,
+ lv_style_selector_t selector)
+{
+ lv_style_t * style = get_local_style(obj, selector);
+ lv_style_set_prop_meta(style, prop, meta);
+ lv_obj_refresh_style(obj, selector, prop);
+}
+
-lv_res_t lv_obj_get_local_style_prop(lv_obj_t * obj, lv_style_prop_t prop, lv_style_value_t * value,
- lv_style_selector_t selector)
+lv_style_res_t lv_obj_get_local_style_prop(lv_obj_t * obj, lv_style_prop_t prop, lv_style_value_t * value,
+ lv_style_selector_t selector)
{
uint32_t i;
for(i = 0; i < obj->style_cnt; i++) {
@@ -274,7 +295,7 @@ lv_res_t lv_obj_get_local_style_prop(lv_obj_t * obj, lv_style_prop_t prop, lv_st
}
}
- return LV_RES_INV;
+ return LV_STYLE_RES_NOT_FOUND;
}
bool lv_obj_remove_local_style_prop(lv_obj_t * obj, lv_style_prop_t prop, lv_style_selector_t selector)
@@ -293,7 +314,12 @@ bool lv_obj_remove_local_style_prop(lv_obj_t * obj, lv_style_prop_t prop, lv_sty
/*The style is not found*/
if(i == obj->style_cnt) return false;
- return lv_style_remove_prop(obj->styles[i].style, prop);
+ lv_res_t res = lv_style_remove_prop(obj->styles[i].style, prop);
+ if(res == LV_RES_OK) {
+ lv_obj_refresh_style(obj, selector, prop);
+ }
+
+ return res;
}
void _lv_obj_style_create_transition(lv_obj_t * obj, lv_part_t part, lv_state_t prev_state, lv_state_t new_state,
@@ -320,7 +346,7 @@ void _lv_obj_style_create_transition(lv_obj_t * obj, lv_part_t part, lv_state_t
if(tr_dsc->prop == LV_STYLE_RADIUS) {
if(v1.num == LV_RADIUS_CIRCLE || v2.num == LV_RADIUS_CIRCLE) {
lv_coord_t whalf = lv_obj_get_width(obj) / 2;
- lv_coord_t hhalf = lv_obj_get_width(obj) / 2;
+ lv_coord_t hhalf = lv_obj_get_height(obj) / 2;
if(v1.num == LV_RADIUS_CIRCLE) v1.num = LV_MIN(whalf + 1, hhalf + 1);
if(v2.num == LV_RADIUS_CIRCLE) v2.num = LV_MIN(whalf + 1, hhalf + 1);
}
@@ -331,28 +357,37 @@ void _lv_obj_style_create_transition(lv_obj_t * obj, lv_part_t part, lv_state_t
if(tr == NULL) return;
tr->start_value = v1;
tr->end_value = v2;
+ tr->obj = obj;
+ tr->prop = tr_dsc->prop;
+ tr->selector = part;
- if(tr) {
- tr->obj = obj;
- tr->prop = tr_dsc->prop;
- tr->selector = part;
-
- lv_anim_t a;
- lv_anim_init(&a);
- lv_anim_set_var(&a, tr);
- lv_anim_set_exec_cb(&a, trans_anim_cb);
- lv_anim_set_start_cb(&a, trans_anim_start_cb);
- lv_anim_set_ready_cb(&a, trans_anim_ready_cb);
- lv_anim_set_values(&a, 0x00, 0xFF);
- lv_anim_set_time(&a, tr_dsc->time);
- lv_anim_set_delay(&a, tr_dsc->delay);
- lv_anim_set_path_cb(&a, tr_dsc->path_cb);
- lv_anim_set_early_apply(&a, false);
+ lv_anim_t a;
+ lv_anim_init(&a);
+ lv_anim_set_var(&a, tr);
+ lv_anim_set_exec_cb(&a, trans_anim_cb);
+ lv_anim_set_start_cb(&a, trans_anim_start_cb);
+ lv_anim_set_ready_cb(&a, trans_anim_ready_cb);
+ lv_anim_set_values(&a, 0x00, 0xFF);
+ lv_anim_set_time(&a, tr_dsc->time);
+ lv_anim_set_delay(&a, tr_dsc->delay);
+ lv_anim_set_path_cb(&a, tr_dsc->path_cb);
+ lv_anim_set_early_apply(&a, false);
#if LV_USE_USER_DATA
- a.user_data = tr_dsc->user_data;
+ a.user_data = tr_dsc->user_data;
#endif
- lv_anim_start(&a);
+ lv_anim_start(&a);
+}
+
+
+lv_style_value_t _lv_obj_style_apply_color_filter(const lv_obj_t * obj, uint32_t part, lv_style_value_t v)
+{
+ if(obj == NULL) return v;
+ const lv_color_filter_dsc_t * f = lv_obj_get_style_color_filter_dsc(obj, part);
+ if(f && f->filter_cb) {
+ lv_opa_t f_opa = lv_obj_get_style_color_filter_opa(obj, part);
+ if(f_opa != 0) v.color = f->filter_cb(f, v.color, f_opa);
}
+ return v;
}
_lv_style_state_cmp_t _lv_obj_style_state_compare(lv_obj_t * obj, lv_state_t state1, lv_state_t state2)
@@ -534,7 +569,7 @@ static _lv_obj_style_t * get_trans_style(lv_obj_t * obj, lv_style_selector_t se
}
-static bool get_prop_core(const lv_obj_t * obj, lv_part_t part, lv_style_prop_t prop, lv_style_value_t * v)
+static lv_style_res_t get_prop_core(const lv_obj_t * obj, lv_part_t part, lv_style_prop_t prop, lv_style_value_t * v)
{
uint8_t group = 1 << _lv_style_get_prop_group(prop);
int32_t weight = -1;
@@ -543,7 +578,7 @@ static bool get_prop_core(const lv_obj_t * obj, lv_part_t part, lv_style_prop_t
lv_style_value_t value_tmp;
bool skip_trans = obj->skip_trans;
uint32_t i;
- bool found;
+ lv_style_res_t found;
for(i = 0; i < obj->style_cnt; i++) {
_lv_obj_style_t * obj_style = &obj->styles[i];
if(obj_style->is_trans == false) break;
@@ -554,20 +589,22 @@ static bool get_prop_core(const lv_obj_t * obj, lv_part_t part, lv_style_prop_t
if(part_act != part) continue;
if((obj_style->style->has_group & group) == 0) continue;
found = lv_style_get_prop(obj_style->style, prop, &value_tmp);
- if(found) {
+ if(found == LV_STYLE_RES_FOUND) {
*v = value_tmp;
- return true;
+ return LV_STYLE_RES_FOUND;
+ }
+ else if(found == LV_STYLE_RES_INHERIT) {
+ return LV_STYLE_RES_INHERIT;
}
}
for(; i < obj->style_cnt; i++) {
+ if((obj->styles[i].style->has_group & group) == 0) continue;
_lv_obj_style_t * obj_style = &obj->styles[i];
lv_part_t part_act = lv_obj_style_get_selector_part(obj->styles[i].selector);
lv_state_t state_act = lv_obj_style_get_selector_state(obj->styles[i].selector);
if(part_act != part) continue;
- if((obj_style->style->has_group & group) == 0) continue;
-
/*Be sure the style not specifies other state than the requested.
*E.g. For HOVER+PRESS object state, HOVER style only is OK, but HOVER+FOCUS style is not*/
if((state_act & state_inv)) continue;
@@ -577,34 +614,26 @@ static bool get_prop_core(const lv_obj_t * obj, lv_part_t part, lv_style_prop_t
found = lv_style_get_prop(obj_style->style, prop, &value_tmp);
- if(found) {
+ if(found == LV_STYLE_RES_FOUND) {
if(state_act == state) {
*v = value_tmp;
- return true;
+ return LV_STYLE_RES_FOUND;
}
if(weight < state_act) {
weight = state_act;
*v = value_tmp;
}
}
+ else if(found == LV_STYLE_RES_INHERIT) {
+ return LV_STYLE_RES_INHERIT;
+ }
}
if(weight >= 0) {
*v = value_tmp;
- return true;
- }
- else return false;
-}
-
-static lv_style_value_t apply_color_filter(const lv_obj_t * obj, uint32_t part, lv_style_value_t v)
-{
- if(obj == NULL) return v;
- const lv_color_filter_dsc_t * f = lv_obj_get_style_color_filter_dsc(obj, part);
- if(f && f->filter_cb) {
- lv_opa_t f_opa = lv_obj_get_style_color_filter_opa(obj, part);
- if(f_opa != 0) v.color = f->filter_cb(f, v.color, f_opa);
+ return LV_STYLE_RES_FOUND;
}
- return v;
+ else return LV_STYLE_RES_NOT_FOUND;
}
/**
@@ -669,19 +698,21 @@ static bool trans_del(lv_obj_t * obj, lv_part_t part, lv_style_prop_t prop, tran
tr_prev = _lv_ll_get_prev(&LV_GC_ROOT(_lv_obj_style_trans_ll), tr);
if(tr->obj == obj && (part == tr->selector || part == LV_PART_ANY) && (prop == tr->prop || prop == LV_STYLE_PROP_ANY)) {
- /*Remove the transitioned property from trans. style
+ /*Remove any transitioned properties from the trans. style
*to allow changing it by normal styles*/
uint32_t i;
for(i = 0; i < obj->style_cnt; i++) {
if(obj->styles[i].is_trans && (part == LV_PART_ANY || obj->styles[i].selector == part)) {
lv_style_remove_prop(obj->styles[i].style, tr->prop);
- lv_anim_del(tr, NULL);
- _lv_ll_remove(&LV_GC_ROOT(_lv_obj_style_trans_ll), tr);
- lv_mem_free(tr);
- removed = true;
}
}
+ /*Free the transition descriptor too*/
+ lv_anim_del(tr, NULL);
+ _lv_ll_remove(&LV_GC_ROOT(_lv_obj_style_trans_ll), tr);
+ lv_mem_free(tr);
+ removed = true;
+
}
tr = tr_prev;
}
@@ -810,6 +841,18 @@ static void trans_anim_ready_cb(lv_anim_t * a)
}
}
+static lv_layer_type_t calculate_layer_type(lv_obj_t * obj)
+{
+ if(lv_obj_get_style_transform_angle(obj, 0) != 0) return LV_LAYER_TYPE_TRANSFORM;
+ if(lv_obj_get_style_transform_zoom(obj, 0) != 256) return LV_LAYER_TYPE_TRANSFORM;
+ if(lv_obj_get_style_opa(obj, 0) != LV_OPA_COVER) return LV_LAYER_TYPE_SIMPLE;
+
+#if LV_DRAW_COMPLEX
+ if(lv_obj_get_style_blend_mode(obj, 0) != LV_BLEND_MODE_NORMAL) return LV_LAYER_TYPE_SIMPLE;
+#endif
+ return LV_LAYER_TYPE_NONE;
+}
+
static void fade_anim_cb(void * obj, int32_t v)
{
lv_obj_set_style_opa(obj, v, 0);
diff --git a/src/core/lv_obj_style.h b/src/core/lv_obj_style.h
index 7fb2723c8..5d122ca62 100644
--- a/src/core/lv_obj_style.h
+++ b/src/core/lv_obj_style.h
@@ -140,8 +140,11 @@ lv_style_value_t lv_obj_get_style_prop(const struct _lv_obj_t * obj, lv_part_t p
void lv_obj_set_local_style_prop(struct _lv_obj_t * obj, lv_style_prop_t prop, lv_style_value_t value,
lv_style_selector_t selector);
-lv_res_t lv_obj_get_local_style_prop(struct _lv_obj_t * obj, lv_style_prop_t prop, lv_style_value_t * value,
- lv_style_selector_t selector);
+void lv_obj_set_local_style_prop_meta(struct _lv_obj_t * obj, lv_style_prop_t prop, uint16_t meta,
+ lv_style_selector_t selector);
+
+lv_style_res_t lv_obj_get_local_style_prop(struct _lv_obj_t * obj, lv_style_prop_t prop, lv_style_value_t * value,
+ lv_style_selector_t selector);
/**
* Remove a local style property from a part of an object with a given state.
@@ -152,6 +155,11 @@ lv_res_t lv_obj_get_local_style_prop(struct _lv_obj_t * obj, lv_style_prop_t pro
*/
bool lv_obj_remove_local_style_prop(struct _lv_obj_t * obj, lv_style_prop_t prop, lv_style_selector_t selector);
+/**
+ * Used internally for color filtering
+ */
+lv_style_value_t _lv_obj_style_apply_color_filter(const struct _lv_obj_t * obj, uint32_t part, lv_style_value_t v);
+
/**
* Used internally to create a style transition
* @param obj
diff --git a/src/core/lv_obj_style_gen.c b/src/core/lv_obj_style_gen.c
index 8eb7ebe6d..64a0bb28c 100644
--- a/src/core/lv_obj_style_gen.c
+++ b/src/core/lv_obj_style_gen.c
@@ -120,6 +120,22 @@ void lv_obj_set_style_transform_angle(struct _lv_obj_t * obj, lv_coord_t value,
lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSFORM_ANGLE, v, selector);
}
+void lv_obj_set_style_transform_pivot_x(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector)
+{
+ lv_style_value_t v = {
+ .num = (int32_t)value
+ };
+ lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSFORM_PIVOT_X, v, selector);
+}
+
+void lv_obj_set_style_transform_pivot_y(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector)
+{
+ lv_style_value_t v = {
+ .num = (int32_t)value
+ };
+ lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSFORM_PIVOT_Y, v, selector);
+}
+
void lv_obj_set_style_pad_top(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector)
{
lv_style_value_t v = {
@@ -176,14 +192,6 @@ void lv_obj_set_style_bg_color(struct _lv_obj_t * obj, lv_color_t value, lv_styl
lv_obj_set_local_style_prop(obj, LV_STYLE_BG_COLOR, v, selector);
}
-void lv_obj_set_style_bg_color_filtered(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector)
-{
- lv_style_value_t v = {
- .color = value
- };
- lv_obj_set_local_style_prop(obj, LV_STYLE_BG_COLOR_FILTERED, v, selector);
-}
-
void lv_obj_set_style_bg_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector)
{
lv_style_value_t v = {
@@ -200,14 +208,6 @@ void lv_obj_set_style_bg_grad_color(struct _lv_obj_t * obj, lv_color_t value, lv
lv_obj_set_local_style_prop(obj, LV_STYLE_BG_GRAD_COLOR, v, selector);
}
-void lv_obj_set_style_bg_grad_color_filtered(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector)
-{
- lv_style_value_t v = {
- .color = value
- };
- lv_obj_set_local_style_prop(obj, LV_STYLE_BG_GRAD_COLOR_FILTERED, v, selector);
-}
-
void lv_obj_set_style_bg_grad_dir(struct _lv_obj_t * obj, lv_grad_dir_t value, lv_style_selector_t selector)
{
lv_style_value_t v = {
@@ -272,14 +272,6 @@ void lv_obj_set_style_bg_img_recolor(struct _lv_obj_t * obj, lv_color_t value, l
lv_obj_set_local_style_prop(obj, LV_STYLE_BG_IMG_RECOLOR, v, selector);
}
-void lv_obj_set_style_bg_img_recolor_filtered(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector)
-{
- lv_style_value_t v = {
- .color = value
- };
- lv_obj_set_local_style_prop(obj, LV_STYLE_BG_IMG_RECOLOR_FILTERED, v, selector);
-}
-
void lv_obj_set_style_bg_img_recolor_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector)
{
lv_style_value_t v = {
@@ -304,14 +296,6 @@ void lv_obj_set_style_border_color(struct _lv_obj_t * obj, lv_color_t value, lv_
lv_obj_set_local_style_prop(obj, LV_STYLE_BORDER_COLOR, v, selector);
}
-void lv_obj_set_style_border_color_filtered(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector)
-{
- lv_style_value_t v = {
- .color = value
- };
- lv_obj_set_local_style_prop(obj, LV_STYLE_BORDER_COLOR_FILTERED, v, selector);
-}
-
void lv_obj_set_style_border_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector)
{
lv_style_value_t v = {
@@ -360,14 +344,6 @@ void lv_obj_set_style_outline_color(struct _lv_obj_t * obj, lv_color_t value, lv
lv_obj_set_local_style_prop(obj, LV_STYLE_OUTLINE_COLOR, v, selector);
}
-void lv_obj_set_style_outline_color_filtered(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector)
-{
- lv_style_value_t v = {
- .color = value
- };
- lv_obj_set_local_style_prop(obj, LV_STYLE_OUTLINE_COLOR_FILTERED, v, selector);
-}
-
void lv_obj_set_style_outline_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector)
{
lv_style_value_t v = {
@@ -424,14 +400,6 @@ void lv_obj_set_style_shadow_color(struct _lv_obj_t * obj, lv_color_t value, lv_
lv_obj_set_local_style_prop(obj, LV_STYLE_SHADOW_COLOR, v, selector);
}
-void lv_obj_set_style_shadow_color_filtered(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector)
-{
- lv_style_value_t v = {
- .color = value
- };
- lv_obj_set_local_style_prop(obj, LV_STYLE_SHADOW_COLOR_FILTERED, v, selector);
-}
-
void lv_obj_set_style_shadow_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector)
{
lv_style_value_t v = {
@@ -456,14 +424,6 @@ void lv_obj_set_style_img_recolor(struct _lv_obj_t * obj, lv_color_t value, lv_s
lv_obj_set_local_style_prop(obj, LV_STYLE_IMG_RECOLOR, v, selector);
}
-void lv_obj_set_style_img_recolor_filtered(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector)
-{
- lv_style_value_t v = {
- .color = value
- };
- lv_obj_set_local_style_prop(obj, LV_STYLE_IMG_RECOLOR_FILTERED, v, selector);
-}
-
void lv_obj_set_style_img_recolor_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector)
{
lv_style_value_t v = {
@@ -512,14 +472,6 @@ void lv_obj_set_style_line_color(struct _lv_obj_t * obj, lv_color_t value, lv_st
lv_obj_set_local_style_prop(obj, LV_STYLE_LINE_COLOR, v, selector);
}
-void lv_obj_set_style_line_color_filtered(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector)
-{
- lv_style_value_t v = {
- .color = value
- };
- lv_obj_set_local_style_prop(obj, LV_STYLE_LINE_COLOR_FILTERED, v, selector);
-}
-
void lv_obj_set_style_line_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector)
{
lv_style_value_t v = {
@@ -552,14 +504,6 @@ void lv_obj_set_style_arc_color(struct _lv_obj_t * obj, lv_color_t value, lv_sty
lv_obj_set_local_style_prop(obj, LV_STYLE_ARC_COLOR, v, selector);
}
-void lv_obj_set_style_arc_color_filtered(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector)
-{
- lv_style_value_t v = {
- .color = value
- };
- lv_obj_set_local_style_prop(obj, LV_STYLE_ARC_COLOR_FILTERED, v, selector);
-}
-
void lv_obj_set_style_arc_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector)
{
lv_style_value_t v = {
@@ -584,14 +528,6 @@ void lv_obj_set_style_text_color(struct _lv_obj_t * obj, lv_color_t value, lv_st
lv_obj_set_local_style_prop(obj, LV_STYLE_TEXT_COLOR, v, selector);
}
-void lv_obj_set_style_text_color_filtered(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector)
-{
- lv_style_value_t v = {
- .color = value
- };
- lv_obj_set_local_style_prop(obj, LV_STYLE_TEXT_COLOR_FILTERED, v, selector);
-}
-
void lv_obj_set_style_text_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector)
{
lv_style_value_t v = {
@@ -664,8 +600,7 @@ void lv_obj_set_style_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selec
lv_obj_set_local_style_prop(obj, LV_STYLE_OPA, v, selector);
}
-void lv_obj_set_style_color_filter_dsc(struct _lv_obj_t * obj, const lv_color_filter_dsc_t * value,
- lv_style_selector_t selector)
+void lv_obj_set_style_color_filter_dsc(struct _lv_obj_t * obj, const lv_color_filter_dsc_t * value, lv_style_selector_t selector)
{
lv_style_value_t v = {
.ptr = value
@@ -681,6 +616,14 @@ void lv_obj_set_style_color_filter_opa(struct _lv_obj_t * obj, lv_opa_t value, l
lv_obj_set_local_style_prop(obj, LV_STYLE_COLOR_FILTER_OPA, v, selector);
}
+void lv_obj_set_style_anim(struct _lv_obj_t * obj, const lv_anim_t * value, lv_style_selector_t selector)
+{
+ lv_style_value_t v = {
+ .ptr = value
+ };
+ lv_obj_set_local_style_prop(obj, LV_STYLE_ANIM, v, selector);
+}
+
void lv_obj_set_style_anim_time(struct _lv_obj_t * obj, uint32_t value, lv_style_selector_t selector)
{
lv_style_value_t v = {
@@ -697,8 +640,7 @@ void lv_obj_set_style_anim_speed(struct _lv_obj_t * obj, uint32_t value, lv_styl
lv_obj_set_local_style_prop(obj, LV_STYLE_ANIM_SPEED, v, selector);
}
-void lv_obj_set_style_transition(struct _lv_obj_t * obj, const lv_style_transition_dsc_t * value,
- lv_style_selector_t selector)
+void lv_obj_set_style_transition(struct _lv_obj_t * obj, const lv_style_transition_dsc_t * value, lv_style_selector_t selector)
{
lv_style_value_t v = {
.ptr = value
diff --git a/src/core/lv_obj_style_gen.h b/src/core/lv_obj_style_gen.h
index e4383d5ce..576927d9a 100644
--- a/src/core/lv_obj_style_gen.h
+++ b/src/core/lv_obj_style_gen.h
@@ -88,6 +88,18 @@ static inline lv_coord_t lv_obj_get_style_transform_angle(const struct _lv_obj_t
return (lv_coord_t)v.num;
}
+static inline lv_coord_t lv_obj_get_style_transform_pivot_x(const struct _lv_obj_t * obj, uint32_t part)
+{
+ lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSFORM_PIVOT_X);
+ return (lv_coord_t)v.num;
+}
+
+static inline lv_coord_t lv_obj_get_style_transform_pivot_y(const struct _lv_obj_t * obj, uint32_t part)
+{
+ lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSFORM_PIVOT_Y);
+ return (lv_coord_t)v.num;
+}
+
static inline lv_coord_t lv_obj_get_style_pad_top(const struct _lv_obj_t * obj, uint32_t part)
{
lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_PAD_TOP);
@@ -132,7 +144,7 @@ static inline lv_color_t lv_obj_get_style_bg_color(const struct _lv_obj_t * obj,
static inline lv_color_t lv_obj_get_style_bg_color_filtered(const struct _lv_obj_t * obj, uint32_t part)
{
- lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_COLOR_FILTERED);
+ lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_BG_COLOR));
return v.color;
}
@@ -150,7 +162,7 @@ static inline lv_color_t lv_obj_get_style_bg_grad_color(const struct _lv_obj_t *
static inline lv_color_t lv_obj_get_style_bg_grad_color_filtered(const struct _lv_obj_t * obj, uint32_t part)
{
- lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_GRAD_COLOR_FILTERED);
+ lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_BG_GRAD_COLOR));
return v.color;
}
@@ -204,7 +216,7 @@ static inline lv_color_t lv_obj_get_style_bg_img_recolor(const struct _lv_obj_t
static inline lv_color_t lv_obj_get_style_bg_img_recolor_filtered(const struct _lv_obj_t * obj, uint32_t part)
{
- lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_IMG_RECOLOR_FILTERED);
+ lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_BG_IMG_RECOLOR));
return v.color;
}
@@ -228,7 +240,7 @@ static inline lv_color_t lv_obj_get_style_border_color(const struct _lv_obj_t *
static inline lv_color_t lv_obj_get_style_border_color_filtered(const struct _lv_obj_t * obj, uint32_t part)
{
- lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BORDER_COLOR_FILTERED);
+ lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_BORDER_COLOR));
return v.color;
}
@@ -270,7 +282,7 @@ static inline lv_color_t lv_obj_get_style_outline_color(const struct _lv_obj_t *
static inline lv_color_t lv_obj_get_style_outline_color_filtered(const struct _lv_obj_t * obj, uint32_t part)
{
- lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_OUTLINE_COLOR_FILTERED);
+ lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_OUTLINE_COLOR));
return v.color;
}
@@ -318,7 +330,7 @@ static inline lv_color_t lv_obj_get_style_shadow_color(const struct _lv_obj_t *
static inline lv_color_t lv_obj_get_style_shadow_color_filtered(const struct _lv_obj_t * obj, uint32_t part)
{
- lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_SHADOW_COLOR_FILTERED);
+ lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_SHADOW_COLOR));
return v.color;
}
@@ -342,7 +354,7 @@ static inline lv_color_t lv_obj_get_style_img_recolor(const struct _lv_obj_t * o
static inline lv_color_t lv_obj_get_style_img_recolor_filtered(const struct _lv_obj_t * obj, uint32_t part)
{
- lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_IMG_RECOLOR_FILTERED);
+ lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_IMG_RECOLOR));
return v.color;
}
@@ -384,7 +396,7 @@ static inline lv_color_t lv_obj_get_style_line_color(const struct _lv_obj_t * ob
static inline lv_color_t lv_obj_get_style_line_color_filtered(const struct _lv_obj_t * obj, uint32_t part)
{
- lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_LINE_COLOR_FILTERED);
+ lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_LINE_COLOR));
return v.color;
}
@@ -414,7 +426,7 @@ static inline lv_color_t lv_obj_get_style_arc_color(const struct _lv_obj_t * obj
static inline lv_color_t lv_obj_get_style_arc_color_filtered(const struct _lv_obj_t * obj, uint32_t part)
{
- lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_ARC_COLOR_FILTERED);
+ lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_ARC_COLOR));
return v.color;
}
@@ -438,7 +450,7 @@ static inline lv_color_t lv_obj_get_style_text_color(const struct _lv_obj_t * ob
static inline lv_color_t lv_obj_get_style_text_color_filtered(const struct _lv_obj_t * obj, uint32_t part)
{
- lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TEXT_COLOR_FILTERED);
+ lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_TEXT_COLOR));
return v.color;
}
@@ -496,8 +508,7 @@ static inline lv_opa_t lv_obj_get_style_opa(const struct _lv_obj_t * obj, uint32
return (lv_opa_t)v.num;
}
-static inline const lv_color_filter_dsc_t * lv_obj_get_style_color_filter_dsc(const struct _lv_obj_t * obj,
- uint32_t part)
+static inline const lv_color_filter_dsc_t * lv_obj_get_style_color_filter_dsc(const struct _lv_obj_t * obj, uint32_t part)
{
lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_COLOR_FILTER_DSC);
return (const lv_color_filter_dsc_t *)v.ptr;
@@ -509,6 +520,12 @@ static inline lv_opa_t lv_obj_get_style_color_filter_opa(const struct _lv_obj_t
return (lv_opa_t)v.num;
}
+static inline const lv_anim_t * lv_obj_get_style_anim(const struct _lv_obj_t * obj, uint32_t part)
+{
+ lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_ANIM);
+ return (const lv_anim_t *)v.ptr;
+}
+
static inline uint32_t lv_obj_get_style_anim_time(const struct _lv_obj_t * obj, uint32_t part)
{
lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_ANIM_TIME);
@@ -560,6 +577,8 @@ void lv_obj_set_style_translate_x(struct _lv_obj_t * obj, lv_coord_t value, lv_s
void lv_obj_set_style_translate_y(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector);
void lv_obj_set_style_transform_zoom(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector);
void lv_obj_set_style_transform_angle(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector);
+void lv_obj_set_style_transform_pivot_x(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector);
+void lv_obj_set_style_transform_pivot_y(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector);
void lv_obj_set_style_pad_top(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector);
void lv_obj_set_style_pad_bottom(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector);
void lv_obj_set_style_pad_left(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector);
@@ -567,10 +586,8 @@ void lv_obj_set_style_pad_right(struct _lv_obj_t * obj, lv_coord_t value, lv_sty
void lv_obj_set_style_pad_row(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector);
void lv_obj_set_style_pad_column(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector);
void lv_obj_set_style_bg_color(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector);
-void lv_obj_set_style_bg_color_filtered(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector);
void lv_obj_set_style_bg_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector);
void lv_obj_set_style_bg_grad_color(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector);
-void lv_obj_set_style_bg_grad_color_filtered(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector);
void lv_obj_set_style_bg_grad_dir(struct _lv_obj_t * obj, lv_grad_dir_t value, lv_style_selector_t selector);
void lv_obj_set_style_bg_main_stop(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector);
void lv_obj_set_style_bg_grad_stop(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector);
@@ -579,18 +596,15 @@ void lv_obj_set_style_bg_dither_mode(struct _lv_obj_t * obj, lv_dither_mode_t va
void lv_obj_set_style_bg_img_src(struct _lv_obj_t * obj, const void * value, lv_style_selector_t selector);
void lv_obj_set_style_bg_img_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector);
void lv_obj_set_style_bg_img_recolor(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector);
-void lv_obj_set_style_bg_img_recolor_filtered(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector);
void lv_obj_set_style_bg_img_recolor_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector);
void lv_obj_set_style_bg_img_tiled(struct _lv_obj_t * obj, bool value, lv_style_selector_t selector);
void lv_obj_set_style_border_color(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector);
-void lv_obj_set_style_border_color_filtered(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector);
void lv_obj_set_style_border_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector);
void lv_obj_set_style_border_width(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector);
void lv_obj_set_style_border_side(struct _lv_obj_t * obj, lv_border_side_t value, lv_style_selector_t selector);
void lv_obj_set_style_border_post(struct _lv_obj_t * obj, bool value, lv_style_selector_t selector);
void lv_obj_set_style_outline_width(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector);
void lv_obj_set_style_outline_color(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector);
-void lv_obj_set_style_outline_color_filtered(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector);
void lv_obj_set_style_outline_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector);
void lv_obj_set_style_outline_pad(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector);
void lv_obj_set_style_shadow_width(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector);
@@ -598,27 +612,22 @@ void lv_obj_set_style_shadow_ofs_x(struct _lv_obj_t * obj, lv_coord_t value, lv_
void lv_obj_set_style_shadow_ofs_y(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector);
void lv_obj_set_style_shadow_spread(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector);
void lv_obj_set_style_shadow_color(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector);
-void lv_obj_set_style_shadow_color_filtered(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector);
void lv_obj_set_style_shadow_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector);
void lv_obj_set_style_img_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector);
void lv_obj_set_style_img_recolor(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector);
-void lv_obj_set_style_img_recolor_filtered(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector);
void lv_obj_set_style_img_recolor_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector);
void lv_obj_set_style_line_width(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector);
void lv_obj_set_style_line_dash_width(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector);
void lv_obj_set_style_line_dash_gap(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector);
void lv_obj_set_style_line_rounded(struct _lv_obj_t * obj, bool value, lv_style_selector_t selector);
void lv_obj_set_style_line_color(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector);
-void lv_obj_set_style_line_color_filtered(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector);
void lv_obj_set_style_line_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector);
void lv_obj_set_style_arc_width(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector);
void lv_obj_set_style_arc_rounded(struct _lv_obj_t * obj, bool value, lv_style_selector_t selector);
void lv_obj_set_style_arc_color(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector);
-void lv_obj_set_style_arc_color_filtered(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector);
void lv_obj_set_style_arc_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector);
void lv_obj_set_style_arc_img_src(struct _lv_obj_t * obj, const void * value, lv_style_selector_t selector);
void lv_obj_set_style_text_color(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector);
-void lv_obj_set_style_text_color_filtered(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector);
void lv_obj_set_style_text_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector);
void lv_obj_set_style_text_font(struct _lv_obj_t * obj, const lv_font_t * value, lv_style_selector_t selector);
void lv_obj_set_style_text_letter_space(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector);
@@ -628,13 +637,12 @@ void lv_obj_set_style_text_align(struct _lv_obj_t * obj, lv_text_align_t value,
void lv_obj_set_style_radius(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector);
void lv_obj_set_style_clip_corner(struct _lv_obj_t * obj, bool value, lv_style_selector_t selector);
void lv_obj_set_style_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector);
-void lv_obj_set_style_color_filter_dsc(struct _lv_obj_t * obj, const lv_color_filter_dsc_t * value,
- lv_style_selector_t selector);
+void lv_obj_set_style_color_filter_dsc(struct _lv_obj_t * obj, const lv_color_filter_dsc_t * value, lv_style_selector_t selector);
void lv_obj_set_style_color_filter_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector);
+void lv_obj_set_style_anim(struct _lv_obj_t * obj, const lv_anim_t * value, lv_style_selector_t selector);
void lv_obj_set_style_anim_time(struct _lv_obj_t * obj, uint32_t value, lv_style_selector_t selector);
void lv_obj_set_style_anim_speed(struct _lv_obj_t * obj, uint32_t value, lv_style_selector_t selector);
-void lv_obj_set_style_transition(struct _lv_obj_t * obj, const lv_style_transition_dsc_t * value,
- lv_style_selector_t selector);
+void lv_obj_set_style_transition(struct _lv_obj_t * obj, const lv_style_transition_dsc_t * value, lv_style_selector_t selector);
void lv_obj_set_style_blend_mode(struct _lv_obj_t * obj, lv_blend_mode_t value, lv_style_selector_t selector);
void lv_obj_set_style_layout(struct _lv_obj_t * obj, uint16_t value, lv_style_selector_t selector);
void lv_obj_set_style_base_dir(struct _lv_obj_t * obj, lv_base_dir_t value, lv_style_selector_t selector);
diff --git a/src/core/lv_obj_tree.c b/src/core/lv_obj_tree.c
index cf82553d6..d3ad16ae3 100644
--- a/src/core/lv_obj_tree.c
+++ b/src/core/lv_obj_tree.c
@@ -65,6 +65,7 @@ void lv_obj_del(lv_obj_t * obj)
/*Call the ancestor's event handler to the parent to notify it about the child delete*/
if(par) {
+ lv_obj_update_layout(par);
lv_obj_readjust_scroll(par, LV_ANIM_OFF);
lv_obj_scrollbar_invalidate(par);
lv_event_send(par, LV_EVENT_CHILD_CHANGED, NULL);
diff --git a/src/core/lv_refr.c b/src/core/lv_refr.c
index b9b569f90..1a56fed0b 100644
--- a/src/core/lv_refr.c
+++ b/src/core/lv_refr.c
@@ -17,6 +17,7 @@
#include "../misc/lv_gc.h"
#include "../draw/lv_draw.h"
#include "../font/lv_font_fmt_txt.h"
+#include "../extra/others/snapshot/lv_snapshot.h"
#if LV_USE_PERF_MONITOR || LV_USE_MEM_MONITOR
#include "../widgets/lv_label.h"
@@ -51,11 +52,12 @@ typedef struct {
* STATIC PROTOTYPES
**********************/
static void lv_refr_join_area(void);
-static void lv_refr_areas(void);
-static void lv_refr_area(const lv_area_t * area_p);
-static void lv_refr_area_part(lv_draw_ctx_t * draw_ctx);
+static void refr_invalid_areas(void);
+static void refr_area(const lv_area_t * area_p);
+static void refr_area_part(lv_draw_ctx_t * draw_ctx);
static lv_obj_t * lv_refr_get_top_obj(const lv_area_t * area_p, lv_obj_t * obj);
-static void lv_refr_obj_and_children(lv_draw_ctx_t * draw_ctx, lv_obj_t * top_obj);
+static void refr_obj_and_children(lv_draw_ctx_t * draw_ctx, lv_obj_t * top_obj);
+static void refr_obj(lv_draw_ctx_t * draw_ctx, lv_obj_t * obj);
static uint32_t get_max_row(lv_disp_t * disp, lv_coord_t area_w, lv_coord_t area_h);
static void draw_buf_flush(lv_disp_t * disp);
static void call_flush_cb(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_p);
@@ -124,11 +126,8 @@ void lv_refr_now(lv_disp_t * disp)
}
}
-void lv_refr_obj(lv_draw_ctx_t * draw_ctx, lv_obj_t * obj)
+void lv_obj_redraw(lv_draw_ctx_t * draw_ctx, lv_obj_t * obj)
{
- /*Do not refresh hidden objects*/
- if(lv_obj_has_flag(obj, LV_OBJ_FLAG_HIDDEN)) return;
-
const lv_area_t * clip_area_ori = draw_ctx->clip_area;
lv_area_t clip_coords_for_obj;
@@ -137,31 +136,33 @@ void lv_refr_obj(lv_draw_ctx_t * draw_ctx, lv_obj_t * obj)
lv_obj_get_coords(obj, &obj_coords_ext);
lv_coord_t ext_draw_size = _lv_obj_get_ext_draw_size(obj);
lv_area_increase(&obj_coords_ext, ext_draw_size, ext_draw_size);
- if(!_lv_area_intersect(&clip_coords_for_obj, clip_area_ori, &obj_coords_ext)) return;
-
- draw_ctx->clip_area = &clip_coords_for_obj;
-
- /*Draw the object*/
- lv_event_send(obj, LV_EVENT_DRAW_MAIN_BEGIN, draw_ctx);
- lv_event_send(obj, LV_EVENT_DRAW_MAIN, draw_ctx);
- lv_event_send(obj, LV_EVENT_DRAW_MAIN_END, draw_ctx);
-
+ bool com_clip_res = _lv_area_intersect(&clip_coords_for_obj, clip_area_ori, &obj_coords_ext);
+ /*If the object is visible on the current clip area OR has overflow visible draw it.
+ *With overflow visible drawing should happen to apply the masks which might affect children */
+ bool should_draw = com_clip_res || lv_obj_has_flag(obj, LV_OBJ_FLAG_OVERFLOW_VISIBLE);
+ if(should_draw) {
+ draw_ctx->clip_area = &clip_coords_for_obj;
+
+ lv_event_send(obj, LV_EVENT_DRAW_MAIN_BEGIN, draw_ctx);
+ lv_event_send(obj, LV_EVENT_DRAW_MAIN, draw_ctx);
+ lv_event_send(obj, LV_EVENT_DRAW_MAIN_END, draw_ctx);
#if LV_USE_REFR_DEBUG
- lv_color_t debug_color = lv_color_make(lv_rand(0, 0xFF), lv_rand(0, 0xFF), lv_rand(0, 0xFF));
- lv_draw_rect_dsc_t draw_dsc;
- lv_draw_rect_dsc_init(&draw_dsc);
- draw_dsc.bg_color.full = debug_color.full;
- draw_dsc.bg_opa = LV_OPA_20;
- draw_dsc.border_width = 1;
- draw_dsc.border_opa = LV_OPA_30;
- draw_dsc.border_color = debug_color;
- lv_draw_rect(draw_ctx, &draw_dsc, &obj_coords_ext);
+ lv_color_t debug_color = lv_color_make(lv_rand(0, 0xFF), lv_rand(0, 0xFF), lv_rand(0, 0xFF));
+ lv_draw_rect_dsc_t draw_dsc;
+ lv_draw_rect_dsc_init(&draw_dsc);
+ draw_dsc.bg_color.full = debug_color.full;
+ draw_dsc.bg_opa = LV_OPA_20;
+ draw_dsc.border_width = 1;
+ draw_dsc.border_opa = LV_OPA_30;
+ draw_dsc.border_color = debug_color;
+ lv_draw_rect(draw_ctx, &draw_dsc, &obj_coords_ext);
#endif
+ }
/*With overflow visible keep the previous clip area to let the children visible out of this object too
*With not overflow visible limit the clip are to the object's coordinates to clip the children*/
- bool refr_children = true;
lv_area_t clip_coords_for_children;
+ bool refr_children = true;
if(lv_obj_has_flag(obj, LV_OBJ_FLAG_OVERFLOW_VISIBLE)) {
clip_coords_for_children = *clip_area_ori;
}
@@ -177,20 +178,24 @@ void lv_refr_obj(lv_draw_ctx_t * draw_ctx, lv_obj_t * obj)
uint32_t child_cnt = lv_obj_get_child_cnt(obj);
for(i = 0; i < child_cnt; i++) {
lv_obj_t * child = obj->spec_attr->children[i];
- lv_refr_obj(draw_ctx, child);
+ refr_obj(draw_ctx, child);
}
}
- draw_ctx->clip_area = &clip_coords_for_obj;
+ /*If the object was visible on the clip area call the post draw events too*/
+ if(should_draw) {
+ draw_ctx->clip_area = &clip_coords_for_obj;
- /*If all the children are redrawn make 'post draw' draw*/
- lv_event_send(obj, LV_EVENT_DRAW_POST_BEGIN, draw_ctx);
- lv_event_send(obj, LV_EVENT_DRAW_POST, draw_ctx);
- lv_event_send(obj, LV_EVENT_DRAW_POST_END, draw_ctx);
+ /*If all the children are redrawn make 'post draw' draw*/
+ lv_event_send(obj, LV_EVENT_DRAW_POST_BEGIN, draw_ctx);
+ lv_event_send(obj, LV_EVENT_DRAW_POST, draw_ctx);
+ lv_event_send(obj, LV_EVENT_DRAW_POST_END, draw_ctx);
+ }
draw_ctx->clip_area = clip_area_ori;
}
+
/**
* Invalidate an area on display to redraw it
* @param area_p pointer to area which should be invalidated (NULL: delete the invalidated areas)
@@ -201,6 +206,12 @@ void _lv_inv_area(lv_disp_t * disp, const lv_area_t * area_p)
{
if(!disp) disp = lv_disp_get_default();
if(!disp) return;
+ if(!lv_disp_is_invalidation_enabled(disp)) return;
+
+ if(disp->rendering_in_progress) {
+ LV_LOG_ERROR("detected modifying dirty areas in render");
+ return;
+ }
/*Clear the invalidate buffer if the parameter is NULL*/
if(area_p == NULL) {
@@ -310,16 +321,10 @@ void _lv_disp_refr_timer(lv_timer_t * tmr)
lv_refr_join_area();
- lv_refr_areas();
+ refr_invalid_areas();
/*If refresh happened ...*/
if(disp_refr->inv_p != 0) {
- if(disp_refr->driver->full_refresh) {
- lv_area_t disp_area;
- lv_area_set(&disp_area, 0, 0, lv_disp_get_hor_res(disp_refr) - 1, lv_disp_get_ver_res(disp_refr) - 1);
- disp_refr->driver->draw_ctx->buf_area = &disp_area;
- draw_buf_flush(disp_refr);
- }
/*Clean up*/
lv_memset_00(disp_refr->inv_areas, sizeof(disp_refr->inv_areas));
@@ -327,6 +332,7 @@ void _lv_disp_refr_timer(lv_timer_t * tmr)
disp_refr->inv_p = 0;
elaps = lv_tick_elaps(start);
+
/*Call monitor cb if present*/
if(disp_refr->driver->monitor_cb) {
disp_refr->driver->monitor_cb(disp_refr->driver, elaps, px_num);
@@ -365,9 +371,16 @@ void _lv_disp_refr_timer(lv_timer_t * tmr)
}
else {
perf_monitor.perf_last_time = lv_tick_get();
- uint32_t fps_limit = 1000 / disp_refr->refr_timer->period;
+ uint32_t fps_limit;
uint32_t fps;
+ if(disp_refr->refr_timer) {
+ fps_limit = 1000 / disp_refr->refr_timer->period;
+ }
+ else {
+ fps_limit = 1000 / LV_DISP_DEF_REFR_PERIOD;
+ }
+
if(perf_monitor.elaps_sum == 0) {
perf_monitor.elaps_sum = 1;
}
@@ -413,8 +426,10 @@ void _lv_disp_refr_timer(lv_timer_t * tmr)
uint32_t used_size = mon.total_size - mon.free_size;;
uint32_t used_kb = used_size / 1024;
uint32_t used_kb_tenth = (used_size - (used_kb * 1024)) / 102;
- lv_label_set_text_fmt(mem_label, "%" LV_PRIu32 ".%" LV_PRIu32 " kB used (%d %%)\n" \
- "%d%% frag.", used_kb, used_kb_tenth, mon.used_pct,
+ lv_label_set_text_fmt(mem_label,
+ "%"LV_PRIu32 ".%"LV_PRIu32 " kB used (%d %%)\n"
+ "%d%% frag.",
+ used_kb, used_kb_tenth, mon.used_pct,
mon.frag_pct);
}
#endif
@@ -483,7 +498,7 @@ static void lv_refr_join_area(void)
/**
* Refresh the joined areas
*/
-static void lv_refr_areas(void)
+static void refr_invalid_areas(void)
{
px_num = 0;
@@ -499,8 +514,14 @@ static void lv_refr_areas(void)
}
}
+ /*Notify the display driven rendering has started*/
+ if(disp_refr->driver->render_start_cb) {
+ disp_refr->driver->render_start_cb(disp_refr->driver);
+ }
+
disp_refr->driver->draw_buf->last_area = 0;
disp_refr->driver->draw_buf->last_part = 0;
+ disp_refr->rendering_in_progress = true;
for(i = 0; i < disp_refr->inv_p; i++) {
/*Refresh the unjoined areas*/
@@ -508,18 +529,20 @@ static void lv_refr_areas(void)
if(i == last_i) disp_refr->driver->draw_buf->last_area = 1;
disp_refr->driver->draw_buf->last_part = 0;
- lv_refr_area(&disp_refr->inv_areas[i]);
+ refr_area(&disp_refr->inv_areas[i]);
px_num += lv_area_get_size(&disp_refr->inv_areas[i]);
}
}
+
+ disp_refr->rendering_in_progress = false;
}
/**
* Refresh an area if there is Virtual Display Buffer
* @param area_p pointer to an area to refresh
*/
-static void lv_refr_area(const lv_area_t * area_p)
+static void refr_area(const lv_area_t * area_p)
{
lv_draw_ctx_t * draw_ctx = disp_refr->driver->draw_ctx;
draw_ctx->buf = disp_refr->driver->draw_buf->buf_act;
@@ -534,12 +557,12 @@ static void lv_refr_area(const lv_area_t * area_p)
if(disp_refr->driver->full_refresh) {
disp_refr->driver->draw_buf->last_part = 1;
draw_ctx->clip_area = &disp_area;
- lv_refr_area_part(draw_ctx);
+ refr_area_part(draw_ctx);
}
else {
disp_refr->driver->draw_buf->last_part = disp_refr->driver->draw_buf->last_area;
draw_ctx->clip_area = area_p;
- lv_refr_area_part(draw_ctx);
+ refr_area_part(draw_ctx);
}
return;
}
@@ -568,7 +591,7 @@ static void lv_refr_area(const lv_area_t * area_p)
if(sub_area.y2 > y2) sub_area.y2 = y2;
row_last = sub_area.y2;
if(y2 == row_last) disp_refr->driver->draw_buf->last_part = 1;
- lv_refr_area_part(draw_ctx);
+ refr_area_part(draw_ctx);
}
/*If the last y coordinates are not handled yet ...*/
@@ -582,20 +605,35 @@ static void lv_refr_area(const lv_area_t * area_p)
draw_ctx->clip_area = &sub_area;
draw_ctx->buf = disp_refr->driver->draw_buf->buf_act;
disp_refr->driver->draw_buf->last_part = 1;
- lv_refr_area_part(draw_ctx);
+ refr_area_part(draw_ctx);
}
}
-static void lv_refr_area_part(lv_draw_ctx_t * draw_ctx)
+static void refr_area_part(lv_draw_ctx_t * draw_ctx)
{
lv_disp_draw_buf_t * draw_buf = lv_disp_get_draw_buf(disp_refr);
/* Below the `area_p` area will be redrawn into the draw buffer.
- * In single buffered mode wait here until the buffer is freed.*/
- if(draw_buf->buf1 && !draw_buf->buf2) {
+ * In single buffered mode wait here until the buffer is freed.
+ * In full double buffered mode wait here while the buffers are swapped and a buffer becomes available*/
+ bool full_sized = draw_buf->size == (uint32_t)disp_refr->driver->hor_res * disp_refr->driver->ver_res;
+ if((draw_buf->buf1 && !draw_buf->buf2) ||
+ (draw_buf->buf1 && draw_buf->buf2 && full_sized)) {
while(draw_buf->flushing) {
if(disp_refr->driver->wait_cb) disp_refr->driver->wait_cb(disp_refr->driver);
}
+
+ /*If the screen is transparent initialize it when the flushing is ready*/
+#if LV_COLOR_SCREEN_TRANSP
+ if(disp_refr->driver->screen_transp) {
+ if(disp_refr->driver->clear_cb) {
+ disp_refr->driver->clear_cb(disp_refr->driver, disp_refr->driver->draw_buf->buf_act, disp_refr->driver->draw_buf->size);
+ }
+ else {
+ lv_memset_00(disp_refr->driver->draw_buf->buf_act, disp_refr->driver->draw_buf->size * LV_IMG_PX_SIZE_ALPHA_BYTE);
+ }
+ }
+#endif
}
lv_obj_t * top_act_scr = NULL;
@@ -609,6 +647,9 @@ static void lv_refr_area_part(lv_draw_ctx_t * draw_ctx)
/*Draw a display background if there is no top object*/
if(top_act_scr == NULL && top_prev_scr == NULL) {
+ lv_area_t a;
+ lv_area_set(&a, 0, 0,
+ lv_disp_get_hor_res(disp_refr) - 1, lv_disp_get_ver_res(disp_refr) - 1);
if(draw_ctx->draw_bg) {
lv_draw_rect_dsc_t dsc;
lv_draw_rect_dsc_init(&dsc);
@@ -616,15 +657,12 @@ static void lv_refr_area_part(lv_draw_ctx_t * draw_ctx)
dsc.bg_img_opa = disp_refr->bg_opa;
dsc.bg_color = disp_refr->bg_color;
dsc.bg_opa = disp_refr->bg_opa;
- draw_ctx->draw_bg(draw_ctx, &dsc, draw_ctx->buf_area);
+ draw_ctx->draw_bg(draw_ctx, &dsc, &a);
}
else if(disp_refr->bg_img) {
lv_img_header_t header;
- lv_res_t res;
- res = lv_img_decoder_get_info(disp_refr->bg_img, &header);
+ lv_res_t res = lv_img_decoder_get_info(disp_refr->bg_img, &header);
if(res == LV_RES_OK) {
- lv_area_t a;
- lv_area_set(&a, 0, 0, header.w - 1, header.h - 1);
lv_draw_img_dsc_t dsc;
lv_draw_img_dsc_init(&dsc);
dsc.opa = disp_refr->bg_opa;
@@ -642,24 +680,33 @@ static void lv_refr_area_part(lv_draw_ctx_t * draw_ctx)
lv_draw_rect(draw_ctx, &dsc, draw_ctx->buf_area);
}
}
- /*Refresh the previous screen if any*/
- if(disp_refr->prev_scr) {
- if(top_prev_scr == NULL) top_prev_scr = disp_refr->prev_scr;
- lv_refr_obj_and_children(draw_ctx, top_prev_scr);
+
+ if(disp_refr->draw_prev_over_act) {
+ if(top_act_scr == NULL) top_act_scr = disp_refr->act_scr;
+ refr_obj_and_children(draw_ctx, top_act_scr);
+
+ /*Refresh the previous screen if any*/
+ if(disp_refr->prev_scr) {
+ if(top_prev_scr == NULL) top_prev_scr = disp_refr->prev_scr;
+ refr_obj_and_children(draw_ctx, top_prev_scr);
+ }
}
+ else {
+ /*Refresh the previous screen if any*/
+ if(disp_refr->prev_scr) {
+ if(top_prev_scr == NULL) top_prev_scr = disp_refr->prev_scr;
+ refr_obj_and_children(draw_ctx, top_prev_scr);
+ }
- if(top_act_scr == NULL) top_act_scr = disp_refr->act_scr;
- lv_refr_obj_and_children(draw_ctx, top_act_scr);
+ if(top_act_scr == NULL) top_act_scr = disp_refr->act_scr;
+ refr_obj_and_children(draw_ctx, top_act_scr);
+ }
/*Also refresh top and sys layer unconditionally*/
- lv_refr_obj_and_children(draw_ctx, lv_disp_get_layer_top(disp_refr));
- lv_refr_obj_and_children(draw_ctx, lv_disp_get_layer_sys(disp_refr));
+ refr_obj_and_children(draw_ctx, lv_disp_get_layer_top(disp_refr));
+ refr_obj_and_children(draw_ctx, lv_disp_get_layer_sys(disp_refr));
- /*In true double buffered mode flush only once when all areas were rendered.
- *In normal mode flush after every area*/
- if(disp_refr->driver->full_refresh == false) {
- draw_buf_flush(disp_refr);
- }
+ draw_buf_flush(disp_refr);
}
/**
@@ -672,32 +719,32 @@ static lv_obj_t * lv_refr_get_top_obj(const lv_area_t * area_p, lv_obj_t * obj)
{
lv_obj_t * found_p = NULL;
+ if(_lv_area_is_in(area_p, &obj->coords, 0) == false) return NULL;
+ if(lv_obj_has_flag(obj, LV_OBJ_FLAG_HIDDEN)) return NULL;
+ if(_lv_obj_get_layer_type(obj) != LV_LAYER_TYPE_NONE) return NULL;
+
/*If this object is fully cover the draw area then check the children too*/
- if(_lv_area_is_in(area_p, &obj->coords, 0) && lv_obj_has_flag(obj, LV_OBJ_FLAG_HIDDEN) == false) {
- lv_cover_check_info_t info;
- info.res = LV_COVER_RES_COVER;
- info.area = area_p;
- lv_event_send(obj, LV_EVENT_COVER_CHECK, &info);
- if(info.res == LV_COVER_RES_MASKED) return NULL;
+ lv_cover_check_info_t info;
+ info.res = LV_COVER_RES_COVER;
+ info.area = area_p;
+ lv_event_send(obj, LV_EVENT_COVER_CHECK, &info);
+ if(info.res == LV_COVER_RES_MASKED) return NULL;
- uint32_t i;
- uint32_t child_cnt = lv_obj_get_child_cnt(obj);
- for(i = 0; i < child_cnt; i++) {
- lv_obj_t * child = obj->spec_attr->children[i];
- found_p = lv_refr_get_top_obj(area_p, child);
+ int32_t i;
+ int32_t child_cnt = lv_obj_get_child_cnt(obj);
+ for(i = child_cnt - 1; i >= 0; i--) {
+ lv_obj_t * child = obj->spec_attr->children[i];
+ found_p = lv_refr_get_top_obj(area_p, child);
- /*If a children is ok then break*/
- if(found_p != NULL) {
- break;
- }
+ /*If a children is ok then break*/
+ if(found_p != NULL) {
+ break;
}
+ }
- /*If no better children use this object*/
- if(found_p == NULL) {
- if(info.res == LV_COVER_RES_COVER) {
- found_p = obj;
- }
- }
+ /*If no better children use this object*/
+ if(found_p == NULL && info.res == LV_COVER_RES_COVER) {
+ found_p = obj;
}
return found_p;
@@ -708,7 +755,7 @@ static lv_obj_t * lv_refr_get_top_obj(const lv_area_t * area_p, lv_obj_t * obj)
* @param top_p pointer to an objects. Start the drawing from it.
* @param mask_p pointer to an area, the objects will be drawn only here
*/
-static void lv_refr_obj_and_children(lv_draw_ctx_t * draw_ctx, lv_obj_t * top_obj)
+static void refr_obj_and_children(lv_draw_ctx_t * draw_ctx, lv_obj_t * top_obj)
{
/*Normally always will be a top_obj (at least the screen)
*but in special cases (e.g. if the screen has alpha) it won't.
@@ -717,7 +764,7 @@ static void lv_refr_obj_and_children(lv_draw_ctx_t * draw_ctx, lv_obj_t * top_ob
if(top_obj == NULL) return; /*Shouldn't happen*/
/*Refresh the top object and its children*/
- lv_refr_obj(draw_ctx, top_obj);
+ refr_obj(draw_ctx, top_obj);
/*Draw the 'younger' sibling objects because they can be on top_obj*/
lv_obj_t * parent;
@@ -737,7 +784,7 @@ static void lv_refr_obj_and_children(lv_draw_ctx_t * draw_ctx, lv_obj_t * top_ob
}
else {
/*Refresh the objects*/
- lv_refr_obj(draw_ctx, child);
+ refr_obj(draw_ctx, child);
}
}
@@ -754,6 +801,160 @@ static void lv_refr_obj_and_children(lv_draw_ctx_t * draw_ctx, lv_obj_t * top_ob
}
}
+
+static lv_res_t layer_get_area(lv_draw_ctx_t * draw_ctx, lv_obj_t * obj, lv_layer_type_t layer_type,
+ lv_area_t * layer_area_out)
+{
+ lv_coord_t ext_draw_size = _lv_obj_get_ext_draw_size(obj);
+ lv_area_t obj_coords_ext;
+ lv_obj_get_coords(obj, &obj_coords_ext);
+ lv_area_increase(&obj_coords_ext, ext_draw_size, ext_draw_size);
+
+ if(layer_type == LV_LAYER_TYPE_TRANSFORM) {
+ /*Get the transformed area and clip it to the current clip area.
+ *This area needs to be updated on the screen.*/
+ lv_area_t clip_coords_for_obj;
+ lv_area_t tranf_coords = obj_coords_ext;
+ lv_obj_get_transformed_area(obj, &tranf_coords, false, false);
+ if(!_lv_area_intersect(&clip_coords_for_obj, draw_ctx->clip_area, &tranf_coords)) {
+ return LV_RES_INV;
+ }
+
+ /*Transform back (inverse) the transformed area.
+ *It will tell which area of the non-transformed widget needs to be redrawn
+ *in order to cover transformed area after transformation.*/
+ lv_area_t inverse_clip_coords_for_obj = clip_coords_for_obj;
+ lv_obj_get_transformed_area(obj, &inverse_clip_coords_for_obj, false, true);
+ if(!_lv_area_intersect(&inverse_clip_coords_for_obj, &inverse_clip_coords_for_obj, &obj_coords_ext)) {
+ return LV_RES_INV;
+ }
+
+ *layer_area_out = inverse_clip_coords_for_obj;
+ }
+ else if(layer_type == LV_LAYER_TYPE_SIMPLE) {
+ lv_area_t clip_coords_for_obj;
+ if(!_lv_area_intersect(&clip_coords_for_obj, draw_ctx->clip_area, &obj_coords_ext)) {
+ return LV_RES_INV;
+ }
+ *layer_area_out = clip_coords_for_obj;
+ }
+ else {
+ LV_LOG_WARN("Unhandled intermediate layer type");
+ return LV_RES_INV;
+ }
+
+ return LV_RES_OK;
+}
+
+static void layer_alpha_test(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, lv_draw_layer_ctx_t * layer_ctx,
+ lv_draw_layer_flags_t flags)
+{
+ bool has_alpha;
+ /*If globally the layer has alpha maybe this smaller section has not (e.g. not on a rounded corner)
+ *If turns out that this section has no alpha renderer can choose faster algorithms*/
+ if(flags & LV_DRAW_LAYER_FLAG_HAS_ALPHA) {
+ /*Test for alpha by assuming there is no alpha. If it fails, fall back to rendering with alpha*/
+ has_alpha = true;
+ if(_lv_area_is_in(&layer_ctx->area_act, &obj->coords, 0)) {
+ lv_cover_check_info_t info;
+ info.res = LV_COVER_RES_COVER;
+ info.area = &layer_ctx->area_act;
+ lv_event_send(obj, LV_EVENT_COVER_CHECK, &info);
+ if(info.res == LV_COVER_RES_COVER) has_alpha = false;
+ }
+
+ if(has_alpha) {
+ layer_ctx->area_act.y2 = layer_ctx->area_act.y1 + layer_ctx->max_row_with_alpha - 1;
+ }
+ }
+ else {
+ has_alpha = false;
+ }
+
+ if(layer_ctx->area_act.y2 > layer_ctx->area_full.y2) layer_ctx->area_act.y2 = layer_ctx->area_full.y2;
+ lv_draw_layer_adjust(draw_ctx, layer_ctx, has_alpha ? LV_DRAW_LAYER_FLAG_HAS_ALPHA : LV_DRAW_LAYER_FLAG_NONE);
+}
+
+
+void refr_obj(lv_draw_ctx_t * draw_ctx, lv_obj_t * obj)
+{
+ /*Do not refresh hidden objects*/
+ if(lv_obj_has_flag(obj, LV_OBJ_FLAG_HIDDEN)) return;
+ lv_layer_type_t layer_type = _lv_obj_get_layer_type(obj);
+ if(layer_type == LV_LAYER_TYPE_NONE) {
+ lv_obj_redraw(draw_ctx, obj);
+ }
+ else {
+ lv_opa_t opa = lv_obj_get_style_opa(obj, 0);
+ if(opa < LV_OPA_MIN) return;
+
+ lv_area_t layer_area_full;
+ lv_res_t res = layer_get_area(draw_ctx, obj, layer_type, &layer_area_full);
+ if(res != LV_RES_OK) return;
+
+ lv_draw_layer_flags_t flags = LV_DRAW_LAYER_FLAG_HAS_ALPHA;
+
+ if(_lv_area_is_in(&layer_area_full, &obj->coords, 0)) {
+ lv_cover_check_info_t info;
+ info.res = LV_COVER_RES_COVER;
+ info.area = &layer_area_full;
+ lv_event_send(obj, LV_EVENT_COVER_CHECK, &info);
+ if(info.res == LV_COVER_RES_COVER) flags &= ~LV_DRAW_LAYER_FLAG_HAS_ALPHA;
+ }
+
+ if(layer_type == LV_LAYER_TYPE_SIMPLE) flags |= LV_DRAW_LAYER_FLAG_CAN_SUBDIVIDE;
+
+ lv_draw_layer_ctx_t * layer_ctx = lv_draw_layer_create(draw_ctx, &layer_area_full, flags);
+ if(layer_ctx == NULL) {
+ LV_LOG_WARN("Couldn't create a new layer context");
+ return;
+ }
+ lv_point_t pivot = {
+ .x = lv_obj_get_style_transform_pivot_x(obj, 0),
+ .y = lv_obj_get_style_transform_pivot_y(obj, 0)
+ };
+
+ lv_draw_img_dsc_t draw_dsc;
+ lv_draw_img_dsc_init(&draw_dsc);
+ draw_dsc.opa = opa;
+ draw_dsc.angle = lv_obj_get_style_transform_angle(obj, 0);
+ if(draw_dsc.angle > 3600) draw_dsc.angle -= 3600;
+ else if(draw_dsc.angle < 0) draw_dsc.angle += 3600;
+
+ draw_dsc.zoom = lv_obj_get_style_transform_zoom(obj, 0);
+ draw_dsc.blend_mode = lv_obj_get_style_blend_mode(obj, 0);
+ draw_dsc.antialias = disp_refr->driver->antialiasing;
+
+ if(flags & LV_DRAW_LAYER_FLAG_CAN_SUBDIVIDE) {
+ layer_ctx->area_act = layer_ctx->area_full;
+ layer_ctx->area_act.y2 = layer_ctx->area_act.y1 + layer_ctx->max_row_with_no_alpha - 1;
+ if(layer_ctx->area_act.y2 > layer_ctx->area_full.y2) layer_ctx->area_act.y2 = layer_ctx->area_full.y2;
+ }
+
+ while(layer_ctx->area_act.y1 <= layer_area_full.y2) {
+ if(flags & LV_DRAW_LAYER_FLAG_CAN_SUBDIVIDE) {
+ layer_alpha_test(obj, draw_ctx, layer_ctx, flags);
+ }
+
+ lv_obj_redraw(draw_ctx, obj);
+
+ draw_dsc.pivot.x = obj->coords.x1 + pivot.x - draw_ctx->buf_area->x1;
+ draw_dsc.pivot.y = obj->coords.y1 + pivot.y - draw_ctx->buf_area->y1;
+
+ /*With LV_DRAW_LAYER_FLAG_CAN_SUBDIVIDE it should also go the next chunk*/
+ lv_draw_layer_blend(draw_ctx, layer_ctx, &draw_dsc);
+
+ if((flags & LV_DRAW_LAYER_FLAG_CAN_SUBDIVIDE) == 0) break;
+
+ layer_ctx->area_act.y1 = layer_ctx->area_act.y2 + 1;
+ layer_ctx->area_act.y2 = layer_ctx->area_act.y1 + layer_ctx->max_row_with_no_alpha - 1;
+ }
+
+ lv_draw_layer_destroy(draw_ctx, layer_ctx);
+ }
+}
+
+
static uint32_t get_max_row(lv_disp_t * disp, lv_coord_t area_w, lv_coord_t area_h)
{
int32_t max_row = (uint32_t)disp->driver->draw_buf->size / area_w;
@@ -980,9 +1181,10 @@ static void draw_buf_flush(lv_disp_t * disp)
lv_draw_ctx_t * draw_ctx = disp->driver->draw_ctx;
if(draw_ctx->wait_for_finish) draw_ctx->wait_for_finish(draw_ctx);
- /* In double buffered mode wait until the other buffer is freed
+ /* In partial double buffered mode wait until the other buffer is freed
* and driver is ready to receive the new buffer */
- if(draw_buf->buf1 && draw_buf->buf2) {
+ bool full_sized = draw_buf->size == (uint32_t)disp_refr->driver->hor_res * disp_refr->driver->ver_res;
+ if(draw_buf->buf1 && draw_buf->buf2 && !full_sized) {
while(draw_buf->flushing) {
if(disp_refr->driver->wait_cb) disp_refr->driver->wait_cb(disp_refr->driver);
}
@@ -1004,6 +1206,7 @@ static void draw_buf_flush(lv_disp_t * disp)
call_flush_cb(disp->driver, draw_ctx->buf_area, draw_ctx->buf);
}
}
+
/*If there are 2 buffers swap them. With direct mode swap only on the last area*/
if(draw_buf->buf1 && draw_buf->buf2 && (!disp->driver->direct_mode || flushing_last)) {
if(draw_buf->buf_act == draw_buf->buf1)
diff --git a/src/core/lv_refr.h b/src/core/lv_refr.h
index 984168a96..72e8d6c39 100644
--- a/src/core/lv_refr.h
+++ b/src/core/lv_refr.h
@@ -61,7 +61,7 @@ void lv_refr_now(lv_disp_t * disp);
* @param draw pointer to an initialized draw context
* @param obj the start object from the redraw should start
*/
-void lv_refr_obj(lv_draw_ctx_t * draw_ctx, lv_obj_t * obj);
+void lv_obj_redraw(lv_draw_ctx_t * draw_ctx, lv_obj_t * obj);
/**
* Invalidate an area on display to redraw it
diff --git a/src/draw/arm2d/lv_draw_arm2d.mk b/src/draw/arm2d/lv_draw_arm2d.mk
new file mode 100644
index 000000000..17219b07e
--- /dev/null
+++ b/src/draw/arm2d/lv_draw_arm2d.mk
@@ -0,0 +1,6 @@
+CSRCS += lv_gpu_arm2d.c
+
+DEPPATH += --dep-path $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/arm2d
+VPATH += :$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/arm2d
+
+CFLAGS += "-I$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/arm2d"
diff --git a/src/draw/arm2d/lv_gpu_arm2d.c b/src/draw/arm2d/lv_gpu_arm2d.c
new file mode 100644
index 000000000..7777fe21b
--- /dev/null
+++ b/src/draw/arm2d/lv_gpu_arm2d.c
@@ -0,0 +1,1376 @@
+/**
+ * @file lv_gpu_arm2d.c
+ *
+ */
+
+/*********************
+ * INCLUDES
+ *********************/
+#if defined(__clang__)
+ #pragma clang diagnostic ignored "-Wunknown-warning-option"
+ #pragma clang diagnostic ignored "-Wreserved-identifier"
+ #pragma clang diagnostic ignored "-Wincompatible-pointer-types-discards-qualifiers"
+ #pragma clang diagnostic ignored "-Wmissing-variable-declarations"
+ #pragma clang diagnostic ignored "-Wcast-qual"
+ #pragma clang diagnostic ignored "-Wcast-align"
+ #pragma clang diagnostic ignored "-Wextra-semi-stmt"
+ #pragma clang diagnostic ignored "-Wsign-conversion"
+ #pragma clang diagnostic ignored "-Wunused-function"
+ #pragma clang diagnostic ignored "-Wimplicit-int-float-conversion"
+ #pragma clang diagnostic ignored "-Wdouble-promotion"
+ #pragma clang diagnostic ignored "-Wunused-parameter"
+ #pragma clang diagnostic ignored "-Wimplicit-float-conversion"
+ #pragma clang diagnostic ignored "-Wimplicit-int-conversion"
+ #pragma clang diagnostic ignored "-Wtautological-pointer-compare"
+ #pragma clang diagnostic ignored "-Wsign-compare"
+ #pragma clang diagnostic ignored "-Wfloat-conversion"
+ #pragma clang diagnostic ignored "-Wmissing-prototypes"
+ #pragma clang diagnostic ignored "-Wpadded"
+ #pragma clang diagnostic ignored "-Wundef"
+ #pragma clang diagnostic ignored "-Wdeclaration-after-statement"
+ #pragma clang diagnostic ignored "-Wdisabled-macro-expansion"
+ #pragma clang diagnostic ignored "-Wunused-variable"
+ #pragma clang diagnostic ignored "-Wunused-but-set-variable"
+ #pragma clang diagnostic ignored "-Wint-conversion"
+#endif
+
+
+#include "lv_gpu_arm2d.h"
+#include "../../core/lv_refr.h"
+
+#if LV_USE_GPU_ARM2D
+#include "arm_2d.h"
+#include "__arm_2d_impl.h"
+
+
+#if defined(__IS_COMPILER_ARM_COMPILER_5__)
+ #pragma diag_suppress 174,177,188,68,513,144,1296
+#elif defined(__IS_COMPILER_IAR__)
+ #pragma diag_suppress=Pa093
+#elif defined(__IS_COMPILER_GCC__)
+ #pragma GCC diagnostic ignored "-Wdiscarded-qualifiers"
+#endif
+
+/*********************
+ * DEFINES
+ *********************/
+#if ( !defined(__ARM_2D_CFG_SUPPORT_COLOUR_CHANNEL_ACCESS__) \
+ || !__ARM_2D_CFG_SUPPORT_COLOUR_CHANNEL_ACCESS__) \
+&& LV_COLOR_DEPTH == 32 \
+&& !defined(__ARM_2D_LVGL_CFG_NO_WARNING__)
+#warning Please set macro __ARM_2D_CFG_SUPPORT_COLOUR_CHANNEL_ACCESS__ to 1 to get more acceleration opportunities. Or you can define macro __ARM_2D_LVGL_CFG_NO_WARNING__ to suppress this warning.
+#endif
+
+#define MAX_BUF_SIZE (uint32_t) lv_disp_get_hor_res(_lv_refr_get_disp_refreshing())
+
+#if LV_COLOR_DEPTH == 16
+#define arm_2d_fill_colour arm_2d_rgb16_fill_colour
+#define arm_2d_fill_colour_with_alpha arm_2d_rgb565_fill_colour_with_alpha
+#define arm_2d_fill_colour_with_mask arm_2d_rgb565_fill_colour_with_mask
+#define arm_2d_fill_colour_with_mask_and_opacity \
+ arm_2d_rgb565_fill_colour_with_mask_and_opacity
+#define arm_2d_tile_copy arm_2d_rgb16_tile_copy
+#define arm_2d_alpha_blending arm_2d_rgb565_alpha_blending
+#define arm_2d_tile_copy_with_src_mask arm_2d_rgb565_tile_copy_with_src_mask
+#define arm_2d_color_t arm_2d_color_rgb565_t
+
+/* arm-2d direct mode apis */
+#define __arm_2d_impl_colour_filling __arm_2d_impl_rgb16_colour_filling
+#define __arm_2d_impl_colour_filling_with_opacity \
+ __arm_2d_impl_rgb565_colour_filling_with_opacity
+#define __arm_2d_impl_colour_filling_mask \
+ __arm_2d_impl_rgb565_colour_filling_mask
+#define __arm_2d_impl_colour_filling_mask_opacity \
+ __arm_2d_impl_rgb565_colour_filling_mask_opacity
+#define __arm_2d_impl_copy __arm_2d_impl_rgb16_copy
+#define __arm_2d_impl_alpha_blending __arm_2d_impl_rgb565_alpha_blending
+#define __arm_2d_impl_src_msk_copy __arm_2d_impl_rgb565_src_msk_copy
+#define __arm_2d_impl_src_chn_msk_copy __arm_2d_impl_rgb565_src_chn_msk_copy
+#define __arm_2d_impl_cl_key_copy __arm_2d_impl_rgb16_cl_key_copy
+#define __arm_2d_impl_alpha_blending_colour_keying \
+ __arm_2d_impl_rgb565_alpha_blending_colour_keying
+#define arm_2d_tile_transform_with_src_mask_and_opacity \
+ arm_2d_rgb565_tile_transform_with_src_mask_and_opacity
+#define arm_2d_tile_transform_with_opacity \
+ arm_2d_rgb565_tile_transform_with_opacity
+
+#define __ARM_2D_PIXEL_BLENDING_OPA __ARM_2D_PIXEL_BLENDING_OPA_RGB565
+
+#define color_int uint16_t
+
+#elif LV_COLOR_DEPTH == 32
+#define arm_2d_fill_colour arm_2d_rgb32_fill_colour
+#define arm_2d_fill_colour_with_alpha arm_2d_cccn888_fill_colour_with_alpha
+#define arm_2d_fill_colour_with_mask arm_2d_cccn888_fill_colour_with_mask
+#define arm_2d_fill_colour_with_mask_and_opacity \
+ arm_2d_cccn888_fill_colour_with_mask_and_opacity
+#define arm_2d_tile_copy arm_2d_rgb32_tile_copy
+#define arm_2d_alpha_blending arm_2d_cccn888_alpha_blending
+#define arm_2d_tile_copy_with_src_mask arm_2d_cccn888_tile_copy_with_src_mask
+#define arm_2d_color_t arm_2d_color_cccn888_t
+
+/* arm-2d direct mode apis */
+#define __arm_2d_impl_colour_filling __arm_2d_impl_rgb32_colour_filling
+#define __arm_2d_impl_colour_filling_with_opacity \
+ __arm_2d_impl_cccn888_colour_filling_with_opacity
+#define __arm_2d_impl_colour_filling_mask \
+ __arm_2d_impl_cccn888_colour_filling_mask
+#define __arm_2d_impl_colour_filling_mask_opacity \
+ __arm_2d_impl_cccn888_colour_filling_mask_opacity
+#define __arm_2d_impl_copy __arm_2d_impl_rgb32_copy
+#define __arm_2d_impl_alpha_blending __arm_2d_impl_cccn888_alpha_blending
+#define __arm_2d_impl_src_msk_copy __arm_2d_impl_cccn888_src_msk_copy
+#define __arm_2d_impl_src_chn_msk_copy __arm_2d_impl_cccn888_src_chn_msk_copy
+#define __arm_2d_impl_cl_key_copy __arm_2d_impl_rgb32_cl_key_copy
+#define __arm_2d_impl_alpha_blending_colour_keying \
+ __arm_2d_impl_cccn888_alpha_blending_colour_keying
+#define arm_2d_tile_transform_with_src_mask_and_opacity \
+ arm_2d_cccn888_tile_transform_with_src_mask_and_opacity
+#define arm_2d_tile_transform_with_opacity \
+ arm_2d_cccn888_tile_transform_with_opacity
+
+#define __ARM_2D_PIXEL_BLENDING_OPA __ARM_2D_PIXEL_BLENDING_OPA_CCCN888
+
+#define color_int uint32_t
+
+#else
+#error The specified LV_COLOR_DEPTH is not supported by this version of lv_gpu_arm2d.c.
+#endif
+
+/* *INDENT-OFF* */
+#define __PREPARE_LL_ACCELERATION__() \
+ int32_t src_stride = lv_area_get_width(coords); \
+ \
+ uint8_t px_size_byte = cf == LV_IMG_CF_TRUE_COLOR_ALPHA \
+ ? LV_IMG_PX_SIZE_ALPHA_BYTE \
+ : sizeof(lv_color_t); \
+ \
+ const uint8_t * src_buf_tmp = src_buf; \
+ src_buf_tmp += src_stride \
+ * (draw_area.y1 - coords->y1) \
+ * px_size_byte; \
+ src_buf_tmp += (draw_area.x1 - coords->x1) * px_size_byte; \
+ \
+ lv_area_t blend_area2; \
+ if(!_lv_area_intersect(&blend_area2, \
+ &draw_area, \
+ draw_ctx->clip_area)) return; \
+ \
+ int32_t w = lv_area_get_width(&blend_area2); \
+ int32_t h = lv_area_get_height(&blend_area2); \
+ \
+ lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area); \
+ \
+ lv_color_t * dest_buf = draw_ctx->buf; \
+ dest_buf += dest_stride * (blend_area2.y1 - draw_ctx->buf_area->y1) \
+ + (blend_area2.x1 - draw_ctx->buf_area->x1); \
+ \
+ arm_2d_size_t copy_size = { \
+ .iWidth = lv_area_get_width(&blend_area2), \
+ .iHeight = lv_area_get_height(&blend_area2), \
+ }
+
+#define __PREPARE_TARGET_TILE__(__blend_area) \
+ static arm_2d_tile_t target_tile; \
+ static arm_2d_region_t target_region; \
+ \
+ lv_color_t * dest_buf = draw_ctx->buf; \
+ \
+ target_tile = (arm_2d_tile_t) { \
+ .tRegion = { \
+ .tSize = { \
+ .iWidth = lv_area_get_width(draw_ctx->buf_area), \
+ .iHeight = lv_area_get_height(draw_ctx->buf_area), \
+ }, \
+ }, \
+ .tInfo.bIsRoot = true, \
+ .phwBuffer = (uint16_t *)draw_ctx->buf, \
+ }; \
+ \
+ target_region = (arm_2d_region_t) { \
+ .tLocation = { \
+ .iX = (__blend_area).x1 - draw_ctx->buf_area->x1, \
+ .iY = (__blend_area).y1 - draw_ctx->buf_area->y1, \
+ }, \
+ .tSize = { \
+ .iWidth = lv_area_get_width(&(__blend_area)), \
+ .iHeight = lv_area_get_height(&(__blend_area)), \
+ }, \
+ }
+
+#define __PREPARE_SOURCE_TILE__(__dsc, __blend_area) \
+ static arm_2d_tile_t source_tile_orig; \
+ static arm_2d_tile_t source_tile; \
+ const lv_color_t * src_buf = (__dsc)->src_buf; \
+ if (src_buf) { \
+ source_tile_orig = (arm_2d_tile_t) { \
+ .tRegion = { \
+ .tSize = { \
+ .iWidth = lv_area_get_width((__dsc)->blend_area), \
+ .iHeight = lv_area_get_height((__dsc)->blend_area), \
+ }, \
+ }, \
+ .tInfo.bIsRoot = true, \
+ .phwBuffer = (uint16_t *)src_buf, \
+ }; \
+ \
+ arm_2d_tile_generate_child( \
+ &source_tile_orig, \
+ (arm_2d_region_t []) { \
+ { \
+ .tLocation = { \
+ .iX = (__blend_area).x1 - (__dsc)->blend_area->x1, \
+ .iY = (__blend_area).y1 - (__dsc)->blend_area->y1, \
+ }, \
+ .tSize = source_tile_orig.tRegion.tSize, \
+ } \
+ }, \
+ &source_tile, \
+ false); \
+ source_tile.tInfo.bDerivedResource = true; \
+ }
+
+#define __PREPARE_MASK_TILE__(__dsc, __blend_area, __mask, __is_chn) \
+ static arm_2d_tile_t mask_tile_orig; \
+ static arm_2d_tile_t mask_tile; \
+ if(NULL != (__mask)) { \
+ mask_tile_orig = (arm_2d_tile_t) { \
+ .tRegion = { \
+ .tSize = { \
+ .iWidth = lv_area_get_width((__dsc)->mask_area), \
+ .iHeight = lv_area_get_height((__dsc)->mask_area), \
+ }, \
+ }, \
+ .tInfo = { \
+ .bIsRoot = true, \
+ .bHasEnforcedColour = true, \
+ .tColourInfo = { \
+ .chScheme = (__is_chn) ? ARM_2D_CHANNEL_8in32 \
+ : ARM_2D_COLOUR_8BIT, \
+ }, \
+ }, \
+ .pchBuffer = ((uint8_t *)(__mask)) + (__is_chn) ? 3 : 0, \
+ }; \
+ \
+ arm_2d_tile_generate_child( \
+ &mask_tile_orig, \
+ (arm_2d_region_t []) { \
+ { \
+ .tLocation = { \
+ .iX = (__dsc)->mask_area->x1 - (__blend_area).x1, \
+ .iY = (__dsc)->mask_area->y1 - (__blend_area).y1, \
+ }, \
+ .tSize = mask_tile_orig.tRegion.tSize, \
+ } \
+ }, \
+ &mask_tile, \
+ false); \
+ mask_tile.tInfo.bDerivedResource = true; \
+ }
+/* *INDENT-ON* */
+
+/* *INDENT-OFF* */
+#define __RECOLOUR_WRAPPER(...) \
+ do { \
+ lv_color_t *rgb_tmp_buf = NULL; \
+ if(draw_dsc->recolor_opa > LV_OPA_MIN) { \
+ rgb_tmp_buf \
+ = lv_mem_buf_get(src_w * src_h * sizeof(lv_color_t)); \
+ if (NULL == rgb_tmp_buf) { \
+ LV_LOG_WARN( \
+ "Failed to allocate memory for accelerating recolour, " \
+ "use normal route instead."); \
+ break; \
+ } \
+ lv_memcpy(rgb_tmp_buf, src_buf, src_w * src_h * sizeof(lv_color_t));\
+ arm_2d_size_t copy_size = { \
+ .iWidth = src_w, \
+ .iHeight = src_h, \
+ }; \
+ /* apply re-colour */ \
+ __arm_2d_impl_colour_filling_with_opacity( \
+ (color_int *)rgb_tmp_buf, \
+ src_w, \
+ ©_size, \
+ (color_int)draw_dsc->recolor.full, \
+ draw_dsc->recolor_opa); \
+ \
+ /* replace src_buf for the following operation */ \
+ src_buf = (const uint8_t *)rgb_tmp_buf; \
+ } \
+ __VA_ARGS__ \
+ if (NULL != rgb_tmp_buf) { \
+ lv_mem_buf_release(rgb_tmp_buf); \
+ } \
+ } while(0);
+/* *INDENT-ON* */
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+
+#if __ARM_2D_HAS_HW_ACC__
+LV_ATTRIBUTE_FAST_MEM
+static bool lv_draw_arm2d_fill_colour(const arm_2d_tile_t * target_tile,
+ const arm_2d_region_t * region,
+ lv_color_t color,
+ lv_opa_t opa,
+ const arm_2d_tile_t * mask_tile);
+
+LV_ATTRIBUTE_FAST_MEM
+static bool lv_draw_arm2d_tile_copy(const arm_2d_tile_t * target_tile,
+ const arm_2d_region_t * region,
+ arm_2d_tile_t * source_tile,
+ lv_opa_t opa,
+ arm_2d_tile_t * mask_tile);
+#else
+
+static void convert_cb(const lv_area_t * dest_area,
+ const void * src_buf,
+ lv_coord_t src_w,
+ lv_coord_t src_h,
+ lv_coord_t src_stride,
+ const lv_draw_img_dsc_t * draw_dsc,
+ lv_img_cf_t cf,
+ lv_color_t * cbuf,
+ lv_opa_t * abuf);
+
+LV_ATTRIBUTE_FAST_MEM
+static bool arm_2d_fill_normal(lv_color_t * dest_buf,
+ const lv_area_t * dest_area,
+ lv_coord_t dest_stride,
+ lv_color_t color,
+ lv_opa_t opa,
+ const lv_opa_t * mask,
+ lv_coord_t mask_stride);
+
+LV_ATTRIBUTE_FAST_MEM
+static bool arm_2d_copy_normal(lv_color_t * dest_buf,
+ const lv_area_t * dest_area,
+ lv_coord_t dest_stride,
+ const lv_color_t * src_buf,
+ lv_coord_t src_stride,
+ lv_opa_t opa,
+ const lv_opa_t * mask,
+ lv_coord_t mask_stride);
+#endif
+
+LV_ATTRIBUTE_FAST_MEM
+static void lv_draw_arm2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc);
+LV_ATTRIBUTE_FAST_MEM
+static void lv_gpu_arm2d_wait_cb(lv_draw_ctx_t * draw_ctx);
+LV_ATTRIBUTE_FAST_MEM
+static void lv_draw_arm2d_img_decoded(struct _lv_draw_ctx_t * draw_ctx,
+ const lv_draw_img_dsc_t * draw_dsc,
+ const lv_area_t * coords,
+ const uint8_t * src_buf,
+ lv_img_cf_t cf);
+
+/**********************
+ * STATIC VARIABLES
+ **********************/
+
+/**********************
+ * MACROS
+ **********************/
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+
+void lv_draw_arm2d_ctx_init(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx)
+{
+ arm_2d_init();
+
+ lv_draw_sw_init_ctx(drv, draw_ctx);
+
+ lv_draw_arm2d_ctx_t * arm2d_draw_ctx = (lv_draw_sw_ctx_t *)draw_ctx;
+
+ arm2d_draw_ctx->blend = lv_draw_arm2d_blend;
+ arm2d_draw_ctx->base_draw.wait_for_finish = lv_gpu_arm2d_wait_cb;
+
+#if !__ARM_2D_HAS_HW_ACC__
+ arm2d_draw_ctx->base_draw.draw_img_decoded = lv_draw_arm2d_img_decoded;
+#endif
+
+}
+
+void lv_draw_arm2d_ctx_deinit(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx)
+{
+ LV_UNUSED(drv);
+ LV_UNUSED(draw_ctx);
+}
+
+extern void test_flush(lv_color_t * color_p);
+
+#if __ARM_2D_HAS_HW_ACC__
+LV_ATTRIBUTE_FAST_MEM
+static void lv_draw_arm2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc)
+{
+ const lv_opa_t * mask;
+ if(dsc->mask_buf == NULL) mask = NULL;
+ if(dsc->mask_buf && dsc->mask_res == LV_DRAW_MASK_RES_TRANSP) return;
+ else if(dsc->mask_res == LV_DRAW_MASK_RES_FULL_COVER) mask = NULL;
+ else mask = dsc->mask_buf;
+
+
+ lv_area_t blend_area;
+ if(!_lv_area_intersect(&blend_area, dsc->blend_area, draw_ctx->clip_area)) {
+ return;
+ }
+
+ bool is_accelerated = false;
+
+ if(dsc->blend_mode == LV_BLEND_MODE_NORMAL
+ && lv_area_get_size(&blend_area) > 100) {
+
+ __PREPARE_TARGET_TILE__(blend_area);
+ __PREPARE_SOURCE_TILE__(dsc, blend_area);
+ __PREPARE_MASK_TILE__(dsc, blend_area, mask, false);
+
+ if(src_buf) {
+ is_accelerated = lv_draw_arm2d_tile_copy(
+ &target_tile,
+ &target_region,
+ &source_tile,
+ dsc->opa,
+ (NULL == mask) ? NULL : &mask_tile);
+ }
+ else {
+ is_accelerated = lv_draw_arm2d_fill_colour(
+ &target_tile,
+ &target_region,
+ dsc->color,
+ dsc->opa,
+ (NULL == mask) ? NULL : &mask_tile);
+ }
+ }
+
+ if(!is_accelerated) {
+ lv_draw_sw_blend_basic(draw_ctx, dsc);
+ }
+}
+
+
+LV_ATTRIBUTE_FAST_MEM
+static bool lv_draw_arm2d_fill_colour(const arm_2d_tile_t * target_tile,
+ const arm_2d_region_t * region,
+ lv_color_t color,
+ lv_opa_t opa,
+ const arm_2d_tile_t * mask_tile)
+{
+ arm_fsm_rt_t result = (arm_fsm_rt_t)ARM_2D_ERR_NONE;
+
+ if(NULL == mask_tile) {
+ if(opa >= LV_OPA_MAX) {
+ result = arm_2d_fill_colour(target_tile, region, color.full);
+ }
+ else {
+#if LV_COLOR_SCREEN_TRANSP
+ return false;
+#else
+ result = arm_2d_fill_colour_with_alpha(
+ target_tile,
+ region,
+ (arm_2d_color_t) {
+ color.full
+ },
+ opa);
+#endif
+ }
+ }
+ else {
+
+ if(opa >= LV_OPA_MAX) {
+ result = arm_2d_fill_colour_with_mask(
+ target_tile,
+ region,
+ mask_tile,
+ (arm_2d_color_t) {
+ color.full
+ });
+ }
+ else {
+#if LV_COLOR_SCREEN_TRANSP
+ return false;
+#else
+ result = arm_2d_fill_colour_with_mask_and_opacity(
+ target_tile,
+ region,
+ mask_tile,
+ (arm_2d_color_t) {
+ color.full
+ },
+ opa);
+#endif
+ }
+ }
+
+ if(result < 0) {
+ /* error detected */
+ return false;
+ }
+
+ return true;
+
+}
+
+LV_ATTRIBUTE_FAST_MEM
+static bool lv_draw_arm2d_tile_copy(const arm_2d_tile_t * target_tile,
+ const arm_2d_region_t * region,
+ arm_2d_tile_t * source_tile,
+ lv_opa_t opa,
+ arm_2d_tile_t * mask_tile)
+{
+ arm_fsm_rt_t result = (arm_fsm_rt_t)ARM_2D_ERR_NONE;
+
+ if(NULL == mask_tile) {
+ if(opa >= LV_OPA_MAX) {
+ result = arm_2d_tile_copy(source_tile,
+ target_tile,
+ region,
+ ARM_2D_CP_MODE_COPY);
+ }
+#if LV_COLOR_SCREEN_TRANSP
+ else {
+ return false; /* not supported */
+ }
+#else
+ else {
+ result = arm_2d_alpha_blending(source_tile,
+ target_tile,
+ region,
+ opa);
+ }
+#endif
+ }
+ else {
+#if LV_COLOR_SCREEN_TRANSP
+ return false; /* not support */
+#else
+
+ if(opa >= LV_OPA_MAX) {
+ result = arm_2d_tile_copy_with_src_mask(source_tile,
+ mask_tile,
+ target_tile,
+ region,
+ ARM_2D_CP_MODE_COPY);
+ }
+ else {
+ return false;
+ }
+#endif
+ }
+
+ if(result < 0) {
+ /* error detected */
+ return false;
+ }
+
+ return true;
+}
+
+static void lv_gpu_arm2d_wait_cb(lv_draw_ctx_t * draw_ctx)
+{
+ lv_disp_t * disp = _lv_refr_get_disp_refreshing();
+
+ arm_2d_op_wait_async(NULL);
+ if(disp->driver && disp->driver->wait_cb) {
+ disp->driver->wait_cb(disp->driver);
+ }
+ lv_draw_sw_wait_for_finish(draw_ctx);
+}
+#else
+
+
+LV_ATTRIBUTE_FAST_MEM
+static void lv_draw_arm2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc)
+{
+ const lv_opa_t * mask;
+ if(dsc->mask_buf == NULL) mask = NULL;
+ if(dsc->mask_buf && dsc->mask_res == LV_DRAW_MASK_RES_TRANSP) return;
+ else if(dsc->mask_res == LV_DRAW_MASK_RES_FULL_COVER) mask = NULL;
+ else mask = dsc->mask_buf;
+
+ lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area);
+
+ lv_area_t blend_area;
+ if(!_lv_area_intersect(&blend_area, dsc->blend_area, draw_ctx->clip_area)) return;
+
+ lv_disp_t * disp = _lv_refr_get_disp_refreshing();
+
+ bool is_accelerated = false;
+ do {
+ if(NULL != disp->driver->set_px_cb) {
+ break;
+ }
+
+ lv_color_t * dest_buf = draw_ctx->buf;
+ dest_buf += dest_stride * (blend_area.y1 - draw_ctx->buf_area->y1)
+ + (blend_area.x1 - draw_ctx->buf_area->x1);
+
+ const lv_color_t * src_buf = dsc->src_buf;
+ lv_coord_t src_stride;
+ if(src_buf) {
+ src_stride = lv_area_get_width(dsc->blend_area);
+ src_buf += src_stride * (blend_area.y1 - dsc->blend_area->y1) + (blend_area.x1 - dsc->blend_area->x1);
+ }
+ else {
+ src_stride = 0;
+ }
+
+ lv_coord_t mask_stride;
+ if(mask) {
+ mask_stride = lv_area_get_width(dsc->mask_area);
+ mask += mask_stride * (blend_area.y1 - dsc->mask_area->y1) + (blend_area.x1 - dsc->mask_area->x1);
+ }
+ else {
+ mask_stride = 0;
+ }
+
+ lv_area_move(&blend_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1);
+
+
+ if(dsc->src_buf == NULL) {
+ if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) {
+ is_accelerated = arm_2d_fill_normal(dest_buf,
+ &blend_area,
+ dest_stride,
+ dsc->color,
+ dsc->opa,
+ mask,
+ mask_stride);
+ }
+#if LV_DRAW_COMPLEX
+ else {
+ break;
+ }
+#endif
+ }
+ else {
+
+ if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) {
+ is_accelerated = arm_2d_copy_normal(dest_buf,
+ &blend_area,
+ dest_stride,
+ src_buf,
+ src_stride,
+ dsc->opa,
+ mask,
+ mask_stride);
+ }
+#if LV_DRAW_COMPLEX
+ else {
+ break;
+ }
+#endif
+ }
+ } while(0);
+
+ if(!is_accelerated) lv_draw_sw_blend_basic(draw_ctx, dsc);
+}
+
+LV_ATTRIBUTE_FAST_MEM
+static bool arm_2d_fill_normal(lv_color_t * dest_buf,
+ const lv_area_t * dest_area,
+ lv_coord_t dest_stride,
+ lv_color_t color,
+ lv_opa_t opa,
+ const lv_opa_t * mask,
+ lv_coord_t mask_stride)
+{
+ arm_2d_size_t target_size = {
+ .iWidth = lv_area_get_width(dest_area),
+ .iHeight = lv_area_get_height(dest_area),
+ };
+
+ /*No mask*/
+ if(mask == NULL) {
+ if(opa >= LV_OPA_MAX) {
+ __arm_2d_impl_colour_filling((color_int *)dest_buf,
+ dest_stride,
+ &target_size,
+ color.full);
+ }
+ /*Has opacity*/
+ else {
+#if LV_COLOR_SCREEN_TRANSP
+ return false;
+#else
+ __arm_2d_impl_colour_filling_with_opacity((color_int *)dest_buf,
+ dest_stride,
+ &target_size,
+ color.full,
+ opa);
+#endif
+ }
+ }
+ /*Masked*/
+ else {
+ /*Only the mask matters*/
+ if(opa >= LV_OPA_MAX) {
+ __arm_2d_impl_colour_filling_mask((color_int *)dest_buf,
+ dest_stride,
+ (uint8_t *)mask,
+ mask_stride,
+ &target_size,
+ color.full);
+ }
+ /*With opacity*/
+ else {
+#if LV_COLOR_SCREEN_TRANSP
+ return false;
+#else
+ __arm_2d_impl_colour_filling_mask_opacity((color_int *)dest_buf,
+ dest_stride,
+ (uint8_t *)mask,
+ mask_stride,
+ &target_size,
+ color.full,
+ opa);
+#endif
+ }
+ }
+
+ return true;
+}
+
+
+LV_ATTRIBUTE_FAST_MEM
+static bool arm_2d_copy_normal(lv_color_t * dest_buf,
+ const lv_area_t * dest_area,
+ lv_coord_t dest_stride,
+ const lv_color_t * src_buf,
+ lv_coord_t src_stride,
+ lv_opa_t opa,
+ const lv_opa_t * mask,
+ lv_coord_t mask_stride)
+
+{
+ int32_t w = lv_area_get_width(dest_area);
+ int32_t h = lv_area_get_height(dest_area);
+
+ arm_2d_size_t copy_size = {
+ .iWidth = lv_area_get_width(dest_area),
+ .iHeight = lv_area_get_height(dest_area),
+ };
+
+#if LV_COLOR_SCREEN_TRANSP
+ lv_disp_t * disp = _lv_refr_get_disp_refreshing();
+#endif
+
+ /*Simple fill (maybe with opacity), no masking*/
+ if(mask == NULL) {
+ if(opa >= LV_OPA_MAX) {
+ __arm_2d_impl_copy((color_int *)src_buf,
+ src_stride,
+ (color_int *)dest_buf,
+ dest_stride,
+ ©_size);
+ }
+ else {
+#if LV_COLOR_SCREEN_TRANSP
+ return false;
+#else
+ __arm_2d_impl_alpha_blending((color_int *)src_buf,
+ src_stride,
+ (color_int *)dest_buf,
+ dest_stride,
+ ©_size,
+ opa);
+#endif
+ }
+ }
+ /*Masked*/
+ else {
+ /*Only the mask matters*/
+ if(opa > LV_OPA_MAX) {
+#if LV_COLOR_SCREEN_TRANSP
+ return false;
+#else
+ __arm_2d_impl_src_msk_copy((color_int *)src_buf,
+ src_stride,
+ (uint8_t *)mask,
+ mask_stride,
+ ©_size,
+ (color_int *)dest_buf,
+ dest_stride,
+ ©_size);
+#endif
+ }
+ /*Handle opa and mask values too*/
+ else {
+#if LV_COLOR_SCREEN_TRANSP
+ return false;
+#else
+ __arm_2d_impl_gray8_alpha_blending((uint8_t *)mask,
+ mask_stride,
+ (uint8_t *)mask,
+ mask_stride,
+ ©_size,
+ opa);
+
+ __arm_2d_impl_src_msk_copy((color_int *)src_buf,
+ src_stride,
+ (uint8_t *)mask,
+ mask_stride,
+ ©_size,
+ (color_int *)dest_buf,
+ dest_stride,
+ ©_size);
+#endif
+ }
+ }
+
+ return true;
+}
+
+LV_ATTRIBUTE_FAST_MEM
+static void lv_draw_arm2d_img_decoded(struct _lv_draw_ctx_t * draw_ctx,
+ const lv_draw_img_dsc_t * draw_dsc,
+ const lv_area_t * coords,
+ const uint8_t * src_buf,
+ lv_img_cf_t cf)
+{
+ /*Use the clip area as draw area*/
+ lv_area_t draw_area;
+ lv_area_copy(&draw_area, draw_ctx->clip_area);
+
+ bool mask_any = lv_draw_mask_is_any(&draw_area);
+ bool transform = draw_dsc->angle != 0 || draw_dsc->zoom != LV_IMG_ZOOM_NONE ? true : false;
+
+ lv_area_t blend_area;
+ lv_draw_sw_blend_dsc_t blend_dsc;
+
+ lv_memset_00(&blend_dsc, sizeof(lv_draw_sw_blend_dsc_t));
+ blend_dsc.opa = draw_dsc->opa;
+ blend_dsc.blend_mode = draw_dsc->blend_mode;
+ blend_dsc.blend_area = &blend_area;
+
+ /*The simplest case just copy the pixels into the draw_buf*/
+ if(!mask_any && !transform && cf == LV_IMG_CF_TRUE_COLOR && draw_dsc->recolor_opa == LV_OPA_TRANSP) {
+ blend_dsc.src_buf = (const lv_color_t *)src_buf;
+
+ blend_dsc.blend_area = coords;
+ lv_draw_sw_blend(draw_ctx, &blend_dsc);
+ }
+ else if(!mask_any && !transform && cf == LV_IMG_CF_ALPHA_8BIT) {
+ blend_dsc.mask_buf = (lv_opa_t *)src_buf;
+ blend_dsc.mask_area = coords;
+ blend_dsc.src_buf = NULL;
+ blend_dsc.color = draw_dsc->recolor;
+ blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED;
+
+ blend_dsc.blend_area = coords;
+ lv_draw_sw_blend(draw_ctx, &blend_dsc);
+ }
+#if LV_COLOR_DEPTH == 16
+ else if(!mask_any && !transform && cf == LV_IMG_CF_RGB565A8 && draw_dsc->recolor_opa == LV_OPA_TRANSP) {
+ lv_coord_t src_w = lv_area_get_width(coords);
+ lv_coord_t src_h = lv_area_get_height(coords);
+ blend_dsc.src_buf = (const lv_color_t *)src_buf;
+ blend_dsc.mask_buf = (lv_opa_t *)src_buf;
+ blend_dsc.mask_buf += sizeof(lv_color_t) * src_w * src_h;
+ blend_dsc.blend_area = coords;
+ blend_dsc.mask_area = coords;
+ blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED;
+ lv_draw_sw_blend(draw_ctx, &blend_dsc);
+ }
+#endif
+ /*In the other cases every pixel need to be checked one-by-one*/
+ else {
+ blend_area.x1 = draw_ctx->clip_area->x1;
+ blend_area.x2 = draw_ctx->clip_area->x2;
+ blend_area.y1 = draw_ctx->clip_area->y1;
+ blend_area.y2 = draw_ctx->clip_area->y2;
+
+ lv_coord_t src_w = lv_area_get_width(coords);
+ lv_coord_t src_h = lv_area_get_height(coords);
+ lv_coord_t blend_h = lv_area_get_height(&blend_area);
+ lv_coord_t blend_w = lv_area_get_width(&blend_area);
+
+ uint32_t max_buf_size = MAX_BUF_SIZE;
+ uint32_t blend_size = lv_area_get_size(&blend_area);
+ uint32_t buf_h;
+ uint32_t buf_w = blend_w;
+ if(blend_size <= max_buf_size) {
+ buf_h = blend_h;
+ }
+ else {
+ /*Round to full lines*/
+ buf_h = max_buf_size / blend_w;
+ }
+
+ /*Create buffers and masks*/
+ uint32_t buf_size = buf_w * buf_h;
+
+ lv_color_t * rgb_buf = lv_mem_buf_get(buf_size * sizeof(lv_color_t));
+ lv_opa_t * mask_buf = lv_mem_buf_get(buf_size);
+ blend_dsc.mask_buf = mask_buf;
+ blend_dsc.mask_area = &blend_area;
+ blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED;
+ blend_dsc.src_buf = rgb_buf;
+ lv_coord_t y_last = blend_area.y2;
+ blend_area.y2 = blend_area.y1 + buf_h - 1;
+
+ lv_draw_mask_res_t mask_res_def = (cf != LV_IMG_CF_TRUE_COLOR || draw_dsc->angle ||
+ draw_dsc->zoom != LV_IMG_ZOOM_NONE) ?
+ LV_DRAW_MASK_RES_CHANGED : LV_DRAW_MASK_RES_FULL_COVER;
+ blend_dsc.mask_res = mask_res_def;
+
+ bool is_accelerated = false;
+
+ if(!transform) {
+ if(LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED == cf) {
+ /* copy with colour keying */
+
+ /* *INDENT-OFF* */
+ __RECOLOUR_WRAPPER(
+
+ lv_color_t chrome_key = LV_COLOR_CHROMA_KEY;
+ /* calculate new chrome-key colour */
+ if(draw_dsc->recolor_opa > LV_OPA_MIN) {
+ __ARM_2D_PIXEL_BLENDING_OPA(
+ (color_int *) & (draw_dsc->recolor.full),
+ (color_int *) & (chrome_key.full),
+ draw_dsc->recolor_opa
+ );
+ }
+
+ __PREPARE_LL_ACCELERATION__();
+
+ if(blend_dsc.opa >= LV_OPA_MAX) {
+ __arm_2d_impl_cl_key_copy(
+ (color_int *)src_buf_tmp,
+ src_stride,
+ (color_int *)dest_buf,
+ dest_stride,
+ ©_size,
+ (color_int)chrome_key.full);
+ }
+ else {
+ __arm_2d_impl_alpha_blending_colour_keying(
+ (color_int *)src_buf_tmp,
+ src_stride,
+ (color_int *)dest_buf,
+ dest_stride,
+ ©_size,
+ blend_dsc.opa,
+ (color_int)chrome_key.full);
+ }
+ is_accelerated = true;
+ )
+ /* *INDENT-ON* */
+ }
+ else if((LV_COLOR_DEPTH == 32)
+ && !mask_any
+ && (cf == LV_IMG_CF_TRUE_COLOR_ALPHA)) {
+ /* accelerate copy-with-source-masks-and-opacity */
+
+ /* *INDENT-OFF* */
+ __RECOLOUR_WRAPPER(
+ __PREPARE_LL_ACCELERATION__();
+
+ uint8_t * mask_temp_buf = NULL;
+ if(blend_dsc.opa < LV_OPA_MAX) {
+ mask_temp_buf = lv_mem_buf_get(copy_size.iHeight * copy_size.iWidth);
+ if(NULL == mask_temp_buf) {
+ LV_LOG_WARN(
+ "Failed to allocate memory for alpha mask,"
+ " use normal route instead.");
+ break;
+ }
+ lv_memset_00(mask_temp_buf, copy_size.iHeight * copy_size.iWidth);
+
+ __arm_2d_impl_gray8_colour_filling_channel_mask_opacity(
+ mask_temp_buf,
+ src_stride,
+ (uint32_t *)
+ ((uintptr_t)src_buf_tmp + LV_IMG_PX_SIZE_ALPHA_BYTE - 1),
+ src_stride,
+ ©_size,
+ 0xFF,
+ blend_dsc.opa);
+
+ __arm_2d_impl_src_msk_copy(
+ (color_int *)src_buf_tmp,
+ src_stride,
+ mask_temp_buf,
+ src_stride,
+ ©_size,
+ (color_int *)dest_buf,
+ dest_stride,
+ ©_size);
+
+ lv_mem_buf_release(mask_temp_buf);
+ }
+ else {
+ __arm_2d_impl_src_chn_msk_copy(
+ (color_int *)src_buf_tmp,
+ src_stride,
+ (uint32_t *)
+ ((uintptr_t)src_buf_tmp + LV_IMG_PX_SIZE_ALPHA_BYTE - 1),
+ src_stride,
+ ©_size,
+ (color_int *)dest_buf,
+ dest_stride,
+ ©_size);
+ }
+
+ is_accelerated = true;
+ )
+ /* *INDENT-ON* */
+ }
+ else if(!mask_any && (cf == LV_IMG_CF_TRUE_COLOR)) {
+ /* accelerate copy-with-source-masks-and-opacity */
+
+ /* *INDENT-OFF* */
+ __RECOLOUR_WRAPPER(
+ __PREPARE_LL_ACCELERATION__();
+
+ if(blend_dsc.opa >= LV_OPA_MAX) {
+ __arm_2d_impl_copy(
+ (color_int *)src_buf_tmp,
+ src_stride,
+ (color_int *)dest_buf,
+ dest_stride,
+ ©_size);
+ }
+ else {
+ __arm_2d_impl_alpha_blending(
+ (color_int *)src_buf_tmp,
+ src_stride,
+ (color_int *)dest_buf,
+ dest_stride,
+ ©_size,
+ blend_dsc.opa);
+ }
+ is_accelerated = true;
+ )
+ /* *INDENT-ON* */
+ }
+ }
+ else if(!mask_any
+#if defined(__ARM_2D_HAS_ANTI_ALIAS_TRANSFORM__) && __ARM_2D_HAS_ANTI_ALIAS_TRANSFORM__
+ && (draw_dsc->antialias == 1)
+#else
+ && (draw_dsc->antialias == 0)
+#endif
+ && (draw_dsc->recolor_opa == LV_OPA_TRANSP)
+ && (((LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED == cf)
+ || (LV_IMG_CF_TRUE_COLOR == cf))
+#if defined(__ARM_2D_CFG_SUPPORT_COLOUR_CHANNEL_ACCESS__) && __ARM_2D_CFG_SUPPORT_COLOUR_CHANNEL_ACCESS__
+ || ((LV_IMG_CF_TRUE_COLOR_ALPHA == cf)
+ && (LV_COLOR_DEPTH == 32))
+#endif
+ )
+ ) {
+
+ /* *INDENT-OFF* */
+ __RECOLOUR_WRAPPER(
+ /* accelerate transform without re-color */
+
+ static arm_2d_tile_t target_tile_origin;
+ static arm_2d_tile_t target_tile;
+ arm_2d_region_t clip_region;
+ static arm_2d_region_t target_region;
+
+ lv_color_t * dest_buf = draw_ctx->buf;
+
+ target_tile_origin = (arm_2d_tile_t) {
+ .tRegion = {
+ .tSize = {
+ .iWidth = lv_area_get_width(draw_ctx->buf_area),
+ .iHeight = lv_area_get_height(draw_ctx->buf_area),
+ },
+ },
+ .tInfo.bIsRoot = true,
+ .phwBuffer = (uint16_t *)draw_ctx->buf,
+ };
+
+ clip_region = (arm_2d_region_t) {
+ .tLocation = {
+ .iX = draw_ctx->clip_area->x1 - draw_ctx->buf_area->x1,
+ .iY = draw_ctx->clip_area->y1 - draw_ctx->buf_area->y1,
+ },
+ .tSize = {
+ .iWidth = lv_area_get_width(draw_ctx->clip_area),
+ .iHeight = lv_area_get_height(draw_ctx->clip_area),
+ },
+ };
+
+ arm_2d_tile_generate_child(&target_tile_origin,
+ &clip_region,
+ &target_tile,
+ false);
+
+ target_region = (arm_2d_region_t) {
+ .tLocation = {
+ .iX = coords->x1 - draw_ctx->clip_area->x1,
+ .iY = coords->y1 - draw_ctx->clip_area->y1,
+ },
+ .tSize = {
+ .iWidth = lv_area_get_width(coords),
+ .iHeight = lv_area_get_height(coords),
+ },
+ };
+
+ static arm_2d_tile_t source_tile;
+
+ source_tile = (arm_2d_tile_t) {
+ .tRegion = {
+ .tSize = {
+ .iWidth = src_w,
+ .iHeight = src_h,
+ },
+ },
+ .tInfo.bIsRoot = true,
+ .pchBuffer = (uint8_t *)src_buf,
+ };
+
+ static arm_2d_tile_t mask_tile;
+ mask_tile = source_tile;
+
+ mask_tile.tInfo.bHasEnforcedColour = true;
+ mask_tile.tInfo.tColourInfo.chScheme = ARM_2D_CHANNEL_8in32;
+ mask_tile.pchBuffer += 3;
+
+ static arm_2d_location_t source_center, target_center;
+ source_center.iX = draw_dsc->pivot.x;
+ source_center.iY = draw_dsc->pivot.y;
+
+
+ if((LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED == cf) ||
+ (LV_IMG_CF_TRUE_COLOR == cf)) {
+ arm_2d_tile_transform_with_opacity(
+ &source_tile,
+ &target_tile,
+ &target_region,
+ source_center,
+ ARM_2D_ANGLE((draw_dsc->angle / 10.0f)),
+ draw_dsc->zoom / 256.0f,
+ (color_int)LV_COLOR_CHROMA_KEY.full,
+ blend_dsc.opa);
+
+ is_accelerated = true;
+ }
+ #if defined(__ARM_2D_CFG_SUPPORT_COLOUR_CHANNEL_ACCESS__) \
+ && __ARM_2D_CFG_SUPPORT_COLOUR_CHANNEL_ACCESS__
+ else if((LV_IMG_CF_TRUE_COLOR_ALPHA == cf) &&
+ (LV_COLOR_DEPTH == 32)) {
+ arm_2d_tile_transform_with_src_mask_and_opacity(
+ &source_tile,
+ &mask_tile,
+ &target_tile,
+ &target_region,
+ source_center,
+ ARM_2D_ANGLE((draw_dsc->angle / 10.0f)),
+ draw_dsc->zoom / 256.0f,
+ blend_dsc.opa);
+
+ is_accelerated = true;
+ }
+ #endif
+ )
+ /* *INDENT-ON* */
+ }
+
+ /* *INDENT-OFF* */
+ if(!is_accelerated) while(blend_area.y1 <= y_last) {
+ /*Apply transformations if any or separate the channels*/
+ lv_area_t transform_area;
+ lv_area_copy(&transform_area, &blend_area);
+ lv_area_move(&transform_area, -coords->x1, -coords->y1);
+ if(transform) {
+ lv_draw_transform(draw_ctx, &transform_area, src_buf, src_w, src_h, src_w,
+ draw_dsc, cf, rgb_buf, mask_buf);
+ }
+ else {
+ convert_cb(&transform_area, src_buf, src_w, src_h, src_w, draw_dsc, cf, rgb_buf, mask_buf);
+ }
+
+ /*Apply recolor*/
+ if(draw_dsc->recolor_opa > LV_OPA_MIN) {
+ arm_2d_size_t copy_size = {
+ .iWidth = buf_w,
+ .iHeight = buf_h,
+ };
+
+ /* apply re-colour */
+ __arm_2d_impl_colour_filling_with_opacity(
+ (color_int *)rgb_buf,
+ buf_w,
+ ©_size,
+ (color_int)draw_dsc->recolor.full,
+ draw_dsc->recolor_opa);
+ }
+#if LV_DRAW_COMPLEX
+ /*Apply the masks if any*/
+ if(mask_any) {
+ lv_coord_t y;
+ lv_opa_t * mask_buf_tmp = mask_buf;
+ for(y = blend_area.y1; y <= blend_area.y2; y++) {
+ lv_draw_mask_res_t mask_res_line;
+ mask_res_line = lv_draw_mask_apply(mask_buf_tmp, blend_area.x1, y, blend_w);
+
+ if(mask_res_line == LV_DRAW_MASK_RES_TRANSP) {
+ lv_memset_00(mask_buf_tmp, blend_w);
+ blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED;
+ }
+ else if(mask_res_line == LV_DRAW_MASK_RES_CHANGED) {
+ blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED;
+ }
+ mask_buf_tmp += blend_w;
+ }
+ }
+#endif
+
+ /*Blend*/
+ lv_draw_sw_blend(draw_ctx, &blend_dsc);
+
+ /*Go the the next lines*/
+ blend_area.y1 = blend_area.y2 + 1;
+ blend_area.y2 = blend_area.y1 + buf_h - 1;
+ if(blend_area.y2 > y_last) blend_area.y2 = y_last;
+ }
+
+ lv_mem_buf_release(mask_buf);
+ lv_mem_buf_release(rgb_buf);
+ }
+}
+
+static void lv_gpu_arm2d_wait_cb(lv_draw_ctx_t * draw_ctx)
+{
+ lv_disp_t * disp = _lv_refr_get_disp_refreshing();
+
+ arm_2d_op_wait_async(NULL);
+ if(disp->driver && disp->driver->wait_cb) {
+ disp->driver->wait_cb(disp->driver);
+ }
+ lv_draw_sw_wait_for_finish(draw_ctx);
+}
+
+
+#endif
+
+
+/**********************
+ * STATIC FUNCTIONS
+ **********************/
+/* Separate the image channels to RGB and Alpha to match LV_COLOR_DEPTH settings*/
+static void convert_cb(const lv_area_t * dest_area, const void * src_buf, lv_coord_t src_w, lv_coord_t src_h,
+ lv_coord_t src_stride, const lv_draw_img_dsc_t * draw_dsc, lv_img_cf_t cf, lv_color_t * cbuf, lv_opa_t * abuf)
+{
+ LV_UNUSED(draw_dsc);
+ LV_UNUSED(src_h);
+ LV_UNUSED(src_w);
+
+ const uint8_t * src_tmp8 = (const uint8_t *)src_buf;
+ lv_coord_t y;
+ lv_coord_t x;
+
+ if(cf == LV_IMG_CF_TRUE_COLOR || cf == LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED) {
+ uint32_t px_cnt = lv_area_get_size(dest_area);
+ lv_memset_ff(abuf, px_cnt);
+
+ src_tmp8 += (src_stride * dest_area->y1 * sizeof(lv_color_t)) + dest_area->x1 * sizeof(lv_color_t);
+ uint32_t dest_w = lv_area_get_width(dest_area);
+ uint32_t dest_w_byte = dest_w * sizeof(lv_color_t);
+
+ lv_coord_t src_stride_byte = src_stride * sizeof(lv_color_t);
+ lv_color_t * cbuf_tmp = cbuf;
+ for(y = dest_area->y1; y <= dest_area->y2; y++) {
+ lv_memcpy(cbuf_tmp, src_tmp8, dest_w_byte);
+ src_tmp8 += src_stride_byte;
+ cbuf_tmp += dest_w;
+ }
+
+ /*Make "holes" for with Chroma keying*/
+ if(cf == LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED) {
+ uint32_t i;
+ lv_color_t chk = LV_COLOR_CHROMA_KEY;
+#if LV_COLOR_DEPTH == 8 || LV_COLOR_DEPTH == 1
+ uint8_t * cbuf_uint = (uint8_t *)cbuf;
+ uint8_t chk_v = chk.full;
+#elif LV_COLOR_DEPTH == 16
+ uint16_t * cbuf_uint = (uint16_t *)cbuf;
+ uint16_t chk_v = chk.full;
+#elif LV_COLOR_DEPTH == 32
+ uint32_t * cbuf_uint = (uint32_t *)cbuf;
+ uint32_t chk_v = chk.full;
+#endif
+ for(i = 0; i < px_cnt; i++) {
+ if(chk_v == cbuf_uint[i]) abuf[i] = 0x00;
+ }
+ }
+ }
+ else if(cf == LV_IMG_CF_TRUE_COLOR_ALPHA) {
+ src_tmp8 += (src_stride * dest_area->y1 * LV_IMG_PX_SIZE_ALPHA_BYTE) + dest_area->x1 * LV_IMG_PX_SIZE_ALPHA_BYTE;
+
+ lv_coord_t src_new_line_step_px = (src_stride - lv_area_get_width(dest_area));
+ lv_coord_t src_new_line_step_byte = src_new_line_step_px * LV_IMG_PX_SIZE_ALPHA_BYTE;
+
+ lv_coord_t dest_h = lv_area_get_height(dest_area);
+ lv_coord_t dest_w = lv_area_get_width(dest_area);
+ for(y = 0; y < dest_h; y++) {
+ for(x = 0; x < dest_w; x++) {
+ abuf[x] = src_tmp8[LV_IMG_PX_SIZE_ALPHA_BYTE - 1];
+#if LV_COLOR_DEPTH == 8 || LV_COLOR_DEPTH == 1
+ cbuf[x].full = *src_tmp8;
+#elif LV_COLOR_DEPTH == 16
+ cbuf[x].full = *src_tmp8 + ((*(src_tmp8 + 1)) << 8);
+#elif LV_COLOR_DEPTH == 32
+ cbuf[x] = *((lv_color_t *) src_tmp8);
+ cbuf[x].ch.alpha = 0xff;
+#endif
+ src_tmp8 += LV_IMG_PX_SIZE_ALPHA_BYTE;
+
+ }
+ cbuf += dest_w;
+ abuf += dest_w;
+ src_tmp8 += src_new_line_step_byte;
+ }
+ }
+ else if(cf == LV_IMG_CF_RGB565A8) {
+ src_tmp8 += (src_stride * dest_area->y1 * sizeof(lv_color_t)) + dest_area->x1 * sizeof(lv_color_t);
+
+ lv_coord_t src_stride_byte = src_stride * sizeof(lv_color_t);
+
+ lv_coord_t dest_h = lv_area_get_height(dest_area);
+ lv_coord_t dest_w = lv_area_get_width(dest_area);
+ for(y = 0; y < dest_h; y++) {
+ lv_memcpy(cbuf, src_tmp8, dest_w * sizeof(lv_color_t));
+ cbuf += dest_w;
+ src_tmp8 += src_stride_byte;
+ }
+
+ src_tmp8 = (const uint8_t *)src_buf;
+ src_tmp8 += sizeof(lv_color_t) * src_w * src_h;
+ src_tmp8 += src_stride * dest_area->y1 + dest_area->x1;
+ for(y = 0; y < dest_h; y++) {
+ lv_memcpy(abuf, src_tmp8, dest_w);
+ abuf += dest_w;
+ src_tmp8 += src_stride;
+ }
+ }
+}
+
+#if 0
+static void invalidate_cache(void)
+{
+ lv_disp_t * disp = _lv_refr_get_disp_refreshing();
+ if(disp->driver->clean_dcache_cb) disp->driver->clean_dcache_cb(disp->driver);
+ else {
+#if __CORTEX_M >= 0x07
+ if((SCB->CCR) & (uint32_t)SCB_CCR_DC_Msk)
+ SCB_CleanInvalidateDCache();
+#endif
+ }
+}
+#endif
+
+#endif
diff --git a/src/draw/arm2d/lv_gpu_arm2d.h b/src/draw/arm2d/lv_gpu_arm2d.h
new file mode 100644
index 000000000..50fa5a891
--- /dev/null
+++ b/src/draw/arm2d/lv_gpu_arm2d.h
@@ -0,0 +1,51 @@
+/**
+ * @file lv_gpu_arm2d.h
+ *
+ */
+
+#ifndef LV_GPU_ARM2D_H
+#define LV_GPU_ARM2D_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ * INCLUDES
+ *********************/
+#include "../../misc/lv_color.h"
+#include "../../hal/lv_hal_disp.h"
+#include "../sw/lv_draw_sw.h"
+
+#if LV_USE_GPU_ARM2D
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+typedef lv_draw_sw_ctx_t lv_draw_arm2d_ctx_t;
+
+struct _lv_disp_drv_t;
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+void lv_draw_arm2d_ctx_init(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx);
+
+void lv_draw_arm2d_ctx_deinit(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx);
+
+/**********************
+ * MACROS
+ **********************/
+
+#endif /*LV_USE_GPU_ARM2D*/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /*LV_GPU_ARM2D_H*/
diff --git a/src/draw/lv_draw.c b/src/draw/lv_draw.c
index 116e3b231..823f70768 100644
--- a/src/draw/lv_draw.c
+++ b/src/draw/lv_draw.c
@@ -39,12 +39,12 @@
void lv_draw_init(void)
{
- // backend_head = NULL;
- // lv_draw_sw_init();
- //
- //#if LV_USE_GPU_STM32_DMA2D == 0
- // lv_gpu_stm32_dma2d_init();
- //#endif
+ /*Nothing to init now*/
+}
+
+void lv_draw_wait_for_finish(lv_draw_ctx_t * draw_ctx)
+{
+ if(draw_ctx->wait_for_finish) draw_ctx->wait_for_finish(draw_ctx);
}
/**********************
diff --git a/src/draw/lv_draw.h b/src/draw/lv_draw.h
index 8e3c6cb94..80b62e9f0 100644
--- a/src/draw/lv_draw.h
+++ b/src/draw/lv_draw.h
@@ -27,6 +27,8 @@ extern "C" {
#include "lv_draw_triangle.h"
#include "lv_draw_arc.h"
#include "lv_draw_mask.h"
+#include "lv_draw_transform.h"
+#include "lv_draw_layer.h"
/*********************
* DEFINES
@@ -40,6 +42,19 @@ typedef struct {
void * user_data;
} lv_draw_mask_t;
+typedef struct _lv_draw_layer_ctx_t {
+ lv_area_t area_full;
+ lv_area_t area_act;
+ lv_coord_t max_row_with_alpha;
+ lv_coord_t max_row_with_no_alpha;
+ void * buf;
+ struct {
+ const lv_area_t * clip_area;
+ lv_area_t * buf_area;
+ void * buf;
+ bool screen_transp;
+ } original;
+} lv_draw_layer_ctx_t;
typedef struct _lv_draw_ctx_t {
/**
@@ -80,6 +95,24 @@ typedef struct _lv_draw_ctx_t {
void (*draw_polygon)(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * draw_dsc,
const lv_point_t * points, uint16_t point_cnt);
+
+ /**
+ * Get an area of a transformed image (zoomed and/or rotated)
+ * @param draw_ctx pointer to a draw context
+ * @param dest_area get this area of the result image. It assumes that the original image is placed to the 0;0 position.
+ * @param src_buf the source image
+ * @param src_w width of the source image in [px]
+ * @param src_h height of the source image in [px]
+ * @param src_stride the stride in [px].
+ * @param draw_dsc an `lv_draw_img_dsc_t` descriptor containing the transformation parameters
+ * @param cf the color format of `src_buf`
+ * @param cbuf place the colors of the pixels on `dest_area` here in RGB format
+ * @param abuf place the opacity of the pixels on `dest_area` here
+ */
+ void (*draw_transform)(struct _lv_draw_ctx_t * draw_ctx, const lv_area_t * dest_area, const void * src_buf,
+ lv_coord_t src_w, lv_coord_t src_h, lv_coord_t src_stride,
+ const lv_draw_img_dsc_t * draw_dsc, lv_img_cf_t cf, lv_color_t * cbuf, lv_opa_t * abuf);
+
/**
* Replace the buffer with a rect without decoration like radius or borders
*/
@@ -88,7 +121,68 @@ typedef struct _lv_draw_ctx_t {
/**
* Wait until all background operations are finished. (E.g. GPU operations)
*/
- void (*wait_for_finish)(struct _lv_draw_ctx_t * draw);
+ void (*wait_for_finish)(struct _lv_draw_ctx_t * draw_ctx);
+
+ /**
+ * Copy an area from buffer to an other
+ * @param draw_ctx pointer to a draw context
+ * @param dest_buf copy the buffer into this buffer
+ * @param dest_stride the width of the dest_buf in pixels
+ * @param dest_area the destination area
+ * @param src_buf copy from this buffer
+ * @param src_stride the width of src_buf in pixels
+ * @param src_area the source area.
+ *
+ * @note dest_area and src_area must have the same width and height
+ * but can have different x and y position.
+ * @note dest_area and src_area must be clipped to the real dimensions of the buffers
+ */
+ void (*buffer_copy)(struct _lv_draw_ctx_t * draw_ctx, void * dest_buf, lv_coord_t dest_stride,
+ const lv_area_t * dest_area,
+ void * src_buf, lv_coord_t src_stride, const lv_area_t * src_area);
+
+ /**
+ * Initialize a new layer context.
+ * The original buffer and area data are already saved from `draw_ctx` to `layer_ctx`
+ * @param draw_ctx pointer to the current draw context
+ * @param layer_area the coordinates of the layer
+ * @param flags OR-ed flags from @lv_draw_layer_flags_t
+ * @return pointer to the layer context, or NULL on error
+ */
+ struct _lv_draw_layer_ctx_t * (*layer_init)(struct _lv_draw_ctx_t * draw_ctx, struct _lv_draw_layer_ctx_t * layer_ctx,
+ lv_draw_layer_flags_t flags);
+
+ /**
+ * Adjust the layer_ctx and/or draw_ctx based on the `layer_ctx->area_act`.
+ * It's called only if flags has `LV_DRAW_LAYER_FLAG_CAN_SUBDIVIDE`
+ * @param draw_ctx pointer to the current draw context
+ * @param layer_ctx pointer to a layer context
+ * @param flags OR-ed flags from @lv_draw_layer_flags_t
+ */
+ void (*layer_adjust)(struct _lv_draw_ctx_t * draw_ctx, struct _lv_draw_layer_ctx_t * layer_ctx,
+ lv_draw_layer_flags_t flags);
+
+ /**
+ * Blend a rendered layer to `layer_ctx->area_act`
+ * @param draw_ctx pointer to the current draw context
+ * @param layer_ctx pointer to a layer context
+ * @param draw_dsc pointer to an image draw descriptor
+ */
+ void (*layer_blend)(struct _lv_draw_ctx_t * draw_ctx, struct _lv_draw_layer_ctx_t * layer_ctx,
+ const lv_draw_img_dsc_t * draw_dsc);
+
+ /**
+ * Destroy a layer context. The original buffer and area data of the `draw_ctx` will be restored
+ * and the `layer_ctx` itself will be freed automatically.
+ * @param draw_ctx pointer to the current draw context
+ * @param layer_ctx pointer to a layer context
+ */
+ void (*layer_destroy)(struct _lv_draw_ctx_t * draw_ctx, lv_draw_layer_ctx_t * layer_ctx);
+
+ /**
+ * Size of a layer context in bytes.
+ */
+ size_t layer_instance_size;
#if LV_USE_USER_DATA
void * user_data;
@@ -102,6 +196,9 @@ typedef struct _lv_draw_ctx_t {
void lv_draw_init(void);
+
+void lv_draw_wait_for_finish(lv_draw_ctx_t * draw_ctx);
+
/**********************
* GLOBAL VARIABLES
**********************/
diff --git a/src/draw/lv_draw.mk b/src/draw/lv_draw.mk
index 803e06494..f48f48fe0 100644
--- a/src/draw/lv_draw.mk
+++ b/src/draw/lv_draw.mk
@@ -5,6 +5,8 @@ CSRCS += lv_draw_label.c
CSRCS += lv_draw_line.c
CSRCS += lv_draw_mask.c
CSRCS += lv_draw_rect.c
+CSRCS += lv_draw_transform.c
+CSRCS += lv_draw_layer.c
CSRCS += lv_draw_triangle.c
CSRCS += lv_img_buf.c
CSRCS += lv_img_cache.c
@@ -15,4 +17,9 @@ VPATH += :$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw
CFLAGS += "-I$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw"
+include $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/arm2d/lv_draw_arm2d.mk
+include $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nxp/lv_draw_nxp.mk
include $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/sdl/lv_draw_sdl.mk
+include $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/stm32_dma2d/lv_draw_stm32_dma2d.mk
+include $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/sw/lv_draw_sw.mk
+include $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/swm341_dma2d/lv_draw_swm341_dma2d.mk
diff --git a/src/draw/lv_draw_img.c b/src/draw/lv_draw_img.c
index 320913255..41dc0f039 100644
--- a/src/draw/lv_draw_img.c
+++ b/src/draw/lv_draw_img.c
@@ -236,12 +236,21 @@ LV_ATTRIBUTE_FAST_MEM static lv_res_t decode_and_draw(lv_draw_ctx_t * draw_ctx,
if(cdsc == NULL) return LV_RES_INV;
-
lv_img_cf_t cf;
if(lv_img_cf_is_chroma_keyed(cdsc->dec_dsc.header.cf)) cf = LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED;
+ else if(LV_IMG_CF_ALPHA_8BIT == cdsc->dec_dsc.header.cf) cf = LV_IMG_CF_ALPHA_8BIT;
+ else if(LV_IMG_CF_RGB565A8 == cdsc->dec_dsc.header.cf) cf = LV_IMG_CF_RGB565A8;
else if(lv_img_cf_has_alpha(cdsc->dec_dsc.header.cf)) cf = LV_IMG_CF_TRUE_COLOR_ALPHA;
else cf = LV_IMG_CF_TRUE_COLOR;
+ if(cf == LV_IMG_CF_ALPHA_8BIT) {
+ if(draw_dsc->angle || draw_dsc->zoom != LV_IMG_ZOOM_NONE) {
+ /* resume normal method */
+ cf = LV_IMG_CF_TRUE_COLOR_ALPHA;
+ cdsc->dec_dsc.img_data = NULL;
+ }
+ }
+
if(cdsc->dec_dsc.error_msg != NULL) {
LV_LOG_WARN("Image draw error");
diff --git a/src/draw/lv_draw_img.h b/src/draw/lv_draw_img.h
index 504bedae4..a88a33caf 100644
--- a/src/draw/lv_draw_img.h
+++ b/src/draw/lv_draw_img.h
@@ -31,7 +31,7 @@ extern "C" {
typedef struct {
- uint16_t angle;
+ int16_t angle;
uint16_t zoom;
lv_point_t pivot;
diff --git a/src/draw/lv_draw_label.c b/src/draw/lv_draw_label.c
index 8569c7dd0..7f80df453 100644
--- a/src/draw/lv_draw_label.c
+++ b/src/draw/lv_draw_label.c
@@ -202,7 +202,7 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_label(lv_draw_ctx_t * draw_ctx, const lv_draw
cmd_state_t cmd_state = CMD_STATE_WAIT;
uint32_t i;
uint32_t par_start = 0;
- lv_color_t recolor;
+ lv_color_t recolor = lv_color_black();
lv_color_t color = lv_color_black();
int32_t letter_w;
diff --git a/src/draw/lv_draw_layer.c b/src/draw/lv_draw_layer.c
new file mode 100644
index 000000000..da35682d1
--- /dev/null
+++ b/src/draw/lv_draw_layer.c
@@ -0,0 +1,93 @@
+/**
+ * @file lv_draw_layer.c
+ *
+ */
+
+/*********************
+ * INCLUDES
+ *********************/
+#include "lv_draw.h"
+#include "lv_draw_arc.h"
+#include "../core/lv_refr.h"
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+
+/**********************
+ * STATIC VARIABLES
+ **********************/
+
+/**********************
+ * MACROS
+ **********************/
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+
+lv_draw_layer_ctx_t * lv_draw_layer_create(lv_draw_ctx_t * draw_ctx, const lv_area_t * layer_area,
+ lv_draw_layer_flags_t flags)
+{
+ if(draw_ctx->layer_init == NULL) return NULL;
+
+ lv_draw_layer_ctx_t * layer_ctx = lv_mem_alloc(draw_ctx->layer_instance_size);
+ LV_ASSERT_MALLOC(layer_ctx);
+ if(layer_ctx == NULL) {
+ LV_LOG_WARN("Couldn't allocate a new layer context");
+ return NULL;
+ }
+
+ lv_memset_00(layer_ctx, draw_ctx->layer_instance_size);
+
+ lv_disp_t * disp_refr = _lv_refr_get_disp_refreshing();
+ layer_ctx->original.buf = draw_ctx->buf;
+ layer_ctx->original.buf_area = draw_ctx->buf_area;
+ layer_ctx->original.clip_area = draw_ctx->clip_area;
+ layer_ctx->original.screen_transp = disp_refr->driver->screen_transp;
+ layer_ctx->area_full = *layer_area;
+
+ lv_draw_layer_ctx_t * init_layer_ctx = draw_ctx->layer_init(draw_ctx, layer_ctx, flags);
+ if(NULL == init_layer_ctx) {
+ lv_mem_free(layer_ctx);
+ }
+ return init_layer_ctx;
+}
+
+void lv_draw_layer_adjust(struct _lv_draw_ctx_t * draw_ctx, struct _lv_draw_layer_ctx_t * layer_ctx,
+ lv_draw_layer_flags_t flags)
+{
+ if(draw_ctx->layer_adjust) draw_ctx->layer_adjust(draw_ctx, layer_ctx, flags);
+}
+
+void lv_draw_layer_blend(struct _lv_draw_ctx_t * draw_ctx, struct _lv_draw_layer_ctx_t * layer_ctx,
+ lv_draw_img_dsc_t * draw_dsc)
+{
+ if(draw_ctx->layer_blend) draw_ctx->layer_blend(draw_ctx, layer_ctx, draw_dsc);
+}
+
+void lv_draw_layer_destroy(lv_draw_ctx_t * draw_ctx, lv_draw_layer_ctx_t * layer_ctx)
+{
+
+ lv_draw_wait_for_finish(draw_ctx);
+ draw_ctx->buf = layer_ctx->original.buf;
+ draw_ctx->buf_area = layer_ctx->original.buf_area;
+ draw_ctx->clip_area = layer_ctx->original.clip_area;
+ lv_disp_t * disp_refr = _lv_refr_get_disp_refreshing();
+ disp_refr->driver->screen_transp = layer_ctx->original.screen_transp;
+
+ if(draw_ctx->layer_destroy) draw_ctx->layer_destroy(draw_ctx, layer_ctx);
+ lv_mem_free(layer_ctx);
+}
+
+/**********************
+ * STATIC FUNCTIONS
+ **********************/
diff --git a/src/draw/lv_draw_layer.h b/src/draw/lv_draw_layer.h
new file mode 100644
index 000000000..cd64149c4
--- /dev/null
+++ b/src/draw/lv_draw_layer.h
@@ -0,0 +1,83 @@
+/**
+ * @file lv_draw_layer.h
+ *
+ */
+
+#ifndef LV_DRAW_LAYER_H
+#define LV_DRAW_LAYER_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ * INCLUDES
+ *********************/
+#include "../lv_conf_internal.h"
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+struct _lv_draw_ctx_t;
+struct _lv_draw_layer_ctx_t;
+
+typedef enum {
+ LV_DRAW_LAYER_FLAG_NONE,
+ LV_DRAW_LAYER_FLAG_HAS_ALPHA,
+ LV_DRAW_LAYER_FLAG_CAN_SUBDIVIDE,
+} lv_draw_layer_flags_t;
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+/**
+ * Create a new layer context. It is used to start and independent rendering session
+ * with the current draw_ctx
+ * @param draw_ctx pointer to the current draw context
+ * @param layer_area the coordinates of the layer
+ * @param flags OR-ed flags from @lv_draw_layer_flags_t
+ * @return pointer to the layer context, or NULL on error
+ */
+struct _lv_draw_layer_ctx_t * lv_draw_layer_create(struct _lv_draw_ctx_t * draw_ctx, const lv_area_t * layer_area,
+ lv_draw_layer_flags_t flags);
+
+/**
+ * Adjust the layer_ctx and/or draw_ctx based on the `layer_ctx->area_act`.
+ * It's called only if flags has `LV_DRAW_LAYER_FLAG_CAN_SUBDIVIDE`
+ * @param draw_ctx pointer to the current draw context
+ * @param layer_ctx pointer to a layer context
+ * @param flags OR-ed flags from @lv_draw_layer_flags_t
+ */
+void lv_draw_layer_adjust(struct _lv_draw_ctx_t * draw_ctx, struct _lv_draw_layer_ctx_t * layer_ctx,
+ lv_draw_layer_flags_t flags);
+
+/**
+ * Blend a rendered layer to `layer_ctx->area_act`
+ * @param draw_ctx pointer to the current draw context
+ * @param layer_ctx pointer to a layer context
+ * @param draw_dsc pointer to an image draw descriptor
+ */
+void lv_draw_layer_blend(struct _lv_draw_ctx_t * draw_ctx, struct _lv_draw_layer_ctx_t * layer_ctx,
+ lv_draw_img_dsc_t * draw_dsc);
+
+/**
+ * Destroy a layer context.
+ * @param draw_ctx pointer to the current draw context
+ * @param layer_ctx pointer to a layer context
+ */
+void lv_draw_layer_destroy(struct _lv_draw_ctx_t * draw_ctx, struct _lv_draw_layer_ctx_t * layer_ctx);
+
+/**********************
+ * MACROS
+ **********************/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /*LV_DRAW_LAYER_H*/
diff --git a/src/draw/lv_draw_mask.c b/src/draw/lv_draw_mask.c
index 430fd56ae..2170da941 100644
--- a/src/draw/lv_draw_mask.c
+++ b/src/draw/lv_draw_mask.c
@@ -202,7 +202,7 @@ void * lv_draw_mask_remove_custom(void * custom_id)
/**
* Free the data from the parameter.
- * It's called inside `lv_draw_mask_remove_id` and `lv_draw_mask_remove_custom`
+ * It's called inside `lv_draw_mask_remove_id` and `lv_draw_mask_remove_custom`
* Needs to be called only in special cases when the mask is not added by `lv_draw_mask_add`
* and not removed by `lv_draw_mask_remove_id` or `lv_draw_mask_remove_custom`
* @param p pointer to a mask parameter
@@ -446,9 +446,6 @@ void lv_draw_mask_angle_init(lv_draw_mask_angle_param_t * param, lv_coord_t vert
if(start_angle >= 0 && start_angle < 180) {
start_side = LV_DRAW_MASK_LINE_SIDE_LEFT;
}
- else if(start_angle >= 180 && start_angle < 360) {
- start_side = LV_DRAW_MASK_LINE_SIDE_RIGHT;
- }
else
start_side = LV_DRAW_MASK_LINE_SIDE_RIGHT; /*silence compiler*/
diff --git a/src/draw/lv_draw_mask.h b/src/draw/lv_draw_mask.h
index b6ec14f23..b7e4e1cd2 100644
--- a/src/draw/lv_draw_mask.h
+++ b/src/draw/lv_draw_mask.h
@@ -280,7 +280,7 @@ void * lv_draw_mask_remove_custom(void * custom_id);
/**
* Free the data from the parameter.
- * It's called inside `lv_draw_mask_remove_id` and `lv_draw_mask_remove_custom`
+ * It's called inside `lv_draw_mask_remove_id` and `lv_draw_mask_remove_custom`
* Needs to be called only in special cases when the mask is not added by `lv_draw_mask_add`
* and not removed by `lv_draw_mask_remove_id` or `lv_draw_mask_remove_custom`
* @param p pointer to a mask parameter
diff --git a/src/draw/lv_draw_rect.c b/src/draw/lv_draw_rect.c
index 8cb428824..f34854d9c 100644
--- a/src/draw/lv_draw_rect.c
+++ b/src/draw/lv_draw_rect.c
@@ -38,9 +38,7 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_rect_dsc_init(lv_draw_rect_dsc_t * dsc)
{
lv_memset_00(dsc, sizeof(lv_draw_rect_dsc_t));
dsc->bg_color = lv_color_white();
-#if __STDC_VERSION__ < 201112L
dsc->bg_grad.stops[0].color = lv_color_white();
-#endif
dsc->bg_grad.stops[1].color = lv_color_black();
dsc->bg_grad.stops[1].frac = 0xFF;
dsc->bg_grad.stops_count = 2;
diff --git a/src/draw/lv_draw_rect.h b/src/draw/lv_draw_rect.h
index efa630cf2..1583e3e67 100644
--- a/src/draw/lv_draw_rect.h
+++ b/src/draw/lv_draw_rect.h
@@ -35,14 +35,8 @@ typedef struct {
/*Background*/
lv_opa_t bg_opa;
-#if __STDC_VERSION__ >= 201112L
- union {
-#endif
- lv_color_t bg_color; /**< First element of a gradient is a color, so it maps well here*/
- lv_grad_dsc_t bg_grad;
-#if __STDC_VERSION__ >= 201112L
- };
-#endif
+ lv_color_t bg_color; /**< First element of a gradient is a color, so it maps well here*/
+ lv_grad_dsc_t bg_grad;
/*Background img*/
const void * bg_img_src;
diff --git a/src/draw/lv_draw_transform.c b/src/draw/lv_draw_transform.c
new file mode 100644
index 000000000..580351d6d
--- /dev/null
+++ b/src/draw/lv_draw_transform.c
@@ -0,0 +1,54 @@
+/**
+ * @file lv_draw_transform.c
+ *
+ */
+
+/*********************
+ * INCLUDES
+ *********************/
+#include "lv_draw.h"
+#include "lv_draw_transform.h"
+#include "../misc/lv_assert.h"
+#include "../misc/lv_area.h"
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+
+/**********************
+ * STATIC VARIABLES
+ **********************/
+
+/**********************
+ * MACROS
+ **********************/
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+void lv_draw_transform(lv_draw_ctx_t * draw_ctx, const lv_area_t * dest_area, const void * src_buf, lv_coord_t src_w,
+ lv_coord_t src_h,
+ lv_coord_t src_stride, const lv_draw_img_dsc_t * draw_dsc, lv_img_cf_t cf, lv_color_t * cbuf, lv_opa_t * abuf)
+{
+ LV_ASSERT_NULL(draw_ctx);
+ if(draw_ctx->draw_transform == NULL) {
+ LV_LOG_WARN("draw_ctx->draw_transform == NULL");
+ return;
+ }
+
+ draw_ctx->draw_transform(draw_ctx, dest_area, src_buf, src_w, src_h, src_stride, draw_dsc, cf, cbuf, abuf);
+
+}
+
+
+/**********************
+ * STATIC FUNCTIONS
+ **********************/
diff --git a/src/draw/lv_draw_transform.h b/src/draw/lv_draw_transform.h
new file mode 100644
index 000000000..1926c2fc2
--- /dev/null
+++ b/src/draw/lv_draw_transform.h
@@ -0,0 +1,44 @@
+/**
+ * @file lv_draw_transform.h
+ *
+ */
+
+#ifndef LV_DRAW_TRANSFORM_H
+#define LV_DRAW_TRANSFORM_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ * INCLUDES
+ *********************/
+#include "../lv_conf_internal.h"
+#include "../misc/lv_area.h"
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+struct _lv_draw_ctx_t;
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+void lv_draw_transform(struct _lv_draw_ctx_t * draw_ctx, const lv_area_t * dest_area, const void * src_buf,
+ lv_coord_t src_w, lv_coord_t src_h,
+ lv_coord_t src_stride, const lv_draw_img_dsc_t * draw_dsc, lv_img_cf_t cf, lv_color_t * cbuf, lv_opa_t * abuf);
+
+/**********************
+ * MACROS
+ **********************/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /*LV_DRAW_TRANSFORM_H*/
diff --git a/src/draw/lv_img_buf.c b/src/draw/lv_img_buf.c
index a6d0efc36..4c939dd83 100644
--- a/src/draw/lv_img_buf.c
+++ b/src/draw/lv_img_buf.c
@@ -54,7 +54,7 @@ lv_color_t lv_img_buf_get_px_color(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t
uint8_t * buf_u8 = (uint8_t *)dsc->data;
if(dsc->header.cf == LV_IMG_CF_TRUE_COLOR || dsc->header.cf == LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED ||
- dsc->header.cf == LV_IMG_CF_TRUE_COLOR_ALPHA) {
+ dsc->header.cf == LV_IMG_CF_TRUE_COLOR_ALPHA || dsc->header.cf == LV_IMG_CF_RGB565A8) {
uint8_t px_size = lv_img_cf_get_px_size(dsc->header.cf) >> 3;
uint32_t px = dsc->header.w * y * px_size + x * px_size;
lv_memcpy_small(&p_color, &buf_u8[px], sizeof(lv_color_t));
@@ -386,6 +386,7 @@ uint32_t lv_img_buf_get_img_size(lv_coord_t w, lv_coord_t h, lv_img_cf_t cf)
case LV_IMG_CF_TRUE_COLOR:
return LV_IMG_BUF_SIZE_TRUE_COLOR(w, h);
case LV_IMG_CF_TRUE_COLOR_ALPHA:
+ case LV_IMG_CF_RGB565A8:
return LV_IMG_BUF_SIZE_TRUE_COLOR_ALPHA(w, h);
case LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED:
return LV_IMG_BUF_SIZE_TRUE_COLOR_CHROMA_KEYED(w, h);
@@ -410,58 +411,6 @@ uint32_t lv_img_buf_get_img_size(lv_coord_t w, lv_coord_t h, lv_img_cf_t cf)
}
}
-#if LV_DRAW_COMPLEX
-/**
- * Initialize a descriptor to transform an image
- * @param dsc pointer to an `lv_img_transform_dsc_t` variable whose `cfg` field is initialized
- */
-void _lv_img_buf_transform_init(lv_img_transform_dsc_t * dsc)
-{
- dsc->tmp.pivot_x_256 = dsc->cfg.pivot_x * 256;
- dsc->tmp.pivot_y_256 = dsc->cfg.pivot_y * 256;
-
- int32_t angle_low = dsc->cfg.angle / 10;
- int32_t angle_high = angle_low + 1;
- int32_t angle_rem = dsc->cfg.angle - (angle_low * 10);
-
- int32_t s1 = lv_trigo_sin(-angle_low);
- int32_t s2 = lv_trigo_sin(-angle_high);
-
- int32_t c1 = lv_trigo_sin(-angle_low + 90);
- int32_t c2 = lv_trigo_sin(-angle_high + 90);
-
- dsc->tmp.sinma = (s1 * (10 - angle_rem) + s2 * angle_rem) / 10;
- dsc->tmp.cosma = (c1 * (10 - angle_rem) + c2 * angle_rem) / 10;
-
- /*Use smaller value to avoid overflow*/
- dsc->tmp.sinma = dsc->tmp.sinma >> (LV_TRIGO_SHIFT - _LV_TRANSFORM_TRIGO_SHIFT);
- dsc->tmp.cosma = dsc->tmp.cosma >> (LV_TRIGO_SHIFT - _LV_TRANSFORM_TRIGO_SHIFT);
-
- dsc->tmp.chroma_keyed = lv_img_cf_is_chroma_keyed(dsc->cfg.cf) ? 1 : 0;
- dsc->tmp.has_alpha = lv_img_cf_has_alpha(dsc->cfg.cf) ? 1 : 0;
- if(dsc->cfg.cf == LV_IMG_CF_TRUE_COLOR || dsc->cfg.cf == LV_IMG_CF_TRUE_COLOR_ALPHA ||
- dsc->cfg.cf == LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED) {
- dsc->tmp.native_color = 1;
- }
- else {
- dsc->tmp.native_color = 0;
- }
-
- dsc->tmp.img_dsc.data = dsc->cfg.src;
- dsc->tmp.img_dsc.header.always_zero = 0;
- dsc->tmp.img_dsc.header.cf = dsc->cfg.cf;
- dsc->tmp.img_dsc.header.w = dsc->cfg.src_w;
- dsc->tmp.img_dsc.header.h = dsc->cfg.src_h;
-
- /*The inverse of the zoom will be sued during the transformation
- * + dsc->cfg.zoom / 2 for rounding*/
- dsc->tmp.zoom_inv = (((256 * 256) << _LV_ZOOM_INV_UPSCALE) + dsc->cfg.zoom / 2) / dsc->cfg.zoom;
-
- dsc->res.opa = LV_OPA_COVER;
- dsc->res.color = dsc->cfg.color;
-}
-#endif
-
/**
* Get the area of a rectangle if its rotated and scaled
* @param res store the coordinates here
@@ -483,68 +432,21 @@ void _lv_img_buf_get_transformed_area(lv_area_t * res, lv_coord_t w, lv_coord_t
return;
}
- res->x1 = (((int32_t)(-pivot->x) * zoom) >> 8) - 1;
- res->y1 = (((int32_t)(-pivot->y) * zoom) >> 8) - 1;
- res->x2 = (((int32_t)(w - pivot->x) * zoom) >> 8) + 2;
- res->y2 = (((int32_t)(h - pivot->y) * zoom) >> 8) + 2;
-
- if(angle == 0) {
- res->x1 += pivot->x;
- res->y1 += pivot->y;
- res->x2 += pivot->x;
- res->y2 += pivot->y;
- return;
- }
-
- int32_t angle_low = angle / 10;
- int32_t angle_high = angle_low + 1;
- int32_t angle_rem = angle - (angle_low * 10);
-
- int32_t s1 = lv_trigo_sin(angle_low);
- int32_t s2 = lv_trigo_sin(angle_high);
-
- int32_t c1 = lv_trigo_sin(angle_low + 90);
- int32_t c2 = lv_trigo_sin(angle_high + 90);
-
- int32_t sinma = (s1 * (10 - angle_rem) + s2 * angle_rem) / 10;
- int32_t cosma = (c1 * (10 - angle_rem) + c2 * angle_rem) / 10;
-
- /*Use smaller value to avoid overflow*/
- sinma = sinma >> (LV_TRIGO_SHIFT - _LV_TRANSFORM_TRIGO_SHIFT);
- cosma = cosma >> (LV_TRIGO_SHIFT - _LV_TRANSFORM_TRIGO_SHIFT);
-
- lv_point_t lt;
- lv_point_t rt;
- lv_point_t lb;
- lv_point_t rb;
-
- lv_coord_t xt;
- lv_coord_t yt;
-
- xt = res->x1;
- yt = res->y1;
- lt.x = ((cosma * xt - sinma * yt) >> _LV_TRANSFORM_TRIGO_SHIFT) + pivot->x;
- lt.y = ((sinma * xt + cosma * yt) >> _LV_TRANSFORM_TRIGO_SHIFT) + pivot->y;
+ lv_point_t p[4] = {
+ {0, 0},
+ {w, 0},
+ {0, h},
+ {w, h},
+ };
+ lv_point_transform(&p[0], angle, zoom, pivot);
+ lv_point_transform(&p[1], angle, zoom, pivot);
+ lv_point_transform(&p[2], angle, zoom, pivot);
+ lv_point_transform(&p[3], angle, zoom, pivot);
+ res->x1 = LV_MIN4(p[0].x, p[1].x, p[2].x, p[3].x) - 2;
+ res->x2 = LV_MAX4(p[0].x, p[1].x, p[2].x, p[3].x) + 2;
+ res->y1 = LV_MIN4(p[0].y, p[1].y, p[2].y, p[3].y) - 2;
+ res->y2 = LV_MAX4(p[0].y, p[1].y, p[2].y, p[3].y) + 2;
- xt = res->x2;
- yt = res->y1;
- rt.x = ((cosma * xt - sinma * yt) >> _LV_TRANSFORM_TRIGO_SHIFT) + pivot->x;
- rt.y = ((sinma * xt + cosma * yt) >> _LV_TRANSFORM_TRIGO_SHIFT) + pivot->y;
-
- xt = res->x1;
- yt = res->y2;
- lb.x = ((cosma * xt - sinma * yt) >> _LV_TRANSFORM_TRIGO_SHIFT) + pivot->x;
- lb.y = ((sinma * xt + cosma * yt) >> _LV_TRANSFORM_TRIGO_SHIFT) + pivot->y;
-
- xt = res->x2;
- yt = res->y2;
- rb.x = ((cosma * xt - sinma * yt) >> _LV_TRANSFORM_TRIGO_SHIFT) + pivot->x;
- rb.y = ((sinma * xt + cosma * yt) >> _LV_TRANSFORM_TRIGO_SHIFT) + pivot->y;
-
- res->x1 = LV_MIN4(lb.x, lt.x, rb.x, rt.x);
- res->x2 = LV_MAX4(lb.x, lt.x, rb.x, rt.x);
- res->y1 = LV_MIN4(lb.y, lt.y, rb.y, rt.y);
- res->y2 = LV_MAX4(lb.y, lt.y, rb.y, rt.y);
#else
LV_UNUSED(angle);
LV_UNUSED(zoom);
@@ -556,217 +458,6 @@ void _lv_img_buf_get_transformed_area(lv_area_t * res, lv_coord_t w, lv_coord_t
#endif
}
-
-#if LV_DRAW_COMPLEX
-/**
- * Get which color and opa would come to a pixel if it were rotated
- * @param dsc a descriptor initialized by `lv_img_buf_rotate_init`
- * @param x the coordinate which color and opa should be get
- * @param y the coordinate which color and opa should be get
- * @return true: there is valid pixel on these x/y coordinates; false: the rotated pixel was out of the image
- * @note the result is written back to `dsc->res_color` and `dsc->res_opa`
- */
-bool _lv_img_buf_transform(lv_img_transform_dsc_t * dsc, lv_coord_t x, lv_coord_t y)
-{
- const uint8_t * src_u8 = (const uint8_t *)dsc->cfg.src;
-
- /*Get the target point relative coordinates to the pivot*/
- int32_t xt = x - dsc->cfg.pivot_x;
- int32_t yt = y - dsc->cfg.pivot_y;
-
- int32_t xs;
- int32_t ys;
- if(dsc->cfg.zoom == LV_IMG_ZOOM_NONE) {
- /*Get the source pixel from the upscaled image*/
- xs = ((dsc->tmp.cosma * xt - dsc->tmp.sinma * yt) >> (_LV_TRANSFORM_TRIGO_SHIFT - 8)) + dsc->tmp.pivot_x_256;
- ys = ((dsc->tmp.sinma * xt + dsc->tmp.cosma * yt) >> (_LV_TRANSFORM_TRIGO_SHIFT - 8)) + dsc->tmp.pivot_y_256;
- }
- else if(dsc->cfg.angle == 0) {
- xt = (int32_t)((int32_t)xt * dsc->tmp.zoom_inv) >> _LV_ZOOM_INV_UPSCALE;
- yt = (int32_t)((int32_t)yt * dsc->tmp.zoom_inv) >> _LV_ZOOM_INV_UPSCALE;
- xs = xt + dsc->tmp.pivot_x_256;
- ys = yt + dsc->tmp.pivot_y_256;
- }
- else {
- xt = (int32_t)((int32_t)xt * dsc->tmp.zoom_inv) >> _LV_ZOOM_INV_UPSCALE;
- yt = (int32_t)((int32_t)yt * dsc->tmp.zoom_inv) >> _LV_ZOOM_INV_UPSCALE;
- xs = ((dsc->tmp.cosma * xt - dsc->tmp.sinma * yt) >> (_LV_TRANSFORM_TRIGO_SHIFT)) + dsc->tmp.pivot_x_256;
- ys = ((dsc->tmp.sinma * xt + dsc->tmp.cosma * yt) >> (_LV_TRANSFORM_TRIGO_SHIFT)) + dsc->tmp.pivot_y_256;
- }
-
- /*Get the integer part of the source pixel*/
- int32_t xs_int = xs >> 8;
- int32_t ys_int = ys >> 8;
-
- if(xs_int >= dsc->cfg.src_w) return false;
- else if(xs_int < 0) return false;
-
- if(ys_int >= dsc->cfg.src_h) return false;
- else if(ys_int < 0) return false;
-
- uint8_t px_size;
- uint32_t pxi;
- if(dsc->tmp.native_color) {
- if(dsc->tmp.has_alpha == 0) {
- px_size = LV_COLOR_SIZE >> 3;
-
- pxi = dsc->cfg.src_w * ys_int * px_size + xs_int * px_size;
- lv_memcpy_small(&dsc->res.color, &src_u8[pxi], px_size);
- }
- else {
- px_size = LV_IMG_PX_SIZE_ALPHA_BYTE;
- pxi = dsc->cfg.src_w * ys_int * px_size + xs_int * px_size;
- lv_memcpy_small(&dsc->res.color, &src_u8[pxi], px_size - 1);
- dsc->res.opa = src_u8[pxi + px_size - 1];
- }
- }
- else {
- pxi = 0; /*unused*/
- px_size = 0; /*unused*/
- dsc->res.color = lv_img_buf_get_px_color(&dsc->tmp.img_dsc, xs_int, ys_int, dsc->cfg.color);
- dsc->res.opa = lv_img_buf_get_px_alpha(&dsc->tmp.img_dsc, xs_int, ys_int);
- }
-
- if(dsc->tmp.chroma_keyed) {
- lv_color_t ct = LV_COLOR_CHROMA_KEY;
- if(dsc->res.color.full == ct.full) return false;
- }
-
- if(dsc->cfg.antialias == false) return true;
-
- dsc->tmp.xs = xs;
- dsc->tmp.ys = ys;
- dsc->tmp.xs_int = xs_int;
- dsc->tmp.ys_int = ys_int;
- dsc->tmp.pxi = pxi;
- dsc->tmp.px_size = px_size;
-
- bool ret;
- ret = _lv_img_buf_transform_anti_alias(dsc);
-
- return ret;
-}
-
-/**
- * Continue transformation by taking the neighbors into account
- * @param dsc pointer to the transformation descriptor
- */
-bool _lv_img_buf_transform_anti_alias(lv_img_transform_dsc_t * dsc)
-{
- const uint8_t * src_u8 = dsc->cfg.src;
-
- /*Get the fractional part of the source pixel*/
- int xs_fract = dsc->tmp.xs & 0xff;
- int ys_fract = dsc->tmp.ys & 0xff;
- int32_t xn; /*x neighbor*/
- lv_opa_t xr; /*x mix ratio*/
-
- if(xs_fract < 0x70) {
- xn = - 1;
- if(dsc->tmp.xs_int + xn < 0) xn = 0;
- xr = xs_fract + 0x80;
- }
- else if(xs_fract > 0x90) {
- xn = 1;
- if(dsc->tmp.xs_int + xn >= dsc->cfg.src_w) xn = 0;
- xr = (0xFF - xs_fract) + 0x80;
- }
- else {
- xn = 0;
- xr = 0xFF;
- }
-
- int32_t yn; /*x neighbor*/
- lv_opa_t yr; /*x mix ratio*/
-
- if(ys_fract < 0x70) {
- yn = - 1;
- if(dsc->tmp.ys_int + yn < 0) yn = 0;
-
- yr = ys_fract + 0x80;
- }
- else if(ys_fract > 0x90) {
- yn = 1;
- if(dsc->tmp.ys_int + yn >= dsc->cfg.src_h) yn = 0;
-
- yr = (0xFF - ys_fract) + 0x80;
- }
- else {
- yn = 0;
- yr = 0xFF;
- }
-
- lv_color_t c00 = dsc->res.color;
- lv_color_t c01;
- lv_color_t c10;
- lv_color_t c11;
-
- lv_opa_t a00 = dsc->res.opa;
- lv_opa_t a10 = 0;
- lv_opa_t a01 = 0;
- lv_opa_t a11 = 0;
-
- if(dsc->tmp.native_color) {
- lv_memcpy_small(&c01, &src_u8[dsc->tmp.pxi + dsc->tmp.px_size * xn], sizeof(lv_color_t));
- lv_memcpy_small(&c10, &src_u8[dsc->tmp.pxi + dsc->cfg.src_w * dsc->tmp.px_size * yn], sizeof(lv_color_t));
- lv_memcpy_small(&c11, &src_u8[dsc->tmp.pxi + dsc->cfg.src_w * dsc->tmp.px_size * yn + dsc->tmp.px_size * xn],
- sizeof(lv_color_t));
- if(dsc->tmp.has_alpha) {
- a10 = src_u8[dsc->tmp.pxi + dsc->tmp.px_size * xn + dsc->tmp.px_size - 1];
- a01 = src_u8[dsc->tmp.pxi + dsc->cfg.src_w * dsc->tmp.px_size * yn + dsc->tmp.px_size - 1];
- a11 = src_u8[dsc->tmp.pxi + dsc->cfg.src_w * dsc->tmp.px_size * yn + dsc->tmp.px_size * xn + dsc->tmp.px_size - 1];
- }
- }
- else {
- c01 = lv_img_buf_get_px_color(&dsc->tmp.img_dsc, dsc->tmp.xs_int + xn, dsc->tmp.ys_int, dsc->cfg.color);
- c10 = lv_img_buf_get_px_color(&dsc->tmp.img_dsc, dsc->tmp.xs_int, dsc->tmp.ys_int + yn, dsc->cfg.color);
- c11 = lv_img_buf_get_px_color(&dsc->tmp.img_dsc, dsc->tmp.xs_int + xn, dsc->tmp.ys_int + yn, dsc->cfg.color);
-
- if(dsc->tmp.has_alpha) {
- a10 = lv_img_buf_get_px_alpha(&dsc->tmp.img_dsc, dsc->tmp.xs_int + xn, dsc->tmp.ys_int);
- a01 = lv_img_buf_get_px_alpha(&dsc->tmp.img_dsc, dsc->tmp.xs_int, dsc->tmp.ys_int + yn);
- a11 = lv_img_buf_get_px_alpha(&dsc->tmp.img_dsc, dsc->tmp.xs_int + xn, dsc->tmp.ys_int + yn);
- }
- }
-
- lv_opa_t xr0 = xr;
- lv_opa_t xr1 = xr;
- if(dsc->tmp.has_alpha) {
- lv_opa_t a0 = (a00 * xr + (a10 * (255 - xr))) >> 8;
- lv_opa_t a1 = (a01 * xr + (a11 * (255 - xr))) >> 8;
- dsc->res.opa = (a0 * yr + (a1 * (255 - yr))) >> 8;
-
- if(a0 <= LV_OPA_MIN && a1 <= LV_OPA_MIN) return false;
- if(a0 <= LV_OPA_MIN) yr = LV_OPA_TRANSP;
- if(a1 <= LV_OPA_MIN) yr = LV_OPA_COVER;
- if(a00 <= LV_OPA_MIN) xr0 = LV_OPA_TRANSP;
- if(a10 <= LV_OPA_MIN) xr0 = LV_OPA_COVER;
- if(a01 <= LV_OPA_MIN) xr1 = LV_OPA_TRANSP;
- if(a11 <= LV_OPA_MIN) xr1 = LV_OPA_COVER;
- }
- else {
- xr0 = xr;
- xr1 = xr;
- dsc->res.opa = LV_OPA_COVER;
- }
-
- lv_color_t c0;
- if(xr0 == LV_OPA_TRANSP) c0 = c01;
- else if(xr0 == LV_OPA_COVER) c0 = c00;
- else c0 = lv_color_mix(c00, c01, xr0);
-
- lv_color_t c1;
- if(xr1 == LV_OPA_TRANSP) c1 = c11;
- else if(xr1 == LV_OPA_COVER) c1 = c10;
- else c1 = lv_color_mix(c10, c11, xr1);
-
- if(yr == LV_OPA_TRANSP) dsc->res.color = c1;
- else if(yr == LV_OPA_COVER) dsc->res.color = c0;
- else dsc->res.color = lv_color_mix(c0, c1, yr);
-
- return true;
-}
-#endif
/**********************
* STATIC FUNCTIONS
**********************/
diff --git a/src/draw/lv_img_buf.h b/src/draw/lv_img_buf.h
index 984483e5e..1be7bb652 100644
--- a/src/draw/lv_img_buf.h
+++ b/src/draw/lv_img_buf.h
@@ -45,7 +45,6 @@ extern "C" {
#define LV_IMG_BUF_SIZE_INDEXED_4BIT(w, h) (LV_IMG_BUF_SIZE_ALPHA_4BIT(w, h) + 4 * 16)
#define LV_IMG_BUF_SIZE_INDEXED_8BIT(w, h) (LV_IMG_BUF_SIZE_ALPHA_8BIT(w, h) + 4 * 256)
-#define _LV_TRANSFORM_TRIGO_SHIFT 10
#define _LV_ZOOM_INV_UPSCALE 5
/**********************
@@ -67,16 +66,23 @@ enum {
LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED, /**< Same as `LV_IMG_CF_TRUE_COLOR` but LV_COLOR_TRANSP pixels
will be transparent*/
- LV_IMG_CF_INDEXED_1BIT, /**< Can have 2 different colors in a palette (always chroma keyed)*/
- LV_IMG_CF_INDEXED_2BIT, /**< Can have 4 different colors in a palette (always chroma keyed)*/
- LV_IMG_CF_INDEXED_4BIT, /**< Can have 16 different colors in a palette (always chroma keyed)*/
- LV_IMG_CF_INDEXED_8BIT, /**< Can have 256 different colors in a palette (always chroma keyed)*/
+ LV_IMG_CF_INDEXED_1BIT, /**< Can have 2 different colors in a palette (can't be chroma keyed)*/
+ LV_IMG_CF_INDEXED_2BIT, /**< Can have 4 different colors in a palette (can't be chroma keyed)*/
+ LV_IMG_CF_INDEXED_4BIT, /**< Can have 16 different colors in a palette (can't be chroma keyed)*/
+ LV_IMG_CF_INDEXED_8BIT, /**< Can have 256 different colors in a palette (can't be chroma keyed)*/
LV_IMG_CF_ALPHA_1BIT, /**< Can have one color and it can be drawn or not*/
LV_IMG_CF_ALPHA_2BIT, /**< Can have one color but 4 different alpha value*/
LV_IMG_CF_ALPHA_4BIT, /**< Can have one color but 16 different alpha value*/
LV_IMG_CF_ALPHA_8BIT, /**< Can have one color but 256 different alpha value*/
+ LV_IMG_CF_RGB888,
+ LV_IMG_CF_RGBA8888,
+ LV_IMG_CF_RGBX8888,
+ LV_IMG_CF_RGB565,
+ LV_IMG_CF_RGBA5658,
+ LV_IMG_CF_RGB565A8,
+
LV_IMG_CF_RESERVED_15, /**< Reserved for further use.*/
LV_IMG_CF_RESERVED_16, /**< Reserved for further use.*/
LV_IMG_CF_RESERVED_17, /**< Reserved for further use.*/
@@ -138,49 +144,6 @@ typedef struct {
const uint8_t * data; /**< Pointer to the data of the image*/
} lv_img_dsc_t;
-typedef struct {
- struct {
- const void * src; /*image source (array of pixels)*/
- lv_coord_t src_w; /*width of the image source*/
- lv_coord_t src_h; /*height of the image source*/
- lv_coord_t pivot_x; /*pivot x*/
- lv_coord_t pivot_y; /*pivot y*/
- int16_t angle; /*angle to rotate*/
- uint16_t zoom; /*256 no zoom, 128 half size, 512 double size*/
- lv_color_t color; /*a color used for `LV_IMG_CF_INDEXED_1/2/4/8BIT` color formats*/
- lv_img_cf_t cf; /*color format of the image to rotate*/
- bool antialias;
- } cfg;
-
- struct {
- lv_color_t color;
- lv_opa_t opa;
- } res;
-
- struct {
- lv_img_dsc_t img_dsc;
- int32_t pivot_x_256;
- int32_t pivot_y_256;
- int32_t sinma;
- int32_t cosma;
-
- uint8_t chroma_keyed : 1;
- uint8_t has_alpha : 1;
- uint8_t native_color : 1;
-
- uint32_t zoom_inv;
-
- /*Runtime data*/
- lv_coord_t xs;
- lv_coord_t ys;
- lv_coord_t xs_int;
- lv_coord_t ys_int;
- uint32_t pxi;
- uint8_t px_size;
- } tmp;
-} lv_img_transform_dsc_t;
-
-
/**********************
* GLOBAL PROTOTYPES
**********************/
@@ -263,30 +226,6 @@ void lv_img_buf_free(lv_img_dsc_t * dsc);
*/
uint32_t lv_img_buf_get_img_size(lv_coord_t w, lv_coord_t h, lv_img_cf_t cf);
-#if LV_DRAW_COMPLEX
-/**
- * Initialize a descriptor to rotate an image
- * @param dsc pointer to an `lv_img_transform_dsc_t` variable whose `cfg` field is initialized
- */
-void _lv_img_buf_transform_init(lv_img_transform_dsc_t * dsc);
-
-/**
- * Continue transformation by taking the neighbors into account
- * @param dsc pointer to the transformation descriptor
- */
-bool _lv_img_buf_transform_anti_alias(lv_img_transform_dsc_t * dsc);
-
-/**
- * Get which color and opa would come to a pixel if it were rotated
- * @param dsc a descriptor initialized by `lv_img_buf_rotate_init`
- * @param x the coordinate which color and opa should be get
- * @param y the coordinate which color and opa should be get
- * @return true: there is valid pixel on these x/y coordinates; false: the rotated pixel was out of the image
- * @note the result is written back to `dsc->res_color` and `dsc->res_opa`
- */
-bool _lv_img_buf_transform(lv_img_transform_dsc_t * dsc, lv_coord_t x, lv_coord_t y);
-
-#endif
/**
* Get the area of a rectangle if its rotated and scaled
* @param res store the coordinates here
diff --git a/src/draw/lv_img_decoder.c b/src/draw/lv_img_decoder.c
index 3678a5712..13050b8b7 100644
--- a/src/draw/lv_img_decoder.c
+++ b/src/draw/lv_img_decoder.c
@@ -15,8 +15,8 @@
/*********************
* DEFINES
*********************/
-#define CF_BUILT_IN_FIRST LV_IMG_CF_TRUE_COLOR
-#define CF_BUILT_IN_LAST LV_IMG_CF_ALPHA_8BIT
+#define CF_BUILT_IN_FIRST LV_IMG_CF_TRUE_COLOR
+#define CF_BUILT_IN_LAST LV_IMG_CF_RGB565A8
/**********************
* TYPEDEFS
@@ -146,7 +146,7 @@ lv_res_t lv_img_decoder_open(lv_img_decoder_dsc_t * dsc, const void * src, lv_co
dsc->decoder = decoder;
res = decoder->open_cb(decoder, dsc);
- /*Opened successfully. It is a good decoder to for this image source*/
+ /*Opened successfully. It is a good decoder for this image source*/
if(res == LV_RES_OK) return res;
/*Prepare for the next loop*/
@@ -361,7 +361,9 @@ lv_res_t lv_img_decoder_built_in_open(lv_img_decoder_t * decoder, lv_img_decoder
lv_img_cf_t cf = dsc->header.cf;
/*Process true color formats*/
- if(cf == LV_IMG_CF_TRUE_COLOR || cf == LV_IMG_CF_TRUE_COLOR_ALPHA || cf == LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED) {
+ if(cf == LV_IMG_CF_TRUE_COLOR || cf == LV_IMG_CF_TRUE_COLOR_ALPHA ||
+ cf == LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED || cf == LV_IMG_CF_RGB565A8 ||
+ cf == LV_IMG_CF_ALPHA_8BIT) {
if(dsc->src_type == LV_IMG_SRC_VARIABLE) {
/*In case of uncompressed formats the image stored in the ROM/RAM.
*So simply give its pointer*/
@@ -426,8 +428,7 @@ lv_res_t lv_img_decoder_built_in_open(lv_img_decoder_t * decoder, lv_img_decoder
return LV_RES_OK;
}
/*Alpha indexed images.*/
- else if(cf == LV_IMG_CF_ALPHA_1BIT || cf == LV_IMG_CF_ALPHA_2BIT || cf == LV_IMG_CF_ALPHA_4BIT ||
- cf == LV_IMG_CF_ALPHA_8BIT) {
+ else if(cf == LV_IMG_CF_ALPHA_1BIT || cf == LV_IMG_CF_ALPHA_2BIT || cf == LV_IMG_CF_ALPHA_4BIT) {
return LV_RES_OK; /*Nothing to process*/
}
/*Unknown format. Can't decode it.*/
diff --git a/src/draw/lv_img_decoder.h b/src/draw/lv_img_decoder.h
index ebebf1091..9dc84dd56 100644
--- a/src/draw/lv_img_decoder.h
+++ b/src/draw/lv_img_decoder.h
@@ -144,7 +144,7 @@ void _lv_img_decoder_init(void);
* Get information about an image.
* Try the created image decoder one by one. Once one is able to get info that info will be used.
* @param src the image source. Can be
- * 1) File name: E.g. "S:folder/img1.png" (The drivers needs to registered via `lv_fs_add_drv()`)
+ * 1) File name: E.g. "S:folder/img1.png" (The drivers needs to registered via `lv_fs_drv_register()`)
* 2) Variable: Pointer to an `lv_img_dsc_t` variable
* 3) Symbol: E.g. `LV_SYMBOL_OK`
* @param header the image info will be stored here
@@ -154,10 +154,10 @@ lv_res_t lv_img_decoder_get_info(const void * src, lv_img_header_t * header);
/**
* Open an image.
- * Try the created image decoder one by one. Once one is able to open the image that decoder is save in `dsc`
- * @param dsc describe a decoding session. Simply a pointer to an `lv_img_decoder_dsc_t` variable.
+ * Try the created image decoders one by one. Once one is able to open the image that decoder is saved in `dsc`
+ * @param dsc describes a decoding session. Simply a pointer to an `lv_img_decoder_dsc_t` variable.
* @param src the image source. Can be
- * 1) File name: E.g. "S:folder/img1.png" (The drivers needs to registered via `lv_fs_add_drv()`)
+ * 1) File name: E.g. "S:folder/img1.png" (The drivers needs to registered via `lv_fs_drv_register())`)
* 2) Variable: Pointer to an `lv_img_dsc_t` variable
* 3) Symbol: E.g. `LV_SYMBOL_OK`
* @param color The color of the image with `LV_IMG_CF_ALPHA_...`
diff --git a/src/draw/nxp/lv_draw_nxp.mk b/src/draw/nxp/lv_draw_nxp.mk
new file mode 100644
index 000000000..17371ac98
--- /dev/null
+++ b/src/draw/nxp/lv_draw_nxp.mk
@@ -0,0 +1,9 @@
+CSRCS += lv_gpu_nxp.c
+
+DEPPATH += --dep-path $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nxp
+VPATH += :$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nxp
+
+CFLAGS += "-I$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nxp"
+
+include $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nxp/pxp/lv_draw_nxp_pxp.mk
+include $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nxp/vglite/lv_draw_nxp_vglite.mk
diff --git a/src/draw/nxp/lv_gpu_nxp.c b/src/draw/nxp/lv_gpu_nxp.c
new file mode 100644
index 000000000..46da9334a
--- /dev/null
+++ b/src/draw/nxp/lv_gpu_nxp.c
@@ -0,0 +1,418 @@
+/**
+ * @file lv_gpu_nxp.c
+ *
+ */
+
+/**
+ * MIT License
+ *
+ * Copyright 2022 NXP
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next paragraph)
+ * shall be included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+ * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
+ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+/*********************
+ * INCLUDES
+ *********************/
+
+#include "lv_gpu_nxp.h"
+
+#if LV_USE_GPU_NXP_PXP || LV_USE_GPU_NXP_VG_LITE
+
+/*
+ * allow to use both PXP and VGLITE
+
+ * both 2D accelerators can be used at the same time:
+ * thus VGLITE can be used to accelerate widget drawing
+ * while PXP accelerates Blit & Fill operations.
+ */
+#if LV_USE_GPU_NXP_PXP
+ #include "pxp/lv_draw_pxp_blend.h"
+#endif
+#if LV_USE_GPU_NXP_VG_LITE
+ #include "vglite/lv_draw_vglite_blend.h"
+ #include "vglite/lv_draw_vglite_rect.h"
+ #include "vglite/lv_draw_vglite_arc.h"
+#endif
+
+#if LV_COLOR_DEPTH != 32
+ #include "../../core/lv_refr.h"
+#endif
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+
+static void lv_draw_nxp_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc,
+ const lv_area_t * coords, const uint8_t * map_p, lv_img_cf_t cf);
+
+static void lv_draw_nxp_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc);
+
+static void lv_draw_nxp_rect(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords);
+
+static lv_res_t draw_nxp_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords);
+
+static void lv_draw_nxp_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_dsc_t * dsc, const lv_point_t * center,
+ uint16_t radius, uint16_t start_angle, uint16_t end_angle);
+
+/**********************
+ * STATIC VARIABLES
+ **********************/
+
+/**********************
+ * MACROS
+ **********************/
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+
+void lv_draw_nxp_ctx_init(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx)
+{
+ lv_draw_sw_init_ctx(drv, draw_ctx);
+
+ lv_draw_nxp_ctx_t * nxp_draw_ctx = (lv_draw_sw_ctx_t *)draw_ctx;
+
+ nxp_draw_ctx->base_draw.draw_arc = lv_draw_nxp_arc;
+ nxp_draw_ctx->base_draw.draw_rect = lv_draw_nxp_rect;
+ nxp_draw_ctx->base_draw.draw_img_decoded = lv_draw_nxp_img_decoded;
+ nxp_draw_ctx->blend = lv_draw_nxp_blend;
+ //nxp_draw_ctx->base_draw.wait_for_finish = lv_draw_nxp_wait_cb;
+}
+
+void lv_draw_nxp_ctx_deinit(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx)
+{
+ lv_draw_sw_deinit_ctx(drv, draw_ctx);
+}
+
+/**********************
+ * STATIC FUNCTIONS
+ **********************/
+
+/**
+ * During rendering, LVGL might initializes new draw_ctxs and start drawing into
+ * a separate buffer (called layer). If the content to be rendered has "holes",
+ * e.g. rounded corner, LVGL temporarily sets the disp_drv.screen_transp flag.
+ * It means the renderers should draw into an ARGB buffer.
+ * With 32 bit color depth it's not a big problem but with 16 bit color depth
+ * the target pixel format is ARGB8565 which is not supported by the GPU.
+ * In this case, the NXP callbacks should fallback to SW rendering.
+ */
+static inline bool need_argb8565_support()
+{
+#if LV_COLOR_DEPTH != 32
+ lv_disp_t * disp = _lv_refr_get_disp_refreshing();
+
+ if(disp->driver->screen_transp == 1)
+ return true;
+#endif
+
+ return false;
+}
+
+static void lv_draw_nxp_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc)
+{
+ lv_area_t blend_area;
+
+ /*Let's get the blend area which is the intersection of the area to fill and the clip area.*/
+ if(!_lv_area_intersect(&blend_area, dsc->blend_area, draw_ctx->clip_area))
+ return; /*Fully clipped, nothing to do*/
+
+ /*Make the blend area relative to the buffer*/
+ lv_area_move(&blend_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1);
+
+ bool done = false;
+
+ /*Fill/Blend only non masked, normal blended*/
+ if(dsc->mask_buf == NULL && dsc->blend_mode == LV_BLEND_MODE_NORMAL && !need_argb8565_support()) {
+ lv_color_t * dest_buf = draw_ctx->buf;
+ lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area);
+#if LV_USE_GPU_NXP_VG_LITE
+ lv_coord_t dest_width = lv_area_get_width(draw_ctx->buf_area);
+ lv_coord_t dest_height = lv_area_get_height(draw_ctx->buf_area);
+#endif
+
+ const lv_color_t * src_buf = dsc->src_buf;
+
+ if(src_buf == NULL) {
+#if LV_USE_GPU_NXP_PXP
+ done = (lv_gpu_nxp_pxp_fill(dest_buf, dest_stride, &blend_area,
+ dsc->color, dsc->opa) == LV_RES_OK);
+ if(!done)
+ PXP_LOG_TRACE("PXP fill failed. Fallback.");
+
+#endif
+#if LV_USE_GPU_NXP_VG_LITE
+ if(!done) {
+ done = (lv_gpu_nxp_vglite_fill(dest_buf, dest_width, dest_height, &blend_area,
+ dsc->color, dsc->opa) == LV_RES_OK);
+ if(!done)
+ VG_LITE_LOG_TRACE("VG-Lite fill failed. Fallback.");
+ }
+#endif
+ }
+ else {
+#if LV_USE_GPU_NXP_PXP
+ done = (lv_gpu_nxp_pxp_blit(dest_buf, &blend_area, dest_stride, src_buf, dsc->blend_area,
+ dsc->opa, LV_DISP_ROT_NONE) == LV_RES_OK);
+ if(!done)
+ PXP_LOG_TRACE("PXP blit failed. Fallback.");
+#endif
+#if LV_USE_GPU_NXP_VG_LITE
+ if(!done) {
+ lv_gpu_nxp_vglite_blit_info_t blit;
+ lv_coord_t src_stride = lv_area_get_width(dsc->blend_area);
+
+ blit.src = src_buf;
+ blit.src_width = lv_area_get_width(dsc->blend_area);
+ blit.src_height = lv_area_get_height(dsc->blend_area);
+ blit.src_stride = src_stride * (int32_t)sizeof(lv_color_t);
+ blit.src_area.x1 = (blend_area.x1 - (dsc->blend_area->x1 - draw_ctx->buf_area->x1));
+ blit.src_area.y1 = (blend_area.y1 - (dsc->blend_area->y1 - draw_ctx->buf_area->y1));
+ blit.src_area.x2 = blit.src_area.x1 + blit.src_width - 1;
+ blit.src_area.y2 = blit.src_area.y1 + blit.src_height - 1;
+
+ blit.dst = dest_buf;
+ blit.dst_width = dest_width;
+ blit.dst_height = dest_height;
+ blit.dst_stride = dest_stride * (int32_t)sizeof(lv_color_t);
+ blit.dst_area.x1 = blend_area.x1;
+ blit.dst_area.y1 = blend_area.y1;
+ blit.dst_area.x2 = blend_area.x2;
+ blit.dst_area.y2 = blend_area.y2;
+
+ blit.opa = dsc->opa;
+ blit.zoom = LV_IMG_ZOOM_NONE;
+ blit.angle = 0;
+
+ done = (lv_gpu_nxp_vglite_blit(&blit) == LV_RES_OK);
+
+ if(!done)
+ VG_LITE_LOG_TRACE("VG-Lite blit failed. Fallback.");
+ }
+#endif
+ }
+ }
+
+ if(!done)
+ lv_draw_sw_blend_basic(draw_ctx, dsc);
+}
+
+static void lv_draw_nxp_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc,
+ const lv_area_t * coords, const uint8_t * map_p, lv_img_cf_t cf)
+{
+ /*Use the clip area as draw area*/
+ lv_area_t draw_area;
+ lv_area_copy(&draw_area, draw_ctx->clip_area);
+ bool mask_any = lv_draw_mask_is_any(&draw_area);
+#if LV_USE_GPU_NXP_VG_LITE
+ bool recolor = (dsc->recolor_opa != LV_OPA_TRANSP);
+#endif
+#if LV_USE_GPU_NXP_PXP
+ bool scale = (dsc->zoom != LV_IMG_ZOOM_NONE);
+#endif
+ bool done = false;
+
+ lv_area_t blend_area;
+ /*Let's get the blend area which is the intersection of the area to fill and the clip area.*/
+ if(!_lv_area_intersect(&blend_area, coords, draw_ctx->clip_area))
+ return; /*Fully clipped, nothing to do*/
+
+ /*Make the blend area relative to the buffer*/
+ lv_area_move(&blend_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1);
+
+ const lv_color_t * src_buf = (const lv_color_t *)map_p;
+ if(!src_buf) {
+ lv_draw_sw_img_decoded(draw_ctx, dsc, coords, map_p, cf);
+ return;
+ }
+
+ lv_color_t * dest_buf = draw_ctx->buf;
+ lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area);
+
+#if LV_USE_GPU_NXP_PXP
+ if(!mask_any && !scale && !need_argb8565_support()
+#if LV_COLOR_DEPTH!=32
+ && !lv_img_cf_has_alpha(cf)
+#endif
+ ) {
+ done = (lv_gpu_nxp_pxp_blit_transform(dest_buf, &blend_area, dest_stride, src_buf, coords,
+ dsc, cf) == LV_RES_OK);
+ if(!done)
+ PXP_LOG_TRACE("PXP blit transform failed. Fallback.");
+ }
+#endif
+
+#if LV_USE_GPU_NXP_VG_LITE
+ if(!done && !mask_any && !need_argb8565_support() &&
+ !lv_img_cf_is_chroma_keyed(cf) && !recolor
+#if LV_COLOR_DEPTH!=32
+ && !lv_img_cf_has_alpha(cf)
+#endif
+ ) {
+ lv_gpu_nxp_vglite_blit_info_t blit;
+ lv_coord_t src_stride = lv_area_get_width(coords);
+
+ blit.src = src_buf;
+ blit.src_width = lv_area_get_width(coords);
+ blit.src_height = lv_area_get_height(coords);
+ blit.src_stride = src_stride * (int32_t)sizeof(lv_color_t);
+ blit.src_area.x1 = (blend_area.x1 - (coords->x1 - draw_ctx->buf_area->x1));
+ blit.src_area.y1 = (blend_area.y1 - (coords->y1 - draw_ctx->buf_area->y1));
+ blit.src_area.x2 = blit.src_area.x1 + blit.src_width - 1;
+ blit.src_area.y2 = blit.src_area.y1 + blit.src_height - 1;
+
+ blit.dst = dest_buf;
+ blit.dst_width = lv_area_get_width(draw_ctx->buf_area);
+ blit.dst_height = lv_area_get_height(draw_ctx->buf_area);
+ blit.dst_stride = dest_stride * (int32_t)sizeof(lv_color_t);
+ blit.dst_area.x1 = blend_area.x1;
+ blit.dst_area.y1 = blend_area.y1;
+ blit.dst_area.x2 = blend_area.x2;
+ blit.dst_area.y2 = blend_area.y2;
+
+ blit.opa = dsc->opa;
+ blit.angle = dsc->angle;
+ blit.pivot = dsc->pivot;
+ blit.zoom = dsc->zoom;
+
+ done = (lv_gpu_nxp_vglite_blit_transform(&blit) == LV_RES_OK);
+
+ if(!done)
+ VG_LITE_LOG_TRACE("VG-Lite blit transform failed. Fallback.");
+ }
+#endif
+
+ if(!done)
+ lv_draw_sw_img_decoded(draw_ctx, dsc, coords, map_p, cf);
+}
+
+static void lv_draw_nxp_rect(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords)
+{
+ bool done = false;
+ lv_draw_rect_dsc_t nxp_dsc;
+
+ lv_memcpy(&nxp_dsc, dsc, sizeof(nxp_dsc));
+#if LV_DRAW_COMPLEX
+ /* Draw only the shadow */
+ nxp_dsc.bg_opa = 0;
+ nxp_dsc.bg_img_opa = 0;
+ nxp_dsc.border_opa = 0;
+ nxp_dsc.outline_opa = 0;
+
+ lv_draw_sw_rect(draw_ctx, &nxp_dsc, coords);
+
+ /* Draw the background */
+ nxp_dsc.shadow_opa = 0;
+ nxp_dsc.bg_opa = dsc->bg_opa;
+ done = (draw_nxp_bg(draw_ctx, &nxp_dsc, coords) == LV_RES_OK);
+#endif /*LV_DRAW_COMPLEX*/
+
+ /* Draw the remaining parts */
+ nxp_dsc.shadow_opa = 0;
+ if(done)
+ nxp_dsc.bg_opa = 0;
+ nxp_dsc.bg_img_opa = dsc->bg_img_opa;
+ nxp_dsc.border_opa = dsc->border_opa;
+ nxp_dsc.outline_opa = dsc->outline_opa;
+
+ lv_draw_sw_rect(draw_ctx, &nxp_dsc, coords);
+}
+
+static lv_res_t draw_nxp_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords)
+{
+ if(dsc->bg_opa <= LV_OPA_MIN)
+ return LV_RES_INV;
+
+ lv_area_t bg_coords;
+ lv_area_copy(&bg_coords, coords);
+
+ /*If the border fully covers make the bg area 1px smaller to avoid artifacts on the corners*/
+ if(dsc->border_width > 1 && dsc->border_opa >= (lv_opa_t)LV_OPA_MAX && dsc->radius != 0) {
+ bg_coords.x1 += (dsc->border_side & LV_BORDER_SIDE_LEFT) ? 1 : 0;
+ bg_coords.y1 += (dsc->border_side & LV_BORDER_SIDE_TOP) ? 1 : 0;
+ bg_coords.x2 -= (dsc->border_side & LV_BORDER_SIDE_RIGHT) ? 1 : 0;
+ bg_coords.y2 -= (dsc->border_side & LV_BORDER_SIDE_BOTTOM) ? 1 : 0;
+ }
+
+ lv_area_t clipped_coords;
+ if(!_lv_area_intersect(&clipped_coords, &bg_coords, draw_ctx->clip_area))
+ return LV_RES_INV;
+
+ lv_grad_dir_t grad_dir = dsc->bg_grad.dir;
+ lv_color_t bg_color = grad_dir == LV_GRAD_DIR_NONE ? dsc->bg_color : dsc->bg_grad.stops[0].color;
+ if(bg_color.full == dsc->bg_grad.stops[1].color.full) grad_dir = LV_GRAD_DIR_NONE;
+
+ bool mask_any = lv_draw_mask_is_any(&bg_coords);
+
+ /*
+ * Most simple case: just a plain rectangle (no mask, no radius, no gradient)
+ * shall fallback to lv_draw_sw_blend().
+ *
+ * Complex case: gradient or radius but no mask.
+ */
+ if(!mask_any && ((dsc->radius != 0) || (grad_dir != LV_GRAD_DIR_NONE)) && !need_argb8565_support()) {
+#if LV_USE_GPU_NXP_VG_LITE
+ lv_res_t res = lv_gpu_nxp_vglite_draw_bg(draw_ctx, dsc, &bg_coords);
+ if(res != LV_RES_OK)
+ VG_LITE_LOG_TRACE("VG-Lite draw bg failed. Fallback.");
+
+ return res;
+#endif
+ }
+
+ return LV_RES_INV;
+}
+
+static void lv_draw_nxp_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_dsc_t * dsc, const lv_point_t * center,
+ uint16_t radius, uint16_t start_angle, uint16_t end_angle)
+{
+ bool done = false;
+
+#if LV_DRAW_COMPLEX
+ if(dsc->opa <= LV_OPA_MIN)
+ return;
+ if(dsc->width == 0)
+ return;
+ if(start_angle == end_angle)
+ return;
+
+#if LV_USE_GPU_NXP_VG_LITE
+ if(!need_argb8565_support()) {
+ done = (lv_gpu_nxp_vglite_draw_arc(draw_ctx, dsc, center, (int32_t)radius,
+ (int32_t)start_angle, (int32_t)end_angle) == LV_RES_OK);
+ if(!done)
+ VG_LITE_LOG_TRACE("VG-Lite draw arc failed. Fallback.");
+ }
+#endif
+#endif/*LV_DRAW_COMPLEX*/
+
+ if(!done)
+ lv_draw_sw_arc(draw_ctx, dsc, center, radius, start_angle, end_angle);
+}
+
+#endif /*LV_USE_GPU_NXP_PXP || LV_USE_GPU_NXP_VG_LITE*/
diff --git a/src/draw/nxp/lv_gpu_nxp.h b/src/draw/nxp/lv_gpu_nxp.h
new file mode 100644
index 000000000..899aff25b
--- /dev/null
+++ b/src/draw/nxp/lv_gpu_nxp.h
@@ -0,0 +1,71 @@
+/**
+ * @file lv_gpu_nxp.h
+ *
+ */
+
+/**
+ * MIT License
+ *
+ * Copyright 2022 NXP
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next paragraph)
+ * shall be included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+ * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
+ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#ifndef LV_GPU_NXP_H
+#define LV_GPU_NXP_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ * INCLUDES
+ *********************/
+
+#include "../../lv_conf_internal.h"
+#if LV_USE_GPU_NXP_PXP || LV_USE_GPU_NXP_VG_LITE
+#include "../sw/lv_draw_sw.h"
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+typedef lv_draw_sw_ctx_t lv_draw_nxp_ctx_t;
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+void lv_draw_nxp_ctx_init(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx);
+
+void lv_draw_nxp_ctx_deinit(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx);
+
+/**********************
+ * MACROS
+ **********************/
+#endif /*LV_USE_GPU_NXP_PXP || LV_USE_GPU_NXP_VG_LITE*/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /*LV_GPU_NXP_H*/
diff --git a/src/draw/nxp/pxp/lv_draw_nxp_pxp.mk b/src/draw/nxp/pxp/lv_draw_nxp_pxp.mk
new file mode 100644
index 000000000..ff475a193
--- /dev/null
+++ b/src/draw/nxp/pxp/lv_draw_nxp_pxp.mk
@@ -0,0 +1,8 @@
+CSRCS += lv_draw_pxp_blend.c
+CSRCS += lv_gpu_nxp_pxp_osa.c
+CSRCS += lv_gpu_nxp_pxp.c
+
+DEPPATH += --dep-path $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nxp/pxp
+VPATH += :$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nxp/pxp
+
+CFLAGS += "-I$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nxp/pxp"
diff --git a/src/draw/nxp/pxp/lv_draw_pxp_blend.c b/src/draw/nxp/pxp/lv_draw_pxp_blend.c
new file mode 100644
index 000000000..c0a6ecafa
--- /dev/null
+++ b/src/draw/nxp/pxp/lv_draw_pxp_blend.c
@@ -0,0 +1,632 @@
+/**
+ * @file lv_draw_pxp_blend.c
+ *
+ */
+
+/**
+ * MIT License
+ *
+ * Copyright 2020-2022 NXP
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next paragraph)
+ * shall be included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+ * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
+ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+/*********************
+ * INCLUDES
+ *********************/
+
+#include "lv_draw_pxp_blend.h"
+
+#if LV_USE_GPU_NXP_PXP
+
+/*********************
+ * DEFINES
+ *********************/
+
+#if LV_COLOR_16_SWAP
+ #error Color swap not implemented. Disable LV_COLOR_16_SWAP feature.
+#endif
+
+#if LV_COLOR_DEPTH==16
+ #define PXP_OUT_PIXEL_FORMAT kPXP_OutputPixelFormatRGB565
+ #define PXP_AS_PIXEL_FORMAT kPXP_AsPixelFormatRGB565
+ #define PXP_PS_PIXEL_FORMAT kPXP_PsPixelFormatRGB565
+#elif LV_COLOR_DEPTH==32
+ #define PXP_OUT_PIXEL_FORMAT kPXP_OutputPixelFormatARGB8888
+ #define PXP_AS_PIXEL_FORMAT kPXP_AsPixelFormatARGB8888
+ #define PXP_PS_PIXEL_FORMAT kPXP_PsPixelFormatRGB888
+#elif
+ #error Only 16bit and 32bit color depth are supported. Set LV_COLOR_DEPTH to 16 or 32.
+#endif
+
+#if defined (__alpha__) || defined (__ia64__) || defined (__x86_64__) \
+ || defined (_WIN64) || defined (__LP64__) || defined (__LLP64__)
+ #define ALIGN_SIZE 8
+#else
+ #define ALIGN_SIZE 4
+#endif
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+
+/**
+ * BLock Image Transfer - copy rectangular image from src buffer to dst buffer
+ * with combination of transformation (rotation, scale, recolor) and opacity, alpha channel
+ * or color keying. This requires two steps. First step is used for transformation into
+ * a temporary buffer and the second one will handle the color format or opacity.
+ *
+ * @param[in/out] dest_buf destination buffer
+ * @param[in] dest_area area to be copied from src_buf to dst_buf
+ * @param[in] dest_stride width (stride) of destination buffer in pixels
+ * @param[in] src_buf source buffer
+ * @param[in] src_area source area with absolute coordinates to draw on destination buffer
+ * @param[in] dsc image descriptor
+ * @param[in] cf color format
+ * @retval LV_RES_OK Fill completed
+ * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_PXP_LOG_ERRORS)
+ */
+static lv_res_t lv_gpu_nxp_pxp_blit_opa(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride,
+ const lv_color_t * src_buf, const lv_area_t * src_area,
+ const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf);
+
+/**
+ * BLock Image Transfer - copy rectangular image from src buffer to dst buffer
+ * with transformation and full opacity.
+ *
+ * @param[in/out] dest_buf destination buffer
+ * @param[in] dest_area area to be copied from src_buf to dst_buf
+ * @param[in] dest_stride width (stride) of destination buffer in pixels
+ * @param[in] src_buf source buffer
+ * @param[in] src_area source area with absolute coordinates to draw on destination buffer
+ * @param[in] dsc image descriptor
+ * @param[in] cf color format
+ * @retval LV_RES_OK Fill completed
+ * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_PXP_LOG_ERRORS)
+ */
+static lv_res_t lv_gpu_nxp_pxp_blit_cover(lv_color_t * dest_buf, const lv_area_t * dest_area,
+ lv_coord_t dest_stride,
+ const lv_color_t * src_buf, const lv_area_t * src_area,
+ const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf);
+
+/**
+ * BLock Image Transfer - copy rectangular image from src buffer to dst buffer
+ * without transformation but handling color format or opacity.
+ *
+ * @param[in/out] dest_buf destination buffer
+ * @param[in] dest_area area to be copied from src_buf to dst_buf
+ * @param[in] dest_stride width (stride) of destination buffer in pixels
+ * @param[in] src_buf source buffer
+ * @param[in] src_area source area with absolute coordinates to draw on destination buffer
+ * @param[in] dsc image descriptor
+ * @param[in] cf color format
+ * @retval LV_RES_OK Fill completed
+ * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_PXP_LOG_ERRORS)
+ */
+static lv_res_t lv_gpu_nxp_pxp_blit_cf(lv_color_t * dest_buf, const lv_area_t * dest_area,
+ lv_coord_t dest_stride,
+ const lv_color_t * src_buf, const lv_area_t * src_area,
+ const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf);
+
+/**********************
+ * STATIC VARIABLES
+ **********************/
+
+/**********************
+ * MACROS
+ **********************/
+
+#define ROUND_UP(x, align) ((x + (align - 1)) & ~(align - 1))
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+
+lv_res_t lv_gpu_nxp_pxp_fill(lv_color_t * dest_buf, lv_coord_t dest_stride, const lv_area_t * fill_area,
+ lv_color_t color, lv_opa_t opa)
+{
+ uint32_t area_size = lv_area_get_size(fill_area);
+ lv_coord_t area_w = lv_area_get_width(fill_area);
+ lv_coord_t area_h = lv_area_get_height(fill_area);
+
+ if(opa >= (lv_opa_t)LV_OPA_MAX) {
+ if(area_size < LV_GPU_NXP_PXP_FILL_SIZE_LIMIT) {
+ PXP_LOG_TRACE("Area size %d smaller than limit %d.", area_size, LV_GPU_NXP_PXP_FILL_SIZE_LIMIT);
+ return LV_RES_INV;
+ }
+ }
+ else {
+ if(area_size < LV_GPU_NXP_PXP_FILL_OPA_SIZE_LIMIT) {
+ PXP_LOG_TRACE("Area size %d smaller than limit %d.", area_size, LV_GPU_NXP_PXP_FILL_OPA_SIZE_LIMIT);
+ return LV_RES_INV;
+ }
+ }
+
+ PXP_Init(LV_GPU_NXP_PXP_ID);
+ PXP_EnableCsc1(LV_GPU_NXP_PXP_ID, false); /*Disable CSC1, it is enabled by default.*/
+ PXP_SetProcessBlockSize(LV_GPU_NXP_PXP_ID, kPXP_BlockSize16); /*Block size 16x16 for higher performance*/
+
+ /*OUT buffer configure*/
+ pxp_output_buffer_config_t outputConfig = {
+ .pixelFormat = PXP_OUT_PIXEL_FORMAT,
+ .interlacedMode = kPXP_OutputProgressive,
+ .buffer0Addr = (uint32_t)(dest_buf + dest_stride * fill_area->y1 + fill_area->x1),
+ .buffer1Addr = (uint32_t)NULL,
+ .pitchBytes = dest_stride * sizeof(lv_color_t),
+ .width = area_w,
+ .height = area_h
+ };
+
+ PXP_SetOutputBufferConfig(LV_GPU_NXP_PXP_ID, &outputConfig);
+
+ if(opa >= (lv_opa_t)LV_OPA_MAX) {
+ /*Simple color fill without opacity - AS disabled*/
+ PXP_SetAlphaSurfacePosition(LV_GPU_NXP_PXP_ID, 0xFFFFU, 0xFFFFU, 0U, 0U);
+
+ }
+ else {
+ /*Fill with opacity - AS used as source (same as OUT)*/
+ pxp_as_buffer_config_t asBufferConfig = {
+ .pixelFormat = PXP_AS_PIXEL_FORMAT,
+ .bufferAddr = (uint32_t)outputConfig.buffer0Addr,
+ .pitchBytes = outputConfig.pitchBytes
+ };
+
+ PXP_SetAlphaSurfaceBufferConfig(LV_GPU_NXP_PXP_ID, &asBufferConfig);
+ PXP_SetAlphaSurfacePosition(LV_GPU_NXP_PXP_ID, 0U, 0U, area_w, area_h);
+ }
+
+ /*Disable PS, use as color generator*/
+ PXP_SetProcessSurfacePosition(LV_GPU_NXP_PXP_ID, 0xFFFFU, 0xFFFFU, 0U, 0U);
+ PXP_SetProcessSurfaceBackGroundColor(LV_GPU_NXP_PXP_ID, lv_color_to32(color));
+
+ /**
+ * Configure Porter-Duff blending - src settings are unused for fill without opacity (opa = 0xff).
+ *
+ * Note: srcFactorMode and dstFactorMode are inverted in fsl_pxp.h:
+ * srcFactorMode is actually applied on PS alpha value
+ * dstFactorMode is actually applied on AS alpha value
+ */
+ pxp_porter_duff_config_t pdConfig = {
+ .enable = 1,
+ .dstColorMode = kPXP_PorterDuffColorNoAlpha,
+ .srcColorMode = kPXP_PorterDuffColorNoAlpha,
+ .dstGlobalAlphaMode = kPXP_PorterDuffGlobalAlpha,
+ .srcGlobalAlphaMode = kPXP_PorterDuffGlobalAlpha,
+ .dstFactorMode = kPXP_PorterDuffFactorStraight,
+ .srcFactorMode = (opa >= (lv_opa_t)LV_OPA_MAX) ? kPXP_PorterDuffFactorStraight : kPXP_PorterDuffFactorInversed,
+ .dstGlobalAlpha = opa,
+ .srcGlobalAlpha = opa,
+ .dstAlphaMode = kPXP_PorterDuffAlphaStraight, /*don't care*/
+ .srcAlphaMode = kPXP_PorterDuffAlphaStraight /*don't care*/
+ };
+
+ PXP_SetPorterDuffConfig(LV_GPU_NXP_PXP_ID, &pdConfig);
+
+ lv_gpu_nxp_pxp_run(); /*Start PXP task*/
+
+ return LV_RES_OK;
+}
+
+lv_res_t lv_gpu_nxp_pxp_blit(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride,
+ const lv_color_t * src_buf, const lv_area_t * src_area, lv_opa_t opa, lv_disp_rot_t angle)
+{
+ uint32_t dest_size = lv_area_get_size(dest_area);
+ lv_coord_t dest_w = lv_area_get_width(dest_area);
+ lv_coord_t dest_h = lv_area_get_height(dest_area);
+
+ if(opa >= (lv_opa_t)LV_OPA_MAX) {
+ if(dest_size < LV_GPU_NXP_PXP_BLIT_SIZE_LIMIT) {
+ PXP_LOG_TRACE("Area size %d smaller than limit %d.", dest_size, LV_GPU_NXP_PXP_BLIT_SIZE_LIMIT);
+ return LV_RES_INV;
+ }
+ }
+ else {
+ if(dest_size < LV_GPU_NXP_PXP_BLIT_OPA_SIZE_LIMIT) {
+ PXP_LOG_TRACE("Area size %d smaller than limit %d.", dest_size, LV_GPU_NXP_PXP_BLIT_OPA_SIZE_LIMIT);
+ return LV_RES_INV;
+ }
+ }
+
+ PXP_Init(LV_GPU_NXP_PXP_ID);
+ PXP_EnableCsc1(LV_GPU_NXP_PXP_ID, false); /*Disable CSC1, it is enabled by default.*/
+ PXP_SetProcessBlockSize(LV_GPU_NXP_PXP_ID, kPXP_BlockSize16); /*block size 16x16 for higher performance*/
+
+ /* convert rotation angle */
+ pxp_rotate_degree_t pxp_rot;
+ switch(angle) {
+ case LV_DISP_ROT_NONE:
+ pxp_rot = kPXP_Rotate0;
+ break;
+ case LV_DISP_ROT_90:
+ pxp_rot = kPXP_Rotate90;
+ break;
+ case LV_DISP_ROT_180:
+ pxp_rot = kPXP_Rotate180;
+ break;
+ case LV_DISP_ROT_270:
+ pxp_rot = kPXP_Rotate270;
+ break;
+ default:
+ pxp_rot = kPXP_Rotate0;
+ break;
+ }
+ PXP_SetRotateConfig(LV_GPU_NXP_PXP_ID, kPXP_RotateOutputBuffer, pxp_rot, kPXP_FlipDisable);
+
+ pxp_as_blend_config_t asBlendConfig = {
+ .alpha = opa,
+ .invertAlpha = false,
+ .alphaMode = kPXP_AlphaRop,
+ .ropMode = kPXP_RopMergeAs
+ };
+
+ if(opa >= (lv_opa_t)LV_OPA_MAX) {
+ /*Simple blit, no effect - Disable PS buffer*/
+ PXP_SetProcessSurfacePosition(LV_GPU_NXP_PXP_ID, 0xFFFFU, 0xFFFFU, 0U, 0U);
+ }
+ else {
+ pxp_ps_buffer_config_t psBufferConfig = {
+ .pixelFormat = PXP_PS_PIXEL_FORMAT,
+ .swapByte = false,
+ .bufferAddr = (uint32_t)(dest_buf + dest_stride * dest_area->y1 + dest_area->x1),
+ .bufferAddrU = 0U,
+ .bufferAddrV = 0U,
+ .pitchBytes = dest_stride * sizeof(lv_color_t)
+ };
+
+ asBlendConfig.alphaMode = kPXP_AlphaOverride;
+
+ PXP_SetProcessSurfaceBufferConfig(LV_GPU_NXP_PXP_ID, &psBufferConfig);
+ PXP_SetProcessSurfacePosition(LV_GPU_NXP_PXP_ID, 0U, 0U, dest_w - 1, dest_h - 1);
+ }
+
+ lv_coord_t src_stride = lv_area_get_width(src_area);
+
+ /*AS buffer - source image*/
+ pxp_as_buffer_config_t asBufferConfig = {
+ .pixelFormat = PXP_AS_PIXEL_FORMAT,
+ .bufferAddr = (uint32_t)src_buf,
+ .pitchBytes = src_stride * sizeof(lv_color_t)
+ };
+ PXP_SetAlphaSurfaceBufferConfig(LV_GPU_NXP_PXP_ID, &asBufferConfig);
+ PXP_SetAlphaSurfacePosition(LV_GPU_NXP_PXP_ID, 0U, 0U, dest_w - 1U, dest_h - 1U);
+ PXP_SetAlphaSurfaceBlendConfig(LV_GPU_NXP_PXP_ID, &asBlendConfig);
+ PXP_EnableAlphaSurfaceOverlayColorKey(LV_GPU_NXP_PXP_ID, false);
+
+ /*Output buffer.*/
+ pxp_output_buffer_config_t outputBufferConfig = {
+ .pixelFormat = (pxp_output_pixel_format_t)PXP_OUT_PIXEL_FORMAT,
+ .interlacedMode = kPXP_OutputProgressive,
+ .buffer0Addr = (uint32_t)(dest_buf + dest_stride * dest_area->y1 + dest_area->x1),
+ .buffer1Addr = (uint32_t)0U,
+ .pitchBytes = dest_stride * sizeof(lv_color_t),
+ .width = dest_w,
+ .height = dest_h
+ };
+ PXP_SetOutputBufferConfig(LV_GPU_NXP_PXP_ID, &outputBufferConfig);
+
+ lv_gpu_nxp_pxp_run(); /* Start PXP task */
+
+ return LV_RES_OK;
+}
+
+lv_res_t lv_gpu_nxp_pxp_blit_transform(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride,
+ const lv_color_t * src_buf, const lv_area_t * src_area,
+ const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf)
+{
+ uint32_t dest_size = lv_area_get_size(dest_area);
+
+ if(dsc->opa >= (lv_opa_t)LV_OPA_MAX) {
+ if(dest_size < LV_GPU_NXP_PXP_BLIT_SIZE_LIMIT) {
+ PXP_LOG_TRACE("Area size %d smaller than limit %d.", dest_size, LV_GPU_NXP_PXP_BLIT_SIZE_LIMIT);
+ return LV_RES_INV;
+ }
+ }
+ else {
+ if(dest_size < LV_GPU_NXP_PXP_BLIT_OPA_SIZE_LIMIT) {
+ PXP_LOG_TRACE("Area size %d smaller than limit %d.", dest_size, LV_GPU_NXP_PXP_BLIT_OPA_SIZE_LIMIT);
+ return LV_RES_INV;
+ }
+ }
+
+ bool recolor = (dsc->recolor_opa != LV_OPA_TRANSP);
+ bool rotation = (dsc->angle != 0);
+
+ if(rotation) {
+ if(dsc->angle != 0 && dsc->angle != 900 && dsc->angle != 1800 && dsc->angle != 2700) {
+ PXP_LOG_TRACE("Rotation angle %d is not supported. PXP can rotate only 90x angle.", dsc->angle);
+ return LV_RES_INV;
+ }
+ }
+
+ if(recolor || rotation) {
+ if(dsc->opa >= (lv_opa_t)LV_OPA_MAX && !lv_img_cf_has_alpha(cf) && !lv_img_cf_is_chroma_keyed(cf))
+ return lv_gpu_nxp_pxp_blit_cover(dest_buf, dest_area, dest_stride, src_buf, src_area, dsc, cf);
+ else
+ /*Recolor and/or rotation with alpha or opacity is done in two steps.*/
+ return lv_gpu_nxp_pxp_blit_opa(dest_buf, dest_area, dest_stride, src_buf, src_area, dsc, cf);
+ }
+
+ return lv_gpu_nxp_pxp_blit_cf(dest_buf, dest_area, dest_stride, src_buf, src_area, dsc, cf);
+}
+
+/**********************
+ * STATIC FUNCTIONS
+ **********************/
+
+static lv_res_t lv_gpu_nxp_pxp_blit_opa(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride,
+ const lv_color_t * src_buf, const lv_area_t * src_area,
+ const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf)
+{
+ lv_coord_t dest_w = lv_area_get_width(dest_area);
+ lv_coord_t dest_h = lv_area_get_height(dest_area);
+ lv_res_t res;
+ uint32_t size = dest_w * dest_h * sizeof(lv_color_t);
+
+ if(ROUND_UP(size, ALIGN_SIZE) >= LV_MEM_SIZE)
+ PXP_RETURN_INV("Insufficient memory for temporary buffer. Please increase LV_MEM_SIZE.");
+
+ lv_color_t * tmp_buf = (lv_color_t *)lv_mem_buf_get(size);
+ if(!tmp_buf)
+ PXP_RETURN_INV("Allocating temporary buffer failed.");
+
+ const lv_area_t tmp_area = {
+ .x1 = 0,
+ .y1 = 0,
+ .x2 = dest_w - 1,
+ .y2 = dest_h - 1
+ };
+
+ /*Step 1: Transform with full opacity to temporary buffer*/
+ res = lv_gpu_nxp_pxp_blit_cover(tmp_buf, &tmp_area, dest_w, src_buf, src_area, dsc, cf);
+ if(res != LV_RES_OK) {
+ PXP_LOG_TRACE("Blit cover with full opacity failed.");
+ lv_mem_buf_release(tmp_buf);
+
+ return res;
+ }
+
+ /*Step 2: Blit temporary results with required opacity to output*/
+ res = lv_gpu_nxp_pxp_blit_cf(dest_buf, dest_area, dest_stride, tmp_buf, &tmp_area, dsc, cf);
+
+ /*Clean-up memory*/
+ lv_mem_buf_release(tmp_buf);
+
+ return res;
+}
+
+static lv_res_t lv_gpu_nxp_pxp_blit_cover(lv_color_t * dest_buf, const lv_area_t * dest_area,
+ lv_coord_t dest_stride,
+ const lv_color_t * src_buf, const lv_area_t * src_area,
+ const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf)
+{
+ lv_coord_t dest_w = lv_area_get_width(dest_area);
+ lv_coord_t dest_h = lv_area_get_height(dest_area);
+
+ bool recolor = (dsc->recolor_opa != LV_OPA_TRANSP);
+ bool rotation = (dsc->angle != 0);
+
+ PXP_Init(LV_GPU_NXP_PXP_ID);
+ PXP_EnableCsc1(LV_GPU_NXP_PXP_ID, false); /*Disable CSC1, it is enabled by default.*/
+ PXP_SetProcessBlockSize(LV_GPU_NXP_PXP_ID, kPXP_BlockSize16); /*block size 16x16 for higher performance*/
+
+ if(rotation) {
+ /*
+ * PXP is set to process 16x16 blocks to optimize the system for memory
+ * bandwidth and image processing time.
+ * The output engine essentially truncates any output pixels after the
+ * desired number of pixels has been written.
+ * When rotating a source image and the output is not divisible by the block
+ * size, the incorrect pixels could be truncated and the final output image
+ * can look shifted.
+ */
+ if(lv_area_get_width(src_area) % 16 || lv_area_get_height(src_area) % 16) {
+ PXP_LOG_TRACE("Rotation is not supported for image w/o alignment to block size 16x16.");
+ return LV_RES_INV;
+ }
+
+ /*Convert rotation angle*/
+ pxp_rotate_degree_t pxp_rot;
+ switch(dsc->angle) {
+ case 0:
+ pxp_rot = kPXP_Rotate0;
+ break;
+ case 900:
+ pxp_rot = kPXP_Rotate90;
+ break;
+ case 1800:
+ pxp_rot = kPXP_Rotate180;
+ break;
+ case 2700:
+ pxp_rot = kPXP_Rotate270;
+ break;
+ default:
+ PXP_LOG_TRACE("Rotation angle %d is not supported. PXP can rotate only 90x angle.", dsc->angle);
+ return LV_RES_INV;
+ }
+ PXP_SetRotateConfig(LV_GPU_NXP_PXP_ID, kPXP_RotateOutputBuffer, pxp_rot, kPXP_FlipDisable);
+ }
+
+ lv_coord_t src_stride = lv_area_get_width(src_area);
+
+ /*AS buffer - source image*/
+ pxp_as_buffer_config_t asBufferConfig = {
+ .pixelFormat = PXP_AS_PIXEL_FORMAT,
+ .bufferAddr = (uint32_t)src_buf,
+ .pitchBytes = src_stride * sizeof(lv_color_t)
+ };
+ PXP_SetAlphaSurfaceBufferConfig(LV_GPU_NXP_PXP_ID, &asBufferConfig);
+ PXP_SetAlphaSurfacePosition(LV_GPU_NXP_PXP_ID, 0U, 0U, dest_w - 1U, dest_h - 1U);
+
+ /*Disable PS buffer*/
+ PXP_SetProcessSurfacePosition(LV_GPU_NXP_PXP_ID, 0xFFFFU, 0xFFFFU, 0U, 0U);
+ if(recolor)
+ /*Use as color generator*/
+ PXP_SetProcessSurfaceBackGroundColor(LV_GPU_NXP_PXP_ID, lv_color_to32(dsc->recolor));
+
+ /*Output buffer*/
+ pxp_output_buffer_config_t outputBufferConfig = {
+ .pixelFormat = (pxp_output_pixel_format_t)PXP_OUT_PIXEL_FORMAT,
+ .interlacedMode = kPXP_OutputProgressive,
+ .buffer0Addr = (uint32_t)(dest_buf + dest_stride * dest_area->y1 + dest_area->x1),
+ .buffer1Addr = (uint32_t)0U,
+ .pitchBytes = dest_stride * sizeof(lv_color_t),
+ .width = dest_w,
+ .height = dest_h
+ };
+ PXP_SetOutputBufferConfig(LV_GPU_NXP_PXP_ID, &outputBufferConfig);
+
+ if(recolor || lv_img_cf_has_alpha(cf)) {
+ /**
+ * Configure Porter-Duff blending.
+ *
+ * Note: srcFactorMode and dstFactorMode are inverted in fsl_pxp.h:
+ * srcFactorMode is actually applied on PS alpha value
+ * dstFactorMode is actually applied on AS alpha value
+ */
+ pxp_porter_duff_config_t pdConfig = {
+ .enable = 1,
+ .dstColorMode = kPXP_PorterDuffColorWithAlpha,
+ .srcColorMode = kPXP_PorterDuffColorNoAlpha,
+ .dstGlobalAlphaMode = kPXP_PorterDuffGlobalAlpha,
+ .srcGlobalAlphaMode = lv_img_cf_has_alpha(cf) ? kPXP_PorterDuffLocalAlpha : kPXP_PorterDuffGlobalAlpha,
+ .dstFactorMode = kPXP_PorterDuffFactorStraight,
+ .srcFactorMode = kPXP_PorterDuffFactorInversed,
+ .dstGlobalAlpha = recolor ? dsc->recolor_opa : 0x00,
+ .srcGlobalAlpha = 0xff,
+ .dstAlphaMode = kPXP_PorterDuffAlphaStraight, /*don't care*/
+ .srcAlphaMode = kPXP_PorterDuffAlphaStraight
+ };
+ PXP_SetPorterDuffConfig(LV_GPU_NXP_PXP_ID, &pdConfig);
+ }
+
+ lv_gpu_nxp_pxp_run(); /*Start PXP task*/
+
+ return LV_RES_OK;
+}
+
+static lv_res_t lv_gpu_nxp_pxp_blit_cf(lv_color_t * dest_buf, const lv_area_t * dest_area,
+ lv_coord_t dest_stride,
+ const lv_color_t * src_buf, const lv_area_t * src_area,
+ const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf)
+{
+ lv_coord_t dest_w = lv_area_get_width(dest_area);
+ lv_coord_t dest_h = lv_area_get_height(dest_area);
+
+ PXP_Init(LV_GPU_NXP_PXP_ID);
+ PXP_EnableCsc1(LV_GPU_NXP_PXP_ID, false); /*Disable CSC1, it is enabled by default.*/
+ PXP_SetProcessBlockSize(LV_GPU_NXP_PXP_ID, kPXP_BlockSize16); /*block size 16x16 for higher performance*/
+
+ pxp_as_blend_config_t asBlendConfig = {
+ .alpha = dsc->opa,
+ .invertAlpha = false,
+ .alphaMode = kPXP_AlphaRop,
+ .ropMode = kPXP_RopMergeAs
+ };
+
+ if(dsc->opa >= (lv_opa_t)LV_OPA_MAX && !lv_img_cf_is_chroma_keyed(cf) && !lv_img_cf_has_alpha(cf)) {
+ /*Simple blit, no effect - Disable PS buffer*/
+ PXP_SetProcessSurfacePosition(LV_GPU_NXP_PXP_ID, 0xFFFFU, 0xFFFFU, 0U, 0U);
+ }
+ else {
+ /*PS must be enabled to fetch background pixels.
+ PS and OUT buffers are the same, blend will be done in-place*/
+ pxp_ps_buffer_config_t psBufferConfig = {
+ .pixelFormat = PXP_PS_PIXEL_FORMAT,
+ .swapByte = false,
+ .bufferAddr = (uint32_t)(dest_buf + dest_stride * dest_area->y1 + dest_area->x1),
+ .bufferAddrU = 0U,
+ .bufferAddrV = 0U,
+ .pitchBytes = dest_stride * sizeof(lv_color_t)
+ };
+ if(dsc->opa >= (lv_opa_t)LV_OPA_MAX) {
+ asBlendConfig.alphaMode = lv_img_cf_has_alpha(cf) ? kPXP_AlphaEmbedded : kPXP_AlphaOverride;
+ }
+ else {
+ asBlendConfig.alphaMode = lv_img_cf_has_alpha(cf) ? kPXP_AlphaMultiply : kPXP_AlphaOverride;
+ }
+ PXP_SetProcessSurfaceBufferConfig(LV_GPU_NXP_PXP_ID, &psBufferConfig);
+ PXP_SetProcessSurfacePosition(LV_GPU_NXP_PXP_ID, 0U, 0U, dest_w - 1, dest_h - 1);
+ }
+
+ lv_coord_t src_stride = lv_area_get_width(src_area);
+
+ /*AS buffer - source image*/
+ pxp_as_buffer_config_t asBufferConfig = {
+ .pixelFormat = PXP_AS_PIXEL_FORMAT,
+ .bufferAddr = (uint32_t)src_buf,
+ .pitchBytes = src_stride * sizeof(lv_color_t)
+ };
+ PXP_SetAlphaSurfaceBufferConfig(LV_GPU_NXP_PXP_ID, &asBufferConfig);
+ PXP_SetAlphaSurfacePosition(LV_GPU_NXP_PXP_ID, 0U, 0U, dest_w - 1U, dest_h - 1U);
+ PXP_SetAlphaSurfaceBlendConfig(LV_GPU_NXP_PXP_ID, &asBlendConfig);
+
+ if(lv_img_cf_is_chroma_keyed(cf)) {
+ lv_color_t colorKeyLow = LV_COLOR_CHROMA_KEY;
+ lv_color_t colorKeyHigh = LV_COLOR_CHROMA_KEY;
+
+ bool recolor = (dsc->recolor_opa != LV_OPA_TRANSP);
+
+ if(recolor) {
+ /* New color key after recoloring */
+ lv_color_t colorKey = lv_color_mix(dsc->recolor, LV_COLOR_CHROMA_KEY, dsc->recolor_opa);
+
+ LV_COLOR_SET_R(colorKeyLow, colorKey.ch.red != 0 ? colorKey.ch.red - 1 : 0);
+ LV_COLOR_SET_G(colorKeyLow, colorKey.ch.green != 0 ? colorKey.ch.green - 1 : 0);
+ LV_COLOR_SET_B(colorKeyLow, colorKey.ch.blue != 0 ? colorKey.ch.blue - 1 : 0);
+
+#if LV_COLOR_DEPTH==16
+ LV_COLOR_SET_R(colorKeyHigh, colorKey.ch.red != 0x1f ? colorKey.ch.red + 1 : 0x1f);
+ LV_COLOR_SET_G(colorKeyHigh, colorKey.ch.green != 0x3f ? colorKey.ch.green + 1 : 0x3f);
+ LV_COLOR_SET_B(colorKeyHigh, colorKey.ch.blue != 0x1f ? colorKey.ch.blue + 1 : 0x1f);
+#else /*LV_COLOR_DEPTH==32*/
+ LV_COLOR_SET_R(colorKeyHigh, colorKey.ch.red != 0xff ? colorKey.ch.red + 1 : 0xff);
+ LV_COLOR_SET_G(colorKeyHigh, colorKey.ch.green != 0xff ? colorKey.ch.green + 1 : 0xff);
+ LV_COLOR_SET_B(colorKeyHigh, colorKey.ch.blue != 0xff ? colorKey.ch.blue + 1 : 0xff);
+#endif
+ }
+
+ PXP_SetAlphaSurfaceOverlayColorKey(LV_GPU_NXP_PXP_ID, lv_color_to32(colorKeyLow),
+ lv_color_to32(colorKeyHigh));
+ }
+
+ PXP_EnableAlphaSurfaceOverlayColorKey(LV_GPU_NXP_PXP_ID, lv_img_cf_is_chroma_keyed(cf));
+
+ /*Output buffer.*/
+ pxp_output_buffer_config_t outputBufferConfig = {
+ .pixelFormat = (pxp_output_pixel_format_t)PXP_OUT_PIXEL_FORMAT,
+ .interlacedMode = kPXP_OutputProgressive,
+ .buffer0Addr = (uint32_t)(dest_buf + dest_stride * dest_area->y1 + dest_area->x1),
+ .buffer1Addr = (uint32_t)0U,
+ .pitchBytes = dest_stride * sizeof(lv_color_t),
+ .width = dest_w,
+ .height = dest_h
+ };
+ PXP_SetOutputBufferConfig(LV_GPU_NXP_PXP_ID, &outputBufferConfig);
+
+ lv_gpu_nxp_pxp_run(); /* Start PXP task */
+
+ return LV_RES_OK;
+}
+
+#endif /*LV_USE_GPU_NXP_PXP*/
diff --git a/src/draw/nxp/pxp/lv_draw_pxp_blend.h b/src/draw/nxp/pxp/lv_draw_pxp_blend.h
new file mode 100644
index 000000000..43a6440de
--- /dev/null
+++ b/src/draw/nxp/pxp/lv_draw_pxp_blend.h
@@ -0,0 +1,143 @@
+/**
+ * @file lv_draw_pxp_blend.h
+ *
+ */
+
+/**
+ * MIT License
+ *
+ * Copyright 2020-2022 NXP
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next paragraph)
+ * shall be included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+ * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
+ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#ifndef LV_DRAW_PXP_BLEND_H
+#define LV_DRAW_PXP_BLEND_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ * INCLUDES
+ *********************/
+
+#include "../../../lv_conf_internal.h"
+
+#if LV_USE_GPU_NXP_PXP
+#include "lv_gpu_nxp_pxp.h"
+#include "../../sw/lv_draw_sw.h"
+
+/*********************
+ * DEFINES
+ *********************/
+
+#ifndef LV_GPU_NXP_PXP_BLIT_SIZE_LIMIT
+/** Minimum area (in pixels) for image copy with 100% opacity to be handled by PXP*/
+#define LV_GPU_NXP_PXP_BLIT_SIZE_LIMIT 5000
+#endif
+
+#ifndef LV_GPU_NXP_PXP_BLIT_OPA_SIZE_LIMIT
+/** Minimum area (in pixels) for image copy with transparency to be handled by PXP*/
+#define LV_GPU_NXP_PXP_BLIT_OPA_SIZE_LIMIT 5000
+#endif
+
+#ifndef LV_GPU_NXP_PXP_BUFF_SYNC_BLIT_SIZE_LIMIT
+/** Minimum invalidated area (in pixels) to be synchronized by PXP during buffer sync */
+#define LV_GPU_NXP_PXP_BUFF_SYNC_BLIT_SIZE_LIMIT 5000
+#endif
+
+#ifndef LV_GPU_NXP_PXP_FILL_SIZE_LIMIT
+/** Minimum area (in pixels) to be filled by PXP with 100% opacity*/
+#define LV_GPU_NXP_PXP_FILL_SIZE_LIMIT 5000
+#endif
+
+#ifndef LV_GPU_NXP_PXP_FILL_OPA_SIZE_LIMIT
+/** Minimum area (in pixels) to be filled by PXP with transparency*/
+#define LV_GPU_NXP_PXP_FILL_OPA_SIZE_LIMIT 5000
+#endif
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+/**
+ * Fill area, with optional opacity.
+ *
+ * @param[in/out] dest_buf destination buffer
+ * @param[in] dest_stride width (stride) of destination buffer in pixels
+ * @param[in] fill_area area to fill
+ * @param[in] color color
+ * @param[in] opa transparency of the color
+ * @retval LV_RES_OK Fill completed
+ * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_PXP_LOG_ERRORS)
+ */
+lv_res_t lv_gpu_nxp_pxp_fill(lv_color_t * dest_buf, lv_coord_t dest_stride, const lv_area_t * fill_area,
+ lv_color_t color, lv_opa_t opa);
+
+/**
+ * BLock Image Transfer - copy rectangular image from src_buf to dst_buf with effects.
+ * By default, image is copied directly, with optional opacity. This function can also
+ * rotate the display output buffer to a specified angle (90x step).
+ *
+ * @param[in/out] dest_buf destination buffer
+ * @param[in] dest_area destination area
+ * @param[in] dest_stride width (stride) of destination buffer in pixels
+ * @param[in] src_buf source buffer
+ * @param[in] src_area source area with absolute coordinates to draw on destination buffer
+ * @param[in] opa opacity of the result
+ * @param[in] angle display rotation angle (90x)
+ * @retval LV_RES_OK Fill completed
+ * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_PXP_LOG_ERRORS)
+ */
+lv_res_t lv_gpu_nxp_pxp_blit(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride,
+ const lv_color_t * src_buf, const lv_area_t * src_area, lv_opa_t opa, lv_disp_rot_t angle);
+
+/**
+ * BLock Image Transfer - copy rectangular image from src_buf to dst_buf with transformation.
+ *
+ *
+ * @param[in/out] dest_buf destination buffer
+ * @param[in] dest_area destination area
+ * @param[in] dest_stride width (stride) of destination buffer in pixels
+ * @param[in] src_buf source buffer
+ * @param[in] src_area source area with absolute coordinates to draw on destination buffer
+ * @param[in] dsc image descriptor
+ * @param[in] cf color format
+ * @retval LV_RES_OK Fill completed
+ * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_PXP_LOG_ERRORS)
+ */
+lv_res_t lv_gpu_nxp_pxp_blit_transform(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride,
+ const lv_color_t * src_buf, const lv_area_t * src_area, const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf);
+
+/**********************
+ * MACROS
+ **********************/
+
+#endif /*LV_USE_GPU_NXP_PXP*/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /*LV_DRAW_PXP_BLEND_H*/
diff --git a/src/draw/nxp/pxp/lv_gpu_nxp_pxp.c b/src/draw/nxp/pxp/lv_gpu_nxp_pxp.c
new file mode 100644
index 000000000..94d242a0d
--- /dev/null
+++ b/src/draw/nxp/pxp/lv_gpu_nxp_pxp.c
@@ -0,0 +1,116 @@
+/**
+ * @file lv_gpu_nxp_pxp.c
+ *
+ */
+
+/**
+ * MIT License
+ *
+ * Copyright 2020-2022 NXP
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next paragraph)
+ * shall be included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+ * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
+ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+/*********************
+ * INCLUDES
+ *********************/
+
+#include "lv_gpu_nxp_pxp.h"
+
+#if LV_USE_GPU_NXP_PXP
+#include "lv_gpu_nxp_pxp_osa.h"
+#include "../../../core/lv_refr.h"
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+
+/**
+ * Clean & invalidate cache.
+ */
+static void invalidate_cache(void);
+
+/**********************
+ * STATIC VARIABLES
+ **********************/
+
+static lv_nxp_pxp_cfg_t * pxp_cfg;
+
+/**********************
+ * MACROS
+ **********************/
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+
+lv_res_t lv_gpu_nxp_pxp_init(void)
+{
+ pxp_cfg = lv_gpu_nxp_pxp_get_cfg();
+
+ if(!pxp_cfg || !pxp_cfg->pxp_interrupt_deinit || !pxp_cfg->pxp_interrupt_init || !pxp_cfg->pxp_run)
+ PXP_RETURN_INV("PXP configuration error.");
+
+ PXP_Init(LV_GPU_NXP_PXP_ID);
+ PXP_EnableCsc1(LV_GPU_NXP_PXP_ID, false); /*Disable CSC1, it is enabled by default.*/
+ PXP_EnableInterrupts(LV_GPU_NXP_PXP_ID, kPXP_CompleteInterruptEnable);
+
+ if(pxp_cfg->pxp_interrupt_init() != LV_RES_OK) {
+ PXP_Deinit(LV_GPU_NXP_PXP_ID);
+ PXP_RETURN_INV("PXP interrupt init failed.");
+ }
+
+ return LV_RES_OK;
+}
+
+void lv_gpu_nxp_pxp_deinit(void)
+{
+ pxp_cfg->pxp_interrupt_deinit();
+ PXP_DisableInterrupts(PXP, kPXP_CompleteInterruptEnable);
+ PXP_Deinit(LV_GPU_NXP_PXP_ID);
+}
+
+void lv_gpu_nxp_pxp_run(void)
+{
+ /*Clean & invalidate cache*/
+ invalidate_cache();
+
+ pxp_cfg->pxp_run();
+}
+
+/**********************
+ * STATIC FUNCTIONS
+ **********************/
+
+static void invalidate_cache(void)
+{
+ lv_disp_t * disp = _lv_refr_get_disp_refreshing();
+ if(disp->driver->clean_dcache_cb)
+ disp->driver->clean_dcache_cb(disp->driver);
+}
+
+#endif /*LV_USE_GPU_NXP_PXP*/
diff --git a/src/draw/nxp/pxp/lv_gpu_nxp_pxp.h b/src/draw/nxp/pxp/lv_gpu_nxp_pxp.h
new file mode 100644
index 000000000..e695d8f13
--- /dev/null
+++ b/src/draw/nxp/pxp/lv_gpu_nxp_pxp.h
@@ -0,0 +1,153 @@
+/**
+ * @file lv_gpu_nxp_pxp.h
+ *
+ */
+
+/**
+ * MIT License
+ *
+ * Copyright 2020-2022 NXP
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next paragraph)
+ * shall be included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+ * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
+ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#ifndef LV_GPU_NXP_PXP_H
+#define LV_GPU_NXP_PXP_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ * INCLUDES
+ *********************/
+
+#include "../../../lv_conf_internal.h"
+
+#if LV_USE_GPU_NXP_PXP
+#include "fsl_cache.h"
+#include "fsl_pxp.h"
+
+#include "../../../misc/lv_log.h"
+
+/*********************
+ * DEFINES
+ *********************/
+
+/** PXP module instance to use*/
+#define LV_GPU_NXP_PXP_ID PXP
+
+/** PXP interrupt line ID*/
+#define LV_GPU_NXP_PXP_IRQ_ID PXP_IRQn
+
+#ifndef LV_GPU_NXP_PXP_LOG_ERRORS
+/** Enable logging of PXP errors (\see LV_LOG_ERROR)*/
+#define LV_GPU_NXP_PXP_LOG_ERRORS 1
+#endif
+
+#ifndef LV_GPU_NXP_PXP_LOG_TRACES
+/** Enable logging of PXP errors (\see LV_LOG_ERROR)*/
+#define LV_GPU_NXP_PXP_LOG_TRACES 0
+#endif
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**
+ * NXP PXP device configuration - call-backs used for
+ * interrupt init/wait/deinit.
+ */
+typedef struct {
+ /** Callback for PXP interrupt initialization*/
+ lv_res_t (*pxp_interrupt_init)(void);
+
+ /** Callback for PXP interrupt de-initialization*/
+ void (*pxp_interrupt_deinit)(void);
+
+ /** Callback that should start PXP and wait for operation complete*/
+ void (*pxp_run)(void);
+} lv_nxp_pxp_cfg_t;
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+/**
+ * Reset and initialize PXP device. This function should be called as a part
+ * of display init sequence.
+ *
+ * @retval LV_RES_OK PXP init completed
+ * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_PXP_LOG_ERRORS)
+ */
+lv_res_t lv_gpu_nxp_pxp_init(void);
+
+/**
+ * Disable PXP device. Should be called during display deinit sequence.
+ */
+void lv_gpu_nxp_pxp_deinit(void);
+
+/**
+ * Start PXP job and wait for completion.
+ */
+void lv_gpu_nxp_pxp_run(void);
+
+/**********************
+ * MACROS
+ **********************/
+
+#define PXP_COND_STOP(cond, txt) \
+ do { \
+ if (cond) { \
+ LV_LOG_ERROR("%s. STOP!", txt); \
+ for ( ; ; ); \
+ } \
+ } while(0)
+
+#if LV_GPU_NXP_PXP_LOG_ERRORS
+#define PXP_RETURN_INV(fmt, ...) \
+ do { \
+ LV_LOG_ERROR(fmt, ##__VA_ARGS__); \
+ return LV_RES_INV; \
+ } while (0)
+#else
+#define PXP_RETURN_INV(fmt, ...) \
+ do { \
+ return LV_RES_INV; \
+ }while(0)
+#endif /*LV_GPU_NXP_PXP_LOG_ERRORS*/
+
+#if LV_GPU_NXP_PXP_LOG_TRACES
+#define PXP_LOG_TRACE(fmt, ...) \
+ do { \
+ LV_LOG_ERROR(fmt, ##__VA_ARGS__); \
+ } while (0)
+#else
+#define PXP_LOG_TRACE(fmt, ...) \
+ do { \
+ } while (0)
+#endif /*LV_GPU_NXP_PXP_LOG_TRACES*/
+
+#endif /*LV_USE_GPU_NXP_PXP*/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /*LV_GPU_NXP_PXP_H*/
diff --git a/src/draw/nxp_pxp/lv_gpu_nxp_pxp_osa.c b/src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.c
similarity index 89%
rename from src/draw/nxp_pxp/lv_gpu_nxp_pxp_osa.c
rename to src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.c
index 1203434c7..c4b8dbe57 100644
--- a/src/draw/nxp_pxp/lv_gpu_nxp_pxp_osa.c
+++ b/src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.c
@@ -6,7 +6,7 @@
/**
* MIT License
*
- * Copyright (c) 2020 NXP
+ * Copyright 2020, 2022 NXP
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -32,11 +32,9 @@
*********************/
#include "lv_gpu_nxp_pxp_osa.h"
-#if LV_USE_GPU_NXP_PXP && LV_USE_GPU_NXP_PXP_AUTO_INIT
-#include "../misc/lv_log.h"
-
-#include "lv_gpu_nxp_pxp.h"
+#if LV_USE_GPU_NXP_PXP && LV_USE_GPU_NXP_PXP_AUTO_INIT
+#include "../../../misc/lv_log.h"
#include "fsl_pxp.h"
#if defined(SDK_OS_FREE_RTOS)
@@ -55,8 +53,20 @@
/**********************
* STATIC PROTOTYPES
**********************/
+
+/**
+ * PXP interrupt initialization.
+ */
static lv_res_t _lv_gpu_nxp_pxp_interrupt_init(void);
+
+/**
+ * PXP interrupt de-initialization.
+ */
static void _lv_gpu_nxp_pxp_interrupt_deinit(void);
+
+/**
+ * Start the PXP job and wait for task completion.
+ */
static void _lv_gpu_nxp_pxp_run(void);
/**********************
@@ -69,6 +79,12 @@ static void _lv_gpu_nxp_pxp_run(void);
static volatile bool s_pxpIdle;
#endif
+static lv_nxp_pxp_cfg_t pxp_default_cfg = {
+ .pxp_interrupt_init = _lv_gpu_nxp_pxp_interrupt_init,
+ .pxp_interrupt_deinit = _lv_gpu_nxp_pxp_interrupt_deinit,
+ .pxp_run = _lv_gpu_nxp_pxp_run
+};
+
/**********************
* MACROS
**********************/
@@ -77,9 +93,6 @@ static void _lv_gpu_nxp_pxp_run(void);
* GLOBAL FUNCTIONS
**********************/
-/**
- * PXP device interrupt handler. Used to check PXP task completion status.
- */
void PXP_IRQHandler(void)
{
#if defined(SDK_OS_FREE_RTOS)
@@ -94,24 +107,24 @@ void PXP_IRQHandler(void)
#else
s_pxpIdle = true;
#endif
-
}
}
+lv_nxp_pxp_cfg_t * lv_gpu_nxp_pxp_get_cfg(void)
+{
+ return &pxp_default_cfg;
+}
+
/**********************
* STATIC FUNCTIONS
**********************/
-/**
- * PXP interrupt initialization.
- */
static lv_res_t _lv_gpu_nxp_pxp_interrupt_init(void)
{
#if defined(SDK_OS_FREE_RTOS)
s_pxpIdle = xSemaphoreCreateBinary();
- if(s_pxpIdle == NULL) {
+ if(s_pxpIdle == NULL)
return LV_RES_INV;
- }
NVIC_SetPriority(LV_GPU_NXP_PXP_IRQ_ID, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY + 1);
#else
@@ -123,9 +136,6 @@ static lv_res_t _lv_gpu_nxp_pxp_interrupt_init(void)
return LV_RES_OK;
}
-/**
- * PXP interrupt de-initialization.
- */
static void _lv_gpu_nxp_pxp_interrupt_deinit(void)
{
NVIC_DisableIRQ(LV_GPU_NXP_PXP_IRQ_ID);
@@ -134,9 +144,6 @@ static void _lv_gpu_nxp_pxp_interrupt_deinit(void)
#endif
}
-/**
- * Function to start PXP job. This function must wait for task complete.
- */
static void _lv_gpu_nxp_pxp_run(void)
{
#if !defined(SDK_OS_FREE_RTOS)
@@ -147,20 +154,11 @@ static void _lv_gpu_nxp_pxp_run(void)
PXP_Start(LV_GPU_NXP_PXP_ID);
#if defined(SDK_OS_FREE_RTOS)
- if(xSemaphoreTake(s_pxpIdle, portMAX_DELAY) != pdTRUE) {
- LV_LOG_ERROR("xSemaphoreTake error. Task halted.");
- for(; ;) ;
- }
+ PXP_COND_STOP(!xSemaphoreTake(s_pxpIdle, portMAX_DELAY), "xSemaphoreTake failed.");
#else
while(s_pxpIdle == false) {
}
#endif
}
-lv_nxp_pxp_cfg_t pxp_default_cfg = {
- .pxp_interrupt_init = _lv_gpu_nxp_pxp_interrupt_init,
- .pxp_interrupt_deinit = _lv_gpu_nxp_pxp_interrupt_deinit,
- .pxp_run = _lv_gpu_nxp_pxp_run
-};
-
#endif /*LV_USE_GPU_NXP_PXP && LV_USE_GPU_NXP_PXP_AUTO_INIT*/
diff --git a/src/draw/nxp_pxp/lv_gpu_nxp_pxp_osa.h b/src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.h
similarity index 62%
rename from src/draw/nxp_pxp/lv_gpu_nxp_pxp_osa.h
rename to src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.h
index 89524dae5..5c87824ab 100644
--- a/src/draw/nxp_pxp/lv_gpu_nxp_pxp_osa.h
+++ b/src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.h
@@ -6,7 +6,7 @@
/**
* MIT License
*
- * Copyright (c) 2020 NXP
+ * Copyright 2020, 2022 NXP
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -27,21 +27,52 @@
*
*/
-#ifndef LV_SRC_LV_GPU_LV_GPU_NXP_PXP_OSA_H_
-#define LV_SRC_LV_GPU_LV_GPU_NXP_PXP_OSA_H_
+#ifndef LV_GPU_NXP_PXP_OSA_H
+#define LV_GPU_NXP_PXP_OSA_H
#ifdef __cplusplus
extern "C" {
#endif
-#include "../../lv_conf_internal.h"
+/*********************
+ * INCLUDES
+ *********************/
+
+#include "../../../lv_conf_internal.h"
#if LV_USE_GPU_NXP_PXP && LV_USE_GPU_NXP_PXP_AUTO_INIT
-extern lv_nxp_pxp_cfg_t pxp_default_cfg;
-#endif
+#include "lv_gpu_nxp_pxp.h"
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+/**
+ * PXP device interrupt handler. Used to check PXP task completion status.
+ */
+void PXP_IRQHandler(void);
+
+/**
+ * Helper function to get the PXP default configuration.
+ */
+lv_nxp_pxp_cfg_t * lv_gpu_nxp_pxp_get_cfg(void);
+
+/**********************
+ * MACROS
+ **********************/
+
+#endif /*LV_USE_GPU_NXP_PXP && LV_USE_GPU_NXP_PXP_AUTO_INIT*/
#ifdef __cplusplus
} /*extern "C"*/
#endif
-#endif /*LV_SRC_LV_GPU_LV_GPU_NXP_PXP_OSA_H_*/
+#endif /*LV_GPU_NXP_PXP_OSA_H*/
diff --git a/src/draw/nxp/vglite/lv_draw_nxp_vglite.mk b/src/draw/nxp/vglite/lv_draw_nxp_vglite.mk
new file mode 100644
index 000000000..c84e2e47a
--- /dev/null
+++ b/src/draw/nxp/vglite/lv_draw_nxp_vglite.mk
@@ -0,0 +1,9 @@
+CSRCS += lv_draw_vglite_arc.c
+CSRCS += lv_draw_vglite_blend.c
+CSRCS += lv_draw_vglite_rect.c
+CSRCS += lv_gpu_nxp_vglite.c
+
+DEPPATH += --dep-path $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nxp/vglite
+VPATH += :$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nxp/vglite
+
+CFLAGS += "-I$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nxp/vglite"
diff --git a/src/draw/nxp/vglite/lv_draw_vglite_arc.c b/src/draw/nxp/vglite/lv_draw_vglite_arc.c
new file mode 100644
index 000000000..194f03d88
--- /dev/null
+++ b/src/draw/nxp/vglite/lv_draw_vglite_arc.c
@@ -0,0 +1,699 @@
+/**
+ * @file lv_draw_vglite_arc.c
+ *
+ */
+
+/**
+ * MIT License
+ *
+ * Copyright 2021, 2022 NXP
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next paragraph)
+ * shall be included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+ * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
+ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+/*********************
+ * INCLUDES
+ *********************/
+
+#include "lv_draw_vglite_arc.h"
+
+#if LV_USE_GPU_NXP_VG_LITE
+#include "math.h"
+
+/*********************
+ * DEFINES
+ *********************/
+
+#define T_FRACTION 16384.0f
+
+#define DICHOTO_ITER 5
+
+static const uint16_t TperDegree[90] = {
+ 0, 174, 348, 522, 697, 873, 1049, 1226, 1403, 1581,
+ 1759, 1938, 2117, 2297, 2477, 2658, 2839, 3020, 3202, 3384,
+ 3567, 3749, 3933, 4116, 4300, 4484, 4668, 4852, 5037, 5222,
+ 5407, 5592, 5777, 5962, 6148, 6334, 6519, 6705, 6891, 7077,
+ 7264, 7450, 7636, 7822, 8008, 8193, 8378, 8564, 8750, 8936,
+ 9122, 9309, 9495, 9681, 9867, 10052, 10238, 10424, 10609, 10794,
+ 10979, 11164, 11349, 11534, 11718, 11902, 12086, 12270, 12453, 12637,
+ 12819, 13002, 13184, 13366, 13547, 13728, 13909, 14089, 14269, 14448,
+ 14627, 14805, 14983, 15160, 15337, 15513, 15689, 15864, 16038, 16212
+};
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/* intermediate arc params */
+typedef struct _vg_arc {
+ int32_t angle; /* angle <90deg */
+ int32_t quarter; /* 0-3 counter-clockwise */
+ int32_t rad; /* radius */
+ int32_t p0x; /* point P0 */
+ int32_t p0y;
+ int32_t p1x; /* point P1 */
+ int32_t p1y;
+ int32_t p2x; /* point P2 */
+ int32_t p2y;
+ int32_t p3x; /* point P3 */
+ int32_t p3y;
+} vg_arc;
+
+typedef struct _cubic_cont_pt {
+ float p0;
+ float p1;
+ float p2;
+ float p3;
+} cubic_cont_pt;
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+
+static void rotate_point(int32_t angle, int32_t * x, int32_t * y);
+static void add_arc_path(int32_t * arc_path, int * pidx, int32_t radius,
+ int32_t start_angle, int32_t end_angle, lv_point_t center, bool cw);
+
+/**********************
+ * STATIC VARIABLES
+ **********************/
+
+/**********************
+ * MACROS
+ **********************/
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+
+lv_res_t lv_gpu_nxp_vglite_draw_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_dsc_t * dsc, const lv_point_t * center,
+ int32_t radius, int32_t start_angle, int32_t end_angle)
+{
+
+ vg_lite_buffer_t vgbuf;
+ vg_lite_error_t err = VG_LITE_SUCCESS;
+ lv_color32_t col32 = {.full = lv_color_to32(dsc->color)}; /*Convert color to RGBA8888*/
+ lv_coord_t dest_width = lv_area_get_width(draw_ctx->buf_area);
+ lv_coord_t dest_height = lv_area_get_height(draw_ctx->buf_area);
+ vg_lite_path_t path;
+ vg_lite_color_t vgcol; /* vglite takes ABGR */
+ vg_lite_matrix_t matrix;
+ lv_opa_t opa = dsc->opa;
+ bool donut = ((end_angle - start_angle) % 360 == 0) ? true : false;
+ lv_point_t clip_center = {center->x - draw_ctx->buf_area->x1, center->y - draw_ctx->buf_area->y1};
+
+ /* path: max size = 16 cubic bezier (7 words each) */
+ int32_t arc_path[16 * 7];
+ lv_memset_00(arc_path, sizeof(arc_path));
+
+ /*** Init destination buffer ***/
+ if(lv_vglite_init_buf(&vgbuf, (uint32_t)dest_width, (uint32_t)dest_height, (uint32_t)dest_width * sizeof(lv_color_t),
+ (const lv_color_t *)draw_ctx->buf, false) != LV_RES_OK)
+ VG_LITE_RETURN_INV("Init buffer failed.");
+
+ /*** Init path ***/
+ lv_coord_t width = dsc->width; /* inner arc radius = outer arc radius - width */
+ if(width > (lv_coord_t)radius)
+ width = radius;
+
+ int pidx = 0;
+ int32_t cp_x, cp_y; /* control point coords */
+
+ /* first control point of curve */
+ cp_x = radius;
+ cp_y = 0;
+ rotate_point(start_angle, &cp_x, &cp_y);
+ arc_path[pidx++] = VLC_OP_MOVE;
+ arc_path[pidx++] = clip_center.x + cp_x;
+ arc_path[pidx++] = clip_center.y + cp_y;
+
+ /* draw 1-5 outer quarters */
+ add_arc_path(arc_path, &pidx, radius, start_angle, end_angle, clip_center, true);
+
+ if(donut) {
+ /* close outer circle */
+ cp_x = radius;
+ cp_y = 0;
+ rotate_point(start_angle, &cp_x, &cp_y);
+ arc_path[pidx++] = VLC_OP_LINE;
+ arc_path[pidx++] = clip_center.x + cp_x;
+ arc_path[pidx++] = clip_center.y + cp_y;
+ /* start inner circle */
+ cp_x = radius - width;
+ cp_y = 0;
+ rotate_point(start_angle, &cp_x, &cp_y);
+ arc_path[pidx++] = VLC_OP_MOVE;
+ arc_path[pidx++] = clip_center.x + cp_x;
+ arc_path[pidx++] = clip_center.y + cp_y;
+
+ }
+ else if(dsc->rounded != 0U) { /* 1st rounded arc ending */
+ cp_x = radius - width / 2;
+ cp_y = 0;
+ rotate_point(end_angle, &cp_x, &cp_y);
+ lv_point_t round_center = {clip_center.x + cp_x, clip_center.y + cp_y};
+ add_arc_path(arc_path, &pidx, width / 2, end_angle, (end_angle + 180),
+ round_center, true);
+
+ }
+ else { /* 1st flat ending */
+ cp_x = radius - width;
+ cp_y = 0;
+ rotate_point(end_angle, &cp_x, &cp_y);
+ arc_path[pidx++] = VLC_OP_LINE;
+ arc_path[pidx++] = clip_center.x + cp_x;
+ arc_path[pidx++] = clip_center.y + cp_y;
+ }
+
+ /* draw 1-5 inner quarters */
+ add_arc_path(arc_path, &pidx, radius - width, start_angle, end_angle, clip_center, false);
+
+ /* last control point of curve */
+ if(donut) { /* close the loop */
+ cp_x = radius - width;
+ cp_y = 0;
+ rotate_point(start_angle, &cp_x, &cp_y);
+ arc_path[pidx++] = VLC_OP_LINE;
+ arc_path[pidx++] = clip_center.x + cp_x;
+ arc_path[pidx++] = clip_center.y + cp_y;
+
+ }
+ else if(dsc->rounded != 0U) { /* 2nd rounded arc ending */
+ cp_x = radius - width / 2;
+ cp_y = 0;
+ rotate_point(start_angle, &cp_x, &cp_y);
+ lv_point_t round_center = {clip_center.x + cp_x, clip_center.y + cp_y};
+ add_arc_path(arc_path, &pidx, width / 2, (start_angle + 180), (start_angle + 360),
+ round_center, true);
+
+ }
+ else { /* 2nd flat ending */
+ cp_x = radius;
+ cp_y = 0;
+ rotate_point(start_angle, &cp_x, &cp_y);
+ arc_path[pidx++] = VLC_OP_LINE;
+ arc_path[pidx++] = clip_center.x + cp_x;
+ arc_path[pidx++] = clip_center.y + cp_y;
+ }
+
+ arc_path[pidx++] = VLC_OP_END;
+
+ err = vg_lite_init_path(&path, VG_LITE_S32, VG_LITE_HIGH, (uint32_t)pidx * sizeof(int32_t), arc_path,
+ (vg_lite_float_t) draw_ctx->clip_area->x1, (vg_lite_float_t) draw_ctx->clip_area->y1,
+ ((vg_lite_float_t) draw_ctx->clip_area->x2) + 1.0f, ((vg_lite_float_t) draw_ctx->clip_area->y2) + 1.0f);
+ VG_LITE_ERR_RETURN_INV(err, "Init path failed.");
+
+ /* set rotation angle */
+ vg_lite_identity(&matrix);
+
+ if(opa <= (lv_opa_t)LV_OPA_MAX) {
+ /* Only pre-multiply color if hardware pre-multiplication is not present */
+ if(!vg_lite_query_feature(gcFEATURE_BIT_VG_PE_PREMULTIPLY)) {
+ col32.ch.red = (uint8_t)(((uint16_t)col32.ch.red * opa) >> 8);
+ col32.ch.green = (uint8_t)(((uint16_t)col32.ch.green * opa) >> 8);
+ col32.ch.blue = (uint8_t)(((uint16_t)col32.ch.blue * opa) >> 8);
+ }
+ col32.ch.alpha = opa;
+ }
+
+#if LV_COLOR_DEPTH==16
+ vgcol = col32.full;
+#else /*LV_COLOR_DEPTH==32*/
+ vgcol = ((uint32_t)col32.ch.alpha << 24) | ((uint32_t)col32.ch.blue << 16) | ((uint32_t)col32.ch.green << 8) |
+ (uint32_t)col32.ch.red;
+#endif
+
+ /*Clean & invalidate cache*/
+ lv_vglite_invalidate_cache();
+
+ /*** Draw arc ***/
+ err = vg_lite_draw(&vgbuf, &path, VG_LITE_FILL_NON_ZERO, &matrix, VG_LITE_BLEND_SRC_OVER, vgcol);
+ VG_LITE_ERR_RETURN_INV(err, "Draw arc failed.");
+
+ err = vg_lite_finish();
+ VG_LITE_ERR_RETURN_INV(err, "Finish failed.");
+
+ err = vg_lite_clear_path(&path);
+ VG_LITE_ERR_RETURN_INV(err, "Clear path failed.");
+
+ return LV_RES_OK;
+}
+
+/**********************
+ * STATIC FUNCTIONS
+ **********************/
+
+static void copy_arc(vg_arc * dst, vg_arc * src)
+{
+ dst->quarter = src->quarter;
+ dst->rad = src->rad;
+ dst->angle = src->angle;
+ dst->p0x = src->p0x;
+ dst->p1x = src->p1x;
+ dst->p2x = src->p2x;
+ dst->p3x = src->p3x;
+ dst->p0y = src->p0y;
+ dst->p1y = src->p1y;
+ dst->p2y = src->p2y;
+ dst->p3y = src->p3y;
+}
+
+/**
+ * Rotate the point according given rotation angle rotation center is 0,0
+ */
+static void rotate_point(int32_t angle, int32_t * x, int32_t * y)
+{
+ int32_t ori_x = *x;
+ int32_t ori_y = *y;
+ int16_t alpha = (int16_t)angle;
+ *x = ((lv_trigo_cos(alpha) * ori_x) / LV_TRIGO_SIN_MAX) - ((lv_trigo_sin(alpha) * ori_y) / LV_TRIGO_SIN_MAX);
+ *y = ((lv_trigo_sin(alpha) * ori_x) / LV_TRIGO_SIN_MAX) + ((lv_trigo_cos(alpha) * ori_y) / LV_TRIGO_SIN_MAX);
+}
+
+/**
+ * Set full arc control points depending on quarter.
+ * Control points match the best approximation of a circle.
+ * Arc Quarter position is:
+ * Q2 | Q3
+ * ---+---
+ * Q1 | Q0
+ */
+static void set_full_arc(vg_arc * fullarc)
+{
+ /* the tangent lenght for the bezier circle approx */
+ float tang = ((float)fullarc->rad) * BEZIER_OPTIM_CIRCLE;
+ switch(fullarc->quarter) {
+ case 0:
+ /* first quarter */
+ fullarc->p0x = fullarc->rad;
+ fullarc->p0y = 0;
+ fullarc->p1x = fullarc->rad;
+ fullarc->p1y = (int32_t)tang;
+ fullarc->p2x = (int32_t)tang;
+ fullarc->p2y = fullarc->rad;
+ fullarc->p3x = 0;
+ fullarc->p3y = fullarc->rad;
+ break;
+ case 1:
+ /* second quarter */
+ fullarc->p0x = 0;
+ fullarc->p0y = fullarc->rad;
+ fullarc->p1x = 0 - (int32_t)tang;
+ fullarc->p1y = fullarc->rad;
+ fullarc->p2x = 0 - fullarc->rad;
+ fullarc->p2y = (int32_t)tang;
+ fullarc->p3x = 0 - fullarc->rad;
+ fullarc->p3y = 0;
+ break;
+ case 2:
+ /* third quarter */
+ fullarc->p0x = 0 - fullarc->rad;
+ fullarc->p0y = 0;
+ fullarc->p1x = 0 - fullarc->rad;
+ fullarc->p1y = 0 - (int32_t)tang;
+ fullarc->p2x = 0 - (int32_t)tang;
+ fullarc->p2y = 0 - fullarc->rad;
+ fullarc->p3x = 0;
+ fullarc->p3y = 0 - fullarc->rad;
+ break;
+ case 3:
+ /* fourth quarter */
+ fullarc->p0x = 0;
+ fullarc->p0y = 0 - fullarc->rad;
+ fullarc->p1x = (int32_t)tang;
+ fullarc->p1y = 0 - fullarc->rad;
+ fullarc->p2x = fullarc->rad;
+ fullarc->p2y = 0 - (int32_t)tang;
+ fullarc->p3x = fullarc->rad;
+ fullarc->p3y = 0;
+ break;
+ default:
+ LV_LOG_ERROR("Invalid arc quarter value.");
+ break;
+ }
+}
+
+/**
+ * Linear interpolation between two points 'a' and 'b'
+ * 't' parameter is the proportion ratio expressed in range [0 ; T_FRACTION ]
+ */
+static inline float lerp(float coord_a, float coord_b, uint16_t t)
+{
+ float tf = (float)t;
+ return ((T_FRACTION - tf) * coord_a + tf * coord_b) / T_FRACTION;
+}
+
+/**
+ * Computes a point of bezier curve given 't' param
+ */
+static inline float comp_bezier_point(float t, cubic_cont_pt cp)
+{
+ float t_sq = t * t;
+ float inv_t_sq = (1.0f - t) * (1.0f - t);
+ float apt = (1.0f - t) * inv_t_sq * cp.p0 + 3.0f * inv_t_sq * t * cp.p1 + 3.0f * (1.0f - t) * t_sq * cp.p2 + t * t_sq *
+ cp.p3;
+ return apt;
+}
+
+/**
+ * Find parameter 't' in curve at point 'pt'
+ * proceed by dichotomy on only 1 dimension,
+ * works only if the curve is monotonic
+ * bezier curve is defined by control points [p0 p1 p2 p3]
+ * 'dec' tells if curve is decreasing (true) or increasing (false)
+ */
+static uint16_t get_bez_t_from_pos(float pt, cubic_cont_pt cp, bool dec)
+{
+ /* initialize dichotomy with boundary 't' values */
+ float t_low = 0.0f;
+ float t_mid = 0.5f;
+ float t_hig = 1.0f;
+ float a_pt;
+ /* dichotomy loop */
+ for(int i = 0; i < DICHOTO_ITER; i++) {
+ a_pt = comp_bezier_point(t_mid, cp);
+ /* check mid-point position on bezier curve versus targeted point */
+ if((a_pt > pt) != dec) {
+ t_hig = t_mid;
+ }
+ else {
+ t_low = t_mid;
+ }
+ /* define new 't' param for mid-point */
+ t_mid = (t_low + t_hig) / 2.0f;
+ }
+ /* return parameter 't' in integer range [0 ; T_FRACTION] */
+ return (uint16_t)floorf(t_mid * T_FRACTION + 0.5f);
+}
+
+/**
+ * Gives relative coords of the control points
+ * for the sub-arc starting at angle with given angle span
+ */
+static void get_subarc_control_points(vg_arc * arc, int32_t span)
+{
+ vg_arc fullarc;
+ fullarc.angle = arc->angle;
+ fullarc.quarter = arc->quarter;
+ fullarc.rad = arc->rad;
+ set_full_arc(&fullarc);
+
+ /* special case of full arc */
+ if(arc->angle == 90) {
+ copy_arc(arc, &fullarc);
+ return;
+ }
+
+ /* compute 1st arc using the geometric construction of curve */
+ uint16_t t2 = TperDegree[arc->angle + span];
+
+ /* lerp for A */
+ float a2x = lerp((float)fullarc.p0x, (float)fullarc.p1x, t2);
+ float a2y = lerp((float)fullarc.p0y, (float)fullarc.p1y, t2);
+ /* lerp for B */
+ float b2x = lerp((float)fullarc.p1x, (float)fullarc.p2x, t2);
+ float b2y = lerp((float)fullarc.p1y, (float)fullarc.p2y, t2);
+ /* lerp for C */
+ float c2x = lerp((float)fullarc.p2x, (float)fullarc.p3x, t2);
+ float c2y = lerp((float)fullarc.p2y, (float)fullarc.p3y, t2);
+
+ /* lerp for D */
+ float d2x = lerp(a2x, b2x, t2);
+ float d2y = lerp(a2y, b2y, t2);
+ /* lerp for E */
+ float e2x = lerp(b2x, c2x, t2);
+ float e2y = lerp(b2y, c2y, t2);
+
+ float pt2x = lerp(d2x, e2x, t2);
+ float pt2y = lerp(d2y, e2y, t2);
+
+ /* compute sub-arc using the geometric construction of curve */
+ uint16_t t1 = TperDegree[arc->angle];
+
+ /* lerp for A */
+ float a1x = lerp((float)fullarc.p0x, (float)fullarc.p1x, t1);
+ float a1y = lerp((float)fullarc.p0y, (float)fullarc.p1y, t1);
+ /* lerp for B */
+ float b1x = lerp((float)fullarc.p1x, (float)fullarc.p2x, t1);
+ float b1y = lerp((float)fullarc.p1y, (float)fullarc.p2y, t1);
+ /* lerp for C */
+ float c1x = lerp((float)fullarc.p2x, (float)fullarc.p3x, t1);
+ float c1y = lerp((float)fullarc.p2y, (float)fullarc.p3y, t1);
+
+ /* lerp for D */
+ float d1x = lerp(a1x, b1x, t1);
+ float d1y = lerp(a1y, b1y, t1);
+ /* lerp for E */
+ float e1x = lerp(b1x, c1x, t1);
+ float e1y = lerp(b1y, c1y, t1);
+
+ float pt1x = lerp(d1x, e1x, t1);
+ float pt1y = lerp(d1y, e1y, t1);
+
+ /* find the 't3' parameter for point P(t1) on the sub-arc [P0 A2 D2 P(t2)] using dichotomy
+ * use position of x axis only */
+ uint16_t t3;
+ t3 = get_bez_t_from_pos(pt1x,
+ (cubic_cont_pt) {
+ .p0 = ((float)fullarc.p0x), .p1 = a2x, .p2 = d2x, .p3 = pt2x
+ },
+ (bool)(pt2x < (float)fullarc.p0x));
+
+ /* lerp for B */
+ float b3x = lerp(a2x, d2x, t3);
+ float b3y = lerp(a2y, d2y, t3);
+ /* lerp for C */
+ float c3x = lerp(d2x, pt2x, t3);
+ float c3y = lerp(d2y, pt2y, t3);
+
+ /* lerp for E */
+ float e3x = lerp(b3x, c3x, t3);
+ float e3y = lerp(b3y, c3y, t3);
+
+ arc->p0x = (int32_t)floorf(0.5f + pt1x);
+ arc->p0y = (int32_t)floorf(0.5f + pt1y);
+ arc->p1x = (int32_t)floorf(0.5f + e3x);
+ arc->p1y = (int32_t)floorf(0.5f + e3y);
+ arc->p2x = (int32_t)floorf(0.5f + c3x);
+ arc->p2y = (int32_t)floorf(0.5f + c3y);
+ arc->p3x = (int32_t)floorf(0.5f + pt2x);
+ arc->p3y = (int32_t)floorf(0.5f + pt2y);
+}
+
+/**
+ * Gives relative coords of the control points
+ */
+static void get_arc_control_points(vg_arc * arc, bool start)
+{
+ vg_arc fullarc;
+ fullarc.angle = arc->angle;
+ fullarc.quarter = arc->quarter;
+ fullarc.rad = arc->rad;
+ set_full_arc(&fullarc);
+
+ /* special case of full arc */
+ if(arc->angle == 90) {
+ copy_arc(arc, &fullarc);
+ return;
+ }
+
+ /* compute sub-arc using the geometric construction of curve */
+ uint16_t t = TperDegree[arc->angle];
+ /* lerp for A */
+ float ax = lerp((float)fullarc.p0x, (float)fullarc.p1x, t);
+ float ay = lerp((float)fullarc.p0y, (float)fullarc.p1y, t);
+ /* lerp for B */
+ float bx = lerp((float)fullarc.p1x, (float)fullarc.p2x, t);
+ float by = lerp((float)fullarc.p1y, (float)fullarc.p2y, t);
+ /* lerp for C */
+ float cx = lerp((float)fullarc.p2x, (float)fullarc.p3x, t);
+ float cy = lerp((float)fullarc.p2y, (float)fullarc.p3y, t);
+
+ /* lerp for D */
+ float dx = lerp(ax, bx, t);
+ float dy = lerp(ay, by, t);
+ /* lerp for E */
+ float ex = lerp(bx, cx, t);
+ float ey = lerp(by, cy, t);
+
+ /* sub-arc's control points are tangents of DeCasteljau's algorithm */
+ if(start) {
+ arc->p0x = (int32_t)floorf(0.5f + lerp(dx, ex, t));
+ arc->p0y = (int32_t)floorf(0.5f + lerp(dy, ey, t));
+ arc->p1x = (int32_t)floorf(0.5f + ex);
+ arc->p1y = (int32_t)floorf(0.5f + ey);
+ arc->p2x = (int32_t)floorf(0.5f + cx);
+ arc->p2y = (int32_t)floorf(0.5f + cy);
+ arc->p3x = fullarc.p3x;
+ arc->p3y = fullarc.p3y;
+ }
+ else {
+ arc->p0x = fullarc.p0x;
+ arc->p0y = fullarc.p0y;
+ arc->p1x = (int32_t)floorf(0.5f + ax);
+ arc->p1y = (int32_t)floorf(0.5f + ay);
+ arc->p2x = (int32_t)floorf(0.5f + dx);
+ arc->p2y = (int32_t)floorf(0.5f + dy);
+ arc->p3x = (int32_t)floorf(0.5f + lerp(dx, ex, t));
+ arc->p3y = (int32_t)floorf(0.5f + lerp(dy, ey, t));
+ }
+}
+
+/**
+ * Add the arc control points into the path data for vglite,
+ * taking into account the real center of the arc (translation).
+ * arc_path: (in/out) the path data array for vglite
+ * pidx: (in/out) index of last element added in arc_path
+ * q_arc: (in) the arc data containing control points
+ * center: (in) the center of the circle in draw coordinates
+ * cw: (in) true if arc is clockwise
+ */
+static void add_split_arc_path(int32_t * arc_path, int * pidx, vg_arc * q_arc, lv_point_t center, bool cw)
+{
+ /* assumes first control point already in array arc_path[] */
+ int idx = *pidx;
+ if(cw) {
+#if BEZIER_DBG_CONTROL_POINTS
+ arc_path[idx++] = VLC_OP_LINE;
+ arc_path[idx++] = q_arc->p1x + center.x;
+ arc_path[idx++] = q_arc->p1y + center.y;
+ arc_path[idx++] = VLC_OP_LINE;
+ arc_path[idx++] = q_arc->p2x + center.x;
+ arc_path[idx++] = q_arc->p2y + center.y;
+ arc_path[idx++] = VLC_OP_LINE;
+ arc_path[idx++] = q_arc->p3x + center.x;
+ arc_path[idx++] = q_arc->p3y + center.y;
+#else
+ arc_path[idx++] = VLC_OP_CUBIC;
+ arc_path[idx++] = q_arc->p1x + center.x;
+ arc_path[idx++] = q_arc->p1y + center.y;
+ arc_path[idx++] = q_arc->p2x + center.x;
+ arc_path[idx++] = q_arc->p2y + center.y;
+ arc_path[idx++] = q_arc->p3x + center.x;
+ arc_path[idx++] = q_arc->p3y + center.y;
+#endif
+ }
+ else { /* reverse points order when counter-clockwise */
+#if BEZIER_DBG_CONTROL_POINTS
+ arc_path[idx++] = VLC_OP_LINE;
+ arc_path[idx++] = q_arc->p2x + center.x;
+ arc_path[idx++] = q_arc->p2y + center.y;
+ arc_path[idx++] = VLC_OP_LINE;
+ arc_path[idx++] = q_arc->p1x + center.x;
+ arc_path[idx++] = q_arc->p1y + center.y;
+ arc_path[idx++] = VLC_OP_LINE;
+ arc_path[idx++] = q_arc->p0x + center.x;
+ arc_path[idx++] = q_arc->p0y + center.y;
+#else
+ arc_path[idx++] = VLC_OP_CUBIC;
+ arc_path[idx++] = q_arc->p2x + center.x;
+ arc_path[idx++] = q_arc->p2y + center.y;
+ arc_path[idx++] = q_arc->p1x + center.x;
+ arc_path[idx++] = q_arc->p1y + center.y;
+ arc_path[idx++] = q_arc->p0x + center.x;
+ arc_path[idx++] = q_arc->p0y + center.y;
+#endif
+ }
+ /* update index i n path array*/
+ *pidx = idx;
+}
+
+static void add_arc_path(int32_t * arc_path, int * pidx, int32_t radius,
+ int32_t start_angle, int32_t end_angle, lv_point_t center, bool cw)
+{
+ /* set number of arcs to draw */
+ vg_arc q_arc;
+ int32_t start_arc_angle = start_angle % 90;
+ int32_t end_arc_angle = end_angle % 90;
+ int32_t inv_start_arc_angle = (start_arc_angle > 0) ? (90 - start_arc_angle) : 0;
+ int32_t nbarc = (end_angle - start_angle - inv_start_arc_angle - end_arc_angle) / 90;
+ q_arc.rad = radius;
+
+ /* handle special case of start & end point in the same quarter */
+ if(((start_angle / 90) == (end_angle / 90)) && (nbarc <= 0)) {
+ q_arc.quarter = (start_angle / 90) % 4;
+ q_arc.angle = start_arc_angle;
+ get_subarc_control_points(&q_arc, end_arc_angle - start_arc_angle);
+ add_split_arc_path(arc_path, pidx, &q_arc, center, cw);
+ return;
+ }
+
+ if(cw) {
+ /* partial starting arc */
+ if(start_arc_angle > 0) {
+ q_arc.quarter = (start_angle / 90) % 4;
+ q_arc.angle = start_arc_angle;
+ /* get cubic points relative to center */
+ get_arc_control_points(&q_arc, true);
+ /* put cubic points in arc_path */
+ add_split_arc_path(arc_path, pidx, &q_arc, center, cw);
+ }
+ /* full arcs */
+ for(int32_t q = 0; q < nbarc ; q++) {
+ q_arc.quarter = (q + ((start_angle + 89) / 90)) % 4;
+ q_arc.angle = 90;
+ /* get cubic points relative to center */
+ get_arc_control_points(&q_arc, true); /* 2nd parameter 'start' ignored */
+ /* put cubic points in arc_path */
+ add_split_arc_path(arc_path, pidx, &q_arc, center, cw);
+ }
+ /* partial ending arc */
+ if(end_arc_angle > 0) {
+ q_arc.quarter = (end_angle / 90) % 4;
+ q_arc.angle = end_arc_angle;
+ /* get cubic points relative to center */
+ get_arc_control_points(&q_arc, false);
+ /* put cubic points in arc_path */
+ add_split_arc_path(arc_path, pidx, &q_arc, center, cw);
+ }
+
+ }
+ else { /* counter clockwise */
+
+ /* partial ending arc */
+ if(end_arc_angle > 0) {
+ q_arc.quarter = (end_angle / 90) % 4;
+ q_arc.angle = end_arc_angle;
+ /* get cubic points relative to center */
+ get_arc_control_points(&q_arc, false);
+ /* put cubic points in arc_path */
+ add_split_arc_path(arc_path, pidx, &q_arc, center, cw);
+ }
+ /* full arcs */
+ for(int32_t q = nbarc - 1; q >= 0; q--) {
+ q_arc.quarter = (q + ((start_angle + 89) / 90)) % 4;
+ q_arc.angle = 90;
+ /* get cubic points relative to center */
+ get_arc_control_points(&q_arc, true); /* 2nd parameter 'start' ignored */
+ /* put cubic points in arc_path */
+ add_split_arc_path(arc_path, pidx, &q_arc, center, cw);
+ }
+ /* partial starting arc */
+ if(start_arc_angle > 0) {
+ q_arc.quarter = (start_angle / 90) % 4;
+ q_arc.angle = start_arc_angle;
+ /* get cubic points relative to center */
+ get_arc_control_points(&q_arc, true);
+ /* put cubic points in arc_path */
+ add_split_arc_path(arc_path, pidx, &q_arc, center, cw);
+ }
+ }
+}
+
+#endif /*LV_USE_GPU_NXP_VG_LITE*/
diff --git a/src/draw/nxp/vglite/lv_draw_vglite_arc.h b/src/draw/nxp/vglite/lv_draw_vglite_arc.h
new file mode 100644
index 000000000..98ba8a3d0
--- /dev/null
+++ b/src/draw/nxp/vglite/lv_draw_vglite_arc.h
@@ -0,0 +1,79 @@
+/**
+ * @file lv_draw_vglite_arc.h
+ *
+ */
+
+/**
+ * MIT License
+ *
+ * Copyright 2021, 2022 NXP
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next paragraph)
+ * shall be included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+ * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
+ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#ifndef LV_DRAW_VGLITE_ARC_H
+#define LV_DRAW_VGLITE_ARC_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ * INCLUDES
+ *********************/
+#include "../../../lv_conf_internal.h"
+
+#if LV_USE_GPU_NXP_VG_LITE
+#include "lv_gpu_nxp_vglite.h"
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+/***
+ * Draw arc shape with effects
+ * @param draw_ctx drawing context
+ * @param dsc the arc description structure (width, rounded ending, opacity)
+ * @param center the coordinates of the arc center
+ * @param radius the radius of external arc
+ * @param start_angle the starting angle in degrees
+ * @param end_angle the ending angle in degrees
+ */
+lv_res_t lv_gpu_nxp_vglite_draw_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_dsc_t * dsc, const lv_point_t * center,
+ int32_t radius, int32_t start_angle, int32_t end_angle);
+
+/**********************
+ * MACROS
+ **********************/
+
+#endif /*LV_USE_GPU_NXP_VG_LITE*/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /*LV_DRAW_VGLITE_ARC_H*/
diff --git a/src/draw/nxp/vglite/lv_draw_vglite_blend.c b/src/draw/nxp/vglite/lv_draw_vglite_blend.c
new file mode 100644
index 000000000..b59b143b3
--- /dev/null
+++ b/src/draw/nxp/vglite/lv_draw_vglite_blend.c
@@ -0,0 +1,618 @@
+/**
+ * @file lv_draw_vglite_blend.c
+ *
+ */
+
+/**
+ * MIT License
+ *
+ * Copyright 2020-2022 NXP
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next paragraph)
+ * shall be included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+ * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
+ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+/*********************
+ * INCLUDES
+ *********************/
+
+#include "lv_draw_vglite_blend.h"
+
+#if LV_USE_GPU_NXP_VG_LITE
+
+/*********************
+ * DEFINES
+ *********************/
+
+/* Enable BLIT quality degradation workaround for RT595, recommended for screen's dimension > 352 pixels */
+#define RT595_BLIT_WRKRND_ENABLED 1
+
+/* Internal compound symbol */
+#if (defined(CPU_MIMXRT595SFFOB) || defined(CPU_MIMXRT595SFFOB_cm33) || \
+ defined(CPU_MIMXRT595SFFOC) || defined(CPU_MIMXRT595SFFOC_cm33)) && \
+ RT595_BLIT_WRKRND_ENABLED
+#define VG_LITE_BLIT_SPLIT_ENABLED 1
+#else
+#define VG_LITE_BLIT_SPLIT_ENABLED 0
+#endif
+
+/**
+ * BLIT split threshold - BLITs with width or height higher than this value will be done
+ * in multiple steps. Value must be 16-aligned. Don't change.
+ */
+#define LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR 352
+
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+
+/**
+ * BLock Image Transfer - single direct BLIT.
+ *
+ * @param[in] blit Description of the transfer
+ * @retval LV_RES_OK Transfer complete
+ * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS)
+ */
+static lv_res_t _lv_gpu_nxp_vglite_blit_single(lv_gpu_nxp_vglite_blit_info_t * blit);
+
+#if VG_LITE_BLIT_SPLIT_ENABLED
+
+ /**
+ * Move buffer pointer as close as possible to area, but with respect to alignment requirements. X-axis only.
+ *
+ * @param[in,out] area Area to be updated
+ * @param[in,out] buf Pointer to be updated
+ */
+ static void _align_x(lv_area_t * area, lv_color_t ** buf);
+
+ /**
+ * Move buffer pointer to the area start and update variables, Y-axis only.
+ *
+ * @param[in,out] area Area to be updated
+ * @param[in,out] buf Pointer to be updated
+ * @param[in] stridePx Buffer stride in pixels
+ */
+ static void _align_y(lv_area_t * area, lv_color_t ** buf, uint32_t stridePx);
+
+ /**
+ * Software BLIT as a fall-back scenario.
+ *
+ * @param[in] blit BLIT configuration
+ */
+ static void _sw_blit(lv_gpu_nxp_vglite_blit_info_t * blit);
+
+ /**
+ * Verify BLIT structure - widths, stride, pointer alignment
+ *
+ * @param[in] blit BLIT configuration
+ * @retval LV_RES_OK
+ * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS)
+ */
+ static lv_res_t _lv_gpu_nxp_vglite_check_blit(lv_gpu_nxp_vglite_blit_info_t * blit);
+
+ /**
+ * BLock Image Transfer - split BLIT.
+ *
+ * @param[in] blit BLIT configuration
+ * @retval LV_RES_OK Transfer complete
+ * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS)
+ */
+ static lv_res_t _lv_gpu_nxp_vglite_blit_split(lv_gpu_nxp_vglite_blit_info_t * blit);
+#endif
+
+/**********************
+ * STATIC VARIABLES
+ **********************/
+
+/**********************
+ * MACROS
+ **********************/
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+
+lv_res_t lv_gpu_nxp_vglite_fill(lv_color_t * dest_buf, lv_coord_t dest_width, lv_coord_t dest_height,
+ const lv_area_t * fill_area, lv_color_t color, lv_opa_t opa)
+{
+ uint32_t area_size = lv_area_get_size(fill_area);
+ lv_coord_t area_w = lv_area_get_width(fill_area);
+ lv_coord_t area_h = lv_area_get_height(fill_area);
+
+ if(opa >= (lv_opa_t)LV_OPA_MAX) {
+ if(area_size < LV_GPU_NXP_VG_LITE_FILL_SIZE_LIMIT)
+ VG_LITE_RETURN_INV("Area size %d smaller than limit %d.", area_size, LV_GPU_NXP_VG_LITE_FILL_SIZE_LIMIT);
+ }
+ else {
+ if(area_size < LV_GPU_NXP_VG_LITE_FILL_OPA_SIZE_LIMIT)
+ VG_LITE_RETURN_INV("Area size %d smaller than limit %d.", area_size, LV_GPU_NXP_VG_LITE_FILL_OPA_SIZE_LIMIT);
+ }
+
+ vg_lite_buffer_t vgbuf;
+ vg_lite_rectangle_t rect;
+ vg_lite_error_t err = VG_LITE_SUCCESS;
+ lv_color32_t col32 = {.full = lv_color_to32(color)}; /*Convert color to RGBA8888*/
+ vg_lite_color_t vgcol; /* vglite takes ABGR */
+
+ if(lv_vglite_init_buf(&vgbuf, (uint32_t)dest_width, (uint32_t)dest_height, (uint32_t)dest_width * sizeof(lv_color_t),
+ (const lv_color_t *)dest_buf, false) != LV_RES_OK)
+ VG_LITE_RETURN_INV("Init buffer failed.");
+
+ if(opa >= (lv_opa_t)LV_OPA_MAX) { /*Opaque fill*/
+ rect.x = fill_area->x1;
+ rect.y = fill_area->y1;
+ rect.width = area_w;
+ rect.height = area_h;
+
+ /*Clean & invalidate cache*/
+ lv_vglite_invalidate_cache();
+
+#if LV_COLOR_DEPTH==16
+ vgcol = col32.full;
+#else /*LV_COLOR_DEPTH==32*/
+ vgcol = ((uint32_t)col32.ch.alpha << 24) | ((uint32_t)col32.ch.blue << 16) | ((uint32_t)col32.ch.green << 8) |
+ (uint32_t)col32.ch.red;
+#endif
+
+ err = vg_lite_clear(&vgbuf, &rect, vgcol);
+ VG_LITE_ERR_RETURN_INV(err, "Clear failed.");
+
+ err = vg_lite_finish();
+ VG_LITE_ERR_RETURN_INV(err, "Finish failed.");
+ }
+ else { /*fill with transparency*/
+
+ vg_lite_path_t path;
+ int32_t path_data[] = { /*VG rectangular path*/
+ VLC_OP_MOVE, fill_area->x1, fill_area->y1,
+ VLC_OP_LINE, fill_area->x2 + 1, fill_area->y1,
+ VLC_OP_LINE, fill_area->x2 + 1, fill_area->y2 + 1,
+ VLC_OP_LINE, fill_area->x1, fill_area->y2 + 1,
+ VLC_OP_LINE, fill_area->x1, fill_area->y1,
+ VLC_OP_END
+ };
+
+ err = vg_lite_init_path(&path, VG_LITE_S32, VG_LITE_LOW, sizeof(path_data), path_data,
+ (vg_lite_float_t) fill_area->x1, (vg_lite_float_t) fill_area->y1,
+ ((vg_lite_float_t) fill_area->x2) + 1.0f, ((vg_lite_float_t) fill_area->y2) + 1.0f);
+ VG_LITE_ERR_RETURN_INV(err, "Init path failed.");
+
+ /* Only pre-multiply color if hardware pre-multiplication is not present */
+ if(!vg_lite_query_feature(gcFEATURE_BIT_VG_PE_PREMULTIPLY)) {
+ col32.ch.red = (uint8_t)(((uint16_t)col32.ch.red * opa) >> 8);
+ col32.ch.green = (uint8_t)(((uint16_t)col32.ch.green * opa) >> 8);
+ col32.ch.blue = (uint8_t)(((uint16_t)col32.ch.blue * opa) >> 8);
+ }
+ col32.ch.alpha = opa;
+
+#if LV_COLOR_DEPTH==16
+ vgcol = col32.full;
+#else /*LV_COLOR_DEPTH==32*/
+ vgcol = ((uint32_t)col32.ch.alpha << 24) | ((uint32_t)col32.ch.blue << 16) | ((uint32_t)col32.ch.green << 8) |
+ (uint32_t)col32.ch.red;
+#endif
+
+ /*Clean & invalidate cache*/
+ lv_vglite_invalidate_cache();
+
+ vg_lite_matrix_t matrix;
+ vg_lite_identity(&matrix);
+
+ /*Draw rectangle*/
+ err = vg_lite_draw(&vgbuf, &path, VG_LITE_FILL_EVEN_ODD, &matrix, VG_LITE_BLEND_SRC_OVER, vgcol);
+ VG_LITE_ERR_RETURN_INV(err, "Draw rectangle failed.");
+
+ err = vg_lite_finish();
+ VG_LITE_ERR_RETURN_INV(err, "Finish failed.");
+
+ err = vg_lite_clear_path(&path);
+ VG_LITE_ERR_RETURN_INV(err, "Clear path failed.");
+ }
+
+ return LV_RES_OK;
+}
+
+lv_res_t lv_gpu_nxp_vglite_blit(lv_gpu_nxp_vglite_blit_info_t * blit)
+{
+ uint32_t dest_size = lv_area_get_size(&blit->dst_area);
+
+ if(blit->opa >= (lv_opa_t)LV_OPA_MAX) {
+ if(dest_size < LV_GPU_NXP_VG_LITE_BLIT_SIZE_LIMIT)
+ VG_LITE_RETURN_INV("Area size %d smaller than limit %d.", dest_size, LV_GPU_NXP_VG_LITE_BLIT_SIZE_LIMIT);
+ }
+ else {
+ if(dest_size < LV_GPU_NXP_VG_LITE_BLIT_OPA_SIZE_LIMIT)
+ VG_LITE_RETURN_INV("Area size %d smaller than limit %d.", dest_size, LV_GPU_NXP_VG_LITE_BLIT_OPA_SIZE_LIMIT);
+ }
+
+#if VG_LITE_BLIT_SPLIT_ENABLED
+ return _lv_gpu_nxp_vglite_blit_split(blit);
+#endif /* non RT595 */
+
+ /* Just pass down */
+ return _lv_gpu_nxp_vglite_blit_single(blit);
+}
+
+lv_res_t lv_gpu_nxp_vglite_blit_transform(lv_gpu_nxp_vglite_blit_info_t * blit)
+{
+ uint32_t dest_size = lv_area_get_size(&blit->dst_area);
+
+ if(blit->opa >= (lv_opa_t)LV_OPA_MAX) {
+ if(dest_size < LV_GPU_NXP_VG_LITE_BLIT_SIZE_LIMIT)
+ VG_LITE_RETURN_INV("Area size %d smaller than limit %d.", dest_size, LV_GPU_NXP_VG_LITE_BLIT_SIZE_LIMIT);
+ }
+ else {
+ if(dest_size < LV_GPU_NXP_VG_LITE_BLIT_OPA_SIZE_LIMIT)
+ VG_LITE_RETURN_INV("Area size %d smaller than limit %d.", dest_size, LV_GPU_NXP_VG_LITE_BLIT_OPA_SIZE_LIMIT);
+ }
+
+ return _lv_gpu_nxp_vglite_blit_single(blit);
+}
+
+/**********************
+ * STATIC FUNCTIONS
+ **********************/
+
+#if VG_LITE_BLIT_SPLIT_ENABLED
+static lv_res_t _lv_gpu_nxp_vglite_blit_split(lv_gpu_nxp_vglite_blit_info_t * blit)
+{
+ lv_res_t rv = LV_RES_INV;
+
+ if(_lv_gpu_nxp_vglite_check_blit(blit) != LV_RES_OK) {
+ PRINT_BLT("Blit check failed\n");
+ return LV_RES_INV;
+ }
+
+ PRINT_BLT("BLIT from: "
+ "Area: %03d,%03d - %03d,%03d "
+ "Addr: %d\n\n",
+ blit->src_area.x1, blit->src_area.y1,
+ blit->src_area.x2, blit->src_area.y2,
+ (uintptr_t) blit->src);
+
+ PRINT_BLT("BLIT to: "
+ "Area: %03d,%03d - %03d,%03d "
+ "Addr: %d\n\n",
+ blit->dst_area.x1, blit->dst_area.y1,
+ blit->dst_area.x2, blit->dst_area.y2,
+ (uintptr_t) blit->src);
+
+ /* Stage 1: Move starting pointers as close as possible to [x1, y1], so coordinates are as small as possible. */
+ _align_x(&blit->src_area, (lv_color_t **)&blit->src);
+ _align_y(&blit->src_area, (lv_color_t **)&blit->src, blit->src_stride / sizeof(lv_color_t));
+ _align_x(&blit->dst_area, (lv_color_t **)&blit->dst);
+ _align_y(&blit->dst_area, (lv_color_t **)&blit->dst, blit->dst_stride / sizeof(lv_color_t));
+
+ /* Stage 2: If we're in limit, do a single BLIT */
+ if((blit->src_area.x2 < LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR) &&
+ (blit->src_area.y2 < LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR)) {
+ PRINT_BLT("Simple blit!\n");
+ return _lv_gpu_nxp_vglite_blit_single(blit);
+ };
+
+ /* Stage 3: Split the BLIT into multiple tiles */
+ PRINT_BLT("Split blit!\n");
+
+ PRINT_BLT("Blit "
+ "([%03d,%03d], [%03d,%03d]) -> "
+ "([%03d,%03d], [%03d,%03d]) | "
+ "([%03dx%03d] -> [%03dx%03d]) | "
+ "A:(%d -> %d)\n",
+ blit->src_area.x1, blit->src_area.y1, blit->src_area.x2, blit->src_area.y2,
+ blit->dst_area.x1, blit->dst_area.y1, blit->dst_area.x2, blit->dst_area.y2,
+ lv_area_get_width(&blit->src_area), lv_area_get_height(&blit->src_area),
+ lv_area_get_width(&blit->dst_area), lv_area_get_height(&blit->dst_area),
+ (uintptr_t) blit->src, (uintptr_t) blit->dst);
+
+
+ lv_coord_t totalWidth = lv_area_get_width(&blit->src_area);
+ lv_coord_t totalHeight = lv_area_get_height(&blit->src_area);
+
+ lv_gpu_nxp_vglite_blit_info_t tileBlit;
+
+ /* Number of tiles needed */
+ int totalTilesX = (blit->src_area.x1 + totalWidth + LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1) /
+ LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR;
+ int totalTilesY = (blit->src_area.y1 + totalHeight + LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1) /
+ LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR;
+
+ /* src and dst buffer shift against each other. Src buffer real data [0,0] may start actually at [3,0] in buffer, as
+ * the buffer pointer has to be aligned, while dst buffer real data [0,0] may start at [1,0] in buffer. alignment may be
+ * different */
+ int shiftSrcX = (blit->src_area.x1 > blit->dst_area.x1) ? (blit->src_area.x1 - blit->dst_area.x1) : 0;
+ int shiftDstX = (blit->src_area.x1 < blit->dst_area.x1) ? (blit->dst_area.x1 - blit->src_area.x1) : 0;
+
+ PRINT_BLT("\n");
+ PRINT_BLT("Align shift: src: %d, dst: %d\n", shiftSrcX, shiftDstX);
+
+ tileBlit = *blit;
+
+ for(int tileY = 0; tileY < totalTilesY; tileY++) {
+
+ tileBlit.src_area.y1 = 0; /* no vertical alignment, always start from 0 */
+ tileBlit.src_area.y2 = totalHeight - tileY * LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1;
+ if(tileBlit.src_area.y2 >= LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR) {
+ tileBlit.src_area.y2 = LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1; /* Should never happen */
+ }
+ tileBlit.src = blit->src + tileY * LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR * blit->src_stride / sizeof(
+ lv_color_t); /* stride in px! */
+
+ tileBlit.dst_area.y1 = tileBlit.src_area.y1; /* y has no alignment, always in sync with src */
+ tileBlit.dst_area.y2 = tileBlit.src_area.y2;
+
+ tileBlit.dst = blit->dst + tileY * LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR * blit->dst_stride / sizeof(
+ lv_color_t); /* stride in px! */
+
+ for(int tileX = 0; tileX < totalTilesX; tileX++) {
+
+ if(tileX == 0) {
+ /* 1st tile is special - there may be a gap between buffer start pointer
+ * and area.x1 value, as the pointer has to be aligned.
+ * tileBlit.src pointer - keep init value from Y-loop.
+ * Also, 1st tile start is not shifted! shift is applied from 2nd tile */
+ tileBlit.src_area.x1 = blit->src_area.x1;
+ tileBlit.dst_area.x1 = blit->dst_area.x1;
+ }
+ else {
+ /* subsequent tiles always starts from 0, but shifted*/
+ tileBlit.src_area.x1 = 0 + shiftSrcX;
+ tileBlit.dst_area.x1 = 0 + shiftDstX;
+ /* and advance start pointer + 1 tile size */
+ tileBlit.src += LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR;
+ tileBlit.dst += LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR;
+ }
+
+ /* Clip tile end coordinates */
+ tileBlit.src_area.x2 = totalWidth + blit->src_area.x1 - tileX * LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1;
+ if(tileBlit.src_area.x2 >= LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR) {
+ tileBlit.src_area.x2 = LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1;
+ }
+
+ tileBlit.dst_area.x2 = totalWidth + blit->dst_area.x1 - tileX * LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1;
+ if(tileBlit.dst_area.x2 >= LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR) {
+ tileBlit.dst_area.x2 = LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1;
+ }
+
+ if(tileX < (totalTilesX - 1)) {
+ /* And adjust end coords if shifted, but not for last tile! */
+ tileBlit.src_area.x2 += shiftSrcX;
+ tileBlit.dst_area.x2 += shiftDstX;
+ }
+
+ rv = _lv_gpu_nxp_vglite_blit_single(&tileBlit);
+
+#if BLIT_DBG_AREAS
+ lv_vglite_dbg_draw_rectangle((lv_color_t *) tileBlit.dst, tileBlit.dst_width, tileBlit.dst_height, &tileBlit.dst_area,
+ LV_COLOR_RED);
+ lv_vglite_dbg_draw_rectangle((lv_color_t *) tileBlit.src, tileBlit.src_width, tileBlit.src_height, &tileBlit.src_area,
+ LV_COLOR_GREEN);
+#endif
+
+ PRINT_BLT("Tile [%d, %d]: "
+ "([%d,%d], [%d,%d]) -> "
+ "([%d,%d], [%d,%d]) | "
+ "([%dx%d] -> [%dx%d]) | "
+ "A:(0x%8X -> 0x%8X) %s\n",
+ tileX, tileY,
+ tileBlit.src_area.x1, tileBlit.src_area.y1, tileBlit.src_area.x2, tileBlit.src_area.y2,
+ tileBlit.dst_area.x1, tileBlit.dst_area.y1, tileBlit.dst_area.x2, tileBlit.dst_area.y2,
+ lv_area_get_width(&tileBlit.src_area), lv_area_get_height(&tileBlit.src_area),
+ lv_area_get_width(&tileBlit.dst_area), lv_area_get_height(&tileBlit.dst_area),
+ (uintptr_t) tileBlit.src, (uintptr_t) tileBlit.dst,
+ rv == LV_RES_OK ? "OK!" : "!!! FAILED !!!");
+
+ if(rv != LV_RES_OK) { /* if anything goes wrong... */
+#if LV_GPU_NXP_VG_LITE_LOG_ERRORS
+ LV_LOG_ERROR("Split blit failed. Trying SW blit instead.");
+#endif
+ _sw_blit(&tileBlit);
+ rv = LV_RES_OK; /* Don't report error, as SW BLIT was performed */
+ }
+
+ }
+ PRINT_BLT(" \n");
+ }
+
+ return rv; /* should never fail */
+}
+#endif /* VG_LITE_BLIT_SPLIT_ENABLED */
+
+static lv_res_t _lv_gpu_nxp_vglite_blit_single(lv_gpu_nxp_vglite_blit_info_t * blit)
+{
+ vg_lite_buffer_t src_vgbuf, dst_vgbuf;
+ vg_lite_error_t err = VG_LITE_SUCCESS;
+ uint32_t rect[4];
+ vg_lite_float_t scale = 1.0;
+
+ if(blit == NULL) {
+ /*Wrong parameter*/
+ return LV_RES_INV;
+ }
+
+ if(blit->opa < (lv_opa_t) LV_OPA_MIN) {
+ return LV_RES_OK; /*Nothing to BLIT*/
+ }
+
+ /*Wrap src/dst buffer into VG-Lite buffer*/
+ if(lv_vglite_init_buf(&src_vgbuf, (uint32_t)blit->src_width, (uint32_t)blit->src_height, (uint32_t)blit->src_stride,
+ blit->src, true) != LV_RES_OK)
+ VG_LITE_RETURN_INV("Init buffer failed.");
+
+ if(lv_vglite_init_buf(&dst_vgbuf, (uint32_t)blit->dst_width, (uint32_t)blit->dst_height, (uint32_t)blit->dst_stride,
+ blit->dst, false) != LV_RES_OK)
+ VG_LITE_RETURN_INV("Init buffer failed.");
+
+ rect[0] = (uint32_t)blit->src_area.x1; /* start x */
+ rect[1] = (uint32_t)blit->src_area.y1; /* start y */
+ rect[2] = (uint32_t)blit->src_area.x2 - (uint32_t)blit->src_area.x1 + 1U; /* width */
+ rect[3] = (uint32_t)blit->src_area.y2 - (uint32_t)blit->src_area.y1 + 1U; /* height */
+
+ vg_lite_matrix_t matrix;
+ vg_lite_identity(&matrix);
+ vg_lite_translate((vg_lite_float_t)blit->dst_area.x1, (vg_lite_float_t)blit->dst_area.y1, &matrix);
+
+ if((blit->angle != 0) || (blit->zoom != LV_IMG_ZOOM_NONE)) {
+ vg_lite_translate(blit->pivot.x, blit->pivot.y, &matrix);
+ vg_lite_rotate(blit->angle / 10.0f, &matrix); /* angle is 1/10 degree */
+ scale = 1.0f * blit->zoom / LV_IMG_ZOOM_NONE;
+ vg_lite_scale(scale, scale, &matrix);
+ vg_lite_translate(0.0f - blit->pivot.x, 0.0f - blit->pivot.y, &matrix);
+ }
+
+ /*Clean & invalidate cache*/
+ lv_vglite_invalidate_cache();
+
+ uint32_t color;
+ vg_lite_blend_t blend;
+ if(blit->opa >= (lv_opa_t)LV_OPA_MAX) {
+ color = 0xFFFFFFFFU;
+ blend = VG_LITE_BLEND_SRC_OVER;
+ src_vgbuf.transparency_mode = VG_LITE_IMAGE_TRANSPARENT;
+ }
+ else {
+ uint32_t opa = (uint32_t)blit->opa;
+ if(vg_lite_query_feature(gcFEATURE_BIT_VG_PE_PREMULTIPLY)) {
+ color = (opa << 24) | 0x00FFFFFFU;
+ }
+ else {
+ color = (opa << 24) | (opa << 16) | (opa << 8) | opa;
+ }
+ blend = VG_LITE_BLEND_SRC_OVER;
+ src_vgbuf.image_mode = VG_LITE_MULTIPLY_IMAGE_MODE;
+ src_vgbuf.transparency_mode = VG_LITE_IMAGE_TRANSPARENT;
+ }
+
+ err = vg_lite_blit_rect(&dst_vgbuf, &src_vgbuf, rect, &matrix, blend, color, VG_LITE_FILTER_POINT);
+ VG_LITE_ERR_RETURN_INV(err, "Blit rectangle failed.");
+
+ err = vg_lite_finish();
+ VG_LITE_ERR_RETURN_INV(err, "Finish failed.");
+
+ return LV_RES_OK;
+}
+
+#if VG_LITE_BLIT_SPLIT_ENABLED
+
+static void _sw_blit(lv_gpu_nxp_vglite_blit_info_t * blit)
+{
+ int x, y;
+
+ lv_coord_t w = lv_area_get_width(&blit->src_area);
+ lv_coord_t h = lv_area_get_height(&blit->src_area);
+
+ int32_t srcStridePx = blit->src_stride / (int32_t)sizeof(lv_color_t);
+ int32_t dstStridePx = blit->dst_stride / (int32_t)sizeof(lv_color_t);
+
+ lv_color_t * src = (lv_color_t *)blit->src + blit->src_area.y1 * srcStridePx + blit->src_area.x1;
+ lv_color_t * dst = (lv_color_t *)blit->dst + blit->dst_area.y1 * dstStridePx + blit->dst_area.x1;
+
+ if(blit->opa >= (lv_opa_t)LV_OPA_MAX) {
+ /* simple copy */
+ for(y = 0; y < h; y++) {
+ lv_memcpy(dst, src, (uint32_t)w * sizeof(lv_color_t));
+ src += srcStridePx;
+ dst += dstStridePx;
+ }
+ }
+ else if(blit->opa >= LV_OPA_MIN) {
+ /* alpha blending */
+ for(y = 0; y < h; y++) {
+ for(x = 0; x < w; x++) {
+ dst[x] = lv_color_mix(src[x], dst[x], blit->opa);
+ }
+ src += srcStridePx;
+ dst += dstStridePx;
+ }
+ }
+}
+
+static lv_res_t _lv_gpu_nxp_vglite_check_blit(lv_gpu_nxp_vglite_blit_info_t * blit)
+{
+
+ /* Test for minimal width */
+ if(lv_area_get_width(&blit->src_area) < (lv_coord_t)LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX)
+ VG_LITE_RETURN_INV("Src area width (%d) is smaller than required (%d).", lv_area_get_width(&blit->src_area),
+ LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX);
+
+ /* Test for minimal width */
+ if(lv_area_get_width(&blit->dst_area) < (lv_coord_t)LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX)
+ VG_LITE_RETURN_INV("Dest area width (%d) is smaller than required (%d).", lv_area_get_width(&blit->dst_area),
+ LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX);
+
+ /* Test for pointer alignment */
+ if((((uintptr_t) blit->src) % LV_ATTRIBUTE_MEM_ALIGN_SIZE) != 0x0)
+ VG_LITE_RETURN_INV("Src buffer ptr (0x%X) not aligned to %d.", (size_t) blit->src, LV_ATTRIBUTE_MEM_ALIGN_SIZE);
+
+ /* No alignment requirement for destination pixel buffer when using mode VG_LITE_LINEAR */
+
+ /* Test for stride alignment */
+ if((blit->src_stride % (LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX * LV_COLOR_DEPTH / 8)) != 0x0)
+ VG_LITE_RETURN_INV("Src buffer stride (%d px) not aligned to %d px.", blit->src_stride,
+ LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX);
+
+ /* Test for stride alignment */
+ if((blit->dst_stride % (LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX * LV_COLOR_DEPTH / 8)) != 0x0)
+ VG_LITE_RETURN_INV("Dest buffer stride (%d px) not aligned to %d px.", blit->dst_stride,
+ LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX);
+
+ if((lv_area_get_width(&blit->src_area) != lv_area_get_width(&blit->dst_area)) ||
+ (lv_area_get_height(&blit->src_area) != lv_area_get_height(&blit->dst_area)))
+ VG_LITE_RETURN_INV("Src and dest buffer areas are not equal.");
+
+ return LV_RES_OK;
+}
+
+static void _align_x(lv_area_t * area, lv_color_t ** buf)
+{
+
+ int alignedAreaStartPx = area->x1 - (area->x1 % (LV_ATTRIBUTE_MEM_ALIGN_SIZE * 8 / LV_COLOR_DEPTH));
+ VG_LITE_COND_STOP(alignedAreaStartPx < 0, "Negative X alignment.");
+
+ area->x1 -= alignedAreaStartPx;
+ area->x2 -= alignedAreaStartPx;
+ *buf += alignedAreaStartPx;
+}
+
+static void _align_y(lv_area_t * area, lv_color_t ** buf, uint32_t stridePx)
+{
+ int LineToAlignMem;
+ int alignedAreaStartPy;
+ /* find how many lines of pixels will respect memory alignment requirement */
+ if(stridePx % (uint32_t)LV_ATTRIBUTE_MEM_ALIGN_SIZE == 0U) {
+ alignedAreaStartPy = area->y1;
+ }
+ else {
+ LineToAlignMem = LV_ATTRIBUTE_MEM_ALIGN_SIZE / (sizeof(lv_color_t) * LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX);
+ VG_LITE_COND_STOP(LV_ATTRIBUTE_MEM_ALIGN_SIZE % (sizeof(lv_color_t) * LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX),
+ "Complex case: need gcd function.");
+ alignedAreaStartPy = area->y1 - (area->y1 % LineToAlignMem);
+ VG_LITE_COND_STOP(alignedAreaStartPy < 0, "Negative Y alignment.");
+ }
+
+ area->y1 -= alignedAreaStartPy;
+ area->y2 -= alignedAreaStartPy;
+ *buf += (uint32_t)alignedAreaStartPy * stridePx;
+}
+#endif /*VG_LITE_BLIT_SPLIT_ENABLED*/
+
+#endif /*LV_USE_GPU_NXP_VG_LITE*/
diff --git a/src/draw/nxp_vglite/lv_gpu_nxp_vglite.h b/src/draw/nxp/vglite/lv_draw_vglite_blend.h
similarity index 74%
rename from src/draw/nxp_vglite/lv_gpu_nxp_vglite.h
rename to src/draw/nxp/vglite/lv_draw_vglite_blend.h
index 26f4c3fe4..bc448c65a 100644
--- a/src/draw/nxp_vglite/lv_gpu_nxp_vglite.h
+++ b/src/draw/nxp/vglite/lv_draw_vglite_blend.h
@@ -1,12 +1,12 @@
/**
- * @file lv_gpu_nxp_vglite.h
+ * @file lv_draw_vglite_blend.h
*
*/
/**
* MIT License
*
- * Copyright (c) 2020 NXP
+ * Copyright 2020-2022 NXP
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -27,8 +27,8 @@
*
*/
-#ifndef LV_SRC_LV_GPU_LV_GPU_NXP_VGLITE_H_
-#define LV_SRC_LV_GPU_LV_GPU_NXP_VGLITE_H_
+#ifndef LV_DRAW_VGLITE_BLEND_H
+#define LV_DRAW_VGLITE_BLEND_H
#ifdef __cplusplus
extern "C" {
@@ -37,48 +37,39 @@ extern "C" {
/*********************
* INCLUDES
*********************/
-#include "../../lv_conf_internal.h"
+
+#include "../../../lv_conf_internal.h"
#if LV_USE_GPU_NXP_VG_LITE
+#include "lv_gpu_nxp_vglite.h"
/*********************
* DEFINES
*********************/
-/** Use this symbol as limit to disable feature (value has to be larger than supported resolution) */
-#define LV_GPU_NXP_VG_LITE_FEATURE_DISABLED (1920*1080+1)
-
-/** Stride in px required by VG-Lite HW. Don't change this. */
-#define LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX 16U
-
#ifndef LV_GPU_NXP_VG_LITE_FILL_SIZE_LIMIT
/** Minimum area (in pixels) to be filled by VG-Lite with 100% opacity*/
-#define LV_GPU_NXP_VG_LITE_FILL_SIZE_LIMIT 32
+#define LV_GPU_NXP_VG_LITE_FILL_SIZE_LIMIT 5000
#endif
#ifndef LV_GPU_NXP_VG_LITE_FILL_OPA_SIZE_LIMIT
/** Minimum area (in pixels) to be filled by VG-Lite with transparency*/
-#define LV_GPU_NXP_VG_LITE_FILL_OPA_SIZE_LIMIT 32
+#define LV_GPU_NXP_VG_LITE_FILL_OPA_SIZE_LIMIT 5000
#endif
#ifndef LV_GPU_NXP_VG_LITE_BLIT_SIZE_LIMIT
/** Minimum area (in pixels) for image copy with 100% opacity to be handled by VG-Lite*/
-#define LV_GPU_NXP_VG_LITE_BLIT_SIZE_LIMIT 32
+#define LV_GPU_NXP_VG_LITE_BLIT_SIZE_LIMIT 5000
#endif
#ifndef LV_GPU_NXP_VG_LITE_BUFF_SYNC_BLIT_SIZE_LIMIT
/** Minimum invalidated area (in pixels) to be synchronized by VG-Lite during buffer sync */
-#define LV_GPU_NXP_VG_LITE_BUFF_SYNC_BLIT_SIZE_LIMIT 32
+#define LV_GPU_NXP_VG_LITE_BUFF_SYNC_BLIT_SIZE_LIMIT 5000
#endif
#ifndef LV_GPU_NXP_VG_LITE_BLIT_OPA_SIZE_LIMIT
/** Minimum area (in pixels) for image copy with transparency to be handled by VG-Lite*/
-#define LV_GPU_NXP_VG_LITE_BLIT_OPA_SIZE_LIMIT 32
-#endif
-
-#ifndef LV_GPU_NXP_VG_LITE_LOG_ERRORS
-/** Enable logging of VG-Lite errors (\see LV_LOG_ERROR)*/
-#define LV_GPU_NXP_VG_LITE_LOG_ERRORS 1
+#define LV_GPU_NXP_VG_LITE_BLIT_OPA_SIZE_LIMIT 5000
#endif
/**********************
@@ -94,30 +85,29 @@ typedef struct {
lv_area_t src_area; /**< Area to be copied from source*/
lv_coord_t src_width; /**< Source buffer width*/
lv_coord_t src_height; /**< Source buffer height*/
- uint32_t src_stride; /**< Source buffer stride in bytes (must be aligned on 16 px)*/
+ int32_t src_stride; /**< Source buffer stride in bytes (must be aligned on 16 px)*/
const lv_color_t * dst; /**< Destination buffer pointer (must be aligned on 32 bytes)*/
lv_area_t dst_area; /**< Target area in destination buffer (must be the same as src_area)*/
lv_coord_t dst_width; /**< Destination buffer width*/
lv_coord_t dst_height; /**< Destination buffer height*/
- uint32_t dst_stride; /**< Destination buffer stride in bytes (must be aligned on 16 px)*/
+ int32_t dst_stride; /**< Destination buffer stride in bytes (must be aligned on 16 px)*/
lv_opa_t opa; /**< Opacity - alpha mix (0 = source not copied, 255 = 100% opaque)*/
-
+ uint32_t angle; /**< Rotation angle (1/10 of degree)*/
+ uint32_t zoom; /**< 256 = no zoom (1:1 scale ratio)*/
+ lv_point_t pivot; /**< The coordinates of rotation pivot in source image buffer*/
} lv_gpu_nxp_vglite_blit_info_t;
/**********************
- * MACROS
+ * GLOBAL PROTOTYPES
**********************/
-/**********************
- * GLOBAL FUNCTIONS
- **********************/
-
-/***
- * Fills rectangular area in buffer.
- * @param[in] dest_buf Destination buffer pointer (must be aligned on 32 bytes)
- * @param[in] dest_width Destination buffer width in pixels ((must be aligned on 16 px)
+/**
+ * Fill area, with optional opacity.
+ *
+ * @param[in/out] dest_buf Destination buffer pointer (must be aligned on 32 bytes)
+ * @param[in] dest_width Destination buffer width in pixels (must be aligned on 16 px)
* @param[in] dest_height Destination buffer height in pixels
* @param[in] fill_area Area to be filled
* @param[in] color Fill color
@@ -128,18 +118,32 @@ typedef struct {
lv_res_t lv_gpu_nxp_vglite_fill(lv_color_t * dest_buf, lv_coord_t dest_width, lv_coord_t dest_height,
const lv_area_t * fill_area, lv_color_t color, lv_opa_t opa);
-/***
+/**
* BLock Image Transfer.
+ *
* @param[in] blit Description of the transfer
* @retval LV_RES_OK Transfer complete
* @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS)
*/
lv_res_t lv_gpu_nxp_vglite_blit(lv_gpu_nxp_vglite_blit_info_t * blit);
+/**
+ * BLock Image Transfer with transformation.
+ *
+ * @param[in] blit Description of the transfer
+ * @retval LV_RES_OK Transfer complete
+ * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS)
+ */
+lv_res_t lv_gpu_nxp_vglite_blit_transform(lv_gpu_nxp_vglite_blit_info_t * blit);
+
+/**********************
+ * MACROS
+ **********************/
+
#endif /*LV_USE_GPU_NXP_VG_LITE*/
#ifdef __cplusplus
} /*extern "C"*/
#endif
-#endif /*LV_SRC_LV_GPU_LV_GPU_NXP_VGLITE_H_*/
+#endif /*LV_DRAW_VGLITE_BLEND_H*/
diff --git a/src/draw/nxp/vglite/lv_draw_vglite_rect.c b/src/draw/nxp/vglite/lv_draw_vglite_rect.c
new file mode 100644
index 000000000..bc1d55c85
--- /dev/null
+++ b/src/draw/nxp/vglite/lv_draw_vglite_rect.c
@@ -0,0 +1,244 @@
+/**
+ * @file lv_draw_vglite_rect.c
+ *
+ */
+
+/**
+ * MIT License
+ *
+ * Copyright 2021, 2022 NXP
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next paragraph)
+ * shall be included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+ * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
+ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+/*********************
+ * INCLUDES
+ *********************/
+
+#include "lv_draw_vglite_rect.h"
+
+#if LV_USE_GPU_NXP_VG_LITE
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+
+/**********************
+ * STATIC VARIABLES
+ **********************/
+
+/**********************
+ * MACROS
+ **********************/
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+
+lv_res_t lv_gpu_nxp_vglite_draw_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords)
+{
+ vg_lite_buffer_t vgbuf;
+ vg_lite_error_t err = VG_LITE_SUCCESS;
+ lv_coord_t dest_width = lv_area_get_width(draw_ctx->buf_area);
+ lv_coord_t dest_height = lv_area_get_height(draw_ctx->buf_area);
+ vg_lite_path_t path;
+ vg_lite_color_t vgcol; /* vglite takes ABGR */
+ vg_lite_matrix_t matrix;
+ lv_coord_t width = lv_area_get_width(coords);
+ lv_coord_t height = lv_area_get_height(coords);
+ vg_lite_linear_gradient_t gradient;
+ vg_lite_matrix_t * grad_matrix;
+
+ if(dsc->radius < 0)
+ return LV_RES_INV;
+
+ /* Make areas relative to draw buffer */
+ lv_area_t rel_coords;
+ lv_area_copy(&rel_coords, coords);
+ lv_area_move(&rel_coords, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1);
+
+ lv_area_t rel_clip;
+ lv_area_copy(&rel_clip, draw_ctx->clip_area);
+ lv_area_move(&rel_clip, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1);
+
+ /*** Init destination buffer ***/
+ if(lv_vglite_init_buf(&vgbuf, (uint32_t)dest_width, (uint32_t)dest_height, (uint32_t)dest_width * sizeof(lv_color_t),
+ (const lv_color_t *)draw_ctx->buf, false) != LV_RES_OK)
+ VG_LITE_RETURN_INV("Init buffer failed.");
+
+ /*** Init path ***/
+ int32_t rad = dsc->radius;
+ if(dsc->radius == LV_RADIUS_CIRCLE) {
+ rad = (width > height) ? height / 2 : width / 2;
+ }
+
+ if((dsc->radius == LV_RADIUS_CIRCLE) && (width == height)) {
+ float tang = ((float)rad * BEZIER_OPTIM_CIRCLE);
+ int32_t cpoff = (int32_t)tang;
+ int32_t circle_path[] = { /*VG circle path*/
+ VLC_OP_MOVE, rel_coords.x1 + rad, rel_coords.y1,
+ VLC_OP_CUBIC_REL, cpoff, 0, rad, rad - cpoff, rad, rad, /* top-right */
+ VLC_OP_CUBIC_REL, 0, cpoff, cpoff - rad, rad, 0 - rad, rad, /* bottom-right */
+ VLC_OP_CUBIC_REL, 0 - cpoff, 0, 0 - rad, cpoff - rad, 0 - rad, 0 - rad, /* bottom-left */
+ VLC_OP_CUBIC_REL, 0, 0 - cpoff, rad - cpoff, 0 - rad, rad, 0 - rad, /* top-left */
+ VLC_OP_END
+ };
+ err = vg_lite_init_path(&path, VG_LITE_S32, VG_LITE_HIGH, sizeof(circle_path), circle_path,
+ (vg_lite_float_t) rel_clip.x1, (vg_lite_float_t) rel_clip.y1,
+ ((vg_lite_float_t) rel_clip.x2) + 1.0f, ((vg_lite_float_t) rel_clip.y2) + 1.0f);
+ }
+ else if(dsc->radius > 0) {
+ float tang = ((float)rad * BEZIER_OPTIM_CIRCLE);
+ int32_t cpoff = (int32_t)tang;
+ int32_t rounded_path[] = { /*VG rounded rectangular path*/
+ VLC_OP_MOVE, rel_coords.x1 + rad, rel_coords.y1,
+ VLC_OP_LINE, rel_coords.x2 - rad + 1, rel_coords.y1, /* top */
+ VLC_OP_CUBIC_REL, cpoff, 0, rad, rad - cpoff, rad, rad, /* top-right */
+ VLC_OP_LINE, rel_coords.x2 + 1, rel_coords.y2 - rad + 1, /* right */
+ VLC_OP_CUBIC_REL, 0, cpoff, cpoff - rad, rad, 0 - rad, rad, /* bottom-right */
+ VLC_OP_LINE, rel_coords.x1 + rad, rel_coords.y2 + 1, /* bottom */
+ VLC_OP_CUBIC_REL, 0 - cpoff, 0, 0 - rad, cpoff - rad, 0 - rad, 0 - rad, /* bottom-left */
+ VLC_OP_LINE, rel_coords.x1, rel_coords.y1 + rad, /* left */
+ VLC_OP_CUBIC_REL, 0, 0 - cpoff, rad - cpoff, 0 - rad, rad, 0 - rad, /* top-left */
+ VLC_OP_END
+ };
+ err = vg_lite_init_path(&path, VG_LITE_S32, VG_LITE_HIGH, sizeof(rounded_path), rounded_path,
+ (vg_lite_float_t) rel_clip.x1, (vg_lite_float_t) rel_clip.y1,
+ ((vg_lite_float_t) rel_clip.x2) + 1.0f, ((vg_lite_float_t) rel_clip.y2) + 1.0f);
+ }
+ else {
+ int32_t rect_path[] = { /*VG rectangular path*/
+ VLC_OP_MOVE, rel_coords.x1, rel_coords.y1,
+ VLC_OP_LINE, rel_coords.x2 + 1, rel_coords.y1,
+ VLC_OP_LINE, rel_coords.x2 + 1, rel_coords.y2 + 1,
+ VLC_OP_LINE, rel_coords.x1, rel_coords.y2 + 1,
+ VLC_OP_LINE, rel_coords.x1, rel_coords.y1,
+ VLC_OP_END
+ };
+ err = vg_lite_init_path(&path, VG_LITE_S32, VG_LITE_LOW, sizeof(rect_path), rect_path,
+ (vg_lite_float_t) rel_clip.x1, (vg_lite_float_t) rel_clip.y1,
+ ((vg_lite_float_t) rel_clip.x2) + 1.0f, ((vg_lite_float_t) rel_clip.y2) + 1.0f);
+ }
+
+ VG_LITE_ERR_RETURN_INV(err, "Init path failed.");
+ vg_lite_identity(&matrix);
+
+ /*** Init Color/Gradient ***/
+ if(dsc->bg_grad.dir != (lv_grad_dir_t)LV_GRAD_DIR_NONE) {
+ uint32_t colors[2];
+ uint32_t stops[2];
+ lv_color32_t col32[2];
+
+ /* Gradient setup */
+ uint8_t cnt = MAX(dsc->bg_grad.stops_count, 2);
+ for(uint8_t i = 0; i < cnt; i++) {
+ col32[i].full = lv_color_to32(dsc->bg_grad.stops[i].color); /*Convert color to RGBA8888*/
+ stops[i] = dsc->bg_grad.stops[i].frac;
+#if LV_COLOR_DEPTH==16
+ colors[i] = ((uint32_t)col32[i].ch.alpha << 24) | ((uint32_t)col32[i].ch.blue << 16) |
+ ((uint32_t)col32[i].ch.green << 8) | (uint32_t)col32[i].ch.red;
+#else /*LV_COLOR_DEPTH==32*/
+ /* watchout: red and blue color components are inverted versus vg_lite_color_t order */
+ colors[i] = ((uint32_t)col32[i].ch.alpha << 24) | ((uint32_t)col32[i].ch.red << 16) |
+ ((uint32_t)col32[i].ch.green << 8) | (uint32_t)col32[i].ch.blue;
+#endif
+ }
+
+ lv_memset_00(&gradient, sizeof(vg_lite_linear_gradient_t));
+
+ err = vg_lite_init_grad(&gradient);
+ VG_LITE_ERR_RETURN_INV(err, "Init gradient failed");
+
+ err = vg_lite_set_grad(&gradient, cnt, colors, stops);
+ VG_LITE_ERR_RETURN_INV(err, "Set gradient failed.");
+
+ err = vg_lite_update_grad(&gradient);
+ VG_LITE_ERR_RETURN_INV(err, "Update gradient failed.");
+
+ grad_matrix = vg_lite_get_grad_matrix(&gradient);
+ vg_lite_identity(grad_matrix);
+ vg_lite_translate((float)rel_coords.x1, (float)rel_coords.y1, grad_matrix);
+
+ if(dsc->bg_grad.dir == (lv_grad_dir_t)LV_GRAD_DIR_VER) {
+ vg_lite_scale(1.0f, (float)height / 256.0f, grad_matrix);
+ vg_lite_rotate(90.0f, grad_matrix);
+ }
+ else { /*LV_GRAD_DIR_HOR*/
+ vg_lite_scale((float)width / 256.0f, 1.0f, grad_matrix);
+ }
+ }
+
+ lv_opa_t bg_opa = dsc->bg_opa;
+ lv_color32_t bg_col32 = {.full = lv_color_to32(dsc->bg_color)}; /*Convert color to RGBA8888*/
+ if(bg_opa <= (lv_opa_t)LV_OPA_MAX) {
+ /* Only pre-multiply color if hardware pre-multiplication is not present */
+ if(!vg_lite_query_feature(gcFEATURE_BIT_VG_PE_PREMULTIPLY)) {
+ bg_col32.ch.red = (uint8_t)(((uint16_t)bg_col32.ch.red * bg_opa) >> 8);
+ bg_col32.ch.green = (uint8_t)(((uint16_t)bg_col32.ch.green * bg_opa) >> 8);
+ bg_col32.ch.blue = (uint8_t)(((uint16_t)bg_col32.ch.blue * bg_opa) >> 8);
+ }
+ bg_col32.ch.alpha = bg_opa;
+ }
+
+#if LV_COLOR_DEPTH==16
+ vgcol = bg_col32.full;
+#else /*LV_COLOR_DEPTH==32*/
+ vgcol = ((uint32_t)bg_col32.ch.alpha << 24) | ((uint32_t)bg_col32.ch.blue << 16) |
+ ((uint32_t)bg_col32.ch.green << 8) | (uint32_t)bg_col32.ch.red;
+#endif
+
+ /*Clean & invalidate cache*/
+ lv_vglite_invalidate_cache();
+
+ /*** Draw rectangle ***/
+ if(dsc->bg_grad.dir == (lv_grad_dir_t)LV_GRAD_DIR_NONE) {
+ err = vg_lite_draw(&vgbuf, &path, VG_LITE_FILL_EVEN_ODD, &matrix, VG_LITE_BLEND_SRC_OVER, vgcol);
+ }
+ else {
+ err = vg_lite_draw_gradient(&vgbuf, &path, VG_LITE_FILL_EVEN_ODD, &matrix, &gradient, VG_LITE_BLEND_SRC_OVER);
+ }
+ VG_LITE_ERR_RETURN_INV(err, "Draw gradient failed.");
+
+ err = vg_lite_finish();
+ VG_LITE_ERR_RETURN_INV(err, "Finish failed.");
+
+ err = vg_lite_clear_path(&path);
+ VG_LITE_ERR_RETURN_INV(err, "Clear path failed.");
+
+ if(dsc->bg_grad.dir != (lv_grad_dir_t)LV_GRAD_DIR_NONE) {
+ err = vg_lite_clear_grad(&gradient);
+ VG_LITE_ERR_RETURN_INV(err, "Clear gradient failed.");
+ }
+
+ return LV_RES_OK;
+}
+
+/**********************
+ * STATIC FUNCTIONS
+ **********************/
+
+#endif /*LV_USE_GPU_NXP_VG_LITE*/
diff --git a/src/draw/nxp/vglite/lv_draw_vglite_rect.h b/src/draw/nxp/vglite/lv_draw_vglite_rect.h
new file mode 100644
index 000000000..d708e7b42
--- /dev/null
+++ b/src/draw/nxp/vglite/lv_draw_vglite_rect.h
@@ -0,0 +1,77 @@
+/**
+ * @file lv_draw_vglite_rect.h
+ *
+ */
+
+/**
+ * MIT License
+ *
+ * Copyright 2021, 2022 NXP
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next paragraph)
+ * shall be included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+ * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
+ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#ifndef LV_DRAW_VGLITE_RECT_H
+#define LV_DRAW_VGLITE_RECT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ * INCLUDES
+ *********************/
+#include "../../../lv_conf_internal.h"
+
+#if LV_USE_GPU_NXP_VG_LITE
+#include "lv_gpu_nxp_vglite.h"
+#include "../../lv_draw_rect.h"
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+/**
+ * Draw rectangle shape with effects (rounded corners, gradient)
+ *
+ * @param draw_ctx drawing context
+ * @param dsc description of the rectangle
+ * @param coords the area where rectangle is clipped
+ */
+lv_res_t lv_gpu_nxp_vglite_draw_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords);
+
+/**********************
+ * MACROS
+ **********************/
+
+#endif /*LV_USE_GPU_NXP_VG_LITE*/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /*LV_DRAW_VGLITE_RECT_H*/
diff --git a/src/draw/nxp/vglite/lv_gpu_nxp_vglite.c b/src/draw/nxp/vglite/lv_gpu_nxp_vglite.c
new file mode 100644
index 000000000..f65ec1d48
--- /dev/null
+++ b/src/draw/nxp/vglite/lv_gpu_nxp_vglite.c
@@ -0,0 +1,153 @@
+/**
+ * @file lv_gpu_nxp_vglite.c
+ *
+ */
+
+/**
+ * MIT License
+ *
+ * Copyright 2020-2022 NXP
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next paragraph)
+ * shall be included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+ * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
+ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+/*********************
+ * INCLUDES
+ *********************/
+
+#include "lv_gpu_nxp_vglite.h"
+
+#if LV_USE_GPU_NXP_VG_LITE
+#include "../../../core/lv_refr.h"
+#if BLIT_DBG_AREAS
+ #include "lv_draw_vglite_blend.h"
+#endif
+
+/*********************
+ * DEFINES
+ *********************/
+
+#if LV_COLOR_DEPTH==16
+ #define VG_LITE_PX_FMT VG_LITE_RGB565
+#elif LV_COLOR_DEPTH==32
+ #define VG_LITE_PX_FMT VG_LITE_BGRA8888
+#else
+ #error Only 16bit and 32bit color depth are supported. Set LV_COLOR_DEPTH to 16 or 32.
+#endif
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+
+/**********************
+ * STATIC VARIABLES
+ **********************/
+
+/**********************
+ * MACROS
+ **********************/
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+
+lv_res_t lv_vglite_init_buf(vg_lite_buffer_t * vgbuf, uint32_t width, uint32_t height, uint32_t stride,
+ const lv_color_t * ptr, bool source)
+{
+ /*Test for memory alignment*/
+ if((((uintptr_t)ptr) % (uintptr_t)LV_ATTRIBUTE_MEM_ALIGN_SIZE) != (uintptr_t)0x0U)
+ VG_LITE_RETURN_INV("%s buffer (0x%x) not aligned to %d.", source ? "Src" : "Dest",
+ (size_t) ptr, LV_ATTRIBUTE_MEM_ALIGN_SIZE);
+
+ /*Test for stride alignment*/
+ if(source && (stride % (LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX * sizeof(lv_color_t))) != 0x0U)
+ VG_LITE_RETURN_INV("Src buffer stride (%d bytes) not aligned to %d bytes.", stride,
+ LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX * sizeof(lv_color_t));
+
+ vgbuf->format = VG_LITE_PX_FMT;
+ vgbuf->tiled = VG_LITE_LINEAR;
+ vgbuf->image_mode = VG_LITE_NORMAL_IMAGE_MODE;
+ vgbuf->transparency_mode = VG_LITE_IMAGE_OPAQUE;
+
+ vgbuf->width = (int32_t)width;
+ vgbuf->height = (int32_t)height;
+ vgbuf->stride = (int32_t)stride;
+
+ lv_memset_00(&vgbuf->yuv, sizeof(vgbuf->yuv));
+
+ vgbuf->memory = (void *)ptr;
+ vgbuf->address = (uint32_t)vgbuf->memory;
+ vgbuf->handle = NULL;
+
+ return LV_RES_OK;
+}
+
+#if BLIT_DBG_AREAS
+void lv_vglite_dbg_draw_rectangle(lv_color_t * dest_buf, lv_coord_t dest_width, lv_coord_t dest_height,
+ lv_area_t * fill_area, lv_color_t color)
+{
+ lv_area_t a;
+
+ /* top line */
+ a.x1 = fill_area->x1;
+ a.x2 = fill_area->x2;
+ a.y1 = fill_area->y1;
+ a.y2 = fill_area->y1;
+ lv_gpu_nxp_vglite_fill(dest_buf, dest_width, dest_height, &a, color, LV_OPA_COVER);
+
+
+ /* bottom line */
+ a.x1 = fill_area->x1;
+ a.x2 = fill_area->x2;
+ a.y1 = fill_area->y2;
+ a.y2 = fill_area->y2;
+ lv_gpu_nxp_vglite_fill(dest_buf, dest_width, dest_height, &a, color, LV_OPA_COVER);
+
+ /* left line */
+ a.x1 = fill_area->x1;
+ a.x2 = fill_area->x1;
+ a.y1 = fill_area->y1;
+ a.y2 = fill_area->y2;
+ lv_gpu_nxp_vglite_fill(dest_buf, dest_width, dest_height, &a, color, LV_OPA_COVER);
+
+ /* right line */
+ a.x1 = fill_area->x2;
+ a.x2 = fill_area->x2;
+ a.y1 = fill_area->y1;
+ a.y2 = fill_area->y2;
+ lv_gpu_nxp_vglite_fill(dest_buf, dest_width, dest_height, &a, color, LV_OPA_COVER);
+}
+#endif /* BLIT_DBG_AREAS */
+
+void lv_vglite_invalidate_cache(void)
+{
+ lv_disp_t * disp = _lv_refr_get_disp_refreshing();
+ if(disp->driver->clean_dcache_cb)
+ disp->driver->clean_dcache_cb(disp->driver);
+}
+
+/**********************
+ * STATIC FUNCTIONS
+ **********************/
+
+#endif /*LV_USE_GPU_NXP_VG_LITE*/
diff --git a/src/draw/nxp/vglite/lv_gpu_nxp_vglite.h b/src/draw/nxp/vglite/lv_gpu_nxp_vglite.h
new file mode 100644
index 000000000..c22cae185
--- /dev/null
+++ b/src/draw/nxp/vglite/lv_gpu_nxp_vglite.h
@@ -0,0 +1,185 @@
+/**
+ * @file lv_gpu_nxp_vglite.h
+ *
+ */
+
+/**
+ * MIT License
+ *
+ * Copyright 2020-2022 NXP
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next paragraph)
+ * shall be included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+ * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
+ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#ifndef LV_GPU_NXP_VGLITE_H
+#define LV_GPU_NXP_VGLITE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ * INCLUDES
+ *********************/
+#include "../../../lv_conf_internal.h"
+
+#if LV_USE_GPU_NXP_VG_LITE
+#include "vg_lite.h"
+#include "../../sw/lv_draw_sw.h"
+#include "../../../misc/lv_log.h"
+#include "fsl_debug_console.h"
+
+/*********************
+ * DEFINES
+ *********************/
+
+/** Use this symbol as limit to disable feature (value has to be larger than supported resolution) */
+#define LV_GPU_NXP_VG_LITE_FEATURE_DISABLED (1920*1080+1)
+
+/** Stride in px required by VG-Lite HW. Don't change this. */
+#define LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX 16U
+
+#ifndef LV_GPU_NXP_VG_LITE_LOG_ERRORS
+/** Enable logging of VG-Lite errors (\see LV_LOG_ERROR)*/
+#define LV_GPU_NXP_VG_LITE_LOG_ERRORS 1
+#endif
+
+#ifndef LV_GPU_NXP_VG_LITE_LOG_TRACES
+/** Enable logging of VG-Lite errors (\see LV_LOG_ERROR)*/
+#define LV_GPU_NXP_VG_LITE_LOG_TRACES 0
+#endif
+
+/* Draw rectangles around BLIT tiles */
+#define BLIT_DBG_AREAS 0
+
+/* Print detailed info to SDK console (NOT to LVGL log system) */
+#define BLIT_DBG_VERBOSE 0
+
+/* Verbose debug print */
+#if BLIT_DBG_VERBOSE
+#define PRINT_BLT PRINTF
+#else
+#define PRINT_BLT(...)
+#endif
+
+/* The optimal Bezier control point offset for radial unit
+ * see: https://spencermortensen.com/articles/bezier-circle/
+ **/
+#define BEZIER_OPTIM_CIRCLE 0.551915024494f
+
+/* Draw lines for control points of Bezier curves */
+#define BEZIER_DBG_CONTROL_POINTS 0
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+/**
+ * Fills vg_lite_buffer_t structure according given parameters.
+ *
+ * @param[in/out] vgbuf Buffer structure to be filled
+ * @param[in] width Width of buffer in pixels
+ * @param[in] height Height of buffer in pixels
+ * @param[in] stride Stride of the buffer in bytes
+ * @param[in] ptr Pointer to the buffer (must be aligned according VG-Lite requirements)
+ * @param[in] source Boolean to check if this is a source buffer
+ */
+lv_res_t lv_vglite_init_buf(vg_lite_buffer_t * vgbuf, uint32_t width, uint32_t height, uint32_t stride,
+ const lv_color_t * ptr, bool source);
+
+#if BLIT_DBG_AREAS
+/**
+ * Draw a simple rectangle, 1 px line width.
+ *
+ * @param dest_buf Destination buffer
+ * @param dest_width Destination buffer width (must be aligned on 16px)
+ * @param dest_height Destination buffer height
+ * @param fill_area Rectangle coordinates
+ * @param color Rectangle color
+ */
+void lv_vglite_dbg_draw_rectangle(lv_color_t * dest_buf, lv_coord_t dest_width, lv_coord_t dest_height,
+ lv_area_t * fill_area, lv_color_t color);
+#endif
+
+/**
+ * Clean & invalidate cache.
+ */
+void lv_vglite_invalidate_cache(void);
+
+/**********************
+ * MACROS
+ **********************/
+
+#define VG_LITE_COND_STOP(cond, txt) \
+ do { \
+ if (cond) { \
+ LV_LOG_ERROR("%s. STOP!", txt); \
+ for ( ; ; ); \
+ } \
+ } while(0)
+
+#if LV_GPU_NXP_VG_LITE_LOG_ERRORS
+#define VG_LITE_ERR_RETURN_INV(err, fmt, ...) \
+ do { \
+ if(err != VG_LITE_SUCCESS) { \
+ LV_LOG_ERROR(fmt, ##__VA_ARGS__); \
+ return LV_RES_INV; \
+ } \
+ } while (0)
+#else
+#define VG_LITE_ERR_RETURN_INV(err, fmt, ...) \
+ do { \
+ if(err != VG_LITE_SUCCESS) { \
+ return LV_RES_INV; \
+ } \
+ }while(0)
+#endif /*LV_GPU_NXP_VG_LITE_LOG_ERRORS*/
+
+#if LV_GPU_NXP_VG_LITE_LOG_TRACES
+#define VG_LITE_LOG_TRACE(fmt, ...) \
+ do { \
+ LV_LOG_ERROR(fmt, ##__VA_ARGS__); \
+ } while (0)
+
+#define VG_LITE_RETURN_INV(fmt, ...) \
+ do { \
+ LV_LOG_ERROR(fmt, ##__VA_ARGS__); \
+ return LV_RES_INV; \
+ } while (0)
+#else
+#define VG_LITE_LOG_TRACE(fmt, ...) \
+ do { \
+ } while (0)
+#define VG_LITE_RETURN_INV(fmt, ...) \
+ do { \
+ return LV_RES_INV; \
+ }while(0)
+#endif /*LV_GPU_NXP_VG_LITE_LOG_TRACES*/
+
+#endif /*LV_USE_GPU_NXP_VG_LITE*/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /*LV_GPU_NXP_VGLITE_H*/
diff --git a/src/draw/nxp_pxp/lv_gpu_nxp_pxp.c b/src/draw/nxp_pxp/lv_gpu_nxp_pxp.c
deleted file mode 100644
index a6fb49b7b..000000000
--- a/src/draw/nxp_pxp/lv_gpu_nxp_pxp.c
+++ /dev/null
@@ -1,446 +0,0 @@
-/**
- * @file lv_gpu_nxp_pxp.c
- *
- */
-
-/**
- * MIT License
- *
- * Copyright (c) 2020 NXP
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights to
- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
- * the Software, and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next paragraph)
- * shall be included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
- * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
- * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- */
-
-/*********************
- * INCLUDES
- *********************/
-
-#include "lv_gpu_nxp_pxp.h"
-
-#if LV_USE_GPU_NXP_PXP
-
-#include "../misc/lv_mem.h"
-#include "../misc/lv_log.h"
-
-#include "fsl_pxp.h"
-#include "fsl_cache.h"
-
-/*********************
- * DEFINES
- *********************/
-
-#if LV_COLOR_16_SWAP
- #error Color swap not implemented. Disable LV_COLOR_16_SWAP feature.
-#endif
-
-#if LV_COLOR_DEPTH==16
- #define PXP_OUT_PIXEL_FORMAT kPXP_OutputPixelFormatRGB565
- #define PXP_AS_PIXEL_FORMAT kPXP_AsPixelFormatRGB565
- #define PXP_PS_PIXEL_FORMAT kPXP_PsPixelFormatRGB565
-#else
- #error Only 16bit color depth is supported. Set LV_COLOR_DEPTH to 16.
-#endif
-
-/**********************
- * TYPEDEFS
- **********************/
-
-/**********************
- * STATIC PROTOTYPES
- **********************/
-
-static void lv_gpu_nxp_pxp_run(void);
-static void lv_gpu_nxp_pxp_blit_recolor(lv_color_t * dest, lv_coord_t dest_width, const lv_color_t * src,
- lv_coord_t src_width,
- lv_coord_t copy_width, lv_coord_t copy_height, lv_opa_t opa, lv_color_t recolor, lv_opa_t recolorOpa);
-
-/**********************
- * STATIC VARIABLES
- **********************/
-
-static bool colorKeyEnabled = false;
-static uint32_t colorKey = 0x0;
-
-static bool recolorEnabled = false;
-static lv_color_t recolor = {.full = 0x0};
-static lv_opa_t recolorOpa = 0x0;
-
-static lv_nxp_pxp_cfg_t pxp_cfg;
-
-/**********************
- * MACROS
- **********************/
-
-/**********************
- * GLOBAL FUNCTIONS
- **********************/
-
-/**
- * Reset and initialize PXP device. This function should be called as a part
- * of display init sequence.
- *
- * @return LV_RES_OK: PXP init ok; LV_RES_INV: init error. See error log for more information.
- */
-lv_res_t lv_gpu_nxp_pxp_init(lv_nxp_pxp_cfg_t * cfg)
-{
- if(!cfg || !cfg->pxp_interrupt_deinit || !cfg->pxp_interrupt_init || !cfg->pxp_run) {
- LV_LOG_ERROR("PXP configuration error. Check callback pointers.");
- return LV_RES_INV;
- }
-
- PXP_Init(PXP);
- PXP_EnableCsc1(PXP, false); /*Disable CSC1, it is enabled by default.*/
- PXP_EnableInterrupts(PXP, kPXP_CompleteInterruptEnable);
-
- pxp_cfg = *cfg;
- if(pxp_cfg.pxp_interrupt_init() != LV_RES_OK) {
- PXP_Deinit(PXP);
- LV_LOG_ERROR("PXP interrupt init error. Check pxp_interrupt_init callback.");
- return LV_RES_INV;
- }
-
- colorKey = lv_color_to32(LV_COLOR_CHROMA_KEY);
-
- return LV_RES_OK;
-}
-
-/**
- * Disable PXP device. Should be called during display deinit sequence.
- */
-void lv_gpu_nxp_pxp_deinit(void)
-{
- pxp_cfg.pxp_interrupt_deinit();
- PXP_DisableInterrupts(PXP, kPXP_CompleteInterruptEnable);
- PXP_Deinit(LV_GPU_NXP_PXP_ID);
-}
-
-/**
- * Fill area, with optional opacity.
- *
- * @param[in/out] dest_buf destination buffer
- * @param[in] dest_width width (stride) of destination buffer in pixels
- * @param[in] fill_area area to fill
- * @param[in] color color
- * @param[in] opa transparency of the color
- */
-void lv_gpu_nxp_pxp_fill(lv_color_t * dest_buf, lv_coord_t dest_width, const lv_area_t * fill_area, lv_color_t color,
- lv_opa_t opa)
-{
- PXP_Init(LV_GPU_NXP_PXP_ID);
- PXP_EnableCsc1(LV_GPU_NXP_PXP_ID, false); /*Disable CSC1, it is enabled by default.*/
- PXP_SetProcessBlockSize(PXP, kPXP_BlockSize16); /*Block size 16x16 for higher performance*/
-
- /*OUT buffer configure*/
- pxp_output_buffer_config_t outputConfig = {
- .pixelFormat = PXP_OUT_PIXEL_FORMAT,
- .interlacedMode = kPXP_OutputProgressive,
- .buffer0Addr = (uint32_t)(dest_buf + dest_width * fill_area->y1 + fill_area->x1),
- .buffer1Addr = (uint32_t)NULL,
- .pitchBytes = dest_width * sizeof(lv_color_t),
- .width = fill_area->x2 - fill_area->x1 + 1,
- .height = fill_area->y2 - fill_area->y1 + 1,
- };
-
- PXP_SetOutputBufferConfig(LV_GPU_NXP_PXP_ID, &outputConfig);
-
- if(opa > LV_OPA_MAX) {
- /*Simple color fill without opacity - AS disabled, PS as color generator*/
- PXP_SetAlphaSurfacePosition(LV_GPU_NXP_PXP_ID, 0xFFFFU, 0xFFFFU, 0U, 0U); /*Disable AS.*/
- PXP_SetProcessSurfacePosition(LV_GPU_NXP_PXP_ID, 0xFFFFU, 0xFFFFU, 0U, 0U); /*Disable PS.*/
- PXP_SetProcessSurfaceBackGroundColor(LV_GPU_NXP_PXP_ID, lv_color_to32(color));
- }
- else {
- /*Fill with opacity - AS used as source (same as OUT), PS used as color generator, blended together*/
- pxp_as_buffer_config_t asBufferConfig;
- pxp_porter_duff_config_t pdConfig;
-
- /*Set AS to OUT*/
- asBufferConfig.pixelFormat = PXP_AS_PIXEL_FORMAT;
- asBufferConfig.bufferAddr = (uint32_t)outputConfig.buffer0Addr;
- asBufferConfig.pitchBytes = outputConfig.pitchBytes;
-
- PXP_SetAlphaSurfaceBufferConfig(LV_GPU_NXP_PXP_ID, &asBufferConfig);
- PXP_SetAlphaSurfacePosition(LV_GPU_NXP_PXP_ID, 0U, 0U, fill_area->x2 - fill_area->x1 + 1,
- fill_area->y2 - fill_area->y1 + 1);
-
- /*Disable PS, use as color generator*/
- PXP_SetProcessSurfacePosition(LV_GPU_NXP_PXP_ID, 0xFFFFU, 0xFFFFU, 0U, 0U);
- PXP_SetProcessSurfaceBackGroundColor(LV_GPU_NXP_PXP_ID, lv_color_to32(color));
-
- /*Configure Porter-Duff blending - For RGB 565 only!*/
- pdConfig.enable = 1;
- pdConfig.dstColorMode = kPXP_PorterDuffColorStraight;
- pdConfig.srcColorMode = kPXP_PorterDuffColorStraight;
- pdConfig.dstGlobalAlphaMode = kPXP_PorterDuffGlobalAlpha;
- pdConfig.srcGlobalAlphaMode = kPXP_PorterDuffGlobalAlpha;
- pdConfig.srcFactorMode = kPXP_PorterDuffFactorStraight;
- pdConfig.dstFactorMode = kPXP_PorterDuffFactorStraight;
- pdConfig.srcGlobalAlpha = opa;
- pdConfig.dstGlobalAlpha = 255 - opa;
- pdConfig.srcAlphaMode = kPXP_PorterDuffAlphaStraight; /*don't care*/
- pdConfig.dstAlphaMode = kPXP_PorterDuffAlphaStraight; /*don't care*/
- PXP_SetPorterDuffConfig(LV_GPU_NXP_PXP_ID, &pdConfig);
- }
-
- lv_gpu_nxp_pxp_run(); /*Start PXP task*/
-}
-
-/**
- * @brief BLock Image Transfer - copy rectangular image from src buffer to dst buffer with effects.
- *
- * By default, image is copied directly, with optional opacity configured by \p opa.
- * Color keying can be enabled by calling lv_gpu_nxp_pxp_enable_color_key() before calling this function.
- * Recoloring can be enabled by calling lv_gpu_nxp_pxp_enable_recolor() before calling this function.
- * Note that color keying and recoloring at the same time is not supported and black rectangle is rendered.
- *
- * @param[in/out] dest destination buffer
- * @param[in] dest_width width (stride) of destination buffer in pixels
- * @param[in] src source buffer
- * @param[in] src_with width (stride) of source buffer in pixels
- * @param[in] copy_w width of area to be copied from src to dest
- * @param[in] copy_h height of area to be copied from src to dest
- * @param[in] opa opacity of the result
- */
-void lv_gpu_nxp_pxp_blit(lv_color_t * dest, lv_coord_t dest_width, const lv_color_t * src, lv_coord_t src_width,
- lv_coord_t copy_width, lv_coord_t copy_height, lv_opa_t opa)
-{
-
- if(recolorEnabled) { /*switch to recolor version of blit*/
- lv_gpu_nxp_pxp_blit_recolor(dest, dest_width, src, src_width, copy_width, copy_height, opa, recolor, recolorOpa);
- return;
- };
-
- PXP_Init(PXP);
- PXP_EnableCsc1(PXP, false); /*Disable CSC1, it is enabled by default.*/
- PXP_SetProcessBlockSize(PXP, kPXP_BlockSize16); /*block size 16x16 for higher performance*/
-
- pxp_output_buffer_config_t outputBufferConfig;
- pxp_as_buffer_config_t asBufferConfig;
- pxp_as_blend_config_t asBlendConfig;
-
- asBlendConfig.alpha = opa;
- asBlendConfig.invertAlpha = false;
- asBlendConfig.alphaMode = kPXP_AlphaRop;
- asBlendConfig.ropMode = kPXP_RopMergeAs;
-
- if(opa >= LV_OPA_MAX && !colorKeyEnabled) {
- /*Simple blit, no effect - Disable PS buffer*/
- PXP_SetProcessSurfacePosition(LV_GPU_NXP_PXP_ID, 0xFFFFU, 0xFFFFU, 0U, 0U);
- }
- else {
- /*Alpha blending or color keying enabled - PS must be enabled to fetch background pixels
- PS and OUT buffers are the same, blend will be done in-place*/
- pxp_ps_buffer_config_t psBufferConfig = {
- .pixelFormat = PXP_PS_PIXEL_FORMAT,
- .swapByte = false,
- .bufferAddr = (uint32_t)dest,
- .bufferAddrU = 0U,
- .bufferAddrV = 0U,
- .pitchBytes = dest_width * sizeof(lv_color_t)
- };
- asBlendConfig.alphaMode = kPXP_AlphaOverride;
- PXP_SetProcessSurfaceBufferConfig(LV_GPU_NXP_PXP_ID, &psBufferConfig);
- PXP_SetProcessSurfacePosition(LV_GPU_NXP_PXP_ID, 0U, 0U, copy_width - 1, copy_height - 1);
- }
-
- /*AS buffer - source image*/
- asBufferConfig.pixelFormat = PXP_AS_PIXEL_FORMAT;
- asBufferConfig.bufferAddr = (uint32_t)src;
- asBufferConfig.pitchBytes = src_width * sizeof(lv_color_t);
- PXP_SetAlphaSurfaceBufferConfig(LV_GPU_NXP_PXP_ID, &asBufferConfig);
- PXP_SetAlphaSurfacePosition(LV_GPU_NXP_PXP_ID, 0U, 0U, copy_width - 1U, copy_height - 1U);
- PXP_SetAlphaSurfaceBlendConfig(LV_GPU_NXP_PXP_ID, &asBlendConfig);
-
- if(colorKeyEnabled) {
- PXP_SetAlphaSurfaceOverlayColorKey(LV_GPU_NXP_PXP_ID, colorKey, colorKey);
- }
- PXP_EnableAlphaSurfaceOverlayColorKey(LV_GPU_NXP_PXP_ID, colorKeyEnabled);
-
- /*Output buffer.*/
- outputBufferConfig.pixelFormat = (pxp_output_pixel_format_t)PXP_OUT_PIXEL_FORMAT;
- outputBufferConfig.interlacedMode = kPXP_OutputProgressive;
- outputBufferConfig.buffer0Addr = (uint32_t)dest;
- outputBufferConfig.buffer1Addr = (uint32_t)0U;
- outputBufferConfig.pitchBytes = dest_width * sizeof(lv_color_t);
- outputBufferConfig.width = copy_width;
- outputBufferConfig.height = copy_height;
- PXP_SetOutputBufferConfig(LV_GPU_NXP_PXP_ID, &outputBufferConfig);
-
- lv_gpu_nxp_pxp_run(); /* Start PXP task */
-}
-
-/**
- * @brief Enable color keying for subsequent calls to lv_gpu_nxp_pxp_blit()
- *
- * Color key is defined by symbol in lv_conf.h
- */
-void lv_gpu_nxp_pxp_enable_color_key(void)
-{
- colorKeyEnabled = true;
-}
-
-/**
- * @brief Disable color keying for subsequent calls to lv_gpu_nxp_pxp_blit()
- *
- */
-void lv_gpu_nxp_pxp_disable_color_key(void)
-{
- colorKeyEnabled = false;
-}
-
-/**
- * @brief Enable recolor feature for subsequent calls to lv_gpu_nxp_pxp_blit()
- *
- * @param[in] color recolor value
- * @param[in] opa effect opacity
- */
-void lv_gpu_nxp_pxp_enable_recolor(lv_color_t color, lv_opa_t opa)
-{
- recolorEnabled = true;
- recolor = color;
- recolorOpa = opa;
-
-}
-
-/**
- * @brief Disable recolor feature for subsequent calls to lv_gpu_nxp_pxp_blit()
- */
-void lv_gpu_nxp_pxp_disable_recolor(void)
-{
- recolorEnabled = false;
-}
-
-/**********************
- * STATIC FUNCTIONS
- **********************/
-
-/**
- * @brief Start PXP job and wait for results
- *
- * Function used internally to start PXP task according current device
- * configuration.
- */
-static void lv_gpu_nxp_pxp_run(void)
-{
- lv_disp_t * disp = _lv_refr_get_disp_refreshing();
-
- if(disp && disp->driver->clean_dcache_cb) { /* Clean & invalidate cache */
- disp->driver->clean_dcache_cb(disp->driver);
- }
-
- pxp_cfg.pxp_run();
-}
-
-/**
- * @brief BLock Image Transfer - copy rectangular image from src buffer to dst buffer with recoloring.
- *
- * Note that color keying and recoloring at the same time is not supported and black rectangle is rendered.
- *
- * @param[in/out] dest destination buffer
- * @param[in] dest_width width (stride) of destination buffer in pixels
- * @param[in] src source buffer
- * @param[in] src_with width (stride) of source buffer in pixels
- * @param[in] copy_w width of area to be copied from src to dest
- * @param[in] copy_h height of area to be copied from src to dest
- * @param[in] opa opacity of the result
- * @param[in] recolor recolor value
- * @param[in] recolorOpa effect opacity
- */
-static void lv_gpu_nxp_pxp_blit_recolor(lv_color_t * dest, lv_coord_t dest_width, const lv_color_t * src,
- lv_coord_t src_width,
- lv_coord_t copy_width, lv_coord_t copy_height, lv_opa_t opa, lv_color_t recolor, lv_opa_t recolorOpa)
-{
- pxp_output_buffer_config_t outputBufferConfig;
- pxp_as_buffer_config_t asBufferConfig;
-
- if(colorKeyEnabled) {
- /*should never get here, recolor & color keying not supported. Draw black box instead.*/
- const lv_area_t fill_area = {.x1 = 0, .y1 = 0, .x2 = copy_width - 1, .y2 = copy_height - 1};
- lv_gpu_nxp_pxp_fill(dest, dest_width, &fill_area, lv_color_black(), LV_OPA_MAX);
- LV_LOG_WARN("Recoloring and color keying is not supported. Black rectangle rendered.");
- return ;
- }
- else {
- /*Recoloring without color keying*/
- if(opa > LV_OPA_MAX) {
- /*Recolor with full opacity - AS source image, PS color generator, OUT destination*/
- PXP_Init(PXP);
- PXP_EnableCsc1(PXP, false); /*Disable CSC1, it is enabled by default.*/
- PXP_SetProcessBlockSize(PXP, kPXP_BlockSize16); /*block size 16x16 for higher performance*/
-
- /*AS buffer - source image*/
- asBufferConfig.pixelFormat = PXP_AS_PIXEL_FORMAT;
- asBufferConfig.bufferAddr = (uint32_t)src;
- asBufferConfig.pitchBytes = src_width * sizeof(lv_color_t);
- PXP_SetAlphaSurfaceBufferConfig(LV_GPU_NXP_PXP_ID, &asBufferConfig);
- PXP_SetAlphaSurfacePosition(LV_GPU_NXP_PXP_ID, 0U, 0U, copy_width - 1U, copy_height - 1U);
-
- /*Disable PS buffer, use as color generator*/
- PXP_SetProcessSurfacePosition(LV_GPU_NXP_PXP_ID, 0xFFFFU, 0xFFFFU, 0U, 0U);
- PXP_SetProcessSurfaceBackGroundColor(LV_GPU_NXP_PXP_ID, lv_color_to32(recolor));
-
- /*Output buffer*/
- outputBufferConfig.pixelFormat = (pxp_output_pixel_format_t)PXP_OUT_PIXEL_FORMAT;
- outputBufferConfig.interlacedMode = kPXP_OutputProgressive;
- outputBufferConfig.buffer0Addr = (uint32_t)dest;
- outputBufferConfig.buffer1Addr = (uint32_t)0U;
- outputBufferConfig.pitchBytes = dest_width * sizeof(lv_color_t);
- outputBufferConfig.width = copy_width;
- outputBufferConfig.height = copy_height;
- PXP_SetOutputBufferConfig(LV_GPU_NXP_PXP_ID, &outputBufferConfig);
-
- pxp_porter_duff_config_t pdConfig;
-
- /*Configure Porter-Duff blending - For RGB 565 only!*/
- pdConfig.enable = 1;
- pdConfig.dstColorMode = kPXP_PorterDuffColorStraight;
- pdConfig.srcColorMode = kPXP_PorterDuffColorStraight;
- pdConfig.dstGlobalAlphaMode = kPXP_PorterDuffGlobalAlpha;
- pdConfig.srcGlobalAlphaMode = kPXP_PorterDuffGlobalAlpha;
- pdConfig.srcFactorMode = kPXP_PorterDuffFactorStraight;
- pdConfig.dstFactorMode = kPXP_PorterDuffFactorStraight;
- pdConfig.srcGlobalAlpha = recolorOpa;
- pdConfig.dstGlobalAlpha = 255 - recolorOpa;
- pdConfig.srcAlphaMode = kPXP_PorterDuffAlphaStraight; /*don't care*/
- pdConfig.dstAlphaMode = kPXP_PorterDuffAlphaStraight; /*don't care*/
- PXP_SetPorterDuffConfig(LV_GPU_NXP_PXP_ID, &pdConfig);
-
- lv_gpu_nxp_pxp_run(); /*Start PXP task*/
-
- }
- else {
- /*Recolor with transparency*/
-
- /*Step 1: Recolor with full opacity to temporary buffer*/
- lv_color_t * tmpBuf = (lv_color_t *)lv_mem_buf_get(copy_width * copy_height * sizeof(lv_color_t));
- lv_gpu_nxp_pxp_blit_recolor(tmpBuf, copy_width, src, src_width, copy_width, copy_height, LV_OPA_COVER, recolor,
- recolorOpa);
-
- /*Step 2: BLIT temporary results with required opacity to output*/
- lv_gpu_nxp_pxp_disable_recolor(); /*make sure to take BLIT path, not the recolor*/
- lv_gpu_nxp_pxp_blit(dest, dest_width, tmpBuf, copy_width, copy_width, copy_height, opa);
- lv_gpu_nxp_pxp_enable_recolor(recolor, recolorOpa); /*restore state*/
-
- /*Step 3: Clean-up memory*/
- lv_mem_buf_release(tmpBuf);
- }
- }
-}
-
-#endif /* LV_USE_GPU_NXP_PXP */
diff --git a/src/draw/nxp_pxp/lv_gpu_nxp_pxp.h b/src/draw/nxp_pxp/lv_gpu_nxp_pxp.h
deleted file mode 100644
index 8d812882c..000000000
--- a/src/draw/nxp_pxp/lv_gpu_nxp_pxp.h
+++ /dev/null
@@ -1,193 +0,0 @@
-/**
- * @file lv_gpu_nxp_pxp.h
- *
- */
-
-/**
- * MIT License
- *
- * Copyright (c) 2020 NXP
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights to
- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
- * the Software, and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next paragraph)
- * shall be included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
- * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
- * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- */
-
-#ifndef LV_SRC_LV_GPU_LV_GPU_NXP_PXP_H_
-#define LV_SRC_LV_GPU_LV_GPU_NXP_PXP_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*********************
- * INCLUDES
- *********************/
-
-#include "../../lv_conf_internal.h"
-
-#if LV_USE_GPU_NXP_PXP
-
-#include "../misc/lv_area.h"
-#include "../misc/lv_color.h"
-
-/*********************
- * DEFINES
- *********************/
-
-/** PXP module instance to use*/
-#define LV_GPU_NXP_PXP_ID PXP
-
-/** PXP interrupt line I*/
-#define LV_GPU_NXP_PXP_IRQ_ID PXP_IRQn
-
-#ifndef LV_GPU_NXP_PXP_BLIT_SIZE_LIMIT
-/** Minimum area (in pixels) for image copy with 100% opacity to be handled by PXP*/
-#define LV_GPU_NXP_PXP_BLIT_SIZE_LIMIT 32
-#endif
-
-#ifndef LV_GPU_NXP_PXP_BLIT_OPA_SIZE_LIMIT
-/** Minimum area (in pixels) for image copy with transparency to be handled by PXP*/
-#define LV_GPU_NXP_PXP_BLIT_OPA_SIZE_LIMIT 16
-#endif
-
-#ifndef LV_GPU_NXP_PXP_BUFF_SYNC_BLIT_SIZE_LIMIT
-/** Minimum invalidated area (in pixels) to be synchronized by PXP during buffer sync */
-#define LV_GPU_NXP_PXP_BUFF_SYNC_BLIT_SIZE_LIMIT 32
-#endif
-
-#ifndef LV_GPU_NXP_PXP_FILL_SIZE_LIMIT
-/** Minimum area (in pixels) to be filled by PXP with 100% opacity*/
-#define LV_GPU_NXP_PXP_FILL_SIZE_LIMIT 64
-#endif
-
-#ifndef LV_GPU_NXP_PXP_FILL_OPA_SIZE_LIMIT
-/** Minimum area (in pixels) to be filled by PXP with transparency*/
-#define LV_GPU_NXP_PXP_FILL_OPA_SIZE_LIMIT 32
-#endif
-
-/**********************
- * TYPEDEFS
- **********************/
-/**
- * NXP PXP device configuration - call-backs used for
- * interrupt init/wait/deinit.
- */
-typedef struct {
- /** Callback for PXP interrupt initialization*/
- lv_res_t (*pxp_interrupt_init)(void);
-
- /** Callback for PXP interrupt de-initialization*/
- void (*pxp_interrupt_deinit)(void);
-
- /** Callback that should start PXP and wait for operation complete*/
- void (*pxp_run)(void);
-} lv_nxp_pxp_cfg_t;
-
-/**********************
- * STATIC VARIABLES
- **********************/
-
-/**********************
- * MACROS
- **********************/
-
-/**********************
- * GLOBAL FUNCTIONS
- **********************/
-
-/**
- * Reset and initialize PXP device. This function should be called as a part
- * of display init sequence.
- *
- * @return LV_RES_OK: PXP init ok; LV_RES_INV: init error. See error log for more information.
- */
-lv_res_t lv_gpu_nxp_pxp_init(lv_nxp_pxp_cfg_t * cfg);
-
-/**
- * Disable PXP device. Should be called during display deinit sequence.
- */
-void lv_gpu_nxp_pxp_deinit(void);
-
-/**
- * Fill area, with optional opacity.
- *
- * @param[in/out] dest_buf destination buffer
- * @param[in] dest_width width (stride) of destination buffer in pixels
- * @param[in] fill_area area to fill
- * @param[in] color color
- * @param[in] opa transparency of the color
- */
-void lv_gpu_nxp_pxp_fill(lv_color_t * dest_buf, lv_coord_t dest_width, const lv_area_t * fill_area, lv_color_t color,
- lv_opa_t opa);
-
-/**
- * @brief BLock Image Transfer - copy rectangular image from src buffer to dst buffer with effects.
- *
- * By default, image is copied directly, with optional opacity configured by \p opa.
- * Color keying can be enabled by calling lv_gpu_nxp_pxp_enable_color_key() before calling this function.
- * Recoloring can be enabled by calling lv_gpu_nxp_pxp_enable_recolor() before calling this function.
- * Note that color keying and recoloring at the same time is not supported and black rectangle is rendered.
- *
- * @param[in/out] dest destination buffer
- * @param[in] dest_width width (stride) of destination buffer in pixels
- * @param[in] src source buffer
- * @param[in] src_with width (stride) of source buffer in pixels
- * @param[in] copy_w width of area to be copied from src to dest
- * @param[in] copy_h height of area to be copied from src to dest
- * @param[in] opa opacity of the result
- */
-void lv_gpu_nxp_pxp_blit(lv_color_t * dest, lv_coord_t dest_width, const lv_color_t * src, lv_coord_t src_width,
- lv_coord_t copy_width, lv_coord_t copy_height, lv_opa_t opa);
-
-/**
- * @brief Enable color keying for subsequent calls to lv_gpu_nxp_pxp_blit()
- *
- * Color key is defined by LV_COLOR_TRANSP symbol in lv_conf.h
- */
-void lv_gpu_nxp_pxp_enable_color_key(void);
-
-/**
- * @brief Disable color keying for subsequent calls to lv_gpu_nxp_pxp_blit()
- *
- */
-void lv_gpu_nxp_pxp_disable_color_key(void);
-
-/**
- * @brief Enable recolor feature for subsequent calls to lv_gpu_nxp_pxp_blit()
- *
- * @param[in] color recolor value
- * @param[in] opa effect opacity
- */
-void lv_gpu_nxp_pxp_enable_recolor(lv_color_t color, lv_opa_t opa);
-
-/**
- * @brief Disable recolor feature for subsequent calls to lv_gpu_nxp_pxp_blit()
- */
-void lv_gpu_nxp_pxp_disable_recolor(void);
-
-/**********************
- * STATIC FUNCTIONS
- **********************/
-
-#endif /*LV_USE_GPU_NXP_PXP*/
-
-#ifdef __cplusplus
-} /*extern "C"*/
-#endif
-
-#endif /*LV_SRC_LV_GPU_LV_GPU_NXP_PXP_H_*/
diff --git a/src/draw/nxp_vglite/lv_gpu_nxp_vglite.c b/src/draw/nxp_vglite/lv_gpu_nxp_vglite.c
deleted file mode 100644
index 43dd88179..000000000
--- a/src/draw/nxp_vglite/lv_gpu_nxp_vglite.c
+++ /dev/null
@@ -1,770 +0,0 @@
-/**
- * @file lv_gpu_nxp_vglite.c
- *
- */
-
-/**
- * MIT License
- *
- * Copyright (c) 2020 NXP
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights to
- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
- * the Software, and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next paragraph)
- * shall be included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
- * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
- * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- */
-
-/*********************
- * INCLUDES
- *********************/
-
-#include "lv_gpu_nxp_vglite.h"
-
-#if LV_USE_GPU_NXP_VG_LITE
-
-#include "lvgl.h"
-#include "../misc/lv_log.h"
-#include "fsl_cache.h"
-#include "vg_lite.h"
-#include "fsl_debug_console.h"
-
-/*********************
- * DEFINES
- *********************/
-
-#if LV_COLOR_DEPTH==16
- #define VGLITE_PX_FMT VG_LITE_RGB565
-#else
- #error Only 16bit color depth is supported. Set LV_COLOR_DEPTH to 16.
-#endif
-
-/* Enable BLIT quality degradation workaround for RT595 */
-#define RT595_BLIT_WRKRND_ENABLED 1
-
-/* If LV_HOR_RES_MAX/LV_VER_RES_MAX is higher than this value, workaround will be enabled */
-#define RT595_BLIT_WRKRND_THR 352
-
-/* Print detailed info to SDK console (NOT to LVGL log system) */
-#define BLIT_DBG_VERBOSE 0
-
-/* Draw rectangles around BLIT tiles */
-#define BLIT_DBG_AREAS 0
-
-/* Redirect PRINT to SDK PRINTF */
-#define PRINT PRINTF
-
-/* Verbose debug print */
-#if BLIT_DBG_VERBOSE
- #define PRINT_BLT PRINTF
-#else
- #define PRINT_BLT(...)
-#endif
-
-/* Internal compound symbol */
-#if (defined(CPU_MIMXRT595SFFOB) || defined(CPU_MIMXRT595SFFOB_cm33) || \
- defined(CPU_MIMXRT595SFFOC) || defined(CPU_MIMXRT595SFFOC_cm33)) && \
- ((LV_HOR_RES_MAX > RT595_BLIT_WRKRND_THR) || (LV_VER_RES_MAX > RT595_BLIT_WRKRND_THR)) && \
- RT595_BLIT_WRKRND_ENABLED
-#define _BLIT_SPLIT_ENABLED 1
-#else
-#define _BLIT_SPLIT_ENABLED 0
-#endif
-
-/* BLIT split threshold - BLITs with width or height higher than this value will be done
- * in multiple steps. Value must be 16-aligned. Don't change.
- * */
-#define LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR 352
-
-
-/**********************
- * TYPEDEFS
- **********************/
-
-/**********************
- * STATIC PROTOTYPES
- **********************/
-
-static lv_res_t _init_vg_buf(vg_lite_buffer_t * dst, uint32_t width, uint32_t height, uint32_t stride,
- const lv_color_t * ptr, bool source);
-
-static lv_res_t _lv_gpu_nxp_vglite_blit_single(lv_gpu_nxp_vglite_blit_info_t * blit);
-#if _BLIT_SPLIT_ENABLED
-static void _align_x(lv_area_t * area, lv_color_t ** buf);
-static void _align_y(lv_area_t * area, lv_color_t ** buf, uint32_t stridePx);
-static void _sw_blit(lv_gpu_nxp_vglite_blit_info_t * blit);
-#if BLIT_DBG_AREAS
-static void _draw_rectangle(lv_color_t * dest_buf, lv_coord_t dest_width, lv_coord_t dest_height,
- lv_area_t * fill_area, lv_color_t color);
-#endif
-static lv_res_t _lv_gpu_nxp_vglite_check_blit(lv_gpu_nxp_vglite_blit_info_t * blit);
-#endif
-
-/**********************
- * STATIC VARIABLES
- **********************/
-
-/**********************
- * MACROS
- **********************/
-
-#define CHECK(cond, txt) \
- do { \
- if (cond) { \
- PRINT("%s. STOP!\n", txt); \
- for ( ; ; ); \
- } \
- } while(0)
-
-/**********************
- * GLOBAL FUNCTIONS
- **********************/
-
-/***
- * Fills rectangular area in buffer.
- * @param[in] dest_buf Destination buffer pointer (must be aligned on 32 bytes)
- * @param[in] dest_width Destination buffer width in pixels (must be aligned on 16 px)
- * @param[in] dest_height Destination buffer height in pixels
- * @param[in] fill_area Area to be filled
- * @param[in] color Fill color
- * @param[in] opa Opacity (255 = full, 128 = 50% background/50% color, 0 = no fill)
- * @retval LV_RES_OK Fill completed
- * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS)
- */
-lv_res_t lv_gpu_nxp_vglite_fill(lv_color_t * dest_buf, lv_coord_t dest_width, lv_coord_t dest_height,
- const lv_area_t * fill_area, lv_color_t color, lv_opa_t opa)
-{
- vg_lite_buffer_t rt;
- vg_lite_rectangle_t rect;
- vg_lite_error_t err = VG_LITE_SUCCESS;
- lv_color32_t col32 = {.full = lv_color_to32(color)}; /*Convert color to RGBA8888*/
- lv_disp_t * disp = _lv_refr_get_disp_refreshing();
-
- if(_init_vg_buf(&rt, (uint32_t) dest_width, (uint32_t) dest_height, (uint32_t) dest_width * sizeof(lv_color_t),
- (const lv_color_t *) dest_buf, false) != LV_RES_OK) {
-#if LV_GPU_NXP_VG_LITE_LOG_ERRORS
- LV_LOG_ERROR("init_vg_buf reported error. Fill failed.");
-#endif
- return LV_RES_INV;
- }
-
- if(opa >= (lv_opa_t) LV_OPA_MAX) { /*Opaque fill*/
- rect.x = fill_area->x1;
- rect.y = fill_area->y1;
- rect.width = (int32_t) fill_area->x2 - (int32_t) fill_area->x1 + 1;
- rect.height = (int32_t) fill_area->y2 - (int32_t) fill_area->y1 + 1;
-
- if(disp != NULL && disp->driver->clean_dcache_cb != NULL) { /*Clean & invalidate cache*/
- disp->driver->clean_dcache_cb(disp->driver);
- }
-
- err = vg_lite_clear(&rt, &rect, col32.full);
- if(err != VG_LITE_SUCCESS) {
-#if LV_GPU_NXP_VG_LITE_LOG_ERRORS
- LV_LOG_ERROR("vg_lite_clear reported error. Fill failed.");
-#endif
- return LV_RES_INV;
- }
- err = vg_lite_finish();
- if(err != VG_LITE_SUCCESS) {
-#if LV_GPU_NXP_VG_LITE_LOG_ERRORS
- LV_LOG_ERROR("vg_lite_finish reported error. Fill failed.");
-#endif
- return LV_RES_INV;
- }
- }
- else { /*fill with transparency*/
-
- vg_lite_path_t path;
- lv_color32_t colMix;
- int16_t path_data[] = { /*VG rectangular path*/
- VLC_OP_MOVE, fill_area->x1, fill_area->y1,
- VLC_OP_LINE, fill_area->x2 + 1, fill_area->y1,
- VLC_OP_LINE, fill_area->x2 + 1, fill_area->y2 + 1,
- VLC_OP_LINE, fill_area->x1, fill_area->y2 + 1,
- VLC_OP_LINE, fill_area->x1, fill_area->y1,
- VLC_OP_END
- };
-
- err = vg_lite_init_path(&path, VG_LITE_S16, VG_LITE_LOW, sizeof(path_data), path_data,
- (vg_lite_float_t) fill_area->x1, (vg_lite_float_t) fill_area->y1, ((vg_lite_float_t) fill_area->x2) + 1.0f,
- ((vg_lite_float_t) fill_area->y2) + 1.0f);
- if(err != VG_LITE_SUCCESS) {
-#if LV_GPU_NXP_VG_LITE_LOG_ERRORS
- LV_LOG_ERROR("vg_lite_init_path() failed.");
-#endif
- return LV_RES_INV;
- }
-
- colMix.ch.red = (uint8_t)(((uint16_t)col32.ch.red * opa) >> 8); /*Pre-multiply color*/
- colMix.ch.green = (uint8_t)(((uint16_t)col32.ch.green * opa) >> 8);
- colMix.ch.blue = (uint8_t)(((uint16_t)col32.ch.blue * opa) >> 8);
- colMix.ch.alpha = opa;
-
- if((disp != NULL) && (disp->driver->clean_dcache_cb != NULL)) { /*Clean & invalidate cache*/
- disp->driver->clean_dcache_cb(disp->driver);
- }
-
- vg_lite_matrix_t matrix;
- vg_lite_identity(&matrix);
-
- /*Draw rectangle*/
- err = vg_lite_draw(&rt, &path, VG_LITE_FILL_EVEN_ODD, &matrix, VG_LITE_BLEND_SRC_OVER, colMix.full);
- if(err != VG_LITE_SUCCESS) {
-#if LV_GPU_NXP_VG_LITE_LOG_ERRORS
- LV_LOG_ERROR("vg_lite_draw() failed.");
-#endif
- vg_lite_clear_path(&path);
- return LV_RES_INV;
- }
-
- err = vg_lite_finish();
- if(err != VG_LITE_SUCCESS) {
-#if LV_GPU_NXP_VG_LITE_LOG_ERRORS
- LV_LOG_ERROR("vg_lite_finish() failed.");
-#endif
- return LV_RES_INV;
- }
-
- err = vg_lite_clear_path(&path);
- if(err != VG_LITE_SUCCESS) {
-#if LV_GPU_NXP_VG_LITE_LOG_ERRORS
- LV_LOG_ERROR("vg_lite_clear_path() failed.");
-#endif
- return LV_RES_INV;
- }
- }
-
- if(err == VG_LITE_SUCCESS) {
- return LV_RES_OK;
- }
- else {
-#if LV_GPU_NXP_VG_LITE_LOG_ERRORS
- LV_LOG_ERROR("VG Lite Fill failed.");
-#endif
- return LV_RES_INV;
- }
-}
-
-/***
- * BLock Image Transfer.
- * @param[in] blit Description of the transfer
- * @retval LV_RES_OK Transfer complete
- * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS)
- */
-lv_res_t lv_gpu_nxp_vglite_blit(lv_gpu_nxp_vglite_blit_info_t * blit)
-{
-#if _BLIT_SPLIT_ENABLED
-
- lv_res_t rv = LV_RES_INV;
-
- if(_lv_gpu_nxp_vglite_check_blit(blit) != LV_RES_OK) {
- PRINT_BLT("Blit check failed\n");
- return LV_RES_INV;
- }
-
- PRINT_BLT("BLIT from: "
- "Area: %03d,%03d - %03d,%03d "
- "Addr: %d\n\n",
- blit->src_area.x1, blit->src_area.y1,
- blit->src_area.x2, blit->src_area.y2,
- (uintptr_t) blit->src);
-
- PRINT_BLT("BLIT to: "
- "Area: %03d,%03d - %03d,%03d "
- "Addr: %d\n\n",
- blit->dst_area.x1, blit->dst_area.y1,
- blit->dst_area.x2, blit->dst_area.y2,
- (uintptr_t) blit->src);
-
- /* Stage 1: Move starting pointers as close as possible to [x1, y1], so coordinates are as small as possible. */
- _align_x(&blit->src_area, (lv_color_t **)&blit->src);
- _align_y(&blit->src_area, (lv_color_t **)&blit->src, blit->src_stride / sizeof(lv_color_t));
- _align_x(&blit->dst_area, (lv_color_t **)&blit->dst);
- _align_y(&blit->dst_area, (lv_color_t **)&blit->dst, blit->dst_stride / sizeof(lv_color_t));
-
- /* Stage 2: If we're in limit, do a single BLIT */
- if((blit->src_area.x2 < LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR) &&
- (blit->src_area.y2 < LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR)) {
- PRINT_BLT("Simple blit!\n");
- return _lv_gpu_nxp_vglite_blit_single(blit);
- };
-
- /* Stage 3: Split the BLIT into multiple tiles */
- PRINT_BLT("Split blit!\n");
-
- PRINT_BLT("Blit "
- "([%03d,%03d], [%03d,%03d]) -> "
- "([%03d,%03d], [%03d,%03d]) | "
- "([%03dx%03d] -> [%03dx%03d]) | "
- "A:(%d -> %d)\n",
- blit->src_area.x1, blit->src_area.y1, blit->src_area.x2, blit->src_area.y2,
- blit->dst_area.x1, blit->dst_area.y1, blit->dst_area.x2, blit->dst_area.y2,
- lv_area_get_width(&blit->src_area), lv_area_get_height(&blit->src_area),
- lv_area_get_width(&blit->dst_area), lv_area_get_height(&blit->dst_area),
- (uintptr_t) blit->src, (uintptr_t) blit->dst);
-
-
- uint32_t totalWidth = lv_area_get_width(&blit->src_area);
- uint32_t totalHeight = lv_area_get_height(&blit->src_area);
-
- lv_gpu_nxp_vglite_blit_info_t tileBlit;
-
- /* Number of tiles needed */
- int totalTilesX = (blit->src_area.x1 + totalWidth + LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1) /
- LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR;
- int totalTilesY = (blit->src_area.y1 + totalHeight + LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1) /
- LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR;
-
- /* src and dst buffer shift against each other. Src buffer real data [0,0] may start actually at [3,0] in buffer, as
- * the buffer pointer has to be aligned, while dst buffer real data [0,0] may start at [1,0] in buffer. alignment may be
- * different */
- int shiftSrcX = (blit->src_area.x1 > blit->dst_area.x1) ? (blit->src_area.x1 - blit->dst_area.x1) : 0;
- int shiftDstX = (blit->src_area.x1 < blit->dst_area.x1) ? (blit->dst_area.x1 - blit->src_area.x1) : 0;
-
- PRINT_BLT("\n");
- PRINT_BLT("Align shift: src: %d, dst: %d\n", shiftSrcX, shiftDstX);
-
- tileBlit = *blit;
-
- for(int tileY = 0; tileY < totalTilesY; tileY++) {
-
- tileBlit.src_area.y1 = 0; /* no vertical alignment, always start from 0 */
- tileBlit.src_area.y2 = totalHeight - tileY * LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1;
- if(tileBlit.src_area.y2 >= LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR) {
- tileBlit.src_area.y2 = LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1; /* Should never happen */
- }
- tileBlit.src = blit->src + tileY * LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR * blit->src_stride / sizeof(
- lv_color_t); /* stride in px! */
-
- tileBlit.dst_area.y1 = tileBlit.src_area.y1; /* y has no alignment, always in sync with src */
- tileBlit.dst_area.y2 = tileBlit.src_area.y2;
-
- tileBlit.dst = blit->dst + tileY * LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR * blit->dst_stride / sizeof(
- lv_color_t); /* stride in px! */
-
- for(int tileX = 0; tileX < totalTilesX; tileX++) {
-
- if(tileX == 0) {
- /* 1st tile is special - there may be a gap between buffer start pointer
- * and area.x1 value, as the pointer has to be aligned.
- * tileBlit.src pointer - keep init value from Y-loop.
- * Also, 1st tile start is not shifted! shift is applied from 2nd tile */
- tileBlit.src_area.x1 = blit->src_area.x1;
- tileBlit.dst_area.x1 = blit->dst_area.x1;
- }
- else {
- /* subsequent tiles always starts from 0, but shifted*/
- tileBlit.src_area.x1 = 0 + shiftSrcX;
- tileBlit.dst_area.x1 = 0 + shiftDstX;
- /* and advance start pointer + 1 tile size */
- tileBlit.src += LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR;
- tileBlit.dst += LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR;
- }
-
- /* Clip tile end coordinates */
- tileBlit.src_area.x2 = totalWidth + blit->src_area.x1 - tileX * LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1;
- if(tileBlit.src_area.x2 >= LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR) {
- tileBlit.src_area.x2 = LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1;
- }
-
- tileBlit.dst_area.x2 = totalWidth + blit->dst_area.x1 - tileX * LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1;
- if(tileBlit.dst_area.x2 >= LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR) {
- tileBlit.dst_area.x2 = LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1;
- }
-
- if(tileX < (totalTilesX - 1)) {
- /* And adjust end coords if shifted, but not for last tile! */
- tileBlit.src_area.x2 += shiftSrcX;
- tileBlit.dst_area.x2 += shiftDstX;
- }
-
- rv = _lv_gpu_nxp_vglite_blit_single(&tileBlit);
-
-#if BLIT_DBG_AREAS
- _draw_rectangle((lv_color_t *) tileBlit.dst, tileBlit.dst_width, tileBlit.dst_height, &tileBlit.dst_area, LV_COLOR_RED);
- _draw_rectangle((lv_color_t *) tileBlit.src, tileBlit.src_width, tileBlit.src_height, &tileBlit.src_area,
- LV_COLOR_GREEN);
-#endif
-
- PRINT_BLT("Tile [%d, %d]: "
- "([%d,%d], [%d,%d]) -> "
- "([%d,%d], [%d,%d]) | "
- "([%dx%d] -> [%dx%d]) | "
- "A:(0x%8X -> 0x%8X) %s\n",
- tileX, tileY,
- tileBlit.src_area.x1, tileBlit.src_area.y1, tileBlit.src_area.x2, tileBlit.src_area.y2,
- tileBlit.dst_area.x1, tileBlit.dst_area.y1, tileBlit.dst_area.x2, tileBlit.dst_area.y2,
- lv_area_get_width(&tileBlit.src_area), lv_area_get_height(&tileBlit.src_area),
- lv_area_get_width(&tileBlit.dst_area), lv_area_get_height(&tileBlit.dst_area),
- (uintptr_t) tileBlit.src, (uintptr_t) tileBlit.dst,
- rv == LV_RES_OK ? "OK!" : "!!! FAILED !!!");
-
- if(rv != LV_RES_OK) { /* if anything goes wrong... */
-#if LV_GPU_NXP_VG_LITE_LOG_ERRORS
- LV_LOG_ERROR("Split BLIT failed. Trying SW BLIT instead.");
-#endif
- _sw_blit(&tileBlit);
- rv = LV_RES_OK; /* Don't report error, as SW BLIT was performed */
- }
-
- }
- PRINT_BLT(" \n");
- }
-
- return rv; /* should never fail */
-
-#else /* non RT595 */
- /* Just pass down */
- return _lv_gpu_nxp_vglite_blit_single(blit);
-#endif
-}
-
-/**********************
- * STATIC FUNCTIONS
- **********************/
-
-/***
- * BLock Image Transfer - single direct BLIT.
- * @param[in] blit Description of the transfer
- * @retval LV_RES_OK Transfer complete
- * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS)
- */
-static lv_res_t _lv_gpu_nxp_vglite_blit_single(lv_gpu_nxp_vglite_blit_info_t * blit)
-{
- vg_lite_buffer_t src_vgbuf, dst_vgbuf;
- vg_lite_error_t err = VG_LITE_SUCCESS;
- uint32_t rect[4];
- lv_disp_t * disp = _lv_refr_get_disp_refreshing();
-
- if(blit == NULL) {
- /*Wrong parameter*/
- return LV_RES_INV;
- }
-
- if(blit->opa < (lv_opa_t) LV_OPA_MIN) {
- return LV_RES_OK; /*Nothing to BLIT*/
- }
-
- /*Wrap src/dst buffer into VG-Lite buffer*/
- if(_init_vg_buf(&src_vgbuf, (uint32_t) blit->src_width, (uint32_t) blit->src_height, (uint32_t) blit->src_stride,
- blit->src, true) != LV_RES_OK) {
-#if LV_GPU_NXP_VG_LITE_LOG_ERRORS
- LV_LOG_ERROR("init_vg_buf reported error. BLIT failed.");
-#endif
- return LV_RES_INV;
- }
-
- if(_init_vg_buf(&dst_vgbuf, (uint32_t) blit->dst_width, (uint32_t) blit->dst_height, (uint32_t) blit->dst_stride,
- blit->dst, false) != LV_RES_OK) {
-#if LV_GPU_NXP_VG_LITE_LOG_ERRORS
- LV_LOG_ERROR("init_vg_buf reported error. BLIT failed.");
-#endif
- return LV_RES_INV;
- }
-
- rect[0] = (uint32_t) blit->src_area.x1; /* start x */
- rect[1] = (uint32_t) blit->src_area.y1; /* start y */
- rect[2] = (uint32_t) blit->src_area.x2 - (uint32_t) blit->src_area.x1 + 1U; /* width */
- rect[3] = (uint32_t) blit->src_area.y2 - (uint32_t) blit->src_area.y1 + 1U; /* height */
-
- vg_lite_matrix_t matrix;
- vg_lite_identity(&matrix);
- vg_lite_translate((vg_lite_float_t)blit->dst_area.x1, (vg_lite_float_t)blit->dst_area.y1, &matrix);
-
- if((disp != NULL) && (disp->driver->clean_dcache_cb != NULL)) { /*Clean & invalidate cache*/
- disp->driver->clean_dcache_cb(disp->driver);
- }
-
- uint32_t color;
- vg_lite_blend_t blend;
- if(blit->opa >= (uint8_t) LV_OPA_MAX) {
- color = 0x0;
- blend = VG_LITE_BLEND_NONE;
- }
- else {
- uint32_t opa = (uint32_t) blit->opa;
- color = (opa << 24) | (opa << 16) | (opa << 8) | opa;
- blend = VG_LITE_BLEND_SRC_OVER;
- src_vgbuf.image_mode = VG_LITE_MULTIPLY_IMAGE_MODE;
- }
-
- err = vg_lite_blit_rect(&dst_vgbuf, &src_vgbuf, rect, &matrix, blend, color, VG_LITE_FILTER_POINT);
- if(err != VG_LITE_SUCCESS) {
-#if LV_GPU_NXP_VG_LITE_LOG_ERRORS
- LV_LOG_ERROR("vg_lite_blit_rect() failed.");
-#endif
- return LV_RES_INV;
- }
-
- err = vg_lite_finish();
- if(err != VG_LITE_SUCCESS) {
-#if LV_GPU_NXP_VG_LITE_LOG_ERRORS
- LV_LOG_ERROR("vg_lite_finish() failed.");
-#endif
- return LV_RES_INV;
- }
-
- if(err == VG_LITE_SUCCESS) {
- return LV_RES_OK;
- }
- else {
-#if LV_GPU_NXP_VG_LITE_LOG_ERRORS
- LV_LOG_ERROR("vg_lite_blit_rect or vg_lite_finish reported error. BLIT failed.");
-#endif
- return LV_RES_INV;
- }
-}
-
-/***
- * Fills vg_lite_buffer_t structure according given parameters.
- * @param[out] dst Buffer structure to be filled
- * @param[in] width Width of buffer in pixels
- * @param[in] height Height of buffer in pixels
- * @param[in] stride Stride of the buffer in bytes
- * @param[in] ptr Pointer to the buffer (must be aligned according VG-Lite requirements)
- */
-static lv_res_t _init_vg_buf(vg_lite_buffer_t * dst, uint32_t width, uint32_t height, uint32_t stride,
- const lv_color_t * ptr, bool source)
-{
- if((((uintptr_t)ptr) % (uintptr_t)LV_ATTRIBUTE_MEM_ALIGN_SIZE) != 0x0U) { /*Test for alignment*/
-#if LV_GPU_NXP_VG_LITE_LOG_ERRORS
- LV_LOG_ERROR("ptr (0x%X) not aligned to %d.", (size_t) ptr, LV_ATTRIBUTE_MEM_ALIGN_SIZE);
-#endif
- return LV_RES_INV;
- }
-
- if(source &&
- (stride % (LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX * sizeof(lv_color_t))) != 0x0U) { /*Test for stride alignment*/
-#if LV_GPU_NXP_VG_LITE_LOG_ERRORS
- LV_LOG_ERROR("Buffer stride (%d px) not aligned to %d bytes.", stride,
- LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX * sizeof(lv_color_t));
-#endif
- return LV_RES_INV;
- }
-
- dst->format = VGLITE_PX_FMT;
- dst->tiled = VG_LITE_LINEAR;
- dst->image_mode = VG_LITE_NORMAL_IMAGE_MODE;
- dst->transparency_mode = VG_LITE_IMAGE_OPAQUE;
-
- dst->width = (int32_t) width;
- dst->height = (int32_t) height;
- dst->stride = (int32_t) stride;
-
- void * r_ptr = memset(&dst->yuv, 0, sizeof(dst->yuv));
- if(r_ptr == NULL) {
- return LV_RES_INV;
- }
-
- dst->memory = (void *)ptr;
- dst->address = (uint32_t) dst->memory;
- dst->handle = NULL;
-
- return LV_RES_OK;
-}
-
-#if _BLIT_SPLIT_ENABLED
-
-/**
- * Software BLIT as a fall-back scenario
- * @param[in] blit BLIT configuration
- */
-static void _sw_blit(lv_gpu_nxp_vglite_blit_info_t * blit)
-{
- int x, y;
-
- lv_coord_t w = lv_area_get_width(&blit->src_area);
- lv_coord_t h = lv_area_get_height(&blit->src_area);
-
- uint32_t srcStridePx = blit->src_stride / sizeof(lv_color_t);
- uint32_t dstStridePx = blit->dst_stride / sizeof(lv_color_t);
-
- lv_color_t * src = (lv_color_t *)blit->src + blit->src_area.y1 * srcStridePx + blit->src_area.x1;
- lv_color_t * dst = (lv_color_t *)blit->dst + blit->dst_area.y1 * dstStridePx + blit->dst_area.x1;
-
- if(blit->opa >= LV_OPA_MAX) {
- /* simple copy */
- for(y = 0; y < h; y++) {
- _lv_memcpy(dst, src, w * sizeof(lv_color_t));
- src += srcStridePx;
- dst += dstStridePx;
- }
- }
- else if(blit->opa >= LV_OPA_MIN) {
- /* alpha blending */
- for(y = 0; y < h; y++) {
- for(x = 0; x < w; x++) {
- dst[x] = lv_color_mix(src[x], dst[x], blit->opa);
- }
- src += srcStridePx;
- dst += dstStridePx;
- }
- }
-}
-
-/**
- * Verify BLIT structure - widths, stride, pointer alignment
- * @param[in] blit
- * @return
- */
-static lv_res_t _lv_gpu_nxp_vglite_check_blit(lv_gpu_nxp_vglite_blit_info_t * blit)
-{
-
- if(lv_area_get_width(&blit->src_area) < LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX) { /* Test for minimal width */
-#if LV_GPU_NXP_VG_LITE_LOG_ERRORS
- LV_LOG_ERROR("source area width (%d) is smaller than required (%d).", lv_area_get_width(&blit->src_area),
- LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX);
-#endif
- return LV_RES_INV;
- }
-
- if(lv_area_get_width(&blit->dst_area) < LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX) { /* Test for minimal width */
-#if LV_GPU_NXP_VG_LITE_LOG_ERRORS
- LV_LOG_ERROR("destination area width (%d) is smaller than required (%d).", lv_area_get_width(&blit->dst_area),
- LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX);
-#endif
- return LV_RES_INV;
- }
-
- if((((uintptr_t) blit->src) % LV_ATTRIBUTE_MEM_ALIGN_SIZE) != 0x0) { /* Test for pointer alignment */
-#if LV_GPU_NXP_VG_LITE_LOG_ERRORS
- LV_LOG_ERROR("source buffer ptr (0x%X) not aligned to %d.", (size_t) blit->src, LV_ATTRIBUTE_MEM_ALIGN_SIZE);
-#endif
- return LV_RES_INV;
- }
- /* No alignment requirement for destination pixel buffer when using mode VG_LITE_LINEAR */
-
- if((blit->src_stride % (LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX * LV_COLOR_DEPTH / 8)) !=
- 0x0) { /* Test for stride alignment */
-#if LV_GPU_NXP_VG_LITE_LOG_ERRORS
- LV_LOG_ERROR("source buffer stride (%d px) not aligned to %d px.", blit->src_stride,
- LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX);
-#endif
- return LV_RES_INV;
- }
-
- if((blit->dst_stride % (LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX * LV_COLOR_DEPTH / 8)) !=
- 0x0) { /* Test for stride alignment */
-#if LV_GPU_NXP_VG_LITE_LOG_ERRORS
- LV_LOG_ERROR("destination buffer stride (%d px) not aligned to %d px.", blit->dst_stride,
- LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX);
-#endif
- return LV_RES_INV;
- }
-
- if((lv_area_get_width(&blit->src_area) != lv_area_get_width(&blit->dst_area)) ||
- (lv_area_get_height(&blit->src_area) != lv_area_get_height(&blit->dst_area))) {
-#if LV_GPU_NXP_VG_LITE_LOG_ERRORS
- LV_LOG_ERROR("source and destination buffer areas are not equal.");
-#endif
- return LV_RES_INV;
- }
-
- return LV_RES_OK;
-}
-
-/***
- * Move buffer pointer as close as possible to area, but with respect to alignment requirements. X-axis only.
- * @param[in,out] area Area to be updated
- * @param[in,out] buf Pointer to be updated
- */
-static void _align_x(lv_area_t * area, lv_color_t ** buf)
-{
-
- int alignedAreaStartPx = area->x1 - (area->x1 % (LV_ATTRIBUTE_MEM_ALIGN_SIZE * 8 / LV_COLOR_DEPTH));
- CHECK(alignedAreaStartPx < 0, "Should never happen.");
-
- area->x1 -= alignedAreaStartPx;
- area->x2 -= alignedAreaStartPx;
- *buf += alignedAreaStartPx;
-}
-
-/***
- * Move buffer pointer to the area start and update variables, Y-axis only.
- * @param[in,out] area Area to be updated
- * @param[in,out] buf Pointer to be updated
- * @param[in] stridePx Buffer stride in pixels
- */
-static void _align_y(lv_area_t * area, lv_color_t ** buf, uint32_t stridePx)
-{
- int LineToAlignMem;
- int alignedAreaStartPy;
- /* find how many lines of pixels will respect memory alignment requirement */
- if(stridePx % LV_ATTRIBUTE_MEM_ALIGN_SIZE == 0) {
- alignedAreaStartPy = area->y1;
- }
- else {
- LineToAlignMem = LV_ATTRIBUTE_MEM_ALIGN_SIZE / (sizeof(lv_color_t) * LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX);
- CHECK(LV_ATTRIBUTE_MEM_ALIGN_SIZE % (sizeof(lv_color_t) * LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX) != 0,
- "Complex case: need gcd function.");
- alignedAreaStartPy = area->y1 - (area->y1 % LineToAlignMem);
- CHECK(alignedAreaStartPy < 0, "Should never happen.");
- }
-
- area->y1 -= alignedAreaStartPy;
- area->y2 -= alignedAreaStartPy;
- *buf += alignedAreaStartPy * stridePx;
-}
-
-#if BLIT_DBG_AREAS
-/***
- * Draws a simple rectangle, 1 px line width.
- * @param dest_buf Destination buffer
- * @param dest_width Destination buffer width (must be aligned on 16px)
- * @param dest_height Destination buffer height
- * @param fill_area Rectangle coordinates
- * @param color Rectangle color
- */
-static void _draw_rectangle(lv_color_t * dest_buf, lv_coord_t dest_width, lv_coord_t dest_height,
- lv_area_t * fill_area, lv_color_t color)
-{
-
- lv_area_t a;
-
- /* top line */
- a.x1 = fill_area->x1;
- a.x2 = fill_area->x2;
- a.y1 = fill_area->y1;
- a.y2 = fill_area->y1;
- lv_gpu_nxp_vglite_fill(dest_buf, dest_width, dest_height, &a, color, LV_OPA_COVER);
-
-
- /* bottom line */
- a.x1 = fill_area->x1;
- a.x2 = fill_area->x2;
- a.y1 = fill_area->y2;
- a.y2 = fill_area->y2;
- lv_gpu_nxp_vglite_fill(dest_buf, dest_width, dest_height, &a, color, LV_OPA_COVER);
-
- /* left line */
- a.x1 = fill_area->x1;
- a.x2 = fill_area->x1;
- a.y1 = fill_area->y1;
- a.y2 = fill_area->y2;
- lv_gpu_nxp_vglite_fill(dest_buf, dest_width, dest_height, &a, color, LV_OPA_COVER);
-
- /* right line */
- a.x1 = fill_area->x2;
- a.x2 = fill_area->x2;
- a.y1 = fill_area->y1;
- a.y2 = fill_area->y2;
- lv_gpu_nxp_vglite_fill(dest_buf, dest_width, dest_height, &a, color, LV_OPA_COVER);
-}
-#endif /* BLIT_DBG_AREAS */
-
-#endif /* _BLIT_SPLIT_ENABLED */
-
-#endif /*LV_USE_GPU_NXP_VG_LITE*/
diff --git a/src/draw/sdl/lv_draw_sdl.c b/src/draw/sdl/lv_draw_sdl.c
index 430f3a23c..e3cdf577a 100644
--- a/src/draw/sdl/lv_draw_sdl.c
+++ b/src/draw/sdl/lv_draw_sdl.c
@@ -15,6 +15,7 @@
#include "lv_draw_sdl.h"
#include "lv_draw_sdl_utils.h"
#include "lv_draw_sdl_texture_cache.h"
+#include "lv_draw_sdl_layer.h"
/*********************
* DEFINES
@@ -69,6 +70,10 @@ void lv_draw_sdl_init_ctx(lv_disp_drv_t * disp_drv, lv_draw_ctx_t * draw_ctx)
draw_ctx->draw_arc = lv_draw_sdl_draw_arc;
draw_ctx->draw_polygon = lv_draw_sdl_polygon;
draw_ctx->draw_bg = lv_draw_sdl_draw_bg;
+ draw_ctx->layer_init = lv_draw_sdl_layer_init;
+ draw_ctx->layer_blend = lv_draw_sdl_layer_blend;
+ draw_ctx->layer_destroy = lv_draw_sdl_layer_destroy;
+ draw_ctx->layer_instance_size = sizeof(lv_draw_sdl_layer_ctx_t);
lv_draw_sdl_ctx_t * draw_ctx_sdl = (lv_draw_sdl_ctx_t *) draw_ctx;
draw_ctx_sdl->renderer = ((lv_draw_sdl_drv_param_t *) disp_drv->user_data)->renderer;
draw_ctx_sdl->internals = lv_mem_alloc(sizeof(lv_draw_sdl_context_internals_t));
diff --git a/src/draw/sdl/lv_draw_sdl.mk b/src/draw/sdl/lv_draw_sdl.mk
index 6609c38bc..c5c28b66b 100644
--- a/src/draw/sdl/lv_draw_sdl.mk
+++ b/src/draw/sdl/lv_draw_sdl.mk
@@ -11,6 +11,7 @@ CSRCS += lv_draw_sdl_rect.c
CSRCS += lv_draw_sdl_stack_blur.c
CSRCS += lv_draw_sdl_texture_cache.c
CSRCS += lv_draw_sdl_utils.c
+CSRCS += lv_draw_sdl_layer.c
DEPPATH += --dep-path $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/sdl
VPATH += :$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/sdl
diff --git a/src/draw/sdl/lv_draw_sdl_composite.c b/src/draw/sdl/lv_draw_sdl_composite.c
index 1ee843f7a..4d0603d70 100644
--- a/src/draw/sdl/lv_draw_sdl_composite.c
+++ b/src/draw/sdl/lv_draw_sdl_composite.c
@@ -13,7 +13,6 @@
#include "../../misc/lv_gc.h"
#include "../../core/lv_refr.h"
#include "lv_draw_sdl_composite.h"
-#include "lv_draw_sdl_mask.h"
#include "lv_draw_sdl_utils.h"
#include "lv_draw_sdl_priv.h"
#include "lv_draw_sdl_texture_cache.h"
@@ -84,18 +83,22 @@ bool lv_draw_sdl_composite_begin(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coor
const bool draw_blend = blend_mode != LV_BLEND_MODE_NORMAL;
if(draw_mask || draw_blend) {
lv_draw_sdl_context_internals_t * internals = ctx->internals;
- LV_ASSERT(internals->mask == NULL && internals->composition == NULL);
+ LV_ASSERT(internals->mask == NULL && internals->composition == NULL && internals->target_backup == NULL);
lv_coord_t w = lv_area_get_width(apply_area), h = lv_area_get_height(apply_area);
internals->composition = lv_draw_sdl_composite_texture_obtain(ctx, LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_TARGET0, w, h);
- /* Don't need to worry about overflow */
+ /* Don't need to worry about integral overflow */
lv_coord_t ofs_x = (lv_coord_t) - apply_area->x1, ofs_y = (lv_coord_t) - apply_area->y1;
/* Offset draw area to start with (0,0) of coords */
lv_area_move(coords_out, ofs_x, ofs_y);
lv_area_move(clip_out, ofs_x, ofs_y);
+ internals->target_backup = SDL_GetRenderTarget(ctx->renderer);
SDL_SetRenderTarget(ctx->renderer, internals->composition);
SDL_SetRenderDrawColor(ctx->renderer, 255, 255, 255, 0);
- SDL_RenderClear(ctx->renderer);
+ /* SDL_RenderClear is not working properly, so we overwrite the target with solid color */
+ SDL_SetRenderDrawBlendMode(ctx->renderer, SDL_BLENDMODE_NONE);
+ SDL_RenderFillRect(ctx->renderer, NULL);
+ SDL_SetRenderDrawBlendMode(ctx->renderer, SDL_BLENDMODE_BLEND);
#if LV_GPU_SDL_CUSTOM_BLEND_MODE
internals->mask = lv_draw_sdl_composite_texture_obtain(ctx, LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_STREAM0, w, h);
dump_masks(internals->mask, apply_area);
@@ -140,7 +143,7 @@ void lv_draw_sdl_composite_end(lv_draw_sdl_ctx_t * ctx, const lv_area_t * apply_
SDL_Rect dst_rect;
lv_area_to_sdl_rect(apply_area, &dst_rect);
- SDL_SetRenderTarget(ctx->renderer, ctx->base_draw.buf);
+ SDL_SetRenderTarget(ctx->renderer, internals->target_backup);
switch(blend_mode) {
case LV_BLEND_MODE_NORMAL:
SDL_SetTextureBlendMode(internals->composition, SDL_BLENDMODE_BLEND);
@@ -173,7 +176,7 @@ void lv_draw_sdl_composite_end(lv_draw_sdl_ctx_t * ctx, const lv_area_t * apply_
SDL_RenderCopy(ctx->renderer, internals->composition, &src_rect, &dst_rect);
}
- internals->mask = internals->composition = NULL;
+ internals->mask = internals->composition = internals->target_backup = NULL;
}
SDL_Texture * lv_draw_sdl_composite_texture_obtain(lv_draw_sdl_ctx_t * ctx, lv_draw_sdl_composite_texture_id_t id,
@@ -186,7 +189,10 @@ SDL_Texture * lv_draw_sdl_composite_texture_obtain(lv_draw_sdl_ctx_t * ctx, lv_d
if(!result || tex_size->x < w || tex_size->y < h) {
lv_coord_t size = next_pow_of_2(LV_MAX(w, h));
int access = SDL_TEXTUREACCESS_STREAMING;
- if(id >= LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_TARGET0) {
+ if(id >= LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_TRANSFORM0) {
+ access = SDL_TEXTUREACCESS_TARGET;
+ }
+ else if(id >= LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_TARGET0) {
access = SDL_TEXTUREACCESS_TARGET;
}
result = SDL_CreateTexture(ctx->renderer, LV_DRAW_SDL_TEXTURE_FORMAT, access, size, size);
diff --git a/src/draw/sdl/lv_draw_sdl_composite.h b/src/draw/sdl/lv_draw_sdl_composite.h
index 3050815d7..72a2daef7 100644
--- a/src/draw/sdl/lv_draw_sdl_composite.h
+++ b/src/draw/sdl/lv_draw_sdl_composite.h
@@ -35,6 +35,7 @@ typedef enum lv_draw_sdl_composite_texture_id_t {
LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_STREAM1,
LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_TARGET0,
LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_TARGET1,
+ LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_TRANSFORM0,
} lv_draw_sdl_composite_texture_id_t;
/**********************
diff --git a/src/draw/sdl/lv_draw_sdl_img.c b/src/draw/sdl/lv_draw_sdl_img.c
index c6782386e..3c955d840 100644
--- a/src/draw/sdl/lv_draw_sdl_img.c
+++ b/src/draw/sdl/lv_draw_sdl_img.c
@@ -22,6 +22,7 @@
#include "lv_draw_sdl_texture_cache.h"
#include "lv_draw_sdl_composite.h"
#include "lv_draw_sdl_rect.h"
+#include "lv_draw_sdl_layer.h"
/*********************
* DEFINES
@@ -123,11 +124,15 @@ lv_res_t lv_draw_sdl_img_core(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t
/* Coords will be translated so coords will start at (0,0) */
lv_area_t t_coords = zoomed_cords, t_clip = *clip, apply_area;
+ bool has_composite = false;
+
if(!check_mask_simple_radius(&t_coords, &radius)) {
- lv_draw_sdl_composite_begin(ctx, &zoomed_cords, clip, NULL, draw_dsc->blend_mode,
- &t_coords, &t_clip, &apply_area);
+ has_composite = lv_draw_sdl_composite_begin(ctx, &zoomed_cords, clip, NULL, draw_dsc->blend_mode,
+ &t_coords, &t_clip, &apply_area);
}
+ lv_draw_sdl_transform_areas_offset(ctx, has_composite, &apply_area, &t_coords, &t_clip);
+
SDL_Rect clip_rect, coords_rect;
lv_area_to_sdl_rect(&t_clip, &clip_rect);
lv_area_to_sdl_rect(&t_coords, &coords_rect);
@@ -385,7 +390,10 @@ static SDL_Texture * img_rounded_frag_obtain(lv_draw_sdl_ctx_t * ctx, SDL_Textur
SDL_Texture * old_target = SDL_GetRenderTarget(ctx->renderer);
SDL_SetRenderTarget(ctx->renderer, img_frag);
SDL_SetRenderDrawColor(ctx->renderer, 0, 0, 0, 0);
- SDL_RenderClear(ctx->renderer);
+ /* SDL_RenderClear is not working properly, so we overwrite the target with solid color */
+ SDL_SetRenderDrawBlendMode(ctx->renderer, SDL_BLENDMODE_NONE);
+ SDL_RenderFillRect(ctx->renderer, NULL);
+ SDL_SetRenderDrawBlendMode(ctx->renderer, SDL_BLENDMODE_BLEND);
lv_area_t coords = {0, 0, w - 1, h - 1}, clip;
lv_area_t frag_coords = {0, 0, full_frag_size - 1, full_frag_size - 1};
diff --git a/src/draw/sdl/lv_draw_sdl_label.c b/src/draw/sdl/lv_draw_sdl_label.c
index a067c8af4..b8c79ae4a 100644
--- a/src/draw/sdl/lv_draw_sdl_label.c
+++ b/src/draw/sdl/lv_draw_sdl_label.c
@@ -19,6 +19,7 @@
#include "lv_draw_sdl_utils.h"
#include "lv_draw_sdl_texture_cache.h"
#include "lv_draw_sdl_composite.h"
+#include "lv_draw_sdl_layer.h"
/*********************
* DEFINES
@@ -77,6 +78,21 @@ void lv_draw_sdl_draw_letter(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t
letter != 0xf8ff && /*LV_SYMBOL_DUMMY*/
letter != 0x200c) { /*ZERO WIDTH NON-JOINER*/
LV_LOG_WARN("lv_draw_letter: glyph dsc. not found for U+%X", letter);
+
+ /* draw placeholder */
+ lv_area_t glyph_coords;
+ lv_draw_rect_dsc_t glyph_dsc;
+ lv_coord_t begin_x = pos_p->x + g.ofs_x;
+ lv_coord_t begin_y = pos_p->y + g.ofs_y;
+ lv_area_set(&glyph_coords, begin_x, begin_y, begin_x + g.box_w, begin_y + g.box_h);
+ lv_draw_rect_dsc_init(&glyph_dsc);
+ glyph_dsc.bg_opa = LV_OPA_MIN;
+ glyph_dsc.outline_opa = LV_OPA_MIN;
+ glyph_dsc.shadow_opa = LV_OPA_MIN;
+ glyph_dsc.bg_img_opa = LV_OPA_MIN;
+ glyph_dsc.border_color = dsc->color;
+ glyph_dsc.border_width = 1;
+ draw_ctx->draw_rect(draw_ctx, &glyph_dsc, &glyph_coords);
}
return;
}
@@ -119,8 +135,10 @@ void lv_draw_sdl_draw_letter(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t
}
lv_area_t t_letter = letter_area, t_clip = *clip_area, apply_area;
- bool has_mask = lv_draw_sdl_composite_begin(ctx, &letter_area, clip_area, NULL, dsc->blend_mode, &t_letter, &t_clip,
- &apply_area);
+ bool has_composite = lv_draw_sdl_composite_begin(ctx, &letter_area, clip_area, NULL, dsc->blend_mode, &t_letter,
+ &t_clip, &apply_area);
+
+ lv_draw_sdl_transform_areas_offset(ctx, has_composite, &apply_area, &t_letter, &t_clip);
/*If the letter is completely out of mask don't draw it*/
if(!_lv_area_intersect(&draw_area, &t_letter, &t_clip)) {
diff --git a/src/draw/sdl/lv_draw_sdl_layer.c b/src/draw/sdl/lv_draw_sdl_layer.c
new file mode 100644
index 000000000..ae5c327ac
--- /dev/null
+++ b/src/draw/sdl/lv_draw_sdl_layer.c
@@ -0,0 +1,141 @@
+/**
+ * @file lv_draw_sdl_refr.c
+ *
+ */
+
+/*********************
+ * INCLUDES
+ *********************/
+#include "../../lv_conf_internal.h"
+
+#if LV_USE_GPU_SDL
+
+#include "../../core/lv_refr.h"
+
+#include "lv_draw_sdl.h"
+#include "lv_draw_sdl_priv.h"
+#include "lv_draw_sdl_composite.h"
+#include "lv_draw_sdl_utils.h"
+#include "lv_draw_sdl_layer.h"
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+
+/**********************
+ * STATIC VARIABLES
+ **********************/
+
+/**********************
+ * MACROS
+ **********************/
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+
+lv_draw_layer_ctx_t * lv_draw_sdl_layer_init(lv_draw_ctx_t * draw_ctx, lv_draw_layer_ctx_t * layer_ctx,
+ lv_draw_layer_flags_t flags)
+{
+ lv_draw_sdl_ctx_t * ctx = (lv_draw_sdl_ctx_t *) draw_ctx;
+ SDL_Renderer * renderer = ctx->renderer;
+
+ lv_draw_sdl_layer_ctx_t * transform_ctx = (lv_draw_sdl_layer_ctx_t *) layer_ctx;
+
+ transform_ctx->flags = flags;
+ transform_ctx->orig_target = SDL_GetRenderTarget(renderer);
+
+ lv_coord_t target_w = lv_area_get_width(&layer_ctx->area_full);
+ lv_coord_t target_h = lv_area_get_height(&layer_ctx->area_full);
+
+ enum lv_draw_sdl_composite_texture_id_t texture_id = LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_TRANSFORM0 +
+ ctx->internals->transform_count;
+ transform_ctx->target = lv_draw_sdl_composite_texture_obtain(ctx, texture_id, target_w, target_h);
+ transform_ctx->target_rect.x = 0;
+ transform_ctx->target_rect.y = 0;
+ transform_ctx->target_rect.w = target_w;
+ transform_ctx->target_rect.h = target_h;
+
+ layer_ctx->max_row_with_alpha = target_h;
+ layer_ctx->max_row_with_no_alpha = target_h;
+
+ SDL_SetTextureBlendMode(transform_ctx->target, SDL_BLENDMODE_BLEND);
+ SDL_SetRenderTarget(renderer, transform_ctx->target);
+
+ /* SDL_RenderClear is not working properly, so we overwrite the target with solid color */
+ SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_NONE);
+ SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0);
+ SDL_RenderFillRect(renderer, NULL);
+ SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_BLEND);
+
+ /* Set proper drawing context for transform layer */
+ ctx->internals->transform_count += 1;
+ draw_ctx->buf_area = &layer_ctx->area_full;
+ draw_ctx->clip_area = &layer_ctx->area_full;
+
+ return layer_ctx;
+}
+
+void lv_draw_sdl_layer_blend(lv_draw_ctx_t * draw_ctx, lv_draw_layer_ctx_t * layer_ctx,
+ const lv_draw_img_dsc_t * draw_dsc)
+{
+ lv_draw_sdl_ctx_t * ctx = (lv_draw_sdl_ctx_t *) draw_ctx;
+ lv_draw_sdl_layer_ctx_t * transform_ctx = (lv_draw_sdl_layer_ctx_t *) layer_ctx;
+
+ SDL_Renderer * renderer = ctx->renderer;
+
+ SDL_Rect trans_rect;
+
+ if(transform_ctx->flags & LV_DRAW_LAYER_FLAG_CAN_SUBDIVIDE) {
+ lv_area_zoom_to_sdl_rect(&layer_ctx->area_act, &trans_rect, draw_dsc->zoom, &draw_dsc->pivot);
+ }
+ else {
+ lv_area_zoom_to_sdl_rect(&layer_ctx->area_full, &trans_rect, draw_dsc->zoom, &draw_dsc->pivot);
+ }
+
+ SDL_SetRenderTarget(renderer, transform_ctx->orig_target);
+
+ /*Render off-screen texture, transformed*/
+ SDL_Rect clip_rect;
+ lv_area_to_sdl_rect(layer_ctx->original.clip_area, &clip_rect);
+ SDL_Point center = {.x = draw_dsc->pivot.x, .y = draw_dsc->pivot.y};
+ SDL_RenderSetClipRect(renderer, &clip_rect);
+ SDL_SetTextureAlphaMod(transform_ctx->target, draw_dsc->opa);
+ SDL_RenderCopyEx(renderer, transform_ctx->target, &transform_ctx->target_rect, &trans_rect,
+ draw_dsc->angle, ¢er, SDL_FLIP_NONE);
+ SDL_RenderSetClipRect(renderer, NULL);
+}
+
+void lv_draw_sdl_layer_destroy(lv_draw_ctx_t * draw_ctx, lv_draw_layer_ctx_t * layer_ctx)
+{
+ lv_draw_sdl_ctx_t * ctx = (lv_draw_sdl_ctx_t *) draw_ctx;
+ ctx->internals->transform_count -= 1;
+}
+
+void lv_draw_sdl_transform_areas_offset(lv_draw_sdl_ctx_t * ctx, bool has_composite, lv_area_t * apply_area,
+ lv_area_t * coords, lv_area_t * clip)
+{
+ if(ctx->internals->transform_count == 0) {
+ return;
+ }
+ lv_area_t * area = ctx->base_draw.buf_area;
+ lv_area_move(coords, -area->x1, -area->y1);
+ lv_area_move(clip, -area->x1, -area->y1);
+ if(has_composite) {
+ lv_area_move(apply_area, -area->x1, -area->y1);
+ }
+}
+
+/**********************
+ * STATIC FUNCTIONS
+ **********************/
+
+#endif /*LV_USE_GPU_SDL*/
diff --git a/src/draw/sdl/lv_draw_sdl_layer.h b/src/draw/sdl/lv_draw_sdl_layer.h
new file mode 100644
index 000000000..b60303c47
--- /dev/null
+++ b/src/draw/sdl/lv_draw_sdl_layer.h
@@ -0,0 +1,55 @@
+/**
+ * @file lv_draw_sdl_refr.h
+ *
+ */
+
+#ifndef LV_TEMPL_H
+#define LV_TEMPL_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ * INCLUDES
+ *********************/
+#include "lv_draw_sdl.h"
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+typedef struct _lv_draw_sdl_layer_ctx_t {
+ lv_draw_layer_ctx_t base;
+
+ SDL_Texture * orig_target;
+ SDL_Texture * target;
+ SDL_Rect target_rect;
+ lv_draw_layer_flags_t flags;
+} lv_draw_sdl_layer_ctx_t;
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+lv_draw_layer_ctx_t * lv_draw_sdl_layer_init(lv_draw_ctx_t * draw_ctx, lv_draw_layer_ctx_t * layer_ctx,
+ lv_draw_layer_flags_t flags);
+
+void lv_draw_sdl_layer_blend(lv_draw_ctx_t * draw_ctx, lv_draw_layer_ctx_t * transform_ctx,
+ const lv_draw_img_dsc_t * draw_dsc);
+
+void lv_draw_sdl_layer_destroy(lv_draw_ctx_t * draw_ctx, lv_draw_layer_ctx_t * layer_ctx);
+
+void lv_draw_sdl_transform_areas_offset(lv_draw_sdl_ctx_t * ctx, bool has_composite, lv_area_t * apply_area,
+ lv_area_t * coords, lv_area_t * clip);
+/**********************
+ * MACROS
+ **********************/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /*LV_TEMPL_H*/
diff --git a/src/draw/sdl/lv_draw_sdl_line.c b/src/draw/sdl/lv_draw_sdl_line.c
index 8dd7b2e00..3a15d6d33 100644
--- a/src/draw/sdl/lv_draw_sdl_line.c
+++ b/src/draw/sdl/lv_draw_sdl_line.c
@@ -126,7 +126,10 @@ static SDL_Texture * line_texture_create(lv_draw_sdl_ctx_t * sdl_ctx, const lv_d
SDL_SetRenderTarget(sdl_ctx->renderer, texture);
SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND);
SDL_SetRenderDrawColor(sdl_ctx->renderer, 0xFF, 0xFF, 0xFF, 0x0);
- SDL_RenderClear(sdl_ctx->renderer);
+ /* SDL_RenderClear is not working properly, so we overwrite the target with solid color */
+ SDL_SetRenderDrawBlendMode(sdl_ctx->renderer, SDL_BLENDMODE_NONE);
+ SDL_RenderFillRect(sdl_ctx->renderer, NULL);
+ SDL_SetRenderDrawBlendMode(sdl_ctx->renderer, SDL_BLENDMODE_BLEND);
SDL_SetRenderDrawColor(sdl_ctx->renderer, 0xFF, 0xFF, 0xFF, 0xFF);
SDL_Rect line_rect = {1 + dsc->width / 2, 1, length, dsc->width};
SDL_RenderFillRect(sdl_ctx->renderer, &line_rect);
diff --git a/src/draw/sdl/lv_draw_sdl_priv.h b/src/draw/sdl/lv_draw_sdl_priv.h
index 1f44c22ac..24a876218 100644
--- a/src/draw/sdl/lv_draw_sdl_priv.h
+++ b/src/draw/sdl/lv_draw_sdl_priv.h
@@ -35,6 +35,8 @@ typedef struct lv_draw_sdl_context_internals_t {
lv_lru_t * texture_cache;
SDL_Texture * mask;
SDL_Texture * composition;
+ SDL_Texture * target_backup;
+ uint8_t transform_count;
} lv_draw_sdl_context_internals_t;
/**********************
diff --git a/src/draw/sdl/lv_draw_sdl_rect.c b/src/draw/sdl/lv_draw_sdl_rect.c
index 4df113efb..a303ac764 100644
--- a/src/draw/sdl/lv_draw_sdl_rect.c
+++ b/src/draw/sdl/lv_draw_sdl_rect.c
@@ -21,7 +21,7 @@
#include "lv_draw_sdl_composite.h"
#include "lv_draw_sdl_mask.h"
#include "lv_draw_sdl_stack_blur.h"
-#include "lv_draw_sdl_img.h"
+#include "lv_draw_sdl_layer.h"
/*********************
* DEFINES
@@ -124,7 +124,11 @@ void lv_draw_sdl_draw_rect(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t *
}
/* Coords will be translated so coords will start at (0,0) */
lv_area_t t_coords = *coords, t_clip = *clip, apply_area, t_area;
- lv_draw_sdl_composite_begin(ctx, coords, clip, &extension, dsc->blend_mode, &t_coords, &t_clip, &apply_area);
+ bool has_composite = lv_draw_sdl_composite_begin(ctx, coords, clip, &extension, dsc->blend_mode, &t_coords, &t_clip,
+ &apply_area);
+
+ lv_draw_sdl_transform_areas_offset(ctx, has_composite, &apply_area, &t_coords, &t_clip);
+
bool has_content = _lv_area_intersect(&t_area, &t_coords, &t_clip);
SDL_Rect clip_rect;
diff --git a/src/draw/sdl/lv_draw_sdl_texture_cache.c b/src/draw/sdl/lv_draw_sdl_texture_cache.c
index 58ff9f374..6845addf5 100644
--- a/src/draw/sdl/lv_draw_sdl_texture_cache.c
+++ b/src/draw/sdl/lv_draw_sdl_texture_cache.c
@@ -102,7 +102,7 @@ void lv_draw_sdl_texture_cache_put_advanced(lv_draw_sdl_ctx_t * ctx, const void
}
if(flags & LV_DRAW_SDL_CACHE_FLAG_MANAGED) {
/* Managed texture doesn't count into cache size */
- LV_LOG_INFO("cache texture %p, %d*%d@%dbpp", texture, width, height, SDL_BITSPERPIXEL(format));
+ LV_LOG_INFO("cache texture %p", texture);
lv_lru_set(lru, key, key_length, value, 1);
return;
}
diff --git a/src/draw/stm32_dma2d/lv_draw_stm32_dma2d.mk b/src/draw/stm32_dma2d/lv_draw_stm32_dma2d.mk
new file mode 100644
index 000000000..8ed00b015
--- /dev/null
+++ b/src/draw/stm32_dma2d/lv_draw_stm32_dma2d.mk
@@ -0,0 +1,6 @@
+CSRCS += lv_gpu_stm32_dma2d.c
+
+DEPPATH += --dep-path $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/stm32_dma2d
+VPATH += :$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/stm32_dma2d
+
+CFLAGS += "-I$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/stm32_dma2d"
diff --git a/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.c b/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.c
index 20344a567..4eb1940ef 100644
--- a/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.c
+++ b/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.c
@@ -103,6 +103,7 @@ void lv_draw_stm32_dma2d_ctx_init(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx)
dma2d_draw_ctx->blend = lv_draw_stm32_dma2d_blend;
// dma2d_draw_ctx->base_draw.draw_img_decoded = lv_draw_stm32_dma2d_img_decoded;
dma2d_draw_ctx->base_draw.wait_for_finish = lv_gpu_stm32_dma2d_wait_cb;
+ dma2d_draw_ctx->base_draw.buffer_copy = lv_draw_stm32_dma2d_buffer_copy;
}
@@ -146,6 +147,14 @@ void lv_draw_stm32_dma2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_
if(!done) lv_draw_sw_blend_basic(draw_ctx, dsc);
}
+void lv_draw_stm32_dma2d_buffer_copy(lv_draw_ctx_t * draw_ctx,
+ void * dest_buf, lv_coord_t dest_stride, const lv_area_t * dest_area,
+ void * src_buf, lv_coord_t src_stride, const lv_area_t * src_area)
+{
+ LV_UNUSED(draw_ctx);
+ lv_draw_stm32_dma2d_blend_map(dest_buf, dest_area, dest_stride, src_buf, src_stride, LV_OPA_MAX);
+}
+
static void lv_draw_stm32_dma2d_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc,
const lv_area_t * coords, const uint8_t * map_p, lv_img_cf_t color_format)
@@ -213,8 +222,8 @@ static void lv_draw_stm32_dma2d_blend_map(lv_color_t * dest_buf, const lv_area_t
DMA2D->FGMAR = (uint32_t)src_buf;
DMA2D->FGOR = src_stride - dest_w;
- DMA2D->OMAR = (uint32_t)src_buf;
- DMA2D->OOR = src_stride - dest_w;
+ DMA2D->OMAR = (uint32_t)dest_buf;
+ DMA2D->OOR = dest_stride - dest_w;
DMA2D->NLR = (dest_w << DMA2D_NLR_PL_Pos) | (dest_h << DMA2D_NLR_NL_Pos);
/*start transfer*/
diff --git a/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.h b/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.h
index 73054ca2d..fa7070e2a 100644
--- a/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.h
+++ b/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.h
@@ -51,6 +51,10 @@ void lv_draw_stm32_dma2d_ctx_deinit(struct _lv_disp_drv_t * drv, lv_draw_ctx_t *
void lv_draw_stm32_dma2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc);
+void lv_draw_stm32_dma2d_buffer_copy(lv_draw_ctx_t * draw_ctx,
+ void * dest_buf, lv_coord_t dest_stride, const lv_area_t * dest_area,
+ void * src_buf, lv_coord_t src_stride, const lv_area_t * src_area);
+
void lv_gpu_stm32_dma2d_wait_cb(lv_draw_ctx_t * draw_ctx);
/**********************
diff --git a/src/draw/sw/lv_draw_sw.c b/src/draw/sw/lv_draw_sw.c
index 21da4ee6b..1c0c6d4a2 100644
--- a/src/draw/sw/lv_draw_sw.c
+++ b/src/draw/sw/lv_draw_sw.c
@@ -51,8 +51,17 @@ void lv_draw_sw_init_ctx(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx)
draw_sw_ctx->base_draw.draw_img_decoded = lv_draw_sw_img_decoded;
draw_sw_ctx->base_draw.draw_line = lv_draw_sw_line;
draw_sw_ctx->base_draw.draw_polygon = lv_draw_sw_polygon;
+#if LV_DRAW_COMPLEX
+ draw_sw_ctx->base_draw.draw_transform = lv_draw_sw_transform;
+#endif
draw_sw_ctx->base_draw.wait_for_finish = lv_draw_sw_wait_for_finish;
+ draw_sw_ctx->base_draw.buffer_copy = lv_draw_sw_buffer_copy;
+ draw_sw_ctx->base_draw.layer_init = lv_draw_sw_layer_create;
+ draw_sw_ctx->base_draw.layer_adjust = lv_draw_sw_layer_adjust;
+ draw_sw_ctx->base_draw.layer_blend = lv_draw_sw_layer_blend;
+ draw_sw_ctx->base_draw.layer_destroy = lv_draw_sw_layer_destroy;
draw_sw_ctx->blend = lv_draw_sw_blend_basic;
+ draw_ctx->layer_instance_size = sizeof(lv_draw_sw_layer_ctx_t);
}
void lv_draw_sw_deinit_ctx(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx)
@@ -69,6 +78,31 @@ void lv_draw_sw_wait_for_finish(lv_draw_ctx_t * draw_ctx)
/*Nothing to wait for*/
}
+void lv_draw_sw_buffer_copy(lv_draw_ctx_t * draw_ctx,
+ void * dest_buf, lv_coord_t dest_stride, const lv_area_t * dest_area,
+ void * src_buf, lv_coord_t src_stride, const lv_area_t * src_area)
+{
+ LV_UNUSED(draw_ctx);
+
+ lv_color_t * dest_bufc = dest_buf;
+ lv_color_t * src_bufc = src_buf;
+
+ /*Got the first pixel of each buffer*/
+ dest_bufc += dest_stride * dest_area->y1;
+ dest_bufc += dest_area->x1;
+
+ src_bufc += src_stride * src_area->y1;
+ src_bufc += src_area->x1;
+
+ uint32_t line_length = lv_area_get_width(dest_area) * sizeof(lv_color_t);
+ lv_coord_t y;
+ for(y = dest_area->y1; y <= dest_area->y2; y++) {
+ lv_memcpy(dest_bufc, src_bufc, line_length);
+ dest_bufc += dest_stride;
+ src_bufc += src_stride;
+ }
+}
+
/**********************
* STATIC FUNCTIONS
**********************/
diff --git a/src/draw/sw/lv_draw_sw.h b/src/draw/sw/lv_draw_sw.h
index cba5b480b..1618649cf 100644
--- a/src/draw/sw/lv_draw_sw.h
+++ b/src/draw/sw/lv_draw_sw.h
@@ -36,6 +36,13 @@ typedef struct {
void (*blend)(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc);
} lv_draw_sw_ctx_t;
+typedef struct {
+ lv_draw_layer_ctx_t base_draw;
+
+ uint32_t buf_size_bytes: 31;
+ uint32_t has_alpha : 1;
+} lv_draw_sw_layer_ctx_t;
+
/**********************
* GLOBAL PROTOTYPES
**********************/
@@ -63,6 +70,25 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_line(struct _lv_draw_ctx_t * draw_ctx, con
void lv_draw_sw_polygon(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * draw_dsc,
const lv_point_t * points, uint16_t point_cnt);
+void lv_draw_sw_buffer_copy(lv_draw_ctx_t * draw_ctx,
+ void * dest_buf, lv_coord_t dest_stride, const lv_area_t * dest_area,
+ void * src_buf, lv_coord_t src_stride, const lv_area_t * src_area);
+
+void lv_draw_sw_transform(lv_draw_ctx_t * draw_ctx, const lv_area_t * dest_area, const void * src_buf,
+ lv_coord_t src_w, lv_coord_t src_h, lv_coord_t src_stride,
+ const lv_draw_img_dsc_t * draw_dsc, lv_img_cf_t cf, lv_color_t * cbuf, lv_opa_t * abuf);
+
+struct _lv_draw_layer_ctx_t * lv_draw_sw_layer_create(struct _lv_draw_ctx_t * draw_ctx, lv_draw_layer_ctx_t * layer_ctx,
+ lv_draw_layer_flags_t flags);
+
+void lv_draw_sw_layer_adjust(struct _lv_draw_ctx_t * draw_ctx, struct _lv_draw_layer_ctx_t * layer_ctx,
+ lv_draw_layer_flags_t flags);
+
+void lv_draw_sw_layer_blend(struct _lv_draw_ctx_t * draw_ctx, struct _lv_draw_layer_ctx_t * layer_ctx,
+ const lv_draw_img_dsc_t * draw_dsc);
+
+void lv_draw_sw_layer_destroy(lv_draw_ctx_t * draw_ctx, lv_draw_layer_ctx_t * layer_ctx);
+
/***********************
* GLOBAL VARIABLES
***********************/
diff --git a/src/draw/sw/lv_draw_sw.mk b/src/draw/sw/lv_draw_sw.mk
index 386d9ed81..4625cbcfc 100644
--- a/src/draw/sw/lv_draw_sw.mk
+++ b/src/draw/sw/lv_draw_sw.mk
@@ -1,13 +1,15 @@
CSRCS += lv_draw_sw.c
CSRCS += lv_draw_sw_arc.c
CSRCS += lv_draw_sw_blend.c
+CSRCS += lv_draw_sw_dither.c
+CSRCS += lv_draw_sw_gradient.c
CSRCS += lv_draw_sw_img.c
CSRCS += lv_draw_sw_letter.c
CSRCS += lv_draw_sw_line.c
-CSRCS += lv_draw_sw_rect.c
CSRCS += lv_draw_sw_polygon.c
-CSRCS += lv_draw_sw_gradient.c
-CSRCS += lv_draw_sw_dither.c
+CSRCS += lv_draw_sw_rect.c
+CSRCS += lv_draw_sw_transform.c
+CSRCS += lv_draw_sw_layer.c
DEPPATH += --dep-path $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/sw
VPATH += :$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/sw
diff --git a/src/draw/sw/lv_draw_sw_arc.c b/src/draw/sw/lv_draw_sw_arc.c
index d020fdd4f..3ed62b6ef 100644
--- a/src/draw/sw/lv_draw_sw_arc.c
+++ b/src/draw/sw/lv_draw_sw_arc.c
@@ -97,8 +97,10 @@ void lv_draw_sw_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_dsc_t * dsc, con
/*Create inner the mask*/
int16_t mask_in_id = LV_MASK_ID_INV;
lv_draw_mask_radius_param_t mask_in_param;
+ bool mask_in_param_valid = false;
if(lv_area_get_width(&area_in) > 0 && lv_area_get_height(&area_in) > 0) {
lv_draw_mask_radius_init(&mask_in_param, &area_in, LV_RADIUS_CIRCLE, true);
+ mask_in_param_valid = true;
mask_in_id = lv_draw_mask_add(&mask_in_param, NULL);
}
@@ -115,7 +117,9 @@ void lv_draw_sw_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_dsc_t * dsc, con
if(mask_in_id != LV_MASK_ID_INV) lv_draw_mask_remove_id(mask_in_id);
lv_draw_mask_free_param(&mask_out_param);
- lv_draw_mask_free_param(&mask_in_param);
+ if(mask_in_param_valid) {
+ lv_draw_mask_free_param(&mask_in_param);
+ }
return;
}
@@ -162,7 +166,9 @@ void lv_draw_sw_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_dsc_t * dsc, con
lv_draw_mask_free_param(&mask_angle_param);
lv_draw_mask_free_param(&mask_out_param);
- lv_draw_mask_free_param(&mask_in_param);
+ if(mask_in_param_valid) {
+ lv_draw_mask_free_param(&mask_in_param);
+ }
lv_draw_mask_remove_id(mask_angle_id);
lv_draw_mask_remove_id(mask_out_id);
@@ -237,7 +243,7 @@ static void draw_quarter_0(quarter_draw_dsc_t * q)
bool ok = _lv_area_intersect(&quarter_area, &quarter_area, clip_area_ori);
if(ok) {
q->draw_ctx->clip_area = &quarter_area;
- lv_draw_rect(q->draw_ctx, q->draw_dsc, &quarter_area);
+ lv_draw_rect(q->draw_ctx, q->draw_dsc, q->draw_area);
}
}
else if(q->start_quarter == 0 || q->end_quarter == 0) {
@@ -252,7 +258,7 @@ static void draw_quarter_0(quarter_draw_dsc_t * q)
bool ok = _lv_area_intersect(&quarter_area, &quarter_area, clip_area_ori);
if(ok) {
q->draw_ctx->clip_area = &quarter_area;
- lv_draw_rect(q->draw_ctx, q->draw_dsc, &quarter_area);
+ lv_draw_rect(q->draw_ctx, q->draw_dsc, q->draw_area);
}
}
if(q->end_quarter == 0) {
@@ -265,7 +271,7 @@ static void draw_quarter_0(quarter_draw_dsc_t * q)
bool ok = _lv_area_intersect(&quarter_area, &quarter_area, clip_area_ori);
if(ok) {
q->draw_ctx->clip_area = &quarter_area;
- lv_draw_rect(q->draw_ctx, q->draw_dsc, &quarter_area);
+ lv_draw_rect(q->draw_ctx, q->draw_dsc, q->draw_area);
}
}
}
@@ -282,7 +288,7 @@ static void draw_quarter_0(quarter_draw_dsc_t * q)
bool ok = _lv_area_intersect(&quarter_area, &quarter_area, clip_area_ori);
if(ok) {
q->draw_ctx->clip_area = &quarter_area;
- lv_draw_rect(q->draw_ctx, q->draw_dsc, &quarter_area);
+ lv_draw_rect(q->draw_ctx, q->draw_dsc, q->draw_area);
}
}
q->draw_ctx->clip_area = clip_area_ori;
@@ -304,7 +310,7 @@ static void draw_quarter_1(quarter_draw_dsc_t * q)
bool ok = _lv_area_intersect(&quarter_area, &quarter_area, clip_area_ori);
if(ok) {
q->draw_ctx->clip_area = &quarter_area;
- lv_draw_rect(q->draw_ctx, q->draw_dsc, &quarter_area);
+ lv_draw_rect(q->draw_ctx, q->draw_dsc, q->draw_area);
}
}
else if(q->start_quarter == 1 || q->end_quarter == 1) {
@@ -319,7 +325,7 @@ static void draw_quarter_1(quarter_draw_dsc_t * q)
bool ok = _lv_area_intersect(&quarter_area, &quarter_area, clip_area_ori);
if(ok) {
q->draw_ctx->clip_area = &quarter_area;
- lv_draw_rect(q->draw_ctx, q->draw_dsc, &quarter_area);
+ lv_draw_rect(q->draw_ctx, q->draw_dsc, q->draw_area);
}
}
if(q->end_quarter == 1) {
@@ -332,7 +338,7 @@ static void draw_quarter_1(quarter_draw_dsc_t * q)
bool ok = _lv_area_intersect(&quarter_area, &quarter_area, clip_area_ori);
if(ok) {
q->draw_ctx->clip_area = &quarter_area;
- lv_draw_rect(q->draw_ctx, q->draw_dsc, &quarter_area);
+ lv_draw_rect(q->draw_ctx, q->draw_dsc, q->draw_area);
}
}
}
@@ -349,7 +355,7 @@ static void draw_quarter_1(quarter_draw_dsc_t * q)
bool ok = _lv_area_intersect(&quarter_area, &quarter_area, clip_area_ori);
if(ok) {
q->draw_ctx->clip_area = &quarter_area;
- lv_draw_rect(q->draw_ctx, q->draw_dsc, &quarter_area);
+ lv_draw_rect(q->draw_ctx, q->draw_dsc, q->draw_area);
}
}
q->draw_ctx->clip_area = clip_area_ori;
@@ -371,7 +377,7 @@ static void draw_quarter_2(quarter_draw_dsc_t * q)
bool ok = _lv_area_intersect(&quarter_area, &quarter_area, clip_area_ori);
if(ok) {
q->draw_ctx->clip_area = &quarter_area;
- lv_draw_rect(q->draw_ctx, q->draw_dsc, &quarter_area);
+ lv_draw_rect(q->draw_ctx, q->draw_dsc, q->draw_area);
}
}
else if(q->start_quarter == 2 || q->end_quarter == 2) {
@@ -386,7 +392,7 @@ static void draw_quarter_2(quarter_draw_dsc_t * q)
bool ok = _lv_area_intersect(&quarter_area, &quarter_area, clip_area_ori);
if(ok) {
q->draw_ctx->clip_area = &quarter_area;
- lv_draw_rect(q->draw_ctx, q->draw_dsc, &quarter_area);
+ lv_draw_rect(q->draw_ctx, q->draw_dsc, q->draw_area);
}
}
if(q->end_quarter == 2) {
@@ -399,7 +405,7 @@ static void draw_quarter_2(quarter_draw_dsc_t * q)
bool ok = _lv_area_intersect(&quarter_area, &quarter_area, clip_area_ori);
if(ok) {
q->draw_ctx->clip_area = &quarter_area;
- lv_draw_rect(q->draw_ctx, q->draw_dsc, &quarter_area);
+ lv_draw_rect(q->draw_ctx, q->draw_dsc, q->draw_area);
}
}
}
@@ -416,7 +422,7 @@ static void draw_quarter_2(quarter_draw_dsc_t * q)
bool ok = _lv_area_intersect(&quarter_area, &quarter_area, clip_area_ori);
if(ok) {
q->draw_ctx->clip_area = &quarter_area;
- lv_draw_rect(q->draw_ctx, q->draw_dsc, &quarter_area);
+ lv_draw_rect(q->draw_ctx, q->draw_dsc, q->draw_area);
}
}
q->draw_ctx->clip_area = clip_area_ori;
@@ -438,7 +444,7 @@ static void draw_quarter_3(quarter_draw_dsc_t * q)
bool ok = _lv_area_intersect(&quarter_area, &quarter_area, clip_area_ori);
if(ok) {
q->draw_ctx->clip_area = &quarter_area;
- lv_draw_rect(q->draw_ctx, q->draw_dsc, &quarter_area);
+ lv_draw_rect(q->draw_ctx, q->draw_dsc, q->draw_area);
}
}
else if(q->start_quarter == 3 || q->end_quarter == 3) {
@@ -453,7 +459,7 @@ static void draw_quarter_3(quarter_draw_dsc_t * q)
bool ok = _lv_area_intersect(&quarter_area, &quarter_area, clip_area_ori);
if(ok) {
q->draw_ctx->clip_area = &quarter_area;
- lv_draw_rect(q->draw_ctx, q->draw_dsc, &quarter_area);
+ lv_draw_rect(q->draw_ctx, q->draw_dsc, q->draw_area);
}
}
if(q->end_quarter == 3) {
@@ -466,7 +472,7 @@ static void draw_quarter_3(quarter_draw_dsc_t * q)
bool ok = _lv_area_intersect(&quarter_area, &quarter_area, clip_area_ori);
if(ok) {
q->draw_ctx->clip_area = &quarter_area;
- lv_draw_rect(q->draw_ctx, q->draw_dsc, &quarter_area);
+ lv_draw_rect(q->draw_ctx, q->draw_dsc, q->draw_area);
}
}
}
@@ -483,7 +489,7 @@ static void draw_quarter_3(quarter_draw_dsc_t * q)
bool ok = _lv_area_intersect(&quarter_area, &quarter_area, clip_area_ori);
if(ok) {
q->draw_ctx->clip_area = &quarter_area;
- lv_draw_rect(q->draw_ctx, q->draw_dsc, &quarter_area);
+ lv_draw_rect(q->draw_ctx, q->draw_dsc, q->draw_area);
}
}
diff --git a/src/draw/sw/lv_draw_sw_blend.c b/src/draw/sw/lv_draw_sw_blend.c
index 82d013888..428aba62c 100644
--- a/src/draw/sw/lv_draw_sw_blend.c
+++ b/src/draw/sw/lv_draw_sw_blend.c
@@ -25,8 +25,16 @@
static void fill_set_px(lv_color_t * dest_buf, const lv_area_t * blend_area, lv_coord_t dest_stride,
lv_color_t color, lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stide);
+
LV_ATTRIBUTE_FAST_MEM static void fill_normal(lv_color_t * dest_buf, const lv_area_t * dest_area,
lv_coord_t dest_stride, lv_color_t color, lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stride);
+
+
+#if LV_COLOR_SCREEN_TRANSP
+LV_ATTRIBUTE_FAST_MEM static void fill_argb(lv_color_t * dest_buf, const lv_area_t * dest_area,
+ lv_coord_t dest_stride, lv_color_t color, lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stride);
+#endif /*LV_COLOR_SCREEN_TRANSP*/
+
#if LV_DRAW_COMPLEX
static void fill_blended(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, lv_color_t color,
lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stride, lv_blend_mode_t blend_mode);
@@ -38,6 +46,13 @@ static void map_set_px(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_co
LV_ATTRIBUTE_FAST_MEM static void map_normal(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride,
const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stride);
+#if LV_COLOR_SCREEN_TRANSP
+LV_ATTRIBUTE_FAST_MEM static void map_argb(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride,
+ const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa,
+ const lv_opa_t * mask, lv_coord_t mask_stride, lv_blend_mode_t blend_mode);
+
+#endif /*LV_COLOR_SCREEN_TRANSP*/
+
#if LV_DRAW_COMPLEX
static void map_blended(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride,
const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa,
@@ -55,22 +70,12 @@ static inline lv_color_t color_blend_true_color_multiply(lv_color_t fg, lv_color
/**********************
* MACROS
**********************/
-#if LV_COLOR_SCREEN_TRANSP == 0
#define FILL_NORMAL_MASK_PX(color) \
if(*mask == LV_OPA_COVER) *dest_buf = color; \
else *dest_buf = lv_color_mix(color, *dest_buf, *mask); \
mask++; \
dest_buf++;
-#else
-#define FILL_NORMAL_MASK_PX(color) \
- if(*mask == LV_OPA_COVER) *dest_buf = color; \
- else if(disp->driver->screen_transp) lv_color_mix_with_alpha(*dest_buf, dest_buf->ch.alpha, color, *mask, dest_buf, &dest_buf->ch.alpha); \
- else *dest_buf = lv_color_mix(color, *dest_buf, *mask); \
- mask++; \
- dest_buf++;
-#endif
-
#define MAP_NORMAL_MASK_PX(x) \
if(*mask_tmp_x) { \
if(*mask_tmp_x == LV_OPA_COVER) dest_buf[x] = src_buf[x]; \
@@ -78,15 +83,6 @@ static inline lv_color_t color_blend_true_color_multiply(lv_color_t fg, lv_color
} \
mask_tmp_x++;
-#define MAP_NORMAL_MASK_PX_SCR_TRANSP(x) \
- if(*mask_tmp_x) { \
- if(*mask_tmp_x == LV_OPA_COVER) dest_buf[x] = src_buf[x]; \
- else if(disp->driver->screen_transp) lv_color_mix_with_alpha(dest_buf[x], dest_buf[x].ch.alpha, \
- src_buf[x], *mask_tmp_x, &dest_buf[x], &dest_buf[x].ch.alpha); \
- else dest_buf[x] = lv_color_mix(src_buf[x], dest_buf[x], *mask_tmp_x); \
- } \
- mask_tmp_x++;
-
/**********************
* GLOBAL FUNCTIONS
@@ -121,9 +117,19 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_blend_basic(lv_draw_ctx_t * draw_ctx, cons
lv_disp_t * disp = _lv_refr_get_disp_refreshing();
lv_color_t * dest_buf = draw_ctx->buf;
if(disp->driver->set_px_cb == NULL) {
- dest_buf += dest_stride * (blend_area.y1 - draw_ctx->buf_area->y1) + (blend_area.x1 - draw_ctx->buf_area->x1);
+ if(disp->driver->screen_transp == 0) {
+ dest_buf += dest_stride * (blend_area.y1 - draw_ctx->buf_area->y1) + (blend_area.x1 - draw_ctx->buf_area->x1);
+ }
+ else {
+ /*With LV_COLOR_DEPTH 16 it means ARGB8565 (3 bytes format)*/
+ uint8_t * dest_buf8 = (uint8_t *) dest_buf;
+ dest_buf8 += dest_stride * (blend_area.y1 - draw_ctx->buf_area->y1) * LV_IMG_PX_SIZE_ALPHA_BYTE;
+ dest_buf8 += (blend_area.x1 - draw_ctx->buf_area->x1) * LV_IMG_PX_SIZE_ALPHA_BYTE;
+ dest_buf = (lv_color_t *)dest_buf8;
+ }
}
+
const lv_color_t * src_buf = dsc->src_buf;
lv_coord_t src_stride;
if(src_buf) {
@@ -137,7 +143,7 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_blend_basic(lv_draw_ctx_t * draw_ctx, cons
lv_coord_t mask_stride;
if(mask) {
mask_stride = lv_area_get_width(dsc->mask_area);
- mask += mask_stride * (dsc->mask_area->y1 - blend_area.y1) + (dsc->mask_area->x1 - blend_area.x1);
+ mask += mask_stride * (blend_area.y1 - dsc->mask_area->y1) + (blend_area.x1 - dsc->mask_area->x1);
}
else {
mask_stride = 0;
@@ -154,21 +160,29 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_blend_basic(lv_draw_ctx_t * draw_ctx, cons
map_set_px(dest_buf, &blend_area, dest_stride, src_buf, src_stride, dsc->opa, mask, mask_stride);
}
}
- else if(dsc->src_buf == NULL) {
- if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) {
- fill_normal(dest_buf, &blend_area, dest_stride, dsc->color, dsc->opa, mask, mask_stride);
+#if LV_COLOR_SCREEN_TRANSP
+ else if(disp->driver->screen_transp) {
+ if(dsc->src_buf == NULL) {
+ fill_argb(dest_buf, &blend_area, dest_stride, dsc->color, dsc->opa, mask, mask_stride);
}
-#if LV_DRAW_COMPLEX
else {
- fill_blended(dest_buf, &blend_area, dest_stride, dsc->color, dsc->opa, mask, mask_stride, dsc->blend_mode);
+ map_argb(dest_buf, &blend_area, dest_stride, src_buf, src_stride, dsc->opa, mask, mask_stride, dsc->blend_mode);
}
-#endif
}
- else {
- if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) {
+#endif
+ else if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) {
+ if(dsc->src_buf == NULL) {
+ fill_normal(dest_buf, &blend_area, dest_stride, dsc->color, dsc->opa, mask, mask_stride);
+ }
+ else {
map_normal(dest_buf, &blend_area, dest_stride, src_buf, src_stride, dsc->opa, mask, mask_stride);
}
+ }
+ else {
#if LV_DRAW_COMPLEX
+ if(dsc->src_buf == NULL) {
+ fill_blended(dest_buf, &blend_area, dest_stride, dsc->color, dsc->opa, mask, mask_stride, dsc->blend_mode);
+ }
else {
map_blended(dest_buf, &blend_area, dest_stride, src_buf, src_stride, dsc->opa, mask, mask_stride, dsc->blend_mode);
}
@@ -203,6 +217,8 @@ static void fill_set_px(lv_color_t * dest_buf, const lv_area_t * blend_area, lv_
for(y = 0; y < h; y++) {
for(x = 0; x < w; x++) {
if(mask[x]) {
+
+
disp->driver->set_px_cb(disp->driver, (void *)dest_buf, dest_stride, blend_area->x1 + x, blend_area->y1 + y, color,
(uint32_t)((uint32_t)opa * mask[x]) >> 8);
}
@@ -215,7 +231,6 @@ static void fill_set_px(lv_color_t * dest_buf, const lv_area_t * blend_area, lv_
LV_ATTRIBUTE_FAST_MEM static void fill_normal(lv_color_t * dest_buf, const lv_area_t * dest_area,
lv_coord_t dest_stride, lv_color_t color, lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stride)
{
- lv_disp_t * disp = _lv_refr_get_disp_refreshing();
int32_t w = lv_area_get_width(dest_area);
int32_t h = lv_area_get_height(dest_area);
@@ -235,6 +250,14 @@ LV_ATTRIBUTE_FAST_MEM static void fill_normal(lv_color_t * dest_buf, const lv_ar
lv_color_t last_dest_color = lv_color_black();
lv_color_t last_res_color = lv_color_mix(color, last_dest_color, opa);
+#if LV_COLOR_MIX_ROUND_OFS == 0 && LV_COLOR_DEPTH == 16
+ /*lv_color_mix work with an optimized algorithm with 16 bit color depth.
+ *However, it introduces some rounded error on opa.
+ *Introduce the same error here too to make lv_color_premult produces the same result */
+ opa = (uint32_t)((uint32_t)opa + 4) >> 3;
+ opa = opa << 3;
+#endif
+
uint16_t color_premult[3];
lv_color_premult(color, opa, color_premult);
lv_opa_t opa_inv = 255 - opa;
@@ -243,19 +266,7 @@ LV_ATTRIBUTE_FAST_MEM static void fill_normal(lv_color_t * dest_buf, const lv_ar
for(x = 0; x < w; x++) {
if(last_dest_color.full != dest_buf[x].full) {
last_dest_color = dest_buf[x];
-
-#if LV_COLOR_SCREEN_TRANSP
- if(disp->driver->screen_transp) {
- lv_color_mix_with_alpha(dest_buf[x], dest_buf[x].ch.alpha, color, opa, &last_res_color,
- &last_res_color.ch.alpha);
- }
- else
-#else
- LV_UNUSED(disp);
-#endif
- {
- last_res_color = lv_color_mix_premult(color_premult, dest_buf[x], opa_inv);
- }
+ last_res_color = lv_color_mix_premult(color_premult, dest_buf[x], opa_inv);
}
dest_buf[x] = last_res_color;
}
@@ -335,17 +346,8 @@ LV_ATTRIBUTE_FAST_MEM static void fill_normal(lv_color_t * dest_buf, const lv_ar
if(*mask != last_mask) opa_tmp = *mask == LV_OPA_COVER ? opa :
(uint32_t)((uint32_t)(*mask) * opa) >> 8;
if(*mask != last_mask || last_dest_color.full != dest_buf[x].full) {
-#if LV_COLOR_SCREEN_TRANSP
- if(disp->driver->screen_transp) {
- lv_color_mix_with_alpha(dest_buf[x], dest_buf[x].ch.alpha, color, opa_tmp, &last_res_color,
- &last_res_color.ch.alpha);
- }
- else
-#endif
- {
- if(opa_tmp == LV_OPA_COVER) last_res_color = color;
- else last_res_color = lv_color_mix(color, dest_buf[x], opa_tmp);
- }
+ if(opa_tmp == LV_OPA_COVER) last_res_color = color;
+ else last_res_color = lv_color_mix(color, dest_buf[x], opa_tmp);
last_mask = *mask;
last_dest_color.full = dest_buf[x].full;
}
@@ -360,6 +362,161 @@ LV_ATTRIBUTE_FAST_MEM static void fill_normal(lv_color_t * dest_buf, const lv_ar
}
}
+#if LV_COLOR_SCREEN_TRANSP
+static inline void set_px_argb(uint8_t * buf, lv_color_t color, lv_opa_t opa)
+{
+ lv_color_t bg_color;
+ lv_color_t res_color;
+ lv_opa_t bg_opa = buf[LV_IMG_PX_SIZE_ALPHA_BYTE - 1];
+#if LV_COLOR_DEPTH == 8
+ bg_color.full = buf[0];
+ lv_color_mix_with_alpha(bg_color, bg_opa, color, opa, &res_color, &buf[1]);
+ if(buf[1] <= LV_OPA_MIN) return;
+ buf[0] = res_color.full;
+#elif LV_COLOR_DEPTH == 16
+ bg_color.full = buf[0] + (buf[1] << 8);
+ lv_color_mix_with_alpha(bg_color, bg_opa, color, opa, &res_color, &buf[2]);
+ if(buf[2] <= LV_OPA_MIN) return;
+ buf[0] = res_color.full & 0xff;
+ buf[1] = res_color.full >> 8;
+#elif LV_COLOR_DEPTH == 32
+ bg_color = *((lv_color_t *)buf);
+ lv_color_mix_with_alpha(bg_color, bg_opa, color, opa, &res_color, &buf[3]);
+ if(buf[3] <= LV_OPA_MIN) return;
+ buf[0] = res_color.ch.blue;
+ buf[1] = res_color.ch.green;
+ buf[2] = res_color.ch.red;
+#endif
+}
+
+static inline void set_px_argb_blend(uint8_t * buf, lv_color_t color, lv_opa_t opa, lv_color_t (*blend_fp)(lv_color_t,
+ lv_color_t, lv_opa_t))
+{
+ static lv_color_t last_dest_color;
+ static lv_color_t last_src_color;
+ static lv_color_t last_res_color;
+ static uint32_t last_opa = 0xffff; /*Set to an invalid value for first*/
+
+ lv_color_t bg_color;
+
+ /*Get the BG color*/
+#if LV_COLOR_DEPTH == 8
+ if(buf[1] <= LV_OPA_MIN) return;
+ bg_color.full = buf[0];
+#elif LV_COLOR_DEPTH == 16
+ if(buf[2] <= LV_OPA_MIN) return;
+ bg_color.full = buf[0] + (buf[1] << 8);
+#elif LV_COLOR_DEPTH == 32
+ if(buf[3] <= LV_OPA_MIN) return;
+ bg_color = *((lv_color_t *)buf);
+#endif
+
+ /*Get the result color*/
+ if(last_dest_color.full != bg_color.full || last_src_color.full != color.full || last_opa != opa) {
+ last_dest_color = bg_color;
+ last_src_color = color;
+ last_opa = opa;
+ last_res_color = blend_fp(last_src_color, last_dest_color, last_opa);
+ }
+
+ /*Set the result color*/
+#if LV_COLOR_DEPTH == 8
+ buf[0] = res_color.full;
+#elif LV_COLOR_DEPTH == 16
+ buf[0] = last_res_color.full & 0xff;
+ buf[1] = last_res_color.full >> 8;
+#elif LV_COLOR_DEPTH == 32
+ buf[0] = last_res_color.ch.blue;
+ buf[1] = last_res_color.ch.green;
+ buf[2] = last_res_color.ch.red;
+#endif
+
+}
+
+LV_ATTRIBUTE_FAST_MEM static void fill_argb(lv_color_t * dest_buf, const lv_area_t * dest_area,
+ lv_coord_t dest_stride, lv_color_t color, lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stride)
+{
+ uint8_t * dest_buf8 = (uint8_t *) dest_buf;
+ int32_t w = lv_area_get_width(dest_area);
+ int32_t h = lv_area_get_height(dest_area);
+
+ int32_t x;
+ int32_t y;
+
+ uint8_t ctmp[LV_IMG_PX_SIZE_ALPHA_BYTE];
+ lv_memcpy(ctmp, &color, sizeof(lv_color_t));
+ ctmp[LV_IMG_PX_SIZE_ALPHA_BYTE - 1] = opa;
+
+ /*No mask*/
+ if(mask == NULL) {
+ if(opa >= LV_OPA_MAX) {
+ for(x = 0; x < w; x++) {
+ lv_memcpy(dest_buf8, ctmp, LV_IMG_PX_SIZE_ALPHA_BYTE);
+ dest_buf8 += LV_IMG_PX_SIZE_ALPHA_BYTE;
+ }
+
+ dest_buf8 += (dest_stride - w) * LV_IMG_PX_SIZE_ALPHA_BYTE;
+
+ for(y = 1; y < h; y++) {
+ lv_memcpy(dest_buf8, (uint8_t *) dest_buf, w * LV_IMG_PX_SIZE_ALPHA_BYTE);
+ dest_buf8 += dest_stride * LV_IMG_PX_SIZE_ALPHA_BYTE;
+ }
+ }
+ /*Has opacity*/
+ else {
+ uint8_t * dest_buf8_row = dest_buf8;
+ for(y = 0; y < h; y++) {
+ for(x = 0; x < w; x++) {
+ set_px_argb(dest_buf8, color, opa);
+ dest_buf8 += LV_IMG_PX_SIZE_ALPHA_BYTE;
+ }
+ dest_buf8_row += dest_stride * LV_IMG_PX_SIZE_ALPHA_BYTE;
+ dest_buf8 = dest_buf8_row;
+ }
+ }
+ }
+ /*Masked*/
+ else {
+ /*Only the mask matters*/
+ if(opa >= LV_OPA_MAX) {
+ uint8_t * dest_buf8_row = dest_buf8;
+ for(y = 0; y < h; y++) {
+ for(x = 0; x < w; x++) {
+ set_px_argb(dest_buf8, color, *mask);
+ mask++;
+ dest_buf8 += LV_IMG_PX_SIZE_ALPHA_BYTE;
+ }
+ dest_buf8_row += dest_stride * LV_IMG_PX_SIZE_ALPHA_BYTE;
+ dest_buf8 = dest_buf8_row;
+ }
+ }
+ /*With opacity*/
+ else {
+ /*Buffer the result color to avoid recalculating the same color*/
+ lv_opa_t last_mask = LV_OPA_TRANSP;
+ lv_opa_t opa_tmp = LV_OPA_TRANSP;
+
+ uint8_t * dest_buf8_row = dest_buf8;
+ for(y = 0; y < h; y++) {
+ for(x = 0; x < w; x++) {
+ if(*mask) {
+ if(*mask != last_mask) opa_tmp = *mask == LV_OPA_COVER ? opa :
+ (uint32_t)((uint32_t)(*mask) * opa) >> 8;
+
+ set_px_argb(dest_buf8, color, opa_tmp);
+ }
+ dest_buf8 += LV_IMG_PX_SIZE_ALPHA_BYTE;
+ mask++;
+ }
+ dest_buf8_row += dest_stride * LV_IMG_PX_SIZE_ALPHA_BYTE;
+ dest_buf8 = dest_buf8_row;
+ mask += (mask_stride - w);
+ }
+ }
+ }
+}
+#endif
+
#if LV_DRAW_COMPLEX
static void fill_blended(lv_color_t * dest_buf, const lv_area_t * dest_area,
lv_coord_t dest_stride, lv_color_t color, lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stride,
@@ -477,10 +634,6 @@ LV_ATTRIBUTE_FAST_MEM static void map_normal(lv_color_t * dest_buf, const lv_are
int32_t x;
int32_t y;
-#if LV_COLOR_SCREEN_TRANSP
- lv_disp_t * disp = _lv_refr_get_disp_refreshing();
-#endif
-
/*Simple fill (maybe with opacity), no masking*/
if(mask == NULL) {
if(opa >= LV_OPA_MAX) {
@@ -493,16 +646,7 @@ LV_ATTRIBUTE_FAST_MEM static void map_normal(lv_color_t * dest_buf, const lv_are
else {
for(y = 0; y < h; y++) {
for(x = 0; x < w; x++) {
-#if LV_COLOR_SCREEN_TRANSP
- if(disp->driver->screen_transp) {
- lv_color_mix_with_alpha(dest_buf[x], dest_buf[x].ch.alpha, src_buf[x], opa, &dest_buf[x],
- &dest_buf[x].ch.alpha);
- }
- else
-#endif
- {
- dest_buf[x] = lv_color_mix(src_buf[x], dest_buf[x], opa);
- }
+ dest_buf[x] = lv_color_mix(src_buf[x], dest_buf[x], opa);
}
dest_buf += dest_stride;
src_buf += src_stride;
@@ -523,11 +667,7 @@ LV_ATTRIBUTE_FAST_MEM static void map_normal(lv_color_t * dest_buf, const lv_are
}
#else
for(x = 0; x < w && ((lv_uintptr_t)mask_tmp_x & 0x3); x++) {
-#if LV_COLOR_SCREEN_TRANSP
- MAP_NORMAL_MASK_PX_SCR_TRANSP(x)
-#else
MAP_NORMAL_MASK_PX(x)
-#endif
}
uint32_t * mask32 = (uint32_t *)mask_tmp_x;
@@ -541,17 +681,10 @@ LV_ATTRIBUTE_FAST_MEM static void map_normal(lv_color_t * dest_buf, const lv_are
}
else {
mask_tmp_x = (const lv_opa_t *)mask32;
-#if LV_COLOR_SCREEN_TRANSP
- MAP_NORMAL_MASK_PX_SCR_TRANSP(x)
- MAP_NORMAL_MASK_PX_SCR_TRANSP(x + 1)
- MAP_NORMAL_MASK_PX_SCR_TRANSP(x + 2)
- MAP_NORMAL_MASK_PX_SCR_TRANSP(x + 3)
-#else
MAP_NORMAL_MASK_PX(x)
MAP_NORMAL_MASK_PX(x + 1)
MAP_NORMAL_MASK_PX(x + 2)
MAP_NORMAL_MASK_PX(x + 3)
-#endif
}
}
mask32++;
@@ -559,11 +692,7 @@ LV_ATTRIBUTE_FAST_MEM static void map_normal(lv_color_t * dest_buf, const lv_are
mask_tmp_x = (const lv_opa_t *)mask32;
for(; x < w ; x++) {
-#if LV_COLOR_SCREEN_TRANSP
- MAP_NORMAL_MASK_PX_SCR_TRANSP(x)
-#else
MAP_NORMAL_MASK_PX(x)
-#endif
}
#endif
dest_buf += dest_stride;
@@ -577,25 +706,160 @@ LV_ATTRIBUTE_FAST_MEM static void map_normal(lv_color_t * dest_buf, const lv_are
for(x = 0; x < w; x++) {
if(mask[x]) {
lv_opa_t opa_tmp = mask[x] >= LV_OPA_MAX ? opa : ((opa * mask[x]) >> 8);
+ dest_buf[x] = lv_color_mix(src_buf[x], dest_buf[x], opa_tmp);
+ }
+ }
+ dest_buf += dest_stride;
+ src_buf += src_stride;
+ mask += mask_stride;
+ }
+ }
+ }
+}
+
+
+
#if LV_COLOR_SCREEN_TRANSP
- if(disp->driver->screen_transp) {
- lv_color_mix_with_alpha(dest_buf[x], dest_buf[x].ch.alpha, src_buf[x], opa_tmp,
- &dest_buf[x], &dest_buf[x].ch.alpha);
+LV_ATTRIBUTE_FAST_MEM static void map_argb(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride,
+ const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa,
+ const lv_opa_t * mask, lv_coord_t mask_stride, lv_blend_mode_t blend_mode)
+
+{
+ uint8_t * dest_buf8 = (uint8_t *) dest_buf;
+
+ int32_t w = lv_area_get_width(dest_area);
+ int32_t h = lv_area_get_height(dest_area);
+
+ int32_t x;
+ int32_t y;
+
+ lv_color_t (*blend_fp)(lv_color_t, lv_color_t, lv_opa_t);
+ switch(blend_mode) {
+ case LV_BLEND_MODE_ADDITIVE:
+ blend_fp = color_blend_true_color_additive;
+ break;
+ case LV_BLEND_MODE_SUBTRACTIVE:
+ blend_fp = color_blend_true_color_subtractive;
+ break;
+ case LV_BLEND_MODE_MULTIPLY:
+ blend_fp = color_blend_true_color_multiply;
+ break;
+ default:
+ blend_fp = NULL;
+ }
+
+ /*Simple fill (maybe with opacity), no masking*/
+ if(mask == NULL) {
+ if(opa >= LV_OPA_MAX) {
+ if(blend_fp == NULL && LV_COLOR_DEPTH == 32) {
+ for(y = 0; y < h; y++) {
+ lv_memcpy(dest_buf, src_buf, w * sizeof(lv_color_t));
+ dest_buf += dest_stride;
+ src_buf += src_stride;
+ }
+ }
+ else {
+ uint8_t * dest_buf8_row = dest_buf8;
+ for(y = 0; y < h; y++) {
+ if(blend_fp == NULL) {
+ for(x = 0; x < w; x++) {
+ set_px_argb(dest_buf8, src_buf[x], LV_OPA_COVER);
+ dest_buf8 += LV_IMG_PX_SIZE_ALPHA_BYTE;
}
- else
-#endif
- {
- dest_buf[x] = lv_color_mix(src_buf[x], dest_buf[x], opa_tmp);
+ }
+ else {
+ for(x = 0; x < w; x++) {
+ set_px_argb_blend(dest_buf8, src_buf[x], LV_OPA_COVER, blend_fp);
+ dest_buf8 += LV_IMG_PX_SIZE_ALPHA_BYTE;
}
}
+
+ dest_buf8_row += dest_stride * LV_IMG_PX_SIZE_ALPHA_BYTE;
+ dest_buf8 = dest_buf8_row;
+ src_buf += src_stride;
}
- dest_buf += dest_stride;
+ }
+ }
+ /*No mask but opacity*/
+ else {
+ uint8_t * dest_buf8_row = dest_buf8;
+ for(y = 0; y < h; y++) {
+ if(blend_fp == NULL) {
+ for(x = 0; x < w; x++) {
+ set_px_argb(dest_buf8, src_buf[x], opa);
+ dest_buf8 += LV_IMG_PX_SIZE_ALPHA_BYTE;
+ }
+ }
+ else {
+ for(x = 0; x < w; x++) {
+ set_px_argb_blend(dest_buf8, src_buf[x], opa, blend_fp);
+ dest_buf8 += LV_IMG_PX_SIZE_ALPHA_BYTE;
+ }
+ }
+
+ dest_buf8_row += dest_stride * LV_IMG_PX_SIZE_ALPHA_BYTE;
+ dest_buf8 = dest_buf8_row;
+ src_buf += src_stride;
+ }
+ }
+ }
+ /*Masked*/
+ else {
+ /*Only the mask matters*/
+ if(opa > LV_OPA_MAX) {
+ uint8_t * dest_buf8_row = dest_buf8;
+ for(y = 0; y < h; y++) {
+ if(blend_fp == NULL) {
+ for(x = 0; x < w; x++) {
+ set_px_argb(dest_buf8, src_buf[x], mask[x]);
+ dest_buf8 += LV_IMG_PX_SIZE_ALPHA_BYTE;
+ }
+ }
+ else {
+ for(x = 0; x < w; x++) {
+ set_px_argb_blend(dest_buf8, src_buf[x], mask[x], blend_fp);
+ dest_buf8 += LV_IMG_PX_SIZE_ALPHA_BYTE;
+ }
+ }
+ dest_buf8_row += dest_stride * LV_IMG_PX_SIZE_ALPHA_BYTE;
+ dest_buf8 = dest_buf8_row;
+ src_buf += src_stride;
+ mask += mask_stride;
+ }
+ }
+ /*Handle opa and mask values too*/
+ else {
+ uint8_t * dest_buf8_row = dest_buf8;
+ for(y = 0; y < h; y++) {
+ if(blend_fp == NULL) {
+ for(x = 0; x < w; x++) {
+ if(mask[x]) {
+ lv_opa_t opa_tmp = mask[x] >= LV_OPA_MAX ? opa : ((opa * mask[x]) >> 8);
+ set_px_argb(dest_buf8, src_buf[x], opa_tmp);
+ }
+ dest_buf8 += LV_IMG_PX_SIZE_ALPHA_BYTE;
+ }
+ }
+ else {
+ for(x = 0; x < w; x++) {
+ if(mask[x]) {
+ lv_opa_t opa_tmp = mask[x] >= LV_OPA_MAX ? opa : ((opa * mask[x]) >> 8);
+ set_px_argb_blend(dest_buf8, src_buf[x], opa_tmp, blend_fp);
+ }
+ dest_buf8 += LV_IMG_PX_SIZE_ALPHA_BYTE;
+ }
+ }
+ dest_buf8_row += dest_stride * LV_IMG_PX_SIZE_ALPHA_BYTE;
+ dest_buf8 = dest_buf8_row;
src_buf += src_stride;
mask += mask_stride;
}
}
}
}
+#endif
+
+
#if LV_DRAW_COMPLEX
static void map_blended(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride,
const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa,
@@ -624,13 +888,21 @@ static void map_blended(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_c
return;
}
+ lv_color_t last_dest_color;
+ lv_color_t last_src_color;
/*Simple fill (maybe with opacity), no masking*/
if(mask == NULL) {
- /*The map will be indexed from `draw_area->x1` so compensate it.*/
-
+ last_dest_color = dest_buf[0];
+ last_src_color = src_buf[0];
+ lv_color_t last_res_color = blend_fp(last_src_color, last_dest_color, opa);
for(y = 0; y < h; y++) {
for(x = 0; x < w; x++) {
- dest_buf[x] = blend_fp(src_buf[x], dest_buf[x], opa);
+ if(last_src_color.full != src_buf[x].full || last_dest_color.full != dest_buf[x].full) {
+ last_dest_color = dest_buf[x];
+ last_src_color = src_buf[x];
+ last_res_color = blend_fp(last_src_color, last_dest_color, opa);
+ }
+ dest_buf[x] = last_res_color;
}
dest_buf += dest_stride;
src_buf += src_stride;
@@ -638,11 +910,21 @@ static void map_blended(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_c
}
/*Masked*/
else {
+ last_dest_color = dest_buf[0];
+ last_src_color = src_buf[0];
+ lv_opa_t last_opa = mask[0] >= LV_OPA_MAX ? opa : ((opa * mask[0]) >> 8);
+ lv_color_t last_res_color = blend_fp(last_src_color, last_dest_color, last_opa);
for(y = 0; y < h; y++) {
for(x = 0; x < w; x++) {
if(mask[x] == 0) continue;
lv_opa_t opa_tmp = mask[x] >= LV_OPA_MAX ? opa : ((opa * mask[x]) >> 8);
- dest_buf[x] = blend_fp(src_buf[x], dest_buf[x], opa_tmp);
+ if(last_src_color.full != src_buf[x].full || last_dest_color.full != dest_buf[x].full || last_opa != opa_tmp) {
+ last_dest_color = dest_buf[x];
+ last_src_color = src_buf[x];
+ last_opa = opa_tmp;
+ last_res_color = blend_fp(last_src_color, last_dest_color, last_opa);
+ }
+ dest_buf[x] = last_res_color;
}
dest_buf += dest_stride;
src_buf += src_stride;
diff --git a/src/draw/sw/lv_draw_sw_gradient.c b/src/draw/sw/lv_draw_sw_gradient.c
index c5b32073e..4e4663266 100644
--- a/src/draw/sw/lv_draw_sw_gradient.c
+++ b/src/draw/sw/lv_draw_sw_gradient.c
@@ -21,23 +21,16 @@
#define GRAD_CONV(t, x) t = x
#endif
+#undef ALIGN
#if defined(LV_ARCH_64)
#define ALIGN(X) (((X) + 7) & ~7)
#else
#define ALIGN(X) (((X) + 3) & ~3)
#endif
-#define MAX_WIN_RES 1024 /**TODO: Find a way to get this information: max(horz_res, vert_res)*/
-
-#if _DITHER_GRADIENT
- #if LV_DITHER_ERROR_DIFFUSION == 1
- #define LV_DEFAULT_GRAD_CACHE_SIZE sizeof(lv_gradient_cache_t) + MAX_WIN_RES * sizeof(lv_grad_color_t) + MAX_WIN_RES * sizeof(lv_color_t) + MAX_WIN_RES * sizeof(lv_scolor24_t)
- #else
- #define LV_DEFAULT_GRAD_CACHE_SIZE sizeof(lv_gradient_cache_t) + MAX_WIN_RES * sizeof(lv_grad_color_t) + MAX_WIN_RES * sizeof(lv_color_t)
- #endif /* LV_DITHER_ERROR_DIFFUSION */
-#else
- #define LV_DEFAULT_GRAD_CACHE_SIZE sizeof(lv_gradient_cache_t) + MAX_WIN_RES * sizeof(lv_grad_color_t)
-#endif /* _DITHER_GRADIENT */
+#if LV_GRAD_CACHE_DEF_SIZE != 0 && LV_GRAD_CACHE_DEF_SIZE < 256
+ #error "LV_GRAD_CACHE_DEF_SIZE is too small"
+#endif
/**********************
* STATIC PROTOTYPES
@@ -94,8 +87,6 @@ static lv_grad_t * next_in_cache(lv_grad_t * item)
if(item == NULL)
return (lv_grad_t *)LV_GC_ROOT(_lv_grad_cache_mem);
- if(item == NULL)
- return NULL;
size_t s = get_cache_item_size(item);
/*Compute the size for this cache item*/
@@ -334,6 +325,8 @@ LV_ATTRIBUTE_FAST_MEM lv_grad_color_t lv_gradient_calculate(const lv_grad_dsc_t
}
}
+ LV_ASSERT(d != 0);
+
/*Then interpolate*/
frac -= min;
lv_opa_t mix = (frac * 255) / d;
diff --git a/src/draw/sw/lv_draw_sw_img.c b/src/draw/sw/lv_draw_sw_img.c
index 76c308419..9578bc7cc 100644
--- a/src/draw/sw/lv_draw_sw_img.c
+++ b/src/draw/sw/lv_draw_sw_img.c
@@ -17,6 +17,7 @@
/*********************
* DEFINES
*********************/
+#define MAX_BUF_SIZE (uint32_t) lv_disp_get_hor_res(_lv_refr_get_disp_refreshing())
/**********************
* TYPEDEFS
@@ -25,6 +26,8 @@
/**********************
* STATIC PROTOTYPES
**********************/
+static void convert_cb(const lv_area_t * dest_area, const void * src_buf, lv_coord_t src_w, lv_coord_t src_h,
+ lv_coord_t src_stride, const lv_draw_img_dsc_t * draw_dsc, lv_img_cf_t cf, lv_color_t * cbuf, lv_opa_t * abuf);
/**********************
* STATIC VARIABLES
@@ -38,6 +41,7 @@
* GLOBAL FUNCTIONS
**********************/
+
LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_img_decoded(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * draw_dsc,
const lv_area_t * coords, const uint8_t * src_buf, lv_img_cf_t cf)
{
@@ -46,276 +50,248 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_img_decoded(struct _lv_draw_ctx_t * draw_c
lv_area_copy(&draw_area, draw_ctx->clip_area);
bool mask_any = lv_draw_mask_is_any(&draw_area);
+ bool transform = draw_dsc->angle != 0 || draw_dsc->zoom != LV_IMG_ZOOM_NONE ? true : false;
+ lv_area_t blend_area;
lv_draw_sw_blend_dsc_t blend_dsc;
- lv_memset_00(&blend_dsc, sizeof(blend_dsc));
+
+ lv_memset_00(&blend_dsc, sizeof(lv_draw_sw_blend_dsc_t));
blend_dsc.opa = draw_dsc->opa;
blend_dsc.blend_mode = draw_dsc->blend_mode;
+ blend_dsc.blend_area = &blend_area;
/*The simplest case just copy the pixels into the draw_buf*/
- if(!mask_any && draw_dsc->angle == 0 && draw_dsc->zoom == LV_IMG_ZOOM_NONE &&
- cf == LV_IMG_CF_TRUE_COLOR && draw_dsc->recolor_opa == LV_OPA_TRANSP) {
+ if(!mask_any && !transform && cf == LV_IMG_CF_TRUE_COLOR && draw_dsc->recolor_opa == LV_OPA_TRANSP) {
+ blend_dsc.src_buf = (const lv_color_t *)src_buf;
+
+ blend_dsc.blend_area = coords;
+ lv_draw_sw_blend(draw_ctx, &blend_dsc);
+ }
+ else if(!mask_any && !transform && cf == LV_IMG_CF_ALPHA_8BIT) {
+ lv_area_t clipped_coords;
+ if(!_lv_area_intersect(&clipped_coords, coords, draw_ctx->clip_area)) return;
+
+ blend_dsc.mask_buf = (lv_opa_t *)src_buf;
+ blend_dsc.mask_area = coords;
+ blend_dsc.src_buf = NULL;
+ blend_dsc.color = draw_dsc->recolor;
+ blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED;
+
blend_dsc.blend_area = coords;
+ lv_draw_sw_blend(draw_ctx, &blend_dsc);
+ }
+#if LV_COLOR_DEPTH == 16
+ else if(!mask_any && !transform && cf == LV_IMG_CF_RGB565A8 && draw_dsc->recolor_opa == LV_OPA_TRANSP) {
+ lv_coord_t src_w = lv_area_get_width(coords);
+ lv_coord_t src_h = lv_area_get_height(coords);
blend_dsc.src_buf = (const lv_color_t *)src_buf;
+ blend_dsc.mask_buf = (lv_opa_t *)src_buf;
+ blend_dsc.mask_buf += sizeof(lv_color_t) * src_w * src_h;
+ blend_dsc.blend_area = coords;
+ blend_dsc.mask_area = coords;
+ blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED;
lv_draw_sw_blend(draw_ctx, &blend_dsc);
}
+#endif
/*In the other cases every pixel need to be checked one-by-one*/
else {
- //#if LV_DRAW_COMPLEX
- /*The pixel size in byte is different if an alpha byte is added too*/
- uint8_t px_size_byte = cf == LV_IMG_CF_TRUE_COLOR_ALPHA ? LV_IMG_PX_SIZE_ALPHA_BYTE : sizeof(lv_color_t);
-
- /*Go to the first displayed pixel of the map*/
- int32_t src_stride = lv_area_get_width(coords);
-
- lv_color_t c;
- lv_color_t chroma_keyed_color = LV_COLOR_CHROMA_KEY;
- uint32_t px_i = 0;
-
- const uint8_t * map_px;
-
- lv_coord_t draw_area_h = lv_area_get_height(&draw_area);
- lv_coord_t draw_area_w = lv_area_get_width(&draw_area);
-
- lv_area_t blend_area;
- blend_area.x1 = draw_area.x1;
- blend_area.x2 = draw_area.x2;
- blend_area.y1 = draw_area.y1;
- blend_area.y2 = blend_area.y1;
- blend_dsc.blend_area = &blend_area;
-
- bool transform = draw_dsc->angle != 0 || draw_dsc->zoom != LV_IMG_ZOOM_NONE ? true : false;
- /*Simple ARGB image. Handle it as special case because it's very common*/
- if(!mask_any && !transform && cf == LV_IMG_CF_TRUE_COLOR_ALPHA && draw_dsc->recolor_opa == LV_OPA_TRANSP) {
- uint32_t hor_res = (uint32_t) lv_disp_get_hor_res(_lv_refr_get_disp_refreshing());
- uint32_t mask_buf_size = lv_area_get_size(&draw_area) > (uint32_t) hor_res ? hor_res : lv_area_get_size(&draw_area);
- lv_color_t * src_buf_rgb = lv_mem_buf_get(mask_buf_size * sizeof(lv_color_t));
- lv_opa_t * mask_buf = lv_mem_buf_get(mask_buf_size);
- blend_dsc.mask_buf = mask_buf;
- blend_dsc.mask_area = &blend_area;
- blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED;
- blend_dsc.src_buf = src_buf_rgb;
-
- const uint8_t * src_buf_tmp = src_buf;
- src_buf_tmp += src_stride * (draw_area.y1 - coords->y1) * px_size_byte;
- src_buf_tmp += (draw_area.x1 - coords->x1) * px_size_byte;
-
- int32_t x;
- int32_t y;
- for(y = 0; y < draw_area_h; y++) {
- map_px = src_buf_tmp;
- for(x = 0; x < draw_area_w; x++, map_px += px_size_byte, px_i++) {
- lv_opa_t px_opa = map_px[LV_IMG_PX_SIZE_ALPHA_BYTE - 1];
- mask_buf[px_i] = px_opa;
- if(px_opa) {
-#if LV_COLOR_DEPTH == 8 || LV_COLOR_DEPTH == 1
- src_buf_rgb[px_i].full = map_px[0];
-#elif LV_COLOR_DEPTH == 16
- src_buf_rgb[px_i].full = map_px[0] + (map_px[1] << 8);
-#elif LV_COLOR_DEPTH == 32
- src_buf_rgb[px_i].full = *((uint32_t *)map_px);
-#endif
- }
-#if LV_COLOR_DEPTH == 32
- src_buf_rgb[px_i].ch.alpha = 0xFF;
-#endif
- }
-
- src_buf_tmp += src_stride * px_size_byte;
- if(px_i + draw_area_w <= mask_buf_size) {
- blend_area.y2 ++;
- }
- else {
- lv_draw_sw_blend(draw_ctx, &blend_dsc);
-
- blend_area.y1 = blend_area.y2 + 1;
- blend_area.y2 = blend_area.y1;
-
- px_i = 0;
- }
- }
- /*Flush the last part*/
- if(blend_area.y1 != blend_area.y2) {
- blend_area.y2--;
- lv_draw_sw_blend(draw_ctx, &blend_dsc);
- }
-
- lv_mem_buf_release(mask_buf);
- lv_mem_buf_release(src_buf_rgb);
+ blend_area.x1 = draw_ctx->clip_area->x1;
+ blend_area.x2 = draw_ctx->clip_area->x2;
+ blend_area.y1 = draw_ctx->clip_area->y1;
+ blend_area.y2 = draw_ctx->clip_area->y2;
+
+ lv_coord_t src_w = lv_area_get_width(coords);
+ lv_coord_t src_h = lv_area_get_height(coords);
+ lv_coord_t blend_h = lv_area_get_height(&blend_area);
+ lv_coord_t blend_w = lv_area_get_width(&blend_area);
+
+ uint32_t max_buf_size = MAX_BUF_SIZE;
+ uint32_t blend_size = lv_area_get_size(&blend_area);
+ uint32_t buf_h;
+ uint32_t buf_w = blend_w;
+ if(blend_size <= max_buf_size) {
+ buf_h = blend_h;
}
- /*Most complicated case: transform or other mask or chroma keyed*/
else {
- /*Build the image and a mask line-by-line*/
- uint32_t hor_res = (uint32_t) lv_disp_get_hor_res(_lv_refr_get_disp_refreshing());
- uint32_t mask_buf_size = lv_area_get_size(&draw_area) > hor_res ? hor_res : lv_area_get_size(&draw_area);
- lv_color_t * src_buf_rgb = lv_mem_buf_get(mask_buf_size * sizeof(lv_color_t));
- lv_opa_t * mask_buf = lv_mem_buf_get(mask_buf_size);
- blend_dsc.mask_buf = mask_buf;
- blend_dsc.mask_area = &blend_area;
- blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED;
- blend_dsc.src_buf = src_buf_rgb;
-
- const uint8_t * src_buf_tmp = NULL;
-#if LV_DRAW_COMPLEX
- lv_img_transform_dsc_t trans_dsc;
- lv_memset_00(&trans_dsc, sizeof(lv_img_transform_dsc_t));
+ /*Round to full lines*/
+ buf_h = max_buf_size / blend_w;
+ }
+
+ /*Create buffers and masks*/
+ uint32_t buf_size = buf_w * buf_h;
+
+ lv_color_t * rgb_buf = lv_mem_buf_get(buf_size * sizeof(lv_color_t));
+ lv_opa_t * mask_buf = lv_mem_buf_get(buf_size);
+ blend_dsc.mask_buf = mask_buf;
+ blend_dsc.mask_area = &blend_area;
+ blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED;
+ blend_dsc.src_buf = rgb_buf;
+ lv_coord_t y_last = blend_area.y2;
+ blend_area.y2 = blend_area.y1 + buf_h - 1;
+
+ lv_draw_mask_res_t mask_res_def = (cf != LV_IMG_CF_TRUE_COLOR || draw_dsc->angle ||
+ draw_dsc->zoom != LV_IMG_ZOOM_NONE) ?
+ LV_DRAW_MASK_RES_CHANGED : LV_DRAW_MASK_RES_FULL_COVER;
+ blend_dsc.mask_res = mask_res_def;
+
+ while(blend_area.y1 <= y_last) {
+ /*Apply transformations if any or separate the channels*/
+ lv_area_t transform_area;
+ lv_area_copy(&transform_area, &blend_area);
+ lv_area_move(&transform_area, -coords->x1, -coords->y1);
if(transform) {
- trans_dsc.cfg.angle = draw_dsc->angle;
- trans_dsc.cfg.zoom = draw_dsc->zoom;
- trans_dsc.cfg.src = src_buf;
- trans_dsc.cfg.src_w = src_stride;
- trans_dsc.cfg.src_h = lv_area_get_height(coords);
- trans_dsc.cfg.cf = cf;
- trans_dsc.cfg.pivot_x = draw_dsc->pivot.x;
- trans_dsc.cfg.pivot_y = draw_dsc->pivot.y;
- trans_dsc.cfg.color = draw_dsc->recolor;
- trans_dsc.cfg.antialias = draw_dsc->antialias;
-
- _lv_img_buf_transform_init(&trans_dsc);
+ lv_draw_transform(draw_ctx, &transform_area, src_buf, src_w, src_h, src_w,
+ draw_dsc, cf, rgb_buf, mask_buf);
}
else {
- src_buf_tmp = src_buf;
- src_buf_tmp += src_stride * (draw_area.y1 - coords->y1) * px_size_byte;
- src_buf_tmp += (draw_area.x1 - coords->x1) * px_size_byte;
- }
-#endif
- uint16_t recolor_premult[3] = {0};
- lv_opa_t recolor_opa_inv = 255 - draw_dsc->recolor_opa;
- if(draw_dsc->recolor_opa != 0) {
- lv_color_premult(draw_dsc->recolor, draw_dsc->recolor_opa, recolor_premult);
+ convert_cb(&transform_area, src_buf, src_w, src_h, src_w, draw_dsc, cf, rgb_buf, mask_buf);
}
- blend_dsc.mask_res = (cf != LV_IMG_CF_TRUE_COLOR || draw_dsc->angle ||
- draw_dsc->zoom != LV_IMG_ZOOM_NONE) ? LV_DRAW_MASK_RES_CHANGED : LV_DRAW_MASK_RES_FULL_COVER;
-
- /*Prepare the `mask_buf`if there are other masks*/
- if(mask_any) {
- lv_memset_ff(mask_buf, mask_buf_size);
- }
-
- int32_t x;
- int32_t y;
-#if LV_DRAW_COMPLEX
- int32_t rot_y = blend_area.y1 - coords->y1;
-#endif
- for(y = 0; y < draw_area_h; y++) {
- map_px = src_buf_tmp;
-#if LV_DRAW_COMPLEX
- uint32_t px_i_start = px_i;
- int32_t rot_x = blend_area.x1 - coords->x1;
-#endif
-
- for(x = 0; x < draw_area_w; x++, px_i++, map_px += px_size_byte) {
-
-#if LV_DRAW_COMPLEX
- if(transform) {
-
- /*Transform*/
- bool ret;
- ret = _lv_img_buf_transform(&trans_dsc, rot_x + x, rot_y + y);
- if(ret == false) {
- mask_buf[px_i] = LV_OPA_TRANSP;
- continue;
- }
- else {
- mask_buf[px_i] = trans_dsc.res.opa;
- c.full = trans_dsc.res.color.full;
- }
- }
- /*No transform*/
- else
-#endif
- {
- if(cf == LV_IMG_CF_TRUE_COLOR_ALPHA) {
- lv_opa_t px_opa = map_px[LV_IMG_PX_SIZE_ALPHA_BYTE - 1];
- mask_buf[px_i] = px_opa;
- if(px_opa == 0) {
-#if LV_COLOR_DEPTH == 32
- src_buf_rgb[px_i].full = 0;
-#endif
- continue;
- }
- }
- else {
- mask_buf[px_i] = 0xFF;
- }
-
-#if LV_COLOR_DEPTH == 1
- c.full = map_px[0];
-#elif LV_COLOR_DEPTH == 8
- c.full = map_px[0];
-#elif LV_COLOR_DEPTH == 16
- c.full = map_px[0] + (map_px[1] << 8);
-#elif LV_COLOR_DEPTH == 32
- c.full = *((uint32_t *)map_px);
- c.ch.alpha = 0xFF;
-#endif
- if(cf == LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED) {
- if(c.full == chroma_keyed_color.full) {
- mask_buf[px_i] = LV_OPA_TRANSP;
-#if LV_COLOR_DEPTH == 32
- src_buf_rgb[px_i].full = 0;
-#endif
- continue;
- }
- }
-
- }
- if(draw_dsc->recolor_opa != 0) {
- c = lv_color_mix_premult(recolor_premult, c, recolor_opa_inv);
- }
-
- src_buf_rgb[px_i].full = c.full;
+ /*Apply recolor*/
+ if(draw_dsc->recolor_opa > LV_OPA_MIN) {
+ uint16_t premult_v[3];
+ lv_opa_t recolor_opa = draw_dsc->recolor_opa;
+ lv_color_t recolor = draw_dsc->recolor;
+ lv_color_premult(recolor, recolor_opa, premult_v);
+ recolor_opa = 255 - recolor_opa;
+ uint32_t i;
+ for(i = 0; i < buf_size; i++) {
+ rgb_buf[i] = lv_color_mix_premult(premult_v, rgb_buf[i], recolor_opa);
}
+ }
#if LV_DRAW_COMPLEX
- /*Apply the masks if any*/
- if(mask_any) {
- lv_draw_mask_res_t mask_res_sub;
- mask_res_sub = lv_draw_mask_apply(mask_buf + px_i_start, blend_area.x1,
- y + draw_area.y1, draw_area_w);
- if(mask_res_sub == LV_DRAW_MASK_RES_TRANSP) {
- lv_memset_00(mask_buf + px_i_start, draw_area_w);
+ /*Apply the masks if any*/
+ if(mask_any) {
+ lv_coord_t y;
+ lv_opa_t * mask_buf_tmp = mask_buf;
+ for(y = blend_area.y1; y <= blend_area.y2; y++) {
+ lv_draw_mask_res_t mask_res_line;
+ mask_res_line = lv_draw_mask_apply(mask_buf_tmp, blend_area.x1, y, blend_w);
+
+ if(mask_res_line == LV_DRAW_MASK_RES_TRANSP) {
+ lv_memset_00(mask_buf_tmp, blend_w);
blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED;
}
- else if(mask_res_sub == LV_DRAW_MASK_RES_CHANGED) {
+ else if(mask_res_line == LV_DRAW_MASK_RES_CHANGED) {
blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED;
}
+ mask_buf_tmp += blend_w;
}
+ }
#endif
- src_buf_tmp += src_stride * px_size_byte;
- if(px_i + draw_area_w < mask_buf_size) {
- blend_area.y2 ++;
- }
- else {
- lv_draw_sw_blend(draw_ctx, &blend_dsc);
+ /*Blend*/
+ lv_draw_sw_blend(draw_ctx, &blend_dsc);
- blend_area.y1 = blend_area.y2 + 1;
- blend_area.y2 = blend_area.y1;
+ /*Go the the next lines*/
+ blend_area.y1 = blend_area.y2 + 1;
+ blend_area.y2 = blend_area.y1 + buf_h - 1;
+ if(blend_area.y2 > y_last) blend_area.y2 = y_last;
+ }
- px_i = 0;
- blend_dsc.mask_res = (cf != LV_IMG_CF_TRUE_COLOR || draw_dsc->angle ||
- draw_dsc->zoom != LV_IMG_ZOOM_NONE) ? LV_DRAW_MASK_RES_CHANGED : LV_DRAW_MASK_RES_FULL_COVER;
+ lv_mem_buf_release(mask_buf);
+ lv_mem_buf_release(rgb_buf);
+ }
+}
- /*Prepare the `mask_buf`if there are other masks*/
- if(mask_any) {
- lv_memset_ff(mask_buf, mask_buf_size);
- }
- }
+/**********************
+ * STATIC FUNCTIONS
+ **********************/
+
+/* Separate the image channels to RGB and Alpha to match LV_COLOR_DEPTH settings*/
+static void convert_cb(const lv_area_t * dest_area, const void * src_buf, lv_coord_t src_w, lv_coord_t src_h,
+ lv_coord_t src_stride, const lv_draw_img_dsc_t * draw_dsc, lv_img_cf_t cf, lv_color_t * cbuf, lv_opa_t * abuf)
+{
+ LV_UNUSED(draw_dsc);
+ LV_UNUSED(src_h);
+ LV_UNUSED(src_w);
+
+ const uint8_t * src_tmp8 = (const uint8_t *)src_buf;
+ lv_coord_t y;
+ lv_coord_t x;
+
+ if(cf == LV_IMG_CF_TRUE_COLOR || cf == LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED) {
+ uint32_t px_cnt = lv_area_get_size(dest_area);
+ lv_memset_ff(abuf, px_cnt);
+
+ src_tmp8 += (src_stride * dest_area->y1 * sizeof(lv_color_t)) + dest_area->x1 * sizeof(lv_color_t);
+ uint32_t dest_w = lv_area_get_width(dest_area);
+ uint32_t dest_w_byte = dest_w * sizeof(lv_color_t);
+
+ lv_coord_t src_stride_byte = src_stride * sizeof(lv_color_t);
+ lv_color_t * cbuf_tmp = cbuf;
+ for(y = dest_area->y1; y <= dest_area->y2; y++) {
+ lv_memcpy(cbuf_tmp, src_tmp8, dest_w_byte);
+ src_tmp8 += src_stride_byte;
+ cbuf_tmp += dest_w;
+ }
+
+ /*Make "holes" for with Chroma keying*/
+ if(cf == LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED) {
+ uint32_t i;
+ lv_color_t chk = LV_COLOR_CHROMA_KEY;
+#if LV_COLOR_DEPTH == 8 || LV_COLOR_DEPTH == 1
+ uint8_t * cbuf_uint = (uint8_t *)cbuf;
+ uint8_t chk_v = chk.full;
+#elif LV_COLOR_DEPTH == 16
+ uint16_t * cbuf_uint = (uint16_t *)cbuf;
+ uint16_t chk_v = chk.full;
+#elif LV_COLOR_DEPTH == 32
+ uint32_t * cbuf_uint = (uint32_t *)cbuf;
+ uint32_t chk_v = chk.full;
+#endif
+ for(i = 0; i < px_cnt; i++) {
+ if(chk_v == cbuf_uint[i]) abuf[i] = 0x00;
}
+ }
+ }
+ else if(cf == LV_IMG_CF_TRUE_COLOR_ALPHA) {
+ src_tmp8 += (src_stride * dest_area->y1 * LV_IMG_PX_SIZE_ALPHA_BYTE) + dest_area->x1 * LV_IMG_PX_SIZE_ALPHA_BYTE;
+
+ lv_coord_t src_new_line_step_px = (src_stride - lv_area_get_width(dest_area));
+ lv_coord_t src_new_line_step_byte = src_new_line_step_px * LV_IMG_PX_SIZE_ALPHA_BYTE;
+
+ lv_coord_t dest_h = lv_area_get_height(dest_area);
+ lv_coord_t dest_w = lv_area_get_width(dest_area);
+ for(y = 0; y < dest_h; y++) {
+ for(x = 0; x < dest_w; x++) {
+ abuf[x] = src_tmp8[LV_IMG_PX_SIZE_ALPHA_BYTE - 1];
+#if LV_COLOR_DEPTH == 8 || LV_COLOR_DEPTH == 1
+ cbuf[x].full = *src_tmp8;
+#elif LV_COLOR_DEPTH == 16
+ cbuf[x].full = *src_tmp8 + ((*(src_tmp8 + 1)) << 8);
+#elif LV_COLOR_DEPTH == 32
+ cbuf[x] = *((lv_color_t *) src_tmp8);
+ cbuf[x].ch.alpha = 0xff;
+#endif
+ src_tmp8 += LV_IMG_PX_SIZE_ALPHA_BYTE;
- /*Flush the last part*/
- if(blend_area.y1 != blend_area.y2) {
- blend_area.y2--;
- lv_draw_sw_blend(draw_ctx, &blend_dsc);
}
+ cbuf += dest_w;
+ abuf += dest_w;
+ src_tmp8 += src_new_line_step_byte;
+ }
+ }
+ else if(cf == LV_IMG_CF_RGB565A8) {
+ src_tmp8 += (src_stride * dest_area->y1 * sizeof(lv_color_t)) + dest_area->x1 * sizeof(lv_color_t);
+
+ lv_coord_t src_stride_byte = src_stride * sizeof(lv_color_t);
- lv_mem_buf_release(mask_buf);
- lv_mem_buf_release(src_buf_rgb);
+ lv_coord_t dest_h = lv_area_get_height(dest_area);
+ lv_coord_t dest_w = lv_area_get_width(dest_area);
+ for(y = 0; y < dest_h; y++) {
+ lv_memcpy(cbuf, src_tmp8, dest_w * sizeof(lv_color_t));
+ cbuf += dest_w;
+ src_tmp8 += src_stride_byte;
+ }
+
+ src_tmp8 = (const uint8_t *)src_buf;
+ src_tmp8 += sizeof(lv_color_t) * src_w * src_h;
+ src_tmp8 += src_stride * dest_area->y1 + dest_area->x1;
+ for(y = 0; y < dest_h; y++) {
+ lv_memcpy(abuf, src_tmp8, dest_w);
+ abuf += dest_w;
+ src_tmp8 += src_stride;
}
}
}
-
-/**********************
- * STATIC FUNCTIONS
- **********************/
diff --git a/src/draw/sw/lv_draw_sw_layer.c b/src/draw/sw/lv_draw_sw_layer.c
new file mode 100644
index 000000000..b53c662e2
--- /dev/null
+++ b/src/draw/sw/lv_draw_sw_layer.c
@@ -0,0 +1,150 @@
+/**
+ * @file lv_draw_sw_layer.h
+ *
+ */
+
+/*********************
+ * INCLUDES
+ *********************/
+#include "lv_draw_sw.h"
+#include "../../hal/lv_hal_disp.h"
+#include "../../misc/lv_area.h"
+#include "../../core/lv_refr.h"
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+
+/**********************
+ * STATIC VARIABLES
+ **********************/
+
+/**********************
+ * GLOBAL VARIABLES
+ **********************/
+
+/**********************
+ * MACROS
+ **********************/
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+
+
+struct _lv_draw_layer_ctx_t * lv_draw_sw_layer_create(struct _lv_draw_ctx_t * draw_ctx, lv_draw_layer_ctx_t * layer_ctx,
+ lv_draw_layer_flags_t flags)
+{
+ if(LV_COLOR_SCREEN_TRANSP == 0 && (flags & LV_DRAW_LAYER_FLAG_HAS_ALPHA)) {
+ LV_LOG_WARN("Rendering this widget needs LV_COLOR_SCREEN_TRANSP 1");
+ return NULL;
+ }
+
+ lv_draw_sw_layer_ctx_t * layer_sw_ctx = (lv_draw_sw_layer_ctx_t *) layer_ctx;
+ uint32_t px_size = flags & LV_DRAW_LAYER_FLAG_HAS_ALPHA ? LV_IMG_PX_SIZE_ALPHA_BYTE : sizeof(lv_color_t);
+ if(flags & LV_DRAW_LAYER_FLAG_CAN_SUBDIVIDE) {
+ layer_sw_ctx->buf_size_bytes = LV_LAYER_SIMPLE_BUF_SIZE;
+ uint32_t full_size = lv_area_get_size(&layer_sw_ctx->base_draw.area_full) * px_size;
+ if(layer_sw_ctx->buf_size_bytes > full_size) layer_sw_ctx->buf_size_bytes = full_size;
+ layer_sw_ctx->base_draw.buf = lv_mem_alloc(layer_sw_ctx->buf_size_bytes);
+ if(layer_sw_ctx->base_draw.buf == NULL) {
+ LV_LOG_WARN("Cannot allocate %"LV_PRIu32" bytes for layer buffer. Allocating %"LV_PRIu32" bytes instead. (Reduced performance)",
+ (uint32_t)layer_sw_ctx->buf_size_bytes, (uint32_t)LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE * px_size);
+ layer_sw_ctx->buf_size_bytes = LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE;
+ layer_sw_ctx->base_draw.buf = lv_mem_alloc(layer_sw_ctx->buf_size_bytes);
+ if(layer_sw_ctx->base_draw.buf == NULL) {
+ return NULL;
+ }
+ }
+ layer_sw_ctx->base_draw.area_act = layer_sw_ctx->base_draw.area_full;
+ layer_sw_ctx->base_draw.area_act.y2 = layer_sw_ctx->base_draw.area_full.y1;
+ lv_coord_t w = lv_area_get_width(&layer_sw_ctx->base_draw.area_act);
+ layer_sw_ctx->base_draw.max_row_with_alpha = layer_sw_ctx->buf_size_bytes / w / LV_IMG_PX_SIZE_ALPHA_BYTE;
+ layer_sw_ctx->base_draw.max_row_with_no_alpha = layer_sw_ctx->buf_size_bytes / w / sizeof(lv_color_t);
+ }
+ else {
+ layer_sw_ctx->base_draw.area_act = layer_sw_ctx->base_draw.area_full;
+ layer_sw_ctx->buf_size_bytes = lv_area_get_size(&layer_sw_ctx->base_draw.area_full) * px_size;
+ layer_sw_ctx->base_draw.buf = lv_mem_alloc(layer_sw_ctx->buf_size_bytes);
+ lv_memset_00(layer_sw_ctx->base_draw.buf, layer_sw_ctx->buf_size_bytes);
+ layer_sw_ctx->has_alpha = flags & LV_DRAW_LAYER_FLAG_HAS_ALPHA ? 1 : 0;
+ if(layer_sw_ctx->base_draw.buf == NULL) {
+ return NULL;
+ }
+
+ draw_ctx->buf = layer_sw_ctx->base_draw.buf;
+ draw_ctx->buf_area = &layer_sw_ctx->base_draw.area_act;
+ draw_ctx->clip_area = &layer_sw_ctx->base_draw.area_act;
+
+ lv_disp_t * disp_refr = _lv_refr_get_disp_refreshing();
+ disp_refr->driver->screen_transp = flags & LV_DRAW_LAYER_FLAG_HAS_ALPHA ? 1 : 0;
+ }
+
+ return layer_ctx;
+}
+
+void lv_draw_sw_layer_adjust(struct _lv_draw_ctx_t * draw_ctx, struct _lv_draw_layer_ctx_t * layer_ctx,
+ lv_draw_layer_flags_t flags)
+{
+
+ lv_draw_sw_layer_ctx_t * layer_sw_ctx = (lv_draw_sw_layer_ctx_t *) layer_ctx;
+ lv_disp_t * disp_refr = _lv_refr_get_disp_refreshing();
+ if(flags & LV_DRAW_LAYER_FLAG_HAS_ALPHA) {
+ lv_memset_00(layer_ctx->buf, layer_sw_ctx->buf_size_bytes);
+ layer_sw_ctx->has_alpha = 1;
+ disp_refr->driver->screen_transp = 1;
+ }
+ else {
+ layer_sw_ctx->has_alpha = 0;
+ disp_refr->driver->screen_transp = 0;
+ }
+
+ draw_ctx->buf = layer_ctx->buf;
+ draw_ctx->buf_area = &layer_ctx->area_act;
+ draw_ctx->clip_area = &layer_ctx->area_act;
+}
+
+void lv_draw_sw_layer_blend(struct _lv_draw_ctx_t * draw_ctx, struct _lv_draw_layer_ctx_t * layer_ctx,
+ const lv_draw_img_dsc_t * draw_dsc)
+{
+ lv_draw_sw_layer_ctx_t * layer_sw_ctx = (lv_draw_sw_layer_ctx_t *) layer_ctx;
+
+ lv_img_dsc_t img;
+ img.data = draw_ctx->buf;
+ img.header.always_zero = 0;
+ img.header.w = lv_area_get_width(draw_ctx->buf_area);
+ img.header.h = lv_area_get_height(draw_ctx->buf_area);
+ img.header.cf = layer_sw_ctx->has_alpha ? LV_IMG_CF_TRUE_COLOR_ALPHA : LV_IMG_CF_TRUE_COLOR;
+
+ /*Restore the original draw_ctx*/
+ draw_ctx->buf = layer_ctx->original.buf;
+ draw_ctx->buf_area = layer_ctx->original.buf_area;
+ draw_ctx->clip_area = layer_ctx->original.clip_area;
+ lv_disp_t * disp_refr = _lv_refr_get_disp_refreshing();
+ disp_refr->driver->screen_transp = layer_ctx->original.screen_transp;
+
+ /*Blend the layer*/
+ lv_draw_img(draw_ctx, draw_dsc, &layer_ctx->area_act, &img);
+ lv_draw_wait_for_finish(draw_ctx);
+ lv_img_cache_invalidate_src(&img);
+}
+
+void lv_draw_sw_layer_destroy(lv_draw_ctx_t * draw_ctx, lv_draw_layer_ctx_t * layer_ctx)
+{
+ LV_UNUSED(draw_ctx);
+
+ lv_mem_free(layer_ctx->buf);
+}
+
+
+/**********************
+ * STATIC FUNCTIONS
+ **********************/
diff --git a/src/draw/sw/lv_draw_sw_letter.c b/src/draw/sw/lv_draw_sw_letter.c
index e7578cffb..9522888c9 100644
--- a/src/draw/sw/lv_draw_sw_letter.c
+++ b/src/draw/sw/lv_draw_sw_letter.c
@@ -97,13 +97,30 @@ void lv_draw_sw_letter(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc
{
lv_font_glyph_dsc_t g;
bool g_ret = lv_font_get_glyph_dsc(dsc->font, &g, letter, '\0');
- if(g_ret == false) {
+ if(g_ret == false) {
/*Add warning if the dsc is not found
*but do not print warning for non printable ASCII chars (e.g. '\n')*/
if(letter >= 0x20 &&
letter != 0xf8ff && /*LV_SYMBOL_DUMMY*/
letter != 0x200c) { /*ZERO WIDTH NON-JOINER*/
- LV_LOG_WARN("lv_draw_letter: glyph dsc. not found for U+%X", (unsigned int)letter);
+ LV_LOG_WARN("lv_draw_letter: glyph dsc. not found for U+%" PRIX32, letter);
+
+#if LV_USE_FONT_PLACEHOLDER
+ /* draw placeholder */
+ lv_area_t glyph_coords;
+ lv_draw_rect_dsc_t glyph_dsc;
+ lv_coord_t begin_x = pos_p->x + g.ofs_x;
+ lv_coord_t begin_y = pos_p->y + g.ofs_y;
+ lv_area_set(&glyph_coords, begin_x, begin_y, begin_x + g.box_w, begin_y + g.box_h);
+ lv_draw_rect_dsc_init(&glyph_dsc);
+ glyph_dsc.bg_opa = LV_OPA_MIN;
+ glyph_dsc.outline_opa = LV_OPA_MIN;
+ glyph_dsc.shadow_opa = LV_OPA_MIN;
+ glyph_dsc.bg_img_opa = LV_OPA_MIN;
+ glyph_dsc.border_color = dsc->color;
+ glyph_dsc.border_width = 1;
+ draw_ctx->draw_rect(draw_ctx, &glyph_dsc, &glyph_coords);
+#endif
}
return;
}
@@ -157,6 +174,24 @@ LV_ATTRIBUTE_FAST_MEM static void draw_letter_normal(lv_draw_ctx_t * draw_ctx, c
uint32_t shades;
if(bpp == 3) bpp = 4;
+#if LV_USE_IMGFONT
+ if(bpp == LV_IMGFONT_BPP) { //is imgfont
+ lv_area_t fill_area;
+ fill_area.x1 = pos->x;
+ fill_area.y1 = pos->y;
+ fill_area.x2 = pos->x + g->box_w - 1;
+ fill_area.y2 = pos->y + g->box_h - 1;
+ lv_draw_img_dsc_t img_dsc;
+ lv_draw_img_dsc_init(&img_dsc);
+ img_dsc.angle = 0;
+ img_dsc.zoom = LV_IMG_ZOOM_NONE;
+ img_dsc.opa = dsc->opa;
+ img_dsc.blend_mode = dsc->blend_mode;
+ lv_draw_img(draw_ctx, &img_dsc, &fill_area, map_p);
+ return;
+ }
+#endif
+
switch(bpp) {
case 1:
bpp_opa_table_p = _lv_bpp1_opa_table;
@@ -408,7 +443,7 @@ static void draw_letter_subpx(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_
#endif
lv_draw_sw_blend_dsc_t blend_dsc;
- lv_memset_00(&blend_dsc, sizeof(&blend_dsc));
+ lv_memset_00(&blend_dsc, sizeof(blend_dsc));
blend_dsc.blend_area = &map_area;
blend_dsc.mask_area = &map_area;
blend_dsc.src_buf = color_buf;
@@ -507,6 +542,7 @@ static void draw_letter_subpx(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_
map_area.y2 ++;
}
else {
+ blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED;
lv_draw_sw_blend(draw_ctx, &blend_dsc);
map_area.y1 = map_area.y2 + 1;
@@ -526,6 +562,7 @@ static void draw_letter_subpx(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_
/*Flush the last part*/
if(map_area.y1 != map_area.y2) {
map_area.y2--;
+ blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED;
lv_draw_sw_blend(draw_ctx, &blend_dsc);
}
diff --git a/src/draw/sw/lv_draw_sw_rect.c b/src/draw/sw/lv_draw_sw_rect.c
index d94431b0c..706ec6b59 100644
--- a/src/draw/sw/lv_draw_sw_rect.c
+++ b/src/draw/sw/lv_draw_sw_rect.c
@@ -128,7 +128,6 @@ static void draw_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, co
if(!mask_any && dsc->radius == 0 && (grad_dir == LV_GRAD_DIR_NONE)) {
blend_dsc.blend_area = &bg_coords;
blend_dsc.opa = dsc->bg_opa;
-
lv_draw_sw_blend(draw_ctx, &blend_dsc);
return;
}
@@ -333,6 +332,14 @@ static void draw_bg_img(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc
if(dsc->bg_img_src == NULL) return;
if(dsc->bg_img_opa <= LV_OPA_MIN) return;
+ lv_area_t clip_area;
+ if(!_lv_area_intersect(&clip_area, coords, draw_ctx->clip_area)) {
+ return;
+ }
+
+ const lv_area_t * clip_area_ori = draw_ctx->clip_area;
+ draw_ctx->clip_area = &clip_area;
+
lv_img_src_t src_type = lv_img_src_get_type(dsc->bg_img_src);
if(src_type == LV_IMG_SRC_SYMBOL) {
lv_point_t size;
@@ -353,43 +360,45 @@ static void draw_bg_img(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc
else {
lv_img_header_t header;
lv_res_t res = lv_img_decoder_get_info(dsc->bg_img_src, &header);
- if(res != LV_RES_OK) {
- LV_LOG_WARN("Couldn't read the background image");
- return;
- }
+ if(res == LV_RES_OK) {
+ lv_draw_img_dsc_t img_dsc;
+ lv_draw_img_dsc_init(&img_dsc);
+ img_dsc.blend_mode = dsc->blend_mode;
+ img_dsc.recolor = dsc->bg_img_recolor;
+ img_dsc.recolor_opa = dsc->bg_img_recolor_opa;
+ img_dsc.opa = dsc->bg_img_opa;
+
+ /*Center align*/
+ if(dsc->bg_img_tiled == false) {
+ lv_area_t area;
+ area.x1 = coords->x1 + lv_area_get_width(coords) / 2 - header.w / 2;
+ area.y1 = coords->y1 + lv_area_get_height(coords) / 2 - header.h / 2;
+ area.x2 = area.x1 + header.w - 1;
+ area.y2 = area.y1 + header.h - 1;
- lv_draw_img_dsc_t img_dsc;
- lv_draw_img_dsc_init(&img_dsc);
- img_dsc.blend_mode = dsc->blend_mode;
- img_dsc.recolor = dsc->bg_img_recolor;
- img_dsc.recolor_opa = dsc->bg_img_recolor_opa;
- img_dsc.opa = dsc->bg_img_opa;
-
- /*Center align*/
- if(dsc->bg_img_tiled == false) {
- lv_area_t area;
- area.x1 = coords->x1 + lv_area_get_width(coords) / 2 - header.w / 2;
- area.y1 = coords->y1 + lv_area_get_height(coords) / 2 - header.h / 2;
- area.x2 = area.x1 + header.w - 1;
- area.y2 = area.y1 + header.h - 1;
-
- lv_draw_img(draw_ctx, &img_dsc, &area, dsc->bg_img_src);
- }
- else {
- lv_area_t area;
- area.y1 = coords->y1;
- area.y2 = area.y1 + header.h - 1;
+ lv_draw_img(draw_ctx, &img_dsc, &area, dsc->bg_img_src);
+ }
+ else {
+ lv_area_t area;
+ area.y1 = coords->y1;
+ area.y2 = area.y1 + header.h - 1;
- for(; area.y1 <= coords->y2; area.y1 += header.h, area.y2 += header.h) {
+ for(; area.y1 <= coords->y2; area.y1 += header.h, area.y2 += header.h) {
- area.x1 = coords->x1;
- area.x2 = area.x1 + header.w - 1;
- for(; area.x1 <= coords->x2; area.x1 += header.w, area.x2 += header.w) {
- lv_draw_img(draw_ctx, &img_dsc, &area, dsc->bg_img_src);
+ area.x1 = coords->x1;
+ area.x2 = area.x1 + header.w - 1;
+ for(; area.x1 <= coords->x2; area.x1 += header.w, area.x2 += header.w) {
+ lv_draw_img(draw_ctx, &img_dsc, &area, dsc->bg_img_src);
+ }
}
}
}
+ else {
+ LV_LOG_WARN("Couldn't read the background image");
+ }
}
+
+ draw_ctx->clip_area = clip_area_ori;
}
static void draw_border(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords)
@@ -1150,12 +1159,13 @@ void draw_border_generic(lv_draw_ctx_t * draw_ctx, const lv_area_t * outer_area,
bool mask_any = lv_draw_mask_is_any(outer_area);
+#if LV_DRAW_COMPLEX
+
if(!mask_any && rout == 0 && rin == 0) {
draw_border_simple(draw_ctx, outer_area, inner_area, color, opa);
return;
}
-#if LV_DRAW_COMPLEX
/*Get clipped draw area which is the real draw area.
*It is always the same or inside `coords`*/
lv_area_t draw_area;
@@ -1272,12 +1282,12 @@ void draw_border_generic(lv_draw_ctx_t * draw_ctx, const lv_area_t * outer_area,
/*Draw the corners*/
lv_coord_t blend_w;
- /*Left and right corner together is they close to eachother*/
+ /*Left and right corner together if they are close to each other*/
if(!split_hor) {
/*Calculate the top corner and mirror it to the bottom*/
blend_area.x1 = draw_area.x1;
blend_area.x2 = draw_area.x2;
- lv_coord_t max_h = LV_MAX(rout, outer_area->y1 - inner_area->y1);
+ lv_coord_t max_h = LV_MAX(rout, inner_area->y1 - outer_area->y1);
for(h = 0; h < max_h; h++) {
lv_coord_t top_y = outer_area->y1 + h;
lv_coord_t bottom_y = outer_area->y2 - h;
@@ -1366,6 +1376,13 @@ void draw_border_generic(lv_draw_ctx_t * draw_ctx, const lv_area_t * outer_area,
#else /*LV_DRAW_COMPLEX*/
LV_UNUSED(blend_mode);
+ LV_UNUSED(rout);
+ LV_UNUSED(rin);
+ if(!mask_any) {
+ draw_border_simple(draw_ctx, outer_area, inner_area, color, opa);
+ return;
+ }
+
#endif /*LV_DRAW_COMPLEX*/
}
static void draw_border_simple(lv_draw_ctx_t * draw_ctx, const lv_area_t * outer_area, const lv_area_t * inner_area,
diff --git a/src/draw/sw/lv_draw_sw_transform.c b/src/draw/sw/lv_draw_sw_transform.c
new file mode 100644
index 000000000..80b1e6dea
--- /dev/null
+++ b/src/draw/sw/lv_draw_sw_transform.c
@@ -0,0 +1,496 @@
+/**
+ * @file lv_draw_sw_tranform.c
+ *
+ */
+
+/*********************
+ * INCLUDES
+ *********************/
+#include "lv_draw_sw.h"
+#include "../../misc/lv_assert.h"
+#include "../../misc/lv_area.h"
+#include "../../core/lv_refr.h"
+
+#if LV_DRAW_COMPLEX
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+typedef struct {
+ int32_t x_in;
+ int32_t y_in;
+ int32_t x_out;
+ int32_t y_out;
+ int32_t sinma;
+ int32_t cosma;
+ int32_t zoom;
+ int32_t angle;
+ int32_t pivot_x_256;
+ int32_t pivot_y_256;
+ lv_point_t pivot;
+} point_transform_dsc_t;
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+/**
+ * Transform a point with 1/256 precision (the output coordinates are upscaled by 256)
+ * @param t pointer to n initialized `point_transform_dsc_t` structure
+ * @param xin X coordinate to rotate
+ * @param yin Y coordinate to rotate
+ * @param xout upscaled, transformed X
+ * @param yout upscaled, transformed Y
+ */
+static void transform_point_upscaled(point_transform_dsc_t * t, int32_t xin, int32_t yin, int32_t * xout,
+ int32_t * yout);
+
+static void argb_no_aa(const uint8_t * src, lv_coord_t src_w, lv_coord_t src_h, lv_coord_t src_stride,
+ int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step,
+ int32_t x_end, lv_color_t * cbuf, uint8_t * abuf);
+
+static void rgb_no_aa(const uint8_t * src, lv_coord_t src_w, lv_coord_t src_h, lv_coord_t src_stride,
+ int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step,
+ int32_t x_end, lv_color_t * cbuf, uint8_t * abuf, lv_img_cf_t cf);
+
+#if LV_COLOR_DEPTH == 16
+static void rgb565a8_no_aa(const uint8_t * src, lv_coord_t src_w, lv_coord_t src_h, lv_coord_t src_stride,
+ int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step,
+ int32_t x_end, lv_color_t * cbuf, uint8_t * abuf);
+#endif
+
+static void argb_and_rgb_aa(const uint8_t * src, lv_coord_t src_w, lv_coord_t src_h, lv_coord_t src_stride,
+ int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step,
+ int32_t x_end, lv_color_t * cbuf, uint8_t * abuf, lv_img_cf_t cf);
+
+/**********************
+ * STATIC VARIABLES
+ **********************/
+
+/**********************
+ * MACROS
+ **********************/
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+
+void lv_draw_sw_transform(lv_draw_ctx_t * draw_ctx, const lv_area_t * dest_area, const void * src_buf,
+ lv_coord_t src_w, lv_coord_t src_h, lv_coord_t src_stride,
+ const lv_draw_img_dsc_t * draw_dsc, lv_img_cf_t cf, lv_color_t * cbuf, lv_opa_t * abuf)
+{
+ LV_UNUSED(draw_ctx);
+
+ point_transform_dsc_t tr_dsc;
+ tr_dsc.angle = -draw_dsc->angle;
+ tr_dsc.zoom = (256 * 256) / draw_dsc->zoom;
+ tr_dsc.pivot = draw_dsc->pivot;
+
+ int32_t angle_low = tr_dsc.angle / 10;
+ int32_t angle_high = angle_low + 1;
+ int32_t angle_rem = tr_dsc.angle - (angle_low * 10);
+
+ int32_t s1 = lv_trigo_sin(angle_low);
+ int32_t s2 = lv_trigo_sin(angle_high);
+
+ int32_t c1 = lv_trigo_sin(angle_low + 90);
+ int32_t c2 = lv_trigo_sin(angle_high + 90);
+
+ tr_dsc.sinma = (s1 * (10 - angle_rem) + s2 * angle_rem) / 10;
+ tr_dsc.cosma = (c1 * (10 - angle_rem) + c2 * angle_rem) / 10;
+ tr_dsc.sinma = tr_dsc.sinma >> (LV_TRIGO_SHIFT - 10);
+ tr_dsc.cosma = tr_dsc.cosma >> (LV_TRIGO_SHIFT - 10);
+ tr_dsc.pivot_x_256 = tr_dsc.pivot.x * 256;
+ tr_dsc.pivot_y_256 = tr_dsc.pivot.y * 256;
+
+ lv_coord_t dest_w = lv_area_get_width(dest_area);
+ lv_coord_t dest_h = lv_area_get_height(dest_area);
+ lv_coord_t y;
+ for(y = 0; y < dest_h; y++) {
+ int32_t xs1_ups, ys1_ups, xs2_ups, ys2_ups;
+
+ transform_point_upscaled(&tr_dsc, dest_area->x1, dest_area->y1 + y, &xs1_ups, &ys1_ups);
+ transform_point_upscaled(&tr_dsc, dest_area->x2, dest_area->y1 + y, &xs2_ups, &ys2_ups);
+
+ int32_t xs_diff = xs2_ups - xs1_ups;
+ int32_t ys_diff = ys2_ups - ys1_ups;
+ int32_t xs_step_256 = 0;
+ int32_t ys_step_256 = 0;
+ if(dest_w > 1) {
+ xs_step_256 = (256 * xs_diff) / (dest_w - 1);
+ ys_step_256 = (256 * ys_diff) / (dest_w - 1);
+ }
+ int32_t xs_ups = xs1_ups;
+ int32_t ys_ups = ys1_ups;
+
+ if(draw_dsc->antialias == 0) {
+ switch(cf) {
+ case LV_IMG_CF_TRUE_COLOR_ALPHA:
+ argb_no_aa(src_buf, src_w, src_h, src_stride, xs_ups, ys_ups, xs_step_256, ys_step_256, dest_w, cbuf, abuf);
+ break;
+ case LV_IMG_CF_TRUE_COLOR:
+ case LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED:
+ rgb_no_aa(src_buf, src_w, src_h, src_stride, xs_ups, ys_ups, xs_step_256, ys_step_256, dest_w, cbuf, abuf, cf);
+ break;
+
+#if LV_COLOR_DEPTH == 16
+ case LV_IMG_CF_RGB565A8:
+ rgb565a8_no_aa(src_buf, src_w, src_h, src_stride, xs_ups, ys_ups, xs_step_256, ys_step_256, dest_w, cbuf, abuf);
+ break;
+#endif
+ default:
+ break;
+ }
+ }
+ else {
+ argb_and_rgb_aa(src_buf, src_w, src_h, src_stride, xs_ups, ys_ups, xs_step_256, ys_step_256, dest_w, cbuf, abuf, cf);
+ }
+
+ cbuf += dest_w;
+ abuf += dest_w;
+ }
+}
+
+/**********************
+ * STATIC FUNCTIONS
+ **********************/
+
+static void rgb_no_aa(const uint8_t * src, lv_coord_t src_w, lv_coord_t src_h, lv_coord_t src_stride,
+ int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step,
+ int32_t x_end, lv_color_t * cbuf, uint8_t * abuf, lv_img_cf_t cf)
+{
+ int32_t xs_ups_start = xs_ups;
+ int32_t ys_ups_start = ys_ups;
+ lv_disp_t * d = _lv_refr_get_disp_refreshing();
+ lv_color_t ck = d->driver->color_chroma_key;
+
+ lv_memset_ff(abuf, x_end);
+
+ lv_coord_t x;
+ for(x = 0; x < x_end; x++) {
+ xs_ups = xs_ups_start + ((xs_step * x) >> 8);
+ ys_ups = ys_ups_start + ((ys_step * x) >> 8);
+
+ int32_t xs_int = xs_ups >> 8;
+ int32_t ys_int = ys_ups >> 8;
+ if(xs_int < 0 || xs_int >= src_w || ys_int < 0 || ys_int >= src_h) {
+ abuf[x] = 0x00;
+ }
+ else {
+
+#if LV_COLOR_DEPTH == 8
+ const uint8_t * src_tmp = src;
+ src_tmp += ys_int * src_stride + xs_int;
+ cbuf[x].full = src_tmp[0];
+#elif LV_COLOR_DEPTH == 16
+ const lv_color_t * src_tmp = (const lv_color_t *)src;
+ src_tmp += ys_int * src_stride + xs_int;
+ cbuf[x] = *src_tmp;
+#elif LV_COLOR_DEPTH == 32
+ const uint8_t * src_tmp = src;
+ src_tmp += (ys_int * src_stride * sizeof(lv_color_t)) + xs_int * sizeof(lv_color_t);
+ cbuf[x].full = *((uint32_t *)src_tmp);
+#endif
+ }
+ if(cf == LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED && cbuf[x].full == ck.full) {
+ abuf[x] = 0x00;
+ }
+ }
+}
+
+static void argb_no_aa(const uint8_t * src, lv_coord_t src_w, lv_coord_t src_h, lv_coord_t src_stride,
+ int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step,
+ int32_t x_end, lv_color_t * cbuf, uint8_t * abuf)
+{
+ int32_t xs_ups_start = xs_ups;
+ int32_t ys_ups_start = ys_ups;
+
+ lv_coord_t x;
+ for(x = 0; x < x_end; x++) {
+ xs_ups = xs_ups_start + ((xs_step * x) >> 8);
+ ys_ups = ys_ups_start + ((ys_step * x) >> 8);
+
+ int32_t xs_int = xs_ups >> 8;
+ int32_t ys_int = ys_ups >> 8;
+ if(xs_int < 0 || xs_int >= src_w || ys_int < 0 || ys_int >= src_h) {
+ abuf[x] = 0;
+ }
+ else {
+ const uint8_t * src_tmp = src;
+ src_tmp += (ys_int * src_stride * LV_IMG_PX_SIZE_ALPHA_BYTE) + xs_int * LV_IMG_PX_SIZE_ALPHA_BYTE;
+
+#if LV_COLOR_DEPTH == 8
+ cbuf[x].full = src_tmp[0];
+#elif LV_COLOR_DEPTH == 16
+ cbuf[x].full = src_tmp[0] + (src_tmp[1] << 8);
+#elif LV_COLOR_DEPTH == 32
+ cbuf[x].full = *((uint32_t *)src_tmp);
+#endif
+ abuf[x] = src_tmp[LV_IMG_PX_SIZE_ALPHA_BYTE - 1];
+ }
+ }
+}
+
+#if LV_COLOR_DEPTH == 16
+static void rgb565a8_no_aa(const uint8_t * src, lv_coord_t src_w, lv_coord_t src_h, lv_coord_t src_stride,
+ int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step,
+ int32_t x_end, lv_color_t * cbuf, uint8_t * abuf)
+{
+ int32_t xs_ups_start = xs_ups;
+ int32_t ys_ups_start = ys_ups;
+
+ lv_coord_t x;
+ for(x = 0; x < x_end; x++) {
+ xs_ups = xs_ups_start + ((xs_step * x) >> 8);
+ ys_ups = ys_ups_start + ((ys_step * x) >> 8);
+
+ int32_t xs_int = xs_ups >> 8;
+ int32_t ys_int = ys_ups >> 8;
+ if(xs_int < 0 || xs_int >= src_w || ys_int < 0 || ys_int >= src_h) {
+ abuf[x] = 0;
+ }
+ else {
+ const lv_color_t * src_tmp = (const lv_color_t *)src;
+ src_tmp += ys_int * src_stride + xs_int;
+ cbuf[x] = *src_tmp;
+
+ const lv_opa_t * a_tmp = src + src_stride * src_h * sizeof(lv_color_t);
+ a_tmp += ys_int * src_stride + xs_int;
+ abuf[x] = *a_tmp;
+ }
+ }
+}
+#endif
+
+
+static void argb_and_rgb_aa(const uint8_t * src, lv_coord_t src_w, lv_coord_t src_h, lv_coord_t src_stride,
+ int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step,
+ int32_t x_end, lv_color_t * cbuf, uint8_t * abuf, lv_img_cf_t cf)
+{
+ int32_t xs_ups_start = xs_ups;
+ int32_t ys_ups_start = ys_ups;
+ bool has_alpha;
+ int32_t px_size;
+ lv_color_t ck = {0};
+ switch(cf) {
+ case LV_IMG_CF_TRUE_COLOR:
+ has_alpha = false;
+ px_size = sizeof(lv_color_t);
+ break;
+ case LV_IMG_CF_TRUE_COLOR_ALPHA:
+ has_alpha = true;
+ px_size = LV_IMG_PX_SIZE_ALPHA_BYTE;
+ break;
+ case LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED: {
+ has_alpha = true;
+ px_size = sizeof(lv_color_t);
+ lv_disp_t * d = _lv_refr_get_disp_refreshing();
+ ck = d->driver->color_chroma_key;
+ break;
+ }
+#if LV_COLOR_DEPTH == 16
+ case LV_IMG_CF_RGB565A8:
+ has_alpha = true;
+ px_size = sizeof(lv_color_t);
+ break;
+#endif
+ default:
+ return;
+ }
+
+ lv_coord_t x;
+ for(x = 0; x < x_end; x++) {
+ xs_ups = xs_ups_start + ((xs_step * x) >> 8);
+ ys_ups = ys_ups_start + ((ys_step * x) >> 8);
+
+ int32_t xs_int = xs_ups >> 8;
+ int32_t ys_int = ys_ups >> 8;
+
+ /*Fully out of the image*/
+ if(xs_int < 0 || xs_int >= src_w || ys_int < 0 || ys_int >= src_h) {
+ abuf[x] = 0x00;
+ continue;
+ }
+
+ /*Get the direction the hor and ver neighbor
+ *`fract` will be in range of 0x00..0xFF and `next` (+/-1) indicates the direction*/
+ int32_t xs_fract = xs_ups & 0xFF;
+ int32_t ys_fract = ys_ups & 0xFF;
+
+ int32_t x_next;
+ int32_t y_next;
+ if(xs_fract < 0x80) {
+ x_next = -1;
+ xs_fract = (0x7F - xs_fract) * 2;
+ }
+ else {
+ x_next = 1;
+ xs_fract = (xs_fract - 0x80) * 2;
+ }
+ if(ys_fract < 0x80) {
+ y_next = -1;
+ ys_fract = (0x7F - ys_fract) * 2;
+ }
+ else {
+ y_next = 1;
+ ys_fract = (ys_fract - 0x80) * 2;
+ }
+
+ const uint8_t * src_tmp = src;
+ src_tmp += (ys_int * src_stride * px_size) + xs_int * px_size;
+
+
+ if(xs_int + x_next >= 0 &&
+ xs_int + x_next <= src_w - 1 &&
+ ys_int + y_next >= 0 &&
+ ys_int + y_next <= src_h - 1) {
+
+ const uint8_t * px_base = src_tmp;
+ const uint8_t * px_hor = src_tmp + x_next * px_size;
+ const uint8_t * px_ver = src_tmp + y_next * src_stride * px_size;
+ lv_color_t c_base;
+ lv_color_t c_ver;
+ lv_color_t c_hor;
+
+ if(has_alpha) {
+ lv_opa_t a_base;
+ lv_opa_t a_ver;
+ lv_opa_t a_hor;
+ if(cf == LV_IMG_CF_TRUE_COLOR_ALPHA) {
+ a_base = px_base[LV_IMG_PX_SIZE_ALPHA_BYTE - 1];
+ a_ver = px_ver[LV_IMG_PX_SIZE_ALPHA_BYTE - 1];
+ a_hor = px_hor[LV_IMG_PX_SIZE_ALPHA_BYTE - 1];
+ }
+#if LV_COLOR_DEPTH == 16
+ else if(cf == LV_IMG_CF_RGB565A8) {
+ const lv_opa_t * a_tmp = src + src_stride * src_h * sizeof(lv_color_t);
+ a_base = *(a_tmp + (ys_int * src_stride) + xs_int);
+ a_hor = *(a_tmp + (ys_int * src_stride) + xs_int + x_next);
+ a_ver = *(a_tmp + ((ys_int + y_next) * src_stride) + xs_int);
+ }
+#endif
+ else if(cf == LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED) {
+ if(((lv_color_t *)px_base)->full == ck.full ||
+ ((lv_color_t *)px_ver)->full == ck.full ||
+ ((lv_color_t *)px_hor)->full == ck.full) {
+ abuf[x] = 0x00;
+ continue;
+ }
+ else {
+ a_base = 0xff;
+ a_ver = 0xff;
+ a_hor = 0xff;
+ }
+ }
+ else {
+ a_base = 0xff;
+ a_ver = 0xff;
+ a_hor = 0xff;
+ }
+
+ if(a_ver != a_base) a_ver = ((a_ver * ys_fract) + (a_base * (0x100 - ys_fract))) >> 8;
+ if(a_hor != a_base) a_hor = ((a_hor * xs_fract) + (a_base * (0x100 - xs_fract))) >> 8;
+ abuf[x] = (a_ver + a_hor) >> 1;
+
+ if(abuf[x] == 0x00) continue;
+
+#if LV_COLOR_DEPTH == 8
+ c_base.full = px_base[0];
+ c_ver.full = px_ver[0];
+ c_hor.full = px_hor[0];
+#elif LV_COLOR_DEPTH == 16
+ c_base.full = px_base[0] + (px_base[1] << 8);
+ c_ver.full = px_ver[0] + (px_ver[1] << 8);
+ c_hor.full = px_hor[0] + (px_hor[1] << 8);
+#elif LV_COLOR_DEPTH == 32
+ c_base.full = *((uint32_t *)px_base);
+ c_ver.full = *((uint32_t *)px_ver);
+ c_hor.full = *((uint32_t *)px_hor);
+#endif
+ }
+ /*No alpha channel -> RGB*/
+ else {
+ c_base = *((const lv_color_t *) px_base);
+ c_hor = *((const lv_color_t *) px_hor);
+ c_ver = *((const lv_color_t *) px_ver);
+ abuf[x] = 0xff;
+ }
+
+ if(c_base.full == c_ver.full && c_base.full == c_hor.full) {
+ cbuf[x] = c_base;
+ }
+ else {
+ c_ver = lv_color_mix(c_ver, c_base, ys_fract);
+ c_hor = lv_color_mix(c_hor, c_base, xs_fract);
+ cbuf[x] = lv_color_mix(c_hor, c_ver, LV_OPA_50);
+ }
+ }
+ /*Partially out of the image*/
+ else {
+#if LV_COLOR_DEPTH == 8
+ cbuf[x].full = src_tmp[0];
+#elif LV_COLOR_DEPTH == 16
+ cbuf[x].full = src_tmp[0] + (src_tmp[1] << 8);
+#elif LV_COLOR_DEPTH == 32
+ cbuf[x].full = *((uint32_t *)src_tmp);
+#endif
+ lv_opa_t a;
+ switch(cf) {
+ case LV_IMG_CF_TRUE_COLOR_ALPHA:
+ a = src_tmp[LV_IMG_PX_SIZE_ALPHA_BYTE - 1];
+ break;
+ case LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED:
+ a = cbuf[x].full == ck.full ? 0x00 : 0xff;
+ break;
+#if LV_COLOR_DEPTH == 16
+ case LV_IMG_CF_RGB565A8:
+ a = *(src + src_stride * src_h * sizeof(lv_color_t) + (ys_int * src_stride) + xs_int);
+ break;
+#endif
+ default:
+ a = 0xff;
+ }
+
+ if((xs_int == 0 && x_next < 0) || (xs_int == src_w - 1 && x_next > 0)) {
+ abuf[x] = (a * (0xFF - xs_fract)) >> 8;
+ }
+ else if((ys_int == 0 && y_next < 0) || (ys_int == src_h - 1 && y_next > 0)) {
+ abuf[x] = (a * (0xFF - ys_fract)) >> 8;
+ }
+ else {
+ abuf[x] = 0x00;
+ }
+ }
+ }
+}
+
+static void transform_point_upscaled(point_transform_dsc_t * t, int32_t xin, int32_t yin, int32_t * xout,
+ int32_t * yout)
+{
+ if(t->angle == 0 && t->zoom == LV_IMG_ZOOM_NONE) {
+ *xout = xin * 256;
+ *yout = yin * 256;
+ return;
+ }
+
+ xin -= t->pivot.x;
+ yin -= t->pivot.y;
+
+ if(t->angle == 0) {
+ *xout = ((int32_t)(xin * t->zoom)) + (t->pivot_x_256);
+ *yout = ((int32_t)(yin * t->zoom)) + (t->pivot_y_256);
+ }
+ else if(t->zoom == LV_IMG_ZOOM_NONE) {
+ *xout = ((t->cosma * xin - t->sinma * yin) >> 2) + (t->pivot_x_256);
+ *yout = ((t->sinma * xin + t->cosma * yin) >> 2) + (t->pivot_y_256);
+ }
+ else {
+ *xout = (((t->cosma * xin - t->sinma * yin) * t->zoom) >> 10) + (t->pivot_x_256);
+ *yout = (((t->sinma * xin + t->cosma * yin) * t->zoom) >> 10) + (t->pivot_y_256);
+ }
+}
+
+#endif
+
diff --git a/src/draw/swm341_dma2d/lv_draw_swm341_dma2d.mk b/src/draw/swm341_dma2d/lv_draw_swm341_dma2d.mk
new file mode 100644
index 000000000..bc19e3802
--- /dev/null
+++ b/src/draw/swm341_dma2d/lv_draw_swm341_dma2d.mk
@@ -0,0 +1,6 @@
+CSRCS += lv_gpu_swm341_dma2d.c
+
+DEPPATH += --dep-path $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/swm341_dma2d
+VPATH += :$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/swm341_dma2d
+
+CFLAGS += "-I$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/swm341_dma2d"
diff --git a/src/draw/swm341_dma2d/lv_gpu_swm341_dma2d.c b/src/draw/swm341_dma2d/lv_gpu_swm341_dma2d.c
new file mode 100644
index 000000000..74a539467
--- /dev/null
+++ b/src/draw/swm341_dma2d/lv_gpu_swm341_dma2d.c
@@ -0,0 +1,241 @@
+/**
+ * @file lv_gpu_swm341_dma2d.c
+ *
+ */
+
+/*********************
+ * INCLUDES
+ *********************/
+#include "lv_gpu_swm341_dma2d.h"
+#include "../../core/lv_refr.h"
+
+#if LV_USE_GPU_SWM341_DMA2D
+
+#include LV_GPU_SWM341_DMA2D_INCLUDE
+
+/*********************
+ * DEFINES
+ *********************/
+
+#if LV_COLOR_16_SWAP
+ #error "Can't use DMA2D with LV_COLOR_16_SWAP 1"
+#endif
+
+#if LV_COLOR_DEPTH == 8
+ #error "Can't use DMA2D with LV_COLOR_DEPTH == 8"
+#endif
+
+#if LV_COLOR_DEPTH == 16
+ #define LV_DMA2D_COLOR_FORMAT LV_SWM341_DMA2D_RGB565
+#elif LV_COLOR_DEPTH == 32
+ #define LV_DMA2D_COLOR_FORMAT LV_SWM341_DMA2D_ARGB8888
+#else
+ /*Can't use GPU with other formats*/
+#endif
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+
+static void lv_draw_swm341_dma2d_blend_fill(lv_color_t * dest_buf, lv_coord_t dest_stride, const lv_area_t * fill_area,
+ lv_color_t color);
+
+static void lv_draw_swm341_dma2d_blend_map(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride,
+ const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa);
+
+static void lv_draw_swm341_dma2d_img_decoded(lv_draw_ctx_t * draw, const lv_draw_img_dsc_t * dsc,
+ const lv_area_t * coords, const uint8_t * map_p, lv_img_cf_t color_format);
+
+/**********************
+ * STATIC VARIABLES
+ **********************/
+
+/**********************
+ * MACROS
+ **********************/
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+
+/**
+ * Turn on the peripheral and set output color mode, this only needs to be done once
+ */
+void lv_draw_swm341_dma2d_init(void)
+{
+ /*Enable DMA2D clock*/
+ SYS->CLKEN0 |= (1 << SYS_CLKEN0_DMA2D_Pos);
+
+ DMA2D->CR &= ~DMA2D_CR_WAIT_Msk;
+ DMA2D->CR |= (CyclesPerUs << DMA2D_CR_WAIT_Pos);
+
+ DMA2D->IF = 0xFF;
+ DMA2D->IE = (0 << DMA2D_IE_DONE_Pos);
+
+ /*set output colour mode*/
+ DMA2D->L[DMA2D_LAYER_OUT].PFCCR = (LV_DMA2D_COLOR_FORMAT << DMA2D_PFCCR_CFMT_Pos);
+}
+
+void lv_draw_swm341_dma2d_ctx_init(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx)
+{
+
+ lv_draw_sw_init_ctx(drv, draw_ctx);
+
+ lv_draw_swm341_dma2d_ctx_t * dma2d_draw_ctx = (lv_draw_sw_ctx_t *)draw_ctx;
+
+ dma2d_draw_ctx->blend = lv_draw_swm341_dma2d_blend;
+ // dma2d_draw_ctx->base_draw.draw_img_decoded = lv_draw_swm341_dma2d_img_decoded;
+ dma2d_draw_ctx->base_draw.wait_for_finish = lv_gpu_swm341_dma2d_wait_cb;
+}
+
+void lv_draw_swm341_dma2d_ctx_deinit(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx)
+{
+ LV_UNUSED(drv);
+ LV_UNUSED(draw_ctx);
+}
+
+void lv_draw_swm341_dma2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc)
+{
+ lv_area_t blend_area;
+ if(!_lv_area_intersect(&blend_area, dsc->blend_area, draw_ctx->clip_area))
+ return;
+
+ bool done = false;
+
+ if(dsc->mask_buf == NULL && dsc->blend_mode == LV_BLEND_MODE_NORMAL && lv_area_get_size(&blend_area) > 100) {
+ lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area);
+
+ lv_color_t * dest_buf = draw_ctx->buf;
+ dest_buf += dest_stride * (blend_area.y1 - draw_ctx->buf_area->y1) + (blend_area.x1 - draw_ctx->buf_area->x1);
+
+ const lv_color_t * src_buf = dsc->src_buf;
+ if(src_buf) {
+ lv_draw_sw_blend_basic(draw_ctx, dsc);
+ lv_coord_t src_stride;
+ src_stride = lv_area_get_width(dsc->blend_area);
+ src_buf += src_stride * (blend_area.y1 - dsc->blend_area->y1) + (blend_area.x1 - dsc->blend_area->x1);
+ lv_area_move(&blend_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1);
+ lv_draw_swm341_dma2d_blend_map(dest_buf, &blend_area, dest_stride, src_buf, src_stride, dsc->opa);
+ done = true;
+ }
+ else if(dsc->opa >= LV_OPA_MAX) {
+ lv_area_move(&blend_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1);
+ lv_draw_swm341_dma2d_blend_fill(dest_buf, dest_stride, &blend_area, dsc->color);
+ done = true;
+ }
+ }
+
+ if(!done) lv_draw_sw_blend_basic(draw_ctx, dsc);
+}
+
+static void lv_draw_swm341_dma2d_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc,
+ const lv_area_t * coords, const uint8_t * map_p, lv_img_cf_t color_format)
+{
+ /*TODO basic ARGB8888 image can be handles here*/
+
+ lv_draw_sw_img_decoded(draw_ctx, dsc, coords, map_p, color_format);
+}
+
+static void lv_draw_swm341_dma2d_blend_fill(lv_color_t * dest_buf, lv_coord_t dest_stride, const lv_area_t * fill_area,
+ lv_color_t color)
+{
+ /*Simply fill an area*/
+ int32_t area_w = lv_area_get_width(fill_area);
+ int32_t area_h = lv_area_get_height(fill_area);
+
+#if 1
+ DMA2D->L[DMA2D_LAYER_OUT].COLOR = color.full;
+
+ DMA2D->L[DMA2D_LAYER_OUT].MAR = (uint32_t)dest_buf;
+ DMA2D->L[DMA2D_LAYER_OUT].OR = dest_stride - area_w;
+ DMA2D->NLR = ((area_w - 1) << DMA2D_NLR_NPIXEL_Pos) | ((area_h - 1) << DMA2D_NLR_NLINE_Pos);
+
+ /*start transfer*/
+ DMA2D->CR &= ~DMA2D_CR_MODE_Msk;
+ DMA2D->CR |= (3 << DMA2D_CR_MODE_Pos) |
+ (1 << DMA2D_CR_START_Pos);
+#else
+ for(uint32_t y = 0; y < area_h; y++) {
+ for(uint32_t x = 0; x < area_w; x++) {
+ dest_buf[y * dest_stride + x] = color;
+ }
+ }
+#endif
+}
+
+static void lv_draw_swm341_dma2d_blend_map(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride,
+ const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa)
+{
+
+ /*Simple copy*/
+ int32_t dest_w = lv_area_get_width(dest_area);
+ int32_t dest_h = lv_area_get_height(dest_area);
+
+ if(opa >= LV_OPA_MAX) {
+#if 1
+ /*copy output colour mode, this register controls both input and output colour format*/
+ DMA2D->L[DMA2D_LAYER_FG].MAR = (uint32_t)src_buf;
+ DMA2D->L[DMA2D_LAYER_FG].OR = src_stride - dest_w;
+ DMA2D->L[DMA2D_LAYER_FG].PFCCR = (LV_DMA2D_COLOR_FORMAT << DMA2D_PFCCR_CFMT_Pos);
+
+ DMA2D->L[DMA2D_LAYER_OUT].MAR = (uint32_t)dest_buf;
+ DMA2D->L[DMA2D_LAYER_OUT].OR = dest_stride - dest_w;
+
+ DMA2D->NLR = ((dest_w - 1) << DMA2D_NLR_NPIXEL_Pos) | ((dest_h - 1) << DMA2D_NLR_NLINE_Pos);
+
+ /*start transfer*/
+ DMA2D->CR &= ~DMA2D_CR_MODE_Msk;
+ DMA2D->CR |= (0 << DMA2D_CR_MODE_Pos) |
+ (1 << DMA2D_CR_START_Pos);
+#else
+ lv_color_t temp_buf[1024];
+ for(uint32_t y = 0; y < dest_h; y++) {
+ memcpy(temp_buf, &src_buf[y * src_stride], dest_w * sizeof(lv_color_t));
+ memcpy(&dest_buf[y * dest_stride], temp_buf, dest_w * sizeof(lv_color_t));
+ }
+#endif
+ }
+ else {
+ DMA2D->L[DMA2D_LAYER_FG].MAR = (uint32_t)src_buf;
+ DMA2D->L[DMA2D_LAYER_FG].OR = src_stride - dest_w;
+ DMA2D->L[DMA2D_LAYER_FG].PFCCR = (LV_DMA2D_COLOR_FORMAT << DMA2D_PFCCR_CFMT_Pos)
+ /*alpha mode 2, replace with foreground * alpha value*/
+ | (2 << DAM2D_PFCCR_AMODE_Pos)
+ /*alpha value*/
+ | (opa << DMA2D_PFCCR_ALPHA_Pos);
+
+ DMA2D->L[DMA2D_LAYER_BG].MAR = (uint32_t)dest_buf;
+ DMA2D->L[DMA2D_LAYER_BG].OR = dest_stride - dest_w;
+ DMA2D->L[DMA2D_LAYER_BG].PFCCR = (LV_DMA2D_COLOR_FORMAT << DMA2D_PFCCR_CFMT_Pos);
+
+ DMA2D->L[DMA2D_LAYER_OUT].MAR = (uint32_t)dest_buf;
+ DMA2D->L[DMA2D_LAYER_OUT].OR = dest_stride - dest_w;
+
+ DMA2D->NLR = ((dest_w - 1) << DMA2D_NLR_NPIXEL_Pos) | ((dest_h - 1) << DMA2D_NLR_NLINE_Pos);
+
+ /*start transfer*/
+ DMA2D->CR &= ~DMA2D_CR_MODE_Msk;
+ DMA2D->CR |= (2 << DMA2D_CR_MODE_Pos) |
+ (1 << DMA2D_CR_START_Pos);
+ }
+}
+
+void lv_gpu_swm341_dma2d_wait_cb(lv_draw_ctx_t * draw_ctx)
+{
+ lv_disp_t * disp = _lv_refr_get_disp_refreshing();
+ if(disp->driver && disp->driver->wait_cb) {
+ while(DMA2D->CR & DMA2D_CR_START_Msk) {
+ disp->driver->wait_cb(disp->driver);
+ }
+ }
+ else {
+ while(DMA2D->CR & DMA2D_CR_START_Msk);
+ }
+ lv_draw_sw_wait_for_finish(draw_ctx);
+}
+
+#endif
diff --git a/src/draw/swm341_dma2d/lv_gpu_swm341_dma2d.h b/src/draw/swm341_dma2d/lv_gpu_swm341_dma2d.h
new file mode 100644
index 000000000..20b892260
--- /dev/null
+++ b/src/draw/swm341_dma2d/lv_gpu_swm341_dma2d.h
@@ -0,0 +1,64 @@
+/**
+ * @file lv_gpu_swm341_dma2d.h
+ *
+ */
+
+#ifndef LV_GPU_SWM341_DMA2D_H
+#define LV_GPU_SWM341_DMA2D_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ * INCLUDES
+ *********************/
+#include "../../misc/lv_color.h"
+#include "../../hal/lv_hal_disp.h"
+#include "../sw/lv_draw_sw.h"
+
+#if LV_USE_GPU_SWM341_DMA2D
+
+/*********************
+ * DEFINES
+ *********************/
+
+#define LV_SWM341_DMA2D_ARGB8888 0
+#define LV_SWM341_DMA2D_RGB888 1
+#define LV_SWM341_DMA2D_RGB565 2
+
+/**********************
+ * TYPEDEFS
+ **********************/
+typedef lv_draw_sw_ctx_t lv_draw_swm341_dma2d_ctx_t;
+
+struct _lv_disp_drv_t;
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+/**
+ * Turn on the peripheral and set output color mode, this only needs to be done once
+ */
+void lv_draw_swm341_dma2d_init(void);
+
+void lv_draw_swm341_dma2d_ctx_init(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx);
+
+void lv_draw_swm341_dma2d_ctx_deinit(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx);
+
+void lv_draw_swm341_dma2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc);
+
+void lv_gpu_swm341_dma2d_wait_cb(lv_draw_ctx_t * draw_ctx);
+
+/**********************
+ * MACROS
+ **********************/
+
+#endif /*LV_USE_GPU_SWM341_DMA2D*/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /*LV_GPU_SWM341_DMA2D_H*/
diff --git a/src/extra/README.md b/src/extra/README.md
index 11742114d..80bb49d4f 100644
--- a/src/extra/README.md
+++ b/src/extra/README.md
@@ -1,6 +1,6 @@
# Extra components
-This directory contains extra (optional) components to lvgl.
+This directory contains extra (optional) components to lvgl.
It's a good place for contributions as there are less strict expectations about the completeness and flexibility of the components here.
In other words, if you have created a complex widget from other widgets, or modified an existing widget with special events, styles or animations, or have a new feature that could work as a plugin to lvgl feel free to the share it here.
@@ -10,13 +10,13 @@ In other words, if you have created a complex widget from other widgets, or modi
- Please and follow the [Coding style](https://github.com/lvgl/lvgl/blob/master/docs/CODING_STYLE.md) of LVGL
- Add setter/getter functions in pair
- Update [lv_conf_template.h](https://github.com/lvgl/lvgl/blob/master/lv_conf_template.h)
-- Add description in the [docs](https://github.com/lvgl/lvgl/tree/master/docs)
+- Add description in the [docs](https://github.com/lvgl/lvgl/tree/master/docs)
- Add [examples](https://github.com/lvgl/lvgl/tree/master/examples)
- Update the [changelog](https://github.com/lvgl/lvgl/tree/master/docs/CHANGELOG.md)
- Add yourself to the [Contributors](#contributors) section below.
## Ideas
-Here some ideas as inspiration feel free to contribute with ideas too.
+Here some ideas as inspiration feel free to contribute with ideas too.
- New [Calendar headers](https://github.com/lvgl/lvgl/tree/master/src/extra/widgets/calendar)
- Color picker with RGB and or HSV bars
- Ruler, horizontal or vertical with major and minor ticks and labels
@@ -27,5 +27,5 @@ Here some ideas as inspiration feel free to contribute with ideas too.
## Contributors
- lv_animimg: @ZhaoQiang-b45475
-- lv_span: @guoweilkd
+- lv_span: @guoweilkd
- lv_menu: @HX2003
\ No newline at end of file
diff --git a/src/extra/layouts/flex/lv_flex.c b/src/extra/layouts/flex/lv_flex.c
index 118034273..405a56b7f 100644
--- a/src/extra/layouts/flex/lv_flex.c
+++ b/src/extra/layouts/flex/lv_flex.c
@@ -65,7 +65,7 @@ static lv_obj_t * get_next_item(lv_obj_t * cont, bool rev, int32_t * item_id);
/**********************
* GLOBAL VARIABLES
**********************/
-uint32_t LV_LAYOUT_FLEX;
+uint16_t LV_LAYOUT_FLEX;
lv_style_prop_t LV_STYLE_FLEX_FLOW;
lv_style_prop_t LV_STYLE_FLEX_MAIN_PLACE;
lv_style_prop_t LV_STYLE_FLEX_CROSS_PLACE;
@@ -93,10 +93,10 @@ void lv_flex_init(void)
{
LV_LAYOUT_FLEX = lv_layout_register(flex_update, NULL);
- LV_STYLE_FLEX_FLOW = lv_style_register_prop();
- LV_STYLE_FLEX_MAIN_PLACE = lv_style_register_prop() | LV_STYLE_PROP_LAYOUT_REFR;
- LV_STYLE_FLEX_CROSS_PLACE = lv_style_register_prop() | LV_STYLE_PROP_LAYOUT_REFR;
- LV_STYLE_FLEX_TRACK_PLACE = lv_style_register_prop() | LV_STYLE_PROP_LAYOUT_REFR;
+ LV_STYLE_FLEX_FLOW = lv_style_register_prop(LV_STYLE_PROP_FLAG_NONE);
+ LV_STYLE_FLEX_MAIN_PLACE = lv_style_register_prop(LV_STYLE_PROP_LAYOUT_REFR);
+ LV_STYLE_FLEX_CROSS_PLACE = lv_style_register_prop(LV_STYLE_PROP_LAYOUT_REFR);
+ LV_STYLE_FLEX_TRACK_PLACE = lv_style_register_prop(LV_STYLE_PROP_LAYOUT_REFR);
}
void lv_obj_set_flex_flow(lv_obj_t * obj, lv_flex_flow_t flow)
@@ -428,6 +428,7 @@ static void children_repos(lv_obj_t * cont, flex_t * f, int32_t item_first_id, i
for(i = 0; i < t->grow_item_cnt; i++) {
if(t->grow_dsc[i].clamped == 0) {
+ LV_ASSERT(grow_value_sum != 0);
grow_unit = grow_max_size / grow_value_sum;
lv_coord_t size = grow_unit * t->grow_dsc[i].grow_value;
lv_coord_t size_clamp = LV_CLAMP(t->grow_dsc[i].min_size, size, t->grow_dsc[i].max_size);
@@ -525,7 +526,7 @@ static void children_repos(lv_obj_t * cont, flex_t * f, int32_t item_first_id, i
item->coords.y1 += diff_y;
item->coords.y2 += diff_y;
lv_obj_invalidate(item);
- lv_obj_move_children_by(item, diff_x, diff_y, true);
+ lv_obj_move_children_by(item, diff_x, diff_y, false);
}
if(!(f->row && rtl)) main_pos += area_get_main_size(&item->coords) + item_gap + place_gap;
diff --git a/src/extra/layouts/flex/lv_flex.h b/src/extra/layouts/flex/lv_flex.h
index 139fd4810..58c3221e0 100644
--- a/src/extra/layouts/flex/lv_flex.h
+++ b/src/extra/layouts/flex/lv_flex.h
@@ -57,7 +57,7 @@ typedef enum {
/**********************
* GLOBAL VARIABLES
**********************/
-extern uint32_t LV_LAYOUT_FLEX;
+extern uint16_t LV_LAYOUT_FLEX;
extern lv_style_prop_t LV_STYLE_FLEX_FLOW;
extern lv_style_prop_t LV_STYLE_FLEX_MAIN_PLACE;
extern lv_style_prop_t LV_STYLE_FLEX_CROSS_PLACE;
@@ -139,7 +139,6 @@ static inline uint8_t lv_obj_get_style_flex_grow(const lv_obj_t * obj, uint32_t
return (uint8_t)v.num;
}
-
/**********************
* MACROS
**********************/
diff --git a/src/extra/layouts/grid/lv_grid.c b/src/extra/layouts/grid/lv_grid.c
index 6812a04a2..74f8e95fb 100644
--- a/src/extra/layouts/grid/lv_grid.c
+++ b/src/extra/layouts/grid/lv_grid.c
@@ -102,7 +102,7 @@ static inline uint8_t get_grid_row_align(lv_obj_t * obj)
/**********************
* GLOBAL VARIABLES
**********************/
-uint32_t LV_LAYOUT_GRID;
+uint16_t LV_LAYOUT_GRID;
lv_style_prop_t LV_STYLE_GRID_COLUMN_DSC_ARRAY;
lv_style_prop_t LV_STYLE_GRID_COLUMN_ALIGN;
lv_style_prop_t LV_STYLE_GRID_ROW_DSC_ARRAY;
@@ -131,17 +131,17 @@ void lv_grid_init(void)
{
LV_LAYOUT_GRID = lv_layout_register(grid_update, NULL);
- LV_STYLE_GRID_COLUMN_DSC_ARRAY = lv_style_register_prop() | LV_STYLE_PROP_LAYOUT_REFR;
- LV_STYLE_GRID_ROW_DSC_ARRAY = lv_style_register_prop() | LV_STYLE_PROP_LAYOUT_REFR;
- LV_STYLE_GRID_COLUMN_ALIGN = lv_style_register_prop() | LV_STYLE_PROP_LAYOUT_REFR;
- LV_STYLE_GRID_ROW_ALIGN = lv_style_register_prop() | LV_STYLE_PROP_LAYOUT_REFR;
+ LV_STYLE_GRID_COLUMN_DSC_ARRAY = lv_style_register_prop(LV_STYLE_PROP_LAYOUT_REFR);
+ LV_STYLE_GRID_ROW_DSC_ARRAY = lv_style_register_prop(LV_STYLE_PROP_LAYOUT_REFR);
+ LV_STYLE_GRID_COLUMN_ALIGN = lv_style_register_prop(LV_STYLE_PROP_LAYOUT_REFR);
+ LV_STYLE_GRID_ROW_ALIGN = lv_style_register_prop(LV_STYLE_PROP_LAYOUT_REFR);
- LV_STYLE_GRID_CELL_ROW_SPAN = lv_style_register_prop() | LV_STYLE_PROP_LAYOUT_REFR;
- LV_STYLE_GRID_CELL_ROW_POS = lv_style_register_prop() | LV_STYLE_PROP_LAYOUT_REFR;
- LV_STYLE_GRID_CELL_COLUMN_SPAN = lv_style_register_prop() | LV_STYLE_PROP_LAYOUT_REFR;
- LV_STYLE_GRID_CELL_COLUMN_POS = lv_style_register_prop() | LV_STYLE_PROP_LAYOUT_REFR;
- LV_STYLE_GRID_CELL_X_ALIGN = lv_style_register_prop() | LV_STYLE_PROP_LAYOUT_REFR;
- LV_STYLE_GRID_CELL_Y_ALIGN = lv_style_register_prop() | LV_STYLE_PROP_LAYOUT_REFR;
+ LV_STYLE_GRID_CELL_ROW_SPAN = lv_style_register_prop(LV_STYLE_PROP_LAYOUT_REFR);
+ LV_STYLE_GRID_CELL_ROW_POS = lv_style_register_prop(LV_STYLE_PROP_LAYOUT_REFR);
+ LV_STYLE_GRID_CELL_COLUMN_SPAN = lv_style_register_prop(LV_STYLE_PROP_LAYOUT_REFR);
+ LV_STYLE_GRID_CELL_COLUMN_POS = lv_style_register_prop(LV_STYLE_PROP_LAYOUT_REFR);
+ LV_STYLE_GRID_CELL_X_ALIGN = lv_style_register_prop(LV_STYLE_PROP_LAYOUT_REFR);
+ LV_STYLE_GRID_CELL_Y_ALIGN = lv_style_register_prop(LV_STYLE_PROP_LAYOUT_REFR);
}
void lv_obj_set_grid_dsc_array(lv_obj_t * obj, const lv_coord_t col_dsc[], const lv_coord_t row_dsc[])
@@ -561,6 +561,8 @@ static void calc_rows(lv_obj_t * cont, _lv_grid_calc_t * c)
if(IS_FR(x)) {
lv_coord_t f = GET_FR(x);
c->h[i] = (free_h * f) / row_fr_cnt;
+ last_fr_i = i;
+ last_fr_x = f;
}
}
@@ -685,7 +687,7 @@ static void item_repos(lv_obj_t * item, _lv_grid_calc_t * c, item_repos_hint_t *
item->coords.y1 += diff_y;
item->coords.y2 += diff_y;
lv_obj_invalidate(item);
- lv_obj_move_children_by(item, diff_x, diff_y, true);
+ lv_obj_move_children_by(item, diff_x, diff_y, false);
}
}
diff --git a/src/extra/layouts/grid/lv_grid.h b/src/extra/layouts/grid/lv_grid.h
index cd2510ec0..5c4f76725 100644
--- a/src/extra/layouts/grid/lv_grid.h
+++ b/src/extra/layouts/grid/lv_grid.h
@@ -53,7 +53,7 @@ typedef enum {
* GLOBAL VARIABLES
**********************/
-extern uint32_t LV_LAYOUT_GRID;
+extern uint16_t LV_LAYOUT_GRID;
extern lv_style_prop_t LV_STYLE_GRID_COLUMN_DSC_ARRAY;
extern lv_style_prop_t LV_STYLE_GRID_COLUMN_ALIGN;
extern lv_style_prop_t LV_STYLE_GRID_ROW_DSC_ARRAY;
diff --git a/src/extra/libs/bmp/lv_bmp.c b/src/extra/libs/bmp/lv_bmp.c
index 73e803025..f89a0a8c7 100644
--- a/src/extra/libs/bmp/lv_bmp.c
+++ b/src/extra/libs/bmp/lv_bmp.c
@@ -79,7 +79,7 @@ static lv_res_t decoder_info(lv_img_decoder_t * decoder, const void * src, lv_im
/*If it's a BMP file...*/
if(src_type == LV_IMG_SRC_FILE) {
const char * fn = src;
- if(!strcmp(&fn[strlen(fn) - 3], "bmp")) { /*Check the extension*/
+ if(strcmp(lv_fs_get_ext(fn), "bmp") == 0) { /*Check the extension*/
/*Save the data in the header*/
lv_fs_file_t f;
lv_fs_res_t res = lv_fs_open(&f, src, LV_FS_MODE_RD);
@@ -119,7 +119,7 @@ static lv_res_t decoder_info(lv_img_decoder_t * decoder, const void * src, lv_im
* Open a PNG image and return the decided image
* @param src can be file name or pointer to a C array
* @param style style of the image object (unused now but certain formats might use it)
- * @return pointer to the decoded image or `LV_IMG_DECODER_OPEN_FAIL` if failed
+ * @return pointer to the decoded image or `LV_IMG_DECODER_OPEN_FAIL` if failed
*/
static lv_res_t decoder_open(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t * dsc)
{
@@ -129,7 +129,9 @@ static lv_res_t decoder_open(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t *
if(dsc->src_type == LV_IMG_SRC_FILE) {
const char * fn = dsc->src;
- if(strcmp(&fn[strlen(fn) - 3], "bmp")) return LV_RES_INV; /*Check the extension*/
+ if(strcmp(lv_fs_get_ext(fn), "bmp") != 0) {
+ return LV_RES_INV; /*Check the extension*/
+ }
bmp_dsc_t b;
memset(&b, 0x00, sizeof(b));
@@ -152,7 +154,7 @@ static lv_res_t decoder_open(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t *
b.row_size_bytes = ((b.bpp * b.px_width + 31) / 32) * 4;
bool color_depth_error = false;
- if(LV_COLOR_DEPTH == 32 && (b.bpp != 32 || b.bpp != 24)) {
+ if(LV_COLOR_DEPTH == 32 && (b.bpp != 32 && b.bpp != 24)) {
LV_LOG_WARN("LV_COLOR_DEPTH == 32 but bpp is %d (should be 32 or 24)", b.bpp);
color_depth_error = true;
}
@@ -201,7 +203,14 @@ static lv_res_t decoder_read_line(lv_img_decoder_t * decoder, lv_img_decoder_dsc
lv_fs_seek(&b->f, p, LV_FS_SEEK_SET);
lv_fs_read(&b->f, buf, len * (b->bpp / 8), NULL);
-#if LV_COLOR_DEPTH == 32
+#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP == 1
+ for(unsigned int i = 0; i < len * (b->bpp / 8); i += 2) {
+ buf[i] = buf[i] ^ buf[i + 1];
+ buf[i + 1] = buf[i] ^ buf[i + 1];
+ buf[i] = buf[i] ^ buf[i + 1];
+ }
+
+#elif LV_COLOR_DEPTH == 32
if(b->bpp == 32) {
lv_coord_t i;
for(i = 0; i < len; i++) {
diff --git a/src/extra/libs/fsdrv/lv_fs_fatfs.c b/src/extra/libs/fsdrv/lv_fs_fatfs.c
index 73596ece7..cc1d2e6d6 100644
--- a/src/extra/libs/fsdrv/lv_fs_fatfs.c
+++ b/src/extra/libs/fsdrv/lv_fs_fatfs.c
@@ -161,8 +161,8 @@ static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_
* @param drv pointer to a driver where this function belongs
* @param file_p pointer to a FIL variable
* @param buf pointer to a buffer with the bytes to write
- * @param btr Bytes To Write
- * @param br the number of real written bytes (Bytes Written). NULL if unused.
+ * @param btw Bytes To Write
+ * @param bw the number of real written bytes (Bytes Written). NULL if unused.
* @return LV_FS_RES_OK or any error from lv_fs_res_t enum
*/
static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw)
diff --git a/src/extra/libs/fsdrv/lv_fs_posix.c b/src/extra/libs/fsdrv/lv_fs_posix.c
index fb5fcd306..f988daeeb 100644
--- a/src/extra/libs/fsdrv/lv_fs_posix.c
+++ b/src/extra/libs/fsdrv/lv_fs_posix.c
@@ -110,7 +110,7 @@ static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode)
/*Make the path relative to the current directory (the projects root folder)*/
char buf[256];
- sprintf(buf, LV_FS_POSIX_PATH "%s", path);
+ lv_snprintf(buf, sizeof(buf), LV_FS_POSIX_PATH "%s", path);
int f = open(buf, flags);
if(f < 0) return NULL;
@@ -154,8 +154,8 @@ static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_
* @param drv pointer to a driver where this function belongs
* @param file_p a file handle variable
* @param buf pointer to a buffer with the bytes to write
- * @param btr Bytes To Write
- * @param br the number of real written bytes (Bytes Written). NULL if unused.
+ * @param btw Bytes To Write
+ * @param bw the number of real written bytes (Bytes Written). NULL if unused.
* @return LV_FS_RES_OK or any error from lv_fs_res_t enum
*/
static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw)
@@ -176,8 +176,8 @@ static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf,
static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence)
{
LV_UNUSED(drv);
- lseek((lv_uintptr_t)file_p, pos, whence);
- return LV_FS_RES_OK;
+ off_t offset = lseek((lv_uintptr_t)file_p, pos, whence);
+ return offset < 0 ? LV_FS_RES_FS_ERR : LV_FS_RES_OK;
}
/**
@@ -191,8 +191,9 @@ static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs
static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p)
{
LV_UNUSED(drv);
- *pos_p = lseek((lv_uintptr_t)file_p, 0, SEEK_CUR);
- return LV_FS_RES_OK;
+ off_t offset = lseek((lv_uintptr_t)file_p, 0, SEEK_CUR);
+ *pos_p = offset;
+ return offset < 0 ? LV_FS_RES_FS_ERR : LV_FS_RES_OK;
}
#ifdef WIN32
@@ -212,7 +213,7 @@ static void * fs_dir_open(lv_fs_drv_t * drv, const char * path)
#ifndef WIN32
/*Make the path relative to the current directory (the projects root folder)*/
char buf[256];
- sprintf(buf, LV_FS_POSIX_PATH "%s", path);
+ lv_snprintf(buf, sizeof(buf), LV_FS_POSIX_PATH "%s", path);
return opendir(buf);
#else
HANDLE d = INVALID_HANDLE_VALUE;
@@ -220,7 +221,7 @@ static void * fs_dir_open(lv_fs_drv_t * drv, const char * path)
/*Make the path relative to the current directory (the projects root folder)*/
char buf[256];
- sprintf(buf, LV_FS_POSIX_PATH "%s\\*", path);
+ lv_snprintf(buf, sizeof(buf), LV_FS_POSIX_PATH "%s\\*", path);
strcpy(next_fn, "");
d = FindFirstFile(buf, &fdata);
diff --git a/src/extra/libs/fsdrv/lv_fs_stdio.c b/src/extra/libs/fsdrv/lv_fs_stdio.c
index e4bf07783..c2de6880e 100644
--- a/src/extra/libs/fsdrv/lv_fs_stdio.c
+++ b/src/extra/libs/fsdrv/lv_fs_stdio.c
@@ -21,10 +21,19 @@
/*********************
* DEFINES
*********************/
+#define MAX_PATH_LEN 256
/**********************
* TYPEDEFS
**********************/
+typedef struct {
+#ifdef WIN32
+ HANDLE dir_p;
+ char next_fn[MAX_PATH_LEN];
+#else
+ DIR * dir_p;
+#endif
+} dir_handle_t;
/**********************
* STATIC PROTOTYPES
@@ -105,8 +114,8 @@ static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode)
/*Make the path relative to the current directory (the projects root folder)*/
- char buf[256];
- sprintf(buf, LV_FS_STDIO_PATH "%s", path);
+ char buf[MAX_PATH_LEN];
+ lv_snprintf(buf, sizeof(buf), LV_FS_STDIO_PATH "%s", path);
return fopen(buf, flags);
}
@@ -147,8 +156,8 @@ static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_
* @param drv pointer to a driver where this function belongs
* @param file_p pointer to a FILE variable
* @param buf pointer to a buffer with the bytes to write
- * @param btr Bytes To Write
- * @param br the number of real written bytes (Bytes Written). NULL if unused.
+ * @param btw Bytes To Write
+ * @param bw the number of real written bytes (Bytes Written). NULL if unused.
* @return LV_FS_RES_OK or any error from lv_fs_res_t enum
*/
static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw)
@@ -188,10 +197,6 @@ static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p)
return LV_FS_RES_OK;
}
-#ifdef WIN32
- static char next_fn[256];
-#endif
-
/**
* Initialize a 'DIR' or 'HANDLE' variable for directory reading
* @param drv pointer to a driver where this function belongs
@@ -201,37 +206,47 @@ static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p)
static void * fs_dir_open(lv_fs_drv_t * drv, const char * path)
{
LV_UNUSED(drv);
+ dir_handle_t * handle = (dir_handle_t *)lv_mem_alloc(sizeof(dir_handle_t));
#ifndef WIN32
/*Make the path relative to the current directory (the projects root folder)*/
- char buf[256];
- sprintf(buf, LV_FS_STDIO_PATH "%s", path);
- return opendir(buf);
+ char buf[MAX_PATH_LEN];
+ lv_snprintf(buf, sizeof(buf), LV_FS_STDIO_PATH "%s", path);
+ handle->dir_p = opendir(buf);
+ if(handle->dir_p == NULL) {
+ lv_mem_free(handle);
+ return NULL;
+ }
+ return handle;
#else
- HANDLE d = INVALID_HANDLE_VALUE;
- WIN32_FIND_DATA fdata;
+ handle->dir_p = INVALID_HANDLE_VALUE;
+ WIN32_FIND_DATAA fdata;
/*Make the path relative to the current directory (the projects root folder)*/
- char buf[256];
- sprintf(buf, LV_FS_STDIO_PATH "%s\\*", path);
+ char buf[MAX_PATH_LEN];
+ lv_snprintf(buf, sizeof(buf), LV_FS_STDIO_PATH "%s\\*", path);
- strcpy(next_fn, "");
- d = FindFirstFile(buf, &fdata);
+ strcpy(handle->next_fn, "");
+ handle->dir_p = FindFirstFileA(buf, &fdata);
do {
if(strcmp(fdata.cFileName, ".") == 0 || strcmp(fdata.cFileName, "..") == 0) {
continue;
}
else {
if(fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
- sprintf(next_fn, "/%s", fdata.cFileName);
+ lv_snprintf(handle->next_fn, sizeof(handle->next_fn), "/%s", fdata.cFileName);
}
else {
- sprintf(next_fn, "%s", fdata.cFileName);
+ lv_snprintf(handle->next_fn, sizeof(handle->next_fn), "%s", fdata.cFileName);
}
break;
}
- } while(FindNextFileA(d, &fdata));
+ } while(FindNextFileA(handle->dir_p, &fdata));
- return d;
+ if(handle->dir_p == INVALID_HANDLE_VALUE) {
+ lv_mem_free(handle);
+ return INVALID_HANDLE_VALUE;
+ }
+ return handle;
#endif
}
@@ -246,13 +261,13 @@ static void * fs_dir_open(lv_fs_drv_t * drv, const char * path)
static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn)
{
LV_UNUSED(drv);
-
+ dir_handle_t * handle = (dir_handle_t *)dir_p;
#ifndef WIN32
struct dirent * entry;
do {
- entry = readdir(dir_p);
+ entry = readdir(handle->dir_p);
if(entry) {
- if(entry->d_type == DT_DIR) sprintf(fn, "/%s", entry->d_name);
+ if(entry->d_type == DT_DIR) lv_snprintf(fn, MAX_PATH_LEN, "/%s", entry->d_name);
else strcpy(fn, entry->d_name);
}
else {
@@ -260,26 +275,26 @@ static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn)
}
} while(strcmp(fn, "/.") == 0 || strcmp(fn, "/..") == 0);
#else
- strcpy(fn, next_fn);
+ strcpy(fn, handle->next_fn);
- strcpy(next_fn, "");
- WIN32_FIND_DATA fdata;
+ strcpy(handle->next_fn, "");
+ WIN32_FIND_DATAA fdata;
- if(FindNextFile(dir_p, &fdata) == false) return LV_FS_RES_OK;
+ if(FindNextFileA(handle->dir_p, &fdata) == false) return LV_FS_RES_OK;
do {
if(strcmp(fdata.cFileName, ".") == 0 || strcmp(fdata.cFileName, "..") == 0) {
continue;
}
else {
if(fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
- sprintf(next_fn, "/%s", fdata.cFileName);
+ lv_snprintf(handle->next_fn, sizeof(handle->next_fn), "/%s", fdata.cFileName);
}
else {
- sprintf(next_fn, "%s", fdata.cFileName);
+ lv_snprintf(handle->next_fn, sizeof(handle->next_fn), "%s", fdata.cFileName);
}
break;
}
- } while(FindNextFile(dir_p, &fdata));
+ } while(FindNextFileA(handle->dir_p, &fdata));
#endif
return LV_FS_RES_OK;
@@ -294,11 +309,13 @@ static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn)
static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p)
{
LV_UNUSED(drv);
+ dir_handle_t * handle = (dir_handle_t *)dir_p;
#ifndef WIN32
- closedir(dir_p);
+ closedir(handle->dir_p);
#else
- FindClose(dir_p);
+ FindClose(handle->dir_p);
#endif
+ lv_mem_free(handle);
return LV_FS_RES_OK;
}
diff --git a/src/extra/libs/fsdrv/lv_fs_win32.c b/src/extra/libs/fsdrv/lv_fs_win32.c
index ad4536d40..1a59aa496 100644
--- a/src/extra/libs/fsdrv/lv_fs_win32.c
+++ b/src/extra/libs/fsdrv/lv_fs_win32.c
@@ -16,10 +16,16 @@
/*********************
* DEFINES
*********************/
+#define MAX_PATH_LEN 256
/**********************
* TYPEDEFS
**********************/
+typedef struct {
+ HANDLE dir_p;
+ char next_fn[MAX_PATH_LEN];
+ lv_fs_res_t next_error;
+} dir_handle_t;
/**********************
* STATIC PROTOTYPES
@@ -58,7 +64,7 @@ void lv_fs_win32_init(void)
* Register the file system interface in LVGL
*--------------------------------------------------*/
- /*Add a simple drive to open images*/
+ /*Add a simple driver to open images*/
static lv_fs_drv_t fs_drv; /*A driver descriptor*/
lv_fs_drv_init(&fs_drv);
@@ -213,7 +219,7 @@ static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode)
/*Make the path relative to the current directory (the projects root folder)*/
char buf[MAX_PATH];
- sprintf(buf, LV_FS_WIN32_PATH "%s", path);
+ lv_snprintf(buf, sizeof(buf), LV_FS_WIN32_PATH "%s", path);
return (void *)CreateFileA(
buf,
@@ -263,8 +269,8 @@ static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_
* @param drv pointer to a driver where this function belongs
* @param file_p pointer to a FILE variable
* @param buf pointer to a buffer with the bytes to write
- * @param btr Bytes To Write
- * @param br the number of real written bytes (Bytes Written). NULL if unused.
+ * @param btw Bytes To Write
+ * @param bw the number of real written bytes (Bytes Written). NULL if unused.
* @return LV_FS_RES_OK or any error from lv_fs_res_t enum
*/
static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw)
@@ -344,9 +350,6 @@ static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p)
}
}
-static char next_fn[256];
-static lv_fs_res_t next_error = LV_FS_RES_OK;
-
/**
* Initialize a 'DIR' or 'HANDLE' variable for directory reading
* @param drv pointer to a driver where this function belongs
@@ -356,38 +359,45 @@ static lv_fs_res_t next_error = LV_FS_RES_OK;
static void * fs_dir_open(lv_fs_drv_t * drv, const char * path)
{
LV_UNUSED(drv);
-
- HANDLE d = INVALID_HANDLE_VALUE;
+ dir_handle_t * handle = (dir_handle_t *)lv_mem_alloc(sizeof(dir_handle_t));
+ handle->dir_p = INVALID_HANDLE_VALUE;
+ handle->next_error = LV_FS_RES_OK;
WIN32_FIND_DATAA fdata;
/*Make the path relative to the current directory (the projects root folder)*/
- char buf[256];
+ char buf[MAX_PATH_LEN];
#ifdef LV_FS_WIN32_PATH
- sprintf(buf, LV_FS_WIN32_PATH "%s\\*", path);
+ lv_snprintf(buf, sizeof(buf), LV_FS_WIN32_PATH "%s\\*", path);
#else
- sprintf(buf, "%s\\*", path);
+ lv_snprintf(buf, sizeof(buf), "%s\\*", path);
#endif
- strcpy(next_fn, "");
- d = FindFirstFileA(buf, &fdata);
+ strcpy(handle->next_fn, "");
+ handle->dir_p = FindFirstFileA(buf, &fdata);
do {
if(is_dots_name(fdata.cFileName)) {
continue;
}
else {
if(fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
- sprintf(next_fn, "/%s", fdata.cFileName);
+ lv_snprintf(handle->next_fn, sizeof(handle->next_fn), "/%s", fdata.cFileName);
}
else {
- sprintf(next_fn, "%s", fdata.cFileName);
+ lv_snprintf(handle->next_fn, sizeof(handle->next_fn), "%s", fdata.cFileName);
}
break;
}
+ } while(FindNextFileA(handle->dir_p, &fdata));
- } while(FindNextFileA(d, &fdata));
-
- next_error = fs_error_from_win32(GetLastError());
- return d;
+ if(handle->dir_p == INVALID_HANDLE_VALUE) {
+ lv_mem_free(handle);
+ handle->next_error = fs_error_from_win32(GetLastError());
+ return INVALID_HANDLE_VALUE;
+ }
+ else {
+ handle->next_error = LV_FS_RES_OK;
+ return handle;
+ }
}
/**
@@ -401,31 +411,30 @@ static void * fs_dir_open(lv_fs_drv_t * drv, const char * path)
static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn)
{
LV_UNUSED(drv);
+ dir_handle_t * handle = (dir_handle_t *)dir_p;
+ strcpy(fn, handle->next_fn);
+ lv_fs_res_t current_error = handle->next_error;
+ strcpy(handle->next_fn, "");
- strcpy(fn, next_fn);
- lv_fs_res_t current_error = next_error;
- next_error = LV_FS_RES_OK;
-
- strcpy(next_fn, "");
WIN32_FIND_DATAA fdata;
- while(FindNextFileA(dir_p, &fdata)) {
+ while(FindNextFileA(handle->dir_p, &fdata)) {
if(is_dots_name(fdata.cFileName)) {
continue;
}
else {
if(fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
- sprintf(next_fn, "/%s", fdata.cFileName);
+ lv_snprintf(handle->next_fn, sizeof(handle->next_fn), "/%s", fdata.cFileName);
}
else {
- sprintf(next_fn, "%s", fdata.cFileName);
+ lv_snprintf(handle->next_fn, sizeof(handle->next_fn), "%s", fdata.cFileName);
}
break;
}
}
- if(next_fn[0] == '\0') {
- next_error = fs_error_from_win32(GetLastError());
+ if(handle->next_fn[0] == '\0') {
+ handle->next_error = fs_error_from_win32(GetLastError());
}
return current_error;
@@ -440,9 +449,12 @@ static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn)
static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p)
{
LV_UNUSED(drv);
- return FindClose((HANDLE)dir_p)
- ? LV_FS_RES_OK
- : fs_error_from_win32(GetLastError());
+ dir_handle_t * handle = (dir_handle_t *)dir_p;
+ lv_fs_res_t res = FindClose(handle->dir_p)
+ ? LV_FS_RES_OK
+ : fs_error_from_win32(GetLastError());
+ lv_mem_free(handle);
+ return res;
}
#else /*LV_USE_FS_WIN32 == 0*/
diff --git a/src/extra/libs/gif/gifdec.c b/src/extra/libs/gif/gifdec.c
index ee6a56d4b..68f50057e 100644
--- a/src/extra/libs/gif/gifdec.c
+++ b/src/extra/libs/gif/gifdec.c
@@ -133,28 +133,32 @@ static gd_GIF * gif_open(gd_GIF * gif_base)
#elif LV_COLOR_DEPTH == 8 || LV_COLOR_DEPTH == 1
gif->frame = &gif->canvas[2 * width * height];
#endif
- if (gif->bgindex)
+ if (gif->bgindex) {
memset(gif->frame, gif->bgindex, gif->width * gif->height);
+ }
bgcolor = &gif->palette->colors[gif->bgindex*3];
- if (bgcolor[0] || bgcolor[1] || bgcolor [2])
- for (i = 0; i < gif->width * gif->height; i++) {
+ for (i = 0; i < gif->width * gif->height; i++) {
#if LV_COLOR_DEPTH == 32
- gif->canvas[i*4 + 0] = *(bgcolor + 2);
- gif->canvas[i*4 + 1] = *(bgcolor + 1);
- gif->canvas[i*4 + 2] = *(bgcolor + 0);
- gif->canvas[i*4 + 3] = 0xff;
+ gif->canvas[i*4 + 0] = *(bgcolor + 2);
+ gif->canvas[i*4 + 1] = *(bgcolor + 1);
+ gif->canvas[i*4 + 2] = *(bgcolor + 0);
+ gif->canvas[i*4 + 3] = 0xff;
#elif LV_COLOR_DEPTH == 16
- lv_color_t c = lv_color_make(*(bgcolor + 0), *(bgcolor + 1), *(bgcolor + 2));
- gif->canvas[i*3 + 0] = c.full & 0xff;
- gif->canvas[i*3 + 1] = (c.full >> 8) & 0xff;
- gif->canvas[i*3 + 2] = 0xff;
+ lv_color_t c = lv_color_make(*(bgcolor + 0), *(bgcolor + 1), *(bgcolor + 2));
+ gif->canvas[i*3 + 0] = c.full & 0xff;
+ gif->canvas[i*3 + 1] = (c.full >> 8) & 0xff;
+ gif->canvas[i*3 + 2] = 0xff;
#elif LV_COLOR_DEPTH == 8
- lv_color_t c = lv_color_make(*(bgcolor + 0), *(bgcolor + 1), *(bgcolor + 2));
- gif->canvas[i*2 + 0] = c.full;
- gif->canvas[i*2 + 1] = 0xff;
+ lv_color_t c = lv_color_make(*(bgcolor + 0), *(bgcolor + 1), *(bgcolor + 2));
+ gif->canvas[i*2 + 0] = c.full;
+ gif->canvas[i*2 + 1] = 0xff;
+#elif LV_COLOR_DEPTH == 1
+ lv_color_t c = lv_color_make(*(bgcolor + 0), *(bgcolor + 1), *(bgcolor + 2));
+ gif->canvas[i*2 + 0] = c.ch.red > 128 ? 1 : 0;
+ gif->canvas[i*2 + 1] = 0xff;
#endif
- }
+ }
gif->anim_start = f_gif_seek(gif, 0, LV_FS_SEEK_CUR);
goto ok;
fail:
diff --git a/src/extra/libs/png/lodepng.c b/src/extra/libs/png/lodepng.c
index 65139bc5b..82e18e1a0 100644
--- a/src/extra/libs/png/lodepng.c
+++ b/src/extra/libs/png/lodepng.c
@@ -119,14 +119,12 @@ to something as fast. */
static void lodepng_memcpy(void* LODEPNG_RESTRICT dst,
const void* LODEPNG_RESTRICT src, size_t size) {
- size_t i;
- for(i = 0; i < size; i++) ((char*)dst)[i] = ((const char*)src)[i];
+ lv_memcpy(dst, src, size);
}
static void lodepng_memset(void* LODEPNG_RESTRICT dst,
int value, size_t num) {
- size_t i;
- for(i = 0; i < num; i++) ((char*)dst)[i] = (char)value;
+ lv_memset(dst, value, num);
}
/* does not check memory out of bounds, do not use on untrusted data */
@@ -5756,7 +5754,7 @@ static unsigned preProcessScanlines(unsigned char** out, size_t* outsize, const
adam7 = (unsigned char*)lodepng_malloc(passstart[7]);
if(!adam7 && passstart[7]) error = 83; /*alloc fail*/
- if(!error) {
+ if(!error && adam7) {
unsigned i;
Adam7_interlace(adam7, in, w, h, bpp);
diff --git a/src/extra/libs/png/lv_png.c b/src/extra/libs/png/lv_png.c
index 0b88eb89a..d067ef508 100644
--- a/src/extra/libs/png/lv_png.c
+++ b/src/extra/libs/png/lv_png.c
@@ -70,7 +70,7 @@ static lv_res_t decoder_info(struct _lv_img_decoder_t * decoder, const void * sr
/*If it's a PNG file...*/
if(src_type == LV_IMG_SRC_FILE) {
const char * fn = src;
- if(!strcmp(&fn[strlen(fn) - 3], "png")) { /*Check the extension*/
+ if(strcmp(lv_fs_get_ext(fn), "png") == 0) { /*Check the extension*/
/* Read the width and height from the file. They have a constant location:
* [16..23]: width
@@ -80,14 +80,18 @@ static lv_res_t decoder_info(struct _lv_img_decoder_t * decoder, const void * sr
lv_fs_file_t f;
lv_fs_res_t res = lv_fs_open(&f, fn, LV_FS_MODE_RD);
if(res != LV_FS_RES_OK) return LV_RES_INV;
+
lv_fs_seek(&f, 16, LV_FS_SEEK_SET);
+
uint32_t rn;
lv_fs_read(&f, &size, 8, &rn);
- if(rn != 8) return LV_RES_INV;
lv_fs_close(&f);
+
+ if(rn != 8) return LV_RES_INV;
+
/*Save the data in the header*/
header->always_zero = 0;
- header->cf = LV_IMG_CF_RAW_ALPHA;
+ header->cf = LV_IMG_CF_TRUE_COLOR_ALPHA;
/*The width and height are stored in Big endian format so convert them to little endian*/
header->w = (lv_coord_t)((size[0] & 0xff000000) >> 24) + ((size[0] & 0x00ff0000) >> 8);
header->h = (lv_coord_t)((size[1] & 0xff000000) >> 24) + ((size[1] & 0x00ff0000) >> 8);
@@ -98,7 +102,9 @@ static lv_res_t decoder_info(struct _lv_img_decoder_t * decoder, const void * sr
/*If it's a PNG file in a C array...*/
else if(src_type == LV_IMG_SRC_VARIABLE) {
const lv_img_dsc_t * img_dsc = src;
+ const uint32_t data_size = img_dsc->data_size;
const uint8_t magic[] = {0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a};
+ if(data_size < sizeof(magic)) return LV_RES_INV;
if(memcmp(magic, img_dsc->data, sizeof(magic))) return LV_RES_INV;
header->always_zero = 0;
header->cf = img_dsc->header.cf; /*Save the color format*/
@@ -115,7 +121,7 @@ static lv_res_t decoder_info(struct _lv_img_decoder_t * decoder, const void * sr
* Open a PNG image and return the decided image
* @param src can be file name or pointer to a C array
* @param style style of the image object (unused now but certain formats might use it)
- * @return pointer to the decoded image or `LV_IMG_DECODER_OPEN_FAIL` if failed
+ * @return pointer to the decoded image or `LV_IMG_DECODER_OPEN_FAIL` if failed
*/
static lv_res_t decoder_open(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t * dsc)
{
@@ -128,8 +134,7 @@ static lv_res_t decoder_open(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t *
/*If it's a PNG file...*/
if(dsc->src_type == LV_IMG_SRC_FILE) {
const char * fn = dsc->src;
-
- if(!strcmp(&fn[strlen(fn) - 3], "png")) { /*Check the extension*/
+ if(strcmp(lv_fs_get_ext(fn), "png") == 0) { /*Check the extension*/
/*Load the PNG file into buffer. It's still compressed (not decoded)*/
unsigned char * png_data; /*Pointer to the loaded data. Same as the original file just loaded into the RAM*/
@@ -149,6 +154,9 @@ static lv_res_t decoder_open(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t *
error = lodepng_decode32(&img_data, &png_width, &png_height, png_data, png_data_size);
lv_mem_free(png_data); /*Free the loaded file*/
if(error) {
+ if(img_data != NULL) {
+ lv_mem_free(img_data);
+ }
LV_LOG_WARN("error %u: %s\n", error, lodepng_error_text(error));
return LV_RES_INV;
}
@@ -169,6 +177,9 @@ static lv_res_t decoder_open(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t *
error = lodepng_decode32(&img_data, &png_width, &png_height, img_dsc->data, img_dsc->data_size);
if(error) {
+ if(img_data != NULL) {
+ lv_mem_free(img_data);
+ }
return LV_RES_INV;
}
diff --git a/src/extra/libs/qrcode/qrcodegen.c b/src/extra/libs/qrcode/qrcodegen.c
index 4b06c78e7..37ee74233 100644
--- a/src/extra/libs/qrcode/qrcodegen.c
+++ b/src/extra/libs/qrcode/qrcodegen.c
@@ -1,9 +1,9 @@
-/*
+/*
* QR Code generator library (C)
- *
+ *
* Copyright (c) Project Nayuki. (MIT License)
* https://www.nayuki.io/page/qr-code-generator-library
- *
+ *
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to
diff --git a/src/extra/libs/qrcode/qrcodegen.h b/src/extra/libs/qrcode/qrcodegen.h
index dceddf605..b484e9175 100644
--- a/src/extra/libs/qrcode/qrcodegen.h
+++ b/src/extra/libs/qrcode/qrcodegen.h
@@ -1,9 +1,9 @@
-/*
+/*
* QR Code generator library (C)
- *
+ *
* Copyright (c) Project Nayuki. (MIT License)
* https://www.nayuki.io/page/qr-code-generator-library
- *
+ *
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to
@@ -33,14 +33,14 @@ extern "C" {
#endif
-/*
+/*
* This library creates QR Code symbols, which is a type of two-dimension barcode.
* Invented by Denso Wave and described in the ISO/IEC 18004 standard.
* A QR Code structure is an immutable square grid of black and white cells.
* The library provides functions to create a QR Code from text or binary data.
* The library covers the QR Code Model 2 specification, supporting all versions (sizes)
* from 1 to 40, all 4 error correction levels, and 4 character encoding modes.
- *
+ *
* Ways to create a QR Code object:
* - High level: Take the payload data and call qrcodegen_encodeText() or qrcodegen_encodeBinary().
* - Low level: Custom-make the list of segments and call
@@ -51,7 +51,7 @@ extern "C" {
/*---- Enum and struct types----*/
-/*
+/*
* The error correction level in a QR Code symbol.
*/
enum qrcodegen_Ecc {
@@ -64,7 +64,7 @@ enum qrcodegen_Ecc {
};
-/*
+/*
* The mask pattern used in a QR Code symbol.
*/
enum qrcodegen_Mask {
@@ -83,7 +83,7 @@ enum qrcodegen_Mask {
};
-/*
+/*
* Describes how a segment's data bits are interpreted.
*/
enum qrcodegen_Mode {
@@ -95,7 +95,7 @@ enum qrcodegen_Mode {
};
-/*
+/*
* A segment of character/binary/control data in a QR Code symbol.
* The mid-level way to create a segment is to take the payload data
* and call a factory function such as qrcodegen_makeNumeric().
@@ -147,7 +147,7 @@ struct qrcodegen_Segment {
/*---- Functions (high level) to generate QR Codes ----*/
-/*
+/*
* Encodes the given text string to a QR Code, returning true if encoding succeeded.
* If the data is too long to fit in any version in the given range
* at the given ECC level, then false is returned.
@@ -170,7 +170,7 @@ bool qrcodegen_encodeText(const char *text, uint8_t tempBuffer[], uint8_t qrcode
enum qrcodegen_Ecc ecl, int minVersion, int maxVersion, enum qrcodegen_Mask mask, bool boostEcl);
-/*
+/*
* Encodes the given binary data to a QR Code, returning true if encoding succeeded.
* If the data is too long to fit in any version in the given range
* at the given ECC level, then false is returned.
@@ -194,7 +194,7 @@ bool qrcodegen_encodeBinary(uint8_t dataAndTemp[], size_t dataLen, uint8_t qrcod
/*---- Functions (low level) to generate QR Codes ----*/
-/*
+/*
* Renders a QR Code representing the given segments at the given error correction level.
* The smallest possible QR Code version is automatically chosen for the output. Returns true if
* QR Code creation succeeded, or false if the data is too long to fit in any version. The ECC level
@@ -210,7 +210,7 @@ bool qrcodegen_encodeSegments(const struct qrcodegen_Segment segs[], size_t len,
enum qrcodegen_Ecc ecl, uint8_t tempBuffer[], uint8_t qrcode[]);
-/*
+/*
* Renders a QR Code representing the given segments with the given encoding parameters.
* Returns true if QR Code creation succeeded, or false if the data is too long to fit in the range of versions.
* The smallest possible QR Code version within the given range is automatically
@@ -229,7 +229,7 @@ bool qrcodegen_encodeSegmentsAdvanced(const struct qrcodegen_Segment segs[], siz
int minVersion, int maxVersion, int mask, bool boostEcl, uint8_t tempBuffer[], uint8_t qrcode[]);
-/*
+/*
* Tests whether the given string can be encoded as a segment in alphanumeric mode.
* A string is encodable iff each character is in the following set: 0 to 9, A to Z
* (uppercase only), space, dollar, percent, asterisk, plus, hyphen, period, slash, colon.
@@ -237,14 +237,14 @@ bool qrcodegen_encodeSegmentsAdvanced(const struct qrcodegen_Segment segs[], siz
bool qrcodegen_isAlphanumeric(const char *text);
-/*
+/*
* Tests whether the given string can be encoded as a segment in numeric mode.
* A string is encodable iff each character is in the range 0 to 9.
*/
bool qrcodegen_isNumeric(const char *text);
-/*
+/*
* Returns the number of bytes (uint8_t) needed for the data buffer of a segment
* containing the given number of characters using the given mode. Notes:
* - Returns SIZE_MAX on failure, i.e. numChars > INT16_MAX or
@@ -258,7 +258,7 @@ bool qrcodegen_isNumeric(const char *text);
size_t qrcodegen_calcSegmentBufferSize(enum qrcodegen_Mode mode, size_t numChars);
-/*
+/*
* Returns a segment representing the given binary data encoded in
* byte mode. All input byte arrays are acceptable. Any text string
* can be converted to UTF-8 bytes and encoded as a byte mode segment.
@@ -266,13 +266,13 @@ size_t qrcodegen_calcSegmentBufferSize(enum qrcodegen_Mode mode, size_t numChars
struct qrcodegen_Segment qrcodegen_makeBytes(const uint8_t data[], size_t len, uint8_t buf[]);
-/*
+/*
* Returns a segment representing the given string of decimal digits encoded in numeric mode.
*/
struct qrcodegen_Segment qrcodegen_makeNumeric(const char *digits, uint8_t buf[]);
-/*
+/*
* Returns a segment representing the given text string encoded in alphanumeric mode.
* The characters allowed are: 0 to 9, A to Z (uppercase only), space,
* dollar, percent, asterisk, plus, hyphen, period, slash, colon.
@@ -280,7 +280,7 @@ struct qrcodegen_Segment qrcodegen_makeNumeric(const char *digits, uint8_t buf[]
struct qrcodegen_Segment qrcodegen_makeAlphanumeric(const char *text, uint8_t buf[]);
-/*
+/*
* Returns a segment representing an Extended Channel Interpretation
* (ECI) designator with the given assignment value.
*/
@@ -289,7 +289,7 @@ struct qrcodegen_Segment qrcodegen_makeEci(long assignVal, uint8_t buf[]);
/*---- Functions to extract raw data from QR Codes ----*/
-/*
+/*
* Returns the side length of the given QR Code, assuming that encoding succeeded.
* The result is in the range [21, 177]. Note that the length of the array buffer
* is related to the side length - every 'uint8_t qrcode[]' must have length at least
@@ -298,18 +298,18 @@ struct qrcodegen_Segment qrcodegen_makeEci(long assignVal, uint8_t buf[]);
int qrcodegen_getSize(const uint8_t qrcode[]);
-/*
+/*
* Returns the color of the module (pixel) at the given coordinates, which is false
* for white or true for black. The top left corner has the coordinates (x=0, y=0).
* If the given coordinates are out of bounds, then false (white) is returned.
*/
bool qrcodegen_getModule(const uint8_t qrcode[], int x, int y);
-/*
+/*
* Returns the qrcode size of the specified version. Returns -1 on failure
*/
int qrcodegen_version2size(int version);
-/*
+/*
* Returns the min version of the data that can be stored. Returns -1 on failure
*/
int qrcodegen_getMinFitVersion(enum qrcodegen_Ecc ecl, size_t dataLen);
diff --git a/src/extra/libs/sjpg/lv_sjpg.c b/src/extra/libs/sjpg/lv_sjpg.c
index a34df6a72..5a12ea251 100644
--- a/src/extra/libs/sjpg/lv_sjpg.c
+++ b/src/extra/libs/sjpg/lv_sjpg.c
@@ -111,7 +111,7 @@ static lv_res_t decoder_read_line(lv_img_decoder_t * decoder, lv_img_decoder_dsc
lv_coord_t len, uint8_t * buf);
static void decoder_close(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t * dsc);
static size_t input_func(JDEC * jd, uint8_t * buff, size_t ndata);
-static int is_jpg(const uint8_t * raw_data);
+static int is_jpg(const uint8_t * raw_data, size_t len);
static void lv_sjpg_cleanup(SJPEG * sjpeg);
static void lv_sjpg_free(SJPEG * sjpeg);
@@ -157,8 +157,9 @@ static lv_res_t decoder_info(lv_img_decoder_t * decoder, const void * src, lv_im
lv_res_t ret = LV_RES_OK;
if(src_type == LV_IMG_SRC_VARIABLE) {
- uint8_t * raw_sjpeg_data = (uint8_t *)((lv_img_dsc_t *)src)->data;
- const uint32_t raw_sjpeg_data_size = ((lv_img_dsc_t *)src)->data_size;
+ const lv_img_dsc_t * img_dsc = src;
+ uint8_t * raw_sjpeg_data = (uint8_t *)img_dsc->data;
+ const uint32_t raw_sjpeg_data_size = img_dsc->data_size;
if(!strncmp((char *)raw_sjpeg_data, "_SJPG__", strlen("_SJPG__"))) {
@@ -175,7 +176,7 @@ static lv_res_t decoder_info(lv_img_decoder_t * decoder, const void * src, lv_im
return ret;
}
- else if(is_jpg(raw_sjpeg_data) == true) {
+ else if(is_jpg(raw_sjpeg_data, raw_sjpeg_data_size) == true) {
header->always_zero = 0;
header->cf = LV_IMG_CF_RAW;
@@ -210,7 +211,7 @@ static lv_res_t decoder_info(lv_img_decoder_t * decoder, const void * src, lv_im
}
else if(src_type == LV_IMG_SRC_FILE) {
const char * fn = src;
- if(!strcmp(&fn[strlen(fn) - 5], ".sjpg")) {
+ if(strcmp(lv_fs_get_ext(fn), "sjpg") == 0) {
uint8_t buff[22];
memset(buff, 0, sizeof(buff));
@@ -245,7 +246,7 @@ static lv_res_t decoder_info(lv_img_decoder_t * decoder, const void * src, lv_im
}
}
- else if(!strcmp(&fn[strlen(fn) - 4], ".jpg")) {
+ else if(strcmp(lv_fs_get_ext(fn), "jpg") == 0) {
lv_fs_file_t file;
lv_fs_res_t res = lv_fs_open(&file, fn, LV_FS_MODE_RD);
if(res != LV_FS_RES_OK) return 78;
@@ -348,6 +349,7 @@ static lv_res_t decoder_open(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t *
if(dsc->src_type == LV_IMG_SRC_VARIABLE) {
uint8_t * data;
SJPEG * sjpeg = (SJPEG *) dsc->user_data;
+ const uint32_t raw_sjpeg_data_size = ((lv_img_dsc_t *)dsc->src)->data_size;
if(sjpeg == NULL) {
sjpeg = lv_mem_alloc(sizeof(SJPEG));
if(!sjpeg) return LV_RES_INV;
@@ -420,8 +422,7 @@ static lv_res_t decoder_open(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t *
dsc->img_data = NULL;
return lv_ret;
}
-
- else if(is_jpg(sjpeg->sjpeg_data) == true) {
+ else if(is_jpg(sjpeg->sjpeg_data, raw_sjpeg_data_size) == true) {
uint8_t * workb_temp = lv_mem_alloc(TJPGD_WORKBUFF_SIZE);
if(! workb_temp) {
@@ -502,7 +503,7 @@ static lv_res_t decoder_open(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t *
const char * fn = dsc->src;
uint8_t * data;
- if(!strcmp(&fn[strlen(fn) - 5], ".sjpg")) {
+ if(strcmp(lv_fs_get_ext(fn), "sjpg") == 0) {
uint8_t buff[22];
memset(buff, 0, sizeof(buff));
@@ -605,7 +606,7 @@ static lv_res_t decoder_open(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t *
return LV_RES_OK;
}
}
- else if(!strcmp(&fn[strlen(fn) - 4], ".jpg")) {
+ else if(strcmp(lv_fs_get_ext(fn), "jpg") == 0) {
lv_fs_file_t lv_file;
lv_fs_res_t res = lv_fs_open(&lv_file, fn, LV_FS_MODE_RD);
@@ -766,7 +767,7 @@ static lv_res_t decoder_read_line(lv_img_decoder_t * decoder, lv_img_decoder_dsc
uint16_t col_16bit = (*cache++ & 0xf8) << 8;
col_16bit |= (*cache++ & 0xFC) << 3;
col_16bit |= (*cache++ >> 3);
-#if LV_BIG_ENDIAN_SYSTEM == 1
+#if LV_BIG_ENDIAN_SYSTEM == 1 || LV_COLOR_16_SWAP == 1
buf[offset++] = col_16bit >> 8;
buf[offset++] = col_16bit & 0xff;
#else
@@ -830,7 +831,7 @@ static lv_res_t decoder_read_line(lv_img_decoder_t * decoder, lv_img_decoder_dsc
uint16_t col_8bit = (*cache++ & 0xf8) << 8;
col_8bit |= (*cache++ & 0xFC) << 3;
col_8bit |= (*cache++ >> 3);
-#if LV_BIG_ENDIAN_SYSTEM == 1
+#if LV_BIG_ENDIAN_SYSTEM == 1 || LV_COLOR_16_SWAP == 1
buf[offset++] = col_8bit >> 8;
buf[offset++] = col_8bit & 0xff;
#else
@@ -889,9 +890,10 @@ static void decoder_close(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t * dsc
}
}
-static int is_jpg(const uint8_t * raw_data)
+static int is_jpg(const uint8_t * raw_data, size_t len)
{
const uint8_t jpg_signature[] = {0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46};
+ if(len < sizeof(jpg_signature)) return false;
return memcmp(jpg_signature, raw_data, sizeof(jpg_signature)) == 0;
}
diff --git a/src/extra/libs/sjpg/tjpgd.c b/src/extra/libs/sjpg/tjpgd.c
index 53158e75b..47ddefb6e 100644
--- a/src/extra/libs/sjpg/tjpgd.c
+++ b/src/extra/libs/sjpg/tjpgd.c
@@ -946,7 +946,7 @@ static JRESULT mcu_output (
}
/* Output the rectangular */
- return outfunc(jd, jd->workbuf, &rect) ? JDR_OK : JDR_INTR;
+ return outfunc(jd, jd->workbuf, &rect) ? JDR_OK : JDR_INTR;
}
diff --git a/src/extra/lv_extra.c b/src/extra/lv_extra.c
index 1968b315a..a4f19f542 100644
--- a/src/extra/lv_extra.c
+++ b/src/extra/lv_extra.c
@@ -42,6 +42,10 @@ void lv_extra_init(void)
lv_grid_init();
#endif
+#if LV_USE_MSG
+ lv_msg_init();
+#endif
+
#if LV_USE_FS_FATFS
lv_fs_fatfs_init();
#endif
@@ -58,6 +62,10 @@ void lv_extra_init(void)
lv_fs_win32_init();
#endif
+#if LV_USE_FFMPEG
+ lv_ffmpeg_init();
+#endif
+
#if LV_USE_PNG
lv_png_init();
#endif
@@ -78,10 +86,6 @@ void lv_extra_init(void)
lv_freetype_init(0, 0, 0);
# endif
#endif
-
-#if LV_USE_FFMPEG
- lv_ffmpeg_init();
-#endif
}
/**********************
diff --git a/src/extra/lv_extra.h b/src/extra/lv_extra.h
index ea9ce381b..c0306a980 100644
--- a/src/extra/lv_extra.h
+++ b/src/extra/lv_extra.h
@@ -14,6 +14,12 @@ extern "C" {
* INCLUDES
*********************/
+#include "layouts/lv_layouts.h"
+#include "libs/lv_libs.h"
+#include "others/lv_others.h"
+#include "themes/lv_themes.h"
+#include "widgets/lv_widgets.h"
+
/*********************
* DEFINES
*********************/
diff --git a/src/extra/extra.mk b/src/extra/lv_extra.mk
similarity index 100%
rename from src/extra/extra.mk
rename to src/extra/lv_extra.mk
diff --git a/src/extra/others/fragment/README.md b/src/extra/others/fragment/README.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/extra/others/fragment/lv_fragment.c b/src/extra/others/fragment/lv_fragment.c
new file mode 100644
index 000000000..a2cdfadc2
--- /dev/null
+++ b/src/extra/others/fragment/lv_fragment.c
@@ -0,0 +1,144 @@
+/**
+ * @file lv_fragment.c
+ *
+ */
+
+/*********************
+ * INCLUDES
+ *********************/
+
+#include "lv_fragment.h"
+
+#if LV_USE_FRAGMENT
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+
+static void cb_delete_assertion(lv_event_t * event);
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+
+lv_fragment_t * lv_fragment_create(const lv_fragment_class_t * cls, void * args)
+{
+ LV_ASSERT_NULL(cls);
+ LV_ASSERT_NULL(cls->create_obj_cb);
+ LV_ASSERT(cls->instance_size > 0);
+ lv_fragment_t * instance = lv_mem_alloc(cls->instance_size);
+ lv_memset_00(instance, cls->instance_size);
+ instance->cls = cls;
+ instance->child_manager = lv_fragment_manager_create(instance);
+ if(cls->constructor_cb) {
+ cls->constructor_cb(instance, args);
+ }
+ return instance;
+}
+
+void lv_fragment_del(lv_fragment_t * fragment)
+{
+ LV_ASSERT_NULL(fragment);
+ if(fragment->managed) {
+ lv_fragment_manager_remove(fragment->managed->manager, fragment);
+ return;
+ }
+ if(fragment->obj) {
+ lv_fragment_del_obj(fragment);
+ }
+ /* Objects will leak if this function called before objects deleted */
+ const lv_fragment_class_t * cls = fragment->cls;
+ if(cls->destructor_cb) {
+ cls->destructor_cb(fragment);
+ }
+ lv_fragment_manager_del(fragment->child_manager);
+ lv_mem_free(fragment);
+}
+
+lv_fragment_manager_t * lv_fragment_get_manager(lv_fragment_t * fragment)
+{
+ LV_ASSERT_NULL(fragment);
+ LV_ASSERT_NULL(fragment->managed);
+ return fragment->managed->manager;
+}
+
+lv_obj_t * const * lv_fragment_get_container(lv_fragment_t * fragment)
+{
+ LV_ASSERT_NULL(fragment);
+ LV_ASSERT_NULL(fragment->managed);
+ return fragment->managed->container;
+}
+
+lv_fragment_t * lv_fragment_get_parent(lv_fragment_t * fragment)
+{
+ LV_ASSERT_NULL(fragment);
+ LV_ASSERT_NULL(fragment->managed);
+ return lv_fragment_manager_get_parent_fragment(fragment->managed->manager);
+}
+
+lv_obj_t * lv_fragment_create_obj(lv_fragment_t * fragment, lv_obj_t * container)
+{
+ lv_fragment_managed_states_t * states = fragment->managed;
+ if(states) {
+ states->destroying_obj = false;
+ }
+ const lv_fragment_class_t * cls = fragment->cls;
+ lv_obj_t * obj = cls->create_obj_cb(fragment, container);
+ LV_ASSERT_NULL(obj);
+ fragment->obj = obj;
+ lv_fragment_manager_create_obj(fragment->child_manager);
+ if(states) {
+ states->obj_created = true;
+ lv_obj_add_event_cb(obj, cb_delete_assertion, LV_EVENT_DELETE, NULL);
+ }
+ if(cls->obj_created_cb) {
+ cls->obj_created_cb(fragment, obj);
+ }
+ return obj;
+}
+
+void lv_fragment_del_obj(lv_fragment_t * fragment)
+{
+ LV_ASSERT_NULL(fragment);
+ lv_fragment_manager_del_obj(fragment->child_manager);
+ lv_fragment_managed_states_t * states = fragment->managed;
+ if(states) {
+ if(!states->obj_created) return;
+ states->destroying_obj = true;
+ bool cb_removed = lv_obj_remove_event_cb(fragment->obj, cb_delete_assertion);
+ LV_ASSERT(cb_removed);
+ }
+ LV_ASSERT_NULL(fragment->obj);
+ const lv_fragment_class_t * cls = fragment->cls;
+ if(cls->obj_will_delete_cb) {
+ cls->obj_will_delete_cb(fragment, fragment->obj);
+ }
+ lv_obj_del(fragment->obj);
+ if(cls->obj_deleted_cb) {
+ cls->obj_deleted_cb(fragment, fragment->obj);
+ }
+ if(states) {
+ states->obj_created = false;
+ }
+ fragment->obj = NULL;
+}
+
+void lv_fragment_recreate_obj(lv_fragment_t * fragment)
+{
+ LV_ASSERT_NULL(fragment);
+ LV_ASSERT_NULL(fragment->managed);
+ lv_fragment_del_obj(fragment);
+ lv_fragment_create_obj(fragment, *fragment->managed->container);
+}
+
+/**********************
+ * STATIC FUNCTIONS
+ **********************/
+
+static void cb_delete_assertion(lv_event_t * event)
+{
+ LV_UNUSED(event);
+ LV_ASSERT_MSG(0, "Please delete objects with lv_fragment_destroy_obj");
+}
+
+#endif /*LV_USE_FRAGMENT*/
diff --git a/src/extra/others/fragment/lv_fragment.h b/src/extra/others/fragment/lv_fragment.h
new file mode 100644
index 000000000..da30b39a5
--- /dev/null
+++ b/src/extra/others/fragment/lv_fragment.h
@@ -0,0 +1,339 @@
+/**
+ * Public header for Fragment
+ * @file lv_fragment.h
+ */
+
+#ifndef LV_FRAGMENT_H
+#define LV_FRAGMENT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ * INCLUDES
+ *********************/
+#include "../../../lv_conf_internal.h"
+
+#if LV_USE_FRAGMENT
+
+#include "../../../core/lv_obj.h"
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+typedef struct _lv_fragment_manager_t lv_fragment_manager_t;
+
+typedef struct _lv_fragment_t lv_fragment_t;
+typedef struct _lv_fragment_class_t lv_fragment_class_t;
+typedef struct _lv_fragment_managed_states_t lv_fragment_managed_states_t;
+
+struct _lv_fragment_t {
+ /**
+ * Class of this fragment
+ */
+ const lv_fragment_class_t * cls;
+ /**
+ * Managed fragment states. If not null, then this fragment is managed.
+ *
+ * @warning Don't modify values inside this struct!
+ */
+ lv_fragment_managed_states_t * managed;
+ /**
+ * Child fragment manager
+ */
+ lv_fragment_manager_t * child_manager;
+ /**
+ * lv_obj returned by create_obj_cb
+ */
+ lv_obj_t * obj;
+
+};
+
+struct _lv_fragment_class_t {
+ /**
+ * Constructor function for fragment class
+ * @param self Fragment instance
+ * @param args Arguments assigned by fragment manager
+ */
+ void (*constructor_cb)(lv_fragment_t * self, void * args);
+
+ /**
+ * Destructor function for fragment class
+ * @param self Fragment instance, will be freed after this call
+ */
+ void (*destructor_cb)(lv_fragment_t * self);
+
+ /**
+ * Fragment attached to manager
+ * @param self Fragment instance
+ */
+ void (*attached_cb)(lv_fragment_t * self);
+
+ /**
+ * Fragment detached from manager
+ * @param self Fragment instance
+ */
+ void (*detached_cb)(lv_fragment_t * self);
+
+ /**
+ * Create objects
+ * @param self Fragment instance
+ * @param container Container of the objects should be created upon
+ * @return Created object, NULL if multiple objects has been created
+ */
+ lv_obj_t * (*create_obj_cb)(lv_fragment_t * self, lv_obj_t * container);
+
+ /**
+ *
+ * @param self Fragment instance
+ * @param obj lv_obj returned by create_obj_cb
+ */
+ void (*obj_created_cb)(lv_fragment_t * self, lv_obj_t * obj);
+
+ /**
+ * Called before objects in the fragment will be deleted.
+ *
+ * @param self Fragment instance
+ * @param obj object with this fragment
+ */
+ void (*obj_will_delete_cb)(lv_fragment_t * self, lv_obj_t * obj);
+
+ /**
+ * Called when the object created by fragment received `LV_EVENT_DELETE` event
+ * @param self Fragment instance
+ * @param obj object with this fragment
+ */
+ void (*obj_deleted_cb)(lv_fragment_t * self, lv_obj_t * obj);
+
+ /**
+ * Handle event
+ * @param self Fragment instance
+ * @param which User-defined ID of event
+ * @param data1 User-defined data
+ * @param data2 User-defined data
+ */
+ bool (*event_cb)(lv_fragment_t * self, int code, void * userdata);
+
+ /**
+ * *REQUIRED*: Allocation size of fragment
+ */
+ size_t instance_size;
+};
+
+/**
+ * Fragment states
+ */
+typedef struct _lv_fragment_managed_states_t {
+ /**
+ * Class of the fragment
+ */
+ const lv_fragment_class_t * cls;
+ /**
+ * Manager the fragment attached to
+ */
+ lv_fragment_manager_t * manager;
+ /**
+ * Container object the fragment adding view to
+ */
+ lv_obj_t * const * container;
+ /**
+ * Fragment instance
+ */
+ lv_fragment_t * instance;
+ /**
+ * true between `create_obj_cb` and `obj_deleted_cb`
+ */
+ bool obj_created;
+ /**
+ * true before `lv_fragment_del_obj` is called. Don't touch any object if this is true
+ */
+ bool destroying_obj;
+ /**
+ * true if this fragment is in navigation stack that can be popped
+ */
+ bool in_stack;
+} lv_fragment_managed_states_t;
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+/**
+ * Create fragment manager instance
+ * @param parent Parent fragment if this manager is placed inside another fragment, can be null.
+ * @return Fragment manager instance
+ */
+lv_fragment_manager_t * lv_fragment_manager_create(lv_fragment_t * parent);
+
+/**
+ * Destroy fragment manager instance
+ * @param manager Fragment manager instance
+ */
+void lv_fragment_manager_del(lv_fragment_manager_t * manager);
+
+/**
+ * Create object of all fragments managed by this manager.
+ * @param manager Fragment manager instance
+ */
+void lv_fragment_manager_create_obj(lv_fragment_manager_t * manager);
+
+/**
+ * Delete object created by all fragments managed by this manager. Instance of fragments will not be deleted.
+ * @param manager Fragment manager instance
+ */
+void lv_fragment_manager_del_obj(lv_fragment_manager_t * manager);
+
+/**
+ * Attach fragment to manager, and add to container.
+ * @param manager Fragment manager instance
+ * @param fragment Fragment instance
+ * @param container Pointer to container object for manager to add objects to
+ */
+void lv_fragment_manager_add(lv_fragment_manager_t * manager, lv_fragment_t * fragment, lv_obj_t * const * container);
+
+/**
+ * Detach and destroy fragment. If fragment is in navigation stack, remove from it.
+ * @param manager Fragment manager instance
+ * @param fragment Fragment instance
+ */
+void lv_fragment_manager_remove(lv_fragment_manager_t * manager, lv_fragment_t * fragment);
+
+/**
+ * Attach fragment to manager and add to navigation stack.
+ * @param manager Fragment manager instance
+ * @param fragment Fragment instance
+ * @param container Pointer to container object for manager to add objects to
+ */
+void lv_fragment_manager_push(lv_fragment_manager_t * manager, lv_fragment_t * fragment, lv_obj_t * const * container);
+
+/**
+ * Remove the top-most fragment for stack
+ * @param manager Fragment manager instance
+ * @return true if there is fragment to pop
+ */
+bool lv_fragment_manager_pop(lv_fragment_manager_t * manager);
+
+/**
+ * Replace fragment. Old item in the stack will be removed.
+ * @param manager Fragment manager instance
+ * @param fragment Fragment instance
+ * @param container Pointer to container object for manager to add objects to
+ */
+void lv_fragment_manager_replace(lv_fragment_manager_t * manager, lv_fragment_t * fragment,
+ lv_obj_t * const * container);
+
+/**
+ * Send event to top-most fragment
+ * @param manager Fragment manager instance
+ * @param code User-defined ID of event
+ * @param userdata User-defined data
+ * @return true if fragment returned true
+ */
+bool lv_fragment_manager_send_event(lv_fragment_manager_t * manager, int code, void * userdata);
+
+/**
+ * Get stack size of this fragment manager
+ * @param manager Fragment manager instance
+ * @return Stack size of this fragment manager
+ */
+size_t lv_fragment_manager_get_stack_size(lv_fragment_manager_t * manager);
+
+/**
+ * Get top most fragment instance
+ * @param manager Fragment manager instance
+ * @return Top most fragment instance
+ */
+lv_fragment_t * lv_fragment_manager_get_top(lv_fragment_manager_t * manager);
+
+/**
+ * Find first fragment instance in the container
+ * @param manager Fragment manager instance
+ * @param container Container which target fragment added to
+ * @return First fragment instance in the container
+ */
+lv_fragment_t * lv_fragment_manager_find_by_container(lv_fragment_manager_t * manager, const lv_obj_t * container);
+
+/**
+ * Get parent fragment
+ * @param manager Fragment manager instance
+ * @return Parent fragment instance
+ */
+lv_fragment_t * lv_fragment_manager_get_parent_fragment(lv_fragment_manager_t * manager);
+
+
+/**
+ * Create a fragment instance.
+ *
+ * @param cls Fragment class. This fragment must return non null object.
+ * @param args Arguments assigned by fragment manager
+ * @return Fragment instance
+ */
+lv_fragment_t * lv_fragment_create(const lv_fragment_class_t * cls, void * args);
+
+/**
+ * Destroy a fragment.
+ * @param fragment Fragment instance.
+ */
+void lv_fragment_del(lv_fragment_t * fragment);
+
+/**
+ * Get associated manager of this fragment
+ * @param fragment Fragment instance
+ * @return Fragment manager instance
+ */
+lv_fragment_manager_t * lv_fragment_get_manager(lv_fragment_t * fragment);
+
+/**
+ * Get container object of this fragment
+ * @param fragment Fragment instance
+ * @return Reference to container object
+ */
+lv_obj_t * const * lv_fragment_get_container(lv_fragment_t * fragment);
+
+/**
+ * Get parent fragment of this fragment
+ * @param fragment Fragment instance
+ * @return Parent fragment
+ */
+lv_fragment_t * lv_fragment_get_parent(lv_fragment_t * fragment);
+
+/**
+ * Create object by fragment.
+ *
+ * @param fragment Fragment instance.
+ * @param container Container of the objects should be created upon.
+ * @return Created object
+ */
+lv_obj_t * lv_fragment_create_obj(lv_fragment_t * fragment, lv_obj_t * container);
+
+/**
+ * Delete created object of a fragment
+ *
+ * @param fragment Fragment instance.
+ */
+void lv_fragment_del_obj(lv_fragment_t * fragment);
+
+/**
+ * Destroy obj in fragment, and recreate them.
+ * @param fragment Fragment instance
+ */
+void lv_fragment_recreate_obj(lv_fragment_t * fragment);
+
+
+/**********************
+ * MACROS
+ **********************/
+
+#endif /*LV_USE_FRAGMENT*/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /*LV_FRAGMENT_H*/
diff --git a/src/extra/others/fragment/lv_fragment_manager.c b/src/extra/others/fragment/lv_fragment_manager.c
new file mode 100644
index 000000000..ade721587
--- /dev/null
+++ b/src/extra/others/fragment/lv_fragment_manager.c
@@ -0,0 +1,281 @@
+/**
+ * @file lv_fragment_manager.c
+ *
+ */
+
+/*********************
+ * INCLUDES
+ *********************/
+
+#include "lv_fragment.h"
+
+#if LV_USE_FRAGMENT
+
+#include "../../../misc/lv_ll.h"
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+typedef struct _lv_fragment_stack_item_t {
+ lv_fragment_managed_states_t * states;
+} lv_fragment_stack_item_t;
+
+struct _lv_fragment_manager_t {
+ lv_fragment_t * parent;
+ /**
+ * Linked list to store attached fragments
+ */
+ lv_ll_t attached;
+ /**
+ * Linked list to store fragments in stack
+ */
+ lv_ll_t stack;
+};
+
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+
+static void item_create_obj(lv_fragment_managed_states_t * item);
+
+static void item_del_obj(lv_fragment_managed_states_t * item);
+
+static void item_del_fragment(lv_fragment_managed_states_t * item);
+
+static lv_fragment_managed_states_t * fragment_attach(lv_fragment_manager_t * manager, lv_fragment_t * fragment,
+ lv_obj_t * const * container);
+
+/**********************
+ * STATIC VARIABLES
+ **********************/
+
+/**********************
+ * MACROS
+ **********************/
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+
+lv_fragment_manager_t * lv_fragment_manager_create(lv_fragment_t * parent)
+{
+ lv_fragment_manager_t * instance = lv_mem_alloc(sizeof(lv_fragment_manager_t));
+ lv_memset_00(instance, sizeof(lv_fragment_manager_t));
+ instance->parent = parent;
+ _lv_ll_init(&instance->attached, sizeof(lv_fragment_managed_states_t));
+ _lv_ll_init(&instance->stack, sizeof(lv_fragment_stack_item_t));
+ return instance;
+}
+
+void lv_fragment_manager_del(lv_fragment_manager_t * manager)
+{
+ LV_ASSERT_NULL(manager);
+ lv_fragment_managed_states_t * states;
+ _LV_LL_READ_BACK(&manager->attached, states) {
+ item_del_obj(states);
+ item_del_fragment(states);
+ }
+ _lv_ll_clear(&manager->attached);
+ _lv_ll_clear(&manager->stack);
+ lv_mem_free(manager);
+}
+
+void lv_fragment_manager_create_obj(lv_fragment_manager_t * manager)
+{
+ LV_ASSERT_NULL(manager);
+ lv_fragment_stack_item_t * top = _lv_ll_get_tail(&manager->stack);
+ lv_fragment_managed_states_t * states = NULL;
+ _LV_LL_READ(&manager->attached, states) {
+ if(states->in_stack && top->states != states) {
+ /*Only create obj for top item in stack*/
+ continue;
+ }
+ item_create_obj(states);
+ }
+}
+
+void lv_fragment_manager_del_obj(lv_fragment_manager_t * manager)
+{
+ LV_ASSERT_NULL(manager);
+ lv_fragment_managed_states_t * states = NULL;
+ _LV_LL_READ_BACK(&manager->attached, states) {
+ item_del_obj(states);
+ }
+}
+
+void lv_fragment_manager_add(lv_fragment_manager_t * manager, lv_fragment_t * fragment, lv_obj_t * const * container)
+{
+ lv_fragment_managed_states_t * states = fragment_attach(manager, fragment, container);
+ if(!manager->parent || manager->parent->managed->obj_created) {
+ item_create_obj(states);
+ }
+}
+
+void lv_fragment_manager_remove(lv_fragment_manager_t * manager, lv_fragment_t * fragment)
+{
+ LV_ASSERT_NULL(manager);
+ LV_ASSERT_NULL(fragment);
+ LV_ASSERT_NULL(fragment->managed);
+ LV_ASSERT(fragment->managed->manager == manager);
+ lv_fragment_managed_states_t * states = fragment->managed;
+ lv_fragment_managed_states_t * prev = NULL;
+ bool was_top = false;
+ if(states->in_stack) {
+ void * stack_top = _lv_ll_get_tail(&manager->stack);
+ lv_fragment_stack_item_t * item = NULL;
+ _LV_LL_READ_BACK(&manager->stack, item) {
+ if(item->states == states) {
+ was_top = stack_top == item;
+ void * stack_prev = _lv_ll_get_prev(&manager->stack, item);
+ if(!stack_prev) break;
+ prev = ((lv_fragment_stack_item_t *) stack_prev)->states;
+ break;
+ }
+ }
+ if(item) {
+ _lv_ll_remove(&manager->stack, item);
+ lv_mem_free(item);
+ }
+ }
+ item_del_obj(states);
+ item_del_fragment(states);
+ _lv_ll_remove(&manager->attached, states);
+ lv_mem_free(states);
+ if(prev && was_top) {
+ item_create_obj(prev);
+ }
+}
+
+void lv_fragment_manager_push(lv_fragment_manager_t * manager, lv_fragment_t * fragment, lv_obj_t * const * container)
+{
+ lv_fragment_stack_item_t * top = _lv_ll_get_tail(&manager->stack);
+ if(top != NULL) {
+ item_del_obj(top->states);
+ }
+ lv_fragment_managed_states_t * states = fragment_attach(manager, fragment, container);
+ states->in_stack = true;
+ /*Add fragment to the top of the stack*/
+ lv_fragment_stack_item_t * item = _lv_ll_ins_tail(&manager->stack);
+ lv_memset_00(item, sizeof(lv_fragment_stack_item_t));
+ item->states = states;
+ item_create_obj(states);
+}
+
+bool lv_fragment_manager_pop(lv_fragment_manager_t * manager)
+{
+ lv_fragment_t * top = lv_fragment_manager_get_top(manager);
+ if(top == NULL) return false;
+ lv_fragment_manager_remove(manager, top);
+ return true;
+}
+
+void lv_fragment_manager_replace(lv_fragment_manager_t * manager, lv_fragment_t * fragment,
+ lv_obj_t * const * container)
+{
+ lv_fragment_t * top = lv_fragment_manager_find_by_container(manager, *container);
+ if(top != NULL) {
+ lv_fragment_manager_remove(manager, top);
+ }
+ lv_fragment_manager_add(manager, fragment, container);
+}
+
+bool lv_fragment_manager_send_event(lv_fragment_manager_t * manager, int code, void * userdata)
+{
+ LV_ASSERT_NULL(manager);
+ lv_fragment_managed_states_t * p = NULL;
+ _LV_LL_READ_BACK(&manager->attached, p) {
+ if(!p->obj_created || p->destroying_obj) continue;
+ lv_fragment_t * instance = p->instance;
+ if(!instance) continue;
+ if(lv_fragment_manager_send_event(instance->child_manager, code, userdata)) return true;
+ if(p->cls->event_cb && p->cls->event_cb(instance, code, userdata)) return true;
+ }
+ return false;
+}
+
+size_t lv_fragment_manager_get_stack_size(lv_fragment_manager_t * manager)
+{
+ LV_ASSERT_NULL(manager);
+ return _lv_ll_get_len(&manager->stack);
+}
+
+lv_fragment_t * lv_fragment_manager_get_top(lv_fragment_manager_t * manager)
+{
+ LV_ASSERT(manager);
+ lv_fragment_stack_item_t * top = _lv_ll_get_tail(&manager->stack);
+ if(!top)return NULL;
+ return top->states->instance;
+}
+
+lv_fragment_t * lv_fragment_manager_find_by_container(lv_fragment_manager_t * manager, const lv_obj_t * container)
+{
+ LV_ASSERT(manager);
+ lv_fragment_managed_states_t * states;
+ _LV_LL_READ(&manager->attached, states) {
+ if(*states->container == container) return states->instance;
+ }
+ return NULL;
+}
+
+lv_fragment_t * lv_fragment_manager_get_parent_fragment(lv_fragment_manager_t * manager)
+{
+ LV_ASSERT_NULL(manager);
+ return manager->parent;
+}
+
+/**********************
+ * STATIC FUNCTIONS
+ **********************/
+
+static void item_create_obj(lv_fragment_managed_states_t * item)
+{
+ LV_ASSERT(item->instance);
+ lv_fragment_create_obj(item->instance, item->container ? *item->container : NULL);
+}
+
+static void item_del_obj(lv_fragment_managed_states_t * item)
+{
+ lv_fragment_del_obj(item->instance);
+}
+
+/**
+ * Detach, then destroy fragment
+ * @param item fragment states
+ */
+static void item_del_fragment(lv_fragment_managed_states_t * item)
+{
+ lv_fragment_t * instance = item->instance;
+ if(instance->cls->detached_cb) {
+ instance->cls->detached_cb(instance);
+ }
+ instance->managed = NULL;
+ lv_fragment_del(instance);
+ item->instance = NULL;
+}
+
+
+static lv_fragment_managed_states_t * fragment_attach(lv_fragment_manager_t * manager, lv_fragment_t * fragment,
+ lv_obj_t * const * container)
+{
+ LV_ASSERT(manager);
+ LV_ASSERT(fragment);
+ LV_ASSERT(fragment->managed == NULL);
+ lv_fragment_managed_states_t * states = _lv_ll_ins_tail(&manager->attached);
+ lv_memset_00(states, sizeof(lv_fragment_managed_states_t));
+ states->cls = fragment->cls;
+ states->manager = manager;
+ states->container = container;
+ states->instance = fragment;
+ fragment->managed = states;
+ if(fragment->cls->attached_cb) {
+ fragment->cls->attached_cb(fragment);
+ }
+ return states;
+}
+
+#endif /*LV_USE_FRAGMENT*/
diff --git a/src/extra/others/gridnav/lv_gridnav.c b/src/extra/others/gridnav/lv_gridnav.c
index 874e6a982..4eec637bd 100644
--- a/src/extra/others/gridnav/lv_gridnav.c
+++ b/src/extra/others/gridnav/lv_gridnav.c
@@ -81,6 +81,27 @@ void lv_gridnav_remove(lv_obj_t * obj)
lv_obj_remove_event_cb(obj, gridnav_event_cb);
}
+void lv_gridnav_set_focused(lv_obj_t * cont, lv_obj_t * to_focus, lv_anim_enable_t anim_en)
+{
+ LV_ASSERT_NULL(to_focus);
+ lv_gridnav_dsc_t * dsc = lv_obj_get_event_user_data(cont, gridnav_event_cb);
+ if(dsc == NULL) {
+ LV_LOG_WARN("`cont` is not a gridnav container");
+ return;
+ }
+
+ if(obj_is_focuable(to_focus) == false) {
+ LV_LOG_WARN("The object to focus is not focusable");
+ return;
+ }
+
+ lv_obj_clear_state(dsc->focused_obj, LV_STATE_FOCUSED | LV_STATE_FOCUS_KEY);
+ lv_obj_add_state(to_focus, LV_STATE_FOCUSED | LV_STATE_FOCUS_KEY);
+ lv_obj_scroll_to_view(to_focus, anim_en);
+ dsc->focused_obj = to_focus;
+
+}
+
/**********************
* STATIC FUNCTIONS
**********************/
@@ -98,7 +119,7 @@ static void gridnav_event_cb(lv_event_t * e)
if(dsc->focused_obj == NULL) dsc->focused_obj = find_first_focusable(obj);
if(dsc->focused_obj == NULL) return;
- uint32_t key = lv_indev_get_key(lv_indev_get_act());
+ uint32_t key = lv_event_get_key(e);
lv_obj_t * guess = NULL;
if(key == LV_KEY_RIGHT) {
@@ -327,7 +348,7 @@ static lv_obj_t * find_last_focusable(lv_obj_t * obj)
{
uint32_t child_cnt = lv_obj_get_child_cnt(obj);
int32_t i;
- for(i = child_cnt - 1; i >= 0; i++) {
+ for(i = child_cnt - 1; i >= 0; i--) {
lv_obj_t * child = lv_obj_get_child(obj, i);
if(obj_is_focuable(child)) return child;
}
diff --git a/src/extra/others/gridnav/lv_gridnav.h b/src/extra/others/gridnav/lv_gridnav.h
index ea81595de..f480ded46 100644
--- a/src/extra/others/gridnav/lv_gridnav.h
+++ b/src/extra/others/gridnav/lv_gridnav.h
@@ -103,6 +103,14 @@ void lv_gridnav_add(lv_obj_t * obj, lv_gridnav_ctrl_t ctrl);
*/
void lv_gridnav_remove(lv_obj_t * obj);
+/**
+ * Manually focus an object on gridnav container
+ * @param cont pointer to a gridnav container
+ * @param to_focus pointer to an object to focus
+ * @param anim_en LV_ANIM_ON/OFF
+ */
+void lv_gridnav_set_focused(lv_obj_t * cont, lv_obj_t * to_focus, lv_anim_enable_t anim_en);
+
/**********************
* MACROS
**********************/
diff --git a/src/extra/others/ime/lv_ime_pinyin.c b/src/extra/others/ime/lv_ime_pinyin.c
new file mode 100644
index 000000000..b1661e4f7
--- /dev/null
+++ b/src/extra/others/ime/lv_ime_pinyin.c
@@ -0,0 +1,1198 @@
+/**
+ * @file lv_ime_pinyin.c
+ *
+ */
+
+/*********************
+ * INCLUDES
+ *********************/
+#include "lv_ime_pinyin.h"
+#if LV_USE_IME_PINYIN != 0
+
+#include
+
+/*********************
+ * DEFINES
+ *********************/
+#define MY_CLASS &lv_ime_pinyin_class
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+static void lv_ime_pinyin_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj);
+static void lv_ime_pinyin_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj);
+static void lv_ime_pinyin_style_change_event(lv_event_t * e);
+static void lv_ime_pinyin_kb_event(lv_event_t * e);
+static void lv_ime_pinyin_cand_panel_event(lv_event_t * e);
+
+static void init_pinyin_dict(lv_obj_t * obj, lv_pinyin_dict_t * dict);
+static void pinyin_input_proc(lv_obj_t * obj);
+static void pinyin_page_proc(lv_obj_t * obj, uint16_t btn);
+static char * pinyin_search_matching(lv_obj_t * obj, char * py_str, uint16_t * cand_num);
+static void pinyin_ime_clear_data(lv_obj_t * obj);
+
+#if LV_IME_PINYIN_USE_K9_MODE
+ static void pinyin_k9_init_data(lv_obj_t * obj);
+ static void pinyin_k9_get_legal_py(lv_obj_t * obj, char * k9_input, const char * py9_map[]);
+ static bool pinyin_k9_is_valid_py(lv_obj_t * obj, char * py_str);
+ static void pinyin_k9_fill_cand(lv_obj_t * obj);
+ static void pinyin_k9_cand_page_proc(lv_obj_t * obj, uint16_t dir);
+#endif
+
+/**********************
+ * STATIC VARIABLES
+ **********************/
+const lv_obj_class_t lv_ime_pinyin_class = {
+ .constructor_cb = lv_ime_pinyin_constructor,
+ .destructor_cb = lv_ime_pinyin_destructor,
+ .width_def = LV_SIZE_CONTENT,
+ .height_def = LV_SIZE_CONTENT,
+ .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE,
+ .instance_size = sizeof(lv_ime_pinyin_t),
+ .base_class = &lv_obj_class
+};
+
+#if LV_IME_PINYIN_USE_K9_MODE
+static char * lv_btnm_def_pinyin_k9_map[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 20] = {\
+ ",\0", "1#\0", "abc \0", "def\0", LV_SYMBOL_BACKSPACE"\0", "\n\0",
+ ".\0", "ghi\0", "jkl\0", "mno\0", LV_SYMBOL_KEYBOARD"\0", "\n\0",
+ "?\0", "pqrs\0", "tuv\0", "wxyz\0", LV_SYMBOL_NEW_LINE"\0", "\n\0",
+ LV_SYMBOL_LEFT"\0", "\0"
+ };
+
+static lv_btnmatrix_ctrl_t default_kb_ctrl_k9_map[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 16] = { 1 };
+static char lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 2][LV_IME_PINYIN_K9_MAX_INPUT] = {0};
+#endif
+
+static char lv_pinyin_cand_str[LV_IME_PINYIN_CAND_TEXT_NUM][4];
+static char * lv_btnm_def_pinyin_sel_map[LV_IME_PINYIN_CAND_TEXT_NUM + 3];
+
+#if LV_IME_PINYIN_USE_DEFAULT_DICT
+lv_pinyin_dict_t lv_ime_pinyin_def_dict[] = {
+ { "a", "啊" },
+ { "ai", "愛" },
+ { "an", "安暗案" },
+ { "ba", "吧把爸八" },
+ { "bai", "百白敗" },
+ { "ban", "半般辦" },
+ { "bang", "旁" },
+ { "bao", "保薄包報" },
+ { "bei", "被背悲北杯備" },
+ { "ben", "本" },
+ { "bi", "必比避鼻彼筆秘閉" },
+ { "bian", "便邊變変辺" },
+ { "biao", "表標" },
+ { "bie", "別" },
+ { "bing", "病並氷" },
+ { "bo", "波薄泊" },
+ { "bu", "不布步部捕補歩" },
+ { "ca", "察" },
+ { "cai", "才材菜財採" },
+ { "can", "参残參" },
+ { "ce", "策側" },
+ { "ceng", "曾" },
+ { "cha", "差查茶" },
+ { "chai", "差" },
+ { "chan", "產産單" },
+ { "chang", "場廠" },
+ { "chao", "超朝" },
+ { "che", "車" },
+ { "cheng", "成程乗" },
+ { "chi", "尺吃持赤池遅歯" },
+ { "chong", "充种重種" },
+ { "chu", "出初楚触處処" },
+ { "chuan", "川船傳" },
+ { "chuang", "創窓" },
+ { "chun", "春" },
+ { "ci", "此次辞差" },
+ { "cong", "從従" },
+ { "cu", "卒" },
+ { "cun", "存村" },
+ { "cuo", "錯" },
+ { "da", "大打答達" },
+ { "dai", "代待帯帶貸" },
+ { "dan", "但担擔誕單単" },
+ { "dang", "当党當黨" },
+ { "dao", "到道盗導島辺" },
+ { "de", "的得" },
+ { "dei", "" },
+ { "deng", "等" },
+ { "di", "地得低底弟第締" },
+ { "dian", "点电店點電" },
+ { "diao", "調" },
+ { "ding", "定町" },
+ { "dong", "冬東動働凍" },
+ { "du", "独度都渡読" },
+ { "duan", "段断短斷" },
+ { "dui", "對対" },
+ { "duo", "多駄" },
+ { "e", "嗯悪" },
+ { "en", "嗯" },
+ { "er", "而耳二兒" },
+ { "fa", "乏法發発髪" },
+ { "fan", "反返犯番仮販飯範払" },
+ { "fang", "方放房坊訪" },
+ { "fei", "非飛費" },
+ { "fen", "分份" },
+ { "feng", "風豐" },
+ { "fou", "否不" },
+ { "fu", "父夫富服符付附府幅婦復複負払" },
+ { "gai", "改概該" },
+ { "gan", "甘感敢" },
+ { "gang", "港剛" },
+ { "gao", "告高" },
+ { "ge", "各格歌革割個" },
+ { "gei", "給" },
+ { "gen", "跟根" },
+ { "geng", "更" },
+ { "gong", "工共供功公" },
+ { "gou", "夠構溝" },
+ { "gu", "古故鼓" },
+ { "guai", "掛" },
+ { "guan", "官管慣館觀関關" },
+ { "guang", "光広" },
+ { "gui", "規帰" },
+ { "guo", "果国裏菓國過" },
+ { "hai", "孩海害還" },
+ { "han", "寒漢" },
+ { "hang", "航行" },
+ { "hao", "好号" },
+ { "he", "合和喝何荷" },
+ { "hei", "黒" },
+ { "hen", "很" },
+ { "heng", "行横" },
+ { "hou", "厚喉候後" },
+ { "hu", "乎呼湖護" },
+ { "hua", "化画花話畫劃" },
+ { "huai", "壊劃" },
+ { "huan", "緩環歡還換" },
+ { "huang", "黄" },
+ { "hui", "回会慧絵揮會" },
+ { "hun", "混婚" },
+ { "huo", "活或火獲" },
+ { "i", "" },
+ { "ji", "己计及机既急季寄技即集基祭系奇紀積計記済幾際極繼績機濟" },
+ { "jia", "家加價" },
+ { "jian", "件建健肩見減間検簡漸" },
+ { "jiang", "降強講將港" },
+ { "jiao", "叫教交角覚覺較學" },
+ { "jie", "介借接姐皆届界解結階節價" },
+ { "jin", "今近禁金僅進" },
+ { "jing", "京境景静精經経" },
+ { "jiu", "就久九酒究" },
+ { "ju", "句具局居決挙據舉" },
+ { "jue", "角覚覺" },
+ { "jun", "均" },
+ { "kai", "開" },
+ { "kan", "看刊" },
+ { "kang", "康" },
+ { "kao", "考" },
+ { "ke", "可刻科克客渇課" },
+ { "ken", "肯" },
+ { "kong", "空控" },
+ { "kou", "口" },
+ { "ku", "苦庫" },
+ { "kuai", "快塊会會" },
+ { "kuang", "況" },
+ { "kun", "困" },
+ { "kuo", "括拡適" },
+ { "la", "拉啦落" },
+ { "lai", "来來頼" },
+ { "lao", "老絡落" },
+ { "le", "了楽樂" },
+ { "lei", "類" },
+ { "leng", "冷" },
+ { "li", "力立利理例礼離麗裡勵歷" },
+ { "lian", "連練臉聯" },
+ { "liang", "良量涼兩両" },
+ { "liao", "料" },
+ { "lie", "列" },
+ { "lin", "林隣賃" },
+ { "ling", "另令領" },
+ { "liu", "六留流" },
+ { "lu", "律路録緑陸履慮" },
+ { "lv", "旅" },
+ { "lun", "輪論" },
+ { "luo", "落絡" },
+ { "ma", "媽嗎嘛" },
+ { "mai", "買売" },
+ { "man", "滿" },
+ { "mang", "忙" },
+ { "mao", "毛猫貿" },
+ { "me", "麼" },
+ { "mei", "美妹每沒毎媒" },
+ { "men", "們" },
+ { "mi", "米密秘" },
+ { "mian", "免面勉眠" },
+ { "miao", "描" },
+ { "min", "民皿" },
+ { "ming", "命明名" },
+ { "mo", "末模麼" },
+ { "mou", "某" },
+ { "mu", "母木目模" },
+ { "na", "那哪拿內南" },
+ { "nan", "男南難" },
+ { "nao", "腦" },
+ { "ne", "那哪呢" },
+ { "nei", "内那哪內" },
+ { "neng", "能" },
+ { "ni", "你妳呢" },
+ { "nian", "年念" },
+ { "niang", "娘" },
+ { "nin", "您" },
+ { "ning", "凝" },
+ { "niu", "牛" },
+ { "nong", "農濃" },
+ { "nu", "女努" },
+ { "nuan", "暖" },
+ { "o", "" },
+ { "ou", "歐" },
+ { "pa", "怕" },
+ { "pian", "片便" },
+ { "pai", "迫派排" },
+ { "pan", "判番" },
+ { "pang", "旁" },
+ { "pei", "配" },
+ { "peng", "朋" },
+ { "pi", "疲否" },
+ { "pin", "品貧" },
+ { "ping", "平評" },
+ { "po", "迫破泊頗" },
+ { "pu", "普僕" },
+ { "qi", "起其奇七气期泣企妻契気" },
+ { "qian", "嵌浅千前鉛錢針" },
+ { "qiang", "強將" },
+ { "qiao", "橋繰" },
+ { "qie", "且切契" },
+ { "qin", "寝勤親" },
+ { "qing", "青清情晴輕頃請軽" },
+ { "qiu", "求秋球" },
+ { "qu", "去取趣曲區" },
+ { "quan", "全犬券" },
+ { "que", "缺確卻" },
+ { "ran", "然" },
+ { "rang", "讓" },
+ { "re", "熱" },
+ { "ren", "人任認" },
+ { "reng", "仍" },
+ { "ri", "日" },
+ { "rong", "容" },
+ { "rou", "弱若肉" },
+ { "ru", "如入" },
+ { "ruan", "軟" },
+ { "sai", "賽" },
+ { "san", "三" },
+ { "sao", "騒繰" },
+ { "se", "色" },
+ { "sen", "森" },
+ { "sha", "砂" },
+ { "shan", "善山單" },
+ { "shang", "上尚商" },
+ { "shao", "少紹" },
+ { "shaung", "雙" },
+ { "she", "社射設捨渉" },
+ { "shei", "誰" },
+ { "shen", "什申深甚身伸沈神" },
+ { "sheng", "生声昇勝乗聲" },
+ { "shi", "是失示食时事式十石施使世实史室市始柿氏士仕拭時視師試適実實識" },
+ { "shou", "手首守受授" },
+ { "shu", "束数暑殊樹書屬輸術" },
+ { "shui", "水説說誰" },
+ { "shuo", "数説說" },
+ { "si", "思寺司四私似死価" },
+ { "song", "送" },
+ { "su", "速宿素蘇訴" },
+ { "suan", "算酸" },
+ { "sui", "隨雖歲歳" },
+ { "sun", "孫" },
+ { "suo", "所" },
+ { "ta", "她他它牠" },
+ { "tai", "太台態臺" },
+ { "tan", "探談曇" },
+ { "tang", "糖" },
+ { "tao", "桃逃套討" },
+ { "te", "特" },
+ { "ti", "体提替題體戻" },
+ { "tian", "天田" },
+ { "tiao", "条條調" },
+ { "tie", "鉄" },
+ { "ting", "停庭聽町" },
+ { "tong", "同童通痛统統" },
+ { "tou", "投透頭" },
+ { "tu", "土徒茶図" },
+ { "tuan", "團" },
+ { "tui", "推退" },
+ { "tuo", "脱駄" },
+ { "u", "" },
+ { "v", "" },
+ { "wai", "外" },
+ { "wan", "完万玩晩腕灣" },
+ { "wang", "忘望亡往網" },
+ { "wei", "危位未味委為謂維違圍" },
+ { "wen", "文温問聞" },
+ { "wo", "我" },
+ { "wu", "午物五無屋亡鳥務汚" },
+ { "xi", "夕息西洗喜系昔席希析嬉膝細習係" },
+ { "xia", "下夏狭暇" },
+ { "xian", "先限嫌洗現見線顯" },
+ { "xiang", "向相香像想象降項詳響" },
+ { "xiao", "小笑消效校削咲" },
+ { "xie", "写携些解邪械協謝寫契" },
+ { "xin", "心信新辛" },
+ { "xing", "行形性幸型星興" },
+ { "xiong", "兄胸" },
+ { "xiu", "休秀修" },
+ { "xu", "須需許續緒続" },
+ { "xuan", "選懸" },
+ { "xue", "学雪削靴學" },
+ { "xun", "訓訊" },
+ { "ya", "呀押壓" },
+ { "yan", "言顔研煙嚴厳験驗塩" },
+ { "yang", "央洋陽樣様" },
+ { "yao", "要揺腰薬曜" },
+ { "ye", "也野夜邪業葉" },
+ { "yi", "一已亦依以移意医易伊役異億義議藝醫訳" },
+ { "yin", "因引音飲銀" },
+ { "ying", "英迎影映應營営" },
+ { "yong", "永用泳擁" },
+ { "you", "又有右友由尤油遊郵誘優" },
+ { "yu", "予育余雨浴欲愈御宇域語於魚與込" },
+ { "yuan", "元原源院員円園遠猿願" },
+ { "yue", "月越約楽" },
+ { "yun", "雲伝運" },
+ { "za", "雑" },
+ { "zai", "在再載災" },
+ { "zang", "蔵" },
+ { "zao", "早造" },
+ { "ze", "則擇責" },
+ { "zen", "怎" },
+ { "zeng", "曾增増" },
+ { "zha", "札" },
+ { "zhai", "宅擇" },
+ { "zhan", "站展戰戦" },
+ { "zhang", "丈長障帳張" },
+ { "zhao", "找着朝招" },
+ { "zhe", "者這" },
+ { "zhen", "真震針" },
+ { "zheng", "正整争政爭" },
+ { "zhi", "之只知支止制至治直指值置智値紙製質誌織隻識職執" },
+ { "zhong", "中种終重種眾" },
+ { "zhou", "周州昼宙洲週" },
+ { "zhu", "助主住柱株祝逐注著諸屬術" },
+ { "zhuan", "专專転" },
+ { "zhuang", "状狀" },
+ { "zhui", "追" },
+ { "zhun", "準" },
+ { "zhuo", "着" },
+ { "zi", "子自字姉資" },
+ { "zong", "總" },
+ { "zuo", "左做昨坐座作" },
+ { "zu", "足祖族卒組" },
+ { "zui", "最酔" },
+ { "zou", "走" },
+ {NULL, NULL}
+};
+#endif
+
+
+/**********************
+ * MACROS
+ **********************/
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+lv_obj_t * lv_ime_pinyin_create(lv_obj_t * parent)
+{
+ LV_LOG_INFO("begin");
+ lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent);
+ lv_obj_class_init_obj(obj);
+ return obj;
+}
+
+
+/*=====================
+ * Setter functions
+ *====================*/
+
+/**
+ * Set the keyboard of Pinyin input method.
+ * @param obj pointer to a Pinyin input method object
+ * @param dict pointer to a Pinyin input method keyboard
+ */
+void lv_ime_pinyin_set_keyboard(lv_obj_t * obj, lv_obj_t * kb)
+{
+ if(kb) {
+ LV_ASSERT_OBJ(kb, &lv_keyboard_class);
+ }
+
+ LV_ASSERT_OBJ(obj, MY_CLASS);
+ lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
+
+ pinyin_ime->kb = kb;
+ lv_obj_add_event_cb(pinyin_ime->kb, lv_ime_pinyin_kb_event, LV_EVENT_VALUE_CHANGED, obj);
+ lv_obj_align_to(pinyin_ime->cand_panel, pinyin_ime->kb, LV_ALIGN_OUT_TOP_MID, 0, 0);
+}
+
+/**
+ * Set the dictionary of Pinyin input method.
+ * @param obj pointer to a Pinyin input method object
+ * @param dict pointer to a Pinyin input method dictionary
+ */
+void lv_ime_pinyin_set_dict(lv_obj_t * obj, lv_pinyin_dict_t * dict)
+{
+ LV_ASSERT_OBJ(obj, MY_CLASS);
+
+ init_pinyin_dict(obj, dict);
+}
+
+/**
+ * Set mode, 26-key input(k26) or 9-key input(k9).
+ * @param obj pointer to a Pinyin input method object
+ * @param mode the mode from 'lv_keyboard_mode_t'
+ */
+void lv_ime_pinyin_set_mode(lv_obj_t * obj, lv_ime_pinyin_mode_t mode)
+{
+ LV_ASSERT_OBJ(obj, MY_CLASS);
+ lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
+
+ LV_ASSERT_OBJ(pinyin_ime->kb, &lv_keyboard_class);
+
+ pinyin_ime->mode = mode;
+
+#if LV_IME_PINYIN_USE_K9_MODE
+ if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K9) {
+ pinyin_k9_init_data(obj);
+ lv_keyboard_set_map(pinyin_ime->kb, LV_KEYBOARD_MODE_USER_1, (const char *)lv_btnm_def_pinyin_k9_map,
+ (const)default_kb_ctrl_k9_map);
+ lv_keyboard_set_mode(pinyin_ime->kb, LV_KEYBOARD_MODE_USER_1);
+ }
+#endif
+}
+
+/*=====================
+ * Getter functions
+ *====================*/
+
+/**
+ * Set the dictionary of Pinyin input method.
+ * @param obj pointer to a Pinyin IME object
+ * @return pointer to the Pinyin IME keyboard
+ */
+lv_obj_t * lv_ime_pinyin_get_kb(lv_obj_t * obj)
+{
+ LV_ASSERT_OBJ(obj, MY_CLASS);
+
+ lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
+
+ return pinyin_ime->kb;
+}
+
+/**
+ * Set the dictionary of Pinyin input method.
+ * @param obj pointer to a Pinyin input method object
+ * @return pointer to the Pinyin input method candidate panel
+ */
+lv_obj_t * lv_ime_pinyin_get_cand_panel(lv_obj_t * obj)
+{
+ LV_ASSERT_OBJ(obj, MY_CLASS);
+
+ lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
+
+ return pinyin_ime->cand_panel;
+}
+
+/**
+ * Set the dictionary of Pinyin input method.
+ * @param obj pointer to a Pinyin input method object
+ * @return pointer to the Pinyin input method dictionary
+ */
+lv_pinyin_dict_t * lv_ime_pinyin_get_dict(lv_obj_t * obj)
+{
+ LV_ASSERT_OBJ(obj, MY_CLASS);
+
+ lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
+
+ return pinyin_ime->dict;
+}
+
+/*=====================
+ * Other functions
+ *====================*/
+
+/**********************
+ * STATIC FUNCTIONS
+ **********************/
+
+static void lv_ime_pinyin_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj)
+{
+ LV_UNUSED(class_p);
+ LV_TRACE_OBJ_CREATE("begin");
+
+ lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
+
+ uint16_t py_str_i = 0;
+ uint16_t btnm_i = 0;
+ for(btnm_i = 0; btnm_i < (LV_IME_PINYIN_CAND_TEXT_NUM + 3); btnm_i++) {
+ if(btnm_i == 0) {
+ lv_btnm_def_pinyin_sel_map[btnm_i] = "<";
+ }
+ else if(btnm_i == (LV_IME_PINYIN_CAND_TEXT_NUM + 1)) {
+ lv_btnm_def_pinyin_sel_map[btnm_i] = ">";
+ }
+ else if(btnm_i == (LV_IME_PINYIN_CAND_TEXT_NUM + 2)) {
+ lv_btnm_def_pinyin_sel_map[btnm_i] = "";
+ }
+ else {
+ lv_pinyin_cand_str[py_str_i][0] = ' ';
+ lv_btnm_def_pinyin_sel_map[btnm_i] = lv_pinyin_cand_str[py_str_i];
+ py_str_i++;
+ }
+ }
+
+ pinyin_ime->mode = LV_IME_PINYIN_MODE_K26;
+ pinyin_ime->py_page = 0;
+ pinyin_ime->ta_count = 0;
+ pinyin_ime->cand_num = 0;
+ lv_memset_00(pinyin_ime->input_char, sizeof(pinyin_ime->input_char));
+ lv_memset_00(pinyin_ime->py_num, sizeof(pinyin_ime->py_num));
+ lv_memset_00(pinyin_ime->py_pos, sizeof(pinyin_ime->py_pos));
+
+ lv_obj_set_size(obj, LV_PCT(100), LV_PCT(55));
+ lv_obj_align(obj, LV_ALIGN_BOTTOM_MID, 0, 0);
+
+#if LV_IME_PINYIN_USE_DEFAULT_DICT
+ init_pinyin_dict(obj, lv_ime_pinyin_def_dict);
+#endif
+
+ /* Init pinyin_ime->cand_panel */
+ pinyin_ime->cand_panel = lv_btnmatrix_create(lv_scr_act());
+ lv_btnmatrix_set_map(pinyin_ime->cand_panel, (const char **)lv_btnm_def_pinyin_sel_map);
+ lv_obj_set_size(pinyin_ime->cand_panel, LV_PCT(100), LV_PCT(5));
+ lv_obj_add_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_HIDDEN);
+
+ lv_btnmatrix_set_one_checked(pinyin_ime->cand_panel, true);
+
+ /* Set cand_panel style*/
+ // Default style
+ lv_obj_set_style_bg_opa(pinyin_ime->cand_panel, LV_OPA_0, 0);
+ lv_obj_set_style_border_width(pinyin_ime->cand_panel, 0, 0);
+ lv_obj_set_style_pad_all(pinyin_ime->cand_panel, 8, 0);
+ lv_obj_set_style_pad_gap(pinyin_ime->cand_panel, 0, 0);
+ lv_obj_set_style_radius(pinyin_ime->cand_panel, 0, 0);
+ lv_obj_set_style_pad_gap(pinyin_ime->cand_panel, 0, 0);
+ lv_obj_set_style_base_dir(pinyin_ime->cand_panel, LV_BASE_DIR_LTR, 0);
+
+ // LV_PART_ITEMS style
+ lv_obj_set_style_radius(pinyin_ime->cand_panel, 12, LV_PART_ITEMS);
+ lv_obj_set_style_bg_color(pinyin_ime->cand_panel, lv_color_white(), LV_PART_ITEMS);
+ lv_obj_set_style_bg_opa(pinyin_ime->cand_panel, LV_OPA_0, LV_PART_ITEMS);
+ lv_obj_set_style_shadow_opa(pinyin_ime->cand_panel, LV_OPA_0, LV_PART_ITEMS);
+
+ // LV_PART_ITEMS | LV_STATE_PRESSED style
+ lv_obj_set_style_bg_opa(pinyin_ime->cand_panel, LV_OPA_COVER, LV_PART_ITEMS | LV_STATE_PRESSED);
+ lv_obj_set_style_bg_color(pinyin_ime->cand_panel, lv_color_white(), LV_PART_ITEMS | LV_STATE_PRESSED);
+
+ /* event handler */
+ lv_obj_add_event_cb(pinyin_ime->cand_panel, lv_ime_pinyin_cand_panel_event, LV_EVENT_VALUE_CHANGED, obj);
+ lv_obj_add_event_cb(obj, lv_ime_pinyin_style_change_event, LV_EVENT_STYLE_CHANGED, NULL);
+
+#if LV_IME_PINYIN_USE_K9_MODE
+ pinyin_ime->k9_input_str_len = 0;
+ pinyin_ime->k9_py_ll_pos = 0;
+ pinyin_ime->k9_legal_py_count = 0;
+ lv_memset_00(pinyin_ime->k9_input_str, LV_IME_PINYIN_K9_MAX_INPUT);
+
+ pinyin_k9_init_data(obj);
+
+ _lv_ll_init(&(pinyin_ime->k9_legal_py_ll), sizeof(ime_pinyin_k9_py_str_t));
+#endif
+}
+
+
+static void lv_ime_pinyin_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj)
+{
+ LV_UNUSED(class_p);
+
+ lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
+
+ if(lv_obj_is_valid(pinyin_ime->kb))
+ lv_obj_del(pinyin_ime->kb);
+
+ if(lv_obj_is_valid(pinyin_ime->cand_panel))
+ lv_obj_del(pinyin_ime->cand_panel);
+}
+
+
+static void lv_ime_pinyin_kb_event(lv_event_t * e)
+{
+ lv_event_code_t code = lv_event_get_code(e);
+ lv_obj_t * kb = lv_event_get_target(e);
+ lv_obj_t * obj = lv_event_get_user_data(e);
+
+ lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
+
+#if LV_IME_PINYIN_USE_K9_MODE
+ static const char * k9_py_map[8] = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
+#endif
+
+ if(code == LV_EVENT_VALUE_CHANGED) {
+ uint16_t btn_id = lv_btnmatrix_get_selected_btn(kb);
+ if(btn_id == LV_BTNMATRIX_BTN_NONE) return;
+
+ const char * txt = lv_btnmatrix_get_btn_text(kb, lv_btnmatrix_get_selected_btn(kb));
+ if(txt == NULL) return;
+
+#if LV_IME_PINYIN_USE_K9_MODE
+ if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K9) {
+ lv_obj_t * ta = lv_keyboard_get_textarea(pinyin_ime->kb);
+ uint16_t tmp_btn_str_len = strlen(pinyin_ime->input_char);
+ if((btn_id >= 16) && (tmp_btn_str_len > 0) && (btn_id < (16 + LV_IME_PINYIN_K9_CAND_TEXT_NUM))) {
+ tmp_btn_str_len = strlen(pinyin_ime->input_char);
+ lv_memset_00(pinyin_ime->input_char, sizeof(pinyin_ime->input_char));
+ strcat(pinyin_ime->input_char, txt);
+ pinyin_input_proc(obj);
+
+ for(int index = 0; index < (pinyin_ime->ta_count + tmp_btn_str_len); index++) {
+ lv_textarea_del_char(ta);
+ }
+
+ pinyin_ime->ta_count = tmp_btn_str_len;
+ pinyin_ime->k9_input_str_len = tmp_btn_str_len;
+ lv_textarea_add_text(ta, pinyin_ime->input_char);
+
+ return;
+ }
+ }
+#endif
+
+ if(strcmp(txt, "Enter") == 0 || strcmp(txt, LV_SYMBOL_NEW_LINE) == 0) {
+ pinyin_ime_clear_data(obj);
+ lv_obj_add_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_HIDDEN);
+ }
+ else if(strcmp(txt, LV_SYMBOL_BACKSPACE) == 0) {
+ // del input char
+ if(pinyin_ime->ta_count > 0) {
+ if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K26)
+ pinyin_ime->input_char[pinyin_ime->ta_count - 1] = '\0';
+#if LV_IME_PINYIN_USE_K9_MODE
+ else
+ pinyin_ime->k9_input_str[pinyin_ime->ta_count - 1] = '\0';
+#endif
+
+ pinyin_ime->ta_count = pinyin_ime->ta_count - 1;
+ if(pinyin_ime->ta_count <= 0) {
+ lv_obj_add_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_HIDDEN);
+#if LV_IME_PINYIN_USE_K9_MODE
+ lv_memset_00(lv_pinyin_k9_cand_str, sizeof(lv_pinyin_k9_cand_str));
+ strcpy(lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM], LV_SYMBOL_RIGHT"\0");
+ strcpy(lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 1], "\0");
+#endif
+ }
+ else if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K26) {
+ pinyin_input_proc(obj);
+ }
+#if LV_IME_PINYIN_USE_K9_MODE
+ else if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K9) {
+ pinyin_ime->k9_input_str_len = strlen(pinyin_ime->input_char) - 1;
+ pinyin_k9_get_legal_py(obj, pinyin_ime->k9_input_str, k9_py_map);
+ pinyin_k9_fill_cand(obj);
+ pinyin_input_proc(obj);
+ }
+#endif
+ }
+ }
+ else if((strcmp(txt, "ABC") == 0) || (strcmp(txt, "abc") == 0) || (strcmp(txt, "1#") == 0)) {
+ pinyin_ime->ta_count = 0;
+ lv_memset_00(pinyin_ime->input_char, sizeof(pinyin_ime->input_char));
+ return;
+ }
+ else if(strcmp(txt, LV_SYMBOL_KEYBOARD) == 0) {
+ if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K26) {
+ lv_ime_pinyin_set_mode(pinyin_ime, LV_IME_PINYIN_MODE_K9);
+ }
+ else {
+ lv_ime_pinyin_set_mode(pinyin_ime, LV_IME_PINYIN_MODE_K26);
+ lv_keyboard_set_mode(pinyin_ime->kb, LV_KEYBOARD_MODE_TEXT_LOWER);
+ }
+ pinyin_ime_clear_data(obj);
+ }
+ else if(strcmp(txt, LV_SYMBOL_OK) == 0) {
+ pinyin_ime_clear_data(obj);
+ }
+ else if((pinyin_ime->mode == LV_IME_PINYIN_MODE_K26) && ((txt[0] >= 'a' && txt[0] <= 'z') || (txt[0] >= 'A' &&
+ txt[0] <= 'Z'))) {
+ strcat(pinyin_ime->input_char, txt);
+ pinyin_input_proc(obj);
+ pinyin_ime->ta_count++;
+ }
+#if LV_IME_PINYIN_USE_K9_MODE
+ else if((pinyin_ime->mode == LV_IME_PINYIN_MODE_K9) && (txt[0] >= 'a' && txt[0] <= 'z')) {
+ for(uint16_t i = 0; i < 8; i++) {
+ if((strcmp(txt, k9_py_map[i]) == 0) || (strcmp(txt, "abc ") == 0)) {
+ if(strcmp(txt, "abc ") == 0) pinyin_ime->k9_input_str_len += strlen(k9_py_map[i]) + 1;
+ else pinyin_ime->k9_input_str_len += strlen(k9_py_map[i]);
+ pinyin_ime->k9_input_str[pinyin_ime->ta_count] = 50 + i;
+
+ break;
+ }
+ }
+ pinyin_k9_get_legal_py(obj, pinyin_ime->k9_input_str, k9_py_map);
+ pinyin_k9_fill_cand(obj);
+ pinyin_input_proc(obj);
+ }
+ else if(strcmp(txt, LV_SYMBOL_LEFT) == 0) {
+ pinyin_k9_cand_page_proc(obj, 0);
+ }
+ else if(strcmp(txt, LV_SYMBOL_RIGHT) == 0) {
+ pinyin_k9_cand_page_proc(obj, 1);
+ }
+#endif
+ }
+}
+
+
+static void lv_ime_pinyin_cand_panel_event(lv_event_t * e)
+{
+ lv_event_code_t code = lv_event_get_code(e);
+ lv_obj_t * cand_panel = lv_event_get_target(e);
+ lv_obj_t * obj = (lv_obj_t *)lv_event_get_user_data(e);
+
+ lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
+
+ if(code == LV_EVENT_VALUE_CHANGED) {
+ uint32_t id = lv_btnmatrix_get_selected_btn(cand_panel);
+ if(id == 0) {
+ pinyin_page_proc(obj, 0);
+ return;
+ }
+ if(id == (LV_IME_PINYIN_CAND_TEXT_NUM + 1)) {
+ pinyin_page_proc(obj, 1);
+ return;
+ }
+
+ const char * txt = lv_btnmatrix_get_btn_text(cand_panel, id);
+ lv_obj_t * ta = lv_keyboard_get_textarea(pinyin_ime->kb);
+ uint16_t index = 0;
+ for(index = 0; index < pinyin_ime->ta_count; index++)
+ lv_textarea_del_char(ta);
+
+ lv_textarea_add_text(ta, txt);
+
+ pinyin_ime_clear_data(obj);
+ }
+}
+
+
+static void pinyin_input_proc(lv_obj_t * obj)
+{
+ lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
+
+ pinyin_ime->cand_str = pinyin_search_matching(obj, pinyin_ime->input_char, &pinyin_ime->cand_num);
+ if(pinyin_ime->cand_str == NULL) {
+ return;
+ }
+
+ pinyin_ime->py_page = 0;
+
+ for(uint8_t i = 0; i < LV_IME_PINYIN_CAND_TEXT_NUM; i++) {
+ memset(lv_pinyin_cand_str[i], 0x00, sizeof(lv_pinyin_cand_str[i]));
+ lv_pinyin_cand_str[i][0] = ' ';
+ }
+
+ // fill buf
+ for(uint8_t i = 0; (i < pinyin_ime->cand_num && i < LV_IME_PINYIN_CAND_TEXT_NUM); i++) {
+ for(uint8_t j = 0; j < 3; j++) {
+ lv_pinyin_cand_str[i][j] = pinyin_ime->cand_str[i * 3 + j];
+ }
+ }
+
+ lv_obj_clear_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_HIDDEN);
+}
+
+static void pinyin_page_proc(lv_obj_t * obj, uint16_t dir)
+{
+ lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
+ uint16_t page_num = pinyin_ime->cand_num / LV_IME_PINYIN_CAND_TEXT_NUM;
+ uint16_t sur = pinyin_ime->cand_num % LV_IME_PINYIN_CAND_TEXT_NUM;
+
+ if(dir == 0) {
+ if(pinyin_ime->py_page) {
+ pinyin_ime->py_page--;
+ }
+ }
+ else {
+ if(sur == 0) {
+ page_num -= 1;
+ }
+ if(pinyin_ime->py_page < page_num) {
+ pinyin_ime->py_page++;
+ }
+ else return;
+ }
+
+ for(uint8_t i = 0; i < LV_IME_PINYIN_CAND_TEXT_NUM; i++) {
+ memset(lv_pinyin_cand_str[i], 0x00, sizeof(lv_pinyin_cand_str[i]));
+ lv_pinyin_cand_str[i][0] = ' ';
+ }
+
+ // fill buf
+ uint16_t offset = pinyin_ime->py_page * (3 * LV_IME_PINYIN_CAND_TEXT_NUM);
+ for(uint8_t i = 0; (i < pinyin_ime->cand_num && i < LV_IME_PINYIN_CAND_TEXT_NUM); i++) {
+ if((sur > 0) && (pinyin_ime->py_page == page_num)) {
+ if(i > sur)
+ break;
+ }
+ for(uint8_t j = 0; j < 3; j++) {
+ lv_pinyin_cand_str[i][j] = pinyin_ime->cand_str[offset + (i * 3) + j];
+ }
+ }
+}
+
+
+static void lv_ime_pinyin_style_change_event(lv_event_t * e)
+{
+ lv_event_code_t code = lv_event_get_code(e);
+ lv_obj_t * obj = lv_event_get_target(e);
+
+ lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
+
+ if(code == LV_EVENT_STYLE_CHANGED) {
+ const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN);
+ lv_obj_set_style_text_font(pinyin_ime->cand_panel, font, 0);
+ }
+}
+
+
+static void init_pinyin_dict(lv_obj_t * obj, lv_pinyin_dict_t * dict)
+{
+ lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
+
+ char headletter = 'a';
+ uint16_t offset_sum = 0;
+ uint16_t offset_count = 0;
+ uint16_t letter_calc = 0;
+
+ pinyin_ime->dict = dict;
+
+ for(uint16_t i = 0; ; i++) {
+ if((NULL == (dict[i].py)) || (NULL == (dict[i].py_mb))) {
+ headletter = dict[i - 1].py[0];
+ letter_calc = headletter - 'a';
+ pinyin_ime->py_num[letter_calc] = offset_count;
+ break;
+ }
+
+ if(headletter == (dict[i].py[0])) {
+ offset_count++;
+ }
+ else {
+ headletter = dict[i].py[0];
+ letter_calc = headletter - 'a';
+ pinyin_ime->py_num[letter_calc - 1] = offset_count;
+ offset_sum += offset_count;
+ pinyin_ime->py_pos[letter_calc] = offset_sum;
+
+ offset_count = 1;
+ }
+ }
+}
+
+
+static char * pinyin_search_matching(lv_obj_t * obj, char * py_str, uint16_t * cand_num)
+{
+ lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
+
+ lv_pinyin_dict_t * cpHZ;
+ uint8_t index, len = 0, offset;
+ volatile uint8_t count = 0;
+
+ if(*py_str == '\0') return NULL;
+ if(*py_str == 'i') return NULL;
+ if(*py_str == 'u') return NULL;
+ if(*py_str == 'v') return NULL;
+
+ offset = py_str[0] - 'a';
+ len = strlen(py_str);
+
+ cpHZ = &pinyin_ime->dict[pinyin_ime->py_pos[offset]];
+ count = pinyin_ime->py_num[offset];
+
+ while(count--) {
+ for(index = 0; index < len; index++) {
+ if(*(py_str + index) != *((cpHZ->py) + index)) {
+ break;
+ }
+ }
+
+ // perfect match
+ if(len == 1 || index == len) {
+ // The Chinese character in UTF-8 encoding format is 3 bytes
+ * cand_num = strlen((const char *)(cpHZ->py_mb)) / 3;
+ return (char *)(cpHZ->py_mb);
+ }
+ cpHZ++;
+ }
+ return NULL;
+}
+
+static void pinyin_ime_clear_data(lv_obj_t * obj)
+{
+ lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
+
+
+#if LV_IME_PINYIN_USE_K9_MODE
+ if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K9) {
+ pinyin_ime->k9_input_str_len = 0;
+ pinyin_ime->k9_py_ll_pos = 0;
+ pinyin_ime->k9_legal_py_count = 0;
+ lv_memset_00(pinyin_ime->k9_input_str, LV_IME_PINYIN_K9_MAX_INPUT);
+ lv_memset_00(lv_pinyin_k9_cand_str, sizeof(lv_pinyin_k9_cand_str));
+ strcpy(lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM], LV_SYMBOL_RIGHT"\0");
+ strcpy(lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 1], "\0");
+ }
+#endif
+
+ pinyin_ime->ta_count = 0;
+ lv_memset_00(lv_pinyin_cand_str, (sizeof(lv_pinyin_cand_str)));
+ lv_memset_00(pinyin_ime->input_char, sizeof(pinyin_ime->input_char));
+
+ lv_obj_add_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_HIDDEN);
+}
+
+
+#if LV_IME_PINYIN_USE_K9_MODE
+static void pinyin_k9_init_data(lv_obj_t * obj)
+{
+ lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
+
+ uint16_t py_str_i = 0;
+ uint16_t btnm_i = 0;
+ for(btnm_i = 19; btnm_i < (LV_IME_PINYIN_K9_CAND_TEXT_NUM + 21); btnm_i++) {
+ if(py_str_i == LV_IME_PINYIN_K9_CAND_TEXT_NUM) {
+ strcpy(lv_pinyin_k9_cand_str[py_str_i], LV_SYMBOL_RIGHT"\0");
+ }
+ else if(py_str_i == LV_IME_PINYIN_K9_CAND_TEXT_NUM + 1) {
+ strcpy(lv_pinyin_k9_cand_str[py_str_i], "\0");
+ }
+ else {
+ strcpy(lv_pinyin_k9_cand_str[py_str_i], " \0");
+ }
+
+ lv_btnm_def_pinyin_k9_map[btnm_i] = lv_pinyin_k9_cand_str[py_str_i];
+ py_str_i++;
+ }
+
+ default_kb_ctrl_k9_map[0] = LV_KEYBOARD_CTRL_BTN_FLAGS | 1;
+ default_kb_ctrl_k9_map[4] = LV_KEYBOARD_CTRL_BTN_FLAGS | 1;
+ default_kb_ctrl_k9_map[5] = LV_KEYBOARD_CTRL_BTN_FLAGS | 1;
+ default_kb_ctrl_k9_map[9] = LV_KEYBOARD_CTRL_BTN_FLAGS | 1;
+ default_kb_ctrl_k9_map[10] = LV_KEYBOARD_CTRL_BTN_FLAGS | 1;
+ default_kb_ctrl_k9_map[14] = LV_KEYBOARD_CTRL_BTN_FLAGS | 1;
+ default_kb_ctrl_k9_map[15] = LV_KEYBOARD_CTRL_BTN_FLAGS | 1;
+ default_kb_ctrl_k9_map[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 16] = LV_KEYBOARD_CTRL_BTN_FLAGS | 1;
+}
+
+static void pinyin_k9_get_legal_py(lv_obj_t * obj, char * k9_input, const char * py9_map[])
+{
+ lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
+
+ uint16_t len = strlen(k9_input);
+
+ if((len == 0) || (len >= LV_IME_PINYIN_K9_MAX_INPUT)) {
+ return;
+ }
+
+ char py_comp[LV_IME_PINYIN_K9_MAX_INPUT] = {0};
+ int mark[LV_IME_PINYIN_K9_MAX_INPUT] = {0};
+ int index = 0;
+ int flag = 0;
+ int count = 0;
+
+ uint32_t ll_len = 0;
+ ime_pinyin_k9_py_str_t * ll_index = NULL;
+
+ ll_len = _lv_ll_get_len(&pinyin_ime->k9_legal_py_ll);
+ ll_index = _lv_ll_get_head(&pinyin_ime->k9_legal_py_ll);
+
+ while(index != -1) {
+ if(index == len) {
+ if(pinyin_k9_is_valid_py(obj, py_comp)) {
+ if((count >= ll_len) || (ll_len == 0)) {
+ ll_index = _lv_ll_ins_tail(&pinyin_ime->k9_legal_py_ll);
+ strcpy(ll_index->py_str, py_comp);
+ }
+ else if((count < ll_len)) {
+ strcpy(ll_index->py_str, py_comp);
+ ll_index = _lv_ll_get_next(&pinyin_ime->k9_legal_py_ll, ll_index);
+ }
+ count++;
+ }
+ index--;
+ }
+ else {
+ flag = mark[index];
+ if(flag < strlen(py9_map[k9_input[index] - '2'])) {
+ py_comp[index] = py9_map[k9_input[index] - '2'][flag];
+ mark[index] = mark[index] + 1;
+ index++;
+ }
+ else {
+ mark[index] = 0;
+ index--;
+ }
+ }
+ }
+
+ if(count > 0) {
+ pinyin_ime->ta_count++;
+ pinyin_ime->k9_legal_py_count = count;
+ }
+}
+
+
+/*true: visible; false: not visible*/
+static bool pinyin_k9_is_valid_py(lv_obj_t * obj, char * py_str)
+{
+ lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
+
+ lv_pinyin_dict_t * cpHZ = NULL;
+ uint8_t index = 0, len = 0, offset = 0;
+ uint16_t ret = 1;
+ volatile uint8_t count = 0;
+
+ if(*py_str == '\0') return false;
+ if(*py_str == 'i') return false;
+ if(*py_str == 'u') return false;
+ if(*py_str == 'v') return false;
+
+ offset = py_str[0] - 'a';
+ len = strlen(py_str);
+
+ cpHZ = &pinyin_ime->dict[pinyin_ime->py_pos[offset]];
+ count = pinyin_ime->py_num[offset];
+
+ while(count--) {
+ for(index = 0; index < len; index++) {
+ if(*(py_str + index) != *((cpHZ->py) + index)) {
+ break;
+ }
+ }
+
+ // perfect match
+ if(len == 1 || index == len) {
+ return true;
+ }
+ cpHZ++;
+ }
+ return false;
+}
+
+
+static void pinyin_k9_fill_cand(lv_obj_t * obj)
+{
+ static uint16_t len = 0;
+ uint16_t index = 0, tmp_len = 0;
+ ime_pinyin_k9_py_str_t * ll_index = NULL;
+
+ lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
+
+ tmp_len = pinyin_ime->k9_legal_py_count;
+
+ if(tmp_len != len) {
+ lv_memset_00(lv_pinyin_k9_cand_str, sizeof(lv_pinyin_k9_cand_str));
+ strcpy(lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM], LV_SYMBOL_RIGHT"\0");
+ strcpy(lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 1], "\0");
+ len = tmp_len;
+ }
+
+ ll_index = _lv_ll_get_head(&pinyin_ime->k9_legal_py_ll);
+ strcpy(pinyin_ime->input_char, ll_index->py_str);
+ while(ll_index) {
+ if((index >= LV_IME_PINYIN_K9_CAND_TEXT_NUM) || \
+ (index >= pinyin_ime->k9_legal_py_count))
+ break;
+
+ strcpy(lv_pinyin_k9_cand_str[index], ll_index->py_str);
+ ll_index = _lv_ll_get_next(&pinyin_ime->k9_legal_py_ll, ll_index); /*Find the next list*/
+ index++;
+ }
+ pinyin_ime->k9_py_ll_pos = index;
+
+ lv_obj_t * ta = lv_keyboard_get_textarea(pinyin_ime->kb);
+ for(index = 0; index < pinyin_ime->k9_input_str_len; index++) {
+ lv_textarea_del_char(ta);
+ }
+ pinyin_ime->k9_input_str_len = strlen(pinyin_ime->input_char);
+ lv_textarea_add_text(ta, pinyin_ime->input_char);
+}
+
+
+static void pinyin_k9_cand_page_proc(lv_obj_t * obj, uint16_t dir)
+{
+ lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
+
+ lv_obj_t * ta = lv_keyboard_get_textarea(pinyin_ime->kb);
+ uint16_t ll_len = _lv_ll_get_len(&pinyin_ime->k9_legal_py_ll);
+
+ if((ll_len > LV_IME_PINYIN_K9_CAND_TEXT_NUM) && (pinyin_ime->k9_legal_py_count > LV_IME_PINYIN_K9_CAND_TEXT_NUM)) {
+ ime_pinyin_k9_py_str_t * ll_index = NULL;
+ uint16_t tmp_btn_str_len = 0;
+ int count = 0;
+
+ ll_index = _lv_ll_get_head(&pinyin_ime->k9_legal_py_ll);
+ while(ll_index) {
+ if(count >= pinyin_ime->k9_py_ll_pos) break;
+
+ ll_index = _lv_ll_get_next(&pinyin_ime->k9_legal_py_ll, ll_index); /*Find the next list*/
+ count++;
+ }
+
+ if((NULL == ll_index) && (dir == 1)) return;
+
+ lv_memset_00(lv_pinyin_k9_cand_str, sizeof(lv_pinyin_k9_cand_str));
+ strcpy(lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM], LV_SYMBOL_RIGHT"\0");
+ strcpy(lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 1], "\0");
+
+ // next page
+ if(dir == 1) {
+ count = 0;
+ while(ll_index) {
+ if(count >= (LV_IME_PINYIN_K9_CAND_TEXT_NUM - 1))
+ break;
+
+ strcpy(lv_pinyin_k9_cand_str[count], ll_index->py_str);
+ ll_index = _lv_ll_get_next(&pinyin_ime->k9_legal_py_ll, ll_index); /*Find the next list*/
+ count++;
+ }
+ pinyin_ime->k9_py_ll_pos += count - 1;
+
+ }
+ // previous page
+ else {
+ count = LV_IME_PINYIN_K9_CAND_TEXT_NUM - 1;
+ ll_index = _lv_ll_get_prev(&pinyin_ime->k9_legal_py_ll, ll_index);
+ while(ll_index) {
+ if(count < 0) break;
+
+ strcpy(lv_pinyin_k9_cand_str[count], ll_index->py_str);
+ ll_index = _lv_ll_get_prev(&pinyin_ime->k9_legal_py_ll, ll_index); /*Find the previous list*/
+ count--;
+ }
+
+ if(pinyin_ime->k9_py_ll_pos > LV_IME_PINYIN_K9_CAND_TEXT_NUM)
+ pinyin_ime->k9_py_ll_pos -= 1;
+ }
+
+ lv_textarea_set_cursor_pos(ta, LV_TEXTAREA_CURSOR_LAST);
+ }
+}
+
+#endif /*LV_IME_PINYIN_USE_K9_MODE*/
+
+#endif /*LV_USE_IME_PINYIN*/
+
diff --git a/src/extra/others/ime/lv_ime_pinyin.h b/src/extra/others/ime/lv_ime_pinyin.h
new file mode 100644
index 000000000..3ff7bb980
--- /dev/null
+++ b/src/extra/others/ime/lv_ime_pinyin.h
@@ -0,0 +1,145 @@
+/**
+ * @file lv_ime_pinyin.h
+ *
+ */
+#ifndef LV_IME_PINYIN_H
+#define LV_IME_PINYIN_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ * INCLUDES
+ *********************/
+#include "../../../lvgl.h"
+
+#if LV_USE_IME_PINYIN != 0
+
+/*********************
+ * DEFINES
+ *********************/
+#define LV_IME_PINYIN_K9_MAX_INPUT 7
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+typedef enum {
+ LV_IME_PINYIN_MODE_K26,
+ LV_IME_PINYIN_MODE_K9,
+} lv_ime_pinyin_mode_t;
+
+/*Data of pinyin_dict*/
+typedef struct {
+ const char * const py;
+ const char * const py_mb;
+} lv_pinyin_dict_t;
+
+/*Data of 9-key input(k9) mode*/
+typedef struct {
+ char py_str[7];
+} ime_pinyin_k9_py_str_t;
+
+/*Data of lv_ime_pinyin*/
+typedef struct {
+ lv_obj_t obj;
+ lv_obj_t * kb;
+ lv_obj_t * cand_panel;
+ lv_pinyin_dict_t * dict;
+ lv_ll_t k9_legal_py_ll;
+ char * cand_str; /* Candidate string */
+ char input_char[16]; /* Input box character */
+#if LV_IME_PINYIN_USE_K9_MODE
+ char k9_input_str[LV_IME_PINYIN_K9_MAX_INPUT]; /* 9-key input(k9) mode input string */
+ uint16_t k9_py_ll_pos; /* Current pinyin map pages(k9) */
+ uint16_t k9_legal_py_count; /* Count of legal Pinyin numbers(k9) */
+ uint16_t k9_input_str_len; /* 9-key input(k9) mode input string max len */
+#endif
+ uint16_t ta_count; /* The number of characters entered in the text box this time */
+ uint16_t cand_num; /* Number of candidates */
+ uint16_t py_page; /* Current pinyin map pages(k26) */
+ uint16_t py_num[26]; /* Number and length of Pinyin */
+ uint16_t py_pos[26]; /* Pinyin position */
+ uint8_t mode : 1; /* Set mode, 1: 26-key input(k26), 0: 9-key input(k9). Default: 1. */
+} lv_ime_pinyin_t;
+
+/***********************
+ * GLOBAL VARIABLES
+ ***********************/
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+lv_obj_t * lv_ime_pinyin_create(lv_obj_t * parent);
+
+/*=====================
+ * Setter functions
+ *====================*/
+
+/**
+ * Set the keyboard of Pinyin input method.
+ * @param obj pointer to a Pinyin input method object
+ * @param dict pointer to a Pinyin input method keyboard
+ */
+void lv_ime_pinyin_set_keyboard(lv_obj_t * obj, lv_obj_t * kb);
+
+/**
+ * Set the dictionary of Pinyin input method.
+ * @param obj pointer to a Pinyin input method object
+ * @param dict pointer to a Pinyin input method dictionary
+ */
+void lv_ime_pinyin_set_dict(lv_obj_t * obj, lv_pinyin_dict_t * dict);
+
+/**
+ * Set mode, 26-key input(k26) or 9-key input(k9).
+ * @param obj pointer to a Pinyin input method object
+ * @param mode the mode from 'lv_ime_pinyin_mode_t'
+ */
+void lv_ime_pinyin_set_mode(lv_obj_t * obj, lv_ime_pinyin_mode_t mode);
+
+
+/*=====================
+ * Getter functions
+ *====================*/
+
+/**
+ * Set the dictionary of Pinyin input method.
+ * @param obj pointer to a Pinyin IME object
+ * @return pointer to the Pinyin IME keyboard
+ */
+lv_obj_t * lv_ime_pinyin_get_kb(lv_obj_t * obj);
+
+
+/**
+ * Set the dictionary of Pinyin input method.
+ * @param obj pointer to a Pinyin input method object
+ * @return pointer to the Pinyin input method candidate panel
+ */
+lv_obj_t * lv_ime_pinyin_get_cand_panel(lv_obj_t * obj);
+
+
+/**
+ * Set the dictionary of Pinyin input method.
+ * @param obj pointer to a Pinyin input method object
+ * @return pointer to the Pinyin input method dictionary
+ */
+lv_pinyin_dict_t * lv_ime_pinyin_get_dict(lv_obj_t * obj);
+
+/*=====================
+ * Other functions
+ *====================*/
+
+/**********************
+ * MACROS
+ **********************/
+
+#endif /*LV_IME_PINYIN*/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /*LV_USE_IME_PINYIN*/
+
+
diff --git a/src/extra/others/imgfont/lv_imgfont.c b/src/extra/others/imgfont/lv_imgfont.c
new file mode 100644
index 000000000..ad4ab6023
--- /dev/null
+++ b/src/extra/others/imgfont/lv_imgfont.c
@@ -0,0 +1,126 @@
+/**
+ * @file lv_imgfont.c
+ *
+ */
+
+/*********************
+ * INCLUDES
+ *********************/
+#include "lv_imgfont.h"
+
+#if LV_USE_IMGFONT
+
+/*********************
+ * DEFINES
+ *********************/
+#define LV_IMGFONT_PATH_MAX_LEN 64
+
+/**********************
+ * TYPEDEFS
+ **********************/
+typedef struct {
+ lv_font_t * font;
+ lv_get_imgfont_path_cb_t path_cb;
+ char path[LV_IMGFONT_PATH_MAX_LEN];
+} imgfont_dsc_t;
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+static const uint8_t * imgfont_get_glyph_bitmap(const lv_font_t * font, uint32_t unicode);
+static bool imgfont_get_glyph_dsc(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out,
+ uint32_t unicode, uint32_t unicode_next);
+
+/**********************
+ * STATIC VARIABLES
+ **********************/
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+/**********************
+ * MACROS
+ **********************/
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+lv_font_t * lv_imgfont_create(uint16_t height, lv_get_imgfont_path_cb_t path_cb)
+{
+ LV_ASSERT_MSG(LV_IMGFONT_PATH_MAX_LEN > sizeof(lv_img_dsc_t),
+ "LV_IMGFONT_PATH_MAX_LEN must be greater than sizeof(lv_img_dsc_t)");
+
+ size_t size = sizeof(imgfont_dsc_t) + sizeof(lv_font_t);
+ imgfont_dsc_t * dsc = (imgfont_dsc_t *)lv_mem_alloc(size);
+ if(dsc == NULL) return NULL;
+ lv_memset_00(dsc, size);
+
+ dsc->font = (lv_font_t *)(((char *)dsc) + sizeof(imgfont_dsc_t));
+ dsc->path_cb = path_cb;
+
+ lv_font_t * font = dsc->font;
+ font->dsc = dsc;
+ font->get_glyph_dsc = imgfont_get_glyph_dsc;
+ font->get_glyph_bitmap = imgfont_get_glyph_bitmap;
+ font->subpx = LV_FONT_SUBPX_NONE;
+ font->line_height = height;
+ font->base_line = 0;
+ font->underline_position = 0;
+ font->underline_thickness = 0;
+
+ return dsc->font;
+}
+
+void lv_imgfont_destroy(lv_font_t * font)
+{
+ if(font == NULL) {
+ return;
+ }
+
+ imgfont_dsc_t * dsc = (imgfont_dsc_t *)font->dsc;
+ lv_mem_free(dsc);
+}
+
+/**********************
+ * STATIC FUNCTIONS
+ **********************/
+
+static const uint8_t * imgfont_get_glyph_bitmap(const lv_font_t * font, uint32_t unicode)
+{
+ LV_UNUSED(unicode);
+ LV_ASSERT_NULL(font);
+ imgfont_dsc_t * dsc = (imgfont_dsc_t *)font->dsc;
+ return (uint8_t *)dsc->path;
+}
+
+static bool imgfont_get_glyph_dsc(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out,
+ uint32_t unicode, uint32_t unicode_next)
+{
+ LV_ASSERT_NULL(font);
+
+ imgfont_dsc_t * dsc = (imgfont_dsc_t *)font->dsc;
+ LV_ASSERT_NULL(dsc);
+ if(dsc->path_cb == NULL) return false;
+
+ if(!dsc->path_cb(dsc->font, dsc->path, LV_IMGFONT_PATH_MAX_LEN, unicode, unicode_next)) {
+ return false;
+ }
+
+ lv_img_header_t header;
+ if(lv_img_decoder_get_info(dsc->path, &header) != LV_RES_OK) {
+ return false;
+ }
+
+ dsc_out->is_placeholder = 0;
+ dsc_out->adv_w = header.w;
+ dsc_out->box_w = header.w;
+ dsc_out->box_h = header.h;
+ dsc_out->bpp = LV_IMGFONT_BPP; /* is image identifier */
+ dsc_out->ofs_x = 0;
+ dsc_out->ofs_y = 0;
+
+ return true;
+}
+
+#endif /*LV_USE_IMGFONT*/
diff --git a/src/extra/others/imgfont/lv_imgfont.h b/src/extra/others/imgfont/lv_imgfont.h
new file mode 100644
index 000000000..5069b62f4
--- /dev/null
+++ b/src/extra/others/imgfont/lv_imgfont.h
@@ -0,0 +1,60 @@
+/**
+ * @file lv_imgfont.h
+ *
+ */
+
+#ifndef LV_IMGFONT_H
+#define LV_IMGFONT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ * INCLUDES
+ *********************/
+#include "../../../lvgl.h"
+
+#if LV_USE_IMGFONT
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/* gets the image path name of this character */
+typedef bool (*lv_get_imgfont_path_cb_t)(const lv_font_t * font, void * img_src,
+ uint16_t len, uint32_t unicode, uint32_t unicode_next);
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+/**
+ * Creates a image font with info parameter specified.
+ * @param height font size
+ * @param path_cb a function to get the image path name of character.
+ * @return pointer to the new imgfont or NULL if create error.
+ */
+lv_font_t * lv_imgfont_create(uint16_t height, lv_get_imgfont_path_cb_t path_cb);
+
+/**
+ * Destroy a image font that has been created.
+ * @param font pointer to image font handle.
+ */
+void lv_imgfont_destroy(lv_font_t * font);
+
+/**********************
+ * MACROS
+ **********************/
+
+#endif /*LV_USE_IMGFONT*/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /* LV_IMGFONT_H */
diff --git a/src/extra/others/lv_others.h b/src/extra/others/lv_others.h
index a4338666a..106d85e4e 100644
--- a/src/extra/others/lv_others.h
+++ b/src/extra/others/lv_others.h
@@ -16,6 +16,10 @@ extern "C" {
#include "snapshot/lv_snapshot.h"
#include "monkey/lv_monkey.h"
#include "gridnav/lv_gridnav.h"
+#include "fragment/lv_fragment.h"
+#include "imgfont/lv_imgfont.h"
+#include "msg/lv_msg.h"
+#include "ime/lv_ime_pinyin.h"
/*********************
* DEFINES
diff --git a/src/extra/others/msg/lv_msg.c b/src/extra/others/msg/lv_msg.c
new file mode 100644
index 000000000..8fd434d06
--- /dev/null
+++ b/src/extra/others/msg/lv_msg.c
@@ -0,0 +1,172 @@
+/**
+ * @file lv_msg.c
+ *
+ */
+
+/*********************
+ * INCLUDES
+ *********************/
+#include "lv_msg.h"
+#if LV_USE_MSG
+
+#include "../../../misc/lv_assert.h"
+#include "../../../misc/lv_ll.h"
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+typedef struct {
+ uint32_t msg_id;
+ lv_msg_subscribe_cb_t callback;
+ void * user_data;
+ void * _priv_data; /*Internal: used only store 'obj' in lv_obj_subscribe*/
+} sub_dsc_t;
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+
+static void notify(lv_msg_t * m);
+static void obj_notify_cb(void * s, lv_msg_t * m);
+static void obj_delete_event_cb(lv_event_t * e);
+
+/**********************
+ * STATIC VARIABLES
+ **********************/
+static lv_ll_t subs_ll;
+
+/**********************
+ * GLOBAL VARIABLES
+ **********************/
+lv_event_code_t LV_EVENT_MSG_RECEIVED;
+
+/**********************
+ * MACROS
+ **********************/
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+
+void lv_msg_init(void)
+{
+ LV_EVENT_MSG_RECEIVED = lv_event_register_id();
+ _lv_ll_init(&subs_ll, sizeof(sub_dsc_t));
+}
+
+void * lv_msg_subsribe(uint32_t msg_id, lv_msg_subscribe_cb_t cb, void * user_data)
+{
+ sub_dsc_t * s = _lv_ll_ins_tail(&subs_ll);
+ LV_ASSERT_MALLOC(s);
+ if(s == NULL) return NULL;
+
+ lv_memset_00(s, sizeof(*s));
+
+ s->msg_id = msg_id;
+ s->callback = cb;
+ s->user_data = user_data;
+ return s;
+}
+
+void * lv_msg_subsribe_obj(uint32_t msg_id, lv_obj_t * obj, void * user_data)
+{
+ sub_dsc_t * s = lv_msg_subsribe(msg_id, obj_notify_cb, user_data);
+ if(s == NULL) return NULL;
+ s->_priv_data = obj;
+
+ /*If not added yet, add a delete event cb which automatically unsubcribes the object*/
+ sub_dsc_t * s_first = lv_obj_get_event_user_data(obj, obj_delete_event_cb);
+ if(s_first == NULL) {
+ lv_obj_add_event_cb(obj, obj_delete_event_cb, LV_EVENT_DELETE, s);
+ }
+ return s;
+}
+
+void lv_msg_unsubscribe(void * s)
+{
+ LV_ASSERT_NULL(s);
+ _lv_ll_remove(&subs_ll, s);
+ lv_mem_free(s);
+}
+
+void lv_msg_send(uint32_t msg_id, const void * payload)
+{
+ lv_msg_t m;
+ lv_memset_00(&m, sizeof(m));
+ m.id = msg_id;
+ m.payload = payload;
+ notify(&m);
+}
+
+uint32_t lv_msg_get_id(lv_msg_t * m)
+{
+ return m->id;
+}
+
+const void * lv_msg_get_payload(lv_msg_t * m)
+{
+ return m->payload;
+}
+
+void * lv_msg_get_user_data(lv_msg_t * m)
+{
+ return m->user_data;
+}
+
+lv_msg_t * lv_event_get_msg(lv_event_t * e)
+{
+ if(e->code == LV_EVENT_MSG_RECEIVED) {
+ return lv_event_get_param(e);
+ }
+ else {
+ LV_LOG_WARN("Not interpreted with this event code");
+ return NULL;
+ }
+}
+
+
+
+/**********************
+ * STATIC FUNCTIONS
+ **********************/
+
+static void notify(lv_msg_t * m)
+{
+ sub_dsc_t * s;
+ _LV_LL_READ(&subs_ll, s) {
+ if(s->msg_id == m->id && s->callback) {
+ m->user_data = s->user_data;
+ m->_priv_data = s->_priv_data;
+ s->callback(s, m);
+ }
+ }
+}
+
+static void obj_notify_cb(void * s, lv_msg_t * m)
+{
+ LV_UNUSED(s);
+ lv_event_send(m->_priv_data, LV_EVENT_MSG_RECEIVED, m);
+}
+
+static void obj_delete_event_cb(lv_event_t * e)
+{
+ lv_obj_t * obj = lv_event_get_target(e);
+
+ sub_dsc_t * s = _lv_ll_get_head(&subs_ll);
+ sub_dsc_t * s_next;
+ while(s) {
+ /*On unsubscribe the list changes s becomes invalid so get next item while it's surely valid*/
+ s_next = _lv_ll_get_next(&subs_ll, s);
+ if(s->_priv_data == obj) {
+ lv_msg_unsubscribe(s);
+ }
+ s = s_next;
+ }
+}
+
+#endif /*LV_USE_MSG*/
diff --git a/src/extra/others/msg/lv_msg.h b/src/extra/others/msg/lv_msg.h
new file mode 100644
index 000000000..11a55b5a7
--- /dev/null
+++ b/src/extra/others/msg/lv_msg.h
@@ -0,0 +1,124 @@
+/**
+ * @file lv_msg.h
+ *
+ */
+
+#ifndef LV_MSG_H
+#define LV_MSG_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ * INCLUDES
+ *********************/
+#include "../../../core/lv_obj.h"
+#if LV_USE_MSG
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+typedef struct {
+ uint32_t id; /*Identifier of the message*/
+ void * user_data; /*Set the the user_data set in `lv_msg_subscribe`*/
+ void * _priv_data; /*Used internally*/
+ const void * payload; /*Pointer to the data of the message*/
+} lv_msg_t;
+
+typedef void (*lv_msg_subscribe_cb_t)(void * s, lv_msg_t * msg);
+
+typedef void (*lv_msg_request_cb_t)(void * r, uint32_t msg_id);
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+/**
+ * Called internally to initialize the message module
+ */
+void lv_msg_init(void);
+
+/**
+ * Subscribe to an `msg_id`
+ * @param msg_id the message ID to listen to
+ * @param cb callback to call if a message with `msg_id` was sent
+ * @param user_data arbitrary data which will be available in `cb` too
+ * @return pointer to a "subscribe object". It can be used the unsubscribe.
+ */
+void * lv_msg_subsribe(uint32_t msg_id, lv_msg_subscribe_cb_t cb, void * user_data);
+
+/**
+ * Subscribe an `lv_obj` to a message.
+ * `LV_EVENT_MSG_RECEIVED` will be triggered if a message with matching ID was sent
+ * @param msg_id the message ID to listen to
+ * @param obj pointer to an `lv_obj`
+ * @param user_data arbitrary data which will be available in `cb` too
+ * @return pointer to a "subscribe object". It can be used the unsubscribe.
+ */
+void * lv_msg_subsribe_obj(uint32_t msg_id, lv_obj_t * obj, void * user_data);
+
+/**
+ * Cancel a previous subscription
+ * @param s pointer to a "subscibe object".
+ * Return value of `lv_msg_subsribe` or `lv_msg_subsribe_obj`
+ */
+void lv_msg_unsubscribe(void * s);
+
+/**
+ * Send a message with a given ID and payload
+ * @param msg_id ID of the message to send
+ * @param data pointer to the data to send
+ */
+void lv_msg_send(uint32_t msg_id, const void * payload);
+
+/**
+ * Get the ID of a message object. Typically used in the subscriber callback.
+ * @param m pointer to a message object
+ * @return the ID of the message
+ */
+uint32_t lv_msg_get_id(lv_msg_t * m);
+
+/**
+ * Get the payload of a message object. Typically used in the subscriber callback.
+ * @param m pointer to a message object
+ * @return the payload of the message
+ */
+const void * lv_msg_get_payload(lv_msg_t * m);
+
+/**
+ * Get the user data of a message object. Typically used in the subscriber callback.
+ * @param m pointer to a message object
+ * @return the user data of the message
+ */
+void * lv_msg_get_user_data(lv_msg_t * m);
+
+/**
+ * Get the message object from an event object. Can be used in `LV_EVENT_MSG_RECEIVED` events.
+ * @param e pointer to an event object
+ * @return the message object or NULL if called with unrelated event code.
+ */
+lv_msg_t * lv_event_get_msg(lv_event_t * e);
+
+/**********************
+ * GLOBAL VARIABLES
+ **********************/
+
+extern lv_event_code_t LV_EVENT_MSG_RECEIVED;
+
+/**********************
+ * MACROS
+ **********************/
+
+#endif /*LV_USE_MSG*/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /*LV_MSG_H*/
diff --git a/src/extra/others/snapshot/lv_snapshot.c b/src/extra/others/snapshot/lv_snapshot.c
index e9fa75109..1b2275115 100644
--- a/src/extra/others/snapshot/lv_snapshot.c
+++ b/src/extra/others/snapshot/lv_snapshot.c
@@ -45,7 +45,9 @@
*/
uint32_t lv_snapshot_buf_size_needed(lv_obj_t * obj, lv_img_cf_t cf)
{
+ LV_ASSERT_NULL(obj);
switch(cf) {
+ case LV_IMG_CF_TRUE_COLOR:
case LV_IMG_CF_TRUE_COLOR_ALPHA:
case LV_IMG_CF_ALPHA_1BIT:
case LV_IMG_CF_ALPHA_2BIT:
@@ -81,10 +83,12 @@ uint32_t lv_snapshot_buf_size_needed(lv_obj_t * obj, lv_img_cf_t cf)
*/
lv_res_t lv_snapshot_take_to_buf(lv_obj_t * obj, lv_img_cf_t cf, lv_img_dsc_t * dsc, void * buf, uint32_t buff_size)
{
- LV_ASSERT(dsc);
- LV_ASSERT(buf);
+ LV_ASSERT_NULL(obj);
+ LV_ASSERT_NULL(dsc);
+ LV_ASSERT_NULL(buf);
switch(cf) {
+ case LV_IMG_CF_TRUE_COLOR:
case LV_IMG_CF_TRUE_COLOR_ALPHA:
case LV_IMG_CF_ALPHA_1BIT:
case LV_IMG_CF_ALPHA_2BIT:
@@ -124,7 +128,6 @@ lv_res_t lv_snapshot_take_to_buf(lv_obj_t * obj, lv_img_cf_t cf, lv_img_dsc_t *
lv_memset_00(&fake_disp, sizeof(lv_disp_t));
fake_disp.driver = &driver;
-
lv_draw_ctx_t * draw_ctx = lv_mem_alloc(obj_disp->driver->draw_ctx_size);
LV_ASSERT_MALLOC(draw_ctx);
if(draw_ctx == NULL) return LV_RES_INV;
@@ -138,7 +141,7 @@ lv_res_t lv_snapshot_take_to_buf(lv_obj_t * obj, lv_img_cf_t cf, lv_img_dsc_t *
lv_disp_t * refr_ori = _lv_refr_get_disp_refreshing();
_lv_refr_set_disp_refreshing(&fake_disp);
- lv_refr_obj(draw_ctx, obj);
+ lv_obj_redraw(draw_ctx, obj);
_lv_refr_set_disp_refreshing(refr_ori);
obj_disp->driver->draw_ctx_deinit(fake_disp.driver, draw_ctx);
@@ -160,14 +163,17 @@ lv_res_t lv_snapshot_take_to_buf(lv_obj_t * obj, lv_img_cf_t cf, lv_img_dsc_t *
*/
lv_img_dsc_t * lv_snapshot_take(lv_obj_t * obj, lv_img_cf_t cf)
{
+ LV_ASSERT_NULL(obj);
uint32_t buff_size = lv_snapshot_buf_size_needed(obj, cf);
void * buf = lv_mem_alloc(buff_size);
+ LV_ASSERT_MALLOC(buf);
if(buf == NULL) {
return NULL;
}
lv_img_dsc_t * dsc = lv_mem_alloc(sizeof(lv_img_dsc_t));
+ LV_ASSERT_MALLOC(buf);
if(dsc == NULL) {
lv_mem_free(buf);
return NULL;
diff --git a/src/extra/themes/basic/lv_theme_basic.c b/src/extra/themes/basic/lv_theme_basic.c
index 8750ae436..d342455ff 100644
--- a/src/extra/themes/basic/lv_theme_basic.c
+++ b/src/extra/themes/basic/lv_theme_basic.c
@@ -89,7 +89,6 @@ static void style_init(void)
lv_style_set_arc_width(&styles->white, 2);
lv_style_set_arc_color(&styles->white, COLOR_WHITE);
-
style_init_reset(&styles->light);
lv_style_set_bg_opa(&styles->light, LV_OPA_COVER);
lv_style_set_bg_color(&styles->light, COLOR_LIGHT);
@@ -224,20 +223,17 @@ static void theme_apply(lv_theme_t * th, lv_obj_t * obj)
#if LV_USE_MSGBOX
if(lv_obj_check_type(lv_obj_get_parent(obj), &lv_msgbox_class)) {
lv_obj_add_style(obj, &styles->light, LV_PART_ITEMS);
- lv_obj_add_style(obj, &styles->dark, LV_PART_ITEMS | LV_STATE_PRESSED);
return;
}
#endif
#if LV_USE_TABVIEW
if(lv_obj_check_type(lv_obj_get_parent(obj), &lv_tabview_class)) {
lv_obj_add_style(obj, &styles->light, LV_PART_ITEMS);
- lv_obj_add_style(obj, &styles->dark, LV_PART_ITEMS | LV_STATE_PRESSED);
return;
}
#endif
lv_obj_add_style(obj, &styles->white, 0);
lv_obj_add_style(obj, &styles->light, LV_PART_ITEMS);
- lv_obj_add_style(obj, &styles->dark, LV_PART_ITEMS | LV_STATE_PRESSED);
}
#endif
@@ -273,7 +269,6 @@ static void theme_apply(lv_theme_t * th, lv_obj_t * obj)
#if LV_USE_SWITCH
else if(lv_obj_check_type(obj, &lv_switch_class)) {
lv_obj_add_style(obj, &styles->light, 0);
- lv_obj_add_style(obj, &styles->dark, LV_PART_INDICATOR | LV_STATE_CHECKED);
lv_obj_add_style(obj, &styles->dim, LV_PART_KNOB);
}
#endif
@@ -349,14 +344,13 @@ static void theme_apply(lv_theme_t * th, lv_obj_t * obj)
else if(lv_obj_check_type(obj, &lv_textarea_class)) {
lv_obj_add_style(obj, &styles->white, 0);
lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR);
- lv_obj_add_style(obj, &styles->ta_cursor, LV_PART_CURSOR);
+ lv_obj_add_style(obj, &styles->ta_cursor, LV_PART_CURSOR | LV_STATE_FOCUSED);
}
#endif
#if LV_USE_CALENDAR
else if(lv_obj_check_type(obj, &lv_calendar_class)) {
lv_obj_add_style(obj, &styles->light, 0);
- lv_obj_add_style(obj, &styles->light, LV_PART_ITEMS | LV_STATE_PRESSED);
}
#endif
diff --git a/src/extra/themes/default/lv_theme_default.c b/src/extra/themes/default/lv_theme_default.c
index a481b3d5d..47392b0d1 100644
--- a/src/extra/themes/default/lv_theme_default.c
+++ b/src/extra/themes/default/lv_theme_default.c
@@ -218,26 +218,32 @@ static void style_init(void)
color_card = theme.flags & MODE_DARK ? DARK_COLOR_CARD : LIGHT_COLOR_CARD;
color_grey = theme.flags & MODE_DARK ? DARK_COLOR_GREY : LIGHT_COLOR_GREY;
+ style_init_reset(&styles->transition_delayed);
+ style_init_reset(&styles->transition_normal);
+#if TRANSITION_TIME
static lv_style_transition_dsc_t trans_delayed;
lv_style_transition_dsc_init(&trans_delayed, trans_props, lv_anim_path_linear, TRANSITION_TIME, 70, NULL);
static lv_style_transition_dsc_t trans_normal;
lv_style_transition_dsc_init(&trans_normal, trans_props, lv_anim_path_linear, TRANSITION_TIME, 0, NULL);
- style_init_reset(&styles->transition_delayed);
lv_style_set_transition(&styles->transition_delayed, &trans_delayed); /*Go back to default state with delay*/
- style_init_reset(&styles->transition_normal);
lv_style_set_transition(&styles->transition_normal, &trans_normal); /*Go back to default state with delay*/
+#endif
style_init_reset(&styles->scrollbar);
- lv_style_set_bg_color(&styles->scrollbar, (theme.flags & MODE_DARK) ? lv_palette_darken(LV_PALETTE_GREY,
- 2) : lv_palette_main(LV_PALETTE_GREY));
+ lv_color_t sb_color = (theme.flags & MODE_DARK) ? lv_palette_darken(LV_PALETTE_GREY,
+ 2) : lv_palette_main(LV_PALETTE_GREY);
+ lv_style_set_bg_color(&styles->scrollbar, sb_color);
+
lv_style_set_radius(&styles->scrollbar, LV_RADIUS_CIRCLE);
lv_style_set_pad_all(&styles->scrollbar, lv_disp_dpx(theme.disp, 7));
lv_style_set_width(&styles->scrollbar, lv_disp_dpx(theme.disp, 5));
lv_style_set_bg_opa(&styles->scrollbar, LV_OPA_40);
+#if TRANSITION_TIME
lv_style_set_transition(&styles->scrollbar, &trans_normal);
+#endif
style_init_reset(&styles->scrollbar_scrolled);
lv_style_set_bg_opa(&styles->scrollbar_scrolled, LV_OPA_COVER);
@@ -993,6 +999,7 @@ static void theme_apply(lv_theme_t * th, lv_obj_t * obj)
else if(lv_obj_check_type(obj, &lv_textarea_class)) {
lv_obj_add_style(obj, &styles->card, 0);
lv_obj_add_style(obj, &styles->pad_small, 0);
+ lv_obj_add_style(obj, &styles->disabled, LV_STATE_DISABLED);
lv_obj_add_style(obj, &styles->outline_primary, LV_STATE_FOCUS_KEY);
lv_obj_add_style(obj, &styles->outline_secondary, LV_STATE_EDITED);
lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR);
@@ -1079,11 +1086,11 @@ static void theme_apply(lv_theme_t * th, lv_obj_t * obj)
lv_obj_add_style(obj, &styles->menu_pressed, LV_STATE_PRESSED);
lv_obj_add_style(obj, &styles->bg_color_primary_muted, LV_STATE_PRESSED | LV_STATE_CHECKED);
lv_obj_add_style(obj, &styles->bg_color_primary_muted, LV_STATE_CHECKED);
+ lv_obj_add_style(obj, &styles->bg_color_primary, LV_STATE_FOCUS_KEY);
}
else if(lv_obj_check_type(obj, &lv_menu_sidebar_header_cont_class) ||
lv_obj_check_type(obj, &lv_menu_main_header_cont_class)) {
lv_obj_add_style(obj, &styles->menu_header_cont, 0);
- lv_obj_add_style(obj, &styles->menu_pressed, LV_STATE_PRESSED);
}
else if(lv_obj_check_type(obj, &lv_menu_page_class)) {
lv_obj_add_style(obj, &styles->menu_page, 0);
diff --git a/src/extra/themes/mono/lv_theme_mono.c b/src/extra/themes/mono/lv_theme_mono.c
index 79d4383d8..b249e76d5 100644
--- a/src/extra/themes/mono/lv_theme_mono.c
+++ b/src/extra/themes/mono/lv_theme_mono.c
@@ -175,7 +175,7 @@ lv_theme_t * lv_theme_mono_init(lv_disp_t * disp, bool dark_bg, const lv_font_t
/*This trick is required only to avoid the garbage collection of
*styles' data if LVGL is used in a binding (e.g. Micropython)
*In a general case styles could be in simple `static lv_style_t my_style...` variables*/
- if(!lv_theme_mono_is_inited()) {
+ if(!inited) {
inited = false;
LV_GC_ROOT(_lv_theme_default_styles) = lv_mem_alloc(sizeof(my_theme_styles_t));
styles = (my_theme_styles_t *)LV_GC_ROOT(_lv_theme_default_styles);
diff --git a/src/extra/widgets/calendar/lv_calendar.c b/src/extra/widgets/calendar/lv_calendar.c
index f469eae5c..b806d2529 100644
--- a/src/extra/widgets/calendar/lv_calendar.c
+++ b/src/extra/widgets/calendar/lv_calendar.c
@@ -120,7 +120,7 @@ void lv_calendar_set_showed_date(lv_obj_t * obj, uint32_t year, uint32_t month)
d.month = calendar->showed_date.month;
d.day = calendar->showed_date.day;
- uint8_t i;
+ uint32_t i;
/*Remove the disabled state but revert it for day names*/
lv_btnmatrix_clear_btn_ctrl_all(calendar->btnm, LV_BTNMATRIX_CTRL_DISABLED);
@@ -262,7 +262,7 @@ static void lv_calendar_constructor(const lv_obj_class_t * class_p, lv_obj_t * o
if(i != 0 && (i + 1) % 8 == 0) {
calendar->map[i] = "\n";
}
- else if(i < 8) {
+ else if(i < 7) {
calendar->map[i] = day_names_def[i];
}
else {
diff --git a/src/extra/widgets/chart/lv_chart.c b/src/extra/widgets/chart/lv_chart.c
index a6e09fb45..da6c18c0e 100644
--- a/src/extra/widgets/chart/lv_chart.c
+++ b/src/extra/widgets/chart/lv_chart.c
@@ -539,7 +539,6 @@ void lv_chart_set_next_value(lv_obj_t * obj, lv_chart_series_t * ser, lv_coord_t
invalidate_point(obj, ser->start_point);
ser->start_point = (ser->start_point + 1) % chart->point_cnt;
invalidate_point(obj, ser->start_point);
- lv_chart_refresh(obj);
}
void lv_chart_set_next_value2(lv_obj_t * obj, lv_chart_series_t * ser, lv_coord_t x_value, lv_coord_t y_value)
@@ -556,11 +555,8 @@ void lv_chart_set_next_value2(lv_obj_t * obj, lv_chart_series_t * ser, lv_coord_
ser->x_points[ser->start_point] = x_value;
ser->y_points[ser->start_point] = y_value;
- invalidate_point(obj, ser->start_point);
ser->start_point = (ser->start_point + 1) % chart->point_cnt;
invalidate_point(obj, ser->start_point);
- lv_chart_refresh(obj);
-
}
void lv_chart_set_value_by_id(lv_obj_t * obj, lv_chart_series_t * ser, uint16_t id, lv_coord_t value)
@@ -571,7 +567,7 @@ void lv_chart_set_value_by_id(lv_obj_t * obj, lv_chart_series_t * ser, uint16_t
if(id >= chart->point_cnt) return;
ser->y_points[id] = value;
- lv_chart_refresh(obj);
+ invalidate_point(obj, id);
}
void lv_chart_set_value_by_id2(lv_obj_t * obj, lv_chart_series_t * ser, uint16_t id, lv_coord_t x_value,
@@ -589,7 +585,7 @@ void lv_chart_set_value_by_id2(lv_obj_t * obj, lv_chart_series_t * ser, uint16_t
if(id >= chart->point_cnt) return;
ser->x_points[id] = x_value;
ser->y_points[id] = y_value;
- lv_chart_refresh(obj);
+ invalidate_point(obj, id);
}
void lv_chart_set_ext_y_array(lv_obj_t * obj, lv_chart_series_t * ser, lv_coord_t array[])
@@ -720,7 +716,7 @@ static void lv_chart_event(const lv_obj_class_t * class_p, lv_event_t * e)
p.x -= obj->coords.x1;
uint32_t id = get_index_from_x(obj, p.x + lv_obj_get_scroll_left(obj));
- if(id != chart->pressed_point_id) {
+ if(id != (uint32_t)chart->pressed_point_id) {
invalidate_point(obj, id);
invalidate_point(obj, chart->pressed_point_id);
chart->pressed_point_id = id;
@@ -908,7 +904,7 @@ static void draw_series_line(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx)
if(LV_MIN(point_w, point_h) > line_dsc_default.width / 2) line_dsc_default.raw_end = 1;
if(line_dsc_default.width == 1) line_dsc_default.raw_end = 1;
- /*If there are mire points than pixels draw only vertical lines*/
+ /*If there are at least as much points as pixels then draw only vertical lines*/
bool crowded_mode = chart->point_cnt >= w ? true : false;
/*Go through all data lines*/
@@ -1201,11 +1197,13 @@ static void draw_series_bar(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx)
int32_t block_gap = ((int32_t)lv_obj_get_style_pad_column(obj,
LV_PART_MAIN) * chart->zoom_x) >> 8; /*Gap between the column on ~adjacent X*/
lv_coord_t block_w = (w - ((chart->point_cnt - 1) * block_gap)) / chart->point_cnt;
- lv_coord_t col_w = block_w / ser_cnt;
int32_t ser_gap = ((int32_t)lv_obj_get_style_pad_column(obj,
- LV_PART_ITEMS) * chart->zoom_x) >> 8; /*Gap between the column on the ~same X*/
- lv_coord_t x_ofs = pad_left - lv_obj_get_scroll_left(obj);
- lv_coord_t y_ofs = pad_top - lv_obj_get_scroll_top(obj);
+ LV_PART_ITEMS) * chart->zoom_x) >> 8; /*Gap between the columns on the ~same X*/
+ lv_coord_t col_w = (block_w - (ser_cnt - 1) * ser_gap) / ser_cnt;
+
+ lv_coord_t border_w = lv_obj_get_style_border_width(obj, LV_PART_MAIN);
+ lv_coord_t x_ofs = pad_left - lv_obj_get_scroll_left(obj) + border_w;
+ lv_coord_t y_ofs = pad_top - lv_obj_get_scroll_top(obj) + border_w;
lv_draw_rect_dsc_t col_dsc;
lv_draw_rect_dsc_init(&col_dsc);
@@ -1224,7 +1222,7 @@ static void draw_series_bar(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx)
/*Go through all points*/
for(i = 0; i < chart->point_cnt; i++) {
- lv_coord_t x_act = (int32_t)((int32_t)(w + block_gap) * i) / (chart->point_cnt) + obj->coords.x1 + x_ofs;
+ lv_coord_t x_act = (int32_t)((int32_t)(w - block_w) * i) / (chart->point_cnt - 1) + obj->coords.x1 + x_ofs;
part_draw_dsc.id = i;
@@ -1234,8 +1232,8 @@ static void draw_series_bar(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx)
lv_coord_t start_point = chart->update_mode == LV_CHART_UPDATE_MODE_SHIFT ? ser->start_point : 0;
col_a.x1 = x_act;
- col_a.x2 = col_a.x1 + col_w - ser_gap - 1;
- x_act += col_w;
+ col_a.x2 = col_a.x1 + col_w - 1;
+ x_act += col_w + ser_gap;
if(col_a.x2 < clip_area.x1) continue;
if(col_a.x1 > clip_area.x2) break;
@@ -1329,7 +1327,8 @@ static void draw_cursors(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx)
cy += obj->coords.y1;
lv_area_t point_area;
- if(point_w && point_h) {
+ bool draw_point = point_w && point_h;
+ if(draw_point) {
point_area.x1 = cx - point_w;
point_area.x2 = cx + point_w;
point_area.y1 = cy - point_h;
@@ -1349,7 +1348,11 @@ static void draw_cursors(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx)
lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc);
lv_draw_line(draw_ctx, &line_dsc_tmp, &p1, &p2);
- lv_draw_rect(draw_ctx, &point_dsc_tmp, &point_area);
+
+ if(draw_point) {
+ lv_draw_rect(draw_ctx, &point_dsc_tmp, &point_area);
+ }
+
lv_event_send(obj, LV_EVENT_DRAW_PART_END, &part_draw_dsc);
}
@@ -1361,7 +1364,11 @@ static void draw_cursors(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx)
lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc);
lv_draw_line(draw_ctx, &line_dsc_tmp, &p1, &p2);
- lv_draw_rect(draw_ctx, &point_dsc_tmp, &point_area);
+
+ if(draw_point) {
+ lv_draw_rect(draw_ctx, &point_dsc_tmp, &point_area);
+ }
+
lv_event_send(obj, LV_EVENT_DRAW_PART_END, &part_draw_dsc);
}
}
@@ -1515,7 +1522,6 @@ static void draw_x_ticks(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, lv_chart_axis
lv_coord_t pad_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN) + lv_obj_get_style_border_width(obj, LV_PART_MAIN);
lv_coord_t w = ((int32_t)lv_obj_get_content_width(obj) * chart->zoom_x) >> 8;
-
lv_draw_label_dsc_t label_dsc;
lv_draw_label_dsc_init(&label_dsc);
lv_obj_init_draw_label_dsc(obj, LV_PART_TICKS, &label_dsc);
@@ -1559,6 +1565,7 @@ static void draw_x_ticks(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, lv_chart_axis
int32_t block_gap = ((int32_t)lv_obj_get_style_pad_column(obj,
LV_PART_MAIN) * chart->zoom_x) >> 8; /*Gap between the columns on ~adjacent X*/
lv_coord_t block_w = (w + block_gap) / (chart->point_cnt);
+
x_ofs += (block_w - block_gap) / 2;
w -= block_w - block_gap;
}
@@ -1708,11 +1715,13 @@ static void invalidate_point(lv_obj_t * obj, uint16_t i)
lv_area_t col_a;
int32_t block_gap = ((int32_t)lv_obj_get_style_pad_column(obj,
LV_PART_MAIN) * chart->zoom_x) >> 8; /*Gap between the column on ~adjacent X*/
+
lv_coord_t block_w = (w + block_gap) / chart->point_cnt;
+ lv_coord_t bwidth = lv_obj_get_style_border_width(obj, LV_PART_MAIN);
lv_coord_t x_act;
x_act = (int32_t)((int32_t)(block_w) * i) ;
- x_act += obj->coords.x1 + lv_obj_get_style_pad_left(obj, LV_PART_MAIN);
+ x_act += obj->coords.x1 + bwidth + lv_obj_get_style_pad_left(obj, LV_PART_MAIN);
lv_obj_get_coords(obj, &col_a);
col_a.x1 = x_act - scroll_left;
@@ -1721,9 +1730,6 @@ static void invalidate_point(lv_obj_t * obj, uint16_t i)
lv_obj_invalidate_area(obj, &col_a);
}
- else if(chart->type == LV_CHART_TYPE_SCATTER) {
- lv_obj_invalidate(obj);
- }
else {
lv_obj_invalidate(obj);
}
diff --git a/src/extra/widgets/chart/lv_chart.h b/src/extra/widgets/chart/lv_chart.h
index 8a9b8cfc0..394c0e7b0 100644
--- a/src/extra/widgets/chart/lv_chart.h
+++ b/src/extra/widgets/chart/lv_chart.h
@@ -22,7 +22,11 @@ extern "C" {
*********************/
/**Default value of points. Can be used to not draw a point*/
+#if LV_USE_LARGE_COORD
+#define LV_CHART_POINT_NONE (INT32_MAX)
+#else
#define LV_CHART_POINT_NONE (INT16_MAX)
+#endif
LV_EXPORT_CONST_INT(LV_CHART_POINT_NONE);
/**********************
@@ -78,7 +82,7 @@ typedef struct {
typedef struct {
lv_point_t pos;
- uint16_t point_id;
+ lv_coord_t point_id;
lv_color_t color;
lv_chart_series_t * ser;
lv_dir_t dir;
@@ -104,7 +108,7 @@ typedef struct {
lv_coord_t ymax[2];
lv_coord_t xmin[2];
lv_coord_t xmax[2];
- uint16_t pressed_point_id;
+ lv_coord_t pressed_point_id;
uint16_t hdiv_cnt; /**< Number of horizontal division lines*/
uint16_t vdiv_cnt; /**< Number of vertical division lines*/
uint16_t point_cnt; /**< Point number in a data line*/
@@ -339,7 +343,7 @@ void lv_chart_set_cursor_pos(lv_obj_t * chart, lv_chart_cursor_t * cursor, lv_po
* @param obj pointer to a chart object
* @param cursor pointer to the cursor
* @param ser pointer to a series
- * @param point_id the point's index or `LV_CHART_POINT_NONE` to not assign to any points.
+ * @param point_id the point's index or `LV_CHART_POINT_NONE` to not assign to any points.
*/
void lv_chart_set_cursor_point(lv_obj_t * chart, lv_chart_cursor_t * cursor, lv_chart_series_t * ser,
uint16_t point_id);
diff --git a/src/extra/widgets/colorwheel/lv_colorwheel.c b/src/extra/widgets/colorwheel/lv_colorwheel.c
index 3fb7128cf..daf112e93 100644
--- a/src/extra/widgets/colorwheel/lv_colorwheel.c
+++ b/src/extra/widgets/colorwheel/lv_colorwheel.c
@@ -613,7 +613,6 @@ static lv_res_t double_click_reset(lv_obj_t * obj)
* We replace division by 255 by a division by 256, a.k.a a shift right by 8 bits.
* This is wrong, but since this is only used to compute the pixels on the screen and not the final color, it's ok.
*/
-static void fast_hsv2rgb(uint16_t h, uint8_t s, uint8_t v, uint8_t * r, uint8_t * g, uint8_t * b);
static void fast_hsv2rgb(uint16_t h, uint8_t s, uint8_t v, uint8_t * r, uint8_t * g, uint8_t * b)
{
if(!s) {
@@ -652,6 +651,11 @@ static lv_color_t angle_to_mode_color_fast(lv_obj_t * obj, uint16_t angle)
uint8_t r = 0, g = 0, b = 0;
static uint16_t h = 0;
static uint8_t s = 0, v = 0, m = 255;
+ static uint16_t angle_saved = 0xffff;
+
+ /*If the angle is different recalculate scaling*/
+ if(angle_saved != angle) m = 255;
+ angle_saved = angle;
switch(ext->mode) {
default:
diff --git a/src/extra/widgets/keyboard/lv_keyboard.c b/src/extra/widgets/keyboard/lv_keyboard.c
index 6ba431eb9..8e052e33a 100644
--- a/src/extra/widgets/keyboard/lv_keyboard.c
+++ b/src/extra/widgets/keyboard/lv_keyboard.c
@@ -285,19 +285,19 @@ void lv_keyboard_def_event_cb(lv_event_t * e)
if(strcmp(txt, "abc") == 0) {
keyboard->mode = LV_KEYBOARD_MODE_TEXT_LOWER;
lv_btnmatrix_set_map(obj, kb_map[LV_KEYBOARD_MODE_TEXT_LOWER]);
- lv_btnmatrix_set_ctrl_map(obj, kb_ctrl[LV_KEYBOARD_MODE_TEXT_LOWER]);
+ lv_keyboard_update_ctrl_map(obj);
return;
}
else if(strcmp(txt, "ABC") == 0) {
keyboard->mode = LV_KEYBOARD_MODE_TEXT_UPPER;
lv_btnmatrix_set_map(obj, kb_map[LV_KEYBOARD_MODE_TEXT_UPPER]);
- lv_btnmatrix_set_ctrl_map(obj, kb_ctrl[LV_KEYBOARD_MODE_TEXT_UPPER]);
+ lv_keyboard_update_ctrl_map(obj);
return;
}
else if(strcmp(txt, "1#") == 0) {
keyboard->mode = LV_KEYBOARD_MODE_SPECIAL;
lv_btnmatrix_set_map(obj, kb_map[LV_KEYBOARD_MODE_SPECIAL]);
- lv_btnmatrix_set_ctrl_map(obj, kb_ctrl[LV_KEYBOARD_MODE_SPECIAL]);
+ lv_keyboard_update_ctrl_map(obj);
return;
}
else if(strcmp(txt, LV_SYMBOL_CLOSE) == 0 || strcmp(txt, LV_SYMBOL_KEYBOARD) == 0) {
diff --git a/src/extra/widgets/led/lv_led.c b/src/extra/widgets/led/lv_led.c
index 513ecfb9d..88b7b87da 100644
--- a/src/extra/widgets/led/lv_led.c
+++ b/src/extra/widgets/led/lv_led.c
@@ -178,6 +178,7 @@ static void lv_led_event(const lv_obj_class_t * class_p, lv_event_t * e)
lv_obj_init_draw_rect_dsc(obj, LV_PART_MAIN, &rect_dsc);
/*Use the original colors brightness to modify color->led*/
+ rect_dsc.bg_color = lv_color_mix(led->color, lv_color_black(), lv_color_brightness(rect_dsc.bg_color));
rect_dsc.bg_grad.stops[0].color = lv_color_mix(led->color, lv_color_black(),
lv_color_brightness(rect_dsc.bg_grad.stops[0].color));
rect_dsc.bg_grad.stops[1].color = lv_color_mix(led->color, lv_color_black(),
@@ -187,6 +188,7 @@ static void lv_led_event(const lv_obj_class_t * class_p, lv_event_t * e)
rect_dsc.outline_color = lv_color_mix(led->color, lv_color_black(), lv_color_brightness(rect_dsc.outline_color));
/*Mix. the color with black proportionally with brightness*/
+ rect_dsc.bg_color = lv_color_mix(rect_dsc.bg_color, lv_color_black(), led->bright);
rect_dsc.bg_grad.stops[0].color = lv_color_mix(rect_dsc.bg_grad.stops[0].color, lv_color_black(), led->bright);
rect_dsc.bg_grad.stops[1].color = lv_color_mix(rect_dsc.bg_grad.stops[1].color, lv_color_black(), led->bright);
rect_dsc.border_color = lv_color_mix(rect_dsc.border_color, lv_color_black(), led->bright);
diff --git a/src/extra/widgets/list/lv_list.c b/src/extra/widgets/list/lv_list.c
index ea9ced729..29355fd3c 100644
--- a/src/extra/widgets/list/lv_list.c
+++ b/src/extra/widgets/list/lv_list.c
@@ -73,7 +73,7 @@ lv_obj_t * lv_list_add_text(lv_obj_t * list, const char * txt)
return obj;
}
-lv_obj_t * lv_list_add_btn(lv_obj_t * list, const char * icon, const char * txt)
+lv_obj_t * lv_list_add_btn(lv_obj_t * list, const void * icon, const char * txt)
{
LV_LOG_INFO("begin");
lv_obj_t * obj = lv_obj_class_create_obj(&lv_list_btn_class, list);
diff --git a/src/extra/widgets/list/lv_list.h b/src/extra/widgets/list/lv_list.h
index 8b9164415..0da5595bc 100644
--- a/src/extra/widgets/list/lv_list.h
+++ b/src/extra/widgets/list/lv_list.h
@@ -37,7 +37,7 @@ lv_obj_t * lv_list_create(lv_obj_t * parent);
lv_obj_t * lv_list_add_text(lv_obj_t * list, const char * txt);
-lv_obj_t * lv_list_add_btn(lv_obj_t * list, const char * icon, const char * txt);
+lv_obj_t * lv_list_add_btn(lv_obj_t * list, const void * icon, const char * txt);
const char * lv_list_get_btn_text(lv_obj_t * list, lv_obj_t * btn);
diff --git a/src/extra/widgets/menu/lv_menu.c b/src/extra/widgets/menu/lv_menu.c
index 9c6b5423a..78577e770 100644
--- a/src/extra/widgets/menu/lv_menu.c
+++ b/src/extra/widgets/menu/lv_menu.c
@@ -124,7 +124,15 @@ lv_obj_t * lv_menu_page_create(lv_obj_t * parent, char * title)
lv_obj_class_init_obj(obj);
lv_menu_page_t * page = (lv_menu_page_t *)obj;
- page->title = title;
+ if(title) {
+ page->title = lv_mem_alloc(strlen(title) + 1);
+ LV_ASSERT_MALLOC(page->title);
+ if(page->title == NULL) return NULL;
+ strcpy(page->title, title);
+ }
+ else {
+ page->title = NULL;
+ }
return obj;
}
@@ -196,6 +204,7 @@ void lv_menu_set_page(lv_obj_t * obj, lv_obj_t * page)
/* Add a new node */
lv_ll_t * history_ll = &(menu->history_ll);
lv_menu_history_t * new_node = _lv_ll_ins_head(history_ll);
+ LV_ASSERT_MALLOC(new_node);
new_node->page = page;
menu->cur_depth++;
@@ -352,8 +361,9 @@ void lv_menu_set_load_page_event(lv_obj_t * menu, lv_obj_t * obj, lv_obj_t * pag
{
LV_ASSERT_OBJ(menu, MY_CLASS);
- /* Make the object clickable */
lv_obj_add_flag(obj, LV_OBJ_FLAG_CLICKABLE);
+ lv_obj_clear_flag(obj, LV_OBJ_FLAG_SCROLLABLE);
+ lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS);
/* Remove old event */
if(lv_obj_remove_event_cb(obj, lv_menu_load_page_event_cb)) {
@@ -675,6 +685,11 @@ static void lv_menu_load_page_event_cb(lv_event_t * e)
}
lv_menu_set_page((lv_obj_t *)menu, page);
+
+ if(lv_group_get_default() != NULL && menu->sidebar_page == NULL) {
+ /* Sidebar is not supported for now*/
+ lv_group_focus_next(lv_group_get_default());
+ }
}
static void lv_menu_obj_del_event_cb(lv_event_t * e)
diff --git a/src/extra/widgets/meter/lv_meter.c b/src/extra/widgets/meter/lv_meter.c
index c12dc33c9..668ab97e9 100644
--- a/src/extra/widgets/meter/lv_meter.c
+++ b/src/extra/widgets/meter/lv_meter.c
@@ -379,8 +379,6 @@ static void draw_ticks_and_labels(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, cons
p_center.x = scale_area->x1 + r_edge;
p_center.y = scale_area->y1 + r_edge;
- uint8_t i;
-
lv_draw_line_dsc_t line_dsc;
lv_draw_line_dsc_init(&line_dsc);
lv_obj_init_draw_line_dsc(obj, LV_PART_TICKS, &line_dsc);
@@ -406,7 +404,7 @@ static void draw_ticks_and_labels(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, cons
_LV_LL_READ_BACK(&meter->scale_ll, scale) {
part_draw_dsc.sub_part_ptr = scale;
- lv_coord_t r_out = r_edge + scale->r_mod;
+ lv_coord_t r_out = r_edge;
lv_coord_t r_in_minor = r_out - scale->tick_length;
lv_coord_t r_in_major = r_out - scale->tick_major_length;
@@ -435,6 +433,7 @@ static void draw_ticks_and_labels(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, cons
int16_t inner_act_mask_id = LV_MASK_ID_INV; /*Will be added later*/
uint32_t minor_cnt = scale->tick_major_nth ? scale->tick_major_nth - 1 : 0xFFFF;
+ uint16_t i;
for(i = 0; i < scale->tick_cnt; i++) {
minor_cnt++;
bool major = false;
@@ -474,32 +473,20 @@ static void draw_ticks_and_labels(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, cons
}
}
- /*`* 256` for extra precision*/
- int32_t angle_upscale = ((i * scale->angle_range) << 8) / (scale->tick_cnt - 1);
-
- int32_t angle_low = (angle_upscale >> 8);
- int32_t angle_high = angle_low + 1;
- int32_t angle_rem = angle_upscale & 0xFF;
-
- /*Interpolate sine and cos*/
- int32_t sin_low = lv_trigo_sin(angle_low + scale->rotation);
- int32_t sin_high = lv_trigo_sin(angle_high + scale->rotation);
- int32_t sin_mid = (sin_low * (256 - angle_rem) + sin_high * angle_rem) >> 8;
-
- int32_t cos_low = lv_trigo_cos(angle_low + scale->rotation);
- int32_t cos_high = lv_trigo_cos(angle_high + scale->rotation);
- int32_t cos_mid = (cos_low * (256 - angle_rem) + cos_high * angle_rem) >> 8;
+ int32_t angle_upscale = ((i * scale->angle_range) * 10) / (scale->tick_cnt - 1) + + scale->rotation * 10;
line_dsc.color = line_color;
line_dsc.width = line_width;
- /*Use the interpolated angle to get the outer x and y coordinates.
- *Draw a little bit longer lines to be sure the mask will clip them correctly*/
+
+ /*Draw a little bit longer lines to be sure the mask will clip them correctly
+ *and to get a better precision*/
lv_point_t p_outer;
- p_outer.x = (int32_t)(((int32_t)cos_mid * (r_out + line_width) + 127) >> (LV_TRIGO_SHIFT)) + p_center.x;
- p_outer.y = (int32_t)(((int32_t)sin_mid * (r_out + line_width) + 127) >> (LV_TRIGO_SHIFT)) + p_center.y;
+ p_outer.x = p_center.x + r_out + LV_MAX(LV_DPI_DEF, r_out);
+ p_outer.y = p_center.y;
+ lv_point_transform(&p_outer, angle_upscale, 256, &p_center);
- part_draw_dsc.p1 = &p_outer;
part_draw_dsc.p1 = &p_center;
+ part_draw_dsc.p2 = &p_outer;
part_draw_dsc.id = i;
part_draw_dsc.label_dsc = &label_dsc;
@@ -508,8 +495,9 @@ static void draw_ticks_and_labels(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, cons
lv_draw_mask_remove_id(outer_mask_id);
uint32_t r_text = r_in_major - scale->label_gap;
lv_point_t p;
- p.x = (int32_t)((int32_t)((int32_t)cos_mid * r_text + 127) >> LV_TRIGO_SHIFT) + p_center.x;
- p.y = (int32_t)((int32_t)((int32_t)sin_mid * r_text + 127) >> LV_TRIGO_SHIFT) + p_center.y;
+ p.x = p_center.x + r_text;
+ p.y = p_center.y;
+ lv_point_transform(&p, angle_upscale, 256, &p_center);
lv_draw_label_dsc_t label_dsc_tmp;
lv_memcpy(&label_dsc_tmp, &label_dsc, sizeof(label_dsc_tmp));
diff --git a/src/extra/widgets/msgbox/lv_msgbox.c b/src/extra/widgets/msgbox/lv_msgbox.c
index a62c9ae63..8db5df7ee 100644
--- a/src/extra/widgets/msgbox/lv_msgbox.c
+++ b/src/extra/widgets/msgbox/lv_msgbox.c
@@ -74,8 +74,8 @@ lv_obj_t * lv_msgbox_create(lv_obj_t * parent, const char * title, const char *
lv_obj_t * obj = lv_obj_class_create_obj(&lv_msgbox_class, parent);
LV_ASSERT_MALLOC(obj);
- lv_obj_class_init_obj(obj);
if(obj == NULL) return NULL;
+ lv_obj_class_init_obj(obj);
lv_msgbox_t * mbox = (lv_msgbox_t *)obj;
if(auto_parent) lv_obj_add_flag(obj, LV_MSGBOX_FLAG_AUTO_PARENT);
diff --git a/src/extra/widgets/span/lv_span.c b/src/extra/widgets/span/lv_span.c
index 4bba67611..96f044760 100644
--- a/src/extra/widgets/span/lv_span.c
+++ b/src/extra/widgets/span/lv_span.c
@@ -209,6 +209,14 @@ void lv_spangroup_set_mode(lv_obj_t * obj, lv_span_mode_t mode)
lv_spangroup_refr_mode(obj);
}
+void lv_spangroup_set_lines(lv_obj_t * obj, int32_t lines)
+{
+ LV_ASSERT_OBJ(obj, MY_CLASS);
+ lv_spangroup_t * spans = (lv_spangroup_t *)obj;
+ spans->lines = lines;
+ lv_spangroup_refr_mode(obj);
+}
+
/*=====================
* Getter functions
*====================*/
@@ -289,6 +297,13 @@ lv_span_mode_t lv_spangroup_get_mode(lv_obj_t * obj)
return spans->mode;
}
+int32_t lv_spangroup_get_lines(lv_obj_t * obj)
+{
+ LV_ASSERT_OBJ(obj, MY_CLASS);
+ lv_spangroup_t * spans = (lv_spangroup_t *)obj;
+ return spans->lines;
+}
+
void lv_spangroup_refr_mode(lv_obj_t * obj)
{
LV_ASSERT_OBJ(obj, MY_CLASS);
@@ -400,6 +415,8 @@ lv_coord_t lv_spangroup_get_expand_height(lv_obj_t * obj, lv_coord_t width)
lv_snippet_t snippet; /* use to save cur_span info and push it to stack */
memset(&snippet, 0, sizeof(snippet));
+ int32_t line_cnt = 0;
+ int32_t lines = spans->lines < 0 ? INT32_MAX : spans->lines;
/* the loop control how many lines need to draw */
while(cur_span) {
int snippet_cnt = 0;
@@ -467,6 +484,10 @@ lv_coord_t lv_spangroup_get_expand_height(lv_obj_t * obj, lv_coord_t width)
txt_pos.x = 0;
txt_pos.y += max_line_h;
max_w = max_width;
+ line_cnt += 1;
+ if(line_cnt >= lines) {
+ break;
+ }
}
txt_pos.y -= line_space;
@@ -483,6 +504,7 @@ static void lv_spangroup_constructor(const lv_obj_class_t * class_p, lv_obj_t *
lv_spangroup_t * spans = (lv_spangroup_t *)obj;
_lv_ll_init(&spans->child_ll, sizeof(lv_span_t));
spans->indent = 0;
+ spans->lines = -1;
spans->mode = LV_SPAN_MODE_EXPAND;
spans->overflow = LV_SPAN_OVERFLOW_CLIP;
spans->cache_w = 0;
@@ -780,6 +802,7 @@ static void lv_draw_span(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx)
bool is_end_line = false;
bool ellipsis_valid = false;
lv_coord_t max_line_h = 0; /* the max height of span-font when a line have a lot of span */
+ lv_coord_t max_baseline = 0; /*baseline of the highest span*/
lv_snippet_clear();
/* the loop control to find a line and push the relevant span info into stack */
@@ -803,15 +826,6 @@ static void lv_draw_span(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx)
snippet.line_h = lv_font_get_line_height(snippet.font) + line_space;
}
- if(spans->overflow == LV_SPAN_OVERFLOW_ELLIPSIS) {
- /* curretn line span txt overflow, don't push */
- if(txt_pos.y + snippet.line_h - line_space > coords.y2 + 1) {
- ellipsis_valid = true;
- is_end_line = true;
- break;
- }
- }
-
/* get current span text line info */
uint32_t next_ofs = 0;
lv_coord_t use_width = 0;
@@ -819,24 +833,7 @@ static void lv_draw_span(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx)
max_w, txt_flag, &use_width, &next_ofs);
if(isfill) {
- lv_coord_t next_line_h = snippet.line_h;
- if(cur_txt[cur_txt_ofs + next_ofs] == '\0') {
- next_line_h = 0;
- lv_span_t * next_span = _lv_ll_get_next(&spans->child_ll, cur_span);
- if(next_span) { /* have the next line */
- next_line_h = lv_font_get_line_height(lv_span_get_style_text_font(obj, next_span)) + line_space;
- }
- }
- lv_coord_t cur_line_h = max_line_h < snippet.line_h ? snippet.line_h : max_line_h;
- if(txt_pos.y + cur_line_h + next_line_h - line_space > coords.y2 + 1) { /* for overflow if is end line. */
- if(cur_txt[cur_txt_ofs + next_ofs] != '\0') {
- next_ofs = strlen(&cur_txt[cur_txt_ofs]);
- use_width = lv_txt_get_width(&cur_txt[cur_txt_ofs], next_ofs, snippet.font, snippet.letter_space, txt_flag);
- ellipsis_valid = spans->overflow == LV_SPAN_OVERFLOW_ELLIPSIS ? true : false;
- is_end_line = true;
- }
- }
- else if(next_ofs > 0 && lv_get_snippet_cnt() > 0) {
+ if(next_ofs > 0 && lv_get_snippet_cnt() > 0) {
/* To prevent infinite loops, the _lv_txt_get_next_line() may return incomplete words, */
/* This phenomenon should be avoided when lv_get_snippet_cnt() > 0 */
if(max_w < use_width) {
@@ -860,6 +857,7 @@ static void lv_draw_span(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx)
cur_txt_ofs += next_ofs;
if(max_line_h < snippet.line_h) {
max_line_h = snippet.line_h;
+ max_baseline = snippet.font->base_line;
}
lv_snippet_push(&snippet);
@@ -869,13 +867,35 @@ static void lv_draw_span(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx)
}
}
- /* start current line deal width */
+ /* start current line deal with */
uint16_t item_cnt = lv_get_snippet_cnt();
if(item_cnt == 0) { /* break if stack is empty */
break;
}
+ /* Whether the current line is the end line and does overflow processing */
+ {
+ lv_snippet_t * last_snippet = lv_get_snippet(item_cnt - 1);
+ lv_coord_t next_line_h = last_snippet->line_h;
+ if(last_snippet->txt[last_snippet->bytes] == '\0') {
+ next_line_h = 0;
+ lv_span_t * next_span = _lv_ll_get_next(&spans->child_ll, last_snippet->span);
+ if(next_span) { /* have the next line */
+ next_line_h = lv_font_get_line_height(lv_span_get_style_text_font(obj, next_span)) + line_space;
+ }
+ }
+ if(txt_pos.y + max_line_h + next_line_h - line_space > coords.y2 + 1) { /* for overflow if is end line. */
+ if(last_snippet->txt[last_snippet->bytes] != '\0') {
+ last_snippet->bytes = strlen(last_snippet->txt);
+ last_snippet->txt_w = lv_txt_get_width(last_snippet->txt, last_snippet->bytes, last_snippet->font,
+ last_snippet->letter_space, txt_flag);
+ }
+ ellipsis_valid = spans->overflow == LV_SPAN_OVERFLOW_ELLIPSIS ? true : false;
+ is_end_line = true;
+ }
+ }
+
/*Go the first visible line*/
if(txt_pos.y + max_line_h < clip_area.y1) {
goto Next_line_init;
@@ -908,7 +928,7 @@ static void lv_draw_span(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx)
lv_point_t pos;
pos.x = txt_pos.x;
- pos.y = txt_pos.y + max_line_h - pinfo->line_h;
+ pos.y = txt_pos.y + max_line_h - pinfo->line_h - (max_baseline - pinfo->font->base_line);
label_draw_dsc.color = lv_span_get_style_text_color(obj, pinfo->span);
label_draw_dsc.opa = lv_span_get_style_text_opa(obj, pinfo->span);
label_draw_dsc.font = lv_span_get_style_text_font(obj, pinfo->span);
@@ -963,13 +983,6 @@ static void lv_draw_span(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx)
}
}
- if(ellipsis_valid && i == item_cnt - 1 && pos.x <= ellipsis_width) {
- for(int ell = 0; ell < 3; ell++) {
- lv_draw_letter(draw_ctx, &label_draw_dsc, &pos, '.');
- pos.x = pos.x + dot_letter_w + pinfo->letter_space;
- }
- }
-
/* draw decor */
lv_text_decor_t decor = lv_span_get_style_text_decor(obj, pinfo->span);
if(decor != LV_TEXT_DECOR_NONE) {
@@ -1021,8 +1034,8 @@ static void refresh_self_size(lv_obj_t * obj)
{
lv_spangroup_t * spans = (lv_spangroup_t *)obj;
spans->refresh = 1;
- lv_obj_refresh_self_size(obj);
lv_obj_invalidate(obj);
+ lv_obj_refresh_self_size(obj);
}
#endif
diff --git a/src/extra/widgets/span/lv_span.h b/src/extra/widgets/span/lv_span.h
index 418ad87e2..f00d04db7 100644
--- a/src/extra/widgets/span/lv_span.h
+++ b/src/extra/widgets/span/lv_span.h
@@ -50,6 +50,7 @@ typedef struct {
/** Data of label*/
typedef struct {
lv_obj_t obj;
+ int32_t lines;
lv_coord_t indent; /* first line indent */
lv_coord_t cache_w; /* the cache automatically calculates the width */
lv_coord_t cache_h; /* similar cache_w */
@@ -133,6 +134,13 @@ void lv_spangroup_set_indent(lv_obj_t * obj, lv_coord_t indent);
*/
void lv_spangroup_set_mode(lv_obj_t * obj, lv_span_mode_t mode);
+/**
+ * Set lines of the spangroup.
+ * @param obj pointer to a spangroup object.
+ * @param lines max lines that can be displayed in LV_SPAN_MODE_BREAK mode. < 0 means no limit.
+ */
+void lv_spangroup_set_lines(lv_obj_t * obj, int32_t lines);
+
/*=====================
* Getter functions
*====================*/
@@ -185,6 +193,13 @@ lv_coord_t lv_spangroup_get_indent(lv_obj_t * obj);
*/
lv_span_mode_t lv_spangroup_get_mode(lv_obj_t * obj);
+/**
+ * get lines of the spangroup.
+ * @param obj pointer to a spangroup object.
+ * @return the lines value.
+ */
+int32_t lv_spangroup_get_lines(lv_obj_t * obj);
+
/**
* get max line height of all span in the spangroup.
* @param obj pointer to a spangroup object.
diff --git a/src/extra/widgets/spinbox/lv_spinbox.c b/src/extra/widgets/spinbox/lv_spinbox.c
index 72aca7db8..34691053e 100644
--- a/src/extra/widgets/spinbox/lv_spinbox.c
+++ b/src/extra/widgets/spinbox/lv_spinbox.c
@@ -34,6 +34,7 @@ static void lv_spinbox_updatevalue(lv_obj_t * obj);
const lv_obj_class_t lv_spinbox_class = {
.constructor_cb = lv_spinbox_constructor,
.event_cb = lv_spinbox_event,
+ .width_def = LV_DPI_DEF,
.instance_size = sizeof(lv_spinbox_t),
.editable = LV_OBJ_CLASS_EDITABLE_TRUE,
.base_class = &lv_textarea_class
@@ -104,7 +105,6 @@ void lv_spinbox_set_digit_format(lv_obj_t * obj, uint8_t digit_count, uint8_t se
if(digit_count > LV_SPINBOX_MAX_DIGIT_COUNT) digit_count = LV_SPINBOX_MAX_DIGIT_COUNT;
if(separator_position >= digit_count) separator_position = 0;
- if(separator_position > LV_SPINBOX_MAX_DIGIT_COUNT) separator_position = LV_SPINBOX_MAX_DIGIT_COUNT;
if(digit_count < LV_SPINBOX_MAX_DIGIT_COUNT) {
int64_t max_val = lv_pow(10, digit_count);
@@ -157,7 +157,7 @@ void lv_spinbox_set_range(lv_obj_t * obj, int32_t range_min, int32_t range_max)
* @param spinbox pointer to spinbox
* @param pos selected position in spinbox
*/
-void lv_spinbox_set_pos(lv_obj_t * obj, uint8_t pos)
+void lv_spinbox_set_cursor_pos(lv_obj_t * obj, uint8_t pos)
{
LV_ASSERT_OBJ(obj, MY_CLASS);
lv_spinbox_t * spinbox = (lv_spinbox_t *)obj;
@@ -336,7 +336,6 @@ static void lv_spinbox_constructor(const lv_obj_class_t * class_p, lv_obj_t * ob
lv_textarea_set_one_line(obj, true);
lv_textarea_set_cursor_click_pos(obj, true);
- lv_obj_set_width(obj, LV_DPI_DEF);
lv_spinbox_updatevalue(obj);
diff --git a/src/extra/widgets/spinbox/lv_spinbox.h b/src/extra/widgets/spinbox/lv_spinbox.h
index 14c73ba36..1a4bc322f 100644
--- a/src/extra/widgets/spinbox/lv_spinbox.h
+++ b/src/extra/widgets/spinbox/lv_spinbox.h
@@ -105,7 +105,7 @@ void lv_spinbox_set_range(lv_obj_t * obj, int32_t range_min, int32_t range_max);
* @param obj pointer to spinbox
* @param pos selected position in spinbox
*/
-void lv_spinbox_set_pos(lv_obj_t * obj, uint8_t pos);
+void lv_spinbox_set_cursor_pos(lv_obj_t * obj, uint8_t pos);
/**
* Set direction of digit step when clicking an encoder button while in editing mode
@@ -170,6 +170,10 @@ void lv_spinbox_decrement(lv_obj_t * obj);
* MACROS
**********************/
+/* It was ambiguous in MicroPython. See https://github.com/lvgl/lvgl/issues/3301
+ * TODO remove in v9*/
+#define lv_spinbox_set_pos lv_spinbox_set_cursor_pos
+
#endif /*LV_USE_SPINBOX*/
#ifdef __cplusplus
diff --git a/src/extra/widgets/tabview/lv_tabview.c b/src/extra/widgets/tabview/lv_tabview.c
old mode 100644
new mode 100755
index 8ccd143e1..81addc663
--- a/src/extra/widgets/tabview/lv_tabview.c
+++ b/src/extra/widgets/tabview/lv_tabview.c
@@ -121,6 +121,20 @@ lv_obj_t * lv_tabview_add_tab(lv_obj_t * obj, const char * name)
return page;
}
+void lv_tabview_rename_tab(lv_obj_t * obj, uint32_t id, const char * new_name)
+{
+ LV_ASSERT_OBJ(obj, MY_CLASS);
+ lv_tabview_t * tabview = (lv_tabview_t *)obj;
+
+ if(id >= tabview->tab_cnt) return;
+ if(tabview->tab_pos & LV_DIR_HOR) id *= 2;
+
+ lv_mem_free(tabview->map[id]);
+ tabview->map[id] = lv_mem_alloc(strlen(new_name) + 1);
+ strcpy(tabview->map[id], new_name);
+ lv_obj_invalidate(obj);
+}
+
void lv_tabview_set_act(lv_obj_t * obj, uint32_t id, lv_anim_enable_t anim_en)
{
LV_ASSERT_OBJ(obj, MY_CLASS);
@@ -135,14 +149,22 @@ void lv_tabview_set_act(lv_obj_t * obj, uint32_t id, lv_anim_enable_t anim_en)
lv_obj_t * cont = lv_tabview_get_content(obj);
if(cont == NULL) return;
- lv_coord_t gap = lv_obj_get_style_pad_column(cont, LV_PART_MAIN);
- lv_coord_t w = lv_obj_get_content_width(cont);
- if(lv_obj_get_style_base_dir(obj, LV_PART_MAIN) != LV_BASE_DIR_RTL) {
- lv_obj_scroll_to_x(cont, id * (gap + w), anim_en);
+
+ if((tabview->tab_pos & LV_DIR_VER) != 0) {
+ lv_coord_t gap = lv_obj_get_style_pad_column(cont, LV_PART_MAIN);
+ lv_coord_t w = lv_obj_get_content_width(cont);
+ if(lv_obj_get_style_base_dir(obj, LV_PART_MAIN) != LV_BASE_DIR_RTL) {
+ lv_obj_scroll_to_x(cont, id * (gap + w), anim_en);
+ }
+ else {
+ int32_t id_rtl = -(int32_t)id;
+ lv_obj_scroll_to_x(cont, (gap + w) * id_rtl, anim_en);
+ }
}
else {
- int32_t id_rtl = -(int32_t)id;
- lv_obj_scroll_to_x(cont, (gap + w) * id_rtl, anim_en);
+ lv_coord_t gap = lv_obj_get_style_pad_row(cont, LV_PART_MAIN);
+ lv_coord_t h = lv_obj_get_content_height(cont);
+ lv_obj_scroll_to_y(cont, id * (gap + h), anim_en);
}
lv_obj_t * btns = lv_tabview_get_tab_btns(obj);
@@ -229,8 +251,14 @@ static void lv_tabview_constructor(const lv_obj_class_t * class_p, lv_obj_t * ob
lv_group_t * g = lv_group_get_default();
if(g) lv_group_add_obj(g, btnm);
- lv_obj_set_flex_flow(cont, LV_FLEX_FLOW_ROW);
- lv_obj_set_scroll_snap_x(cont, LV_SCROLL_SNAP_CENTER);
+ if((tabview->tab_pos & LV_DIR_VER) != 0) {
+ lv_obj_set_flex_flow(cont, LV_FLEX_FLOW_ROW);
+ lv_obj_set_scroll_snap_x(cont, LV_SCROLL_SNAP_CENTER);
+ }
+ else {
+ lv_obj_set_flex_flow(cont, LV_FLEX_FLOW_COLUMN);
+ lv_obj_set_scroll_snap_y(cont, LV_SCROLL_SNAP_CENTER);
+ }
lv_obj_add_flag(cont, LV_OBJ_FLAG_SCROLL_ONE);
lv_obj_clear_flag(cont, LV_OBJ_FLAG_SCROLL_ON_FOCUS);
}
@@ -289,18 +317,29 @@ static void cont_scroll_end_event_cb(lv_event_t * e)
lv_event_code_t code = lv_event_get_code(e);
lv_obj_t * tv = lv_obj_get_parent(cont);
+ lv_tabview_t * tv_obj = (lv_tabview_t *)tv;
if(code == LV_EVENT_LAYOUT_CHANGED) {
lv_tabview_set_act(tv, lv_tabview_get_tab_act(tv), LV_ANIM_OFF);
}
else if(code == LV_EVENT_SCROLL_END) {
+ lv_indev_t * indev = lv_indev_get_act();
+ if(indev && indev->proc.state == LV_INDEV_STATE_PRESSED) {
+ return;
+ }
+
lv_point_t p;
lv_obj_get_scroll_end(cont, &p);
- lv_coord_t w = lv_obj_get_content_width(cont);
lv_coord_t t;
-
- if(lv_obj_get_style_base_dir(tv, LV_PART_MAIN) == LV_BASE_DIR_RTL) t = -(p.x - w / 2) / w;
- else t = (p.x + w / 2) / w;
+ if((tv_obj->tab_pos & LV_DIR_VER) != 0) {
+ lv_coord_t w = lv_obj_get_content_width(cont);
+ if(lv_obj_get_style_base_dir(tv, LV_PART_MAIN) == LV_BASE_DIR_RTL) t = -(p.x - w / 2) / w;
+ else t = (p.x + w / 2) / w;
+ }
+ else {
+ lv_coord_t h = lv_obj_get_content_height(cont);
+ t = (p.y + h / 2) / h;
+ }
if(t < 0) t = 0;
bool new_tab = false;
diff --git a/src/extra/widgets/tabview/lv_tabview.h b/src/extra/widgets/tabview/lv_tabview.h
index a01c6b9ba..388c65477 100644
--- a/src/extra/widgets/tabview/lv_tabview.h
+++ b/src/extra/widgets/tabview/lv_tabview.h
@@ -42,6 +42,8 @@ lv_obj_t * lv_tabview_create(lv_obj_t * parent, lv_dir_t tab_pos, lv_coord_t tab
lv_obj_t * lv_tabview_add_tab(lv_obj_t * tv, const char * name);
+void lv_tabview_rename_tab(lv_obj_t * obj, uint32_t tab_id, const char * new_name);
+
lv_obj_t * lv_tabview_get_content(lv_obj_t * tv);
lv_obj_t * lv_tabview_get_tab_btns(lv_obj_t * tv);
diff --git a/src/extra/widgets/tileview/lv_tileview.c b/src/extra/widgets/tileview/lv_tileview.c
index 4f98b552a..17fdb519a 100644
--- a/src/extra/widgets/tileview/lv_tileview.c
+++ b/src/extra/widgets/tileview/lv_tileview.c
@@ -7,6 +7,7 @@
* INCLUDES
*********************/
#include "lv_tileview.h"
+#include "../../../core/lv_indev.h"
#if LV_USE_TILEVIEW
/*********************
@@ -157,6 +158,11 @@ static void tileview_event_cb(lv_event_t * e)
lv_tileview_t * tv = (lv_tileview_t *) obj;
if(code == LV_EVENT_SCROLL_END) {
+ lv_indev_t * indev = lv_indev_get_act();
+ if(indev && indev->proc.state == LV_INDEV_STATE_PRESSED) {
+ return;
+ }
+
lv_coord_t w = lv_obj_get_content_width(obj);
lv_coord_t h = lv_obj_get_content_height(obj);
diff --git a/src/font/lv_font.c b/src/font/lv_font.c
index 0e7a2fe74..d4cc27e19 100644
--- a/src/font/lv_font.c
+++ b/src/font/lv_font.c
@@ -43,7 +43,7 @@
/**
* Return with the bitmap of a font.
* @param font_p pointer to a font
- * @param letter an UNICODE character code
+ * @param letter a UNICODE character code
* @return pointer to the bitmap of the letter
*/
const uint8_t * lv_font_get_glyph_bitmap(const lv_font_t * font_p, uint32_t letter)
@@ -56,7 +56,7 @@ const uint8_t * lv_font_get_glyph_bitmap(const lv_font_t * font_p, uint32_t lett
* Get the descriptor of a glyph
* @param font_p pointer to font
* @param dsc_out store the result descriptor here
- * @param letter an UNICODE letter code
+ * @param letter a UNICODE letter code
* @param letter_next the next letter after `letter`. Used for kerning
* @return true: descriptor is successfully loaded into `dsc_out`.
* false: the letter was not found, no data is loaded to `dsc_out`
@@ -64,26 +64,72 @@ const uint8_t * lv_font_get_glyph_bitmap(const lv_font_t * font_p, uint32_t lett
bool lv_font_get_glyph_dsc(const lv_font_t * font_p, lv_font_glyph_dsc_t * dsc_out, uint32_t letter,
uint32_t letter_next)
{
+
LV_ASSERT_NULL(font_p);
LV_ASSERT_NULL(dsc_out);
- dsc_out->resolved_font = NULL;
+
+#if LV_USE_FONT_PLACEHOLDER
+ const lv_font_t * placeholder_font = NULL;
+#endif
+
const lv_font_t * f = font_p;
- bool found = false;
+
+ dsc_out->resolved_font = NULL;
+
while(f) {
- found = f->get_glyph_dsc(f, dsc_out, letter, letter_next);
- if(found && !dsc_out->is_placeholder) {
- dsc_out->resolved_font = f;
- break;
+ bool found = f->get_glyph_dsc(f, dsc_out, letter, letter_next);
+ if(found) {
+ if(!dsc_out->is_placeholder) {
+ dsc_out->resolved_font = f;
+ return true;
+ }
+#if LV_USE_FONT_PLACEHOLDER
+ else if(placeholder_font == NULL) {
+ placeholder_font = f;
+ }
+#endif
}
f = f->fallback;
}
- return found;
+
+#if LV_USE_FONT_PLACEHOLDER
+ if(placeholder_font != NULL) {
+ placeholder_font->get_glyph_dsc(placeholder_font, dsc_out, letter, letter_next);
+ dsc_out->resolved_font = placeholder_font;
+ return true;
+ }
+#endif
+
+ if(letter < 0x20 ||
+ letter == 0xf8ff || /*LV_SYMBOL_DUMMY*/
+ letter == 0x200c) { /*ZERO WIDTH NON-JOINER*/
+ dsc_out->box_w = 0;
+ dsc_out->adv_w = 0;
+ }
+ else {
+#if LV_USE_FONT_PLACEHOLDER
+ dsc_out->box_w = font_p->line_height / 2;
+ dsc_out->adv_w = dsc_out->box_w + 2;
+#else
+ dsc_out->box_w = 0;
+ dsc_out->adv_w = 0;
+#endif
+ }
+
+ dsc_out->resolved_font = NULL;
+ dsc_out->box_h = font_p->line_height;
+ dsc_out->ofs_x = 0;
+ dsc_out->ofs_y = 0;
+ dsc_out->bpp = 1;
+ dsc_out->is_placeholder = true;
+
+ return false;
}
/**
* Get the width of a glyph with kerning
* @param font pointer to a font
- * @param letter an UNICODE letter
+ * @param letter a UNICODE letter
* @param letter_next the next letter after `letter`. Used for kerning
* @return the width of the glyph
*/
@@ -91,10 +137,8 @@ uint16_t lv_font_get_glyph_width(const lv_font_t * font, uint32_t letter, uint32
{
LV_ASSERT_NULL(font);
lv_font_glyph_dsc_t g;
- bool ret;
- ret = lv_font_get_glyph_dsc(font, &g, letter, letter_next);
- if(ret) return g.adv_w;
- else return 0;
+ lv_font_get_glyph_dsc(font, &g, letter, letter_next);
+ return g.adv_w;
}
/**********************
diff --git a/src/font/lv_font.h b/src/font/lv_font.h
index 3d716dd46..e3b670c87 100644
--- a/src/font/lv_font.h
+++ b/src/font/lv_font.h
@@ -25,6 +25,9 @@ extern "C" {
* DEFINES
*********************/
+/* imgfont identifier */
+#define LV_IMGFONT_BPP 9
+
/**********************
* TYPEDEFS
**********************/
@@ -37,7 +40,7 @@ struct _lv_font_t;
/** Describes the properties of a glyph.*/
typedef struct {
const struct _lv_font_t *
- resolved_font; /**< Pointer to a font where the gylph was actually found after handling fallbacks*/
+ resolved_font; /**< Pointer to a font where the glyph was actually found after handling fallbacks*/
uint16_t adv_w; /**< The glyph needs this space. Draw the next glyph after this width.*/
uint16_t box_w; /**< Width of the glyph's bounding box*/
uint16_t box_h; /**< Height of the glyph's bounding box*/
@@ -87,7 +90,7 @@ typedef struct _lv_font_t {
/**
* Return with the bitmap of a font.
* @param font_p pointer to a font
- * @param letter an UNICODE character code
+ * @param letter a UNICODE character code
* @return pointer to the bitmap of the letter
*/
const uint8_t * lv_font_get_glyph_bitmap(const lv_font_t * font_p, uint32_t letter);
@@ -96,7 +99,7 @@ const uint8_t * lv_font_get_glyph_bitmap(const lv_font_t * font_p, uint32_t lett
* Get the descriptor of a glyph
* @param font_p pointer to font
* @param dsc_out store the result descriptor here
- * @param letter an UNICODE letter code
+ * @param letter a UNICODE letter code
* @param letter_next the next letter after `letter`. Used for kerning
* @return true: descriptor is successfully loaded into `dsc_out`.
* false: the letter was not found, no data is loaded to `dsc_out`
@@ -107,7 +110,7 @@ bool lv_font_get_glyph_dsc(const lv_font_t * font_p, lv_font_glyph_dsc_t * dsc_o
/**
* Get the width of a glyph with kerning
* @param font pointer to a font
- * @param letter an UNICODE letter
+ * @param letter a UNICODE letter
* @param letter_next the next letter after `letter`. Used for kerning
* @return the width of the glyph
*/
@@ -243,7 +246,7 @@ LV_FONT_CUSTOM_DECLARE
#endif
/**
- * Just a wrapper around LV_FONT_DEFAULT because it might be more convenient to use a function is some cases
+ * Just a wrapper around LV_FONT_DEFAULT because it might be more convenient to use a function in some cases
* @return pointer to LV_FONT_DEFAULT
*/
static inline const lv_font_t * lv_font_default(void)
diff --git a/src/font/lv_font_fmt_txt.c b/src/font/lv_font_fmt_txt.c
index 452cbe912..7a36f01b8 100644
--- a/src/font/lv_font_fmt_txt.c
+++ b/src/font/lv_font_fmt_txt.c
@@ -73,7 +73,7 @@ static int32_t kern_pair_16_compare(const void * ref, const void * element);
/**
* Used as `get_glyph_bitmap` callback in LittelvGL's native font format if the font is uncompressed.
* @param font pointer to font
- * @param unicode_letter an unicode letter which bitmap should be get
+ * @param unicode_letter a unicode letter which bitmap should be get
* @return pointer to the bitmap or NULL if not found
*/
const uint8_t * lv_font_get_bitmap_fmt_txt(const lv_font_t * font, uint32_t unicode_letter)
@@ -141,7 +141,7 @@ const uint8_t * lv_font_get_bitmap_fmt_txt(const lv_font_t * font, uint32_t unic
* Used as `get_glyph_dsc` callback in LittelvGL's native font format if the font is uncompressed.
* @param font_p pointer to font
* @param dsc_out store the result descriptor here
- * @param letter an UNICODE letter code
+ * @param letter a UNICODE letter code
* @return true: descriptor is successfully loaded into `dsc_out`.
* false: the letter was not found, no data is loaded to `dsc_out`
*/
diff --git a/src/font/lv_font_fmt_txt.h b/src/font/lv_font_fmt_txt.h
index 9c9d422a8..86546a35f 100644
--- a/src/font/lv_font_fmt_txt.h
+++ b/src/font/lv_font_fmt_txt.h
@@ -170,7 +170,7 @@ typedef struct {
/**
* Store kerning values.
- * Can be `lv_font_fmt_txt_kern_pair_t * or `lv_font_kern_classes_fmt_txt_t *`
+ * Can be `lv_font_fmt_txt_kern_pair_t * or `lv_font_kern_classes_fmt_txt_t *`
* depending on `kern_classes`
*/
const void * kern_dsc;
@@ -204,7 +204,7 @@ typedef struct {
/**
* Used as `get_glyph_bitmap` callback in LittelvGL's native font format if the font is uncompressed.
* @param font pointer to font
- * @param unicode_letter an unicode letter which bitmap should be get
+ * @param unicode_letter a unicode letter which bitmap should be get
* @return pointer to the bitmap or NULL if not found
*/
const uint8_t * lv_font_get_bitmap_fmt_txt(const lv_font_t * font, uint32_t letter);
@@ -213,7 +213,7 @@ const uint8_t * lv_font_get_bitmap_fmt_txt(const lv_font_t * font, uint32_t lett
* Used as `get_glyph_dsc` callback in LittelvGL's native font format if the font is uncompressed.
* @param font_p pointer to font
* @param dsc_out store the result descriptor here
- * @param letter an UNICODE letter code
+ * @param letter a UNICODE letter code
* @return true: descriptor is successfully loaded into `dsc_out`.
* false: the letter was not found, no data is loaded to `dsc_out`
*/
diff --git a/src/gpu/lv_gpu.mk b/src/gpu/lv_gpu.mk
deleted file mode 100644
index f810e0c70..000000000
--- a/src/gpu/lv_gpu.mk
+++ /dev/null
@@ -1,10 +0,0 @@
-CSRCS += lv_gpu_nxp_pxp.c
-CSRCS += lv_gpu_nxp_pxp_osa.c
-CSRCS += lv_gpu_nxp_vglite.c
-CSRCS += lv_gpu_stm32_dma2d.c
-
-DEPPATH += --dep-path $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/gpu
-VPATH += :$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/gpu
-
-CFLAGS += "-I$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/gpu"
-
diff --git a/src/hal/lv_hal_disp.c b/src/hal/lv_hal_disp.c
index 9a8e42d28..0dd8f6b30 100644
--- a/src/hal/lv_hal_disp.c
+++ b/src/hal/lv_hal_disp.c
@@ -21,6 +21,11 @@
#include "../draw/sw/lv_draw_sw.h"
#include "../draw/sdl/lv_draw_sdl.h"
#include "../draw/stm32_dma2d/lv_gpu_stm32_dma2d.h"
+#include "../draw/swm341_dma2d/lv_gpu_swm341_dma2d.h"
+#include "../draw/arm2d/lv_gpu_arm2d.h"
+#if LV_USE_GPU_NXP_PXP || LV_USE_GPU_NXP_VG_LITE
+ #include "../draw/nxp/lv_gpu_nxp.h"
+#endif
#if LV_USE_THEME_DEFAULT
#include "../extra/themes/default/lv_theme_default.h"
@@ -87,7 +92,7 @@ void lv_disp_drv_init(lv_disp_drv_t * driver)
driver->offset_x = 0;
driver->offset_y = 0;
driver->antialiasing = LV_COLOR_DEPTH > 8 ? 1 : 0;
- driver->screen_transp = LV_COLOR_SCREEN_TRANSP;
+ driver->screen_transp = 0;
driver->dpi = LV_DPI_DEF;
driver->color_chroma_key = LV_COLOR_CHROMA_KEY;
@@ -96,18 +101,22 @@ void lv_disp_drv_init(lv_disp_drv_t * driver)
driver->draw_ctx_init = lv_draw_stm32_dma2d_ctx_init;
driver->draw_ctx_deinit = lv_draw_stm32_dma2d_ctx_init;
driver->draw_ctx_size = sizeof(lv_draw_stm32_dma2d_ctx_t);
-#elif LV_USE_GPU_NXP_PXP
- driver->draw_ctx_init = lv_draw_nxp_pxp_init;
- driver->draw_ctx_deinit = lv_draw_nxp_pxp_init;
- driver->draw_ctx_size = sizeof(lv_draw_nxp_pxp_t);
-#elif LV_USE_GPU_NXP_VG_LITE
- driver->draw_ctx_init = lv_draw_nxp_vglite_init;
- driver->draw_ctx_deinit = lv_draw_nxp_vglite_init;
- driver->draw_ctx_size = sizeof(lv_draw_nxp_vglite_t);
+#elif LV_USE_GPU_SWM341_DMA2D
+ driver->draw_ctx_init = lv_draw_swm341_dma2d_ctx_init;
+ driver->draw_ctx_deinit = lv_draw_swm341_dma2d_ctx_init;
+ driver->draw_ctx_size = sizeof(lv_draw_swm341_dma2d_ctx_t);
+#elif LV_USE_GPU_NXP_PXP || LV_USE_GPU_NXP_VG_LITE
+ driver->draw_ctx_init = lv_draw_nxp_ctx_init;
+ driver->draw_ctx_deinit = lv_draw_nxp_ctx_deinit;
+ driver->draw_ctx_size = sizeof(lv_draw_nxp_ctx_t);
#elif LV_USE_GPU_SDL
driver->draw_ctx_init = lv_draw_sdl_init_ctx;
driver->draw_ctx_deinit = lv_draw_sdl_deinit_ctx;
driver->draw_ctx_size = sizeof(lv_draw_sdl_ctx_t);
+#elif LV_USE_GPU_ARM2D
+ driver->draw_ctx_init = lv_draw_arm2d_ctx_init;
+ driver->draw_ctx_deinit = lv_draw_arm2d_ctx_init;
+ driver->draw_ctx_size = sizeof(lv_draw_arm2d_ctx_t);
#else
driver->draw_ctx_init = lv_draw_sw_init_ctx;
driver->draw_ctx_deinit = lv_draw_sw_init_ctx;
@@ -150,8 +159,8 @@ void lv_disp_draw_buf_init(lv_disp_draw_buf_t * draw_buf, void * buf1, void * bu
lv_disp_t * lv_disp_drv_register(lv_disp_drv_t * driver)
{
lv_disp_t * disp = _lv_ll_ins_head(&LV_GC_ROOT(_lv_disp_ll));
+ LV_ASSERT_MALLOC(disp);
if(!disp) {
- LV_ASSERT_MALLOC(disp);
return NULL;
}
@@ -168,6 +177,8 @@ lv_disp_t * lv_disp_drv_register(lv_disp_drv_t * driver)
disp->driver = driver;
+ disp->inv_en_cnt = 1;
+
lv_disp_t * disp_def_tmp = disp_def;
disp_def = disp; /*Temporarily change the default screen to create the default screens on the
new display*/
@@ -497,18 +508,6 @@ lv_coord_t lv_disp_get_dpi(const lv_disp_t * disp)
*/
LV_ATTRIBUTE_FLUSH_READY void lv_disp_flush_ready(lv_disp_drv_t * disp_drv)
{
- /*If the screen is transparent initialize it when the flushing is ready*/
-#if LV_COLOR_SCREEN_TRANSP
- if(disp_drv->screen_transp) {
- if(disp_drv->clear_cb) {
- disp_drv->clear_cb(disp_drv, disp_drv->draw_buf->buf_act, disp_drv->draw_buf->size);
- }
- else {
- lv_memset_00(disp_drv->draw_buf->buf_act, disp_drv->draw_buf->size * sizeof(lv_color32_t));
- }
- }
-#endif
-
disp_drv->draw_buf->flushing = 0;
disp_drv->draw_buf->flushing_last = 0;
}
@@ -677,28 +676,35 @@ static void set_px_alpha_generic(lv_img_dsc_t * d, lv_coord_t x, lv_coord_t y, l
lv_img_buf_set_px_alpha(d, x, y, br);
}
-static void set_px_true_color_alpha(lv_disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x,
- lv_coord_t y,
+static void set_px_true_color_alpha(lv_disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w,
+ lv_coord_t x, lv_coord_t y,
lv_color_t color, lv_opa_t opa)
{
(void) disp_drv; /*Unused*/
- if(opa <= LV_OPA_MIN) return;
- lv_img_dsc_t d;
- d.data = buf;
- d.header.always_zero = 0;
- d.header.h = 1; /*Doesn't matter*/;
- d.header.w = buf_w;
- d.header.cf = LV_IMG_CF_TRUE_COLOR_ALPHA;
-
- lv_color_t bg_color = lv_img_buf_get_px_color(&d, x, y, lv_color_black());
- lv_opa_t bg_opa = lv_img_buf_get_px_alpha(&d, x, y);
+ uint8_t * buf_px = buf + (buf_w * y * LV_IMG_PX_SIZE_ALPHA_BYTE + x * LV_IMG_PX_SIZE_ALPHA_BYTE);
- lv_opa_t res_opa;
+ lv_color_t bg_color;
lv_color_t res_color;
+ lv_opa_t bg_opa = buf_px[LV_IMG_PX_SIZE_ALPHA_BYTE - 1];
+#if LV_COLOR_DEPTH == 8 || LV_COLOR_DEPTH == 1
+ bg_color.full = buf_px[0];
+ lv_color_mix_with_alpha(bg_color, bg_opa, color, opa, &res_color, &buf_px[2]);
+ if(buf_px[1] <= LV_OPA_MIN) return;
+ buf_px[0] = res_color.full;
+#elif LV_COLOR_DEPTH == 16
+ bg_color.full = buf_px[0] + (buf_px[1] << 8);
+ lv_color_mix_with_alpha(bg_color, bg_opa, color, opa, &res_color, &buf_px[2]);
+ if(buf_px[2] <= LV_OPA_MIN) return;
+ buf_px[0] = res_color.full & 0xff;
+ buf_px[1] = res_color.full >> 8;
+#elif LV_COLOR_DEPTH == 32
+ bg_color = *((lv_color_t *)buf_px);
+ lv_color_mix_with_alpha(bg_color, bg_opa, color, opa, &res_color, &buf_px[3]);
+ if(buf_px[3] <= LV_OPA_MIN) return;
+ buf_px[0] = res_color.ch.blue;
+ buf_px[1] = res_color.ch.green;
+ buf_px[2] = res_color.ch.red;
+#endif
- lv_color_mix_with_alpha(bg_color, bg_opa, color, opa, &res_color, &res_opa);
-
- lv_img_buf_set_px_alpha(&d, x, y, res_opa);
- lv_img_buf_set_px_color(&d, x, y, res_color);
}
diff --git a/src/hal/lv_hal_disp.h b/src/hal/lv_hal_disp.h
index 6abbab1f9..d3425fe4e 100644
--- a/src/hal/lv_hal_disp.h
+++ b/src/hal/lv_hal_disp.h
@@ -133,6 +133,9 @@ typedef struct _lv_disp_drv_t {
/** OPTIONAL: called when driver parameters are updated */
void (*drv_update_cb)(struct _lv_disp_drv_t * disp_drv);
+ /** OPTIONAL: called when start rendering */
+ void (*render_start_cb)(struct _lv_disp_drv_t * disp_drv);
+
/** On CHROMA_KEYED images this color will be transparent.
* `LV_COLOR_CHROMA_KEY` by default. (lv_conf.h)*/
lv_color_t color_chroma_key;
@@ -170,8 +173,11 @@ typedef struct _lv_disp_t {
struct _lv_obj_t * top_layer; /**< @see lv_disp_get_layer_top*/
struct _lv_obj_t * sys_layer; /**< @see lv_disp_get_layer_sys*/
uint32_t screen_cnt;
+uint8_t draw_prev_over_act :
+ 1; /**< 1: Draw previous screen over active screen*/
uint8_t del_prev :
1; /**< 1: Automatically delete the previous screen when the screen load animation is ready*/
+ uint8_t rendering_in_progress : 1; /**< 1: The current screen rendering is in progress*/
lv_opa_t bg_opa; /**disp == NULL) driver->disp = lv_disp_get_default();
if(driver->disp == NULL) {
@@ -85,8 +84,8 @@ lv_indev_t * lv_indev_drv_register(lv_indev_drv_t * driver)
}
lv_indev_t * indev = _lv_ll_ins_head(&LV_GC_ROOT(_lv_indev_ll));
+ LV_ASSERT_MALLOC(indev);
if(!indev) {
- LV_ASSERT_MALLOC(indev);
return NULL;
}
diff --git a/src/lv_conf_internal.h b/src/lv_conf_internal.h
index f045c32a9..97807fe37 100644
--- a/src/lv_conf_internal.h
+++ b/src/lv_conf_internal.h
@@ -40,6 +40,11 @@
#else
#include "../../lv_conf.h" /*Else assume lv_conf.h is next to the lvgl folder*/
#endif
+ #if !defined(LV_CONF_H) && !defined(LV_CONF_SUPPRESS_DEFINE_CHECK)
+ /* #include will sometimes silently fail when __has_include is used */
+ /* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80753 */
+ #pragma message("Possible failure to include lv_conf.h, please read the comment in this file if you get errors")
+ #endif
#endif
#ifdef CONFIG_LV_COLOR_DEPTH
@@ -74,9 +79,9 @@
#endif
#endif
-/*Enable more complex drawing routines to manage screens transparency.
- *Can be used if the UI is above another layer, e.g. an OSD menu or video player.
- *Requires `LV_COLOR_DEPTH = 32` colors and the screen's `bg_opa` should be set to non LV_OPA_COVER value*/
+/*Enable features to draw on transparent background.
+ *It's required if opa, and transform_* style properties are used.
+ *Can be also used if the UI is above another layer, e.g. an OSD menu or video player.*/
#ifndef LV_COLOR_SCREEN_TRANSP
#ifdef CONFIG_LV_COLOR_SCREEN_TRANSP
#define LV_COLOR_SCREEN_TRANSP CONFIG_LV_COLOR_SCREEN_TRANSP
@@ -91,7 +96,7 @@
#ifdef CONFIG_LV_COLOR_MIX_ROUND_OFS
#define LV_COLOR_MIX_ROUND_OFS CONFIG_LV_COLOR_MIX_ROUND_OFS
#else
- #define LV_COLOR_MIX_ROUND_OFS (LV_COLOR_DEPTH == 32 ? 0: 128)
+ #define LV_COLOR_MIX_ROUND_OFS 0
#endif
#endif
@@ -136,8 +141,20 @@
#endif
/*Instead of an address give a memory allocator that will be called to get a memory pool for LVGL. E.g. my_malloc*/
#if LV_MEM_ADR == 0
- //#define LV_MEM_POOL_INCLUDE your_alloc_library /* Uncomment if using an external allocator*/
- //#define LV_MEM_POOL_ALLOC your_alloc /* Uncomment if using an external allocator*/
+ #ifndef LV_MEM_POOL_INCLUDE
+ #ifdef CONFIG_LV_MEM_POOL_INCLUDE
+ #define LV_MEM_POOL_INCLUDE CONFIG_LV_MEM_POOL_INCLUDE
+ #else
+ #undef LV_MEM_POOL_INCLUDE
+ #endif
+ #endif
+ #ifndef LV_MEM_POOL_ALLOC
+ #ifdef CONFIG_LV_MEM_POOL_ALLOC
+ #define LV_MEM_POOL_ALLOC CONFIG_LV_MEM_POOL_ALLOC
+ #else
+ #undef LV_MEM_POOL_ALLOC
+ #endif
+ #endif
#endif
#else /*LV_MEM_CUSTOM*/
@@ -295,6 +312,34 @@
#endif
#endif /*LV_DRAW_COMPLEX*/
+/**
+ * "Simple layers" are used when a widget has `style_opa < 255` to buffer the widget into a layer
+ * and blend it as an image with the given opacity.
+ * Note that `bg_opa`, `text_opa` etc don't require buffering into layer)
+ * The widget can be buffered in smaller chunks to avoid using large buffers.
+ *
+ * - LV_LAYER_SIMPLE_BUF_SIZE: [bytes] the optimal target buffer size. LVGL will try to allocate it
+ * - LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE: [bytes] used if `LV_LAYER_SIMPLE_BUF_SIZE` couldn't be allocated.
+ *
+ * Both buffer sizes are in bytes.
+ * "Transformed layers" (where transform_angle/zoom properties are used) use larger buffers
+ * and can't be drawn in chunks. So these settings affects only widgets with opacity.
+ */
+#ifndef LV_LAYER_SIMPLE_BUF_SIZE
+ #ifdef CONFIG_LV_LAYER_SIMPLE_BUF_SIZE
+ #define LV_LAYER_SIMPLE_BUF_SIZE CONFIG_LV_LAYER_SIMPLE_BUF_SIZE
+ #else
+ #define LV_LAYER_SIMPLE_BUF_SIZE (24 * 1024)
+ #endif
+#endif
+#ifndef LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE
+ #ifdef CONFIG_LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE
+ #define LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE CONFIG_LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE
+ #else
+ #define LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE (3 * 1024)
+ #endif
+#endif
+
/*Default image cache size. Image caching keeps the images opened.
*If only the built-in image formats are used there is no real advantage of caching. (I.e. if no new image decoder is added)
*With complex image decoders (e.g. PNG or JPG) caching can save the continuous open/decode of images.
@@ -304,7 +349,7 @@
#ifdef CONFIG_LV_IMG_CACHE_DEF_SIZE
#define LV_IMG_CACHE_DEF_SIZE CONFIG_LV_IMG_CACHE_DEF_SIZE
#else
- #define LV_IMG_CACHE_DEF_SIZE 0
+ #define LV_IMG_CACHE_DEF_SIZE 0
#endif
#endif
@@ -314,7 +359,7 @@
#ifdef CONFIG_LV_GRADIENT_MAX_STOPS
#define LV_GRADIENT_MAX_STOPS CONFIG_LV_GRADIENT_MAX_STOPS
#else
- #define LV_GRADIENT_MAX_STOPS 2
+ #define LV_GRADIENT_MAX_STOPS 2
#endif
#endif
@@ -327,7 +372,7 @@
#ifdef CONFIG_LV_GRAD_CACHE_DEF_SIZE
#define LV_GRAD_CACHE_DEF_SIZE CONFIG_LV_GRAD_CACHE_DEF_SIZE
#else
- #define LV_GRAD_CACHE_DEF_SIZE 0
+ #define LV_GRAD_CACHE_DEF_SIZE 0
#endif
#endif
@@ -338,7 +383,7 @@
#ifdef CONFIG_LV_DITHER_GRADIENT
#define LV_DITHER_GRADIENT CONFIG_LV_DITHER_GRADIENT
#else
- #define LV_DITHER_GRADIENT 0
+ #define LV_DITHER_GRADIENT 0
#endif
#endif
#if LV_DITHER_GRADIENT
@@ -349,7 +394,7 @@
#ifdef CONFIG_LV_DITHER_ERROR_DIFFUSION
#define LV_DITHER_ERROR_DIFFUSION CONFIG_LV_DITHER_ERROR_DIFFUSION
#else
- #define LV_DITHER_ERROR_DIFFUSION 0
+ #define LV_DITHER_ERROR_DIFFUSION 0
#endif
#endif
#endif
@@ -368,6 +413,15 @@
* GPU
*-----------*/
+/*Use Arm's 2D acceleration library Arm-2D */
+#ifndef LV_USE_GPU_ARM2D
+ #ifdef CONFIG_LV_USE_GPU_ARM2D
+ #define LV_USE_GPU_ARM2D CONFIG_LV_USE_GPU_ARM2D
+ #else
+ #define LV_USE_GPU_ARM2D 0
+ #endif
+#endif
+
/*Use STM32's DMA2D (aka Chrom Art) GPU*/
#ifndef LV_USE_GPU_STM32_DMA2D
#ifdef CONFIG_LV_USE_GPU_STM32_DMA2D
@@ -388,6 +442,24 @@
#endif
#endif
+/*Use SWM341's DMA2D GPU*/
+#ifndef LV_USE_GPU_SWM341_DMA2D
+ #ifdef CONFIG_LV_USE_GPU_SWM341_DMA2D
+ #define LV_USE_GPU_SWM341_DMA2D CONFIG_LV_USE_GPU_SWM341_DMA2D
+ #else
+ #define LV_USE_GPU_SWM341_DMA2D 0
+ #endif
+#endif
+#if LV_USE_GPU_SWM341_DMA2D
+ #ifndef LV_GPU_SWM341_DMA2D_INCLUDE
+ #ifdef CONFIG_LV_GPU_SWM341_DMA2D_INCLUDE
+ #define LV_GPU_SWM341_DMA2D_INCLUDE CONFIG_LV_GPU_SWM341_DMA2D_INCLUDE
+ #else
+ #define LV_GPU_SWM341_DMA2D_INCLUDE "SWM341.h"
+ #endif
+ #endif
+#endif
+
/*Use NXP's PXP GPU iMX RTxxx platforms*/
#ifndef LV_USE_GPU_NXP_PXP
#ifdef CONFIG_LV_USE_GPU_NXP_PXP
@@ -1153,6 +1225,19 @@
#endif
#endif
+/*Enable drawing placeholders when glyph dsc is not found*/
+#ifndef LV_USE_FONT_PLACEHOLDER
+ #ifdef _LV_KCONFIG_PRESENT
+ #ifdef CONFIG_LV_USE_FONT_PLACEHOLDER
+ #define LV_USE_FONT_PLACEHOLDER CONFIG_LV_USE_FONT_PLACEHOLDER
+ #else
+ #define LV_USE_FONT_PLACEHOLDER 0
+ #endif
+ #else
+ #define LV_USE_FONT_PLACEHOLDER 1
+ #endif
+#endif
+
/*=================
* TEXT SETTINGS
*=================*/
@@ -1271,18 +1356,6 @@
#endif
#endif
-#ifndef LV_USE_ANIMIMG
- #ifdef _LV_KCONFIG_PRESENT
- #ifdef CONFIG_LV_USE_ANIMIMG
- #define LV_USE_ANIMIMG CONFIG_LV_USE_ANIMIMG
- #else
- #define LV_USE_ANIMIMG 0
- #endif
- #else
- #define LV_USE_ANIMIMG 1
- #endif
-#endif
-
#ifndef LV_USE_BAR
#ifdef _LV_KCONFIG_PRESENT
#ifdef CONFIG_LV_USE_BAR
@@ -1500,6 +1573,18 @@
/*-----------
* Widgets
*----------*/
+#ifndef LV_USE_ANIMIMG
+ #ifdef _LV_KCONFIG_PRESENT
+ #ifdef CONFIG_LV_USE_ANIMIMG
+ #define LV_USE_ANIMIMG CONFIG_LV_USE_ANIMIMG
+ #else
+ #define LV_USE_ANIMIMG 0
+ #endif
+ #else
+ #define LV_USE_ANIMIMG 1
+ #endif
+#endif
+
#ifndef LV_USE_CALENDAR
#ifdef _LV_KCONFIG_PRESENT
#ifdef CONFIG_LV_USE_CALENDAR
@@ -1676,6 +1761,28 @@
#endif
#endif
+#ifndef LV_USE_SPAN
+ #ifdef _LV_KCONFIG_PRESENT
+ #ifdef CONFIG_LV_USE_SPAN
+ #define LV_USE_SPAN CONFIG_LV_USE_SPAN
+ #else
+ #define LV_USE_SPAN 0
+ #endif
+ #else
+ #define LV_USE_SPAN 1
+ #endif
+#endif
+#if LV_USE_SPAN
+ /*A line text can contain maximum num of span descriptor */
+ #ifndef LV_SPAN_SNIPPET_STACK_SIZE
+ #ifdef CONFIG_LV_SPAN_SNIPPET_STACK_SIZE
+ #define LV_SPAN_SNIPPET_STACK_SIZE CONFIG_LV_SPAN_SNIPPET_STACK_SIZE
+ #else
+ #define LV_SPAN_SNIPPET_STACK_SIZE 64
+ #endif
+ #endif
+#endif
+
#ifndef LV_USE_SPINBOX
#ifdef _LV_KCONFIG_PRESENT
#ifdef CONFIG_LV_USE_SPINBOX
@@ -1736,28 +1843,6 @@
#endif
#endif
-#ifndef LV_USE_SPAN
- #ifdef _LV_KCONFIG_PRESENT
- #ifdef CONFIG_LV_USE_SPAN
- #define LV_USE_SPAN CONFIG_LV_USE_SPAN
- #else
- #define LV_USE_SPAN 0
- #endif
- #else
- #define LV_USE_SPAN 1
- #endif
-#endif
-#if LV_USE_SPAN
- /*A line text can contain maximum num of span descriptor */
- #ifndef LV_SPAN_SNIPPET_STACK_SIZE
- #ifdef CONFIG_LV_SPAN_SNIPPET_STACK_SIZE
- #define LV_SPAN_SNIPPET_STACK_SIZE CONFIG_LV_SPAN_SNIPPET_STACK_SIZE
- #else
- #define LV_SPAN_SNIPPET_STACK_SIZE 64
- #endif
- #endif
-#endif
-
/*-----------
* Themes
*----------*/
@@ -1897,7 +1982,7 @@
#ifdef CONFIG_LV_FS_STDIO_CACHE_SIZE
#define LV_FS_STDIO_CACHE_SIZE CONFIG_LV_FS_STDIO_CACHE_SIZE
#else
- #define LV_FS_STDIO_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/
+ #define LV_FS_STDIO_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/
#endif
#endif
#endif
@@ -1929,7 +2014,7 @@
#ifdef CONFIG_LV_FS_POSIX_CACHE_SIZE
#define LV_FS_POSIX_CACHE_SIZE CONFIG_LV_FS_POSIX_CACHE_SIZE
#else
- #define LV_FS_POSIX_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/
+ #define LV_FS_POSIX_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/
#endif
#endif
#endif
@@ -1947,7 +2032,7 @@
#ifdef CONFIG_LV_FS_WIN32_LETTER
#define LV_FS_WIN32_LETTER CONFIG_LV_FS_WIN32_LETTER
#else
- #define LV_FS_WIN32_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/
+ #define LV_FS_WIN32_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/
#endif
#endif
#ifndef LV_FS_WIN32_PATH
@@ -1971,7 +2056,7 @@
#ifdef CONFIG_LV_USE_FS_FATFS
#define LV_USE_FS_FATFS CONFIG_LV_USE_FS_FATFS
#else
- #define LV_USE_FS_FATFS 0
+ #define LV_USE_FS_FATFS 0
#endif
#endif
#if LV_USE_FS_FATFS
@@ -2099,16 +2184,16 @@
#ifdef CONFIG_LV_USE_FFMPEG
#define LV_USE_FFMPEG CONFIG_LV_USE_FFMPEG
#else
- #define LV_USE_FFMPEG 0
+ #define LV_USE_FFMPEG 0
#endif
#endif
#if LV_USE_FFMPEG
/*Dump input information to stderr*/
- #ifndef LV_FFMPEG_AV_DUMP_FORMAT
- #ifdef CONFIG_LV_FFMPEG_AV_DUMP_FORMAT
- #define LV_FFMPEG_AV_DUMP_FORMAT CONFIG_LV_FFMPEG_AV_DUMP_FORMAT
+ #ifndef LV_FFMPEG_DUMP_FORMAT
+ #ifdef CONFIG_LV_FFMPEG_DUMP_FORMAT
+ #define LV_FFMPEG_DUMP_FORMAT CONFIG_LV_FFMPEG_DUMP_FORMAT
#else
- #define LV_FFMPEG_AV_DUMP_FORMAT 0
+ #define LV_FFMPEG_DUMP_FORMAT 0
#endif
#endif
#endif
@@ -2131,7 +2216,7 @@
#ifdef CONFIG_LV_USE_MONKEY
#define LV_USE_MONKEY CONFIG_LV_USE_MONKEY
#else
- #define LV_USE_MONKEY 0
+ #define LV_USE_MONKEY 0
#endif
#endif
@@ -2140,10 +2225,93 @@
#ifdef CONFIG_LV_USE_GRIDNAV
#define LV_USE_GRIDNAV CONFIG_LV_USE_GRIDNAV
#else
- #define LV_USE_GRIDNAV 0
+ #define LV_USE_GRIDNAV 0
#endif
#endif
+/*1: Enable lv_obj fragment*/
+#ifndef LV_USE_FRAGMENT
+ #ifdef CONFIG_LV_USE_FRAGMENT
+ #define LV_USE_FRAGMENT CONFIG_LV_USE_FRAGMENT
+ #else
+ #define LV_USE_FRAGMENT 0
+ #endif
+#endif
+
+/*1: Support using images as font in label or span widgets */
+#ifndef LV_USE_IMGFONT
+ #ifdef CONFIG_LV_USE_IMGFONT
+ #define LV_USE_IMGFONT CONFIG_LV_USE_IMGFONT
+ #else
+ #define LV_USE_IMGFONT 0
+ #endif
+#endif
+
+/*1: Enable a published subscriber based messaging system */
+#ifndef LV_USE_MSG
+ #ifdef CONFIG_LV_USE_MSG
+ #define LV_USE_MSG CONFIG_LV_USE_MSG
+ #else
+ #define LV_USE_MSG 0
+ #endif
+#endif
+
+/*1: Enable Pinyin input method*/
+/*Requires: lv_keyboard*/
+#ifndef LV_USE_IME_PINYIN
+ #ifdef CONFIG_LV_USE_IME_PINYIN
+ #define LV_USE_IME_PINYIN CONFIG_LV_USE_IME_PINYIN
+ #else
+ #define LV_USE_IME_PINYIN 0
+ #endif
+#endif
+#if LV_USE_IME_PINYIN
+ /*1: Use default thesaurus*/
+ /*If you do not use the default thesaurus, be sure to use `lv_ime_pinyin` after setting the thesauruss*/
+ #ifndef LV_IME_PINYIN_USE_DEFAULT_DICT
+ #ifdef _LV_KCONFIG_PRESENT
+ #ifdef CONFIG_LV_IME_PINYIN_USE_DEFAULT_DICT
+ #define LV_IME_PINYIN_USE_DEFAULT_DICT CONFIG_LV_IME_PINYIN_USE_DEFAULT_DICT
+ #else
+ #define LV_IME_PINYIN_USE_DEFAULT_DICT 0
+ #endif
+ #else
+ #define LV_IME_PINYIN_USE_DEFAULT_DICT 1
+ #endif
+ #endif
+ /*Set the maximum number of candidate panels that can be displayed*/
+ /*This needs to be adjusted according to the size of the screen*/
+ #ifndef LV_IME_PINYIN_CAND_TEXT_NUM
+ #ifdef CONFIG_LV_IME_PINYIN_CAND_TEXT_NUM
+ #define LV_IME_PINYIN_CAND_TEXT_NUM CONFIG_LV_IME_PINYIN_CAND_TEXT_NUM
+ #else
+ #define LV_IME_PINYIN_CAND_TEXT_NUM 6
+ #endif
+ #endif
+
+ /*Use 9 key input(k9)*/
+ #ifndef LV_IME_PINYIN_USE_K9_MODE
+ #ifdef _LV_KCONFIG_PRESENT
+ #ifdef CONFIG_LV_IME_PINYIN_USE_K9_MODE
+ #define LV_IME_PINYIN_USE_K9_MODE CONFIG_LV_IME_PINYIN_USE_K9_MODE
+ #else
+ #define LV_IME_PINYIN_USE_K9_MODE 0
+ #endif
+ #else
+ #define LV_IME_PINYIN_USE_K9_MODE 1
+ #endif
+ #endif
+ #if LV_IME_PINYIN_USE_K9_MODE == 1
+ #ifndef LV_IME_PINYIN_K9_CAND_TEXT_NUM
+ #ifdef CONFIG_LV_IME_PINYIN_K9_CAND_TEXT_NUM
+ #define LV_IME_PINYIN_K9_CAND_TEXT_NUM CONFIG_LV_IME_PINYIN_K9_CAND_TEXT_NUM
+ #else
+ #define LV_IME_PINYIN_K9_CAND_TEXT_NUM 3
+ #endif
+ #endif
+ #endif // LV_IME_PINYIN_USE_K9_MODE
+#endif
+
/*==================
* EXAMPLES
*==================*/
@@ -2170,7 +2338,7 @@
#ifdef CONFIG_LV_USE_DEMO_WIDGETS
#define LV_USE_DEMO_WIDGETS CONFIG_LV_USE_DEMO_WIDGETS
#else
- #define LV_USE_DEMO_WIDGETS 0
+ #define LV_USE_DEMO_WIDGETS 0
#endif
#endif
#if LV_USE_DEMO_WIDGETS
@@ -2178,7 +2346,7 @@
#ifdef CONFIG_LV_DEMO_WIDGETS_SLIDESHOW
#define LV_DEMO_WIDGETS_SLIDESHOW CONFIG_LV_DEMO_WIDGETS_SLIDESHOW
#else
- #define LV_DEMO_WIDGETS_SLIDESHOW 0
+ #define LV_DEMO_WIDGETS_SLIDESHOW 0
#endif
#endif
#endif
@@ -2188,7 +2356,7 @@
#ifdef CONFIG_LV_USE_DEMO_KEYPAD_AND_ENCODER
#define LV_USE_DEMO_KEYPAD_AND_ENCODER CONFIG_LV_USE_DEMO_KEYPAD_AND_ENCODER
#else
- #define LV_USE_DEMO_KEYPAD_AND_ENCODER 0
+ #define LV_USE_DEMO_KEYPAD_AND_ENCODER 0
#endif
#endif
@@ -2197,16 +2365,26 @@
#ifdef CONFIG_LV_USE_DEMO_BENCHMARK
#define LV_USE_DEMO_BENCHMARK CONFIG_LV_USE_DEMO_BENCHMARK
#else
- #define LV_USE_DEMO_BENCHMARK 0
+ #define LV_USE_DEMO_BENCHMARK 0
#endif
#endif
+#if LV_USE_DEMO_BENCHMARK
+/*Use RGB565A8 images with 16 bit color depth instead of ARGB8565*/
+#ifndef LV_DEMO_BENCHMARK_RGB565A8
+ #ifdef CONFIG_LV_DEMO_BENCHMARK_RGB565A8
+ #define LV_DEMO_BENCHMARK_RGB565A8 CONFIG_LV_DEMO_BENCHMARK_RGB565A8
+ #else
+ #define LV_DEMO_BENCHMARK_RGB565A8 0
+ #endif
+#endif
+#endif
/*Stress test for LVGL*/
#ifndef LV_USE_DEMO_STRESS
#ifdef CONFIG_LV_USE_DEMO_STRESS
#define LV_USE_DEMO_STRESS CONFIG_LV_USE_DEMO_STRESS
#else
- #define LV_USE_DEMO_STRESS 0
+ #define LV_USE_DEMO_STRESS 0
#endif
#endif
@@ -2215,46 +2393,46 @@
#ifdef CONFIG_LV_USE_DEMO_MUSIC
#define LV_USE_DEMO_MUSIC CONFIG_LV_USE_DEMO_MUSIC
#else
- #define LV_USE_DEMO_MUSIC 0
+ #define LV_USE_DEMO_MUSIC 0
#endif
#endif
#if LV_USE_DEMO_MUSIC
-#ifndef LV_DEMO_MUSIC_SQUARE
- #ifdef CONFIG_LV_DEMO_MUSIC_SQUARE
- #define LV_DEMO_MUSIC_SQUARE CONFIG_LV_DEMO_MUSIC_SQUARE
- #else
- #define LV_DEMO_MUSIC_SQUARE 0
+ #ifndef LV_DEMO_MUSIC_SQUARE
+ #ifdef CONFIG_LV_DEMO_MUSIC_SQUARE
+ #define LV_DEMO_MUSIC_SQUARE CONFIG_LV_DEMO_MUSIC_SQUARE
+ #else
+ #define LV_DEMO_MUSIC_SQUARE 0
+ #endif
#endif
-#endif
-#ifndef LV_DEMO_MUSIC_LANDSCAPE
- #ifdef CONFIG_LV_DEMO_MUSIC_LANDSCAPE
- #define LV_DEMO_MUSIC_LANDSCAPE CONFIG_LV_DEMO_MUSIC_LANDSCAPE
- #else
- #define LV_DEMO_MUSIC_LANDSCAPE 0
+ #ifndef LV_DEMO_MUSIC_LANDSCAPE
+ #ifdef CONFIG_LV_DEMO_MUSIC_LANDSCAPE
+ #define LV_DEMO_MUSIC_LANDSCAPE CONFIG_LV_DEMO_MUSIC_LANDSCAPE
+ #else
+ #define LV_DEMO_MUSIC_LANDSCAPE 0
+ #endif
#endif
-#endif
-#ifndef LV_DEMO_MUSIC_ROUND
- #ifdef CONFIG_LV_DEMO_MUSIC_ROUND
- #define LV_DEMO_MUSIC_ROUND CONFIG_LV_DEMO_MUSIC_ROUND
- #else
- #define LV_DEMO_MUSIC_ROUND 0
+ #ifndef LV_DEMO_MUSIC_ROUND
+ #ifdef CONFIG_LV_DEMO_MUSIC_ROUND
+ #define LV_DEMO_MUSIC_ROUND CONFIG_LV_DEMO_MUSIC_ROUND
+ #else
+ #define LV_DEMO_MUSIC_ROUND 0
+ #endif
#endif
-#endif
-#ifndef LV_DEMO_MUSIC_LARGE
- #ifdef CONFIG_LV_DEMO_MUSIC_LARGE
- #define LV_DEMO_MUSIC_LARGE CONFIG_LV_DEMO_MUSIC_LARGE
- #else
- #define LV_DEMO_MUSIC_LARGE 0
+ #ifndef LV_DEMO_MUSIC_LARGE
+ #ifdef CONFIG_LV_DEMO_MUSIC_LARGE
+ #define LV_DEMO_MUSIC_LARGE CONFIG_LV_DEMO_MUSIC_LARGE
+ #else
+ #define LV_DEMO_MUSIC_LARGE 0
+ #endif
#endif
-#endif
-#ifndef LV_DEMO_MUSIC_AUTO_PLAY
- #ifdef CONFIG_LV_DEMO_MUSIC_AUTO_PLAY
- #define LV_DEMO_MUSIC_AUTO_PLAY CONFIG_LV_DEMO_MUSIC_AUTO_PLAY
- #else
- #define LV_DEMO_MUSIC_AUTO_PLAY 0
+ #ifndef LV_DEMO_MUSIC_AUTO_PLAY
+ #ifdef CONFIG_LV_DEMO_MUSIC_AUTO_PLAY
+ #define LV_DEMO_MUSIC_AUTO_PLAY CONFIG_LV_DEMO_MUSIC_AUTO_PLAY
+ #else
+ #define LV_DEMO_MUSIC_AUTO_PLAY 0
+ #endif
#endif
#endif
-#endif
diff --git a/src/lv_conf_kconfig.h b/src/lv_conf_kconfig.h
index 7424789eb..7742fe77b 100644
--- a/src/lv_conf_kconfig.h
+++ b/src/lv_conf_kconfig.h
@@ -41,6 +41,50 @@ extern "C" {
# define CONFIG_LV_MEM_SIZE (CONFIG_LV_MEM_SIZE_KILOBYTES * 1024U)
#endif
+/*------------------
+ * MONITOR POSITION
+ *-----------------*/
+
+#ifdef CONFIG_LV_PERF_MONITOR_ALIGN_TOP_LEFT
+# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_TOP_LEFT
+#elif defined(CONFIG_LV_USE_PERF_MONITOR_ALIGN_TOP_MID)
+# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_TOP_MID
+#elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_TOP_RIGHT)
+# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_TOP_RIGHT
+#elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_BOTTOM_LEFT)
+# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_LEFT
+#elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_BOTTOM_MID)
+# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_MID
+#elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_BOTTOM_RIGHT)
+# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT
+#elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_LEFT_MID)
+# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_LEFT_MID
+#elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_RIGHT_MID)
+# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_RIGHT_MID
+#elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_CENTER)
+# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_CENTER
+#endif
+
+#ifdef CONFIG_LV_MEM_MONITOR_ALIGN_TOP_LEFT
+# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_TOP_LEFT
+#elif defined(CONFIG_LV_USE_MEM_MONITOR_ALIGN_TOP_MID)
+# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_TOP_MID
+#elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_TOP_RIGHT)
+# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_TOP_RIGHT
+#elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_BOTTOM_LEFT)
+# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_LEFT
+#elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_BOTTOM_MID)
+# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_MID
+#elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_BOTTOM_RIGHT)
+# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT
+#elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_LEFT_MID)
+# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_LEFT_MID
+#elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_RIGHT_MID)
+# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_RIGHT_MID
+#elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_CENTER)
+# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_CENTER
+#endif
+
/********************
* FONT SELECTION
*******************/
@@ -131,50 +175,6 @@ extern "C" {
# define CONFIG_LV_BIDI_BASE_DIR_DEF LV_BASE_DIR_AUTO
#endif
-/*------------------
- * MONITOR POSITION
- *-----------------*/
-
-#ifdef CONFIG_LV_PERF_MONITOR_ALIGN_TOP_LEFT
-# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_TOP_LEFT
-#elif defined(CONFIG_LV_USE_PERF_MONITOR_ALIGN_TOP_MID)
-# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_TOP_MID
-#elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_TOP_RIGHT)
-# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_TOP_RIGHT
-#elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_BOTTOM_LEFT)
-# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_LEFT
-#elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_BOTTOM_MID)
-# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_MID
-#elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_BOTTOM_RIGHT)
-# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT
-#elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_LEFT_MID)
-# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_LEFT_MID
-#elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_RIGHT_MID)
-# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_RIGHT_MID
-#elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_CENTER)
-# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_CENTER
-#endif
-
-#ifdef CONFIG_LV_MEM_MONITOR_ALIGN_TOP_LEFT
-# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_TOP_LEFT
-#elif defined(CONFIG_LV_USE_MEM_MONITOR_ALIGN_TOP_MID)
-# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_TOP_MID
-#elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_TOP_RIGHT)
-# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_TOP_RIGHT
-#elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_BOTTOM_LEFT)
-# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_LEFT
-#elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_BOTTOM_MID)
-# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_MID
-#elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_BOTTOM_RIGHT)
-# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT
-#elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_LEFT_MID)
-# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_LEFT_MID
-#elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_RIGHT_MID)
-# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_RIGHT_MID
-#elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_CENTER)
-# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_CENTER
-#endif
-
#ifdef __cplusplus
} /*extern "C"*/
#endif
diff --git a/src/misc/lv_anim.c b/src/misc/lv_anim.c
index ecb95840d..4e4253a6e 100644
--- a/src/misc/lv_anim.c
+++ b/src/misc/lv_anim.c
@@ -147,6 +147,7 @@ bool lv_anim_del(void * var, lv_anim_exec_xcb_t exec_cb)
if((a->var == var || var == NULL) && (a->exec_cb == exec_cb || exec_cb == NULL)) {
_lv_ll_remove(&LV_GC_ROOT(_lv_anim_ll), a);
+ if(a->deleted_cb != NULL) a->deleted_cb(a);
lv_mem_free(a);
anim_mark_list_change(); /*Read by `anim_timer`. It need to know if a delete occurred in
the linked list*/
@@ -177,6 +178,11 @@ lv_anim_t * lv_anim_get(void * var, lv_anim_exec_xcb_t exec_cb)
return NULL;
}
+struct _lv_timer_t * lv_anim_get_timer(void)
+{
+ return _lv_anim_tmr;
+}
+
uint16_t lv_anim_count_running(void)
{
uint16_t cnt = 0;
@@ -429,6 +435,7 @@ static void anim_ready_handler(lv_anim_t * a)
/*Call the callback function at the end*/
if(a->ready_cb != NULL) a->ready_cb(a);
+ if(a->deleted_cb != NULL) a->deleted_cb(a);
lv_mem_free(a);
}
/*If the animation is not deleted then restart it*/
diff --git a/src/misc/lv_anim.h b/src/misc/lv_anim.h
index 18317eb38..faef72787 100644
--- a/src/misc/lv_anim.h
+++ b/src/misc/lv_anim.h
@@ -40,6 +40,7 @@ typedef enum {
} lv_anim_enable_t;
struct _lv_anim_t;
+struct _lv_timer_t;
/** Get the current value during an animation*/
typedef int32_t (*lv_anim_path_cb_t)(const struct _lv_anim_t *);
@@ -65,12 +66,16 @@ typedef void (*lv_anim_start_cb_t)(struct _lv_anim_t *);
/** Callback used when the animation values are relative to get the current value*/
typedef int32_t (*lv_anim_get_value_cb_t)(struct _lv_anim_t *);
+/** Callback used when the animation is deleted*/
+typedef void (*lv_anim_deleted_cb_t)(struct _lv_anim_t *);
+
/** Describes an animation*/
typedef struct _lv_anim_t {
void * var; /**ready_cb = ready_cb;
}
+/**
+ * Set a function call when the animation is deleted.
+ * @param a pointer to an initialized `lv_anim_t` variable
+ * @param deleted_cb a function call when the animation is deleted
+ */
+static inline void lv_anim_set_deleted_cb(lv_anim_t * a, lv_anim_deleted_cb_t deleted_cb)
+{
+ a->deleted_cb = deleted_cb;
+}
+
/**
* Make the animation to play back to when the forward direction is ready
* @param a pointer to an initialized `lv_anim_t` variable
@@ -345,6 +360,12 @@ void lv_anim_del_all(void);
*/
lv_anim_t * lv_anim_get(void * var, lv_anim_exec_xcb_t exec_cb);
+/**
+ * Get global animation refresher timer.
+ * @return pointer to the animation refresher timer.
+ */
+struct _lv_timer_t * lv_anim_get_timer(void);
+
/**
* Delete an animation by getting the animated variable from `a`.
* Only animations with `exec_cb` will be deleted.
diff --git a/src/misc/lv_area.c b/src/misc/lv_area.c
index 7c66a9b33..c0221f7ed 100644
--- a/src/misc/lv_area.c
+++ b/src/misc/lv_area.c
@@ -456,6 +456,59 @@ void lv_area_align(const lv_area_t * base, lv_area_t * to_align, lv_align_t alig
to_align->y2 = to_align->y1 + h - 1;
}
+#define _LV_TRANSFORM_TRIGO_SHIFT 10
+void lv_point_transform(lv_point_t * p, int32_t angle, int32_t zoom, const lv_point_t * pivot)
+{
+ if(angle == 0 && zoom == 256) {
+ return;
+ }
+
+ p->x -= pivot->x;
+ p->y -= pivot->y;
+
+ if(angle == 0) {
+ p->x = (((int32_t)(p->x) * zoom) >> 8) + pivot->x;
+ p->y = (((int32_t)(p->y) * zoom) >> 8) + pivot->y;
+ return;
+ }
+
+ static int32_t angle_prev = INT32_MIN;
+ static int32_t sinma;
+ static int32_t cosma;
+ if(angle_prev != angle) {
+ int32_t angle_limited = angle;
+ if(angle_limited > 3600) angle_limited -= 3600;
+ if(angle_limited < 0) angle_limited += 3600;
+
+ int32_t angle_low = angle_limited / 10;
+ int32_t angle_high = angle_low + 1;
+ int32_t angle_rem = angle_limited - (angle_low * 10);
+
+ int32_t s1 = lv_trigo_sin(angle_low);
+ int32_t s2 = lv_trigo_sin(angle_high);
+
+ int32_t c1 = lv_trigo_sin(angle_low + 90);
+ int32_t c2 = lv_trigo_sin(angle_high + 90);
+
+ sinma = (s1 * (10 - angle_rem) + s2 * angle_rem) / 10;
+ cosma = (c1 * (10 - angle_rem) + c2 * angle_rem) / 10;
+ sinma = sinma >> (LV_TRIGO_SHIFT - _LV_TRANSFORM_TRIGO_SHIFT);
+ cosma = cosma >> (LV_TRIGO_SHIFT - _LV_TRANSFORM_TRIGO_SHIFT);
+ angle_prev = angle;
+ }
+ int32_t x = p->x;
+ int32_t y = p->y;
+ if(zoom == 256) {
+ p->x = ((cosma * x - sinma * y) >> _LV_TRANSFORM_TRIGO_SHIFT) + pivot->x;
+ p->y = ((sinma * x + cosma * y) >> _LV_TRANSFORM_TRIGO_SHIFT) + pivot->y;
+ }
+ else {
+ p->x = (((cosma * x - sinma * y) * zoom) >> (_LV_TRANSFORM_TRIGO_SHIFT + 8)) + pivot->x;
+ p->y = (((sinma * x + cosma * y) * zoom) >> (_LV_TRANSFORM_TRIGO_SHIFT + 8)) + pivot->y;
+ }
+}
+
+
/**********************
* STATIC FUNCTIONS
**********************/
diff --git a/src/misc/lv_area.h b/src/misc/lv_area.h
index 542d86bc5..137931a29 100644
--- a/src/misc/lv_area.h
+++ b/src/misc/lv_area.h
@@ -236,6 +236,8 @@ bool _lv_area_is_equal(const lv_area_t * a, const lv_area_t * b);
*/
void lv_area_align(const lv_area_t * base, lv_area_t * to_align, lv_align_t align, lv_coord_t ofs_x, lv_coord_t ofs_y);
+void lv_point_transform(lv_point_t * p, int32_t angle, int32_t zoom, const lv_point_t * pivot);
+
/**********************
* MACROS
**********************/
diff --git a/src/misc/lv_async.c b/src/misc/lv_async.c
index 45a043154..c4941e811 100644
--- a/src/misc/lv_async.c
+++ b/src/misc/lv_async.c
@@ -65,6 +65,33 @@ lv_res_t lv_async_call(lv_async_cb_t async_xcb, void * user_data)
return LV_RES_OK;
}
+lv_res_t lv_async_call_cancel(lv_async_cb_t async_xcb, void * user_data)
+{
+ lv_timer_t * timer = lv_timer_get_next(NULL);
+ lv_res_t res = LV_RES_INV;
+
+ while(timer != NULL) {
+ /*Find the next timer node*/
+ lv_timer_t * timer_next = lv_timer_get_next(timer);
+
+ /*Find async timer callback*/
+ if(timer->timer_cb == lv_async_timer_cb) {
+ lv_async_info_t * info = (lv_async_info_t *)timer->user_data;
+
+ /*Match user function callback and user data*/
+ if(info->cb == async_xcb && info->user_data == user_data) {
+ lv_timer_del(timer);
+ lv_mem_free(info);
+ res = LV_RES_OK;
+ }
+ }
+
+ timer = timer_next;
+ }
+
+ return res;
+}
+
/**********************
* STATIC FUNCTIONS
**********************/
diff --git a/src/misc/lv_async.h b/src/misc/lv_async.h
index 3e6cb638d..4ad5756d9 100644
--- a/src/misc/lv_async.h
+++ b/src/misc/lv_async.h
@@ -43,6 +43,13 @@ typedef void (*lv_async_cb_t)(void *);
*/
lv_res_t lv_async_call(lv_async_cb_t async_xcb, void * user_data);
+/**
+ * Cancel an asynchronous function call
+ * @param async_xcb a callback which is the task itself.
+ * @param user_data custom parameter
+ */
+lv_res_t lv_async_call_cancel(lv_async_cb_t async_xcb, void * user_data);
+
/**********************
* MACROS
**********************/
diff --git a/src/misc/lv_bidi.c b/src/misc/lv_bidi.c
index b207f9d9e..3dc3ce7f1 100644
--- a/src/misc/lv_bidi.c
+++ b/src/misc/lv_bidi.c
@@ -339,7 +339,7 @@ static uint32_t lv_bidi_get_next_paragraph(const char * txt)
/**
* Get the direction of a character
- * @param letter an Unicode character
+ * @param letter a Unicode character
* @return `LV_BASE_DIR_RTL/LTR/WEAK/NEUTRAL`
*/
static lv_base_dir_t lv_bidi_get_letter_dir(uint32_t letter)
@@ -352,7 +352,7 @@ static lv_base_dir_t lv_bidi_get_letter_dir(uint32_t letter)
}
/**
* Tell whether a character is weak or not
- * @param letter an Unicode character
+ * @param letter a Unicode character
* @return true/false
*/
static bool lv_bidi_letter_is_weak(uint32_t letter)
@@ -371,7 +371,7 @@ static bool lv_bidi_letter_is_weak(uint32_t letter)
}
/**
* Tell whether a character is RTL or not
- * @param letter an Unicode character
+ * @param letter a Unicode character
* @return true/false
*/
static bool lv_bidi_letter_is_rtl(uint32_t letter)
@@ -389,7 +389,7 @@ static bool lv_bidi_letter_is_rtl(uint32_t letter)
/**
* Tell whether a character is neutral or not
- * @param letter an Unicode character
+ * @param letter a Unicode character
* @return true/false
*/
static bool lv_bidi_letter_is_neutral(uint32_t letter)
diff --git a/src/misc/lv_color.h b/src/misc/lv_color.h
index 37445cc5f..2cc92f277 100644
--- a/src/misc/lv_color.h
+++ b/src/misc/lv_color.h
@@ -23,10 +23,6 @@ extern "C" {
#error "LV_COLOR_DEPTH 24 is deprecated. Use LV_COLOR_DEPTH 32 instead (lv_conf.h)"
#endif
-#if LV_COLOR_DEPTH != 32 && LV_COLOR_SCREEN_TRANSP != 0
-#error "LV_COLOR_SCREEN_TRANSP requires LV_COLOR_DEPTH == 32. Set it in lv_conf.h"
-#endif
-
#if LV_COLOR_DEPTH != 16 && LV_COLOR_16_SWAP != 0
#error "LV_COLOR_16_SWAP requires LV_COLOR_DEPTH == 16. Set it in lv_conf.h"
#endif
@@ -444,9 +440,9 @@ LV_ATTRIBUTE_FAST_MEM static inline lv_color_t lv_color_mix(lv_color_t c1, lv_co
{
lv_color_t ret;
-#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP == 0
+#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP == 0 && LV_COLOR_MIX_ROUND_OFS == 0
/*Source: https://stackoverflow.com/a/50012418/1999969*/
- mix = (mix + 4) >> 3;
+ mix = (uint32_t)((uint32_t)mix + 4) >> 3;
uint32_t bg = (uint32_t)((uint32_t)c2.full | ((uint32_t)c2.full << 16)) &
0x7E0F81F; /*0b00000111111000001111100000011111*/
uint32_t fg = (uint32_t)((uint32_t)c1.full | ((uint32_t)c1.full << 16)) & 0x7E0F81F;
@@ -676,7 +672,7 @@ lv_color_hsv_t lv_color_rgb_to_hsv(uint8_t r8, uint8_t g8, uint8_t b8);
lv_color_hsv_t lv_color_to_hsv(lv_color_t color);
/**
- * Just a wrapper around LV_COLOR_CHROMA_KEY because it might be more convenient to use a function is some cases
+ * Just a wrapper around LV_COLOR_CHROMA_KEY because it might be more convenient to use a function in some cases
* @return LV_COLOR_CHROMA_KEY
*/
static inline lv_color_t lv_color_chroma_key(void)
diff --git a/src/misc/lv_fs.c b/src/misc/lv_fs.c
index 5a7afc59a..52f3ce07d 100644
--- a/src/misc/lv_fs.c
+++ b/src/misc/lv_fs.c
@@ -95,6 +95,8 @@ lv_fs_res_t lv_fs_open(lv_fs_file_t * file_p, const char * path, lv_fs_mode_t mo
file_p->cache = lv_mem_alloc(sizeof(lv_fs_file_cache_t));
LV_ASSERT_MALLOC(file_p->cache);
lv_memset_00(file_p->cache, sizeof(lv_fs_file_cache_t));
+ file_p->cache->start = UINT32_MAX; /*Set an invalid range by default*/
+ file_p->cache->end = UINT32_MAX - 1;
}
return LV_FS_RES_OK;
@@ -138,40 +140,38 @@ static lv_fs_res_t lv_fs_read_cached(lv_fs_file_t * file_p, char * buf, uint32_t
if(start <= file_position && file_position < end) {
/* Data can be read from cache buffer */
-
uint16_t buffer_offset = file_position - start;
- uint16_t buffer_remaining_length = buffer_size - buffer_offset;
+ uint32_t buffer_remaining_length = LV_MIN((uint32_t)buffer_size - buffer_offset, (uint32_t)end - file_position);
if(btr <= buffer_remaining_length) {
/*Data is in cache buffer, and buffer end not reached, no need to read from FS*/
lv_memcpy(buf, buffer + buffer_offset, btr);
+ *br = btr;
}
else {
/*First part of data is in cache buffer, but we need to read rest of data from FS*/
lv_memcpy(buf, buffer + buffer_offset, buffer_remaining_length);
+ uint32_t bytes_read_to_buffer = 0;
if(btr > buffer_size) {
/*If remaining data chuck is bigger than buffer size, then do not use cache, instead read it directly from FS*/
res = file_p->drv->read_cb(file_p->drv, file_p->file_d, (void *)(buf + buffer_remaining_length),
- btr - buffer_remaining_length, br);
+ btr - buffer_remaining_length, &bytes_read_to_buffer);
}
else {
/*If remaining data chunk is smaller than buffer size, then read into cache buffer*/
- uint32_t bytes_read_to_buffer = 0;
-
- /*Read into cache buffer:*/
res = file_p->drv->read_cb(file_p->drv, file_p->file_d, (void *)buffer, buffer_size, &bytes_read_to_buffer);
- file_p->cache->start = file_p->cache->end + 1;
+ file_p->cache->start = file_p->cache->end;
file_p->cache->end = file_p->cache->start + bytes_read_to_buffer;
- uint16_t data_chunk_remaining = btr - buffer_remaining_length;
- memcpy(buf + buffer_remaining_length, buffer, data_chunk_remaining);
+ uint16_t data_chunk_remaining = LV_MIN(btr - buffer_remaining_length, bytes_read_to_buffer);
+ lv_memcpy(buf + buffer_remaining_length, buffer, data_chunk_remaining);
}
+ *br = LV_MIN(buffer_remaining_length + bytes_read_to_buffer, btr);
}
}
else {
/*Data is not in cache buffer*/
-
if(btr > buffer_size) {
/*If bigger data is requested, then do not use cache, instead read it directly*/
res = file_p->drv->read_cb(file_p->drv, file_p->file_d, (void *)buf, btr, br);
@@ -189,13 +189,14 @@ static lv_fs_res_t lv_fs_read_cached(lv_fs_file_t * file_p, char * buf, uint32_t
file_p->cache->start = file_position;
file_p->cache->end = file_p->cache->start + bytes_read_to_buffer;
- memcpy(buf, buffer, btr);
+ *br = LV_MIN(btr, bytes_read_to_buffer);
+ lv_memcpy(buf, buffer, *br);
+
}
}
if(res == LV_FS_RES_OK) {
- *br = btr;
- file_p->cache->file_position += btr;
+ file_p->cache->file_position += *br;
}
return res;
diff --git a/src/misc/lv_fs.h b/src/misc/lv_fs.h
index 0a9b24104..9f65e1b2a 100644
--- a/src/misc/lv_fs.h
+++ b/src/misc/lv_fs.h
@@ -176,8 +176,8 @@ lv_fs_res_t lv_fs_read(lv_fs_file_t * file_p, void * buf, uint32_t btr, uint32_t
* Write into a file
* @param file_p pointer to a lv_fs_file_t variable
* @param buf pointer to a buffer with the bytes to write
- * @param btr Bytes To Write
- * @param br the number of real written bytes (Bytes Written). NULL if unused.
+ * @param btw Bytes To Write
+ * @param bw the number of real written bytes (Bytes Written). NULL if unused.
* @return LV_FS_RES_OK or any error from lv_fs_res_t enum
*/
lv_fs_res_t lv_fs_write(lv_fs_file_t * file_p, const void * buf, uint32_t btw, uint32_t * bw);
diff --git a/src/misc/lv_gc.h b/src/misc/lv_gc.h
index 7551252a5..9d7d1bb92 100644
--- a/src/misc/lv_gc.h
+++ b/src/misc/lv_gc.h
@@ -59,7 +59,8 @@ extern "C" {
LV_DISPATCH(f, void * , _lv_theme_default_styles) \
LV_DISPATCH(f, void * , _lv_theme_basic_styles) \
LV_DISPATCH_COND(f, uint8_t *, _lv_font_decompr_buf, LV_USE_FONT_COMPRESSED, 1) \
- LV_DISPATCH(f, uint8_t * , _lv_grad_cache_mem)
+ LV_DISPATCH(f, uint8_t * , _lv_grad_cache_mem) \
+ LV_DISPATCH(f, uint8_t * , _lv_style_custom_prop_flag_lookup_table)
#define LV_DEFINE_ROOT(root_type, root_name) root_type root_name;
#define LV_ROOTS LV_ITERATE_ROOTS(LV_DEFINE_ROOT)
diff --git a/src/misc/lv_ll.c b/src/misc/lv_ll.c
index c84647ccf..e7582316b 100644
--- a/src/misc/lv_ll.c
+++ b/src/misc/lv_ll.c
@@ -286,7 +286,7 @@ void * _lv_ll_get_next(const lv_ll_t * ll_p, const void * n_act)
}
/**
- * Return with the pointer of the previous node after 'n_act'
+ * Return with the pointer of the previous node before 'n_act'
* @param ll_p pointer to linked list
* @param n_act pointer a node
* @return pointer to the previous node
diff --git a/src/misc/lv_log.c b/src/misc/lv_log.c
index 63441d6a4..d79463f2b 100644
--- a/src/misc/lv_log.c
+++ b/src/misc/lv_log.c
@@ -112,12 +112,29 @@ void _lv_log_add(lv_log_level_t level, const char * file, int line, const char *
}
}
-void lv_log(const char * buf)
+void lv_log(const char * format, ...)
{
+ if(LV_LOG_LEVEL >= LV_LOG_LEVEL_NONE) return; /* disable log */
+
+ va_list args;
+ va_start(args, format);
+
#if LV_LOG_PRINTF
- puts(buf);
+ vprintf(format, args);
+#else
+ if(custom_print_cb) {
+ char buf[512];
+#if LV_SPRINTF_CUSTOM
+ lv_vsnprintf(buf, sizeof(buf), format, args);
+#else
+ lv_vaformat_t vaf = {format, &args};
+ lv_snprintf(buf, sizeof(buf), "%pV", (void *)&vaf);
+#endif
+ custom_print_cb(buf);
+ }
#endif
- if(custom_print_cb) custom_print_cb(buf);
+
+ va_end(args);
}
/**********************
diff --git a/src/misc/lv_log.h b/src/misc/lv_log.h
index fa6f5ac6b..9a009930d 100644
--- a/src/misc/lv_log.h
+++ b/src/misc/lv_log.h
@@ -66,9 +66,10 @@ void lv_log_register_print_cb(lv_log_print_g_cb_t print_cb);
/**
* Print a log message via `printf` if enabled with `LV_LOG_PRINTF` in `lv_conf.h`
* and/or a print callback if registered with `lv_log_register_print_cb`
- * @param buf a string message to print
+ * @param format printf-like format string
+ * @param ... parameters for `format`
*/
-void lv_log(const char * buf);
+void lv_log(const char * format, ...) LV_FORMAT_ATTRIBUTE(1, 2);
/**
* Add a log
@@ -125,6 +126,14 @@ void _lv_log_add(lv_log_level_t level, const char * file, int line,
# endif
#endif
+#ifndef LV_LOG
+# if LV_LOG_LEVEL < LV_LOG_LEVEL_NONE
+# define LV_LOG(...) lv_log(__VA_ARGS__)
+# else
+# define LV_LOG(...) do {} while(0)
+# endif
+#endif
+
#else /*LV_USE_LOG*/
/*Do nothing if `LV_USE_LOG 0`*/
@@ -134,6 +143,8 @@ void _lv_log_add(lv_log_level_t level, const char * file, int line,
#define LV_LOG_WARN(...) do {}while(0)
#define LV_LOG_ERROR(...) do {}while(0)
#define LV_LOG_USER(...) do {}while(0)
+#define LV_LOG(...) do {}while(0)
+
#endif /*LV_USE_LOG*/
#ifdef __cplusplus
diff --git a/src/misc/lv_lru.c b/src/misc/lv_lru.c
index 0dcbc4415..6ff83903e 100644
--- a/src/misc/lv_lru.c
+++ b/src/misc/lv_lru.c
@@ -48,13 +48,6 @@ static int lv_lru_cmp_keys(lv_lru_item_t * item, const void * key, uint32_t key_
/** remove an item and push it to the free items queue */
static void lv_lru_remove_item(lv_lru_t * cache, lv_lru_item_t * prev, lv_lru_item_t * item, uint32_t hash_index);
-/**
- * remove the least recently used item
- *
- * @todo we can optimise this by finding the n lru items, where n = required_space / average_length
- */
-static void lv_lru_remove_lru_item(lv_lru_t * cache);
-
/** pop an existing item off the free queue, or create a new one */
static lv_lru_item_t * lv_lru_pop_or_create_item(lv_lru_t * cache);
@@ -152,7 +145,7 @@ lv_lru_res_t lv_lru_set(lv_lru_t * cache, const void * key, size_t key_length, v
// see if the key already exists
uint32_t hash_index = lv_lru_hash(cache, key, key_length);
- size_t required = 0;
+ int required = 0;
lv_lru_item_t * item = NULL, *prev = NULL;
item = cache->items[hash_index];
@@ -163,7 +156,7 @@ lv_lru_res_t lv_lru_set(lv_lru_t * cache, const void * key, size_t key_length, v
if(item) {
// update the value and value_lengths
- required = (size_t)(value_length - item->value_length);
+ required = (int)(value_length - item->value_length);
cache->value_free(item->value);
item->value = value;
item->value_length = value_length;
@@ -177,7 +170,7 @@ lv_lru_res_t lv_lru_set(lv_lru_t * cache, const void * key, size_t key_length, v
memcpy(item->key, key, key_length);
item->value_length = value_length;
item->key_length = key_length;
- required = (size_t) value_length;
+ required = (int) value_length;
if(prev)
prev->next = item;
@@ -241,6 +234,34 @@ lv_lru_res_t lv_lru_remove(lv_lru_t * cache, const void * key, size_t key_size)
return LV_LRU_OK;
}
+void lv_lru_remove_lru_item(lv_lru_t * cache)
+{
+ lv_lru_item_t * min_item = NULL, *min_prev = NULL;
+ lv_lru_item_t * item = NULL, *prev = NULL;
+ uint32_t i = 0, min_index = -1;
+ uint64_t min_access_count = -1;
+
+ for(; i < cache->hash_table_size; i++) {
+ item = cache->items[i];
+ prev = NULL;
+
+ while(item) {
+ if(item->access_count < min_access_count || (int64_t) min_access_count == -1) {
+ min_access_count = item->access_count;
+ min_item = item;
+ min_prev = prev;
+ min_index = i;
+ }
+ prev = item;
+ item = item->next;
+ }
+ }
+
+ if(min_item) {
+ lv_lru_remove_item(cache, min_prev, min_item, min_index);
+ }
+}
+
/**********************
* STATIC FUNCTIONS
**********************/
@@ -282,18 +303,22 @@ static uint32_t lv_lru_hash(lv_lru_t * cache, const void * key, uint32_t key_len
static int lv_lru_cmp_keys(lv_lru_item_t * item, const void * key, uint32_t key_length)
{
- if(key_length != item->key_length)
+ if(key_length != item->key_length) {
return 1;
- else
+ }
+ else {
return memcmp(key, item->key, key_length);
+ }
}
static void lv_lru_remove_item(lv_lru_t * cache, lv_lru_item_t * prev, lv_lru_item_t * item, uint32_t hash_index)
{
- if(prev)
+ if(prev) {
prev->next = item->next;
- else
+ }
+ else {
cache->items[hash_index] = (lv_lru_item_t *) item->next;
+ }
// free memory and update the free memory counter
cache->free_memory += item->value_length;
@@ -306,33 +331,6 @@ static void lv_lru_remove_item(lv_lru_t * cache, lv_lru_item_t * prev, lv_lru_it
cache->free_items = item;
}
-static void lv_lru_remove_lru_item(lv_lru_t * cache)
-{
- lv_lru_item_t * min_item = NULL, *min_prev = NULL;
- lv_lru_item_t * item = NULL, *prev = NULL;
- uint32_t i = 0, min_index = -1;
- uint64_t min_access_count = -1;
-
- for(; i < cache->hash_table_size; i++) {
- item = cache->items[i];
- prev = NULL;
-
- while(item) {
- if(item->access_count < min_access_count || (int64_t) min_access_count == -1) {
- min_access_count = item->access_count;
- min_item = item;
- min_prev = prev;
- min_index = i;
- }
- prev = item;
- item = item->next;
- }
- }
-
- if(min_item)
- lv_lru_remove_item(cache, min_prev, min_item, min_index);
-}
-
static lv_lru_item_t * lv_lru_pop_or_create_item(lv_lru_t * cache)
{
lv_lru_item_t * item = NULL;
diff --git a/src/misc/lv_lru.h b/src/misc/lv_lru.h
index 07d3bd361..2d0134e5c 100644
--- a/src/misc/lv_lru.h
+++ b/src/misc/lv_lru.h
@@ -71,6 +71,12 @@ lv_lru_res_t lv_lru_get(lv_lru_t * cache, const void * key, size_t key_size, voi
lv_lru_res_t lv_lru_remove(lv_lru_t * cache, const void * key, size_t key_size);
+/**
+ * remove the least recently used item
+ *
+ * @todo we can optimise this by finding the n lru items, where n = required_space / average_length
+ */
+void lv_lru_remove_lru_item(lv_lru_t * cache);
/**********************
* MACROS
**********************/
diff --git a/src/misc/lv_math.c b/src/misc/lv_math.c
index 2144a50ca..bfb3934b2 100644
--- a/src/misc/lv_math.c
+++ b/src/misc/lv_math.c
@@ -235,8 +235,11 @@ int64_t lv_pow(int64_t base, int8_t exp)
*/
int32_t lv_map(int32_t x, int32_t min_in, int32_t max_in, int32_t min_out, int32_t max_out)
{
- if(x >= max_in) return max_out;
- if(x <= min_in) return min_out;
+ if(max_in >= min_in && x >= max_in) return max_out;
+ if(max_in >= min_in && x <= min_in) return min_out;
+
+ if(max_in <= min_in && x <= max_in) return max_out;
+ if(max_in <= min_in && x >= min_in) return min_out;
/**
* The equation should be:
diff --git a/src/misc/lv_mem.c b/src/misc/lv_mem.c
index 91d50678b..b7c602f7a 100644
--- a/src/misc/lv_mem.c
+++ b/src/misc/lv_mem.c
@@ -55,6 +55,8 @@
**********************/
#if LV_MEM_CUSTOM == 0
static lv_tlsf_t tlsf;
+ static uint32_t cur_used;
+ static uint32_t max_used;
#endif
static uint32_t zero_mem = ZERO_MEM_SENTINEL; /*Give the address of this variable if 0 byte should be allocated*/
@@ -135,12 +137,14 @@ void * lv_mem_alloc(size_t size)
#endif
if(alloc == NULL) {
- LV_LOG_ERROR("couldn't allocate memory (%lu bytes)", (unsigned long)size);
+ LV_LOG_INFO("couldn't allocate memory (%lu bytes)", (unsigned long)size);
+#if LV_LOG_LEVEL <= LV_LOG_LEVEL_INFO
lv_mem_monitor_t mon;
lv_mem_monitor(&mon);
- LV_LOG_ERROR("used: %6d (%3d %%), frag: %3d %%, biggest free: %6d",
- (int)(mon.total_size - mon.free_size), mon.used_pct, mon.frag_pct,
- (int)mon.free_biggest_size);
+ LV_LOG_INFO("used: %6d (%3d %%), frag: %3d %%, biggest free: %6d",
+ (int)(mon.total_size - mon.free_size), mon.used_pct, mon.frag_pct,
+ (int)mon.free_biggest_size);
+#endif
}
#if LV_MEM_ADD_JUNK
else {
@@ -148,7 +152,13 @@ void * lv_mem_alloc(size_t size)
}
#endif
- MEM_TRACE("allocated at %p", alloc);
+ if(alloc) {
+#if LV_MEM_CUSTOM == 0
+ cur_used += size;
+ max_used = LV_MAX(cur_used, max_used);
+#endif
+ MEM_TRACE("allocated at %p", alloc);
+ }
return alloc;
}
@@ -166,7 +176,9 @@ void lv_mem_free(void * data)
# if LV_MEM_ADD_JUNK
lv_memset(data, 0xbb, lv_tlsf_block_size(data));
# endif
- lv_tlsf_free(tlsf, data);
+ size_t size = lv_tlsf_free(tlsf, data);
+ if(cur_used > size) cur_used -= size;
+ else cur_used = 0;
#else
LV_MEM_CUSTOM_FREE(data);
#endif
@@ -250,6 +262,8 @@ void lv_mem_monitor(lv_mem_monitor_t * mon_p)
mon_p->frag_pct = 0; /*no fragmentation if all the RAM is used*/
}
+ mon_p->max_used = max_used;
+
MEM_TRACE("finished");
#endif
}
diff --git a/src/misc/lv_style.c b/src/misc/lv_style.c
index 8b065a8e6..419c29e48 100644
--- a/src/misc/lv_style.c
+++ b/src/misc/lv_style.c
@@ -7,7 +7,10 @@
* INCLUDES
*********************/
#include "lv_style.h"
+#include "../misc/lv_gc.h"
#include "../misc/lv_mem.h"
+#include "lv_assert.h"
+#include "lv_types.h"
/*********************
* DEFINES
@@ -21,14 +24,121 @@
* STATIC PROTOTYPES
**********************/
+static void lv_style_set_prop_internal(lv_style_t * style, lv_style_prop_t prop_and_meta, lv_style_value_t value,
+ void (*value_adjustment_helper)(lv_style_prop_t, lv_style_value_t, uint16_t *, lv_style_value_t *));
+static void lv_style_set_prop_helper(lv_style_prop_t prop, lv_style_value_t value, uint16_t * prop_storage,
+ lv_style_value_t * value_storage);
+static void lv_style_set_prop_meta_helper(lv_style_prop_t prop, lv_style_value_t value, uint16_t * prop_storage,
+ lv_style_value_t * value_storage);
+
/**********************
* GLOBAL VARIABLES
**********************/
+const uint8_t _lv_style_builtin_prop_flag_lookup_table[_LV_STYLE_NUM_BUILT_IN_PROPS] = {
+ [LV_STYLE_WIDTH] = LV_STYLE_PROP_LAYOUT_REFR,
+ [LV_STYLE_MIN_WIDTH] = LV_STYLE_PROP_LAYOUT_REFR,
+ [LV_STYLE_MAX_WIDTH] = LV_STYLE_PROP_LAYOUT_REFR,
+ [LV_STYLE_HEIGHT] = LV_STYLE_PROP_LAYOUT_REFR,
+ [LV_STYLE_MIN_HEIGHT] = LV_STYLE_PROP_LAYOUT_REFR,
+ [LV_STYLE_MAX_HEIGHT] = LV_STYLE_PROP_LAYOUT_REFR,
+ [LV_STYLE_X] = LV_STYLE_PROP_LAYOUT_REFR,
+ [LV_STYLE_Y] = LV_STYLE_PROP_LAYOUT_REFR,
+ [LV_STYLE_ALIGN] = LV_STYLE_PROP_LAYOUT_REFR,
+ [LV_STYLE_TRANSFORM_WIDTH] = LV_STYLE_PROP_EXT_DRAW,
+ [LV_STYLE_TRANSFORM_HEIGHT] = LV_STYLE_PROP_EXT_DRAW,
+ [LV_STYLE_TRANSLATE_X] = LV_STYLE_PROP_LAYOUT_REFR | LV_STYLE_PROP_PARENT_LAYOUT_REFR,
+ [LV_STYLE_TRANSLATE_Y] = LV_STYLE_PROP_LAYOUT_REFR | LV_STYLE_PROP_PARENT_LAYOUT_REFR,
+ [LV_STYLE_TRANSFORM_ZOOM] = LV_STYLE_PROP_EXT_DRAW | LV_STYLE_PROP_LAYER_REFR,
+ [LV_STYLE_TRANSFORM_ANGLE] = LV_STYLE_PROP_EXT_DRAW | LV_STYLE_PROP_LAYER_REFR,
+
+ [LV_STYLE_PAD_TOP] = LV_STYLE_PROP_EXT_DRAW | LV_STYLE_PROP_LAYOUT_REFR,
+ [LV_STYLE_PAD_BOTTOM] = LV_STYLE_PROP_EXT_DRAW | LV_STYLE_PROP_LAYOUT_REFR,
+ [LV_STYLE_PAD_LEFT] = LV_STYLE_PROP_EXT_DRAW | LV_STYLE_PROP_LAYOUT_REFR,
+ [LV_STYLE_PAD_RIGHT] = LV_STYLE_PROP_EXT_DRAW | LV_STYLE_PROP_LAYOUT_REFR,
+ [LV_STYLE_PAD_ROW] = LV_STYLE_PROP_EXT_DRAW | LV_STYLE_PROP_LAYOUT_REFR,
+ [LV_STYLE_PAD_COLUMN] = LV_STYLE_PROP_EXT_DRAW | LV_STYLE_PROP_LAYOUT_REFR,
+
+ [LV_STYLE_BG_COLOR] = 0,
+ [LV_STYLE_BG_OPA] = 0,
+ [LV_STYLE_BG_GRAD_COLOR] = 0,
+ [LV_STYLE_BG_GRAD_DIR] = 0,
+ [LV_STYLE_BG_MAIN_STOP] = 0,
+ [LV_STYLE_BG_GRAD_STOP] = 0,
+ [LV_STYLE_BG_GRAD] = 0,
+ [LV_STYLE_BG_DITHER_MODE] = 0,
+
+ [LV_STYLE_BG_IMG_SRC] = LV_STYLE_PROP_EXT_DRAW,
+ [LV_STYLE_BG_IMG_OPA] = 0,
+ [LV_STYLE_BG_IMG_RECOLOR] = 0,
+ [LV_STYLE_BG_IMG_RECOLOR_OPA] = 0,
+ [LV_STYLE_BG_IMG_TILED] = 0,
+
+ [LV_STYLE_BORDER_COLOR] = 0,
+ [LV_STYLE_BORDER_OPA] = 0,
+ [LV_STYLE_BORDER_WIDTH] = LV_STYLE_PROP_LAYOUT_REFR,
+ [LV_STYLE_BORDER_SIDE] = 0,
+ [LV_STYLE_BORDER_POST] = 0,
+
+ [LV_STYLE_OUTLINE_WIDTH] = LV_STYLE_PROP_EXT_DRAW,
+ [LV_STYLE_OUTLINE_COLOR] = 0,
+ [LV_STYLE_OUTLINE_OPA] = LV_STYLE_PROP_EXT_DRAW,
+ [LV_STYLE_OUTLINE_PAD] = LV_STYLE_PROP_EXT_DRAW,
+
+ [LV_STYLE_SHADOW_WIDTH] = LV_STYLE_PROP_EXT_DRAW,
+ [LV_STYLE_SHADOW_OFS_X] = LV_STYLE_PROP_EXT_DRAW,
+ [LV_STYLE_SHADOW_OFS_Y] = LV_STYLE_PROP_EXT_DRAW,
+ [LV_STYLE_SHADOW_SPREAD] = LV_STYLE_PROP_EXT_DRAW,
+ [LV_STYLE_SHADOW_COLOR] = 0,
+ [LV_STYLE_SHADOW_OPA] = LV_STYLE_PROP_EXT_DRAW,
+
+ [LV_STYLE_IMG_OPA] = 0,
+ [LV_STYLE_IMG_RECOLOR] = 0,
+ [LV_STYLE_IMG_RECOLOR_OPA] = 0,
+
+ [LV_STYLE_LINE_WIDTH] = LV_STYLE_PROP_EXT_DRAW,
+ [LV_STYLE_LINE_DASH_WIDTH] = 0,
+ [LV_STYLE_LINE_DASH_GAP] = 0,
+ [LV_STYLE_LINE_ROUNDED] = 0,
+ [LV_STYLE_LINE_COLOR] = 0,
+ [LV_STYLE_LINE_OPA] = 0,
+
+ [LV_STYLE_ARC_WIDTH] = LV_STYLE_PROP_EXT_DRAW,
+ [LV_STYLE_ARC_ROUNDED] = 0,
+ [LV_STYLE_ARC_COLOR] = 0,
+ [LV_STYLE_ARC_OPA] = 0,
+ [LV_STYLE_ARC_IMG_SRC] = 0,
+
+ [LV_STYLE_TEXT_COLOR] = LV_STYLE_PROP_INHERIT,
+ [LV_STYLE_TEXT_OPA] = LV_STYLE_PROP_INHERIT,
+ [LV_STYLE_TEXT_FONT] = LV_STYLE_PROP_INHERIT | LV_STYLE_PROP_LAYOUT_REFR,
+ [LV_STYLE_TEXT_LETTER_SPACE] = LV_STYLE_PROP_INHERIT | LV_STYLE_PROP_LAYOUT_REFR,
+ [LV_STYLE_TEXT_LINE_SPACE] = LV_STYLE_PROP_INHERIT | LV_STYLE_PROP_LAYOUT_REFR,
+ [LV_STYLE_TEXT_DECOR] = LV_STYLE_PROP_INHERIT,
+ [LV_STYLE_TEXT_ALIGN] = LV_STYLE_PROP_INHERIT | LV_STYLE_PROP_LAYOUT_REFR,
+
+ [LV_STYLE_RADIUS] = 0,
+ [LV_STYLE_CLIP_CORNER] = 0,
+ [LV_STYLE_OPA] = LV_STYLE_PROP_LAYER_REFR,
+ [LV_STYLE_COLOR_FILTER_DSC] = LV_STYLE_PROP_INHERIT,
+ [LV_STYLE_COLOR_FILTER_OPA] = LV_STYLE_PROP_INHERIT,
+ [LV_STYLE_ANIM_TIME] = 0,
+ [LV_STYLE_ANIM_SPEED] = 0,
+ [LV_STYLE_TRANSITION] = 0,
+ [LV_STYLE_BLEND_MODE] = LV_STYLE_PROP_LAYER_REFR,
+ [LV_STYLE_LAYOUT] = LV_STYLE_PROP_LAYOUT_REFR,
+ [LV_STYLE_BASE_DIR] = LV_STYLE_PROP_INHERIT | LV_STYLE_PROP_LAYOUT_REFR,
+};
+
+uint32_t _lv_style_custom_prop_flag_lookup_table_size = 0;
+
/**********************
* STATIC VARIABLES
**********************/
+static uint16_t last_custom_prop_id = (uint16_t)_LV_STYLE_LAST_BUILT_IN_PROP;
+static const lv_style_value_t null_style_value = { .num = 0 };
+
/**********************
* MACROS
**********************/
@@ -55,7 +165,7 @@ void lv_style_reset(lv_style_t * style)
{
LV_ASSERT_STYLE(style);
- if(style->is_const) {
+ if(style->prop1 == LV_STYLE_PROP_ANY) {
LV_LOG_ERROR("Cannot reset const style");
return;
}
@@ -67,18 +177,52 @@ void lv_style_reset(lv_style_t * style)
#endif
}
-lv_style_prop_t lv_style_register_prop(void)
+lv_style_prop_t lv_style_register_prop(uint8_t flag)
+{
+ if(LV_GC_ROOT(_lv_style_custom_prop_flag_lookup_table) == NULL) {
+ _lv_style_custom_prop_flag_lookup_table_size = 0;
+ last_custom_prop_id = (uint16_t)_LV_STYLE_LAST_BUILT_IN_PROP;
+ }
+
+ if(((last_custom_prop_id + 1) & LV_STYLE_PROP_META_MASK) != 0) {
+ LV_LOG_ERROR("No more custom property IDs available");
+ return LV_STYLE_PROP_INV;
+ }
+
+ /*
+ * Allocate the lookup table if it's not yet available.
+ */
+ size_t required_size = (last_custom_prop_id + 1 - _LV_STYLE_LAST_BUILT_IN_PROP);
+ if(_lv_style_custom_prop_flag_lookup_table_size < required_size) {
+ /* Round required_size up to the nearest 32-byte value */
+ required_size = (required_size + 31) & ~31;
+ LV_ASSERT_MSG(required_size > 0, "required size has become 0?");
+ uint8_t * old_p = LV_GC_ROOT(_lv_style_custom_prop_flag_lookup_table);
+ uint8_t * new_p = lv_mem_realloc(old_p, required_size * sizeof(uint8_t));
+ if(new_p == NULL) {
+ LV_LOG_ERROR("Unable to allocate space for custom property lookup table");
+ return LV_STYLE_PROP_INV;
+ }
+ LV_GC_ROOT(_lv_style_custom_prop_flag_lookup_table) = new_p;
+ _lv_style_custom_prop_flag_lookup_table_size = required_size;
+ }
+ last_custom_prop_id++;
+ /* This should never happen - we should bail out above */
+ LV_ASSERT_NULL(LV_GC_ROOT(_lv_style_custom_prop_flag_lookup_table));
+ LV_GC_ROOT(_lv_style_custom_prop_flag_lookup_table)[last_custom_prop_id - _LV_STYLE_NUM_BUILT_IN_PROPS] = flag;
+ return last_custom_prop_id;
+}
+
+lv_style_prop_t lv_style_get_num_custom_props(void)
{
- static uint16_t act_id = (uint16_t)_LV_STYLE_LAST_BUILT_IN_PROP;
- act_id++;
- return act_id;
+ return last_custom_prop_id - _LV_STYLE_LAST_BUILT_IN_PROP;
}
bool lv_style_remove_prop(lv_style_t * style, lv_style_prop_t prop)
{
LV_ASSERT_STYLE(style);
- if(style->is_const) {
+ if(style->prop1 == LV_STYLE_PROP_ANY) {
LV_LOG_ERROR("Cannot remove prop from const style");
return false;
}
@@ -86,7 +230,7 @@ bool lv_style_remove_prop(lv_style_t * style, lv_style_prop_t prop)
if(style->prop_cnt == 0) return false;
if(style->prop_cnt == 1) {
- if(style->prop1 == prop) {
+ if(LV_STYLE_PROP_ID_MASK(style->prop1) == prop) {
style->prop1 = LV_STYLE_PROP_INV;
style->prop_cnt = 0;
return true;
@@ -98,7 +242,7 @@ bool lv_style_remove_prop(lv_style_t * style, lv_style_prop_t prop)
uint16_t * old_props = (uint16_t *)tmp;
uint32_t i;
for(i = 0; i < style->prop_cnt; i++) {
- if(old_props[i] == prop) {
+ if(LV_STYLE_PROP_ID_MASK(old_props[i]) == prop) {
lv_style_value_t * old_values = (lv_style_value_t *)style->v_p.values_and_props;
if(style->prop_cnt == 2) {
@@ -137,78 +281,15 @@ bool lv_style_remove_prop(lv_style_t * style, lv_style_prop_t prop)
void lv_style_set_prop(lv_style_t * style, lv_style_prop_t prop, lv_style_value_t value)
{
- LV_ASSERT_STYLE(style);
-
- if(style->is_const) {
- LV_LOG_ERROR("Cannot set property of constant style");
- return;
- }
-
- if(style->prop_cnt > 1) {
- uint8_t * tmp = style->v_p.values_and_props + style->prop_cnt * sizeof(lv_style_value_t);
- uint16_t * props = (uint16_t *)tmp;
- int32_t i;
- for(i = style->prop_cnt - 1; i >= 0; i--) {
- if(props[i] == prop) {
- lv_style_value_t * values = (lv_style_value_t *)style->v_p.values_and_props;
- values[i] = value;
- return;
- }
- }
-
- size_t size = (style->prop_cnt + 1) * (sizeof(lv_style_value_t) + sizeof(uint16_t));
- uint8_t * values_and_props = lv_mem_realloc(style->v_p.values_and_props, size);
- if(values_and_props == NULL) return;
- style->v_p.values_and_props = values_and_props;
-
- tmp = values_and_props + style->prop_cnt * sizeof(lv_style_value_t);
- props = (uint16_t *)tmp;
- /*Shift all props to make place for the value before them*/
- for(i = style->prop_cnt - 1; i >= 0; i--) {
- props[i + sizeof(lv_style_value_t) / sizeof(uint16_t)] = props[i];
- }
- style->prop_cnt++;
-
- /*Go to the new position wit the props*/
- tmp = values_and_props + style->prop_cnt * sizeof(lv_style_value_t);
- props = (uint16_t *)tmp;
- lv_style_value_t * values = (lv_style_value_t *)values_and_props;
-
- /*Set the new property and value*/
- props[style->prop_cnt - 1] = prop;
- values[style->prop_cnt - 1] = value;
- }
- else if(style->prop_cnt == 1) {
- if(style->prop1 == prop) {
- style->v_p.value1 = value;
- return;
- }
- size_t size = (style->prop_cnt + 1) * (sizeof(lv_style_value_t) + sizeof(uint16_t));
- uint8_t * values_and_props = lv_mem_alloc(size);
- if(values_and_props == NULL) return;
- lv_style_value_t value_tmp = style->v_p.value1;
- style->v_p.values_and_props = values_and_props;
- style->prop_cnt++;
-
- uint8_t * tmp = values_and_props + style->prop_cnt * sizeof(lv_style_value_t);
- uint16_t * props = (uint16_t *)tmp;
- lv_style_value_t * values = (lv_style_value_t *)values_and_props;
- props[0] = style->prop1;
- props[1] = prop;
- values[0] = value_tmp;
- values[1] = value;
- }
- else {
- style->prop_cnt = 1;
- style->prop1 = prop;
- style->v_p.value1 = value;
- }
+ lv_style_set_prop_internal(style, prop, value, lv_style_set_prop_helper);
+}
- uint8_t group = _lv_style_get_prop_group(prop);
- style->has_group |= 1 << group;
+void lv_style_set_prop_meta(lv_style_t * style, lv_style_prop_t prop, uint16_t meta)
+{
+ lv_style_set_prop_internal(style, prop | meta, null_style_value, lv_style_set_prop_meta_helper);
}
-lv_res_t lv_style_get_prop(const lv_style_t * style, lv_style_prop_t prop, lv_style_value_t * value)
+lv_style_res_t lv_style_get_prop(const lv_style_t * style, lv_style_prop_t prop, lv_style_value_t * value)
{
return lv_style_get_prop_inlined(style, prop, value);
}
@@ -295,6 +376,110 @@ uint8_t _lv_style_get_prop_group(lv_style_prop_t prop)
return (uint8_t)group;
}
+uint8_t _lv_style_prop_lookup_flags(lv_style_prop_t prop)
+{
+ extern const uint8_t _lv_style_builtin_prop_flag_lookup_table[];
+ extern uint32_t _lv_style_custom_prop_flag_lookup_table_size;
+ if(prop == LV_STYLE_PROP_ANY) return LV_STYLE_PROP_ALL; /*Any prop can have any flags*/
+ if(prop == LV_STYLE_PROP_INV) return 0;
+
+ if(prop < _LV_STYLE_NUM_BUILT_IN_PROPS)
+ return _lv_style_builtin_prop_flag_lookup_table[prop];
+ prop -= _LV_STYLE_NUM_BUILT_IN_PROPS;
+ if(LV_GC_ROOT(_lv_style_custom_prop_flag_lookup_table) != NULL && prop < _lv_style_custom_prop_flag_lookup_table_size)
+ return LV_GC_ROOT(_lv_style_custom_prop_flag_lookup_table)[prop];
+ return 0;
+}
+
/**********************
* STATIC FUNCTIONS
**********************/
+
+static void lv_style_set_prop_helper(lv_style_prop_t prop, lv_style_value_t value, uint16_t * prop_storage,
+ lv_style_value_t * value_storage)
+{
+ *prop_storage = prop;
+ *value_storage = value;
+}
+
+static void lv_style_set_prop_meta_helper(lv_style_prop_t prop, lv_style_value_t value, uint16_t * prop_storage,
+ lv_style_value_t * value_storage)
+{
+ LV_UNUSED(value);
+ LV_UNUSED(value_storage);
+ *prop_storage = prop; /* meta is OR-ed into the prop ID already */
+}
+
+static void lv_style_set_prop_internal(lv_style_t * style, lv_style_prop_t prop_and_meta, lv_style_value_t value,
+ void (*value_adjustment_helper)(lv_style_prop_t, lv_style_value_t, uint16_t *, lv_style_value_t *))
+{
+ LV_ASSERT_STYLE(style);
+
+ if(style->prop1 == LV_STYLE_PROP_ANY) {
+ LV_LOG_ERROR("Cannot set property of constant style");
+ return;
+ }
+
+ lv_style_prop_t prop_id = LV_STYLE_PROP_ID_MASK(prop_and_meta);
+
+ if(style->prop_cnt > 1) {
+ uint8_t * tmp = style->v_p.values_and_props + style->prop_cnt * sizeof(lv_style_value_t);
+ uint16_t * props = (uint16_t *)tmp;
+ int32_t i;
+ for(i = style->prop_cnt - 1; i >= 0; i--) {
+ if(LV_STYLE_PROP_ID_MASK(props[i]) == prop_id) {
+ lv_style_value_t * values = (lv_style_value_t *)style->v_p.values_and_props;
+ value_adjustment_helper(prop_and_meta, value, &props[i], &values[i]);
+ return;
+ }
+ }
+
+ size_t size = (style->prop_cnt + 1) * (sizeof(lv_style_value_t) + sizeof(uint16_t));
+ uint8_t * values_and_props = lv_mem_realloc(style->v_p.values_and_props, size);
+ if(values_and_props == NULL) return;
+ style->v_p.values_and_props = values_and_props;
+
+ tmp = values_and_props + style->prop_cnt * sizeof(lv_style_value_t);
+ props = (uint16_t *)tmp;
+ /*Shift all props to make place for the value before them*/
+ for(i = style->prop_cnt - 1; i >= 0; i--) {
+ props[i + sizeof(lv_style_value_t) / sizeof(uint16_t)] = props[i];
+ }
+ style->prop_cnt++;
+
+ /*Go to the new position wit the props*/
+ tmp = values_and_props + style->prop_cnt * sizeof(lv_style_value_t);
+ props = (uint16_t *)tmp;
+ lv_style_value_t * values = (lv_style_value_t *)values_and_props;
+
+ /*Set the new property and value*/
+ value_adjustment_helper(prop_and_meta, value, &props[style->prop_cnt - 1], &values[style->prop_cnt - 1]);
+ }
+ else if(style->prop_cnt == 1) {
+ if(LV_STYLE_PROP_ID_MASK(style->prop1) == prop_id) {
+ value_adjustment_helper(prop_and_meta, value, &style->prop1, &style->v_p.value1);
+ return;
+ }
+ size_t size = (style->prop_cnt + 1) * (sizeof(lv_style_value_t) + sizeof(uint16_t));
+ uint8_t * values_and_props = lv_mem_alloc(size);
+ if(values_and_props == NULL) return;
+ lv_style_value_t value_tmp = style->v_p.value1;
+ style->v_p.values_and_props = values_and_props;
+ style->prop_cnt++;
+
+ uint8_t * tmp = values_and_props + style->prop_cnt * sizeof(lv_style_value_t);
+ uint16_t * props = (uint16_t *)tmp;
+ lv_style_value_t * values = (lv_style_value_t *)values_and_props;
+ props[0] = style->prop1;
+ values[0] = value_tmp;
+ value_adjustment_helper(prop_and_meta, value, &props[1], &values[1]);
+ }
+ else {
+ style->prop_cnt = 1;
+ value_adjustment_helper(prop_and_meta, value, &style->prop1, &style->v_p.value1);
+ }
+
+ uint8_t group = _lv_style_get_prop_group(prop_id);
+ style->has_group |= 1 << group;
+}
+
diff --git a/src/misc/lv_style.h b/src/misc/lv_style.h
index 6ec97cb57..1792dae88 100644
--- a/src/misc/lv_style.h
+++ b/src/misc/lv_style.h
@@ -31,13 +31,17 @@ extern "C" {
#define LV_STYLE_SENTINEL_VALUE 0xAABBCCDD
/**
- * Flags for style properties
+ * Flags for style behavior
+ *
+ * The rest of the flags will have _FLAG added to their name in v9.
*/
-#define LV_STYLE_PROP_INHERIT (1 << 10) /*Inherited*/
-#define LV_STYLE_PROP_EXT_DRAW (1 << 11) /*Requires ext. draw size update when changed*/
-#define LV_STYLE_PROP_LAYOUT_REFR (1 << 12) /*Requires layout update when changed*/
-#define LV_STYLE_PROP_PARENT_LAYOUT_REFR (1 << 13) /*Requires layout update on parent when changed*/
-#define LV_STYLE_PROP_FILTER (1 << 14) /*Apply color filter*/
+#define LV_STYLE_PROP_FLAG_NONE (0)
+#define LV_STYLE_PROP_INHERIT (1 << 0) /*Inherited*/
+#define LV_STYLE_PROP_EXT_DRAW (1 << 1) /*Requires ext. draw size update when changed*/
+#define LV_STYLE_PROP_LAYOUT_REFR (1 << 2) /*Requires layout update when changed*/
+#define LV_STYLE_PROP_PARENT_LAYOUT_REFR (1 << 3) /*Requires layout update on parent when changed*/
+#define LV_STYLE_PROP_LAYER_REFR (1 << 4) /*Affects layer handling*/
+#define LV_STYLE_PROP_ALL (0x1F) /*Indicating all flags*/
/**
* Other constants
@@ -45,17 +49,37 @@ extern "C" {
#define LV_IMG_ZOOM_NONE 256 /*Value for not zooming the image*/
LV_EXPORT_CONST_INT(LV_IMG_ZOOM_NONE);
+// *INDENT-OFF*
#if LV_USE_ASSERT_STYLE
-#define LV_STYLE_CONST_INIT(var_name, prop_array) const lv_style_t var_name = { .sentinel = LV_STYLE_SENTINEL_VALUE, .v_p = { .const_props = prop_array }, .has_group = 0xFF, .is_const = 1 }
+#define LV_STYLE_CONST_INIT(var_name, prop_array) \
+ const lv_style_t var_name = { \
+ .sentinel = LV_STYLE_SENTINEL_VALUE, \
+ .v_p = { .const_props = prop_array }, \
+ .has_group = 0xFF, \
+ .prop1 = LV_STYLE_PROP_ANY, \
+ .prop_cnt = (sizeof(prop_array) / sizeof((prop_array)[0])), \
+ }
#else
-#define LV_STYLE_CONST_INIT(var_name, prop_array) const lv_style_t var_name = { .v_p = { .const_props = prop_array }, .has_group = 0xFF, .is_const = 1 }
+#define LV_STYLE_CONST_INIT(var_name, prop_array) \
+ const lv_style_t var_name = { \
+ .v_p = { .const_props = prop_array }, \
+ .has_group = 0xFF, \
+ .prop1 = LV_STYLE_PROP_ANY, \
+ .prop_cnt = (sizeof(prop_array) / sizeof((prop_array)[0])), \
+ }
#endif
+// *INDENT-ON*
/** On simple system, don't waste resources on gradients */
#if !defined(LV_DRAW_COMPLEX) || !defined(LV_GRADIENT_MAX_STOPS)
#define LV_GRADIENT_MAX_STOPS 2
#endif
+#define LV_STYLE_PROP_META_INHERIT 0x8000
+#define LV_STYLE_PROP_META_INITIAL 0x4000
+#define LV_STYLE_PROP_META_MASK (LV_STYLE_PROP_META_INHERIT | LV_STYLE_PROP_META_INITIAL)
+
+#define LV_STYLE_PROP_ID_MASK(prop) ((lv_style_prop_t)((prop) & ~LV_STYLE_PROP_META_MASK))
/**********************
* TYPEDEFS
@@ -153,126 +177,125 @@ typedef union {
/**
* Enumeration of all built in style properties
+ *
+ * Props are split into groups of 16. When adding a new prop to a group, ensure it does not overflow into the next one.
*/
typedef enum {
- LV_STYLE_PROP_INV = 0,
+ LV_STYLE_PROP_INV = 0,
/*Group 0*/
- LV_STYLE_WIDTH = 1 | LV_STYLE_PROP_LAYOUT_REFR,
- LV_STYLE_MIN_WIDTH = 2 | LV_STYLE_PROP_LAYOUT_REFR,
- LV_STYLE_MAX_WIDTH = 3 | LV_STYLE_PROP_LAYOUT_REFR,
- LV_STYLE_HEIGHT = 4 | LV_STYLE_PROP_LAYOUT_REFR,
- LV_STYLE_MIN_HEIGHT = 5 | LV_STYLE_PROP_LAYOUT_REFR,
- LV_STYLE_MAX_HEIGHT = 6 | LV_STYLE_PROP_LAYOUT_REFR,
- LV_STYLE_X = 7 | LV_STYLE_PROP_LAYOUT_REFR,
- LV_STYLE_Y = 8 | LV_STYLE_PROP_LAYOUT_REFR,
- LV_STYLE_ALIGN = 9 | LV_STYLE_PROP_LAYOUT_REFR,
- LV_STYLE_TRANSFORM_WIDTH = 10 | LV_STYLE_PROP_EXT_DRAW,
- LV_STYLE_TRANSFORM_HEIGHT = 11 | LV_STYLE_PROP_EXT_DRAW,
- LV_STYLE_TRANSLATE_X = 12 | LV_STYLE_PROP_LAYOUT_REFR | LV_STYLE_PROP_PARENT_LAYOUT_REFR,
- LV_STYLE_TRANSLATE_Y = 13 | LV_STYLE_PROP_LAYOUT_REFR | LV_STYLE_PROP_PARENT_LAYOUT_REFR,
- LV_STYLE_TRANSFORM_ZOOM = 14 | LV_STYLE_PROP_EXT_DRAW | LV_STYLE_PROP_LAYOUT_REFR | LV_STYLE_PROP_PARENT_LAYOUT_REFR,
- LV_STYLE_TRANSFORM_ANGLE = 15 | LV_STYLE_PROP_EXT_DRAW | LV_STYLE_PROP_LAYOUT_REFR | LV_STYLE_PROP_PARENT_LAYOUT_REFR,
+ LV_STYLE_WIDTH = 1,
+ LV_STYLE_MIN_WIDTH = 2,
+ LV_STYLE_MAX_WIDTH = 3,
+ LV_STYLE_HEIGHT = 4,
+ LV_STYLE_MIN_HEIGHT = 5,
+ LV_STYLE_MAX_HEIGHT = 6,
+ LV_STYLE_X = 7,
+ LV_STYLE_Y = 8,
+ LV_STYLE_ALIGN = 9,
+ LV_STYLE_LAYOUT = 10,
+ LV_STYLE_RADIUS = 11,
/*Group 1*/
- LV_STYLE_PAD_TOP = 16 | LV_STYLE_PROP_EXT_DRAW | LV_STYLE_PROP_LAYOUT_REFR,
- LV_STYLE_PAD_BOTTOM = 17 | LV_STYLE_PROP_EXT_DRAW | LV_STYLE_PROP_LAYOUT_REFR,
- LV_STYLE_PAD_LEFT = 18 | LV_STYLE_PROP_EXT_DRAW | LV_STYLE_PROP_LAYOUT_REFR,
- LV_STYLE_PAD_RIGHT = 19 | LV_STYLE_PROP_EXT_DRAW | LV_STYLE_PROP_LAYOUT_REFR,
- LV_STYLE_PAD_ROW = 20 | LV_STYLE_PROP_EXT_DRAW | LV_STYLE_PROP_LAYOUT_REFR,
- LV_STYLE_PAD_COLUMN = 21 | LV_STYLE_PROP_EXT_DRAW | LV_STYLE_PROP_LAYOUT_REFR,
+ LV_STYLE_PAD_TOP = 16,
+ LV_STYLE_PAD_BOTTOM = 17,
+ LV_STYLE_PAD_LEFT = 18,
+ LV_STYLE_PAD_RIGHT = 19,
+ LV_STYLE_PAD_ROW = 20,
+ LV_STYLE_PAD_COLUMN = 21,
+ LV_STYLE_BASE_DIR = 22,
+ LV_STYLE_CLIP_CORNER = 23,
/*Group 2*/
- LV_STYLE_BG_COLOR = 32,
- LV_STYLE_BG_COLOR_FILTERED = 32 | LV_STYLE_PROP_FILTER,
- LV_STYLE_BG_OPA = 33,
- LV_STYLE_BG_GRAD_COLOR = 34,
- LV_STYLE_BG_GRAD_COLOR_FILTERED = 34 | LV_STYLE_PROP_FILTER,
- LV_STYLE_BG_GRAD_DIR = 35,
- LV_STYLE_BG_MAIN_STOP = 36,
- LV_STYLE_BG_GRAD_STOP = 37,
- LV_STYLE_BG_GRAD = 38,
- LV_STYLE_BG_DITHER_MODE = 39,
-
-
- LV_STYLE_BG_IMG_SRC = 40 | LV_STYLE_PROP_EXT_DRAW,
- LV_STYLE_BG_IMG_OPA = 41,
- LV_STYLE_BG_IMG_RECOLOR = 42,
- LV_STYLE_BG_IMG_RECOLOR_FILTERED = 42 | LV_STYLE_PROP_FILTER,
- LV_STYLE_BG_IMG_RECOLOR_OPA = 43,
- LV_STYLE_BG_IMG_TILED = 44,
+ LV_STYLE_BG_COLOR = 32,
+ LV_STYLE_BG_OPA = 33,
+ LV_STYLE_BG_GRAD_COLOR = 34,
+ LV_STYLE_BG_GRAD_DIR = 35,
+ LV_STYLE_BG_MAIN_STOP = 36,
+ LV_STYLE_BG_GRAD_STOP = 37,
+ LV_STYLE_BG_GRAD = 38,
+ LV_STYLE_BG_DITHER_MODE = 39,
+ LV_STYLE_BG_IMG_SRC = 40,
+ LV_STYLE_BG_IMG_OPA = 41,
+ LV_STYLE_BG_IMG_RECOLOR = 42,
+ LV_STYLE_BG_IMG_RECOLOR_OPA = 43,
+ LV_STYLE_BG_IMG_TILED = 44,
/*Group 3*/
- LV_STYLE_BORDER_COLOR = 48,
- LV_STYLE_BORDER_COLOR_FILTERED = 48 | LV_STYLE_PROP_FILTER,
- LV_STYLE_BORDER_OPA = 49,
- LV_STYLE_BORDER_WIDTH = 50 | LV_STYLE_PROP_LAYOUT_REFR,
- LV_STYLE_BORDER_SIDE = 51,
- LV_STYLE_BORDER_POST = 52,
-
- LV_STYLE_OUTLINE_WIDTH = 58 | LV_STYLE_PROP_EXT_DRAW,
- LV_STYLE_OUTLINE_COLOR = 59,
- LV_STYLE_OUTLINE_COLOR_FILTERED = 59 | LV_STYLE_PROP_FILTER,
- LV_STYLE_OUTLINE_OPA = 60 | LV_STYLE_PROP_EXT_DRAW,
- LV_STYLE_OUTLINE_PAD = 61 | LV_STYLE_PROP_EXT_DRAW,
+ LV_STYLE_BORDER_COLOR = 48,
+ LV_STYLE_BORDER_OPA = 49,
+ LV_STYLE_BORDER_WIDTH = 50,
+ LV_STYLE_BORDER_SIDE = 51,
+ LV_STYLE_BORDER_POST = 52,
+ LV_STYLE_OUTLINE_WIDTH = 53,
+ LV_STYLE_OUTLINE_COLOR = 54,
+ LV_STYLE_OUTLINE_OPA = 55,
+ LV_STYLE_OUTLINE_PAD = 56,
/*Group 4*/
- LV_STYLE_SHADOW_WIDTH = 64 | LV_STYLE_PROP_EXT_DRAW,
- LV_STYLE_SHADOW_OFS_X = 65 | LV_STYLE_PROP_EXT_DRAW,
- LV_STYLE_SHADOW_OFS_Y = 66 | LV_STYLE_PROP_EXT_DRAW,
- LV_STYLE_SHADOW_SPREAD = 67 | LV_STYLE_PROP_EXT_DRAW,
- LV_STYLE_SHADOW_COLOR = 68,
- LV_STYLE_SHADOW_COLOR_FILTERED = 68 | LV_STYLE_PROP_FILTER,
- LV_STYLE_SHADOW_OPA = 69 | LV_STYLE_PROP_EXT_DRAW,
-
- LV_STYLE_IMG_OPA = 70,
- LV_STYLE_IMG_RECOLOR = 71,
- LV_STYLE_IMG_RECOLOR_FILTERED = 71 | LV_STYLE_PROP_FILTER,
- LV_STYLE_IMG_RECOLOR_OPA = 72,
-
- LV_STYLE_LINE_WIDTH = 73 | LV_STYLE_PROP_EXT_DRAW,
- LV_STYLE_LINE_DASH_WIDTH = 74,
- LV_STYLE_LINE_DASH_GAP = 75,
- LV_STYLE_LINE_ROUNDED = 76,
- LV_STYLE_LINE_COLOR = 77,
- LV_STYLE_LINE_COLOR_FILTERED = 77 | LV_STYLE_PROP_FILTER,
- LV_STYLE_LINE_OPA = 78,
+ LV_STYLE_SHADOW_WIDTH = 64,
+ LV_STYLE_SHADOW_OFS_X = 65,
+ LV_STYLE_SHADOW_OFS_Y = 66,
+ LV_STYLE_SHADOW_SPREAD = 67,
+ LV_STYLE_SHADOW_COLOR = 68,
+ LV_STYLE_SHADOW_OPA = 69,
+ LV_STYLE_IMG_OPA = 70,
+ LV_STYLE_IMG_RECOLOR = 71,
+ LV_STYLE_IMG_RECOLOR_OPA = 72,
+ LV_STYLE_LINE_WIDTH = 73,
+ LV_STYLE_LINE_DASH_WIDTH = 74,
+ LV_STYLE_LINE_DASH_GAP = 75,
+ LV_STYLE_LINE_ROUNDED = 76,
+ LV_STYLE_LINE_COLOR = 77,
+ LV_STYLE_LINE_OPA = 78,
/*Group 5*/
- LV_STYLE_ARC_WIDTH = 80 | LV_STYLE_PROP_EXT_DRAW,
- LV_STYLE_ARC_ROUNDED = 81,
- LV_STYLE_ARC_COLOR = 82,
- LV_STYLE_ARC_COLOR_FILTERED = 82 | LV_STYLE_PROP_FILTER,
- LV_STYLE_ARC_OPA = 83,
- LV_STYLE_ARC_IMG_SRC = 84,
-
- LV_STYLE_TEXT_COLOR = 87 | LV_STYLE_PROP_INHERIT,
- LV_STYLE_TEXT_COLOR_FILTERED = 87 | LV_STYLE_PROP_INHERIT | LV_STYLE_PROP_FILTER,
- LV_STYLE_TEXT_OPA = 88 | LV_STYLE_PROP_INHERIT,
- LV_STYLE_TEXT_FONT = 89 | LV_STYLE_PROP_INHERIT | LV_STYLE_PROP_LAYOUT_REFR,
- LV_STYLE_TEXT_LETTER_SPACE = 90 | LV_STYLE_PROP_INHERIT | LV_STYLE_PROP_LAYOUT_REFR,
- LV_STYLE_TEXT_LINE_SPACE = 91 | LV_STYLE_PROP_INHERIT | LV_STYLE_PROP_LAYOUT_REFR,
- LV_STYLE_TEXT_DECOR = 92 | LV_STYLE_PROP_INHERIT,
- LV_STYLE_TEXT_ALIGN = 93 | LV_STYLE_PROP_INHERIT | LV_STYLE_PROP_LAYOUT_REFR,
+ LV_STYLE_ARC_WIDTH = 80,
+ LV_STYLE_ARC_ROUNDED = 81,
+ LV_STYLE_ARC_COLOR = 82,
+ LV_STYLE_ARC_OPA = 83,
+ LV_STYLE_ARC_IMG_SRC = 84,
+ LV_STYLE_TEXT_COLOR = 85,
+ LV_STYLE_TEXT_OPA = 86,
+ LV_STYLE_TEXT_FONT = 87,
+ LV_STYLE_TEXT_LETTER_SPACE = 88,
+ LV_STYLE_TEXT_LINE_SPACE = 89,
+ LV_STYLE_TEXT_DECOR = 90,
+ LV_STYLE_TEXT_ALIGN = 91,
/*Group 6*/
- LV_STYLE_RADIUS = 96,
- LV_STYLE_CLIP_CORNER = 97,
- LV_STYLE_OPA = 98 | LV_STYLE_PROP_INHERIT,
- LV_STYLE_COLOR_FILTER_DSC = 99,
- LV_STYLE_COLOR_FILTER_OPA = 100,
- LV_STYLE_ANIM_TIME = 101,
- LV_STYLE_ANIM_SPEED = 102,
- LV_STYLE_TRANSITION = 103,
- LV_STYLE_BLEND_MODE = 104,
- LV_STYLE_LAYOUT = 105 | LV_STYLE_PROP_LAYOUT_REFR,
- LV_STYLE_BASE_DIR = 106 | LV_STYLE_PROP_INHERIT | LV_STYLE_PROP_LAYOUT_REFR,
+ LV_STYLE_OPA = 96,
+ LV_STYLE_COLOR_FILTER_DSC = 97,
+ LV_STYLE_COLOR_FILTER_OPA = 98,
+ LV_STYLE_ANIM = 99,
+ LV_STYLE_ANIM_TIME = 100,
+ LV_STYLE_ANIM_SPEED = 101,
+ LV_STYLE_TRANSITION = 102,
+ LV_STYLE_BLEND_MODE = 103,
+ LV_STYLE_TRANSFORM_WIDTH = 104,
+ LV_STYLE_TRANSFORM_HEIGHT = 105,
+ LV_STYLE_TRANSLATE_X = 106,
+ LV_STYLE_TRANSLATE_Y = 107,
+ LV_STYLE_TRANSFORM_ZOOM = 108,
+ LV_STYLE_TRANSFORM_ANGLE = 109,
+ LV_STYLE_TRANSFORM_PIVOT_X = 110,
+ LV_STYLE_TRANSFORM_PIVOT_Y = 111,
_LV_STYLE_LAST_BUILT_IN_PROP = 111,
+ _LV_STYLE_NUM_BUILT_IN_PROPS = _LV_STYLE_LAST_BUILT_IN_PROP + 1,
- LV_STYLE_PROP_ANY = 0xFFFF
+ LV_STYLE_PROP_ANY = 0xFFFF,
+ _LV_STYLE_PROP_CONST = 0xFFFF /* magic value for const styles */
} lv_style_prop_t;
+enum {
+ LV_STYLE_RES_NOT_FOUND,
+ LV_STYLE_RES_FOUND,
+ LV_STYLE_RES_INHERIT
+};
+
+typedef uint8_t lv_style_res_t;
+
/**
* Descriptor for style transitions
*/
@@ -311,8 +334,7 @@ typedef struct {
const lv_style_const_prop_t * const_props;
} v_p;
- uint16_t prop1 : 15;
- uint16_t is_const : 1;
+ uint16_t prop1;
uint8_t has_group;
uint8_t prop_cnt;
} lv_style_t;
@@ -339,7 +361,7 @@ void lv_style_reset(lv_style_t * style);
/**
* Register a new style property for custom usage
- * @return a new property ID.
+ * @return a new property ID, or LV_STYLE_PROP_INV if there are no more available.
* @example
* lv_style_prop_t MY_PROP;
* static inline void lv_style_set_my_prop(lv_style_t * style, lv_color_t value) {
@@ -350,7 +372,12 @@ void lv_style_reset(lv_style_t * style);
* ...
* lv_style_set_my_prop(&style1, lv_palette_main(LV_PALETTE_RED));
*/
-lv_style_prop_t lv_style_register_prop(void);
+lv_style_prop_t lv_style_register_prop(uint8_t flag);
+
+/**
+ * Get the number of custom properties that have been registered thus far.
+ */
+lv_style_prop_t lv_style_get_num_custom_props(void);
/**
* Remove a property from a style
@@ -370,6 +397,15 @@ bool lv_style_remove_prop(lv_style_t * style, lv_style_prop_t prop);
*/
void lv_style_set_prop(lv_style_t * style, lv_style_prop_t prop, lv_style_value_t value);
+/**
+ * Set a special meta state for a property in a style.
+ * This function shouldn't be used directly by the user.
+ * @param style pointer to style
+ * @param prop the ID of a property (e.g. `LV_STYLE_BG_COLOR`)
+ * @param meta the meta value to attach to the property in the style
+ */
+void lv_style_set_prop_meta(lv_style_t * style, lv_style_prop_t prop, uint16_t meta);
+
/**
* Get the value of a property
* @param style pointer to a style
@@ -379,8 +415,30 @@ void lv_style_set_prop(lv_style_t * style, lv_style_prop_t prop, lv_style_value_
* LV_RES_OK: the property was fond, and `value` is set accordingly
* @note For performance reasons there are no sanity check on `style`
*/
-lv_res_t lv_style_get_prop(const lv_style_t * style, lv_style_prop_t prop, lv_style_value_t * value);
+lv_style_res_t lv_style_get_prop(const lv_style_t * style, lv_style_prop_t prop, lv_style_value_t * value);
+
+/**
+ * Initialize a transition descriptor.
+ * @param tr pointer to a transition descriptor to initialize
+ * @param props an array with the properties to transition. The last element must be zero.
+ * @param path_cb an animation path (ease) callback. If `NULL` liner path will be used.
+ * @param time duration of the transition in [ms]
+ * @param delay delay before the transition in [ms]
+ * @param user_data any custom data that will be saved in the transition animation and will be available when `path_cb` is called
+ * @example
+ * const static lv_style_prop_t trans_props[] = { LV_STYLE_BG_OPA, LV_STYLE_BG_COLOR, 0 };
+ * static lv_style_transition_dsc_t trans1;
+ * lv_style_transition_dsc_init(&trans1, trans_props, NULL, 300, 0, NULL);
+ */
+void lv_style_transition_dsc_init(lv_style_transition_dsc_t * tr, const lv_style_prop_t props[],
+ lv_anim_path_cb_t path_cb, uint32_t time, uint32_t delay, void * user_data);
+/**
+ * Get the default value of a property
+ * @param prop the ID of a property
+ * @return the default value
+ */
+lv_style_value_t lv_style_prop_get_default(lv_style_prop_t prop);
/**
* Get the value of a property
@@ -392,64 +450,56 @@ lv_res_t lv_style_get_prop(const lv_style_t * style, lv_style_prop_t prop, lv_st
* @note For performance reasons there are no sanity check on `style`
* @note This function is the same as ::lv_style_get_prop but inlined. Use it only on performance critical places
*/
-static inline lv_res_t lv_style_get_prop_inlined(const lv_style_t * style, lv_style_prop_t prop,
- lv_style_value_t * value)
+static inline lv_style_res_t lv_style_get_prop_inlined(const lv_style_t * style, lv_style_prop_t prop,
+ lv_style_value_t * value)
{
- if(style->is_const) {
+ if(style->prop1 == LV_STYLE_PROP_ANY) {
const lv_style_const_prop_t * const_prop;
- for(const_prop = style->v_p.const_props; const_prop->prop != LV_STYLE_PROP_INV; const_prop++) {
- if(const_prop->prop == prop) {
- *value = const_prop->value;
- return LV_RES_OK;
+ uint32_t i;
+ for(i = 0; i < style->prop_cnt; i++) {
+ const_prop = style->v_p.const_props + i;
+ lv_style_prop_t prop_id = LV_STYLE_PROP_ID_MASK(const_prop->prop);
+ if(prop_id == prop) {
+ if(const_prop->prop & LV_STYLE_PROP_META_INHERIT)
+ return LV_STYLE_RES_INHERIT;
+ *value = (const_prop->prop & LV_STYLE_PROP_META_INITIAL) ? lv_style_prop_get_default(prop_id) : const_prop->value;
+ return LV_STYLE_RES_FOUND;
}
}
- return LV_RES_INV;
+ return LV_STYLE_RES_NOT_FOUND;
}
- if(style->prop_cnt == 0) return LV_RES_INV;
+ if(style->prop_cnt == 0) return LV_STYLE_RES_NOT_FOUND;
if(style->prop_cnt > 1) {
uint8_t * tmp = style->v_p.values_and_props + style->prop_cnt * sizeof(lv_style_value_t);
uint16_t * props = (uint16_t *)tmp;
uint32_t i;
for(i = 0; i < style->prop_cnt; i++) {
- if(props[i] == prop) {
- lv_style_value_t * values = (lv_style_value_t *)style->v_p.values_and_props;
- *value = values[i];
- return LV_RES_OK;
+ lv_style_prop_t prop_id = LV_STYLE_PROP_ID_MASK(props[i]);
+ if(prop_id == prop) {
+ if(props[i] & LV_STYLE_PROP_META_INHERIT)
+ return LV_STYLE_RES_INHERIT;
+ if(props[i] & LV_STYLE_PROP_META_INITIAL)
+ *value = lv_style_prop_get_default(prop_id);
+ else {
+ lv_style_value_t * values = (lv_style_value_t *)style->v_p.values_and_props;
+ *value = values[i];
+ }
+ return LV_STYLE_RES_FOUND;
}
}
}
- else if(style->prop1 == prop) {
- *value = style->v_p.value1;
- return LV_RES_OK;
+ else if(LV_STYLE_PROP_ID_MASK(style->prop1) == prop) {
+ if(style->prop1 & LV_STYLE_PROP_META_INHERIT)
+ return LV_STYLE_RES_INHERIT;
+ *value = (style->prop1 & LV_STYLE_PROP_META_INITIAL) ? lv_style_prop_get_default(LV_STYLE_PROP_ID_MASK(
+ style->prop1)) : style->v_p.value1;
+ return LV_STYLE_RES_FOUND;
}
- return LV_RES_INV;
+ return LV_STYLE_RES_NOT_FOUND;
}
-/**
- * Initialize a transition descriptor.
- * @param tr pointer to a transition descriptor to initialize
- * @param props an array with the properties to transition. The last element must be zero.
- * @param path_cb an animation path (ease) callback. If `NULL` liner path will be used.
- * @param time duration of the transition in [ms]
- * @param delay delay before the transition in [ms]
- * @param user_data any custom data that will be saved in the transition animation and will be available when `path_cb` is called
- * @example
- * const static lv_style_prop_t trans_props[] = { LV_STYLE_BG_OPA, LV_STYLE_BG_COLOR, 0 };
- * static lv_style_transition_dsc_t trans1;
- * lv_style_transition_dsc_init(&trans1, trans_props, NULL, 300, 0, NULL);
- */
-void lv_style_transition_dsc_init(lv_style_transition_dsc_t * tr, const lv_style_prop_t props[],
- lv_anim_path_cb_t path_cb, uint32_t time, uint32_t delay, void * user_data);
-
-/**
- * Get the default value of a property
- * @param prop the ID of a property
- * @return the default value
- */
-lv_style_value_t lv_style_prop_get_default(lv_style_prop_t prop);
-
/**
* Checks if a style is empty (has no properties)
* @param style pointer to a style
@@ -465,6 +515,14 @@ bool lv_style_is_empty(const lv_style_t * style);
*/
uint8_t _lv_style_get_prop_group(lv_style_prop_t prop);
+/**
+ * Get the flags of a built-in or custom property.
+ *
+ * @param prop a style property
+ * @return the flags of the property
+ */
+uint8_t _lv_style_prop_lookup_flags(lv_style_prop_t prop);
+
#include "lv_style_gen.h"
static inline void lv_style_set_size(lv_style_t * style, lv_coord_t value)
@@ -499,6 +557,20 @@ static inline void lv_style_set_pad_gap(lv_style_t * style, lv_coord_t value)
lv_style_set_pad_column(style, value);
}
+/**
+ * @brief Check if the style property has a specified behavioral flag.
+ *
+ * Do not pass multiple flags to this function as backwards-compatibility is not guaranteed
+ * for that.
+ *
+ * @param prop Property ID
+ * @param flag Flag
+ * @return true if the flag is set for this property
+ */
+static inline bool lv_style_prop_has_flag(lv_style_prop_t prop, uint8_t flag)
+{
+ return _lv_style_prop_lookup_flags(prop) & flag;
+}
/*************************
* GLOBAL VARIABLES
diff --git a/src/misc/lv_style_gen.c b/src/misc/lv_style_gen.c
index b806a996b..13d85607a 100644
--- a/src/misc/lv_style_gen.c
+++ b/src/misc/lv_style_gen.c
@@ -120,6 +120,22 @@ void lv_style_set_transform_angle(lv_style_t * style, lv_coord_t value)
lv_style_set_prop(style, LV_STYLE_TRANSFORM_ANGLE, v);
}
+void lv_style_set_transform_pivot_x(lv_style_t * style, lv_coord_t value)
+{
+ lv_style_value_t v = {
+ .num = (int32_t)value
+ };
+ lv_style_set_prop(style, LV_STYLE_TRANSFORM_PIVOT_X, v);
+}
+
+void lv_style_set_transform_pivot_y(lv_style_t * style, lv_coord_t value)
+{
+ lv_style_value_t v = {
+ .num = (int32_t)value
+ };
+ lv_style_set_prop(style, LV_STYLE_TRANSFORM_PIVOT_Y, v);
+}
+
void lv_style_set_pad_top(lv_style_t * style, lv_coord_t value)
{
lv_style_value_t v = {
@@ -176,14 +192,6 @@ void lv_style_set_bg_color(lv_style_t * style, lv_color_t value)
lv_style_set_prop(style, LV_STYLE_BG_COLOR, v);
}
-void lv_style_set_bg_color_filtered(lv_style_t * style, lv_color_t value)
-{
- lv_style_value_t v = {
- .color = value
- };
- lv_style_set_prop(style, LV_STYLE_BG_COLOR_FILTERED, v);
-}
-
void lv_style_set_bg_opa(lv_style_t * style, lv_opa_t value)
{
lv_style_value_t v = {
@@ -200,14 +208,6 @@ void lv_style_set_bg_grad_color(lv_style_t * style, lv_color_t value)
lv_style_set_prop(style, LV_STYLE_BG_GRAD_COLOR, v);
}
-void lv_style_set_bg_grad_color_filtered(lv_style_t * style, lv_color_t value)
-{
- lv_style_value_t v = {
- .color = value
- };
- lv_style_set_prop(style, LV_STYLE_BG_GRAD_COLOR_FILTERED, v);
-}
-
void lv_style_set_bg_grad_dir(lv_style_t * style, lv_grad_dir_t value)
{
lv_style_value_t v = {
@@ -272,14 +272,6 @@ void lv_style_set_bg_img_recolor(lv_style_t * style, lv_color_t value)
lv_style_set_prop(style, LV_STYLE_BG_IMG_RECOLOR, v);
}
-void lv_style_set_bg_img_recolor_filtered(lv_style_t * style, lv_color_t value)
-{
- lv_style_value_t v = {
- .color = value
- };
- lv_style_set_prop(style, LV_STYLE_BG_IMG_RECOLOR_FILTERED, v);
-}
-
void lv_style_set_bg_img_recolor_opa(lv_style_t * style, lv_opa_t value)
{
lv_style_value_t v = {
@@ -304,14 +296,6 @@ void lv_style_set_border_color(lv_style_t * style, lv_color_t value)
lv_style_set_prop(style, LV_STYLE_BORDER_COLOR, v);
}
-void lv_style_set_border_color_filtered(lv_style_t * style, lv_color_t value)
-{
- lv_style_value_t v = {
- .color = value
- };
- lv_style_set_prop(style, LV_STYLE_BORDER_COLOR_FILTERED, v);
-}
-
void lv_style_set_border_opa(lv_style_t * style, lv_opa_t value)
{
lv_style_value_t v = {
@@ -360,14 +344,6 @@ void lv_style_set_outline_color(lv_style_t * style, lv_color_t value)
lv_style_set_prop(style, LV_STYLE_OUTLINE_COLOR, v);
}
-void lv_style_set_outline_color_filtered(lv_style_t * style, lv_color_t value)
-{
- lv_style_value_t v = {
- .color = value
- };
- lv_style_set_prop(style, LV_STYLE_OUTLINE_COLOR_FILTERED, v);
-}
-
void lv_style_set_outline_opa(lv_style_t * style, lv_opa_t value)
{
lv_style_value_t v = {
@@ -424,14 +400,6 @@ void lv_style_set_shadow_color(lv_style_t * style, lv_color_t value)
lv_style_set_prop(style, LV_STYLE_SHADOW_COLOR, v);
}
-void lv_style_set_shadow_color_filtered(lv_style_t * style, lv_color_t value)
-{
- lv_style_value_t v = {
- .color = value
- };
- lv_style_set_prop(style, LV_STYLE_SHADOW_COLOR_FILTERED, v);
-}
-
void lv_style_set_shadow_opa(lv_style_t * style, lv_opa_t value)
{
lv_style_value_t v = {
@@ -456,14 +424,6 @@ void lv_style_set_img_recolor(lv_style_t * style, lv_color_t value)
lv_style_set_prop(style, LV_STYLE_IMG_RECOLOR, v);
}
-void lv_style_set_img_recolor_filtered(lv_style_t * style, lv_color_t value)
-{
- lv_style_value_t v = {
- .color = value
- };
- lv_style_set_prop(style, LV_STYLE_IMG_RECOLOR_FILTERED, v);
-}
-
void lv_style_set_img_recolor_opa(lv_style_t * style, lv_opa_t value)
{
lv_style_value_t v = {
@@ -512,14 +472,6 @@ void lv_style_set_line_color(lv_style_t * style, lv_color_t value)
lv_style_set_prop(style, LV_STYLE_LINE_COLOR, v);
}
-void lv_style_set_line_color_filtered(lv_style_t * style, lv_color_t value)
-{
- lv_style_value_t v = {
- .color = value
- };
- lv_style_set_prop(style, LV_STYLE_LINE_COLOR_FILTERED, v);
-}
-
void lv_style_set_line_opa(lv_style_t * style, lv_opa_t value)
{
lv_style_value_t v = {
@@ -552,14 +504,6 @@ void lv_style_set_arc_color(lv_style_t * style, lv_color_t value)
lv_style_set_prop(style, LV_STYLE_ARC_COLOR, v);
}
-void lv_style_set_arc_color_filtered(lv_style_t * style, lv_color_t value)
-{
- lv_style_value_t v = {
- .color = value
- };
- lv_style_set_prop(style, LV_STYLE_ARC_COLOR_FILTERED, v);
-}
-
void lv_style_set_arc_opa(lv_style_t * style, lv_opa_t value)
{
lv_style_value_t v = {
@@ -584,14 +528,6 @@ void lv_style_set_text_color(lv_style_t * style, lv_color_t value)
lv_style_set_prop(style, LV_STYLE_TEXT_COLOR, v);
}
-void lv_style_set_text_color_filtered(lv_style_t * style, lv_color_t value)
-{
- lv_style_value_t v = {
- .color = value
- };
- lv_style_set_prop(style, LV_STYLE_TEXT_COLOR_FILTERED, v);
-}
-
void lv_style_set_text_opa(lv_style_t * style, lv_opa_t value)
{
lv_style_value_t v = {
@@ -680,6 +616,14 @@ void lv_style_set_color_filter_opa(lv_style_t * style, lv_opa_t value)
lv_style_set_prop(style, LV_STYLE_COLOR_FILTER_OPA, v);
}
+void lv_style_set_anim(lv_style_t * style, const lv_anim_t * value)
+{
+ lv_style_value_t v = {
+ .ptr = value
+ };
+ lv_style_set_prop(style, LV_STYLE_ANIM, v);
+}
+
void lv_style_set_anim_time(lv_style_t * style, uint32_t value)
{
lv_style_value_t v = {
diff --git a/src/misc/lv_style_gen.h b/src/misc/lv_style_gen.h
index 04e1f1a52..8bf3b68f4 100644
--- a/src/misc/lv_style_gen.h
+++ b/src/misc/lv_style_gen.h
@@ -13,6 +13,8 @@ void lv_style_set_translate_x(lv_style_t * style, lv_coord_t value);
void lv_style_set_translate_y(lv_style_t * style, lv_coord_t value);
void lv_style_set_transform_zoom(lv_style_t * style, lv_coord_t value);
void lv_style_set_transform_angle(lv_style_t * style, lv_coord_t value);
+void lv_style_set_transform_pivot_x(lv_style_t * style, lv_coord_t value);
+void lv_style_set_transform_pivot_y(lv_style_t * style, lv_coord_t value);
void lv_style_set_pad_top(lv_style_t * style, lv_coord_t value);
void lv_style_set_pad_bottom(lv_style_t * style, lv_coord_t value);
void lv_style_set_pad_left(lv_style_t * style, lv_coord_t value);
@@ -20,10 +22,8 @@ void lv_style_set_pad_right(lv_style_t * style, lv_coord_t value);
void lv_style_set_pad_row(lv_style_t * style, lv_coord_t value);
void lv_style_set_pad_column(lv_style_t * style, lv_coord_t value);
void lv_style_set_bg_color(lv_style_t * style, lv_color_t value);
-void lv_style_set_bg_color_filtered(lv_style_t * style, lv_color_t value);
void lv_style_set_bg_opa(lv_style_t * style, lv_opa_t value);
void lv_style_set_bg_grad_color(lv_style_t * style, lv_color_t value);
-void lv_style_set_bg_grad_color_filtered(lv_style_t * style, lv_color_t value);
void lv_style_set_bg_grad_dir(lv_style_t * style, lv_grad_dir_t value);
void lv_style_set_bg_main_stop(lv_style_t * style, lv_coord_t value);
void lv_style_set_bg_grad_stop(lv_style_t * style, lv_coord_t value);
@@ -32,18 +32,15 @@ void lv_style_set_bg_dither_mode(lv_style_t * style, lv_dither_mode_t value);
void lv_style_set_bg_img_src(lv_style_t * style, const void * value);
void lv_style_set_bg_img_opa(lv_style_t * style, lv_opa_t value);
void lv_style_set_bg_img_recolor(lv_style_t * style, lv_color_t value);
-void lv_style_set_bg_img_recolor_filtered(lv_style_t * style, lv_color_t value);
void lv_style_set_bg_img_recolor_opa(lv_style_t * style, lv_opa_t value);
void lv_style_set_bg_img_tiled(lv_style_t * style, bool value);
void lv_style_set_border_color(lv_style_t * style, lv_color_t value);
-void lv_style_set_border_color_filtered(lv_style_t * style, lv_color_t value);
void lv_style_set_border_opa(lv_style_t * style, lv_opa_t value);
void lv_style_set_border_width(lv_style_t * style, lv_coord_t value);
void lv_style_set_border_side(lv_style_t * style, lv_border_side_t value);
void lv_style_set_border_post(lv_style_t * style, bool value);
void lv_style_set_outline_width(lv_style_t * style, lv_coord_t value);
void lv_style_set_outline_color(lv_style_t * style, lv_color_t value);
-void lv_style_set_outline_color_filtered(lv_style_t * style, lv_color_t value);
void lv_style_set_outline_opa(lv_style_t * style, lv_opa_t value);
void lv_style_set_outline_pad(lv_style_t * style, lv_coord_t value);
void lv_style_set_shadow_width(lv_style_t * style, lv_coord_t value);
@@ -51,27 +48,22 @@ void lv_style_set_shadow_ofs_x(lv_style_t * style, lv_coord_t value);
void lv_style_set_shadow_ofs_y(lv_style_t * style, lv_coord_t value);
void lv_style_set_shadow_spread(lv_style_t * style, lv_coord_t value);
void lv_style_set_shadow_color(lv_style_t * style, lv_color_t value);
-void lv_style_set_shadow_color_filtered(lv_style_t * style, lv_color_t value);
void lv_style_set_shadow_opa(lv_style_t * style, lv_opa_t value);
void lv_style_set_img_opa(lv_style_t * style, lv_opa_t value);
void lv_style_set_img_recolor(lv_style_t * style, lv_color_t value);
-void lv_style_set_img_recolor_filtered(lv_style_t * style, lv_color_t value);
void lv_style_set_img_recolor_opa(lv_style_t * style, lv_opa_t value);
void lv_style_set_line_width(lv_style_t * style, lv_coord_t value);
void lv_style_set_line_dash_width(lv_style_t * style, lv_coord_t value);
void lv_style_set_line_dash_gap(lv_style_t * style, lv_coord_t value);
void lv_style_set_line_rounded(lv_style_t * style, bool value);
void lv_style_set_line_color(lv_style_t * style, lv_color_t value);
-void lv_style_set_line_color_filtered(lv_style_t * style, lv_color_t value);
void lv_style_set_line_opa(lv_style_t * style, lv_opa_t value);
void lv_style_set_arc_width(lv_style_t * style, lv_coord_t value);
void lv_style_set_arc_rounded(lv_style_t * style, bool value);
void lv_style_set_arc_color(lv_style_t * style, lv_color_t value);
-void lv_style_set_arc_color_filtered(lv_style_t * style, lv_color_t value);
void lv_style_set_arc_opa(lv_style_t * style, lv_opa_t value);
void lv_style_set_arc_img_src(lv_style_t * style, const void * value);
void lv_style_set_text_color(lv_style_t * style, lv_color_t value);
-void lv_style_set_text_color_filtered(lv_style_t * style, lv_color_t value);
void lv_style_set_text_opa(lv_style_t * style, lv_opa_t value);
void lv_style_set_text_font(lv_style_t * style, const lv_font_t * value);
void lv_style_set_text_letter_space(lv_style_t * style, lv_coord_t value);
@@ -83,6 +75,7 @@ void lv_style_set_clip_corner(lv_style_t * style, bool value);
void lv_style_set_opa(lv_style_t * style, lv_opa_t value);
void lv_style_set_color_filter_dsc(lv_style_t * style, const lv_color_filter_dsc_t * value);
void lv_style_set_color_filter_opa(lv_style_t * style, lv_opa_t value);
+void lv_style_set_anim(lv_style_t * style, const lv_anim_t * value);
void lv_style_set_anim_time(lv_style_t * style, uint32_t value);
void lv_style_set_anim_speed(lv_style_t * style, uint32_t value);
void lv_style_set_transition(lv_style_t * style, const lv_style_transition_dsc_t * value);
@@ -165,6 +158,16 @@ void lv_style_set_base_dir(lv_style_t * style, lv_base_dir_t value);
.prop = LV_STYLE_TRANSFORM_ANGLE, .value = { .num = (int32_t)val } \
}
+#define LV_STYLE_CONST_TRANSFORM_PIVOT_X(val) \
+ { \
+ .prop = LV_STYLE_TRANSFORM_PIVOT_X, .value = { .num = (int32_t)val } \
+ }
+
+#define LV_STYLE_CONST_TRANSFORM_PIVOT_Y(val) \
+ { \
+ .prop = LV_STYLE_TRANSFORM_PIVOT_Y, .value = { .num = (int32_t)val } \
+ }
+
#define LV_STYLE_CONST_PAD_TOP(val) \
{ \
.prop = LV_STYLE_PAD_TOP, .value = { .num = (int32_t)val } \
@@ -200,11 +203,6 @@ void lv_style_set_base_dir(lv_style_t * style, lv_base_dir_t value);
.prop = LV_STYLE_BG_COLOR, .value = { .color = val } \
}
-#define LV_STYLE_CONST_BG_COLOR_FILTERED(val) \
- { \
- .prop = LV_STYLE_BG_COLOR_FILTERED, .value = { .color = val } \
- }
-
#define LV_STYLE_CONST_BG_OPA(val) \
{ \
.prop = LV_STYLE_BG_OPA, .value = { .num = (int32_t)val } \
@@ -215,11 +213,6 @@ void lv_style_set_base_dir(lv_style_t * style, lv_base_dir_t value);
.prop = LV_STYLE_BG_GRAD_COLOR, .value = { .color = val } \
}
-#define LV_STYLE_CONST_BG_GRAD_COLOR_FILTERED(val) \
- { \
- .prop = LV_STYLE_BG_GRAD_COLOR_FILTERED, .value = { .color = val } \
- }
-
#define LV_STYLE_CONST_BG_GRAD_DIR(val) \
{ \
.prop = LV_STYLE_BG_GRAD_DIR, .value = { .num = (int32_t)val } \
@@ -260,11 +253,6 @@ void lv_style_set_base_dir(lv_style_t * style, lv_base_dir_t value);
.prop = LV_STYLE_BG_IMG_RECOLOR, .value = { .color = val } \
}
-#define LV_STYLE_CONST_BG_IMG_RECOLOR_FILTERED(val) \
- { \
- .prop = LV_STYLE_BG_IMG_RECOLOR_FILTERED, .value = { .color = val } \
- }
-
#define LV_STYLE_CONST_BG_IMG_RECOLOR_OPA(val) \
{ \
.prop = LV_STYLE_BG_IMG_RECOLOR_OPA, .value = { .num = (int32_t)val } \
@@ -280,11 +268,6 @@ void lv_style_set_base_dir(lv_style_t * style, lv_base_dir_t value);
.prop = LV_STYLE_BORDER_COLOR, .value = { .color = val } \
}
-#define LV_STYLE_CONST_BORDER_COLOR_FILTERED(val) \
- { \
- .prop = LV_STYLE_BORDER_COLOR_FILTERED, .value = { .color = val } \
- }
-
#define LV_STYLE_CONST_BORDER_OPA(val) \
{ \
.prop = LV_STYLE_BORDER_OPA, .value = { .num = (int32_t)val } \
@@ -315,11 +298,6 @@ void lv_style_set_base_dir(lv_style_t * style, lv_base_dir_t value);
.prop = LV_STYLE_OUTLINE_COLOR, .value = { .color = val } \
}
-#define LV_STYLE_CONST_OUTLINE_COLOR_FILTERED(val) \
- { \
- .prop = LV_STYLE_OUTLINE_COLOR_FILTERED, .value = { .color = val } \
- }
-
#define LV_STYLE_CONST_OUTLINE_OPA(val) \
{ \
.prop = LV_STYLE_OUTLINE_OPA, .value = { .num = (int32_t)val } \
@@ -355,11 +333,6 @@ void lv_style_set_base_dir(lv_style_t * style, lv_base_dir_t value);
.prop = LV_STYLE_SHADOW_COLOR, .value = { .color = val } \
}
-#define LV_STYLE_CONST_SHADOW_COLOR_FILTERED(val) \
- { \
- .prop = LV_STYLE_SHADOW_COLOR_FILTERED, .value = { .color = val } \
- }
-
#define LV_STYLE_CONST_SHADOW_OPA(val) \
{ \
.prop = LV_STYLE_SHADOW_OPA, .value = { .num = (int32_t)val } \
@@ -375,11 +348,6 @@ void lv_style_set_base_dir(lv_style_t * style, lv_base_dir_t value);
.prop = LV_STYLE_IMG_RECOLOR, .value = { .color = val } \
}
-#define LV_STYLE_CONST_IMG_RECOLOR_FILTERED(val) \
- { \
- .prop = LV_STYLE_IMG_RECOLOR_FILTERED, .value = { .color = val } \
- }
-
#define LV_STYLE_CONST_IMG_RECOLOR_OPA(val) \
{ \
.prop = LV_STYLE_IMG_RECOLOR_OPA, .value = { .num = (int32_t)val } \
@@ -410,11 +378,6 @@ void lv_style_set_base_dir(lv_style_t * style, lv_base_dir_t value);
.prop = LV_STYLE_LINE_COLOR, .value = { .color = val } \
}
-#define LV_STYLE_CONST_LINE_COLOR_FILTERED(val) \
- { \
- .prop = LV_STYLE_LINE_COLOR_FILTERED, .value = { .color = val } \
- }
-
#define LV_STYLE_CONST_LINE_OPA(val) \
{ \
.prop = LV_STYLE_LINE_OPA, .value = { .num = (int32_t)val } \
@@ -435,11 +398,6 @@ void lv_style_set_base_dir(lv_style_t * style, lv_base_dir_t value);
.prop = LV_STYLE_ARC_COLOR, .value = { .color = val } \
}
-#define LV_STYLE_CONST_ARC_COLOR_FILTERED(val) \
- { \
- .prop = LV_STYLE_ARC_COLOR_FILTERED, .value = { .color = val } \
- }
-
#define LV_STYLE_CONST_ARC_OPA(val) \
{ \
.prop = LV_STYLE_ARC_OPA, .value = { .num = (int32_t)val } \
@@ -455,11 +413,6 @@ void lv_style_set_base_dir(lv_style_t * style, lv_base_dir_t value);
.prop = LV_STYLE_TEXT_COLOR, .value = { .color = val } \
}
-#define LV_STYLE_CONST_TEXT_COLOR_FILTERED(val) \
- { \
- .prop = LV_STYLE_TEXT_COLOR_FILTERED, .value = { .color = val } \
- }
-
#define LV_STYLE_CONST_TEXT_OPA(val) \
{ \
.prop = LV_STYLE_TEXT_OPA, .value = { .num = (int32_t)val } \
@@ -515,6 +468,11 @@ void lv_style_set_base_dir(lv_style_t * style, lv_base_dir_t value);
.prop = LV_STYLE_COLOR_FILTER_OPA, .value = { .num = (int32_t)val } \
}
+#define LV_STYLE_CONST_ANIM(val) \
+ { \
+ .prop = LV_STYLE_ANIM, .value = { .ptr = val } \
+ }
+
#define LV_STYLE_CONST_ANIM_TIME(val) \
{ \
.prop = LV_STYLE_ANIM_TIME, .value = { .num = (int32_t)val } \
diff --git a/src/misc/lv_timer.h b/src/misc/lv_timer.h
index ce94c7b04..a9a8e50de 100644
--- a/src/misc/lv_timer.h
+++ b/src/misc/lv_timer.h
@@ -13,6 +13,7 @@ extern "C" {
* INCLUDES
*********************/
#include "../lv_conf_internal.h"
+#include "../hal/lv_hal_tick.h"
#include
#include
@@ -68,6 +69,24 @@ LV_ATTRIBUTE_TIMER_HANDLER uint32_t lv_timer_handler(void);
//! @endcond
+/**
+ * Call it in the super-loop of main() or threads. It will run lv_timer_handler()
+ * with a given period in ms. You can use it with sleep or delay in OS environment.
+ * This function is used to simplify the porting.
+ * @param __ms the period for running lv_timer_handler()
+ */
+static inline LV_ATTRIBUTE_TIMER_HANDLER uint32_t lv_timer_handler_run_in_period(uint32_t ms)
+{
+ static uint32_t last_tick = 0;
+ uint32_t curr_tick = lv_tick_get();
+
+ if((curr_tick - last_tick) >= (ms)) {
+ last_tick = curr_tick;
+ return lv_timer_handler();
+ }
+ return 1;
+}
+
/**
* Create an "empty" timer. It needs to initialized with at least
* `lv_timer_set_cb` and `lv_timer_set_period`
diff --git a/src/misc/lv_tlsf.c b/src/misc/lv_tlsf.c
index 64197f977..27e0a46cf 100644
--- a/src/misc/lv_tlsf.c
+++ b/src/misc/lv_tlsf.c
@@ -1157,18 +1157,22 @@ void * lv_tlsf_memalign(lv_tlsf_t tlsf, size_t align, size_t size)
return block_prepare_used(control, block, adjust);
}
-void lv_tlsf_free(lv_tlsf_t tlsf, const void * ptr)
+size_t lv_tlsf_free(lv_tlsf_t tlsf, const void * ptr)
{
+ size_t size = 0;
/* Don't attempt to free a NULL pointer. */
if(ptr) {
control_t * control = tlsf_cast(control_t *, tlsf);
block_header_t * block = block_from_ptr(ptr);
tlsf_assert(!block_is_free(block) && "block already marked as free");
+ size = block->size;
block_mark_as_free(block);
block = block_merge_prev(control, block);
block = block_merge_next(control, block);
block_insert(control, block);
}
+
+ return size;
}
/*
@@ -1204,6 +1208,10 @@ void * lv_tlsf_realloc(lv_tlsf_t tlsf, void * ptr, size_t size)
const size_t cursize = block_size(block);
const size_t combined = cursize + block_size(next) + block_header_overhead;
const size_t adjust = adjust_request_size(size, ALIGN_SIZE);
+ if(size > cursize && adjust == 0) {
+ /* The request is probably too large, fail */
+ return NULL;
+ }
tlsf_assert(!block_is_free(block) && "block already marked as free");
diff --git a/src/misc/lv_tlsf.h b/src/misc/lv_tlsf.h
index 9380ee8ca..f12590b60 100644
--- a/src/misc/lv_tlsf.h
+++ b/src/misc/lv_tlsf.h
@@ -66,7 +66,7 @@ void lv_tlsf_remove_pool(lv_tlsf_t tlsf, lv_pool_t pool);
void * lv_tlsf_malloc(lv_tlsf_t tlsf, size_t bytes);
void * lv_tlsf_memalign(lv_tlsf_t tlsf, size_t align, size_t bytes);
void * lv_tlsf_realloc(lv_tlsf_t tlsf, void * ptr, size_t size);
-void lv_tlsf_free(lv_tlsf_t tlsf, const void * ptr);
+size_t lv_tlsf_free(lv_tlsf_t tlsf, const void * ptr);
/* Returns internal block size, not original request size */
size_t lv_tlsf_block_size(void * ptr);
diff --git a/src/misc/lv_txt.c b/src/misc/lv_txt.c
index 3879b48d9..da7eca0bb 100644
--- a/src/misc/lv_txt.c
+++ b/src/misc/lv_txt.c
@@ -161,9 +161,10 @@ void lv_txt_get_size(lv_point_t * size_res, const char * text, const lv_font_t *
* @param txt a '\0' terminated string
* @param font pointer to a font
* @param letter_space letter space
- * @param max_width max with of the text (break the lines to fit this size) Set CORD_MAX to avoid line breaks
+ * @param max_width max width of the text (break the lines to fit this size). Set COORD_MAX to avoid line breaks
* @param flags settings for the text from 'txt_flag_type' enum
* @param[out] word_w_ptr width (in pixels) of the parsed word. May be NULL.
+ * @param cmd_state pointer to a txt_cmd_state_t variable which stores the current state of command processing
* @param force Force return the fraction of the word that can fit in the provided space.
* @return the index of the first char of the next word (in byte index not letter index. With UTF-8 they are different)
*/
@@ -519,8 +520,8 @@ static uint8_t lv_txt_utf8_size(const char * str)
}
/**
- * Convert an Unicode letter to UTF-8.
- * @param letter_uni an Unicode letter
+ * Convert a Unicode letter to UTF-8.
+ * @param letter_uni a Unicode letter
* @return UTF-8 coded character in Little Endian to be compatible with C chars (e.g. 'Á', 'Ű')
*/
static uint32_t lv_txt_unicode_to_utf8(uint32_t letter_uni)
@@ -546,6 +547,9 @@ static uint32_t lv_txt_unicode_to_utf8(uint32_t letter_uni)
bytes[2] = ((letter_uni >> 6) & 0x3F) | 0x80;
bytes[3] = ((letter_uni >> 0) & 0x3F) | 0x80;
}
+ else {
+ return 0;
+ }
uint32_t * res_p = (uint32_t *)bytes;
return *res_p;
@@ -761,8 +765,8 @@ static uint8_t lv_txt_iso8859_1_size(const char * str)
}
/**
- * Convert an Unicode letter to ISO8859-1.
- * @param letter_uni an Unicode letter
+ * Convert a Unicode letter to ISO8859-1.
+ * @param letter_uni a Unicode letter
* @return ISO8859-1 coded character in Little Endian to be compatible with C chars (e.g. 'Á', 'Ű')
*/
static uint32_t lv_txt_unicode_to_iso8859_1(uint32_t letter_uni)
@@ -794,7 +798,7 @@ static uint32_t lv_txt_iso8859_1_conv_wc(uint32_t c)
*/
static uint32_t lv_txt_iso8859_1_next(const char * txt, uint32_t * i)
{
- if(i == NULL) return txt[1]; /*Get the next char*/
+ if(i == NULL) return txt[0]; /*Get the next char*/
uint8_t letter = txt[*i];
(*i)++;
diff --git a/src/misc/lv_txt.h b/src/misc/lv_txt.h
index 4f134ab6d..46050dc3c 100644
--- a/src/misc/lv_txt.h
+++ b/src/misc/lv_txt.h
@@ -77,7 +77,7 @@ typedef uint8_t lv_text_align_t;
* @param letter_space letter space of the text
* @param line_space line space of the text
* @param flags settings for the text from ::lv_text_flag_t
- * @param max_width max with of the text (break the lines to fit this size) Set CORD_MAX to avoid
+ * @param max_width max width of the text (break the lines to fit this size). Set COORD_MAX to avoid
* line breaks
*/
void lv_txt_get_size(lv_point_t * size_res, const char * text, const lv_font_t * font, lv_coord_t letter_space,
@@ -88,7 +88,7 @@ void lv_txt_get_size(lv_point_t * size_res, const char * text, const lv_font_t *
* @param txt a '\0' terminated string
* @param font pointer to a font
* @param letter_space letter space
- * @param max_width max with of the text (break the lines to fit this size) Set CORD_MAX to avoid
+ * @param max_width max width of the text (break the lines to fit this size). Set COORD_MAX to avoid
* line breaks
* @param used_width When used_width != NULL, save the width of this line if
* flag == LV_TEXT_FLAG_NONE, otherwise save -1.
@@ -195,8 +195,8 @@ static inline bool _lv_txt_is_break_char(uint32_t letter)
extern uint8_t (*_lv_txt_encoded_size)(const char *);
/**
- * Convert an Unicode letter to encoded
- * @param letter_uni an Unicode letter
+ * Convert a Unicode letter to encoded
+ * @param letter_uni a Unicode letter
* @return Encoded character in Little Endian to be compatible with C chars (e.g. 'Á', 'Ü')
*/
extern uint32_t (*_lv_txt_unicode_to_encoded)(uint32_t);
diff --git a/src/misc/lv_types.h b/src/misc/lv_types.h
index 9f8ef4ca6..84aee1030 100644
--- a/src/misc/lv_types.h
+++ b/src/misc/lv_types.h
@@ -77,7 +77,7 @@ typedef uint32_t lv_uintptr_t;
#define _LV_CONCAT3(x, y, z) x ## y ## z
#define LV_CONCAT3(x, y, z) _LV_CONCAT3(x, y, z)
-#if defined(PYCPARSER)
+#if defined(PYCPARSER) || defined(__CC_ARM)
#define LV_FORMAT_ATTRIBUTE(fmtstr, vararg)
#elif defined(__GNUC__) && ((__GNUC__ == 4 && __GNUC_MINOR__ >= 4) || __GNUC__ > 4)
#define LV_FORMAT_ATTRIBUTE(fmtstr, vararg) __attribute__((format(gnu_printf, fmtstr, vararg)))
diff --git a/src/widgets/lv_arc.c b/src/widgets/lv_arc.c
index 99ffb1f15..6cab5f339 100644
--- a/src/widgets/lv_arc.c
+++ b/src/widgets/lv_arc.c
@@ -35,7 +35,8 @@ static void lv_arc_draw(lv_event_t * e);
static void lv_arc_event(const lv_obj_class_t * class_p, lv_event_t * e);
static void inv_arc_area(lv_obj_t * arc, uint16_t start_angle, uint16_t end_angle, lv_part_t part);
static void inv_knob_area(lv_obj_t * obj);
-static void get_center(lv_obj_t * obj, lv_point_t * center, lv_coord_t * arc_r);
+static void get_center(const lv_obj_t * obj, lv_point_t * center, lv_coord_t * arc_r);
+static lv_coord_t get_angle(const lv_obj_t * obj);
static void get_knob_area(lv_obj_t * arc, const lv_point_t * center, lv_coord_t r, lv_area_t * knob_area);
static void value_update(lv_obj_t * arc);
@@ -317,6 +318,60 @@ lv_arc_mode_t lv_arc_get_mode(const lv_obj_t * obj)
return ((lv_arc_t *) obj)->type;
}
+/*=====================
+ * Other functions
+ *====================*/
+
+
+void lv_arc_align_obj_to_angle(const lv_obj_t * obj, lv_obj_t * obj_to_align, lv_coord_t r_offset)
+{
+ LV_ASSERT_OBJ(obj, MY_CLASS);
+ LV_ASSERT_NULL(obj_to_align);
+
+ lv_obj_update_layout(obj);
+
+ lv_point_t center;
+ lv_coord_t arc_r;
+ get_center(obj, ¢er, &arc_r);
+ lv_coord_t indic_width = lv_obj_get_style_arc_width(obj, LV_PART_INDICATOR);
+ lv_coord_t indic_width_half = indic_width / 2;
+ arc_r -= indic_width_half;
+ arc_r += r_offset;
+
+ uint16_t angle = get_angle(obj);
+ lv_coord_t knob_x = (arc_r * lv_trigo_sin(angle + 90)) >> LV_TRIGO_SHIFT;
+ lv_coord_t knob_y = (arc_r * lv_trigo_sin(angle)) >> LV_TRIGO_SHIFT;
+ lv_obj_align_to(obj_to_align, obj, LV_ALIGN_CENTER, knob_x, knob_y);
+}
+
+void lv_arc_rotate_obj_to_angle(const lv_obj_t * obj, lv_obj_t * obj_to_rotate, lv_coord_t r_offset)
+{
+ LV_ASSERT_OBJ(obj, MY_CLASS);
+ LV_ASSERT_NULL(obj_to_rotate);
+
+ lv_obj_update_layout(obj);
+
+ lv_point_t center;
+ lv_coord_t arc_r;
+ get_center(obj, ¢er, &arc_r);
+ lv_coord_t indic_width = lv_obj_get_style_arc_width(obj, LV_PART_INDICATOR);
+ lv_coord_t indic_width_half = indic_width / 2;
+ arc_r -= indic_width_half;
+
+ arc_r += r_offset;
+ lv_obj_align_to(obj_to_rotate, obj, LV_ALIGN_CENTER, 0, -arc_r);
+
+ lv_obj_update_layout(obj);
+
+ uint16_t angle = get_angle(obj);
+ lv_coord_t pivot_x = obj_to_rotate->coords.x1 - center.x;
+ lv_coord_t pivot_y = obj_to_rotate->coords.y1 - center.y;
+ lv_obj_set_style_transform_pivot_x(obj_to_rotate, -pivot_x, 0);
+ lv_obj_set_style_transform_pivot_y(obj_to_rotate, -pivot_y, 0);
+ lv_obj_set_style_transform_angle(obj_to_rotate, angle * 10 + 900, 0);
+}
+
+
/**********************
* STATIC FUNCTIONS
**********************/
@@ -345,7 +400,7 @@ static void lv_arc_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj)
arc->last_angle = arc->indic_angle_end;
lv_obj_add_flag(obj, LV_OBJ_FLAG_CLICKABLE);
- lv_obj_clear_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN);
+ lv_obj_clear_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN | LV_OBJ_FLAG_SCROLLABLE);
lv_obj_set_ext_click_area(obj, LV_DPI_DEF / 10);
@@ -675,7 +730,7 @@ static void inv_knob_area(lv_obj_t * obj)
lv_obj_invalidate_area(obj, &a);
}
-static void get_center(lv_obj_t * obj, lv_point_t * center, lv_coord_t * arc_r)
+static void get_center(const lv_obj_t * obj, lv_point_t * center, lv_coord_t * arc_r)
{
lv_coord_t left_bg = lv_obj_get_style_pad_left(obj, LV_PART_MAIN);
lv_coord_t right_bg = lv_obj_get_style_pad_right(obj, LV_PART_MAIN);
@@ -691,15 +746,9 @@ static void get_center(lv_obj_t * obj, lv_point_t * center, lv_coord_t * arc_r)
if(arc_r) *arc_r = r;
}
-static void get_knob_area(lv_obj_t * obj, const lv_point_t * center, lv_coord_t r, lv_area_t * knob_area)
+static lv_coord_t get_angle(const lv_obj_t * obj)
{
- LV_ASSERT_OBJ(obj, MY_CLASS);
lv_arc_t * arc = (lv_arc_t *)obj;
-
- lv_coord_t indic_width = lv_obj_get_style_arc_width(obj, LV_PART_INDICATOR);
- lv_coord_t indic_width_half = indic_width / 2;
- r -= indic_width_half;
-
uint16_t angle = arc->rotation;
if(arc->type == LV_ARC_MODE_NORMAL) {
angle += arc->indic_angle_end;
@@ -708,10 +757,28 @@ static void get_knob_area(lv_obj_t * obj, const lv_point_t * center, lv_coord_t
angle += arc->indic_angle_start;
}
else if(arc->type == LV_ARC_MODE_SYMMETRICAL) {
- int32_t range_midpoint = (int32_t)(arc->min_value + arc->max_value) / 2;
- if(arc->value < range_midpoint) angle += arc->indic_angle_start;
- else angle += arc->indic_angle_end;
+ int16_t bg_end = arc->bg_angle_end;
+ if(arc->bg_angle_end < arc->bg_angle_start) bg_end = arc->bg_angle_end + 360;
+ int16_t indic_end = arc->indic_angle_end;
+ if(arc->indic_angle_end < arc->indic_angle_start) indic_end = arc->indic_angle_end + 360;
+
+ int32_t angle_midpoint = (int32_t)(arc->bg_angle_start + bg_end) / 2;
+ if(arc->indic_angle_start < angle_midpoint) angle += arc->indic_angle_start;
+ else if(indic_end > angle_midpoint) angle += arc->indic_angle_end;
+ else angle += angle_midpoint;
}
+
+ return angle;
+}
+
+
+static void get_knob_area(lv_obj_t * obj, const lv_point_t * center, lv_coord_t r, lv_area_t * knob_area)
+{
+ lv_coord_t indic_width = lv_obj_get_style_arc_width(obj, LV_PART_INDICATOR);
+ lv_coord_t indic_width_half = indic_width / 2;
+ r -= indic_width_half;
+
+ lv_coord_t angle = get_angle(obj);
lv_coord_t knob_x = (r * lv_trigo_sin(angle + 90)) >> LV_TRIGO_SHIFT;
lv_coord_t knob_y = (r * lv_trigo_sin(angle)) >> LV_TRIGO_SHIFT;
@@ -759,12 +826,13 @@ static void value_update(lv_obj_t * obj)
}
break;
case LV_ARC_MODE_REVERSE:
- angle = lv_map(arc->value, arc->min_value, arc->max_value, arc->bg_angle_start, bg_end);
+ angle = lv_map(arc->value, arc->min_value, arc->max_value, bg_end, arc->bg_angle_start);
lv_arc_set_angles(obj, angle, arc->bg_angle_end);
break;
case LV_ARC_MODE_NORMAL:
angle = lv_map(arc->value, arc->min_value, arc->max_value, arc->bg_angle_start, bg_end);
lv_arc_set_angles(obj, arc->bg_angle_start, angle);
+
break;
default:
LV_LOG_WARN("Invalid mode: %d", arc->type);
diff --git a/src/widgets/lv_arc.h b/src/widgets/lv_arc.h
index 8ec39a4aa..fd53fc15c 100644
--- a/src/widgets/lv_arc.h
+++ b/src/widgets/lv_arc.h
@@ -85,83 +85,83 @@ lv_obj_t * lv_arc_create(lv_obj_t * parent);
/**
* Set the start angle of an arc. 0 deg: right, 90 bottom, etc.
- * @param arc pointer to an arc object
+ * @param obj pointer to an arc object
* @param start the start angle
*/
-void lv_arc_set_start_angle(lv_obj_t * arc, uint16_t start);
+void lv_arc_set_start_angle(lv_obj_t * obj, uint16_t start);
/**
* Set the end angle of an arc. 0 deg: right, 90 bottom, etc.
- * @param arc pointer to an arc object
+ * @param obj pointer to an arc object
* @param end the end angle
*/
-void lv_arc_set_end_angle(lv_obj_t * arc, uint16_t end);
+void lv_arc_set_end_angle(lv_obj_t * obj, uint16_t end);
/**
* Set the start and end angles
- * @param arc pointer to an arc object
+ * @param obj pointer to an arc object
* @param start the start angle
* @param end the end angle
*/
-void lv_arc_set_angles(lv_obj_t * arc, uint16_t start, uint16_t end);
+void lv_arc_set_angles(lv_obj_t * obj, uint16_t start, uint16_t end);
/**
* Set the start angle of an arc background. 0 deg: right, 90 bottom, etc.
- * @param arc pointer to an arc object
+ * @param obj pointer to an arc object
* @param start the start angle
*/
-void lv_arc_set_bg_start_angle(lv_obj_t * arc, uint16_t start);
+void lv_arc_set_bg_start_angle(lv_obj_t * obj, uint16_t start);
/**
* Set the start angle of an arc background. 0 deg: right, 90 bottom etc.
- * @param arc pointer to an arc object
+ * @param obj pointer to an arc object
* @param end the end angle
*/
-void lv_arc_set_bg_end_angle(lv_obj_t * arc, uint16_t end);
+void lv_arc_set_bg_end_angle(lv_obj_t * obj, uint16_t end);
/**
* Set the start and end angles of the arc background
- * @param arc pointer to an arc object
+ * @param obj pointer to an arc object
* @param start the start angle
* @param end the end angle
*/
-void lv_arc_set_bg_angles(lv_obj_t * arc, uint16_t start, uint16_t end);
+void lv_arc_set_bg_angles(lv_obj_t * obj, uint16_t start, uint16_t end);
/**
* Set the rotation for the whole arc
- * @param arc pointer to an arc object
+ * @param obj pointer to an arc object
* @param rotation rotation angle
*/
-void lv_arc_set_rotation(lv_obj_t * arc, uint16_t rotation);
+void lv_arc_set_rotation(lv_obj_t * obj, uint16_t rotation);
/**
* Set the type of arc.
- * @param arc pointer to arc object
+ * @param obj pointer to arc object
* @param mode arc's mode
*/
-void lv_arc_set_mode(lv_obj_t * arc, lv_arc_mode_t type);
+void lv_arc_set_mode(lv_obj_t * obj, lv_arc_mode_t type);
/**
* Set a new value on the arc
- * @param arc pointer to an arc object
+ * @param obj pointer to an arc object
* @param value new value
*/
-void lv_arc_set_value(lv_obj_t * arc, int16_t value);
+void lv_arc_set_value(lv_obj_t * obj, int16_t value);
/**
* Set minimum and the maximum values of an arc
- * @param arc pointer to the arc object
+ * @param obj pointer to the arc object
* @param min minimum value
* @param max maximum value
*/
-void lv_arc_set_range(lv_obj_t * arc, int16_t min, int16_t max);
+void lv_arc_set_range(lv_obj_t * obj, int16_t min, int16_t max);
/**
* Set a change rate to limit the speed how fast the arc should reach the pressed point.
- * @param arc pointer to an arc object
+ * @param obj pointer to an arc object
* @param rate the change rate
*/
-void lv_arc_set_change_rate(lv_obj_t * arc, uint16_t rate);
+void lv_arc_set_change_rate(lv_obj_t * obj, uint16_t rate);
/*=====================
* Getter functions
@@ -169,56 +169,56 @@ void lv_arc_set_change_rate(lv_obj_t * arc, uint16_t rate);
/**
* Get the start angle of an arc.
- * @param arc pointer to an arc object
+ * @param obj pointer to an arc object
* @return the start angle [0..360]
*/
uint16_t lv_arc_get_angle_start(lv_obj_t * obj);
/**
* Get the end angle of an arc.
- * @param arc pointer to an arc object
+ * @param obj pointer to an arc object
* @return the end angle [0..360]
*/
uint16_t lv_arc_get_angle_end(lv_obj_t * obj);
/**
* Get the start angle of an arc background.
- * @param arc pointer to an arc object
- * @return the start angle [0..360]
+ * @param obj pointer to an arc object
+ * @return the start angle [0..360]
*/
uint16_t lv_arc_get_bg_angle_start(lv_obj_t * obj);
/**
* Get the end angle of an arc background.
- * @param arc pointer to an arc object
+ * @param obj pointer to an arc object
* @return the end angle [0..360]
*/
uint16_t lv_arc_get_bg_angle_end(lv_obj_t * obj);
/**
* Get the value of an arc
- * @param arc pointer to an arc object
- * @return the value of the arc
+ * @param obj pointer to an arc object
+ * @return the value of the arc
*/
int16_t lv_arc_get_value(const lv_obj_t * obj);
/**
* Get the minimum value of an arc
- * @param arc pointer to an arc object
+ * @param obj pointer to an arc object
* @return the minimum value of the arc
*/
int16_t lv_arc_get_min_value(const lv_obj_t * obj);
/**
* Get the maximum value of an arc
- * @param arc pointer to an arc object
+ * @param obj pointer to an arc object
* @return the maximum value of the arc
*/
int16_t lv_arc_get_max_value(const lv_obj_t * obj);
/**
* Get whether the arc is type or not.
- * @param arc pointer to an arc object
+ * @param obj pointer to an arc object
* @return arc's mode
*/
lv_arc_mode_t lv_arc_get_mode(const lv_obj_t * obj);
@@ -227,6 +227,22 @@ lv_arc_mode_t lv_arc_get_mode(const lv_obj_t * obj);
* Other functions
*====================*/
+/**
+ * Align an object to the current position of the arc (knob)
+ * @param obj pointer to an arc object
+ * @param obj_to_align pointer to an object to align
+ * @param r_offset consider the radius larger with this value (< 0: for smaller radius)
+ */
+void lv_arc_align_obj_to_angle(const lv_obj_t * obj, lv_obj_t * obj_to_align, lv_coord_t r_offset);
+
+/**
+ * Rotate an object to the current position of the arc (knob)
+ * @param obj pointer to an arc object
+ * @param obj_to_align pointer to an object to rotate
+ * @param r_offset consider the radius larger with this value (< 0: for smaller radius)
+ */
+void lv_arc_rotate_obj_to_angle(const lv_obj_t * obj, lv_obj_t * obj_to_rotate, lv_coord_t r_offset);
+
/**********************
* MACROS
**********************/
diff --git a/src/widgets/lv_btnmatrix.c b/src/widgets/lv_btnmatrix.c
index 62f86f794..92a4d2fe3 100644
--- a/src/widgets/lv_btnmatrix.c
+++ b/src/widgets/lv_btnmatrix.c
@@ -399,13 +399,10 @@ static void lv_btnmatrix_event(const lv_obj_class_t * class_p, lv_event_t * e)
lv_point_t p;
if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) {
- lv_coord_t * s = lv_event_get_param(e);
if(has_popovers_in_top_row(obj)) {
/*reserve one row worth of extra space to account for popovers in the top row*/
- *s = btnm->row_cnt > 0 ? lv_obj_get_content_height(obj) / btnm->row_cnt : 0;
- }
- else {
- *s = 0;
+ lv_coord_t s = btnm->row_cnt > 0 ? lv_obj_get_content_height(obj) / btnm->row_cnt : 0;
+ lv_event_set_ext_draw_size(e, s);
}
}
if(code == LV_EVENT_STYLE_CHANGED) {
diff --git a/src/widgets/lv_btnmatrix.h b/src/widgets/lv_btnmatrix.h
index cf586d723..780d57b68 100644
--- a/src/widgets/lv_btnmatrix.h
+++ b/src/widgets/lv_btnmatrix.h
@@ -163,7 +163,7 @@ void lv_btnmatrix_set_btn_width(lv_obj_t * obj, uint16_t btn_id, uint8_t width);
/**
* Make the button matrix like a selector widget (only one button may be checked at a time).
* `LV_BTNMATRIX_CTRL_CHECKABLE` must be enabled on the buttons to be selected using
- * `lv_btnmatrix_set_ctrl()` or `lv_btnmatrix_set_btn_ctrl_all()`.
+ * `lv_btnmatrix_set_ctrl()` or `lv_btnmatrix_set_btn_ctrl_all()`.
* @param obj pointer to a button matrix object
* @param en whether "one check" mode is enabled
*/
diff --git a/src/widgets/lv_canvas.c b/src/widgets/lv_canvas.c
index a55429bdf..1f949272e 100644
--- a/src/widgets/lv_canvas.c
+++ b/src/widgets/lv_canvas.c
@@ -76,6 +76,7 @@ void lv_canvas_set_buffer(lv_obj_t * obj, void * buf, lv_coord_t w, lv_coord_t h
canvas->dsc.data = buf;
lv_img_set_src(obj, &canvas->dsc);
+ lv_img_cache_invalidate_src(&canvas->dsc);
}
void lv_canvas_set_px_color(lv_obj_t * obj, lv_coord_t x, lv_coord_t y, lv_color_t c)
@@ -157,98 +158,60 @@ void lv_canvas_copy_buf(lv_obj_t * obj, const void * to_copy, lv_coord_t x, lv_c
}
}
-void lv_canvas_transform(lv_obj_t * obj, lv_img_dsc_t * img, int16_t angle, uint16_t zoom, lv_coord_t offset_x,
+void lv_canvas_transform(lv_obj_t * obj, lv_img_dsc_t * src_img, int16_t angle, uint16_t zoom, lv_coord_t offset_x,
lv_coord_t offset_y,
int32_t pivot_x, int32_t pivot_y, bool antialias)
{
#if LV_DRAW_COMPLEX
LV_ASSERT_OBJ(obj, MY_CLASS);
- LV_ASSERT_NULL(img);
+ LV_ASSERT_NULL(src_img);
lv_canvas_t * canvas = (lv_canvas_t *)obj;
- lv_color_t color = lv_obj_get_style_img_recolor(obj, LV_PART_MAIN);
-
- int32_t dest_width = canvas->dsc.header.w;
- int32_t dest_height = canvas->dsc.header.h;
+ lv_img_dsc_t * dest_img = &canvas->dsc;
int32_t x;
int32_t y;
- bool ret;
-
- lv_img_transform_dsc_t dsc;
- dsc.cfg.angle = angle;
- dsc.cfg.zoom = zoom;
- dsc.cfg.src = img->data;
- dsc.cfg.src_w = img->header.w;
- dsc.cfg.src_h = img->header.h;
- dsc.cfg.cf = img->header.cf;
- dsc.cfg.pivot_x = pivot_x;
- dsc.cfg.pivot_y = pivot_y;
- dsc.cfg.color = color;
- dsc.cfg.antialias = antialias;
- _lv_img_buf_transform_init(&dsc);
-
- for(y = -offset_y; y < dest_height - offset_y; y++) {
- for(x = -offset_x; x < dest_width - offset_x; x++) {
-
- ret = _lv_img_buf_transform(&dsc, x, y);
-
- if(ret == false) continue;
-
- if(x + offset_x >= 0 && x + offset_x < dest_width && y + offset_y >= 0 && y + offset_y < dest_height) {
- /*If the image has no alpha channel just simple set the result color on the canvas*/
- if(lv_img_cf_has_alpha(img->header.cf) == false) {
- lv_img_buf_set_px_color(&canvas->dsc, x + offset_x, y + offset_y, dsc.res.color);
- }
- else {
- lv_color_t bg_color = lv_img_buf_get_px_color(&canvas->dsc, x + offset_x, y + offset_y, dsc.cfg.color);
-
- /*If the canvas has no alpha but the image has mix the image's color with
- * canvas*/
- if(lv_img_cf_has_alpha(canvas->dsc.header.cf) == false) {
- if(dsc.res.opa < LV_OPA_MAX) dsc.res.color = lv_color_mix(dsc.res.color, bg_color, dsc.res.opa);
- lv_img_buf_set_px_color(&canvas->dsc, x + offset_x, y + offset_y, dsc.res.color);
- }
- /*Both the image and canvas has alpha channel. Some extra calculation is
- required*/
- else {
- lv_opa_t bg_opa = lv_img_buf_get_px_alpha(&canvas->dsc, x + offset_x, y + offset_y);
- /*Pick the foreground if it's fully opaque or the Background is fully
- *transparent*/
- if(dsc.res.opa >= LV_OPA_MAX || bg_opa <= LV_OPA_MIN) {
- lv_img_buf_set_px_color(&canvas->dsc, x + offset_x, y + offset_y, dsc.res.color);
- lv_img_buf_set_px_alpha(&canvas->dsc, x + offset_x, y + offset_y, dsc.res.opa);
- }
- /*Opaque background: use simple mix*/
- else if(bg_opa >= LV_OPA_MAX) {
- lv_img_buf_set_px_color(&canvas->dsc, x + offset_x, y + offset_y,
- lv_color_mix(dsc.res.color, bg_color, dsc.res.opa));
- }
- /*Both colors have alpha. Expensive calculation need to be applied*/
- else {
-
- /*Info:
- * https://en.wikipedia.org/wiki/Alpha_compositing#Analytical_derivation_of_the_over_operator*/
- lv_opa_t opa_res_2 = 255 - ((uint16_t)((uint16_t)(255 - dsc.res.opa) * (255 - bg_opa)) >> 8);
- if(opa_res_2 == 0) {
- opa_res_2 = 1; /*never happens, just to be sure*/
- }
- lv_opa_t ratio = (uint16_t)((uint16_t)dsc.res.opa * 255) / opa_res_2;
-
- lv_img_buf_set_px_color(&canvas->dsc, x + offset_x, y + offset_y,
- lv_color_mix(dsc.res.color, bg_color, ratio));
- lv_img_buf_set_px_alpha(&canvas->dsc, x + offset_x, y + offset_y, opa_res_2);
- }
- }
+
+ lv_draw_img_dsc_t draw_dsc;
+ lv_draw_img_dsc_init(&draw_dsc);
+ draw_dsc.angle = angle;
+ draw_dsc.zoom = zoom;
+ draw_dsc.pivot.x = pivot_x;
+ draw_dsc.pivot.y = pivot_y;
+ draw_dsc.antialias = antialias;
+
+ lv_area_t dest_area;
+ dest_area.x1 = -offset_x;
+ dest_area.x2 = dest_area.x1 + dest_img->header.w - 1;
+ dest_area.y1 = -offset_y;
+ dest_area.y2 = -offset_y;
+
+ lv_color_t * cbuf = lv_mem_alloc(dest_img->header.w * sizeof(lv_color_t));
+ lv_opa_t * abuf = lv_mem_alloc(dest_img->header.w * sizeof(lv_opa_t));
+ for(y = 0; y < dest_img->header.h; y++) {
+ if(y + offset_y >= 0) {
+ lv_draw_sw_transform(NULL, &dest_area, src_img->data, src_img->header.w, src_img->header.h, src_img->header.w,
+ &draw_dsc, canvas->dsc.header.cf, cbuf, abuf);
+
+ for(x = 0; x < dest_img->header.w; x++) {
+ if(abuf[x]) {
+ lv_img_buf_set_px_color(dest_img, x, y, cbuf[x]);
+ lv_img_buf_set_px_alpha(dest_img, x, y, abuf[x]);
}
}
+
+ dest_area.y1++;
+ dest_area.y2++;
}
}
+ lv_mem_free(cbuf);
+ lv_mem_free(abuf);
lv_obj_invalidate(obj);
+
#else
LV_UNUSED(obj);
- LV_UNUSED(img);
+ LV_UNUSED(src_img);
LV_UNUSED(angle);
LV_UNUSED(zoom);
LV_UNUSED(offset_x);
@@ -856,6 +819,9 @@ static void init_fake_disp(lv_obj_t * canvas, lv_disp_t * disp, lv_disp_drv_t *
draw_ctx->buf = (void *)dsc->data;
lv_disp_drv_use_generic_set_px_cb(disp->driver, dsc->header.cf);
+ if(LV_COLOR_SCREEN_TRANSP && dsc->header.cf != LV_IMG_CF_TRUE_COLOR_ALPHA) {
+ drv->screen_transp = 0;
+ }
}
static void deinit_fake_disp(lv_obj_t * canvas, lv_disp_t * disp)
diff --git a/src/widgets/lv_dropdown.c b/src/widgets/lv_dropdown.c
index e7e650388..241d17776 100644
--- a/src/widgets/lv_dropdown.c
+++ b/src/widgets/lv_dropdown.c
@@ -398,6 +398,26 @@ void lv_dropdown_get_selected_str(const lv_obj_t * obj, char * buf, uint32_t buf
buf[c] = '\0';
}
+int32_t lv_dropdown_get_option_index(lv_obj_t * obj, const char * option)
+{
+ const char * opts = lv_dropdown_get_options(obj);
+ uint32_t char_i = 0;
+ uint32_t opt_i = 0;
+ const char * start = opts;
+
+ while(start[char_i] != '\0') {
+ for(char_i = 0; (start[char_i] != '\n') && (start[char_i] != '\0'); char_i++);
+
+ if(memcmp(start, option, LV_MIN(strlen(option), char_i)) == 0) return opt_i;
+ start = &start[char_i];
+ if(start[0] == '\n') start++;
+ opt_i++;
+ }
+
+ return -1;
+}
+
+
const char * lv_dropdown_get_symbol(lv_obj_t * obj)
{
LV_ASSERT_OBJ(obj, MY_CLASS);
@@ -515,7 +535,7 @@ void lv_dropdown_open(lv_obj_t * dropdown_obj)
lv_obj_align(label, LV_ALIGN_TOP_RIGHT, 0, 0);
break;
case LV_TEXT_ALIGN_CENTER:
- lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);
+ lv_obj_align(label, LV_ALIGN_TOP_MID, 0, 0);
break;
}
diff --git a/src/widgets/lv_dropdown.h b/src/widgets/lv_dropdown.h
index 63412f73e..0c55e862c 100644
--- a/src/widgets/lv_dropdown.h
+++ b/src/widgets/lv_dropdown.h
@@ -189,6 +189,14 @@ uint16_t lv_dropdown_get_option_cnt(const lv_obj_t * obj);
*/
void lv_dropdown_get_selected_str(const lv_obj_t * obj, char * buf, uint32_t buf_size);
+/**
+ * Get the index of an option.
+ * @param obj pointer to drop-down object
+ * @param option an option as string
+ * @return index of `option` in the list of all options. -1 if not found.
+ */
+int32_t lv_dropdown_get_option_index(lv_obj_t * obj, const char * option);
+
/**
* Get the symbol on the drop-down list. Typically a down caret or arrow.
* @param obj pointer to drop-down list object
diff --git a/src/widgets/lv_img.c b/src/widgets/lv_img.c
index 7a1f255e9..f47a789e7 100644
--- a/src/widgets/lv_img.c
+++ b/src/widgets/lv_img.c
@@ -9,6 +9,7 @@
#include "lv_img.h"
#if LV_USE_IMG != 0
+#include "../core/lv_disp.h"
#include "../misc/lv_assert.h"
#include "../draw/lv_img_decoder.h"
#include "../misc/lv_fs.h"
@@ -134,7 +135,7 @@ void lv_img_set_src(lv_obj_t * obj, const void * src)
}
if(src_type == LV_IMG_SRC_SYMBOL) {
- /*`lv_img_dsc_get_info` couldn't set the with and height of a font so set it here*/
+ /*`lv_img_dsc_get_info` couldn't set the width and height of a font so set it here*/
const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN);
lv_coord_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_MAIN);
lv_coord_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN);
@@ -190,16 +191,11 @@ void lv_img_set_angle(lv_obj_t * obj, int16_t angle)
lv_img_t * img = (lv_img_t *)obj;
if(angle == img->angle) return;
- lv_coord_t transf_zoom = lv_obj_get_style_transform_zoom(obj, LV_PART_MAIN);
- transf_zoom = ((int32_t)transf_zoom * img->zoom) >> 8;
-
- lv_coord_t transf_angle = lv_obj_get_style_transform_angle(obj, LV_PART_MAIN);
-
lv_obj_update_layout(obj); /*Be sure the object's size is calculated*/
lv_coord_t w = lv_obj_get_width(obj);
lv_coord_t h = lv_obj_get_height(obj);
lv_area_t a;
- _lv_img_buf_get_transformed_area(&a, w, h, transf_angle + img->angle, transf_zoom, &img->pivot);
+ _lv_img_buf_get_transformed_area(&a, w, h, img->angle, img->zoom, &img->pivot);
a.x1 += obj->coords.x1;
a.y1 += obj->coords.y1;
a.x2 += obj->coords.x1;
@@ -207,9 +203,15 @@ void lv_img_set_angle(lv_obj_t * obj, int16_t angle)
lv_obj_invalidate_area(obj, &a);
img->angle = angle;
+
+ /* Disable invalidations because lv_obj_refresh_ext_draw_size would invalidate
+ * the whole ext draw area */
+ lv_disp_t * disp = lv_obj_get_disp(obj);
+ lv_disp_enable_invalidation(disp, false);
lv_obj_refresh_ext_draw_size(obj);
+ lv_disp_enable_invalidation(disp, true);
- _lv_img_buf_get_transformed_area(&a, w, h, transf_angle + img->angle, transf_zoom, &img->pivot);
+ _lv_img_buf_get_transformed_area(&a, w, h, img->angle, img->zoom, &img->pivot);
a.x1 += obj->coords.x1;
a.y1 += obj->coords.y1;
a.x2 += obj->coords.x1;
@@ -222,17 +224,11 @@ void lv_img_set_pivot(lv_obj_t * obj, lv_coord_t x, lv_coord_t y)
lv_img_t * img = (lv_img_t *)obj;
if(img->pivot.x == x && img->pivot.y == y) return;
- lv_coord_t transf_zoom = lv_obj_get_style_transform_zoom(obj, LV_PART_MAIN);
- transf_zoom = ((int32_t)transf_zoom * img->zoom) >> 8;
-
- lv_coord_t transf_angle = lv_obj_get_style_transform_angle(obj, LV_PART_MAIN);
- transf_angle += img->angle;
-
lv_obj_update_layout(obj); /*Be sure the object's size is calculated*/
lv_coord_t w = lv_obj_get_width(obj);
lv_coord_t h = lv_obj_get_height(obj);
lv_area_t a;
- _lv_img_buf_get_transformed_area(&a, w, h, transf_angle, transf_zoom, &img->pivot);
+ _lv_img_buf_get_transformed_area(&a, w, h, img->angle, img->zoom, &img->pivot);
a.x1 += obj->coords.x1;
a.y1 += obj->coords.y1;
a.x2 += obj->coords.x1;
@@ -241,9 +237,15 @@ void lv_img_set_pivot(lv_obj_t * obj, lv_coord_t x, lv_coord_t y)
img->pivot.x = x;
img->pivot.y = y;
+
+ /* Disable invalidations because lv_obj_refresh_ext_draw_size would invalidate
+ * the whole ext draw area */
+ lv_disp_t * disp = lv_obj_get_disp(obj);
+ lv_disp_enable_invalidation(disp, false);
lv_obj_refresh_ext_draw_size(obj);
+ lv_disp_enable_invalidation(disp, true);
- _lv_img_buf_get_transformed_area(&a, w, h, transf_angle, transf_zoom, &img->pivot);
+ _lv_img_buf_get_transformed_area(&a, w, h, img->angle, img->zoom, &img->pivot);
a.x1 += obj->coords.x1;
a.y1 += obj->coords.y1;
a.x2 += obj->coords.x1;
@@ -258,16 +260,11 @@ void lv_img_set_zoom(lv_obj_t * obj, uint16_t zoom)
if(zoom == 0) zoom = 1;
- lv_coord_t transf_zoom = lv_obj_get_style_transform_zoom(obj, LV_PART_MAIN);
-
- lv_coord_t transf_angle = lv_obj_get_style_transform_angle(obj, LV_PART_MAIN);
- transf_angle += img->angle;
-
lv_obj_update_layout(obj); /*Be sure the object's size is calculated*/
lv_coord_t w = lv_obj_get_width(obj);
lv_coord_t h = lv_obj_get_height(obj);
lv_area_t a;
- _lv_img_buf_get_transformed_area(&a, w, h, transf_angle, ((int32_t)transf_zoom * img->zoom) >> 8, &img->pivot);
+ _lv_img_buf_get_transformed_area(&a, w, h, img->angle, img->zoom >> 8, &img->pivot);
a.x1 += obj->coords.x1 - 1;
a.y1 += obj->coords.y1 - 1;
a.x2 += obj->coords.x1 + 1;
@@ -275,9 +272,15 @@ void lv_img_set_zoom(lv_obj_t * obj, uint16_t zoom)
lv_obj_invalidate_area(obj, &a);
img->zoom = zoom;
+
+ /* Disable invalidations because lv_obj_refresh_ext_draw_size would invalidate
+ * the whole ext draw area */
+ lv_disp_t * disp = lv_obj_get_disp(obj);
+ lv_disp_enable_invalidation(disp, false);
lv_obj_refresh_ext_draw_size(obj);
+ lv_disp_enable_invalidation(disp, true);
- _lv_img_buf_get_transformed_area(&a, w, h, transf_angle, ((int32_t)transf_zoom * img->zoom) >> 8, &img->pivot);
+ _lv_img_buf_get_transformed_area(&a, w, h, img->angle, img->zoom, &img->pivot);
a.x1 += obj->coords.x1 - 1;
a.y1 += obj->coords.y1 - 1;
a.x2 += obj->coords.x1 + 1;
@@ -424,14 +427,10 @@ static lv_point_t lv_img_get_transformed_size(lv_obj_t * obj)
{
lv_img_t * img = (lv_img_t *)obj;
- int32_t zoom_final = lv_obj_get_style_transform_zoom(obj, LV_PART_MAIN);
- zoom_final = (zoom_final * img->zoom) >> 8;
- int32_t angle_final = lv_obj_get_style_transform_angle(obj, LV_PART_MAIN);
- angle_final += img->angle;
lv_area_t area_transform;
_lv_img_buf_get_transformed_area(&area_transform, img->w, img->h,
- angle_final, zoom_final, &img->pivot);
+ img->angle, img->zoom, &img->pivot);
return (lv_point_t) {
lv_area_get_width(&area_transform), lv_area_get_height(&area_transform)
@@ -467,42 +466,31 @@ static void lv_img_event(const lv_obj_class_t * class_p, lv_event_t * e)
else if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) {
lv_coord_t * s = lv_event_get_param(e);
- lv_coord_t transf_zoom = lv_obj_get_style_transform_zoom(obj, LV_PART_MAIN);
- transf_zoom = ((int32_t)transf_zoom * img->zoom) >> 8;
-
- lv_coord_t transf_angle = lv_obj_get_style_transform_angle(obj, LV_PART_MAIN);
- transf_angle += img->angle;
/*If the image has angle provide enough room for the rotated corners*/
- if(transf_angle || transf_zoom != LV_IMG_ZOOM_NONE) {
+ if(img->angle || img->zoom != LV_IMG_ZOOM_NONE) {
lv_area_t a;
lv_coord_t w = lv_obj_get_width(obj);
lv_coord_t h = lv_obj_get_height(obj);
- _lv_img_buf_get_transformed_area(&a, w, h, transf_angle, transf_zoom, &img->pivot);
- lv_coord_t pad_ori = *s;
- *s = LV_MAX(*s, pad_ori - a.x1);
- *s = LV_MAX(*s, pad_ori - a.y1);
- *s = LV_MAX(*s, pad_ori + a.x2 - w);
- *s = LV_MAX(*s, pad_ori + a.y2 - h);
+ _lv_img_buf_get_transformed_area(&a, w, h, img->angle, img->zoom, &img->pivot);
+ *s = LV_MAX(*s, -a.x1);
+ *s = LV_MAX(*s, -a.y1);
+ *s = LV_MAX(*s, a.x2 - w);
+ *s = LV_MAX(*s, a.y2 - h);
}
}
else if(code == LV_EVENT_HIT_TEST) {
lv_hit_test_info_t * info = lv_event_get_param(e);
- lv_coord_t zoom = lv_obj_get_style_transform_zoom(obj, LV_PART_MAIN);
- zoom = (zoom * img->zoom) >> 8;
-
- lv_coord_t angle = lv_obj_get_style_transform_angle(obj, LV_PART_MAIN);
- angle += img->angle;
/*If the object is exactly image sized (not cropped, not mosaic) and transformed
*perform hit test on its transformed area*/
if(img->w == lv_obj_get_width(obj) && img->h == lv_obj_get_height(obj) &&
- (zoom != LV_IMG_ZOOM_NONE || angle != 0 || img->pivot.x != img->w / 2 || img->pivot.y != img->h / 2)) {
+ (img->zoom != LV_IMG_ZOOM_NONE || img->angle != 0 || img->pivot.x != img->w / 2 || img->pivot.y != img->h / 2)) {
lv_coord_t w = lv_obj_get_width(obj);
lv_coord_t h = lv_obj_get_height(obj);
lv_area_t coords;
- _lv_img_buf_get_transformed_area(&coords, w, h, angle, zoom, &img->pivot);
+ _lv_img_buf_get_transformed_area(&coords, w, h, img->angle, img->zoom, &img->pivot);
coords.x1 += obj->coords.x1;
coords.y1 += obj->coords.y1;
coords.x2 += obj->coords.x1;
@@ -556,19 +544,13 @@ static void draw_img(lv_event_t * e)
return;
}
- int32_t angle_final = lv_obj_get_style_transform_angle(obj, LV_PART_MAIN);
- angle_final += img->angle;
-
- if(angle_final != 0) {
+ if(img->angle != 0) {
info->res = LV_COVER_RES_NOT_COVER;
return;
}
- int32_t zoom_final = lv_obj_get_style_transform_zoom(obj, LV_PART_MAIN);
- zoom_final = (zoom_final * img->zoom) >> 8;
-
const lv_area_t * clip_area = lv_event_get_param(e);
- if(zoom_final == LV_IMG_ZOOM_NONE) {
+ if(img->zoom == LV_IMG_ZOOM_NONE) {
if(_lv_area_is_in(clip_area, &obj->coords, 0) == false) {
info->res = LV_COVER_RES_NOT_COVER;
return;
@@ -576,7 +558,7 @@ static void draw_img(lv_event_t * e)
}
else {
lv_area_t a;
- _lv_img_buf_get_transformed_area(&a, lv_obj_get_width(obj), lv_obj_get_height(obj), 0, zoom_final, &img->pivot);
+ _lv_img_buf_get_transformed_area(&a, lv_obj_get_width(obj), lv_obj_get_height(obj), 0, img->zoom, &img->pivot);
a.x1 += obj->coords.x1;
a.y1 += obj->coords.y1;
a.x2 += obj->coords.x1;
@@ -590,12 +572,6 @@ static void draw_img(lv_event_t * e)
}
else if(code == LV_EVENT_DRAW_MAIN || code == LV_EVENT_DRAW_POST) {
- int32_t zoom_final = lv_obj_get_style_transform_zoom(obj, LV_PART_MAIN);
- zoom_final = (zoom_final * img->zoom) >> 8;
-
- int32_t angle_final = lv_obj_get_style_transform_angle(obj, LV_PART_MAIN);
- angle_final += img->angle;
-
lv_coord_t obj_w = lv_obj_get_width(obj);
lv_coord_t obj_h = lv_obj_get_height(obj);
@@ -616,7 +592,7 @@ static void draw_img(lv_event_t * e)
}
else {
_lv_img_buf_get_transformed_area(&bg_coords, obj_w, obj_h,
- angle_final, zoom_final, &bg_pivot);
+ img->angle, img->zoom, &bg_pivot);
/*Modify the coordinates to draw the background for the rotated and scaled coordinates*/
bg_coords.x1 += obj->coords.x1;
@@ -636,7 +612,7 @@ static void draw_img(lv_event_t * e)
if(code == LV_EVENT_DRAW_MAIN) {
if(img->h == 0 || img->w == 0) return;
- if(zoom_final == 0) return;
+ if(img->zoom == 0) return;
lv_draw_ctx_t * draw_ctx = lv_event_get_draw_ctx(e);
@@ -666,8 +642,8 @@ static void draw_img(lv_event_t * e)
lv_draw_img_dsc_init(&img_dsc);
lv_obj_init_draw_img_dsc(obj, LV_PART_MAIN, &img_dsc);
- img_dsc.zoom = zoom_final;
- img_dsc.angle = angle_final;
+ img_dsc.zoom = img->zoom;
+ img_dsc.angle = img->angle;
img_dsc.pivot.x = img->pivot.x;
img_dsc.pivot.y = img->pivot.y;
img_dsc.antialias = img->antialias;
diff --git a/src/widgets/lv_img.h b/src/widgets/lv_img.h
index 9068c50eb..eb76c8d98 100644
--- a/src/widgets/lv_img.h
+++ b/src/widgets/lv_img.h
@@ -114,6 +114,7 @@ void lv_img_set_offset_y(lv_obj_t * obj, lv_coord_t y);
/**
* Set the rotation angle of the image.
* The image will be rotated around the set pivot set by `lv_img_set_pivot()`
+ * Note that indexed and alpha only images can't be transformed.
* @param obj pointer to an image object
* @param angle rotation angle in degree with 0.1 degree resolution (0..3600: clock wise)
*/
@@ -121,7 +122,7 @@ void lv_img_set_angle(lv_obj_t * obj, int16_t angle);
/**
* Set the rotation center of the image.
- * The image will be rotated around this point
+ * The image will be rotated around this point.
* @param obj pointer to an image object
* @param x rotation center x of the image
* @param y rotation center y of the image
@@ -131,6 +132,7 @@ void lv_img_set_pivot(lv_obj_t * obj, lv_coord_t x, lv_coord_t y);
/**
* Set the zoom factor of the image.
+ * Note that indexed and alpha only images can't be transformed.
* @param img pointer to an image object
* @param zoom the zoom factor.
* @example 256 or LV_ZOOM_IMG_NONE for no zoom
diff --git a/src/widgets/lv_label.c b/src/widgets/lv_label.c
index 0b8a1657a..f4fbe01a5 100644
--- a/src/widgets/lv_label.c
+++ b/src/widgets/lv_label.c
@@ -1,4 +1,4 @@
-/**
+/**
* @file lv_label.c
*
*/
@@ -1021,6 +1021,7 @@ static void lv_label_refr_text(lv_obj_t * obj)
}
/*In roll inf. mode keep the size but start offset animations*/
else if(label->long_mode == LV_LABEL_LONG_SCROLL_CIRCULAR) {
+ const lv_anim_t * anim_template = lv_obj_get_style_anim(obj, LV_PART_MAIN);
uint16_t anim_speed = lv_obj_get_style_anim_speed(obj, LV_PART_MAIN);
if(anim_speed == 0) anim_speed = LV_LABEL_DEF_SCROLL_SPEED;
lv_anim_t a;
@@ -1055,8 +1056,14 @@ static void lv_label_refr_text(lv_obj_t * obj)
lv_anim_t * anim_cur = lv_anim_get(obj, set_ofs_x_anim);
int32_t act_time = anim_cur ? anim_cur->act_time : 0;
- if(act_time < a.time) {
- a.act_time = act_time; /*To keep the old position*/
+
+ /*If a template animation exists, consider it's start delay and repeat delay*/
+ if(anim_template) {
+ a.act_time = anim_template->act_time;
+ a.repeat_delay = anim_template->repeat_delay;
+ }
+ else if(act_time < a.time) {
+ a.act_time = act_time; /*To keep the old position when the label text is updated mid-scrolling*/
a.early_apply = 0;
}
@@ -1076,8 +1083,14 @@ static void lv_label_refr_text(lv_obj_t * obj)
lv_anim_t * anim_cur = lv_anim_get(obj, set_ofs_y_anim);
int32_t act_time = anim_cur ? anim_cur->act_time : 0;
- if(act_time < a.time) {
- a.act_time = act_time; /*To keep the old position*/
+
+ /*If a template animation exists, consider it's start delay and repeat delay*/
+ if(anim_template) {
+ a.act_time = anim_template->act_time;
+ a.repeat_delay = anim_template->repeat_delay;
+ }
+ else if(act_time < a.time) {
+ a.act_time = act_time; /*To keep the old position when the label text is updated mid-scrolling*/
a.early_apply = 0;
}
diff --git a/src/widgets/lv_label.h b/src/widgets/lv_label.h
index 342e00417..b31a63e59 100644
--- a/src/widgets/lv_label.h
+++ b/src/widgets/lv_label.h
@@ -142,7 +142,7 @@ void lv_label_set_text_sel_start(lv_obj_t * obj, uint32_t index);
/**
* Set where text selection should end
* @param obj pointer to a label object
- * @param index character index where selection should end. `LV_LABEL_TEXT_SELECTION_OFF` for no selection
+ * @param index character index where selection should end. `LV_LABEL_TEXT_SELECTION_OFF` for no selection
*/
void lv_label_set_text_sel_end(lv_obj_t * obj, uint32_t index);
diff --git a/src/widgets/lv_line.c b/src/widgets/lv_line.c
index 6bb6cd975..df32bd051 100644
--- a/src/widgets/lv_line.c
+++ b/src/widgets/lv_line.c
@@ -83,7 +83,7 @@ void lv_line_set_y_invert(lv_obj_t * obj, bool en)
lv_line_t * line = (lv_line_t *)obj;
if(line->y_inv == en) return;
- line->y_inv = en == false ? 0 : 1;
+ line->y_inv = en ? 1U : 0U;
lv_obj_invalidate(obj);
}
@@ -98,7 +98,7 @@ bool lv_line_get_y_invert(const lv_obj_t * obj)
lv_line_t * line = (lv_line_t *)obj;
- return line->y_inv == 0 ? false : true;
+ return line->y_inv == 1U;
}
/**********************
@@ -143,22 +143,23 @@ static void lv_line_event(const lv_obj_class_t * class_p, lv_event_t * e)
else if(code == LV_EVENT_GET_SELF_SIZE) {
lv_line_t * line = (lv_line_t *)obj;
+ if(line->point_num == 0 || line->point_array == NULL) return;
+
lv_point_t * p = lv_event_get_param(e);
lv_coord_t w = 0;
lv_coord_t h = 0;
- if(line->point_num > 0) {
- uint16_t i;
- for(i = 0; i < line->point_num; i++) {
- w = LV_MAX(line->point_array[i].x, w);
- h = LV_MAX(line->point_array[i].y, h);
- }
- lv_coord_t line_width = lv_obj_get_style_line_width(obj, LV_PART_MAIN);
- w += line_width;
- h += line_width;
- p->x = w;
- p->y = h;
+ uint16_t i;
+ for(i = 0; i < line->point_num; i++) {
+ w = LV_MAX(line->point_array[i].x, w);
+ h = LV_MAX(line->point_array[i].y, h);
}
+
+ lv_coord_t line_width = lv_obj_get_style_line_width(obj, LV_PART_MAIN);
+ w += line_width;
+ h += line_width;
+ p->x = w;
+ p->y = h;
}
else if(code == LV_EVENT_DRAW_MAIN) {
lv_line_t * line = (lv_line_t *)obj;
@@ -170,18 +171,17 @@ static void lv_line_event(const lv_obj_class_t * class_p, lv_event_t * e)
lv_obj_get_coords(obj, &area);
lv_coord_t x_ofs = area.x1 - lv_obj_get_scroll_x(obj);
lv_coord_t y_ofs = area.y1 - lv_obj_get_scroll_y(obj);
- lv_point_t p1;
- lv_point_t p2;
lv_coord_t h = lv_obj_get_height(obj);
- uint16_t i;
lv_draw_line_dsc_t line_dsc;
lv_draw_line_dsc_init(&line_dsc);
lv_obj_init_draw_line_dsc(obj, LV_PART_MAIN, &line_dsc);
/*Read all points and draw the lines*/
+ uint16_t i;
for(i = 0; i < line->point_num - 1; i++) {
-
+ lv_point_t p1;
+ lv_point_t p2;
p1.x = line->point_array[i].x + x_ofs;
p2.x = line->point_array[i + 1].x + x_ofs;
diff --git a/src/widgets/lv_roller.c b/src/widgets/lv_roller.c
index d66f8595f..fd9b3948f 100644
--- a/src/widgets/lv_roller.c
+++ b/src/widgets/lv_roller.c
@@ -161,17 +161,20 @@ void lv_roller_set_selected(lv_obj_t * obj, uint16_t sel_opt, lv_anim_enable_t a
/*In infinite mode interpret the new ID relative to the currently visible "page"*/
if(roller->mode == LV_ROLLER_MODE_INFINITE) {
- int32_t sel_opt_signed = sel_opt;
- uint16_t page = roller->sel_opt_id / LV_ROLLER_INF_PAGES;
-
- /*`sel_opt` should be less than the number of options set by the user.
- *If it's more then probably it's a reference from not the first page
- *so normalize `sel_opt`*/
- if(page != 0) {
- sel_opt_signed -= page * LV_ROLLER_INF_PAGES;
+ uint32_t real_option_cnt = roller->option_cnt / LV_ROLLER_INF_PAGES;
+ uint16_t current_page = roller->sel_opt_id / real_option_cnt;
+ /*Set by the user to e.g. 0, 1, 2, 3...
+ *Upscale the value to the current page*/
+ if(sel_opt < real_option_cnt) {
+ uint16_t act_opt = roller->sel_opt_id - current_page * real_option_cnt;
+ int32_t sel_opt_signed = sel_opt;
+ /*Huge jump? Probably from last to first or first to last option.*/
+ if(LV_ABS((int16_t)act_opt - sel_opt) > real_option_cnt / 2) {
+ if(act_opt > sel_opt) sel_opt_signed += real_option_cnt;
+ else sel_opt_signed -= real_option_cnt;
+ }
+ sel_opt = sel_opt_signed + real_option_cnt * current_page;
}
-
- sel_opt = page * LV_ROLLER_INF_PAGES + sel_opt_signed;
}
roller->sel_opt_id = sel_opt < roller->option_cnt ? sel_opt : roller->option_cnt - 1;
diff --git a/src/widgets/lv_slider.c b/src/widgets/lv_slider.c
index 82f6feea3..3f85efc28 100644
--- a/src/widgets/lv_slider.c
+++ b/src/widgets/lv_slider.c
@@ -22,7 +22,7 @@
*********************/
#define MY_CLASS &lv_slider_class
-#define LV_SLIDER_KNOB_COORD(hor, is_rtl, area) (hor ? (is_rtl ? area.x1 : area.x2) : (is_rtl ? area.y1 : area.y2))
+#define LV_SLIDER_KNOB_COORD(is_rtl, area) (is_rtl ? area.x1 : area.x2)
/**********************
* TYPEDEFS
@@ -33,8 +33,9 @@
**********************/
static void lv_slider_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj);
static void lv_slider_event(const lv_obj_class_t * class_p, lv_event_t * e);
-static void position_knob(lv_obj_t * obj, lv_area_t * knob_area, lv_coord_t knob_size, bool hor);
+static void position_knob(lv_obj_t * obj, lv_area_t * knob_area, const lv_coord_t knob_size, const bool hor);
static void draw_knob(lv_event_t * e);
+static bool is_slider_horizontal(lv_obj_t * obj);
/**********************
* STATIC VARIABLES
@@ -83,8 +84,8 @@ static void lv_slider_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj
/*Initialize the allocated 'slider'*/
slider->value_to_set = NULL;
- slider->dragging = 0;
- slider->left_knob_focus = 0;
+ slider->dragging = 0U;
+ slider->left_knob_focus = 0U;
lv_obj_clear_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN);
lv_obj_clear_flag(obj, LV_OBJ_FLAG_SCROLLABLE);
@@ -194,40 +195,40 @@ static void lv_slider_event(const lv_obj_class_t * class_p, lv_event_t * e)
lv_point_t p;
lv_indev_get_point(indev, &p);
- lv_base_dir_t base_dir = lv_obj_get_style_base_dir(obj, LV_PART_MAIN);
-
- lv_coord_t w = lv_obj_get_width(obj);
- lv_coord_t h = lv_obj_get_height(obj);
-
- lv_coord_t bg_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN);
- lv_coord_t bg_right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN);
- lv_coord_t bg_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN);
- lv_coord_t bg_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN);
-
- int32_t range = slider->bar.max_value - slider->bar.min_value;
int32_t new_value = 0;
- int32_t real_max_value = slider->bar.max_value;
- int32_t real_min_value = slider->bar.min_value;
- if(w >= h) {
- lv_coord_t indic_w = w - bg_left - bg_right;
- if(base_dir == LV_BASE_DIR_RTL) {
- new_value = (obj->coords.x2 - bg_right) - p.x; /*Make the point relative to the indicator*/
+ const int32_t range = slider->bar.max_value - slider->bar.min_value;
+ if(is_slider_horizontal(obj)) {
+ const lv_coord_t bg_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN);
+ const lv_coord_t bg_right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN);
+ const lv_coord_t w = lv_obj_get_width(obj);
+ const lv_coord_t indic_w = w - bg_left - bg_right;
+
+ if(lv_obj_get_style_base_dir(obj, LV_PART_MAIN) == LV_BASE_DIR_RTL) {
+ /*Make the point relative to the indicator*/
+ new_value = (obj->coords.x2 - bg_right) - p.x;
}
else {
- new_value = p.x - (obj->coords.x1 + bg_left); /*Make the point relative to the indicator*/
+ /*Make the point relative to the indicator*/
+ new_value = p.x - (obj->coords.x1 + bg_left);
}
- new_value = (new_value * range) / indic_w;
+ new_value = (new_value * range + indic_w / 2) / indic_w;
new_value += slider->bar.min_value;
}
else {
- lv_coord_t indic_h = h - bg_bottom - bg_top;
- new_value = p.y - (obj->coords.y2 + bg_bottom); /*Make the point relative to the indicator*/
- new_value = (-new_value * range) / indic_h;
+ const lv_coord_t bg_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN);
+ const lv_coord_t bg_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN);
+ const lv_coord_t h = lv_obj_get_height(obj);
+ const lv_coord_t indic_h = h - bg_bottom - bg_top;
+
+ /*Make the point relative to the indicator*/
+ new_value = p.y - (obj->coords.y2 + bg_bottom);
+ new_value = (-new_value * range + indic_h / 2) / indic_h;
new_value += slider->bar.min_value;
-
}
+ int32_t real_max_value = slider->bar.max_value;
+ int32_t real_min_value = slider->bar.min_value;
/*Figure out the min. and max. for this mode*/
if(slider->value_to_set == &slider->bar.start_value) {
real_max_value = slider->bar.cur_value;
@@ -236,8 +237,7 @@ static void lv_slider_event(const lv_obj_class_t * class_p, lv_event_t * e)
real_min_value = slider->bar.start_value;
}
- if(new_value < real_min_value) new_value = real_min_value;
- else if(new_value > real_max_value) new_value = real_max_value;
+ new_value = LV_CLAMP(real_min_value, new_value, real_max_value);
if(*slider->value_to_set != new_value) {
*slider->value_to_set = new_value;
lv_obj_invalidate(obj);
@@ -308,17 +308,17 @@ static void lv_slider_event(const lv_obj_class_t * class_p, lv_event_t * e)
if(c == LV_KEY_RIGHT || c == LV_KEY_UP) {
if(!slider->left_knob_focus) lv_slider_set_value(obj, lv_slider_get_value(obj) + 1, LV_ANIM_ON);
else lv_slider_set_left_value(obj, lv_slider_get_left_value(obj) + 1, LV_ANIM_ON);
-
- res = lv_event_send(obj, LV_EVENT_VALUE_CHANGED, NULL);
- if(res != LV_RES_OK) return;
}
else if(c == LV_KEY_LEFT || c == LV_KEY_DOWN) {
if(!slider->left_knob_focus) lv_slider_set_value(obj, lv_slider_get_value(obj) - 1, LV_ANIM_ON);
else lv_slider_set_left_value(obj, lv_slider_get_left_value(obj) - 1, LV_ANIM_ON);
-
- res = lv_event_send(obj, LV_EVENT_VALUE_CHANGED, NULL);
- if(res != LV_RES_OK) return;
}
+ else {
+ return;
+ }
+
+ res = lv_event_send(obj, LV_EVENT_VALUE_CHANGED, NULL);
+ if(res != LV_RES_OK) return;
}
else if(code == LV_EVENT_DRAW_MAIN) {
draw_knob(e);
@@ -330,51 +330,33 @@ static void draw_knob(lv_event_t * e)
lv_obj_t * obj = lv_event_get_target(e);
lv_slider_t * slider = (lv_slider_t *)obj;
lv_draw_ctx_t * draw_ctx = lv_event_get_draw_ctx(e);
- lv_base_dir_t base_dir = lv_obj_get_style_base_dir(obj, LV_PART_MAIN);
- lv_coord_t objw = lv_obj_get_width(obj);
- lv_coord_t objh = lv_obj_get_height(obj);
- bool hor = objw >= objh ? true : false;
- lv_coord_t knob_size = hor ? objh : objw;
- bool sym = false;
- if(slider->bar.mode == LV_BAR_MODE_SYMMETRICAL && slider->bar.min_value < 0 && slider->bar.max_value > 0) sym = true;
+ const bool is_rtl = LV_BASE_DIR_RTL == lv_obj_get_style_base_dir(obj, LV_PART_MAIN);
+ const bool is_horizontal = is_slider_horizontal(obj);
lv_area_t knob_area;
-
- /*Horizontal*/
- if(hor) {
- if(!sym) {
- knob_area.x1 = LV_SLIDER_KNOB_COORD(hor, base_dir == LV_BASE_DIR_RTL, slider->bar.indic_area);
- }
- else {
- if(slider->bar.cur_value >= 0) {
- knob_area.x1 = LV_SLIDER_KNOB_COORD(hor, base_dir == LV_BASE_DIR_RTL, slider->bar.indic_area);
- }
- else {
- knob_area.x1 = LV_SLIDER_KNOB_COORD(hor, base_dir != LV_BASE_DIR_RTL, slider->bar.indic_area);
- }
- }
+ lv_coord_t knob_size;
+ bool is_symmetrical = false;
+ if(slider->bar.mode == LV_BAR_MODE_SYMMETRICAL && slider->bar.min_value < 0 &&
+ slider->bar.max_value > 0) is_symmetrical = true;
+
+ if(is_horizontal) {
+ knob_size = lv_obj_get_height(obj);
+ if(is_symmetrical && slider->bar.cur_value < 0) knob_area.x1 = slider->bar.indic_area.x1;
+ else knob_area.x1 = LV_SLIDER_KNOB_COORD(is_rtl, slider->bar.indic_area);
}
- /*Vertical*/
else {
- if(!sym) {
- knob_area.y1 = slider->bar.indic_area.y1;
- }
- else {
- if(slider->bar.cur_value >= 0) {
- knob_area.y1 = slider->bar.indic_area.y1;
- }
- else {
- knob_area.y1 = slider->bar.indic_area.y2;
- }
- }
+ knob_size = lv_obj_get_width(obj);
+ if(is_symmetrical && slider->bar.cur_value < 0) knob_area.y1 = slider->bar.indic_area.y2;
+ else knob_area.y1 = slider->bar.indic_area.y1;
}
lv_draw_rect_dsc_t knob_rect_dsc;
lv_draw_rect_dsc_init(&knob_rect_dsc);
lv_obj_init_draw_rect_dsc(obj, LV_PART_KNOB, &knob_rect_dsc);
-
- position_knob(obj, &knob_area, knob_size, hor);
+ /* Update knob area with knob style */
+ position_knob(obj, &knob_area, knob_size, is_horizontal);
+ /* Update right knob area with calculated knob area */
lv_area_copy(&slider->right_knob_area, &knob_area);
lv_obj_draw_part_dsc_t part_draw_dsc;
@@ -395,19 +377,20 @@ static void draw_knob(lv_event_t * e)
/*Save the draw part_draw_dsc. because it can be modified in the event*/
lv_draw_rect_dsc_t knob_rect_dsc_tmp;
lv_memcpy(&knob_rect_dsc_tmp, &knob_rect_dsc, sizeof(lv_draw_rect_dsc_t));
-
+ /* Draw the right knob */
lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc);
lv_draw_rect(draw_ctx, &knob_rect_dsc, &slider->right_knob_area);
lv_event_send(obj, LV_EVENT_DRAW_PART_END, &part_draw_dsc);
- /*Draw a second knob for the start_value side*/
- if(hor) {
- knob_area.x1 = LV_SLIDER_KNOB_COORD(hor, base_dir != LV_BASE_DIR_RTL, slider->bar.indic_area);
+ /*Calculate the second knob area*/
+ if(is_horizontal) {
+ /*use !is_rtl to get the other knob*/
+ knob_area.x1 = LV_SLIDER_KNOB_COORD(!is_rtl, slider->bar.indic_area);
}
else {
knob_area.y1 = slider->bar.indic_area.y2;
}
- position_knob(obj, &knob_area, knob_size, hor);
+ position_knob(obj, &knob_area, knob_size, is_horizontal);
lv_area_copy(&slider->left_knob_area, &knob_area);
lv_memcpy(&knob_rect_dsc, &knob_rect_dsc_tmp, sizeof(lv_draw_rect_dsc_t));
@@ -422,9 +405,8 @@ static void draw_knob(lv_event_t * e)
}
}
-static void position_knob(lv_obj_t * obj, lv_area_t * knob_area, lv_coord_t knob_size, bool hor)
+static void position_knob(lv_obj_t * obj, lv_area_t * knob_area, const lv_coord_t knob_size, const bool hor)
{
-
if(hor) {
knob_area->x1 -= (knob_size >> 1);
knob_area->x2 = knob_area->x1 + knob_size - 1;
@@ -438,9 +420,9 @@ static void position_knob(lv_obj_t * obj, lv_area_t * knob_area, lv_coord_t knob
knob_area->x2 = obj->coords.x2;
}
- lv_coord_t knob_left = lv_obj_get_style_pad_left(obj, LV_PART_KNOB);
- lv_coord_t knob_right = lv_obj_get_style_pad_right(obj, LV_PART_KNOB);
- lv_coord_t knob_top = lv_obj_get_style_pad_top(obj, LV_PART_KNOB);
+ lv_coord_t knob_left = lv_obj_get_style_pad_left(obj, LV_PART_KNOB);
+ lv_coord_t knob_right = lv_obj_get_style_pad_right(obj, LV_PART_KNOB);
+ lv_coord_t knob_top = lv_obj_get_style_pad_top(obj, LV_PART_KNOB);
lv_coord_t knob_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_KNOB);
lv_coord_t transf_w = lv_obj_get_style_transform_width(obj, LV_PART_KNOB);
@@ -453,4 +435,9 @@ static void position_knob(lv_obj_t * obj, lv_area_t * knob_area, lv_coord_t knob
knob_area->y2 += knob_bottom + transf_h;
}
+static bool is_slider_horizontal(lv_obj_t * obj)
+{
+ return lv_obj_get_width(obj) >= lv_obj_get_height(obj);
+}
+
#endif
diff --git a/src/widgets/lv_table.c b/src/widgets/lv_table.c
index 1b032156e..5ff65ab23 100644
--- a/src/widgets/lv_table.c
+++ b/src/widgets/lv_table.c
@@ -36,8 +36,17 @@ static void draw_main(lv_event_t * e);
static lv_coord_t get_row_height(lv_obj_t * obj, uint16_t row_id, const lv_font_t * font,
lv_coord_t letter_space, lv_coord_t line_space,
lv_coord_t cell_left, lv_coord_t cell_right, lv_coord_t cell_top, lv_coord_t cell_bottom);
-static void refr_size(lv_obj_t * obj, uint32_t strat_row);
+static void refr_size_form_row(lv_obj_t * obj, uint32_t start_row);
+static void refr_cell_size(lv_obj_t * obj, uint32_t row, uint32_t col);
static lv_res_t get_pressed_cell(lv_obj_t * obj, uint16_t * row, uint16_t * col);
+static size_t get_cell_txt_len(const char * txt);
+static void copy_cell_txt(char * dst, const char * txt);
+static void get_cell_area(lv_obj_t * obj, uint16_t row, uint16_t col, lv_area_t * area);
+
+static inline bool is_cell_empty(void * cell)
+{
+ return cell == NULL;
+}
/**********************
* STATIC VARIABLES
@@ -90,25 +99,16 @@ void lv_table_set_cell_value(lv_obj_t * obj, uint16_t row, uint16_t col, const c
/*Save the control byte*/
if(table->cell_data[cell]) ctrl = table->cell_data[cell][0];
-#if LV_USE_ARABIC_PERSIAN_CHARS
- /*Get the size of the Arabic text and process it*/
- size_t len_ap = _lv_txt_ap_calc_bytes_cnt(txt);
- table->cell_data[cell] = lv_mem_realloc(table->cell_data[cell], len_ap + 1);
- LV_ASSERT_MALLOC(table->cell_data[cell]);
- if(table->cell_data[cell] == NULL) return;
+ size_t to_allocate = get_cell_txt_len(txt);
- _lv_txt_ap_proc(txt, &table->cell_data[cell][1]);
-#else
- table->cell_data[cell] = lv_mem_realloc(table->cell_data[cell], strlen(txt) + 2); /*+1: trailing '\0; +1: format byte*/
+ table->cell_data[cell] = lv_mem_realloc(table->cell_data[cell], to_allocate);
LV_ASSERT_MALLOC(table->cell_data[cell]);
+ if(table->cell_data[cell] == NULL) return;
- strcpy(table->cell_data[cell] + 1, txt); /*+1 to skip the format byte*/
-#endif
+ copy_cell_txt(table->cell_data[cell], txt);
table->cell_data[cell][0] = ctrl;
- refr_size(obj, row);
-
- lv_obj_invalidate(obj);
+ refr_cell_size(obj, row, col);
}
void lv_table_set_cell_value_fmt(lv_obj_t * obj, uint16_t row, uint16_t col, const char * fmt, ...)
@@ -118,8 +118,7 @@ void lv_table_set_cell_value_fmt(lv_obj_t * obj, uint16_t row, uint16_t col, con
lv_table_t * table = (lv_table_t *)obj;
if(col >= table->col_cnt) {
- LV_LOG_WARN("lv_table_set_cell_value: invalid column");
- return;
+ lv_table_set_col_cnt(obj, col + 1);
}
/*Auto expand*/
@@ -180,26 +179,7 @@ void lv_table_set_cell_value_fmt(lv_obj_t * obj, uint16_t row, uint16_t col, con
table->cell_data[cell][0] = ctrl;
- /*Refresh the row height*/
- lv_coord_t cell_left = lv_obj_get_style_pad_left(obj, LV_PART_ITEMS);
- lv_coord_t cell_right = lv_obj_get_style_pad_right(obj, LV_PART_ITEMS);
- lv_coord_t cell_top = lv_obj_get_style_pad_top(obj, LV_PART_ITEMS);
- lv_coord_t cell_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_ITEMS);
-
- lv_coord_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_ITEMS);
- lv_coord_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_ITEMS);
- const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_ITEMS);
-
- lv_coord_t h = get_row_height(obj, row, font, letter_space, line_space,
- cell_left, cell_right, cell_top, cell_bottom);
-
-
- lv_coord_t minh = lv_obj_get_style_min_height(obj, LV_PART_ITEMS);
- lv_coord_t maxh = lv_obj_get_style_max_height(obj, LV_PART_ITEMS);
-
- table->row_h[row] = LV_CLAMP(minh, h, maxh);
-
- lv_obj_invalidate(obj);
+ refr_cell_size(obj, row, col);
}
void lv_table_set_row_cnt(lv_obj_t * obj, uint16_t row_cnt)
@@ -207,6 +187,9 @@ void lv_table_set_row_cnt(lv_obj_t * obj, uint16_t row_cnt)
LV_ASSERT_OBJ(obj, MY_CLASS);
lv_table_t * table = (lv_table_t *)obj;
+
+ if(table->row_cnt == row_cnt) return;
+
uint16_t old_row_cnt = table->row_cnt;
table->row_cnt = row_cnt;
@@ -235,7 +218,7 @@ void lv_table_set_row_cnt(lv_obj_t * obj, uint16_t row_cnt)
lv_memset_00(&table->cell_data[old_cell_cnt], (new_cell_cnt - old_cell_cnt) * sizeof(table->cell_data[0]));
}
- refr_size(obj, 0) ;
+ refr_size_form_row(obj, 0);
}
void lv_table_set_col_cnt(lv_obj_t * obj, uint16_t col_cnt)
@@ -243,35 +226,18 @@ void lv_table_set_col_cnt(lv_obj_t * obj, uint16_t col_cnt)
LV_ASSERT_OBJ(obj, MY_CLASS);
lv_table_t * table = (lv_table_t *)obj;
+
+ if(table->col_cnt == col_cnt) return;
+
uint16_t old_col_cnt = table->col_cnt;
table->col_cnt = col_cnt;
- table->col_w = lv_mem_realloc(table->col_w, col_cnt * sizeof(table->row_h[0]));
- LV_ASSERT_MALLOC(table->col_w);
- if(table->col_w == NULL) return;
-
- /*Free the unused cells*/
- if(old_col_cnt > col_cnt) {
- uint16_t old_cell_cnt = old_col_cnt * table->row_cnt;
- uint32_t new_cell_cnt = table->col_cnt * table->row_cnt;
- uint32_t i;
- for(i = new_cell_cnt; i < old_cell_cnt; i++) {
- lv_mem_free(table->cell_data[i]);
- }
- }
char ** new_cell_data = lv_mem_alloc(table->row_cnt * table->col_cnt * sizeof(char *));
LV_ASSERT_MALLOC(new_cell_data);
if(new_cell_data == NULL) return;
uint32_t new_cell_cnt = table->col_cnt * table->row_cnt;
- lv_memset_00(new_cell_data, new_cell_cnt * sizeof(table->cell_data[0]));
- /*Initialize the new fields*/
- if(old_col_cnt < col_cnt) {
- uint32_t col;
- for(col = old_col_cnt; col < col_cnt; col++) {
- table->col_w[col] = LV_DPI_DEF;
- }
- }
+ lv_memset_00(new_cell_data, new_cell_cnt * sizeof(table->cell_data[0]));
/*The new column(s) messes up the mapping of `cell_data`*/
uint32_t old_col_start;
@@ -284,13 +250,31 @@ void lv_table_set_col_cnt(lv_obj_t * obj, uint16_t col_cnt)
lv_memcpy_small(&new_cell_data[new_col_start], &table->cell_data[old_col_start],
sizeof(new_cell_data[0]) * min_col_cnt);
+
+ /*Free the old cells (only if the table becomes smaller)*/
+ int32_t i;
+ for(i = 0; i < (int32_t)old_col_cnt - col_cnt; i++) {
+ uint32_t idx = old_col_start + min_col_cnt + i;
+ lv_mem_free(table->cell_data[idx]);
+ table->cell_data[idx] = NULL;
+ }
}
lv_mem_free(table->cell_data);
table->cell_data = new_cell_data;
+ /*Initialize the new column widths if any*/
+ table->col_w = lv_mem_realloc(table->col_w, col_cnt * sizeof(table->col_w[0]));
+ LV_ASSERT_MALLOC(table->col_w);
+ if(table->col_w == NULL) return;
- refr_size(obj, 0) ;
+ uint32_t col;
+ for(col = old_col_cnt; col < col_cnt; col++) {
+ table->col_w[col] = LV_DPI_DEF;
+ }
+
+
+ refr_size_form_row(obj, 0) ;
}
void lv_table_set_col_width(lv_obj_t * obj, uint16_t col_id, lv_coord_t w)
@@ -303,7 +287,7 @@ void lv_table_set_col_width(lv_obj_t * obj, uint16_t col_id, lv_coord_t w)
if(col_id >= table->col_cnt) lv_table_set_col_cnt(obj, col_id + 1);
table->col_w[col_id] = w;
- refr_size(obj, 0) ;
+ refr_size_form_row(obj, 0);
}
void lv_table_add_cell_ctrl(lv_obj_t * obj, uint16_t row, uint16_t col, lv_table_cell_ctrl_t ctrl)
@@ -318,7 +302,7 @@ void lv_table_add_cell_ctrl(lv_obj_t * obj, uint16_t row, uint16_t col, lv_table
uint32_t cell = row * table->col_cnt + col;
- if(table->cell_data[cell] == NULL) {
+ if(is_cell_empty(table->cell_data[cell])) {
table->cell_data[cell] = lv_mem_alloc(2); /*+1: trailing '\0; +1: format byte*/
LV_ASSERT_MALLOC(table->cell_data[cell]);
if(table->cell_data[cell] == NULL) return;
@@ -342,7 +326,7 @@ void lv_table_clear_cell_ctrl(lv_obj_t * obj, uint16_t row, uint16_t col, lv_tab
uint32_t cell = row * table->col_cnt + col;
- if(table->cell_data[cell] == NULL) {
+ if(is_cell_empty(table->cell_data[cell])) {
table->cell_data[cell] = lv_mem_alloc(2); /*+1: trailing '\0; +1: format byte*/
LV_ASSERT_MALLOC(table->cell_data[cell]);
if(table->cell_data[cell] == NULL) return;
@@ -364,12 +348,12 @@ const char * lv_table_get_cell_value(lv_obj_t * obj, uint16_t row, uint16_t col)
lv_table_t * table = (lv_table_t *)obj;
if(row >= table->row_cnt || col >= table->col_cnt) {
- LV_LOG_WARN("lv_table_set_cell_value: invalid row or column");
+ LV_LOG_WARN("invalid row or column");
return "";
}
uint32_t cell = row * table->col_cnt + col;
- if(table->cell_data[cell] == NULL) return "";
+ if(is_cell_empty(table->cell_data[cell])) return "";
return &table->cell_data[cell][1]; /*Skip the format byte*/
}
@@ -415,8 +399,8 @@ bool lv_table_has_cell_ctrl(lv_obj_t * obj, uint16_t row, uint16_t col, lv_table
}
uint32_t cell = row * table->col_cnt + col;
- if(table->cell_data[cell] == NULL) return false;
- else return (table->cell_data[cell][0] & ctrl) == ctrl ? true : false;
+ if(is_cell_empty(table->cell_data[cell])) return false;
+ else return (table->cell_data[cell][0] & ctrl) == ctrl;
}
void lv_table_get_selected_cell(lv_obj_t * obj, uint16_t * row, uint16_t * col)
@@ -482,7 +466,7 @@ static void lv_table_event(const lv_obj_class_t * class_p, lv_event_t * e)
lv_table_t * table = (lv_table_t *)obj;
if(code == LV_EVENT_STYLE_CHANGED) {
- refr_size(obj, 0);
+ refr_size_form_row(obj, 0);
}
else if(code == LV_EVENT_GET_SELF_SIZE) {
lv_point_t * p = lv_event_get_param(e);
@@ -599,8 +583,6 @@ static void draw_main(lv_event_t * e)
lv_point_t txt_size;
lv_area_t cell_area;
- lv_area_t txt_area;
- lv_text_flag_t txt_flags;
lv_coord_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN);
lv_coord_t bg_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN);
@@ -608,11 +590,6 @@ static void draw_main(lv_event_t * e)
lv_coord_t bg_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN);
lv_coord_t bg_right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN);
- lv_coord_t cell_left = lv_obj_get_style_pad_left(obj, LV_PART_ITEMS);
- lv_coord_t cell_right = lv_obj_get_style_pad_right(obj, LV_PART_ITEMS);
- lv_coord_t cell_top = lv_obj_get_style_pad_top(obj, LV_PART_ITEMS);
- lv_coord_t cell_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_ITEMS);
-
lv_state_t state_ori = obj->state;
obj->state = LV_STATE_DEFAULT;
obj->skip_trans = 1;
@@ -634,7 +611,7 @@ static void draw_main(lv_event_t * e)
cell_area.y2 = obj->coords.y1 + bg_top - 1 - lv_obj_get_scroll_y(obj) + border_width;
lv_coord_t scroll_x = lv_obj_get_scroll_x(obj) ;
- bool rtl = lv_obj_get_style_base_dir(obj, LV_PART_MAIN) == LV_BASE_DIR_RTL ? true : false;
+ bool rtl = lv_obj_get_style_base_dir(obj, LV_PART_MAIN) == LV_BASE_DIR_RTL;
/*Handle custom drawer*/
lv_obj_draw_part_dsc_t part_draw_dsc;
@@ -671,15 +648,16 @@ static void draw_main(lv_event_t * e)
uint16_t col_merge = 0;
for(col_merge = 0; col_merge + col < table->col_cnt - 1; col_merge++) {
- if(table->cell_data[cell + col_merge]) {
- char * next_cell_data = table->cell_data[cell + col_merge];
- if(next_cell_data) ctrl = next_cell_data[0];
- if(ctrl & LV_TABLE_CELL_CTRL_MERGE_RIGHT)
- if(rtl) cell_area.x1 -= table->col_w[col + col_merge + 1];
- else cell_area.x2 += table->col_w[col + col_merge + 1];
- else {
- break;
- }
+ char * next_cell_data = table->cell_data[cell + col_merge];
+
+ if(is_cell_empty(next_cell_data)) break;
+
+ lv_table_cell_ctrl_t merge_ctrl = (lv_table_cell_ctrl_t) next_cell_data[0];
+ if(merge_ctrl & LV_TABLE_CELL_CTRL_MERGE_RIGHT) {
+ lv_coord_t offset = table->col_w[col + col_merge + 1];
+
+ if(rtl) cell_area.x1 -= offset;
+ else cell_area.x2 += offset;
}
else {
break;
@@ -741,6 +719,13 @@ static void draw_main(lv_event_t * e)
lv_draw_rect(draw_ctx, &rect_dsc_act, &cell_area_border);
if(table->cell_data[cell]) {
+ const lv_coord_t cell_left = lv_obj_get_style_pad_left(obj, LV_PART_ITEMS);
+ const lv_coord_t cell_right = lv_obj_get_style_pad_right(obj, LV_PART_ITEMS);
+ const lv_coord_t cell_top = lv_obj_get_style_pad_top(obj, LV_PART_ITEMS);
+ const lv_coord_t cell_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_ITEMS);
+ lv_text_flag_t txt_flags = LV_TEXT_FLAG_NONE;
+ lv_area_t txt_area;
+
txt_area.x1 = cell_area.x1 + cell_left;
txt_area.x2 = cell_area.x2 - cell_right;
txt_area.y1 = cell_area.y1 + cell_top;
@@ -749,7 +734,6 @@ static void draw_main(lv_event_t * e)
/*Align the content to the middle if not cropped*/
bool crop = ctrl & LV_TABLE_CELL_CTRL_TEXT_CROP ? true : false;
if(crop) txt_flags = LV_TEXT_FLAG_EXPAND;
- else txt_flags = LV_TEXT_FLAG_NONE;
lv_txt_get_size(&txt_size, table->cell_data[cell] + 1, label_dsc_def.font,
label_dsc_act.letter_space, label_dsc_act.line_space,
@@ -781,31 +765,66 @@ static void draw_main(lv_event_t * e)
draw_ctx->clip_area = clip_area_ori;
}
-static void refr_size(lv_obj_t * obj, uint32_t strat_row)
+/* Refreshes size of the table starting from @start_row row */
+static void refr_size_form_row(lv_obj_t * obj, uint32_t start_row)
{
- lv_table_t * table = (lv_table_t *)obj;
+ const lv_coord_t cell_pad_left = lv_obj_get_style_pad_left(obj, LV_PART_ITEMS);
+ const lv_coord_t cell_pad_right = lv_obj_get_style_pad_right(obj, LV_PART_ITEMS);
+ const lv_coord_t cell_pad_top = lv_obj_get_style_pad_top(obj, LV_PART_ITEMS);
+ const lv_coord_t cell_pad_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_ITEMS);
+
+ lv_coord_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_ITEMS);
+ lv_coord_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_ITEMS);
+ const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_ITEMS);
+
+ const lv_coord_t minh = lv_obj_get_style_min_height(obj, LV_PART_ITEMS);
+ const lv_coord_t maxh = lv_obj_get_style_max_height(obj, LV_PART_ITEMS);
+ lv_table_t * table = (lv_table_t *)obj;
uint32_t i;
+ for(i = start_row; i < table->row_cnt; i++) {
+ lv_coord_t calculated_height = get_row_height(obj, i, font, letter_space, line_space,
+ cell_pad_left, cell_pad_right, cell_pad_top, cell_pad_bottom);
+ table->row_h[i] = LV_CLAMP(minh, calculated_height, maxh);
+ }
+
+ lv_obj_refresh_self_size(obj);
+ lv_obj_invalidate(obj);
+}
+
- lv_coord_t cell_left = lv_obj_get_style_pad_left(obj, LV_PART_ITEMS);
- lv_coord_t cell_right = lv_obj_get_style_pad_right(obj, LV_PART_ITEMS);
- lv_coord_t cell_top = lv_obj_get_style_pad_top(obj, LV_PART_ITEMS);
- lv_coord_t cell_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_ITEMS);
+static void refr_cell_size(lv_obj_t * obj, uint32_t row, uint32_t col)
+{
+ const lv_coord_t cell_pad_left = lv_obj_get_style_pad_left(obj, LV_PART_ITEMS);
+ const lv_coord_t cell_pad_right = lv_obj_get_style_pad_right(obj, LV_PART_ITEMS);
+ const lv_coord_t cell_pad_top = lv_obj_get_style_pad_top(obj, LV_PART_ITEMS);
+ const lv_coord_t cell_pad_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_ITEMS);
lv_coord_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_ITEMS);
lv_coord_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_ITEMS);
const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_ITEMS);
- lv_coord_t minh = lv_obj_get_style_min_height(obj, LV_PART_ITEMS);
- lv_coord_t maxh = lv_obj_get_style_max_height(obj, LV_PART_ITEMS);
+ const lv_coord_t minh = lv_obj_get_style_min_height(obj, LV_PART_ITEMS);
+ const lv_coord_t maxh = lv_obj_get_style_max_height(obj, LV_PART_ITEMS);
- for(i = strat_row; i < table->row_cnt; i++) {
- table->row_h[i] = get_row_height(obj, i, font, letter_space, line_space,
- cell_left, cell_right, cell_top, cell_bottom);
- table->row_h[i] = LV_CLAMP(minh, table->row_h[i], maxh);
+ lv_table_t * table = (lv_table_t *)obj;
+ lv_coord_t calculated_height = get_row_height(obj, row, font, letter_space, line_space,
+ cell_pad_left, cell_pad_right, cell_pad_top, cell_pad_bottom);
+
+ lv_coord_t prev_row_size = table->row_h[row];
+ table->row_h[row] = LV_CLAMP(minh, calculated_height, maxh);
+
+ /*If the row height havn't changed invalidate only this cell*/
+ if(prev_row_size == table->row_h[row]) {
+ lv_area_t cell_area;
+ get_cell_area(obj, row, col, &cell_area);
+ lv_area_move(&cell_area, obj->coords.x1, obj->coords.y1);
+ lv_obj_invalidate_area(obj, &cell_area);
+ }
+ else {
+ lv_obj_refresh_self_size(obj);
+ lv_obj_invalidate(obj);
}
-
- lv_obj_refresh_self_size(obj) ;
}
static lv_coord_t get_row_height(lv_obj_t * obj, uint16_t row_id, const lv_font_t * font,
@@ -813,53 +832,60 @@ static lv_coord_t get_row_height(lv_obj_t * obj, uint16_t row_id, const lv_font_
lv_coord_t cell_left, lv_coord_t cell_right, lv_coord_t cell_top, lv_coord_t cell_bottom)
{
lv_table_t * table = (lv_table_t *)obj;
- lv_point_t txt_size;
- lv_coord_t txt_w;
+ lv_coord_t h_max = lv_font_get_line_height(font) + cell_top + cell_bottom;
+ /* Calculate the cell_data index where to start */
uint16_t row_start = row_id * table->col_cnt;
+
+ /* Traverse the cells in the row_id row */
uint16_t cell;
uint16_t col;
- lv_coord_t h_max = lv_font_get_line_height(font) + cell_top + cell_bottom;
-
for(cell = row_start, col = 0; cell < row_start + table->col_cnt; cell++, col++) {
- if(table->cell_data[cell] != NULL) {
- txt_w = table->col_w[col];
- uint16_t col_merge = 0;
- for(col_merge = 0; col_merge + col < table->col_cnt - 1; col_merge++) {
+ char * cell_data = table->cell_data[cell];
- if(table->cell_data[cell + col_merge] != NULL) {
- lv_table_cell_ctrl_t ctrl = 0;
- char * next_cell_data = table->cell_data[cell + col_merge];
- if(next_cell_data) ctrl = next_cell_data[0];
- if(ctrl & LV_TABLE_CELL_CTRL_MERGE_RIGHT)
- txt_w += table->col_w[col + col_merge + 1];
- else
- break;
- }
- else {
- break;
- }
- }
+ if(is_cell_empty(cell_data)) {
+ continue;
+ }
- lv_table_cell_ctrl_t ctrl = 0;
- if(table->cell_data[cell]) ctrl = table->cell_data[cell][0];
+ lv_coord_t txt_w = table->col_w[col];
+
+ /* Traverse the current row from the first until the penultimate column.
+ * Increment the text width if the cell has the LV_TABLE_CELL_CTRL_MERGE_RIGHT control,
+ * exit the traversal when the current cell control is not LV_TABLE_CELL_CTRL_MERGE_RIGHT */
+ uint16_t col_merge = 0;
+ for(col_merge = 0; col_merge + col < table->col_cnt - 1; col_merge++) {
+ char * next_cell_data = table->cell_data[cell + col_merge];
+
+ if(is_cell_empty(next_cell_data)) break;
- /*With text crop assume 1 line*/
- if(ctrl & LV_TABLE_CELL_CTRL_TEXT_CROP) {
- h_max = LV_MAX(lv_font_get_line_height(font) + cell_top + cell_bottom,
- h_max);
+ lv_table_cell_ctrl_t ctrl = (lv_table_cell_ctrl_t) next_cell_data[0];
+ if(ctrl & LV_TABLE_CELL_CTRL_MERGE_RIGHT) {
+ txt_w += table->col_w[col + col_merge + 1];
}
- /*Without text crop calculate the height of the text in the cell*/
else {
- txt_w -= cell_left + cell_right;
+ break;
+ }
+ }
- lv_txt_get_size(&txt_size, table->cell_data[cell] + 1, font,
- letter_space, line_space, txt_w, LV_TEXT_FLAG_NONE);
+ lv_table_cell_ctrl_t ctrl = (lv_table_cell_ctrl_t) cell_data[0];
- h_max = LV_MAX(txt_size.y + cell_top + cell_bottom, h_max);
- cell += col_merge;
- col += col_merge;
- }
+ /*When cropping the text we can assume the row height is equal to the line height*/
+ if(ctrl & LV_TABLE_CELL_CTRL_TEXT_CROP) {
+ h_max = LV_MAX(lv_font_get_line_height(font) + cell_top + cell_bottom,
+ h_max);
+ }
+ /*Else we have to calculate the height of the cell text*/
+ else {
+ lv_point_t txt_size;
+ txt_w -= cell_left + cell_right;
+
+ lv_txt_get_size(&txt_size, table->cell_data[cell] + 1, font,
+ letter_space, line_space, txt_w, LV_TEXT_FLAG_NONE);
+
+ h_max = LV_MAX(txt_size.y + cell_top + cell_bottom, h_max);
+ /*Skip until one element after the last merged column*/
+ cell += col_merge;
+ col += col_merge;
}
}
@@ -917,5 +943,65 @@ static lv_res_t get_pressed_cell(lv_obj_t * obj, uint16_t * row, uint16_t * col)
return LV_RES_OK;
}
+/* Returns number of bytes to allocate based on chars configuration */
+static size_t get_cell_txt_len(const char * txt)
+{
+ size_t retval = 0;
+
+#if LV_USE_ARABIC_PERSIAN_CHARS
+ retval = _lv_txt_ap_calc_bytes_cnt(txt) + 1;
+#else
+ /* cell_data layout: [ctrl][txt][trailing '\0' terminator]
+ * +2 because of the trailing '\0' and the ctrl */
+ retval = strlen(txt) + 2;
+#endif
+
+ return retval;
+}
+
+/* Copy txt into dst skipping the format byte */
+static void copy_cell_txt(char * dst, const char * txt)
+{
+#if LV_USE_ARABIC_PERSIAN_CHARS
+ _lv_txt_ap_proc(txt, &dst[1]);
+#else
+ strcpy(&dst[1], txt);
+#endif
+}
+
+static void get_cell_area(lv_obj_t * obj, uint16_t row, uint16_t col, lv_area_t * area)
+{
+ lv_table_t * table = (lv_table_t *)obj;
+
+ uint32_t c;
+ area->x1 = 0;
+ for(c = 0; c < col; c++) {
+ area->x1 += table->col_w[c];
+ }
+
+ bool rtl = lv_obj_get_style_base_dir(obj, LV_PART_MAIN) == LV_BASE_DIR_RTL;
+ if(rtl) {
+ area->x1 += lv_obj_get_scroll_x(obj);
+ lv_coord_t w = lv_obj_get_width(obj);
+ area->x2 = w - area->x1 - lv_obj_get_style_pad_right(obj, 0);
+ area->x1 = area->x2 - table->col_w[col];
+ }
+ else {
+ area->x1 -= lv_obj_get_scroll_x(obj);
+ area->x1 += lv_obj_get_style_pad_left(obj, 0);
+ area->x2 = area->x1 + table->col_w[col] - 1;
+ }
+
+ uint32_t r;
+ area->y1 = 0;
+ for(r = 0; r < row; r++) {
+ area->y1 += table->row_h[r];
+ }
+
+ area->y1 += lv_obj_get_style_pad_top(obj, 0);
+ area->y1 -= lv_obj_get_scroll_y(obj);
+ area->y2 = area->y1 + table->row_h[row] - 1;
+
+}
#endif
diff --git a/src/widgets/lv_textarea.c b/src/widgets/lv_textarea.c
index 0dff383d7..4d497e669 100644
--- a/src/widgets/lv_textarea.c
+++ b/src/widgets/lv_textarea.c
@@ -34,6 +34,7 @@
#endif
#define LV_TEXTAREA_PWD_BULLET_UNICODE 0x2022
+#define IGNORE_KERNING '\0'
/**********************
* TYPEDEFS
@@ -57,6 +58,8 @@ static void update_cursor_position_on_click(lv_event_t * e);
static lv_res_t insert_handler(lv_obj_t * obj, const char * txt);
static void draw_placeholder(lv_event_t * e);
static void draw_cursor(lv_event_t * e);
+static void auto_hide_characters(lv_obj_t * obj);
+static inline bool is_valid_but_non_printable_char(const uint32_t letter);
/**********************
* STATIC VARIABLES
@@ -100,13 +103,16 @@ void lv_textarea_add_char(lv_obj_t * obj, uint32_t c)
lv_textarea_t * ta = (lv_textarea_t *)obj;
- const char * letter_buf;
+ if(ta->one_line && (c == '\n' || c == '\r')) {
+ LV_LOG_INFO("Text area: line break ignored in one-line mode");
+ return;
+ }
uint32_t u32_buf[2];
u32_buf[0] = c;
u32_buf[1] = 0;
- letter_buf = (char *)&u32_buf;
+ const char * letter_buf = (char *)&u32_buf;
#if LV_BIG_ENDIAN_SYSTEM
if(c != 0) while(*letter_buf == 0) ++letter_buf;
@@ -115,11 +121,6 @@ void lv_textarea_add_char(lv_obj_t * obj, uint32_t c)
lv_res_t res = insert_handler(obj, letter_buf);
if(res != LV_RES_OK) return;
- if(ta->one_line && (c == '\n' || c == '\r')) {
- LV_LOG_INFO("Text area: line break ignored in one-line mode");
- return;
- }
-
uint32_t c_uni = _lv_txt_encoded_next((const char *)&c, NULL);
if(char_is_accepted(obj, c_uni) == false) {
@@ -127,7 +128,7 @@ void lv_textarea_add_char(lv_obj_t * obj, uint32_t c)
return;
}
- if(ta->pwd_mode != 0) pwd_char_hider(obj); /*Make sure all the current text contains only '*'*/
+ if(ta->pwd_mode) pwd_char_hider(obj); /*Make sure all the current text contains only '*'*/
/*If the textarea is empty, invalidate it to hide the placeholder*/
if(ta->placeholder_txt) {
@@ -136,30 +137,19 @@ void lv_textarea_add_char(lv_obj_t * obj, uint32_t c)
}
lv_label_ins_text(ta->label, ta->cursor.pos, letter_buf); /*Insert the character*/
- lv_textarea_clear_selection(obj); /*Clear selection*/
+ lv_textarea_clear_selection(obj); /*Clear selection*/
- if(ta->pwd_mode != 0) {
- ta->pwd_tmp = lv_mem_realloc(ta->pwd_tmp, strlen(ta->pwd_tmp) + strlen(letter_buf) + 1); /*+2: the new char + \0*/
+ if(ta->pwd_mode) {
+ /*+2: the new char + \0*/
+ size_t realloc_size = strlen(ta->pwd_tmp) + strlen(letter_buf) + 1;
+ ta->pwd_tmp = lv_mem_realloc(ta->pwd_tmp, realloc_size);
LV_ASSERT_MALLOC(ta->pwd_tmp);
if(ta->pwd_tmp == NULL) return;
_lv_txt_ins(ta->pwd_tmp, ta->cursor.pos, (const char *)letter_buf);
/*Auto hide characters*/
- if(ta->pwd_show_time == 0) {
- pwd_char_hider(obj);
- }
- else {
- lv_anim_t a;
- lv_anim_init(&a);
- lv_anim_set_var(&a, ta);
- lv_anim_set_exec_cb(&a, pwd_char_hider_anim);
- lv_anim_set_time(&a, ta->pwd_show_time);
- lv_anim_set_values(&a, 0, 1);
- lv_anim_set_path_cb(&a, lv_anim_path_step);
- lv_anim_set_ready_cb(&a, pwd_char_hider_anim_ready);
- lv_anim_start(&a);
- }
+ auto_hide_characters(obj);
}
/*Move the cursor after the new character*/
@@ -175,7 +165,7 @@ void lv_textarea_add_text(lv_obj_t * obj, const char * txt)
lv_textarea_t * ta = (lv_textarea_t *)obj;
- if(ta->pwd_mode != 0) pwd_char_hider(obj); /*Make sure all the current text contains only '*'*/
+ if(ta->pwd_mode) pwd_char_hider(obj); /*Make sure all the current text contains only '*'*/
/*Add the character one-by-one if not all characters are accepted or there is character limit.*/
if(lv_textarea_get_accepted_chars(obj) || lv_textarea_get_max_length(obj)) {
@@ -200,28 +190,16 @@ void lv_textarea_add_text(lv_obj_t * obj, const char * txt)
lv_label_ins_text(ta->label, ta->cursor.pos, txt);
lv_textarea_clear_selection(obj);
- if(ta->pwd_mode != 0) {
- ta->pwd_tmp = lv_mem_realloc(ta->pwd_tmp, strlen(ta->pwd_tmp) + strlen(txt) + 1);
+ if(ta->pwd_mode) {
+ size_t realloc_size = strlen(ta->pwd_tmp) + strlen(txt) + 1;
+ ta->pwd_tmp = lv_mem_realloc(ta->pwd_tmp, realloc_size);
LV_ASSERT_MALLOC(ta->pwd_tmp);
if(ta->pwd_tmp == NULL) return;
_lv_txt_ins(ta->pwd_tmp, ta->cursor.pos, txt);
/*Auto hide characters*/
- if(ta->pwd_show_time == 0) {
- pwd_char_hider(obj);
- }
- else {
- lv_anim_t a;
- lv_anim_init(&a);
- lv_anim_set_var(&a, ta);
- lv_anim_set_exec_cb(&a, pwd_char_hider_anim);
- lv_anim_set_time(&a, ta->pwd_show_time);
- lv_anim_set_values(&a, 0, 1);
- lv_anim_set_path_cb(&a, lv_anim_path_step);
- lv_anim_set_ready_cb(&a, pwd_char_hider_anim_ready);
- lv_anim_start(&a);
- }
+ auto_hide_characters(obj);
}
/*Move the cursor after the new text*/
@@ -259,7 +237,7 @@ void lv_textarea_del_char(lv_obj_t * obj)
if(txt[0] == '\0') lv_obj_invalidate(obj);
}
- if(ta->pwd_mode != 0) {
+ if(ta->pwd_mode) {
_lv_txt_cut(ta->pwd_tmp, ta->cursor.pos - 1, 1);
ta->pwd_tmp = lv_mem_realloc(ta->pwd_tmp, strlen(ta->pwd_tmp) + 1);
@@ -301,7 +279,7 @@ void lv_textarea_set_text(lv_obj_t * obj, const char * txt)
if(lv_textarea_get_accepted_chars(obj) || lv_textarea_get_max_length(obj)) {
lv_label_set_text(ta->label, "");
lv_textarea_set_cursor_pos(obj, LV_TEXTAREA_CURSOR_LAST);
- if(ta->pwd_mode != 0) {
+ if(ta->pwd_mode) {
ta->pwd_tmp[0] = '\0'; /*Clear the password too*/
}
uint32_t i = 0;
@@ -321,27 +299,14 @@ void lv_textarea_set_text(lv_obj_t * obj, const char * txt)
if(txt_act[0] == '\0') lv_obj_invalidate(obj);
}
- if(ta->pwd_mode != 0) {
+ if(ta->pwd_mode) {
ta->pwd_tmp = lv_mem_realloc(ta->pwd_tmp, strlen(txt) + 1);
LV_ASSERT_MALLOC(ta->pwd_tmp);
if(ta->pwd_tmp == NULL) return;
strcpy(ta->pwd_tmp, txt);
/*Auto hide characters*/
- if(ta->pwd_show_time == 0) {
- pwd_char_hider(obj);
- }
- else {
- lv_anim_t a;
- lv_anim_init(&a);
- lv_anim_set_var(&a, ta);
- lv_anim_set_exec_cb(&a, pwd_char_hider_anim);
- lv_anim_set_time(&a, ta->pwd_show_time);
- lv_anim_set_values(&a, 0, 1);
- lv_anim_set_path_cb(&a, lv_anim_path_step);
- lv_anim_set_ready_cb(&a, pwd_char_hider_anim_ready);
- lv_anim_start(&a);
- }
+ auto_hide_characters(obj);
}
lv_event_send(obj, LV_EVENT_VALUE_CHANGED, NULL);
@@ -355,29 +320,22 @@ void lv_textarea_set_placeholder_text(lv_obj_t * obj, const char * txt)
lv_textarea_t * ta = (lv_textarea_t *)obj;
size_t txt_len = strlen(txt);
-
- if(txt_len == 0) {
- if(ta->placeholder_txt) {
- lv_mem_free(ta->placeholder_txt);
- ta->placeholder_txt = NULL;
- }
+ if((txt_len == 0) && (ta->placeholder_txt)) {
+ lv_mem_free(ta->placeholder_txt);
+ ta->placeholder_txt = NULL;
}
else {
-
/*Allocate memory for the placeholder_txt text*/
- if(ta->placeholder_txt == NULL) {
- ta->placeholder_txt = lv_mem_alloc(txt_len + 1);
- }
- else {
- ta->placeholder_txt = lv_mem_realloc(ta->placeholder_txt, txt_len + 1);
-
- }
+ /*NOTE: Using special realloc behavior, malloc-like when data_p is NULL*/
+ ta->placeholder_txt = lv_mem_realloc(ta->placeholder_txt, txt_len + 1);
LV_ASSERT_MALLOC(ta->placeholder_txt);
if(ta->placeholder_txt == NULL) {
LV_LOG_ERROR("lv_textarea_set_placeholder_text: couldn't allocate memory for placeholder");
return;
}
+
strcpy(ta->placeholder_txt, txt);
+ ta->placeholder_txt[txt_len] = '\0';
}
lv_obj_invalidate(obj);
@@ -440,7 +398,7 @@ void lv_textarea_set_cursor_click_pos(lv_obj_t * obj, bool en)
LV_ASSERT_OBJ(obj, MY_CLASS);
lv_textarea_t * ta = (lv_textarea_t *)obj;
- ta->cursor.click_pos = en ? 1 : 0;
+ ta->cursor.click_pos = en ? 1U : 0U;
}
void lv_textarea_set_password_mode(lv_obj_t * obj, bool en)
@@ -450,11 +408,12 @@ void lv_textarea_set_password_mode(lv_obj_t * obj, bool en)
lv_textarea_t * ta = (lv_textarea_t *)obj;
if(ta->pwd_mode == en) return;
- ta->pwd_mode = en == false ? 0 : 1;
+ ta->pwd_mode = en ? 1U : 0U;
/*Pwd mode is now enabled*/
- if(en != false) {
- char * txt = lv_label_get_text(ta->label);
+ if(en) {
+ char * txt = lv_label_get_text(ta->label);
size_t len = strlen(txt);
+
ta->pwd_tmp = lv_mem_alloc(len + 1);
LV_ASSERT_MALLOC(ta->pwd_tmp);
if(ta->pwd_tmp == NULL) return;
@@ -476,6 +435,36 @@ void lv_textarea_set_password_mode(lv_obj_t * obj, bool en)
refr_cursor_area(obj);
}
+void lv_textarea_set_password_bullet(lv_obj_t * obj, const char * bullet)
+{
+ LV_ASSERT_OBJ(obj, MY_CLASS);
+ LV_ASSERT_NULL(bullet);
+
+ lv_textarea_t * ta = (lv_textarea_t *)obj;
+
+ if(!bullet && (ta->pwd_bullet)) {
+ lv_mem_free(ta->pwd_bullet);
+ ta->pwd_bullet = NULL;
+ }
+ else {
+ size_t txt_len = strlen(bullet);
+
+ /*Allocate memory for the pwd_bullet text*/
+ /*NOTE: Using special realloc behavior, malloc-like when data_p is NULL*/
+ ta->pwd_bullet = lv_mem_realloc(ta->pwd_bullet, txt_len + 1);
+ LV_ASSERT_MALLOC(ta->pwd_bullet);
+ if(ta->pwd_bullet == NULL) {
+ LV_LOG_ERROR("lv_textarea_set_password_bullet: couldn't allocate memory for bullet");
+ return;
+ }
+
+ strcpy(ta->pwd_bullet, bullet);
+ ta->pwd_bullet[txt_len] = '\0';
+ }
+
+ lv_obj_invalidate(obj);
+}
+
void lv_textarea_set_one_line(lv_obj_t * obj, bool en)
{
LV_ASSERT_OBJ(obj, MY_CLASS);
@@ -483,21 +472,21 @@ void lv_textarea_set_one_line(lv_obj_t * obj, bool en)
lv_textarea_t * ta = (lv_textarea_t *)obj;
if(ta->one_line == en) return;
- if(en) {
- ta->one_line = 1;
- lv_obj_set_width(ta->label, LV_SIZE_CONTENT);
- lv_obj_set_style_min_width(ta->label, lv_pct(100), 0);
+ ta->one_line = en ? 1U : 0U;
+ lv_coord_t width = en ? LV_SIZE_CONTENT : lv_pct(100);
+ lv_coord_t min_width_value = en ? lv_pct(100) : 0;
+
+ lv_obj_set_width(ta->label, width);
+ lv_obj_set_style_min_width(ta->label, min_width_value, 0);
+ if(en) {
lv_obj_set_height(obj, LV_SIZE_CONTENT);
- lv_obj_scroll_to(obj, 0, 0, LV_ANIM_OFF);
}
else {
- ta->one_line = 0;
- lv_obj_set_width(ta->label, lv_pct(100));
- lv_obj_set_style_min_width(ta->label, 0, 0);
lv_obj_remove_local_style_prop(obj, LV_STYLE_HEIGHT, LV_PART_MAIN);
- lv_obj_scroll_to(obj, 0, 0, LV_ANIM_OFF);
}
+
+ lv_obj_scroll_to(obj, 0, 0, LV_ANIM_OFF);
}
void lv_textarea_set_accepted_chars(lv_obj_t * obj, const char * list)
@@ -628,7 +617,24 @@ bool lv_textarea_get_password_mode(const lv_obj_t * obj)
LV_ASSERT_OBJ(obj, MY_CLASS);
lv_textarea_t * ta = (lv_textarea_t *)obj;
- return ta->pwd_mode == 0 ? false : true;
+ return ta->pwd_mode == 1U;
+}
+
+const char * lv_textarea_get_password_bullet(lv_obj_t * obj)
+{
+ LV_ASSERT_OBJ(obj, MY_CLASS);
+
+ lv_textarea_t * ta = (lv_textarea_t *)obj;
+
+ if(ta->pwd_bullet) return ta->pwd_bullet;
+
+ lv_font_glyph_dsc_t g;
+ const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN);
+
+ /*If the textarea's font has the bullet character use it else fallback to "*"*/
+ if(lv_font_get_glyph_dsc(font, &g, LV_TEXTAREA_PWD_BULLET_UNICODE, 0))
+ return LV_SYMBOL_BULLET;
+ return "*";
}
bool lv_textarea_get_one_line(const lv_obj_t * obj)
@@ -636,7 +642,7 @@ bool lv_textarea_get_one_line(const lv_obj_t * obj)
LV_ASSERT_OBJ(obj, MY_CLASS);
lv_textarea_t * ta = (lv_textarea_t *)obj;
- return ta->one_line == 0 ? false : true;
+ return ta->one_line == 1U;
}
const char * lv_textarea_get_accepted_chars(lv_obj_t * obj)
@@ -805,6 +811,7 @@ static void lv_textarea_constructor(const lv_obj_class_t * class_p, lv_obj_t * o
ta->pwd_mode = 0;
ta->pwd_tmp = NULL;
+ ta->pwd_bullet = NULL;
ta->pwd_show_time = LV_TEXTAREA_DEF_PWD_SHOW_TIME;
ta->accepted_chars = NULL;
ta->max_length = 0;
@@ -841,6 +848,10 @@ static void lv_textarea_destructor(const lv_obj_class_t * class_p, lv_obj_t * ob
lv_mem_free(ta->pwd_tmp);
ta->pwd_tmp = NULL;
}
+ if(ta->pwd_bullet != NULL) {
+ lv_mem_free(ta->pwd_bullet);
+ ta->pwd_bullet = NULL;
+ }
if(ta->placeholder_txt != NULL) {
lv_mem_free(ta->placeholder_txt);
ta->placeholder_txt = NULL;
@@ -922,7 +933,7 @@ static void cursor_blink_anim_cb(void * obj, int32_t show)
{
lv_textarea_t * ta = (lv_textarea_t *)obj;
if(show != ta->cursor.show) {
- ta->cursor.show = show == 0 ? 0 : 1;
+ ta->cursor.show = show ? 1U : 0U;
lv_area_t area_tmp;
lv_area_copy(&area_tmp, &ta->cursor.area);
area_tmp.x1 += ta->label->coords.x1;
@@ -963,67 +974,56 @@ static void pwd_char_hider_anim_ready(lv_anim_t * a)
static void pwd_char_hider(lv_obj_t * obj)
{
lv_textarea_t * ta = (lv_textarea_t *)obj;
- if(ta->pwd_mode != 0) {
- char * txt = lv_label_get_text(ta->label);
- int32_t enc_len = _lv_txt_get_encoded_length(txt);
- if(enc_len == 0) return;
-
- /*If the textarea's font has "bullet" character use it else fallback to "*"*/
- const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN);
- lv_font_glyph_dsc_t g;
- bool has_bullet;
- has_bullet = lv_font_get_glyph_dsc(font, &g, LV_TEXTAREA_PWD_BULLET_UNICODE, 0);
- const char * bullet;
- if(has_bullet) bullet = LV_SYMBOL_BULLET;
- else bullet = "*";
-
- size_t bullet_len = strlen(bullet);
- char * txt_tmp = lv_mem_buf_get(enc_len * bullet_len + 1);
- int32_t i;
- for(i = 0; i < enc_len; i++) {
- lv_memcpy(&txt_tmp[i * bullet_len], bullet, bullet_len);
- }
+ if(ta->pwd_mode == 0) {
+ return;
+ }
- txt_tmp[i * bullet_len] = '\0';
+ /* When ta->label is empty we get 0 back */
+ char * txt = lv_label_get_text(ta->label);
+ uint32_t enc_len = _lv_txt_get_encoded_length(txt);
+ if(enc_len == 0) return;
- lv_label_set_text(ta->label, txt_tmp);
- lv_mem_buf_release(txt_tmp);
- refr_cursor_area(obj);
+ const char * bullet = lv_textarea_get_password_bullet(obj);
+ const size_t bullet_len = strlen(bullet);
+ char * txt_tmp = lv_mem_buf_get(enc_len * bullet_len + 1);
+
+ uint32_t i;
+ for(i = 0; i < enc_len; i++) {
+ lv_memcpy(&txt_tmp[i * bullet_len], bullet, bullet_len);
}
+ txt_tmp[i * bullet_len] = '\0';
+
+ lv_label_set_text(ta->label, txt_tmp);
+ lv_mem_buf_release(txt_tmp);
+
+ refr_cursor_area(obj);
}
/**
- * Test an unicode character if it is accepted or not. Checks max length and accepted char list.
+ * Test a unicode character if it is accepted or not. Checks max length and accepted char list.
* @param ta pointer to a test area object
- * @param c an unicode character
+ * @param c a unicode character
* @return true: accepted; false: rejected
*/
static bool char_is_accepted(lv_obj_t * obj, uint32_t c)
{
lv_textarea_t * ta = (lv_textarea_t *)obj;
- /*If no restriction accept it*/
- if((ta->accepted_chars == NULL || ta->accepted_chars[0] == '\0') && ta->max_length == 0) return true;
-
/*Too many characters?*/
if(ta->max_length > 0 && _lv_txt_get_encoded_length(lv_textarea_get_text(obj)) >= ta->max_length) {
return false;
}
+ if(ta->accepted_chars == NULL || ta->accepted_chars[0] == '\0') return true;
/*Accepted character?*/
- if(ta->accepted_chars) {
- uint32_t i = 0;
-
- while(ta->accepted_chars[i] != '\0') {
- uint32_t a = _lv_txt_encoded_next(ta->accepted_chars, &i);
- if(a == c) return true; /*Accepted*/
- }
+ uint32_t i = 0;
- return false; /*The character wasn't in the list*/
- }
- else {
- return true; /*If the accepted char list in not specified the accept the character*/
+ while(ta->accepted_chars[i] != '\0') {
+ uint32_t a = _lv_txt_encoded_next(ta->accepted_chars, &i);
+ if(a == c) return true; /*Accepted*/
}
+
+ return false; /*The character wasn't in the list*/
}
static void start_cursor_blink(lv_obj_t * obj)
@@ -1058,22 +1058,17 @@ static void refr_cursor_area(lv_obj_t * obj)
uint32_t cur_pos = lv_textarea_get_cursor_pos(obj);
const char * txt = lv_label_get_text(ta->label);
- uint32_t byte_pos;
- byte_pos = _lv_txt_encoded_get_byte_id(txt, cur_pos);
-
+ uint32_t byte_pos = _lv_txt_encoded_get_byte_id(txt, cur_pos);
uint32_t letter = _lv_txt_encoded_next(&txt[byte_pos], NULL);
- lv_coord_t letter_h = lv_font_get_line_height(font);
-
+ /* Letter height and width */
+ const lv_coord_t letter_h = lv_font_get_line_height(font);
/*Set letter_w (set not 0 on non printable but valid chars)*/
- lv_coord_t letter_w;
- if(letter == '\0' || letter == '\n' || letter == '\r') {
- letter_w = lv_font_get_glyph_width(font, ' ', '\0');
- }
- else {
- /*`letter_next` parameter is '\0' to ignore kerning*/
- letter_w = lv_font_get_glyph_width(font, letter, '\0');
+ uint32_t letter_space = letter;
+ if(is_valid_but_non_printable_char(letter)) {
+ letter_space = ' ';
}
+ lv_coord_t letter_w = lv_font_get_glyph_width(font, letter_space, IGNORE_KERNING);
lv_point_t letter_pos;
lv_label_get_letter_pos(ta->label, cur_pos, &letter_pos);
@@ -1081,8 +1076,9 @@ static void refr_cursor_area(lv_obj_t * obj)
lv_text_align_t align = lv_obj_calculate_style_text_align(ta->label, LV_PART_MAIN, lv_label_get_text(ta->label));
/*If the cursor is out of the text (most right) draw it to the next line*/
- if(letter_pos.x + ta->label->coords.x1 + letter_w > ta->label->coords.x2 && ta->one_line == 0 &&
- align != LV_TEXT_ALIGN_RIGHT) {
+ if(((letter_pos.x + ta->label->coords.x1) + letter_w > ta->label->coords.x2) &&
+ (ta->one_line == 0 && align != LV_TEXT_ALIGN_RIGHT)) {
+
letter_pos.x = 0;
letter_pos.y += letter_h + line_space;
@@ -1091,12 +1087,11 @@ static void refr_cursor_area(lv_obj_t * obj)
letter = _lv_txt_encoded_next(&txt[byte_pos], NULL);
}
- if(letter == '\0' || letter == '\n' || letter == '\r') {
- letter_w = lv_font_get_glyph_width(font, ' ', '\0');
- }
- else {
- letter_w = lv_font_get_glyph_width(font, letter, '\0');
+ uint32_t tmp = letter;
+ if(is_valid_but_non_printable_char(letter)) {
+ tmp = ' ';
}
+ letter_w = lv_font_get_glyph_width(font, tmp, IGNORE_KERNING);
}
/*Save the byte position. It is required to draw `LV_CURSOR_BLOCK`*/
@@ -1139,7 +1134,6 @@ static void update_cursor_position_on_click(lv_event_t * e)
lv_indev_t * click_source = lv_indev_get_act();
if(click_source == NULL) return;
- lv_event_code_t code = lv_event_get_code(e);
lv_obj_t * obj = lv_event_get_target(e);
lv_textarea_t * ta = (lv_textarea_t *)obj;
if(ta->cursor.click_pos == 0) return;
@@ -1161,26 +1155,27 @@ static void update_cursor_position_on_click(lv_event_t * e)
rel_pos.x = point_act.x - label_coords.x1;
rel_pos.y = point_act.y - label_coords.y1;
- lv_coord_t label_width = lv_obj_get_width(ta->label);
+ const lv_event_code_t code = lv_event_get_code(e);
- uint16_t char_id_at_click;
+ lv_coord_t label_width = lv_obj_get_width(ta->label);
+ uint16_t char_id_at_click = 0;
#if LV_LABEL_TEXT_SELECTION
lv_label_t * label_data = (lv_label_t *)ta->label;
- bool click_outside_label;
+ bool click_outside_label = false;
/*Check if the click happened on the left side of the area outside the label*/
if(rel_pos.x < 0) {
char_id_at_click = 0;
- click_outside_label = true;
+ click_outside_label = true;
}
/*Check if the click happened on the right side of the area outside the label*/
else if(rel_pos.x >= label_width) {
char_id_at_click = LV_TEXTAREA_CURSOR_LAST;
- click_outside_label = true;
+ click_outside_label = true;
}
else {
char_id_at_click = lv_label_get_letter_on(ta->label, &rel_pos);
- click_outside_label = !lv_label_is_char_under_pos(ta->label, &rel_pos);
+ click_outside_label = !lv_label_is_char_under_pos(ta->label, &rel_pos);
}
if(ta->text_sel_en) {
@@ -1250,13 +1245,18 @@ static void update_cursor_position_on_click(lv_event_t * e)
#endif
}
+/* Returns LV_RES_OK when no operation were performed
+ * Returns LV_RES_INV when a user defined text was inserted */
static lv_res_t insert_handler(lv_obj_t * obj, const char * txt)
{
ta_insert_replace = NULL;
lv_event_send(obj, LV_EVENT_INSERT, (char *)txt);
- if(ta_insert_replace) {
- if(ta_insert_replace[0] == '\0') return LV_RES_INV; /*Drop this text*/
+ /* Drop txt if insert replace is set to '\0' */
+ if(ta_insert_replace && ta_insert_replace[0] == '\0')
+ return LV_RES_INV;
+
+ if(ta_insert_replace) {
/*Add the replaced text directly it's different from the original*/
if(strcmp(ta_insert_replace, txt)) {
lv_textarea_add_text(obj, ta_insert_replace);
@@ -1338,4 +1338,33 @@ static void draw_cursor(lv_event_t * e)
}
}
+static void auto_hide_characters(lv_obj_t * obj)
+{
+ lv_textarea_t * ta = (lv_textarea_t *) obj;
+
+ if(ta->pwd_show_time == 0) {
+ pwd_char_hider(obj);
+ }
+ else {
+ lv_anim_t a;
+ lv_anim_init(&a);
+ lv_anim_set_var(&a, ta);
+ lv_anim_set_exec_cb(&a, pwd_char_hider_anim);
+ lv_anim_set_time(&a, ta->pwd_show_time);
+ lv_anim_set_values(&a, 0, 1);
+ lv_anim_set_path_cb(&a, lv_anim_path_step);
+ lv_anim_set_ready_cb(&a, pwd_char_hider_anim_ready);
+ lv_anim_start(&a);
+ }
+}
+
+static inline bool is_valid_but_non_printable_char(const uint32_t letter)
+{
+ if(letter == '\0' || letter == '\n' || letter == '\r') {
+ return true;
+ }
+
+ return false;
+}
+
#endif
diff --git a/src/widgets/lv_textarea.h b/src/widgets/lv_textarea.h
index 219e2725e..4b3289b48 100644
--- a/src/widgets/lv_textarea.h
+++ b/src/widgets/lv_textarea.h
@@ -42,6 +42,7 @@ typedef struct {
lv_obj_t * label; /*Label of the text area*/
char * placeholder_txt; /*Place holder label. only visible if text is an empty string*/
char * pwd_tmp; /*Used to store the original text in password mode*/
+ char * pwd_bullet; /*Replacement characters displayed in password mode*/
const char * accepted_chars; /*Only these characters will be accepted. NULL: accept all*/
uint32_t max_length; /*The max. number of characters. 0: no limit*/
uint16_t pwd_show_time; /*Time to show characters in password mode before change them to '*'*/
@@ -154,6 +155,13 @@ void lv_textarea_set_cursor_click_pos(lv_obj_t * obj, bool en);
*/
void lv_textarea_set_password_mode(lv_obj_t * obj, bool en);
+/**
+ * Set the replacement characters to show in password mode
+ * @param obj pointer to a text area object
+ * @param bullet pointer to the replacement text
+ */
+void lv_textarea_set_password_bullet(lv_obj_t * obj, const char * bullet);
+
/**
* Configure the text area to one line or back to normal
* @param obj pointer to a text area object
@@ -254,6 +262,13 @@ bool lv_textarea_get_cursor_click_pos(lv_obj_t * obj);
*/
bool lv_textarea_get_password_mode(const lv_obj_t * obj);
+/**
+ * Get the replacement characters to show in password mode
+ * @param obj pointer to a text area object
+ * @return pointer to the replacement text
+ */
+const char * lv_textarea_get_password_bullet(lv_obj_t * obj);
+
/**
* Get the one line configuration attribute
* @param obj pointer to a text area object
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 63e21b1d3..147c8c13a 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -97,7 +97,7 @@ set(LVGL_TEST_OPTIONS_16BIT
set(LVGL_TEST_OPTIONS_16BIT_SWAP
-DLV_COLOR_DEPTH=16
- -DLV_COLOR_16_SWAP=1
+ -DLV_COLOR_16_SWAP=1
-DLV_MEM_SIZE=65536
-DLV_DPI_DEF=40
-DLV_DRAW_COMPLEX=1
@@ -123,7 +123,7 @@ set(LVGL_TEST_OPTIONS_16BIT_SWAP
-DLV_USE_GIF=1
-DLV_USE_QRCODE=1
)
-
+
set(LVGL_TEST_OPTIONS_FULL_32BIT
-DLV_COLOR_DEPTH=32
-DLV_MEM_SIZE=8388608
@@ -181,16 +181,19 @@ set(LVGL_TEST_OPTIONS_FULL_32BIT
${LVGL_TEST_COMMON_EXAMPLE_OPTIONS}
-DLV_FONT_DEFAULT=&lv_font_montserrat_24
-DLV_USE_FS_STDIO=1
- -DLV_FS_STDIO_LETTER='A'
- -DLV_USE_FS_POSIX=1
+ -DLV_FS_STDIO_LETTER='A'
+ -DLV_USE_FS_POSIX=1
-DLV_FS_POSIX_LETTER='B'
-DLV_USE_PNG=1
-DLV_USE_BMP=1
-DLV_USE_SJPG=1
-DLV_USE_GIF=1
-DLV_USE_QRCODE=1
+ -DLV_USE_FRAGMENT=1
+ -DLV_USE_IMGFONT=1
+ -DLV_USE_MSG=1
)
-
+
set(LVGL_TEST_OPTIONS_TEST_COMMON
--coverage
-DLV_COLOR_DEPTH=32
@@ -227,6 +230,12 @@ set(LVGL_TEST_OPTIONS_TEST_COMMON
-DLV_USE_BIDI=1
-DLV_USE_ARABIC_PERSIAN_CHARS=1
-DLV_LABEL_TEXT_SELECTION=1
+ -DLV_USE_FS_STDIO=1
+ -DLV_FS_STDIO_LETTER='A'
+ -DLV_FS_STDIO_CACHE_SIZE=100
+ -DLV_USE_FS_POSIX=1
+ -DLV_FS_POSIX_LETTER='B'
+ -DLV_FS_POSIX_CACHE_SIZE=0
${LVGL_TEST_COMMON_EXAMPLE_OPTIONS}
-DLV_FONT_DEFAULT=&lv_font_montserrat_14
-Wno-unused-but-set-variable # unused variables are common in the dual-heap arrangement
@@ -274,7 +283,7 @@ set(COMPILE_OPTIONS
-pedantic-errors
-Wall
-Wclobbered
- -Wdeprecated
+ -Wdeprecated
-Wdouble-promotion
-Wempty-body
-Werror
@@ -359,7 +368,7 @@ foreach( test_case_fname ${TEST_CASE_FILES} )
target_compile_options(${test_name} PUBLIC ${LVGL_TESTFILE_COMPILE_OPTIONS})
add_test(
- NAME ${test_name}
+ NAME ${test_name}
WORKING_DIRECTORY ${LVGL_TEST_DIR}
COMMAND ${test_name})
endforeach( test_case_fname ${TEST_CASE_FILES} )
diff --git a/tests/README.md b/tests/README.md
index 373bebe3e..a7703b9b1 100644
--- a/tests/README.md
+++ b/tests/README.md
@@ -23,15 +23,15 @@ For full information on running tests run: `./tests/main.py --help`.
## Running automatically
-GitHub's CI automatically runs these tests on pushes and pull requests to `master` and `releasev8.*` branches.
+GitHub's CI automatically runs these tests on pushes and pull requests to `master` and `releasev8.*` branches.
## Directory structure
- `src` Source files of the tests
- `test_cases` The written tests,
- `test_runners` Generated automatically from the files in `test_cases`.
- - other miscellaneous files and folders
+ - other miscellaneous files and folders
- `ref_imgs` - Reference images for screenshot compare
-- `report` - Coverage report. Generated if the `report` flag was passed to `./main.py`
+- `report` - Coverage report. Generated if the `report` flag was passed to `./main.py`
- `unity` Source files of the test engine
## Add new tests
@@ -43,13 +43,13 @@ New test needs to be added into the `src/test_cases` folder. The name of the fil
See the list of asserts [here](https://github.com/ThrowTheSwitch/Unity/blob/master/docs/UnityAssertionsReference.md).
There are some custom, LVGL specific asserts:
-- `TEST_ASSERT_EQUAL_SCREENSHOT("image1.png")` Render the active screen and compare its content with an image in the `ref_imgs` folder.
-If the compare fails `lvgl/test_screenshot_error.h` is created with the content of the frame buffer as an image.
+- `TEST_ASSERT_EQUAL_SCREENSHOT("image1.png")` Render the active screen and compare its content with an image in the `ref_imgs` folder.
+If the compare fails `lvgl/test_screenshot_error.h` is created with the content of the frame buffer as an image.
To see the that image `#include "test_screenshot_error.h"` and call `test_screenshot_error_show();`.
- `TEST_ASSERT_EQUAL_COLOR(color1, color2)` Compare two colors.
### Adding new reference images
-The reference images can be taken by copy-pasting the test code in to LVGL simulator and saving the screen.
+The reference images can be taken by copy-pasting the test code in to LVGL simulator and saving the screen.
LVGL needs to
- 800x480 resolution
- 32 bit color depth
diff --git a/tests/main.py b/tests/main.py
index 654ba0e57..efdfbe6c4 100755
--- a/tests/main.py
+++ b/tests/main.py
@@ -123,7 +123,7 @@ def run_tests(options_name):
os.chdir(get_build_dir(options_name))
subprocess.check_call(
- ['ctest', '--parallel', str(os.cpu_count()), '--output-on-failure'])
+ ['ctest', '--timeout', '30', '--parallel', str(os.cpu_count()), '--output-on-failure'])
def generate_code_coverage_report():
@@ -164,7 +164,7 @@ def generate_code_coverage_report():
parser = argparse.ArgumentParser(
description='Build and/or run LVGL tests.', epilog=epilog)
parser.add_argument('--build-options', nargs=1,
- help='''the build option name to build or run. When
+ help='''the build option name to build or run. When
omitted all build configurations are used.
''')
parser.add_argument('--clean', action='store_true', default=False,
diff --git a/tests/makefile/Makefile b/tests/makefile/Makefile
new file mode 100644
index 000000000..486d1e12f
--- /dev/null
+++ b/tests/makefile/Makefile
@@ -0,0 +1,9 @@
+LVGL_DIR := $(CURDIR)/../..
+include ../../lvgl.mk
+
+CSRCS += test.c
+CFLAGS += -DLV_CONF_SKIP=1 -DLV_BUILD_TEST=1 -I$(LVGL_DIR)/..
+COBJS := $(patsubst %.c, %.o, $(CSRCS))
+
+test_file: $(COBJS)
+ $(CC) -o $@ $^
diff --git a/tests/makefile/test.c b/tests/makefile/test.c
new file mode 100644
index 000000000..e725ade6a
--- /dev/null
+++ b/tests/makefile/test.c
@@ -0,0 +1,9 @@
+#if LV_BUILD_TEST
+#include
+#include "lvgl/lvgl.h"
+
+int main(void) {
+ lv_init();
+ return 0;
+}
+#endif
diff --git a/tests/ref_imgs/table_1.png b/tests/ref_imgs/table_1.png
new file mode 100644
index 000000000..193e1327e
Binary files /dev/null and b/tests/ref_imgs/table_1.png differ
diff --git a/tests/src/lv_test_conf.h b/tests/src/lv_test_conf.h
index a1e855705..d47fe6389 100644
--- a/tests/src/lv_test_conf.h
+++ b/tests/src/lv_test_conf.h
@@ -6,6 +6,8 @@
#ifndef LV_TEST_CONF_H
#define LV_TEST_CONF_H
+#define LV_CONF_SUPPRESS_DEFINE_CHECK 1
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -18,6 +20,9 @@ extern "C" {
* DEFINES
*********************/
+void lv_test_assert_fail(void);
+#define LV_ASSERT_HANDLER lv_test_assert_fail();
+
/**********************
* TYPEDEFS
**********************/
diff --git a/tests/src/lv_test_indev.c b/tests/src/lv_test_indev.c
index ba3e3920b..1ac680895 100644
--- a/tests/src/lv_test_indev.c
+++ b/tests/src/lv_test_indev.c
@@ -15,7 +15,7 @@ static bool mouse_pressed;
static bool key_pressed;
static bool enc_pressed;
-void lv_test_mouse_read_cb(lv_indev_drv_t * drv, lv_indev_data_t * data)
+void lv_test_mouse_read_cb(lv_indev_drv_t * drv, lv_indev_data_t * data)
{
LV_UNUSED(drv);
data->point.x = x_act;
@@ -26,7 +26,7 @@ void lv_test_mouse_read_cb(lv_indev_drv_t * drv, lv_indev_data_t * data)
void lv_test_mouse_move_to(lv_coord_t x, lv_coord_t y)
{
x_act = x;
- y_act = y;
+ y_act = y;
}
void lv_test_mouse_move_by(lv_coord_t x, lv_coord_t y)
@@ -46,7 +46,7 @@ void lv_test_mouse_release(void)
}
void lv_test_mouse_click_at(lv_coord_t x, lv_coord_t y)
-{
+{
lv_test_mouse_release();
lv_test_indev_wait(50);
lv_test_mouse_move_to(x, y);
@@ -57,7 +57,7 @@ void lv_test_mouse_click_at(lv_coord_t x, lv_coord_t y)
}
-void lv_test_keypad_read_cb(lv_indev_drv_t * drv, lv_indev_data_t * data)
+void lv_test_keypad_read_cb(lv_indev_drv_t * drv, lv_indev_data_t * data)
{
LV_UNUSED(drv);
data->key = key_act;
@@ -86,7 +86,7 @@ void lv_test_key_hit(uint32_t k)
lv_test_indev_wait(50);
}
-void lv_test_encoder_read_cb(lv_indev_drv_t * drv, lv_indev_data_t * data)
+void lv_test_encoder_read_cb(lv_indev_drv_t * drv, lv_indev_data_t * data)
{
LV_UNUSED(drv);
data->enc_diff = diff_act;
diff --git a/tests/src/lv_test_indev.h b/tests/src/lv_test_indev.h
index 4a888996c..2a0508fda 100644
--- a/tests/src/lv_test_indev.h
+++ b/tests/src/lv_test_indev.h
@@ -23,15 +23,22 @@ void lv_test_key_press(uint32_t k);
void lv_test_key_release(void);
void lv_test_key_hit(uint32_t k);
-
+/* encoder read callback */
void lv_test_encoder_read_cb(lv_indev_drv_t * drv, lv_indev_data_t * data) ;
+/* Simulate encoder rotation, use positive parameter to rotate to the right
+ * and negative to rotate to the left */
void lv_test_encoder_add_diff(int32_t d);
+/* Same as lv_test_encoder_add_diff but with additional delay */
void lv_test_encoder_turn(int32_t d);
+/* Set encoder to pressed */
void lv_test_encoder_press(void);
+/* Set encoder to released */
void lv_test_encoder_release(void);
+/* Simulate release+press+release (including delays) */
void lv_test_encoder_click(void);
+/* Simulate delay */
void lv_test_indev_wait(uint32_t ms);
extern lv_indev_t * lv_test_mouse_indev;
diff --git a/tests/src/lv_test_init.c b/tests/src/lv_test_init.c
index f93fb7959..8c156022a 100644
--- a/tests/src/lv_test_init.c
+++ b/tests/src/lv_test_init.c
@@ -5,6 +5,7 @@
#include
#include
#include
+#include "../unity/unity.h"
#define HOR_RES 800
#define VER_RES 480
@@ -30,65 +31,6 @@ void lv_test_deinit(void)
lv_mem_deinit();
}
-static void * open_cb(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode)
-{
- (void) drv;
- (void) mode;
-
- FILE * fp = fopen(path, "rb"); // only reading is supported
-
- return fp;
-}
-
-static lv_fs_res_t close_cb(lv_fs_drv_t * drv, void * file_p)
-{
- (void) drv;
-
- fclose(file_p);
- return LV_FS_RES_OK;
-}
-
-static lv_fs_res_t read_cb(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br)
-{
- (void) drv;
-
- *br = fread(buf, 1, btr, file_p);
- return (*br <= 0) ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK;
-}
-
-static lv_fs_res_t seek_cb(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t w)
-{
- (void) drv;
-
- uint32_t w2;
- switch(w) {
- case LV_FS_SEEK_SET:
- w2 = SEEK_SET;
- break;
- case LV_FS_SEEK_CUR:
- w2 = SEEK_CUR;
- break;
- case LV_FS_SEEK_END:
- w2 = SEEK_END;
- break;
- default:
- w2 = SEEK_SET;
- }
-
- fseek (file_p, pos, w2);
-
- return LV_FS_RES_OK;
-}
-
-static lv_fs_res_t tell_cb(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p)
-{
- (void) drv;
-
- *pos_p = ftell(file_p);
-
- return LV_FS_RES_OK;
-}
-
static void hal_init(void)
{
static lv_disp_draw_buf_t draw_buf;
@@ -102,13 +44,13 @@ static void hal_init(void)
disp_drv.hor_res = HOR_RES;
disp_drv.ver_res = VER_RES;
lv_disp_drv_register(&disp_drv);
-
+
static lv_indev_drv_t indev_mouse_drv;
lv_indev_drv_init(&indev_mouse_drv);
indev_mouse_drv.type = LV_INDEV_TYPE_POINTER;
indev_mouse_drv.read_cb = lv_test_mouse_read_cb;
lv_test_mouse_indev = lv_indev_drv_register(&indev_mouse_drv);
-
+
static lv_indev_drv_t indev_keypad_drv;
lv_indev_drv_init(&indev_keypad_drv);
indev_keypad_drv.type = LV_INDEV_TYPE_KEYPAD;
@@ -120,19 +62,6 @@ static void hal_init(void)
indev_encoder_drv.type = LV_INDEV_TYPE_ENCODER;
indev_encoder_drv.read_cb = lv_test_encoder_read_cb;
lv_test_encoder_indev = lv_indev_drv_register(&indev_encoder_drv);
-
-
- static lv_fs_drv_t drv;
- lv_fs_drv_init(&drv); /*Basic initialization*/
-
- drv.letter = 'F'; /*An uppercase letter to identify the drive*/
- drv.open_cb = open_cb; /*Callback to open a file*/
- drv.close_cb = close_cb; /*Callback to close a file*/
- drv.read_cb = read_cb; /*Callback to read a file*/
- drv.seek_cb = seek_cb; /*Callback to seek in a file (Move cursor)*/
- drv.tell_cb = tell_cb; /*Callback to tell the cursor position*/
-
- lv_fs_drv_register(&drv); /*Finally register the drive*/
}
static void dummy_flush_cb(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
@@ -163,4 +92,9 @@ uint32_t custom_tick_get(void)
return time_ms;
}
+void lv_test_assert_fail(void)
+{
+ TEST_FAIL();
+}
+
#endif
diff --git a/tests/src/test_cases/test_arc.c b/tests/src/test_cases/test_arc.c
index 4c7543739..adb303774 100644
--- a/tests/src/test_cases/test_arc.c
+++ b/tests/src/test_cases/test_arc.c
@@ -15,8 +15,8 @@ void test_arc_should_update_angles_when_changing_to_symmetrical_mode(void);
void test_arc_should_update_angles_when_changing_to_symmetrical_mode_value_more_than_middle_range(void);
void test_arc_angles_when_reversed(void);
-static lv_obj_t *active_screen = NULL;
-static lv_obj_t *arc = NULL;
+static lv_obj_t * active_screen = NULL;
+static lv_obj_t * arc = NULL;
static uint32_t event_cnt;
static void dummy_event_cb(lv_event_t * e);
@@ -105,17 +105,17 @@ void test_arc_should_update_angles_when_changing_to_symmetrical_mode_value_more_
/* See #2522 for more information */
void test_arc_angles_when_reversed(void)
{
- uint16_t expected_start_angle = 36;
+ uint16_t expected_start_angle = 54;
uint16_t expected_end_angle = 90;
int16_t expected_value = 40;
- lv_obj_t *arcBlack;
+ lv_obj_t * arcBlack;
arcBlack = lv_arc_create(lv_scr_act());
lv_arc_set_mode(arcBlack, LV_ARC_MODE_REVERSE);
lv_arc_set_bg_angles(arcBlack, 0, 90);
-
+
lv_arc_set_value(arcBlack, expected_value);
TEST_ASSERT_EQUAL_UINT16(expected_start_angle, lv_arc_get_angle_start(arcBlack));
@@ -131,22 +131,22 @@ void test_arc_click_area_with_adv_hittest(void)
lv_obj_add_flag(arc, LV_OBJ_FLAG_ADV_HITTEST);
lv_obj_add_event_cb(arc, dummy_event_cb, LV_EVENT_VALUE_CHANGED, NULL);
lv_obj_set_ext_click_area(arc, 5);
-
+
/*No click detected at the middle*/
event_cnt = 0;
lv_test_mouse_click_at(50, 50);
TEST_ASSERT_EQUAL_UINT32(0, event_cnt);
-
+
/*No click close to the radius - bg_arc - ext_click_area*/
event_cnt = 0;
lv_test_mouse_click_at(83, 50);
TEST_ASSERT_EQUAL_UINT32(0, event_cnt);
-
+
/*Click on the radius - bg_arc - ext_click_area*/
event_cnt = 0;
lv_test_mouse_click_at(86, 50);
TEST_ASSERT_GREATER_THAN(0, event_cnt);
-
+
/*Click on the radius + ext_click_area*/
event_cnt = 0;
lv_test_mouse_click_at(104, 50);
@@ -158,10 +158,10 @@ void test_arc_click_area_with_adv_hittest(void)
TEST_ASSERT_EQUAL_UINT32(0, event_cnt);
}
-static void dummy_event_cb(lv_event_t * e)
+static void dummy_event_cb(lv_event_t * e)
{
- LV_UNUSED(e);
- event_cnt++;
+ LV_UNUSED(e);
+ event_cnt++;
}
#endif
diff --git a/tests/src/test_cases/test_bar.c b/tests/src/test_cases/test_bar.c
index 9dde698df..14eacbe04 100644
--- a/tests/src/test_cases/test_bar.c
+++ b/tests/src/test_cases/test_bar.c
@@ -5,8 +5,8 @@
#include "lv_test_indev.h"
-static lv_obj_t *active_screen = NULL;
-static lv_obj_t *bar = NULL;
+static lv_obj_t * active_screen = NULL;
+static lv_obj_t * bar = NULL;
void setUp(void)
{
@@ -67,7 +67,7 @@ void test_bar_should_update_indicator_right_coordinate_based_on_bar_value(void)
lv_test_indev_wait(50);
int32_t actual_coord = lv_area_get_width(&bar_ptr->indic_area);
-
+
/* Calculate bar indicator right coordinate, using rule of 3 */
lv_coord_t bar_max_value = lv_bar_get_max_value(bar);
lv_coord_t indicator_part_width = lv_obj_get_content_width(bar);
diff --git a/tests/src/test_cases/test_checkbox.c b/tests/src/test_cases/test_checkbox.c
index d265580d7..1d98570f0 100644
--- a/tests/src/test_cases/test_checkbox.c
+++ b/tests/src/test_cases/test_checkbox.c
@@ -12,16 +12,16 @@ void test_checkbox_should_have_default_text_when_created(void);
void test_checkbox_should_return_dinamically_allocated_text(void);
void test_checkbox_should_allocate_memory_for_static_text(void);
-static lv_obj_t *active_screen = NULL;
-static lv_obj_t *checkbox = NULL;
+static lv_obj_t * active_screen = NULL;
+static lv_obj_t * checkbox = NULL;
static volatile bool event_called = false;
-static void event_handler(lv_event_t *e)
+static void event_handler(lv_event_t * e)
{
lv_event_code_t code = lv_event_get_code(e);
- if (LV_EVENT_VALUE_CHANGED == code) {
+ if(LV_EVENT_VALUE_CHANGED == code) {
event_called = true;
}
}
@@ -38,20 +38,20 @@ void test_checkbox_should_call_event_handler_on_click_when_enabled(void)
{
active_screen = lv_scr_act();
checkbox = lv_checkbox_create(active_screen);
-
+
lv_obj_add_state(checkbox, LV_STATE_CHECKED);
lv_obj_add_event_cb(checkbox, event_handler, LV_EVENT_ALL, NULL);
lv_test_mouse_click_at(checkbox->coords.x1, checkbox->coords.y1);
TEST_ASSERT_TRUE(event_called);
-
+
event_called = false;
}
void test_checkbox_should_have_default_text_when_created(void)
{
- const char *default_text = "Check box";
+ const char * default_text = "Check box";
active_screen = lv_scr_act();
checkbox = lv_checkbox_create(active_screen);
@@ -62,7 +62,7 @@ void test_checkbox_should_have_default_text_when_created(void)
void test_checkbox_should_return_dinamically_allocated_text(void)
{
- const char *message = "Hello World!";
+ const char * message = "Hello World!";
active_screen = lv_scr_act();
checkbox = lv_checkbox_create(active_screen);
@@ -76,7 +76,7 @@ void test_checkbox_should_return_dinamically_allocated_text(void)
void test_checkbox_should_allocate_memory_for_static_text(void)
{
uint32_t initial_available_memory = 0;
- const char *static_text = "Keep me while you exist";
+ const char * static_text = "Keep me while you exist";
lv_mem_monitor_t m1;
lv_mem_monitor(&m1);
diff --git a/tests/src/test_cases/test_config.c b/tests/src/test_cases/test_config.c
index b995fc418..13672de5b 100644
--- a/tests/src/test_cases/test_config.c
+++ b/tests/src/test_cases/test_config.c
@@ -7,13 +7,13 @@ void test_config(void);
void test_config(void)
{
- TEST_ASSERT_EQUAL(130, LV_DPI_DEF);
- TEST_ASSERT_EQUAL(130, lv_disp_get_dpi(NULL));
- TEST_ASSERT_EQUAL(800, LV_HOR_RES);
- TEST_ASSERT_EQUAL(800, lv_disp_get_hor_res(NULL));
- TEST_ASSERT_EQUAL(480, LV_VER_RES);
- TEST_ASSERT_EQUAL(480, lv_disp_get_ver_res(NULL));
- TEST_ASSERT_EQUAL(32, LV_COLOR_DEPTH);
+ TEST_ASSERT_EQUAL(130, LV_DPI_DEF);
+ TEST_ASSERT_EQUAL(130, lv_disp_get_dpi(NULL));
+ TEST_ASSERT_EQUAL(800, LV_HOR_RES);
+ TEST_ASSERT_EQUAL(800, lv_disp_get_hor_res(NULL));
+ TEST_ASSERT_EQUAL(480, LV_VER_RES);
+ TEST_ASSERT_EQUAL(480, lv_disp_get_ver_res(NULL));
+ TEST_ASSERT_EQUAL(32, LV_COLOR_DEPTH);
}
#endif
diff --git a/tests/src/test_cases/test_demo_stress.c b/tests/src/test_cases/test_demo_stress.c
index b8e4a76a5..929ae3bf6 100644
--- a/tests/src/test_cases/test_demo_stress.c
+++ b/tests/src/test_cases/test_demo_stress.c
@@ -10,7 +10,7 @@
static void loop_through_stress_test(void)
{
#if LV_USE_DEMO_STRESS
- lv_test_indev_wait(LV_DEMO_STRESS_TIME_STEP*33); /* FIXME: remove magic number of states */
+ lv_test_indev_wait(LV_DEMO_STRESS_TIME_STEP * 33); /* FIXME: remove magic number of states */
#endif
}
void test_demo_stress(void)
diff --git a/tests/src/test_cases/test_dropdown.c b/tests/src/test_cases/test_dropdown.c
index 07a258693..a49cc1d53 100644
--- a/tests/src/test_cases/test_dropdown.c
+++ b/tests/src/test_cases/test_dropdown.c
@@ -16,411 +16,411 @@ void tearDown(void)
}
void test_dropdown_create_delete(void)
{
- lv_dropdown_create(lv_scr_act());
- TEST_ASSERT_EQUAL(2, lv_obj_get_child_cnt(lv_scr_act()));
-
- lv_obj_t * dd2 = lv_dropdown_create(lv_scr_act());
- lv_obj_set_pos(dd2, 200, 0);
- TEST_ASSERT_EQUAL(4, lv_obj_get_child_cnt(lv_scr_act()));
- TEST_ASSERT_FALSE(lv_dropdown_is_open(dd2));
- lv_dropdown_open(dd2);
- TEST_ASSERT_EQUAL(4, lv_obj_get_child_cnt(lv_scr_act()));
- TEST_ASSERT_TRUE(lv_dropdown_is_open(dd2));
- lv_dropdown_open(dd2); /*Try to open again*/
- TEST_ASSERT_EQUAL(4, lv_obj_get_child_cnt(lv_scr_act()));
-
- lv_obj_t * dd3 = lv_dropdown_create(lv_scr_act());
- lv_obj_set_pos(dd3, 400, 0);
- TEST_ASSERT_EQUAL(6, lv_obj_get_child_cnt(lv_scr_act()));
- lv_dropdown_open(dd3);
- TEST_ASSERT_EQUAL(6, lv_obj_get_child_cnt(lv_scr_act()));
- lv_dropdown_close(dd3);
- TEST_ASSERT_EQUAL(6, lv_obj_get_child_cnt(lv_scr_act()));
- lv_dropdown_close(dd3); /*Try to close again*/
- TEST_ASSERT_EQUAL(6, lv_obj_get_child_cnt(lv_scr_act()));
-
- lv_obj_del(dd2);
- TEST_ASSERT_EQUAL(4, lv_obj_get_child_cnt(lv_scr_act()));
-
- lv_obj_clean(lv_scr_act());
- TEST_ASSERT_EQUAL(0, lv_obj_get_child_cnt(lv_scr_act()));
+ lv_dropdown_create(lv_scr_act());
+ TEST_ASSERT_EQUAL(2, lv_obj_get_child_cnt(lv_scr_act()));
+
+ lv_obj_t * dd2 = lv_dropdown_create(lv_scr_act());
+ lv_obj_set_pos(dd2, 200, 0);
+ TEST_ASSERT_EQUAL(4, lv_obj_get_child_cnt(lv_scr_act()));
+ TEST_ASSERT_FALSE(lv_dropdown_is_open(dd2));
+ lv_dropdown_open(dd2);
+ TEST_ASSERT_EQUAL(4, lv_obj_get_child_cnt(lv_scr_act()));
+ TEST_ASSERT_TRUE(lv_dropdown_is_open(dd2));
+ lv_dropdown_open(dd2); /*Try to open again*/
+ TEST_ASSERT_EQUAL(4, lv_obj_get_child_cnt(lv_scr_act()));
+
+ lv_obj_t * dd3 = lv_dropdown_create(lv_scr_act());
+ lv_obj_set_pos(dd3, 400, 0);
+ TEST_ASSERT_EQUAL(6, lv_obj_get_child_cnt(lv_scr_act()));
+ lv_dropdown_open(dd3);
+ TEST_ASSERT_EQUAL(6, lv_obj_get_child_cnt(lv_scr_act()));
+ lv_dropdown_close(dd3);
+ TEST_ASSERT_EQUAL(6, lv_obj_get_child_cnt(lv_scr_act()));
+ lv_dropdown_close(dd3); /*Try to close again*/
+ TEST_ASSERT_EQUAL(6, lv_obj_get_child_cnt(lv_scr_act()));
+
+ lv_obj_del(dd2);
+ TEST_ASSERT_EQUAL(4, lv_obj_get_child_cnt(lv_scr_act()));
+
+ lv_obj_clean(lv_scr_act());
+ TEST_ASSERT_EQUAL(0, lv_obj_get_child_cnt(lv_scr_act()));
}
void test_dropdown_set_options(void)
{
- lv_mem_monitor_t m1;
- lv_mem_monitor(&m1);
-
- lv_obj_t * dd1 = lv_dropdown_create(lv_scr_act());
- TEST_ASSERT_EQUAL_STRING("Option 1\nOption 2\nOption 3", lv_dropdown_get_options(dd1));
- TEST_ASSERT_EQUAL(3, lv_dropdown_get_option_cnt(dd1));
-
- lv_dropdown_set_options(dd1, "a1\nb2\nc3\nd4\ne5\nf6");
- TEST_ASSERT_EQUAL_STRING("a1\nb2\nc3\nd4\ne5\nf6", lv_dropdown_get_options(dd1));
- TEST_ASSERT_EQUAL(6, lv_dropdown_get_option_cnt(dd1));
-
- lv_obj_set_width(dd1, 200);
- lv_dropdown_open(dd1);
- lv_obj_update_layout(dd1);
- TEST_ASSERT_EQUAL(200, lv_obj_get_width(lv_dropdown_get_list(dd1)));
-
- lv_dropdown_close(dd1);
-
- lv_dropdown_add_option(dd1, "x0", 0);
- TEST_ASSERT_EQUAL_STRING("x0\na1\nb2\nc3\nd4\ne5\nf6", lv_dropdown_get_options(dd1));
- TEST_ASSERT_EQUAL(7, lv_dropdown_get_option_cnt(dd1));
-
- lv_dropdown_add_option(dd1, "y0", 3);
- TEST_ASSERT_EQUAL_STRING("x0\na1\nb2\ny0\nc3\nd4\ne5\nf6", lv_dropdown_get_options(dd1));
- TEST_ASSERT_EQUAL(8, lv_dropdown_get_option_cnt(dd1));
-
- lv_dropdown_add_option(dd1, "z0", LV_DROPDOWN_POS_LAST);
- TEST_ASSERT_EQUAL_STRING("x0\na1\nb2\ny0\nc3\nd4\ne5\nf6\nz0", lv_dropdown_get_options(dd1));
- TEST_ASSERT_EQUAL(9, lv_dropdown_get_option_cnt(dd1));
-
- lv_dropdown_clear_options(dd1);
- TEST_ASSERT_EQUAL_STRING("", lv_dropdown_get_options(dd1));
- TEST_ASSERT_EQUAL(0, lv_dropdown_get_option_cnt(dd1));
-
- lv_dropdown_set_options(dd1, "o1\no2"); /*Just to add some content before lv_dropdown_set_options_static*/
-
- lv_dropdown_set_options_static(dd1, "a1\nb2\nc3\nd4\ne5\nf6");
- TEST_ASSERT_EQUAL_STRING("a1\nb2\nc3\nd4\ne5\nf6", lv_dropdown_get_options(dd1));
- TEST_ASSERT_EQUAL(6, lv_dropdown_get_option_cnt(dd1));
-
- lv_dropdown_add_option(dd1, "x0", 0);
- TEST_ASSERT_EQUAL_STRING("x0\na1\nb2\nc3\nd4\ne5\nf6", lv_dropdown_get_options(dd1));
- TEST_ASSERT_EQUAL(7, lv_dropdown_get_option_cnt(dd1));
-
- lv_dropdown_add_option(dd1, "y0", 3);
- TEST_ASSERT_EQUAL_STRING("x0\na1\nb2\ny0\nc3\nd4\ne5\nf6", lv_dropdown_get_options(dd1));
- TEST_ASSERT_EQUAL(8, lv_dropdown_get_option_cnt(dd1));
-
- lv_dropdown_add_option(dd1, "z0", LV_DROPDOWN_POS_LAST);
- TEST_ASSERT_EQUAL_STRING("x0\na1\nb2\ny0\nc3\nd4\ne5\nf6\nz0", lv_dropdown_get_options(dd1));
- TEST_ASSERT_EQUAL(9, lv_dropdown_get_option_cnt(dd1));
-
- lv_dropdown_clear_options(dd1);
- TEST_ASSERT_EQUAL_STRING("", lv_dropdown_get_options(dd1));
- TEST_ASSERT_EQUAL(0, lv_dropdown_get_option_cnt(dd1));
-
- lv_obj_del(dd1);
-
- lv_mem_monitor_t m2;
- lv_mem_monitor(&m2);
- TEST_ASSERT_UINT32_WITHIN(48, m1.free_size, m2.free_size);
+ lv_mem_monitor_t m1;
+ lv_mem_monitor(&m1);
+
+ lv_obj_t * dd1 = lv_dropdown_create(lv_scr_act());
+ TEST_ASSERT_EQUAL_STRING("Option 1\nOption 2\nOption 3", lv_dropdown_get_options(dd1));
+ TEST_ASSERT_EQUAL(3, lv_dropdown_get_option_cnt(dd1));
+
+ lv_dropdown_set_options(dd1, "a1\nb2\nc3\nd4\ne5\nf6");
+ TEST_ASSERT_EQUAL_STRING("a1\nb2\nc3\nd4\ne5\nf6", lv_dropdown_get_options(dd1));
+ TEST_ASSERT_EQUAL(6, lv_dropdown_get_option_cnt(dd1));
+
+ lv_obj_set_width(dd1, 200);
+ lv_dropdown_open(dd1);
+ lv_obj_update_layout(dd1);
+ TEST_ASSERT_EQUAL(200, lv_obj_get_width(lv_dropdown_get_list(dd1)));
+
+ lv_dropdown_close(dd1);
+
+ lv_dropdown_add_option(dd1, "x0", 0);
+ TEST_ASSERT_EQUAL_STRING("x0\na1\nb2\nc3\nd4\ne5\nf6", lv_dropdown_get_options(dd1));
+ TEST_ASSERT_EQUAL(7, lv_dropdown_get_option_cnt(dd1));
+
+ lv_dropdown_add_option(dd1, "y0", 3);
+ TEST_ASSERT_EQUAL_STRING("x0\na1\nb2\ny0\nc3\nd4\ne5\nf6", lv_dropdown_get_options(dd1));
+ TEST_ASSERT_EQUAL(8, lv_dropdown_get_option_cnt(dd1));
+
+ lv_dropdown_add_option(dd1, "z0", LV_DROPDOWN_POS_LAST);
+ TEST_ASSERT_EQUAL_STRING("x0\na1\nb2\ny0\nc3\nd4\ne5\nf6\nz0", lv_dropdown_get_options(dd1));
+ TEST_ASSERT_EQUAL(9, lv_dropdown_get_option_cnt(dd1));
+
+ lv_dropdown_clear_options(dd1);
+ TEST_ASSERT_EQUAL_STRING("", lv_dropdown_get_options(dd1));
+ TEST_ASSERT_EQUAL(0, lv_dropdown_get_option_cnt(dd1));
+
+ lv_dropdown_set_options(dd1, "o1\no2"); /*Just to add some content before lv_dropdown_set_options_static*/
+
+ lv_dropdown_set_options_static(dd1, "a1\nb2\nc3\nd4\ne5\nf6");
+ TEST_ASSERT_EQUAL_STRING("a1\nb2\nc3\nd4\ne5\nf6", lv_dropdown_get_options(dd1));
+ TEST_ASSERT_EQUAL(6, lv_dropdown_get_option_cnt(dd1));
+
+ lv_dropdown_add_option(dd1, "x0", 0);
+ TEST_ASSERT_EQUAL_STRING("x0\na1\nb2\nc3\nd4\ne5\nf6", lv_dropdown_get_options(dd1));
+ TEST_ASSERT_EQUAL(7, lv_dropdown_get_option_cnt(dd1));
+
+ lv_dropdown_add_option(dd1, "y0", 3);
+ TEST_ASSERT_EQUAL_STRING("x0\na1\nb2\ny0\nc3\nd4\ne5\nf6", lv_dropdown_get_options(dd1));
+ TEST_ASSERT_EQUAL(8, lv_dropdown_get_option_cnt(dd1));
+
+ lv_dropdown_add_option(dd1, "z0", LV_DROPDOWN_POS_LAST);
+ TEST_ASSERT_EQUAL_STRING("x0\na1\nb2\ny0\nc3\nd4\ne5\nf6\nz0", lv_dropdown_get_options(dd1));
+ TEST_ASSERT_EQUAL(9, lv_dropdown_get_option_cnt(dd1));
+
+ lv_dropdown_clear_options(dd1);
+ TEST_ASSERT_EQUAL_STRING("", lv_dropdown_get_options(dd1));
+ TEST_ASSERT_EQUAL(0, lv_dropdown_get_option_cnt(dd1));
+
+ lv_obj_del(dd1);
+
+ lv_mem_monitor_t m2;
+ lv_mem_monitor(&m2);
+ TEST_ASSERT_UINT32_WITHIN(48, m1.free_size, m2.free_size);
}
void test_dropdown_select(void)
{
- lv_obj_t * dd1 = lv_dropdown_create(lv_scr_act());
- lv_dropdown_set_selected(dd1, 2);
-
- TEST_ASSERT_EQUAL(2, lv_dropdown_get_selected(dd1));
-
- char buf[32];
- memset(buf, 0x00, sizeof(buf));
- lv_dropdown_get_selected_str(dd1, buf, sizeof(buf));
- TEST_ASSERT_EQUAL_STRING("Option 3", buf);
-
- memset(buf, 0x00, sizeof(buf));
- lv_dropdown_get_selected_str(dd1, buf, 4);
- TEST_ASSERT_EQUAL_STRING("Opt", buf);
-
- /*Out of range*/
- lv_dropdown_set_selected(dd1, 3);
- TEST_ASSERT_EQUAL(2, lv_dropdown_get_selected(dd1));
+ lv_obj_t * dd1 = lv_dropdown_create(lv_scr_act());
+ lv_dropdown_set_selected(dd1, 2);
+
+ TEST_ASSERT_EQUAL(2, lv_dropdown_get_selected(dd1));
+
+ char buf[32];
+ memset(buf, 0x00, sizeof(buf));
+ lv_dropdown_get_selected_str(dd1, buf, sizeof(buf));
+ TEST_ASSERT_EQUAL_STRING("Option 3", buf);
+
+ memset(buf, 0x00, sizeof(buf));
+ lv_dropdown_get_selected_str(dd1, buf, 4);
+ TEST_ASSERT_EQUAL_STRING("Opt", buf);
+
+ /*Out of range*/
+ lv_dropdown_set_selected(dd1, 3);
+ TEST_ASSERT_EQUAL(2, lv_dropdown_get_selected(dd1));
}
void test_dropdown_click(void)
{
- lv_obj_clean(lv_scr_act());
- lv_obj_t * dd1 = lv_dropdown_create(lv_scr_act());
- lv_obj_update_layout(dd1);
-
- TEST_ASSERT_FALSE(lv_dropdown_is_open(dd1));
- lv_test_mouse_click_at(dd1->coords.x1 + 5, dd1->coords.y1 + 5);
- TEST_ASSERT_TRUE(lv_dropdown_is_open(dd1));
-
- lv_obj_t * list = lv_dropdown_get_list(dd1);
- TEST_ASSERT_EQUAL(0, lv_dropdown_get_selected(dd1));
- lv_test_mouse_click_at(list->coords.x1 + 5, list->coords.y2 - 25);
- TEST_ASSERT_EQUAL(2, lv_dropdown_get_selected(dd1));
- TEST_ASSERT_FALSE(lv_dropdown_is_open(dd1));
+ lv_obj_clean(lv_scr_act());
+ lv_obj_t * dd1 = lv_dropdown_create(lv_scr_act());
+ lv_obj_update_layout(dd1);
+
+ TEST_ASSERT_FALSE(lv_dropdown_is_open(dd1));
+ lv_test_mouse_click_at(dd1->coords.x1 + 5, dd1->coords.y1 + 5);
+ TEST_ASSERT_TRUE(lv_dropdown_is_open(dd1));
+
+ lv_obj_t * list = lv_dropdown_get_list(dd1);
+ TEST_ASSERT_EQUAL(0, lv_dropdown_get_selected(dd1));
+ lv_test_mouse_click_at(list->coords.x1 + 5, list->coords.y2 - 25);
+ TEST_ASSERT_EQUAL(2, lv_dropdown_get_selected(dd1));
+ TEST_ASSERT_FALSE(lv_dropdown_is_open(dd1));
}
static uint32_t event_cnt;
-static void dd_event(lv_event_t * e)
+static void dd_event(lv_event_t * e)
{
- LV_UNUSED(e);
- event_cnt++;
+ LV_UNUSED(e);
+ event_cnt++;
}
void test_dropdown_keypad(void)
{
- lv_obj_clean(lv_scr_act());
-
- lv_group_t * g = lv_group_create();
- lv_indev_set_group(lv_test_keypad_indev, g);
-
- lv_obj_t * dd1 = lv_dropdown_create(lv_scr_act());
- lv_obj_set_pos(dd1, 20, 20);
- lv_dropdown_set_options(dd1, "1\n2\n3\n4\n5\n6\n7\n8");
- lv_group_add_obj(g, dd1);
- lv_obj_add_event_cb(dd1, dd_event, LV_EVENT_VALUE_CHANGED, NULL);
-
- lv_obj_t * dd2 = lv_dropdown_create(lv_scr_act());
- lv_obj_set_pos(dd2, 300, 20);
- lv_group_add_obj(g, dd2);
-
- event_cnt = 0;
-
- TEST_ASSERT_FALSE(lv_dropdown_is_open(dd1));
- TEST_ASSERT_FALSE(lv_dropdown_is_open(dd2));
- lv_test_key_hit(LV_KEY_ENTER);
- TEST_ASSERT_TRUE(lv_dropdown_is_open(dd1));
- TEST_ASSERT_FALSE(lv_dropdown_is_open(dd2));
-
- lv_test_key_hit(LV_KEY_DOWN);
- lv_test_key_hit(LV_KEY_RIGHT); /*Same as down*/
- lv_test_key_hit(LV_KEY_ENTER);
- TEST_ASSERT_FALSE(lv_dropdown_is_open(dd1));
- TEST_ASSERT_EQUAL(2, lv_dropdown_get_selected(dd1));
- TEST_ASSERT_EQUAL(1, event_cnt);
-
- lv_test_key_hit(LV_KEY_DOWN); /*Open the list too*/
- TEST_ASSERT_NOT_NULL(lv_dropdown_get_list(dd1));
- lv_test_key_hit(LV_KEY_DOWN);
- lv_test_key_hit(LV_KEY_ENTER);
- TEST_ASSERT_FALSE(lv_dropdown_is_open(dd1));
- TEST_ASSERT_EQUAL(3, lv_dropdown_get_selected(dd1));
- TEST_ASSERT_EQUAL(2, event_cnt);
-
- lv_test_key_hit(LV_KEY_RIGHT); /*Open the list too*/
- TEST_ASSERT_NOT_NULL(lv_dropdown_get_list(dd1));
- lv_test_key_hit(LV_KEY_RIGHT);
- lv_test_key_hit(LV_KEY_ENTER);
- TEST_ASSERT_FALSE(lv_dropdown_is_open(dd1));
- TEST_ASSERT_EQUAL(4, lv_dropdown_get_selected(dd1));
- TEST_ASSERT_EQUAL(3, event_cnt);
-
- lv_test_key_hit(LV_KEY_LEFT); /*Open the list too*/
- TEST_ASSERT_TRUE(lv_dropdown_is_open(dd1));
- lv_test_key_hit(LV_KEY_LEFT);
- lv_test_key_hit(LV_KEY_ENTER);
- TEST_ASSERT_FALSE(lv_dropdown_is_open(dd1));
- TEST_ASSERT_EQUAL(3, lv_dropdown_get_selected(dd1));
- TEST_ASSERT_EQUAL(4, event_cnt);
-
- lv_test_key_hit(LV_KEY_UP); /*Open the list too*/
- TEST_ASSERT_NOT_NULL(lv_dropdown_get_list(dd1));
- lv_test_key_hit(LV_KEY_UP);
- lv_test_key_hit(LV_KEY_ENTER);
- TEST_ASSERT_FALSE(lv_dropdown_is_open(dd1));
- TEST_ASSERT_EQUAL(2, lv_dropdown_get_selected(dd1));
- TEST_ASSERT_EQUAL(5, event_cnt);
-
- lv_test_key_hit(LV_KEY_UP);
- lv_test_key_hit(LV_KEY_UP);
- lv_test_key_hit(LV_KEY_UP);
- lv_test_key_hit(LV_KEY_UP);
- lv_test_key_hit(LV_KEY_ENTER);
- TEST_ASSERT_FALSE(lv_dropdown_is_open(dd1));
- TEST_ASSERT_EQUAL(0, lv_dropdown_get_selected(dd1));
- TEST_ASSERT_EQUAL(6, event_cnt);
-
- lv_test_key_hit(LV_KEY_DOWN);
- lv_test_key_hit(LV_KEY_DOWN);
- lv_test_key_hit(LV_KEY_DOWN);
- lv_test_key_hit(LV_KEY_DOWN);
- lv_test_key_hit(LV_KEY_DOWN);
- lv_test_key_hit(LV_KEY_DOWN);
- lv_test_key_hit(LV_KEY_DOWN);
- lv_test_key_hit(LV_KEY_DOWN);
- lv_test_key_hit(LV_KEY_DOWN);
- lv_test_key_hit(LV_KEY_ENTER);
- TEST_ASSERT_FALSE(lv_dropdown_is_open(dd1));
- TEST_ASSERT_EQUAL(7, lv_dropdown_get_selected(dd1));
- TEST_ASSERT_EQUAL(7, event_cnt);
-
- lv_test_key_hit(LV_KEY_ENTER);
- TEST_ASSERT_TRUE(lv_dropdown_is_open(dd1));
-
- lv_test_key_hit(LV_KEY_NEXT);
- TEST_ASSERT_FALSE(lv_dropdown_is_open(dd1));
- TEST_ASSERT_FALSE(lv_dropdown_is_open(dd2));
-
- lv_test_key_hit(LV_KEY_ENTER);
- TEST_ASSERT_FALSE(lv_dropdown_is_open(dd1));
- TEST_ASSERT_NOT_NULL(lv_dropdown_get_list(dd2));
-
- lv_indev_set_group(lv_test_keypad_indev, NULL);
- lv_group_del(g);
+ lv_obj_clean(lv_scr_act());
+
+ lv_group_t * g = lv_group_create();
+ lv_indev_set_group(lv_test_keypad_indev, g);
+
+ lv_obj_t * dd1 = lv_dropdown_create(lv_scr_act());
+ lv_obj_set_pos(dd1, 20, 20);
+ lv_dropdown_set_options(dd1, "1\n2\n3\n4\n5\n6\n7\n8");
+ lv_group_add_obj(g, dd1);
+ lv_obj_add_event_cb(dd1, dd_event, LV_EVENT_VALUE_CHANGED, NULL);
+
+ lv_obj_t * dd2 = lv_dropdown_create(lv_scr_act());
+ lv_obj_set_pos(dd2, 300, 20);
+ lv_group_add_obj(g, dd2);
+
+ event_cnt = 0;
+
+ TEST_ASSERT_FALSE(lv_dropdown_is_open(dd1));
+ TEST_ASSERT_FALSE(lv_dropdown_is_open(dd2));
+ lv_test_key_hit(LV_KEY_ENTER);
+ TEST_ASSERT_TRUE(lv_dropdown_is_open(dd1));
+ TEST_ASSERT_FALSE(lv_dropdown_is_open(dd2));
+
+ lv_test_key_hit(LV_KEY_DOWN);
+ lv_test_key_hit(LV_KEY_RIGHT); /*Same as down*/
+ lv_test_key_hit(LV_KEY_ENTER);
+ TEST_ASSERT_FALSE(lv_dropdown_is_open(dd1));
+ TEST_ASSERT_EQUAL(2, lv_dropdown_get_selected(dd1));
+ TEST_ASSERT_EQUAL(1, event_cnt);
+
+ lv_test_key_hit(LV_KEY_DOWN); /*Open the list too*/
+ TEST_ASSERT_NOT_NULL(lv_dropdown_get_list(dd1));
+ lv_test_key_hit(LV_KEY_DOWN);
+ lv_test_key_hit(LV_KEY_ENTER);
+ TEST_ASSERT_FALSE(lv_dropdown_is_open(dd1));
+ TEST_ASSERT_EQUAL(3, lv_dropdown_get_selected(dd1));
+ TEST_ASSERT_EQUAL(2, event_cnt);
+
+ lv_test_key_hit(LV_KEY_RIGHT); /*Open the list too*/
+ TEST_ASSERT_NOT_NULL(lv_dropdown_get_list(dd1));
+ lv_test_key_hit(LV_KEY_RIGHT);
+ lv_test_key_hit(LV_KEY_ENTER);
+ TEST_ASSERT_FALSE(lv_dropdown_is_open(dd1));
+ TEST_ASSERT_EQUAL(4, lv_dropdown_get_selected(dd1));
+ TEST_ASSERT_EQUAL(3, event_cnt);
+
+ lv_test_key_hit(LV_KEY_LEFT); /*Open the list too*/
+ TEST_ASSERT_TRUE(lv_dropdown_is_open(dd1));
+ lv_test_key_hit(LV_KEY_LEFT);
+ lv_test_key_hit(LV_KEY_ENTER);
+ TEST_ASSERT_FALSE(lv_dropdown_is_open(dd1));
+ TEST_ASSERT_EQUAL(3, lv_dropdown_get_selected(dd1));
+ TEST_ASSERT_EQUAL(4, event_cnt);
+
+ lv_test_key_hit(LV_KEY_UP); /*Open the list too*/
+ TEST_ASSERT_NOT_NULL(lv_dropdown_get_list(dd1));
+ lv_test_key_hit(LV_KEY_UP);
+ lv_test_key_hit(LV_KEY_ENTER);
+ TEST_ASSERT_FALSE(lv_dropdown_is_open(dd1));
+ TEST_ASSERT_EQUAL(2, lv_dropdown_get_selected(dd1));
+ TEST_ASSERT_EQUAL(5, event_cnt);
+
+ lv_test_key_hit(LV_KEY_UP);
+ lv_test_key_hit(LV_KEY_UP);
+ lv_test_key_hit(LV_KEY_UP);
+ lv_test_key_hit(LV_KEY_UP);
+ lv_test_key_hit(LV_KEY_ENTER);
+ TEST_ASSERT_FALSE(lv_dropdown_is_open(dd1));
+ TEST_ASSERT_EQUAL(0, lv_dropdown_get_selected(dd1));
+ TEST_ASSERT_EQUAL(6, event_cnt);
+
+ lv_test_key_hit(LV_KEY_DOWN);
+ lv_test_key_hit(LV_KEY_DOWN);
+ lv_test_key_hit(LV_KEY_DOWN);
+ lv_test_key_hit(LV_KEY_DOWN);
+ lv_test_key_hit(LV_KEY_DOWN);
+ lv_test_key_hit(LV_KEY_DOWN);
+ lv_test_key_hit(LV_KEY_DOWN);
+ lv_test_key_hit(LV_KEY_DOWN);
+ lv_test_key_hit(LV_KEY_DOWN);
+ lv_test_key_hit(LV_KEY_ENTER);
+ TEST_ASSERT_FALSE(lv_dropdown_is_open(dd1));
+ TEST_ASSERT_EQUAL(7, lv_dropdown_get_selected(dd1));
+ TEST_ASSERT_EQUAL(7, event_cnt);
+
+ lv_test_key_hit(LV_KEY_ENTER);
+ TEST_ASSERT_TRUE(lv_dropdown_is_open(dd1));
+
+ lv_test_key_hit(LV_KEY_NEXT);
+ TEST_ASSERT_FALSE(lv_dropdown_is_open(dd1));
+ TEST_ASSERT_FALSE(lv_dropdown_is_open(dd2));
+
+ lv_test_key_hit(LV_KEY_ENTER);
+ TEST_ASSERT_FALSE(lv_dropdown_is_open(dd1));
+ TEST_ASSERT_NOT_NULL(lv_dropdown_get_list(dd2));
+
+ lv_indev_set_group(lv_test_keypad_indev, NULL);
+ lv_group_del(g);
}
void test_dropdown_encoder(void)
{
- lv_obj_clean(lv_scr_act());
-
- lv_group_t * g = lv_group_create();
- lv_indev_set_group(lv_test_encoder_indev, g);
-
- lv_obj_t * dd1 = lv_dropdown_create(lv_scr_act());
- lv_obj_set_pos(dd1, 20, 20);
- lv_dropdown_set_options(dd1, "1\n2\n3\n4\n5\n6\n7\n8");
- lv_group_add_obj(g, dd1);
- lv_obj_add_event_cb(dd1, dd_event, LV_EVENT_VALUE_CHANGED, NULL);
-
- lv_obj_t * dd2 = lv_dropdown_create(lv_scr_act());
- lv_obj_set_pos(dd2, 300, 20);
- lv_group_add_obj(g, dd2);
-
- event_cnt = 0;
-
- TEST_ASSERT_FALSE(lv_dropdown_is_open(dd1));
- TEST_ASSERT_FALSE(lv_dropdown_is_open(dd2));
- lv_test_encoder_click();
- TEST_ASSERT_TRUE(lv_dropdown_is_open(dd1));
- TEST_ASSERT_FALSE(lv_dropdown_is_open(dd2));
-
- lv_test_encoder_turn(5);
- lv_test_encoder_click();
- TEST_ASSERT_FALSE(lv_dropdown_is_open(dd1));
- TEST_ASSERT_EQUAL(5, lv_dropdown_get_selected(dd1));
- TEST_ASSERT_EQUAL(1, event_cnt);
-
- lv_test_encoder_click();
- lv_test_encoder_turn(-1);
- lv_test_encoder_click();
- TEST_ASSERT_EQUAL(4, lv_dropdown_get_selected(dd1));
- TEST_ASSERT_EQUAL(2, event_cnt);
-
- lv_test_encoder_click();
- lv_test_encoder_turn(2);
- lv_test_encoder_press();
- lv_test_indev_wait(1000); //Long press
- lv_test_encoder_release();
- lv_test_indev_wait(50);
- TEST_ASSERT_FALSE(lv_dropdown_is_open(dd1));
- TEST_ASSERT_EQUAL(4, lv_dropdown_get_selected(dd1));
- TEST_ASSERT_EQUAL(2, event_cnt);
-
- lv_test_encoder_turn(1);
- lv_test_encoder_click();
- TEST_ASSERT_FALSE(lv_dropdown_is_open(dd1));
- TEST_ASSERT_TRUE(lv_dropdown_is_open(dd2));
-
- lv_indev_set_group(lv_test_encoder_indev, NULL);
- lv_group_del(g);
+ lv_obj_clean(lv_scr_act());
+
+ lv_group_t * g = lv_group_create();
+ lv_indev_set_group(lv_test_encoder_indev, g);
+
+ lv_obj_t * dd1 = lv_dropdown_create(lv_scr_act());
+ lv_obj_set_pos(dd1, 20, 20);
+ lv_dropdown_set_options(dd1, "1\n2\n3\n4\n5\n6\n7\n8");
+ lv_group_add_obj(g, dd1);
+ lv_obj_add_event_cb(dd1, dd_event, LV_EVENT_VALUE_CHANGED, NULL);
+
+ lv_obj_t * dd2 = lv_dropdown_create(lv_scr_act());
+ lv_obj_set_pos(dd2, 300, 20);
+ lv_group_add_obj(g, dd2);
+
+ event_cnt = 0;
+
+ TEST_ASSERT_FALSE(lv_dropdown_is_open(dd1));
+ TEST_ASSERT_FALSE(lv_dropdown_is_open(dd2));
+ lv_test_encoder_click();
+ TEST_ASSERT_TRUE(lv_dropdown_is_open(dd1));
+ TEST_ASSERT_FALSE(lv_dropdown_is_open(dd2));
+
+ lv_test_encoder_turn(5);
+ lv_test_encoder_click();
+ TEST_ASSERT_FALSE(lv_dropdown_is_open(dd1));
+ TEST_ASSERT_EQUAL(5, lv_dropdown_get_selected(dd1));
+ TEST_ASSERT_EQUAL(1, event_cnt);
+
+ lv_test_encoder_click();
+ lv_test_encoder_turn(-1);
+ lv_test_encoder_click();
+ TEST_ASSERT_EQUAL(4, lv_dropdown_get_selected(dd1));
+ TEST_ASSERT_EQUAL(2, event_cnt);
+
+ lv_test_encoder_click();
+ lv_test_encoder_turn(2);
+ lv_test_encoder_press();
+ lv_test_indev_wait(1000); //Long press
+ lv_test_encoder_release();
+ lv_test_indev_wait(50);
+ TEST_ASSERT_FALSE(lv_dropdown_is_open(dd1));
+ TEST_ASSERT_EQUAL(4, lv_dropdown_get_selected(dd1));
+ TEST_ASSERT_EQUAL(2, event_cnt);
+
+ lv_test_encoder_turn(1);
+ lv_test_encoder_click();
+ TEST_ASSERT_FALSE(lv_dropdown_is_open(dd1));
+ TEST_ASSERT_TRUE(lv_dropdown_is_open(dd2));
+
+ lv_indev_set_group(lv_test_encoder_indev, NULL);
+ lv_group_del(g);
}
void test_dropdown_render_1(void)
{
- lv_obj_clean(lv_scr_act());
-
- lv_obj_t * dd1 = lv_dropdown_create(lv_scr_act());
- lv_obj_set_pos(dd1, 10, 10);
- lv_dropdown_set_selected(dd1, 1);
-
- lv_obj_t * dd2 = lv_dropdown_create(lv_scr_act());
- lv_obj_set_pos(dd2, 200, 10);
- lv_obj_set_width(dd2, 200);
- lv_dropdown_set_selected(dd2, 2);
- lv_dropdown_open(dd2);
- TEST_ASSERT_TRUE(lv_dropdown_get_selected_highlight(dd2));
- lv_dropdown_set_selected_highlight(dd2, false);
- TEST_ASSERT_FALSE(lv_dropdown_get_selected_highlight(dd2));
-
- lv_obj_t * dd3 = lv_dropdown_create(lv_scr_act());
- lv_obj_set_style_pad_hor(dd3, 5, 0);
- lv_obj_set_style_pad_ver(dd3, 20, 0);
- lv_obj_set_pos(dd3, 500, 150);
- TEST_ASSERT_EQUAL_PTR(NULL, lv_dropdown_get_text(dd3));
- lv_dropdown_set_text(dd3, "A text");
- TEST_ASSERT_EQUAL_STRING("A text", lv_dropdown_get_text(dd3));
-
- lv_dropdown_set_selected(dd3, 2);
-
- TEST_ASSERT_EQUAL(LV_DIR_BOTTOM, lv_dropdown_get_dir(dd3));
- lv_dropdown_set_dir(dd3, LV_DIR_LEFT);
- TEST_ASSERT_EQUAL(LV_DIR_LEFT, lv_dropdown_get_dir(dd3));
-
- TEST_ASSERT_EQUAL_STRING(LV_SYMBOL_DOWN, lv_dropdown_get_symbol(dd3));
- lv_dropdown_set_symbol(dd3, LV_SYMBOL_LEFT);
- TEST_ASSERT_EQUAL_STRING(LV_SYMBOL_LEFT, lv_dropdown_get_symbol(dd3));
-
- lv_dropdown_set_options(dd3, "a0\na1\na2\na3\na4\na5\na6\na7\na8\na9\na10\na11\na12\na13\na14\na15\na16");
- lv_dropdown_open(dd3);
- lv_dropdown_set_selected(dd3, 3);
- lv_obj_t * list = lv_dropdown_get_list(dd3);
- lv_obj_set_style_text_line_space(list, 5, 0);
- lv_obj_set_style_bg_color(list, lv_color_hex3(0xf00), LV_PART_SELECTED | LV_STATE_CHECKED);
-
-
- TEST_ASSERT_EQUAL_SCREENSHOT("dropdown_1.png");
+ lv_obj_clean(lv_scr_act());
+
+ lv_obj_t * dd1 = lv_dropdown_create(lv_scr_act());
+ lv_obj_set_pos(dd1, 10, 10);
+ lv_dropdown_set_selected(dd1, 1);
+
+ lv_obj_t * dd2 = lv_dropdown_create(lv_scr_act());
+ lv_obj_set_pos(dd2, 200, 10);
+ lv_obj_set_width(dd2, 200);
+ lv_dropdown_set_selected(dd2, 2);
+ lv_dropdown_open(dd2);
+ TEST_ASSERT_TRUE(lv_dropdown_get_selected_highlight(dd2));
+ lv_dropdown_set_selected_highlight(dd2, false);
+ TEST_ASSERT_FALSE(lv_dropdown_get_selected_highlight(dd2));
+
+ lv_obj_t * dd3 = lv_dropdown_create(lv_scr_act());
+ lv_obj_set_style_pad_hor(dd3, 5, 0);
+ lv_obj_set_style_pad_ver(dd3, 20, 0);
+ lv_obj_set_pos(dd3, 500, 150);
+ TEST_ASSERT_EQUAL_PTR(NULL, lv_dropdown_get_text(dd3));
+ lv_dropdown_set_text(dd3, "A text");
+ TEST_ASSERT_EQUAL_STRING("A text", lv_dropdown_get_text(dd3));
+
+ lv_dropdown_set_selected(dd3, 2);
+
+ TEST_ASSERT_EQUAL(LV_DIR_BOTTOM, lv_dropdown_get_dir(dd3));
+ lv_dropdown_set_dir(dd3, LV_DIR_LEFT);
+ TEST_ASSERT_EQUAL(LV_DIR_LEFT, lv_dropdown_get_dir(dd3));
+
+ TEST_ASSERT_EQUAL_STRING(LV_SYMBOL_DOWN, lv_dropdown_get_symbol(dd3));
+ lv_dropdown_set_symbol(dd3, LV_SYMBOL_LEFT);
+ TEST_ASSERT_EQUAL_STRING(LV_SYMBOL_LEFT, lv_dropdown_get_symbol(dd3));
+
+ lv_dropdown_set_options(dd3, "a0\na1\na2\na3\na4\na5\na6\na7\na8\na9\na10\na11\na12\na13\na14\na15\na16");
+ lv_dropdown_open(dd3);
+ lv_dropdown_set_selected(dd3, 3);
+ lv_obj_t * list = lv_dropdown_get_list(dd3);
+ lv_obj_set_style_text_line_space(list, 5, 0);
+ lv_obj_set_style_bg_color(list, lv_color_hex3(0xf00), LV_PART_SELECTED | LV_STATE_CHECKED);
+
+
+ TEST_ASSERT_EQUAL_SCREENSHOT("dropdown_1.png");
}
void test_dropdown_render_2(void)
{
- lv_obj_clean(lv_scr_act());
- LV_IMG_DECLARE(img_caret_down);
- lv_obj_t * dd1 = lv_dropdown_create(lv_scr_act());
- lv_dropdown_set_text(dd1, "Short");
- lv_dropdown_set_options(dd1, "1\n2");
- lv_dropdown_set_symbol(dd1, &img_caret_down);
- lv_dropdown_open(dd1);
-
- lv_obj_t * dd2 = lv_dropdown_create(lv_scr_act());
- lv_dropdown_set_text(dd2, "Go Up");
- lv_dropdown_set_options(dd2, "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15");
- lv_dropdown_set_symbol(dd2, NULL);
- lv_obj_align(dd2, LV_ALIGN_LEFT_MID, 150, 50);
- lv_dropdown_open(dd2);
-
- lv_obj_t * dd3 = lv_dropdown_create(lv_scr_act());
- lv_dropdown_set_text(dd3, "Limit Down");
- lv_dropdown_set_options(dd3, "1aaaaaaaaaaaaaaaa\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15");
- lv_obj_align(dd3, LV_ALIGN_LEFT_MID, 300, -10);
- lv_dropdown_open(dd3);
-
- lv_obj_t * dd4 = lv_dropdown_create(lv_scr_act());
- lv_dropdown_set_text(dd4, "Limit Top");
- lv_dropdown_set_options(dd4, "1aaaaaaaaaaaaaaaa\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15");
- lv_obj_align(dd4, LV_ALIGN_LEFT_MID, 450, 10);
- lv_dropdown_set_dir(dd4, LV_DIR_TOP);
- lv_dropdown_set_symbol(dd4, LV_SYMBOL_UP);
- lv_dropdown_open(dd4);
-
- lv_obj_t * dd5 = lv_dropdown_create(lv_scr_act());
- lv_dropdown_set_text(dd5, "Go Down");
- lv_dropdown_set_options(dd5, "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15");
- lv_dropdown_set_dir(dd5, LV_DIR_TOP);
- lv_dropdown_set_symbol(dd5, LV_SYMBOL_UP);
- lv_obj_align(dd5, LV_ALIGN_LEFT_MID, 650, -200);
- lv_dropdown_open(dd5);
-
- lv_obj_t * dd6 = lv_dropdown_create(lv_scr_act());
- lv_dropdown_set_text(dd6, "Right");
- lv_dropdown_set_options(dd6, "1aaa\n2aa\n3aa");
- lv_dropdown_set_dir(dd6, LV_DIR_RIGHT);
- lv_dropdown_set_symbol(dd6, LV_SYMBOL_RIGHT);
- lv_obj_align(dd6, LV_ALIGN_BOTTOM_LEFT, 20, -20);
- lv_dropdown_open(dd6);
- lv_obj_set_style_text_align(lv_dropdown_get_list(dd6), LV_TEXT_ALIGN_RIGHT, 0);
-
- lv_obj_t * dd7 = lv_dropdown_create(lv_scr_act());
- lv_dropdown_set_text(dd7, "Left");
- lv_dropdown_set_options(dd7, "1aaa\n2\n3");
- lv_dropdown_set_dir(dd7, LV_DIR_LEFT);
- lv_dropdown_set_symbol(dd7, LV_SYMBOL_LEFT);
- lv_obj_align(dd7, LV_ALIGN_BOTTOM_RIGHT, -20, -20);
- lv_dropdown_open(dd7);
-
- TEST_ASSERT_EQUAL_SCREENSHOT("dropdown_2.png");
+ lv_obj_clean(lv_scr_act());
+ LV_IMG_DECLARE(img_caret_down);
+ lv_obj_t * dd1 = lv_dropdown_create(lv_scr_act());
+ lv_dropdown_set_text(dd1, "Short");
+ lv_dropdown_set_options(dd1, "1\n2");
+ lv_dropdown_set_symbol(dd1, &img_caret_down);
+ lv_dropdown_open(dd1);
+
+ lv_obj_t * dd2 = lv_dropdown_create(lv_scr_act());
+ lv_dropdown_set_text(dd2, "Go Up");
+ lv_dropdown_set_options(dd2, "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15");
+ lv_dropdown_set_symbol(dd2, NULL);
+ lv_obj_align(dd2, LV_ALIGN_LEFT_MID, 150, 50);
+ lv_dropdown_open(dd2);
+
+ lv_obj_t * dd3 = lv_dropdown_create(lv_scr_act());
+ lv_dropdown_set_text(dd3, "Limit Down");
+ lv_dropdown_set_options(dd3, "1aaaaaaaaaaaaaaaa\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15");
+ lv_obj_align(dd3, LV_ALIGN_LEFT_MID, 300, -10);
+ lv_dropdown_open(dd3);
+
+ lv_obj_t * dd4 = lv_dropdown_create(lv_scr_act());
+ lv_dropdown_set_text(dd4, "Limit Top");
+ lv_dropdown_set_options(dd4, "1aaaaaaaaaaaaaaaa\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15");
+ lv_obj_align(dd4, LV_ALIGN_LEFT_MID, 450, 10);
+ lv_dropdown_set_dir(dd4, LV_DIR_TOP);
+ lv_dropdown_set_symbol(dd4, LV_SYMBOL_UP);
+ lv_dropdown_open(dd4);
+
+ lv_obj_t * dd5 = lv_dropdown_create(lv_scr_act());
+ lv_dropdown_set_text(dd5, "Go Down");
+ lv_dropdown_set_options(dd5, "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15");
+ lv_dropdown_set_dir(dd5, LV_DIR_TOP);
+ lv_dropdown_set_symbol(dd5, LV_SYMBOL_UP);
+ lv_obj_align(dd5, LV_ALIGN_LEFT_MID, 650, -200);
+ lv_dropdown_open(dd5);
+
+ lv_obj_t * dd6 = lv_dropdown_create(lv_scr_act());
+ lv_dropdown_set_text(dd6, "Right");
+ lv_dropdown_set_options(dd6, "1aaa\n2aa\n3aa");
+ lv_dropdown_set_dir(dd6, LV_DIR_RIGHT);
+ lv_dropdown_set_symbol(dd6, LV_SYMBOL_RIGHT);
+ lv_obj_align(dd6, LV_ALIGN_BOTTOM_LEFT, 20, -20);
+ lv_dropdown_open(dd6);
+ lv_obj_set_style_text_align(lv_dropdown_get_list(dd6), LV_TEXT_ALIGN_RIGHT, 0);
+
+ lv_obj_t * dd7 = lv_dropdown_create(lv_scr_act());
+ lv_dropdown_set_text(dd7, "Left");
+ lv_dropdown_set_options(dd7, "1aaa\n2\n3");
+ lv_dropdown_set_dir(dd7, LV_DIR_LEFT);
+ lv_dropdown_set_symbol(dd7, LV_SYMBOL_LEFT);
+ lv_obj_align(dd7, LV_ALIGN_BOTTOM_RIGHT, -20, -20);
+ lv_dropdown_open(dd7);
+
+ TEST_ASSERT_EQUAL_SCREENSHOT("dropdown_2.png");
}
/* See #2893 */
diff --git a/tests/src/test_cases/test_event.c b/tests/src/test_cases/test_event.c
index e6af8ba8a..0ef4186d1 100644
--- a/tests/src/test_cases/test_event.c
+++ b/tests/src/test_cases/test_event.c
@@ -3,7 +3,7 @@
#include "unity/unity.h"
-static void event_object_deletion_cb(const lv_obj_class_t *cls, lv_event_t *e)
+static void event_object_deletion_cb(const lv_obj_class_t * cls, lv_event_t * e)
{
LV_UNUSED(cls);
if(lv_event_get_code(e) == LV_EVENT_VALUE_CHANGED) {
diff --git a/tests/src/test_cases/test_font_loader.c b/tests/src/test_cases/test_font_loader.c
index 20af18917..c1675bb8b 100644
--- a/tests/src/test_cases/test_font_loader.c
+++ b/tests/src/test_cases/test_font_loader.c
@@ -45,9 +45,23 @@ extern lv_font_t font_3;
void test_font_loader(void)
{
- lv_font_t * font_1_bin = lv_font_load("F:src/test_fonts/font_1.fnt");
- lv_font_t * font_2_bin = lv_font_load("F:src/test_fonts/font_2.fnt");
- lv_font_t * font_3_bin = lv_font_load("F:src/test_fonts/font_3.fnt");
+ /*Test with cahce ('A' has cache)*/
+ lv_font_t * font_1_bin = lv_font_load("A:src/test_fonts/font_1.fnt");
+ lv_font_t * font_2_bin = lv_font_load("A:src/test_fonts/font_2.fnt");
+ lv_font_t * font_3_bin = lv_font_load("A:src/test_fonts/font_3.fnt");
+
+ compare_fonts(&font_1, font_1_bin);
+ compare_fonts(&font_2, font_2_bin);
+ compare_fonts(&font_3, font_3_bin);
+
+ lv_font_free(font_1_bin);
+ lv_font_free(font_2_bin);
+ lv_font_free(font_3_bin);
+
+ /*Test with cahce ('B' has NO cache)*/
+ font_1_bin = lv_font_load("B:src/test_fonts/font_1.fnt");
+ font_2_bin = lv_font_load("B:src/test_fonts/font_2.fnt");
+ font_3_bin = lv_font_load("B:src/test_fonts/font_3.fnt");
compare_fonts(&font_1, font_1_bin);
compare_fonts(&font_2, font_2_bin);
@@ -63,10 +77,10 @@ static int compare_fonts(lv_font_t * f1, lv_font_t * f2)
TEST_ASSERT_NOT_NULL_MESSAGE(f1, "font not null");
TEST_ASSERT_NOT_NULL_MESSAGE(f2, "font not null");
-// Skip these test because -Wpedantic tells
-// ISO C forbids passing argument 1 of ‘lv_test_assert_ptr_eq’ between function pointer and ‘void *’
-// TEST_ASSERT_EQUAL_PTR_MESSAGE(f1->get_glyph_dsc, f2->get_glyph_dsc, "glyph_dsc");
-// TEST_ASSERT_EQUAL_PTR_MESSAGE(f1->get_glyph_bitmap, f2->get_glyph_bitmap, "glyph_bitmap");
+ // Skip these test because -Wpedantic tells
+ // ISO C forbids passing argument 1 of ‘TEST_ASSERT_EQUAL_PTR_MESSAGE’ between function pointer and ‘void *’
+ // TEST_ASSERT_EQUAL_PTR_MESSAGE(f1->get_glyph_dsc, f2->get_glyph_dsc, "glyph_dsc");
+ // TEST_ASSERT_EQUAL_PTR_MESSAGE(f1->get_glyph_bitmap, f2->get_glyph_bitmap, "glyph_bitmap");
TEST_ASSERT_EQUAL_INT_MESSAGE(f1->line_height, f2->line_height, "line_height");
TEST_ASSERT_EQUAL_INT_MESSAGE(f1->base_line, f2->base_line, "base_line");
@@ -96,10 +110,10 @@ static int compare_fonts(lv_font_t * f1, lv_font_t * f2)
TEST_ASSERT_TRUE_MESSAGE(cmaps1->unicode_list && cmaps2->unicode_list, "unicode_list");
TEST_ASSERT_EQUAL_UINT8_ARRAY_MESSAGE(
- (uint8_t *)cmaps1->unicode_list,
- (uint8_t *)cmaps2->unicode_list,
- sizeof(uint16_t) * cmaps1->list_length,
- "unicode_list");
+ (uint8_t *)cmaps1->unicode_list,
+ (uint8_t *)cmaps2->unicode_list,
+ sizeof(uint16_t) * cmaps1->list_length,
+ "unicode_list");
total_glyphs += cmaps1->list_length;
}
else {
@@ -119,45 +133,45 @@ static int compare_fonts(lv_font_t * f1, lv_font_t * f2)
}
// kern_dsc
- if (dsc1->kern_classes == 1 && dsc2->kern_classes == 1) {
+ if(dsc1->kern_classes == 1 && dsc2->kern_classes == 1) {
lv_font_fmt_txt_kern_classes_t * kern1 = (lv_font_fmt_txt_kern_classes_t *)dsc1->kern_dsc;
lv_font_fmt_txt_kern_classes_t * kern2 = (lv_font_fmt_txt_kern_classes_t *)dsc2->kern_dsc;
- if (kern1 != NULL && kern2 != NULL) {
+ if(kern1 != NULL && kern2 != NULL) {
TEST_ASSERT_EQUAL_INT_MESSAGE(kern1->right_class_cnt, kern2->right_class_cnt, "right_class_cnt");
TEST_ASSERT_EQUAL_INT_MESSAGE(kern1->left_class_cnt, kern2->left_class_cnt, "left_class_cnt");
TEST_ASSERT_EQUAL_UINT8_ARRAY_MESSAGE(
- (uint8_t *)kern1->left_class_mapping,
- (uint8_t *)kern2->left_class_mapping,
- kern1->left_class_cnt,
- "left_class_mapping");
+ (uint8_t *)kern1->left_class_mapping,
+ (uint8_t *)kern2->left_class_mapping,
+ kern1->left_class_cnt,
+ "left_class_mapping");
TEST_ASSERT_EQUAL_UINT8_ARRAY_MESSAGE(
- (uint8_t *)kern1->right_class_mapping,
- (uint8_t *)kern2->right_class_mapping,
- kern1->right_class_cnt,
- "right_class_mapping");
+ (uint8_t *)kern1->right_class_mapping,
+ (uint8_t *)kern2->right_class_mapping,
+ kern1->right_class_cnt,
+ "right_class_mapping");
TEST_ASSERT_EQUAL_UINT8_ARRAY_MESSAGE(
- (uint8_t *)kern1->class_pair_values,
- (uint8_t *)kern2->class_pair_values,
- kern1->right_class_cnt * kern1->left_class_cnt,
- "class_pair_values");
+ (uint8_t *)kern1->class_pair_values,
+ (uint8_t *)kern2->class_pair_values,
+ kern1->right_class_cnt * kern1->left_class_cnt,
+ "class_pair_values");
}
else {
TEST_ASSERT_EQUAL_PTR_MESSAGE(kern1, kern2, "kern");
}
}
- else if (dsc1->kern_classes == 0 && dsc2->kern_classes == 0) {
+ else if(dsc1->kern_classes == 0 && dsc2->kern_classes == 0) {
lv_font_fmt_txt_kern_pair_t * kern1 = (lv_font_fmt_txt_kern_pair_t *)dsc1->kern_dsc;
lv_font_fmt_txt_kern_pair_t * kern2 = (lv_font_fmt_txt_kern_pair_t *)dsc2->kern_dsc;
- if (kern1 != NULL && kern2 != NULL) {
+ if(kern1 != NULL && kern2 != NULL) {
TEST_ASSERT_EQUAL_INT_MESSAGE(kern1->glyph_ids_size, kern2->glyph_ids_size, "glyph_ids_size");
TEST_ASSERT_EQUAL_INT_MESSAGE(kern1->pair_cnt, kern2->pair_cnt, "pair_cnt");
int ids_size;
- if (kern1->glyph_ids_size == 0) {
+ if(kern1->glyph_ids_size == 0) {
ids_size = sizeof(int8_t) * 2 * kern1->pair_cnt;
}
else {
@@ -166,10 +180,10 @@ static int compare_fonts(lv_font_t * f1, lv_font_t * f2)
TEST_ASSERT_EQUAL_UINT8_ARRAY_MESSAGE(kern1->glyph_ids, kern2->glyph_ids, ids_size, "glyph_ids");
TEST_ASSERT_EQUAL_UINT8_ARRAY_MESSAGE(
- (uint8_t * ) kern1->values,
- (uint8_t * ) kern2->values,
- kern1->pair_cnt,
- "glyph_values");
+ (uint8_t *) kern1->values,
+ (uint8_t *) kern2->values,
+ kern1->pair_cnt,
+ "glyph_values");
}
}
@@ -177,14 +191,14 @@ static int compare_fonts(lv_font_t * f1, lv_font_t * f2)
lv_font_fmt_txt_glyph_dsc_t * glyph_dsc2 = (lv_font_fmt_txt_glyph_dsc_t *)dsc2->glyph_dsc;
for(int i = 0; i < total_glyphs; ++i) {
- if (i < total_glyphs - 1) {
- int size1 = glyph_dsc1[i+1].bitmap_index - glyph_dsc1[i].bitmap_index;
+ if(i < total_glyphs - 1) {
+ int size1 = glyph_dsc1[i + 1].bitmap_index - glyph_dsc1[i].bitmap_index;
- if (size1 > 0) {
+ if(size1 > 0) {
TEST_ASSERT_EQUAL_UINT8_ARRAY_MESSAGE(
- dsc1->glyph_bitmap + glyph_dsc1[i].bitmap_index,
- dsc2->glyph_bitmap + glyph_dsc2[i].bitmap_index,
- size1 - 1, "glyph_bitmap");
+ dsc1->glyph_bitmap + glyph_dsc1[i].bitmap_index,
+ dsc2->glyph_bitmap + glyph_dsc2[i].bitmap_index,
+ size1 - 1, "glyph_bitmap");
}
}
TEST_ASSERT_EQUAL_INT_MESSAGE(glyph_dsc1[i].adv_w, glyph_dsc2[i].adv_w, "adv_w");
diff --git a/tests/src/test_cases/test_fs.c b/tests/src/test_cases/test_fs.c
new file mode 100644
index 000000000..7e31a96a8
--- /dev/null
+++ b/tests/src/test_cases/test_fs.c
@@ -0,0 +1,53 @@
+#if LV_BUILD_TEST
+#include "../lvgl.h"
+
+#include "unity/unity.h"
+
+
+const char * read_exp =
+ "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam sed maximus orci. Morbi massa nisi, varius eu convallis ac, venenatis at metus. In in nibh id urna pretium feugiat vitae eu libero. Ut eget fringilla eros. Nunc ullamcorper lectus mauris, vel rhoncus velit volutpat et. Phasellus sed molestie massa. Maecenas quis dui sollicitudin, vulputate nunc ut, dictum quam. Nam a congue lorem. Nulla non facilisis sapien. Ut luctus nulla nibh, sed finibus urna porta non. Duis aliquet augue id urna euismod auctor. Integer pellentesque vulputate enim non mattis. Donec finibus mattis dolor, et feugiat nisi pharetra porta. Mauris ullamcorper cursus magna. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.";
+
+void setUp(void)
+{
+ /* Function run before every test */
+}
+
+void tearDown(void)
+{
+ /* Function run after every test */
+}
+#include
+void test_read(void)
+{
+ lv_fs_res_t res;
+
+ /*'A' has cache*/
+ lv_fs_file_t fa;
+ res = lv_fs_open(&fa, "A:src/test_files/readtest.txt", LV_FS_MODE_RD);
+ TEST_ASSERT_EQUAL(LV_FS_RES_OK, res);
+
+ /*'B' has no cache*/
+ lv_fs_file_t fb;
+ res = lv_fs_open(&fb, "B:src/test_files/readtest.txt", LV_FS_MODE_RD);
+ TEST_ASSERT_EQUAL(LV_FS_RES_OK, res);
+
+ /*Use an odd size to make sure it's not aligned with the drivier's'cache size*/
+ uint8_t buf[79];
+ uint32_t cnt = 0;
+ uint32_t br = 1;
+ while(br) {
+ res = lv_fs_read(&fa, buf, sizeof(buf), &br);
+ TEST_ASSERT_EQUAL(LV_FS_RES_OK, res);
+ TEST_ASSERT_TRUE(memcmp(buf, read_exp + cnt, br) == 0);
+
+ res = lv_fs_read(&fb, buf, sizeof(buf), &br);
+ TEST_ASSERT_EQUAL(LV_FS_RES_OK, res);
+ TEST_ASSERT_TRUE(memcmp(buf, read_exp + cnt, br) == 0);
+ cnt += br;
+ }
+
+ lv_fs_close(&fa);
+ lv_fs_close(&fb);
+}
+
+#endif
diff --git a/tests/src/test_cases/test_line.c b/tests/src/test_cases/test_line.c
new file mode 100644
index 000000000..e2f781d4e
--- /dev/null
+++ b/tests/src/test_cases/test_line.c
@@ -0,0 +1,95 @@
+#if LV_BUILD_TEST
+#include "../lvgl.h"
+
+#include "unity/unity.h"
+
+static lv_obj_t * active_screen = NULL;
+static lv_obj_t * line = NULL;
+
+static const uint16_t default_point_num = 0U;
+static const lv_coord_t initial_extra_draw_size = 5U;
+static const lv_coord_t final_extra_draw_size = 10U;
+
+void setUp(void)
+{
+ active_screen = lv_scr_act();
+ line = lv_line_create(active_screen);
+}
+
+void tearDown(void)
+{
+ lv_obj_clean(active_screen);
+}
+
+void test_line_should_have_valid_documented_default_values(void)
+{
+ lv_line_t * line_ptr = (lv_line_t *) line;
+ TEST_ASSERT_EQUAL_UINT16(default_point_num, line_ptr->point_num);
+ TEST_ASSERT_NULL(line_ptr->point_array);
+ TEST_ASSERT_FALSE(lv_line_get_y_invert(line));
+ TEST_ASSERT_FALSE(lv_obj_has_flag(line, LV_OBJ_FLAG_CLICKABLE));
+ /* line doesn't have any points, so it's 0,0 in size */
+ TEST_ASSERT_EQUAL_UINT16(0U, lv_obj_get_self_width(line));
+ TEST_ASSERT_EQUAL_UINT16(0U, lv_obj_get_self_height(line));
+}
+
+void test_line_should_return_valid_y_invert(void)
+{
+ lv_line_set_y_invert(line, true);
+ TEST_ASSERT_TRUE(lv_line_get_y_invert(line));
+}
+
+void test_line_size_should_be_updated_after_adding_points(void)
+{
+ static lv_point_t points[] = { {5, 5} };
+ uint16_t point_cnt = (uint16_t) sizeof(points) / sizeof(lv_point_t);
+ lv_line_set_points(line, points, point_cnt);
+
+ lv_coord_t calculated_width = 0;
+ lv_coord_t calculated_height = 0;
+
+ /* Get the biggest coordinate on both axis */
+ uint16_t point_idx = 0;
+ for(point_idx = 0; point_idx < point_cnt; point_idx++) {
+ calculated_width = LV_MAX(points[point_idx].x, calculated_width);
+ calculated_height = LV_MAX(points[point_idx].y, calculated_height);
+ }
+ /* Add style line width */
+ lv_coord_t line_width = lv_obj_get_style_line_width(line, LV_PART_MAIN);
+ calculated_width += line_width;
+ calculated_height += line_width;
+
+ TEST_ASSERT_EQUAL_UINT16(calculated_width, lv_obj_get_self_width(line));
+ TEST_ASSERT_EQUAL_UINT16(calculated_height, lv_obj_get_self_height(line));
+}
+
+static void line_event_cb(lv_event_t * e)
+{
+ lv_event_code_t code = lv_event_get_code(e);
+
+ if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) {
+ /* Set the new line extra draw size */
+ lv_event_set_ext_draw_size(e, initial_extra_draw_size);
+ }
+}
+
+void test_line_should_update_extra_draw_size_based_on_style(void)
+{
+ /* Setup an event handler for line extra draw size event */
+ lv_obj_add_event_cb(line, line_event_cb, LV_EVENT_ALL, NULL);
+ /* Trigger the extra draw size event */
+ lv_obj_refresh_ext_draw_size(line);
+
+ TEST_ASSERT_EQUAL(initial_extra_draw_size, _lv_obj_get_ext_draw_size(line));
+
+ /* Update line width style, the event handler should set the extra draw size
+ * to the line width */
+ lv_obj_set_style_line_width(line, final_extra_draw_size, LV_PART_MAIN);
+
+ /* Trigger the extra draw size event */
+ lv_obj_refresh_ext_draw_size(line);
+
+ TEST_ASSERT_EQUAL(final_extra_draw_size, _lv_obj_get_ext_draw_size(line));
+}
+
+#endif
diff --git a/tests/src/test_cases/test_mem.c b/tests/src/test_cases/test_mem.c
new file mode 100644
index 000000000..c97e2719f
--- /dev/null
+++ b/tests/src/test_cases/test_mem.c
@@ -0,0 +1,26 @@
+#if LV_BUILD_TEST
+#include "../lvgl.h"
+
+#include "unity/unity.h"
+
+void setUp(void)
+{
+ /* Function run before every test */
+}
+
+void tearDown(void)
+{
+ /* Function run after every test */
+}
+
+/* #3324 */
+void test_mem_buf_realloc(void)
+{
+#if LV_MEM_CUSTOM == 0
+ void * buf1 = lv_mem_alloc(20);
+ void * buf2 = lv_mem_realloc(buf1, LV_MEM_SIZE + 16384);
+ TEST_ASSERT_NULL(buf2);
+#endif
+}
+
+#endif
diff --git a/tests/src/test_cases/test_obj_tree.c b/tests/src/test_cases/test_obj_tree.c
index f5eb0a410..73bdb0f13 100644
--- a/tests/src/test_cases/test_obj_tree.c
+++ b/tests/src/test_cases/test_obj_tree.c
@@ -8,32 +8,32 @@ void test_obj_tree_2(void);
void test_obj_tree_1(void)
{
- TEST_ASSERT_EQUAL(lv_obj_get_child_cnt(lv_scr_act()), 0);
+ TEST_ASSERT_EQUAL(lv_obj_get_child_cnt(lv_scr_act()), 0);
}
void test_obj_tree_2(void)
{
- lv_obj_create(lv_scr_act());
- lv_obj_t * o2 = lv_obj_create(lv_scr_act());
- lv_obj_create(lv_scr_act());
- TEST_ASSERT_EQUAL(lv_obj_get_child_cnt(lv_scr_act()), 3);
-
- lv_obj_del(o2);
- TEST_ASSERT_EQUAL(lv_obj_get_child_cnt(lv_scr_act()), 2);
-
- lv_obj_clean(lv_scr_act());
- TEST_ASSERT_EQUAL(lv_obj_get_child_cnt(lv_scr_act()), 0);
-
- lv_color_t c1 = lv_color_hex(0x444444);
- lv_color_t c2 = lv_color_hex3(0x444);
- TEST_ASSERT_EQUAL_COLOR(c1, c2);
-
- lv_obj_remove_style_all(lv_scr_act());
- lv_obj_set_style_bg_color(lv_scr_act(), lv_color_hex(0x112233), 0);
- lv_obj_set_style_bg_opa(lv_scr_act(), LV_OPA_COVER, 0);
-
- //TEST_ASSERT_EQUAL_SCREENSHOT("scr1.png")
+ lv_obj_create(lv_scr_act());
+ lv_obj_t * o2 = lv_obj_create(lv_scr_act());
+ lv_obj_create(lv_scr_act());
+ TEST_ASSERT_EQUAL(lv_obj_get_child_cnt(lv_scr_act()), 3);
+
+ lv_obj_del(o2);
+ TEST_ASSERT_EQUAL(lv_obj_get_child_cnt(lv_scr_act()), 2);
+
+ lv_obj_clean(lv_scr_act());
+ TEST_ASSERT_EQUAL(lv_obj_get_child_cnt(lv_scr_act()), 0);
+
+ lv_color_t c1 = lv_color_hex(0x444444);
+ lv_color_t c2 = lv_color_hex3(0x444);
+ TEST_ASSERT_EQUAL_COLOR(c1, c2);
+
+ lv_obj_remove_style_all(lv_scr_act());
+ lv_obj_set_style_bg_color(lv_scr_act(), lv_color_hex(0x112233), 0);
+ lv_obj_set_style_bg_opa(lv_scr_act(), LV_OPA_COVER, 0);
+
+ //TEST_ASSERT_EQUAL_SCREENSHOT("scr1.png")
}
#endif
diff --git a/tests/src/test_cases/test_slider.c b/tests/src/test_cases/test_slider.c
new file mode 100644
index 000000000..2fe88245d
--- /dev/null
+++ b/tests/src/test_cases/test_slider.c
@@ -0,0 +1,214 @@
+#if LV_BUILD_TEST
+#include "../lvgl.h"
+
+#include "unity/unity.h"
+#include "lv_test_indev.h"
+
+static lv_obj_t * active_screen = NULL;
+static lv_obj_t * slider = NULL;
+static lv_obj_t * sliderRangeMode = NULL;
+static lv_obj_t * sliderNormalMode = NULL;
+static lv_obj_t * sliderSymmetricalMode = NULL;
+static lv_group_t * g = NULL;
+
+void setUp(void)
+{
+ active_screen = lv_scr_act();
+ slider = lv_slider_create(active_screen);
+ sliderRangeMode = lv_slider_create(active_screen);
+ sliderNormalMode = lv_slider_create(active_screen);
+ sliderSymmetricalMode = lv_slider_create(active_screen);
+
+ lv_slider_set_mode(sliderRangeMode, LV_SLIDER_MODE_RANGE);
+ lv_slider_set_mode(sliderNormalMode, LV_SLIDER_MODE_NORMAL);
+ lv_slider_set_mode(sliderSymmetricalMode, LV_SLIDER_MODE_SYMMETRICAL);
+
+ g = lv_group_create();
+ lv_indev_set_group(lv_test_encoder_indev, g);
+}
+
+void tearDown(void)
+{
+ lv_obj_clean(active_screen);
+}
+
+void test_textarea_should_have_valid_documented_default_values(void)
+{
+ lv_coord_t objw = lv_obj_get_width(slider);
+ lv_coord_t objh = lv_obj_get_height(slider);
+
+ /* Horizontal slider */
+ TEST_ASSERT_TRUE(objw >= objh);
+ TEST_ASSERT_FALSE(lv_obj_has_flag(slider, LV_OBJ_FLAG_SCROLL_CHAIN));
+ TEST_ASSERT_FALSE(lv_obj_has_flag(slider, LV_OBJ_FLAG_SCROLLABLE));
+}
+
+void test_slider_event_keys_right_and_up_increment_value_by_one(void)
+{
+ char key = LV_KEY_RIGHT;
+ lv_slider_set_value(slider, 10, LV_ANIM_OFF);
+ int32_t value = lv_slider_get_value(slider);
+
+ lv_event_send(slider, LV_EVENT_KEY, (void *) &key);
+
+ int32_t new_value = lv_slider_get_value(slider);
+ TEST_ASSERT_EQUAL_INT32(value + 1, new_value);
+
+ key = LV_KEY_UP;
+ lv_event_send(slider, LV_EVENT_KEY, (void *) &key);
+ TEST_ASSERT_EQUAL_INT32(new_value + 1, lv_slider_get_value(slider));
+}
+
+void test_slider_event_keys_left_and_down_decrement_value_by_one(void)
+{
+ char key = LV_KEY_LEFT;
+ lv_slider_set_value(slider, 10, LV_ANIM_OFF);
+ int32_t value = lv_slider_get_value(slider);
+
+ lv_event_send(slider, LV_EVENT_KEY, (void *) &key);
+
+ int32_t new_value = lv_slider_get_value(slider);
+ TEST_ASSERT_EQUAL_INT32(value - 1, new_value);
+
+ key = LV_KEY_DOWN;
+ lv_event_send(slider, LV_EVENT_KEY, (void *) &key);
+ TEST_ASSERT_EQUAL_INT32(new_value - 1, lv_slider_get_value(slider));
+}
+
+void test_slider_event_invalid_key_should_not_change_values(void)
+{
+ char key = LV_KEY_ENTER;
+ lv_slider_set_value(slider, 10, LV_ANIM_OFF);
+ int32_t value = lv_slider_get_value(slider);
+
+ lv_event_send(slider, LV_EVENT_KEY, (void *) &key);
+
+ TEST_ASSERT_EQUAL_INT32(value, lv_slider_get_value(slider));
+}
+
+void test_slider_range_mode_should_leave_edit_mode_if_released(void)
+{
+ lv_slider_t * ptr = (lv_slider_t *) sliderRangeMode;
+
+ /* Setup group and encoder indev */
+ lv_group_add_obj(g, sliderNormalMode);
+ lv_group_set_editing(g, true);
+
+ lv_test_encoder_click();
+
+ /* Always executed when handling LV_EVENT_RELEASED or
+ * LV_EVENT_PRESS_LOST */
+ TEST_ASSERT_FALSE(ptr->dragging);
+ TEST_ASSERT_NULL(ptr->value_to_set);
+ TEST_ASSERT_EQUAL(0U, ptr->left_knob_focus);
+
+ /* Group leaved edit mode */
+ TEST_ASSERT_FALSE(lv_group_get_editing(g));
+}
+
+void test_slider_range_mode_should_not_leave_edit_mode_if_released_with_no_left_knob_focus(void)
+{
+ lv_slider_t * ptr = (lv_slider_t *) sliderRangeMode;
+
+ /* Setup group and encoder indev */
+ lv_group_add_obj(g, sliderRangeMode);
+ lv_group_set_editing(g, true);
+
+ lv_test_encoder_release();
+ lv_test_indev_wait(50);
+
+ /* Always executed when handling LV_EVENT_RELEASED or
+ * LV_EVENT_PRESS_LOST */
+ TEST_ASSERT_FALSE(ptr->dragging);
+ TEST_ASSERT_NULL(ptr->value_to_set);
+
+ TEST_ASSERT(lv_group_get_editing(g));
+}
+
+void test_slider_normal_mode_should_leave_edit_mode_if_released(void)
+{
+ lv_slider_t * ptr = (lv_slider_t *) sliderNormalMode;
+ ptr->left_knob_focus = 1;
+
+ /* Setup group and encoder indev */
+ lv_group_add_obj(g, sliderNormalMode);
+ lv_group_set_editing(g, true);
+
+ lv_test_encoder_click();
+
+ /* Always executed when handling LV_EVENT_RELEASED or
+ * LV_EVENT_PRESS_LOST */
+ TEST_ASSERT_FALSE(ptr->dragging);
+ TEST_ASSERT_NULL(ptr->value_to_set);
+ TEST_ASSERT_EQUAL(0U, ptr->left_knob_focus);
+
+ /* Group leaved edit mode */
+ TEST_ASSERT_FALSE(lv_group_get_editing(g));
+}
+
+void test_ranged_mode_adjust_with_encoder(void)
+{
+ lv_slider_set_value(sliderRangeMode, 90, LV_ANIM_OFF);
+ lv_slider_set_left_value(sliderRangeMode, 10, LV_ANIM_OFF);
+
+ /* Setup group and encoder indev */
+ lv_group_add_obj(g, sliderRangeMode);
+ lv_group_set_editing(g, false);
+
+ /*Go the edit mode*/
+ lv_test_encoder_click();
+
+ /*Adjust the right knob*/
+ lv_test_encoder_turn(-10);
+ TEST_ASSERT_EQUAL(80, lv_slider_get_value(sliderRangeMode)); /*Updated?*/
+ TEST_ASSERT_EQUAL(10, lv_slider_get_left_value(sliderRangeMode)); /*Maintained?*/
+
+ /*Focus the left knob*/
+ lv_test_encoder_click();
+
+ /*Adjust the left knob*/
+ lv_test_encoder_turn(5);
+ TEST_ASSERT_EQUAL(80, lv_slider_get_value(sliderRangeMode)); /*Maintained?*/
+ TEST_ASSERT_EQUAL(15, lv_slider_get_left_value(sliderRangeMode)); /*Updated?*/
+
+}
+
+void test_normal_mode_slider_hit_test(void)
+{
+ /* Validate if point 0,0 can click in the slider */
+ lv_point_t point = {
+ .x = 0,
+ .y = 0
+ };
+
+ lv_hit_test_info_t info = {
+ .res = false,
+ .point = &point
+ };
+
+ lv_slider_set_value(sliderNormalMode, 100, LV_ANIM_OFF);
+ lv_event_send(sliderNormalMode, LV_EVENT_HIT_TEST, (void *) &info);
+
+ /* point can click slider */
+ TEST_ASSERT(info.res);
+}
+
+void test_slider_range_event_hit_test(void)
+{
+ /* Validate if point 0,0 can click in the slider */
+ lv_point_t point = {
+ .x = 0,
+ .y = 0
+ };
+
+ lv_hit_test_info_t info = {
+ .res = false,
+ .point = &point
+ };
+ lv_event_send(sliderRangeMode, LV_EVENT_HIT_TEST, (void *) &info);
+
+ /* point can click slider in the left knob */
+ TEST_ASSERT(info.res);
+}
+
+#endif
diff --git a/tests/src/test_cases/test_snapshot.c b/tests/src/test_cases/test_snapshot.c
index 5ac10d6d4..0c87b310d 100644
--- a/tests/src/test_cases/test_snapshot.c
+++ b/tests/src/test_cases/test_snapshot.c
@@ -15,7 +15,7 @@ void test_snapshot_should_not_leak_memory(void)
uint32_t final_available_memory = 0;
lv_mem_monitor_t monitor;
- lv_img_dsc_t *snapshots[NUM_SNAPSHOTS] = {NULL};
+ lv_img_dsc_t * snapshots[NUM_SNAPSHOTS] = {NULL};
lv_mem_monitor(&monitor);
initial_available_memory = monitor.free_size;
@@ -24,11 +24,11 @@ void test_snapshot_should_not_leak_memory(void)
snapshots[idx] = lv_snapshot_take(lv_scr_act(), LV_IMG_CF_TRUE_COLOR_ALPHA);
TEST_ASSERT_NOT_NULL(snapshots[idx]);
}
-
+
for(idx = 0; idx < NUM_SNAPSHOTS; idx++) {
lv_snapshot_free(snapshots[idx]);
}
-
+
lv_mem_monitor(&monitor);
final_available_memory = monitor.free_size;
diff --git a/tests/src/test_cases/test_style.c b/tests/src/test_cases/test_style.c
index 4ad5ad2be..76c1724d1 100644
--- a/tests/src/test_cases/test_style.c
+++ b/tests/src/test_cases/test_style.c
@@ -40,4 +40,70 @@ void test_gradient_vertical_misalignment(void)
}
}
+void test_custom_prop_ids(void)
+{
+ uint8_t fake_flag = 0;
+ uint32_t initial_custom_props = lv_style_get_num_custom_props();
+ uint32_t max_props_to_register = 64;
+ for(uint32_t i = 0; i < max_props_to_register; i++) {
+ lv_style_prop_t prop = lv_style_register_prop(fake_flag);
+ /* Should have a higher index than the last built-in prop */
+ TEST_ASSERT_GREATER_THAN(_LV_STYLE_LAST_BUILT_IN_PROP, prop);
+ if(i == 0) {
+ /* Should be equal to the first expected index of a custom prop */
+ TEST_ASSERT_EQUAL(_LV_STYLE_NUM_BUILT_IN_PROPS + initial_custom_props, prop);
+ }
+ /*We should find our flags*/
+ TEST_ASSERT_EQUAL(fake_flag, _lv_style_prop_lookup_flags(prop));
+ if(fake_flag == 0xff)
+ fake_flag = 0;
+ else
+ fake_flag++;
+ }
+ TEST_ASSERT_EQUAL(initial_custom_props + max_props_to_register, lv_style_get_num_custom_props());
+ /*
+ * Check that the resizing algorithm works correctly, given that 64 props
+ * were registered + whatever's built-in. A failure here may just indicate
+ * that LVGL registers more built-in properties now and this needs adjustment.
+ */
+ extern uint32_t _lv_style_custom_prop_flag_lookup_table_size;
+ TEST_ASSERT_EQUAL(_lv_style_custom_prop_flag_lookup_table_size, 96);
+}
+
+void test_inherit_meta(void)
+{
+ lv_obj_t * parent = lv_obj_create(lv_scr_act());
+ lv_obj_t * child = lv_obj_create(parent);
+ lv_obj_t * grandchild = lv_label_create(child);
+ lv_obj_set_style_text_color(parent, lv_color_hex(0xff0000), LV_PART_MAIN);
+ lv_obj_set_local_style_prop_meta(child, LV_STYLE_TEXT_COLOR, LV_STYLE_PROP_META_INHERIT, LV_PART_MAIN);
+ TEST_ASSERT_EQUAL_HEX(lv_color_hex(0xff0000).full, lv_obj_get_style_text_color(grandchild, LV_PART_MAIN).full);
+}
+
+void test_id_meta_overrun(void)
+{
+ /* Test that property ID registration is blocked once the ID reaches into the meta bits */
+ lv_style_prop_t prop_id;
+ do {
+ prop_id = lv_style_register_prop(0);
+ if(prop_id != LV_STYLE_PROP_INV) {
+ TEST_ASSERT_EQUAL(0, prop_id & LV_STYLE_PROP_META_MASK);
+ }
+ } while(prop_id != LV_STYLE_PROP_INV);
+}
+
+void test_inherit_meta_with_lower_precedence_style(void)
+{
+ lv_obj_t * parent = lv_obj_create(lv_scr_act());
+ lv_obj_t * child = lv_obj_create(parent);
+ lv_obj_t * grandchild = lv_label_create(child);
+ lv_obj_set_style_text_color(parent, lv_color_hex(0xff0000), LV_PART_MAIN);
+ lv_style_t style;
+ lv_style_init(&style);
+ lv_style_set_text_color(&style, lv_color_hex(0xffffff));
+ lv_obj_set_local_style_prop_meta(child, LV_STYLE_TEXT_COLOR, LV_STYLE_PROP_META_INHERIT, LV_PART_MAIN);
+ lv_obj_add_style(child, &style, LV_PART_MAIN);
+ TEST_ASSERT_EQUAL_HEX(lv_color_hex(0xff0000).full, lv_obj_get_style_text_color(grandchild, LV_PART_MAIN).full);
+}
+
#endif
diff --git a/tests/src/test_cases/test_switch.c b/tests/src/test_cases/test_switch.c
index 07048ba8f..cfb4a1c29 100644
--- a/tests/src/test_cases/test_switch.c
+++ b/tests/src/test_cases/test_switch.c
@@ -9,8 +9,8 @@
#define SWITCHES_CNT 10
uint8_t value_changed_event_cnt = 0;
-lv_obj_t *scr = NULL;
-lv_obj_t *sw = NULL;
+lv_obj_t * scr = NULL;
+lv_obj_t * sw = NULL;
void setUp(void)
{
@@ -30,11 +30,11 @@ static void mouse_click_on_switch(void)
lv_test_mouse_click_at(sw->coords.x1, sw->coords.y1);
}
-static void event_handler(lv_event_t *e)
+static void event_handler(lv_event_t * e)
{
lv_event_code_t event = lv_event_get_code(e);
- if (LV_EVENT_VALUE_CHANGED == event) {
+ if(LV_EVENT_VALUE_CHANGED == event) {
value_changed_event_cnt++;
}
@@ -52,23 +52,23 @@ void test_switch_should_not_leak_memory_after_deletion(void)
uint32_t initial_available_memory = 0;
uint32_t final_available_memory = 0;
lv_mem_monitor_t monitor;
- lv_obj_t *switches[SWITCHES_CNT] = {NULL};
+ lv_obj_t * switches[SWITCHES_CNT] = {NULL};
lv_mem_monitor(&monitor);
initial_available_memory = monitor.free_size;
-
- for (idx = 0; idx < SWITCHES_CNT; idx++) {
+
+ for(idx = 0; idx < SWITCHES_CNT; idx++) {
switches[idx] = lv_switch_create(scr);
}
-
- for (idx = 0; idx < SWITCHES_CNT; idx++) {
+
+ for(idx = 0; idx < SWITCHES_CNT; idx++) {
lv_obj_del(switches[idx]);
}
-
+
lv_mem_monitor(&monitor);
final_available_memory = monitor.free_size;
- LV_HEAP_CHECK(TEST_ASSERT_LESS_THAN(initial_available_memory, final_available_memory));
+ LV_HEAP_CHECK(TEST_ASSERT_LESS_OR_EQUAL(initial_available_memory, final_available_memory));
}
void test_switch_animation(void)
diff --git a/tests/src/test_cases/test_table.c b/tests/src/test_cases/test_table.c
new file mode 100644
index 000000000..f563718fc
--- /dev/null
+++ b/tests/src/test_cases/test_table.c
@@ -0,0 +1,247 @@
+#if LV_BUILD_TEST
+#include "../lvgl.h"
+
+#include "unity/unity.h"
+
+static lv_obj_t * scr = NULL;
+static lv_obj_t * table = NULL;
+
+void setUp(void)
+{
+ scr = lv_scr_act();
+ table = lv_table_create(scr);
+}
+
+void tearDown(void)
+{
+ lv_obj_clean(lv_scr_act());
+}
+
+void test_table_should_return_assigned_cell_value(void)
+{
+ uint16_t row = 0;
+ uint16_t column = 0;
+ const char * value = "LVGL";
+
+ lv_table_set_cell_value(table, row, column, value);
+
+ TEST_ASSERT_EQUAL_STRING(value, lv_table_get_cell_value(table, row, column));
+}
+
+void test_table_should_grow_columns_automatically_when_setting_formatted_cell_value(void)
+{
+ /* Newly created tables have 1 column and 1 row */
+ uint16_t original_column_count = lv_table_get_col_cnt(table);
+ TEST_ASSERT_EQUAL_UINT16(1, original_column_count);
+
+ /* Table currently only has a cell at 0,0 (row, colum) */
+ lv_table_set_cell_value_fmt(table, 0, 1, "LVGL %s", "Rocks!");
+
+ /* Table now should have cells at 0,0 and 0,1, so 2 columns */
+ uint16_t expected_column_count = original_column_count + 1;
+ TEST_ASSERT_EQUAL_UINT16(expected_column_count, lv_table_get_col_cnt(table));
+}
+
+void test_table_should_identify_cell_with_ctrl(void)
+{
+ bool has_ctrl = false;
+
+ has_ctrl = lv_table_has_cell_ctrl(table, 0, 0, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
+
+ TEST_ASSERT_FALSE(has_ctrl);
+
+ lv_table_add_cell_ctrl(table, 0, 0, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
+ has_ctrl = lv_table_has_cell_ctrl(table, 0, 0, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
+ TEST_ASSERT_TRUE(has_ctrl);
+}
+
+void test_table_should_clear_selected_cell_ctrl(void)
+{
+ bool has_ctrl = false;
+
+ lv_table_add_cell_ctrl(table, 0, 0, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
+ has_ctrl = lv_table_has_cell_ctrl(table, 0, 0, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
+ TEST_ASSERT_TRUE(has_ctrl);
+
+ lv_table_clear_cell_ctrl(table, 0, 0, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
+ has_ctrl = lv_table_has_cell_ctrl(table, 0, 0, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
+ TEST_ASSERT_FALSE(has_ctrl);
+}
+
+void test_table_should_keep_not_selected_cell_ctrl(void)
+{
+ bool has_ctrl = false;
+
+ lv_table_add_cell_ctrl(table, 0, 0, LV_TABLE_CELL_CTRL_MERGE_RIGHT | LV_TABLE_CELL_CTRL_TEXT_CROP);
+
+ lv_table_clear_cell_ctrl(table, 0, 0, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
+ has_ctrl = lv_table_has_cell_ctrl(table, 0, 0, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
+ TEST_ASSERT_FALSE(has_ctrl);
+
+ has_ctrl = lv_table_has_cell_ctrl(table, 0, 0, LV_TABLE_CELL_CTRL_TEXT_CROP);
+ TEST_ASSERT_TRUE(has_ctrl);
+}
+
+/* We're using a newly created table */
+void test_table_cell_value_should_return_empty_string_when_cell_is_empty(void)
+{
+ TEST_ASSERT_EQUAL_STRING("", lv_table_get_cell_value(table, 0, 0));
+}
+
+void test_table_row_height_should_increase_with_multiline_cell_value(void)
+{
+ lv_table_t * table_ptr = (lv_table_t *) table;
+ const char * singleline_value = "LVGL";
+ const char * multiline_value = "LVGL\nRocks";
+
+ lv_table_set_cell_value(table, 0, 0, singleline_value);
+ lv_coord_t singleline_row_height = table_ptr->row_h[0];
+
+ lv_table_set_cell_value(table, 0, 0, multiline_value);
+ lv_coord_t multiline_row_height = table_ptr->row_h[0];
+
+ TEST_ASSERT_GREATER_THAN(singleline_row_height, multiline_row_height);
+}
+
+void test_table_should_wrap_long_texts(void)
+{
+ lv_table_t * table_ptr = (lv_table_t *) table;
+ const char * long_text = "Testing automatic text wrap with a very long text";
+ const char * small_text = "Hi";
+
+ lv_table_set_col_width(table, 0, 50);
+
+ lv_table_set_cell_value(table, 0, 0, small_text);
+ lv_coord_t row_height = table_ptr->row_h[0];
+
+ lv_table_set_cell_value(table, 0, 0, long_text);
+ lv_coord_t wrapped_row_height = table_ptr->row_h[0];
+
+ /* Row height on cells with wrapped text is bigger than cells with small texts */
+ TEST_ASSERT_GREATER_THAN(row_height, wrapped_row_height);
+}
+
+static void draw_part_event_cb(lv_event_t * e)
+{
+ lv_obj_t * obj = lv_event_get_target(e);
+ lv_obj_draw_part_dsc_t * dsc = lv_event_get_param(e);
+ /*If the cells are drawn...*/
+ if(dsc->part == LV_PART_ITEMS) {
+ uint32_t row = dsc->id / lv_table_get_col_cnt(obj);
+ uint32_t col = dsc->id - row * lv_table_get_col_cnt(obj);
+
+ /*Make the texts in the first cell center aligned*/
+ if(row == 0) {
+ dsc->label_dsc->align = LV_TEXT_ALIGN_CENTER;
+ dsc->rect_dsc->bg_color = lv_color_mix(lv_palette_main(LV_PALETTE_BLUE), dsc->rect_dsc->bg_color, LV_OPA_40);
+ dsc->rect_dsc->bg_opa = LV_OPA_COVER;
+ }
+ /*In the first column align the texts to the right*/
+ else if(col == 0) {
+ dsc->label_dsc->align = LV_TEXT_ALIGN_RIGHT;
+ }
+
+ /*Make every 2nd row grayish*/
+ if(row != 0 && (row % 2 == 0)) {
+ dsc->rect_dsc->bg_color = lv_color_mix(lv_palette_main(LV_PALETTE_RED), dsc->rect_dsc->bg_color, LV_OPA_30);
+ dsc->rect_dsc->bg_opa = LV_OPA_COVER;
+ }
+ }
+}
+
+void test_table_rendering(void)
+{
+ lv_obj_center(table);
+ lv_obj_add_event_cb(table, draw_part_event_cb, LV_EVENT_DRAW_PART_BEGIN, NULL);
+ lv_obj_set_style_border_side(table, LV_BORDER_SIDE_FULL, LV_PART_ITEMS);
+ lv_obj_set_style_pad_all(table, 10, LV_PART_ITEMS);
+ lv_obj_set_style_border_width(table, 5, LV_PART_ITEMS);
+ lv_table_set_col_cnt(table, 5);
+ lv_table_set_row_cnt(table, 5);
+ lv_table_set_col_width(table, 1, 60);
+ lv_table_set_col_width(table, 2, 100);
+
+ lv_table_add_cell_ctrl(table, 0, 1, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
+ lv_table_set_cell_value(table, 0, 1, "2 cells are merged");
+
+ lv_table_add_cell_ctrl(table, 1, 0, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
+ lv_table_add_cell_ctrl(table, 1, 1, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
+ lv_table_add_cell_ctrl(table, 1, 2, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
+ lv_table_add_cell_ctrl(table, 1, 3, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
+ lv_table_set_cell_value(table, 1, 0, "5 cells are merged");
+
+ uint32_t i;
+ for(i = 0; i < 5; i++) {
+ lv_table_set_cell_value_fmt(table, 3, i, "%d", i);
+ }
+
+ lv_table_set_cell_value_fmt(table, 2, 3, "Multi\nline text");
+ lv_table_set_cell_value_fmt(table, 2, 4, "Very long text wrapped automatically");
+
+ lv_table_add_cell_ctrl(table, 4, 3, LV_TABLE_CELL_CTRL_TEXT_CROP);
+ lv_table_set_cell_value_fmt(table, 4, 3, "crop crop crop crop crop crop crop crop ");
+
+ TEST_ASSERT_EQUAL_SCREENSHOT("table_1.png");
+}
+
+/* See #3120 for context */
+void test_table_should_reduce_cells(void)
+{
+ const uint16_t initial_col_num = 8;
+ const uint16_t initial_row_num = 1;
+ const uint16_t final_col_num = 4;
+ const uint16_t final_row_num = 1;
+
+ lv_obj_center(table);
+
+ lv_table_set_col_cnt(table, initial_col_num);
+ lv_table_set_row_cnt(table, initial_row_num);
+
+ uint32_t row_idx, col_idx;
+ for(row_idx = 0; row_idx < initial_row_num; row_idx++) {
+ for(col_idx = 0; col_idx < initial_col_num; col_idx++) {
+ lv_table_set_cell_value(table, row_idx, col_idx, "00");
+ }
+ }
+
+ lv_table_set_col_cnt(table, final_col_num);
+ lv_table_set_row_cnt(table, final_row_num);
+
+ for(row_idx = 0; row_idx < final_row_num; row_idx++) {
+ for(col_idx = 0; col_idx < final_col_num; col_idx++) {
+ lv_table_set_cell_value(table, row_idx, col_idx, "00");
+ }
+ }
+}
+
+/* See #3120 for context */
+void test_table_should_reduce_cells_with_more_than_one_row(void)
+{
+ const uint16_t initial_col_num = 8;
+ const uint16_t initial_row_num = 2;
+ const uint16_t final_col_num = 4;
+ const uint16_t final_row_num = 1;
+
+ lv_obj_center(table);
+
+ lv_table_set_col_cnt(table, initial_col_num);
+ lv_table_set_row_cnt(table, initial_row_num);
+
+ uint32_t row_idx, col_idx;
+ for(row_idx = 0; row_idx < initial_row_num; row_idx++) {
+ for(col_idx = 0; col_idx < initial_col_num; col_idx++) {
+ lv_table_set_cell_value(table, row_idx, col_idx, "00");
+ }
+ }
+
+ lv_table_set_col_cnt(table, final_col_num);
+ lv_table_set_row_cnt(table, final_row_num);
+
+ for(row_idx = 0; row_idx < final_row_num; row_idx++) {
+ for(col_idx = 0; col_idx < final_col_num; col_idx++) {
+ lv_table_set_cell_value(table, row_idx, col_idx, "00");
+ }
+ }
+}
+
+#endif
diff --git a/tests/src/test_cases/test_textarea.c b/tests/src/test_cases/test_textarea.c
new file mode 100644
index 000000000..99a14d819
--- /dev/null
+++ b/tests/src/test_cases/test_textarea.c
@@ -0,0 +1,107 @@
+#if LV_BUILD_TEST
+#include "../lvgl.h"
+
+#include "unity/unity.h"
+
+static lv_obj_t * active_screen = NULL;
+static lv_obj_t * textarea = NULL;
+
+static const char * textarea_default_text = "";
+
+void setUp(void)
+{
+ active_screen = lv_scr_act();
+ textarea = lv_textarea_create(active_screen);
+}
+
+void tearDown(void)
+{
+ /* Function run after every test */
+}
+
+void test_textarea_should_have_valid_documented_defualt_values(void)
+{
+ TEST_ASSERT(lv_textarea_get_cursor_click_pos(textarea));
+ TEST_ASSERT_EQUAL(0U, lv_textarea_get_one_line(textarea));
+ /* No placeholder text should be set on widget creation */
+ TEST_ASSERT_EQUAL_STRING(textarea_default_text, lv_textarea_get_placeholder_text(textarea));
+ TEST_ASSERT_EQUAL_STRING(textarea_default_text, lv_textarea_get_text(textarea));
+}
+
+/* When in password mode the lv_textarea_get_text function returns
+ * the actual text, not the bullet characters. */
+void test_textarea_should_return_actual_text_when_password_mode_is_enabled(void)
+{
+ const char * text = "Hello LVGL!";
+
+ lv_textarea_add_text(textarea, text);
+ lv_textarea_set_password_mode(textarea, true);
+
+ TEST_ASSERT_TRUE(lv_textarea_get_password_mode(textarea));
+ TEST_ASSERT_EQUAL_STRING(text, lv_textarea_get_text(textarea));
+}
+
+void test_textarea_should_update_label_style_with_one_line_enabled(void)
+{
+ lv_textarea_t * txt_ptr = (lv_textarea_t *) textarea;
+
+ lv_textarea_add_text(textarea, "Hi");
+ lv_textarea_set_one_line(textarea, true);
+
+ lv_coord_t left_padding = lv_obj_get_style_pad_left(txt_ptr->label, LV_PART_MAIN);
+ lv_coord_t right_padding = lv_obj_get_style_pad_right(txt_ptr->label, LV_PART_MAIN);
+ lv_coord_t line_width = lv_obj_get_width(txt_ptr->label);
+ lv_coord_t expected_size = left_padding + right_padding + line_width;
+
+ TEST_ASSERT(lv_textarea_get_one_line(textarea));
+ TEST_ASSERT_EQUAL_UINT16(expected_size, lv_obj_get_width(txt_ptr->label));
+ TEST_ASSERT_EQUAL_UINT16(lv_pct(100), lv_obj_get_style_min_width(txt_ptr->label, LV_PART_MAIN));
+}
+
+void test_textarea_cursor_click_pos_field_update(void)
+{
+ lv_textarea_set_cursor_click_pos(textarea, false);
+
+ TEST_ASSERT_FALSE(lv_textarea_get_cursor_click_pos(textarea));
+}
+
+void test_textarea_should_update_placeholder_text(void)
+{
+ const char * new_placeholder = "LVGL Rocks!!!!!";
+ const char * text = "Hello LVGL!";
+
+ /* Allocating memory for placeholder text */
+ lv_textarea_set_placeholder_text(textarea, text);
+ TEST_ASSERT_EQUAL_STRING(text, lv_textarea_get_placeholder_text(textarea));
+
+ /* Reallocating memory for the new placeholder text */
+ lv_textarea_set_placeholder_text(textarea, new_placeholder);
+ TEST_ASSERT_EQUAL_STRING(new_placeholder, lv_textarea_get_placeholder_text(textarea));
+
+ /* Freeing allocated memory for placeholder text */
+ lv_textarea_set_placeholder_text(textarea, "");
+ TEST_ASSERT_EQUAL_STRING("", lv_textarea_get_placeholder_text(textarea));
+}
+
+void test_textarea_should_keep_only_accepted_chars(void)
+{
+ const char * accepted_list = "abcd";
+
+ lv_textarea_set_accepted_chars(textarea, accepted_list);
+ lv_textarea_set_text(textarea, "abcde");
+
+ TEST_ASSERT_EQUAL_STRING(accepted_list, lv_textarea_get_text(textarea));
+}
+
+void test_textarea_in_one_line_mode_should_ignore_line_break_characters(void)
+{
+ lv_textarea_set_one_line(textarea, true);
+
+ lv_textarea_add_char(textarea, '\n');
+ TEST_ASSERT_EQUAL_STRING(textarea_default_text, lv_textarea_get_text(textarea));
+
+ lv_textarea_add_char(textarea, '\r');
+ TEST_ASSERT_EQUAL_STRING(textarea_default_text, lv_textarea_get_text(textarea));
+}
+
+#endif
diff --git a/tests/src/test_cases/test_txt.c b/tests/src/test_cases/test_txt.c
index 6dbad90f0..a855396fd 100644
--- a/tests/src/test_cases/test_txt.c
+++ b/tests/src/test_cases/test_txt.c
@@ -73,8 +73,8 @@ void test_txt_should_identify_space_after_parameter(void)
void test_txt_should_insert_string_into_another(void)
{
- const char *msg = "Hello ";
- const char *suffix = "World";
+ const char * msg = "Hello ";
+ const char * suffix = "World";
char target[20] = {0};
size_t msg_len = strlen(msg);
@@ -87,7 +87,7 @@ void test_txt_should_insert_string_into_another(void)
void test_txt_should_handle_null_pointers_when_inserting(void)
{
- const char *msg = "Hello ";
+ const char * msg = "Hello ";
char target[20] = {0};
size_t msg_len = strlen(msg);
@@ -194,7 +194,7 @@ void test_txt_get_encoded_next_detect_invalid_4_byte_input(void)
/* See #2615 for more information */
void test_txt_next_line_should_handle_empty_string(void)
{
- const lv_font_t *font_ptr = NULL;
+ const lv_font_t * font_ptr = NULL;
lv_coord_t letter_space = 0;
lv_coord_t max_width = 0;
lv_text_flag_t flag = LV_TEXT_FLAG_NONE;
diff --git a/tests/src/test_files/readtest.txt b/tests/src/test_files/readtest.txt
new file mode 100644
index 000000000..e398426d0
Binary files /dev/null and b/tests/src/test_files/readtest.txt differ
diff --git a/tests/unity/unity_support.c b/tests/unity/unity_support.c
index 657c0efa3..6906bd22b 100644
--- a/tests/unity/unity_support.c
+++ b/tests/unity/unity_support.c
@@ -73,7 +73,7 @@ bool lv_test_assert_img_eq(const char * fn_ref)
lv_obj_invalidate(lv_scr_act());
lv_refr_now(NULL);
-
+
extern lv_color_t test_fb[];
screen_buf = (uint8_t *)test_fb;
@@ -85,18 +85,17 @@ bool lv_test_assert_img_eq(const char * fn_ref)
int x, y, i_buf = 0;
for (y = 0; y < p.height; y++) {
png_byte* row = p.row_pointers[y];
- //printf("\n");
-
+
for (x = 0; x < p.width; x++) {
ptr_ref = &(row[x*3]);
ptr_act = &(screen_buf[i_buf*4]);
-
+
uint32_t ref_px = 0;
uint32_t act_px = 0;
memcpy(&ref_px, ptr_ref, 3);
memcpy(&act_px, ptr_act, 3);
//printf("0xFF%06x, ", act_px);
-
+
uint8_t act_swap[3] = {ptr_act[2], ptr_act[1], ptr_act[0]};
if(memcmp(act_swap, ptr_ref, 3) != 0) {
@@ -108,19 +107,17 @@ bool lv_test_assert_img_eq(const char * fn_ref)
if(err) break;
}
- png_release(&p);
-
if(err) {
uint32_t ref_px = 0;
uint32_t act_px = 0;
memcpy(&ref_px, ptr_ref, 3);
memcpy(&act_px, ptr_act, 3);
- TEST_PRINTF("Diff in %s at (%d;%d), %x instead of %x)", fn_ref, x, y, act_px, ref_px);
-
+
FILE * f = fopen("../test_screenshot_error.h", "w");
-
+
+ fprintf(f, "//Diff in %s at (%d;%d), %x instead of %x)\n\n", fn_ref, x, y, act_px, ref_px);
fprintf(f, "static const uint32_t test_screenshot_error_data[] = {\n");
-
+
i_buf = 0;
for (y = 0; y < 480; y++) {
fprintf(f, "\n");
@@ -133,7 +130,7 @@ bool lv_test_assert_img_eq(const char * fn_ref)
}
}
fprintf(f, "};\n\n");
-
+
fprintf(f, "static lv_img_dsc_t test_screenshot_error_dsc = { \n"
" .header.w = 800,\n"
" .header.h = 480,\n"
@@ -146,14 +143,16 @@ bool lv_test_assert_img_eq(const char * fn_ref)
" lv_obj_t * img = lv_img_create(lv_scr_act());\n"
" lv_img_set_src(img, &test_screenshot_error_dsc);\n"
"}\n");
-
+
fclose(f);
-
- return false;
+
}
-
- return true;
-
+
+
+ png_release(&p);
+
+ return !err;
+
}
/**********************
@@ -170,13 +169,13 @@ static int read_png_file(png_img_t * p, const char* file_name)
TEST_PRINTF("%s", "PNG file %s could not be opened for reading");
return -1;
}
-
+
size_t rcnt = fread(header, 1, 8, fp);
if (rcnt != 8 || png_sig_cmp((png_const_bytep)header, 0, 8)) {
TEST_PRINTF("%s is not recognized as a PNG file", file_name);
return -1;
}
-
+
/*initialize stuff*/
p->png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
@@ -184,7 +183,7 @@ static int read_png_file(png_img_t * p, const char* file_name)
TEST_PRINTF("%s", "png_create_read_struct failed");
return -1;
}
-
+
p->info_ptr = png_create_info_struct(p->png_ptr);
if (!p->info_ptr) {
TEST_PRINTF("%s", "png_create_info_struct failed");
@@ -228,7 +227,7 @@ static void png_release(png_img_t * p)
{
int y;
for (y=0; yheight; y++) free(p->row_pointers[y]);
-
+
free(p->row_pointers);
png_destroy_read_struct(&p->png_ptr, &p->info_ptr, NULL);
diff --git a/tests/unity/unity_support.h b/tests/unity/unity_support.h
index f3d168cf4..0d30cee11 100644
--- a/tests/unity/unity_support.h
+++ b/tests/unity/unity_support.h
@@ -6,7 +6,7 @@
extern "C" {
#endif
-#include
+#include
#include "../../lvgl.h"
bool lv_test_assert_img_eq(const char * fn_ref);
@@ -21,14 +21,14 @@ bool lv_test_assert_img_eq(const char * fn_ref);
TEST_IGNORE_MESSAGE("Requires 800x480 resolution"); \
} else { \
TEST_ASSERT(lv_test_assert_img_eq(path)); \
- }
-
+ }
+
# define TEST_ASSERT_EQUAL_SCREENSHOT_MESSAGE(path, msg) if(LV_HOR_RES != 800 || LV_VER_RES != 480) { \
TEST_PRINTF(msg); \
TEST_IGNORE_MESSAGE("Requires 800x480 resolution"); \
} else { \
TEST_ASSERT_MESSAGE(lv_test_assert_img_eq(path), msg); \
- }
+ }
#endif
# define TEST_ASSERT_EQUAL_COLOR(c1, c2) TEST_ASSERT_EQUAL_UINT32(c1.full, c2.full)
diff --git a/zephyr/CMakeLists.txt b/zephyr/CMakeLists.txt
index 66af8b004..d4270e3c9 100644
--- a/zephyr/CMakeLists.txt
+++ b/zephyr/CMakeLists.txt
@@ -17,180 +17,197 @@ zephyr_compile_definitions(LV_CONF_PATH=../zephyr/lv_conf.h)
zephyr_library()
zephyr_library_sources(
- ../src/core/lv_refr.c
- ../src/core/lv_indev.c
+ ../src/core/lv_disp.c
+ ../src/core/lv_event.c
../src/core/lv_group.c
- ../src/core/lv_obj_style.c
+ ../src/core/lv_indev.c
+ ../src/core/lv_indev_scroll.c
../src/core/lv_obj.c
- ../src/core/lv_theme.c
- ../src/core/lv_obj_scroll.c
../src/core/lv_obj_class.c
../src/core/lv_obj_draw.c
../src/core/lv_obj_pos.c
- ../src/core/lv_indev_scroll.c
- ../src/core/lv_disp.c
- ../src/core/lv_obj_tree.c
+ ../src/core/lv_obj_scroll.c
+ ../src/core/lv_obj_style.c
../src/core/lv_obj_style_gen.c
- ../src/core/lv_event.c
-
- ../src/hal/lv_hal_tick.c
- ../src/hal/lv_hal_disp.c
- ../src/hal/lv_hal_indev.c
-
- ../src/widgets/lv_canvas.c
- ../src/widgets/lv_table.c
- ../src/widgets/lv_slider.c
- ../src/widgets/lv_label.c
- ../src/widgets/lv_roller.c
- ../src/widgets/lv_btn.c
- ../src/widgets/lv_switch.c
- ../src/widgets/lv_dropdown.c
- ../src/widgets/lv_arc.c
- ../src/widgets/lv_img.c
- ../src/widgets/lv_bar.c
- ../src/widgets/lv_textarea.c
- ../src/widgets/lv_checkbox.c
- ../src/widgets/lv_btnmatrix.c
- ../src/widgets/lv_objx_templ.c
- ../src/widgets/lv_line.c
-
- ../src/misc/lv_area.c
- ../src/misc/lv_bidi.c
- ../src/misc/lv_color.c
- ../src/misc/lv_style_gen.c
- ../src/misc/lv_async.c
- ../src/misc/lv_timer.c
- ../src/misc/lv_gc.c
- ../src/misc/lv_math.c
- ../src/misc/lv_printf.c
- ../src/misc/lv_style.c
- ../src/misc/lv_txt.c
- ../src/misc/lv_templ.c
- ../src/misc/lv_anim_timeline.c
- ../src/misc/lv_mem.c
- ../src/misc/lv_lru.c
- ../src/misc/lv_utils.c
- ../src/misc/lv_anim.c
- ../src/misc/lv_log.c
- ../src/misc/lv_txt_ap.c
- ../src/misc/lv_fs.c
- ../src/misc/lv_ll.c
- ../src/misc/lv_tlsf.c
-
+ ../src/core/lv_obj_tree.c
+ ../src/core/lv_refr.c
+ ../src/core/lv_theme.c
+
+ ../src/draw/arm2d/lv_gpu_arm2d.c
+ ../src/draw/lv_draw.c
+ ../src/draw/lv_draw_arc.c
+ ../src/draw/lv_draw_img.c
../src/draw/lv_draw_label.c
+ ../src/draw/lv_draw_layer.c
+ ../src/draw/lv_draw_line.c
+ ../src/draw/lv_draw_mask.c
+ ../src/draw/lv_draw_rect.c
+ ../src/draw/lv_draw_transform.c
../src/draw/lv_draw_triangle.c
- ../src/draw/lv_img_decoder.c
- ../src/draw/lv_draw_img.c
+ ../src/draw/lv_img_buf.c
../src/draw/lv_img_cache.c
- ../src/draw/nxp_vglite/lv_gpu_nxp_vglite.c
- ../src/draw/lv_draw_line.c
- ../src/draw/nxp_pxp/lv_gpu_nxp_pxp.c
- ../src/draw/nxp_pxp/lv_gpu_nxp_pxp_osa.c
- ../src/draw/lv_draw.c
- ../src/draw/sdl/lv_draw_sdl_img.c
- ../src/draw/sdl/lv_draw_sdl_composite.c
- ../src/draw/sdl/lv_draw_sdl_polygon.c
- ../src/draw/sdl/lv_draw_sdl_utils.c
- ../src/draw/sdl/lv_draw_sdl_texture_cache.c
+ ../src/draw/lv_img_decoder.c
+ ../src/draw/nxp/lv_gpu_nxp.c
+ ../src/draw/nxp/pxp/lv_draw_pxp_blend.c
+ ../src/draw/nxp/pxp/lv_gpu_nxp_pxp.c
+ ../src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.c
+ ../src/draw/nxp/vglite/lv_draw_vglite_arc.c
+ ../src/draw/nxp/vglite/lv_draw_vglite_blend.c
+ ../src/draw/nxp/vglite/lv_draw_vglite_rect.c
+ ../src/draw/nxp/vglite/lv_gpu_nxp_vglite.c
../src/draw/sdl/lv_draw_sdl.c
- ../src/draw/sdl/lv_draw_sdl_bg.c
../src/draw/sdl/lv_draw_sdl_arc.c
- ../src/draw/sdl/lv_draw_sdl_rect.c
+ ../src/draw/sdl/lv_draw_sdl_bg.c
+ ../src/draw/sdl/lv_draw_sdl_composite.c
+ ../src/draw/sdl/lv_draw_sdl_img.c
../src/draw/sdl/lv_draw_sdl_label.c
- ../src/draw/sdl/lv_draw_sdl_stack_blur.c
- ../src/draw/sdl/lv_draw_sdl_mask.c
+ ../src/draw/sdl/lv_draw_sdl_layer.c
../src/draw/sdl/lv_draw_sdl_line.c
- ../src/draw/lv_img_buf.c
- ../src/draw/lv_draw_mask.c
+ ../src/draw/sdl/lv_draw_sdl_mask.c
+ ../src/draw/sdl/lv_draw_sdl_polygon.c
+ ../src/draw/sdl/lv_draw_sdl_rect.c
+ ../src/draw/sdl/lv_draw_sdl_stack_blur.c
+ ../src/draw/sdl/lv_draw_sdl_texture_cache.c
+ ../src/draw/sdl/lv_draw_sdl_utils.c
../src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.c
- ../src/draw/lv_draw_arc.c
- ../src/draw/lv_draw_rect.c
- ../src/draw/sw/lv_draw_sw_img.c
../src/draw/sw/lv_draw_sw.c
../src/draw/sw/lv_draw_sw_arc.c
- ../src/draw/sw/lv_draw_sw_line.c
- ../src/draw/sw/lv_draw_sw_polygon.c
- ../src/draw/sw/lv_draw_sw_rect.c
- ../src/draw/sw/lv_draw_sw_letter.c
../src/draw/sw/lv_draw_sw_blend.c
../src/draw/sw/lv_draw_sw_dither.c
../src/draw/sw/lv_draw_sw_gradient.c
-
- ../src/font/lv_font_montserrat_32.c
- ../src/font/lv_font.c
- ../src/font/lv_font_montserrat_8.c
- ../src/font/lv_font_unscii_8.c
- ../src/font/lv_font_montserrat_46.c
- ../src/font/lv_font_montserrat_12_subpx.c
- ../src/font/lv_font_montserrat_24.c
- ../src/font/lv_font_montserrat_40.c
- ../src/font/lv_font_loader.c
- ../src/font/lv_font_montserrat_28_compressed.c
- ../src/font/lv_font_fmt_txt.c
- ../src/font/lv_font_montserrat_18.c
- ../src/font/lv_font_montserrat_20.c
- ../src/font/lv_font_montserrat_34.c
- ../src/font/lv_font_montserrat_42.c
- ../src/font/lv_font_montserrat_30.c
- ../src/font/lv_font_montserrat_28.c
- ../src/font/lv_font_dejavu_16_persian_hebrew.c
- ../src/font/lv_font_montserrat_38.c
- ../src/font/lv_font_montserrat_16.c
- ../src/font/lv_font_montserrat_10.c
- ../src/font/lv_font_simsun_16_cjk.c
- ../src/font/lv_font_montserrat_26.c
- ../src/font/lv_font_montserrat_48.c
- ../src/font/lv_font_montserrat_14.c
- ../src/font/lv_font_unscii_16.c
- ../src/font/lv_font_montserrat_36.c
- ../src/font/lv_font_montserrat_44.c
- ../src/font/lv_font_montserrat_22.c
- ../src/font/lv_font_montserrat_12.c
-
- ../src/extra/lv_extra.c
- ../src/extra/themes/basic/lv_theme_basic.c
- ../src/extra/themes/mono/lv_theme_mono.c
- ../src/extra/themes/default/lv_theme_default.c
- ../src/extra/libs/sjpg/tjpgd.c
- ../src/extra/libs/sjpg/lv_sjpg.c
+ ../src/draw/sw/lv_draw_sw_img.c
+ ../src/draw/sw/lv_draw_sw_layer.c
+ ../src/draw/sw/lv_draw_sw_letter.c
+ ../src/draw/sw/lv_draw_sw_line.c
+ ../src/draw/sw/lv_draw_sw_polygon.c
+ ../src/draw/sw/lv_draw_sw_rect.c
+ ../src/draw/sw/lv_draw_sw_transform.c
+ ../src/draw/swm341_dma2d/lv_gpu_swm341_dma2d.c
+
+ ../src/extra/layouts/flex/lv_flex.c
+ ../src/extra/layouts/grid/lv_grid.c
+ ../src/extra/libs/bmp/lv_bmp.c
../src/extra/libs/ffmpeg/lv_ffmpeg.c
../src/extra/libs/freetype/lv_freetype.c
- ../src/extra/libs/qrcode/lv_qrcode.c
- ../src/extra/libs/qrcode/qrcodegen.c
- ../src/extra/libs/fsdrv/lv_fs_win32.c
../src/extra/libs/fsdrv/lv_fs_fatfs.c
../src/extra/libs/fsdrv/lv_fs_posix.c
../src/extra/libs/fsdrv/lv_fs_stdio.c
- ../src/extra/libs/gif/lv_gif.c
+ ../src/extra/libs/fsdrv/lv_fs_win32.c
../src/extra/libs/gif/gifdec.c
- ../src/extra/libs/bmp/lv_bmp.c
- ../src/extra/libs/png/lv_png.c
+ ../src/extra/libs/gif/lv_gif.c
../src/extra/libs/png/lodepng.c
+ ../src/extra/libs/png/lv_png.c
+ ../src/extra/libs/qrcode/lv_qrcode.c
+ ../src/extra/libs/qrcode/qrcodegen.c
../src/extra/libs/rlottie/lv_rlottie.c
- ../src/extra/widgets/menu/lv_menu.c
+ ../src/extra/libs/sjpg/lv_sjpg.c
+ ../src/extra/libs/sjpg/tjpgd.c
+ ../src/extra/lv_extra.c
+ ../src/extra/others/fragment/lv_fragment.c
+ ../src/extra/others/fragment/lv_fragment_manager.c
+ ../src/extra/others/gridnav/lv_gridnav.c
+ ../src/extra/others/ime/lv_ime_pinyin.c
+ ../src/extra/others/imgfont/lv_imgfont.c
+ ../src/extra/others/monkey/lv_monkey.c
+ ../src/extra/others/msg/lv_msg.c
+ ../src/extra/others/snapshot/lv_snapshot.c
+ ../src/extra/themes/basic/lv_theme_basic.c
+ ../src/extra/themes/default/lv_theme_default.c
+ ../src/extra/themes/mono/lv_theme_mono.c
+ ../src/extra/widgets/animimg/lv_animimg.c
+ ../src/extra/widgets/calendar/lv_calendar.c
+ ../src/extra/widgets/calendar/lv_calendar_header_arrow.c
+ ../src/extra/widgets/calendar/lv_calendar_header_dropdown.c
../src/extra/widgets/chart/lv_chart.c
- ../src/extra/widgets/spinner/lv_spinner.c
- ../src/extra/widgets/spinbox/lv_spinbox.c
../src/extra/widgets/colorwheel/lv_colorwheel.c
- ../src/extra/widgets/meter/lv_meter.c
+ ../src/extra/widgets/imgbtn/lv_imgbtn.c
+ ../src/extra/widgets/keyboard/lv_keyboard.c
+ ../src/extra/widgets/led/lv_led.c
../src/extra/widgets/list/lv_list.c
+ ../src/extra/widgets/menu/lv_menu.c
+ ../src/extra/widgets/meter/lv_meter.c
../src/extra/widgets/msgbox/lv_msgbox.c
- ../src/extra/widgets/animimg/lv_animimg.c
- ../src/extra/widgets/win/lv_win.c
- ../src/extra/widgets/tileview/lv_tileview.c
../src/extra/widgets/span/lv_span.c
- ../src/extra/widgets/calendar/lv_calendar.c
- ../src/extra/widgets/calendar/lv_calendar_header_dropdown.c
- ../src/extra/widgets/calendar/lv_calendar_header_arrow.c
+ ../src/extra/widgets/spinbox/lv_spinbox.c
+ ../src/extra/widgets/spinner/lv_spinner.c
../src/extra/widgets/tabview/lv_tabview.c
- ../src/extra/widgets/led/lv_led.c
- ../src/extra/widgets/imgbtn/lv_imgbtn.c
- ../src/extra/widgets/keyboard/lv_keyboard.c
- ../src/extra/layouts/grid/lv_grid.c
- ../src/extra/layouts/flex/lv_flex.c
- ../src/extra/others/monkey/lv_monkey.c
- ../src/extra/others/gridnav/lv_gridnav.c
- ../src/extra/others/snapshot/lv_snapshot.c
+ ../src/extra/widgets/tileview/lv_tileview.c
+ ../src/extra/widgets/win/lv_win.c
+
+ ../src/font/lv_font.c
+ ../src/font/lv_font_dejavu_16_persian_hebrew.c
+ ../src/font/lv_font_fmt_txt.c
+ ../src/font/lv_font_loader.c
+ ../src/font/lv_font_montserrat_10.c
+ ../src/font/lv_font_montserrat_12.c
+ ../src/font/lv_font_montserrat_12_subpx.c
+ ../src/font/lv_font_montserrat_14.c
+ ../src/font/lv_font_montserrat_16.c
+ ../src/font/lv_font_montserrat_18.c
+ ../src/font/lv_font_montserrat_20.c
+ ../src/font/lv_font_montserrat_22.c
+ ../src/font/lv_font_montserrat_24.c
+ ../src/font/lv_font_montserrat_26.c
+ ../src/font/lv_font_montserrat_28.c
+ ../src/font/lv_font_montserrat_28_compressed.c
+ ../src/font/lv_font_montserrat_30.c
+ ../src/font/lv_font_montserrat_32.c
+ ../src/font/lv_font_montserrat_34.c
+ ../src/font/lv_font_montserrat_36.c
+ ../src/font/lv_font_montserrat_38.c
+ ../src/font/lv_font_montserrat_40.c
+ ../src/font/lv_font_montserrat_42.c
+ ../src/font/lv_font_montserrat_44.c
+ ../src/font/lv_font_montserrat_46.c
+ ../src/font/lv_font_montserrat_48.c
+ ../src/font/lv_font_montserrat_8.c
+ ../src/font/lv_font_simsun_16_cjk.c
+ ../src/font/lv_font_unscii_16.c
+ ../src/font/lv_font_unscii_8.c
+
+ ../src/hal/lv_hal_disp.c
+ ../src/hal/lv_hal_indev.c
+ ../src/hal/lv_hal_tick.c
+
+ ../src/misc/lv_anim.c
+ ../src/misc/lv_anim_timeline.c
+ ../src/misc/lv_area.c
+ ../src/misc/lv_async.c
+ ../src/misc/lv_bidi.c
+ ../src/misc/lv_color.c
+ ../src/misc/lv_fs.c
+ ../src/misc/lv_gc.c
+ ../src/misc/lv_ll.c
+ ../src/misc/lv_log.c
+ ../src/misc/lv_lru.c
+ ../src/misc/lv_math.c
+ ../src/misc/lv_mem.c
+ ../src/misc/lv_printf.c
+ ../src/misc/lv_style.c
+ ../src/misc/lv_style_gen.c
+ ../src/misc/lv_templ.c
+ ../src/misc/lv_timer.c
+ ../src/misc/lv_tlsf.c
+ ../src/misc/lv_txt.c
+ ../src/misc/lv_txt_ap.c
+ ../src/misc/lv_utils.c
+
+ ../src/widgets/lv_arc.c
+ ../src/widgets/lv_bar.c
+ ../src/widgets/lv_btn.c
+ ../src/widgets/lv_btnmatrix.c
+ ../src/widgets/lv_canvas.c
+ ../src/widgets/lv_checkbox.c
+ ../src/widgets/lv_dropdown.c
+ ../src/widgets/lv_img.c
+ ../src/widgets/lv_label.c
+ ../src/widgets/lv_line.c
+ ../src/widgets/lv_objx_templ.c
+ ../src/widgets/lv_roller.c
+ ../src/widgets/lv_slider.c
+ ../src/widgets/lv_switch.c
+ ../src/widgets/lv_table.c
+ ../src/widgets/lv_textarea.c
lvgl.c
lvgl_display.c
diff --git a/zephyr/lv_conf.h b/zephyr/lv_conf.h
index 761a5f5d1..f5a49ecf2 100644
--- a/zephyr/lv_conf.h
+++ b/zephyr/lv_conf.h
@@ -41,4 +41,10 @@
#define lv_snprintf snprintf
#define lv_vsnprintf vsnprintf
+/*
+ * Needed because of a workaround for a GCC bug,
+ * see https://github.com/lvgl/lvgl/issues/3078
+ */
+#define LV_CONF_SUPPRESS_DEFINE_CHECK 1
+
#endif /* ZEPHYR_LIB_GUI_LVGL_LV_CONF_H_ */