summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--SConstruct2
-rw-r--r--core/bind/core_bind.cpp13
-rw-r--r--core/bind/core_bind.h2
-rw-r--r--core/image_quantize.cpp5
-rw-r--r--core/io/marshalls.cpp3
-rw-r--r--core/io/resource_format_xml.cpp2
-rw-r--r--core/io/resource_loader.cpp1
-rw-r--r--core/io/translation_loader_po.cpp3
-rw-r--r--core/math/triangle_mesh.cpp14
-rw-r--r--core/object.cpp2
-rw-r--r--core/path_db.cpp2
-rw-r--r--core/pool_allocator.cpp1
-rw-r--r--core/ustring.cpp1
-rw-r--r--doc/base/classes.xml30
-rw-r--r--drivers/builtin_openssl2/openssl/opensslconf.h9
-rw-r--r--main/input_default.cpp5
-rw-r--r--main/main.cpp12
-rw-r--r--main/splash.h1390
-rwxr-xr-xmethods.py4
-rw-r--r--modules/gdscript/gd_parser.cpp1
-rw-r--r--platform/android/SCsub6
-rw-r--r--platform/android/build.gradle.template1
-rw-r--r--platform/windows/os_windows.cpp62
-rw-r--r--platform/windows/os_windows.h1
-rw-r--r--platform/x11/os_x11.cpp1
-rw-r--r--scene/2d/camera_2d.cpp32
-rw-r--r--scene/2d/camera_2d.h2
-rw-r--r--scene/2d/navigation2d.cpp7
-rw-r--r--scene/2d/visibility_notifier_2d.cpp12
-rw-r--r--scene/3d/physics_joint.cpp6
-rw-r--r--scene/3d/vehicle_body.cpp12
-rw-r--r--scene/3d/visibility_notifier.cpp17
-rw-r--r--scene/gui/label.cpp4
-rw-r--r--scene/gui/line_edit.cpp3
-rw-r--r--scene/gui/rich_text_label.cpp19
-rw-r--r--scene/gui/rich_text_label.h1
-rw-r--r--scene/gui/tree.cpp8
-rw-r--r--scene/gui/tree.h2
-rw-r--r--scene/resources/animation.cpp3
-rw-r--r--scene/resources/dynamic_font.cpp2
-rw-r--r--scene/resources/mesh.cpp4
-rw-r--r--scene/resources/packed_scene.cpp22
-rw-r--r--scene/resources/sample_library.cpp19
-rw-r--r--scene/resources/sample_library.h4
-rw-r--r--servers/audio/audio_mixer_sw.cpp6
-rw-r--r--servers/physics/body_pair_sw.cpp4
-rw-r--r--servers/physics/collision_solver_sat.cpp1
-rw-r--r--servers/physics/shape_sw.cpp4
-rw-r--r--servers/physics/space_sw.cpp4
-rw-r--r--servers/physics_2d/shape_2d_sw.cpp3
-rw-r--r--servers/physics_2d/space_2d_sw.cpp4
-rw-r--r--servers/spatial_sound_2d/spatial_sound_2d_server_sw.cpp17
-rw-r--r--servers/visual/shader_language.cpp16
-rw-r--r--servers/visual/visual_server_raster.cpp20
-rw-r--r--servers/visual/visual_server_raster.h4
-rw-r--r--servers/visual/visual_server_wrap_mt.h2
-rw-r--r--servers/visual_server.cpp1
-rw-r--r--servers/visual_server.h2
-rw-r--r--tools/editor/code_editor.cpp5
-rw-r--r--tools/editor/dependency_editor.cpp1
-rw-r--r--tools/editor/editor_autoload_settings.cpp618
-rw-r--r--tools/editor/editor_autoload_settings.h94
-rw-r--r--tools/editor/editor_help.cpp3
-rw-r--r--tools/editor/editor_node.cpp15
-rw-r--r--tools/editor/editor_resource_preview.cpp132
-rw-r--r--tools/editor/io_plugins/editor_mesh_import_plugin.cpp2
-rw-r--r--tools/editor/plugins/collision_polygon_editor_plugin.cpp2
-rw-r--r--tools/editor/plugins/script_editor_plugin.cpp9
-rw-r--r--tools/editor/plugins/tile_set_editor_plugin.cpp22
-rw-r--r--tools/editor/project_settings.cpp429
-rw-r--r--tools/editor/project_settings.h19
-rw-r--r--tools/editor/property_editor.cpp2
-rw-r--r--tools/export/blender25/godot_export_manager.py370
-rw-r--r--tools/export/blender25/io_scene_dae/__init__.py149
-rw-r--r--tools/export/blender25/io_scene_dae/export_dae.py3521
75 files changed, 4670 insertions, 2563 deletions
diff --git a/SConstruct b/SConstruct
index 01b1f2ce8e..d168820f66 100644
--- a/SConstruct
+++ b/SConstruct
@@ -73,6 +73,7 @@ env_base.android_java_dirs=[]
env_base.android_res_dirs=[]
env_base.android_aidl_dirs=[]
env_base.android_jni_dirs=[]
+env_base.android_default_config=[]
env_base.android_manifest_chunk=""
env_base.android_permission_chunk=""
env_base.android_appattributes_chunk=""
@@ -88,6 +89,7 @@ env_base.__class__.android_add_java_dir=methods.android_add_java_dir
env_base.__class__.android_add_res_dir=methods.android_add_res_dir
env_base.__class__.android_add_aidl_dir=methods.android_add_aidl_dir
env_base.__class__.android_add_jni_dir=methods.android_add_jni_dir
+env_base.__class__.android_add_default_config=methods.android_add_default_config
env_base.__class__.android_add_to_manifest = methods.android_add_to_manifest
env_base.__class__.android_add_to_permissions = methods.android_add_to_permissions
env_base.__class__.android_add_to_attributes = methods.android_add_to_attributes
diff --git a/core/bind/core_bind.cpp b/core/bind/core_bind.cpp
index ace7e7c7b7..6edc292b62 100644
--- a/core/bind/core_bind.cpp
+++ b/core/bind/core_bind.cpp
@@ -435,6 +435,18 @@ String _OS::get_locale() const {
return OS::get_singleton()->get_locale();
}
+String _OS::get_latin_keyboard_variant() const {
+ switch( OS::get_singleton()->get_latin_keyboard_variant() ) {
+ case OS::LATIN_KEYBOARD_QWERTY: return "QWERTY";
+ case OS::LATIN_KEYBOARD_QWERTZ: return "QWERTZ";
+ case OS::LATIN_KEYBOARD_AZERTY: return "AZERTY";
+ case OS::LATIN_KEYBOARD_QZERTY: return "QZERTY";
+ case OS::LATIN_KEYBOARD_DVORAK: return "DVORAK";
+ case OS::LATIN_KEYBOARD_NEO : return "NEO";
+ default: return "ERROR";
+ }
+}
+
String _OS::get_model_name() const {
return OS::get_singleton()->get_model_name();
@@ -1097,6 +1109,7 @@ void _OS::_bind_methods() {
ObjectTypeDB::bind_method(_MD("get_ticks_msec"),&_OS::get_ticks_msec);
ObjectTypeDB::bind_method(_MD("get_splash_tick_msec"),&_OS::get_splash_tick_msec);
ObjectTypeDB::bind_method(_MD("get_locale"),&_OS::get_locale);
+ ObjectTypeDB::bind_method(_MD("get_latin_keyboard_variant"),&_OS::get_latin_keyboard_variant);
ObjectTypeDB::bind_method(_MD("get_model_name"),&_OS::get_model_name);
ObjectTypeDB::bind_method(_MD("get_custom_level"),&_OS::get_custom_level);
diff --git a/core/bind/core_bind.h b/core/bind/core_bind.h
index 856d942d02..5bd427578a 100644
--- a/core/bind/core_bind.h
+++ b/core/bind/core_bind.h
@@ -192,6 +192,8 @@ public:
Vector<String> get_cmdline_args();
String get_locale() const;
+ String get_latin_keyboard_variant() const;
+
String get_model_name() const;
MainLoop *get_main_loop() const;
diff --git a/core/image_quantize.cpp b/core/image_quantize.cpp
index b8d4658fda..f6fe7a88a0 100644
--- a/core/image_quantize.cpp
+++ b/core/image_quantize.cpp
@@ -59,7 +59,6 @@ int Image::MCBlock::get_longest_axis_index() const {
for(int i=0;i<4;i++) {
int d = max_color.color.col[i]-min_color.color.col[i];
- //printf(" ai:%i - %i\n",i,d);
if (d>max_dist) {
max_index=i;
max_dist=d;
@@ -71,13 +70,11 @@ int Image::MCBlock::get_longest_axis_index() const {
int Image::MCBlock::get_longest_axis_length() const {
int max_dist=-1;
- int max_index=0;
for(int i=0;i<4;i++) {
int d = max_color.color.col[i]-min_color.color.col[i];
if (d>max_dist) {
- max_index=i;
max_dist=d;
}
}
@@ -117,8 +114,6 @@ void Image::MCBlock::shrink() {
void Image::quantize() {
- Image::Format orig_format=format;
-
bool has_alpha = detect_alpha()!=ALPHA_NONE;
bool quantize_fast=OS::get_singleton()->has_environment("QUANTIZE_FAST");
diff --git a/core/io/marshalls.cpp b/core/io/marshalls.cpp
index 60617e1237..c9bd38c654 100644
--- a/core/io/marshalls.cpp
+++ b/core/io/marshalls.cpp
@@ -685,7 +685,6 @@ Error decode_variant(Variant& r_variant,const uint8_t *p_buffer, int p_len,int *
if (count) {
varray.resize(count);
DVector<Vector2>::Write w = varray.write();
- const float *r = (const float*)buf;
for(int i=0;i<(int)count;i++) {
@@ -724,7 +723,6 @@ Error decode_variant(Variant& r_variant,const uint8_t *p_buffer, int p_len,int *
if (count) {
varray.resize(count);
DVector<Vector3>::Write w = varray.write();
- const float *r = (const float*)buf;
for(int i=0;i<(int)count;i++) {
@@ -764,7 +762,6 @@ Error decode_variant(Variant& r_variant,const uint8_t *p_buffer, int p_len,int *
if (count) {
carray.resize(count);
DVector<Color>::Write w = carray.write();
- const float *r = (const float*)buf;
for(int i=0;i<(int)count;i++) {
diff --git a/core/io/resource_format_xml.cpp b/core/io/resource_format_xml.cpp
index a42a922baf..0d545b16f5 100644
--- a/core/io/resource_format_xml.cpp
+++ b/core/io/resource_format_xml.cpp
@@ -1862,8 +1862,6 @@ void ResourceInteractiveLoaderXML::open(FileAccess *p_f) {
}
int major = version.get_slicec('.',0).to_int();
- int minor = version.get_slicec('.',1).to_int();
-
if (major>VERSION_MAJOR) {
error=ERR_FILE_UNRECOGNIZED;
diff --git a/core/io/resource_loader.cpp b/core/io/resource_loader.cpp
index 1bb80e74eb..f414f85df8 100644
--- a/core/io/resource_loader.cpp
+++ b/core/io/resource_loader.cpp
@@ -443,7 +443,6 @@ String ResourceLoader::get_resource_type(const String &p_path) {
String remapped_path = PathRemap::get_singleton()->get_remap(local_path);
String extension=remapped_path.extension();
- bool found=false;
for (int i=0;i<loader_count;i++) {
String result = loader[i]->get_resource_type(local_path);
diff --git a/core/io/translation_loader_po.cpp b/core/io/translation_loader_po.cpp
index 4ddb276a27..a22c57b941 100644
--- a/core/io/translation_loader_po.cpp
+++ b/core/io/translation_loader_po.cpp
@@ -47,7 +47,6 @@ RES TranslationLoaderPO::load_translation(FileAccess *f, Error *r_error, const S
String msg_id;
String msg_str;
String config;
- int msg_line=0;
if (r_error)
*r_error=ERR_FILE_CORRUPT;
@@ -97,7 +96,6 @@ RES TranslationLoaderPO::load_translation(FileAccess *f, Error *r_error, const S
status=STATUS_READING_ID;
msg_id="";
msg_str="";
- msg_line=line;
}
if (l.begins_with("msgstr")) {
@@ -111,7 +109,6 @@ RES TranslationLoaderPO::load_translation(FileAccess *f, Error *r_error, const S
l=l.substr(6,l.length()).strip_edges();
status=STATUS_READING_STRING;
- msg_line=line;
}
if (l=="" || l.begins_with("#")) {
diff --git a/core/math/triangle_mesh.cpp b/core/math/triangle_mesh.cpp
index adb9861092..7aea32a8a0 100644
--- a/core/math/triangle_mesh.cpp
+++ b/core/math/triangle_mesh.cpp
@@ -195,9 +195,6 @@ Vector3 TriangleMesh::get_area_normal(const AABB& p_aabb) const {
int n_count=0;
Vector3 n;
- //for(int i=0;i<max_depth;i++)
- // stack[i]=0;
-
int level=0;
DVector<Triangle>::Read trianglesr = triangles.read();
@@ -205,7 +202,6 @@ Vector3 TriangleMesh::get_area_normal(const AABB& p_aabb) const {
DVector<BVH>::Read bvhr=bvh.read();
const Triangle *triangleptr=trianglesr.ptr();
- const Vector3 *vertexptr=verticesr.ptr();
int pos=bvh.size()-1;
const BVH *bvhptr = bvhr.ptr();
@@ -301,14 +297,7 @@ bool TriangleMesh::intersect_segment(const Vector3& p_begin,const Vector3& p_end
real_t d=1e10;
bool inters=false;
- //for(int i=0;i<max_depth;i++)
- // stack[i]=0;
-
int level=0;
- //AABB ray_aabb;
- //ray_aabb.pos=p_begin;
- //ray_aabb.expand_to(p_end);
-
DVector<Triangle>::Read trianglesr = triangles.read();
DVector<Vector3>::Read verticesr=vertices.read();
@@ -431,9 +420,6 @@ bool TriangleMesh::intersect_ray(const Vector3& p_begin,const Vector3& p_dir,Vec
real_t d=1e20;
bool inters=false;
- //for(int i=0;i<max_depth;i++)
- // stack[i]=0;
-
int level=0;
DVector<Triangle>::Read trianglesr = triangles.read();
diff --git a/core/object.cpp b/core/object.cpp
index 99d4a1f46a..dc3d531927 100644
--- a/core/object.cpp
+++ b/core/object.cpp
@@ -1495,7 +1495,7 @@ void Object::disconnect(const StringName& p_signal, Object *p_to_object, const S
ERR_EXPLAIN("Disconnecting nonexistent signal '"+p_signal+"', slot: "+itos(target._id)+":"+target.method);
ERR_FAIL();
}
- int prev = p_to_object->connections.size();
+
p_to_object->connections.erase(s->slot_map[target].cE);
s->slot_map.erase(target);
diff --git a/core/path_db.cpp b/core/path_db.cpp
index 7545088978..0956c4cd3f 100644
--- a/core/path_db.cpp
+++ b/core/path_db.cpp
@@ -329,7 +329,6 @@ NodePath::NodePath(const String& p_path) {
Vector<StringName> subpath;
int absolute=(path[0]=='/')?1:0;;
- bool valid=false;
bool last_is_slash=true;
int slices=0;
int subpath_pos=path.find(":");
@@ -373,7 +372,6 @@ NodePath::NodePath(const String& p_path) {
if (last_is_slash)
slices++;
- valid=true;
last_is_slash=false;
}
}
diff --git a/core/pool_allocator.cpp b/core/pool_allocator.cpp
index 849fd75f50..9f5fcf5f50 100644
--- a/core/pool_allocator.cpp
+++ b/core/pool_allocator.cpp
@@ -372,7 +372,6 @@ Error PoolAllocator::resize(ID p_mem,int p_new_size) {
}
//p_new_size = align(p_new_size)
- int _total = pool_size; // - static_area_size;
int _free = free_mem; // - static_area_size;
if ((_free + aligned(e->len)) - alloc_size < 0) {
diff --git a/core/ustring.cpp b/core/ustring.cpp
index 3c22de35f1..6788ada1bb 100644
--- a/core/ustring.cpp
+++ b/core/ustring.cpp
@@ -3836,7 +3836,6 @@ String String::lpad(int min_length, const String& character) const {
String String::sprintf(const Array& values, bool* error) const {
String formatted;
CharType* self = (CharType*)c_str();
- int num_items = values.size();
bool in_format = false;
int value_index = 0;
int min_chars;
diff --git a/doc/base/classes.xml b/doc/base/classes.xml
index cffbd68939..dd00a0312c 100644
--- a/doc/base/classes.xml
+++ b/doc/base/classes.xml
@@ -6676,6 +6676,17 @@
Force the camera to update scroll immediately.
</description>
</method>
+ <method name="reset_smoothing">
+ <description>
+ Set the camera's position immediately to its current smoothing destination.
+ This has no effect if smoothing is disabled.
+ </description>
+ </method>
+ <method name="align">
+ <description>
+ Align the camera to the tracked node
+ </description>
+ </method>
<method name="get_anchor_mode" qualifiers="const">
<return type="int">
</return>
@@ -21677,6 +21688,12 @@
<description>
</description>
</method>
+ <method name="is_displayed_folded" qualifiers="const">
+ <return type="bool">
+ </return>
+ <description>
+ </description>
+ </method>
<method name="is_fixed_processing" qualifiers="const">
<return type="bool">
</return>
@@ -21802,6 +21819,12 @@
<description>
</description>
</method>
+ <method name="set_display_folded">
+ <argument index="0" name="fold" type="bool">
+ </argument>
+ <description>
+ </description>
+ </method>
<method name="set_filename">
<argument index="0" name="filename" type="String">
</argument>
@@ -31551,6 +31574,13 @@
<description>
</description>
</method>
+ <method name="get_text">
+ <return type="String">
+ </return>
+ <description>
+ Returns the raw text, stripping out the formatting information.
+ </description>
+ </method>
<method name="get_total_character_count" qualifiers="const">
<return type="int">
</return>
diff --git a/drivers/builtin_openssl2/openssl/opensslconf.h b/drivers/builtin_openssl2/openssl/opensslconf.h
index 25429e94d6..c86bb60b94 100644
--- a/drivers/builtin_openssl2/openssl/opensslconf.h
+++ b/drivers/builtin_openssl2/openssl/opensslconf.h
@@ -213,8 +213,13 @@ extern "C" {
#ifdef OPENSSL_USE_64_BITS
-#define SIXTY_FOUR_BIT_LONG
-#undef SIXTY_FOUR_BIT
+# ifdef _WIN32
+# undef SIXTY_FOUR_BIT_LONG
+# define SIXTY_FOUR_BIT
+# else
+# define SIXTY_FOUR_BIT_LONG
+# undef SIXTY_FOUR_BIT
+# endif
#undef THIRTY_TWO_BIT
#else
diff --git a/main/input_default.cpp b/main/input_default.cpp
index 4fcb450bce..e975d4141f 100644
--- a/main/input_default.cpp
+++ b/main/input_default.cpp
@@ -30,6 +30,7 @@
#include "servers/visual_server.h"
#include "os/os.h"
#include "input_map.h"
+#include "scene/resources/texture.h"
void InputDefault::SpeedTrack::update(const Vector2& p_delta_p) {
@@ -463,9 +464,11 @@ void InputDefault::set_custom_mouse_cursor(const RES& p_cursor,const Vector2& p_
set_mouse_mode(MOUSE_MODE_VISIBLE);
VisualServer::get_singleton()->cursor_set_visible(false);
} else {
+ Ref<AtlasTexture> atex = custom_cursor;
+ Rect2 region = atex.is_valid() ? atex->get_region() : Rect2();
set_mouse_mode(MOUSE_MODE_HIDDEN);
VisualServer::get_singleton()->cursor_set_visible(true);
- VisualServer::get_singleton()->cursor_set_texture(custom_cursor->get_rid(),p_hotspot);
+ VisualServer::get_singleton()->cursor_set_texture(custom_cursor->get_rid(),p_hotspot, 0, region);
VisualServer::get_singleton()->cursor_set_pos(get_mouse_pos());
}
}
diff --git a/main/main.cpp b/main/main.cpp
index 41a032842d..adaebab1d4 100644
--- a/main/main.cpp
+++ b/main/main.cpp
@@ -101,6 +101,7 @@ static bool init_fullscreen=false;
static bool init_use_custom_pos=false;
static bool debug_collisions=false;
static bool debug_navigation=false;
+static int frame_delay=0;
static Vector2 init_custom_pos;
static int video_driver_idx=-1;
static int audio_driver_idx=-1;
@@ -488,7 +489,7 @@ Error Main::setup(const char *execpath,int argc, char *argv[],bool p_second_phas
if (I->next()) {
- OS::get_singleton()->set_frame_delay(I->next()->get().to_int());
+ frame_delay=I->next()->get().to_int();
N=I->next()->next();
} else {
goto error;
@@ -805,12 +806,19 @@ Error Main::setup(const char *execpath,int argc, char *argv[],bool p_second_phas
OS::get_singleton()->set_screen_orientation(OS::SCREEN_LANDSCAPE);
}
+
OS::get_singleton()->set_iterations_per_second(GLOBAL_DEF("physics/fixed_fps",60));
- OS::get_singleton()->set_target_fps(GLOBAL_DEF("application/target_fps",0));
+ OS::get_singleton()->set_target_fps(GLOBAL_DEF("debug/force_fps",0));
if (!OS::get_singleton()->_verbose_stdout) //overrided
OS::get_singleton()->_verbose_stdout=GLOBAL_DEF("debug/verbose_stdout",false);
+ if (frame_delay==0) {
+ frame_delay=GLOBAL_DEF("application/frame_delay_msec",0);
+ }
+
+ OS::get_singleton()->set_frame_delay(frame_delay);
+
message_queue = memnew( MessageQueue );
Globals::get_singleton()->register_global_defaults();
diff --git a/main/splash.h b/main/splash.h
index 832f504288..b96aff8754 100644
--- a/main/splash.h
+++ b/main/splash.h
@@ -29,12 +29,1394 @@
#ifndef BOOT_SPLASH_H
#define BOOT_SPLASH_H
-static const unsigned char boot_splash_png[]={
-0x89,0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,0x0,0x0,0xef,0x0,0x0,0x1,0x3,0x8,0x6,0x0,0x0,0x0,0xdd,0x81,0x53,0xf4,0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0x32,0xdf,0x0,0x0,0x32,0xdf,0x1,0x17,0xbe,0xe4,0xb,0x0,0x0,0x0,0x7,0x74,0x49,0x4d,0x45,0x7,0xde,0x1,0x19,0x13,0x8,0x19,0x46,0x43,0xd9,0xbb,0x0,0x0,0x0,0x19,0x74,0x45,0x58,0x74,0x43,0x6f,0x6d,0x6d,0x65,0x6e,0x74,0x0,0x43,0x72,0x65,0x61,0x74,0x65,0x64,0x20,0x77,0x69,0x74,0x68,0x20,0x47,0x49,0x4d,0x50,0x57,0x81,0xe,0x17,0x0,0x0,0x20,0x0,0x49,0x44,0x41,0x54,0x78,0xda,0xed,0x9d,0x79,0x78,0x54,0xd5,0xf9,0xc7,0x3f,0xef,0x9d,0x49,0xc2,0xe,0xb2,0xb9,0xaf,0xb8,0x2f,0x3f,0xb5,0xa8,0xb4,0xa2,0x66,0x66,0x2,0x4,0xea,0x5a,0xad,0x5a,0x6d,0xb5,0x2e,0xad,0x56,0x24,0x1b,0x4,0xb5,0x5a,0x2b,0xb6,0x6a,0x55,0x2,0x9,0x9,0xae,0x5d,0xd4,0x5a,0x6b,0x15,0xad,0x15,0x15,0x48,0x48,0x66,0x26,0x50,0x10,0x17,0xa,0x2a,0x56,0x51,0x11,0xd7,0x8a,0xec,0x90,0x0,0x59,0x66,0xee,0xfb,0xfb,0x63,0x82,0x4,0x32,0x9,0x99,0x9b,0x99,0x64,0x92,0x9c,0xcf,0xf3,0xcc,0x43,0xb8,0x33,0xf7,0xdc,0x73,0xde,0x73,0xbe,0xe7,0xbc,0xe7,0xdc,0xb3,0x80,0xc1,0x60,0x30,0x18,0xc,0x6,0x83,0xc1,0x60,0x30,0x18,0xc,0x6,0x83,0xc1,0x60,0x30,0x18,0xc,0x6,0x83,0xc1,0x60,0x30,0x18,0xc,0x6,0x83,0xc1,0x60,0x30,0x18,0xc,0x6,0x83,0xc1,0x60,0x30,0x18,0xc,0x6,0x83,0xc1,0x60,0x30,0x18,0xc,0x6,0x83,0xc1,0x60,0x30,0x18,0xc,0x6,0x83,0xc1,0x60,0x30,0x18,0xc,0x6,0x83,0xc1,0x60,0x30,0x18,0xc,0x6,0x83,0xc1,0x60,0x30,0x18,0xc,0x6,0x83,0xc1,0x60,0x30,0x18,0xc,0x6,0x83,0xc1,0x60,0x30,0x18,0xc,0x6,0x83,0xc1,0x60,0x30,0x18,0xc,0x6,0x83,0xc1,0x60,0x30,0x18,0xc,0x6,0x83,0xc1,0x60,0x30,0x18,0xc,0x6,0x83,0xc1,0x60,0x30,0x18,0xc,0x86,0x16,0x19,0x53,0xe0,0xdf,0xaf,0xbd,0x9e,0x95,0x71,0x5f,0x79,0x2f,0x63,0xf1,0xce,0x87,0x18,0x13,0x24,0x81,0x50,0xa7,0x96,0xa,0x92,0x76,0xb4,0xc0,0x39,0xa0,0xe7,0x0,0xe7,0x0,0x43,0x4a,0xf3,0xbd,0x9,0x17,0x55,0x66,0x81,0xdf,0x7,0x52,0xe,0x2c,0x5,0x16,0x0,0xb,0xdc,0x96,0x1d,0x7c,0x6d,0x62,0xc6,0x16,0x93,0x33,0x46,0xbc,0x86,0x28,0x8c,0x9b,0x56,0xe9,0xb2,0x35,0xec,0x1,0xb9,0x0,0x38,0xf,0x38,0xa2,0x69,0xee,0xc8,0x43,0xa5,0x93,0x3c,0x13,0x12,0x2b,0xde,0x40,0x15,0xd0,0x27,0xca,0x57,0xb,0x15,0x5e,0x1,0x99,0x5d,0x96,0xef,0x59,0x69,0x72,0xcc,0x88,0xb7,0x5b,0xf3,0xc3,0x82,0xa,0xcb,0xc6,0xf2,0x2a,0xfc,0x1c,0xb8,0x8,0xe8,0xbb,0x97,0x5b,0xea,0x43,0x75,0xe1,0xfe,0x15,0xb7,0x8f,0xda,0x91,0x10,0xe1,0x4e,0xd,0xdc,0x88,0xf0,0x68,0x2b,0x7e,0xfa,0x11,0xf0,0xac,0xad,0xfa,0xd4,0xfc,0xc9,0xbe,0xd5,0x26,0x27,0x8d,0x78,0xbb,0xd,0x63,0xb,0x2,0x47,0x2a,0x5c,0xb,0x5c,0x5,0x1c,0x1c,0xe3,0xed,0xf3,0x4b,0xf3,0xbd,0x63,0x12,0xd4,0xea,0xd6,0x3,0xee,0x18,0x6f,0x5b,0x8,0x3c,0x95,0x52,0x5f,0xfb,0xb7,0x57,0x7f,0x3d,0xb6,0xd6,0xe4,0xae,0x11,0x6f,0x97,0xe3,0xfc,0x29,0xaf,0x48,0x5d,0xdf,0x3e,0x67,0xa1,0xe4,0x3,0x17,0xb4,0x21,0xa8,0xb0,0x25,0x1c,0x32,0x77,0x92,0xf7,0x7f,0x71,0x16,0x6e,0x9,0xd0,0x16,0x97,0x7c,0x1b,0x50,0x62,0xa1,0xd3,0xe7,0xe6,0xfb,0xd6,0x99,0x1c,0x37,0xe2,0xed,0x12,0x8c,0x29,0x8,0x64,0xa,0xdc,0xd,0x8c,0x88,0x53,0x90,0x1f,0x96,0xe6,0x7b,0x8f,0x8b,0x5b,0x7f,0xbb,0x78,0x4e,0x9a,0x5d,0xd7,0x73,0x3b,0x60,0xc5,0x21,0x38,0x1b,0xf8,0x6b,0x8a,0x86,0xb2,0x5e,0x9d,0x3c,0xba,0xda,0xe4,0x7e,0xfb,0x61,0x19,0x13,0x24,0xa4,0x46,0x1c,0x1f,0x47,0xe1,0x2,0x1c,0x93,0x39,0x3d,0x70,0x54,0xbc,0x2,0xb3,0xeb,0x7a,0x3e,0x17,0xc7,0xbc,0xb7,0x80,0x6b,0xea,0xc5,0x3d,0xc0,0xe4,0xbc,0x11,0x6f,0x57,0x60,0x6d,0xdc,0xeb,0x3,0x9b,0x57,0xe3,0xd4,0xea,0xba,0x80,0xf3,0x13,0x90,0xe6,0xb0,0xc9,0x76,0x23,0x5e,0x23,0xde,0xe8,0x1c,0x39,0x66,0xaa,0xff,0x80,0x38,0xb4,0xba,0x7f,0x4a,0x50,0xbe,0x1b,0xf1,0x1a,0xf1,0x1a,0xf1,0x36,0x97,0x57,0x22,0xf2,0x4a,0x1c,0xc2,0xb9,0x3a,0x41,0x9d,0x5,0x23,0x5e,0x23,0xde,0x2e,0x80,0x26,0x44,0xbc,0x0,0xa7,0x8c,0x2a,0x2c,0x77,0xdc,0xb7,0xcc,0x2c,0x8,0x4c,0x4b,0x54,0x9e,0x4b,0x64,0xe0,0xca,0xd0,0x8e,0xb8,0x8d,0x9,0x12,0x52,0x92,0x13,0x25,0x5e,0xcb,0x15,0x76,0xbd,0x4,0x78,0x77,0x5e,0x18,0x53,0x10,0x18,0xec,0xb2,0xb4,0x4f,0xd8,0x96,0x5e,0x88,0xf4,0x6,0x3b,0x84,0x6d,0x6d,0x3,0x7b,0x5b,0x38,0xc5,0xde,0x52,0x91,0x3b,0xaa,0xf1,0x8,0x70,0x6e,0xe2,0xea,0x2b,0x35,0x2d,0xaf,0x11,0x6f,0x57,0x68,0x78,0x59,0x9b,0xc0,0x77,0x70,0xe7,0x64,0x16,0x4,0xca,0x80,0x43,0x81,0x43,0x80,0x1e,0xb6,0x2d,0x91,0x77,0x7e,0xaa,0x91,0x36,0x50,0x22,0xff,0xba,0x43,0x2e,0x32,0xb,0x2,0x1b,0x80,0xcf,0x81,0x4d,0x9,0xf6,0xb4,0x8c,0x78,0x8d,0x78,0xbb,0x42,0xc3,0x4b,0x55,0x82,0xbb,0x3a,0xa3,0x63,0xf8,0xfd,0xa0,0x86,0x4f,0xa2,0xab,0xac,0x7a,0x93,0xf3,0xa6,0xcf,0xdb,0xf9,0xc5,0x2b,0x52,0xd3,0xcd,0x92,0x1c,0xaa,0x75,0x89,0x11,0xaf,0x11,0x6f,0x17,0x70,0x9b,0x95,0xee,0x36,0xe7,0xf7,0x83,0x60,0x9e,0x57,0x4d,0xce,0x1b,0xf1,0x76,0x5,0xf5,0x76,0x37,0xf1,0xbe,0x63,0x32,0xdd,0x88,0xb7,0x4b,0x60,0x63,0xd5,0x18,0xf1,0x1a,0x8c,0x78,0x3b,0x21,0xf3,0x27,0xa7,0xdb,0x44,0x46,0x78,0xbb,0x49,0x27,0x5f,0x97,0x9b,0x5c,0x37,0xe2,0xed,0x4a,0xac,0xe8,0x36,0xda,0xb5,0xd5,0xec,0xb4,0xd1,0x11,0x76,0x37,0x26,0x88,0x2f,0x63,0xa7,0xf9,0x53,0x54,0xe5,0x76,0xe0,0x4e,0xc0,0xd5,0x4d,0x92,0xbd,0x5a,0x85,0x5f,0x95,0x4d,0xf2,0x96,0x99,0x12,0x60,0xc4,0xdb,0x29,0xc9,0x2c,0x8,0x8c,0x6,0x1e,0x1,0x86,0x75,0x53,0x13,0x3c,0x6f,0x5b,0xf6,0xcd,0xf3,0x27,0x66,0xac,0x37,0xa5,0xc1,0x88,0x37,0x21,0x8c,0x7b,0x20,0xe0,0xb2,0x5d,0x72,0xbf,0xaa,0xce,0x2e,0x9b,0xec,0x5d,0xd8,0xd6,0xf0,0x46,0x15,0x2f,0xe8,0xe9,0xaa,0xf,0x17,0xa3,0xfc,0xc2,0x14,0x29,0x6a,0x54,0xf9,0xa5,0x1d,0xe,0x3d,0x53,0x7e,0xdb,0xe8,0x36,0xbd,0x3e,0x1a,0xfe,0xd8,0xdb,0xd6,0xe0,0xad,0x55,0x13,0x10,0xde,0x2f,0xcd,0xf7,0x56,0x18,0xd3,0x1a,0xf1,0x92,0x59,0x10,0xb8,0x1b,0xf8,0x2d,0xa0,0xc0,0x6c,0x41,0x7f,0x3d,0x2f,0xdf,0xf7,0x81,0xa3,0xb0,0xa6,0xfa,0x47,0x22,0xf2,0x2c,0xb1,0xef,0x4d,0xd5,0xd5,0x79,0xc1,0x25,0xae,0xeb,0xe7,0x4c,0x3a,0x67,0xab,0xb3,0x3c,0xa,0x5e,0xe,0xfa,0x0,0x91,0x69,0xa0,0x21,0x41,0x4f,0x99,0x97,0xef,0x7b,0xdf,0x98,0xb5,0x1b,0x8b,0x37,0xb3,0x20,0x70,0x25,0xf0,0xcc,0x1e,0x97,0x43,0xc0,0x13,0x2,0x77,0xce,0xcb,0xf7,0x7e,0xdb,0x9a,0x70,0xc6,0x14,0x4,0x5c,0x12,0xe9,0xd7,0xde,0x65,0x8a,0x51,0xb3,0x6c,0x14,0xe4,0xfc,0x79,0xf9,0x9e,0xc5,0xad,0xbd,0x61,0xcc,0xb4,0x80,0x4f,0x94,0x7,0x81,0xe1,0x7b,0x7c,0xb5,0x49,0x2c,0xfb,0xb8,0x79,0x13,0x33,0xbe,0x35,0x66,0xed,0x86,0xe2,0xcd,0x2c,0xf0,0xff,0x0,0x64,0x51,0xb,0xe9,0xde,0x1,0x4c,0x4d,0xad,0xae,0xfe,0xfd,0x2b,0x53,0xce,0xf,0x35,0x17,0xce,0xe8,0xe9,0xc1,0xfe,0x96,0xad,0xcf,0x1,0x99,0xa6,0x8,0xb5,0x8a,0x5b,0xc2,0xa1,0xd0,0xb4,0xf2,0xdb,0x46,0xdb,0x2d,0x78,0x30,0xc3,0x10,0x29,0x6,0xc6,0xb5,0x90,0x3f,0x1f,0x28,0x32,0xa2,0x2c,0xdf,0x53,0x65,0x4c,0xda,0x8d,0xc4,0x3b,0xf6,0x41,0xff,0xe1,0x6a,0xc9,0x7b,0x40,0xef,0x56,0xfc,0xfc,0x33,0x81,0x5f,0xcd,0xcb,0xf7,0x96,0x36,0x9,0xa7,0x20,0x78,0x82,0xa2,0x15,0xc0,0xbe,0xa6,0xf8,0xc4,0xc4,0x4b,0x82,0x5e,0x39,0x2f,0xdf,0x57,0xb3,0x67,0xbf,0x76,0x50,0x55,0xd5,0x6f,0x4,0xee,0x0,0x52,0x5b,0x11,0xce,0x5c,0x4b,0xac,0x8b,0xe6,0x4e,0x4a,0xaf,0x33,0xe2,0xed,0x6,0x8c,0x9b,0xea,0x1f,0x68,0x8b,0x2c,0x23,0xb2,0x84,0xae,0xb5,0x28,0xf0,0xf,0x45,0xb3,0xcb,0xf2,0x7d,0xeb,0x1b,0x5c,0xee,0x4c,0xe0,0x15,0x20,0xc5,0x68,0xd1,0x11,0xff,0xc1,0xd2,0x8c,0xd2,0x89,0xbe,0xcd,0xd,0xfd,0xda,0xc,0xd0,0xc7,0x89,0x76,0x5a,0x44,0xcb,0x14,0xd7,0xf6,0x24,0x37,0x78,0x73,0xf7,0x9e,0x4f,0xdd,0xe5,0xc5,0x9b,0x39,0x35,0xd0,0x13,0x61,0x3e,0x30,0xd2,0x61,0x10,0xd5,0xa,0xb7,0xa2,0x84,0xa5,0x75,0xa7,0xb,0x18,0x5a,0xe6,0x7f,0xaa,0x7a,0xae,0x88,0x4c,0x4,0x7e,0x8a,0xc3,0x89,0x42,0x2,0x37,0xcf,0xcb,0xf7,0x3e,0x6c,0xc4,0xdb,0x45,0x19,0x33,0xb5,0x54,0x44,0x52,0x9f,0x24,0x61,0xfb,0x36,0x19,0x3a,0xb8,0xf0,0x7a,0xe7,0xe5,0x7b,0x83,0xdd,0x35,0xfd,0x5d,0x7a,0x7a,0xa4,0x48,0xea,0xe5,0x46,0xb8,0x5d,0x17,0x85,0x57,0x32,0xb,0x82,0x43,0x4d,0xcb,0xdb,0xf5,0xdc,0xe5,0xc3,0x11,0x56,0x9a,0xfe,0x69,0x97,0xa7,0x52,0x61,0x74,0x59,0xbe,0xb7,0xdb,0x6d,0x6,0xd0,0x25,0x5b,0xde,0xb1,0xd3,0xfc,0x3d,0x11,0x66,0x1b,0xe1,0x76,0xb,0xd2,0x45,0xc8,0x32,0x6e,0x73,0x57,0x71,0xa7,0x54,0xee,0x4,0x4e,0x34,0xe5,0xba,0xdb,0xf8,0xcf,0xd3,0x32,0xa7,0x6,0x4e,0x30,0x6e,0x73,0x67,0x77,0x97,0xb,0xfc,0x27,0x81,0xbc,0x6b,0x4a,0x74,0xb7,0xe3,0x43,0x81,0x53,0xe7,0xe5,0x7b,0xbb,0xcd,0x46,0x8,0x5d,0xaa,0xe5,0x1d,0x53,0xe0,0x4f,0x3,0xf9,0x87,0x29,0xc7,0xdd,0x92,0x63,0x51,0x7e,0x69,0xdc,0xe6,0xce,0xea,0x46,0xa8,0xdc,0x0,0x1c,0x6f,0xca,0x71,0x37,0xf5,0x9e,0x85,0xa2,0x31,0x85,0xc1,0x43,0x8d,0x78,0x3b,0x9b,0xbb,0x3c,0xbd,0xb2,0x7,0xc2,0xfd,0xa6,0x8,0x77,0x6b,0x2c,0x9,0xeb,0x8d,0x46,0xbc,0x9d,0x8c,0xd2,0x89,0xe9,0x35,0xc0,0x4d,0xa6,0xfc,0x76,0x6b,0x6a,0x41,0x4b,0x8c,0x78,0x3b,0x21,0x29,0x96,0xfd,0x77,0x60,0xa1,0x29,0xc3,0xdd,0x96,0x6b,0x4b,0xf3,0x7d,0xdf,0x18,0xf1,0x76,0x42,0x5e,0x9d,0x98,0x11,0x2,0xae,0x22,0xb2,0x3e,0xd7,0xd0,0xbd,0xa8,0xb4,0xc2,0xcc,0xea,0x56,0x7d,0x84,0xae,0x96,0xa0,0xd2,0x7c,0xef,0xe7,0xc0,0x4,0x53,0x96,0xbb,0x15,0x21,0xb5,0xf8,0xd9,0xdc,0x5b,0xbd,0x21,0x23,0xde,0x4e,0x8e,0xc2,0x13,0xc0,0x52,0x53,0xa6,0xbb,0x9,0xca,0x8d,0x65,0x13,0xbd,0x5f,0x75,0xb7,0x64,0x77,0x49,0xf1,0x96,0xe5,0x7b,0xeb,0x54,0xb9,0xcc,0xb8,0xcf,0xdd,0x82,0x85,0x61,0xb7,0xf5,0x74,0x77,0x4c,0x78,0x97,0x5d,0x55,0x54,0x36,0xd9,0xfb,0xa9,0x98,0x15,0x45,0x5d,0x9d,0x6a,0x55,0x7e,0x5c,0x9e,0x97,0x5e,0x6f,0xc4,0xdb,0xc5,0xb0,0xb5,0xee,0x1f,0x34,0xdd,0x6c,0xce,0xd0,0x45,0x10,0x95,0xb,0xca,0x26,0x7b,0xd7,0x76,0xdb,0xf4,0x77,0xf5,0x4,0x8e,0x29,0x8,0xf6,0x13,0x74,0x5,0x66,0x6b,0xd6,0xae,0xc6,0x83,0xa5,0xf9,0xde,0x5b,0xbb,0xb3,0x1,0xba,0xfc,0x59,0x45,0x65,0xf9,0x9e,0xad,0xaa,0x7a,0x2e,0x91,0x3d,0xa9,0xc,0x5d,0x83,0x77,0xb1,0xcc,0x96,0xbb,0xdd,0xe2,0xa0,0xb1,0xb2,0xc9,0xbe,0xf7,0x80,0x9b,0x4d,0x99,0xef,0x12,0xd4,0xdb,0x22,0xe7,0x96,0x4e,0xf4,0xd6,0x18,0xf1,0x76,0x1f,0xca,0x4d,0xb9,0xef,0x12,0x6c,0x98,0x3f,0xc9,0xf3,0x95,0x31,0x83,0x39,0xe2,0xd3,0x60,0xe8,0xb4,0xb8,0x8d,0x9,0xda,0x8e,0x0,0x47,0xc,0xed,0xc3,0xf,0x8e,0x1c,0xcc,0x89,0x7,0xf6,0x67,0x50,0x9f,0x34,0x6,0xf6,0x4e,0x65,0x7b,0x5d,0x98,0xd,0xd5,0xb5,0x7c,0xb5,0x69,0x7,0x4b,0x3e,0x59,0xcf,0x5b,0xab,0x37,0x50,0x1b,0xb2,0x3b,0x7f,0x7a,0x5,0x4e,0x39,0x64,0x1f,0x7e,0x30,0x6c,0x30,0xc3,0x86,0xf6,0x61,0x50,0x9f,0x34,0xfa,0xf7,0x4a,0x61,0xf3,0xb6,0x3a,0xd6,0x57,0xd7,0xf2,0xc9,0xb7,0xd5,0xbc,0xbe,0x6a,0x3d,0x2b,0xbe,0xda,0x82,0xad,0x66,0xa8,0xc1,0x88,0x37,0x49,0x45,0x7b,0xea,0x61,0xfb,0x70,0xfd,0xd9,0xc3,0x18,0x36,0xb4,0x4f,0x93,0xef,0x7b,0xa7,0xb9,0x19,0xd2,0x37,0x8d,0x63,0xf7,0xef,0xc7,0xa8,0xe3,0xf7,0x25,0x14,0xb6,0x99,0xf5,0xd6,0x97,0xfc,0xfd,0x8d,0xcf,0xa9,0xef,0xa4,0x22,0x3e,0xef,0xe4,0x3,0xf8,0xf9,0x59,0x47,0xd0,0xb7,0x47,0xd3,0xa2,0xd3,0x73,0x40,0x4f,0xf6,0x1f,0xd0,0x93,0x93,0xe,0x1a,0xc0,0x8f,0x86,0x1f,0xc4,0x86,0xea,0x3a,0x9e,0xfa,0xf7,0xa7,0x94,0xff,0xf7,0x5b,0x23,0xe2,0x4,0x95,0xbf,0x6e,0x41,0x66,0x41,0xe0,0x28,0xe0,0xa3,0x78,0x85,0x97,0xe6,0xb6,0xb8,0xf5,0xdc,0xe3,0x38,0xf3,0xc8,0x21,0x31,0xdf,0x5b,0x5d,0x1b,0xe2,0x77,0x2f,0xaf,0xe0,0xdd,0x2f,0x37,0x77,0x1a,0xfb,0xd,0xe9,0x9b,0xc6,0x3,0x97,0x9d,0xc2,0x1,0x3,0x7a,0xc6,0x7c,0xef,0xaa,0xb5,0xd5,0xdc,0xf1,0xe2,0xbb,0x6c,0xde,0x1e,0x97,0x13,0x4a,0xd6,0x94,0xe6,0x7b,0xf7,0x37,0xd2,0x35,0x7d,0x5e,0x47,0xf4,0xef,0x95,0x4a,0xc9,0xcf,0x4e,0x73,0x24,0x5c,0x80,0x3e,0x69,0x6e,0xfe,0xf0,0xe3,0x93,0x39,0xff,0x94,0x3,0x3a,0x45,0x7a,0xff,0xef,0xe0,0x1,0xfc,0xf9,0xba,0x11,0x8e,0x84,0xb,0x30,0x6c,0x68,0x1f,0xfe,0x7c,0xfd,0x19,0x51,0xbd,0x13,0x83,0x11,0x6f,0xbb,0xd1,0x23,0xc5,0x45,0xd1,0x15,0xa7,0x72,0xc8,0xa0,0x5e,0x6d,0xa,0xc7,0x65,0x9,0x37,0xf9,0x8e,0xe2,0xfb,0xc3,0x6,0x25,0x75,0x7a,0x87,0xf6,0xeb,0xc1,0x7d,0x97,0x9c,0x4c,0xaa,0xbb,0x6d,0x45,0xa5,0x77,0xaa,0x9b,0xa2,0x2b,0xbf,0xc7,0xa0,0x3e,0x69,0xa6,0x10,0x99,0x3e,0x6f,0x7,0xd4,0x74,0x22,0xfc,0xfa,0xbc,0xe3,0xd9,0xbf,0x85,0x16,0x68,0xe5,0xca,0x95,0x94,0x97,0x57,0xf0,0xce,0x3b,0xef,0xb0,0x61,0xfd,0x6,0x5c,0x2e,0x17,0x43,0x86,0xc,0x61,0xf8,0xf0,0xef,0x31,0x6a,0xf4,0x28,0xe,0x39,0xe4,0x90,0xdd,0xc2,0xbb,0xe3,0xfc,0x13,0xb8,0xe6,0x4f,0x6f,0xb0,0xa1,0xba,0x36,0x29,0xd3,0xfc,0xd0,0x55,0xc3,0x71,0xbb,0x76,0xef,0x5d,0x55,0x55,0x55,0x31,0xe7,0xb5,0x39,0x2c,0x59,0xb2,0x84,0x35,0x6b,0xbe,0x65,0xc7,0x8e,0x1d,0xc,0x1a,0x34,0x90,0xe3,0x8e,0x3b,0x8e,0xb3,0xcf,0x3e,0x9b,0x33,0x46,0x9c,0x81,0x48,0xd3,0x1e,0x59,0x8a,0xcb,0xa2,0xf0,0x8a,0x53,0xf9,0xe5,0x13,0x6f,0x76,0x89,0x81,0x3b,0xd3,0xe7,0xed,0x44,0x7d,0xde,0x63,0xf7,0xef,0x47,0xd1,0x95,0xdf,0x8b,0xfa,0x5d,0x4d,0x4d,0xd,0xf,0xdc,0xff,0x20,0x95,0x95,0x95,0xcd,0x8b,0xdf,0xb2,0x38,0xff,0xfc,0xf3,0xc8,0xc9,0xcd,0xd9,0xed,0xfa,0xea,0x75,0xd5,0xdc,0xf4,0xd7,0xb7,0x93,0xce,0x66,0x37,0x67,0x1c,0xc5,0xf9,0xa7,0x1c,0xb8,0xdb,0xb5,0x67,0x9f,0xfd,0x7,0x4f,0x3e,0xf1,0x24,0xf5,0xf5,0xcd,0xaf,0x5,0x38,0xf1,0xc4,0x13,0xb9,0xf3,0xb7,0xbf,0x61,0xc8,0x90,0xe8,0xdd,0x8a,0x87,0xfd,0x1f,0x33,0x7b,0xd9,0xd7,0xa6,0xcf,0x6b,0xdc,0xe6,0x76,0x72,0x51,0x2c,0xe1,0xf6,0xf3,0xa2,0x6f,0x4c,0xb9,0x65,0xcb,0x16,0xae,0xbb,0xf6,0xfa,0x16,0x85,0xb,0x60,0xdb,0x36,0x2f,0xbf,0x3c,0x9b,0x1b,0x6f,0xf8,0x15,0xb6,0xbd,0xab,0xe5,0x39,0x6c,0x70,0x1f,0xe,0x1f,0xd2,0xbb,0x4d,0xf1,0x73,0x59,0x42,0xfa,0x31,0x43,0xb9,0xe6,0xac,0xc3,0x19,0x7d,0xc2,0x7e,0x51,0x47,0x83,0x63,0x4d,0xef,0xb8,0xff,0xdb,0xbd,0x4f,0x7e,0xef,0x3d,0xf7,0xf2,0xc7,0xc7,0xff,0xd8,0xa2,0x70,0x1,0x56,0xac,0x58,0xc1,0xd5,0x57,0xfd,0x9c,0xcf,0x56,0x7f,0x16,0xf5,0xfb,0x5f,0x79,0x8f,0xa4,0x4f,0x9a,0x71,0xfa,0x8c,0x78,0xdb,0x89,0x21,0xfd,0x7a,0x30,0xb4,0x5f,0x8f,0x26,0xd7,0x6b,0x6b,0x6b,0xc9,0xce,0xca,0x61,0xcd,0x9a,0x35,0xad,0xe,0xeb,0xe3,0x8f,0x3f,0x66,0x72,0xfe,0xe4,0x5d,0xee,0x8f,0x40,0xce,0xe8,0x63,0x1c,0xc7,0xed,0xc8,0xa1,0x7d,0x78,0xf6,0x57,0x67,0xf2,0xeb,0xf3,0x8e,0xe7,0x27,0x23,0xe,0x65,0xd2,0xd8,0x63,0xf9,0xc7,0x4d,0x23,0x19,0x7b,0x92,0xf3,0x6,0xea,0x82,0xef,0x1d,0x84,0xdb,0xda,0xe5,0x98,0x3d,0xf6,0xe8,0x63,0x54,0x54,0xf8,0x5b,0x7d,0x7f,0x6d,0x6d,0x2d,0xe3,0xc7,0xdf,0x4c,0x55,0x55,0x55,0xd4,0xee,0xc7,0xf1,0x7,0xf4,0x37,0x85,0xca,0x88,0xb7,0x7d,0x38,0xfb,0xe8,0xe8,0x2e,0x60,0x69,0x69,0x29,0x5f,0x7e,0xf9,0x65,0xcc,0xe1,0x2d,0x5f,0xfe,0xe,0xff,0xf9,0xcf,0xb2,0x46,0xad,0xaf,0xb3,0x96,0xd7,0x65,0x9,0x45,0x3f,0x1d,0x4e,0xbf,0x9e,0x29,0x4d,0xae,0xe7,0x8e,0x39,0x86,0x81,0xbd,0x53,0x1d,0x85,0x7b,0xe9,0x69,0x7,0x37,0xea,0xe3,0x56,0xf3,0xc2,0xb,0x2f,0xc6,0x1c,0x46,0x4d,0x4d,0xd,0xf,0x3e,0x30,0x35,0xea,0x77,0x3f,0x3b,0xf3,0x30,0x53,0xa8,0x8c,0x78,0xdb,0xa9,0xcf,0x7c,0xe2,0xfe,0x51,0x5b,0x97,0x92,0xe2,0x99,0x8e,0xc2,0x53,0x55,0xee,0xbb,0xf7,0xbe,0xef,0xfe,0x9f,0x96,0xe2,0xc2,0x65,0xc5,0x3e,0x4,0x71,0xf8,0xe0,0x3e,0xbb,0xb5,0x90,0x7b,0xf2,0x93,0x11,0xce,0xf6,0x20,0xef,0xd3,0xc8,0xed,0xbe,0xe7,0x9e,0x7b,0x8,0x87,0xc3,0x8e,0xc2,0x59,0xb4,0x68,0x11,0x9b,0x37,0x37,0x7d,0x9f,0x7d,0xf4,0x7e,0x7d,0x49,0x73,0x9b,0xe2,0x67,0xc4,0x9b,0x68,0x23,0x9,0xec,0x3f,0xa0,0xa9,0xcb,0xbc,0x61,0xfd,0x6,0xc7,0x85,0x1a,0x60,0xeb,0xd6,0xad,0xbb,0x5c,0x67,0xe0,0xe0,0x81,0xb1,0xbf,0x7e,0x3a,0xed,0xf0,0x81,0x2d,0x7e,0x3f,0xc2,0xe1,0xab,0x28,0xab,0xd1,0x68,0xf1,0x7b,0xef,0xbe,0xd7,0x26,0xfb,0xad,0x58,0xb1,0x22,0xea,0xf5,0x54,0xb7,0xcb,0x14,0x2e,0x23,0xde,0xc4,0x92,0xea,0x76,0xed,0x56,0x98,0x77,0xf2,0x85,0x3,0x77,0xb9,0x31,0xa1,0x50,0x88,0xf5,0xeb,0xd7,0xef,0x72,0x9d,0x7,0xf5,0x76,0x54,0xb1,0xb4,0x84,0xd3,0xd7,0x9,0x8d,0xbd,0x80,0x50,0xa8,0x6d,0x5b,0x81,0xbd,0xf5,0x56,0xf4,0x91,0xf4,0x14,0xb7,0x98,0xc2,0x65,0xc4,0x9b,0x58,0x42,0x76,0xf4,0x77,0x92,0x6b,0xbf,0x6d,0xfb,0xe,0x2c,0xdf,0x7c,0xb3,0x6b,0xa0,0x6b,0xc3,0xb6,0xba,0xa4,0x49,0x73,0xe3,0xb9,0xc8,0xb6,0xdd,0xb6,0x77,0xb2,0xdf,0xae,0xf9,0x36,0xea,0xf5,0xb0,0x6d,0xe6,0x3b,0x1b,0xf1,0x26,0x5a,0xbc,0x61,0xa5,0x6a,0x47,0xd3,0xd7,0x23,0x7,0x1c,0xd8,0xf6,0xd7,0x8d,0x7,0x1d,0xb4,0xeb,0x3d,0xea,0xa7,0xeb,0xaa,0x93,0x48,0xbc,0x8d,0xa,0x89,0xd5,0xb6,0x62,0x72,0xe0,0x81,0xd1,0xa7,0x81,0xd6,0x99,0x89,0x1a,0x46,0xbc,0xed,0xc1,0xf2,0x28,0x8b,0x8,0xe,0x3c,0xf0,0xc0,0x36,0x85,0x99,0x92,0x92,0xc2,0x3e,0xfb,0xec,0xf3,0x5d,0x5,0xb1,0xad,0x36,0x79,0x76,0xaa,0xd,0x85,0xed,0xdd,0xe2,0xd9,0x16,0xce,0x18,0x71,0x46,0x93,0x6b,0xdb,0x6a,0x43,0xd4,0xd6,0x1b,0xf1,0x1a,0xf1,0xb6,0x3,0x2f,0x2d,0x6d,0xba,0x79,0xc3,0xe0,0xc1,0x83,0x49,0x4d,0x4d,0x75,0x1c,0xe6,0x4e,0xe1,0x2,0x54,0xd5,0x24,0xd7,0xee,0xa5,0xcb,0x3e,0xdf,0xf4,0xdd,0xdf,0xa7,0x9f,0x7e,0x7a,0x9b,0xc2,0x3a,0xee,0xd8,0xe3,0x9a,0x5c,0xfb,0xe7,0xd2,0x2f,0xcd,0x32,0x41,0x23,0xde,0xf6,0xe1,0x8b,0xd,0xdb,0xa2,0xb6,0x9c,0xb7,0xdc,0x32,0xd9,0x51,0x78,0x22,0xc2,0xdd,0xbf,0x9b,0xf2,0xdd,0xff,0x5f,0x78,0xfb,0xcb,0xa4,0x4a,0xef,0xe3,0xc1,0x4f,0xbe,0xdb,0xb1,0xef,0xd7,0xb7,0xdf,0x86,0xdb,0xed,0x6c,0x46,0xd4,0xd8,0x71,0x63,0xe9,0xd7,0xbf,0x5f,0x93,0xeb,0xe5,0xef,0x7f,0x6b,0xa,0x95,0x11,0x6f,0xfb,0x50,0x5d,0x1b,0xe2,0xc9,0x7f,0xaf,0x6e,0x72,0xfd,0xec,0x73,0xce,0xe6,0xb8,0xe3,0x8e,0x8b,0x39,0xbc,0xb3,0xcf,0x3e,0x9b,0x63,0x8e,0x89,0xcc,0xaa,0xaa,0xa9,0xf,0xf3,0x62,0x92,0x89,0xf7,0x9b,0x2d,0x35,0xac,0xd9,0xbc,0x3,0x80,0xb4,0xb4,0x34,0xae,0xbf,0xfe,0xba,0xa8,0x8b,0xd,0x5a,0xa2,0x7f,0xff,0xfe,0x64,0x65,0x35,0x3d,0x36,0x6a,0xc5,0x57,0x9b,0x59,0x5b,0x55,0x63,0xa,0x95,0x11,0x6f,0xfb,0x31,0x7b,0xd9,0x57,0x4d,0xfa,0x69,0x29,0x29,0x29,0x4c,0x2d,0x78,0x90,0x61,0xc3,0x86,0xb5,0x3a,0x9c,0xe1,0xc3,0x87,0x33,0xe5,0xee,0x5d,0x3b,0x97,0x3e,0xe2,0xff,0x24,0x29,0xd3,0xfb,0xeb,0x17,0xde,0xf9,0xce,0xb5,0xbd,0xfc,0x27,0x97,0x73,0xd1,0x8f,0x2e,0x6a,0xb5,0x80,0xfb,0xf5,0xeb,0xc7,0xa3,0x8f,0x3d,0x42,0xcf,0x9e,0x4d,0x57,0x60,0x3d,0x38,0xf7,0x43,0x8c,0xc7,0x6c,0xc4,0xdb,0xae,0x6c,0xaf,0xb,0x73,0xcb,0xf3,0xcb,0x9a,0x5c,0xef,0xd5,0xab,0x17,0xf,0x3d,0x3c,0x93,0xb,0x2e,0xbc,0xa0,0xc5,0xfb,0x53,0x52,0x52,0xb8,0xfa,0xea,0xab,0x98,0x5a,0xf0,0xe0,0x77,0xd7,0xde,0xfc,0x74,0x3,0xa5,0x2b,0x92,0xf3,0x48,0xd9,0x35,0x5b,0x6a,0x78,0x7a,0xf1,0x67,0xdf,0xfd,0x3f,0x2b,0x6b,0x2,0x93,0xf2,0x27,0xd1,0xb7,0x6f,0xdf,0x16,0xef,0x3b,0xeb,0xac,0x91,0x3c,0xfd,0xb7,0xbf,0xb2,0xef,0xbe,0xfb,0x36,0xf9,0x6e,0xc6,0xfc,0x95,0xac,0xdd,0x6a,0x5a,0xdd,0x78,0x60,0x96,0x76,0xc4,0xc8,0xca,0x35,0x55,0x14,0xcc,0xfd,0x90,0xfc,0x71,0xc7,0xee,0x76,0x3d,0x35,0x35,0x95,0xdc,0xdc,0x1c,0xae,0xb8,0xe2,0xa,0x2a,0xca,0xcb,0x59,0xb6,0x7c,0x79,0xa3,0xf5,0xbc,0x83,0x39,0xed,0xf4,0xd3,0xc9,0xc8,0xf0,0xd1,0xbf,0xff,0xae,0x9,0xf9,0xab,0xd7,0x55,0xf3,0xdb,0x97,0xde,0x4b,0xea,0xf4,0x3e,0xbb,0xe4,0x73,0xe,0x1d,0xd4,0xb,0xcf,0xb1,0x11,0x21,0xfe,0xf0,0x87,0xe3,0x18,0x33,0x66,0x34,0xfe,0xa,0x3f,0x8b,0x17,0x2f,0xde,0x6d,0x3d,0xef,0xf1,0xc7,0x1f,0xcf,0x39,0xe9,0xe7,0x70,0xf4,0xd1,0x47,0x47,0xd,0xeb,0x95,0x65,0x5f,0x33,0xef,0xbd,0x6f,0x4c,0x21,0x32,0xe2,0xed,0x38,0xca,0xff,0xbb,0x86,0xaa,0x9a,0x7a,0xee,0xbc,0xf0,0x4,0xdc,0x7b,0xbc,0x3,0xdd,0x77,0xdf,0xa1,0x5c,0xf9,0xd3,0x2b,0xb9,0xf2,0xa7,0x57,0xb6,0x18,0xc6,0x82,0x95,0x6b,0xf9,0xc3,0x6b,0xff,0x6d,0x73,0x5c,0xf6,0x36,0xcf,0x21,0x1e,0xee,0xe9,0xfd,0xaf,0x7d,0xc0,0xd7,0x9b,0x76,0x70,0xe5,0xf7,0xf,0x43,0x4,0xdc,0x6e,0x37,0x63,0x32,0xc7,0x30,0x26,0x73,0x4c,0xab,0xc3,0xf8,0x53,0xe5,0x2a,0x5e,0x5c,0xfa,0xa5,0x71,0x97,0x8d,0xdb,0xdc,0xf1,0xbc,0xf1,0xe9,0x6,0x7e,0xf1,0x97,0x37,0x59,0xb2,0x6a,0x7d,0x4c,0xf7,0x6d,0xd9,0x51,0x4f,0x51,0xd9,0x4a,0xee,0x7b,0xf5,0xbf,0x71,0x29,0xc8,0x6f,0xad,0xde,0xd8,0xe2,0xf7,0x4b,0x3e,0xdd,0x10,0x97,0xf4,0x3e,0xbd,0xf8,0x33,0x7e,0xfb,0xd2,0xbb,0x7c,0x1e,0x65,0xd4,0xbd,0x25,0x3e,0x5a,0x53,0xc5,0xe4,0xe7,0x96,0xf3,0xc2,0xdb,0x46,0xb8,0xa6,0xe5,0x4d,0xb2,0x3e,0xe1,0x94,0x7f,0xad,0xe0,0x84,0x3,0xfb,0x33,0xfa,0x84,0xfd,0xf8,0xfe,0xb0,0x41,0xc,0xe8,0x95,0x1a,0xa5,0x75,0x54,0x56,0x7c,0xb5,0x85,0x45,0x9f,0xac,0xe7,0xd5,0xe5,0x5f,0xc7,0x75,0x5a,0xe0,0x67,0xeb,0xab,0x9,0xd9,0xda,0xec,0xca,0xa2,0xe7,0xde,0xf8,0x3c,0x6e,0xcf,0x7a,0x6b,0xf5,0x46,0xde,0x5a,0xbd,0x11,0xdf,0x71,0xfb,0x72,0xf6,0xd1,0x43,0x38,0xfd,0xf0,0x81,0xb8,0x5d,0x4d,0xeb,0xff,0xda,0x50,0x98,0xb7,0x3e,0xdd,0x48,0xe5,0xca,0xb5,0xfc,0xfb,0xe3,0x75,0x46,0xb4,0x46,0xbc,0xc9,0xcb,0xfb,0x5f,0x6f,0xe1,0xfd,0xaf,0xb7,0x20,0x22,0x1c,0xb4,0x4f,0x4f,0x6,0xf7,0x49,0x63,0x60,0x9f,0x5d,0x9b,0xae,0xff,0x6f,0xd3,0xe,0xaa,0x13,0x34,0x7b,0x2a,0x6c,0x2b,0xb9,0xcf,0x2c,0xe5,0xbe,0x1f,0x9f,0xbc,0xdb,0x9a,0xde,0xb0,0xad,0x94,0x94,0x7f,0xc4,0xc6,0x4,0xcc,0x97,0xf6,0x7f,0xf0,0x2d,0xfe,0xf,0xbe,0xc5,0xed,0x12,0xe,0x19,0xd8,0x9b,0x41,0x7d,0xd2,0x18,0xd0,0x2b,0x85,0x4d,0xdb,0xeb,0xd8,0x50,0x5d,0xcb,0x17,0x1b,0xb6,0x9b,0x79,0xcb,0x46,0xbc,0x9d,0xb,0x55,0xe5,0xcb,0x8d,0xdb,0xf9,0x72,0xe3,0xf6,0x76,0x7d,0xee,0x27,0x6b,0xab,0xb9,0xe2,0xd1,0xc5,0x8c,0x3c,0x6a,0x8,0x87,0xe,0xea,0xc5,0x37,0x5b,0x6a,0x78,0x63,0xd5,0x7a,0xaa,0x6a,0x12,0x3b,0xdd,0x32,0x14,0x56,0x3e,0x5d,0x57,0x9d,0x54,0x73,0xb2,0x8d,0x78,0xd,0x9d,0x8e,0xb0,0xad,0x2c,0x58,0xb9,0xd6,0x18,0xa2,0x1b,0xd1,0x9d,0x6,0xac,0xc2,0x26,0xbb,0xd,0x46,0xbc,0x9d,0x90,0xd2,0x7c,0xef,0xa7,0x88,0x1e,0x2,0x92,0xf,0xbc,0x69,0xb2,0xbe,0x53,0xb2,0x4,0xf8,0x9d,0x31,0x43,0x84,0x2e,0xb9,0x95,0xc1,0x98,0x82,0xc0,0x71,0x67,0x56,0x57,0x7e,0x38,0x65,0xca,0x94,0x66,0x47,0x4d,0x32,0xa7,0xf9,0xf,0x43,0xe5,0x77,0xc0,0x55,0xa6,0x18,0x24,0x3d,0x4f,0x22,0x3a,0xa5,0x74,0x92,0xef,0x73,0x63,0x8a,0x2e,0x2c,0xde,0xe1,0x8f,0xbd,0x2d,0x83,0xab,0xaa,0xd6,0x3,0x75,0xc0,0xf3,0x82,0xce,0x9a,0x97,0xef,0xfb,0x77,0xb4,0xdf,0xfe,0xb0,0xa0,0x22,0x2d,0x8c,0xb5,0x9,0xe8,0x69,0x8a,0x42,0xd2,0xb2,0xdd,0x85,0xbd,0xcf,0x9c,0xfc,0x8c,0xa8,0xc3,0xe6,0x63,0xb,0xfc,0x67,0x2b,0x72,0x19,0xb0,0xb0,0x34,0xdf,0xfb,0xbc,0x11,0x6f,0x27,0x66,0x6c,0x41,0x60,0x90,0xc2,0x9e,0x33,0x27,0xbe,0x6,0x66,0x21,0x3c,0x5f,0x3a,0xc9,0xfb,0xfa,0x6e,0x2d,0x70,0x41,0xe0,0x7d,0xe0,0xf8,0xbd,0x4,0xbb,0xe,0xf8,0x17,0x70,0x0,0x70,0x6a,0xc3,0xbf,0x6,0x67,0x7c,0xd,0x2c,0x3,0xbe,0x1,0x2e,0x6,0xf6,0xb6,0x43,0xde,0x8a,0xd2,0x7c,0xef,0x49,0xbb,0x7b,0x4d,0x81,0x33,0x51,0x2e,0x3,0x2e,0x3,0x76,0x6e,0x67,0x32,0xa3,0x34,0xdf,0x9b,0xdb,0x9d,0xc,0xd9,0xf5,0x46,0x9b,0x95,0x81,0x51,0xaa,0xa4,0x3,0x81,0x5c,0x94,0xdc,0xcc,0x82,0xc0,0x82,0xd2,0x7c,0x6f,0x7a,0x2c,0x35,0x3f,0xb6,0x7d,0x7c,0xe9,0x2d,0x19,0xeb,0x1b,0x15,0x9e,0xa1,0xa8,0x9c,0xa,0x7a,0x2a,0x70,0x72,0x83,0xa0,0x8f,0x31,0xba,0x6c,0xc2,0xca,0x6,0xa1,0x2e,0x7,0x59,0x86,0xe8,0xf2,0xd2,0x49,0xde,0xb5,0xbb,0x2a,0xda,0xe0,0x6f,0x14,0xfd,0x1c,0xe8,0xd1,0xda,0x0,0x33,0xb,0x2,0x8b,0x51,0x7e,0x10,0xe5,0xab,0xe3,0xba,0x9b,0x71,0xbb,0x9c,0x78,0x55,0xf6,0x5a,0x10,0xf6,0x89,0x31,0xc8,0xf5,0x8d,0x85,0xb,0xd0,0x50,0x0,0x4b,0x1b,0x3e,0x0,0x9c,0xfb,0xc0,0x82,0x5e,0xf5,0x2e,0xfb,0x14,0x89,0x8,0xfa,0x94,0x6,0x41,0x9f,0x4,0xa4,0x76,0x83,0x72,0x54,0x7,0xbc,0x1b,0x11,0x29,0xcb,0x14,0x59,0x9e,0x12,0xb6,0x96,0xbf,0x76,0xeb,0x39,0x2d,0xbe,0xf0,0x9e,0x97,0xef,0x59,0x9b,0x59,0x10,0xd8,0x18,0xa3,0x27,0x33,0xa0,0x99,0xeb,0x46,0xbc,0x5d,0x80,0x78,0x8b,0xa5,0x55,0x53,0x85,0x1a,0xa,0xea,0xe2,0x86,0xf,0x0,0x23,0xff,0xf8,0xa6,0xab,0xef,0xd6,0xed,0x27,0xa8,0xad,0xa7,0x21,0xdc,0xe,0xc,0xeb,0x42,0x76,0xfe,0x4,0xe5,0x5e,0xb1,0x64,0xe9,0xe6,0x81,0x7d,0xde,0x5f,0x72,0xed,0x69,0x76,0x22,0xed,0xdb,0xa,0xe,0x3a,0x7f,0xca,0x6c,0x79,0x65,0xca,0x5,0x6a,0xc4,0xdb,0x79,0xdb,0xde,0xed,0x89,0xec,0xca,0x67,0x16,0x4,0xc6,0x3,0x35,0x8,0xcb,0xd4,0xae,0x5b,0x51,0x36,0x39,0xb3,0xd9,0xcd,0xa7,0x16,0xfd,0xf2,0x8c,0x70,0x43,0x8b,0xf4,0x6e,0x66,0x41,0xe0,0x65,0x9a,0xf6,0xc5,0x5b,0x5b,0xb8,0x3f,0x4,0xb6,0x37,0x8c,0x51,0x48,0xa3,0xf1,0x8a,0x3d,0xff,0x96,0x3d,0x4,0xa1,0x7b,0xf9,0xbb,0x57,0x1b,0x5a,0xac,0xd3,0x4a,0x27,0x7b,0xb7,0xb4,0xe6,0x87,0x63,0xa6,0x96,0xa6,0x88,0x95,0x7a,0x12,0xca,0x29,0x40,0x5a,0x69,0xbe,0xf7,0x91,0x4,0x64,0xcd,0x86,0xee,0x24,0xdc,0x2e,0xda,0xe7,0x95,0xaa,0x84,0xe,0xc3,0x9,0x3f,0x46,0xf1,0xa2,0x20,0x92,0x1a,0xca,0x2c,0x8,0xac,0x68,0xdc,0xaf,0x73,0x11,0x5e,0x3e,0x27,0x3f,0xa3,0xc9,0xe9,0x5a,0x6a,0x6b,0x95,0xc4,0x7e,0x9c,0x89,0xa2,0x7a,0x59,0xe9,0x64,0xdf,0xb,0x89,0xab,0x8c,0x82,0x57,0x80,0x3e,0x43,0x8c,0x35,0x9e,0xda,0x1a,0xd5,0x25,0xfe,0x61,0x41,0x45,0xbf,0x30,0xae,0x93,0x1b,0xc6,0x3,0x76,0x7e,0x4e,0x40,0x1b,0xca,0x9a,0x50,0x1,0x24,0x42,0xbc,0x9f,0x19,0xb7,0xb9,0xb3,0x23,0x5a,0xdd,0x8e,0x83,0xe8,0xee,0x86,0xfe,0xed,0x29,0x3b,0xb5,0x16,0xc6,0xd2,0xcc,0x82,0xc0,0xaa,0x6,0x41,0xcf,0x29,0xcd,0xf7,0x3e,0x19,0xf9,0x46,0x9c,0xc4,0xaa,0x36,0x91,0xc2,0x5,0x28,0xcd,0xf7,0x3c,0x9b,0x59,0x10,0x78,0xa,0x48,0x89,0xad,0x56,0x91,0xc6,0xde,0xc8,0x75,0xc0,0x38,0xe0,0xd4,0x30,0x1c,0x1,0xda,0x11,0x6f,0x31,0x56,0x1b,0xf1,0x76,0x72,0xc2,0xa1,0xf0,0x56,0x97,0x3b,0x65,0x3,0x68,0x6b,0xf,0xe9,0x29,0x7,0xe,0x6b,0x70,0x21,0xe3,0xd3,0x36,0xc3,0x91,0xd,0x9f,0xfd,0x80,0x27,0x13,0xdd,0xdf,0x4e,0x2,0x6e,0x0,0x46,0x24,0x20,0xdc,0x6d,0xd,0xf9,0xd3,0x1a,0x8f,0xeb,0xd,0x23,0xde,0x4e,0x4e,0xf9,0x6d,0xa3,0xed,0xcc,0x82,0xc0,0xdf,0x80,0x9c,0xd6,0xb5,0x3c,0xde,0x9c,0xd1,0x33,0x17,0xde,0xe2,0xda,0x11,0x1a,0xab,0xc2,0xc5,0xc0,0x5,0x34,0x3f,0xa2,0xd9,0xa1,0x64,0x16,0x4,0xb2,0x81,0xf3,0x1a,0xf5,0x59,0x9b,0xfb,0x58,0x2d,0xf4,0x89,0x5,0x98,0x5d,0x9a,0xef,0x9d,0x99,0xa4,0x59,0xb8,0x19,0x78,0x59,0x94,0x7f,0x86,0x7a,0xb9,0xe7,0x95,0xdf,0x7c,0x76,0x5d,0x94,0xca,0x31,0x9a,0xc7,0x55,0x6e,0xc4,0xdb,0x25,0xfa,0xbd,0xbc,0x84,0x34,0x2b,0xde,0x3,0x2f,0x9d,0xbe,0xd8,0x35,0x6b,0xe2,0x99,0xdf,0x2d,0x54,0x98,0x3f,0xe1,0xec,0x5a,0xe0,0x65,0xe0,0xe5,0x71,0x5,0xe5,0x6e,0x5b,0xdc,0x19,0xa8,0x5e,0x2,0x5c,0x98,0x64,0x29,0x3b,0x16,0x18,0x1d,0x87,0x70,0x56,0x26,0x59,0xba,0xd6,0x2,0x2f,0x21,0xf2,0x4f,0x4b,0x43,0xfe,0xb9,0xf9,0xa3,0xa2,0xae,0x65,0xbc,0x74,0xfa,0x62,0xf7,0x56,0xbb,0x76,0xdf,0x66,0xfc,0x9d,0x4f,0x8d,0x78,0xbb,0x42,0xb7,0xd7,0xe2,0xc3,0x16,0x76,0x6f,0x18,0xb8,0xd5,0xae,0x7d,0x27,0xb3,0x20,0x70,0x57,0xc8,0x1d,0x9e,0x53,0x91,0x3b,0x6a,0x47,0xe3,0x2f,0x1b,0xa,0x4e,0x29,0x50,0x3a,0x66,0x5a,0xe5,0x4d,0xa2,0xf6,0x29,0x18,0x12,0xc9,0x85,0x2a,0xd6,0xf2,0xb2,0x49,0xe9,0xcd,0xae,0xfa,0xca,0x2c,0x5c,0xd0,0x8b,0x70,0xf8,0xdc,0xad,0x76,0xed,0xef,0x88,0xfe,0x9e,0x3e,0x50,0x3a,0xc9,0x5b,0x65,0xc4,0xdb,0x5,0x98,0x37,0xc9,0xfb,0xed,0x98,0xa9,0x81,0x7f,0x88,0xf0,0x93,0x66,0x7e,0x72,0x2,0xf0,0x82,0x3b,0xe4,0xaa,0xc9,0x2c,0x8,0xcc,0x5,0xfe,0x69,0xdb,0xd6,0xec,0xf9,0xb7,0xa4,0x6f,0x6d,0xfc,0xa3,0x86,0x2,0xb5,0xd4,0xe8,0x2b,0x71,0x94,0xe6,0x7b,0xa3,0xda,0x77,0xec,0x3,0xfe,0x1,0xea,0x92,0xb,0x80,0x8b,0x9,0x87,0xc7,0x2,0x69,0xcd,0xd7,0xd6,0x72,0x57,0x77,0xb4,0x5d,0xd7,0x5d,0x8c,0x6f,0x71,0x2f,0xda,0xac,0x78,0x77,0xd2,0x3,0xf8,0x11,0xf0,0x23,0xcb,0xb2,0xeb,0x33,0xb,0x2,0x15,0xc0,0x3f,0x71,0xd9,0xff,0x2a,0xcd,0xcb,0x58,0xd7,0x8c,0x4b,0x6e,0x4e,0x84,0x6e,0x5b,0x97,0xa6,0xd9,0x32,0x37,0x66,0xaa,0x7f,0x5f,0x11,0xb9,0x10,0xb8,0x44,0xc1,0xd7,0xca,0xf2,0xf9,0xd,0xe1,0xf0,0x1b,0x46,0xbc,0x5d,0x88,0xba,0x2a,0xde,0x4f,0xeb,0xcd,0x9b,0x8,0x67,0xb4,0xf2,0x96,0x14,0x60,0x2c,0x30,0x96,0xb0,0xf5,0x48,0x66,0x41,0x60,0xa1,0x20,0xff,0xc,0xdb,0xe1,0x7f,0xcd,0xbf,0x25,0xe3,0x4b,0x80,0x31,0xd3,0x2,0xbd,0x51,0x67,0xa3,0xaa,0x16,0xe1,0x30,0xb8,0x4a,0x80,0x23,0x88,0xcc,0xb4,0x1a,0x46,0x8c,0xaf,0x67,0x3a,0xda,0xa4,0xc0,0xa7,0xc0,0x2a,0x60,0x55,0x24,0x3d,0x8e,0x18,0x31,0x66,0x5a,0xa0,0x67,0xd9,0x24,0xef,0xe,0x80,0xb1,0x5,0xfe,0x43,0xc0,0xba,0x48,0xd1,0x4b,0x80,0x91,0x10,0x73,0xe5,0x98,0x53,0x7a,0x4b,0x46,0x9d,0x11,0x6f,0x17,0x22,0x38,0xc5,0xab,0x63,0xb,0x2,0x13,0xd4,0xd9,0xc2,0x7b,0x17,0xe0,0x51,0xd4,0x63,0x59,0x56,0x51,0x66,0x41,0xe0,0x2d,0xe0,0x6d,0x94,0x73,0x5a,0x74,0xdf,0x5a,0x72,0xf,0x6f,0x19,0x15,0x6,0xb2,0x77,0xb5,0x32,0xa5,0x62,0x91,0x76,0x30,0xe8,0x91,0x2a,0xdf,0x89,0x79,0xa7,0xb0,0x8f,0x4,0xfa,0x75,0x80,0xd9,0xb6,0xec,0x14,0xe7,0xce,0x8f,0x28,0xab,0x40,0x56,0xd9,0xd4,0x7e,0x59,0x36,0x39,0x33,0x1e,0xaf,0xae,0x7a,0x88,0xf2,0x7a,0x66,0x41,0xe0,0xdf,0xc0,0xe9,0xa,0xa7,0xb7,0xe1,0xbd,0xf0,0xd7,0x22,0xcc,0xe9,0xae,0x4e,0x4c,0x97,0xde,0xc3,0x6a,0x5e,0xbe,0xf7,0xad,0xcc,0x82,0xc0,0x43,0xc0,0xcd,0x6d,0x72,0xc0,0x23,0xef,0x30,0x9d,0xb4,0xb8,0x87,0x35,0xf7,0x45,0x83,0x10,0xbe,0x68,0xf8,0xf8,0xf7,0xfc,0x7e,0xdc,0xb4,0x8a,0xc1,0xb6,0x6d,0x1d,0xde,0x4e,0xae,0xec,0x48,0x97,0x15,0x5e,0x3d,0x67,0xd2,0xa8,0xf5,0xe,0x43,0x38,0x34,0xc6,0xdf,0x9f,0xdc,0xf0,0x69,0x13,0x2,0x3f,0x9a,0x37,0xc9,0xbb,0xcd,0x88,0xb7,0xab,0x22,0xfa,0x1b,0x54,0x2e,0x7,0x6,0x77,0xc0,0xd3,0xf,0xcc,0x2c,0x8,0x3c,0x24,0xe8,0x5f,0xc4,0xd6,0x55,0x73,0x6f,0xc9,0xd8,0xdc,0xda,0x1b,0xe7,0x4e,0xca,0x58,0x8f,0xb3,0xb9,0xd0,0xb1,0x7b,0x5,0x93,0xbd,0x6f,0xc5,0x7a,0xcf,0xb8,0x7,0x2b,0x6,0xa8,0x25,0xc3,0x14,0xf9,0x25,0x30,0xb4,0xdd,0xb3,0x15,0x1e,0x9a,0x97,0x1f,0x7b,0xbc,0x8d,0x78,0x3b,0x11,0xa5,0x93,0x7c,0x9b,0xc7,0x16,0x4,0x2f,0x51,0xb4,0xb2,0x3,0x1e,0x6f,0x1,0xe3,0x15,0x19,0xaf,0x96,0x90,0x59,0x10,0xd8,0xb0,0xbb,0x5b,0x2a,0x9f,0xaa,0xe8,0x2a,0xcb,0x96,0x55,0xf3,0x26,0x7b,0xbe,0x6e,0x45,0x78,0x7,0xc5,0x29,0x5e,0x7,0xb7,0xe6,0x47,0x63,0xa7,0x6,0xf,0xb4,0x2d,0x1d,0x26,0x2a,0xc3,0x40,0x77,0x73,0xed,0xed,0xbd,0x2f,0xa2,0x4f,0x24,0x5f,0x28,0x7a,0x3b,0xdd,0x1c,0xe9,0x2e,0x9,0xcd,0x2c,0x8,0x4c,0x0,0x4a,0x92,0x38,0x8a,0x35,0x7b,0xf4,0x37,0x3f,0x5,0x56,0x89,0xe8,0x2a,0xf7,0xb6,0x1d,0x9f,0xd5,0xf7,0xea,0x95,0x9,0xcc,0x8e,0xe3,0xf3,0xce,0x4d,0xd9,0xb6,0xad,0x3c,0xd4,0xa7,0xd7,0x61,0xaa,0xb2,0x53,0x98,0x7b,0xf6,0xbd,0x7b,0x24,0xa1,0x9d,0xb6,0xab,0x70,0x7c,0xd9,0x24,0x6f,0xb7,0xdf,0xcf,0xaa,0xdb,0xec,0xdb,0xac,0x5a,0xf7,0x90,0x48,0xea,0xb1,0x6d,0xec,0xff,0x26,0x92,0x1e,0x44,0xde,0x3f,0x9f,0xb0,0x7b,0xbc,0x85,0xfa,0x5e,0xbd,0x12,0xf1,0xbc,0xd7,0xea,0x7b,0xf7,0xee,0x3c,0xb3,0xa7,0x77,0x91,0x61,0x84,0xbb,0xcb,0xad,0xeb,0x16,0x94,0x4d,0xce,0x54,0x4b,0xac,0x89,0xc0,0xab,0x26,0xdb,0x3b,0x6d,0x15,0x7c,0x65,0x69,0xbe,0x77,0x89,0xb1,0x43,0x37,0x13,0x2f,0xc0,0xdc,0x49,0xe9,0x75,0xaa,0xfa,0x63,0xe0,0x19,0x93,0xf5,0x9d,0x4b,0xb5,0xa2,0x72,0x69,0x69,0xbe,0xef,0x59,0x63,0x8a,0x6e,0xd8,0xe7,0x6d,0xcc,0xd8,0xc2,0x80,0x5b,0xc3,0x14,0x2,0x13,0x4c,0x11,0x48,0x7a,0xea,0x5,0xcd,0x9c,0x97,0xef,0xb,0x18,0x53,0x74,0xe3,0x96,0x77,0x27,0xf3,0xf2,0xbc,0xa1,0x70,0x28,0x94,0x83,0x70,0xa7,0x29,0x2,0x49,0xcd,0x7a,0x90,0x11,0x46,0xb8,0xa6,0xe5,0x8d,0x4a,0x66,0x41,0xc0,0xb,0xcc,0xa2,0x63,0x5f,0x7d,0x18,0x9a,0x52,0x66,0x69,0xf8,0x27,0x73,0x27,0x8f,0xda,0x64,0x4c,0x61,0x5a,0xde,0xa8,0x94,0xe6,0x7b,0x3,0x60,0x1f,0xb,0x54,0x98,0xe2,0x90,0x34,0xfc,0xd6,0xb2,0xed,0x1f,0x1a,0xe1,0x9a,0x96,0xb7,0x75,0x2d,0xf0,0xf4,0x80,0x1b,0x25,0x7,0xe5,0x5e,0x1c,0xce,0x5f,0x36,0xb4,0x99,0xf7,0x11,0xb9,0xa1,0x74,0x92,0x67,0xb1,0x31,0x85,0x11,0x6f,0xcc,0x8c,0x79,0xb0,0x62,0x3f,0xb1,0xac,0x87,0x89,0x2c,0x15,0x34,0xb4,0xf,0xf5,0xc0,0x9d,0xaa,0x3a,0xbd,0x6c,0xb2,0xaf,0xde,0x98,0xc3,0x88,0xd7,0x31,0xc3,0x1f,0x7b,0x5b,0x6,0x55,0x55,0x9d,0x2b,0x50,0x44,0xd7,0xda,0x28,0x3d,0x19,0xf9,0x97,0x4b,0xf4,0xe6,0x39,0x93,0x7c,0xff,0x33,0xa6,0x30,0xe2,0x8d,0x5f,0x2b,0x3c,0x35,0xe0,0x16,0xf8,0x39,0xc2,0x6f,0x68,0x61,0x85,0x90,0xc1,0x11,0x73,0x10,0xbd,0xab,0x74,0x92,0xef,0x6d,0x63,0xa,0x23,0xde,0xc4,0xf5,0x87,0x1f,0xac,0x48,0xc1,0xb2,0xae,0x5,0x7e,0x43,0x2b,0x27,0xf5,0x1b,0x9a,0xa5,0x14,0xd5,0xbb,0x4a,0x27,0xfb,0xde,0x30,0xa6,0x30,0xe2,0x6d,0x37,0x7e,0x38,0xbd,0xd2,0x1d,0xb6,0xed,0x1f,0x1,0xe3,0x1,0x8f,0xb1,0x48,0xab,0xa9,0x5,0x9e,0x12,0xe1,0xe1,0x79,0x93,0xbc,0xef,0x18,0x73,0x18,0xf1,0x76,0x6c,0x6b,0x5c,0x10,0x3c,0x1e,0x74,0x3c,0x70,0x2d,0xf1,0xdb,0xb0,0xbd,0xab,0xf1,0x1,0x22,0x8f,0xa6,0xaa,0xfc,0xf9,0x95,0xfc,0xf4,0x6d,0xc6,0x1c,0x46,0xbc,0x49,0xc5,0xa8,0xfb,0x2b,0xd2,0xac,0x14,0xeb,0x2,0x89,0x1c,0xf6,0x7c,0x3e,0xe6,0x35,0xd3,0x17,0xc0,0x2c,0x54,0x9e,0xaf,0x75,0xeb,0x5b,0xc1,0x3c,0xaf,0x9a,0x52,0x62,0xc4,0x9b,0xf4,0x9c,0xfb,0x40,0x69,0x8f,0x90,0x2b,0xe5,0x42,0x90,0xcb,0x80,0x31,0x40,0x9f,0x6e,0x92,0xf4,0x55,0xc0,0x6c,0x11,0x66,0xa5,0x28,0x4b,0x5e,0xc9,0x37,0x82,0x35,0xe2,0xed,0xc4,0x8c,0x29,0x8,0xb8,0x40,0xbe,0x2f,0xe8,0x28,0x22,0xa7,0x1c,0x9c,0xd9,0x85,0xec,0xbd,0x99,0xc8,0x8c,0xb4,0xf9,0x8a,0x5d,0x5e,0x96,0x9f,0xb1,0xca,0xe4,0xb8,0x11,0x6f,0xd7,0x15,0xf3,0x3,0x15,0x7d,0x2c,0x97,0x9c,0xa3,0x30,0x1c,0xe4,0x34,0xe0,0x34,0x62,0x3b,0x11,0xbe,0xa3,0x50,0x60,0x5,0xb0,0x54,0xe1,0x6d,0xd0,0x37,0x51,0xd7,0xd2,0xb2,0xc9,0xe9,0xb6,0xc9,0x55,0x23,0xde,0x6e,0xcb,0xb8,0x69,0x95,0xfb,0x87,0x55,0x4f,0x13,0xf4,0x24,0x22,0xdb,0xbd,0x1e,0xdd,0xf0,0xef,0xbe,0x1d,0x10,0x1d,0x9b,0xc8,0xd6,0x3b,0x1f,0x3,0x1f,0xa3,0x7c,0xac,0x22,0xff,0x9,0xa5,0xda,0xff,0xf1,0x67,0xfb,0x6a,0x4c,0x6e,0x19,0xf1,0x1a,0x5a,0x41,0xe6,0xf4,0xca,0x7e,0x12,0xb6,0x8f,0x52,0xe4,0x10,0x2c,0x86,0xa2,0x3a,0x14,0x18,0x42,0x64,0x97,0xc6,0xa1,0x44,0x56,0x40,0xf5,0x88,0xf2,0x49,0x6d,0x68,0x29,0x6b,0xa2,0x7c,0xb6,0x1,0xeb,0x88,0x1c,0xea,0xb5,0x16,0x64,0x1d,0xe8,0x5a,0x15,0x59,0x6b,0x61,0xaf,0xaa,0xdb,0x6e,0xad,0xf2,0xdf,0xe9,0x9,0x1b,0xeb,0x1b,0xc,0x1d,0xc0,0x8f,0x9f,0x9f,0x65,0x19,0x2b,0x18,0xc,0x6,0x83,0xc1,0x60,0x30,0x18,0xc,0x6,0x83,0xc1,0x60,0x30,0x18,0xc,0x6,0x83,0xc1,0x60,0x30,0x18,0xc,0x6,0x83,0xc1,0x60,0x30,0x18,0xc,0x6,0x83,0xc1,0x60,0x30,0x18,0xc,0x6,0x83,0xc1,0x60,0x30,0x18,0xc,0x6,0x83,0xc1,0x60,0x30,0x18,0xc,0x6,0x43,0xdb,0xe9,0x90,0x9d,0x34,0x32,0x32,0x32,0xd2,0x34,0xac,0x67,0xa8,0x70,0x0,0x36,0x43,0x91,0xef,0x76,0x89,0xe8,0xd,0x54,0x3,0x55,0x91,0x8f,0x6c,0x11,0xf4,0x23,0x1b,0x79,0x3f,0x18,0xac,0xf8,0xb2,0x3d,0xe3,0xe8,0xf5,0x78,0xf,0x4,0x4e,0x7,0x6b,0x28,0xe8,0xce,0xf8,0xd,0x24,0xb2,0xf9,0xda,0x5a,0x60,0x1d,0xe8,0x5a,0x84,0x77,0x3,0x81,0xc0,0x27,0x89,0x8a,0x87,0xc7,0xe3,0x11,0xa0,0x7f,0xc,0xb7,0xd4,0x4,0x83,0xc1,0xa4,0xde,0xb6,0xc6,0xe3,0xf1,0xec,0x23,0xc8,0xf,0xc0,0xda,0xf,0xbe,0xdb,0x25,0x64,0x8,0x91,0xdd,0x3e,0x1a,0xdb,0x76,0xa5,0xcb,0xe5,0x7a,0xaf,0xbc,0xbc,0x3c,0x2e,0xfb,0x65,0xa5,0xa7,0xa7,0xf7,0x17,0x91,0x76,0x2b,0xf3,0x22,0x12,0xa,0x4,0x2,0xd5,0x9d,0x5e,0xbc,0xe9,0xe9,0x19,0x47,0x59,0x62,0x8f,0x5,0xc9,0x4,0xbc,0xc4,0xbe,0x51,0xf9,0x56,0x60,0x39,0xf0,0x32,0xa2,0x2f,0x4,0x2,0x81,0x2f,0xe2,0x19,0xbf,0x73,0xce,0x19,0xe3,0x72,0x5b,0x21,0xaf,0x42,0x26,0x30,0x16,0x38,0x31,0x86,0xdb,0x57,0x1,0x65,0x8,0xa5,0x5b,0xb7,0x6e,0x79,0x65,0xe9,0xd2,0xa5,0x6d,0x2e,0x6c,0x5e,0xaf,0xd7,0x85,0xca,0x3,0xc0,0xd,0x40,0xdf,0x18,0x6f,0xdf,0x1,0x6c,0x6a,0xf4,0xf9,0x0,0x58,0x8c,0xe8,0xa2,0x40,0x20,0xf0,0x71,0x47,0x8,0xd6,0xe7,0xf1,0x9d,0xae,0x30,0xae,0xc1,0xb6,0x23,0x68,0xfd,0xd9,0xd0,0xdf,0x2,0xf3,0x11,0xca,0x6c,0x3b,0xfc,0x52,0x65,0x65,0xa5,0x23,0x31,0x78,0x3d,0xbe,0xd7,0x80,0x1f,0xb6,0x73,0xb2,0x15,0xc8,0x9,0x4,0xfd,0x25,0x9d,0x52,0xbc,0x5e,0x4f,0xc6,0xb1,0xa0,0x7f,0x0,0x2e,0x8a,0x63,0xb0,0x36,0xb0,0x48,0x21,0x2b,0x18,0xf4,0xb7,0xe9,0xf8,0x8c,0xb3,0xce,0x3a,0xcb,0x4a,0x49,0x49,0xbb,0x8,0xd5,0xbb,0x63,0x14,0x6c,0x73,0xfc,0xf,0xb8,0x2b,0x10,0xf4,0xff,0xa9,0x6d,0xe2,0xcd,0xb8,0x1c,0xd5,0x7f,0x24,0x20,0x4b,0xd6,0x1,0x73,0x14,0x99,0x1e,0xc,0x56,0xbc,0x9b,0xf0,0xfc,0xf7,0x66,0x8c,0x44,0xf5,0xf7,0x44,0x8e,0x87,0x69,0x6b,0x79,0xab,0x2,0x1e,0xb4,0x35,0x3c,0xbd,0xb2,0xb2,0x72,0x7b,0x6b,0x6f,0x1a,0x35,0x6a,0x54,0xef,0x70,0xc8,0xde,0x48,0x64,0x8f,0xaf,0xf6,0xe6,0xb3,0x40,0xd0,0x7f,0x78,0xa7,0x12,0xaf,0xcf,0xeb,0x3b,0x40,0x95,0xbb,0x81,0xeb,0x62,0xa8,0x65,0x63,0xa5,0x6,0xc8,0xb,0x4,0xfd,0x8f,0x3a,0x73,0xdf,0x32,0x3c,0x82,0x4e,0x25,0xb2,0xd,0x6b,0xbc,0x59,0xad,0x70,0x5b,0x30,0xe8,0x7f,0xde,0x61,0x4b,0xb1,0x5,0xe8,0x97,0xe0,0x82,0x35,0x1f,0x91,0x69,0x81,0x40,0x45,0x69,0xfc,0x5d,0xe3,0x8c,0x63,0x5,0x9d,0x46,0xa4,0xb5,0x8d,0x77,0x39,0xdb,0xa8,0x70,0x4f,0x38,0x5c,0x5f,0xbc,0x70,0xe1,0xc2,0x70,0x2b,0x6c,0x79,0x1d,0xf0,0xe7,0x8e,0xea,0x26,0x28,0x7a,0x54,0x30,0x18,0xff,0xae,0x55,0x42,0x44,0xe5,0xf3,0x64,0x9c,0xae,0xca,0x3b,0xc0,0x2f,0x12,0x28,0x5c,0x88,0xec,0x98,0xf8,0xe3,0x58,0x6f,0x1a,0x39,0x72,0xa4,0xe5,0xf5,0xf8,0x26,0x9,0x1a,0x48,0x90,0x70,0x1,0xe,0x17,0x78,0xd6,0xeb,0xf1,0xdd,0x13,0x7b,0x6b,0x35,0xca,0xdd,0xe,0xc2,0x5,0x18,0x8d,0xea,0x3c,0xaf,0xc7,0xf7,0xd7,0x11,0x23,0xbe,0xef,0x8a,0x63,0x6b,0x7b,0x91,0xa0,0xcb,0x1a,0xdc,0xd4,0x44,0x34,0x10,0x3,0x5,0xa6,0xbb,0x5d,0x29,0x7f,0xf7,0xa5,0xfb,0x5a,0xd3,0xfd,0x3a,0xbb,0x43,0x7,0x96,0x54,0x12,0xd2,0xf2,0x5a,0xf1,0x17,0xae,0xef,0x3c,0x45,0x2b,0x81,0xc1,0xed,0x64,0x1b,0x57,0x6c,0x5,0xcb,0xdb,0x23,0x35,0x25,0xed,0xcf,0x40,0x41,0x3b,0xc4,0xcd,0x2,0xee,0xf0,0x7a,0x7c,0x2f,0xc,0x1f,0x3e,0xbc,0xd5,0xb6,0x56,0x6d,0xf7,0x81,0xc4,0xab,0x7a,0xf5,0xec,0xb5,0xd2,0xeb,0xf5,0x1e,0xd6,0xf6,0x6e,0x92,0xef,0x76,0x54,0x5f,0x68,0xa8,0x58,0x13,0xcd,0x65,0x2a,0x2c,0xf0,0xf9,0x32,0x86,0xee,0xe5,0x77,0xfb,0xd2,0xa1,0xea,0x4d,0x4c,0x45,0x1c,0x57,0xf1,0x7a,0x3d,0xbe,0x6b,0x15,0x5e,0x6,0x7a,0xb6,0xa3,0x69,0xbe,0x89,0x41,0xb8,0xbd,0x50,0x29,0x3,0xae,0x69,0xe7,0xec,0xbb,0xa4,0x5f,0xdf,0xfe,0xc9,0x7e,0x88,0xf4,0x30,0x54,0x56,0xf9,0x7c,0x19,0x87,0x3a,0xce,0xff,0x74,0xdf,0x13,0xc0,0xbd,0xb1,0x56,0xa8,0x6d,0x64,0xb8,0xda,0xfa,0xae,0x37,0xdd,0xd7,0x92,0x40,0x3b,0xfa,0xcc,0xa8,0xbe,0x49,0x2d,0x5e,0xaf,0xc7,0x77,0x6,0xf0,0xc7,0x4,0xbb,0xc9,0xd1,0x8,0xb6,0xca,0x23,0xf0,0xf9,0xdc,0xa8,0x3c,0xd1,0x81,0x2e,0xd4,0xa9,0x5e,0x8f,0xef,0xe5,0x24,0x17,0xb0,0xa5,0xb6,0x2e,0x1f,0x37,0x6e,0x5c,0x9a,0x83,0xfc,0x9f,0x82,0xf0,0xf3,0xe,0x8a,0xf7,0xbe,0x8,0xf3,0xbd,0x5e,0x6f,0x73,0x22,0xed,0xe8,0xa3,0x59,0xc2,0x49,0x2b,0x5e,0xaf,0xd7,0xbb,0xf,0xf0,0x7c,0x3b,0xd7,0xb8,0x0,0xb5,0x62,0xf1,0x4c,0x6b,0x7e,0x68,0xdb,0xfc,0x1c,0xb8,0xac,0x83,0x33,0xf1,0x7c,0xaf,0xc7,0x77,0x75,0x92,0xb,0x78,0x40,0xcd,0x8e,0xda,0xa,0xaf,0xd7,0xdb,0xea,0xb2,0x91,0x9e,0xee,0xfb,0x1e,0x70,0x7,0x1d,0x7b,0x2,0xc7,0x49,0xa8,0x34,0x37,0xbe,0x50,0xd5,0xc1,0x36,0xad,0x4a,0x5a,0xf1,0xa2,0xf2,0x8,0x70,0x68,0x7,0x18,0xe5,0x3d,0xbf,0xdf,0xbf,0xd7,0x43,0x9b,0xbd,0x1e,0xdf,0xc1,0x2,0x8f,0x25,0x81,0x30,0x4,0x78,0x64,0xdc,0xb8,0x71,0xae,0x24,0x17,0xf0,0x48,0x51,0x69,0xf5,0x40,0xa0,0x25,0x94,0x2,0xee,0x24,0x88,0x77,0x8e,0xcf,0x9b,0x71,0x72,0xd3,0xf2,0xc9,0xff,0x3a,0x38,0xd3,0xb7,0x26,0xa5,0x78,0xbd,0x5e,0xef,0x58,0xe0,0xf2,0x8e,0x30,0x8a,0xb6,0x7e,0xd0,0x69,0x72,0x7,0x78,0x5,0xcd,0xd1,0xab,0x66,0x47,0xed,0x1f,0x92,0x5c,0xbc,0x28,0x3c,0x99,0x9e,0xee,0xdb,0xab,0x20,0xbd,0x1e,0xdf,0x35,0xb4,0xdf,0xe0,0xe4,0xde,0xe3,0xad,0xfa,0x60,0x13,0xf1,0x8,0x73,0x3a,0x34,0x4e,0x22,0x1f,0x24,0x67,0xcb,0xab,0x72,0x5b,0x7,0xd9,0xe4,0xb3,0x60,0xd0,0xff,0x5c,0x2b,0xfa,0xba,0xfb,0x2,0x13,0x92,0x4c,0x1b,0x37,0x92,0xfc,0xf4,0x14,0xd1,0x53,0x5b,0xf1,0xbb,0x82,0x24,0x8b,0xf7,0x18,0xaf,0xc7,0x77,0x44,0xe3,0xb,0xbd,0xfb,0xf6,0x7e,0xd,0xd8,0xde,0x41,0xf1,0x79,0x27,0x10,0xa8,0xf8,0x26,0xe9,0xc4,0xeb,0xf5,0x64,0x9c,0xe,0xa4,0xc7,0x31,0x3e,0xdb,0x81,0xaf,0x5b,0x61,0x68,0x5b,0x91,0x89,0xad,0xab,0x89,0xf9,0x69,0x1c,0xfb,0x62,0xf1,0x2a,0x0,0xfd,0xbc,0x1e,0xef,0x65,0xc9,0xae,0x5e,0x41,0x5e,0xf4,0x78,0x3c,0x56,0xf3,0x5e,0x57,0xc6,0x59,0x44,0xe6,0x7b,0x27,0x93,0x6d,0x41,0xb8,0xa9,0xf1,0x7f,0x5f,0x79,0xe5,0x95,0x10,0xf0,0x10,0xf0,0x19,0xf0,0x79,0xb,0x1f,0x75,0xf0,0xb4,0x2f,0x5a,0x8,0xef,0x13,0xe0,0xce,0x44,0xf6,0xc1,0xda,0x20,0x5e,0xdf,0xb3,0xc0,0x4f,0xda,0xe6,0x9d,0x31,0x1b,0x78,0xc6,0x85,0xe5,0x2f,0xf,0x96,0x6f,0x68,0xe4,0x8e,0xf,0x5,0x19,0x89,0x72,0x71,0x83,0x5b,0x9e,0xd2,0xe8,0xbe,0x47,0x3,0x41,0xff,0x4d,0x7b,0xb,0xdc,0xe3,0xf1,0xf4,0x11,0xac,0x6f,0x89,0x7d,0x1e,0x75,0xe3,0xf8,0xbd,0x2a,0xf0,0x90,0xe5,0xb6,0x16,0x95,0x97,0x97,0x57,0xa7,0x9f,0x33,0x7a,0xb0,0x25,0xf6,0x68,0x44,0xb3,0x81,0xef,0xb7,0x21,0xed,0x6b,0x2,0x41,0xff,0xfe,0xd1,0xe3,0x3d,0x2a,0x45,0xb0,0xeb,0x62,0xc,0xaf,0x16,0x98,0x48,0x64,0x72,0xc7,0x60,0x22,0xf3,0x87,0xcf,0x8a,0x83,0xff,0xdc,0x27,0x50,0x19,0x7d,0x5c,0xc1,0xeb,0xf1,0x7d,0xa,0xb4,0x65,0x2,0xc2,0x1b,0x2,0x45,0xe2,0xb2,0xca,0x2a,0x2a,0xca,0x37,0x7a,0x3c,0x9e,0xbe,0x82,0x8c,0x4,0xf9,0x15,0x70,0x41,0x1b,0xca,0x67,0x58,0x60,0xb0,0x3f,0xe8,0xdf,0x1c,0x63,0x79,0xae,0x1,0xd2,0x62,0x33,0x8f,0xdd,0x2b,0x18,0xc,0xee,0xe8,0x88,0xca,0xd5,0xf1,0x20,0x83,0xc7,0xe3,0xe9,0x7,0x5c,0xda,0x86,0x67,0x7f,0x81,0xf0,0x93,0x40,0xc0,0xff,0x7a,0xb4,0x2f,0x3,0x81,0xc0,0x5a,0xe0,0x25,0xe0,0x25,0x5f,0xba,0x6f,0xa2,0xa,0x37,0x12,0x79,0x3f,0xfb,0x62,0x20,0xe8,0xbf,0xb5,0x75,0x35,0x93,0x6b,0x18,0xa8,0x53,0xe1,0xd6,0x1,0x37,0x6,0x82,0xfe,0x27,0x1b,0x5f,0xac,0x5c,0x30,0x7f,0x3d,0xf0,0xac,0xcf,0xe7,0x9b,0xa5,0x36,0x77,0x3,0xb7,0x3b,0xc,0x7f,0x9f,0x38,0xe7,0x65,0x7d,0x20,0xe8,0x7f,0xb8,0xf1,0x85,0x8c,0x8c,0x8c,0x21,0x76,0x48,0x6f,0x45,0x98,0xd4,0x6,0xdf,0xec,0x10,0x22,0xb,0x1b,0xa2,0xb1,0x7f,0x1b,0xe2,0x7b,0x2f,0xa2,0x53,0xfc,0x81,0x40,0x68,0xe7,0x85,0x60,0x30,0x58,0x5,0xcc,0x3,0xe6,0xf9,0xbc,0xbe,0xab,0x55,0xf9,0x23,0xce,0xe6,0x23,0xbb,0x80,0x23,0x80,0xff,0xd0,0x85,0x71,0xec,0x36,0xb,0xd6,0xe9,0x6d,0x18,0x4,0xfa,0x40,0x2c,0x4e,0x6b,0x4e,0xb8,0x7b,0xe2,0xaf,0xf4,0xaf,0xb,0x4,0xfd,0xf7,0x4,0x82,0xfe,0x23,0x5b,0x2b,0xdc,0x86,0x7a,0xd1,0xe9,0xd4,0x47,0x5b,0x84,0xac,0x3d,0x85,0xbb,0x5b,0x9c,0xfc,0xfe,0x90,0x62,0xdf,0x9,0x14,0x3a,0x7c,0x46,0x9a,0xd7,0xeb,0x3d,0x3e,0x91,0x99,0x5b,0x51,0x51,0xb1,0x2e,0x50,0xe9,0xcf,0x47,0x9d,0xf,0x28,0x8a,0x72,0x43,0x33,0x63,0x9,0x47,0xe3,0x70,0x16,0x95,0x40,0xb1,0x62,0xff,0x36,0xd0,0x48,0xb8,0x4d,0xec,0x1b,0xf0,0xff,0x15,0xe5,0x26,0x1c,0xbe,0xa3,0x55,0x18,0x4e,0x17,0xa7,0x2d,0x7d,0xde,0x91,0xe,0xef,0xab,0x16,0xb8,0xc4,0xef,0xf7,0xaf,0x6b,0x87,0xf4,0x39,0x2d,0xb4,0x8b,0xfc,0x1,0xff,0xe3,0x7b,0xfb,0x51,0x30,0x18,0xb4,0x2d,0xe4,0x76,0x22,0x2b,0x75,0x9c,0x94,0xb0,0x5f,0xb6,0x47,0x26,0x7,0x2a,0xfd,0xcf,0x3,0x6f,0x3b,0x14,0xc1,0x35,0x19,0x19,0x19,0x4d,0xdc,0x57,0xb5,0xd5,0xe9,0x20,0xe0,0x7a,0x11,0xb9,0x35,0x18,0xc,0xda,0xad,0x88,0xf7,0x5f,0x80,0x5,0xe,0x9f,0x73,0x89,0x11,0x6f,0xf3,0x8c,0x71,0x78,0xdf,0x53,0xfe,0xa0,0xff,0x83,0x44,0x27,0xcc,0xe3,0xf1,0xf4,0x0,0x7c,0x4e,0xdc,0x65,0xc5,0x6a,0xf5,0x60,0x52,0x45,0xb0,0xa2,0x6,0x7,0x8b,0x23,0x1a,0xda,0xa0,0x8b,0xdb,0x2b,0xa3,0x15,0xf9,0xa9,0xc3,0x5b,0x7,0xd8,0x21,0x8d,0xe2,0xba,0xca,0x25,0x4e,0xd3,0x5c,0x11,0xa8,0xa8,0x69,0x7d,0xbc,0xed,0xcb,0x80,0x7a,0x7,0xf,0xf2,0x65,0x64,0x64,0xa4,0x1a,0xf1,0xee,0x41,0x46,0x46,0x46,0x4a,0xc3,0x80,0x48,0xcc,0xfd,0x32,0xb1,0x68,0xa7,0x77,0x9c,0xd6,0x81,0xe,0xdd,0xfa,0x55,0xc1,0x60,0xf9,0x9a,0x18,0xa5,0xb1,0x14,0x67,0x23,0x95,0x3,0xda,0x2b,0xa3,0x83,0xc1,0x8a,0x8f,0x1c,0xbb,0xa0,0x12,0xd5,0x8e,0xfd,0x1c,0x5,0x25,0xba,0x34,0xb6,0x78,0x7,0xd7,0xa1,0xac,0x72,0xf0,0xac,0x14,0xdb,0x6e,0x53,0x9f,0xbc,0x6b,0x8a,0x57,0xc3,0x3a,0x0,0x67,0x83,0x5d,0x1f,0xf8,0xfd,0xfe,0xaf,0xdb,0x23,0x61,0x82,0x38,0x9d,0x8c,0xfe,0x5c,0xac,0x37,0x4,0x82,0x81,0x6d,0x40,0x99,0x83,0x67,0xb5,0xf7,0xac,0x24,0x75,0x66,0xcb,0xa8,0xe2,0x75,0x12,0xf7,0x97,0xfd,0x1,0xff,0x76,0x7,0x11,0x70,0x36,0x27,0x5c,0xb5,0xb7,0x11,0x6f,0xfc,0x5a,0x8c,0xff,0xb6,0x57,0xc2,0x4,0x75,0xb6,0xb2,0x49,0xe4,0x55,0x87,0xf,0xfc,0xa7,0x83,0xbb,0xda,0x7b,0xd6,0xd7,0x57,0xe,0xc5,0x6b,0xc5,0x25,0xee,0x22,0x2f,0x39,0xb3,0xad,0xbe,0xe2,0x30,0xbd,0x3d,0x8c,0x78,0x9b,0x54,0x68,0x8e,0xc5,0xfb,0x51,0x3b,0x36,0x31,0x4e,0xc4,0x1b,0x1a,0x3c,0x78,0xe0,0x7f,0x9c,0x95,0x2f,0x58,0x74,0x8b,0x17,0x0,0x0,0x13,0xdf,0x49,0x44,0x41,0x54,0x59,0x98,0xf4,0x2d,0xaf,0xf2,0x99,0x43,0x5b,0xc6,0xa5,0xe5,0x15,0x78,0xdd,0x91,0x2,0x7b,0xf4,0x58,0xe2,0xc8,0xe5,0xd7,0x76,0x5d,0x9a,0xda,0xee,0x38,0x2d,0x3c,0xe,0xc5,0xab,0x1b,0xf6,0xf6,0xb,0x8f,0xc7,0xe3,0xb2,0xb0,0xe,0xb5,0x91,0xa1,0x16,0xba,0x8f,0x2a,0x3,0x44,0xd8,0x47,0x23,0xcf,0xc,0xa3,0x6c,0x41,0x74,0xa3,0xa8,0x7c,0x64,0xa5,0x58,0x1f,0x95,0x97,0x97,0x37,0xe7,0x86,0x39,0x79,0x8f,0x5a,0x33,0x6b,0xd6,0x2c,0x75,0x56,0xc0,0xb5,0xd6,0x49,0xcb,0x7b,0xe9,0xa5,0x97,0xba,0x66,0xcd,0x9a,0x15,0x6e,0x8f,0xcc,0x16,0x61,0x9d,0x3a,0xcb,0xb7,0x7e,0xc0,0xc6,0x9d,0xff,0xf3,0xf9,0x7c,0x3,0xd4,0x8e,0x7d,0x2,0x85,0xda,0x8e,0x6c,0xc4,0xdc,0xb9,0x73,0xc3,0x5e,0x8f,0xaf,0x2e,0xd6,0x96,0x54,0x2c,0xe9,0x65,0xc4,0xdb,0xb4,0x10,0xf4,0x70,0x56,0x8,0xd8,0xd4,0xd2,0x97,0x5e,0x8f,0xef,0xaf,0xc0,0xe5,0xa,0xa9,0x82,0x46,0x3a,0x68,0xb2,0x47,0x47,0x4d,0x1a,0x9c,0x62,0x81,0x70,0xc8,0xae,0xf3,0x7a,0x7c,0xaf,0x20,0x3a,0xb1,0xc9,0x6e,0x92,0xc2,0x7e,0xe,0x7a,0x78,0x75,0x4e,0xd,0xa9,0x10,0x72,0x32,0x1d,0x68,0xc3,0x86,0xd,0xfb,0x3b,0x75,0x67,0x1d,0x78,0x4c,0x9b,0x9c,0xcd,0x59,0x92,0x3d,0x67,0x10,0x1d,0xec,0xb0,0xf6,0x8,0xb5,0x21,0xfa,0xf5,0xb1,0x8a,0x57,0x55,0x87,0x1a,0xf1,0xee,0x81,0xd,0x5b,0xc5,0x51,0x1,0xdf,0xdb,0x20,0x92,0x1e,0x0,0x12,0xcb,0xf0,0x7e,0x2a,0x70,0x9,0x2a,0x5b,0x80,0xeb,0xe3,0x25,0x44,0x67,0xfd,0x42,0x11,0x27,0xe3,0x41,0xed,0xb8,0x8d,0x30,0x88,0xf4,0x73,0x38,0x66,0x55,0x17,0x1f,0xdb,0xda,0xd2,0x26,0x13,0x1b,0xda,0xde,0xe7,0x15,0xc4,0xd1,0xfa,0x44,0x51,0x6,0x25,0xa8,0x2f,0x27,0x51,0xae,0xad,0x71,0x10,0x92,0xf3,0xf7,0x82,0xaa,0x4e,0x2a,0x42,0xdd,0xbc,0x79,0x73,0x3b,0xae,0x35,0xb5,0x9d,0xda,0xdf,0xde,0xa3,0xc2,0x71,0xb6,0x67,0xb6,0x4a,0x5b,0xfa,0xf8,0x31,0xe7,0x8d,0x88,0xac,0x35,0xe2,0x6d,0x22,0x42,0xdd,0xe2,0xb0,0xee,0x3c,0x24,0x41,0xcd,0x5e,0xb4,0x97,0xf8,0x4e,0x76,0x2f,0xe8,0x71,0xe9,0xa5,0x97,0x3a,0x1b,0x81,0x17,0x75,0xd2,0xc7,0xe,0xc7,0x63,0x83,0xf6,0x18,0x22,0x79,0xb0,0x33,0xf3,0xee,0x2e,0xde,0x8a,0x8a,0x8a,0x1d,0x38,0x18,0x40,0x12,0x4b,0x1c,0xd,0x20,0x79,0x3c,0x9e,0xbe,0xec,0xbe,0x30,0xa5,0xb5,0x7d,0xec,0xed,0x46,0xbc,0x4d,0x9c,0x1f,0xdb,0xe9,0xce,0x0,0x27,0x26,0x28,0x1d,0xa1,0x28,0x2d,0xaf,0x93,0x8c,0x73,0xaf,0x5f,0xbf,0xfe,0x74,0x87,0x71,0x18,0xe7,0x44,0xbc,0xed,0x9c,0xdf,0xc3,0x1c,0x3a,0x36,0xe1,0x56,0xd9,0x7c,0xef,0x7d,0xd0,0x73,0x1c,0x7a,0x7a,0x19,0x8e,0xdc,0x66,0x61,0x87,0x11,0xef,0x9e,0x37,0x59,0xd6,0x16,0x9c,0x75,0x9e,0x4e,0xc8,0xc8,0xc8,0x48,0x8b,0x7b,0x2a,0xb4,0x69,0xcb,0x2b,0x4e,0x33,0x4e,0x2d,0x87,0x27,0x3b,0x88,0x93,0xf5,0xb9,0xa1,0xce,0x90,0xdf,0x88,0x86,0xe3,0x54,0xf1,0x38,0x9d,0x52,0xf9,0x23,0x87,0xe9,0xad,0x31,0xe2,0xdd,0x3,0xbf,0xdf,0x5f,0xf,0x7c,0xe8,0xe0,0xd6,0x7e,0x76,0x48,0xe3,0xbf,0x8b,0x44,0x14,0xb7,0xd9,0x76,0xbc,0x6f,0x90,0xc6,0x3c,0xdf,0xd8,0xeb,0xf1,0xd,0x74,0xe8,0x55,0xb4,0x9b,0x78,0x1b,0xe6,0x7a,0x3b,0x19,0xf4,0xd9,0xa6,0x1a,0x75,0x6d,0xb1,0x93,0xf9,0xc6,0x63,0x3c,0x9e,0xc,0x27,0xdb,0xa0,0x7a,0x9d,0x95,0xb,0xd9,0x66,0xc4,0x1b,0x9d,0xa0,0x43,0xa1,0x4d,0xc8,0xcc,0xcc,0x4c,0x6d,0xa6,0x4f,0x74,0xb1,0x62,0xf,0xd9,0xf9,0x21,0xb2,0x9e,0xd7,0x91,0x8,0xc2,0xe1,0xfa,0xaf,0x89,0x9c,0x38,0x18,0x2b,0x87,0xfb,0xd2,0x7d,0x87,0xc5,0x56,0x46,0xb8,0xd0,0xa1,0xd,0xd7,0xb7,0x5b,0x6f,0x57,0xac,0x89,0x8e,0xc4,0xab,0xbc,0x14,0xc,0x6,0xa3,0x79,0x59,0x6b,0x1c,0x15,0x38,0xd5,0x98,0xb6,0xde,0xcd,0xf0,0x66,0x8c,0x0,0xe,0x74,0xf0,0xa8,0xda,0x50,0x48,0xbf,0x31,0xe2,0x8d,0x9e,0xa9,0x8b,0x1d,0xde,0x79,0x54,0x5d,0x6d,0x7d,0x71,0x33,0x2d,0xfa,0xd6,0x60,0x30,0xb8,0x7e,0xe7,0x7,0x55,0x6d,0x65,0x5c,0x9a,0xb4,0x2,0xb,0x17,0x2e,0xc,0xb,0x38,0x99,0x56,0x97,0xa2,0x42,0xab,0xcf,0x17,0xf2,0x79,0x7d,0x3,0x54,0x79,0xdc,0xa1,0xa4,0x9e,0x69,0xb7,0x9c,0x56,0xa6,0x38,0x2b,0x21,0xfa,0xb7,0xe8,0x75,0x30,0x4f,0x3a,0x8a,0x86,0xf0,0x9c,0xcf,0xe3,0x6b,0xf5,0x9c,0x63,0x5b,0xf5,0x19,0x67,0xe5,0x54,0xca,0x16,0x2e,0xf4,0xd7,0x19,0xf1,0x46,0xbf,0xb3,0x2d,0xbb,0x14,0xdc,0xe0,0xf5,0xf8,0xf6,0xba,0x3,0x85,0x48,0xeb,0x5e,0x2d,0x88,0x44,0x77,0x3f,0x15,0x79,0xd1,0x61,0xfc,0x4e,0xf3,0x7a,0x7c,0xbf,0xdf,0xab,0x70,0xd3,0x7d,0x3d,0x54,0x79,0xd,0xa7,0x93,0x5d,0x2c,0xfd,0x63,0xfb,0xb8,0xcc,0xbe,0xbb,0x71,0x30,0x5a,0xdb,0xa0,0xb6,0x25,0xd1,0x2f,0xa7,0xfc,0xc9,0xe1,0xb8,0x47,0x1f,0x85,0xbf,0x79,0xbd,0xde,0xd6,0xec,0x4c,0xf9,0x17,0x1c,0xe,0xb2,0x21,0xbc,0x40,0x17,0xc7,0xb1,0x78,0x55,0xed,0x95,0x44,0xe,0x9a,0x76,0x66,0x5a,0xb8,0xd7,0xeb,0xf1,0x3d,0xe1,0xf3,0xf9,0xa2,0x6e,0x60,0x36,0x7c,0xf8,0x70,0x51,0x38,0xa6,0x75,0x8d,0x8a,0x34,0xd3,0xff,0xb2,0xff,0xdb,0x86,0xf8,0xdd,0xee,0xf5,0xf8,0x8a,0x7e,0xf0,0x83,0x1f,0x44,0x2d,0x64,0x19,0xbe,0x51,0x7,0x6a,0x64,0xbf,0xe2,0x33,0x1d,0x3e,0x63,0x87,0xdf,0xef,0x8f,0xe7,0xcc,0xaa,0xb4,0x66,0x3c,0x83,0x6b,0x4,0x7e,0xdb,0x6,0x7f,0x3b,0xea,0xc0,0x5f,0x20,0x50,0xba,0xe,0x1c,0x8f,0xe6,0x5e,0x84,0xca,0xb,0xe9,0xe9,0x9e,0xa8,0xd3,0x6c,0x47,0x8f,0x1e,0xdd,0xcb,0xeb,0xf1,0x3d,0x4d,0x5b,0x8e,0xa5,0x51,0x96,0x77,0x75,0xf1,0x3a,0x7e,0x69,0x1e,0xc,0x6,0xc3,0x5e,0x8f,0xef,0x51,0xa0,0x2d,0x5b,0xbf,0x5e,0xa3,0x36,0x17,0x79,0x3d,0xbe,0xbf,0x23,0xcc,0x51,0x8d,0x4c,0x13,0x14,0xd5,0x83,0x10,0xb9,0x92,0x56,0x8a,0x17,0xd1,0xa8,0xe2,0xd,0xdb,0xae,0x55,0x2e,0xcb,0xfe,0x6,0x67,0x7b,0x2d,0x59,0x40,0x4e,0x8f,0xb4,0x9e,0x57,0x78,0x3d,0xbe,0xbf,0xa3,0x2c,0x53,0x61,0xbd,0x20,0x7,0x83,0x7a,0x6d,0xdb,0xbe,0xd8,0x71,0x6b,0x16,0x21,0xde,0x93,0x33,0xac,0x5d,0x2d,0xad,0xc7,0x2d,0xea,0x1a,0x8d,0xe8,0x8d,0xaa,0x8e,0xfb,0xe3,0x80,0xfc,0x25,0x10,0xa8,0x68,0xc9,0xf5,0x5c,0x1,0x9c,0xe1,0x30,0xf0,0xb,0x2d,0xb1,0xbe,0xf2,0x7a,0x7c,0xcf,0xa3,0x2c,0x52,0xe1,0x7f,0x82,0xec,0x7,0x3a,0x22,0x54,0x1f,0xbe,0x92,0xb6,0x9d,0xef,0x53,0xa3,0xf0,0xa9,0x11,0x6f,0xcb,0xcd,0xef,0xe3,0x88,0xdc,0x42,0xdb,0x6,0xbe,0x6,0x0,0xe3,0x51,0xc6,0x4b,0x23,0x3f,0x38,0xa6,0x22,0xa6,0xd1,0x47,0x3e,0x17,0x2c,0x28,0xaf,0xf3,0xa4,0xfb,0x26,0x89,0xf0,0xf7,0x36,0xc4,0x6f,0x28,0x90,0x8b,0xec,0x1c,0xed,0xd1,0x78,0xd8,0x5d,0x41,0xaf,0x8d,0x73,0x5e,0xba,0xbc,0x1e,0xdf,0x56,0x22,0xaf,0x47,0x86,0x20,0x6d,0x8f,0xa7,0xad,0xe1,0x5b,0x5b,0xfe,0x9e,0x9f,0x58,0xc2,0x27,0x6d,0xc8,0xff,0xde,0xc0,0xb5,0x8,0xd7,0xc6,0xd1,0xb6,0x0,0x53,0x82,0xc1,0x8a,0xea,0xae,0x2e,0xde,0x36,0xed,0xdb,0x1c,0xa8,0xc,0xac,0x6,0x5e,0xec,0xe8,0x44,0x68,0x4b,0xaf,0x2d,0x84,0xd7,0x48,0xbe,0xf7,0x7d,0x1b,0x3,0xc1,0xc0,0xc2,0x4,0x84,0xdb,0x17,0x18,0x12,0xa7,0xb0,0x36,0x58,0x96,0x6c,0x6c,0xe9,0x7,0x95,0x95,0xfe,0xd5,0xc0,0x97,0x49,0x57,0xaa,0x85,0xbf,0xd2,0xd,0x88,0xc7,0x59,0x45,0x33,0x92,0x20,0xb3,0x42,0xcd,0xbb,0xf7,0xfe,0xad,0xa,0x77,0x27,0x57,0xd9,0x4a,0xdc,0x46,0xdc,0x71,0x8b,0xa3,0xc8,0xd5,0x81,0x40,0x60,0xaf,0x53,0x20,0x15,0xbd,0x2e,0xc9,0xa2,0xfe,0xc7,0x40,0xc0,0xff,0x8d,0x11,0x6f,0x6b,0x5a,0xdf,0xa0,0x7f,0x11,0xb4,0xfe,0xd5,0x4a,0x82,0x9a,0xde,0xfa,0x96,0xdd,0x6a,0x7d,0x1c,0xf8,0x36,0x49,0x6c,0xbe,0xd9,0x1f,0xf4,0x3f,0x92,0xe4,0xe5,0xe2,0x4d,0x5b,0x65,0x5e,0xeb,0xc6,0x3e,0x2,0x7e,0xe0,0x9d,0x24,0x89,0xb7,0x2a,0xfc,0x81,0x6e,0x42,0x7c,0x4e,0x9,0xb4,0x35,0x1b,0xd8,0xd0,0x51,0x89,0x90,0xbd,0xcc,0xf6,0x9,0x54,0x6,0x36,0x22,0x8e,0xe6,0x1e,0xc7,0x9b,0xb0,0xa2,0xe7,0x27,0x79,0x99,0x50,0xdb,0xe,0x67,0x4,0x83,0xe5,0xad,0x5e,0x78,0x20,0x16,0x67,0xe1,0x6c,0x42,0x4c,0xbc,0xc9,0x9,0x6,0xfd,0xab,0x8d,0x78,0x63,0x69,0x7d,0x17,0x4,0xbe,0x15,0xb8,0x10,0x67,0x53,0xe6,0xda,0x5e,0xda,0x5a,0xb1,0xc8,0x3b,0x10,0xf0,0x2f,0x93,0x8e,0x3f,0x70,0xac,0x20,0x18,0xc,0xfc,0x3b,0xb9,0xa5,0xab,0x97,0x55,0x2e,0xa8,0x8c,0x49,0x88,0x7e,0xbf,0xbf,0x5a,0x22,0xb,0x33,0x42,0x1d,0x18,0xf3,0x97,0xc3,0xb6,0xf5,0x28,0xdd,0x88,0xb8,0x9d,0x62,0xef,0xf,0xfa,0x17,0x21,0x5c,0x49,0x3b,0x2f,0x82,0x6f,0x28,0x70,0xad,0xaa,0x34,0xea,0xc3,0xf5,0x8f,0xa2,0x3c,0xdd,0x41,0xb6,0x7e,0x3a,0x10,0xf4,0xdf,0x96,0xe4,0xe5,0x21,0xd7,0x72,0x5b,0x2f,0x3a,0xcc,0xff,0x7f,0xa3,0xdc,0x45,0xc7,0x9c,0x42,0xbf,0x58,0x91,0x9f,0x2e,0x58,0x50,0x5e,0x6f,0xc4,0xeb,0xb4,0x5,0xe,0xf8,0x5f,0x0,0xf1,0xd0,0x8e,0x73,0x76,0x63,0x11,0xef,0xc2,0x85,0xb,0xc3,0x2a,0xf6,0x35,0x88,0xc3,0xa9,0x82,0xe,0x5d,0x65,0xe0,0x8e,0x40,0xd0,0x7f,0x75,0x72,0xb7,0xb8,0x5c,0x11,0x8,0xfa,0x67,0x54,0x54,0x54,0x38,0x7e,0x5f,0x13,0xa8,0xf4,0xdf,0x27,0xc2,0x55,0xed,0x5c,0x81,0x3f,0x81,0x68,0x46,0x30,0x58,0xb1,0x8d,0x6e,0x86,0x15,0xef,0x0,0x3,0xc1,0x8a,0xd7,0x11,0xce,0xa0,0x1d,0xb7,0x79,0xc5,0x6a,0xfd,0xde,0x48,0xc1,0x60,0xd0,0xe,0x4,0xfc,0x77,0x6b,0xe4,0x74,0xc3,0x44,0xaf,0xa7,0xdd,0x1,0x72,0x51,0x20,0xe8,0xbf,0x2f,0xc6,0x3e,0x7c,0x7b,0xf2,0x99,0x82,0x2f,0x50,0xe9,0xff,0x47,0x5c,0x3c,0xb0,0x80,0xff,0xef,0xa,0x67,0x3,0x5b,0xda,0x21,0xee,0xb9,0x29,0xa9,0xee,0xeb,0x3,0x81,0x40,0xd,0xdd,0x10,0x2b,0x11,0x81,0x6,0x2,0xfe,0xd5,0x96,0xca,0x8,0x22,0xd3,0xf2,0xaa,0x12,0x9c,0x6,0x55,0x8d,0x7d,0xf9,0x5f,0x30,0xe8,0x7f,0x4e,0x84,0x13,0x71,0xb6,0x78,0x61,0x6f,0xd8,0xc0,0x73,0x88,0x1e,0x1f,0x8,0x56,0xc4,0xbc,0xf,0x74,0xd8,0xb6,0x42,0xed,0xd0,0x7a,0x6d,0x4,0xc6,0x5b,0x2a,0x47,0x4,0x83,0xfe,0x40,0x3c,0x3,0xe,0x6,0xfd,0x6f,0x5a,0x2e,0x39,0x12,0x78,0x3c,0x41,0x15,0x64,0x25,0xe8,0xf7,0x3,0x41,0xff,0x8c,0xb2,0xb2,0x32,0xa5,0x9b,0x92,0xf0,0x4a,0xde,0xe7,0x1b,0x35,0x58,0x6d,0xfb,0xe,0x60,0x3c,0x6d,0xd9,0x23,0xaa,0x29,0x5b,0x81,0xd9,0xa,0xd3,0x83,0x41,0xff,0xb2,0xb6,0x4,0xe4,0xf1,0x64,0x8c,0x14,0xf4,0xf,0x44,0x5a,0x8c,0xb6,0x8a,0xf6,0x25,0x81,0xbb,0xfd,0x41,0xff,0x7b,0x6d,0x9,0xc8,0x9b,0xee,0xcb,0x46,0xe2,0xfe,0xe,0xbd,0x1a,0x28,0x7,0xe6,0x2b,0xf6,0x63,0xc1,0x60,0x30,0xe1,0x3b,0x79,0x78,0x3c,0x19,0x47,0xb,0x7a,0xf,0x91,0x85,0xf8,0x6d,0x6d,0x2c,0x16,0x83,0xde,0x35,0x78,0xc8,0xe0,0xa,0xa7,0x5b,0xf4,0xb6,0x68,0x73,0x8f,0x6f,0x3b,0xb1,0xed,0xf7,0x6d,0x37,0x9c,0xcf,0x5b,0xdb,0x25,0xc5,0xbb,0x93,0x8c,0x8c,0x8c,0xfe,0xe1,0xb0,0x8e,0x16,0x18,0x4b,0xe4,0x73,0x60,0x8c,0xa2,0xf8,0x1c,0x58,0x9,0xbc,0x89,0x48,0x69,0x8f,0x1e,0xa9,0x4b,0xe6,0xce,0x9d,0x1b,0xb7,0xc1,0x91,0x71,0xe3,0xc6,0x49,0xed,0xf6,0xda,0xe3,0x10,0xc6,0x69,0x24,0x7e,0xe9,0xb4,0x6e,0xee,0x72,0x15,0x30,0x1f,0xa5,0x4c,0x45,0xca,0x82,0xc1,0x8a,0xb8,0xbc,0xaa,0xc8,0x48,0xcf,0xb0,0x6c,0xf4,0x46,0x84,0x4b,0x80,0x43,0x62,0x28,0xf8,0x4a,0x64,0xc1,0xc8,0x7a,0x22,0xaf,0xef,0xd6,0x3,0x6b,0x11,0x9,0x4,0x2,0x15,0xaf,0xd3,0x41,0x64,0xa4,0x67,0x1c,0xa2,0xa2,0x63,0x15,0x32,0x89,0x1c,0x52,0xd7,0x9a,0xe3,0x68,0xea,0x80,0x4a,0x81,0x32,0x15,0x2d,0xab,0xa9,0xa9,0x79,0xef,0xf5,0xd7,0x5f,0x4f,0x58,0x4b,0xeb,0xf5,0xf8,0xae,0x5,0xae,0x6,0xe,0x22,0xb2,0xef,0xf7,0x0,0x76,0xdf,0x70,0x3e,0xd4,0x60,0xdb,0x4d,0xd,0xe5,0xf1,0xf1,0x40,0xd0,0x3f,0xab,0xcb,0xb6,0xbc,0xd1,0x18,0x3e,0x7c,0xb8,0xf4,0xed,0xbb,0xcf,0x30,0xb,0x7b,0x3f,0x15,0x86,0x60,0x33,0x4,0x61,0x8,0x8a,0x85,0x50,0xd,0xb2,0xd,0xa8,0x46,0xa9,0x12,0xf4,0x73,0x57,0xaa,0xeb,0xe3,0xf9,0xf3,0xe7,0xb7,0xeb,0x7e,0x44,0xe9,0x67,0xa5,0xf7,0x10,0xb7,0xfb,0x58,0xd0,0xa1,0xc0,0x10,0x41,0x87,0x82,0xf4,0x3,0x36,0x28,0xac,0xb3,0x60,0x9d,0x8a,0xae,0x1d,0x3c,0x78,0xf0,0xfb,0x89,0x68,0x5,0xba,0x32,0xc3,0x87,0xf,0xb7,0xfa,0xf6,0x1d,0x70,0x1c,0xe8,0xbe,0x8d,0x6c,0x3b,0x10,0xd8,0xd2,0xc8,0xb6,0xeb,0x52,0xac,0x94,0xff,0x96,0x55,0x94,0xd5,0x76,0x54,0x3c,0x2f,0xbd,0xf4,0x52,0x59,0xbf,0x7e,0x7d,0x3f,0x94,0x3e,0x2e,0xb7,0xab,0x6a,0xd3,0xa6,0x4d,0x55,0x4b,0x97,0x2e,0x35,0x79,0x6d,0x30,0x18,0xc,0x6,0x83,0xc1,0x60,0x30,0x18,0xc,0x6,0x83,0xc1,0x60,0x30,0x18,0xc,0x6,0x83,0xc1,0x60,0xe8,0x68,0x5c,0xc6,0x4,0x86,0xf6,0x60,0x42,0x6e,0xee,0x61,0xc3,0x87,0x8f,0xb4,0xdf,0x7e,0xeb,0xf5,0x5a,0x63,0x8d,0xf8,0x60,0x19,0x13,0x18,0xda,0x3,0xb1,0x65,0x55,0x8a,0xcb,0xbe,0xde,0x58,0x22,0x7e,0xb8,0xbb,0x42,0x22,0xc6,0x8f,0x1f,0x6f,0xb9,0x5c,0x69,0x17,0x21,0x5c,0xb,0x9c,0x6,0xf4,0x3,0x3e,0x3,0x3e,0x2,0xfe,0x52,0x52,0x5c,0xf8,0x8a,0xc9,0x6a,0x83,0x69,0x79,0x93,0x8c,0x9c,0x9c,0x49,0x3d,0x5d,0xee,0xb4,0x7f,0x20,0xbc,0x48,0xe4,0xb0,0xaf,0x32,0xe0,0x7e,0xe0,0xdf,0xc0,0x11,0xc0,0xec,0xac,0xec,0xbc,0x97,0x4c,0x56,0x77,0x30,0x2a,0xc3,0x6d,0xdb,0xfa,0x9b,0x31,0x44,0x1c,0xbd,0x99,0xce,0x9e,0x80,0xac,0xec,0xbc,0x62,0x22,0xdb,0xdb,0x94,0xd4,0xd6,0x6c,0x9b,0xf4,0xf8,0xe3,0x8f,0x87,0x76,0x9,0x3b,0xc7,0x6d,0xab,0x35,0x11,0x78,0x0,0xb8,0xaf,0xa4,0xb8,0xf0,0xe,0x93,0xe5,0x6,0x23,0xde,0xe4,0x10,0xee,0x91,0xc0,0xc7,0xc0,0xe2,0x92,0xe2,0xc2,0x91,0x51,0x7f,0x93,0x95,0x65,0x21,0xee,0x57,0x81,0x33,0x4b,0x8a,0xb,0x7,0x98,0x2c,0x37,0x18,0xb7,0x39,0x39,0x6a,0x9e,0xb3,0x0,0x6c,0x25,0xab,0xb9,0xdf,0x94,0x94,0x94,0xd8,0xc0,0x54,0xa0,0x7f,0x76,0x76,0xde,0xe1,0x26,0xcb,0xd,0x5d,0x85,0x4e,0x3d,0x60,0xa5,0x30,0x1c,0xa8,0x7a,0xa8,0xa4,0x70,0x2f,0x27,0x16,0xca,0x47,0xa0,0x4f,0x1,0xfb,0x1,0xab,0x9b,0xb6,0xe0,0x13,0x8f,0x1,0xbd,0x1d,0x38,0xa1,0xc1,0x26,0xef,0xa1,0x94,0x94,0x94,0x14,0xbe,0x19,0xa5,0xb5,0xbf,0xb,0xe8,0x59,0x52,0x5c,0x78,0x5b,0x56,0xf6,0x44,0xf,0xe8,0x2d,0xc0,0x91,0xc0,0x1a,0x84,0xc7,0x4a,0x66,0x14,0x3e,0x3,0x30,0x61,0x42,0x6e,0x8a,0x58,0x92,0x43,0x64,0x11,0x7a,0x1f,0x60,0x91,0xcb,0xd2,0xdb,0x8b,0x8a,0x8a,0xa2,0x9e,0x42,0x30,0x7e,0xe2,0x44,0xb1,0x42,0x7a,0x83,0xc0,0x68,0xe0,0x64,0xe0,0x3d,0x60,0x41,0x49,0x71,0x61,0x51,0xcc,0x1e,0x49,0xce,0xc4,0x4b,0x50,0xbd,0x8,0xf8,0x7e,0x83,0x67,0xf2,0xb6,0xa,0x77,0xcd,0x9c,0x51,0xa8,0x7b,0xa4,0xe5,0xf,0xc0,0xfe,0x25,0xc5,0x85,0xd7,0x64,0x65,0xe5,0x9e,0x8c,0xc8,0x94,0x6,0x1b,0x7c,0x1,0x1a,0xb0,0x2d,0xfe,0xf0,0x50,0x51,0x51,0xd4,0x35,0xd3,0x13,0xb2,0x27,0xa6,0xb,0x3a,0x19,0x38,0xe,0xd8,0xa4,0xf0,0x12,0x22,0xf,0x12,0x96,0x11,0x62,0xd9,0xbf,0x50,0xdb,0xfa,0xd5,0xcc,0x99,0xd3,0x6a,0x1a,0x3d,0xeb,0x2f,0x28,0xcf,0x95,0x94,0x14,0x96,0xee,0x8a,0x67,0xde,0x9d,0x28,0x47,0x94,0x14,0x17,0x5e,0x9b,0x95,0x93,0x77,0x22,0xca,0x6f,0x80,0x53,0x88,0x9c,0xe3,0xe4,0x77,0x59,0x7a,0x7f,0x51,0x51,0x51,0xd4,0x2d,0x8e,0x72,0x73,0x73,0x7,0x84,0x6d,0xb9,0x85,0x48,0x5,0xde,0x1b,0xf8,0x8f,0xa,0x33,0x67,0xce,0x28,0x7c,0xa7,0xbb,0x88,0xb7,0xb3,0xf,0x58,0x9d,0x46,0x2b,0xf6,0x8b,0x2e,0x29,0x9e,0xfe,0x75,0x49,0x71,0xe1,0x35,0xc5,0xc5,0x85,0xaf,0x37,0x15,0x63,0xee,0x15,0xa0,0xff,0x25,0xb2,0x48,0x7c,0x45,0x83,0x68,0x46,0x21,0x2c,0x9a,0x90,0x9d,0x97,0x1d,0x25,0xb8,0xf3,0x80,0xcb,0xb2,0xb2,0xf3,0x2e,0x6,0x9d,0x43,0x64,0x77,0x8a,0xa5,0xc0,0x49,0x28,0x4f,0x67,0x65,0xe7,0xdd,0x9c,0x9d,0x3d,0xd1,0x2d,0x96,0xcc,0x2,0x26,0x3,0xab,0x80,0xaf,0x80,0x1b,0xc3,0xb6,0x7c,0x38,0x61,0x42,0x7e,0xff,0xa6,0xae,0xfd,0x44,0xb7,0x2b,0xa4,0x4f,0xa,0x3c,0x42,0x64,0x93,0x82,0x52,0x22,0x87,0xa3,0x15,0x66,0x65,0xe7,0xc5,0xb4,0x9b,0x63,0x56,0x76,0xde,0x3d,0xa8,0xbe,0x0,0x9c,0xd4,0x10,0x4e,0xf,0xe0,0x4e,0x51,0x96,0x5e,0x77,0xfd,0x2f,0xf6,0x7c,0xaf,0x7f,0x31,0xf0,0xf3,0x9,0xd9,0x79,0x23,0x10,0x59,0x4a,0x64,0x17,0x89,0xca,0x48,0x1c,0xe4,0x1e,0xcb,0x96,0xe7,0x73,0x73,0x73,0x25,0xca,0x33,0x2e,0x15,0xb4,0x2,0xc8,0x20,0x32,0xa2,0xff,0x5f,0x81,0x5c,0x51,0xd,0x88,0xa5,0x63,0x81,0x9f,0x8b,0xe8,0x9e,0xd,0xc3,0xcf,0x45,0x38,0x7e,0x8f,0x6b,0xe7,0x2,0xd7,0x64,0x65,0xe5,0x7d,0x1f,0xe5,0xd,0x60,0x30,0x91,0x81,0xc6,0xfd,0x80,0xdf,0x87,0x6d,0x79,0x71,0xfc,0xc4,0x89,0x4d,0xe6,0x22,0x64,0x67,0xe7,0x9e,0x14,0xb6,0xe5,0xfd,0x86,0xb1,0x8e,0xd,0xc0,0x7,0xc0,0x5,0xa2,0x2c,0x9d,0x90,0x9d,0x77,0x85,0x69,0x79,0x3b,0x7,0x87,0x3,0x6b,0x9d,0xde,0x3c,0x21,0x3b,0xef,0x10,0xe0,0x6f,0xc0,0x12,0xb7,0xb,0x5f,0x61,0x61,0x61,0x6d,0x64,0xa0,0x2b,0xaf,0xaf,0xad,0x2c,0x16,0xb8,0x27,0x37,0x37,0xf7,0x89,0xa2,0xa2,0xa2,0x3d,0xf7,0xe1,0x1a,0x2,0x14,0x5b,0x62,0x1f,0x3e,0x63,0xc6,0x8c,0x6f,0x23,0x2d,0x6d,0xce,0xfe,0x62,0x59,0x1f,0x3,0xf7,0x80,0xae,0x2,0x4e,0xac,0xaf,0x73,0x1d,0xfe,0xe8,0xa3,0x5,0xdb,0x1b,0x4,0x3a,0xe,0xd1,0x39,0x62,0x85,0x67,0x2,0x57,0xed,0x5e,0x85,0xea,0xaf,0x51,0x7e,0x6,0x72,0x73,0x49,0xf1,0xf4,0x47,0x22,0x71,0xc8,0x11,0x1b,0x6b,0x22,0x4a,0xc1,0x84,0x9c,0xbc,0xab,0x66,0xce,0x28,0xdc,0xeb,0x96,0xb5,0x59,0x59,0xb9,0x63,0x80,0x3b,0x80,0xa9,0x25,0xc5,0x85,0xb7,0x7c,0x97,0xce,0xac,0xbc,0x8b,0x45,0x78,0xa1,0x77,0xef,0xbe,0x7f,0x4,0xae,0x8b,0xd2,0xfd,0xf0,0x23,0x72,0x56,0xc9,0x8c,0xe9,0x4b,0x1a,0x9,0xb4,0x3c,0xe2,0x35,0xb8,0x6,0xd1,0x74,0x37,0xd0,0x27,0x80,0x1d,0xb6,0x25,0xc7,0x3c,0x54,0x34,0xfd,0x7f,0x0,0xf9,0xf9,0xf9,0x29,0xb5,0x75,0xe1,0x72,0xd0,0xd8,0xdf,0xe5,0xa,0x2f,0xab,0x70,0xfe,0xcc,0x19,0x85,0xfe,0x46,0xcf,0x9f,0xd,0x5c,0x60,0xd5,0x73,0x74,0x83,0x38,0x1b,0x79,0x5c,0x32,0x7,0xb0,0x55,0xe5,0xc4,0x99,0x25,0xd3,0xbf,0x68,0x68,0x89,0xfb,0x84,0x6d,0xa9,0x14,0x78,0x3a,0x2b,0x2b,0xaf,0xbc,0xa4,0xa4,0x70,0x9d,0x69,0x79,0xbb,0xf0,0x80,0x9b,0x8,0x67,0x3,0x8a,0xca,0x5,0x3b,0x85,0xb,0x30,0x63,0x46,0x61,0x15,0x2a,0xd7,0x2,0x7d,0xc3,0xb6,0x5c,0x10,0xe5,0xd6,0xde,0x2,0x97,0xef,0x14,0x2e,0xc0,0xcc,0x99,0x33,0xbe,0x1,0xfd,0x35,0x30,0x40,0xe1,0x39,0x4b,0xb8,0x60,0xa7,0x70,0x1,0xdc,0x6e,0x2d,0x6d,0x70,0x7,0x77,0x3b,0x31,0xe1,0xa6,0x9b,0xb3,0xfa,0xa2,0xfc,0xe,0x58,0xb4,0x53,0xb8,0x91,0x38,0xcc,0x50,0x6c,0x2d,0x2,0xd6,0x8a,0xf2,0xc8,0xde,0x85,0x9b,0x67,0x21,0xf2,0xa,0xb0,0xbe,0xb1,0x70,0x1,0x66,0x96,0x14,0xfe,0x13,0x58,0x4,0x5c,0x9b,0x95,0x9d,0x17,0x6d,0x56,0xdd,0x84,0xc6,0xc2,0x5,0x8,0xbb,0xb8,0x14,0xb0,0x43,0xb6,0xbd,0xdb,0x21,0xe8,0xd9,0x39,0xb9,0x57,0x37,0xa4,0x7f,0xcc,0x4e,0xe1,0x2,0x14,0x14,0x14,0xd4,0xf,0x1a,0xd8,0xdf,0x47,0xeb,0xb6,0xb7,0xd9,0x23,0x13,0xe5,0xf7,0x8d,0x85,0xb,0xe0,0xb2,0xf4,0x5a,0xa0,0x4e,0x44,0xb3,0xf7,0x68,0xf5,0x27,0x3,0x7,0x81,0x5e,0xbc,0x53,0xb8,0x0,0x45,0x45,0x45,0xd5,0x2,0x97,0x47,0x7a,0x53,0x72,0x8d,0x71,0x9b,0xbb,0x38,0xaa,0xf2,0x25,0x68,0x4e,0x49,0xc9,0xf4,0xd,0x4d,0x85,0xad,0x5f,0x37,0xfc,0x95,0x1e,0xe5,0xd6,0x4d,0xc5,0xc5,0x85,0x8b,0xa2,0x14,0xc3,0x7f,0x35,0xfc,0xb1,0x63,0xc6,0x8c,0xc2,0xdd,0xb6,0xbe,0x2d,0x2c,0x2c,0xb4,0x89,0xb8,0xc5,0xbd,0x1a,0x5f,0x4f,0x71,0xb9,0x7d,0x80,0x6d,0x89,0x7d,0x49,0xd3,0xc1,0xb6,0xa2,0x30,0xca,0x7d,0xd,0xae,0x6f,0xcb,0x2,0xb0,0xb4,0x1f,0x90,0xaa,0xc8,0xc5,0x51,0x33,0x5a,0xec,0x5f,0x0,0xa4,0xb8,0x5d,0x3d,0xa3,0x18,0xe2,0x99,0x3d,0x2f,0x3d,0x5c,0x58,0xb8,0x9,0xa8,0xdd,0x39,0x28,0xd8,0xc8,0x66,0xf,0x44,0x5a,0x3f,0x6d,0xb2,0xe9,0xdf,0x94,0x29,0x53,0xc2,0xc0,0x27,0xe,0x72,0xa2,0xc9,0x59,0x57,0x45,0x45,0x45,0x1b,0x1a,0x5c,0xe2,0xef,0xed,0xf1,0xd5,0xf5,0xc0,0x1a,0xb7,0x4b,0x9a,0x8c,0x73,0x14,0x17,0x17,0x7e,0x2,0x7c,0x8e,0xe8,0x85,0xdd,0xa1,0xfc,0xba,0xbb,0x62,0xa2,0xb2,0xb2,0x26,0x1e,0x81,0xe8,0x83,0x51,0x46,0xb8,0x5e,0x2b,0x29,0x29,0x7c,0xe2,0xbb,0x16,0xa9,0x78,0xfa,0x2,0x60,0x41,0x33,0xc2,0xae,0x8f,0x9c,0x71,0xab,0x7,0x44,0xf9,0x3a,0xd4,0x4c,0x13,0x52,0xdb,0x70,0xc4,0xec,0x9a,0x66,0xdc,0x84,0x8f,0x14,0xdc,0xe3,0xc7,0x8f,0x4f,0x79,0xf8,0xe1,0x87,0xeb,0x23,0xcf,0x61,0x14,0x42,0xdd,0x8c,0x19,0x33,0xa2,0xbb,0x79,0x2e,0x16,0x60,0xe3,0xca,0xca,0xca,0xea,0x55,0x52,0x52,0xb2,0xbd,0xd9,0xe2,0x6f,0x93,0x81,0xa0,0x33,0x8b,0xa7,0x47,0x3d,0x3a,0x74,0xc6,0x8c,0x19,0x2b,0xb3,0xb2,0xf3,0xa8,0xaf,0xf,0x9f,0xe,0xec,0xb1,0xd5,0xab,0xd5,0xdc,0x46,0x7e,0x61,0x22,0x13,0x5f,0x1a,0xd3,0x3,0xd8,0x56,0x52,0x5c,0x54,0xd3,0xc2,0x3d,0xb1,0xd2,0xdc,0x7c,0xe7,0x1a,0xe0,0xe8,0x3d,0xae,0xed,0x3,0x4,0xb,0xb,0xb,0x9b,0x7b,0xce,0x16,0xe0,0x94,0x29,0x53,0xa6,0xc8,0x94,0x29,0x53,0xd4,0x88,0xb7,0xf3,0x39,0xd3,0xee,0x86,0xc1,0x8f,0xc6,0x5,0x6e,0x4,0xc2,0x57,0xcd,0xdd,0x32,0x7e,0xfc,0xc4,0xfe,0x6e,0xb7,0x1e,0x9,0x1c,0xaa,0xaa,0x16,0xd8,0x7d,0x63,0xf5,0xca,0x55,0xa9,0x6f,0xb8,0x23,0xea,0x89,0x84,0x8a,0x7c,0xe,0x2a,0xae,0xd4,0xd4,0xc3,0x88,0x8c,0x2,0x43,0xc4,0x75,0x77,0x65,0x65,0xe7,0xfd,0x29,0x6a,0xa0,0x36,0xbd,0x1,0x5c,0x2e,0xd7,0x11,0xd,0x3,0x6a,0xcd,0xf9,0x50,0x19,0x28,0x34,0x1b,0xce,0x2e,0xdb,0x1c,0xd7,0x54,0xbc,0xcd,0x62,0x3,0x7d,0x26,0x4c,0x98,0x68,0xcd,0x9c,0x39,0x7d,0xa7,0xc0,0x53,0x1a,0x6,0xf5,0xda,0x83,0x7a,0x60,0xc0,0xd,0x37,0xdc,0x6a,0x3d,0xfe,0xf8,0x3,0x3b,0x9f,0x3f,0x0,0x38,0xaa,0x85,0x74,0x1e,0xc,0xf4,0xde,0xbc,0x79,0x73,0x1a,0xc9,0x77,0x2e,0xb3,0x11,0xef,0xde,0x28,0x29,0x9e,0xfe,0x11,0xe0,0xf9,0xae,0x25,0xce,0xc9,0x1b,0x86,0x46,0x77,0xe7,0xb2,0xb2,0x73,0xf,0x1,0xb9,0x1f,0xf4,0x8a,0x86,0x6a,0x7a,0x2b,0x22,0xea,0xa4,0x3f,0x2d,0x2a,0xb4,0x74,0x22,0xbd,0xda,0x12,0x12,0x4b,0x71,0xed,0xbe,0x7f,0x75,0x9f,0x86,0xee,0xcb,0xb1,0x2d,0x4,0xbd,0x8,0xd8,0xb1,0x97,0x2e,0x40,0x1f,0x89,0xc4,0x79,0x2f,0xe1,0xe8,0x9a,0x58,0xd3,0x65,0xdb,0xae,0xdd,0x7d,0x1,0xd5,0x76,0x3d,0x2e,0xb5,0xae,0xae,0xe7,0xee,0xcf,0x8f,0xb4,0xbe,0xcd,0xa5,0xf3,0x23,0xe0,0x23,0xdb,0x76,0xd9,0x74,0x71,0x3a,0xbb,0x78,0xab,0x89,0x6d,0x93,0xec,0x3d,0x84,0x3b,0x71,0x10,0xe8,0xf2,0x6,0xf1,0xfc,0x42,0x8,0xbf,0x54,0x5c,0x5c,0xbc,0xb1,0xc1,0xf5,0x1e,0x8c,0x68,0x7b,0x8d,0x58,0x56,0x97,0x14,0x17,0x9e,0x15,0x87,0x70,0xec,0x38,0x85,0x93,0xdc,0x63,0x15,0xa2,0x8f,0xcd,0x9c,0x51,0x74,0x3f,0xdd,0x9c,0xce,0x2e,0xde,0x2f,0x88,0x4c,0x68,0x70,0x5a,0xc,0xee,0x7,0xfa,0xa0,0xe2,0x2d,0x29,0x99,0xbe,0xa8,0x83,0xd2,0xf0,0x29,0x91,0xf7,0x9a,0x6d,0xc2,0x82,0x8f,0xb5,0x7d,0xa6,0xbb,0x86,0x11,0xd9,0xbf,0x3,0xf3,0x7c,0x87,0x68,0x87,0x3e,0x3f,0x69,0xe8,0xec,0xa3,0xcd,0x7e,0x60,0xc0,0x84,0x9,0xb9,0x43,0x62,0xbd,0xf1,0x86,0x1b,0x6e,0x10,0x22,0xb3,0x9f,0x3e,0xeb,0x40,0xe1,0x2,0x32,0x9f,0x38,0x1c,0x3,0x23,0x22,0xaf,0x1,0x72,0xf3,0xcd,0x37,0xf7,0x4c,0x70,0x84,0xeb,0x81,0xff,0xeb,0xc0,0x3c,0xdf,0x8,0xfa,0x3d,0x23,0xdd,0x4e,0x2e,0x5e,0x55,0x9d,0x3,0x88,0x58,0xf2,0xf0,0x5e,0xfa,0x83,0x4d,0x5a,0xa4,0xb4,0xbe,0x7d,0xdd,0xd,0x83,0x1f,0xcd,0x1d,0xd,0x79,0x50,0xbb,0xa4,0xc1,0xb6,0xe7,0x2,0x29,0x59,0xd9,0x79,0xbf,0x68,0x93,0xbf,0xac,0xfa,0x2e,0x80,0xe5,0x4a,0x7d,0x2c,0xc1,0x51,0xfe,0x16,0xe8,0x91,0x95,0x95,0xd7,0xdc,0xfb,0xdc,0xbe,0x89,0xf7,0xb6,0xe4,0xcc,0xac,0xac,0xbc,0xc1,0x46,0xbc,0x9d,0x98,0x1e,0x69,0xee,0x65,0x40,0x5,0x70,0xc1,0x84,0xec,0xbc,0xb,0xa2,0xb7,0xb0,0xb7,0x5a,0x82,0xde,0x4,0x20,0xe8,0xdb,0x3b,0xaf,0x97,0x4c,0x9b,0x56,0x4f,0xe4,0xec,0xa3,0x83,0xae,0xb9,0x66,0xca,0x6e,0x23,0x32,0x39,0x39,0x13,0x7,0x22,0xfa,0x42,0xa4,0x49,0xdb,0xfb,0x3b,0xd6,0x36,0x89,0xd7,0x65,0x7d,0xd8,0xe0,0xfe,0x4f,0xcf,0xc9,0xc9,0xe9,0xbd,0xe7,0xf7,0x39,0x39,0xb9,0x43,0xb3,0x9b,0x49,0x5b,0x63,0x4a,0x8a,0xb,0x43,0xd,0xb6,0xf8,0x59,0x76,0xf6,0xa4,0x26,0x6e,0x65,0x7e,0x7e,0x7e,0x4a,0x56,0xf6,0xc4,0xfc,0x36,0xb7,0xf0,0xe8,0x15,0x80,0x22,0xe4,0xe6,0xe7,0xe7,0xef,0x56,0x29,0x66,0x67,0xe7,0x9d,0x45,0x64,0xd,0x75,0xc2,0xb0,0xe1,0x5a,0x20,0x84,0x70,0xdb,0xd,0x37,0xdc,0x6a,0x35,0x1d,0xc7,0xc8,0xfb,0x59,0x76,0xf6,0xc4,0x81,0xa6,0xcf,0x9b,0xe4,0x14,0x14,0x14,0xd8,0x59,0x59,0xb9,0x57,0x22,0xb2,0x40,0xe0,0xa5,0xac,0xec,0xbc,0x3f,0x82,0xcc,0x42,0x59,0x1,0xea,0xc6,0xe2,0x4,0xb4,0x6e,0x2,0x91,0x59,0x4d,0x7f,0x2e,0x2e,0x2e,0xda,0x73,0x31,0xf8,0x6d,0xc0,0xbf,0xfa,0xf6,0xdb,0x32,0x77,0x42,0x4e,0xde,0x9d,0x62,0xb3,0x5d,0x84,0x33,0x6d,0xd5,0x3b,0x14,0x9e,0x12,0xf8,0xd,0x4a,0x42,0xb,0xc2,0x43,0x33,0xa6,0x87,0x26,0xe4,0xe4,0x8e,0x11,0x95,0x15,0xb6,0x5a,0x1f,0x67,0xe5,0xe4,0xde,0xe8,0x12,0x96,0x84,0x6c,0x39,0x58,0xe0,0xc,0x5b,0x99,0xe,0x7c,0xd,0xcc,0xde,0x5b,0x58,0x29,0x6e,0xeb,0xbc,0xfa,0x90,0xbd,0x56,0xb1,0x57,0x67,0x67,0xe7,0x5d,0xad,0xca,0x22,0xb5,0xa4,0xbf,0xa0,0xa7,0xd5,0xd6,0x85,0x1f,0x0,0x6,0x4c,0xc8,0xc9,0x9b,0x3e,0x73,0x46,0xa1,0xe3,0x91,0xd8,0xe2,0xe2,0xa2,0x65,0x59,0xd9,0x79,0x2b,0x80,0xdf,0xd7,0xd6,0x85,0x7b,0x66,0x67,0xe7,0xbe,0xa,0xb2,0x45,0x61,0x9c,0xc2,0xbd,0x44,0xa6,0x52,0xee,0x97,0x30,0x7b,0x15,0x17,0x7e,0xd2,0xf0,0x9a,0x68,0x52,0x5a,0xcf,0xba,0xfe,0xd9,0xd9,0x79,0x7f,0xb2,0x2d,0xfd,0x4c,0xc2,0x72,0xa,0xc2,0x45,0xc0,0xd,0x36,0xf6,0xb9,0xc0,0x3c,0xd3,0xf2,0x26,0x39,0x25,0x25,0x45,0x6b,0x11,0x19,0x1,0x3c,0x4,0x5c,0xd,0x5a,0x8e,0xe8,0x1a,0x84,0xaf,0x50,0x4a,0x81,0xa3,0x80,0xeb,0x4a,0x8a,0xb,0x9b,0xb8,0xa5,0x76,0x58,0x5e,0x3,0xa,0x80,0xd1,0xa2,0x2c,0x41,0x78,0x57,0xe1,0x41,0x85,0x3f,0x84,0xea,0xec,0x29,0x44,0x26,0x63,0xf4,0x4f,0x74,0x1a,0x66,0xce,0x28,0x5a,0xa9,0xa2,0x47,0x3,0x55,0xa8,0xcc,0xe,0xdb,0xb2,0x56,0x22,0x8b,0x1d,0x1e,0x6,0x5e,0x45,0x43,0xad,0x1a,0x94,0x9b,0x3e,0x7d,0x5a,0x4d,0x7d,0x9d,0xeb,0x0,0xe0,0x6d,0x85,0xe7,0x10,0xbe,0x12,0xd5,0xf7,0x51,0x9e,0x2,0x3e,0x42,0x65,0x58,0x5b,0x84,0xbb,0xcb,0x5d,0x8,0x9d,0xa,0xcc,0x5,0x6e,0x57,0x64,0xb1,0xc2,0xfb,0x44,0x2a,0xba,0x4b,0x1a,0x2a,0x9a,0xc4,0xe6,0x79,0x71,0xe1,0xcd,0xc0,0xcd,0x28,0x57,0x2a,0x2c,0x11,0x5b,0xd6,0x20,0xcc,0x23,0x32,0x3d,0x32,0xc7,0xe,0xd5,0x95,0x99,0x96,0xb7,0xb3,0x8,0x78,0xc6,0xf4,0x2d,0x40,0x76,0x56,0xd6,0xc4,0xc9,0x58,0x7a,0x86,0x28,0xfb,0x2,0x55,0xaa,0xfa,0x79,0x49,0x49,0xd1,0x87,0xcd,0xd6,0xe2,0xf,0x4d,0xf,0x1,0x93,0xb3,0xb3,0x73,0x66,0x28,0xd6,0xff,0x9,0xd4,0x86,0x42,0xee,0xc5,0xf,0x3f,0x3c,0x75,0x47,0xc4,0xd,0xcc,0x1e,0x24,0xe2,0xda,0x43,0xf0,0x2e,0x5f,0x4a,0x4a,0xa8,0x99,0x4a,0xaf,0x7e,0xb3,0xcb,0x72,0xed,0x23,0x22,0x51,0x67,0x60,0xd5,0xd6,0x6e,0x5d,0xde,0xbb,0x77,0xef,0x7d,0x6,0xc,0x18,0x50,0x15,0x45,0xc0,0xab,0x81,0x63,0x26,0x4c,0xc8,0x3b,0x8,0x8b,0xd3,0x44,0x74,0xbb,0xa8,0xbd,0xac,0xb8,0xb8,0x38,0xa6,0xd7,0x55,0x8f,0x3e,0x5a,0x50,0xd,0x9c,0x95,0x9b,0x9b,0x3b,0x24,0x6c,0x5b,0xa7,0x3,0x58,0x12,0x7e,0x7f,0xc6,0x8c,0x19,0x9f,0x47,0x11,0xe1,0xe9,0x2e,0x97,0xcb,0x2a,0x2a,0x2a,0x8c,0x1a,0x5f,0x97,0xa5,0x87,0x0,0x52,0xf2,0xf0,0x54,0x7b,0xf7,0xa,0xb3,0x24,0xc,0xfc,0x70,0xc2,0x84,0xbc,0xfd,0xc4,0x92,0x11,0x2,0xd5,0xd5,0xd5,0xd5,0x95,0x7f,0xf9,0xcb,0xe3,0xa1,0xac,0xec,0xbc,0x22,0x0,0x15,0x3b,0xbc,0x47,0x58,0x83,0x5c,0x2e,0xd7,0x8e,0xdd,0x5b,0xe,0x7b,0x94,0x58,0xe2,0x76,0xbb,0xdd,0x51,0xf,0x47,0xb7,0x84,0xd3,0x45,0xd4,0x7a,0xf2,0xc9,0x29,0x76,0x14,0x1,0x3f,0x7c,0xcd,0x35,0x53,0x1e,0xeb,0xd3,0x6f,0xcb,0xff,0x89,0xc8,0x11,0xa2,0xf6,0x37,0x21,0x97,0xbc,0xf5,0x70,0x61,0x61,0x7d,0x77,0xe9,0xf3,0xa,0x6,0x43,0x1c,0xc9,0xca,0xce,0xfb,0x1f,0x30,0x30,0x54,0x9f,0xd6,0xf3,0x91,0x47,0xee,0x37,0xc7,0x61,0x1a,0xb7,0xd9,0xd0,0x19,0xb8,0xe9,0xa6,0xdb,0x7a,0x10,0x99,0xfd,0xe4,0x37,0xc2,0x35,0xe2,0x35,0x24,0x21,0x37,0xe7,0xe5,0xd,0xce,0xc9,0xc9,0xdd,0x6d,0x20,0x6f,0xca,0x94,0x29,0xe2,0x4e,0xa9,0x7d,0xe,0xe8,0x21,0xc2,0x4d,0xc6,0x4a,0xa6,0xcf,0x6b,0x48,0xc6,0x1a,0xdf,0xe6,0x5e,0x5b,0xe5,0xfa,0xac,0xec,0xbc,0xb9,0x44,0x16,0x58,0xf4,0xdd,0xb0,0x71,0x4b,0x3a,0x70,0x14,0x22,0xc5,0xa1,0xfa,0x9a,0x2f,0x8c,0x95,0x8c,0x78,0xd,0x49,0x88,0x86,0xf5,0x5e,0xb1,0x64,0xd,0x30,0x8e,0xc8,0x7a,0xdf,0xed,0xc0,0xbb,0x82,0xe4,0x17,0xcf,0x98,0x3e,0xdb,0x58,0xa8,0x7d,0xf8,0x7f,0x49,0xf1,0x1a,0x6f,0x4b,0xd5,0x18,0xc6,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82
+static const unsigned char boot_splash_png[] = {
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+ 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0xef, 0x00, 0x00, 0x01, 0x03,
+ 0x08, 0x06, 0x00, 0x00, 0x00, 0xdd, 0x81, 0x53, 0xf4, 0x00, 0x00, 0x00,
+ 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x32, 0xdf, 0x00, 0x00, 0x32,
+ 0xdf, 0x01, 0x17, 0xbe, 0xe4, 0x0b, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49,
+ 0x4d, 0x45, 0x07, 0xde, 0x01, 0x19, 0x13, 0x08, 0x19, 0x46, 0x43, 0xd9,
+ 0xbb, 0x00, 0x00, 0x00, 0x19, 0x74, 0x45, 0x58, 0x74, 0x43, 0x6f, 0x6d,
+ 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,
+ 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x47, 0x49, 0x4d, 0x50, 0x57, 0x81,
+ 0x0e, 0x17, 0x00, 0x00, 0x20, 0x00, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda,
+ 0xed, 0x9d, 0x79, 0x78, 0x54, 0xd5, 0xf9, 0xc7, 0x3f, 0xef, 0x9d, 0x49,
+ 0xc2, 0x0e, 0xb2, 0xb9, 0xaf, 0xb8, 0x2f, 0x3f, 0xb5, 0xa8, 0xb4, 0xa2,
+ 0x66, 0x66, 0x02, 0x04, 0xea, 0x5a, 0xad, 0x5a, 0x6d, 0xb5, 0x2e, 0xad,
+ 0x56, 0x24, 0x1b, 0x04, 0xb5, 0x5a, 0x2b, 0xb6, 0x6a, 0x55, 0x02, 0x09,
+ 0x09, 0xae, 0x5d, 0xd4, 0x5a, 0x6b, 0x15, 0xad, 0x15, 0x15, 0x48, 0x48,
+ 0x66, 0x26, 0x50, 0x10, 0x17, 0x0a, 0x2a, 0x56, 0x51, 0x11, 0xd7, 0x8a,
+ 0xec, 0x90, 0x00, 0x59, 0x66, 0xee, 0xfb, 0xfb, 0x63, 0x82, 0x04, 0x32,
+ 0x09, 0x99, 0x9b, 0x99, 0x64, 0x92, 0x9c, 0xcf, 0xf3, 0xcc, 0x43, 0xb8,
+ 0x33, 0xf7, 0xdc, 0x73, 0xde, 0x73, 0xbe, 0xe7, 0xbc, 0xe7, 0xdc, 0xb3,
+ 0x80, 0xc1, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x83, 0xc1, 0x60, 0x30, 0x18,
+ 0x0c, 0x06, 0x83, 0xc1, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x83, 0xc1, 0x60,
+ 0x30, 0x18, 0x0c, 0x06, 0x83, 0xc1, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x83,
+ 0xc1, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x83, 0xc1, 0x60, 0x30, 0x18, 0x0c,
+ 0x06, 0x83, 0xc1, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x83, 0xc1, 0x60, 0x30,
+ 0x18, 0x0c, 0x06, 0x83, 0xc1, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x83, 0xc1,
+ 0x60, 0x30, 0x18, 0x0c, 0x06, 0x83, 0xc1, 0x60, 0x30, 0x18, 0x0c, 0x06,
+ 0x83, 0xc1, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x83, 0xc1, 0x60, 0x30, 0x18,
+ 0x0c, 0x06, 0x83, 0xc1, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x83, 0xc1, 0x60,
+ 0x30, 0x18, 0x0c, 0x06, 0x83, 0xc1, 0x60, 0x30, 0x18, 0x0c, 0x86, 0x16,
+ 0x19, 0x53, 0xe0, 0xdf, 0xaf, 0xbd, 0x9e, 0x95, 0x71, 0x5f, 0x79, 0x2f,
+ 0x63, 0xf1, 0xce, 0x87, 0x18, 0x13, 0x24, 0x81, 0x50, 0xa7, 0x96, 0x0a,
+ 0x92, 0x76, 0xb4, 0xc0, 0x39, 0xa0, 0xe7, 0x00, 0xe7, 0x00, 0x43, 0x4a,
+ 0xf3, 0xbd, 0x09, 0x17, 0x55, 0x66, 0x81, 0xdf, 0x07, 0x52, 0x0e, 0x2c,
+ 0x05, 0x16, 0x00, 0x0b, 0xdc, 0x96, 0x1d, 0x7c, 0x6d, 0x62, 0xc6, 0x16,
+ 0x93, 0x33, 0x46, 0xbc, 0x86, 0x28, 0x8c, 0x9b, 0x56, 0xe9, 0xb2, 0x35,
+ 0xec, 0x01, 0xb9, 0x00, 0x38, 0x0f, 0x38, 0xa2, 0x69, 0xee, 0xc8, 0x43,
+ 0xa5, 0x93, 0x3c, 0x13, 0x12, 0x2b, 0xde, 0x40, 0x15, 0xd0, 0x27, 0xca,
+ 0x57, 0x0b, 0x15, 0x5e, 0x01, 0x99, 0x5d, 0x96, 0xef, 0x59, 0x69, 0x72,
+ 0xcc, 0x88, 0xb7, 0x5b, 0xf3, 0xc3, 0x82, 0x0a, 0xcb, 0xc6, 0xf2, 0x2a,
+ 0xfc, 0x1c, 0xb8, 0x08, 0xe8, 0xbb, 0x97, 0x5b, 0xea, 0x43, 0x75, 0xe1,
+ 0xfe, 0x15, 0xb7, 0x8f, 0xda, 0x91, 0x10, 0xe1, 0x4e, 0x0d, 0xdc, 0x88,
+ 0xf0, 0x68, 0x2b, 0x7e, 0xfa, 0x11, 0xf0, 0xac, 0xad, 0xfa, 0xd4, 0xfc,
+ 0xc9, 0xbe, 0xd5, 0x26, 0x27, 0x8d, 0x78, 0xbb, 0x0d, 0x63, 0x0b, 0x02,
+ 0x47, 0x2a, 0x5c, 0x0b, 0x5c, 0x05, 0x1c, 0x1c, 0xe3, 0xed, 0xf3, 0x4b,
+ 0xf3, 0xbd, 0x63, 0x12, 0xd4, 0xea, 0xd6, 0x03, 0xee, 0x18, 0x6f, 0x5b,
+ 0x08, 0x3c, 0x95, 0x52, 0x5f, 0xfb, 0xb7, 0x57, 0x7f, 0x3d, 0xb6, 0xd6,
+ 0xe4, 0xae, 0x11, 0x6f, 0x97, 0xe3, 0xfc, 0x29, 0xaf, 0x48, 0x5d, 0xdf,
+ 0x3e, 0x67, 0xa1, 0xe4, 0x03, 0x17, 0xb4, 0x21, 0xa8, 0xb0, 0x25, 0x1c,
+ 0x32, 0x77, 0x92, 0xf7, 0x7f, 0x71, 0x16, 0x6e, 0x09, 0xd0, 0x16, 0x97,
+ 0x7c, 0x1b, 0x50, 0x62, 0xa1, 0xd3, 0xe7, 0xe6, 0xfb, 0xd6, 0x99, 0x1c,
+ 0x37, 0xe2, 0xed, 0x12, 0x8c, 0x29, 0x08, 0x64, 0x0a, 0xdc, 0x0d, 0x8c,
+ 0x88, 0x53, 0x90, 0x1f, 0x96, 0xe6, 0x7b, 0x8f, 0x8b, 0x5b, 0x7f, 0xbb,
+ 0x78, 0x4e, 0x9a, 0x5d, 0xd7, 0x73, 0x3b, 0x60, 0xc5, 0x21, 0x38, 0x1b,
+ 0xf8, 0x6b, 0x8a, 0x86, 0xb2, 0x5e, 0x9d, 0x3c, 0xba, 0xda, 0xe4, 0x7e,
+ 0xfb, 0x61, 0x19, 0x13, 0x24, 0xa4, 0x46, 0x1c, 0x1f, 0x47, 0xe1, 0x02,
+ 0x1c, 0x93, 0x39, 0x3d, 0x70, 0x54, 0xbc, 0x02, 0xb3, 0xeb, 0x7a, 0x3e,
+ 0x17, 0xc7, 0xbc, 0xb7, 0x80, 0x6b, 0xea, 0xc5, 0x3d, 0xc0, 0xe4, 0xbc,
+ 0x11, 0x6f, 0x57, 0x60, 0x6d, 0xdc, 0xeb, 0x03, 0x9b, 0x57, 0xe3, 0xd4,
+ 0xea, 0xba, 0x80, 0xf3, 0x13, 0x90, 0xe6, 0xb0, 0xc9, 0x76, 0x23, 0x5e,
+ 0x23, 0xde, 0xe8, 0x1c, 0x39, 0x66, 0xaa, 0xff, 0x80, 0x38, 0xb4, 0xba,
+ 0x7f, 0x4a, 0x50, 0xbe, 0x1b, 0xf1, 0x1a, 0xf1, 0x1a, 0xf1, 0x36, 0x97,
+ 0x57, 0x22, 0xf2, 0x4a, 0x1c, 0xc2, 0xb9, 0x3a, 0x41, 0x9d, 0x05, 0x23,
+ 0x5e, 0x23, 0xde, 0x2e, 0x80, 0x26, 0x44, 0xbc, 0x00, 0xa7, 0x8c, 0x2a,
+ 0x2c, 0x77, 0xdc, 0xb7, 0xcc, 0x2c, 0x08, 0x4c, 0x4b, 0x54, 0x9e, 0x4b,
+ 0x64, 0xe0, 0xca, 0xd0, 0x8e, 0xb8, 0x8d, 0x09, 0x12, 0x52, 0x92, 0x13,
+ 0x25, 0x5e, 0xcb, 0x15, 0x76, 0xbd, 0x04, 0x78, 0x77, 0x5e, 0x18, 0x53,
+ 0x10, 0x18, 0xec, 0xb2, 0xb4, 0x4f, 0xd8, 0x96, 0x5e, 0x88, 0xf4, 0x06,
+ 0x3b, 0x84, 0x6d, 0x6d, 0x03, 0x7b, 0x5b, 0x38, 0xc5, 0xde, 0x52, 0x91,
+ 0x3b, 0xaa, 0xf1, 0x08, 0x70, 0x6e, 0xe2, 0xea, 0x2b, 0x35, 0x2d, 0xaf,
+ 0x11, 0x6f, 0x57, 0x68, 0x78, 0x59, 0x9b, 0xc0, 0x77, 0x70, 0xe7, 0x64,
+ 0x16, 0x04, 0xca, 0x80, 0x43, 0x81, 0x43, 0x80, 0x1e, 0xb6, 0x2d, 0x91,
+ 0x77, 0x7e, 0xaa, 0x91, 0x36, 0x50, 0x22, 0xff, 0xba, 0x43, 0x2e, 0x32,
+ 0x0b, 0x02, 0x1b, 0x80, 0xcf, 0x81, 0x4d, 0x09, 0xf6, 0xb4, 0x8c, 0x78,
+ 0x8d, 0x78, 0xbb, 0x42, 0xc3, 0x4b, 0x55, 0x82, 0xbb, 0x3a, 0xa3, 0x63,
+ 0xf8, 0xfd, 0xa0, 0x86, 0x4f, 0xa2, 0xab, 0xac, 0x7a, 0x93, 0xf3, 0xa6,
+ 0xcf, 0xdb, 0xf9, 0xc5, 0x2b, 0x52, 0xd3, 0xcd, 0x92, 0x1c, 0xaa, 0x75,
+ 0x89, 0x11, 0xaf, 0x11, 0x6f, 0x17, 0x70, 0x9b, 0x95, 0xee, 0x36, 0xe7,
+ 0xf7, 0x83, 0x60, 0x9e, 0x57, 0x4d, 0xce, 0x1b, 0xf1, 0x76, 0x05, 0xf5,
+ 0x76, 0x37, 0xf1, 0xbe, 0x63, 0x32, 0xdd, 0x88, 0xb7, 0x4b, 0x60, 0x63,
+ 0xd5, 0x18, 0xf1, 0x1a, 0x8c, 0x78, 0x3b, 0x21, 0xf3, 0x27, 0xa7, 0xdb,
+ 0x44, 0x46, 0x78, 0xbb, 0x49, 0x27, 0x5f, 0x97, 0x9b, 0x5c, 0x37, 0xe2,
+ 0xed, 0x4a, 0xac, 0xe8, 0x36, 0xda, 0xb5, 0xd5, 0xec, 0xb4, 0xd1, 0x11,
+ 0x76, 0x37, 0x26, 0x88, 0x2f, 0x63, 0xa7, 0xf9, 0x53, 0x54, 0xe5, 0x76,
+ 0xe0, 0x4e, 0xc0, 0xd5, 0x4d, 0x92, 0xbd, 0x5a, 0x85, 0x5f, 0x95, 0x4d,
+ 0xf2, 0x96, 0x99, 0x12, 0x60, 0xc4, 0xdb, 0x29, 0xc9, 0x2c, 0x08, 0x8c,
+ 0x06, 0x1e, 0x01, 0x86, 0x75, 0x53, 0x13, 0x3c, 0x6f, 0x5b, 0xf6, 0xcd,
+ 0xf3, 0x27, 0x66, 0xac, 0x37, 0xa5, 0xc1, 0x88, 0x37, 0x21, 0x8c, 0x7b,
+ 0x20, 0xe0, 0xb2, 0x5d, 0x72, 0xbf, 0xaa, 0xce, 0x2e, 0x9b, 0xec, 0x5d,
+ 0xd8, 0xd6, 0xf0, 0x46, 0x15, 0x2f, 0xe8, 0xe9, 0xaa, 0x0f, 0x17, 0xa3,
+ 0xfc, 0xc2, 0x14, 0x29, 0x6a, 0x54, 0xf9, 0xa5, 0x1d, 0x0e, 0x3d, 0x53,
+ 0x7e, 0xdb, 0xe8, 0x36, 0xbd, 0x3e, 0x1a, 0xfe, 0xd8, 0xdb, 0xd6, 0xe0,
+ 0xad, 0x55, 0x13, 0x10, 0xde, 0x2f, 0xcd, 0xf7, 0x56, 0x18, 0xd3, 0x1a,
+ 0xf1, 0x92, 0x59, 0x10, 0xb8, 0x1b, 0xf8, 0x2d, 0xa0, 0xc0, 0x6c, 0x41,
+ 0x7f, 0x3d, 0x2f, 0xdf, 0xf7, 0x81, 0xa3, 0xb0, 0xa6, 0xfa, 0x47, 0x22,
+ 0xf2, 0x2c, 0xb1, 0xef, 0x4d, 0xd5, 0xd5, 0x79, 0xc1, 0x25, 0xae, 0xeb,
+ 0xe7, 0x4c, 0x3a, 0x67, 0xab, 0xb3, 0x3c, 0x0a, 0x5e, 0x0e, 0xfa, 0x00,
+ 0x91, 0x69, 0xa0, 0x21, 0x41, 0x4f, 0x99, 0x97, 0xef, 0x7b, 0xdf, 0x98,
+ 0xb5, 0x1b, 0x8b, 0x37, 0xb3, 0x20, 0x70, 0x25, 0xf0, 0xcc, 0x1e, 0x97,
+ 0x43, 0xc0, 0x13, 0x02, 0x77, 0xce, 0xcb, 0xf7, 0x7e, 0xdb, 0x9a, 0x70,
+ 0xc6, 0x14, 0x04, 0x5c, 0x12, 0xe9, 0xd7, 0xde, 0x65, 0x8a, 0x51, 0xb3,
+ 0x6c, 0x14, 0xe4, 0xfc, 0x79, 0xf9, 0x9e, 0xc5, 0xad, 0xbd, 0x61, 0xcc,
+ 0xb4, 0x80, 0x4f, 0x94, 0x07, 0x81, 0xe1, 0x7b, 0x7c, 0xb5, 0x49, 0x2c,
+ 0xfb, 0xb8, 0x79, 0x13, 0x33, 0xbe, 0x35, 0x66, 0xed, 0x86, 0xe2, 0xcd,
+ 0x2c, 0xf0, 0xff, 0x00, 0x64, 0x51, 0x0b, 0xe9, 0xde, 0x01, 0x4c, 0x4d,
+ 0xad, 0xae, 0xfe, 0xfd, 0x2b, 0x53, 0xce, 0x0f, 0x35, 0x17, 0xce, 0xe8,
+ 0xe9, 0xc1, 0xfe, 0x96, 0xad, 0xcf, 0x01, 0x99, 0xa6, 0x08, 0xb5, 0x8a,
+ 0x5b, 0xc2, 0xa1, 0xd0, 0xb4, 0xf2, 0xdb, 0x46, 0xdb, 0x2d, 0x78, 0x30,
+ 0xc3, 0x10, 0x29, 0x06, 0xc6, 0xb5, 0x90, 0x3f, 0x1f, 0x28, 0x32, 0xa2,
+ 0x2c, 0xdf, 0x53, 0x65, 0x4c, 0xda, 0x8d, 0xc4, 0x3b, 0xf6, 0x41, 0xff,
+ 0xe1, 0x6a, 0xc9, 0x7b, 0x40, 0xef, 0x56, 0xfc, 0xfc, 0x33, 0x81, 0x5f,
+ 0xcd, 0xcb, 0xf7, 0x96, 0x36, 0x09, 0xa7, 0x20, 0x78, 0x82, 0xa2, 0x15,
+ 0xc0, 0xbe, 0xa6, 0xf8, 0xc4, 0xc4, 0x4b, 0x82, 0x5e, 0x39, 0x2f, 0xdf,
+ 0x57, 0xb3, 0x67, 0xbf, 0x76, 0x50, 0x55, 0xd5, 0x6f, 0x04, 0xee, 0x00,
+ 0x52, 0x5b, 0x11, 0xce, 0x5c, 0x4b, 0xac, 0x8b, 0xe6, 0x4e, 0x4a, 0xaf,
+ 0x33, 0xe2, 0xed, 0x06, 0x8c, 0x9b, 0xea, 0x1f, 0x68, 0x8b, 0x2c, 0x23,
+ 0xb2, 0x84, 0xae, 0xb5, 0x28, 0xf0, 0x0f, 0x45, 0xb3, 0xcb, 0xf2, 0x7d,
+ 0xeb, 0x1b, 0x5c, 0xee, 0x4c, 0xe0, 0x15, 0x20, 0xc5, 0x68, 0xd1, 0x11,
+ 0xff, 0xc1, 0xd2, 0x8c, 0xd2, 0x89, 0xbe, 0xcd, 0x0d, 0xfd, 0xda, 0x0c,
+ 0xd0, 0xc7, 0x89, 0x76, 0x5a, 0x44, 0xcb, 0x14, 0xd7, 0xf6, 0x24, 0x37,
+ 0x78, 0x73, 0xf7, 0x9e, 0x4f, 0xdd, 0xe5, 0xc5, 0x9b, 0x39, 0x35, 0xd0,
+ 0x13, 0x61, 0x3e, 0x30, 0xd2, 0x61, 0x10, 0xd5, 0x0a, 0xb7, 0xa2, 0x84,
+ 0xa5, 0x75, 0xa7, 0x0b, 0x18, 0x5a, 0xe6, 0x7f, 0xaa, 0x7a, 0xae, 0x88,
+ 0x4c, 0x04, 0x7e, 0x8a, 0xc3, 0x89, 0x42, 0x02, 0x37, 0xcf, 0xcb, 0xf7,
+ 0x3e, 0x6c, 0xc4, 0xdb, 0x45, 0x19, 0x33, 0xb5, 0x54, 0x44, 0x52, 0x9f,
+ 0x24, 0x61, 0xfb, 0x36, 0x19, 0x3a, 0xb8, 0xf0, 0x7a, 0xe7, 0xe5, 0x7b,
+ 0x83, 0xdd, 0x35, 0xfd, 0x5d, 0x7a, 0x7a, 0xa4, 0x48, 0xea, 0xe5, 0x46,
+ 0xb8, 0x5d, 0x17, 0x85, 0x57, 0x32, 0x0b, 0x82, 0x43, 0x4d, 0xcb, 0xdb,
+ 0xf5, 0xdc, 0xe5, 0xc3, 0x11, 0x56, 0x9a, 0xfe, 0x69, 0x97, 0xa7, 0x52,
+ 0x61, 0x74, 0x59, 0xbe, 0xb7, 0xdb, 0x6d, 0x06, 0xd0, 0x25, 0x5b, 0xde,
+ 0xb1, 0xd3, 0xfc, 0x3d, 0x11, 0x66, 0x1b, 0xe1, 0x76, 0x0b, 0xd2, 0x45,
+ 0xc8, 0x32, 0x6e, 0x73, 0x57, 0x71, 0xa7, 0x54, 0xee, 0x04, 0x4e, 0x34,
+ 0xe5, 0xba, 0xdb, 0xf8, 0xcf, 0xd3, 0x32, 0xa7, 0x06, 0x4e, 0x30, 0x6e,
+ 0x73, 0x67, 0x77, 0x97, 0x0b, 0xfc, 0x27, 0x81, 0xbc, 0x6b, 0x4a, 0x74,
+ 0xb7, 0xe3, 0x43, 0x81, 0x53, 0xe7, 0xe5, 0x7b, 0xbb, 0xcd, 0x46, 0x08,
+ 0x5d, 0xaa, 0xe5, 0x1d, 0x53, 0xe0, 0x4f, 0x03, 0xf9, 0x87, 0x29, 0xc7,
+ 0xdd, 0x92, 0x63, 0x51, 0x7e, 0x69, 0xdc, 0xe6, 0xce, 0xea, 0x46, 0xa8,
+ 0xdc, 0x00, 0x1c, 0x6f, 0xca, 0x71, 0x37, 0xf5, 0x9e, 0x85, 0xa2, 0x31,
+ 0x85, 0xc1, 0x43, 0x8d, 0x78, 0x3b, 0x9b, 0xbb, 0x3c, 0xbd, 0xb2, 0x07,
+ 0xc2, 0xfd, 0xa6, 0x08, 0x77, 0x6b, 0x2c, 0x09, 0xeb, 0x8d, 0x46, 0xbc,
+ 0x9d, 0x8c, 0xd2, 0x89, 0xe9, 0x35, 0xc0, 0x4d, 0xa6, 0xfc, 0x76, 0x6b,
+ 0x6a, 0x41, 0x4b, 0x8c, 0x78, 0x3b, 0x21, 0x29, 0x96, 0xfd, 0x77, 0x60,
+ 0xa1, 0x29, 0xc3, 0xdd, 0x96, 0x6b, 0x4b, 0xf3, 0x7d, 0xdf, 0x18, 0xf1,
+ 0x76, 0x42, 0x5e, 0x9d, 0x98, 0x11, 0x02, 0xae, 0x22, 0xb2, 0x3e, 0xd7,
+ 0xd0, 0xbd, 0xa8, 0xb4, 0xc2, 0xcc, 0xea, 0x56, 0x7d, 0x84, 0xae, 0x96,
+ 0xa0, 0xd2, 0x7c, 0xef, 0xe7, 0xc0, 0x04, 0x53, 0x96, 0xbb, 0x15, 0x21,
+ 0xb5, 0xf8, 0xd9, 0xdc, 0x5b, 0xbd, 0x21, 0x23, 0xde, 0x4e, 0x8e, 0xc2,
+ 0x13, 0xc0, 0x52, 0x53, 0xa6, 0xbb, 0x09, 0xca, 0x8d, 0x65, 0x13, 0xbd,
+ 0x5f, 0x75, 0xb7, 0x64, 0x77, 0x49, 0xf1, 0x96, 0xe5, 0x7b, 0xeb, 0x54,
+ 0xb9, 0xcc, 0xb8, 0xcf, 0xdd, 0x82, 0x85, 0x61, 0xb7, 0xf5, 0x74, 0x77,
+ 0x4c, 0x78, 0x97, 0x5d, 0x55, 0x54, 0x36, 0xd9, 0xfb, 0xa9, 0x98, 0x15,
+ 0x45, 0x5d, 0x9d, 0x6a, 0x55, 0x7e, 0x5c, 0x9e, 0x97, 0x5e, 0x6f, 0xc4,
+ 0xdb, 0xc5, 0xb0, 0xb5, 0xee, 0x1f, 0x34, 0xdd, 0x6c, 0xce, 0xd0, 0x45,
+ 0x10, 0x95, 0x0b, 0xca, 0x26, 0x7b, 0xd7, 0x76, 0xdb, 0xf4, 0x77, 0xf5,
+ 0x04, 0x8e, 0x29, 0x08, 0xf6, 0x13, 0x74, 0x05, 0x66, 0x6b, 0xd6, 0xae,
+ 0xc6, 0x83, 0xa5, 0xf9, 0xde, 0x5b, 0xbb, 0xb3, 0x01, 0xba, 0xfc, 0x59,
+ 0x45, 0x65, 0xf9, 0x9e, 0xad, 0xaa, 0x7a, 0x2e, 0x91, 0x3d, 0xa9, 0x0c,
+ 0x5d, 0x83, 0x77, 0xb1, 0xcc, 0x96, 0xbb, 0xdd, 0xe2, 0xa0, 0xb1, 0xb2,
+ 0xc9, 0xbe, 0xf7, 0x80, 0x9b, 0x4d, 0x99, 0xef, 0x12, 0xd4, 0xdb, 0x22,
+ 0xe7, 0x96, 0x4e, 0xf4, 0xd6, 0x18, 0xf1, 0x76, 0x1f, 0xca, 0x4d, 0xb9,
+ 0xef, 0x12, 0x6c, 0x98, 0x3f, 0xc9, 0xf3, 0x95, 0x31, 0x83, 0x39, 0xe2,
+ 0xd3, 0x60, 0xe8, 0xb4, 0xb8, 0x8d, 0x09, 0xda, 0x8e, 0x00, 0x47, 0x0c,
+ 0xed, 0xc3, 0x0f, 0x8e, 0x1c, 0xcc, 0x89, 0x07, 0xf6, 0x67, 0x50, 0x9f,
+ 0x34, 0x06, 0xf6, 0x4e, 0x65, 0x7b, 0x5d, 0x98, 0x0d, 0xd5, 0xb5, 0x7c,
+ 0xb5, 0x69, 0x07, 0x4b, 0x3e, 0x59, 0xcf, 0x5b, 0xab, 0x37, 0x50, 0x1b,
+ 0xb2, 0x3b, 0x7f, 0x7a, 0x05, 0x4e, 0x39, 0x64, 0x1f, 0x7e, 0x30, 0x6c,
+ 0x30, 0xc3, 0x86, 0xf6, 0x61, 0x50, 0x9f, 0x34, 0xfa, 0xf7, 0x4a, 0x61,
+ 0xf3, 0xb6, 0x3a, 0xd6, 0x57, 0xd7, 0xf2, 0xc9, 0xb7, 0xd5, 0xbc, 0xbe,
+ 0x6a, 0x3d, 0x2b, 0xbe, 0xda, 0x82, 0xad, 0x66, 0xa8, 0xc1, 0x88, 0x37,
+ 0x49, 0x45, 0x7b, 0xea, 0x61, 0xfb, 0x70, 0xfd, 0xd9, 0xc3, 0x18, 0x36,
+ 0xb4, 0x4f, 0x93, 0xef, 0x7b, 0xa7, 0xb9, 0x19, 0xd2, 0x37, 0x8d, 0x63,
+ 0xf7, 0xef, 0xc7, 0xa8, 0xe3, 0xf7, 0x25, 0x14, 0xb6, 0x99, 0xf5, 0xd6,
+ 0x97, 0xfc, 0xfd, 0x8d, 0xcf, 0xa9, 0xef, 0xa4, 0x22, 0x3e, 0xef, 0xe4,
+ 0x03, 0xf8, 0xf9, 0x59, 0x47, 0xd0, 0xb7, 0x47, 0xd3, 0xa2, 0xd3, 0x73,
+ 0x40, 0x4f, 0xf6, 0x1f, 0xd0, 0x93, 0x93, 0x0e, 0x1a, 0xc0, 0x8f, 0x86,
+ 0x1f, 0xc4, 0x86, 0xea, 0x3a, 0x9e, 0xfa, 0xf7, 0xa7, 0x94, 0xff, 0xf7,
+ 0x5b, 0x23, 0xe2, 0x04, 0x95, 0xbf, 0x6e, 0x41, 0x66, 0x41, 0xe0, 0x28,
+ 0xe0, 0xa3, 0x78, 0x85, 0x97, 0xe6, 0xb6, 0xb8, 0xf5, 0xdc, 0xe3, 0x38,
+ 0xf3, 0xc8, 0x21, 0x31, 0xdf, 0x5b, 0x5d, 0x1b, 0xe2, 0x77, 0x2f, 0xaf,
+ 0xe0, 0xdd, 0x2f, 0x37, 0x77, 0x1a, 0xfb, 0x0d, 0xe9, 0x9b, 0xc6, 0x03,
+ 0x97, 0x9d, 0xc2, 0x01, 0x03, 0x7a, 0xc6, 0x7c, 0xef, 0xaa, 0xb5, 0xd5,
+ 0xdc, 0xf1, 0xe2, 0xbb, 0x6c, 0xde, 0x1e, 0x97, 0x13, 0x4a, 0xd6, 0x94,
+ 0xe6, 0x7b, 0xf7, 0x37, 0xd2, 0x35, 0x7d, 0x5e, 0x47, 0xf4, 0xef, 0x95,
+ 0x4a, 0xc9, 0xcf, 0x4e, 0x73, 0x24, 0x5c, 0x80, 0x3e, 0x69, 0x6e, 0xfe,
+ 0xf0, 0xe3, 0x93, 0x39, 0xff, 0x94, 0x03, 0x3a, 0x45, 0x7a, 0xff, 0xef,
+ 0xe0, 0x01, 0xfc, 0xf9, 0xba, 0x11, 0x8e, 0x84, 0x0b, 0x30, 0x6c, 0x68,
+ 0x1f, 0xfe, 0x7c, 0xfd, 0x19, 0x51, 0xbd, 0x13, 0x83, 0x11, 0x6f, 0xbb,
+ 0xd1, 0x23, 0xc5, 0x45, 0xd1, 0x15, 0xa7, 0x72, 0xc8, 0xa0, 0x5e, 0x6d,
+ 0x0a, 0xc7, 0x65, 0x09, 0x37, 0xf9, 0x8e, 0xe2, 0xfb, 0xc3, 0x06, 0x25,
+ 0x75, 0x7a, 0x87, 0xf6, 0xeb, 0xc1, 0x7d, 0x97, 0x9c, 0x4c, 0xaa, 0xbb,
+ 0x6d, 0x45, 0xa5, 0x77, 0xaa, 0x9b, 0xa2, 0x2b, 0xbf, 0xc7, 0xa0, 0x3e,
+ 0x69, 0xa6, 0x10, 0x99, 0x3e, 0x6f, 0x07, 0xd4, 0x74, 0x22, 0xfc, 0xfa,
+ 0xbc, 0xe3, 0xd9, 0xbf, 0x85, 0x16, 0x68, 0xe5, 0xca, 0x95, 0x94, 0x97,
+ 0x57, 0xf0, 0xce, 0x3b, 0xef, 0xb0, 0x61, 0xfd, 0x06, 0x5c, 0x2e, 0x17,
+ 0x43, 0x86, 0x0c, 0x61, 0xf8, 0xf0, 0xef, 0x31, 0x6a, 0xf4, 0x28, 0x0e,
+ 0x39, 0xe4, 0x90, 0xdd, 0xc2, 0xbb, 0xe3, 0xfc, 0x13, 0xb8, 0xe6, 0x4f,
+ 0x6f, 0xb0, 0xa1, 0xba, 0x36, 0x29, 0xd3, 0xfc, 0xd0, 0x55, 0xc3, 0x71,
+ 0xbb, 0x76, 0xef, 0x5d, 0x55, 0x55, 0x55, 0x31, 0xe7, 0xb5, 0x39, 0x2c,
+ 0x59, 0xb2, 0x84, 0x35, 0x6b, 0xbe, 0x65, 0xc7, 0x8e, 0x1d, 0x0c, 0x1a,
+ 0x34, 0x90, 0xe3, 0x8e, 0x3b, 0x8e, 0xb3, 0xcf, 0x3e, 0x9b, 0x33, 0x46,
+ 0x9c, 0x81, 0x48, 0xd3, 0x1e, 0x59, 0x8a, 0xcb, 0xa2, 0xf0, 0x8a, 0x53,
+ 0xf9, 0xe5, 0x13, 0x6f, 0x76, 0x89, 0x81, 0x3b, 0xd3, 0xe7, 0xed, 0x44,
+ 0x7d, 0xde, 0x63, 0xf7, 0xef, 0x47, 0xd1, 0x95, 0xdf, 0x8b, 0xfa, 0x5d,
+ 0x4d, 0x4d, 0x0d, 0x0f, 0xdc, 0xff, 0x20, 0x95, 0x95, 0x95, 0xcd, 0x8b,
+ 0xdf, 0xb2, 0x38, 0xff, 0xfc, 0xf3, 0xc8, 0xc9, 0xcd, 0xd9, 0xed, 0xfa,
+ 0xea, 0x75, 0xd5, 0xdc, 0xf4, 0xd7, 0xb7, 0x93, 0xce, 0x66, 0x37, 0x67,
+ 0x1c, 0xc5, 0xf9, 0xa7, 0x1c, 0xb8, 0xdb, 0xb5, 0x67, 0x9f, 0xfd, 0x07,
+ 0x4f, 0x3e, 0xf1, 0x24, 0xf5, 0xf5, 0xcd, 0xaf, 0x05, 0x38, 0xf1, 0xc4,
+ 0x13, 0xb9, 0xf3, 0xb7, 0xbf, 0x61, 0xc8, 0x90, 0xe8, 0xdd, 0x8a, 0x87,
+ 0xfd, 0x1f, 0x33, 0x7b, 0xd9, 0xd7, 0xa6, 0xcf, 0x6b, 0xdc, 0xe6, 0x76,
+ 0x72, 0x51, 0x2c, 0xe1, 0xf6, 0xf3, 0xa2, 0x6f, 0x4c, 0xb9, 0x65, 0xcb,
+ 0x16, 0xae, 0xbb, 0xf6, 0xfa, 0x16, 0x85, 0x0b, 0x60, 0xdb, 0x36, 0x2f,
+ 0xbf, 0x3c, 0x9b, 0x1b, 0x6f, 0xf8, 0x15, 0xb6, 0xbd, 0xab, 0xe5, 0x39,
+ 0x6c, 0x70, 0x1f, 0x0e, 0x1f, 0xd2, 0xbb, 0x4d, 0xf1, 0x73, 0x59, 0x42,
+ 0xfa, 0x31, 0x43, 0xb9, 0xe6, 0xac, 0xc3, 0x19, 0x7d, 0xc2, 0x7e, 0x51,
+ 0x47, 0x83, 0x63, 0x4d, 0xef, 0xb8, 0xff, 0xdb, 0xbd, 0x4f, 0x7e, 0xef,
+ 0x3d, 0xf7, 0xf2, 0xc7, 0xc7, 0xff, 0xd8, 0xa2, 0x70, 0x01, 0x56, 0xac,
+ 0x58, 0xc1, 0xd5, 0x57, 0xfd, 0x9c, 0xcf, 0x56, 0x7f, 0x16, 0xf5, 0xfb,
+ 0x5f, 0x79, 0x8f, 0xa4, 0x4f, 0x9a, 0x71, 0xfa, 0x8c, 0x78, 0xdb, 0x89,
+ 0x21, 0xfd, 0x7a, 0x30, 0xb4, 0x5f, 0x8f, 0x26, 0xd7, 0x6b, 0x6b, 0x6b,
+ 0xc9, 0xce, 0xca, 0x61, 0xcd, 0x9a, 0x35, 0xad, 0x0e, 0xeb, 0xe3, 0x8f,
+ 0x3f, 0x66, 0x72, 0xfe, 0xe4, 0x5d, 0xee, 0x8f, 0x40, 0xce, 0xe8, 0x63,
+ 0x1c, 0xc7, 0xed, 0xc8, 0xa1, 0x7d, 0x78, 0xf6, 0x57, 0x67, 0xf2, 0xeb,
+ 0xf3, 0x8e, 0xe7, 0x27, 0x23, 0x0e, 0x65, 0xd2, 0xd8, 0x63, 0xf9, 0xc7,
+ 0x4d, 0x23, 0x19, 0x7b, 0x92, 0xf3, 0x06, 0xea, 0x82, 0xef, 0x1d, 0x84,
+ 0xdb, 0xda, 0xe5, 0x98, 0x3d, 0xf6, 0xe8, 0x63, 0x54, 0x54, 0xf8, 0x5b,
+ 0x7d, 0x7f, 0x6d, 0x6d, 0x2d, 0xe3, 0xc7, 0xdf, 0x4c, 0x55, 0x55, 0x55,
+ 0xd4, 0xee, 0xc7, 0xf1, 0x07, 0xf4, 0x37, 0x85, 0xca, 0x88, 0xb7, 0x7d,
+ 0x38, 0xfb, 0xe8, 0xe8, 0x2e, 0x60, 0x69, 0x69, 0x29, 0x5f, 0x7e, 0xf9,
+ 0x65, 0xcc, 0xe1, 0x2d, 0x5f, 0xfe, 0x0e, 0xff, 0xf9, 0xcf, 0xb2, 0x46,
+ 0xad, 0xaf, 0xb3, 0x96, 0xd7, 0x65, 0x09, 0x45, 0x3f, 0x1d, 0x4e, 0xbf,
+ 0x9e, 0x29, 0x4d, 0xae, 0xe7, 0x8e, 0x39, 0x86, 0x81, 0xbd, 0x53, 0x1d,
+ 0x85, 0x7b, 0xe9, 0x69, 0x07, 0x37, 0xea, 0xe3, 0x56, 0xf3, 0xc2, 0x0b,
+ 0x2f, 0xc6, 0x1c, 0x46, 0x4d, 0x4d, 0x0d, 0x0f, 0x3e, 0x30, 0x35, 0xea,
+ 0x77, 0x3f, 0x3b, 0xf3, 0x30, 0x53, 0xa8, 0x8c, 0x78, 0xdb, 0xa9, 0xcf,
+ 0x7c, 0xe2, 0xfe, 0x51, 0x5b, 0x97, 0x92, 0xe2, 0x99, 0x8e, 0xc2, 0x53,
+ 0x55, 0xee, 0xbb, 0xf7, 0xbe, 0xef, 0xfe, 0x9f, 0x96, 0xe2, 0xc2, 0x65,
+ 0xc5, 0x3e, 0x04, 0x71, 0xf8, 0xe0, 0x3e, 0xbb, 0xb5, 0x90, 0x7b, 0xf2,
+ 0x93, 0x11, 0xce, 0xf6, 0x20, 0xef, 0xd3, 0xc8, 0xed, 0xbe, 0xe7, 0x9e,
+ 0x7b, 0x08, 0x87, 0xc3, 0x8e, 0xc2, 0x59, 0xb4, 0x68, 0x11, 0x9b, 0x37,
+ 0x37, 0x7d, 0x9f, 0x7d, 0xf4, 0x7e, 0x7d, 0x49, 0x73, 0x9b, 0xe2, 0x67,
+ 0xc4, 0x9b, 0x68, 0x23, 0x09, 0xec, 0x3f, 0xa0, 0xa9, 0xcb, 0xbc, 0x61,
+ 0xfd, 0x06, 0xc7, 0x85, 0x1a, 0x60, 0xeb, 0xd6, 0xad, 0xbb, 0x5c, 0x67,
+ 0xe0, 0xe0, 0x81, 0xb1, 0xbf, 0x7e, 0x3a, 0xed, 0xf0, 0x81, 0x2d, 0x7e,
+ 0x3f, 0xc2, 0xe1, 0xab, 0x28, 0xab, 0xd1, 0x68, 0xf1, 0x7b, 0xef, 0xbe,
+ 0xd7, 0x26, 0xfb, 0xad, 0x58, 0xb1, 0x22, 0xea, 0xf5, 0x54, 0xb7, 0xcb,
+ 0x14, 0x2e, 0x23, 0xde, 0xc4, 0x92, 0xea, 0x76, 0xed, 0x56, 0x98, 0x77,
+ 0xf2, 0x85, 0x03, 0x77, 0xb9, 0x31, 0xa1, 0x50, 0x88, 0xf5, 0xeb, 0xd7,
+ 0xef, 0x72, 0x9d, 0x07, 0xf5, 0x76, 0x54, 0xb1, 0xb4, 0x84, 0xd3, 0xd7,
+ 0x09, 0x8d, 0xbd, 0x80, 0x50, 0xa8, 0x6d, 0x5b, 0x81, 0xbd, 0xf5, 0x56,
+ 0xf4, 0x91, 0xf4, 0x14, 0xb7, 0x98, 0xc2, 0x65, 0xc4, 0x9b, 0x58, 0x42,
+ 0x76, 0xf4, 0x77, 0x92, 0x6b, 0xbf, 0x6d, 0xfb, 0x0e, 0x2c, 0xdf, 0x7c,
+ 0xb3, 0x6b, 0xa0, 0x6b, 0xc3, 0xb6, 0xba, 0xa4, 0x49, 0x73, 0xe3, 0xb9,
+ 0xc8, 0xb6, 0xdd, 0xb6, 0x77, 0xb2, 0xdf, 0xae, 0xf9, 0x36, 0xea, 0xf5,
+ 0xb0, 0x6d, 0xe6, 0x3b, 0x1b, 0xf1, 0x26, 0x5a, 0xbc, 0x61, 0xa5, 0x6a,
+ 0x47, 0xd3, 0xd7, 0x23, 0x07, 0x1c, 0xd8, 0xf6, 0xd7, 0x8d, 0x07, 0x1d,
+ 0xb4, 0xeb, 0x3d, 0xea, 0xa7, 0xeb, 0xaa, 0x93, 0x48, 0xbc, 0x8d, 0x0a,
+ 0x89, 0xd5, 0xb6, 0x62, 0x72, 0xe0, 0x81, 0xd1, 0xa7, 0x81, 0xd6, 0x99,
+ 0x89, 0x1a, 0x46, 0xbc, 0xed, 0xc1, 0xf2, 0x28, 0x8b, 0x08, 0x0e, 0x3c,
+ 0xf0, 0xc0, 0x36, 0x85, 0x99, 0x92, 0x92, 0xc2, 0x3e, 0xfb, 0xec, 0xf3,
+ 0x5d, 0x05, 0xb1, 0xad, 0x36, 0x79, 0x76, 0xaa, 0x0d, 0x85, 0xed, 0xdd,
+ 0xe2, 0xd9, 0x16, 0xce, 0x18, 0x71, 0x46, 0x93, 0x6b, 0xdb, 0x6a, 0x43,
+ 0xd4, 0xd6, 0x1b, 0xf1, 0x1a, 0xf1, 0xb6, 0x03, 0x2f, 0x2d, 0x6d, 0xba,
+ 0x79, 0xc3, 0xe0, 0xc1, 0x83, 0x49, 0x4d, 0x4d, 0x75, 0x1c, 0xe6, 0x4e,
+ 0xe1, 0x02, 0x54, 0xd5, 0x24, 0xd7, 0xee, 0xa5, 0xcb, 0x3e, 0xdf, 0xf4,
+ 0xdd, 0xdf, 0xa7, 0x9f, 0x7e, 0x7a, 0x9b, 0xc2, 0x3a, 0xee, 0xd8, 0xe3,
+ 0x9a, 0x5c, 0xfb, 0xe7, 0xd2, 0x2f, 0xcd, 0x32, 0x41, 0x23, 0xde, 0xf6,
+ 0xe1, 0x8b, 0x0d, 0xdb, 0xa2, 0xb6, 0x9c, 0xb7, 0xdc, 0x32, 0xd9, 0x51,
+ 0x78, 0x22, 0xc2, 0xdd, 0xbf, 0x9b, 0xf2, 0xdd, 0xff, 0x5f, 0x78, 0xfb,
+ 0xcb, 0xa4, 0x4a, 0xef, 0xe3, 0xc1, 0x4f, 0xbe, 0xdb, 0xb1, 0xef, 0xd7,
+ 0xb7, 0xdf, 0x86, 0xdb, 0xed, 0x6c, 0x46, 0xd4, 0xd8, 0x71, 0x63, 0xe9,
+ 0xd7, 0xbf, 0x5f, 0x93, 0xeb, 0xe5, 0xef, 0x7f, 0x6b, 0x0a, 0x95, 0x11,
+ 0x6f, 0xfb, 0x50, 0x5d, 0x1b, 0xe2, 0xc9, 0x7f, 0xaf, 0x6e, 0x72, 0xfd,
+ 0xec, 0x73, 0xce, 0xe6, 0xb8, 0xe3, 0x8e, 0x8b, 0x39, 0xbc, 0xb3, 0xcf,
+ 0x3e, 0x9b, 0x63, 0x8e, 0x89, 0xcc, 0xaa, 0xaa, 0xa9, 0x0f, 0xf3, 0x62,
+ 0x92, 0x89, 0xf7, 0x9b, 0x2d, 0x35, 0xac, 0xd9, 0xbc, 0x03, 0x80, 0xb4,
+ 0xb4, 0x34, 0xae, 0xbf, 0xfe, 0xba, 0xa8, 0x8b, 0x0d, 0x5a, 0xa2, 0x7f,
+ 0xff, 0xfe, 0x64, 0x65, 0x35, 0x3d, 0x36, 0x6a, 0xc5, 0x57, 0x9b, 0x59,
+ 0x5b, 0x55, 0x63, 0x0a, 0x95, 0x11, 0x6f, 0xfb, 0x31, 0x7b, 0xd9, 0x57,
+ 0x4d, 0xfa, 0x69, 0x29, 0x29, 0x29, 0x4c, 0x2d, 0x78, 0x90, 0x61, 0xc3,
+ 0x86, 0xb5, 0x3a, 0x9c, 0xe1, 0xc3, 0x87, 0x33, 0xe5, 0xee, 0x5d, 0x3b,
+ 0x97, 0x3e, 0xe2, 0xff, 0x24, 0x29, 0xd3, 0xfb, 0xeb, 0x17, 0xde, 0xf9,
+ 0xce, 0xb5, 0xbd, 0xfc, 0x27, 0x97, 0x73, 0xd1, 0x8f, 0x2e, 0x6a, 0xb5,
+ 0x80, 0xfb, 0xf5, 0xeb, 0xc7, 0xa3, 0x8f, 0x3d, 0x42, 0xcf, 0x9e, 0x4d,
+ 0x57, 0x60, 0x3d, 0x38, 0xf7, 0x43, 0x8c, 0xc7, 0x6c, 0xc4, 0xdb, 0xae,
+ 0x6c, 0xaf, 0x0b, 0x73, 0xcb, 0xf3, 0xcb, 0x9a, 0x5c, 0xef, 0xd5, 0xab,
+ 0x17, 0x0f, 0x3d, 0x3c, 0x93, 0x0b, 0x2e, 0xbc, 0xa0, 0xc5, 0xfb, 0x53,
+ 0x52, 0x52, 0xb8, 0xfa, 0xea, 0xab, 0x98, 0x5a, 0xf0, 0xe0, 0x77, 0xd7,
+ 0xde, 0xfc, 0x74, 0x03, 0xa5, 0x2b, 0x92, 0xf3, 0x48, 0xd9, 0x35, 0x5b,
+ 0x6a, 0x78, 0x7a, 0xf1, 0x67, 0xdf, 0xfd, 0x3f, 0x2b, 0x6b, 0x02, 0x93,
+ 0xf2, 0x27, 0xd1, 0xb7, 0x6f, 0xdf, 0x16, 0xef, 0x3b, 0xeb, 0xac, 0x91,
+ 0x3c, 0xfd, 0xb7, 0xbf, 0xb2, 0xef, 0xbe, 0xfb, 0x36, 0xf9, 0x6e, 0xc6,
+ 0xfc, 0x95, 0xac, 0xdd, 0x6a, 0x5a, 0xdd, 0x78, 0x60, 0x96, 0x76, 0xc4,
+ 0xc8, 0xca, 0x35, 0x55, 0x14, 0xcc, 0xfd, 0x90, 0xfc, 0x71, 0xc7, 0xee,
+ 0x76, 0x3d, 0x35, 0x35, 0x95, 0xdc, 0xdc, 0x1c, 0xae, 0xb8, 0xe2, 0x0a,
+ 0x2a, 0xca, 0xcb, 0x59, 0xb6, 0x7c, 0x79, 0xa3, 0xf5, 0xbc, 0x83, 0x39,
+ 0xed, 0xf4, 0xd3, 0xc9, 0xc8, 0xf0, 0xd1, 0xbf, 0xff, 0xae, 0x09, 0xf9,
+ 0xab, 0xd7, 0x55, 0xf3, 0xdb, 0x97, 0xde, 0x4b, 0xea, 0xf4, 0x3e, 0xbb,
+ 0xe4, 0x73, 0x0e, 0x1d, 0xd4, 0x0b, 0xcf, 0xb1, 0x11, 0x21, 0xfe, 0xf0,
+ 0x87, 0xe3, 0x18, 0x33, 0x66, 0x34, 0xfe, 0x0a, 0x3f, 0x8b, 0x17, 0x2f,
+ 0xde, 0x6d, 0x3d, 0xef, 0xf1, 0xc7, 0x1f, 0xcf, 0x39, 0xe9, 0xe7, 0x70,
+ 0xf4, 0xd1, 0x47, 0x47, 0x0d, 0xeb, 0x95, 0x65, 0x5f, 0x33, 0xef, 0xbd,
+ 0x6f, 0x4c, 0x21, 0x32, 0xe2, 0xed, 0x38, 0xca, 0xff, 0xbb, 0x86, 0xaa,
+ 0x9a, 0x7a, 0xee, 0xbc, 0xf0, 0x04, 0xdc, 0x7b, 0xbc, 0x03, 0xdd, 0x77,
+ 0xdf, 0xa1, 0x5c, 0xf9, 0xd3, 0x2b, 0xb9, 0xf2, 0xa7, 0x57, 0xb6, 0x18,
+ 0xc6, 0x82, 0x95, 0x6b, 0xf9, 0xc3, 0x6b, 0xff, 0x6d, 0x73, 0x5c, 0xf6,
+ 0x36, 0xcf, 0x21, 0x1e, 0xee, 0xe9, 0xfd, 0xaf, 0x7d, 0xc0, 0xd7, 0x9b,
+ 0x76, 0x70, 0xe5, 0xf7, 0x0f, 0x43, 0x04, 0xdc, 0x6e, 0x37, 0x63, 0x32,
+ 0xc7, 0x30, 0x26, 0x73, 0x4c, 0xab, 0xc3, 0xf8, 0x53, 0xe5, 0x2a, 0x5e,
+ 0x5c, 0xfa, 0xa5, 0x71, 0x97, 0x8d, 0xdb, 0xdc, 0xf1, 0xbc, 0xf1, 0xe9,
+ 0x06, 0x7e, 0xf1, 0x97, 0x37, 0x59, 0xb2, 0x6a, 0x7d, 0x4c, 0xf7, 0x6d,
+ 0xd9, 0x51, 0x4f, 0x51, 0xd9, 0x4a, 0xee, 0x7b, 0xf5, 0xbf, 0x71, 0x29,
+ 0xc8, 0x6f, 0xad, 0xde, 0xd8, 0xe2, 0xf7, 0x4b, 0x3e, 0xdd, 0x10, 0x97,
+ 0xf4, 0x3e, 0xbd, 0xf8, 0x33, 0x7e, 0xfb, 0xd2, 0xbb, 0x7c, 0x1e, 0x65,
+ 0xd4, 0xbd, 0x25, 0x3e, 0x5a, 0x53, 0xc5, 0xe4, 0xe7, 0x96, 0xf3, 0xc2,
+ 0xdb, 0x46, 0xb8, 0xa6, 0xe5, 0x4d, 0xb2, 0x3e, 0xe1, 0x94, 0x7f, 0xad,
+ 0xe0, 0x84, 0x03, 0xfb, 0x33, 0xfa, 0x84, 0xfd, 0xf8, 0xfe, 0xb0, 0x41,
+ 0x0c, 0xe8, 0x95, 0x1a, 0xa5, 0x75, 0x54, 0x56, 0x7c, 0xb5, 0x85, 0x45,
+ 0x9f, 0xac, 0xe7, 0xd5, 0xe5, 0x5f, 0xc7, 0x75, 0x5a, 0xe0, 0x67, 0xeb,
+ 0xab, 0x09, 0xd9, 0xda, 0xec, 0xca, 0xa2, 0xe7, 0xde, 0xf8, 0x3c, 0x6e,
+ 0xcf, 0x7a, 0x6b, 0xf5, 0x46, 0xde, 0x5a, 0xbd, 0x11, 0xdf, 0x71, 0xfb,
+ 0x72, 0xf6, 0xd1, 0x43, 0x38, 0xfd, 0xf0, 0x81, 0xb8, 0x5d, 0x4d, 0xeb,
+ 0xff, 0xda, 0x50, 0x98, 0xb7, 0x3e, 0xdd, 0x48, 0xe5, 0xca, 0xb5, 0xfc,
+ 0xfb, 0xe3, 0x75, 0x46, 0xb4, 0x46, 0xbc, 0xc9, 0xcb, 0xfb, 0x5f, 0x6f,
+ 0xe1, 0xfd, 0xaf, 0xb7, 0x20, 0x22, 0x1c, 0xb4, 0x4f, 0x4f, 0x06, 0xf7,
+ 0x49, 0x63, 0x60, 0x9f, 0x5d, 0x9b, 0xae, 0xff, 0x6f, 0xd3, 0x0e, 0xaa,
+ 0x13, 0x34, 0x7b, 0x2a, 0x6c, 0x2b, 0xb9, 0xcf, 0x2c, 0xe5, 0xbe, 0x1f,
+ 0x9f, 0xbc, 0xdb, 0x9a, 0xde, 0xb0, 0xad, 0x94, 0x94, 0x7f, 0xc4, 0xc6,
+ 0x04, 0xcc, 0x97, 0xf6, 0x7f, 0xf0, 0x2d, 0xfe, 0x0f, 0xbe, 0xc5, 0xed,
+ 0x12, 0x0e, 0x19, 0xd8, 0x9b, 0x41, 0x7d, 0xd2, 0x18, 0xd0, 0x2b, 0x85,
+ 0x4d, 0xdb, 0xeb, 0xd8, 0x50, 0x5d, 0xcb, 0x17, 0x1b, 0xb6, 0x9b, 0x79,
+ 0xcb, 0x46, 0xbc, 0x9d, 0x0b, 0x55, 0xe5, 0xcb, 0x8d, 0xdb, 0xf9, 0x72,
+ 0xe3, 0xf6, 0x76, 0x7d, 0xee, 0x27, 0x6b, 0xab, 0xb9, 0xe2, 0xd1, 0xc5,
+ 0x8c, 0x3c, 0x6a, 0x08, 0x87, 0x0e, 0xea, 0xc5, 0x37, 0x5b, 0x6a, 0x78,
+ 0x63, 0xd5, 0x7a, 0xaa, 0x6a, 0x12, 0x3b, 0xdd, 0x32, 0x14, 0x56, 0x3e,
+ 0x5d, 0x57, 0x9d, 0x54, 0x73, 0xb2, 0x8d, 0x78, 0x0d, 0x9d, 0x8e, 0xb0,
+ 0xad, 0x2c, 0x58, 0xb9, 0xd6, 0x18, 0xa2, 0x1b, 0xd1, 0x9d, 0x06, 0xac,
+ 0xc2, 0x26, 0xbb, 0x0d, 0x46, 0xbc, 0x9d, 0x90, 0xd2, 0x7c, 0xef, 0xa7,
+ 0x88, 0x1e, 0x02, 0x92, 0x0f, 0xbc, 0x69, 0xb2, 0xbe, 0x53, 0xb2, 0x04,
+ 0xf8, 0x9d, 0x31, 0x43, 0x84, 0x2e, 0xb9, 0x95, 0xc1, 0x98, 0x82, 0xc0,
+ 0x71, 0x67, 0x56, 0x57, 0x7e, 0x38, 0x65, 0xca, 0x94, 0x66, 0x47, 0x4d,
+ 0x32, 0xa7, 0xf9, 0x0f, 0x43, 0xe5, 0x77, 0xc0, 0x55, 0xa6, 0x18, 0x24,
+ 0x3d, 0x4f, 0x22, 0x3a, 0xa5, 0x74, 0x92, 0xef, 0x73, 0x63, 0x8a, 0x2e,
+ 0x2c, 0xde, 0xe1, 0x8f, 0xbd, 0x2d, 0x83, 0xab, 0xaa, 0xd6, 0x03, 0x75,
+ 0xc0, 0xf3, 0x82, 0xce, 0x9a, 0x97, 0xef, 0xfb, 0x77, 0xb4, 0xdf, 0xfe,
+ 0xb0, 0xa0, 0x22, 0x2d, 0x8c, 0xb5, 0x09, 0xe8, 0x69, 0x8a, 0x42, 0xd2,
+ 0xb2, 0xdd, 0x85, 0xbd, 0xcf, 0x9c, 0xfc, 0x8c, 0xa8, 0xc3, 0xe6, 0x63,
+ 0x0b, 0xfc, 0x67, 0x2b, 0x72, 0x19, 0xb0, 0xb0, 0x34, 0xdf, 0xfb, 0xbc,
+ 0x11, 0x6f, 0x27, 0x66, 0x6c, 0x41, 0x60, 0x90, 0xc2, 0x9e, 0x33, 0x27,
+ 0xbe, 0x06, 0x66, 0x21, 0x3c, 0x5f, 0x3a, 0xc9, 0xfb, 0xfa, 0x6e, 0x2d,
+ 0x70, 0x41, 0xe0, 0x7d, 0xe0, 0xf8, 0xbd, 0x04, 0xbb, 0x0e, 0xf8, 0x17,
+ 0x70, 0x00, 0x70, 0x6a, 0xc3, 0xbf, 0x06, 0x67, 0x7c, 0x0d, 0x2c, 0x03,
+ 0xbe, 0x01, 0x2e, 0x06, 0xf6, 0xb6, 0x43, 0xde, 0x8a, 0xd2, 0x7c, 0xef,
+ 0x49, 0xbb, 0x7b, 0x4d, 0x81, 0x33, 0x51, 0x2e, 0x03, 0x2e, 0x03, 0x76,
+ 0x6e, 0x67, 0x32, 0xa3, 0x34, 0xdf, 0x9b, 0xdb, 0x9d, 0x0c, 0xd9, 0xf5,
+ 0x46, 0x9b, 0x95, 0x81, 0x51, 0xaa, 0xa4, 0x03, 0x81, 0x5c, 0x94, 0xdc,
+ 0xcc, 0x82, 0xc0, 0x82, 0xd2, 0x7c, 0x6f, 0x7a, 0x2c, 0x35, 0x3f, 0xb6,
+ 0x7d, 0x7c, 0xe9, 0x2d, 0x19, 0xeb, 0x1b, 0x15, 0x9e, 0xa1, 0xa8, 0x9c,
+ 0x0a, 0x7a, 0x2a, 0x70, 0x72, 0x83, 0xa0, 0x8f, 0x31, 0xba, 0x6c, 0xc2,
+ 0xca, 0x06, 0xa1, 0x2e, 0x07, 0x59, 0x86, 0xe8, 0xf2, 0xd2, 0x49, 0xde,
+ 0xb5, 0xbb, 0x2a, 0xda, 0xe0, 0x6f, 0x14, 0xfd, 0x1c, 0xe8, 0xd1, 0xda,
+ 0x00, 0x33, 0x0b, 0x02, 0x8b, 0x51, 0x7e, 0x10, 0xe5, 0xab, 0xe3, 0xba,
+ 0x9b, 0x71, 0xbb, 0x9c, 0x78, 0x55, 0xf6, 0x5a, 0x10, 0xf6, 0x89, 0x31,
+ 0xc8, 0xf5, 0x8d, 0x85, 0x0b, 0xd0, 0x50, 0x00, 0x4b, 0x1b, 0x3e, 0x00,
+ 0x9c, 0xfb, 0xc0, 0x82, 0x5e, 0xf5, 0x2e, 0xfb, 0x14, 0x89, 0x08, 0xfa,
+ 0x94, 0x06, 0x41, 0x9f, 0x04, 0xa4, 0x76, 0x83, 0x72, 0x54, 0x07, 0xbc,
+ 0x1b, 0x11, 0x29, 0xcb, 0x14, 0x59, 0x9e, 0x12, 0xb6, 0x96, 0xbf, 0x76,
+ 0xeb, 0x39, 0x2d, 0xbe, 0xf0, 0x9e, 0x97, 0xef, 0x59, 0x9b, 0x59, 0x10,
+ 0xd8, 0x18, 0xa3, 0x27, 0x33, 0xa0, 0x99, 0xeb, 0x46, 0xbc, 0x5d, 0x80,
+ 0x78, 0x8b, 0xa5, 0x55, 0x53, 0x85, 0x1a, 0x0a, 0xea, 0xe2, 0x86, 0x0f,
+ 0x00, 0x23, 0xff, 0xf8, 0xa6, 0xab, 0xef, 0xd6, 0xed, 0x27, 0xa8, 0xad,
+ 0xa7, 0x21, 0xdc, 0x0e, 0x0c, 0xeb, 0x42, 0x76, 0xfe, 0x04, 0xe5, 0x5e,
+ 0xb1, 0x64, 0xe9, 0xe6, 0x81, 0x7d, 0xde, 0x5f, 0x72, 0xed, 0x69, 0x76,
+ 0x22, 0xed, 0xdb, 0x0a, 0x0e, 0x3a, 0x7f, 0xca, 0x6c, 0x79, 0x65, 0xca,
+ 0x05, 0x6a, 0xc4, 0xdb, 0x79, 0xdb, 0xde, 0xed, 0x89, 0xec, 0xca, 0x67,
+ 0x16, 0x04, 0xc6, 0x03, 0x35, 0x08, 0xcb, 0xd4, 0xae, 0x5b, 0x51, 0x36,
+ 0x39, 0xb3, 0xd9, 0xcd, 0xa7, 0x16, 0xfd, 0xf2, 0x8c, 0x70, 0x43, 0x8b,
+ 0xf4, 0x6e, 0x66, 0x41, 0xe0, 0x65, 0x9a, 0xf6, 0xc5, 0x5b, 0x5b, 0xb8,
+ 0x3f, 0x04, 0xb6, 0x37, 0x8c, 0x51, 0x48, 0xa3, 0xf1, 0x8a, 0x3d, 0xff,
+ 0x96, 0x3d, 0x04, 0xa1, 0x7b, 0xf9, 0xbb, 0x57, 0x1b, 0x5a, 0xac, 0xd3,
+ 0x4a, 0x27, 0x7b, 0xb7, 0xb4, 0xe6, 0x87, 0x63, 0xa6, 0x96, 0xa6, 0x88,
+ 0x95, 0x7a, 0x12, 0xca, 0x29, 0x40, 0x5a, 0x69, 0xbe, 0xf7, 0x91, 0x04,
+ 0x64, 0xcd, 0x86, 0xee, 0x24, 0xdc, 0x2e, 0xda, 0xe7, 0x95, 0xaa, 0x84,
+ 0x0e, 0xc3, 0x09, 0x3f, 0x46, 0xf1, 0xa2, 0x20, 0x92, 0x1a, 0xca, 0x2c,
+ 0x08, 0xac, 0x68, 0xdc, 0xaf, 0x73, 0x11, 0x5e, 0x3e, 0x27, 0x3f, 0xa3,
+ 0xc9, 0xe9, 0x5a, 0x6a, 0x6b, 0x95, 0xc4, 0x7e, 0x9c, 0x89, 0xa2, 0x7a,
+ 0x59, 0xe9, 0x64, 0xdf, 0x0b, 0x89, 0xab, 0x8c, 0x82, 0x57, 0x80, 0x3e,
+ 0x43, 0x8c, 0x35, 0x9e, 0xda, 0x1a, 0xd5, 0x25, 0xfe, 0x61, 0x41, 0x45,
+ 0xbf, 0x30, 0xae, 0x93, 0x1b, 0xc6, 0x03, 0x76, 0x7e, 0x4e, 0x40, 0x1b,
+ 0xca, 0x9a, 0x50, 0x01, 0x24, 0x42, 0xbc, 0x9f, 0x19, 0xb7, 0xb9, 0xb3,
+ 0x23, 0x5a, 0xdd, 0x8e, 0x83, 0xe8, 0xee, 0x86, 0xfe, 0xed, 0x29, 0x3b,
+ 0xb5, 0x16, 0xc6, 0xd2, 0xcc, 0x82, 0xc0, 0xaa, 0x06, 0x41, 0xcf, 0x29,
+ 0xcd, 0xf7, 0x3e, 0x19, 0xf9, 0x46, 0x9c, 0xc4, 0xaa, 0x36, 0x91, 0xc2,
+ 0x05, 0x28, 0xcd, 0xf7, 0x3c, 0x9b, 0x59, 0x10, 0x78, 0x0a, 0x48, 0x89,
+ 0xad, 0x56, 0x91, 0xc6, 0xde, 0xc8, 0x75, 0xc0, 0x38, 0xe0, 0xd4, 0x30,
+ 0x1c, 0x01, 0xda, 0x11, 0x6f, 0x31, 0x56, 0x1b, 0xf1, 0x76, 0x72, 0xc2,
+ 0xa1, 0xf0, 0x56, 0x97, 0x3b, 0x65, 0x03, 0x68, 0x6b, 0x0f, 0xe9, 0x29,
+ 0x07, 0x0e, 0x6b, 0x70, 0x21, 0xe3, 0xd3, 0x36, 0xc3, 0x91, 0x0d, 0x9f,
+ 0xfd, 0x80, 0x27, 0x13, 0xdd, 0xdf, 0x4e, 0x02, 0x6e, 0x00, 0x46, 0x24,
+ 0x20, 0xdc, 0x6d, 0x0d, 0xf9, 0xd3, 0x1a, 0x8f, 0xeb, 0x0d, 0x23, 0xde,
+ 0x4e, 0x4e, 0xf9, 0x6d, 0xa3, 0xed, 0xcc, 0x82, 0xc0, 0xdf, 0x80, 0x9c,
+ 0xd6, 0xb5, 0x3c, 0xde, 0x9c, 0xd1, 0x33, 0x17, 0xde, 0xe2, 0xda, 0x11,
+ 0x1a, 0xab, 0xc2, 0xc5, 0xc0, 0x05, 0x34, 0x3f, 0xa2, 0xd9, 0xa1, 0x64,
+ 0x16, 0x04, 0xb2, 0x81, 0xf3, 0x1a, 0xf5, 0x59, 0x9b, 0xfb, 0x58, 0x2d,
+ 0xf4, 0x89, 0x05, 0x98, 0x5d, 0x9a, 0xef, 0x9d, 0x99, 0xa4, 0x59, 0xb8,
+ 0x19, 0x78, 0x59, 0x94, 0x7f, 0x86, 0x7a, 0xb9, 0xe7, 0x95, 0xdf, 0x7c,
+ 0x76, 0x5d, 0x94, 0xca, 0x31, 0x9a, 0xc7, 0x55, 0x6e, 0xc4, 0xdb, 0x25,
+ 0xfa, 0xbd, 0xbc, 0x84, 0x34, 0x2b, 0xde, 0x03, 0x2f, 0x9d, 0xbe, 0xd8,
+ 0x35, 0x6b, 0xe2, 0x99, 0xdf, 0x2d, 0x54, 0x98, 0x3f, 0xe1, 0xec, 0x5a,
+ 0xe0, 0x65, 0xe0, 0xe5, 0x71, 0x05, 0xe5, 0x6e, 0x5b, 0xdc, 0x19, 0xa8,
+ 0x5e, 0x02, 0x5c, 0x98, 0x64, 0x29, 0x3b, 0x16, 0x18, 0x1d, 0x87, 0x70,
+ 0x56, 0x26, 0x59, 0xba, 0xd6, 0x02, 0x2f, 0x21, 0xf2, 0x4f, 0x4b, 0x43,
+ 0xfe, 0xb9, 0xf9, 0xa3, 0xa2, 0xae, 0x65, 0xbc, 0x74, 0xfa, 0x62, 0xf7,
+ 0x56, 0xbb, 0x76, 0xdf, 0x66, 0xfc, 0x9d, 0x4f, 0x8d, 0x78, 0xbb, 0x42,
+ 0xb7, 0xd7, 0xe2, 0xc3, 0x16, 0x76, 0x6f, 0x18, 0xb8, 0xd5, 0xae, 0x7d,
+ 0x27, 0xb3, 0x20, 0x70, 0x57, 0xc8, 0x1d, 0x9e, 0x53, 0x91, 0x3b, 0x6a,
+ 0x47, 0xe3, 0x2f, 0x1b, 0x0a, 0x4e, 0x29, 0x50, 0x3a, 0x66, 0x5a, 0xe5,
+ 0x4d, 0xa2, 0xf6, 0x29, 0x18, 0x12, 0xc9, 0x85, 0x2a, 0xd6, 0xf2, 0xb2,
+ 0x49, 0xe9, 0xcd, 0xae, 0xfa, 0xca, 0x2c, 0x5c, 0xd0, 0x8b, 0x70, 0xf8,
+ 0xdc, 0xad, 0x76, 0xed, 0xef, 0x88, 0xfe, 0x9e, 0x3e, 0x50, 0x3a, 0xc9,
+ 0x5b, 0x65, 0xc4, 0xdb, 0x05, 0x98, 0x37, 0xc9, 0xfb, 0xed, 0x98, 0xa9,
+ 0x81, 0x7f, 0x88, 0xf0, 0x93, 0x66, 0x7e, 0x72, 0x02, 0xf0, 0x82, 0x3b,
+ 0xe4, 0xaa, 0xc9, 0x2c, 0x08, 0xcc, 0x05, 0xfe, 0x69, 0xdb, 0xd6, 0xec,
+ 0xf9, 0xb7, 0xa4, 0x6f, 0x6d, 0xfc, 0xa3, 0x86, 0x02, 0xb5, 0xd4, 0xe8,
+ 0x2b, 0x71, 0x94, 0xe6, 0x7b, 0xa3, 0xda, 0x77, 0xec, 0x03, 0xfe, 0x01,
+ 0xea, 0x92, 0x0b, 0x80, 0x8b, 0x09, 0x87, 0xc7, 0x02, 0x69, 0xcd, 0xd7,
+ 0xd6, 0x72, 0x57, 0x77, 0xb4, 0x5d, 0xd7, 0x5d, 0x8c, 0x6f, 0x71, 0x2f,
+ 0xda, 0xac, 0x78, 0x77, 0xd2, 0x03, 0xf8, 0x11, 0xf0, 0x23, 0xcb, 0xb2,
+ 0xeb, 0x33, 0x0b, 0x02, 0x15, 0xc0, 0x3f, 0x71, 0xd9, 0xff, 0x2a, 0xcd,
+ 0xcb, 0x58, 0xd7, 0x8c, 0x4b, 0x6e, 0x4e, 0x84, 0x6e, 0x5b, 0x97, 0xa6,
+ 0xd9, 0x32, 0x37, 0x66, 0xaa, 0x7f, 0x5f, 0x11, 0xb9, 0x10, 0xb8, 0x44,
+ 0xc1, 0xd7, 0xca, 0xf2, 0xf9, 0x0d, 0xe1, 0xf0, 0x1b, 0x46, 0xbc, 0x5d,
+ 0x88, 0xba, 0x2a, 0xde, 0x4f, 0xeb, 0xcd, 0x9b, 0x08, 0x67, 0xb4, 0xf2,
+ 0x96, 0x14, 0x60, 0x2c, 0x30, 0x96, 0xb0, 0xf5, 0x48, 0x66, 0x41, 0x60,
+ 0xa1, 0x20, 0xff, 0x0c, 0xdb, 0xe1, 0x7f, 0xcd, 0xbf, 0x25, 0xe3, 0x4b,
+ 0x80, 0x31, 0xd3, 0x02, 0xbd, 0x51, 0x67, 0xa3, 0xaa, 0x16, 0xe1, 0x30,
+ 0xb8, 0x4a, 0x80, 0x23, 0x88, 0xcc, 0xb4, 0x1a, 0x46, 0x8c, 0xaf, 0x67,
+ 0x3a, 0xda, 0xa4, 0xc0, 0xa7, 0xc0, 0x2a, 0x60, 0x55, 0x24, 0x3d, 0x8e,
+ 0x18, 0x31, 0x66, 0x5a, 0xa0, 0x67, 0xd9, 0x24, 0xef, 0x0e, 0x80, 0xb1,
+ 0x05, 0xfe, 0x43, 0xc0, 0xba, 0x48, 0xd1, 0x4b, 0x80, 0x91, 0x10, 0x73,
+ 0xe5, 0x98, 0x53, 0x7a, 0x4b, 0x46, 0x9d, 0x11, 0x6f, 0x17, 0x22, 0x38,
+ 0xc5, 0xab, 0x63, 0x0b, 0x02, 0x13, 0xd4, 0xd9, 0xc2, 0x7b, 0x17, 0xe0,
+ 0x51, 0xd4, 0x63, 0x59, 0x56, 0x51, 0x66, 0x41, 0xe0, 0x2d, 0xe0, 0x6d,
+ 0x94, 0x73, 0x5a, 0x74, 0xdf, 0x5a, 0x72, 0x0f, 0x6f, 0x19, 0x15, 0x06,
+ 0xb2, 0x77, 0xb5, 0x32, 0xa5, 0x62, 0x91, 0x76, 0x30, 0xe8, 0x91, 0x2a,
+ 0xdf, 0x89, 0x79, 0xa7, 0xb0, 0x8f, 0x04, 0xfa, 0x75, 0x80, 0xd9, 0xb6,
+ 0xec, 0x14, 0xe7, 0xce, 0x8f, 0x28, 0xab, 0x40, 0x56, 0xd9, 0xd4, 0x7e,
+ 0x59, 0x36, 0x39, 0x33, 0x1e, 0xaf, 0xae, 0x7a, 0x88, 0xf2, 0x7a, 0x66,
+ 0x41, 0xe0, 0xdf, 0xc0, 0xe9, 0x0a, 0xa7, 0xb7, 0xe1, 0xbd, 0xf0, 0xd7,
+ 0x22, 0xcc, 0xe9, 0xae, 0x4e, 0x4c, 0x97, 0xde, 0xc3, 0x6a, 0x5e, 0xbe,
+ 0xf7, 0xad, 0xcc, 0x82, 0xc0, 0x43, 0xc0, 0xcd, 0x6d, 0x72, 0xc0, 0x23,
+ 0xef, 0x30, 0x9d, 0xb4, 0xb8, 0x87, 0x35, 0xf7, 0x45, 0x83, 0x10, 0xbe,
+ 0x68, 0xf8, 0xf8, 0xf7, 0xfc, 0x7e, 0xdc, 0xb4, 0x8a, 0xc1, 0xb6, 0x6d,
+ 0x1d, 0xde, 0x4e, 0xae, 0xec, 0x48, 0x97, 0x15, 0x5e, 0x3d, 0x67, 0xd2,
+ 0xa8, 0xf5, 0x0e, 0x43, 0x38, 0x34, 0xc6, 0xdf, 0x9f, 0xdc, 0xf0, 0x69,
+ 0x13, 0x02, 0x3f, 0x9a, 0x37, 0xc9, 0xbb, 0xcd, 0x88, 0xb7, 0xab, 0x22,
+ 0xfa, 0x1b, 0x54, 0x2e, 0x07, 0x06, 0x77, 0xc0, 0xd3, 0x0f, 0xcc, 0x2c,
+ 0x08, 0x3c, 0x24, 0xe8, 0x5f, 0xc4, 0xd6, 0x55, 0x73, 0x6f, 0xc9, 0xd8,
+ 0xdc, 0xda, 0x1b, 0xe7, 0x4e, 0xca, 0x58, 0x8f, 0xb3, 0xb9, 0xd0, 0xb1,
+ 0x7b, 0x05, 0x93, 0xbd, 0x6f, 0xc5, 0x7a, 0xcf, 0xb8, 0x07, 0x2b, 0x06,
+ 0xa8, 0x25, 0xc3, 0x14, 0xf9, 0x25, 0x30, 0xb4, 0xdd, 0xb3, 0x15, 0x1e,
+ 0x9a, 0x97, 0x1f, 0x7b, 0xbc, 0x8d, 0x78, 0x3b, 0x11, 0xa5, 0x93, 0x7c,
+ 0x9b, 0xc7, 0x16, 0x04, 0x2f, 0x51, 0xb4, 0xb2, 0x03, 0x1e, 0x6f, 0x01,
+ 0xe3, 0x15, 0x19, 0xaf, 0x96, 0x90, 0x59, 0x10, 0xd8, 0xb0, 0xbb, 0x5b,
+ 0x2a, 0x9f, 0xaa, 0xe8, 0x2a, 0xcb, 0x96, 0x55, 0xf3, 0x26, 0x7b, 0xbe,
+ 0x6e, 0x45, 0x78, 0x07, 0xc5, 0x29, 0x5e, 0x07, 0xb7, 0xe6, 0x47, 0x63,
+ 0xa7, 0x06, 0x0f, 0xb4, 0x2d, 0x1d, 0x26, 0x2a, 0xc3, 0x40, 0x77, 0x73,
+ 0xed, 0xed, 0xbd, 0x2f, 0xa2, 0x4f, 0x24, 0x5f, 0x28, 0x7a, 0x3b, 0xdd,
+ 0x1c, 0xe9, 0x2e, 0x09, 0xcd, 0x2c, 0x08, 0x4c, 0x00, 0x4a, 0x92, 0x38,
+ 0x8a, 0x35, 0x7b, 0xf4, 0x37, 0x3f, 0x05, 0x56, 0x89, 0xe8, 0x2a, 0xf7,
+ 0xb6, 0x1d, 0x9f, 0xd5, 0xf7, 0xea, 0x95, 0x09, 0xcc, 0x8e, 0xe3, 0xf3,
+ 0xce, 0x4d, 0xd9, 0xb6, 0xad, 0x3c, 0xd4, 0xa7, 0xd7, 0x61, 0xaa, 0xb2,
+ 0x53, 0x98, 0x7b, 0xf6, 0xbd, 0x7b, 0x24, 0xa1, 0x9d, 0xb6, 0xab, 0x70,
+ 0x7c, 0xd9, 0x24, 0x6f, 0xb7, 0xdf, 0xcf, 0xaa, 0xdb, 0xec, 0xdb, 0xac,
+ 0x5a, 0xf7, 0x90, 0x48, 0xea, 0xb1, 0x6d, 0xec, 0xff, 0x26, 0x92, 0x1e,
+ 0x44, 0xde, 0x3f, 0x9f, 0xb0, 0x7b, 0xbc, 0x85, 0xfa, 0x5e, 0xbd, 0x12,
+ 0xf1, 0xbc, 0xd7, 0xea, 0x7b, 0xf7, 0xee, 0x3c, 0xb3, 0xa7, 0x77, 0x91,
+ 0x61, 0x84, 0xbb, 0xcb, 0xad, 0xeb, 0x16, 0x94, 0x4d, 0xce, 0x54, 0x4b,
+ 0xac, 0x89, 0xc0, 0xab, 0x26, 0xdb, 0x3b, 0x6d, 0x15, 0x7c, 0x65, 0x69,
+ 0xbe, 0x77, 0x89, 0xb1, 0x43, 0x37, 0x13, 0x2f, 0xc0, 0xdc, 0x49, 0xe9,
+ 0x75, 0xaa, 0xfa, 0x63, 0xe0, 0x19, 0x93, 0xf5, 0x9d, 0x4b, 0xb5, 0xa2,
+ 0x72, 0x69, 0x69, 0xbe, 0xef, 0x59, 0x63, 0x8a, 0x6e, 0xd8, 0xe7, 0x6d,
+ 0xcc, 0xd8, 0xc2, 0x80, 0x5b, 0xc3, 0x14, 0x02, 0x13, 0x4c, 0x11, 0x48,
+ 0x7a, 0xea, 0x05, 0xcd, 0x9c, 0x97, 0xef, 0x0b, 0x18, 0x53, 0x74, 0xe3,
+ 0x96, 0x77, 0x27, 0xf3, 0xf2, 0xbc, 0xa1, 0x70, 0x28, 0x94, 0x83, 0x70,
+ 0xa7, 0x29, 0x02, 0x49, 0xcd, 0x7a, 0x90, 0x11, 0x46, 0xb8, 0xa6, 0xe5,
+ 0x8d, 0x4a, 0x66, 0x41, 0xc0, 0x0b, 0xcc, 0xa2, 0x63, 0x5f, 0x7d, 0x18,
+ 0x9a, 0x52, 0x66, 0x69, 0xf8, 0x27, 0x73, 0x27, 0x8f, 0xda, 0x64, 0x4c,
+ 0x61, 0x5a, 0xde, 0xa8, 0x94, 0xe6, 0x7b, 0x03, 0x60, 0x1f, 0x0b, 0x54,
+ 0x98, 0xe2, 0x90, 0x34, 0xfc, 0xd6, 0xb2, 0xed, 0x1f, 0x1a, 0xe1, 0x9a,
+ 0x96, 0xb7, 0x75, 0x2d, 0xf0, 0xf4, 0x80, 0x1b, 0x25, 0x07, 0xe5, 0x5e,
+ 0x1c, 0xce, 0x5f, 0x36, 0xb4, 0x99, 0xf7, 0x11, 0xb9, 0xa1, 0x74, 0x92,
+ 0x67, 0xb1, 0x31, 0x85, 0x11, 0x6f, 0xcc, 0x8c, 0x79, 0xb0, 0x62, 0x3f,
+ 0xb1, 0xac, 0x87, 0x89, 0x2c, 0x15, 0x34, 0xb4, 0x0f, 0xf5, 0xc0, 0x9d,
+ 0xaa, 0x3a, 0xbd, 0x6c, 0xb2, 0xaf, 0xde, 0x98, 0xc3, 0x88, 0xd7, 0x31,
+ 0xc3, 0x1f, 0x7b, 0x5b, 0x06, 0x55, 0x55, 0x9d, 0x2b, 0x50, 0x44, 0xd7,
+ 0xda, 0x28, 0x3d, 0x19, 0xf9, 0x97, 0x4b, 0xf4, 0xe6, 0x39, 0x93, 0x7c,
+ 0xff, 0x33, 0xa6, 0x30, 0xe2, 0x8d, 0x5f, 0x2b, 0x3c, 0x35, 0xe0, 0x16,
+ 0xf8, 0x39, 0xc2, 0x6f, 0x68, 0x61, 0x85, 0x90, 0xc1, 0x11, 0x73, 0x10,
+ 0xbd, 0xab, 0x74, 0x92, 0xef, 0x6d, 0x63, 0x0a, 0x23, 0xde, 0xc4, 0xf5,
+ 0x87, 0x1f, 0xac, 0x48, 0xc1, 0xb2, 0xae, 0x05, 0x7e, 0x43, 0x2b, 0x27,
+ 0xf5, 0x1b, 0x9a, 0xa5, 0x14, 0xd5, 0xbb, 0x4a, 0x27, 0xfb, 0xde, 0x30,
+ 0xa6, 0x30, 0xe2, 0x6d, 0x37, 0x7e, 0x38, 0xbd, 0xd2, 0x1d, 0xb6, 0xed,
+ 0x1f, 0x01, 0xe3, 0x01, 0x8f, 0xb1, 0x48, 0xab, 0xa9, 0x05, 0x9e, 0x12,
+ 0xe1, 0xe1, 0x79, 0x93, 0xbc, 0xef, 0x18, 0x73, 0x18, 0xf1, 0x76, 0x6c,
+ 0x6b, 0x5c, 0x10, 0x3c, 0x1e, 0x74, 0x3c, 0x70, 0x2d, 0xf1, 0xdb, 0xb0,
+ 0xbd, 0xab, 0xf1, 0x01, 0x22, 0x8f, 0xa6, 0xaa, 0xfc, 0xf9, 0x95, 0xfc,
+ 0xf4, 0x6d, 0xc6, 0x1c, 0x46, 0xbc, 0x49, 0xc5, 0xa8, 0xfb, 0x2b, 0xd2,
+ 0xac, 0x14, 0xeb, 0x02, 0x89, 0x1c, 0xf6, 0x7c, 0x3e, 0xe6, 0x35, 0xd3,
+ 0x17, 0xc0, 0x2c, 0x54, 0x9e, 0xaf, 0x75, 0xeb, 0x5b, 0xc1, 0x3c, 0xaf,
+ 0x9a, 0x52, 0x62, 0xc4, 0x9b, 0xf4, 0x9c, 0xfb, 0x40, 0x69, 0x8f, 0x90,
+ 0x2b, 0xe5, 0x42, 0x90, 0xcb, 0x80, 0x31, 0x40, 0x9f, 0x6e, 0x92, 0xf4,
+ 0x55, 0xc0, 0x6c, 0x11, 0x66, 0xa5, 0x28, 0x4b, 0x5e, 0xc9, 0x37, 0x82,
+ 0x35, 0xe2, 0xed, 0xc4, 0x8c, 0x29, 0x08, 0xb8, 0x40, 0xbe, 0x2f, 0xe8,
+ 0x28, 0x22, 0xa7, 0x1c, 0x9c, 0xd9, 0x85, 0xec, 0xbd, 0x99, 0xc8, 0x8c,
+ 0xb4, 0xf9, 0x8a, 0x5d, 0x5e, 0x96, 0x9f, 0xb1, 0xca, 0xe4, 0xb8, 0x11,
+ 0x6f, 0xd7, 0x15, 0xf3, 0x03, 0x15, 0x7d, 0x2c, 0x97, 0x9c, 0xa3, 0x30,
+ 0x1c, 0xe4, 0x34, 0xe0, 0x34, 0x62, 0x3b, 0x11, 0xbe, 0xa3, 0x50, 0x60,
+ 0x05, 0xb0, 0x54, 0xe1, 0x6d, 0xd0, 0x37, 0x51, 0xd7, 0xd2, 0xb2, 0xc9,
+ 0xe9, 0xb6, 0xc9, 0x55, 0x23, 0xde, 0x6e, 0xcb, 0xb8, 0x69, 0x95, 0xfb,
+ 0x87, 0x55, 0x4f, 0x13, 0xf4, 0x24, 0x22, 0xdb, 0xbd, 0x1e, 0xdd, 0xf0,
+ 0xef, 0xbe, 0x1d, 0x10, 0x1d, 0x9b, 0xc8, 0xd6, 0x3b, 0x1f, 0x03, 0x1f,
+ 0xa3, 0x7c, 0xac, 0x22, 0xff, 0x09, 0xa5, 0xda, 0xff, 0xf1, 0x67, 0xfb,
+ 0x6a, 0x4c, 0x6e, 0x19, 0xf1, 0x1a, 0x5a, 0x41, 0xe6, 0xf4, 0xca, 0x7e,
+ 0x12, 0xb6, 0x8f, 0x52, 0xe4, 0x10, 0x2c, 0x86, 0xa2, 0x3a, 0x14, 0x18,
+ 0x42, 0x64, 0x97, 0xc6, 0xa1, 0x44, 0x56, 0x40, 0xf5, 0x88, 0xf2, 0x49,
+ 0x6d, 0x68, 0x29, 0x6b, 0xa2, 0x7c, 0xb6, 0x01, 0xeb, 0x88, 0x1c, 0xea,
+ 0xb5, 0x16, 0x64, 0x1d, 0xe8, 0x5a, 0x15, 0x59, 0x6b, 0x61, 0xaf, 0xaa,
+ 0xdb, 0x6e, 0xad, 0xf2, 0xdf, 0xe9, 0x09, 0x1b, 0xeb, 0x1b, 0x0c, 0x1d,
+ 0xc0, 0x8f, 0x9f, 0x9f, 0x65, 0x19, 0x2b, 0x18, 0x0c, 0x06, 0x83, 0xc1,
+ 0x60, 0x30, 0x18, 0x0c, 0x06, 0x83, 0xc1, 0x60, 0x30, 0x18, 0x0c, 0x06,
+ 0x83, 0xc1, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x83, 0xc1, 0x60, 0x30, 0x18,
+ 0x0c, 0x06, 0x83, 0xc1, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x83, 0xc1, 0x60,
+ 0x30, 0x18, 0x0c, 0x06, 0x83, 0xc1, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x43,
+ 0xdb, 0xe9, 0x90, 0x9d, 0x34, 0x32, 0x32, 0x32, 0xd2, 0x34, 0xac, 0x67,
+ 0xa8, 0x70, 0x00, 0x36, 0x43, 0x91, 0xef, 0x76, 0x89, 0xe8, 0x0d, 0x54,
+ 0x03, 0x55, 0x91, 0x8f, 0x6c, 0x11, 0xf4, 0x23, 0x1b, 0x79, 0x3f, 0x18,
+ 0xac, 0xf8, 0xb2, 0x3d, 0xe3, 0xe8, 0xf5, 0x78, 0x0f, 0x04, 0x4e, 0x07,
+ 0x6b, 0x28, 0xe8, 0xce, 0xf8, 0x0d, 0x24, 0xb2, 0xf9, 0xda, 0x5a, 0x60,
+ 0x1d, 0xe8, 0x5a, 0x84, 0x77, 0x03, 0x81, 0xc0, 0x27, 0x89, 0x8a, 0x87,
+ 0xc7, 0xe3, 0x11, 0xa0, 0x7f, 0x0c, 0xb7, 0xd4, 0x04, 0x83, 0xc1, 0xa4,
+ 0xde, 0xb6, 0xc6, 0xe3, 0xf1, 0xec, 0x23, 0xc8, 0x0f, 0xc0, 0xda, 0x0f,
+ 0xbe, 0xdb, 0x25, 0x64, 0x08, 0x91, 0xdd, 0x3e, 0x1a, 0xdb, 0x76, 0xa5,
+ 0xcb, 0xe5, 0x7a, 0xaf, 0xbc, 0xbc, 0x3c, 0x2e, 0xfb, 0x65, 0xa5, 0xa7,
+ 0xa7, 0xf7, 0x17, 0x91, 0x76, 0x2b, 0xf3, 0x22, 0x12, 0x0a, 0x04, 0x02,
+ 0xd5, 0x9d, 0x5e, 0xbc, 0xe9, 0xe9, 0x19, 0x47, 0x59, 0x62, 0x8f, 0x05,
+ 0xc9, 0x04, 0xbc, 0xc4, 0xbe, 0x51, 0xf9, 0x56, 0x60, 0x39, 0xf0, 0x32,
+ 0xa2, 0x2f, 0x04, 0x02, 0x81, 0x2f, 0xe2, 0x19, 0xbf, 0x73, 0xce, 0x19,
+ 0xe3, 0x72, 0x5b, 0x21, 0xaf, 0x42, 0x26, 0x30, 0x16, 0x38, 0x31, 0x86,
+ 0xdb, 0x57, 0x01, 0x65, 0x08, 0xa5, 0x5b, 0xb7, 0x6e, 0x79, 0x65, 0xe9,
+ 0xd2, 0xa5, 0x6d, 0x2e, 0x6c, 0x5e, 0xaf, 0xd7, 0x85, 0xca, 0x03, 0xc0,
+ 0x0d, 0x40, 0xdf, 0x18, 0x6f, 0xdf, 0x01, 0x6c, 0x6a, 0xf4, 0xf9, 0x00,
+ 0x58, 0x8c, 0xe8, 0xa2, 0x40, 0x20, 0xf0, 0x71, 0x47, 0x08, 0xd6, 0xe7,
+ 0xf1, 0x9d, 0xae, 0x30, 0xae, 0xc1, 0xb6, 0x23, 0x68, 0xfd, 0xd9, 0xd0,
+ 0xdf, 0x02, 0xf3, 0x11, 0xca, 0x6c, 0x3b, 0xfc, 0x52, 0x65, 0x65, 0xa5,
+ 0x23, 0x31, 0x78, 0x3d, 0xbe, 0xd7, 0x80, 0x1f, 0xb6, 0x73, 0xb2, 0x15,
+ 0xc8, 0x09, 0x04, 0xfd, 0x25, 0x9d, 0x52, 0xbc, 0x5e, 0x4f, 0xc6, 0xb1,
+ 0xa0, 0x7f, 0x00, 0x2e, 0x8a, 0x63, 0xb0, 0x36, 0xb0, 0x48, 0x21, 0x2b,
+ 0x18, 0xf4, 0xb7, 0xe9, 0xf8, 0x8c, 0xb3, 0xce, 0x3a, 0xcb, 0x4a, 0x49,
+ 0x49, 0xbb, 0x08, 0xd5, 0xbb, 0x63, 0x14, 0x6c, 0x73, 0xfc, 0x0f, 0xb8,
+ 0x2b, 0x10, 0xf4, 0xff, 0xa9, 0x6d, 0xe2, 0xcd, 0xb8, 0x1c, 0xd5, 0x7f,
+ 0x24, 0x20, 0x4b, 0xd6, 0x01, 0x73, 0x14, 0x99, 0x1e, 0x0c, 0x56, 0xbc,
+ 0x9b, 0xf0, 0xfc, 0xf7, 0x66, 0x8c, 0x44, 0xf5, 0xf7, 0x44, 0x8e, 0x87,
+ 0x69, 0x6b, 0x79, 0xab, 0x02, 0x1e, 0xb4, 0x35, 0x3c, 0xbd, 0xb2, 0xb2,
+ 0x72, 0x7b, 0x6b, 0x6f, 0x1a, 0x35, 0x6a, 0x54, 0xef, 0x70, 0xc8, 0xde,
+ 0x48, 0x64, 0x8f, 0xaf, 0xf6, 0xe6, 0xb3, 0x40, 0xd0, 0x7f, 0x78, 0xa7,
+ 0x12, 0xaf, 0xcf, 0xeb, 0x3b, 0x40, 0x95, 0xbb, 0x81, 0xeb, 0x62, 0xa8,
+ 0x65, 0x63, 0xa5, 0x06, 0xc8, 0x0b, 0x04, 0xfd, 0x8f, 0x3a, 0x73, 0xdf,
+ 0x32, 0x3c, 0x82, 0x4e, 0x25, 0xb2, 0x0d, 0x6b, 0xbc, 0x59, 0xad, 0x70,
+ 0x5b, 0x30, 0xe8, 0x7f, 0xde, 0x61, 0x4b, 0xb1, 0x05, 0xe8, 0x97, 0xe0,
+ 0x82, 0x35, 0x1f, 0x91, 0x69, 0x81, 0x40, 0x45, 0x69, 0xfc, 0x5d, 0xe3,
+ 0x8c, 0x63, 0x05, 0x9d, 0x46, 0xa4, 0xb5, 0x8d, 0x77, 0x39, 0xdb, 0xa8,
+ 0x70, 0x4f, 0x38, 0x5c, 0x5f, 0xbc, 0x70, 0xe1, 0xc2, 0x70, 0x2b, 0x6c,
+ 0x79, 0x1d, 0xf0, 0xe7, 0x8e, 0xea, 0x26, 0x28, 0x7a, 0x54, 0x30, 0x18,
+ 0xff, 0xae, 0x55, 0x42, 0x44, 0xe5, 0xf3, 0x64, 0x9c, 0xae, 0xca, 0x3b,
+ 0xc0, 0x2f, 0x12, 0x28, 0x5c, 0x88, 0xec, 0x98, 0xf8, 0xe3, 0x58, 0x6f,
+ 0x1a, 0x39, 0x72, 0xa4, 0xe5, 0xf5, 0xf8, 0x26, 0x09, 0x1a, 0x48, 0x90,
+ 0x70, 0x01, 0x0e, 0x17, 0x78, 0xd6, 0xeb, 0xf1, 0xdd, 0x13, 0x7b, 0x6b,
+ 0x35, 0xca, 0xdd, 0x0e, 0xc2, 0x05, 0x18, 0x8d, 0xea, 0x3c, 0xaf, 0xc7,
+ 0xf7, 0xd7, 0x11, 0x23, 0xbe, 0xef, 0x8a, 0x63, 0x6b, 0x7b, 0x91, 0xa0,
+ 0xcb, 0x1a, 0xdc, 0xd4, 0x44, 0x34, 0x10, 0x03, 0x05, 0xa6, 0xbb, 0x5d,
+ 0x29, 0x7f, 0xf7, 0xa5, 0xfb, 0x5a, 0xd3, 0xfd, 0x3a, 0xbb, 0x43, 0x07,
+ 0x96, 0x54, 0x12, 0xd2, 0xf2, 0x5a, 0xf1, 0x17, 0xae, 0xef, 0x3c, 0x45,
+ 0x2b, 0x81, 0xc1, 0xed, 0x64, 0x1b, 0x57, 0x6c, 0x05, 0xcb, 0xdb, 0x23,
+ 0x35, 0x25, 0xed, 0xcf, 0x40, 0x41, 0x3b, 0xc4, 0xcd, 0x02, 0xee, 0xf0,
+ 0x7a, 0x7c, 0x2f, 0x0c, 0x1f, 0x3e, 0xbc, 0xd5, 0xb6, 0x56, 0x6d, 0xf7,
+ 0x81, 0xc4, 0xab, 0x7a, 0xf5, 0xec, 0xb5, 0xd2, 0xeb, 0xf5, 0x1e, 0xd6,
+ 0xf6, 0x6e, 0x92, 0xef, 0x76, 0x54, 0x5f, 0x68, 0xa8, 0x58, 0x13, 0xcd,
+ 0x65, 0x2a, 0x2c, 0xf0, 0xf9, 0x32, 0x86, 0xee, 0xe5, 0x77, 0xfb, 0xd2,
+ 0xa1, 0xea, 0x4d, 0x4c, 0x45, 0x1c, 0x57, 0xf1, 0x7a, 0x3d, 0xbe, 0x6b,
+ 0x15, 0x5e, 0x06, 0x7a, 0xb6, 0xa3, 0x69, 0xbe, 0x89, 0x41, 0xb8, 0xbd,
+ 0x50, 0x29, 0x03, 0xae, 0x69, 0xe7, 0xec, 0xbb, 0xa4, 0x5f, 0xdf, 0xfe,
+ 0xc9, 0x7e, 0x88, 0xf4, 0x30, 0x54, 0x56, 0xf9, 0x7c, 0x19, 0x87, 0x3a,
+ 0xce, 0xff, 0x74, 0xdf, 0x13, 0xc0, 0xbd, 0xb1, 0x56, 0xa8, 0x6d, 0x64,
+ 0xb8, 0xda, 0xfa, 0xae, 0x37, 0xdd, 0xd7, 0x92, 0x40, 0x3b, 0xfa, 0xcc,
+ 0xa8, 0xbe, 0x49, 0x2d, 0x5e, 0xaf, 0xc7, 0x77, 0x06, 0xf0, 0xc7, 0x04,
+ 0xbb, 0xc9, 0xd1, 0x08, 0xb6, 0xca, 0x23, 0xf0, 0xf9, 0xdc, 0xa8, 0x3c,
+ 0xd1, 0x81, 0x2e, 0xd4, 0xa9, 0x5e, 0x8f, 0xef, 0xe5, 0x24, 0x17, 0xb0,
+ 0xa5, 0xb6, 0x2e, 0x1f, 0x37, 0x6e, 0x5c, 0x9a, 0x83, 0xfc, 0x9f, 0x82,
+ 0xf0, 0xf3, 0x0e, 0x8a, 0xf7, 0xbe, 0x08, 0xf3, 0xbd, 0x5e, 0x6f, 0x73,
+ 0x22, 0xed, 0xe8, 0xa3, 0x59, 0xc2, 0x49, 0x2b, 0x5e, 0xaf, 0xd7, 0xbb,
+ 0x0f, 0xf0, 0x7c, 0x3b, 0xd7, 0xb8, 0x00, 0xb5, 0x62, 0xf1, 0x4c, 0x6b,
+ 0x7e, 0x68, 0xdb, 0xfc, 0x1c, 0xb8, 0xac, 0x83, 0x33, 0xf1, 0x7c, 0xaf,
+ 0xc7, 0x77, 0x75, 0x92, 0x0b, 0x78, 0x40, 0xcd, 0x8e, 0xda, 0x0a, 0xaf,
+ 0xd7, 0xdb, 0xea, 0xb2, 0x91, 0x9e, 0xee, 0xfb, 0x1e, 0x70, 0x07, 0x1d,
+ 0x7b, 0x02, 0xc7, 0x49, 0xa8, 0x34, 0x37, 0xbe, 0x50, 0xd5, 0xc1, 0x36,
+ 0xad, 0x4a, 0x5a, 0xf1, 0xa2, 0xf2, 0x08, 0x70, 0x68, 0x07, 0x18, 0xe5,
+ 0x3d, 0xbf, 0xdf, 0xbf, 0xd7, 0x43, 0x9b, 0xbd, 0x1e, 0xdf, 0xc1, 0x02,
+ 0x8f, 0x25, 0x81, 0x30, 0x04, 0x78, 0x64, 0xdc, 0xb8, 0x71, 0xae, 0x24,
+ 0x17, 0xf0, 0x48, 0x51, 0x69, 0xf5, 0x40, 0xa0, 0x25, 0x94, 0x02, 0xee,
+ 0x24, 0x88, 0x77, 0x8e, 0xcf, 0x9b, 0x71, 0x72, 0xd3, 0xf2, 0xc9, 0xff,
+ 0x3a, 0x38, 0xd3, 0xb7, 0x26, 0xa5, 0x78, 0xbd, 0x5e, 0xef, 0x58, 0xe0,
+ 0xf2, 0x8e, 0x30, 0x8a, 0xb6, 0x7e, 0xd0, 0x69, 0x72, 0x07, 0x78, 0x05,
+ 0xcd, 0xd1, 0xab, 0x66, 0x47, 0xed, 0x1f, 0x92, 0x5c, 0xbc, 0x28, 0x3c,
+ 0x99, 0x9e, 0xee, 0xdb, 0xab, 0x20, 0xbd, 0x1e, 0xdf, 0x35, 0xb4, 0xdf,
+ 0xe0, 0xe4, 0xde, 0xe3, 0xad, 0xfa, 0x60, 0x13, 0xf1, 0x08, 0x73, 0x3a,
+ 0x34, 0x4e, 0x22, 0x1f, 0x24, 0x67, 0xcb, 0xab, 0x72, 0x5b, 0x07, 0xd9,
+ 0xe4, 0xb3, 0x60, 0xd0, 0xff, 0x5c, 0x2b, 0xfa, 0xba, 0xfb, 0x02, 0x13,
+ 0x92, 0x4c, 0x1b, 0x37, 0x92, 0xfc, 0xf4, 0x14, 0xd1, 0x53, 0x5b, 0xf1,
+ 0xbb, 0x82, 0x24, 0x8b, 0xf7, 0x18, 0xaf, 0xc7, 0x77, 0x44, 0xe3, 0x0b,
+ 0xbd, 0xfb, 0xf6, 0x7e, 0x0d, 0xd8, 0xde, 0x41, 0xf1, 0x79, 0x27, 0x10,
+ 0xa8, 0xf8, 0x26, 0xe9, 0xc4, 0xeb, 0xf5, 0x64, 0x9c, 0x0e, 0xa4, 0xc7,
+ 0x31, 0x3e, 0xdb, 0x81, 0xaf, 0x5b, 0x61, 0x68, 0x5b, 0x91, 0x89, 0xad,
+ 0xab, 0x89, 0xf9, 0x69, 0x1c, 0xfb, 0x62, 0xf1, 0x2a, 0x00, 0xfd, 0xbc,
+ 0x1e, 0xef, 0x65, 0xc9, 0xae, 0x5e, 0x41, 0x5e, 0xf4, 0x78, 0x3c, 0x56,
+ 0xf3, 0x5e, 0x57, 0xc6, 0x59, 0x44, 0xe6, 0x7b, 0x27, 0x93, 0x6d, 0x41,
+ 0xb8, 0xa9, 0xf1, 0x7f, 0x5f, 0x79, 0xe5, 0x95, 0x10, 0xf0, 0x10, 0xf0,
+ 0x19, 0xf0, 0x79, 0x0b, 0x1f, 0x75, 0xf0, 0xb4, 0x2f, 0x5a, 0x08, 0xef,
+ 0x13, 0xe0, 0xce, 0x44, 0xf6, 0xc1, 0xda, 0x20, 0x5e, 0xdf, 0xb3, 0xc0,
+ 0x4f, 0xda, 0xe6, 0x9d, 0x31, 0x1b, 0x78, 0xc6, 0x85, 0xe5, 0x2f, 0x0f,
+ 0x96, 0x6f, 0x68, 0xe4, 0x8e, 0x0f, 0x05, 0x19, 0x89, 0x72, 0x71, 0x83,
+ 0x5b, 0x9e, 0xd2, 0xe8, 0xbe, 0x47, 0x03, 0x41, 0xff, 0x4d, 0x7b, 0x0b,
+ 0xdc, 0xe3, 0xf1, 0xf4, 0x11, 0xac, 0x6f, 0x89, 0x7d, 0x1e, 0x75, 0xe3,
+ 0xf8, 0xbd, 0x2a, 0xf0, 0x90, 0xe5, 0xb6, 0x16, 0x95, 0x97, 0x97, 0x57,
+ 0xa7, 0x9f, 0x33, 0x7a, 0xb0, 0x25, 0xf6, 0x68, 0x44, 0xb3, 0x81, 0xef,
+ 0xb7, 0x21, 0xed, 0x6b, 0x02, 0x41, 0xff, 0xfe, 0xd1, 0xe3, 0x3d, 0x2a,
+ 0x45, 0xb0, 0xeb, 0x62, 0x0c, 0xaf, 0x16, 0x98, 0x48, 0x64, 0x72, 0xc7,
+ 0x60, 0x22, 0xf3, 0x87, 0xcf, 0x8a, 0x83, 0xff, 0xdc, 0x27, 0x50, 0x19,
+ 0x7d, 0x5c, 0xc1, 0xeb, 0xf1, 0x7d, 0x0a, 0xb4, 0x65, 0x02, 0xc2, 0x1b,
+ 0x02, 0x45, 0xe2, 0xb2, 0xca, 0x2a, 0x2a, 0xca, 0x37, 0x7a, 0x3c, 0x9e,
+ 0xbe, 0x82, 0x8c, 0x04, 0xf9, 0x15, 0x70, 0x41, 0x1b, 0xca, 0x67, 0x58,
+ 0x60, 0xb0, 0x3f, 0xe8, 0xdf, 0x1c, 0x63, 0x79, 0xae, 0x01, 0xd2, 0x62,
+ 0x33, 0x8f, 0xdd, 0x2b, 0x18, 0x0c, 0xee, 0xe8, 0x88, 0xca, 0xd5, 0xf1,
+ 0x20, 0x83, 0xc7, 0xe3, 0xe9, 0x07, 0x5c, 0xda, 0x86, 0x67, 0x7f, 0x81,
+ 0xf0, 0x93, 0x40, 0xc0, 0xff, 0x7a, 0xb4, 0x2f, 0x03, 0x81, 0xc0, 0x5a,
+ 0xe0, 0x25, 0xe0, 0x25, 0x5f, 0xba, 0x6f, 0xa2, 0x0a, 0x37, 0x12, 0x79,
+ 0x3f, 0xfb, 0x62, 0x20, 0xe8, 0xbf, 0xb5, 0x75, 0x35, 0x93, 0x6b, 0x18,
+ 0xa8, 0x53, 0xe1, 0xd6, 0x01, 0x37, 0x06, 0x82, 0xfe, 0x27, 0x1b, 0x5f,
+ 0xac, 0x5c, 0x30, 0x7f, 0x3d, 0xf0, 0xac, 0xcf, 0xe7, 0x9b, 0xa5, 0x36,
+ 0x77, 0x03, 0xb7, 0x3b, 0x0c, 0x7f, 0x9f, 0x38, 0xe7, 0x65, 0x7d, 0x20,
+ 0xe8, 0x7f, 0xb8, 0xf1, 0x85, 0x8c, 0x8c, 0x8c, 0x21, 0x76, 0x48, 0x6f,
+ 0x45, 0x98, 0xd4, 0x06, 0xdf, 0xec, 0x10, 0x22, 0x0b, 0x1b, 0xa2, 0xb1,
+ 0x7f, 0x1b, 0xe2, 0x7b, 0x2f, 0xa2, 0x53, 0xfc, 0x81, 0x40, 0x68, 0xe7,
+ 0x85, 0x60, 0x30, 0x58, 0x05, 0xcc, 0x03, 0xe6, 0xf9, 0xbc, 0xbe, 0xab,
+ 0x55, 0xf9, 0x23, 0xce, 0xe6, 0x23, 0xbb, 0x80, 0x23, 0x80, 0xff, 0xd0,
+ 0x85, 0x71, 0xec, 0x36, 0x0b, 0xd6, 0xe9, 0x6d, 0x18, 0x04, 0xfa, 0x40,
+ 0x2c, 0x4e, 0x6b, 0x4e, 0xb8, 0x7b, 0xe2, 0xaf, 0xf4, 0xaf, 0x0b, 0x04,
+ 0xfd, 0xf7, 0x04, 0x82, 0xfe, 0x23, 0x5b, 0x2b, 0xdc, 0x86, 0x7a, 0xd1,
+ 0xe9, 0xd4, 0x47, 0x5b, 0x84, 0xac, 0x3d, 0x85, 0xbb, 0x5b, 0x9c, 0xfc,
+ 0xfe, 0x90, 0x62, 0xdf, 0x09, 0x14, 0x3a, 0x7c, 0x46, 0x9a, 0xd7, 0xeb,
+ 0x3d, 0x3e, 0x91, 0x99, 0x5b, 0x51, 0x51, 0xb1, 0x2e, 0x50, 0xe9, 0xcf,
+ 0x47, 0x9d, 0x0f, 0x28, 0x8a, 0x72, 0x43, 0x33, 0x63, 0x09, 0x47, 0xe3,
+ 0x70, 0x16, 0x95, 0x40, 0xb1, 0x62, 0xff, 0x36, 0xd0, 0x48, 0xb8, 0x4d,
+ 0xec, 0x1b, 0xf0, 0xff, 0x15, 0xe5, 0x26, 0x1c, 0xbe, 0xa3, 0x55, 0x18,
+ 0x4e, 0x17, 0xa7, 0x2d, 0x7d, 0xde, 0x91, 0x0e, 0xef, 0xab, 0x16, 0xb8,
+ 0xc4, 0xef, 0xf7, 0xaf, 0x6b, 0x87, 0xf4, 0x39, 0x2d, 0xb4, 0x8b, 0xfc,
+ 0x01, 0xff, 0xe3, 0x7b, 0xfb, 0x51, 0x30, 0x18, 0xb4, 0x2d, 0xe4, 0x76,
+ 0x22, 0x2b, 0x75, 0x9c, 0x94, 0xb0, 0x5f, 0xb6, 0x47, 0x26, 0x07, 0x2a,
+ 0xfd, 0xcf, 0x03, 0x6f, 0x3b, 0x14, 0xc1, 0x35, 0x19, 0x19, 0x19, 0x4d,
+ 0xdc, 0x57, 0xb5, 0xd5, 0xe9, 0x20, 0xe0, 0x7a, 0x11, 0xb9, 0x35, 0x18,
+ 0x0c, 0xda, 0xad, 0x88, 0xf7, 0x5f, 0x80, 0x05, 0x0e, 0x9f, 0x73, 0x89,
+ 0x11, 0x6f, 0xf3, 0x8c, 0x71, 0x78, 0xdf, 0x53, 0xfe, 0xa0, 0xff, 0x83,
+ 0x44, 0x27, 0xcc, 0xe3, 0xf1, 0xf4, 0x00, 0x7c, 0x4e, 0xdc, 0x65, 0xc5,
+ 0x6a, 0xf5, 0x60, 0x52, 0x45, 0xb0, 0xa2, 0x06, 0x07, 0x8b, 0x23, 0x1a,
+ 0xda, 0xa0, 0x8b, 0xdb, 0x2b, 0xa3, 0x15, 0xf9, 0xa9, 0xc3, 0x5b, 0x07,
+ 0xd8, 0x21, 0x8d, 0xe2, 0xba, 0xca, 0x25, 0x4e, 0xd3, 0x5c, 0x11, 0xa8,
+ 0xa8, 0x69, 0x7d, 0xbc, 0xed, 0xcb, 0x80, 0x7a, 0x07, 0x0f, 0xf2, 0x65,
+ 0x64, 0x64, 0xa4, 0x1a, 0xf1, 0xee, 0x41, 0x46, 0x46, 0x46, 0x4a, 0xc3,
+ 0x80, 0x48, 0xcc, 0xfd, 0x32, 0xb1, 0x68, 0xa7, 0x77, 0x9c, 0xd6, 0x81,
+ 0x0e, 0xdd, 0xfa, 0x55, 0xc1, 0x60, 0xf9, 0x9a, 0x18, 0xa5, 0xb1, 0x14,
+ 0x67, 0x23, 0x95, 0x03, 0xda, 0x2b, 0xa3, 0x83, 0xc1, 0x8a, 0x8f, 0x1c,
+ 0xbb, 0xa0, 0x12, 0xd5, 0x8e, 0xfd, 0x1c, 0x05, 0x25, 0xba, 0x34, 0xb6,
+ 0x78, 0x07, 0xd7, 0xa1, 0xac, 0x72, 0xf0, 0xac, 0x14, 0xdb, 0x6e, 0x53,
+ 0x9f, 0xbc, 0x6b, 0x8a, 0x57, 0xc3, 0x3a, 0x00, 0x67, 0x83, 0x5d, 0x1f,
+ 0xf8, 0xfd, 0xfe, 0xaf, 0xdb, 0x23, 0x61, 0x82, 0x38, 0x9d, 0x8c, 0xfe,
+ 0x5c, 0xac, 0x37, 0x04, 0x82, 0x81, 0x6d, 0x40, 0x99, 0x83, 0x67, 0xb5,
+ 0xf7, 0xac, 0x24, 0x75, 0x66, 0xcb, 0xa8, 0xe2, 0x75, 0x12, 0xf7, 0x97,
+ 0xfd, 0x01, 0xff, 0x76, 0x07, 0x11, 0x70, 0x36, 0x27, 0x5c, 0xb5, 0xb7,
+ 0x11, 0x6f, 0xfc, 0x5a, 0x8c, 0xff, 0xb6, 0x57, 0xc2, 0x04, 0x75, 0xb6,
+ 0xb2, 0x49, 0xe4, 0x55, 0x87, 0x0f, 0xfc, 0xa7, 0x83, 0xbb, 0xda, 0x7b,
+ 0xd6, 0xd7, 0x57, 0x0e, 0xc5, 0x6b, 0xc5, 0x25, 0xee, 0x22, 0x2f, 0x39,
+ 0xb3, 0xad, 0xbe, 0xe2, 0x30, 0xbd, 0x3d, 0x8c, 0x78, 0x9b, 0x54, 0x68,
+ 0x8e, 0xc5, 0xfb, 0x51, 0x3b, 0x36, 0x31, 0x4e, 0xc4, 0x1b, 0x1a, 0x3c,
+ 0x78, 0xe0, 0x7f, 0x9c, 0x95, 0x2f, 0x58, 0x74, 0x8b, 0x17, 0x00, 0x00,
+ 0x13, 0xdf, 0x49, 0x44, 0x41, 0x54, 0x59, 0x98, 0xf4, 0x2d, 0xaf, 0xf2,
+ 0x99, 0x43, 0x5b, 0xc6, 0xa5, 0xe5, 0x15, 0x78, 0xdd, 0x91, 0x02, 0x7b,
+ 0xf4, 0x58, 0xe2, 0xc8, 0xe5, 0xd7, 0x76, 0x5d, 0x9a, 0xda, 0xee, 0x38,
+ 0x2d, 0x3c, 0x0e, 0xc5, 0xab, 0x1b, 0xf6, 0xf6, 0x0b, 0x8f, 0xc7, 0xe3,
+ 0xb2, 0xb0, 0x0e, 0xb5, 0x91, 0xa1, 0x16, 0xba, 0x8f, 0x2a, 0x03, 0x44,
+ 0xd8, 0x47, 0x23, 0xcf, 0x0c, 0xa3, 0x6c, 0x41, 0x74, 0xa3, 0xa8, 0x7c,
+ 0x64, 0xa5, 0x58, 0x1f, 0x95, 0x97, 0x97, 0x37, 0xe7, 0x86, 0x39, 0x79,
+ 0x8f, 0x5a, 0x33, 0x6b, 0xd6, 0x2c, 0x75, 0x56, 0xc0, 0xb5, 0xd6, 0x49,
+ 0xcb, 0x7b, 0xe9, 0xa5, 0x97, 0xba, 0x66, 0xcd, 0x9a, 0x15, 0x6e, 0x8f,
+ 0xcc, 0x16, 0x61, 0x9d, 0x3a, 0xcb, 0xb7, 0x7e, 0xc0, 0xc6, 0x9d, 0xff,
+ 0xf3, 0xf9, 0x7c, 0x03, 0xd4, 0x8e, 0x7d, 0x02, 0x85, 0xda, 0x8e, 0x6c,
+ 0xc4, 0xdc, 0xb9, 0x73, 0xc3, 0x5e, 0x8f, 0xaf, 0x2e, 0xd6, 0x96, 0x54,
+ 0x2c, 0xe9, 0x65, 0xc4, 0xdb, 0xb4, 0x10, 0xf4, 0x70, 0x56, 0x08, 0xd8,
+ 0xd4, 0xd2, 0x97, 0x5e, 0x8f, 0xef, 0xaf, 0xc0, 0xe5, 0x0a, 0xa9, 0x82,
+ 0x46, 0x3a, 0x68, 0xb2, 0x47, 0x47, 0x4d, 0x1a, 0x9c, 0x62, 0x81, 0x70,
+ 0xc8, 0xae, 0xf3, 0x7a, 0x7c, 0xaf, 0x20, 0x3a, 0xb1, 0xc9, 0x6e, 0x92,
+ 0xc2, 0x7e, 0x0e, 0x7a, 0x78, 0x75, 0x4e, 0x0d, 0xa9, 0x10, 0x72, 0x32,
+ 0x1d, 0x68, 0xc3, 0x86, 0x0d, 0xfb, 0x3b, 0x75, 0x67, 0x1d, 0x78, 0x4c,
+ 0x9b, 0x9c, 0xcd, 0x59, 0x92, 0x3d, 0x67, 0x10, 0x1d, 0xec, 0xb0, 0xf6,
+ 0x08, 0xb5, 0x21, 0xfa, 0xf5, 0xb1, 0x8a, 0x57, 0x55, 0x87, 0x1a, 0xf1,
+ 0xee, 0x81, 0x0d, 0x5b, 0xc5, 0x51, 0x01, 0xdf, 0xdb, 0x20, 0x92, 0x1e,
+ 0x00, 0x12, 0xcb, 0xf0, 0x7e, 0x2a, 0x70, 0x09, 0x2a, 0x5b, 0x80, 0xeb,
+ 0xe3, 0x25, 0x44, 0x67, 0xfd, 0x42, 0x11, 0x27, 0xe3, 0x41, 0xed, 0xb8,
+ 0x8d, 0x30, 0x88, 0xf4, 0x73, 0x38, 0x66, 0x55, 0x17, 0x1f, 0xdb, 0xda,
+ 0xd2, 0x26, 0x13, 0x1b, 0xda, 0xde, 0xe7, 0x15, 0xc4, 0xd1, 0xfa, 0x44,
+ 0x51, 0x06, 0x25, 0xa8, 0x2f, 0x27, 0x51, 0xae, 0xad, 0x71, 0x10, 0x92,
+ 0xf3, 0xf7, 0x82, 0xaa, 0x4e, 0x2a, 0x42, 0xdd, 0xbc, 0x79, 0x73, 0x3b,
+ 0xae, 0x35, 0xb5, 0x9d, 0xda, 0xdf, 0xde, 0xa3, 0xc2, 0x71, 0xb6, 0x67,
+ 0xb6, 0x4a, 0x5b, 0xfa, 0xf8, 0x31, 0xe7, 0x8d, 0x88, 0xac, 0x35, 0xe2,
+ 0x6d, 0x22, 0x42, 0xdd, 0xe2, 0xb0, 0xee, 0x3c, 0x24, 0x41, 0xcd, 0x5e,
+ 0xb4, 0x97, 0xf8, 0x4e, 0x76, 0x2f, 0xe8, 0x71, 0xe9, 0xa5, 0x97, 0x3a,
+ 0x1b, 0x81, 0x17, 0x75, 0xd2, 0xc7, 0x0e, 0xc7, 0x63, 0x83, 0xf6, 0x18,
+ 0x22, 0x79, 0xb0, 0x33, 0xf3, 0xee, 0x2e, 0xde, 0x8a, 0x8a, 0x8a, 0x1d,
+ 0x38, 0x18, 0x40, 0x12, 0x4b, 0x1c, 0x0d, 0x20, 0x79, 0x3c, 0x9e, 0xbe,
+ 0xec, 0xbe, 0x30, 0xa5, 0xb5, 0x7d, 0xec, 0xed, 0x46, 0xbc, 0x4d, 0x9c,
+ 0x1f, 0xdb, 0xe9, 0xce, 0x00, 0x27, 0x26, 0x28, 0x1d, 0xa1, 0x28, 0x2d,
+ 0xaf, 0x93, 0x8c, 0x73, 0xaf, 0x5f, 0xbf, 0xfe, 0x74, 0x87, 0x71, 0x18,
+ 0xe7, 0x44, 0xbc, 0xed, 0x9c, 0xdf, 0xc3, 0x1c, 0x3a, 0x36, 0xe1, 0x56,
+ 0xd9, 0x7c, 0xef, 0x7d, 0xd0, 0x73, 0x1c, 0x7a, 0x7a, 0x19, 0x8e, 0xdc,
+ 0x66, 0x61, 0x87, 0x11, 0xef, 0x9e, 0x37, 0x59, 0xd6, 0x16, 0x9c, 0x75,
+ 0x9e, 0x4e, 0xc8, 0xc8, 0xc8, 0x48, 0x8b, 0x7b, 0x2a, 0xb4, 0x69, 0xcb,
+ 0x2b, 0x4e, 0x33, 0x4e, 0x2d, 0x87, 0x27, 0x3b, 0x88, 0x93, 0xf5, 0xb9,
+ 0xa1, 0xce, 0x90, 0xdf, 0x88, 0x86, 0xe3, 0x54, 0xf1, 0x38, 0x9d, 0x52,
+ 0xf9, 0x23, 0x87, 0xe9, 0xad, 0x31, 0xe2, 0xdd, 0x03, 0xbf, 0xdf, 0x5f,
+ 0x0f, 0x7c, 0xe8, 0xe0, 0xd6, 0x7e, 0x76, 0x48, 0xe3, 0xbf, 0x8b, 0x44,
+ 0x14, 0xb7, 0xd9, 0x76, 0xbc, 0x6f, 0x90, 0xc6, 0x3c, 0xdf, 0xd8, 0xeb,
+ 0xf1, 0x0d, 0x74, 0xe8, 0x55, 0xb4, 0x9b, 0x78, 0x1b, 0xe6, 0x7a, 0x3b,
+ 0x19, 0xf4, 0xd9, 0xa6, 0x1a, 0x75, 0x6d, 0xb1, 0x93, 0xf9, 0xc6, 0x63,
+ 0x3c, 0x9e, 0x0c, 0x27, 0xdb, 0xa0, 0x7a, 0x9d, 0x95, 0x0b, 0xd9, 0x66,
+ 0xc4, 0x1b, 0x9d, 0xa0, 0x43, 0xa1, 0x4d, 0xc8, 0xcc, 0xcc, 0x4c, 0x6d,
+ 0xa6, 0x4f, 0x74, 0xb1, 0x62, 0x0f, 0xd9, 0xf9, 0x21, 0xb2, 0x9e, 0xd7,
+ 0x91, 0x08, 0xc2, 0xe1, 0xfa, 0xaf, 0x89, 0x9c, 0x38, 0x18, 0x2b, 0x87,
+ 0xfb, 0xd2, 0x7d, 0x87, 0xc5, 0x56, 0x46, 0xb8, 0xd0, 0xa1, 0x0d, 0xd7,
+ 0xb7, 0x5b, 0x6f, 0x57, 0xac, 0x89, 0x8e, 0xc4, 0xab, 0xbc, 0x14, 0x0c,
+ 0x06, 0xa3, 0x79, 0x59, 0x6b, 0x1c, 0x15, 0x38, 0xd5, 0x98, 0xb6, 0xde,
+ 0xcd, 0xf0, 0x66, 0x8c, 0x00, 0x0e, 0x74, 0xf0, 0xa8, 0xda, 0x50, 0x48,
+ 0xbf, 0x31, 0xe2, 0x8d, 0x9e, 0xa9, 0x8b, 0x1d, 0xde, 0x79, 0x54, 0x5d,
+ 0x6d, 0x7d, 0x71, 0x33, 0x2d, 0xfa, 0xd6, 0x60, 0x30, 0xb8, 0x7e, 0xe7,
+ 0x07, 0x55, 0x6d, 0x65, 0x5c, 0x9a, 0xb4, 0x02, 0x0b, 0x17, 0x2e, 0x0c,
+ 0x0b, 0x38, 0x99, 0x56, 0x97, 0xa2, 0x42, 0xab, 0xcf, 0x17, 0xf2, 0x79,
+ 0x7d, 0x03, 0x54, 0x79, 0xdc, 0xa1, 0xa4, 0x9e, 0x69, 0xb7, 0x9c, 0x56,
+ 0xa6, 0x38, 0x2b, 0x21, 0xfa, 0xb7, 0xe8, 0x75, 0x30, 0x4f, 0x3a, 0x8a,
+ 0x86, 0xf0, 0x9c, 0xcf, 0xe3, 0x6b, 0xf5, 0x9c, 0x63, 0x5b, 0xf5, 0x19,
+ 0x67, 0xe5, 0x54, 0xca, 0x16, 0x2e, 0xf4, 0xd7, 0x19, 0xf1, 0x46, 0xbf,
+ 0xb3, 0x2d, 0xbb, 0x14, 0xdc, 0xe0, 0xf5, 0xf8, 0xf6, 0xba, 0x03, 0x85,
+ 0x48, 0xeb, 0x5e, 0x2d, 0x88, 0x44, 0x77, 0x3f, 0x15, 0x79, 0xd1, 0x61,
+ 0xfc, 0x4e, 0xf3, 0x7a, 0x7c, 0xbf, 0xdf, 0xab, 0x70, 0xd3, 0x7d, 0x3d,
+ 0x54, 0x79, 0x0d, 0xa7, 0x93, 0x5d, 0x2c, 0xfd, 0x63, 0xfb, 0xb8, 0xcc,
+ 0xbe, 0xbb, 0x71, 0x30, 0x5a, 0xdb, 0xa0, 0xb6, 0x25, 0xd1, 0x2f, 0xa7,
+ 0xfc, 0xc9, 0xe1, 0xb8, 0x47, 0x1f, 0x85, 0xbf, 0x79, 0xbd, 0xde, 0xd6,
+ 0xec, 0x4c, 0xf9, 0x17, 0x1c, 0x0e, 0xb2, 0x21, 0xbc, 0x40, 0x17, 0xc7,
+ 0xb1, 0x78, 0x55, 0xed, 0x95, 0x44, 0x0e, 0x9a, 0x76, 0x66, 0x5a, 0xb8,
+ 0xd7, 0xeb, 0xf1, 0x3d, 0xe1, 0xf3, 0xf9, 0xa2, 0x6e, 0x60, 0x36, 0x7c,
+ 0xf8, 0x70, 0x51, 0x38, 0xa6, 0x75, 0x8d, 0x8a, 0x34, 0xd3, 0xff, 0xb2,
+ 0xff, 0xdb, 0x86, 0xf8, 0xdd, 0xee, 0xf5, 0xf8, 0x8a, 0x7e, 0xf0, 0x83,
+ 0x1f, 0x44, 0x2d, 0x64, 0x19, 0xbe, 0x51, 0x07, 0x6a, 0x64, 0xbf, 0xe2,
+ 0x33, 0x1d, 0x3e, 0x63, 0x87, 0xdf, 0xef, 0x8f, 0xe7, 0xcc, 0xaa, 0xb4,
+ 0x66, 0x3c, 0x83, 0x6b, 0x04, 0x7e, 0xdb, 0x06, 0x7f, 0x3b, 0xea, 0xc0,
+ 0x5f, 0x20, 0x50, 0xba, 0x0e, 0x1c, 0x8f, 0xe6, 0x5e, 0x84, 0xca, 0x0b,
+ 0xe9, 0xe9, 0x9e, 0xa8, 0xd3, 0x6c, 0x47, 0x8f, 0x1e, 0xdd, 0xcb, 0xeb,
+ 0xf1, 0x3d, 0x4d, 0x5b, 0x8e, 0xa5, 0x51, 0x96, 0x77, 0x75, 0xf1, 0x3a,
+ 0x7e, 0x69, 0x1e, 0x0c, 0x06, 0xc3, 0x5e, 0x8f, 0xef, 0x51, 0xa0, 0x2d,
+ 0x5b, 0xbf, 0x5e, 0xa3, 0x36, 0x17, 0x79, 0x3d, 0xbe, 0xbf, 0x23, 0xcc,
+ 0x51, 0x8d, 0x4c, 0x13, 0x14, 0xd5, 0x83, 0x10, 0xb9, 0x92, 0x56, 0x8a,
+ 0x17, 0xd1, 0xa8, 0xe2, 0x0d, 0xdb, 0xae, 0x55, 0x2e, 0xcb, 0xfe, 0x06,
+ 0x67, 0x7b, 0x2d, 0x59, 0x40, 0x4e, 0x8f, 0xb4, 0x9e, 0x57, 0x78, 0x3d,
+ 0xbe, 0xbf, 0xa3, 0x2c, 0x53, 0x61, 0xbd, 0x20, 0x07, 0x83, 0x7a, 0x6d,
+ 0xdb, 0xbe, 0xd8, 0x71, 0x6b, 0x16, 0x21, 0xde, 0x93, 0x33, 0xac, 0x5d,
+ 0x2d, 0xad, 0xc7, 0x2d, 0xea, 0x1a, 0x8d, 0xe8, 0x8d, 0xaa, 0x8e, 0xfb,
+ 0xe3, 0x80, 0xfc, 0x25, 0x10, 0xa8, 0x68, 0xc9, 0xf5, 0x5c, 0x01, 0x9c,
+ 0xe1, 0x30, 0xf0, 0x0b, 0x2d, 0xb1, 0xbe, 0xf2, 0x7a, 0x7c, 0xcf, 0xa3,
+ 0x2c, 0x52, 0xe1, 0x7f, 0x82, 0xec, 0x07, 0x3a, 0x22, 0x54, 0x1f, 0xbe,
+ 0x92, 0xb6, 0x9d, 0xef, 0x53, 0xa3, 0xf0, 0xa9, 0x11, 0x6f, 0xcb, 0xcd,
+ 0xef, 0xe3, 0x88, 0xdc, 0x42, 0xdb, 0x06, 0xbe, 0x06, 0x00, 0xe3, 0x51,
+ 0xc6, 0x4b, 0x23, 0x3f, 0x38, 0xa6, 0x22, 0xa6, 0xd1, 0x47, 0x3e, 0x17,
+ 0x2c, 0x28, 0xaf, 0xf3, 0xa4, 0xfb, 0x26, 0x89, 0xf0, 0xf7, 0x36, 0xc4,
+ 0x6f, 0x28, 0x90, 0x8b, 0xec, 0x1c, 0xed, 0xd1, 0x78, 0xd8, 0x5d, 0x41,
+ 0xaf, 0x8d, 0x73, 0x5e, 0xba, 0xbc, 0x1e, 0xdf, 0x56, 0x22, 0xaf, 0x47,
+ 0x86, 0x20, 0x6d, 0x8f, 0xa7, 0xad, 0xe1, 0x5b, 0x5b, 0xfe, 0x9e, 0x9f,
+ 0x58, 0xc2, 0x27, 0x6d, 0xc8, 0xff, 0xde, 0xc0, 0xb5, 0x08, 0xd7, 0xc6,
+ 0xd1, 0xb6, 0x00, 0x53, 0x82, 0xc1, 0x8a, 0xea, 0xae, 0x2e, 0xde, 0x36,
+ 0xed, 0xdb, 0x1c, 0xa8, 0x0c, 0xac, 0x06, 0x5e, 0xec, 0xe8, 0x44, 0x68,
+ 0x4b, 0xaf, 0x2d, 0x84, 0xd7, 0x48, 0xbe, 0xf7, 0x7d, 0x1b, 0x03, 0xc1,
+ 0xc0, 0xc2, 0x04, 0x84, 0xdb, 0x17, 0x18, 0x12, 0xa7, 0xb0, 0x36, 0x58,
+ 0x96, 0x6c, 0x6c, 0xe9, 0x07, 0x95, 0x95, 0xfe, 0xd5, 0xc0, 0x97, 0x49,
+ 0x57, 0xaa, 0x85, 0xbf, 0xd2, 0x0d, 0x88, 0xc7, 0x59, 0x45, 0x33, 0x92,
+ 0x20, 0xb3, 0x42, 0xcd, 0xbb, 0xf7, 0xfe, 0xad, 0x0a, 0x77, 0x27, 0x57,
+ 0xd9, 0x4a, 0xdc, 0x46, 0xdc, 0x71, 0x8b, 0xa3, 0xc8, 0xd5, 0x81, 0x40,
+ 0x60, 0xaf, 0x53, 0x20, 0x15, 0xbd, 0x2e, 0xc9, 0xa2, 0xfe, 0xc7, 0x40,
+ 0xc0, 0xff, 0x8d, 0x11, 0x6f, 0x6b, 0x5a, 0xdf, 0xa0, 0x7f, 0x11, 0xb4,
+ 0xfe, 0xd5, 0x4a, 0x82, 0x9a, 0xde, 0xfa, 0x96, 0xdd, 0x6a, 0x7d, 0x1c,
+ 0xf8, 0x36, 0x49, 0x6c, 0xbe, 0xd9, 0x1f, 0xf4, 0x3f, 0x92, 0xe4, 0xe5,
+ 0xe2, 0x4d, 0x5b, 0x65, 0x5e, 0xeb, 0xc6, 0x3e, 0x02, 0x7e, 0xe0, 0x9d,
+ 0x24, 0x89, 0xb7, 0x2a, 0xfc, 0x81, 0x6e, 0x42, 0x7c, 0x4e, 0x09, 0xb4,
+ 0x35, 0x1b, 0xd8, 0xd0, 0x51, 0x89, 0x90, 0xbd, 0xcc, 0xf6, 0x09, 0x54,
+ 0x06, 0x36, 0x22, 0x8e, 0xe6, 0x1e, 0xc7, 0x9b, 0xb0, 0xa2, 0xe7, 0x27,
+ 0x79, 0x99, 0x50, 0xdb, 0x0e, 0x67, 0x04, 0x83, 0xe5, 0xad, 0x5e, 0x78,
+ 0x20, 0x16, 0x67, 0xe1, 0x6c, 0x42, 0x4c, 0xbc, 0xc9, 0x09, 0x06, 0xfd,
+ 0xab, 0x8d, 0x78, 0x63, 0x69, 0x7d, 0x17, 0x04, 0xbe, 0x15, 0xb8, 0x10,
+ 0x67, 0x53, 0xe6, 0xda, 0x5e, 0xda, 0x5a, 0xb1, 0xc8, 0x3b, 0x10, 0xf0,
+ 0x2f, 0x93, 0x8e, 0x3f, 0x70, 0xac, 0x20, 0x18, 0x0c, 0xfc, 0x3b, 0xb9,
+ 0xa5, 0xab, 0x97, 0x55, 0x2e, 0xa8, 0x8c, 0x49, 0x88, 0x7e, 0xbf, 0xbf,
+ 0x5a, 0x22, 0x0b, 0x33, 0x42, 0x1d, 0x18, 0xf3, 0x97, 0xc3, 0xb6, 0xf5,
+ 0x28, 0xdd, 0x88, 0xb8, 0x9d, 0x62, 0xef, 0x0f, 0xfa, 0x17, 0x21, 0x5c,
+ 0x49, 0x3b, 0x2f, 0x82, 0x6f, 0x28, 0x70, 0xad, 0xaa, 0x34, 0xea, 0xc3,
+ 0xf5, 0x8f, 0xa2, 0x3c, 0xdd, 0x41, 0xb6, 0x7e, 0x3a, 0x10, 0xf4, 0xdf,
+ 0x96, 0xe4, 0xe5, 0x21, 0xd7, 0x72, 0x5b, 0x2f, 0x3a, 0xcc, 0xff, 0x7f,
+ 0xa3, 0xdc, 0x45, 0xc7, 0x9c, 0x42, 0xbf, 0x58, 0x91, 0x9f, 0x2e, 0x58,
+ 0x50, 0x5e, 0x6f, 0xc4, 0xeb, 0xb4, 0x05, 0x0e, 0xf8, 0x5f, 0x00, 0xf1,
+ 0xd0, 0x8e, 0x73, 0x76, 0x63, 0x11, 0xef, 0xc2, 0x85, 0x0b, 0xc3, 0x2a,
+ 0xf6, 0x35, 0x88, 0xc3, 0xa9, 0x82, 0x0e, 0x5d, 0x65, 0xe0, 0x8e, 0x40,
+ 0xd0, 0x7f, 0x75, 0x72, 0xb7, 0xb8, 0x5c, 0x11, 0x08, 0xfa, 0x67, 0x54,
+ 0x54, 0x54, 0x38, 0x7e, 0x5f, 0x13, 0xa8, 0xf4, 0xdf, 0x27, 0xc2, 0x55,
+ 0xed, 0x5c, 0x81, 0x3f, 0x81, 0x68, 0x46, 0x30, 0x58, 0xb1, 0x8d, 0x6e,
+ 0x86, 0x15, 0xef, 0x00, 0x03, 0xc1, 0x8a, 0xd7, 0x11, 0xce, 0xa0, 0x1d,
+ 0xb7, 0x79, 0xc5, 0x6a, 0xfd, 0xde, 0x48, 0xc1, 0x60, 0xd0, 0x0e, 0x04,
+ 0xfc, 0x77, 0x6b, 0xe4, 0x74, 0xc3, 0x44, 0xaf, 0xa7, 0xdd, 0x01, 0x72,
+ 0x51, 0x20, 0xe8, 0xbf, 0x2f, 0xc6, 0x3e, 0x7c, 0x7b, 0xf2, 0x99, 0x82,
+ 0x2f, 0x50, 0xe9, 0xff, 0x47, 0x5c, 0x3c, 0xb0, 0x80, 0xff, 0xef, 0x0a,
+ 0x67, 0x03, 0x5b, 0xda, 0x21, 0xee, 0xb9, 0x29, 0xa9, 0xee, 0xeb, 0x03,
+ 0x81, 0x40, 0x0d, 0xdd, 0x10, 0x2b, 0x11, 0x81, 0x06, 0x02, 0xfe, 0xd5,
+ 0x96, 0xca, 0x08, 0x22, 0xd3, 0xf2, 0xaa, 0x12, 0x9c, 0x06, 0x55, 0x8d,
+ 0x7d, 0xf9, 0x5f, 0x30, 0xe8, 0x7f, 0x4e, 0x84, 0x13, 0x71, 0xb6, 0x78,
+ 0x61, 0x6f, 0xd8, 0xc0, 0x73, 0x88, 0x1e, 0x1f, 0x08, 0x56, 0xc4, 0xbc,
+ 0x0f, 0x74, 0xd8, 0xb6, 0x42, 0xed, 0xd0, 0x7a, 0x6d, 0x04, 0xc6, 0x5b,
+ 0x2a, 0x47, 0x04, 0x83, 0xfe, 0x40, 0x3c, 0x03, 0x0e, 0x06, 0xfd, 0x6f,
+ 0x5a, 0x2e, 0x39, 0x12, 0x78, 0x3c, 0x41, 0x15, 0x64, 0x25, 0xe8, 0xf7,
+ 0x03, 0x41, 0xff, 0x8c, 0xb2, 0xb2, 0x32, 0xa5, 0x9b, 0x92, 0xf0, 0x4a,
+ 0xde, 0xe7, 0x1b, 0x35, 0x58, 0x6d, 0xfb, 0x0e, 0x60, 0x3c, 0x6d, 0xd9,
+ 0x23, 0xaa, 0x29, 0x5b, 0x81, 0xd9, 0x0a, 0xd3, 0x83, 0x41, 0xff, 0xb2,
+ 0xb6, 0x04, 0xe4, 0xf1, 0x64, 0x8c, 0x14, 0xf4, 0x0f, 0x44, 0x5a, 0x8c,
+ 0xb6, 0x8a, 0xf6, 0x25, 0x81, 0xbb, 0xfd, 0x41, 0xff, 0x7b, 0x6d, 0x09,
+ 0xc8, 0x9b, 0xee, 0xcb, 0x46, 0xe2, 0xfe, 0x0e, 0xbd, 0x1a, 0x28, 0x07,
+ 0xe6, 0x2b, 0xf6, 0x63, 0xc1, 0x60, 0x30, 0xe1, 0x3b, 0x79, 0x78, 0x3c,
+ 0x19, 0x47, 0x0b, 0x7a, 0x0f, 0x91, 0x85, 0xf8, 0x6d, 0x6d, 0x2c, 0x16,
+ 0x83, 0xde, 0x35, 0x78, 0xc8, 0xe0, 0x0a, 0xa7, 0x5b, 0xf4, 0xb6, 0x68,
+ 0x73, 0x8f, 0x6f, 0x3b, 0xb1, 0xed, 0xf7, 0x6d, 0x37, 0x9c, 0xcf, 0x5b,
+ 0xdb, 0x25, 0xc5, 0xbb, 0x93, 0x8c, 0x8c, 0x8c, 0xfe, 0xe1, 0xb0, 0x8e,
+ 0x16, 0x18, 0x4b, 0xe4, 0x73, 0x60, 0x8c, 0xa2, 0xf8, 0x1c, 0x58, 0x09,
+ 0xbc, 0x89, 0x48, 0x69, 0x8f, 0x1e, 0xa9, 0x4b, 0xe6, 0xce, 0x9d, 0x1b,
+ 0xb7, 0xc1, 0x91, 0x71, 0xe3, 0xc6, 0x49, 0xed, 0xf6, 0xda, 0xe3, 0x10,
+ 0xc6, 0x69, 0x24, 0x7e, 0xe9, 0xb4, 0x6e, 0xee, 0x72, 0x15, 0x30, 0x1f,
+ 0xa5, 0x4c, 0x45, 0xca, 0x82, 0xc1, 0x8a, 0xb8, 0xbc, 0xaa, 0xc8, 0x48,
+ 0xcf, 0xb0, 0x6c, 0xf4, 0x46, 0x84, 0x4b, 0x80, 0x43, 0x62, 0x28, 0xf8,
+ 0x4a, 0x64, 0xc1, 0xc8, 0x7a, 0x22, 0xaf, 0xef, 0xd6, 0x03, 0x6b, 0x11,
+ 0x09, 0x04, 0x02, 0x15, 0xaf, 0xd3, 0x41, 0x64, 0xa4, 0x67, 0x1c, 0xa2,
+ 0xa2, 0x63, 0x15, 0x32, 0x89, 0x1c, 0x52, 0xd7, 0x9a, 0xe3, 0x68, 0xea,
+ 0x80, 0x4a, 0x81, 0x32, 0x15, 0x2d, 0xab, 0xa9, 0xa9, 0x79, 0xef, 0xf5,
+ 0xd7, 0x5f, 0x4f, 0x58, 0x4b, 0xeb, 0xf5, 0xf8, 0xae, 0x05, 0xae, 0x06,
+ 0x0e, 0x22, 0xb2, 0xef, 0xf7, 0x00, 0x76, 0xdf, 0x70, 0x3e, 0xd4, 0x60,
+ 0xdb, 0x4d, 0x0d, 0xe5, 0xf1, 0xf1, 0x40, 0xd0, 0x3f, 0xab, 0xcb, 0xb6,
+ 0xbc, 0xd1, 0x18, 0x3e, 0x7c, 0xb8, 0xf4, 0xed, 0xbb, 0xcf, 0x30, 0x0b,
+ 0x7b, 0x3f, 0x15, 0x86, 0x60, 0x33, 0x04, 0x61, 0x08, 0x8a, 0x85, 0x50,
+ 0x0d, 0xb2, 0x0d, 0xa8, 0x46, 0xa9, 0x12, 0xf4, 0x73, 0x57, 0xaa, 0xeb,
+ 0xe3, 0xf9, 0xf3, 0xe7, 0xb7, 0xeb, 0x7e, 0x44, 0xe9, 0x67, 0xa5, 0xf7,
+ 0x10, 0xb7, 0xfb, 0x58, 0xd0, 0xa1, 0xc0, 0x10, 0x41, 0x87, 0x82, 0xf4,
+ 0x03, 0x36, 0x28, 0xac, 0xb3, 0x60, 0x9d, 0x8a, 0xae, 0x1d, 0x3c, 0x78,
+ 0xf0, 0xfb, 0x89, 0x68, 0x05, 0xba, 0x32, 0xc3, 0x87, 0x0f, 0xb7, 0xfa,
+ 0xf6, 0x1d, 0x70, 0x1c, 0xe8, 0xbe, 0x8d, 0x6c, 0x3b, 0x10, 0xd8, 0xd2,
+ 0xc8, 0xb6, 0xeb, 0x52, 0xac, 0x94, 0xff, 0x96, 0x55, 0x94, 0xd5, 0x76,
+ 0x54, 0x3c, 0x2f, 0xbd, 0xf4, 0x52, 0x59, 0xbf, 0x7e, 0x7d, 0x3f, 0x94,
+ 0x3e, 0x2e, 0xb7, 0xab, 0x6a, 0xd3, 0xa6, 0x4d, 0x55, 0x4b, 0x97, 0x2e,
+ 0x35, 0x79, 0x6d, 0x30, 0x18, 0x0c, 0x06, 0x83, 0xc1, 0x60, 0x30, 0x18,
+ 0x0c, 0x06, 0x83, 0xc1, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x83, 0xc1, 0x60,
+ 0xe8, 0x68, 0x5c, 0xc6, 0x04, 0x86, 0xf6, 0x60, 0x42, 0x6e, 0xee, 0x61,
+ 0xc3, 0x87, 0x8f, 0xb4, 0xdf, 0x7e, 0xeb, 0xf5, 0x5a, 0x63, 0x8d, 0xf8,
+ 0x60, 0x19, 0x13, 0x18, 0xda, 0x03, 0xb1, 0x65, 0x55, 0x8a, 0xcb, 0xbe,
+ 0xde, 0x58, 0x22, 0x7e, 0xb8, 0xbb, 0x42, 0x22, 0xc6, 0x8f, 0x1f, 0x6f,
+ 0xb9, 0x5c, 0x69, 0x17, 0x21, 0x5c, 0x0b, 0x9c, 0x06, 0xf4, 0x03, 0x3e,
+ 0x03, 0x3e, 0x02, 0xfe, 0x52, 0x52, 0x5c, 0xf8, 0x8a, 0xc9, 0x6a, 0x83,
+ 0x69, 0x79, 0x93, 0x8c, 0x9c, 0x9c, 0x49, 0x3d, 0x5d, 0xee, 0xb4, 0x7f,
+ 0x20, 0xbc, 0x48, 0xe4, 0xb0, 0xaf, 0x32, 0xe0, 0x7e, 0xe0, 0xdf, 0xc0,
+ 0x11, 0xc0, 0xec, 0xac, 0xec, 0xbc, 0x97, 0x4c, 0x56, 0x77, 0x30, 0x2a,
+ 0xc3, 0x6d, 0xdb, 0xfa, 0x9b, 0x31, 0x44, 0x1c, 0xbd, 0x99, 0xce, 0x9e,
+ 0x80, 0xac, 0xec, 0xbc, 0x62, 0x22, 0xdb, 0xdb, 0x94, 0xd4, 0xd6, 0x6c,
+ 0x9b, 0xf4, 0xf8, 0xe3, 0x8f, 0x87, 0x76, 0x09, 0x3b, 0xc7, 0x6d, 0xab,
+ 0x35, 0x11, 0x78, 0x00, 0xb8, 0xaf, 0xa4, 0xb8, 0xf0, 0x0e, 0x93, 0xe5,
+ 0x06, 0x23, 0xde, 0xe4, 0x10, 0xee, 0x91, 0xc0, 0xc7, 0xc0, 0xe2, 0x92,
+ 0xe2, 0xc2, 0x91, 0x51, 0x7f, 0x93, 0x95, 0x65, 0x21, 0xee, 0x57, 0x81,
+ 0x33, 0x4b, 0x8a, 0x0b, 0x07, 0x98, 0x2c, 0x37, 0x18, 0xb7, 0x39, 0x39,
+ 0x6a, 0x9e, 0xb3, 0x00, 0x6c, 0x25, 0xab, 0xb9, 0xdf, 0x94, 0x94, 0x94,
+ 0xd8, 0xc0, 0x54, 0xa0, 0x7f, 0x76, 0x76, 0xde, 0xe1, 0x26, 0xcb, 0x0d,
+ 0x5d, 0x85, 0x4e, 0x3d, 0x60, 0xa5, 0x30, 0x1c, 0xa8, 0x7a, 0xa8, 0xa4,
+ 0x70, 0x2f, 0x27, 0x16, 0xca, 0x47, 0xa0, 0x4f, 0x01, 0xfb, 0x01, 0xab,
+ 0x9b, 0xb6, 0xe0, 0x13, 0x8f, 0x01, 0xbd, 0x1d, 0x38, 0xa1, 0xc1, 0x26,
+ 0xef, 0xa1, 0x94, 0x94, 0x94, 0x14, 0xbe, 0x19, 0xa5, 0xb5, 0xbf, 0x0b,
+ 0xe8, 0x59, 0x52, 0x5c, 0x78, 0x5b, 0x56, 0xf6, 0x44, 0x0f, 0xe8, 0x2d,
+ 0xc0, 0x91, 0xc0, 0x1a, 0x84, 0xc7, 0x4a, 0x66, 0x14, 0x3e, 0x03, 0x30,
+ 0x61, 0x42, 0x6e, 0x8a, 0x58, 0x92, 0x43, 0x64, 0x11, 0x7a, 0x1f, 0x60,
+ 0x91, 0xcb, 0xd2, 0xdb, 0x8b, 0x8a, 0x8a, 0xa2, 0x9e, 0x42, 0x30, 0x7e,
+ 0xe2, 0x44, 0xb1, 0x42, 0x7a, 0x83, 0xc0, 0x68, 0xe0, 0x64, 0xe0, 0x3d,
+ 0x60, 0x41, 0x49, 0x71, 0x61, 0x51, 0xcc, 0x1e, 0x49, 0xce, 0xc4, 0x4b,
+ 0x50, 0xbd, 0x08, 0xf8, 0x7e, 0x83, 0x67, 0xf2, 0xb6, 0x0a, 0x77, 0xcd,
+ 0x9c, 0x51, 0xa8, 0x7b, 0xa4, 0xe5, 0x0f, 0xc0, 0xfe, 0x25, 0xc5, 0x85,
+ 0xd7, 0x64, 0x65, 0xe5, 0x9e, 0x8c, 0xc8, 0x94, 0x06, 0x1b, 0x7c, 0x01,
+ 0x1a, 0xb0, 0x2d, 0xfe, 0xf0, 0x50, 0x51, 0x51, 0xd4, 0x35, 0xd3, 0x13,
+ 0xb2, 0x27, 0xa6, 0x0b, 0x3a, 0x19, 0x38, 0x0e, 0xd8, 0xa4, 0xf0, 0x12,
+ 0x22, 0x0f, 0x12, 0x96, 0x11, 0x62, 0xd9, 0xbf, 0x50, 0xdb, 0xfa, 0xd5,
+ 0xcc, 0x99, 0xd3, 0x6a, 0x1a, 0x3d, 0xeb, 0x2f, 0x28, 0xcf, 0x95, 0x94,
+ 0x14, 0x96, 0xee, 0x8a, 0x67, 0xde, 0x9d, 0x28, 0x47, 0x94, 0x14, 0x17,
+ 0x5e, 0x9b, 0x95, 0x93, 0x77, 0x22, 0xca, 0x6f, 0x80, 0x53, 0x88, 0x9c,
+ 0xe3, 0xe4, 0x77, 0x59, 0x7a, 0x7f, 0x51, 0x51, 0x51, 0xd4, 0x2d, 0x8e,
+ 0x72, 0x73, 0x73, 0x07, 0x84, 0x6d, 0xb9, 0x85, 0x48, 0x05, 0xde, 0x1b,
+ 0xf8, 0x8f, 0x0a, 0x33, 0x67, 0xce, 0x28, 0x7c, 0xa7, 0xbb, 0x88, 0xb7,
+ 0xb3, 0x0f, 0x58, 0x9d, 0x46, 0x2b, 0xf6, 0x8b, 0x2e, 0x29, 0x9e, 0xfe,
+ 0x75, 0x49, 0x71, 0xe1, 0x35, 0xc5, 0xc5, 0x85, 0xaf, 0x37, 0x15, 0x63,
+ 0xee, 0x15, 0xa0, 0xff, 0x25, 0xb2, 0x48, 0x7c, 0x45, 0x83, 0x68, 0x46,
+ 0x21, 0x2c, 0x9a, 0x90, 0x9d, 0x97, 0x1d, 0x25, 0xb8, 0xf3, 0x80, 0xcb,
+ 0xb2, 0xb2, 0xf3, 0x2e, 0x06, 0x9d, 0x43, 0x64, 0x77, 0x8a, 0xa5, 0xc0,
+ 0x49, 0x28, 0x4f, 0x67, 0x65, 0xe7, 0xdd, 0x9c, 0x9d, 0x3d, 0xd1, 0x2d,
+ 0x96, 0xcc, 0x02, 0x26, 0x03, 0xab, 0x80, 0xaf, 0x80, 0x1b, 0xc3, 0xb6,
+ 0x7c, 0x38, 0x61, 0x42, 0x7e, 0xff, 0xa6, 0xae, 0xfd, 0x44, 0xb7, 0x2b,
+ 0xa4, 0x4f, 0x0a, 0x3c, 0x42, 0x64, 0x93, 0x82, 0x52, 0x22, 0x87, 0xa3,
+ 0x15, 0x66, 0x65, 0xe7, 0xc5, 0xb4, 0x9b, 0x63, 0x56, 0x76, 0xde, 0x3d,
+ 0xa8, 0xbe, 0x00, 0x9c, 0xd4, 0x10, 0x4e, 0x0f, 0xe0, 0x4e, 0x51, 0x96,
+ 0x5e, 0x77, 0xfd, 0x2f, 0xf6, 0x7c, 0xaf, 0x7f, 0x31, 0xf0, 0xf3, 0x09,
+ 0xd9, 0x79, 0x23, 0x10, 0x59, 0x4a, 0x64, 0x17, 0x89, 0xca, 0x48, 0x1c,
+ 0xe4, 0x1e, 0xcb, 0x96, 0xe7, 0x73, 0x73, 0x73, 0x25, 0xca, 0x33, 0x2e,
+ 0x15, 0xb4, 0x02, 0xc8, 0x20, 0x32, 0xa2, 0xff, 0x5f, 0x81, 0x5c, 0x51,
+ 0x0d, 0x88, 0xa5, 0x63, 0x81, 0x9f, 0x8b, 0xe8, 0x9e, 0x0d, 0xc3, 0xcf,
+ 0x45, 0x38, 0x7e, 0x8f, 0x6b, 0xe7, 0x02, 0xd7, 0x64, 0x65, 0xe5, 0x7d,
+ 0x1f, 0xe5, 0x0d, 0x60, 0x30, 0x91, 0x81, 0xc6, 0xfd, 0x80, 0xdf, 0x87,
+ 0x6d, 0x79, 0x71, 0xfc, 0xc4, 0x89, 0x4d, 0xe6, 0x22, 0x64, 0x67, 0xe7,
+ 0x9e, 0x14, 0xb6, 0xe5, 0xfd, 0x86, 0xb1, 0x8e, 0x0d, 0xc0, 0x07, 0xc0,
+ 0x05, 0xa2, 0x2c, 0x9d, 0x90, 0x9d, 0x77, 0x85, 0x69, 0x79, 0x3b, 0x07,
+ 0x87, 0x03, 0x6b, 0x9d, 0xde, 0x3c, 0x21, 0x3b, 0xef, 0x10, 0xe0, 0x6f,
+ 0xc0, 0x12, 0xb7, 0x0b, 0x5f, 0x61, 0x61, 0x61, 0x6d, 0x64, 0xa0, 0x2b,
+ 0xaf, 0xaf, 0xad, 0x2c, 0x16, 0xb8, 0x27, 0x37, 0x37, 0xf7, 0x89, 0xa2,
+ 0xa2, 0xa2, 0x3d, 0xf7, 0xe1, 0x1a, 0x02, 0x14, 0x5b, 0x62, 0x1f, 0x3e,
+ 0x63, 0xc6, 0x8c, 0x6f, 0x23, 0x2d, 0x6d, 0xce, 0xfe, 0x62, 0x59, 0x1f,
+ 0x03, 0xf7, 0x80, 0xae, 0x02, 0x4e, 0xac, 0xaf, 0x73, 0x1d, 0xfe, 0xe8,
+ 0xa3, 0x05, 0xdb, 0x1b, 0x04, 0x3a, 0x0e, 0xd1, 0x39, 0x62, 0x85, 0x67,
+ 0x02, 0x57, 0xed, 0x5e, 0x85, 0xea, 0xaf, 0x51, 0x7e, 0x06, 0x72, 0x73,
+ 0x49, 0xf1, 0xf4, 0x47, 0x22, 0x71, 0xc8, 0x11, 0x1b, 0x6b, 0x22, 0x4a,
+ 0xc1, 0x84, 0x9c, 0xbc, 0xab, 0x66, 0xce, 0x28, 0xdc, 0xeb, 0x96, 0xb5,
+ 0x59, 0x59, 0xb9, 0x63, 0x80, 0x3b, 0x80, 0xa9, 0x25, 0xc5, 0x85, 0xb7,
+ 0x7c, 0x97, 0xce, 0xac, 0xbc, 0x8b, 0x45, 0x78, 0xa1, 0x77, 0xef, 0xbe,
+ 0x7f, 0x04, 0xae, 0x8b, 0xd2, 0xfd, 0xf0, 0x23, 0x72, 0x56, 0xc9, 0x8c,
+ 0xe9, 0x4b, 0x1a, 0x09, 0xb4, 0x3c, 0xe2, 0x35, 0xb8, 0x06, 0xd1, 0x74,
+ 0x37, 0xd0, 0x27, 0x80, 0x1d, 0xb6, 0x25, 0xc7, 0x3c, 0x54, 0x34, 0xfd,
+ 0x7f, 0x00, 0xf9, 0xf9, 0xf9, 0x29, 0xb5, 0x75, 0xe1, 0x72, 0xd0, 0xd8,
+ 0xdf, 0xe5, 0x0a, 0x2f, 0xab, 0x70, 0xfe, 0xcc, 0x19, 0x85, 0xfe, 0x46,
+ 0xcf, 0x9f, 0x0d, 0x5c, 0x60, 0xd5, 0x73, 0x74, 0x83, 0x38, 0x1b, 0x79,
+ 0x5c, 0x32, 0x07, 0xb0, 0x55, 0xe5, 0xc4, 0x99, 0x25, 0xd3, 0xbf, 0x68,
+ 0x68, 0x89, 0xfb, 0x84, 0x6d, 0xa9, 0x14, 0x78, 0x3a, 0x2b, 0x2b, 0xaf,
+ 0xbc, 0xa4, 0xa4, 0x70, 0x9d, 0x69, 0x79, 0xbb, 0xf0, 0x80, 0x9b, 0x08,
+ 0x67, 0x03, 0x8a, 0xca, 0x05, 0x3b, 0x85, 0x0b, 0x30, 0x63, 0x46, 0x61,
+ 0x15, 0x2a, 0xd7, 0x02, 0x7d, 0xc3, 0xb6, 0x5c, 0x10, 0xe5, 0xd6, 0xde,
+ 0x02, 0x97, 0xef, 0x14, 0x2e, 0xc0, 0xcc, 0x99, 0x33, 0xbe, 0x01, 0xfd,
+ 0x35, 0x30, 0x40, 0xe1, 0x39, 0x4b, 0xb8, 0x60, 0xa7, 0x70, 0x01, 0xdc,
+ 0x6e, 0x2d, 0x6d, 0x70, 0x07, 0x77, 0x3b, 0x31, 0xe1, 0xa6, 0x9b, 0xb3,
+ 0xfa, 0xa2, 0xfc, 0x0e, 0x58, 0xb4, 0x53, 0xb8, 0x91, 0x38, 0xcc, 0x50,
+ 0x6c, 0x2d, 0x02, 0xd6, 0x8a, 0xf2, 0xc8, 0xde, 0x85, 0x9b, 0x67, 0x21,
+ 0xf2, 0x0a, 0xb0, 0xbe, 0xb1, 0x70, 0x01, 0x66, 0x96, 0x14, 0xfe, 0x13,
+ 0x58, 0x04, 0x5c, 0x9b, 0x95, 0x9d, 0x17, 0x6d, 0x56, 0xdd, 0x84, 0xc6,
+ 0xc2, 0x05, 0x08, 0xbb, 0xb8, 0x14, 0xb0, 0x43, 0xb6, 0xbd, 0xdb, 0x21,
+ 0xe8, 0xd9, 0x39, 0xb9, 0x57, 0x37, 0xa4, 0x7f, 0xcc, 0x4e, 0xe1, 0x02,
+ 0x14, 0x14, 0x14, 0xd4, 0x0f, 0x1a, 0xd8, 0xdf, 0x47, 0xeb, 0xb6, 0xb7,
+ 0xd9, 0x23, 0x13, 0xe5, 0xf7, 0x8d, 0x85, 0x0b, 0xe0, 0xb2, 0xf4, 0x5a,
+ 0xa0, 0x4e, 0x44, 0xb3, 0xf7, 0x68, 0xf5, 0x27, 0x03, 0x07, 0x81, 0x5e,
+ 0xbc, 0x53, 0xb8, 0x00, 0x45, 0x45, 0x45, 0xd5, 0x02, 0x97, 0x47, 0x7a,
+ 0x53, 0x72, 0x8d, 0x71, 0x9b, 0xbb, 0x38, 0xaa, 0xf2, 0x25, 0x68, 0x4e,
+ 0x49, 0xc9, 0xf4, 0x0d, 0x4d, 0x85, 0xad, 0x5f, 0x37, 0xfc, 0x95, 0x1e,
+ 0xe5, 0xd6, 0x4d, 0xc5, 0xc5, 0x85, 0x8b, 0xa2, 0x14, 0xc3, 0x7f, 0x35,
+ 0xfc, 0xb1, 0x63, 0xc6, 0x8c, 0xc2, 0xdd, 0xb6, 0xbe, 0x2d, 0x2c, 0x2c,
+ 0xb4, 0x89, 0xb8, 0xc5, 0xbd, 0x1a, 0x5f, 0x4f, 0x71, 0xb9, 0x7d, 0x80,
+ 0x6d, 0x89, 0x7d, 0x49, 0xd3, 0xc1, 0xb6, 0xa2, 0x30, 0xca, 0x7d, 0x0d,
+ 0xae, 0x6f, 0xcb, 0x02, 0xb0, 0xb4, 0x1f, 0x90, 0xaa, 0xc8, 0xc5, 0x51,
+ 0x33, 0x5a, 0xec, 0x5f, 0x00, 0xa4, 0xb8, 0x5d, 0x3d, 0xa3, 0x18, 0xe2,
+ 0x99, 0x3d, 0x2f, 0x3d, 0x5c, 0x58, 0xb8, 0x09, 0xa8, 0xdd, 0x39, 0x28,
+ 0xd8, 0xc8, 0x66, 0x0f, 0x44, 0x5a, 0x3f, 0x6d, 0xb2, 0xe9, 0xdf, 0x94,
+ 0x29, 0x53, 0xc2, 0xc0, 0x27, 0x0e, 0x72, 0xa2, 0xc9, 0x59, 0x57, 0x45,
+ 0x45, 0x45, 0x1b, 0x1a, 0x5c, 0xe2, 0xef, 0xed, 0xf1, 0xd5, 0xf5, 0xc0,
+ 0x1a, 0xb7, 0x4b, 0x9a, 0x8c, 0x73, 0x14, 0x17, 0x17, 0x7e, 0x02, 0x7c,
+ 0x8e, 0xe8, 0x85, 0xdd, 0xa1, 0xfc, 0xba, 0xbb, 0x62, 0xa2, 0xb2, 0xb2,
+ 0x26, 0x1e, 0x81, 0xe8, 0x83, 0x51, 0x46, 0xb8, 0x5e, 0x2b, 0x29, 0x29,
+ 0x7c, 0xe2, 0xbb, 0x16, 0xa9, 0x78, 0xfa, 0x02, 0x60, 0x41, 0x33, 0xc2,
+ 0xae, 0x8f, 0x9c, 0x71, 0xab, 0x07, 0x44, 0xf9, 0x3a, 0xd4, 0x4c, 0x13,
+ 0x52, 0xdb, 0x70, 0xc4, 0xec, 0x9a, 0x66, 0xdc, 0x84, 0x8f, 0x14, 0xdc,
+ 0xe3, 0xc7, 0x8f, 0x4f, 0x79, 0xf8, 0xe1, 0x87, 0xeb, 0x23, 0xcf, 0x61,
+ 0x14, 0x42, 0xdd, 0x8c, 0x19, 0x33, 0xa2, 0xbb, 0x79, 0x2e, 0x16, 0x60,
+ 0xe3, 0xca, 0xca, 0xca, 0xea, 0x55, 0x52, 0x52, 0xb2, 0xbd, 0xd9, 0xe2,
+ 0x6f, 0x93, 0x81, 0xa0, 0x33, 0x8b, 0xa7, 0x47, 0x3d, 0x3a, 0x74, 0xc6,
+ 0x8c, 0x19, 0x2b, 0xb3, 0xb2, 0xf3, 0xa8, 0xaf, 0x0f, 0x9f, 0x0e, 0xec,
+ 0xb1, 0xd5, 0xab, 0xd5, 0xdc, 0x46, 0x7e, 0x61, 0x22, 0x13, 0x5f, 0x1a,
+ 0xd3, 0x03, 0xd8, 0x56, 0x52, 0x5c, 0x54, 0xd3, 0xc2, 0x3d, 0xb1, 0xd2,
+ 0xdc, 0x7c, 0xe7, 0x1a, 0xe0, 0xe8, 0x3d, 0xae, 0xed, 0x03, 0x04, 0x0b,
+ 0x0b, 0x0b, 0x9b, 0x7b, 0xce, 0x16, 0xe0, 0x94, 0x29, 0x53, 0xa6, 0xc8,
+ 0x94, 0x29, 0x53, 0xd4, 0x88, 0xb7, 0xf3, 0x39, 0xd3, 0xee, 0x86, 0xc1,
+ 0x8f, 0xc6, 0x05, 0x6e, 0x04, 0xc2, 0x57, 0xcd, 0xdd, 0x32, 0x7e, 0xfc,
+ 0xc4, 0xfe, 0x6e, 0xb7, 0x1e, 0x09, 0x1c, 0xaa, 0xaa, 0x16, 0xd8, 0x7d,
+ 0x63, 0xf5, 0xca, 0x55, 0xa9, 0x6f, 0xb8, 0x23, 0xea, 0x89, 0x84, 0x8a,
+ 0x7c, 0x0e, 0x2a, 0xae, 0xd4, 0xd4, 0xc3, 0x88, 0x8c, 0x02, 0x43, 0xc4,
+ 0x75, 0x77, 0x65, 0x65, 0xe7, 0xfd, 0x29, 0x6a, 0xa0, 0x36, 0xbd, 0x01,
+ 0x5c, 0x2e, 0xd7, 0x11, 0x0d, 0x03, 0x6a, 0xcd, 0xf9, 0x50, 0x19, 0x28,
+ 0x34, 0x1b, 0xce, 0x2e, 0xdb, 0x1c, 0xd7, 0x54, 0xbc, 0xcd, 0x62, 0x03,
+ 0x7d, 0x26, 0x4c, 0x98, 0x68, 0xcd, 0x9c, 0x39, 0x7d, 0xa7, 0xc0, 0x53,
+ 0x1a, 0x06, 0xf5, 0xda, 0x83, 0x7a, 0x60, 0xc0, 0x0d, 0x37, 0xdc, 0x6a,
+ 0x3d, 0xfe, 0xf8, 0x03, 0x3b, 0x9f, 0x3f, 0x00, 0x38, 0xaa, 0x85, 0x74,
+ 0x1e, 0x0c, 0xf4, 0xde, 0xbc, 0x79, 0x73, 0x1a, 0xc9, 0x77, 0x2e, 0xb3,
+ 0x11, 0xef, 0xde, 0x28, 0x29, 0x9e, 0xfe, 0x11, 0xe0, 0xf9, 0xae, 0x25,
+ 0xce, 0xc9, 0x1b, 0x86, 0x46, 0x77, 0xe7, 0xb2, 0xb2, 0x73, 0x0f, 0x01,
+ 0xb9, 0x1f, 0xf4, 0x8a, 0x86, 0x6a, 0x7a, 0x2b, 0x22, 0xea, 0xa4, 0x3f,
+ 0x2d, 0x2a, 0xb4, 0x74, 0x22, 0xbd, 0xda, 0x12, 0x12, 0x4b, 0x71, 0xed,
+ 0xbe, 0x7f, 0x75, 0x9f, 0x86, 0xee, 0xcb, 0xb1, 0x2d, 0x04, 0xbd, 0x08,
+ 0xd8, 0xb1, 0x97, 0x2e, 0x40, 0x1f, 0x89, 0xc4, 0x79, 0x2f, 0xe1, 0xe8,
+ 0x9a, 0x58, 0xd3, 0x65, 0xdb, 0xae, 0xdd, 0x7d, 0x01, 0xd5, 0x76, 0x3d,
+ 0x2e, 0xb5, 0xae, 0xae, 0xe7, 0xee, 0xcf, 0x8f, 0xb4, 0xbe, 0xcd, 0xa5,
+ 0xf3, 0x23, 0xe0, 0x23, 0xdb, 0x76, 0xd9, 0x74, 0x71, 0x3a, 0xbb, 0x78,
+ 0xab, 0x89, 0x6d, 0x93, 0xec, 0x3d, 0x84, 0x3b, 0x71, 0x10, 0xe8, 0xf2,
+ 0x06, 0xf1, 0xfc, 0x42, 0x08, 0xbf, 0x54, 0x5c, 0x5c, 0xbc, 0xb1, 0xc1,
+ 0xf5, 0x1e, 0x8c, 0x68, 0x7b, 0x8d, 0x58, 0x56, 0x97, 0x14, 0x17, 0x9e,
+ 0x15, 0x87, 0x70, 0xec, 0x38, 0x85, 0x93, 0xdc, 0x63, 0x15, 0xa2, 0x8f,
+ 0xcd, 0x9c, 0x51, 0x74, 0x3f, 0xdd, 0x9c, 0xce, 0x2e, 0xde, 0x2f, 0x88,
+ 0x4c, 0x68, 0x70, 0x5a, 0x0c, 0xee, 0x07, 0xfa, 0xa0, 0xe2, 0x2d, 0x29,
+ 0x99, 0xbe, 0xa8, 0x83, 0xd2, 0xf0, 0x29, 0x91, 0xf7, 0x9a, 0x6d, 0xc2,
+ 0x82, 0x8f, 0xb5, 0x7d, 0xa6, 0xbb, 0x86, 0x11, 0xd9, 0xbf, 0x03, 0xf3,
+ 0x7c, 0x87, 0x68, 0x87, 0x3e, 0x3f, 0x69, 0xe8, 0xec, 0xa3, 0xcd, 0x7e,
+ 0x60, 0xc0, 0x84, 0x09, 0xb9, 0x43, 0x62, 0xbd, 0xf1, 0x86, 0x1b, 0x6e,
+ 0x10, 0x22, 0xb3, 0x9f, 0x3e, 0xeb, 0x40, 0xe1, 0x02, 0x32, 0x9f, 0x38,
+ 0x1c, 0x03, 0x23, 0x22, 0xaf, 0x01, 0x72, 0xf3, 0xcd, 0x37, 0xf7, 0x4c,
+ 0x70, 0x84, 0xeb, 0x81, 0xff, 0xeb, 0xc0, 0x3c, 0xdf, 0x08, 0xfa, 0x3d,
+ 0x23, 0xdd, 0x4e, 0x2e, 0x5e, 0x55, 0x9d, 0x03, 0x88, 0x58, 0xf2, 0xf0,
+ 0x5e, 0xfa, 0x83, 0x4d, 0x5a, 0xa4, 0xb4, 0xbe, 0x7d, 0xdd, 0x0d, 0x83,
+ 0x1f, 0xcd, 0x1d, 0x0d, 0x79, 0x50, 0xbb, 0xa4, 0xc1, 0xb6, 0xe7, 0x02,
+ 0x29, 0x59, 0xd9, 0x79, 0xbf, 0x68, 0x93, 0xbf, 0xac, 0xfa, 0x2e, 0x80,
+ 0xe5, 0x4a, 0x7d, 0x2c, 0xc1, 0x51, 0xfe, 0x16, 0xe8, 0x91, 0x95, 0x95,
+ 0xd7, 0xdc, 0xfb, 0xdc, 0xbe, 0x89, 0xf7, 0xb6, 0xe4, 0xcc, 0xac, 0xac,
+ 0xbc, 0xc1, 0x46, 0xbc, 0x9d, 0x98, 0x1e, 0x69, 0xee, 0x65, 0x40, 0x05,
+ 0x70, 0xc1, 0x84, 0xec, 0xbc, 0x0b, 0xa2, 0xb7, 0xb0, 0xb7, 0x5a, 0x82,
+ 0xde, 0x04, 0x20, 0xe8, 0xdb, 0x3b, 0xaf, 0x97, 0x4c, 0x9b, 0x56, 0x4f,
+ 0xe4, 0xec, 0xa3, 0x83, 0xae, 0xb9, 0x66, 0xca, 0x6e, 0x23, 0x32, 0x39,
+ 0x39, 0x13, 0x07, 0x22, 0xfa, 0x42, 0xa4, 0x49, 0xdb, 0xfb, 0x3b, 0xd6,
+ 0x36, 0x89, 0xd7, 0x65, 0x7d, 0xd8, 0xe0, 0xfe, 0x4f, 0xcf, 0xc9, 0xc9,
+ 0xe9, 0xbd, 0xe7, 0xf7, 0x39, 0x39, 0xb9, 0x43, 0xb3, 0x9b, 0x49, 0x5b,
+ 0x63, 0x4a, 0x8a, 0x0b, 0x43, 0x0d, 0xb6, 0xf8, 0x59, 0x76, 0xf6, 0xa4,
+ 0x26, 0x6e, 0x65, 0x7e, 0x7e, 0x7e, 0x4a, 0x56, 0xf6, 0xc4, 0xfc, 0x36,
+ 0xb7, 0xf0, 0xe8, 0x15, 0x80, 0x22, 0xe4, 0xe6, 0xe7, 0xe7, 0xef, 0x56,
+ 0x29, 0x66, 0x67, 0xe7, 0x9d, 0x45, 0x64, 0x0d, 0x75, 0xc2, 0xb0, 0xe1,
+ 0x5a, 0x20, 0x84, 0x70, 0xdb, 0x0d, 0x37, 0xdc, 0x6a, 0x35, 0x1d, 0xc7,
+ 0xc8, 0xfb, 0x59, 0x76, 0xf6, 0xc4, 0x81, 0xa6, 0xcf, 0x9b, 0xe4, 0x14,
+ 0x14, 0x14, 0xd8, 0x59, 0x59, 0xb9, 0x57, 0x22, 0xb2, 0x40, 0xe0, 0xa5,
+ 0xac, 0xec, 0xbc, 0x3f, 0x82, 0xcc, 0x42, 0x59, 0x01, 0xea, 0xc6, 0xe2,
+ 0x04, 0xb4, 0x6e, 0x02, 0x91, 0x59, 0x4d, 0x7f, 0x2e, 0x2e, 0x2e, 0xda,
+ 0x73, 0x31, 0xf8, 0x6d, 0xc0, 0xbf, 0xfa, 0xf6, 0xdb, 0x32, 0x77, 0x42,
+ 0x4e, 0xde, 0x9d, 0x62, 0xb3, 0x5d, 0x84, 0x33, 0x6d, 0xd5, 0x3b, 0x14,
+ 0x9e, 0x12, 0xf8, 0x0d, 0x4a, 0x42, 0x0b, 0xc2, 0x43, 0x33, 0xa6, 0x87,
+ 0x26, 0xe4, 0xe4, 0x8e, 0x11, 0x95, 0x15, 0xb6, 0x5a, 0x1f, 0x67, 0xe5,
+ 0xe4, 0xde, 0xe8, 0x12, 0x96, 0x84, 0x6c, 0x39, 0x58, 0xe0, 0x0c, 0x5b,
+ 0x99, 0x0e, 0x7c, 0x0d, 0xcc, 0xde, 0x5b, 0x58, 0x29, 0x6e, 0xeb, 0xbc,
+ 0xfa, 0x90, 0xbd, 0x56, 0xb1, 0x57, 0x67, 0x67, 0xe7, 0x5d, 0xad, 0xca,
+ 0x22, 0xb5, 0xa4, 0xbf, 0xa0, 0xa7, 0xd5, 0xd6, 0x85, 0x1f, 0x00, 0x06,
+ 0x4c, 0xc8, 0xc9, 0x9b, 0x3e, 0x73, 0x46, 0xa1, 0xe3, 0x91, 0xd8, 0xe2,
+ 0xe2, 0xa2, 0x65, 0x59, 0xd9, 0x79, 0x2b, 0x80, 0xdf, 0xd7, 0xd6, 0x85,
+ 0x7b, 0x66, 0x67, 0xe7, 0xbe, 0x0a, 0xb2, 0x45, 0x61, 0x9c, 0xc2, 0xbd,
+ 0x44, 0xa6, 0x52, 0xee, 0x97, 0x30, 0x7b, 0x15, 0x17, 0x7e, 0xd2, 0xf0,
+ 0x9a, 0x68, 0x52, 0x5a, 0xcf, 0xba, 0xfe, 0xd9, 0xd9, 0x79, 0x7f, 0xb2,
+ 0x2d, 0xfd, 0x4c, 0xc2, 0x72, 0x0a, 0xc2, 0x45, 0xc0, 0x0d, 0x36, 0xf6,
+ 0xb9, 0xc0, 0x3c, 0xd3, 0xf2, 0x26, 0x39, 0x25, 0x25, 0x45, 0x6b, 0x11,
+ 0x19, 0x01, 0x3c, 0x04, 0x5c, 0x0d, 0x5a, 0x8e, 0xe8, 0x1a, 0x84, 0xaf,
+ 0x50, 0x4a, 0x81, 0xa3, 0x80, 0xeb, 0x4a, 0x8a, 0x0b, 0x9b, 0xb8, 0xa5,
+ 0x76, 0x58, 0x5e, 0x03, 0x0a, 0x80, 0xd1, 0xa2, 0x2c, 0x41, 0x78, 0x57,
+ 0xe1, 0x41, 0x85, 0x3f, 0x84, 0xea, 0xec, 0x29, 0x44, 0x26, 0x63, 0xf4,
+ 0x4f, 0x74, 0x1a, 0x66, 0xce, 0x28, 0x5a, 0xa9, 0xa2, 0x47, 0x03, 0x55,
+ 0xa8, 0xcc, 0x0e, 0xdb, 0xb2, 0x56, 0x22, 0x8b, 0x1d, 0x1e, 0x06, 0x5e,
+ 0x45, 0x43, 0xad, 0x1a, 0x94, 0x9b, 0x3e, 0x7d, 0x5a, 0x4d, 0x7d, 0x9d,
+ 0xeb, 0x00, 0xe0, 0x6d, 0x85, 0xe7, 0x10, 0xbe, 0x12, 0xd5, 0xf7, 0x51,
+ 0x9e, 0x02, 0x3e, 0x42, 0x65, 0x58, 0x5b, 0x84, 0xbb, 0xcb, 0x5d, 0x08,
+ 0x9d, 0x0a, 0xcc, 0x05, 0x6e, 0x57, 0x64, 0xb1, 0xc2, 0xfb, 0x44, 0x2a,
+ 0xba, 0x4b, 0x1a, 0x2a, 0x9a, 0xc4, 0xe6, 0x79, 0x71, 0xe1, 0xcd, 0xc0,
+ 0xcd, 0x28, 0x57, 0x2a, 0x2c, 0x11, 0x5b, 0xd6, 0x20, 0xcc, 0x23, 0x32,
+ 0x3d, 0x32, 0xc7, 0x0e, 0xd5, 0x95, 0x99, 0x96, 0xb7, 0xb3, 0x08, 0x78,
+ 0xc6, 0xf4, 0x2d, 0x40, 0x76, 0x56, 0xd6, 0xc4, 0xc9, 0x58, 0x7a, 0x86,
+ 0x28, 0xfb, 0x02, 0x55, 0xaa, 0xfa, 0x79, 0x49, 0x49, 0xd1, 0x87, 0xcd,
+ 0xd6, 0xe2, 0x0f, 0x4d, 0x0f, 0x01, 0x93, 0xb3, 0xb3, 0x73, 0x66, 0x28,
+ 0xd6, 0xff, 0x09, 0xd4, 0x86, 0x42, 0xee, 0xc5, 0x0f, 0x3f, 0x3c, 0x75,
+ 0x47, 0xc4, 0x0d, 0xcc, 0x1e, 0x24, 0xe2, 0xda, 0x43, 0xf0, 0x2e, 0x5f,
+ 0x4a, 0x4a, 0xa8, 0x99, 0x4a, 0xaf, 0x7e, 0xb3, 0xcb, 0x72, 0xed, 0x23,
+ 0x22, 0x51, 0x67, 0x60, 0xd5, 0xd6, 0x6e, 0x5d, 0xde, 0xbb, 0x77, 0xef,
+ 0x7d, 0x06, 0x0c, 0x18, 0x50, 0x15, 0x45, 0xc0, 0xab, 0x81, 0x63, 0x26,
+ 0x4c, 0xc8, 0x3b, 0x08, 0x8b, 0xd3, 0x44, 0x74, 0xbb, 0xa8, 0xbd, 0xac,
+ 0xb8, 0xb8, 0x38, 0xa6, 0xd7, 0x55, 0x8f, 0x3e, 0x5a, 0x50, 0x0d, 0x9c,
+ 0x95, 0x9b, 0x9b, 0x3b, 0x24, 0x6c, 0x5b, 0xa7, 0x03, 0x58, 0x12, 0x7e,
+ 0x7f, 0xc6, 0x8c, 0x19, 0x9f, 0x47, 0x11, 0xe1, 0xe9, 0x2e, 0x97, 0xcb,
+ 0x2a, 0x2a, 0x2a, 0x8c, 0x1a, 0x5f, 0x97, 0xa5, 0x87, 0x00, 0x52, 0xf2,
+ 0xf0, 0x54, 0x7b, 0xf7, 0x0a, 0xb3, 0x24, 0x0c, 0xfc, 0x70, 0xc2, 0x84,
+ 0xbc, 0xfd, 0xc4, 0x92, 0x11, 0x02, 0xd5, 0xd5, 0xd5, 0xd5, 0x95, 0x7f,
+ 0xf9, 0xcb, 0xe3, 0xa1, 0xac, 0xec, 0xbc, 0x22, 0x00, 0x15, 0x3b, 0xbc,
+ 0x47, 0x58, 0x83, 0x5c, 0x2e, 0xd7, 0x8e, 0xdd, 0x5b, 0x0e, 0x7b, 0x94,
+ 0x58, 0xe2, 0x76, 0xbb, 0xdd, 0x51, 0x0f, 0x47, 0xb7, 0x84, 0xd3, 0x45,
+ 0xd4, 0x7a, 0xf2, 0xc9, 0x29, 0x76, 0x14, 0x01, 0x3f, 0x7c, 0xcd, 0x35,
+ 0x53, 0x1e, 0xeb, 0xd3, 0x6f, 0xcb, 0xff, 0x89, 0xc8, 0x11, 0xa2, 0xf6,
+ 0x37, 0x21, 0x97, 0xbc, 0xf5, 0x70, 0x61, 0x61, 0x7d, 0x77, 0xe9, 0xf3,
+ 0x0a, 0x06, 0x43, 0x1c, 0xc9, 0xca, 0xce, 0xfb, 0x1f, 0x30, 0x30, 0x54,
+ 0x9f, 0xd6, 0xf3, 0x91, 0x47, 0xee, 0x37, 0xc7, 0x61, 0x1a, 0xb7, 0xd9,
+ 0xd0, 0x19, 0xb8, 0xe9, 0xa6, 0xdb, 0x7a, 0x10, 0x99, 0xfd, 0xe4, 0x37,
+ 0xc2, 0x35, 0xe2, 0x35, 0x24, 0x21, 0x37, 0xe7, 0xe5, 0x0d, 0xce, 0xc9,
+ 0xc9, 0xdd, 0x6d, 0x20, 0x6f, 0xca, 0x94, 0x29, 0xe2, 0x4e, 0xa9, 0x7d,
+ 0x0e, 0xe8, 0x21, 0xc2, 0x4d, 0xc6, 0x4a, 0xa6, 0xcf, 0x6b, 0x48, 0xc6,
+ 0x1a, 0xdf, 0xe6, 0x5e, 0x5b, 0xe5, 0xfa, 0xac, 0xec, 0xbc, 0xb9, 0x44,
+ 0x16, 0x58, 0xf4, 0xdd, 0xb0, 0x71, 0x4b, 0x3a, 0x70, 0x14, 0x22, 0xc5,
+ 0xa1, 0xfa, 0x9a, 0x2f, 0x8c, 0x95, 0x8c, 0x78, 0x0d, 0x49, 0x88, 0x86,
+ 0xf5, 0x5e, 0xb1, 0x64, 0x0d, 0x30, 0x8e, 0xc8, 0x7a, 0xdf, 0xed, 0xc0,
+ 0xbb, 0x82, 0xe4, 0x17, 0xcf, 0x98, 0x3e, 0xdb, 0x58, 0xa8, 0x7d, 0xf8,
+ 0x7f, 0x49, 0xf1, 0x1a, 0x6f, 0x4b, 0xd5, 0x18, 0xc6, 0x00, 0x00, 0x00,
+ 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
};
-static const unsigned char app_icon_png[]={
-0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x0,0x0,0x0,0x0d,0x49,0x48,0x44,0x52,0x0,0x0,0x01,0x0,0x0,0x0,0x01,0x0,0x08,0x06,0x0,0x0,0x0,0x5c,0x72,0xa8,0x66,0x0,0x0,0x0,0x06,0x62,0x4b,0x47,0x44,0x0,0xff,0x0,0xff,0x0,0xff,0xa0,0xbd,0xa7,0x93,0x0,0x0,0x0,0x09,0x70,0x48,0x59,0x73,0x0,0x0,0x0d,0xd7,0x0,0x0,0x0d,0xd7,0x01,0x42,0x28,0x9b,0x78,0x0,0x0,0x20,0x0,0x49,0x44,0x41,0x54,0x78,0xda,0xed,0x9d,0x79,0x9c,0x54,0xd5,0x99,0xf7,0x7f,0xe7,0xde,0x5b,0x7b,0x55,0x57,0xf5,0xbe,0x77,0x43,0x37,0x6b,0xb3,0x8b,0x20,0x8b,0x22,0x2e,0xd1,0x98,0x31,0xd1,0xc4,0x84,0x44,0x07,0xd0,0x06,0x9d,0x64,0x26,0xaf,0x8e,0x89,0x79,0x67,0x46,0xf3,0x26,0xa2,0x93,0x65,0x7c,0xe7,0xcd,0x32,0x8e,0x66,0x24,0x09,0x69,0x40,0x8d,0x19,0x26,0x89,0x21,0x2e,0xb8,0x6f,0x80,0x88,0x82,0xa0,0xec,0x74,0x43,0xd3,0xd0,0x6b,0xf5,0x56,0xfb,0x7a,0xef,0x3d,0xef,0x1f,0x8d,0xad,0xd0,0x5b,0x55,0x77,0xed,0xf5,0x7c,0x3f,0x1f,0x3e,0x68,0x51,0x55,0xe7,0xd6,0x59,0x7e,0xe7,0x39,0xcf,0x79,0xce,0x73,0x0,0x82,0x20,0x08,0x82,0x20,0x08,0x82,0x20,0x08,0x82,0x20,0xb2,0x01,0x96,0xce,0x0f,0xbf,0x6d,0xe3,0x46,0xab,0x47,0xa3,0xd1,0xea,0x0,0x0b,0x67,0xcc,0xa4,0xaa,0xaa,0x8e,0x33,0x66,0xa3,0x66,0x25,0xe2,0x3a,0x68,0x38,0x0f,0x88,0xa2,0xe8,0x57,0x65,0xd9,0xc9,0xb5,0xda,0x90,0x28,0x8a,0x6e,0x8d,0x46,0xe3,0x5d,0xb5,0x6a,0x55,0x88,0x04,0x20,0x0e,0x34,0x34,0x34,0xd8,0x24,0xc6,0x96,0x73,0x60,0x16,0x38,0x9f,0x2e,0x70,0x3e,0x93,0x33,0x36,0x03,0x40,0x2e,0x75,0x47,0x22,0x35,0x46,0x12,0x93,0xc1,0x79,0x33,0x07,0x8e,0x0a,0x9c,0x9f,0xe0,0xc0,0x71,0xae,0xaa,0x1f,0xac,0x59,0xbf,0xfe,0x08,0x63,0x8c,0x93,0x0,0x44,0xc1,0xc6,0x8d,0x1b,0x8d,0x26,0x8d,0xe6,0x6a,0x15,0x58,0xc9,0x18,0x5b,0x09,0x60,0x3e,0x0,0x91,0x7a,0x19,0x91,0x86,0x74,0x83,0xb1,0xb7,0x39,0xf0,0x16,0x53,0x94,0xd7,0xd6,0xac,0x5f,0x7f,0x82,0x04,0x60,0x18,0xde,0xdc,0xb0,0x41,0x3a,0x57,0x5d,0x7d,0x83,0x0,0xac,0xe1,0xc0,0x17,0x01,0xe8,0xa9,0xef,0x10,0x19,0x07,0xe7,0xc7,0xc0,0xd8,0x36,0x41,0x51,0x1a,0xfe,0xf6,0xce,0x3b,0x5b,0xb2,0x5e,0x0,0xb6,0x6d,0xdc,0x68,0x0d,0x6a,0xb5,0xdf,0x06,0x70,0x27,0x80,0xc9,0xd4,0x43,0x88,0x2c,0x21,0x04,0xce,0x5f,0xe0,0x9c,0xff,0x7c,0xed,0xfa,0xf5,0xbb,0xb2,0x4e,0x0,0x9e,0xd9,0xb4,0xa9,0x4c,0x61,0xec,0x9f,0x39,0x63,0xeb,0x01,0x98,0xa8,0x3f,0x10,0x59,0x6c,0x15,0x1c,0xe0,0x8c,0xfd,0x74,0xcd,0x1d,0x77,0xfc,0x31,0xd1,0xfe,0x82,0x84,0x0b,0xc0,0xd6,0xad,0x5b,0x4d,0x90,0xe5,0xfb,0x19,0x63,0xf7,0x0,0xb0,0x50,0xeb,0x13,0xc4,0x20,0xbb,0x19,0xf0,0xbd,0xd5,0xf5,0xf5,0xef,0x65,0x9c,0x0,0x70,0xce,0xd9,0x53,0x5b,0xb6,0xac,0x01,0xe7,0x8f,0x0,0x28,0xa1,0xb6,0x26,0x88,0x11,0xc6,0x0a,0x63,0xcf,0x6b,0x54,0xf5,0x1f,0x6e,0x5d,0xb7,0xee,0x5c,0x46,0x08,0xc0,0xe6,0xcd,0x9b,0x6b,0x45,0xce,0x1f,0x03,0xf0,0x79,0x6a,0x5e,0x82,0x88,0x40,0x04,0x80,0x3e,0xc6,0xf9,0x03,0xab,0xeb,0xeb,0x7f,0x1d,0xcf,0x65,0x41,0xdc,0x05,0xe0,0xc9,0xdf,0xfd,0xee,0x4e,0x30,0xf6,0x28,0x0,0x03,0x35,0x2b,0x41,0x44,0x6d,0x39,0xbf,0xa9,0x30,0x76,0x5b,0x7d,0x7d,0x7d,0x67,0x5a,0x09,0xc0,0xc6,0x8d,0x1b,0x8d,0x26,0xad,0xf6,0x09,0x0e,0xac,0xa1,0x66,0x24,0x88,0x09,0xd1,0xc6,0x55,0xf5,0x1b,0xf1,0xd8,0x2d,0x88,0x8b,0x0,0x3c,0xb3,0x69,0x53,0x99,0x2c,0x8a,0xdb,0xc1,0xf9,0xa5,0xd4,0x76,0x04,0x11,0x13,0x42,0xe0,0xfc,0x9e,0x35,0xeb,0xd6,0x6d,0x4c,0x69,0x01,0x78,0xba,0xa1,0x61,0xbe,0x0a,0xbc,0x08,0xa0,0x94,0xda,0x8c,0x20,0x62,0x3c,0x63,0x73,0xfe,0x68,0xd3,0xd9,0xb3,0xdf,0xd9,0xb0,0x61,0x83,0x9a,0x72,0x02,0xf0,0xf4,0xe6,0xcd,0x2b,0x54,0xce,0xb7,0x03,0xa0,0x03,0x39,0x04,0x11,0x3f,0xfe,0x24,0x03,0xab,0xeb,0xeb,0xeb,0x03,0x13,0xfd,0x22,0x21,0x56,0x4f,0xf4,0x64,0x43,0xc3,0xe7,0x54,0xce,0x77,0xd0,0xe0,0x27,0x88,0xb8,0x73,0x8b,0x04,0x6c,0xdb,0xb6,0x6d,0x9b,0x36,0x25,0x2c,0x80,0xad,0x9b,0x36,0x5d,0xce,0x04,0xe1,0x15,0x90,0xa7,0x9f,0x20,0x12,0x07,0xe7,0x7f,0xd5,0x99,0xcd,0x5f,0x59,0xb5,0x6a,0x95,0x92,0x34,0x0b,0xe0,0xc9,0x4d,0x9b,0xe6,0x31,0x41,0x78,0x9e,0x06,0x3f,0x41,0x24,0xda,0x21,0xc0,0xbe,0x14,0xf4,0x7a,0x1f,0x4f,0xda,0x12,0xe0,0x99,0x4d,0x9b,0xca,0x98,0x20,0xfc,0x05,0x80,0x95,0x5a,0x83,0x20,0x92,0xc2,0x37,0x9f,0x6c,0x68,0xf8,0xe7,0x84,0x2f,0x01,0xb6,0x6d,0xdb,0xa6,0x0d,0x7a,0xbd,0xbb,0x0,0x2c,0xa2,0x36,0x20,0x88,0xe4,0x2e,0x06,0x0,0x7c,0x65,0x4d,0x7d,0xfd,0x5f,0x12,0x66,0x01,0x04,0x7d,0xbe,0x7f,0xa3,0xc1,0x4f,0x10,0xa9,0xb1,0x18,0x0,0xf0,0xbb,0x86,0x86,0x86,0x49,0x09,0x11,0x80,0xad,0x0d,0x0d,0x5f,0x01,0xe7,0xf7,0x52,0xbd,0x13,0x44,0xca,0x90,0x2b,0x02,0xff,0x1d,0xed,0xce,0x40,0xd4,0x02,0xf0,0xfb,0xdf,0xfc,0xa6,0x98,0x31,0xb6,0x11,0x69,0x9e,0x50,0x94,0x20,0x32,0xd0,0x0c,0x58,0x1c,0xf4,0x7a,0x1f,0x88,0xab,0x0,0x28,0x92,0xf4,0x4b,0x70,0x5e,0x40,0xd5,0x4d,0x10,0xa9,0xa8,0x02,0xec,0xfb,0x5b,0xb6,0x6c,0x99,0x1b,0x17,0x01,0x78,0xb2,0xa1,0xe1,0xf3,0x0,0xbe,0x41,0xb5,0x9c,0x1c,0x42,0xaa,0x80,0x10,0x17,0xd2,0xea,0x99,0xbd,0xaa,0x04,0x4e,0x4d,0x97,0x38,0x38,0x97,0x04,0x55,0x7d,0x8c,0x73,0x1e,0x91,0x85,0x1e,0xb1,0x19,0xff,0xe8,0xa3,0x8f,0xea,0x72,0x2d,0x96,0x43,0x0,0xa6,0x52,0x2d,0x27,0x06,0xa7,0xa2,0x81,0x3d,0xac,0x83,0x5d,0xd6,0xa3,0x27,0xac,0x87,0x5b,0x95,0x30,0x49,0xeb,0xc1,0xe5,0x96,0x9e,0xb4,0x19,0xfc,0x7f,0x75,0x94,0x83,0x73,0x20,0x57,0x0a,0xa3,0x44,0xe3,0x47,0xa1,0x14,0x44,0x91,0x26,0x0,0x2d,0x53,0xa9,0x81,0xe3,0x69,0x08,0x70,0xbe,0x66,0xf5,0xba,0x75,0x4f,0xc5,0x4c,0x0,0x9e,0x6a,0x68,0xb8,0x9b,0x03,0x8f,0x52,0xd5,0xc6,0x8f,0x30,0x67,0x68,0x0b,0x1b,0xd1,0x15,0xd6,0xc3,0x1e,0xd6,0xc3,0xa9,0x68,0x86,0x6d,0xb0,0xeb,0xad,0xed,0x28,0x90,0x52,0xff,0x0e,0x8a,0xdd,0xee,0x02,0x34,0x87,0xcc,0x43,0x5e,0x17,0x19,0x1f,0x14,0x82,0x72,0xad,0x1f,0x79,0x62,0x90,0x1c,0x4a,0xb1,0x5f,0x0a,0xb4,0xf6,0xbb,0x5c,0x53,0xee,0xb9,0xe7,0x9e,0xe0,0x68,0x6f,0x93,0x22,0xf9,0xae,0x6d,0xdb,0xb6,0x19,0xa2,0x75,0x2e,0x10,0x91,0xcf,0xf2,0xad,0x21,0x23,0xda,0xc2,0x46,0xd8,0xc3,0xda,0x31,0x35,0x99,0x03,0x78,0xdf,0x5b,0x80,0x2f,0x58,0xdb,0x53,0xfa,0x77,0x75,0x85,0x75,0xc3,0x0e,0x7e,0x0,0x50,0x38,0x43,0x67,0x58,0x8f,0xce,0xb0,0x1e,0x1f,0xfb,0x6c,0xd0,0x09,0x2a,0xca,0x34,0x3e,0x54,0x6a,0xfd,0x28,0xd3,0xf8,0x21,0x91,0x75,0x10,0x8b,0xa5,0x40,0x45,0x9e,0xc5,0xb2,0x1e,0xc0,0xaf,0x26,0x6c,0x01,0x6c,0x6d,0x68,0xf8,0x16,0x03,0xfe,0x8b,0x6a,0x35,0x76,0x83,0xfe,0x6c,0xc8,0x88,0xd6,0x90,0x11,0x7d,0xb2,0x6e,0x5c,0x6b,0xe4,0xe5,0xe6,0x6e,0x4c,0xd6,0x79,0x53,0xb3,0xef,0x01,0x78,0xd9,0x59,0x8a,0x1e,0x59,0x17,0xf5,0x67,0xb5,0x4c,0x45,0x99,0xc6,0x8f,0x0a,0xad,0x0f,0xe5,0x5a,0x1f,0x34,0x8c,0x3c,0x08,0x13,0x68,0x87,0x73,0x7a,0x93,0x69,0xca,0x68,0x57,0x96,0x8d,0x69,0x01,0xbc,0xb9,0x61,0x83,0xd4,0x0a,0xfc,0x13,0x55,0xe7,0xc4,0x08,0x72,0x11,0x67,0x02,0x46,0x9c,0x0e,0x59,0xd0,0x2b,0x4f,0xf8,0x10,0x17,0x0e,0xfa,0x72,0x51,0xa5,0xf5,0x41,0x4c,0xc1,0x01,0x72,0x26,0x64,0x1e,0xd7,0xe0,0x07,0x80,0x10,0x17,0x70,0x26,0x64,0xc2,0x99,0x90,0x09,0x22,0xe3,0xa8,0xd2,0x78,0x51,0xa3,0xf7,0xa2,0x54,0xe3,0xa7,0x4e,0x14,0xed,0x2a,0x0,0xa8,0x0c,0x79,0x3c,0xb7,0x02,0xd8,0x32,0x6e,0x01,0x68,0xab,0xaa,0xba,0x19,0x74,0x61,0xc7,0xb8,0x90,0x39,0x43,0x73,0xd0,0x84,0xe6,0x90,0x25,0x22,0xf3,0x3e,0x1a,0xbc,0xaa,0x84,0xa3,0x81,0x1c,0xcc,0x31,0x38,0x53,0xea,0x37,0x2b,0x9c,0xe1,0x80,0x37,0x37,0x66,0xdf,0xd5,0x1c,0x32,0xa3,0x39,0x64,0x86,0x56,0x50,0x51,0xad,0xf5,0xa1,0x46,0xe7,0x41,0xa1,0x14,0xa0,0xce,0x15,0xa9,0x15,0xc0,0xd8,0x77,0x46,0x13,0x80,0x31,0xf7,0x94,0x38,0xb0,0x8e,0xaa,0x31,0x3a,0x5c,0x8a,0x06,0xfb,0xbc,0x79,0x78,0xd6,0x51,0x89,0xbd,0xde,0x02,0xd8,0xc3,0x3a,0xc4,0x23,0x6e,0xea,0xb8,0xdf,0x9a,0x72,0xdb,0x82,0x8d,0x41,0x0b,0x7c,0x6a,0xec,0xaf,0x71,0x0c,0xa9,0x02,0x1a,0x03,0x66,0xbc,0xec,0x2c,0xc1,0x4b,0xce,0x52,0x34,0x06,0x2c,0x50,0x38,0xb9,0x0e,0x23,0x60,0xde,0xd6,0x4d,0x9b,0x2e,0x1d,0x97,0x05,0xd0,0xd0,0xd0,0x50,0x02,0xe0,0x3a,0xaa,0xc3,0xc8,0x68,0x0d,0x19,0x71,0x34,0x60,0x3d,0x3f,0xe0,0x13,0xb1,0xac,0x10,0x70,0xc4,0x6f,0xc5,0x02,0x63,0x7f,0x4a,0xfc,0xfe,0x30,0x67,0x38,0xe4,0x8b,0xff,0xc1,0xd0,0x1e,0x59,0x87,0x1e,0x59,0x87,0x0f,0x7d,0x79,0xa8,0xd1,0x7b,0x30,0x5b,0xef,0x80,0x41,0x50,0xa8,0x03,0x8e,0x34,0xcb,0x33,0xb6,0x06,0xc0,0xbe,0xa8,0x2d,0x0,0x91,0xf3,0x5b,0x41,0xb7,0xf2,0x8e,0x8a,0x0a,0x86,0xd3,0x41,0x13,0x5e,0x74,0x96,0xe1,0x2d,0x77,0x51,0xc2,0x06,0xff,0xa0,0x15,0x10,0xc8,0x81,0x5f,0x4d,0x8d,0x26,0x3a,0x16,0xb0,0x22,0xc8,0x13,0xf7,0x2c,0x61,0xce,0x70,0xc2,0x6f,0xc1,0xb3,0x8e,0x4a,0xec,0xf6,0x14,0x0c,0xbb,0x6d,0x4a,0x0,0x9c,0xb1,0x5b,0x37,0x6e,0xdc,0xa8,0x89,0xda,0x02,0x60,0x8c,0xdd,0x4a,0xd5,0x37,0x32,0xe7,0x42,0x46,0x1c,0xf4,0xe5,0x26,0xb5,0xe3,0x29,0x9c,0xe1,0x88,0xdf,0x8a,0x4b,0x4d,0x7d,0x49,0xad,0x8b,0x90,0x2a,0xe0,0xb8,0x3f,0x27,0x39,0x22,0xcc,0x81,0xe6,0xa0,0x19,0x2d,0x41,0x13,0xaa,0xb4,0x3e,0x5c,0x62,0xea,0x83,0x91,0x2c,0x82,0xcf,0x52,0x68,0xd4,0x6a,0xaf,0x01,0xf0,0x52,0xc4,0x16,0xc0,0x79,0xf3,0x9f,0xd2,0x7a,0x8f,0x42,0x73,0xd0,0x94,0x12,0xb3,0xce,0xc9,0x80,0x05,0x3e,0x55,0x4a,0xea,0x33,0x1c,0x0b,0x24,0xdf,0x1f,0xa1,0x82,0xe1,0x4c,0xc8,0x04,0xb7,0x22,0x51,0xe7,0x1c,0x3a,0x9b,0xff,0x4d,0x54,0x4b,0x0,0x89,0xf3,0xab,0x40,0x27,0xfe,0x46,0x45,0x9b,0x22,0x5b,0x70,0x2a,0x18,0x0e,0xf9,0x93,0x97,0x94,0x29,0xc8,0x45,0x1c,0x0b,0xe4,0x50,0xbb,0xa4,0xf4,0x5a,0x55,0xbd,0x26,0x3a,0x1f,0x80,0x20,0x5c,0x4d,0xb5,0x36,0x3a,0xa2,0x90,0x3a,0x1d,0xed,0x54,0xc0,0x0c,0x6f,0x92,0xac,0x80,0xa3,0x7e,0x0b,0xe4,0x14,0xf2,0xc8,0x8b,0x24,0x0,0xc3,0x59,0x0,0x33,0xb7,0x6c,0xd9,0x52,0x1e,0xb9,0x0,0x70,0x4e,0x02,0x30,0xd6,0x4c,0x83,0xd4,0x09,0x59,0x55,0x31,0xe0,0x0b,0x48,0xc6,0xec,0x7f,0xd2,0x9f,0x93,0x5a,0xed,0x42,0xa1,0xc4,0xc3,0xcf,0xe9,0x9c,0xaf,0x8c,0x48,0x0,0xb6,0x6e,0xdd,0x5a,0x04,0xa0,0x86,0xaa,0x6c,0x74,0xa4,0x14,0x9b,0x69,0x9a,0x02,0xe6,0x84,0xfb,0x02,0x8e,0xfb,0x73,0x10,0x86,0x90,0x62,0xed,0x42,0x02,0x30,0x02,0x4b,0x22,0xb3,0x0,0x64,0x79,0x26,0xd5,0x55,0x24,0xa6,0x66,0x6a,0x75,0x34,0x15,0x0c,0xc7,0x12,0x38,0x1b,0x87,0x39,0xc3,0x89,0x80,0x25,0xc5,0x5a,0x85,0xd3,0x12,0x60,0x64,0xab,0x7e,0x66,0x44,0x02,0xc0,0x04,0x61,0x3a,0xd5,0x56,0x7a,0x9a,0x9a,0x27,0x83,0x96,0x84,0xed,0xc5,0x9f,0x0c,0xe4,0xa4,0x5c,0x24,0xa2,0xc4,0x38,0x79,0xae,0x47,0xf6,0x03,0x4c,0x8f,0xcc,0x02,0xe0,0x9c,0x04,0x20,0x22,0x0b,0x20,0xf5,0x66,0x1a,0x85,0x33,0x9c,0xf0,0x9b,0xe3,0x6f,0x6d,0x70,0xe0,0x44,0x20,0x27,0xe5,0x7e,0x3f,0xed,0x0,0x8c,0x6a,0x01,0x94,0x6f,0x7b,0xfc,0x71,0xf3,0xd8,0x02,0x40,0x59,0x7f,0x22,0x42,0x93,0xa2,0x6b,0xcd,0x13,0x81,0x9c,0xb8,0xc7,0xc9,0x9f,0x0e,0x99,0xe3,0x12,0xf3,0x9f,0x89,0xa2,0x9c,0x4a,0x36,0x40,0xd8,0x68,0x9c,0x72,0x81,0xc5,0x34,0xc2,0x1b,0x4b,0xa8,0xae,0x22,0x11,0x80,0xd4,0xec,0x6c,0x41,0x2e,0xe2,0x74,0xd0,0x84,0xa9,0x7a,0xcf,0x88,0xef,0x09,0xa9,0x02,0x14,0x30,0x84,0xb9,0x80,0x30,0x67,0x0,0x18,0x04,0xc6,0x21,0x31,0x15,0x5a,0xc6,0x21,0x41,0x1d,0x71,0x30,0x71,0x20,0x69,0x51,0x7f,0xe9,0xb8,0x2c,0x4b,0x25,0xd4,0x8b,0xc6,0xb6,0x34,0x42,0x03,0x5b,0x68,0x1d,0x15,0xc9,0x7a,0x33,0x75,0x3b,0xdb,0xb1,0x80,0x15,0x12,0x1b,0x38,0x36,0xec,0x55,0x45,0x78,0x14,0x09,0x3e,0x55,0x82,0x47,0x95,0xa2,0xb2,0x0e,0xf4,0x82,0x02,0xb3,0xa0,0xc0,0x24,0x84,0x61,0x14,0x14,0x98,0x44,0x19,0x32,0x67,0x70,0x28,0xda,0x94,0xfc,0xdd,0x22,0x48,0x0,0x46,0x5d,0x05,0x0,0x96,0x31,0x05,0x80,0x5d,0xf4,0x26,0x22,0xfd,0x04,0xc0,0xa5,0x68,0xb0,0xdb,0x33,0xf1,0xec,0xed,0x01,0x55,0x44,0x40,0x15,0xd1,0x03,0x6d,0x5a,0xb4,0x09,0x59,0x0,0xa3,0x23,0x5c,0x34,0xb6,0x47,0xf2,0x01,0x90,0x0,0x44,0x80,0x81,0x3a,0x5b,0xca,0xa1,0xa3,0x43,0x40,0x63,0x91,0x13,0x89,0x0,0x98,0xa8,0x9e,0x22,0xb3,0x0,0xc8,0xe9,0x94,0x62,0xa2,0x2c,0x90,0x28,0x8f,0xea,0x03,0xe0,0x3c,0xa2,0x5d,0x0,0xca,0x01,0x10,0xe9,0x1a,0x99,0xd1,0x8c,0x93,0x5a,0x16,0x0,0x09,0xc0,0x68,0x30,0xc6,0xa4,0x48,0x04,0x80,0xa0,0x19,0x27,0x4d,0x05,0x59,0xa6,0x4a,0x88,0xce,0x27,0x40,0x50,0x87,0x23,0x41,0x26,0x01,0x20,0xc6,0x67,0x72,0x8a,0xd4,0xe1,0x48,0x90,0x49,0x0,0xb2,0x16,0x93,0x40,0x1d,0x2e,0x95,0xa0,0x54,0x60,0x24,0x0,0x09,0xc5,0x4c,0x02,0x90,0x32,0x48,0x4c,0x85,0x96,0x96,0x0,0x24,0x0,0x89,0x9d,0x71,0x48,0x0,0x52,0xc7,0x1a,0xa3,0xd9,0x9f,0x04,0x80,0x2c,0x80,0xec,0x6d,0x0b,0x91,0xda,0x82,0x04,0x20,0xd1,0x16,0x80,0xa8,0x0,0xa0,0x60,0xa0,0x94,0x68,0x0b,0x72,0x0,0x92,0x0,0x24,0x1a,0xb7,0x22,0x41,0xa4,0x93,0x53,0x29,0x41,0x90,0x8b,0x50,0x29,0x1d,0x48,0x54,0x50,0x02,0xf5,0xf1,0x76,0x36,0x55,0xc0,0x3e,0x5f,0x1e,0x9a,0x83,0x26,0x50,0xf6,0xf4,0xd4,0xe0,0x6c,0xc8,0x88,0x67,0xfb,0x2b,0xb0,0xc0,0xd8,0x87,0x9a,0x14,0xbd,0x3a,0x9d,0x04,0x20,0xcd,0xe1,0x18,0x48,0xbe,0x79,0xd0,0x9f,0x87,0xa0,0x4a,0x06,0x54,0xaa,0xe1,0x57,0x45,0xbc,0xeb,0x29,0xc4,0xe9,0xa0,0x05,0x8b,0x4c,0xbd,0xb0,0x8a,0x61,0xaa,0x14,0x12,0x80,0xd8,0x99,0xfb,0xef,0x7b,0xf3,0xd1,0x11,0x36,0x50,0x65,0xa4,0x38,0x9d,0x61,0x3d,0x76,0x38,0xcb,0x30,0xc7,0xe0,0xc4,0x4c,0x83,0x13,0x02,0xf9,0x69,0xd2,0xd3,0x07,0x10,0x50,0x45,0x7c,0xe4,0xb3,0x25,0xf4,0xd2,0xc9,0x8b,0x19,0xc8,0xb9,0x6f,0xc3,0xf3,0xce,0x72,0x1a,0xfc,0x69,0x84,0xcc,0x19,0x0e,0xf8,0x6c,0x78,0xd1,0x59,0x86,0x5e,0x59,0x97,0xd4,0x67,0xe9,0x0a,0xeb,0x71,0x3c,0x05,0x73,0x28,0xa6,0xb4,0x05,0x10,0xe6,0x0c,0xaf,0xbb,0x8b,0xd1,0x2f,0x6b,0x71,0x2c,0x90,0x83,0x3a,0xbd,0x0b,0x33,0x0d,0xce,0x84,0xa6,0xe2,0x72,0x28,0x5a,0xec,0xf6,0x14,0xa0,0x5f,0xd6,0xd2,0x88,0x4a,0x53,0x1c,0xb2,0x06,0x2f,0x39,0x4b,0x31,0xd3,0xe0,0xc2,0x7c,0x43,0x1f,0x84,0x04,0xba,0x6c,0x7a,0x65,0x1d,0x3e,0xf2,0xe7,0xa2,0x3d,0xa4,0x07,0x0,0x30,0xce,0x31,0xdd,0xe0,0x26,0x01,0x18,0x73,0xd6,0xe5,0xc0,0xdb,0xee,0xa2,0xc1,0x81,0x27,0x73,0x01,0x1f,0xfb,0x6d,0x38,0x11,0xcc,0xc1,0x2c,0x83,0x13,0xd3,0x75,0xae,0xb8,0x9f,0xc5,0x3f,0x19,0xcc,0xc1,0x7e,0x6f,0x6e,0xdc,0x13,0x6c,0x12,0xf1,0x87,0x03,0x38,0xea,0xcf,0x41,0x57,0x58,0x8f,0xcb,0xcd,0x76,0x58,0xe2,0x1c,0x33,0xe0,0x54,0x34,0x38,0xe8,0xcf,0x45,0x6b,0xd0,0x78,0xc1,0xe2,0xe3,0x03,0x5f,0x1e,0x0c,0xa2,0x8a,0x2a,0x6d,0x6a,0x38,0x29,0x85,0x54,0x6d,0xac,0x3d,0xde,0x42,0x74,0x0e,0x63,0x6e,0x07,0x55,0x01,0x1f,0x7a,0x73,0xf1,0x57,0x67,0x05,0xce,0x84,0x4c,0x71,0x59,0xd9,0x85,0xb8,0x80,0xb7,0xdd,0x45,0x78,0xdf,0x93,0x47,0x83,0x3f,0xc3,0xe8,0x95,0xb5,0x78,0xd1,0x51,0x76,0x7e,0xf7,0x26,0xf6,0x04,0xb9,0x88,0xbd,0xde,0x7c,0x3c,0xef,0x28,0xc7,0xb9,0x8b,0x06,0xff,0x0,0x0c,0xbb,0xdc,0x05,0xb0,0xcb,0x7a,0x12,0x80,0x91,0x78,0xdf,0x9b,0x3f,0x66,0x03,0x79,0x15,0x11,0xbb,0xdc,0x85,0xd8,0xe1,0x2c,0x83,0x3d,0x1c,0xbb,0xca,0xec,0x91,0x75,0x78,0xc1,0x51,0x86,0x73,0x21,0x23,0x8d,0x96,0x0c,0x25,0x0c,0x01,0xbb,0x3d,0x85,0xd8,0xed,0x29,0x88,0x99,0xc0,0x2b,0x9c,0xe1,0x63,0x9f,0x0d,0x7f,0xee,0xaf,0x40,0x63,0xc0,0x32,0xea,0xc4,0xa4,0x82,0xe1,0x0d,0x57,0x11,0xfa,0x52,0x60,0x59,0x99,0x72,0x02,0x70,0x2c,0x60,0x45,0x63,0x14,0xd7,0x4d,0xf5,0xc9,0x5a,0xbc,0xe2,0x2a,0xc6,0xbb,0x9e,0x02,0x04,0x26,0x98,0xa7,0xbe,0x39,0x68,0xc6,0xab,0xae,0x92,0xa4,0xdd,0xb2,0x4b,0x24,0x96,0x58,0xb5,0x77,0x6b,0xd8,0x88,0xe7,0x9d,0xe5,0xf8,0xd8,0x6f,0x8b,0x58,0x50,0x64,0x2e,0xe0,0x4d,0x77,0x71,0xd2,0xfb,0x5a,0x4a,0x09,0xc0,0xb9,0x90,0x11,0xfb,0xbd,0xb6,0x71,0x7c,0x92,0xe1,0x74,0xd0,0x8c,0xed,0x8e,0x0a,0x1c,0xf3,0xe7,0x44,0x1d,0x0d,0xa6,0x82,0x61,0xaf,0x37,0x3f,0xa6,0x33,0x02,0x91,0x1e,0xf4,0xc8,0x3a,0xbc,0xe8,0x28,0x1d,0x76,0xb9,0x39,0x16,0x6e,0x55,0xc2,0x5b,0xae,0x22,0xbc,0xe5,0x2a,0x82,0x5b,0x89,0x7e,0x20,0xfb,0x55,0x11,0x6f,0xba,0x8a,0x20,0x27,0xf1,0x7a,0xb5,0x94,0x11,0x0,0x87,0xac,0xc1,0xbb,0xee,0x02,0x4c,0x24,0xaa,0x2e,0xcc,0x19,0xf6,0xfb,0xf2,0xf0,0xa2,0xa3,0x14,0x5d,0x61,0x5d,0xc4,0x8d,0xf0,0x8a,0xb3,0x24,0x2a,0xab,0x83,0xc8,0x2c,0x82,0x5c,0xc4,0xeb,0xae,0x62,0x1c,0x8d,0xf0,0xb2,0x93,0x4f,0xcc,0xfd,0xe7,0x1d,0xe5,0x68,0x0d,0x4f,0x6c,0xa9,0xe8,0x50,0xb4,0xd8,0x15,0x83,0xf4,0xed,0x69,0x2d,0x0,0x41,0x2e,0xe2,0x2d,0x4f,0x71,0xcc,0xae,0x99,0x76,0x28,0x5a,0xbc,0xe6,0x2a,0xc5,0x6e,0x77,0x01,0x02,0xa3,0x44,0xeb,0xf5,0xc9,0x5a,0xec,0x70,0x96,0xa2,0x27,0xc9,0x7b,0xc4,0x44,0xf2,0xe1,0x0,0x3e,0xf4,0xe5,0xe1,0x5d,0x4f,0xc1,0xa8,0x16,0x64,0x5b,0xc8,0x80,0xe7,0xa2,0x34,0xf7,0xc7,0x5c,0x42,0x84,0x8c,0xf8,0xc8,0x67,0x4b,0xca,0xef,0x4e,0xfa,0x62,0x57,0x05,0xc3,0x4e,0x77,0x21,0x3c,0x8a,0x14,0xf3,0x06,0x6d,0x0e,0x99,0xd1,0x2e,0x1b,0xb1,0xd0,0xd8,0x3b,0x24,0x36,0xbc,0x35,0x6c,0xc4,0x2e,0x77,0x21,0x64,0x32,0xf9,0x89,0xcf,0x70,0x3a,0x68,0x86,0x47,0x95,0xb0,0xd2,0x62,0xbf,0xe0,0x92,0x91,0x20,0x17,0xf1,0x81,0x27,0x17,0x67,0x42,0xf1,0xb9,0x78,0xf5,0xb0,0xdf,0x06,0x9b,0x14,0x46,0x75,0x82,0xb7,0x07,0x93,0x6e,0x01,0xec,0xf5,0xe4,0xa3,0x33,0x1c,0xbf,0x2d,0x91,0xa0,0x2a,0xe0,0x5d,0x4f,0x21,0x5e,0x71,0x95,0xc2,0xa9,0x68,0x0,0x0,0x8d,0x01,0x0b,0xde,0x76,0x15,0xd1,0xe0,0x27,0x86,0xc5,0x1e,0xd6,0xe3,0x65,0x67,0xe9,0xa0,0x83,0xee,0x78,0x20,0x07,0xdb,0xfb,0xcb,0xe3,0x36,0xf8,0x3f,0x99,0xb0,0xde,0xf5,0x14,0xa0,0x27,0xc1,0x3b,0x03,0x49,0xb5,0x0,0x9a,0x82,0x16,0x9c,0x0a,0x9a,0x13,0xd4,0xa8,0x3a,0xec,0x70,0x96,0xa1,0x5a,0xeb,0xc5,0xa9,0x20,0xdd,0x7b,0x42,0x8c,0x8e,0x53,0xd1,0xe0,0x35,0x67,0x31,0xcc,0xa2,0x9c,0xb0,0xf0,0x6f,0x85,0x33,0xec,0x74,0x17,0xe1,0x0b,0xb6,0x0e,0xe8,0x12,0x74,0xdf,0x44,0xd2,0x2c,0x80,0x1e,0x59,0x87,0xf7,0xbd,0xf9,0x09,0x2d,0x53,0xe6,0xec,0xbc,0xe0,0xd0,0xcc,0x4f,0x8c,0x8d,0x5b,0xd5,0x24,0xfc,0xec,0x87,0x57,0x95,0xf0,0x8e,0xbb,0x30,0x61,0x47,0x97,0x92,0x22,0x0,0x41,0x55,0xc0,0x3b,0xee,0x42,0xa8,0x74,0x40,0x8b,0x20,0x86,0xd0,0x15,0xd6,0xe3,0x63,0x5f,0x6e,0xe6,0x0a,0xc0,0x7b,0xbe,0x02,0xf8,0x28,0xd8,0x86,0x20,0x46,0xe4,0x90,0x3f,0x27,0xae,0xbe,0xb1,0xa4,0x09,0x40,0x63,0xd0,0x82,0x73,0x41,0x0a,0xb3,0x25,0x88,0xd1,0x61,0xd8,0xed,0x29,0x8c,0xfb,0x31,0xf8,0x84,0x0a,0x80,0x43,0xd6,0x60,0x9f,0x37,0x8f,0xda,0x96,0x20,0x22,0xc0,0xaf,0x8a,0xd8,0xed,0x2e,0x88,0xab,0x3f,0x20,0x61,0x02,0xa0,0x70,0x86,0x9d,0x9e,0x22,0x0a,0xb5,0x25,0x88,0x28,0x68,0x0f,0x1b,0xe2,0x1a,0xa5,0x9a,0x30,0x01,0x38,0xe8,0xb3,0x0d,0xee,0xc3,0x13,0x04,0x11,0x39,0xfb,0x7d,0x79,0x71,0x1b,0x3b,0x09,0x11,0x80,0xce,0xb0,0x01,0xc7,0x03,0x56,0x6a,0x49,0x82,0x18,0xa7,0xf5,0xbc,0xcb,0x5d,0x18,0x97,0x94,0xe7,0x42,0x22,0x1e,0xfe,0x7d,0x6f,0x1e,0xa5,0x64,0x24,0x88,0x09,0xd0,0xaf,0x68,0xe3,0x92,0x53,0x30,0xee,0x02,0x70,0xd8,0x6f,0x83,0x8b,0x4c,0x7f,0x82,0x98,0x30,0x1f,0xf9,0x6c,0x70,0xc7,0x78,0xfb,0x3c,0xae,0x02,0xd0,0xaf,0x68,0x71,0xc4,0x9f,0x43,0x2d,0x47,0x10,0xb1,0xb2,0xa6,0x3d,0xf9,0xe9,0x23,0x0,0x7b,0x3d,0xf9,0x74,0x55,0x13,0x41,0xc4,0x90,0x8e,0xb0,0x21,0xa6,0xf9,0x0c,0xe3,0x26,0x0,0x27,0x03,0x16,0x3a,0x67,0x4f,0x10,0x71,0x60,0x9f,0x37,0x2f,0x66,0x01,0x42,0x71,0x11,0x80,0xa0,0x2a,0xe0,0xa0,0x3f,0x97,0x5a,0x8a,0x20,0xe2,0x31,0xbe,0xb8,0x18,0xb3,0x04,0x22,0x71,0x11,0x0,0x9d,0xa0,0xc2,0x2a,0xd0,0x9d,0x6c,0x04,0x11,0x2f,0x0a,0xa5,0x60,0x6a,0x2f,0x01,0x2e,0x33,0xf7,0x26,0xf4,0x06,0x16,0x82,0xc8,0x16,0x4a,0x35,0x7e,0x4c,0xd6,0x79,0x52,0x5b,0x0,0x6c,0x62,0x08,0xb3,0xf4,0x4e,0x6a,0x2d,0x82,0x88,0x21,0x1a,0xa8,0x58,0x62,0xee,0x8d,0xd9,0xf7,0xc5,0x75,0x17,0x60,0x8e,0xd1,0x41,0xd7,0x33,0x13,0x44,0x8c,0xc7,0x94,0x49,0x90,0xd3,0x43,0x0,0x04,0x70,0x5c,0x6a,0xea,0xa3,0x8d,0x40,0x82,0x88,0x01,0xb9,0x62,0x08,0x33,0x62,0x7c,0xb1,0x68,0xdc,0x23,0x01,0x4b,0x35,0x7e,0x4c,0xd5,0xbb,0xa9,0xf5,0x08,0x62,0x02,0x88,0x8c,0xe3,0x72,0x4b,0x37,0x84,0x18,0x07,0xd5,0x27,0xe4,0x30,0xd0,0x25,0xc6,0x3e,0x58,0x68,0x57,0x80,0x20,0xc6,0xcd,0x5c,0x83,0x33,0x2e,0xcb,0xe9,0x84,0x08,0x80,0xc4,0x38,0x96,0x9a,0x7b,0x0,0x3a,0x12,0x44,0x10,0x51,0x53,0x20,0x05,0x51,0x67,0x70,0xc4,0x69,0x99,0x9e,0x20,0x8a,0x34,0x41,0xcc,0xa0,0xa5,0x0,0x41,0x44,0x6d,0xfa,0x2f,0x35,0xf7,0xc4,0xcd,0x8f,0x96,0xd0,0x94,0x60,0xf3,0x4c,0x0e,0x58,0x62,0xe8,0xc1,0x24,0x88,0x4c,0x67,0x8e,0x21,0xbe,0x3b,0x69,0x09,0x15,0x0,0x0d,0x54,0x5c,0x61,0xb1,0x53,0x80,0x10,0x41,0x44,0x40,0x89,0x26,0x80,0xd9,0x86,0xf8,0xc6,0xd2,0x24,0x3c,0x2b,0x70,0x9e,0x14,0xc2,0xbc,0x38,0xad,0x67,0x08,0x22,0x53,0xd0,0x09,0x2a,0x96,0x9b,0xbb,0xe3,0x5e,0x4e,0x52,0xee,0x05,0x98,0x65,0x70,0xa0,0x44,0x13,0xa0,0x56,0x26,0x88,0x11,0x58,0x62,0xec,0x81,0x41,0x50,0x32,0x53,0x0,0x0,0x60,0xb9,0xb9,0x1b,0xba,0xcf,0xdc,0xbe,0x4a,0x10,0xc4,0x0,0x53,0x74,0x6e,0x54,0xea,0x7c,0x09,0x29,0x2b,0x69,0x02,0x60,0x10,0x14,0x2c,0x32,0xf5,0x52,0x6b,0x13,0xc4,0x67,0xc8,0x11,0xc3,0x58,0x68,0xea,0x4b,0x58,0x79,0x49,0xbd,0x1e,0x7c,0x92,0xce,0x8b,0x99,0x06,0x17,0xb5,0x3a,0x41,0x0,0x90,0x98,0x8a,0x95,0x16,0x3b,0x34,0x8c,0x67,0x87,0x0,0x0,0xc0,0x02,0x63,0x3f,0x8a,0x34,0x41,0x6a,0x7d,0x82,0xd6,0xfd,0xe6,0x3e,0xe4,0x24,0xf8,0xf0,0x5c,0xd2,0x05,0x40,0x0,0x3f,0xef,0x0f,0x50,0xa8,0x07,0x10,0x59,0x4b,0xad,0xde,0x83,0x49,0x5a,0x4f,0x12,0xc6,0x5f,0x0a,0x60,0x12,0x64,0x2c,0xb5,0xf4,0x82,0x42,0x85,0x89,0x6c,0xc4,0x26,0x86,0xb0,0xc8,0x98,0x1c,0x7f,0x98,0x90,0x2a,0x95,0x50,0xa1,0xf1,0xa5,0xce,0xc3,0x10,0x44,0x02,0x29,0xd3,0x06,0x20,0x31,0x9e,0xdd,0x02,0x40,0x10,0x04,0x09,0x0,0x41,0x10,0x09,0x44,0xa2,0x2a,0x88,0x1e,0x93,0x4e,0x42,0x65,0x9e,0x11,0x15,0xb9,0x46,0x68,0xa5,0x4f,0x35,0x54,0x51,0x39,0x3a,0x9d,0x7e,0x9c,0xed,0xf3,0xa1,0xdf,0x1b,0xa2,0x8a,0x4a,0x10,0x16,0xbd,0x06,0x55,0xf9,0x46,0x94,0xd9,0x0c,0xd0,0x88,0x9f,0xb6,0x87,0xac,0xaa,0xe8,0x70,0x04,0xd0,0xd2,0xeb,0x85,0xcb,0x4f,0xf9,0x28,0x48,0x0,0x26,0xc0,0xd4,0x62,0x0b,0x56,0xce,0x28,0xc2,0x82,0xea,0x5c,0x4c,0x2e,0x34,0x8f,0x79,0x3c,0xb3,0xcb,0x15,0xc0,0xc1,0x96,0x7e,0xec,0x6a,0xec,0xc6,0xfe,0x33,0xfd,0x50,0x39,0x39,0x38,0x63,0x05,0x03,0x50,0x57,0x6e,0xc5,0x8a,0xe9,0x45,0x58,0x50,0x65,0x43,0x55,0xfe,0xd8,0x37,0xe5,0xb4,0xf5,0xfb,0x70,0xe0,0xac,0x03,0xef,0x9c,0xb0,0xe3,0xd0,0x39,0x07,0xb9,0x9b,0x49,0x0,0x22,0xa8,0x1c,0x81,0x61,0xe5,0x8c,0x62,0x7c,0xe5,0xd2,0x0a,0xd4,0x14,0x9a,0xa3,0xfa,0x6c,0x71,0x8e,0x1e,0xd7,0xcf,0x29,0xc5,0xf5,0x73,0x4a,0xd1,0xeb,0x09,0xe2,0xb9,0x83,0xed,0x78,0xfe,0x60,0x1b,0x3c,0x41,0x3a,0x0e,0x3d,0x5e,0xb4,0x92,0x80,0xeb,0x66,0x95,0xe0,0xcb,0x0b,0x2b,0x50,0x9e,0x6b,0x8c,0xea,0xb3,0xe5,0xb9,0x46,0x94,0xe7,0x1a,0x71,0xe3,0xbc,0x32,0x74,0x3a,0x03,0xf8,0xcb,0x87,0xad,0x78,0xe9,0x50,0x07,0x02,0x61,0x85,0x04,0x80,0x18,0xca,0xe2,0x9a,0x7c,0xfc,0xfd,0xd5,0x53,0x50,0x6a,0x35,0x4c,0xf8,0xbb,0xf2,0xcd,0x3a,0xdc,0x71,0xf9,0x64,0x7c,0x6d,0x51,0x25,0x9e,0x7c,0xf7,0x0c,0x9e,0x3b,0xd8,0x06,0x45,0xa5,0x39,0x28,0x1a,0x56,0xce,0x28,0xc2,0xdf,0xad,0x9c,0x82,0x3c,0x93,0x76,0xc2,0xdf,0x55,0x62,0xd5,0xe3,0x5b,0x57,0x4d,0xc1,0x37,0x2e,0xab,0xc2,0xa6,0x77,0x4e,0xe3,0xb5,0x23,0x9d,0x59,0x6b,0x11,0x90,0x0,0x5c,0x84,0x51,0x2b,0xe1,0xee,0x6b,0xa7,0xe2,0xaa,0x99,0xc5,0x71,0xf1,0x1d,0x7c,0xeb,0xaa,0x29,0xb8,0xba,0xae,0x18,0x8f,0xbc,0x70,0x14,0x6d,0xfd,0x7e,0xaa,0xf0,0x31,0xb0,0x19,0xb5,0xb8,0xef,0xf3,0xd3,0xb1,0x68,0x72,0x7e,0x9c,0xbe,0x7b,0x06,0xae,0xa9,0x2b,0xc6,0xbf,0xef,0x38,0x8e,0x5e,0x4f,0xf6,0x45,0xa4,0xd2,0x2e,0xc0,0x45,0x66,0xe2,0xe3,0x6b,0x16,0xc6,0x65,0xf0,0x7f,0x96,0x69,0xc5,0x16,0x3c,0xb6,0xfa,0x52,0x2c,0xa9,0xcd,0xa7,0x4a,0x1f,0xa3,0x9e,0x7e,0xb5,0xf6,0xd2,0xb8,0x0c,0xfe,0xcf,0x32,0xbf,0x2a,0x17,0xbf,0x5a,0x7b,0x29,0x66,0x95,0x5b,0x49,0x0,0xb2,0x95,0xda,0x22,0x33,0x7e,0xf6,0x8d,0xf9,0x28,0xb5,0x19,0x12,0x52,0x9e,0x41,0x2b,0xe2,0x07,0x5f,0x9a,0x8d,0x6b,0xea,0x8a,0xa9,0xf2,0x87,0x61,0x4e,0x85,0x0d,0x8f,0xac,0x9a,0x1f,0x13,0x93,0x3f,0x12,0xac,0x06,0x0d,0x7e,0x72,0xcb,0x5c,0x2c,0x9a,0x9c,0x47,0x02,0x90,0x8d,0x83,0xff,0xff,0xae,0x9a,0x0f,0x9b,0x51,0x9b,0xd0,0x72,0x45,0x81,0xe1,0x7b,0x37,0xcc,0xc4,0xf5,0xb3,0x4b,0xa9,0x11,0x2e,0x1a,0xfc,0x3f,0xbe,0x65,0x2e,0x0c,0x5a,0x31,0xa1,0xe5,0xea,0x34,0x22,0x1e,0xbc,0x79,0x4e,0xdc,0x2d,0x0e,0x12,0x80,0x14,0x22,0xc7,0xa0,0xc1,0x83,0x37,0xcd,0x86,0x49,0x37,0x71,0x77,0x88,0xc7,0xe3,0x81,0xa2,0x44,0xe7,0x55,0x66,0x0,0xee,0xbe,0x76,0x2a,0x66,0x94,0xe6,0xd0,0xc8,0x07,0x50,0x94,0xa3,0xc7,0x0f,0x6f,0x9a,0x75,0x41,0x7c,0x45,0x24,0x70,0xce,0xe1,0x76,0xbb,0xc1,0x27,0xb8,0xdd,0x2a,0x09,0x0c,0x0f,0xdc,0x58,0x87,0x8a,0x3c,0x63,0x56,0xd4,0x77,0x56,0x3b,0x01,0x19,0x80,0xef,0x5e,0x3f,0x1d,0x45,0x39,0xfa,0xa8,0x3f,0xeb,0x74,0x3a,0xf1,0xde,0x7b,0x7b,0xb1,0xe7,0xdd,0x3d,0x68,0x6e,0x6e,0x86,0xdd,0x6e,0x47,0x30,0x18,0x84,0x28,0x8a,0xc8,0xcf,0xcf,0x43,0x79,0x79,0x05,0x16,0x2d,0x5e,0x84,0xa5,0x4b,0x97,0xa2,0xba,0xba,0x6a,0xf4,0x46,0x10,0x05,0xdc,0x7f,0x63,0x1d,0xbe,0xbd,0x75,0x5f,0x56,0x6f,0x13,0x8a,0x02,0xc3,0xbf,0xfc,0xcd,0x4c,0x58,0xf4,0x9a,0x31,0xdf,0x6b,0xb7,0xdb,0xb1,0x67,0xcf,0x1e,0xec,0xd9,0xf3,0x1e,0xce,0x9d,0x3d,0x87,0xee,0xee,0x6e,0xc8,0xb2,0x0c,0x49,0x92,0x50,0x54,0x54,0x84,0xca,0xca,0x4a,0x2c,0x5d,0xba,0x04,0x4b,0x96,0x2e,0x45,0x51,0x51,0x61,0xd4,0xcb,0xb3,0xfb,0xff,0xa6,0x0e,0xf7,0xfe,0xfe,0x43,0x84,0x15,0x95,0x04,0x20,0x53,0xf9,0xdc,0xec,0x12,0x2c,0xa9,0x2d,0x88,0xea,0x33,0x76,0xbb,0x1d,0x5b,0x36,0x6f,0xc5,0xcb,0x2f,0xbf,0x0c,0x55,0x1d,0xda,0x39,0x14,0x45,0x81,0xdd,0xde,0x0d,0xbb,0xbd,0x1b,0x07,0x0e,0x1c,0xc0,0xaf,0x37,0xfe,0x1a,0x75,0xb3,0xea,0x70,0xd7,0x5d,0x77,0x62,0xde,0xbc,0x79,0x23,0x7e,0x6f,0x71,0x8e,0x1e,0x77,0xad,0xac,0xc5,0x2f,0x5e,0x3e,0x91,0xb5,0xed,0xf1,0xd5,0x45,0x95,0xa8,0x2b,0x1b,0xdd,0x11,0x77,0xfa,0x74,0x33,0x36,0x6d,0xda,0x84,0x3d,0xef,0xee,0x19,0xf6,0xdf,0x65,0x59,0x46,0x7b,0x7b,0x3b,0xda,0xdb,0xdb,0xb1,0x77,0xef,0x5e,0xe0,0x97,0xff,0x81,0xe5,0xcb,0x97,0x63,0xdd,0xfa,0x7a,0x4c,0x9e,0x3c,0x39,0xaa,0x65,0xe1,0x6d,0x4b,0xab,0xb1,0x65,0x57,0x33,0x2d,0x01,0x32,0x11,0xa3,0x56,0x42,0xfd,0x15,0x35,0x51,0x99,0x98,0xcf,0x3c,0xf3,0x07,0xac,0x59,0xbd,0x16,0x3b,0x76,0xec,0x18,0x76,0xf0,0x8f,0xc4,0xd1,0x23,0x47,0xf1,0x9d,0x7b,0xbf,0x8b,0x1f,0xfe,0xe0,0x87,0xf0,0x7a,0xbd,0x23,0xbe,0xef,0xba,0x59,0x25,0x98,0x56,0x62,0xc9,0xca,0xf6,0xc8,0x37,0xeb,0xf0,0x8d,0xcb,0xaa,0x47,0xfc,0x77,0x59,0x96,0xf1,0x1f,0xbf,0x7c,0x14,0x77,0xdd,0x79,0xd7,0x88,0x83,0x7f,0x24,0x76,0xef,0xde,0x8d,0x3b,0xd7,0xdf,0x85,0xff,0xfc,0xcf,0xc7,0x20,0xcb,0x91,0x5b,0x58,0xb7,0x2c,0xac,0x8c,0x49,0x1c,0x08,0x09,0x40,0x0a,0x72,0xd3,0x25,0xe5,0xc8,0x8d,0xd0,0xe9,0x17,0x08,0x04,0xf0,0xd0,0x86,0x87,0xf1,0x9b,0x5f,0xff,0x06,0xe1,0xf0,0xf8,0x63,0xca,0x77,0xed,0xda,0x8d,0x6f,0xfe,0xdd,0xb7,0xd0,0xd2,0xd2,0x32,0xfc,0x92,0x84,0x31,0xdc,0xbe,0x7c,0x72,0x56,0xb6,0xc7,0xd7,0x17,0x57,0xc1,0xa0,0x19,0xde,0xe9,0xd7,0xd7,0xd7,0x87,0x7b,0xff,0xf1,0x3b,0xd8,0xbe,0x7d,0xfb,0xb8,0xd7,0xf8,0x9c,0x73,0x3c,0xfb,0xe7,0x67,0x71,0xef,0xbd,0xdf,0x41,0x5f,0x5f,0x64,0x39,0xf7,0xb4,0x92,0x80,0xdb,0x96,0x56,0x93,0x0,0x64,0xdc,0xba,0x47,0x14,0xf0,0xa5,0xf9,0xe5,0x11,0x77,0x9c,0x9f,0xfc,0xf8,0x27,0x78,0xe7,0x9d,0x77,0x62,0x52,0x76,0x7b,0x7b,0x3b,0xbe,0x77,0xdf,0xff,0x46,0x6f,0xef,0xf0,0x09,0x20,0x2e,0x99,0x94,0x87,0x49,0x05,0xa6,0x84,0xd4,0x03,0x63,0xc0,0xd5,0x33,0x8b,0xf1,0xe3,0x5b,0xe6,0xe2,0x7f,0xbe,0xbd,0x1c,0x2f,0xdd,0xb7,0x12,0xcf,0xde,0x7d,0x05,0xfe,0xfd,0xeb,0xf3,0xf1,0xc5,0xf9,0xe5,0x17,0x1c,0xac,0x89,0x27,0x66,0xbd,0x84,0xeb,0x66,0x97,0x0c,0xfb,0x6f,0xc1,0x60,0x10,0xf7,0xff,0xcb,0xfd,0x38,0x7a,0xf4,0x68,0x4c,0xca,0x3a,0x7a,0xe4,0x28,0x1e,0xb8,0xff,0xfb,0x08,0x06,0x23,0x0b,0xfa,0xb9,0x6a,0x46,0x11,0xf2,0xcd,0x3a,0x12,0x80,0x4c,0x62,0x49,0x4d,0x3e,0x72,0x23,0xdc,0x5f,0xfe,0xed,0x6f,0x37,0x61,0xd7,0xae,0xdd,0x31,0x2d,0xbf,0xb7,0xb7,0x17,0x0f,0xdc,0xff,0xc0,0xb0,0x9d,0x90,0x01,0xb8,0x61,0x4e,0xfc,0xb7,0x05,0x0b,0x2c,0x3a,0xfc,0xec,0x1b,0x0b,0xf0,0x4f,0x5f,0x98,0x89,0x85,0x93,0xf2,0x06,0x1d,0x6f,0x06,0xad,0x88,0x39,0x15,0x36,0x7c,0xfb,0x9a,0xa9,0xf8,0xd5,0xda,0x4b,0x31,0x39,0xca,0x33,0x10,0xe3,0xe1,0xaa,0x19,0xc5,0xd0,0x0f,0x33,0xfb,0x73,0x95,0xe3,0x47,0xff,0xfa,0x63,0x34,0x36,0x36,0xc5,0xb4,0xbc,0x93,0x27,0x4f,0xe2,0x27,0x3f,0xfe,0x69,0x44,0xd6,0x84,0x24,0x0a,0xb8,0x76,0x56,0x31,0x09,0x40,0x26,0x71,0xe5,0x8c,0xa2,0x88,0x67,0x8b,0x3f,0x3c,0xf3,0x87,0xb8,0x3c,0x43,0x63,0x63,0x13,0x9e,0x7e,0xfa,0xf7,0xc3,0xfe,0xdb,0x15,0xd3,0x8b,0x10,0xcf,0xdb,0xd3,0xcc,0x3a,0x09,0x3f,0xfd,0xea,0xbc,0x31,0x1d,0x6e,0x95,0x79,0x46,0xfc,0xdb,0xd7,0xe6,0xa1,0xc4,0xaa,0x8f,0x6f,0x7b,0x4c,0x1f,0xbe,0x3d,0x5e,0x79,0xf5,0x55,0xec,0xde,0xbd,0x3b,0x2e,0x65,0xee,0xdc,0xb9,0x13,0x6f,0xbc,0xf1,0x46,0x44,0xef,0x5d,0x31,0xad,0x88,0x04,0x20,0x53,0x60,0x0c,0x98,0x5f,0x65,0x8b,0xc8,0xf4,0x7f,0xec,0xb1,0xc7,0x27,0xbc,0xaf,0x3c,0x1a,0xdb,0xfe,0x7b,0x1b,0xec,0x76,0xfb,0x90,0xd7,0xf3,0x4c,0x5a,0x54,0xc7,0x71,0x19,0xb0,0x7a,0xd9,0x24,0x54,0x46,0xb8,0xcf,0x6d,0x35,0x68,0xf0,0xed,0x6b,0xa6,0xc6,0xed,0x59,0x0c,0x5a,0x11,0x33,0xcb,0x72,0x86,0xf5,0xbb,0xfc,0xf6,0x37,0xbf,0x8d,0x6b,0x5f,0xd8,0xf8,0xc4,0xaf,0x23,0x5a,0x0a,0xd4,0x14,0x99,0x23,0xf6,0x17,0x91,0x0,0xa4,0x38,0x55,0x79,0xa6,0x88,0xf6,0x99,0x3f,0xf8,0x60,0x1f,0x8e,0x1f,0x3f,0x1e,0xd7,0x67,0x09,0x85,0x42,0x23,0x5a,0x18,0xb3,0xe3,0x14,0x97,0xae,0x95,0x84,0xa8,0x23,0x0f,0x2f,0x9d,0x9c,0x1f,0x37,0x6f,0xf8,0xf4,0x92,0x1c,0x88,0xc3,0xdc,0x16,0xfb,0xc2,0x0b,0x2f,0x8e,0xe8,0x27,0x89,0x15,0x3d,0x3d,0x3d,0xd8,0xb1,0xe3,0xa5,0xb1,0x27,0x0d,0x60,0x58,0x91,0x22,0x01,0x48,0x43,0x26,0x15,0x46,0x36,0xb3,0xbe,0xf6,0xea,0xab,0x09,0x79,0x9e,0xd7,0x5f,0x7f,0x63,0xd8,0xe8,0xc1,0x78,0x39,0x02,0x2b,0xf3,0x8c,0x51,0x87,0xd8,0x32,0x0,0xd3,0x4a,0xe3,0xb3,0x3d,0x39,0x79,0x84,0xf6,0x78,0xf5,0x95,0xc4,0xd4,0x7f,0xa4,0xe5,0x24,0xca,0x31,0x4b,0x02,0x10,0x67,0xca,0x22,0x38,0xec,0x23,0xcb,0x32,0xf6,0xec,0x79,0x2f,0x21,0xcf,0xe3,0x76,0xbb,0xf1,0xf1,0xc7,0x1f,0x0f,0x7d,0xce,0xdc,0xf8,0x84,0xa2,0x9a,0xc7,0x19,0xf2,0x1c,0x89,0xd5,0x14,0xab,0xf6,0xb0,0xdb,0xed,0x68,0x6c,0x6c,0x4c,0x48,0xfd,0x1f,0x3f,0x7e,0x1c,0xdd,0xdd,0x63,0xdf,0xc2,0x5b,0x96,0x6b,0x20,0x01,0xc8,0x04,0x22,0x19,0x0,0x67,0xce,0x9c,0x19,0x35,0x60,0x27,0xd6,0x1c,0x3e,0x74,0x78,0x98,0x01,0x17,0x9f,0x20,0x4d,0xc6,0xc6,0xe7,0x5e,0x8c,0x97,0x53,0x72,0xb8,0x33,0x18,0x87,0x0f,0x1f,0x89,0xab,0xef,0xe5,0xb3,0x70,0xce,0x71,0xf4,0xe8,0xb1,0xa4,0x09,0x20,0x09,0x40,0x82,0x89,0xc4,0xfc,0xed,0xe9,0xe9,0x49,0xe8,0x33,0x0d,0x57,0xde,0x48,0x41,0x31,0x19,0xd7,0x1e,0xc3,0xfc,0xce,0x78,0xaf,0xfd,0x87,0xd4,0x7f,0x04,0x16,0x40,0xa6,0xb6,0x47,0xd6,0x09,0x40,0x58,0x19,0x7b,0x66,0xe9,0xed,0xed,0x4b,0x6c,0x07,0x1c,0xa6,0xc3,0xcb,0x59,0x92,0x32,0x6c,0xb8,0xdf,0x99,0x68,0x01,0x88,0xa4,0xbc,0x4c,0x3d,0x14,0x94,0x75,0x02,0x10,0x51,0x12,0xc8,0x44,0x67,0xf0,0x1d,0xa6,0x3c,0x5f,0x48,0xce,0xde,0xf6,0x48,0x70,0xfd,0x47,0x52,0x9a,0x3f,0x43,0x93,0x87,0x66,0x9d,0x0,0xf4,0xb8,0xc7,0xde,0xf7,0x2d,0x28,0x2c,0x48,0xe8,0x33,0x15,0x14,0x0e,0x3d,0xae,0xda,0xed,0xce,0x8e,0xfc,0x74,0xc3,0xfd,0xce,0xfc,0x82,0x04,0xd7,0x7f,0x04,0xe5,0x75,0xbb,0x82,0x24,0x0,0x99,0xc0,0xb9,0x3e,0xdf,0x98,0xef,0xc9,0xcf,0x4f,0x6c,0x46,0x98,0x82,0x61,0xca,0x8b,0xe4,0x39,0x33,0xb5,0x3d,0x12,0x5e,0xff,0x11,0x08,0x40,0x6b,0xbf,0x8f,0x04,0x20,0x13,0x38,0x65,0xf7,0x8c,0xe9,0x61,0xae,0xa9,0xa9,0x81,0xd5,0x9a,0xb8,0x04,0x91,0xf3,0xe6,0x0f,0xcd,0x13,0xd0,0xd4,0xe5,0xc9,0x8a,0xf6,0x68,0xea,0x72,0x0f,0xad,0x8f,0x79,0x73,0xc7,0xbd,0x5b,0x11,0x2d,0x8c,0x31,0xcc,0x9b,0x37,0x77,0xcc,0xf7,0x35,0x0e,0xf3,0x9c,0x24,0x0,0x69,0x88,0x3b,0x10,0xc6,0x29,0xfb,0xe8,0x83,0x4b,0x10,0x04,0x2c,0xbe,0x6c,0x71,0x42,0x9e,0xc7,0x6a,0xb5,0x62,0xf6,0xec,0xd9,0x17,0xbc,0xa6,0x72,0x8e,0x43,0xad,0x8e,0xac,0xb1,0x0,0x2e,0x4e,0xc7,0x9d,0x9f,0x9f,0x8f,0x69,0xd3,0xa7,0x25,0xa4,0xfc,0x99,0x75,0x33,0x61,0xb3,0x8d,0x1e,0x1a,0xee,0x09,0xc8,0x19,0x2b,0xc8,0x59,0x79,0x18,0xe8,0x83,0xe6,0xb1,0xbd,0xfc,0x2b,0x56,0x5c,0x91,0x90,0x67,0xb9,0xfc,0xf2,0xe5,0x10,0x84,0x0b,0x9b,0xe1,0x48,0x9b,0x13,0xde,0x2c,0x4a,0x0d,0x36,0x5c,0x7b,0xac,0x58,0xb1,0x22,0x21,0x65,0x47,0x52,0xce,0xbe,0x33,0x7d,0x19,0x7b,0xb5,0x5b,0x56,0x0a,0xc0,0x4b,0x87,0x3a,0xc6,0xf4,0xfc,0x2e,0x5f,0xbe,0x7c,0xc8,0xcc,0x1c,0x6b,0x74,0x3a,0x1d,0x6e,0xbf,0xe3,0xf6,0x21,0xaf,0xbf,0x72,0xb8,0x33,0xab,0xda,0xe3,0xe5,0xc3,0x1d,0x43,0x5e,0xfb,0xca,0x57,0xbe,0x1c,0x75,0x2e,0xbf,0x68,0x29,0x2a,0x2a,0xc2,0xcd,0x37,0xdf,0x34,0xe6,0xfb,0x5e,0x3d,0x92,0xb9,0xed,0x91,0x95,0x02,0xd0,0xe5,0x0a,0xe0,0xc3,0x33,0x63,0x5b,0x01,0xeb,0xd6,0xd5,0xc7,0xf5,0x39,0x6e,0xba,0xe9,0x4b,0x43,0x1c,0x50,0x2e,0x7f,0x18,0x3b,0x4f,0x76,0x67,0x55,0x7b,0x1c,0x6f,0x77,0x0d,0x59,0x96,0xe9,0x74,0x3a,0xdc,0x76,0xdb,0x6d,0x71,0x2d,0x77,0xed,0xed,0x6b,0xa1,0xd5,0x8e,0x7e,0xca,0xaf,0xad,0xdf,0x8f,0x03,0x2d,0xfd,0x24,0x0,0x99,0xc6,0x1f,0xf6,0x9e,0x1d,0xf3,0x3d,0xf3,0x17,0xcc,0xc7,0x9a,0xb5,0x6b,0xe2,0x52,0x7e,0xdd,0xac,0x3a,0xac,0x5b,0xbf,0x6e,0xc8,0xeb,0xcf,0xee,0x6f,0xcd,0xba,0x0b,0x2b,0x39,0x80,0x6d,0xef,0x0f,0x6d,0x8f,0x2f,0x7e,0xe9,0x8b,0xb8,0xfa,0x9a,0xab,0xe3,0x52,0xe6,0xb5,0xd7,0x5e,0x83,0x1b,0x6e,0xf8,0xfc,0x98,0xef,0xdb,0xf6,0xfe,0xd9,0x8c,0xbe,0xd9,0x39,0x6b,0x05,0xe0,0x50,0xab,0x23,0xa2,0x99,0xf6,0x8e,0xdb,0x6f,0xc7,0xb2,0x65,0xcb,0x62,0x5a,0x76,0x7e,0x7e,0x3e,0x36,0x6c,0x78,0x70,0xc8,0xec,0xd3,0xe1,0xf4,0xe3,0x4f,0xfb,0xcf,0x65,0x65,0x7b,0xbc,0x73,0xc2,0x8e,0x8f,0xce,0x5d,0xe8,0xf8,0x64,0x8c,0xe1,0xbe,0xfb,0xbe,0x8b,0xda,0xda,0xda,0x98,0x96,0x35,0x75,0xea,0x54,0xdc,0xf7,0xbd,0xfb,0xc6,0xdc,0x69,0x38,0xde,0xe1,0xc2,0x2b,0x47,0x3a,0x32,0xba,0xde,0xb3,0xfa,0x62,0x90,0xdf,0xbc,0x7d,0x6a,0xcc,0x88,0x3b,0x26,0x30,0x3c,0xf4,0xf0,0x86,0x88,0xd6,0x8a,0x91,0x30,0x6d,0xda,0x34,0xfc,0xd7,0x13,0xbf,0x1a,0x76,0xef,0x79,0xe3,0x9b,0x4d,0x08,0xc9,0x6a,0x56,0xb6,0x05,0x07,0xf0,0xc4,0x9b,0x4d,0x90,0x2f,0x0a,0xb9,0x35,0x18,0x0c,0xf8,0x8f,0x47,0x7f,0x89,0xa5,0x4b,0x97,0xc4,0xa4,0x9c,0xa5,0xcb,0x96,0xe2,0x17,0xbf,0xfc,0x39,0x74,0xba,0xd1,0xf3,0xfc,0xa9,0x9c,0xe3,0x89,0x37,0x9b,0xc0,0x33,0x3c,0x22,0x3b,0xab,0x05,0xc0,0xee,0x0a,0xe0,0xe7,0x2f,0x8d,0x9d,0x87,0x5f,0x14,0x45,0xdc,0x7d,0xcf,0xdd,0xb8,0xeb,0xae,0x3b,0x21,0x49,0xe3,0x3f,0xa5,0xb7,0x7c,0xf9,0x72,0xfc,0xec,0xe7,0xff,0x6f,0xd8,0xc1,0xbf,0xfd,0xc3,0x56,0xbc,0x77,0xaa,0x37,0x9b,0x9b,0x03,0xcd,0xdd,0x1e,0xfc,0xfa,0xed,0x53,0x43,0x5e,0x37,0x1a,0x8d,0x78,0xe8,0xe1,0x87,0x70,0xd3,0x4d,0x37,0x8d,0xff,0x34,0x23,0x63,0xb8,0xf9,0xcb,0x37,0xe3,0xa1,0x87,0x36,0xc0,0x68,0x1c,0xfb,0xa8,0xf5,0x96,0x5d,0xcd,0x38,0xde,0xe1,0xca,0xf8,0x3a,0xcf,0xfa,0xab,0xc1,0x76,0x35,0x76,0x63,0xfb,0x87,0xad,0x11,0x75,0xa0,0x5b,0x6f,0xbb,0x15,0xbf,0x7f,0xe6,0x69,0xdc,0x78,0xe3,0x8d,0x43,0xb6,0xee,0x46,0x63,0xd6,0xac,0x59,0x78,0xec,0xf1,0xff,0xc4,0xbf,0xfe,0xe8,0x61,0x98,0x4c,0x43,0x13,0x4b,0x1c,0x6b,0x77,0x61,0xd3,0xce,0xd3,0x20,0x80,0xe7,0x0e,0xb4,0xe1,0xed,0x13,0x43,0xd3,0xa4,0x49,0x92,0x84,0x7f,0xbc,0xf7,0x1e,0x34,0x6c,0xfe,0x1d,0xae,0x5c,0x79,0x65,0x54,0xdf,0x79,0xe5,0xca,0x2b,0xb1,0x79,0x4b,0x03,0xee,0xb9,0xe7,0xee,0x88,0x04,0x7c,0xef,0xe9,0x5e,0xfc,0xcf,0x07,0xd9,0xb1,0x14,0x93,0xa8,0xcb,0x01,0x4f,0xbc,0xd5,0x04,0x93,0x5e,0xc2,0xb5,0x75,0x25,0x63,0xbe,0xb7,0xa0,0xa0,0x0,0xdf,0xbd,0xef,0x3b,0xb8,0xf5,0xb6,0x6f,0xe0,0xdd,0xdd,0xef,0xe2,0xdd,0x77,0xf7,0xe0,0xec,0xd9,0xb3,0x70,0x38,0x1c,0x83,0x99,0x7d,0x72,0x72,0x72,0x50,0x5c,0x5c,0x84,0x4b,0x17,0x2d,0xc2,0xb2,0x65,0x4b,0x51,0x37,0xb3,0x0e,0x4c,0x18,0x7e,0xe6,0x3a,0xdd,0xed,0xc1,0x0f,0x9e,0xfd,0x38,0x6b,0x4d,0xff,0xe1,0x96,0x02,0xff,0xbe,0xe3,0x38,0x8c,0x5a,0x71,0xd8,0x4b,0x3a,0xab,0xaa,0xaa,0xf0,0xe0,0x83,0x3f,0xc4,0xa9,0xd5,0xa7,0xb0,0x67,0xcf,0x7b,0x78,0x6f,0xcf,0x7b,0xe8,0xe8,0xe8,0x80,0xc3,0xe1,0x0,0xe7,0x1c,0x8c,0x31,0xd8,0x6c,0x36,0x94,0x96,0x95,0x62,0xe9,0xd2,0xa5,0x58,0xba,0x74,0x09,0x6a,0x6a,0x22,0xbf,0x0,0xe6,0xe3,0x73,0x0e,0xfc,0xf8,0xb9,0x23,0x19,0xed,0xf8,0x23,0x01,0xb8,0xb8,0xd3,0x71,0xe0,0x67,0x3b,0x8e,0xc3,0xe9,0x0b,0xe3,0x96,0x4b,0x2b,0x23,0xfa,0x4c,0x69,0x69,0x29,0x6e,0xf9,0xea,0x2d,0xb8,0xe5,0xab,0xb7,0x9c,0xff,0x0e,0x0e,0x8f,0xc7,0x03,0x83,0xc1,0x10,0xf1,0x32,0xe1,0x40,0x4b,0x3f,0x1e,0xde,0x7e,0x38,0x63,0x4f,0x9a,0x8d,0x17,0x59,0x51,0xf1,0xe0,0xb3,0x87,0x71,0xef,0x75,0xd3,0x47,0xbc,0x2f,0xa0,0xb6,0xb6,0x16,0xb5,0xb5,0xb5,0x58,0xbd,0xfa,0x6f,0x01,0x0c,0x5c,0xc9,0xe6,0xf3,0xf9,0x60,0x32,0x99,0xa2,0xb2,0xce,0x3e,0xcb,0xce,0x93,0xdd,0x78,0xe4,0xc5,0x63,0x43,0xfc,0x10,0x24,0x0,0x59,0x32,0xf3,0xfc,0xf6,0xed,0x53,0xe8,0xf3,0x86,0x50,0x7f,0xf9,0x64,0x48,0x51,0x5e,0x8a,0xc1,0x18,0x83,0xc5,0x12,0x79,0xde,0xbc,0x57,0x8f,0x74,0xe2,0xf1,0xd7,0x1b,0x13,0xbe,0xe5,0x37,0x91,0x9b,0x75,0x12,0x89,0xca,0x39,0x7e,0xf9,0xca,0x09,0xf4,0x79,0x83,0xf8,0xfa,0xe2,0xaa,0x31,0xd7,0xfe,0xa2,0x28,0x46,0x55,0xff,0x17,0xb7,0xfd,0xb3,0xfb,0x5b,0xf1,0xbb,0x77,0x4e,0x65,0x4d,0x1e,0x06,0x12,0x80,0x11,0x3a,0xc2,0x9f,0xf6,0x9d,0xc3,0xa1,0x73,0x0e,0xfc,0xe3,0x75,0xd3,0x51,0x5b,0x14,0xfb,0x4b,0x31,0xfa,0xbd,0x21,0x3c,0xf1,0x56,0x13,0xde,0x3e,0x6e,0x4f,0xca,0x6f,0x74,0xfa,0xc7,0x77,0xb5,0x99,0xc3,0x17,0x4e,0xf8,0xb3,0xaa,0x9c,0x63,0xf3,0xae,0x66,0x1c,0x68,0xe9,0xc7,0x3d,0x9f,0x9b,0x8e,0xf2,0x38,0xe4,0xe5,0xeb,0x72,0x05,0xf0,0xd8,0x6b,0x27,0x23,0x0a,0x0f,0x27,0x01,0xc8,0x12,0x4e,0x76,0xb9,0x71,0xcf,0xd3,0xfb,0xf1,0x85,0xb9,0x65,0xf8,0xda,0xa2,0xca,0x71,0x5d,0x1f,0x7e,0x31,0xfe,0x90,0x82,0x17,0x3e,0x6a,0xc7,0x1f,0xf6,0xb6,0x24,0xf5,0x0a,0xf0,0xb3,0xbd,0x3e,0x38,0xfd,0x61,0x58,0x0d,0x9a,0xa8,0x06,0xe2,0x91,0x36,0x67,0xd2,0x9e,0xf9,0xa3,0x73,0x0e,0x7c,0x6b,0xcb,0x07,0xf8,0xf2,0xc2,0x0a,0x7c,0x65,0x61,0x05,0x6c,0x31,0xc8,0xd1,0xef,0xf2,0x87,0xb1,0xfd,0x40,0x1b,0xfe,0xb8,0xef,0x1c,0x82,0x59,0xbc,0x04,0x23,0x01,0x18,0x01,0x45,0xe5,0x78,0xee,0x60,0x1b,0x76,0x7c,0xdc,0x8e,0xcb,0xa7,0x15,0xe2,0xfa,0xd9,0xa5,0x98,0x5f,0x65,0x8b,0x7a,0x1b,0xaa,0xb9,0xdb,0x83,0x57,0x8f,0x74,0xe2,0x95,0xc3,0x9d,0x49,0x1d,0xf8,0x9f,0x1d,0xcc,0x2f,0x7e,0xd4,0x8e,0x5b,0x97,0x44,0x7e,0xe9,0xe5,0xce,0x93,0xdd,0xe8,0xf7,0x85,0x92,0xfa,0xdc,0x61,0x45,0xc5,0xb6,0xf7,0xcf,0xe2,0x2f,0x1f,0xb6,0xe2,0xaa,0x99,0xc5,0xb8,0x6e,0x56,0x09,0xea,0xca,0xad,0x51,0x27,0x2b,0x3d,0xde,0xe1,0xc2,0xab,0x47,0x3a,0xf1,0xfa,0xd1,0xae,0xac,0x8b,0xb8,0x24,0x01,0x18,0x07,0xb2,0xca,0xf1,0xd6,0x71,0x3b,0xde,0x3a,0x6e,0x47,0xae,0x51,0x8b,0x79,0x55,0x36,0xcc,0xae,0xb0,0xa1,0x2a,0xcf,0x88,0x8a,0x3c,0x23,0xcc,0x3a,0x09,0x5a,0x49,0x80,0xac,0x72,0x78,0x83,0x32,0x3a,0x9d,0x7e,0x9c,0xed,0xf5,0xe1,0x78,0x87,0x0b,0x07,0xcf,0xf6,0xa3,0xad,0xdf,0x9f,0x72,0xbf,0xe9,0x99,0xbd,0x2d,0x98,0x5b,0x69,0xc3,0xac,0x08,0x2e,0x1f,0x69,0x77,0xf8,0xf1,0xab,0xd7,0x1b,0x53,0xe6,0xd9,0x43,0xb2,0x8a,0x97,0x0f,0x75,0xe0,0xe5,0x43,0x1d,0x28,0xb0,0xe8,0x30,0xbf,0x32,0x17,0xb3,0xca,0xad,0xa8,0xca,0x37,0xa2,0x2c,0xd7,0x0,0x93,0x76,0xa0,0x3d,0xc2,0x8a,0x0a,0x6f,0x50,0x46,0x87,0x23,0x80,0xb3,0xbd,0x5e,0x1c,0x6d,0x77,0xe1,0xc0,0xd9,0x7e,0xd8,0x5d,0x01,0xea,0xd4,0x24,0x0,0xe3,0x5c,0xbf,0xfb,0x42,0x83,0x62,0x90,0xce,0x84,0x64,0x15,0x3f,0x7c,0xf6,0x10,0xfe,0xf7,0x0d,0x33,0xb0,0xa4,0xb6,0x60,0xd4,0xd9,0xf2,0x47,0xcf,0x1d,0x19,0xb7,0xdf,0x20,0xde,0xf4,0xb8,0x83,0x78,0xed,0x68,0x27,0x5e,0x3b,0xda,0x49,0x9d,0x93,0x04,0x80,0x88,0x06,0x6f,0x50,0xc6,0x86,0xbf,0x1c,0xc6,0x9c,0x0a,0x1b,0xae,0x9d,0x55,0x8c,0xb9,0x15,0x36,0x58,0xf4,0x1a,0xf8,0x42,0x32,0x8e,0x77,0xb8,0xf0,0xc6,0x31,0x3b,0xf6,0x9e,0xee,0x01,0xe7,0x54,0x57,0x24,0x0,0x44,0xc6,0x72,0xa8,0xd5,0x91,0x35,0xd9,0x87,0x88,0xa1,0x08,0x54,0x05,0x04,0x41,0x02,0x90,0x12,0x24,0x2a,0x11,0x24,0x41,0x10,0x29,0x26,0x0,0x4c,0x10,0x20,0x8a,0x64,0x90,0x10,0xd9,0x87,0x28,0x26,0xef,0xda,0xb1,0x94,0xf1,0x01,0x4c,0x9b,0x36,0x0d,0x4f,0xcd,0x5b,0x88,0x3d,0x4d,0x3d,0x78,0xe7,0x64,0x37,0x3e,0x3a,0xdb,0x9f,0x75,0x61,0x99,0x44,0xf6,0x61,0xd0,0x8a,0x98,0x39,0xa9,0x04,0xe8,0xe8,0xce,0x5e,0x01,0xd0,0xe9,0x74,0x98,0x77,0xc9,0x25,0xd0,0x6a,0x35,0xb8,0x7e,0x4e,0x29,0xae,0x9f,0x53,0x8a,0x60,0x58,0xc1,0x81,0xb3,0x0e,0xec,0x3c,0x69,0xc7,0xee,0xc6,0x1e,0x0a,0xda,0x20,0x32,0x06,0x9b,0x51,0x8b,0x2b,0x67,0x14,0x61,0xc5,0xb4,0x42,0xcc,0x2c,0xcb,0x01,0x38,0xc7,0x73,0xcf,0x9e,0x81,0xdb,0xed,0xce,0x4c,0x01,0x50,0xc1,0x20,0x8c,0x92,0x87,0x77,0xee,0xfc,0xf9,0x43,0xd2,0x63,0xe9,0x34,0x22,0x96,0xd4,0xe6,0x63,0x49,0x6d,0x3e,0xbe,0x75,0x55,0x18,0x2f,0x1f,0xea,0xc4,0xe6,0xdd,0xcd,0x59,0x75,0x52,0x8b,0xc8,0xbc,0x81,0x7f,0xd7,0x95,0xb5,0xb8,0x62,0x5a,0x21,0xb4,0xd2,0x67,0x96,0xbb,0x8c,0x61,0xee,0x82,0x05,0xd8,0xfd,0xce,0x3b,0x99,0xe9,0x03,0x68,0x09,0x1a,0xf1,0x57,0x47,0x39,0x0e,0xfa,0x6c,0x70,0x28,0x17,0x0e,0x74,0x5b,0x6e,0x2e,0xa6,0xcd,0x98,0x31,0xea,0xe7,0x2d,0x7a,0x0d,0xbe,0xba,0xa8,0x12,0x77,0xad,0xa8,0xa1,0x5e,0x44,0xa4,0x2d,0xff,0xe7,0x8b,0xb3,0x70,0x4d,0x5d,0xf1,0x85,0x83,0xff,0x3c,0x93,0x6b,0x6a,0x90,0x37,0xca,0x95,0x68,0xbd,0x8a,0x0e,0x3c,0x5d,0x05,0xc0,0xa1,0x68,0xe1,0x52,0x34,0x38,0xec,0xb7,0xe1,0x79,0x47,0x19,0x9e,0x75,0x54,0xe2,0x03,0x5f,0x3e,0xba,0x65,0x3d,0x16,0x2e,0x5e,0x1c,0xb1,0xf7,0xff,0x73,0xb3,0x4b,0x40,0xfb,0x04,0x44,0x3a,0x52,0x66,0x33,0x60,0x76,0xc5,0xe8,0xa1,0xd7,0x0b,0x16,0x2e,0xbc,0xc0,0x6a,0x6e,0x0d,0x19,0xb1,0xdb,0x53,0x80,0xff,0xe9,0xab,0xc4,0x0e,0x47,0x29,0x7c,0x6a,0xec,0x0d,0x76,0x29,0x51,0x02,0xf0,0x59,0xbc,0x8a,0x88,0x13,0x7e,0x0b,0x4e,0xf8,0x2d,0x38,0xf0,0x7c,0x0b,0x96,0x4e,0xf1,0x62,0xc5,0xb4,0xc2,0x31,0x63,0xd3,0x8d,0x5a,0x09,0x1a,0x49,0xa0,0xec,0x39,0x44,0xda,0x61,0x35,0x8e,0x7d,0xfa,0xb2,0xa8,0xa4,0x14,0x5e,0x73,0x05,0x0e,0x76,0x06,0xd0,0x1e,0x32,0x20,0xc8,0x2f,0xdc,0x1d,0x70,0x2a,0x1a,0x98,0x04,0x39,0x0d,0x05,0x40,0x1e,0xf9,0xc7,0xdb,0x5d,0x01,0x6c,0xff,0xb0,0x15,0xdb,0x3f,0x6c,0x45,0x4d,0xa1,0x19,0x2b,0xa6,0x17,0xe2,0x8a,0x69,0x45,0x71,0x39,0xfb,0xbd,0x70,0x52,0x1e,0xee,0x5c,0x51,0x83,0x7c,0xb3,0x0e,0xed,0x0e,0x3f,0x4e,0xd9,0x3d,0x83,0x7f,0x9a,0x7b,0x3c,0x24,0x2c,0x04,0xcc,0x3a,0x09,0x35,0x45,0x66,0xd4,0x16,0x99,0x51,0x53,0x38,0xf0,0x77,0x91,0x45,0x8f,0x26,0xbb,0x1b,0xff,0xf5,0x46,0x13,0x5a,0x7a,0xbd,0x31,0x2f,0xf3,0x64,0x97,0x1b,0x3b,0x4f,0x74,0x63,0xe7,0x49,0x3b,0x3a,0x9d,0x12,0x80,0xe1,0xf3,0x50,0x38,0x15,0x0d,0xca,0x34,0xfe,0xf4,0x12,0x0,0x0e,0xc0,0xab,0x46,0xb6,0xcf,0x79,0xba,0xdb,0x83,0xd3,0xdd,0x1e,0x6c,0xde,0xd5,0x8c,0x47,0xff,0x76,0x21,0xa6,0x95,0x58,0x62,0xf6,0x1c,0xd5,0xf9,0x26,0x3c,0x78,0xd3,0xec,0xc1,0xf5,0x57,0x8e,0x41,0x83,0x19,0xa5,0x39,0x9f,0x9a,0x5c,0x9c,0xa3,0xb5,0xcf,0x37,0x20,0x08,0xdd,0x1e,0x9c,0xb6,0x7b,0xd0,0x64,0xf7,0xc0,0x95,0xa2,0x07,0x61,0x88,0x89,0x53,0x94,0xa3,0x1f,0x1c,0xe4,0xb5,0x85,0x66,0xd4,0x14,0x99,0x51,0x62,0x1d,0x3e,0xf7,0xc3,0xfc,0xaa,0x5c,0xfc,0xe8,0x96,0xb9,0xf8,0xe6,0xe6,0x0f,0xc6,0x4c,0x25,0x1f,0x0d,0x2f,0x1d,0xea,0xc0,0x2f,0x5f,0x39,0x11,0xd1,0x7b,0xdd,0x8a,0x26,0xe6,0x75,0x10,0x77,0x01,0x08,0x73,0x01,0x18,0xc7,0xca,0x5d,0x89,0x71,0x0c,0xc0,0xb2,0xa9,0x05,0xc3,0x3a,0x5f,0x06,0x9d,0x21,0x8c,0xa1,0x2a,0xdf,0x84,0xaa,0x7c,0x13,0xae,0x9a,0x59,0x3c,0xf8,0x7a,0x8f,0x3b,0x38,0x28,0x08,0x9f,0x88,0x43,0xa7,0xc3,0x0f,0x8a,0x50,0x48,0x1f,0x44,0x81,0xa1,0x32,0xcf,0xf8,0xe9,0x60,0x3f,0xff,0xc7,0xa2,0x8f,0x6e,0x40,0x15,0x5a,0x74,0x98,0x53,0x61,0xc5,0xde,0xd3,0xb1,0x4b,0xdf,0x1e,0x4d,0x3f,0x1f,0x18,0x4b,0xe9,0x26,0x0,0x6a,0x6a,0xb8,0xed,0xf2,0x4d,0xe3,0xcb,0x22,0x53,0x60,0xd1,0xa1,0xc0,0xa2,0xc3,0x65,0x35,0x9f,0x7a,0x68,0x65,0x95,0xa3,0xad,0xdf,0x87,0xc6,0x2e,0x37,0x1a,0xbb,0x3c,0x68,0xea,0x72,0xe3,0xb4,0xdd,0x43,0xc9,0x3d,0x53,0x80,0x5c,0xa3,0x16,0xd3,0x4a,0x2c,0x98,0x5a,0x6c,0xc1,0x94,0x62,0x0b,0xaa,0x0b,0x8c,0x28,0xce,0xd1,0x43,0x88,0x51,0x98,0x79,0xbe,0x59,0x97,0xb4,0xdf,0x16,0xe6,0x2c,0x0d,0x05,0x0,0x62,0xc6,0x75,0x32,0x49,0x60,0xa8,0xce,0x37,0xa1,0x3a,0xdf,0x84,0x6b,0xeb,0x3e,0x15,0x85,0xb3,0xbd,0x5e,0x9c,0xb2,0x0f,0x2c,0x63,0x4e,0x76,0xba,0x71,0xb4,0xcd,0x49,0x96,0x42,0x3c,0xdb,0x41,0x14,0x30,0xaf,0xd2,0x86,0x29,0x9f,0x99,0xd5,0xcb,0x6c,0x33,0x6b,0x97,0xff,0x0,0x0,0x10,0xb2,0x49,0x44,0x41,0x54,0x86,0x8c,0x3d,0x53,0x12,0x52,0xd3,0xd0,0x02,0xc8,0x96,0x03,0xe5,0x92,0xc0,0x50,0x53,0x38,0xe0,0x38,0xfa,0xac,0x73,0xe7,0xe1,0xed,0x87,0xd1,0xe3,0x0e,0xd2,0x68,0x8d,0x31,0xd3,0x4b,0x72,0xf0,0x83,0x2f,0xcd,0x42,0x81,0x45,0x47,0x95,0x31,0x01,0xe2,0x1e,0x07,0x90,0xea,0xe7,0x7b,0x5e,0x39,0xdc,0x89,0x5d,0x8d,0xdd,0xe8,0x70,0xc6,0x3e,0x75,0xd7,0xb4,0x62,0x0b,0xbe,0xb9,0x72,0x0a,0xf5,0xb2,0x38,0xf0,0x4f,0x5f,0x98,0x19,0xf3,0xc1,0xaf,0xa8,0x1c,0x2d,0xbd,0x5e,0xbc,0x71,0xac,0x2b,0xa6,0xeb,0xfc,0x98,0x4d,0x32,0x2c,0xf6,0x93,0x69,0xdc,0x2d,0x0,0x0d,0x52,0x7b,0x6b,0xed,0xa5,0x43,0x1d,0x38,0xda,0xee,0x1c,0x9c,0xc5,0xcb,0x72,0x8d,0x98,0x5a,0x6c,0xc6,0xd4,0xe2,0x81,0x75,0x64,0x6d,0x91,0x19,0x7a,0xcd,0xf8,0x97,0x31,0x63,0x05,0x7f,0x4c,0x84,0xda,0x22,0x33,0xd6,0xaf,0xa8,0x45,0xa9,0x4d,0x9f,0x52,0x75,0xaa,0xaa,0xc0,0x29,0xbb,0x1b,0x1b,0xdf,0x3a,0x85,0x5e,0x4f,0xec,0xad,0x9f,0x3c,0x93,0x76,0xc2,0xdb,0xc4,0x4e,0x7f,0x18,0xc7,0xda,0x5d,0x68,0xea,0x72,0xa3,0xa5,0xd7,0x8b,0x96,0x5e,0x1f,0xda,0xfa,0x7d,0x83,0x4e,0xb9,0x1b,0xe7,0x97,0x5f,0xe0,0xf7,0x49,0x05,0x34,0x42,0x1a,0x0a,0x80,0x56,0x50,0x31,0xb0,0x19,0x98,0xfa,0xeb,0xb2,0x4f,0xd6,0xf1,0x67,0x7b,0xbd,0x78,0xfd,0x68,0xd7,0x40,0xa5,0x8b,0x02,0x26,0x15,0x98,0x2e,0xf0,0x1e,0x4f,0x2e,0x34,0xc3,0x10,0xa1,0x28,0xe8,0xa5,0xf8,0xf8,0x40,0x0a,0x2c,0x3a,0x3c,0xb2,0x6a,0x3e,0xcc,0xba,0xd4,0x4c,0xea,0x54,0x9e,0x6b,0x40,0x75,0x81,0x09,0xff,0xeb,0xc9,0xfd,0x08,0xc7,0xf8,0xfc,0xc6,0x68,0xbb,0x39,0xc3,0xe1,0xf2,0x87,0x07,0x77,0x70,0x3e,0x89,0xfb,0x68,0xed,0xf3,0xa5,0xdd,0xf5,0x5f,0x3a,0xa6,0xa4,0x9f,0x0,0x08,0xe0,0x30,0x89,0x2a,0xbc,0x4a,0x7a,0x3a,0x03,0xc3,0x8a,0x7a,0xde,0xdb,0xef,0x1e,0x32,0x0b,0x4d,0x2d,0xb6,0xa0,0xba,0xc0,0x84,0xaa,0x7c,0x23,0xa6,0x16,0x5b,0x50,0x95,0x6f,0x4a,0x98,0xcc,0xad,0x98,0x56,0x94,0xb2,0x83,0xff,0x13,0xaa,0xf3,0x4d,0x98,0x55,0x6e,0xc5,0xc1,0xb3,0xfd,0x89,0xb1,0x3c,0x38,0xc7,0xb9,0xbe,0x0b,0x77,0x67,0x5a,0x7a,0xbc,0x29,0x91,0x8e,0x3d,0x16,0x98,0x85,0x70,0xfa,0x09,0x0,0x0,0x98,0x58,0x18,0xde,0x0c,0xdb,0x0d,0xe8,0xf3,0x86,0xb0,0xf7,0x74,0xef,0x05,0x6b,0xc5,0x86,0x3b,0x2f,0x43,0xa9,0xd5,0x90,0x90,0xf2,0xf3,0x4c,0xda,0xb4,0xa8,0xa7,0x44,0x3e,0xe7,0x7b,0x4d,0xbd,0x78,0xf8,0xaf,0x87,0x33,0xd6,0xef,0x61,0x11,0x63,0x2f,0x64,0x09,0x71,0xd1,0x59,0xa5,0xd8,0x29,0x57,0x2c,0x6e,0x85,0x21,0x88,0x44,0x63,0x35,0x4c,0xbc,0xdf,0xe6,0x88,0x69,0x6a,0x01,0x14,0x4a,0x01,0x34,0x22,0x36,0x61,0xbd,0x5b,0xef,0x5a,0x82,0x96,0x5e,0x2f,0x76,0x9e,0xe8,0xc6,0xdb,0x27,0xec,0x38,0xd7,0xe7,0xa3,0xde,0xf5,0x19,0xfc,0x61,0x05,0x8a,0x12,0xfd,0xda,0x56,0xaf,0x11,0x20,0x89,0x03,0x07,0xad,0xc6,0x73,0x26,0x42,0x2b,0x09,0x51,0xaf,0xcd,0x33,0x19,0x06,0xa0,0xae,0xdc,0x8a,0x2b,0xa6,0x15,0x62,0xe9,0x94,0x02,0x14,0x4f,0xf0,0x7a,0x39,0x1d,0x53,0xd3,0x57,0x0,0x0a,0xa4,0xd8,0x5e,0x2b,0x55,0x9d,0x6f,0x42,0xf5,0x32,0x13,0x56,0x2f,0x9b,0x34,0x28,0x06,0x7b,0x4f,0xf7,0x0e,0x59,0xa7,0x67,0x23,0x3f,0xfa,0xeb,0x11,0xec,0x3f,0x93,0xf8,0x8b,0x2e,0xbf,0x7a,0x69,0x25,0xee,0xbc,0xb2,0x36,0xab,0xeb,0x5e,0x14,0x18,0xe6,0x56,0xda,0x70,0x59,0x4d,0x3e,0x96,0x4d,0x29,0x88,0xc9,0x9d,0x92,0x9f,0x90,0x2f,0x05,0xe3,0xe2,0x5f,0x4a,0x88,0x0,0x58,0xc4,0x30,0x8c,0x82,0x1c,0xd5,0x79,0xe6,0x7e,0x6f,0x28,0x6a,0x31,0xe8,0x74,0x06,0xf0,0xde,0xa9,0x1e,0xec,0x3c,0xd9,0x4d,0x51,0x78,0x44,0x42,0x90,0x04,0x86,0x85,0x93,0xf2,0x70,0xc5,0xf4,0x42,0x2c,0x9e,0x9c,0x8f,0x1c,0x43,0x74,0xe7,0x0b,0x22,0xdd,0x26,0x2d,0xd1,0xc6,0xe7,0x4a,0xb3,0x84,0x08,0x0,0x03,0x50,0xa9,0xf5,0xe1,0x44,0x20,0x27,0xe2,0xcf,0x3c,0xf7,0x51,0x1b,0x96,0x4c,0xc9,0x8f,0x2a,0x86,0xbb,0xc4,0xaa,0xc7,0xcd,0x97,0x54,0xe0,0xe6,0x4b,0x2a,0x60,0x77,0x05,0xf0,0x6e,0xd3,0x79,0x31,0x68,0x77,0x52,0x4f,0x25,0x62,0x37,0x68,0x44,0x01,0x0b,0xab,0x73,0x71,0xc5,0xf4,0x42,0x5c,0x56,0x93,0x1f,0xf5,0xa1,0xa2,0x4f,0xf0,0x06,0xe5,0xc1,0xed,0xe6,0xb1,0xa8,0xd4,0xfa,0xd2,0x57,0x0,0x30,0x0e,0x01,0x38,0xd0,0xd2,0x8f,0xef,0xff,0xe9,0x63,0xdc,0xbe,0x7c,0x32,0xa6,0x97,0xe6,0x44,0x6d,0xfe,0x14,0xe5,0x7c,0x2a,0x06,0x1d,0x0e,0x7f,0xcc,0x4f,0x17,0x12,0xd9,0xc9,0x0d,0x73,0x4b,0xb1,0x76,0xf9,0xa4,0x09,0x39,0xa3,0x65,0x95,0x63,0xff,0x99,0x3e,0x6c,0x7a,0xe7,0x34,0xba,0x22,0xb8,0xac,0xd4,0x26,0x86,0x60,0x11,0xc2,0xe9,0x2d,0x0,0x45,0x9a,0x20,0x0c,0x82,0x02,0xbf,0x2a,0x46,0x25,0x02,0x07,0x5a,0xfa,0x51,0x60,0xd1,0x61,0xf9,0x94,0x02,0x2c,0x9b,0x5a,0x88,0x39,0x15,0xd6,0xa8,0x4f,0x76,0x95,0xda,0x0c,0xd4,0x73,0x89,0x98,0x30,0xb5,0x78,0x7c,0xce,0xec,0x90,0xac,0x62,0x5f,0x73,0x1f,0x76,0x37,0x0d,0xf8,0xab,0x3c,0x81,0xc8,0xb7,0xf4,0x26,0xeb,0xe2,0xe7,0xe8,0x4e,0x98,0x0,0x08,0xe0,0x98,0xaa,0x77,0xe3,0x63,0x9f,0x2d,0xea,0xcf,0xf6,0xb8,0x83,0xd8,0x7e,0xa0,0x0d,0xdb,0x0f,0xb4,0x41,0xa7,0x11,0x31,0xbf,0xd2,0x86,0x2b,0xa6,0x17,0x62,0xf9,0x94,0x42,0x18,0xb4,0x22,0xf5,0x4a,0x22,0x25,0xe9,0xf7,0x86,0xf0,0xf6,0x09,0x3b,0x76,0x9e,0xec,0xc6,0xb1,0x76,0xd7,0xb8,0x22,0x0f,0x05,0x70,0x4c,0xd1,0xbb,0xd3,0x5f,0x0,0x0,0x60,0x8a,0xce,0x83,0xc3,0x3e,0x2b,0xd4,0x09,0xf8,0x33,0x83,0x61,0x65,0x30,0x0,0xe7,0x51,0xe9,0x24,0x16,0x54,0xe5,0xe2,0xb2,0xda,0x01,0xaf,0x2b,0xc5,0x08,0x10,0xc9,0xa6,0xc7,0x1d,0xc4,0xae,0xc6,0xee,0x41,0xdf,0xd3,0x44,0xa3,0x8d,0x2b,0x75,0xbe,0xb8,0x84,0x0,0x27,0x45,0x0,0x8c,0x82,0x8c,0x2a,0xad,0x0f,0x67,0x42,0xa6,0x98,0x7c,0x5f,0x48,0x56,0x07,0xc5,0xe0,0x89,0x37,0x9b,0xb0,0x70,0x52,0x1e,0x96,0x4d,0x29,0xc0,0x92,0xda,0xc8,0x1d,0x33,0x74,0xcf,0x0,0x31,0x1c,0x8a,0x1a,0x79,0xbf,0xb0,0xbb,0x02,0xd8,0xd3,0xd4,0x83,0x5d,0x8d,0x3d,0x38,0xd2,0xe6,0x8c,0xe9,0x19,0x83,0x99,0x7a,0x57,0x5c,0x7f,0x67,0xc2,0x83,0xc9,0xe7,0x18,0x1d,0x68,0x09,0x99,0x62,0xbe,0x45,0x17,0x92,0x55,0xec,0x69,0xea,0xc1,0x9e,0xa6,0x1e,0x48,0xe7,0xf7,0x63,0x97,0x4f,0x1d,0x08,0xc2,0x18,0x29,0x1c,0xd5,0x17,0x92,0x71,0x36,0xce,0x81,0x44,0xa2,0xc0,0x30,0xb3,0x2c,0x07,0xed,0xfd,0x7e,0x38,0x29,0xbf,0xe0,0x84,0x60,0x0,0xf2,0x2d,0xba,0x71,0xaf,0xc3,0xa3,0xe1,0x64,0xa7,0x7b,0xd4,0x23,0x6c,0x6d,0xfd,0x3e,0xec,0x6a,0xec,0xc1,0xee,0xc6,0x6e,0x34,0x9e,0x7f,0x6f,0xac,0x29,0xd7,0xfa,0x51,0x20,0x05,0x33,0x4b,0x0,0xac,0x62,0x18,0x93,0x74,0x5e,0x34,0x07,0x4d,0x71,0x2b,0x43,0x56,0x39,0x3e,0x6c,0xe9,0xc7,0x87,0x2d,0xfd,0x78,0xec,0xf5,0x93,0xa8,0x2b,0xb3,0x62,0xd9,0x94,0x02,0x2c,0x9f,0x5a,0x38,0x98,0xf4,0x31,0x10,0x56,0xf0,0xb3,0x97,0x4e,0xc4,0xfd,0xca,0x31,0xad,0x24,0xe0,0x17,0xb7,0x5e,0x32,0x68,0x6d,0x74,0x7b,0x82,0xe8,0x74,0x04,0xd0,0xe1,0xf4,0xa3,0xd3,0x19,0x40,0x87,0x63,0xe0,0xef,0x96,0x5e,0x2f,0x65,0x25,0x06,0x60,0xd0,0x88,0xa8,0xc8,0x33,0xa2,0xc4,0xaa,0x47,0xa9,0xcd,0x30,0xf0,0xb7,0xd5,0x80,0x12,0x9b,0x1e,0x45,0x16,0x3d,0x44,0x21,0x31,0xc7,0xad,0x4e,0xd9,0x3d,0xd8,0xb2,0xab,0x19,0x6b,0x97,0x4f,0x1a,0x74,0x3a,0x9f,0xb2,0x7b,0xb0,0xbb,0xb1,0x1b,0xbb,0x1b,0x7b,0xe2,0x92,0x1d,0xf8,0x62,0xb1,0x9b,0x6b,0x70,0xc4,0xfd,0x77,0x26,0xe5,0x38,0xd9,0x7c,0x63,0x3f,0xce,0x86,0x8c,0x50,0x78,0xfc,0x1b,0x93,0x73,0xe0,0x48,0x9b,0x13,0x47,0xda,0x9c,0xf8,0xcd,0xdb,0xa7,0x30,0xa9,0xc0,0x84,0x5c,0x93,0x16,0xa7,0x92,0x90,0xf1,0x57,0x12,0x05,0x94,0x5a,0x0d,0x28,0xb5,0x1a,0xb0,0x0,0xb9,0x17,0x99,0x9c,0x1c,0x76,0x77,0x60,0x58,0x71,0x38,0xd7,0xe7,0xcb,0xa8,0xbb,0x11,0x4d,0x3a,0x09,0x65,0xe7,0x07,0x77,0x75,0xbe,0x09,0xd5,0x05,0xa6,0xc1,0x81,0x6e,0xd6,0xa7,0xce,0x09,0xc7,0x3f,0xec,0x6d,0xc1,0x5b,0xc7,0xbb,0x50,0x6a,0x33,0xa0,0xad,0xdf,0x0f,0xbb,0x2b,0x90,0xb0,0xb2,0x27,0xe9,0xbc,0xc8,0x97,0x82,0x99,0x29,0x0,0x26,0x41,0xc6,0x6c,0x83,0x13,0x1f,0x8d,0x63,0x47,0x60,0xa2,0x9c,0xe9,0xf1,0xe2,0x4c,0x4f,0x7c,0xd4,0x3b,0x18,0x1e,0xff,0x0c,0x2e,0x0a,0x6c,0x44,0x71,0x90,0x15,0x15,0x5d,0xae,0x0,0xda,0x1d,0x01,0xb4,0x3b,0xfc,0x68,0x77,0xf8,0x51,0x91,0x97,0x1e,0x5b,0x9b,0x75,0x65,0x39,0xc8,0x33,0x6b,0x51,0x66,0x33,0x0c,0xfe,0x29,0xb4,0xe8,0xe2,0x92,0xb7,0x2f,0x1e,0x49,0x59,0x3b,0x9d,0x01,0x74,0x3a,0x03,0x09,0xad,0x33,0x89,0xa9,0x58,0x60,0x4c,0x4c,0x38,0x77,0xd2,0xe4,0xb6,0x4e,0xef,0xc4,0xa9,0xa0,0x19,0x1e,0x45,0x42,0xa6,0xb0,0xaf,0xb9,0x0f,0x93,0x0a,0x62,0xbf,0xb4,0x91,0x44,0x01,0xe5,0xb9,0x46,0x94,0xe7,0x1a,0xd3,0xae,0x4e,0x6e,0x9c,0x5f,0x9e,0xb0,0xb2,0x3e,0x68,0xee,0xcd,0x88,0x7e,0x34,0xd7,0xe8,0x84,0x51,0x48,0x8c,0xc5,0x97,0xb4,0xe3,0x5b,0x22,0xe3,0x58,0x6e,0xee,0xc9,0xa8,0xbb,0xfe,0x9e,0xda,0x73,0x06,0xef,0x36,0xf5,0xd0,0x19,0x84,0x04,0x23,0xab,0x1c,0x7f,0xdc,0x77,0x0e,0x6f,0x1f,0xb7,0xa7,0xfd,0x6f,0x29,0x94,0x82,0x98,0xa9,0x4f,0x5c,0xe8,0xba,0x94,0xdc,0x1f,0x1b,0xc0,0x2c,0x83,0x13,0x87,0xfd,0xd6,0x8c,0xe8,0x88,0x81,0xb0,0x82,0x87,0xb7,0x1f,0x46,0x81,0x45,0x87,0x49,0xf9,0x26,0x94,0xda,0x0c,0x28,0xb5,0x19,0x50,0x66,0x1b,0x70,0x68,0x95,0x5a,0x0d,0x74,0x64,0x76,0x02,0x78,0x83,0x32,0x3a,0x1c,0x7e,0x74,0x38,0x07,0x96,0x42,0x9d,0x4e,0x3f,0x3a,0x1c,0x01,0x9c,0xee,0xce,0x8c,0x1b,0x9c,0x24,0xc6,0xb1,0xcc,0x92,0xd8,0x49,0x31,0xe9,0xf6,0xf7,0x5c,0x43,0x3f,0x3a,0xc2,0x7a,0xf4,0xca,0x99,0x93,0xde,0xb9,0xc7,0x1d,0x1c,0x31,0x15,0x78,0xbe,0x59,0x87,0x52,0xdb,0x80,0xc3,0xab,0xec,0xbc,0x40,0x7c,0xf2,0xff,0xd1,0x9e,0x24,0x1b,0xa9,0xec,0x64,0xd0,0xeb,0x8d,0xcd,0x91,0xef,0x5e,0x4f,0x10,0x1d,0xe7,0x1d,0xa1,0xed,0x0e,0xff,0xa0,0x23,0xb4,0xdd,0xe1,0xcf,0xf8,0x6b,0xda,0x16,0x99,0xfa,0xe2,0x16,0xf3,0x9f,0xb2,0x02,0x20,0x30,0xe0,0x4a,0x4b,0x37,0x5e,0x74,0x96,0x22,0xa0,0x66,0x7e,0x58,0x6f,0xaf,0x27,0x88,0x5e,0x4f,0x10,0x87,0x5b,0x87,0x9a,0x79,0x26,0x9d,0x74,0xde,0x52,0xd0,0x0f,0x8a,0x43,0xc9,0xf9,0xff,0x8e,0xc4,0x71,0x76,0xa2,0xd3,0x85,0xb3,0x7d,0xde,0xa4,0xfc,0xae,0xfd,0x67,0xfa,0xd0,0xef,0x0b,0x21,0x77,0x8c,0x68,0xcc,0x01,0x87,0x66,0x10,0x1d,0xce,0x81,0xc1,0xdd,0xe1,0xf0,0xa3,0xdd,0x11,0x40,0xe7,0xf9,0x01,0x9f,0xad,0x5b,0xa1,0xd3,0xf5,0x2e,0xd4,0xea,0x12,0x9f,0xcf,0x22,0x25,0x3c,0x70,0x46,0x41,0xc6,0x95,0x16,0x3b,0x5e,0x75,0x95,0x22,0x9b,0x0f,0xed,0x79,0x83,0x32,0x9a,0xba,0xdc,0x68,0x1a,0x26,0xb1,0x89,0x24,0x0a,0x83,0x5b,0x65,0x65,0x36,0x3d,0x4a,0xac,0x9f,0x2e,0x2f,0x04,0xc6,0x70,0xa4,0xdd,0x89,0xad,0xbb,0xcf,0x24,0xed,0x1e,0x16,0x97,0x3f,0x8c,0xef,0xff,0xf1,0x63,0xac,0x5e,0x36,0x09,0x93,0x0a,0x4c,0xf0,0x87,0x94,0xcf,0x0c,0xf2,0xc0,0xe0,0x6c,0xde,0xed,0x0e,0xa6,0x5d,0x36,0xde,0x78,0x53,0xa2,0x09,0x60,0xa1,0xa9,0x3f,0x29,0x65,0xa7,0x8c,0x0b,0xbe,0x50,0x0a,0x62,0x85,0xb9,0x0b,0x6f,0xbb,0x8b,0xc9,0x89,0x36,0xc2,0xcc,0xd9,0xda,0xe7,0x43,0x6b,0x0a,0xa7,0x40,0x3b,0xdd,0xed,0xc1,0xc3,0xdb,0x0f,0x53,0x63,0x45,0x41,0x9e,0x14,0xc2,0x95,0x96,0x2e,0x08,0x49,0xea,0xf5,0x29,0xe5,0x91,0xaa,0xd0,0xfa,0xb1,0xd8,0xd4,0x4b,0xbd,0x82,0xc8,0x0a,0x4c,0x82,0x8c,0x95,0x96,0x2e,0x68,0x58,0xf2,0xa6,0xbc,0x94,0x73,0x49,0x4f,0xd5,0xbb,0x51,0xa7,0xa7,0x0c,0x3e,0x44,0x66,0xa3,0x63,0x2a,0xae,0xb2,0x74,0x25,0x6c,0xbf,0x3f,0x6d,0x04,0x0,0x0,0x2e,0x31,0xf5,0x63,0x81,0xb1,0x9f,0x7a,0x09,0x91,0x91,0x18,0x04,0x05,0xd7,0x59,0x3b,0x60,0x93,0x92,0xbf,0xab,0x91,0xb2,0x61,0x78,0xb3,0x0c,0x4e,0x30,0x70,0x7c,0xe8,0xcb,0xa3,0x1e,0x43,0x64,0x0c,0x46,0x41,0xc6,0xb5,0x39,0x5d,0x71,0x49,0xf1,0x9d,0x51,0x02,0x0,0x0,0x75,0x06,0x17,0x18,0x80,0xfd,0xbe,0x5c,0x0,0x8c,0x7a,0x0f,0x91,0xd6,0x58,0x44,0x19,0xd7,0x58,0x3a,0x61,0x16,0x53,0xe7,0xaa,0xb2,0x91,0x04,0x40,0x01,0x52,0xe3,0x2e,0xaf,0x99,0x06,0x17,0xac,0x62,0x08,0x3b,0x3d,0xc5,0x08,0x73,0x12,0x01,0x22,0x3d,0x29,0xd5,0xf8,0x71,0xa5,0xa5,0x1b,0x12,0x4b,0x6e,0x9c,0x03,0xe7,0x5c,0x8e,0xc4,0x07,0xe0,0x49,0xa5,0xca,0x2b,0xd3,0x06,0x70,0x8d,0xa5,0x13,0x06,0x41,0xa1,0x9e,0x44,0xa4,0x1d,0xd5,0x3a,0x2f,0x56,0x5a,0xec,0x49,0x1f,0xfc,0x0,0xc0,0x18,0x73,0x8f,0x2d,0x0,0x17,0xbd,0x29,0x15,0x28,0xd0,0x04,0x71,0xa3,0xad,0x1d,0x25,0x9a,0x0,0xf5,0x28,0x22,0x2d,0x10,0x18,0x70,0x99,0xa9,0x07,0x57,0x98,0xbb,0x21,0xb2,0x14,0x89,0x6e,0xe1,0xdc,0x35,0xb6,0x0,0xa8,0x6a,0x4a,0xde,0xb1,0xa5,0x63,0x0a,0xae,0xb6,0x74,0x62,0x9a,0xce,0x45,0xbd,0x8b,0x48,0x69,0xf4,0x82,0x8a,0xab,0x2d,0x9d,0x98,0xaa,0x4f,0x29,0x63,0x1a,0x0c,0x70,0x8f,0xe9,0x03,0xe0,0x8c,0xb9,0x53,0x75,0xb5,0x2d,0x30,0x60,0xb1,0xb9,0x0f,0x95,0x3a,0x3f,0xf6,0x78,0x0a,0xe0,0x53,0x29,0x2d,0x38,0x91,0x5a,0x4c,0xd2,0x7a,0xb0,0xd8,0xdc,0x07,0x2d,0x4b,0xbd,0x73,0x0d,0xea,0x45,0x02,0x20,0x8c,0xa0,0x12,0x5d,0xa9,0x5e,0xc9,0xa5,0x1a,0x3f,0x6e,0xb0,0xb6,0xa3,0x54,0xe3,0xa7,0x1e,0x47,0xa4,0x04,0x22,0xe3,0x58,0x6c,0xea,0xc5,0x72,0x4b,0x4f,0x4a,0x0e,0xfe,0x81,0x67,0x64,0x5d,0x63,0x2f,0x01,0x80,0xe3,0xe9,0x50,0xe1,0x06,0x41,0xc1,0x35,0x39,0x5d,0x58,0x61,0xe9,0x8e,0x6b,0xee,0x74,0x82,0x18,0x8b,0x4a,0xad,0x0f,0x37,0xd9,0x5a,0x31,0x4d,0xef,0x4e,0xe5,0x0d,0x6b,0x55,0x63,0x32,0x9d,0x88,0x64,0x09,0x70,0x82,0xa5,0xd1,0x89,0xad,0x2a,0xad,0x17,0x25,0x36,0x3f,0x0e,0xf8,0xf3,0xd0,0x18,0x30,0x53,0x6f,0x24,0x12,0x86,0x8e,0x29,0xb8,0xcc,0xdc,0x87,0x2a,0xad,0x37,0x1d,0x1e,0xf7,0xdc,0xaa,0x55,0xab,0xfc,0x63,0x0a,0x0,0x14,0xe5,0x04,0x84,0xf4,0xca,0x5c,0xa3,0x15,0x54,0x5c,0x66,0xea,0x41,0xb9,0xc6,0x87,0xfd,0xde,0x3c,0xb8,0x55,0x89,0x7a,0x27,0x11,0x37,0x18,0x80,0x49,0x3a,0x0f,0x2e,0x31,0xf6,0xa7,0xd3,0xf6,0xf4,0x89,0x8b,0x5f,0x18,0x7e,0x94,0x68,0x34,0x27,0xa1,0xa4,0xa7,0x49,0x5d,0xa1,0xf5,0xa1,0x4c,0xeb,0xc7,0xc9,0x80,0x05,0x1f,0xf9,0x72,0x29,0x78,0x88,0x88,0x39,0x85,0x52,0x10,0x8b,0x4c,0xbd,0xc8,0x93,0x42,0xe9,0xf5,0xe0,0x8c,0x9d,0xbc,0xf8,0xa5,0x61,0xa7,0xf9,0xb5,0x6b,0xd7,0xda,0x01,0x9c,0x4c,0xd7,0x06,0x12,0xc0,0x31,0x43,0xef,0xc2,0x8d,0xb6,0x36,0x4c,0xd1,0x79,0x28,0x88,0x98,0x88,0x09,0x26,0x41,0xc6,0x52,0x53,0x0f,0xae,0xb3,0x76,0xa4,0xdf,0xe0,0x07,0xc0,0x54,0x75,0x57,0x64,0x16,0xc0,0x80,0x89,0xf3,0x06,0x07,0xa6,0xa5,0x7b,0x83,0x2d,0x31,0xf7,0x60,0x8e,0xa1,0x1f,0x87,0x03,0xb9,0x68,0x0a,0x98,0x29,0xd9,0x08,0x11,0x35,0x46,0x41,0xc1,0x1c,0x43,0x3f,0x6a,0xf5,0xde,0xa4,0x25,0xee,0x88,0x01,0x5c,0x95,0xa4,0x37,0x23,0x16,0x0,0x15,0x78,0x83,0x01,0xdf,0xca,0x08,0xe5,0x16,0x15,0x5c,0x66,0xea,0xc1,0x54,0x9d,0x0b,0x87,0x02,0x36,0xb4,0x06,0x8d,0x24,0x04,0xc4,0x98,0xe8,0x05,0x15,0x33,0xf5,0x4e,0x4c,0xd7,0xbb,0x53,0x22,0x8c,0x77,0x82,0x1c,0x3a,0x6f,0xd9,0x47,0x26,0x0,0x5c,0x10,0xde,0x60,0xaa,0xaa,0x22,0x45,0x73,0x06,0x8c,0x87,0x3c,0x29,0x84,0x2b,0xcd,0x76,0x38,0x0c,0x5a,0x1c,0xf6,0x59,0x71,0x26,0x64,0x04,0x9d,0x32,0x24,0x2e,0xc6,0x20,0x28,0xa8,0x33,0xb8,0x30,0x55,0xe7,0x82,0xc4,0x32,0x63,0xaa,0xe0,0xc0,0x1b,0xc3,0x2f,0x97,0x47,0xe0,0xf6,0xdb,0x6f,0xef,0x05,0xb0,0x3f,0x13,0x1b,0xd8,0x26,0x86,0x70,0xb9,0xa5,0x1b,0x5f,0xcd,0x6d,0xc5,0x5c,0x83,0x83,0x62,0x08,0x08,0x0,0x40,0x89,0xc6,0x8f,0x95,0x16,0x3b,0x6e,0xc9,0x3d,0x87,0x99,0x7a,0x67,0xc6,0x0c,0xfe,0xf3,0x4b,0xfa,0x97,0x87,0x7b,0x7d,0xd4,0xbd,0x32,0xce,0xd8,0x16,0xc6,0xf9,0xa2,0xcc,0x35,0xf1,0x14,0xcc,0x35,0x3a,0x30,0xd3,0xe0,0xc4,0xa9,0xa0,0x05,0x27,0x03,0x16,0xb8,0x14,0x0d,0x8d,0x84,0x2c,0x42,0x0,0x47,0x85,0xd6,0x8f,0xe9,0x7a,0x27,0x8a,0x35,0xc1,0xcc,0xfc,0x91,0x8c,0xb5,0x9e,0x3a,0x73,0xe6,0x95,0xa8,0x05,0x40,0x2f,0xcb,0xcf,0x04,0x45,0xf1,0x67,0x0,0x74,0x99,0xdc,0x09,0x34,0x6c,0x60,0xd7,0x60,0x86,0xde,0x85,0x5e,0x59,0x8b,0xa6,0x60,0x0e,0x9a,0x83,0x26,0xc8,0xb4,0x85,0x98,0xb1,0xd8,0xc4,0x10,0xa6,0xeb,0x5d,0xa8,0xd6,0xf9,0x52,0x36,0x6c,0x37,0x76,0xf6,0x3f,0x7f,0x66,0xc3,0x86,0x0d,0xea,0x08,0x96,0xc1,0xe8,0x6c,0x6d,0x68,0xf8,0x0b,0x03,0x6e,0xca,0xb6,0x0e,0xe2,0xe7,0x22,0x9a,0x83,0x66,0x9c,0x0e,0x9a,0xe1,0x90,0xc9,0x2a,0xc8,0x04,0x44,0xc6,0x51,0xa9,0xf1,0xa1,0x46,0xef,0x41,0x59,0x16,0x9d,0x21,0x51,0x18,0x9b,0x7d,0xc7,0x1d,0x77,0x1c,0x89,0xda,0x02,0x0,0x0,0x81,0xf3,0xa7,0x38,0x63,0x59,0x27,0x0,0x06,0xa6,0xa0,0x4e,0xef,0x44,0x9d,0xde,0x09,0x87,0xa2,0x45,0x73,0xd0,0x84,0x33,0x41,0x13,0xbc,0x14,0x61,0x98,0x6e,0x6b,0x5f,0x14,0x6b,0x02,0xa8,0xd1,0x79,0x50,0xa9,0xf5,0x26,0x35,0x05,0x77,0x92,0xf8,0x68,0xa4,0xc1,0x1f,0x91,0x0,0x34,0x9d,0x3d,0xfb,0xe7,0x29,0xd5,0xd5,0x47,0x38,0x30,0x2b,0x9b,0xcd,0xc5,0x05,0xc6,0x10,0x16,0x18,0xfb,0xe1,0x54,0x34,0x68,0x0d,0x19,0xd1,0x16,0x36,0xa2,0x3b,0xac,0xa3,0xed,0xc4,0x14,0x5d,0xd2,0x55,0x68,0xbd,0xa8,0xd6,0xfa,0x50,0xa2,0xf1,0x67,0x94,0x33,0x2f,0x6a,0x01,0xe4,0xfc,0xa7,0x63,0x09,0xe4,0x98,0x6c,0x6d,0x68,0xb8,0x83,0x01,0x0d,0xd4,0xb5,0x2e,0xc4,0xa9,0x68,0xd0,0x16,0x32,0xa2,0x3d,0x6c,0x80,0x3d,0xac,0x83,0x4a,0x5b,0x8a,0x49,0xc3,0x28,0xc8,0x28,0xd5,0x06,0x50,0xae,0xf1,0xa3,0x4c,0xe3,0xcf,0x84,0x7d,0xfb,0x58,0x70,0x52,0x67,0x32,0xd5,0xad,0x5a,0xb5,0x4a,0x19,0xb7,0x05,0x0,0x0,0xfe,0x50,0xe8,0x69,0x93,0x56,0xfb,0x20,0x07,0x26,0x51,0x9d,0x7e,0x8a,0x55,0x0c,0xc3,0x6a,0x70,0xa2,0xce,0xe0,0x84,0xcc,0x19,0xba,0xc2,0x7a,0xb4,0xcb,0x46,0x74,0x86,0xf4,0x70,0x29,0x1a,0xb2,0x0e,0xe2,0x39,0xcb,0x43,0x45,0x91,0x36,0x88,0x62,0xc9,0x8f,0x32,0x6d,0x0,0x36,0x31,0x44,0x95,0x32,0x74,0x76,0x7f,0x64,0xb4,0xc1,0x1f,0xb1,0x05,0x0,0x0,0x4f,0x35,0x34,0xdc,0xcd,0x81,0x47,0xa9,0x5a,0x23,0xc3,0xcf,0x45,0x74,0x85,0xf5,0xe8,0x3a,0x6f,0x1d,0x90,0x20,0x4c,0x0c,0x89,0xa9,0x28,0x90,0x42,0x28,0xd1,0x04,0x50,0x24,0xf9,0x51,0xa0,0x09,0xa5,0x73,0x58,0x6e,0x02,0x46,0x3f,0x6b,0xed,0x77,0xb9,0xa6,0xdc,0x73,0xcf,0x3d,0xc1,0x98,0x08,0xc0,0xb6,0x6d,0xdb,0xc4,0xa0,0xd7,0xbb,0x0f,0xc0,0x7c,0xaa,0xdd,0xe8,0x09,0x72,0x01,0xbd,0xb2,0x0e,0xdd,0x61,0x1d,0xba,0x65,0x3d,0xfa,0x64,0x2d,0x42,0x5c,0xa0,0x8a,0x19,0x06,0x91,0x71,0xe4,0x8a,0x21,0x14,0x48,0x41,0xe4,0x49,0x41,0xe4,0x4b,0x21,0x58,0x53,0xe4,0x22,0x8d,0x74,0x81,0x03,0xb7,0xac,0xad,0xaf,0xff,0x73,0x04,0x56,0x42,0xe4,0x3c,0xbd,0x65,0xcb,0x62,0x55,0x55,0xf7,0x20,0x83,0xc2,0x83,0x93,0x89,0x5b,0x95,0xe0,0x90,0xb5,0xe8,0x95,0xb5,0x70,0xc8,0x5a,0x38,0x54,0x2d,0x7c,0x8a,0x98,0x55,0xbe,0x04,0x2d,0x53,0x61,0x11,0x65,0xe4,0x8a,0x41,0xe4,0x4b,0x41,0x14,0x48,0x21,0x58,0xa5,0x30,0xcd,0xee,0x13,0x19,0xfc,0x8c,0x3d,0xbf,0xf6,0x8e,0x3b,0xbe,0x18,0xe1,0x32,0x21,0x3a,0xb6,0x36,0x34,0x6c,0x62,0xc0,0x3a,0xaa,0xe6,0xf8,0x11,0x52,0x05,0x38,0x55,0x2d,0x1c,0xb2,0x04,0x8f,0xaa,0x81,0x5b,0x91,0xe0,0x55,0x35,0x70,0x28,0x1a,0x28,0x69,0x18,0x9c,0x64,0x11,0x64,0x98,0xc4,0x30,0x2c,0xa2,0x02,0xb3,0x10,0x86,0x45,0x94,0x61,0x15,0x43,0x30,0x0b,0x72,0xea,0xa4,0xcb,0xce,0x1c,0x02,0xe7,0xf7,0xfd,0x4f,0x45,0xb4,0xb4,0x8a,0x7a,0x2d,0x26,0xcb,0x0f,0x28,0x1a,0xcd,0x97,0xc0,0x79,0x01,0xd5,0x75,0x9c,0x66,0x45,0x41,0x45,0xa1,0x10,0x40,0xe1,0x45,0xad,0xa3,0x82,0x9d,0x17,0x03,0x09,0x41,0x2e,0x22,0xa0,0x8a,0x08,0xaa,0x02,0x02,0xaa,0x88,0x0,0x1f,0xf8,0xef,0x20,0x17,0xe0,0x57,0xa5,0xb8,0x27,0x42,0x11,0xc0,0xa1,0x13,0x54,0xe8,0x98,0x02,0xbd,0xa0,0x42,0xcf,0x64,0xe8,0x05,0x15,0x5a,0xa6,0x40,0x2f,0x72,0x18,0x98,0x0c,0x1d,0x53,0x61,0x11,0xc3,0x74,0xa1,0x4b,0x62,0x79,0x24,0xd2,0xc1,0x3f,0x2e,0x0b,0xe0,0xfc,0x52,0xe0,0x2a,0x55,0x55,0x5f,0x45,0x8a,0x5c,0x1f,0x46,0x0c,0x45,0x05,0x43,0x50,0x15,0x20,0x73,0x86,0x10,0x17,0x10,0xe6,0x02,0x64,0x2e,0x40,0x86,0x80,0x70,0x84,0x3b,0x64,0x8c,0x01,0x5a,0xc6,0x21,0x41,0x81,0xc4,0x38,0x24,0xc6,0xa1,0x11,0x54,0x68,0xa1,0x42,0x27,0xd0,0x36,0x5b,0x0a,0xf2,0xea,0xa9,0x96,0x96,0xcf,0x8f,0x14,0xf6,0x1b,0x33,0x01,0x0,0x80,0x27,0x1b,0x1a,0x1e,0x06,0xf0,0x03,0xaa,0x73,0x82,0x48,0x09,0xda,0xb9,0x28,0x2e,0x18,0xee,0xcc,0xff,0xe8,0x96,0xdc,0x38,0x39,0xd5,0xd2,0xb2,0x81,0x31,0xf6,0x1a,0xd5,0x3b,0x41,0x24,0x1d,0x85,0x73,0x7e,0x5b,0xb4,0x83,0x7f,0x42,0x16,0x0,0x0,0x3c,0xb3,0x69,0x53,0x99,0x22,0x08,0xbb,0x29,0x40,0x88,0x20,0x92,0xca,0xbf,0xac,0xa9,0xaf,0x7f,0x64,0x3c,0x1f,0x9c,0xd0,0x76,0xde,0xad,0xeb,0xd7,0xb7,0x33,0xce,0xaf,0x01,0xd0,0x41,0x6d,0x40,0x10,0x89,0x87,0x03,0xff,0x36,0xde,0xc1,0x3f,0x61,0x0b,0xe0,0x13,0x9e,0x6a,0x68,0x98,0xc3,0x81,0xb7,0x01,0xe4,0x52,0x93,0x10,0x44,0xc2,0xd8,0xb4,0xfa,0x8e,0x3b,0xee,0x62,0x6c,0xfc,0x7b,0xa9,0x31,0x09,0xe8,0x59,0x5d,0x5f,0x7f,0x08,0xc0,0xd7,0x01,0xf8,0xa8,0x4d,0x08,0x22,0x21,0x3c,0xa7,0x33,0x99,0xfe,0x61,0x22,0x83,0x3f,0x66,0x02,0x0,0x0,0x6b,0xea,0xeb,0x5f,0x65,0xc0,0x12,0x0,0x6d,0xd4,0x36,0x04,0x11,0x57,0x7e,0xa5,0x33,0x99,0xbe,0xbc,0x6a,0xd5,0xaa,0x09,0x9f,0x80,0x8a,0x79,0xb4,0xc8,0xd6,0xad,0x5b,0x27,0x33,0x45,0x79,0x09,0x69,0x7e,0xa7,0x0,0x41,0xa4,0xe6,0x92,0x1f,0xf7,0x4f,0x64,0xcd,0x1f,0x37,0x0b,0xe0,0x13,0xd6,0xae,0x5d,0xdb,0x2c,0xa9,0xea,0x55,0x60,0x6c,0x1f,0xb5,0x17,0x41,0xc4,0x8c,0x10,0x38,0xff,0xfb,0x58,0x0e,0xfe,0xb8,0x08,0x0,0x30,0xb0,0x3b,0x50,0x71,0xe6,0xcc,0x52,0x0,0x0f,0x01,0xa0,0x90,0x31,0x82,0x98,0x18,0x47,0x19,0xe7,0x0b,0xd6,0xac,0x5b,0xb7,0x31,0xd6,0x5f,0x1c,0xf7,0x93,0x25,0x4f,0xfd,0xee,0x77,0x37,0xaa,0x8c,0x6d,0x61,0x40,0x1e,0xb5,0x23,0x41,0x44,0xcd,0x1f,0x42,0xaa,0xfa,0x77,0xeb,0xd7,0xaf,0x77,0xc7,0xe3,0xcb,0x13,0x72,0xb4,0x6c,0xf3,0xe6,0xcd,0xb5,0x22,0xe7,0x8f,0x01,0xf8,0x3c,0xb5,0x27,0x41,0x44,0xb4,0xd8,0xef,0x63,0x9c,0x3f,0xb0,0xba,0xbe,0xfe,0xd7,0x13,0xf5,0xf4,0x27,0x5d,0x0,0x06,0xad,0x81,0xcd,0x9b,0xaf,0x51,0x39,0x7f,0x8c,0x01,0x33,0xa8,0x89,0x09,0x62,0x58,0x14,0xc6,0xf9,0xe3,0x61,0xc6,0x1e,0xac,0xaf,0xaf,0x77,0xc4,0xbb,0xb0,0x84,0x1f,0x2e,0xdf,0xba,0x75,0xab,0x09,0xb2,0x7c,0x3f,0x63,0xec,0x1e,0x0,0x16,0x6a,0x6f,0x82,0x18,0x64,0x37,0x03,0xbe,0xb7,0xba,0xbe,0xfe,0xbd,0x44,0x15,0x98,0xb4,0xec,0x12,0xdb,0x1e,0x7f,0xdc,0x1c,0x34,0x1a,0xd7,0x03,0xf8,0x67,0x0,0xa5,0xd4,0xf6,0x44,0xb6,0x5a,0xfb,0x9c,0xb1,0x17,0x38,0x63,0x3f,0xb9,0xfd,0xf6,0xdb,0xf7,0x24,0xba,0xf0,0xa4,0xa7,0x97,0xd9,0xb6,0x71,0xa3,0x35,0xa0,0xd1,0xfc,0x03,0x13,0x84,0x75,0xe0,0x7c,0x0a,0xf5,0x07,0x22,0x4b,0x08,0x32,0xe0,0x05,0x55,0x55,0x7f,0xb1,0x76,0xfd,0xfa,0x5d,0xc9,0x7a,0x88,0x94,0xca,0x2f,0xb5,0x79,0xf3,0xe6,0x59,0x22,0xe7,0x5f,0x03,0xb0,0x06,0x40,0x0d,0xf5,0x11,0x22,0xc3,0x08,0x73,0xc6,0x5e,0x06,0xe7,0x5b,0xf5,0x26,0xd3,0xf3,0xab,0x56,0xad,0x4a,0xfa,0xfd,0x64,0x29,0x99,0x60,0xee,0xcd,0x0d,0x1b,0xa4,0xd6,0xea,0xea,0xa5,0x9c,0xf3,0x6b,0x19,0x63,0xd7,0x82,0xb1,0xc5,0xe0,0x9c,0xee,0xe4,0x22,0xd2,0x91,0x0e,0x06,0xbc,0xc6,0x19,0x7b,0x4d,0xe6,0xfc,0x95,0xfa,0xfa,0xfa,0xce,0x54,0x7a,0xb8,0xb4,0xc8,0x30,0xf9,0xd4,0x53,0x4f,0xe5,0xa8,0xe1,0xf0,0xe5,0x60,0x6c,0x36,0x38,0x9f,0x2e,0x70,0x3e,0x93,0x33,0x36,0x03,0x74,0xfa,0x90,0x48,0x99,0x91,0xc4,0x64,0x70,0xde,0xcc,0x81,0xa3,0x02,0xe7,0x27,0x38,0x70,0x5c,0x11,0x84,0xf7,0x47,0xbb,0x97,0x8f,0x04,0x20,0x06,0xfe,0x03,0x8f,0x46,0xa3,0xd5,0x01,0x16,0xce,0x98,0x89,0x31,0xa6,0xa5,0x9e,0x48,0x24,0x0a,0x55,0x96,0x9d,0x5c,0xab,0x0d,0x89,0xa2,0xe8,0xd6,0x68,0x34,0xde,0x58,0x1c,0xce,0x21,0x08,0x82,0x20,0x08,0x82,0x20,0x08,0x82,0x88,0x23,0xff,0x1f,0x03,0x13,0x3a,0x12,0x64,0x41,0x40,0x31,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82
+static const unsigned char app_icon_png[] = {
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+ 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40,
+ 0x08, 0x06, 0x00, 0x00, 0x00, 0xaa, 0x69, 0x71, 0xde, 0x00, 0x00, 0x00,
+ 0x04, 0x73, 0x42, 0x49, 0x54, 0x08, 0x08, 0x08, 0x08, 0x7c, 0x08, 0x64,
+ 0x88, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x00,
+ 0xdd, 0x00, 0x00, 0x00, 0xdd, 0x01, 0x70, 0x53, 0xa2, 0x07, 0x00, 0x00,
+ 0x00, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61,
+ 0x72, 0x65, 0x00, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x6e, 0x6b, 0x73, 0x63,
+ 0x61, 0x70, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x9b, 0xee, 0x3c, 0x1a, 0x00,
+ 0x00, 0x0b, 0xe0, 0x49, 0x44, 0x41, 0x54, 0x78, 0x9c, 0xed, 0x9b, 0x7b,
+ 0x74, 0xd4, 0xd7, 0x71, 0xc7, 0x3f, 0x77, 0x57, 0x2b, 0xed, 0x4a, 0xbb,
+ 0x7a, 0x20, 0xb4, 0x12, 0x12, 0x7e, 0x80, 0x1e, 0x08, 0xb0, 0x31, 0x36,
+ 0x9c, 0x02, 0xb5, 0x63, 0xd0, 0x0a, 0x24, 0x70, 0x93, 0xda, 0x24, 0x81,
+ 0xf8, 0x1c, 0xc7, 0x39, 0xf5, 0x49, 0x6d, 0x62, 0x37, 0x07, 0x6c, 0x04,
+ 0xd8, 0x75, 0x82, 0xab, 0xc4, 0x75, 0x4a, 0x8c, 0x54, 0x3b, 0xad, 0xc3,
+ 0x69, 0x4c, 0xeb, 0xe4, 0x70, 0xda, 0xb4, 0x91, 0x0d, 0x7e, 0x61, 0x1e,
+ 0x32, 0x48, 0x22, 0xad, 0xeb, 0x1a, 0x0c, 0x18, 0x4c, 0x8c, 0x41, 0x36,
+ 0xa0, 0x37, 0x7a, 0x3f, 0x56, 0x48, 0x2b, 0x69, 0xf7, 0x37, 0xfd, 0x43,
+ 0x42, 0x68, 0xd9, 0xdf, 0xae, 0x56, 0xab, 0x45, 0xd4, 0x29, 0xdf, 0x73,
+ 0xf4, 0x87, 0xee, 0xcc, 0x6f, 0xee, 0xcc, 0xec, 0xbd, 0x73, 0xef, 0xcc,
+ 0x6f, 0x7e, 0x70, 0x03, 0x37, 0xf0, 0xff, 0x1a, 0xea, 0x5a, 0x09, 0x5e,
+ 0x55, 0x52, 0x62, 0xec, 0xac, 0x9e, 0x3c, 0xd7, 0x20, 0xea, 0x1b, 0xa2,
+ 0xf8, 0xba, 0xc0, 0x4b, 0xa5, 0x1b, 0x72, 0xfe, 0x2d, 0x98, 0x67, 0xf3,
+ 0x8b, 0x2a, 0x1e, 0x56, 0x50, 0xa8, 0x29, 0x76, 0x2b, 0x4d, 0xde, 0x8d,
+ 0xbd, 0xd4, 0xfc, 0xfb, 0xd7, 0x0b, 0x57, 0xf7, 0x5f, 0x0b, 0x3d, 0xc3,
+ 0xee, 0x80, 0xbc, 0xa2, 0xb2, 0x79, 0x88, 0x7a, 0x54, 0x29, 0xbe, 0x03,
+ 0xc4, 0x8f, 0x20, 0x7d, 0xd1, 0x62, 0xb3, 0xcd, 0x3a, 0xba, 0x66, 0xfe,
+ 0x40, 0xa0, 0xe7, 0xe7, 0xfd, 0xea, 0x63, 0xd3, 0x64, 0xa7, 0xf3, 0x34,
+ 0x90, 0x3e, 0x62, 0xb8, 0x43, 0x84, 0xdf, 0xa1, 0x64, 0x7b, 0xe9, 0x06,
+ 0xc7, 0xd1, 0x70, 0xea, 0x1b, 0x36, 0x07, 0xe4, 0x6d, 0x2d, 0x5b, 0x60,
+ 0x50, 0x86, 0x9f, 0x09, 0xe2, 0xf0, 0xcb, 0x24, 0xea, 0xb1, 0xfd, 0x1b,
+ 0x97, 0x6c, 0x0f, 0x24, 0x67, 0x79, 0x71, 0xf9, 0x1a, 0x11, 0xfe, 0xc9,
+ 0x1f, 0x5d, 0xa1, 0xca, 0x34, 0xd1, 0x9e, 0x2d, 0xdd, 0xe8, 0xf8, 0x68,
+ 0x1c, 0xea, 0x0e, 0xc3, 0x10, 0x0e, 0x21, 0x83, 0x50, 0x8f, 0x04, 0x34,
+ 0x1e, 0x40, 0xc9, 0x5f, 0xaf, 0x2a, 0x29, 0x31, 0xfa, 0x23, 0xaf, 0x2a,
+ 0x29, 0x31, 0x8a, 0xb0, 0x31, 0x90, 0x08, 0x41, 0x1c, 0x4a, 0xa9, 0xbf,
+ 0x08, 0x4d, 0x47, 0x5f, 0x84, 0xcd, 0x01, 0x4a, 0xd1, 0x1d, 0x04, 0xdb,
+ 0xb4, 0xae, 0x9a, 0xc9, 0x0f, 0xf8, 0x23, 0x3a, 0x6b, 0xec, 0xdf, 0xc4,
+ 0x7b, 0xe9, 0xeb, 0xcf, 0x25, 0x41, 0xcd, 0x15, 0x14, 0x22, 0xc2, 0x25,
+ 0x48, 0x09, 0xdd, 0x12, 0xcc, 0x86, 0x12, 0x55, 0x90, 0x57, 0x7c, 0xe8,
+ 0xb0, 0x28, 0x2d, 0xd9, 0x28, 0x62, 0x07, 0xf0, 0x28, 0xd5, 0xa4, 0xc4,
+ 0xd0, 0xa8, 0x89, 0xb6, 0x3e, 0xc8, 0x3d, 0x79, 0x69, 0x1c, 0xaa, 0x7a,
+ 0x21, 0x6c, 0x0e, 0xd0, 0x94, 0xea, 0x54, 0x48, 0x30, 0xac, 0x8b, 0x94,
+ 0x68, 0xd5, 0x4a, 0x40, 0x86, 0x42, 0x90, 0x41, 0x00, 0xb4, 0xa0, 0xe7,
+ 0x12, 0xe8, 0x08, 0x45, 0x47, 0x3d, 0x84, 0x2f, 0x06, 0x88, 0x34, 0x84,
+ 0x4d, 0xd6, 0xe8, 0x93, 0xd5, 0x87, 0x4b, 0x52, 0xd8, 0x1c, 0x60, 0x34,
+ 0x4e, 0x9c, 0x03, 0x44, 0xc9, 0xc5, 0x70, 0xc9, 0x0a, 0x9b, 0x03, 0x3c,
+ 0x9a, 0x4a, 0x08, 0x97, 0xac, 0xd1, 0x61, 0x98, 0x14, 0x36, 0x49, 0x01,
+ 0xa9, 0x22, 0x2a, 0xaf, 0xa8, 0x3c, 0x3b, 0x10, 0xcb, 0x92, 0xc2, 0x72,
+ 0x73, 0x5e, 0x71, 0xc5, 0x2f, 0x14, 0xb2, 0x33, 0x5c, 0x4a, 0x8d, 0x06,
+ 0x85, 0xec, 0xcc, 0x2f, 0x2a, 0x7f, 0x79, 0x49, 0x61, 0xb9, 0x39, 0x10,
+ 0x5f, 0x5e, 0x51, 0x79, 0x36, 0x12, 0x38, 0x34, 0x07, 0x24, 0xe6, 0x15,
+ 0x97, 0xff, 0x8d, 0x12, 0x79, 0x0e, 0xd4, 0x6b, 0xee, 0x08, 0xcf, 0x8f,
+ 0x0f, 0x3e, 0xb9, 0xb4, 0x71, 0x24, 0x7d, 0xd9, 0x8b, 0x87, 0x32, 0x0d,
+ 0x06, 0x79, 0x03, 0x64, 0x4e, 0xf0, 0xea, 0x87, 0x13, 0xea, 0xa4, 0xa6,
+ 0xa9, 0x6f, 0xbf, 0xbf, 0x69, 0x71, 0xe5, 0xc8, 0xd1, 0xdc, 0x97, 0x0f,
+ 0x24, 0x1b, 0x3d, 0xc6, 0x17, 0x94, 0xc8, 0x23, 0xa2, 0xd4, 0x4f, 0x4b,
+ 0x0b, 0x72, 0x7e, 0xe2, 0x57, 0x82, 0x3f, 0x42, 0xfe, 0xd6, 0xb2, 0xfb,
+ 0x51, 0xec, 0x02, 0x75, 0x79, 0x95, 0x74, 0x0a, 0xb2, 0xa9, 0xb4, 0x20,
+ 0x67, 0x3b, 0x4a, 0x49, 0xfe, 0xd6, 0xf2, 0xa5, 0x28, 0x4a, 0x80, 0x09,
+ 0x5c, 0xfa, 0xba, 0x68, 0x57, 0x4a, 0x56, 0xed, 0x2b, 0x70, 0x1c, 0x44,
+ 0x44, 0x2d, 0xff, 0xfb, 0x8a, 0xc7, 0x44, 0xd4, 0x8b, 0x20, 0xb1, 0x83,
+ 0x64, 0xd1, 0x94, 0x62, 0xe5, 0xbe, 0x02, 0xc7, 0x3b, 0x7a, 0x0f, 0xeb,
+ 0x3a, 0x60, 0x45, 0xd1, 0x81, 0x59, 0x1a, 0xc6, 0xff, 0x01, 0x6c, 0x3a,
+ 0xe4, 0x83, 0xa2, 0xd4, 0x4e, 0x25, 0xf2, 0x12, 0x10, 0x15, 0x26, 0x23,
+ 0xc6, 0x8b, 0x3e, 0x51, 0xea, 0x29, 0x25, 0xf2, 0x2d, 0x20, 0xd7, 0x97,
+ 0xac, 0xba, 0x3c, 0x46, 0xb5, 0xf0, 0xc0, 0x53, 0x8b, 0x4f, 0xfb, 0x50,
+ 0xae, 0x1e, 0x58, 0x55, 0x58, 0x12, 0xd9, 0x65, 0x4d, 0x3a, 0x0a, 0xdc,
+ 0x76, 0x2d, 0x34, 0xbd, 0x7e, 0x50, 0x27, 0x5b, 0x6c, 0xd6, 0xf9, 0x57,
+ 0x27, 0x63, 0x3e, 0x41, 0xb0, 0xcb, 0x66, 0x7f, 0x9a, 0x3f, 0x3a, 0xe3,
+ 0x01, 0x64, 0x4e, 0x62, 0xb7, 0x73, 0xd3, 0xd5, 0xa3, 0x5e, 0x2b, 0xe0,
+ 0xbe, 0xe2, 0x03, 0x59, 0x1e, 0x31, 0x9e, 0x00, 0x02, 0x46, 0xd7, 0xaf,
+ 0x30, 0xfa, 0x0c, 0x78, 0xee, 0xda, 0xbb, 0x61, 0xe9, 0x67, 0x97, 0x07,
+ 0xbc, 0x56, 0x80, 0x47, 0x22, 0xb6, 0xf3, 0xc7, 0x6b, 0x3c, 0x40, 0x94,
+ 0x47, 0x8c, 0xdb, 0x46, 0x0e, 0x5c, 0xb5, 0x05, 0xe4, 0xec, 0x44, 0x6a,
+ 0x73, 0x3d, 0xa0, 0x0c, 0xde, 0x36, 0x7a, 0x3b, 0xc0, 0xd0, 0xf7, 0x34,
+ 0x42, 0xf3, 0x84, 0x6a, 0x34, 0xb1, 0x68, 0x8d, 0x14, 0xf5, 0xec, 0xc8,
+ 0x01, 0x2f, 0x07, 0xec, 0x5f, 0xbf, 0xbc, 0x4d, 0x54, 0xe0, 0x82, 0xc4,
+ 0x57, 0x1a, 0x4a, 0xd6, 0xbf, 0xbb, 0x21, 0xa7, 0xc5, 0x6b, 0x48, 0x8f,
+ 0x2f, 0x7f, 0x6b, 0xf9, 0x1b, 0x28, 0xbe, 0x35, 0x31, 0x5a, 0x4d, 0x10,
+ 0x14, 0x6f, 0xef, 0x2f, 0xc8, 0xf1, 0x29, 0xc6, 0xe8, 0xe6, 0x02, 0x86,
+ 0x28, 0xe3, 0xe3, 0x40, 0xd8, 0x32, 0xae, 0xeb, 0x0e, 0xa1, 0xd9, 0x6d,
+ 0xf4, 0xac, 0xd1, 0x23, 0xe9, 0x3a, 0x60, 0xef, 0xda, 0x7b, 0x9b, 0x45,
+ 0xf1, 0xca, 0xb5, 0xd5, 0x6a, 0xe2, 0x20, 0x06, 0x7e, 0x71, 0x75, 0x1e,
+ 0x73, 0x19, 0x7e, 0x2b, 0x42, 0x06, 0x4d, 0xf5, 0x8b, 0x1a, 0xbd, 0xc2,
+ 0x93, 0x68, 0x8d, 0xc2, 0x31, 0x33, 0x99, 0x69, 0x49, 0x31, 0x00, 0x9c,
+ 0x6b, 0xee, 0xa6, 0xec, 0xb3, 0x46, 0xda, 0x2e, 0x85, 0xbf, 0x8c, 0x9f,
+ 0x95, 0x62, 0xe3, 0x6b, 0x59, 0x49, 0xd8, 0x63, 0xcd, 0xb8, 0xfa, 0x3d,
+ 0x9c, 0xa8, 0xe9, 0xe0, 0xf7, 0x67, 0x9b, 0x71, 0x7b, 0x02, 0x57, 0x93,
+ 0x0c, 0x9a, 0xf2, 0xab, 0xcc, 0xb8, 0x4a, 0x62, 0xcb, 0x6f, 0x9f, 0xc2,
+ 0x0f, 0x72, 0x32, 0x30, 0x9b, 0xae, 0x14, 0x7a, 0x1d, 0x33, 0x93, 0x79,
+ 0x68, 0xd1, 0xad, 0x6c, 0x3b, 0x58, 0xc9, 0xfb, 0x7f, 0x08, 0xcf, 0x2e,
+ 0x32, 0x19, 0x0d, 0xac, 0x5d, 0x96, 0xc5, 0xb2, 0xd9, 0x29, 0x5e, 0xe3,
+ 0xf9, 0xb7, 0x4f, 0xe1, 0xa1, 0x45, 0xb7, 0xf2, 0xfc, 0x3b, 0xa7, 0xb8,
+ 0xd0, 0x12, 0x5a, 0x99, 0x30, 0xe4, 0x82, 0x88, 0x63, 0x66, 0x32, 0x4f,
+ 0xe6, 0xcd, 0x18, 0x36, 0xbe, 0xb6, 0xb6, 0x8e, 0xc3, 0x1f, 0x1d, 0xa6,
+ 0xaa, 0xaa, 0x0a, 0x8b, 0xc9, 0x48, 0xc1, 0xf2, 0x6c, 0x96, 0x64, 0xdb,
+ 0x43, 0x15, 0xef, 0x85, 0x8d, 0x2b, 0xb2, 0x59, 0x36, 0x3b, 0x05, 0xb7,
+ 0xdb, 0xcd, 0xa9, 0x53, 0xa7, 0x38, 0x7c, 0xf8, 0x08, 0x4e, 0xa7, 0x13,
+ 0x80, 0xb4, 0x04, 0x0b, 0x2f, 0xae, 0x9e, 0x8b, 0x3d, 0x36, 0xb4, 0xfb,
+ 0x5b, 0x48, 0x2b, 0x20, 0x26, 0x2a, 0x82, 0xc7, 0x1d, 0x19, 0x00, 0xf4,
+ 0xf7, 0xf7, 0xf3, 0xca, 0x3f, 0xfe, 0x92, 0xdd, 0xbb, 0x77, 0x0f, 0xd3,
+ 0x1d, 0xb9, 0x0e, 0xd6, 0xaf, 0x7f, 0x8a, 0x27, 0x1c, 0x99, 0x1c, 0x3e,
+ 0xd7, 0x46, 0x4f, 0xbf, 0x5b, 0x57, 0x8e, 0xc9, 0x68, 0x20, 0x21, 0x26,
+ 0x92, 0xe6, 0x2e, 0x97, 0xdf, 0x72, 0xea, 0x82, 0xe9, 0x89, 0xdc, 0x3b,
+ 0xc3, 0xce, 0xb9, 0x73, 0xe7, 0x78, 0xfe, 0xa7, 0xcf, 0x53, 0x55, 0x55,
+ 0x0d, 0x40, 0x74, 0x74, 0x34, 0xeb, 0xd6, 0xad, 0x65, 0x59, 0xde, 0x32,
+ 0x62, 0x2d, 0x26, 0x1e, 0x5d, 0x9c, 0xce, 0x0b, 0xef, 0xfe, 0x61, 0xcc,
+ 0xb6, 0x84, 0xb4, 0x02, 0xee, 0x9d, 0x91, 0x84, 0xcd, 0x6c, 0x02, 0xe0,
+ 0xb5, 0xd7, 0x7e, 0xed, 0x65, 0x3c, 0x40, 0xd9, 0xc1, 0x32, 0xb6, 0xfd,
+ 0x72, 0x1b, 0xb1, 0x16, 0x13, 0x77, 0x67, 0x4e, 0xd6, 0x95, 0x61, 0x8f,
+ 0x35, 0xf3, 0x9b, 0xbf, 0x5c, 0xc0, 0x8e, 0x47, 0x17, 0xf2, 0xdc, 0xfd,
+ 0xb7, 0xf9, 0x2d, 0x4c, 0xac, 0x98, 0x33, 0x05, 0x97, 0xcb, 0xc5, 0xe6,
+ 0x1f, 0x6f, 0x1e, 0x36, 0x1e, 0xa0, 0xa7, 0xa7, 0x87, 0x2d, 0x5b, 0x7e,
+ 0xce, 0xa7, 0x9f, 0x9e, 0x02, 0xe0, 0x9e, 0xcc, 0xc9, 0xc4, 0x47, 0x47,
+ 0x8e, 0xd9, 0x96, 0x90, 0x1c, 0x90, 0x95, 0x3c, 0x58, 0x6b, 0xe8, 0xee,
+ 0xee, 0x66, 0xd7, 0xce, 0x5d, 0xba, 0x3c, 0x7b, 0xf7, 0xee, 0xa3, 0xa9,
+ 0xa9, 0x89, 0x19, 0x53, 0x62, 0x75, 0xe9, 0xf7, 0x64, 0x26, 0x91, 0x68,
+ 0x1d, 0x2c, 0x27, 0x2c, 0xca, 0x98, 0x4c, 0x4a, 0x9c, 0x45, 0x7f, 0xae,
+ 0x94, 0x58, 0xf6, 0xec, 0xd9, 0x43, 0x43, 0x83, 0x6f, 0x3c, 0x11, 0x11,
+ 0x76, 0xec, 0xd8, 0x01, 0x80, 0x52, 0x8a, 0xcc, 0x64, 0xeb, 0x98, 0x6d,
+ 0x09, 0xc9, 0x01, 0x96, 0xc8, 0xc1, 0x7d, 0x5f, 0x57, 0x57, 0x87, 0xdb,
+ 0xad, 0xbf, 0xbc, 0x45, 0x84, 0xaa, 0xaa, 0x2a, 0xa2, 0x23, 0xf5, 0xdf,
+ 0x84, 0x45, 0x45, 0x78, 0x4f, 0x1d, 0x65, 0xd2, 0x57, 0xc5, 0x12, 0x69,
+ 0xa4, 0xba, 0xba, 0xc6, 0xaf, 0x2e, 0xd5, 0x23, 0x56, 0x85, 0x25, 0x72,
+ 0xec, 0x3b, 0x3a, 0x24, 0x07, 0xb4, 0x74, 0xf7, 0x01, 0x10, 0x17, 0x17,
+ 0x17, 0x90, 0x2f, 0x3e, 0x3e, 0x9e, 0x16, 0x67, 0x5f, 0x28, 0x53, 0x0c,
+ 0xa3, 0xd5, 0xd9, 0x47, 0x6c, 0xac, 0xfe, 0x2a, 0xba, 0x5a, 0x87, 0x50,
+ 0xe6, 0x0a, 0xc9, 0x01, 0xc7, 0x2e, 0xb4, 0x01, 0x90, 0x92, 0x92, 0xc2,
+ 0x9c, 0x39, 0xfa, 0xf5, 0xd0, 0xf4, 0xf4, 0x74, 0x32, 0xd2, 0x33, 0x38,
+ 0x3a, 0xc4, 0x1b, 0x2a, 0x8e, 0x56, 0xb5, 0x93, 0x9b, 0xeb, 0x20, 0x22,
+ 0x42, 0xff, 0xd7, 0xcd, 0xcf, 0xcf, 0x03, 0xc0, 0xe9, 0x1a, 0xe0, 0xec,
+ 0xc5, 0xae, 0x31, 0xcb, 0x0f, 0xc9, 0x01, 0xc7, 0xab, 0xda, 0x39, 0x33,
+ 0x34, 0xd9, 0x86, 0x8d, 0x05, 0xd8, 0xed, 0xde, 0xc7, 0x5d, 0x42, 0x42,
+ 0x02, 0x9b, 0x9e, 0xde, 0xc4, 0xe9, 0x8b, 0x5d, 0x9c, 0xa8, 0x19, 0xdf,
+ 0x5b, 0xac, 0x37, 0x8f, 0xd6, 0x30, 0x25, 0xed, 0x26, 0x7e, 0xf0, 0xf8,
+ 0x1a, 0x0c, 0x06, 0x6f, 0x75, 0x17, 0x2d, 0x5a, 0xc8, 0xca, 0x6f, 0xae,
+ 0x04, 0xe0, 0x8d, 0x23, 0x35, 0xb8, 0xb5, 0xa0, 0x5e, 0xcd, 0x79, 0x21,
+ 0xa4, 0x63, 0x50, 0x80, 0x9f, 0xbf, 0x77, 0x9a, 0xe2, 0x07, 0xef, 0x64,
+ 0xea, 0xd4, 0xa9, 0x6c, 0xff, 0xe7, 0x57, 0x79, 0xeb, 0xcd, 0xb7, 0xa8,
+ 0xae, 0xae, 0x21, 0x35, 0x2d, 0x95, 0x07, 0x1e, 0xb8, 0x1f, 0xcd, 0x14,
+ 0x4d, 0xc1, 0x7f, 0x1c, 0x0f, 0x45, 0xbc, 0x17, 0x2e, 0x76, 0xba, 0x78,
+ 0xb9, 0xf4, 0x0c, 0x1b, 0x56, 0xae, 0x24, 0x3b, 0x3b, 0x9b, 0xf7, 0x4b,
+ 0x0f, 0xd0, 0xdb, 0xdb, 0xcb, 0xbc, 0xf9, 0xf3, 0x58, 0xba, 0x34, 0x17,
+ 0xa5, 0x14, 0x47, 0xce, 0xb7, 0xf1, 0xfa, 0x11, 0xff, 0x71, 0x22, 0x10,
+ 0x42, 0xbe, 0x09, 0xd6, 0x77, 0xf4, 0xb2, 0xee, 0xb7, 0xc7, 0x78, 0xc2,
+ 0x91, 0xc1, 0x82, 0xe9, 0x89, 0x3c, 0xfc, 0xbd, 0x87, 0x81, 0xc1, 0xe0,
+ 0xf7, 0xe1, 0x17, 0xad, 0x6c, 0x2b, 0x3f, 0x16, 0x70, 0x4f, 0xb6, 0xf7,
+ 0x5c, 0xb9, 0x9d, 0x8a, 0x08, 0x1d, 0x3d, 0xfe, 0x1b, 0x47, 0xca, 0x4e,
+ 0x37, 0xd2, 0xde, 0xd3, 0xcf, 0xe3, 0x8e, 0x4c, 0xd6, 0x3d, 0xb9, 0x76,
+ 0x78, 0xbc, 0x77, 0xc0, 0xc3, 0x9b, 0x47, 0x6b, 0xf9, 0xed, 0x87, 0x17,
+ 0xd0, 0x64, 0xec, 0xbf, 0x3e, 0x8c, 0xf3, 0x2a, 0xdc, 0xd4, 0xe5, 0xa2,
+ 0xf0, 0xad, 0x53, 0x4c, 0x8a, 0x89, 0x24, 0xdd, 0x3e, 0x58, 0x41, 0xff,
+ 0xb2, 0xc9, 0x19, 0x54, 0x1e, 0x50, 0x76, 0xba, 0x91, 0xd9, 0x69, 0x71,
+ 0x64, 0xa5, 0xd8, 0x78, 0xe7, 0x78, 0x1d, 0x1d, 0x3d, 0x81, 0x9f, 0x39,
+ 0x5e, 0xd5, 0xce, 0x63, 0xbf, 0x3e, 0xcc, 0xb4, 0x24, 0x2b, 0x29, 0x71,
+ 0x66, 0xba, 0x5d, 0x6e, 0xce, 0x36, 0x3a, 0xe9, 0x1b, 0xf0, 0x8c, 0xc7,
+ 0x04, 0xff, 0x0e, 0x98, 0x96, 0x14, 0x93, 0x7a, 0xae, 0x25, 0xb8, 0x3e,
+ 0x84, 0xb6, 0x4b, 0xfd, 0xb4, 0x9d, 0x6f, 0x1d, 0xd3, 0xc4, 0xfd, 0x6e,
+ 0x8d, 0xe2, 0x7d, 0x9f, 0x8f, 0xe9, 0x19, 0x80, 0xf3, 0xcd, 0xdd, 0x9c,
+ 0x6f, 0x1e, 0x5b, 0x7f, 0x44, 0x4a, 0xbc, 0xd9, 0xef, 0xbb, 0x44, 0x9f,
+ 0x20, 0xb8, 0xe2, 0x1f, 0xf6, 0x44, 0x01, 0x14, 0x3f, 0x38, 0x77, 0xee,
+ 0x33, 0x7f, 0x36, 0x8b, 0xd9, 0x69, 0x81, 0x8f, 0xba, 0xff, 0xcb, 0x88,
+ 0x30, 0x1a, 0xb8, 0xff, 0xae, 0xa9, 0x3c, 0xfb, 0xf5, 0x59, 0x7e, 0xbb,
+ 0x4e, 0xbc, 0x6e, 0xa0, 0x4b, 0x0a, 0xcb, 0x23, 0xa2, 0xac, 0x34, 0xa7,
+ 0x25, 0x44, 0x1f, 0x7b, 0xc2, 0x91, 0xe1, 0xb8, 0xf3, 0x96, 0x04, 0xba,
+ 0x5d, 0x6e, 0x56, 0x6f, 0xfb, 0xc0, 0xeb, 0xa1, 0x8c, 0x64, 0x1b, 0xcd,
+ 0x5d, 0x2e, 0x3a, 0x7b, 0x03, 0x36, 0x7c, 0x4d, 0x18, 0x0c, 0x4a, 0x31,
+ 0x75, 0x52, 0x34, 0x97, 0xfa, 0xdc, 0xb4, 0x76, 0x5f, 0x89, 0x3b, 0x77,
+ 0x67, 0x26, 0xb1, 0xf9, 0xcf, 0x67, 0xd3, 0xd5, 0x3b, 0xe0, 0x79, 0xa6,
+ 0xe4, 0x93, 0x17, 0xce, 0xb7, 0x5e, 0xca, 0x55, 0xa6, 0xde, 0xdc, 0xbd,
+ 0x6b, 0xef, 0x1b, 0x66, 0xf2, 0xda, 0x02, 0x11, 0x66, 0x77, 0x2a, 0x44,
+ 0xc4, 0xd7, 0xb5, 0xf7, 0x38, 0x7e, 0xb4, 0xf3, 0x24, 0xeb, 0x96, 0xcd,
+ 0x60, 0xc9, 0x4c, 0xef, 0x23, 0xee, 0xe6, 0x49, 0xd1, 0xbc, 0xf2, 0xdd,
+ 0x79, 0xc0, 0x60, 0x0c, 0xa8, 0x6c, 0x74, 0x52, 0xd9, 0xd8, 0x4d, 0x65,
+ 0xa3, 0x93, 0xb3, 0x17, 0x9d, 0x38, 0x5d, 0xd7, 0xd6, 0x29, 0x4a, 0x41,
+ 0x5a, 0x42, 0x34, 0x59, 0xc9, 0x36, 0x32, 0x92, 0x6d, 0x64, 0x25, 0xdb,
+ 0x48, 0x4f, 0xb6, 0x62, 0x31, 0x19, 0xf9, 0xb4, 0xb6, 0x83, 0x8d, 0xbf,
+ 0xfb, 0x64, 0x98, 0x37, 0x72, 0xe8, 0xb6, 0xf9, 0xa3, 0x9d, 0x27, 0x8d,
+ 0xe7, 0x5a, 0x2e, 0x3d, 0x07, 0x80, 0xc7, 0x32, 0x05, 0xb8, 0x30, 0x6c,
+ 0xb3, 0x97, 0xf4, 0xa8, 0xc8, 0x18, 0x46, 0x14, 0x17, 0x44, 0x27, 0x47,
+ 0x33, 0x0f, 0x5d, 0x6d, 0x3f, 0xad, 0xed, 0x20, 0xca, 0x64, 0x64, 0xc1,
+ 0xf4, 0x44, 0xee, 0xce, 0x4c, 0x1a, 0xa6, 0x1f, 0x39, 0xdf, 0xc6, 0xe6,
+ 0x5d, 0x27, 0x75, 0x95, 0xcf, 0x4a, 0xb1, 0x11, 0x13, 0x35, 0x38, 0xa5,
+ 0xdb, 0x23, 0xb8, 0x86, 0x02, 0x98, 0x02, 0x62, 0xcc, 0x57, 0x54, 0xa9,
+ 0x6e, 0xed, 0xf1, 0xfa, 0x25, 0x2f, 0x23, 0xdd, 0x6e, 0x65, 0xcb, 0xaa,
+ 0x3b, 0x86, 0x13, 0x31, 0x80, 0x8e, 0x9e, 0x7e, 0x4e, 0xd5, 0x76, 0x32,
+ 0x3d, 0x29, 0x06, 0x8b, 0xc9, 0x6f, 0x03, 0xda, 0x30, 0xdc, 0x18, 0xbc,
+ 0x92, 0x0e, 0x2f, 0x07, 0x98, 0x8c, 0xaa, 0x45, 0x0b, 0x32, 0xa8, 0xbe,
+ 0x77, 0xa2, 0x9e, 0x8a, 0xcf, 0x9b, 0x88, 0x30, 0x28, 0xa6, 0x25, 0x59,
+ 0xc9, 0x4c, 0xb6, 0xf1, 0x8d, 0xb9, 0xa9, 0xdc, 0x36, 0x55, 0x3f, 0x66,
+ 0xcc, 0x4e, 0x8b, 0xa3, 0xf8, 0xc1, 0x3b, 0x83, 0x92, 0x5d, 0xd5, 0x7a,
+ 0x89, 0x35, 0xbf, 0x39, 0xe2, 0x33, 0x7e, 0x4b, 0x62, 0x0c, 0x36, 0xb3,
+ 0x89, 0x3d, 0x27, 0xeb, 0xf9, 0xf8, 0x42, 0x1b, 0x5f, 0x34, 0x76, 0xd3,
+ 0xd4, 0xe5, 0x02, 0xe0, 0xc5, 0xd5, 0x73, 0xfd, 0xe6, 0x1d, 0x23, 0x21,
+ 0xbd, 0x03, 0x4d, 0x23, 0xff, 0xf7, 0x72, 0xc0, 0xde, 0xb5, 0xf7, 0x36,
+ 0xe7, 0x17, 0x55, 0xd4, 0x83, 0xa4, 0x02, 0x68, 0x9a, 0x60, 0x36, 0x19,
+ 0xf9, 0xbb, 0x6f, 0xdf, 0xc1, 0xa1, 0x33, 0x4d, 0x7c, 0x50, 0xe9, 0x55,
+ 0x51, 0x06, 0xc0, 0xad, 0xc9, 0xd0, 0x36, 0x70, 0x92, 0x91, 0x6c, 0x25,
+ 0x25, 0x5e, 0x3f, 0xab, 0xb3, 0x0d, 0xfd, 0xc2, 0xbb, 0x8e, 0xd6, 0x50,
+ 0xdb, 0xd6, 0xeb, 0x57, 0xc1, 0xe5, 0xb7, 0x4f, 0x21, 0xd1, 0x1a, 0x38,
+ 0xad, 0xdd, 0x7b, 0xb2, 0x81, 0xca, 0x46, 0xa7, 0x5f, 0xfa, 0xf4, 0x24,
+ 0x2b, 0x8b, 0xb3, 0xed, 0xe4, 0x0c, 0x15, 0x64, 0x3c, 0x57, 0x6e, 0x88,
+ 0xb5, 0x07, 0x9f, 0x5d, 0xea, 0x75, 0x5c, 0xf9, 0x1e, 0x83, 0xc2, 0x01,
+ 0x14, 0xdf, 0x03, 0x78, 0xfb, 0x78, 0x1d, 0x56, 0xb3, 0x89, 0x85, 0xe9,
+ 0x89, 0xdc, 0x79, 0x4b, 0x02, 0x3f, 0xcc, 0xcd, 0xe4, 0x5c, 0x88, 0xa5,
+ 0xa7, 0xcb, 0xf8, 0xe8, 0xcb, 0xd6, 0x80, 0xd7, 0xe3, 0x39, 0x37, 0xc5,
+ 0x8f, 0xea, 0x00, 0x7f, 0x48, 0x8e, 0x33, 0xb3, 0xfd, 0x91, 0x3f, 0xe1,
+ 0xa6, 0x49, 0xd1, 0xc0, 0xe0, 0x65, 0x6d, 0xc7, 0x07, 0xe7, 0x47, 0x96,
+ 0xcb, 0x0e, 0x5c, 0xfd, 0x8c, 0x8f, 0x03, 0x94, 0x92, 0xed, 0xc2, 0xa0,
+ 0x03, 0x6a, 0xda, 0x7a, 0xd8, 0xf2, 0xde, 0x67, 0x44, 0x99, 0x8c, 0x2c,
+ 0x9c, 0x9e, 0xc8, 0xe2, 0x19, 0x76, 0xe6, 0x4f, 0x1b, 0x3c, 0x52, 0xfb,
+ 0xfd, 0x14, 0x22, 0x0d, 0x0c, 0x06, 0x9f, 0x7e, 0x77, 0xf0, 0x6d, 0x6f,
+ 0xc1, 0x22, 0x32, 0xc2, 0x7f, 0xea, 0x32, 0xe0, 0xd1, 0xb0, 0x99, 0x4d,
+ 0xf4, 0xf6, 0x7b, 0x78, 0xe3, 0xe3, 0x1a, 0x0e, 0x7d, 0xde, 0xe4, 0xb3,
+ 0x4a, 0x44, 0x69, 0x3e, 0x6d, 0xba, 0x3e, 0x0e, 0xd8, 0xb7, 0x21, 0xe7,
+ 0xbf, 0xf2, 0xb6, 0x96, 0x1f, 0x52, 0x8a, 0xc5, 0x97, 0xc7, 0xfa, 0x06,
+ 0x3c, 0x1c, 0x3a, 0xd3, 0xc4, 0xa1, 0x33, 0x4d, 0x44, 0x47, 0x46, 0x30,
+ 0x3b, 0x2d, 0x96, 0xe3, 0x55, 0xed, 0x3e, 0x4a, 0xb8, 0x3d, 0x42, 0x94,
+ 0xc9, 0xc8, 0xdb, 0x6b, 0xbf, 0x46, 0xb3, 0xb3, 0x8f, 0xfa, 0x8e, 0x5e,
+ 0xea, 0xda, 0x07, 0xff, 0xe2, 0x2c, 0x26, 0x1f, 0x7e, 0x7f, 0x30, 0x19,
+ 0x0d, 0x38, 0x66, 0x26, 0x93, 0x96, 0x60, 0x21, 0x2d, 0x21, 0x9a, 0xd4,
+ 0x04, 0x0b, 0xa9, 0xf1, 0x16, 0xac, 0x43, 0x01, 0x74, 0x40, 0xc7, 0xf9,
+ 0xaf, 0x1c, 0xa8, 0x24, 0x3e, 0xc6, 0xc4, 0xe7, 0xf5, 0x5d, 0xba, 0xe5,
+ 0x35, 0x85, 0x2a, 0xdb, 0x5f, 0x90, 0xfb, 0xdf, 0xa3, 0x3a, 0x00, 0x40,
+ 0x19, 0xe5, 0xaf, 0xd0, 0x0c, 0xc7, 0x40, 0x7c, 0xd6, 0x62, 0x4f, 0xbf,
+ 0x9b, 0x23, 0xe7, 0xf5, 0x53, 0xdc, 0xd7, 0x8f, 0x54, 0xd3, 0xd1, 0xd3,
+ 0xcf, 0xd4, 0x49, 0xd1, 0xa4, 0xc6, 0x5b, 0x48, 0xb7, 0x5b, 0x99, 0x7b,
+ 0xb3, 0x77, 0x07, 0xcd, 0x68, 0x19, 0x9b, 0x47, 0x13, 0x62, 0x2d, 0x26,
+ 0x36, 0xdd, 0x37, 0x13, 0x00, 0x4d, 0x84, 0xa6, 0xae, 0x3e, 0xce, 0x34,
+ 0x74, 0x51, 0xdf, 0xd1, 0xcb, 0x17, 0x8d, 0xdd, 0x54, 0xe9, 0x6c, 0xc3,
+ 0x86, 0xce, 0x5e, 0x1a, 0x3a, 0xfd, 0xc6, 0x96, 0x3e, 0xb7, 0x51, 0xfd,
+ 0x50, 0x8f, 0x10, 0xa0, 0x47, 0xa8, 0xe2, 0x51, 0x94, 0xbc, 0x1a, 0x50,
+ 0xdb, 0x20, 0x10, 0x6b, 0x31, 0x91, 0x1a, 0x6f, 0x21, 0x2d, 0xc1, 0x82,
+ 0xd5, 0x6c, 0x62, 0xf7, 0x27, 0x75, 0x23, 0x83, 0x92, 0x0f, 0x6e, 0x4e,
+ 0x8c, 0x61, 0xfe, 0xad, 0x09, 0x34, 0x74, 0xba, 0xa8, 0x6d, 0xeb, 0x91,
+ 0xfa, 0x4e, 0x17, 0x1e, 0x8f, 0x36, 0xae, 0xae, 0x76, 0x51, 0xf2, 0xfd,
+ 0xd2, 0x02, 0xc7, 0x6b, 0x7a, 0xb4, 0x80, 0x82, 0xf3, 0x8b, 0xcb, 0xb7,
+ 0x20, 0x3c, 0x3d, 0x9e, 0xc9, 0xaf, 0x37, 0x04, 0xfe, 0xb6, 0x74, 0x43,
+ 0xce, 0x66, 0x7f, 0xf4, 0x80, 0x05, 0x91, 0xfd, 0x05, 0x39, 0xcf, 0x28,
+ 0xe1, 0x27, 0x83, 0x72, 0xbe, 0x72, 0x10, 0x94, 0x7a, 0x2e, 0x90, 0xf1,
+ 0x10, 0xe4, 0x07, 0x13, 0xf9, 0x5b, 0xcb, 0x56, 0xa3, 0xd4, 0xbf, 0x00,
+ 0x63, 0x2f, 0xbb, 0x5e, 0x1f, 0x38, 0x51, 0xf2, 0xc8, 0xfe, 0x02, 0xc7,
+ 0xa8, 0xcd, 0x9b, 0x41, 0xef, 0xad, 0xbc, 0xad, 0x87, 0xa6, 0x29, 0xa5,
+ 0xbd, 0x0a, 0x2c, 0x1d, 0x97, 0x6a, 0xd7, 0x1a, 0x8a, 0xff, 0xd4, 0x3c,
+ 0x86, 0xef, 0x5f, 0xdd, 0x3c, 0xe9, 0x9f, 0x7d, 0x2c, 0x10, 0x51, 0x79,
+ 0x45, 0x15, 0xdf, 0x51, 0x8a, 0xe7, 0x81, 0x8c, 0x50, 0xf4, 0xbb, 0x86,
+ 0xa8, 0x14, 0xc5, 0xe6, 0xd2, 0xf5, 0x4b, 0x4a, 0x50, 0x41, 0xbc, 0xd5,
+ 0x1d, 0x42, 0x48, 0xd1, 0x75, 0xde, 0xaf, 0x3e, 0x36, 0x25, 0x75, 0x3b,
+ 0x1f, 0x12, 0xe1, 0x49, 0xe0, 0x8e, 0x50, 0x64, 0x84, 0x11, 0x9f, 0xa0,
+ 0xe4, 0xa5, 0x16, 0x6b, 0xec, 0xbf, 0x8f, 0xf6, 0x41, 0x96, 0x1e, 0xc6,
+ 0xfd, 0xd1, 0xd4, 0xf2, 0xa2, 0xf2, 0x7b, 0x34, 0xe1, 0xbb, 0x4a, 0xa9,
+ 0x55, 0x20, 0x61, 0xeb, 0xe2, 0x1e, 0x05, 0xad, 0xc0, 0xeb, 0x9a, 0x26,
+ 0xff, 0xfa, 0xfe, 0x26, 0xc7, 0x07, 0xa3, 0x72, 0x07, 0x40, 0xd8, 0xbe,
+ 0x1a, 0x5b, 0x52, 0x58, 0x1e, 0x11, 0x69, 0xd5, 0xfe, 0xd4, 0x80, 0x61,
+ 0x85, 0xc0, 0x62, 0xe0, 0x2e, 0xc2, 0xd7, 0x4a, 0xeb, 0x02, 0x8e, 0x8b,
+ 0x92, 0x0a, 0xe5, 0x31, 0xec, 0xed, 0xeb, 0x91, 0x0f, 0x2b, 0x0a, 0x73,
+ 0xf4, 0x5f, 0x49, 0x8d, 0x11, 0xd7, 0xee, 0xc3, 0xc9, 0xc2, 0x92, 0x48,
+ 0xa7, 0xd5, 0x7e, 0x87, 0x86, 0xcc, 0x42, 0xc9, 0x0c, 0x25, 0x6a, 0x3a,
+ 0x8a, 0x54, 0x84, 0x24, 0x50, 0x76, 0x10, 0xc5, 0x95, 0x46, 0xeb, 0x76,
+ 0x50, 0x02, 0xd2, 0x04, 0xaa, 0x09, 0xa4, 0x01, 0xd4, 0x97, 0x28, 0xed,
+ 0x8c, 0xa6, 0xd4, 0x67, 0x6d, 0x31, 0xb6, 0x13, 0xa1, 0x2c, 0xef, 0x1b,
+ 0xb8, 0x81, 0x1b, 0x18, 0x15, 0xff, 0x0b, 0x12, 0x38, 0x4d, 0x79, 0xd2,
+ 0x8f, 0xa8, 0xd2, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae,
+ 0x42, 0x60, 0x82
};
static const Color boot_splash_bg_color = Color(224/255.0,224/255.0,224/255.0);
diff --git a/methods.py b/methods.py
index 7128b334ec..74c282b8cf 100755
--- a/methods.py
+++ b/methods.py
@@ -1326,7 +1326,9 @@ def android_add_aidl_dir(self,subpath):
def android_add_jni_dir(self,subpath):
base_path = self.Dir(".").abspath+"/modules/"+self.current_module+"/"+subpath
self.android_jni_dirs.append(base_path)
-
+def android_add_default_config(self,config):
+ self.android_default_config.append(config)
+
def android_add_to_manifest(self,file):
base_path = self.Dir(".").abspath+"/modules/"+self.current_module+"/"+file
f = open(base_path,"rb")
diff --git a/modules/gdscript/gd_parser.cpp b/modules/gdscript/gd_parser.cpp
index 4a199eb6a8..e87bd99e4f 100644
--- a/modules/gdscript/gd_parser.cpp
+++ b/modules/gdscript/gd_parser.cpp
@@ -514,6 +514,7 @@ GDParser::Node* GDParser::_parse_expression(Node *p_parent,bool p_static,bool p_
} else if (/*tokenizer->get_token()==GDTokenizer::TK_OP_ADD ||*/ tokenizer->get_token()==GDTokenizer::TK_OP_SUB || tokenizer->get_token()==GDTokenizer::TK_OP_NOT || tokenizer->get_token()==GDTokenizer::TK_OP_BIT_INVERT) {
//single prefix operators like !expr -expr ++expr --expr
+ alloc_node<OperatorNode>();
Expression e;
e.is_op=true;
diff --git a/platform/android/SCsub b/platform/android/SCsub
index c8feac8690..0814f4a7bc 100644
--- a/platform/android/SCsub
+++ b/platform/android/SCsub
@@ -79,6 +79,11 @@ for x in env.android_jni_dirs:
gradle_asset_dirs_text=""
+gradle_default_config_text=""
+
+for x in env.android_default_config:
+ gradle_default_config_text+=x+"\n\t\t"
+
gradle_text = gradle_text.replace("$$GRADLE_REPOSITORY_URLS$$",gradle_maven_repos_text)
gradle_text = gradle_text.replace("$$GRADLE_DEPENDENCIES$$",gradle_maven_dependencies_text)
gradle_text = gradle_text.replace("$$GRADLE_JAVA_DIRS$$",gradle_java_dirs_text)
@@ -86,6 +91,7 @@ gradle_text = gradle_text.replace("$$GRADLE_RES_DIRS$$",gradle_res_dirs_text)
gradle_text = gradle_text.replace("$$GRADLE_ASSET_DIRS$$",gradle_asset_dirs_text)
gradle_text = gradle_text.replace("$$GRADLE_AIDL_DIRS$$",gradle_aidl_dirs_text)
gradle_text = gradle_text.replace("$$GRADLE_JNI_DIRS$$",gradle_jni_dirs_text)
+gradle_text = gradle_text.replace("$$GRADLE_DEFAULT_CONFIG$$",gradle_default_config_text)
gradle_baseout.write( gradle_text )
diff --git a/platform/android/build.gradle.template b/platform/android/build.gradle.template
index 1e1461ef29..9e617a9e9e 100644
--- a/platform/android/build.gradle.template
+++ b/platform/android/build.gradle.template
@@ -39,6 +39,7 @@ android {
defaultConfig {
minSdkVersion 14
targetSdkVersion 23
+ $$GRADLE_DEFAULT_CONFIG$$
}
sourceSets {
main {
diff --git a/platform/windows/os_windows.cpp b/platform/windows/os_windows.cpp
index 89de969cff..b0a50ca4b8 100644
--- a/platform/windows/os_windows.cpp
+++ b/platform/windows/os_windows.cpp
@@ -2178,6 +2178,68 @@ String OS_Windows::get_locale() const {
return "en";
}
+
+OS::LatinKeyboardVariant OS_Windows::get_latin_keyboard_variant() const {
+
+ unsigned long azerty[] = {
+ 0x00020401, // Arabic (102) AZERTY
+ 0x0001080c, // Belgian (Comma)
+ 0x0000080c, // Belgian French
+ 0x0000040c, // French
+ 0 // <--- STOP MARK
+ };
+ unsigned long qwertz[] = {
+ 0x0000041a, // Croation
+ 0x00000405, // Czech
+ 0x00000407, // German
+ 0x00010407, // German (IBM)
+ 0x0000040e, // Hungarian
+ 0x0000046e, // Luxembourgish
+ 0x00010415, // Polish (214)
+ 0x00000418, // Romanian (Legacy)
+ 0x0000081a, // Serbian (Latin)
+ 0x0000041b, // Slovak
+ 0x00000424, // Slovenian
+ 0x0001042e, // Sorbian Extended
+ 0x0002042e, // Sorbian Standard
+ 0x0000042e, // Sorbian Standard (Legacy)
+ 0x0000100c, // Swiss French
+ 0x00000807, // Swiss German
+ 0 // <--- STOP MARK
+ };
+ unsigned long dvorak[] = {
+ 0x00010409, // US-Dvorak
+ 0x00030409, // US-Dvorak for left hand
+ 0x00040409, // US-Dvorak for right hand
+ 0 // <--- STOP MARK
+ };
+
+ char name[ KL_NAMELENGTH + 1 ]; name[0] = 0;
+ GetKeyboardLayoutNameA( name );
+
+ unsigned long hex = strtoul(name, NULL, 16);
+
+ int i=0;
+ while( azerty[i] != 0 ) {
+ if (azerty[i] == hex) return LATIN_KEYBOARD_AZERTY;
+ i++;
+ }
+
+ i = 0;
+ while( qwertz[i] != 0 ) {
+ if (qwertz[i] == hex) return LATIN_KEYBOARD_QWERTZ;
+ i++;
+ }
+
+ i = 0;
+ while( dvorak[i] != 0 ) {
+ if (dvorak[i] == hex) return LATIN_KEYBOARD_DVORAK;
+ i++;
+ }
+
+ return LATIN_KEYBOARD_QWERTY;
+}
+
void OS_Windows::release_rendering_thread() {
gl_context->release_current();
diff --git a/platform/windows/os_windows.h b/platform/windows/os_windows.h
index d2249bf352..5acb300c0f 100644
--- a/platform/windows/os_windows.h
+++ b/platform/windows/os_windows.h
@@ -266,6 +266,7 @@ public:
virtual String get_executable_path() const;
virtual String get_locale() const;
+ virtual LatinKeyboardVariant get_latin_keyboard_variant() const;
virtual void move_window_to_foreground();
virtual String get_data_dir() const;
diff --git a/platform/x11/os_x11.cpp b/platform/x11/os_x11.cpp
index 846c61fd1f..20fae72abd 100644
--- a/platform/x11/os_x11.cpp
+++ b/platform/x11/os_x11.cpp
@@ -1773,7 +1773,6 @@ static String _get_clipboard(Atom p_source, Window x11_window, ::Display* x11_di
if (Sown == x11_window) {
- printf("returning internal clipboard\n");
return p_internal_clipboard;
};
diff --git a/scene/2d/camera_2d.cpp b/scene/2d/camera_2d.cpp
index 85256be940..f98a50e3e0 100644
--- a/scene/2d/camera_2d.cpp
+++ b/scene/2d/camera_2d.cpp
@@ -44,7 +44,6 @@ void Camera2D::_update_scroll() {
if (current) {
Matrix32 xform = get_camera_transform();
- RID vp = viewport->get_viewport();
if (viewport) {
viewport->set_canvas_transform( xform );
}
@@ -409,6 +408,35 @@ void Camera2D::force_update_scroll() {
_update_scroll();
}
+void Camera2D::reset_smoothing() {
+
+ smoothed_camera_pos = camera_pos;
+ _update_scroll();
+}
+
+void Camera2D::align() {
+
+ Size2 screen_size = get_viewport_rect().size;
+ screen_size=get_viewport_rect().size;
+ Point2 current_camera_pos = get_global_transform().get_origin();
+ if (anchor_mode==ANCHOR_MODE_DRAG_CENTER) {
+ if (h_ofs<0) {
+ camera_pos.x = current_camera_pos.x + screen_size.x * 0.5 * drag_margin[MARGIN_RIGHT] * h_ofs;
+ } else {
+ camera_pos.x = current_camera_pos.x + screen_size.x * 0.5 * drag_margin[MARGIN_LEFT] * h_ofs;
+ }
+ if (v_ofs<0) {
+ camera_pos.y = current_camera_pos.y + screen_size.y * 0.5 * drag_margin[MARGIN_TOP] * v_ofs;
+ } else {
+ camera_pos.y = current_camera_pos.y + screen_size.y * 0.5 * drag_margin[MARGIN_BOTTOM] * v_ofs;
+ }
+ } else if (anchor_mode==ANCHOR_MODE_FIXED_TOP_LEFT){
+
+ camera_pos=current_camera_pos;
+ }
+
+ _update_scroll();
+}
void Camera2D::set_follow_smoothing(float p_speed) {
@@ -544,6 +572,8 @@ void Camera2D::_bind_methods() {
ObjectTypeDB::bind_method(_MD("is_follow_smoothing_enabled"),&Camera2D::is_follow_smoothing_enabled);
ObjectTypeDB::bind_method(_MD("force_update_scroll"),&Camera2D::force_update_scroll);
+ ObjectTypeDB::bind_method(_MD("reset_smoothing"),&Camera2D::reset_smoothing);
+ ObjectTypeDB::bind_method(_MD("align"),&Camera2D::align);
ObjectTypeDB::bind_method(_MD("_set_old_smoothing","follow_smoothing"),&Camera2D::_set_old_smoothing);
diff --git a/scene/2d/camera_2d.h b/scene/2d/camera_2d.h
index 22e5bc382a..b3f55d798d 100644
--- a/scene/2d/camera_2d.h
+++ b/scene/2d/camera_2d.h
@@ -128,6 +128,8 @@ public:
Vector2 get_camera_pos() const;
void force_update_scroll();
+ void reset_smoothing();
+ void align();
Camera2D();
};
diff --git a/scene/2d/navigation2d.cpp b/scene/2d/navigation2d.cpp
index b4332cc75d..82c1327a8f 100644
--- a/scene/2d/navigation2d.cpp
+++ b/scene/2d/navigation2d.cpp
@@ -552,7 +552,6 @@ debug path
if (p_optimize) {
//string pulling
- Polygon *apex_poly=end_poly;
Vector2 apex_point=end_point;
Vector2 portal_left=apex_point;
Vector2 portal_right=apex_point;
@@ -613,12 +612,9 @@ debug path
//print_line("***ADVANCE LEFT");
} else {
- //_clip_path(path,apex_poly,portal_right,right_poly);
-
apex_point=portal_right;
p=right_poly;
left_poly=p;
- apex_poly=p;
portal_left=apex_point;
portal_right=apex_point;
if (path[path.size()-1].distance_to(apex_point)>CMP_EPSILON)
@@ -637,12 +633,9 @@ debug path
//print_line("***ADVANCE RIGHT");
} else {
- //_clip_path(path,apex_poly,portal_left,left_poly);
-
apex_point=portal_left;
p=left_poly;
right_poly=p;
- apex_poly=p;
portal_right=apex_point;
portal_left=apex_point;
if (path[path.size()-1].distance_to(apex_point)>CMP_EPSILON)
diff --git a/scene/2d/visibility_notifier_2d.cpp b/scene/2d/visibility_notifier_2d.cpp
index 12524a2192..5411950976 100644
--- a/scene/2d/visibility_notifier_2d.cpp
+++ b/scene/2d/visibility_notifier_2d.cpp
@@ -270,9 +270,6 @@ void VisibilityEnabler2D::_notification(int p_what){
return;
- Node *from = this;
- //find where current scene starts
-
for (Map<Node*,Variant>::Element *E=nodes.front();E;E=E->next()) {
if (!visible)
@@ -293,14 +290,7 @@ void VisibilityEnabler2D::_change_node_state(Node* p_node,bool p_enabled) {
RigidBody2D *rb = p_node->cast_to<RigidBody2D>();
if (rb) {
- if (p_enabled) {
- RigidBody2D::Mode mode = RigidBody2D::Mode(nodes[p_node].operator int());
- //rb->set_mode(mode);
- rb->set_sleeping(false);
- } else {
- //rb->set_mode(RigidBody2D::MODE_STATIC);
- rb->set_sleeping(true);
- }
+ rb->set_sleeping(!p_enabled);
}
}
diff --git a/scene/3d/physics_joint.cpp b/scene/3d/physics_joint.cpp
index 3f03b2aab3..084d96975f 100644
--- a/scene/3d/physics_joint.cpp
+++ b/scene/3d/physics_joint.cpp
@@ -369,9 +369,6 @@ RID HingeJoint::_configure_joint(PhysicsBody *body_a,PhysicsBody *body_b) {
Transform gt = get_global_transform();
- Vector3 hingepos = gt.origin;
- Vector3 hingedir = gt.basis.get_axis(2);
-
Transform ainv = body_a->get_global_transform().affine_inverse();
Transform local_a = ainv * gt;
@@ -532,9 +529,6 @@ RID SliderJoint::_configure_joint(PhysicsBody *body_a,PhysicsBody *body_b) {
Transform gt = get_global_transform();
- Vector3 sliderpos = gt.origin;
- Vector3 sliderdir = gt.basis.get_axis(2);
-
Transform ainv = body_a->get_global_transform().affine_inverse();
Transform local_a = ainv * gt;
diff --git a/scene/3d/vehicle_body.cpp b/scene/3d/vehicle_body.cpp
index 6ccf07db1e..7c7957640f 100644
--- a/scene/3d/vehicle_body.cpp
+++ b/scene/3d/vehicle_body.cpp
@@ -488,7 +488,6 @@ real_t VehicleBody::_ray_cast(int p_idx,PhysicsDirectBodyState *s) {
void VehicleBody::_update_suspension(PhysicsDirectBodyState *s)
{
- real_t deltaTime = s->get_step();
real_t chassisMass = mass;
for (int w_it=0; w_it<wheels.size(); w_it++)
@@ -596,21 +595,16 @@ void VehicleBody::_resolve_single_bilateral(PhysicsDirectBodyState *s, const Vec
b2invinertia,
b2invmass);
- real_t jacDiagAB = jac.getDiagonal();
- real_t jacDiagABInv = real_t(1.) / jacDiagAB;
-
real_t rel_vel = jac.getRelativeVelocity(
s->get_linear_velocity(),
s->get_transform().basis.transposed().xform(s->get_angular_velocity()),
b2lv,
b2trans.xform(b2av));
- real_t a;
- a=jacDiagABInv;
rel_vel = normal.dot(vel);
- //todo: move this into proper structure
+ //TODO: move this into proper structure
real_t contactDamping = real_t(0.4);
#define ONLY_USE_LINEAR_MASS
#ifdef ONLY_USE_LINEAR_MASS
@@ -642,16 +636,16 @@ VehicleBody::btVehicleWheelContactPoint::btVehicleWheelContactPoint(PhysicsDirec
denom0= s->get_inverse_mass() + frictionDirectionWorld.dot(vec);
}
+ /* TODO: Why is this code unused?
if (body1) {
Vector3 r0 = frictionPosWorld - body1->get_global_transform().origin;
Vector3 c0 = (r0).cross(frictionDirectionWorld);
Vector3 vec = s->get_inverse_inertia_tensor().xform_inv(c0).cross(r0);
//denom1= body1->get_inverse_mass() + frictionDirectionWorld.dot(vec);
- denom1=0;
}
-
+ */
real_t relaxation = 1.f;
m_jacDiagABInv = relaxation/(denom0+denom1);
diff --git a/scene/3d/visibility_notifier.cpp b/scene/3d/visibility_notifier.cpp
index 60097ad482..f3b5cde0eb 100644
--- a/scene/3d/visibility_notifier.cpp
+++ b/scene/3d/visibility_notifier.cpp
@@ -221,9 +221,6 @@ void VisibilityEnabler::_notification(int p_what){
return;
- Node *from = this;
- //find where current scene starts
-
for (Map<Node*,Variant>::Element *E=nodes.front();E;E=E->next()) {
if (!visible)
@@ -242,17 +239,9 @@ void VisibilityEnabler::_change_node_state(Node* p_node,bool p_enabled) {
{
RigidBody *rb = p_node->cast_to<RigidBody>();
- if (rb) {
-
- if (p_enabled) {
- RigidBody::Mode mode = RigidBody::Mode(nodes[p_node].operator int());
- //rb->set_mode(mode);
- rb->set_sleeping(false);
- } else {
- //rb->set_mode(RigidBody::MODE_STATIC);
- rb->set_sleeping(true);
- }
- }
+ if (rb)
+
+ rb->set_sleeping(!p_enabled);
}
{
diff --git a/scene/gui/label.cpp b/scene/gui/label.cpp
index 778d24cc35..0431d824fa 100644
--- a/scene/gui/label.cpp
+++ b/scene/gui/label.cpp
@@ -535,7 +535,9 @@ void Label::set_text(const String& p_string) {
if (percent_visible<1)
visible_chars=get_total_character_count()*percent_visible;
update();
- minimum_size_changed();
+ if (!autowrap) {
+ minimum_size_changed();
+ }
}
diff --git a/scene/gui/line_edit.cpp b/scene/gui/line_edit.cpp
index d6c018ae8e..6c47072b33 100644
--- a/scene/gui/line_edit.cpp
+++ b/scene/gui/line_edit.cpp
@@ -31,6 +31,7 @@
#include "os/os.h"
#include "print_string.h"
#include "label.h"
+#include "translation.h"
#ifdef TOOLS_ENABLED
#include "tools/editor/editor_settings.h"
#endif
@@ -947,7 +948,7 @@ String LineEdit::get_text() const {
void LineEdit::set_placeholder(String p_text) {
- placeholder = p_text;
+ placeholder = XL_MESSAGE(p_text);
update();
}
diff --git a/scene/gui/rich_text_label.cpp b/scene/gui/rich_text_label.cpp
index 151dde283a..b4fa463cde 100644
--- a/scene/gui/rich_text_label.cpp
+++ b/scene/gui/rich_text_label.cpp
@@ -1878,11 +1878,30 @@ bool RichTextLabel::is_using_bbcode() const {
return use_bbcode;
}
+
+String RichTextLabel::get_text() {
+ String text = "";
+ Item *it = main;
+ while (it) {
+ if (it->type == ITEM_TEXT) {
+ ItemText *t = static_cast<ItemText*>(it);
+ text += t->text;
+ } else if (it->type == ITEM_NEWLINE) {
+ text += "\n";
+ } else if (it->type == ITEM_INDENT) {
+ text += "\t";
+ }
+ it=_get_next_item(it,true);
+ }
+ return text;
+}
+
void RichTextLabel::_bind_methods() {
ObjectTypeDB::bind_method(_MD("_input_event"),&RichTextLabel::_input_event);
ObjectTypeDB::bind_method(_MD("_scroll_changed"),&RichTextLabel::_scroll_changed);
+ ObjectTypeDB::bind_method(_MD("get_text"),&RichTextLabel::get_text);
ObjectTypeDB::bind_method(_MD("add_text","text"),&RichTextLabel::add_text);
ObjectTypeDB::bind_method(_MD("add_image","image:Texture"),&RichTextLabel::add_image);
ObjectTypeDB::bind_method(_MD("newline"),&RichTextLabel::add_newline);
diff --git a/scene/gui/rich_text_label.h b/scene/gui/rich_text_label.h
index 635fe87ad4..5147905a0e 100644
--- a/scene/gui/rich_text_label.h
+++ b/scene/gui/rich_text_label.h
@@ -280,6 +280,7 @@ protected:
public:
+ String get_text();
void add_text(const String& p_text);
void add_image(const Ref<Texture>& p_image);
void add_newline();
diff --git a/scene/gui/tree.cpp b/scene/gui/tree.cpp
index f30b1979ef..a3d6ac9714 100644
--- a/scene/gui/tree.cpp
+++ b/scene/gui/tree.cpp
@@ -1335,7 +1335,7 @@ int Tree::_count_selected_items(TreeItem* p_from) const {
return count;
}
-void Tree::select_single_item(TreeItem *p_selected,TreeItem *p_current,int p_col,TreeItem *p_prev,bool *r_in_range) {
+void Tree::select_single_item(TreeItem *p_selected, TreeItem *p_current, int p_col, TreeItem *p_prev, bool *r_in_range, bool p_force_deselect) {
TreeItem::Cell &selected_cell=p_selected->cells[p_col];
@@ -1409,7 +1409,7 @@ void Tree::select_single_item(TreeItem *p_selected,TreeItem *p_current,int p_col
} else {
- if (r_in_range && *r_in_range) {
+ if (r_in_range && *r_in_range && !p_force_deselect) {
if (!c.selected && c.selectable) {
@@ -1417,7 +1417,7 @@ void Tree::select_single_item(TreeItem *p_selected,TreeItem *p_current,int p_col
emit_signal("multi_selected",p_current,i,true);
}
- } else if (!r_in_range){
+ } else if (!r_in_range || p_force_deselect){
if (select_mode==SELECT_MULTI && c.selected)
emit_signal("multi_selected",p_current,i,false);
c.selected=false;
@@ -1436,7 +1436,7 @@ void Tree::select_single_item(TreeItem *p_selected,TreeItem *p_current,int p_col
while (c) {
- select_single_item(p_selected,c,p_col,p_prev,r_in_range);
+ select_single_item(p_selected,c,p_col,p_prev,r_in_range,p_current->is_collapsed() || p_force_deselect);
c=c->next;
}
diff --git a/scene/gui/tree.h b/scene/gui/tree.h
index 0172546c1d..f5100ab5b6 100644
--- a/scene/gui/tree.h
+++ b/scene/gui/tree.h
@@ -331,7 +331,7 @@ friend class TreeItem;
// void draw_item_text(String p_text,const Ref<Texture>& p_icon,int p_icon_max_w,bool p_tool,Rect2i p_rect,const Color& p_color);
void draw_item_rect(const TreeItem::Cell& p_cell,const Rect2i& p_rect,const Color& p_color);
int draw_item(const Point2i& p_pos,const Point2& p_draw_ofs, const Size2& p_draw_size,TreeItem *p_item);
- void select_single_item(TreeItem *p_selected,TreeItem *p_current,int p_col,TreeItem *p_prev=NULL,bool *r_in_range=NULL);
+ void select_single_item(TreeItem *p_selected,TreeItem *p_current,int p_col,TreeItem *p_prev=NULL,bool *r_in_range=NULL,bool p_force_deselect=false);
int propagate_mouse_event(const Point2i &p_pos,int x_ofs,int y_ofs,bool p_doubleclick,TreeItem *p_item,int p_button,const InputModifierState& p_mod);
void text_editor_enter(String p_text);
void _text_editor_modal_close();
diff --git a/scene/resources/animation.cpp b/scene/resources/animation.cpp
index 098801bcf5..1d15b6f2bc 100644
--- a/scene/resources/animation.cpp
+++ b/scene/resources/animation.cpp
@@ -1997,9 +1997,6 @@ void Animation::_transform_track_optimize(int p_idx,float p_alowed_linear_err,fl
void Animation::optimize(float p_allowed_linear_err,float p_allowed_angular_err,float p_angle_max) {
-
- int total_tt=0;
-
for(int i=0;i<tracks.size();i++) {
if (tracks[i]->type==TYPE_TRANSFORM)
diff --git a/scene/resources/dynamic_font.cpp b/scene/resources/dynamic_font.cpp
index c3b40f7add..67587a8f8b 100644
--- a/scene/resources/dynamic_font.cpp
+++ b/scene/resources/dynamic_font.cpp
@@ -434,7 +434,7 @@ void DynamicFontAtSize::_update_char(CharType p_char) {
int w = slot->bitmap.width;
int h = slot->bitmap.rows;
- int p = slot->bitmap.pitch;
+ //int p = slot->bitmap.pitch;
int yofs=slot->bitmap_top;
int xofs=slot->bitmap_left;
int advance=slot->advance.x>>6;
diff --git a/scene/resources/mesh.cpp b/scene/resources/mesh.cpp
index a1a1f0a935..921466585d 100644
--- a/scene/resources/mesh.cpp
+++ b/scene/resources/mesh.cpp
@@ -30,7 +30,8 @@
#include "scene/resources/concave_polygon_shape.h"
#include "scene/resources/convex_polygon_shape.h"
#include "surface_tool.h"
-static const char*_array_name[]={
+
+static const char* _array_name[]={
"vertex_array",
"normal_array",
"tangent_array",
@@ -847,7 +848,6 @@ Ref<Mesh> Mesh::create_outline(float p_margin) const {
}
{
- int tc=0;
DVector<int>::Write ir;
DVector<int> indices =arrays[ARRAY_INDEX];
bool has_indices=false;
diff --git a/scene/resources/packed_scene.cpp b/scene/resources/packed_scene.cpp
index 4f5eed8796..c36480420b 100644
--- a/scene/resources/packed_scene.cpp
+++ b/scene/resources/packed_scene.cpp
@@ -471,7 +471,6 @@ Error SceneState::_parse_node(Node *p_owner,Node *p_node,int p_parent_idx, Map<S
}
}
#endif
- int subscene_prop_search_from=0;
// all setup, we then proceed to check all properties for the node
// and save the ones that are worth saving
@@ -479,8 +478,6 @@ Error SceneState::_parse_node(Node *p_owner,Node *p_node,int p_parent_idx, Map<S
List<PropertyInfo> plist;
p_node->get_property_list(&plist);
- bool saved_script=false;
-
for (List<PropertyInfo>::Element *E=plist.front();E;E=E->next()) {
@@ -528,23 +525,7 @@ Error SceneState::_parse_node(Node *p_owner,Node *p_node,int p_parent_idx, Map<S
break;
}
}
-#if 0
-// this workaround ended up causing problems:
-https://github.com/godotengine/godot/issues/3127
- if (saved_script && exists && p_node->get_script_instance()) {
- //if this is an overriden value by another script, save it anyway
- //as the script change will erase it
- //https://github.com/godotengine/godot/issues/2958
-
- bool valid=false;
- p_node->get_script_instance()->get_property_type(name,&valid);
- if (valid) {
- exists=false;
- isdefault=false;
- }
- }
-#endif
if (exists) {
@@ -577,9 +558,6 @@ https://github.com/godotengine/godot/issues/3127
}
}
- if (name=="script/script")
- saved_script=true;
-
NodeData::Property prop;
prop.name=_nm_get_string( name,name_map);
prop.value=_vm_get_variant( value, variant_map);
diff --git a/scene/resources/sample_library.cpp b/scene/resources/sample_library.cpp
index 73517b180e..67481f267d 100644
--- a/scene/resources/sample_library.cpp
+++ b/scene/resources/sample_library.cpp
@@ -106,9 +106,9 @@ void SampleLibrary::remove_sample(const StringName& p_name) {
sample_map.erase(p_name);
}
-void SampleLibrary::get_sample_list(List<StringName> *p_samples) {
+void SampleLibrary::get_sample_list(List<StringName> *p_samples) const {
- for(Map<StringName,SampleData >::Element *E=sample_map.front();E;E=E->next()) {
+ for(const Map<StringName,SampleData >::Element *E=sample_map.front();E;E=E->next()) {
p_samples->push_back(E->key());
}
@@ -177,7 +177,20 @@ float SampleLibrary::sample_get_pitch_scale(const StringName& p_name) const{
return sample_map[p_name].pitch_scale;
}
+Array SampleLibrary::_get_sample_list() const {
+ List<StringName> snames;
+ get_sample_list(&snames);
+
+ snames.sort_custom<StringName::AlphCompare>();
+
+ Array ret;
+ for (List<StringName>::Element *E=snames.front();E;E=E->next()) {
+ ret.push_back(E->get());
+ }
+
+ return ret;
+}
void SampleLibrary::_bind_methods() {
@@ -186,6 +199,8 @@ void SampleLibrary::_bind_methods() {
ObjectTypeDB::bind_method(_MD("has_sample","name"),&SampleLibrary::has_sample );
ObjectTypeDB::bind_method(_MD("remove_sample","name"),&SampleLibrary::remove_sample );
+ ObjectTypeDB::bind_method(_MD("get_sample_list"),&SampleLibrary::_get_sample_list );
+
ObjectTypeDB::bind_method(_MD("sample_set_volume_db","name","db"),&SampleLibrary::sample_set_volume_db );
ObjectTypeDB::bind_method(_MD("sample_get_volume_db","name"),&SampleLibrary::sample_get_volume_db );
diff --git a/scene/resources/sample_library.h b/scene/resources/sample_library.h
index 8377967106..e572aa215a 100644
--- a/scene/resources/sample_library.h
+++ b/scene/resources/sample_library.h
@@ -47,6 +47,8 @@ class SampleLibrary : public Resource {
};
Map<StringName,SampleData > sample_map;
+
+ Array _get_sample_list() const;
protected:
bool _set(const StringName& p_name, const Variant& p_value);
@@ -66,7 +68,7 @@ public:
void sample_set_pitch_scale(const StringName& p_name, float p_pitch);
float sample_get_pitch_scale(const StringName& p_name) const;
Ref<Sample> get_sample(const StringName& p_name) const;
- void get_sample_list(List<StringName> *p_samples);
+ void get_sample_list(List<StringName> *p_samples) const;
void remove_sample(const StringName& p_name);
StringName get_sample_idx(int p_idx) const;
diff --git a/servers/audio/audio_mixer_sw.cpp b/servers/audio/audio_mixer_sw.cpp
index 64369182b1..17f8c36c9a 100644
--- a/servers/audio/audio_mixer_sw.cpp
+++ b/servers/audio/audio_mixer_sw.cpp
@@ -75,7 +75,7 @@ void AudioMixerSW::do_resample(const Depth* p_src, int32_t *p_dst, ResamplerStat
for(int i=0;i<(is_stereo?2:1);i++) {
- int16_t nibble,signed_nibble,diff,step;
+ int16_t nibble,diff,step;
p_state->ima_adpcm[i].last_nibble++;
const uint8_t *src_ptr=p_state->ima_adpcm[i].ptr;
@@ -92,10 +92,6 @@ void AudioMixerSW::do_resample(const Depth* p_src, int32_t *p_dst, ResamplerStat
if (p_state->ima_adpcm[i].step_index>88)
p_state->ima_adpcm[i].step_index=88;
- /*
- signed_nibble = (nibble&7) * ((nibble&8)?-1:1);
- diff = (2 * signed_nibble + 1) * step / 4; */
-
diff = step >> 3 ;
if (nibble & 1)
diff += step >> 2 ;
diff --git a/servers/physics/body_pair_sw.cpp b/servers/physics/body_pair_sw.cpp
index 40e906c36c..3202e52abb 100644
--- a/servers/physics/body_pair_sw.cpp
+++ b/servers/physics/body_pair_sw.cpp
@@ -307,10 +307,6 @@ bool BodyPairSW::setup(float p_step) {
}
#endif
-
- int gather_A = A->can_report_contacts();
- int gather_B = B->can_report_contacts();
-
c.rA = global_A;
c.rB = global_B-offset_B;
diff --git a/servers/physics/collision_solver_sat.cpp b/servers/physics/collision_solver_sat.cpp
index 8789663f63..3e7719e5eb 100644
--- a/servers/physics/collision_solver_sat.cpp
+++ b/servers/physics/collision_solver_sat.cpp
@@ -1230,7 +1230,6 @@ static void _collision_capsule_convex_polygon(const ShapeSW *p_a,const Transform
const Geometry::MeshData::Edge *edges = mesh.edges.ptr();
int edge_count = mesh.edges.size();
const Vector3 *vertices = mesh.vertices.ptr();
- int vertex_count = mesh.vertices.size();
// faces of B
for (int i=0;i<face_count;i++) {
diff --git a/servers/physics/shape_sw.cpp b/servers/physics/shape_sw.cpp
index 5923f89120..1d4914c945 100644
--- a/servers/physics/shape_sw.cpp
+++ b/servers/physics/shape_sw.cpp
@@ -766,7 +766,6 @@ bool ConvexPolygonShapeSW::intersect_segment(const Vector3& p_begin,const Vector
int fc = mesh.faces.size();
const Vector3 *vertices = mesh.vertices.ptr();
- int vc = mesh.vertices.size();
Vector3 n = p_end-p_begin;
float min = 1e20;
@@ -873,14 +872,11 @@ void FaceShapeSW::project_range(const Vector3& p_normal, const Transform& p_tran
Vector3 FaceShapeSW::get_support(const Vector3& p_normal) const {
- Vector3 n=p_normal;
-
int vert_support_idx=-1;
float support_max;
for (int i=0;i<3;i++) {
- //float d=n.dot(vertex[i]);
float d=p_normal.dot(vertex[i]);
if (i==0 || d > support_max) {
diff --git a/servers/physics/space_sw.cpp b/servers/physics/space_sw.cpp
index 1e6f42aa02..7077146420 100644
--- a/servers/physics/space_sw.cpp
+++ b/servers/physics/space_sw.cpp
@@ -150,7 +150,6 @@ int PhysicsDirectSpaceStateSW::intersect_shape(const RID& p_shape, const Transfo
int amount = space->broadphase->cull_aabb(aabb,space->intersection_query_results,SpaceSW::INTERSECTION_QUERY_MAX,space->intersection_query_subindex_results);
- bool collided=false;
int cc=0;
//Transform ai = p_xform.affine_inverse();
@@ -269,7 +268,6 @@ bool PhysicsDirectSpaceStateSW::cast_motion(const RID& p_shape, const Transform&
for(int i=0;i<8;i++) { //steps should be customizable..
- Transform xfa = p_xform;
float ofs = (low+hi)*0.5;
Vector3 sep=mnormal; //important optimization for this to work fast enough
@@ -337,7 +335,6 @@ bool PhysicsDirectSpaceStateSW::collide_shape(RID p_shape, const Transform& p_sh
int amount = space->broadphase->cull_aabb(aabb,space->intersection_query_results,SpaceSW::INTERSECTION_QUERY_MAX,space->intersection_query_subindex_results);
bool collided=false;
- int cc=0;
r_result_count=0;
PhysicsServerSW::CollCbkData cbk;
@@ -457,7 +454,6 @@ bool PhysicsDirectSpaceStateSW::rest_info(RID p_shape, const Transform& p_shape_
if (rcd.best_object->get_type()==CollisionObjectSW::TYPE_BODY) {
const BodySW *body = static_cast<const BodySW*>(rcd.best_object);
- Vector3 rel_vec = r_info->point-body->get_transform().get_origin();
r_info->linear_velocity = body->get_linear_velocity() +
(body->get_angular_velocity()).cross(body->get_transform().origin-rcd.best_contact);// * mPos);
diff --git a/servers/physics_2d/shape_2d_sw.cpp b/servers/physics_2d/shape_2d_sw.cpp
index 8b583dd3c6..9291aa6c17 100644
--- a/servers/physics_2d/shape_2d_sw.cpp
+++ b/servers/physics_2d/shape_2d_sw.cpp
@@ -243,7 +243,6 @@ bool SegmentShape2DSW::intersect_segment(const Vector2& p_begin,const Vector2& p
if (!Geometry::segment_intersects_segment_2d(p_begin,p_end,a,b,&r_point))
return false;
- Vector2 d = p_end-p_begin;
if (n.dot(p_begin) > n.dot(a)) {
r_normal=n;
} else {
@@ -825,7 +824,6 @@ bool ConcavePolygonShape2DSW::intersect_segment(const Vector2& p_begin,const Vec
const Segment *segmentptr=&segments[0];
const Vector2 *pointptr=&points[0];
const BVH *bvhptr = &bvh[0];
- int pos=bvh.size()-1;
stack[0]=0;
@@ -1088,7 +1086,6 @@ void ConcavePolygonShape2DSW::cull(const Rect2& p_local_aabb,Callback p_callback
const Segment *segmentptr=&segments[0];
const Vector2 *pointptr=&points[0];
const BVH *bvhptr = &bvh[0];
- int pos=bvh.size()-1;
stack[0]=0;
diff --git a/servers/physics_2d/space_2d_sw.cpp b/servers/physics_2d/space_2d_sw.cpp
index ddef5fc86b..5fde6f567b 100644
--- a/servers/physics_2d/space_2d_sw.cpp
+++ b/servers/physics_2d/space_2d_sw.cpp
@@ -200,7 +200,6 @@ int Physics2DDirectSpaceStateSW::intersect_shape(const RID& p_shape, const Matri
int amount = space->broadphase->cull_aabb(aabb,space->intersection_query_results,p_result_max,space->intersection_query_subindex_results);
- bool collided=false;
int cc=0;
for(int i=0;i<amount;i++) {
@@ -307,7 +306,6 @@ bool Physics2DDirectSpaceStateSW::cast_motion(const RID& p_shape, const Matrix32
for(int i=0;i<8;i++) { //steps should be customizable..
- Matrix32 xfa = p_xform;
float ofs = (low+hi)*0.5;
Vector2 sep=mnormal; //important optimization for this to work fast enough
@@ -377,7 +375,6 @@ bool Physics2DDirectSpaceStateSW::collide_shape(RID p_shape, const Matrix32& p_s
int amount = space->broadphase->cull_aabb(aabb,space->intersection_query_results,Space2DSW::INTERSECTION_QUERY_MAX,space->intersection_query_subindex_results);
bool collided=false;
- int cc=0;
r_result_count=0;
Physics2DServerSW::CollCbkData cbk;
@@ -768,7 +765,6 @@ bool Space2DSW::test_body_motion(Body2DSW *p_body,const Vector2&p_motion,float p
for(int i=0;i<8;i++) { //steps should be customizable..
- //Matrix32 xfa = p_xform;
float ofs = (low+hi)*0.5;
Vector2 sep=mnormal; //important optimization for this to work fast enough
diff --git a/servers/spatial_sound_2d/spatial_sound_2d_server_sw.cpp b/servers/spatial_sound_2d/spatial_sound_2d_server_sw.cpp
index d27b322c21..6c42c2f527 100644
--- a/servers/spatial_sound_2d/spatial_sound_2d_server_sw.cpp
+++ b/servers/spatial_sound_2d/spatial_sound_2d_server_sw.cpp
@@ -851,23 +851,6 @@ void SpatialSound2DServerSW::update(float p_delta) {
//this could be optimized at some point... am not sure
Space *space=space_owner.get(source->space);
Room *room=room_owner.get(space->default_room);
- int max_level=-0x80000000;
- /*
- int rooms_culled = space->octree.cull_point(source->transform.origin,cull_rooms,MAX_CULL_ROOMS);
- for(int i=0;i<rooms_culled;i++) {
-
- Room *r=cull_rooms[i];
- ERR_CONTINUE( r->bounds.is_empty() ); // how did this happen??
- if (r->level<=max_level) //ignore optimization (level too low)
- continue;
- Vector2 local_point = r->inverse_transform.xform(source->transform.origin);
- if (!r->bounds.point_is_inside(local_point))
- continue;
- room=r;
- max_level=r->level;
-
- }
- */
//compute mixing weights (support for multiple listeners in the same output)
float total_distance=0;
diff --git a/servers/visual/shader_language.cpp b/servers/visual/shader_language.cpp
index 0b2a282c04..09b3ada509 100644
--- a/servers/visual/shader_language.cpp
+++ b/servers/visual/shader_language.cpp
@@ -2539,8 +2539,6 @@ Error ShaderLanguage::parse_block(Parser& parser,BlockNode *p_block) {
Error ShaderLanguage::parse(const Vector<Token>& p_tokens,ShaderType p_type,CompileFunc p_compile_func,void *p_userdata,String *r_error,int *r_err_line,int *r_err_column) {
- uint64_t t = OS::get_singleton()->get_ticks_usec();
-
Parser parser(p_tokens);
parser.program = parser.create_node<ProgramNode>(NULL);
parser.program->body = parser.create_node<BlockNode>(parser.program);
@@ -2605,18 +2603,10 @@ Error ShaderLanguage::parse(const Vector<Token>& p_tokens,ShaderType p_type,Comp
return err;
}
- double tf = (OS::get_singleton()->get_ticks_usec()-t)/1000.0;
- //print_line("parse time: "+rtos(tf));
-
- t = OS::get_singleton()->get_ticks_usec();
-
if (p_compile_func) {
err = p_compile_func(p_userdata,parser.program);
}
- tf = (OS::get_singleton()->get_ticks_usec()-t)/1000.0;
- //print_line("compile time: "+rtos(tf));
-
//clean up nodes created
while(parser.nodegc.size()) {
@@ -2633,22 +2623,16 @@ Error ShaderLanguage::compile(const String& p_code,ShaderType p_type,CompileFunc
*r_err_column=0;
Vector<Token> tokens;
- uint64_t t = OS::get_singleton()->get_ticks_usec();
-
Error err = tokenize(p_code,&tokens,r_error,r_err_line,r_err_column);
if (err!=OK) {
print_line("tokenizer error!");
}
- double tf = (OS::get_singleton()->get_ticks_usec()-t)/1000.0;
- //print_line("tokenize time: "+rtos(tf));
-
if (err!=OK) {
return err;
}
err = parse(tokens,p_type,p_compile_func,p_userdata,r_error,r_err_line,r_err_column);
if (err!=OK) {
- //print_line("LDEBUG: "+lex_debug(p_code));
return err;
}
return OK;
diff --git a/servers/visual/visual_server_raster.cpp b/servers/visual/visual_server_raster.cpp
index 532247d94c..d89ea887fa 100644
--- a/servers/visual/visual_server_raster.cpp
+++ b/servers/visual/visual_server_raster.cpp
@@ -4448,12 +4448,13 @@ void VisualServerRaster::cursor_set_rotation(float p_rotation, int p_cursor) {
cursors[p_cursor].rot = p_rotation;
};
-void VisualServerRaster::cursor_set_texture(RID p_texture, const Point2 &p_center_offset, int p_cursor) {
+void VisualServerRaster::cursor_set_texture(RID p_texture, const Point2 &p_center_offset, int p_cursor, const Rect2 &p_region) {
VS_CHANGED;
ERR_FAIL_INDEX(p_cursor, MAX_CURSORS);
cursors[p_cursor].texture = p_texture;
cursors[p_cursor].center = p_center_offset;
+ cursors[p_cursor].region = p_region;
};
void VisualServerRaster::cursor_set_visible(bool p_visible, int p_cursor) {
@@ -4843,11 +4844,6 @@ void VisualServerRaster::_instance_draw(Instance *p_instance) {
switch(p_instance->base_type) {
case INSTANCE_MESH: {
- const float *morphs = NULL;
- if (!p_instance->data.morph_values.empty()) {
- morphs=&p_instance->data.morph_values[0];
- }
-
rasterizer->add_mesh(p_instance->base_rid, &p_instance->data);
} break;
case INSTANCE_MULTIMESH: {
@@ -5227,8 +5223,6 @@ void VisualServerRaster::_light_instance_update_lispsm_shadow(Instance *p_light,
Vector3 light_vec = -p_light->data.transform.basis.get_axis(2);
Vector3 view_vec = -p_camera->transform.basis.get_axis(2);
- float viewdot = light_vec.normalized().dot(view_vec.normalized());
-
float near_dist=1;
@@ -6466,7 +6460,6 @@ void VisualServerRaster::_render_no_camera(Viewport *p_viewport,Camera *p_camera
void VisualServerRaster::_render_camera(Viewport *p_viewport,Camera *p_camera, Scenario *p_scenario) {
- uint64_t t = OS::get_singleton()->get_ticks_usec();
render_pass++;
uint32_t camera_layer_mask=p_camera->visible_layers;
@@ -7538,8 +7531,13 @@ void VisualServerRaster::_draw_cursors_and_margins() {
RID tex = cursors[i].texture?cursors[i].texture:default_cursor_texture;
ERR_CONTINUE( !tex );
- Point2 size(texture_get_width(tex), texture_get_height(tex));
- rasterizer->canvas_draw_rect(Rect2(cursors[i].pos, size), 0, Rect2(), tex, Color(1, 1, 1, 1));
+ if (cursors[i].region.has_no_area()) {
+ Point2 size(texture_get_width(tex), texture_get_height(tex));
+ rasterizer->canvas_draw_rect(Rect2(cursors[i].pos, size), 0, Rect2(), tex, Color(1, 1, 1, 1));
+ } else {
+ Point2 size = cursors[i].region.size;
+ rasterizer->canvas_draw_rect(Rect2(cursors[i].pos, size), Rasterizer::CANVAS_RECT_REGION, cursors[i].region, tex, Color(1, 1, 1, 1));
+ }
};
diff --git a/servers/visual/visual_server_raster.h b/servers/visual/visual_server_raster.h
index 0480d9f5cb..228a4a7c44 100644
--- a/servers/visual/visual_server_raster.h
+++ b/servers/visual/visual_server_raster.h
@@ -544,10 +544,12 @@ class VisualServerRaster : public VisualServer {
RID texture;
Point2 center;
bool visible;
+ Rect2 region;
Cursor() {
rot = 0;
visible = false;
+ region = Rect2();
};
};
@@ -1240,7 +1242,7 @@ public:
/* CURSOR */
virtual void cursor_set_rotation(float p_rotation, int p_cursor = 0); // radians
- virtual void cursor_set_texture(RID p_texture, const Point2 &p_center_offset, int p_cursor=0);
+ virtual void cursor_set_texture(RID p_texture, const Point2 &p_center_offset, int p_cursor=0, const Rect2 &p_region=Rect2());
virtual void cursor_set_visible(bool p_visible, int p_cursor = 0);
virtual void cursor_set_pos(const Point2& p_pos, int p_cursor = 0);
diff --git a/servers/visual/visual_server_wrap_mt.h b/servers/visual/visual_server_wrap_mt.h
index a97b232c03..8c39b0bea1 100644
--- a/servers/visual/visual_server_wrap_mt.h
+++ b/servers/visual/visual_server_wrap_mt.h
@@ -680,7 +680,7 @@ public:
/* CURSOR */
FUNC2(cursor_set_rotation,float , int ); // radians
- FUNC3(cursor_set_texture,RID , const Point2 &, int );
+ FUNC4(cursor_set_texture,RID , const Point2 &, int, const Rect2 &);
FUNC2(cursor_set_visible,bool , int );
FUNC2(cursor_set_pos,const Point2& , int );
diff --git a/servers/visual_server.cpp b/servers/visual_server.cpp
index fafc09f554..9ec02f5071 100644
--- a/servers/visual_server.cpp
+++ b/servers/visual_server.cpp
@@ -757,7 +757,6 @@ void VisualServer::mesh_add_surface_from_mesh_data( RID p_mesh, const Geometry::
}
}
- int s = mesh_get_surface_count(p_mesh);
Array d;
d.resize(VS::ARRAY_MAX);
d[ARRAY_VERTEX]=vertices;
diff --git a/servers/visual_server.h b/servers/visual_server.h
index f330a6faee..64318dfd72 100644
--- a/servers/visual_server.h
+++ b/servers/visual_server.h
@@ -1110,7 +1110,7 @@ public:
/* CURSOR */
virtual void cursor_set_rotation(float p_rotation, int p_cursor = 0)=0; // radians
- virtual void cursor_set_texture(RID p_texture, const Point2 &p_center_offset = Point2(0, 0), int p_cursor=0)=0;
+ virtual void cursor_set_texture(RID p_texture, const Point2 &p_center_offset = Point2(0, 0), int p_cursor=0, const Rect2 &p_region=Rect2())=0;
virtual void cursor_set_visible(bool p_visible, int p_cursor = 0)=0;
virtual void cursor_set_pos(const Point2& p_pos, int p_cursor = 0)=0;
diff --git a/tools/editor/code_editor.cpp b/tools/editor/code_editor.cpp
index 644478923c..21de122cee 100644
--- a/tools/editor/code_editor.cpp
+++ b/tools/editor/code_editor.cpp
@@ -32,6 +32,7 @@
#include "scene/gui/separator.h"
#include "scene/resources/dynamic_font.h"
#include "os/keyboard.h"
+#include "tools/editor/editor_scale.h"
void GotoLineDialog::popup_find_line(TextEdit *p_edit) {
@@ -1198,6 +1199,10 @@ CodeTextEditor::CodeTextEditor() {
line_col = memnew( Label );
status_bar->add_child(line_col);
line_col->set_valign(Label::VALIGN_CENTER);
+ line_col->set_autowrap(true);
+ line_col->set_v_size_flags(SIZE_FILL);
+ line_col->set_custom_minimum_size(Size2(100,1)*EDSCALE);
+ status_bar->add_child( memnew( Label ) ); //to keep the height if the other labels are not visible
text_editor->connect("input_event", this,"_text_editor_input_event");
diff --git a/tools/editor/dependency_editor.cpp b/tools/editor/dependency_editor.cpp
index ef667b75e1..049bcefc75 100644
--- a/tools/editor/dependency_editor.cpp
+++ b/tools/editor/dependency_editor.cpp
@@ -418,6 +418,7 @@ void DependencyRemoveDialog::show(const Vector<String> &to_erase) {
exist=false;
owners->clear();
files.clear();
+ owners->create_item(); // root
for(int i=0;i<to_erase.size();i++) {
files[to_erase[i]]=NULL;
}
diff --git a/tools/editor/editor_autoload_settings.cpp b/tools/editor/editor_autoload_settings.cpp
new file mode 100644
index 0000000000..1cf0090e7e
--- /dev/null
+++ b/tools/editor/editor_autoload_settings.cpp
@@ -0,0 +1,618 @@
+/*************************************************************************/
+/* editor_autoload_settings.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2016 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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 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. */
+/*************************************************************************/
+
+#include "editor_autoload_settings.h"
+
+#include "globals.h"
+#include "global_constants.h"
+
+#include "editor_node.h"
+
+#define PREVIEW_LIST_MAX_SIZE 10
+
+StringName EditorAutoloadSettings::autoload_changed = StringName();
+
+void EditorAutoloadSettings::_notification(int p_what) {
+
+ if (p_what == NOTIFICATION_ENTER_TREE) {
+
+ List<String> afn;
+ ResourceLoader::get_recognized_extensions_for_type("Script", &afn);
+ ResourceLoader::get_recognized_extensions_for_type("PackedScene", &afn);
+
+ EditorFileDialog *file_dialog = autoload_add_path->get_file_dialog();
+
+ for (List<String>::Element *E = afn.front(); E; E = E->next()) {
+
+ file_dialog->add_filter("*." + E->get());
+ }
+ }
+}
+
+bool EditorAutoloadSettings::_autoload_name_is_valid(const String& p_name, String* r_error) {
+
+ if (!p_name.is_valid_identifier()) {
+ if (r_error)
+ *r_error = TTR("Invalid name.") + "\n" + TTR("Valid characters:")+" a-z, A-Z, 0-9 or _";
+
+ return false;
+ }
+
+ if (ObjectTypeDB::type_exists(p_name)) {
+ if (r_error)
+ *r_error = TTR("Invalid name. Must not collide with an existing engine class name.");
+
+ return false;
+ }
+
+ for (int i = 0; i < Variant::VARIANT_MAX; i++) {
+ if (Variant::get_type_name( Variant::Type(i) ) == p_name) {
+ if (r_error)
+ *r_error = TTR("Invalid name. Must not collide with an existing buit-in type name.");
+
+ return false;
+ }
+ }
+
+ for (int i = 0; i < GlobalConstants::get_global_constant_count(); i++) {
+ if (GlobalConstants::get_global_constant_name(i) == p_name) {
+ if (r_error)
+ *r_error = TTR("Invalid name. Must not collide with an existing global constant name.");
+
+ return false;
+ }
+ }
+
+ return true;
+}
+
+void EditorAutoloadSettings::_autoload_add() {
+
+ String name = autoload_add_name->get_text();
+
+ String error;
+ if (!_autoload_name_is_valid(name, &error)) {
+ EditorNode::get_singleton()->show_warning(error);
+ return;
+ }
+
+ String path = autoload_add_path->get_line_edit()->get_text();
+ if (!FileAccess::exists(path)) {
+ EditorNode::get_singleton()->show_warning(TTR("Invalid Path.") + "\n" + TTR("File does not exist."));
+ return;
+ }
+
+ if (!path.begins_with("res://")) {
+ EditorNode::get_singleton()->show_warning(TTR("Invalid Path.") + "\n"+ TTR("Not in resource path."));
+ return;
+ }
+
+ name = "autoload/" + name;
+
+ UndoRedo* undo_redo = EditorNode::get_singleton()->get_undo_redo();
+
+ undo_redo->create_action(TTR("Add AutoLoad"));
+ undo_redo->add_do_property(Globals::get_singleton(), name, "*" + path);
+ undo_redo->add_do_method(Globals::get_singleton(), "set_persisting", name, true);
+
+ if (Globals::get_singleton()->has(name)) {
+ undo_redo->add_undo_property(Globals::get_singleton(), name, Globals::get_singleton()->get(name));
+ } else {
+ undo_redo->add_undo_property(Globals::get_singleton(), name, Variant());
+ }
+
+ undo_redo->add_do_method(this, "update_autoload");
+ undo_redo->add_undo_method(this, "update_autoload");
+
+ undo_redo->add_do_method(this, "emit_signal", autoload_changed);
+ undo_redo->add_undo_method(this, "emit_signal", autoload_changed);
+
+ undo_redo->commit_action();
+
+ autoload_add_path->get_line_edit()->set_text("");
+ autoload_add_name->set_text("");
+}
+
+void EditorAutoloadSettings::_autoload_selected() {
+
+ TreeItem *ti = tree->get_selected();
+
+ if (!ti)
+ return;
+
+ selected_autoload = "autoload/" + ti->get_text(0);
+}
+
+void EditorAutoloadSettings::_autoload_edited() {
+
+ if (updating_autoload)
+ return;
+
+ TreeItem *ti = tree->get_edited();
+ int column = tree->get_edited_column();
+
+ UndoRedo *undo_redo = EditorNode::get_undo_redo();
+
+ if (column == 0) {
+ String name = ti->get_text(0);
+ String old_name = selected_autoload.get_slice("/", 1);
+
+ if (name == old_name)
+ return;
+
+ String error;
+ if (!_autoload_name_is_valid(name, &error)) {
+ ti->set_text(0, old_name);
+ EditorNode::get_singleton()->show_warning(error);
+ return;
+ }
+
+ if (Globals::get_singleton()->has("autoload/" + name)) {
+ ti->set_text(0, old_name);
+ EditorNode::get_singleton()->show_warning(vformat(TTR("Autoload '%s' already exists!"), name));
+ return;
+ }
+
+ updating_autoload = true;
+
+ name = "autoload/" + name;
+
+ bool persisting = Globals::get_singleton()->get(selected_autoload);
+ int order = Globals::get_singleton()->get(selected_autoload);
+ String path = Globals::get_singleton()->get(selected_autoload);
+
+ undo_redo->create_action(TTR("Rename Autoload"));
+
+ undo_redo->add_do_property(Globals::get_singleton(), name, path);
+ undo_redo->add_do_method(Globals::get_singleton(), "set_persisting", name, persisting);
+ undo_redo->add_do_method(Globals::get_singleton(), "set_order", name, order);
+ undo_redo->add_do_method(Globals::get_singleton(), "clear", selected_autoload);
+
+ undo_redo->add_undo_property(Globals::get_singleton(), selected_autoload, path);
+ undo_redo->add_undo_method(Globals::get_singleton(), "set_persisting", selected_autoload, persisting);
+ undo_redo->add_undo_method(Globals::get_singleton(), "set_order", selected_autoload, order);
+ undo_redo->add_undo_method(Globals::get_singleton(), "clear", name);
+
+ undo_redo->add_do_method(this, "update_autoload");
+ undo_redo->add_undo_method(this, "update_autoload");
+
+ undo_redo->add_do_method(this, "emit_signal", autoload_changed);
+ undo_redo->add_undo_method(this, "emit_signal", autoload_changed);
+
+ undo_redo->commit_action();
+
+ selected_autoload = name;
+ } else if (column == 2) {
+ updating_autoload = true;
+
+ bool checked = ti->is_checked(2);
+ String base = "autoload/" + ti->get_text(0);
+
+ int order = Globals::get_singleton()->get_order(base);
+ String path = Globals::get_singleton()->get(base);
+
+ if (path.begins_with("*"))
+ path = path.substr(1, path.length());
+
+ if (checked)
+ path = "*" + path;
+
+ undo_redo->create_action(TTR("Toggle AutoLoad Globals"));
+
+ undo_redo->add_do_property(Globals::get_singleton(), base, path);
+ undo_redo->add_undo_property(Globals::get_singleton(), base, Globals::get_singleton()->get(base));
+
+ undo_redo->add_do_method(Globals::get_singleton(),"set_order", base, order);
+ undo_redo->add_undo_method(Globals::get_singleton(),"set_order", base, order);
+
+ undo_redo->add_do_method(this, "update_autoload");
+ undo_redo->add_undo_method(this, "update_autoload");
+
+ undo_redo->add_do_method(this, "emit_signal", autoload_changed);
+ undo_redo->add_undo_method(this, "emit_signal", autoload_changed);
+
+ undo_redo->commit_action();
+ }
+
+ updating_autoload = false;
+}
+
+void EditorAutoloadSettings::_autoload_button_pressed(Object *p_item, int p_column, int p_button) {
+
+ TreeItem *ti = p_item->cast_to<TreeItem>();
+
+ String name = "autoload/" + ti->get_text(0);
+
+ UndoRedo *undo_redo = EditorNode::get_undo_redo();
+
+ switch (p_button) {
+
+ case BUTTON_MOVE_UP:
+ case BUTTON_MOVE_DOWN: {
+
+ TreeItem *swap = NULL;
+
+ if (p_button == BUTTON_MOVE_UP) {
+ swap = ti->get_prev();
+ } else {
+ swap = ti->get_next();
+ }
+
+ if (!swap)
+ return;
+
+ String swap_name = "autoload/" + swap->get_text(0);
+
+ int order = Globals::get_singleton()->get_order(name);
+ int swap_order = Globals::get_singleton()->get_order(swap_name);
+
+ undo_redo->create_action(TTR("Move Autoload"));
+
+ undo_redo->add_do_method(Globals::get_singleton(), "set_order", name, swap_order);
+ undo_redo->add_undo_method(Globals::get_singleton(), "set_order", name, order);
+
+ undo_redo->add_do_method(Globals::get_singleton(), "set_order", swap_name, order);
+ undo_redo->add_undo_method(Globals::get_singleton(), "set_order", swap_name, swap_order);
+
+ undo_redo->add_do_method(this, "update_autoload");
+ undo_redo->add_undo_method(this, "update_autoload");
+
+ undo_redo->add_do_method(this, "emit_signal", autoload_changed);
+ undo_redo->add_undo_method(this, "emit_signal", autoload_changed);
+
+ undo_redo->commit_action();
+ } break;
+ case BUTTON_DELETE: {
+
+ int order = Globals::get_singleton()->get_order(name);
+
+ undo_redo->create_action(TTR("Remove Autoload"));
+
+ undo_redo->add_do_property(Globals::get_singleton(), name, Variant());
+
+ undo_redo->add_undo_property(Globals::get_singleton(), name, Globals::get_singleton()->get(name));
+ undo_redo->add_undo_method(Globals::get_singleton(), "set_persisting", name, true);
+ undo_redo->add_undo_method(Globals::get_singleton(), "set_order", order);
+
+ undo_redo->add_do_method(this, "update_autoload");
+ undo_redo->add_undo_method(this, "update_autoload");
+
+ undo_redo->add_do_method(this, "emit_signal", autoload_changed);
+ undo_redo->add_undo_method(this, "emit_signal", autoload_changed);
+
+ undo_redo->commit_action();
+ } break;
+ }
+}
+
+void EditorAutoloadSettings::_autoload_file_callback(const String& p_path) {
+
+ autoload_add_name->set_text(p_path.get_file().basename());
+}
+
+void EditorAutoloadSettings::update_autoload() {
+
+ if (updating_autoload)
+ return;
+
+ updating_autoload = true;
+
+ autoload_cache.clear();
+
+ tree->clear();
+ TreeItem *root = tree->create_item();
+
+ List<PropertyInfo> props;
+ Globals::get_singleton()->get_property_list(&props);
+
+ for (List<PropertyInfo>::Element *E = props.front(); E; E = E->next()) {
+
+ const PropertyInfo &pi = E->get();
+
+ if (!pi.name.begins_with("autoload/"))
+ continue;
+
+ String name = pi.name.get_slice("/", 1);
+ String path = Globals::get_singleton()->get(pi.name);
+
+ if (name.empty())
+ continue;
+
+ AutoLoadInfo info;
+ info.name = pi.name;
+ info.order = Globals::get_singleton()->get_order(pi.name);
+
+ autoload_cache.push_back(info);
+
+ bool global = false;
+
+ if (path.begins_with("*")) {
+ global = true;
+ path = path.substr(1, path.length());
+ }
+
+ TreeItem *item = tree->create_item(root);
+ item->set_text(0, name);
+ item->set_editable(0, true);
+
+ item->set_text(1, path);
+ item->set_selectable(1, false);
+
+ item->set_cell_mode(2, TreeItem::CELL_MODE_CHECK);
+ item->set_editable(2, true);
+ item->set_text(2, TTR("Enable"));
+ item->set_checked(2, global);
+
+ item->add_button(3, get_icon("MoveUp","EditorIcons"), BUTTON_MOVE_UP);
+ item->add_button(3, get_icon("MoveDown","EditorIcons"), BUTTON_MOVE_DOWN);
+ item->add_button(3, get_icon("Del","EditorIcons"), BUTTON_DELETE);
+ item->set_selectable(3, false);
+ }
+
+ updating_autoload = false;
+}
+
+Variant EditorAutoloadSettings::get_drag_data_fw(const Point2& p_point, Control *p_control) {
+
+ if (autoload_cache.size() <= 1)
+ return false;
+
+ StringArray autoloads;
+
+ TreeItem *next = tree->get_next_selected(NULL);
+
+ while (next) {
+ autoloads.push_back(next->get_text(0));
+ next = tree->get_next_selected(next);
+ }
+
+ if (autoloads.size() == 0 || autoloads.size() == autoload_cache.size())
+ return Variant();
+
+ VBoxContainer *preview = memnew( VBoxContainer );
+
+ int max_size = MIN(PREVIEW_LIST_MAX_SIZE, autoloads.size());
+
+ for (int i = 0; i < max_size; i++) {
+ Label *label = memnew( Label(autoloads[i]) );
+ label->set_self_opacity(Math::lerp(1, 0, float(i)/PREVIEW_LIST_MAX_SIZE));
+
+ preview->add_child(label);
+ }
+
+ tree->set_drop_mode_flags(Tree::DROP_MODE_INBETWEEN);
+ tree->set_drag_preview(preview);
+
+ Dictionary drop_data;
+ drop_data["type"] = "autoload";
+ drop_data["autoloads"] = autoloads;
+
+ return drop_data;
+}
+
+bool EditorAutoloadSettings::can_drop_data_fw(const Point2& p_point, const Variant& p_data, Control *p_control) const {
+ if (updating_autoload)
+ return false;
+
+ Dictionary drop_data = p_data;
+
+ if (!drop_data.has("type"))
+ return false;
+
+ if (drop_data.has("type")) {
+ TreeItem *ti = tree->get_item_at_pos(p_point);
+
+ if (!ti)
+ return false;
+
+ int section = tree->get_drop_section_at_pos(p_point);
+
+ if (section < -1)
+ return false;
+
+ return true;
+ }
+
+ return false;
+}
+
+void EditorAutoloadSettings::drop_data_fw(const Point2& p_point, const Variant& p_data, Control *p_control) {
+
+ TreeItem *ti = tree->get_item_at_pos(p_point);
+
+ if (!ti)
+ return;
+
+ int section = tree->get_drop_section_at_pos(p_point);
+
+ if (section < -1)
+ return;
+
+ String name;
+ bool move_to_back = false;
+
+ if (section < 0) {
+ name = ti->get_text(0);
+ } else if (ti->get_next()) {
+ name = ti->get_next()->get_text(0);
+ } else {
+ name = ti->get_text(0);
+ move_to_back = true;
+ }
+
+ int order = Globals::get_singleton()->get_order("autoload/" + name);
+
+ AutoLoadInfo aux;
+ List<AutoLoadInfo>::Element *E = NULL;
+
+ if (!move_to_back) {
+ aux.order = order;
+ E = autoload_cache.find(aux);
+ }
+
+ Dictionary drop_data = p_data;
+ StringArray autoloads = drop_data["autoloads"];
+
+ Vector<int> orders;
+ orders.resize(autoload_cache.size());
+
+ for (int i = 0; i < autoloads.size(); i++) {
+ aux.order = Globals::get_singleton()->get_order("autoload/" + autoloads[i]);
+
+ List<AutoLoadInfo>::Element *I = autoload_cache.find(aux);
+
+ if (move_to_back) {
+ autoload_cache.move_to_back(I);
+ } else if (E != I) {
+ autoload_cache.move_before(I, E);
+ } else if (E->next()) {
+ E = E->next();
+ } else {
+ break;
+ }
+ }
+
+ int i = 0;
+
+ for (List<AutoLoadInfo>::Element *E = autoload_cache.front(); E; E = E->next()) {
+ orders[i++] = E->get().order;
+ }
+
+ orders.sort();
+
+ UndoRedo *undo_redo = EditorNode::get_undo_redo();
+
+ undo_redo->create_action(TTR("Rearrange Autoloads"));
+
+ i = 0;
+
+ for (List<AutoLoadInfo>::Element *E = autoload_cache.front(); E; E = E->next()) {
+ undo_redo->add_do_method(Globals::get_singleton(), "set_order", E->get().name, orders[i++]);
+ undo_redo->add_undo_method(Globals::get_singleton(), "set_order", E->get().name, E->get().order);
+ }
+
+ orders.clear();
+
+ undo_redo->add_do_method(this, "update_autoload");
+ undo_redo->add_undo_method(this, "update_autoload");
+
+ undo_redo->add_do_method(this, "emit_signal", autoload_changed);
+ undo_redo->add_undo_method(this, "emit_signal", autoload_changed);
+
+ undo_redo->commit_action();
+}
+
+void EditorAutoloadSettings::_bind_methods() {
+
+ ObjectTypeDB::bind_method("_autoload_add", &EditorAutoloadSettings::_autoload_add);
+ ObjectTypeDB::bind_method("_autoload_selected", &EditorAutoloadSettings::_autoload_selected);
+ ObjectTypeDB::bind_method("_autoload_edited", &EditorAutoloadSettings::_autoload_edited);
+ ObjectTypeDB::bind_method("_autoload_button_pressed", &EditorAutoloadSettings::_autoload_button_pressed);
+ ObjectTypeDB::bind_method("_autoload_file_callback", &EditorAutoloadSettings::_autoload_file_callback);
+
+ ObjectTypeDB::bind_method("get_drag_data_fw", &EditorAutoloadSettings::get_drag_data_fw);
+ ObjectTypeDB::bind_method("can_drop_data_fw", &EditorAutoloadSettings::can_drop_data_fw);
+ ObjectTypeDB::bind_method("drop_data_fw", &EditorAutoloadSettings::drop_data_fw);
+
+ ObjectTypeDB::bind_method("update_autoload", &EditorAutoloadSettings::update_autoload);
+
+ ADD_SIGNAL(MethodInfo("autoload_changed"));
+}
+
+EditorAutoloadSettings::EditorAutoloadSettings() {
+
+ autoload_changed = "autoload_changed";
+
+ updating_autoload = false;
+ selected_autoload = "";
+
+ HBoxContainer *hbc = memnew( HBoxContainer );
+ add_child(hbc);
+
+ VBoxContainer *vbc_path = memnew( VBoxContainer );
+ vbc_path->set_h_size_flags(SIZE_EXPAND_FILL);
+
+ autoload_add_path = memnew( EditorLineEditFileChooser );
+ autoload_add_path->set_h_size_flags(SIZE_EXPAND_FILL);
+
+ autoload_add_path->get_file_dialog()->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ autoload_add_path->get_file_dialog()->connect("file_selected", this, "_autoload_file_callback");
+
+ vbc_path->add_margin_child(TTR("Path:"), autoload_add_path);
+ hbc->add_child(vbc_path);
+
+ VBoxContainer *vbc_name = memnew( VBoxContainer );
+ vbc_name->set_h_size_flags(SIZE_EXPAND_FILL);
+
+ HBoxContainer *hbc_name = memnew( HBoxContainer );
+
+ autoload_add_name = memnew( LineEdit );
+ autoload_add_name->set_h_size_flags(SIZE_EXPAND_FILL);
+ hbc_name->add_child(autoload_add_name);
+
+ Button *add_autoload = memnew( Button );
+ add_autoload->set_text(TTR("Add"));
+ hbc_name->add_child(add_autoload);
+ add_autoload->connect("pressed", this, "_autoload_add");
+
+ vbc_name->add_margin_child(TTR("Node Name:"), hbc_name);
+ hbc->add_child(vbc_name);
+
+ tree = memnew( Tree );
+ tree->set_hide_root(true);
+ tree->set_select_mode(Tree::SELECT_MULTI);
+ tree->set_single_select_cell_editing_only_when_already_selected(true);
+
+ tree->set_drag_forwarding(this);
+
+ tree->set_columns(4);
+ tree->set_column_titles_visible(true);
+
+ tree->set_column_title(0,TTR("Name"));
+ tree->set_column_expand(0,true);
+ tree->set_column_min_width(0,100);
+
+ tree->set_column_title(1,TTR("Path"));
+ tree->set_column_expand(1,true);
+ tree->set_column_min_width(1,100);
+
+ tree->set_column_title(2,TTR("Singleton"));
+ tree->set_column_expand(2,false);
+ tree->set_column_min_width(2,80);
+
+ tree->set_column_expand(3,false);
+ tree->set_column_min_width(3,80);
+
+ tree->connect("cell_selected", this, "_autoload_selected");
+ tree->connect("item_edited", this, "_autoload_edited");
+ tree->connect("button_pressed", this, "_autoload_button_pressed");
+
+ add_margin_child(TTR("List:"), tree, true);
+}
+
diff --git a/tools/editor/editor_autoload_settings.h b/tools/editor/editor_autoload_settings.h
new file mode 100644
index 0000000000..b8825f807c
--- /dev/null
+++ b/tools/editor/editor_autoload_settings.h
@@ -0,0 +1,94 @@
+/*************************************************************************/
+/* editor_autoload_settings.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2016 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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 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 EDITOR_AUTOLOAD_SETTINGS_H
+#define EDITOR_AUTOLOAD_SETTINGS_H
+
+#include "scene/gui/tree.h"
+
+#include "editor_file_dialog.h"
+
+class EditorAutoloadSettings : public VBoxContainer {
+
+ OBJ_TYPE( EditorAutoloadSettings, VBoxContainer );
+
+ enum {
+ BUTTON_MOVE_UP,
+ BUTTON_MOVE_DOWN,
+ BUTTON_DELETE
+ };
+
+ static StringName autoload_changed;
+
+ struct AutoLoadInfo {
+ String name;
+ int order;
+
+ bool operator==(const AutoLoadInfo& p_info) {
+ return order == p_info.order;
+ }
+ };
+
+ List<AutoLoadInfo> autoload_cache;
+
+ bool updating_autoload;
+ int number_of_autoloads;
+ String selected_autoload;
+
+ Tree *tree;
+ EditorLineEditFileChooser *autoload_add_path;
+ LineEdit *autoload_add_name;
+
+ bool _autoload_name_is_valid(const String& p_string, String *r_error = NULL);
+
+ void _autoload_add();
+ void _autoload_selected();
+ void _autoload_edited();
+ void _autoload_button_pressed(Object *p_item, int p_column, int p_button);
+ void _autoload_file_callback(const String& p_path);
+
+ Variant get_drag_data_fw(const Point2& p_point, Control *p_from);
+ bool can_drop_data_fw(const Point2& p_point, const Variant& p_data, Control *p_from) const;
+ void drop_data_fw(const Point2& p_point, const Variant& p_data, Control *p_from);
+
+protected:
+
+ void _notification(int p_what);
+ static void _bind_methods();
+
+public:
+
+ void update_autoload();
+
+ EditorAutoloadSettings();
+
+};
+
+#endif
+
diff --git a/tools/editor/editor_help.cpp b/tools/editor/editor_help.cpp
index 0b60db5ee3..1fc157098c 100644
--- a/tools/editor/editor_help.cpp
+++ b/tools/editor/editor_help.cpp
@@ -332,7 +332,7 @@ EditorHelpSearch::EditorHelpSearch() {
register_text_enter(search_box);
set_hide_on_ok(false);
search_options->connect("item_activated",this,"_confirmed");
- set_title(TTR("Search Classes"));
+ set_title(TTR("Search Help"));
// search_options->set_hide_root(true);
@@ -526,6 +526,7 @@ EditorHelpIndex::EditorHelpIndex() {
class_list->connect("item_activated",this,"_tree_item_selected");
get_ok()->set_text(TTR("Open"));
+ set_title(TTR("Search Classes"));
}
diff --git a/tools/editor/editor_node.cpp b/tools/editor/editor_node.cpp
index 001a94f251..89d7f8f3ce 100644
--- a/tools/editor/editor_node.cpp
+++ b/tools/editor/editor_node.cpp
@@ -1611,6 +1611,7 @@ void EditorNode::_edit_current() {
object_menu->set_disabled(true);
bool is_resource = current_obj->is_type("Resource");
+ bool is_node = current_obj->is_type("Node");
resource_save_button->set_disabled(!is_resource);
if (is_resource) {
@@ -1627,7 +1628,7 @@ void EditorNode::_edit_current() {
//top_pallete->set_current_tab(1);
- } else if (current_obj->is_type("Node")) {
+ } else if (is_node) {
Node * current_node = current_obj->cast_to<Node>();
ERR_FAIL_COND(!current_node);
@@ -1723,10 +1724,14 @@ void EditorNode::_edit_current() {
p->add_shortcut(ED_SHORTCUT("property_editor/copy_resource",TTR("Copy Resource")),RESOURCE_COPY);
p->add_shortcut(ED_SHORTCUT("property_editor/unref_resource",TTR("Make Built-In")),RESOURCE_UNREF);
}
- p->add_separator();
- p->add_shortcut(ED_SHORTCUT("property_editor/make_subresources_unique",TTR("Make Sub-Resources Unique")),OBJECT_UNIQUE_RESOURCES);
- p->add_separator();
- p->add_icon_shortcut(gui_base->get_icon("Help","EditorIcons"),ED_SHORTCUT("property_editor/open_help",TTR("Open in Help")),OBJECT_REQUEST_HELP);
+
+ if (is_resource || is_node) {
+ p->add_separator();
+ p->add_shortcut(ED_SHORTCUT("property_editor/make_subresources_unique",TTR("Make Sub-Resources Unique")),OBJECT_UNIQUE_RESOURCES);
+ p->add_separator();
+ p->add_icon_shortcut(gui_base->get_icon("Help","EditorIcons"),ED_SHORTCUT("property_editor/open_help",TTR("Open in Help")),OBJECT_REQUEST_HELP);
+ }
+
List<MethodInfo> methods;
current_obj->get_method_list(&methods);
diff --git a/tools/editor/editor_resource_preview.cpp b/tools/editor/editor_resource_preview.cpp
index 6e38d6460b..a02fe2a531 100644
--- a/tools/editor/editor_resource_preview.cpp
+++ b/tools/editor/editor_resource_preview.cpp
@@ -33,6 +33,7 @@
#include "io/resource_saver.h"
#include "globals.h"
#include "editor_scale.h"
+#include "message_queue.h"
Ref<Texture> EditorResourcePreviewGenerator::generate_from_path(const String& p_path) {
@@ -83,12 +84,10 @@ void EditorResourcePreview::_preview_ready(const String& p_str,const Ref<Texture
cache[path]=item;
- Object *recv = ObjectDB::get_instance(id);
- if (recv) {
- recv->call_deferred(p_func,path,p_texture,p_ud);
- }
-
preview_mutex->unlock();
+
+ MessageQueue::get_singleton()->push_call(id,p_func,path,p_texture,p_ud);
+
}
Ref<Texture> EditorResourcePreview::_generate_preview(const QueueItem& p_item,const String& cache_base) {
@@ -107,6 +106,7 @@ Ref<Texture> EditorResourcePreview::_generate_preview(const QueueItem& p_item,co
Ref<Texture> generated;
for(int i=0;i<preview_generators.size();i++) {
+
if (!preview_generators[i]->handles(type))
continue;
if (p_item.resource.is_valid()) {
@@ -157,99 +157,107 @@ void EditorResourcePreview::_thread() {
QueueItem item = queue.front()->get();
queue.pop_front();
- preview_mutex->unlock();
-
- Ref<Texture> texture;
-
- //print_line("pop from queue "+item.path);
-
- int thumbnail_size = EditorSettings::get_singleton()->get("file_dialog/thumbnail_size");
- thumbnail_size*=EDSCALE;
if (cache.has(item.path)) {
//already has it because someone loaded it, just let it know it's ready
if (item.resource.is_valid()) {
item.path+=":"+itos(cache[item.path].last_hash); //keep last hash (see description of what this is in condition below)
}
- call_deferred("_preview_ready",item.path,cache[item.path].preview,item.id,item.function,item.userdata);
-
- } else if (item.resource.is_valid()){
- texture=_generate_preview(item,String());
- //adding hash to the end of path (should be ID:<objid>:<hash>) because of 5 argument limit to call_deferred
- call_deferred("_preview_ready",item.path+":"+itos(item.resource->hash_edited_version()),texture,item.id,item.function,item.userdata);
+ _preview_ready(item.path,cache[item.path].preview,item.id,item.function,item.userdata);
+ preview_mutex->unlock();
} else {
+ preview_mutex->unlock();
+
+ Ref<Texture> texture;
- String temp_path=EditorSettings::get_singleton()->get_settings_path().plus_file("tmp");
- String cache_base = Globals::get_singleton()->globalize_path(item.path).md5_text();
- cache_base = temp_path.plus_file("resthumb-"+cache_base);
+ //print_line("pop from queue "+item.path);
- //does not have it, try to load a cached thumbnail
+ int thumbnail_size = EditorSettings::get_singleton()->get("file_dialog/thumbnail_size");
+ thumbnail_size*=EDSCALE;
- String file = cache_base+".txt";
- //print_line("cachetxt at "+file);
- FileAccess *f=FileAccess::open(file,FileAccess::READ);
- if (!f) {
- //print_line("generate because not cached");
+ if (item.resource.is_valid()){
+
+ texture=_generate_preview(item,String());
+ //adding hash to the end of path (should be ID:<objid>:<hash>) because of 5 argument limit to call_deferred
+ _preview_ready(item.path+":"+itos(item.resource->hash_edited_version()),texture,item.id,item.function,item.userdata);
- //generate
- texture=_generate_preview(item,cache_base);
} else {
- uint64_t modtime = FileAccess::get_modified_time(item.path);
- int tsize = f->get_line().to_int64();
- uint64_t last_modtime = f->get_line().to_int64();
- bool cache_valid = true;
+ String temp_path=EditorSettings::get_singleton()->get_settings_path().plus_file("tmp");
+ String cache_base = Globals::get_singleton()->globalize_path(item.path).md5_text();
+ cache_base = temp_path.plus_file("resthumb-"+cache_base);
+
+ //does not have it, try to load a cached thumbnail
- if (tsize!=thumbnail_size) {
- cache_valid=false;
- memdelete(f);
- } else if (last_modtime!=modtime) {
+ String file = cache_base+".txt";
+ //print_line("cachetxt at "+file);
+ FileAccess *f=FileAccess::open(file,FileAccess::READ);
+ if (!f) {
+
+ //print_line("generate because not cached");
+
+ //generate
+ texture=_generate_preview(item,cache_base);
+ } else {
- String last_md5 = f->get_line();
- String md5 = FileAccess::get_md5(item.path);
- memdelete(f);
+ uint64_t modtime = FileAccess::get_modified_time(item.path);
+ int tsize = f->get_line().to_int64();
+ uint64_t last_modtime = f->get_line().to_int64();
- if (last_md5!=md5) {
+ bool cache_valid = true;
+ if (tsize!=thumbnail_size) {
cache_valid=false;
- } else {
- //update modified time
+ memdelete(f);
+ } else if (last_modtime!=modtime) {
- f=FileAccess::open(file,FileAccess::WRITE);
- f->store_line(itos(modtime));
- f->store_line(md5);
+ String last_md5 = f->get_line();
+ String md5 = FileAccess::get_md5(item.path);
+ memdelete(f);
+
+ if (last_md5!=md5) {
+
+ cache_valid=false;
+ } else {
+ //update modified time
+
+ f=FileAccess::open(file,FileAccess::WRITE);
+ f->store_line(itos(modtime));
+ f->store_line(md5);
+ memdelete(f);
+ }
+ } else {
memdelete(f);
}
- } else {
- memdelete(f);
- }
- if (cache_valid) {
+ if (cache_valid) {
- texture = ResourceLoader::load(cache_base+".png","ImageTexture",true);
- if (!texture.is_valid()) {
- //well fuck
- cache_valid=false;
+ texture = ResourceLoader::load(cache_base+".png","ImageTexture",true);
+ if (!texture.is_valid()) {
+ //well fuck
+ cache_valid=false;
+ }
}
- }
- if (!cache_valid) {
+ if (!cache_valid) {
- texture=_generate_preview(item,cache_base);
- }
+ texture=_generate_preview(item,cache_base);
+ }
- }
+ }
- //print_line("notify of preview ready");
- call_deferred("_preview_ready",item.path,texture,item.id,item.function,item.userdata);
+ //print_line("notify of preview ready");
+ _preview_ready(item.path,texture,item.id,item.function,item.userdata);
+ }
}
+
} else {
preview_mutex->unlock();
}
diff --git a/tools/editor/io_plugins/editor_mesh_import_plugin.cpp b/tools/editor/io_plugins/editor_mesh_import_plugin.cpp
index 095c56a373..2c3ed2afd6 100644
--- a/tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+++ b/tools/editor/io_plugins/editor_mesh_import_plugin.cpp
@@ -520,7 +520,7 @@ Error EditorMeshImportPlugin::import(const String& p_path, const Ref<ResourceImp
//new object/surface
if (generate_normals || force_smooth)
surf_tool->generate_normals();
- if (uvs.size() && (normals.size() || generate_normals))
+ if (uvs.size() && (normals.size() || generate_normals) && generate_tangents)
surf_tool->generate_tangents();
surf_tool->index();
diff --git a/tools/editor/plugins/collision_polygon_editor_plugin.cpp b/tools/editor/plugins/collision_polygon_editor_plugin.cpp
index 55e38cebcc..0b06b3ba21 100644
--- a/tools/editor/plugins/collision_polygon_editor_plugin.cpp
+++ b/tools/editor/plugins/collision_polygon_editor_plugin.cpp
@@ -584,7 +584,7 @@ CollisionPolygonEditor::CollisionPolygonEditor(EditorNode *p_editor) {
handle_material->set_parameter(FixedMaterial::PARAM_DIFFUSE,Color(1,1,1));
handle_material->set_fixed_flag(FixedMaterial::FLAG_USE_ALPHA, true);
handle_material->set_fixed_flag(FixedMaterial::FLAG_USE_COLOR_ARRAY, false);
- Ref<Texture> handle= SpatialEditor::get_singleton()->get_icon("Editor3DHandle","EditorIcons");
+ Ref<Texture> handle=editor->get_gui_base()->get_icon("Editor3DHandle","EditorIcons");
handle_material->set_point_size(handle->get_width());
handle_material->set_texture(FixedMaterial::PARAM_DIFFUSE,handle);
diff --git a/tools/editor/plugins/script_editor_plugin.cpp b/tools/editor/plugins/script_editor_plugin.cpp
index d7d495ff5d..3b095d15f9 100644
--- a/tools/editor/plugins/script_editor_plugin.cpp
+++ b/tools/editor/plugins/script_editor_plugin.cpp
@@ -874,6 +874,15 @@ void ScriptEditor::_reload_scripts(){
}
+ uint64_t last_date = script->get_last_modified_time();
+ uint64_t date = FileAccess::get_modified_time(script->get_path());
+
+ //printf("last date: %lli vs date: %lli\n",last_date,date);
+ if (last_date==date) {
+ continue;
+ }
+
+
Ref<Script> rel_script = ResourceLoader::load(script->get_path(),script->get_type(),true);
ERR_CONTINUE(!rel_script.is_valid());
script->set_source_code( rel_script->get_source_code() );
diff --git a/tools/editor/plugins/tile_set_editor_plugin.cpp b/tools/editor/plugins/tile_set_editor_plugin.cpp
index a2c7147bf3..39a15189e7 100644
--- a/tools/editor/plugins/tile_set_editor_plugin.cpp
+++ b/tools/editor/plugins/tile_set_editor_plugin.cpp
@@ -73,24 +73,24 @@ void TileSetEditor::_import_scene(Node *scene, Ref<TileSet> p_library, bool p_me
p_library->tile_set_name(id,mi->get_name());
}
-
-
p_library->tile_set_texture(id,texture);
p_library->tile_set_material(id,material);
Vector2 phys_offset;
+ Size2 s;
- if (mi->is_centered()) {
- Size2 s;
- if (mi->is_region()) {
- s=mi->get_region_rect().size;
- } else {
- s=texture->get_size();
- }
- phys_offset+=-s/2;
- }
if (mi->is_region()) {
+ s=mi->get_region_rect().size;
p_library->tile_set_region(id,mi->get_region_rect());
+ } else {
+ const int frame = mi->get_frame();
+ const int hframes = mi->get_hframes();
+ s=texture->get_size()/Size2(hframes,mi->get_vframes());
+ p_library->tile_set_region(id,Rect2(Vector2(frame%hframes,frame/hframes)*s,s));
+ }
+
+ if (mi->is_centered()) {
+ phys_offset+=-s/2;
}
Vector<Ref<Shape2D> >collisions;
diff --git a/tools/editor/project_settings.cpp b/tools/editor/project_settings.cpp
index 6822e50b73..6be1abf52f 100644
--- a/tools/editor/project_settings.cpp
+++ b/tools/editor/project_settings.cpp
@@ -100,16 +100,6 @@ void ProjectSettings::_notification(int p_what) {
translation_res_file_open->add_filter("*."+E->get());
translation_res_option_file_open->add_filter("*."+E->get());
}
-
- List<String> afn;
- ResourceLoader::get_recognized_extensions_for_type("Script",&afn);
- ResourceLoader::get_recognized_extensions_for_type("PackedScene",&afn);
-
- for (List<String>::Element *E=afn.front();E;E=E->next()) {
-
- autoload_file_open->add_filter("*."+E->get());
- }
-
}
}
@@ -564,7 +554,7 @@ void ProjectSettings::popup_project_settings() {
popup_centered_ratio();
globals_editor->update_category_list();
_update_translations();
- _update_autoload();
+ autoload_settings->update_autoload();
plugin_settings->update_plugins();
}
@@ -616,10 +606,26 @@ void ProjectSettings::_item_add() {
String name = catname!="" ? catname+"/"+propname : propname;
- Globals::get_singleton()->set(name,value);
+ undo_redo->create_action("Add Global Property");
+
+ undo_redo->add_do_property(Globals::get_singleton(), name, value);
+ undo_redo->add_do_method(Globals::get_singleton(), "set_persisting", name, true);
+
+ if (Globals::get_singleton()->has(name)) {
+ undo_redo->add_undo_property(Globals::get_singleton(), name, Globals::get_singleton()->get(name));
+ } else {
+ undo_redo->add_undo_property(Globals::get_singleton(), name, Variant());
+ }
+
+ undo_redo->add_do_method(globals_editor, "update_category_list");
+ undo_redo->add_undo_method(globals_editor, "update_category_list");
+
+ undo_redo->add_do_method(this, "_settings_changed");
+ undo_redo->add_undo_method(this, "_settings_changed");
+
+ undo_redo->commit_action();
globals_editor->set_current_section(catname);
- globals_editor->update_category_list();
_settings_changed();
}
@@ -633,10 +639,20 @@ void ProjectSettings::_item_del() {
String name = catname!="" ? catname+"/"+propname : propname;
- Globals::get_singleton()->set(name,Variant());
+ undo_redo->create_action("Delete Global Property");
- globals_editor->set_current_section(catname);
- globals_editor->update_category_list();
+ undo_redo->add_do_property(Globals::get_singleton(), name, Variant());
+
+ undo_redo->add_undo_property(Globals::get_singleton(), name, Globals::get_singleton()->get(name));
+ undo_redo->add_undo_method(Globals::get_singleton(), "set_persisting", name, Globals::get_singleton()->is_persisting(name));
+
+ undo_redo->add_do_method(globals_editor, "update_category_list");
+ undo_redo->add_undo_method(globals_editor, "update_category_list");
+
+ undo_redo->add_do_method(this, "_settings_changed");
+ undo_redo->add_undo_method(this, "_settings_changed");
+
+ undo_redo->commit_action();
_settings_changed();
}
@@ -811,263 +827,6 @@ void ProjectSettings::_translation_file_open() {
translation_file_open->popup_centered_ratio();
}
-
-void ProjectSettings::_autoload_file_callback(const String& p_path) {
-
- autoload_add_path->set_text(p_path);
- //if (autoload_add_name->get_text().strip_edges()==String()) {
-
- autoload_add_name->set_text( p_path.get_file().basename() );
- //}
-
- //_translation_add(p_translation);
-}
-
-void ProjectSettings::_autoload_file_open() {
-
- autoload_file_open->popup_centered_ratio();
-}
-
-void ProjectSettings::_autoload_edited() {
-
- if (updating_autoload)
- return;
-
- TreeItem *ti = autoload_list->get_edited();
- int column = autoload_list->get_edited_column();
-
- if (!ti || (column != 0 && column != 2))
- return;
-
- if (column == 0) {
- String name = ti->get_text(0);
- String old_name = selected_autoload.substr(selected_autoload.find("/")+1,selected_autoload.length());
-
- if (!name.is_valid_identifier()) {
- ti->set_text(0,old_name);
- message->set_text(TTR("Invalid name.")+"\n"+TTR("Valid characters:")+" a-z, A-Z, 0-9 or _");
- message->popup_centered(Size2(300,100));
- return;
- }
-
- if (ObjectTypeDB::type_exists(name)) {
- ti->set_text(0,old_name);
- message->set_text(TTR("Invalid name. Must not collide with an existing engine class name."));
- message->popup_centered(Size2(400,100));
- return;
- }
-
- for(int i=0;i<Variant::VARIANT_MAX;i++) {
- if (Variant::get_type_name(Variant::Type(i))==name) {
- ti->set_text(0,old_name);
- message->set_text(TTR("Invalid name. Must not collide with an existing buit-in type name."));
- message->popup_centered(Size2(400,100));
- return;
- }
- }
-
- for(int i=0;i<GlobalConstants::get_global_constant_count();i++) {
- if (GlobalConstants::get_global_constant_name(i)==name) {
- ti->set_text(0,old_name);
- message->set_text(TTR("Invalid name. Must not collide with an existing global constant name."));
- message->popup_centered(Size2(400,100));
- return;
- }
- }
-
- if (Globals::get_singleton()->has("autoload/"+name)) {
- ti->set_text(0,old_name);
- message->set_text(vformat(TTR("Autoload '%s' already exists!"),name));
- message->popup_centered(Size2(300,100));
- return;
- }
-
- updating_autoload = true;
-
- name = "autoload/"+name;
- String path = Globals::get_singleton()->get(selected_autoload);
- bool is_persisting = Globals::get_singleton()->is_persisting(selected_autoload);
- int order = Globals::get_singleton()->get_order(selected_autoload);
-
- undo_redo->create_action(TTR("Rename Autoload"));
- undo_redo->add_do_property(Globals::get_singleton(),name,path);
- undo_redo->add_do_method(Globals::get_singleton(),"set_persisting",name,is_persisting);
- undo_redo->add_do_method(Globals::get_singleton(),"set_order",name,order);
- undo_redo->add_do_method(Globals::get_singleton(),"clear",selected_autoload);
- undo_redo->add_undo_property(Globals::get_singleton(),selected_autoload,path);
- undo_redo->add_undo_method(Globals::get_singleton(),"set_persisting",selected_autoload,is_persisting);
- undo_redo->add_undo_method(Globals::get_singleton(),"set_order",selected_autoload,order);
- undo_redo->add_undo_method(Globals::get_singleton(),"clear",name);
- undo_redo->add_do_method(this,"_update_autoload");
- undo_redo->add_undo_method(this,"_update_autoload");
- undo_redo->add_do_method(this,"_settings_changed");
- undo_redo->add_undo_method(this,"_settings_changed");
- undo_redo->commit_action();
-
- selected_autoload = name;
- } else if (column == 2) {
- updating_autoload = true;
-
- bool checked = ti->is_checked(2);
- String base = "autoload/"+ti->get_text(0);
- String path = Globals::get_singleton()->get(base);
- int order = Globals::get_singleton()->get_order(base);
-
- if (path.begins_with("*"))
- path = path.substr(1,path.length());
-
- if (checked)
- path = "*" + path;
-
- undo_redo->create_action(TTR("Toggle AutoLoad Globals"));
- undo_redo->add_do_property(Globals::get_singleton(),base,path);
- undo_redo->add_undo_property(Globals::get_singleton(),base,Globals::get_singleton()->get(base));
- undo_redo->add_do_method(Globals::get_singleton(),"set_order",base,order); // keep order, as config order matters for these
- undo_redo->add_undo_method(Globals::get_singleton(),"set_order",base,order);
- undo_redo->add_do_method(this,"_update_autoload");
- undo_redo->add_undo_method(this,"_update_autoload");
- undo_redo->add_do_method(this,"_settings_changed");
- undo_redo->add_undo_method(this,"_settings_changed");
- undo_redo->commit_action();
- }
-
- updating_autoload = false;
-}
-
-void ProjectSettings::_autoload_add() {
-
- String name = autoload_add_name->get_text();
- if (!name.is_valid_identifier()) {
- message->set_text(TTR("Invalid name.")+"\n"+TTR("Valid characters:")+" a-z, A-Z, 0-9 or _");
- message->popup_centered(Size2(300,100));
- return;
-
- }
-
- if (ObjectTypeDB::type_exists(name)) {
-
- message->set_text(TTR("Invalid name. Must not collide with an existing engine class name."));
- message->popup_centered(Size2(300,100));
- return;
-
- }
-
- for(int i=0;i<Variant::VARIANT_MAX;i++) {
- if (Variant::get_type_name(Variant::Type(i))==name) {
-
- message->set_text(TTR("Invalid name. Must not collide with an existing buit-in type name."));
- message->popup_centered(Size2(300,100));
- return;
-
- }
- }
-
- for(int i=0;i<GlobalConstants::get_global_constant_count();i++) {
-
- if (GlobalConstants::get_global_constant_name(i)==name) {
-
- message->set_text(TTR("Invalid name. Must not collide with an existing global constant name."));
- message->popup_centered(Size2(300,100));
- return;
- }
-
- }
-
- String path = autoload_add_path->get_text();
- if (!FileAccess::exists(path)) {
- message->set_text("Invalid Path.\nFile does not exist.");
- message->popup_centered(Size2(300,100));
- return;
-
- }
- if (!path.begins_with("res://")) {
- message->set_text("Invalid Path.\nNot in resource path.");
- message->popup_centered(Size2(300,100));
- return;
-
- }
-
- undo_redo->create_action(TTR("Add Autoload"));
- name = "autoload/"+name;
- undo_redo->add_do_property(Globals::get_singleton(),name,"*"+path);
- if (Globals::get_singleton()->has(name))
- undo_redo->add_undo_property(Globals::get_singleton(),name,Globals::get_singleton()->get(name));
- else
- undo_redo->add_undo_property(Globals::get_singleton(),name,Variant());
-
- undo_redo->add_do_method(Globals::get_singleton(),"set_persisting",name,true);
- undo_redo->add_do_method(this,"_update_autoload");
- undo_redo->add_undo_method(this,"_update_autoload");
- undo_redo->add_do_method(this,"_settings_changed");
- undo_redo->add_undo_method(this,"_settings_changed");
- undo_redo->commit_action();
-
- autoload_add_path->set_text("");
- autoload_add_name->set_text("");
-
- //autoload_file_open->popup_centered_ratio();
-}
-
-void ProjectSettings::_autoload_delete(Object *p_item,int p_column, int p_button) {
-
-
- TreeItem *ti=p_item->cast_to<TreeItem>();
- String name = "autoload/"+ti->get_text(0);
-
- if (p_button==0) {
- //delete
- int order = Globals::get_singleton()->get_order(name);
- undo_redo->create_action(TTR("Remove Autoload"));
- undo_redo->add_do_property(Globals::get_singleton(),name,Variant());
- undo_redo->add_undo_property(Globals::get_singleton(),name,Globals::get_singleton()->get(name));
- undo_redo->add_undo_method(Globals::get_singleton(),"set_persisting",name,true);
- undo_redo->add_undo_method(Globals::get_singleton(),"set_order",name,order);
- undo_redo->add_do_method(this,"_update_autoload");
- undo_redo->add_undo_method(this,"_update_autoload");
- undo_redo->add_do_method(this,"_settings_changed");
- undo_redo->add_undo_method(this,"_settings_changed");
- undo_redo->commit_action();
- } else {
-
- TreeItem *swap = NULL;
-
- if (p_button==1) {
- swap=ti->get_prev();
- } else if (p_button==2) {
- swap=ti->get_next();
- }
- if (!swap)
- return;
-
- String swap_name= "autoload/"+swap->get_text(0);
-
- int order = Globals::get_singleton()->get_order(name);
- int swap_order = Globals::get_singleton()->get_order(swap_name);
-
- undo_redo->create_action(TTR("Move Autoload"));
- undo_redo->add_do_method(Globals::get_singleton(),"set_order",swap_name,order);
- undo_redo->add_do_method(Globals::get_singleton(),"set_order",name,swap_order);
- undo_redo->add_undo_method(Globals::get_singleton(),"set_order",swap_name,swap_order);
- undo_redo->add_undo_method(Globals::get_singleton(),"set_order",name,order);
- undo_redo->add_do_method(this,"_update_autoload");
- undo_redo->add_undo_method(this,"_update_autoload");
- undo_redo->add_do_method(this,"_settings_changed");
- undo_redo->add_undo_method(this,"_settings_changed");
- undo_redo->commit_action();
-
- }
-
-}
-
-void ProjectSettings::_autoload_selected() {
- TreeItem *ti = autoload_list->get_selected();
-
- if (!ti)
- return;
-
- selected_autoload = "autoload/"+ti->get_text(0);
-}
-
void ProjectSettings::_translation_delete(Object *p_item,int p_column, int p_button) {
TreeItem *ti = p_item->cast_to<TreeItem>();
@@ -1393,55 +1152,6 @@ void ProjectSettings::_update_translations() {
}
-void ProjectSettings::_update_autoload() {
-
- if (updating_autoload)
- return;
-
- updating_autoload=true;
-
- autoload_list->clear();
- TreeItem *root = autoload_list->create_item();
- autoload_list->set_hide_root(true);
-
- List<PropertyInfo> props;
- Globals::get_singleton()->get_property_list(&props);
-
- for(List<PropertyInfo>::Element *E=props.front();E;E=E->next()) {
-
- const PropertyInfo &pi=E->get();
- if (!pi.name.begins_with("autoload/"))
- continue;
-
- String name = pi.name.get_slice("/",1);
- String path = Globals::get_singleton()->get(pi.name);
-
- if (name=="")
- continue;
- bool global=false;
- if (path.begins_with("*")) {
- path=path.substr(1,path.length());
- global=true;
- }
- TreeItem *t = autoload_list->create_item(root);
- t->set_text(0,name);
- t->set_editable(0,true);
- t->set_text(1,path);
- t->set_cell_mode(2,TreeItem::CELL_MODE_CHECK);
- t->set_editable(2,true);
- t->set_text(2,TTR("Enable"));
- t->set_checked(2,global);
- t->add_button(3,get_icon("MoveUp","EditorIcons"),1);
- t->add_button(3,get_icon("MoveDown","EditorIcons"),2);
- t->add_button(3,get_icon("Del","EditorIcons"),0);
-
-
- }
-
- updating_autoload=false;
-
-}
-
void ProjectSettings::_toggle_search_bar(bool p_pressed) {
globals_editor->get_property_editor()->set_use_filter(p_pressed);
@@ -1508,14 +1218,6 @@ void ProjectSettings::_bind_methods() {
ObjectTypeDB::bind_method(_MD("_translation_res_delete"),&ProjectSettings::_translation_res_delete);
ObjectTypeDB::bind_method(_MD("_translation_res_option_delete"),&ProjectSettings::_translation_res_option_delete);
- ObjectTypeDB::bind_method(_MD("_autoload_add"),&ProjectSettings::_autoload_add);
- ObjectTypeDB::bind_method(_MD("_autoload_file_open"),&ProjectSettings::_autoload_file_open);
- ObjectTypeDB::bind_method(_MD("_autoload_file_callback"),&ProjectSettings::_autoload_file_callback);
- ObjectTypeDB::bind_method(_MD("_update_autoload"),&ProjectSettings::_update_autoload);
- ObjectTypeDB::bind_method(_MD("_autoload_delete"),&ProjectSettings::_autoload_delete);
- ObjectTypeDB::bind_method(_MD("_autoload_edited"),&ProjectSettings::_autoload_edited);
- ObjectTypeDB::bind_method(_MD("_autoload_selected"),&ProjectSettings::_autoload_selected);
-
ObjectTypeDB::bind_method(_MD("_clear_search_box"),&ProjectSettings::_clear_search_box);
ObjectTypeDB::bind_method(_MD("_toggle_search_bar"),&ProjectSettings::_toggle_search_bar);
@@ -1858,69 +1560,10 @@ ProjectSettings::ProjectSettings(EditorData *p_data) {
{
- VBoxContainer *avb = memnew( VBoxContainer );
- tab_container->add_child(avb);
- avb->set_name(TTR("AutoLoad"));
- HBoxContainer *ahb = memnew( HBoxContainer);
- avb->add_child(ahb);
-
-
- VBoxContainer *avb_path = memnew( VBoxContainer );
- avb_path->set_h_size_flags(SIZE_EXPAND_FILL);
- HBoxContainer *ahb_path = memnew( HBoxContainer );
- autoload_add_path = memnew(LineEdit);
- autoload_add_path->set_h_size_flags(SIZE_EXPAND_FILL);
- ahb_path->add_child(autoload_add_path);
- Button *browseaa = memnew( Button("..") );
- ahb_path->add_child(browseaa);
- browseaa->connect("pressed",this,"_autoload_file_open");
-
- avb_path->add_margin_child(TTR("Path:"),ahb_path);
- ahb->add_child(avb_path);
-
- VBoxContainer *avb_name = memnew( VBoxContainer );
- avb_name->set_h_size_flags(SIZE_EXPAND_FILL);
-
- HBoxContainer *ahb_name = memnew( HBoxContainer );
- autoload_add_name = memnew(LineEdit);
- autoload_add_name->set_h_size_flags(SIZE_EXPAND_FILL);
- ahb_name->add_child(autoload_add_name);
- avb_name->add_margin_child(TTR("Node Name:"),ahb_name);
- Button *addaa = memnew( Button(TTR("Add")) );
- ahb_name->add_child(addaa);
- addaa->connect("pressed",this,"_autoload_add");
-
- ahb->add_child(avb_name);
-
- autoload_list = memnew( Tree );
- autoload_list->set_v_size_flags(SIZE_EXPAND_FILL);
- avb->add_margin_child(TTR("List:"),autoload_list,true);
-
- autoload_file_open=memnew( EditorFileDialog );
- add_child(autoload_file_open);
- autoload_file_open->set_mode(EditorFileDialog::MODE_OPEN_FILE);
- autoload_file_open->connect("file_selected",this,"_autoload_file_callback");
-
- autoload_list->set_columns(4);
- autoload_list->set_column_titles_visible(true);
- autoload_list->set_column_title(0,TTR("Name"));
- autoload_list->set_column_expand(0,true);
- autoload_list->set_column_min_width(0,100);
- autoload_list->set_column_title(1,TTR("Path"));
- autoload_list->set_column_expand(1,true);
- autoload_list->set_column_min_width(1,100);
- autoload_list->set_column_title(2,TTR("Singleton"));
- autoload_list->set_column_expand(2,false);
- autoload_list->set_column_min_width(2,80);
- autoload_list->set_column_expand(3,false);
- autoload_list->set_column_min_width(3,80);
-
- autoload_list->connect("button_pressed",this,"_autoload_delete");
- autoload_list->connect("item_edited",this,"_autoload_edited");
- autoload_list->connect("cell_selected", this, "_autoload_selected");
-
- updating_autoload=false;
-
+ autoload_settings = memnew( EditorAutoloadSettings );
+ autoload_settings->set_name(TTR("AutoLoad"));
+ tab_container->add_child(autoload_settings);
+ autoload_settings->connect("autoload_changed", this, "_settings_changed");
}
{
diff --git a/tools/editor/project_settings.h b/tools/editor/project_settings.h
index 79e1acf75e..46e98f69ad 100644
--- a/tools/editor/project_settings.h
+++ b/tools/editor/project_settings.h
@@ -34,6 +34,7 @@
#include "undo_redo.h"
#include "editor_data.h"
#include "scene/gui/tab_container.h"
+#include "editor_autoload_settings.h"
#include "editor_plugin_settings.h"
//#include "project_export_settings.h"
@@ -88,26 +89,10 @@ class ProjectSettings : public AcceptDialog {
Tree *translation_remap;
Tree *translation_remap_options;
-
- Tree *autoload_list;
- String selected_autoload;
- EditorFileDialog *autoload_file_open;
- LineEdit *autoload_add_name;
- LineEdit *autoload_add_path;
-
+ EditorAutoloadSettings *autoload_settings;
EditorPluginSettings *plugin_settings;
- void _update_autoload();
- void _autoload_file_callback(const String& p_path);
- void _autoload_add();
- void _autoload_edited();
- void _autoload_file_open();
- void _autoload_delete(Object *p_item,int p_column, int p_button);
- void _autoload_selected();
- bool updating_autoload;
-
-
void _item_selected();
void _item_adds(String);
void _item_add();
diff --git a/tools/editor/property_editor.cpp b/tools/editor/property_editor.cpp
index 7816dd9bc7..ceb62d5ff0 100644
--- a/tools/editor/property_editor.cpp
+++ b/tools/editor/property_editor.cpp
@@ -4187,6 +4187,8 @@ public:
void SectionedPropertyEditor::_bind_methods() {
ObjectTypeDB::bind_method("_section_selected",&SectionedPropertyEditor::_section_selected);
+
+ ObjectTypeDB::bind_method("update_category_list", &SectionedPropertyEditor::update_category_list);
}
void SectionedPropertyEditor::_section_selected(int p_which) {
diff --git a/tools/export/blender25/godot_export_manager.py b/tools/export/blender25/godot_export_manager.py
index a249611c71..c91f55b51c 100644
--- a/tools/export/blender25/godot_export_manager.py
+++ b/tools/export/blender25/godot_export_manager.py
@@ -18,23 +18,27 @@
# Script copyright (c) Andreas Esau
+import bpy
+from bpy.props import (StringProperty, BoolProperty, EnumProperty,
+ FloatProperty, IntProperty, CollectionProperty)
+import os
+from bpy.app.handlers import persistent
+from mathutils import Matrix
+
bl_info = {
"name": "Godot Export Manager",
"author": "Andreas Esau",
"version": (1, 0),
"blender": (2, 7, 0),
"location": "Scene Properties > Godot Export Manager",
- "description": "Godot Export Manager uses the Better Collada Exporter to manage Export Groups and automatically export the objects groups to Collada Files.",
+ "description": "Godot Export Manager uses the Better Collada Exporter"
+ "to manage Export Groups and automatically export the objects groups"
+ "to Collada Files.",
"warning": "",
"wiki_url": ("http://www.godotengine.org"),
"tracker_url": "",
"category": "Import-Export"}
-import bpy
-from bpy.props import StringProperty, BoolProperty, EnumProperty, FloatProperty, FloatVectorProperty, IntProperty, CollectionProperty, PointerProperty
-import os
-from bpy.app.handlers import persistent
-from mathutils import Vector, Matrix
class godot_export_manager(bpy.types.Panel):
bl_label = "Godot Export Manager"
@@ -44,8 +48,8 @@ class godot_export_manager(bpy.types.Panel):
bpy.types.Scene.godot_export_on_save = BoolProperty(default=False)
- ### draw function for all ui elements
def draw(self, context):
+ """ Draw function for all ui elements """
layout = self.layout
split = self.layout.split()
scene = bpy.data.scenes[0]
@@ -54,38 +58,43 @@ class godot_export_manager(bpy.types.Panel):
row = layout.row()
col = row.column()
- col.prop(scene,"godot_export_on_save",text="Export Groups on save")
+ col.prop(scene, "godot_export_on_save", text="Export Groups on save")
row = layout.row()
col = row.column(align=True)
- op = col.operator("scene.godot_add_objects_to_group",text="Add selected objects to Group",icon="COPYDOWN")
-
- op = col.operator("scene.godot_delete_objects_from_group",text="Delete selected objects from Group",icon="PASTEDOWN")
-
+ op = col.operator("scene.godot_add_objects_to_group",
+ text="Add selected objects to Group",
+ icon="COPYDOWN")
+ op = col.operator("scene.godot_delete_objects_from_group",
+ text="Delete selected objects from Group",
+ icon="PASTEDOWN")
row = layout.row()
col = row.column()
col.label(text="Export Groups:")
-
row = layout.row()
col = row.column()
- col.template_list("UI_List_Godot","dummy",scene, "godot_export_groups", scene, "godot_export_groups_index",rows=1,maxrows=10,type='DEFAULT')
+ col.template_list("UI_List_Godot", "dummy", scene,
+ "godot_export_groups", scene,
+ "godot_export_groups_index", rows=1, maxrows=10,
+ type='DEFAULT')
col = row.column(align=True)
- col.operator("scene.godot_add_export_group",text="",icon="ZOOMIN")
- col.operator("scene.godot_delete_export_group",text="",icon="ZOOMOUT")
- col.operator("scene.godot_export_all_groups",text="",icon="EXPORT")
+ col.operator("scene.godot_add_export_group", text="", icon="ZOOMIN")
+ col.operator("scene.godot_delete_export_group", text="",
+ icon="ZOOMOUT")
+ col.operator("scene.godot_export_all_groups", text="", icon="EXPORT")
if len(scene.godot_export_groups) > 0:
row = layout.row()
col = row.column()
group = scene.godot_export_groups[scene.godot_export_groups_index]
- col.prop(group,"name",text="Group Name")
- col.prop(group,"export_name",text="Export Name")
- col.prop(group,"export_path",text="Export Filepath")
+ col.prop(group, "name", text="Group Name")
+ col.prop(group, "export_name", text="Export Name")
+ col.prop(group, "export_path", text="Export Filepath")
row = layout.row()
col = row.column()
@@ -94,41 +103,46 @@ class godot_export_manager(bpy.types.Panel):
col.label(text="Export Settings:")
col = col.row(align=True)
- col.prop(group,"apply_loc",toggle=True,icon="MAN_TRANS")
- col.prop(group,"apply_rot",toggle=True,icon="MAN_ROT")
- col.prop(group,"apply_scale",toggle=True,icon="MAN_SCALE")
+ col.prop(group, "apply_loc", toggle=True, icon="MAN_TRANS")
+ col.prop(group, "apply_rot", toggle=True, icon="MAN_ROT")
+ col.prop(group, "apply_scale", toggle=True, icon="MAN_SCALE")
row = layout.row()
col = row.column()
- col.prop(group,"use_include_particle_duplicates")
- col.prop(group,"use_mesh_modifiers")
- col.prop(group,"use_tangent_arrays")
- col.prop(group,"use_triangles")
- col.prop(group,"use_copy_images")
- col.prop(group,"use_active_layers")
- col.prop(group,"use_anim")
- col.prop(group,"use_anim_action_all")
- col.prop(group,"use_anim_skip_noexp")
- col.prop(group,"use_anim_optimize")
- col.prop(group,"anim_optimize_precision")
- col.prop(group,"use_metadata")
-
-### Custom template_list look
+ col.prop(group, "use_include_particle_duplicates")
+ col.prop(group, "use_mesh_modifiers")
+ col.prop(group, "use_tangent_arrays")
+ col.prop(group, "use_triangles")
+ col.prop(group, "use_copy_images")
+ col.prop(group, "use_active_layers")
+ col.prop(group, "use_anim")
+ col.prop(group, "use_anim_action_all")
+ col.prop(group, "use_anim_skip_noexp")
+ col.prop(group, "use_anim_optimize")
+ col.prop(group, "anim_optimize_precision")
+ col.prop(group, "use_metadata")
+
+
class UI_List_Godot(bpy.types.UIList):
- def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index):
+ """ Custom template_list look """
+ def draw_item(self, context, layout, data, item, icon, active_data,
+ active_propname, index):
ob = data
slot = item
col = layout.row(align=True)
- col.label(text=item.name,icon="GROUP")
- col.prop(item,"active",text="")
+ col.label(text=item.name, icon="GROUP")
+ col.prop(item, "active", text="")
- op = col.operator("scene.godot_select_group_objects",text="",emboss=False,icon="RESTRICT_SELECT_OFF")
+ op = col.operator("scene.godot_select_group_objects",
+ text="", emboss=False, icon="RESTRICT_SELECT_OFF")
op.idx = index
- op = col.operator("scene.godot_export_group",text="",emboss=False,icon="EXPORT")
+ op = col.operator("scene.godot_export_group", text="", emboss=False,
+ icon="EXPORT")
op.idx = index
+
class add_objects_to_group(bpy.types.Operator):
bl_idname = "scene.godot_add_objects_to_group"
bl_label = "Add Objects to Group"
@@ -136,34 +150,37 @@ class add_objects_to_group(bpy.types.Operator):
undo = BoolProperty(default=True)
- def execute(self,context):
+ def execute(self, context):
scene = context.scene
objects_str = ""
if len(scene.godot_export_groups) > 0:
- for i,object in enumerate(context.selected_objects):
- if object.name not in scene.godot_export_groups[scene.godot_export_groups_index].nodes:
- node = scene.godot_export_groups[scene.godot_export_groups_index].nodes.add()
+ for i, object in enumerate(context.selected_objects):
+ if object.name not in scene.godot_export_groups[
+ scene.godot_export_groups_index].nodes:
+ node = scene.godot_export_groups[
+ scene.godot_export_groups_index].nodes.add()
node.name = object.name
if i == 0:
objects_str += object.name
else:
objects_str += ", "+object.name
-
- self.report({'INFO'}, objects_str + " added to group." )
+ self.report({'INFO'}, objects_str + " added to group.")
if self.undo:
bpy.ops.ed.undo_push(message="Objects added to group")
else:
- self.report({'WARNING'}, "Create a group first." )
- return{'FINISHED'}
+ self.report({'WARNING'}, "Create a group first.")
+
+ return {'FINISHED'}
+
class del_objects_from_group(bpy.types.Operator):
bl_idname = "scene.godot_delete_objects_from_group"
bl_label = "Delete Objects from Group"
bl_description = "Delets the selected Objects from the active group below."
- def execute(self,context):
+ def execute(self, context):
scene = context.scene
if len(scene.godot_export_groups) > 0:
@@ -174,23 +191,25 @@ class del_objects_from_group(bpy.types.Operator):
objects_str = ""
j = 0
- for i,node in enumerate(scene.godot_export_groups[scene.godot_export_groups_index].nodes):
+ for i, node in enumerate(scene.godot_export_groups[
+ scene.godot_export_groups_index].nodes):
if node.name in selected_objects:
- scene.godot_export_groups[scene.godot_export_groups_index].nodes.remove(i)
-
+ scene.godot_export_groups[
+ scene.godot_export_groups_index].nodes.remove(i)
if j == 0:
objects_str += object.name
else:
objects_str += ", "+object.name
- j+=1
-
+ j += 1
- self.report({'INFO'}, objects_str + " deleted from group." )
+ self.report({'INFO'}, objects_str + " deleted from group.")
bpy.ops.ed.undo_push(message="Objects deleted from group")
else:
- self.report({'WARNING'}, "There is no group to delete from." )
- return{'FINISHED'}
+ self.report({'WARNING'}, "There is no group to delete from.")
+
+ return {'FINISHED'}
+
class select_group_objects(bpy.types.Operator):
bl_idname = "scene.godot_select_group_objects"
@@ -199,7 +218,7 @@ class select_group_objects(bpy.types.Operator):
idx = IntProperty()
- def execute(self,context):
+ def execute(self, context):
scene = context.scene
for object in context.scene.objects:
object.select = False
@@ -207,76 +226,82 @@ class select_group_objects(bpy.types.Operator):
if node.name in bpy.data.objects:
bpy.data.objects[node.name].select = True
context.scene.objects.active = bpy.data.objects[node.name]
- return{'FINISHED'}
+
+ return {'FINISHED'}
+
class export_groups_autosave(bpy.types.Operator):
bl_idname = "scene.godot_export_groups_autosave"
bl_label = "Export All Groups"
bl_description = "Exports all groups to Collada."
- def execute(self,context):
+ def execute(self, context):
scene = context.scene
if scene.godot_export_on_save:
for i in range(len(scene.godot_export_groups)):
if scene.godot_export_groups[i].active:
bpy.ops.scene.godot_export_group(idx=i)
- self.report({'INFO'}, "All Groups exported." )
+ self.report({'INFO'}, "All Groups exported.")
bpy.ops.ed.undo_push(message="Export all Groups")
- return{'FINISHED'}
+
+ return {'FINISHED'}
+
class export_all_groups(bpy.types.Operator):
bl_idname = "scene.godot_export_all_groups"
bl_label = "Export All Groups"
bl_description = "Exports all groups to Collada."
- def execute(self,context):
+ def execute(self, context):
scene = context.scene
- for i in range(0,len(scene.godot_export_groups)):
- bpy.ops.scene.godot_export_group(idx=i,export_all=True)
+ for i in range(0, len(scene.godot_export_groups)):
+ bpy.ops.scene.godot_export_group(idx=i, export_all=True)
- self.report({'INFO'}, "All Groups exported." )
- return{'FINISHED'}
+ self.report({'INFO'}, "All Groups exported.")
+
+ return {'FINISHED'}
class export_group(bpy.types.Operator):
bl_idname = "scene.godot_export_group"
bl_label = "Export Group"
- bl_description = "Exports the active group to destination folder as Collada file."
+ bl_description = "Exports the active group to destination folder"\
+ " as Collada file."
idx = IntProperty(default=0)
export_all = BoolProperty(default=False)
-
- def copy_object_recursive(self,ob,parent,single_user = True):
+ def copy_object_recursive(self, ob, parent, single_user=True):
new_ob = bpy.data.objects[ob.name].copy()
- if single_user or ob.type=="ARMATURE":
+ if single_user or ob.type == "ARMATURE":
new_mesh_data = new_ob.data.copy()
new_ob.data = new_mesh_data
bpy.context.scene.objects.link(new_ob)
if ob != parent:
- new_ob.parent = parent
+ new_ob.parent = parent
else:
new_ob.parent = None
for child in ob.children:
- self.copy_object_recursive(child,new_ob,single_user)
+ self.copy_object_recursive(child, new_ob, single_user)
new_ob.select = True
+
return new_ob
- def delete_object(self,ob):
- if ob != None:
+ def delete_object(self, ob):
+ if ob is not None:
for child in ob.children:
self.delete_object(child)
bpy.context.scene.objects.unlink(ob)
bpy.data.objects.remove(ob)
- def convert_group_to_node(self,group):
- if group.dupli_group != None:
+ def convert_group_to_node(self, group):
+ if group.dupli_group is not None:
for object in group.dupli_group.objects:
- if object.parent == None:
- object = self.copy_object_recursive(object,object,True)
+ if object.parent is None:
+ object = self.copy_object_recursive(object, object, True)
matrix = Matrix(object.matrix_local)
object.matrix_local = Matrix()
object.matrix_local *= group.matrix_local
@@ -284,7 +309,7 @@ class export_group(bpy.types.Operator):
self.delete_object(group)
- def execute(self,context):
+ def execute(self, context):
scene = context.scene
group = context.scene.godot_export_groups
@@ -292,7 +317,7 @@ class export_group(bpy.types.Operator):
if not group[self.idx].active and self.export_all:
return{'FINISHED'}
- for i,object in enumerate(group[self.idx].nodes):
+ for i, object in enumerate(group[self.idx].nodes):
if object.name in bpy.data.objects:
pass
else:
@@ -300,21 +325,21 @@ class export_group(bpy.types.Operator):
bpy.ops.ed.undo_push(message="Clear not existent Group Nodes.")
path = group[self.idx].export_path
- if (path.find("//")==0 or path.find("\\\\")==0):
- #if relative, convert to absolute
+ if (path.find("//") == 0 or path.find("\\\\") == 0):
+ # If relative, convert to absolute
path = bpy.path.abspath(path)
- path = path.replace("\\","/")
+ path = path.replace("\\", "/")
- ### if path exists and group export name is set the group will be exported
- if os.path.exists(path) and group[self.idx].export_name != "":
-
- context.scene.layers = [True,True,True,True,True,True,True,True,True,True,True,True,True,True,True,True,True,True,True,True]
+ # If path exists and group export name is set the group will be
+ # exported
+ if os.path.exists(path) and group[self.idx].export_name != "":
+ context.scene.layers = [True] * 20
if group[self.idx].export_name.endswith(".dae"):
- path = os.path.join(path,group[self.idx].export_name)
+ path = os.path.join(path, group[self.idx].export_name)
else:
- path = os.path.join(path,group[self.idx].export_name+".dae")
+ path = os.path.join(path, group[self.idx].export_name+".dae")
hide_select = []
for object in context.scene.objects:
@@ -323,17 +348,19 @@ class export_group(bpy.types.Operator):
object.select = False
context.scene.objects.active = None
- ### make particle duplicates, parent and select them
+ # Make particle duplicates, parent and select them
nodes_to_be_added = []
if group[self.idx].use_include_particle_duplicates:
- for i,object in enumerate(group[self.idx].nodes):
+ for i, object in enumerate(group[self.idx].nodes):
if bpy.data.objects[object.name].type != "EMPTY":
- context.scene.objects.active = bpy.data.objects[object.name]
+ context.scene.objects.active = bpy.data.objects[
+ object.name]
bpy.data.objects[object.name].select = True
bpy.ops.object.duplicates_make_real()
for object in context.selected_objects:
nodes_to_be_added.append(object)
- bpy.ops.object.parent_set(type="OBJECT", keep_transform=False)
+ bpy.ops.object.parent_set(type="OBJECT",
+ keep_transform=False)
for object in context.selected_objects:
object.select = False
@@ -342,17 +369,35 @@ class export_group(bpy.types.Operator):
for object in nodes_to_be_added:
object.select = True
- ### select all other nodes from the group
- for i,object in enumerate(group[self.idx].nodes):
+ # Select all other nodes from the group
+ for i, object in enumerate(group[self.idx].nodes):
if bpy.data.objects[object.name].type == "EMPTY":
self.convert_group_to_node(bpy.data.objects[object.name])
else:
bpy.data.objects[object.name].select = True
- bpy.ops.object.transform_apply(location=group[self.idx].apply_loc, rotation=group[self.idx].apply_rot, scale=group[self.idx].apply_scale)
- bpy.ops.export_scene.dae(check_existing=True, filepath=path, filter_glob="*.dae", object_types=group[self.idx].object_types, use_export_selected=group[self.idx].use_export_selected, use_mesh_modifiers=group[self.idx].use_mesh_modifiers, use_tangent_arrays=group[self.idx].use_tangent_arrays, use_triangles=group[self.idx].use_triangles, use_copy_images=group[self.idx].use_copy_images, use_active_layers=group[self.idx].use_active_layers, use_anim=group[self.idx].use_anim, use_anim_action_all=group[self.idx].use_anim_action_all, use_anim_skip_noexp=group[self.idx].use_anim_skip_noexp, use_anim_optimize=group[self.idx].use_anim_optimize, anim_optimize_precision=group[self.idx].anim_optimize_precision, use_metadata=group[self.idx].use_metadata)
-
- self.report({'INFO'}, '"'+group[self.idx].name+'"' + " Group exported." )
+ bpy.ops.object.transform_apply(location=group[self.idx].apply_loc,
+ rotation=group[self.idx].apply_rot,
+ scale=group[self.idx].apply_scale)
+ bpy.ops.export_scene.dae(
+ check_existing=True, filepath=path, filter_glob="*.dae",
+ object_types=group[self.idx].object_types,
+ use_export_selected=group[self.idx].use_export_selected,
+ use_mesh_modifiers=group[self.idx].use_mesh_modifiers,
+ use_tangent_arrays=group[self.idx].use_tangent_arrays,
+ use_triangles=group[self.idx].use_triangles,
+ use_copy_images=group[self.idx].use_copy_images,
+ use_active_layers=group[self.idx].use_active_layers,
+ use_anim=group[self.idx].use_anim,
+ use_anim_action_all=group[self.idx].use_anim_action_all,
+ use_anim_skip_noexp=group[self.idx].use_anim_skip_noexp,
+ use_anim_optimize=group[self.idx].use_anim_optimize,
+ anim_optimize_precision=group[
+ self.idx].anim_optimize_precision,
+ use_metadata=group[self.idx].use_metadata)
+
+ self.report({'INFO'},
+ '"' + group[self.idx].name + '" Group exported.')
msg = "Export Group "+group[self.idx].name
bpy.ops.ed.undo_push(message="")
@@ -360,15 +405,18 @@ class export_group(bpy.types.Operator):
bpy.ops.ed.undo_push(message=msg)
else:
- self.report({'INFO'}, "Define Export Name and Export Path." )
+ self.report({'INFO'}, "Define Export Name and Export Path.")
+
return{'FINISHED'}
+
class add_export_group(bpy.types.Operator):
bl_idname = "scene.godot_add_export_group"
bl_label = "Adds a new export Group"
- bl_description = "Creates a new Export Group with the selected Objects assigned to it."
+ bl_description = "Creates a new Export Group with the selected"\
+ " Objects assigned to it."
- def execute(self,context):
+ def execute(self, context):
scene = context.scene
item = scene.godot_export_groups.add()
@@ -378,8 +426,10 @@ class add_export_group(bpy.types.Operator):
node.name = object.name
scene.godot_export_groups_index = len(scene.godot_export_groups)-1
bpy.ops.ed.undo_push(message="Create New Export Group")
+
return{'FINISHED'}
+
class del_export_group(bpy.types.Operator):
bl_idname = "scene.godot_delete_export_group"
bl_label = "Delets the selected export Group"
@@ -387,49 +437,100 @@ class del_export_group(bpy.types.Operator):
def invoke(self, context, event):
wm = context.window_manager
- return wm.invoke_confirm(self,event)
- def execute(self,context):
+ return wm.invoke_confirm(self, event)
+
+ def execute(self, context):
scene = context.scene
scene.godot_export_groups.remove(scene.godot_export_groups_index)
if scene.godot_export_groups_index > 0:
scene.godot_export_groups_index -= 1
bpy.ops.ed.undo_push(message="Delete Export Group")
- return{'FINISHED'}
+
+ return {'FINISHED'}
+
class godot_node_list(bpy.types.PropertyGroup):
name = StringProperty()
+
class godot_export_groups(bpy.types.PropertyGroup):
name = StringProperty(name="Group Name")
export_name = StringProperty(name="scene_name")
nodes = CollectionProperty(type=godot_node_list)
export_path = StringProperty(subtype="DIR_PATH")
- active = BoolProperty(default=True,description="Export Group")
-
- object_types = EnumProperty(name="Object Types",options={'ENUM_FLAG'},items=(('EMPTY', "Empty", ""),('CAMERA', "Camera", ""),('LAMP', "Lamp", ""),('ARMATURE', "Armature", ""),('MESH', "Mesh", ""),('CURVE', "Curve", ""),),default={'EMPTY', 'CAMERA', 'LAMP', 'ARMATURE', 'MESH','CURVE'})
+ active = BoolProperty(default=True, description="Export Group")
+
+ object_types = EnumProperty(name="Object Types", options={'ENUM_FLAG'},
+ items=(('EMPTY', "Empty", ""),
+ ('CAMERA', "Camera", ""),
+ ('LAMP', "Lamp", ""),
+ ('ARMATURE', "Armature", ""),
+ ('MESH', "Mesh", ""),
+ ('CURVE', "Curve", ""), ),
+ default={'EMPTY', 'CAMERA', 'LAMP',
+ 'ARMATURE', 'MESH', 'CURVE'})
+
+ apply_scale = BoolProperty(name="Apply Scale",
+ description="Apply Scale before export.",
+ default=False)
+ apply_rot = BoolProperty(name="Apply Rotation",
+ description="Apply Rotation before export.",
+ default=False)
+ apply_loc = BoolProperty(name="Apply Location",
+ description="Apply Location before export.",
+ default=False)
+
+ use_export_selected = BoolProperty(name="Selected Objects",
+ description="Export only selected"
+ "objects (and visible in active layers "
+ "if that applies).", default=True)
+ use_mesh_modifiers = BoolProperty(name="Apply Modifiers",
+ description="Apply modifiers to mesh"
+ " objects (on a copy!).", default=True)
+ use_tangent_arrays = BoolProperty(name="Tangent Arrays",
+ description="Export Tangent and Binormal"
+ " arrays (for normalmapping).",
+ default=False)
+ use_triangles = BoolProperty(name="Triangulate",
+ description="Export Triangles instead of"
+ " Polygons.", default=False)
+
+ use_copy_images = BoolProperty(name="Copy Images",
+ description="Copy Images (create images/ "
+ "subfolder)", default=False)
+ use_active_layers = BoolProperty(name="Active Layers",
+ description="Export only objects on the"
+ " active layers.", default=True)
+ use_anim = BoolProperty(name="Export Animation",
+ description="Export keyframe animation",
+ default=False)
+ use_anim_action_all = BoolProperty(name="All Actions",
+ description=("Export all actions for "
+ "the first armature found"
+ " in separate DAE files"),
+ default=False)
+ use_anim_skip_noexp = BoolProperty(name="Skip (-noexp) Actions",
+ description="Skip exporting of"
+ " actions whose name end in (-noexp)."
+ " Useful to skip control animations.",
+ default=True)
+ use_anim_optimize = BoolProperty(name="Optimize Keyframes",
+ description="Remove double keyframes",
+ default=True)
+
+ anim_optimize_precision = FloatProperty(
+ name="Precision", description=("Tolerence for comparing double "
+ "keyframes (higher for greater "
+ "accuracy)"), min=1, max=16,
+ soft_min=1, soft_max=16, default=6.0)
+
+ use_metadata = BoolProperty(name="Use Metadata", default=True,
+ options={'HIDDEN'})
+ use_include_particle_duplicates = BoolProperty(
+ name="Include Particle Duplicates", default=True)
- apply_scale = BoolProperty(name="Apply Scale",description="Apply Scale before export.",default=False)
- apply_rot = BoolProperty(name="Apply Rotation",description="Apply Rotation before export.",default=False)
- apply_loc = BoolProperty(name="Apply Location",description="Apply Location before export.",default=False)
-
- use_export_selected = BoolProperty(name="Selected Objects",description="Export only selected objects (and visible in active layers if that applies).",default=True)
- use_mesh_modifiers = BoolProperty(name="Apply Modifiers",description="Apply modifiers to mesh objects (on a copy!).",default=True)
- use_tangent_arrays = BoolProperty(name="Tangent Arrays",description="Export Tangent and Binormal arrays (for normalmapping).",default=False)
- use_triangles = BoolProperty(name="Triangulate",description="Export Triangles instead of Polygons.",default=False)
-
- use_copy_images = BoolProperty(name="Copy Images",description="Copy Images (create images/ subfolder)",default=False)
- use_active_layers = BoolProperty(name="Active Layers",description="Export only objects on the active layers.",default=True)
- use_anim = BoolProperty(name="Export Animation",description="Export keyframe animation",default=False)
- use_anim_action_all = BoolProperty(name="All Actions",description=("Export all actions for the first armature found in separate DAE files"),default=False)
- use_anim_skip_noexp = BoolProperty(name="Skip (-noexp) Actions",description="Skip exporting of actions whose name end in (-noexp). Useful to skip control animations.",default=True)
- use_anim_optimize = BoolProperty(name="Optimize Keyframes",description="Remove double keyframes",default=True)
-
- anim_optimize_precision = FloatProperty(name="Precision",description=("Tolerence for comparing double keyframes (higher for greater accuracy)"),min=1, max=16,soft_min=1, soft_max=16,default=6.0)
-
- use_metadata = BoolProperty(name="Use Metadata",default=True,options={'HIDDEN'})
- use_include_particle_duplicates = BoolProperty(name="Include Particle Duplicates",default=True)
def register():
bpy.utils.register_class(godot_export_manager)
@@ -445,8 +546,10 @@ def register():
bpy.utils.register_class(select_group_objects)
bpy.utils.register_class(UI_List_Godot)
- bpy.types.Scene.godot_export_groups = CollectionProperty(type=godot_export_groups)
- bpy.types.Scene.godot_export_groups_index = IntProperty(default=0,min=0)
+ bpy.types.Scene.godot_export_groups = CollectionProperty(
+ type=godot_export_groups)
+ bpy.types.Scene.godot_export_groups_index = IntProperty(default=0, min=0)
+
def unregister():
bpy.utils.unregister_class(godot_export_manager)
@@ -462,6 +565,7 @@ def unregister():
bpy.utils.unregister_class(select_group_objects)
bpy.utils.unregister_class(UI_List_Godot)
+
@persistent
def auto_export(dummy):
bpy.ops.scene.godot_export_groups_autosave()
diff --git a/tools/export/blender25/io_scene_dae/__init__.py b/tools/export/blender25/io_scene_dae/__init__.py
index a1a0eabbbe..0b82e1537b 100644
--- a/tools/export/blender25/io_scene_dae/__init__.py
+++ b/tools/export/blender25/io_scene_dae/__init__.py
@@ -18,35 +18,30 @@
# <pep8-80 compliant>
+import bpy
+from bpy.props import StringProperty, BoolProperty, FloatProperty, EnumProperty
+
+from bpy_extras.io_utils import ExportHelper
bl_info = {
"name": "Better Collada Exporter",
"author": "Juan Linietsky",
"blender": (2, 5, 8),
"api": 38691,
"location": "File > Import-Export",
- "description": ("Export DAE Scenes, This plugin actually works better! otherwise contact me."),
+ "description": ("Export DAE Scenes, This plugin actually works better! "
+ "otherwise contact me."),
"warning": "",
"wiki_url": ("http://www.godotengine.org"),
"tracker_url": "",
"support": 'OFFICIAL',
"category": "Import-Export"}
-
if "bpy" in locals():
import imp
if "export_dae" in locals():
imp.reload(export_dae)
-import bpy
-from bpy.props import StringProperty, BoolProperty, FloatProperty, EnumProperty
-
-from bpy_extras.io_utils import (ExportHelper,
- path_reference_mode,
- axis_conversion,
- )
-
-
class ExportDAE(bpy.types.Operator, ExportHelper):
'''Selection to DAE'''
bl_idname = "export_scene.dae"
@@ -59,90 +54,94 @@ class ExportDAE(bpy.types.Operator, ExportHelper):
# List of operator properties, the attributes will be assigned
# to the class instance from the operator settings before calling.
-
object_types = EnumProperty(
- name="Object Types",
- options={'ENUM_FLAG'},
- items=(('EMPTY', "Empty", ""),
- ('CAMERA', "Camera", ""),
- ('LAMP', "Lamp", ""),
- ('ARMATURE', "Armature", ""),
- ('MESH', "Mesh", ""),
- ('CURVE', "Curve", ""),
- ),
- default={'EMPTY', 'CAMERA', 'LAMP', 'ARMATURE', 'MESH','CURVE'},
- )
+ name="Object Types",
+ options={'ENUM_FLAG'},
+ items=(('EMPTY', "Empty", ""),
+ ('CAMERA', "Camera", ""),
+ ('LAMP', "Lamp", ""),
+ ('ARMATURE', "Armature", ""),
+ ('MESH', "Mesh", ""),
+ ('CURVE', "Curve", ""),
+ ),
+ default={'EMPTY', 'CAMERA', 'LAMP', 'ARMATURE', 'MESH', 'CURVE'},
+ )
use_export_selected = BoolProperty(
- name="Selected Objects",
- description="Export only selected objects (and visible in active layers if that applies).",
- default=False,
- )
+ name="Selected Objects",
+ description="Export only selected objects (and visible in active "
+ "layers if that applies).",
+ default=False,
+ )
use_mesh_modifiers = BoolProperty(
- name="Apply Modifiers",
- description="Apply modifiers to mesh objects (on a copy!).",
- default=False,
- )
+ name="Apply Modifiers",
+ description="Apply modifiers to mesh objects (on a copy!).",
+ default=False,
+ )
use_tangent_arrays = BoolProperty(
- name="Tangent Arrays",
- description="Export Tangent and Binormal arrays (for normalmapping).",
- default=False,
- )
+ name="Tangent Arrays",
+ description="Export Tangent and Binormal arrays "
+ "(for normalmapping).",
+ default=False,
+ )
use_triangles = BoolProperty(
- name="Triangulate",
- description="Export Triangles instead of Polygons.",
- default=False,
- )
+ name="Triangulate",
+ description="Export Triangles instead of Polygons.",
+ default=False,
+ )
use_copy_images = BoolProperty(
- name="Copy Images",
- description="Copy Images (create images/ subfolder)",
- default=False,
- )
+ name="Copy Images",
+ description="Copy Images (create images/ subfolder)",
+ default=False,
+ )
use_active_layers = BoolProperty(
- name="Active Layers",
- description="Export only objects on the active layers.",
- default=True,
- )
+ name="Active Layers",
+ description="Export only objects on the active layers.",
+ default=True,
+ )
use_anim = BoolProperty(
- name="Export Animation",
- description="Export keyframe animation",
- default=False,
- )
+ name="Export Animation",
+ description="Export keyframe animation",
+ default=False,
+ )
use_anim_action_all = BoolProperty(
- name="All Actions",
- description=("Export all actions for the first armature found in separate DAE files"),
- default=False,
- )
+ name="All Actions",
+ description=("Export all actions for the first armature found "
+ "in separate DAE files"),
+ default=False,
+ )
use_anim_skip_noexp = BoolProperty(
- name="Skip (-noexp) Actions",
- description="Skip exporting of actions whose name end in (-noexp). Useful to skip control animations.",
- default=True,
- )
+ name="Skip (-noexp) Actions",
+ description="Skip exporting of actions whose name end in (-noexp)."
+ " Useful to skip control animations.",
+ default=True,
+ )
use_anim_optimize = BoolProperty(
- name="Optimize Keyframes",
- description="Remove double keyframes",
- default=True,
- )
+ name="Optimize Keyframes",
+ description="Remove double keyframes",
+ default=True,
+ )
anim_optimize_precision = FloatProperty(
- name="Precision",
- description=("Tolerence for comparing double keyframes "
- "(higher for greater accuracy)"),
- min=1, max=16,
- soft_min=1, soft_max=16,
- default=6.0,
- )
+ name="Precision",
+ description=("Tolerence for comparing double keyframes "
+ "(higher for greater accuracy)"),
+ min=1, max=16,
+ soft_min=1, soft_max=16,
+ default=6.0,
+ )
use_metadata = BoolProperty(
- name="Use Metadata",
- default=True,
- options={'HIDDEN'},
- )
+ name="Use Metadata",
+ default=True,
+ options={'HIDDEN'},
+ )
@property
def check_extension(self):
- return True#return self.batch_mode == 'OFF'
+ # return self.batch_mode == 'OFF'
+ return True
def check(self, context):
return True
diff --git a/tools/export/blender25/io_scene_dae/export_dae.py b/tools/export/blender25/io_scene_dae/export_dae.py
index 2f7d1ddd86..9f8458c0da 100644
--- a/tools/export/blender25/io_scene_dae/export_dae.py
+++ b/tools/export/blender25/io_scene_dae/export_dae.py
@@ -46,1679 +46,1878 @@ import bpy
import bmesh
from mathutils import Vector, Matrix
-#according to collada spec, order matters
-S_ASSET=0
-S_IMGS=1
-S_FX=2
-S_MATS=3
-S_GEOM=4
-S_MORPH=5
-S_SKIN=6
-S_CONT=7
-S_CAMS=8
-S_LAMPS=9
-S_ANIM_CLIPS=10
-S_NODES=11
-S_ANIM=12
-
-CMP_EPSILON=0.0001
+# According to collada spec, order matters
+S_ASSET = 0
+S_IMGS = 1
+S_FX = 2
+S_MATS = 3
+S_GEOM = 4
+S_MORPH = 5
+S_SKIN = 6
+S_CONT = 7
+S_CAMS = 8
+S_LAMPS = 9
+S_ANIM_CLIPS = 10
+S_NODES = 11
+S_ANIM = 12
+
+CMP_EPSILON = 0.0001
+
def snap_tup(tup):
- ret=()
- for x in tup:
- ret+=( x-math.fmod(x,0.0001), )
+ ret = ()
+ for x in tup:
+ ret += (x - math.fmod(x, 0.0001), )
- return tup
+ return tup
def strmtx(mtx):
- s=" "
- for x in range(4):
- for y in range(4):
- s+=str(mtx[x][y])
- s+=" "
- s+=" "
- return s
-
-def numarr(a,mult=1.0):
- s=" "
- for x in a:
- s+=" "+str(x*mult)
- s+=" "
- return s
-
-def numarr_alpha(a,mult=1.0):
- s=" "
- for x in a:
- s+=" "+str(x*mult)
- if len(a) == 3:
- s+=" 1.0"
- s+=" "
- return s
-
-def strarr(arr):
- s=" "
- for x in arr:
- s+=" "+str(x)
- s+=" "
- return s
-
-class DaeExporter:
-
- def validate_id(self,d):
- if (d.find("id-")==0):
- return "z"+d
- return d
-
-
- def new_id(self,t):
- self.last_id+=1
- return "id-"+t+"-"+str(self.last_id)
-
- class Vertex:
-
- def close_to(v):
- if ( (self.vertex-v.vertex).length() > CMP_EPSILON ):
- return False
- if ( (self.normal-v.normal).length() > CMP_EPSILON ):
- return False
- if ( (self.uv-v.uv).length() > CMP_EPSILON ):
- return False
- if ( (self.uv2-v.uv2).length() > CMP_EPSILON ):
- return False
-
- return True
-
- def get_tup(self):
- tup = (self.vertex.x,self.vertex.y,self.vertex.z,self.normal.x,self.normal.y,self.normal.z)
- for t in self.uv:
- tup = tup + (t.x,t.y)
- if (self.color!=None):
- tup = tup + (self.color.x,self.color.y,self.color.z)
- if (self.tangent!=None):
- tup = tup + (self.tangent.x,self.tangent.y,self.tangent.z)
- if (self.bitangent!=None):
- tup = tup + (self.bitangent.x,self.bitangent.y,self.bitangent.z)
- for t in self.bones:
- tup = tup + (float(t),)
- for t in self.weights:
- tup = tup + (float(t),)
-
- return tup
-
- def __init__(self):
- self.vertex = Vector( (0.0,0.0,0.0) )
- self.normal = Vector( (0.0,0.0,0.0) )
- self.tangent = None
- self.bitangent = None
- self.color = None
- self.uv = []
- self.uv2 = Vector( (0.0,0.0) )
- self.bones=[]
- self.weights=[]
-
-
- def writel(self,section,indent,text):
- if (not (section in self.sections)):
- self.sections[section]=[]
- line=""
- for x in range(indent):
- line+="\t"
- line+=text
- self.sections[section].append(line)
-
-
- def export_image(self,image):
- if (image in self.image_cache):
- return self.image_cache[image]
-
- imgpath = image.filepath
- if (imgpath.find("//")==0 or imgpath.find("\\\\")==0):
- #if relative, convert to absolute
- imgpath = bpy.path.abspath(imgpath)
-
- #path is absolute, now do something!
-
- if (self.config["use_copy_images"]):
- #copy image
- basedir = os.path.dirname(self.path)+"/images"
- if (not os.path.isdir(basedir)):
- os.makedirs(basedir)
-
- if os.path.isfile(imgpath):
- dstfile=basedir+"/"+os.path.basename(imgpath)
-
- if (not os.path.isfile(dstfile)):
- shutil.copy(imgpath,dstfile)
- imgpath="images/"+os.path.basename(imgpath)
- else:
- ### if file is not found save it as png file in the destination folder
- img_tmp_path = image.filepath
- if img_tmp_path.endswith((".bmp",".rgb",".png",".jpeg",".jpg",".jp2",".tga",".cin",".dpx",".exr",".hdr",".tif")):
- image.filepath = basedir+"/"+os.path.basename(img_tmp_path)
- else:
- image.filepath = basedir+"/"+image.name+".png"
-
- dstfile=basedir+"/"+os.path.basename(image.filepath)
-
- if (not os.path.isfile(dstfile)):
-
- image.save()
- imgpath="images/"+os.path.basename(image.filepath)
- image.filepath = img_tmp_path
-
- else:
- #export relative, always, no one wants absolute paths.
- try:
- imgpath = os.path.relpath(imgpath,os.path.dirname(self.path)).replace("\\","/") # export unix compatible always
-
- except:
- pass #fails sometimes, not sure why
-
-
- imgid = self.new_id("image")
-
- print("FOR: "+imgpath)
-
-# if (not os.path.isfile(imgpath)):
-# print("NOT FILE?")
-# if imgpath.endswith((".bmp",".rgb",".png",".jpeg",".jpg",".jp2",".tga",".cin",".dpx",".exr",".hdr",".tif")):
-# imgpath="images/"+os.path.basename(imgpath)
-# else:
-# imgpath="images/"+image.name+".png"
-
- self.writel(S_IMGS,1,'<image id="'+imgid+'" name="'+image.name+'">')
- self.writel(S_IMGS,2,'<init_from>'+imgpath+'</init_from>')
- self.writel(S_IMGS,1,'</image>')
- self.image_cache[image]=imgid
- return imgid
-
- def export_material(self,material,double_sided_hint=True):
-
- if (material in self.material_cache):
- return self.material_cache[material]
-
- fxid = self.new_id("fx")
- self.writel(S_FX,1,'<effect id="'+fxid+'" name="'+material.name+'-fx">')
- self.writel(S_FX,2,'<profile_COMMON>')
-
- #Find and fetch the textures and create sources
- sampler_table={}
- diffuse_tex=None
- specular_tex=None
- emission_tex=None
- normal_tex=None
- for i in range(len(material.texture_slots)):
- ts=material.texture_slots[i]
- if (not ts):
- continue
- if (not ts.use):
- continue
- if (not ts.texture):
- continue
- if (ts.texture.type!="IMAGE"):
- continue
-
- if (ts.texture.image==None):
- continue
-
- #image
- imgid = self.export_image(ts.texture.image)
-
- #surface
- surface_sid = self.new_id("fx_surf")
- self.writel(S_FX,3,'<newparam sid="'+surface_sid+'">')
- self.writel(S_FX,4,'<surface type="2D">')
- self.writel(S_FX,5,'<init_from>'+imgid+'</init_from>') #this is sooo weird
- self.writel(S_FX,5,'<format>A8R8G8B8</format>')
- self.writel(S_FX,4,'</surface>')
- self.writel(S_FX,3,'</newparam>')
- #sampler, collada sure likes it difficult
- sampler_sid = self.new_id("fx_sampler")
- self.writel(S_FX,3,'<newparam sid="'+sampler_sid+'">')
- self.writel(S_FX,4,'<sampler2D>')
- self.writel(S_FX,5,'<source>'+surface_sid+'</source>')
- self.writel(S_FX,4,'</sampler2D>')
- self.writel(S_FX,3,'</newparam>')
- sampler_table[i]=sampler_sid
-
- if (ts.use_map_color_diffuse and diffuse_tex==None):
- diffuse_tex=sampler_sid
- if (ts.use_map_color_spec and specular_tex==None):
- specular_tex=sampler_sid
- if (ts.use_map_emit and emission_tex==None):
- emission_tex=sampler_sid
- if (ts.use_map_normal and normal_tex==None):
- normal_tex=sampler_sid
-
- self.writel(S_FX,3,'<technique sid="common">')
- shtype="blinn"
- self.writel(S_FX,4,'<'+shtype+'>')
- #ambient? from where?
-
- self.writel(S_FX,5,'<emission>')
- if (emission_tex!=None):
- self.writel(S_FX,6,'<texture texture="'+emission_tex+'" texcoord="CHANNEL1"/>')
- else:
- self.writel(S_FX,6,'<color>'+numarr_alpha(material.diffuse_color,material.emit)+' </color>') # not totally right but good enough
- self.writel(S_FX,5,'</emission>')
-
- self.writel(S_FX,5,'<ambient>')
- self.writel(S_FX,6,'<color>'+numarr_alpha(self.scene.world.ambient_color,material.ambient)+' </color>')
- self.writel(S_FX,5,'</ambient>')
-
- self.writel(S_FX,5,'<diffuse>')
- if (diffuse_tex!=None):
- self.writel(S_FX,6,'<texture texture="'+diffuse_tex+'" texcoord="CHANNEL1"/>')
- else:
- self.writel(S_FX,6,'<color>'+numarr_alpha(material.diffuse_color,material.diffuse_intensity)+'</color>')
- self.writel(S_FX,5,'</diffuse>')
-
- self.writel(S_FX,5,'<specular>')
- if (specular_tex!=None):
- self.writel(S_FX,6,'<texture texture="'+specular_tex+'" texcoord="CHANNEL1"/>')
- else:
- self.writel(S_FX,6,'<color>'+numarr_alpha(material.specular_color,material.specular_intensity)+'</color>')
- self.writel(S_FX,5,'</specular>')
-
- self.writel(S_FX,5,'<shininess>')
- self.writel(S_FX,6,'<float>'+str(material.specular_hardness)+'</float>')
- self.writel(S_FX,5,'</shininess>')
-
- self.writel(S_FX,5,'<reflective>')
- self.writel(S_FX,6,'<color>'+numarr_alpha(material.mirror_color)+'</color>')
- self.writel(S_FX,5,'</reflective>')
-
- if (material.use_transparency):
- self.writel(S_FX,5,'<transparency>')
- self.writel(S_FX,6,'<float>'+str(material.alpha)+'</float>')
- self.writel(S_FX,5,'</transparency>')
-
- self.writel(S_FX,5,'<index_of_refraction>')
- self.writel(S_FX,6,'<float>'+str(material.specular_ior)+'</float>')
- self.writel(S_FX,5,'</index_of_refraction>')
-
- self.writel(S_FX,4,'</'+shtype+'>')
-
- self.writel(S_FX,4,'<extra>')
- self.writel(S_FX,5,'<technique profile="FCOLLADA">')
- if (normal_tex):
- self.writel(S_FX,6,'<bump bumptype="NORMALMAP">')
- self.writel(S_FX,7,'<texture texture="'+normal_tex+'" texcoord="CHANNEL1"/>')
- self.writel(S_FX,6,'</bump>')
-
- self.writel(S_FX,5,'</technique>')
- self.writel(S_FX,5,'<technique profile="GOOGLEEARTH">')
- self.writel(S_FX,6,'<double_sided>'+["0","1"][double_sided_hint]+"</double_sided>")
- self.writel(S_FX,5,'</technique>')
-
- if (material.use_shadeless):
- self.writel(S_FX,5,'<technique profile="GODOT">')
- self.writel(S_FX,6,'<unshaded>1</unshaded>')
- self.writel(S_FX,5,'</technique>')
-
- self.writel(S_FX,4,'</extra>')
-
- self.writel(S_FX,3,'</technique>')
- self.writel(S_FX,2,'</profile_COMMON>')
- self.writel(S_FX,1,'</effect>')
-
- # Also export blender material in all it's glory (if set as active)
-
-
- #Material
- matid = self.new_id("material")
- self.writel(S_MATS,1,'<material id="'+matid+'" name="'+material.name+'">')
- self.writel(S_MATS,2,'<instance_effect url="#'+fxid+'"/>')
- self.writel(S_MATS,1,'</material>')
-
- self.material_cache[material]=matid
- return matid
-
-
- def export_mesh(self,node,armature=None,skeyindex=-1,skel_source=None,custom_name=None):
-
- mesh = node.data
-
-
- if (node.data in self.mesh_cache):
- return self.mesh_cache[mesh]
-
- if (skeyindex==-1 and mesh.shape_keys!=None and len(mesh.shape_keys.key_blocks)):
- values=[]
- morph_targets=[]
- md=None
- for k in range(0,len(mesh.shape_keys.key_blocks)):
- shape = node.data.shape_keys.key_blocks[k]
- values+=[shape.value] #save value
- shape.value=0
-
- mid = self.new_id("morph")
-
- for k in range(0,len(mesh.shape_keys.key_blocks)):
-
- shape = node.data.shape_keys.key_blocks[k]
- node.show_only_shape_key=True
- node.active_shape_key_index = k
- shape.value = 1.0
- mesh.update()
- """
- oldval = shape.value
- shape.value = 1.0
-
- """
- p = node.data
- v = node.to_mesh(bpy.context.scene, True, "RENDER")
- node.data = v
-# self.export_node(node,il,shape.name)
- node.data.update()
- if (armature and k==0):
- md=self.export_mesh(node,armature,k,mid,shape.name)
- else:
- md=self.export_mesh(node,None,k,None,shape.name)
-
- node.data = p
- node.data.update()
- shape.value = 0.0
- morph_targets.append(md)
-
- """
- shape.value = oldval
- """
- node.show_only_shape_key=False
- node.active_shape_key_index = 0
-
-
- self.writel(S_MORPH,1,'<controller id="'+mid+'" name="">')
- #if ("skin_id" in morph_targets[0]):
- # self.writel(S_MORPH,2,'<morph source="#'+morph_targets[0]["skin_id"]+'" method="NORMALIZED">')
- #else:
- self.writel(S_MORPH,2,'<morph source="#'+morph_targets[0]["id"]+'" method="NORMALIZED">')
-
- self.writel(S_MORPH,3,'<source id="'+mid+'-morph-targets">')
- self.writel(S_MORPH,4,'<IDREF_array id="'+mid+'-morph-targets-array" count="'+str(len(morph_targets)-1)+'">')
- marr=""
- warr=""
- for i in range(len(morph_targets)):
- if (i==0):
- continue
- elif (i>1):
- marr+=" "
-
- if ("skin_id" in morph_targets[i]):
- marr+=morph_targets[i]["skin_id"]
- else:
- marr+=morph_targets[i]["id"]
-
- warr+=" 0"
-
- self.writel(S_MORPH,5,marr)
- self.writel(S_MORPH,4,'</IDREF_array>')
- self.writel(S_MORPH,4,'<technique_common>')
- self.writel(S_MORPH,5,'<accessor source="#'+mid+'-morph-targets-array" count="'+str(len(morph_targets)-1)+'" stride="1">')
- self.writel(S_MORPH,6,'<param name="MORPH_TARGET" type="IDREF"/>')
- self.writel(S_MORPH,5,'</accessor>')
- self.writel(S_MORPH,4,'</technique_common>')
- self.writel(S_MORPH,3,'</source>')
-
- self.writel(S_MORPH,3,'<source id="'+mid+'-morph-weights">')
- self.writel(S_MORPH,4,'<float_array id="'+mid+'-morph-weights-array" count="'+str(len(morph_targets)-1)+'" >')
- self.writel(S_MORPH,5,warr)
- self.writel(S_MORPH,4,'</float_array>')
- self.writel(S_MORPH,4,'<technique_common>')
- self.writel(S_MORPH,5,'<accessor source="#'+mid+'-morph-weights-array" count="'+str(len(morph_targets)-1)+'" stride="1">')
- self.writel(S_MORPH,6,'<param name="MORPH_WEIGHT" type="float"/>')
- self.writel(S_MORPH,5,'</accessor>')
- self.writel(S_MORPH,4,'</technique_common>')
- self.writel(S_MORPH,3,'</source>')
-
- self.writel(S_MORPH,3,'<targets>')
- self.writel(S_MORPH,4,'<input semantic="MORPH_TARGET" source="#'+mid+'-morph-targets"/>')
- self.writel(S_MORPH,4,'<input semantic="MORPH_WEIGHT" source="#'+mid+'-morph-weights"/>')
- self.writel(S_MORPH,3,'</targets>')
- self.writel(S_MORPH,2,'</morph>')
- self.writel(S_MORPH,1,'</controller>')
- if (armature!=None):
-
- self.armature_for_morph[node]=armature
-
- meshdata={}
- if (armature):
- meshdata = morph_targets[0]
- meshdata["morph_id"]=mid
- else:
- meshdata["id"]=morph_targets[0]["id"]
- meshdata["morph_id"]=mid
- meshdata["material_assign"]=morph_targets[0]["material_assign"]
-
-
-
- self.mesh_cache[node.data]=meshdata
- return meshdata
-
- apply_modifiers = len(node.modifiers) and self.config["use_mesh_modifiers"]
-
- name_to_use = mesh.name
- #print("name to use: "+mesh.name)
- if (custom_name!=None and custom_name!=""):
- name_to_use=custom_name
-
- mesh=node.to_mesh(self.scene,apply_modifiers,"RENDER") #is this allright?
-
- triangulate=self.config["use_triangles"]
- if (triangulate):
- bm = bmesh.new()
- bm.from_mesh(mesh)
- bmesh.ops.triangulate(bm, faces=bm.faces)
- bm.to_mesh(mesh)
- bm.free()
-
-
- mesh.update(calc_tessface=True)
- vertices=[]
- vertex_map={}
- surface_indices={}
- materials={}
-
- materials={}
-
- si=None
- if (armature!=None):
- si=self.skeleton_info[armature]
-
- has_uv=False
- has_uv2=False
- has_weights=armature!=None
- has_tangents=self.config["use_tangent_arrays"] # could detect..
- has_colors=len(mesh.vertex_colors)
- mat_assign=[]
-
- uv_layer_count=len(mesh.uv_textures)
- if (has_tangents and len(mesh.uv_textures)):
- try:
- mesh.calc_tangents()
- except:
- self.operator.report({'WARNING'},'CalcTangets failed for mesh "'+mesh.name+'", no tangets will be exported.')
- #uv_layer_count=0
- mesh.calc_normals_split()
- has_tangents=False
-
- else:
- mesh.calc_normals_split()
- has_tangents=False
-
-
- for fi in range(len(mesh.polygons)):
- f=mesh.polygons[fi]
-
- if (not (f.material_index in surface_indices)):
- surface_indices[f.material_index]=[]
- #print("Type: "+str(type(f.material_index)))
- #print("IDX: "+str(f.material_index)+"/"+str(len(mesh.materials)))
-
- try:
- #Bizarre blender behavior i don't understand, so catching exception
- mat = mesh.materials[f.material_index]
- except:
- mat= None
-
- if (mat!=None):
- materials[f.material_index]=self.export_material( mat,mesh.show_double_sided )
- else:
- materials[f.material_index]=None #weird, has no material?
-
- indices = surface_indices[f.material_index]
- vi=[]
- #vertices always 3
- """
- if (len(f.vertices)==3):
- vi.append(0)
- vi.append(1)
- vi.append(2)
- elif (len(f.vertices)==4):
- #todo, should use shortest path
- vi.append(0)
- vi.append(1)
- vi.append(2)
- vi.append(0)
- vi.append(2)
- vi.append(3)
- """
-
- for lt in range(f.loop_total):
- loop_index = f.loop_start + lt
- ml = mesh.loops[loop_index]
- mv = mesh.vertices[ml.vertex_index]
-
- v = self.Vertex()
- v.vertex = Vector( mv.co )
-
- for xt in mesh.uv_layers:
- v.uv.append( Vector( xt.data[loop_index].uv ) )
-
- if (has_colors):
- v.color = Vector( mesh.vertex_colors[0].data[loop_index].color )
-
- v.normal = Vector( ml.normal )
-
- if (has_tangents):
- v.tangent = Vector( ml.tangent )
- v.bitangent = Vector( ml.bitangent )
-
-
- # if (armature):
- # v.vertex = node.matrix_world * v.vertex
-
- #v.color=Vertex(mv. ???
-
- if (armature!=None):
- wsum=0.0
- zero_bones=[]
-
- for vg in mv.groups:
- if vg.group >= len(node.vertex_groups):
- continue;
- name = node.vertex_groups[vg.group].name
-
- if (name in si["bone_index"]):
- #could still put the weight as 0.0001 maybe
- if (vg.weight>0.001): #blender has a lot of zero weight stuff
- v.bones.append(si["bone_index"][name])
- v.weights.append(vg.weight)
- wsum+=vg.weight
- if (wsum==0.0):
- if not self.wrongvtx_report:
- self.operator.report({'WARNING'},'Mesh for object "'+node.name+'" has unassigned weights. This may look wrong in exported model.')
- self.wrongvtx_report=True
-
- #blender can have bones assigned that weight zero so they remain local
- #this is the best it can be done?
- v.bones.append(0)
- v.weights.append(1)
-
-
-
-
- tup = v.get_tup()
- idx = 0
- if (skeyindex==-1 and tup in vertex_map): #do not optmize if using shapekeys
- idx = vertex_map[tup]
- else:
- idx = len(vertices)
- vertices.append(v)
- vertex_map[tup]=idx
-
- vi.append(idx)
-
- if (len(vi)>2):
- #only triangles and above
- indices.append(vi)
-
-
- meshid = self.new_id("mesh")
- self.writel(S_GEOM,1,'<geometry id="'+meshid+'" name="'+name_to_use+'">')
-
- self.writel(S_GEOM,2,'<mesh>')
-
-
- # Vertex Array
- self.writel(S_GEOM,3,'<source id="'+meshid+'-positions">')
- float_values=""
- for v in vertices:
- float_values+=" "+str(v.vertex.x)+" "+str(v.vertex.y)+" "+str(v.vertex.z)
- self.writel(S_GEOM,4,'<float_array id="'+meshid+'-positions-array" count="'+str(len(vertices)*3)+'">'+float_values+'</float_array>')
- self.writel(S_GEOM,4,'<technique_common>')
- self.writel(S_GEOM,4,'<accessor source="#'+meshid+'-positions-array" count="'+str(len(vertices))+'" stride="3">')
- self.writel(S_GEOM,5,'<param name="X" type="float"/>')
- self.writel(S_GEOM,5,'<param name="Y" type="float"/>')
- self.writel(S_GEOM,5,'<param name="Z" type="float"/>')
- self.writel(S_GEOM,4,'</accessor>')
- self.writel(S_GEOM,4,'</technique_common>')
- self.writel(S_GEOM,3,'</source>')
-
- # Normal Array
-
- self.writel(S_GEOM,3,'<source id="'+meshid+'-normals">')
- float_values=""
- for v in vertices:
- float_values+=" "+str(v.normal.x)+" "+str(v.normal.y)+" "+str(v.normal.z)
- self.writel(S_GEOM,4,'<float_array id="'+meshid+'-normals-array" count="'+str(len(vertices)*3)+'">'+float_values+'</float_array>')
- self.writel(S_GEOM,4,'<technique_common>')
- self.writel(S_GEOM,4,'<accessor source="#'+meshid+'-normals-array" count="'+str(len(vertices))+'" stride="3">')
- self.writel(S_GEOM,5,'<param name="X" type="float"/>')
- self.writel(S_GEOM,5,'<param name="Y" type="float"/>')
- self.writel(S_GEOM,5,'<param name="Z" type="float"/>')
- self.writel(S_GEOM,4,'</accessor>')
- self.writel(S_GEOM,4,'</technique_common>')
- self.writel(S_GEOM,3,'</source>')
-
- if (has_tangents):
- self.writel(S_GEOM,3,'<source id="'+meshid+'-tangents">')
- float_values=""
- for v in vertices:
- float_values+=" "+str(v.tangent.x)+" "+str(v.tangent.y)+" "+str(v.tangent.z)
- self.writel(S_GEOM,4,'<float_array id="'+meshid+'-tangents-array" count="'+str(len(vertices)*3)+'">'+float_values+'</float_array>')
- self.writel(S_GEOM,4,'<technique_common>')
- self.writel(S_GEOM,4,'<accessor source="#'+meshid+'-tangents-array" count="'+str(len(vertices))+'" stride="3">')
- self.writel(S_GEOM,5,'<param name="X" type="float"/>')
- self.writel(S_GEOM,5,'<param name="Y" type="float"/>')
- self.writel(S_GEOM,5,'<param name="Z" type="float"/>')
- self.writel(S_GEOM,4,'</accessor>')
- self.writel(S_GEOM,4,'</technique_common>')
- self.writel(S_GEOM,3,'</source>')
-
- self.writel(S_GEOM,3,'<source id="'+meshid+'-bitangents">')
- float_values=""
- for v in vertices:
- float_values+=" "+str(v.bitangent.x)+" "+str(v.bitangent.y)+" "+str(v.bitangent.z)
- self.writel(S_GEOM,4,'<float_array id="'+meshid+'-bitangents-array" count="'+str(len(vertices)*3)+'">'+float_values+'</float_array>')
- self.writel(S_GEOM,4,'<technique_common>')
- self.writel(S_GEOM,4,'<accessor source="#'+meshid+'-bitangents-array" count="'+str(len(vertices))+'" stride="3">')
- self.writel(S_GEOM,5,'<param name="X" type="float"/>')
- self.writel(S_GEOM,5,'<param name="Y" type="float"/>')
- self.writel(S_GEOM,5,'<param name="Z" type="float"/>')
- self.writel(S_GEOM,4,'</accessor>')
- self.writel(S_GEOM,4,'</technique_common>')
- self.writel(S_GEOM,3,'</source>')
-
-
-
- # UV Arrays
-
- for uvi in range(uv_layer_count):
-
- self.writel(S_GEOM,3,'<source id="'+meshid+'-texcoord-'+str(uvi)+'">')
- float_values=""
- for v in vertices:
- try:
- float_values+=" "+str(v.uv[uvi].x)+" "+str(v.uv[uvi].y)
- except:
- # I don't understand this weird multi-uv-layer API, but with this it seems to works
- float_values+=" 0 0 "
-
- self.writel(S_GEOM,4,'<float_array id="'+meshid+'-texcoord-'+str(uvi)+'-array" count="'+str(len(vertices)*2)+'">'+float_values+'</float_array>')
- self.writel(S_GEOM,4,'<technique_common>')
- self.writel(S_GEOM,4,'<accessor source="#'+meshid+'-texcoord-'+str(uvi)+'-array" count="'+str(len(vertices))+'" stride="2">')
- self.writel(S_GEOM,5,'<param name="S" type="float"/>')
- self.writel(S_GEOM,5,'<param name="T" type="float"/>')
- self.writel(S_GEOM,4,'</accessor>')
- self.writel(S_GEOM,4,'</technique_common>')
- self.writel(S_GEOM,3,'</source>')
-
- # Color Arrays
-
- if (has_colors):
- self.writel(S_GEOM,3,'<source id="'+meshid+'-colors">')
- float_values=""
- for v in vertices:
- float_values+=" "+str(v.color.x)+" "+str(v.color.y)+" "+str(v.color.z)
- self.writel(S_GEOM,4,'<float_array id="'+meshid+'-colors-array" count="'+str(len(vertices)*3)+'">'+float_values+'</float_array>')
- self.writel(S_GEOM,4,'<technique_common>')
- self.writel(S_GEOM,4,'<accessor source="#'+meshid+'-colors-array" count="'+str(len(vertices))+'" stride="3">')
- self.writel(S_GEOM,5,'<param name="X" type="float"/>')
- self.writel(S_GEOM,5,'<param name="Y" type="float"/>')
- self.writel(S_GEOM,5,'<param name="Z" type="float"/>')
- self.writel(S_GEOM,4,'</accessor>')
- self.writel(S_GEOM,4,'</technique_common>')
- self.writel(S_GEOM,3,'</source>')
-
- # Triangle Lists
- self.writel(S_GEOM,3,'<vertices id="'+meshid+'-vertices">')
- self.writel(S_GEOM,4,'<input semantic="POSITION" source="#'+meshid+'-positions"/>')
- self.writel(S_GEOM,3,'</vertices>')
-
- prim_type=""
- if (triangulate):
- prim_type="triangles"
- else:
- prim_type="polygons"
-
-
- for m in surface_indices:
- indices = surface_indices[m]
- mat = materials[m]
-
- if (mat!=None):
- matref = self.new_id("trimat")
- self.writel(S_GEOM,3,'<'+prim_type+' count="'+str(int(len(indices)))+'" material="'+matref+'">') # todo material
- mat_assign.append( (mat,matref) )
- else:
- self.writel(S_GEOM,3,'<'+prim_type+' count="'+str(int(len(indices)))+'">') # todo material
-
-
- self.writel(S_GEOM,4,'<input semantic="VERTEX" source="#'+meshid+'-vertices" offset="0"/>')
- self.writel(S_GEOM,4,'<input semantic="NORMAL" source="#'+meshid+'-normals" offset="0"/>')
-
- for uvi in range(uv_layer_count):
- self.writel(S_GEOM,4,'<input semantic="TEXCOORD" source="#'+meshid+'-texcoord-'+str(uvi)+'" offset="0" set="'+str(uvi)+'"/>')
-
- if (has_colors):
- self.writel(S_GEOM,4,'<input semantic="COLOR" source="#'+meshid+'-colors" offset="0"/>')
- if (has_tangents):
- self.writel(S_GEOM,4,'<input semantic="TEXTANGENT" source="#'+meshid+'-tangents" offset="0"/>')
- self.writel(S_GEOM,4,'<input semantic="TEXBINORMAL" source="#'+meshid+'-bitangents" offset="0"/>')
-
- if (triangulate):
- int_values="<p>"
- for p in indices:
- for i in p:
- int_values+=" "+str(i)
- int_values+=" </p>"
- self.writel(S_GEOM,4,int_values)
- else:
- for p in indices:
- int_values="<p>"
- for i in p:
- int_values+=" "+str(i)
- int_values+=" </p>"
- self.writel(S_GEOM,4,int_values)
-
- self.writel(S_GEOM,3,'</'+prim_type+'>')
-
-
- self.writel(S_GEOM,2,'</mesh>')
- self.writel(S_GEOM,1,'</geometry>')
-
-
- meshdata={}
- meshdata["id"]=meshid
- meshdata["material_assign"]=mat_assign
- if (skeyindex==-1):
- self.mesh_cache[node.data]=meshdata
-
-
- # Export armature data (if armature exists)
-
- if (armature!=None and (skel_source!=None or skeyindex==-1)):
-
- contid = self.new_id("controller")
-
- self.writel(S_SKIN,1,'<controller id="'+contid+'">')
- if (skel_source!=None):
- self.writel(S_SKIN,2,'<skin source="#'+skel_source+'">')
- else:
- self.writel(S_SKIN,2,'<skin source="#'+meshid+'">')
-
- self.writel(S_SKIN,3,'<bind_shape_matrix>'+strmtx(node.matrix_world)+'</bind_shape_matrix>')
- #Joint Names
- self.writel(S_SKIN,3,'<source id="'+contid+'-joints">')
- name_values=""
- for v in si["bone_names"]:
- name_values+=" "+v
-
- self.writel(S_SKIN,4,'<Name_array id="'+contid+'-joints-array" count="'+str(len(si["bone_names"]))+'">'+name_values+'</Name_array>')
- self.writel(S_SKIN,4,'<technique_common>')
- self.writel(S_SKIN,4,'<accessor source="#'+contid+'-joints-array" count="'+str(len(si["bone_names"]))+'" stride="1">')
- self.writel(S_SKIN,5,'<param name="JOINT" type="Name"/>')
- self.writel(S_SKIN,4,'</accessor>')
- self.writel(S_SKIN,4,'</technique_common>')
- self.writel(S_SKIN,3,'</source>')
- #Pose Matrices!
- self.writel(S_SKIN,3,'<source id="'+contid+'-bind_poses">')
- pose_values=""
- for v in si["bone_bind_poses"]:
- pose_values+=" "+strmtx(v)
-
- self.writel(S_SKIN,4,'<float_array id="'+contid+'-bind_poses-array" count="'+str(len(si["bone_bind_poses"])*16)+'">'+pose_values+'</float_array>')
- self.writel(S_SKIN,4,'<technique_common>')
- self.writel(S_SKIN,4,'<accessor source="#'+contid+'-bind_poses-array" count="'+str(len(si["bone_bind_poses"]))+'" stride="16">')
- self.writel(S_SKIN,5,'<param name="TRANSFORM" type="float4x4"/>')
- self.writel(S_SKIN,4,'</accessor>')
- self.writel(S_SKIN,4,'</technique_common>')
- self.writel(S_SKIN,3,'</source>')
- #Skin Weights!
- self.writel(S_SKIN,3,'<source id="'+contid+'-skin_weights">')
- skin_weights=""
- skin_weights_total=0
- for v in vertices:
- skin_weights_total+=len(v.weights)
- for w in v.weights:
- skin_weights+=" "+str(w)
-
- self.writel(S_SKIN,4,'<float_array id="'+contid+'-skin_weights-array" count="'+str(skin_weights_total)+'">'+skin_weights+'</float_array>')
- self.writel(S_SKIN,4,'<technique_common>')
- self.writel(S_SKIN,4,'<accessor source="#'+contid+'-skin_weights-array" count="'+str(skin_weights_total)+'" stride="1">')
- self.writel(S_SKIN,5,'<param name="WEIGHT" type="float"/>')
- self.writel(S_SKIN,4,'</accessor>')
- self.writel(S_SKIN,4,'</technique_common>')
- self.writel(S_SKIN,3,'</source>')
-
-
- self.writel(S_SKIN,3,'<joints>')
- self.writel(S_SKIN,4,'<input semantic="JOINT" source="#'+contid+'-joints"/>')
- self.writel(S_SKIN,4,'<input semantic="INV_BIND_MATRIX" source="#'+contid+'-bind_poses"/>')
- self.writel(S_SKIN,3,'</joints>')
- self.writel(S_SKIN,3,'<vertex_weights count="'+str(len(vertices))+'">')
- self.writel(S_SKIN,4,'<input semantic="JOINT" source="#'+contid+'-joints" offset="0"/>')
- self.writel(S_SKIN,4,'<input semantic="WEIGHT" source="#'+contid+'-skin_weights" offset="1"/>')
- vcounts=""
- vs=""
- vcount=0
- for v in vertices:
- vcounts+=" "+str(len(v.weights))
- for b in v.bones:
- vs+=" "+str(b)
- vs+=" "+str(vcount)
- vcount+=1
- self.writel(S_SKIN,4,'<vcount>'+vcounts+'</vcount>')
- self.writel(S_SKIN,4,'<v>'+vs+'</v>')
- self.writel(S_SKIN,3,'</vertex_weights>')
-
-
- self.writel(S_SKIN,2,'</skin>')
- self.writel(S_SKIN,1,'</controller>')
- meshdata["skin_id"]=contid
-
-
- return meshdata
-
-
- def export_mesh_node(self,node,il):
-
- if (node.data==None):
- return
- armature=None
- armcount=0
- for n in node.modifiers:
- if (n.type=="ARMATURE"):
- armcount+=1
-
- if (node.parent!=None):
- if (node.parent.type=="ARMATURE"):
- armature=node.parent
- if (armcount>1):
- self.operator.report({'WARNING'},'Object "'+node.name+'" refers to more than one armature! This is unsupported.')
- if (armcount==0):
- self.operator.report({'WARNING'},'Object "'+node.name+'" is child of an armature, but has no armature modifier.')
-
-
- if (armcount>0 and not armature):
- self.operator.report({'WARNING'},'Object "'+node.name+'" has armature modifier, but is not a child of an armature. This is unsupported.')
-
-
- if (node.data.shape_keys!=None):
- sk = node.data.shape_keys
- if (sk.animation_data):
- #print("HAS ANIM")
- #print("DRIVERS: "+str(len(sk.animation_data.drivers)))
- for d in sk.animation_data.drivers:
- if (d.driver):
- for v in d.driver.variables:
- for t in v.targets:
- if (t.id!=None and t.id.name in self.scene.objects):
- #print("LINKING "+str(node)+" WITH "+str(t.id.name))
- self.armature_for_morph[node]=self.scene.objects[t.id.name]
-
-
- meshdata = self.export_mesh(node,armature)
- close_controller=False
-
- if ("skin_id" in meshdata):
- close_controller=True
- self.writel(S_NODES,il,'<instance_controller url="#'+meshdata["skin_id"]+'">')
- for sn in self.skeleton_info[armature]["skeleton_nodes"]:
- self.writel(S_NODES,il+1,'<skeleton>#'+sn+'</skeleton>')
- elif ("morph_id" in meshdata):
- self.writel(S_NODES,il,'<instance_controller url="#'+meshdata["morph_id"]+'">')
- close_controller=True
- elif (armature==None):
- self.writel(S_NODES,il,'<instance_geometry url="#'+meshdata["id"]+'">')
-
-
- if (len(meshdata["material_assign"])>0):
-
- self.writel(S_NODES,il+1,'<bind_material>')
- self.writel(S_NODES,il+2,'<technique_common>')
- for m in meshdata["material_assign"]:
- self.writel(S_NODES,il+3,'<instance_material symbol="'+m[1]+'" target="#'+m[0]+'"/>')
-
- self.writel(S_NODES,il+2,'</technique_common>')
- self.writel(S_NODES,il+1,'</bind_material>')
-
- if (close_controller):
- self.writel(S_NODES,il,'</instance_controller>')
- else:
- self.writel(S_NODES,il,'</instance_geometry>')
-
-
- def export_armature_bone(self,bone,il,si):
- boneid = self.new_id("bone")
- boneidx = si["bone_count"]
- si["bone_count"]+=1
- bonesid = si["id"]+"-"+str(boneidx)
- if (bone.name in self.used_bones):
- if (self.config["use_anim_action_all"]):
- self.operator.report({'WARNING'},'Bone name "'+bone.name+'" used in more than one skeleton. Actions might export wrong.')
- else:
- self.used_bones.append(bone.name)
-
- si["bone_index"][bone.name]=boneidx
- si["bone_ids"][bone]=boneid
- si["bone_names"].append(bonesid)
- self.writel(S_NODES,il,'<node id="'+boneid+'" sid="'+bonesid+'" name="'+bone.name+'" type="JOINT">')
- il+=1
- xform = bone.matrix_local
- si["bone_bind_poses"].append((si["armature_xform"] * xform).inverted())
-
- if (bone.parent!=None):
- xform = bone.parent.matrix_local.inverted() * xform
- else:
- si["skeleton_nodes"].append(boneid)
-
- self.writel(S_NODES,il,'<matrix sid="transform">'+strmtx(xform)+'</matrix>')
- for c in bone.children:
- self.export_armature_bone(c,il,si)
- il-=1
- self.writel(S_NODES,il,'</node>')
-
-
- def export_armature_node(self,node,il):
-
- if (node.data==None):
- return
-
- self.skeletons.append(node)
-
- armature = node.data
- self.skeleton_info[node]={ "bone_count":0, "id":self.new_id("skelbones"),"name":node.name, "bone_index":{},"bone_ids":{},"bone_names":[],"bone_bind_poses":[],"skeleton_nodes":[],"armature_xform":node.matrix_world }
-
-
-
- for b in armature.bones:
- if (b.parent!=None):
- continue
- self.export_armature_bone(b,il,self.skeleton_info[node])
-
- if (node.pose):
- for b in node.pose.bones:
- for x in b.constraints:
- if (x.type=='ACTION'):
- self.action_constraints.append(x.action)
-
-
- def export_camera_node(self,node,il):
-
- if (node.data==None):
- return
-
- camera=node.data
- camid=self.new_id("camera")
- self.writel(S_CAMS,1,'<camera id="'+camid+'" name="'+camera.name+'">')
- self.writel(S_CAMS,2,'<optics>')
- self.writel(S_CAMS,3,'<technique_common>')
- if (camera.type=="PERSP"):
- self.writel(S_CAMS,4,'<perspective>')
- self.writel(S_CAMS,5,'<yfov> '+str(math.degrees(camera.angle))+' </yfov>') # I think?
- self.writel(S_CAMS,5,'<aspect_ratio> '+str(self.scene.render.resolution_x / self.scene.render.resolution_y)+' </aspect_ratio>')
- self.writel(S_CAMS,5,'<znear> '+str(camera.clip_start)+' </znear>')
- self.writel(S_CAMS,5,'<zfar> '+str(camera.clip_end)+' </zfar>')
- self.writel(S_CAMS,4,'</perspective>')
- else:
- self.writel(S_CAMS,4,'<orthographic>')
- self.writel(S_CAMS,5,'<xmag> '+str(camera.ortho_scale*0.5)+' </xmag>') # I think?
- self.writel(S_CAMS,5,'<aspect_ratio> '+str(self.scene.render.resolution_x / self.scene.render.resolution_y)+' </aspect_ratio>')
- self.writel(S_CAMS,5,'<znear> '+str(camera.clip_start)+' </znear>')
- self.writel(S_CAMS,5,'<zfar> '+str(camera.clip_end)+' </zfar>')
- self.writel(S_CAMS,4,'</orthographic>')
-
- self.writel(S_CAMS,3,'</technique_common>')
- self.writel(S_CAMS,2,'</optics>')
- self.writel(S_CAMS,1,'</camera>')
-
-
- self.writel(S_NODES,il,'<instance_camera url="#'+camid+'"/>')
-
- def export_lamp_node(self,node,il):
-
- if (node.data==None):
- return
-
- light=node.data
- lightid=self.new_id("light")
- self.writel(S_LAMPS,1,'<light id="'+lightid+'" name="'+light.name+'">')
- #self.writel(S_LAMPS,2,'<optics>')
- self.writel(S_LAMPS,3,'<technique_common>')
-
- if (light.type=="POINT"):
- self.writel(S_LAMPS,4,'<point>')
- self.writel(S_LAMPS,5,'<color>'+strarr(light.color)+'</color>')
- att_by_distance = 2.0 / light.distance # convert to linear attenuation
- self.writel(S_LAMPS,5,'<linear_attenuation>'+str(att_by_distance)+'</linear_attenuation>')
- if (light.use_sphere):
- self.writel(S_LAMPS,5,'<zfar>'+str(light.distance)+'</zfar>')
-
- self.writel(S_LAMPS,4,'</point>')
- elif (light.type=="SPOT"):
- self.writel(S_LAMPS,4,'<spot>')
- self.writel(S_LAMPS,5,'<color>'+strarr(light.color)+'</color>')
- att_by_distance = 2.0 / light.distance # convert to linear attenuation
- self.writel(S_LAMPS,5,'<linear_attenuation>'+str(att_by_distance)+'</linear_attenuation>')
- self.writel(S_LAMPS,5,'<falloff_angle>'+str(math.degrees(light.spot_size/2))+'</falloff_angle>')
- self.writel(S_LAMPS,4,'</spot>')
-
-
- else: #write a sun lamp for everything else (not supported)
- self.writel(S_LAMPS,4,'<directional>')
- self.writel(S_LAMPS,5,'<color>'+strarr(light.color)+'</color>')
- self.writel(S_LAMPS,4,'</directional>')
-
-
- self.writel(S_LAMPS,3,'</technique_common>')
- #self.writel(S_LAMPS,2,'</optics>')
- self.writel(S_LAMPS,1,'</light>')
-
-
- self.writel(S_NODES,il,'<instance_light url="#'+lightid+'"/>')
-
- def export_empty_node(self,node,il):
-
- self.writel(S_NODES,4,'<extra>')
- self.writel(S_NODES,5,'<technique profile="GODOT">')
- self.writel(S_NODES,6,'<empty_draw_type>'+node.empty_draw_type+'</empty_draw_type>')
- self.writel(S_NODES,5,'</technique>')
- self.writel(S_NODES,4,'</extra>')
-
-
- def export_curve(self,curve):
-
- splineid = self.new_id("spline")
-
- self.writel(S_GEOM,1,'<geometry id="'+splineid+'" name="'+curve.name+'">')
- self.writel(S_GEOM,2,'<spline closed="0">')
-
- points=[]
- interps=[]
- handles_in=[]
- handles_out=[]
- tilts=[]
-
- for cs in curve.splines:
-
- if (cs.type=="BEZIER"):
- for s in cs.bezier_points:
- points.append(s.co[0])
- points.append(s.co[1])
- points.append(s.co[2])
-
-
- handles_in.append(s.handle_left[0])
- handles_in.append(s.handle_left[1])
- handles_in.append(s.handle_left[2])
-
- handles_out.append(s.handle_right[0])
- handles_out.append(s.handle_right[1])
- handles_out.append(s.handle_right[2])
-
-
- tilts.append(s.tilt)
- interps.append("BEZIER")
- else:
-
- for s in cs.points:
- points.append(s.co[0])
- points.append(s.co[1])
- points.append(s.co[2])
- handles_in.append(s.co[0])
- handles_in.append(s.co[1])
- handles_in.append(s.co[2])
- handles_out.append(s.co[0])
- handles_out.append(s.co[1])
- handles_out.append(s.co[2])
- tilts.append(s.tilt)
- interps.append("LINEAR")
-
-
-
-
- self.writel(S_GEOM,3,'<source id="'+splineid+'-positions">')
- position_values=""
- for x in points:
- position_values+=" "+str(x)
- self.writel(S_GEOM,4,'<float_array id="'+splineid+'-positions-array" count="'+str(len(points))+'">'+position_values+'</float_array>')
- self.writel(S_GEOM,4,'<technique_common>')
- self.writel(S_GEOM,4,'<accessor source="#'+splineid+'-positions-array" count="'+str(len(points)/3)+'" stride="3">')
- self.writel(S_GEOM,5,'<param name="X" type="float"/>')
- self.writel(S_GEOM,5,'<param name="Y" type="float"/>')
- self.writel(S_GEOM,5,'<param name="Z" type="float"/>')
- self.writel(S_GEOM,4,'</accessor>')
- self.writel(S_GEOM,3,'</source>')
-
- self.writel(S_GEOM,3,'<source id="'+splineid+'-intangents">')
- intangent_values=""
- for x in handles_in:
- intangent_values+=" "+str(x)
- self.writel(S_GEOM,4,'<float_array id="'+splineid+'-intangents-array" count="'+str(len(points))+'">'+intangent_values+'</float_array>')
- self.writel(S_GEOM,4,'<technique_common>')
- self.writel(S_GEOM,4,'<accessor source="#'+splineid+'-intangents-array" count="'+str(len(points)/3)+'" stride="3">')
- self.writel(S_GEOM,5,'<param name="X" type="float"/>')
- self.writel(S_GEOM,5,'<param name="Y" type="float"/>')
- self.writel(S_GEOM,5,'<param name="Z" type="float"/>')
- self.writel(S_GEOM,4,'</accessor>')
- self.writel(S_GEOM,3,'</source>')
-
- self.writel(S_GEOM,3,'<source id="'+splineid+'-outtangents">')
- outtangent_values=""
- for x in handles_out:
- outtangent_values+=" "+str(x)
- self.writel(S_GEOM,4,'<float_array id="'+splineid+'-outtangents-array" count="'+str(len(points))+'">'+outtangent_values+'</float_array>')
- self.writel(S_GEOM,4,'<technique_common>')
- self.writel(S_GEOM,4,'<accessor source="#'+splineid+'-outtangents-array" count="'+str(len(points)/3)+'" stride="3">')
- self.writel(S_GEOM,5,'<param name="X" type="float"/>')
- self.writel(S_GEOM,5,'<param name="Y" type="float"/>')
- self.writel(S_GEOM,5,'<param name="Z" type="float"/>')
- self.writel(S_GEOM,4,'</accessor>')
- self.writel(S_GEOM,3,'</source>')
-
- self.writel(S_GEOM,3,'<source id="'+splineid+'-interpolations">')
- interpolation_values=""
- for x in interps:
- interpolation_values+=" "+x
- self.writel(S_GEOM,4,'<Name_array id="'+splineid+'-interpolations-array" count="'+str(len(interps))+'">'+interpolation_values+'</Name_array>')
- self.writel(S_GEOM,4,'<technique_common>')
- self.writel(S_GEOM,4,'<accessor source="#'+splineid+'-interpolations-array" count="'+str(len(interps))+'" stride="1">')
- self.writel(S_GEOM,5,'<param name="INTERPOLATION" type="name"/>')
- self.writel(S_GEOM,4,'</accessor>')
- self.writel(S_GEOM,3,'</source>')
-
-
- self.writel(S_GEOM,3,'<source id="'+splineid+'-tilts">')
- tilt_values=""
- for x in tilts:
- tilt_values+=" "+str(x)
- self.writel(S_GEOM,4,'<float_array id="'+splineid+'-tilts-array" count="'+str(len(tilts))+'">'+tilt_values+'</float_array>')
- self.writel(S_GEOM,4,'<technique_common>')
- self.writel(S_GEOM,4,'<accessor source="#'+splineid+'-tilts-array" count="'+str(len(tilts))+'" stride="1">')
- self.writel(S_GEOM,5,'<param name="TILT" type="float"/>')
- self.writel(S_GEOM,4,'</accessor>')
- self.writel(S_GEOM,3,'</source>')
-
- self.writel(S_GEOM,3,'<control_vertices>')
- self.writel(S_GEOM,4,'<input semantic="POSITION" source="#'+splineid+'-positions"/>')
- self.writel(S_GEOM,4,'<input semantic="IN_TANGENT" source="#'+splineid+'-intangents"/>')
- self.writel(S_GEOM,4,'<input semantic="OUT_TANGENT" source="#'+splineid+'-outtangents"/>')
- self.writel(S_GEOM,4,'<input semantic="INTERPOLATION" source="#'+splineid+'-interpolations"/>')
- self.writel(S_GEOM,4,'<input semantic="TILT" source="#'+splineid+'-tilts"/>')
- self.writel(S_GEOM,3,'</control_vertices>')
-
-
- self.writel(S_GEOM,2,'</spline>')
- self.writel(S_GEOM,1,'</geometry>')
-
- return splineid
-
- def export_curve_node(self,node,il):
-
- if (node.data==None):
- return
- curveid = self.export_curve(node.data)
-
- self.writel(S_NODES,il,'<instance_geometry url="#'+curveid+'">')
- self.writel(S_NODES,il,'</instance_geometry>')
-
-
-
- def export_node(self,node,il):
- if (not node in self.valid_nodes):
- return
- prev_node = bpy.context.scene.objects.active
- bpy.context.scene.objects.active = node
-
- self.writel(S_NODES,il,'<node id="'+self.validate_id(node.name)+'" name="'+node.name+'" type="NODE">')
- il+=1
-
- self.writel(S_NODES,il,'<matrix sid="transform">'+strmtx(node.matrix_local)+'</matrix>')
- #print("NODE TYPE: "+node.type+" NAME: "+node.name)
- if (node.type=="MESH"):
- self.export_mesh_node(node,il)
- elif (node.type=="CURVE"):
- self.export_curve_node(node,il)
- elif (node.type=="ARMATURE"):
- self.export_armature_node(node,il)
- elif (node.type=="CAMERA"):
- self.export_camera_node(node,il)
- elif (node.type=="LAMP"):
- self.export_lamp_node(node,il)
- elif (node.type=="EMPTY"):
- self.export_empty_node(node,il)
-
- for x in node.children:
- self.export_node(x,il)
-
- il-=1
- self.writel(S_NODES,il,'</node>')
- bpy.context.scene.objects.active = prev_node #make previous node active again
-
- def is_node_valid(self,node):
- if (not node.type in self.config["object_types"]):
- return False
- if (self.config["use_active_layers"]):
- valid=False
- #print("NAME: "+node.name)
- for i in range(20):
- if (node.layers[i] and self.scene.layers[i]):
- valid=True
- break
- if (not valid):
- return False
-
- if (self.config["use_export_selected"] and not node.select):
- return False
-
- return True
-
-
- def export_scene(self):
-
-
- self.writel(S_NODES,0,'<library_visual_scenes>')
- self.writel(S_NODES,1,'<visual_scene id="'+self.scene_name+'" name="scene">')
-
- #validate nodes
- for obj in self.scene.objects:
- if (obj in self.valid_nodes):
- continue
- if (self.is_node_valid(obj)):
- n = obj
- while (n!=None):
- if (not n in self.valid_nodes):
- self.valid_nodes.append(n)
- n=n.parent
-
-
-
- for obj in self.scene.objects:
- if (obj in self.valid_nodes and obj.parent==None):
- self.export_node(obj,2)
-
- self.writel(S_NODES,1,'</visual_scene>')
- self.writel(S_NODES,0,'</library_visual_scenes>')
-
- def export_asset(self):
-
-
- self.writel(S_ASSET,0,'<asset>')
- # Why is this time stuff mandatory?, no one could care less...
- self.writel(S_ASSET,1,'<contributor>')
- self.writel(S_ASSET,2,'<author> Anonymous </author>') #Who made Collada, the FBI ?
- self.writel(S_ASSET,2,'<authoring_tool> Collada Exporter for Blender 2.6+, by Juan Linietsky (juan@codenix.com) </authoring_tool>') #Who made Collada, the FBI ?
- self.writel(S_ASSET,1,'</contributor>')
- self.writel(S_ASSET,1,'<created>'+time.strftime("%Y-%m-%dT%H:%M:%SZ ")+'</created>')
- self.writel(S_ASSET,1,'<modified>'+time.strftime("%Y-%m-%dT%H:%M:%SZ")+'</modified>')
- self.writel(S_ASSET,1,'<unit meter="1.0" name="meter"/>')
- self.writel(S_ASSET,1,'<up_axis>Z_UP</up_axis>')
- self.writel(S_ASSET,0,'</asset>')
-
-
- def export_animation_transform_channel(self,target,keys,matrices=True):
-
- frame_total=len(keys)
- anim_id=self.new_id("anim")
- self.writel(S_ANIM,1,'<animation id="'+anim_id+'">')
- source_frames = ""
- source_transforms = ""
- source_interps = ""
-
- for k in keys:
- source_frames += " "+str(k[0])
- if (matrices):
- source_transforms += " "+strmtx(k[1])
- else:
- source_transforms += " "+str(k[1])
-
- source_interps +=" LINEAR"
-
-
- # Time Source
- self.writel(S_ANIM,2,'<source id="'+anim_id+'-input">')
- self.writel(S_ANIM,3,'<float_array id="'+anim_id+'-input-array" count="'+str(frame_total)+'">'+source_frames+'</float_array>')
- self.writel(S_ANIM,3,'<technique_common>')
- self.writel(S_ANIM,4,'<accessor source="#'+anim_id+'-input-array" count="'+str(frame_total)+'" stride="1">')
- self.writel(S_ANIM,5,'<param name="TIME" type="float"/>')
- self.writel(S_ANIM,4,'</accessor>')
- self.writel(S_ANIM,3,'</technique_common>')
- self.writel(S_ANIM,2,'</source>')
-
- if (matrices):
- # Transform Source
- self.writel(S_ANIM,2,'<source id="'+anim_id+'-transform-output">')
- self.writel(S_ANIM,3,'<float_array id="'+anim_id+'-transform-output-array" count="'+str(frame_total*16)+'">'+source_transforms+'</float_array>')
- self.writel(S_ANIM,3,'<technique_common>')
- self.writel(S_ANIM,4,'<accessor source="#'+anim_id+'-transform-output-array" count="'+str(frame_total)+'" stride="16">')
- self.writel(S_ANIM,5,'<param name="TRANSFORM" type="float4x4"/>')
- self.writel(S_ANIM,4,'</accessor>')
- self.writel(S_ANIM,3,'</technique_common>')
- self.writel(S_ANIM,2,'</source>')
- else:
- # Value Source
- self.writel(S_ANIM,2,'<source id="'+anim_id+'-transform-output">')
- self.writel(S_ANIM,3,'<float_array id="'+anim_id+'-transform-output-array" count="'+str(frame_total)+'">'+source_transforms+'</float_array>')
- self.writel(S_ANIM,3,'<technique_common>')
- self.writel(S_ANIM,4,'<accessor source="#'+anim_id+'-transform-output-array" count="'+str(frame_total)+'" stride="1">')
- self.writel(S_ANIM,5,'<param name="X" type="float"/>')
- self.writel(S_ANIM,4,'</accessor>')
- self.writel(S_ANIM,3,'</technique_common>')
- self.writel(S_ANIM,2,'</source>')
-
- # Interpolation Source
- self.writel(S_ANIM,2,'<source id="'+anim_id+'-interpolation-output">')
- self.writel(S_ANIM,3,'<Name_array id="'+anim_id+'-interpolation-output-array" count="'+str(frame_total)+'">'+source_interps+'</Name_array>')
- self.writel(S_ANIM,3,'<technique_common>')
- self.writel(S_ANIM,4,'<accessor source="#'+anim_id+'-interpolation-output-array" count="'+str(frame_total)+'" stride="1">')
- self.writel(S_ANIM,5,'<param name="INTERPOLATION" type="Name"/>')
- self.writel(S_ANIM,4,'</accessor>')
- self.writel(S_ANIM,3,'</technique_common>')
- self.writel(S_ANIM,2,'</source>')
-
- self.writel(S_ANIM,2,'<sampler id="'+anim_id+'-sampler">')
- self.writel(S_ANIM,3,'<input semantic="INPUT" source="#'+anim_id+'-input"/>')
- self.writel(S_ANIM,3,'<input semantic="OUTPUT" source="#'+anim_id+'-transform-output"/>')
- self.writel(S_ANIM,3,'<input semantic="INTERPOLATION" source="#'+anim_id+'-interpolation-output"/>')
- self.writel(S_ANIM,2,'</sampler>')
- if (matrices):
- self.writel(S_ANIM,2,'<channel source="#'+anim_id+'-sampler" target="'+target+'/transform"/>')
- else:
- self.writel(S_ANIM,2,'<channel source="#'+anim_id+'-sampler" target="'+target+'"/>')
- self.writel(S_ANIM,1,'</animation>')
-
- return [anim_id]
-
-
- def export_animation(self,start,end,allowed=None):
-
- #Blender -> Collada frames needs a little work
- #Collada starts from 0, blender usually from 1
- #The last frame must be included also
-
- frame_orig = self.scene.frame_current
-
- frame_len = 1.0 / self.scene.render.fps
- frame_total = end - start + 1
- frame_sub = 0
- if (start>0):
- frame_sub=start*frame_len
-
- tcn = []
- xform_cache={}
- blend_cache={}
- # Change frames first, export objects last
- # This improves performance enormously
-
- #print("anim from: "+str(start)+" to "+str(end)+" allowed: "+str(allowed))
- for t in range(start,end+1):
- self.scene.frame_set(t)
- key = t * frame_len - frame_sub
-# print("Export Anim Frame "+str(t)+"/"+str(self.scene.frame_end+1))
-
- for node in self.scene.objects:
-
- if (not node in self.valid_nodes):
- continue
- if (allowed!=None and not (node in allowed)):
- if (node.type=="MESH" and node.data!=None and (node in self.armature_for_morph) and (self.armature_for_morph[node] in allowed)):
- pass #all good you pass with flying colors for morphs inside of action
- else:
- #print("fail "+str((node in self.armature_for_morph)))
- continue
- if (node.type=="MESH" and node.data!=None and node.data.shape_keys!=None and (node.data in self.mesh_cache) and len(node.data.shape_keys.key_blocks)):
- target = self.mesh_cache[node.data]["morph_id"]
- for i in range(len(node.data.shape_keys.key_blocks)):
-
- if (i==0):
- continue
-
- name=target+"-morph-weights("+str(i-1)+")"
- if (not (name in blend_cache)):
- blend_cache[name]=[]
-
- blend_cache[name].append( (key,node.data.shape_keys.key_blocks[i].value) )
-
-
- if (node.type=="MESH" and node.parent and node.parent.type=="ARMATURE"):
-
- continue #In Collada, nodes that have skin modifier must not export animation, animate the skin instead.
-
- if (len(node.constraints)>0 or node.animation_data!=None):
- #If the node has constraints, or animation data, then export a sampled animation track
- name=self.validate_id(node.name)
- if (not (name in xform_cache)):
- xform_cache[name]=[]
-
- mtx = node.matrix_world.copy()
- if (node.parent):
- mtx = node.parent.matrix_world.inverted() * mtx
-
- xform_cache[name].append( (key,mtx) )
-
- if (node.type=="ARMATURE"):
- #All bones exported for now
-
- for bone in node.data.bones:
-
- bone_name=self.skeleton_info[node]["bone_ids"][bone]
-
- if (not (bone_name in xform_cache)):
- #print("has bone: "+bone_name)
- xform_cache[bone_name]=[]
-
- posebone = node.pose.bones[bone.name]
- parent_posebone=None
-
- mtx = posebone.matrix.copy()
- if (bone.parent):
- parent_posebone=node.pose.bones[bone.parent.name]
- parent_invisible=False
-
- for i in range(3):
- if (parent_posebone.scale[i]==0.0):
- parent_invisible=True
-
- if (not parent_invisible):
- mtx = parent_posebone.matrix.inverted() * mtx
-
-
- xform_cache[bone_name].append( (key,mtx) )
-
- self.scene.frame_set(frame_orig)
-
- #export animation xml
- for nid in xform_cache:
- tcn+=self.export_animation_transform_channel(nid,xform_cache[nid],True)
- for nid in blend_cache:
- tcn+=self.export_animation_transform_channel(nid,blend_cache[nid],False)
-
- return tcn
-
- def export_animations(self):
- tmp_mat = []
- for s in self.skeletons:
- tmp_bone_mat = []
- for bone in s.pose.bones:
- tmp_bone_mat.append(Matrix(bone.matrix_basis))
- bone.matrix_basis = Matrix()
- tmp_mat.append([Matrix(s.matrix_local),tmp_bone_mat])
-
- self.writel(S_ANIM,0,'<library_animations>')
-
+ s = " "
+ for x in range(4):
+ for y in range(4):
+ s += str(mtx[x][y])
+ s += " "
+ s += " "
+ return s
- if (self.config["use_anim_action_all"] and len(self.skeletons)):
- cached_actions = {}
+def numarr(a, mult=1.0):
+ s = " "
+ for x in a:
+ s += " " + str(x * mult)
+ s += " "
+ return s
- for s in self.skeletons:
- if s.animation_data and s.animation_data.action:
- cached_actions[s] = s.animation_data.action.name
-
- self.writel(S_ANIM_CLIPS,0,'<library_animation_clips>')
-
- for x in bpy.data.actions[:]:
- if x.users==0 or x in self.action_constraints:
- continue
- if (self.config["use_anim_skip_noexp"] and x.name.endswith("-noexp")):
- continue
-
- bones=[]
- #find bones used
- for p in x.fcurves:
- dp = str(p.data_path)
- base = "pose.bones[\""
- if (dp.find(base)==0):
- dp=dp[len(base):]
- if (dp.find('"')!=-1):
- dp=dp[:dp.find('"')]
- if (not dp in bones):
- bones.append(dp)
-
- allowed_skeletons=[]
- for i,y in enumerate(self.skeletons):
- if (y.animation_data):
- for z in y.pose.bones:
- if (z.bone.name in bones):
- if (not y in allowed_skeletons):
- allowed_skeletons.append(y)
- y.animation_data.action=x;
-
- y.matrix_local = tmp_mat[i][0]
- for j,bone in enumerate(s.pose.bones):
- bone.matrix_basis = Matrix()
-
-
- #print("allowed skeletons "+str(allowed_skeletons))
-
- #print(str(x))
-
- tcn = self.export_animation(int(x.frame_range[0]),int(x.frame_range[1]+0.5),allowed_skeletons)
- framelen=(1.0/self.scene.render.fps)
- start = x.frame_range[0]*framelen
- end = x.frame_range[1]*framelen
- #print("Export anim: "+x.name)
- self.writel(S_ANIM_CLIPS,1,'<animation_clip name="'+x.name+'" start="'+str(start)+'" end="'+str(end)+'">')
- for z in tcn:
- self.writel(S_ANIM_CLIPS,2,'<instance_animation url="#'+z+'"/>')
- self.writel(S_ANIM_CLIPS,1,'</animation_clip>')
- if (len(tcn)==0):
- self.operator.report({'WARNING'},'Animation clip "'+x.name+'" contains no tracks.')
-
-
-
- self.writel(S_ANIM_CLIPS,0,'</library_animation_clips>')
-
-
- for i,s in enumerate(self.skeletons):
- if (s.animation_data==None):
- continue
- if s in cached_actions:
- s.animation_data.action = bpy.data.actions[cached_actions[s]]
- else:
- s.animation_data.action = None
- for j,bone in enumerate(s.pose.bones):
- bone.matrix_basis = tmp_mat[i][1][j]
-
- else:
- self.export_animation(self.scene.frame_start,self.scene.frame_end)
-
-
-
- self.writel(S_ANIM,0,'</library_animations>')
-
- def export(self):
-
- self.writel(S_GEOM,0,'<library_geometries>')
- self.writel(S_CONT,0,'<library_controllers>')
- self.writel(S_CAMS,0,'<library_cameras>')
- self.writel(S_LAMPS,0,'<library_lights>')
- self.writel(S_IMGS,0,'<library_images>')
- self.writel(S_MATS,0,'<library_materials>')
- self.writel(S_FX,0,'<library_effects>')
-
-
- self.skeletons=[]
- self.action_constraints=[]
- self.export_asset()
- self.export_scene()
-
- self.writel(S_GEOM,0,'</library_geometries>')
-
- #morphs always go before skin controllers
- if S_MORPH in self.sections:
- for l in self.sections[S_MORPH]:
- self.writel(S_CONT,0,l)
- del self.sections[S_MORPH]
-
- #morphs always go before skin controllers
- if S_SKIN in self.sections:
- for l in self.sections[S_SKIN]:
- self.writel(S_CONT,0,l)
- del self.sections[S_SKIN]
-
- self.writel(S_CONT,0,'</library_controllers>')
- self.writel(S_CAMS,0,'</library_cameras>')
- self.writel(S_LAMPS,0,'</library_lights>')
- self.writel(S_IMGS,0,'</library_images>')
- self.writel(S_MATS,0,'</library_materials>')
- self.writel(S_FX,0,'</library_effects>')
-
- if (self.config["use_anim"]):
- self.export_animations()
-
- try:
- f = open(self.path,"wb")
- except:
- return False
-
- f.write(bytes('<?xml version="1.0" encoding="utf-8"?>\n',"UTF-8"))
- f.write(bytes('<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">\n',"UTF-8"))
-
-
- s=[]
- for x in self.sections.keys():
- s.append(x)
- s.sort()
- for x in s:
- for l in self.sections[x]:
- f.write(bytes(l+"\n","UTF-8"))
-
- f.write(bytes('<scene>\n',"UTF-8"))
- f.write(bytes('\t<instance_visual_scene url="#'+self.scene_name+'" />\n',"UTF-8"))
- f.write(bytes('</scene>\n',"UTF-8"))
- f.write(bytes('</COLLADA>\n',"UTF-8"))
- return True
-
- def __init__(self,path,kwargs,operator):
- self.operator=operator
- self.scene=bpy.context.scene
- self.last_id=0
- self.scene_name=self.new_id("scene")
- self.sections={}
- self.path=path
- self.mesh_cache={}
- self.curve_cache={}
- self.material_cache={}
- self.image_cache={}
- self.skeleton_info={}
- self.config=kwargs
- self.valid_nodes=[]
- self.armature_for_morph={}
- self.used_bones=[]
- self.wrongvtx_report=False
-
-
-
-
-
-
-
-def save(operator, context,
- filepath="",
- use_selection=False,
- **kwargs
- ):
-
- exp = DaeExporter(filepath,kwargs,operator)
- exp.export()
+def numarr_alpha(a, mult=1.0):
+ s = " "
+ for x in a:
+ s += " " + str(x * mult)
+ if len(a) == 3:
+ s += " 1.0"
+ s += " "
+ return s
+def strarr(arr):
+ s = " "
+ for x in arr:
+ s += " " + str(x)
+ s += " "
+ return s
- return {'FINISHED'} # so the script wont run after we have batch exported.
+class DaeExporter:
+ def validate_id(self, d):
+ if (d.find("id-") == 0):
+ return "z" + d
+ return d
+
+ def new_id(self, t):
+ self.last_id += 1
+ return "id-" + t + "-" + str(self.last_id)
+
+ class Vertex:
+
+ def close_to(self, v):
+ if self.vertex - v.vertex.length() > CMP_EPSILON:
+ return False
+ if self.normal - v.normal.length() > CMP_EPSILON:
+ return False
+ if self.uv - v.uv.length() > CMP_EPSILON:
+ return False
+ if self.uv2 - v.uv2.length() > CMP_EPSILON:
+ return False
+
+ return True
+
+ def get_tup(self):
+ tup = (self.vertex.x, self.vertex.y, self.vertex.z, self.normal.x,
+ self.normal.y, self.normal.z)
+ for t in self.uv:
+ tup = tup + (t.x, t.y)
+ if self.color is not None:
+ tup = tup + (self.color.x, self.color.y, self.color.z)
+ if self.tangent is not None:
+ tup = tup + (self.tangent.x, self.tangent.y, self.tangent.z)
+ if self.bitangent is not None:
+ tup = tup + (self.bitangent.x, self.bitangent.y,
+ self.bitangent.z)
+ for t in self.bones:
+ tup = tup + (float(t), )
+ for t in self.weights:
+ tup = tup + (float(t), )
+
+ return tup
+
+ def __init__(self):
+ self.vertex = Vector((0.0, 0.0, 0.0))
+ self.normal = Vector((0.0, 0.0, 0.0))
+ self.tangent = None
+ self.bitangent = None
+ self.color = None
+ self.uv = []
+ self.uv2 = Vector((0.0, 0.0))
+ self.bones = []
+ self.weights = []
+
+ def writel(self, section, indent, text):
+ if (not (section in self.sections)):
+ self.sections[section] = []
+ line = ""
+ for x in range(indent):
+ line += "\t"
+ line += text
+ self.sections[section].append(line)
+
+ def export_image(self, image):
+ if (image in self.image_cache):
+ return self.image_cache[image]
+
+ imgpath = image.filepath
+ if (imgpath.find("//") == 0 or imgpath.find("\\\\") == 0):
+ # If relative, convert to absolute
+ imgpath = bpy.path.abspath(imgpath)
+
+ # Path is absolute, now do something!
+
+ if (self.config["use_copy_images"]):
+ # copy image
+ basedir = os.path.dirname(self.path) + "/images"
+ if (not os.path.isdir(basedir)):
+ os.makedirs(basedir)
+
+ if os.path.isfile(imgpath):
+ dstfile = basedir + "/" + os.path.basename(imgpath)
+
+ if not os.path.isfile(dstfile):
+ shutil.copy(imgpath, dstfile)
+ imgpath = "images/" + os.path.basename(imgpath)
+ else:
+ # If file is not found save it as png file in the destination
+ # folder
+ img_tmp_path = image.filepath
+ if img_tmp_path.endswith((".bmp", ".rgb", ".png", ".jpeg",
+ ".jpg", ".jp2", ".tga", ".cin",
+ ".dpx", ".exr", ".hdr", ".tif")):
+ image.filepath = basedir + "/" + \
+ os.path.basename(img_tmp_path)
+ else:
+ image.filepath = basedir + "/" + image.name + ".png"
+
+ dstfile = basedir + "/" + os.path.basename(image.filepath)
+
+ if not os.path.isfile(dstfile):
+ image.save()
+ imgpath = "images/" + os.path.basename(image.filepath)
+ image.filepath = img_tmp_path
+
+ else:
+ # Export relative, always, no one wants absolute paths.
+ try:
+ # Export unix compatible always
+ imgpath = os.path.relpath(
+ imgpath, os.path.dirname(self.path)).replace("\\", "/")
+
+ except:
+ # Fails sometimes, not sure why
+ pass
+
+ imgid = self.new_id("image")
+
+ print("FOR: " + imgpath)
+
+# if (not os.path.isfile(imgpath)):
+# print("NOT FILE?")
+# if imgpath.endswith((".bmp", ".rgb", ".png", ".jpeg", ".jpg",
+# ".jp2", ".tga", ".cin", ".dpx", ".exr",
+# ".hdr", ".tif")):
+# imgpath="images/"+os.path.basename(imgpath)
+# else:
+# imgpath="images/"+image.name+".png"
+
+ self.writel(S_IMGS, 1, '<image id="' + imgid +
+ '" name="' + image.name + '">')
+ self.writel(S_IMGS, 2, '<init_from>' + imgpath + '</init_from>')
+ self.writel(S_IMGS, 1, '</image>')
+ self.image_cache[image] = imgid
+ return imgid
+
+ def export_material(self, material, double_sided_hint=True):
+ if (material in self.material_cache):
+ return self.material_cache[material]
+
+ fxid = self.new_id("fx")
+ self.writel(S_FX, 1, '<effect id="' + fxid + '" name="' +
+ material.name + '-fx">')
+ self.writel(S_FX, 2, '<profile_COMMON>')
+
+ # Find and fetch the textures and create sources
+ sampler_table = {}
+ diffuse_tex = None
+ specular_tex = None
+ emission_tex = None
+ normal_tex = None
+ for i in range(len(material.texture_slots)):
+ ts = material.texture_slots[i]
+ if not ts:
+ continue
+ if not ts.use:
+ continue
+ if not ts.texture:
+ continue
+ if ts.texture.type != "IMAGE":
+ continue
+
+ if ts.texture.image is None:
+ continue
+
+ # Image
+ imgid = self.export_image(ts.texture.image)
+
+ # Surface
+ surface_sid = self.new_id("fx_surf")
+ self.writel(S_FX, 3, '<newparam sid="' + surface_sid + '">')
+ self.writel(S_FX, 4, '<surface type="2D">')
+ # This is sooo weird
+ self.writel(S_FX, 5, '<init_from>' + imgid + '</init_from>')
+ self.writel(S_FX, 5, '<format>A8R8G8B8</format>')
+ self.writel(S_FX, 4, '</surface>')
+ self.writel(S_FX, 3, '</newparam>')
+ # Sampler, collada sure likes it difficult
+ sampler_sid = self.new_id("fx_sampler")
+ self.writel(S_FX, 3, '<newparam sid="' + sampler_sid + '">')
+ self.writel(S_FX, 4, '<sampler2D>')
+ self.writel(S_FX, 5, '<source>' + surface_sid + '</source>')
+ self.writel(S_FX, 4, '</sampler2D>')
+ self.writel(S_FX, 3, '</newparam>')
+ sampler_table[i] = sampler_sid
+
+ if ts.use_map_color_diffuse and diffuse_tex is None:
+ diffuse_tex = sampler_sid
+ if ts.use_map_color_spec and specular_tex is None:
+ specular_tex = sampler_sid
+ if ts.use_map_emit and emission_tex is None:
+ emission_tex = sampler_sid
+ if ts.use_map_normal and normal_tex is None:
+ normal_tex = sampler_sid
+
+ self.writel(S_FX, 3, '<technique sid="common">')
+ shtype = "blinn"
+ self.writel(S_FX, 4, '<' + shtype + '>')
+ # Ambient? from where?
+
+ self.writel(S_FX, 5, '<emission>')
+ if emission_tex is not None:
+ self.writel(S_FX, 6, '<texture texture="' + emission_tex +
+ '" texcoord="CHANNEL1"/>')
+ else:
+ self.writel(S_FX, 6, '<color>' +
+ numarr_alpha(material.diffuse_color, material.emit) +
+ ' </color>') # not totally right but good enough
+ self.writel(S_FX, 5, '</emission>')
+
+ self.writel(S_FX, 5, '<ambient>')
+ self.writel(S_FX, 6, '<color>' +
+ numarr_alpha(self.scene.world.ambient_color,
+ material.ambient) + ' </color>')
+ self.writel(S_FX, 5, '</ambient>')
+
+ self.writel(S_FX, 5, '<diffuse>')
+ if diffuse_tex is not None:
+ self.writel(S_FX, 6, '<texture texture="' + diffuse_tex +
+ '" texcoord="CHANNEL1"/>')
+ else:
+ self.writel(S_FX, 6,
+ '<color>' + numarr_alpha(material.diffuse_color,
+ material.diffuse_intensity) +
+ '</color>')
+ self.writel(S_FX, 5, '</diffuse>')
+
+ self.writel(S_FX, 5, '<specular>')
+ if specular_tex is not None:
+ self.writel(S_FX, 6, '<texture texture="' + specular_tex +
+ '" texcoord="CHANNEL1"/>')
+ else:
+ self.writel(S_FX, 6, '<color>' + numarr_alpha(
+ material.specular_color, material.specular_intensity) +
+ '</color>')
+ self.writel(S_FX, 5, '</specular>')
+
+ self.writel(S_FX, 5, '<shininess>')
+ self.writel(S_FX, 6, '<float>' + str(material.specular_hardness) +
+ '</float>')
+ self.writel(S_FX, 5, '</shininess>')
+
+ self.writel(S_FX, 5, '<reflective>')
+ self.writel(S_FX, 6, '<color>' + numarr_alpha(material.mirror_color) +
+ '</color>')
+ self.writel(S_FX, 5, '</reflective>')
+
+ if (material.use_transparency):
+ self.writel(S_FX, 5, '<transparency>')
+ self.writel(S_FX, 6, '<float>' + str(material.alpha) + '</float>')
+ self.writel(S_FX, 5, '</transparency>')
+
+ self.writel(S_FX, 5, '<index_of_refraction>')
+ self.writel(S_FX, 6, '<float>' + str(material.specular_ior) +
+ '</float>')
+ self.writel(S_FX, 5, '</index_of_refraction>')
+
+ self.writel(S_FX, 4, '</' + shtype + '>')
+
+ self.writel(S_FX, 4, '<extra>')
+ self.writel(S_FX, 5, '<technique profile="FCOLLADA">')
+ if (normal_tex):
+ self.writel(S_FX, 6, '<bump bumptype="NORMALMAP">')
+ self.writel(S_FX, 7, '<texture texture="' + normal_tex +
+ '" texcoord="CHANNEL1"/>')
+ self.writel(S_FX, 6, '</bump>')
+
+ self.writel(S_FX, 5, '</technique>')
+ self.writel(S_FX, 5, '<technique profile="GOOGLEEARTH">')
+ self.writel(S_FX, 6, '<double_sided>' + ["0", "1"][double_sided_hint] +
+ "</double_sided>")
+ self.writel(S_FX, 5, '</technique>')
+
+ if (material.use_shadeless):
+ self.writel(S_FX, 5, '<technique profile="GODOT">')
+ self.writel(S_FX, 6, '<unshaded>1</unshaded>')
+ self.writel(S_FX, 5, '</technique>')
+
+ self.writel(S_FX, 4, '</extra>')
+
+ self.writel(S_FX, 3, '</technique>')
+ self.writel(S_FX, 2, '</profile_COMMON>')
+ self.writel(S_FX, 1, '</effect>')
+
+ # Also export blender material in all it's glory (if set as active)
+
+ # Material
+ matid = self.new_id("material")
+ self.writel(S_MATS, 1, '<material id="' + matid + '" name="' +
+ material.name + '">')
+ self.writel(S_MATS, 2, '<instance_effect url="#' + fxid + '"/>')
+ self.writel(S_MATS, 1, '</material>')
+
+ self.material_cache[material] = matid
+ return matid
+
+ def export_mesh(self, node, armature=None, skeyindex=-1, skel_source=None,
+ custom_name=None):
+ mesh = node.data
+
+ if (node.data in self.mesh_cache):
+ return self.mesh_cache[mesh]
+
+ if (skeyindex == -1 and mesh.shape_keys is not None and len(
+ mesh.shape_keys.key_blocks)):
+ values = []
+ morph_targets = []
+ md = None
+ for k in range(0, len(mesh.shape_keys.key_blocks)):
+ shape = node.data.shape_keys.key_blocks[k]
+ values += [shape.value] # save value
+ shape.value = 0
+
+ mid = self.new_id("morph")
+
+ for k in range(0, len(mesh.shape_keys.key_blocks)):
+
+ shape = node.data.shape_keys.key_blocks[k]
+ node.show_only_shape_key = True
+ node.active_shape_key_index = k
+ shape.value = 1.0
+ mesh.update()
+ """
+ oldval = shape.value
+ shape.value = 1.0
+
+ """
+ p = node.data
+ v = node.to_mesh(bpy.context.scene, True, "RENDER")
+ node.data = v
+# self.export_node(node, il, shape.name)
+ node.data.update()
+ if (armature and k == 0):
+ md = self.export_mesh(node, armature, k, mid, shape.name)
+ else:
+ md = self.export_mesh(node, None, k, None, shape.name)
+
+ node.data = p
+ node.data.update()
+ shape.value = 0.0
+ morph_targets.append(md)
+
+ """
+ shape.value = oldval
+ """
+ node.show_only_shape_key = False
+ node.active_shape_key_index = 0
+
+ self.writel(S_MORPH, 1, '<controller id="' + mid + '" name="">')
+ # if ("skin_id" in morph_targets[0]):
+ # self.writel(S_MORPH, 2, '<morph source="#'+morph_targets[0][
+ # "skin_id"]+'" method="NORMALIZED">')
+ # else:
+ self.writel(S_MORPH, 2, '<morph source="#' +
+ morph_targets[0]["id"] + '" method="NORMALIZED">')
+
+ self.writel(S_MORPH, 3, '<source id="' + mid + '-morph-targets">')
+ self.writel(S_MORPH, 4, '<IDREF_array id="' + mid +
+ '-morph-targets-array" count="' +
+ str(len(morph_targets) - 1) + '">')
+ marr = ""
+ warr = ""
+ for i in range(len(morph_targets)):
+ if (i == 0):
+ continue
+ elif (i > 1):
+ marr += " "
+
+ if ("skin_id" in morph_targets[i]):
+ marr += morph_targets[i]["skin_id"]
+ else:
+ marr += morph_targets[i]["id"]
+
+ warr += " 0"
+
+ self.writel(S_MORPH, 5, marr)
+ self.writel(S_MORPH, 4, '</IDREF_array>')
+ self.writel(S_MORPH, 4, '<technique_common>')
+ self.writel(S_MORPH, 5, '<accessor source="#' + mid +
+ '-morph-targets-array" count="' +
+ str(len(morph_targets) - 1) + '" stride="1">')
+ self.writel(
+ S_MORPH, 6, '<param name="MORPH_TARGET" type="IDREF"/>')
+ self.writel(S_MORPH, 5, '</accessor>')
+ self.writel(S_MORPH, 4, '</technique_common>')
+ self.writel(S_MORPH, 3, '</source>')
+
+ self.writel(S_MORPH, 3, '<source id="' + mid + '-morph-weights">')
+ self.writel(S_MORPH, 4, '<float_array id="' + mid +
+ '-morph-weights-array" count="' +
+ str(len(morph_targets) - 1) + '" >')
+ self.writel(S_MORPH, 5, warr)
+ self.writel(S_MORPH, 4, '</float_array>')
+ self.writel(S_MORPH, 4, '<technique_common>')
+ self.writel(S_MORPH, 5, '<accessor source="#' + mid +
+ '-morph-weights-array" count="' +
+ str(len(morph_targets) - 1) + '" stride="1">')
+ self.writel(
+ S_MORPH, 6, '<param name="MORPH_WEIGHT" type="float"/>')
+ self.writel(S_MORPH, 5, '</accessor>')
+ self.writel(S_MORPH, 4, '</technique_common>')
+ self.writel(S_MORPH, 3, '</source>')
+
+ self.writel(S_MORPH, 3, '<targets>')
+ self.writel(
+ S_MORPH, 4, '<input semantic="MORPH_TARGET" source="#' + mid +
+ '-morph-targets"/>')
+ self.writel(
+ S_MORPH, 4, '<input semantic="MORPH_WEIGHT" source="#' + mid +
+ '-morph-weights"/>')
+ self.writel(S_MORPH, 3, '</targets>')
+ self.writel(S_MORPH, 2, '</morph>')
+ self.writel(S_MORPH, 1, '</controller>')
+ if armature is not None:
+
+ self.armature_for_morph[node] = armature
+
+ meshdata = {}
+ if (armature):
+ meshdata = morph_targets[0]
+ meshdata["morph_id"] = mid
+ else:
+ meshdata["id"] = morph_targets[0]["id"]
+ meshdata["morph_id"] = mid
+ meshdata["material_assign"] = morph_targets[
+ 0]["material_assign"]
+
+ self.mesh_cache[node.data] = meshdata
+ return meshdata
+
+ apply_modifiers = len(node.modifiers) and self.config[
+ "use_mesh_modifiers"]
+
+ name_to_use = mesh.name
+ # print("name to use: "+mesh.name)
+ if (custom_name is not None and custom_name != ""):
+ name_to_use = custom_name
+
+ mesh = node.to_mesh(self.scene, apply_modifiers,
+ "RENDER") # is this allright?
+
+ triangulate = self.config["use_triangles"]
+ if (triangulate):
+ bm = bmesh.new()
+ bm.from_mesh(mesh)
+ bmesh.ops.triangulate(bm, faces=bm.faces)
+ bm.to_mesh(mesh)
+ bm.free()
+
+ mesh.update(calc_tessface=True)
+ vertices = []
+ vertex_map = {}
+ surface_indices = {}
+ materials = {}
+
+ materials = {}
+
+ si = None
+ if armature is not None:
+ si = self.skeleton_info[armature]
+
+ has_uv = False
+ has_uv2 = False
+ has_weights = armature is not None
+ has_tangents = self.config["use_tangent_arrays"] # could detect..
+ has_colors = len(mesh.vertex_colors)
+ mat_assign = []
+
+ uv_layer_count = len(mesh.uv_textures)
+ if has_tangents and len(mesh.uv_textures):
+ try:
+ mesh.calc_tangents()
+ except:
+ self.operator.report(
+ {'WARNING'}, 'CalcTangets failed for mesh "' + mesh.name +
+ '", no tangets will be exported.')
+ # uv_layer_count=0
+ mesh.calc_normals_split()
+ has_tangents = False
+
+ else:
+ mesh.calc_normals_split()
+ has_tangents = False
+
+ for fi in range(len(mesh.polygons)):
+ f = mesh.polygons[fi]
+
+ if not (f.material_index in surface_indices):
+ surface_indices[f.material_index] = []
+ # print("Type: " + str(type(f.material_index)))
+ # print("IDX: " + str(f.material_index) + "/" + str(
+ # len(mesh.materials)))
+
+ try:
+ # Bizarre blender behavior i don't understand,
+ # so catching exception
+ mat = mesh.materials[f.material_index]
+ except:
+ mat = None
+
+ if (mat is not None):
+ materials[f.material_index] = self.export_material(
+ mat, mesh.show_double_sided)
+ else:
+ # weird, has no material?
+ materials[f.material_index] = None
+
+ indices = surface_indices[f.material_index]
+ vi = []
+ # Vertices always 3
+ """
+ if (len(f.vertices)==3):
+ vi.append(0)
+ vi.append(1)
+ vi.append(2)
+ elif (len(f.vertices)==4):
+ #todo, should use shortest path
+ vi.append(0)
+ vi.append(1)
+ vi.append(2)
+ vi.append(0)
+ vi.append(2)
+ vi.append(3)
+ """
+
+ for lt in range(f.loop_total):
+ loop_index = f.loop_start + lt
+ ml = mesh.loops[loop_index]
+ mv = mesh.vertices[ml.vertex_index]
+
+ v = self.Vertex()
+ v.vertex = Vector(mv.co)
+
+ for xt in mesh.uv_layers:
+ v.uv.append(Vector(xt.data[loop_index].uv))
+
+ if (has_colors):
+ v.color = Vector(
+ mesh.vertex_colors[0].data[loop_index].color)
+
+ v.normal = Vector(ml.normal)
+
+ if (has_tangents):
+ v.tangent = Vector(ml.tangent)
+ v.bitangent = Vector(ml.bitangent)
+
+ # if (armature):
+ # v.vertex = node.matrix_world * v.vertex
+
+ # v.color=Vertex(mv. ???
+
+ if armature is not None:
+ wsum = 0.0
+ zero_bones = []
+
+ for vg in mv.groups:
+ if vg.group >= len(node.vertex_groups):
+ continue
+ name = node.vertex_groups[vg.group].name
+
+ if (name in si["bone_index"]):
+ # could still put the weight as 0.0001 maybe
+ # blender has a lot of zero weight stuff
+ if (vg.weight > 0.001):
+ v.bones.append(si["bone_index"][name])
+ v.weights.append(vg.weight)
+ wsum += vg.weight
+ if (wsum == 0.0):
+ if not self.wrongvtx_report:
+ self.operator.report(
+ {'WARNING'}, 'Mesh for object "' + node.name +
+ '" has unassigned weights. '
+ 'This may look wrong in exported model.')
+ self.wrongvtx_report = True
+
+ # blender can have bones assigned that weight zero
+ # so they remain local
+ # this is the best it can be done?
+ v.bones.append(0)
+ v.weights.append(1)
+
+ tup = v.get_tup()
+ idx = 0
+ # do not optmize if using shapekeys
+ if (skeyindex == -1 and tup in vertex_map):
+ idx = vertex_map[tup]
+ else:
+ idx = len(vertices)
+ vertices.append(v)
+ vertex_map[tup] = idx
+
+ vi.append(idx)
+
+ if (len(vi) > 2):
+ # only triangles and above
+ indices.append(vi)
+
+ meshid = self.new_id("mesh")
+ self.writel(S_GEOM, 1, '<geometry id="' + meshid +
+ '" name="' + name_to_use + '">')
+
+ self.writel(S_GEOM, 2, '<mesh>')
+
+ # Vertex Array
+ self.writel(S_GEOM, 3, '<source id="' + meshid + '-positions">')
+ float_values = ""
+ for v in vertices:
+ float_values += " " + str(v.vertex.x) + " " + \
+ str(v.vertex.y) + " " + str(v.vertex.z)
+ self.writel(S_GEOM, 4, '<float_array id="' + meshid +
+ '-positions-array" count="' +
+ str(len(vertices) * 3) + '">' + float_values +
+ '</float_array>')
+ self.writel(S_GEOM, 4, '<technique_common>')
+ self.writel(S_GEOM, 4, '<accessor source="#' + meshid +
+ '-positions-array" count="' + str(len(vertices)) +
+ '" stride="3">')
+ self.writel(S_GEOM, 5, '<param name="X" type="float"/>')
+ self.writel(S_GEOM, 5, '<param name="Y" type="float"/>')
+ self.writel(S_GEOM, 5, '<param name="Z" type="float"/>')
+ self.writel(S_GEOM, 4, '</accessor>')
+ self.writel(S_GEOM, 4, '</technique_common>')
+ self.writel(S_GEOM, 3, '</source>')
+
+ # Normal Array
+
+ self.writel(S_GEOM, 3, '<source id="' + meshid + '-normals">')
+ float_values = ""
+ for v in vertices:
+ float_values += " " + str(v.normal.x) + " " + \
+ str(v.normal.y) + " " + str(v.normal.z)
+ self.writel(S_GEOM, 4, '<float_array id="' + meshid +
+ '-normals-array" count="' +
+ str(len(vertices) * 3) + '">' + float_values +
+ '</float_array>')
+ self.writel(S_GEOM, 4, '<technique_common>')
+ self.writel(S_GEOM, 4, '<accessor source="#' + meshid +
+ '-normals-array" count="' + str(len(vertices)) +
+ '" stride="3">')
+ self.writel(S_GEOM, 5, '<param name="X" type="float"/>')
+ self.writel(S_GEOM, 5, '<param name="Y" type="float"/>')
+ self.writel(S_GEOM, 5, '<param name="Z" type="float"/>')
+ self.writel(S_GEOM, 4, '</accessor>')
+ self.writel(S_GEOM, 4, '</technique_common>')
+ self.writel(S_GEOM, 3, '</source>')
+
+ if (has_tangents):
+ self.writel(S_GEOM, 3, '<source id="' + meshid + '-tangents">')
+ float_values = ""
+ for v in vertices:
+ float_values += " " + \
+ str(v.tangent.x) + " " + \
+ str(v.tangent.y) + " " + str(v.tangent.z)
+ self.writel(S_GEOM, 4, '<float_array id="' + meshid +
+ '-tangents-array" count="' +
+ str(len(vertices) * 3) + '">' + float_values +
+ '</float_array>')
+ self.writel(S_GEOM, 4, '<technique_common>')
+ self.writel(S_GEOM, 4, '<accessor source="#' + meshid +
+ '-tangents-array" count="' + str(len(vertices)) +
+ '" stride="3">')
+ self.writel(S_GEOM, 5, '<param name="X" type="float"/>')
+ self.writel(S_GEOM, 5, '<param name="Y" type="float"/>')
+ self.writel(S_GEOM, 5, '<param name="Z" type="float"/>')
+ self.writel(S_GEOM, 4, '</accessor>')
+ self.writel(S_GEOM, 4, '</technique_common>')
+ self.writel(S_GEOM, 3, '</source>')
+
+ self.writel(S_GEOM, 3, '<source id="' + meshid + '-bitangents">')
+ float_values = ""
+ for v in vertices:
+ float_values += " " + \
+ str(v.bitangent.x) + " " + \
+ str(v.bitangent.y) + " " + str(v.bitangent.z)
+ self.writel(S_GEOM, 4, '<float_array id="' + meshid +
+ '-bitangents-array" count="' +
+ str(len(vertices) * 3) + '">' + float_values +
+ '</float_array>')
+ self.writel(S_GEOM, 4, '<technique_common>')
+ self.writel(S_GEOM, 4, '<accessor source="#' + meshid +
+ '-bitangents-array" count="' + str(len(vertices)) +
+ '" stride="3">')
+ self.writel(S_GEOM, 5, '<param name="X" type="float"/>')
+ self.writel(S_GEOM, 5, '<param name="Y" type="float"/>')
+ self.writel(S_GEOM, 5, '<param name="Z" type="float"/>')
+ self.writel(S_GEOM, 4, '</accessor>')
+ self.writel(S_GEOM, 4, '</technique_common>')
+ self.writel(S_GEOM, 3, '</source>')
+
+ # UV Arrays
+
+ for uvi in range(uv_layer_count):
+
+ self.writel(S_GEOM, 3, '<source id="' + meshid +
+ '-texcoord-' + str(uvi) + '">')
+ float_values = ""
+ for v in vertices:
+ try:
+ float_values += " " + \
+ str(v.uv[uvi].x) + " " + str(v.uv[uvi].y)
+ except:
+ # I don't understand this weird multi-uv-layer API, but
+ # with this it seems to works
+ float_values += " 0 0 "
+
+ self.writel(S_GEOM, 4, '<float_array id="' + meshid +
+ '-texcoord-' + str(uvi) +
+ '-array" count="' + str(len(vertices) * 2) + '">' +
+ float_values + '</float_array>')
+ self.writel(S_GEOM, 4, '<technique_common>')
+ self.writel(S_GEOM, 4, '<accessor source="#' + meshid +
+ '-texcoord-' +
+ str(uvi) + '-array" count="' + str(len(vertices)) +
+ '" stride="2">')
+ self.writel(S_GEOM, 5, '<param name="S" type="float"/>')
+ self.writel(S_GEOM, 5, '<param name="T" type="float"/>')
+ self.writel(S_GEOM, 4, '</accessor>')
+ self.writel(S_GEOM, 4, '</technique_common>')
+ self.writel(S_GEOM, 3, '</source>')
+
+ # Color Arrays
+
+ if (has_colors):
+ self.writel(S_GEOM, 3, '<source id="' + meshid + '-colors">')
+ float_values = ""
+ for v in vertices:
+ float_values += " " + \
+ str(v.color.x) + " " + \
+ str(v.color.y) + " " + str(v.color.z)
+ self.writel(S_GEOM, 4, '<float_array id="' + meshid +
+ '-colors-array" count="' +
+ str(len(vertices) * 3) + '">' + float_values +
+ '</float_array>')
+ self.writel(S_GEOM, 4, '<technique_common>')
+ self.writel(S_GEOM, 4, '<accessor source="#' + meshid +
+ '-colors-array" count="' + str(len(vertices)) +
+ '" stride="3">')
+ self.writel(S_GEOM, 5, '<param name="X" type="float"/>')
+ self.writel(S_GEOM, 5, '<param name="Y" type="float"/>')
+ self.writel(S_GEOM, 5, '<param name="Z" type="float"/>')
+ self.writel(S_GEOM, 4, '</accessor>')
+ self.writel(S_GEOM, 4, '</technique_common>')
+ self.writel(S_GEOM, 3, '</source>')
+
+ # Triangle Lists
+ self.writel(S_GEOM, 3, '<vertices id="' + meshid + '-vertices">')
+ self.writel(
+ S_GEOM, 4, '<input semantic="POSITION" source="#' + meshid +
+ '-positions"/>')
+ self.writel(S_GEOM, 3, '</vertices>')
+
+ prim_type = ""
+ if (triangulate):
+ prim_type = "triangles"
+ else:
+ prim_type = "polygons"
+
+ for m in surface_indices:
+ indices = surface_indices[m]
+ mat = materials[m]
+
+ if (mat is not None):
+ matref = self.new_id("trimat")
+ self.writel(S_GEOM, 3, '<' + prim_type + ' count="' + str(
+ int(len(indices))) + '" material="' + matref +
+ '">') # todo material
+ mat_assign.append((mat, matref))
+ else:
+ self.writel(S_GEOM, 3, '<' + prim_type + ' count="' +
+ str(int(len(indices))) + '">') # todo material
+
+ self.writel(S_GEOM, 4, '<input semantic="VERTEX" source="#' +
+ meshid + '-vertices" offset="0"/>')
+ self.writel(S_GEOM, 4, '<input semantic="NORMAL" source="#' +
+ meshid + '-normals" offset="0"/>')
+
+ for uvi in range(uv_layer_count):
+ self.writel(S_GEOM, 4, '<input semantic="TEXCOORD" source="#' +
+ meshid +
+ '-texcoord-' + str(uvi) + '" offset="0" set="' +
+ str(uvi) + '"/>')
+
+ if (has_colors):
+ self.writel(S_GEOM, 4, '<input semantic="COLOR" source="#' +
+ meshid + '-colors" offset="0"/>')
+ if (has_tangents):
+ self.writel(S_GEOM, 4,
+ '<input semantic="TEXTANGENT" source="#' +
+ meshid + '-tangents" offset="0"/>')
+ self.writel(S_GEOM, 4,
+ '<input semantic="TEXBINORMAL" source="#' +
+ meshid + '-bitangents" offset="0"/>')
+
+ if (triangulate):
+ int_values = "<p>"
+ for p in indices:
+ for i in p:
+ int_values += " " + str(i)
+ int_values += " </p>"
+ self.writel(S_GEOM, 4, int_values)
+ else:
+ for p in indices:
+ int_values = "<p>"
+ for i in p:
+ int_values += " " + str(i)
+ int_values += " </p>"
+ self.writel(S_GEOM, 4, int_values)
+
+ self.writel(S_GEOM, 3, '</' + prim_type + '>')
+
+ self.writel(S_GEOM, 2, '</mesh>')
+ self.writel(S_GEOM, 1, '</geometry>')
+
+ meshdata = {}
+ meshdata["id"] = meshid
+ meshdata["material_assign"] = mat_assign
+ if (skeyindex == -1):
+ self.mesh_cache[node.data] = meshdata
+
+ # Export armature data (if armature exists)
+
+ if (armature is not None and (
+ skel_source is not None or skeyindex == -1)):
+
+ contid = self.new_id("controller")
+
+ self.writel(S_SKIN, 1, '<controller id="' + contid + '">')
+ if (skel_source is not None):
+ self.writel(S_SKIN, 2, '<skin source="#' + skel_source + '">')
+ else:
+ self.writel(S_SKIN, 2, '<skin source="#' + meshid + '">')
+
+ self.writel(S_SKIN, 3, '<bind_shape_matrix>' +
+ strmtx(node.matrix_world) + '</bind_shape_matrix>')
+ # Joint Names
+ self.writel(S_SKIN, 3, '<source id="' + contid + '-joints">')
+ name_values = ""
+ for v in si["bone_names"]:
+ name_values += " " + v
+
+ self.writel(S_SKIN, 4, '<Name_array id="' + contid +
+ '-joints-array" count="' +
+ str(len(si["bone_names"])) + '">' + name_values +
+ '</Name_array>')
+ self.writel(S_SKIN, 4, '<technique_common>')
+ self.writel(S_SKIN, 4, '<accessor source="#' + contid +
+ '-joints-array" count="' + str(len(si["bone_names"])) +
+ '" stride="1">')
+ self.writel(S_SKIN, 5, '<param name="JOINT" type="Name"/>')
+ self.writel(S_SKIN, 4, '</accessor>')
+ self.writel(S_SKIN, 4, '</technique_common>')
+ self.writel(S_SKIN, 3, '</source>')
+ # Pose Matrices!
+ self.writel(S_SKIN, 3, '<source id="' + contid + '-bind_poses">')
+ pose_values = ""
+ for v in si["bone_bind_poses"]:
+ pose_values += " " + strmtx(v)
+
+ self.writel(S_SKIN, 4, '<float_array id="' + contid +
+ '-bind_poses-array" count="' +
+ str(len(si["bone_bind_poses"]) * 16) + '">' +
+ pose_values + '</float_array>')
+ self.writel(S_SKIN, 4, '<technique_common>')
+ self.writel(S_SKIN, 4, '<accessor source="#' + contid +
+ '-bind_poses-array" count="' +
+ str(len(si["bone_bind_poses"])) + '" stride="16">')
+ self.writel(S_SKIN, 5, '<param name="TRANSFORM" type="float4x4"/>')
+ self.writel(S_SKIN, 4, '</accessor>')
+ self.writel(S_SKIN, 4, '</technique_common>')
+ self.writel(S_SKIN, 3, '</source>')
+ # Skin Weights!
+ self.writel(S_SKIN, 3, '<source id="' + contid + '-skin_weights">')
+ skin_weights = ""
+ skin_weights_total = 0
+ for v in vertices:
+ skin_weights_total += len(v.weights)
+ for w in v.weights:
+ skin_weights += " " + str(w)
+
+ self.writel(S_SKIN, 4, '<float_array id="' + contid +
+ '-skin_weights-array" count="' +
+ str(skin_weights_total) + '">' + skin_weights +
+ '</float_array>')
+ self.writel(S_SKIN, 4, '<technique_common>')
+ self.writel(S_SKIN, 4, '<accessor source="#' + contid +
+ '-skin_weights-array" count="' +
+ str(skin_weights_total) + '" stride="1">')
+ self.writel(S_SKIN, 5, '<param name="WEIGHT" type="float"/>')
+ self.writel(S_SKIN, 4, '</accessor>')
+ self.writel(S_SKIN, 4, '</technique_common>')
+ self.writel(S_SKIN, 3, '</source>')
+
+ self.writel(S_SKIN, 3, '<joints>')
+ self.writel(
+ S_SKIN, 4, '<input semantic="JOINT" source="#' + contid +
+ '-joints"/>')
+ self.writel(
+ S_SKIN, 4, '<input semantic="INV_BIND_MATRIX" source="#' +
+ contid + '-bind_poses"/>')
+ self.writel(S_SKIN, 3, '</joints>')
+ self.writel(S_SKIN, 3, '<vertex_weights count="' +
+ str(len(vertices)) + '">')
+ self.writel(S_SKIN, 4, '<input semantic="JOINT" source="#' +
+ contid + '-joints" offset="0"/>')
+ self.writel(S_SKIN, 4, '<input semantic="WEIGHT" source="#' +
+ contid + '-skin_weights" offset="1"/>')
+ vcounts = ""
+ vs = ""
+ vcount = 0
+ for v in vertices:
+ vcounts += " " + str(len(v.weights))
+ for b in v.bones:
+ vs += " " + str(b)
+ vs += " " + str(vcount)
+ vcount += 1
+ self.writel(S_SKIN, 4, '<vcount>' + vcounts + '</vcount>')
+ self.writel(S_SKIN, 4, '<v>' + vs + '</v>')
+ self.writel(S_SKIN, 3, '</vertex_weights>')
+
+ self.writel(S_SKIN, 2, '</skin>')
+ self.writel(S_SKIN, 1, '</controller>')
+ meshdata["skin_id"] = contid
+
+ return meshdata
+
+ def export_mesh_node(self, node, il):
+ if (node.data is None):
+ return
+
+ armature = None
+ armcount = 0
+ for n in node.modifiers:
+ if (n.type == "ARMATURE"):
+ armcount += 1
+
+ if (node.parent is not None):
+ if (node.parent.type == "ARMATURE"):
+ armature = node.parent
+ if (armcount > 1):
+ self.operator.report({'WARNING'}, 'Object "' + node.name +
+ '" refers to more than one armature! '
+ 'This is unsupported.')
+ if (armcount == 0):
+ self.operator.report({'WARNING'}, 'Object "' + node.name +
+ '" is child of an armature, but has '
+ 'no armature modifier.')
+
+ if (armcount > 0 and not armature):
+ self.operator.report({'WARNING'}, 'Object "' + node.name +
+ '" has armature modifier, but is not a child '
+ 'of an armature. This is unsupported.')
+
+ if (node.data.shape_keys is not None):
+ sk = node.data.shape_keys
+ if (sk.animation_data):
+ # print("HAS ANIM")
+ # print("DRIVERS: "+str(len(sk.animation_data.drivers)))
+ for d in sk.animation_data.drivers:
+ if (d.driver):
+ for v in d.driver.variables:
+ for t in v.targets:
+ if (t.id is not None and
+ t.id.name in self.scene.objects):
+ # print("LINKING " + str(node) + " WITH " +
+ # str(t.id.name))
+ self.armature_for_morph[
+ node] = self.scene.objects[t.id.name]
+
+ meshdata = self.export_mesh(node, armature)
+ close_controller = False
+
+ if ("skin_id" in meshdata):
+ close_controller = True
+ self.writel(S_NODES, il, '<instance_controller url="#' +
+ meshdata["skin_id"] + '">')
+ for sn in self.skeleton_info[armature]["skeleton_nodes"]:
+ self.writel(S_NODES, il + 1, '<skeleton>#' +
+ sn + '</skeleton>')
+ elif ("morph_id" in meshdata):
+ self.writel(S_NODES, il, '<instance_controller url="#' +
+ meshdata["morph_id"] + '">')
+ close_controller = True
+ elif (armature is None):
+ self.writel(S_NODES, il, '<instance_geometry url="#' +
+ meshdata["id"] + '">')
+
+ if (len(meshdata["material_assign"]) > 0):
+
+ self.writel(S_NODES, il + 1, '<bind_material>')
+ self.writel(S_NODES, il + 2, '<technique_common>')
+ for m in meshdata["material_assign"]:
+ self.writel(S_NODES, il + 3, '<instance_material symbol="' +
+ m[1] + '" target="#' + m[0] + '"/>')
+
+ self.writel(S_NODES, il + 2, '</technique_common>')
+ self.writel(S_NODES, il + 1, '</bind_material>')
+
+ if (close_controller):
+ self.writel(S_NODES, il, '</instance_controller>')
+ else:
+ self.writel(S_NODES, il, '</instance_geometry>')
+
+ def export_armature_bone(self, bone, il, si):
+ boneid = self.new_id("bone")
+ boneidx = si["bone_count"]
+ si["bone_count"] += 1
+ bonesid = si["id"] + "-" + str(boneidx)
+ if (bone.name in self.used_bones):
+ if (self.config["use_anim_action_all"]):
+ self.operator.report({'WARNING'}, 'Bone name "' + bone.name +
+ '" used in more than one skeleton. '
+ 'Actions might export wrong.')
+ else:
+ self.used_bones.append(bone.name)
+
+ si["bone_index"][bone.name] = boneidx
+ si["bone_ids"][bone] = boneid
+ si["bone_names"].append(bonesid)
+ self.writel(S_NODES, il, '<node id="' + boneid + '" sid="' +
+ bonesid + '" name="' + bone.name + '" type="JOINT">')
+ il += 1
+ xform = bone.matrix_local
+ si["bone_bind_poses"].append((si["armature_xform"] * xform).inverted())
+
+ if (bone.parent is not None):
+ xform = bone.parent.matrix_local.inverted() * xform
+ else:
+ si["skeleton_nodes"].append(boneid)
+
+ self.writel(S_NODES, il, '<matrix sid="transform">' +
+ strmtx(xform) + '</matrix>')
+ for c in bone.children:
+ self.export_armature_bone(c, il, si)
+ il -= 1
+ self.writel(S_NODES, il, '</node>')
+
+ def export_armature_node(self, node, il):
+ if (node.data is None):
+ return
+
+ self.skeletons.append(node)
+
+ armature = node.data
+ self.skeleton_info[node] = {
+ "bone_count": 0,
+ "id": self.new_id("skelbones"),
+ "name": node.name, "bone_index": {},
+ "bone_ids": {}, "bone_names": [], "bone_bind_poses": [],
+ "skeleton_nodes": [],
+ "armature_xform": node.matrix_world}
+
+ for b in armature.bones:
+ if (b.parent is not None):
+ continue
+ self.export_armature_bone(b, il, self.skeleton_info[node])
+
+ if (node.pose):
+ for b in node.pose.bones:
+ for x in b.constraints:
+ if (x.type == 'ACTION'):
+ self.action_constraints.append(x.action)
+
+ def export_camera_node(self, node, il):
+ if (node.data is None):
+ return
+
+ camera = node.data
+ camid = self.new_id("camera")
+ self.writel(S_CAMS, 1, '<camera id="' + camid +
+ '" name="' + camera.name + '">')
+ self.writel(S_CAMS, 2, '<optics>')
+ self.writel(S_CAMS, 3, '<technique_common>')
+ if (camera.type == "PERSP"):
+ self.writel(S_CAMS, 4, '<perspective>')
+ self.writel(S_CAMS, 5, '<yfov> ' +
+ # I think?
+ str(math.degrees(camera.angle)) + ' </yfov>')
+ self.writel(S_CAMS, 5, '<aspect_ratio> ' +
+ str(self.scene.render.resolution_x /
+ self.scene.render.resolution_y) +
+ ' </aspect_ratio>')
+ self.writel(S_CAMS, 5, '<znear> ' +
+ str(camera.clip_start) + ' </znear>')
+ self.writel(S_CAMS, 5, '<zfar> ' +
+ str(camera.clip_end) + ' </zfar>')
+ self.writel(S_CAMS, 4, '</perspective>')
+ else:
+ self.writel(S_CAMS, 4, '<orthographic>')
+ self.writel(S_CAMS, 5, '<xmag> ' +
+ str(camera.ortho_scale * 0.5) + ' </xmag>') # I think?
+ self.writel(S_CAMS, 5, '<aspect_ratio> ' + str(
+ self.scene.render.resolution_x /
+ self.scene.render.resolution_y) + ' </aspect_ratio>')
+ self.writel(S_CAMS, 5, '<znear> ' +
+ str(camera.clip_start) + ' </znear>')
+ self.writel(S_CAMS, 5, '<zfar> ' +
+ str(camera.clip_end) + ' </zfar>')
+ self.writel(S_CAMS, 4, '</orthographic>')
+
+ self.writel(S_CAMS, 3, '</technique_common>')
+ self.writel(S_CAMS, 2, '</optics>')
+ self.writel(S_CAMS, 1, '</camera>')
+
+ self.writel(S_NODES, il, '<instance_camera url="#' + camid + '"/>')
+
+ def export_lamp_node(self, node, il):
+ if (node.data is None):
+ return
+
+ light = node.data
+ lightid = self.new_id("light")
+ self.writel(S_LAMPS, 1, '<light id="' + lightid +
+ '" name="' + light.name + '">')
+ # self.writel(S_LAMPS, 2, '<optics>')
+ self.writel(S_LAMPS, 3, '<technique_common>')
+
+ if (light.type == "POINT"):
+ self.writel(S_LAMPS, 4, '<point>')
+ self.writel(S_LAMPS, 5, '<color>' +
+ strarr(light.color) + '</color>')
+ # convert to linear attenuation
+ att_by_distance = 2.0 / light.distance
+ self.writel(S_LAMPS, 5, '<linear_attenuation>' +
+ str(att_by_distance) + '</linear_attenuation>')
+ if (light.use_sphere):
+ self.writel(S_LAMPS, 5, '<zfar>' +
+ str(light.distance) + '</zfar>')
+
+ self.writel(S_LAMPS, 4, '</point>')
+ elif (light.type == "SPOT"):
+ self.writel(S_LAMPS, 4, '<spot>')
+ self.writel(S_LAMPS, 5, '<color>' +
+ strarr(light.color) + '</color>')
+ # convert to linear attenuation
+ att_by_distance = 2.0 / light.distance
+ self.writel(S_LAMPS, 5, '<linear_attenuation>' +
+ str(att_by_distance) + '</linear_attenuation>')
+ self.writel(S_LAMPS, 5, '<falloff_angle>' +
+ str(math.degrees(light.spot_size / 2)) +
+ '</falloff_angle>')
+ self.writel(S_LAMPS, 4, '</spot>')
+
+ else: # write a sun lamp for everything else (not supported)
+ self.writel(S_LAMPS, 4, '<directional>')
+ self.writel(S_LAMPS, 5, '<color>' +
+ strarr(light.color) + '</color>')
+ self.writel(S_LAMPS, 4, '</directional>')
+
+ self.writel(S_LAMPS, 3, '</technique_common>')
+ # self.writel(S_LAMPS, 2, '</optics>')
+ self.writel(S_LAMPS, 1, '</light>')
+
+ self.writel(S_NODES, il, '<instance_light url="#' + lightid + '"/>')
+
+ def export_empty_node(self, node, il):
+ self.writel(S_NODES, 4, '<extra>')
+ self.writel(S_NODES, 5, '<technique profile="GODOT">')
+ self.writel(S_NODES, 6, '<empty_draw_type>' +
+ node.empty_draw_type + '</empty_draw_type>')
+ self.writel(S_NODES, 5, '</technique>')
+ self.writel(S_NODES, 4, '</extra>')
+
+ def export_curve(self, curve):
+ splineid = self.new_id("spline")
+
+ self.writel(S_GEOM, 1, '<geometry id="' +
+ splineid + '" name="' + curve.name + '">')
+ self.writel(S_GEOM, 2, '<spline closed="0">')
+
+ points = []
+ interps = []
+ handles_in = []
+ handles_out = []
+ tilts = []
+
+ for cs in curve.splines:
+
+ if (cs.type == "BEZIER"):
+ for s in cs.bezier_points:
+ points.append(s.co[0])
+ points.append(s.co[1])
+ points.append(s.co[2])
+
+ handles_in.append(s.handle_left[0])
+ handles_in.append(s.handle_left[1])
+ handles_in.append(s.handle_left[2])
+
+ handles_out.append(s.handle_right[0])
+ handles_out.append(s.handle_right[1])
+ handles_out.append(s.handle_right[2])
+
+ tilts.append(s.tilt)
+ interps.append("BEZIER")
+ else:
+
+ for s in cs.points:
+ points.append(s.co[0])
+ points.append(s.co[1])
+ points.append(s.co[2])
+ handles_in.append(s.co[0])
+ handles_in.append(s.co[1])
+ handles_in.append(s.co[2])
+ handles_out.append(s.co[0])
+ handles_out.append(s.co[1])
+ handles_out.append(s.co[2])
+ tilts.append(s.tilt)
+ interps.append("LINEAR")
+
+ self.writel(S_GEOM, 3, '<source id="' + splineid + '-positions">')
+ position_values = ""
+ for x in points:
+ position_values += " " + str(x)
+ self.writel(S_GEOM, 4, '<float_array id="' + splineid +
+ '-positions-array" count="' +
+ str(len(points)) + '">' + position_values +
+ '</float_array>')
+ self.writel(S_GEOM, 4, '<technique_common>')
+ self.writel(S_GEOM, 4, '<accessor source="#' + splineid +
+ '-positions-array" count="' + str(len(points) / 3) +
+ '" stride="3">')
+ self.writel(S_GEOM, 5, '<param name="X" type="float"/>')
+ self.writel(S_GEOM, 5, '<param name="Y" type="float"/>')
+ self.writel(S_GEOM, 5, '<param name="Z" type="float"/>')
+ self.writel(S_GEOM, 4, '</accessor>')
+ self.writel(S_GEOM, 3, '</source>')
+
+ self.writel(S_GEOM, 3, '<source id="' + splineid + '-intangents">')
+ intangent_values = ""
+ for x in handles_in:
+ intangent_values += " " + str(x)
+ self.writel(S_GEOM, 4, '<float_array id="' + splineid +
+ '-intangents-array" count="' +
+ str(len(points)) + '">' + intangent_values +
+ '</float_array>')
+ self.writel(S_GEOM, 4, '<technique_common>')
+ self.writel(S_GEOM, 4, '<accessor source="#' + splineid +
+ '-intangents-array" count="' + str(len(points) / 3) +
+ '" stride="3">')
+ self.writel(S_GEOM, 5, '<param name="X" type="float"/>')
+ self.writel(S_GEOM, 5, '<param name="Y" type="float"/>')
+ self.writel(S_GEOM, 5, '<param name="Z" type="float"/>')
+ self.writel(S_GEOM, 4, '</accessor>')
+ self.writel(S_GEOM, 3, '</source>')
+
+ self.writel(S_GEOM, 3, '<source id="' + splineid + '-outtangents">')
+ outtangent_values = ""
+ for x in handles_out:
+ outtangent_values += " " + str(x)
+ self.writel(S_GEOM, 4, '<float_array id="' + splineid +
+ '-outtangents-array" count="' +
+ str(len(points)) + '">' + outtangent_values +
+ '</float_array>')
+ self.writel(S_GEOM, 4, '<technique_common>')
+ self.writel(S_GEOM, 4, '<accessor source="#' + splineid +
+ '-outtangents-array" count="' + str(len(points) / 3) +
+ '" stride="3">')
+ self.writel(S_GEOM, 5, '<param name="X" type="float"/>')
+ self.writel(S_GEOM, 5, '<param name="Y" type="float"/>')
+ self.writel(S_GEOM, 5, '<param name="Z" type="float"/>')
+ self.writel(S_GEOM, 4, '</accessor>')
+ self.writel(S_GEOM, 3, '</source>')
+
+ self.writel(S_GEOM, 3, '<source id="' + splineid + '-interpolations">')
+ interpolation_values = ""
+ for x in interps:
+ interpolation_values += " " + x
+ self.writel(S_GEOM, 4, '<Name_array id="' + splineid +
+ '-interpolations-array" count="' +
+ str(len(interps)) + '">' + interpolation_values +
+ '</Name_array>')
+ self.writel(S_GEOM, 4, '<technique_common>')
+ self.writel(S_GEOM, 4, '<accessor source="#' + splineid +
+ '-interpolations-array" count="' + str(len(interps)) +
+ '" stride="1">')
+ self.writel(S_GEOM, 5, '<param name="INTERPOLATION" type="name"/>')
+ self.writel(S_GEOM, 4, '</accessor>')
+ self.writel(S_GEOM, 3, '</source>')
+
+ self.writel(S_GEOM, 3, '<source id="' + splineid + '-tilts">')
+ tilt_values = ""
+ for x in tilts:
+ tilt_values += " " + str(x)
+ self.writel(S_GEOM, 4, '<float_array id="' + splineid +
+ '-tilts-array" count="' +
+ str(len(tilts)) + '">' + tilt_values + '</float_array>')
+ self.writel(S_GEOM, 4, '<technique_common>')
+ self.writel(S_GEOM, 4, '<accessor source="#' + splineid +
+ '-tilts-array" count="' + str(len(tilts)) +
+ '" stride="1">')
+ self.writel(S_GEOM, 5, '<param name="TILT" type="float"/>')
+ self.writel(S_GEOM, 4, '</accessor>')
+ self.writel(S_GEOM, 3, '</source>')
+
+ self.writel(S_GEOM, 3, '<control_vertices>')
+ self.writel(
+ S_GEOM, 4, '<input semantic="POSITION" source="#' + splineid +
+ '-positions"/>')
+ self.writel(S_GEOM, 4, '<input semantic="IN_TANGENT" source="#' +
+ splineid + '-intangents"/>')
+ self.writel(S_GEOM, 4, '<input semantic="OUT_TANGENT" source="#' +
+ splineid + '-outtangents"/>')
+ self.writel(S_GEOM, 4, '<input semantic="INTERPOLATION" source="#' +
+ splineid + '-interpolations"/>')
+ self.writel(S_GEOM, 4, '<input semantic="TILT" source="#' +
+ splineid + '-tilts"/>')
+ self.writel(S_GEOM, 3, '</control_vertices>')
+
+ self.writel(S_GEOM, 2, '</spline>')
+ self.writel(S_GEOM, 1, '</geometry>')
+
+ return splineid
+
+ def export_curve_node(self, node, il):
+ if (node.data is None):
+ return
+
+ curveid = self.export_curve(node.data)
+
+ self.writel(S_NODES, il, '<instance_geometry url="#' + curveid + '">')
+ self.writel(S_NODES, il, '</instance_geometry>')
+
+ def export_node(self, node, il):
+ if (node not in self.valid_nodes):
+ return
+
+ prev_node = bpy.context.scene.objects.active
+ bpy.context.scene.objects.active = node
+
+ self.writel(S_NODES, il, '<node id="' + self.validate_id(node.name) +
+ '" name="' + node.name + '" type="NODE">')
+ il += 1
+
+ self.writel(S_NODES, il, '<matrix sid="transform">' +
+ strmtx(node.matrix_local) + '</matrix>')
+ # print("NODE TYPE: "+node.type+" NAME: "+node.name)
+ if (node.type == "MESH"):
+ self.export_mesh_node(node, il)
+ elif (node.type == "CURVE"):
+ self.export_curve_node(node, il)
+ elif (node.type == "ARMATURE"):
+ self.export_armature_node(node, il)
+ elif (node.type == "CAMERA"):
+ self.export_camera_node(node, il)
+ elif (node.type == "LAMP"):
+ self.export_lamp_node(node, il)
+ elif (node.type == "EMPTY"):
+ self.export_empty_node(node, il)
+
+ for x in node.children:
+ self.export_node(x, il)
+
+ il -= 1
+ self.writel(S_NODES, il, '</node>')
+ # make previous node active again
+ bpy.context.scene.objects.active = prev_node
+
+ def is_node_valid(self, node):
+ if (node.type not in self.config["object_types"]):
+ return False
+
+ if (self.config["use_active_layers"]):
+ valid = False
+ # print("NAME: "+node.name)
+ for i in range(20):
+ if (node.layers[i] and self.scene.layers[i]):
+ valid = True
+ break
+ if (not valid):
+ return False
+
+ if (self.config["use_export_selected"] and not node.select):
+ return False
+
+ return True
+
+ def export_scene(self):
+ self.writel(S_NODES, 0, '<library_visual_scenes>')
+ self.writel(S_NODES, 1, '<visual_scene id="' +
+ self.scene_name + '" name="scene">')
+
+ # validate nodes
+ for obj in self.scene.objects:
+ if (obj in self.valid_nodes):
+ continue
+ if (self.is_node_valid(obj)):
+ n = obj
+ while (n is not None):
+ if (n not in self.valid_nodes):
+ self.valid_nodes.append(n)
+ n = n.parent
+
+ for obj in self.scene.objects:
+ if (obj in self.valid_nodes and obj.parent is None):
+ self.export_node(obj, 2)
+
+ self.writel(S_NODES, 1, '</visual_scene>')
+ self.writel(S_NODES, 0, '</library_visual_scenes>')
+
+ def export_asset(self):
+ self.writel(S_ASSET, 0, '<asset>')
+ # Why is this time stuff mandatory?, no one could care less...
+ self.writel(S_ASSET, 1, '<contributor>')
+ # Who made Collada, the FBI ?
+ self.writel(S_ASSET, 2, '<author> Anonymous </author>')
+ # Who made Collada, the FBI ?
+ self.writel(
+ S_ASSET, 2, '<authoring_tool> Collada Exporter for Blender 2.6+, '
+ 'by Juan Linietsky (juan@codenix.com) </authoring_tool>')
+ self.writel(S_ASSET, 1, '</contributor>')
+ self.writel(S_ASSET, 1, '<created>' +
+ time.strftime("%Y-%m-%dT%H:%M:%SZ ") + '</created>')
+ self.writel(S_ASSET, 1, '<modified>' +
+ time.strftime("%Y-%m-%dT%H:%M:%SZ") + '</modified>')
+ self.writel(S_ASSET, 1, '<unit meter="1.0" name="meter"/>')
+ self.writel(S_ASSET, 1, '<up_axis>Z_UP</up_axis>')
+ self.writel(S_ASSET, 0, '</asset>')
+
+ def export_animation_transform_channel(self, target, keys, matrices=True):
+ frame_total = len(keys)
+ anim_id = self.new_id("anim")
+ self.writel(S_ANIM, 1, '<animation id="' + anim_id + '">')
+ source_frames = ""
+ source_transforms = ""
+ source_interps = ""
+
+ for k in keys:
+ source_frames += " " + str(k[0])
+ if (matrices):
+ source_transforms += " " + strmtx(k[1])
+ else:
+ source_transforms += " " + str(k[1])
+
+ source_interps += " LINEAR"
+
+ # Time Source
+ self.writel(S_ANIM, 2, '<source id="' + anim_id + '-input">')
+ self.writel(S_ANIM, 3, '<float_array id="' + anim_id +
+ '-input-array" count="' +
+ str(frame_total) + '">' + source_frames + '</float_array>')
+ self.writel(S_ANIM, 3, '<technique_common>')
+ self.writel(S_ANIM, 4, '<accessor source="#' + anim_id +
+ '-input-array" count="' + str(frame_total) +
+ '" stride="1">')
+ self.writel(S_ANIM, 5, '<param name="TIME" type="float"/>')
+ self.writel(S_ANIM, 4, '</accessor>')
+ self.writel(S_ANIM, 3, '</technique_common>')
+ self.writel(S_ANIM, 2, '</source>')
+
+ if (matrices):
+ # Transform Source
+ self.writel(S_ANIM, 2, '<source id="' +
+ anim_id + '-transform-output">')
+ self.writel(S_ANIM, 3, '<float_array id="' + anim_id +
+ '-transform-output-array" count="' +
+ str(frame_total * 16) + '">' + source_transforms +
+ '</float_array>')
+ self.writel(S_ANIM, 3, '<technique_common>')
+ self.writel(S_ANIM, 4, '<accessor source="#' + anim_id +
+ '-transform-output-array" count="' + str(frame_total) +
+ '" stride="16">')
+ self.writel(S_ANIM, 5, '<param name="TRANSFORM" type="float4x4"/>')
+ self.writel(S_ANIM, 4, '</accessor>')
+ self.writel(S_ANIM, 3, '</technique_common>')
+ self.writel(S_ANIM, 2, '</source>')
+ else:
+ # Value Source
+ self.writel(S_ANIM, 2, '<source id="' +
+ anim_id + '-transform-output">')
+ self.writel(S_ANIM, 3, '<float_array id="' + anim_id +
+ '-transform-output-array" count="' +
+ str(frame_total) + '">' + source_transforms +
+ '</float_array>')
+ self.writel(S_ANIM, 3, '<technique_common>')
+ self.writel(S_ANIM, 4, '<accessor source="#' + anim_id +
+ '-transform-output-array" count="' + str(frame_total) +
+ '" stride="1">')
+ self.writel(S_ANIM, 5, '<param name="X" type="float"/>')
+ self.writel(S_ANIM, 4, '</accessor>')
+ self.writel(S_ANIM, 3, '</technique_common>')
+ self.writel(S_ANIM, 2, '</source>')
+
+ # Interpolation Source
+ self.writel(S_ANIM, 2, '<source id="' +
+ anim_id + '-interpolation-output">')
+ self.writel(S_ANIM, 3, '<Name_array id="' + anim_id +
+ '-interpolation-output-array" count="' +
+ str(frame_total) + '">' + source_interps + '</Name_array>')
+ self.writel(S_ANIM, 3, '<technique_common>')
+ self.writel(S_ANIM, 4, '<accessor source="#' + anim_id +
+ '-interpolation-output-array" count="' + str(frame_total) +
+ '" stride="1">')
+ self.writel(S_ANIM, 5, '<param name="INTERPOLATION" type="Name"/>')
+ self.writel(S_ANIM, 4, '</accessor>')
+ self.writel(S_ANIM, 3, '</technique_common>')
+ self.writel(S_ANIM, 2, '</source>')
+
+ self.writel(S_ANIM, 2, '<sampler id="' + anim_id + '-sampler">')
+ self.writel(S_ANIM, 3, '<input semantic="INPUT" source="#' +
+ anim_id + '-input"/>')
+ self.writel(S_ANIM, 3, '<input semantic="OUTPUT" source="#' +
+ anim_id + '-transform-output"/>')
+ self.writel(S_ANIM, 3, '<input semantic="INTERPOLATION" source="#' +
+ anim_id + '-interpolation-output"/>')
+ self.writel(S_ANIM, 2, '</sampler>')
+ if (matrices):
+ self.writel(S_ANIM, 2, '<channel source="#' + anim_id +
+ '-sampler" target="' + target + '/transform"/>')
+ else:
+ self.writel(S_ANIM, 2, '<channel source="#' +
+ anim_id + '-sampler" target="' + target + '"/>')
+ self.writel(S_ANIM, 1, '</animation>')
+
+ return [anim_id]
+
+ def export_animation(self, start, end, allowed=None):
+ # Blender -> Collada frames needs a little work
+ # Collada starts from 0, blender usually from 1
+ # The last frame must be included also
+
+ frame_orig = self.scene.frame_current
+
+ frame_len = 1.0 / self.scene.render.fps
+ frame_total = end - start + 1
+ frame_sub = 0
+ if (start > 0):
+ frame_sub = start * frame_len
+
+ tcn = []
+ xform_cache = {}
+ blend_cache = {}
+ # Change frames first, export objects last
+ # This improves performance enormously
+
+ # print("anim from: " + str(start) + " to " + str(end) + " allowed: " +
+ # str(allowed))
+ for t in range(start, end + 1):
+ self.scene.frame_set(t)
+ key = t * frame_len - frame_sub
+# print("Export Anim Frame "+str(t)+"/"+str(self.scene.frame_end+1))
+
+ for node in self.scene.objects:
+
+ if (node not in self.valid_nodes):
+ continue
+ if (allowed is not None and not (node in allowed)):
+ if (node.type == "MESH" and node.data is not None and
+ (node in self.armature_for_morph) and (
+ self.armature_for_morph[node] in allowed)):
+ # all good you pass with flying colors for morphs
+ # inside of action
+ pass
+ else:
+ # print("fail "+str((node in self.armature_for_morph)))
+ continue
+ if (node.type == "MESH" and node.data is not None and
+ node.data.shape_keys is not None and (
+ node.data in self.mesh_cache) and len(
+ node.data.shape_keys.key_blocks)):
+ target = self.mesh_cache[node.data]["morph_id"]
+ for i in range(len(node.data.shape_keys.key_blocks)):
+
+ if (i == 0):
+ continue
+
+ name = target + "-morph-weights(" + str(i - 1) + ")"
+ if (not (name in blend_cache)):
+ blend_cache[name] = []
+
+ blend_cache[name].append(
+ (key, node.data.shape_keys.key_blocks[i].value))
+
+ if (node.type == "MESH" and node.parent and
+ node.parent.type == "ARMATURE"):
+
+ # In Collada, nodes that have skin modifier must not export
+ # animation, animate the skin instead.
+ continue
+
+ if (len(node.constraints) > 0 or
+ node.animation_data is not None):
+ # If the node has constraints, or animation data, then
+ # export a sampled animation track
+ name = self.validate_id(node.name)
+ if (not (name in xform_cache)):
+ xform_cache[name] = []
+
+ mtx = node.matrix_world.copy()
+ if (node.parent):
+ mtx = node.parent.matrix_world.inverted() * mtx
+
+ xform_cache[name].append((key, mtx))
+
+ if (node.type == "ARMATURE"):
+ # All bones exported for now
+
+ for bone in node.data.bones:
+
+ bone_name = self.skeleton_info[node]["bone_ids"][bone]
+
+ if (not (bone_name in xform_cache)):
+ # print("has bone: " + bone_name)
+ xform_cache[bone_name] = []
+
+ posebone = node.pose.bones[bone.name]
+ parent_posebone = None
+
+ mtx = posebone.matrix.copy()
+ if (bone.parent):
+ parent_posebone = node.pose.bones[bone.parent.name]
+ parent_invisible = False
+
+ for i in range(3):
+ if (parent_posebone.scale[i] == 0.0):
+ parent_invisible = True
+
+ if (not parent_invisible):
+ mtx = parent_posebone.matrix.inverted() * mtx
+
+ xform_cache[bone_name].append((key, mtx))
+
+ self.scene.frame_set(frame_orig)
+
+ # export animation xml
+ for nid in xform_cache:
+ tcn += self.export_animation_transform_channel(
+ nid, xform_cache[nid], True)
+ for nid in blend_cache:
+ tcn += self.export_animation_transform_channel(
+ nid, blend_cache[nid], False)
+
+ return tcn
+
+ def export_animations(self):
+ tmp_mat = []
+ for s in self.skeletons:
+ tmp_bone_mat = []
+ for bone in s.pose.bones:
+ tmp_bone_mat.append(Matrix(bone.matrix_basis))
+ bone.matrix_basis = Matrix()
+ tmp_mat.append([Matrix(s.matrix_local), tmp_bone_mat])
+
+ self.writel(S_ANIM, 0, '<library_animations>')
+
+ if (self.config["use_anim_action_all"] and len(self.skeletons)):
+
+ cached_actions = {}
+
+ for s in self.skeletons:
+ if s.animation_data and s.animation_data.action:
+ cached_actions[s] = s.animation_data.action.name
+
+ self.writel(S_ANIM_CLIPS, 0, '<library_animation_clips>')
+
+ for x in bpy.data.actions[:]:
+ if x.users == 0 or x in self.action_constraints:
+ continue
+ if (self.config["use_anim_skip_noexp"] and
+ x.name.endswith("-noexp")):
+ continue
+
+ bones = []
+ # find bones used
+ for p in x.fcurves:
+ dp = str(p.data_path)
+ base = "pose.bones[\""
+ if (dp.find(base) == 0):
+ dp = dp[len(base):]
+ if (dp.find('"') != -1):
+ dp = dp[:dp.find('"')]
+ if (dp not in bones):
+ bones.append(dp)
+
+ allowed_skeletons = []
+ for i, y in enumerate(self.skeletons):
+ if (y.animation_data):
+ for z in y.pose.bones:
+ if (z.bone.name in bones):
+ if (y not in allowed_skeletons):
+ allowed_skeletons.append(y)
+ y.animation_data.action = x
+
+ y.matrix_local = tmp_mat[i][0]
+ for j, bone in enumerate(s.pose.bones):
+ bone.matrix_basis = Matrix()
+
+ # print("allowed skeletons "+str(allowed_skeletons))
+
+ # print(str(x))
+
+ tcn = self.export_animation(int(x.frame_range[0]), int(
+ x.frame_range[1] + 0.5), allowed_skeletons)
+ framelen = (1.0 / self.scene.render.fps)
+ start = x.frame_range[0] * framelen
+ end = x.frame_range[1] * framelen
+ # print("Export anim: "+x.name)
+ self.writel(
+ S_ANIM_CLIPS, 1, '<animation_clip name="' + x.name +
+ '" start="' + str(start) + '" end="' + str(end) + '">')
+ for z in tcn:
+ self.writel(S_ANIM_CLIPS, 2,
+ '<instance_animation url="#' + z + '"/>')
+ self.writel(S_ANIM_CLIPS, 1, '</animation_clip>')
+ if (len(tcn) == 0):
+ self.operator.report(
+ {'WARNING'}, 'Animation clip "' + x.name +
+ '" contains no tracks.')
+
+ self.writel(S_ANIM_CLIPS, 0, '</library_animation_clips>')
+
+ for i, s in enumerate(self.skeletons):
+ if (s.animation_data is None):
+ continue
+ if s in cached_actions:
+ s.animation_data.action = bpy.data.actions[
+ cached_actions[s]]
+ else:
+ s.animation_data.action = None
+ for j, bone in enumerate(s.pose.bones):
+ bone.matrix_basis = tmp_mat[i][1][j]
+
+ else:
+ self.export_animation(self.scene.frame_start, self.scene.frame_end)
+
+ self.writel(S_ANIM, 0, '</library_animations>')
+
+ def export(self):
+ self.writel(S_GEOM, 0, '<library_geometries>')
+ self.writel(S_CONT, 0, '<library_controllers>')
+ self.writel(S_CAMS, 0, '<library_cameras>')
+ self.writel(S_LAMPS, 0, '<library_lights>')
+ self.writel(S_IMGS, 0, '<library_images>')
+ self.writel(S_MATS, 0, '<library_materials>')
+ self.writel(S_FX, 0, '<library_effects>')
+
+ self.skeletons = []
+ self.action_constraints = []
+ self.export_asset()
+ self.export_scene()
+
+ self.writel(S_GEOM, 0, '</library_geometries>')
+
+ # morphs always go before skin controllers
+ if S_MORPH in self.sections:
+ for l in self.sections[S_MORPH]:
+ self.writel(S_CONT, 0, l)
+ del self.sections[S_MORPH]
+
+ # morphs always go before skin controllers
+ if S_SKIN in self.sections:
+ for l in self.sections[S_SKIN]:
+ self.writel(S_CONT, 0, l)
+ del self.sections[S_SKIN]
+
+ self.writel(S_CONT, 0, '</library_controllers>')
+ self.writel(S_CAMS, 0, '</library_cameras>')
+ self.writel(S_LAMPS, 0, '</library_lights>')
+ self.writel(S_IMGS, 0, '</library_images>')
+ self.writel(S_MATS, 0, '</library_materials>')
+ self.writel(S_FX, 0, '</library_effects>')
+
+ if (self.config["use_anim"]):
+ self.export_animations()
+
+ try:
+ f = open(self.path, "wb")
+ except:
+ return False
+
+ f.write(bytes('<?xml version="1.0" encoding="utf-8"?>\n', "UTF-8"))
+ f.write(bytes(
+ '<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" '
+ 'version="1.4.1">\n', "UTF-8"))
+
+ s = []
+ for x in self.sections.keys():
+ s.append(x)
+ s.sort()
+ for x in s:
+ for l in self.sections[x]:
+ f.write(bytes(l + "\n", "UTF-8"))
+
+ f.write(bytes('<scene>\n', "UTF-8"))
+ f.write(bytes('\t<instance_visual_scene url="#' +
+ self.scene_name + '" />\n', "UTF-8"))
+ f.write(bytes('</scene>\n', "UTF-8"))
+ f.write(bytes('</COLLADA>\n', "UTF-8"))
+ return True
+
+ def __init__(self, path, kwargs, operator):
+ self.operator = operator
+ self.scene = bpy.context.scene
+ self.last_id = 0
+ self.scene_name = self.new_id("scene")
+ self.sections = {}
+ self.path = path
+ self.mesh_cache = {}
+ self.curve_cache = {}
+ self.material_cache = {}
+ self.image_cache = {}
+ self.skeleton_info = {}
+ self.config = kwargs
+ self.valid_nodes = []
+ self.armature_for_morph = {}
+ self.used_bones = []
+ self.wrongvtx_report = False
+
+
+def save(operator, context, filepath="", use_selection=False, **kwargs):
+ exp = DaeExporter(filepath, kwargs, operator)
+ exp.export()
+
+ return {'FINISHED'} # so the script wont run after we have batch exported.